From 658bd015caa50faaa47cca00c0f3767de21f5e5a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Carlos=20Andr=C3=A9s?= <carlosap@verdnatura.es>
Date: Fri, 14 Feb 2025 12:41:11 +0100
Subject: [PATCH 01/59] feat: refs #8529 invoiceIn move deductible field from
 head to lines

---
 .../InvoiceIn/Card/InvoiceInBasicData.vue     | 28 ++++---------------
 src/pages/InvoiceIn/Card/InvoiceInSummary.vue |  4 ---
 src/pages/InvoiceIn/Card/InvoiceInVat.vue     | 15 ++++++++++
 3 files changed, 20 insertions(+), 27 deletions(-)

diff --git a/src/pages/InvoiceIn/Card/InvoiceInBasicData.vue b/src/pages/InvoiceIn/Card/InvoiceInBasicData.vue
index 905ddebb2..9fe365a38 100644
--- a/src/pages/InvoiceIn/Card/InvoiceInBasicData.vue
+++ b/src/pages/InvoiceIn/Card/InvoiceInBasicData.vue
@@ -143,20 +143,12 @@ function deleteFile(dmsFk) {
             </VnRow>
             <VnRow>
                 <VnSelect
-                    :label="t('Undeductible VAT')"
-                    v-model="data.deductibleExpenseFk"
-                    :options="expenses"
+                    :label="t('invoiceIn.summary.sage')"
+                    v-model="data.withholdingSageFk"
+                    :options="sageWithholdings"
                     option-value="id"
-                    option-label="id"
-                    :filter-options="['id', 'name']"
-                    data-cy="UnDeductibleVatSelect"
-                >
-                    <template #option="scope">
-                        <QItem v-bind="scope.itemProps">
-                            {{ `${scope.opt.id}: ${scope.opt.name}` }}
-                        </QItem>
-                    </template>
-                </VnSelect>
+                    option-label="withholding"
+                />
 
                 <div class="row no-wrap">
                     <VnInput
@@ -253,15 +245,6 @@ function deleteFile(dmsFk) {
                     option-label="code"
                 />
             </VnRow>
-            <VnRow>
-                <VnSelect
-                    :label="t('invoiceIn.summary.sage')"
-                    v-model="data.withholdingSageFk"
-                    :options="sageWithholdings"
-                    option-value="id"
-                    option-label="withholding"
-                />
-            </VnRow>
         </template>
     </FormModel>
     <QDialog v-model="documentDialogRef.show">
@@ -313,7 +296,6 @@ function deleteFile(dmsFk) {
         supplierFk: Proveedor
         Expedition date: Fecha expedición
         Operation date: Fecha operación
-        Undeductible VAT: Iva no deducible
         Document: Documento
         Download file: Descargar archivo
         Entry date: Fecha asiento
diff --git a/src/pages/InvoiceIn/Card/InvoiceInSummary.vue b/src/pages/InvoiceIn/Card/InvoiceInSummary.vue
index d358601d3..f2393a56d 100644
--- a/src/pages/InvoiceIn/Card/InvoiceInSummary.vue
+++ b/src/pages/InvoiceIn/Card/InvoiceInSummary.vue
@@ -272,10 +272,6 @@ const getLink = (param) => `#/invoice-in/${entityId.value}/${param}`;
                     :label="t('invoiceIn.summary.sage')"
                     :value="entity.sageWithholding?.withholding"
                 />
-                <VnLv
-                    :label="t('invoiceIn.summary.vat')"
-                    :value="entity.expenseDeductible?.name"
-                />
                 <VnLv
                     :label="t('invoiceIn.card.company')"
                     :value="entity.company?.code"
diff --git a/src/pages/InvoiceIn/Card/InvoiceInVat.vue b/src/pages/InvoiceIn/Card/InvoiceInVat.vue
index e77453bc0..e3ed617c6 100644
--- a/src/pages/InvoiceIn/Card/InvoiceInVat.vue
+++ b/src/pages/InvoiceIn/Card/InvoiceInVat.vue
@@ -53,6 +53,13 @@ const columns = computed(() => [
         sortable: true,
         align: 'left',
     },
+    {
+        name: 'isDeductible',
+        label: t('Deductible'),
+        field: (row) => row.isDeductible,
+        model: 'isDeductible',
+        align: 'center',
+    },
     {
         name: 'sageiva',
         label: t('Sage iva'),
@@ -119,6 +126,7 @@ const filter = {
         'foreignValue',
         'taxTypeSageFk',
         'transactionTypeSageFk',
+        'isDeductible',
     ],
     where: {
         invoiceInFk: route.params.id,
@@ -227,6 +235,11 @@ function setCursor(ref) {
                         </VnSelectDialog>
                     </QTd>
                 </template>
+                <template #body-cell-isDeductible="{ row }">
+                    <QTd align="center">
+                        <QCheckbox v-model="row.isDeductible" />
+                    </QTd>
+                </template>
                 <template #body-cell-taxablebase="{ row }">
                     <QTd shrink>
                         <VnInputNumber
@@ -321,6 +334,7 @@ function setCursor(ref) {
                         </QTd>
                         <QTd />
                         <QTd />
+                        <QTd />
                         <QTd>
                             {{ toCurrency(taxRateTotal) }}
                         </QTd>
@@ -491,6 +505,7 @@ es:
     Create a new expense: Crear nuevo gasto
     Add tax: Crear gasto
     Taxable base: Base imp.
+    Deductible: Deducible
     Sage tax: Sage iva
     Sage transaction: Sage transacción
     Rate: Tasa

From 0e48701bc709fdb7a11ae34323ce429bef561330 Mon Sep 17 00:00:00 2001
From: benjaminedc <benjaminedc@verdnatura.es>
Date: Fri, 28 Feb 2025 11:36:24 +0100
Subject: [PATCH 02/59] feat: refs #8118 add VnDropdown component and integrate
 it into Claim and Ticket summaries

---
 src/components/common/VnDropdown.vue    | 60 +++++++++++++++++++++++++
 src/pages/Claim/Card/ClaimSummary.vue   | 49 +++++++-------------
 src/pages/Ticket/Card/TicketSummary.vue | 30 ++++---------
 3 files changed, 86 insertions(+), 53 deletions(-)
 create mode 100644 src/components/common/VnDropdown.vue

diff --git a/src/components/common/VnDropdown.vue b/src/components/common/VnDropdown.vue
new file mode 100644
index 000000000..63d6b96f6
--- /dev/null
+++ b/src/components/common/VnDropdown.vue
@@ -0,0 +1,60 @@
+<script setup>
+import { ref } from 'vue';
+import VnSelect from './VnSelect.vue';
+
+const stateBtnDropdownRef = ref();
+
+const emit = defineEmits(['changeState']);
+
+const $props = defineProps({
+    disable: {
+        type: Boolean,
+        default: null,
+    },
+    moduleName: {
+        type: String,
+        default: null,
+    },
+    options: {
+        type: Array,
+        default: null,
+    },
+});
+
+async function changeState(value) {
+    stateBtnDropdownRef.value?.hide();
+    emit('changeState', value);
+}
+</script>
+
+<template>
+    <QBtnDropdown
+        ref="stateBtnDropdownRef"
+        color="black"
+        text-color="white"
+        :label="$t('globals.changeState')"
+        :disable="$props.disable"
+    >
+        <VnSelect
+            :options="$props.options"
+            hide-selected
+            option-value="code"
+            hide-dropdown-icon
+            focus-on-mount
+            @update:model-value="changeState"
+        >
+            <template #option="scope">
+                <QItem v-bind="scope.itemProps">
+                    <QItemSection>
+                        <QItemLabel v-if="$props.moduleName === 'Ticket'">
+                            {{ scope.opt?.name }}
+                        </QItemLabel>
+                        <QItemLabel v-if="$props.moduleName === 'Claim'">
+                            {{ scope.opt?.description }}
+                        </QItemLabel>
+                    </QItemSection>
+                </QItem>
+            </template>
+        </VnSelect>
+    </QBtnDropdown>
+</template>
diff --git a/src/pages/Claim/Card/ClaimSummary.vue b/src/pages/Claim/Card/ClaimSummary.vue
index 210b0c982..b0476716b 100644
--- a/src/pages/Claim/Card/ClaimSummary.vue
+++ b/src/pages/Claim/Card/ClaimSummary.vue
@@ -1,6 +1,6 @@
 <script setup>
 import axios from 'axios';
-import { ref, computed } from 'vue';
+import { ref, computed, onMounted } from 'vue';
 import { useRoute, useRouter } from 'vue-router';
 import { useI18n } from 'vue-i18n';
 import { toDate, toCurrency } from 'src/filters';
@@ -20,6 +20,7 @@ import ItemDescriptorProxy from 'src/pages/Item/Card/ItemDescriptorProxy.vue';
 import CustomerDescriptorProxy from 'src/pages/Customer/Card/CustomerDescriptorProxy.vue';
 import WorkerDescriptorProxy from 'src/pages/Worker/Card/WorkerDescriptorProxy.vue';
 import ClaimDescriptorMenu from './ClaimDescriptorMenu.vue';
+import VnDropdown from 'src/components/common/VnDropdown.vue';
 
 const route = useRoute();
 const router = useRouter();
@@ -35,7 +36,7 @@ const $props = defineProps({
 });
 
 const entityId = computed(() => $props.id || route.params.id);
-const ClaimStates = ref([]);
+const claimStates = ref([]);
 const claimDmsRef = ref();
 const claimDms = ref([]);
 const multimediaDialog = ref();
@@ -172,13 +173,21 @@ function openDialog(dmsId) {
 }
 
 async function changeState(value) {
-    await axios.patch(`Claims/updateClaim/${entityId.value}`, { claimStateFk: value });
+    const newState = claimStates.value.find((state) => state.code == value);
+    await axios.patch(`Claims/updateClaim/${entityId.value}`, {
+        claimStateFk: newState.id,
+    });
     router.go(route.fullPath);
 }
 
 function claimUrl(section) {
     return '#/claim/' + entityId.value + '/' + section;
 }
+
+onMounted(async () => {
+    const { data } = await axios.get('ClaimStates');
+    claimStates.value = data;
+});
 </script>
 
 <template>
@@ -188,7 +197,6 @@ function claimUrl(section) {
         @on-fetch="(data) => setClaimDms(data)"
         ref="claimDmsRef"
     />
-    <FetchData url="ClaimStates" @on-fetch="(data) => (ClaimStates = data)" auto-load />
     <CardSummary
         ref="summary"
         :url="`Claims/${entityId}/getSummary`"
@@ -200,34 +208,11 @@ function claimUrl(section) {
             {{ claim.id }} - {{ claim.client.name }} ({{ claim.client.id }})
         </template>
         <template #header-right>
-            <QBtnDropdown
-                side
-                top
-                color="black"
-                text-color="white"
-                :label="t('globals.changeState')"
-            >
-                <QList>
-                    <QVirtualScroll
-                        class="max-container-height"
-                        :items="ClaimStates"
-                        separator
-                        v-slot="{ item, index }"
-                    >
-                        <QItem
-                            :key="index"
-                            dense
-                            clickable
-                            v-close-popup
-                            @click="changeState(item.id)"
-                        >
-                            <QItemSection>
-                                <QItemLabel>{{ item.description }}</QItemLabel>
-                            </QItemSection>
-                        </QItem>
-                    </QVirtualScroll>
-                </QList>
-            </QBtnDropdown>
+            <VnDropdown
+                :moduleName="route.meta.moduleName"
+                :options="claimStates"
+                @change-state="changeState($event)"
+            />
         </template>
         <template #menu="{ entity }">
             <ClaimDescriptorMenu :claim="entity.claim" />
diff --git a/src/pages/Ticket/Card/TicketSummary.vue b/src/pages/Ticket/Card/TicketSummary.vue
index 5838efa88..a575d66e7 100644
--- a/src/pages/Ticket/Card/TicketSummary.vue
+++ b/src/pages/Ticket/Card/TicketSummary.vue
@@ -21,6 +21,7 @@ import VnSelect from 'src/components/common/VnSelect.vue';
 import VnToSummary from 'src/components/ui/VnToSummary.vue';
 import TicketDescriptorMenu from './TicketDescriptorMenu.vue';
 import TicketProblems from 'src/components/TicketProblems.vue';
+import VnDropdown from 'src/components/common/VnDropdown.vue';
 
 const route = useRoute();
 const { notify } = useNotify();
@@ -40,7 +41,7 @@ const ticket = computed(() => summary.value?.entity);
 const editableStates = ref([]);
 const ticketUrl = ref();
 const grafanaUrl = 'https://grafana.verdnatura.es';
-const stateBtnDropdownRef = ref();
+
 const descriptorData = useArrayData('Ticket');
 
 onMounted(async () => {
@@ -67,7 +68,6 @@ function isEditable() {
 }
 
 async function changeState(value) {
-    stateBtnDropdownRef.value?.hide();
     const formData = {
         ticketFk: entityId.value,
         code: value,
@@ -113,25 +113,13 @@ onMounted(async () => {
             </div>
         </template>
         <template #header-right>
-            <div>
-                <QBtnDropdown
-                    ref="stateBtnDropdownRef"
-                    color="black"
-                    text-color="white"
-                    :label="t('globals.changeState')"
-                    :disable="!isEditable()"
-                >
-                    <VnSelect
-                        :options="editableStates"
-                        hide-selected
-                        option-label="name"
-                        option-value="code"
-                        hide-dropdown-icon
-                        focus-on-mount
-                        @update:model-value="changeState"
-                    />
-                </QBtnDropdown>
-            </div>
+            <VnDropdown
+                :moduleName="route.meta.moduleName"
+                :moduleId="entityId"
+                :options="editableStates"
+                :disable="!isEditable()"
+                @change-state="changeState($event)"
+            />
         </template>
         <template #menu="{ entity }">
             <TicketDescriptorMenu :ticket="entity" />

From 0bfb1344dc5f5d104bb5c9d6ac806c0ab8bb27b3 Mon Sep 17 00:00:00 2001
From: Jon <jon@verdnatura.es>
Date: Fri, 28 Feb 2025 12:03:23 +0100
Subject: [PATCH 03/59] feat: refs #8326 wip added new style

---
 src/components/ui/VnLv.vue                    |   3 +-
 src/css/app.scss                              |  23 ++
 src/pages/InvoiceIn/Card/InvoiceInSummary.vue | 205 ++++++++--------
 src/pages/Order/Card/OrderSummary.vue         | 114 ++++-----
 src/pages/Ticket/Card/TicketSummary.vue       | 224 +++++++++---------
 src/pages/Travel/Card/TravelSummary.vue       | 126 +++++-----
 src/pages/Worker/Card/WorkerSummary.vue       | 147 ++++++------
 src/pages/Zone/Card/ZoneSummary.vue           |  35 ++-
 8 files changed, 461 insertions(+), 416 deletions(-)

diff --git a/src/components/ui/VnLv.vue b/src/components/ui/VnLv.vue
index a198c9c05..93c2b9963 100644
--- a/src/components/ui/VnLv.vue
+++ b/src/components/ui/VnLv.vue
@@ -35,6 +35,7 @@ const val = computed(() => $props.value);
             :label="label"
             disable
             dense
+            size="sm"
         />
         <template v-else>
             <div v-if="label || $slots.label" class="label">
@@ -44,7 +45,7 @@ const val = computed(() => $props.value);
             </div>
             <div class="value">
                 <slot name="value">
-                    <span :title="value">
+                    <span :title="value" style="text-overflow: ellipsis">
                         {{ dash ? dashIfEmpty(value) : value }}
                     </span>
                 </slot>
diff --git a/src/css/app.scss b/src/css/app.scss
index 994ae7ff1..97097cebf 100644
--- a/src/css/app.scss
+++ b/src/css/app.scss
@@ -339,3 +339,26 @@ input::-webkit-inner-spin-button {
 .containerShrinked {
     width: 80%;
 }
+
+.vn-card-group {
+    display: flex;
+    flex-direction: column;
+}
+
+.vn-card-content {
+    display: flex;
+    flex-direction: column;
+    text-overflow: ellipsis;
+    > div {
+        max-height: 80px;
+    }
+}
+
+@media (min-width: 1010px) {
+    .vn-card-group {
+        flex-direction: row;
+    }
+    .vn-card-content {
+        flex: 1;
+    }
+}
diff --git a/src/pages/InvoiceIn/Card/InvoiceInSummary.vue b/src/pages/InvoiceIn/Card/InvoiceInSummary.vue
index d358601d3..3515e3bce 100644
--- a/src/pages/InvoiceIn/Card/InvoiceInSummary.vue
+++ b/src/pages/InvoiceIn/Card/InvoiceInSummary.vue
@@ -205,113 +205,106 @@ const getLink = (param) => `#/invoice-in/${entityId.value}/${param}`;
             <InvoiceInDescriptorMenu :invoice="entity" />
         </template>
         <template #body="{ entity }">
-            <!--Basic Data-->
-            <QCard class="vn-one">
-                <QCardSection class="q-pa-none">
-                    <VnTitle
-                        :url="getLink('basic-data')"
-                        :text="t('globals.pageTitles.basicData')"
-                    />
-                </QCardSection>
-                <VnLv
-                    :label="t('invoiceIn.list.supplier')"
-                    :value="entity.supplier?.name"
-                >
-                    <template #value>
-                        <span class="link">
-                            {{ entity.supplier?.name }}
-                            <SupplierDescriptorProxy :id="entity.supplierFk" />
-                        </span>
-                    </template>
-                </VnLv>
-                <VnLv :label="t('invoiceIn.supplierRef')" :value="entity.supplierRef" />
-                <VnLv
-                    :label="t('invoiceIn.summary.currency')"
-                    :value="entity.currency?.code"
+            <QCard class="max-width">
+                <VnTitle
+                    :url="getLink('basic-data')"
+                    :text="t('globals.pageTitles.basicData')"
                 />
-                <VnLv :label="t('invoiceIn.serial')" :value="`${entity.serial}`" />
-                <VnLv
-                    :label="t('globals.country')"
-                    :value="entity.supplier?.country?.code"
-                />
-            </QCard>
-            <QCard class="vn-one">
-                <QCardSection class="q-pa-none">
-                    <VnTitle
-                        :url="getLink('basic-data')"
-                        :text="t('globals.pageTitles.basicData')"
-                    />
-                </QCardSection>
-                <VnLv
-                    :ellipsis-value="false"
-                    :label="t('invoiceIn.summary.issued')"
-                    :value="toDate(entity.issued)"
-                />
-                <VnLv
-                    :label="t('invoiceIn.summary.operated')"
-                    :value="toDate(entity.operated)"
-                />
-                <VnLv
-                    :label="t('invoiceIn.summary.bookEntried')"
-                    :value="toDate(entity.bookEntried)"
-                />
-                <VnLv
-                    :label="t('invoiceIn.summary.bookedDate')"
-                    :value="toDate(entity.booked)"
-                />
-                <VnLv :label="t('globals.isVies')" :value="entity.supplier?.isVies" />
-            </QCard>
-            <QCard class="vn-one">
-                <QCardSection class="q-pa-none">
-                    <VnTitle
-                        :url="getLink('basic-data')"
-                        :text="t('globals.pageTitles.basicData')"
-                    />
-                </QCardSection>
-                <VnLv
-                    :label="t('invoiceIn.summary.sage')"
-                    :value="entity.sageWithholding?.withholding"
-                />
-                <VnLv
-                    :label="t('invoiceIn.summary.vat')"
-                    :value="entity.expenseDeductible?.name"
-                />
-                <VnLv
-                    :label="t('invoiceIn.card.company')"
-                    :value="entity.company?.code"
-                />
-                <VnLv :label="t('invoiceIn.isBooked')" :value="invoiceIn?.isBooked" />
-            </QCard>
-            <QCard class="vn-one">
-                <QCardSection class="q-pa-none">
-                    <VnTitle
-                        :url="getLink('basic-data')"
-                        :text="t('globals.pageTitles.basicData')"
-                    />
-                </QCardSection>
-                <QCardSection class="q-pa-none">
-                    <VnLv
-                        :label="t('invoiceIn.summary.taxableBase')"
-                        :value="toCurrency(entity.totals.totalTaxableBase)"
-                    />
-                    <VnLv label="Total" :value="toCurrency(entity.totals.totalVat)" />
-                    <VnLv :label="t('invoiceIn.summary.dueTotal')">
-                        <template #value>
-                            <QChip
-                                dense
-                                class="q-pa-xs"
-                                :color="amountsNotMatch ? 'negative' : 'transparent'"
-                                :title="
-                                    amountsNotMatch
-                                        ? t('invoiceIn.summary.noMatch')
-                                        : t('invoiceIn.summary.dueTotal')
-                                "
-                            >
-                                {{ toCurrency(entity.totals.totalDueDay) }}
-                            </QChip>
-                        </template>
-                    </VnLv>
-                </QCardSection>
+                <div class="vn-card-group">
+                    <div class="vn-card-content">
+                        <VnLv
+                            :label="t('invoiceIn.list.supplier')"
+                            :value="entity.supplier?.name"
+                        >
+                            <template #value>
+                                <span class="link">
+                                    {{ entity.supplier?.name }}
+                                    <SupplierDescriptorProxy :id="entity.supplierFk" />
+                                </span>
+                            </template>
+                        </VnLv>
+                        <VnLv
+                            :label="t('invoiceIn.supplierRef')"
+                            :value="entity.supplierRef"
+                        />
+                        <VnLv
+                            :label="t('invoiceIn.summary.currency')"
+                            :value="entity.currency?.code"
+                        />
+                        <VnLv
+                            :label="t('invoiceIn.serial')"
+                            :value="`${entity.serial}`"
+                        />
+                        <VnLv
+                            :label="t('globals.country')"
+                            :value="entity.supplier?.country?.code"
+                        />
+                    </div>
+                    <div class="vn-card-content">
+                        <VnLv
+                            :ellipsis-value="false"
+                            :label="t('invoiceIn.summary.issued')"
+                            :value="toDate(entity.issued)"
+                        />
+                        <VnLv
+                            :label="t('invoiceIn.summary.operated')"
+                            :value="toDate(entity.operated)"
+                        />
+                        <VnLv
+                            :label="t('invoiceIn.summary.bookEntried')"
+                            :value="toDate(entity.bookEntried)"
+                        />
+                        <VnLv
+                            :label="t('invoiceIn.summary.bookedDate')"
+                            :value="toDate(entity.booked)"
+                        />
+                        <VnLv
+                            :label="t('globals.isVies')"
+                            :value="entity.supplier?.isVies"
+                        />
+                    </div>
+                    <div class="vn-card-content">
+                        <VnLv
+                            :label="t('invoiceIn.summary.sage')"
+                            :value="entity.sageWithholding?.withholding"
+                        />
+                        <VnLv
+                            :label="t('invoiceIn.summary.vat')"
+                            :value="entity.expenseDeductible?.name"
+                        />
+                        <VnLv
+                            :label="t('invoiceIn.card.company')"
+                            :value="entity.company?.code"
+                        />
+                        <VnLv
+                            :label="t('invoiceIn.isBooked')"
+                            :value="invoiceIn?.isBooked"
+                        />
+                    </div>
+                    <div class="vn-card-content">
+                        <VnLv
+                            :label="t('invoiceIn.summary.taxableBase')"
+                            :value="toCurrency(entity.totals.totalTaxableBase)"
+                        />
+                        <VnLv label="Total" :value="toCurrency(entity.totals.totalVat)" />
+                        <VnLv :label="t('invoiceIn.summary.dueTotal')">
+                            <template #value>
+                                <QChip
+                                    dense
+                                    class="q-pa-xs"
+                                    :color="amountsNotMatch ? 'negative' : 'transparent'"
+                                    :title="
+                                        amountsNotMatch
+                                            ? t('invoiceIn.summary.noMatch')
+                                            : t('invoiceIn.summary.dueTotal')
+                                    "
+                                >
+                                    {{ toCurrency(entity.totals.totalDueDay) }}
+                                </QChip>
+                            </template>
+                        </VnLv>
+                    </div>
+                </div>
             </QCard>
             <!--Vat-->
             <QCard v-if="entity.invoiceInTax.length" class="vat">
diff --git a/src/pages/Order/Card/OrderSummary.vue b/src/pages/Order/Card/OrderSummary.vue
index a4bdb2881..55c309cf5 100644
--- a/src/pages/Order/Card/OrderSummary.vue
+++ b/src/pages/Order/Card/OrderSummary.vue
@@ -96,67 +96,67 @@ async function handleConfirm() {
                 <OrderDescriptorMenu :order="entity" />
             </template>
             <template #body="{ entity }">
-                <QCard class="vn-one">
+                <QCard class="vn-two">
                     <VnTitle
                         :url="`#/order/${entity.id}/basic-data`"
                         :text="t('globals.pageTitles.basicData')"
                     />
-                    <VnLv label="ID" :value="entity.id" />
-                    <VnLv :label="t('globals.alias')" dash>
-                        <template #value>
-                            <span class="link">
-                                {{ dashIfEmpty(entity?.address?.nickname) }}
-                                <CustomerDescriptorProxy :id="entity?.clientFk" />
-                            </span>
-                        </template>
-                    </VnLv>
-                    <VnLv
-                        :label="t('globals.company')"
-                        :value="entity?.address?.companyFk"
-                    />
-                    <VnLv
-                        :label="t('globals.confirmed')"
-                        :value="Boolean(entity?.isConfirmed)"
-                    />
-                </QCard>
-                <QCard class="vn-one">
-                    <VnTitle
-                        :url="`#/order/${entity.id}/basic-data`"
-                        :text="t('globals.pageTitles.basicData')"
-                    />
-                    <VnLv
-                        :label="t('order.summary.created')"
-                        :value="toDateHourMinSec(entity?.created)"
-                    />
-                    <VnLv
-                        :label="t('globals.confirmed')"
-                        :value="toDateHourMinSec(entity?.confirmed)"
-                    />
-                    <VnLv
-                        :label="t('globals.landed')"
-                        :value="toDateHourMinSec(entity?.landed)"
-                    />
-                    <VnLv :label="t('globals.phone')">
-                        <template #value>
-                            {{ dashIfEmpty(entity?.address?.phone) }}
-                            <a
-                                v-if="entity?.address?.phone"
-                                :href="`tel:${entity?.address?.phone}`"
-                                class="text-primary"
-                            >
-                                <QIcon name="phone" />
-                            </a>
-                        </template>
-                    </VnLv>
-                    <VnLv
-                        :label="t('order.summary.createdFrom')"
-                        :value="entity?.sourceApp"
-                    />
-                    <VnLv
-                        :label="t('order.summary.address')"
-                        :value="`${entity?.address?.street} - ${entity?.address?.city} (${entity?.address?.province?.name})`"
-                        class="order-summary-address"
-                    />
+                    <div class="vn-card-group">
+                        <div class="vn-card-content">
+                            <VnLv label="ID" :value="entity.id" />
+                            <VnLv :label="t('globals.alias')" dash>
+                                <template #value>
+                                    <span class="link">
+                                        {{ dashIfEmpty(entity?.address?.nickname) }}
+                                        <CustomerDescriptorProxy :id="entity?.clientFk" />
+                                    </span>
+                                </template>
+                            </VnLv>
+                            <VnLv
+                                :label="t('globals.company')"
+                                :value="entity?.address?.companyFk"
+                            />
+                            <VnLv
+                                :label="t('globals.confirmed')"
+                                :value="Boolean(entity?.isConfirmed)"
+                            />
+                        </div>
+                        <div class="vn-card-content">
+                            <VnLv
+                                :label="t('order.summary.created')"
+                                :value="toDateHourMinSec(entity?.created)"
+                            />
+                            <VnLv
+                                :label="t('globals.confirmed')"
+                                :value="toDateHourMinSec(entity?.confirmed)"
+                            />
+                            <VnLv
+                                :label="t('globals.landed')"
+                                :value="toDateHourMinSec(entity?.landed)"
+                            />
+                            <VnLv :label="t('globals.phone')">
+                                <template #value>
+                                    {{ dashIfEmpty(entity?.address?.phone) }}
+                                    <a
+                                        v-if="entity?.address?.phone"
+                                        :href="`tel:${entity?.address?.phone}`"
+                                        class="text-primary"
+                                    >
+                                        <QIcon name="phone" />
+                                    </a>
+                                </template>
+                            </VnLv>
+                            <VnLv
+                                :label="t('order.summary.createdFrom')"
+                                :value="entity?.sourceApp"
+                            />
+                            <VnLv
+                                :label="t('order.summary.address')"
+                                :value="`${entity?.address?.street} - ${entity?.address?.city} (${entity?.address?.province?.name})`"
+                                class="order-summary-address"
+                            />
+                        </div>
+                    </div>
                 </QCard>
                 <QCard class="vn-one">
                     <VnTitle :text="t('globals.pageTitles.notes')" />
diff --git a/src/pages/Ticket/Card/TicketSummary.vue b/src/pages/Ticket/Card/TicketSummary.vue
index 5838efa88..52454ccf1 100644
--- a/src/pages/Ticket/Card/TicketSummary.vue
+++ b/src/pages/Ticket/Card/TicketSummary.vue
@@ -137,118 +137,130 @@ onMounted(async () => {
             <TicketDescriptorMenu :ticket="entity" />
         </template>
         <template #body="{ entity }">
-            <QCard class="vn-one">
+            <QCard class="vn-two">
                 <VnTitle
                     :url="toTicketUrl('basic-data')"
                     :text="t('globals.summary.basicData')"
                 />
-                <VnLv v-if="entity.ticketState" :label="t('globals.state')">
-                    <template #value>
-                        <QBadge
-                            text-color="black"
-                            :color="entity.ticketState.state.classColor"
-                        >
-                            {{ entity.ticketState.state.name }}
-                        </QBadge>
-                    </template>
-                </VnLv>
-                <VnLv :label="t('globals.salesPerson')">
-                    <template #value>
-                        <VnUserLink
-                            :name="entity.client?.salesPersonUser?.name"
-                            :worker-id="entity.client?.salesPersonFk"
+                <div class="vn-card-group">
+                    <div class="vn-card-content">
+                        <VnLv v-if="entity.ticketState" :label="t('globals.state')">
+                            <template #value>
+                                <QBadge
+                                    text-color="black"
+                                    :color="entity.ticketState.state.classColor"
+                                >
+                                    {{ entity.ticketState.state.name }}
+                                </QBadge>
+                            </template>
+                        </VnLv>
+                        <VnLv :label="t('globals.salesPerson')">
+                            <template #value>
+                                <VnUserLink
+                                    :name="entity.client?.salesPersonUser?.name"
+                                    :worker-id="entity.client?.salesPersonFk"
+                                />
+                            </template>
+                        </VnLv>
+                        <VnLv
+                            :label="t('globals.agency')"
+                            :value="entity.agencyMode?.name"
                         />
-                    </template>
-                </VnLv>
-                <VnLv :label="t('globals.agency')" :value="entity.agencyMode?.name" />
-                <VnLv :label="t('ticket.summary.zone')">
-                    <template #value>
-                        <span class="link" @click.stop>
-                            {{ entity?.zone?.name }}
-                            <ZoneDescriptorProxy :id="entity.zoneFk" />
-                        </span>
-                    </template>
-                </VnLv>
-                <VnLv :label="t('globals.warehouse')" :value="entity.warehouse?.name" />
-                <VnLv
-                    v-if="ticket?.ticketCollections?.length > 0"
-                    :label="t('ticket.summary.collection')"
-                    :value="ticket?.ticketCollections[0]?.collectionFk"
-                >
-                    <template #value>
-                        <a
-                            :href="`${grafanaUrl}/d/d552ab74-85b4-4e7f-a279-fab7cd9c6124/control-de-expediciones?orgId=1&var-collectionFk=${entity.ticketCollections[0]?.collectionFk}`"
-                            target="_blank"
-                            class="grafana"
+                        <VnLv :label="t('ticket.summary.zone')">
+                            <template #value>
+                                <span class="link" @click.stop>
+                                    {{ entity?.zone?.name }}
+                                    <ZoneDescriptorProxy :id="entity.zoneFk" />
+                                </span>
+                            </template>
+                        </VnLv>
+                        <VnLv
+                            :label="t('globals.warehouse')"
+                            :value="entity.warehouse?.name"
+                        />
+                        <VnLv
+                            v-if="ticket?.ticketCollections?.length > 0"
+                            :label="t('ticket.summary.collection')"
+                            :value="ticket?.ticketCollections[0]?.collectionFk"
                         >
-                            {{ entity.ticketCollections[0]?.collectionFk }}
-                        </a>
-                    </template>
-                </VnLv>
-                <VnLv :label="t('ticket.summary.route')">
-                    <template #value>
-                        <span class="link">
-                            {{ entity.routeFk }}
-                            <RouteDescriptorProxy :id="entity.routeFk" />
-                        </span>
-                    </template>
-                </VnLv>
-                <VnLv :label="t('ticket.summary.invoice')">
-                    <template #value>
-                        <span :class="{ link: entity.refFk }">
-                            {{ dashIfEmpty(entity.refFk) }}
-                            <InvoiceOutDescriptorProxy
-                                :id="entity.invoiceOut.id"
-                                v-if="entity.refFk"
-                            />
-                        </span>
-                    </template>
-                </VnLv>
-                <VnLv :label="t('globals.weight')" :value="dashIfEmpty(entity.weight)" />
-            </QCard>
-            <QCard class="vn-one">
-                <VnTitle
-                    :url="toTicketUrl('basic-data')"
-                    :text="t('globals.summary.basicData')"
-                />
-                <VnLv
-                    :label="t('ticket.summary.shipped')"
-                    :value="toDate(entity.shipped)"
-                />
-                <VnLv :label="t('globals.landed')" :value="toDate(entity.landed)" />
-                <VnLv :label="t('globals.packages')" :value="entity.packages" />
-                <VnLv :value="entity.address.phone">
-                    <template #label>
-                        {{ t('ticket.summary.consigneePhone') }}
-                        <VnLinkPhone :phone-number="entity.address.phone" />
-                    </template>
-                </VnLv>
-                <VnLv :value="entity.address.mobile">
-                    <template #label>
-                        {{ t('ticket.summary.consigneeMobile') }}
-                        <VnLinkPhone :phone-number="entity.address.mobile" />
-                    </template>
-                </VnLv>
-                <VnLv :value="entity.client.phone">
-                    <template #label>
-                        {{ t('ticket.summary.clientPhone') }}
-                        <VnLinkPhone :phone-number="entity.client.phone" />
-                    </template>
-                </VnLv>
-                <VnLv :value="entity.client.mobile">
-                    <template #label>
-                        {{ t('ticket.summary.clientMobile') }}
-                        <VnLinkPhone :phone-number="entity.client.mobile" />
-                    </template>
-                </VnLv>
-                <VnLv
-                    :label="t('ticket.summary.consignee')"
-                    :value="`${entity.address?.nickname} #${entity.address?.id}`"
-                />
-                <VnLv
-                    :label="t('ticket.summary.consigneeStreet')"
-                    :value="formattedAddress"
-                />
+                            <template #value>
+                                <a
+                                    :href="`${grafanaUrl}/d/d552ab74-85b4-4e7f-a279-fab7cd9c6124/control-de-expediciones?orgId=1&var-collectionFk=${entity.ticketCollections[0]?.collectionFk}`"
+                                    target="_blank"
+                                    class="grafana"
+                                >
+                                    {{ entity.ticketCollections[0]?.collectionFk }}
+                                </a>
+                            </template>
+                        </VnLv>
+                        <VnLv :label="t('ticket.summary.route')">
+                            <template #value>
+                                <span class="link">
+                                    {{ entity.routeFk }}
+                                    <RouteDescriptorProxy :id="entity.routeFk" />
+                                </span>
+                            </template>
+                        </VnLv>
+                        <VnLv :label="t('ticket.summary.invoice')">
+                            <template #value>
+                                <span :class="{ link: entity.refFk }">
+                                    {{ dashIfEmpty(entity.refFk) }}
+                                    <InvoiceOutDescriptorProxy
+                                        :id="entity.invoiceOut.id"
+                                        v-if="entity.refFk"
+                                    />
+                                </span>
+                            </template>
+                        </VnLv>
+                        <VnLv
+                            :label="t('globals.weight')"
+                            :value="dashIfEmpty(entity.weight)"
+                        />
+                    </div>
+                    <div class="vn-card-content">
+                        <VnLv
+                            :label="t('ticket.summary.shipped')"
+                            :value="toDate(entity.shipped)"
+                        />
+                        <VnLv
+                            :label="t('globals.landed')"
+                            :value="toDate(entity.landed)"
+                        />
+                        <VnLv :label="t('globals.packages')" :value="entity.packages" />
+                        <VnLv :value="entity.address.phone">
+                            <template #label>
+                                {{ t('ticket.summary.consigneePhone') }}
+                                <VnLinkPhone :phone-number="entity.address.phone" />
+                            </template>
+                        </VnLv>
+                        <VnLv :value="entity.address.mobile">
+                            <template #label>
+                                {{ t('ticket.summary.consigneeMobile') }}
+                                <VnLinkPhone :phone-number="entity.address.mobile" />
+                            </template>
+                        </VnLv>
+                        <VnLv :value="entity.client.phone">
+                            <template #label>
+                                {{ t('ticket.summary.clientPhone') }}
+                                <VnLinkPhone :phone-number="entity.client.phone" />
+                            </template>
+                        </VnLv>
+                        <VnLv :value="entity.client.mobile">
+                            <template #label>
+                                {{ t('ticket.summary.clientMobile') }}
+                                <VnLinkPhone :phone-number="entity.client.mobile" />
+                            </template>
+                        </VnLv>
+                        <VnLv
+                            :label="t('ticket.summary.consignee')"
+                            :value="`${entity.address?.nickname} #${entity.address?.id}`"
+                        />
+                        <VnLv
+                            :label="t('ticket.summary.consigneeStreet')"
+                            :value="formattedAddress"
+                        />
+                    </div>
+                </div>
             </QCard>
             <QCard class="vn-one" v-if="entity.notes.length">
                 <VnTitle
diff --git a/src/pages/Travel/Card/TravelSummary.vue b/src/pages/Travel/Card/TravelSummary.vue
index 9f9552611..68af36474 100644
--- a/src/pages/Travel/Card/TravelSummary.vue
+++ b/src/pages/Travel/Card/TravelSummary.vue
@@ -275,72 +275,68 @@ const getLink = (param) => `#/travel/${entityId.value}/${param}`;
             <TravelDescriptorMenuItems :travel="entity" />
         </template>
         <template #body>
-            <QCard class="vn-one">
-                <QCardSection class="q-pa-none">
-                    <VnTitle
-                        :url="getLink('basic-data')"
-                        :text="t('globals.pageTitles.basicData')"
-                    />
-                </QCardSection>
-                <VnLv :label="t('globals.shipped')" :value="toDate(travel.shipped)" />
-                <VnLv
-                    :label="t('globals.warehouseOut')"
-                    :value="travel.warehouseOut?.name"
-                />
-                <VnRow>
-                    <QCheckbox
-                        :label="t('travel.basicData.isRaid')"
-                        v-model="travel.isRaid"
-                        :disable="true"
-                    />
-                </VnRow>
-                <VnRow>
-                    <QCheckbox
-                        :label="t('travel.summary.delivered')"
-                        v-model="travel.isDelivered"
-                        :disable="true"
-                    />
-                </VnRow>
-            </QCard>
-            <QCard class="vn-one">
-                <QCardSection class="q-pa-none">
-                    <VnTitle
-                        :url="getLink('basic-data')"
-                        :text="t('globals.pageTitles.basicData')"
-                    />
-                </QCardSection>
-                <VnLv :label="t('globals.landed')" :value="toDate(travel.landed)" />
-                <VnLv
-                    :label="t('globals.warehouseIn')"
-                    :value="travel.warehouseIn?.name"
-                />
-                <VnLv
-                    :label="t('travel.basicData.daysInForward')"
-                    :value="travel?.daysInForward"
-                />
-                <QCheckbox
-                    :label="t('travel.summary.received')"
-                    v-model="travel.isReceived"
-                    :disable="true"
-                />
-            </QCard>
-            <QCard class="vn-one">
-                <QCardSection class="q-pa-none">
-                    <VnTitle
-                        :url="getLink('basic-data')"
-                        :text="t('globals.pageTitles.basicData')"
-                    />
-                </QCardSection>
-                <VnLv :label="t('globals.agency')" :value="travel.agency?.name" />
-                <VnLv :label="t('globals.reference')" :value="travel.ref" />
-                <VnLv label="m³" :value="travel.m3" />
-                <VnLv :label="t('globals.totalEntries')" :value="travel.totalEntries" />
-                <VnLv
-                    :label="t('travel.summary.availabled')"
-                    :value="
-                        dashIfEmpty(toDateTimeFormat(travel.availabled))
-                    "
+            <QCard class="full-width">
+                <VnTitle
+                    :url="getLink('basic-data')"
+                    :text="t('globals.pageTitles.basicData')"
                 />
+                <div class="vn-card-group">
+                    <div class="vn-card-content">
+                        <VnLv
+                            :label="t('globals.shipped')"
+                            :value="toDate(travel.shipped)"
+                        />
+                        <VnLv
+                            :label="t('globals.warehouseOut')"
+                            :value="travel.warehouseOut?.name"
+                        />
+                        <QCheckbox
+                            :label="t('travel.basicData.isRaid')"
+                            v-model="travel.isRaid"
+                            :disable="true"
+                            size="sm"
+                        />
+                        <QCheckbox
+                            :label="t('travel.summary.delivered')"
+                            v-model="travel.isDelivered"
+                            :disable="true"
+                            size="sm"
+                        />
+                    </div>
+                    <div class="vn-card-content">
+                        <VnLv
+                            :label="t('globals.landed')"
+                            :value="toDate(travel.landed)"
+                        />
+                        <VnLv
+                            :label="t('globals.warehouseIn')"
+                            :value="travel.warehouseIn?.name"
+                        />
+                        <VnLv
+                            :label="t('travel.basicData.daysInForward')"
+                            :value="travel?.daysInForward"
+                        />
+                        <QCheckbox
+                            :label="t('travel.summary.received')"
+                            v-model="travel.isReceived"
+                            :disable="true"
+                            size="sm"
+                        />
+                    </div>
+                    <div class="vn-card-content">
+                        <VnLv :label="t('globals.agency')" :value="travel.agency?.name" />
+                        <VnLv :label="t('globals.reference')" :value="travel.ref" />
+                        <VnLv label="m³" :value="travel.m3" />
+                        <VnLv
+                            :label="t('globals.totalEntries')"
+                            :value="travel.totalEntries"
+                        />
+                        <VnLv
+                            :label="t('travel.summary.availabled')"
+                            :value="dashIfEmpty(toDateTimeFormat(travel.availabled))"
+                        />
+                    </div>
+                </div>
             </QCard>
             <QCard class="full-width">
                 <VnTitle :text="t('travel.summary.entries')" />
diff --git a/src/pages/Worker/Card/WorkerSummary.vue b/src/pages/Worker/Card/WorkerSummary.vue
index 78c5dfd82..1f7584389 100644
--- a/src/pages/Worker/Card/WorkerSummary.vue
+++ b/src/pages/Worker/Card/WorkerSummary.vue
@@ -47,77 +47,88 @@ onBeforeMount(async () => {
             <WorkerDescriptorMenu :worker="entity" :is-excluded="workerExcluded" />
         </template>
         <template #body="{ entity: worker }">
-            <QCard class="vn-one">
+            <QCard class="vn-two">
                 <VnTitle :url="basicDataUrl" :text="t('globals.summary.basicData')" />
-                <VnLv :label="t('globals.name')" :value="worker.user?.nickname" />
-                <VnLv :label="t('worker.list.department')">
-                    <template #value>
-                        <span class="link" v-text="worker.department?.department?.name" />
-                        <DepartmentDescriptorProxy
-                            :id="worker.department?.department?.id"
+                <div class="vn-card-group">
+                    <div class="vn-card-content">
+                        <VnLv :label="t('globals.name')" :value="worker.user?.nickname" />
+                        <VnLv :label="t('worker.list.department')">
+                            <template #value>
+                                <span
+                                    class="link"
+                                    v-text="worker.department?.department?.name"
+                                />
+                                <DepartmentDescriptorProxy
+                                    :id="worker.department?.department?.id"
+                                />
+                            </template>
+                        </VnLv>
+                        <VnLv :label="t('worker.summary.boss')" link>
+                            <template #value>
+                                <VnUserLink
+                                    v-if="worker.boss"
+                                    :name="dashIfEmpty(worker.boss?.name)"
+                                    :worker-id="worker.bossFk"
+                                />
+                            </template>
+                        </VnLv>
+                        <VnLv :value="worker.mobileExtension">
+                            <template #label>
+                                {{ t('worker.summary.phoneExtension') }}
+                                <VnLinkPhone :phone-number="worker.mobileExtension" />
+                            </template>
+                        </VnLv>
+                        <VnLv :value="worker.phone">
+                            <template #label>
+                                {{ t('worker.summary.entPhone') }}
+                                <VnLinkPhone :phone-number="worker.phone" />
+                            </template>
+                        </VnLv>
+                        <VnLv :value="advancedSummary?.client?.phone">
+                            <template #label>
+                                {{ t('worker.summary.personalPhone') }}
+                                <VnLinkPhone
+                                    :phone-number="advancedSummary?.client?.phone"
+                                />
+                            </template>
+                        </VnLv>
+                    </div>
+                    <div class="vn-card-content">
+                        <VnLv
+                            :label="t('worker.summary.fiDueDate')"
+                            :value="toDate(advancedSummary.fiDueDate)"
                         />
-                    </template>
-                </VnLv>
-                <VnLv :label="t('worker.summary.boss')" link>
-                    <template #value>
-                        <VnUserLink
-                            v-if="worker.boss"
-                            :name="dashIfEmpty(worker.boss?.name)"
-                            :worker-id="worker.bossFk"
+                        <VnLv :label="t('worker.summary.sex')" :value="worker.sex" />
+                        <VnLv
+                            :label="t('worker.summary.seniority')"
+                            :value="toDate(advancedSummary.seniority)"
                         />
-                    </template>
-                </VnLv>
-                <VnLv :value="worker.mobileExtension">
-                    <template #label>
-                        {{ t('worker.summary.phoneExtension') }}
-                        <VnLinkPhone :phone-number="worker.mobileExtension" />
-                    </template>
-                </VnLv>
-                <VnLv :value="worker.phone">
-                    <template #label>
-                        {{ t('worker.summary.entPhone') }}
-                        <VnLinkPhone :phone-number="worker.phone" />
-                    </template>
-                </VnLv>
-                <VnLv :value="advancedSummary?.client?.phone">
-                    <template #label>
-                        {{ t('worker.summary.personalPhone') }}
-                        <VnLinkPhone :phone-number="advancedSummary?.client?.phone" />
-                    </template>
-                </VnLv>
-            </QCard>
-            <QCard class="vn-one" v-if="advancedSummary">
-                <VnTitle :url="basicDataUrl" :text="t('globals.summary.basicData')" />
-                <VnLv
-                    :label="t('worker.summary.fiDueDate')"
-                    :value="toDate(advancedSummary.fiDueDate)"
-                />
-                <VnLv :label="t('worker.summary.sex')" :value="worker.sex" />
-                <VnLv
-                    :label="t('worker.summary.seniority')"
-                    :value="toDate(advancedSummary.seniority)"
-                />
-                <VnLv :label="t('worker.summary.fi')" :value="advancedSummary.fi" />
-                <VnLv
-                    :label="t('worker.summary.birth')"
-                    :value="toDate(advancedSummary.birth)"
-                />
-                <VnLv
-                    :label="t('worker.summary.isFreelance')"
-                    :value="advancedSummary.isFreelance"
-                />
-                <VnLv
-                    :label="t('worker.summary.isSsDiscounted')"
-                    :value="advancedSummary.isSsDiscounted"
-                />
-                <VnLv
-                    :label="t('worker.summary.hasMachineryAuthorized')"
-                    :value="advancedSummary.hasMachineryAuthorized"
-                />
-                <VnLv
-                    :label="t('worker.summary.isDisable')"
-                    :value="advancedSummary.isDisable"
-                />
+                        <VnLv
+                            :label="t('worker.summary.fi')"
+                            :value="advancedSummary.fi"
+                        />
+                        <VnLv
+                            :label="t('worker.summary.birth')"
+                            :value="toDate(advancedSummary.birth)"
+                        />
+                        <VnLv
+                            :label="t('worker.summary.isFreelance')"
+                            :value="advancedSummary.isFreelance"
+                        />
+                        <VnLv
+                            :label="t('worker.summary.isSsDiscounted')"
+                            :value="advancedSummary.isSsDiscounted"
+                        />
+                        <VnLv
+                            :label="t('worker.summary.hasMachineryAuthorized')"
+                            :value="advancedSummary.hasMachineryAuthorized"
+                        />
+                        <VnLv
+                            :label="t('worker.summary.isDisable')"
+                            :value="advancedSummary.isDisable"
+                        />
+                    </div>
+                </div>
             </QCard>
             <QCard class="vn-one">
                 <VnTitle :text="t('worker.summary.userData')" />
diff --git a/src/pages/Zone/Card/ZoneSummary.vue b/src/pages/Zone/Card/ZoneSummary.vue
index 5b29b495b..04ba14ce4 100644
--- a/src/pages/Zone/Card/ZoneSummary.vue
+++ b/src/pages/Zone/Card/ZoneSummary.vue
@@ -74,21 +74,30 @@ onMounted(async () => {
         <template #body="{ entity: zone }">
             <QCard class="vn-one">
                 <VnTitle :url="zoneUrl + `basic-data`" :text="t('summary.basicData')" />
-                <VnLv :label="t('list.agency')" :value="zone.agencyMode?.name" />
-                <VnLv :label="t('list.price')" :value="toCurrency(zone.price)" />
-                <VnLv :label="t('zone.bonus')" :value="toCurrency(zone.bonus)" />
+                <div class="vn-card-group">
+                    <div class="vn-card-content">
+                        <VnLv :label="t('list.agency')" :value="zone.agencyMode?.name" />
+                        <VnLv :label="t('list.price')" :value="toCurrency(zone.price)" />
+                        <VnLv :label="t('zone.bonus')" :value="toCurrency(zone.bonus)" />
+                    </div>
+                    <div class="vn-card-content">
+                        <VnLv
+                            :label="t('summary.closeHour')"
+                            :value="toTimeFormat(zone.hour)"
+                        />
+                        <VnLv
+                            :label="t('zone.travelingDays')"
+                            :value="zone.travelingDays"
+                        />
+                        <QCheckbox
+                            :label="t('zone.volumetric')"
+                            v-model="zone.isVolumetric"
+                            :disable="true"
+                        />
+                    </div>
+                </div>
             </QCard>
             <QCard class="vn-one">
-                <VnTitle :url="zoneUrl + `basic-data`" :text="t('summary.basicData')" />
-                <VnLv :label="t('summary.closeHour')" :value="toTimeFormat(zone.hour)" />
-                <VnLv :label="t('zone.travelingDays')" :value="zone.travelingDays" />
-                <QCheckbox
-                    :label="t('zone.volumetric')"
-                    v-model="zone.isVolumetric"
-                    :disable="true"
-                />
-            </QCard>
-            <QCard class="full-width">
                 <VnTitle :url="zoneUrl + `warehouses`" :text="t('list.warehouse')" />
                 <QTable
                     :columns="columns"

From a07afe3a94bc7e1911576a1fc6f2ce2bf7cdc4c6 Mon Sep 17 00:00:00 2001
From: benjaminedc <benjaminedc@verdnatura.es>
Date: Fri, 28 Feb 2025 13:44:14 +0100
Subject: [PATCH 04/59] refactor: refs #8683 enhance sorting logic in VnSelect
 component

---
 src/components/common/VnSelect.vue | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/src/components/common/VnSelect.vue b/src/components/common/VnSelect.vue
index d111780bd..eb387fe61 100644
--- a/src/components/common/VnSelect.vue
+++ b/src/components/common/VnSelect.vue
@@ -152,6 +152,10 @@ const value = computed({
     },
 });
 
+const computedSortBy = computed(() => {
+    return $props.sortBy || $props.optionLabel;
+});
+
 watch(options, (newValue) => {
     setOptions(newValue);
 });
@@ -186,7 +190,7 @@ function findKeyInOptions() {
 }
 
 function setOptions(data) {
-    data = dataByOrder(data, $props.sortBy);
+    data = dataByOrder(data, computedSortBy.value);
     myOptions.value = JSON.parse(JSON.stringify(data));
     myOptionsOriginal.value = JSON.parse(JSON.stringify(data));
     emit('update:options', data);

From 816a6197c72bd11b3e44a10d700569738491e937 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Carlos=20Andr=C3=A9s?= <carlosap@verdnatura.es>
Date: Mon, 3 Mar 2025 18:05:19 +0100
Subject: [PATCH 05/59] feat: refs #8529 enhance InvoiceInVat component with
 data-cy attribute for isDeductible checkbox

---
 src/pages/InvoiceIn/Card/InvoiceInVat.vue           |  5 ++++-
 .../invoiceIn/invoiceInBasicData.spec.js            |  6 +-----
 .../invoiceIn/invoiceInDescriptor.spec.js           |  4 ++--
 .../integration/invoiceIn/invoiceInVat.spec.js      | 13 ++++++++++++-
 4 files changed, 19 insertions(+), 9 deletions(-)

diff --git a/src/pages/InvoiceIn/Card/InvoiceInVat.vue b/src/pages/InvoiceIn/Card/InvoiceInVat.vue
index 0f8f9a6c5..7077c9a59 100644
--- a/src/pages/InvoiceIn/Card/InvoiceInVat.vue
+++ b/src/pages/InvoiceIn/Card/InvoiceInVat.vue
@@ -237,7 +237,10 @@ function setCursor(ref) {
                 </template>
                 <template #body-cell-isDeductible="{ row }">
                     <QTd align="center">
-                        <QCheckbox v-model="row.isDeductible" />
+                        <QCheckbox
+                            v-model="row.isDeductible"
+                            data-cy="isDeductible_checkbox"
+                        />
                     </QTd>
                 </template>
                 <template #body-cell-taxablebase="{ row }">
diff --git a/test/cypress/integration/invoiceIn/invoiceInBasicData.spec.js b/test/cypress/integration/invoiceIn/invoiceInBasicData.spec.js
index 11ca1bb59..5b6836784 100644
--- a/test/cypress/integration/invoiceIn/invoiceInBasicData.spec.js
+++ b/test/cypress/integration/invoiceIn/invoiceInBasicData.spec.js
@@ -11,13 +11,9 @@ describe('InvoiceInBasicData', () => {
     });
 
     it('should edit the provideer and supplier ref', () => {
-        cy.dataCy('UnDeductibleVatSelect').type('4751000000');
-        cy.get('.q-menu .q-item').contains('4751000000').click();
-        cy.get(resetBtn).click();
-
         cy.waitForElement('#formModel').within(() => {
             cy.dataCy('vnSupplierSelect').type('Bros nick');
-        })
+        });
         cy.get('.q-menu .q-item').contains('Bros nick').click();
         cy.saveCard();
         cy.get(`${firstFormSelect} input`).invoke('val').should('eq', 'Bros nick');
diff --git a/test/cypress/integration/invoiceIn/invoiceInDescriptor.spec.js b/test/cypress/integration/invoiceIn/invoiceInDescriptor.spec.js
index 97a9fe976..fed90c517 100644
--- a/test/cypress/integration/invoiceIn/invoiceInDescriptor.spec.js
+++ b/test/cypress/integration/invoiceIn/invoiceInDescriptor.spec.js
@@ -1,7 +1,7 @@
 describe('InvoiceInDescriptor', () => {
     const book = '.summaryHeader > .no-wrap > .q-btn';
-    const firstDescritorOpt = '.q-menu > .q-list > :nth-child(5) > .q-item__section';
-    const checkbox = ':nth-child(5) > .q-checkbox';
+    const firstDescritorOpt = '.q-menu > .q-list > :nth-child(4) > .q-item__section';
+    const checkbox = ':nth-child(4) > .q-checkbox';
 
     it('should booking and unbooking the invoice properly', () => {
         cy.viewport(1280, 720);
diff --git a/test/cypress/integration/invoiceIn/invoiceInVat.spec.js b/test/cypress/integration/invoiceIn/invoiceInVat.spec.js
index 1e7ce1003..2693ac410 100644
--- a/test/cypress/integration/invoiceIn/invoiceInVat.spec.js
+++ b/test/cypress/integration/invoiceIn/invoiceInVat.spec.js
@@ -1,7 +1,7 @@
 /// <reference types="cypress" />
 describe('InvoiceInVat', () => {
     const thirdRow = 'tbody > :nth-child(3)';
-    const firstLineVat = 'tbody > :nth-child(1) > :nth-child(4)';
+    const firstLineVat = 'tbody > :nth-child(1) ';
     const vats = '[data-cy="vat-sageiva"]';
     const dialogInputs = '.q-dialog label input';
     const addBtn = 'tbody tr:nth-child(1) td:nth-child(2) .--add-icon';
@@ -20,6 +20,17 @@ describe('InvoiceInVat', () => {
         cy.get(vats).eq(0).should('have.value', '8: H.P. IVA 21% CEE');
     });
 
+    it('should mark the line as deductible VAT', () => {
+        cy.get(`${firstLineVat}  [data-cy="isDeductible_checkbox"]`).click();
+
+        cy.saveCard();
+
+        cy.get(`${firstLineVat}  [data-cy="isDeductible_checkbox"]`)
+
+            .click();
+        cy.saveCard();
+    });
+
     it('should add a new row', () => {
         cy.addRow();
         cy.fillRow(thirdRow, [true, 2000000001, 30, 'H.P. IVA 10']);

From d893505cd6bd660813ac867db0db61f9ac9f79a1 Mon Sep 17 00:00:00 2001
From: benjaminedc <benjaminedc@verdnatura.es>
Date: Fri, 7 Mar 2025 09:14:18 +0100
Subject: [PATCH 06/59] fix: refs #8683 update fetchFilter to use computed
 sortBy value

---
 src/components/common/VnSelect.vue | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/components/common/VnSelect.vue b/src/components/common/VnSelect.vue
index 37bb55ca4..9405baa4f 100644
--- a/src/components/common/VnSelect.vue
+++ b/src/components/common/VnSelect.vue
@@ -220,7 +220,8 @@ function filter(val, options) {
 async function fetchFilter(val) {
     if (!$props.url) return;
 
-    const { fields, include, sortBy, limit } = $props;
+    const { fields, include, limit } = $props;
+    const sortBy = computedSortBy.value;
     const key =
         optionFilterValue.value ??
         (new RegExp(/\d/g).test(val)

From 68af7a50fa7410cedb20b67b14e4faa21b7b5498 Mon Sep 17 00:00:00 2001
From: benjaminedc <benjaminedc@verdnatura.es>
Date: Fri, 7 Mar 2025 11:59:22 +0100
Subject: [PATCH 07/59] fix: refs #8683 update computedSortBy to append ' ASC'
 to optionLabel

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

diff --git a/src/components/common/VnSelect.vue b/src/components/common/VnSelect.vue
index 9405baa4f..296a212e7 100644
--- a/src/components/common/VnSelect.vue
+++ b/src/components/common/VnSelect.vue
@@ -153,7 +153,7 @@ const value = computed({
 });
 
 const computedSortBy = computed(() => {
-    return $props.sortBy || $props.optionLabel;
+    return $props.sortBy || $props.optionLabel + ' ASC';
 });
 
 watch(options, (newValue) => {

From 37f1882530043f0ddcdb4a73ad3e9facf2ef5c03 Mon Sep 17 00:00:00 2001
From: benjaminedc <benjaminedc@verdnatura.es>
Date: Mon, 10 Mar 2025 13:55:36 +0100
Subject: [PATCH 08/59] test(UserPanel): refs #8683 update initial values and
 options in user selection

---
 test/cypress/integration/vnComponent/UserPanel.spec.js | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/test/cypress/integration/vnComponent/UserPanel.spec.js b/test/cypress/integration/vnComponent/UserPanel.spec.js
index 25724e873..216797dfa 100644
--- a/test/cypress/integration/vnComponent/UserPanel.spec.js
+++ b/test/cypress/integration/vnComponent/UserPanel.spec.js
@@ -15,7 +15,7 @@ describe('UserPanel', () => {
         cy.openUserPanel();
 
         // Compruebo la opcion inicial
-        cy.get(userWarehouse).should('have.value', 'VNL').click();
+        cy.get(userWarehouse).should('have.value', 'ORN').click();
 
         // Actualizo la opción
         cy.getOption(3);
@@ -36,14 +36,14 @@ describe('UserPanel', () => {
         cy.openUserPanel();
 
         // Compruebo la opcion inicial
-        cy.get(userCompany).should('have.value', 'Warehouse One').click();
+        cy.get(userCompany).should('have.value', 'Inventory').click();
 
         //Actualizo la opción
-        cy.getOption(2);
+        cy.getOption(3);
 
         //Compruebo la notificación
         cy.get('.q-notification').should('be.visible');
-        cy.get(userCompany).should('have.value', 'Warehouse Two');
+        cy.get(userCompany).should('have.value', 'TestingWarehouse');
 
         //Restauro el valor
         cy.get(userCompany).click();

From 6a48ff93269fee8d7da4f557cf2399514035aea3 Mon Sep 17 00:00:00 2001
From: benjaminedc <benjaminedc@verdnatura.es>
Date: Mon, 10 Mar 2025 14:14:22 +0100
Subject: [PATCH 09/59] test(UserPanel): refs #8683 update initial value in
 user selection

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

diff --git a/test/cypress/integration/vnComponent/UserPanel.spec.js b/test/cypress/integration/vnComponent/UserPanel.spec.js
index 216797dfa..ec6774f58 100644
--- a/test/cypress/integration/vnComponent/UserPanel.spec.js
+++ b/test/cypress/integration/vnComponent/UserPanel.spec.js
@@ -36,7 +36,7 @@ describe('UserPanel', () => {
         cy.openUserPanel();
 
         // Compruebo la opcion inicial
-        cy.get(userCompany).should('have.value', 'Inventory').click();
+        cy.get(userCompany).should('have.value', 'Algemesi').click();
 
         //Actualizo la opción
         cy.getOption(3);

From 781c8050a88d7a757db7492e7419d1739e98baa6 Mon Sep 17 00:00:00 2001
From: Jon <jon@verdnatura.es>
Date: Tue, 11 Mar 2025 11:56:50 +0100
Subject: [PATCH 10/59] refactor: refs #8326 modified sumaryDialog width

---
 src/pages/InvoiceIn/InvoiceInList.vue   |   2 +-
 src/pages/Order/Card/OrderSummary.vue   | 338 ++++++++++++------------
 src/pages/Order/OrderList.vue           |   2 +-
 src/pages/Ticket/TicketList.vue         |   2 +-
 src/pages/Travel/Card/TravelSummary.vue |  18 +-
 src/pages/Travel/TravelList.vue         |   2 +-
 src/pages/Worker/WorkerList.vue         |   2 +-
 7 files changed, 179 insertions(+), 187 deletions(-)

diff --git a/src/pages/InvoiceIn/InvoiceInList.vue b/src/pages/InvoiceIn/InvoiceInList.vue
index 0960d0d6c..9b62fdf6a 100644
--- a/src/pages/InvoiceIn/InvoiceInList.vue
+++ b/src/pages/InvoiceIn/InvoiceInList.vue
@@ -119,7 +119,7 @@ const cols = computed(() => [
                 icon: 'preview',
                 type: 'submit',
                 isPrimary: true,
-                action: (row) => viewSummary(row.id, InvoiceInSummary),
+                action: (row) => viewSummary(row.id, InvoiceInSummary, 'lg-width'),
             },
             {
                 title: t('globals.download'),
diff --git a/src/pages/Order/Card/OrderSummary.vue b/src/pages/Order/Card/OrderSummary.vue
index 55c309cf5..10a458bfb 100644
--- a/src/pages/Order/Card/OrderSummary.vue
+++ b/src/pages/Order/Card/OrderSummary.vue
@@ -71,180 +71,174 @@ async function handleConfirm() {
 </script>
 
 <template>
-    <div class="q-pa-md">
-        <CardSummary
-            ref="summary"
-            :url="`Orders/${entityId}/summary`"
-            data-key="OrderSummary"
-        >
-            <template #header="{ entity }">
-                {{ t('order.summary.basket') }} #{{ entity?.id }} -
-                {{ entity?.client?.name }} ({{ entity?.clientFk }})
-            </template>
-            <template #header-right>
-                <QBtn
-                    flat
-                    text-color="white"
-                    :disabled="isConfirmed"
-                    :label="t('order.summary.confirm')"
-                    @click="handleConfirm()"
-                >
-                    <QTooltip>{{ t('order.summary.confirmLines') }}</QTooltip>
-                </QBtn>
-            </template>
-            <template #menu="{ entity }">
-                <OrderDescriptorMenu :order="entity" />
-            </template>
-            <template #body="{ entity }">
-                <QCard class="vn-two">
-                    <VnTitle
-                        :url="`#/order/${entity.id}/basic-data`"
-                        :text="t('globals.pageTitles.basicData')"
-                    />
-                    <div class="vn-card-group">
-                        <div class="vn-card-content">
-                            <VnLv label="ID" :value="entity.id" />
-                            <VnLv :label="t('globals.alias')" dash>
-                                <template #value>
-                                    <span class="link">
-                                        {{ dashIfEmpty(entity?.address?.nickname) }}
-                                        <CustomerDescriptorProxy :id="entity?.clientFk" />
-                                    </span>
-                                </template>
-                            </VnLv>
-                            <VnLv
-                                :label="t('globals.company')"
-                                :value="entity?.address?.companyFk"
-                            />
-                            <VnLv
-                                :label="t('globals.confirmed')"
-                                :value="Boolean(entity?.isConfirmed)"
-                            />
-                        </div>
-                        <div class="vn-card-content">
-                            <VnLv
-                                :label="t('order.summary.created')"
-                                :value="toDateHourMinSec(entity?.created)"
-                            />
-                            <VnLv
-                                :label="t('globals.confirmed')"
-                                :value="toDateHourMinSec(entity?.confirmed)"
-                            />
-                            <VnLv
-                                :label="t('globals.landed')"
-                                :value="toDateHourMinSec(entity?.landed)"
-                            />
-                            <VnLv :label="t('globals.phone')">
-                                <template #value>
-                                    {{ dashIfEmpty(entity?.address?.phone) }}
-                                    <a
-                                        v-if="entity?.address?.phone"
-                                        :href="`tel:${entity?.address?.phone}`"
-                                        class="text-primary"
-                                    >
-                                        <QIcon name="phone" />
-                                    </a>
-                                </template>
-                            </VnLv>
-                            <VnLv
-                                :label="t('order.summary.createdFrom')"
-                                :value="entity?.sourceApp"
-                            />
-                            <VnLv
-                                :label="t('order.summary.address')"
-                                :value="`${entity?.address?.street} - ${entity?.address?.city} (${entity?.address?.province?.name})`"
-                                class="order-summary-address"
-                            />
-                        </div>
+    <CardSummary
+        ref="summary"
+        :url="`Orders/${entityId}/summary`"
+        data-key="OrderSummary"
+    >
+        <template #header="{ entity }">
+            {{ t('order.summary.basket') }} #{{ entity?.id }} -
+            {{ entity?.client?.name }} ({{ entity?.clientFk }})
+        </template>
+        <template #header-right>
+            <QBtn
+                flat
+                text-color="white"
+                :disabled="isConfirmed"
+                :label="t('order.summary.confirm')"
+                @click="handleConfirm()"
+            >
+                <QTooltip>{{ t('order.summary.confirmLines') }}</QTooltip>
+            </QBtn>
+        </template>
+        <template #menu="{ entity }">
+            <OrderDescriptorMenu :order="entity" />
+        </template>
+        <template #body="{ entity }">
+            <QCard class="vn-two">
+                <VnTitle
+                    :url="`#/order/${entity.id}/basic-data`"
+                    :text="t('globals.pageTitles.basicData')"
+                />
+                <div class="vn-card-group">
+                    <div class="vn-card-content">
+                        <VnLv label="ID" :value="entity.id" />
+                        <VnLv :label="t('globals.alias')" dash>
+                            <template #value>
+                                <span class="link">
+                                    {{ dashIfEmpty(entity?.address?.nickname) }}
+                                    <CustomerDescriptorProxy :id="entity?.clientFk" />
+                                </span>
+                            </template>
+                        </VnLv>
+                        <VnLv
+                            :label="t('globals.company')"
+                            :value="entity?.address?.companyFk"
+                        />
+                        <VnLv
+                            :label="t('globals.confirmed')"
+                            :value="Boolean(entity?.isConfirmed)"
+                        />
                     </div>
-                </QCard>
-                <QCard class="vn-one">
-                    <VnTitle :text="t('globals.pageTitles.notes')" />
-                    <p v-if="entity?.note" class="no-margin">
-                        {{ entity?.note }}
-                    </p>
-                </QCard>
-                <QCard class="vn-one">
-                    <VnTitle :text="t('order.summary.total')" />
-                    <VnLv>
-                        <template #label>
-                            <span class="text-h6">{{ t('globals.subtotal') }}</span>
-                        </template>
-                        <template #value>
-                            <span class="text-h6">{{
-                                toCurrency(entity?.subTotal)
-                            }}</span>
-                        </template>
-                    </VnLv>
-                    <VnLv>
-                        <template #label>
-                            <span class="text-h6">{{ t('globals.vat') }}</span>
-                        </template>
-                        <template #value>
-                            <span class="text-h6">{{ toCurrency(entity?.VAT) }}</span>
-                        </template>
-                    </VnLv>
-                    <VnLv>
-                        <template #label>
-                            <span class="text-h6">{{ t('order.summary.total') }}</span>
-                        </template>
-                        <template #value>
-                            <span class="text-h6">{{ toCurrency(entity?.total) }}</span>
-                        </template>
-                    </VnLv>
-                </QCard>
-                <QCard>
-                    <VnTitle :text="t('globals.details')" />
-                    <QTable :columns="detailsColumns" :rows="entity?.rows" flat>
-                        <template #header="props">
-                            <QTr :props="props">
-                                <QTh auto-width>{{ t('globals.item') }}</QTh>
-                                <QTh>{{ t('globals.description') }}</QTh>
-                                <QTh auto-width>{{ t('globals.quantity') }}</QTh>
-                                <QTh auto-width>{{ t('globals.price') }}</QTh>
-                                <QTh auto-width>{{ t('order.summary.amount') }}</QTh>
-                            </QTr>
-                        </template>
-                        <template #body="props">
-                            <QTr :props="props">
-                                <QTd key="item" :props="props" class="item">
-                                    <span class="link">
-                                        {{ props.row.item?.id }}
-                                        <ItemDescriptorProxy :id="props.row.item?.id" />
-                                    </span>
-                                </QTd>
-                                <QTd key="description" :props="props">
-                                    <div class="description">
-                                        <div class="name">
-                                            {{ props.row.item.name }}
-                                            <span
-                                                v-if="props.row.item.subName"
-                                                class="subName"
-                                            >
-                                                {{ props.row.item.subName }}
-                                            </span>
-                                        </div>
+                    <div class="vn-card-content">
+                        <VnLv
+                            :label="t('order.summary.created')"
+                            :value="toDateHourMinSec(entity?.created)"
+                        />
+                        <VnLv
+                            :label="t('globals.confirmed')"
+                            :value="toDateHourMinSec(entity?.confirmed)"
+                        />
+                        <VnLv
+                            :label="t('globals.landed')"
+                            :value="toDateHourMinSec(entity?.landed)"
+                        />
+                        <VnLv :label="t('globals.phone')">
+                            <template #value>
+                                {{ dashIfEmpty(entity?.address?.phone) }}
+                                <a
+                                    v-if="entity?.address?.phone"
+                                    :href="`tel:${entity?.address?.phone}`"
+                                    class="text-primary"
+                                >
+                                    <QIcon name="phone" />
+                                </a>
+                            </template>
+                        </VnLv>
+                        <VnLv
+                            :label="t('order.summary.createdFrom')"
+                            :value="entity?.sourceApp"
+                        />
+                        <VnLv
+                            :label="t('order.summary.address')"
+                            :value="`${entity?.address?.street} - ${entity?.address?.city} (${entity?.address?.province?.name})`"
+                            class="order-summary-address"
+                        />
+                    </div>
+                </div>
+            </QCard>
+            <QCard class="vn-one">
+                <VnTitle :text="t('globals.pageTitles.notes')" />
+                <p v-if="entity?.note" class="no-margin">
+                    {{ entity?.note }}
+                </p>
+            </QCard>
+            <QCard class="vn-one">
+                <VnTitle :text="t('order.summary.total')" />
+                <VnLv>
+                    <template #label>
+                        <span class="text-h6">{{ t('globals.subtotal') }}</span>
+                    </template>
+                    <template #value>
+                        <span class="text-h6">{{ toCurrency(entity?.subTotal) }}</span>
+                    </template>
+                </VnLv>
+                <VnLv>
+                    <template #label>
+                        <span class="text-h6">{{ t('globals.vat') }}</span>
+                    </template>
+                    <template #value>
+                        <span class="text-h6">{{ toCurrency(entity?.VAT) }}</span>
+                    </template>
+                </VnLv>
+                <VnLv>
+                    <template #label>
+                        <span class="text-h6">{{ t('order.summary.total') }}</span>
+                    </template>
+                    <template #value>
+                        <span class="text-h6">{{ toCurrency(entity?.total) }}</span>
+                    </template>
+                </VnLv>
+            </QCard>
+            <QCard>
+                <VnTitle :text="t('globals.details')" />
+                <QTable :columns="detailsColumns" :rows="entity?.rows" flat>
+                    <template #header="props">
+                        <QTr :props="props">
+                            <QTh auto-width>{{ t('globals.item') }}</QTh>
+                            <QTh>{{ t('globals.description') }}</QTh>
+                            <QTh auto-width>{{ t('globals.quantity') }}</QTh>
+                            <QTh auto-width>{{ t('globals.price') }}</QTh>
+                            <QTh auto-width>{{ t('order.summary.amount') }}</QTh>
+                        </QTr>
+                    </template>
+                    <template #body="props">
+                        <QTr :props="props">
+                            <QTd key="item" :props="props" class="item">
+                                <span class="link">
+                                    {{ props.row.item?.id }}
+                                    <ItemDescriptorProxy :id="props.row.item?.id" />
+                                </span>
+                            </QTd>
+                            <QTd key="description" :props="props">
+                                <div class="description">
+                                    <div class="name">
+                                        {{ props.row.item.name }}
+                                        <span
+                                            v-if="props.row.item.subName"
+                                            class="subName"
+                                        >
+                                            {{ props.row.item.subName }}
+                                        </span>
                                     </div>
-                                    <FetchedTags :item="props.row.item" :columns="3" />
-                                </QTd>
-                                <QTd key="quantity" :props="props">
-                                    {{ props.row.quantity }}
-                                </QTd>
-                                <QTd key="price" :props="props">
-                                    {{ toCurrency(props.row.price) }}
-                                </QTd>
-                                <QTd key="amount" :props="props">
-                                    {{
-                                        toCurrency(props.row?.quantity * props.row?.price)
-                                    }}
-                                </QTd>
-                            </QTr>
-                        </template>
-                    </QTable>
-                </QCard>
-            </template>
-        </CardSummary>
-    </div>
+                                </div>
+                                <FetchedTags :item="props.row.item" :columns="3" />
+                            </QTd>
+                            <QTd key="quantity" :props="props">
+                                {{ props.row.quantity }}
+                            </QTd>
+                            <QTd key="price" :props="props">
+                                {{ toCurrency(props.row.price) }}
+                            </QTd>
+                            <QTd key="amount" :props="props">
+                                {{ toCurrency(props.row?.quantity * props.row?.price) }}
+                            </QTd>
+                        </QTr>
+                    </template>
+                </QTable>
+            </QCard>
+        </template>
+    </CardSummary>
 </template>
 <style lang="scss">
 .cardSummary .summaryBody .vn-label-value.order-summary-address {
diff --git a/src/pages/Order/OrderList.vue b/src/pages/Order/OrderList.vue
index 2a1997f21..42f90c33a 100644
--- a/src/pages/Order/OrderList.vue
+++ b/src/pages/Order/OrderList.vue
@@ -147,7 +147,7 @@ const columns = computed(() => [
             {
                 title: t('globals.pageTitles.summary'),
                 icon: 'preview',
-                action: (row) => viewSummary(row.id, OrderSummary),
+                action: (row) => viewSummary(row.id, OrderSummary, 'lg-width'),
                 isPrimary: true,
             },
         ],
diff --git a/src/pages/Ticket/TicketList.vue b/src/pages/Ticket/TicketList.vue
index dfaabc848..fa4e3c89f 100644
--- a/src/pages/Ticket/TicketList.vue
+++ b/src/pages/Ticket/TicketList.vue
@@ -253,7 +253,7 @@ const columns = computed(() => [
                             name: 'TicketCard',
                         }).href;
                         window.open(url, '_blank');
-                    } else viewSummary(row.id, TicketSummary);
+                    } else viewSummary(row.id, TicketSummary, 'lg-width');
                 },
             },
         ],
diff --git a/src/pages/Travel/Card/TravelSummary.vue b/src/pages/Travel/Card/TravelSummary.vue
index 68af36474..af6db6304 100644
--- a/src/pages/Travel/Card/TravelSummary.vue
+++ b/src/pages/Travel/Card/TravelSummary.vue
@@ -1,5 +1,5 @@
 <script setup>
-import { ref, computed } from 'vue';
+import { ref, computed, onMounted } from 'vue';
 import { useRoute } from 'vue-router';
 import { useI18n } from 'vue-i18n';
 
@@ -7,8 +7,6 @@ import CardSummary from 'components/ui/CardSummary.vue';
 import VnLv from 'src/components/ui/VnLv.vue';
 import VnTitle from 'src/components/common/VnTitle.vue';
 import EntryDescriptorProxy from 'src/pages/Entry/Card/EntryDescriptorProxy.vue';
-import FetchData from 'src/components/FetchData.vue';
-import VnRow from 'components/ui/VnRow.vue';
 import { toDate, toCurrency, toCelsius } from 'src/filters';
 import { toDateTimeFormat } from 'src/filters/date.js';
 import { dashIfEmpty } from 'src/filters';
@@ -252,16 +250,16 @@ async function setTravelData(travelData) {
 }
 
 const getLink = (param) => `#/travel/${entityId.value}/${param}`;
+
+onMounted(async () => {
+    const { data } = await axios.get('Warehouses', {
+        params: { fields: ['id', 'name'] },
+    });
+    warehouses.value = data;
+});
 </script>
 
 <template>
-    <FetchData
-        url="Warehouses"
-        :filter="{ fields: ['id', 'name'] }"
-        order="name"
-        @on-fetch="(data) => (warehouses = data)"
-        auto-load
-    />
     <CardSummary
         ref="summaryRef"
         :url="`Travels/${entityId}/getTravel`"
diff --git a/src/pages/Travel/TravelList.vue b/src/pages/Travel/TravelList.vue
index b227afcb2..32ddc639a 100644
--- a/src/pages/Travel/TravelList.vue
+++ b/src/pages/Travel/TravelList.vue
@@ -201,7 +201,7 @@ const columns = computed(() => [
             {
                 title: t('components.smartCard.viewSummary'),
                 icon: 'preview',
-                action: (row) => viewSummary(row.id, TravelSummary),
+                action: (row) => viewSummary(row.id, TravelSummary, 'lg-width'),
                 isPrimary: true,
             },
         ],
diff --git a/src/pages/Worker/WorkerList.vue b/src/pages/Worker/WorkerList.vue
index b76790075..cb722a139 100644
--- a/src/pages/Worker/WorkerList.vue
+++ b/src/pages/Worker/WorkerList.vue
@@ -105,7 +105,7 @@ const columns = computed(() => [
             {
                 title: t('components.smartCard.viewSummary'),
                 icon: 'preview',
-                action: (row) => viewSummary(row.id, WorkerSummary),
+                action: (row) => viewSummary(row.id, WorkerSummary, 'lg-width'),
                 isPrimary: true,
             },
         ],

From d82369a62cd726d2d9b54254fb48cada64e28c8a Mon Sep 17 00:00:00 2001
From: benjaminedc <benjaminedc@verdnatura.es>
Date: Tue, 11 Mar 2025 13:10:13 +0100
Subject: [PATCH 11/59] fix(UserPanel): refs #8683 update initial values for
 user warehouse and company selections

---
 test/cypress/integration/vnComponent/UserPanel.spec.js | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/test/cypress/integration/vnComponent/UserPanel.spec.js b/test/cypress/integration/vnComponent/UserPanel.spec.js
index ec6774f58..8722fe37e 100644
--- a/test/cypress/integration/vnComponent/UserPanel.spec.js
+++ b/test/cypress/integration/vnComponent/UserPanel.spec.js
@@ -15,7 +15,7 @@ describe('UserPanel', () => {
         cy.openUserPanel();
 
         // Compruebo la opcion inicial
-        cy.get(userWarehouse).should('have.value', 'ORN').click();
+        cy.get(userWarehouse).should('have.value', 'VNL').click();
 
         // Actualizo la opción
         cy.getOption(3);
@@ -36,7 +36,7 @@ describe('UserPanel', () => {
         cy.openUserPanel();
 
         // Compruebo la opcion inicial
-        cy.get(userCompany).should('have.value', 'Algemesi').click();
+        cy.get(userCompany).should('have.value', 'Warehouse One').click();
 
         //Actualizo la opción
         cy.getOption(3);

From 13cf7c6031bd093cc5962b8507201b020bc7489f Mon Sep 17 00:00:00 2001
From: benjaminedc <benjaminedc@verdnatura.es>
Date: Tue, 11 Mar 2025 13:17:36 +0100
Subject: [PATCH 12/59] fix(VnLog): refs #8683 update validation content for
 entity filter test

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

diff --git a/test/cypress/integration/vnComponent/VnLog.spec.js b/test/cypress/integration/vnComponent/VnLog.spec.js
index 80b9d07df..782fb9fbe 100644
--- a/test/cypress/integration/vnComponent/VnLog.spec.js
+++ b/test/cypress/integration/vnComponent/VnLog.spec.js
@@ -20,6 +20,6 @@ describe('VnLog', () => {
     it('should filter by entity', () => {
         cy.selectOption('.q-drawer--right .q-item > .q-select', 'Claim');
         cy.get('.q-page').click();
-        cy.validateContent(chips[0], 'Claim');
+        cy.validateContent(chips[0], 'Beginning');
     });
 });

From df3bbfe5e4f2937b095e80fa065d0046d9eb0ac7 Mon Sep 17 00:00:00 2001
From: jorgep <jorgep@verdnatura.es>
Date: Tue, 11 Mar 2025 13:41:52 +0100
Subject: [PATCH 13/59] fix: refs #8388 update file attachment logic and
 redirect after invoice creation

---
 src/components/common/VnDms.vue       | 4 +++-
 src/pages/InvoiceIn/InvoiceInList.vue | 2 +-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/src/components/common/VnDms.vue b/src/components/common/VnDms.vue
index 35308c2c4..03f85f855 100644
--- a/src/components/common/VnDms.vue
+++ b/src/components/common/VnDms.vue
@@ -46,9 +46,11 @@ const dms = ref({});
 
 onMounted(() => {
     defaultData();
-    if (!$props.formInitialData)
+    if (!$props.formInitialData) {
         dms.value.description =
             $props.description ?? t($props.model + 'Description', dms.value);
+        dms.value.hasFile = false;
+    }
 });
 function onFileChange(files) {
     dms.value.hasFileAttached = !!files;
diff --git a/src/pages/InvoiceIn/InvoiceInList.vue b/src/pages/InvoiceIn/InvoiceInList.vue
index 0960d0d6c..8dbee6501 100644
--- a/src/pages/InvoiceIn/InvoiceInList.vue
+++ b/src/pages/InvoiceIn/InvoiceInList.vue
@@ -156,7 +156,7 @@ const cols = computed(() => [
                 :create="{
                     urlCreate: 'InvoiceIns',
                     title: t('globals.createInvoiceIn'),
-                    onDataSaved: ({ id }) => tableRef.redirect(id),
+                    onDataSaved: ({ id }) => tableRef.redirect(`${id}/basic-data`),
                     formInitialData: { companyFk: user.companyFk, issued: Date.vnNew() },
                 }"
                 redirect="invoice-in"

From bce7e2ad565f31d4f3f374d4fe082186f25c43f8 Mon Sep 17 00:00:00 2001
From: benjaminedc <benjaminedc@verdnatura.es>
Date: Thu, 13 Mar 2025 08:06:39 +0100
Subject: [PATCH 14/59] feat: refs #8118 enhance VnDropdown component; simplify
 usage in Claim and Ticket summaries

---
 src/components/common/VnDropdown.vue    | 22 ++++++++++++----------
 src/pages/Claim/Card/ClaimSummary.vue   |  9 ++-------
 src/pages/Ticket/Card/TicketSummary.vue |  1 -
 3 files changed, 14 insertions(+), 18 deletions(-)

diff --git a/src/components/common/VnDropdown.vue b/src/components/common/VnDropdown.vue
index 63d6b96f6..75b6878a0 100644
--- a/src/components/common/VnDropdown.vue
+++ b/src/components/common/VnDropdown.vue
@@ -11,14 +11,18 @@ const $props = defineProps({
         type: Boolean,
         default: null,
     },
-    moduleName: {
-        type: String,
-        default: null,
-    },
     options: {
         type: Array,
         default: null,
     },
+    optionLabel: {
+        type: String,
+        default: 'name',
+    },
+    optionValue: {
+        type: String,
+        default: 'id',
+    },
 });
 
 async function changeState(value) {
@@ -37,8 +41,9 @@ async function changeState(value) {
     >
         <VnSelect
             :options="$props.options"
+            :option-label="$props.optionLabel"
+            :option-value="$props.optionValue"
             hide-selected
-            option-value="code"
             hide-dropdown-icon
             focus-on-mount
             @update:model-value="changeState"
@@ -46,11 +51,8 @@ async function changeState(value) {
             <template #option="scope">
                 <QItem v-bind="scope.itemProps">
                     <QItemSection>
-                        <QItemLabel v-if="$props.moduleName === 'Ticket'">
-                            {{ scope.opt?.name }}
-                        </QItemLabel>
-                        <QItemLabel v-if="$props.moduleName === 'Claim'">
-                            {{ scope.opt?.description }}
+                        <QItemLabel>
+                            {{ scope.opt?.name || scope.opt?.description }}
                         </QItemLabel>
                     </QItemSection>
                 </QItem>
diff --git a/src/pages/Claim/Card/ClaimSummary.vue b/src/pages/Claim/Card/ClaimSummary.vue
index 23a9f1073..25910cfc0 100644
--- a/src/pages/Claim/Card/ClaimSummary.vue
+++ b/src/pages/Claim/Card/ClaimSummary.vue
@@ -173,9 +173,8 @@ function openDialog(dmsId) {
 }
 
 async function changeState(value) {
-    const newState = claimStates.value.find((state) => state.code == value);
     await axios.patch(`Claims/updateClaim/${entityId.value}`, {
-        claimStateFk: newState.id,
+        claimStateFk: value,
     });
     router.go(route.fullPath);
 }
@@ -208,11 +207,7 @@ onMounted(async () => {
             {{ claim.id }} - {{ claim.client.name }} ({{ claim.client.id }})
         </template>
         <template #header-right>
-            <VnDropdown
-                :moduleName="route.meta.moduleName"
-                :options="claimStates"
-                @change-state="changeState($event)"
-            />
+            <VnDropdown :options="claimStates" @change-state="changeState($event)" />
         </template>
         <template #menu="{ entity }">
             <ClaimDescriptorMenu :claim="entity.claim" />
diff --git a/src/pages/Ticket/Card/TicketSummary.vue b/src/pages/Ticket/Card/TicketSummary.vue
index a575d66e7..907276849 100644
--- a/src/pages/Ticket/Card/TicketSummary.vue
+++ b/src/pages/Ticket/Card/TicketSummary.vue
@@ -114,7 +114,6 @@ onMounted(async () => {
         </template>
         <template #header-right>
             <VnDropdown
-                :moduleName="route.meta.moduleName"
                 :moduleId="entityId"
                 :options="editableStates"
                 :disable="!isEditable()"

From 96b02a3b223591ad98226291d4101b37368bdc1a Mon Sep 17 00:00:00 2001
From: benjaminedc <benjaminedc@verdnatura.es>
Date: Thu, 13 Mar 2025 13:10:55 +0100
Subject: [PATCH 15/59] fix: refs #8118 correct spelling in success message for
 work center removal

---
 test/cypress/integration/route/agency/agencyWorkCenter.spec.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/test/cypress/integration/route/agency/agencyWorkCenter.spec.js b/test/cypress/integration/route/agency/agencyWorkCenter.spec.js
index a3e0aac81..79dcd6f70 100644
--- a/test/cypress/integration/route/agency/agencyWorkCenter.spec.js
+++ b/test/cypress/integration/route/agency/agencyWorkCenter.spec.js
@@ -9,7 +9,7 @@ describe('AgencyWorkCenter', () => {
     const messages = {
         dataCreated: 'Data created',
         alreadyAssigned: 'This workCenter is already assigned to this agency',
-        removed: 'WorkCenter removed successfully',
+        removed: 'Work center removed successfully',
     };
 
     beforeEach(() => {

From 01d1ca83ea12fcb02fd00496438694ee1fcb5d61 Mon Sep 17 00:00:00 2001
From: jorgep <jorgep@verdnatura.es>
Date: Mon, 17 Mar 2025 13:25:40 +0100
Subject: [PATCH 16/59] fix: refs #8388 improve error handling and notification
 for invoice booking

---
 src/pages/InvoiceIn/InvoiceInToBook.vue | 13 ++++++-------
 1 file changed, 6 insertions(+), 7 deletions(-)

diff --git a/src/pages/InvoiceIn/InvoiceInToBook.vue b/src/pages/InvoiceIn/InvoiceInToBook.vue
index 5bdbe197b..7bb465d70 100644
--- a/src/pages/InvoiceIn/InvoiceInToBook.vue
+++ b/src/pages/InvoiceIn/InvoiceInToBook.vue
@@ -56,22 +56,21 @@ async function checkToBook(id) {
             componentProps: {
                 title: t('Are you sure you want to book this invoice?'),
                 message: messages.reduce((acc, msg) => `${acc}<p>${msg}</p>`, ''),
+                promise: () => toBook(id),
             },
-        }).onOk(() => toBook(id));
+        });
 }
 
 async function toBook(id) {
-    let type = 'positive';
-    let message = t('globals.dataSaved');
-
+    let err;
     try {
         await axios.post(`InvoiceIns/${id}/toBook`);
         store.data.isBooked = true;
     } catch (e) {
-        type = 'negative';
-        message = t('It was not able to book the invoice');
+        err = true;
+        throw e;
     } finally {
-        notify({ type, message });
+        if (!err) notify({ type: 'positive', message: t('globals.dataSaved') });
     }
 }
 </script>

From 6546d06f60d62356e86c50d9386a30756b49bab2 Mon Sep 17 00:00:00 2001
From: jorgep <jorgep@verdnatura.es>
Date: Tue, 18 Mar 2025 12:04:54 +0100
Subject: [PATCH 17/59] refactor: refs #8388 update UI feedback

---
 src/pages/InvoiceIn/Card/InvoiceInDueDay.vue | 36 +++++++++++++++-----
 src/pages/InvoiceIn/locale/en.yml            |  1 +
 src/pages/InvoiceIn/locale/es.yml            |  2 ++
 3 files changed, 31 insertions(+), 8 deletions(-)

diff --git a/src/pages/InvoiceIn/Card/InvoiceInDueDay.vue b/src/pages/InvoiceIn/Card/InvoiceInDueDay.vue
index 20cc1cc71..59bebcae2 100644
--- a/src/pages/InvoiceIn/Card/InvoiceInDueDay.vue
+++ b/src/pages/InvoiceIn/Card/InvoiceInDueDay.vue
@@ -25,7 +25,8 @@ const invoiceInFormRef = ref();
 const invoiceId = +route.params.id;
 const filter = { where: { invoiceInFk: invoiceId } };
 const areRows = ref(false);
-const totals = ref();
+const totalTaxableBase = ref();
+const noMatch = computed(() => totalAmount.value != totalTaxableBase.value);
 const columns = computed(() => [
     {
         name: 'duedate',
@@ -74,9 +75,12 @@ async function insert() {
     notify(t('globals.dataSaved'), 'positive');
 }
 
-onBeforeMount(async () => {
-    totals.value = (await axios.get(`InvoiceIns/${invoiceId}/getTotals`)).data;
-});
+async function setTaxableBase() {
+    const { data } = await axios.get(`InvoiceIns/${invoiceId}/getTotals`);
+    totalTaxableBase.value = data.totalTaxableBase;
+}
+
+onBeforeMount(async () => await setTaxableBase());
 </script>
 <template>
     <CrudModel
@@ -89,13 +93,14 @@ onBeforeMount(async () => {
         :data-required="{ invoiceInFk: invoiceId }"
         v-model:selected="rowsSelected"
         @on-fetch="(data) => (areRows = !!data.length)"
+        @save-changes="setTaxableBase"
     >
         <template #body="{ rows }">
             <QTable
                 v-model:selected="rowsSelected"
                 selection="multiple"
-                :columns="columns"
-                :rows="rows"
+                :columns
+                :rows
                 row-key="$index"
                 :grid="$q.screen.lt.sm"
             >
@@ -151,7 +156,18 @@ onBeforeMount(async () => {
                         <QTd />
                         <QTd />
                         <QTd>
-                            {{ toCurrency(totalAmount) }}
+                            <QChip
+                                dense
+                                :color="noMatch ? 'negative' : 'transparent'"
+                                class="q-pa-xs"
+                                :title="
+                                    noMatch
+                                        ? t('invoiceIn.noMatch', { totalTaxableBase })
+                                        : ''
+                                "
+                            >
+                                {{ toCurrency(totalAmount) }}
+                            </QChip>
                         </QTd>
                         <QTd>
                             <template v-if="isNotEuro(invoiceIn.currency.code)">
@@ -237,7 +253,7 @@ onBeforeMount(async () => {
                     if (!areRows) insert();
                     else
                         invoiceInFormRef.insert({
-                            amount: (totals.totalTaxableBase - totalAmount).toFixed(2),
+                            amount: (totalTaxableBase - totalAmount).toFixed(2),
                             invoiceInFk: invoiceId,
                         });
                 }
@@ -249,6 +265,10 @@ onBeforeMount(async () => {
 .bg {
     background-color: var(--vn-light-gray);
 }
+
+.q-chip {
+    color: var(--vn-text-color);
+}
 </style>
 <i18n>
     es:
diff --git a/src/pages/InvoiceIn/locale/en.yml b/src/pages/InvoiceIn/locale/en.yml
index 548e6c201..085f351b2 100644
--- a/src/pages/InvoiceIn/locale/en.yml
+++ b/src/pages/InvoiceIn/locale/en.yml
@@ -68,3 +68,4 @@ invoiceIn:
         isBooked: Is booked
         account: Ledger account
         correctingFk: Rectificative
+    noMatch: No match with the vat({totalTaxableBase})
diff --git a/src/pages/InvoiceIn/locale/es.yml b/src/pages/InvoiceIn/locale/es.yml
index 142d95f92..516da1149 100644
--- a/src/pages/InvoiceIn/locale/es.yml
+++ b/src/pages/InvoiceIn/locale/es.yml
@@ -60,9 +60,11 @@ invoiceIn:
         net: Neto
         stems: Tallos
         country: País
+        noMatch: No cuadra
     params:
         search: Id o nombre proveedor
         correctedFk: Rectificada
         isBooked: Contabilizada
         account: Cuenta contable
         correctingFk: Rectificativa
+    noMatch: No cuadra con el iva({totalTaxableBase})

From b7309298aa591f06059a389f8e8f0320a760fb95 Mon Sep 17 00:00:00 2001
From: benjaminedc <benjaminedc@verdnatura.es>
Date: Thu, 20 Mar 2025 10:04:27 +0100
Subject: [PATCH 18/59] refactor: refs #8118 simplify VnDropdown usage and
 replace onMounted data fetching with FetchData component

---
 src/components/common/VnDropdown.vue    |  9 ---------
 src/pages/Claim/Card/ClaimSummary.vue   | 18 ++++++++++++------
 src/pages/Ticket/Card/TicketSummary.vue |  2 ++
 3 files changed, 14 insertions(+), 15 deletions(-)

diff --git a/src/components/common/VnDropdown.vue b/src/components/common/VnDropdown.vue
index 75b6878a0..1b3f2237b 100644
--- a/src/components/common/VnDropdown.vue
+++ b/src/components/common/VnDropdown.vue
@@ -48,15 +48,6 @@ async function changeState(value) {
             focus-on-mount
             @update:model-value="changeState"
         >
-            <template #option="scope">
-                <QItem v-bind="scope.itemProps">
-                    <QItemSection>
-                        <QItemLabel>
-                            {{ scope.opt?.name || scope.opt?.description }}
-                        </QItemLabel>
-                    </QItemSection>
-                </QItem>
-            </template>
         </VnSelect>
     </QBtnDropdown>
 </template>
diff --git a/src/pages/Claim/Card/ClaimSummary.vue b/src/pages/Claim/Card/ClaimSummary.vue
index f43ba4dad..37e73a99d 100644
--- a/src/pages/Claim/Card/ClaimSummary.vue
+++ b/src/pages/Claim/Card/ClaimSummary.vue
@@ -183,14 +183,15 @@ async function changeState(value) {
 function claimUrl(section) {
     return '#/claim/' + entityId.value + '/' + section;
 }
-
-onMounted(async () => {
-    const { data } = await axios.get('ClaimStates');
-    claimStates.value = data;
-});
 </script>
 
 <template>
+    <FetchData
+        url="ClaimStates"
+        :filter="{ fields: ['id', 'description'] }"
+        @on-fetch="(data) => (claimStates = data)"
+        auto-load
+    />
     <FetchData
         url="ClaimDms"
         :filter="claimDmsFilter"
@@ -208,7 +209,12 @@ onMounted(async () => {
             {{ claim.id }} - {{ claim.client.name }} ({{ claim.client.id }})
         </template>
         <template #header-right>
-            <VnDropdown :options="claimStates" @change-state="changeState($event)" />
+            <VnDropdown
+                :options="claimStates"
+                option-value="id"
+                option-label="description"
+                @change-state="changeState($event)"
+            />
         </template>
         <template #menu="{ entity }">
             <ClaimDescriptorMenu :claim="entity.claim" />
diff --git a/src/pages/Ticket/Card/TicketSummary.vue b/src/pages/Ticket/Card/TicketSummary.vue
index f1c5a1072..9cd8a75d2 100644
--- a/src/pages/Ticket/Card/TicketSummary.vue
+++ b/src/pages/Ticket/Card/TicketSummary.vue
@@ -117,6 +117,8 @@ onMounted(async () => {
                 :moduleId="entityId"
                 :options="editableStates"
                 :disable="!isEditable()"
+                :option-label="'name'"
+                :option-value="'code'"
                 @change-state="changeState($event)"
             />
         </template>

From efb6c2357bd4c491472642878a63a9f948e39b78 Mon Sep 17 00:00:00 2001
From: benjaminedc <benjaminedc@verdnatura.es>
Date: Thu, 20 Mar 2025 12:55:46 +0100
Subject: [PATCH 19/59] fix: refs #8118 update Cypress parallel test execution
 to run with a single instance

---
 Jenkinsfile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Jenkinsfile b/Jenkinsfile
index 7f4144a54..05ef34791 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -126,7 +126,7 @@ pipeline {
                             sh "docker-compose ${env.COMPOSE_PARAMS} up -d"
 
                             image.inside("--network ${env.COMPOSE_PROJECT}_default -e CI -e TZ --init") {
-                                sh 'sh test/cypress/cypressParallel.sh 2'
+                                sh 'sh test/cypress/cypressParallel.sh 1'
                             }
                         }
                     }

From 489fcda41057d4546ea3be5e06e1ddc5e5e09913 Mon Sep 17 00:00:00 2001
From: benjaminedc <benjaminedc@verdnatura.es>
Date: Thu, 20 Mar 2025 12:59:33 +0100
Subject: [PATCH 20/59] fix: refs #8683 update Cypress parallel test execution
 to run with a single instance

---
 Jenkinsfile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Jenkinsfile b/Jenkinsfile
index 7f4144a54..05ef34791 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -126,7 +126,7 @@ pipeline {
                             sh "docker-compose ${env.COMPOSE_PARAMS} up -d"
 
                             image.inside("--network ${env.COMPOSE_PROJECT}_default -e CI -e TZ --init") {
-                                sh 'sh test/cypress/cypressParallel.sh 2'
+                                sh 'sh test/cypress/cypressParallel.sh 1'
                             }
                         }
                     }

From 7de4bd4f4a4ce1de7a4fc3ed990b09c475272262 Mon Sep 17 00:00:00 2001
From: benjaminedc <benjaminedc@verdnatura.es>
Date: Thu, 20 Mar 2025 13:01:13 +0100
Subject: [PATCH 21/59] fix: refs #8118 update Cypress parallel test execution
 to run with two instances

---
 Jenkinsfile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Jenkinsfile b/Jenkinsfile
index 05ef34791..7f4144a54 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -126,7 +126,7 @@ pipeline {
                             sh "docker-compose ${env.COMPOSE_PARAMS} up -d"
 
                             image.inside("--network ${env.COMPOSE_PROJECT}_default -e CI -e TZ --init") {
-                                sh 'sh test/cypress/cypressParallel.sh 1'
+                                sh 'sh test/cypress/cypressParallel.sh 2'
                             }
                         }
                     }

From 767511cec080356dceeef617a423c39a2fdbab22 Mon Sep 17 00:00:00 2001
From: Jon <jon@verdnatura.es>
Date: Fri, 21 Mar 2025 09:13:34 +0100
Subject: [PATCH 22/59] fix: refs #8326 e2e

---
 .../integration/invoiceIn/invoiceInList.spec.js  |  6 +++---
 .../integration/ticket/ticketDescriptor.spec.js  |  4 ++--
 .../integration/worker/workerSummary.spec.js     | 16 +++++++---------
 3 files changed, 12 insertions(+), 14 deletions(-)

diff --git a/test/cypress/integration/invoiceIn/invoiceInList.spec.js b/test/cypress/integration/invoiceIn/invoiceInList.spec.js
index 44a61609e..6b5d28c70 100644
--- a/test/cypress/integration/invoiceIn/invoiceInList.spec.js
+++ b/test/cypress/integration/invoiceIn/invoiceInList.spec.js
@@ -4,7 +4,7 @@ describe('InvoiceInList', () => {
     const firstRow = 'tbody.q-virtual-scroll__content tr:nth-child(1)';
     const firstId = `${firstRow} > td:nth-child(2) span`;
     const firstDetailBtn = `${firstRow} .q-btn:nth-child(1)`;
-    const summaryHeaders = '.summaryBody .header-link';
+    const summaryHeaders = (opt) => `.summaryBody > .${opt} > .q-pb-lg > .header-link`;
     const mockInvoiceRef = `createMockInvoice${Math.floor(Math.random() * 100)}`;
     const mock = {
         vnSupplierSelect: { val: 'farmer king', type: 'select' },
@@ -32,8 +32,8 @@ describe('InvoiceInList', () => {
 
     it('should open the details', () => {
         cy.get(firstDetailBtn).click();
-        cy.get(summaryHeaders).eq(1).contains('Basic data');
-        cy.get(summaryHeaders).eq(4).contains('Vat');
+        cy.get(summaryHeaders('max-width')).contains('Basic data');
+        cy.get(summaryHeaders('vat')).contains('Vat');
     });
 
     it('should create a new Invoice', () => {
diff --git a/test/cypress/integration/ticket/ticketDescriptor.spec.js b/test/cypress/integration/ticket/ticketDescriptor.spec.js
index 0ba2723a2..b5c95c463 100644
--- a/test/cypress/integration/ticket/ticketDescriptor.spec.js
+++ b/test/cypress/integration/ticket/ticketDescriptor.spec.js
@@ -3,10 +3,10 @@ describe('Ticket descriptor', () => {
     const listItem = '[role="menu"] .q-list .q-item';
     const toCloneOpt = 'To clone ticket';
     const setWeightOpt = 'Set weight';
-    const warehouseValue = ':nth-child(1) > :nth-child(6) > .value > span';
+    const warehouseValue = ':nth-child(1) > [data-cy="vnLvWarehouse"]';
     const summaryHeader = '.summaryHeader > div';
     const weight = 25;
-    const weightValue = '.summaryBody.row :nth-child(1) > :nth-child(9) > .value > span';
+    const weightValue = '[data-cy="vnLvWeight"]';
     beforeEach(() => {
         cy.login('developer');
         cy.viewport(1920, 1080);
diff --git a/test/cypress/integration/worker/workerSummary.spec.js b/test/cypress/integration/worker/workerSummary.spec.js
index c50b2c943..6071c4cdf 100644
--- a/test/cypress/integration/worker/workerSummary.spec.js
+++ b/test/cypress/integration/worker/workerSummary.spec.js
@@ -1,27 +1,25 @@
 describe('WorkerSummary', () => {
-    const departmentDescriptor = ':nth-child(1) > :nth-child(3) > .value > .link';
-    const roleDescriptor = ':nth-child(3) > :nth-child(4) > .value > .link';
+    const department = ':nth-child(1) > [data-cy="vnLvDepartment"] > .value';
+    const role = '[data-cy="vnLvRole"] > .value';
     beforeEach(() => {
         cy.viewport(1280, 720);
         cy.login('developer');
         cy.visit('/#/worker/19/summary');
     });
 
-    it('should load worker summary', () => {
+    it('should load worker summary and show the department', () => {
         cy.waitForElement('.summaryHeader');
         cy.get('.summaryHeader > div').should('have.text', '19 - salesboss salesboss');
-        cy.get(':nth-child(1) > :nth-child(2) > .value > span').should(
-            'have.text',
-            'salesBossNick',
-        );
+        cy.get(department).should('have.text', 'VENTAS');
     });
 
     it('should try descriptors', () => {
         cy.waitForElement('.summaryHeader');
-        cy.get(departmentDescriptor).click();
+        cy.get(department).click();
         cy.get('.descriptor').should('be.visible');
         cy.get('.q-item > .q-item__label').should('include.text', '43');
-        cy.get(roleDescriptor).click();
+        cy.get('.summaryBody').click();
+        cy.get(role).click();
         cy.get('.descriptor').should('be.visible');
         cy.get('.q-item > .q-item__label').should('include.text', '19');
     });

From 3e956cda6998f4b6bc5c59f91bd09aa49baa09d9 Mon Sep 17 00:00:00 2001
From: benjaminedc <benjaminedc@verdnatura.es>
Date: Fri, 21 Mar 2025 09:26:09 +0100
Subject: [PATCH 23/59] fix: refs #8118 update VnDropdown options in
 ClaimSummary and TicketSummary components

---
 src/pages/Claim/Card/ClaimSummary.vue   | 2 +-
 src/pages/Ticket/Card/TicketSummary.vue | 3 +--
 2 files changed, 2 insertions(+), 3 deletions(-)

diff --git a/src/pages/Claim/Card/ClaimSummary.vue b/src/pages/Claim/Card/ClaimSummary.vue
index 37e73a99d..85f37f440 100644
--- a/src/pages/Claim/Card/ClaimSummary.vue
+++ b/src/pages/Claim/Card/ClaimSummary.vue
@@ -211,8 +211,8 @@ function claimUrl(section) {
         <template #header-right>
             <VnDropdown
                 :options="claimStates"
-                option-value="id"
                 option-label="description"
+                option-value="id"
                 @change-state="changeState($event)"
             />
         </template>
diff --git a/src/pages/Ticket/Card/TicketSummary.vue b/src/pages/Ticket/Card/TicketSummary.vue
index 9cd8a75d2..d79c5a9ac 100644
--- a/src/pages/Ticket/Card/TicketSummary.vue
+++ b/src/pages/Ticket/Card/TicketSummary.vue
@@ -114,9 +114,8 @@ onMounted(async () => {
         </template>
         <template #header-right>
             <VnDropdown
-                :moduleId="entityId"
-                :options="editableStates"
                 :disable="!isEditable()"
+                :options="editableStates"
                 :option-label="'name'"
                 :option-value="'code'"
                 @change-state="changeState($event)"

From a74ff042bcc0ad4866a728eb0a0dec25b8c6ab0c Mon Sep 17 00:00:00 2001
From: Jon <jon@verdnatura.es>
Date: Fri, 21 Mar 2025 11:09:42 +0100
Subject: [PATCH 24/59] feat: refs #7358 added chip in navbar to show
 environment

---
 src/components/NavBar.vue | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/src/components/NavBar.vue b/src/components/NavBar.vue
index dbb6f1fe6..605d8786a 100644
--- a/src/components/NavBar.vue
+++ b/src/components/NavBar.vue
@@ -18,7 +18,18 @@ const state = useState();
 const user = state.getUser();
 const appName = 'Lilium';
 const pinnedModulesRef = ref();
+const env = process.env.NODE_ENV;
 
+function getEnvironment() {
+    switch (env) {
+        case 'development':
+            return 'dev';
+        case 'production':
+            return;
+        default:
+            return env;
+    }
+}
 onMounted(() => stateStore.setMounted());
 const refresh = () => window.location.reload();
 </script>
@@ -50,6 +61,9 @@ const refresh = () => window.location.reload();
                     </QTooltip>
                 </QBtn>
             </RouterLink>
+            <QChip class="q-ml-xs q-mr-xs envChip">
+                {{ getEnvironment() }}
+            </QChip>
             <VnBreadcrumbs v-if="$q.screen.gt.sm" />
             <QSpinner
                 color="primary"
@@ -118,4 +132,7 @@ const refresh = () => window.location.reload();
 .q-header {
     background-color: var(--vn-section-color);
 }
+.envChip {
+    background-color: $primary;
+}
 </style>

From d279d284c2189dc3ed8cad7764f280d95950d7ab Mon Sep 17 00:00:00 2001
From: benjaminedc <benjaminedc@verdnatura.es>
Date: Fri, 21 Mar 2025 11:09:56 +0100
Subject: [PATCH 25/59] fix: refs #8790 format code and update default SMS
 message in SendSmsDialog component

---
 src/components/common/SendSmsDialog.vue | 22 ++++++++++++----------
 1 file changed, 12 insertions(+), 10 deletions(-)

diff --git a/src/components/common/SendSmsDialog.vue b/src/components/common/SendSmsDialog.vue
index 269a4ec9a..74aa64c72 100644
--- a/src/components/common/SendSmsDialog.vue
+++ b/src/components/common/SendSmsDialog.vue
@@ -1,15 +1,15 @@
 <script setup>
-import {useDialogPluginComponent} from 'quasar';
-import {useI18n} from 'vue-i18n';
-import {computed, ref} from 'vue';
+import { useDialogPluginComponent } from 'quasar';
+import { useI18n } from 'vue-i18n';
+import { computed, ref } from 'vue';
 import VnInput from 'components/common/VnInput.vue';
 import axios from 'axios';
-import useNotify from "composables/useNotify";
+import useNotify from 'composables/useNotify';
 
 const MESSAGE_MAX_LENGTH = 160;
 
-const {t} = useI18n();
-const {notify} = useNotify();
+const { t } = useI18n();
+const { notify } = useNotify();
 const props = defineProps({
     title: {
         type: String,
@@ -34,7 +34,7 @@ const props = defineProps({
 });
 
 const emit = defineEmits([...useDialogPluginComponent.emits, 'sent']);
-const {dialogRef, onDialogHide} = useDialogPluginComponent();
+const { dialogRef, onDialogHide } = useDialogPluginComponent();
 
 const smsRules = [
     (val) => (val && val.length > 0) || t("The message can't be empty"),
@@ -43,10 +43,12 @@ const smsRules = [
         t("The message it's too long"),
 ];
 
-const message = ref('');
+const message = ref(
+    'Retraso en ruta.\nInformamos que la ruta que lleva su pedido ha sufrido un retraso y la entrega se hará a lo largo del día.\nDisculpe las molestias.',
+);
 
 const charactersRemaining = computed(
-    () => MESSAGE_MAX_LENGTH - new Blob([message.value]).size
+    () => MESSAGE_MAX_LENGTH - new Blob([message.value]).size,
 );
 
 const charactersChipColor = computed(() => {
@@ -114,7 +116,7 @@ const onSubmit = async () => {
                                 <QTooltip>
                                     {{
                                         t(
-                                            'Special characters like accents counts as a multiple'
+                                            'Special characters like accents counts as a multiple',
                                         )
                                     }}
                                 </QTooltip>

From 197a4a0ca73ed94b976ebdba5a39dc84d2210f30 Mon Sep 17 00:00:00 2001
From: benjaminedc <benjaminedc@verdnatura.es>
Date: Fri, 21 Mar 2025 11:42:31 +0100
Subject: [PATCH 26/59] fix: refs #8790 update default SMS message in
 SendSmsDialog component for improved clarity and localization

---
 src/components/common/SendSmsDialog.vue | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/src/components/common/SendSmsDialog.vue b/src/components/common/SendSmsDialog.vue
index 74aa64c72..ee468a42f 100644
--- a/src/components/common/SendSmsDialog.vue
+++ b/src/components/common/SendSmsDialog.vue
@@ -43,9 +43,7 @@ const smsRules = [
         t("The message it's too long"),
 ];
 
-const message = ref(
-    'Retraso en ruta.\nInformamos que la ruta que lleva su pedido ha sufrido un retraso y la entrega se hará a lo largo del día.\nDisculpe las molestias.',
-);
+const message = ref(t('routeLack'));
 
 const charactersRemaining = computed(
     () => MESSAGE_MAX_LENGTH - new Blob([message.value]).size,
@@ -147,6 +145,8 @@ const onSubmit = async () => {
 }
 </style>
 <i18n>
+en:
+    routeLack: Your order has been delayed in transit. Delivery will take place throughout the day. We apologize for the inconvenience and appreciate your patience.
 es:
     Message: Mensaje
     Send: Enviar
@@ -155,4 +155,5 @@ es:
     The destination can't be empty: El destinatario no puede estar vacio
     The message can't be empty: El mensaje no puede estar vacio
     The message it's too long: El mensaje es demasiado largo
+    routeLack: Retraso en ruta. Informamos que la ruta que lleva su pedido ha sufrido un retraso y la entrega se hará a lo largo del día. Disculpe las molestias.
 </i18n>

From d8b9f3467a5fab53b7739c99c3c8c0c2fd5824f4 Mon Sep 17 00:00:00 2001
From: Jon <jon@verdnatura.es>
Date: Fri, 21 Mar 2025 13:25:59 +0100
Subject: [PATCH 27/59] refactor: refs #7358 changed function to computed

---
 src/components/NavBar.vue | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/src/components/NavBar.vue b/src/components/NavBar.vue
index 605d8786a..6365fcd07 100644
--- a/src/components/NavBar.vue
+++ b/src/components/NavBar.vue
@@ -1,5 +1,5 @@
 <script setup>
-import { onMounted, ref } from 'vue';
+import { onMounted, ref, computed } from 'vue';
 import { useI18n } from 'vue-i18n';
 import { useState } from 'src/composables/useState';
 import { useStateStore } from 'stores/useStateStore';
@@ -20,16 +20,16 @@ const appName = 'Lilium';
 const pinnedModulesRef = ref();
 const env = process.env.NODE_ENV;
 
-function getEnvironment() {
+const getEnvironment = computed(() => {
     switch (env) {
         case 'development':
-            return 'dev';
+            return 'DEV';
         case 'production':
             return;
         default:
-            return env;
+            return env.toUpperCase();
     }
-}
+});
 onMounted(() => stateStore.setMounted());
 const refresh = () => window.location.reload();
 </script>
@@ -62,7 +62,7 @@ const refresh = () => window.location.reload();
                 </QBtn>
             </RouterLink>
             <QChip class="q-ml-xs q-mr-xs envChip">
-                {{ getEnvironment() }}
+                {{ getEnvironment }}
             </QChip>
             <VnBreadcrumbs v-if="$q.screen.gt.sm" />
             <QSpinner

From 517dc49cefc8604ebbb111c72e3d398aa4761f38 Mon Sep 17 00:00:00 2001
From: jorgep <jorgep@verdnatura.es>
Date: Fri, 21 Mar 2025 15:41:40 +0100
Subject: [PATCH 28/59] fix: refs #8388 update translation for invoice summary
 mismatch message

---
 src/pages/InvoiceIn/Card/InvoiceInSummary.vue | 5 ++++-
 src/pages/InvoiceIn/locale/en.yml             | 1 -
 src/pages/InvoiceIn/locale/es.yml             | 1 -
 3 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/src/pages/InvoiceIn/Card/InvoiceInSummary.vue b/src/pages/InvoiceIn/Card/InvoiceInSummary.vue
index f6beecd3d..5af6a94f7 100644
--- a/src/pages/InvoiceIn/Card/InvoiceInSummary.vue
+++ b/src/pages/InvoiceIn/Card/InvoiceInSummary.vue
@@ -305,7 +305,10 @@ const getLink = (param) => `#/invoice-in/${entityId.value}/${param}`;
                                 :color="amountsNotMatch ? 'negative' : 'transparent'"
                                 :title="
                                     amountsNotMatch
-                                        ? t('invoiceIn.summary.noMatch')
+                                        ? t('invoiceIn.noMatch', {
+                                              totalTaxableBase:
+                                                  entity.totals.totalTaxableBase,
+                                          })
                                         : t('invoiceIn.summary.dueTotal')
                                 "
                             >
diff --git a/src/pages/InvoiceIn/locale/en.yml b/src/pages/InvoiceIn/locale/en.yml
index 085f351b2..2f9435b00 100644
--- a/src/pages/InvoiceIn/locale/en.yml
+++ b/src/pages/InvoiceIn/locale/en.yml
@@ -57,7 +57,6 @@ invoiceIn:
         bank: Bank
         foreignValue: Foreign value
         dueTotal: Due day
-        noMatch: Do not match
         code: Code
         net: Net
         stems: Stems
diff --git a/src/pages/InvoiceIn/locale/es.yml b/src/pages/InvoiceIn/locale/es.yml
index 516da1149..9144d6ab1 100644
--- a/src/pages/InvoiceIn/locale/es.yml
+++ b/src/pages/InvoiceIn/locale/es.yml
@@ -60,7 +60,6 @@ invoiceIn:
         net: Neto
         stems: Tallos
         country: País
-        noMatch: No cuadra
     params:
         search: Id o nombre proveedor
         correctedFk: Rectificada

From 028477ecbeb760559f8999aa9f77bdab6f52d01c Mon Sep 17 00:00:00 2001
From: jorgep <jorgep@verdnatura.es>
Date: Mon, 24 Mar 2025 11:12:15 +0100
Subject: [PATCH 29/59] feat: refs #8388 add hasFile prop to VnDms component

---
 src/components/common/VnDms.vue | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/src/components/common/VnDms.vue b/src/components/common/VnDms.vue
index e667e1558..8f5cc73c4 100644
--- a/src/components/common/VnDms.vue
+++ b/src/components/common/VnDms.vue
@@ -35,6 +35,10 @@ const $props = defineProps({
         type: String,
         default: null,
     },
+    hasFile: {
+        type: Boolean,
+        default: false,
+    },
 });
 
 const warehouses = ref();
@@ -49,7 +53,7 @@ onMounted(() => {
     if (!$props.formInitialData) {
         dms.value.description =
             $props.description ?? t($props.model + 'Description', dms.value);
-        dms.value.hasFile = false;
+        dms.value.hasFile = $props.hasFile;
     }
 });
 function onFileChange(files) {

From 2fabff05be50ab957997e7cd371dc4a5e1e9efb3 Mon Sep 17 00:00:00 2001
From: jorgep <jorgep@verdnatura.es>
Date: Mon, 24 Mar 2025 11:15:59 +0100
Subject: [PATCH 30/59] feat: refs #8388 add hasFile property handling in VnDms
 component

---
 src/components/common/VnDms.vue | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/src/components/common/VnDms.vue b/src/components/common/VnDms.vue
index 8f5cc73c4..de22e4857 100644
--- a/src/components/common/VnDms.vue
+++ b/src/components/common/VnDms.vue
@@ -50,11 +50,9 @@ const dms = ref({});
 
 onMounted(() => {
     defaultData();
-    if (!$props.formInitialData) {
+    if (!$props.formInitialData)
         dms.value.description =
             $props.description ?? t($props.model + 'Description', dms.value);
-        dms.value.hasFile = $props.hasFile;
-    }
 });
 function onFileChange(files) {
     dms.value.hasFileAttached = !!files;
@@ -96,6 +94,7 @@ function defaultData() {
     if ($props.formInitialData) return (dms.value = $props.formInitialData);
     return addDefaultData({
         reference: route.params.id,
+        hasFile: $props.hasFile,
     });
 }
 

From 53f6f5278f154e6e7ccb55492be84230efcbf6ad Mon Sep 17 00:00:00 2001
From: Jon <jon@verdnatura.es>
Date: Mon, 24 Mar 2025 12:08:24 +0100
Subject: [PATCH 31/59] refactor: refs #8326 requested changes

---
 src/components/ui/CardSummary.vue     |  23 +++++
 src/css/app.scss                      |  23 -----
 src/pages/Route/Card/RouteSummary.vue | 141 +++++++++++++-------------
 src/pages/Zone/Card/ZoneSummary.vue   |  18 +++-
 4 files changed, 111 insertions(+), 94 deletions(-)

diff --git a/src/components/ui/CardSummary.vue b/src/components/ui/CardSummary.vue
index 05bfed998..2ec6bea78 100644
--- a/src/components/ui/CardSummary.vue
+++ b/src/components/ui/CardSummary.vue
@@ -201,6 +201,29 @@ async function fetch() {
         }
     }
 }
+
+.vn-card-group {
+    display: flex;
+    flex-direction: column;
+}
+
+.vn-card-content {
+    display: flex;
+    flex-direction: column;
+    text-overflow: ellipsis;
+    > div {
+        max-height: 70px;
+    }
+}
+
+@media (min-width: 1010px) {
+    .vn-card-group {
+        flex-direction: row;
+    }
+    .vn-card-content {
+        flex: 1;
+    }
+}
 </style>
 <style lang="scss" scoped>
 .summaryHeader .vn-label-value {
diff --git a/src/css/app.scss b/src/css/app.scss
index 6a0ce8fb0..5befd150b 100644
--- a/src/css/app.scss
+++ b/src/css/app.scss
@@ -341,26 +341,3 @@ input::-webkit-inner-spin-button {
 .containerShrinked {
     width: 70%;
 }
-
-.vn-card-group {
-    display: flex;
-    flex-direction: column;
-}
-
-.vn-card-content {
-    display: flex;
-    flex-direction: column;
-    text-overflow: ellipsis;
-    > div {
-        max-height: 80px;
-    }
-}
-
-@media (min-width: 1010px) {
-    .vn-card-group {
-        flex-direction: row;
-    }
-    .vn-card-content {
-        flex: 1;
-    }
-}
diff --git a/src/pages/Route/Card/RouteSummary.vue b/src/pages/Route/Card/RouteSummary.vue
index f68628095..86bdbb5c5 100644
--- a/src/pages/Route/Card/RouteSummary.vue
+++ b/src/pages/Route/Card/RouteSummary.vue
@@ -138,74 +138,79 @@ const ticketColumns = ref([
                         :url="`#/${route.meta.moduleName.toLowerCase()}/${entityId}/basic-data`"
                         :text="t('globals.pageTitles.basicData')"
                     />
-                </QCard>
-
-                <QCard class="vn-one">
-                    <VnLv
-                        :label="t('route.summary.date')"
-                        :value="toDate(entity?.route.dated)"
-                    />
-                    <VnLv
-                        :label="t('route.summary.agency')"
-                        :value="entity?.route?.agencyMode?.name"
-                    />
-                    <VnLv
-                        :label="t('route.summary.vehicle')"
-                        :value="entity.route?.vehicle?.numberPlate"
-                    />
-                    <VnLv :label="t('route.summary.driver')">
-                        <template #value>
-                            <span class="link">
-                                {{ dashIfEmpty(entity?.route?.worker?.user?.name) }}
-                                <WorkerDescriptorProxy :id="entity.route?.workerFk" />
-                            </span>
-                        </template>
-                    </VnLv>
-                    <VnLv
-                        :label="t('route.summary.cost')"
-                        :value="toCurrency(entity.route?.cost)"
-                    />
-                    <VnLv
-                        :label="t('route.summary.volume')"
-                        :value="`${dashIfEmpty(entity?.route?.m3)} / ${dashIfEmpty(
-                            entity?.route?.vehicle?.m3,
-                        )} m³`"
-                    />
-                    <VnLv
-                        :label="t('route.summary.packages')"
-                        :value="getTotalPackages(entity.tickets)"
-                    />
-                    <QCheckbox
-                        :label="
-                            entity.route.isOk
-                                ? t('route.summary.closed')
-                                : t('route.summary.open')
-                        "
-                        v-model="entity.route.isOk"
-                        :disable="true"
-                    />
-                </QCard>
-                <QCard class="vn-one">
-                    <VnLv
-                        :label="t('route.summary.started')"
-                        :value="toHour(entity?.route.started)"
-                    />
-                    <VnLv
-                        :label="t('route.summary.finished')"
-                        :value="toHour(entity?.route.finished)"
-                    />
-                    <VnLv
-                        :label="t('route.summary.kmStart')"
-                        :value="dashIfEmpty(entity?.route?.kmStart)"
-                    />
-                    <VnLv
-                        :label="t('route.summary.kmEnd')"
-                        :value="dashIfEmpty(entity?.route?.kmEnd)"
-                    />
-                    <VnLv
-                        :label="t('globals.description')"
-                        :value="dashIfEmpty(entity?.route?.description)"
-                    />
+                    <div class="vn-card-group">
+                        <div class="vn-card-content">
+                            <VnLv
+                                :label="t('route.summary.date')"
+                                :value="toDate(entity?.route.dated)"
+                            />
+                            <VnLv
+                                :label="t('route.summary.agency')"
+                                :value="entity?.route?.agencyMode?.name"
+                            />
+                            <VnLv
+                                :label="t('route.summary.vehicle')"
+                                :value="entity.route?.vehicle?.numberPlate"
+                            />
+                            <VnLv :label="t('route.summary.driver')">
+                                <template #value>
+                                    <span class="link">
+                                        {{
+                                            dashIfEmpty(entity?.route?.worker?.user?.name)
+                                        }}
+                                        <WorkerDescriptorProxy
+                                            :id="entity.route?.workerFk"
+                                        />
+                                    </span>
+                                </template>
+                            </VnLv>
+                            <VnLv
+                                :label="t('route.summary.cost')"
+                                :value="toCurrency(entity.route?.cost)"
+                            />
+                            <VnLv
+                                :label="t('route.summary.volume')"
+                                :value="`${dashIfEmpty(entity?.route?.m3)} / ${dashIfEmpty(
+                                    entity?.route?.vehicle?.m3,
+                                )} m³`"
+                            />
+                            <VnLv
+                                :label="t('route.summary.packages')"
+                                :value="getTotalPackages(entity.tickets)"
+                            />
+                            <QCheckbox
+                                :label="
+                                    entity.route.isOk
+                                        ? t('route.summary.closed')
+                                        : t('route.summary.open')
+                                "
+                                v-model="entity.route.isOk"
+                                :disable="true"
+                            />
+                        </div>
+                        <div class="vn-card-content">
+                            <VnLv
+                                :label="t('route.summary.started')"
+                                :value="toHour(entity?.route.started)"
+                            />
+                            <VnLv
+                                :label="t('route.summary.finished')"
+                                :value="toHour(entity?.route.finished)"
+                            />
+                            <VnLv
+                                :label="t('route.summary.kmStart')"
+                                :value="dashIfEmpty(entity?.route?.kmStart)"
+                            />
+                            <VnLv
+                                :label="t('route.summary.kmEnd')"
+                                :value="dashIfEmpty(entity?.route?.kmEnd)"
+                            />
+                            <VnLv
+                                :label="t('globals.description')"
+                                :value="dashIfEmpty(entity?.route?.description)"
+                            />
+                        </div>
+                    </div>
                 </QCard>
                 <QCard class="vn-max">
                     <VnTitle
diff --git a/src/pages/Zone/Card/ZoneSummary.vue b/src/pages/Zone/Card/ZoneSummary.vue
index cd5a80ba2..61475b1f6 100644
--- a/src/pages/Zone/Card/ZoneSummary.vue
+++ b/src/pages/Zone/Card/ZoneSummary.vue
@@ -75,13 +75,13 @@ onMounted(async () => {
         <template #body="{ entity: zone }">
             <QCard class="vn-one">
                 <VnTitle :url="zoneUrl + `basic-data`" :text="t('summary.basicData')" />
-                <div class="vn-card-group">
-                    <div class="vn-card-content">
+                <div class="card-group">
+                    <div class="card-content">
                         <VnLv :label="t('list.agency')" :value="zone.agencyMode?.name" />
                         <VnLv :label="t('list.price')" :value="toCurrency(zone.price)" />
                         <VnLv :label="t('zone.bonus')" :value="toCurrency(zone.bonus)" />
                     </div>
-                    <div class="vn-card-content">
+                    <div class="card-content">
                         <VnLv
                             :label="t('summary.closeHour')"
                             :value="toTimeFormat(zone.hour)"
@@ -109,3 +109,15 @@ onMounted(async () => {
         </template>
     </CardSummary>
 </template>
+
+<style lang="scss" scoped>
+.card-group {
+    display: flex;
+    flex-direction: column;
+}
+
+.card-content {
+    display: flex;
+    flex-direction: column;
+}
+</style>

From 43701bd58607b6cfb415fcd570b4816b73a60feb Mon Sep 17 00:00:00 2001
From: benjaminedc <benjaminedc@verdnatura.es>
Date: Mon, 24 Mar 2025 12:24:49 +0100
Subject: [PATCH 32/59] refactor: refs #8118 simplify dropdown change event
 handling in ClaimSummary and TicketSummary components

---
 src/pages/Claim/Card/ClaimSummary.vue   | 5 ++---
 src/pages/Ticket/Card/TicketSummary.vue | 5 ++---
 2 files changed, 4 insertions(+), 6 deletions(-)

diff --git a/src/pages/Claim/Card/ClaimSummary.vue b/src/pages/Claim/Card/ClaimSummary.vue
index 85f37f440..67d57004f 100644
--- a/src/pages/Claim/Card/ClaimSummary.vue
+++ b/src/pages/Claim/Card/ClaimSummary.vue
@@ -1,6 +1,6 @@
 <script setup>
 import axios from 'axios';
-import { ref, computed, onMounted } from 'vue';
+import { ref, computed } from 'vue';
 import { useRoute, useRouter } from 'vue-router';
 import { useI18n } from 'vue-i18n';
 import { toDate, toCurrency } from 'src/filters';
@@ -212,8 +212,7 @@ function claimUrl(section) {
             <VnDropdown
                 :options="claimStates"
                 option-label="description"
-                option-value="id"
-                @change-state="changeState($event)"
+                @change-state="changeState"
             />
         </template>
         <template #menu="{ entity }">
diff --git a/src/pages/Ticket/Card/TicketSummary.vue b/src/pages/Ticket/Card/TicketSummary.vue
index d79c5a9ac..f865abfc4 100644
--- a/src/pages/Ticket/Card/TicketSummary.vue
+++ b/src/pages/Ticket/Card/TicketSummary.vue
@@ -116,9 +116,8 @@ onMounted(async () => {
             <VnDropdown
                 :disable="!isEditable()"
                 :options="editableStates"
-                :option-label="'name'"
-                :option-value="'code'"
-                @change-state="changeState($event)"
+                option-value="code"
+                @change-state="changeState"
             />
         </template>
         <template #menu="{ entity }">

From 3587be39973a6f570c11e9601d510b3bf70b9680 Mon Sep 17 00:00:00 2001
From: benjaminedc <benjaminedc@verdnatura.es>
Date: Mon, 24 Mar 2025 12:41:40 +0100
Subject: [PATCH 33/59] refactor: refs #8790 update SMS delay message and
 localization keys

---
 src/components/common/SendSmsDialog.vue | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/src/components/common/SendSmsDialog.vue b/src/components/common/SendSmsDialog.vue
index ee468a42f..a953abd75 100644
--- a/src/components/common/SendSmsDialog.vue
+++ b/src/components/common/SendSmsDialog.vue
@@ -43,7 +43,7 @@ const smsRules = [
         t("The message it's too long"),
 ];
 
-const message = ref(t('routeLack'));
+const message = ref(t('routeDelay'));
 
 const charactersRemaining = computed(
     () => MESSAGE_MAX_LENGTH - new Blob([message.value]).size,
@@ -144,9 +144,10 @@ const onSubmit = async () => {
     max-width: 450px;
 }
 </style>
+
 <i18n>
 en:
-    routeLack: Your order has been delayed in transit. Delivery will take place throughout the day. We apologize for the inconvenience and appreciate your patience.
+    routeDelay: "Your order has been delayed in transit.\nDelivery will take place throughout the day.\nWe apologize for the inconvenience and appreciate your patience."
 es:
     Message: Mensaje
     Send: Enviar
@@ -155,5 +156,5 @@ es:
     The destination can't be empty: El destinatario no puede estar vacio
     The message can't be empty: El mensaje no puede estar vacio
     The message it's too long: El mensaje es demasiado largo
-    routeLack: Retraso en ruta. Informamos que la ruta que lleva su pedido ha sufrido un retraso y la entrega se hará a lo largo del día. Disculpe las molestias.
-</i18n>
+    routeDelay: "Retraso en ruta.\nInformamos que la ruta que lleva su pedido ha sufrido un retraso y la entrega se hará a lo largo del día.\nDisculpe las molestias."
+    </i18n>

From 65d21c9fe5f6000c9084e449f1a2280e588a4cda Mon Sep 17 00:00:00 2001
From: jorgep <jorgep@verdnatura.es>
Date: Mon, 24 Mar 2025 16:15:17 +0100
Subject: [PATCH 34/59] test: refs #8388 update invoice creation test to
 include spinner wait and company field validation

---
 .../integration/invoiceIn/invoiceInList.spec.js        | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/test/cypress/integration/invoiceIn/invoiceInList.spec.js b/test/cypress/integration/invoiceIn/invoiceInList.spec.js
index 44a61609e..3338684d6 100644
--- a/test/cypress/integration/invoiceIn/invoiceInList.spec.js
+++ b/test/cypress/integration/invoiceIn/invoiceInList.spec.js
@@ -36,17 +36,17 @@ describe('InvoiceInList', () => {
         cy.get(summaryHeaders).eq(4).contains('Vat');
     });
 
-    it('should create a new Invoice', () => {
+    it.only('should create a new Invoice', () => {
         cy.dataCy('vnTableCreateBtn').click();
         cy.fillInForm({ ...mock }, { attr: 'data-cy' });
         cy.dataCy('FormModelPopup_save').click();
         cy.intercept('GET', /\/api\/InvoiceIns\/\d+\/getTotals$/).as('invoice');
-        cy.wait('@invoice').then(() =>
+        cy.wait('@invoice').then(() => {
             cy.validateDescriptor({
                 title: mockInvoiceRef,
                 listBox: { 0: '11/16/2001', 3: 'The farmer' },
-            }),
-        );
-        cy.get('[data-cy="vnLvCompany"]').should('contain.text', 'ORN');
+            });
+            cy.dataCy('invoiceInBasicDataCompanyFk').should('have.value', 'ORN');
+        });
     });
 });

From 535fe011f61f3511ff5cc2df7c1a942cb668c97e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Carlos=20Andr=C3=A9s?= <carlosap@verdnatura.es>
Date: Mon, 24 Mar 2025 17:51:29 +0100
Subject: [PATCH 35/59] feat: refs #8529 add isDeductible column and
 localization for InvoiceIn summary

---
 src/pages/InvoiceIn/Card/InvoiceInSummary.vue    | 16 ++++++++++++++++
 src/pages/InvoiceIn/Card/InvoiceInVat.vue        |  3 +--
 src/pages/InvoiceIn/locale/en.yml                |  1 +
 src/pages/InvoiceIn/locale/es.yml                |  1 +
 .../invoiceIn/invoiceInDescriptor.spec.js        |  3 ---
 5 files changed, 19 insertions(+), 5 deletions(-)

diff --git a/src/pages/InvoiceIn/Card/InvoiceInSummary.vue b/src/pages/InvoiceIn/Card/InvoiceInSummary.vue
index 4f1140a9a..d5fded4bc 100644
--- a/src/pages/InvoiceIn/Card/InvoiceInSummary.vue
+++ b/src/pages/InvoiceIn/Card/InvoiceInSummary.vue
@@ -40,6 +40,13 @@ const vatColumns = ref([
         sortable: true,
         align: 'left',
     },
+    {
+        name: 'isDeductible',
+        label: 'invoiceIn.isDeductible',
+        field: (row) => row.isDeductible,
+        sortable: true,
+        align: 'center',
+    },
     {
         name: 'vat',
         label: 'invoiceIn.summary.sageVat',
@@ -331,6 +338,15 @@ const getLink = (param) => `#/invoice-in/${entityId.value}/${param}`;
                             </QTh>
                         </QTr>
                     </template>
+                    <template #body-cell-isDeductible="{ row }">
+                        <QTd align="center">
+                            <QCheckbox
+                                v-model="row.isDeductible"
+                                disable
+                                data-cy="isDeductible_checkbox"
+                            />
+                        </QTd>
+                    </template>
                     <template #body-cell-vat="{ value: vatCell }">
                         <QTd :title="vatCell" shrink>
                             {{ vatCell }}
diff --git a/src/pages/InvoiceIn/Card/InvoiceInVat.vue b/src/pages/InvoiceIn/Card/InvoiceInVat.vue
index 5a868d32d..61c3040ae 100644
--- a/src/pages/InvoiceIn/Card/InvoiceInVat.vue
+++ b/src/pages/InvoiceIn/Card/InvoiceInVat.vue
@@ -55,7 +55,7 @@ const columns = computed(() => [
     },
     {
         name: 'isDeductible',
-        label: t('Deductible'),
+        label: t('invoiceIn.isDeductible'),
         field: (row) => row.isDeductible,
         model: 'isDeductible',
         align: 'center',
@@ -511,7 +511,6 @@ es:
     Create a new expense: Crear nuevo gasto
     Add tax: Crear gasto
     Taxable base: Base imp.
-    Deductible: Deducible
     Sage tax: Sage iva
     Sage transaction: Sage transacción
     Rate: Tasa
diff --git a/src/pages/InvoiceIn/locale/en.yml b/src/pages/InvoiceIn/locale/en.yml
index 548e6c201..7e3603f0f 100644
--- a/src/pages/InvoiceIn/locale/en.yml
+++ b/src/pages/InvoiceIn/locale/en.yml
@@ -4,6 +4,7 @@ invoiceIn:
     serial: Serial
     isBooked: Is booked
     supplierRef: Invoice nº
+    isDeductible: Deductible
     list:
         ref: Reference
         supplier: Supplier
diff --git a/src/pages/InvoiceIn/locale/es.yml b/src/pages/InvoiceIn/locale/es.yml
index 142d95f92..e6ac9273c 100644
--- a/src/pages/InvoiceIn/locale/es.yml
+++ b/src/pages/InvoiceIn/locale/es.yml
@@ -4,6 +4,7 @@ invoiceIn:
     serial: Serie
     isBooked: Contabilizada
     supplierRef: Nº factura
+    isDeductible: Deducible
     list:
         ref: Referencia
         supplier: Proveedor
diff --git a/test/cypress/integration/invoiceIn/invoiceInDescriptor.spec.js b/test/cypress/integration/invoiceIn/invoiceInDescriptor.spec.js
index ee1a55434..7058e154c 100644
--- a/test/cypress/integration/invoiceIn/invoiceInDescriptor.spec.js
+++ b/test/cypress/integration/invoiceIn/invoiceInDescriptor.spec.js
@@ -1,7 +1,4 @@
 describe('InvoiceInDescriptor', () => {
-    const book = '.summaryHeader > .no-wrap > .q-btn';
-    const firstDescritorOpt = '.q-menu > .q-list > :nth-child(4) > .q-item__section';
-    const checkbox = ':nth-child(4) > .q-checkbox';
     beforeEach(() => cy.login('administrative'));
 
     describe('more options', () => {

From 8da61655e2cc10aa186989211332b795fe820060 Mon Sep 17 00:00:00 2001
From: pablone <pablone@verdnatura.es>
Date: Mon, 24 Mar 2025 23:02:05 +0100
Subject: [PATCH 36/59] fix: refs #8602 disable use-like option in EntryBuys
 component

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

diff --git a/src/pages/Entry/Card/EntryBuys.vue b/src/pages/Entry/Card/EntryBuys.vue
index 3990fde19..89c6d52c4 100644
--- a/src/pages/Entry/Card/EntryBuys.vue
+++ b/src/pages/Entry/Card/EntryBuys.vue
@@ -652,6 +652,7 @@ onMounted(() => {
                     :fields="['id', 'nickname']"
                     option-label="nickname"
                     sort-by="nickname ASC"
+                    :use-like="false"
                 />
                 <VnSelect
                     :label="t('Family')"

From ca4e02a2bf0e3a07ee91a88c83b20cd68b87cac1 Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Tue, 25 Mar 2025 08:39:19 +0100
Subject: [PATCH 37/59] chore: update changelog

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

diff --git a/CHANGELOG.md b/CHANGELOG.md
index dd75a00a4..3b654a1ad 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,214 @@
+# Version 25.12 - 2025-03-25
+
+### Added 🆕
+
+- chore: add junit-merge dependency to package.json by:alexm
+- chore: downgrade version from 25.14.0 to 25.12.0 in package.json by:alexm
+- chore: reduce page load timeout in Cypress configuration by:alexm
+- chore: refs #6695 update Cypress to version 14.1.0 and simplify test execution in Jenkinsfile by:alexm
+- chore: refs #8602 add comments for clarity in Cypress commands file by:pablone
+- chore: refs #8602 enhance Cypress support files with detailed comments and organization by:pablone
+- ci: refs #6695 feat jenkins parallel e2e by:alexm
+- feat: integrate vue-router to enhance routing capabilities in ZoneCard component by:alexm
+- feat: refs #6695 implement parallel Cypress testing and enhance timeout configurations by:alexm
+- feat: refs #6695 update Cypress parallel test execution to use 3 instances by:alexm
+- feat: refs #6802 add dash placeholder for empty department names in InvoiceOut list by:jgallego
+- feat: refs #6802 add DepartmentDescriptorProxy to InvoiceOutList and update translations by:jgallego
+- feat: refs #6802 add DepartmentDescriptorProxy to various components and update department handling by:jgallego
+- feat: refs #7587 add 'ticketClaimed' translation and implement claims retrieval in TicketDescriptor by:jtubau
+- feat: refs #7949 show new field in ticket sales by:Jon
+- feat: refs #8045 added new logic to show the correct icon and the correct path to redirect by:Jon
+- feat: refs #8045 modified icon and route to redirect from CardDescriptor by:Jon
+- feat: refs #8074 modified spinner size by:Jon
+- feat: refs #8600 added calendar e2e and modified basic data by:Jon
+- feat: refs #8600 added deliveryDays and modified warehouse E2Es by:Jon
+- feat: refs #8600 added new tests for zoneSummary & zoneLocations by:provira
+- feat: refs #8602 add custom Cypress commands for improved element interaction and request handling by:pablone
+- feat: refs #8602 add new Cypress command for clicking buttons with icons by:pablone
+- feat: refs #8602 add remove functionality for tag filters in EntryBuys component by:pablone
+- feat: refs #8602 add sorting options for select fields and update locale files with supplier name by:pablone
+- feat: refs #8602 refactor EntryBuys component and enhance observation tests by:pablone
+- feat: refs #8602 remove unused state property from useArrayDataStore by:pablone
+- feat: refs #8602 remove unused URL property from VnTable in ClaimList component by:pablone
+- feat: refs #8602 skip warehouse creation and removal test in ZoneWarehouse spec by:pablone
+- feat: refs #8602 streamline beforeSaveFn execution in CrudModel component by:pablone
+- feat: refs #8602 streamline beforeSaveFn execution in VnTable component by:pablone
+- feat: refs #8602 streamline filter logic in EntryBuys component by:pablone
+- feat: refs #8602 update entry components and tests, add data-cy attributes for Cypress integration by:pablone
+- feat: refs #8602 update localization for purchased spaces and enhance Entry components with new labels by:pablone
+- feat: refs #8606 adapt module to VnCatdBeta by:Jon
+- feat: refs #8612 added summary button & changed e2e tests by:provira
+- feat: refs #8612 changed shelving to VnTable & created e2e tests by:provira
+- feat: refs #8616 add summary prop to CardDescriptor in RoadmapDescriptor and WorkerDescriptor by:jtubau
+- feat: refs #8616 add VnCheckbox component to VnFilter and update prop types in VnFilterPanel and VnSearchbar by:jtubau
+- feat: refs #8630 add Agency and Vehicle descriptor components with summary props by:jtubau
+- feat: refs #8638 add AWB field to travel and entry forms, update translations and styles by:pablone
+- feat: refs #8638 add data attributes for transfer buys functionality in EntryBuys.vue and corresponding tests by:pablone
+- feat: refs #8648 enhance roadmapList tests with improved selectors and additional scenarios by:jtubau
+- feat: refs #8664 add CmrFilter component and integrate it into CmrList for enhanced filtering options by:jtubau
+- feat: refs #8721 add ticket navigation and update route columns by:jtubau
+- feat: run.sh build neccessary images by:alexm
+- feat: update Jenkinsfile to pull Docker images for back and db services by:alexm
+- feat: update labels and add department selection in InvoiceOut filter and list by:jgallego
+- refactor: refs #8626 update button styles and improve route redirection logic by:jtubau
+- style: refs #8041 new variable by:benjaminedc
+
+### Changed 📦
+
+- feat: refs #8602 refactor EntryBuys component and enhance observation tests by:pablone
+- refactor(cypress): refs #6695 simplify parallel test execution script by:alexm
+- refactor: deleted useless (origin/Warmfix-DepartmentIcon) by:Jon
+- refactor: refs #6695 enable ClaimNotes test suite by:alexm
+- refactor: refs #6695 fix invoiceOutSummary by:alexm
+- refactor: refs #6695 improve notification check and extend waitForElement timeout by:alexm
+- refactor: refs #6695 remove mocha dependency and optimize Cypress command execution by:alexm
+- refactor: refs #6695 skips by:alexm
+- refactor: refs #6695 skip zoneWarehouse by:alexm
+- refactor: refs #6695 streamline Cypress test execution and remove deprecated configurations by:alexm
+- refactor: refs #6802 replace salesPerson references with department in claims and tickets by:jgallego
+- refactor: refs #6802 replace 'salesPerson' terminology with 'team' across multiple locales and components by:jgallego
+- refactor: refs #6802 update import paths for DepartmentDescriptorProxy to use Worker directory by:jgallego
+- refactor: refs #6802 update InvoiceOutNegativeBases to use Department instead of Worker by:jgallego
+- refactor: refs #6802 update TicketFilter and TicketSale components to use departmentFk and adjust API endpoints by:jgallego
+- refactor: refs #8041 unify class link and unify titles to VnTitles by:benjaminedc
+- refactor: refs #8045 modified icon and module const by:Jon
+- refactor: refs #8197 rename VnCardBeta to VnCard by:alexm
+- refactor: refs #8197 simplify menu retrieval logic in LeftMenu component by:alexm
+- refactor: refs #8322 changed Wagon component to use VnSection/VnCardBeta by:provira
+- refactor: refs #8322 remove keyBinding from Wagon router module by:alexm
+- refactor: refs #8322 update WagonCard component and routing structure by:alexm
+- refactor: refs #8370 modified function to get the correct date by:Jon
+- refactor: refs #8472 remove added div and add class to VnInput by:jtubau
+- refactor: refs #8472 unified styling for the more-create-dialog slot to ensure consistency across all scenarios by:jtubau
+- refactor: refs #8472 update class names from q-span-2 to col-span-2 for consistency in layout by:jtubau
+- refactor: refs #8600 changed test case description by:provira
+- refactor: refs #8600 modified make invoice and send dialog e2es by:Jon
+- refactor: refs #8600 modified upcomingDeliveries e2e and created deliveryDays by:Jon
+- refactor: refs #8600 modified zoneSummary e2e by:Jon
+- refactor: refs #8602 remove redundant date input test from entryList.spec.js by:pablone
+- refactor: refs #8606 clear some warnings by:Jon
+- refactor: refs #8606 deleted code and fixed translation by:Jon
+- refactor: refs #8606 merged previous and e2e changes and corrected minor errors by:Jon
+- refactor: refs #8606 requested changes by:Jon
+- refactor: refs #8616 integrate summary dialog and update navigation in Agency and Vehicle components by:jtubau
+- refactor: refs #8616 integrate VnSelectWorker component in RouteList and optimize format functions by:jtubau
+- refactor: refs #8616 simplify template bindings and improve link generation in VehicleSummary by:jtubau
+- refactor: refs #8616 update routing components for AgencyList and RouteRoadmap in route.js by:jtubau
+- refactor: refs #8619 simplify empty data check in RouteDescriptor component by:jtubau
+- refactor: refs #8626 add cardVisible property to RouteList columns by:jtubau
+- refactor: refs #8626 add formatting for agency and vehicle columns in RouteList by:jtubau
+- refactor: refs #8626 enhance Worker and Agency components with data attributes and improved routing by:jtubau
+- refactor: refs #8626 improve test messages and selectors in route tests by:jtubau
+- refactor: refs #8626 update button styles and improve route redirection logic by:jtubau
+- refactor: refs #8626 update RouteList columns and enable AgencyWorkCenter tests by:jtubau
+- refactor: refs #8630 add vehicle translations and enhance route list columns by:jtubau
+- refactor: refs #8648 update roadmap deletion test to use current element text by:jtubau
+- refactor: refs #8664 enhance CmrList component with query initialization and user parameters by:jtubau
+- refactor: refs #8664 localization files by:jtubau
+- refactor: refs #8664 remove CmrFilter and replace with VnSearchbar in CmrList by:jtubau
+- refactor: remove unnecessary login and reload calls in ClaimDevelopment tests by:alexm
+- refactor: simplify client selection in order creation test by:alexm
+- refactor: update client ID input selector and remove viewport setting by:alexm
+- test: refs #8197 comment out ticket list tests for refactoring by:alexm
+- test: refs #8626 refactor notification check in routeList.spec.js by:jtubau
+- test: refs #8626 refactor routeList.spec.js to use a constant for summary URL by:jtubau
+- test: refs #8626 refactor routeList.spec.js to use selectors and improve readability by:jtubau
+
+### Fixed 🛠️
+
+- fix: add --init flag to Docker container for Cypress tests by:alexm
+- fix: agency list filters by:jtubau
+- fix: align Article label to the left in EntryBuys component by:alexm
+- fix: card descriptor imports by:Jon
+- fix: card descriptor merge by:Jon
+- fix(ClaimAction): update shelving options to use URL instead of static data by:jgallego
+- fix(ClaimSummary): clean url by:alexm
+- fix(cypress.config.js): refs #6695 update reporter to junit and remove unused dependencies by:alexm
+- fix(cypressParallel.sh): refs #6695 improve script readability by:alexm
+- fix(cypressParallel.sh): refs #6695 improve test execution output for clarity by:alexm
+- fix(cypressParallel.sh): refs #6695 simplify test execution output format by:alexm
+- fix(cypress scripts): refs #6695 improve cleanup process and adjust output redirection by:alexm
+- fix: fixed department descriptor icon by:Jon
+- fix: fixed submodule descriptors icons by:Jon
+- fix(invoiceOutSummary.spec.js): refs #6695 remove unnecessary visibility check for descriptor by:alexm
+- fix(Jenkinsfile): reduce parallel Cypress test execution from 3 to 2 by:alexm
+- fix(Jenkinsfile): refs #6695 add credentials for Docker login in E2E stage by:alexm
+- fix(Jenkinsfile): refs #6695 change parallel test execution from 4 to 2 by:alexm
+- fix(Jenkinsfile): refs #6695 increase parallel test execution from 2 to 4 by:alexm
+- fix(Jenkinsfile): refs #6695 update parallel test execution to 4 by:alexm
+- fix(LeftMenu): refs #8197 handle missing children in findRoute and update menu structure by:alexm
+- fix: refs #6695 update Cypress configuration and test result paths by:alexm
+- fix: refs #6695 update Jenkinsfile to build Docker image correctly and modify logout test visit method by:alexm
+- fix: refs #6695 update Jenkinsfile to remove specific e2e XML files and adjust Cypress parallel execution by:alexm
+- fix: refs #6695 update Jenkinsfile to source cypressParallel.sh correctly by:alexm
+- fix: refs #6695 update visit method in TicketLackDetail.spec.js to prevent page reload by:alexm
+- fix: refs #6802 update import path for DepartmentDescriptorProxy in OrderList.vue by:jgallego
+- fix: refs #6802 update OrderFilter to use department relation instead of salesPerson by:jgallego
+- fix: refs #8041 update redirection from preview to summary in ShelvingList tests by:benjaminedc
+- fix: refs #8041 update selector for summary header in ParkingList tests by:benjaminedc
+- fix: refs #8041 update summaryHeader selector in ParkingList test by:benjaminedc
+- fix: refs #8322 update order property for WagonList component by:alexm
+- fix: refs #8370 change param rely on month by:Jon
+- fix: refs #8417 added data-cy to all files and fixed test by:provira
+- fix: refs #8417 added data-cy to delete button by:provira
+- fix: refs #8417 fixed claimPhoto e2e by:provira
+- fix: refs #8417 fixed claimPhoto e2e test by:provira
+- fix: refs #8417 fixed e2e test by:provira
+- fix: refs #8417 fixed e2e test case by:provira
+- fix: refs #8417 fixed failing test case by:provira
+- fix: refs #8417 fixed invoiceOutSummary e2e test by:provira
+- fix: refs #8417 removed .only by:provira
+- fix: refs #8583 basicData, business, summary by:carlossa
+- fix: refs #8583 basicData e2e by:carlossa
+- fix: refs #8583 basicData timeControl by:carlossa
+- fix: refs #8583 cypressconf by:carlossa
+- fix: refs #8583 dataCy operator by:carlossa
+- fix: refs #8583 fix AddCard by:carlossa
+- fix: refs #8583 mutual create by:carlossa
+- fix: refs #8583 operator by:carlossa
+- fix: refs #8583 remove workerTimeControl by:carlossa
+- fix: refs #8583 tMutual, tNotes, TOperator by:carlossa
+- fix: refs #8583 wBusiness by:carlossa
+- fix: refs #8583 wBusiness e2e by:carlossa
+- fix: refs #8583 workerBasicData & workerTimeControl by:carlossa
+- fix: refs #8583 workerBusiness by:carlossa
+- fix: refs #8583 workerBusiness e2e by:carlossa
+- fix: refs #8583 workerBusiness test by:carlossa
+- fix: refs #8583 workerE2E by:carlossa
+- fix: refs #8583 worker mutual e2e by:carlossa
+- fix: refs #8583 workerSummary test by:carlossa
+- fix: refs #8583 workerTimeControl by:carlossa
+- fix: refs #8583 workerTimeControl e2e by:carlossa
+- fix: refs #8600 e2e by:Jon
+- fix: refs #8600 fixed calendar e2e by:Jon
+- fix: refs #8600 fixed e2e and skip client ones by:Jon
+- fix: refs #8600 fixed e2e by:Jon
+- fix: refs #8600 fixed invoiceOut summary e2e by:Jon
+- fix: refs #8600 fixed zoneList & added test case to zoneSummary by:provira
+- fix: refs #8600 zone basic data e2e and skip intermitent invoice out summary it by:Jon
+- fix: refs #8602 delete unused entryDms and stockBought test files (origin/8581-e2eInvoiceIn) by:pablone
+- fix: refs #8606 deleted code by:Jon
+- fix: refs #8612 changed QCheckbox for VnCheckbox by:provira
+- fix: refs #8612 fixed shelving e2e tests by:provira
+- fix: refs #8616 add conditional for SupplierDescriptorProxy and bind attributes in CardDescriptor by:jtubau
+- fix: refs #8616 remove redundant v-on binding from QCheckbox in VnCheckbox.vue by:jtubau
+- fix: refs #8616 update binding syntax for is-editable prop in AgencyList.vue by:jtubau
+- fix: refs #8616 update FormModel prop from 'update-url' to 'url-update' in Agency and RoadMap BasicData by:jtubau
+- fix: refs #8619 handle empty ticket records in RouteDescriptor component by:jtubau
+- fix: refs #8619 update route descriptor to handle empty ticket records and adjust test cases by:jtubau
+- fix: refs #8626 remove duplicate ref attribute from RouteList.vue by:jtubau
+- fix: refs #8630 remove duplicated locations by:jtubau
+- fix: refs #8638 restore invoiceInBasicData by:pablone
+- fix: refs #8638 update comment formatting in VnTable.vue by:pablone
+- fix: refs #8638 update null check for maxlength validation in VnInput.vue by:pablone
+- fix: simplify menu structure in monitor router module (origin/fix_monitor_leftMenu) by:Javier Segarra
+- refactor: refs #6695 fix invoiceOutSummary by:alexm
+- refactor: refs #8606 deleted code and fixed translation by:Jon
+- test: fix intermitent e2e by:alexm
+- test: fix orderList e2e, unestables by:alexm
+- test(OrderList): fix inconsistency by:alexm
+- test(TicketList): fix inconsistency by:alexm
+
 # Version 25.10 - 2025-03-11
 
 ### Added 🆕

From 0361958b47c47ef94819d0fec2ca67b99a5cc103 Mon Sep 17 00:00:00 2001
From: jorgep <jorgep@verdnatura.es>
Date: Tue, 25 Mar 2025 09:37:46 +0100
Subject: [PATCH 38/59] test: refs #8388 remove exclusive focus from Invoice
 creation test

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

diff --git a/test/cypress/integration/invoiceIn/invoiceInList.spec.js b/test/cypress/integration/invoiceIn/invoiceInList.spec.js
index 3338684d6..d0d87d9f0 100644
--- a/test/cypress/integration/invoiceIn/invoiceInList.spec.js
+++ b/test/cypress/integration/invoiceIn/invoiceInList.spec.js
@@ -36,7 +36,7 @@ describe('InvoiceInList', () => {
         cy.get(summaryHeaders).eq(4).contains('Vat');
     });
 
-    it.only('should create a new Invoice', () => {
+    it('should create a new Invoice', () => {
         cy.dataCy('vnTableCreateBtn').click();
         cy.fillInForm({ ...mock }, { attr: 'data-cy' });
         cy.dataCy('FormModelPopup_save').click();

From 0014356b3358709a4d5401d49f592e1bf93a2109 Mon Sep 17 00:00:00 2001
From: Javier Segarra <jsegarra@verdnatura.es>
Date: Tue, 25 Mar 2025 10:08:58 +0100
Subject: [PATCH 39/59] fix: use store instead formData

---
 src/pages/Ticket/Card/BasicData/TicketBasicDataView.vue | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/pages/Ticket/Card/BasicData/TicketBasicDataView.vue b/src/pages/Ticket/Card/BasicData/TicketBasicDataView.vue
index 3c2fe95e5..76191b099 100644
--- a/src/pages/Ticket/Card/BasicData/TicketBasicDataView.vue
+++ b/src/pages/Ticket/Card/BasicData/TicketBasicDataView.vue
@@ -44,7 +44,7 @@ const getPriceDifference = async () => {
         shipped: ticket.value.shipped,
     };
     const { data } = await axios.post(
-        `tickets/${formData.value.id}/priceDifference`,
+        `tickets/${ticket.value.id}/priceDifference`,
         params,
     );
     ticket.value.sale = data;
@@ -71,7 +71,7 @@ const submit = async () => {
     };
 
     const { data } = await axios.post(
-        `tickets/${formData.value.id}/componentUpdate`,
+        `tickets/${ticket.value.id}/componentUpdate`,
         params,
     );
 

From 9446202dee42c3a48e2aacb17c5a04d626f1457d Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Tue, 25 Mar 2025 11:30:09 +0100
Subject: [PATCH 40/59] fix: update file path in useDescriptorStore to remove
 leading slash

---
 src/stores/useDescriptorStore.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/stores/useDescriptorStore.js b/src/stores/useDescriptorStore.js
index 89189f32e..c6a95fa85 100644
--- a/src/stores/useDescriptorStore.js
+++ b/src/stores/useDescriptorStore.js
@@ -8,7 +8,7 @@ export const useDescriptorStore = defineStore('descriptorStore', () => {
         if (Object.keys(descriptors).length) return descriptors;
 
         const currentDescriptors = {};
-        const files = import.meta.glob(`/src/**/*DescriptorProxy.vue`);
+        const files = import.meta.glob(`src/**/*DescriptorProxy.vue`);
         const moduleParser = {
             account: 'user',
             client: 'customer',

From af5a850311debf2d612e4dd1d824a9d5a4d37ee2 Mon Sep 17 00:00:00 2001
From: Javier Segarra <jsegarra@verdnatura.es>
Date: Tue, 25 Mar 2025 11:41:04 +0100
Subject: [PATCH 41/59] fix: remove create prop departmentFk

---
 src/pages/Customer/Card/CustomerDescriptor.vue  |  9 ---------
 .../Customer/Card/CustomerDescriptorMenu.vue    | 17 -----------------
 src/pages/Order/OrderList.vue                   |  1 -
 3 files changed, 27 deletions(-)

diff --git a/src/pages/Customer/Card/CustomerDescriptor.vue b/src/pages/Customer/Card/CustomerDescriptor.vue
index 8978c00f1..bd127c9ed 100644
--- a/src/pages/Customer/Card/CustomerDescriptor.vue
+++ b/src/pages/Customer/Card/CustomerDescriptor.vue
@@ -105,15 +105,6 @@ const debtWarning = computed(() => {
                 >
                     <QTooltip>{{ t('customer.card.isDisabled') }}</QTooltip>
                 </QIcon>
-
-                <QIcon
-                    v-if="entity?.substitutionAllowed"
-                    name="help"
-                    size="xs"
-                    color="primary"
-                >
-                    <QTooltip>{{ t('Allowed substitution') }}</QTooltip>
-                </QIcon>
                 <QIcon
                     v-if="!entity.account?.active"
                     color="primary"
diff --git a/src/pages/Customer/Card/CustomerDescriptorMenu.vue b/src/pages/Customer/Card/CustomerDescriptorMenu.vue
index aea45721c..fb78eab69 100644
--- a/src/pages/Customer/Card/CustomerDescriptorMenu.vue
+++ b/src/pages/Customer/Card/CustomerDescriptorMenu.vue
@@ -61,16 +61,6 @@ const openCreateForm = (type) => {
         .join('&');
     useOpenURL(`/#/${type}/list?${params}`);
 };
-const updateSubstitutionAllowed = async () => {
-    try {
-        await axios.patch(`Clients/${route.params.id}`, {
-            substitutionAllowed: !$props.customer.substitutionAllowed,
-        });
-        notify('globals.notificationSent', 'positive');
-    } catch (error) {
-        notify(error.message, 'positive');
-    }
-};
 </script>
 
 <template>
@@ -79,13 +69,6 @@ const updateSubstitutionAllowed = async () => {
             {{ t('globals.pageTitles.createTicket') }}
         </QItemSection>
     </QItem>
-    <QItem v-ripple clickable>
-        <QItemSection @click="updateSubstitutionAllowed()">{{
-            $props.customer.substitutionAllowed
-                ? t('Disable substitution')
-                : t('Allow substitution')
-        }}</QItemSection>
-    </QItem>
     <QItem v-ripple clickable>
         <QItemSection @click="showSmsDialog()">{{ t('Send SMS') }}</QItemSection>
     </QItem>
diff --git a/src/pages/Order/OrderList.vue b/src/pages/Order/OrderList.vue
index d75390d96..1241c4ee2 100644
--- a/src/pages/Order/OrderList.vue
+++ b/src/pages/Order/OrderList.vue
@@ -65,7 +65,6 @@ const columns = computed(() => [
         attrs: {
             url: 'Departments',
         },
-        create: true,
         columnField: {
             component: null,
         },

From c0e9efc5d8b36fafd33de1547c5b7cdab02eab13 Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Tue, 25 Mar 2025 11:54:14 +0100
Subject: [PATCH 42/59] fix(useDescriptorStore): simplify async component
 import logic

---
 src/stores/useDescriptorStore.js | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/src/stores/useDescriptorStore.js b/src/stores/useDescriptorStore.js
index c6a95fa85..425411709 100644
--- a/src/stores/useDescriptorStore.js
+++ b/src/stores/useDescriptorStore.js
@@ -16,9 +16,7 @@ export const useDescriptorStore = defineStore('descriptorStore', () => {
         for (const file in files) {
             const name = file.split('/').at(-1).slice(0, -19).toLowerCase();
             const descriptor = moduleParser[name] ?? name;
-            currentDescriptors[descriptor + 'Fk'] = defineAsyncComponent(
-                () => import(/* @vite-ignore */ file),
-            );
+            currentDescriptors[descriptor + 'Fk'] = defineAsyncComponent(files[file]);
         }
         setDescriptors(currentDescriptors);
         return currentDescriptors;

From 79e6530d3965e45174fb96ae3f74ba1dacf462c1 Mon Sep 17 00:00:00 2001
From: Javier Segarra <jsegarra@verdnatura.es>
Date: Tue, 25 Mar 2025 12:23:49 +0100
Subject: [PATCH 43/59] docs: add production serving instructions to README

---
 README.md | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/README.md b/README.md
index d280e29ce..8eff99137 100644
--- a/README.md
+++ b/README.md
@@ -49,3 +49,9 @@ pnpm run test:e2e:summary
 ```bash
 quasar build
 ```
+
+### Serve the app for production
+
+```bash
+quasar build quasar serve dist/spa --host 0.0.0.0 --proxy=./proxy-serve.js
+```

From 6dffa7823545a8b6995775343f31b0a008bce1ba Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Tue, 25 Mar 2025 12:47:43 +0100
Subject: [PATCH 44/59] fix(useDescriptorStore): correct file path for
 descriptor proxy imports

---
 src/stores/useDescriptorStore.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/stores/useDescriptorStore.js b/src/stores/useDescriptorStore.js
index 425411709..a5b83a42e 100644
--- a/src/stores/useDescriptorStore.js
+++ b/src/stores/useDescriptorStore.js
@@ -8,7 +8,7 @@ export const useDescriptorStore = defineStore('descriptorStore', () => {
         if (Object.keys(descriptors).length) return descriptors;
 
         const currentDescriptors = {};
-        const files = import.meta.glob(`src/**/*DescriptorProxy.vue`);
+        const files = import.meta.glob(`/src/**/*DescriptorProxy.vue`);
         const moduleParser = {
             account: 'user',
             client: 'customer',

From 77df2d40ecd32ff2ea6dc70b5cd2938b7e32d851 Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Tue, 25 Mar 2025 12:51:21 +0100
Subject: [PATCH 45/59] fix(VnLog): refs #6994 simplify value binding and
 improve descriptor handling

---
 src/components/common/VnLog.vue      | 12 +++++-------
 src/components/common/VnLogValue.vue | 24 +++++++++++++++---------
 src/stores/useDescriptorStore.js     |  2 +-
 3 files changed, 21 insertions(+), 17 deletions(-)

diff --git a/src/components/common/VnLog.vue b/src/components/common/VnLog.vue
index 804147539..7402ceb3e 100644
--- a/src/components/common/VnLog.vue
+++ b/src/components/common/VnLog.vue
@@ -561,9 +561,7 @@ watch(
                                                                         }}:
                                                                     </span>
                                                                     <VnLogValue
-                                                                        :value="
-                                                                            value.val.val
-                                                                        "
+                                                                        :value="value.val"
                                                                         :name="value.name"
                                                                     />
                                                                 </QItem>
@@ -616,7 +614,7 @@ watch(
                                                         {{ prop.nameI18n }}:
                                                     </span>
                                                     <VnLogValue
-                                                        :value="prop.val.val"
+                                                        :value="prop.val"
                                                         :name="prop.name"
                                                     />
                                                     <span
@@ -647,7 +645,7 @@ watch(
                                                     </span>
                                                     <span v-if="log.action == 'update'">
                                                         <VnLogValue
-                                                            :value="prop.old.val"
+                                                            :value="prop.old"
                                                             :name="prop.name"
                                                         />
                                                         <span
@@ -658,7 +656,7 @@ watch(
                                                         </span>
                                                         →
                                                         <VnLogValue
-                                                            :value="prop.val.val"
+                                                            :value="prop.val"
                                                             :name="prop.name"
                                                         />
                                                         <span
@@ -670,7 +668,7 @@ watch(
                                                     </span>
                                                     <span v-else="prop.old.val">
                                                         <VnLogValue
-                                                            :value="prop.val.val"
+                                                            :value="prop.val"
                                                             :name="prop.name"
                                                         />
                                                         <span
diff --git a/src/components/common/VnLogValue.vue b/src/components/common/VnLogValue.vue
index df0be4011..3f1617ce7 100644
--- a/src/components/common/VnLogValue.vue
+++ b/src/components/common/VnLogValue.vue
@@ -5,18 +5,24 @@ import { computed } from 'vue';
 const descriptorStore = useDescriptorStore();
 
 const $props = defineProps({
-    name: { type: [String], default: undefined },
+    value: { type: Object, default: () => {} },
+    name: { type: String, default: undefined },
 });
 
 const descriptor = computed(() => descriptorStore.has($props.name));
 </script>
 <template>
-    <VnJsonValue v-bind="$attrs" />
-    <QIcon
-        name="launch"
-        class="link"
-        v-if="$attrs.value && descriptor"
-        :data-cy="'iconLaunch-' + $props.name"
-    />
-    <component :is="descriptor" :id="$attrs.value" v-if="$attrs.value && descriptor" />
+    <VnJsonValue :value="value.val" />
+    <span
+        v-if="(value.id || typeof value.val == 'number') && descriptor"
+        style="margin-left: 2px"
+    >
+        <QIcon
+            name="launch"
+            class="link"
+            :data-cy="'iconLaunch-' + $props.name"
+            style="padding-bottom: 2px"
+        />
+        <component :is="descriptor" :id="value.id ?? value.val" />
+    </span>
 </template>
diff --git a/src/stores/useDescriptorStore.js b/src/stores/useDescriptorStore.js
index a5b83a42e..be342b016 100644
--- a/src/stores/useDescriptorStore.js
+++ b/src/stores/useDescriptorStore.js
@@ -11,7 +11,7 @@ export const useDescriptorStore = defineStore('descriptorStore', () => {
         const files = import.meta.glob(`/src/**/*DescriptorProxy.vue`);
         const moduleParser = {
             account: 'user',
-            client: 'customer',
+            customer: 'client',
         };
         for (const file in files) {
             const name = file.split('/').at(-1).slice(0, -19).toLowerCase();

From 31205d40d39de60b6cf6e6f3aad43163cd1b3cff Mon Sep 17 00:00:00 2001
From: pablone <pablone@verdnatura.es>
Date: Tue, 25 Mar 2025 14:01:29 +0100
Subject: [PATCH 46/59] fix: update default DMS code and improve filter
 handling in various components

---
 src/components/common/VnDmsInput.vue     |  2 +-
 src/pages/Entry/Card/EntryBuys.vue       |  2 +-
 src/pages/Entry/Card/EntryDescriptor.vue |  2 +-
 src/pages/Entry/EntryStockBought.vue     |  1 +
 src/pages/Travel/Card/TravelSummary.vue  | 10 ++++++----
 src/pages/Travel/TravelFilter.vue        |  4 +++-
 6 files changed, 13 insertions(+), 8 deletions(-)

diff --git a/src/components/common/VnDmsInput.vue b/src/components/common/VnDmsInput.vue
index 25d625d5d..5a3ef351b 100644
--- a/src/components/common/VnDmsInput.vue
+++ b/src/components/common/VnDmsInput.vue
@@ -15,7 +15,7 @@ const editDownloadDisabled = ref(false);
 const $props = defineProps({
     defaultDmsCode: {
         type: String,
-        default: 'InvoiceIn',
+        default: 'invoiceIn',
     },
     disable: {
         type: Boolean,
diff --git a/src/pages/Entry/Card/EntryBuys.vue b/src/pages/Entry/Card/EntryBuys.vue
index a93b0801b..dedc9fc85 100644
--- a/src/pages/Entry/Card/EntryBuys.vue
+++ b/src/pages/Entry/Card/EntryBuys.vue
@@ -648,7 +648,7 @@ onMounted(() => {
         :url="`Entries/${entityId}/getBuyList`"
         search-url="EntryBuys"
         save-url="Buys/crud"
-        :filter="filter"
+        :filter="editableMode ? filter : {}"
         :disable-option="{ card: true }"
         v-model:selected="selectedRows"
         @on-fetch="() => footerFetchDataRef.fetch()"
diff --git a/src/pages/Entry/Card/EntryDescriptor.vue b/src/pages/Entry/Card/EntryDescriptor.vue
index 784f6e8a3..9a8b79744 100644
--- a/src/pages/Entry/Card/EntryDescriptor.vue
+++ b/src/pages/Entry/Card/EntryDescriptor.vue
@@ -147,7 +147,7 @@ async function deleteEntry() {
 <template>
     <CardDescriptor
         :url="`Entries/${entityId}`"
-        :user-filter="entryFilter"
+        :filter="entryFilter"
         title="supplier.nickname"
         data-key="Entry"
         width="lg-width"
diff --git a/src/pages/Entry/EntryStockBought.vue b/src/pages/Entry/EntryStockBought.vue
index 6168f0737..9e97e2ad5 100644
--- a/src/pages/Entry/EntryStockBought.vue
+++ b/src/pages/Entry/EntryStockBought.vue
@@ -116,6 +116,7 @@ const filter = computed(() => ({
             hour: 0,
             minute: 0,
             second: 0,
+            milliseconds: 0,
         }),
         m3: { neq: null },
     },
diff --git a/src/pages/Travel/Card/TravelSummary.vue b/src/pages/Travel/Card/TravelSummary.vue
index 9f9552611..da933de60 100644
--- a/src/pages/Travel/Card/TravelSummary.vue
+++ b/src/pages/Travel/Card/TravelSummary.vue
@@ -199,7 +199,11 @@ const entriesTotals = computed(() => {
 
     entriesTableRows.value.forEach((row) => {
         for (const key in totals) {
-            totals[key] += row[key] || 0;
+            if (key === 'cc') {
+                totals[key] += Math.ceil(row[key] || 0);
+            } else {
+                totals[key] += row[key] || 0;
+            }
         }
     });
 
@@ -337,9 +341,7 @@ const getLink = (param) => `#/travel/${entityId.value}/${param}`;
                 <VnLv :label="t('globals.totalEntries')" :value="travel.totalEntries" />
                 <VnLv
                     :label="t('travel.summary.availabled')"
-                    :value="
-                        dashIfEmpty(toDateTimeFormat(travel.availabled))
-                    "
+                    :value="dashIfEmpty(toDateTimeFormat(travel.availabled))"
                 />
             </QCard>
             <QCard class="full-width">
diff --git a/src/pages/Travel/TravelFilter.vue b/src/pages/Travel/TravelFilter.vue
index 4a9c80952..d2cf6092d 100644
--- a/src/pages/Travel/TravelFilter.vue
+++ b/src/pages/Travel/TravelFilter.vue
@@ -89,7 +89,7 @@ defineExpose({ states });
                 />
                 <VnSelect
                     :label="t('travel.warehouseOut')"
-                    v-model="params.warehouseOut"
+                    v-model="params.warehouseOutFk"
                     @update:model-value="searchFn()"
                     url="warehouses"
                     :use-like="false"
@@ -140,6 +140,7 @@ en:
         ref: Reference
         agency: Agency
         warehouseInFk: Warehouse In
+        warehouseOutFk: Warehouse Out
         shipped: Shipped
         shipmentHour: Shipment Hour
         warehouseOut: Warehouse Out
@@ -153,6 +154,7 @@ es:
         ref: Referencia
         agency: Agencia
         warehouseInFk: Alm.Entrada
+        warehouseOutFk: Alm.Salida
         shipped: F.Envío
         shipmentHour: Hora de envío
         warehouseOut: Alm.Salida

From 90f6486fc1495cdd347a79d1971c1e94513ce9fd Mon Sep 17 00:00:00 2001
From: Jon <jon@verdnatura.es>
Date: Tue, 25 Mar 2025 14:20:38 +0100
Subject: [PATCH 47/59] refactor: refs #7358 use QBadge instead of QChip

---
 src/components/NavBar.vue | 13 +++++--------
 1 file changed, 5 insertions(+), 8 deletions(-)

diff --git a/src/components/NavBar.vue b/src/components/NavBar.vue
index 6365fcd07..c71a0a887 100644
--- a/src/components/NavBar.vue
+++ b/src/components/NavBar.vue
@@ -25,9 +25,9 @@ const getEnvironment = computed(() => {
         case 'development':
             return 'DEV';
         case 'production':
-            return;
+            return null;
         default:
-            return env.toUpperCase();
+            return env;
     }
 });
 onMounted(() => stateStore.setMounted());
@@ -60,10 +60,10 @@ const refresh = () => window.location.reload();
                         {{ t('globals.backToDashboard') }}
                     </QTooltip>
                 </QBtn>
+                <QBadge v-if="getEnvironment" color="primary" align="top">
+                    {{ getEnvironment }}
+                </QBadge>
             </RouterLink>
-            <QChip class="q-ml-xs q-mr-xs envChip">
-                {{ getEnvironment }}
-            </QChip>
             <VnBreadcrumbs v-if="$q.screen.gt.sm" />
             <QSpinner
                 color="primary"
@@ -132,7 +132,4 @@ const refresh = () => window.location.reload();
 .q-header {
     background-color: var(--vn-section-color);
 }
-.envChip {
-    background-color: $primary;
-}
 </style>

From ef3a2c0ee99b5f23f7ad2ef737c4f96174730888 Mon Sep 17 00:00:00 2001
From: Jon <jon@verdnatura.es>
Date: Tue, 25 Mar 2025 15:10:57 +0100
Subject: [PATCH 48/59] refactor: refs #7358 use location.hostname

---
 src/components/NavBar.vue | 15 ++++++---------
 1 file changed, 6 insertions(+), 9 deletions(-)

diff --git a/src/components/NavBar.vue b/src/components/NavBar.vue
index c71a0a887..7329ddae2 100644
--- a/src/components/NavBar.vue
+++ b/src/components/NavBar.vue
@@ -18,18 +18,15 @@ const state = useState();
 const user = state.getUser();
 const appName = 'Lilium';
 const pinnedModulesRef = ref();
-const env = process.env.NODE_ENV;
+const hostname = window.location.hostname;
+const env = ref();
 
 const getEnvironment = computed(() => {
-    switch (env) {
-        case 'development':
-            return 'DEV';
-        case 'production':
-            return null;
-        default:
-            return env;
-    }
+    env.value = hostname.split('-');
+    if (env.value.length <= 1) return;
+    return env.value[0];
 });
+
 onMounted(() => stateStore.setMounted());
 const refresh = () => window.location.reload();
 </script>

From 73c6b7dea9ee720d44411424be758ec95c42012b Mon Sep 17 00:00:00 2001
From: jorgep <jorgep@verdnatura.es>
Date: Tue, 25 Mar 2025 17:34:10 +0100
Subject: [PATCH 49/59] fix: refs #8388 update tooltip message in
 InvoiceInSummary to include total taxable base

---
 src/pages/InvoiceIn/Card/InvoiceInSummary.vue | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/src/pages/InvoiceIn/Card/InvoiceInSummary.vue b/src/pages/InvoiceIn/Card/InvoiceInSummary.vue
index dad1da8d6..74936f00a 100644
--- a/src/pages/InvoiceIn/Card/InvoiceInSummary.vue
+++ b/src/pages/InvoiceIn/Card/InvoiceInSummary.vue
@@ -304,7 +304,10 @@ const getLink = (param) => `#/invoice-in/${entityId.value}/${param}`;
                                     :color="amountsNotMatch ? 'negative' : 'transparent'"
                                     :title="
                                         amountsNotMatch
-                                            ? t('invoiceIn.summary.noMatch')
+                                            ? t('invoiceIn.noMatch', {
+                                                  totalTaxableBase:
+                                                      entity.totals.totalTaxableBase,
+                                              })
                                             : t('invoiceIn.summary.dueTotal')
                                     "
                                 >

From 02e29c167a38a4ef1c391d25f378f238fdf36285 Mon Sep 17 00:00:00 2001
From: pablone <pablone@verdnatura.es>
Date: Wed, 26 Mar 2025 07:46:39 +0100
Subject: [PATCH 50/59] feat: add rounded CC field to travel summary and
 translations

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

diff --git a/src/i18n/locale/en.yml b/src/i18n/locale/en.yml
index d0911d41d..09431dce0 100644
--- a/src/i18n/locale/en.yml
+++ b/src/i18n/locale/en.yml
@@ -841,6 +841,7 @@ travel:
         availabledHour: Availabled hour
         thermographs: Thermographs
         hb: HB
+        roundedCc: Rounded CC
     basicData:
         daysInForward: Automatic movement (Raid)
         isRaid: Raid
diff --git a/src/i18n/locale/es.yml b/src/i18n/locale/es.yml
index ac441d28d..10ff812df 100644
--- a/src/i18n/locale/es.yml
+++ b/src/i18n/locale/es.yml
@@ -924,6 +924,7 @@ travel:
         availabled: F. Disponible
         availabledHour: Hora Disponible
         hb: HB
+        roundedCc: CC redondeado
     basicData:
         daysInForward: Desplazamiento automatico (redada)
         isRaid: Redada
diff --git a/src/pages/Travel/Card/TravelSummary.vue b/src/pages/Travel/Card/TravelSummary.vue
index 9f9552611..5a824ddc3 100644
--- a/src/pages/Travel/Card/TravelSummary.vue
+++ b/src/pages/Travel/Card/TravelSummary.vue
@@ -91,6 +91,13 @@ const entriesTableColumns = computed(() => {
             showValue: true,
         },
         { label: 'CC', field: 'cc', name: 'cc', align: 'left', showValue: true },
+        {
+            label: t('travel.summary.roundedCc'),
+            field: 'cc',
+            name: 'roundedCc',
+            align: 'left',
+            showValue: true,
+        },
         {
             label: 'Pallet',
             field: 'pallet',
@@ -193,13 +200,18 @@ const entriesTotals = computed(() => {
         freightValue: 0,
         packageValue: 0,
         cc: 0,
+        roundedCc: 0,
         pallet: 0,
         m3: 0,
     };
 
     entriesTableRows.value.forEach((row) => {
         for (const key in totals) {
-            totals[key] += row[key] || 0;
+            if (key === 'roundedCc') {
+                totals['roundedCc'] += Math.ceil(row['cc'] || 0);
+            } else {
+                totals[key] += row[key] || 0;
+            }
         }
     });
 
@@ -208,6 +220,7 @@ const entriesTotals = computed(() => {
         freight: toCurrency(totals.freightValue),
         packageValue: toCurrency(totals.packageValue),
         cc: totals.cc.toFixed(2),
+        roundedCc: totals.roundedCc,
         pallet: totals.pallet.toFixed(2),
         m3: totals.m3.toFixed(2),
     };
@@ -337,9 +350,7 @@ const getLink = (param) => `#/travel/${entityId.value}/${param}`;
                 <VnLv :label="t('globals.totalEntries')" :value="travel.totalEntries" />
                 <VnLv
                     :label="t('travel.summary.availabled')"
-                    :value="
-                        dashIfEmpty(toDateTimeFormat(travel.availabled))
-                    "
+                    :value="dashIfEmpty(toDateTimeFormat(travel.availabled))"
                 />
             </QCard>
             <QCard class="full-width">
@@ -376,6 +387,11 @@ const getLink = (param) => `#/travel/${entityId.value}/${param}`;
                             </QBtn>
                         </QTd>
                     </template>
+                    <template #body-cell-roundedCc="{ col, value }">
+                        <QTd>
+                            {{ Math.ceil(value) || 0 }}
+                        </QTd>
+                    </template>
                     <template #body-cell-observation="{ value }">
                         <QTd>
                             <QIcon name="insert_drive_file" color="primary" size="24px">
@@ -392,6 +408,7 @@ const getLink = (param) => `#/travel/${entityId.value}/${param}`;
                         <QTd class="text-bold">{{ entriesTotals.freight }}</QTd>
                         <QTd class="text-bold">{{ entriesTotals.packageValue }}</QTd>
                         <QTd class="text-bold">{{ entriesTotals.cc }}</QTd>
+                        <QTd class="text-bold">{{ entriesTotals.roundedCc }}</QTd>
                         <QTd class="text-bold">{{ entriesTotals.pallet }}</QTd>
                         <QTd class="text-bold">{{ entriesTotals.m3 }}</QTd>
                     </template>

From 659d73e11a559175f1b392955153d399e5650a1f Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Wed, 26 Mar 2025 08:13:42 +0100
Subject: [PATCH 51/59] test: skip RouteAutonomous tests temporarily

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

diff --git a/test/cypress/integration/route/routeAutonomous.spec.js b/test/cypress/integration/route/routeAutonomous.spec.js
index acf82bd95..08fd7d7ea 100644
--- a/test/cypress/integration/route/routeAutonomous.spec.js
+++ b/test/cypress/integration/route/routeAutonomous.spec.js
@@ -1,4 +1,4 @@
-describe('RouteAutonomous', () => {
+describe.skip('RouteAutonomous', () => {
     const getLinkSelector = (colField) =>
         `tr:first-child > [data-col-field="${colField}"] > .no-padding > .link`;
 

From bbc03ddcad713bce6fbcb14c26bf283bca12ff56 Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Wed, 26 Mar 2025 08:30:20 +0100
Subject: [PATCH 52/59] fix: remove duplicated department selection from
 MonitorTicketFilter

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

diff --git a/src/pages/Monitor/Ticket/MonitorTicketFilter.vue b/src/pages/Monitor/Ticket/MonitorTicketFilter.vue
index 447dd35b8..258a90583 100644
--- a/src/pages/Monitor/Ticket/MonitorTicketFilter.vue
+++ b/src/pages/Monitor/Ticket/MonitorTicketFilter.vue
@@ -209,20 +209,6 @@ const getLocale = (label) => {
                     />
                 </QItemSection>
             </QItem>
-            <QItem>
-                <QItemSection>
-                    <VnSelect
-                        outlined
-                        dense
-                        rounded
-                        :label="t('globals.params.departmentFk')"
-                        v-model="params.department"
-                        option-label="name"
-                        option-value="name"
-                        url="Departments"
-                    />
-                </QItemSection>
-            </QItem>
             <QItem>
                 <QItemSection>
                     <VnSelect

From 42d613429fcbba851a7a4d31ded907d4b0e126f7 Mon Sep 17 00:00:00 2001
From: pablone <pablone@verdnatura.es>
Date: Wed, 26 Mar 2025 09:55:26 +0100
Subject: [PATCH 53/59] test: mark specific tests as skipped for tasks 8814 and
 8779

---
 test/cypress/integration/route/routeExtendedList.spec.js | 3 ++-
 test/cypress/integration/ticket/ticketList.spec.js       | 3 ++-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/test/cypress/integration/route/routeExtendedList.spec.js b/test/cypress/integration/route/routeExtendedList.spec.js
index fb2885f35..2d59b5514 100644
--- a/test/cypress/integration/route/routeExtendedList.spec.js
+++ b/test/cypress/integration/route/routeExtendedList.spec.js
@@ -146,7 +146,8 @@ describe('Route extended list', () => {
         cy.readFile(`${downloadsFolder}/${fileName}`).should('exist');
     });
 
-    it('Should mark as served the selected route', () => {
+    // task https://redmine.verdnatura.es/issues/8814
+    xit('Should mark as served the selected route', () => {
         cy.get(selectors.lastRowSelectCheckBox).click();
         cy.get(selectors.markServedBtn).click();
 
diff --git a/test/cypress/integration/ticket/ticketList.spec.js b/test/cypress/integration/ticket/ticketList.spec.js
index 5613a5854..85356ed15 100644
--- a/test/cypress/integration/ticket/ticketList.spec.js
+++ b/test/cypress/integration/ticket/ticketList.spec.js
@@ -35,7 +35,8 @@ describe('TicketList', () => {
         cy.get('.summaryBody').should('exist');
     });
 
-    it('filter client and create ticket', () => {
+    // task https://redmine.verdnatura.es/issues/8779
+    xit('filter client and create ticket', () => {
         cy.intercept('GET', /\/api\/Tickets\/filter/).as('ticketSearchbar');
         searchResults();
         cy.wait('@ticketSearchbar');

From 1a1b39960694139e855a03ec8f068cc3a9365297 Mon Sep 17 00:00:00 2001
From: pablone <pablone@verdnatura.es>
Date: Wed, 26 Mar 2025 09:57:40 +0100
Subject: [PATCH 54/59] fix: move warning badge condition to the correct
 position in getBadgeAttrs function

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

diff --git a/src/pages/Entry/EntryList.vue b/src/pages/Entry/EntryList.vue
index 5ebad3144..556f89b0e 100644
--- a/src/pages/Entry/EntryList.vue
+++ b/src/pages/Entry/EntryList.vue
@@ -249,7 +249,6 @@ function getBadgeAttrs(row) {
     let timeDiff = today - timeTicket;
 
     if (timeDiff > 0) return { color: 'info', 'text-color': 'black' };
-    if (timeDiff < 0) return { color: 'warning', 'text-color': 'black' };
     switch (row.entryTypeCode) {
         case 'regularization':
         case 'life':
@@ -274,6 +273,7 @@ function getBadgeAttrs(row) {
         default:
             break;
     }
+    if (timeDiff < 0) return { color: 'warning', 'text-color': 'black' };
     return { color: 'transparent' };
 }
 

From 4e83c31d354c099fd667fcde204f60f149381a63 Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Wed, 26 Mar 2025 09:59:11 +0100
Subject: [PATCH 55/59] feat: refs #6994 create ParkingDescriptorProxy to VnLog

---
 .../Parking/Card/ParkingDescriptorProxy.vue        | 14 ++++++++++++++
 1 file changed, 14 insertions(+)
 create mode 100644 src/pages/Shelving/Parking/Card/ParkingDescriptorProxy.vue

diff --git a/src/pages/Shelving/Parking/Card/ParkingDescriptorProxy.vue b/src/pages/Shelving/Parking/Card/ParkingDescriptorProxy.vue
new file mode 100644
index 000000000..e78a2b238
--- /dev/null
+++ b/src/pages/Shelving/Parking/Card/ParkingDescriptorProxy.vue
@@ -0,0 +1,14 @@
+<script setup>
+import ParkingDescriptor from './ParkingDescriptor.vue';
+import ParkingSummary from './ParkingSummary.vue';
+</script>
+<template>
+    <QPopupProxy style="max-width: 10px">
+        <ParkingDescriptor
+            v-if="$attrs.id"
+            v-bind="$attrs.id"
+            :summary="ParkingSummary"
+            :proxy-render="true"
+        />
+    </QPopupProxy>
+</template>

From 1b280ef9fc8a544d86b18a3a261ce434673c0043 Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Wed, 26 Mar 2025 10:03:53 +0100
Subject: [PATCH 56/59] refactor: rename cardDescriptor to vnDescriptor in
 localization files

---
 src/i18n/locale/en.yml | 2 +-
 src/i18n/locale/es.yml | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/i18n/locale/en.yml b/src/i18n/locale/en.yml
index c62305f95..5118c16c0 100644
--- a/src/i18n/locale/en.yml
+++ b/src/i18n/locale/en.yml
@@ -884,7 +884,7 @@ components:
         openCard: View
         openSummary: Summary
         viewSummary: Summary
-    cardDescriptor:
+    vnDescriptor:
         mainList: Main list
         summary: Summary
         moreOptions: More options
diff --git a/src/i18n/locale/es.yml b/src/i18n/locale/es.yml
index 86d15e985..a1a173bf3 100644
--- a/src/i18n/locale/es.yml
+++ b/src/i18n/locale/es.yml
@@ -968,7 +968,7 @@ components:
         openCard: Ficha
         openSummary: Detalles
         viewSummary: Vista previa
-    cardDescriptor:
+    vnDescriptor:
         mainList: Listado principal
         summary: Resumen
         moreOptions: Más opciones

From ef2ce0500e7e81bb15d254f2f06baa856438a280 Mon Sep 17 00:00:00 2001
From: pablone <pablone@verdnatura.es>
Date: Wed, 26 Mar 2025 12:05:32 +0100
Subject: [PATCH 57/59] test: mark route cloning test as skipped for task 8814

---
 test/cypress/integration/route/routeExtendedList.spec.js | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/test/cypress/integration/route/routeExtendedList.spec.js b/test/cypress/integration/route/routeExtendedList.spec.js
index 2d59b5514..fee8369e3 100644
--- a/test/cypress/integration/route/routeExtendedList.spec.js
+++ b/test/cypress/integration/route/routeExtendedList.spec.js
@@ -118,8 +118,8 @@ describe('Route extended list', () => {
             cy.validateContent(selector, value);
         });
     });
-
-    it('Should clone selected route and add ticket', () => {
+    // task https://redmine.verdnatura.es/issues/8814
+    xit('Should clone selected route and add ticket', () => {
         cy.get(selectors.firstRowSelectCheckBox).click();
         cy.get(selectors.cloneBtn).click();
         cy.dataCy('Starting date_inputDate').type('01-01-2001');

From dcc45cf3d4a4b173ea18a9b7ddab3a6cb17e4e95 Mon Sep 17 00:00:00 2001
From: pablone <pablone@verdnatura.es>
Date: Wed, 26 Mar 2025 12:38:53 +0100
Subject: [PATCH 58/59] test: skip TicketList test suite

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

diff --git a/test/cypress/integration/ticket/ticketList.spec.js b/test/cypress/integration/ticket/ticketList.spec.js
index 85356ed15..fb6a1a641 100644
--- a/test/cypress/integration/ticket/ticketList.spec.js
+++ b/test/cypress/integration/ticket/ticketList.spec.js
@@ -1,5 +1,5 @@
 /// <reference types="cypress" />
-describe('TicketList', () => {
+describe.skip('TicketList', () => {
     const firstRow = 'tbody.q-virtual-scroll__content tr:nth-child(1)';
 
     beforeEach(() => {

From 522e900e550835310b3f853551671138c188b74c Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Wed, 26 Mar 2025 13:23:56 +0100
Subject: [PATCH 59/59] test: enable previously skipped tests in route and
 ticket list

---
 test/cypress/integration/route/routeExtendedList.spec.js | 7 +++----
 test/cypress/integration/ticket/ticketList.spec.js       | 5 ++---
 2 files changed, 5 insertions(+), 7 deletions(-)

diff --git a/test/cypress/integration/route/routeExtendedList.spec.js b/test/cypress/integration/route/routeExtendedList.spec.js
index fee8369e3..fb2885f35 100644
--- a/test/cypress/integration/route/routeExtendedList.spec.js
+++ b/test/cypress/integration/route/routeExtendedList.spec.js
@@ -118,8 +118,8 @@ describe('Route extended list', () => {
             cy.validateContent(selector, value);
         });
     });
-    // task https://redmine.verdnatura.es/issues/8814
-    xit('Should clone selected route and add ticket', () => {
+
+    it('Should clone selected route and add ticket', () => {
         cy.get(selectors.firstRowSelectCheckBox).click();
         cy.get(selectors.cloneBtn).click();
         cy.dataCy('Starting date_inputDate').type('01-01-2001');
@@ -146,8 +146,7 @@ describe('Route extended list', () => {
         cy.readFile(`${downloadsFolder}/${fileName}`).should('exist');
     });
 
-    // task https://redmine.verdnatura.es/issues/8814
-    xit('Should mark as served the selected route', () => {
+    it('Should mark as served the selected route', () => {
         cy.get(selectors.lastRowSelectCheckBox).click();
         cy.get(selectors.markServedBtn).click();
 
diff --git a/test/cypress/integration/ticket/ticketList.spec.js b/test/cypress/integration/ticket/ticketList.spec.js
index fb6a1a641..5613a5854 100644
--- a/test/cypress/integration/ticket/ticketList.spec.js
+++ b/test/cypress/integration/ticket/ticketList.spec.js
@@ -1,5 +1,5 @@
 /// <reference types="cypress" />
-describe.skip('TicketList', () => {
+describe('TicketList', () => {
     const firstRow = 'tbody.q-virtual-scroll__content tr:nth-child(1)';
 
     beforeEach(() => {
@@ -35,8 +35,7 @@ describe.skip('TicketList', () => {
         cy.get('.summaryBody').should('exist');
     });
 
-    // task https://redmine.verdnatura.es/issues/8779
-    xit('filter client and create ticket', () => {
+    it('filter client and create ticket', () => {
         cy.intercept('GET', /\/api\/Tickets\/filter/).as('ticketSearchbar');
         searchResults();
         cy.wait('@ticketSearchbar');