From 0e55f7abdc863b00967028a45262c5568cb49bb8 Mon Sep 17 00:00:00 2001
From: wbuezas <wbuezas@verdnatura.es>
Date: Mon, 25 Nov 2024 09:18:11 -0300
Subject: [PATCH 01/40] test: order catalog tests

---
 src/components/ui/VnFilterPanel.vue           |   1 +
 .../Order/Card/CatalogFilterValueDialog.vue   |   4 +-
 src/pages/Order/Card/OrderCatalog.vue         |   4 +-
 src/pages/Order/Card/OrderCatalogFilter.vue   |   5 +
 .../claim/Order/catalogTests.spec.js          | 122 ++++++++++++++++++
 test/cypress/support/commands.js              |   4 +
 6 files changed, 138 insertions(+), 2 deletions(-)
 create mode 100644 test/cypress/integration/claim/Order/catalogTests.spec.js

diff --git a/src/components/ui/VnFilterPanel.vue b/src/components/ui/VnFilterPanel.vue
index b9aa5e114..eca4e0995 100644
--- a/src/components/ui/VnFilterPanel.vue
+++ b/src/components/ui/VnFilterPanel.vue
@@ -249,6 +249,7 @@ function sanitizer(params) {
                         :key="chip.label"
                         :removable="!unremovableParams?.includes(chip.label)"
                         @remove="remove(chip.label)"
+                        data-cy="vnFilterPanelChip"
                     >
                         <slot name="tags" :tag="chip" :format-fn="formatValue">
                             <div class="q-gutter-x-xs">
diff --git a/src/pages/Order/Card/CatalogFilterValueDialog.vue b/src/pages/Order/Card/CatalogFilterValueDialog.vue
index 9593e08c4..5855f91f4 100644
--- a/src/pages/Order/Card/CatalogFilterValueDialog.vue
+++ b/src/pages/Order/Card/CatalogFilterValueDialog.vue
@@ -50,7 +50,7 @@ const getSelectedTagValues = async (tag) => {
 
 <template>
     <QForm @submit="applyTags()" class="all-pointer-events">
-        <QCard class="q-pa-sm column q-pa-lg">
+        <QCard class="q-pa-sm column q-pa-lg" data-cy="catalogFilterValueDialog">
             <VnSelect
                 :label="t('params.tag')"
                 v-model="selectedTag"
@@ -64,6 +64,7 @@ const getSelectedTagValues = async (tag) => {
                 :emit-value="false"
                 use-input
                 @update:model-value="getSelectedTagValues"
+                data-cy="catalogFilterValueDialogTagSelect"
             />
             <div
                 v-for="(value, index) in tagValues"
@@ -94,6 +95,7 @@ const getSelectedTagValues = async (tag) => {
                         :disable="!value"
                         is-outlined
                         class="col"
+                        data-cy="catalogFilterValueDialogValueInput"
                     />
                     <QBtn
                         icon="delete"
diff --git a/src/pages/Order/Card/OrderCatalog.vue b/src/pages/Order/Card/OrderCatalog.vue
index 90bce38fd..f3e70cd6f 100644
--- a/src/pages/Order/Card/OrderCatalog.vue
+++ b/src/pages/Order/Card/OrderCatalog.vue
@@ -98,7 +98,7 @@ watch(
             />
         </QScrollArea>
     </QDrawer>
-    <QPage class="column items-center q-pa-md">
+    <QPage class="column items-center q-pa-md" data-cy="orderCatalogPage">
         <div class="full-width">
             <VnPaginate
                 :data-key="dataKey"
@@ -106,6 +106,7 @@ watch(
                 :limit="50"
                 :user-params="catalogParams"
                 :auto-load="autoLoad"
+                data-cy="orderCatalogPage"
             >
                 <template #body="{ rows }">
                     <div class="catalog-list">
@@ -118,6 +119,7 @@ watch(
                             :item="row"
                             is-catalog
                             class="fill-icon"
+                            data-cy="orderCatalogItem"
                         />
                     </div>
                 </template>
diff --git a/src/pages/Order/Card/OrderCatalogFilter.vue b/src/pages/Order/Card/OrderCatalogFilter.vue
index 03c479ef4..079141606 100644
--- a/src/pages/Order/Card/OrderCatalogFilter.vue
+++ b/src/pages/Order/Card/OrderCatalogFilter.vue
@@ -179,6 +179,7 @@ function addOrder(value, field, params) {
                             ? resetCategory(params, searchFn)
                             : removeTagGroupParam(params, searchFn, valIndex)
                     "
+                    data-cy="catalogFilterCustomTag"
                 >
                     <strong v-if="customTag.label === 'categoryFk' && categoryList">
                         {{
@@ -212,6 +213,7 @@ function addOrder(value, field, params) {
                         :name="category.icon"
                         class="category-icon"
                         @click="selectCategory(params, category, searchFn)"
+                        data-cy="catalogFilterCategory"
                     >
                         <QTooltip>
                             {{ t(category.name) }}
@@ -235,6 +237,7 @@ function addOrder(value, field, params) {
                         sort-by="name ASC"
                         :disable="!params.categoryFk"
                         @update:model-value="searchFn()"
+                        data-cy="catalogFilterType"
                     >
                         <template #option="{ itemProps, opt }">
                             <QItem v-bind="itemProps">
@@ -286,6 +289,7 @@ function addOrder(value, field, params) {
                     :is-clearable="false"
                     v-model="searchByTag"
                     @keyup.enter="(val) => onSearchByTag(val, params)"
+                    data-cy="catalogFilterValueInput"
                 >
                     <template #prepend>
                         <QIcon name="search" />
@@ -298,6 +302,7 @@ function addOrder(value, field, params) {
                             color="primary"
                             size="md"
                             dense
+                            data-cy="catalogFilterValueDialogBtn"
                         />
                         <QPopupProxy>
                             <CatalogFilterValueDialog
diff --git a/test/cypress/integration/claim/Order/catalogTests.spec.js b/test/cypress/integration/claim/Order/catalogTests.spec.js
new file mode 100644
index 000000000..da0e7869a
--- /dev/null
+++ b/test/cypress/integration/claim/Order/catalogTests.spec.js
@@ -0,0 +1,122 @@
+/// <reference types="cypress" />
+describe('OrderCatalog', () => {
+    beforeEach(() => {
+        cy.login('developer');
+        cy.viewport(1920, 720);
+        cy.visit('/#/order/8/catalog');
+    });
+
+    const checkCustomFilterTag = (filterName = 'Plant') => {
+        cy.dataCy('catalogFilterCustomTag').should('exist');
+        cy.dataCy('catalogFilterCustomTag').contains(filterName);
+    };
+
+    const checkFilterTag = (filterName = 'Plant') => {
+        cy.dataCy('vnFilterPanelChip').should('exist');
+        cy.dataCy('vnFilterPanelChip').contains(filterName);
+    };
+
+    const selectCategory = (categoryIndex = 1, categoryName = 'Plant') => {
+        cy.get(
+            `div.q-page-container div:nth-of-type(${categoryIndex}) > [data-cy='catalogFilterCategory']`
+        ).should('exist');
+        cy.get(
+            `div.q-page-container div:nth-of-type(${categoryIndex}) > [data-cy='catalogFilterCategory']`
+        ).click();
+        checkCustomFilterTag(categoryName);
+    };
+
+    const searchByCustomTagInput = (option) => {
+        cy.dataCy('catalogFilterValueInput').find('input').last().focus();
+        cy.dataCy('catalogFilterValueInput').find('input').last().type(option);
+        cy.dataCy('catalogFilterValueInput').find('input').last().type('{enter}');
+        checkCustomFilterTag(option);
+    };
+
+    const selectTypeFilter = (option) => {
+        cy.selectOption(
+            'div.q-page-container div.list > div:nth-of-type(2) div:nth-of-type(3)',
+            option
+        );
+        checkFilterTag(option);
+    };
+
+    it('Shows empty state', () => {
+        // PASS;
+        cy.dataCy('orderCatalogPage').should('exist');
+        cy.dataCy('orderCatalogPage').contains('No data to display');
+    });
+
+    it('filter by category', () => {
+        // PASS;
+        selectCategory();
+        cy.dataCy('orderCatalogItem').should('exist');
+    });
+
+    it('filters by type', () => {
+        // PASS;
+        selectCategory();
+        selectTypeFilter('Anthurium');
+    });
+
+    it('filters by custom value select', () => {
+        // PASS
+        selectCategory();
+        searchByCustomTagInput('Silver');
+    });
+
+    it('filters by custom value dialog', () => {
+        // PASS
+        Cypress.on('uncaught:exception', (err) => {
+            if (err.message.includes('canceled')) {
+                return false;
+            }
+        });
+        selectCategory();
+        cy.dataCy('catalogFilterValueDialogBtn').should('exist');
+        cy.dataCy('catalogFilterValueDialogBtn').last().click();
+        cy.dataCy('catalogFilterValueDialogTagSelect').should('exist');
+        cy.selectOption(
+            "[data-cy='catalogFilterValueDialog'] > label > div > div > div",
+            'Tallos'
+        );
+        cy.dataCy('catalogFilterValueDialogValueInput').find('input').focus();
+        cy.dataCy('catalogFilterValueDialogValueInput').find('input').type('2');
+        cy.dataCy('catalogFilterValueDialogValueInput').find('input').type('{enter}');
+        checkCustomFilterTag('2');
+    });
+
+    it('removes a secondary tag', () => {
+        // PASS
+        selectCategory();
+        selectTypeFilter('Anthurium');
+        cy.dataCy('vnFilterPanelChip').should('exist');
+        cy.get(
+            "div.q-page-container [data-cy='vnFilterPanelChip'] > i.q-chip__icon--remove"
+        )
+            .contains('cancel')
+            .should('exist');
+        cy.get(
+            "div.q-page-container [data-cy='vnFilterPanelChip'] > i.q-chip__icon--remove"
+        )
+            .contains('cancel')
+            .click();
+        cy.dataCy('vnFilterPanelChip').should('not.exist');
+    });
+
+    it('Removes category tag', () => {
+        // PASS
+        selectCategory();
+        cy.get(
+            "div.q-page-container [data-cy='catalogFilterCustomTag'] > i.q-chip__icon--remove"
+        )
+            .contains('cancel')
+            .should('exist');
+        cy.get(
+            "div.q-page-container [data-cy='catalogFilterCustomTag'] > i.q-chip__icon--remove"
+        )
+            .contains('cancel')
+            .click();
+        cy.dataCy('catalogFilterCustomTag').should('not.exist');
+    });
+});
diff --git a/test/cypress/support/commands.js b/test/cypress/support/commands.js
index 8d48dc71a..86436dcce 100755
--- a/test/cypress/support/commands.js
+++ b/test/cypress/support/commands.js
@@ -262,3 +262,7 @@ Cypress.Commands.add('openUserPanel', () => {
         '.column > .q-avatar > .q-avatar__content > .q-img > .q-img__container > .q-img__image'
     ).click();
 });
+
+Cypress.Commands.add('dataCy', (dataTestId, attr = 'data-cy') => {
+    return cy.get(`[${attr}="${dataTestId}"]`);
+});

From c0d427ecb91d1c8ad71c35e02c4b144372da15c5 Mon Sep 17 00:00:00 2001
From: Javier Segarra <jsegarra@verdnatura.es>
Date: Mon, 25 Nov 2024 23:20:15 +0100
Subject: [PATCH 02/40] Revert "test: rename client by customer"

This reverts commit 30a2da027b42f7bf4d2de5de2699b0b034675527.
---
 .../clientAddress.spec.js}                          |  0
 .../clientBalance.spec.js}                          |  0
 .../clientBasicData.spec.js}                        |  0
 .../clientBillingData.spec.js}                      |  2 +-
 .../integration/client/clientCredits.spec.js        | 13 +++++++++++++
 .../clientFiscalData.spec.js}                       |  0
 .../clientGreuges.spec.js}                          |  0
 .../clientList.spec.js}                             |  0
 .../clientNotes.spec.js}                            |  0
 .../integration/client/clientRecoveries.spec.js     | 13 +++++++++++++
 .../clientSms.spec.js}                              |  0
 .../clientWebAccess.spec.js}                        |  0
 .../clientCreditContracts.spec.js}                  |  4 ++--
 .../credit-management/clientCreditOpinion.spec.js   | 13 +++++++++++++
 .../client/others/clientConsumption.spec.js         | 13 +++++++++++++
 .../others/clientContacts.spec.js}                  |  0
 .../client/others/clientMandates.spec.js            | 13 +++++++++++++
 .../integration/client/others/clientSamples.spec.js | 13 +++++++++++++
 .../others/clientUnpaid.spec.js}                    |  0
 .../client/others/clientWebPayments.spec.js         | 13 +++++++++++++
 test/cypress/support/commands.js                    |  3 +--
 21 files changed, 95 insertions(+), 5 deletions(-)
 rename test/cypress/integration/{customer/customerAddress.spec.js => client/clientAddress.spec.js} (100%)
 rename test/cypress/integration/{customer/customerBalance.spec.js => client/clientBalance.spec.js} (100%)
 rename test/cypress/integration/{customer/customerBasicData.spec.js => client/clientBasicData.spec.js} (100%)
 rename test/cypress/integration/{customer/customerBillingData.spec.js => client/clientBillingData.spec.js} (86%)
 create mode 100644 test/cypress/integration/client/clientCredits.spec.js
 rename test/cypress/integration/{customer/customerFiscalData.spec.js => client/clientFiscalData.spec.js} (100%)
 rename test/cypress/integration/{customer/customerGreuges.spec.js => client/clientGreuges.spec.js} (100%)
 rename test/cypress/integration/{customer/customerList.spec.js => client/clientList.spec.js} (100%)
 rename test/cypress/integration/{customer/customerNotes.spec.js => client/clientNotes.spec.js} (100%)
 create mode 100644 test/cypress/integration/client/clientRecoveries.spec.js
 rename test/cypress/integration/{customer/customerSms.spec.js => client/clientSms.spec.js} (100%)
 rename test/cypress/integration/{customer/customerWebAccess.spec.js => client/clientWebAccess.spec.js} (100%)
 rename test/cypress/integration/{customer/credit-management/customerCreditContracts.spec.js => client/credit-management/clientCreditContracts.spec.js} (75%)
 create mode 100644 test/cypress/integration/client/credit-management/clientCreditOpinion.spec.js
 create mode 100644 test/cypress/integration/client/others/clientConsumption.spec.js
 rename test/cypress/integration/{customer/others/customerContacts.spec.js => client/others/clientContacts.spec.js} (100%)
 create mode 100644 test/cypress/integration/client/others/clientMandates.spec.js
 create mode 100644 test/cypress/integration/client/others/clientSamples.spec.js
 rename test/cypress/integration/{customer/others/customerUnpaid.spec.js => client/others/clientUnpaid.spec.js} (100%)
 create mode 100644 test/cypress/integration/client/others/clientWebPayments.spec.js

diff --git a/test/cypress/integration/customer/customerAddress.spec.js b/test/cypress/integration/client/clientAddress.spec.js
similarity index 100%
rename from test/cypress/integration/customer/customerAddress.spec.js
rename to test/cypress/integration/client/clientAddress.spec.js
diff --git a/test/cypress/integration/customer/customerBalance.spec.js b/test/cypress/integration/client/clientBalance.spec.js
similarity index 100%
rename from test/cypress/integration/customer/customerBalance.spec.js
rename to test/cypress/integration/client/clientBalance.spec.js
diff --git a/test/cypress/integration/customer/customerBasicData.spec.js b/test/cypress/integration/client/clientBasicData.spec.js
similarity index 100%
rename from test/cypress/integration/customer/customerBasicData.spec.js
rename to test/cypress/integration/client/clientBasicData.spec.js
diff --git a/test/cypress/integration/customer/customerBillingData.spec.js b/test/cypress/integration/client/clientBillingData.spec.js
similarity index 86%
rename from test/cypress/integration/customer/customerBillingData.spec.js
rename to test/cypress/integration/client/clientBillingData.spec.js
index 00af82e39..16e8fc0fc 100644
--- a/test/cypress/integration/customer/customerBillingData.spec.js
+++ b/test/cypress/integration/client/clientBillingData.spec.js
@@ -8,6 +8,6 @@ describe('Client billing data', () => {
         });
     });
     it('Should load layout', () => {
-        cy.get('.q-card').should('be.visible');
+        cy.get('.q-page').should('be.visible');
     });
 });
diff --git a/test/cypress/integration/client/clientCredits.spec.js b/test/cypress/integration/client/clientCredits.spec.js
new file mode 100644
index 000000000..5f303b40d
--- /dev/null
+++ b/test/cypress/integration/client/clientCredits.spec.js
@@ -0,0 +1,13 @@
+/// <reference types="cypress" />
+describe('Client credits', () => {
+    beforeEach(() => {
+        cy.viewport(1280, 720);
+        cy.login('developer');
+        cy.visit('#/customer/1110/credits', {
+            timeout: 5000,
+        });
+    });
+    it('Should load layout', () => {
+        cy.get('.q-page').should('be.visible');
+    });
+});
diff --git a/test/cypress/integration/customer/customerFiscalData.spec.js b/test/cypress/integration/client/clientFiscalData.spec.js
similarity index 100%
rename from test/cypress/integration/customer/customerFiscalData.spec.js
rename to test/cypress/integration/client/clientFiscalData.spec.js
diff --git a/test/cypress/integration/customer/customerGreuges.spec.js b/test/cypress/integration/client/clientGreuges.spec.js
similarity index 100%
rename from test/cypress/integration/customer/customerGreuges.spec.js
rename to test/cypress/integration/client/clientGreuges.spec.js
diff --git a/test/cypress/integration/customer/customerList.spec.js b/test/cypress/integration/client/clientList.spec.js
similarity index 100%
rename from test/cypress/integration/customer/customerList.spec.js
rename to test/cypress/integration/client/clientList.spec.js
diff --git a/test/cypress/integration/customer/customerNotes.spec.js b/test/cypress/integration/client/clientNotes.spec.js
similarity index 100%
rename from test/cypress/integration/customer/customerNotes.spec.js
rename to test/cypress/integration/client/clientNotes.spec.js
diff --git a/test/cypress/integration/client/clientRecoveries.spec.js b/test/cypress/integration/client/clientRecoveries.spec.js
new file mode 100644
index 000000000..ea6f14407
--- /dev/null
+++ b/test/cypress/integration/client/clientRecoveries.spec.js
@@ -0,0 +1,13 @@
+/// <reference types="cypress" />
+describe('Client recoveries', () => {
+    beforeEach(() => {
+        cy.viewport(1280, 720);
+        cy.login('developer');
+        cy.visit('#/customer/1101/recoveries', {
+            timeout: 5000,
+        });
+    });
+    it('Should load layout', () => {
+        cy.get('.q-page').should('be.visible');
+    });
+});
diff --git a/test/cypress/integration/customer/customerSms.spec.js b/test/cypress/integration/client/clientSms.spec.js
similarity index 100%
rename from test/cypress/integration/customer/customerSms.spec.js
rename to test/cypress/integration/client/clientSms.spec.js
diff --git a/test/cypress/integration/customer/customerWebAccess.spec.js b/test/cypress/integration/client/clientWebAccess.spec.js
similarity index 100%
rename from test/cypress/integration/customer/customerWebAccess.spec.js
rename to test/cypress/integration/client/clientWebAccess.spec.js
diff --git a/test/cypress/integration/customer/credit-management/customerCreditContracts.spec.js b/test/cypress/integration/client/credit-management/clientCreditContracts.spec.js
similarity index 75%
rename from test/cypress/integration/customer/credit-management/customerCreditContracts.spec.js
rename to test/cypress/integration/client/credit-management/clientCreditContracts.spec.js
index 3c35d5ed0..1c2f935fc 100644
--- a/test/cypress/integration/customer/credit-management/customerCreditContracts.spec.js
+++ b/test/cypress/integration/client/credit-management/clientCreditContracts.spec.js
@@ -1,5 +1,5 @@
 /// <reference types="cypress" />
-describe('Client credit opinion', () => {
+describe('Client credit contracts', () => {
     beforeEach(() => {
         cy.viewport(1280, 720);
         cy.login('developer');
@@ -8,6 +8,6 @@ describe('Client credit opinion', () => {
         });
     });
     it('Should load layout', () => {
-        cy.get('.q-card').should('be.visible');
+        cy.get('.q-page').should('be.visible');
     });
 });
diff --git a/test/cypress/integration/client/credit-management/clientCreditOpinion.spec.js b/test/cypress/integration/client/credit-management/clientCreditOpinion.spec.js
new file mode 100644
index 000000000..c32215f01
--- /dev/null
+++ b/test/cypress/integration/client/credit-management/clientCreditOpinion.spec.js
@@ -0,0 +1,13 @@
+/// <reference types="cypress" />
+describe('Client credit opinion', () => {
+    beforeEach(() => {
+        cy.viewport(1280, 720);
+        cy.login('developer');
+        cy.visit('#/customer/1110/credit-management/credit-opinion', {
+            timeout: 5000,
+        });
+    });
+    it('Should load layout', () => {
+        cy.get('.q-page').should('be.visible');
+    });
+});
diff --git a/test/cypress/integration/client/others/clientConsumption.spec.js b/test/cypress/integration/client/others/clientConsumption.spec.js
new file mode 100644
index 000000000..bbc11998e
--- /dev/null
+++ b/test/cypress/integration/client/others/clientConsumption.spec.js
@@ -0,0 +1,13 @@
+/// <reference types="cypress" />
+describe('Client consumption', () => {
+    beforeEach(() => {
+        cy.viewport(1280, 720);
+        cy.login('developer');
+        cy.visit('#/customer/1101/others/consumption', {
+            timeout: 5000,
+        });
+    });
+    it('Should load layout', () => {
+        cy.get('.q-page').should('be.visible');
+    });
+});
diff --git a/test/cypress/integration/customer/others/customerContacts.spec.js b/test/cypress/integration/client/others/clientContacts.spec.js
similarity index 100%
rename from test/cypress/integration/customer/others/customerContacts.spec.js
rename to test/cypress/integration/client/others/clientContacts.spec.js
diff --git a/test/cypress/integration/client/others/clientMandates.spec.js b/test/cypress/integration/client/others/clientMandates.spec.js
new file mode 100644
index 000000000..055eda2d0
--- /dev/null
+++ b/test/cypress/integration/client/others/clientMandates.spec.js
@@ -0,0 +1,13 @@
+/// <reference types="cypress" />
+describe('Client mandates', () => {
+    beforeEach(() => {
+        cy.viewport(1280, 720);
+        cy.login('developer');
+        cy.visit('#/customer/1110/others/mandates', {
+            timeout: 5000,
+        });
+    });
+    it('Should load layout', () => {
+        cy.get('.q-page').should('be.visible');
+    });
+});
diff --git a/test/cypress/integration/client/others/clientSamples.spec.js b/test/cypress/integration/client/others/clientSamples.spec.js
new file mode 100644
index 000000000..a50120402
--- /dev/null
+++ b/test/cypress/integration/client/others/clientSamples.spec.js
@@ -0,0 +1,13 @@
+/// <reference types="cypress" />
+describe('Client samples', () => {
+    beforeEach(() => {
+        cy.viewport(1280, 720);
+        cy.login('developer');
+        cy.visit('#/customer/1101/others/samples', {
+            timeout: 5000,
+        });
+    });
+    it('Should load layout', () => {
+        cy.get('.q-page').should('be.visible');
+    });
+});
diff --git a/test/cypress/integration/customer/others/customerUnpaid.spec.js b/test/cypress/integration/client/others/clientUnpaid.spec.js
similarity index 100%
rename from test/cypress/integration/customer/others/customerUnpaid.spec.js
rename to test/cypress/integration/client/others/clientUnpaid.spec.js
diff --git a/test/cypress/integration/client/others/clientWebPayments.spec.js b/test/cypress/integration/client/others/clientWebPayments.spec.js
new file mode 100644
index 000000000..f35b12612
--- /dev/null
+++ b/test/cypress/integration/client/others/clientWebPayments.spec.js
@@ -0,0 +1,13 @@
+/// <reference types="cypress" />
+describe('Client web payments', () => {
+    beforeEach(() => {
+        cy.viewport(1280, 720);
+        cy.login('developer');
+        cy.visit('#/customer/1101/others/web-payment', {
+            timeout: 5000,
+        });
+    });
+    it('Should load layout', () => {
+        cy.get('.q-page').should('be.visible');
+    });
+});
diff --git a/test/cypress/support/commands.js b/test/cypress/support/commands.js
index 75b5eeec3..64c159f6d 100755
--- a/test/cypress/support/commands.js
+++ b/test/cypress/support/commands.js
@@ -254,9 +254,8 @@ Cypress.Commands.add('validateContent', (selector, expectedValue) => {
 });
 
 Cypress.Commands.add('openActionsDescriptor', () => {
-    cy.get('[data-cy="descriptor-more-opts"]').click();
+    cy.get('.header > :nth-child(3) > .q-btn__content > .q-icon').click();
 });
-
 Cypress.Commands.add('clickButtonsDescriptor', (id) => {
     cy.get(`.actions > .q-card__actions> .q-btn:nth-child(${id})`)
         .invoke('removeAttr', 'target')

From 6c6144864f8a545f97a282f2bf0fea79e5d3a171 Mon Sep 17 00:00:00 2001
From: Javier Segarra <jsegarra@verdnatura.es>
Date: Mon, 25 Nov 2024 23:21:32 +0100
Subject: [PATCH 03/40] revert: remove customer test

---
 .../credit-management/customerCreditOpinion.spec.js | 13 -------------
 .../integration/customer/customerCredits.spec.js    | 13 -------------
 .../integration/customer/customerRecoveries.spec.js | 13 -------------
 .../customer/others/customerConsumption.spec.js     | 13 -------------
 .../customer/others/customerMandates.spec.js        | 13 -------------
 .../customer/others/customerSamples.spec.js         | 13 -------------
 .../customer/others/customerWebPayments.spec.js     | 13 -------------
 7 files changed, 91 deletions(-)
 delete mode 100644 test/cypress/integration/customer/credit-management/customerCreditOpinion.spec.js
 delete mode 100644 test/cypress/integration/customer/customerCredits.spec.js
 delete mode 100644 test/cypress/integration/customer/customerRecoveries.spec.js
 delete mode 100644 test/cypress/integration/customer/others/customerConsumption.spec.js
 delete mode 100644 test/cypress/integration/customer/others/customerMandates.spec.js
 delete mode 100644 test/cypress/integration/customer/others/customerSamples.spec.js
 delete mode 100644 test/cypress/integration/customer/others/customerWebPayments.spec.js

diff --git a/test/cypress/integration/customer/credit-management/customerCreditOpinion.spec.js b/test/cypress/integration/customer/credit-management/customerCreditOpinion.spec.js
deleted file mode 100644
index c32215f01..000000000
--- a/test/cypress/integration/customer/credit-management/customerCreditOpinion.spec.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/// <reference types="cypress" />
-describe('Client credit opinion', () => {
-    beforeEach(() => {
-        cy.viewport(1280, 720);
-        cy.login('developer');
-        cy.visit('#/customer/1110/credit-management/credit-opinion', {
-            timeout: 5000,
-        });
-    });
-    it('Should load layout', () => {
-        cy.get('.q-page').should('be.visible');
-    });
-});
diff --git a/test/cypress/integration/customer/customerCredits.spec.js b/test/cypress/integration/customer/customerCredits.spec.js
deleted file mode 100644
index 5f303b40d..000000000
--- a/test/cypress/integration/customer/customerCredits.spec.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/// <reference types="cypress" />
-describe('Client credits', () => {
-    beforeEach(() => {
-        cy.viewport(1280, 720);
-        cy.login('developer');
-        cy.visit('#/customer/1110/credits', {
-            timeout: 5000,
-        });
-    });
-    it('Should load layout', () => {
-        cy.get('.q-page').should('be.visible');
-    });
-});
diff --git a/test/cypress/integration/customer/customerRecoveries.spec.js b/test/cypress/integration/customer/customerRecoveries.spec.js
deleted file mode 100644
index ea6f14407..000000000
--- a/test/cypress/integration/customer/customerRecoveries.spec.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/// <reference types="cypress" />
-describe('Client recoveries', () => {
-    beforeEach(() => {
-        cy.viewport(1280, 720);
-        cy.login('developer');
-        cy.visit('#/customer/1101/recoveries', {
-            timeout: 5000,
-        });
-    });
-    it('Should load layout', () => {
-        cy.get('.q-page').should('be.visible');
-    });
-});
diff --git a/test/cypress/integration/customer/others/customerConsumption.spec.js b/test/cypress/integration/customer/others/customerConsumption.spec.js
deleted file mode 100644
index bbc11998e..000000000
--- a/test/cypress/integration/customer/others/customerConsumption.spec.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/// <reference types="cypress" />
-describe('Client consumption', () => {
-    beforeEach(() => {
-        cy.viewport(1280, 720);
-        cy.login('developer');
-        cy.visit('#/customer/1101/others/consumption', {
-            timeout: 5000,
-        });
-    });
-    it('Should load layout', () => {
-        cy.get('.q-page').should('be.visible');
-    });
-});
diff --git a/test/cypress/integration/customer/others/customerMandates.spec.js b/test/cypress/integration/customer/others/customerMandates.spec.js
deleted file mode 100644
index 055eda2d0..000000000
--- a/test/cypress/integration/customer/others/customerMandates.spec.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/// <reference types="cypress" />
-describe('Client mandates', () => {
-    beforeEach(() => {
-        cy.viewport(1280, 720);
-        cy.login('developer');
-        cy.visit('#/customer/1110/others/mandates', {
-            timeout: 5000,
-        });
-    });
-    it('Should load layout', () => {
-        cy.get('.q-page').should('be.visible');
-    });
-});
diff --git a/test/cypress/integration/customer/others/customerSamples.spec.js b/test/cypress/integration/customer/others/customerSamples.spec.js
deleted file mode 100644
index a50120402..000000000
--- a/test/cypress/integration/customer/others/customerSamples.spec.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/// <reference types="cypress" />
-describe('Client samples', () => {
-    beforeEach(() => {
-        cy.viewport(1280, 720);
-        cy.login('developer');
-        cy.visit('#/customer/1101/others/samples', {
-            timeout: 5000,
-        });
-    });
-    it('Should load layout', () => {
-        cy.get('.q-page').should('be.visible');
-    });
-});
diff --git a/test/cypress/integration/customer/others/customerWebPayments.spec.js b/test/cypress/integration/customer/others/customerWebPayments.spec.js
deleted file mode 100644
index f35b12612..000000000
--- a/test/cypress/integration/customer/others/customerWebPayments.spec.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/// <reference types="cypress" />
-describe('Client web payments', () => {
-    beforeEach(() => {
-        cy.viewport(1280, 720);
-        cy.login('developer');
-        cy.visit('#/customer/1101/others/web-payment', {
-            timeout: 5000,
-        });
-    });
-    it('Should load layout', () => {
-        cy.get('.q-page').should('be.visible');
-    });
-});

From 4e5754ccb5a5d87339116d61e8389d342633147f Mon Sep 17 00:00:00 2001
From: Javier Segarra <jsegarra@verdnatura.es>
Date: Mon, 25 Nov 2024 23:49:24 +0100
Subject: [PATCH 04/40] test: perf clientList descriptor action

---
 .../integration/client/clientList.spec.js     | 19 +++++++++++++------
 test/cypress/support/commands.js              | 10 ++++++++++
 2 files changed, 23 insertions(+), 6 deletions(-)

diff --git a/test/cypress/integration/client/clientList.spec.js b/test/cypress/integration/client/clientList.spec.js
index 93e53b9f6..a528907e2 100644
--- a/test/cypress/integration/client/clientList.spec.js
+++ b/test/cypress/integration/client/clientList.spec.js
@@ -6,7 +6,11 @@ describe('Client list', () => {
         cy.visit('/#/customer/list', {
             timeout: 5000,
             onBeforeLoad(win) {
-                cy.stub(win, 'open');
+                cy.stub(win, 'open')
+                    .callsFake((url) => {
+                        return win.open.wrappedMethod.call(win, url, '_self');
+                    })
+                    .as('Open');
             },
         });
     });
@@ -47,17 +51,20 @@ describe('Client list', () => {
     it('Client founded create ticket', () => {
         const search = 'Jessica Jones';
         cy.searchByLabel('Name', search);
-        cy.clickButtonsDescriptor(2);
+        cy.openActionDescriptor('Create ticket');
         cy.waitForElement('#formModel');
-        cy.waitForElement('.q-form');
-        cy.checkValueForm(1, search);
+        cy.waitForElement('.q-form', { timeout: 5000 });
+
+        cy.get('.grid-create >:nth-child(1)').find('input').should('have.value', search);
+        cy.get('.grid-create >:nth-child(2)').find('input').should('have.value', search);
     });
     it('Client founded create order', () => {
         const search = 'Jessica Jones';
         cy.searchByLabel('Name', search);
-        cy.clickButtonsDescriptor(4);
+        cy.openActionDescriptor('New order');
         cy.waitForElement('#formModel');
         cy.waitForElement('.q-form');
-        cy.checkValueForm(2, search);
+        cy.get('.grid-create >:nth-child(2)').find('input').should('have.value', search);
+        cy.get('.grid-create >:nth-child(4)').find('input').should('have.value', search);
     });
 });
diff --git a/test/cypress/support/commands.js b/test/cypress/support/commands.js
index 64c159f6d..2350d1231 100755
--- a/test/cypress/support/commands.js
+++ b/test/cypress/support/commands.js
@@ -249,6 +249,7 @@ Cypress.Commands.add('writeSearchbar', (value) => {
         value
     );
 });
+
 Cypress.Commands.add('validateContent', (selector, expectedValue) => {
     cy.get(selector).should('have.text', expectedValue);
 });
@@ -256,6 +257,14 @@ Cypress.Commands.add('validateContent', (selector, expectedValue) => {
 Cypress.Commands.add('openActionsDescriptor', () => {
     cy.get('.header > :nth-child(3) > .q-btn__content > .q-icon').click();
 });
+
+Cypress.Commands.add('openActionDescriptor', (opt) => {
+    cy.openActionsDescriptor();
+    const listItem = '[role="menu"] .q-list .q-item';
+    cy.contains(listItem, opt).click();
+    1;
+});
+
 Cypress.Commands.add('clickButtonsDescriptor', (id) => {
     cy.get(`.actions > .q-card__actions> .q-btn:nth-child(${id})`)
         .invoke('removeAttr', 'target')
@@ -267,6 +276,7 @@ Cypress.Commands.add('openUserPanel', () => {
         '.column > .q-avatar > .q-avatar__content > .q-img > .q-img__container > .q-img__image'
     ).click();
 });
+
 Cypress.Commands.add('checkNotification', (text) => {
     cy.get('.q-notification')
         .should('be.visible')

From e28d026ca99aafae1abe5d06ef3cd4a649b7426e Mon Sep 17 00:00:00 2001
From: Javier Segarra <jsegarra@verdnatura.es>
Date: Mon, 25 Nov 2024 23:53:14 +0100
Subject: [PATCH 05/40] test: perf clientList descriptor action

---
 test/cypress/integration/client/clientList.spec.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/test/cypress/integration/client/clientList.spec.js b/test/cypress/integration/client/clientList.spec.js
index a528907e2..e2d323d65 100644
--- a/test/cypress/integration/client/clientList.spec.js
+++ b/test/cypress/integration/client/clientList.spec.js
@@ -32,7 +32,7 @@ describe('Client list', () => {
 
         cy.get('.q-mt-lg > .q-btn--standard').click();
 
-        cy.checkNotification('created');
+        cy.checkNotification('Data saved');
         cy.url().should('include', '/summary');
     });
     it('Client list search client', () => {

From c3510aea60dab2c4016bc87e01473c760715c9e9 Mon Sep 17 00:00:00 2001
From: Javier Segarra <jsegarra@verdnatura.es>
Date: Tue, 26 Nov 2024 00:18:42 +0100
Subject: [PATCH 06/40] feat: add Options Style in AddressList from TicketCrete

---
 src/pages/Ticket/TicketList.vue | 22 ++++++++++++++++++----
 1 file changed, 18 insertions(+), 4 deletions(-)

diff --git a/src/pages/Ticket/TicketList.vue b/src/pages/Ticket/TicketList.vue
index aa666be98..a66a0b7f6 100644
--- a/src/pages/Ticket/TicketList.vue
+++ b/src/pages/Ticket/TicketList.vue
@@ -273,9 +273,8 @@ const fetchAddresses = async (formData) => {
     if (!formData.clientId) return;
 
     const filter = {
-        fields: ['nickname', 'street', 'city', 'id'],
-        where: { isActive: true },
-        order: 'nickname ASC',
+        fields: ['nickname', 'street', 'city', 'id', 'isActive'],
+        order: ['isDefaultAddress DESC', 'isActive DESC', 'nickname ASC'],
     };
     const params = { filter: JSON.stringify(filter) };
     const { data } = await axios.get(`Clients/${formData.clientId}/addresses`, {
@@ -643,7 +642,22 @@ function setReference(data) {
                     @update:model-value="() => fetchAvailableAgencies(data)"
                 >
                     <template #option="scope">
-                        <QItem v-bind="scope.itemProps">
+                        <QItem
+                            v-bind="scope.itemProps"
+                            :class="{ disabled: !scope.opt.isActive }"
+                        >
+                            <QItemSection style="min-width: min-content" avatar>
+                                <QIcon
+                                    v-if="
+                                        scope.opt.isActive &&
+                                        selectedClient?.defaultAddressFk === scope.opt.id
+                                    "
+                                    size="sm"
+                                    color="grey"
+                                    name="star"
+                                    class="fill-icon"
+                                />
+                            </QItemSection>
                             <QItemSection>
                                 <QItemLabel>
                                     {{ scope.opt.nickname }}

From 63536ea0f5c7ce1f161a57d277708d6bae070a99 Mon Sep 17 00:00:00 2001
From: Javier Segarra <jsegarra@verdnatura.es>
Date: Tue, 26 Nov 2024 12:17:33 +0100
Subject: [PATCH 07/40] feat: add Options style in AddressList from OrderCreate

---
 src/pages/Order/OrderList.vue | 33 +++++++++++++++++++++++++++------
 1 file changed, 27 insertions(+), 6 deletions(-)

diff --git a/src/pages/Order/OrderList.vue b/src/pages/Order/OrderList.vue
index 52d108595..fa182bc39 100644
--- a/src/pages/Order/OrderList.vue
+++ b/src/pages/Order/OrderList.vue
@@ -149,7 +149,12 @@ onMounted(() => {
 });
 async function fetchClientAddress(id, formData = {}) {
     const { data } = await axios.get(`Clients/${id}`, {
-        params: { filter: { include: { relation: 'addresses' } } },
+        params: {
+            filter: {
+                order: ['isDefaultAddress DESC', 'isActive DESC', 'nickname ASC'],
+                include: { relation: 'addresses' },
+            },
+        },
     });
     addressesList.value = data.addresses;
     formData.addressId = data.defaultAddressFk;
@@ -191,7 +196,7 @@ const getDateColor = (date) => {
             urlCreate: 'Orders/new',
             title: t('module.cerateOrder'),
             onDataSaved: (url) => {
-               tableRef.redirect(`${url}/catalog`);
+                tableRef.redirect(`${url}/catalog`);
             },
             formInitialData: {
                 active: true,
@@ -240,12 +245,28 @@ const getDateColor = (date) => {
                 @update:model-value="() => fetchAgencies(data)"
             >
                 <template #option="scope">
-                    <QItem v-bind="scope.itemProps">
+                    <QItem
+                        v-bind="scope.itemProps"
+                        :class="{ disabled: !scope.opt.isActive }"
+                    >
+                        <QItemSection style="min-width: min-content" avatar>
+                            <QIcon
+                                v-if="
+                                    scope.opt.isActive && data.addressId === scope.opt.id
+                                "
+                                size="sm"
+                                color="grey"
+                                name="star"
+                                class="fill-icon"
+                            />
+                        </QItemSection>
                         <QItemSection>
                             <QItemLabel>
-                                {{ scope.opt?.nickname }}: {{ scope.opt?.street }},
-                                {{ scope.opt?.city }}</QItemLabel
-                            >
+                                {{ scope.opt.nickname }}
+                            </QItemLabel>
+                            <QItemLabel caption>
+                                {{ `${scope.opt.street}, ${scope.opt.city}` }}
+                            </QItemLabel>
                         </QItemSection>
                     </QItem>
                 </template>

From ac1153b14ca9804aacfda202ee8a1f269a943b54 Mon Sep 17 00:00:00 2001
From: Javier Segarra <jsegarra@verdnatura.es>
Date: Tue, 26 Nov 2024 12:26:18 +0100
Subject: [PATCH 08/40] feat: add Options style in AddressList from OrderCreate

---
 src/pages/Order/OrderList.vue | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/src/pages/Order/OrderList.vue b/src/pages/Order/OrderList.vue
index fa182bc39..ced3b9b30 100644
--- a/src/pages/Order/OrderList.vue
+++ b/src/pages/Order/OrderList.vue
@@ -235,7 +235,20 @@ const getDateColor = (date) => {
                 v-model="data.clientFk"
                 :label="t('module.customer')"
                 @update:model-value="(id) => fetchClientAddress(id, data)"
-            />
+            >
+                <template #option="scope">
+                    <QItem v-bind="scope.itemProps">
+                        <QItemSection>
+                            <QItemLabel>
+                                {{ scope.opt.name }}
+                            </QItemLabel>
+                            <QItemLabel caption>
+                                {{ `#${scope.opt.id}` }}
+                            </QItemLabel>
+                        </QItemSection>
+                    </QItem>
+                </template>
+            </VnSelect>
             <VnSelect
                 v-model="data.addressId"
                 :options="addressesList"

From 21eda340a8c5dad2f9b70456cab471aa9e389f3b Mon Sep 17 00:00:00 2001
From: Javier Segarra <jsegarra@verdnatura.es>
Date: Tue, 26 Nov 2024 22:57:47 +0100
Subject: [PATCH 09/40] fix: #6818 VnLinkPhone using spanish prefix

---
 src/components/ui/VnLinkPhone.vue |  7 ++++---
 src/filters/index.js              |  2 ++
 src/filters/parsePhone.js         | 15 +++++++++++++++
 3 files changed, 21 insertions(+), 3 deletions(-)
 create mode 100644 src/filters/parsePhone.js

diff --git a/src/components/ui/VnLinkPhone.vue b/src/components/ui/VnLinkPhone.vue
index 4c045968f..4068498cd 100644
--- a/src/components/ui/VnLinkPhone.vue
+++ b/src/components/ui/VnLinkPhone.vue
@@ -1,6 +1,7 @@
 <script setup>
 import { reactive, useAttrs, onBeforeMount, capitalize } from 'vue';
 import axios from 'axios';
+import { parsePhone } from 'src/filters';
 const props = defineProps({
     phoneNumber: { type: [String, Number], default: null },
     channel: { type: Number, default: null },
@@ -24,9 +25,9 @@ onBeforeMount(async () => {
             .data;
         if (!channel) channel = defaultChannel;
 
-        config[
-            type
-        ].href = `${url}?customerIdentity=%2B${props.phoneNumber}&channelId=${channel}`;
+        config[type].href = `${url}?customerIdentity=%2B${parsePhone(
+            props.phoneNumber
+        )}&channelId=${channel}`;
     }
 });
 </script>
diff --git a/src/filters/index.js b/src/filters/index.js
index ce5c44706..1f7ac77dd 100644
--- a/src/filters/index.js
+++ b/src/filters/index.js
@@ -12,10 +12,12 @@ import dateRange from './dateRange';
 import toHour from './toHour';
 import dashOrCurrency from './dashOrCurrency';
 import getParamWhere from './getParamWhere';
+import parsePhone from './parsePhone';
 import isDialogOpened from './isDialogOpened';
 
 export {
     isDialogOpened,
+    parsePhone,
     toLowerCase,
     toLowerCamel,
     toDate,
diff --git a/src/filters/parsePhone.js b/src/filters/parsePhone.js
new file mode 100644
index 000000000..b2d1ed7b8
--- /dev/null
+++ b/src/filters/parsePhone.js
@@ -0,0 +1,15 @@
+export default function (phone, prefix = 34) {
+    if (phone.startsWith('+')) {
+        console.log('a');
+        return `${phone.slice(1)}`;
+    }
+    if (phone.startsWith('00')) {
+        console.log('b');
+        return `${phone.slice(2)}`;
+    }
+    if (phone.startsWith(prefix) && phone.length === prefix.length + 9) {
+        console.log('c');
+        return `${prefix}${phone.slice(prefix.length)}`;
+    }
+    return `${prefix}${phone}`;
+}

From 1b3500bbce1cdfcf84bb91e11b648beb892a80e1 Mon Sep 17 00:00:00 2001
From: Javier Segarra <jsegarra@verdnatura.es>
Date: Tue, 26 Nov 2024 22:58:36 +0100
Subject: [PATCH 10/40] test: add vitest VnLinkPhone filter

---
 src/filters/parsePhone.js                     |  3 --
 .../components/common/VnLinkPhone.spec.js     | 29 +++++++++++++++++++
 2 files changed, 29 insertions(+), 3 deletions(-)
 create mode 100644 test/vitest/__tests__/components/common/VnLinkPhone.spec.js

diff --git a/src/filters/parsePhone.js b/src/filters/parsePhone.js
index b2d1ed7b8..696f55007 100644
--- a/src/filters/parsePhone.js
+++ b/src/filters/parsePhone.js
@@ -1,14 +1,11 @@
 export default function (phone, prefix = 34) {
     if (phone.startsWith('+')) {
-        console.log('a');
         return `${phone.slice(1)}`;
     }
     if (phone.startsWith('00')) {
-        console.log('b');
         return `${phone.slice(2)}`;
     }
     if (phone.startsWith(prefix) && phone.length === prefix.length + 9) {
-        console.log('c');
         return `${prefix}${phone.slice(prefix.length)}`;
     }
     return `${prefix}${phone}`;
diff --git a/test/vitest/__tests__/components/common/VnLinkPhone.spec.js b/test/vitest/__tests__/components/common/VnLinkPhone.spec.js
new file mode 100644
index 000000000..1d679d979
--- /dev/null
+++ b/test/vitest/__tests__/components/common/VnLinkPhone.spec.js
@@ -0,0 +1,29 @@
+import { describe, it, expect } from 'vitest';
+import parsePhone from 'src/filters/parsePhone';
+
+describe.only('parsePhone filter', () => {
+    it("adds prefix +34 if it doesn't have one", () => {
+        const resultado = parsePhone('123456789', '34');
+        expect(resultado).toBe('34123456789');
+    });
+
+    it('maintains prefix +34 if it is already correct', () => {
+        const resultado = parsePhone('+34123456789', '34');
+        expect(resultado).toBe('34123456789');
+    });
+
+    it('converts prefix 0034 to +34', () => {
+        const resultado = parsePhone('0034123456789', '34');
+        expect(resultado).toBe('34123456789');
+    });
+
+    it('converts prefix 34 without symbol to +34', () => {
+        const resultado = parsePhone('34123456789', '34');
+        expect(resultado).toBe('34123456789');
+    });
+
+    it.only('replaces incorrect prefix with the correct one', () => {
+        const resultado = parsePhone('+44123456789', '34');
+        expect(resultado).toBe('44123456789');
+    });
+});

From 4539a73efcbd4b420a8118acfd2fbbcf46ada909 Mon Sep 17 00:00:00 2001
From: Javier Segarra <jsegarra@verdnatura.es>
Date: Tue, 26 Nov 2024 23:34:57 +0100
Subject: [PATCH 11/40] test: improve clientList

---
 .../integration/client/clientList.spec.js       | 17 +++++++----------
 test/cypress/support/commands.js                |  6 +++---
 2 files changed, 10 insertions(+), 13 deletions(-)

diff --git a/test/cypress/integration/client/clientList.spec.js b/test/cypress/integration/client/clientList.spec.js
index 5529e5c65..e89b5fc77 100644
--- a/test/cypress/integration/client/clientList.spec.js
+++ b/test/cypress/integration/client/clientList.spec.js
@@ -17,12 +17,14 @@ describe('Client list', () => {
 
     it('Client list create new client', () => {
         cy.get('.q-page-sticky > div > .q-btn > .q-btn__content > .q-icon').click();
+        const randomInt = Math.floor(Math.random() * 90) + 10;
+
         const data = {
-            Name: { val: 'Name 1' },
-            'Social name': { val: 'TEST 1' },
-            'Tax number': { val: '20852113Z' },
-            'Web user': { val: 'user_test_1' },
-            Street: { val: 'C/ STREET 1' },
+            Name: { val: `Name ${randomInt}` },
+            'Social name': { val: `TEST ${randomInt}` },
+            'Tax number': { val: `20852${randomInt.length}3Z` },
+            'Web user': { val: `user_test_${randomInt}` },
+            Street: { val: `C/ STREET ${randomInt}` },
             Email: { val: 'user.test@1.com' },
             'Sales person': { val: 'employee', type: 'select' },
             Location: { val: '46000, Valencia(Province one), España', type: 'select' },
@@ -54,11 +56,8 @@ describe('Client list', () => {
         cy.openActionDescriptor('Create ticket');
         cy.waitForElement('#formModel');
         cy.waitForElement('.q-form');
-
         cy.checkValueForm(1, search);
         cy.checkValueForm(2, search);
-        cy.get('.grid-create >:nth-child(1)').find('input').should('have.value', search);
-        cy.get('.grid-create >:nth-child(2)').find('input').should('have.value', search);
     });
     it('Client founded create order', () => {
         const search = 'Jessica Jones';
@@ -68,7 +67,5 @@ describe('Client list', () => {
         cy.waitForElement('.q-form');
         cy.checkValueForm(1, search);
         cy.checkValueForm(2, search);
-        cy.get('.grid-create >:nth-child(2)').find('input').should('have.value', search);
-        cy.get('.grid-create >:nth-child(4)').find('input').should('have.value', search);
     });
 });
diff --git a/test/cypress/support/commands.js b/test/cypress/support/commands.js
index e5ebc37d7..cb1d3de44 100755
--- a/test/cypress/support/commands.js
+++ b/test/cypress/support/commands.js
@@ -323,9 +323,9 @@ Cypress.Commands.add('openActions', (row) => {
 });
 
 Cypress.Commands.add('checkValueForm', (id, search) => {
-    cy.get(
-        `.grid-create > :nth-child(${id}) > .q-field__inner > .q-field__control > .q-field__control-container > .q-field__native > .q-field__input`
-    ).should('have.value', search);
+    cy.get(`.grid-create > :nth-child(${id}) `)
+        .find('input')
+        .should('have.value', search);
 });
 
 Cypress.Commands.add('checkValueSelectForm', (id, search) => {

From bc0d7f110d0e8e1a77ce4a0e5472b68db9d86e84 Mon Sep 17 00:00:00 2001
From: Javier Segarra <jsegarra@verdnatura.es>
Date: Tue, 26 Nov 2024 23:48:47 +0100
Subject: [PATCH 12/40] fix: apply dataByOrder

---
 src/pages/Order/OrderList.vue | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/pages/Order/OrderList.vue b/src/pages/Order/OrderList.vue
index ced3b9b30..c47a9b2ec 100644
--- a/src/pages/Order/OrderList.vue
+++ b/src/pages/Order/OrderList.vue
@@ -15,6 +15,7 @@ import CustomerDescriptorProxy from '../Customer/Card/CustomerDescriptorProxy.vu
 import WorkerDescriptorProxy from '../Worker/Card/WorkerDescriptorProxy.vue';
 import { toDateTimeFormat } from 'src/filters/date';
 import { useRoute } from 'vue-router';
+import dataByOrder from 'src/utils/dataByOrder';
 
 const { t } = useI18n();
 const { viewSummary } = useSummaryDialog();
@@ -167,7 +168,7 @@ async function fetchAgencies({ landed, addressId }) {
     const { data } = await axios.get('Agencies/landsThatDay', {
         params: { addressFk: addressId, landed },
     });
-    agencyList.value = data;
+    agencyList.value = dataByOrder(data, 'agencyMode ASC');
 }
 
 const getDateColor = (date) => {

From ff91ca2dfe6699ae40a6d17867baf18364280f40 Mon Sep 17 00:00:00 2001
From: Javier Segarra <jsegarra@verdnatura.es>
Date: Tue, 26 Nov 2024 23:57:10 +0100
Subject: [PATCH 13/40] feat: remove More options separator

---
 src/i18n/locale/en.yml                    |   1 -
 src/pages/Customer/CustomerFilter.vue     |  69 +++++-----
 src/pages/InvoiceIn/InvoiceInFilter.vue   |   1 -
 src/pages/InvoiceOut/InvoiceOutFilter.vue |  54 ++++----
 src/pages/Ticket/TicketFilter.vue         | 148 +++++++++++-----------
 5 files changed, 128 insertions(+), 145 deletions(-)

diff --git a/src/i18n/locale/en.yml b/src/i18n/locale/en.yml
index e2e0e4238..3e3df7a0f 100644
--- a/src/i18n/locale/en.yml
+++ b/src/i18n/locale/en.yml
@@ -861,7 +861,6 @@ components:
     cardDescriptor:
         mainList: Main list
         summary: Summary
-        moreOptions: More options
     leftMenu:
         addToPinned: Add to pinned
         removeFromPinned: Remove from pinned
diff --git a/src/pages/Customer/CustomerFilter.vue b/src/pages/Customer/CustomerFilter.vue
index 79d48a667..cd567d415 100644
--- a/src/pages/Customer/CustomerFilter.vue
+++ b/src/pages/Customer/CustomerFilter.vue
@@ -101,8 +101,8 @@ const exprBuilder = (param, value) => {
                 </QItemSection>
             </QItem>
             <QItem class="q-mb-sm">
-                <QItemSection
-                    ><VnSelect
+                <QItemSection>
+                    <VnSelect
                         url="Provinces"
                         :label="t('Province')"
                         v-model="params.provinceFk"
@@ -120,32 +120,31 @@ const exprBuilder = (param, value) => {
                     />
                 </QItemSection>
             </QItem>
-            <QItem class="q-mb-md">
+            <QItem class="q-mb-sm">
                 <QItemSection>
                     <VnInput :label="t('City')" v-model="params.city" is-outlined />
                 </QItemSection>
             </QItem>
-            <QSeparator />
-            <QExpansionItem :label="t('More options')" expand-separator>
-                <QItem>
-                    <QItemSection>
-                        <VnInput :label="t('Phone')" v-model="params.phone" is-outlined>
-                            <template #prepend>
-                                <QIcon name="phone" size="xs" />
-                            </template>
-                        </VnInput>
-                    </QItemSection>
-                </QItem>
-                <QItem>
-                    <QItemSection>
-                        <VnInput :label="t('Email')" v-model="params.email" is-outlined>
-                            <template #prepend>
-                                <QIcon name="email" size="sm" />
-                            </template>
-                        </VnInput>
-                    </QItemSection>
-                </QItem>
-                <QItem>
+            <QItem class="q-mb-sm">
+                <QItemSection>
+                    <VnInput :label="t('Phone')" v-model="params.phone" is-outlined>
+                        <template #prepend>
+                            <QIcon name="phone" size="xs" />
+                        </template>
+                    </VnInput>
+                </QItemSection>
+            </QItem>
+            <QItem class="q-mb-sm">
+                <QItemSection>
+                    <VnInput :label="t('Email')" v-model="params.email" is-outlined>
+                        <template #prepend>
+                            <QIcon name="email" size="sm" />
+                        </template>
+                    </VnInput>
+                </QItemSection>
+            </QItem>
+            <QItem class="q-mb-sm">
+                <QItemSection>
                     <VnSelect
                         url="Zones"
                         :label="t('Zone')"
@@ -160,18 +159,17 @@ const exprBuilder = (param, value) => {
                         outlined
                         rounded
                         auto-load
+                /></QItemSection>
+            </QItem>
+            <QItem class="q-mb-sm">
+                <QItemSection>
+                    <VnInput
+                        :label="t('Postcode')"
+                        v-model="params.postcode"
+                        is-outlined
                     />
-                </QItem>
-                <QItem>
-                    <QItemSection>
-                        <VnInput
-                            :label="t('Postcode')"
-                            v-model="params.postcode"
-                            is-outlined
-                        />
-                    </QItemSection>
-                </QItem>
-            </QExpansionItem>
+                </QItemSection>
+            </QItem>
         </template>
     </VnFilterPanel>
 </template>
@@ -203,7 +201,6 @@ es:
     Salesperson: Comercial
     Province: Provincia
     City: Ciudad
-    More options: Más opciones
     Phone: Teléfono
     Email: Email
     Zone: Zona
diff --git a/src/pages/InvoiceIn/InvoiceInFilter.vue b/src/pages/InvoiceIn/InvoiceInFilter.vue
index d1c0856b5..130a77960 100644
--- a/src/pages/InvoiceIn/InvoiceInFilter.vue
+++ b/src/pages/InvoiceIn/InvoiceInFilter.vue
@@ -184,5 +184,4 @@ es:
     Amount: Importe
     Issued: Fecha factura
     Id or supplier: Id o proveedor
-    More options: Más opciones
 </i18n>
diff --git a/src/pages/InvoiceOut/InvoiceOutFilter.vue b/src/pages/InvoiceOut/InvoiceOutFilter.vue
index 9ce8cc254..dc1d833a2 100644
--- a/src/pages/InvoiceOut/InvoiceOutFilter.vue
+++ b/src/pages/InvoiceOut/InvoiceOutFilter.vue
@@ -83,36 +83,29 @@ const states = ref();
                     />
                 </QItemSection>
             </QItem>
-            <QSeparator />
-            <QExpansionItem :label="t('More options')" expand-separator>
-                <QItem>
-                    <QItemSection>
-                        <VnInputDate
-                            v-model="params.issued"
-                            :label="t('Issued')"
-                            is-outlined
-                        />
-                    </QItemSection>
-                </QItem>
-                <QItem>
-                    <QItemSection>
-                        <VnInputDate
-                            v-model="params.created"
-                            :label="t('Created')"
-                            is-outlined
-                        />
-                    </QItemSection>
-                </QItem>
-                <QItem>
-                    <QItemSection>
-                        <VnInputDate
-                            v-model="params.dued"
-                            :label="t('Dued')"
-                            is-outlined
-                        />
-                    </QItemSection>
-                </QItem>
-            </QExpansionItem>
+            <QItem>
+                <QItemSection>
+                    <VnInputDate
+                        v-model="params.issued"
+                        :label="t('Issued')"
+                        is-outlined
+                    />
+                </QItemSection>
+            </QItem>
+            <QItem>
+                <QItemSection>
+                    <VnInputDate
+                        v-model="params.created"
+                        :label="t('Created')"
+                        is-outlined
+                    />
+                </QItemSection>
+            </QItem>
+            <QItem>
+                <QItemSection>
+                    <VnInputDate v-model="params.dued" :label="t('Dued')" is-outlined />
+                </QItemSection>
+            </QItem>
         </template>
     </VnFilterPanel>
 </template>
@@ -149,5 +142,4 @@ es:
     Issued: Fecha emisión
     Created: Fecha creación
     Dued: Fecha vencimiento
-    More options: Más opciones
 </i18n>
diff --git a/src/pages/Ticket/TicketFilter.vue b/src/pages/Ticket/TicketFilter.vue
index 6f1cac83b..bde27f30e 100644
--- a/src/pages/Ticket/TicketFilter.vue
+++ b/src/pages/Ticket/TicketFilter.vue
@@ -212,81 +212,78 @@ const getGroupedStates = (data) => {
                     />
                 </QItemSection>
             </QItem>
-            <QSeparator />
-            <QExpansionItem :label="t('More options')" expand-separator>
-                <QItem>
-                    <QItemSection v-if="!provinces">
-                        <QSkeleton type="QInput" class="full-width" />
-                    </QItemSection>
-                    <QItemSection v-if="provinces">
-                        <QSelect
-                            :label="t('Province')"
-                            v-model="params.provinceFk"
-                            @update:model-value="searchFn()"
-                            :options="provinces"
-                            option-value="id"
-                            option-label="name"
-                            emit-value
-                            map-options
-                            use-input
-                            dense
-                            outlined
-                            rounded
-                        />
-                    </QItemSection>
-                </QItem>
-                <QItem>
-                    <QItemSection v-if="!agencies">
-                        <QSkeleton type="QInput" class="full-width" />
-                    </QItemSection>
-                    <QItemSection v-if="agencies">
-                        <QSelect
-                            :label="t('Agency')"
-                            v-model="params.agencyModeFk"
-                            @update:model-value="searchFn()"
-                            :options="agencies"
-                            option-value="id"
-                            option-label="name"
-                            emit-value
-                            map-options
-                            use-input
-                            dense
-                            outlined
-                            rounded
-                        />
-                    </QItemSection>
-                </QItem>
-                <QItem>
-                    <QItemSection v-if="!warehouses">
-                        <QSkeleton type="QInput" class="full-width" />
-                    </QItemSection>
-                    <QItemSection v-if="warehouses">
-                        <QSelect
-                            :label="t('Warehouse')"
-                            v-model="params.warehouseFk"
-                            @update:model-value="searchFn()"
-                            :options="warehouses"
-                            option-value="id"
-                            option-label="name"
-                            emit-value
-                            map-options
-                            use-input
-                            dense
-                            outlined
-                            rounded
-                        />
-                    </QItemSection>
-                </QItem>
-                <QItem>
-                    <QItemSection>
-                        <VnInput
-                            v-model="params.collectionFk"
-                            :label="t('Collection')"
-                            is-outlined
-                        />
-                    </QItemSection>
-                </QItem>
-            </QExpansionItem>
+            <QItem>
+                <QItemSection v-if="!provinces">
+                    <QSkeleton type="QInput" class="full-width" />
+                </QItemSection>
+                <QItemSection v-if="provinces">
+                    <QSelect
+                        :label="t('Province')"
+                        v-model="params.provinceFk"
+                        @update:model-value="searchFn()"
+                        :options="provinces"
+                        option-value="id"
+                        option-label="name"
+                        emit-value
+                        map-options
+                        use-input
+                        dense
+                        outlined
+                        rounded
+                    />
+                </QItemSection>
+            </QItem>
+            <QItem>
+                <QItemSection v-if="!agencies">
+                    <QSkeleton type="QInput" class="full-width" />
+                </QItemSection>
+                <QItemSection v-if="agencies">
+                    <QSelect
+                        :label="t('Agency')"
+                        v-model="params.agencyModeFk"
+                        @update:model-value="searchFn()"
+                        :options="agencies"
+                        option-value="id"
+                        option-label="name"
+                        emit-value
+                        map-options
+                        use-input
+                        dense
+                        outlined
+                        rounded
+                    />
+                </QItemSection>
+            </QItem>
+            <QItem>
+                <QItemSection v-if="!warehouses">
+                    <QSkeleton type="QInput" class="full-width" />
+                </QItemSection>
+                <QItemSection v-if="warehouses">
+                    <QSelect
+                        :label="t('Warehouse')"
+                        v-model="params.warehouseFk"
+                        @update:model-value="searchFn()"
+                        :options="warehouses"
+                        option-value="id"
+                        option-label="name"
+                        emit-value
+                        map-options
+                        use-input
+                        dense
+                        outlined
+                        rounded
+                    />
+                </QItemSection>
+            </QItem>
+            <QItem>
+                <QItemSection>
+                    <VnInput
+                        v-model="params.collectionFk"
+                        :label="t('Collection')"
+                        is-outlined
+                    />
+                </QItemSection>
+            </QItem>
         </template>
     </VnFilterPanel>
 </template>
@@ -340,7 +337,6 @@ es:
     With problems: Con problemas
     Invoiced: Facturado
     Routed: Enrutado
-    More options: Más opciones
     Province: Provincia
     Agency: Agencia
     Warehouse: Almacén

From a2d84c48c0cfcde23cb52a66694716756ffcaaa8 Mon Sep 17 00:00:00 2001
From: wbuezas <wbuezas@verdnatura.es>
Date: Tue, 26 Nov 2024 21:05:47 -0300
Subject: [PATCH 14/40] refactor: remove unnecesary things

---
 src/pages/Order/Card/OrderCatalog.vue                     | 1 -
 test/cypress/integration/claim/Order/catalogTests.spec.js | 7 -------
 2 files changed, 8 deletions(-)

diff --git a/src/pages/Order/Card/OrderCatalog.vue b/src/pages/Order/Card/OrderCatalog.vue
index f3e70cd6f..a71065521 100644
--- a/src/pages/Order/Card/OrderCatalog.vue
+++ b/src/pages/Order/Card/OrderCatalog.vue
@@ -106,7 +106,6 @@ watch(
                 :limit="50"
                 :user-params="catalogParams"
                 :auto-load="autoLoad"
-                data-cy="orderCatalogPage"
             >
                 <template #body="{ rows }">
                     <div class="catalog-list">
diff --git a/test/cypress/integration/claim/Order/catalogTests.spec.js b/test/cypress/integration/claim/Order/catalogTests.spec.js
index da0e7869a..06e0d7820 100644
--- a/test/cypress/integration/claim/Order/catalogTests.spec.js
+++ b/test/cypress/integration/claim/Order/catalogTests.spec.js
@@ -42,31 +42,26 @@ describe('OrderCatalog', () => {
     };
 
     it('Shows empty state', () => {
-        // PASS;
         cy.dataCy('orderCatalogPage').should('exist');
         cy.dataCy('orderCatalogPage').contains('No data to display');
     });
 
     it('filter by category', () => {
-        // PASS;
         selectCategory();
         cy.dataCy('orderCatalogItem').should('exist');
     });
 
     it('filters by type', () => {
-        // PASS;
         selectCategory();
         selectTypeFilter('Anthurium');
     });
 
     it('filters by custom value select', () => {
-        // PASS
         selectCategory();
         searchByCustomTagInput('Silver');
     });
 
     it('filters by custom value dialog', () => {
-        // PASS
         Cypress.on('uncaught:exception', (err) => {
             if (err.message.includes('canceled')) {
                 return false;
@@ -87,7 +82,6 @@ describe('OrderCatalog', () => {
     });
 
     it('removes a secondary tag', () => {
-        // PASS
         selectCategory();
         selectTypeFilter('Anthurium');
         cy.dataCy('vnFilterPanelChip').should('exist');
@@ -105,7 +99,6 @@ describe('OrderCatalog', () => {
     });
 
     it('Removes category tag', () => {
-        // PASS
         selectCategory();
         cy.get(
             "div.q-page-container [data-cy='catalogFilterCustomTag'] > i.q-chip__icon--remove"

From e3bdea2197624047e62aa27712783053c45ee822 Mon Sep 17 00:00:00 2001
From: Javier Segarra <jsegarra@verdnatura.es>
Date: Wed, 27 Nov 2024 01:15:16 +0100
Subject: [PATCH 15/40] fix: ticketSale keyup.enter

---
 src/pages/Ticket/Card/TicketSale.vue | 50 ++++++++++++++--------------
 1 file changed, 25 insertions(+), 25 deletions(-)

diff --git a/src/pages/Ticket/Card/TicketSale.vue b/src/pages/Ticket/Card/TicketSale.vue
index 08cdcb9df..95ef3118e 100644
--- a/src/pages/Ticket/Card/TicketSale.vue
+++ b/src/pages/Ticket/Card/TicketSale.vue
@@ -181,17 +181,34 @@ const resetChanges = async () => {
     arrayData.fetch({ append: false });
     tableRef.value.reload();
 };
+const rowToUpdate = ref(null);
+const changeQuantity = async (sale) => {
+    canProceed.value = await isSalePrepared(sale);
+    if (!canProceed.value) return;
+    if (
+        !sale.itemFk ||
+        sale.quantity == null ||
+        edit.value?.oldQuantity === sale.quantity
+    )
+        return;
+    if (!sale.id) return addSale(sale);
 
-const updateQuantity = async (sale) => {
-    const params = { quantity: sale.quantity };
     try {
-        await axios.post(`Sales/${sale.id}/updateQuantity`, params);
+        if (!rowToUpdate.value) return;
+        rowToUpdate.value = null;
+        await updateQuantity(sale);
     } catch (e) {
-        sale.quantity = tableRef.value.CrudModelRef.originalData.find(
+        const { quantity } = tableRef.value.CrudModelRef.originalData.find(
             (s) => s.id === sale.id
-        ).quantity;
+        );
+        sale.quantity = quantity;
         throw e;
     }
+};
+
+const updateQuantity = async ({ quantity, id }) => {
+    const params = { quantity: quantity };
+    await axios.post(`Sales/${id}/updateQuantity`, params);
     notify('globals.dataSaved', 'positive');
 };
 
@@ -219,19 +236,6 @@ const addSale = async (sale) => {
     window.location.reload();
 };
 
-const changeQuantity = async (sale) => {
-    canProceed.value = await isSalePrepared(sale);
-    if (!canProceed.value) return;
-    if (
-        !sale.itemFk ||
-        sale.quantity == null ||
-        edit.value?.oldQuantity === sale.quantity
-    )
-        return;
-    if (!sale.id) return addSale(sale);
-    await updateQuantity(sale);
-};
-
 const updateConcept = async (sale) => {
     canProceed.value = await isSalePrepared(sale);
     if (!canProceed.value) return;
@@ -768,16 +772,12 @@ watch(
         </template>
         <template #column-quantity="{ row }">
             <VnInput
-                v-if="row.isNew"
-                v-model.number="row.quantity"
+                v-if="row.isNew || isTicketEditable"
                 type="number"
-                @blur="changeQuantity(row)"
-                @focus="edit.oldQuantity = row.quantity"
-            />
-            <VnInput
-                v-else-if="isTicketEditable"
                 v-model.number="row.quantity"
                 @blur="changeQuantity(row)"
+                @keyup.enter="changeQuantity(row)"
+                @update:model-value="() => (rowToUpdate = row)"
                 @focus="edit.oldQuantity = row.quantity"
             />
             <span v-else>{{ row.quantity }}</span>

From 72a481ae5b4aed6768b7db6be2fdbb3c7520093b Mon Sep 17 00:00:00 2001
From: Javier Segarra <jsegarra@verdnatura.es>
Date: Wed, 27 Nov 2024 01:30:42 +0100
Subject: [PATCH 16/40] test: remove only

---
 test/vitest/__tests__/components/common/VnLinkPhone.spec.js | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/test/vitest/__tests__/components/common/VnLinkPhone.spec.js b/test/vitest/__tests__/components/common/VnLinkPhone.spec.js
index 1d679d979..e460ab2fc 100644
--- a/test/vitest/__tests__/components/common/VnLinkPhone.spec.js
+++ b/test/vitest/__tests__/components/common/VnLinkPhone.spec.js
@@ -1,7 +1,7 @@
 import { describe, it, expect } from 'vitest';
 import parsePhone from 'src/filters/parsePhone';
 
-describe.only('parsePhone filter', () => {
+describe('parsePhone filter', () => {
     it("adds prefix +34 if it doesn't have one", () => {
         const resultado = parsePhone('123456789', '34');
         expect(resultado).toBe('34123456789');
@@ -22,7 +22,7 @@ describe.only('parsePhone filter', () => {
         expect(resultado).toBe('34123456789');
     });
 
-    it.only('replaces incorrect prefix with the correct one', () => {
+    it('replaces incorrect prefix with the correct one', () => {
         const resultado = parsePhone('+44123456789', '34');
         expect(resultado).toBe('44123456789');
     });

From 4a562acd9226216f3245dfd28e7ca8ac88966801 Mon Sep 17 00:00:00 2001
From: wbuezas <wbuezas@verdnatura.es>
Date: Tue, 26 Nov 2024 21:58:30 -0300
Subject: [PATCH 17/40] test: change selector

---
 test/cypress/integration/claim/Order/catalogTests.spec.js | 5 +----
 1 file changed, 1 insertion(+), 4 deletions(-)

diff --git a/test/cypress/integration/claim/Order/catalogTests.spec.js b/test/cypress/integration/claim/Order/catalogTests.spec.js
index 06e0d7820..45eda6f1f 100644
--- a/test/cypress/integration/claim/Order/catalogTests.spec.js
+++ b/test/cypress/integration/claim/Order/catalogTests.spec.js
@@ -71,10 +71,7 @@ describe('OrderCatalog', () => {
         cy.dataCy('catalogFilterValueDialogBtn').should('exist');
         cy.dataCy('catalogFilterValueDialogBtn').last().click();
         cy.dataCy('catalogFilterValueDialogTagSelect').should('exist');
-        cy.selectOption(
-            "[data-cy='catalogFilterValueDialog'] > label > div > div > div",
-            'Tallos'
-        );
+        cy.selectOption("[data-cy='catalogFilterValueDialogTagSelect']", 'Tallos');
         cy.dataCy('catalogFilterValueDialogValueInput').find('input').focus();
         cy.dataCy('catalogFilterValueDialogValueInput').find('input').type('2');
         cy.dataCy('catalogFilterValueDialogValueInput').find('input').type('{enter}');

From 07ba02aec87970886f32616fb95fe4707d3e6125 Mon Sep 17 00:00:00 2001
From: Jon <jon@verdnatura.es>
Date: Wed, 27 Nov 2024 08:02:18 +0100
Subject: [PATCH 18/40] fix: fixed delete event and dated value when excluding
 a day

---
 src/pages/Zone/Card/ZoneEventExclusionForm.vue | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/src/pages/Zone/Card/ZoneEventExclusionForm.vue b/src/pages/Zone/Card/ZoneEventExclusionForm.vue
index 1027fc54f..9c6825c48 100644
--- a/src/pages/Zone/Card/ZoneEventExclusionForm.vue
+++ b/src/pages/Zone/Card/ZoneEventExclusionForm.vue
@@ -1,5 +1,5 @@
 <script setup>
-import { ref, computed, onMounted } from 'vue';
+import { ref, computed, onMounted, reactive } from 'vue';
 import { useI18n } from 'vue-i18n';
 import { useRoute } from 'vue-router';
 
@@ -43,7 +43,7 @@ const { t } = useI18n();
 const { openConfirmationModal } = useVnConfirm();
 
 const isNew = computed(() => props.isNewMode);
-const dated = ref(props.date);
+const dated = reactive(props.date);
 const tickedNodes = ref();
 
 const _excludeType = ref('all');
@@ -68,12 +68,11 @@ const exclusionGeoCreate = async () => {
 
 const exclusionCreate = async () => {
     if (isNew.value)
-        await axios.post(`Zones/${route.params.id}/exclusions`, [{ dated: dated.value }]);
+        await axios.post(`Zones/${route.params.id}/exclusions`, [{ dated: dated }]);
     else
         await axios.post(`Zones/${route.params.id}/exclusions`, {
-            dated: dated.value,
+            dated: dated,
         });
-
     await refetchEvents();
 };
 
@@ -84,7 +83,8 @@ const onSubmit = async () => {
 
 const deleteEvent = async () => {
     if (!props.event) return;
-    await axios.delete(`Zones/${route.params.id}/exclusions`);
+    const exclusionId = props.event?.zoneExclusionFk || props.event?.id;
+    await axios.delete(`Zones/${route.params.id}/exclusions/${exclusionId}`);
     await refetchEvents();
 };
 

From e764f4066ff3e63a2d95ca588a32fc5602c7d20c Mon Sep 17 00:00:00 2001
From: Jon <jon@verdnatura.es>
Date: Wed, 27 Nov 2024 12:53:07 +0100
Subject: [PATCH 19/40] fix: ticket notes translation and deleted useless code

---
 src/pages/Ticket/Card/TicketSummary.vue        | 2 +-
 src/pages/Zone/Card/ZoneEventExclusionForm.vue | 7 +------
 2 files changed, 2 insertions(+), 7 deletions(-)

diff --git a/src/pages/Ticket/Card/TicketSummary.vue b/src/pages/Ticket/Card/TicketSummary.vue
index 1ff0d6d80..6697f644a 100644
--- a/src/pages/Ticket/Card/TicketSummary.vue
+++ b/src/pages/Ticket/Card/TicketSummary.vue
@@ -269,7 +269,7 @@ function toTicketUrl(section) {
             <QCard class="vn-one" v-if="entity.notes.length">
                 <VnTitle
                     :url="toTicketUrl('observation')"
-                    :text="t('ticket.pageTitles.notes')"
+                    :text="t('globals.pageTitles.notes')"
                 />
                 <QVirtualScroll
                     :items="entity.notes"
diff --git a/src/pages/Zone/Card/ZoneEventExclusionForm.vue b/src/pages/Zone/Card/ZoneEventExclusionForm.vue
index 9c6825c48..adbf8f47e 100644
--- a/src/pages/Zone/Card/ZoneEventExclusionForm.vue
+++ b/src/pages/Zone/Card/ZoneEventExclusionForm.vue
@@ -67,12 +67,7 @@ const exclusionGeoCreate = async () => {
 };
 
 const exclusionCreate = async () => {
-    if (isNew.value)
-        await axios.post(`Zones/${route.params.id}/exclusions`, [{ dated: dated }]);
-    else
-        await axios.post(`Zones/${route.params.id}/exclusions`, {
-            dated: dated,
-        });
+    await axios.post(`Zones/${route.params.id}/exclusions`, [{ dated: dated }]);
     await refetchEvents();
 };
 

From 7d28037c29a89ed9a9a09cd7afcb99e6d557541f Mon Sep 17 00:00:00 2001
From: Jon <jon@verdnatura.es>
Date: Wed, 27 Nov 2024 14:09:37 +0100
Subject: [PATCH 20/40] fix: fixed ref filter in InvoiceOutList

---
 src/pages/InvoiceOut/InvoiceOutList.vue | 38 ++++++++++++-------------
 1 file changed, 18 insertions(+), 20 deletions(-)

diff --git a/src/pages/InvoiceOut/InvoiceOutList.vue b/src/pages/InvoiceOut/InvoiceOutList.vue
index 092844386..f5a4f7d80 100644
--- a/src/pages/InvoiceOut/InvoiceOutList.vue
+++ b/src/pages/InvoiceOut/InvoiceOutList.vue
@@ -43,16 +43,17 @@ const columns = computed(() => [
     {
         align: 'left',
         name: 'ref',
-        label: t('invoiceOutList.tableVisibleColumns.ref'),
+        label: t('globals.reference'),
         isTitle: true,
         component: 'select',
         attrs: {
             url: MODEL,
             optionLabel: 'ref',
-            optionValue: 'id',
+            optionValue: 'ref',
         },
-        columnField: {
-            component: null,
+        columnField: { component: null },
+        columnFilter: {
+            inWhere: true,
         },
     },
     {
@@ -147,25 +148,22 @@ function openPdf(id) {
 }
 
 function downloadPdf() {
-        if (selectedRows.value.size === 0) return;
-        const selectedCardsArray = Array.from(selectedRows.value.values());
+    if (selectedRows.value.size === 0) return;
+    const selectedCardsArray = Array.from(selectedRows.value.values());
 
-        if (selectedRows.value.size === 1) {
-            const [invoiceOut] = selectedCardsArray;
-            openPdf(invoiceOut.id);
-        } else {
-            const invoiceOutIdsArray = selectedCardsArray.map(
-                (invoiceOut) => invoiceOut.id
-            );
-            const invoiceOutIds = invoiceOutIdsArray.join(',');
+    if (selectedRows.value.size === 1) {
+        const [invoiceOut] = selectedCardsArray;
+        openPdf(invoiceOut.id);
+    } else {
+        const invoiceOutIdsArray = selectedCardsArray.map((invoiceOut) => invoiceOut.id);
+        const invoiceOutIds = invoiceOutIdsArray.join(',');
 
-            const params = {
-                ids: invoiceOutIds,
-            };
-
-            openReport(`${MODEL}/downloadZip`, params);
-        }
+        const params = {
+            ids: invoiceOutIds,
+        };
 
+        openReport(`${MODEL}/downloadZip`, params);
+    }
 }
 
 watchEffect(selectedRows);

From 33de645e37bd9ac0d9942e6d8d07ca7a0445c5c4 Mon Sep 17 00:00:00 2001
From: jorgep <jorgep@verdnatura.es>
Date: Wed, 27 Nov 2024 17:02:41 +0100
Subject: [PATCH 21/40] fix: not fetch on mounted

---
 src/components/ui/VnPaginate.vue | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/components/ui/VnPaginate.vue b/src/components/ui/VnPaginate.vue
index f3f6d64f1..3649ba8f5 100644
--- a/src/components/ui/VnPaginate.vue
+++ b/src/components/ui/VnPaginate.vue
@@ -133,7 +133,7 @@ const addFilter = async (filter, params) => {
 async function fetch(params) {
     useArrayData(props.dataKey, params);
     arrayData.reset(['filter.skip', 'skip', 'page']);
-    await arrayData.fetch({ append: false });
+    await arrayData.fetch({ append: false, updateRouter: mounted.value });
     return emitStoreData();
 }
 

From 63f0db459c8aec1eac2f8741f61f502bb1ebf193 Mon Sep 17 00:00:00 2001
From: wbuezas <wbuezas@verdnatura.es>
Date: Wed, 27 Nov 2024 16:17:37 -0300
Subject: [PATCH 22/40] test: change file name and path

---
 .../Order/catalogTests.spec.js => Order/orderCatalog.spec.js}     | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename test/cypress/integration/{claim/Order/catalogTests.spec.js => Order/orderCatalog.spec.js} (100%)

diff --git a/test/cypress/integration/claim/Order/catalogTests.spec.js b/test/cypress/integration/Order/orderCatalog.spec.js
similarity index 100%
rename from test/cypress/integration/claim/Order/catalogTests.spec.js
rename to test/cypress/integration/Order/orderCatalog.spec.js

From 507b78f5e8c50082592133ff3568ad511e3431de Mon Sep 17 00:00:00 2001
From: Javier Segarra <jsegarra@verdnatura.es>
Date: Wed, 27 Nov 2024 22:33:00 +0100
Subject: [PATCH 23/40] perf: refs #8061 filter autonomy

---
 src/components/CreateNewCityForm.vue     |  2 ++
 src/components/CreateNewPostcodeForm.vue |  4 ++++
 src/components/CreateNewProvinceForm.vue | 28 +++++++++---------------
 3 files changed, 16 insertions(+), 18 deletions(-)

diff --git a/src/components/CreateNewCityForm.vue b/src/components/CreateNewCityForm.vue
index e51a18ef8..1cbba42fc 100644
--- a/src/components/CreateNewCityForm.vue
+++ b/src/components/CreateNewCityForm.vue
@@ -47,11 +47,13 @@ const onDataSaved = (...args) => {
                     :label="t('Name')"
                     v-model="data.name"
                     :rules="validate('city.name')"
+                    required
                 />
                 <VnSelectProvince
                     :province-selected="$props.provinceSelected"
                     :country-fk="$props.countryFk"
                     v-model="data.provinceFk"
+                    required
                 />
             </VnRow>
         </template>
diff --git a/src/components/CreateNewPostcodeForm.vue b/src/components/CreateNewPostcodeForm.vue
index 907e49499..66b2a30d3 100644
--- a/src/components/CreateNewPostcodeForm.vue
+++ b/src/components/CreateNewPostcodeForm.vue
@@ -174,6 +174,7 @@ async function onProvinceCreated(data) {
                     v-model="data.code"
                     :rules="validate('postcode.code')"
                     clearable
+                    required
                 />
                 <VnSelectDialog
                     :label="t('City')"
@@ -188,6 +189,7 @@ async function onProvinceCreated(data) {
                     :acls="[{ model: 'Town', props: '*', accessType: 'WRITE' }]"
                     :emit-value="false"
                     :clearable="true"
+                    required
                 >
                     <template #option="{ itemProps, opt }">
                         <QItem v-bind="itemProps">
@@ -220,8 +222,10 @@ async function onProvinceCreated(data) {
                     v-model="data.provinceFk"
                     @on-province-fetched="handleProvinces"
                     @on-province-created="onProvinceCreated"
+                    required
                 />
                 <VnSelect
+                    required
                     :label="t('Country')"
                     @update:options="handleCountries"
                     :options="countriesOptions"
diff --git a/src/components/CreateNewProvinceForm.vue b/src/components/CreateNewProvinceForm.vue
index a0e681f77..887ca957c 100644
--- a/src/components/CreateNewProvinceForm.vue
+++ b/src/components/CreateNewProvinceForm.vue
@@ -2,7 +2,6 @@
 import { computed, reactive, ref } from 'vue';
 import { useI18n } from 'vue-i18n';
 
-import FetchData from 'components/FetchData.vue';
 import VnRow from 'components/ui/VnRow.vue';
 import VnSelect from 'src/components/common/VnSelect.vue';
 import VnInput from 'src/components/common/VnInput.vue';
@@ -21,15 +20,11 @@ const $props = defineProps({
         type: Number,
         default: null,
     },
-    provinces: {
-        type: Array,
-        default: () => [],
-    },
 });
-const autonomiesOptions = ref([]);
+const autonomiesRef = ref([]);
 
 const onDataSaved = (dataSaved, requestResponse) => {
-    requestResponse.autonomy = autonomiesOptions.value.find(
+    requestResponse.autonomy = autonomiesRef.value.opts.find(
         (autonomy) => autonomy.id == requestResponse.autonomyFk
     );
     emit('onDataSaved', dataSaved, requestResponse);
@@ -43,16 +38,6 @@ const where = computed(() => {
 </script>
 
 <template>
-    <FetchData
-        @on-fetch="(data) => (autonomiesOptions = data)"
-        auto-load
-        :filter="{
-            where,
-        }"
-        url="Autonomies/location"
-        :sort-by="['name ASC']"
-        :limit="30"
-    />
     <FormModelPopup
         :title="t('New province')"
         :subtitle="t('Please, ensure you put the correct data!')"
@@ -67,10 +52,17 @@ const where = computed(() => {
                     :label="t('Name')"
                     v-model="data.name"
                     :rules="validate('province.name')"
+                    required
                 />
                 <VnSelect
+                    required
+                    ref="autonomiesRef"
+                    auto-load
+                    :where="where"
+                    url="Autonomies/location"
+                    :sort-by="['name ASC']"
+                    :limit="30"
                     :label="t('Autonomy')"
-                    :options="autonomiesOptions"
                     hide-selected
                     option-label="name"
                     option-value="id"

From 3a695bdfe12ff3e667846c4361df1f7d07c4328a Mon Sep 17 00:00:00 2001
From: Javier Segarra <jsegarra@verdnatura.es>
Date: Wed, 27 Nov 2024 22:42:18 +0100
Subject: [PATCH 24/40] perf: refs #8061 use opts from VnSelect

---
 src/components/CreateNewPostcodeForm.vue | 37 +++++-------------------
 1 file changed, 8 insertions(+), 29 deletions(-)

diff --git a/src/components/CreateNewPostcodeForm.vue b/src/components/CreateNewPostcodeForm.vue
index 66b2a30d3..141dcb142 100644
--- a/src/components/CreateNewPostcodeForm.vue
+++ b/src/components/CreateNewPostcodeForm.vue
@@ -23,9 +23,8 @@ const postcodeFormData = reactive({
 });
 
 const townsFetchDataRef = ref(false);
-const countriesFetchDataRef = ref(false);
+const countriesRef = ref(false);
 const provincesFetchDataRef = ref(false);
-const countriesOptions = ref([]);
 const provincesOptions = ref([]);
 const townsOptions = ref([]);
 const town = ref({});
@@ -42,7 +41,7 @@ function onDataSaved(formData) {
         ({ id }) => id === formData.provinceFk
     );
     newPostcode.province = provinceObject?.name;
-    const countryObject = countriesOptions.value.find(
+    const countryObject = countriesRef.value.opts.find(
         ({ id }) => id === formData.countryFk
     );
     newPostcode.country = countryObject?.name;
@@ -80,16 +79,6 @@ async function filterTowns(name) {
         await townsFetchDataRef.value?.fetch();
     }
 }
-async function filterCountries(name) {
-    if (name !== '') {
-        countryFilter.value.where = {
-            name: {
-                like: `%${name}%`,
-            },
-        };
-        await countriesFetchDataRef.value?.fetch();
-    }
-}
 
 async function fetchTowns(countryFk) {
     if (!countryFk) return;
@@ -111,10 +100,6 @@ async function handleTowns(data) {
     townsOptions.value = data;
 }
 
-async function handleCountries(data) {
-    countriesOptions.value = data;
-}
-
 async function setProvince(id, data) {
     const newProvince = provincesOptions.value.find((province) => province.id == id);
     if (!newProvince) return;
@@ -148,15 +133,6 @@ async function onProvinceCreated(data) {
         auto-load
         url="Towns/location"
     />
-    <FetchData
-        ref="countriesFetchDataRef"
-        :limit="30"
-        :filter="countryFilter"
-        :sort-by="['name ASC']"
-        @on-fetch="handleCountries"
-        auto-load
-        url="Countries"
-    />
 
     <FormModelPopup
         url-create="postcodes"
@@ -225,12 +201,15 @@ async function onProvinceCreated(data) {
                     required
                 />
                 <VnSelect
+                    ref="countriesRef"
+                    :limit="30"
+                    :filter="countryFilter"
+                    :sort-by="['name ASC']"
+                    auto-load
+                    url="Countries"
                     required
                     :label="t('Country')"
-                    @update:options="handleCountries"
-                    :options="countriesOptions"
                     hide-selected
-                    @filter="filterCountries"
                     option-label="name"
                     option-value="id"
                     v-model="data.countryFk"

From 89a2486f6286aeab5f80c6998f83f7470a275c97 Mon Sep 17 00:00:00 2001
From: Javier Segarra <jsegarra@verdnatura.es>
Date: Wed, 27 Nov 2024 23:33:39 +0100
Subject: [PATCH 25/40] fix: refs #8061 improve code dependencies

---
 src/components/CreateNewPostcodeForm.vue | 56 +++++++-----------------
 test/cypress/support/commands.js         |  3 +-
 2 files changed, 18 insertions(+), 41 deletions(-)

diff --git a/src/components/CreateNewPostcodeForm.vue b/src/components/CreateNewPostcodeForm.vue
index 141dcb142..232f86a49 100644
--- a/src/components/CreateNewPostcodeForm.vue
+++ b/src/components/CreateNewPostcodeForm.vue
@@ -1,5 +1,5 @@
 <script setup>
-import { reactive, ref } from 'vue';
+import { computed, reactive, ref } from 'vue';
 import { useI18n } from 'vue-i18n';
 
 import FetchData from 'components/FetchData.vue';
@@ -24,9 +24,9 @@ const postcodeFormData = reactive({
 
 const townsFetchDataRef = ref(false);
 const countriesRef = ref(false);
+const townsRef = ref(false);
 const provincesFetchDataRef = ref(false);
 const provincesOptions = ref([]);
-const townsOptions = ref([]);
 const town = ref({});
 const townFilter = ref({});
 const countryFilter = ref({});
@@ -69,35 +69,8 @@ async function setCountry(countryFk, data) {
     data.countryFk = countryFk;
 }
 
-async function filterTowns(name) {
-    if (name !== '') {
-        townFilter.value.where = {
-            name: {
-                like: `%${name}%`,
-            },
-        };
-        await townsFetchDataRef.value?.fetch();
-    }
-}
-
-async function fetchTowns(countryFk) {
-    if (!countryFk) return;
-    townFilter.value.where = {
-        provinceFk: {
-            inq: provincesOptions.value.map(({ id }) => id),
-        },
-    };
-    await townsFetchDataRef.value?.fetch();
-}
-
 async function handleProvinces(data) {
     provincesOptions.value = data;
-    if (postcodeFormData.countryFk) {
-        await fetchTowns(postcodeFormData.countryFk);
-    }
-}
-async function handleTowns(data) {
-    townsOptions.value = data;
 }
 
 async function setProvince(id, data) {
@@ -113,6 +86,14 @@ async function onProvinceCreated(data) {
     });
     postcodeFormData.provinceFk = data.id;
 }
+
+const whereTowns = computed(() => {
+    return {
+        provinceFk: {
+            inq: provincesOptions.value.map(({ id }) => id),
+        },
+    };
+});
 </script>
 
 <template>
@@ -124,15 +105,6 @@ async function onProvinceCreated(data) {
         auto-load
         url="Provinces/location"
     />
-    <FetchData
-        ref="townsFetchDataRef"
-        :sort-by="['name ASC']"
-        :limit="30"
-        :filter="townFilter"
-        @on-fetch="handleTowns"
-        auto-load
-        url="Towns/location"
-    />
 
     <FormModelPopup
         url-create="postcodes"
@@ -153,12 +125,16 @@ async function onProvinceCreated(data) {
                     required
                 />
                 <VnSelectDialog
+                    ref="townsRef"
+                    :sort-by="['name ASC']"
+                    :limit="30"
+                    auto-load
+                    url="Towns/location"
+                    :where="whereTowns"
                     :label="t('City')"
                     @update:model-value="(value) => setTown(value, data)"
-                    @filter="filterTowns"
                     :tooltip="t('Create city')"
                     v-model="data.townFk"
-                    :options="townsOptions"
                     option-label="name"
                     option-value="id"
                     :rules="validate('postcode.city')"
diff --git a/test/cypress/support/commands.js b/test/cypress/support/commands.js
index 53f9d1d73..dbaa7871c 100755
--- a/test/cypress/support/commands.js
+++ b/test/cypress/support/commands.js
@@ -86,9 +86,10 @@ Cypress.Commands.add('getValue', (selector) => {
 });
 
 // Fill Inputs
-Cypress.Commands.add('selectOption', (selector, option) => {
+Cypress.Commands.add('selectOption', (selector, option, timeout) => {
     cy.waitForElement(selector);
     cy.get(selector).click();
+    cy.wait(timeout || 1000);
     cy.get('.q-menu .q-item').contains(option).click();
 });
 Cypress.Commands.add('countSelectOptions', (selector, option) => {

From 1a0406b5b1b73c16157d673a18668e7c3410f59a Mon Sep 17 00:00:00 2001
From: Jon <jon@verdnatura.es>
Date: Thu, 28 Nov 2024 07:21:02 +0100
Subject: [PATCH 26/40] fix: fixed exclusionCreate when excluding an event
 already excluded

---
 src/pages/Zone/Card/ZoneEventExclusionForm.vue | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/src/pages/Zone/Card/ZoneEventExclusionForm.vue b/src/pages/Zone/Card/ZoneEventExclusionForm.vue
index 333c5d934..6635ce385 100644
--- a/src/pages/Zone/Card/ZoneEventExclusionForm.vue
+++ b/src/pages/Zone/Card/ZoneEventExclusionForm.vue
@@ -67,7 +67,12 @@ const exclusionGeoCreate = async () => {
 };
 
 const exclusionCreate = async () => {
-    await axios.post(`Zones/${route.params.id}/exclusions`, [{ dated: dated }]);
+    if (isNew.value)
+        await axios.post(`Zones/${route.params.id}/exclusions`, [{ dated: dated }]);
+    else
+        await axios.put(`Zones/${route.params.id}/exclusions/${props.event?.id}`, {
+            dated: dated,
+        });
     await refetchEvents();
 };
 

From aaab41fe97df7319b5a1c7c29a25f66dd5bcde8e Mon Sep 17 00:00:00 2001
From: Jon <jon@verdnatura.es>
Date: Thu, 28 Nov 2024 07:37:50 +0100
Subject: [PATCH 27/40] fix: translations

---
 src/pages/Zone/locale/en.yml | 1 +
 src/pages/Zone/locale/es.yml | 1 +
 2 files changed, 2 insertions(+)

diff --git a/src/pages/Zone/locale/en.yml b/src/pages/Zone/locale/en.yml
index bf7d8f0de..a9cd700df 100644
--- a/src/pages/Zone/locale/en.yml
+++ b/src/pages/Zone/locale/en.yml
@@ -76,6 +76,7 @@ eventsInclusionForm:
     rangeOfDates: Range of dates
     from: From
     to: To
+    day: Day
 upcomingDeliveries:
     province: Province
     closing: Closing
diff --git a/src/pages/Zone/locale/es.yml b/src/pages/Zone/locale/es.yml
index 91541bea3..c4820a6c0 100644
--- a/src/pages/Zone/locale/es.yml
+++ b/src/pages/Zone/locale/es.yml
@@ -76,5 +76,6 @@ eventsInclusionForm:
     rangeOfDates: Rango de fechas
     from: Desde
     to: Hasta
+    day: Día
 upcomingDeliveries:
     province: Provincia

From 55b9e3ddcdea6edd213cc9df08f610e62d09088a Mon Sep 17 00:00:00 2001
From: guillermo <guillermo@verdnatura.es>
Date: Thu, 28 Nov 2024 08:21:09 +0100
Subject: [PATCH 28/40] fix: refs #7266 Bad report

---
 src/pages/Entry/EntryBuysTableDialog.vue | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/pages/Entry/EntryBuysTableDialog.vue b/src/pages/Entry/EntryBuysTableDialog.vue
index c885c2485..77b31aaa3 100644
--- a/src/pages/Entry/EntryBuysTableDialog.vue
+++ b/src/pages/Entry/EntryBuysTableDialog.vue
@@ -86,7 +86,7 @@ const entriesTableColumns = computed(() => [
                     color="primary"
                     icon="print"
                     :loading="isLoading"
-                    @click="openReport(`Entries/${entityId}/print`)"
+                    @click="openReport(`Entries/${entityId}/buy-label-supplier`)"
                     unelevated
                     autofocus
                 />

From 41fb880c0eec149b8e9d70e0c5d241758fa42b67 Mon Sep 17 00:00:00 2001
From: guillermo <guillermo@verdnatura.es>
Date: Thu, 28 Nov 2024 08:59:13 +0100
Subject: [PATCH 29/40] fix: refs #7266 Minor fixes

---
 src/pages/Entry/EntryBuysTableDialog.vue | 8 +++++---
 src/pages/Entry/MyEntries.vue            | 2 +-
 2 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/src/pages/Entry/EntryBuysTableDialog.vue b/src/pages/Entry/EntryBuysTableDialog.vue
index 77b31aaa3..3975bff19 100644
--- a/src/pages/Entry/EntryBuysTableDialog.vue
+++ b/src/pages/Entry/EntryBuysTableDialog.vue
@@ -82,11 +82,11 @@ const entriesTableColumns = computed(() => [
             </QCardSection>
             <QCardActions align="right">
                 <QBtn
-                    :label="t('printLabels')"
+                    :label="t('myEntries.printLabels')"
                     color="primary"
                     icon="print"
                     :loading="isLoading"
-                    @click="openReport(`Entries/${entityId}/buy-label-supplier`)"
+                    @click="openReport(`Entries/${entityId}/labelSupplier`)"
                     unelevated
                     autofocus
                 />
@@ -126,7 +126,9 @@ const entriesTableColumns = computed(() => [
                                         "
                                         unelevated
                                     >
-                                        <QTooltip>{{ t('viewLabel') }}</QTooltip>
+                                        <QTooltip>{{
+                                            t('myEntries.viewLabel')
+                                        }}</QTooltip>
                                     </QBtn>
                                 </QTr>
                             </template>
diff --git a/src/pages/Entry/MyEntries.vue b/src/pages/Entry/MyEntries.vue
index 2c37c2c42..91a29b190 100644
--- a/src/pages/Entry/MyEntries.vue
+++ b/src/pages/Entry/MyEntries.vue
@@ -101,7 +101,7 @@ const columns = computed(() => [
         name: 'tableActions',
         actions: [
             {
-                title: t('printLabels'),
+                title: t('myEntries.printLabels'),
                 icon: 'print',
                 isPrimary: true,
                 action: (row) => printBuys(row.id),

From 5c79c6bfef842d9edba07d745e35213f460bf427 Mon Sep 17 00:00:00 2001
From: robert <robert@verdnatura.es>
Date: Thu, 28 Nov 2024 09:38:28 +0100
Subject: [PATCH 30/40] feat: refs #245362 itemTags

---
 src/pages/Item/Card/ItemTags.vue | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/pages/Item/Card/ItemTags.vue b/src/pages/Item/Card/ItemTags.vue
index 461aaef4b..b26e08612 100644
--- a/src/pages/Item/Card/ItemTags.vue
+++ b/src/pages/Item/Card/ItemTags.vue
@@ -66,6 +66,7 @@ const insertTag = (rows) => {
     <FetchData
         url="Tags"
         :filter="{ fields: ['id', 'name', 'isFree', 'sourceTable'] }"
+        :sort-by="'name'"
         @on-fetch="(data) => (tagOptions = data)"
         auto-load
     />

From 97c12bced3f493b08b221eaa4829cb84f7348f2e Mon Sep 17 00:00:00 2001
From: robert <robert@verdnatura.es>
Date: Thu, 28 Nov 2024 11:36:59 +0100
Subject: [PATCH 31/40] feat: refs #245362 change request

---
 src/pages/Item/Card/ItemTags.vue | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/pages/Item/Card/ItemTags.vue b/src/pages/Item/Card/ItemTags.vue
index b26e08612..f4ab90d93 100644
--- a/src/pages/Item/Card/ItemTags.vue
+++ b/src/pages/Item/Card/ItemTags.vue
@@ -66,7 +66,7 @@ const insertTag = (rows) => {
     <FetchData
         url="Tags"
         :filter="{ fields: ['id', 'name', 'isFree', 'sourceTable'] }"
-        :sort-by="'name'"
+        sort-by="name"
         @on-fetch="(data) => (tagOptions = data)"
         auto-load
     />

From 61d0d71538da93b9ae1f4170822e5502849294c1 Mon Sep 17 00:00:00 2001
From: Jon <jon@verdnatura.es>
Date: Thu, 28 Nov 2024 12:26:33 +0100
Subject: [PATCH 32/40] fix: fixed functionality like Salix

---
 .../Zone/Card/ZoneEventExclusionForm.vue      | 12 +++-----
 src/pages/Zone/Card/ZoneEvents.vue            | 15 ++++++----
 src/pages/Zone/Card/ZoneEventsPanel.vue       | 30 ++++---------------
 3 files changed, 19 insertions(+), 38 deletions(-)

diff --git a/src/pages/Zone/Card/ZoneEventExclusionForm.vue b/src/pages/Zone/Card/ZoneEventExclusionForm.vue
index 6635ce385..62cf7cf8d 100644
--- a/src/pages/Zone/Card/ZoneEventExclusionForm.vue
+++ b/src/pages/Zone/Card/ZoneEventExclusionForm.vue
@@ -67,7 +67,7 @@ const exclusionGeoCreate = async () => {
 };
 
 const exclusionCreate = async () => {
-    if (isNew.value)
+    if (isNew.value || props.event?.type)
         await axios.post(`Zones/${route.params.id}/exclusions`, [{ dated: dated }]);
     else
         await axios.put(`Zones/${route.params.id}/exclusions/${props.event?.id}`, {
@@ -119,11 +119,7 @@ onMounted(() => {
     >
         <template #form-inputs>
             <VnRow class="row q-gutter-md q-mb-lg">
-                <VnInputDate
-                    :label="t('eventsInclusionForm.day')"
-                    v-model="dated"
-                    :required="true"
-                />
+                <VnInputDate :label="t('eventsInclusionForm.day')" v-model="dated" />
             </VnRow>
             <div class="column q-gutter-y-sm q-mb-md">
                 <QRadio
@@ -173,8 +169,8 @@ onMounted(() => {
                 class="q-mr-sm"
                 @click="
                     openConfirmationModal(
-                        t('zone.deleteTitle'),
-                        t('zone.deleteSubtitle'),
+                        t('eventsPanel.deleteTitle'),
+                        t('eventsPanel.deleteSubtitle'),
                         () => deleteEvent()
                     )
                 "
diff --git a/src/pages/Zone/Card/ZoneEvents.vue b/src/pages/Zone/Card/ZoneEvents.vue
index 3452849bc..6d5b37096 100644
--- a/src/pages/Zone/Card/ZoneEvents.vue
+++ b/src/pages/Zone/Card/ZoneEvents.vue
@@ -24,13 +24,14 @@ const zoneEventsFormProps = reactive({
     date: null,
 });
 
-const openForm = (data) => {
+const openForm = (data, isBtnAdd) => {
     const { date = null, isNewMode, event, eventType, geoIds = [] } = data;
     zoneEventsFormProps.date = date;
     zoneEventsFormProps.isNewMode = isNewMode;
     zoneEventsFormProps.event = event;
     zoneEventsFormProps.eventType = eventType;
     if (geoIds.length) zoneEventsFormProps.geoIds = geoIds;
+    if (isBtnAdd) formModeName.value = 'include';
 
     showZoneEventForm.value = true;
 };
@@ -51,7 +52,6 @@ onUnmounted(() => (stateStore.rightDrawer = false));
                 :last-day="lastDay"
                 :events="events"
                 v-model:formModeName="formModeName"
-                @open-zone-form="openForm"
             />
         </QScrollArea>
     </QDrawer>
@@ -65,7 +65,7 @@ onUnmounted(() => (stateStore.rightDrawer = false));
         />
         <QDialog v-model="showZoneEventForm" @hide="onZoneEventFormClose()">
             <ZoneEventInclusionForm
-                v-if="formModeName === 'include'"
+                v-if="!formModeName || formModeName === 'include'"
                 v-bind="zoneEventsFormProps"
                 @close-form="onZoneEventFormClose()"
             />
@@ -78,9 +78,12 @@ onUnmounted(() => (stateStore.rightDrawer = false));
         <QPageSticky :offset="[20, 20]">
             <QBtn
                 @click="
-                    openForm({
-                        isNewMode: true,
-                    })
+                    openForm(
+                        {
+                            isNewMode: true,
+                        },
+                        true
+                    )
                 "
                 color="primary"
                 fab
diff --git a/src/pages/Zone/Card/ZoneEventsPanel.vue b/src/pages/Zone/Card/ZoneEventsPanel.vue
index 4a030cbea..da1c0cf71 100644
--- a/src/pages/Zone/Card/ZoneEventsPanel.vue
+++ b/src/pages/Zone/Card/ZoneEventsPanel.vue
@@ -11,6 +11,10 @@ import { dashIfEmpty } from 'src/filters';
 import { useWeekdayStore } from 'src/stores/useWeekdayStore';
 import { useVnConfirm } from 'composables/useVnConfirm';
 
+const formModeName = defineModel('formModeName', {
+    type: String,
+    required: true,
+});
 const props = defineProps({
     firstDay: {
         type: Date,
@@ -27,25 +31,13 @@ const props = defineProps({
         required: true,
         default: () => [],
     },
-    formModeName: {
-        type: String,
-        required: true,
-        default: 'include',
-    },
 });
 
-const emit = defineEmits(['openZoneForm', 'update:formModeName']);
-
 const { t } = useI18n();
 const route = useRoute();
 const weekdayStore = useWeekdayStore();
 const { openConfirmationModal } = useVnConfirm();
 
-const formName = computed({
-    get: () => props.formModeName,
-    set: (value) => emit('update:formModeName', value),
-});
-
 const params = computed(() => ({
     zoneFk: route.params.id,
     started: props.firstDay,
@@ -88,16 +80,6 @@ const deleteEvent = async (id) => {
     await fetchData();
 };
 
-const openInclusionForm = (event) => {
-    formName.value = 'include';
-    emit('openZoneForm', {
-        date: event.dated,
-        event,
-        isNewMode: false,
-        eventType: 'event',
-    });
-};
-
 onMounted(async () => {
     weekdayStore.initStore();
 });
@@ -110,13 +92,13 @@ onMounted(async () => {
                 t('eventsPanel.editMode')
             }}</span>
             <QRadio
-                v-model="formName"
+                v-model="formModeName"
                 dense
                 val="include"
                 :label="t('eventsPanel.include')"
             />
             <QRadio
-                v-model="formName"
+                v-model="formModeName"
                 dense
                 val="exclude"
                 :label="t('eventsPanel.exclude')"

From 6263481a3e1e87b41f3db7ecd336dff34461abde Mon Sep 17 00:00:00 2001
From: Jon <jon@verdnatura.es>
Date: Thu, 28 Nov 2024 13:42:22 +0100
Subject: [PATCH 33/40] refactor: exclusionCreate function and translations

---
 src/pages/Supplier/SupplierList.vue            |  5 ++---
 src/pages/Zone/Card/ZoneEventExclusionForm.vue | 12 ++++++------
 src/pages/Zone/locale/en.yml                   |  2 ++
 src/pages/Zone/locale/es.yml                   |  2 ++
 4 files changed, 12 insertions(+), 9 deletions(-)

diff --git a/src/pages/Supplier/SupplierList.vue b/src/pages/Supplier/SupplierList.vue
index 69f826201..a54012b34 100644
--- a/src/pages/Supplier/SupplierList.vue
+++ b/src/pages/Supplier/SupplierList.vue
@@ -124,8 +124,7 @@ const columns = computed(() => [
 </template>
 
 <i18n>
-en:
-    Search suppliers: Search suppliers
-es:
+ es:
     Search suppliers: Buscar proveedores
+    Create Supplier: Crear proveedor
 </i18n>
diff --git a/src/pages/Zone/Card/ZoneEventExclusionForm.vue b/src/pages/Zone/Card/ZoneEventExclusionForm.vue
index 62cf7cf8d..0882036c1 100644
--- a/src/pages/Zone/Card/ZoneEventExclusionForm.vue
+++ b/src/pages/Zone/Card/ZoneEventExclusionForm.vue
@@ -67,12 +67,12 @@ const exclusionGeoCreate = async () => {
 };
 
 const exclusionCreate = async () => {
-    if (isNew.value || props.event?.type)
-        await axios.post(`Zones/${route.params.id}/exclusions`, [{ dated: dated }]);
-    else
-        await axios.put(`Zones/${route.params.id}/exclusions/${props.event?.id}`, {
-            dated: dated,
-        });
+    const url = `Zones/${route.params.id}/exclusions`;
+    const body = {
+        dated,
+    };
+    if (isNew.value || props.event?.type) await axios.post(`${url}`, [body]);
+    else await axios.put(`${url}/${props.event?.id}`, body);
     await refetchEvents();
 };
 
diff --git a/src/pages/Zone/locale/en.yml b/src/pages/Zone/locale/en.yml
index a9cd700df..ba4982311 100644
--- a/src/pages/Zone/locale/en.yml
+++ b/src/pages/Zone/locale/en.yml
@@ -61,6 +61,8 @@ eventsPanel:
     events: Events
     everyday: Everyday
     delete: Delete
+    deleteTitle: This item will be deleted
+    deleteSubtitle: Are you sure you want to continue?
 eventsExclusionForm:
     addExclusion: Add exclusion
     editExclusion: Edit exclusion
diff --git a/src/pages/Zone/locale/es.yml b/src/pages/Zone/locale/es.yml
index c4820a6c0..d0bab83f4 100644
--- a/src/pages/Zone/locale/es.yml
+++ b/src/pages/Zone/locale/es.yml
@@ -61,6 +61,8 @@ eventsPanel:
     events: Eventos
     everyday: Todos los días
     delete: Eliminar
+    deleteTitle: Eliminar evento
+    deleteSubtitle: ¿Seguro que quieres eliminar este evento?
 eventsExclusionForm:
     addExclusion: Añadir exclusión
     editExclusion: Editar exclusión

From 280a70a14528878d7ecfe7a277fad68d4a683b34 Mon Sep 17 00:00:00 2001
From: Javier Segarra <jsegarra@verdnatura.es>
Date: Thu, 28 Nov 2024 14:05:04 +0100
Subject: [PATCH 34/40] fix: remove message when setWeigth ticket

---
 src/i18n/locale/en.yml                         | 1 +
 src/pages/Ticket/Card/TicketDescriptorMenu.vue | 3 +--
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/i18n/locale/en.yml b/src/i18n/locale/en.yml
index 3e3df7a0f..e2e0e4238 100644
--- a/src/i18n/locale/en.yml
+++ b/src/i18n/locale/en.yml
@@ -861,6 +861,7 @@ components:
     cardDescriptor:
         mainList: Main list
         summary: Summary
+        moreOptions: More options
     leftMenu:
         addToPinned: Add to pinned
         removeFromPinned: Remove from pinned
diff --git a/src/pages/Ticket/Card/TicketDescriptorMenu.vue b/src/pages/Ticket/Card/TicketDescriptorMenu.vue
index b8e64cb79..60a703f84 100644
--- a/src/pages/Ticket/Card/TicketDescriptorMenu.vue
+++ b/src/pages/Ticket/Card/TicketDescriptorMenu.vue
@@ -676,7 +676,7 @@ async function uploadDocuware(force) {
     <VnConfirm
         ref="weightDialog"
         :title="t('Set weight')"
-        :message="t('This ticket may be invoiced, do you want to continue?')"
+        :message="false"
         :promise="actions.setWeight"
     >
         <template #customHTML>
@@ -741,7 +741,6 @@ es:
     Ticket invoiced: Ticket facturado
     Set weight: Establecer peso
     Weight set: Peso establecido
-    This ticket may be invoiced, do you want to continue?: Es posible que se facture este ticket, desea continuar?
     invoiceIds: "Se han generado las facturas con los siguientes ids: {invoiceIds}"
     This ticket will be removed from current route! Continue anyway?: ¡Se eliminará el ticket de la ruta actual! ¿Continuar de todas formas?
     You are going to delete this ticket: Vas a eliminar este ticket

From 67c257ce0eda180dc7a88bd7691797a7f0445d9f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Carlos=20Andr=C3=A9s?= <carlosap@verdnatura.es>
Date: Thu, 28 Nov 2024 19:24:13 +0100
Subject: [PATCH 35/40] fix: translations travel

---
 src/i18n/locale/en.yml                    | 2 +-
 src/i18n/locale/es.yml                    | 2 +-
 src/pages/Travel/Card/TravelBasicData.vue | 4 ++--
 3 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/i18n/locale/en.yml b/src/i18n/locale/en.yml
index e2e0e4238..31a6931a4 100644
--- a/src/i18n/locale/en.yml
+++ b/src/i18n/locale/en.yml
@@ -766,7 +766,7 @@ travel:
         thermographs: Thermographs
         hb: HB
     basicData:
-        daysInForward: Days in forward
+        daysInForward: Automatic movement (Raid)
         isRaid: Raid
     thermographs:
         temperature: Temperature
diff --git a/src/i18n/locale/es.yml b/src/i18n/locale/es.yml
index 58ddc98ef..ccc21e225 100644
--- a/src/i18n/locale/es.yml
+++ b/src/i18n/locale/es.yml
@@ -760,7 +760,7 @@ travel:
         thermographs: Termógrafos
         hb: HB
     basicData:
-        daysInForward: Días redada
+        daysInForward: Desplazamiento automatico (redada)
         isRaid: Redada
     thermographs:
         temperature: Temperatura
diff --git a/src/pages/Travel/Card/TravelBasicData.vue b/src/pages/Travel/Card/TravelBasicData.vue
index fd02b28cd..4b9aa28ed 100644
--- a/src/pages/Travel/Card/TravelBasicData.vue
+++ b/src/pages/Travel/Card/TravelBasicData.vue
@@ -104,7 +104,7 @@ const warehousesOptionsIn = ref([]);
 
 <i18n>
 es:
-    raidDays: Si se marca "Redada", la fecha de entrega se moverá automáticamente los días indicados.
+    raidDays: El travel se desplaza automáticamente cada día para estar desde hoy al número de días indicado. Si se deja vacio no se moverá
 en:
-    raidDays: If "Raid" is checked, the landing date will automatically shift by the specified number of days.
+    raidDays: The travel adjusts itself daily to match the number of days set, starting from today. If left blank, it won’t move
 </i18n>

From 36de1ad4003c716e94b96f62f710cd39e8ef5ed3 Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Fri, 29 Nov 2024 07:27:14 +0100
Subject: [PATCH 36/40] fix(MailForwarding): add  try catch

---
 src/pages/Account/Card/AccountMailForwarding.vue | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/src/pages/Account/Card/AccountMailForwarding.vue b/src/pages/Account/Card/AccountMailForwarding.vue
index aa92e5072..30849d44a 100644
--- a/src/pages/Account/Card/AccountMailForwarding.vue
+++ b/src/pages/Account/Card/AccountMailForwarding.vue
@@ -41,8 +41,12 @@ const fetchAccountExistence = async () => {
 };
 
 const fetchMailForwards = async () => {
-    const response = await axios.get(`MailForwards/${route.params.id}`);
-    return response.data;
+    try {
+        const response = await axios.get(`MailForwards/${route.params.id}`);
+        return response.data;
+    } catch {
+        return null;
+    }
 };
 
 const deleteMailForward = async () => {

From d364e30cf0a87cb2e311fcaf357be0e7dbf6b565 Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Fri, 29 Nov 2024 09:38:58 +0100
Subject: [PATCH 37/40] feat(SupplierAccount): add autoBic when change
 bankEntity

---
 src/components/CrudModel.vue                 |  4 +--
 src/components/common/VnSelect.vue           | 21 +++++++++++--
 src/pages/Supplier/Card/SupplierAccounts.vue | 33 ++++++++++++++++++--
 3 files changed, 50 insertions(+), 8 deletions(-)

diff --git a/src/components/CrudModel.vue b/src/components/CrudModel.vue
index 1234ce123..b770e591f 100644
--- a/src/components/CrudModel.vue
+++ b/src/components/CrudModel.vue
@@ -176,8 +176,8 @@ async function saveChanges(data) {
     const changes = data || getChanges();
     try {
         await axios.post($props.saveUrl || $props.url + '/crud', changes);
-    } catch (e) {
-        return (isLoading.value = false);
+    } finally {
+        isLoading.value = false;
     }
     originalData.value = JSON.parse(JSON.stringify(formData.value));
     if (changes.creates?.length) await vnPaginateRef.value.fetch();
diff --git a/src/components/common/VnSelect.vue b/src/components/common/VnSelect.vue
index f24f054a5..14005e1cc 100644
--- a/src/components/common/VnSelect.vue
+++ b/src/components/common/VnSelect.vue
@@ -284,9 +284,9 @@ async function onScroll({ to, direction, from, index }) {
         :loading="isLoading"
         @virtual-scroll="onScroll"
     >
-        <template v-if="isClearable" #append>
+        <template #append>
             <QIcon
-                v-show="value"
+                v-show="isClearable && value"
                 name="close"
                 @click.stop="
                     () => {
@@ -299,7 +299,22 @@ async function onScroll({ to, direction, from, index }) {
             />
         </template>
         <template v-for="(_, slotName) in $slots" #[slotName]="slotData" :key="slotName">
-            <slot :name="slotName" v-bind="slotData ?? {}" :key="slotName" />
+            <div v-if="slotName == 'append'">
+                <QIcon
+                    v-show="isClearable && value"
+                    name="close"
+                    @click.stop="
+                        () => {
+                            value = null;
+                            emit('remove');
+                        }
+                    "
+                    class="cursor-pointer"
+                    size="xs"
+                />
+                <slot name="append" v-if="$slots.append" v-bind="slotData ?? {}" />
+            </div>
+            <slot v-else :name="slotName" v-bind="slotData ?? {}" :key="slotName" />
         </template>
     </QSelect>
 </template>
diff --git a/src/pages/Supplier/Card/SupplierAccounts.vue b/src/pages/Supplier/Card/SupplierAccounts.vue
index 428ab05c2..c2934830a 100644
--- a/src/pages/Supplier/Card/SupplierAccounts.vue
+++ b/src/pages/Supplier/Card/SupplierAccounts.vue
@@ -24,13 +24,14 @@ const supplier = ref(null);
 const supplierAccountRef = ref(null);
 const wireTransferFk = ref(null);
 const bankEntitiesOptions = ref([]);
+const filteredBankEntitiesOptions = ref([]);
 
 const onBankEntityCreated = async (dataSaved, rowData) => {
     await bankEntitiesRef.value.fetch();
     rowData.bankEntityFk = dataSaved.id;
 };
 
-const onChangesSaved = () => {
+const onChangesSaved = async () => {
     if (supplier.value.payMethodFk !== wireTransferFk.value)
         quasar
             .dialog({
@@ -55,12 +56,35 @@ const setWireTransfer = async () => {
     await axios.patch(`Suppliers/${route.params.id}`, params);
     notify('globals.dataSaved', 'positive');
 };
+
+function findBankFk(value, row) {
+    row.bankEntityFk = null;
+    if (!value) return;
+
+    const bankEntityFk = bankEntitiesOptions.value.find((b) => b.id == value.slice(4, 8));
+    if (bankEntityFk) row.bankEntityFk = bankEntityFk.id;
+}
+
+function bankEntityFilter(val, update) {
+    update(() => {
+        const needle = val.toLowerCase();
+        filteredBankEntitiesOptions.value = bankEntitiesOptions.value.filter(
+            (bank) =>
+                bank.bic.toLowerCase().startsWith(needle) ||
+                bank.name.toLowerCase().includes(needle)
+        );
+    });
+}
 </script>
 <template>
     <FetchData
         ref="bankEntitiesRef"
         url="BankEntities"
-        @on-fetch="(data) => (bankEntitiesOptions = data)"
+        @on-fetch="
+            (data) => {
+                (bankEntitiesOptions = data), (filteredBankEntitiesOptions = data);
+            }
+        "
         auto-load
     />
     <FetchData
@@ -98,6 +122,7 @@ const setWireTransfer = async () => {
                     <VnInput
                         :label="t('supplier.accounts.iban')"
                         v-model="row.iban"
+                        @update:model-value="(value) => findBankFk(value, row)"
                         :required="true"
                     >
                         <template #append>
@@ -109,7 +134,9 @@ const setWireTransfer = async () => {
                     <VnSelectDialog
                         :label="t('worker.create.bankEntity')"
                         v-model="row.bankEntityFk"
-                        :options="bankEntitiesOptions"
+                        :options="filteredBankEntitiesOptions"
+                        :default-filter="false"
+                        @filter="(val, update) => bankEntityFilter(val, update)"
                         option-label="bic"
                         option-value="id"
                         hide-selected

From f1fc5edac30b753285f25fed6890ce518ec0481f Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Fri, 29 Nov 2024 09:39:42 +0100
Subject: [PATCH 38/40] chore: duplicate isLoading.value = false;

---
 src/components/CrudModel.vue | 1 -
 1 file changed, 1 deletion(-)

diff --git a/src/components/CrudModel.vue b/src/components/CrudModel.vue
index b770e591f..b1c7606e6 100644
--- a/src/components/CrudModel.vue
+++ b/src/components/CrudModel.vue
@@ -183,7 +183,6 @@ async function saveChanges(data) {
     if (changes.creates?.length) await vnPaginateRef.value.fetch();
 
     hasChanges.value = false;
-    isLoading.value = false;
     emit('saveChanges', data);
     quasar.notify({
         type: 'positive',

From 8428c7a20500ccb6b547a3af0d1928b26b530d2b Mon Sep 17 00:00:00 2001
From: guillermo <guillermo@verdnatura.es>
Date: Fri, 29 Nov 2024 09:48:09 +0100
Subject: [PATCH 39/40] fix: refs #7920 Changed shelving option value

---
 src/pages/Ticket/Card/TicketSaleTracking.vue | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/pages/Ticket/Card/TicketSaleTracking.vue b/src/pages/Ticket/Card/TicketSaleTracking.vue
index 03e2336eb..7a33df795 100644
--- a/src/pages/Ticket/Card/TicketSaleTracking.vue
+++ b/src/pages/Ticket/Card/TicketSaleTracking.vue
@@ -471,7 +471,7 @@ const qCheckBoxController = (sale, action) => {
                         url="Shelvings"
                         hide-selected
                         option-label="code"
-                        option-value="code"
+                        option-value="id"
                         v-model="row.shelvingFk"
                         @update:model-value="updateShelving(row)"
                         style="max-width: 120px"

From 068b2dc9aa29b873dcd7407ef157bf3123922035 Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Fri, 29 Nov 2024 10:36:22 +0100
Subject: [PATCH 40/40] fix: e2e

---
 test/cypress/integration/vnComponent/vnBreadcrumbs.spec.js | 1 +
 1 file changed, 1 insertion(+)

diff --git a/test/cypress/integration/vnComponent/vnBreadcrumbs.spec.js b/test/cypress/integration/vnComponent/vnBreadcrumbs.spec.js
index 3c839c1c7..e996a65d5 100644
--- a/test/cypress/integration/vnComponent/vnBreadcrumbs.spec.js
+++ b/test/cypress/integration/vnComponent/vnBreadcrumbs.spec.js
@@ -3,6 +3,7 @@ describe('VnBreadcrumbs', () => {
     const firstCard = '.q-infinite-scroll > :nth-child(1)';
     const lastBreadcrumb = '.q-breadcrumbs--last > .q-breadcrumbs__el';
     beforeEach(() => {
+        cy.viewport(1920, 1080);
         cy.login('developer');
         cy.visit('/');
     });