Merge branch '8316-parkingCardWithVnCardBeta' of https://gitea.verdnatura.es/verdnatura/salix-front into 8316-parkingCardWithVnCardBeta
This commit is contained in:
commit
f645e8982c
79
CHANGELOG.md
79
CHANGELOG.md
|
@ -1,3 +1,82 @@
|
|||
# Version 25.00 - 2025-01-14
|
||||
|
||||
### Added 🆕
|
||||
|
||||
- chore: refs #7056 move test by:jorgep
|
||||
- feat: refs #7050 7050 add object check by:Jtubau
|
||||
- feat: refs #7050 7050 add test to isEmpty() by:Jtubau
|
||||
- feat: refs #7056 add tests in FormModel by:jorgep
|
||||
- feat: refs #7056 update route meta information and add FormModel tests by:jorgep
|
||||
- feat: refs #7074 tests for fns setData(), parseDms() and showFormDialog() (7074-makeFrontTestToVnDmsList) by:Jtubau
|
||||
- feat: refs #7079 created VnLocation front test by:provira
|
||||
- feat: refs #7189 add Accept-Language header to axios requests by:jorgep
|
||||
- feat: refs #7924 add custom inspection checkbox and localization support by:jgallego
|
||||
- feat: refs #7924 update custom inspection label for clarity in English and Spanish locales by:jgallego
|
||||
- feat: refs #8004 enhance FetchedTags component with column support and styling updates by:pablone
|
||||
- feat: refs #8004 hide rightFilter by:pablone
|
||||
- feat: refs #8246 added new field in list by:Jon
|
||||
- feat: refs #8266 added descriptor to item name by:jtubau
|
||||
- feat: refs #8293 add zone filter by:Jtubau
|
||||
- feat: refs #8293 include zone data in each record by:Jtubau
|
||||
- fix: refs #8004 more list style issues by:pablone
|
||||
- fix: refs #8004 some style issues on all list by:pablone
|
||||
- style: refs #8004 update layout and styling in FetchedTags and ItemList components by:pablone
|
||||
- style: update CustomerBalance.vue to set label color by:jgallego
|
||||
|
||||
### Changed 📦
|
||||
|
||||
- perf: order by:alexm
|
||||
- perf: redirect transition list to card by:alexm
|
||||
- perf: refs #8201 onDataSaved fetch by:Jon
|
||||
- perf: revert processData by:alexm
|
||||
- perf: simplify if by:alexm
|
||||
- perf: simplify if (perf_redirectTransition) by:alexm
|
||||
- refactor: item fixedPrice by:Jon
|
||||
- refactor: refs #7050 refactorize by:jtubau
|
||||
- refactor: refs #7050 removed blank spaces by:jtubau
|
||||
- refactor: refs #7052 move EditTableCellValueForm tests to a new location and enhance test coverage by:jgallego
|
||||
- refactor: refs #7052 remove unnecessary console logs from EditTableCellValueForm tests by:jgallego
|
||||
- refactor: refs #7074 move dms constant to global scope by:Jtubau
|
||||
- refactor: refs #7079 removed useless code by:provira
|
||||
- refactor: refs #7924 simplify custom inspection icon rendering in ExtraCommunity.vue by:jgallego
|
||||
- refactor: refs #8004 remove console log from CardSummary component on mount by:pablone
|
||||
- refactor: refs #8004 remove consoleLogs by:pablone
|
||||
- refactor: refs #8004 remove unused stateStore import in InvoiceInList.vue by:pablone
|
||||
- refactor: refs #8004 remove unused travelFilterRef and chip definition in TravelList.vue by:pablone
|
||||
- refactor: refs #8004 replace VnSelect with VnSelectWorker in CustomerList component by:pablone
|
||||
- refactor: refs #8201 added onMounted to stablish the value to show icons by:Jon
|
||||
- refactor: refs #8201 deleted condition by:Jon
|
||||
- refactor: refs #8201 deleted log by:Jon
|
||||
- refactor: refs #8201 deleted logs by:Jon
|
||||
- refactor: refs #8266 8266 change expedition item name by:Jtubau
|
||||
- refactor: refs #8266 change expedition label by:Jtubau
|
||||
- refactor: refs #8293 remove redundant attributes by:Jtubau
|
||||
- refactor: refs #8320 changed folder names from "specs" to "**tests**" by:provira
|
||||
- refactor: refs #8320 moved front tests to their respective sections by:provira
|
||||
- refactor: refs #8813 removed unused class property by:provira
|
||||
|
||||
### Fixed 🛠️
|
||||
|
||||
- fix: discount class by:PAU ROVIRA ROSALENY
|
||||
- fix: duplicate transalation after test to dev by:alexm
|
||||
- fix: fix translations by:carlossa
|
||||
- fix: redirect to sales when confirming lines by:Jon
|
||||
- fix: refs #7050 delete import added by mistake by:Jtubau
|
||||
- fix: refs #7133 handleSalesModelValue function to handle empty input by:jorgep
|
||||
- fix: refs #7189 update user language on sessionStorage by:jorgep
|
||||
- fix: refs #7935 remove unused 'companyFk' column from InvoiceInList component by:jorgep
|
||||
- fix: refs #8004 more list style issues by:pablone
|
||||
- fix: refs #8004 some style issues on all list by:pablone
|
||||
- fix: refs #8004 update label for daysOnward in TravelFilter component and add translations by:pablone
|
||||
- fix: refs #8004 vnTable card with and add permanent labels by:pablone
|
||||
- fix: refs #8201 added onDataSaved emi to refetch when cahnges are made by:Jon
|
||||
- fix: refs #8201 use arrayData to fix the error by:Jon
|
||||
- fix: refs #8314 space between label and value by:jtubau
|
||||
- fix: refs #8813 fixed ClaimLines format by:provira
|
||||
- fix: update button sizes in ExtraCommunity.vue for better visibility by:jgallego
|
||||
- perf: revert processData by:alexm
|
||||
- refactor: item fixedPrice by:Jon
|
||||
|
||||
# Version 24.52 - 2024-01-07
|
||||
|
||||
### Added 🆕
|
||||
|
|
|
@ -31,7 +31,7 @@ export default {
|
|||
console.error(error);
|
||||
}
|
||||
form.addEventListener('keyup', function (evt) {
|
||||
if (evt.key === 'Enter') {
|
||||
if (evt.key === 'Enter' && !that.$attrs['prevent-submit']) {
|
||||
const input = evt.target;
|
||||
if (input.type == 'textarea' && evt.shiftKey) {
|
||||
evt.preventDefault();
|
||||
|
|
|
@ -0,0 +1,82 @@
|
|||
import { createWrapper, axios } from 'app/test/vitest/helper';
|
||||
import FilterItemForm from 'src/components/FilterItemForm.vue';
|
||||
import { vi, beforeAll, describe, expect, it } from 'vitest';
|
||||
|
||||
describe('FilterItemForm', () => {
|
||||
let vm;
|
||||
let wrapper;
|
||||
|
||||
beforeAll(() => {
|
||||
wrapper = createWrapper(FilterItemForm, {
|
||||
props: {
|
||||
url: 'Items/withName',
|
||||
},
|
||||
});
|
||||
vm = wrapper.vm;
|
||||
wrapper = wrapper.wrapper;
|
||||
|
||||
vi.spyOn(axios, 'get').mockResolvedValue({
|
||||
data: [
|
||||
{
|
||||
id: 999996,
|
||||
name: 'bolas de madera',
|
||||
size: 2,
|
||||
inkFk: null,
|
||||
producerFk: null,
|
||||
},
|
||||
],
|
||||
});
|
||||
});
|
||||
|
||||
it('should filter data and populate tableRows for table display', async () => {
|
||||
vm.itemFilterParams.name = 'bolas de madera';
|
||||
|
||||
await vm.onSubmit();
|
||||
|
||||
const expectedFilter = {
|
||||
include: [
|
||||
{ relation: 'producer', scope: { fields: ['name'] } },
|
||||
{ relation: 'ink', scope: { fields: ['name'] } },
|
||||
],
|
||||
where: {"name":{"like":"%bolas de madera%"}},
|
||||
};
|
||||
|
||||
expect(axios.get).toHaveBeenCalledWith('Items/withName', {
|
||||
params: { filter: JSON.stringify(expectedFilter) },
|
||||
});
|
||||
|
||||
expect(vm.tableRows).toEqual([
|
||||
{
|
||||
id: 999996,
|
||||
name: 'bolas de madera',
|
||||
size: 2,
|
||||
inkFk: null,
|
||||
producerFk: null,
|
||||
},
|
||||
]);
|
||||
});
|
||||
|
||||
it('should handle an empty itemFilterParams correctly', async () => {
|
||||
vm.itemFilterParams.name = null;
|
||||
vm.itemFilterParams = {};
|
||||
|
||||
await vm.onSubmit();
|
||||
|
||||
const expectedFilter = {
|
||||
include: [
|
||||
{ relation: 'producer', scope: { fields: ['name'] } },
|
||||
{ relation: 'ink', scope: { fields: ['name'] } },
|
||||
],
|
||||
where: {},
|
||||
};
|
||||
|
||||
expect(axios.get).toHaveBeenCalledWith('Items/withName', {
|
||||
params: { filter: JSON.stringify(expectedFilter) },
|
||||
});
|
||||
});
|
||||
|
||||
it('should emit "itemSelected" with the correct id and close the form', () => {
|
||||
vm.selectItem({ id: 12345 });
|
||||
expect(wrapper.emitted('itemSelected')[0]).toEqual([12345]);
|
||||
});
|
||||
});
|
|
@ -0,0 +1,72 @@
|
|||
import { createWrapper } from 'app/test/vitest/helper.js';
|
||||
import { describe, it, expect } from 'vitest';
|
||||
import VnInputDate from 'components/common/VnInputDate.vue';
|
||||
|
||||
let vm;
|
||||
let wrapper;
|
||||
|
||||
function generateWrapper(date, outlined, required) {
|
||||
wrapper = createWrapper(VnInputDate, {
|
||||
props: {
|
||||
modelValue: date,
|
||||
},
|
||||
attrs: {
|
||||
isOutlined: outlined,
|
||||
required: required
|
||||
},
|
||||
});
|
||||
wrapper = wrapper.wrapper;
|
||||
vm = wrapper.vm;
|
||||
};
|
||||
|
||||
describe('VnInputDate', () => {
|
||||
|
||||
describe('formattedDate', () => {
|
||||
it('formats a valid date correctly', async () => {
|
||||
generateWrapper('2023-12-25', false, false);
|
||||
await vm.$nextTick();
|
||||
expect(vm.formattedDate).toBe('25/12/2023');
|
||||
});
|
||||
|
||||
it('updates the model value when a new date is set', async () => {
|
||||
const input = wrapper.find('input');
|
||||
await input.setValue('31/12/2023');
|
||||
expect(wrapper.emitted()['update:modelValue']).toBeTruthy();
|
||||
expect(wrapper.emitted()['update:modelValue'][0][0]).toBe('2023-12-31T00:00:00.000Z');
|
||||
});
|
||||
|
||||
it('should not update the model value when an invalid date is set', async () => {
|
||||
const input = wrapper.find('input');
|
||||
await input.setValue('invalid-date');
|
||||
expect(wrapper.emitted()['update:modelValue'][0][0]).toBe('2023-12-31T00:00:00.000Z');
|
||||
});
|
||||
});
|
||||
|
||||
describe('styleAttrs', () => {
|
||||
it('should return empty styleAttrs when isOutlined is false', async () => {
|
||||
generateWrapper('2023-12-25', false, false);
|
||||
await vm.$nextTick();
|
||||
expect(vm.styleAttrs).toEqual({});
|
||||
});
|
||||
|
||||
it('should set styleAttrs when isOutlined is true', async () => {
|
||||
generateWrapper('2023-12-25', true, false);
|
||||
await vm.$nextTick();
|
||||
expect(vm.styleAttrs.outlined).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
describe('required', () => {
|
||||
it('should not applies required class when isRequired is false', async () => {
|
||||
generateWrapper('2023-12-25', false, false);
|
||||
await vm.$nextTick();
|
||||
expect(wrapper.find('.vn-input-date').classes()).not.toContain('required');
|
||||
});
|
||||
|
||||
it('should applies required class when isRequired is true', async () => {
|
||||
generateWrapper('2023-12-25', false, true);
|
||||
await vm.$nextTick();
|
||||
expect(wrapper.find('.vn-input-date').classes()).toContain('required');
|
||||
});
|
||||
});
|
||||
});
|
|
@ -82,7 +82,7 @@ async function fetch() {
|
|||
<span v-else></span>
|
||||
</slot>
|
||||
<slot name="header" :entity="entity" dense>
|
||||
<VnLv :label="`${entity.id} -`" :value="entity.name" />
|
||||
{{ entity.id + ' - ' + entity.name }}
|
||||
</slot>
|
||||
<span class="row no-wrap">
|
||||
<slot name="header-right" :entity="entity" />
|
||||
|
|
|
@ -30,7 +30,7 @@ onBeforeMount(async () => {
|
|||
.data;
|
||||
if (!channel) channel = defaultChannel;
|
||||
|
||||
phone.value = await parsePhone(props.phoneNumber, props.country.toLowerCase());
|
||||
phone.value = await parsePhone(props.phoneNumber, props.country?.toLowerCase());
|
||||
config[
|
||||
type
|
||||
].url = `${url}?customerIdentity=%2B${phone.value}&channelId=${channel}`;
|
||||
|
|
|
@ -248,12 +248,14 @@ function handleLocation(data, location) {
|
|||
clearable
|
||||
v-model="data.longitude"
|
||||
:decimal-places="7"
|
||||
:positive="false"
|
||||
/>
|
||||
<VnInputNumber
|
||||
:label="t('Latitude')"
|
||||
clearable
|
||||
v-model="data.latitude"
|
||||
:decimal-places="7"
|
||||
:positive="false"
|
||||
/>
|
||||
</VnRow>
|
||||
<h4 class="q-mb-xs">{{ t('Notes') }}</h4>
|
||||
|
|
|
@ -268,7 +268,7 @@ function deleteFile(dmsFk) {
|
|||
</VnRow>
|
||||
<VnRow>
|
||||
<VnSelect
|
||||
:label="t('InvoiceIn.summary.sage')"
|
||||
:label="t('invoicein.summary.sage')"
|
||||
v-model="data.withholdingSageFk"
|
||||
:options="sageWithholdings"
|
||||
option-value="id"
|
||||
|
|
|
@ -166,10 +166,10 @@ const createInvoiceInCorrection = async () => {
|
|||
<InvoiceInDescriptorMenu :invoice="entity" />
|
||||
</template>
|
||||
<template #body="{ entity }">
|
||||
<VnLv :label="t('invoiceIn.list.issued')" :value="toDate(entity.issued)" />
|
||||
<VnLv :label="t('invoiceIn.summary.booked')" :value="toDate(entity.booked)" />
|
||||
<VnLv :label="t('invoiceIn.list.amount')" :value="toCurrency(totalAmount)" />
|
||||
<VnLv :label="t('invoiceIn.list.supplier')">
|
||||
<VnLv :label="t('invoicein.list.issued')" :value="toDate(entity.issued)" />
|
||||
<VnLv :label="t('invoicein.summary.bookedDate')" :value="toDate(entity.booked)" />
|
||||
<VnLv :label="t('invoicein.list.amount')" :value="toCurrency(totalAmount)" />
|
||||
<VnLv :label="t('invoicein.list.supplier')">
|
||||
<template #value>
|
||||
<span class="link">
|
||||
{{ entity?.supplier?.nickname }}
|
||||
|
@ -186,7 +186,7 @@ const createInvoiceInCorrection = async () => {
|
|||
color="primary"
|
||||
:to="routes.getSupplier(entity.supplierFk)"
|
||||
>
|
||||
<QTooltip>{{ t('invoiceIn.list.supplier') }}</QTooltip>
|
||||
<QTooltip>{{ t('invoicein.list.supplier') }}</QTooltip>
|
||||
</QBtn>
|
||||
<QBtn
|
||||
size="md"
|
||||
|
@ -202,7 +202,7 @@ const createInvoiceInCorrection = async () => {
|
|||
color="primary"
|
||||
:to="routes.getTickets(entity.supplierFk)"
|
||||
>
|
||||
<QTooltip>{{ t('invoiceOut.card.ticketList') }}</QTooltip>
|
||||
<QTooltip>{{ t('InvoiceOut.card.ticketList') }}</QTooltip>
|
||||
</QBtn>
|
||||
<QBtn
|
||||
v-if="
|
||||
|
|
|
@ -33,15 +33,15 @@ const entityId = computed(() => $props.invoice.id || +currentRoute.value.params.
|
|||
const invoiceIn = computed(() => arrayData.store.data);
|
||||
const actions = {
|
||||
unbook: {
|
||||
title: t('assertAction', { action: t('InvoiceIn.descriptorMenu.unbook') }),
|
||||
title: t('assertAction', { action: t('invoicein.descriptorMenu.unbook') }),
|
||||
action: toUnbook,
|
||||
},
|
||||
delete: {
|
||||
title: t('assertAction', { action: t('InvoiceIn.descriptorMenu.delete') }),
|
||||
title: t('assertAction', { action: t('invoicein.descriptorMenu.delete') }),
|
||||
action: deleteInvoice,
|
||||
},
|
||||
clone: {
|
||||
title: t('assertAction', { action: t('InvoiceIn.descriptorMenu.clone') }),
|
||||
title: t('assertAction', { action: t('invoicein.descriptorMenu.clone') }),
|
||||
action: cloneInvoice,
|
||||
},
|
||||
showPdf: { cb: showPdfInvoice },
|
||||
|
@ -84,7 +84,7 @@ async function deleteInvoice() {
|
|||
await axios.delete(`InvoiceIns/${entityId.value}`);
|
||||
quasar.notify({
|
||||
type: 'positive',
|
||||
message: t('InvoiceIn.descriptorMenu.invoiceDeleted'),
|
||||
message: t('invoicein.descriptorMenu.invoiceDeleted'),
|
||||
});
|
||||
push({ path: '/invoice-in' });
|
||||
}
|
||||
|
@ -93,7 +93,7 @@ async function cloneInvoice() {
|
|||
const { data } = await axios.post(`InvoiceIns/${entityId.value}/clone`);
|
||||
quasar.notify({
|
||||
type: 'positive',
|
||||
message: t('InvoiceIn.descriptorMenu.invoiceCloned'),
|
||||
message: t('invoicein.descriptorMenu.invoiceCloned'),
|
||||
});
|
||||
push({ path: `/invoice-in/${data.id}/summary` });
|
||||
}
|
||||
|
@ -144,7 +144,7 @@ function sendPdfInvoice({ address }) {
|
|||
clickable
|
||||
@click="book(entityId)"
|
||||
>
|
||||
<QItemSection>{{ t('InvoiceIn.descriptorMenu.toBook') }}</QItemSection>
|
||||
<QItemSection>{{ t('invoicein.descriptorMenu.toBook') }}</QItemSection>
|
||||
</QItem>
|
||||
</template>
|
||||
</InvoiceInToBook>
|
||||
|
@ -155,28 +155,28 @@ function sendPdfInvoice({ address }) {
|
|||
@click="triggerMenu('unbook')"
|
||||
>
|
||||
<QItemSection>
|
||||
{{ t('InvoiceIn.descriptorMenu.toUnbook') }}
|
||||
{{ t('invoicein.descriptorMenu.toUnbook') }}
|
||||
</QItemSection>
|
||||
</QItem>
|
||||
<QItem
|
||||
v-if="canEditProp('deleteById')"
|
||||
v-ripple
|
||||
clickable
|
||||
@click="triggerMenu('InvoiceIn.descriptorMenu.delete')"
|
||||
@click="triggerMenu('invoicein.descriptorMenu.delete')"
|
||||
>
|
||||
<QItemSection>{{ t('InvoiceIn.descriptorMenu.deleteInvoice') }}</QItemSection>
|
||||
<QItemSection>{{ t('invoicein.descriptorMenu.deleteInvoice') }}</QItemSection>
|
||||
</QItem>
|
||||
<QItem v-if="canEditProp('clone')" v-ripple clickable @click="triggerMenu('clone')">
|
||||
<QItemSection>{{ t('InvoiceIn.descriptorMenu.cloneInvoice') }}</QItemSection>
|
||||
<QItemSection>{{ t('invoicein.descriptorMenu.cloneInvoice') }}</QItemSection>
|
||||
</QItem>
|
||||
<QItem v-if="isAgricultural()" v-ripple clickable @click="triggerMenu('showPdf')">
|
||||
<QItemSection>{{
|
||||
t('InvoiceIn.descriptorMenu.showAgriculturalPdf')
|
||||
t('invoicein.descriptorMenu.showAgriculturalPdf')
|
||||
}}</QItemSection>
|
||||
</QItem>
|
||||
<QItem v-if="isAgricultural()" v-ripple clickable @click="triggerMenu('sendPdf')">
|
||||
<QItemSection
|
||||
>{{ t('InvoiceIn.descriptorMenu.sendAgriculturalPdf') }}...</QItemSection
|
||||
>{{ t('invoicein.descriptorMenu.sendAgriculturalPdf') }}...</QItemSection
|
||||
>
|
||||
</QItem>
|
||||
<QItem
|
||||
|
@ -186,7 +186,7 @@ function sendPdfInvoice({ address }) {
|
|||
@click="triggerMenu('correct')"
|
||||
>
|
||||
<QItemSection
|
||||
>{{ t('InvoiceIn.descriptorMenu.createCorrective') }}...</QItemSection
|
||||
>{{ t('invoicein.descriptorMenu.createCorrective') }}...</QItemSection
|
||||
>
|
||||
</QItem>
|
||||
<QItem v-if="invoice.dmsFk" v-ripple clickable @click="downloadFile(invoice.dmsFk)">
|
||||
|
|
|
@ -27,14 +27,14 @@ const intrastatTotals = ref({ amount: 0, net: 0, stems: 0 });
|
|||
const vatColumns = ref([
|
||||
{
|
||||
name: 'expense',
|
||||
label: 'InvoiceIn.summary.expense',
|
||||
label: 'invoicein.summary.expense',
|
||||
field: (row) => row.expenseFk,
|
||||
sortable: true,
|
||||
align: 'left',
|
||||
},
|
||||
{
|
||||
name: 'landed',
|
||||
label: 'InvoiceIn.summary.taxableBase',
|
||||
label: 'invoicein.summary.taxableBase',
|
||||
field: (row) => row.taxableBase,
|
||||
format: (value) => toCurrency(value),
|
||||
sortable: true,
|
||||
|
@ -42,7 +42,7 @@ const vatColumns = ref([
|
|||
},
|
||||
{
|
||||
name: 'vat',
|
||||
label: 'InvoiceIn.summary.sageVat',
|
||||
label: 'invoicein.summary.sageVat',
|
||||
field: (row) => {
|
||||
if (row.taxTypeSage) return `#${row.taxTypeSage.id} : ${row.taxTypeSage.vat}`;
|
||||
},
|
||||
|
@ -52,7 +52,7 @@ const vatColumns = ref([
|
|||
},
|
||||
{
|
||||
name: 'transaction',
|
||||
label: 'InvoiceIn.summary.sageTransaction',
|
||||
label: 'invoicein.summary.sageTransaction',
|
||||
field: (row) => {
|
||||
if (row.transactionTypeSage)
|
||||
return `#${row.transactionTypeSage.id} : ${row.transactionTypeSage?.transaction}`;
|
||||
|
@ -63,7 +63,7 @@ const vatColumns = ref([
|
|||
},
|
||||
{
|
||||
name: 'rate',
|
||||
label: 'InvoiceIn.summary.rate',
|
||||
label: 'invoicein.summary.rate',
|
||||
field: (row) => taxRate(row.taxableBase, row.taxTypeSage?.rate),
|
||||
format: (value) => toCurrency(value),
|
||||
sortable: true,
|
||||
|
@ -71,7 +71,7 @@ const vatColumns = ref([
|
|||
},
|
||||
{
|
||||
name: 'currency',
|
||||
label: 'InvoiceIn.summary.currency',
|
||||
label: 'invoicein.summary.currency',
|
||||
field: (row) => row.foreignValue,
|
||||
format: (val) => val && toCurrency(val, currency.value),
|
||||
sortable: true,
|
||||
|
@ -82,21 +82,21 @@ const vatColumns = ref([
|
|||
const dueDayColumns = ref([
|
||||
{
|
||||
name: 'date',
|
||||
label: 'InvoiceIn.summary.dueDay',
|
||||
label: 'invoicein.summary.dueDay',
|
||||
field: (row) => toDate(row.dueDated),
|
||||
sortable: true,
|
||||
align: 'left',
|
||||
},
|
||||
{
|
||||
name: 'bank',
|
||||
label: 'InvoiceIn.summary.bank',
|
||||
label: 'invoicein.summary.bank',
|
||||
field: (row) => row.bank.bank,
|
||||
sortable: true,
|
||||
align: 'left',
|
||||
},
|
||||
{
|
||||
name: 'amount',
|
||||
label: 'InvoiceIn.list.amount',
|
||||
label: 'invoicein.list.amount',
|
||||
field: (row) => row.amount,
|
||||
format: (value) => toCurrency(value),
|
||||
sortable: true,
|
||||
|
@ -104,7 +104,7 @@ const dueDayColumns = ref([
|
|||
},
|
||||
{
|
||||
name: 'landed',
|
||||
label: 'InvoiceIn.summary.foreignValue',
|
||||
label: 'invoicein.summary.foreignValue',
|
||||
field: (row) => row.foreignValue,
|
||||
format: (val) => val && toCurrency(val, currency.value),
|
||||
sortable: true,
|
||||
|
@ -115,7 +115,7 @@ const dueDayColumns = ref([
|
|||
const intrastatColumns = ref([
|
||||
{
|
||||
name: 'code',
|
||||
label: 'InvoiceIn.summary.code',
|
||||
label: 'invoicein.summary.code',
|
||||
field: (row) => {
|
||||
return `${row.intrastat.id}: ${row.intrastat?.description}`;
|
||||
},
|
||||
|
@ -124,21 +124,21 @@ const intrastatColumns = ref([
|
|||
},
|
||||
{
|
||||
name: 'amount',
|
||||
label: 'InvoiceIn.list.amount',
|
||||
label: 'invoicein.list.amount',
|
||||
field: (row) => toCurrency(row.amount),
|
||||
sortable: true,
|
||||
align: 'left',
|
||||
},
|
||||
{
|
||||
name: 'net',
|
||||
label: 'InvoiceIn.summary.net',
|
||||
label: 'invoicein.summary.net',
|
||||
field: (row) => row.net,
|
||||
sortable: true,
|
||||
align: 'left',
|
||||
},
|
||||
{
|
||||
name: 'stems',
|
||||
label: 'InvoiceIn.summary.stems',
|
||||
label: 'invoicein.summary.stems',
|
||||
field: (row) => row.stems,
|
||||
format: (value) => value,
|
||||
sortable: true,
|
||||
|
@ -146,7 +146,7 @@ const intrastatColumns = ref([
|
|||
},
|
||||
{
|
||||
name: 'landed',
|
||||
label: 'InvoiceIn.summary.country',
|
||||
label: 'invoicein.summary.country',
|
||||
field: (row) => row.country?.code,
|
||||
format: (value) => value,
|
||||
sortable: true,
|
||||
|
@ -214,7 +214,7 @@ const getLink = (param) => `#/invoice-in/${entityId.value}/${param}`;
|
|||
/>
|
||||
</QCardSection>
|
||||
<VnLv
|
||||
:label="t('InvoiceIn.list.supplier')"
|
||||
:label="t('invoicein.list.supplier')"
|
||||
:value="entity.supplier?.name"
|
||||
>
|
||||
<template #value>
|
||||
|
@ -225,14 +225,14 @@ const getLink = (param) => `#/invoice-in/${entityId.value}/${param}`;
|
|||
</template>
|
||||
</VnLv>
|
||||
<VnLv
|
||||
:label="t('InvoiceIn.list.supplierRef')"
|
||||
:label="t('invoicein.list.supplierRef')"
|
||||
:value="entity.supplierRef"
|
||||
/>
|
||||
<VnLv
|
||||
:label="t('InvoiceIn.summary.currency')"
|
||||
:label="t('invoicein.summary.currency')"
|
||||
:value="entity.currency?.code"
|
||||
/>
|
||||
<VnLv :label="t('InvoiceIn.serial')" :value="`${entity.serial}`" />
|
||||
<VnLv :label="t('invoicein.serial')" :value="`${entity.serial}`" />
|
||||
<VnLv
|
||||
:label="t('globals.country')"
|
||||
:value="entity.supplier?.country?.code"
|
||||
|
@ -247,19 +247,19 @@ const getLink = (param) => `#/invoice-in/${entityId.value}/${param}`;
|
|||
</QCardSection>
|
||||
<VnLv
|
||||
:ellipsis-value="false"
|
||||
:label="t('InvoiceIn.summary.issued')"
|
||||
:label="t('invoicein.summary.issued')"
|
||||
:value="toDate(entity.issued)"
|
||||
/>
|
||||
<VnLv
|
||||
:label="t('InvoiceIn.summary.operated')"
|
||||
:label="t('invoicein.summary.operated')"
|
||||
:value="toDate(entity.operated)"
|
||||
/>
|
||||
<VnLv
|
||||
:label="t('InvoiceIn.summary.bookEntried')"
|
||||
:label="t('invoicein.summary.bookEntried')"
|
||||
:value="toDate(entity.bookEntried)"
|
||||
/>
|
||||
<VnLv
|
||||
:label="t('InvoiceIn.summary.bookedDate')"
|
||||
:label="t('invoicein.summary.bookedDate')"
|
||||
:value="toDate(entity.booked)"
|
||||
/>
|
||||
<VnLv :label="t('globals.isVies')" :value="entity.supplier?.isVies" />
|
||||
|
@ -272,18 +272,18 @@ const getLink = (param) => `#/invoice-in/${entityId.value}/${param}`;
|
|||
/>
|
||||
</QCardSection>
|
||||
<VnLv
|
||||
:label="t('InvoiceIn.summary.sage')"
|
||||
:label="t('invoicein.summary.sage')"
|
||||
:value="entity.sageWithholding?.withholding"
|
||||
/>
|
||||
<VnLv
|
||||
:label="t('InvoiceIn.summary.vat')"
|
||||
:label="t('invoicein.summary.vat')"
|
||||
:value="entity.expenseDeductible?.name"
|
||||
/>
|
||||
<VnLv
|
||||
:label="t('InvoiceIn.card.company')"
|
||||
:label="t('invoicein.card.company')"
|
||||
:value="entity.company?.code"
|
||||
/>
|
||||
<VnLv :label="t('InvoiceIn.isBooked')" :value="invoiceIn?.isBooked" />
|
||||
<VnLv :label="t('invoicein.isBooked')" :value="invoiceIn?.isBooked" />
|
||||
</QCard>
|
||||
<QCard class="vn-one">
|
||||
<QCardSection class="q-pa-none">
|
||||
|
@ -294,11 +294,11 @@ const getLink = (param) => `#/invoice-in/${entityId.value}/${param}`;
|
|||
</QCardSection>
|
||||
<QCardSection class="q-pa-none">
|
||||
<VnLv
|
||||
:label="t('InvoiceIn.summary.taxableBase')"
|
||||
:label="t('invoicein.summary.taxableBase')"
|
||||
:value="toCurrency(entity.totals.totalTaxableBase)"
|
||||
/>
|
||||
<VnLv label="Total" :value="toCurrency(entity.totals.totalVat)" />
|
||||
<VnLv :label="t('InvoiceIn.summary.dueTotal')">
|
||||
<VnLv :label="t('invoicein.summary.dueTotal')">
|
||||
<template #value>
|
||||
<QChip
|
||||
dense
|
||||
|
@ -306,8 +306,8 @@ const getLink = (param) => `#/invoice-in/${entityId.value}/${param}`;
|
|||
:color="amountsNotMatch ? 'negative' : 'transparent'"
|
||||
:title="
|
||||
amountsNotMatch
|
||||
? t('InvoiceIn.summary.noMatch')
|
||||
: t('InvoiceIn.summary.dueTotal')
|
||||
? t('invoicein.summary.noMatch')
|
||||
: t('invoicein.summary.dueTotal')
|
||||
"
|
||||
>
|
||||
{{ toCurrency(entity.totals.totalDueDay) }}
|
||||
|
@ -318,7 +318,7 @@ const getLink = (param) => `#/invoice-in/${entityId.value}/${param}`;
|
|||
</QCard>
|
||||
<!--Vat-->
|
||||
<QCard v-if="entity.invoiceInTax.length" class="vat">
|
||||
<VnTitle :url="getLink('vat')" :text="t('InvoiceIn.card.vat')" />
|
||||
<VnTitle :url="getLink('vat')" :text="t('invoicein.card.vat')" />
|
||||
<QTable
|
||||
:columns="vatColumns"
|
||||
:rows="entity.invoiceInTax"
|
||||
|
@ -366,7 +366,7 @@ const getLink = (param) => `#/invoice-in/${entityId.value}/${param}`;
|
|||
</QCard>
|
||||
<!--Due Day-->
|
||||
<QCard v-if="entity.invoiceInDueDay.length" class="due-day">
|
||||
<VnTitle :url="getLink('due-day')" :text="t('InvoiceIn.card.dueDay')" />
|
||||
<VnTitle :url="getLink('due-day')" :text="t('invoicein.card.dueDay')" />
|
||||
<QTable :columns="dueDayColumns" :rows="entity.invoiceInDueDay" flat>
|
||||
<template #header="dueDayProps">
|
||||
<QTr :props="dueDayProps" class="bg">
|
||||
|
@ -404,7 +404,7 @@ const getLink = (param) => `#/invoice-in/${entityId.value}/${param}`;
|
|||
<QCard v-if="entity.invoiceInIntrastat.length">
|
||||
<VnTitle
|
||||
:url="getLink('intrastat')"
|
||||
:text="t('InvoiceIn.card.intrastat')"
|
||||
:text="t('invoicein.card.intrastat')"
|
||||
/>
|
||||
<QTable
|
||||
:columns="intrastatColumns"
|
||||
|
|
|
@ -83,7 +83,7 @@ const redirectToInvoiceInBasicData = (__, { id }) => {
|
|||
</template>
|
||||
</VnSelect>
|
||||
<VnInput
|
||||
:label="t('InvoiceIn.list.supplierRef')"
|
||||
:label="t('invoicein.list.supplierRef')"
|
||||
v-model="data.supplierRef"
|
||||
/>
|
||||
</VnRow>
|
||||
|
@ -97,10 +97,10 @@ const redirectToInvoiceInBasicData = (__, { id }) => {
|
|||
map-options
|
||||
hide-selected
|
||||
:required="true"
|
||||
:rules="validate('InvoiceIn.companyFk')"
|
||||
:rules="validate('invoicein.companyFk')"
|
||||
/>
|
||||
<VnInputDate
|
||||
:label="t('InvoiceIn.summary.issued')"
|
||||
:label="t('invoicein.summary.issued')"
|
||||
v-model="data.issued"
|
||||
/>
|
||||
</VnRow>
|
||||
|
|
|
@ -164,7 +164,7 @@ function handleDaysAgo(params, daysAgo) {
|
|||
<QItem>
|
||||
<QItemSection>
|
||||
<QCheckbox
|
||||
:label="$t('InvoiceIn.isBooked')"
|
||||
:label="$t('invoicein.isBooked')"
|
||||
v-model="params.isBooked"
|
||||
@update:model-value="searchFn()"
|
||||
toggle-indeterminate
|
||||
|
|
|
@ -26,7 +26,7 @@ const cols = computed(() => [
|
|||
{
|
||||
align: 'left',
|
||||
name: 'isBooked',
|
||||
label: t('InvoiceIn.isBooked'),
|
||||
label: t('invoicein.isBooked'),
|
||||
columnFilter: false,
|
||||
},
|
||||
{
|
||||
|
@ -41,7 +41,7 @@ const cols = computed(() => [
|
|||
{
|
||||
align: 'left',
|
||||
name: 'supplierFk',
|
||||
label: t('InvoiceIn.list.supplier'),
|
||||
label: t('invoicein.list.supplier'),
|
||||
columnFilter: {
|
||||
component: 'select',
|
||||
attrs: {
|
||||
|
@ -55,16 +55,16 @@ const cols = computed(() => [
|
|||
{
|
||||
align: 'left',
|
||||
name: 'supplierRef',
|
||||
label: t('InvoiceIn.list.supplierRef'),
|
||||
label: t('invoicein.list.supplierRef'),
|
||||
},
|
||||
{
|
||||
align: 'left',
|
||||
name: 'serial',
|
||||
label: t('InvoiceIn.serial'),
|
||||
label: t('invoicein.serial'),
|
||||
},
|
||||
{
|
||||
align: 'left',
|
||||
label: t('InvoiceIn.list.issued'),
|
||||
label: t('invoicein.list.issued'),
|
||||
name: 'issued',
|
||||
component: null,
|
||||
columnFilter: {
|
||||
|
@ -74,7 +74,7 @@ const cols = computed(() => [
|
|||
},
|
||||
{
|
||||
align: 'left',
|
||||
label: t('InvoiceIn.list.dueDated'),
|
||||
label: t('invoicein.list.dueDated'),
|
||||
name: 'dueDated',
|
||||
component: null,
|
||||
columnFilter: {
|
||||
|
@ -86,12 +86,12 @@ const cols = computed(() => [
|
|||
{
|
||||
align: 'left',
|
||||
name: 'awbCode',
|
||||
label: t('InvoiceIn.list.awb'),
|
||||
label: t('invoicein.list.awb'),
|
||||
},
|
||||
{
|
||||
align: 'left',
|
||||
name: 'amount',
|
||||
label: t('InvoiceIn.list.amount'),
|
||||
label: t('invoicein.list.amount'),
|
||||
format: ({ amount }) => toCurrency(amount),
|
||||
cardVisible: true,
|
||||
},
|
||||
|
@ -182,7 +182,7 @@ const cols = computed(() => [
|
|||
</template>
|
||||
</VnSelect>
|
||||
<VnInput
|
||||
:label="t('InvoiceIn.list.supplierRef')"
|
||||
:label="t('invoicein.list.supplierRef')"
|
||||
v-model="data.supplierRef"
|
||||
/>
|
||||
<VnSelect
|
||||
|
@ -194,7 +194,7 @@ const cols = computed(() => [
|
|||
option-label="code"
|
||||
:required="true"
|
||||
/>
|
||||
<VnInputDate :label="t('InvoiceIn.summary.issued')" v-model="data.issued" />
|
||||
<VnInputDate :label="t('invoicein.summary.issued')" v-model="data.issued" />
|
||||
</template>
|
||||
</VnTable>
|
||||
</template>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
InvoiceIn:
|
||||
invoicein:
|
||||
serial: Serial
|
||||
isBooked: Is booked
|
||||
list:
|
||||
|
@ -66,7 +66,6 @@ InvoiceIn:
|
|||
search: Id or supplier name
|
||||
correctedFk: Corrected
|
||||
isBooked: Is booked
|
||||
invoicein:
|
||||
params:
|
||||
account: Ledger account
|
||||
correctingFk: Rectificative
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
InvoiceIn:
|
||||
invoicein:
|
||||
serial: Serie
|
||||
isBooked: Contabilizada
|
||||
list:
|
||||
|
@ -63,7 +63,6 @@ InvoiceIn:
|
|||
params:
|
||||
search: Id o nombre proveedor
|
||||
correctedFk: Rectificada
|
||||
invoicein:
|
||||
params:
|
||||
account: Cuenta contable
|
||||
correctingFk: Rectificativa
|
||||
|
||||
|
|
|
@ -355,7 +355,7 @@ watchEffect(selectedRows);
|
|||
<VnSelect
|
||||
url="InvoiceOutSerials"
|
||||
v-model="data.serial"
|
||||
:label="t('InvoiceIn.serial')"
|
||||
:label="t('invoicein.serial')"
|
||||
:options="invoiceOutSerialsOptions"
|
||||
option-label="description"
|
||||
option-value="code"
|
||||
|
|
|
@ -213,9 +213,9 @@ async function handleConfirm() {
|
|||
type: 'positive',
|
||||
});
|
||||
router.push({
|
||||
name: 'TicketList',
|
||||
name: 'TicketSale',
|
||||
query: {
|
||||
table: JSON.stringify({ clientFk: descriptorData.store.data.clientFk }),
|
||||
table: JSON.stringify({ id: route.params.id }),
|
||||
},
|
||||
});
|
||||
}
|
||||
|
|
|
@ -7,7 +7,14 @@ import useNotify from 'src/composables/useNotify.js';
|
|||
import axios from 'axios';
|
||||
|
||||
const { notify } = useNotify();
|
||||
|
||||
const initInvoicing = {
|
||||
invoicing: false,
|
||||
nRequests: 0,
|
||||
nPdfs: 0,
|
||||
totalPdfs: 0,
|
||||
addressIndex: 0,
|
||||
errors: [],
|
||||
};
|
||||
export const useInvoiceOutGlobalStore = defineStore({
|
||||
id: 'invoiceOutGlobal',
|
||||
state: () => ({
|
||||
|
@ -23,16 +30,11 @@ export const useInvoiceOutGlobalStore = defineStore({
|
|||
addresses: [],
|
||||
minInvoicingDate: null,
|
||||
parallelism: null,
|
||||
invoicing: false,
|
||||
isInvoicing: false,
|
||||
status: null,
|
||||
addressIndex: 0,
|
||||
errors: [],
|
||||
|
||||
printer: null,
|
||||
nRequests: 0,
|
||||
nPdfs: 0,
|
||||
totalPdfs: 0,
|
||||
formData: null,
|
||||
...initInvoicing,
|
||||
}),
|
||||
actions: {
|
||||
async init() {
|
||||
|
@ -117,12 +119,13 @@ export const useInvoiceOutGlobalStore = defineStore({
|
|||
);
|
||||
throw new Error("There aren't addresses to invoice");
|
||||
}
|
||||
this.invoicing = false;
|
||||
this.status = 'invoicing';
|
||||
this.formData = formData;
|
||||
this.addressIndex = 0;
|
||||
this.errors = [];
|
||||
await this.invoiceClient();
|
||||
this.status = 'invoicing';
|
||||
//reset data
|
||||
for (const key in initInvoicing) {
|
||||
this[key] = initInvoicing[key];
|
||||
}
|
||||
this.invoiceClient();
|
||||
} catch (err) {
|
||||
this.handleError(err);
|
||||
}
|
||||
|
@ -184,7 +187,6 @@ export const useInvoiceOutGlobalStore = defineStore({
|
|||
async invoiceClient() {
|
||||
if (this.invoicing || this.nRequests >= this.parallelism) return;
|
||||
const address = this.addresses[this.addressIndex];
|
||||
|
||||
if (!address || !this.status || this.status == 'stopping') {
|
||||
this.status = 'stopping';
|
||||
this.invoicing = false;
|
||||
|
@ -192,6 +194,7 @@ export const useInvoiceOutGlobalStore = defineStore({
|
|||
}
|
||||
try {
|
||||
this.invoicing = true;
|
||||
this.nRequests++;
|
||||
const params = {
|
||||
clientId: address.clientId,
|
||||
addressId: address.id,
|
||||
|
@ -215,6 +218,7 @@ export const useInvoiceOutGlobalStore = defineStore({
|
|||
}
|
||||
} finally {
|
||||
this.invoicing = false;
|
||||
this.nRequests--;
|
||||
this.addressIndex++;
|
||||
this.invoiceClient();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue