Compare commits
19 Commits
dev
...
7731-clien
Author | SHA1 | Date |
---|---|---|
|
307355ba3f | |
|
4e85e30e41 | |
|
fe3ea3fa6a | |
|
0c3650c9e3 | |
|
da0540a748 | |
|
9ecb734b1b | |
|
f019c55b72 | |
|
d966be60da | |
|
c884c09943 | |
|
32191fe713 | |
|
fdaa3ea72a | |
|
dab45277da | |
|
4de85126cd | |
|
08f247900a | |
|
82fce46999 | |
|
6b99039e68 | |
|
6e164cda14 | |
|
6d0e99faa3 | |
|
5a1317da77 |
|
@ -1,2 +0,0 @@
|
||||||
export const langs = ['en', 'es'];
|
|
||||||
export const decimalPlaces = 2;
|
|
|
@ -27,7 +27,7 @@ function columnName(col) {
|
||||||
</script>
|
</script>
|
||||||
<template>
|
<template>
|
||||||
<VnFilterPanel v-bind="$attrs" :search-button="true" :disable-submit-event="true">
|
<VnFilterPanel v-bind="$attrs" :search-button="true" :disable-submit-event="true">
|
||||||
<template #body="{ params, orders, searchFn }">
|
<template #body="{ params, orders }">
|
||||||
<div
|
<div
|
||||||
class="row no-wrap flex-center"
|
class="row no-wrap flex-center"
|
||||||
v-for="col of columns.filter((c) => c.columnFilter ?? true)"
|
v-for="col of columns.filter((c) => c.columnFilter ?? true)"
|
||||||
|
@ -52,7 +52,6 @@ function columnName(col) {
|
||||||
<slot
|
<slot
|
||||||
name="moreFilterPanel"
|
name="moreFilterPanel"
|
||||||
:params="params"
|
:params="params"
|
||||||
:search-fn="searchFn"
|
|
||||||
:orders="orders"
|
:orders="orders"
|
||||||
:columns="columns"
|
:columns="columns"
|
||||||
/>
|
/>
|
||||||
|
|
|
@ -106,14 +106,7 @@ function checkIsMain() {
|
||||||
:data-key="dataKey"
|
:data-key="dataKey"
|
||||||
:array-data="arrayData"
|
:array-data="arrayData"
|
||||||
:columns="columns"
|
:columns="columns"
|
||||||
>
|
|
||||||
<template #moreFilterPanel="{ params, orders, searchFn }">
|
|
||||||
<slot
|
|
||||||
name="moreFilterPanel"
|
|
||||||
v-bind="{ params, orders, searchFn }"
|
|
||||||
/>
|
/>
|
||||||
</template>
|
|
||||||
</VnTableFilter>
|
|
||||||
</slot>
|
</slot>
|
||||||
</template>
|
</template>
|
||||||
</RightAdvancedMenu>
|
</RightAdvancedMenu>
|
||||||
|
|
|
@ -171,8 +171,7 @@ onMounted(() => {
|
||||||
});
|
});
|
||||||
|
|
||||||
const arrayDataKey =
|
const arrayDataKey =
|
||||||
$props.dataKey ??
|
$props.dataKey ?? ($props.url?.length > 0 ? $props.url : $attrs.name ?? $attrs.label);
|
||||||
($props.url?.length > 0 ? $props.url : ($attrs.name ?? $attrs.label));
|
|
||||||
|
|
||||||
const arrayData = useArrayData(arrayDataKey, {
|
const arrayData = useArrayData(arrayDataKey, {
|
||||||
url: $props.url,
|
url: $props.url,
|
||||||
|
@ -221,7 +220,7 @@ async function fetchFilter(val) {
|
||||||
optionFilterValue.value ??
|
optionFilterValue.value ??
|
||||||
(new RegExp(/\d/g).test(val)
|
(new RegExp(/\d/g).test(val)
|
||||||
? optionValue.value
|
? optionValue.value
|
||||||
: (optionFilter.value ?? optionLabel.value));
|
: optionFilter.value ?? optionLabel.value);
|
||||||
|
|
||||||
let defaultWhere = {};
|
let defaultWhere = {};
|
||||||
if ($props.filterOptions.length) {
|
if ($props.filterOptions.length) {
|
||||||
|
@ -240,7 +239,7 @@ async function fetchFilter(val) {
|
||||||
|
|
||||||
const { data } = await arrayData.applyFilter(
|
const { data } = await arrayData.applyFilter(
|
||||||
{ filter: filterOptions },
|
{ filter: filterOptions },
|
||||||
{ updateRouter: false },
|
{ updateRouter: false }
|
||||||
);
|
);
|
||||||
setOptions(data);
|
setOptions(data);
|
||||||
return data;
|
return data;
|
||||||
|
@ -273,7 +272,7 @@ async function filterHandler(val, update) {
|
||||||
ref.setOptionIndex(-1);
|
ref.setOptionIndex(-1);
|
||||||
ref.moveOptionSelection(1, true);
|
ref.moveOptionSelection(1, true);
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -309,7 +308,7 @@ function handleKeyDown(event) {
|
||||||
if (inputValue) {
|
if (inputValue) {
|
||||||
const matchingOption = myOptions.value.find(
|
const matchingOption = myOptions.value.find(
|
||||||
(option) =>
|
(option) =>
|
||||||
option[optionLabel.value].toLowerCase() === inputValue.toLowerCase(),
|
option[optionLabel.value].toLowerCase() === inputValue.toLowerCase()
|
||||||
);
|
);
|
||||||
|
|
||||||
if (matchingOption) {
|
if (matchingOption) {
|
||||||
|
@ -321,11 +320,11 @@ function handleKeyDown(event) {
|
||||||
}
|
}
|
||||||
|
|
||||||
const focusableElements = document.querySelectorAll(
|
const focusableElements = document.querySelectorAll(
|
||||||
'a:not([disabled]), button:not([disabled]), input:not([disabled]), textarea:not([disabled]), select:not([disabled]), details:not([disabled]), [tabindex]:not([tabindex="-1"]):not([disabled])',
|
'a:not([disabled]), button:not([disabled]), input:not([disabled]), textarea:not([disabled]), select:not([disabled]), details:not([disabled]), [tabindex]:not([tabindex="-1"]):not([disabled])'
|
||||||
);
|
);
|
||||||
const currentIndex = Array.prototype.indexOf.call(
|
const currentIndex = Array.prototype.indexOf.call(
|
||||||
focusableElements,
|
focusableElements,
|
||||||
event.target,
|
event.target
|
||||||
);
|
);
|
||||||
if (currentIndex >= 0 && currentIndex < focusableElements.length - 1) {
|
if (currentIndex >= 0 && currentIndex < focusableElements.length - 1) {
|
||||||
focusableElements[currentIndex + 1].focus();
|
focusableElements[currentIndex + 1].focus();
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
<script setup>
|
<script setup>
|
||||||
|
import { computed } from 'vue';
|
||||||
import VnSelect from 'components/common/VnSelect.vue';
|
import VnSelect from 'components/common/VnSelect.vue';
|
||||||
|
|
||||||
const model = defineModel({ type: [String, Number, Object] });
|
const model = defineModel({ type: [String, Number, Object] });
|
||||||
|
const url = 'Suppliers';
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
|
@ -9,11 +11,10 @@ const model = defineModel({ type: [String, Number, Object] });
|
||||||
:label="$t('globals.supplier')"
|
:label="$t('globals.supplier')"
|
||||||
v-bind="$attrs"
|
v-bind="$attrs"
|
||||||
v-model="model"
|
v-model="model"
|
||||||
url="Suppliers"
|
:url="url"
|
||||||
option-value="id"
|
option-value="id"
|
||||||
option-label="nickname"
|
option-label="nickname"
|
||||||
:fields="['id', 'name', 'nickname', 'nif']"
|
:fields="['id', 'name', 'nickname', 'nif']"
|
||||||
:filter-options="['id', 'name', 'nickname', 'nif']"
|
|
||||||
sort-by="name ASC"
|
sort-by="name ASC"
|
||||||
>
|
>
|
||||||
<template #option="scope">
|
<template #option="scope">
|
||||||
|
|
|
@ -0,0 +1,81 @@
|
||||||
|
<script setup>
|
||||||
|
import { ref } from 'vue';
|
||||||
|
import VnSelect from 'src/components/common/VnSelect.vue';
|
||||||
|
import FetchData from 'components/FetchData.vue';
|
||||||
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
|
const { t } = useI18n();
|
||||||
|
const model = defineModel({ type: String, required: true });
|
||||||
|
const countriesOption = ref([]);
|
||||||
|
const countriesOptionCopy = ref([]);
|
||||||
|
const lastVal = ref();
|
||||||
|
|
||||||
|
function handleBlur() {
|
||||||
|
if (lastVal.value == '') lastVal.value = null;
|
||||||
|
model.value = lastVal.value && lastVal.value.toUpperCase().slice(0, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
function filterFn(val, update) {
|
||||||
|
update(
|
||||||
|
() => {
|
||||||
|
if (val === '') {
|
||||||
|
countriesOptionCopy.value = JSON.parse(
|
||||||
|
JSON.stringify(countriesOption.value)
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const exist = countriesOption.value.filter((c) =>
|
||||||
|
c.code.toLowerCase().includes(val.toLowerCase())
|
||||||
|
);
|
||||||
|
if (exist) return (countriesOptionCopy.value = exist);
|
||||||
|
countriesOptionCopy.value = JSON.parse(JSON.stringify([{ code: val }]));
|
||||||
|
},
|
||||||
|
(ref) => {
|
||||||
|
if (val !== '' && ref.options.length > 0) {
|
||||||
|
ref.setOptionIndex(-1);
|
||||||
|
ref.moveOptionSelection(1, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<template>
|
||||||
|
<FetchData auto-load @on-fetch="(data) => (countriesOption = data)" url="Countries" />
|
||||||
|
<VnSelect
|
||||||
|
:label="t('Vies')"
|
||||||
|
v-model="model"
|
||||||
|
:input-debounce="0"
|
||||||
|
:options="countriesOptionCopy"
|
||||||
|
@input-value="(evt) => (lastVal = evt) && handleBlur()"
|
||||||
|
@filter="filterFn"
|
||||||
|
option-label="code"
|
||||||
|
option-value="code"
|
||||||
|
v-bind="$attrs"
|
||||||
|
>
|
||||||
|
<template #option="scope">
|
||||||
|
<QItem v-bind="scope.itemProps">
|
||||||
|
<QItemSection>
|
||||||
|
<QItemLabel>{{ scope.opt?.code }}</QItemLabel>
|
||||||
|
<QItemLabel caption>
|
||||||
|
{{ scope.opt?.code }},
|
||||||
|
{{ scope.opt?.name }}
|
||||||
|
</QItemLabel>
|
||||||
|
</QItemSection>
|
||||||
|
</QItem>
|
||||||
|
</template>
|
||||||
|
<template #after>
|
||||||
|
<QIcon name="info" class="cursor-pointer">
|
||||||
|
<QTooltip>{{ t('viesTip') }}</QTooltip>
|
||||||
|
</QIcon>
|
||||||
|
</template>
|
||||||
|
</VnSelect>
|
||||||
|
</template>
|
||||||
|
<i18n>
|
||||||
|
es:
|
||||||
|
viesTip: El campo puede contener valores que no este en la lista
|
||||||
|
|
||||||
|
en:
|
||||||
|
viesTip: The field may contain value that are not in the list
|
||||||
|
|
||||||
|
</i18n>
|
|
@ -635,8 +635,6 @@ wagon:
|
||||||
name: Name
|
name: Name
|
||||||
|
|
||||||
supplier:
|
supplier:
|
||||||
search: Search supplier
|
|
||||||
searchInfo: Search supplier by id or name
|
|
||||||
list:
|
list:
|
||||||
payMethod: Pay method
|
payMethod: Pay method
|
||||||
account: Account
|
account: Account
|
||||||
|
|
|
@ -352,7 +352,7 @@ globals:
|
||||||
from: Desde
|
from: Desde
|
||||||
to: Hasta
|
to: Hasta
|
||||||
supplierFk: Proveedor
|
supplierFk: Proveedor
|
||||||
supplierRef: Nº factura
|
supplierRef: Ref. proveedor
|
||||||
serial: Serie
|
serial: Serie
|
||||||
amount: Importe
|
amount: Importe
|
||||||
awbCode: AWB
|
awbCode: AWB
|
||||||
|
@ -644,8 +644,6 @@ wagon:
|
||||||
volume: Volumen
|
volume: Volumen
|
||||||
name: Nombre
|
name: Nombre
|
||||||
supplier:
|
supplier:
|
||||||
search: Buscar proveedor
|
|
||||||
searchInfo: Buscar proveedor por id o nombre
|
|
||||||
list:
|
list:
|
||||||
payMethod: Método de pago
|
payMethod: Método de pago
|
||||||
account: Cuenta
|
account: Cuenta
|
||||||
|
@ -653,7 +651,6 @@ supplier:
|
||||||
tableVisibleColumns:
|
tableVisibleColumns:
|
||||||
nif: NIF/CIF
|
nif: NIF/CIF
|
||||||
account: Cuenta
|
account: Cuenta
|
||||||
|
|
||||||
summary:
|
summary:
|
||||||
responsible: Responsable
|
responsible: Responsable
|
||||||
verified: Verificado
|
verified: Verificado
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
<script setup>
|
<script setup>
|
||||||
import { Dark, Quasar } from 'quasar';
|
import { Dark, Quasar } from 'quasar';
|
||||||
import { computed, onMounted } from 'vue';
|
import { computed } from 'vue';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
import { localeEquivalence } from 'src/i18n/index';
|
import { localeEquivalence } from 'src/i18n/index';
|
||||||
import quasarLang from 'src/utils/quasarLang';
|
import quasarLang from 'src/utils/quasarLang';
|
||||||
import { langs } from 'src/boot/defaults/constants.js';
|
|
||||||
|
|
||||||
const { t, locale } = useI18n();
|
const { t, locale } = useI18n();
|
||||||
|
|
||||||
const userLocale = computed({
|
const userLocale = computed({
|
||||||
get() {
|
get() {
|
||||||
return locale.value;
|
return locale.value;
|
||||||
|
@ -28,6 +28,7 @@ const darkMode = computed({
|
||||||
Dark.set(value);
|
Dark.set(value);
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
const langs = ['en', 'es'];
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
|
|
|
@ -119,7 +119,7 @@ const openSendEmailDialog = async () => {
|
||||||
openConfirmationModal(
|
openConfirmationModal(
|
||||||
t('The consumption report will be sent'),
|
t('The consumption report will be sent'),
|
||||||
t('Please, confirm'),
|
t('Please, confirm'),
|
||||||
() => sendCampaignMetricsEmail({ address: arrayData.store.data.email }),
|
() => sendCampaignMetricsEmail({ address: arrayData.store.data.email })
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
const sendCampaignMetricsEmail = ({ address }) => {
|
const sendCampaignMetricsEmail = ({ address }) => {
|
||||||
|
|
|
@ -8,6 +8,7 @@ import FormModel from 'components/FormModel.vue';
|
||||||
import VnRow from 'components/ui/VnRow.vue';
|
import VnRow from 'components/ui/VnRow.vue';
|
||||||
import VnInput from 'src/components/common/VnInput.vue';
|
import VnInput from 'src/components/common/VnInput.vue';
|
||||||
import VnSelect from 'src/components/common/VnSelect.vue';
|
import VnSelect from 'src/components/common/VnSelect.vue';
|
||||||
|
import VnSelectVies from 'src/components/common/VnSelectVies.vue';
|
||||||
import VnLocation from 'src/components/common/VnLocation.vue';
|
import VnLocation from 'src/components/common/VnLocation.vue';
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
@ -103,6 +104,7 @@ function handleLocation(data, location) {
|
||||||
:required="true"
|
:required="true"
|
||||||
@update:model-value="(location) => handleLocation(data, location)"
|
@update:model-value="(location) => handleLocation(data, location)"
|
||||||
/>
|
/>
|
||||||
|
<VnSelectVies v-model="data.viesCode" style="max-width: 30%" />
|
||||||
</VnRow>
|
</VnRow>
|
||||||
<VnRow>
|
<VnRow>
|
||||||
<QCheckbox :label="t('Active')" v-model="data.isActive" />
|
<QCheckbox :label="t('Active')" v-model="data.isActive" />
|
||||||
|
@ -110,14 +112,7 @@ function handleLocation(data, location) {
|
||||||
</VnRow>
|
</VnRow>
|
||||||
<VnRow>
|
<VnRow>
|
||||||
<QCheckbox :label="t('Has to invoice')" v-model="data.hasToInvoice" />
|
<QCheckbox :label="t('Has to invoice')" v-model="data.hasToInvoice" />
|
||||||
<div>
|
<QCheckbox :label="t('Verified data')" v-model="data.isTaxDataChecked" />
|
||||||
<QCheckbox :label="t('globals.isVies')" v-model="data.isVies" />
|
|
||||||
<QIcon name="info" class="cursor-info q-ml-sm" size="sm">
|
|
||||||
<QTooltip>
|
|
||||||
{{ t('whenActivatingIt') }}
|
|
||||||
</QTooltip>
|
|
||||||
</QIcon>
|
|
||||||
</div>
|
|
||||||
</VnRow>
|
</VnRow>
|
||||||
|
|
||||||
<VnRow>
|
<VnRow>
|
||||||
|
@ -147,9 +142,6 @@ function handleLocation(data, location) {
|
||||||
<QCheckbox
|
<QCheckbox
|
||||||
:label="t('Electronic invoice')"
|
:label="t('Electronic invoice')"
|
||||||
v-model="data.hasElectronicInvoice"
|
v-model="data.hasElectronicInvoice"
|
||||||
/><QCheckbox
|
|
||||||
:label="t('Verified data')"
|
|
||||||
v-model="data.isTaxDataChecked"
|
|
||||||
/>
|
/>
|
||||||
</VnRow>
|
</VnRow>
|
||||||
</template>
|
</template>
|
||||||
|
@ -177,11 +169,9 @@ es:
|
||||||
Incoterms authorization: Autorización incoterms
|
Incoterms authorization: Autorización incoterms
|
||||||
Electronic invoice: Factura electrónica
|
Electronic invoice: Factura electrónica
|
||||||
onlyLetters: Sólo se pueden usar letras, números y espacios
|
onlyLetters: Sólo se pueden usar letras, números y espacios
|
||||||
whenActivatingIt: Al activarlo, no informar el código del país en el campo nif
|
|
||||||
inOrderToInvoice: Para facturar no se consulta este campo, sino el RE de consignatario. Al modificar este campo si no esta marcada la casilla Facturar por consignatario, se propagará automaticamente el cambio a todos lo consignatarios, en caso contrario preguntará al usuario si quiere o no propagar
|
inOrderToInvoice: Para facturar no se consulta este campo, sino el RE de consignatario. Al modificar este campo si no esta marcada la casilla Facturar por consignatario, se propagará automaticamente el cambio a todos lo consignatarios, en caso contrario preguntará al usuario si quiere o no propagar
|
||||||
Daily invoice: Facturación diaria
|
Daily invoice: Facturación diaria
|
||||||
en:
|
en:
|
||||||
onlyLetters: Only letters, numbers and spaces can be used
|
onlyLetters: Only letters, numbers and spaces can be used
|
||||||
whenActivatingIt: When activating it, do not enter the country code in the ID field
|
|
||||||
inOrderToInvoice: In order to invoice, this field is not contulted, but the consignee's ET. When modifiying this field if the invoice by address option is not checked, the change will be automatically propagated to all addresses, otherwise the user will be asked if he wants to propagate it or not
|
inOrderToInvoice: In order to invoice, this field is not contulted, but the consignee's ET. When modifiying this field if the invoice by address option is not checked, the change will be automatically propagated to all addresses, otherwise the user will be asked if he wants to propagate it or not
|
||||||
</i18n>
|
</i18n>
|
||||||
|
|
|
@ -125,7 +125,7 @@ function deleteFile(dmsFk) {
|
||||||
<VnInput
|
<VnInput
|
||||||
clearable
|
clearable
|
||||||
clear-icon="close"
|
clear-icon="close"
|
||||||
:label="t('invoiceIn.supplierRef')"
|
:label="t('Supplier ref')"
|
||||||
v-model="data.supplierRef"
|
v-model="data.supplierRef"
|
||||||
/>
|
/>
|
||||||
</VnRow>
|
</VnRow>
|
||||||
|
@ -310,6 +310,7 @@ function deleteFile(dmsFk) {
|
||||||
supplierFk: Supplier
|
supplierFk: Supplier
|
||||||
es:
|
es:
|
||||||
supplierFk: Proveedor
|
supplierFk: Proveedor
|
||||||
|
Supplier ref: Ref. proveedor
|
||||||
Expedition date: Fecha expedición
|
Expedition date: Fecha expedición
|
||||||
Operation date: Fecha operación
|
Operation date: Fecha operación
|
||||||
Undeductible VAT: Iva no deducible
|
Undeductible VAT: Iva no deducible
|
||||||
|
|
|
@ -186,7 +186,7 @@ const createInvoiceInCorrection = async () => {
|
||||||
clickable
|
clickable
|
||||||
@click="book(entityId)"
|
@click="book(entityId)"
|
||||||
>
|
>
|
||||||
<QItemSection>{{ t('invoiceIn.descriptorMenu.book') }}</QItemSection>
|
<QItemSection>{{ t('invoiceIn.descriptorMenu.toBook') }}</QItemSection>
|
||||||
</QItem>
|
</QItem>
|
||||||
</template>
|
</template>
|
||||||
</InvoiceInToBook>
|
</InvoiceInToBook>
|
||||||
|
@ -197,7 +197,7 @@ const createInvoiceInCorrection = async () => {
|
||||||
@click="triggerMenu('unbook')"
|
@click="triggerMenu('unbook')"
|
||||||
>
|
>
|
||||||
<QItemSection>
|
<QItemSection>
|
||||||
{{ t('invoiceIn.descriptorMenu.unbook') }}
|
{{ t('invoiceIn.descriptorMenu.toUnbook') }}
|
||||||
</QItemSection>
|
</QItemSection>
|
||||||
</QItem>
|
</QItem>
|
||||||
<QItem
|
<QItem
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
<script setup>
|
<script setup>
|
||||||
import { ref, computed, onBeforeMount } from 'vue';
|
import { ref, computed } from 'vue';
|
||||||
import { useRoute } from 'vue-router';
|
import { useRoute } from 'vue-router';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
import axios from 'axios';
|
import axios from 'axios';
|
||||||
|
@ -12,7 +12,6 @@ import VnSelect from 'src/components/common/VnSelect.vue';
|
||||||
import useNotify from 'src/composables/useNotify.js';
|
import useNotify from 'src/composables/useNotify.js';
|
||||||
import VnInputDate from 'src/components/common/VnInputDate.vue';
|
import VnInputDate from 'src/components/common/VnInputDate.vue';
|
||||||
import VnInputNumber from 'src/components/common/VnInputNumber.vue';
|
import VnInputNumber from 'src/components/common/VnInputNumber.vue';
|
||||||
import { toCurrency } from 'filters/index';
|
|
||||||
|
|
||||||
const route = useRoute();
|
const route = useRoute();
|
||||||
const { notify } = useNotify();
|
const { notify } = useNotify();
|
||||||
|
@ -27,7 +26,7 @@ const invoiceInFormRef = ref();
|
||||||
const invoiceId = +route.params.id;
|
const invoiceId = +route.params.id;
|
||||||
const filter = { where: { invoiceInFk: invoiceId } };
|
const filter = { where: { invoiceInFk: invoiceId } };
|
||||||
const areRows = ref(false);
|
const areRows = ref(false);
|
||||||
const totals = ref();
|
|
||||||
const columns = computed(() => [
|
const columns = computed(() => [
|
||||||
{
|
{
|
||||||
name: 'duedate',
|
name: 'duedate',
|
||||||
|
@ -67,8 +66,6 @@ const columns = computed(() => [
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
|
|
||||||
const totalAmount = computed(() => getTotal(invoiceInFormRef.value.formData, 'amount'));
|
|
||||||
|
|
||||||
const isNotEuro = (code) => code != 'EUR';
|
const isNotEuro = (code) => code != 'EUR';
|
||||||
|
|
||||||
async function insert() {
|
async function insert() {
|
||||||
|
@ -76,10 +73,6 @@ async function insert() {
|
||||||
await invoiceInFormRef.value.reload();
|
await invoiceInFormRef.value.reload();
|
||||||
notify(t('globals.dataSaved'), 'positive');
|
notify(t('globals.dataSaved'), 'positive');
|
||||||
}
|
}
|
||||||
|
|
||||||
onBeforeMount(async () => {
|
|
||||||
totals.value = (await axios.get(`InvoiceIns/${invoiceId}/getTotals`)).data;
|
|
||||||
});
|
|
||||||
</script>
|
</script>
|
||||||
<template>
|
<template>
|
||||||
<FetchData
|
<FetchData
|
||||||
|
@ -160,7 +153,7 @@ onBeforeMount(async () => {
|
||||||
<QTd />
|
<QTd />
|
||||||
<QTd />
|
<QTd />
|
||||||
<QTd>
|
<QTd>
|
||||||
{{ toCurrency(totalAmount) }}
|
{{ getTotal(rows, 'amount', { currency: 'default' }) }}
|
||||||
</QTd>
|
</QTd>
|
||||||
<QTd>
|
<QTd>
|
||||||
<template v-if="isNotEuro(invoiceIn.currency.code)">
|
<template v-if="isNotEuro(invoiceIn.currency.code)">
|
||||||
|
@ -242,16 +235,7 @@ onBeforeMount(async () => {
|
||||||
v-shortcut="'+'"
|
v-shortcut="'+'"
|
||||||
size="lg"
|
size="lg"
|
||||||
round
|
round
|
||||||
@click="
|
@click="!areRows ? insert() : invoiceInFormRef.insert()"
|
||||||
() => {
|
|
||||||
if (!areRows) insert();
|
|
||||||
else
|
|
||||||
invoiceInFormRef.insert({
|
|
||||||
amount: (totals.totalTaxableBase - totalAmount).toFixed(2),
|
|
||||||
invoiceInFk: invoiceId,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
"
|
|
||||||
/>
|
/>
|
||||||
</QPageSticky>
|
</QPageSticky>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -193,7 +193,7 @@ const getLink = (param) => `#/invoice-in/${entityId.value}/${param}`;
|
||||||
<InvoiceIntoBook>
|
<InvoiceIntoBook>
|
||||||
<template #content="{ book }">
|
<template #content="{ book }">
|
||||||
<QBtn
|
<QBtn
|
||||||
:label="t('Book')"
|
:label="t('To book')"
|
||||||
color="orange-11"
|
color="orange-11"
|
||||||
text-color="black"
|
text-color="black"
|
||||||
@click="book(entityId)"
|
@click="book(entityId)"
|
||||||
|
@ -224,7 +224,10 @@ const getLink = (param) => `#/invoice-in/${entityId.value}/${param}`;
|
||||||
</span>
|
</span>
|
||||||
</template>
|
</template>
|
||||||
</VnLv>
|
</VnLv>
|
||||||
<VnLv :label="t('invoiceIn.supplierRef')" :value="entity.supplierRef" />
|
<VnLv
|
||||||
|
:label="t('invoiceIn.list.supplierRef')"
|
||||||
|
:value="entity.supplierRef"
|
||||||
|
/>
|
||||||
<VnLv
|
<VnLv
|
||||||
:label="t('invoiceIn.summary.currency')"
|
:label="t('invoiceIn.summary.currency')"
|
||||||
:value="entity.currency?.code"
|
:value="entity.currency?.code"
|
||||||
|
@ -354,7 +357,7 @@ const getLink = (param) => `#/invoice-in/${entityId.value}/${param}`;
|
||||||
entity.totals.totalTaxableBaseForeignValue &&
|
entity.totals.totalTaxableBaseForeignValue &&
|
||||||
toCurrency(
|
toCurrency(
|
||||||
entity.totals.totalTaxableBaseForeignValue,
|
entity.totals.totalTaxableBaseForeignValue,
|
||||||
currency,
|
currency
|
||||||
)
|
)
|
||||||
}}</QTd>
|
}}</QTd>
|
||||||
</QTr>
|
</QTr>
|
||||||
|
@ -389,7 +392,7 @@ const getLink = (param) => `#/invoice-in/${entityId.value}/${param}`;
|
||||||
entity.totals.totalDueDayForeignValue &&
|
entity.totals.totalDueDayForeignValue &&
|
||||||
toCurrency(
|
toCurrency(
|
||||||
entity.totals.totalDueDayForeignValue,
|
entity.totals.totalDueDayForeignValue,
|
||||||
currency,
|
currency
|
||||||
)
|
)
|
||||||
}}
|
}}
|
||||||
</QTd>
|
</QTd>
|
||||||
|
@ -469,5 +472,5 @@ const getLink = (param) => `#/invoice-in/${entityId.value}/${param}`;
|
||||||
Search invoice: Buscar factura recibida
|
Search invoice: Buscar factura recibida
|
||||||
You can search by invoice reference: Puedes buscar por referencia de la factura
|
You can search by invoice reference: Puedes buscar por referencia de la factura
|
||||||
Totals: Totales
|
Totals: Totales
|
||||||
Book: Contabilizar
|
To book: Contabilizar
|
||||||
</i18n>
|
</i18n>
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
<script setup>
|
<script setup>
|
||||||
import { ref, computed, nextTick } from 'vue';
|
import { ref, computed } from 'vue';
|
||||||
import { useRoute } from 'vue-router';
|
import { useRoute } from 'vue-router';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
import { useArrayData } from 'src/composables/useArrayData';
|
import { useArrayData } from 'src/composables/useArrayData';
|
||||||
|
@ -25,6 +25,7 @@ const sageTaxTypes = ref([]);
|
||||||
const sageTransactionTypes = ref([]);
|
const sageTransactionTypes = ref([]);
|
||||||
const rowsSelected = ref([]);
|
const rowsSelected = ref([]);
|
||||||
const invoiceInFormRef = ref();
|
const invoiceInFormRef = ref();
|
||||||
|
const expenseRef = ref();
|
||||||
|
|
||||||
defineProps({
|
defineProps({
|
||||||
actionIcon: {
|
actionIcon: {
|
||||||
|
@ -96,20 +97,6 @@ const columns = computed(() => [
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
|
|
||||||
const taxableBaseTotal = computed(() => {
|
|
||||||
return getTotal(invoiceInFormRef.value.formData, 'taxableBase');
|
|
||||||
});
|
|
||||||
|
|
||||||
const taxRateTotal = computed(() => {
|
|
||||||
return getTotal(invoiceInFormRef.value.formData, null, {
|
|
||||||
cb: taxRate,
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
const combinedTotal = computed(() => {
|
|
||||||
return +taxableBaseTotal.value + +taxRateTotal.value;
|
|
||||||
});
|
|
||||||
|
|
||||||
const filter = {
|
const filter = {
|
||||||
fields: [
|
fields: [
|
||||||
'id',
|
'id',
|
||||||
|
@ -138,7 +125,7 @@ function taxRate(invoiceInTax) {
|
||||||
return ((taxTypeSage / 100) * taxableBase).toFixed(2);
|
return ((taxTypeSage / 100) * taxableBase).toFixed(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
function autocompleteExpense(evt, row, col, ref) {
|
function autocompleteExpense(evt, row, col) {
|
||||||
const val = evt.target.value;
|
const val = evt.target.value;
|
||||||
if (!val) return;
|
if (!val) return;
|
||||||
|
|
||||||
|
@ -147,17 +134,22 @@ function autocompleteExpense(evt, row, col, ref) {
|
||||||
({ id }) => id == useAccountShortToStandard(param),
|
({ id }) => id == useAccountShortToStandard(param),
|
||||||
);
|
);
|
||||||
|
|
||||||
ref.vnSelectDialogRef.vnSelectRef.toggleOption(lookup);
|
expenseRef.value.vnSelectDialogRef.vnSelectRef.toggleOption(lookup);
|
||||||
}
|
}
|
||||||
|
|
||||||
function setCursor(ref) {
|
const taxableBaseTotal = computed(() => {
|
||||||
nextTick(() => {
|
return getTotal(invoiceInFormRef.value.formData, 'taxableBase');
|
||||||
const select = ref.vnSelectDialogRef
|
});
|
||||||
? ref.vnSelectDialogRef.vnSelectRef
|
|
||||||
: ref.vnSelectRef;
|
const taxRateTotal = computed(() => {
|
||||||
select.$el.querySelector('input').setSelectionRange(0, 0);
|
return getTotal(invoiceInFormRef.value.formData, null, {
|
||||||
|
cb: taxRate,
|
||||||
});
|
});
|
||||||
}
|
});
|
||||||
|
|
||||||
|
const combinedTotal = computed(() => {
|
||||||
|
return +taxableBaseTotal.value + +taxRateTotal.value;
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
<template>
|
<template>
|
||||||
<FetchData
|
<FetchData
|
||||||
|
@ -195,24 +187,14 @@ function setCursor(ref) {
|
||||||
<template #body-cell-expense="{ row, col }">
|
<template #body-cell-expense="{ row, col }">
|
||||||
<QTd>
|
<QTd>
|
||||||
<VnSelectDialog
|
<VnSelectDialog
|
||||||
:ref="`expenseRef-${row.$index}`"
|
ref="expenseRef"
|
||||||
v-model="row[col.model]"
|
v-model="row[col.model]"
|
||||||
:options="col.options"
|
:options="col.options"
|
||||||
:option-value="col.optionValue"
|
:option-value="col.optionValue"
|
||||||
:option-label="col.optionLabel"
|
:option-label="col.optionLabel"
|
||||||
:filter-options="['id', 'name']"
|
:filter-options="['id', 'name']"
|
||||||
:tooltip="t('Create a new expense')"
|
:tooltip="t('Create a new expense')"
|
||||||
@keydown.tab="
|
@keydown.tab="autocompleteExpense($event, row, col)"
|
||||||
autocompleteExpense(
|
|
||||||
$event,
|
|
||||||
row,
|
|
||||||
col,
|
|
||||||
$refs[`expenseRef-${row.$index}`],
|
|
||||||
)
|
|
||||||
"
|
|
||||||
@update:model-value="
|
|
||||||
setCursor($refs[`expenseRef-${row.$index}`])
|
|
||||||
"
|
|
||||||
>
|
>
|
||||||
<template #option="scope">
|
<template #option="scope">
|
||||||
<QItem v-bind="scope.itemProps">
|
<QItem v-bind="scope.itemProps">
|
||||||
|
@ -228,7 +210,7 @@ function setCursor(ref) {
|
||||||
</QTd>
|
</QTd>
|
||||||
</template>
|
</template>
|
||||||
<template #body-cell-taxablebase="{ row }">
|
<template #body-cell-taxablebase="{ row }">
|
||||||
<QTd shrink>
|
<QTd>
|
||||||
<VnInputNumber
|
<VnInputNumber
|
||||||
clear-icon="close"
|
clear-icon="close"
|
||||||
v-model="row.taxableBase"
|
v-model="row.taxableBase"
|
||||||
|
@ -239,16 +221,12 @@ function setCursor(ref) {
|
||||||
<template #body-cell-sageiva="{ row, col }">
|
<template #body-cell-sageiva="{ row, col }">
|
||||||
<QTd>
|
<QTd>
|
||||||
<VnSelect
|
<VnSelect
|
||||||
:ref="`sageivaRef-${row.$index}`"
|
|
||||||
v-model="row[col.model]"
|
v-model="row[col.model]"
|
||||||
:options="col.options"
|
:options="col.options"
|
||||||
:option-value="col.optionValue"
|
:option-value="col.optionValue"
|
||||||
:option-label="col.optionLabel"
|
:option-label="col.optionLabel"
|
||||||
:filter-options="['id', 'vat']"
|
:filter-options="['id', 'vat']"
|
||||||
data-cy="vat-sageiva"
|
data-cy="vat-sageiva"
|
||||||
@update:model-value="
|
|
||||||
setCursor($refs[`sageivaRef-${row.$index}`])
|
|
||||||
"
|
|
||||||
>
|
>
|
||||||
<template #option="scope">
|
<template #option="scope">
|
||||||
<QItem v-bind="scope.itemProps">
|
<QItem v-bind="scope.itemProps">
|
||||||
|
@ -266,15 +244,11 @@ function setCursor(ref) {
|
||||||
<template #body-cell-sagetransaction="{ row, col }">
|
<template #body-cell-sagetransaction="{ row, col }">
|
||||||
<QTd>
|
<QTd>
|
||||||
<VnSelect
|
<VnSelect
|
||||||
:ref="`sagetransactionRef-${row.$index}`"
|
|
||||||
v-model="row[col.model]"
|
v-model="row[col.model]"
|
||||||
:options="col.options"
|
:options="col.options"
|
||||||
:option-value="col.optionValue"
|
:option-value="col.optionValue"
|
||||||
:option-label="col.optionLabel"
|
:option-label="col.optionLabel"
|
||||||
:filter-options="['id', 'transaction']"
|
:filter-options="['id', 'transaction']"
|
||||||
@update:model-value="
|
|
||||||
setCursor($refs[`sagetransactionRef-${row.$index}`])
|
|
||||||
"
|
|
||||||
>
|
>
|
||||||
<template #option="scope">
|
<template #option="scope">
|
||||||
<QItem v-bind="scope.itemProps">
|
<QItem v-bind="scope.itemProps">
|
||||||
|
@ -292,7 +266,7 @@ function setCursor(ref) {
|
||||||
</QTd>
|
</QTd>
|
||||||
</template>
|
</template>
|
||||||
<template #body-cell-foreignvalue="{ row }">
|
<template #body-cell-foreignvalue="{ row }">
|
||||||
<QTd shrink>
|
<QTd>
|
||||||
<VnInputNumber
|
<VnInputNumber
|
||||||
:class="{
|
:class="{
|
||||||
'no-pointer-events': !isNotEuro(currency),
|
'no-pointer-events': !isNotEuro(currency),
|
||||||
|
|
|
@ -56,7 +56,7 @@ const cols = computed(() => [
|
||||||
{
|
{
|
||||||
align: 'left',
|
align: 'left',
|
||||||
name: 'supplierRef',
|
name: 'supplierRef',
|
||||||
label: t('invoiceIn.supplierRef'),
|
label: t('invoiceIn.list.supplierRef'),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
align: 'left',
|
align: 'left',
|
||||||
|
@ -177,7 +177,7 @@ const cols = computed(() => [
|
||||||
:required="true"
|
:required="true"
|
||||||
/>
|
/>
|
||||||
<VnInput
|
<VnInput
|
||||||
:label="t('invoiceIn.supplierRef')"
|
:label="t('invoiceIn.list.supplierRef')"
|
||||||
v-model="data.supplierRef"
|
v-model="data.supplierRef"
|
||||||
/>
|
/>
|
||||||
<VnSelect
|
<VnSelect
|
||||||
|
|
|
@ -4,7 +4,6 @@ import { useQuasar } from 'quasar';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
import VnConfirm from 'src/components/ui/VnConfirm.vue';
|
import VnConfirm from 'src/components/ui/VnConfirm.vue';
|
||||||
import { useArrayData } from 'src/composables/useArrayData';
|
import { useArrayData } from 'src/composables/useArrayData';
|
||||||
import qs from 'qs';
|
|
||||||
const { notify, dialog } = useQuasar();
|
const { notify, dialog } = useQuasar();
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
|
@ -13,51 +12,29 @@ defineExpose({ checkToBook });
|
||||||
const { store } = useArrayData();
|
const { store } = useArrayData();
|
||||||
|
|
||||||
async function checkToBook(id) {
|
async function checkToBook(id) {
|
||||||
let messages = [];
|
let directBooking = true;
|
||||||
|
|
||||||
const hasProblemWithTax = (
|
|
||||||
await axios.get('InvoiceInTaxes/count', {
|
|
||||||
params: {
|
|
||||||
where: JSON.stringify({
|
|
||||||
invoiceInFk: id,
|
|
||||||
or: [{ taxTypeSageFk: null }, { transactionTypeSageFk: null }],
|
|
||||||
}),
|
|
||||||
},
|
|
||||||
})
|
|
||||||
).data?.count;
|
|
||||||
|
|
||||||
if (hasProblemWithTax)
|
|
||||||
messages.push(t('The VAT and Transaction fields have not been informed'));
|
|
||||||
|
|
||||||
const { data: totals } = await axios.get(`InvoiceIns/${id}/getTotals`);
|
const { data: totals } = await axios.get(`InvoiceIns/${id}/getTotals`);
|
||||||
const taxableBaseNotEqualDueDay = totals.totalDueDay != totals.totalTaxableBase;
|
const taxableBaseNotEqualDueDay = totals.totalDueDay != totals.totalTaxableBase;
|
||||||
const vatNotEqualDueDay = totals.totalDueDay != totals.totalVat;
|
const vatNotEqualDueDay = totals.totalDueDay != totals.totalVat;
|
||||||
|
|
||||||
if (taxableBaseNotEqualDueDay && vatNotEqualDueDay)
|
if (taxableBaseNotEqualDueDay && vatNotEqualDueDay) directBooking = false;
|
||||||
messages.push(t('The sum of the taxable bases does not match the due dates'));
|
|
||||||
|
|
||||||
const dueDaysCount = (
|
const { data: dueDaysCount } = await axios.get('InvoiceInDueDays/count', {
|
||||||
await axios.get('InvoiceInDueDays/count', {
|
where: {
|
||||||
params: {
|
|
||||||
where: JSON.stringify({
|
|
||||||
invoiceInFk: id,
|
invoiceInFk: id,
|
||||||
dueDated: { gte: Date.vnNew() },
|
dueDated: { gte: Date.vnNew() },
|
||||||
}),
|
|
||||||
},
|
},
|
||||||
})
|
});
|
||||||
).data?.count;
|
|
||||||
|
|
||||||
if (dueDaysCount) messages.push(t('Some due dates are less than or equal to today'));
|
if (dueDaysCount) directBooking = false;
|
||||||
|
|
||||||
|
if (directBooking) return toBook(id);
|
||||||
|
|
||||||
if (!messages.length) toBook(id);
|
|
||||||
else
|
|
||||||
dialog({
|
dialog({
|
||||||
component: VnConfirm,
|
component: VnConfirm,
|
||||||
componentProps: {
|
componentProps: { title: t('Are you sure you want to book this invoice?') },
|
||||||
title: t('Are you sure you want to book this invoice?'),
|
}).onOk(async () => await toBook(id));
|
||||||
message: messages.reduce((acc, msg) => `${acc}<p>${msg}</p>`, ''),
|
|
||||||
},
|
|
||||||
}).onOk(() => toBook(id));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async function toBook(id) {
|
async function toBook(id) {
|
||||||
|
@ -82,7 +59,4 @@ async function toBook(id) {
|
||||||
es:
|
es:
|
||||||
Are you sure you want to book this invoice?: ¿Estás seguro de querer asentar esta factura?
|
Are you sure you want to book this invoice?: ¿Estás seguro de querer asentar esta factura?
|
||||||
It was not able to book the invoice: No se pudo contabilizar la factura
|
It was not able to book the invoice: No se pudo contabilizar la factura
|
||||||
Some due dates are less than or equal to today: Algún vencimiento tiene una fecha menor o igual que hoy
|
|
||||||
The sum of the taxable bases does not match the due dates: La suma de las bases imponibles no coincide con la de los vencimientos
|
|
||||||
The VAT and Transaction fields have not been informed: No se han informado los campos de iva y/o transacción
|
|
||||||
</i18n>
|
</i18n>
|
||||||
|
|
|
@ -3,10 +3,10 @@ invoiceIn:
|
||||||
searchInfo: Search incoming invoices by ID or supplier fiscal name
|
searchInfo: Search incoming invoices by ID or supplier fiscal name
|
||||||
serial: Serial
|
serial: Serial
|
||||||
isBooked: Is booked
|
isBooked: Is booked
|
||||||
supplierRef: Invoice nº
|
|
||||||
list:
|
list:
|
||||||
ref: Reference
|
ref: Reference
|
||||||
supplier: Supplier
|
supplier: Supplier
|
||||||
|
supplierRef: Supplier ref.
|
||||||
file: File
|
file: File
|
||||||
issued: Issued
|
issued: Issued
|
||||||
dueDated: Due dated
|
dueDated: Due dated
|
||||||
|
@ -19,6 +19,8 @@ invoiceIn:
|
||||||
unbook: Unbook
|
unbook: Unbook
|
||||||
delete: Delete
|
delete: Delete
|
||||||
clone: Clone
|
clone: Clone
|
||||||
|
toBook: To book
|
||||||
|
toUnbook: To unbook
|
||||||
deleteInvoice: Delete invoice
|
deleteInvoice: Delete invoice
|
||||||
invoiceDeleted: invoice deleted
|
invoiceDeleted: invoice deleted
|
||||||
cloneInvoice: Clone invoice
|
cloneInvoice: Clone invoice
|
||||||
|
@ -68,3 +70,4 @@ invoiceIn:
|
||||||
isBooked: Is booked
|
isBooked: Is booked
|
||||||
account: Ledger account
|
account: Ledger account
|
||||||
correctingFk: Rectificative
|
correctingFk: Rectificative
|
||||||
|
|
|
@ -3,10 +3,10 @@ invoiceIn:
|
||||||
searchInfo: Buscar facturas recibidas por ID o nombre fiscal del proveedor
|
searchInfo: Buscar facturas recibidas por ID o nombre fiscal del proveedor
|
||||||
serial: Serie
|
serial: Serie
|
||||||
isBooked: Contabilizada
|
isBooked: Contabilizada
|
||||||
supplierRef: Nº factura
|
|
||||||
list:
|
list:
|
||||||
ref: Referencia
|
ref: Referencia
|
||||||
supplier: Proveedor
|
supplier: Proveedor
|
||||||
|
supplierRef: Ref. proveedor
|
||||||
issued: F. emisión
|
issued: F. emisión
|
||||||
dueDated: F. vencimiento
|
dueDated: F. vencimiento
|
||||||
file: Fichero
|
file: Fichero
|
||||||
|
@ -15,10 +15,12 @@ invoiceIn:
|
||||||
descriptor:
|
descriptor:
|
||||||
ticketList: Listado de tickets
|
ticketList: Listado de tickets
|
||||||
descriptorMenu:
|
descriptorMenu:
|
||||||
book: Contabilizar
|
book: Asentar
|
||||||
unbook: Descontabilizar
|
unbook: Desasentar
|
||||||
delete: Eliminar
|
delete: Eliminar
|
||||||
clone: Clonar
|
clone: Clonar
|
||||||
|
toBook: Contabilizar
|
||||||
|
toUnbook: Descontabilizar
|
||||||
deleteInvoice: Eliminar factura
|
deleteInvoice: Eliminar factura
|
||||||
invoiceDeleted: Factura eliminada
|
invoiceDeleted: Factura eliminada
|
||||||
cloneInvoice: Clonar factura
|
cloneInvoice: Clonar factura
|
||||||
|
@ -66,3 +68,4 @@ invoiceIn:
|
||||||
isBooked: Contabilizada
|
isBooked: Contabilizada
|
||||||
account: Cuenta contable
|
account: Cuenta contable
|
||||||
correctingFk: Rectificativa
|
correctingFk: Rectificativa
|
||||||
|
|
||||||
|
|
|
@ -65,19 +65,10 @@ const columns = computed(() => [
|
||||||
name: 'name',
|
name: 'name',
|
||||||
...defaultColumnAttrs,
|
...defaultColumnAttrs,
|
||||||
create: true,
|
create: true,
|
||||||
columnFilter: {
|
|
||||||
component: 'select',
|
|
||||||
attrs: {
|
|
||||||
url: 'Items',
|
|
||||||
fields: ['id', 'name', 'subName'],
|
|
||||||
optionLabel: 'name',
|
|
||||||
optionValue: 'name',
|
|
||||||
uppercase: false,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: t('item.fixedPrice.groupingPrice'),
|
label: t('item.fixedPrice.groupingPrice'),
|
||||||
|
field: 'rate2',
|
||||||
name: 'rate2',
|
name: 'rate2',
|
||||||
...defaultColumnAttrs,
|
...defaultColumnAttrs,
|
||||||
component: 'input',
|
component: 'input',
|
||||||
|
@ -85,6 +76,7 @@ const columns = computed(() => [
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: t('item.fixedPrice.packingPrice'),
|
label: t('item.fixedPrice.packingPrice'),
|
||||||
|
field: 'rate3',
|
||||||
name: 'rate3',
|
name: 'rate3',
|
||||||
...defaultColumnAttrs,
|
...defaultColumnAttrs,
|
||||||
component: 'input',
|
component: 'input',
|
||||||
|
@ -93,6 +85,7 @@ const columns = computed(() => [
|
||||||
|
|
||||||
{
|
{
|
||||||
label: t('item.fixedPrice.minPrice'),
|
label: t('item.fixedPrice.minPrice'),
|
||||||
|
field: 'minPrice',
|
||||||
name: 'minPrice',
|
name: 'minPrice',
|
||||||
...defaultColumnAttrs,
|
...defaultColumnAttrs,
|
||||||
component: 'input',
|
component: 'input',
|
||||||
|
@ -115,6 +108,7 @@ const columns = computed(() => [
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: t('item.fixedPrice.ended'),
|
label: t('item.fixedPrice.ended'),
|
||||||
|
field: 'ended',
|
||||||
name: 'ended',
|
name: 'ended',
|
||||||
...defaultColumnAttrs,
|
...defaultColumnAttrs,
|
||||||
columnField: {
|
columnField: {
|
||||||
|
@ -130,6 +124,7 @@ const columns = computed(() => [
|
||||||
|
|
||||||
{
|
{
|
||||||
label: t('globals.warehouse'),
|
label: t('globals.warehouse'),
|
||||||
|
field: 'warehouseFk',
|
||||||
name: 'warehouseFk',
|
name: 'warehouseFk',
|
||||||
...defaultColumnAttrs,
|
...defaultColumnAttrs,
|
||||||
columnClass: 'shrink',
|
columnClass: 'shrink',
|
||||||
|
@ -420,6 +415,7 @@ function handleOnDataSave({ CrudModelRef }) {
|
||||||
'row-key': 'id',
|
'row-key': 'id',
|
||||||
selection: 'multiple',
|
selection: 'multiple',
|
||||||
}"
|
}"
|
||||||
|
:use-model="true"
|
||||||
v-model:selected="rowsSelected"
|
v-model:selected="rowsSelected"
|
||||||
:create-as-dialog="false"
|
:create-as-dialog="false"
|
||||||
:create="{
|
:create="{
|
||||||
|
|
|
@ -6,7 +6,7 @@ import VehicleFilter from '../VehicleFilter.js';
|
||||||
<template>
|
<template>
|
||||||
<VnCardBeta
|
<VnCardBeta
|
||||||
data-key="Vehicle"
|
data-key="Vehicle"
|
||||||
url="Vehicles"
|
base-url="Vehicles"
|
||||||
:filter="VehicleFilter"
|
:filter="VehicleFilter"
|
||||||
:descriptor="VehicleDescriptor"
|
:descriptor="VehicleDescriptor"
|
||||||
/>
|
/>
|
||||||
|
|
|
@ -136,7 +136,7 @@ const columns = computed(() => [
|
||||||
/>
|
/>
|
||||||
<FetchData
|
<FetchData
|
||||||
url="Countries"
|
url="Countries"
|
||||||
:filter="{ fields: ['name', 'code'] }"
|
:filter="{ fields: ['code'] }"
|
||||||
@on-fetch="(data) => (countries = data)"
|
@on-fetch="(data) => (countries = data)"
|
||||||
auto-load
|
auto-load
|
||||||
/>
|
/>
|
||||||
|
@ -209,7 +209,7 @@ const columns = computed(() => [
|
||||||
v-model="data.countryCodeFk"
|
v-model="data.countryCodeFk"
|
||||||
:label="$t('globals.country')"
|
:label="$t('globals.country')"
|
||||||
option-value="code"
|
option-value="code"
|
||||||
option-label="name"
|
option-label="code"
|
||||||
:options="countries"
|
:options="countries"
|
||||||
/>
|
/>
|
||||||
<VnInput
|
<VnInput
|
||||||
|
|
|
@ -1,13 +1,19 @@
|
||||||
<script setup>
|
<script setup>
|
||||||
|
import VnCard from 'components/common/VnCard.vue';
|
||||||
import SupplierDescriptor from './SupplierDescriptor.vue';
|
import SupplierDescriptor from './SupplierDescriptor.vue';
|
||||||
import VnCardBeta from 'src/components/common/VnCardBeta.vue';
|
|
||||||
import filter from './SupplierFilter.js';
|
import filter from './SupplierFilter.js';
|
||||||
</script>
|
</script>
|
||||||
<template>
|
<template>
|
||||||
<VnCardBeta
|
<VnCard
|
||||||
data-key="Supplier"
|
data-key="Supplier"
|
||||||
url="Suppliers"
|
url="Suppliers"
|
||||||
:descriptor="SupplierDescriptor"
|
|
||||||
:filter="filter"
|
:filter="filter"
|
||||||
|
:descriptor="SupplierDescriptor"
|
||||||
|
search-data-key="SupplierList"
|
||||||
|
:searchbar-props="{
|
||||||
|
url: 'Suppliers/filter',
|
||||||
|
searchUrl: 'table',
|
||||||
|
label: 'Search suppliers',
|
||||||
|
}"
|
||||||
/>
|
/>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -16,7 +16,6 @@ import axios from 'axios';
|
||||||
import { useStateStore } from 'stores/useStateStore';
|
import { useStateStore } from 'stores/useStateStore';
|
||||||
import { useState } from 'src/composables/useState';
|
import { useState } from 'src/composables/useState';
|
||||||
import { useArrayData } from 'composables/useArrayData';
|
import { useArrayData } from 'composables/useArrayData';
|
||||||
import RightMenu from 'src/components/common/RightMenu.vue';
|
|
||||||
|
|
||||||
const state = useState();
|
const state = useState();
|
||||||
const stateStore = useStateStore();
|
const stateStore = useStateStore();
|
||||||
|
@ -174,11 +173,10 @@ onMounted(async () => {
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</Teleport>
|
</Teleport>
|
||||||
<RightMenu>
|
<QPage class="column items-center q-pa-md">
|
||||||
<template #right-panel>
|
<Teleport to="#right-panel" v-if="stateStore.isHeaderMounted()">
|
||||||
<SupplierConsumptionFilter data-key="SupplierConsumption" />
|
<SupplierConsumptionFilter data-key="SupplierConsumption" />
|
||||||
</template>
|
</Teleport>
|
||||||
</RightMenu>
|
|
||||||
<QTable
|
<QTable
|
||||||
:rows="rows"
|
:rows="rows"
|
||||||
row-key="id"
|
row-key="id"
|
||||||
|
@ -227,6 +225,7 @@ onMounted(async () => {
|
||||||
</QTr>
|
</QTr>
|
||||||
</template>
|
</template>
|
||||||
</QTable>
|
</QTable>
|
||||||
|
</QPage>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
|
|
|
@ -9,6 +9,7 @@ import VnRow from 'components/ui/VnRow.vue';
|
||||||
import VnInput from 'src/components/common/VnInput.vue';
|
import VnInput from 'src/components/common/VnInput.vue';
|
||||||
import VnSelect from 'src/components/common/VnSelect.vue';
|
import VnSelect from 'src/components/common/VnSelect.vue';
|
||||||
import VnLocation from 'src/components/common/VnLocation.vue';
|
import VnLocation from 'src/components/common/VnLocation.vue';
|
||||||
|
import VnSelectVies from 'src/components/common/VnSelectVies.vue';
|
||||||
import VnAccountNumber from 'src/components/common/VnAccountNumber.vue';
|
import VnAccountNumber from 'src/components/common/VnAccountNumber.vue';
|
||||||
|
|
||||||
const route = useRoute();
|
const route = useRoute();
|
||||||
|
@ -68,7 +69,7 @@ function handleLocation(data, location) {
|
||||||
'supplierActivityFk',
|
'supplierActivityFk',
|
||||||
'healthRegister',
|
'healthRegister',
|
||||||
'street',
|
'street',
|
||||||
'isVies',
|
'viesCode',
|
||||||
'isTrucker',
|
'isTrucker',
|
||||||
],
|
],
|
||||||
include: [
|
include: [
|
||||||
|
@ -173,34 +174,15 @@ function handleLocation(data, location) {
|
||||||
country: data.country,
|
country: data.country,
|
||||||
}"
|
}"
|
||||||
@update:model-value="(location) => handleLocation(data, location)"
|
@update:model-value="(location) => handleLocation(data, location)"
|
||||||
>
|
/>
|
||||||
</VnLocation>
|
|
||||||
</VnRow>
|
</VnRow>
|
||||||
<VnRow>
|
<VnRow>
|
||||||
<div class="col flex justify-around">
|
<VnSelectVies v-model="data.viesCode" />
|
||||||
<QCheckbox
|
<QCheckbox
|
||||||
v-model="data.isTrucker"
|
v-model="data.isTrucker"
|
||||||
:label="t('supplier.fiscalData.isTrucker')"
|
:label="t('supplier.fiscalData.isTrucker')"
|
||||||
/>
|
/>
|
||||||
<div class="row items-center">
|
|
||||||
<QCheckbox v-model="data.isVies" :label="t('globals.isVies')" />
|
|
||||||
<QIcon name="info" size="xs" class="cursor-pointer q-ml-sm">
|
|
||||||
<QTooltip>
|
|
||||||
{{
|
|
||||||
t(
|
|
||||||
'When activating it, do not enter the country code in the ID field.'
|
|
||||||
)
|
|
||||||
}}
|
|
||||||
</QTooltip>
|
|
||||||
</QIcon>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</VnRow>
|
</VnRow>
|
||||||
</template>
|
</template>
|
||||||
</FormModel>
|
</FormModel>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<i18n>
|
|
||||||
es:
|
|
||||||
When activating it, do not enter the country code in the ID field.: Al activarlo, no informar el código del país en el campo nif
|
|
||||||
</i18n>
|
|
||||||
|
|
|
@ -2,15 +2,14 @@
|
||||||
import { computed, ref } from 'vue';
|
import { computed, ref } from 'vue';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
import VnTable from 'components/VnTable/VnTable.vue';
|
import VnTable from 'components/VnTable/VnTable.vue';
|
||||||
import VnSection from 'src/components/common/VnSection.vue';
|
import VnSearchbar from 'components/ui/VnSearchbar.vue';
|
||||||
|
import RightMenu from 'src/components/common/RightMenu.vue';
|
||||||
|
import SupplierListFilter from './SupplierListFilter.vue';
|
||||||
import VnInput from 'src/components/common/VnInput.vue';
|
import VnInput from 'src/components/common/VnInput.vue';
|
||||||
import VnSelect from 'src/components/common/VnSelect.vue';
|
|
||||||
import FetchData from 'src/components/FetchData.vue';
|
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
const tableRef = ref();
|
const tableRef = ref();
|
||||||
const dataKey = 'SupplierList';
|
|
||||||
const provincesOptions = ref([]);
|
|
||||||
const columns = computed(() => [
|
const columns = computed(() => [
|
||||||
{
|
{
|
||||||
align: 'left',
|
align: 'left',
|
||||||
|
@ -105,26 +104,19 @@ const columns = computed(() => [
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<FetchData
|
<VnSearchbar data-key="SuppliersList" :limit="20" :label="t('Search suppliers')" />
|
||||||
url="Provinces"
|
<RightMenu>
|
||||||
:filter="{ fields: ['id', 'name'], order: 'name ASC' }"
|
<template #right-panel>
|
||||||
@on-fetch="(data) => (provincesOptions = data)"
|
<SupplierListFilter data-key="SuppliersList" />
|
||||||
auto-load
|
</template>
|
||||||
/>
|
</RightMenu>
|
||||||
<VnSection
|
|
||||||
:data-key="dataKey"
|
|
||||||
:columns="columns"
|
|
||||||
prefix="supplier"
|
|
||||||
:array-data-props="{
|
|
||||||
url: 'Suppliers/filter',
|
|
||||||
order: 'id ASC',
|
|
||||||
}"
|
|
||||||
>
|
|
||||||
<template #body>
|
|
||||||
<VnTable
|
<VnTable
|
||||||
ref="tableRef"
|
ref="tableRef"
|
||||||
:data-key="dataKey"
|
data-key="SuppliersList"
|
||||||
|
url="Suppliers/filter"
|
||||||
|
redirect="supplier"
|
||||||
:create="{
|
:create="{
|
||||||
urlCreate: 'Suppliers/newSupplier',
|
urlCreate: 'Suppliers/newSupplier',
|
||||||
title: t('Create Supplier'),
|
title: t('Create Supplier'),
|
||||||
|
@ -132,35 +124,18 @@ const columns = computed(() => [
|
||||||
formInitialData: {},
|
formInitialData: {},
|
||||||
mapper: (data) => {
|
mapper: (data) => {
|
||||||
data.name = data.socialName;
|
data.name = data.socialName;
|
||||||
delete data.socialName;
|
|
||||||
return data;
|
return data;
|
||||||
},
|
},
|
||||||
}"
|
}"
|
||||||
:columns="columns"
|
|
||||||
redirect="supplier"
|
|
||||||
:right-search="false"
|
:right-search="false"
|
||||||
|
order="id ASC"
|
||||||
|
:columns="columns"
|
||||||
>
|
>
|
||||||
<template #more-create-dialog="{ data }">
|
<template #more-create-dialog="{ data }">
|
||||||
<VnInput
|
<VnInput :label="t('globals.name')" v-model="data.socialName" :uppercase="true" />
|
||||||
:label="t('globals.name')"
|
|
||||||
v-model="data.socialName"
|
|
||||||
:uppercase="true"
|
|
||||||
/>
|
|
||||||
</template>
|
</template>
|
||||||
</VnTable>
|
</VnTable>
|
||||||
</template>
|
|
||||||
<template #moreFilterPanel="{ params, searchFn }">
|
|
||||||
<VnSelect
|
|
||||||
:label="t('globals.params.provinceFk')"
|
|
||||||
v-model="params.provinceFk"
|
|
||||||
@update:model-value="searchFn()"
|
|
||||||
:options="provincesOptions"
|
|
||||||
filled
|
|
||||||
dense
|
|
||||||
class="q-px-sm q-pr-lg"
|
|
||||||
/>
|
|
||||||
</template>
|
|
||||||
</VnSection>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<i18n>
|
<i18n>
|
||||||
|
|
|
@ -0,0 +1,122 @@
|
||||||
|
<script setup>
|
||||||
|
import { ref } from 'vue';
|
||||||
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
|
import VnFilterPanel from 'src/components/ui/VnFilterPanel.vue';
|
||||||
|
import VnSelect from 'src/components/common/VnSelect.vue';
|
||||||
|
import VnInput from 'src/components/common/VnInput.vue';
|
||||||
|
import FetchData from 'components/FetchData.vue';
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
dataKey: {
|
||||||
|
type: String,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const { t } = useI18n();
|
||||||
|
|
||||||
|
const provincesOptions = ref([]);
|
||||||
|
const countriesOptions = ref([]);
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<FetchData
|
||||||
|
url="Provinces"
|
||||||
|
:filter="{ fields: ['id', 'name'], order: 'name ASC'}"
|
||||||
|
@on-fetch="(data) => (provincesOptions = data)"
|
||||||
|
auto-load
|
||||||
|
/>
|
||||||
|
<FetchData
|
||||||
|
url="countries"
|
||||||
|
:filter="{ fields: ['id', 'name'], order: 'name ASC'}"
|
||||||
|
@on-fetch="(data) => (countriesOptions = data)"
|
||||||
|
auto-load
|
||||||
|
/>
|
||||||
|
<VnFilterPanel
|
||||||
|
:data-key="props.dataKey"
|
||||||
|
:search-button="true"
|
||||||
|
:unremovable-params="['supplierFk']"
|
||||||
|
>
|
||||||
|
<template #tags="{ tag, formatFn }">
|
||||||
|
<div class="q-gutter-x-xs">
|
||||||
|
<strong>{{ t(`params.${tag.label}`) }}: </strong>
|
||||||
|
<span>{{ formatFn(tag.value) }}</span>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<template #body="{ params, searchFn }">
|
||||||
|
<QItem>
|
||||||
|
<QItemSection>
|
||||||
|
<VnInput
|
||||||
|
v-model="params.search"
|
||||||
|
:label="t('params.search')"
|
||||||
|
is-outlined
|
||||||
|
/>
|
||||||
|
</QItemSection>
|
||||||
|
</QItem>
|
||||||
|
<QItem>
|
||||||
|
<QItemSection>
|
||||||
|
<VnInput
|
||||||
|
v-model="params.nickname"
|
||||||
|
:label="t('params.nickname')"
|
||||||
|
is-outlined
|
||||||
|
/>
|
||||||
|
</QItemSection>
|
||||||
|
</QItem>
|
||||||
|
<QItem>
|
||||||
|
<QItemSection>
|
||||||
|
<VnInput v-model="params.nif" :label="t('params.nif')" is-outlined />
|
||||||
|
</QItemSection>
|
||||||
|
</QItem>
|
||||||
|
<QItem>
|
||||||
|
<QItemSection>
|
||||||
|
<VnSelect
|
||||||
|
:label="t('params.provinceFk')"
|
||||||
|
v-model="params.provinceFk"
|
||||||
|
@update:model-value="searchFn()"
|
||||||
|
:options="provincesOptions"
|
||||||
|
option-value="id"
|
||||||
|
option-label="name"
|
||||||
|
hide-selected
|
||||||
|
dense
|
||||||
|
outlined
|
||||||
|
rounded
|
||||||
|
/>
|
||||||
|
</QItemSection>
|
||||||
|
</QItem>
|
||||||
|
<QItem>
|
||||||
|
<QItemSection>
|
||||||
|
<VnSelect
|
||||||
|
:label="t('params.countryFk')"
|
||||||
|
v-model="params.countryFk"
|
||||||
|
@update:model-value="searchFn()"
|
||||||
|
:options="countriesOptions"
|
||||||
|
option-value="id"
|
||||||
|
option-label="name"
|
||||||
|
hide-selected
|
||||||
|
dense
|
||||||
|
outlined
|
||||||
|
rounded
|
||||||
|
/>
|
||||||
|
</QItemSection>
|
||||||
|
</QItem>
|
||||||
|
</template>
|
||||||
|
</VnFilterPanel>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<i18n>
|
||||||
|
en:
|
||||||
|
params:
|
||||||
|
search: General search
|
||||||
|
nickname: Alias
|
||||||
|
nif: Tax number
|
||||||
|
provinceFk: Province
|
||||||
|
countryFk: Country
|
||||||
|
es:
|
||||||
|
params:
|
||||||
|
search: Búsqueda general
|
||||||
|
nickname: Alias
|
||||||
|
nif: NIF/CIF
|
||||||
|
provinceFk: Provincia
|
||||||
|
countryFk: País
|
||||||
|
</i18n>
|
|
@ -376,30 +376,6 @@ onMounted(async () => {
|
||||||
</template>
|
</template>
|
||||||
<template #body-cell-problems="{ row }">
|
<template #body-cell-problems="{ row }">
|
||||||
<QTd class="q-gutter-x-xs">
|
<QTd class="q-gutter-x-xs">
|
||||||
<QIcon
|
|
||||||
v-if="row.futureAgencyFk !== row.agencyFk && row.agencyFk"
|
|
||||||
color="primary"
|
|
||||||
name="vn:agency-term"
|
|
||||||
size="xs"
|
|
||||||
class="q-mr-xs"
|
|
||||||
>
|
|
||||||
<QTooltip class="column">
|
|
||||||
<span>
|
|
||||||
{{
|
|
||||||
t('advanceTickets.originAgency', {
|
|
||||||
agency: row.futureAgency,
|
|
||||||
})
|
|
||||||
}}
|
|
||||||
</span>
|
|
||||||
<span>
|
|
||||||
{{
|
|
||||||
t('advanceTickets.destinationAgency', {
|
|
||||||
agency: row.agency,
|
|
||||||
})
|
|
||||||
}}
|
|
||||||
</span>
|
|
||||||
</QTooltip>
|
|
||||||
</QIcon>
|
|
||||||
<QIcon
|
<QIcon
|
||||||
v-if="row.isTaxDataChecked === 0"
|
v-if="row.isTaxDataChecked === 0"
|
||||||
color="primary"
|
color="primary"
|
||||||
|
|
|
@ -107,10 +107,7 @@ export default defineRouter(function (/* { store, ssrContext } */) {
|
||||||
'Failed to fetch dynamically imported module',
|
'Failed to fetch dynamically imported module',
|
||||||
'Importing a module script failed',
|
'Importing a module script failed',
|
||||||
];
|
];
|
||||||
state.set(
|
state.set('error', errorMessages.some(message.includes));
|
||||||
'error',
|
|
||||||
errorMessages.some((error) => message.startsWith(error)),
|
|
||||||
);
|
|
||||||
});
|
});
|
||||||
return Router;
|
return Router;
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,12 +1,19 @@
|
||||||
import { RouterView } from 'vue-router';
|
import { RouterView } from 'vue-router';
|
||||||
|
|
||||||
const supplierCard = {
|
export default {
|
||||||
name: 'SupplierCard',
|
path: '/supplier',
|
||||||
path: ':id',
|
name: 'Supplier',
|
||||||
component: () => import('src/pages/Supplier/Card/SupplierCard.vue'),
|
|
||||||
redirect: { name: 'SupplierSummary' },
|
|
||||||
meta: {
|
meta: {
|
||||||
menu: [
|
title: 'suppliers',
|
||||||
|
icon: 'vn:supplier',
|
||||||
|
moduleName: 'Supplier',
|
||||||
|
keyBinding: 'p',
|
||||||
|
},
|
||||||
|
component: RouterView,
|
||||||
|
redirect: { name: 'SupplierMain' },
|
||||||
|
menus: {
|
||||||
|
main: ['SupplierList'],
|
||||||
|
card: [
|
||||||
'SupplierBasicData',
|
'SupplierBasicData',
|
||||||
'SupplierFiscalData',
|
'SupplierFiscalData',
|
||||||
'SupplierBillingData',
|
'SupplierBillingData',
|
||||||
|
@ -20,6 +27,38 @@ const supplierCard = {
|
||||||
'SupplierDms',
|
'SupplierDms',
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
path: '',
|
||||||
|
name: 'SupplierMain',
|
||||||
|
component: () => import('src/components/common/VnModule.vue'),
|
||||||
|
redirect: { name: 'SupplierList' },
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
path: 'list',
|
||||||
|
name: 'SupplierList',
|
||||||
|
meta: {
|
||||||
|
title: 'list',
|
||||||
|
icon: 'view_list',
|
||||||
|
},
|
||||||
|
component: () => import('src/pages/Supplier/SupplierList.vue'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'create',
|
||||||
|
name: 'SupplierCreate',
|
||||||
|
meta: {
|
||||||
|
title: 'supplierCreate',
|
||||||
|
icon: 'add',
|
||||||
|
},
|
||||||
|
component: () => import('src/pages/Supplier/SupplierCreate.vue'),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'SupplierCard',
|
||||||
|
path: ':id',
|
||||||
|
component: () => import('src/pages/Supplier/Card/SupplierCard.vue'),
|
||||||
|
redirect: { name: 'SupplierSummary' },
|
||||||
children: [
|
children: [
|
||||||
{
|
{
|
||||||
name: 'SupplierSummary',
|
name: 'SupplierSummary',
|
||||||
|
@ -28,7 +67,8 @@ const supplierCard = {
|
||||||
title: 'summary',
|
title: 'summary',
|
||||||
icon: 'launch',
|
icon: 'launch',
|
||||||
},
|
},
|
||||||
component: () => import('src/pages/Supplier/Card/SupplierSummary.vue'),
|
component: () =>
|
||||||
|
import('src/pages/Supplier/Card/SupplierSummary.vue'),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'basic-data',
|
path: 'basic-data',
|
||||||
|
@ -37,7 +77,8 @@ const supplierCard = {
|
||||||
title: 'basicData',
|
title: 'basicData',
|
||||||
icon: 'vn:settings',
|
icon: 'vn:settings',
|
||||||
},
|
},
|
||||||
component: () => import('src/pages/Supplier/Card/SupplierBasicData.vue'),
|
component: () =>
|
||||||
|
import('src/pages/Supplier/Card/SupplierBasicData.vue'),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'fiscal-data',
|
path: 'fiscal-data',
|
||||||
|
@ -46,7 +87,8 @@ const supplierCard = {
|
||||||
title: 'fiscalData',
|
title: 'fiscalData',
|
||||||
icon: 'vn:dfiscales',
|
icon: 'vn:dfiscales',
|
||||||
},
|
},
|
||||||
component: () => import('src/pages/Supplier/Card/SupplierFiscalData.vue'),
|
component: () =>
|
||||||
|
import('src/pages/Supplier/Card/SupplierFiscalData.vue'),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'billing-data',
|
path: 'billing-data',
|
||||||
|
@ -55,7 +97,8 @@ const supplierCard = {
|
||||||
title: 'billingData',
|
title: 'billingData',
|
||||||
icon: 'vn:payment',
|
icon: 'vn:payment',
|
||||||
},
|
},
|
||||||
component: () => import('src/pages/Supplier/Card/SupplierBillingData.vue'),
|
component: () =>
|
||||||
|
import('src/pages/Supplier/Card/SupplierBillingData.vue'),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'log',
|
path: 'log',
|
||||||
|
@ -73,7 +116,8 @@ const supplierCard = {
|
||||||
title: 'accounts',
|
title: 'accounts',
|
||||||
icon: 'vn:credit',
|
icon: 'vn:credit',
|
||||||
},
|
},
|
||||||
component: () => import('src/pages/Supplier/Card/SupplierAccounts.vue'),
|
component: () =>
|
||||||
|
import('src/pages/Supplier/Card/SupplierAccounts.vue'),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'contact',
|
path: 'contact',
|
||||||
|
@ -82,7 +126,8 @@ const supplierCard = {
|
||||||
title: 'contacts',
|
title: 'contacts',
|
||||||
icon: 'contact_phone',
|
icon: 'contact_phone',
|
||||||
},
|
},
|
||||||
component: () => import('src/pages/Supplier/Card/SupplierContacts.vue'),
|
component: () =>
|
||||||
|
import('src/pages/Supplier/Card/SupplierContacts.vue'),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'address',
|
path: 'address',
|
||||||
|
@ -91,7 +136,8 @@ const supplierCard = {
|
||||||
title: 'addresses',
|
title: 'addresses',
|
||||||
icon: 'vn:delivery',
|
icon: 'vn:delivery',
|
||||||
},
|
},
|
||||||
component: () => import('src/pages/Supplier/Card/SupplierAddresses.vue'),
|
component: () =>
|
||||||
|
import('src/pages/Supplier/Card/SupplierAddresses.vue'),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'address/create',
|
path: 'address/create',
|
||||||
|
@ -106,7 +152,8 @@ const supplierCard = {
|
||||||
title: 'balance',
|
title: 'balance',
|
||||||
icon: 'balance',
|
icon: 'balance',
|
||||||
},
|
},
|
||||||
component: () => import('src/pages/Supplier/Card/SupplierBalance.vue'),
|
component: () =>
|
||||||
|
import('src/pages/Supplier/Card/SupplierBalance.vue'),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'consumption',
|
path: 'consumption',
|
||||||
|
@ -115,7 +162,8 @@ const supplierCard = {
|
||||||
title: 'consumption',
|
title: 'consumption',
|
||||||
icon: 'show_chart',
|
icon: 'show_chart',
|
||||||
},
|
},
|
||||||
component: () => import('src/pages/Supplier/Card/SupplierConsumption.vue'),
|
component: () =>
|
||||||
|
import('src/pages/Supplier/Card/SupplierConsumption.vue'),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'agency-term',
|
path: 'agency-term',
|
||||||
|
@ -124,7 +172,8 @@ const supplierCard = {
|
||||||
title: 'agencyTerm',
|
title: 'agencyTerm',
|
||||||
icon: 'vn:agency-term',
|
icon: 'vn:agency-term',
|
||||||
},
|
},
|
||||||
component: () => import('src/pages/Supplier/Card/SupplierAgencyTerm.vue'),
|
component: () =>
|
||||||
|
import('src/pages/Supplier/Card/SupplierAgencyTerm.vue'),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'dms',
|
path: 'dms',
|
||||||
|
@ -142,54 +191,6 @@ const supplierCard = {
|
||||||
import('src/pages/Supplier/Card/SupplierAgencyTermCreate.vue'),
|
import('src/pages/Supplier/Card/SupplierAgencyTermCreate.vue'),
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
};
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: 'Supplier',
|
|
||||||
path: '/supplier',
|
|
||||||
meta: {
|
|
||||||
title: 'suppliers',
|
|
||||||
icon: 'vn:supplier',
|
|
||||||
moduleName: 'Supplier',
|
|
||||||
keyBinding: 'p',
|
|
||||||
menu: ['SupplierList'],
|
|
||||||
},
|
|
||||||
component: RouterView,
|
|
||||||
redirect: { name: 'SupplierMain' },
|
|
||||||
children: [
|
|
||||||
{
|
|
||||||
path: '',
|
|
||||||
name: 'SupplierMain',
|
|
||||||
component: () => import('src/components/common/VnModule.vue'),
|
|
||||||
redirect: { name: 'SupplierIndexMain' },
|
|
||||||
children: [
|
|
||||||
{
|
|
||||||
path: '',
|
|
||||||
name: 'SupplierIndexMain',
|
|
||||||
redirect: { name: 'SupplierList' },
|
|
||||||
component: () => import('src/pages/Supplier/SupplierList.vue'),
|
|
||||||
children: [
|
|
||||||
{
|
|
||||||
path: 'list',
|
|
||||||
name: 'SupplierList',
|
|
||||||
meta: {
|
|
||||||
title: 'list',
|
|
||||||
icon: 'view_list',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
supplierCard,
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: 'create',
|
|
||||||
name: 'SupplierCreate',
|
|
||||||
meta: {
|
|
||||||
title: 'supplierCreate',
|
|
||||||
icon: 'add',
|
|
||||||
},
|
|
||||||
component: () => import('src/pages/Supplier/SupplierCreate.vue'),
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue