diff --git a/CHANGELOG.md b/CHANGELOG.md index 6908d764a..a7797f810 100644 --- a/CHANGELOG.md +++ b/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 🆕 diff --git a/src/boot/qformMixin.js b/src/boot/qformMixin.js index 187ca6dbc..97d80c670 100644 --- a/src/boot/qformMixin.js +++ b/src/boot/qformMixin.js @@ -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(); diff --git a/src/components/FormModel.vue b/src/components/FormModel.vue index ea1ea53f2..2e580257c 100644 --- a/src/components/FormModel.vue +++ b/src/components/FormModel.vue @@ -198,6 +198,7 @@ async function fetch() { } catch (e) { state.set(modelValue, {}); originalData.value = {}; + throw e; } } diff --git a/src/components/RegularizeStockForm.vue b/src/components/RegularizeStockForm.vue index 3cd18d1c8..91a2e5d39 100644 --- a/src/components/RegularizeStockForm.vue +++ b/src/components/RegularizeStockForm.vue @@ -44,7 +44,7 @@ const onDataSaved = (data) => { diff --git a/src/components/__tests__/FilterItemForm.spec.js b/src/components/__tests__/FilterItemForm.spec.js new file mode 100644 index 000000000..210d6bf02 --- /dev/null +++ b/src/components/__tests__/FilterItemForm.spec.js @@ -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]); + }); +}); \ No newline at end of file diff --git a/src/components/common/RightMenu.vue b/src/components/common/RightMenu.vue index 32dc2874d..9512d32d4 100644 --- a/src/components/common/RightMenu.vue +++ b/src/components/common/RightMenu.vue @@ -1,29 +1,17 @@ + + - - es: - Edit travel: Editar envío - Travel: Envíos - Purchase Spaces: Espacios de compra - Buyer: Comprador - Reserve: Reservado - Bought: Comprado - Date: Fecha - View more details: Ver más detalles - Reserve some space: Reservar espacio - This buyer has already made a reservation for this date: Este comprador ya ha hecho una reserva para esta fecha - diff --git a/src/pages/Entry/MyEntries.vue b/src/pages/Entry/MyEntries.vue index dbe05eb88..3f7566ae0 100644 --- a/src/pages/Entry/MyEntries.vue +++ b/src/pages/Entry/MyEntries.vue @@ -123,8 +123,8 @@ const printBuys = (rowId) => { { chip-locale="myEntries" /> - - - You can search by entry reference: Puedes buscar por referencia de la entrada - diff --git a/src/pages/Entry/locale/en.yml b/src/pages/Entry/locale/en.yml index 6e41566d0..ff83de0ab 100644 --- a/src/pages/Entry/locale/en.yml +++ b/src/pages/Entry/locale/en.yml @@ -1,8 +1,92 @@ -entryList: +entry: list: + newEntry: New entry + tableVisibleColumns: + created: Creation + supplierFk: Supplier + isBooked: Booked + isConfirmed: Confirmed + isOrdered: Ordered + companyFk: Company + travelFk: Travel + isExcludedFromAvailable: Inventory + invoiceAmount: Import inventoryEntry: Inventory entry + summary: + commission: Commission + currency: Currency + invoiceNumber: Invoice number + ordered: Ordered + booked: Booked + excludedFromAvailable: Inventory + travelReference: Reference + travelAgency: Agency + travelShipped: Shipped + travelDelivered: Delivered + travelLanded: Landed + travelReceived: Received + buys: Buys + stickers: Stickers + package: Package + packing: Pack. + grouping: Group. + buyingValue: Buying value + import: Import + pvp: PVP + basicData: + travel: Travel + currency: Currency + commission: Commission + observation: Observation + booked: Booked + excludedFromAvailable: Inventory + buys: + observations: Observations + packagingFk: Box + color: Color + printedStickers: Printed stickers + notes: + observationType: Observation type + latestBuys: + tableVisibleColumns: + image: Picture + itemFk: Item ID + weightByPiece: Weight/Piece + isActive: Active + family: Family + entryFk: Entry + freightValue: Freight value + comissionValue: Commission value + packageValue: Package value + isIgnored: Is ignored + price2: Grouping + price3: Packing + minPrice: Min + ektFk: Ekt + packingOut: Package out + landing: Landing + isExcludedFromAvailable: Es inventory + params: + toShipped: To + fromShipped: From + daysOnward: Days onward + daysAgo: Days ago + warehouseInFk: Warehouse in + search: Search entries + searchInfo: You can search by entry reference entryFilter: - filter: + params: + invoiceNumber: Invoice number + travelFk: Travel + companyFk: Company + currencyFk: Currency + supplierFk: Supplier + from: From + to: To + created: Created + isBooked: Booked + isConfirmed: Confirmed + isOrdered: Ordered search: General search reference: Reference myEntries: @@ -18,5 +102,18 @@ myEntries: daysOnward: Days onward daysAgo: Days ago downloadCsv: Download CSV + search: Search entries + searchInfo: You can search by entry reference +entryStockBought: + travel: Travel + editTravel: Edit travel + purchaseSpaces: Purchase spaces + buyer: Buyer + reserve: Reserve + bought: Bought + date: Date + viewMoreDetails: View more details + reserveSomeSpace: Reserve some space + thisBuyerHasReservationThisDate: This buyer has already made a reservation for this date wasteRecalc: recalcOk: The wastes were successfully recalculated diff --git a/src/pages/Entry/locale/es.yml b/src/pages/Entry/locale/es.yml index 7e627b09f..72072f6ab 100644 --- a/src/pages/Entry/locale/es.yml +++ b/src/pages/Entry/locale/es.yml @@ -1,11 +1,93 @@ -Search entries: Buscar entradas -You can search by entry reference: Puedes buscar por referencia de la entrada - -entryList: +entry: list: + newEntry: Nueva entrada + tableVisibleColumns: + created: Creación + supplierFk: Proveedor + isBooked: Asentado + isConfirmed: Confirmado + isOrdered: Pedida + companyFk: Empresa + travelFk: Envio + isExcludedFromAvailable: Inventario + invoiceAmount: Importe inventoryEntry: Es inventario + summary: + commission: Comisión + currency: Moneda + invoiceNumber: Núm. factura + ordered: Pedida + booked: Contabilizada + excludedFromAvailable: Inventario + travelReference: Referencia + travelAgency: Agencia + travelShipped: F. envio + travelWarehouseOut: Alm. salida + travelDelivered: Enviada + travelLanded: F. entrega + travelReceived: Recibida + buys: Compras + stickers: Etiquetas + package: Embalaje + packing: Pack. + grouping: Group. + buyingValue: Coste + import: Importe + pvp: PVP + basicData: + travel: Envío + currency: Moneda + observation: Observación + commission: Comisión + booked: Asentado + excludedFromAvailable: Inventario + buys: + observations: Observaciónes + packagingFk: Embalaje + color: Color + printedStickers: Etiquetas impresas + notes: + observationType: Tipo de observación + latestBuys: + tableVisibleColumns: + image: Foto + itemFk: Id Artículo + weightByPiece: Peso (gramos)/tallo + isActive: Activo + family: Familia + entryFk: Entrada + freightValue: Porte + comissionValue: Comisión + packageValue: Embalaje + isIgnored: Ignorado + price2: Grouping + price3: Packing + minPrice: Min + ektFk: Ekt + packingOut: Embalaje envíos + landing: Llegada + isExcludedFromAvailable: Es inventario + params: + toShipped: Hasta + fromShipped: Desde + warehouseInFk: Alm. entrada + daysOnward: Días adelante + daysAgo: Días atras + search: Buscar entradas + searchInfo: Puedes buscar por referencia de entrada entryFilter: - filter: + params: + invoiceNumber: Núm. factura + travelFk: Envío + companyFk: Empresa + currencyFk: Moneda + supplierFk: Proveedor + from: Desde + to: Hasta + created: Fecha creación + isBooked: Asentado + isConfirmed: Confirmado + isOrdered: Pedida search: Búsqueda general reference: Referencia myEntries: @@ -21,5 +103,18 @@ myEntries: daysOnward: Días adelante daysAgo: Días atras downloadCsv: Descargar CSV + search: Buscar entradas + searchInfo: Puedes buscar por referencia de la entrada +entryStockBought: + travel: Envío + editTravel: Editar envío + purchaseSpaces: Espacios de compra + buyer: Comprador + reserve: Reservado + bought: Comprado + date: Fecha + viewMoreDetails: Ver más detalles + reserveSomeSpace: Reservar espacio + thisBuyerHasReservationThisDate: Este comprador ya ha hecho una reserva para esta fecha wasteRecalc: recalcOk: Se han recalculado las mermas correctamente diff --git a/src/pages/InvoiceIn/Card/InvoiceInBasicData.vue b/src/pages/InvoiceIn/Card/InvoiceInBasicData.vue index 83b1aa25e..90aa50af7 100644 --- a/src/pages/InvoiceIn/Card/InvoiceInBasicData.vue +++ b/src/pages/InvoiceIn/Card/InvoiceInBasicData.vue @@ -268,7 +268,7 @@ function deleteFile(dmsFk) { -import { ref, reactive, computed, onBeforeMount, capitalize } from 'vue'; +import { ref, reactive, computed, onBeforeMount } from 'vue'; import { useRouter, onBeforeRouteUpdate } from 'vue-router'; import { useI18n } from 'vue-i18n'; -import { useQuasar } from 'quasar'; import axios from 'axios'; import { toCurrency, toDate } from 'src/filters'; -import { useAcl } from 'src/composables/useAcl'; -import { downloadFile } from 'src/composables/downloadFile'; -import { useArrayData } from 'src/composables/useArrayData'; -import { usePrintService } from 'composables/usePrintService'; import VnLv from 'src/components/ui/VnLv.vue'; import CardDescriptor from 'components/ui/CardDescriptor.vue'; import FetchData from 'src/components/FetchData.vue'; -import SendEmailDialog from 'components/common/SendEmailDialog.vue'; -import VnConfirm from 'src/components/ui/VnConfirm.vue'; import VnSelect from 'src/components/common/VnSelect.vue'; +import { useCapitalize } from 'src/composables/useCapitalize'; import SupplierDescriptorProxy from 'src/pages/Supplier/Card/SupplierDescriptorProxy.vue'; -import InvoiceInToBook from '../InvoiceInToBook.vue'; +import InvoiceInDescriptorMenu from './InvoiceInDescriptorMenu.vue'; const $props = defineProps({ id: { type: Number, default: null } }); - const { push, currentRoute } = useRouter(); - -const quasar = useQuasar(); -const { hasAny } = useAcl(); const { t } = useI18n(); -const { openReport, sendEmail } = usePrintService(); -const arrayData = useArrayData(); -const invoiceIn = computed(() => arrayData.store.data); const cardDescriptorRef = ref(); const correctionDialogRef = ref(); const entityId = computed(() => $props.id || +currentRoute.value.params.id); const totalAmount = ref(); -const currentAction = ref(); const config = ref(); const cplusRectificationTypes = ref([]); const siiTypeInvoiceIns = ref([]); const invoiceCorrectionTypes = ref([]); -const actions = { - unbook: { - title: t('assertAction', { action: t('unbook') }), - action: toUnbook, - }, - delete: { - title: t('assertAction', { action: t('delete') }), - action: deleteInvoice, - }, - clone: { - title: t('assertAction', { action: t('clone') }), - action: cloneInvoice, - }, - showPdf: { cb: showPdfInvoice }, - sendPdf: { cb: sendPdfInvoiceConfirmation }, - correct: { cb: () => correctionDialogRef.value.show() }, -}; + const filter = { include: [ { @@ -90,7 +60,7 @@ const routes = reactive({ return { name: 'InvoiceInList', query: { - table: JSON.stringify({ supplierFk: id }), + params: JSON.stringify({ supplierFk: id }), }, }; }, @@ -99,7 +69,7 @@ const routes = reactive({ return { name: 'InvoiceInList', query: { - table: JSON.stringify({ correctedFk: entityId.value }), + params: JSON.stringify({ correctedFk: entityId.value }), }, }; } @@ -118,21 +88,21 @@ const routes = reactive({ const correctionFormData = reactive({ invoiceReason: 2, invoiceType: 2, - invoiceClass: 8, + invoiceClass: 6, }); const isNotFilled = computed(() => Object.values(correctionFormData).includes(null)); onBeforeMount(async () => { await setInvoiceCorrection(entityId.value); const { data } = await axios.get(`InvoiceIns/${entityId.value}/getTotals`); - totalAmount.value = data.totalTaxableBase; + totalAmount.value = data.totalDueDay; }); onBeforeRouteUpdate(async (to, from) => { if (to.params.id !== from.params.id) { await setInvoiceCorrection(to.params.id); const { data } = await axios.get(`InvoiceIns/${to.params.id}/getTotals`); - totalAmount.value = data.totalTaxableBase; + totalAmount.value = data.totalDueDay; } }); @@ -153,94 +123,6 @@ async function setInvoiceCorrection(id) { ); } -function openDialog() { - quasar.dialog({ - component: VnConfirm, - componentProps: { - title: t(currentAction.value.title), - promise: currentAction.value.action, - }, - }); -} - -async function toUnbook() { - const { data } = await axios.post(`InvoiceIns/${entityId.value}/toUnbook`); - const { isLinked, bookEntry, accountingEntries } = data; - - const type = isLinked ? 'warning' : 'positive'; - const message = isLinked - ? t('isLinked', { bookEntry, accountingEntries }) - : t('isNotLinked', { bookEntry }); - - quasar.notify({ type, message }); - if (!isLinked) arrayData.store.data.isBooked = false; -} - -async function deleteInvoice() { - await axios.delete(`InvoiceIns/${entityId.value}`); - quasar.notify({ - type: 'positive', - message: t('Invoice deleted'), - }); - push({ path: '/invoice-in' }); -} - -async function cloneInvoice() { - const { data } = await axios.post(`InvoiceIns/${entityId.value}/clone`); - quasar.notify({ - type: 'positive', - message: t('Invoice cloned'), - }); - push({ path: `/invoice-in/${data.id}/summary` }); -} - -const canEditProp = (props) => - hasAny([{ model: 'InvoiceIn', props, accessType: 'WRITE' }]); - -const isAgricultural = () => { - if (!config.value) return false; - return ( - invoiceIn.value?.supplier?.sageFarmerWithholdingFk === - config?.value[0]?.sageWithholdingFk - ); -}; - -function showPdfInvoice() { - if (isAgricultural()) - openReport(`InvoiceIns/${entityId.value}/invoice-in-pdf`, null, '_blank'); -} - -function sendPdfInvoiceConfirmation() { - quasar.dialog({ - component: SendEmailDialog, - componentProps: { - data: { - address: invoiceIn.value.supplier.contacts[0].email, - }, - promise: sendPdfInvoice, - }, - }); -} - -function sendPdfInvoice({ address }) { - if (!address) - quasar.notify({ - type: 'negative', - message: t(`The email can't be empty`), - }); - else - return sendEmail(`InvoiceIns/${entityId.value}/invoice-in-email`, { - recipientId: invoiceIn.value.supplier.id, - recipient: address, - }); -} - -function triggerMenu(type) { - currentAction.value = actions[type]; - if (currentAction.value.cb) currentAction.value.cb(); - else openDialog(type); -} - const createInvoiceInCorrection = async () => { const { data: correctingId } = await axios.post( 'InvoiceIns/corrective', @@ -262,7 +144,7 @@ const createInvoiceInCorrection = async () => { auto-load /> { title="supplierRef" > + diff --git a/src/pages/InvoiceIn/locale/en.yml b/src/pages/InvoiceIn/locale/en.yml index 3723a0f05..94db50066 100644 --- a/src/pages/InvoiceIn/locale/en.yml +++ b/src/pages/InvoiceIn/locale/en.yml @@ -1,4 +1,4 @@ -InvoiceIn: +invoicein: serial: Serial isBooked: Is booked list: @@ -12,6 +12,26 @@ InvoiceIn: amount: Amount descriptor: ticketList: Ticket list + descriptorMenu: + book: Book + unbook: Unbook + delete: Delete + clone: Clone + toBook: To book + toUnbook: To unbook + deleteInvoice: Delete invoice + invoiceDeleted: invoice deleted + cloneInvoice: Clone invoice + invoiceCloned: Invoice cloned + showAgriculturalPdf: Show agricultural receipt as PDF + sendAgriculturalPdf: Send agricultural receipt as PDF + checkSendInvoice: Are you sure you want to send it? + sendPdfInvoice: Send PDF invoice + createCorrective: Create rectificative invoice + correctiveInvoice: Rectificative invoice + originalInvoice: Original invoice + entry: Entry + emailEmpty: The email can't be empty card: client: Client company: Company @@ -46,8 +66,6 @@ InvoiceIn: search: Id or supplier name correctedFk: Corrected isBooked: Is booked -invoicein: - params: account: Ledger account correctingFk: Rectificative \ No newline at end of file diff --git a/src/pages/InvoiceIn/locale/es.yml b/src/pages/InvoiceIn/locale/es.yml index 5637605f6..bcb9c0551 100644 --- a/src/pages/InvoiceIn/locale/es.yml +++ b/src/pages/InvoiceIn/locale/es.yml @@ -1,4 +1,4 @@ -InvoiceIn: +invoicein: serial: Serie isBooked: Contabilizada list: @@ -12,6 +12,26 @@ InvoiceIn: amount: Importe descriptor: ticketList: Listado de tickets + descriptorMenu: + book: Asentar + unbook: Desasentar + delete: Eliminar + clone: Clonar + toBook: Contabilizar + toUnbook: Descontabilizar + deleteInvoice: Eliminar factura + invoiceDeleted: Factura eliminada + cloneInvoice: Clonar factura + invoiceCloned: Factura clonada + showAgriculturalPdf: Ver recibo agrícola como PDF + sendAgriculturalPdf: Enviar recibo agrícola como PDF + checkSendInvoice: ¿Estás seguro que quieres enviarlo? + sendPdfInvoice: Enviar factura a PDF + createCorrective: Crear factura rectificativa + correctiveInvoice: Factura rectificativa + originalInvoice: Factura origen + entry: Entrada + emailEmpty: El email no puede estar vacío card: client: Cliente company: Empresa @@ -43,8 +63,6 @@ InvoiceIn: params: search: Id o nombre proveedor correctedFk: Rectificada -invoicein: - params: account: Cuenta contable correctingFk: Rectificativa - + diff --git a/src/pages/InvoiceOut/Card/InvoiceOutSummary.vue b/src/pages/InvoiceOut/Card/InvoiceOutSummary.vue index 81b3e7c41..3ceb447dd 100644 --- a/src/pages/InvoiceOut/Card/InvoiceOutSummary.vue +++ b/src/pages/InvoiceOut/Card/InvoiceOutSummary.vue @@ -10,6 +10,7 @@ import { getUrl } from 'src/composables/getUrl'; import TicketDescriptorProxy from 'src/pages/Ticket/Card/TicketDescriptorProxy.vue'; import CustomerDescriptorProxy from 'src/pages/Customer/Card/CustomerDescriptorProxy.vue'; import VnTitle from 'src/components/common/VnTitle.vue'; +import InvoiceOutDescriptorMenu from './InvoiceOutDescriptorMenu.vue'; onMounted(async () => { fetch(); @@ -113,6 +114,9 @@ const ticketsColumns = ref([ +