From f2be2b430010d647f2547a8a6d8a2b7604b894dd Mon Sep 17 00:00:00 2001
From: pablone <pablone@verdnatura.es>
Date: Mon, 5 Aug 2024 15:42:57 +0200
Subject: [PATCH 01/29] fea: stockBought add form and formDetail

---
 src/components/VnTable/VnTable.vue            |  14 +-
 src/components/common/VnInputDate.vue         |   2 +-
 src/components/common/VnInputTime.vue         |   2 +-
 src/i18n/locale/en.yml                        |   1 +
 src/pages/Entry/EntryStockBought.vue          | 142 ++++++++++++++++++
 src/pages/Entry/EntryStockBoughtDetail.vue    | 102 +++++++++++++
 src/pages/Route/RouteList.vue                 |   3 +-
 src/router/modules/entry.js                   |  11 +-
 .../integration/entry/stockBought.spec.js     |  36 +++++
 9 files changed, 302 insertions(+), 11 deletions(-)
 create mode 100644 src/pages/Entry/EntryStockBought.vue
 create mode 100644 src/pages/Entry/EntryStockBoughtDetail.vue
 create mode 100644 test/cypress/integration/entry/stockBought.spec.js

diff --git a/src/components/VnTable/VnTable.vue b/src/components/VnTable/VnTable.vue
index 4e40c0ba6..8a20023f2 100644
--- a/src/components/VnTable/VnTable.vue
+++ b/src/components/VnTable/VnTable.vue
@@ -107,7 +107,7 @@ const orders = ref(parseOrder(routeQuery.filter?.order));
 const CrudModelRef = ref({});
 const showForm = ref(false);
 const splittedColumns = ref({ columns: [] });
-const columnsVisibilitySkiped = ref();
+const columnsVisibilitySkipped = ref();
 const tableModes = [
     {
         icon: 'view_column',
@@ -133,7 +133,7 @@ onMounted(() => {
             ? CARD_MODE
             : $props.defaultMode;
     stateStore.rightDrawer = true;
-    columnsVisibilitySkiped.value = [
+    columnsVisibilitySkipped.value = [
         ...splittedColumns.value.columns
             .filter((c) => c.visible == false)
             .map((c) => c.name),
@@ -325,11 +325,11 @@ defineExpose({
     <div class="q-px-md">
         <CrudModel
             v-bind="$attrs"
-            :limit="20"
+            :limit="$attrs.limit ?? 20"
             ref="CrudModelRef"
             @on-fetch="(...args) => emit('onFetch', ...args)"
             :search-url="searchUrl"
-            :disable-infinite-scroll="isTableMode"
+            :disable-infinite-scroll="$attrs['disable-infinite-scroll'] ?? isTableMode"
             @save-changes="reload"
             :has-sub-toolbar="$attrs['hasSubToolbar'] ?? isEditable"
             :auto-load="hasParams || $attrs['auto-load']"
@@ -351,9 +351,8 @@ defineExpose({
                     :grid="!isTableMode"
                     table-header-class="bg-header"
                     card-container-class="grid-three"
-                    flat
                     :style="isTableMode && `max-height: ${tableHeight}`"
-                    virtual-scroll
+                    :virtual-scroll="!isTableMode"
                     @virtual-scroll="
                         (event) =>
                             event.index > rows.length - 2 &&
@@ -361,6 +360,7 @@ defineExpose({
                     "
                     @row-click="(_, row) => rowClickFunction && rowClickFunction(row)"
                     @update:selected="emit('update:selected', $event)"
+                    flat
                 >
                     <template #top-left v-if="!$props.withoutHeader">
                         <slot name="top-left"></slot>
@@ -370,7 +370,7 @@ defineExpose({
                             v-if="isTableMode"
                             v-model="splittedColumns.columns"
                             :table-code="tableCode ?? route.name"
-                            :skip="columnsVisibilitySkiped"
+                            :skip="columnsVisibilitySkipped"
                         />
                         <QBtnToggle
                             v-model="mode"
diff --git a/src/components/common/VnInputDate.vue b/src/components/common/VnInputDate.vue
index 6e57a8a53..76eee86fc 100644
--- a/src/components/common/VnInputDate.vue
+++ b/src/components/common/VnInputDate.vue
@@ -45,7 +45,7 @@ const formattedDate = computed({
         if (value) {
             // parse input
             if (value.includes('/')) {
-                if (value.length == 6) value = value + new Date().getFullYear();
+                if (value.length == 6) value = value + Date.vnNew().getFullYear();
                 if (value.length >= 10) {
                     if (value.at(2) == '/') value = value.split('/').reverse().join('/');
                     value = date.formatDate(
diff --git a/src/components/common/VnInputTime.vue b/src/components/common/VnInputTime.vue
index a59f0e9e8..2c387bf0b 100644
--- a/src/components/common/VnInputTime.vue
+++ b/src/components/common/VnInputTime.vue
@@ -62,7 +62,7 @@ const formattedTime = computed({
 function dateToTime(newDate) {
     return date.formatDate(new Date(newDate), dateFormat);
 }
-const timeField = ref();
+
 watch(
     () => model.value,
     (val) => (formattedTime.value = val),
diff --git a/src/i18n/locale/en.yml b/src/i18n/locale/en.yml
index 78c1fa18d..867f338e4 100644
--- a/src/i18n/locale/en.yml
+++ b/src/i18n/locale/en.yml
@@ -142,6 +142,7 @@ globals:
         dms: File management
         entryCreate: New entry
         latestBuys: Latest buys
+        reserves: Reserves
         tickets: Tickets
         ticketCreate: New Tickets
         boxing: Boxing
diff --git a/src/pages/Entry/EntryStockBought.vue b/src/pages/Entry/EntryStockBought.vue
new file mode 100644
index 000000000..5277cc5e1
--- /dev/null
+++ b/src/pages/Entry/EntryStockBought.vue
@@ -0,0 +1,142 @@
+<script setup>
+import { ref } from 'vue';
+import { useI18n } from 'vue-i18n';
+import { useState } from 'src/composables/useState';
+import { useQuasar } from 'quasar';
+
+import VnTable from 'components/VnTable/VnTable.vue';
+import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue';
+import WorkerDescriptorProxy from 'src/pages/Worker/Card/WorkerDescriptorProxy.vue';
+import EntryStockBoughtDetail from 'src/pages/Entry/EntryStockBoughtDetail.vue';
+
+const { t } = useI18n();
+const quasar = useQuasar();
+const tableRef = ref();
+const state = useState();
+const user = state.getUser();
+const columns = [
+    {
+        align: 'left',
+        label: 'Id',
+        name: 'id',
+        isTitle: true,
+        isId: true,
+        columnFilter: false,
+        visible: false,
+    },
+    {
+        align: 'left',
+        name: 'workerFk',
+        label: t('Buyer'),
+        columnFilter: false,
+    },
+    {
+        align: 'left',
+        label: t('Reserve'),
+        name: 'reserve',
+        columnFilter: false,
+        create: true,
+        component: 'number',
+    },
+    {
+        align: 'left',
+        name: 'workerFk',
+        label: t('Buyer'),
+        component: 'select',
+        create: true,
+        visible: false,
+        columnFilter: false,
+        attrs: {
+            url: 'Workers/activeWithInheritedRole',
+            fields: ['id', 'name'],
+            where: { role: 'buyer' },
+            optionFilter: 'firstName',
+            optionLabel: 'name',
+            optionValue: 'id',
+            useLike: false,
+        },
+    },
+    {
+        align: 'left',
+        label: t('Bought'),
+        name: 'bought',
+        columnFilter: false,
+    },
+    {
+        align: 'left',
+        label: t('Date'),
+        name: 'dated',
+        component: 'date',
+        visible: false,
+        create: true,
+    },
+    {
+        align: 'left',
+        name: 'tableActions',
+        actions: [
+            {
+                title: t('More'),
+                icon: 'search',
+                isPrimary: true,
+                action: (row) => {
+                    console.log('workerFk: ', row.workerFk);
+                    quasar.dialog({
+                        component: EntryStockBoughtDetail,
+                        componentProps: {
+                            workerFk: row.workerFk,
+                            dated: row.dated,
+                        },
+                        maximized: true,
+                    });
+                },
+            },
+        ],
+    },
+];
+</script>
+<template>
+    <VnSubToolbar />
+    <VnTable
+        ref="tableRef"
+        data-key="StockBoughts"
+        url="StockBoughts/getStockBought"
+        save-url="StockBoughts/crud"
+        order="reserve DESC"
+        :is-editable="true"
+        :disable-option="{ card: true }"
+        :create="{
+            urlCreate: 'StockBoughts',
+            title: t('Reserve some space'),
+            onDataSaved: () => tableRef.reload(),
+            formInitialData: {
+                workerFk: user.id,
+                dated: Date.now(),
+            },
+        }"
+        :columns="columns"
+    >
+        <template #column-workerFk="{ row }">
+            <span class="link" @click.stop>
+                {{ row?.worker?.user?.name }}
+                <WorkerDescriptorProxy :id="row?.workerFk" />
+            </span>
+        </template>
+    </VnTable>
+</template>
+<i18n>
+    en:
+        Buyer: Buyer
+        Reserve: Reserve
+        Bought: Bought
+        More: More
+        Date: Date
+        This buyer has already made a reservation for this date: This buyer has already made a reservation for this date
+    es:
+        Buyer: Comprador
+        Reserve: Reservado
+        Bought: Comprado
+        More: Más
+        Date: Fecha
+        Reserve some space: Reservar espacio
+        This buyer has already made a reservation for this date: Este comprador ya ha hecho una reserva para esta fecha
+</i18n>
diff --git a/src/pages/Entry/EntryStockBoughtDetail.vue b/src/pages/Entry/EntryStockBoughtDetail.vue
new file mode 100644
index 000000000..908f5dd20
--- /dev/null
+++ b/src/pages/Entry/EntryStockBoughtDetail.vue
@@ -0,0 +1,102 @@
+<script setup>
+import { ref } from 'vue';
+import { useI18n } from 'vue-i18n';
+
+import VnTable from 'components/VnTable/VnTable.vue';
+import EntryDescriptorProxy from 'src/pages/Entry/Card/EntryDescriptorProxy.vue';
+import ItemDescriptorProxy from 'src/pages/Item/Card/ItemDescriptorProxy.vue';
+
+const { t } = useI18n();
+const tableRef = ref();
+const $props = defineProps({
+    workerFk: {
+        type: Number,
+        required: true,
+    },
+    dated: {
+        type: String,
+        required: true,
+    },
+});
+console.log('$props: ', $props.workerFk, $props.dated);
+const customUrl = `StockBoughts/getStockBoughtDetail?workerFk=${$props.workerFk}`;
+const columns = [
+    {
+        align: 'left',
+        label: 'Entry',
+        name: 'entryFk',
+        isTitle: true,
+        isId: true,
+        columnFilter: false,
+    },
+    {
+        align: 'left',
+        name: 'itemFk',
+        label: t('Item'),
+        columnFilter: false,
+    },
+    {
+        align: 'left',
+        label: t('Name'),
+        name: 'itemName',
+        columnFilter: false,
+        create: true,
+        columnClass: 'expand',
+    },
+    {
+        align: 'left',
+        name: 'volume',
+        label: t('Volume'),
+        columnFilter: false,
+    },
+    {
+        align: 'left',
+        label: t('Packaging'),
+        name: 'packagingFk',
+        columnFilter: false,
+    },
+    {
+        align: 'left',
+        label: 'Packing',
+        name: 'packing',
+        columnFilter: false,
+    },
+];
+</script>
+<template>
+    <QDialog>
+        <VnTable
+            ref="tableRef"
+            data-key="StockBoughtsDetail"
+            :url="customUrl"
+            order="itemName DESC"
+            :columns="columns"
+            :right-search="false"
+            :disable-infinite-scroll="true"
+            :disable-option="{ card: true }"
+            :limit="0"
+            auto-load
+        >
+            <template #column-entryFk="{ row }">
+                <span class="link" @click.stop>
+                    {{ row?.entryFk }}
+                    <EntryDescriptorProxy :id="row.entryFk" />
+                </span>
+            </template>
+            <template #column-itemName="{ row }">
+                <span class="link" @click.stop>
+                    {{ row?.itemName }}
+                    <ItemDescriptorProxy :id="row.itemFk" />
+                </span>
+            </template>
+        </VnTable>
+    </QDialog>
+</template>
+<i18n>
+    es:
+        Buyer: Comprador
+        Reserve: Reservado
+        Bought: Comprado
+        More: Más
+        Date: Fecha
+</i18n>
diff --git a/src/pages/Route/RouteList.vue b/src/pages/Route/RouteList.vue
index b13e8cacd..7d5dd5c68 100644
--- a/src/pages/Route/RouteList.vue
+++ b/src/pages/Route/RouteList.vue
@@ -139,7 +139,7 @@ const columns = computed(() => [
     {
         align: 'center',
         name: 'm3',
-        label: 'volume',
+        label: t('Volume'),
         cardVisible: true,
     },
     {
@@ -379,4 +379,5 @@ es:
     Route is not served: La ruta no está servida
     hourStarted: Hora de inicio
     hourFinished: Hora de fin
+    Volume: Volumen
 </i18n>
diff --git a/src/router/modules/entry.js b/src/router/modules/entry.js
index 0d38ed626..fd5490fbd 100644
--- a/src/router/modules/entry.js
+++ b/src/router/modules/entry.js
@@ -11,7 +11,7 @@ export default {
     component: RouterView,
     redirect: { name: 'EntryMain' },
     menus: {
-        main: ['EntryList', 'MyEntries', 'EntryLatestBuys'],
+        main: ['EntryList', 'MyEntries', 'EntryLatestBuys', 'EntryStockBought'],
         card: ['EntryBasicData', 'EntryBuys', 'EntryNotes', 'EntryDms', 'EntryLog'],
     },
     children: [
@@ -57,6 +57,15 @@ export default {
                     },
                     component: () => import('src/pages/Entry/EntryLatestBuys.vue'),
                 },
+                {
+                    path: 'stock-Bought',
+                    name: 'EntryStockBought',
+                    meta: {
+                        title: 'reserves',
+                        icon: 'deployed_code_history',
+                    },
+                    component: () => import('src/pages/Entry/EntryStockBought.vue'),
+                },
             ],
         },
         {
diff --git a/test/cypress/integration/entry/stockBought.spec.js b/test/cypress/integration/entry/stockBought.spec.js
new file mode 100644
index 000000000..8e4fe225c
--- /dev/null
+++ b/test/cypress/integration/entry/stockBought.spec.js
@@ -0,0 +1,36 @@
+describe('EntryStockBought', () => {
+    const reserveField = 'input[name="reserve"]';
+    beforeEach(() => {
+        cy.viewport(1920, 1080);
+        cy.login('buyer');
+        cy.visit(
+            `/#/entry/stock-Bought?table={"filter":"{}","dated":"2000-12-31T23:00:00.000Z"}`
+        );
+    });
+    it('Should edit the reserved space', () => {
+        cy.get('tBody > tr').its('length').should('eq', 1);
+        cy.get(reserveField).type('10{enter}');
+        cy.get('button[title="Save"]').click();
+        cy.get('.q-notification__message').should('have.text', 'Data saved');
+    });
+    it('Should add a new reserved space for buyerBoss', () => {
+        cy.get('.q-page-sticky > div > .q-btn > .q-btn__content > .q-icon').click();
+        cy.get('input[aria-label="Reserve"]').type('1');
+        cy.get('input[aria-label="Date"]').eq(1).clear();
+        cy.get('input[aria-label="Date"]').eq(1).type('01-01');
+        cy.get('input[aria-label="Buyer"]').type('buyerboss{downarrow}{enter}');
+        cy.get('.q-notification__message').should('have.text', 'Data created');
+        cy.get('tBody > tr').its('length').should('eq', 2);
+    });
+    it('Should check detail for the buyer', () => {
+        cy.get(':nth-child(1) > .sticky > .q-btn > .q-btn__content > .q-icon').click();
+        cy.get('tBody > tr').eq(1).its('length').should('eq', 1);
+    });
+    it('Should check detail for the buyerBoss and had no content', () => {
+        cy.get(':nth-child(2) > .sticky > .q-btn > .q-btn__content > .q-icon').click();
+        cy.get('.q-table__bottom.row.items-center.q-table__bottom--nodata').should(
+            'have.text',
+            'warningNo data available'
+        );
+    });
+});

From de94b3629e6470ba0f8ba9f6b3fad807c6ec01ab Mon Sep 17 00:00:00 2001
From: pablone <pablone@verdnatura.es>
Date: Mon, 5 Aug 2024 15:44:37 +0200
Subject: [PATCH 02/29] fix: remove console.log

---
 src/pages/Entry/EntryStockBought.vue       | 1 -
 src/pages/Entry/EntryStockBoughtDetail.vue | 1 -
 2 files changed, 2 deletions(-)

diff --git a/src/pages/Entry/EntryStockBought.vue b/src/pages/Entry/EntryStockBought.vue
index 5277cc5e1..e0063bb62 100644
--- a/src/pages/Entry/EntryStockBought.vue
+++ b/src/pages/Entry/EntryStockBought.vue
@@ -79,7 +79,6 @@ const columns = [
                 icon: 'search',
                 isPrimary: true,
                 action: (row) => {
-                    console.log('workerFk: ', row.workerFk);
                     quasar.dialog({
                         component: EntryStockBoughtDetail,
                         componentProps: {
diff --git a/src/pages/Entry/EntryStockBoughtDetail.vue b/src/pages/Entry/EntryStockBoughtDetail.vue
index 908f5dd20..f7e89c691 100644
--- a/src/pages/Entry/EntryStockBoughtDetail.vue
+++ b/src/pages/Entry/EntryStockBoughtDetail.vue
@@ -18,7 +18,6 @@ const $props = defineProps({
         required: true,
     },
 });
-console.log('$props: ', $props.workerFk, $props.dated);
 const customUrl = `StockBoughts/getStockBoughtDetail?workerFk=${$props.workerFk}`;
 const columns = [
     {

From ffd7d98e9cc25cf218b2c577d0c7ef98df7cf59b Mon Sep 17 00:00:00 2001
From: pablone <pablone@verdnatura.es>
Date: Tue, 13 Aug 2024 17:56:07 +0200
Subject: [PATCH 03/29] feat: travel m3

---
 src/components/VnTable/VnTable.vue         | 20 +++++++++++
 src/pages/Entry/EntryStockBought.vue       | 39 +++++++++++++++++++++-
 src/pages/Entry/EntryStockBoughtDetail.vue |  2 +-
 src/pages/Travel/Card/TravelBasicData.vue  |  3 ++
 4 files changed, 62 insertions(+), 2 deletions(-)

diff --git a/src/components/VnTable/VnTable.vue b/src/components/VnTable/VnTable.vue
index 8a20023f2..dbe5d1622 100644
--- a/src/components/VnTable/VnTable.vue
+++ b/src/components/VnTable/VnTable.vue
@@ -15,6 +15,7 @@ import VnTableChip from 'components/VnTable/VnChip.vue';
 import VnVisibleColumn from 'src/components/VnTable/VnVisibleColumn.vue';
 import VnLv from 'components/ui/VnLv.vue';
 import VnTableOrder from 'src/components/VnTable/VnOrder.vue';
+import item from 'src/router/modules/item';
 
 const $props = defineProps({
     columns: {
@@ -609,6 +610,25 @@ defineExpose({
                             </QCard>
                         </component>
                     </template>
+                    <template #bottom-row="{ cols }">
+                        <QTr>
+                            <QTh
+                                v-for="col of cols.filter((cols) => cols.visible ?? true)"
+                                :key="col.id"
+                                class="text-center"
+                            >
+                                <span v-if="col.summation">
+                                    {{
+                                        rows.reduce(
+                                            (sum, currentRow) =>
+                                                sum + currentRow[col.name],
+                                            0
+                                        )
+                                    }}
+                                </span>
+                            </QTh>
+                        </QTr>
+                    </template>
                 </QTable>
             </template>
         </CrudModel>
diff --git a/src/pages/Entry/EntryStockBought.vue b/src/pages/Entry/EntryStockBought.vue
index e0063bb62..12fc96214 100644
--- a/src/pages/Entry/EntryStockBought.vue
+++ b/src/pages/Entry/EntryStockBought.vue
@@ -5,6 +5,10 @@ import { useState } from 'src/composables/useState';
 import { useQuasar } from 'quasar';
 
 import VnTable from 'components/VnTable/VnTable.vue';
+import VnRow from 'src/components/ui/VnRow.vue';
+import VnInput from 'src/components/common/VnInput.vue';
+import VnLv from 'src/components/ui/VnLv.vue';
+import FetchData from 'src/components/FetchData.vue';
 import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue';
 import WorkerDescriptorProxy from 'src/pages/Worker/Card/WorkerDescriptorProxy.vue';
 import EntryStockBoughtDetail from 'src/pages/Entry/EntryStockBoughtDetail.vue';
@@ -37,6 +41,7 @@ const columns = [
         columnFilter: false,
         create: true,
         component: 'number',
+        summation: true,
     },
     {
         align: 'left',
@@ -61,6 +66,7 @@ const columns = [
         label: t('Bought'),
         name: 'bought',
         columnFilter: false,
+        summation: true,
     },
     {
         align: 'left',
@@ -92,6 +98,21 @@ const columns = [
         ],
     },
 ];
+function getFilter(dated = Date.vnNow()) {
+    console.log('dated: ', new Date(dated * 1000));
+    return {
+        fields: ['id', 'm3'],
+        where: { dated },
+        include: [
+            {
+                relation: 'warehouseIn',
+                where: { code: 'vnh' },
+            },
+        ],
+    };
+}
+const travel = ref();
+const fetchDataRef = ref();
 </script>
 <template>
     <VnSubToolbar />
@@ -109,11 +130,27 @@ const columns = [
             onDataSaved: () => tableRef.reload(),
             formInitialData: {
                 workerFk: user.id,
-                dated: Date.now(),
+                dated: Date.vnNow(),
             },
         }"
         :columns="columns"
+        auto-load
+        @on-fetch="() => fetchDataRef.fetch()"
     >
+        <template #moreFilterPanel="{ params }">
+            <FetchData
+                ref="fetchDataRef"
+                url="Travels"
+                limit="1"
+                auto-load
+                :filter="getFilter(params?.date)"
+                @on-fetch="(data) => (travel = data)"
+            />
+            <VnRow class="q-pa-md" style="align-items: center" v-if="travel?.length">
+                <span>{{ t('Booked trucks: ') + travel[0]?.m3 }}</span>
+                <QBtn style="max-width: 20%" flat icon="edit" />
+            </VnRow>
+        </template>
         <template #column-workerFk="{ row }">
             <span class="link" @click.stop>
                 {{ row?.worker?.user?.name }}
diff --git a/src/pages/Entry/EntryStockBoughtDetail.vue b/src/pages/Entry/EntryStockBoughtDetail.vue
index f7e89c691..9212f1115 100644
--- a/src/pages/Entry/EntryStockBoughtDetail.vue
+++ b/src/pages/Entry/EntryStockBoughtDetail.vue
@@ -38,9 +38,9 @@ const columns = [
         align: 'left',
         label: t('Name'),
         name: 'itemName',
-        columnFilter: false,
         create: true,
         columnClass: 'expand',
+        columnFilter: false,
     },
     {
         align: 'left',
diff --git a/src/pages/Travel/Card/TravelBasicData.vue b/src/pages/Travel/Card/TravelBasicData.vue
index 8a369a0dd..a3620a6ba 100644
--- a/src/pages/Travel/Card/TravelBasicData.vue
+++ b/src/pages/Travel/Card/TravelBasicData.vue
@@ -70,6 +70,9 @@ const agenciesOptions = ref([]);
                     hide-selected
                 />
             </VnRow>
+            <VnRow>
+                <VnInput v-model="data.m3" label="m3" />
+            </VnRow>
             <VnRow>
                 <QCheckbox
                     :label="t('travel.basicData.delivered')"

From 3dc720e2d0db55c61b7b28df6087d997af241b54 Mon Sep 17 00:00:00 2001
From: pablone <pablone@verdnatura.es>
Date: Wed, 4 Sep 2024 14:40:36 +0200
Subject: [PATCH 04/29] feat: refs #7404 add m3 and fix detail

---
 src/components/VnTable/VnTable.vue            |  36 ++++-
 src/pages/Entry/EntryList.vue                 |   3 -
 src/pages/Entry/EntryStockBought.vue          | 136 +++++++++++-------
 src/pages/Entry/EntryStockBoughtDetail.vue    |   2 +-
 .../integration/entry/stockBought.spec.js     |   2 +-
 5 files changed, 118 insertions(+), 61 deletions(-)

diff --git a/src/components/VnTable/VnTable.vue b/src/components/VnTable/VnTable.vue
index 26b5c424a..0fd6d1dd1 100644
--- a/src/components/VnTable/VnTable.vue
+++ b/src/components/VnTable/VnTable.vue
@@ -90,6 +90,10 @@ const $props = defineProps({
         type: String,
         default: '90vh',
     },
+    footer: {
+        type: Boolean,
+        default: false,
+    },
 });
 const { t } = useI18n();
 const stateStore = useStateStore();
@@ -108,7 +112,7 @@ const orders = ref(parseOrder(routeQuery.filter?.order));
 const CrudModelRef = ref({});
 const showForm = ref(false);
 const splittedColumns = ref({ columns: [] });
-const columnsVisibilitySkippped = ref();
+const columnsVisibilitySkipped = ref();
 const createForm = ref();
 
 const tableModes = [
@@ -347,11 +351,11 @@ defineExpose({
     <CrudModel
         v-bind="$attrs"
         :class="$attrs['class'] ?? 'q-px-md'"
-        :limit="20"
+        :limit="$attrs.limit ?? 20"
         ref="CrudModelRef"
         @on-fetch="(...args) => emit('onFetch', ...args)"
         :search-url="searchUrl"
-        :disable-infinite-scroll="isTableMode"
+        :disable-infinite-scroll="$attrs['disable-infinite-scroll'] ?? isTableMode"
         @save-changes="reload"
         :has-sub-toolbar="$attrs['hasSubToolbar'] ?? isEditable"
         :auto-load="hasParams || $attrs['auto-load']"
@@ -371,7 +375,7 @@ defineExpose({
                 card-container-class="grid-three"
                 flat
                 :style="isTableMode && `max-height: ${tableHeight}`"
-                virtual-scroll
+                :virtual-scroll="!isTableMode"
                 @virtual-scroll="
                     (event) =>
                         event.index > rows.length - 2 &&
@@ -614,6 +618,28 @@ defineExpose({
                         </QCard>
                     </component>
                 </template>
+                <template #bottom-row="{ cols }" v-if="footer">
+                    <QTr v-if="rows.length" class="bg-header" style="height: 30px">
+                        <QTh
+                            v-for="col of cols.filter((cols) => cols.visible ?? true)"
+                            :key="col?.id"
+                            class="text-center"
+                        >
+                            <div
+                                v-if="col?.summation"
+                                :class="`text-${col?.align ?? 'left'}`"
+                                class="text-bold q-pa-sm"
+                            >
+                                {{
+                                    rows.reduce(
+                                        (sum, currentRow) => sum + currentRow[col.name],
+                                        0
+                                    )
+                                }}
+                            </div>
+                        </QTh>
+                    </QTr>
+                </template>
             </QTable>
         </template>
     </CrudModel>
@@ -672,7 +698,7 @@ es:
 }
 
 .bg-header {
-    background-color: var(--vn-header-color);
+    background-color: var(--vn-accent-color);
     color: var(--vn-text-color);
 }
 
diff --git a/src/pages/Entry/EntryList.vue b/src/pages/Entry/EntryList.vue
index c03c67edb..6f7ff1935 100644
--- a/src/pages/Entry/EntryList.vue
+++ b/src/pages/Entry/EntryList.vue
@@ -9,9 +9,6 @@ import RightMenu from 'src/components/common/RightMenu.vue';
 import { toDate } from 'src/filters';
 import { useSummaryDialog } from 'src/composables/useSummaryDialog';
 import EntrySummary from './Card/EntrySummary.vue';
-import VnUserLink from 'components/ui/VnUserLink.vue';
-import WorkerDescriptorProxy from 'src/pages/Worker/Card/WorkerDescriptorProxy.vue';
-import CustomerDescriptorProxy from '../Customer/Card/CustomerDescriptorProxy.vue';
 import SupplierDescriptorProxy from 'src/pages/Supplier/Card/SupplierDescriptorProxy.vue';
 import TravelDescriptorProxy from 'src/pages/Travel/Card/TravelDescriptorProxy.vue';
 
diff --git a/src/pages/Entry/EntryStockBought.vue b/src/pages/Entry/EntryStockBought.vue
index 12fc96214..75d356bd2 100644
--- a/src/pages/Entry/EntryStockBought.vue
+++ b/src/pages/Entry/EntryStockBought.vue
@@ -6,24 +6,23 @@ import { useQuasar } from 'quasar';
 
 import VnTable from 'components/VnTable/VnTable.vue';
 import VnRow from 'src/components/ui/VnRow.vue';
-import VnInput from 'src/components/common/VnInput.vue';
-import VnLv from 'src/components/ui/VnLv.vue';
 import FetchData from 'src/components/FetchData.vue';
 import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue';
 import WorkerDescriptorProxy from 'src/pages/Worker/Card/WorkerDescriptorProxy.vue';
 import EntryStockBoughtDetail from 'src/pages/Entry/EntryStockBoughtDetail.vue';
+import { useRouter } from 'vue-router';
 
 const { t } = useI18n();
 const quasar = useQuasar();
 const tableRef = ref();
 const state = useState();
 const user = state.getUser();
+const router = useRouter();
 const columns = [
     {
         align: 'left',
         label: 'Id',
         name: 'id',
-        isTitle: true,
         isId: true,
         columnFilter: false,
         visible: false,
@@ -32,6 +31,7 @@ const columns = [
         align: 'left',
         name: 'workerFk',
         label: t('Buyer'),
+        isTitle: true,
         columnFilter: false,
     },
     {
@@ -42,6 +42,7 @@ const columns = [
         create: true,
         component: 'number',
         summation: true,
+        cardVisible: true,
     },
     {
         align: 'left',
@@ -67,6 +68,7 @@ const columns = [
         name: 'bought',
         columnFilter: false,
         summation: true,
+        cardVisible: true,
     },
     {
         align: 'left',
@@ -89,7 +91,6 @@ const columns = [
                         component: EntryStockBoughtDetail,
                         componentProps: {
                             workerFk: row.workerFk,
-                            dated: row.dated,
                         },
                         maximized: true,
                     });
@@ -98,15 +99,22 @@ const columns = [
         ],
     },
 ];
-function getFilter(dated = Date.vnNow()) {
-    console.log('dated: ', new Date(dated * 1000));
+
+function navigate(id) {
+    router.push({ path: `/travel/${id}/basic-data` });
+}
+
+function getFilter(dated) {
+    const shipped = dated ? new Date(dated) : Date.vnNew();
+    shipped.setHours(0, 0, 0, 0);
     return {
-        fields: ['id', 'm3'],
-        where: { dated },
+        where: {
+            shipped,
+            m3: { neq: null },
+        },
         include: [
             {
                 relation: 'warehouseIn',
-                where: { code: 'vnh' },
             },
         ],
     };
@@ -116,49 +124,74 @@ const fetchDataRef = ref();
 </script>
 <template>
     <VnSubToolbar />
-    <VnTable
-        ref="tableRef"
-        data-key="StockBoughts"
-        url="StockBoughts/getStockBought"
-        save-url="StockBoughts/crud"
-        order="reserve DESC"
-        :is-editable="true"
-        :disable-option="{ card: true }"
-        :create="{
-            urlCreate: 'StockBoughts',
-            title: t('Reserve some space'),
-            onDataSaved: () => tableRef.reload(),
-            formInitialData: {
-                workerFk: user.id,
-                dated: Date.vnNow(),
-            },
-        }"
-        :columns="columns"
-        auto-load
-        @on-fetch="() => fetchDataRef.fetch()"
-    >
-        <template #moreFilterPanel="{ params }">
-            <FetchData
-                ref="fetchDataRef"
-                url="Travels"
-                limit="1"
-                auto-load
-                :filter="getFilter(params?.date)"
-                @on-fetch="(data) => (travel = data)"
-            />
-            <VnRow class="q-pa-md" style="align-items: center" v-if="travel?.length">
-                <span>{{ t('Booked trucks: ') + travel[0]?.m3 }}</span>
-                <QBtn style="max-width: 20%" flat icon="edit" />
-            </VnRow>
-        </template>
-        <template #column-workerFk="{ row }">
-            <span class="link" @click.stop>
-                {{ row?.worker?.user?.name }}
-                <WorkerDescriptorProxy :id="row?.workerFk" />
-            </span>
-        </template>
-    </VnTable>
+    <QPage class="column items-center q-pa-md">
+        <VnTable
+            ref="tableRef"
+            data-key="StockBoughts"
+            url="StockBoughts/getStockBought"
+            save-url="StockBoughts/crud"
+            order="reserve DESC"
+            :is-editable="true"
+            :create="{
+                urlCreate: 'StockBoughts',
+                title: t('Reserve some space'),
+                onDataSaved: () => tableRef.reload(),
+                formInitialData: {
+                    workerFk: user.id,
+                    dated: Date.vnNow(),
+                },
+            }"
+            :columns="columns"
+            auto-load
+            @on-fetch="() => console.log('fetching...', fetchDataRef.fetch())"
+            style="max-width: 40%"
+            :footer="true"
+        >
+            <template #moreFilterPanel="{ params }">
+                <FetchData
+                    ref="fetchDataRef"
+                    url="Travels"
+                    limit="1"
+                    auto-load
+                    :filter="getFilter(params?.dated)"
+                    @on-fetch="(data) => (travel = data)"
+                />
+                <div class="trucks">
+                    <div>
+                        <span style="color: var(--vn-label-color)">
+                            {{ t('Booked trucks') + ': ' }}
+                        </span>
+                    </div>
+                    <div v-if="travel">
+                        <span>
+                            {{ travel[0]?.m3 }}
+                        </span>
+                        <QBtn
+                            style="max-width: 20%"
+                            flat
+                            icon="edit"
+                            @click="navigate(travel[0]?.id)"
+                        />
+                    </div>
+                </div>
+            </template>
+            <template #column-workerFk="{ row }">
+                <span class="link" @click.stop>
+                    {{ row?.worker?.user?.name }}
+                    <WorkerDescriptorProxy :id="row?.workerFk" />
+                </span>
+            </template>
+        </VnTable>
+    </QPage>
 </template>
+<style lang="scss">
+.trucks {
+    text-align: center;
+    margin: 3%;
+    border: 3px solid var(--vn-header-color);
+    padding: 1%;
+}
+</style>
 <i18n>
     en:
         Buyer: Buyer
@@ -168,6 +201,7 @@ const fetchDataRef = ref();
         Date: Date
         This buyer has already made a reservation for this date: This buyer has already made a reservation for this date
     es:
+        Booked trucks: Camiones reservados
         Buyer: Comprador
         Reserve: Reservado
         Bought: Comprado
diff --git a/src/pages/Entry/EntryStockBoughtDetail.vue b/src/pages/Entry/EntryStockBoughtDetail.vue
index 9212f1115..b9420af71 100644
--- a/src/pages/Entry/EntryStockBoughtDetail.vue
+++ b/src/pages/Entry/EntryStockBoughtDetail.vue
@@ -18,7 +18,7 @@ const $props = defineProps({
         required: true,
     },
 });
-const customUrl = `StockBoughts/getStockBoughtDetail?workerFk=${$props.workerFk}`;
+const customUrl = `StockBoughts/getStockBoughtDetail?workerFk=${$props.workerFk}&date=${$props.dated}`;
 const columns = [
     {
         align: 'left',
diff --git a/test/cypress/integration/entry/stockBought.spec.js b/test/cypress/integration/entry/stockBought.spec.js
index 8e4fe225c..10af3ef42 100644
--- a/test/cypress/integration/entry/stockBought.spec.js
+++ b/test/cypress/integration/entry/stockBought.spec.js
@@ -8,7 +8,7 @@ describe('EntryStockBought', () => {
         );
     });
     it('Should edit the reserved space', () => {
-        cy.get('tBody > tr').its('length').should('eq', 1);
+        cy.get('tBody > tr').its('length').should('eq', 2);
         cy.get(reserveField).type('10{enter}');
         cy.get('button[title="Save"]').click();
         cy.get('.q-notification__message').should('have.text', 'Data saved');

From cd12343302c9fea5bc5419ac04731d43b75baf2d Mon Sep 17 00:00:00 2001
From: pablone <pablone@verdnatura.es>
Date: Fri, 6 Sep 2024 07:26:04 +0200
Subject: [PATCH 05/29] feat: refs #7404 add some style to the form and
 reorganize fields

---
 src/components/VnTable/VnColumn.vue        |   3 +
 src/components/VnTable/VnTable.vue         |   8 +-
 src/components/common/VnComponent.vue      |   6 +-
 src/pages/Entry/EntryStockBought.vue       | 119 ++++++++++-----------
 src/pages/Entry/EntryStockBoughtFilter.vue |  57 ++++++++++
 src/pages/Route/Card/RouteSearchbar.vue    |   1 -
 src/pages/Route/RouteList.vue              |   1 -
 7 files changed, 120 insertions(+), 75 deletions(-)
 create mode 100644 src/pages/Entry/EntryStockBoughtFilter.vue

diff --git a/src/components/VnTable/VnColumn.vue b/src/components/VnTable/VnColumn.vue
index ed34e9eee..ad120f02e 100644
--- a/src/components/VnTable/VnColumn.vue
+++ b/src/components/VnTable/VnColumn.vue
@@ -171,6 +171,8 @@ const components = computed(() => $props.components ?? defaultComponents);
             :value="{ row, model }"
             v-model="model"
         />
+
+        {{ console.log('model: ', col) }}
         <VnComponent
             v-if="col.component"
             :prop="col"
@@ -178,6 +180,7 @@ const components = computed(() => $props.components ?? defaultComponents);
             :value="{ row, model }"
             v-model="model"
         />
+
         <span :title="value" v-else>{{ value }}</span>
         <VnComponent
             v-if="col.after"
diff --git a/src/components/VnTable/VnTable.vue b/src/components/VnTable/VnTable.vue
index 0fd6d1dd1..b5d6e8d10 100644
--- a/src/components/VnTable/VnTable.vue
+++ b/src/components/VnTable/VnTable.vue
@@ -15,7 +15,6 @@ import VnTableChip from 'components/VnTable/VnChip.vue';
 import VnVisibleColumn from 'src/components/VnTable/VnVisibleColumn.vue';
 import VnLv from 'components/ui/VnLv.vue';
 import VnTableOrder from 'src/components/VnTable/VnOrder.vue';
-import item from 'src/router/modules/item';
 
 const $props = defineProps({
     columns: {
@@ -410,7 +409,7 @@ defineExpose({
                     />
                 </template>
                 <template #header-cell="{ col }">
-                    <QTh v-if="col.visible ?? true">
+                    <QTh table-header-style="max-width:50%" v-if="col.visible ?? true">
                         <div
                             class="column self-start q-ml-xs ellipsis"
                             :class="`text-${col?.align ?? 'left'}`"
@@ -665,6 +664,7 @@ defineExpose({
                         :column-name="column.name"
                         :label="column.label"
                     >
+                        {{ console.log('data: ', data) }}
                         <VnTableColumn
                             :column="column"
                             :row="{}"
@@ -708,9 +708,7 @@ es:
 
 .q-table--dark .q-table__bottom,
 .q-table--dark thead,
-.q-table--dark tr,
-.q-table--dark th,
-.q-table--dark td {
+.q-table--dark tr {
     border-color: var(--vn-section-color);
 }
 
diff --git a/src/components/common/VnComponent.vue b/src/components/common/VnComponent.vue
index fa99f9892..1ba1506d5 100644
--- a/src/components/common/VnComponent.vue
+++ b/src/components/common/VnComponent.vue
@@ -17,17 +17,16 @@ const $props = defineProps({
     },
 });
 
-let mixed;
 const componentArray = computed(() => {
     if (typeof $props.prop === 'object') return [$props.prop];
     return $props.prop;
 });
 
 function mix(toComponent) {
-    if (mixed) return mixed;
     const { component, attrs, event } = toComponent;
+    console.log('attrs: ', attrs);
     const customComponent = $props.components[component];
-    mixed = {
+    return {
         component: customComponent?.component ?? component,
         attrs: {
             ...toValueAttrs(attrs),
@@ -37,7 +36,6 @@ function mix(toComponent) {
         },
         event: { ...customComponent?.event, ...event },
     };
-    return mixed;
 }
 
 function toValueAttrs(attrs) {
diff --git a/src/pages/Entry/EntryStockBought.vue b/src/pages/Entry/EntryStockBought.vue
index 75d356bd2..8f197be92 100644
--- a/src/pages/Entry/EntryStockBought.vue
+++ b/src/pages/Entry/EntryStockBought.vue
@@ -4,20 +4,18 @@ import { useI18n } from 'vue-i18n';
 import { useState } from 'src/composables/useState';
 import { useQuasar } from 'quasar';
 
-import VnTable from 'components/VnTable/VnTable.vue';
-import VnRow from 'src/components/ui/VnRow.vue';
-import FetchData from 'src/components/FetchData.vue';
 import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue';
+import RightMenu from 'src/components/common/RightMenu.vue';
+import EntryStockBoughtFilter from './EntryStockBoughtFilter.vue';
+import VnTable from 'components/VnTable/VnTable.vue';
 import WorkerDescriptorProxy from 'src/pages/Worker/Card/WorkerDescriptorProxy.vue';
 import EntryStockBoughtDetail from 'src/pages/Entry/EntryStockBoughtDetail.vue';
-import { useRouter } from 'vue-router';
 
 const { t } = useI18n();
 const quasar = useQuasar();
 const tableRef = ref();
 const state = useState();
 const user = state.getUser();
-const router = useRouter();
 const columns = [
     {
         align: 'left',
@@ -31,8 +29,17 @@ const columns = [
         align: 'left',
         name: 'workerFk',
         label: t('Buyer'),
-        isTitle: true,
-        columnFilter: false,
+        component: 'select',
+        create: true,
+        attrs: {
+            url: 'Workers/activeWithInheritedRole',
+            fields: ['id', 'name'],
+            where: { role: 'buyer' },
+            optionFilter: 'firstName',
+            optionLabel: 'name',
+            optionValue: 'id',
+            useLike: false,
+        },
     },
     {
         align: 'left',
@@ -44,31 +51,13 @@ const columns = [
         summation: true,
         cardVisible: true,
     },
-    {
-        align: 'left',
-        name: 'workerFk',
-        label: t('Buyer'),
-        component: 'select',
-        create: true,
-        visible: false,
-        columnFilter: false,
-        attrs: {
-            url: 'Workers/activeWithInheritedRole',
-            fields: ['id', 'name'],
-            where: { role: 'buyer' },
-            optionFilter: 'firstName',
-            optionLabel: 'name',
-            optionValue: 'id',
-            useLike: false,
-        },
-    },
     {
         align: 'left',
         label: t('Bought'),
         name: 'bought',
-        columnFilter: false,
         summation: true,
         cardVisible: true,
+        columnFilter: false,
     },
     {
         align: 'left',
@@ -92,7 +81,6 @@ const columns = [
                         componentProps: {
                             workerFk: row.workerFk,
                         },
-                        maximized: true,
                     });
                 },
             },
@@ -100,10 +88,6 @@ const columns = [
     },
 ];
 
-function navigate(id) {
-    router.push({ path: `/travel/${id}/basic-data` });
-}
-
 function getFilter(dated) {
     const shipped = dated ? new Date(dated) : Date.vnNew();
     shipped.setHours(0, 0, 0, 0);
@@ -119,11 +103,46 @@ function getFilter(dated) {
         ],
     };
 }
-const travel = ref();
-const fetchDataRef = ref();
+const userParams = ref({
+    dated: Date.vnNew(),
+});
 </script>
 <template>
-    <VnSubToolbar />
+    <VnSubToolbar>
+        <template #st-data="{ params }">
+            <FetchData
+                ref="fetchDataRef"
+                url="Travels"
+                limit="1"
+                auto-load
+                :filter="getFilter(params?.dated)"
+                @on-fetch="(data) => (travel = data)"
+            />
+            <div>
+                <div>
+                    <span style="color: var(--vn-label-color)">
+                        {{ t('Booked trucks') + ': ' }}
+                    </span>
+                </div>
+                <div v-if="travel">
+                    <span>
+                        {{ travel[0]?.m3 }}
+                    </span>
+                    <QBtn
+                        style="max-width: 20%"
+                        flat
+                        icon="edit"
+                        @click="navigate(travel[0]?.id)"
+                    />
+                </div>
+            </div>
+        </template>
+    </VnSubToolbar>
+    <RightMenu>
+        <template #right-panel>
+            <EntryStockBoughtFilter data-key="StockBoughts" />
+        </template>
+    </RightMenu>
     <QPage class="column items-center q-pa-md">
         <VnTable
             ref="tableRef"
@@ -131,6 +150,7 @@ const fetchDataRef = ref();
             url="StockBoughts/getStockBought"
             save-url="StockBoughts/crud"
             order="reserve DESC"
+            :right-search="false"
             :is-editable="true"
             :create="{
                 urlCreate: 'StockBoughts',
@@ -142,39 +162,10 @@ const fetchDataRef = ref();
                 },
             }"
             :columns="columns"
+            :user-params="userParams"
             auto-load
-            @on-fetch="() => console.log('fetching...', fetchDataRef.fetch())"
-            style="max-width: 40%"
             :footer="true"
         >
-            <template #moreFilterPanel="{ params }">
-                <FetchData
-                    ref="fetchDataRef"
-                    url="Travels"
-                    limit="1"
-                    auto-load
-                    :filter="getFilter(params?.dated)"
-                    @on-fetch="(data) => (travel = data)"
-                />
-                <div class="trucks">
-                    <div>
-                        <span style="color: var(--vn-label-color)">
-                            {{ t('Booked trucks') + ': ' }}
-                        </span>
-                    </div>
-                    <div v-if="travel">
-                        <span>
-                            {{ travel[0]?.m3 }}
-                        </span>
-                        <QBtn
-                            style="max-width: 20%"
-                            flat
-                            icon="edit"
-                            @click="navigate(travel[0]?.id)"
-                        />
-                    </div>
-                </div>
-            </template>
             <template #column-workerFk="{ row }">
                 <span class="link" @click.stop>
                     {{ row?.worker?.user?.name }}
diff --git a/src/pages/Entry/EntryStockBoughtFilter.vue b/src/pages/Entry/EntryStockBoughtFilter.vue
new file mode 100644
index 000000000..3393113f2
--- /dev/null
+++ b/src/pages/Entry/EntryStockBoughtFilter.vue
@@ -0,0 +1,57 @@
+<script setup>
+import { ref } from 'vue';
+import { useI18n } from 'vue-i18n';
+import { onMounted } from 'vue';
+import { useStateStore } from 'stores/useStateStore';
+
+import VnFilterPanel from 'src/components/ui/VnFilterPanel.vue';
+import FetchData from 'components/FetchData.vue';
+import VnInputDate from 'src/components/common/VnInputDate.vue';
+
+const { t } = useI18n();
+const props = defineProps({
+    dataKey: {
+        type: String,
+        required: true,
+    },
+});
+
+const companiesOptions = ref([]);
+const stateStore = useStateStore();
+onMounted(async () => {
+    stateStore.rightDrawer = true;
+});
+</script>
+
+<template>
+    <FetchData
+        ref="buyer"
+        url="Workers/activeWithInheritedRole"
+        :filter="{
+            fields: ['id', 'name'],
+            where: { role: 'buyer' },
+        }"
+        order="name"
+        @on-fetch="(data) => (companiesOptions = data)"
+        auto-load
+    />
+    <VnFilterPanel :data-key="props.dataKey" :search-button="true">
+        <template #tags="{ tag, formatFn }">
+            <div class="q-gutter-x-xs">
+                <strong>{{ t(`params.${tag.label}`) }}: </strong>
+                <span>{{ formatFn(tag.value) }}</span>
+            </div>
+        </template>
+        <template #body="{ params }">
+            <QItem class="q-my-sm">
+                <QItemSection>
+                    <VnInputDate v-model="params.dated" :label="t('Date')" is-outlined />
+                </QItemSection>
+            </QItem>
+        </template>
+    </VnFilterPanel>
+</template>
+<i18n>
+    es:
+        Date: Fecha
+</i18n>
diff --git a/src/pages/Route/Card/RouteSearchbar.vue b/src/pages/Route/Card/RouteSearchbar.vue
index 48ad09151..a8e11cef6 100644
--- a/src/pages/Route/Card/RouteSearchbar.vue
+++ b/src/pages/Route/Card/RouteSearchbar.vue
@@ -3,7 +3,6 @@ import VnSearchbar from 'components/ui/VnSearchbar.vue';
 import { useI18n } from 'vue-i18n';
 const { t } = useI18n();
 </script>
-
 <template>
     <VnSearchbar
         data-key="RouteList"
diff --git a/src/pages/Route/RouteList.vue b/src/pages/Route/RouteList.vue
index ef544a68d..7e2358236 100644
--- a/src/pages/Route/RouteList.vue
+++ b/src/pages/Route/RouteList.vue
@@ -409,5 +409,4 @@ es:
     Route is not served: La ruta no está servida
     hourStarted: Hora de inicio
     hourFinished: Hora de fin
-    Volume: Volumen
 </i18n>

From 684215fc4613eb9e24f98775bc713eef916529d5 Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Mon, 9 Sep 2024 09:59:22 +0200
Subject: [PATCH 06/29] feat(AccountBasicData): add twoFactorFk

---
 src/pages/Account/Card/AccountBasicData.vue         | 9 ++++++++-
 src/pages/Account/locale/en.yml                     | 1 +
 src/pages/Account/locale/es.yml                     | 1 +
 test/cypress/integration/outLogin/twoFactor.spec.js | 2 +-
 4 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/src/pages/Account/Card/AccountBasicData.vue b/src/pages/Account/Card/AccountBasicData.vue
index f38299f9e..b223c4bc0 100644
--- a/src/pages/Account/Card/AccountBasicData.vue
+++ b/src/pages/Account/Card/AccountBasicData.vue
@@ -24,7 +24,7 @@ watch(
 <template>
     <FormModel
         ref="formModelRef"
-        :url="`VnUsers/preview`"
+        url="VnUsers/preview"
         :url-update="`VnUsers/${route.params.id}/update-user`"
         :filter="accountFilter"
         model="Accounts"
@@ -43,6 +43,13 @@ watch(
                     option-value="code"
                     option-label="code"
                 />
+                <VnSelect
+                    url="TwoFactorTypes"
+                    v-model="data.twoFactorFk"
+                    :label="t('account.card.twoFactor')"
+                    option-value="code"
+                    option-label="code"
+                />
             </div>
         </template>
     </FormModel>
diff --git a/src/pages/Account/locale/en.yml b/src/pages/Account/locale/en.yml
index 3cf861fb2..fe8707eb8 100644
--- a/src/pages/Account/locale/en.yml
+++ b/src/pages/Account/locale/en.yml
@@ -35,6 +35,7 @@ account:
         willDeactivated: User will be deactivated
         activated: User activated!
         deactivated: User deactivated!
+        twoFactor: Two factor
         actions:
             setPassword: Set password
             disableAccount:
diff --git a/src/pages/Account/locale/es.yml b/src/pages/Account/locale/es.yml
index b53a0153c..112ffe9cc 100644
--- a/src/pages/Account/locale/es.yml
+++ b/src/pages/Account/locale/es.yml
@@ -32,6 +32,7 @@ account:
         activated: ¡Usuario activado!
         deactivated: ¡Usuario desactivado!
         newUser: Nuevo usuario
+        twoFactor: Doble factor
         privileges:
             delegate: Puede delegar privilegios
         actions:
diff --git a/test/cypress/integration/outLogin/twoFactor.spec.js b/test/cypress/integration/outLogin/twoFactor.spec.js
index 4d8561f0f..259ddfc0f 100755
--- a/test/cypress/integration/outLogin/twoFactor.spec.js
+++ b/test/cypress/integration/outLogin/twoFactor.spec.js
@@ -12,7 +12,7 @@ describe('Two Factor', () => {
         cy.request(
             'PATCH',
             `http://localhost:3000/api/VnUsers/${userId}/update-user?access_token=DEFAULT_TOKEN`,
-            { twoFactor: 'email' }
+            { twoFactorFk: 'email' }
         );
     });
 

From c7e717c61108c59e29d35a2f65796aa5492f05bf Mon Sep 17 00:00:00 2001
From: pablone <pablone@verdnatura.es>
Date: Wed, 11 Sep 2024 07:55:12 +0200
Subject: [PATCH 07/29] feat: refs #7404 add travel m3 to reserves form

---
 src/components/VnTable/VnColumn.vue           |  3 -
 src/components/common/VnComponent.vue         |  1 -
 src/components/ui/VnFilterPanel.vue           |  1 +
 src/pages/Entry/EntryStockBought.vue          | 84 ++++++++++++++-----
 src/pages/Entry/EntryStockBoughtFilter.vue    | 11 ++-
 .../integration/entry/stockBought.spec.js     |  2 +-
 6 files changed, 76 insertions(+), 26 deletions(-)

diff --git a/src/components/VnTable/VnColumn.vue b/src/components/VnTable/VnColumn.vue
index ad120f02e..ed34e9eee 100644
--- a/src/components/VnTable/VnColumn.vue
+++ b/src/components/VnTable/VnColumn.vue
@@ -171,8 +171,6 @@ const components = computed(() => $props.components ?? defaultComponents);
             :value="{ row, model }"
             v-model="model"
         />
-
-        {{ console.log('model: ', col) }}
         <VnComponent
             v-if="col.component"
             :prop="col"
@@ -180,7 +178,6 @@ const components = computed(() => $props.components ?? defaultComponents);
             :value="{ row, model }"
             v-model="model"
         />
-
         <span :title="value" v-else>{{ value }}</span>
         <VnComponent
             v-if="col.after"
diff --git a/src/components/common/VnComponent.vue b/src/components/common/VnComponent.vue
index 1ba1506d5..bd25c787c 100644
--- a/src/components/common/VnComponent.vue
+++ b/src/components/common/VnComponent.vue
@@ -24,7 +24,6 @@ const componentArray = computed(() => {
 
 function mix(toComponent) {
     const { component, attrs, event } = toComponent;
-    console.log('attrs: ', attrs);
     const customComponent = $props.components[component];
     return {
         component: customComponent?.component ?? component,
diff --git a/src/components/ui/VnFilterPanel.vue b/src/components/ui/VnFilterPanel.vue
index cebdc4bbf..b3bdec0a5 100644
--- a/src/components/ui/VnFilterPanel.vue
+++ b/src/components/ui/VnFilterPanel.vue
@@ -58,6 +58,7 @@ const $props = defineProps({
 });
 
 defineExpose({ search, sanitizer });
+
 const emit = defineEmits([
     'update:modelValue',
     'refresh',
diff --git a/src/pages/Entry/EntryStockBought.vue b/src/pages/Entry/EntryStockBought.vue
index 8f197be92..ad338acb1 100644
--- a/src/pages/Entry/EntryStockBought.vue
+++ b/src/pages/Entry/EntryStockBought.vue
@@ -1,10 +1,13 @@
 <script setup>
-import { ref } from 'vue';
+import { onMounted, ref, watch } from 'vue';
 import { useI18n } from 'vue-i18n';
 import { useState } from 'src/composables/useState';
 import { useQuasar } from 'quasar';
 
 import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue';
+import axios from 'axios';
+import FetchData from 'components/FetchData.vue';
+import VnRow from 'components/ui/VnRow.vue';
 import RightMenu from 'src/components/common/RightMenu.vue';
 import EntryStockBoughtFilter from './EntryStockBoughtFilter.vue';
 import VnTable from 'components/VnTable/VnTable.vue';
@@ -13,7 +16,6 @@ import EntryStockBoughtDetail from 'src/pages/Entry/EntryStockBoughtDetail.vue';
 
 const { t } = useI18n();
 const quasar = useQuasar();
-const tableRef = ref();
 const state = useState();
 const user = state.getUser();
 const columns = [
@@ -88,7 +90,32 @@ const columns = [
     },
 ];
 
+const fetchDataRef = ref();
+const tableRef = ref();
+const travel = ref(null);
+const userParams = ref({
+    dated: Date.vnNew(),
+});
+const filter = ref({
+    where: {
+        shipped: (userParams.value.dated
+            ? new Date(userParams.value.dated)
+            : Date.vnNew()
+        ).setHours(0, 0, 0, 0),
+        m3: { neq: null },
+    },
+    include: [
+        {
+            relation: 'warehouseIn',
+            scope: {
+                where: { code: 'vnh' },
+            },
+        },
+    ],
+});
+
 function getFilter(dated) {
+    console.log('dated: ', dated);
     const shipped = dated ? new Date(dated) : Date.vnNew();
     shipped.setHours(0, 0, 0, 0);
     return {
@@ -99,48 +126,62 @@ function getFilter(dated) {
         include: [
             {
                 relation: 'warehouseIn',
+                scope: {
+                    where: { code: 'vnh' },
+                },
             },
         ],
     };
 }
-const userParams = ref({
-    dated: Date.vnNew(),
-});
+
+const setUserParams = async ({ dated }) => {
+    const shipped = (dated ? new Date(dated) : Date.vnNew()).setHours(0, 0, 0, 0);
+
+    filter.value.where.shipped = shipped;
+    fetchDataRef.value?.fetch();
+};
 </script>
 <template>
     <VnSubToolbar>
-        <template #st-data="{ params }">
+        <template #st-data>
             <FetchData
                 ref="fetchDataRef"
                 url="Travels"
                 limit="1"
                 auto-load
-                :filter="getFilter(params?.dated)"
+                :filter="filter"
                 @on-fetch="(data) => (travel = data)"
             />
-            <div>
-                <div>
-                    <span style="color: var(--vn-label-color)">
-                        {{ t('Booked trucks') + ': ' }}
-                    </span>
-                </div>
-                <div v-if="travel">
+
+            <VnRow>
+                <div v-if="travel" class="q-pa-md">
+                    <QIcon
+                        name="local_airport"
+                        class="fill-icon q-mr-sm"
+                        size="md"
+                        :title="t('Travel')"
+                        color="primary"
+                    />
                     <span>
-                        {{ travel[0]?.m3 }}
+                        {{ t('Booked trucks') + ': ' + travel[0]?.m3 }}
                     </span>
                     <QBtn
                         style="max-width: 20%"
                         flat
                         icon="edit"
                         @click="navigate(travel[0]?.id)"
+                        :title="t('Edit travel')"
                     />
                 </div>
-            </div>
+            </VnRow>
         </template>
     </VnSubToolbar>
     <RightMenu>
         <template #right-panel>
-            <EntryStockBoughtFilter data-key="StockBoughts" />
+            <EntryStockBoughtFilter
+                data-key="StockBoughts"
+                @set-user-params="setUserParams"
+            />
         </template>
     </RightMenu>
     <QPage class="column items-center q-pa-md">
@@ -155,7 +196,10 @@ const userParams = ref({
             :create="{
                 urlCreate: 'StockBoughts',
                 title: t('Reserve some space'),
-                onDataSaved: () => tableRef.reload(),
+                onDataSaved: () => {
+                    tableRef.reload();
+                    fetchDataRef.reload();
+                },
                 formInitialData: {
                     workerFk: user.id,
                     dated: Date.vnNow(),
@@ -163,8 +207,8 @@ const userParams = ref({
             }"
             :columns="columns"
             :user-params="userParams"
-            auto-load
             :footer="true"
+            auto-load
         >
             <template #column-workerFk="{ row }">
                 <span class="link" @click.stop>
@@ -192,6 +236,8 @@ const userParams = ref({
         Date: Date
         This buyer has already made a reservation for this date: This buyer has already made a reservation for this date
     es:
+        Edit travel: Editar envío
+        Travel: Envíos
         Booked trucks: Camiones reservados
         Buyer: Comprador
         Reserve: Reservado
diff --git a/src/pages/Entry/EntryStockBoughtFilter.vue b/src/pages/Entry/EntryStockBoughtFilter.vue
index 3393113f2..aaf9e7a5b 100644
--- a/src/pages/Entry/EntryStockBoughtFilter.vue
+++ b/src/pages/Entry/EntryStockBoughtFilter.vue
@@ -15,9 +15,12 @@ const props = defineProps({
         required: true,
     },
 });
-
 const companiesOptions = ref([]);
 const stateStore = useStateStore();
+const emit = defineEmits(['set-user-params']);
+const setUserParams = (params) => {
+    emit('set-user-params', params);
+};
 onMounted(async () => {
     stateStore.rightDrawer = true;
 });
@@ -35,7 +38,11 @@ onMounted(async () => {
         @on-fetch="(data) => (companiesOptions = data)"
         auto-load
     />
-    <VnFilterPanel :data-key="props.dataKey" :search-button="true">
+    <VnFilterPanel
+        :data-key="props.dataKey"
+        :search-button="true"
+        @set-user-params="setUserParams"
+    >
         <template #tags="{ tag, formatFn }">
             <div class="q-gutter-x-xs">
                 <strong>{{ t(`params.${tag.label}`) }}: </strong>
diff --git a/test/cypress/integration/entry/stockBought.spec.js b/test/cypress/integration/entry/stockBought.spec.js
index 10af3ef42..a18e2bd2e 100644
--- a/test/cypress/integration/entry/stockBought.spec.js
+++ b/test/cypress/integration/entry/stockBought.spec.js
@@ -20,7 +20,7 @@ describe('EntryStockBought', () => {
         cy.get('input[aria-label="Date"]').eq(1).type('01-01');
         cy.get('input[aria-label="Buyer"]').type('buyerboss{downarrow}{enter}');
         cy.get('.q-notification__message').should('have.text', 'Data created');
-        cy.get('tBody > tr').its('length').should('eq', 2);
+        cy.get('tBody > tr').its('length').should('eq', 3);
     });
     it('Should check detail for the buyer', () => {
         cy.get(':nth-child(1) > .sticky > .q-btn > .q-btn__content > .q-icon').click();

From 8be1833f9e7bbf6b9d6bc8163b84eb090ecbb1b8 Mon Sep 17 00:00:00 2001
From: carlossa <carlossa@verdnatura.es>
Date: Fri, 13 Sep 2024 08:49:36 +0200
Subject: [PATCH 08/29] refs #7155 scopeDays

---
 src/pages/Travel/TravelList.vue | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/src/pages/Travel/TravelList.vue b/src/pages/Travel/TravelList.vue
index c7ad908f9..0fba3a8d3 100644
--- a/src/pages/Travel/TravelList.vue
+++ b/src/pages/Travel/TravelList.vue
@@ -11,6 +11,7 @@ import TravelSummary from './Card/TravelSummary.vue';
 import VnSearchbar from 'components/ui/VnSearchbar.vue';
 import { toDate } from 'src/filters';
 import { getDateQBadgeColor } from 'src/composables/getDateQBadgeColor.js';
+import { dateRange } from 'src/filters';
 const { viewSummary } = useSummaryDialog();
 const router = useRouter();
 const { t } = useI18n();
@@ -29,6 +30,18 @@ const cloneTravel = (travelData) => {
     redirectToCreateView(stringifiedTravelData);
 };
 
+const handleScopeDays = (params, days, callback) => {
+    const [from, to] = dateRange(Date.vnNew());
+    if (!days) {
+        Object.assign(params, { from, to, scopeDays: 1 });
+    } else {
+        params.from = from;
+        to.setDate(to.getDate() + days);
+        params.to = to;
+    }
+    if (callback) callback();
+};
+
 const redirectToCreateView = (queryParams) => {
     router.push({ name: 'TravelCreate', query: { travelData: queryParams } });
 };

From 842fb9de5fb1773738cca1d4f236a29171320287 Mon Sep 17 00:00:00 2001
From: carlossa <carlossa@verdnatura.es>
Date: Fri, 13 Sep 2024 12:52:25 +0200
Subject: [PATCH 09/29] refs #7155 scopeDays fix

---
 src/components/VnTable/VnTable.vue |  1 +
 src/pages/Travel/TravelList.vue    | 43 +++++++++++++++++++-----------
 2 files changed, 29 insertions(+), 15 deletions(-)

diff --git a/src/components/VnTable/VnTable.vue b/src/components/VnTable/VnTable.vue
index 0ed3de261..798213c08 100644
--- a/src/components/VnTable/VnTable.vue
+++ b/src/components/VnTable/VnTable.vue
@@ -301,6 +301,7 @@ defineExpose({
     redirect: redirectFn,
     selected,
     CrudModelRef,
+    params,
 });
 
 function handleOnDataSaved(_) {
diff --git a/src/pages/Travel/TravelList.vue b/src/pages/Travel/TravelList.vue
index 0fba3a8d3..a0976e92c 100644
--- a/src/pages/Travel/TravelList.vue
+++ b/src/pages/Travel/TravelList.vue
@@ -12,6 +12,8 @@ import VnSearchbar from 'components/ui/VnSearchbar.vue';
 import { toDate } from 'src/filters';
 import { getDateQBadgeColor } from 'src/composables/getDateQBadgeColor.js';
 import { dateRange } from 'src/filters';
+import VnInputNumber from 'src/components/common/VnInputNumber.vue';
+
 const { viewSummary } = useSummaryDialog();
 const router = useRouter();
 const { t } = useI18n();
@@ -25,22 +27,26 @@ const $props = defineProps({
     },
 });
 const entityId = computed(() => $props.id || route.params.id);
+
+onMounted(async () => {
+    stateStore.rightDrawer = true;
+    handleScopeDays();
+});
+
 const cloneTravel = (travelData) => {
     const stringifiedTravelData = JSON.stringify(travelData);
     redirectToCreateView(stringifiedTravelData);
 };
 
-const handleScopeDays = (params, days, callback) => {
-    const [from, to] = dateRange(Date.vnNew());
-    if (!days) {
-        Object.assign(params, { from, to, scopeDays: 1 });
-    } else {
-        params.from = from;
-        to.setDate(to.getDate() + days);
-        params.to = to;
-    }
-    if (callback) callback();
-};
+function handleScopeDays(days = 7) {
+    days = +days;
+    tableRef.value.params.scopeDays = days;
+    const [landedFrom, landedTo] = dateRange(Date.vnNew());
+    landedTo.setDate(landedTo.getDate() + days);
+
+    tableRef.value.params.landedFrom = landedFrom;
+    tableRef.value.params.landedTo = landedTo;
+}
 
 const redirectToCreateView = (queryParams) => {
     router.push({ name: 'TravelCreate', query: { travelData: queryParams } });
@@ -50,10 +56,6 @@ const redirectCreateEntryView = (travelData) => {
     router.push({ name: 'EntryCreate', query: { travelFk: travelData.id } });
 };
 
-onMounted(async () => {
-    stateStore.rightDrawer = true;
-});
-
 const columns = computed(() => [
     {
         align: 'left',
@@ -254,6 +256,17 @@ const columns = computed(() => [
                 :class="{ 'is-active': row.isReceived }"
             />
         </template>
+        <template #moreFilterPanel="{ params }">
+            <VnInputNumber
+                :label="t('params.scopeDays')"
+                v-model.number="params.scopeDays"
+                @keyup.enter="(evt) => handleScopeDays(evt.target.value)"
+                @remove="handleScopeDays()"
+                class="q-px-xs q-pr-lg"
+                filled
+                dense
+            />
+        </template>
     </VnTable>
 </template>
 

From deb30ee9551cab217665947ec1fd1df37362536a Mon Sep 17 00:00:00 2001
From: pablone <pablone@verdnatura.es>
Date: Mon, 16 Sep 2024 08:59:36 +0200
Subject: [PATCH 10/29] feat: refs #7404 travel m3 form

---
 src/components/VnTable/VnOrder.vue            |   2 +-
 src/pages/Entry/EntryStockBought.vue          | 102 +++++++++---------
 src/pages/Entry/EntryStockBoughtDetail.vue    |  66 +++++++-----
 src/pages/Entry/EntryStockBoughtFilter.vue    |  29 +++--
 .../integration/entry/stockBought.spec.js     |  15 ++-
 5 files changed, 116 insertions(+), 98 deletions(-)

diff --git a/src/components/VnTable/VnOrder.vue b/src/components/VnTable/VnOrder.vue
index 98c7ab392..7fdd23b78 100644
--- a/src/components/VnTable/VnOrder.vue
+++ b/src/components/VnTable/VnOrder.vue
@@ -4,7 +4,7 @@ import { useArrayData } from 'composables/useArrayData';
 const model = defineModel({ type: Object });
 const $props = defineProps({
     name: {
-        type: String,
+        type: [String, Boolean],
         default: '',
     },
     label: {
diff --git a/src/pages/Entry/EntryStockBought.vue b/src/pages/Entry/EntryStockBought.vue
index ad338acb1..c8f147b1f 100644
--- a/src/pages/Entry/EntryStockBought.vue
+++ b/src/pages/Entry/EntryStockBought.vue
@@ -1,12 +1,13 @@
 <script setup>
-import { onMounted, ref, watch } from 'vue';
+import { ref } from 'vue';
 import { useI18n } from 'vue-i18n';
 import { useState } from 'src/composables/useState';
 import { useQuasar } from 'quasar';
 
 import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue';
-import axios from 'axios';
 import FetchData from 'components/FetchData.vue';
+import FormModelPopup from 'components/FormModelPopup.vue';
+import VnInput from 'src/components/common/VnInput.vue';
 import VnRow from 'components/ui/VnRow.vue';
 import RightMenu from 'src/components/common/RightMenu.vue';
 import EntryStockBoughtFilter from './EntryStockBoughtFilter.vue';
@@ -31,7 +32,9 @@ const columns = [
         align: 'left',
         name: 'workerFk',
         label: t('Buyer'),
+        isTitle: true,
         component: 'select',
+        cardVisible: true,
         create: true,
         attrs: {
             url: 'Workers/activeWithInheritedRole',
@@ -82,6 +85,7 @@ const columns = [
                         component: EntryStockBoughtDetail,
                         componentProps: {
                             workerFk: row.workerFk,
+                            dated: userParams.value.dated,
                         },
                     });
                 },
@@ -91,6 +95,7 @@ const columns = [
 ];
 
 const fetchDataRef = ref();
+const travelDialogRef = ref(false);
 const tableRef = ref();
 const travel = ref(null);
 const userParams = ref({
@@ -108,38 +113,21 @@ const filter = ref({
         {
             relation: 'warehouseIn',
             scope: {
-                where: { code: 'vnh' },
+                fields: ['code'],
             },
         },
     ],
 });
 
-function getFilter(dated) {
-    console.log('dated: ', dated);
-    const shipped = dated ? new Date(dated) : Date.vnNew();
-    shipped.setHours(0, 0, 0, 0);
-    return {
-        where: {
-            shipped,
-            m3: { neq: null },
-        },
-        include: [
-            {
-                relation: 'warehouseIn',
-                scope: {
-                    where: { code: 'vnh' },
-                },
-            },
-        ],
-    };
-}
-
 const setUserParams = async ({ dated }) => {
     const shipped = (dated ? new Date(dated) : Date.vnNew()).setHours(0, 0, 0, 0);
-
     filter.value.where.shipped = shipped;
     fetchDataRef.value?.fetch();
 };
+
+function openDialog() {
+    travelDialogRef.value = true;
+}
 </script>
 <template>
     <VnSubToolbar>
@@ -147,35 +135,55 @@ const setUserParams = async ({ dated }) => {
             <FetchData
                 ref="fetchDataRef"
                 url="Travels"
-                limit="1"
                 auto-load
                 :filter="filter"
-                @on-fetch="(data) => (travel = data)"
+                @on-fetch="
+                    (data) => {
+                        travel = data.filter((data) => data.warehouseIn.code === 'VNH');
+                    }
+                "
             />
-
-            <VnRow>
-                <div v-if="travel" class="q-pa-md">
-                    <QIcon
-                        name="local_airport"
-                        class="fill-icon q-mr-sm"
-                        size="md"
-                        :title="t('Travel')"
-                        color="primary"
-                    />
+            <VnRow class="travel">
+                <div v-if="travel">
+                    <span style="color: var(--vn-label-color)">
+                        {{ t('Booked trucks') }}:
+                    </span>
                     <span>
-                        {{ t('Booked trucks') + ': ' + travel[0]?.m3 }}
+                        {{ travel[0]?.m3 }}
                     </span>
                     <QBtn
+                        v-if="travel[0]?.m3"
                         style="max-width: 20%"
                         flat
                         icon="edit"
-                        @click="navigate(travel[0]?.id)"
+                        @click="openDialog()"
                         :title="t('Edit travel')"
+                        color="primary"
                     />
                 </div>
             </VnRow>
         </template>
     </VnSubToolbar>
+    <QDialog v-model="travelDialogRef" :maximized="true" :class="['vn-row', 'wrap']">
+        <FormModelPopup
+            :url-update="`Travels/${travel[0].id}`"
+            model="travel"
+            :title="t('Travel m3')"
+            :form-initial-data="{ id: travel[0].id, m3: travel[0].m3 }"
+            @on-data-saved="fetchDataRef.fetch()"
+        >
+            <template #form-inputs="{ data }">
+                <VnInput
+                    v-model="data.id"
+                    :label="t('id')"
+                    type="number"
+                    disable
+                    readonly
+                />
+                <VnInput v-model="data.m3" :label="t('m3')" type="number" />
+            </template>
+        </FormModelPopup>
+    </QDialog>
     <RightMenu>
         <template #right-panel>
             <EntryStockBoughtFilter
@@ -196,10 +204,7 @@ const setUserParams = async ({ dated }) => {
             :create="{
                 urlCreate: 'StockBoughts',
                 title: t('Reserve some space'),
-                onDataSaved: () => {
-                    tableRef.reload();
-                    fetchDataRef.reload();
-                },
+                onDataSaved: () => tableRef.reload(),
                 formInitialData: {
                     workerFk: user.id,
                     dated: Date.vnNow(),
@@ -214,17 +219,14 @@ const setUserParams = async ({ dated }) => {
                 <span class="link" @click.stop>
                     {{ row?.worker?.user?.name }}
                     <WorkerDescriptorProxy :id="row?.workerFk" />
-                </span>
-            </template>
+                </span> </template
+            >0
         </VnTable>
     </QPage>
 </template>
-<style lang="scss">
-.trucks {
-    text-align: center;
-    margin: 3%;
-    border: 3px solid var(--vn-header-color);
-    padding: 1%;
+<style lang="css" scoped>
+.travel {
+    margin-bottom: 0px;
 }
 </style>
 <i18n>
diff --git a/src/pages/Entry/EntryStockBoughtDetail.vue b/src/pages/Entry/EntryStockBoughtDetail.vue
index b9420af71..6d9227ad2 100644
--- a/src/pages/Entry/EntryStockBoughtDetail.vue
+++ b/src/pages/Entry/EntryStockBoughtDetail.vue
@@ -14,7 +14,7 @@ const $props = defineProps({
         required: true,
     },
     dated: {
-        type: String,
+        type: Date,
         required: true,
     },
 });
@@ -63,34 +63,46 @@ const columns = [
 ];
 </script>
 <template>
-    <QDialog>
-        <VnTable
-            ref="tableRef"
-            data-key="StockBoughtsDetail"
-            :url="customUrl"
-            order="itemName DESC"
-            :columns="columns"
-            :right-search="false"
-            :disable-infinite-scroll="true"
-            :disable-option="{ card: true }"
-            :limit="0"
-            auto-load
-        >
-            <template #column-entryFk="{ row }">
-                <span class="link" @click.stop>
-                    {{ row?.entryFk }}
-                    <EntryDescriptorProxy :id="row.entryFk" />
-                </span>
-            </template>
-            <template #column-itemName="{ row }">
-                <span class="link" @click.stop>
-                    {{ row?.itemName }}
-                    <ItemDescriptorProxy :id="row.itemFk" />
-                </span>
-            </template>
-        </VnTable>
+    <QDialog position="bottom" :maximized="true">
+        <div class="container">
+            <VnTable
+                ref="tableRef"
+                data-key="StockBoughtsDetail"
+                :url="customUrl"
+                order="itemName DESC"
+                :columns="columns"
+                :right-search="false"
+                :disable-infinite-scroll="true"
+                :disable-option="{ card: true }"
+                :limit="0"
+                auto-load
+            >
+                <template #column-entryFk="{ row }">
+                    <span class="link" @click.stop>
+                        {{ row?.entryFk }}
+                        <EntryDescriptorProxy :id="row.entryFk" />
+                    </span>
+                </template>
+                <template #column-itemName="{ row }">
+                    <span class="link" @click.stop>
+                        {{ row?.itemName }}
+                        <ItemDescriptorProxy :id="row.itemFk" />
+                    </span>
+                </template>
+            </VnTable>
+        </div>
     </QDialog>
 </template>
+<style lang="css">
+.q-dialog__inner {
+    max-width: 50vw;
+    overflow: auto;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    margin: auto;
+}
+</style>
 <i18n>
     es:
         Buyer: Comprador
diff --git a/src/pages/Entry/EntryStockBoughtFilter.vue b/src/pages/Entry/EntryStockBoughtFilter.vue
index aaf9e7a5b..7694cfe6c 100644
--- a/src/pages/Entry/EntryStockBoughtFilter.vue
+++ b/src/pages/Entry/EntryStockBoughtFilter.vue
@@ -1,11 +1,9 @@
 <script setup>
-import { ref } from 'vue';
 import { useI18n } from 'vue-i18n';
 import { onMounted } from 'vue';
 import { useStateStore } from 'stores/useStateStore';
 
 import VnFilterPanel from 'src/components/ui/VnFilterPanel.vue';
-import FetchData from 'components/FetchData.vue';
 import VnInputDate from 'src/components/common/VnInputDate.vue';
 
 const { t } = useI18n();
@@ -15,7 +13,6 @@ const props = defineProps({
         required: true,
     },
 });
-const companiesOptions = ref([]);
 const stateStore = useStateStore();
 const emit = defineEmits(['set-user-params']);
 const setUserParams = (params) => {
@@ -27,20 +24,10 @@ onMounted(async () => {
 </script>
 
 <template>
-    <FetchData
-        ref="buyer"
-        url="Workers/activeWithInheritedRole"
-        :filter="{
-            fields: ['id', 'name'],
-            where: { role: 'buyer' },
-        }"
-        order="name"
-        @on-fetch="(data) => (companiesOptions = data)"
-        auto-load
-    />
     <VnFilterPanel
         :data-key="props.dataKey"
         :search-button="true"
+        search-url="table"
         @set-user-params="setUserParams"
     >
         <template #tags="{ tag, formatFn }">
@@ -52,13 +39,25 @@ onMounted(async () => {
         <template #body="{ params }">
             <QItem class="q-my-sm">
                 <QItemSection>
-                    <VnInputDate v-model="params.dated" :label="t('Date')" is-outlined />
+                    <VnInputDate
+                        id="date"
+                        v-model="params.dated"
+                        :label="t('Date')"
+                        is-outlined
+                    />
                 </QItemSection>
             </QItem>
         </template>
     </VnFilterPanel>
 </template>
 <i18n>
+    en:
+        params:
+            dated: Date
+            workerFk: Worker
     es:
         Date: Fecha
+        params:
+            dated: Date
+            workerFk: Trabajador
 </i18n>
diff --git a/test/cypress/integration/entry/stockBought.spec.js b/test/cypress/integration/entry/stockBought.spec.js
index a18e2bd2e..b93afa520 100644
--- a/test/cypress/integration/entry/stockBought.spec.js
+++ b/test/cypress/integration/entry/stockBought.spec.js
@@ -1,15 +1,13 @@
 describe('EntryStockBought', () => {
-    const reserveField = 'input[name="reserve"]';
     beforeEach(() => {
         cy.viewport(1920, 1080);
         cy.login('buyer');
-        cy.visit(
-            `/#/entry/stock-Bought?table={"filter":"{}","dated":"2000-12-31T23:00:00.000Z"}`
-        );
+        cy.visit(`/#/entry/stock-Bought`);
     });
     it('Should edit the reserved space', () => {
+        cy.get('.q-field__native.q-placeholder').should('have.value', '01/01/2001');
         cy.get('tBody > tr').its('length').should('eq', 2);
-        cy.get(reserveField).type('10{enter}');
+        cy.get('input[name="reserve"]').type('10{enter}');
         cy.get('button[title="Save"]').click();
         cy.get('.q-notification__message').should('have.text', 'Data saved');
     });
@@ -33,4 +31,11 @@ describe('EntryStockBought', () => {
             'warningNo data available'
         );
     });
+    it('Should edit travel m3 and refresh', () => {
+        cy.get('.vn-row > div > .q-btn > .q-btn__content > .q-icon').click();
+        cy.get('input[aria-label="m3"]').clear();
+        cy.get('input[aria-label="m3"]').type('60');
+        cy.get('.q-mt-lg > .q-btn--standard > .q-btn__content > .block').click();
+        cy.get('.vn-row > div > :nth-child(2)').should('have.text', '60');
+    });
 });

From 263dc29d7a4d4ba22d89fb7715a8f69d968bdfed Mon Sep 17 00:00:00 2001
From: pablone <pablone@verdnatura.es>
Date: Mon, 16 Sep 2024 12:19:03 +0200
Subject: [PATCH 11/29] fix: refs #7404 remove console.log

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

diff --git a/src/components/VnTable/VnTable.vue b/src/components/VnTable/VnTable.vue
index a6a8aec11..b7321fe16 100644
--- a/src/components/VnTable/VnTable.vue
+++ b/src/components/VnTable/VnTable.vue
@@ -692,7 +692,6 @@ function handleOnDataSaved(_) {
                         :column-name="column.name"
                         :label="column.label"
                     >
-                        {{ console.log('data: ', data) }}
                         <VnTableColumn
                             :column="column"
                             :row="{}"

From 09cdd2f7e795ec28913cacfa21f0e0f381ade840 Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Mon, 16 Sep 2024 15:17:05 +0200
Subject: [PATCH 12/29] chore: changelog

---
 CHANGELOG.md | 181 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 181 insertions(+)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8e1d4c433..666d3f4dd 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,184 @@
+# Version XX.XX - XXXX-XX-XX
+
+### Added 🆕
+
+- chore: refs #6772 fix e2e  (origin/6772-warmfix-fixE2e) by:jorgep
+- chore: refs #7323 worker changes  by:jorgep
+- chore: refs #7353 fix warnings  by:jorgep
+- chore: refs #7353 use Vue component nomenclature  by:jorgep
+- chore: refs #7356 fix type  by:jorgep
+- feat(AccountConnections): use VnToken  by:alexm
+- feat: add key to routerView  by:Javier Segarra
+- feat: add plus shortcut in VnTable  by:Javier Segarra
+- feat: add row  by:Javier Segarra
+- feat: addRow withour dialog  by:Javier Segarra
+- feat: apply mixin  by:Javier Segarra
+- feat  by:Javier Segarra
+- feat: change navBar buttons  by:Javier Segarra
+- feat: dense rows  by:Javier Segarra
+- feat: fields with wrong name  by:jgallego
+- feat: fix bugs and filters  by:Javier Segarra
+- feat: fix refund parameters  by:jgallego
+- feat: handle create row  by:Javier Segarra
+- feat: handle dates  by:Javier Segarra
+- feat: handle qCheckbox 3rd state  by:Javier Segarra
+- feat: imrpove VnInputTime to set cursor at start  by:Javier Segarra
+- feat: keyShortcut directive  by:Javier Segarra
+- feat: minor fixes  by:jgallego
+- feat: only filter by isDestiny  by:Javier Segarra
+- feat: refs #211153 businessDataLinkGrafana  by:robert
+- feat: refs #7129 add km start and end on create form  by:pablone
+- feat: refs #7353 add filter & fix customTags  by:jorgep
+- feat: refs #7353 add locale  by:jorgep
+- feat: refs #7353 add no one opt  by:jorgep
+- feat: refs #7353 add right icons  by:jorgep
+- feat: refs #7353 imporve toDateFormat  by:jorgep
+- feat: refs #7353 salesPerson nickname & id  by:jorgep
+- feat: refs #7353 split sections  by:jorgep
+- feat: refs #7847 remove reload btn  by:jorgep
+- feat: refs #7847 remove reload fn  by:jorgep
+- feat: refs #7889 added shortcuts to modules  by:Jon
+- feat: refs #7911 added shortcut to modules  by:Jon
+- feat: refuncInvoiceForm component  by:jgallego
+- feat: remove duplicity  by:Javier Segarra
+- feat: remove future itemFixedPrices  by:Javier Segarra
+- feat: replace stickyButtons by subtoolbar  by:Javier Segarra
+- feat: required validation  by:Javier Segarra
+- feat: show bad dates  by:Javier Segarra
+- feat: showdate icons  by:Javier Segarra
+- feat: solve ItemFixedFilterPanel  by:Javier Segarra
+- feat: transfer an invoice  by:jgallego
+- feat: try to fix ItemFixedFilterPanel  by:Javier Segarra
+- feat: unnecessary changes  by:Javier Segarra
+- feat: update changelog  (origin/7896_down_devToTest_2436) by:Javier Segarra
+- feat: updates  by:Javier Segarra
+- feat: update version and changelog  by:Javier Segarra
+- feat: vnInput*  by:Javier Segarra
+- feat:  with VnTable  by:Javier Segarra
+- refs #6772 feat: fix approach  by:Javier Segarra
+- refs #6772 feat: refresh shelving.basic-data  by:Javier Segarra
+- style: show subName value  by:Javier Segarra
+
+### Changed 📦
+
+- perf: add v-shortcut in VnCard  by:Javier Segarra
+- perf: approach  by:Javier Segarra
+- perf: change directive location  by:Javier Segarra
+- perf: change slots order  by:Javier Segarra
+- perf: examples  by:Javier Segarra
+- perf: hide icon for VnInputDate  by:Javier Segarra
+- perf: improve ItemFixedPricefilterPanel  by:Javier Segarra
+- perf: improve  mainShrotcutMixin  by:Javier Segarra
+- perf: minor clean code  by:Javier Segarra
+- perf: onRowchange  by:Javier Segarra
+- perf: order by  by:Javier Segarra
+- perf: order components  by:Javier Segarra
+- perf: refs #7889 perf shortcut test  by:Jon
+- perf: remove console.log  by:Javier Segarra
+- perf: remove icons in header slot  by:Javier Segarra
+- perf: remove print variables  by:Javier Segarra
+- perf: restore CustomerBasicData  by:Javier Segarra
+- refactor: deleted useless prop  by:Jon
+- refactor: deleted useless prop in FetchedTags  by:Jon
+- refactor: refs #7323 drop useless code  by:jorgep
+- refactor: refs #7353 clients correction  by:jorgep
+- refactor: refs #7353 clients correction wip  by:jorgep
+- refactor: refs #7353 ease logic  by:jorgep
+- refactor: refs #7353 order correction  by:jorgep
+- refactor: refs #7353 simplify code  by:jorgep
+- refactor: refs #7353 tickets correction  by:jorgep
+- refactor: refs #7353 use global locales  by:jorgep
+- refactor: refs #7354 changed descriptor menu options  by:Jon
+- refactor: refs #7354 changed icon color in table and notification when deleting a zone  by:Jon
+- refactor: refs #7354 fix tableFilters  by:Jon
+- refactor: refs #7354 modified VnInputTime  by:Jon
+- refactor: refs #7354 refactor deliveryPanel  by:Jon
+- refactor: refs #7354 refactor zones section and fixed e2e tests  by:Jon
+- refactor: refs #7354 requested changes  by:Jon
+- refactor: refs #7354 reverse deliveryPanel changes  by:Jon
+- refactor: refs #7354 Zone migration changes  by:Jon
+- refactor: refs #7889 deleted subtitle attr and use keyBinding instead  by:Jon
+- refactor: refs #7889 modified shortcut and dashboard, and added tootlip in LeftMenu  by:Jon
+- refs #6722 perf: not fetch when id not exists  by:Javier Segarra
+- refs #6772 perf: change variable name  by:JAVIER SEGARRA MARTINEZ
+- refs #6772 perf: use ArrayData  (6772_reload_sections) by:Javier Segarra
+- refs #7283 refactor fix ItemDescriptor  by:carlossa
+- refs #7283 refactor ItexDescriptor  by:carlossa
+
+### Fixed 🛠️
+
+- chore: refs #6772 fix e2e  (origin/6772-warmfix-fixE2e) by:jorgep
+- chore: refs #7353 fix warnings  by:jorgep
+- chore: refs #7356 fix type  by:jorgep
+- feat: fix bugs and filters  by:Javier Segarra
+- feat: fix refund parameters  by:jgallego
+- feat: minor fixes  by:jgallego
+- feat: refs #7353 add filter & fix customTags  by:jorgep
+- feat: try to fix ItemFixedFilterPanel  by:Javier Segarra
+- fix: add border-top  by:Javier Segarra
+- fix: added missing descriptors and small details  by:Jon
+- fix branch  by:carlossa
+- fix: call upsert when crudModel haschanges  by:Javier Segarra
+- fix(ClaimList): fix summary  by:alexm
+- fix: cli warnings  by:Javier Segarra
+- fix: editTableOptions  by:Javier Segarra
+- fix events and descriptor menu  by:Jon
+- fix: InvoiceIn sections  (origin/6772_reload_sections) by:Javier Segarra
+- fix: minor changes  by:Javier Segarra
+- fix: minor error whit dates  by:Javier Segarra
+- fix: module icon  by:Javier Segarra
+- fix: options QDate  by:Javier Segarra
+- fix: refs #6900 e2e error  by:jorgep
+- fix: refs #6900 rollback  by:jorgep
+- fix: refs #7353 css  by:jorgep
+- fix: refs #7353 hide search param  (origin/7353-warmfix-fixSearchbar) by:jorgep
+- fix: refs #7353 iron out filter  by:jorgep
+- fix: refs #7353 iron out ticket table  by:jorgep
+- fix: refs #7353 padding  by:jorgep
+- fix: refs #7353 salesClientTable  by:jorgep
+- fix: refs #7353 salesorderTable  by:jorgep
+- fix: refs #7353 saleTicketMonitors  by:jorgep
+- fix: refs #7353 use same datakey  by:jorgep
+- fix: refs #7353 vnTable colors  by:jorgep
+- fix: refs #7354 e2e tests  by:Jon
+- fix: refs #7354 fix delivery days  by:Jon
+- fix: refs #7354 fix list searchbar and filters  by:Jon
+- fix: refs #7354 fix VnSearchbar search for zone section & finished basic tests  by:Jon
+- fix: refs #7354 fix VnTable filters and agency field  by:Jon
+- fix: refs #7354 fix zoneSearchbar  by:Jon
+- fix: refs #7354 requested changes  by:Jon
+- fix: refs #7356 colors  by:jorgep
+- fix: refs #7356 create claim dialog  by:jorgep
+- fix: refs #7889 fixed shortcut test  by:Jon
+- fix: refs #7903 fixed ticket's search bar and keybinding tooltip  by:Jon
+- fix: refs #7911 fixed shortcut and related files  by:Jon
+- fix: remove condition duplicated  by:Javier Segarra
+- fix: remove property  by:Javier Segarra
+- fix tootltip  by:carlossa
+- fix traduction  by:carlossa
+- fix(VnSectionMain): add QPage  by:alexm
+- fix(zone): zoneLocation and the others searchbar  by:alexm
+- refactor: refs #7354 fix tableFilters  by:Jon
+- refactor: refs #7354 refactor zones section and fixed e2e tests  by:Jon
+- refs #6772 feat: fix approach  by:Javier Segarra
+- refs #6772 fix: claimPhoto reload  by:Javier Segarra
+- refs #6896 fix searchbar  by:carlossa
+- refs #6897 fix entry  by:carlossa
+- refs #6899 fix invoiceFix  by:carlossa
+- refs #6899 fix order  by:carlossa
+- refs #7283 fix  by:carlossa
+- refs #7283 fix ItemDescriptor warehouse  by:carlossa
+- refs #7283 refactor fix ItemDescriptor  by:carlossa
+- refs #7355 #7366 fix account, summary, list, travelList, tooltip  by:carlossa
+- refs #7355 fix accountPrivileges  by:carlossa
+- refs #7355 fix accounts, vnTable  by:carlossa
+- refs #7355 fix privileges  by:carlossa
+- refs #7355 fix roles filters  by:carlossa
+- refs #7355 fix total  by:carlossa
+- refs #7355 fix views summarys, entryList, travelList refact  by:carlossa
+- refs #7366  fix travel hours  by:carlossa
+- test: fix e2e  by:Javier Segarra
+
 # Version 24.36 - 2024-08-27
 
 ### Added 🆕

From dc047435f5c7bed72a3d035690b66d5d30de5baa Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Mon, 16 Sep 2024 15:17:31 +0200
Subject: [PATCH 13/29] chore: changelog

---
 CHANGELOG.md | 342 +++++++++++++++++++++++++--------------------------
 package.json |   2 +-
 2 files changed, 172 insertions(+), 172 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 666d3f4dd..f1d10b26e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,183 +1,183 @@
-# Version XX.XX - XXXX-XX-XX
+# Version 24.38 - 2024-09-17
 
 ### Added 🆕
 
-- chore: refs #6772 fix e2e  (origin/6772-warmfix-fixE2e) by:jorgep
-- chore: refs #7323 worker changes  by:jorgep
-- chore: refs #7353 fix warnings  by:jorgep
-- chore: refs #7353 use Vue component nomenclature  by:jorgep
-- chore: refs #7356 fix type  by:jorgep
-- feat(AccountConnections): use VnToken  by:alexm
-- feat: add key to routerView  by:Javier Segarra
-- feat: add plus shortcut in VnTable  by:Javier Segarra
-- feat: add row  by:Javier Segarra
-- feat: addRow withour dialog  by:Javier Segarra
-- feat: apply mixin  by:Javier Segarra
-- feat  by:Javier Segarra
-- feat: change navBar buttons  by:Javier Segarra
-- feat: dense rows  by:Javier Segarra
-- feat: fields with wrong name  by:jgallego
-- feat: fix bugs and filters  by:Javier Segarra
-- feat: fix refund parameters  by:jgallego
-- feat: handle create row  by:Javier Segarra
-- feat: handle dates  by:Javier Segarra
-- feat: handle qCheckbox 3rd state  by:Javier Segarra
-- feat: imrpove VnInputTime to set cursor at start  by:Javier Segarra
-- feat: keyShortcut directive  by:Javier Segarra
-- feat: minor fixes  by:jgallego
-- feat: only filter by isDestiny  by:Javier Segarra
-- feat: refs #211153 businessDataLinkGrafana  by:robert
-- feat: refs #7129 add km start and end on create form  by:pablone
-- feat: refs #7353 add filter & fix customTags  by:jorgep
-- feat: refs #7353 add locale  by:jorgep
-- feat: refs #7353 add no one opt  by:jorgep
-- feat: refs #7353 add right icons  by:jorgep
-- feat: refs #7353 imporve toDateFormat  by:jorgep
-- feat: refs #7353 salesPerson nickname & id  by:jorgep
-- feat: refs #7353 split sections  by:jorgep
-- feat: refs #7847 remove reload btn  by:jorgep
-- feat: refs #7847 remove reload fn  by:jorgep
-- feat: refs #7889 added shortcuts to modules  by:Jon
-- feat: refs #7911 added shortcut to modules  by:Jon
-- feat: refuncInvoiceForm component  by:jgallego
-- feat: remove duplicity  by:Javier Segarra
-- feat: remove future itemFixedPrices  by:Javier Segarra
-- feat: replace stickyButtons by subtoolbar  by:Javier Segarra
-- feat: required validation  by:Javier Segarra
-- feat: show bad dates  by:Javier Segarra
-- feat: showdate icons  by:Javier Segarra
-- feat: solve ItemFixedFilterPanel  by:Javier Segarra
-- feat: transfer an invoice  by:jgallego
-- feat: try to fix ItemFixedFilterPanel  by:Javier Segarra
-- feat: unnecessary changes  by:Javier Segarra
-- feat: update changelog  (origin/7896_down_devToTest_2436) by:Javier Segarra
-- feat: updates  by:Javier Segarra
-- feat: update version and changelog  by:Javier Segarra
-- feat: vnInput*  by:Javier Segarra
-- feat:  with VnTable  by:Javier Segarra
-- refs #6772 feat: fix approach  by:Javier Segarra
-- refs #6772 feat: refresh shelving.basic-data  by:Javier Segarra
-- style: show subName value  by:Javier Segarra
+-   chore: refs #6772 fix e2e (origin/6772-warmfix-fixE2e) by:jorgep
+-   chore: refs #7323 worker changes by:jorgep
+-   chore: refs #7353 fix warnings by:jorgep
+-   chore: refs #7353 use Vue component nomenclature by:jorgep
+-   chore: refs #7356 fix type by:jorgep
+-   feat(AccountConnections): use VnToken by:alexm
+-   feat: add key to routerView by:Javier Segarra
+-   feat: add plus shortcut in VnTable by:Javier Segarra
+-   feat: add row by:Javier Segarra
+-   feat: addRow withour dialog by:Javier Segarra
+-   feat: apply mixin by:Javier Segarra
+-   feat by:Javier Segarra
+-   feat: change navBar buttons by:Javier Segarra
+-   feat: dense rows by:Javier Segarra
+-   feat: fields with wrong name by:jgallego
+-   feat: fix bugs and filters by:Javier Segarra
+-   feat: fix refund parameters by:jgallego
+-   feat: handle create row by:Javier Segarra
+-   feat: handle dates by:Javier Segarra
+-   feat: handle qCheckbox 3rd state by:Javier Segarra
+-   feat: imrpove VnInputTime to set cursor at start by:Javier Segarra
+-   feat: keyShortcut directive by:Javier Segarra
+-   feat: minor fixes by:jgallego
+-   feat: only filter by isDestiny by:Javier Segarra
+-   feat: refs #211153 businessDataLinkGrafana by:robert
+-   feat: refs #7129 add km start and end on create form by:pablone
+-   feat: refs #7353 add filter & fix customTags by:jorgep
+-   feat: refs #7353 add locale by:jorgep
+-   feat: refs #7353 add no one opt by:jorgep
+-   feat: refs #7353 add right icons by:jorgep
+-   feat: refs #7353 imporve toDateFormat by:jorgep
+-   feat: refs #7353 salesPerson nickname & id by:jorgep
+-   feat: refs #7353 split sections by:jorgep
+-   feat: refs #7847 remove reload btn by:jorgep
+-   feat: refs #7847 remove reload fn by:jorgep
+-   feat: refs #7889 added shortcuts to modules by:Jon
+-   feat: refs #7911 added shortcut to modules by:Jon
+-   feat: refuncInvoiceForm component by:jgallego
+-   feat: remove duplicity by:Javier Segarra
+-   feat: remove future itemFixedPrices by:Javier Segarra
+-   feat: replace stickyButtons by subtoolbar by:Javier Segarra
+-   feat: required validation by:Javier Segarra
+-   feat: show bad dates by:Javier Segarra
+-   feat: showdate icons by:Javier Segarra
+-   feat: solve ItemFixedFilterPanel by:Javier Segarra
+-   feat: transfer an invoice by:jgallego
+-   feat: try to fix ItemFixedFilterPanel by:Javier Segarra
+-   feat: unnecessary changes by:Javier Segarra
+-   feat: update changelog (origin/7896_down_devToTest_2436) by:Javier Segarra
+-   feat: updates by:Javier Segarra
+-   feat: update version and changelog by:Javier Segarra
+-   feat: vnInput\* by:Javier Segarra
+-   feat: with VnTable by:Javier Segarra
+-   refs #6772 feat: fix approach by:Javier Segarra
+-   refs #6772 feat: refresh shelving.basic-data by:Javier Segarra
+-   style: show subName value by:Javier Segarra
 
 ### Changed 📦
 
-- perf: add v-shortcut in VnCard  by:Javier Segarra
-- perf: approach  by:Javier Segarra
-- perf: change directive location  by:Javier Segarra
-- perf: change slots order  by:Javier Segarra
-- perf: examples  by:Javier Segarra
-- perf: hide icon for VnInputDate  by:Javier Segarra
-- perf: improve ItemFixedPricefilterPanel  by:Javier Segarra
-- perf: improve  mainShrotcutMixin  by:Javier Segarra
-- perf: minor clean code  by:Javier Segarra
-- perf: onRowchange  by:Javier Segarra
-- perf: order by  by:Javier Segarra
-- perf: order components  by:Javier Segarra
-- perf: refs #7889 perf shortcut test  by:Jon
-- perf: remove console.log  by:Javier Segarra
-- perf: remove icons in header slot  by:Javier Segarra
-- perf: remove print variables  by:Javier Segarra
-- perf: restore CustomerBasicData  by:Javier Segarra
-- refactor: deleted useless prop  by:Jon
-- refactor: deleted useless prop in FetchedTags  by:Jon
-- refactor: refs #7323 drop useless code  by:jorgep
-- refactor: refs #7353 clients correction  by:jorgep
-- refactor: refs #7353 clients correction wip  by:jorgep
-- refactor: refs #7353 ease logic  by:jorgep
-- refactor: refs #7353 order correction  by:jorgep
-- refactor: refs #7353 simplify code  by:jorgep
-- refactor: refs #7353 tickets correction  by:jorgep
-- refactor: refs #7353 use global locales  by:jorgep
-- refactor: refs #7354 changed descriptor menu options  by:Jon
-- refactor: refs #7354 changed icon color in table and notification when deleting a zone  by:Jon
-- refactor: refs #7354 fix tableFilters  by:Jon
-- refactor: refs #7354 modified VnInputTime  by:Jon
-- refactor: refs #7354 refactor deliveryPanel  by:Jon
-- refactor: refs #7354 refactor zones section and fixed e2e tests  by:Jon
-- refactor: refs #7354 requested changes  by:Jon
-- refactor: refs #7354 reverse deliveryPanel changes  by:Jon
-- refactor: refs #7354 Zone migration changes  by:Jon
-- refactor: refs #7889 deleted subtitle attr and use keyBinding instead  by:Jon
-- refactor: refs #7889 modified shortcut and dashboard, and added tootlip in LeftMenu  by:Jon
-- refs #6722 perf: not fetch when id not exists  by:Javier Segarra
-- refs #6772 perf: change variable name  by:JAVIER SEGARRA MARTINEZ
-- refs #6772 perf: use ArrayData  (6772_reload_sections) by:Javier Segarra
-- refs #7283 refactor fix ItemDescriptor  by:carlossa
-- refs #7283 refactor ItexDescriptor  by:carlossa
+-   perf: add v-shortcut in VnCard by:Javier Segarra
+-   perf: approach by:Javier Segarra
+-   perf: change directive location by:Javier Segarra
+-   perf: change slots order by:Javier Segarra
+-   perf: examples by:Javier Segarra
+-   perf: hide icon for VnInputDate by:Javier Segarra
+-   perf: improve ItemFixedPricefilterPanel by:Javier Segarra
+-   perf: improve mainShrotcutMixin by:Javier Segarra
+-   perf: minor clean code by:Javier Segarra
+-   perf: onRowchange by:Javier Segarra
+-   perf: order by by:Javier Segarra
+-   perf: order components by:Javier Segarra
+-   perf: refs #7889 perf shortcut test by:Jon
+-   perf: remove console.log by:Javier Segarra
+-   perf: remove icons in header slot by:Javier Segarra
+-   perf: remove print variables by:Javier Segarra
+-   perf: restore CustomerBasicData by:Javier Segarra
+-   refactor: deleted useless prop by:Jon
+-   refactor: deleted useless prop in FetchedTags by:Jon
+-   refactor: refs #7323 drop useless code by:jorgep
+-   refactor: refs #7353 clients correction by:jorgep
+-   refactor: refs #7353 clients correction wip by:jorgep
+-   refactor: refs #7353 ease logic by:jorgep
+-   refactor: refs #7353 order correction by:jorgep
+-   refactor: refs #7353 simplify code by:jorgep
+-   refactor: refs #7353 tickets correction by:jorgep
+-   refactor: refs #7353 use global locales by:jorgep
+-   refactor: refs #7354 changed descriptor menu options by:Jon
+-   refactor: refs #7354 changed icon color in table and notification when deleting a zone by:Jon
+-   refactor: refs #7354 fix tableFilters by:Jon
+-   refactor: refs #7354 modified VnInputTime by:Jon
+-   refactor: refs #7354 refactor deliveryPanel by:Jon
+-   refactor: refs #7354 refactor zones section and fixed e2e tests by:Jon
+-   refactor: refs #7354 requested changes by:Jon
+-   refactor: refs #7354 reverse deliveryPanel changes by:Jon
+-   refactor: refs #7354 Zone migration changes by:Jon
+-   refactor: refs #7889 deleted subtitle attr and use keyBinding instead by:Jon
+-   refactor: refs #7889 modified shortcut and dashboard, and added tootlip in LeftMenu by:Jon
+-   refs #6722 perf: not fetch when id not exists by:Javier Segarra
+-   refs #6772 perf: change variable name by:JAVIER SEGARRA MARTINEZ
+-   refs #6772 perf: use ArrayData (6772_reload_sections) by:Javier Segarra
+-   refs #7283 refactor fix ItemDescriptor by:carlossa
+-   refs #7283 refactor ItexDescriptor by:carlossa
 
 ### Fixed 🛠️
 
-- chore: refs #6772 fix e2e  (origin/6772-warmfix-fixE2e) by:jorgep
-- chore: refs #7353 fix warnings  by:jorgep
-- chore: refs #7356 fix type  by:jorgep
-- feat: fix bugs and filters  by:Javier Segarra
-- feat: fix refund parameters  by:jgallego
-- feat: minor fixes  by:jgallego
-- feat: refs #7353 add filter & fix customTags  by:jorgep
-- feat: try to fix ItemFixedFilterPanel  by:Javier Segarra
-- fix: add border-top  by:Javier Segarra
-- fix: added missing descriptors and small details  by:Jon
-- fix branch  by:carlossa
-- fix: call upsert when crudModel haschanges  by:Javier Segarra
-- fix(ClaimList): fix summary  by:alexm
-- fix: cli warnings  by:Javier Segarra
-- fix: editTableOptions  by:Javier Segarra
-- fix events and descriptor menu  by:Jon
-- fix: InvoiceIn sections  (origin/6772_reload_sections) by:Javier Segarra
-- fix: minor changes  by:Javier Segarra
-- fix: minor error whit dates  by:Javier Segarra
-- fix: module icon  by:Javier Segarra
-- fix: options QDate  by:Javier Segarra
-- fix: refs #6900 e2e error  by:jorgep
-- fix: refs #6900 rollback  by:jorgep
-- fix: refs #7353 css  by:jorgep
-- fix: refs #7353 hide search param  (origin/7353-warmfix-fixSearchbar) by:jorgep
-- fix: refs #7353 iron out filter  by:jorgep
-- fix: refs #7353 iron out ticket table  by:jorgep
-- fix: refs #7353 padding  by:jorgep
-- fix: refs #7353 salesClientTable  by:jorgep
-- fix: refs #7353 salesorderTable  by:jorgep
-- fix: refs #7353 saleTicketMonitors  by:jorgep
-- fix: refs #7353 use same datakey  by:jorgep
-- fix: refs #7353 vnTable colors  by:jorgep
-- fix: refs #7354 e2e tests  by:Jon
-- fix: refs #7354 fix delivery days  by:Jon
-- fix: refs #7354 fix list searchbar and filters  by:Jon
-- fix: refs #7354 fix VnSearchbar search for zone section & finished basic tests  by:Jon
-- fix: refs #7354 fix VnTable filters and agency field  by:Jon
-- fix: refs #7354 fix zoneSearchbar  by:Jon
-- fix: refs #7354 requested changes  by:Jon
-- fix: refs #7356 colors  by:jorgep
-- fix: refs #7356 create claim dialog  by:jorgep
-- fix: refs #7889 fixed shortcut test  by:Jon
-- fix: refs #7903 fixed ticket's search bar and keybinding tooltip  by:Jon
-- fix: refs #7911 fixed shortcut and related files  by:Jon
-- fix: remove condition duplicated  by:Javier Segarra
-- fix: remove property  by:Javier Segarra
-- fix tootltip  by:carlossa
-- fix traduction  by:carlossa
-- fix(VnSectionMain): add QPage  by:alexm
-- fix(zone): zoneLocation and the others searchbar  by:alexm
-- refactor: refs #7354 fix tableFilters  by:Jon
-- refactor: refs #7354 refactor zones section and fixed e2e tests  by:Jon
-- refs #6772 feat: fix approach  by:Javier Segarra
-- refs #6772 fix: claimPhoto reload  by:Javier Segarra
-- refs #6896 fix searchbar  by:carlossa
-- refs #6897 fix entry  by:carlossa
-- refs #6899 fix invoiceFix  by:carlossa
-- refs #6899 fix order  by:carlossa
-- refs #7283 fix  by:carlossa
-- refs #7283 fix ItemDescriptor warehouse  by:carlossa
-- refs #7283 refactor fix ItemDescriptor  by:carlossa
-- refs #7355 #7366 fix account, summary, list, travelList, tooltip  by:carlossa
-- refs #7355 fix accountPrivileges  by:carlossa
-- refs #7355 fix accounts, vnTable  by:carlossa
-- refs #7355 fix privileges  by:carlossa
-- refs #7355 fix roles filters  by:carlossa
-- refs #7355 fix total  by:carlossa
-- refs #7355 fix views summarys, entryList, travelList refact  by:carlossa
-- refs #7366  fix travel hours  by:carlossa
-- test: fix e2e  by:Javier Segarra
+-   chore: refs #6772 fix e2e (origin/6772-warmfix-fixE2e) by:jorgep
+-   chore: refs #7353 fix warnings by:jorgep
+-   chore: refs #7356 fix type by:jorgep
+-   feat: fix bugs and filters by:Javier Segarra
+-   feat: fix refund parameters by:jgallego
+-   feat: minor fixes by:jgallego
+-   feat: refs #7353 add filter & fix customTags by:jorgep
+-   feat: try to fix ItemFixedFilterPanel by:Javier Segarra
+-   fix: add border-top by:Javier Segarra
+-   fix: added missing descriptors and small details by:Jon
+-   fix branch by:carlossa
+-   fix: call upsert when crudModel haschanges by:Javier Segarra
+-   fix(ClaimList): fix summary by:alexm
+-   fix: cli warnings by:Javier Segarra
+-   fix: editTableOptions by:Javier Segarra
+-   fix events and descriptor menu by:Jon
+-   fix: InvoiceIn sections (origin/6772_reload_sections) by:Javier Segarra
+-   fix: minor changes by:Javier Segarra
+-   fix: minor error whit dates by:Javier Segarra
+-   fix: module icon by:Javier Segarra
+-   fix: options QDate by:Javier Segarra
+-   fix: refs #6900 e2e error by:jorgep
+-   fix: refs #6900 rollback by:jorgep
+-   fix: refs #7353 css by:jorgep
+-   fix: refs #7353 hide search param (origin/7353-warmfix-fixSearchbar) by:jorgep
+-   fix: refs #7353 iron out filter by:jorgep
+-   fix: refs #7353 iron out ticket table by:jorgep
+-   fix: refs #7353 padding by:jorgep
+-   fix: refs #7353 salesClientTable by:jorgep
+-   fix: refs #7353 salesorderTable by:jorgep
+-   fix: refs #7353 saleTicketMonitors by:jorgep
+-   fix: refs #7353 use same datakey by:jorgep
+-   fix: refs #7353 vnTable colors by:jorgep
+-   fix: refs #7354 e2e tests by:Jon
+-   fix: refs #7354 fix delivery days by:Jon
+-   fix: refs #7354 fix list searchbar and filters by:Jon
+-   fix: refs #7354 fix VnSearchbar search for zone section & finished basic tests by:Jon
+-   fix: refs #7354 fix VnTable filters and agency field by:Jon
+-   fix: refs #7354 fix zoneSearchbar by:Jon
+-   fix: refs #7354 requested changes by:Jon
+-   fix: refs #7356 colors by:jorgep
+-   fix: refs #7356 create claim dialog by:jorgep
+-   fix: refs #7889 fixed shortcut test by:Jon
+-   fix: refs #7903 fixed ticket's search bar and keybinding tooltip by:Jon
+-   fix: refs #7911 fixed shortcut and related files by:Jon
+-   fix: remove condition duplicated by:Javier Segarra
+-   fix: remove property by:Javier Segarra
+-   fix tootltip by:carlossa
+-   fix traduction by:carlossa
+-   fix(VnSectionMain): add QPage by:alexm
+-   fix(zone): zoneLocation and the others searchbar by:alexm
+-   refactor: refs #7354 fix tableFilters by:Jon
+-   refactor: refs #7354 refactor zones section and fixed e2e tests by:Jon
+-   refs #6772 feat: fix approach by:Javier Segarra
+-   refs #6772 fix: claimPhoto reload by:Javier Segarra
+-   refs #6896 fix searchbar by:carlossa
+-   refs #6897 fix entry by:carlossa
+-   refs #6899 fix invoiceFix by:carlossa
+-   refs #6899 fix order by:carlossa
+-   refs #7283 fix by:carlossa
+-   refs #7283 fix ItemDescriptor warehouse by:carlossa
+-   refs #7283 refactor fix ItemDescriptor by:carlossa
+-   refs #7355 #7366 fix account, summary, list, travelList, tooltip by:carlossa
+-   refs #7355 fix accountPrivileges by:carlossa
+-   refs #7355 fix accounts, vnTable by:carlossa
+-   refs #7355 fix privileges by:carlossa
+-   refs #7355 fix roles filters by:carlossa
+-   refs #7355 fix total by:carlossa
+-   refs #7355 fix views summarys, entryList, travelList refact by:carlossa
+-   refs #7366 fix travel hours by:carlossa
+-   test: fix e2e by:Javier Segarra
 
 # Version 24.36 - 2024-08-27
 
diff --git a/package.json b/package.json
index f25e570a3..6a7c1ed55 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
     "name": "salix-front",
-    "version": "24.36.0",
+    "version": "24.38.0",
     "description": "Salix frontend",
     "productName": "Salix",
     "author": "Verdnatura",

From 37b6a032888abba2695fa6549d327b41bf93dec1 Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Tue, 17 Sep 2024 09:25:53 +0200
Subject: [PATCH 14/29] fix(itemDescriptor): fix redirection to itemDiary

---
 src/pages/Item/Card/ItemDescriptor.vue | 17 ++++-------------
 1 file changed, 4 insertions(+), 13 deletions(-)

diff --git a/src/pages/Item/Card/ItemDescriptor.vue b/src/pages/Item/Card/ItemDescriptor.vue
index baac0c608..da6859d30 100644
--- a/src/pages/Item/Card/ItemDescriptor.vue
+++ b/src/pages/Item/Card/ItemDescriptor.vue
@@ -11,7 +11,6 @@ import VnConfirm from 'components/ui/VnConfirm.vue';
 import RegularizeStockForm from 'components/RegularizeStockForm.vue';
 import ItemDescriptorImage from 'src/pages/Item/Card/ItemDescriptorImage.vue';
 import useCardDescription from 'src/composables/useCardDescription';
-import { getUrl } from 'src/composables/getUrl';
 import axios from 'axios';
 import { dashIfEmpty } from 'src/filters';
 
@@ -51,10 +50,8 @@ const entityId = computed(() => {
 const regularizeStockFormDialog = ref(null);
 const available = ref(null);
 const visible = ref(null);
-const salixUrl = ref();
 
 onMounted(async () => {
-    salixUrl.value = await getUrl('');
     await getItemConfigs();
     await updateStock();
 });
@@ -200,16 +197,10 @@ const openCloneDialog = async () => {
         <template #actions="{}">
             <QCardActions class="row justify-center">
                 <QBtn
-                    :href="
-                        salixUrl +
-                        'item/' +
-                        entityId +
-                        '/diary?' +
-                        'warehouseFk=' +
-                        warehouseFk +
-                        '&lineFk=' +
-                        $props.saleFk
-                    "
+                    :to="{
+                        name: 'ItemDiary',
+                        query: { warehouseFk, lineFk: $props.saleFk },
+                    }"
                     size="md"
                     icon="vn:transaction"
                     color="primary"

From 3d1bb0c67a035e770f6aa02cf84e51307d9a9c8b Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Tue, 17 Sep 2024 10:20:44 +0200
Subject: [PATCH 15/29] fix(itemDescriptor): fix redirection to itemDiary

---
 src/components/common/VnCard.vue       | 10 +++++++---
 src/pages/Item/Card/ItemCard.vue       |  2 +-
 src/pages/Item/Card/ItemDescriptor.vue |  1 +
 src/pages/Login/ResetPassword.vue      |  1 -
 4 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/src/components/common/VnCard.vue b/src/components/common/VnCard.vue
index 7d29da232..0d80f43ce 100644
--- a/src/components/common/VnCard.vue
+++ b/src/components/common/VnCard.vue
@@ -24,7 +24,9 @@ const stateStore = useStateStore();
 const route = useRoute();
 const router = useRouter();
 const url = computed(() => {
-    if (props.baseUrl) return `${props.baseUrl}/${route.params.id}`;
+    if (props.baseUrl) {
+        return `${props.baseUrl}/${route.params.id}`;
+    }
     return props.customUrl;
 });
 const searchRightDataKey = computed(() => {
@@ -40,8 +42,10 @@ onBeforeMount(async () => {
     try {
         if (!props.baseUrl) arrayData.store.filter.where = { id: route.params.id };
         await arrayData.fetch({ append: false, updateRouter: false });
-    } catch (e) {
-        router.push({ name: 'WorkerList' });
+    } catch {
+        const { matched: matches } = router.currentRoute.value;
+        const { path } = matches.at(-1);
+        router.push({ path: path.replace(/:id.*/, '') });
     }
 });
 
diff --git a/src/pages/Item/Card/ItemCard.vue b/src/pages/Item/Card/ItemCard.vue
index 1162327c1..2412f2bf9 100644
--- a/src/pages/Item/Card/ItemCard.vue
+++ b/src/pages/Item/Card/ItemCard.vue
@@ -12,7 +12,7 @@ import ItemListFilter from '../ItemListFilter.vue';
         search-data-key="ItemList"
         :searchbar-props="{
             url: 'Items/filter',
-            label: 'searchbar.labelr',
+            label: 'searchbar.label',
             info: 'searchbar.info',
         }"
     />
diff --git a/src/pages/Item/Card/ItemDescriptor.vue b/src/pages/Item/Card/ItemDescriptor.vue
index da6859d30..ef844824f 100644
--- a/src/pages/Item/Card/ItemDescriptor.vue
+++ b/src/pages/Item/Card/ItemDescriptor.vue
@@ -199,6 +199,7 @@ const openCloneDialog = async () => {
                 <QBtn
                     :to="{
                         name: 'ItemDiary',
+                        params: { id: entityId },
                         query: { warehouseFk, lineFk: $props.saleFk },
                     }"
                     size="md"
diff --git a/src/pages/Login/ResetPassword.vue b/src/pages/Login/ResetPassword.vue
index eff718e97..2751f1ceb 100644
--- a/src/pages/Login/ResetPassword.vue
+++ b/src/pages/Login/ResetPassword.vue
@@ -33,7 +33,6 @@ async function onSubmit() {
     };
 
     try {
-        console.log('newPassword: ', newPassword);
         await axios.post(
             'VnUsers/reset-password',
             { newPassword: newPassword.value },

From 044156356c559eb8660d851bb641f57a4909dd68 Mon Sep 17 00:00:00 2001
From: carlossa <carlossa@verdnatura.es>
Date: Tue, 17 Sep 2024 10:37:22 +0200
Subject: [PATCH 16/29] hotfix searchbar

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

diff --git a/src/pages/InvoiceOut/InvoiceOutList.vue b/src/pages/InvoiceOut/InvoiceOutList.vue
index 915b58b15..5157d957b 100644
--- a/src/pages/InvoiceOut/InvoiceOutList.vue
+++ b/src/pages/InvoiceOut/InvoiceOutList.vue
@@ -177,7 +177,7 @@ watchEffect(selectedRows);
     <VnSearchbar
         :info="t('youCanSearchByInvoiceReference')"
         :label="t('searchInvoice')"
-        data-key="InvoiceOutList"
+        data-key="invoiceOut"
     />
     <VnSubToolbar>
         <template #st-actions>

From 56f8cbe615de8996b100cab085716c45a62629fd Mon Sep 17 00:00:00 2001
From: jorgep <jorgep@verdnatura.es>
Date: Tue, 17 Sep 2024 11:37:44 +0200
Subject: [PATCH 17/29] fix: refs #7353 sales person filter and locale

---
 src/components/ui/VnFilterPanel.vue              | 15 +++++++++++++--
 src/pages/Monitor/Ticket/MonitorTicketFilter.vue | 11 ++++++++---
 2 files changed, 21 insertions(+), 5 deletions(-)

diff --git a/src/components/ui/VnFilterPanel.vue b/src/components/ui/VnFilterPanel.vue
index cebdc4bbf..12525c7cc 100644
--- a/src/components/ui/VnFilterPanel.vue
+++ b/src/components/ui/VnFilterPanel.vue
@@ -6,7 +6,7 @@ import { useRoute } from 'vue-router';
 import toDate from 'filters/toDate';
 import VnFilterPanelChip from 'components/ui/VnFilterPanelChip.vue';
 
-const { t } = useI18n();
+const { t, te } = useI18n();
 const $props = defineProps({
     modelValue: {
         type: Object,
@@ -200,6 +200,11 @@ function sanitizer(params) {
     }
     return params;
 }
+
+function getLocale(label) {
+    const globalLocale = `globals.params.${label}`;
+    return te(globalLocale) ? t(globalLocale) : t(`params.${label}`);
+}
 </script>
 
 <template>
@@ -248,7 +253,12 @@ function sanitizer(params) {
                         :removable="!unremovableParams?.includes(chip.label)"
                         @remove="remove(chip.label)"
                     >
-                        <slot name="tags" :tag="chip" :format-fn="formatValue">
+                        <slot
+                            name="tags"
+                            :tag="chip"
+                            :format-fn="formatValue"
+                            :locale-fn="getLocale"
+                        >
                             <div class="q-gutter-x-xs">
                                 <strong>{{ chip.label }}:</strong>
                                 <span>"{{ formatValue(chip.value) }}"</span>
@@ -262,6 +272,7 @@ function sanitizer(params) {
                         :tags="customTags"
                         :format-fn="formatValue"
                         :search-fn="search"
+                        :locale-fn="getLocale"
                     />
                 </div>
             </QItem>
diff --git a/src/pages/Monitor/Ticket/MonitorTicketFilter.vue b/src/pages/Monitor/Ticket/MonitorTicketFilter.vue
index 3c95f5cdd..01e9d65ec 100644
--- a/src/pages/Monitor/Ticket/MonitorTicketFilter.vue
+++ b/src/pages/Monitor/Ticket/MonitorTicketFilter.vue
@@ -11,7 +11,7 @@ import FetchData from 'src/components/FetchData.vue';
 import { dateRange } from 'src/filters';
 
 defineProps({ dataKey: { type: String, required: true } });
-const { t } = useI18n();
+const { t, te } = useI18n();
 const warehouses = ref();
 const groupedStates = ref();
 
@@ -26,6 +26,11 @@ const handleScopeDays = (params, days, callback) => {
     }
     if (callback) callback();
 };
+
+const getLocale = (label) => {
+    const globalLocale = `globals.params.${label}`;
+    return te(globalLocale) ? t(globalLocale) : t(`params.${label}`);
+};
 </script>
 <template>
     <FetchData url="Warehouses" auto-load @on-fetch="(data) => (warehouses = data)" />
@@ -46,7 +51,7 @@ const handleScopeDays = (params, days, callback) => {
     >
         <template #tags="{ tag, formatFn }">
             <div class="q-gutter-x-xs">
-                <strong v-text="`${t(`params.${tag.label}`)}:`" />
+                <strong v-text="`${getLocale(tag.label)}:`" />
                 <span v-text="formatFn(tag.value)" />
             </div>
         </template>
@@ -110,7 +115,7 @@ const handleScopeDays = (params, days, callback) => {
                         url="Workers/search"
                         :params="{ departmentCodes: ['VT'] }"
                         is-outlined
-                        option-value="code"
+                        option-value="id"
                         option-label="name"
                         :no-one="true"
                     >

From 3f03f0d4e91e6cf40b51ccd264a206937a634782 Mon Sep 17 00:00:00 2001
From: jorgep <jorgep@verdnatura.es>
Date: Tue, 17 Sep 2024 12:41:57 +0200
Subject: [PATCH 18/29] fix: refs #7353 show unremovable params

---
 src/pages/Monitor/Ticket/MonitorTicketFilter.vue | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/pages/Monitor/Ticket/MonitorTicketFilter.vue b/src/pages/Monitor/Ticket/MonitorTicketFilter.vue
index 01e9d65ec..2d48bd44e 100644
--- a/src/pages/Monitor/Ticket/MonitorTicketFilter.vue
+++ b/src/pages/Monitor/Ticket/MonitorTicketFilter.vue
@@ -48,6 +48,7 @@ const getLocale = (label) => {
         :hidden-tags="['from', 'to', 'search']"
         :custom-tags="['scopeDays']"
         :unremovable-params="['from', 'to', 'scopeDays']"
+        search-url="saleMonitorTickets"
     >
         <template #tags="{ tag, formatFn }">
             <div class="q-gutter-x-xs">

From 2cb2ce16efacf8919e000026995a446b03b12820 Mon Sep 17 00:00:00 2001
From: jorgep <jorgep@verdnatura.es>
Date: Tue, 17 Sep 2024 12:56:50 +0200
Subject: [PATCH 19/29] fix: refs #7353 locale

---
 src/pages/Monitor/Ticket/MonitorTicketFilter.vue | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/src/pages/Monitor/Ticket/MonitorTicketFilter.vue b/src/pages/Monitor/Ticket/MonitorTicketFilter.vue
index 2d48bd44e..57248d580 100644
--- a/src/pages/Monitor/Ticket/MonitorTicketFilter.vue
+++ b/src/pages/Monitor/Ticket/MonitorTicketFilter.vue
@@ -28,8 +28,9 @@ const handleScopeDays = (params, days, callback) => {
 };
 
 const getLocale = (label) => {
-    const globalLocale = `globals.params.${label}`;
-    return te(globalLocale) ? t(globalLocale) : t(`params.${label}`);
+    const param = label.split('.').at(-1);
+    const globalLocale = `globals.params.${param}`;
+    return te(globalLocale) ? t(globalLocale) : t(`params.${param}`);
 };
 </script>
 <template>

From ed4a4e1e59ab55b6698c7d50ab85e8036bd0f2bf Mon Sep 17 00:00:00 2001
From: jorgep <jorgep@verdnatura.es>
Date: Tue, 17 Sep 2024 12:57:43 +0200
Subject: [PATCH 20/29] fix: refs #7353 rollback

---
 src/components/ui/VnFilterPanel.vue | 13 +------------
 1 file changed, 1 insertion(+), 12 deletions(-)

diff --git a/src/components/ui/VnFilterPanel.vue b/src/components/ui/VnFilterPanel.vue
index 12525c7cc..03b01b0ab 100644
--- a/src/components/ui/VnFilterPanel.vue
+++ b/src/components/ui/VnFilterPanel.vue
@@ -200,11 +200,6 @@ function sanitizer(params) {
     }
     return params;
 }
-
-function getLocale(label) {
-    const globalLocale = `globals.params.${label}`;
-    return te(globalLocale) ? t(globalLocale) : t(`params.${label}`);
-}
 </script>
 
 <template>
@@ -253,12 +248,7 @@ function getLocale(label) {
                         :removable="!unremovableParams?.includes(chip.label)"
                         @remove="remove(chip.label)"
                     >
-                        <slot
-                            name="tags"
-                            :tag="chip"
-                            :format-fn="formatValue"
-                            :locale-fn="getLocale"
-                        >
+                        <slot name="tags" :tag="chip" :format-fn="formatValue">
                             <div class="q-gutter-x-xs">
                                 <strong>{{ chip.label }}:</strong>
                                 <span>"{{ formatValue(chip.value) }}"</span>
@@ -272,7 +262,6 @@ function getLocale(label) {
                         :tags="customTags"
                         :format-fn="formatValue"
                         :search-fn="search"
-                        :locale-fn="getLocale"
                     />
                 </div>
             </QItem>

From eb6f12ae3b28229372d16a87a4f46b7155da0ca5 Mon Sep 17 00:00:00 2001
From: jorgep <jorgep@verdnatura.es>
Date: Tue, 17 Sep 2024 12:58:06 +0200
Subject: [PATCH 21/29] fix: refs #7353 rollback

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

diff --git a/src/components/ui/VnFilterPanel.vue b/src/components/ui/VnFilterPanel.vue
index 03b01b0ab..cebdc4bbf 100644
--- a/src/components/ui/VnFilterPanel.vue
+++ b/src/components/ui/VnFilterPanel.vue
@@ -6,7 +6,7 @@ import { useRoute } from 'vue-router';
 import toDate from 'filters/toDate';
 import VnFilterPanelChip from 'components/ui/VnFilterPanelChip.vue';
 
-const { t, te } = useI18n();
+const { t } = useI18n();
 const $props = defineProps({
     modelValue: {
         type: Object,

From e559ab43d7bbbfb19ad5917255ed271290052cac Mon Sep 17 00:00:00 2001
From: pablone <pablone@verdnatura.es>
Date: Tue, 17 Sep 2024 13:40:27 +0200
Subject: [PATCH 22/29] fix: refs #7404 remove some style

---
 src/components/VnTable/VnTable.vue         | 2 +-
 src/pages/Entry/EntryStockBought.vue       | 4 ++--
 src/pages/Entry/EntryStockBoughtDetail.vue | 2 +-
 3 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/components/VnTable/VnTable.vue b/src/components/VnTable/VnTable.vue
index b7321fe16..648b1fb3b 100644
--- a/src/components/VnTable/VnTable.vue
+++ b/src/components/VnTable/VnTable.vue
@@ -430,7 +430,7 @@ function handleOnDataSaved(_) {
                     />
                 </template>
                 <template #header-cell="{ col }">
-                    <QTh table-header-style="max-width:50%" v-if="col.visible ?? true">
+                    <QTh v-if="col.visible ?? true">
                         <div
                             class="column self-start q-ml-xs ellipsis"
                             :class="`text-${col?.align ?? 'left'}`"
diff --git a/src/pages/Entry/EntryStockBought.vue b/src/pages/Entry/EntryStockBought.vue
index c8f147b1f..5b4d43e06 100644
--- a/src/pages/Entry/EntryStockBought.vue
+++ b/src/pages/Entry/EntryStockBought.vue
@@ -219,8 +219,8 @@ function openDialog() {
                 <span class="link" @click.stop>
                     {{ row?.worker?.user?.name }}
                     <WorkerDescriptorProxy :id="row?.workerFk" />
-                </span> </template
-            >0
+                </span>
+            </template>
         </VnTable>
     </QPage>
 </template>
diff --git a/src/pages/Entry/EntryStockBoughtDetail.vue b/src/pages/Entry/EntryStockBoughtDetail.vue
index 6d9227ad2..744b9d3fe 100644
--- a/src/pages/Entry/EntryStockBoughtDetail.vue
+++ b/src/pages/Entry/EntryStockBoughtDetail.vue
@@ -63,7 +63,7 @@ const columns = [
 ];
 </script>
 <template>
-    <QDialog position="bottom" :maximized="true">
+    <QDialog :maximized="true">
         <div class="container">
             <VnTable
                 ref="tableRef"

From 4f662375cd34e6e08bfe376b409a6d636611f65b Mon Sep 17 00:00:00 2001
From: carlossa <carlossa@verdnatura.es>
Date: Tue, 17 Sep 2024 15:04:58 +0200
Subject: [PATCH 23/29] fix(VnTable): sanitizer value is defined

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

diff --git a/src/components/VnTable/VnTable.vue b/src/components/VnTable/VnTable.vue
index 648b1fb3b..55028080c 100644
--- a/src/components/VnTable/VnTable.vue
+++ b/src/components/VnTable/VnTable.vue
@@ -200,7 +200,7 @@ function setUserParams(watchedParams, watchedOrder) {
 
 function sanitizer(params) {
     for (const [key, value] of Object.entries(params)) {
-        if (typeof value == 'object') {
+        if (value && typeof value == 'object') {
             const param = Object.values(value)[0];
             if (typeof param == 'string') params[key] = param.replaceAll('%', '');
         }

From aa6dac39449cc1db11c8130edc488717fc8a487a Mon Sep 17 00:00:00 2001
From: Javier Segarra <jsegarra@verdnatura.es>
Date: Wed, 18 Sep 2024 07:28:10 +0000
Subject: [PATCH 24/29] fix: SupplierFiscalData VnLocation

---
 src/pages/Supplier/Card/SupplierFiscalData.vue | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/pages/Supplier/Card/SupplierFiscalData.vue b/src/pages/Supplier/Card/SupplierFiscalData.vue
index 60cd6770b..553fc0f94 100644
--- a/src/pages/Supplier/Card/SupplierFiscalData.vue
+++ b/src/pages/Supplier/Card/SupplierFiscalData.vue
@@ -19,8 +19,8 @@ const sageTransactionTypesOptions = ref([]);
 const supplierActivitiesOptions = ref([]);
 
 function handleLocation(data, location) {
-    const { town, label, provinceFk, countryFk } = location ?? {};
-    data.postCode = label;
+    const { town, code, provinceFk, countryFk } = location ?? {};
+    data.postCode = code;
     data.city = town;
     data.provinceFk = provinceFk;
     data.countryFk = countryFk;

From 21a7fafba5c63a3238b248a5b1b6832ba32b5bb3 Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Wed, 18 Sep 2024 09:57:21 +0200
Subject: [PATCH 25/29] feat: create VnSelectEnum and add in AccountBasicData
 and ClaimBasicData

---
 src/components/common/VnSelectEnum.vue        | 52 ++++++++++++++
 src/pages/Account/Card/AccountBasicData.vue   |  9 ++-
 src/pages/Claim/Card/ClaimBasicData.vue       | 72 ++++---------------
 .../integration/outLogin/twoFactor.spec.js    |  2 +-
 4 files changed, 71 insertions(+), 64 deletions(-)
 create mode 100644 src/components/common/VnSelectEnum.vue

diff --git a/src/components/common/VnSelectEnum.vue b/src/components/common/VnSelectEnum.vue
new file mode 100644
index 000000000..b9db67c37
--- /dev/null
+++ b/src/components/common/VnSelectEnum.vue
@@ -0,0 +1,52 @@
+<script setup>
+import { onBeforeMount, ref, useAttrs } from 'vue';
+import axios from 'axios';
+import VnSelect from 'components/common/VnSelect.vue';
+
+const { schema, table, column, translation, defaultOptions } = defineProps({
+    schema: {
+        type: String,
+        default: 'vn',
+    },
+    table: {
+        type: String,
+        required: true,
+    },
+    column: {
+        type: String,
+        required: true,
+    },
+    translation: {
+        type: Function,
+        default: null,
+    },
+    defaultOptions: {
+        type: Array,
+        default: () => [],
+    },
+});
+
+const $attrs = useAttrs();
+const options = ref([]);
+onBeforeMount(async () => {
+    options.value = [].concat(defaultOptions);
+    const { data } = await axios.get(`Applications/get-enum-values`, {
+        params: { schema, table, column },
+    });
+
+    for (const value of data)
+        options.value.push({
+            [$attrs['option-value'] ?? 'id']: value,
+            [$attrs['option-label'] ?? 'name']: translation ? translation(value) : value,
+        });
+});
+</script>
+
+<template>
+    <VnSelect
+        v-bind="$attrs"
+        :options="options"
+        :key="options.length"
+        :input-debounce="0"
+    />
+</template>
diff --git a/src/pages/Account/Card/AccountBasicData.vue b/src/pages/Account/Card/AccountBasicData.vue
index b223c4bc0..f1cdaf9df 100644
--- a/src/pages/Account/Card/AccountBasicData.vue
+++ b/src/pages/Account/Card/AccountBasicData.vue
@@ -2,6 +2,7 @@
 import { useRoute } from 'vue-router';
 import { useI18n } from 'vue-i18n';
 import VnSelect from 'src/components/common/VnSelect.vue';
+import VnSelectEnum from 'src/components/common/VnSelectEnum.vue';
 import FormModel from 'components/FormModel.vue';
 import VnInput from 'src/components/common/VnInput.vue';
 import { ref, watch } from 'vue';
@@ -43,9 +44,11 @@ watch(
                     option-value="code"
                     option-label="code"
                 />
-                <VnSelect
-                    url="TwoFactorTypes"
-                    v-model="data.twoFactorFk"
+                <VnSelectEnum
+                    schema="account"
+                    table="user"
+                    column="twoFactor"
+                    v-model="data.twoFactor"
                     :label="t('account.card.twoFactor')"
                     option-value="code"
                     option-label="code"
diff --git a/src/pages/Claim/Card/ClaimBasicData.vue b/src/pages/Claim/Card/ClaimBasicData.vue
index b1d3e24cd..63b0b7c0d 100644
--- a/src/pages/Claim/Card/ClaimBasicData.vue
+++ b/src/pages/Claim/Card/ClaimBasicData.vue
@@ -3,58 +3,18 @@ import { ref } from 'vue';
 import { useRoute } from 'vue-router';
 import { useI18n } from 'vue-i18n';
 import VnSelect from 'src/components/common/VnSelect.vue';
+import VnSelectEnum from 'src/components/common/VnSelectEnum.vue';
 import FetchData from 'components/FetchData.vue';
 import FormModel from 'components/FormModel.vue';
 import VnRow from 'components/ui/VnRow.vue';
 import VnInput from 'src/components/common/VnInput.vue';
 import VnInputDate from 'components/common/VnInputDate.vue';
 
-import axios from 'axios';
 import VnAvatar from 'src/components/ui/VnAvatar.vue';
 
 const route = useRoute();
 const { t } = useI18n();
-
-const claimStates = ref([]);
-const claimStatesCopy = ref([]);
-const optionsList = ref([]);
-
 const workersOptions = ref([]);
-
-function setClaimStates(data) {
-    claimStates.value = data;
-    claimStatesCopy.value = data;
-}
-
-async function getEnumValues() {
-    optionsList.value = [{ id: null, description: t('claim.null') }];
-    const { data } = await axios.get(`Applications/get-enum-values`, {
-        params: {
-            schema: 'vn',
-            table: 'claim',
-            column: 'pickup',
-        },
-    });
-    for (let value of data)
-        optionsList.value.push({ id: value, description: t(`claim.${value}`) });
-}
-
-getEnumValues();
-
-const statesFilter = {
-    options: claimStates,
-    filterFn: (options, value) => {
-        const search = value.toLowerCase();
-
-        if (value === '') return claimStatesCopy.value;
-
-        return options.value.filter((row) => {
-            const description = row.description.toLowerCase();
-
-            return description.indexOf(search) > -1;
-        });
-    },
-};
 </script>
 <template>
     <FetchData
@@ -70,7 +30,7 @@ const statesFilter = {
         auto-load
         :reload="true"
     >
-        <template #form="{ data, validate, filter }">
+        <template #form="{ data, validate }">
             <VnRow>
                 <VnInput
                     v-model="data.client.name"
@@ -101,20 +61,14 @@ const statesFilter = {
                         />
                     </template>
                 </VnSelect>
-                <QSelect
+                <VnSelect
                     v-model="data.claimStateFk"
-                    :options="claimStates"
-                    option-value="id"
-                    option-label="description"
-                    emit-value
+                    url="ClaimStates"
                     :label="t('claim.state')"
-                    map-options
-                    use-input
-                    @filter="(value, update) => filter(value, update, statesFilter)"
+                    option-label="description"
                     :rules="validate('claim.claimStateFk')"
                     :input-debounce="0"
-                >
-                </QSelect>
+                />
             </VnRow>
             <VnRow>
                 <QInput
@@ -123,16 +77,14 @@ const statesFilter = {
                     :rules="validate('claim.packages')"
                     type="number"
                 />
-                <QSelect
+                <VnSelectEnum
                     v-model="data.pickup"
-                    :options="optionsList"
-                    option-value="id"
-                    option-label="description"
-                    emit-value
                     :label="t('claim.pickup')"
-                    map-options
-                    use-input
-                    :input-debounce="0"
+                    table="claim"
+                    column="pickup"
+                    option-label="description"
+                    :translation="(value) => t(`claim.${value}`)"
+                    :default-options="[{ id: null, description: t('claim.null') }]"
                 />
             </VnRow>
         </template>
diff --git a/test/cypress/integration/outLogin/twoFactor.spec.js b/test/cypress/integration/outLogin/twoFactor.spec.js
index 259ddfc0f..4d8561f0f 100755
--- a/test/cypress/integration/outLogin/twoFactor.spec.js
+++ b/test/cypress/integration/outLogin/twoFactor.spec.js
@@ -12,7 +12,7 @@ describe('Two Factor', () => {
         cy.request(
             'PATCH',
             `http://localhost:3000/api/VnUsers/${userId}/update-user?access_token=DEFAULT_TOKEN`,
-            { twoFactorFk: 'email' }
+            { twoFactor: 'email' }
         );
     });
 

From 3906fc386f6b99528a9973299b22b0a7c974147d Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Wed, 18 Sep 2024 12:49:45 +0200
Subject: [PATCH 26/29] hotFix: supplierDescriptor not use same data-key

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

diff --git a/src/pages/Supplier/Card/SupplierDescriptor.vue b/src/pages/Supplier/Card/SupplierDescriptor.vue
index 6e60a336c..5754031b3 100644
--- a/src/pages/Supplier/Card/SupplierDescriptor.vue
+++ b/src/pages/Supplier/Card/SupplierDescriptor.vue
@@ -109,7 +109,7 @@ const getEntryQueryParams = (supplier) => {
         :subtitle="data.subtitle"
         :filter="filter"
         @on-fetch="setData"
-        data-key="supplier"
+        data-key="supplierDescriptor"
         :summary="$props.summary"
     >
         <template #body="{ entity }">

From f86525e31dcf0bc79a5b04dc01ab8456efae34ef Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Wed, 18 Sep 2024 13:24:21 +0200
Subject: [PATCH 27/29] fix: not null variable

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

diff --git a/src/components/VnTable/VnTable.vue b/src/components/VnTable/VnTable.vue
index 6f678d5c1..5b39265fb 100644
--- a/src/components/VnTable/VnTable.vue
+++ b/src/components/VnTable/VnTable.vue
@@ -192,7 +192,7 @@ function setUserParams(watchedParams, watchedOrder) {
 
 function sanitizer(params) {
     for (const [key, value] of Object.entries(params)) {
-        if (typeof value == 'object') {
+        if (value && typeof value == 'object') {
             const param = Object.values(value)[0];
             if (typeof param == 'string') params[key] = param.replaceAll('%', '');
         }

From 37329a73914ef10f355c9fe7698e9dd58a9a063a Mon Sep 17 00:00:00 2001
From: Javier Segarra <jsegarra@verdnatura.es>
Date: Wed, 18 Sep 2024 13:30:51 +0200
Subject: [PATCH 28/29] feat: add shortcut add event in some subSections

---
 src/pages/Customer/Card/CustomerContacts.vue        |  9 +++++----
 .../Customer/components/CustomerAddressEdit.vue     |  9 +++++----
 src/pages/Item/Card/ItemTags.vue                    |  9 +++++----
 src/pages/Route/Roadmap/RoadmapStops.vue            |  9 +++++----
 src/pages/Supplier/Card/SupplierAccounts.vue        | 13 ++++++-------
 src/pages/Supplier/Card/SupplierContacts.vue        |  9 +++++----
 src/pages/Worker/WorkerDepartmentTree.vue           |  9 +++++----
 7 files changed, 36 insertions(+), 31 deletions(-)

diff --git a/src/pages/Customer/Card/CustomerContacts.vue b/src/pages/Customer/Card/CustomerContacts.vue
index cd4d553df..c420f650e 100644
--- a/src/pages/Customer/Card/CustomerContacts.vue
+++ b/src/pages/Customer/Card/CustomerContacts.vue
@@ -56,17 +56,18 @@ const customerContactsRef = ref(null);
                             </div>
                         </VnRow>
                         <VnRow>
-                            <QIcon
+                            <QBtn
                                 @click="customerContactsRef.insert()"
                                 class="cursor-pointer"
                                 color="primary"
-                                name="add"
-                                size="sm"
+                                flat
+                                icon="add"
+                                shortcut="+"
                             >
                                 <QTooltip>
                                     {{ t('Add contact') }}
                                 </QTooltip>
-                            </QIcon>
+                            </QBtn>
                         </VnRow>
                     </QCard>
                 </template>
diff --git a/src/pages/Customer/components/CustomerAddressEdit.vue b/src/pages/Customer/components/CustomerAddressEdit.vue
index 2252a96dc..82a190ae1 100644
--- a/src/pages/Customer/components/CustomerAddressEdit.vue
+++ b/src/pages/Customer/components/CustomerAddressEdit.vue
@@ -272,16 +272,17 @@ function handleLocation(data, location) {
                 </div>
             </VnRow>
 
-            <QIcon
+            <QBtn
                 @click.stop="addNote()"
                 class="cursor-pointer add-icon q-mt-md"
-                name="add"
-                size="sm"
+                flat
+                icon="add"
+                shortcut="+"
             >
                 <QTooltip>
                     {{ t('Add note') }}
                 </QTooltip>
-            </QIcon>
+            </QBtn>
         </template>
     </FormModel>
 </template>
diff --git a/src/pages/Item/Card/ItemTags.vue b/src/pages/Item/Card/ItemTags.vue
index 39723ae65..1b5eb28f0 100644
--- a/src/pages/Item/Card/ItemTags.vue
+++ b/src/pages/Item/Card/ItemTags.vue
@@ -168,19 +168,20 @@ const insertTag = (rows) => {
                             </div>
                         </VnRow>
                         <VnRow class="justify-center items-center">
-                            <QIcon
+                            <QBtn
                                 @click="insertTag(rows)"
                                 class="cursor-pointer"
                                 :disable="!validRow"
                                 color="primary"
-                                name="add"
-                                size="sm"
+                                flat
+                                icon="add"
+                                shortcut="+"
                                 style="flex: 0"
                             >
                                 <QTooltip>
                                     {{ t('itemTags.addTag') }}
                                 </QTooltip>
-                            </QIcon>
+                            </QBtn>
                         </VnRow>
                     </QCard>
                 </template>
diff --git a/src/pages/Route/Roadmap/RoadmapStops.vue b/src/pages/Route/Roadmap/RoadmapStops.vue
index 8ff044d2d..d8215ea49 100644
--- a/src/pages/Route/Roadmap/RoadmapStops.vue
+++ b/src/pages/Route/Roadmap/RoadmapStops.vue
@@ -65,9 +65,10 @@ const updateDefaultStop = (data) => {
                         </div>
                     </QCardSection>
                     <QCardSection>
-                        <QIcon
-                            name="add"
-                            size="sm"
+                        <QBtn
+                            flat
+                            icon="add"
+                            shortcut="+"
                             class="cursor-pointer"
                             color="primary"
                             @click="roadmapStopsCrudRef.insert()"
@@ -75,7 +76,7 @@ const updateDefaultStop = (data) => {
                             <QTooltip>
                                 {{ t('Add stop') }}
                             </QTooltip>
-                        </QIcon>
+                        </QBtn>
                     </QCardSection>
                 </QCard>
             </template>
diff --git a/src/pages/Supplier/Card/SupplierAccounts.vue b/src/pages/Supplier/Card/SupplierAccounts.vue
index b0e8b06e8..f8fbba0e4 100644
--- a/src/pages/Supplier/Card/SupplierAccounts.vue
+++ b/src/pages/Supplier/Card/SupplierAccounts.vue
@@ -102,9 +102,7 @@ const setWireTransfer = async () => {
                     <VnInput :label="t('supplier.accounts.iban')" v-model="row.iban">
                         <template #append>
                             <QIcon name="info" class="cursor-info">
-                                <QTooltip>{{
-                                    t('components.iban_tooltip')
-                                }}</QTooltip>
+                                <QTooltip>{{ t('components.iban_tooltip') }}</QTooltip>
                             </QIcon>
                         </template>
                     </VnInput>
@@ -165,9 +163,10 @@ const setWireTransfer = async () => {
                     </div>
                 </VnRow>
                 <VnRow>
-                    <QIcon
-                        name="add"
-                        size="sm"
+                    <QBtn
+                        flat
+                        icon="add"
+                        shortcut="+"
                         class="cursor-pointer"
                         color="primary"
                         @click="supplierAccountRef.insert()"
@@ -175,7 +174,7 @@ const setWireTransfer = async () => {
                         <QTooltip>
                             {{ t('Add account') }}
                         </QTooltip>
-                    </QIcon>
+                    </QBtn>
                 </VnRow>
             </QCard>
         </template>
diff --git a/src/pages/Supplier/Card/SupplierContacts.vue b/src/pages/Supplier/Card/SupplierContacts.vue
index 35e8b98fc..3f2063784 100644
--- a/src/pages/Supplier/Card/SupplierContacts.vue
+++ b/src/pages/Supplier/Card/SupplierContacts.vue
@@ -84,9 +84,10 @@ const insertRow = () => {
                     </VnRow>
                 </QCardSection>
                 <VnRow>
-                    <QIcon
-                        name="add"
-                        size="sm"
+                    <QBtn
+                        flat
+                        icon="add"
+                        shortcut="+"
                         class="cursor-pointer"
                         color="primary"
                         @click="insertRow()"
@@ -94,7 +95,7 @@ const insertRow = () => {
                         <QTooltip>
                             {{ t('Add contact') }}
                         </QTooltip>
-                    </QIcon>
+                    </QBtn>
                 </VnRow>
             </QCard>
         </template>
diff --git a/src/pages/Worker/WorkerDepartmentTree.vue b/src/pages/Worker/WorkerDepartmentTree.vue
index 392539c86..c73cb59b9 100644
--- a/src/pages/Worker/WorkerDepartmentTree.vue
+++ b/src/pages/Worker/WorkerDepartmentTree.vue
@@ -180,17 +180,18 @@ function handleEvent(type, event, node) {
                                 {{ t('Remove') }}
                             </QTooltip>
                         </QIcon>
-                        <QIcon
-                            name="add"
+                        <QBtn
                             color="primary"
-                            size="sm"
+                            flat
+                            icon="add"
+                            shortcut="+"
                             class="cursor-pointer"
                             @click.stop="showCreateNodeForm(node.id)"
                         >
                             <QTooltip>
                                 {{ t('Create') }}
                             </QTooltip>
-                        </QIcon>
+                        </QBtn>
                     </div>
                 </div>
             </template>

From b3f27d9a84970050963f2b7598ae9fc1ad751087 Mon Sep 17 00:00:00 2001
From: jgallego <jgallego@verdnatura.es>
Date: Wed, 18 Sep 2024 17:51:49 +0200
Subject: [PATCH 29/29] feat: translations fixed

---
 src/pages/Route/Roadmap/RoadmapBasicData.vue | 4 ++--
 src/pages/Route/Roadmap/RoadmapFilter.vue    | 8 ++++----
 src/pages/Route/Roadmap/RoadmapSummary.vue   | 4 ++--
 src/pages/Route/RouteRoadmap.vue             | 1 +
 4 files changed, 9 insertions(+), 8 deletions(-)

diff --git a/src/pages/Route/Roadmap/RoadmapBasicData.vue b/src/pages/Route/Roadmap/RoadmapBasicData.vue
index e1611ed61..eeefaca2c 100644
--- a/src/pages/Route/Roadmap/RoadmapBasicData.vue
+++ b/src/pages/Route/Roadmap/RoadmapBasicData.vue
@@ -103,8 +103,8 @@ es:
     Roadmap: Troncal
     ETD date: Fecha ETD
     ETD hour: Hora ETD
-    Tractor plate: Matrícula tractor
-    Trailer plate: Matrícula trailer
+    Tractor plate: Matrícula tractora
+    Trailer plate: Matrícula remolque
     Carrier: Transportista
     Price: Precio
     Driver name: Nombre del conductor
diff --git a/src/pages/Route/Roadmap/RoadmapFilter.vue b/src/pages/Route/Roadmap/RoadmapFilter.vue
index 04c5c9696..ecf8d39fc 100644
--- a/src/pages/Route/Roadmap/RoadmapFilter.vue
+++ b/src/pages/Route/Roadmap/RoadmapFilter.vue
@@ -164,8 +164,8 @@ en:
         to: To
 es:
     params:
-        tractorPlate: Matrícula del tractor
-        trailerPlate: Matrícula del trailer
+        tractorPlate: Matrícula tractora
+        trailerPlate: Matrícula remolque
         supplierFk: Transportista
         price: Precio
         driverName: Nombre del conductor
@@ -174,8 +174,8 @@ es:
         to: Hasta
     From: Desde
     To: Hasta
-    Tractor Plate: Matrícula del tractor
-    Trailer Plate: Matrícula del trailer
+    Tractor Plate: Matrícula tractora
+    Trailer Plate: Matrícula remolque
     Carrier: Transportista
     Price: Precio
     Driver name: Nombre del conductor
diff --git a/src/pages/Route/Roadmap/RoadmapSummary.vue b/src/pages/Route/Roadmap/RoadmapSummary.vue
index 7f8b7107b..3fb36b4f7 100644
--- a/src/pages/Route/Roadmap/RoadmapSummary.vue
+++ b/src/pages/Route/Roadmap/RoadmapSummary.vue
@@ -149,8 +149,8 @@ const filter = {
 <i18n>
 es:
     Carrier: Transportista
-    Tractor Plate: Matrícula tractor
-    Trailer Plate: Matrícula trailer
+    Tractor Plate: Matrícula tractora
+    Trailer Plate: Matrícula remolque
     Phone: Teléfono
     Worker: Trabajador
     Observations: Observaciones
diff --git a/src/pages/Route/RouteRoadmap.vue b/src/pages/Route/RouteRoadmap.vue
index 306387cbe..d921dab1f 100644
--- a/src/pages/Route/RouteRoadmap.vue
+++ b/src/pages/Route/RouteRoadmap.vue
@@ -237,4 +237,5 @@ es:
     Price: Precio
     Observations: Observaciones
     Preview: Vista previa
+    Select the estimated date of departure (ETD): Selecciona la fecha estimada de salida
 </i18n>