From 7a1eb9bec64815ff8187c0cc63dc148ebcfef8e1 Mon Sep 17 00:00:00 2001 From: jorgep Date: Tue, 11 Feb 2025 09:28:56 +0100 Subject: [PATCH 001/209] feat: refs #8277 add Entry Control page and update localization files --- src/i18n/locale/en.yml | 1 + src/i18n/locale/es.yml | 3 +- src/pages/Entry/EntryControl.vue | 146 +++++++++++++++++++++++++++++++ src/router/modules/entry.js | 26 +++--- 4 files changed, 164 insertions(+), 12 deletions(-) create mode 100644 src/pages/Entry/EntryControl.vue diff --git a/src/i18n/locale/en.yml b/src/i18n/locale/en.yml index d615eef4c..fe4a0c45d 100644 --- a/src/i18n/locale/en.yml +++ b/src/i18n/locale/en.yml @@ -334,6 +334,7 @@ globals: parking: Parking vehicleList: Vehicles vehicle: Vehicle + entryControl: Entry control unsavedPopup: title: Unsaved changes will be lost subtitle: Are you sure exit without saving? diff --git a/src/i18n/locale/es.yml b/src/i18n/locale/es.yml index a082ca88d..956f11e15 100644 --- a/src/i18n/locale/es.yml +++ b/src/i18n/locale/es.yml @@ -334,6 +334,7 @@ globals: parking: Parking vehicleList: Vehículos vehicle: Vehículo + entryControl: Control de entradas unsavedPopup: title: Los cambios que no haya guardado se perderán subtitle: ¿Seguro que quiere salir sin guardar? @@ -653,7 +654,7 @@ supplier: tableVisibleColumns: nif: NIF/CIF account: Cuenta - + summary: responsible: Responsable verified: Verificado diff --git a/src/pages/Entry/EntryControl.vue b/src/pages/Entry/EntryControl.vue new file mode 100644 index 000000000..6fff84539 --- /dev/null +++ b/src/pages/Entry/EntryControl.vue @@ -0,0 +1,146 @@ + + diff --git a/src/router/modules/entry.js b/src/router/modules/entry.js index f362c7653..5de296803 100644 --- a/src/router/modules/entry.js +++ b/src/router/modules/entry.js @@ -6,13 +6,7 @@ const entryCard = { component: () => import('src/pages/Entry/Card/EntryCard.vue'), redirect: { name: 'EntrySummary' }, meta: { - menu: [ - 'EntryBasicData', - 'EntryBuys', - 'EntryNotes', - 'EntryDms', - 'EntryLog', - ], + menu: ['EntryBasicData', 'EntryBuys', 'EntryNotes', 'EntryDms', 'EntryLog'], }, children: [ { @@ -91,7 +85,8 @@ export default { 'EntryLatestBuys', 'EntryStockBought', 'EntryWasteRecalc', - ] + 'EntryControl', + ], }, component: RouterView, redirect: { name: 'EntryMain' }, @@ -103,7 +98,7 @@ export default { redirect: { name: 'EntryIndexMain' }, children: [ { - path:'', + path: '', name: 'EntryIndexMain', redirect: { name: 'EntryList' }, component: () => import('src/pages/Entry/EntryList.vue'), @@ -127,7 +122,7 @@ export default { icon: 'add', }, component: () => import('src/pages/Entry/EntryCreate.vue'), - }, + }, { path: 'my', name: 'MyEntries', @@ -164,7 +159,16 @@ export default { }, component: () => import('src/pages/Entry/EntryWasteRecalc.vue'), }, + { + path: 'control', + name: 'EntryControl', + meta: { + title: 'entryControl', + icon: 'help', + }, + component: () => import('src/pages/Entry/EntryControl.vue'), + }, ], }, ], -}; \ No newline at end of file +}; From 8f0a4da245a4db78dba939ee19d40cda91898d38 Mon Sep 17 00:00:00 2001 From: jtubau Date: Tue, 11 Feb 2025 13:58:14 +0100 Subject: [PATCH 002/209] feat: refs #8422 add Vehicle DMS import functionality and routing --- .../Vehicle/Card/VehicleDmsImportForm.vue | 76 +++++++++++++++++++ src/pages/Route/Vehicle/VehicleDms.vue | 46 +++++++++++ src/router/modules/route.js | 14 +++- 3 files changed, 135 insertions(+), 1 deletion(-) create mode 100644 src/pages/Route/Vehicle/Card/VehicleDmsImportForm.vue create mode 100644 src/pages/Route/Vehicle/VehicleDms.vue diff --git a/src/pages/Route/Vehicle/Card/VehicleDmsImportForm.vue b/src/pages/Route/Vehicle/Card/VehicleDmsImportForm.vue new file mode 100644 index 000000000..1d17a38dc --- /dev/null +++ b/src/pages/Route/Vehicle/Card/VehicleDmsImportForm.vue @@ -0,0 +1,76 @@ + + + + + +es: + Select document id: Introduzca id de gestion documental + Document: Documento + The document indentifier can't be empty: El número de documento no puede estar vacío + diff --git a/src/pages/Route/Vehicle/VehicleDms.vue b/src/pages/Route/Vehicle/VehicleDms.vue new file mode 100644 index 000000000..f10575247 --- /dev/null +++ b/src/pages/Route/Vehicle/VehicleDms.vue @@ -0,0 +1,46 @@ + + + + +es: + Import from existing: Importar desde existente + diff --git a/src/router/modules/route.js b/src/router/modules/route.js index 835324d20..e8e6c1f31 100644 --- a/src/router/modules/route.js +++ b/src/router/modules/route.js @@ -166,7 +166,10 @@ const vehicleCard = { component: () => import('src/pages/Route/Vehicle/Card/VehicleCard.vue'), redirect: { name: 'VehicleSummary' }, meta: { - menu: ['VehicleBasicData'], + menu: [ + 'VehicleBasicData', + 'VehicleDms', + ], }, children: [ { @@ -187,6 +190,15 @@ const vehicleCard = { }, component: () => import('src/pages/Route/Vehicle/Card/VehicleBasicData.vue'), }, + { + name: 'VehicleDms', + path: 'dms', + meta: { + title: 'dms', + icon: 'cloud_upload', + }, + component: () => import('src/pages/Route/Vehicle/VehicleDms.vue'), + }, ], }; From fa7705d2fc8fb8b1420e5d3d0718b2e7e9ab3db0 Mon Sep 17 00:00:00 2001 From: jorgep Date: Wed, 12 Feb 2025 09:53:43 +0100 Subject: [PATCH 003/209] feat: refs #8277 add control labels and update column definitions in EntryControl component --- src/pages/Entry/EntryControl.vue | 112 ++++++++++++++++--------------- src/pages/Entry/locale/en.yml | 16 +++++ src/pages/Entry/locale/es.yml | 16 +++++ 3 files changed, 91 insertions(+), 53 deletions(-) diff --git a/src/pages/Entry/EntryControl.vue b/src/pages/Entry/EntryControl.vue index 6fff84539..49ded3186 100644 --- a/src/pages/Entry/EntryControl.vue +++ b/src/pages/Entry/EntryControl.vue @@ -9,6 +9,53 @@ const { t } = useI18n(); const companies = ref([]); const countries = ref([]); const columns = computed(() => [ + { + name: 'companyFk', + label: t('globals.company'), + columnFilter: { + component: 'select', + name: 'companyFk', + optionLabel: 'code', + options: companies.value, + }, + }, + { + name: 'gestDocFk', + label: t('entry.control.gestDocFk'), + }, + { + name: 'dmsType', + label: t('entry.control.dmsType'), + format: (row) => row.dmsType, + }, + { + name: 'invoiceNumber', + label: t('entry.control.invoiceNumber'), + }, + { + name: 'reference', + label: t('entry.control.reference'), + }, + { + name: 'shipped', + label: t('entry.control.shipped'), + }, + { + name: 'dated', + label: t('entry.control.dated'), + }, + { + name: 'id', + label: t('entry.control.id'), + isId: true, + chip: { + condition: () => true, + }, + }, + { + name: 'invoiceInFk', + label: t('entry.control.invoiceInFk'), + }, { name: 'supplierFk', label: t('globals.supplier'), @@ -20,52 +67,6 @@ const columns = computed(() => [ url: 'Suppliers', }, }, - { - name: 'companyFk', - label: t('globals.company'), - columnFilter: { - component: 'select', - name: 'companyFk', - options: companies.value, - }, - }, - { - name: 'gestDocFk', - label: t('entry.gestDocFk'), - }, - { - name: 'dmsType', - label: t('entry.dmsType'), - format: (row) => row.dmsType, - }, - { - name: 'invoiceNumber', - label: t('entry.invoiceNumber'), - }, - { - name: 'reference', - label: t('entry.reference'), - }, - { - name: 'shipped', - label: t('entry.shipped'), - }, - { - name: 'dated', - label: t('entry.dated'), - }, - { - name: 'id', - label: t('entry.id'), - isId: true, - chip: { - condition: () => true, - }, - }, - { - name: 'invoiceInFk', - label: t('entry.invoiceInFk'), - }, { name: 'country', label: t('globals.country'), @@ -82,7 +83,7 @@ const columns = computed(() => [ }, { name: 'payDem', - label: t('entry.payDem'), + label: t('entry.control.payDem'), }, { name: 'amount', @@ -90,11 +91,12 @@ const columns = computed(() => [ }, { name: 'isBooked', - label: t('entry.isBooked'), + label: t('entry.control.isBooked'), }, { name: 'received', - label: t('entry.received'), + label: t('entry.control.received'), + component: 'checkbox' }, // { // name: 'travelFk', @@ -127,13 +129,13 @@ const columns = computed(() => [ [ :columns auto-load :right-search="false" - /> + > + + diff --git a/src/pages/Entry/locale/en.yml b/src/pages/Entry/locale/en.yml index 80f3491a8..6ed918126 100644 --- a/src/pages/Entry/locale/en.yml +++ b/src/pages/Entry/locale/en.yml @@ -78,6 +78,22 @@ entry: searchInfo: You can search by entry reference descriptorMenu: showEntryReport: Show entry report + control: + gestDocFk: Gestdoc + dmsType: Gestdoc type + invoiceNumber: Entry ref. + reference: Gestdoc ref. + shipped: Shipped + dated: Landed + id: Entry + invoiceInFk: Invoice in + supplierFk: Supplier + country: Country + description: Entry type + payDem: Payment term + amount: Amount + isBooked: B + received: R entryFilter: params: invoiceNumber: Invoice number diff --git a/src/pages/Entry/locale/es.yml b/src/pages/Entry/locale/es.yml index a5b968016..3f9a4b8c2 100644 --- a/src/pages/Entry/locale/es.yml +++ b/src/pages/Entry/locale/es.yml @@ -79,6 +79,22 @@ entry: showEntryReport: Ver informe del pedido search: Buscar entradas searchInfo: Puedes buscar por referencia de entrada + control: + gestDocFk: Gestdoc + dmsType: Tipo gestdoc + invoiceNumber: Ref. Entrada + reference: Ref. gestdoc + shipped: F. envío + dated: F. llegada + id: Entrada + invoiceInFk: Recibida + supplierFk: Proveedor + country: País + description: Tipo de Entrada + payDem: Plazo de pago + amount: Importe + isBooked: C + received: R entryFilter: params: invoiceNumber: Núm. factura From 1facb04d7a6c84032ebf6b348450bce14d758900 Mon Sep 17 00:00:00 2001 From: jorgep Date: Wed, 12 Feb 2025 18:24:41 +0100 Subject: [PATCH 004/209] feat: refs #8277 update EntryControl component with new column definitions and filters --- src/pages/Entry/EntryControl.vue | 42 +++++++++++++++++++++++--------- src/pages/Entry/locale/en.yml | 5 ++-- src/pages/Entry/locale/es.yml | 5 ++-- 3 files changed, 34 insertions(+), 18 deletions(-) diff --git a/src/pages/Entry/EntryControl.vue b/src/pages/Entry/EntryControl.vue index 49ded3186..9354f8b20 100644 --- a/src/pages/Entry/EntryControl.vue +++ b/src/pages/Entry/EntryControl.vue @@ -2,6 +2,7 @@ import { ref, computed, markRaw } from 'vue'; import VnTable from 'src/components/VnTable/VnTable.vue'; import { useI18n } from 'vue-i18n'; +import { toDate, toCurrency } from 'src/filters'; import FetchData from 'src/components/FetchData.vue'; import VnSelectSupplier from 'src/components/common/VnSelectSupplier.vue'; @@ -10,7 +11,7 @@ const companies = ref([]); const countries = ref([]); const columns = computed(() => [ { - name: 'companyFk', + name: 'company', label: t('globals.company'), columnFilter: { component: 'select', @@ -26,7 +27,13 @@ const columns = computed(() => [ { name: 'dmsType', label: t('entry.control.dmsType'), - format: (row) => row.dmsType, + columnFilter: { + component: 'select', + label: null, + name: 'dmsType', + url: 'DmsTypes', + fields: ['id', 'name'], + }, }, { name: 'invoiceNumber', @@ -39,10 +46,20 @@ const columns = computed(() => [ { name: 'shipped', label: t('entry.control.shipped'), + format: ({ shipped }, dashIfEmpty) => dashIfEmpty(toDate(shipped)), + columnFilter: { + component: 'date', + name: 'shipped', + }, }, { - name: 'dated', - label: t('entry.control.dated'), + name: 'landed', + label: t('entry.control.landed'), + format: ({ landed }, dashIfEmpty) => dashIfEmpty(toDate(landed)), + columnFilter: { + component: 'date', + name: 'landed', + }, }, { name: 'id', @@ -57,9 +74,9 @@ const columns = computed(() => [ label: t('entry.control.invoiceInFk'), }, { - name: 'supplierFk', + name: 'supplier', label: t('globals.supplier'), - format: (row) => row.supplierFk, + format: (row) => row.supplier, columnFilter: { component: markRaw(VnSelectSupplier), label: null, @@ -70,7 +87,6 @@ const columns = computed(() => [ { name: 'country', label: t('globals.country'), - format: (row) => row.country, columnFilter: { component: 'select', name: 'country', @@ -87,16 +103,18 @@ const columns = computed(() => [ }, { name: 'amount', - label: t('amount'), + label: t('globals.amount'), + format: ({ amount }) => toCurrency(amount), }, { name: 'isBooked', label: t('entry.control.isBooked'), + component: 'checkbox', }, { name: 'received', label: t('entry.control.received'), - component: 'checkbox' + component: 'checkbox', }, // { // name: 'travelFk', @@ -144,9 +162,9 @@ const columns = computed(() => [ :columns auto-load :right-search="false" + :disable-option="{ card: true }" + redirect="Entry" + :order="['landed DESC']" > - diff --git a/src/pages/Entry/locale/en.yml b/src/pages/Entry/locale/en.yml index 119b06c37..bd7c4d002 100644 --- a/src/pages/Entry/locale/en.yml +++ b/src/pages/Entry/locale/en.yml @@ -136,15 +136,14 @@ entry: dmsType: Gestdoc type invoiceNumber: Entry ref. reference: Gestdoc ref. - shipped: Shipped - dated: Landed + shipped: Shipped + landed: Landed id: Entry invoiceInFk: Invoice in supplierFk: Supplier country: Country description: Entry type payDem: Payment term - amount: Amount isBooked: B received: R entryFilter: diff --git a/src/pages/Entry/locale/es.yml b/src/pages/Entry/locale/es.yml index 2519ad726..1c19df4c9 100644 --- a/src/pages/Entry/locale/es.yml +++ b/src/pages/Entry/locale/es.yml @@ -92,16 +92,15 @@ entry: gestDocFk: Gestdoc dmsType: Tipo gestdoc invoiceNumber: Ref. Entrada - reference: Ref. gestdoc + reference: Ref. GestDoc shipped: F. envío - dated: F. llegada + landed: F. llegada id: Entrada invoiceInFk: Recibida supplierFk: Proveedor country: País description: Tipo de Entrada payDem: Plazo de pago - amount: Importe isBooked: C received: R params: From 55841d795f643bbc712d49e64e59a4766fa2064d Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Fri, 14 Feb 2025 01:41:06 +0100 Subject: [PATCH 005/209] test: init e2e_monitorTicket --- cypress.config.js | 1 - src/components/VnTable/VnTable.vue | 2 + src/pages/Item/components/ItemProposal.vue | 8 +- .../integration/monitor/monitorTicket.spec.js | 210 ++++++++++++++++++ test/cypress/support/commands.js | 13 ++ 5 files changed, 231 insertions(+), 3 deletions(-) create mode 100644 test/cypress/integration/monitor/monitorTicket.spec.js diff --git a/cypress.config.js b/cypress.config.js index a9e27fcfd..f43bd0dec 100644 --- a/cypress.config.js +++ b/cypress.config.js @@ -15,7 +15,6 @@ export default defineConfig({ video: false, specPattern: 'test/cypress/integration/**/*.spec.js', experimentalRunAllSpecs: false, - watchForFileChanges: false, reporter: 'cypress-mochawesome-reporter', reporterOptions: { charts: true, diff --git a/src/components/VnTable/VnTable.vue b/src/components/VnTable/VnTable.vue index 7e0757f6c..2e57c9cd7 100644 --- a/src/components/VnTable/VnTable.vue +++ b/src/components/VnTable/VnTable.vue @@ -614,6 +614,7 @@ const checkbox = ref(null); /> + { + beforeEach(() => { + cy.login('developer'); + cy.viewport(1920, 720); + cy.visit('/#/monitor/tickets'); + cy.domContentLoad(); + cy.waitForElement('.q-page'); + cy.intercept('GET', '**/SalesMonitors/salesFilter*').as('filterRequest'); + cy.openFilterPanel(); + }); + + it('should filter by column headers and update URL params', () => { + // Interceptar las llamadas de filtrado + cy.intercept('GET', '**/SalesMonitors/salesFilter*').as('filterRequest'); + + // Array de pruebas para diferentes columnas + const testCases = [ + // { + // columnName: 'id', + // value: '123', + // expectedParam: { id: '123' }, + // }, + { + columnName: 'clientFk', + value: 'cave', + expectedParam: { clientFk: { like: '%cave%' } }, + }, + // { + // columnName: 'packing', + // value: 'H', + // expectedParam: { packing: 'H' }, + // }, + ]; + + // Probar cada columna + // testCases.forEach(({ columnName, value, expectedParam }) => { + // // Encontrar el input del filtro y escribir el valor + // cy.get(`[data-cy="column-filter-${columnName}"]`) + // .click() + // .type(`${value}{enter}`); + + // Verificar que la URL se actualizó con el parámetro + // cy.url().should('include', encodeURIComponent(JSON.stringify(expectedParam))); + + // Verificar que la petición HTTP incluye el parámetro correcto + // cy.wait('@filterRequest').then((interception) => { + // expect(interception.request.url).to.include( + // encodeURIComponent(JSON.stringify(expectedParam)), + // ); + // }); + + // Limpiar el filtro para la siguiente prueba + // cy.get(`[data-cy="column-filter-${columnName}"]`).clear(); + // }); + /* ==== Generated with Cypress Studio ==== */ cy.get( + '[data-cy="column-filter-id"] > [data-v-532139db=""] > .column > [dense="true"] > .q-field > .q-field__inner > .q-field__control > .q-field__control-container > [data-cy="_input"]', + ).type('13'); + cy.get( + '[data-cy="column-filter-id"] > [data-v-532139db=""] > .column > [dense="true"] > .q-field > .q-field__inner > .q-field__control > .q-field__append > .q-icon', + ).click(); + // cy.get( + // '[data-cy="column-filter-clientFk"] > [data-v-532139db=""] > .column > .q-field > .q-field__inner > .q-field__control > .q-field__control-container > .q-field__native > [data-cy="_select"]', + // ).clear('cave{enter}'); + // cy.get( + // '[data-cy="column-filter-clientFk"] > [data-v-532139db=""] > .column > .q-field > .q-field__inner > .q-field__control > .q-field__control-container > .q-field__native > [data-cy="_select"]', + // ).type('cave{enter}'); + // cy.get( + // '[data-cy="column-filter-clientFk"] > [data-v-532139db=""] > .column > .q-field > .q-field__inner > .q-field__control > .q-field__control-container > .q-field__native > [data-cy="_select"]', + // ).clear('c'); + // cy.get( + // '[data-cy="column-filter-clientFk"] > [data-v-532139db=""] > .column > .q-field > .q-field__inner > .q-field__control > .q-field__control-container > .q-field__native > [data-cy="_select"]', + // ).type('Bar'); + // cy.get( + // '[data-cy="column-filter-clientFk"] > [data-v-532139db=""] > .column > .q-field > .q-field__inner > .q-field__control > .q-field__control-container > .q-field__native > [data-cy="_select"]', + // ).clear('Ba'); + cy.dataCy('vnTable_filter_btn').click(); + cy.get( + '[data-cy="column-filter-clientFk"] > [data-v-532139db=""] > .column > .q-field > .q-field__inner > .q-field__control > .q-field__control-container > .q-field__native > [data-cy="_select"]', + { timeout: 3000 }, + ).type('1101', { timeout: 3000, force: true }); + cy.get('[role="listbox"]') + .find('.q-item') + .find('.q-item__label') + .contains('Bruce Wayne') + .click(); + + cy.get( + '[data-cy="column-filter-clientFk"] > [data-v-532139db=""] > .column > .q-field > .q-field__inner > .q-field__control > :nth-child(2) > .q-icon', + ).click(); + cy.get( + '[data-cy="column-filter-id"] > [data-v-532139db=""] > .column > [dense="true"] > .q-field > .q-field__inner > .q-field__control > .q-field__control-container > [data-cy="_input"]', + ).clear('1'); + + /* ==== End Cypress Studio ==== */ + /* ==== Generated with Cypress Studio ==== */ + cy.get( + '[data-cy="column-filter-clientFk"] > [data-v-532139db=""] > .column > .q-field > .q-field__inner > .q-field__control > .q-field__control-container > .q-field__native > [data-cy="_select"]', + ).clear('1'); + cy.get( + '[data-cy="column-filter-clientFk"] > [data-v-532139db=""] > .column > .q-field > .q-field__inner > .q-field__control > .q-field__control-container > .q-field__native > [data-cy="_select"]', + { timeout: 3000 }, + ).type('1101'); + cy.get('.q-item__label--caption').click(); + cy.get( + '[data-cy="column-filter-salesPersonFk"] > [data-v-532139db=""] > .column > .q-field > .q-field__inner > .q-field__control > .q-field__control-container > .q-field__native > [data-cy="_select"]', + ).click(); + cy.get( + '#f_0ab28e51-61ef-42fd-98cf-5c145672132a_1 > .q-item__section > :nth-child(1)', + ).click(); + cy.get( + '[data-cy="column-filter-provinceFk"] > [data-v-532139db=""] > .column > .q-field > .q-field__inner > .q-field__control > .q-field__control-container > .q-field__native > [data-cy="_select"]', + ).click(); + cy.get('#f_7e2e6ebc-5a8e-40e6-a436-b301a249090e_2 > .q-item__section').click(); + cy.get( + '[data-cy="column-filter-state"] > [data-v-532139db=""] > .column > .q-field > .q-field__inner > .q-field__control > .q-field__control-container > .q-field__native > [data-cy="_select"]', + ).click(); + cy.get('.q-table__top').click(); + cy.get( + '[data-cy="column-filter-state"] > [data-v-532139db=""] > .column > .q-field > .q-field__inner > .q-field__control > .q-field__control-container > .q-field__native > [data-cy="_select"]', + ).click(); + cy.get( + '#f_e05db3bc-1bae-4398-8e06-a9395e8f9e30_13 > .q-item__section > :nth-child(1)', + ).click(); + cy.get('.q-ml-sm > .q-btn__content > .q-icon').click(); + /* ==== End Cypress Studio ==== */ + }); + + it.only('should filter by filter panel', () => { + // Client id - clientFk + cy.get('[data-cy="Client id_input"]').type('1101'); + cy.searchInFilterPanel(); + requestParams('clientFk', '1101'); + countRows('eq', 7); + + // order id + cy.get('[data-cy="Order id_input"]').type(7); + cy.searchInFilterPanel(); + requestParams('orderFk', '7'); + countRows('eq', 1); + + // Scope days + cy.get('[data-cy="Days onward_input"]').type(2); + cy.searchInFilterPanel(); + requestParams('scopeDays', '2'); + countRows('eq', 1); + + // SalesPerson + cy.get('[data-cy="vnWorkerSelect"]').click(); + cy.get('.q-item__label').contains('salesPersonNick').click(); + cy.searchInFilterPanel(); + requestParams('c.salesPersonFk', 18, { inWhere: true }); + countRows('eq', 1); + + cy.get('.q-mt-xs > .q-item__section--side').click(); + requestParams(null); + // Nickname + cy.get('[data-cy="Nickname_input"]').type('test'); + cy.searchInFilterPanel(); + requestParams('t.nickname', 'test', { inWhere: true, like: true }); + countRows('eq', 2); + + // cy.get('#f_d6f1f8d4-40b7-4e67-a7bb-5f309fe079b8_1 > .q-item__section > .q-item__label--caption').click(); + cy.get( + '.q-scrollarea__content > .q-btn--standard > .q-btn__content > .q-icon', + ).click(); + /* ==== End Cypress Studio ==== */ + }); +}); +function requestParams(key, value, options = { inWhere: false, like: false }) { + // cy.wait(2000); + cy.wait('@filterRequest').then((interception) => { + if (!key) return; + const { query } = interception.request; + cy.log('Request query:', query, options); + if (!options.inWhere) + // Verificamos que existe la propiedad clientFk y su valor + expect(query).to.have.property(key, value); + else { + // Verificamos que existe la propiedad where y dentro de ella la propiedad clientFk y su valor + const filter = JSON.parse(query.filter); + if (options.like) + expect(filter.where).to.have.deep.property(key, { + like: `%${value}%`, + }); + else { + expect(filter).to.have.property('where'); + expect(filter.where).to.have.property(key, value); + } + } + // Verificación adicional del formato completo si es necesario + // expect(interception.request.query).to.deep.include({ + // filter: expect.any(String), + // from: expect.any(String), + // to: expect.any(String), + // scopeDays: expect.any(String), + // }); + }); +} +function countRows(operator = 'gt', value = 0) { + // Obtener el último data-row-index para saber el total de filas + cy.get('td[data-row-index]') + .last() + .invoke('attr', 'data-row-index') + .then((lastIndex) => { + const totalRows = parseInt(lastIndex) + 1; // Sumamos 1 porque el índice empieza en 0 + cy.log(`Total de filas: ${totalRows}`); + expect(totalRows).to.be[operator](value); + // expect(totalRows).to.be.gt(0); + }); +} diff --git a/test/cypress/support/commands.js b/test/cypress/support/commands.js index aa4a1219e..f9e4258a0 100755 --- a/test/cypress/support/commands.js +++ b/test/cypress/support/commands.js @@ -286,6 +286,19 @@ Cypress.Commands.add('openRightMenu', (element) => { cy.get('[data-cy="toggle-right-drawer"]').click(); }); +Cypress.Commands.add('searchInFilterPanel', () => { + const element = + '.q-scrollarea__content > .q-btn--standard > .q-btn__content > .q-icon'; + if (element) cy.waitForElement(element); + cy.get(element).click(); + cy.wait(1000); +}); + +Cypress.Commands.add('openFilterPanel', () => { + const element = 'vnTable_filter_btn'; + if (element) cy.waitForElement(`[data-cy="${element}"]`); + cy.dataCy(element).click(); +}); Cypress.Commands.add('openLeftMenu', (element) => { if (element) cy.waitForElement(element); cy.get('.q-toolbar > .q-btn--round.q-btn--dense > .q-btn__content > .q-icon').click(); From a7d271bafd11c5bb4de9a8f10ad41663e08fa04a Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Fri, 14 Feb 2025 01:53:39 +0100 Subject: [PATCH 006/209] test: add describe for each test --- src/components/ui/VnFilterPanel.vue | 2 + .../integration/monitor/monitorTicket.spec.js | 180 +++++++++++++----- test/cypress/support/commands.js | 13 +- 3 files changed, 147 insertions(+), 48 deletions(-) diff --git a/src/components/ui/VnFilterPanel.vue b/src/components/ui/VnFilterPanel.vue index d6b525dc8..586feed90 100644 --- a/src/components/ui/VnFilterPanel.vue +++ b/src/components/ui/VnFilterPanel.vue @@ -207,6 +207,7 @@ const getLocale = (label) => { color="primary" style="position: fixed; z-index: 1; right: 0; bottom: 0" icon="search" + data-cy="search" @click="search()" > @@ -224,6 +225,7 @@ const getLocale = (label) => { { cy.get('.q-ml-sm > .q-btn__content > .q-icon').click(); /* ==== End Cypress Studio ==== */ }); + describe('should filter by filter panel', () => { + it('clientFk', () => { + // Client id - clientFk + cy.get('[data-cy="Client id_input"]').type('1101'); + cy.searchInFilterPanel(); + requestParams('clientFk', '1101'); + countRows('eq', 7); + }); - it.only('should filter by filter panel', () => { - // Client id - clientFk - cy.get('[data-cy="Client id_input"]').type('1101'); - cy.searchInFilterPanel(); - requestParams('clientFk', '1101'); - countRows('eq', 7); + it('orderFk', () => { + // order id + cy.get('[data-cy="Order id_input"]').type(7); + cy.searchInFilterPanel(); + requestParams('orderFk', '7'); + countRows('eq', 1); + }); - // order id - cy.get('[data-cy="Order id_input"]').type(7); - cy.searchInFilterPanel(); - requestParams('orderFk', '7'); - countRows('eq', 1); + it('scopeDays', () => { + // Scope days + cy.get('[data-cy="Days onward_input"]').type(2); + cy.searchInFilterPanel(); + requestParams('scopeDays', '2'); + countRows('eq', 27); + }); - // Scope days - cy.get('[data-cy="Days onward_input"]').type(2); - cy.searchInFilterPanel(); - requestParams('scopeDays', '2'); - countRows('eq', 1); + it('salesPersonFk', () => { + // SalesPerson + cy.get('[data-cy="vnWorkerSelect"]').click(); + cy.get('.q-item__label').contains('salesPersonNick').click(); + cy.searchInFilterPanel(); + requestParams('c.salesPersonFk', 18, { inWhere: true }); + countRows('eq', 21); + }); - // SalesPerson - cy.get('[data-cy="vnWorkerSelect"]').click(); - cy.get('.q-item__label').contains('salesPersonNick').click(); - cy.searchInFilterPanel(); - requestParams('c.salesPersonFk', 18, { inWhere: true }); - countRows('eq', 1); + // it('', () => { + // cy.get('.q-mt-xs > .q-item__section--side').click(); + // requestParams(null); + // }); - cy.get('.q-mt-xs > .q-item__section--side').click(); - requestParams(null); - // Nickname - cy.get('[data-cy="Nickname_input"]').type('test'); - cy.searchInFilterPanel(); - requestParams('t.nickname', 'test', { inWhere: true, like: true }); - countRows('eq', 2); + it('nickname', () => { + // Nickname + cy.get('[data-cy="Nickname_input"]').type('test'); + cy.searchInFilterPanel(); + requestParams('t.nickname', 'test', { inWhere: true, like: true }); + countRows('eq', 2); + }); - // cy.get('#f_d6f1f8d4-40b7-4e67-a7bb-5f309fe079b8_1 > .q-item__section > .q-item__label--caption').click(); - cy.get( - '.q-scrollarea__content > .q-btn--standard > .q-btn__content > .q-icon', - ).click(); - /* ==== End Cypress Studio ==== */ + it.only('refFk', () => { + // Invoice + cy.get('[data-cy="Invoice_input"]').type('test'); + cy.searchInFilterPanel(); + requestParams('refFk', 'test'); + countRows('eq', 0); + }); + + it('agencyModeFk', () => { + // Agency + cy.get('[data-cy="Agency_select"]').click(); + cy.get('.q-item__label').contains('inhouse pickup').click(); + cy.searchInFilterPanel(); + requestParams('agencyModeFk', '1'); + countRows('eq', 6); + }); + + // it('', () => { + // cy.get('.q-mt-xs > .q-item__section--side').click(); + // requestParams(null); + // }); + + it('state', () => { + // State + cy.get('[data-cy="State_select"]').click(); + cy.get('.q-item__label').contains('Libre').click(); + cy.searchInFilterPanel(); + requestParams('ts.stateFk', 2, { inWhere: true }); + countRows('eq', 11); + }); + + it('alertLevel', () => { + // AlertLevel + cy.get('[data-cy="Grouped State_select"]').click(); + cy.get('.q-item__label').contains('Free').click(); + cy.searchInFilterPanel(); + requestParams('alertLevel', '0'); + countRows('eq', 16); + }); + + // it('', () => { + // cy.get('.q-mt-xs > .q-item__section--side').click(); + // requestParams(null); + // }); + + it('countryFk', () => { + // Country + cy.get('[data-cy="Country_select"]').click(); + cy.get('.q-item__label').contains('España').click(); + cy.searchInFilterPanel(); + requestParams('countryFk', '1'); + countRows('eq', 26); + }); + + it('warehouseFk', () => { + // Province + cy.get('[data-cy="Province_select"]').click(); + cy.get('.q-item__label').contains('Province one').click(); + cy.searchInFilterPanel(); + requestParams('warehouseFk', 1); + countRows('eq', 2); + }); + + it('department', () => { + // Department + cy.get('[data-cy="Department_select"]').click(); + cy.get('.q-item__label').contains('VENTAS').click(); + cy.searchInFilterPanel(); + requestParams('d.name', 'VENTAS', { inWhere: true }); + countRows('eq', 24); + }); + + it('packing', () => { + // ITP + cy.get('[data-cy="ITP_select"]').click(); + cy.get('.q-item__label').contains('H').click(); + cy.searchInFilterPanel(); + requestParams('packing', 'H'); + countRows('eq', 5); + }); }); }); function requestParams(key, value, options = { inWhere: false, like: false }) { @@ -198,13 +285,20 @@ function requestParams(key, value, options = { inWhere: false, like: false }) { } function countRows(operator = 'gt', value = 0) { // Obtener el último data-row-index para saber el total de filas - cy.get('td[data-row-index]') - .last() - .invoke('attr', 'data-row-index') - .then((lastIndex) => { - const totalRows = parseInt(lastIndex) + 1; // Sumamos 1 porque el índice empieza en 0 - cy.log(`Total de filas: ${totalRows}`); - expect(totalRows).to.be[operator](value); - // expect(totalRows).to.be.gt(0); - }); + const element = 'data-row-index'; + cy.get('body').then(($body) => { + const hasRows = $body.find(`td[${element}]`).length > 0; + cy.log('hasRows:', hasRows); + if (!hasRows) expect(0).to.be[operator](value); + else + cy.get(`td[${element}]`) + .last() + .invoke('attr', element) + .then((lastIndex) => { + const totalRows = parseInt(lastIndex) + 1; // Sumamos 1 porque el índice empieza en 0 + cy.log(`Total de filas: ${totalRows}`); + expect(totalRows).to.be[operator](value); + // expect(totalRows).to.be.gt(0); + }); + }); } diff --git a/test/cypress/support/commands.js b/test/cypress/support/commands.js index f9e4258a0..e0b4e0b78 100755 --- a/test/cypress/support/commands.js +++ b/test/cypress/support/commands.js @@ -286,12 +286,15 @@ Cypress.Commands.add('openRightMenu', (element) => { cy.get('[data-cy="toggle-right-drawer"]').click(); }); +Cypress.Commands.add('cleanFilterPanel', () => { + const element = 'clearFilters'; + if (element) cy.waitForElement(`[data-cy="${element}"]`); + cy.dataCy(element).click(); +}); Cypress.Commands.add('searchInFilterPanel', () => { - const element = - '.q-scrollarea__content > .q-btn--standard > .q-btn__content > .q-icon'; - if (element) cy.waitForElement(element); - cy.get(element).click(); - cy.wait(1000); + const element = 'search'; + if (element) cy.waitForElement(`[data-cy="${element}"]`); + cy.dataCy(element).click(); }); Cypress.Commands.add('openFilterPanel', () => { From f1a57ceba1fe150b3ac730a5e21b1a8e0657ad0a Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Wed, 19 Feb 2025 14:09:00 +0100 Subject: [PATCH 007/209] feat: refs #6321 init --- src/composables/showResultsTable.js | 30 ++ .../Negative/components/ChangeItemDialog.vue | 29 +- .../Negative/components/HandleSplitDialog.vue | 281 ++++++++++++++++++ .../Negative/components/HandleSplited.vue | 281 ++++++++++++++++++ 4 files changed, 612 insertions(+), 9 deletions(-) create mode 100644 src/composables/showResultsTable.js create mode 100644 src/pages/Ticket/Negative/components/HandleSplitDialog.vue create mode 100644 src/pages/Ticket/Negative/components/HandleSplited.vue diff --git a/src/composables/showResultsTable.js b/src/composables/showResultsTable.js new file mode 100644 index 000000000..c7e43ef7c --- /dev/null +++ b/src/composables/showResultsTable.js @@ -0,0 +1,30 @@ +import { useI18n } from 'vue-i18n'; + +import { useQuasar } from 'quasar'; + +export function showResultsAsTable(dialog, results, key) { + const quasar = useQuasar(); + const { t } = useI18n(); + function openTable() { + quasar.notify({ + message: t('negative.detail.modal.changeItem.success'), + color: 'positive', + actions: [ + { + label: t('globals.ok'), + color: 'white', + handler: () => { + quasar.dialog({ + component: dialog, + componentProps: { + results, + key, + }, + }); + }, + }, + ], + }); + } + return { openTable }; +} diff --git a/src/pages/Ticket/Negative/components/ChangeItemDialog.vue b/src/pages/Ticket/Negative/components/ChangeItemDialog.vue index e419b85c0..b0a670080 100644 --- a/src/pages/Ticket/Negative/components/ChangeItemDialog.vue +++ b/src/pages/Ticket/Negative/components/ChangeItemDialog.vue @@ -1,9 +1,18 @@ + + + + diff --git a/src/pages/Ticket/Negative/components/HandleSplited.vue b/src/pages/Ticket/Negative/components/HandleSplited.vue new file mode 100644 index 000000000..b2bf94f26 --- /dev/null +++ b/src/pages/Ticket/Negative/components/HandleSplited.vue @@ -0,0 +1,281 @@ + + + + + From d881730f27a56b73c8360b42d38553cd261304a4 Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Fri, 21 Feb 2025 13:49:39 +0100 Subject: [PATCH 008/209] feat: refs #8647 init --- src/components/VnTable/VnTable.vue | 2 +- src/components/VnTable/VnTableFilter.vue | 2 +- src/components/ui/CardSummary.vue | 2 +- src/components/ui/VnPaginate.vue | 6 ++++-- src/components/ui/VnSearchbar.vue | 2 +- 5 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/components/VnTable/VnTable.vue b/src/components/VnTable/VnTable.vue index 2cce5d05c..0b44660f5 100644 --- a/src/components/VnTable/VnTable.vue +++ b/src/components/VnTable/VnTable.vue @@ -63,7 +63,7 @@ const $props = defineProps({ default: null, }, create: { - type: Object, + type: [Boolean, Object], default: null, }, createAsDialog: { diff --git a/src/components/VnTable/VnTableFilter.vue b/src/components/VnTable/VnTableFilter.vue index 79b903e54..bb4a9a540 100644 --- a/src/components/VnTable/VnTableFilter.vue +++ b/src/components/VnTable/VnTableFilter.vue @@ -26,7 +26,7 @@ function columnName(col) { }