From a6a27237341f27db158378a45d064b6458d33139 Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Mon, 27 Jan 2025 14:21:09 +0100
Subject: [PATCH 01/44] feat: refs #8463 cardDescriptorBeta

---
 src/components/common/VnCardBeta.vue          |  75 +++--
 src/components/ui/CardDescriptorBeta.vue      | 262 ++++++++++++++++++
 src/pages/Order/Card/OrderCard.vue            |  30 ++
 src/pages/Order/Card/OrderDescriptor.vue      |  45 +--
 src/pages/Order/Card/OrderDescriptorProxy.vue |   7 +-
 src/pages/Order/Card/OrderSummary.vue         |   3 +-
 6 files changed, 358 insertions(+), 64 deletions(-)
 create mode 100644 src/components/ui/CardDescriptorBeta.vue

diff --git a/src/components/common/VnCardBeta.vue b/src/components/common/VnCardBeta.vue
index a1f07ff17..2579bf623 100644
--- a/src/components/common/VnCardBeta.vue
+++ b/src/components/common/VnCardBeta.vue
@@ -1,5 +1,5 @@
 <script setup>
-import { onBeforeMount, computed } from 'vue';
+import { onBeforeMount, computed, onMounted, watch, ref } from 'vue';
 import { useRoute, useRouter, onBeforeRouteUpdate } from 'vue-router';
 import { useArrayData } from 'src/composables/useArrayData';
 import { useStateStore } from 'stores/useStateStore';
@@ -7,7 +7,10 @@ import useCardSize from 'src/composables/useCardSize';
 import LeftMenu from 'components/LeftMenu.vue';
 import VnSubToolbar from '../ui/VnSubToolbar.vue';
 
+const emit = defineEmits(['onFetch']);
+
 const props = defineProps({
+    id: { type: Number, required: false, default: null },
     dataKey: { type: String, required: true },
     baseUrl: { type: String, default: undefined },
     customUrl: { type: String, default: undefined },
@@ -18,52 +21,72 @@ const props = defineProps({
     searchDataKey: { type: String, default: undefined },
     searchbarProps: { type: Object, default: undefined },
     redirectOnError: { type: Boolean, default: false },
+    visual: { type: Boolean, default: true },
 });
 
 const stateStore = useStateStore();
 const route = useRoute();
 const router = useRouter();
+const arrayData = ref({});
+
+const id = computed(() => props.id || route?.params?.id);
 const url = computed(() => {
     if (props.baseUrl) {
-        return `${props.baseUrl}/${route.params.id}`;
+        return `${props.baseUrl}/${id.value}`;
     }
     return props.customUrl;
 });
 
-const arrayData = useArrayData(props.dataKey, {
-    url: url.value,
-    filter: props.filter,
-    userFilter: props.userFilter,
-});
-
 onBeforeMount(async () => {
+    console.log('asd', id.value);
+    arrayData.value = useArrayData(props.dataKey);
+    if (!arrayData.value.store.data && !arrayData.value.isLoading.value) {
+        arrayData.value = useArrayData(props.dataKey, {
+            url: url.value,
+            filter: props.filter,
+            userFilter: props.userFilter,
+        });
+    }
+
+    if (props.baseUrl && props.visual) {
+        onBeforeRouteUpdate(async (to, from) => {
+            if (to.params.id !== from.params.id) {
+                arrayData.value.store.url = `${props.baseUrl}/${to.params.id}`;
+                await fetch('router');
+            }
+        });
+    }
+
     try {
-        if (!props.baseUrl) arrayData.store.filter.where = { id: route.params.id };
-        await arrayData.fetch({ append: false, updateRouter: false });
+        if (!props.baseUrl) arrayData.value.store.filter.where = { id: id.value };
+        await fetch('montar');
     } catch {
+        if (!props.visual) return;
         const { matched: matches } = router.currentRoute.value;
         const { path } = matches.at(-1);
         router.push({ path: path.replace(/:id.*/, '') });
     }
 });
 
-if (props.baseUrl) {
-    onBeforeRouteUpdate(async (to, from) => {
-        if (to.params.id !== from.params.id) {
-            arrayData.store.url = `${props.baseUrl}/${to.params.id}`;
-            await arrayData.fetch({ append: false, updateRouter: false });
-        }
-    });
+watch(
+    () => arrayData?.value?.isLoading,
+    (loading) => !loading && emit('onFetch', arrayData.value.store.data),
+);
+
+async function fetch() {
+    await arrayData.value.fetch({ append: false, updateRouter: false });
 }
 </script>
 <template>
-    <Teleport to="#left-panel" v-if="stateStore.isHeaderMounted()">
-        <component :is="descriptor" />
-        <QSeparator />
-        <LeftMenu source="card" />
-    </Teleport>
-    <VnSubToolbar />
-    <div :class="[useCardSize(), $attrs.class]">
-        <RouterView :key="route.path" />
-    </div>
+    <span v-if="visual">
+        <Teleport to="#left-panel" v-if="stateStore.isHeaderMounted()">
+            <component :is="descriptor" />
+            <QSeparator />
+            <LeftMenu source="card" />
+        </Teleport>
+        <VnSubToolbar />
+        <div :class="[useCardSize(), $attrs.class]">
+            <RouterView :key="route?.path" />
+        </div>
+    </span>
 </template>
diff --git a/src/components/ui/CardDescriptorBeta.vue b/src/components/ui/CardDescriptorBeta.vue
new file mode 100644
index 000000000..b2bac234d
--- /dev/null
+++ b/src/components/ui/CardDescriptorBeta.vue
@@ -0,0 +1,262 @@
+<script setup>
+import { computed, ref } from 'vue';
+import { useI18n } from 'vue-i18n';
+import SkeletonDescriptor from 'components/ui/SkeletonDescriptor.vue';
+import { useSummaryDialog } from 'src/composables/useSummaryDialog';
+import { useRoute } from 'vue-router';
+import VnMoreOptions from './VnMoreOptions.vue';
+
+const $props = defineProps({
+    id: {
+        type: Number,
+        default: false,
+    },
+    title: {
+        type: String,
+        default: '',
+    },
+    subtitle: {
+        type: Number,
+        default: null,
+    },
+    module: {
+        type: String,
+        default: null,
+    },
+    summary: {
+        type: Object,
+        default: null,
+    },
+    card: {
+        type: Object,
+        required: true,
+    },
+    width: {
+        type: String,
+        default: 'md-width',
+    },
+});
+
+const route = useRoute();
+const { t } = useI18n();
+const { viewSummary } = useSummaryDialog();
+const entity = ref({});
+const isLoading = ref(false);
+const emit = defineEmits(['onFetch']);
+
+function getValueFromPath(path) {
+    if (!path) return;
+    const keys = path.toString().split('.');
+    let current = entity.value;
+
+    for (const key of keys) {
+        if (current[key] === undefined) return undefined;
+        else current = current[key];
+    }
+    return current;
+}
+
+const iconModule = computed(() => route.matched[1].meta.icon);
+const toModule = computed(() =>
+    route.matched[1].path.split('/').length > 2
+        ? route.matched[1].redirect
+        : route.matched[1].children[0].redirect,
+);
+
+function setData(data) {
+    const newData = (Array.isArray(data) ? data[0] : data) ?? {};
+    entity.value = newData;
+    isLoading.value = false;
+    if (newData) emit('onFetch', newData);
+}
+</script>
+
+<template>
+    {{ id }}
+    <component
+        :is="card"
+        :id
+        :visual="false"
+        @on-fetch="(data) => setData(data)"
+        v-bind="$attrs"
+    />
+    <div class="descriptor">
+        <template v-if="entity && !isLoading">
+            <div class="header bg-primary q-pa-sm justify-between">
+                <slot name="header-extra-action"
+                    ><QBtn
+                        round
+                        flat
+                        dense
+                        size="md"
+                        :icon="iconModule"
+                        color="white"
+                        class="link"
+                        :to="$attrs['to-module'] ?? toModule"
+                    >
+                        <QTooltip>
+                            {{ t('globals.goToModuleIndex') }}
+                        </QTooltip>
+                    </QBtn></slot
+                >
+                <QBtn
+                    @click.stop="viewSummary(entity.id, $props.summary, $props.width)"
+                    round
+                    flat
+                    dense
+                    size="md"
+                    icon="preview"
+                    color="white"
+                    class="link"
+                    v-if="summary"
+                >
+                    <QTooltip>
+                        {{ t('components.smartCard.openSummary') }}
+                    </QTooltip>
+                </QBtn>
+                <RouterLink :to="{ name: `${module}Summary`, params: { id: entity.id } }">
+                    <QBtn
+                        class="link"
+                        color="white"
+                        dense
+                        flat
+                        icon="launch"
+                        round
+                        size="md"
+                    >
+                        <QTooltip>
+                            {{ t('components.cardDescriptor.summary') }}
+                        </QTooltip>
+                    </QBtn>
+                </RouterLink>
+                <VnMoreOptions v-if="$slots.menu">
+                    <template #menu="{ menuRef }">
+                        <slot name="menu" :entity="entity" :menu-ref="menuRef" />
+                    </template>
+                </VnMoreOptions>
+            </div>
+            <slot name="before" />
+            <div class="body q-py-sm">
+                <QList dense>
+                    <QItemLabel header class="ellipsis text-h5" :lines="1">
+                        <div class="title">
+                            <span v-if="$props.title" :title="getValueFromPath(title)">
+                                {{ getValueFromPath(title) ?? $props.title }}
+                            </span>
+                            <slot v-else name="description" :entity="entity">
+                                <span :title="entity.name">
+                                    {{ entity.name }}
+                                </span>
+                            </slot>
+                        </div>
+                    </QItemLabel>
+                    <QItem dense>
+                        <QItemLabel class="subtitle" caption>
+                            #{{ getValueFromPath(subtitle) ?? entity.id }}
+                        </QItemLabel>
+                    </QItem>
+                </QList>
+                <div class="list-box q-mt-xs">
+                    <slot name="body" :entity="entity" />
+                </div>
+            </div>
+            <div class="icons">
+                <slot name="icons" :entity="entity" />
+            </div>
+            <div class="actions justify-center">
+                <slot name="actions" :entity="entity" />
+            </div>
+            <slot name="after" />
+        </template>
+        <!-- Skeleton -->
+        <SkeletonDescriptor v-if="!entity || isLoading" />
+    </div>
+    <QInnerLoading
+        :label="t('globals.pleaseWait')"
+        :showing="isLoading"
+        color="primary"
+    />
+</template>
+
+<style lang="scss">
+.body {
+    background-color: var(--vn-section-color);
+    .text-h5 {
+        font-size: 20px;
+        padding-top: 5px;
+        padding-bottom: 0px;
+    }
+    .q-item {
+        min-height: 20px;
+
+        .link {
+            margin-left: 10px;
+        }
+    }
+    .vn-label-value {
+        display: flex;
+        padding: 0px 16px;
+        .label {
+            color: var(--vn-label-color);
+            font-size: 14px;
+
+            &:not(:has(a))::after {
+                content: ':';
+            }
+        }
+        .value {
+            color: var(--vn-text-color);
+            font-size: 14px;
+            margin-left: 4px;
+            overflow: hidden;
+            text-overflow: ellipsis;
+            white-space: nowrap;
+            text-align: left;
+        }
+        .info {
+            margin-left: 5px;
+        }
+    }
+}
+</style>
+
+<style lang="scss" scoped>
+.title {
+    overflow: hidden;
+    text-overflow: ellipsis;
+    span {
+        color: var(--vn-text-color);
+        font-weight: bold;
+    }
+}
+.subtitle {
+    color: var(--vn-text-color);
+    font-size: 16px;
+    margin-bottom: 2px;
+}
+.list-box {
+    .q-item__label {
+        color: var(--vn-label-color);
+        padding-bottom: 0%;
+    }
+}
+.descriptor {
+    width: 256px;
+    .header {
+        display: flex;
+        align-items: center;
+    }
+    .icons {
+        margin: 0 10px;
+        display: flex;
+        justify-content: center;
+        .q-icon {
+            margin-right: 5px;
+        }
+    }
+    .actions {
+        margin: 0 5px;
+        justify-content: center !important;
+    }
+}
+</style>
diff --git a/src/pages/Order/Card/OrderCard.vue b/src/pages/Order/Card/OrderCard.vue
index 823815f59..b371509c6 100644
--- a/src/pages/Order/Card/OrderCard.vue
+++ b/src/pages/Order/Card/OrderCard.vue
@@ -1,12 +1,42 @@
 <script setup>
 import VnCardBeta from 'components/common/VnCardBeta.vue';
 import OrderDescriptor from 'pages/Order/Card/OrderDescriptor.vue';
+
+const userFilter = {
+    include: [
+        { relation: 'agencyMode', scope: { fields: ['name'] } },
+        {
+            relation: 'address',
+            scope: { fields: ['nickname'] },
+        },
+        { relation: 'rows', scope: { fields: ['id'] } },
+        {
+            relation: 'client',
+            scope: {
+                fields: [
+                    'salesPersonFk',
+                    'name',
+                    'isActive',
+                    'isFreezed',
+                    'isTaxDataChecked',
+                ],
+                include: {
+                    relation: 'salesPersonUser',
+                    scope: { fields: ['id', 'name'] },
+                },
+            },
+        },
+    ],
+};
 </script>
 
 <template>
     <VnCardBeta
         data-key="Order"
         base-url="Orders"
+        :userFilter
         :descriptor="OrderDescriptor"
+        v-bind="$attrs"
+        v-on="$attrs"
     />
 </template>
diff --git a/src/pages/Order/Card/OrderDescriptor.vue b/src/pages/Order/Card/OrderDescriptor.vue
index 0d5f0146f..4c2384f92 100644
--- a/src/pages/Order/Card/OrderDescriptor.vue
+++ b/src/pages/Order/Card/OrderDescriptor.vue
@@ -6,10 +6,11 @@ import { toCurrency, toDate } from 'src/filters';
 import { useState } from 'src/composables/useState';
 import useCardDescription from 'src/composables/useCardDescription';
 
-import CardDescriptor from 'components/ui/CardDescriptor.vue';
 import VnLv from 'src/components/ui/VnLv.vue';
 import FetchData from 'components/FetchData.vue';
 import WorkerDescriptorProxy from 'src/pages/Worker/Card/WorkerDescriptorProxy.vue';
+import OrderCard from './OrderCard.vue';
+import CardDescriptorBeta from 'src/components/ui/CardDescriptorBeta.vue';
 
 const DEFAULT_ITEMS = 0;
 
@@ -26,37 +27,13 @@ const state = useState();
 const { t } = useI18n();
 const data = ref(useCardDescription());
 const getTotalRef = ref();
+const total = ref(0);
 
 const entityId = computed(() => {
     return $props.id || route.params.id;
 });
 
-const filter = {
-    include: [
-        { relation: 'agencyMode', scope: { fields: ['name'] } },
-        {
-            relation: 'address',
-            scope: { fields: ['nickname'] },
-        },
-        { relation: 'rows', scope: { fields: ['id'] } },
-        {
-            relation: 'client',
-            scope: {
-                fields: [
-                    'salesPersonFk',
-                    'name',
-                    'isActive',
-                    'isFreezed',
-                    'isTaxDataChecked',
-                ],
-                include: {
-                    relation: 'salesPersonUser',
-                    scope: { fields: ['id', 'name'] },
-                },
-            },
-        },
-    ],
-};
+const orderTotal = computed(() => state.get('orderTotal') ?? 0);
 
 const setData = (entity) => {
     if (!entity) return;
@@ -68,9 +45,6 @@ const setData = (entity) => {
 const getConfirmationValue = (isConfirmed) => {
     return t(isConfirmed ? 'globals.confirmed' : 'order.summary.notConfirmed');
 };
-
-const orderTotal = computed(() => state.get('orderTotal') ?? 0);
-const total = ref(0);
 </script>
 
 <template>
@@ -83,15 +57,14 @@ const total = ref(0);
             }
         "
     />
-    <CardDescriptor
-        ref="descriptor"
-        :url="`Orders/${entityId}`"
-        :filter="filter"
+    <CardDescriptorBeta
+        v-bind="$attrs"
+        :id
+        :card="OrderCard"
         module="Order"
         :title="data.title"
         :subtitle="data.subtitle"
         @on-fetch="setData"
-        data-key="orderData"
     >
         <template #body="{ entity }">
             <VnLv
@@ -142,5 +115,5 @@ const total = ref(0);
                 </QBtn>
             </QCardActions>
         </template>
-    </CardDescriptor>
+    </CardDescriptorBeta>
 </template>
diff --git a/src/pages/Order/Card/OrderDescriptorProxy.vue b/src/pages/Order/Card/OrderDescriptorProxy.vue
index 04ebb054a..7b3d1a871 100644
--- a/src/pages/Order/Card/OrderDescriptorProxy.vue
+++ b/src/pages/Order/Card/OrderDescriptorProxy.vue
@@ -12,6 +12,11 @@ const $props = defineProps({
 
 <template>
     <QPopupProxy>
-        <OrderDescriptor v-if="$props.id" :id="$props.id" :summary="OrderSummary" />
+        <OrderDescriptor
+            v-if="$props.id"
+            :id="$props.id"
+            :summary="OrderSummary"
+            data-key="orderDescriptor"
+        />
     </QPopupProxy>
 </template>
diff --git a/src/pages/Order/Card/OrderSummary.vue b/src/pages/Order/Card/OrderSummary.vue
index a289688e4..bef97bc0f 100644
--- a/src/pages/Order/Card/OrderSummary.vue
+++ b/src/pages/Order/Card/OrderSummary.vue
@@ -13,6 +13,7 @@ import FetchedTags from 'components/ui/FetchedTags.vue';
 import VnTitle from 'src/components/common/VnTitle.vue';
 import ItemDescriptorProxy from 'src/pages/Item/Card/ItemDescriptorProxy.vue';
 import OrderDescriptorMenu from 'pages/Order/Card/OrderDescriptorMenu.vue';
+import OrderDescriptorProxy from './OrderDescriptorProxy.vue';
 
 const { t } = useI18n();
 const route = useRoute();
@@ -106,7 +107,7 @@ async function handleConfirm() {
                         <template #value>
                             <span class="link">
                                 {{ dashIfEmpty(entity?.address?.nickname) }}
-                                <CustomerDescriptorProxy :id="entity?.clientFk" />
+                                <OrderDescriptorProxy :id="1" />
                             </span>
                         </template>
                     </VnLv>

From ee3ebc51f1866efd0fc5b7db8facb3250c1bfc29 Mon Sep 17 00:00:00 2001
From: jtubau <jtubau@verdnatura.es>
Date: Tue, 25 Feb 2025 15:27:01 +0100
Subject: [PATCH 02/44] test: refs #8621 add e2e tests for cmrList

---
 .../integration/route/cmr/cmrList.spec.js     | 87 +++++++++++++++++++
 1 file changed, 87 insertions(+)
 create mode 100644 test/cypress/integration/route/cmr/cmrList.spec.js

diff --git a/test/cypress/integration/route/cmr/cmrList.spec.js b/test/cypress/integration/route/cmr/cmrList.spec.js
new file mode 100644
index 000000000..fc437f218
--- /dev/null
+++ b/test/cypress/integration/route/cmr/cmrList.spec.js
@@ -0,0 +1,87 @@
+describe('Cmr list', () => {
+    const getLinkSelector = (colField) =>
+        `tr:first-child > [data-col-field="${colField}"] > .no-padding > .link`;
+
+    const selectors = {
+        ticket: getLinkSelector('ticketFk'),
+        client: getLinkSelector('clientFk'),
+        lastRowSelectCheckBox:
+            '.q-virtual-scroll__content > tr:last-child > :nth-child(1) > .q-checkbox',
+        downloadBtn: '#subToolbar > .q-btn',
+        viewCmr: 'tableAction-0',
+        summaryPopupBtn: '.header > :nth-child(2) > .q-btn__content > .q-icon',
+        summaryPopupHeader: '.summaryHeader > :nth-child(2)',
+        summaryHeader: '.summaryHeader',
+        descriptorId: '.q-item > .q-item__label',
+        descriptorTitle: '.q-item__label--header > .title > span',
+        summaryGoToSummaryBtn: '.header > .q-icon',
+        descriptorGoToSummaryBtn: '.descriptor > .header > a[href] > .q-btn',
+    };
+
+    const data = {
+        ticket: '2',
+        client: 'Bruce Wayne',
+    };
+
+    beforeEach(() => {
+        cy.viewport(1920, 1080);
+        cy.login('developer');
+        cy.visit('/#/route/cmr');
+        cy.typeSearchbar('{enter}');
+    });
+
+    it('Should download selected cmr', () => {
+        const downloadsFolder = Cypress.config('downloadsFolder');
+        cy.get(selectors.lastRowSelectCheckBox).click();
+        cy.get(selectors.downloadBtn).click();
+        cy.wait(3000);
+
+        const fileName = 'cmrs.zip';
+        cy.readFile(`${downloadsFolder}/${fileName}`).should('exist');
+    });
+
+    it('Should open selected cmr pdf', () => {
+        cy.window().then((win) => {
+            cy.stub(win, 'open').as('windowOpen');
+        });
+        cy.get(selectors.lastRowSelectCheckBox).click();
+        cy.dataCy(selectors.viewCmr).last().click();
+        cy.get('@windowOpen').should('be.calledWithMatch', '\/api\/Cmrs\/3');
+    });
+
+    describe('Ticket pop-ups', () => {
+        it('Should redirect to the ticket summary from the ticket descriptor pop-up', () => {
+            cy.get(selectors.ticket).click();
+            cy.get(selectors.descriptorId).should('contain', data.ticket);
+            cy.get(selectors.descriptorGoToSummaryBtn).click();
+            cy.get(selectors.summaryHeader).should('contain', data.client);
+        });
+
+        it('Should redirect to the ticket summary from summary pop-up from the ticket descriptor pop-up', () => {
+            cy.get(selectors.ticket).click();
+            cy.get(selectors.descriptorId).should('contain', data.ticket);
+            cy.get(selectors.summaryPopupBtn).click();
+            cy.get(selectors.summaryPopupHeader).should('contain', data.client);
+            cy.get(selectors.summaryGoToSummaryBtn).click();
+            cy.get(selectors.summaryHeader).should('contain', data.client);
+        });
+    });
+
+    describe('Client pop-ups', () => {
+        it('Should redirect to the client summary from the client descriptor pop-up', () => {
+            cy.get(selectors.client).click();
+            cy.get(selectors.descriptorTitle).should('contain', data.client);
+            cy.get(selectors.descriptorGoToSummaryBtn).click();
+            cy.get(selectors.summaryHeader).should('contain', data.client);
+        });
+
+        it('Should redirect to the client summary from summary pop-up from the client descriptor pop-up', () => {
+            cy.get(selectors.client).click();
+            cy.get(selectors.descriptorTitle).should('contain', data.client);
+            cy.get(selectors.summaryPopupBtn).click();
+            cy.get(selectors.summaryHeader).should('contain', data.client);
+            cy.get(selectors.summaryGoToSummaryBtn).click();
+            cy.get(selectors.summaryHeader).should('contain', data.client);
+        });
+    });
+});

From 083e68c291d97d83fe9f08e1fe028c9db6fd5dd9 Mon Sep 17 00:00:00 2001
From: jtubau <jtubau@verdnatura.es>
Date: Wed, 26 Feb 2025 09:09:19 +0100
Subject: [PATCH 03/44] test: refs #8621 add functionality to remove filters in
 cmrList e2e tests

---
 test/cypress/integration/route/cmr/cmrList.spec.js | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/test/cypress/integration/route/cmr/cmrList.spec.js b/test/cypress/integration/route/cmr/cmrList.spec.js
index fc437f218..6bcbfc842 100644
--- a/test/cypress/integration/route/cmr/cmrList.spec.js
+++ b/test/cypress/integration/route/cmr/cmrList.spec.js
@@ -16,6 +16,7 @@ describe('Cmr list', () => {
         descriptorTitle: '.q-item__label--header > .title > span',
         summaryGoToSummaryBtn: '.header > .q-icon',
         descriptorGoToSummaryBtn: '.descriptor > .header > a[href] > .q-btn',
+        removeFilter: '.q-chip__icon--remove',
     };
 
     const data = {
@@ -28,6 +29,7 @@ describe('Cmr list', () => {
         cy.login('developer');
         cy.visit('/#/route/cmr');
         cy.typeSearchbar('{enter}');
+        cy.get(selectors.removeFilter).click();
     });
 
     it('Should download selected cmr', () => {

From 15e44174badf8fcd351dfff19747589c579f9b39 Mon Sep 17 00:00:00 2001
From: jtubau <jtubau@verdnatura.es>
Date: Wed, 26 Feb 2025 12:08:40 +0100
Subject: [PATCH 04/44] refactor: refs #8621 update column names in RouteList
 and add formatting for agency and vehicle fields

---
 src/pages/Route/RouteList.vue | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/src/pages/Route/RouteList.vue b/src/pages/Route/RouteList.vue
index 9dad8ba22..899b3b8c3 100644
--- a/src/pages/Route/RouteList.vue
+++ b/src/pages/Route/RouteList.vue
@@ -56,8 +56,9 @@ const columns = computed(() => [
     },
     {
         align: 'left',
-        name: 'agencyName',
+        name: 'agencyModeFk',
         label: t('route.Agency'),
+        format: (row) => row?.agencyName,
         cardVisible: true,
         component: 'select',
         attrs: {
@@ -74,8 +75,9 @@ const columns = computed(() => [
     },
     {
         align: 'left',
-        name: 'vehiclePlateNumber',
+        name: 'vehicleFk',
         label: t('route.Vehicle'),
+        format: (row) => row?.vehiclePlateNumber,
         cardVisible: true,
         component: 'select',
         attrs: {
@@ -155,6 +157,7 @@ const columns = computed(() => [
         <template #body>
             <VnTable
                 :data-key
+                ref="tableRef"
                 :columns="columns"
                 :right-search="false"
                 redirect="route"
@@ -175,4 +178,4 @@ const columns = computed(() => [
             </VnTable>
         </template>
     </VnSection>
-</template>
+</template>
\ No newline at end of file

From 6a0c58631c4e8d997b93f9f7ebaecdfd7bb53ff5 Mon Sep 17 00:00:00 2001
From: jtubau <jtubau@verdnatura.es>
Date: Wed, 12 Mar 2025 12:34:03 +0100
Subject: [PATCH 05/44] fix: refs #8621 test for date input selector

---
 src/pages/Route/RouteList.vue                 | 30 +++++++------------
 .../route/routeExtendedList.spec.js           |  2 +-
 2 files changed, 12 insertions(+), 20 deletions(-)

diff --git a/src/pages/Route/RouteList.vue b/src/pages/Route/RouteList.vue
index db52dcf6d..f8234c7db 100644
--- a/src/pages/Route/RouteList.vue
+++ b/src/pages/Route/RouteList.vue
@@ -39,28 +39,24 @@ const columns = computed(() => [
         width: '25px',
     },
     {
-        name: 'workerFk',
-        label: t('gloabls.worker'),
-        component: markRaw(VnSelectWorker),
-        create: true,
-        format: (row, dashIfEmpty) => dashIfEmpty(row.travelRef),
-        columnFilter: false,
-        width: '100px',
-    },
-    {
+        align: 'left',
         name: 'workerFk',
         label: t('globals.worker'),
-        visible: false,
+        component: markRaw(VnSelectWorker),
+        create: true,
         cardVisible: true,
+        format: (row, dashIfEmpty) => dashIfEmpty(row.travelRef),
+        columnFilter: false,
     },
     {
-        name: 'agencyName',
+        align: 'left',
+        name: 'agencyModeFk',
         label: t('globals.agency'),
-        visible: false,
+        format: (row) => row?.agencyName,
         cardVisible: true,
     },
     {
-        label: t('globals.Agency'),
+        label: t('globals.agency'),
         name: 'agencyModeFk',
         component: 'select',
         attrs: {
@@ -78,17 +74,13 @@ const columns = computed(() => [
     {
         align: 'left',
         name: 'vehicleFk',
-        label: t('route.Vehicle'),
+        label: t('globals.vehicle'),
         format: (row) => row?.vehiclePlateNumber,
         cardVisible: true,
     },
-    {
-        name: 'vehiclePlateNumber',
-        label: t('globals.vehicle'),
-    },
     {
         name: 'vehicleFk',
-        label: t('globals.Vehicle'),
+        label: t('globals.vehicle'),
         cardVisible: true,
         component: 'select',
         attrs: {
diff --git a/test/cypress/integration/route/routeExtendedList.spec.js b/test/cypress/integration/route/routeExtendedList.spec.js
index 237729107..b46ce3ba2 100644
--- a/test/cypress/integration/route/routeExtendedList.spec.js
+++ b/test/cypress/integration/route/routeExtendedList.spec.js
@@ -120,7 +120,7 @@ describe('Route extended list', () => {
     it('Should clone selected route', () => {
         cy.get(selectors.lastRowSelectCheckBox).click();
         cy.get(selectors.cloneBtn).click();
-        cy.dataCy('route.Starting date_inputDate').type('10-05-2001');
+        cy.dataCy('Starting date_inputDate').type('10-05-2001');
         cy.get('.q-card__actions > .q-btn--standard > .q-btn__content').click();
         cy.validateContent(selectors.date, '05/10/2001');
     });

From 4d8fb8eb5beaa82573170c8d278f4c351fff4d2f Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Thu, 13 Mar 2025 09:01:15 +0100
Subject: [PATCH 06/44] refactor: refs #8463 simplify creating VnDescriptor

---
 src/components/common/VnCard.vue         |  26 +-
 src/components/ui/CardDescriptorBeta.vue | 256 ++-----------------
 src/components/ui/VnDescriptor.vue       | 298 +++++++++++++++++++++++
 src/pages/Order/Card/OrderDescriptor.vue |   9 +-
 4 files changed, 333 insertions(+), 256 deletions(-)
 create mode 100644 src/components/ui/VnDescriptor.vue

diff --git a/src/components/common/VnCard.vue b/src/components/common/VnCard.vue
index 620dc2ad2..dfa51c8c4 100644
--- a/src/components/common/VnCard.vue
+++ b/src/components/common/VnCard.vue
@@ -1,12 +1,15 @@
 <script setup>
-import { onBeforeMount } from 'vue';
-import { useRouter, onBeforeRouteUpdate, onBeforeRouteLeave } from 'vue-router';
+import { onBeforeMount, computed } from 'vue';
+import { useRoute, useRouter, onBeforeRouteUpdate, onBeforeRouteLeave } from 'vue-router';
 import { useArrayData } from 'src/composables/useArrayData';
 import { useStateStore } from 'stores/useStateStore';
 import useCardSize from 'src/composables/useCardSize';
 import VnSubToolbar from '../ui/VnSubToolbar.vue';
 
+const emit = defineEmits(['onFetch']);
+
 const props = defineProps({
+    id: { type: Number, required: false, default: null },
     dataKey: { type: String, required: true },
     url: { type: String, default: undefined },
     idInWhere: { type: Boolean, default: false },
@@ -16,10 +19,13 @@ const props = defineProps({
     searchDataKey: { type: String, default: undefined },
     searchbarProps: { type: Object, default: undefined },
     redirectOnError: { type: Boolean, default: false },
+    visual: { type: Boolean, default: true },
 });
 
+const route = useRoute();
 const stateStore = useStateStore();
 const router = useRouter();
+const entityId = computed(() => props.id || route?.params?.id);
 const arrayData = useArrayData(props.dataKey, {
     url: props.url,
     userFilter: props.filter,
@@ -35,7 +41,7 @@ onBeforeMount(async () => {
 
     const route = router.currentRoute.value;
     try {
-        await fetch(route.params.id);
+        await fetch(entityId.value);
     } catch {
         const { matched: matches } = route;
         const { path } = matches.at(-1);
@@ -51,8 +57,7 @@ onBeforeRouteUpdate(async (to, from) => {
             router.push({ name, params: to.params });
         }
     }
-    const id = to.params.id;
-    if (id !== from.params.id) await fetch(id, true);
+    if (entityId.value !== from.params.id) await fetch(entityId.value, true);
 });
 
 async function fetch(id, append = false) {
@@ -61,14 +66,17 @@ async function fetch(id, append = false) {
     else if (!regex.test(props.url)) arrayData.store.url = `${props.url}/${id}`;
     else arrayData.store.url = props.url.replace(regex, `/${id}`);
     await arrayData.fetch({ append, updateRouter: false });
+    emit('onFetch', arrayData.store.data);
 }
 function hasRouteParam(params, valueToCheck = ':addressId') {
     return Object.values(params).includes(valueToCheck);
 }
 </script>
 <template>
-    <VnSubToolbar />
-    <div :class="[useCardSize(), $attrs.class]">
-        <RouterView :key="$route.path" />
-    </div>
+    <span v-if="visual">
+        <VnSubToolbar />
+        <div :class="[useCardSize(), $attrs.class]">
+            <RouterView :key="$route.path" />
+        </div>
+    </span>
 </template>
diff --git a/src/components/ui/CardDescriptorBeta.vue b/src/components/ui/CardDescriptorBeta.vue
index b2bac234d..86f756a7b 100644
--- a/src/components/ui/CardDescriptorBeta.vue
+++ b/src/components/ui/CardDescriptorBeta.vue
@@ -1,262 +1,38 @@
 <script setup>
-import { computed, ref } from 'vue';
-import { useI18n } from 'vue-i18n';
-import SkeletonDescriptor from 'components/ui/SkeletonDescriptor.vue';
-import { useSummaryDialog } from 'src/composables/useSummaryDialog';
-import { useRoute } from 'vue-router';
-import VnMoreOptions from './VnMoreOptions.vue';
+import { ref } from 'vue';
+import VnDescriptor from './VnDescriptor.vue';
 
 const $props = defineProps({
     id: {
         type: Number,
         default: false,
     },
-    title: {
-        type: String,
-        default: '',
-    },
-    subtitle: {
-        type: Number,
-        default: null,
-    },
-    module: {
-        type: String,
-        default: null,
-    },
-    summary: {
-        type: Object,
-        default: null,
-    },
     card: {
         type: Object,
-        required: true,
-    },
-    width: {
-        type: String,
-        default: 'md-width',
+        default: null,
     },
 });
 
-const route = useRoute();
-const { t } = useI18n();
-const { viewSummary } = useSummaryDialog();
-const entity = ref({});
-const isLoading = ref(false);
 const emit = defineEmits(['onFetch']);
-
-function getValueFromPath(path) {
-    if (!path) return;
-    const keys = path.toString().split('.');
-    let current = entity.value;
-
-    for (const key of keys) {
-        if (current[key] === undefined) return undefined;
-        else current = current[key];
-    }
-    return current;
-}
-
-const iconModule = computed(() => route.matched[1].meta.icon);
-const toModule = computed(() =>
-    route.matched[1].path.split('/').length > 2
-        ? route.matched[1].redirect
-        : route.matched[1].children[0].redirect,
-);
-
-function setData(data) {
-    const newData = (Array.isArray(data) ? data[0] : data) ?? {};
-    entity.value = newData;
-    isLoading.value = false;
-    if (newData) emit('onFetch', newData);
-}
+const entity = ref();
 </script>
 
 <template>
-    {{ id }}
     <component
         :is="card"
         :id
         :visual="false"
-        @on-fetch="(data) => setData(data)"
         v-bind="$attrs"
-    />
-    <div class="descriptor">
-        <template v-if="entity && !isLoading">
-            <div class="header bg-primary q-pa-sm justify-between">
-                <slot name="header-extra-action"
-                    ><QBtn
-                        round
-                        flat
-                        dense
-                        size="md"
-                        :icon="iconModule"
-                        color="white"
-                        class="link"
-                        :to="$attrs['to-module'] ?? toModule"
-                    >
-                        <QTooltip>
-                            {{ t('globals.goToModuleIndex') }}
-                        </QTooltip>
-                    </QBtn></slot
-                >
-                <QBtn
-                    @click.stop="viewSummary(entity.id, $props.summary, $props.width)"
-                    round
-                    flat
-                    dense
-                    size="md"
-                    icon="preview"
-                    color="white"
-                    class="link"
-                    v-if="summary"
-                >
-                    <QTooltip>
-                        {{ t('components.smartCard.openSummary') }}
-                    </QTooltip>
-                </QBtn>
-                <RouterLink :to="{ name: `${module}Summary`, params: { id: entity.id } }">
-                    <QBtn
-                        class="link"
-                        color="white"
-                        dense
-                        flat
-                        icon="launch"
-                        round
-                        size="md"
-                    >
-                        <QTooltip>
-                            {{ t('components.cardDescriptor.summary') }}
-                        </QTooltip>
-                    </QBtn>
-                </RouterLink>
-                <VnMoreOptions v-if="$slots.menu">
-                    <template #menu="{ menuRef }">
-                        <slot name="menu" :entity="entity" :menu-ref="menuRef" />
-                    </template>
-                </VnMoreOptions>
-            </div>
-            <slot name="before" />
-            <div class="body q-py-sm">
-                <QList dense>
-                    <QItemLabel header class="ellipsis text-h5" :lines="1">
-                        <div class="title">
-                            <span v-if="$props.title" :title="getValueFromPath(title)">
-                                {{ getValueFromPath(title) ?? $props.title }}
-                            </span>
-                            <slot v-else name="description" :entity="entity">
-                                <span :title="entity.name">
-                                    {{ entity.name }}
-                                </span>
-                            </slot>
-                        </div>
-                    </QItemLabel>
-                    <QItem dense>
-                        <QItemLabel class="subtitle" caption>
-                            #{{ getValueFromPath(subtitle) ?? entity.id }}
-                        </QItemLabel>
-                    </QItem>
-                </QList>
-                <div class="list-box q-mt-xs">
-                    <slot name="body" :entity="entity" />
-                </div>
-            </div>
-            <div class="icons">
-                <slot name="icons" :entity="entity" />
-            </div>
-            <div class="actions justify-center">
-                <slot name="actions" :entity="entity" />
-            </div>
-            <slot name="after" />
-        </template>
-        <!-- Skeleton -->
-        <SkeletonDescriptor v-if="!entity || isLoading" />
-    </div>
-    <QInnerLoading
-        :label="t('globals.pleaseWait')"
-        :showing="isLoading"
-        color="primary"
-    />
-</template>
-
-<style lang="scss">
-.body {
-    background-color: var(--vn-section-color);
-    .text-h5 {
-        font-size: 20px;
-        padding-top: 5px;
-        padding-bottom: 0px;
-    }
-    .q-item {
-        min-height: 20px;
-
-        .link {
-            margin-left: 10px;
-        }
-    }
-    .vn-label-value {
-        display: flex;
-        padding: 0px 16px;
-        .label {
-            color: var(--vn-label-color);
-            font-size: 14px;
-
-            &:not(:has(a))::after {
-                content: ':';
+        @on-fetch="
+            (data) => {
+                entity = data;
+                isLoading = false;
             }
-        }
-        .value {
-            color: var(--vn-text-color);
-            font-size: 14px;
-            margin-left: 4px;
-            overflow: hidden;
-            text-overflow: ellipsis;
-            white-space: nowrap;
-            text-align: left;
-        }
-        .info {
-            margin-left: 5px;
-        }
-    }
-}
-</style>
-
-<style lang="scss" scoped>
-.title {
-    overflow: hidden;
-    text-overflow: ellipsis;
-    span {
-        color: var(--vn-text-color);
-        font-weight: bold;
-    }
-}
-.subtitle {
-    color: var(--vn-text-color);
-    font-size: 16px;
-    margin-bottom: 2px;
-}
-.list-box {
-    .q-item__label {
-        color: var(--vn-label-color);
-        padding-bottom: 0%;
-    }
-}
-.descriptor {
-    width: 256px;
-    .header {
-        display: flex;
-        align-items: center;
-    }
-    .icons {
-        margin: 0 10px;
-        display: flex;
-        justify-content: center;
-        .q-icon {
-            margin-right: 5px;
-        }
-    }
-    .actions {
-        margin: 0 5px;
-        justify-content: center !important;
-    }
-}
-</style>
+        "
+    />
+    <VnDescriptor v-model="entity" v-bind="$attrs">
+        <template v-for="(_, slotName) in $slots" #[slotName]="slotData" :key="slotName">
+            <slot :name="slotName" v-bind="slotData ?? {}" :key="slotName" />
+        </template>
+    </VnDescriptor>
+</template>
diff --git a/src/components/ui/VnDescriptor.vue b/src/components/ui/VnDescriptor.vue
new file mode 100644
index 000000000..0aad35448
--- /dev/null
+++ b/src/components/ui/VnDescriptor.vue
@@ -0,0 +1,298 @@
+<script setup>
+import { computed, ref } from 'vue';
+import { useI18n } from 'vue-i18n';
+import SkeletonDescriptor from 'components/ui/SkeletonDescriptor.vue';
+import { useSummaryDialog } from 'src/composables/useSummaryDialog';
+import { useState } from 'src/composables/useState';
+import { useRoute, useRouter } from 'vue-router';
+import { useClipboard } from 'src/composables/useClipboard';
+import VnMoreOptions from './VnMoreOptions.vue';
+
+const entity = defineModel({ type: Object, default: null });
+const $props = defineProps({
+    title: {
+        type: String,
+        default: '',
+    },
+    subtitle: {
+        type: Number,
+        default: null,
+    },
+    summary: {
+        type: Object,
+        default: null,
+    },
+    width: {
+        type: String,
+        default: 'md-width',
+    },
+    module: {
+        type: String,
+        default: '',
+    },
+});
+
+const state = useState();
+const route = useRoute();
+const router = useRouter();
+const { t } = useI18n();
+const { copyText } = useClipboard();
+const { viewSummary } = useSummaryDialog();
+const DESCRIPTOR_PROXY = 'DescriptorProxy';
+const moduleName = ref();
+const isSameModuleName = route.matched[1].meta.moduleName !== moduleName.value;
+
+function getName() {
+    let name = $props.module;
+    if (name.includes(DESCRIPTOR_PROXY)) {
+        name = name.split(DESCRIPTOR_PROXY)[0];
+    }
+    return name;
+}
+const routeName = computed(() => {
+    let routeName = getName();
+    return `${routeName}Summary`;
+});
+
+function getValueFromPath(path) {
+    if (!path) return;
+    const keys = path.toString().split('.');
+    let current = entity.value;
+
+    for (const key of keys) {
+        if (current[key] === undefined) return undefined;
+        else current = current[key];
+    }
+    return current;
+}
+
+function copyIdText(id) {
+    copyText(id, {
+        component: {
+            copyValue: id,
+        },
+    });
+}
+
+const emit = defineEmits(['onFetch']);
+
+const iconModule = computed(() => {
+    moduleName.value = getName();
+    if (isSameModuleName) {
+        return router.options.routes[1].children.find((r) => r.name === moduleName.value)
+            ?.meta?.icon;
+    } else {
+        return route.matched[1].meta.icon;
+    }
+});
+
+const toModule = computed(() => {
+    moduleName.value = getName();
+    if (isSameModuleName) {
+        return router.options.routes[1].children.find((r) => r.name === moduleName.value)
+            ?.children[0]?.redirect;
+    } else {
+        return route.matched[1].path.split('/').length > 2
+            ? route.matched[1].redirect
+            : route.matched[1].children[0].redirect;
+    }
+});
+</script>
+
+<template>
+    <div class="descriptor">
+        <template v-if="entity">
+            <div class="header bg-primary q-pa-sm justify-between">
+                <slot name="header-extra-action">
+                    <QBtn
+                        round
+                        flat
+                        dense
+                        size="md"
+                        :icon="iconModule"
+                        color="white"
+                        class="link"
+                        :to="toModule"
+                    >
+                        <QTooltip>
+                            {{ t('globals.goToModuleIndex') }}
+                        </QTooltip>
+                    </QBtn>
+                </slot>
+                <QBtn
+                    @click.stop="viewSummary(entity.id, $props.summary, $props.width)"
+                    round
+                    flat
+                    dense
+                    size="md"
+                    icon="preview"
+                    color="white"
+                    class="link"
+                    v-if="summary"
+                >
+                    <QTooltip>
+                        {{ t('components.smartCard.openSummary') }}
+                    </QTooltip>
+                </QBtn>
+                <RouterLink :to="{ name: routeName, params: { id: entity.id } }">
+                    <QBtn
+                        class="link"
+                        color="white"
+                        dense
+                        flat
+                        icon="launch"
+                        round
+                        size="md"
+                    >
+                        <QTooltip>
+                            {{ t('components.cardDescriptor.summary') }}
+                        </QTooltip>
+                    </QBtn>
+                </RouterLink>
+                <VnMoreOptions v-if="$slots.menu">
+                    <template #menu="{ menuRef }">
+                        <slot name="menu" :entity="entity" :menu-ref="menuRef" />
+                    </template>
+                </VnMoreOptions>
+            </div>
+            <slot name="before" />
+            <div class="body q-py-sm">
+                <QList dense>
+                    <QItemLabel header class="ellipsis text-h5" :lines="1">
+                        <div class="title">
+                            <span v-if="$props.title" :title="getValueFromPath(title)">
+                                {{ getValueFromPath(title) ?? $props.title }}
+                            </span>
+                            <slot v-else name="description" :entity="entity">
+                                <span :title="entity.name">
+                                    {{ entity.name }}
+                                </span>
+                            </slot>
+                        </div>
+                    </QItemLabel>
+                    <QItem>
+                        <QItemLabel class="subtitle">
+                            #{{ getValueFromPath(subtitle) ?? entity.id }}
+                        </QItemLabel>
+                        <QBtn
+                            round
+                            flat
+                            dense
+                            size="sm"
+                            icon="content_copy"
+                            color="primary"
+                            @click.stop="copyIdText(entity.id)"
+                        >
+                            <QTooltip>
+                                {{ t('globals.copyId') }}
+                            </QTooltip>
+                        </QBtn>
+                    </QItem>
+                </QList>
+                <div class="list-box q-mt-xs">
+                    <slot name="body" :entity="entity" />
+                </div>
+            </div>
+            <div class="icons">
+                <slot name="icons" :entity="entity" />
+            </div>
+            <div class="actions justify-center" data-cy="descriptor_actions">
+                <slot name="actions" :entity="entity" />
+            </div>
+            <slot name="after" />
+        </template>
+        <SkeletonDescriptor v-if="!entity" />
+    </div>
+    <QInnerLoading :label="t('globals.pleaseWait')" :showing="!entity" color="primary" />
+</template>
+
+<style lang="scss">
+.body {
+    background-color: var(--vn-section-color);
+    .text-h5 {
+        font-size: 20px;
+        padding-top: 5px;
+        padding-bottom: 0px;
+    }
+    .q-item {
+        min-height: 20px;
+
+        .link {
+            margin-left: 10px;
+        }
+    }
+    .vn-label-value {
+        display: flex;
+        padding: 0px 16px;
+        .label {
+            color: var(--vn-label-color);
+            font-size: 14px;
+
+            &:not(:has(a))::after {
+                content: ':';
+            }
+        }
+        .value {
+            color: var(--vn-text-color);
+            font-size: 14px;
+            margin-left: 4px;
+            overflow: hidden;
+            text-overflow: ellipsis;
+            white-space: nowrap;
+            text-align: left;
+        }
+        .info {
+            margin-left: 5px;
+        }
+    }
+}
+</style>
+
+<style lang="scss" scoped>
+.title {
+    overflow: hidden;
+    text-overflow: ellipsis;
+    span {
+        color: var(--vn-text-color);
+        font-weight: bold;
+    }
+}
+.subtitle {
+    color: var(--vn-text-color);
+    font-size: 16px;
+    margin-bottom: 2px;
+}
+.list-box {
+    .q-item__label {
+        color: var(--vn-label-color);
+        padding-bottom: 0%;
+    }
+}
+.descriptor {
+    width: 256px;
+    .header {
+        display: flex;
+        align-items: center;
+    }
+    .icons {
+        margin: 0 10px;
+        display: flex;
+        justify-content: center;
+        .q-icon {
+            margin-right: 5px;
+        }
+    }
+    .actions {
+        margin: 0 5px;
+        justify-content: center !important;
+    }
+}
+</style>
+<i18n>
+    en:
+        globals:
+            copyId: Copy ID
+    es:
+        globals:
+            copyId: Copiar ID
+</i18n>
diff --git a/src/pages/Order/Card/OrderDescriptor.vue b/src/pages/Order/Card/OrderDescriptor.vue
index 133d328c0..15e8cf070 100644
--- a/src/pages/Order/Card/OrderDescriptor.vue
+++ b/src/pages/Order/Card/OrderDescriptor.vue
@@ -4,8 +4,6 @@ import { useRoute } from 'vue-router';
 import { useI18n } from 'vue-i18n';
 import { toCurrency, toDate } from 'src/filters';
 import { useState } from 'src/composables/useState';
-import filter from './OrderFilter.js';
-import CardDescriptor from 'components/ui/CardDescriptor.vue';
 import VnLv from 'src/components/ui/VnLv.vue';
 import FetchData from 'components/FetchData.vue';
 import WorkerDescriptorProxy from 'src/pages/Worker/Card/WorkerDescriptorProxy.vue';
@@ -57,14 +55,11 @@ const getConfirmationValue = (isConfirmed) => {
     />
     <CardDescriptorBeta
         v-bind="$attrs"
-        :id
+        :id="entityId"
         :card="OrderCard"
-        ref="descriptor"
-        :url="`Orders/${entityId}`"
-        :filter="filter"
         title="client.name"
         @on-fetch="setData"
-        data-key="Order"
+        module="Order"
     >
         <template #body="{ entity }">
             <VnLv

From c50d6d884ec86786ad4831269b76277e348317d6 Mon Sep 17 00:00:00 2001
From: jtubau <jtubau@verdnatura.es>
Date: Thu, 13 Mar 2025 09:02:41 +0100
Subject: [PATCH 07/44] test: refs #8621 add data-cy attributes for summary
 navigation buttons in CMR list tests

---
 src/components/ui/VnToSummary.vue             |  1 +
 .../integration/route/cmr/cmrList.spec.js     | 77 ++++++++++++++-----
 2 files changed, 59 insertions(+), 19 deletions(-)

diff --git a/src/components/ui/VnToSummary.vue b/src/components/ui/VnToSummary.vue
index 305d65e02..853d26230 100644
--- a/src/components/ui/VnToSummary.vue
+++ b/src/components/ui/VnToSummary.vue
@@ -26,6 +26,7 @@ const id = props.entityId;
         :to="{ name: routeName, params: { id: id } }"
         class="header link"
         :href="url"
+        data-cy="goToSummaryBtn"
     >
         <QIcon name="open_in_new" color="white" size="sm" />
     </router-link>
diff --git a/test/cypress/integration/route/cmr/cmrList.spec.js b/test/cypress/integration/route/cmr/cmrList.spec.js
index 6bcbfc842..5c71132de 100644
--- a/test/cypress/integration/route/cmr/cmrList.spec.js
+++ b/test/cypress/integration/route/cmr/cmrList.spec.js
@@ -9,13 +9,12 @@ describe('Cmr list', () => {
             '.q-virtual-scroll__content > tr:last-child > :nth-child(1) > .q-checkbox',
         downloadBtn: '#subToolbar > .q-btn',
         viewCmr: 'tableAction-0',
-        summaryPopupBtn: '.header > :nth-child(2) > .q-btn__content > .q-icon',
-        summaryPopupHeader: '.summaryHeader > :nth-child(2)',
-        summaryHeader: '.summaryHeader',
-        descriptorId: '.q-item > .q-item__label',
-        descriptorTitle: '.q-item__label--header > .title > span',
-        summaryGoToSummaryBtn: '.header > .q-icon',
-        descriptorGoToSummaryBtn: '.descriptor > .header > a[href] > .q-btn',
+        descriptorOpenSummaryBtn: '.descriptor [data-cy="openSummaryBtn"]',
+        summaryTitle: '.summaryHeader',
+        descriptorId: '.descriptor .subtitle',
+        descriptorTitle: '.descriptor .title',
+        summaryGoToSummaryBtn: '.summaryHeader [data-cy="goToSummaryBtn"]',
+        descriptorGoToSummaryBtn: '.descriptor [data-cy="goToSummaryBtn"]',
         removeFilter: '.q-chip__icon--remove',
     };
 
@@ -54,36 +53,76 @@ describe('Cmr list', () => {
     describe('Ticket pop-ups', () => {
         it('Should redirect to the ticket summary from the ticket descriptor pop-up', () => {
             cy.get(selectors.ticket).click();
-            cy.get(selectors.descriptorId).should('contain', data.ticket);
+            cy.get(selectors.descriptorId)
+                .invoke('text')
+                .then((text) => {
+                    expect(text).to.include(data.ticket);
+                });
             cy.get(selectors.descriptorGoToSummaryBtn).click();
-            cy.get(selectors.summaryHeader).should('contain', data.client);
+            cy.get(selectors.summaryTitle)
+                .invoke('text')
+                .then((text) => {
+                    expect(text).to.include(data.client);
+                });
         });
 
         it('Should redirect to the ticket summary from summary pop-up from the ticket descriptor pop-up', () => {
             cy.get(selectors.ticket).click();
-            cy.get(selectors.descriptorId).should('contain', data.ticket);
-            cy.get(selectors.summaryPopupBtn).click();
-            cy.get(selectors.summaryPopupHeader).should('contain', data.client);
+            cy.get(selectors.descriptorId)
+                .invoke('text')
+                .then((text) => {
+                    expect(text).to.include(data.ticket);
+                });
+            cy.get(selectors.descriptorOpenSummaryBtn).click();
+            cy.get(selectors.summaryTitle)
+                .invoke('text')
+                .then((text) => {
+                    expect(text).to.include(data.client);
+                });
             cy.get(selectors.summaryGoToSummaryBtn).click();
-            cy.get(selectors.summaryHeader).should('contain', data.client);
+            cy.get(selectors.summaryTitle)
+                .invoke('text')
+                .then((text) => {
+                    expect(text).to.include(data.client);
+                });
         });
     });
 
     describe('Client pop-ups', () => {
         it('Should redirect to the client summary from the client descriptor pop-up', () => {
             cy.get(selectors.client).click();
-            cy.get(selectors.descriptorTitle).should('contain', data.client);
+            cy.get(selectors.descriptorTitle)
+                .invoke('text')
+                .then((text) => {
+                    expect(text).to.include(data.client);
+                });
             cy.get(selectors.descriptorGoToSummaryBtn).click();
-            cy.get(selectors.summaryHeader).should('contain', data.client);
+            cy.get(selectors.summaryTitle)
+                .invoke('text')
+                .then((text) => {
+                    expect(text).to.include(data.client);
+                });
         });
 
         it('Should redirect to the client summary from summary pop-up from the client descriptor pop-up', () => {
             cy.get(selectors.client).click();
-            cy.get(selectors.descriptorTitle).should('contain', data.client);
-            cy.get(selectors.summaryPopupBtn).click();
-            cy.get(selectors.summaryHeader).should('contain', data.client);
+            cy.get(selectors.descriptorTitle)
+                .invoke('text')
+                .then((text) => {
+                    expect(text).to.include(data.client);
+                });
+            cy.get(selectors.descriptorOpenSummaryBtn).click();
+            cy.get(selectors.summaryTitle)
+                .invoke('text')
+                .then((text) => {
+                    expect(text).to.include(data.client);
+                });
             cy.get(selectors.summaryGoToSummaryBtn).click();
-            cy.get(selectors.summaryHeader).should('contain', data.client);
+            cy.get(selectors.summaryTitle)
+                .invoke('text')
+                .then((text) => {
+                    expect(text).to.include(data.client);
+                });
         });
     });
 });

From 704bf77771621fc44098275aa9291642b28378d6 Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Thu, 13 Mar 2025 09:05:23 +0100
Subject: [PATCH 08/44] refactor: refs #8463 simplify CardDescriptor

---
 src/components/ui/CardDescriptor.vue | 287 +--------------------------
 1 file changed, 6 insertions(+), 281 deletions(-)

diff --git a/src/components/ui/CardDescriptor.vue b/src/components/ui/CardDescriptor.vue
index 744f84e6d..a5dced551 100644
--- a/src/components/ui/CardDescriptor.vue
+++ b/src/components/ui/CardDescriptor.vue
@@ -1,13 +1,9 @@
 <script setup>
 import { onBeforeMount, watch, computed, ref } from 'vue';
-import { useI18n } from 'vue-i18n';
-import SkeletonDescriptor from 'components/ui/SkeletonDescriptor.vue';
 import { useArrayData } from 'composables/useArrayData';
-import { useSummaryDialog } from 'src/composables/useSummaryDialog';
 import { useState } from 'src/composables/useState';
-import { useRoute, useRouter } from 'vue-router';
-import { useClipboard } from 'src/composables/useClipboard';
-import VnMoreOptions from './VnMoreOptions.vue';
+import { useRoute } from 'vue-router';
+import VnDescriptor from './VnDescriptor.vue';
 
 const $props = defineProps({
     url: {
@@ -18,42 +14,19 @@ const $props = defineProps({
         type: Object,
         default: null,
     },
-    title: {
-        type: String,
-        default: '',
-    },
-    subtitle: {
-        type: Number,
-        default: null,
-    },
     dataKey: {
         type: String,
         default: null,
     },
-    summary: {
-        type: Object,
-        default: null,
-    },
-    width: {
-        type: String,
-        default: 'md-width',
-    },
 });
 
 const state = useState();
 const route = useRoute();
-const router = useRouter();
-const { t } = useI18n();
-const { copyText } = useClipboard();
-const { viewSummary } = useSummaryDialog();
 let arrayData;
 let store;
 let entity;
 const isLoading = ref(false);
 const isSameDataKey = computed(() => $props.dataKey === route.meta.moduleName);
-const DESCRIPTOR_PROXY = 'DescriptorProxy';
-const moduleName = ref();
-const isSameModuleName = route.matched[1].meta.moduleName !== moduleName.value;
 defineExpose({ getData });
 
 onBeforeMount(async () => {
@@ -80,18 +53,6 @@ onBeforeMount(async () => {
     );
 });
 
-function getName() {
-    let name = $props.dataKey;
-    if ($props.dataKey.includes(DESCRIPTOR_PROXY)) {
-        name = name.split(DESCRIPTOR_PROXY)[0];
-    }
-    return name;
-}
-const routeName = computed(() => {
-    let routeName = getName();
-    return `${routeName}Summary`;
-});
-
 async function getData() {
     store.url = $props.url;
     store.filter = $props.filter ?? {};
@@ -105,249 +66,13 @@ async function getData() {
     }
 }
 
-function getValueFromPath(path) {
-    if (!path) return;
-    const keys = path.toString().split('.');
-    let current = entity.value;
-
-    for (const key of keys) {
-        if (current[key] === undefined) return undefined;
-        else current = current[key];
-    }
-    return current;
-}
-
-function copyIdText(id) {
-    copyText(id, {
-        component: {
-            copyValue: id,
-        },
-    });
-}
-
 const emit = defineEmits(['onFetch']);
-
-const iconModule = computed(() => {
-    moduleName.value = getName();
-    if (isSameModuleName) {
-        return router.options.routes[1].children.find((r) => r.name === moduleName.value)
-            ?.meta?.icon;
-    } else {
-        return route.matched[1].meta.icon;
-    }
-});
-
-const toModule = computed(() => {
-    moduleName.value = getName();
-    if (isSameModuleName) {
-        return router.options.routes[1].children.find((r) => r.name === moduleName.value)
-            ?.children[0]?.redirect;
-    } else {
-        return route.matched[1].path.split('/').length > 2
-            ? route.matched[1].redirect
-            : route.matched[1].children[0].redirect;
-    }
-});
 </script>
 
 <template>
-    <div class="descriptor">
-        <template v-if="entity && !isLoading">
-            <div class="header bg-primary q-pa-sm justify-between">
-                <slot name="header-extra-action">
-                    <QBtn
-                        round
-                        flat
-                        dense
-                        size="md"
-                        :icon="iconModule"
-                        color="white"
-                        class="link"
-                        :to="toModule"
-                    >
-                        <QTooltip>
-                            {{ t('globals.goToModuleIndex') }}
-                        </QTooltip>
-                    </QBtn>
-                </slot>
-                <QBtn
-                    @click.stop="viewSummary(entity.id, $props.summary, $props.width)"
-                    round
-                    flat
-                    dense
-                    size="md"
-                    icon="preview"
-                    color="white"
-                    class="link"
-                    v-if="summary"
-                >
-                    <QTooltip>
-                        {{ t('components.smartCard.openSummary') }}
-                    </QTooltip>
-                </QBtn>
-                <RouterLink :to="{ name: routeName, params: { id: entity.id } }">
-                    <QBtn
-                        class="link"
-                        color="white"
-                        dense
-                        flat
-                        icon="launch"
-                        round
-                        size="md"
-                    >
-                        <QTooltip>
-                            {{ t('components.cardDescriptor.summary') }}
-                        </QTooltip>
-                    </QBtn>
-                </RouterLink>
-                <VnMoreOptions v-if="$slots.menu">
-                    <template #menu="{ menuRef }">
-                        <slot name="menu" :entity="entity" :menu-ref="menuRef" />
-                    </template>
-                </VnMoreOptions>
-            </div>
-            <slot name="before" />
-            <div class="body q-py-sm">
-                <QList dense>
-                    <QItemLabel header class="ellipsis text-h5" :lines="1">
-                        <div class="title">
-                            <span v-if="$props.title" :title="getValueFromPath(title)">
-                                {{ getValueFromPath(title) ?? $props.title }}
-                            </span>
-                            <slot v-else name="description" :entity="entity">
-                                <span :title="entity.name">
-                                    {{ entity.name }}
-                                </span>
-                            </slot>
-                        </div>
-                    </QItemLabel>
-                    <QItem>
-                        <QItemLabel class="subtitle">
-                            #{{ getValueFromPath(subtitle) ?? entity.id }}
-                        </QItemLabel>
-                        <QBtn
-                            round
-                            flat
-                            dense
-                            size="sm"
-                            icon="content_copy"
-                            color="primary"
-                            @click.stop="copyIdText(entity.id)"
-                        >
-                            <QTooltip>
-                                {{ t('globals.copyId') }}
-                            </QTooltip>
-                        </QBtn>
-                    </QItem>
-                </QList>
-                <div class="list-box q-mt-xs">
-                    <slot name="body" :entity="entity" />
-                </div>
-            </div>
-            <div class="icons">
-                <slot name="icons" :entity="entity" />
-            </div>
-            <div class="actions justify-center" data-cy="descriptor_actions">
-                <slot name="actions" :entity="entity" />
-            </div>
-            <slot name="after" />
+    <VnDescriptor v-model="entity" v-bind="$attrs" :module="dataKey">
+        <template v-for="(_, slotName) in $slots" #[slotName]="slotData" :key="slotName">
+            <slot :name="slotName" v-bind="slotData ?? {}" :key="slotName" />
         </template>
-        <SkeletonDescriptor v-if="!entity || isLoading" />
-    </div>
-    <QInnerLoading
-        :label="t('globals.pleaseWait')"
-        :showing="isLoading"
-        color="primary"
-    />
+    </VnDescriptor>
 </template>
-
-<style lang="scss">
-.body {
-    background-color: var(--vn-section-color);
-    .text-h5 {
-        font-size: 20px;
-        padding-top: 5px;
-        padding-bottom: 0px;
-    }
-    .q-item {
-        min-height: 20px;
-
-        .link {
-            margin-left: 10px;
-        }
-    }
-    .vn-label-value {
-        display: flex;
-        padding: 0px 16px;
-        .label {
-            color: var(--vn-label-color);
-            font-size: 14px;
-
-            &:not(:has(a))::after {
-                content: ':';
-            }
-        }
-        .value {
-            color: var(--vn-text-color);
-            font-size: 14px;
-            margin-left: 4px;
-            overflow: hidden;
-            text-overflow: ellipsis;
-            white-space: nowrap;
-            text-align: left;
-        }
-        .info {
-            margin-left: 5px;
-        }
-    }
-}
-</style>
-
-<style lang="scss" scoped>
-.title {
-    overflow: hidden;
-    text-overflow: ellipsis;
-    span {
-        color: var(--vn-text-color);
-        font-weight: bold;
-    }
-}
-.subtitle {
-    color: var(--vn-text-color);
-    font-size: 16px;
-    margin-bottom: 2px;
-}
-.list-box {
-    .q-item__label {
-        color: var(--vn-label-color);
-        padding-bottom: 0%;
-    }
-}
-.descriptor {
-    width: 256px;
-    .header {
-        display: flex;
-        align-items: center;
-    }
-    .icons {
-        margin: 0 10px;
-        display: flex;
-        justify-content: center;
-        .q-icon {
-            margin-right: 5px;
-        }
-    }
-    .actions {
-        margin: 0 5px;
-        justify-content: center !important;
-    }
-}
-</style>
-<i18n>
-    en:
-        globals:
-            copyId: Copy ID
-    es:
-        globals:
-            copyId: Copiar ID
-</i18n>

From 610075ab5551c54988aefabb6f0fe122d1121c19 Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Thu, 13 Mar 2025 10:30:39 +0100
Subject: [PATCH 09/44] refactor: refs #8463 update VnCard and Order components
 for improved data handling and consistency

---
 src/components/common/VnCard.vue              | 2 +-
 src/components/ui/CardDescriptorBeta.vue      | 2 +-
 src/components/ui/VnDescriptor.vue            | 2 --
 src/pages/Order/Card/OrderCard.vue            | 2 +-
 src/pages/Order/Card/OrderDescriptorProxy.vue | 2 +-
 5 files changed, 4 insertions(+), 6 deletions(-)

diff --git a/src/components/common/VnCard.vue b/src/components/common/VnCard.vue
index dfa51c8c4..4848f1490 100644
--- a/src/components/common/VnCard.vue
+++ b/src/components/common/VnCard.vue
@@ -57,7 +57,7 @@ onBeforeRouteUpdate(async (to, from) => {
             router.push({ name, params: to.params });
         }
     }
-    if (entityId.value !== from.params.id) await fetch(entityId.value, true);
+    if (entityId.value !== to.params.id) await fetch(to.params.id, true);
 });
 
 async function fetch(id, append = false) {
diff --git a/src/components/ui/CardDescriptorBeta.vue b/src/components/ui/CardDescriptorBeta.vue
index 86f756a7b..5f9a89d64 100644
--- a/src/components/ui/CardDescriptorBeta.vue
+++ b/src/components/ui/CardDescriptorBeta.vue
@@ -26,7 +26,7 @@ const entity = ref();
         @on-fetch="
             (data) => {
                 entity = data;
-                isLoading = false;
+                emit('onFetch', data);
             }
         "
     />
diff --git a/src/components/ui/VnDescriptor.vue b/src/components/ui/VnDescriptor.vue
index 0aad35448..2e6d98f16 100644
--- a/src/components/ui/VnDescriptor.vue
+++ b/src/components/ui/VnDescriptor.vue
@@ -3,7 +3,6 @@ import { computed, ref } from 'vue';
 import { useI18n } from 'vue-i18n';
 import SkeletonDescriptor from 'components/ui/SkeletonDescriptor.vue';
 import { useSummaryDialog } from 'src/composables/useSummaryDialog';
-import { useState } from 'src/composables/useState';
 import { useRoute, useRouter } from 'vue-router';
 import { useClipboard } from 'src/composables/useClipboard';
 import VnMoreOptions from './VnMoreOptions.vue';
@@ -32,7 +31,6 @@ const $props = defineProps({
     },
 });
 
-const state = useState();
 const route = useRoute();
 const router = useRouter();
 const { t } = useI18n();
diff --git a/src/pages/Order/Card/OrderCard.vue b/src/pages/Order/Card/OrderCard.vue
index 20c61b127..11dbbe532 100644
--- a/src/pages/Order/Card/OrderCard.vue
+++ b/src/pages/Order/Card/OrderCard.vue
@@ -6,7 +6,7 @@ import filter from './OrderFilter.js';
 
 <template>
     <VnCard
-        data-key="Order"
+        :data-key="$attrs['data-key'] ?? 'Order'"
         url="Orders"
         :filter="filter"
         :descriptor="OrderDescriptor"
diff --git a/src/pages/Order/Card/OrderDescriptorProxy.vue b/src/pages/Order/Card/OrderDescriptorProxy.vue
index 7b3d1a871..1dff1b620 100644
--- a/src/pages/Order/Card/OrderDescriptorProxy.vue
+++ b/src/pages/Order/Card/OrderDescriptorProxy.vue
@@ -16,7 +16,7 @@ const $props = defineProps({
             v-if="$props.id"
             :id="$props.id"
             :summary="OrderSummary"
-            data-key="orderDescriptor"
+            data-key="OrderDescriptor"
         />
     </QPopupProxy>
 </template>

From 911097dae46d6ab1e287f9bee3a250d3a7a7659a Mon Sep 17 00:00:00 2001
From: jtubau <jtubau@verdnatura.es>
Date: Fri, 14 Mar 2025 07:25:58 +0100
Subject: [PATCH 10/44] test: refs #8621 remove unnecessary checkbox click in
 CMR list test

---
 test/cypress/integration/route/cmr/cmrList.spec.js | 1 -
 1 file changed, 1 deletion(-)

diff --git a/test/cypress/integration/route/cmr/cmrList.spec.js b/test/cypress/integration/route/cmr/cmrList.spec.js
index 5c71132de..8d9299ce7 100644
--- a/test/cypress/integration/route/cmr/cmrList.spec.js
+++ b/test/cypress/integration/route/cmr/cmrList.spec.js
@@ -45,7 +45,6 @@ describe('Cmr list', () => {
         cy.window().then((win) => {
             cy.stub(win, 'open').as('windowOpen');
         });
-        cy.get(selectors.lastRowSelectCheckBox).click();
         cy.dataCy(selectors.viewCmr).last().click();
         cy.get('@windowOpen').should('be.calledWithMatch', '\/api\/Cmrs\/3');
     });

From 1139035e4583310d6c4d6bb4b17453414758081a Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Fri, 14 Mar 2025 09:13:45 +0100
Subject: [PATCH 11/44] refactor: refs #8463 replace CardDescriptor with
 EntityDescriptor in multiple components

---
 src/components/common/VnCard.vue              |  4 +-
 src/components/ui/CardDescriptor.vue          | 78 +++++--------------
 src/components/ui/CardDescriptorBeta.vue      | 38 ---------
 src/components/ui/EntityDescriptor.vue        | 78 +++++++++++++++++++
 src/components/ui/VnDescriptor.vue            |  6 +-
 .../Account/Alias/Card/AliasDescriptor.vue    |  6 +-
 src/pages/Account/Card/AccountDescriptor.vue  |  6 +-
 .../Account/Role/Card/RoleDescriptor.vue      |  6 +-
 src/pages/Claim/Card/ClaimDescriptor.vue      |  6 +-
 .../Customer/Card/CustomerDescriptor.vue      |  6 +-
 src/pages/Entry/Card/EntryDescriptor.vue      |  6 +-
 .../InvoiceIn/Card/InvoiceInDescriptor.vue    |  6 +-
 .../InvoiceOut/Card/InvoiceOutDescriptor.vue  |  6 +-
 src/pages/Item/Card/ItemDescriptor.vue        |  6 +-
 .../Item/ItemType/Card/ItemTypeDescriptor.vue |  6 +-
 src/pages/Order/Card/OrderDescriptor.vue      |  6 +-
 .../Route/Agency/Card/AgencyDescriptor.vue    |  6 +-
 src/pages/Route/Card/RouteDescriptor.vue      |  6 +-
 src/pages/Route/Roadmap/RoadmapDescriptor.vue |  6 +-
 .../Route/Vehicle/Card/VehicleDescriptor.vue  |  6 +-
 .../Shelving/Card/ShelvingDescriptor.vue      |  6 +-
 .../Parking/Card/ParkingDescriptor.vue        |  6 +-
 .../Supplier/Card/SupplierDescriptor.vue      |  6 +-
 src/pages/Ticket/Card/TicketDescriptor.vue    |  6 +-
 src/pages/Travel/Card/TravelDescriptor.vue    |  6 +-
 src/pages/Worker/Card/WorkerDescriptor.vue    |  6 +-
 .../Department/Card/DepartmentDescriptor.vue  |  6 +-
 src/pages/Zone/Card/ZoneDescriptor.vue        |  6 +-
 28 files changed, 171 insertions(+), 171 deletions(-)
 delete mode 100644 src/components/ui/CardDescriptorBeta.vue
 create mode 100644 src/components/ui/EntityDescriptor.vue

diff --git a/src/components/common/VnCard.vue b/src/components/common/VnCard.vue
index 4848f1490..21cdc9df5 100644
--- a/src/components/common/VnCard.vue
+++ b/src/components/common/VnCard.vue
@@ -73,10 +73,10 @@ function hasRouteParam(params, valueToCheck = ':addressId') {
 }
 </script>
 <template>
-    <span v-if="visual">
+    <template v-if="visual">
         <VnSubToolbar />
         <div :class="[useCardSize(), $attrs.class]">
             <RouterView :key="$route.path" />
         </div>
-    </span>
+    </template>
 </template>
diff --git a/src/components/ui/CardDescriptor.vue b/src/components/ui/CardDescriptor.vue
index a5dced551..5f9a89d64 100644
--- a/src/components/ui/CardDescriptor.vue
+++ b/src/components/ui/CardDescriptor.vue
@@ -1,76 +1,36 @@
 <script setup>
-import { onBeforeMount, watch, computed, ref } from 'vue';
-import { useArrayData } from 'composables/useArrayData';
-import { useState } from 'src/composables/useState';
-import { useRoute } from 'vue-router';
+import { ref } from 'vue';
 import VnDescriptor from './VnDescriptor.vue';
 
 const $props = defineProps({
-    url: {
-        type: String,
-        default: '',
+    id: {
+        type: Number,
+        default: false,
     },
-    filter: {
+    card: {
         type: Object,
         default: null,
     },
-    dataKey: {
-        type: String,
-        default: null,
-    },
 });
 
-const state = useState();
-const route = useRoute();
-let arrayData;
-let store;
-let entity;
-const isLoading = ref(false);
-const isSameDataKey = computed(() => $props.dataKey === route.meta.moduleName);
-defineExpose({ getData });
-
-onBeforeMount(async () => {
-    arrayData = useArrayData($props.dataKey, {
-        url: $props.url,
-        userFilter: $props.filter,
-        skip: 0,
-        oneRecord: true,
-    });
-    store = arrayData.store;
-    entity = computed(() => {
-        const data = store.data ?? {};
-        if (data) emit('onFetch', data);
-        return data;
-    });
-
-    // It enables to load data only once if the module is the same as the dataKey
-    if (!isSameDataKey.value || !route.params.id) await getData();
-    watch(
-        () => [$props.url, $props.filter],
-        async () => {
-            if (!isSameDataKey.value) await getData();
-        },
-    );
-});
-
-async function getData() {
-    store.url = $props.url;
-    store.filter = $props.filter ?? {};
-    isLoading.value = true;
-    try {
-        const { data } = await arrayData.fetch({ append: false, updateRouter: false });
-        state.set($props.dataKey, data);
-        emit('onFetch', data);
-    } finally {
-        isLoading.value = false;
-    }
-}
-
 const emit = defineEmits(['onFetch']);
+const entity = ref();
 </script>
 
 <template>
-    <VnDescriptor v-model="entity" v-bind="$attrs" :module="dataKey">
+    <component
+        :is="card"
+        :id
+        :visual="false"
+        v-bind="$attrs"
+        @on-fetch="
+            (data) => {
+                entity = data;
+                emit('onFetch', data);
+            }
+        "
+    />
+    <VnDescriptor v-model="entity" v-bind="$attrs">
         <template v-for="(_, slotName) in $slots" #[slotName]="slotData" :key="slotName">
             <slot :name="slotName" v-bind="slotData ?? {}" :key="slotName" />
         </template>
diff --git a/src/components/ui/CardDescriptorBeta.vue b/src/components/ui/CardDescriptorBeta.vue
deleted file mode 100644
index 5f9a89d64..000000000
--- a/src/components/ui/CardDescriptorBeta.vue
+++ /dev/null
@@ -1,38 +0,0 @@
-<script setup>
-import { ref } from 'vue';
-import VnDescriptor from './VnDescriptor.vue';
-
-const $props = defineProps({
-    id: {
-        type: Number,
-        default: false,
-    },
-    card: {
-        type: Object,
-        default: null,
-    },
-});
-
-const emit = defineEmits(['onFetch']);
-const entity = ref();
-</script>
-
-<template>
-    <component
-        :is="card"
-        :id
-        :visual="false"
-        v-bind="$attrs"
-        @on-fetch="
-            (data) => {
-                entity = data;
-                emit('onFetch', data);
-            }
-        "
-    />
-    <VnDescriptor v-model="entity" v-bind="$attrs">
-        <template v-for="(_, slotName) in $slots" #[slotName]="slotData" :key="slotName">
-            <slot :name="slotName" v-bind="slotData ?? {}" :key="slotName" />
-        </template>
-    </VnDescriptor>
-</template>
diff --git a/src/components/ui/EntityDescriptor.vue b/src/components/ui/EntityDescriptor.vue
new file mode 100644
index 000000000..a5dced551
--- /dev/null
+++ b/src/components/ui/EntityDescriptor.vue
@@ -0,0 +1,78 @@
+<script setup>
+import { onBeforeMount, watch, computed, ref } from 'vue';
+import { useArrayData } from 'composables/useArrayData';
+import { useState } from 'src/composables/useState';
+import { useRoute } from 'vue-router';
+import VnDescriptor from './VnDescriptor.vue';
+
+const $props = defineProps({
+    url: {
+        type: String,
+        default: '',
+    },
+    filter: {
+        type: Object,
+        default: null,
+    },
+    dataKey: {
+        type: String,
+        default: null,
+    },
+});
+
+const state = useState();
+const route = useRoute();
+let arrayData;
+let store;
+let entity;
+const isLoading = ref(false);
+const isSameDataKey = computed(() => $props.dataKey === route.meta.moduleName);
+defineExpose({ getData });
+
+onBeforeMount(async () => {
+    arrayData = useArrayData($props.dataKey, {
+        url: $props.url,
+        userFilter: $props.filter,
+        skip: 0,
+        oneRecord: true,
+    });
+    store = arrayData.store;
+    entity = computed(() => {
+        const data = store.data ?? {};
+        if (data) emit('onFetch', data);
+        return data;
+    });
+
+    // It enables to load data only once if the module is the same as the dataKey
+    if (!isSameDataKey.value || !route.params.id) await getData();
+    watch(
+        () => [$props.url, $props.filter],
+        async () => {
+            if (!isSameDataKey.value) await getData();
+        },
+    );
+});
+
+async function getData() {
+    store.url = $props.url;
+    store.filter = $props.filter ?? {};
+    isLoading.value = true;
+    try {
+        const { data } = await arrayData.fetch({ append: false, updateRouter: false });
+        state.set($props.dataKey, data);
+        emit('onFetch', data);
+    } finally {
+        isLoading.value = false;
+    }
+}
+
+const emit = defineEmits(['onFetch']);
+</script>
+
+<template>
+    <VnDescriptor v-model="entity" v-bind="$attrs" :module="dataKey">
+        <template v-for="(_, slotName) in $slots" #[slotName]="slotData" :key="slotName">
+            <slot :name="slotName" v-bind="slotData ?? {}" :key="slotName" />
+        </template>
+    </VnDescriptor>
+</template>
diff --git a/src/components/ui/VnDescriptor.vue b/src/components/ui/VnDescriptor.vue
index 2e6d98f16..7ca9a3a1e 100644
--- a/src/components/ui/VnDescriptor.vue
+++ b/src/components/ui/VnDescriptor.vue
@@ -118,7 +118,7 @@ const toModule = computed(() => {
                     </QBtn>
                 </slot>
                 <QBtn
-                    @click.stop="viewSummary(entity.id, $props.summary, $props.width)"
+                    @click.stop="viewSummary(entity.id, summary, width)"
                     round
                     flat
                     dense
@@ -158,8 +158,8 @@ const toModule = computed(() => {
                 <QList dense>
                     <QItemLabel header class="ellipsis text-h5" :lines="1">
                         <div class="title">
-                            <span v-if="$props.title" :title="getValueFromPath(title)">
-                                {{ getValueFromPath(title) ?? $props.title }}
+                            <span v-if="title" :title="getValueFromPath(title)">
+                                {{ getValueFromPath(title) ?? title }}
                             </span>
                             <slot v-else name="description" :entity="entity">
                                 <span :title="entity.name">
diff --git a/src/pages/Account/Alias/Card/AliasDescriptor.vue b/src/pages/Account/Alias/Card/AliasDescriptor.vue
index 671ef7fbc..c9fdf9540 100644
--- a/src/pages/Account/Alias/Card/AliasDescriptor.vue
+++ b/src/pages/Account/Alias/Card/AliasDescriptor.vue
@@ -4,7 +4,7 @@ import { useRoute, useRouter } from 'vue-router';
 import { useI18n } from 'vue-i18n';
 import { useQuasar } from 'quasar';
 
-import CardDescriptor from 'components/ui/CardDescriptor.vue';
+import EntityDescriptor from 'components/ui/EntityDescriptor.vue';
 import VnLv from 'src/components/ui/VnLv.vue';
 
 import axios from 'axios';
@@ -48,7 +48,7 @@ const removeAlias = () => {
 </script>
 
 <template>
-    <CardDescriptor
+    <EntityDescriptoror
         ref="descriptor"
         :url="`MailAliases/${entityId}`"
         data-key="Alias"
@@ -62,7 +62,7 @@ const removeAlias = () => {
         <template #body="{ entity }">
             <VnLv :label="t('role.description')" :value="entity.description" />
         </template>
-    </CardDescriptor>
+    </EntityDescriptoror>
 </template>
 
 <i18n>
diff --git a/src/pages/Account/Card/AccountDescriptor.vue b/src/pages/Account/Card/AccountDescriptor.vue
index 49328fe87..5537c9693 100644
--- a/src/pages/Account/Card/AccountDescriptor.vue
+++ b/src/pages/Account/Card/AccountDescriptor.vue
@@ -1,7 +1,7 @@
 <script setup>
 import { ref, computed, onMounted } from 'vue';
 import { useRoute } from 'vue-router';
-import CardDescriptor from 'components/ui/CardDescriptor.vue';
+import EntityDescriptor from 'components/ui/EntityDescriptor.vue';
 import VnLv from 'src/components/ui/VnLv.vue';
 import AccountDescriptorMenu from './AccountDescriptorMenu.vue';
 import VnImg from 'src/components/ui/VnImg.vue';
@@ -20,7 +20,7 @@ onMounted(async () => {
 </script>
 
 <template>
-    <CardDescriptor
+    <EntityDescriptoror
         ref="descriptor"
         :url="`VnUsers/preview`"
         :filter="{ ...filter, where: { id: entityId } }"
@@ -78,7 +78,7 @@ onMounted(async () => {
                 </QIcon>
             </QCardActions>
         </template>
-    </CardDescriptor>
+    </EntityDescriptoror>
 </template>
 <style scoped>
 .q-item__label {
diff --git a/src/pages/Account/Role/Card/RoleDescriptor.vue b/src/pages/Account/Role/Card/RoleDescriptor.vue
index 517517af0..b364001b6 100644
--- a/src/pages/Account/Role/Card/RoleDescriptor.vue
+++ b/src/pages/Account/Role/Card/RoleDescriptor.vue
@@ -2,7 +2,7 @@
 import { computed } from 'vue';
 import { useRoute } from 'vue-router';
 import { useI18n } from 'vue-i18n';
-import CardDescriptor from 'components/ui/CardDescriptor.vue';
+import EntityDescriptor from 'components/ui/EntityDescriptor.vue';
 import VnLv from 'src/components/ui/VnLv.vue';
 import axios from 'axios';
 import useNotify from 'src/composables/useNotify.js';
@@ -32,7 +32,7 @@ const removeRole = async () => {
 </script>
 
 <template>
-    <CardDescriptor
+    <EntityDescriptoror
         url="VnRoles"
         :filter="{ where: { id: entityId } }"
         data-key="Role"
@@ -46,7 +46,7 @@ const removeRole = async () => {
         <template #body="{ entity }">
             <VnLv :label="t('role.description')" :value="entity.description" />
         </template>
-    </CardDescriptor>
+    </EntityDescriptoror>
 </template>
 <style scoped>
 .q-item__label {
diff --git a/src/pages/Claim/Card/ClaimDescriptor.vue b/src/pages/Claim/Card/ClaimDescriptor.vue
index d789b63d3..e3eeade83 100644
--- a/src/pages/Claim/Card/ClaimDescriptor.vue
+++ b/src/pages/Claim/Card/ClaimDescriptor.vue
@@ -6,7 +6,7 @@ import { toDateHourMinSec, toPercentage } from 'src/filters';
 import TicketDescriptorProxy from 'pages/Ticket/Card/TicketDescriptorProxy.vue';
 import ClaimDescriptorMenu from 'pages/Claim/Card/ClaimDescriptorMenu.vue';
 import DepartmentDescriptorProxy from 'src/pages/Worker/Department/Card/DepartmentDescriptorProxy.vue';
-import CardDescriptor from 'components/ui/CardDescriptor.vue';
+import EntityDescriptor from 'components/ui/EntityDescriptor.vue';
 import VnLv from 'src/components/ui/VnLv.vue';
 import VnUserLink from 'src/components/ui/VnUserLink.vue';
 import { getUrl } from 'src/composables/getUrl';
@@ -44,7 +44,7 @@ onMounted(async () => {
 </script>
 
 <template>
-    <CardDescriptor
+    <EntityDescriptoror
         :url="`Claims/${entityId}`"
         :filter="filter"
         title="client.name"
@@ -147,7 +147,7 @@ onMounted(async () => {
                 </QBtn>
             </QCardActions>
         </template>
-    </CardDescriptor>
+    </EntityDescriptoror>
 </template>
 <style scoped>
 .q-item__label {
diff --git a/src/pages/Customer/Card/CustomerDescriptor.vue b/src/pages/Customer/Card/CustomerDescriptor.vue
index 8978c00f1..7696f086c 100644
--- a/src/pages/Customer/Card/CustomerDescriptor.vue
+++ b/src/pages/Customer/Card/CustomerDescriptor.vue
@@ -7,7 +7,7 @@ import { toCurrency, toDate } from 'src/filters';
 
 import useCardDescription from 'src/composables/useCardDescription';
 
-import CardDescriptor from 'components/ui/CardDescriptor.vue';
+import EntityDescriptor from 'components/ui/EntityDescriptor.vue';
 import VnLv from 'src/components/ui/VnLv.vue';
 import CustomerDescriptorMenu from './CustomerDescriptorMenu.vue';
 import DepartmentDescriptorProxy from 'src/pages/Worker/Department/Card/DepartmentDescriptorProxy.vue';
@@ -54,7 +54,7 @@ const debtWarning = computed(() => {
 </script>
 
 <template>
-    <CardDescriptor
+    <EntityDescriptoror
         :url="`Clients/${entityId}/getCard`"
         :summary="$props.summary"
         data-key="Customer"
@@ -232,7 +232,7 @@ const debtWarning = computed(() => {
                 </QBtn>
             </QCardActions>
         </template>
-    </CardDescriptor>
+    </EntityDescriptoror>
 </template>
 
 <i18n>
diff --git a/src/pages/Entry/Card/EntryDescriptor.vue b/src/pages/Entry/Card/EntryDescriptor.vue
index 313ed3d72..962f777ce 100644
--- a/src/pages/Entry/Card/EntryDescriptor.vue
+++ b/src/pages/Entry/Card/EntryDescriptor.vue
@@ -6,7 +6,7 @@ import { toDate } from 'src/filters';
 import { getUrl } from 'src/composables/getUrl';
 import { useQuasar } from 'quasar';
 import { usePrintService } from 'composables/usePrintService';
-import CardDescriptor from 'components/ui/CardDescriptor.vue';
+import EntityDescriptor from 'components/ui/EntityDescriptor.vue';
 import VnLv from 'src/components/ui/VnLv.vue';
 import TravelDescriptorProxy from 'src/pages/Travel/Card/TravelDescriptorProxy.vue';
 import axios from 'axios';
@@ -145,7 +145,7 @@ async function deleteEntry() {
 </script>
 
 <template>
-    <CardDescriptor
+    <EntityDescriptoror
         :url="`Entries/${entityId}`"
         :filter="entryFilter"
         title="supplier.nickname"
@@ -264,7 +264,7 @@ async function deleteEntry() {
                 </QBtn>
             </QCardActions>
         </template>
-    </CardDescriptor>
+    </EntityDescriptoror>
 </template>
 <i18n>
 es:
diff --git a/src/pages/InvoiceIn/Card/InvoiceInDescriptor.vue b/src/pages/InvoiceIn/Card/InvoiceInDescriptor.vue
index 3843f5bf7..22ddb25d4 100644
--- a/src/pages/InvoiceIn/Card/InvoiceInDescriptor.vue
+++ b/src/pages/InvoiceIn/Card/InvoiceInDescriptor.vue
@@ -5,7 +5,7 @@ import { useI18n } from 'vue-i18n';
 import axios from 'axios';
 import { toCurrency, toDate } from 'src/filters';
 import VnLv from 'src/components/ui/VnLv.vue';
-import CardDescriptor from 'components/ui/CardDescriptor.vue';
+import EntityDescriptor from 'components/ui/EntityDescriptor.vue';
 import SupplierDescriptorProxy from 'src/pages/Supplier/Card/SupplierDescriptorProxy.vue';
 import filter from './InvoiceInFilter.js';
 import InvoiceInDescriptorMenu from './InvoiceInDescriptorMenu.vue';
@@ -88,7 +88,7 @@ async function setInvoiceCorrection(id) {
 }
 </script>
 <template>
-    <CardDescriptor
+    <EntityDescriptoror
         ref="cardDescriptorRef"
         data-key="InvoiceIn"
         :url="`InvoiceIns/${entityId}`"
@@ -163,7 +163,7 @@ async function setInvoiceCorrection(id) {
                 </QBtn>
             </QCardActions>
         </template>
-    </CardDescriptor>
+    </EntityDescriptoror>
 </template>
 <style lang="scss" scoped>
 .q-dialog {
diff --git a/src/pages/InvoiceOut/Card/InvoiceOutDescriptor.vue b/src/pages/InvoiceOut/Card/InvoiceOutDescriptor.vue
index 2402c0bf6..6b4399ceb 100644
--- a/src/pages/InvoiceOut/Card/InvoiceOutDescriptor.vue
+++ b/src/pages/InvoiceOut/Card/InvoiceOutDescriptor.vue
@@ -3,7 +3,7 @@ import { ref, computed } from 'vue';
 import { useRoute } from 'vue-router';
 import { useI18n } from 'vue-i18n';
 
-import CardDescriptor from 'components/ui/CardDescriptor.vue';
+import EntityDescriptor from 'components/ui/EntityDescriptor.vue';
 import CustomerDescriptorProxy from 'pages/Customer/Card/CustomerDescriptorProxy.vue';
 import VnLv from 'src/components/ui/VnLv.vue';
 import InvoiceOutDescriptorMenu from './InvoiceOutDescriptorMenu.vue';
@@ -34,7 +34,7 @@ function ticketFilter(invoice) {
 </script>
 
 <template>
-    <CardDescriptor
+    <EntityDescriptoror
         ref="descriptor"
         :url="`InvoiceOuts/${entityId}`"
         :filter="filter"
@@ -93,5 +93,5 @@ function ticketFilter(invoice) {
                 </QBtn>
             </QCardActions>
         </template>
-    </CardDescriptor>
+    </EntityDescriptoror>
 </template>
diff --git a/src/pages/Item/Card/ItemDescriptor.vue b/src/pages/Item/Card/ItemDescriptor.vue
index 84e07a293..d624d8db9 100644
--- a/src/pages/Item/Card/ItemDescriptor.vue
+++ b/src/pages/Item/Card/ItemDescriptor.vue
@@ -3,7 +3,7 @@ import { computed, ref, onMounted } from 'vue';
 import { useRoute } from 'vue-router';
 import { useI18n } from 'vue-i18n';
 
-import CardDescriptor from 'src/components/ui/CardDescriptor.vue';
+import EntityDescriptor from 'src/components/ui/EntityDescriptor.vue';
 import VnLv from 'src/components/ui/VnLv.vue';
 import WorkerDescriptorProxy from 'src/pages/Worker/Card/WorkerDescriptorProxy.vue';
 import ItemDescriptorImage from 'src/pages/Item/Card/ItemDescriptorImage.vue';
@@ -90,7 +90,7 @@ const updateStock = async () => {
 </script>
 
 <template>
-    <CardDescriptor
+    <EntityDescriptoror
         data-key="Item"
         :summary="$props.summary"
         :url="`Items/${entityId}/getCard`"
@@ -162,7 +162,7 @@ const updateStock = async () => {
                 </QBtn>
             </QCardActions>
         </template>
-    </CardDescriptor>
+    </EntityDescriptoror>
 </template>
 
 <i18n>
diff --git a/src/pages/Item/ItemType/Card/ItemTypeDescriptor.vue b/src/pages/Item/ItemType/Card/ItemTypeDescriptor.vue
index 725fb30aa..7bc1925a1 100644
--- a/src/pages/Item/ItemType/Card/ItemTypeDescriptor.vue
+++ b/src/pages/Item/ItemType/Card/ItemTypeDescriptor.vue
@@ -2,7 +2,7 @@
 import { computed } from 'vue';
 import { useRoute } from 'vue-router';
 
-import CardDescriptor from 'components/ui/CardDescriptor.vue';
+import EntityDescriptor from 'components/ui/EntityDescriptor.vue';
 import VnLv from 'src/components/ui/VnLv.vue';
 import WorkerDescriptorProxy from 'src/pages/Worker/Card/WorkerDescriptorProxy.vue';
 import filter from './ItemTypeFilter.js';
@@ -25,7 +25,7 @@ const entityId = computed(() => {
 });
 </script>
 <template>
-    <CardDescriptor
+    <EntityDescriptoror
         :url="`ItemTypes/${entityId}`"
         :filter="filter"
         title="code"
@@ -45,5 +45,5 @@ const entityId = computed(() => {
                 :value="entity.category?.name"
             />
         </template>
-    </CardDescriptor>
+    </EntityDescriptoror>
 </template>
diff --git a/src/pages/Order/Card/OrderDescriptor.vue b/src/pages/Order/Card/OrderDescriptor.vue
index 9fcb44580..ee66bb57e 100644
--- a/src/pages/Order/Card/OrderDescriptor.vue
+++ b/src/pages/Order/Card/OrderDescriptor.vue
@@ -7,7 +7,7 @@ import { useState } from 'src/composables/useState';
 import VnLv from 'src/components/ui/VnLv.vue';
 import FetchData from 'components/FetchData.vue';
 import OrderCard from './OrderCard.vue';
-import CardDescriptorBeta from 'src/components/ui/CardDescriptorBeta.vue';
+import CardDescriptor from 'src/components/ui/CardDescriptor.vue';
 import DepartmentDescriptorProxy from 'src/pages/Worker/Department/Card/DepartmentDescriptorProxy.vue';
 
 const DEFAULT_ITEMS = 0;
@@ -53,7 +53,7 @@ const getConfirmationValue = (isConfirmed) => {
             }
         "
     />
-    <CardDescriptorBeta
+    <CardDescriptor
         v-bind="$attrs"
         :id="entityId"
         :card="OrderCard"
@@ -110,5 +110,5 @@ const getConfirmationValue = (isConfirmed) => {
                 </QBtn>
             </QCardActions>
         </template>
-    </CardDescriptorBeta>
+    </CardDescriptor>
 </template>
diff --git a/src/pages/Route/Agency/Card/AgencyDescriptor.vue b/src/pages/Route/Agency/Card/AgencyDescriptor.vue
index a0472c6c3..f2cb80b98 100644
--- a/src/pages/Route/Agency/Card/AgencyDescriptor.vue
+++ b/src/pages/Route/Agency/Card/AgencyDescriptor.vue
@@ -3,7 +3,7 @@ import { computed } from 'vue';
 import { useI18n } from 'vue-i18n';
 import { useRoute } from 'vue-router';
 import { useArrayData } from 'src/composables/useArrayData';
-import CardDescriptor from 'components/ui/CardDescriptor.vue';
+import EntityDescriptor from 'components/ui/EntityDescriptor.vue';
 import VnLv from 'components/ui/VnLv.vue';
 
 const props = defineProps({
@@ -21,7 +21,7 @@ const { store } = useArrayData('Parking');
 const card = computed(() => store.data);
 </script>
 <template>
-    <CardDescriptor
+    <EntityDescriptoror
         data-key="Agency"
         :url="`Agencies/${entityId}`"
         :title="card?.name"
@@ -30,5 +30,5 @@ const card = computed(() => store.data);
         <template #body="{ entity: agency }">
             <VnLv :label="t('globals.name')" :value="agency.name" />
         </template>
-    </CardDescriptor>
+    </EntityDescriptoror>
 </template>
diff --git a/src/pages/Route/Card/RouteDescriptor.vue b/src/pages/Route/Card/RouteDescriptor.vue
index 01fb9c4ba..4659e8a81 100644
--- a/src/pages/Route/Card/RouteDescriptor.vue
+++ b/src/pages/Route/Card/RouteDescriptor.vue
@@ -1,7 +1,7 @@
 <script setup>
 import { ref, computed, onMounted } from 'vue';
 import { useRoute } from 'vue-router';
-import CardDescriptor from 'components/ui/CardDescriptor.vue';
+import EntityDescriptor from 'components/ui/EntityDescriptor.vue';
 import VnLv from 'components/ui/VnLv.vue';
 import { dashIfEmpty, toDate } from 'src/filters';
 import RouteDescriptorMenu from 'pages/Route/Card/RouteDescriptorMenu.vue';
@@ -47,7 +47,7 @@ onMounted(async () => {
 });
 </script>
 <template>
-    <CardDescriptor
+    <EntityDescriptoror
         :url="`Routes/${entityId}`"
         :filter="filter"
         :title="null"
@@ -69,7 +69,7 @@ onMounted(async () => {
         <template #menu="{ entity }">
             <RouteDescriptorMenu :route="entity" />
         </template>
-    </CardDescriptor>
+    </EntityDescriptoror>
 </template>
 <i18n>
 es:
diff --git a/src/pages/Route/Roadmap/RoadmapDescriptor.vue b/src/pages/Route/Roadmap/RoadmapDescriptor.vue
index 198bcf8c7..92c471fc4 100644
--- a/src/pages/Route/Roadmap/RoadmapDescriptor.vue
+++ b/src/pages/Route/Roadmap/RoadmapDescriptor.vue
@@ -2,7 +2,7 @@
 import { computed } from 'vue';
 import { useRoute } from 'vue-router';
 import { useI18n } from 'vue-i18n';
-import CardDescriptor from 'components/ui/CardDescriptor.vue';
+import EntityDescriptor from 'components/ui/EntityDescriptor.vue';
 import VnLv from 'components/ui/VnLv.vue';
 import { dashIfEmpty, toDateHourMin } from 'src/filters';
 import SupplierDescriptorProxy from 'pages/Supplier/Card/SupplierDescriptorProxy.vue';
@@ -30,7 +30,7 @@ const entityId = computed(() => {
 </script>
 
 <template>
-    <CardDescriptor
+    <EntityDescriptoror
         :url="`Roadmaps/${entityId}`"
         :filter="filter"
         data-key="Roadmap"
@@ -51,7 +51,7 @@ const entityId = computed(() => {
         <template #menu="{ entity }">
             <RoadmapDescriptorMenu :route="entity" />
         </template>
-    </CardDescriptor>
+    </EntityDescriptoror>
 </template>
 <i18n>
 es:
diff --git a/src/pages/Route/Vehicle/Card/VehicleDescriptor.vue b/src/pages/Route/Vehicle/Card/VehicleDescriptor.vue
index ad2ae61e4..5966b1abe 100644
--- a/src/pages/Route/Vehicle/Card/VehicleDescriptor.vue
+++ b/src/pages/Route/Vehicle/Card/VehicleDescriptor.vue
@@ -2,7 +2,7 @@
 import { computed } from 'vue';
 import { useRoute } from 'vue-router';
 import VnLv from 'src/components/ui/VnLv.vue';
-import CardDescriptor from 'components/ui/CardDescriptor.vue';
+import EntityDescriptor from 'components/ui/EntityDescriptor.vue';
 import axios from 'axios';
 import useNotify from 'src/composables/useNotify.js';
 
@@ -20,7 +20,7 @@ const route = useRoute();
 const entityId = computed(() => props.id || route.params.id);
 </script>
 <template>
-    <CardDescriptor
+    <EntityDescriptoror
         :url="`Vehicles/${entityId}`"
         data-key="Vehicle"
         title="numberPlate"
@@ -53,7 +53,7 @@ const entityId = computed(() => props.id || route.params.id);
             <VnLv :label="$t('globals.model')" :value="entity.model" />
             <VnLv :label="$t('globals.country')" :value="entity.countryCodeFk" />
         </template>
-    </CardDescriptor>
+    </EntityDescriptoror>
 </template>
 <i18n>
 es:
diff --git a/src/pages/Shelving/Card/ShelvingDescriptor.vue b/src/pages/Shelving/Card/ShelvingDescriptor.vue
index 5e618aa7f..5e76e7c2d 100644
--- a/src/pages/Shelving/Card/ShelvingDescriptor.vue
+++ b/src/pages/Shelving/Card/ShelvingDescriptor.vue
@@ -2,7 +2,7 @@
 import { computed } from 'vue';
 import { useRoute } from 'vue-router';
 import { useI18n } from 'vue-i18n';
-import CardDescriptor from 'components/ui/CardDescriptor.vue';
+import EntityDescriptor from 'components/ui/EntityDescriptor.vue';
 import VnLv from 'components/ui/VnLv.vue';
 import ShelvingDescriptorMenu from 'pages/Shelving/Card/ShelvingDescriptorMenu.vue';
 import VnUserLink from 'src/components/ui/VnUserLink.vue';
@@ -24,7 +24,7 @@ const entityId = computed(() => {
 });
 </script>
 <template>
-    <CardDescriptor
+    <EntityDescriptoror
         :url="`Shelvings/${entityId}`"
         :filter="filter"
         title="code"
@@ -45,5 +45,5 @@ const entityId = computed(() => {
         <template #menu="{ entity }">
             <ShelvingDescriptorMenu :shelving="entity" />
         </template>
-    </CardDescriptor>
+    </EntityDescriptoror>
 </template>
diff --git a/src/pages/Shelving/Parking/Card/ParkingDescriptor.vue b/src/pages/Shelving/Parking/Card/ParkingDescriptor.vue
index 46c9f8ea0..3daf9726d 100644
--- a/src/pages/Shelving/Parking/Card/ParkingDescriptor.vue
+++ b/src/pages/Shelving/Parking/Card/ParkingDescriptor.vue
@@ -1,7 +1,7 @@
 <script setup>
 import { computed } from 'vue';
 import { useRoute } from 'vue-router';
-import CardDescriptor from 'components/ui/CardDescriptor.vue';
+import EntityDescriptor from 'components/ui/EntityDescriptor.vue';
 import VnLv from 'components/ui/VnLv.vue';
 import filter from './ParkingFilter.js';
 const props = defineProps({
@@ -16,7 +16,7 @@ const route = useRoute();
 const entityId = computed(() => props.id || route.params.id);
 </script>
 <template>
-    <CardDescriptor
+    <EntityDescriptoror
         data-key="Parking"
         :url="`Parkings/${entityId}`"
         title="code"
@@ -28,5 +28,5 @@ const entityId = computed(() => props.id || route.params.id);
             <VnLv :label="$t('parking.pickingOrder')" :value="entity.pickingOrder" />
             <VnLv :label="$t('parking.sector')" :value="entity.sector?.description" />
         </template>
-    </CardDescriptor>
+    </EntityDescriptoror>
 </template>
diff --git a/src/pages/Supplier/Card/SupplierDescriptor.vue b/src/pages/Supplier/Card/SupplierDescriptor.vue
index 462bdf853..42489f201 100644
--- a/src/pages/Supplier/Card/SupplierDescriptor.vue
+++ b/src/pages/Supplier/Card/SupplierDescriptor.vue
@@ -3,7 +3,7 @@ import { ref, computed, onMounted } from 'vue';
 import { useRoute } from 'vue-router';
 import { useI18n } from 'vue-i18n';
 
-import CardDescriptor from 'components/ui/CardDescriptor.vue';
+import EntityDescriptor from 'components/ui/EntityDescriptor.vue';
 import VnLv from 'src/components/ui/VnLv.vue';
 
 import { toDateString } from 'src/filters';
@@ -61,7 +61,7 @@ const getEntryQueryParams = (supplier) => {
 </script>
 
 <template>
-    <CardDescriptor
+    <EntityDescriptoror
         :url="`Suppliers/${entityId}`"
         :filter="filter"
         data-key="Supplier"
@@ -136,7 +136,7 @@ const getEntryQueryParams = (supplier) => {
                 </QBtn>
             </QCardActions>
         </template>
-    </CardDescriptor>
+    </EntityDescriptoror>
 </template>
 
 <i18n>
diff --git a/src/pages/Ticket/Card/TicketDescriptor.vue b/src/pages/Ticket/Card/TicketDescriptor.vue
index 743f2188c..6f6fe69a3 100644
--- a/src/pages/Ticket/Card/TicketDescriptor.vue
+++ b/src/pages/Ticket/Card/TicketDescriptor.vue
@@ -4,7 +4,7 @@ import { useRoute } from 'vue-router';
 import { useI18n } from 'vue-i18n';
 import CustomerDescriptorProxy from 'pages/Customer/Card/CustomerDescriptorProxy.vue';
 import DepartmentDescriptorProxy from 'pages/Worker/Department/Card/DepartmentDescriptorProxy.vue';
-import CardDescriptor from 'components/ui/CardDescriptor.vue';
+import EntityDescriptor from 'components/ui/EntityDescriptor.vue';
 import TicketDescriptorMenu from './TicketDescriptorMenu.vue';
 import VnLv from 'src/components/ui/VnLv.vue';
 import { toDateTimeFormat } from 'src/filters/date';
@@ -57,7 +57,7 @@ function getInfo() {
 </script>
 
 <template>
-    <CardDescriptor
+    <EntityDescriptoror
         :url="`Tickets/${entityId}`"
         :filter="filter"
         data-key="Ticket"
@@ -155,7 +155,7 @@ function getInfo() {
                 </QBtn>
             </QCardActions>
         </template>
-    </CardDescriptor>
+    </EntityDescriptoror>
 </template>
 
 <i18n>
diff --git a/src/pages/Travel/Card/TravelDescriptor.vue b/src/pages/Travel/Card/TravelDescriptor.vue
index 922f89f33..f32034a6a 100644
--- a/src/pages/Travel/Card/TravelDescriptor.vue
+++ b/src/pages/Travel/Card/TravelDescriptor.vue
@@ -3,7 +3,7 @@ import { computed, ref } from 'vue';
 import { useRoute } from 'vue-router';
 import { useI18n } from 'vue-i18n';
 
-import CardDescriptor from 'components/ui/CardDescriptor.vue';
+import EntityDescriptor from 'components/ui/EntityDescriptor.vue';
 import VnLv from 'src/components/ui/VnLv.vue';
 import useCardDescription from 'src/composables/useCardDescription';
 import TravelDescriptorMenuItems from './TravelDescriptorMenuItems.vue';
@@ -31,7 +31,7 @@ const setData = (entity) => (data.value = useCardDescription(entity.ref, entity.
 </script>
 
 <template>
-    <CardDescriptor
+    <EntityDescriptoror
         :url="`Travels/${entityId}`"
         :title="data.title"
         :subtitle="data.subtitle"
@@ -79,7 +79,7 @@ const setData = (entity) => (data.value = useCardDescription(entity.ref, entity.
                 </QBtn>
             </QCardActions>
         </template>
-    </CardDescriptor>
+    </EntityDescriptoror>
 </template>
 
 <i18n>
diff --git a/src/pages/Worker/Card/WorkerDescriptor.vue b/src/pages/Worker/Card/WorkerDescriptor.vue
index 6e3a5e83f..ecaac12f8 100644
--- a/src/pages/Worker/Card/WorkerDescriptor.vue
+++ b/src/pages/Worker/Card/WorkerDescriptor.vue
@@ -2,7 +2,7 @@
 import { computed, ref } from 'vue';
 import { useRoute } from 'vue-router';
 import { useI18n } from 'vue-i18n';
-import CardDescriptor from 'src/components/ui/CardDescriptor.vue';
+import EntityDescriptor from 'src/components/ui/EntityDescriptor.vue';
 import VnLv from 'src/components/ui/VnLv.vue';
 import VnLinkPhone from 'src/components/ui/VnLinkPhone.vue';
 import VnChangePassword from 'src/components/common/VnChangePassword.vue';
@@ -52,7 +52,7 @@ const handlePhotoUpdated = (evt = false) => {
 };
 </script>
 <template>
-    <CardDescriptor
+    <EntityDescriptoror
         ref="cardDescriptorRef"
         :data-key="dataKey"
         :summary="$props.summary"
@@ -167,7 +167,7 @@ const handlePhotoUpdated = (evt = false) => {
                 </QBtn>
             </QCardActions>
         </template>
-    </CardDescriptor>
+    </EntityDescriptoror>
     <VnChangePassword
         ref="changePassRef"
         :submit-fn="
diff --git a/src/pages/Worker/Department/Card/DepartmentDescriptor.vue b/src/pages/Worker/Department/Card/DepartmentDescriptor.vue
index 4b7dfd9b8..17bf52a83 100644
--- a/src/pages/Worker/Department/Card/DepartmentDescriptor.vue
+++ b/src/pages/Worker/Department/Card/DepartmentDescriptor.vue
@@ -4,7 +4,7 @@ import { useRoute, useRouter } from 'vue-router';
 import { useI18n } from 'vue-i18n';
 import { useVnConfirm } from 'composables/useVnConfirm';
 import VnLv from 'src/components/ui/VnLv.vue';
-import CardDescriptor from 'src/components/ui/CardDescriptor.vue';
+import EntityDescriptor from 'src/components/ui/EntityDescriptor.vue';
 
 import axios from 'axios';
 import useNotify from 'src/composables/useNotify.js';
@@ -40,7 +40,7 @@ const removeDepartment = async () => {
 const { openConfirmationModal } = useVnConfirm();
 </script>
 <template>
-    <CardDescriptor
+    <EntityDescriptoror
         ref="DepartmentDescriptorRef"
         :url="`Departments/${entityId}`"
         :summary="$props.summary"
@@ -95,7 +95,7 @@ const { openConfirmationModal } = useVnConfirm();
                 </QBtn>
             </QCardActions>
         </template>
-    </CardDescriptor>
+    </EntityDescriptoror>
 </template>
 
 <i18n>
diff --git a/src/pages/Zone/Card/ZoneDescriptor.vue b/src/pages/Zone/Card/ZoneDescriptor.vue
index 27676212e..65cc1ae70 100644
--- a/src/pages/Zone/Card/ZoneDescriptor.vue
+++ b/src/pages/Zone/Card/ZoneDescriptor.vue
@@ -2,7 +2,7 @@
 import { computed } from 'vue';
 import { useRoute } from 'vue-router';
 
-import CardDescriptor from 'components/ui/CardDescriptor.vue';
+import EntityDescriptor from 'components/ui/EntityDescriptor.vue';
 import VnLv from 'src/components/ui/VnLv.vue';
 import { toTimeFormat } from 'src/filters/date';
 import { toCurrency } from 'filters/index';
@@ -25,7 +25,7 @@ const entityId = computed(() => {
 </script>
 
 <template>
-    <CardDescriptor :url="`Zones/${entityId}`" :filter="filter" data-key="Zone">
+    <EntityDescriptoror :url="`Zones/${entityId}`" :filter="filter" data-key="Zone">
         <template #menu="{ entity }">
             <ZoneDescriptorMenuItems :zone="entity" />
         </template>
@@ -36,5 +36,5 @@ const entityId = computed(() => {
             <VnLv :label="$t('list.price')" :value="toCurrency(entity.price)" />
             <VnLv :label="$t('zone.bonus')" :value="toCurrency(entity.bonus)" />
         </template>
-    </CardDescriptor>
+    </EntityDescriptoror>
 </template>

From f7046be50d1c2936b086181193b936a59fd7b4ea Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Fri, 14 Mar 2025 09:15:50 +0100
Subject: [PATCH 12/44] fix: refs #8463 fix name

---
 src/pages/Account/Alias/Card/AliasDescriptor.vue          | 4 ++--
 src/pages/Account/Card/AccountDescriptor.vue              | 4 ++--
 src/pages/Account/Role/Card/RoleDescriptor.vue            | 4 ++--
 src/pages/Claim/Card/ClaimDescriptor.vue                  | 4 ++--
 src/pages/Customer/Card/CustomerDescriptor.vue            | 4 ++--
 src/pages/Entry/Card/EntryDescriptor.vue                  | 4 ++--
 src/pages/InvoiceIn/Card/InvoiceInDescriptor.vue          | 4 ++--
 src/pages/InvoiceOut/Card/InvoiceOutDescriptor.vue        | 4 ++--
 src/pages/Item/Card/ItemDescriptor.vue                    | 4 ++--
 src/pages/Item/ItemType/Card/ItemTypeDescriptor.vue       | 4 ++--
 src/pages/Route/Agency/Card/AgencyDescriptor.vue          | 4 ++--
 src/pages/Route/Card/RouteDescriptor.vue                  | 4 ++--
 src/pages/Route/Roadmap/RoadmapDescriptor.vue             | 4 ++--
 src/pages/Route/Vehicle/Card/VehicleDescriptor.vue        | 4 ++--
 src/pages/Shelving/Card/ShelvingDescriptor.vue            | 4 ++--
 src/pages/Shelving/Parking/Card/ParkingDescriptor.vue     | 4 ++--
 src/pages/Supplier/Card/SupplierDescriptor.vue            | 4 ++--
 src/pages/Ticket/Card/TicketDescriptor.vue                | 4 ++--
 src/pages/Travel/Card/TravelDescriptor.vue                | 4 ++--
 src/pages/Worker/Card/WorkerDescriptor.vue                | 4 ++--
 src/pages/Worker/Department/Card/DepartmentDescriptor.vue | 4 ++--
 src/pages/Zone/Card/ZoneDescriptor.vue                    | 4 ++--
 22 files changed, 44 insertions(+), 44 deletions(-)

diff --git a/src/pages/Account/Alias/Card/AliasDescriptor.vue b/src/pages/Account/Alias/Card/AliasDescriptor.vue
index c9fdf9540..cb01473b7 100644
--- a/src/pages/Account/Alias/Card/AliasDescriptor.vue
+++ b/src/pages/Account/Alias/Card/AliasDescriptor.vue
@@ -48,7 +48,7 @@ const removeAlias = () => {
 </script>
 
 <template>
-    <EntityDescriptoror
+    <EntityDescriptor
         ref="descriptor"
         :url="`MailAliases/${entityId}`"
         data-key="Alias"
@@ -62,7 +62,7 @@ const removeAlias = () => {
         <template #body="{ entity }">
             <VnLv :label="t('role.description')" :value="entity.description" />
         </template>
-    </EntityDescriptoror>
+    </EntityDescriptor>
 </template>
 
 <i18n>
diff --git a/src/pages/Account/Card/AccountDescriptor.vue b/src/pages/Account/Card/AccountDescriptor.vue
index 5537c9693..eb0a9013c 100644
--- a/src/pages/Account/Card/AccountDescriptor.vue
+++ b/src/pages/Account/Card/AccountDescriptor.vue
@@ -20,7 +20,7 @@ onMounted(async () => {
 </script>
 
 <template>
-    <EntityDescriptoror
+    <EntityDescriptor
         ref="descriptor"
         :url="`VnUsers/preview`"
         :filter="{ ...filter, where: { id: entityId } }"
@@ -78,7 +78,7 @@ onMounted(async () => {
                 </QIcon>
             </QCardActions>
         </template>
-    </EntityDescriptoror>
+    </EntityDescriptor>
 </template>
 <style scoped>
 .q-item__label {
diff --git a/src/pages/Account/Role/Card/RoleDescriptor.vue b/src/pages/Account/Role/Card/RoleDescriptor.vue
index b364001b6..490f811cb 100644
--- a/src/pages/Account/Role/Card/RoleDescriptor.vue
+++ b/src/pages/Account/Role/Card/RoleDescriptor.vue
@@ -32,7 +32,7 @@ const removeRole = async () => {
 </script>
 
 <template>
-    <EntityDescriptoror
+    <EntityDescriptor
         url="VnRoles"
         :filter="{ where: { id: entityId } }"
         data-key="Role"
@@ -46,7 +46,7 @@ const removeRole = async () => {
         <template #body="{ entity }">
             <VnLv :label="t('role.description')" :value="entity.description" />
         </template>
-    </EntityDescriptoror>
+    </EntityDescriptor>
 </template>
 <style scoped>
 .q-item__label {
diff --git a/src/pages/Claim/Card/ClaimDescriptor.vue b/src/pages/Claim/Card/ClaimDescriptor.vue
index e3eeade83..76ede81ed 100644
--- a/src/pages/Claim/Card/ClaimDescriptor.vue
+++ b/src/pages/Claim/Card/ClaimDescriptor.vue
@@ -44,7 +44,7 @@ onMounted(async () => {
 </script>
 
 <template>
-    <EntityDescriptoror
+    <EntityDescriptor
         :url="`Claims/${entityId}`"
         :filter="filter"
         title="client.name"
@@ -147,7 +147,7 @@ onMounted(async () => {
                 </QBtn>
             </QCardActions>
         </template>
-    </EntityDescriptoror>
+    </EntityDescriptor>
 </template>
 <style scoped>
 .q-item__label {
diff --git a/src/pages/Customer/Card/CustomerDescriptor.vue b/src/pages/Customer/Card/CustomerDescriptor.vue
index 7696f086c..cd18cf2c9 100644
--- a/src/pages/Customer/Card/CustomerDescriptor.vue
+++ b/src/pages/Customer/Card/CustomerDescriptor.vue
@@ -54,7 +54,7 @@ const debtWarning = computed(() => {
 </script>
 
 <template>
-    <EntityDescriptoror
+    <EntityDescriptor
         :url="`Clients/${entityId}/getCard`"
         :summary="$props.summary"
         data-key="Customer"
@@ -232,7 +232,7 @@ const debtWarning = computed(() => {
                 </QBtn>
             </QCardActions>
         </template>
-    </EntityDescriptoror>
+    </EntityDescriptor>
 </template>
 
 <i18n>
diff --git a/src/pages/Entry/Card/EntryDescriptor.vue b/src/pages/Entry/Card/EntryDescriptor.vue
index 962f777ce..560114283 100644
--- a/src/pages/Entry/Card/EntryDescriptor.vue
+++ b/src/pages/Entry/Card/EntryDescriptor.vue
@@ -145,7 +145,7 @@ async function deleteEntry() {
 </script>
 
 <template>
-    <EntityDescriptoror
+    <EntityDescriptor
         :url="`Entries/${entityId}`"
         :filter="entryFilter"
         title="supplier.nickname"
@@ -264,7 +264,7 @@ async function deleteEntry() {
                 </QBtn>
             </QCardActions>
         </template>
-    </EntityDescriptoror>
+    </EntityDescriptor>
 </template>
 <i18n>
 es:
diff --git a/src/pages/InvoiceIn/Card/InvoiceInDescriptor.vue b/src/pages/InvoiceIn/Card/InvoiceInDescriptor.vue
index 22ddb25d4..70282c906 100644
--- a/src/pages/InvoiceIn/Card/InvoiceInDescriptor.vue
+++ b/src/pages/InvoiceIn/Card/InvoiceInDescriptor.vue
@@ -88,7 +88,7 @@ async function setInvoiceCorrection(id) {
 }
 </script>
 <template>
-    <EntityDescriptoror
+    <EntityDescriptor
         ref="cardDescriptorRef"
         data-key="InvoiceIn"
         :url="`InvoiceIns/${entityId}`"
@@ -163,7 +163,7 @@ async function setInvoiceCorrection(id) {
                 </QBtn>
             </QCardActions>
         </template>
-    </EntityDescriptoror>
+    </EntityDescriptor>
 </template>
 <style lang="scss" scoped>
 .q-dialog {
diff --git a/src/pages/InvoiceOut/Card/InvoiceOutDescriptor.vue b/src/pages/InvoiceOut/Card/InvoiceOutDescriptor.vue
index 6b4399ceb..b93b8c8b7 100644
--- a/src/pages/InvoiceOut/Card/InvoiceOutDescriptor.vue
+++ b/src/pages/InvoiceOut/Card/InvoiceOutDescriptor.vue
@@ -34,7 +34,7 @@ function ticketFilter(invoice) {
 </script>
 
 <template>
-    <EntityDescriptoror
+    <EntityDescriptor
         ref="descriptor"
         :url="`InvoiceOuts/${entityId}`"
         :filter="filter"
@@ -93,5 +93,5 @@ function ticketFilter(invoice) {
                 </QBtn>
             </QCardActions>
         </template>
-    </EntityDescriptoror>
+    </EntityDescriptor>
 </template>
diff --git a/src/pages/Item/Card/ItemDescriptor.vue b/src/pages/Item/Card/ItemDescriptor.vue
index d624d8db9..09f63a3b1 100644
--- a/src/pages/Item/Card/ItemDescriptor.vue
+++ b/src/pages/Item/Card/ItemDescriptor.vue
@@ -90,7 +90,7 @@ const updateStock = async () => {
 </script>
 
 <template>
-    <EntityDescriptoror
+    <EntityDescriptor
         data-key="Item"
         :summary="$props.summary"
         :url="`Items/${entityId}/getCard`"
@@ -162,7 +162,7 @@ const updateStock = async () => {
                 </QBtn>
             </QCardActions>
         </template>
-    </EntityDescriptoror>
+    </EntityDescriptor>
 </template>
 
 <i18n>
diff --git a/src/pages/Item/ItemType/Card/ItemTypeDescriptor.vue b/src/pages/Item/ItemType/Card/ItemTypeDescriptor.vue
index 7bc1925a1..77ba0c8e9 100644
--- a/src/pages/Item/ItemType/Card/ItemTypeDescriptor.vue
+++ b/src/pages/Item/ItemType/Card/ItemTypeDescriptor.vue
@@ -25,7 +25,7 @@ const entityId = computed(() => {
 });
 </script>
 <template>
-    <EntityDescriptoror
+    <EntityDescriptor
         :url="`ItemTypes/${entityId}`"
         :filter="filter"
         title="code"
@@ -45,5 +45,5 @@ const entityId = computed(() => {
                 :value="entity.category?.name"
             />
         </template>
-    </EntityDescriptoror>
+    </EntityDescriptor>
 </template>
diff --git a/src/pages/Route/Agency/Card/AgencyDescriptor.vue b/src/pages/Route/Agency/Card/AgencyDescriptor.vue
index f2cb80b98..07b46e25b 100644
--- a/src/pages/Route/Agency/Card/AgencyDescriptor.vue
+++ b/src/pages/Route/Agency/Card/AgencyDescriptor.vue
@@ -21,7 +21,7 @@ const { store } = useArrayData('Parking');
 const card = computed(() => store.data);
 </script>
 <template>
-    <EntityDescriptoror
+    <EntityDescriptor
         data-key="Agency"
         :url="`Agencies/${entityId}`"
         :title="card?.name"
@@ -30,5 +30,5 @@ const card = computed(() => store.data);
         <template #body="{ entity: agency }">
             <VnLv :label="t('globals.name')" :value="agency.name" />
         </template>
-    </EntityDescriptoror>
+    </EntityDescriptor>
 </template>
diff --git a/src/pages/Route/Card/RouteDescriptor.vue b/src/pages/Route/Card/RouteDescriptor.vue
index 4659e8a81..e40dfaab8 100644
--- a/src/pages/Route/Card/RouteDescriptor.vue
+++ b/src/pages/Route/Card/RouteDescriptor.vue
@@ -47,7 +47,7 @@ onMounted(async () => {
 });
 </script>
 <template>
-    <EntityDescriptoror
+    <EntityDescriptor
         :url="`Routes/${entityId}`"
         :filter="filter"
         :title="null"
@@ -69,7 +69,7 @@ onMounted(async () => {
         <template #menu="{ entity }">
             <RouteDescriptorMenu :route="entity" />
         </template>
-    </EntityDescriptoror>
+    </EntityDescriptor>
 </template>
 <i18n>
 es:
diff --git a/src/pages/Route/Roadmap/RoadmapDescriptor.vue b/src/pages/Route/Roadmap/RoadmapDescriptor.vue
index 92c471fc4..93acf1f74 100644
--- a/src/pages/Route/Roadmap/RoadmapDescriptor.vue
+++ b/src/pages/Route/Roadmap/RoadmapDescriptor.vue
@@ -30,7 +30,7 @@ const entityId = computed(() => {
 </script>
 
 <template>
-    <EntityDescriptoror
+    <EntityDescriptor
         :url="`Roadmaps/${entityId}`"
         :filter="filter"
         data-key="Roadmap"
@@ -51,7 +51,7 @@ const entityId = computed(() => {
         <template #menu="{ entity }">
             <RoadmapDescriptorMenu :route="entity" />
         </template>
-    </EntityDescriptoror>
+    </EntityDescriptor>
 </template>
 <i18n>
 es:
diff --git a/src/pages/Route/Vehicle/Card/VehicleDescriptor.vue b/src/pages/Route/Vehicle/Card/VehicleDescriptor.vue
index 5966b1abe..33b0094e3 100644
--- a/src/pages/Route/Vehicle/Card/VehicleDescriptor.vue
+++ b/src/pages/Route/Vehicle/Card/VehicleDescriptor.vue
@@ -20,7 +20,7 @@ const route = useRoute();
 const entityId = computed(() => props.id || route.params.id);
 </script>
 <template>
-    <EntityDescriptoror
+    <EntityDescriptor
         :url="`Vehicles/${entityId}`"
         data-key="Vehicle"
         title="numberPlate"
@@ -53,7 +53,7 @@ const entityId = computed(() => props.id || route.params.id);
             <VnLv :label="$t('globals.model')" :value="entity.model" />
             <VnLv :label="$t('globals.country')" :value="entity.countryCodeFk" />
         </template>
-    </EntityDescriptoror>
+    </EntityDescriptor>
 </template>
 <i18n>
 es:
diff --git a/src/pages/Shelving/Card/ShelvingDescriptor.vue b/src/pages/Shelving/Card/ShelvingDescriptor.vue
index 5e76e7c2d..2405467da 100644
--- a/src/pages/Shelving/Card/ShelvingDescriptor.vue
+++ b/src/pages/Shelving/Card/ShelvingDescriptor.vue
@@ -24,7 +24,7 @@ const entityId = computed(() => {
 });
 </script>
 <template>
-    <EntityDescriptoror
+    <EntityDescriptor
         :url="`Shelvings/${entityId}`"
         :filter="filter"
         title="code"
@@ -45,5 +45,5 @@ const entityId = computed(() => {
         <template #menu="{ entity }">
             <ShelvingDescriptorMenu :shelving="entity" />
         </template>
-    </EntityDescriptoror>
+    </EntityDescriptor>
 </template>
diff --git a/src/pages/Shelving/Parking/Card/ParkingDescriptor.vue b/src/pages/Shelving/Parking/Card/ParkingDescriptor.vue
index 3daf9726d..bbc2c26fb 100644
--- a/src/pages/Shelving/Parking/Card/ParkingDescriptor.vue
+++ b/src/pages/Shelving/Parking/Card/ParkingDescriptor.vue
@@ -16,7 +16,7 @@ const route = useRoute();
 const entityId = computed(() => props.id || route.params.id);
 </script>
 <template>
-    <EntityDescriptoror
+    <EntityDescriptor
         data-key="Parking"
         :url="`Parkings/${entityId}`"
         title="code"
@@ -28,5 +28,5 @@ const entityId = computed(() => props.id || route.params.id);
             <VnLv :label="$t('parking.pickingOrder')" :value="entity.pickingOrder" />
             <VnLv :label="$t('parking.sector')" :value="entity.sector?.description" />
         </template>
-    </EntityDescriptoror>
+    </EntityDescriptor>
 </template>
diff --git a/src/pages/Supplier/Card/SupplierDescriptor.vue b/src/pages/Supplier/Card/SupplierDescriptor.vue
index 42489f201..2863784ab 100644
--- a/src/pages/Supplier/Card/SupplierDescriptor.vue
+++ b/src/pages/Supplier/Card/SupplierDescriptor.vue
@@ -61,7 +61,7 @@ const getEntryQueryParams = (supplier) => {
 </script>
 
 <template>
-    <EntityDescriptoror
+    <EntityDescriptor
         :url="`Suppliers/${entityId}`"
         :filter="filter"
         data-key="Supplier"
@@ -136,7 +136,7 @@ const getEntryQueryParams = (supplier) => {
                 </QBtn>
             </QCardActions>
         </template>
-    </EntityDescriptoror>
+    </EntityDescriptor>
 </template>
 
 <i18n>
diff --git a/src/pages/Ticket/Card/TicketDescriptor.vue b/src/pages/Ticket/Card/TicketDescriptor.vue
index 6f6fe69a3..96920231c 100644
--- a/src/pages/Ticket/Card/TicketDescriptor.vue
+++ b/src/pages/Ticket/Card/TicketDescriptor.vue
@@ -57,7 +57,7 @@ function getInfo() {
 </script>
 
 <template>
-    <EntityDescriptoror
+    <EntityDescriptor
         :url="`Tickets/${entityId}`"
         :filter="filter"
         data-key="Ticket"
@@ -155,7 +155,7 @@ function getInfo() {
                 </QBtn>
             </QCardActions>
         </template>
-    </EntityDescriptoror>
+    </EntityDescriptor>
 </template>
 
 <i18n>
diff --git a/src/pages/Travel/Card/TravelDescriptor.vue b/src/pages/Travel/Card/TravelDescriptor.vue
index f32034a6a..d4903f794 100644
--- a/src/pages/Travel/Card/TravelDescriptor.vue
+++ b/src/pages/Travel/Card/TravelDescriptor.vue
@@ -31,7 +31,7 @@ const setData = (entity) => (data.value = useCardDescription(entity.ref, entity.
 </script>
 
 <template>
-    <EntityDescriptoror
+    <EntityDescriptor
         :url="`Travels/${entityId}`"
         :title="data.title"
         :subtitle="data.subtitle"
@@ -79,7 +79,7 @@ const setData = (entity) => (data.value = useCardDescription(entity.ref, entity.
                 </QBtn>
             </QCardActions>
         </template>
-    </EntityDescriptoror>
+    </EntityDescriptor>
 </template>
 
 <i18n>
diff --git a/src/pages/Worker/Card/WorkerDescriptor.vue b/src/pages/Worker/Card/WorkerDescriptor.vue
index ecaac12f8..746799a50 100644
--- a/src/pages/Worker/Card/WorkerDescriptor.vue
+++ b/src/pages/Worker/Card/WorkerDescriptor.vue
@@ -52,7 +52,7 @@ const handlePhotoUpdated = (evt = false) => {
 };
 </script>
 <template>
-    <EntityDescriptoror
+    <EntityDescriptor
         ref="cardDescriptorRef"
         :data-key="dataKey"
         :summary="$props.summary"
@@ -167,7 +167,7 @@ const handlePhotoUpdated = (evt = false) => {
                 </QBtn>
             </QCardActions>
         </template>
-    </EntityDescriptoror>
+    </EntityDescriptor>
     <VnChangePassword
         ref="changePassRef"
         :submit-fn="
diff --git a/src/pages/Worker/Department/Card/DepartmentDescriptor.vue b/src/pages/Worker/Department/Card/DepartmentDescriptor.vue
index 17bf52a83..820658593 100644
--- a/src/pages/Worker/Department/Card/DepartmentDescriptor.vue
+++ b/src/pages/Worker/Department/Card/DepartmentDescriptor.vue
@@ -40,7 +40,7 @@ const removeDepartment = async () => {
 const { openConfirmationModal } = useVnConfirm();
 </script>
 <template>
-    <EntityDescriptoror
+    <EntityDescriptor
         ref="DepartmentDescriptorRef"
         :url="`Departments/${entityId}`"
         :summary="$props.summary"
@@ -95,7 +95,7 @@ const { openConfirmationModal } = useVnConfirm();
                 </QBtn>
             </QCardActions>
         </template>
-    </EntityDescriptoror>
+    </EntityDescriptor>
 </template>
 
 <i18n>
diff --git a/src/pages/Zone/Card/ZoneDescriptor.vue b/src/pages/Zone/Card/ZoneDescriptor.vue
index 65cc1ae70..f2bcc1247 100644
--- a/src/pages/Zone/Card/ZoneDescriptor.vue
+++ b/src/pages/Zone/Card/ZoneDescriptor.vue
@@ -25,7 +25,7 @@ const entityId = computed(() => {
 </script>
 
 <template>
-    <EntityDescriptoror :url="`Zones/${entityId}`" :filter="filter" data-key="Zone">
+    <EntityDescriptor :url="`Zones/${entityId}`" :filter="filter" data-key="Zone">
         <template #menu="{ entity }">
             <ZoneDescriptorMenuItems :zone="entity" />
         </template>
@@ -36,5 +36,5 @@ const entityId = computed(() => {
             <VnLv :label="$t('list.price')" :value="toCurrency(entity.price)" />
             <VnLv :label="$t('zone.bonus')" :value="toCurrency(entity.bonus)" />
         </template>
-    </EntityDescriptoror>
+    </EntityDescriptor>
 </template>

From 9befd7317f6d193f2517572327722ef820b80943 Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Fri, 14 Mar 2025 09:36:59 +0100
Subject: [PATCH 13/44] fix: refs #8463 update entity check and replace
 OrderDescriptorProxy with CustomerDescriptorProxy

---
 src/components/ui/VnDescriptor.vue    | 2 +-
 src/pages/Order/Card/OrderSummary.vue | 3 +--
 2 files changed, 2 insertions(+), 3 deletions(-)

diff --git a/src/components/ui/VnDescriptor.vue b/src/components/ui/VnDescriptor.vue
index 7ca9a3a1e..515e09f3a 100644
--- a/src/components/ui/VnDescriptor.vue
+++ b/src/components/ui/VnDescriptor.vue
@@ -99,7 +99,7 @@ const toModule = computed(() => {
 
 <template>
     <div class="descriptor">
-        <template v-if="entity">
+        <template v-if="entity && entity?.id">
             <div class="header bg-primary q-pa-sm justify-between">
                 <slot name="header-extra-action">
                     <QBtn
diff --git a/src/pages/Order/Card/OrderSummary.vue b/src/pages/Order/Card/OrderSummary.vue
index e4121a0c3..a4bdb2881 100644
--- a/src/pages/Order/Card/OrderSummary.vue
+++ b/src/pages/Order/Card/OrderSummary.vue
@@ -13,7 +13,6 @@ import FetchedTags from 'components/ui/FetchedTags.vue';
 import VnTitle from 'src/components/common/VnTitle.vue';
 import ItemDescriptorProxy from 'src/pages/Item/Card/ItemDescriptorProxy.vue';
 import OrderDescriptorMenu from 'pages/Order/Card/OrderDescriptorMenu.vue';
-import OrderDescriptorProxy from './OrderDescriptorProxy.vue';
 
 const { t } = useI18n();
 const route = useRoute();
@@ -107,7 +106,7 @@ async function handleConfirm() {
                         <template #value>
                             <span class="link">
                                 {{ dashIfEmpty(entity?.address?.nickname) }}
-                                <OrderDescriptorProxy :id="1" />
+                                <CustomerDescriptorProxy :id="entity?.clientFk" />
                             </span>
                         </template>
                     </VnLv>

From e92fbb1e8552745183c6ac17a6b878b68bdbb46c Mon Sep 17 00:00:00 2001
From: Javier Segarra <jsegarra@verdnatura.es>
Date: Fri, 14 Mar 2025 11:43:01 +0100
Subject: [PATCH 14/44] style: refs #8131 replace rounded by filled

---
 src/components/ItemsFilterPanel.vue           |  6 +--
 src/components/common/VnLog.vue               |  9 +++-
 src/pages/Account/AccountFilter.vue           |  6 +--
 src/pages/Account/Acls/AclFilter.vue          | 10 ++---
 src/pages/Account/Role/AccountRolesFilter.vue |  4 +-
 src/pages/Claim/ClaimFilter.vue               | 18 ++++----
 src/pages/Customer/CustomerFilter.vue         | 24 +++++-----
 .../Defaulter/CustomerDefaulterFilter.vue     | 18 ++++----
 .../Payments/CustomerPaymentsFilter.vue       | 18 +++-----
 src/pages/Entry/EntryFilter.vue               | 24 +++++-----
 src/pages/Entry/EntryLatestBuysFilter.vue     | 14 +++---
 src/pages/Entry/EntryStockBoughtFilter.vue    |  2 +-
 src/pages/InvoiceIn/InvoiceInFilter.vue       | 31 +++++--------
 .../Serial/InvoiceInSerialFilter.vue          |  4 +-
 src/pages/InvoiceOut/InvoiceOutFilter.vue     | 20 ++++-----
 src/pages/InvoiceOut/InvoiceOutGlobalForm.vue | 22 ++++------
 .../InvoiceOutNegativeBasesFilter.vue         | 18 +++-----
 src/pages/Item/ItemFixedPriceFilter.vue       | 10 ++---
 src/pages/Item/ItemListFilter.vue             | 24 +++++-----
 src/pages/Item/ItemRequestFilter.vue          | 32 +++++---------
 .../Monitor/Ticket/MonitorTicketFilter.vue    | 34 ++++++--------
 .../Order/Card/CatalogFilterValueDialog.vue   |  6 +--
 src/pages/Order/Card/OrderCatalogFilter.vue   |  8 ++--
 src/pages/Order/Card/OrderFilter.vue          | 14 +++---
 .../Route/Card/RouteAutonomousFilter.vue      | 32 +++++---------
 src/pages/Route/Card/RouteFilter.vue          | 18 ++++----
 src/pages/Route/Roadmap/RoadmapFilter.vue     | 16 +++----
 src/pages/Shelving/Card/ShelvingFilter.vue    |  4 +-
 src/pages/Shelving/Parking/ParkingFilter.vue  |  8 +---
 .../Supplier/Card/SupplierBalanceFilter.vue   |  6 +--
 .../Card/SupplierConsumptionFilter.vue        | 22 +++-------
 .../Ticket/Negative/TicketLackFilter.vue      | 12 ++---
 src/pages/Ticket/TicketAdvanceFilter.vue      | 14 +++---
 src/pages/Ticket/TicketFilter.vue             | 44 ++++++-------------
 src/pages/Ticket/TicketFutureFilter.vue       | 18 ++++----
 src/pages/Travel/ExtraCommunityFilter.vue     | 24 +++++-----
 src/pages/Travel/TravelFilter.vue             | 27 +++++-------
 .../Worker/Card/WorkerCalendarFilter.vue      |  6 +--
 src/pages/Worker/WorkerFilter.vue             | 30 +++----------
 src/pages/Zone/ZoneDeliveryPanel.vue          |  4 +-
 40 files changed, 276 insertions(+), 385 deletions(-)

diff --git a/src/components/ItemsFilterPanel.vue b/src/components/ItemsFilterPanel.vue
index f73753a6b..c58c7ac3c 100644
--- a/src/components/ItemsFilterPanel.vue
+++ b/src/components/ItemsFilterPanel.vue
@@ -199,7 +199,7 @@ const setCategoryList = (data) => {
                         :options="itemTypesOptions"
                         dense
                         outlined
-                        rounded
+                        filled
                         use-input
                         :disable="!selectedCategoryFk"
                         @update:model-value="
@@ -236,7 +236,7 @@ const setCategoryList = (data) => {
                         :options="tagOptions"
                         dense
                         outlined
-                        rounded
+                        filled
                         :emit-value="false"
                         use-input
                         :is-clearable="false"
@@ -253,7 +253,7 @@ const setCategoryList = (data) => {
                         option-label="value"
                         dense
                         outlined
-                        rounded
+                        filled
                         emit-value
                         use-input
                         :disable="!value"
diff --git a/src/components/common/VnLog.vue b/src/components/common/VnLog.vue
index 8f106a9f1..bbf9ce098 100644
--- a/src/components/common/VnLog.vue
+++ b/src/components/common/VnLog.vue
@@ -700,6 +700,7 @@ watch(
                         v-model="searchInput"
                         class="full-width"
                         clearable
+                        filled
                         clear-icon="close"
                         @keyup.enter="() => selectFilter('search')"
                         @focusout="() => selectFilter('search')"
@@ -719,6 +720,7 @@ watch(
                         v-model="selectedFilters.changedModel"
                         option-label="locale"
                         option-value="value"
+                        filled
                         :options="actions"
                         @update:model-value="selectFilter('action')"
                         hide-selected
@@ -744,8 +746,7 @@ watch(
                             class="full-width"
                             :label="t('globals.user')"
                             v-model="userSelect"
-                            option-label="name"
-                            option-value="id"
+                            filled
                             :url="`${model}Logs/${route.params.id}/editors`"
                             :fields="['id', 'nickname', 'name', 'image']"
                             sort-by="nickname"
@@ -774,6 +775,7 @@ watch(
                         :label="t('globals.changes')"
                         v-model="changeInput"
                         class="full-width"
+                        filled
                         clearable
                         clear-icon="close"
                         @keyup.enter="selectFilter('change')"
@@ -810,6 +812,7 @@ watch(
                         @clear="selectFilter('date', 'to')"
                         v-model="dateFrom"
                         clearable
+                        filled
                         clear-icon="close"
                     />
                 </QItem>
@@ -822,6 +825,7 @@ watch(
                         @clear="selectFilter('date', 'from')"
                         v-model="dateTo"
                         clearable
+                        filled
                         clear-icon="close"
                     />
                 </QItem>
@@ -835,6 +839,7 @@ watch(
             dense
             flat
             minimal
+            filled
             @update:model-value="
                 (value) => {
                     dateFromDialog = false;
diff --git a/src/pages/Account/AccountFilter.vue b/src/pages/Account/AccountFilter.vue
index 50c3ee1ac..7796e3c1a 100644
--- a/src/pages/Account/AccountFilter.vue
+++ b/src/pages/Account/AccountFilter.vue
@@ -47,7 +47,7 @@ const rolesOptions = ref([]);
                         :label="t('globals.name')"
                         v-model="params.name"
                         lazy-rules
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -57,7 +57,7 @@ const rolesOptions = ref([]);
                         :label="t('account.card.alias')"
                         v-model="params.nickname"
                         lazy-rules
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -76,7 +76,7 @@ const rolesOptions = ref([]);
                         hide-selected
                         dense
                         outlined
-                        rounded
+                        filled
                         :input-debounce="0"
                     />
                 </QItemSection>
diff --git a/src/pages/Account/Acls/AclFilter.vue b/src/pages/Account/Acls/AclFilter.vue
index 8035f92b8..037be525a 100644
--- a/src/pages/Account/Acls/AclFilter.vue
+++ b/src/pages/Account/Acls/AclFilter.vue
@@ -57,7 +57,7 @@ onBeforeMount(() => {
                         use-input
                         dense
                         outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -73,7 +73,7 @@ onBeforeMount(() => {
                         use-input
                         dense
                         outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -83,7 +83,7 @@ onBeforeMount(() => {
                         :label="t('acls.aclFilter.property')"
                         v-model="params.property"
                         lazy-rules
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -99,7 +99,7 @@ onBeforeMount(() => {
                         use-input
                         dense
                         outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -115,7 +115,7 @@ onBeforeMount(() => {
                         use-input
                         dense
                         outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
diff --git a/src/pages/Account/Role/AccountRolesFilter.vue b/src/pages/Account/Role/AccountRolesFilter.vue
index cbe7a70c8..1358236c6 100644
--- a/src/pages/Account/Role/AccountRolesFilter.vue
+++ b/src/pages/Account/Role/AccountRolesFilter.vue
@@ -27,7 +27,7 @@ const props = defineProps({
                         :label="t('globals.name')"
                         v-model="params.name"
                         lazy-rules
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -37,7 +37,7 @@ const props = defineProps({
                         :label="t('role.description')"
                         v-model="params.description"
                         lazy-rules
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
diff --git a/src/pages/Claim/ClaimFilter.vue b/src/pages/Claim/ClaimFilter.vue
index 37146865c..fb3e1b372 100644
--- a/src/pages/Claim/ClaimFilter.vue
+++ b/src/pages/Claim/ClaimFilter.vue
@@ -33,7 +33,7 @@ const props = defineProps({
                     :label="t('claim.customerId')"
                     v-model="params.clientFk"
                     lazy-rules
-                    is-outlined
+                    filled
                 >
                     <template #prepend> <QIcon name="badge" size="xs" /></template>
                 </VnInput>
@@ -41,12 +41,12 @@ const props = defineProps({
                     :label="t('Client Name')"
                     v-model="params.clientName"
                     lazy-rules
-                    is-outlined
+                    filled
                 />
                 <VnSelect
                     outlined
                     dense
-                    rounded
+                    filled
                     :label="t('globals.params.departmentFk')"
                     v-model="params.departmentFk"
                     option-value="id"
@@ -62,7 +62,7 @@ const props = defineProps({
                     option-filter="firstName"
                     dense
                     outlined
-                    rounded
+                    filled
                 />
                 <VnSelect
                     :label="t('claim.state')"
@@ -71,13 +71,13 @@ const props = defineProps({
                     option-label="description"
                     dense
                     outlined
-                    rounded
+                    filled
                 />
                 <VnInputDate
                     v-model="params.created"
                     :label="t('claim.created')"
                     outlined
-                    rounded
+                    filled
                     dense
                 />
                 <VnSelect
@@ -87,7 +87,7 @@ const props = defineProps({
                     :use-like="false"
                     sort-by="id DESC"
                     outlined
-                    rounded
+                    filled
                     dense
                 />
                 <VnSelect
@@ -99,14 +99,14 @@ const props = defineProps({
                     option-filter="firstName"
                     dense
                     outlined
-                    rounded
+                    filled
                 />
                 <VnSelect
                     :label="t('claim.zone')"
                     v-model="params.zoneFk"
                     url="Zones"
                     outlined
-                    rounded
+                    filled
                     dense
                 />
                 <QCheckbox
diff --git a/src/pages/Customer/CustomerFilter.vue b/src/pages/Customer/CustomerFilter.vue
index 2ace6dd02..e130b8271 100644
--- a/src/pages/Customer/CustomerFilter.vue
+++ b/src/pages/Customer/CustomerFilter.vue
@@ -41,7 +41,7 @@ const exprBuilder = (param, value) => {
         <template #body="{ params, searchFn }">
             <QItem class="q-my-sm">
                 <QItemSection>
-                    <VnInput :label="t('FI')" v-model="params.fi" is-outlined>
+                    <VnInput :label="t('FI')" v-model="params.fi" filled>
                         <template #prepend>
                             <QIcon name="badge" size="xs" />
                         </template>
@@ -50,7 +50,7 @@ const exprBuilder = (param, value) => {
             </QItem>
             <QItem class="q-mb-sm">
                 <QItemSection>
-                    <VnInput :label="t('Name')" v-model="params.name" is-outlined />
+                    <VnInput :label="t('Name')" v-model="params.name" filled />
                 </QItemSection>
             </QItem>
             <QItem class="q-mb-sm">
@@ -58,7 +58,7 @@ const exprBuilder = (param, value) => {
                     <VnInput
                         :label="t('customer.summary.socialName')"
                         v-model="params.socialName"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -67,7 +67,7 @@ const exprBuilder = (param, value) => {
                     <VnSelect
                         outlined
                         dense
-                        rounded
+                        filled
                         :label="t('globals.params.departmentFk')"
                         v-model="params.departmentFk"
                         option-value="id"
@@ -90,7 +90,7 @@ const exprBuilder = (param, value) => {
                         hide-selected
                         dense
                         outlined
-                        rounded
+                        filled
                         auto-load
                         :input-debounce="0"
                     />
@@ -98,12 +98,12 @@ const exprBuilder = (param, value) => {
             </QItem>
             <QItem class="q-mb-sm">
                 <QItemSection>
-                    <VnInput :label="t('City')" v-model="params.city" is-outlined />
+                    <VnInput :label="t('City')" v-model="params.city" filled />
                 </QItemSection>
             </QItem>
             <QItem class="q-mb-sm">
                 <QItemSection>
-                    <VnInput :label="t('Phone')" v-model="params.phone" is-outlined>
+                    <VnInput :label="t('Phone')" v-model="params.phone" filled>
                         <template #prepend>
                             <QIcon name="phone" size="xs" />
                         </template>
@@ -112,7 +112,7 @@ const exprBuilder = (param, value) => {
             </QItem>
             <QItem class="q-mb-sm">
                 <QItemSection>
-                    <VnInput :label="t('Email')" v-model="params.email" is-outlined>
+                    <VnInput :label="t('Email')" v-model="params.email" filled>
                         <template #prepend>
                             <QIcon name="email" size="sm" />
                         </template>
@@ -133,18 +133,14 @@ const exprBuilder = (param, value) => {
                         hide-selected
                         dense
                         outlined
-                        rounded
+                        filled
                         auto-load
                         sortBy="name ASC"
                 /></QItemSection>
             </QItem>
             <QItem class="q-mb-sm">
                 <QItemSection>
-                    <VnInput
-                        :label="t('Postcode')"
-                        v-model="params.postcode"
-                        is-outlined
-                    />
+                    <VnInput :label="t('Postcode')" v-model="params.postcode" filled />
                 </QItemSection>
             </QItem>
         </template>
diff --git a/src/pages/Customer/Defaulter/CustomerDefaulterFilter.vue b/src/pages/Customer/Defaulter/CustomerDefaulterFilter.vue
index 0eab7b7c5..482668dff 100644
--- a/src/pages/Customer/Defaulter/CustomerDefaulterFilter.vue
+++ b/src/pages/Customer/Defaulter/CustomerDefaulterFilter.vue
@@ -46,7 +46,7 @@ const departments = ref();
                     option-label="name"
                     option-value="id"
                     outlined
-                    rounded
+                    filled
                     emit-value
                     hide-selected
                     map-options
@@ -68,7 +68,7 @@ const departments = ref();
                         option-label="name"
                         option-value="id"
                         outlined
-                        rounded
+                        filled
                         use-input
                         v-model="params.departmentFk"
                         @update:model-value="searchFn()"
@@ -92,7 +92,7 @@ const departments = ref();
                         option-label="name"
                         option-value="id"
                         outlined
-                        rounded
+                        filled
                         use-input
                         v-model="params.countryFk"
                         @update:model-value="searchFn()"
@@ -108,7 +108,7 @@ const departments = ref();
                     <VnInput
                         :label="t('P. Method')"
                         clearable
-                        is-outlined
+                        filled
                         v-model="params.paymentMethod"
                     />
                 </QItemSection>
@@ -119,7 +119,7 @@ const departments = ref();
                     <VnInput
                         :label="t('Balance D.')"
                         clearable
-                        is-outlined
+                        filled
                         v-model="params.balance"
                     />
                 </QItemSection>
@@ -138,7 +138,7 @@ const departments = ref();
                         option-label="name"
                         option-value="id"
                         outlined
-                        rounded
+                        filled
                         use-input
                         v-model="params.workerFk"
                         @update:model-value="searchFn()"
@@ -154,7 +154,7 @@ const departments = ref();
                     <VnInputDate
                         :label="t('L. O. Date')"
                         clearable
-                        is-outlined
+                        filled
                         v-model="params.date"
                     />
                 </QItemSection>
@@ -165,7 +165,7 @@ const departments = ref();
                     <VnInput
                         :label="t('Credit I.')"
                         clearable
-                        is-outlined
+                        filled
                         v-model="params.credit"
                     />
                 </QItemSection>
@@ -175,7 +175,7 @@ const departments = ref();
                 <QItemSection>
                     <VnInputDate
                         :label="t('From')"
-                        is-outlined
+                        filled
                         v-model="params.defaulterSinced"
                     />
                 </QItemSection>
diff --git a/src/pages/Customer/Payments/CustomerPaymentsFilter.vue b/src/pages/Customer/Payments/CustomerPaymentsFilter.vue
index 8982cba5a..ec20237b4 100644
--- a/src/pages/Customer/Payments/CustomerPaymentsFilter.vue
+++ b/src/pages/Customer/Payments/CustomerPaymentsFilter.vue
@@ -25,7 +25,7 @@ const props = defineProps({
         <template #body="{ params }">
             <QItem>
                 <QItemSection>
-                    <VnInput :label="t('Order ID')" v-model="params.orderFk" is-outlined>
+                    <VnInput :label="t('Order ID')" v-model="params.orderFk" filled>
                         <template #prepend>
                             <QIcon name="vn:basket" size="xs" />
                         </template>
@@ -34,11 +34,7 @@ const props = defineProps({
             </QItem>
             <QItem>
                 <QItemSection>
-                    <VnInput
-                        :label="t('Customer ID')"
-                        v-model="params.clientFk"
-                        is-outlined
-                    >
+                    <VnInput :label="t('Customer ID')" v-model="params.clientFk" filled>
                         <template #prepend>
                             <QIcon name="vn:client" size="xs" />
                         </template>
@@ -47,19 +43,15 @@ const props = defineProps({
             </QItem>
             <QItem>
                 <QItemSection>
-                    <VnInputNumber
-                        :label="t('Amount')"
-                        v-model="params.amount"
-                        is-outlined
-                    />
+                    <VnInputNumber :label="t('Amount')" v-model="params.amount" filled />
                 </QItemSection>
             </QItem>
             <QItem>
                 <QItemSection>
-                    <VnInputDate v-model="params.from" :label="t('From')" is-outlined />
+                    <VnInputDate v-model="params.from" :label="t('From')" filled />
                 </QItemSection>
                 <QItemSection>
-                    <VnInputDate v-model="params.to" :label="t('To')" is-outlined />
+                    <VnInputDate v-model="params.to" :label="t('To')" filled />
                 </QItemSection>
             </QItem>
         </template>
diff --git a/src/pages/Entry/EntryFilter.vue b/src/pages/Entry/EntryFilter.vue
index c283e4a0b..0511e61ef 100644
--- a/src/pages/Entry/EntryFilter.vue
+++ b/src/pages/Entry/EntryFilter.vue
@@ -101,13 +101,13 @@ const entryFilterPanel = ref();
                         :label="t('params.landed')"
                         v-model="params.landed"
                         @update:model-value="searchFn()"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
             <QItem>
                 <QItemSection>
-                    <VnInput v-model="params.id" label="Id" is-outlined />
+                    <VnInput v-model="params.id" label="Id" filled />
                 </QItemSection>
             </QItem>
             <QItem>
@@ -118,14 +118,14 @@ const entryFilterPanel = ref();
                         hide-selected
                         dense
                         outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
                 <QItemSection>
                     <VnInput
                         v-model="params.invoiceNumber"
                         :label="t('params.invoiceNumber')"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -134,7 +134,7 @@ const entryFilterPanel = ref();
                     <VnInput
                         v-model="params.reference"
                         :label="t('entry.list.tableVisibleColumns.reference')"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -150,7 +150,7 @@ const entryFilterPanel = ref();
                         hide-selected
                         dense
                         outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -159,7 +159,7 @@ const entryFilterPanel = ref();
                     <VnInput
                         v-model="params.evaNotes"
                         :label="t('params.evaNotes')"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -174,7 +174,7 @@ const entryFilterPanel = ref();
                         hide-selected
                         dense
                         outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -189,7 +189,7 @@ const entryFilterPanel = ref();
                         hide-selected
                         dense
                         outlined
-                        rounded
+                        filled
                     >
                         <template #option="scope">
                             <QItem v-bind="scope.itemProps">
@@ -211,7 +211,7 @@ const entryFilterPanel = ref();
                     <VnInput
                         v-model="params.invoiceNumber"
                         :label="t('params.invoiceNumber')"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -229,7 +229,7 @@ const entryFilterPanel = ref();
                         hide-selected
                         dense
                         outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -238,7 +238,7 @@ const entryFilterPanel = ref();
                     <VnInput
                         v-model="params.evaNotes"
                         :label="t('params.evaNotes')"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
diff --git a/src/pages/Entry/EntryLatestBuysFilter.vue b/src/pages/Entry/EntryLatestBuysFilter.vue
index 19b457524..d66eb9cfd 100644
--- a/src/pages/Entry/EntryLatestBuysFilter.vue
+++ b/src/pages/Entry/EntryLatestBuysFilter.vue
@@ -40,7 +40,7 @@ const tagValues = ref([]);
                         sort-by="nickname ASC"
                         dense
                         outlined
-                        rounded
+                        filled
                         use-input
                         @update:model-value="searchFn()"
                     />
@@ -55,7 +55,7 @@ const tagValues = ref([]);
                         sort-by="name ASC"
                         dense
                         outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -64,7 +64,7 @@ const tagValues = ref([]);
                     <VnInputDate
                         :label="t('components.itemsFilterPanel.started')"
                         v-model="params.from"
-                        is-outlined
+                        filled
                         @update:model-value="searchFn()"
                     />
                 </QItemSection>
@@ -74,7 +74,7 @@ const tagValues = ref([]);
                     <VnInputDate
                         :label="t('components.itemsFilterPanel.ended')"
                         v-model="params.to"
-                        is-outlined
+                        filled
                         @update:model-value="searchFn()"
                     />
                 </QItemSection>
@@ -121,7 +121,7 @@ const tagValues = ref([]);
                         option-label="name"
                         dense
                         outlined
-                        rounded
+                        filled
                         :emit-value="false"
                         use-input
                         :is-clearable="false"
@@ -138,7 +138,7 @@ const tagValues = ref([]);
                         option-label="value"
                         dense
                         outlined
-                        rounded
+                        filled
                         emit-value
                         use-input
                         :disable="!value"
@@ -151,7 +151,7 @@ const tagValues = ref([]);
                         v-model="value.value"
                         :label="t('params.value')"
                         :disable="!value"
-                        is-outlined
+                        filled
                         class="filter-input"
                         :is-clearable="false"
                         @keyup.enter="applyTags(params, searchFn)"
diff --git a/src/pages/Entry/EntryStockBoughtFilter.vue b/src/pages/Entry/EntryStockBoughtFilter.vue
index 136881f17..c77444f7e 100644
--- a/src/pages/Entry/EntryStockBoughtFilter.vue
+++ b/src/pages/Entry/EntryStockBoughtFilter.vue
@@ -50,7 +50,7 @@ onMounted(async () => {
                             }
                         "
                         :label="t('Date')"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
diff --git a/src/pages/InvoiceIn/InvoiceInFilter.vue b/src/pages/InvoiceIn/InvoiceInFilter.vue
index e010a1edb..224eb6bdd 100644
--- a/src/pages/InvoiceIn/InvoiceInFilter.vue
+++ b/src/pages/InvoiceIn/InvoiceInFilter.vue
@@ -39,17 +39,13 @@ function handleDaysAgo(params, daysAgo) {
                     <VnInputDate
                         :label="$t('globals.from')"
                         v-model="params.from"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
             <QItem>
                 <QItemSection>
-                    <VnInputDate
-                        :label="$t('globals.to')"
-                        v-model="params.to"
-                        is-outlined
-                    />
+                    <VnInputDate :label="$t('globals.to')" v-model="params.to" filled />
                 </QItemSection>
             </QItem>
             <QItem>
@@ -57,7 +53,7 @@ function handleDaysAgo(params, daysAgo) {
                     <VnInputNumber
                         :label="$t('globals.daysAgo')"
                         v-model="params.daysAgo"
-                        is-outlined
+                        filled
                         :step="0"
                         @update:model-value="(val) => handleDaysAgo(params, val)"
                         @remove="(val) => handleDaysAgo(params, val)"
@@ -66,12 +62,7 @@ function handleDaysAgo(params, daysAgo) {
             </QItem>
             <QItem>
                 <QItemSection>
-                    <VnSelectSupplier
-                        v-model="params.supplierFk"
-                        dense
-                        outlined
-                        rounded
-                    />
+                    <VnSelectSupplier v-model="params.supplierFk" dense outlined filled />
                 </QItemSection>
             </QItem>
             <QItem>
@@ -79,7 +70,7 @@ function handleDaysAgo(params, daysAgo) {
                     <VnInput
                         :label="getLocale('supplierRef')"
                         v-model="params.supplierRef"
-                        is-outlined
+                        filled
                         lazy-rules
                     />
                 </QItemSection>
@@ -89,7 +80,7 @@ function handleDaysAgo(params, daysAgo) {
                     <VnInput
                         :label="getLocale('fi')"
                         v-model="params.fi"
-                        is-outlined
+                        filled
                         lazy-rules
                     />
                 </QItemSection>
@@ -99,7 +90,7 @@ function handleDaysAgo(params, daysAgo) {
                     <VnInput
                         :label="getLocale('serial')"
                         v-model="params.serial"
-                        is-outlined
+                        filled
                         lazy-rules
                     />
                 </QItemSection>
@@ -109,7 +100,7 @@ function handleDaysAgo(params, daysAgo) {
                     <VnInput
                         :label="getLocale('account')"
                         v-model="params.account"
-                        is-outlined
+                        filled
                         lazy-rules
                     />
                 </QItemSection>
@@ -119,7 +110,7 @@ function handleDaysAgo(params, daysAgo) {
                     <VnInput
                         :label="getLocale('globals.params.awbCode')"
                         v-model="params.awbCode"
-                        is-outlined
+                        filled
                         lazy-rules
                     />
                 </QItemSection>
@@ -129,7 +120,7 @@ function handleDaysAgo(params, daysAgo) {
                     <VnInputNumber
                         :label="$t('globals.amount')"
                         v-model="params.amount"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -141,7 +132,7 @@ function handleDaysAgo(params, daysAgo) {
                         url="Companies"
                         option-label="code"
                         :fields="['id', 'code']"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
diff --git a/src/pages/InvoiceIn/Serial/InvoiceInSerialFilter.vue b/src/pages/InvoiceIn/Serial/InvoiceInSerialFilter.vue
index 19ed73e50..ede7dfd1f 100644
--- a/src/pages/InvoiceIn/Serial/InvoiceInSerialFilter.vue
+++ b/src/pages/InvoiceIn/Serial/InvoiceInSerialFilter.vue
@@ -26,7 +26,7 @@ const { t } = useI18n();
                         v-model="params.daysAgo"
                         :label="t('params.daysAgo')"
                         outlined
-                        rounded
+                        filled
                         dense
                     />
                 </QItemSection>
@@ -37,7 +37,7 @@ const { t } = useI18n();
                         v-model="params.serial"
                         :label="t('params.serial')"
                         outlined
-                        rounded
+                        filled
                         dense
                     />
                 </QItemSection>
diff --git a/src/pages/InvoiceOut/InvoiceOutFilter.vue b/src/pages/InvoiceOut/InvoiceOutFilter.vue
index 99524e0d6..20d2e5eee 100644
--- a/src/pages/InvoiceOut/InvoiceOutFilter.vue
+++ b/src/pages/InvoiceOut/InvoiceOutFilter.vue
@@ -33,17 +33,13 @@ const states = ref();
                     <VnInput
                         :label="t('globals.params.clientFk')"
                         v-model="params.clientFk"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
             <QItem>
                 <QItemSection>
-                    <VnInput
-                        v-model="params.fi"
-                        :label="t('globals.params.fi')"
-                        is-outlined
-                    />
+                    <VnInput v-model="params.fi" :label="t('globals.params.fi')" filled />
                 </QItemSection>
             </QItem>
             <QItem>
@@ -51,7 +47,7 @@ const states = ref();
                     <VnInputNumber
                         :label="t('globals.amount')"
                         v-model="params.amount"
-                        is-outlined
+                        filled
                         data-cy="InvoiceOutFilterAmountBtn"
                     />
                 </QItemSection>
@@ -63,7 +59,7 @@ const states = ref();
                         dense
                         lazy-rules
                         outlined
-                        rounded
+                        filled
                         type="number"
                         v-model.number="params.min"
                     />
@@ -74,7 +70,7 @@ const states = ref();
                         dense
                         lazy-rules
                         outlined
-                        rounded
+                        filled
                         type="number"
                         v-model.number="params.max"
                     />
@@ -94,7 +90,7 @@ const states = ref();
                     <VnInputDate
                         v-model="params.created"
                         :label="t('invoiceOut.params.created')"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -103,7 +99,7 @@ const states = ref();
                     <VnInputDate
                         v-model="params.dued"
                         :label="t('invoiceOut.params.dued')"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -111,7 +107,7 @@ const states = ref();
                 <QItemSection>
                     <VnSelect
                         outlined
-                        rounded
+                        filled
                         :label="t('globals.params.departmentFk')"
                         v-model="params.departmentFk"
                         option-value="id"
diff --git a/src/pages/InvoiceOut/InvoiceOutGlobalForm.vue b/src/pages/InvoiceOut/InvoiceOutGlobalForm.vue
index 392256473..53433c56b 100644
--- a/src/pages/InvoiceOut/InvoiceOutGlobalForm.vue
+++ b/src/pages/InvoiceOut/InvoiceOutGlobalForm.vue
@@ -26,7 +26,7 @@ const serialTypesOptions = ref([]);
 
 const handleInvoiceOutSerialsFetch = (data) => {
     serialTypesOptions.value = Array.from(
-        new Set(data.map((item) => item.type).filter((type) => type))
+        new Set(data.map((item) => item.type).filter((type) => type)),
     );
 };
 
@@ -99,8 +99,7 @@ onMounted(async () => {
                 option-label="name"
                 hide-selected
                 dense
-                outlined
-                rounded
+                filled
                 data-cy="InvoiceOutGlobalClientSelect"
             >
                 <template #option="scope">
@@ -124,19 +123,18 @@ onMounted(async () => {
                 option-label="type"
                 hide-selected
                 dense
-                outlined
-                rounded
+                filled
                 data-cy="InvoiceOutGlobalSerialSelect"
             />
             <VnInputDate
                 v-model="formData.invoiceDate"
                 :label="t('invoiceDate')"
-                is-outlined
+                filled
             />
             <VnInputDate
                 v-model="formData.maxShipped"
                 :label="t('maxShipped')"
-                is-outlined
+                filled
                 data-cy="InvoiceOutGlobalMaxShippedDate"
             />
             <VnSelect
@@ -145,8 +143,7 @@ onMounted(async () => {
                 :options="companiesOptions"
                 option-label="code"
                 dense
-                outlined
-                rounded
+                filled
                 data-cy="InvoiceOutGlobalCompanySelect"
             />
             <VnSelect
@@ -154,8 +151,7 @@ onMounted(async () => {
                 v-model="formData.printer"
                 :options="printersOptions"
                 dense
-                outlined
-                rounded
+                filled
                 data-cy="InvoiceOutGlobalPrinterSelect"
             />
         </div>
@@ -166,7 +162,7 @@ onMounted(async () => {
             color="primary"
             class="q-mt-md full-width"
             unelevated
-            rounded
+            filled
             dense
         />
         <QBtn
@@ -175,7 +171,7 @@ onMounted(async () => {
             color="primary"
             class="q-mt-md full-width"
             unelevated
-            rounded
+            filled
             dense
             @click="getStatus = 'stopping'"
         />
diff --git a/src/pages/InvoiceOut/InvoiceOutNegativeBasesFilter.vue b/src/pages/InvoiceOut/InvoiceOutNegativeBasesFilter.vue
index b24c8b247..321f48664 100644
--- a/src/pages/InvoiceOut/InvoiceOutNegativeBasesFilter.vue
+++ b/src/pages/InvoiceOut/InvoiceOutNegativeBasesFilter.vue
@@ -35,17 +35,13 @@ const props = defineProps({
                     <VnInputDate
                         v-model="params.from"
                         :label="t('globals.from')"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
             <QItem>
                 <QItemSection>
-                    <VnInputDate
-                        v-model="params.to"
-                        :label="t('globals.to')"
-                        is-outlined
-                    />
+                    <VnInputDate v-model="params.to" :label="t('globals.to')" filled />
                 </QItemSection>
             </QItem>
             <QItem>
@@ -58,7 +54,7 @@ const props = defineProps({
                         option-value="code"
                         dense
                         outlined
-                        rounded
+                        filled
                         @update:model-value="searchFn()"
                     >
                         <template #option="scope">
@@ -86,7 +82,7 @@ const props = defineProps({
                         option-value="name"
                         outlined
                         dense
-                        rounded
+                        filled
                         @update:model-value="searchFn()"
                     >
                         <template #option="scope">
@@ -112,7 +108,7 @@ const props = defineProps({
                         v-model="params.clientId"
                         outlined
                         dense
-                        rounded
+                        filled
                         @update:model-value="searchFn()"
                     />
                 </QItemSection>
@@ -122,7 +118,7 @@ const props = defineProps({
                     <VnInputNumber
                         v-model="params.amount"
                         :label="t('globals.amount')"
-                        is-outlined
+                        filled
                         :positive="false"
                     />
                 </QItemSection>
@@ -132,7 +128,7 @@ const props = defineProps({
                     <VnSelect
                         outlined
                         dense
-                        rounded
+                        filled
                         :label="t('globals.params.departmentFk')"
                         v-model="params.departmentFk"
                         option-value="id"
diff --git a/src/pages/Item/ItemFixedPriceFilter.vue b/src/pages/Item/ItemFixedPriceFilter.vue
index 8d92e245d..97fbe528a 100644
--- a/src/pages/Item/ItemFixedPriceFilter.vue
+++ b/src/pages/Item/ItemFixedPriceFilter.vue
@@ -13,7 +13,6 @@ const props = defineProps({
         required: true,
     },
 });
-
 </script>
 
 <template>
@@ -28,8 +27,7 @@ const props = defineProps({
                         :fields="['id', 'nickname']"
                         option-label="nickname"
                         dense
-                        outlined
-                        rounded
+                        filled
                         use-input
                         @update:model-value="searchFn()"
                         sort-by="nickname ASC"
@@ -47,7 +45,7 @@ const props = defineProps({
                         v-model="params.warehouseFk"
                         dense
                         outlined
-                        rounded
+                        filled
                         use-input
                         @update:model-value="searchFn()"
                     />
@@ -58,7 +56,7 @@ const props = defineProps({
                     <VnInputDate
                         :label="t('params.started')"
                         v-model="params.started"
-                        is-outlined
+                        filled
                         @update:model-value="searchFn()"
                     />
                 </QItemSection>
@@ -68,7 +66,7 @@ const props = defineProps({
                     <VnInputDate
                         :label="t('params.ended')"
                         v-model="params.ended"
-                        is-outlined
+                        filled
                         @update:model-value="searchFn()"
                     />
                 </QItemSection>
diff --git a/src/pages/Item/ItemListFilter.vue b/src/pages/Item/ItemListFilter.vue
index 22e948e06..b37435a84 100644
--- a/src/pages/Item/ItemListFilter.vue
+++ b/src/pages/Item/ItemListFilter.vue
@@ -177,11 +177,7 @@ onMounted(async () => {
         <template #body="{ params, searchFn }">
             <QItem>
                 <QItemSection>
-                    <VnInput
-                        v-model="params.search"
-                        :label="t('params.search')"
-                        is-outlined
-                    />
+                    <VnInput v-model="params.search" :label="t('params.search')" filled />
                 </QItemSection>
             </QItem>
             <QItem>
@@ -198,7 +194,7 @@ onMounted(async () => {
                         hide-selected
                         dense
                         outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -214,7 +210,7 @@ onMounted(async () => {
                         hide-selected
                         dense
                         outlined
-                        rounded
+                        filled
                     >
                         <template #option="scope">
                             <QItem v-bind="scope.itemProps">
@@ -241,7 +237,7 @@ onMounted(async () => {
                         hide-selected
                         dense
                         outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -253,7 +249,7 @@ onMounted(async () => {
                         hide-selected
                         dense
                         outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -283,7 +279,7 @@ onMounted(async () => {
                         option-label="name"
                         dense
                         outlined
-                        rounded
+                        filled
                         :emit-value="false"
                         use-input
                         :is-clearable="false"
@@ -300,7 +296,7 @@ onMounted(async () => {
                         option-label="value"
                         dense
                         outlined
-                        rounded
+                        filled
                         emit-value
                         use-input
                         :disable="!tag"
@@ -312,7 +308,7 @@ onMounted(async () => {
                         v-model="tag.value"
                         :label="t('params.value')"
                         :disable="!tag"
-                        is-outlined
+                        filled
                         :is-clearable="false"
                         @keydown.enter.prevent="applyTags(params, searchFn)"
                     />
@@ -352,7 +348,7 @@ onMounted(async () => {
                         option-value="label"
                         dense
                         outlined
-                        rounded
+                        filled
                         :emit-value="false"
                         use-input
                         :is-clearable="false"
@@ -377,7 +373,7 @@ onMounted(async () => {
                         v-model="fieldFilter.value"
                         :label="t('params.value')"
                         :disable="!fieldFilter.selectedField"
-                        is-outlined
+                        filled
                         @keydown.enter="applyFieldFilters(params, searchFn)"
                     />
                 </QItemSection>
diff --git a/src/pages/Item/ItemRequestFilter.vue b/src/pages/Item/ItemRequestFilter.vue
index a29203df3..88f53d1f8 100644
--- a/src/pages/Item/ItemRequestFilter.vue
+++ b/src/pages/Item/ItemRequestFilter.vue
@@ -87,11 +87,7 @@ onMounted(async () => {
         <template #body="{ params, searchFn }">
             <QItem>
                 <QItemSection>
-                    <VnInput
-                        v-model="params.search"
-                        :label="t('params.search')"
-                        is-outlined
-                    />
+                    <VnInput v-model="params.search" :label="t('params.search')" filled />
                 </QItemSection>
             </QItem>
             <QItem>
@@ -99,7 +95,7 @@ onMounted(async () => {
                     <VnInput
                         v-model="params.ticketFk"
                         :label="t('params.ticketFk')"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -115,7 +111,7 @@ onMounted(async () => {
                         hide-selected
                         dense
                         outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -124,7 +120,7 @@ onMounted(async () => {
                     <VnInput
                         v-model="params.clientFk"
                         :label="t('params.clientFk')"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -140,7 +136,7 @@ onMounted(async () => {
                         hide-selected
                         dense
                         outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -154,24 +150,16 @@ onMounted(async () => {
                         hide-selected
                         dense
                         outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
             <QItem>
                 <QItemSection>
-                    <VnInputDate
-                        v-model="params.from"
-                        :label="t('params.from')"
-                        is-outlined
-                    />
+                    <VnInputDate v-model="params.from" :label="t('params.from')" filled />
                 </QItemSection>
                 <QItemSection>
-                    <VnInputDate
-                        v-model="params.to"
-                        :label="t('params.to')"
-                        is-outlined
-                    />
+                    <VnInputDate v-model="params.to" :label="t('params.to')" filled />
                 </QItemSection>
             </QItem>
             <QItem>
@@ -180,7 +168,7 @@ onMounted(async () => {
                         :label="t('params.daysOnward')"
                         v-model="params.daysOnward"
                         lazy-rules
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -196,7 +184,7 @@ onMounted(async () => {
                         hide-selected
                         dense
                         outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
diff --git a/src/pages/Monitor/Ticket/MonitorTicketFilter.vue b/src/pages/Monitor/Ticket/MonitorTicketFilter.vue
index 447dd35b8..4d93f2de5 100644
--- a/src/pages/Monitor/Ticket/MonitorTicketFilter.vue
+++ b/src/pages/Monitor/Ticket/MonitorTicketFilter.vue
@@ -77,7 +77,7 @@ const getLocale = (label) => {
                     <VnInput
                         :label="t('globals.params.clientFk')"
                         v-model="params.clientFk"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -86,7 +86,7 @@ const getLocale = (label) => {
                     <VnInput
                         :label="t('params.orderFk')"
                         v-model="params.orderFk"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -95,7 +95,7 @@ const getLocale = (label) => {
                     <VnInputNumber
                         :label="t('params.scopeDays')"
                         v-model="params.scopeDays"
-                        is-outlined
+                        filled
                         @update:model-value="(val) => handleScopeDays(params, val)"
                         @remove="(val) => handleScopeDays(params, val)"
                     />
@@ -106,7 +106,7 @@ const getLocale = (label) => {
                     <VnInput
                         :label="t('params.nickname')"
                         v-model="params.nickname"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -115,7 +115,7 @@ const getLocale = (label) => {
                     <VnSelect
                         outlined
                         dense
-                        rounded
+                        filled
                         :label="t('globals.params.departmentFk')"
                         v-model="params.departmentFk"
                         option-value="id"
@@ -126,11 +126,7 @@ const getLocale = (label) => {
             </QItem>
             <QItem>
                 <QItemSection>
-                    <VnInput
-                        :label="t('params.refFk')"
-                        v-model="params.refFk"
-                        is-outlined
-                    />
+                    <VnInput :label="t('params.refFk')" v-model="params.refFk" filled />
                 </QItemSection>
             </QItem>
 
@@ -139,11 +135,10 @@ const getLocale = (label) => {
                     <VnSelect
                         outlined
                         dense
-                        rounded
+                        filled
                         :label="t('params.agencyModeFk')"
                         v-model="params.agencyModeFk"
                         url="AgencyModes/isActive"
-                        is-outlined
                     />
                 </QItemSection>
             </QItem>
@@ -152,11 +147,10 @@ const getLocale = (label) => {
                     <VnSelect
                         outlined
                         dense
-                        rounded
+                        filled
                         :label="t('globals.params.stateFk')"
                         v-model="params.stateFk"
                         url="States"
-                        is-outlined
                     />
                 </QItemSection>
             </QItem>
@@ -165,7 +159,7 @@ const getLocale = (label) => {
                     <VnSelect
                         outlined
                         dense
-                        rounded
+                        filled
                         :label="t('params.groupedStates')"
                         v-model="params.alertLevel"
                         :options="groupedStates"
@@ -178,7 +172,7 @@ const getLocale = (label) => {
                     <VnSelect
                         outlined
                         dense
-                        rounded
+                        filled
                         :label="t('globals.params.warehouseFk')"
                         v-model="params.warehouseFk"
                         :options="warehouses"
@@ -190,7 +184,7 @@ const getLocale = (label) => {
                     <VnSelect
                         outlined
                         dense
-                        rounded
+                        filled
                         :label="t('globals.params.countryFk')"
                         v-model="params.countryFk"
                         url="Countries"
@@ -202,7 +196,7 @@ const getLocale = (label) => {
                     <VnSelect
                         outlined
                         dense
-                        rounded
+                        filled
                         :label="t('globals.params.provinceFk')"
                         v-model="params.provinceFk"
                         url="Provinces"
@@ -214,7 +208,7 @@ const getLocale = (label) => {
                     <VnSelect
                         outlined
                         dense
-                        rounded
+                        filled
                         :label="t('globals.params.departmentFk')"
                         v-model="params.department"
                         option-label="name"
@@ -228,7 +222,7 @@ const getLocale = (label) => {
                     <VnSelect
                         outlined
                         dense
-                        rounded
+                        filled
                         :label="t('globals.params.packing')"
                         v-model="params.packing"
                         url="ItemPackingTypes"
diff --git a/src/pages/Order/Card/CatalogFilterValueDialog.vue b/src/pages/Order/Card/CatalogFilterValueDialog.vue
index d1bd48c9e..6c2684c27 100644
--- a/src/pages/Order/Card/CatalogFilterValueDialog.vue
+++ b/src/pages/Order/Card/CatalogFilterValueDialog.vue
@@ -59,7 +59,7 @@ const getSelectedTagValues = async (tag) => {
                 dense
                 outlined
                 class="q-mb-md"
-                rounded
+                filled
                 :emit-value="false"
                 use-input
                 @update:model-value="getSelectedTagValues"
@@ -80,7 +80,7 @@ const getSelectedTagValues = async (tag) => {
                         option-label="value"
                         dense
                         outlined
-                        rounded
+                        filled
                         emit-value
                         use-input
                         :disable="!value || !selectedTag"
@@ -101,7 +101,7 @@ const getSelectedTagValues = async (tag) => {
                         size="md"
                         outlined
                         dense
-                        rounded
+                        filled
                         flat
                         class="filter-icon col-2"
                         @click="tagValues.splice(index, 1)"
diff --git a/src/pages/Order/Card/OrderCatalogFilter.vue b/src/pages/Order/Card/OrderCatalogFilter.vue
index d16a92017..8b8a563d8 100644
--- a/src/pages/Order/Card/OrderCatalogFilter.vue
+++ b/src/pages/Order/Card/OrderCatalogFilter.vue
@@ -222,7 +222,7 @@ function addOrder(value, field, params) {
                         option-label="name"
                         dense
                         outlined
-                        rounded
+                        filled
                         emit-value
                         use-input
                         sort-by="name ASC"
@@ -252,7 +252,7 @@ function addOrder(value, field, params) {
                         :options="orderByList"
                         dense
                         outlined
-                        rounded
+                        filled
                         @update:model-value="(value) => addOrder(value, 'field', params)"
                     />
                 </QItemSection>
@@ -265,7 +265,7 @@ function addOrder(value, field, params) {
                         :options="orderWayList"
                         dense
                         outlined
-                        rounded
+                        filled
                         @update:model-value="(value) => addOrder(value, 'way', params)"
                     />
                 </QItemSection>
@@ -276,7 +276,7 @@ function addOrder(value, field, params) {
                     :label="t('components.itemsFilterPanel.value')"
                     dense
                     outlined
-                    rounded
+                    filled
                     :is-clearable="false"
                     v-model="searchByTag"
                     @keyup.enter="(val) => onSearchByTag(val, params)"
diff --git a/src/pages/Order/Card/OrderFilter.vue b/src/pages/Order/Card/OrderFilter.vue
index 42578423f..127601d04 100644
--- a/src/pages/Order/Card/OrderFilter.vue
+++ b/src/pages/Order/Card/OrderFilter.vue
@@ -50,7 +50,7 @@ const sourceList = ref([]);
                     lazy-rules
                     dense
                     outlined
-                    rounded
+                    filled
                 />
                 <VnSelect
                     :label="t('agency')"
@@ -59,12 +59,12 @@ const sourceList = ref([]);
                     :input-debounce="0"
                     dense
                     outlined
-                    rounded
+                    filled
                 />
                 <VnSelect
                     outlined
                     dense
-                    rounded
+                    filled
                     :label="t('globals.params.departmentFk')"
                     v-model="params.departmentFk"
                     option-value="id"
@@ -76,20 +76,20 @@ const sourceList = ref([]);
                     :label="t('fromLanded')"
                     dense
                     outlined
-                    rounded
+                    filled
                 />
                 <VnInputDate
                     v-model="params.to"
                     :label="t('toLanded')"
                     dense
                     outlined
-                    rounded
+                    filled
                 />
                 <VnInput
                     :label="t('orderId')"
                     v-model="params.orderFk"
                     lazy-rules
-                    is-outlined
+                    filled
                 />
                 <VnSelect
                     :label="t('application')"
@@ -99,7 +99,7 @@ const sourceList = ref([]);
                     option-value="value"
                     dense
                     outlined
-                    rounded
+                    filled
                     :input-debounce="0"
                 />
                 <QCheckbox
diff --git a/src/pages/Route/Card/RouteAutonomousFilter.vue b/src/pages/Route/Card/RouteAutonomousFilter.vue
index f70f60e1c..96298f515 100644
--- a/src/pages/Route/Card/RouteAutonomousFilter.vue
+++ b/src/pages/Route/Card/RouteAutonomousFilter.vue
@@ -71,7 +71,7 @@ const exprBuilder = (param, value) => {
             <QList dense>
                 <QItem class="q-my-sm">
                     <QItemSection>
-                        <VnInput v-model="params.routeFk" :label="t('ID')" is-outlined />
+                        <VnInput v-model="params.routeFk" :label="t('ID')" filled />
                     </QItemSection>
                 </QItem>
                 <QItem class="q-my-sm" v-if="agencyList">
@@ -84,7 +84,7 @@ const exprBuilder = (param, value) => {
                             option-label="name"
                             dense
                             outlined
-                            rounded
+                            filled
                             emit-value
                             map-options
                             use-input
@@ -103,7 +103,7 @@ const exprBuilder = (param, value) => {
                             option-label="name"
                             dense
                             outlined
-                            rounded
+                            filled
                             emit-value
                             map-options
                             use-input
@@ -124,7 +124,7 @@ const exprBuilder = (param, value) => {
                             option-label="name"
                             dense
                             outlined
-                            rounded
+                            filled
                             emit-value
                             map-options
                             use-input
@@ -135,20 +135,12 @@ const exprBuilder = (param, value) => {
                 </QItem>
                 <QItem class="q-my-sm">
                     <QItemSection>
-                        <VnInputDate
-                            v-model="params.dated"
-                            :label="t('Date')"
-                            is-outlined
-                        />
+                        <VnInputDate v-model="params.dated" :label="t('Date')" filled />
                     </QItemSection>
                 </QItem>
                 <QItem class="q-my-sm">
                     <QItemSection>
-                        <VnInputDate
-                            v-model="params.from"
-                            :label="t('From')"
-                            is-outlined
-                        />
+                        <VnInputDate v-model="params.from" :label="t('From')" filled />
                     </QItemSection>
                 </QItem>
                 <QItem class="q-my-sm">
@@ -156,7 +148,7 @@ const exprBuilder = (param, value) => {
                         <VnInputDate
                             v-model="params.to"
                             :label="t('To')"
-                            is-outlined
+                            filled
                             is-clearable
                         />
                     </QItemSection>
@@ -166,23 +158,23 @@ const exprBuilder = (param, value) => {
                         <VnInput
                             v-model="params.packages"
                             :label="t('Packages')"
-                            is-outlined
+                            filled
                         />
                     </QItemSection>
                 </QItem>
                 <QItem class="q-my-sm">
                     <QItemSection>
-                        <VnInput v-model="params.m3" :label="t('m3')" is-outlined />
+                        <VnInput v-model="params.m3" :label="t('m3')" filled />
                     </QItemSection>
                 </QItem>
                 <QItem class="q-my-sm">
                     <QItemSection>
-                        <VnInput v-model="params.kmTotal" :label="t('Km')" is-outlined />
+                        <VnInput v-model="params.kmTotal" :label="t('Km')" filled />
                     </QItemSection>
                 </QItem>
                 <QItem class="q-my-sm">
                     <QItemSection>
-                        <VnInput v-model="params.price" :label="t('Price')" is-outlined />
+                        <VnInput v-model="params.price" :label="t('Price')" filled />
                     </QItemSection>
                 </QItem>
                 <QItem class="q-my-sm">
@@ -190,7 +182,7 @@ const exprBuilder = (param, value) => {
                         <VnInput
                             v-model="params.invoiceInFk"
                             :label="t('Received')"
-                            is-outlined
+                            filled
                         />
                     </QItemSection>
                 </QItem>
diff --git a/src/pages/Route/Card/RouteFilter.vue b/src/pages/Route/Card/RouteFilter.vue
index cb5158517..2fa04559c 100644
--- a/src/pages/Route/Card/RouteFilter.vue
+++ b/src/pages/Route/Card/RouteFilter.vue
@@ -37,7 +37,7 @@ const emit = defineEmits(['search']);
                         v-model="params.workerFk"
                         dense
                         outlined
-                        rounded
+                        filled
                         :input-debounce="0"
                     />
                 </QItemSection>
@@ -53,7 +53,7 @@ const emit = defineEmits(['search']);
                         option-label="name"
                         dense
                         outlined
-                        rounded
+                        filled
                         :input-debounce="0"
                     />
                 </QItemSection>
@@ -63,7 +63,7 @@ const emit = defineEmits(['search']);
                     <VnInputDate
                         v-model="params.from"
                         :label="t('globals.from')"
-                        is-outlined
+                        filled
                         :disable="Boolean(params.scopeDays)"
                         @update:model-value="params.scopeDays = null"
                     />
@@ -74,7 +74,7 @@ const emit = defineEmits(['search']);
                     <VnInputDate
                         v-model="params.to"
                         :label="t('globals.to')"
-                        is-outlined
+                        filled
                         :disable="Boolean(params.scopeDays)"
                         @update:model-value="params.scopeDays = null"
                     />
@@ -86,7 +86,7 @@ const emit = defineEmits(['search']);
                         v-model="params.scopeDays"
                         type="number"
                         :label="t('globals.daysOnward')"
-                        is-outlined
+                        filled
                         clearable
                         :disable="Boolean(params.from || params.to)"
                         @update:model-value="
@@ -108,14 +108,14 @@ const emit = defineEmits(['search']);
                         option-filter-value="numberPlate"
                         dense
                         outlined
-                        rounded
+                        filled
                         :input-debounce="0"
                     />
                 </QItemSection>
             </QItem>
             <QItem class="q-my-sm">
                 <QItemSection>
-                    <VnInput v-model="params.m3" label="m³" is-outlined clearable />
+                    <VnInput v-model="params.m3" label="m³" filled clearable />
                 </QItemSection>
             </QItem>
             <QItem class="q-my-sm">
@@ -128,7 +128,7 @@ const emit = defineEmits(['search']);
                         option-label="name"
                         dense
                         outlined
-                        rounded
+                        filled
                         :input-debounce="0"
                     />
                 </QItemSection>
@@ -138,7 +138,7 @@ const emit = defineEmits(['search']);
                     <VnInput
                         v-model="params.description"
                         :label="t('globals.description')"
-                        is-outlined
+                        filled
                         clearable
                     />
                 </QItemSection>
diff --git a/src/pages/Route/Roadmap/RoadmapFilter.vue b/src/pages/Route/Roadmap/RoadmapFilter.vue
index 982f1efba..15e7e64e4 100644
--- a/src/pages/Route/Roadmap/RoadmapFilter.vue
+++ b/src/pages/Route/Roadmap/RoadmapFilter.vue
@@ -31,12 +31,12 @@ const emit = defineEmits(['search']);
         <template #body="{ params }">
             <QItem class="q-my-sm">
                 <QItemSection>
-                    <VnInputDate v-model="params.from" :label="t('From')" is-outlined />
+                    <VnInputDate v-model="params.from" :label="t('From')" filled />
                 </QItemSection>
             </QItem>
             <QItem class="q-my-sm">
                 <QItemSection>
-                    <VnInputDate v-model="params.to" :label="t('To')" is-outlined />
+                    <VnInputDate v-model="params.to" :label="t('To')" filled />
                 </QItemSection>
             </QItem>
             <QItem class="q-my-sm">
@@ -44,7 +44,7 @@ const emit = defineEmits(['search']);
                     <VnInput
                         v-model="params.tractorPlate"
                         :label="t('Tractor Plate')"
-                        is-outlined
+                        filled
                         clearable
                     />
                 </QItemSection>
@@ -54,7 +54,7 @@ const emit = defineEmits(['search']);
                     <VnInput
                         v-model="params.trailerPlate"
                         :label="t('Trailer Plate')"
-                        is-outlined
+                        filled
                         clearable
                     />
                 </QItemSection>
@@ -67,7 +67,7 @@ const emit = defineEmits(['search']);
                         v-model="params.supplierFk"
                         dense
                         outlined
-                        rounded
+                        filled
                         emit-value
                         map-options
                         use-input
@@ -81,7 +81,7 @@ const emit = defineEmits(['search']);
                         v-model="params.price"
                         :label="t('Price')"
                         type="number"
-                        is-outlined
+                        filled
                         clearable
                     />
                 </QItemSection>
@@ -91,7 +91,7 @@ const emit = defineEmits(['search']);
                     <VnInput
                         v-model="params.driverName"
                         :label="t('Driver name')"
-                        is-outlined
+                        filled
                         clearable
                     />
                 </QItemSection>
@@ -101,7 +101,7 @@ const emit = defineEmits(['search']);
                     <VnInput
                         v-model="params.phone"
                         :label="t('Phone')"
-                        is-outlined
+                        filled
                         clearable
                     />
                 </QItemSection>
diff --git a/src/pages/Shelving/Card/ShelvingFilter.vue b/src/pages/Shelving/Card/ShelvingFilter.vue
index 88d716046..f91622cfd 100644
--- a/src/pages/Shelving/Card/ShelvingFilter.vue
+++ b/src/pages/Shelving/Card/ShelvingFilter.vue
@@ -40,14 +40,14 @@ const emit = defineEmits(['search']);
                         :filter-options="['id', 'code']"
                         dense
                         outlined
-                        rounded
+                        filled
                         sort-by="code ASC"
                     />
                 </QItemSection>
             </QItem>
             <QItem class="q-mb-sm">
                 <QItemSection>
-                    <VnSelectWorker v-model="params.userFk" outlined rounded />
+                    <VnSelectWorker v-model="params.userFk" outlined filled />
                 </QItemSection>
             </QItem>
             <QItem class="q-mb-md">
diff --git a/src/pages/Shelving/Parking/ParkingFilter.vue b/src/pages/Shelving/Parking/ParkingFilter.vue
index 1d7c3a4b6..509b08f4c 100644
--- a/src/pages/Shelving/Parking/ParkingFilter.vue
+++ b/src/pages/Shelving/Parking/ParkingFilter.vue
@@ -36,11 +36,7 @@ const emit = defineEmits(['search']);
         <template #body="{ params }">
             <QItem>
                 <QItemSection>
-                    <VnInput
-                        :label="t('params.code')"
-                        v-model="params.code"
-                        is-outlined
-                    />
+                    <VnInput :label="t('params.code')" v-model="params.code" filled />
                 </QItemSection>
             </QItem>
             <QItem>
@@ -52,7 +48,7 @@ const emit = defineEmits(['search']);
                         :label="t('params.sectorFk')"
                         dense
                         outlined
-                        rounded
+                        filled
                         :options="sectors"
                         use-input
                         input-debounce="0"
diff --git a/src/pages/Supplier/Card/SupplierBalanceFilter.vue b/src/pages/Supplier/Card/SupplierBalanceFilter.vue
index c4b63d9c8..b7c5555fa 100644
--- a/src/pages/Supplier/Card/SupplierBalanceFilter.vue
+++ b/src/pages/Supplier/Card/SupplierBalanceFilter.vue
@@ -33,7 +33,7 @@ defineProps({
                         :label="t('params.from')"
                         v-model="params.from"
                         @update:model-value="searchFn()"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -48,7 +48,7 @@ defineProps({
                         sort-by="id"
                         dense
                         outlined
-                        rounded
+                        filled
                     >
                         <template #option="scope">
                             <QItem v-bind="scope.itemProps">
@@ -75,7 +75,7 @@ defineProps({
                         hide-selected
                         dense
                         outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
diff --git a/src/pages/Supplier/Card/SupplierConsumptionFilter.vue b/src/pages/Supplier/Card/SupplierConsumptionFilter.vue
index 390f7d9ff..4de0c0039 100644
--- a/src/pages/Supplier/Card/SupplierConsumptionFilter.vue
+++ b/src/pages/Supplier/Card/SupplierConsumptionFilter.vue
@@ -25,20 +25,12 @@ defineProps({
         <template #body="{ params, searchFn }">
             <QItem>
                 <QItemSection>
-                    <VnInput
-                        v-model="params.search"
-                        :label="t('params.search')"
-                        is-outlined
-                    />
+                    <VnInput v-model="params.search" :label="t('params.search')" filled />
                 </QItemSection>
             </QItem>
             <QItem>
                 <QItemSection>
-                    <VnInput
-                        v-model="params.itemId"
-                        :label="t('params.itemId')"
-                        is-outlined
-                    />
+                    <VnInput v-model="params.itemId" :label="t('params.itemId')" filled />
                 </QItemSection>
             </QItem>
             <QItem>
@@ -55,7 +47,7 @@ defineProps({
                         hide-selected
                         dense
                         outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -74,7 +66,7 @@ defineProps({
                         hide-selected
                         dense
                         outlined
-                        rounded
+                        filled
                     >
                         <template #option="scope">
                             <QItem v-bind="scope.itemProps">
@@ -103,7 +95,7 @@ defineProps({
                         hide-selected
                         dense
                         outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -113,7 +105,7 @@ defineProps({
                         :label="t('params.from')"
                         v-model="params.from"
                         @update:model-value="searchFn()"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -123,7 +115,7 @@ defineProps({
                         :label="t('params.to')"
                         v-model="params.to"
                         @update:model-value="searchFn()"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
diff --git a/src/pages/Ticket/Negative/TicketLackFilter.vue b/src/pages/Ticket/Negative/TicketLackFilter.vue
index 3762f453d..e5b34dcf6 100644
--- a/src/pages/Ticket/Negative/TicketLackFilter.vue
+++ b/src/pages/Ticket/Negative/TicketLackFilter.vue
@@ -81,7 +81,7 @@ const setUserParams = (params) => {
                             v-model="params.days"
                             :label="t('negative.days')"
                             dense
-                            is-outlined
+                            filled
                             type="number"
                             @update:model-value="
                                 (value) => {
@@ -97,7 +97,7 @@ const setUserParams = (params) => {
                             v-model="params.id"
                             :label="t('negative.id')"
                             dense
-                            is-outlined
+                            filled
                         />
                     </QItemSection>
                 </QItem>
@@ -107,7 +107,7 @@ const setUserParams = (params) => {
                             v-model="params.producer"
                             :label="t('negative.producer')"
                             dense
-                            is-outlined
+                            filled
                         />
                     </QItemSection>
                 </QItem>
@@ -117,7 +117,7 @@ const setUserParams = (params) => {
                             v-model="params.origen"
                             :label="t('negative.origen')"
                             dense
-                            is-outlined
+                            filled
                         />
                     </QItemSection> </QItem
                 ><QItem>
@@ -134,7 +134,7 @@ const setUserParams = (params) => {
                             hide-selected
                             dense
                             outlined
-                            rounded
+                            filled
                         /> </QItemSection
                     ><QItemSection v-else>
                         <QSkeleton class="full-width" type="QSelect" />
@@ -152,7 +152,7 @@ const setUserParams = (params) => {
                             hide-selected
                             dense
                             outlined
-                            rounded
+                            filled
                         >
                             <template #option="scope">
                                 <QItem v-bind="scope.itemProps">
diff --git a/src/pages/Ticket/TicketAdvanceFilter.vue b/src/pages/Ticket/TicketAdvanceFilter.vue
index 6d5c7726e..c59db53f2 100644
--- a/src/pages/Ticket/TicketAdvanceFilter.vue
+++ b/src/pages/Ticket/TicketAdvanceFilter.vue
@@ -71,7 +71,7 @@ onMounted(async () => await getItemPackingTypes());
                     <VnInputDate
                         v-model="params.dateFuture"
                         :label="t('params.dateFuture')"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -80,7 +80,7 @@ onMounted(async () => await getItemPackingTypes());
                     <VnInputDate
                         v-model="params.dateToAdvance"
                         :label="t('params.dateToAdvance')"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -96,7 +96,7 @@ onMounted(async () => await getItemPackingTypes());
                         @update:model-value="searchFn()"
                         dense
                         outlined
-                        rounded
+                        filled
                         :use-like="false"
                     >
                     </VnSelect>
@@ -114,7 +114,7 @@ onMounted(async () => await getItemPackingTypes());
                         @update:model-value="searchFn()"
                         dense
                         outlined
-                        rounded
+                        filled
                         :use-like="false"
                     >
                     </VnSelect>
@@ -125,7 +125,7 @@ onMounted(async () => await getItemPackingTypes());
                     <VnInputNumber
                         v-model="params.scopeDays"
                         :label="t('Days onward')"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -148,7 +148,7 @@ onMounted(async () => await getItemPackingTypes());
                         :fields="['id', 'name']"
                         dense
                         outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -163,7 +163,7 @@ onMounted(async () => await getItemPackingTypes());
                         @update:model-value="searchFn()"
                         dense
                         outlined
-                        rounded
+                        filled
                     >
                     </VnSelect>
                 </QItemSection>
diff --git a/src/pages/Ticket/TicketFilter.vue b/src/pages/Ticket/TicketFilter.vue
index f959157f6..ccc42f9be 100644
--- a/src/pages/Ticket/TicketFilter.vue
+++ b/src/pages/Ticket/TicketFilter.vue
@@ -63,18 +63,10 @@ const getGroupedStates = (data) => {
         <template #body="{ params, searchFn }">
             <QItem>
                 <QItemSection>
-                    <VnInput
-                        v-model="params.clientFk"
-                        :label="t('Customer ID')"
-                        is-outlined
-                    />
+                    <VnInput v-model="params.clientFk" :label="t('Customer ID')" filled />
                 </QItemSection>
                 <QItemSection>
-                    <VnInput
-                        v-model="params.orderFk"
-                        :label="t('Order ID')"
-                        is-outlined
-                    />
+                    <VnInput v-model="params.orderFk" :label="t('Order ID')" filled />
                 </QItemSection>
             </QItem>
             <QItem>
@@ -82,7 +74,7 @@ const getGroupedStates = (data) => {
                     <VnInputDate
                         v-model="params.from"
                         :label="t('From')"
-                        is-outlined
+                        filled
                         data-cy="From_date"
                     />
                 </QItemSection>
@@ -90,7 +82,7 @@ const getGroupedStates = (data) => {
                     <VnInputDate
                         v-model="params.to"
                         :label="t('To')"
-                        is-outlined
+                        filled
                         data-cy="To_date"
                     />
                 </QItemSection>
@@ -100,7 +92,7 @@ const getGroupedStates = (data) => {
                     <VnSelect
                         outlined
                         dense
-                        rounded
+                        filled
                         :label="t('globals.params.departmentFk')"
                         v-model="params.departmentFk"
                         option-value="id"
@@ -126,7 +118,7 @@ const getGroupedStates = (data) => {
                         use-input
                         dense
                         outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -147,18 +139,14 @@ const getGroupedStates = (data) => {
                         use-input
                         dense
                         outlined
-                        rounded
+                        filled
                         sort-by="name ASC"
                     />
                 </QItemSection>
             </QItem>
             <QItem>
                 <QItemSection>
-                    <VnInput
-                        v-model="params.refFk"
-                        :label="t('Invoice Ref.')"
-                        is-outlined
-                    />
+                    <VnInput v-model="params.refFk" :label="t('Invoice Ref.')" filled />
                 </QItemSection>
             </QItem>
             <QItem>
@@ -166,17 +154,13 @@ const getGroupedStates = (data) => {
                     <VnInput
                         v-model="params.scopeDays"
                         :label="t('Days onward')"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
             <QItem>
                 <QItemSection>
-                    <VnInput
-                        v-model="params.nickname"
-                        :label="t('Nickname')"
-                        is-outlined
-                    />
+                    <VnInput v-model="params.nickname" :label="t('Nickname')" filled />
                 </QItemSection>
             </QItem>
             <QItem>
@@ -242,7 +226,7 @@ const getGroupedStates = (data) => {
                         use-input
                         dense
                         outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -261,7 +245,7 @@ const getGroupedStates = (data) => {
                         use-input
                         dense
                         outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -282,7 +266,7 @@ const getGroupedStates = (data) => {
                         use-input
                         dense
                         outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -291,7 +275,7 @@ const getGroupedStates = (data) => {
                     <VnInput
                         v-model="params.collectionFk"
                         :label="t('Collection')"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
diff --git a/src/pages/Ticket/TicketFutureFilter.vue b/src/pages/Ticket/TicketFutureFilter.vue
index 64e060a39..92b6bfd62 100644
--- a/src/pages/Ticket/TicketFutureFilter.vue
+++ b/src/pages/Ticket/TicketFutureFilter.vue
@@ -73,7 +73,7 @@ onMounted(async () => {
                     <VnInputDate
                         v-model="params.originScopeDays"
                         :label="t('params.originScopeDays')"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -82,7 +82,7 @@ onMounted(async () => {
                     <VnInputDate
                         v-model="params.futureScopeDays"
                         :label="t('params.futureScopeDays')"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -91,7 +91,7 @@ onMounted(async () => {
                     <VnInput
                         :label="t('params.litersMax')"
                         v-model="params.litersMax"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -100,7 +100,7 @@ onMounted(async () => {
                     <VnInput
                         :label="t('params.linesMax')"
                         v-model="params.linesMax"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -116,7 +116,7 @@ onMounted(async () => {
                         @update:model-value="searchFn()"
                         dense
                         outlined
-                        rounded
+                        filled
                     >
                     </VnSelect>
                 </QItemSection>
@@ -133,7 +133,7 @@ onMounted(async () => {
                         @update:model-value="searchFn()"
                         dense
                         outlined
-                        rounded
+                        filled
                     >
                     </VnSelect>
                 </QItemSection>
@@ -149,7 +149,7 @@ onMounted(async () => {
                         @update:model-value="searchFn()"
                         dense
                         outlined
-                        rounded
+                        filled
                     >
                     </VnSelect>
                 </QItemSection>
@@ -165,7 +165,7 @@ onMounted(async () => {
                         @update:model-value="searchFn()"
                         dense
                         outlined
-                        rounded
+                        filled
                     >
                     </VnSelect>
                 </QItemSection>
@@ -192,7 +192,7 @@ onMounted(async () => {
                         @update:model-value="searchFn()"
                         dense
                         outlined
-                        rounded
+                        filled
                     >
                     </VnSelect>
                 </QItemSection>
diff --git a/src/pages/Travel/ExtraCommunityFilter.vue b/src/pages/Travel/ExtraCommunityFilter.vue
index ae6e695be..acb8c4e72 100644
--- a/src/pages/Travel/ExtraCommunityFilter.vue
+++ b/src/pages/Travel/ExtraCommunityFilter.vue
@@ -87,7 +87,7 @@ warehouses();
         <template #body="{ params, searchFn }">
             <QItem>
                 <QItemSection>
-                    <VnInput label="id" v-model="params.id" is-outlined />
+                    <VnInput label="id" v-model="params.id" filled />
                 </QItemSection>
             </QItem>
             <QItem>
@@ -95,7 +95,7 @@ warehouses();
                     <VnInput
                         :label="t('extraCommunity.filter.reference')"
                         v-model="params.reference"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -107,7 +107,7 @@ warehouses();
                         :label="t('extraCommunity.filter.totalEntries')"
                         dense
                         outlined
-                        rounded
+                        filled
                         min="0"
                         class="input-number"
                     >
@@ -142,7 +142,7 @@ warehouses();
                         hide-selected
                         dense
                         outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -152,7 +152,7 @@ warehouses();
                         :label="t('extraCommunity.filter.shippedFrom')"
                         v-model="params.shippedFrom"
                         @update:model-value="searchFn()"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -162,7 +162,7 @@ warehouses();
                         :label="t('extraCommunity.filter.landedTo')"
                         v-model="params.landedTo"
                         @update:model-value="searchFn()"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -177,7 +177,7 @@ warehouses();
                         hide-selected
                         dense
                         outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -192,7 +192,7 @@ warehouses();
                         hide-selected
                         dense
                         outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -207,7 +207,7 @@ warehouses();
                         hide-selected
                         dense
                         outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -219,7 +219,7 @@ warehouses();
                         hide-selected
                         dense
                         outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -230,7 +230,7 @@ warehouses();
                         hide-selected
                         dense
                         outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -246,7 +246,7 @@ warehouses();
                         hide-selected
                         dense
                         outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
diff --git a/src/pages/Travel/TravelFilter.vue b/src/pages/Travel/TravelFilter.vue
index 4a9c80952..c36ba2ecc 100644
--- a/src/pages/Travel/TravelFilter.vue
+++ b/src/pages/Travel/TravelFilter.vue
@@ -33,19 +33,14 @@ defineExpose({ states });
         </template>
         <template #body="{ params, searchFn }">
             <div class="q-pa-sm q-gutter-y-sm">
-                <VnInput
-                    :label="t('travel.Id')"
-                    v-model="params.id"
-                    lazy-rules
-                    is-outlined
-                >
+                <VnInput :label="t('travel.Id')" v-model="params.id" lazy-rules filled>
                     <template #prepend> <QIcon name="badge" size="xs" /></template>
                 </VnInput>
                 <VnInput
                     :label="t('travel.ref')"
                     v-model="params.ref"
                     lazy-rules
-                    is-outlined
+                    filled
                 />
                 <VnSelect
                     :label="t('travel.agency')"
@@ -57,7 +52,7 @@ defineExpose({ states });
                     option-filter="name"
                     dense
                     outlined
-                    rounded
+                    filled
                 />
                 <VnSelect
                     :label="t('travel.warehouseInFk')"
@@ -70,21 +65,21 @@ defineExpose({ states });
                     option-filter="name"
                     dense
                     outlined
-                    rounded
+                    filled
                 />
                 <VnInputDate
                     :label="t('travel.shipped')"
                     v-model="params.shipped"
                     @update:model-value="searchFn()"
                     outlined
-                    rounded
+                    filled
                 />
                 <VnInputTime
                     v-model="params.shipmentHour"
                     @update:model-value="searchFn()"
                     :label="t('travel.shipmentHour')"
                     outlined
-                    rounded
+                    filled
                     dense
                 />
                 <VnSelect
@@ -98,7 +93,7 @@ defineExpose({ states });
                     option-filter="name"
                     dense
                     outlined
-                    rounded
+                    filled
                 />
                 <VnInputDate
                     :label="t('travel.landed')"
@@ -106,27 +101,27 @@ defineExpose({ states });
                     @update:model-value="searchFn()"
                     dense
                     outlined
-                    rounded
+                    filled
                 />
                 <VnInputTime
                     v-model="params.landingHour"
                     @update:model-value="searchFn()"
                     :label="t('travel.landingHour')"
                     outlined
-                    rounded
+                    filled
                     dense
                 />
                 <VnInput
                     :label="t('travel.totalEntries')"
                     v-model="params.totalEntries"
                     lazy-rules
-                    is-outlined
+                    filled
                 />
                 <VnInput
                     :label="t('travel.daysOnward')"
                     v-model="params.daysOnward"
                     lazy-rules
-                    is-outlined
+                    filled
                 />
             </div>
         </template>
diff --git a/src/pages/Worker/Card/WorkerCalendarFilter.vue b/src/pages/Worker/Card/WorkerCalendarFilter.vue
index 48fc4094b..47ca04fae 100644
--- a/src/pages/Worker/Card/WorkerCalendarFilter.vue
+++ b/src/pages/Worker/Card/WorkerCalendarFilter.vue
@@ -40,7 +40,7 @@ watch(
     (newValue) => {
         checkHolidays(newValue);
     },
-    { deep: true, immediate: true }
+    { deep: true, immediate: true },
 );
 const emit = defineEmits(['update:businessFk', 'update:year', 'update:absenceType']);
 
@@ -175,7 +175,7 @@ const yearList = ref(generateYears());
                     :options="yearList"
                     dense
                     outlined
-                    rounded
+                    filled
                     use-input
                     :is-clearable="false"
                 />
@@ -189,7 +189,7 @@ const yearList = ref(generateYears());
                     option-label="businessFk"
                     dense
                     outlined
-                    rounded
+                    filled
                     use-input
                     :is-clearable="false"
                 >
diff --git a/src/pages/Worker/WorkerFilter.vue b/src/pages/Worker/WorkerFilter.vue
index 8210ba0e3..c24797901 100644
--- a/src/pages/Worker/WorkerFilter.vue
+++ b/src/pages/Worker/WorkerFilter.vue
@@ -35,7 +35,7 @@ const getLocale = (label) => {
         <template #body="{ params }">
             <QItem>
                 <QItemSection>
-                    <VnInput :label="t('FI')" v-model="params.fi" is-outlined
+                    <VnInput :label="t('FI')" v-model="params.fi" filled
                         ><template #prepend>
                             <QIcon name="badge" size="xs"></QIcon> </template
                     ></VnInput>
@@ -43,29 +43,17 @@ const getLocale = (label) => {
             </QItem>
             <QItem>
                 <QItemSection>
-                    <VnInput
-                        :label="t('First Name')"
-                        v-model="params.firstName"
-                        is-outlined
-                    />
+                    <VnInput :label="t('First Name')" v-model="params.firstName" filled />
                 </QItemSection>
             </QItem>
             <QItem>
                 <QItemSection>
-                    <VnInput
-                        :label="t('Last Name')"
-                        v-model="params.lastName"
-                        is-outlined
-                    />
+                    <VnInput :label="t('Last Name')" v-model="params.lastName" filled />
                 </QItemSection>
             </QItem>
             <QItem>
                 <QItemSection>
-                    <VnInput
-                        :label="t('User Name')"
-                        v-model="params.userName"
-                        is-outlined
-                    />
+                    <VnInput :label="t('User Name')" v-model="params.userName" filled />
                 </QItemSection>
             </QItem>
             <QItem>
@@ -80,22 +68,18 @@ const getLocale = (label) => {
                         map-options
                         dense
                         outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
             <QItem>
                 <QItemSection>
-                    <VnInput :label="t('Email')" v-model="params.email" is-outlined />
+                    <VnInput :label="t('Email')" v-model="params.email" filled />
                 </QItemSection>
             </QItem>
             <QItem>
                 <QItemSection>
-                    <VnInput
-                        :label="t('Extension')"
-                        v-model="params.extension"
-                        is-outlined
-                    />
+                    <VnInput :label="t('Extension')" v-model="params.extension" filled />
                 </QItemSection>
             </QItem>
             <QItem>
diff --git a/src/pages/Zone/ZoneDeliveryPanel.vue b/src/pages/Zone/ZoneDeliveryPanel.vue
index a8cb05afc..b49e3e1b4 100644
--- a/src/pages/Zone/ZoneDeliveryPanel.vue
+++ b/src/pages/Zone/ZoneDeliveryPanel.vue
@@ -96,7 +96,7 @@ watch(
                 hide-selected
                 dense
                 outlined
-                rounded
+                filled
                 map-key="geoFk"
                 data-cy="ZoneDeliveryDaysPostcodeSelect"
             >
@@ -129,7 +129,7 @@ watch(
                 hide-selected
                 dense
                 outlined
-                rounded
+                filled
                 data-cy="ZoneDeliveryDaysAgencySelect"
             />
             <VnSelect

From 3fdf82258e953fc282cf427cd385b265a6307ab4 Mon Sep 17 00:00:00 2001
From: Javier Segarra <jsegarra@verdnatura.es>
Date: Fri, 14 Mar 2025 11:45:48 +0100
Subject: [PATCH 15/44] style: refs #8131 remove outlined from filterPanel

---
 src/components/ItemsFilterPanel.vue                 |  5 +----
 src/pages/Account/AccountFilter.vue                 |  1 -
 src/pages/Account/Acls/AclFilter.vue                |  4 ----
 src/pages/Claim/ClaimFilter.vue                     |  7 -------
 src/pages/Customer/CustomerFilter.vue               |  3 ---
 .../Customer/Defaulter/CustomerDefaulterFilter.vue  |  4 ----
 src/pages/Entry/EntryFilter.vue                     |  5 -----
 src/pages/Entry/EntryLatestBuysFilter.vue           |  4 ----
 src/pages/InvoiceIn/InvoiceInFilter.vue             |  2 +-
 .../InvoiceIn/Serial/InvoiceInSerialFilter.vue      |  2 --
 src/pages/InvoiceOut/InvoiceOutFilter.vue           |  3 ---
 .../InvoiceOut/InvoiceOutNegativeBasesFilter.vue    |  4 ----
 src/pages/Item/ItemFixedPriceFilter.vue             |  1 -
 src/pages/Item/ItemListFilter.vue                   |  7 -------
 src/pages/Item/ItemRequestFilter.vue                |  4 ----
 src/pages/Monitor/Ticket/MonitorTicketFilter.vue    |  9 ---------
 src/pages/Order/Card/CatalogFilterValueDialog.vue   |  5 +----
 src/pages/Order/Card/OrderCatalogFilter.vue         |  4 ----
 src/pages/Order/Card/OrderFilter.vue                | 13 +------------
 src/pages/Route/Card/RouteAutonomousFilter.vue      |  3 ---
 src/pages/Route/Card/RouteFilter.vue                |  4 ----
 src/pages/Route/Roadmap/RoadmapFilter.vue           |  1 -
 src/pages/Shelving/Card/ShelvingFilter.vue          |  3 +--
 src/pages/Shelving/Parking/ParkingFilter.vue        |  1 -
 src/pages/Supplier/Card/SupplierBalanceFilter.vue   |  2 --
 .../Supplier/Card/SupplierConsumptionFilter.vue     |  3 ---
 src/pages/Ticket/Negative/TicketLackFilter.vue      |  2 --
 src/pages/Ticket/TicketAdvanceFilter.vue            |  4 ----
 src/pages/Ticket/TicketFilter.vue                   |  6 ------
 src/pages/Ticket/TicketFutureFilter.vue             |  5 -----
 src/pages/Travel/ExtraCommunityFilter.vue           |  8 --------
 src/pages/Travel/TravelFilter.vue                   |  7 -------
 src/pages/Worker/Card/WorkerCalendarFilter.vue      |  2 --
 src/pages/Worker/WorkerFilter.vue                   |  1 -
 src/pages/Zone/ZoneDeliveryPanel.vue                |  3 ---
 35 files changed, 5 insertions(+), 137 deletions(-)

diff --git a/src/components/ItemsFilterPanel.vue b/src/components/ItemsFilterPanel.vue
index c58c7ac3c..3c689750a 100644
--- a/src/components/ItemsFilterPanel.vue
+++ b/src/components/ItemsFilterPanel.vue
@@ -198,7 +198,6 @@ const setCategoryList = (data) => {
                         v-model="params.typeFk"
                         :options="itemTypesOptions"
                         dense
-                        outlined
                         filled
                         use-input
                         :disable="!selectedCategoryFk"
@@ -235,7 +234,6 @@ const setCategoryList = (data) => {
                         v-model="value.selectedTag"
                         :options="tagOptions"
                         dense
-                        outlined
                         filled
                         :emit-value="false"
                         use-input
@@ -252,7 +250,6 @@ const setCategoryList = (data) => {
                         option-value="value"
                         option-label="value"
                         dense
-                        outlined
                         filled
                         emit-value
                         use-input
@@ -265,7 +262,7 @@ const setCategoryList = (data) => {
                         v-model="value.value"
                         :label="t('components.itemsFilterPanel.value')"
                         :disable="!value"
-                        is-outlined
+                        is-
                         :is-clearable="false"
                         @keyup.enter="applyTags(params, searchFn)"
                     />
diff --git a/src/pages/Account/AccountFilter.vue b/src/pages/Account/AccountFilter.vue
index 7796e3c1a..732e92f77 100644
--- a/src/pages/Account/AccountFilter.vue
+++ b/src/pages/Account/AccountFilter.vue
@@ -75,7 +75,6 @@ const rolesOptions = ref([]);
                         use-input
                         hide-selected
                         dense
-                        outlined
                         filled
                         :input-debounce="0"
                     />
diff --git a/src/pages/Account/Acls/AclFilter.vue b/src/pages/Account/Acls/AclFilter.vue
index 037be525a..222fe5b77 100644
--- a/src/pages/Account/Acls/AclFilter.vue
+++ b/src/pages/Account/Acls/AclFilter.vue
@@ -56,7 +56,6 @@ onBeforeMount(() => {
                         option-label="name"
                         use-input
                         dense
-                        outlined
                         filled
                     />
                 </QItemSection>
@@ -72,7 +71,6 @@ onBeforeMount(() => {
                         option-label="name"
                         use-input
                         dense
-                        outlined
                         filled
                     />
                 </QItemSection>
@@ -98,7 +96,6 @@ onBeforeMount(() => {
                         option-label="name"
                         use-input
                         dense
-                        outlined
                         filled
                     />
                 </QItemSection>
@@ -114,7 +111,6 @@ onBeforeMount(() => {
                         option-label="name"
                         use-input
                         dense
-                        outlined
                         filled
                     />
                 </QItemSection>
diff --git a/src/pages/Claim/ClaimFilter.vue b/src/pages/Claim/ClaimFilter.vue
index fb3e1b372..51460f7e4 100644
--- a/src/pages/Claim/ClaimFilter.vue
+++ b/src/pages/Claim/ClaimFilter.vue
@@ -44,7 +44,6 @@ const props = defineProps({
                     filled
                 />
                 <VnSelect
-                    outlined
                     dense
                     filled
                     :label="t('globals.params.departmentFk')"
@@ -61,7 +60,6 @@ const props = defineProps({
                     :use-like="false"
                     option-filter="firstName"
                     dense
-                    outlined
                     filled
                 />
                 <VnSelect
@@ -70,13 +68,11 @@ const props = defineProps({
                     :options="states"
                     option-label="description"
                     dense
-                    outlined
                     filled
                 />
                 <VnInputDate
                     v-model="params.created"
                     :label="t('claim.created')"
-                    outlined
                     filled
                     dense
                 />
@@ -86,7 +82,6 @@ const props = defineProps({
                     url="Items/withName"
                     :use-like="false"
                     sort-by="id DESC"
-                    outlined
                     filled
                     dense
                 />
@@ -98,14 +93,12 @@ const props = defineProps({
                     :use-like="false"
                     option-filter="firstName"
                     dense
-                    outlined
                     filled
                 />
                 <VnSelect
                     :label="t('claim.zone')"
                     v-model="params.zoneFk"
                     url="Zones"
-                    outlined
                     filled
                     dense
                 />
diff --git a/src/pages/Customer/CustomerFilter.vue b/src/pages/Customer/CustomerFilter.vue
index e130b8271..55a7f565e 100644
--- a/src/pages/Customer/CustomerFilter.vue
+++ b/src/pages/Customer/CustomerFilter.vue
@@ -65,7 +65,6 @@ const exprBuilder = (param, value) => {
             <QItem class="q-mb-sm">
                 <QItemSection>
                     <VnSelect
-                        outlined
                         dense
                         filled
                         :label="t('globals.params.departmentFk')"
@@ -89,7 +88,6 @@ const exprBuilder = (param, value) => {
                         map-options
                         hide-selected
                         dense
-                        outlined
                         filled
                         auto-load
                         :input-debounce="0"
@@ -132,7 +130,6 @@ const exprBuilder = (param, value) => {
                         map-options
                         hide-selected
                         dense
-                        outlined
                         filled
                         auto-load
                         sortBy="name ASC"
diff --git a/src/pages/Customer/Defaulter/CustomerDefaulterFilter.vue b/src/pages/Customer/Defaulter/CustomerDefaulterFilter.vue
index 482668dff..64e3baeb5 100644
--- a/src/pages/Customer/Defaulter/CustomerDefaulterFilter.vue
+++ b/src/pages/Customer/Defaulter/CustomerDefaulterFilter.vue
@@ -45,7 +45,6 @@ const departments = ref();
                     dense
                     option-label="name"
                     option-value="id"
-                    outlined
                     filled
                     emit-value
                     hide-selected
@@ -67,7 +66,6 @@ const departments = ref();
                         map-options
                         option-label="name"
                         option-value="id"
-                        outlined
                         filled
                         use-input
                         v-model="params.departmentFk"
@@ -91,7 +89,6 @@ const departments = ref();
                         map-options
                         option-label="name"
                         option-value="id"
-                        outlined
                         filled
                         use-input
                         v-model="params.countryFk"
@@ -137,7 +134,6 @@ const departments = ref();
                         map-options
                         option-label="name"
                         option-value="id"
-                        outlined
                         filled
                         use-input
                         v-model="params.workerFk"
diff --git a/src/pages/Entry/EntryFilter.vue b/src/pages/Entry/EntryFilter.vue
index 0511e61ef..43607e3d7 100644
--- a/src/pages/Entry/EntryFilter.vue
+++ b/src/pages/Entry/EntryFilter.vue
@@ -117,7 +117,6 @@ const entryFilterPanel = ref();
                         @update:model-value="searchFn()"
                         hide-selected
                         dense
-                        outlined
                         filled
                     />
                 </QItemSection>
@@ -149,7 +148,6 @@ const entryFilterPanel = ref();
                         :fields="['id', 'name']"
                         hide-selected
                         dense
-                        outlined
                         filled
                     />
                 </QItemSection>
@@ -173,7 +171,6 @@ const entryFilterPanel = ref();
                         :fields="['id', 'name']"
                         hide-selected
                         dense
-                        outlined
                         filled
                     />
                 </QItemSection>
@@ -188,7 +185,6 @@ const entryFilterPanel = ref();
                         :fields="['id', 'name']"
                         hide-selected
                         dense
-                        outlined
                         filled
                     >
                         <template #option="scope">
@@ -228,7 +224,6 @@ const entryFilterPanel = ref();
                         option-label="description"
                         hide-selected
                         dense
-                        outlined
                         filled
                     />
                 </QItemSection>
diff --git a/src/pages/Entry/EntryLatestBuysFilter.vue b/src/pages/Entry/EntryLatestBuysFilter.vue
index d66eb9cfd..6a548fa7f 100644
--- a/src/pages/Entry/EntryLatestBuysFilter.vue
+++ b/src/pages/Entry/EntryLatestBuysFilter.vue
@@ -39,7 +39,6 @@ const tagValues = ref([]);
                         :fields="['id', 'nickname']"
                         sort-by="nickname ASC"
                         dense
-                        outlined
                         filled
                         use-input
                         @update:model-value="searchFn()"
@@ -54,7 +53,6 @@ const tagValues = ref([]);
                         :fields="['id', 'name', 'nickname']"
                         sort-by="name ASC"
                         dense
-                        outlined
                         filled
                     />
                 </QItemSection>
@@ -120,7 +118,6 @@ const tagValues = ref([]);
                         :options="tagOptions"
                         option-label="name"
                         dense
-                        outlined
                         filled
                         :emit-value="false"
                         use-input
@@ -137,7 +134,6 @@ const tagValues = ref([]);
                         option-value="value"
                         option-label="value"
                         dense
-                        outlined
                         filled
                         emit-value
                         use-input
diff --git a/src/pages/InvoiceIn/InvoiceInFilter.vue b/src/pages/InvoiceIn/InvoiceInFilter.vue
index 224eb6bdd..2ad25454b 100644
--- a/src/pages/InvoiceIn/InvoiceInFilter.vue
+++ b/src/pages/InvoiceIn/InvoiceInFilter.vue
@@ -62,7 +62,7 @@ function handleDaysAgo(params, daysAgo) {
             </QItem>
             <QItem>
                 <QItemSection>
-                    <VnSelectSupplier v-model="params.supplierFk" dense outlined filled />
+                    <VnSelectSupplier v-model="params.supplierFk" dense filled />
                 </QItemSection>
             </QItem>
             <QItem>
diff --git a/src/pages/InvoiceIn/Serial/InvoiceInSerialFilter.vue b/src/pages/InvoiceIn/Serial/InvoiceInSerialFilter.vue
index ede7dfd1f..66b7fa433 100644
--- a/src/pages/InvoiceIn/Serial/InvoiceInSerialFilter.vue
+++ b/src/pages/InvoiceIn/Serial/InvoiceInSerialFilter.vue
@@ -25,7 +25,6 @@ const { t } = useI18n();
                     <VnInputNumber
                         v-model="params.daysAgo"
                         :label="t('params.daysAgo')"
-                        outlined
                         filled
                         dense
                     />
@@ -36,7 +35,6 @@ const { t } = useI18n();
                     <VnInput
                         v-model="params.serial"
                         :label="t('params.serial')"
-                        outlined
                         filled
                         dense
                     />
diff --git a/src/pages/InvoiceOut/InvoiceOutFilter.vue b/src/pages/InvoiceOut/InvoiceOutFilter.vue
index 20d2e5eee..93a343565 100644
--- a/src/pages/InvoiceOut/InvoiceOutFilter.vue
+++ b/src/pages/InvoiceOut/InvoiceOutFilter.vue
@@ -58,7 +58,6 @@ const states = ref();
                         :label="t('invoiceOut.params.min')"
                         dense
                         lazy-rules
-                        outlined
                         filled
                         type="number"
                         v-model.number="params.min"
@@ -69,7 +68,6 @@ const states = ref();
                         :label="t('invoiceOut.params.max')"
                         dense
                         lazy-rules
-                        outlined
                         filled
                         type="number"
                         v-model.number="params.max"
@@ -106,7 +104,6 @@ const states = ref();
             <QItem>
                 <QItemSection>
                     <VnSelect
-                        outlined
                         filled
                         :label="t('globals.params.departmentFk')"
                         v-model="params.departmentFk"
diff --git a/src/pages/InvoiceOut/InvoiceOutNegativeBasesFilter.vue b/src/pages/InvoiceOut/InvoiceOutNegativeBasesFilter.vue
index 321f48664..1e2f80ec2 100644
--- a/src/pages/InvoiceOut/InvoiceOutNegativeBasesFilter.vue
+++ b/src/pages/InvoiceOut/InvoiceOutNegativeBasesFilter.vue
@@ -53,7 +53,6 @@ const props = defineProps({
                         option-label="code"
                         option-value="code"
                         dense
-                        outlined
                         filled
                         @update:model-value="searchFn()"
                     >
@@ -80,7 +79,6 @@ const props = defineProps({
                         v-model="params.country"
                         option-label="name"
                         option-value="name"
-                        outlined
                         dense
                         filled
                         @update:model-value="searchFn()"
@@ -106,7 +104,6 @@ const props = defineProps({
                         url="Clients"
                         :label="t('globals.client')"
                         v-model="params.clientId"
-                        outlined
                         dense
                         filled
                         @update:model-value="searchFn()"
@@ -126,7 +123,6 @@ const props = defineProps({
             <QItem>
                 <QItemSection>
                     <VnSelect
-                        outlined
                         dense
                         filled
                         :label="t('globals.params.departmentFk')"
diff --git a/src/pages/Item/ItemFixedPriceFilter.vue b/src/pages/Item/ItemFixedPriceFilter.vue
index 97fbe528a..d68b966c6 100644
--- a/src/pages/Item/ItemFixedPriceFilter.vue
+++ b/src/pages/Item/ItemFixedPriceFilter.vue
@@ -44,7 +44,6 @@ const props = defineProps({
                         :label="t('params.warehouseFk')"
                         v-model="params.warehouseFk"
                         dense
-                        outlined
                         filled
                         use-input
                         @update:model-value="searchFn()"
diff --git a/src/pages/Item/ItemListFilter.vue b/src/pages/Item/ItemListFilter.vue
index b37435a84..f4500d5fa 100644
--- a/src/pages/Item/ItemListFilter.vue
+++ b/src/pages/Item/ItemListFilter.vue
@@ -193,7 +193,6 @@ onMounted(async () => {
                         option-label="name"
                         hide-selected
                         dense
-                        outlined
                         filled
                     />
                 </QItemSection>
@@ -209,7 +208,6 @@ onMounted(async () => {
                         option-label="name"
                         hide-selected
                         dense
-                        outlined
                         filled
                     >
                         <template #option="scope">
@@ -236,7 +234,6 @@ onMounted(async () => {
                         option-label="nickname"
                         hide-selected
                         dense
-                        outlined
                         filled
                     />
                 </QItemSection>
@@ -248,7 +245,6 @@ onMounted(async () => {
                         @update:model-value="searchFn()"
                         hide-selected
                         dense
-                        outlined
                         filled
                     />
                 </QItemSection>
@@ -278,7 +274,6 @@ onMounted(async () => {
                         :options="tagOptions"
                         option-label="name"
                         dense
-                        outlined
                         filled
                         :emit-value="false"
                         use-input
@@ -295,7 +290,6 @@ onMounted(async () => {
                         option-value="value"
                         option-label="value"
                         dense
-                        outlined
                         filled
                         emit-value
                         use-input
@@ -347,7 +341,6 @@ onMounted(async () => {
                         option-label="label"
                         option-value="label"
                         dense
-                        outlined
                         filled
                         :emit-value="false"
                         use-input
diff --git a/src/pages/Item/ItemRequestFilter.vue b/src/pages/Item/ItemRequestFilter.vue
index 88f53d1f8..68f36c566 100644
--- a/src/pages/Item/ItemRequestFilter.vue
+++ b/src/pages/Item/ItemRequestFilter.vue
@@ -110,7 +110,6 @@ onMounted(async () => {
                         option-label="nickname"
                         hide-selected
                         dense
-                        outlined
                         filled
                     />
                 </QItemSection>
@@ -135,7 +134,6 @@ onMounted(async () => {
                         option-label="name"
                         hide-selected
                         dense
-                        outlined
                         filled
                     />
                 </QItemSection>
@@ -149,7 +147,6 @@ onMounted(async () => {
                         :params="{ departmentCodes: ['VT'] }"
                         hide-selected
                         dense
-                        outlined
                         filled
                     />
                 </QItemSection>
@@ -183,7 +180,6 @@ onMounted(async () => {
                         option-label="name"
                         hide-selected
                         dense
-                        outlined
                         filled
                     />
                 </QItemSection>
diff --git a/src/pages/Monitor/Ticket/MonitorTicketFilter.vue b/src/pages/Monitor/Ticket/MonitorTicketFilter.vue
index 4d93f2de5..43af9e7c4 100644
--- a/src/pages/Monitor/Ticket/MonitorTicketFilter.vue
+++ b/src/pages/Monitor/Ticket/MonitorTicketFilter.vue
@@ -113,7 +113,6 @@ const getLocale = (label) => {
             <QItem>
                 <QItemSection>
                     <VnSelect
-                        outlined
                         dense
                         filled
                         :label="t('globals.params.departmentFk')"
@@ -133,7 +132,6 @@ const getLocale = (label) => {
             <QItem>
                 <QItemSection>
                     <VnSelect
-                        outlined
                         dense
                         filled
                         :label="t('params.agencyModeFk')"
@@ -145,7 +143,6 @@ const getLocale = (label) => {
             <QItem>
                 <QItemSection>
                     <VnSelect
-                        outlined
                         dense
                         filled
                         :label="t('globals.params.stateFk')"
@@ -157,7 +154,6 @@ const getLocale = (label) => {
             <QItem>
                 <QItemSection>
                     <VnSelect
-                        outlined
                         dense
                         filled
                         :label="t('params.groupedStates')"
@@ -170,7 +166,6 @@ const getLocale = (label) => {
             <QItem>
                 <QItemSection>
                     <VnSelect
-                        outlined
                         dense
                         filled
                         :label="t('globals.params.warehouseFk')"
@@ -182,7 +177,6 @@ const getLocale = (label) => {
             <QItem>
                 <QItemSection>
                     <VnSelect
-                        outlined
                         dense
                         filled
                         :label="t('globals.params.countryFk')"
@@ -194,7 +188,6 @@ const getLocale = (label) => {
             <QItem>
                 <QItemSection>
                     <VnSelect
-                        outlined
                         dense
                         filled
                         :label="t('globals.params.provinceFk')"
@@ -206,7 +199,6 @@ const getLocale = (label) => {
             <QItem>
                 <QItemSection>
                     <VnSelect
-                        outlined
                         dense
                         filled
                         :label="t('globals.params.departmentFk')"
@@ -220,7 +212,6 @@ const getLocale = (label) => {
             <QItem>
                 <QItemSection>
                     <VnSelect
-                        outlined
                         dense
                         filled
                         :label="t('globals.params.packing')"
diff --git a/src/pages/Order/Card/CatalogFilterValueDialog.vue b/src/pages/Order/Card/CatalogFilterValueDialog.vue
index 6c2684c27..e9a556270 100644
--- a/src/pages/Order/Card/CatalogFilterValueDialog.vue
+++ b/src/pages/Order/Card/CatalogFilterValueDialog.vue
@@ -57,7 +57,6 @@ const getSelectedTagValues = async (tag) => {
                 option-value="id"
                 option-label="name"
                 dense
-                outlined
                 class="q-mb-md"
                 filled
                 :emit-value="false"
@@ -79,7 +78,6 @@ const getSelectedTagValues = async (tag) => {
                         option-value="value"
                         option-label="value"
                         dense
-                        outlined
                         filled
                         emit-value
                         use-input
@@ -92,14 +90,13 @@ const getSelectedTagValues = async (tag) => {
                         v-model="value.value"
                         :label="t('components.itemsFilterPanel.value')"
                         :disable="!value"
-                        is-outlined
+                        is-
                         class="col"
                         data-cy="catalogFilterValueDialogValueInput"
                     />
                     <QBtn
                         icon="delete"
                         size="md"
-                        outlined
                         dense
                         filled
                         flat
diff --git a/src/pages/Order/Card/OrderCatalogFilter.vue b/src/pages/Order/Card/OrderCatalogFilter.vue
index 8b8a563d8..cb380c48f 100644
--- a/src/pages/Order/Card/OrderCatalogFilter.vue
+++ b/src/pages/Order/Card/OrderCatalogFilter.vue
@@ -221,7 +221,6 @@ function addOrder(value, field, params) {
                         option-value="id"
                         option-label="name"
                         dense
-                        outlined
                         filled
                         emit-value
                         use-input
@@ -251,7 +250,6 @@ function addOrder(value, field, params) {
                         v-model="orderBySelected"
                         :options="orderByList"
                         dense
-                        outlined
                         filled
                         @update:model-value="(value) => addOrder(value, 'field', params)"
                     />
@@ -264,7 +262,6 @@ function addOrder(value, field, params) {
                         v-model="orderWaySelected"
                         :options="orderWayList"
                         dense
-                        outlined
                         filled
                         @update:model-value="(value) => addOrder(value, 'way', params)"
                     />
@@ -275,7 +272,6 @@ function addOrder(value, field, params) {
                 <VnInput
                     :label="t('components.itemsFilterPanel.value')"
                     dense
-                    outlined
                     filled
                     :is-clearable="false"
                     v-model="searchByTag"
diff --git a/src/pages/Order/Card/OrderFilter.vue b/src/pages/Order/Card/OrderFilter.vue
index 127601d04..609a1215a 100644
--- a/src/pages/Order/Card/OrderFilter.vue
+++ b/src/pages/Order/Card/OrderFilter.vue
@@ -49,7 +49,6 @@ const sourceList = ref([]);
                     v-model="params.clientFk"
                     lazy-rules
                     dense
-                    outlined
                     filled
                 />
                 <VnSelect
@@ -58,11 +57,9 @@ const sourceList = ref([]);
                     :options="agencyList"
                     :input-debounce="0"
                     dense
-                    outlined
                     filled
                 />
                 <VnSelect
-                    outlined
                     dense
                     filled
                     :label="t('globals.params.departmentFk')"
@@ -75,16 +72,9 @@ const sourceList = ref([]);
                     v-model="params.from"
                     :label="t('fromLanded')"
                     dense
-                    outlined
-                    filled
-                />
-                <VnInputDate
-                    v-model="params.to"
-                    :label="t('toLanded')"
-                    dense
-                    outlined
                     filled
                 />
+                <VnInputDate v-model="params.to" :label="t('toLanded')" dense filled />
                 <VnInput
                     :label="t('orderId')"
                     v-model="params.orderFk"
@@ -98,7 +88,6 @@ const sourceList = ref([]);
                     option-label="value"
                     option-value="value"
                     dense
-                    outlined
                     filled
                     :input-debounce="0"
                 />
diff --git a/src/pages/Route/Card/RouteAutonomousFilter.vue b/src/pages/Route/Card/RouteAutonomousFilter.vue
index 96298f515..fe631a0be 100644
--- a/src/pages/Route/Card/RouteAutonomousFilter.vue
+++ b/src/pages/Route/Card/RouteAutonomousFilter.vue
@@ -83,7 +83,6 @@ const exprBuilder = (param, value) => {
                             option-value="id"
                             option-label="name"
                             dense
-                            outlined
                             filled
                             emit-value
                             map-options
@@ -102,7 +101,6 @@ const exprBuilder = (param, value) => {
                             option-value="id"
                             option-label="name"
                             dense
-                            outlined
                             filled
                             emit-value
                             map-options
@@ -123,7 +121,6 @@ const exprBuilder = (param, value) => {
                             option-value="name"
                             option-label="name"
                             dense
-                            outlined
                             filled
                             emit-value
                             map-options
diff --git a/src/pages/Route/Card/RouteFilter.vue b/src/pages/Route/Card/RouteFilter.vue
index 2fa04559c..f830b83e2 100644
--- a/src/pages/Route/Card/RouteFilter.vue
+++ b/src/pages/Route/Card/RouteFilter.vue
@@ -36,7 +36,6 @@ const emit = defineEmits(['search']);
                         :label="t('globals.worker')"
                         v-model="params.workerFk"
                         dense
-                        outlined
                         filled
                         :input-debounce="0"
                     />
@@ -52,7 +51,6 @@ const emit = defineEmits(['search']);
                         option-value="id"
                         option-label="name"
                         dense
-                        outlined
                         filled
                         :input-debounce="0"
                     />
@@ -107,7 +105,6 @@ const emit = defineEmits(['search']);
                         option-label="numberPlate"
                         option-filter-value="numberPlate"
                         dense
-                        outlined
                         filled
                         :input-debounce="0"
                     />
@@ -127,7 +124,6 @@ const emit = defineEmits(['search']);
                         option-value="id"
                         option-label="name"
                         dense
-                        outlined
                         filled
                         :input-debounce="0"
                     />
diff --git a/src/pages/Route/Roadmap/RoadmapFilter.vue b/src/pages/Route/Roadmap/RoadmapFilter.vue
index 15e7e64e4..9acbfb740 100644
--- a/src/pages/Route/Roadmap/RoadmapFilter.vue
+++ b/src/pages/Route/Roadmap/RoadmapFilter.vue
@@ -66,7 +66,6 @@ const emit = defineEmits(['search']);
                         :fields="['id', 'nickname']"
                         v-model="params.supplierFk"
                         dense
-                        outlined
                         filled
                         emit-value
                         map-options
diff --git a/src/pages/Shelving/Card/ShelvingFilter.vue b/src/pages/Shelving/Card/ShelvingFilter.vue
index f91622cfd..35657a972 100644
--- a/src/pages/Shelving/Card/ShelvingFilter.vue
+++ b/src/pages/Shelving/Card/ShelvingFilter.vue
@@ -39,7 +39,6 @@ const emit = defineEmits(['search']);
                         option-label="code"
                         :filter-options="['id', 'code']"
                         dense
-                        outlined
                         filled
                         sort-by="code ASC"
                     />
@@ -47,7 +46,7 @@ const emit = defineEmits(['search']);
             </QItem>
             <QItem class="q-mb-sm">
                 <QItemSection>
-                    <VnSelectWorker v-model="params.userFk" outlined filled />
+                    <VnSelectWorker v-model="params.userFk" filled />
                 </QItemSection>
             </QItem>
             <QItem class="q-mb-md">
diff --git a/src/pages/Shelving/Parking/ParkingFilter.vue b/src/pages/Shelving/Parking/ParkingFilter.vue
index 509b08f4c..59cb49459 100644
--- a/src/pages/Shelving/Parking/ParkingFilter.vue
+++ b/src/pages/Shelving/Parking/ParkingFilter.vue
@@ -47,7 +47,6 @@ const emit = defineEmits(['search']);
                         option-label="description"
                         :label="t('params.sectorFk')"
                         dense
-                        outlined
                         filled
                         :options="sectors"
                         use-input
diff --git a/src/pages/Supplier/Card/SupplierBalanceFilter.vue b/src/pages/Supplier/Card/SupplierBalanceFilter.vue
index b7c5555fa..c727688ad 100644
--- a/src/pages/Supplier/Card/SupplierBalanceFilter.vue
+++ b/src/pages/Supplier/Card/SupplierBalanceFilter.vue
@@ -47,7 +47,6 @@ defineProps({
                         :include="{ relation: 'accountingType' }"
                         sort-by="id"
                         dense
-                        outlined
                         filled
                     >
                         <template #option="scope">
@@ -74,7 +73,6 @@ defineProps({
                         option-label="name"
                         hide-selected
                         dense
-                        outlined
                         filled
                     />
                 </QItemSection>
diff --git a/src/pages/Supplier/Card/SupplierConsumptionFilter.vue b/src/pages/Supplier/Card/SupplierConsumptionFilter.vue
index 4de0c0039..e21e37eb3 100644
--- a/src/pages/Supplier/Card/SupplierConsumptionFilter.vue
+++ b/src/pages/Supplier/Card/SupplierConsumptionFilter.vue
@@ -46,7 +46,6 @@ defineProps({
                         option-label="nickname"
                         hide-selected
                         dense
-                        outlined
                         filled
                     />
                 </QItemSection>
@@ -65,7 +64,6 @@ defineProps({
                         option-label="name"
                         hide-selected
                         dense
-                        outlined
                         filled
                     >
                         <template #option="scope">
@@ -94,7 +92,6 @@ defineProps({
                         option-label="name"
                         hide-selected
                         dense
-                        outlined
                         filled
                     />
                 </QItemSection>
diff --git a/src/pages/Ticket/Negative/TicketLackFilter.vue b/src/pages/Ticket/Negative/TicketLackFilter.vue
index e5b34dcf6..73d53b247 100644
--- a/src/pages/Ticket/Negative/TicketLackFilter.vue
+++ b/src/pages/Ticket/Negative/TicketLackFilter.vue
@@ -133,7 +133,6 @@ const setUserParams = (params) => {
                             option-label="name"
                             hide-selected
                             dense
-                            outlined
                             filled
                         /> </QItemSection
                     ><QItemSection v-else>
@@ -151,7 +150,6 @@ const setUserParams = (params) => {
                             option-label="name"
                             hide-selected
                             dense
-                            outlined
                             filled
                         >
                             <template #option="scope">
diff --git a/src/pages/Ticket/TicketAdvanceFilter.vue b/src/pages/Ticket/TicketAdvanceFilter.vue
index c59db53f2..f065eaf2e 100644
--- a/src/pages/Ticket/TicketAdvanceFilter.vue
+++ b/src/pages/Ticket/TicketAdvanceFilter.vue
@@ -95,7 +95,6 @@ onMounted(async () => await getItemPackingTypes());
                         :info="t('iptInfo')"
                         @update:model-value="searchFn()"
                         dense
-                        outlined
                         filled
                         :use-like="false"
                     >
@@ -113,7 +112,6 @@ onMounted(async () => await getItemPackingTypes());
                         :info="t('iptInfo')"
                         @update:model-value="searchFn()"
                         dense
-                        outlined
                         filled
                         :use-like="false"
                     >
@@ -147,7 +145,6 @@ onMounted(async () => await getItemPackingTypes());
                         url="Departments"
                         :fields="['id', 'name']"
                         dense
-                        outlined
                         filled
                     />
                 </QItemSection>
@@ -162,7 +159,6 @@ onMounted(async () => await getItemPackingTypes());
                         option-label="name"
                         @update:model-value="searchFn()"
                         dense
-                        outlined
                         filled
                     >
                     </VnSelect>
diff --git a/src/pages/Ticket/TicketFilter.vue b/src/pages/Ticket/TicketFilter.vue
index ccc42f9be..b763ef970 100644
--- a/src/pages/Ticket/TicketFilter.vue
+++ b/src/pages/Ticket/TicketFilter.vue
@@ -90,7 +90,6 @@ const getGroupedStates = (data) => {
             <QItem>
                 <QItemSection>
                     <VnSelect
-                        outlined
                         dense
                         filled
                         :label="t('globals.params.departmentFk')"
@@ -117,7 +116,6 @@ const getGroupedStates = (data) => {
                         map-options
                         use-input
                         dense
-                        outlined
                         filled
                     />
                 </QItemSection>
@@ -138,7 +136,6 @@ const getGroupedStates = (data) => {
                         map-options
                         use-input
                         dense
-                        outlined
                         filled
                         sort-by="name ASC"
                     />
@@ -225,7 +222,6 @@ const getGroupedStates = (data) => {
                         map-options
                         use-input
                         dense
-                        outlined
                         filled
                     />
                 </QItemSection>
@@ -244,7 +240,6 @@ const getGroupedStates = (data) => {
                         map-options
                         use-input
                         dense
-                        outlined
                         filled
                     />
                 </QItemSection>
@@ -265,7 +260,6 @@ const getGroupedStates = (data) => {
                         map-options
                         use-input
                         dense
-                        outlined
                         filled
                     />
                 </QItemSection>
diff --git a/src/pages/Ticket/TicketFutureFilter.vue b/src/pages/Ticket/TicketFutureFilter.vue
index 92b6bfd62..033b47f72 100644
--- a/src/pages/Ticket/TicketFutureFilter.vue
+++ b/src/pages/Ticket/TicketFutureFilter.vue
@@ -115,7 +115,6 @@ onMounted(async () => {
                         :info="t('iptInfo')"
                         @update:model-value="searchFn()"
                         dense
-                        outlined
                         filled
                     >
                     </VnSelect>
@@ -132,7 +131,6 @@ onMounted(async () => {
                         :info="t('iptInfo')"
                         @update:model-value="searchFn()"
                         dense
-                        outlined
                         filled
                     >
                     </VnSelect>
@@ -148,7 +146,6 @@ onMounted(async () => {
                         option-label="name"
                         @update:model-value="searchFn()"
                         dense
-                        outlined
                         filled
                     >
                     </VnSelect>
@@ -164,7 +161,6 @@ onMounted(async () => {
                         option-label="name"
                         @update:model-value="searchFn()"
                         dense
-                        outlined
                         filled
                     >
                     </VnSelect>
@@ -191,7 +187,6 @@ onMounted(async () => {
                         option-label="name"
                         @update:model-value="searchFn()"
                         dense
-                        outlined
                         filled
                     >
                     </VnSelect>
diff --git a/src/pages/Travel/ExtraCommunityFilter.vue b/src/pages/Travel/ExtraCommunityFilter.vue
index acb8c4e72..76ffdba20 100644
--- a/src/pages/Travel/ExtraCommunityFilter.vue
+++ b/src/pages/Travel/ExtraCommunityFilter.vue
@@ -106,7 +106,6 @@ warehouses();
                         type="number"
                         :label="t('extraCommunity.filter.totalEntries')"
                         dense
-                        outlined
                         filled
                         min="0"
                         class="input-number"
@@ -141,7 +140,6 @@ warehouses();
                         option-label="name"
                         hide-selected
                         dense
-                        outlined
                         filled
                     />
                 </QItemSection>
@@ -176,7 +174,6 @@ warehouses();
                         option-label="name"
                         hide-selected
                         dense
-                        outlined
                         filled
                     />
                 </QItemSection>
@@ -191,7 +188,6 @@ warehouses();
                         option-label="name"
                         hide-selected
                         dense
-                        outlined
                         filled
                     />
                 </QItemSection>
@@ -206,7 +202,6 @@ warehouses();
                         option-label="name"
                         hide-selected
                         dense
-                        outlined
                         filled
                     />
                 </QItemSection>
@@ -218,7 +213,6 @@ warehouses();
                         v-model="params.cargoSupplierFk"
                         hide-selected
                         dense
-                        outlined
                         filled
                     />
                 </QItemSection>
@@ -229,7 +223,6 @@ warehouses();
                         v-model="params.entrySupplierFk"
                         hide-selected
                         dense
-                        outlined
                         filled
                     />
                 </QItemSection>
@@ -245,7 +238,6 @@ warehouses();
                         :filter-options="['code', 'name']"
                         hide-selected
                         dense
-                        outlined
                         filled
                     />
                 </QItemSection>
diff --git a/src/pages/Travel/TravelFilter.vue b/src/pages/Travel/TravelFilter.vue
index c36ba2ecc..a26cc0ec0 100644
--- a/src/pages/Travel/TravelFilter.vue
+++ b/src/pages/Travel/TravelFilter.vue
@@ -51,7 +51,6 @@ defineExpose({ states });
                     :use-like="false"
                     option-filter="name"
                     dense
-                    outlined
                     filled
                 />
                 <VnSelect
@@ -64,21 +63,18 @@ defineExpose({ states });
                     option-label="name"
                     option-filter="name"
                     dense
-                    outlined
                     filled
                 />
                 <VnInputDate
                     :label="t('travel.shipped')"
                     v-model="params.shipped"
                     @update:model-value="searchFn()"
-                    outlined
                     filled
                 />
                 <VnInputTime
                     v-model="params.shipmentHour"
                     @update:model-value="searchFn()"
                     :label="t('travel.shipmentHour')"
-                    outlined
                     filled
                     dense
                 />
@@ -92,7 +88,6 @@ defineExpose({ states });
                     option-label="name"
                     option-filter="name"
                     dense
-                    outlined
                     filled
                 />
                 <VnInputDate
@@ -100,14 +95,12 @@ defineExpose({ states });
                     v-model="params.landed"
                     @update:model-value="searchFn()"
                     dense
-                    outlined
                     filled
                 />
                 <VnInputTime
                     v-model="params.landingHour"
                     @update:model-value="searchFn()"
                     :label="t('travel.landingHour')"
-                    outlined
                     filled
                     dense
                 />
diff --git a/src/pages/Worker/Card/WorkerCalendarFilter.vue b/src/pages/Worker/Card/WorkerCalendarFilter.vue
index 47ca04fae..f0e2d758a 100644
--- a/src/pages/Worker/Card/WorkerCalendarFilter.vue
+++ b/src/pages/Worker/Card/WorkerCalendarFilter.vue
@@ -174,7 +174,6 @@ const yearList = ref(generateYears());
                     v-model="selectedYear"
                     :options="yearList"
                     dense
-                    outlined
                     filled
                     use-input
                     :is-clearable="false"
@@ -188,7 +187,6 @@ const yearList = ref(generateYears());
                     option-value="businessFk"
                     option-label="businessFk"
                     dense
-                    outlined
                     filled
                     use-input
                     :is-clearable="false"
diff --git a/src/pages/Worker/WorkerFilter.vue b/src/pages/Worker/WorkerFilter.vue
index c24797901..44dfd32b4 100644
--- a/src/pages/Worker/WorkerFilter.vue
+++ b/src/pages/Worker/WorkerFilter.vue
@@ -67,7 +67,6 @@ const getLocale = (label) => {
                         emit-value
                         map-options
                         dense
-                        outlined
                         filled
                     />
                 </QItemSection>
diff --git a/src/pages/Zone/ZoneDeliveryPanel.vue b/src/pages/Zone/ZoneDeliveryPanel.vue
index b49e3e1b4..fc5c04b41 100644
--- a/src/pages/Zone/ZoneDeliveryPanel.vue
+++ b/src/pages/Zone/ZoneDeliveryPanel.vue
@@ -95,7 +95,6 @@ watch(
                 :filter-options="['code']"
                 hide-selected
                 dense
-                outlined
                 filled
                 map-key="geoFk"
                 data-cy="ZoneDeliveryDaysPostcodeSelect"
@@ -128,7 +127,6 @@ watch(
                 option-label="name"
                 hide-selected
                 dense
-                outlined
                 filled
                 data-cy="ZoneDeliveryDaysAgencySelect"
             />
@@ -144,7 +142,6 @@ watch(
                 option-label="name"
                 hide-selected
                 dense
-                outlined
                 rounded
             />
         </div>

From 7e74ab58da553e24a46586a6fe86fde41bd71f85 Mon Sep 17 00:00:00 2001
From: jtubau <jtubau@verdnatura.es>
Date: Mon, 17 Mar 2025 12:03:26 +0100
Subject: [PATCH 16/44] fix: refs #8621 intermittent test

---
 src/pages/Route/Cmr/CmrList.vue               |  2 +-
 .../integration/route/cmr/cmrList.spec.js     | 66 +++++--------------
 test/cypress/support/commands.js              |  8 +++
 3 files changed, 24 insertions(+), 52 deletions(-)

diff --git a/src/pages/Route/Cmr/CmrList.vue b/src/pages/Route/Cmr/CmrList.vue
index d0683e481..170f73bc0 100644
--- a/src/pages/Route/Cmr/CmrList.vue
+++ b/src/pages/Route/Cmr/CmrList.vue
@@ -28,7 +28,6 @@ const userParams = {
     shipped: null,
 };
 
-
 const columns = computed(() => [
     {
         align: 'left',
@@ -175,6 +174,7 @@ function downloadPdfs() {
         :data-key
         url="Cmrs/filter"
         :columns="columns"
+        :order="['shipped DESC', 'cmrFk ASC']"
         :user-params="userParams"
         default-mode="table"
         v-model:selected="selectedRows"
diff --git a/test/cypress/integration/route/cmr/cmrList.spec.js b/test/cypress/integration/route/cmr/cmrList.spec.js
index 8d9299ce7..b3561708d 100644
--- a/test/cypress/integration/route/cmr/cmrList.spec.js
+++ b/test/cypress/integration/route/cmr/cmrList.spec.js
@@ -19,7 +19,7 @@ describe('Cmr list', () => {
     };
 
     const data = {
-        ticket: '2',
+        ticket: '1',
         client: 'Bruce Wayne',
     };
 
@@ -52,76 +52,40 @@ describe('Cmr list', () => {
     describe('Ticket pop-ups', () => {
         it('Should redirect to the ticket summary from the ticket descriptor pop-up', () => {
             cy.get(selectors.ticket).click();
-            cy.get(selectors.descriptorId)
-                .invoke('text')
-                .then((text) => {
-                    expect(text).to.include(data.ticket);
-                });
+            cy.containContent(selectors.descriptorId, data.ticket);
             cy.get(selectors.descriptorGoToSummaryBtn).click();
-            cy.get(selectors.summaryTitle)
-                .invoke('text')
-                .then((text) => {
-                    expect(text).to.include(data.client);
-                });
+            cy.url().should('include', '/ticket/1/summary');
+            cy.containContent(selectors.summaryTitle, data.client);
         });
 
         it('Should redirect to the ticket summary from summary pop-up from the ticket descriptor pop-up', () => {
             cy.get(selectors.ticket).click();
-            cy.get(selectors.descriptorId)
-                .invoke('text')
-                .then((text) => {
-                    expect(text).to.include(data.ticket);
-                });
+            cy.containContent(selectors.descriptorId, data.ticket);
             cy.get(selectors.descriptorOpenSummaryBtn).click();
-            cy.get(selectors.summaryTitle)
-                .invoke('text')
-                .then((text) => {
-                    expect(text).to.include(data.client);
-                });
+            cy.containContent(selectors.summaryTitle, data.client);
             cy.get(selectors.summaryGoToSummaryBtn).click();
-            cy.get(selectors.summaryTitle)
-                .invoke('text')
-                .then((text) => {
-                    expect(text).to.include(data.client);
-                });
+            cy.url().should('include', '/ticket/1/summary');
+            cy.containContent(selectors.summaryTitle, data.client);
         });
     });
 
     describe('Client pop-ups', () => {
         it('Should redirect to the client summary from the client descriptor pop-up', () => {
             cy.get(selectors.client).click();
-            cy.get(selectors.descriptorTitle)
-                .invoke('text')
-                .then((text) => {
-                    expect(text).to.include(data.client);
-                });
+            cy.containContent(selectors.descriptorTitle, data.client);
             cy.get(selectors.descriptorGoToSummaryBtn).click();
-            cy.get(selectors.summaryTitle)
-                .invoke('text')
-                .then((text) => {
-                    expect(text).to.include(data.client);
-                });
+            cy.url().should('include', '/customer/1101/summary');
+            cy.containContent(selectors.summaryTitle, data.client);
         });
 
         it('Should redirect to the client summary from summary pop-up from the client descriptor pop-up', () => {
             cy.get(selectors.client).click();
-            cy.get(selectors.descriptorTitle)
-                .invoke('text')
-                .then((text) => {
-                    expect(text).to.include(data.client);
-                });
+            cy.containContent(selectors.descriptorTitle, data.client);
             cy.get(selectors.descriptorOpenSummaryBtn).click();
-            cy.get(selectors.summaryTitle)
-                .invoke('text')
-                .then((text) => {
-                    expect(text).to.include(data.client);
-                });
+            cy.containContent(selectors.summaryTitle, data.client);
             cy.get(selectors.summaryGoToSummaryBtn).click();
-            cy.get(selectors.summaryTitle)
-                .invoke('text')
-                .then((text) => {
-                    expect(text).to.include(data.client);
-                });
+            cy.url().should('include', '/customer/1101/summary');
+            cy.containContent(selectors.summaryTitle, data.client);
         });
     });
 });
diff --git a/test/cypress/support/commands.js b/test/cypress/support/commands.js
index 105d021ad..7d9f76349 100755
--- a/test/cypress/support/commands.js
+++ b/test/cypress/support/commands.js
@@ -322,6 +322,14 @@ Cypress.Commands.add('validateContent', (selector, expectedValue) => {
     cy.get(selector).should('have.text', expectedValue);
 });
 
+Cypress.Commands.add('containContent', (selector, expectedValue) => {
+    cy.get(selector)
+        .invoke('text')
+        .then((text) => {
+            expect(text).to.include(expectedValue);
+        });
+});
+
 Cypress.Commands.add('openActionDescriptor', (opt) => {
     cy.openActionsDescriptor();
     const listItem = '[role="menu"] .q-list .q-item';

From 93b5be7628a8aa334e072ed8b8d7a4d1ed17a18f Mon Sep 17 00:00:00 2001
From: jtubau <jtubau@verdnatura.es>
Date: Mon, 17 Mar 2025 14:09:14 +0100
Subject: [PATCH 17/44] test: refs #8621 ensure elements are visible before
 interaction in cmrList tests

---
 .../integration/route/cmr/cmrList.spec.js     | 24 +++++++++----------
 test/cypress/support/commands.js              |  1 +
 2 files changed, 13 insertions(+), 12 deletions(-)

diff --git a/test/cypress/integration/route/cmr/cmrList.spec.js b/test/cypress/integration/route/cmr/cmrList.spec.js
index b3561708d..d33508e3a 100644
--- a/test/cypress/integration/route/cmr/cmrList.spec.js
+++ b/test/cypress/integration/route/cmr/cmrList.spec.js
@@ -33,8 +33,8 @@ describe('Cmr list', () => {
 
     it('Should download selected cmr', () => {
         const downloadsFolder = Cypress.config('downloadsFolder');
-        cy.get(selectors.lastRowSelectCheckBox).click();
-        cy.get(selectors.downloadBtn).click();
+        cy.get(selectors.lastRowSelectCheckBox).should('be.visible').click();
+        cy.get(selectors.downloadBtn).should('be.visible').click();
         cy.wait(3000);
 
         const fileName = 'cmrs.zip';
@@ -51,19 +51,19 @@ describe('Cmr list', () => {
 
     describe('Ticket pop-ups', () => {
         it('Should redirect to the ticket summary from the ticket descriptor pop-up', () => {
-            cy.get(selectors.ticket).click();
+            cy.get(selectors.ticket).should('be.visible').click();
             cy.containContent(selectors.descriptorId, data.ticket);
-            cy.get(selectors.descriptorGoToSummaryBtn).click();
+            cy.get(selectors.descriptorGoToSummaryBtn).should('be.visible').click();
             cy.url().should('include', '/ticket/1/summary');
             cy.containContent(selectors.summaryTitle, data.client);
         });
 
         it('Should redirect to the ticket summary from summary pop-up from the ticket descriptor pop-up', () => {
-            cy.get(selectors.ticket).click();
+            cy.get(selectors.ticket).should('be.visible').click();
             cy.containContent(selectors.descriptorId, data.ticket);
-            cy.get(selectors.descriptorOpenSummaryBtn).click();
+            cy.get(selectors.descriptorOpenSummaryBtn).should('be.visible').click();
             cy.containContent(selectors.summaryTitle, data.client);
-            cy.get(selectors.summaryGoToSummaryBtn).click();
+            cy.get(selectors.summaryGoToSummaryBtn).should('be.visible').click();
             cy.url().should('include', '/ticket/1/summary');
             cy.containContent(selectors.summaryTitle, data.client);
         });
@@ -71,19 +71,19 @@ describe('Cmr list', () => {
 
     describe('Client pop-ups', () => {
         it('Should redirect to the client summary from the client descriptor pop-up', () => {
-            cy.get(selectors.client).click();
+            cy.get(selectors.client).should('be.visible').click();
             cy.containContent(selectors.descriptorTitle, data.client);
-            cy.get(selectors.descriptorGoToSummaryBtn).click();
+            cy.get(selectors.descriptorGoToSummaryBtn).should('be.visible').click();
             cy.url().should('include', '/customer/1101/summary');
             cy.containContent(selectors.summaryTitle, data.client);
         });
 
         it('Should redirect to the client summary from summary pop-up from the client descriptor pop-up', () => {
-            cy.get(selectors.client).click();
+            cy.get(selectors.client).should('be.visible').click();
             cy.containContent(selectors.descriptorTitle, data.client);
-            cy.get(selectors.descriptorOpenSummaryBtn).click();
+            cy.get(selectors.descriptorOpenSummaryBtn).should('be.visible').click();
             cy.containContent(selectors.summaryTitle, data.client);
-            cy.get(selectors.summaryGoToSummaryBtn).click();
+            cy.get(selectors.summaryGoToSummaryBtn).should('be.visible').click();
             cy.url().should('include', '/customer/1101/summary');
             cy.containContent(selectors.summaryTitle, data.client);
         });
diff --git a/test/cypress/support/commands.js b/test/cypress/support/commands.js
index 90e7e08df..c8fccbd5d 100755
--- a/test/cypress/support/commands.js
+++ b/test/cypress/support/commands.js
@@ -324,6 +324,7 @@ Cypress.Commands.add('validateContent', (selector, expectedValue) => {
 
 Cypress.Commands.add('containContent', (selector, expectedValue) => {
     cy.get(selector)
+        .should('be.visible')
         .invoke('text')
         .then((text) => {
             expect(text).to.include(expectedValue);

From b6706218fe104434af71b145db065998e908a2a6 Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Tue, 18 Mar 2025 14:46:51 +0100
Subject: [PATCH 18/44] feat: refs #8463 add data attributes for summary
 buttons in VnDescriptor component

---
 src/components/ui/VnDescriptor.vue | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/src/components/ui/VnDescriptor.vue b/src/components/ui/VnDescriptor.vue
index 515e09f3a..03432d745 100644
--- a/src/components/ui/VnDescriptor.vue
+++ b/src/components/ui/VnDescriptor.vue
@@ -127,6 +127,7 @@ const toModule = computed(() => {
                     color="white"
                     class="link"
                     v-if="summary"
+                    data-cy="openSummaryBtn"
                 >
                     <QTooltip>
                         {{ t('components.smartCard.openSummary') }}
@@ -141,6 +142,7 @@ const toModule = computed(() => {
                         icon="launch"
                         round
                         size="md"
+                        data-cy="goToSummaryBtn"
                     >
                         <QTooltip>
                             {{ t('components.cardDescriptor.summary') }}

From ab697c951d83d2da591a4193719c5a3fa123e2a2 Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Fri, 21 Mar 2025 10:36:05 +0100
Subject: [PATCH 19/44] feat(WorkerPDA): refs #5926 send to docuware

---
 src/components/VnTable/VnTable.vue            |   1 +
 src/composables/downloadFile.js               |  20 +-
 src/i18n/locale/en.yml                        |   1 +
 src/i18n/locale/es.yml                        |   1 +
 src/pages/Worker/Card/WorkerPda.vue           | 408 ++++++++++++------
 .../integration/worker/workerPda.spec.js      |  94 +++-
 6 files changed, 365 insertions(+), 160 deletions(-)

diff --git a/src/components/VnTable/VnTable.vue b/src/components/VnTable/VnTable.vue
index c64217198..e8dd1b526 100644
--- a/src/components/VnTable/VnTable.vue
+++ b/src/components/VnTable/VnTable.vue
@@ -633,6 +633,7 @@ const rowCtrlClickFunction = computed(() => {
                 :data-key="$attrs['data-key']"
                 :columns="columns"
                 :redirect="redirect"
+                v-bind="$attrs?.['table-filter']"
             >
                 <template
                     v-for="(_, slotName) in $slots"
diff --git a/src/composables/downloadFile.js b/src/composables/downloadFile.js
index 4588265a2..302836e09 100644
--- a/src/composables/downloadFile.js
+++ b/src/composables/downloadFile.js
@@ -5,20 +5,30 @@ import { exportFile } from 'quasar';
 
 const { getTokenMultimedia } = useSession();
 const token = getTokenMultimedia();
+const appUrl = (await getUrl('', 'lilium')).replace('/#/', '');
 
 export async function downloadFile(id, model = 'dms', urlPath = '/downloadFile', url) {
-    const appUrl = (await getUrl('', 'lilium')).replace('/#/', '');
     const response = await axios.get(
         url ?? `${appUrl}/api/${model}/${id}${urlPath}?access_token=${token}`,
         { responseType: 'blob' }
     );
 
+    download(response);
+}
+
+export async function downloadDocuware(url, params) {
+    const response = await axios.get(`${appUrl}/api/` + url, {
+        responseType: 'blob',
+        params,
+    });
+
+    download(response);
+}
+
+function download(response) {
     const contentDisposition = response.headers['content-disposition'];
     const matches = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/.exec(contentDisposition);
-    const filename =
-        matches != null && matches[1]
-            ? matches[1].replace(/['"]/g, '')
-            : 'downloaded-file';
+    const filename = matches?.[1] ? matches[1].replace(/['"]/g, '') : 'downloaded-file';
 
     exportFile(filename, response.data);
 }
diff --git a/src/i18n/locale/en.yml b/src/i18n/locale/en.yml
index 6be11b5ed..7374cda68 100644
--- a/src/i18n/locale/en.yml
+++ b/src/i18n/locale/en.yml
@@ -646,6 +646,7 @@ worker:
         model: Model
         serialNumber: Serial number
         removePDA: Deallocate PDA
+        sendToTablet: Send to tablet
     create:
         lastName: Last name
         birth: Birth
diff --git a/src/i18n/locale/es.yml b/src/i18n/locale/es.yml
index 55e5abd95..f0ce53e37 100644
--- a/src/i18n/locale/es.yml
+++ b/src/i18n/locale/es.yml
@@ -731,6 +731,7 @@ worker:
         model: Modelo
         serialNumber: Número de serie
         removePDA: Desasignar PDA
+        sendToTablet: Enviar a la tablet
     create:
         lastName: Apellido
         birth: Fecha de nacimiento
diff --git a/src/pages/Worker/Card/WorkerPda.vue b/src/pages/Worker/Card/WorkerPda.vue
index d32941494..104f45556 100644
--- a/src/pages/Worker/Card/WorkerPda.vue
+++ b/src/pages/Worker/Card/WorkerPda.vue
@@ -5,24 +5,25 @@ import { ref, computed } from 'vue';
 
 import axios from 'axios';
 import useNotify from 'src/composables/useNotify.js';
+import { useVnConfirm } from 'composables/useVnConfirm';
+import { useArrayData } from 'src/composables/useArrayData';
+import { downloadDocuware } from 'src/composables/downloadFile';
+
 import FetchData from 'components/FetchData.vue';
 import FormModelPopup from 'src/components/FormModelPopup.vue';
-import { useVnConfirm } from 'composables/useVnConfirm';
-
-import VnPaginate from 'src/components/ui/VnPaginate.vue';
 import VnRow from 'components/ui/VnRow.vue';
 import VnSelect from 'src/components/common/VnSelect.vue';
-import VnInput from 'src/components/common/VnInput.vue';
+import VnTable from 'src/components/VnTable/VnTable.vue';
 
 const { t } = useI18n();
 const { notify } = useNotify();
-
-const paginate = ref();
+const loadingDocuware = ref(true);
+const tableRef = ref();
 const dialog = ref();
 const route = useRoute();
 const { openConfirmationModal } = useVnConfirm();
 const routeId = computed(() => route.params.id);
-
+const worker = computed(() => useArrayData('Worker').store.data);
 const initialData = computed(() => {
     return {
         userFk: routeId.value,
@@ -31,154 +32,277 @@ const initialData = computed(() => {
     };
 });
 
-const deallocatePDA = async (deviceProductionFk) => {
-    await axios.post(`Workers/${route.params.id}/deallocatePDA`, {
-        pda: deviceProductionFk,
-    });
-    notify(t('PDA deallocated'), 'positive');
-
-    paginate.value.fetch();
-};
+const columns = computed(() => [
+    {
+        align: 'center',
+        label: t('globals.state'),
+        name: 'state',
+        format: (row) => row?.docuware?.state,
+        columnFilter: false,
+        chip: {
+            condition: (_, row) => !!row.docuware,
+            color: (row) => (isSigned(row) ? 'bg-positive' : 'bg-warning'),
+        },
+        visible: false,
+    },
+    {
+        align: 'right',
+        label: t('worker.pda.currentPDA'),
+        name: 'deviceProductionFk',
+        columnClass: 'shrink',
+        cardVisible: true,
+    },
+    {
+        align: 'left',
+        label: t('Model'),
+        name: 'modelFk',
+        format: ({ deviceProduction }) => deviceProduction.modelFk,
+        cardVisible: true,
+    },
+    {
+        align: 'right',
+        label: t('Serial number'),
+        name: 'serialNumber',
+        format: ({ deviceProduction }) => deviceProduction.serialNumber,
+        cardVisible: true,
+    },
+    {
+        align: 'left',
+        label: t('Current SIM'),
+        name: 'simFk',
+        cardVisible: true,
+    },
+    {
+        align: 'right',
+        name: 'actions',
+        columnFilter: false,
+        cardVisible: true,
+    },
+]);
 
 function reloadData() {
     initialData.value.deviceProductionFk = null;
     initialData.value.simFk = null;
-    paginate.value.fetch();
+    tableRef.value.reload();
+}
+
+async function fetchDocuware() {
+    loadingDocuware.value = true;
+    const id = worker.value?.lastName + ' ' + worker.value?.firstName;
+    const promises = [];
+
+    for (const row of tableRef.value.CrudModelRef.formData) {
+        promises.push(
+            (async () => {
+                const { data } = await axios.post(`Docuwares/${id}/checkFile`, {
+                    fileCabinet: 'hr',
+                    signed: false,
+                    mergeFilter: [
+                        {
+                            DBName: 'TIPO_DOCUMENTO',
+                            Value: ['PDA'],
+                        },
+                        {
+                            DBName: 'FILENAME',
+                            Value: [row.deviceProductionFk + '-pda'],
+                        },
+                    ],
+                });
+                row.docuware = data;
+            })(),
+        );
+    }
+
+    await Promise.all(promises);
+    loadingDocuware.value = false;
+}
+
+async function sendToTablet(rows) {
+    const promises = [];
+    for (const row of rows) {
+        promises.push(
+            (async () => {
+                await axios.post(`Docuwares/upload-pda-pdf`, {
+                    ids: [row.deviceProductionFk],
+                });
+                row.docuware = true;
+            })(),
+        );
+    }
+    await Promise.all(promises);
+    notify(t('PDF sended to signed'), 'positive');
+    tableRef.value.reload();
+}
+
+async function deallocatePDA(deviceProductionFk) {
+    await axios.post(`Workers/${route.params.id}/deallocatePDA`, {
+        pda: deviceProductionFk,
+    });
+    const index = tableRef.value.CrudModelRef.formData.findIndex(
+        (data) => data?.deviceProductionFk == deviceProductionFk,
+    );
+    delete tableRef.value.CrudModelRef.formData[index];
+    notify(t('PDA deallocated'), 'positive');
+}
+
+function isSigned(row) {
+    return row.docuware?.state === 'Firmado';
 }
 </script>
 
 <template>
-    <QPage class="column items-center q-pa-md centerCard">
-        <FetchData
-            url="workers/getAvailablePda"
-            @on-fetch="(data) => (deviceProductions = data)"
-            auto-load
-        />
-        <VnPaginate
-            ref="paginate"
-            data-key="WorkerPda"
-            url="DeviceProductionUsers"
-            :user-filter="{ where: { userFk: routeId } }"
-            order="id"
-            search-url="pda"
-            auto-load
-        >
-            <template #body="{ rows }">
-                <QCard
-                    flat
-                    bordered
-                    :key="row.id"
-                    v-for="row of rows"
-                    class="card q-px-md q-mb-sm container"
-                >
-                    <VnRow>
-                        <VnInput
-                            :label="t('worker.pda.currentPDA')"
-                            :model-value="row?.deviceProductionFk"
-                            disable
-                        />
-                        <VnInput
-                            :label="t('Model')"
-                            :model-value="row?.deviceProduction?.modelFk"
-                            disable
-                        />
-                        <VnInput
-                            :label="t('Serial number')"
-                            :model-value="row?.deviceProduction?.serialNumber"
-                            disable
-                        />
-                        <VnInput
-                            :label="t('Current SIM')"
-                            :model-value="row?.simFk"
-                            disable
-                        />
-                        <QBtn
-                            flat
-                            icon="delete"
-                            color="primary"
-                            class="btn-delete"
-                            @click="
-                                openConfirmationModal(
-                                    t(`Remove PDA`),
-                                    t('Do you want to remove this PDA?'),
-                                    () => deallocatePDA(row.deviceProductionFk),
-                                )
-                            "
-                        >
-                            <QTooltip>
-                                {{ t('worker.pda.removePDA') }}
-                            </QTooltip>
-                        </QBtn>
-                    </VnRow>
-                </QCard>
-            </template>
-        </VnPaginate>
-        <QPageSticky :offset="[18, 18]">
+    <FetchData
+        url="workers/getAvailablePda"
+        @on-fetch="(data) => (deviceProductions = data)"
+        auto-load
+    />
+    <VnTable
+        ref="tableRef"
+        data-key="WorkerPda"
+        url="DeviceProductionUsers"
+        :user-filter="{ order: 'id' }"
+        :filter="{ where: { userFk: routeId } }"
+        search-url="pda"
+        auto-load
+        :columns="columns"
+        @onFetch="fetchDocuware"
+        :hasSubToolbar="true"
+        :default-remove="false"
+        :default-reset="false"
+        :default-save="false"
+        :table="{
+            'row-key': 'deviceProductionFk',
+            selection: 'multiple',
+        }"
+        :table-filter="{ hiddenTags: ['userFk'] }"
+    >
+        <template #moreBeforeActions>
             <QBtn
-                @click.stop="dialog.show()"
+                :label="t('globals.refresh')"
+                icon="refresh"
+                @click="tableRef.reload()"
+            />
+            <QBtn
+                :disable="!tableRef?.selected?.length"
+                :label="t('globals.send')"
+                icon="install_mobile"
+                @click="sendToTablet(tableRef?.selected)"
+                class="bg-primary"
+            />
+        </template>
+        <template #column-actions="{ row }">
+            <QBtn
+                flat
+                icon="delete"
                 color="primary"
-                fab
-                icon="add"
-                v-shortcut="'+'"
+                @click="
+                    openConfirmationModal(
+                        t(`Remove PDA`),
+                        t('Do you want to remove this PDA?'),
+                        () => deallocatePDA(row.deviceProductionFk),
+                    )
+                "
+                data-cy="workerPda-remove"
             >
-                <QDialog ref="dialog">
-                    <FormModelPopup
-                        :title="t('Add new device')"
-                        url-create="DeviceProductionUsers"
-                        model="DeviceProductionUser"
-                        :form-initial-data="initialData"
-                        @on-data-saved="reloadData()"
-                    >
-                        <template #form-inputs="{ data }">
-                            <VnRow>
-                                <VnSelect
-                                    :label="t('worker.pda.newPDA')"
-                                    v-model="data.deviceProductionFk"
-                                    :options="deviceProductions"
-                                    option-label="id"
-                                    option-value="id"
-                                    id="deviceProductionFk"
-                                    hide-selected
-                                    data-cy="pda-dialog-select"
-                                    :required="true"
-                                >
-                                    <template #option="scope">
-                                        <QItem v-bind="scope.itemProps">
-                                            <QItemSection>
-                                                <QItemLabel
-                                                    >ID: {{ scope.opt?.id }}</QItemLabel
-                                                >
-                                                <QItemLabel caption>
-                                                    {{ scope.opt?.modelFk }},
-                                                    {{ scope.opt?.serialNumber }}
-                                                </QItemLabel>
-                                            </QItemSection>
-                                        </QItem>
-                                    </template>
-                                </VnSelect>
-                                <VnInput
-                                    v-model="data.simFk"
-                                    :label="t('SIM serial number')"
-                                    id="simSerialNumber"
-                                    use-input
-                                />
-                            </VnRow>
-                        </template>
-                    </FormModelPopup>
-                </QDialog>
+                <QTooltip>
+                    {{ t('worker.pda.removePDA') }}
+                </QTooltip>
             </QBtn>
-            <QTooltip>
-                {{ t('globals.new') }}
-            </QTooltip>
-        </QPageSticky>
-    </QPage>
+            <QBtn
+                v-if="!isSigned(row)"
+                :loading="loadingDocuware"
+                icon="install_mobile"
+                flat
+                color="primary"
+                @click="
+                    openConfirmationModal(
+                        t('Sign PDA'),
+                        t('Are you sure you want to send it?'),
+
+                        () => sendToTablet([row]),
+                    )
+                "
+                data-cy="workerPda-send"
+            >
+                <QTooltip>
+                    {{ t('worker.pda.sendToTablet') }}
+                </QTooltip>
+            </QBtn>
+            <QBtn
+                v-if="isSigned(row)"
+                :loading="loadingDocuware"
+                icon="cloud_download"
+                flat
+                color="primary"
+                @click="
+                    downloadDocuware('Docuwares/download-pda-pdf', {
+                        file: row.deviceProductionFk + '-pda',
+                        worker: worker?.lastName + ' ' + worker?.firstName,
+                    })
+                "
+                data-cy="workerPda-download"
+            >
+                <QTooltip>
+                    {{ t('worker.pda.download') }}
+                </QTooltip>
+            </QBtn>
+        </template>
+    </VnTable>
+    <QPageSticky :offset="[18, 18]">
+        <QBtn @click.stop="dialog.show()" color="primary" fab icon="add" v-shortcut="'+'">
+            <QDialog ref="dialog">
+                <FormModelPopup
+                    :title="t('Add new device')"
+                    url-create="DeviceProductionUsers"
+                    model="DeviceProductionUser"
+                    :form-initial-data="initialData"
+                    @on-data-saved="reloadData()"
+                >
+                    <template #form-inputs="{ data }">
+                        <VnRow>
+                            <VnSelect
+                                :label="t('PDA')"
+                                v-model="data.deviceProductionFk"
+                                :options="deviceProductions"
+                                option-label="modelFk"
+                                option-value="id"
+                                id="deviceProductionFk"
+                                hide-selected
+                                data-cy="pda-dialog-select"
+                                :required="true"
+                            >
+                                <template #option="scope">
+                                    <QItem v-bind="scope.itemProps">
+                                        <QItemSection>
+                                            <QItemLabel
+                                                >ID: {{ scope.opt?.id }}</QItemLabel
+                                            >
+                                            <QItemLabel caption>
+                                                {{ scope.opt?.modelFk }},
+                                                {{ scope.opt?.serialNumber }}
+                                            </QItemLabel>
+                                        </QItemSection>
+                                    </QItem>
+                                </template>
+                            </VnSelect>
+                            <VnSelect
+                                url="Sims"
+                                option-label="line"
+                                option-value="code"
+                                v-model="data.simFk"
+                                :label="t('SIM serial number')"
+                                id="simSerialNumber"
+                            />
+                        </VnRow>
+                    </template>
+                </FormModelPopup>
+            </QDialog>
+        </QBtn>
+        <QTooltip>
+            {{ t('globals.new') }}
+        </QTooltip>
+    </QPageSticky>
 </template>
-<style lang="scss" scoped>
-.btn-delete {
-    max-width: 4%;
-    margin-top: 30px;
-}
-</style>
 <i18n>
 es:
     Model: Modelo
diff --git a/test/cypress/integration/worker/workerPda.spec.js b/test/cypress/integration/worker/workerPda.spec.js
index 31ec19eda..d00a81ffc 100644
--- a/test/cypress/integration/worker/workerPda.spec.js
+++ b/test/cypress/integration/worker/workerPda.spec.js
@@ -1,23 +1,91 @@
 describe('WorkerPda', () => {
-    const select = '[data-cy="pda-dialog-select"]';
+    const deviceId = 4;
     beforeEach(() => {
-        cy.viewport(1920, 1080);
         cy.login('developer');
         cy.visit(`/#/worker/1110/pda`);
     });
 
-    it('assign pda', () => {
-        cy.addBtnClick();
-        cy.get(select).click();
-        cy.get(select).type('{downArrow}{enter}');
-        cy.get('.q-notification__message').should('have.text', 'Data created');
+    it('assign and delete pda', () => {
+        creatNewPDA();
+        cy.checkNotification('Data created');
+        cy.visit(`/#/worker/1110/pda`);
+        removeNewPDA();
+        cy.checkNotification('PDA deallocated');
     });
 
-    it('delete pda', () => {
-        cy.get('.btn-delete').click();
-        cy.get(
-            '.q-card__actions > .q-btn--unelevated > .q-btn__content > .block'
-        ).click();
-        cy.get('.q-notification__message').should('have.text', 'PDA deallocated');
+    it('send to docuware', () => {
+        cy.intercept('POST', '/api/Docuwares/upload-pda-pdf', (req) => {
+            req.reply({
+                statusCode: 200,
+                body: {},
+            });
+        });
+
+        creatNewPDA();
+        cy.dataCy('workerPda-send').click();
+        confirmButton();
+        cy.checkNotification('PDF sended to signed');
+
+        removeNewPDA();
     });
+
+    it('send 2 pdfs to docuware', () => {
+        cy.intercept('POST', '/api/Docuwares/upload-pda-pdf', (req) => {
+            req.reply({
+                statusCode: 200,
+                body: {},
+            });
+        });
+
+        creatNewPDA();
+        creatNewPDA(2);
+        cy.selectRows([1, 2]);
+        cy.get('#st-actions').contains('Send').click();
+
+        confirmButton();
+        cy.checkNotification('PDF sended to signed');
+
+        removeNewPDA();
+    });
+
+    it('download file', () => {
+        cy.intercept('POST', /\/api\/Docuwares\/Jones%20Jessica\/checkFile/, (req) => {
+            req.reply({
+                statusCode: 200,
+                body: {
+                    id: deviceId,
+                    state: 'Firmado',
+                },
+            });
+        });
+
+        cy.intercept('GET', '/api/Docuwares/download-pda-pdf**', (req) => {
+            req.reply({
+                statusCode: 200,
+                body: {},
+            });
+        });
+        cy.get('#st-actions').contains('refresh').click();
+
+        creatNewPDA();
+        cy.dataCy('workerPda-download').click();
+        removeNewPDA();
+    });
+
+    function creatNewPDA(id = deviceId) {
+        cy.addBtnClick();
+        cy.selectOption('[data-cy="pda-dialog-select"]', id);
+        cy.saveCard();
+    }
+
+    function removeNewPDA() {
+        cy.dataCy('workerPda-remove').first().click();
+        confirmButton();
+    }
+
+    function confirmButton() {
+        cy.get(
+            '.q-card__actions > .q-btn--unelevated > .q-btn__content > .block',
+        ).click();
+    }
 });

From 5e0c133eb3da20777e102ee6a78994ec46d85a33 Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Fri, 21 Mar 2025 11:15:53 +0100
Subject: [PATCH 20/44] test: refs #5926 improve VnDmsList tests with mock and
 data structure adjustments

---
 .../common/__tests__/VnDmsList.spec.js        | 46 ++++++++++---------
 1 file changed, 24 insertions(+), 22 deletions(-)

diff --git a/src/components/common/__tests__/VnDmsList.spec.js b/src/components/common/__tests__/VnDmsList.spec.js
index 9649943a2..22101239e 100644
--- a/src/components/common/__tests__/VnDmsList.spec.js
+++ b/src/components/common/__tests__/VnDmsList.spec.js
@@ -4,12 +4,15 @@ import { vi, afterEach, beforeAll, describe, expect, it } from 'vitest';
 
 describe('VnDmsList', () => {
     let vm;
-    const dms = { 
-        userFk: 1, 
-        name: 'DMS 1' 
+    const dms = {
+        userFk: 1,
+        name: 'DMS 1',
     };
-    
+
     beforeAll(() => {
+        vi.mock('src/composables/getUrl', () => ({
+            getUrl: vi.fn().mockResolvedValue(''),
+        }));
         vi.spyOn(axios, 'get').mockResolvedValue({ data: [] });
         vm = createWrapper(VnDmsList, {
             props: {
@@ -18,8 +21,8 @@ describe('VnDmsList', () => {
                 filter: 'wd.workerFk',
                 updateModel: 'Workers',
                 deleteModel: 'WorkerDms',
-                downloadModel: 'WorkerDms' 
-            }
+                downloadModel: 'WorkerDms',
+            },
         }).vm;
     });
 
@@ -29,46 +32,45 @@ describe('VnDmsList', () => {
 
     describe('setData()', () => {
         const data = [
-            { 
-                userFk: 1, 
+            {
+                userFk: 1,
                 name: 'Jessica',
                 lastName: 'Jones',
                 file: '4.jpg',
-                created: '2021-07-28 21:00:00'
+                created: '2021-07-28 21:00:00',
             },
-            { 
-                userFk: 2, 
+            {
+                userFk: 2,
                 name: 'Bruce',
                 lastName: 'Banner',
                 created: '2022-07-28 21:00:00',
                 dms: {
-                    userFk: 2, 
+                    userFk: 2,
                     name: 'Bruce',
                     lastName: 'BannerDMS',
                     created: '2022-07-28 21:00:00',
                     file: '4.jpg',
-                } 
+                },
             },
             {
                 userFk: 3,
                 name: 'Natasha',
                 lastName: 'Romanoff',
                 file: '4.jpg',
-                created: '2021-10-28 21:00:00'
-            }  
-        ]
+                created: '2021-10-28 21:00:00',
+            },
+        ];
 
         it('Should replace objects that contain the "dms" property with the value of the same and sort by creation date', () => {
             vm.setData(data);
             expect([vm.rows][0][0].lastName).toEqual('BannerDMS');
             expect([vm.rows][0][1].lastName).toEqual('Romanoff');
-
         });
     });
 
     describe('parseDms()', () => {
-        const resultDms = { ...dms, userId:1};
-        
+        const resultDms = { ...dms, userId: 1 };
+
         it('Should add properties that end with "Fk" by changing the suffix to "Id"', () => {
             const parsedDms = vm.parseDms(dms);
             expect(parsedDms).toEqual(resultDms);
@@ -76,12 +78,12 @@ describe('VnDmsList', () => {
     });
 
     describe('showFormDialog()', () => {
-        const resultDms = { ...dms, userId:1};
-        
+        const resultDms = { ...dms, userId: 1 };
+
         it('should call fn parseDms() and set show true if dms is defined', () => {
             vm.showFormDialog(dms);
             expect(vm.formDialog.show).toEqual(true);
             expect(vm.formDialog.dms).toEqual(resultDms);
         });
     });
-});	
\ No newline at end of file
+});

From 63cf602ab24340e9128cb3511b41f4618e6b2202 Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Fri, 21 Mar 2025 11:46:42 +0100
Subject: [PATCH 21/44] refactor(WorkerPda): refs #5926 optimize fetchDocuware
 and sendToTablet functions for better readability

---
 src/pages/Worker/Card/WorkerPda.vue | 64 +++++++++++++----------------
 1 file changed, 28 insertions(+), 36 deletions(-)

diff --git a/src/pages/Worker/Card/WorkerPda.vue b/src/pages/Worker/Card/WorkerPda.vue
index 104f45556..27313e52c 100644
--- a/src/pages/Worker/Card/WorkerPda.vue
+++ b/src/pages/Worker/Card/WorkerPda.vue
@@ -88,48 +88,40 @@ function reloadData() {
 
 async function fetchDocuware() {
     loadingDocuware.value = true;
-    const id = worker.value?.lastName + ' ' + worker.value?.firstName;
-    const promises = [];
 
-    for (const row of tableRef.value.CrudModelRef.formData) {
-        promises.push(
-            (async () => {
-                const { data } = await axios.post(`Docuwares/${id}/checkFile`, {
-                    fileCabinet: 'hr',
-                    signed: false,
-                    mergeFilter: [
-                        {
-                            DBName: 'TIPO_DOCUMENTO',
-                            Value: ['PDA'],
-                        },
-                        {
-                            DBName: 'FILENAME',
-                            Value: [row.deviceProductionFk + '-pda'],
-                        },
-                    ],
-                });
-                row.docuware = data;
-            })(),
-        );
-    }
+    const id = `${worker.value?.lastName} ${worker.value?.firstName}`;
+    const rows = tableRef.value.CrudModelRef.formData;
 
-    await Promise.all(promises);
+    const promises = rows.map(async (row) => {
+        const { data } = await axios.post(`Docuwares/${id}/checkFile`, {
+            fileCabinet: 'hr',
+            signed: false,
+            mergeFilter: [
+                {
+                    DBName: 'TIPO_DOCUMENTO',
+                    Value: ['PDA'],
+                },
+                {
+                    DBName: 'FILENAME',
+                    Value: [`${row.deviceProductionFk}-pda`],
+                },
+            ],
+        });
+        row.docuware = data;
+    });
+
+    await Promise.allSettled(promises);
     loadingDocuware.value = false;
 }
 
 async function sendToTablet(rows) {
-    const promises = [];
-    for (const row of rows) {
-        promises.push(
-            (async () => {
-                await axios.post(`Docuwares/upload-pda-pdf`, {
-                    ids: [row.deviceProductionFk],
-                });
-                row.docuware = true;
-            })(),
-        );
-    }
-    await Promise.all(promises);
+    const promises = rows.map(async (row) => {
+        await axios.post(`Docuwares/upload-pda-pdf`, {
+            ids: [row.deviceProductionFk],
+        });
+        row.docuware = true;
+    });
+    await Promise.allSettled(promises);
     notify(t('PDF sended to signed'), 'positive');
     tableRef.value.reload();
 }

From 4ed1021a67c3c714807ee3fbf233d073e727769c Mon Sep 17 00:00:00 2001
From: pablone <pablone@verdnatura.es>
Date: Fri, 21 Mar 2025 13:19:43 +0100
Subject: [PATCH 22/44] feat: refs #8638 add AWB field to travel and entry
 forms, update translations and styles

---
 src/components/VnTable/VnTable.vue            |   2 +-
 src/components/common/VnDmsInput.vue          | 166 ++++++++++++++++++
 src/css/app.scss                              |   1 -
 src/i18n/locale/en.yml                        |   1 +
 src/i18n/locale/es.yml                        |   1 +
 src/pages/Entry/Card/EntryBasicData.vue       |  47 +++--
 src/pages/Entry/Card/EntryBuys.vue            |  64 ++++++-
 src/pages/Entry/Card/EntryDescriptor.vue      |   4 +-
 src/pages/Entry/Card/EntrySummary.vue         |   6 +-
 src/pages/Entry/EntryStockBought.vue          |  15 +-
 src/pages/Entry/locale/es.yml                 |  11 +-
 .../InvoiceIn/Card/InvoiceInBasicData.vue     | 122 +------------
 src/pages/Travel/Card/TravelBasicData.vue     |   7 +-
 src/pages/Travel/Card/TravelFilter.js         |   1 +
 14 files changed, 290 insertions(+), 158 deletions(-)
 create mode 100644 src/components/common/VnDmsInput.vue

diff --git a/src/components/VnTable/VnTable.vue b/src/components/VnTable/VnTable.vue
index 6a547d95d..9ad032ee5 100644
--- a/src/components/VnTable/VnTable.vue
+++ b/src/components/VnTable/VnTable.vue
@@ -1154,7 +1154,7 @@ es:
 
 .grid-create {
     display: grid;
-    grid-template-columns: 1fr 1fr;
+    grid-template-columns: repeat(auto-fit, minmax(150px, max-content));
     max-width: 100%;
     grid-gap: 20px;
     margin: 0 auto;
diff --git a/src/components/common/VnDmsInput.vue b/src/components/common/VnDmsInput.vue
new file mode 100644
index 000000000..25d625d5d
--- /dev/null
+++ b/src/components/common/VnDmsInput.vue
@@ -0,0 +1,166 @@
+<script setup>
+import VnConfirm from '../ui/VnConfirm.vue';
+import VnInput from './VnInput.vue';
+import VnDms from './VnDms.vue';
+import axios from 'axios';
+import { useQuasar } from 'quasar';
+import { ref } from 'vue';
+import { useI18n } from 'vue-i18n';
+import { downloadFile } from 'src/composables/downloadFile';
+
+const { t } = useI18n();
+const quasar = useQuasar();
+const documentDialogRef = ref({});
+const editDownloadDisabled = ref(false);
+const $props = defineProps({
+    defaultDmsCode: {
+        type: String,
+        default: 'InvoiceIn',
+    },
+    disable: {
+        type: Boolean,
+        default: true,
+    },
+    data: {
+        type: Object,
+        default: null,
+    },
+    formRef: {
+        type: Object,
+        default: null,
+    },
+});
+
+function deleteFile(dmsFk) {
+    quasar
+        .dialog({
+            component: VnConfirm,
+            componentProps: {
+                title: t('globals.confirmDeletion'),
+                message: t('globals.confirmDeletionMessage'),
+            },
+        })
+        .onOk(async () => {
+            await axios.post(`dms/${dmsFk}/removeFile`);
+            $props.formRef.formData.dmsFk = null;
+            $props.formRef.formData.dms = undefined;
+            $props.formRef.hasChanges = true;
+            $props.formRef.save();
+        });
+}
+</script>
+<template>
+    <div class="row no-wrap">
+        <VnInput
+            :label="t('Document')"
+            v-model="data.dmsFk"
+            clearable
+            clear-icon="close"
+            class="full-width"
+            :disable="disable"
+        />
+        <div
+            v-if="data.dmsFk"
+            class="row no-wrap q-pa-xs q-gutter-x-xs"
+            data-cy="dms-buttons"
+        >
+            <QBtn
+                :disable="editDownloadDisabled"
+                @click="downloadFile(data.dmsFk)"
+                icon="cloud_download"
+                color="primary"
+                flat
+                :class="{
+                    'no-pointer-events': editDownloadDisabled,
+                }"
+                padding="xs"
+                round
+            >
+                <QTooltip>{{ t('Download file') }}</QTooltip>
+            </QBtn>
+            <QBtn
+                :disable="editDownloadDisabled"
+                @click="
+                    () => {
+                        documentDialogRef.show = true;
+                        documentDialogRef.dms = data.dms;
+                    }
+                "
+                icon="edit"
+                color="primary"
+                flat
+                :class="{
+                    'no-pointer-events': editDownloadDisabled,
+                }"
+                padding="xs"
+                round
+            >
+                <QTooltip>{{ t('Edit document') }}</QTooltip>
+            </QBtn>
+            <QBtn
+                :disable="editDownloadDisabled"
+                @click="deleteFile(data.dmsFk)"
+                icon="delete"
+                color="primary"
+                flat
+                round
+                :class="{
+                    'no-pointer-events': editDownloadDisabled,
+                }"
+                padding="xs"
+            >
+                <QTooltip>{{ t('Delete file') }}</QTooltip>
+            </QBtn>
+        </div>
+        <QBtn
+            v-else
+            icon="add_circle"
+            color="primary"
+            flat
+            round
+            v-shortcut="'+'"
+            padding="xs"
+            @click="
+                () => {
+                    documentDialogRef.show = true;
+                    delete documentDialogRef.dms;
+                }
+            "
+            data-cy="dms-create"
+        >
+            <QTooltip>{{ t('Create document') }}</QTooltip>
+        </QBtn>
+    </div>
+    <QDialog v-model="documentDialogRef.show">
+        <VnDms
+            model="dms"
+            :default-dms-code="defaultDmsCode"
+            :form-initial-data="documentDialogRef.dms"
+            :url="
+                documentDialogRef.dms
+                    ? `Dms/${documentDialogRef.dms.id}/updateFile`
+                    : 'Dms/uploadFile'
+            "
+            :description="documentDialogRef.supplierName"
+            @on-data-saved="
+                (_, { data }) => {
+                    let dmsData = data;
+                    if (Array.isArray(data)) dmsData = data[0];
+                    formRef.formData.dmsFk = dmsData.id;
+                    formRef.formData.dms = dmsData;
+                    formRef.hasChanges = true;
+                    formRef.save();
+                }
+            "
+        />
+    </QDialog>
+</template>
+<i18n>
+es:
+    Document: Documento
+    Download file: Descargar archivo
+    Edit document: Editar documento
+    Delete file: Eliminar archivo
+    Create document: Crear documento
+
+</i18n>
diff --git a/src/css/app.scss b/src/css/app.scss
index 5befd150b..b299973d1 100644
--- a/src/css/app.scss
+++ b/src/css/app.scss
@@ -325,7 +325,6 @@ input::-webkit-inner-spin-button {
         min-height: auto !important;
         display: flex;
         align-items: flex-end;
-        padding-bottom: 2px;
         .q-field__native.row {
             min-height: auto !important;
         }
diff --git a/src/i18n/locale/en.yml b/src/i18n/locale/en.yml
index c1286267c..594722b96 100644
--- a/src/i18n/locale/en.yml
+++ b/src/i18n/locale/en.yml
@@ -816,6 +816,7 @@ travel:
     search: Search travel
     searchInfo: You can search by travel id or name
     id: Id
+    awbFk: AWB
     travelList:
         tableVisibleColumns:
             ref: Reference
diff --git a/src/i18n/locale/es.yml b/src/i18n/locale/es.yml
index 681781d11..a0eb3835d 100644
--- a/src/i18n/locale/es.yml
+++ b/src/i18n/locale/es.yml
@@ -899,6 +899,7 @@ travel:
     search: Buscar envío
     searchInfo: Buscar envío por id o nombre
     id: Id
+    awbFk: Guía aérea
     travelList:
         tableVisibleColumns:
             ref: Referencia
diff --git a/src/pages/Entry/Card/EntryBasicData.vue b/src/pages/Entry/Card/EntryBasicData.vue
index 34e4a0f9c..f6d15a977 100644
--- a/src/pages/Entry/Card/EntryBasicData.vue
+++ b/src/pages/Entry/Card/EntryBasicData.vue
@@ -14,6 +14,8 @@ import VnInputNumber from 'src/components/common/VnInputNumber.vue';
 import VnSelectTravelExtended from 'src/components/common/VnSelectTravelExtended.vue';
 import VnSelectSupplier from 'src/components/common/VnSelectSupplier.vue';
 import VnCheckbox from 'src/components/common/VnCheckbox.vue';
+import VnSelectWorker from 'src/components/common/VnSelectWorker.vue';
+import VnDmsInput from 'src/components/common/VnDmsInput.vue';
 
 const route = useRoute();
 const { t } = useI18n();
@@ -24,6 +26,7 @@ const user = state.getUser().fn();
 
 const companiesOptions = ref([]);
 const currenciesOptions = ref([]);
+const entryRef = ref({});
 
 onMounted(() => {
     checkEntryLock(route.params.id, user.id);
@@ -48,10 +51,11 @@ onMounted(() => {
         auto-load
     />
     <FormModel
-        :url-update="`Entries/${route.params.id}`"
+        ref="entryRef"
         model="Entry"
-        auto-load
+        :url-update="`Entries/${route.params.id}`"
         :clear-store-on-unmount="false"
+        auto-load
     >
         <template #form="{ data }">
             <VnRow class="q-py-sm">
@@ -67,11 +71,18 @@ onMounted(() => {
                 />
             </VnRow>
             <VnRow class="q-py-sm">
-                <VnInput v-model="data.reference" :label="t('globals.reference')" />
-                <VnInputNumber
-                    v-model="data.invoiceAmount"
-                    :label="t('entry.summary.invoiceAmount')"
-                    :positive="false"
+                <VnInput
+                    v-model="data.reference"
+                    :label="t('entry.list.tableVisibleColumns.reference')"
+                />
+                <VnSelect
+                    v-model="data.typeFk"
+                    url="entryTypes"
+                    :fields="['code', 'description']"
+                    option-value="code"
+                    optionLabel="description"
+                    sortBy="description"
+                    :label="t('entry.list.tableVisibleColumns.entryTypeDescription')"
                 />
             </VnRow>
             <VnRow class="q-py-sm">
@@ -113,7 +124,6 @@ onMounted(() => {
                     name="initialTemperature"
                     :label="t('entry.basicData.initialTemperature')"
                     :step="0.5"
-                    :decimal-places="2"
                     :positive="false"
                 />
                 <VnInputNumber
@@ -121,20 +131,21 @@ onMounted(() => {
                     name="finalTemperature"
                     :label="t('entry.basicData.finalTemperature')"
                     :step="0.5"
-                    :decimal-places="2"
                     :positive="false"
                 />
-                <VnSelect
-                    v-model="data.typeFk"
-                    url="entryTypes"
-                    :fields="['code', 'description']"
-                    option-value="code"
-                    optionLabel="description"
-                    sortBy="description"
-                />
             </VnRow>
             <VnRow class="q-py-sm">
-                <QInput
+                <VnInputNumber
+                    v-model="data.invoiceAmount"
+                    :label="t('entry.list.tableVisibleColumns.invoiceAmount')"
+                    :positive="false"
+                    @update:model-value="data.buyerFk = user.id"
+                />
+                <VnSelectWorker v-model="data.buyerFk" hide-selected />
+                <VnDmsInput :data="data" :formRef="entryRef" :disable="false" />
+            </VnRow>
+            <VnRow class="q-py-sm">
+                <VnInputNumber
                     :label="t('entry.basicData.observation')"
                     type="textarea"
                     v-model="data.observation"
diff --git a/src/pages/Entry/Card/EntryBuys.vue b/src/pages/Entry/Card/EntryBuys.vue
index 3990fde19..85da5cf1d 100644
--- a/src/pages/Entry/Card/EntryBuys.vue
+++ b/src/pages/Entry/Card/EntryBuys.vue
@@ -18,6 +18,7 @@ import VnSelectEnum from 'src/components/common/VnSelectEnum.vue';
 import { checkEntryLock } from 'src/composables/checkEntryLock';
 import VnRow from 'src/components/ui/VnRow.vue';
 import VnInput from 'src/components/common/VnInput.vue';
+import VnInputNumber from 'src/components/common/VnInputNumber.vue';
 
 const $props = defineProps({
     id: {
@@ -44,6 +45,8 @@ const entityId = ref($props.id ?? route.params.id);
 const entryBuysRef = ref();
 const footerFetchDataRef = ref();
 const footer = ref({});
+const dialogRef = ref(false);
+const newEntryRef = ref(null);
 const columns = [
     {
         align: 'center',
@@ -250,6 +253,7 @@ const columns = [
         component: 'number',
         attrs: {
             positive: false,
+            decimalPlaces: 3,
         },
         cellEvent: {
             'update:modelValue': async (value, oldValue, row) => {
@@ -497,6 +501,23 @@ async function setBuyUltimate(itemFk, data) {
     });
 }
 
+async function transferBuys(rows, newEntry) {
+    if (!newEntry) return;
+
+    const promises = rows.map((row) => {
+        return axios.patch('Buys', { id: row.id, entryFk: newEntry });
+    });
+
+    await Promise.all(promises);
+
+    await axios.post(`Entries/${newEntry}/recalcEntryPrices`);
+    await axios.post(`Entries/${entityId.value}/recalcEntryPrices`);
+
+    entryBuysRef.value.reload();
+    newEntryRef.value = null;
+    dialogRef.value = false;
+}
+
 onMounted(() => {
     stateStore.rightDrawer = false;
     if ($props.editableMode) checkEntryLock(entityId.value, user.id);
@@ -571,6 +592,45 @@ onMounted(() => {
                     </QItem>
                 </QList>
             </QBtnDropdown>
+            <QBtn
+                icon="move_group"
+                color="primary"
+                :title="t('Transfer buys')"
+                flat
+                @click="dialogRef = true"
+                :disable="!selectedRows.length"
+            />
+            <QDialog v-model="dialogRef">
+                <QCard>
+                    <QCardSection>
+                        <span>{{ t('Transfer buys') }}</span>
+                    </QCardSection>
+                    <QCardSection>
+                        <VnInputNumber
+                            v-model="newEntryRef"
+                            :label="t('Entry')"
+                            type="number"
+                            data-cy="transfer-buy-entry"
+                        />
+                    </QCardSection>
+                    <QCardSection>
+                        <QCardActions>
+                            <QBtn
+                                label="Cancel"
+                                flat
+                                color="primary"
+                                @click="dialogRef = false"
+                            />
+                            <QBtn
+                                label="Transfer"
+                                flat
+                                color="primary"
+                                @click="transferBuys(selectedRows, newEntryRef)"
+                            />
+                        </QCardActions>
+                    </QCardSection>
+                </QCard>
+            </QDialog>
         </QBtnGroup>
     </Teleport>
     <FetchData
@@ -620,7 +680,7 @@ onMounted(() => {
             },
             columnGridStyle: {
                 'max-width': '50%',
-                'margin-right': '30px',
+                'margin-right': '5%',
                 flex: 1,
             },
             previousStyle: {
@@ -816,6 +876,8 @@ es:
     Create buy: Crear compra
     Invert quantity value: Invertir valor de cantidad
     Check buy amount: Marcar como correcta la cantidad de compra
+    Transfer buys: Transferir compras
+    Entry: Entrada
 </i18n>
 <style lang="scss" scoped>
 .centered-container {
diff --git a/src/pages/Entry/Card/EntryDescriptor.vue b/src/pages/Entry/Card/EntryDescriptor.vue
index 313ed3d72..784f6e8a3 100644
--- a/src/pages/Entry/Card/EntryDescriptor.vue
+++ b/src/pages/Entry/Card/EntryDescriptor.vue
@@ -92,7 +92,7 @@ const getEntryRedirectionFilter = (entry) => {
 };
 
 function showEntryReport() {
-    openReport(`Entries/${entityId.value}/entry-order-pdf`);
+    openReport(`Entries/${entityId.value}/entry-order-pdf`, {}, true);
 }
 
 function showNotification(type, message) {
@@ -147,7 +147,7 @@ async function deleteEntry() {
 <template>
     <CardDescriptor
         :url="`Entries/${entityId}`"
-        :filter="entryFilter"
+        :user-filter="entryFilter"
         title="supplier.nickname"
         data-key="Entry"
         width="lg-width"
diff --git a/src/pages/Entry/Card/EntrySummary.vue b/src/pages/Entry/Card/EntrySummary.vue
index 53967e66f..37a28968c 100644
--- a/src/pages/Entry/Card/EntrySummary.vue
+++ b/src/pages/Entry/Card/EntrySummary.vue
@@ -84,7 +84,10 @@ onMounted(async () => {
                             :label="t('globals.company')"
                             :value="entry?.company?.code"
                         />
-                        <VnLv :label="t('globals.reference')" :value="entry?.reference" />
+                        <VnLv
+                            :label="t('entry.list.tableVisibleColumns.reference')"
+                            :value="entry?.reference"
+                        />
                         <VnLv
                             :label="t('entry.summary.invoiceNumber')"
                             :value="entry?.invoiceNumber"
@@ -159,6 +162,7 @@ onMounted(async () => {
                         />
                     </div>
                     <div class="card-content">
+                        <VnLv :label="t('travel.awbFk')" :value="entry.travel.awbFk" />
                         <VnCheckbox
                             :label="t('entry.summary.travelDelivered')"
                             v-model="entry.travel.isDelivered"
diff --git a/src/pages/Entry/EntryStockBought.vue b/src/pages/Entry/EntryStockBought.vue
index 5da51d5a6..6168f0737 100644
--- a/src/pages/Entry/EntryStockBought.vue
+++ b/src/pages/Entry/EntryStockBought.vue
@@ -162,8 +162,8 @@ async function beforeSave(data, getChanges) {
     }
 
     await Promise.all(patchPromises);
-    const filteredChanges = changes.filter((change) => change?.isReal !== false);
-    data.creates = filteredChanges;
+    data.creates = [];
+    return data;
 }
 </script>
 <template>
@@ -203,7 +203,7 @@ async function beforeSave(data, getChanges) {
             </VnRow>
         </template>
     </VnSubToolbar>
-    <QDialog v-model="travelDialogRef" :maximized="true" :class="['vn-row', 'wrap']">
+    <QDialog v-model="travelDialogRef" :class="['vn-row', 'wrap']">
         <FormModelPopup
             :url-update="`Travels/${travel?.id}`"
             model="travel"
@@ -252,12 +252,15 @@ async function beforeSave(data, getChanges) {
                     </span>
                 </template>
                 <template #column-footer-reserve>
-                    <span>
+                    <span class="q-pr-xs">
                         {{ round(footer.reserve) }}
                     </span>
                 </template>
                 <template #column-footer-bought>
-                    <span :style="boughtStyle(footer?.bought, footer?.reserve)">
+                    <span
+                        :style="boughtStyle(footer?.bought, footer?.reserve)"
+                        class="q-pr-xs"
+                    >
                         {{ round(footer.bought) }}
                     </span>
                 </template>
@@ -275,7 +278,7 @@ async function beforeSave(data, getChanges) {
 }
 .column {
     min-width: 35%;
-    margin-top: 5%;
+    margin-top: 1%;
 }
 .text-negative {
     color: $negative !important;
diff --git a/src/pages/Entry/locale/es.yml b/src/pages/Entry/locale/es.yml
index 10d863ea2..2c80299bc 100644
--- a/src/pages/Entry/locale/es.yml
+++ b/src/pages/Entry/locale/es.yml
@@ -25,7 +25,7 @@ entry:
             entryTypeDescription: Tipo entrada
             invoiceAmount: Importe
             dated: Fecha
-        inventoryEntry: Es inventario
+            inventoryEntry: Es inventario
     summary:
         commission: Comisión
         currency: Moneda
@@ -33,7 +33,8 @@ entry:
         invoiceAmount: Importe
         ordered: Pedida
         booked: Contabilizada
-        excludedFromAvailable: Excluido
+        excludedFromAvailable: Excluir del disponible
+        isConfirmed: Lista para etiquetar
         travelReference: Referencia
         travelAgency: Agencia
         travelShipped: F. envio
@@ -56,7 +57,7 @@ entry:
         observation: Observación
         commission: Comisión
         booked: Contabilizada
-        excludedFromAvailable: Excluido
+        excludedFromAvailable: Excluir del disponible
         initialTemperature: Ini °C
         finalTemperature: Fin °C
     buys:
@@ -119,9 +120,9 @@ entry:
         supplierName: Proveedor
 entryFilter:
     params:
-        isExcludedFromAvailable: Excluido
+        isExcludedFromAvailable: Excluir del disponible
         isOrdered: Pedida
-        isConfirmed: Confirmado
+        isConfirmed: Lista para etiquetar
         isReceived: Recibida
         isRaid: Raid
         landed: Fecha
diff --git a/src/pages/InvoiceIn/Card/InvoiceInBasicData.vue b/src/pages/InvoiceIn/Card/InvoiceInBasicData.vue
index 905ddebb2..0995b75b9 100644
--- a/src/pages/InvoiceIn/Card/InvoiceInBasicData.vue
+++ b/src/pages/InvoiceIn/Card/InvoiceInBasicData.vue
@@ -2,24 +2,18 @@
 import { ref, computed } from 'vue';
 import { useRoute } from 'vue-router';
 import { useI18n } from 'vue-i18n';
-import { useQuasar } from 'quasar';
-import { downloadFile } from 'src/composables/downloadFile';
 import FormModel from 'components/FormModel.vue';
 import VnSelect from 'src/components/common/VnSelect.vue';
 import FetchData from 'src/components/FetchData.vue';
 import VnRow from 'components/ui/VnRow.vue';
 import VnInputDate from 'src/components/common/VnInputDate.vue';
 import VnInput from 'src/components/common/VnInput.vue';
-import VnDms from 'src/components/common/VnDms.vue';
-import VnConfirm from 'src/components/ui/VnConfirm.vue';
-import axios from 'axios';
 import VnSelectSupplier from 'src/components/common/VnSelectSupplier.vue';
+import VnDmsInput from 'src/components/common/VnDmsInput.vue';
 
 const { t } = useI18n();
 
 const route = useRoute();
-const quasar = useQuasar();
-const editDownloadDisabled = ref(false);
 const userConfig = ref(null);
 const invoiceId = computed(() => +route.params.id);
 
@@ -37,24 +31,6 @@ const allowedContentTypes = ref([]);
 const sageWithholdings = ref([]);
 const documentDialogRef = ref({});
 const invoiceInRef = ref({});
-
-function deleteFile(dmsFk) {
-    quasar
-        .dialog({
-            component: VnConfirm,
-            componentProps: {
-                title: t('globals.confirmDeletion'),
-                message: t('globals.confirmDeletionMessage'),
-            },
-        })
-        .onOk(async () => {
-            await axios.post(`dms/${dmsFk}/removeFile`);
-            invoiceInRef.value.formData.dmsFk = null;
-            invoiceInRef.value.formData.dms = undefined;
-            invoiceInRef.value.hasChanges = true;
-            invoiceInRef.value.save();
-        });
-}
 </script>
 <template>
     <FetchData
@@ -157,78 +133,7 @@ function deleteFile(dmsFk) {
                         </QItem>
                     </template>
                 </VnSelect>
-
-                <div class="row no-wrap">
-                    <VnInput
-                        :label="t('Document')"
-                        v-model="data.dmsFk"
-                        clearable
-                        clear-icon="close"
-                        class="full-width"
-                        :disable="true"
-                    />
-                    <div
-                        v-if="data.dmsFk"
-                        class="row no-wrap q-pa-xs q-gutter-x-xs"
-                        data-cy="dms-buttons"
-                    >
-                        <QBtn
-                            :class="{
-                                'no-pointer-events': editDownloadDisabled,
-                            }"
-                            :disable="editDownloadDisabled"
-                            icon="cloud_download"
-                            :title="t('Download file')"
-                            padding="xs"
-                            round
-                            @click="downloadFile(data.dmsFk)"
-                        />
-                        <QBtn
-                            :class="{
-                                'no-pointer-events': editDownloadDisabled,
-                            }"
-                            :disable="editDownloadDisabled"
-                            icon="edit"
-                            round
-                            padding="xs"
-                            @click="
-                                () => {
-                                    documentDialogRef.show = true;
-                                    documentDialogRef.dms = data.dms;
-                                }
-                            "
-                        >
-                            <QTooltip>{{ t('Edit document') }}</QTooltip>
-                        </QBtn>
-                        <QBtn
-                            :class="{
-                                'no-pointer-events': editDownloadDisabled,
-                            }"
-                            :disable="editDownloadDisabled"
-                            icon="delete"
-                            :title="t('Delete file')"
-                            padding="xs"
-                            round
-                            @click="deleteFile(data.dmsFk)"
-                        />
-                    </div>
-                    <QBtn
-                        v-else
-                        icon="add_circle"
-                        round
-                        v-shortcut="'+'"
-                        padding="xs"
-                        @click="
-                            () => {
-                                documentDialogRef.show = true;
-                                delete documentDialogRef.dms;
-                            }
-                        "
-                        data-cy="dms-create"
-                    >
-                        <QTooltip>{{ t('Create document') }}</QTooltip>
-                    </QBtn>
-                </div>
+                <VnDmsInput :data="data" :formRef="invoiceInRef" />
             </VnRow>
             <VnRow>
                 <VnSelect
@@ -264,29 +169,6 @@ function deleteFile(dmsFk) {
             </VnRow>
         </template>
     </FormModel>
-    <QDialog v-model="documentDialogRef.show">
-        <VnDms
-            model="dms"
-            default-dms-code="invoiceIn"
-            :form-initial-data="documentDialogRef.dms"
-            :url="
-                documentDialogRef.dms
-                    ? `Dms/${documentDialogRef.dms.id}/updateFile`
-                    : 'Dms/uploadFile'
-            "
-            :description="documentDialogRef.supplierName"
-            @on-data-saved="
-                (_, { data }) => {
-                    let dmsData = data;
-                    if (Array.isArray(data)) dmsData = data[0];
-                    invoiceInRef.formData.dmsFk = dmsData.id;
-                    invoiceInRef.formData.dms = dmsData;
-                    invoiceInRef.hasChanges = true;
-                    invoiceInRef.save();
-                }
-            "
-        />
-    </QDialog>
 </template>
 <style lang="scss" scoped>
 @media (max-width: $breakpoint-xs) {
diff --git a/src/pages/Travel/Card/TravelBasicData.vue b/src/pages/Travel/Card/TravelBasicData.vue
index b1adc8126..a6ef8ad19 100644
--- a/src/pages/Travel/Card/TravelBasicData.vue
+++ b/src/pages/Travel/Card/TravelBasicData.vue
@@ -36,7 +36,7 @@ const warehousesOptionsIn = ref([]);
         auto-load
         :filter="{ where: { isDestiny: TRUE } }"
     />
-    <FormModel :url-update="`Travels/${route.params.id}`" model="Travel" auto-load>
+    <FormModel :url-update="`Travels/${route.params.id}`" model="Travel">
         <template #form="{ data }">
             <VnRow>
                 <VnInput v-model="data.ref" :label="t('globals.reference')" />
@@ -57,8 +57,8 @@ const warehousesOptionsIn = ref([]);
             <VnRow>
                 <VnInputDate
                     v-model="data.availabled"
-                    :label="t('travel.summary.availabled')" 
-                    />
+                    :label="t('travel.summary.availabled')"
+                />
                 <VnInputTime
                     v-model="data.availabled"
                     :label="t('travel.summary.availabledHour')"
@@ -96,6 +96,7 @@ const warehousesOptionsIn = ref([]);
                         </QIcon>
                     </template>
                 </VnInput>
+                <VnInput v-model="data.awbFk" :label="t('travel.awbFk')" />
             </VnRow>
             <VnRow>
                 <QCheckbox v-model="data.isRaid" :label="t('travel.basicData.isRaid')" />
diff --git a/src/pages/Travel/Card/TravelFilter.js b/src/pages/Travel/Card/TravelFilter.js
index 05436834f..0799e449c 100644
--- a/src/pages/Travel/Card/TravelFilter.js
+++ b/src/pages/Travel/Card/TravelFilter.js
@@ -12,6 +12,7 @@ export default {
         'isRaid',
         'daysInForward',
         'availabled',
+        'awbFk',
     ],
     include: [
         {

From a39f648da045428d1eec2b371d9fc54c9b511fcb Mon Sep 17 00:00:00 2001
From: pablone <pablone@verdnatura.es>
Date: Fri, 21 Mar 2025 13:25:17 +0100
Subject: [PATCH 23/44] fix: refs #8638 update comment formatting in
 VnTable.vue

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

diff --git a/src/components/VnTable/VnTable.vue b/src/components/VnTable/VnTable.vue
index 9ad032ee5..8f64dc857 100644
--- a/src/components/VnTable/VnTable.vue
+++ b/src/components/VnTable/VnTable.vue
@@ -895,7 +895,7 @@ const rowCtrlClickFunction = computed(() => {
                                         {{ row[splittedColumns.title.name] }}
                                     </span>
                                 </QCardSection>
-                                <!-- Fields -->
+                                <!-- Fields  -->
                                 <QCardSection
                                     class="q-pl-sm q-py-xs"
                                     :class="$props.cardClass"

From eb6046f3382b9500563fd3676669931247babb25 Mon Sep 17 00:00:00 2001
From: pablone <pablone@verdnatura.es>
Date: Fri, 21 Mar 2025 13:28:22 +0100
Subject: [PATCH 24/44] fix: refs #8638 restore invoiceInBasicData

---
 .../InvoiceIn/Card/InvoiceInBasicData.vue     | 122 +++++++++++++++++-
 1 file changed, 120 insertions(+), 2 deletions(-)

diff --git a/src/pages/InvoiceIn/Card/InvoiceInBasicData.vue b/src/pages/InvoiceIn/Card/InvoiceInBasicData.vue
index 0995b75b9..905ddebb2 100644
--- a/src/pages/InvoiceIn/Card/InvoiceInBasicData.vue
+++ b/src/pages/InvoiceIn/Card/InvoiceInBasicData.vue
@@ -2,18 +2,24 @@
 import { ref, computed } from 'vue';
 import { useRoute } from 'vue-router';
 import { useI18n } from 'vue-i18n';
+import { useQuasar } from 'quasar';
+import { downloadFile } from 'src/composables/downloadFile';
 import FormModel from 'components/FormModel.vue';
 import VnSelect from 'src/components/common/VnSelect.vue';
 import FetchData from 'src/components/FetchData.vue';
 import VnRow from 'components/ui/VnRow.vue';
 import VnInputDate from 'src/components/common/VnInputDate.vue';
 import VnInput from 'src/components/common/VnInput.vue';
+import VnDms from 'src/components/common/VnDms.vue';
+import VnConfirm from 'src/components/ui/VnConfirm.vue';
+import axios from 'axios';
 import VnSelectSupplier from 'src/components/common/VnSelectSupplier.vue';
-import VnDmsInput from 'src/components/common/VnDmsInput.vue';
 
 const { t } = useI18n();
 
 const route = useRoute();
+const quasar = useQuasar();
+const editDownloadDisabled = ref(false);
 const userConfig = ref(null);
 const invoiceId = computed(() => +route.params.id);
 
@@ -31,6 +37,24 @@ const allowedContentTypes = ref([]);
 const sageWithholdings = ref([]);
 const documentDialogRef = ref({});
 const invoiceInRef = ref({});
+
+function deleteFile(dmsFk) {
+    quasar
+        .dialog({
+            component: VnConfirm,
+            componentProps: {
+                title: t('globals.confirmDeletion'),
+                message: t('globals.confirmDeletionMessage'),
+            },
+        })
+        .onOk(async () => {
+            await axios.post(`dms/${dmsFk}/removeFile`);
+            invoiceInRef.value.formData.dmsFk = null;
+            invoiceInRef.value.formData.dms = undefined;
+            invoiceInRef.value.hasChanges = true;
+            invoiceInRef.value.save();
+        });
+}
 </script>
 <template>
     <FetchData
@@ -133,7 +157,78 @@ const invoiceInRef = ref({});
                         </QItem>
                     </template>
                 </VnSelect>
-                <VnDmsInput :data="data" :formRef="invoiceInRef" />
+
+                <div class="row no-wrap">
+                    <VnInput
+                        :label="t('Document')"
+                        v-model="data.dmsFk"
+                        clearable
+                        clear-icon="close"
+                        class="full-width"
+                        :disable="true"
+                    />
+                    <div
+                        v-if="data.dmsFk"
+                        class="row no-wrap q-pa-xs q-gutter-x-xs"
+                        data-cy="dms-buttons"
+                    >
+                        <QBtn
+                            :class="{
+                                'no-pointer-events': editDownloadDisabled,
+                            }"
+                            :disable="editDownloadDisabled"
+                            icon="cloud_download"
+                            :title="t('Download file')"
+                            padding="xs"
+                            round
+                            @click="downloadFile(data.dmsFk)"
+                        />
+                        <QBtn
+                            :class="{
+                                'no-pointer-events': editDownloadDisabled,
+                            }"
+                            :disable="editDownloadDisabled"
+                            icon="edit"
+                            round
+                            padding="xs"
+                            @click="
+                                () => {
+                                    documentDialogRef.show = true;
+                                    documentDialogRef.dms = data.dms;
+                                }
+                            "
+                        >
+                            <QTooltip>{{ t('Edit document') }}</QTooltip>
+                        </QBtn>
+                        <QBtn
+                            :class="{
+                                'no-pointer-events': editDownloadDisabled,
+                            }"
+                            :disable="editDownloadDisabled"
+                            icon="delete"
+                            :title="t('Delete file')"
+                            padding="xs"
+                            round
+                            @click="deleteFile(data.dmsFk)"
+                        />
+                    </div>
+                    <QBtn
+                        v-else
+                        icon="add_circle"
+                        round
+                        v-shortcut="'+'"
+                        padding="xs"
+                        @click="
+                            () => {
+                                documentDialogRef.show = true;
+                                delete documentDialogRef.dms;
+                            }
+                        "
+                        data-cy="dms-create"
+                    >
+                        <QTooltip>{{ t('Create document') }}</QTooltip>
+                    </QBtn>
+                </div>
             </VnRow>
             <VnRow>
                 <VnSelect
@@ -169,6 +264,29 @@ const invoiceInRef = ref({});
             </VnRow>
         </template>
     </FormModel>
+    <QDialog v-model="documentDialogRef.show">
+        <VnDms
+            model="dms"
+            default-dms-code="invoiceIn"
+            :form-initial-data="documentDialogRef.dms"
+            :url="
+                documentDialogRef.dms
+                    ? `Dms/${documentDialogRef.dms.id}/updateFile`
+                    : 'Dms/uploadFile'
+            "
+            :description="documentDialogRef.supplierName"
+            @on-data-saved="
+                (_, { data }) => {
+                    let dmsData = data;
+                    if (Array.isArray(data)) dmsData = data[0];
+                    invoiceInRef.formData.dmsFk = dmsData.id;
+                    invoiceInRef.formData.dms = dmsData;
+                    invoiceInRef.hasChanges = true;
+                    invoiceInRef.save();
+                }
+            "
+        />
+    </QDialog>
 </template>
 <style lang="scss" scoped>
 @media (max-width: $breakpoint-xs) {

From ee4e181777f6e2abaf450cd5ff9e5ee692baf7e4 Mon Sep 17 00:00:00 2001
From: Javier Segarra <jsegarra@verdnatura.es>
Date: Fri, 21 Mar 2025 13:46:38 +0100
Subject: [PATCH 25/44] fix: refs #8131 remove unnecessary 'is-' prefix from
 v-model bindings in filter components

---
 src/components/ItemsFilterPanel.vue               | 1 -
 src/pages/Order/Card/CatalogFilterValueDialog.vue | 1 -
 2 files changed, 2 deletions(-)

diff --git a/src/components/ItemsFilterPanel.vue b/src/components/ItemsFilterPanel.vue
index 3c689750a..0f1e3f1eb 100644
--- a/src/components/ItemsFilterPanel.vue
+++ b/src/components/ItemsFilterPanel.vue
@@ -262,7 +262,6 @@ const setCategoryList = (data) => {
                         v-model="value.value"
                         :label="t('components.itemsFilterPanel.value')"
                         :disable="!value"
-                        is-
                         :is-clearable="false"
                         @keyup.enter="applyTags(params, searchFn)"
                     />
diff --git a/src/pages/Order/Card/CatalogFilterValueDialog.vue b/src/pages/Order/Card/CatalogFilterValueDialog.vue
index e9a556270..10273a254 100644
--- a/src/pages/Order/Card/CatalogFilterValueDialog.vue
+++ b/src/pages/Order/Card/CatalogFilterValueDialog.vue
@@ -90,7 +90,6 @@ const getSelectedTagValues = async (tag) => {
                         v-model="value.value"
                         :label="t('components.itemsFilterPanel.value')"
                         :disable="!value"
-                        is-
                         class="col"
                         data-cy="catalogFilterValueDialogValueInput"
                     />

From c5e1ebec82478f5298fa707f17bcaecdfeda46e2 Mon Sep 17 00:00:00 2001
From: pablone <pablone@verdnatura.es>
Date: Fri, 21 Mar 2025 13:51:05 +0100
Subject: [PATCH 26/44] fix: refs #8638 update null check for maxlength
 validation in VnInput.vue

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

diff --git a/src/components/common/VnInput.vue b/src/components/common/VnInput.vue
index 9821992cb..474d68116 100644
--- a/src/components/common/VnInput.vue
+++ b/src/components/common/VnInput.vue
@@ -84,7 +84,7 @@ const mixinRules = [
     ...($attrs.rules ?? []),
     (val) => {
         const maxlength = $props.maxlength;
-        if (maxlength && +val.length > maxlength)
+        if (maxlength && +val?.length > maxlength)
             return t(`maxLength`, { value: maxlength });
         const { min, max } = vnInputRef.value.$attrs;
         if (!min) return null;

From 7e0ca4ce6d539889e10d6c8da9dccca36b659379 Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Fri, 21 Mar 2025 13:54:56 +0100
Subject: [PATCH 27/44] test: refs #5926 simplify test

---
 src/composables/__tests__/downloadFile.spec.js | 11 ++++++-----
 src/pages/Worker/Card/WorkerPda.vue            |  3 ++-
 2 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/src/composables/__tests__/downloadFile.spec.js b/src/composables/__tests__/downloadFile.spec.js
index f53b56b3e..f83a973b0 100644
--- a/src/composables/__tests__/downloadFile.spec.js
+++ b/src/composables/__tests__/downloadFile.spec.js
@@ -6,10 +6,12 @@ const session = useSession();
 const token = session.getToken();
 
 describe('downloadFile', () => {
-    const baseUrl = 'http://localhost:9000';
     let defaulCreateObjectURL;
 
     beforeAll(() => {
+        vi.mock('src/composables/getUrl', () => ({
+            getUrl: vi.fn().mockResolvedValue(''),
+        }));
         defaulCreateObjectURL = window.URL.createObjectURL;
         window.URL.createObjectURL = vi.fn(() => 'blob:http://localhost:9000/blob-id');
     });
@@ -22,15 +24,14 @@ describe('downloadFile', () => {
             headers: { 'content-disposition': 'attachment; filename="test-file.txt"' },
         };
         vi.spyOn(axios, 'get').mockImplementation((url) => {
-            if (url == 'Urls/getUrl') return Promise.resolve({ data: baseUrl });
-            else if (url.includes('downloadFile')) return Promise.resolve(res);
+            if (url.includes('downloadFile')) return Promise.resolve(res);
         });
 
         await downloadFile(1);
 
         expect(axios.get).toHaveBeenCalledWith(
-            `${baseUrl}/api/dms/1/downloadFile?access_token=${token}`,
-            { responseType: 'blob' }
+            `/api/dms/1/downloadFile?access_token=${token}`,
+            { responseType: 'blob' },
         );
     });
 });
diff --git a/src/pages/Worker/Card/WorkerPda.vue b/src/pages/Worker/Card/WorkerPda.vue
index 27313e52c..001eb368a 100644
--- a/src/pages/Worker/Card/WorkerPda.vue
+++ b/src/pages/Worker/Card/WorkerPda.vue
@@ -210,7 +210,6 @@ function isSigned(row) {
                     openConfirmationModal(
                         t('Sign PDA'),
                         t('Are you sure you want to send it?'),
-
                         () => sendToTablet([row]),
                     )
                 "
@@ -306,4 +305,6 @@ es:
     Do you want to remove this PDA?: ¿Desea eliminar este PDA?
     You can only have one PDA: Solo puedes tener un PDA si no eres autonomo
     This PDA is already assigned to another user: Este PDA ya está asignado a otro usuario
+    Are you sure you want to send it?: ¿Seguro que quieres enviarlo?
+    Sign PDA: Firmar PDA
 </i18n>

From 39e0f8838090fb1ca3fc3b3a0b1e43b30c222550 Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Fri, 21 Mar 2025 14:17:22 +0100
Subject: [PATCH 28/44] refactor: refs #8463 remove unnecessary expose of
 getData in VnDescriptor component

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

diff --git a/src/components/ui/VnDescriptor.vue b/src/components/ui/VnDescriptor.vue
index c4cae7f61..1cb3b57ad 100644
--- a/src/components/ui/VnDescriptor.vue
+++ b/src/components/ui/VnDescriptor.vue
@@ -39,7 +39,6 @@ const { viewSummary } = useSummaryDialog();
 const DESCRIPTOR_PROXY = 'DescriptorProxy';
 const moduleName = ref();
 const isSameModuleName = route.matched[1].meta.moduleName !== moduleName.value;
-defineExpose({ getData });
 
 function getName() {
     let name = $props.dataKey;

From 057a2520c0d776c10f3f9903d3bb5511b7494dff Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Sun, 23 Mar 2025 07:21:17 +0100
Subject: [PATCH 29/44] test(WorkerPda): refs #5926 unify send and download e2e

---
 .../integration/worker/workerPda.spec.js      | 47 +++++++++----------
 1 file changed, 22 insertions(+), 25 deletions(-)

diff --git a/test/cypress/integration/worker/workerPda.spec.js b/test/cypress/integration/worker/workerPda.spec.js
index d00a81ffc..8c539cf70 100644
--- a/test/cypress/integration/worker/workerPda.spec.js
+++ b/test/cypress/integration/worker/workerPda.spec.js
@@ -13,7 +13,8 @@ describe('WorkerPda', () => {
         cy.checkNotification('PDA deallocated');
     });
 
-    it('send to docuware', () => {
+    it('send and download pdf to docuware', () => {
+        //Send
         cy.intercept('POST', '/api/Docuwares/upload-pda-pdf', (req) => {
             req.reply({
                 statusCode: 200,
@@ -22,10 +23,30 @@ describe('WorkerPda', () => {
         });
 
         creatNewPDA();
+
         cy.dataCy('workerPda-send').click();
         confirmButton();
         cy.checkNotification('PDF sended to signed');
 
+        //Download
+        cy.intercept('POST', /\/api\/Docuwares\/Jones%20Jessica\/checkFile/, (req) => {
+            req.reply({
+                statusCode: 200,
+                body: {
+                    id: deviceId,
+                    state: 'Firmado',
+                },
+            });
+        });
+        cy.get('#st-actions').contains('refresh').click();
+        cy.intercept('GET', '/api/Docuwares/download-pda-pdf**', (req) => {
+            req.reply({
+                statusCode: 200,
+                body: {},
+            });
+        });
+
+        cy.dataCy('workerPda-download').click();
         removeNewPDA();
     });
 
@@ -48,30 +69,6 @@ describe('WorkerPda', () => {
         removeNewPDA();
     });
 
-    it('download file', () => {
-        cy.intercept('POST', /\/api\/Docuwares\/Jones%20Jessica\/checkFile/, (req) => {
-            req.reply({
-                statusCode: 200,
-                body: {
-                    id: deviceId,
-                    state: 'Firmado',
-                },
-            });
-        });
-
-        cy.intercept('GET', '/api/Docuwares/download-pda-pdf**', (req) => {
-            req.reply({
-                statusCode: 200,
-                body: {},
-            });
-        });
-        cy.get('#st-actions').contains('refresh').click();
-
-        creatNewPDA();
-        cy.dataCy('workerPda-download').click();
-        removeNewPDA();
-    });
-
     function creatNewPDA(id = deviceId) {
         cy.addBtnClick();
         cy.selectOption('[data-cy="pda-dialog-select"]', id);

From 71c91c295cf43554fc980dc8f4c131adda9a9e97 Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Sun, 23 Mar 2025 07:22:30 +0100
Subject: [PATCH 30/44] test(WorkerPda): refs #5926 replace confirmButton
 function with cy.clickConfirm for consistency

---
 test/cypress/integration/worker/workerPda.spec.js | 12 +++---------
 1 file changed, 3 insertions(+), 9 deletions(-)

diff --git a/test/cypress/integration/worker/workerPda.spec.js b/test/cypress/integration/worker/workerPda.spec.js
index 8c539cf70..5d4496f18 100644
--- a/test/cypress/integration/worker/workerPda.spec.js
+++ b/test/cypress/integration/worker/workerPda.spec.js
@@ -25,7 +25,7 @@ describe('WorkerPda', () => {
         creatNewPDA();
 
         cy.dataCy('workerPda-send').click();
-        confirmButton();
+        cy.clickConfirm();
         cy.checkNotification('PDF sended to signed');
 
         //Download
@@ -63,7 +63,7 @@ describe('WorkerPda', () => {
         cy.selectRows([1, 2]);
         cy.get('#st-actions').contains('Send').click();
 
-        confirmButton();
+        cy.clickConfirm();
         cy.checkNotification('PDF sended to signed');
 
         removeNewPDA();
@@ -77,12 +77,6 @@ describe('WorkerPda', () => {
 
     function removeNewPDA() {
         cy.dataCy('workerPda-remove').first().click();
-        confirmButton();
-    }
-
-    function confirmButton() {
-        cy.get(
-            '.q-card__actions > .q-btn--unelevated > .q-btn__content > .block',
-        ).click();
+        cy.clickConfirm();
     }
 });

From 8bdd581764af3a1e1f1240ab045fa65c60188053 Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Sun, 23 Mar 2025 07:30:05 +0100
Subject: [PATCH 31/44] feat: refs #8463 add module prop to VnDescriptor
 component for enhanced functionality

---
 src/components/ui/VnDescriptor.vue | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/src/components/ui/VnDescriptor.vue b/src/components/ui/VnDescriptor.vue
index 1cb3b57ad..7a2347aa5 100644
--- a/src/components/ui/VnDescriptor.vue
+++ b/src/components/ui/VnDescriptor.vue
@@ -25,6 +25,10 @@ const $props = defineProps({
         type: String,
         default: 'md-width',
     },
+    module: {
+        type: String,
+        default: null,
+    },
     toModule: {
         type: String,
         default: null,
@@ -41,8 +45,8 @@ const moduleName = ref();
 const isSameModuleName = route.matched[1].meta.moduleName !== moduleName.value;
 
 function getName() {
-    let name = $props.dataKey;
-    if ($props.dataKey.includes(DESCRIPTOR_PROXY)) {
+    let name = $props.module;
+    if ($props.module.includes(DESCRIPTOR_PROXY)) {
         name = name.split(DESCRIPTOR_PROXY)[0];
     }
     return name;

From aa3f14e875301ac855d893c6cfd944c7b595e7eb Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Sun, 23 Mar 2025 09:17:43 +0100
Subject: [PATCH 32/44] test(WorkerPda): refs #5926 remove redundant
 cy.clickConfirm call for streamlined flow

---
 test/cypress/integration/worker/workerPda.spec.js | 2 --
 1 file changed, 2 deletions(-)

diff --git a/test/cypress/integration/worker/workerPda.spec.js b/test/cypress/integration/worker/workerPda.spec.js
index 5d4496f18..2623e81cf 100644
--- a/test/cypress/integration/worker/workerPda.spec.js
+++ b/test/cypress/integration/worker/workerPda.spec.js
@@ -62,8 +62,6 @@ describe('WorkerPda', () => {
         creatNewPDA(2);
         cy.selectRows([1, 2]);
         cy.get('#st-actions').contains('Send').click();
-
-        cy.clickConfirm();
         cy.checkNotification('PDF sended to signed');
 
         removeNewPDA();

From 944a70be478a67ea953d1b9e4ccccdd43c205d4a Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Sun, 23 Mar 2025 09:27:55 +0100
Subject: [PATCH 33/44] feat: refs #8463 update data-cy attributes in
 VnDescriptor for improved testing and consistency

---
 src/components/ui/VnDescriptor.vue | 28 ++++++++++++++++++++--------
 test/cypress/support/commands.js   | 10 +++++-----
 2 files changed, 25 insertions(+), 13 deletions(-)

diff --git a/src/components/ui/VnDescriptor.vue b/src/components/ui/VnDescriptor.vue
index 7a2347aa5..47da98d74 100644
--- a/src/components/ui/VnDescriptor.vue
+++ b/src/components/ui/VnDescriptor.vue
@@ -106,7 +106,7 @@ const toModule = computed(() => {
 </script>
 
 <template>
-    <div class="descriptor">
+    <div class="descriptor" data-cy="vnDescriptor">
         <template v-if="entity && entity?.id">
             <div class="header bg-primary q-pa-sm justify-between">
                 <slot name="header-extra-action">
@@ -153,7 +153,7 @@ const toModule = computed(() => {
                         data-cy="goToSummaryBtn"
                     >
                         <QTooltip>
-                            {{ t('components.cardDescriptor.summary') }}
+                            {{ t('components.vnDescriptor.summary') }}
                         </QTooltip>
                     </QBtn>
                 </RouterLink>
@@ -168,18 +168,27 @@ const toModule = computed(() => {
                 <QList dense>
                     <QItemLabel header class="ellipsis text-h5" :lines="1">
                         <div class="title">
-                            <span v-if="title" :title="getValueFromPath(title)">
+                            <span
+                                v-if="title"
+                                :title="getValueFromPath(title)"
+                                :data-cy="`${$attrs['data-cy'] ?? 'vnDescriptor'}_title`"
+                            >
                                 {{ getValueFromPath(title) ?? title }}
                             </span>
                             <slot v-else name="description" :entity="entity">
-                                <span :title="entity.name">
-                                    {{ entity.name }}
-                                </span>
+                                <span
+                                    :title="entity.name"
+                                    :data-cy="`${$attrs['data-cy'] ?? 'vnDescriptor'}_description`"
+                                    v-text="entity.name"
+                                />
                             </slot>
                         </div>
                     </QItemLabel>
                     <QItem>
-                        <QItemLabel class="subtitle">
+                        <QItemLabel
+                            class="subtitle"
+                            :data-cy="`${$attrs['data-cy'] ?? 'vnDescriptor'}_subtitle`"
+                        >
                             #{{ getValueFromPath(subtitle) ?? entity.id }}
                         </QItemLabel>
                         <QBtn
@@ -197,7 +206,10 @@ const toModule = computed(() => {
                         </QBtn>
                     </QItem>
                 </QList>
-                <div class="list-box q-mt-xs">
+                <div
+                    class="list-box q-mt-xs"
+                    :data-cy="`${$attrs['data-cy'] ?? 'vnDescriptor'}_listbox`"
+                >
                     <slot name="body" :entity="entity" />
                 </div>
             </div>
diff --git a/test/cypress/support/commands.js b/test/cypress/support/commands.js
index de25959b2..fe8d38e79 100755
--- a/test/cypress/support/commands.js
+++ b/test/cypress/support/commands.js
@@ -371,7 +371,7 @@ Cypress.Commands.add('validateContent', (selector, expectedValue) => {
 });
 
 Cypress.Commands.add('openActionsDescriptor', () => {
-    cy.get('[data-cy="cardDescriptor"] [data-cy="descriptor-more-opts"]').click();
+    cy.get('[data-cy="vnDescriptor"] [data-cy="descriptor-more-opts"]').click();
 });
 
 Cypress.Commands.add('openUserPanel', () => {
@@ -466,16 +466,16 @@ Cypress.Commands.add('validateDescriptor', (toCheck = {}) => {
 
     const popupSelector = popup ? '[role="menu"] ' : '';
 
-    if (title) cy.get(`${popupSelector}[data-cy="cardDescriptor_title"]`).contains(title);
+    if (title) cy.get(`${popupSelector}[data-cy="vnDescriptor_title"]`).contains(title);
     if (description)
-        cy.get(`${popupSelector}[data-cy="cardDescriptor_description"]`).contains(
+        cy.get(`${popupSelector}[data-cy="vnDescriptor_description"]`).contains(
             description,
         );
     if (subtitle)
-        cy.get(`${popupSelector}[data-cy="cardDescriptor_subtitle"]`).contains(subtitle);
+        cy.get(`${popupSelector}[data-cy="vnDescriptor_subtitle"]`).contains(subtitle);
 
     for (const index in listbox)
-        cy.get(`${popupSelector}[data-cy="cardDescriptor_listbox"] > *`)
+        cy.get(`${popupSelector}[data-cy="vnDescriptor_listbox"] > *`)
             .eq(index)
             .should('contain.text', listbox[index]);
 });

From 17cadc7ee78b38a3649e68e2b643c3fb3a271488 Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Sun, 23 Mar 2025 10:59:44 +0100
Subject: [PATCH 34/44] fix: refs #8463 update data-cy attribute in VnLog test
 for consistency with VnDescriptor

---
 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 e857457a7..ae0013150 100644
--- a/test/cypress/integration/vnComponent/VnLog.spec.js
+++ b/test/cypress/integration/vnComponent/VnLog.spec.js
@@ -25,7 +25,7 @@ describe('VnLog', () => {
 
     it('should show claimDescriptor', () => {
         cy.dataCy('iconLaunch-claimFk').first().click();
-        cy.dataCy('cardDescriptor_subtitle').contains('1');
+        cy.dataCy('vnDescriptor_subtitle').contains('1');
         cy.dataCy('iconLaunch-claimFk').first().click();
     });
 });

From bfa375bacd0a8c5efff6831e555d9a58dcfe7270 Mon Sep 17 00:00:00 2001
From: pablone <pablone@verdnatura.es>
Date: Mon, 24 Mar 2025 08:22:13 +0100
Subject: [PATCH 35/44] feat: refs #8638 add data attributes for transfer buys
 functionality in EntryBuys.vue and corresponding tests

---
 src/pages/Entry/Card/EntryBuys.vue                         | 4 +++-
 test/cypress/integration/entry/entryCard/entryBuys.spec.js | 5 +++++
 2 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/src/pages/Entry/Card/EntryBuys.vue b/src/pages/Entry/Card/EntryBuys.vue
index 85da5cf1d..67f97e09d 100644
--- a/src/pages/Entry/Card/EntryBuys.vue
+++ b/src/pages/Entry/Card/EntryBuys.vue
@@ -596,6 +596,7 @@ onMounted(() => {
                 icon="move_group"
                 color="primary"
                 :title="t('Transfer buys')"
+                data-cy="transferBuys"
                 flat
                 @click="dialogRef = true"
                 :disable="!selectedRows.length"
@@ -610,7 +611,7 @@ onMounted(() => {
                             v-model="newEntryRef"
                             :label="t('Entry')"
                             type="number"
-                            data-cy="transfer-buy-entry"
+                            data-cy="entryDestinyInput"
                         />
                     </QCardSection>
                     <QCardSection>
@@ -623,6 +624,7 @@ onMounted(() => {
                             />
                             <QBtn
                                 label="Transfer"
+                                data-cy="transferBuysBtn"
                                 flat
                                 color="primary"
                                 @click="transferBuys(selectedRows, newEntryRef)"
diff --git a/test/cypress/integration/entry/entryCard/entryBuys.spec.js b/test/cypress/integration/entry/entryCard/entryBuys.spec.js
index f8f5e6b80..b5e185a8e 100644
--- a/test/cypress/integration/entry/entryCard/entryBuys.spec.js
+++ b/test/cypress/integration/entry/entryCard/entryBuys.spec.js
@@ -80,6 +80,11 @@ describe('EntryBuys', () => {
         checkColor('amount', COLORS.positive);
         cy.saveCard();
 
+        cy.get('tbody > tr [tabindex="0"][role="checkbox"]').click();
+        cy.dataCy('transferBuys').should('be.enabled').click();
+        cy.dataCy('entryDestinyInput').should('be.visible').type('100');
+        cy.dataCy('transferBuysBtn').click();
+
         cy.deleteEntry();
     });
 

From 933736e06be2d26328599954c7e2878c5cd574a4 Mon Sep 17 00:00:00 2001
From: provira <provira@verdnatura.es>
Date: Mon, 24 Mar 2025 09:22:51 +0100
Subject: [PATCH 36/44] feat: refs #8237 changed observation type to be
 SalesPerson by default

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

diff --git a/src/components/ui/VnNotes.vue b/src/components/ui/VnNotes.vue
index 6ce28254d..a0621dc1d 100644
--- a/src/components/ui/VnNotes.vue
+++ b/src/components/ui/VnNotes.vue
@@ -154,6 +154,7 @@ function fetchData([data]) {
                     filled
                     size="lg"
                     autogrow
+                    autofocus
                     @keyup.enter.stop="handleClick"
                     :required="isRequired"
                     clearable
@@ -189,7 +190,7 @@ function fetchData([data]) {
         :search-url="false"
         @on-fetch="
             newNote.text = '';
-            newNote.observationTypeFk = null;
+            newNote.observationTypeFk = 4;
         "
     >
         <template #body="{ rows }">

From 2bdebc1e0d2a0f14fab2f5f4fa2c43782a783de9 Mon Sep 17 00:00:00 2001
From: Javier Segarra <jsegarra@verdnatura.es>
Date: Mon, 24 Mar 2025 09:27:35 +0100
Subject: [PATCH 37/44] test: waitSpinner() when load dialog

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

diff --git a/test/cypress/integration/ticket/ticketList.spec.js b/test/cypress/integration/ticket/ticketList.spec.js
index a3d8fe908..5613a5854 100644
--- a/test/cypress/integration/ticket/ticketList.spec.js
+++ b/test/cypress/integration/ticket/ticketList.spec.js
@@ -35,7 +35,7 @@ describe('TicketList', () => {
         cy.get('.summaryBody').should('exist');
     });
 
-    it.skip('filter client and create ticket', () => {
+    it('filter client and create ticket', () => {
         cy.intercept('GET', /\/api\/Tickets\/filter/).as('ticketSearchbar');
         searchResults();
         cy.wait('@ticketSearchbar');
@@ -44,6 +44,7 @@ describe('TicketList', () => {
         cy.dataCy('Customer ID_input').type('1101{enter}');
 
         cy.get('[data-cy="vnTableCreateBtn"] > .q-btn__content > .q-icon').click();
+        cy.waitSpinner();
         cy.dataCy('Customer_select').should('have.value', 'Bruce Wayne');
         cy.dataCy('Address_select').click();
 

From 61cc8f0813d84a780742ecf6ea86e2c4a484c7f5 Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Mon, 24 Mar 2025 09:30:09 +0100
Subject: [PATCH 38/44] fix: remove unused VnIconLink component from VnLog.vue

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

diff --git a/src/components/common/VnLog.vue b/src/components/common/VnLog.vue
index 136dbf2a4..d29999d45 100644
--- a/src/components/common/VnLog.vue
+++ b/src/components/common/VnLog.vue
@@ -619,7 +619,6 @@ watch(
                                                         :value="prop.val.val"
                                                         :name="prop.name"
                                                     />
-                                                    <VnIconLink />
                                                     <span
                                                         v-if="
                                                             propIndex <

From 4caca33606660668202034b6c89c817c67ed2c90 Mon Sep 17 00:00:00 2001
From: jorgep <jorgep@verdnatura.es>
Date: Mon, 24 Mar 2025 10:44:01 +0100
Subject: [PATCH 39/44] fix: refs #8581 update invoiceInSerial test to
 correctly compare totals after filtering

---
 .../invoiceIn/invoiceInSerial.spec.js            | 16 +++++++++-------
 1 file changed, 9 insertions(+), 7 deletions(-)

diff --git a/test/cypress/integration/invoiceIn/invoiceInSerial.spec.js b/test/cypress/integration/invoiceIn/invoiceInSerial.spec.js
index faad22f12..3750f8f06 100644
--- a/test/cypress/integration/invoiceIn/invoiceInSerial.spec.js
+++ b/test/cypress/integration/invoiceIn/invoiceInSerial.spec.js
@@ -10,14 +10,16 @@ describe('InvoiceInSerial', () => {
     });
 
     it('should filter by last days ', () => {
-        let before;
         cy.dataCy('vnTableCell_total')
             .invoke('text')
-            .then((total) => (before = +total));
-
-        cy.dataCy('Last days_input').type('{selectall}1{enter}');
-        cy.dataCy('vnTableCell_total')
-            .invoke('text')
-            .then((total) => expect(+total).to.be.lessThan(before));
+            .then((before) => {
+                cy.dataCy('Last days_input')
+                    .type('{selectall}1{enter}')
+                    .then(() => {
+                        cy.dataCy('vnTableCell_total')
+                            .invoke('text')
+                            .then((after) => expect(+after).to.be.lessThan(+before));
+                    });
+            });
     });
 });

From 798371682c6eede4de615913b50227f33b8db78e Mon Sep 17 00:00:00 2001
From: jorgep <jorgep@verdnatura.es>
Date: Mon, 24 Mar 2025 12:39:40 +0100
Subject: [PATCH 40/44] feat: refs #6919 enhance filter in AccountSummary
 component to include entity ID

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

diff --git a/src/pages/Account/Card/AccountSummary.vue b/src/pages/Account/Card/AccountSummary.vue
index f7a16e8c3..0b108807e 100644
--- a/src/pages/Account/Card/AccountSummary.vue
+++ b/src/pages/Account/Card/AccountSummary.vue
@@ -17,7 +17,7 @@ const entityId = computed(() => $props.id || route.params.id);
         data-key="Account"
         ref="AccountSummary"
         url="VnUsers/preview"
-        :filter="filter"
+        :filter="{ ...filter, where: { id: entityId } }"
     >
         <template #header="{ entity }">{{ entity.id }} - {{ entity.nickname }}</template>
         <template #menu>

From e1ef6f87f3f4c334d3e7f65cb6fc8617bf67dc24 Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Mon, 24 Mar 2025 14:01:43 +0100
Subject: [PATCH 41/44] feat: implement onBeforeSave function to handle form
 data updates

---
 src/pages/Claim/Card/ClaimBasicData.vue | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/src/pages/Claim/Card/ClaimBasicData.vue b/src/pages/Claim/Card/ClaimBasicData.vue
index 43941d1dc..7e7d42ae8 100644
--- a/src/pages/Claim/Card/ClaimBasicData.vue
+++ b/src/pages/Claim/Card/ClaimBasicData.vue
@@ -2,6 +2,7 @@
 import { ref } from 'vue';
 import { useRoute } from 'vue-router';
 import { useI18n } from 'vue-i18n';
+import { getDifferences, getUpdatedValues } from 'src/filters';
 import VnSelect from 'src/components/common/VnSelect.vue';
 import VnSelectEnum from 'src/components/common/VnSelectEnum.vue';
 import FetchData from 'components/FetchData.vue';
@@ -9,12 +10,18 @@ import FormModel from 'components/FormModel.vue';
 import VnRow from 'components/ui/VnRow.vue';
 import VnInput from 'src/components/common/VnInput.vue';
 import VnInputDate from 'components/common/VnInputDate.vue';
-
 import VnAvatar from 'src/components/ui/VnAvatar.vue';
 
 const route = useRoute();
 const { t } = useI18n();
 const workersOptions = ref([]);
+
+function onBeforeSave(formData, originalData) {
+    return getUpdatedValues(
+        Object.keys(getDifferences(formData, originalData)),
+        formData,
+    );
+}
 </script>
 <template>
     <FetchData
@@ -27,6 +34,7 @@ const workersOptions = ref([]);
     <FormModel
         model="Claim"
         :url-update="`Claims/updateClaim/${route.params.id}`"
+        :mapper="onBeforeSave"
         auto-load
     >
         <template #form="{ data, validate }">

From 293d51b7413b70e2f95bfe103b2059b86bf62b18 Mon Sep 17 00:00:00 2001
From: provira <provira@verdnatura.es>
Date: Mon, 24 Mar 2025 14:06:38 +0100
Subject: [PATCH 42/44] feat: refs #8237 #8237 modified fetch to find default
 select value by "code"

---
 src/components/ui/VnNotes.vue | 18 +++++++++++++++---
 1 file changed, 15 insertions(+), 3 deletions(-)

diff --git a/src/components/ui/VnNotes.vue b/src/components/ui/VnNotes.vue
index a0621dc1d..b7e6ccbec 100644
--- a/src/components/ui/VnNotes.vue
+++ b/src/components/ui/VnNotes.vue
@@ -40,6 +40,11 @@ const quasar = useQuasar();
 const newNote = reactive({ text: null, observationTypeFk: null });
 const observationTypes = ref([]);
 const vnPaginateRef = ref();
+
+const defaultObservationType = computed(() => 
+    observationTypes.value.find(ot => ot.code === 'salesPerson')?.id
+);
+
 let originalText;
 
 function handleClick(e) {
@@ -111,14 +116,22 @@ function fetchData([data]) {
     originalText = data?.notes;
     emit('onFetch', data);
 }
+
+const handleObservationTypes = (data) => {
+    observationTypes.value = data;
+    if(defaultObservationType.value) {
+        newNote.observationTypeFk = defaultObservationType.value;
+    }
+};
+
 </script>
 <template>
     <FetchData
         v-if="selectType"
         url="ObservationTypes"
-        :filter="{ fields: ['id', 'description'] }"
+        :filter="{ fields: ['id', 'description', 'code'] }"
         auto-load
-        @on-fetch="(data) => (observationTypes = data)"
+        @on-fetch="handleObservationTypes"
     />
     <FetchData
         v-if="justInput"
@@ -190,7 +203,6 @@ function fetchData([data]) {
         :search-url="false"
         @on-fetch="
             newNote.text = '';
-            newNote.observationTypeFk = 4;
         "
     >
         <template #body="{ rows }">

From 2a560e9548dffc848dfce5594c5490f328be00aa Mon Sep 17 00:00:00 2001
From: provira <provira@verdnatura.es>
Date: Mon, 24 Mar 2025 14:07:02 +0100
Subject: [PATCH 43/44] Merge branch '8237-defaultObservationType' of https:
 refs #8237//gitea.verdnatura.es/verdnatura/salix-front into
 8237-defaultObservationType

---
 src/components/ItemsFilterPanel.vue           |  10 +-
 src/components/VnTable/VnTable.vue            |   1 +
 src/components/common/VnCard.vue              |  26 +-
 src/components/common/VnLog.vue               |   9 +-
 .../common/__tests__/VnDmsList.spec.js        |  46 +-
 src/components/ui/CardDescriptor.vue          | 383 +----------------
 src/components/ui/EntityDescriptor.vue        |  78 ++++
 src/components/ui/VnDescriptor.vue            | 318 ++++++++++++++
 .../__tests__/downloadFile.spec.js            |  11 +-
 src/composables/downloadFile.js               |  20 +-
 src/i18n/locale/en.yml                        |   1 +
 src/i18n/locale/es.yml                        |   1 +
 src/pages/Account/AccountFilter.vue           |   7 +-
 src/pages/Account/Acls/AclFilter.vue          |  14 +-
 .../Account/Alias/Card/AliasDescriptor.vue    |   6 +-
 src/pages/Account/Card/AccountDescriptor.vue  |   6 +-
 src/pages/Account/Role/AccountRolesFilter.vue |   4 +-
 .../Account/Role/Card/RoleDescriptor.vue      |   6 +-
 src/pages/Claim/Card/ClaimDescriptor.vue      |   6 +-
 src/pages/Claim/ClaimFilter.vue               |  25 +-
 .../Customer/Card/CustomerDescriptor.vue      |   6 +-
 src/pages/Customer/CustomerFilter.vue         |  27 +-
 .../Defaulter/CustomerDefaulterFilter.vue     |  22 +-
 .../Payments/CustomerPaymentsFilter.vue       |  18 +-
 src/pages/Entry/Card/EntryDescriptor.vue      |   6 +-
 src/pages/Entry/EntryFilter.vue               |  34 +-
 .../InvoiceIn/Card/InvoiceInDescriptor.vue    |   6 +-
 src/pages/InvoiceIn/InvoiceInFilter.vue       |  31 +-
 .../Serial/InvoiceInSerialFilter.vue          |   6 +-
 .../InvoiceOut/Card/InvoiceOutDescriptor.vue  |   6 +-
 src/pages/InvoiceOut/InvoiceOutFilter.vue     |  23 +-
 src/pages/InvoiceOut/InvoiceOutGlobalForm.vue |  22 +-
 .../InvoiceOutNegativeBasesFilter.vue         |  22 +-
 src/pages/Item/Card/ItemDescriptor.vue        |   6 +-
 src/pages/Item/ItemFixedPriceFilter.vue       |  11 +-
 src/pages/Item/ItemListFilter.vue             |  31 +-
 src/pages/Item/ItemRequestFilter.vue          |  36 +-
 .../Item/ItemType/Card/ItemTypeDescriptor.vue |   6 +-
 .../Monitor/Ticket/MonitorTicketFilter.vue    |  45 +-
 .../Order/Card/CatalogFilterValueDialog.vue   |  10 +-
 src/pages/Order/Card/OrderCard.vue            |   4 +-
 src/pages/Order/Card/OrderCatalogFilter.vue   |  12 +-
 src/pages/Order/Card/OrderDescriptor.vue      |  18 +-
 src/pages/Order/Card/OrderDescriptorProxy.vue |   7 +-
 src/pages/Order/Card/OrderFilter.vue          |  25 +-
 .../Route/Agency/Card/AgencyDescriptor.vue    |   6 +-
 .../Route/Card/RouteAutonomousFilter.vue      |  35 +-
 src/pages/Route/Card/RouteDescriptor.vue      |   7 +-
 src/pages/Route/Card/RouteFilter.vue          |  22 +-
 src/pages/Route/Roadmap/RoadmapDescriptor.vue |   6 +-
 src/pages/Route/Roadmap/RoadmapFilter.vue     |  17 +-
 .../Route/Vehicle/Card/VehicleDescriptor.vue  |   6 +-
 .../Shelving/Card/ShelvingDescriptor.vue      |   6 +-
 src/pages/Shelving/Card/ShelvingFilter.vue    |   5 +-
 .../Parking/Card/ParkingDescriptor.vue        |   6 +-
 src/pages/Shelving/Parking/ParkingFilter.vue  |   9 +-
 .../Supplier/Card/SupplierBalanceFilter.vue   |   8 +-
 .../Card/SupplierConsumptionFilter.vue        |  25 +-
 .../Supplier/Card/SupplierDescriptor.vue      |   6 +-
 src/pages/Ticket/Card/TicketDescriptor.vue    |   6 +-
 .../Ticket/Negative/TicketLackFilter.vue      |  14 +-
 src/pages/Ticket/TicketAdvanceFilter.vue      |  18 +-
 src/pages/Ticket/TicketFilter.vue             |  50 +--
 src/pages/Ticket/TicketFutureFilter.vue       |  23 +-
 src/pages/Travel/Card/TravelDescriptor.vue    |   6 +-
 src/pages/Travel/ExtraCommunityFilter.vue     |  32 +-
 src/pages/Travel/TravelFilter.vue             |  34 +-
 .../Worker/Card/WorkerCalendarFilter.vue      |   8 +-
 src/pages/Worker/Card/WorkerDescriptor.vue    |   6 +-
 src/pages/Worker/Card/WorkerPda.vue           | 401 +++++++++++-------
 .../Department/Card/DepartmentDescriptor.vue  |   6 +-
 src/pages/Worker/WorkerFilter.vue             |  31 +-
 src/pages/Zone/Card/ZoneDescriptor.vue        |   6 +-
 src/pages/Zone/ZoneDeliveryPanel.vue          |   7 +-
 .../integration/vnComponent/VnLog.spec.js     |   2 +-
 .../integration/worker/workerPda.spec.js      |  83 +++-
 test/cypress/support/commands.js              |  10 +-
 77 files changed, 1178 insertions(+), 1147 deletions(-)
 create mode 100644 src/components/ui/EntityDescriptor.vue
 create mode 100644 src/components/ui/VnDescriptor.vue

diff --git a/src/components/ItemsFilterPanel.vue b/src/components/ItemsFilterPanel.vue
index f73753a6b..0f1e3f1eb 100644
--- a/src/components/ItemsFilterPanel.vue
+++ b/src/components/ItemsFilterPanel.vue
@@ -198,8 +198,7 @@ const setCategoryList = (data) => {
                         v-model="params.typeFk"
                         :options="itemTypesOptions"
                         dense
-                        outlined
-                        rounded
+                        filled
                         use-input
                         :disable="!selectedCategoryFk"
                         @update:model-value="
@@ -235,8 +234,7 @@ const setCategoryList = (data) => {
                         v-model="value.selectedTag"
                         :options="tagOptions"
                         dense
-                        outlined
-                        rounded
+                        filled
                         :emit-value="false"
                         use-input
                         :is-clearable="false"
@@ -252,8 +250,7 @@ const setCategoryList = (data) => {
                         option-value="value"
                         option-label="value"
                         dense
-                        outlined
-                        rounded
+                        filled
                         emit-value
                         use-input
                         :disable="!value"
@@ -265,7 +262,6 @@ const setCategoryList = (data) => {
                         v-model="value.value"
                         :label="t('components.itemsFilterPanel.value')"
                         :disable="!value"
-                        is-outlined
                         :is-clearable="false"
                         @keyup.enter="applyTags(params, searchFn)"
                     />
diff --git a/src/components/VnTable/VnTable.vue b/src/components/VnTable/VnTable.vue
index c64217198..e8dd1b526 100644
--- a/src/components/VnTable/VnTable.vue
+++ b/src/components/VnTable/VnTable.vue
@@ -633,6 +633,7 @@ const rowCtrlClickFunction = computed(() => {
                 :data-key="$attrs['data-key']"
                 :columns="columns"
                 :redirect="redirect"
+                v-bind="$attrs?.['table-filter']"
             >
                 <template
                     v-for="(_, slotName) in $slots"
diff --git a/src/components/common/VnCard.vue b/src/components/common/VnCard.vue
index 620dc2ad2..21cdc9df5 100644
--- a/src/components/common/VnCard.vue
+++ b/src/components/common/VnCard.vue
@@ -1,12 +1,15 @@
 <script setup>
-import { onBeforeMount } from 'vue';
-import { useRouter, onBeforeRouteUpdate, onBeforeRouteLeave } from 'vue-router';
+import { onBeforeMount, computed } from 'vue';
+import { useRoute, useRouter, onBeforeRouteUpdate, onBeforeRouteLeave } from 'vue-router';
 import { useArrayData } from 'src/composables/useArrayData';
 import { useStateStore } from 'stores/useStateStore';
 import useCardSize from 'src/composables/useCardSize';
 import VnSubToolbar from '../ui/VnSubToolbar.vue';
 
+const emit = defineEmits(['onFetch']);
+
 const props = defineProps({
+    id: { type: Number, required: false, default: null },
     dataKey: { type: String, required: true },
     url: { type: String, default: undefined },
     idInWhere: { type: Boolean, default: false },
@@ -16,10 +19,13 @@ const props = defineProps({
     searchDataKey: { type: String, default: undefined },
     searchbarProps: { type: Object, default: undefined },
     redirectOnError: { type: Boolean, default: false },
+    visual: { type: Boolean, default: true },
 });
 
+const route = useRoute();
 const stateStore = useStateStore();
 const router = useRouter();
+const entityId = computed(() => props.id || route?.params?.id);
 const arrayData = useArrayData(props.dataKey, {
     url: props.url,
     userFilter: props.filter,
@@ -35,7 +41,7 @@ onBeforeMount(async () => {
 
     const route = router.currentRoute.value;
     try {
-        await fetch(route.params.id);
+        await fetch(entityId.value);
     } catch {
         const { matched: matches } = route;
         const { path } = matches.at(-1);
@@ -51,8 +57,7 @@ onBeforeRouteUpdate(async (to, from) => {
             router.push({ name, params: to.params });
         }
     }
-    const id = to.params.id;
-    if (id !== from.params.id) await fetch(id, true);
+    if (entityId.value !== to.params.id) await fetch(to.params.id, true);
 });
 
 async function fetch(id, append = false) {
@@ -61,14 +66,17 @@ async function fetch(id, append = false) {
     else if (!regex.test(props.url)) arrayData.store.url = `${props.url}/${id}`;
     else arrayData.store.url = props.url.replace(regex, `/${id}`);
     await arrayData.fetch({ append, updateRouter: false });
+    emit('onFetch', arrayData.store.data);
 }
 function hasRouteParam(params, valueToCheck = ':addressId') {
     return Object.values(params).includes(valueToCheck);
 }
 </script>
 <template>
-    <VnSubToolbar />
-    <div :class="[useCardSize(), $attrs.class]">
-        <RouterView :key="$route.path" />
-    </div>
+    <template v-if="visual">
+        <VnSubToolbar />
+        <div :class="[useCardSize(), $attrs.class]">
+            <RouterView :key="$route.path" />
+        </div>
+    </template>
 </template>
diff --git a/src/components/common/VnLog.vue b/src/components/common/VnLog.vue
index 136dbf2a4..a05da264b 100644
--- a/src/components/common/VnLog.vue
+++ b/src/components/common/VnLog.vue
@@ -708,6 +708,7 @@ watch(
                         v-model="searchInput"
                         class="full-width"
                         clearable
+                        filled
                         clear-icon="close"
                         @keyup.enter="() => selectFilter('search')"
                         @focusout="() => selectFilter('search')"
@@ -727,6 +728,7 @@ watch(
                         v-model="selectedFilters.changedModel"
                         option-label="locale"
                         option-value="value"
+                        filled
                         :options="actions"
                         @update:model-value="selectFilter('action')"
                         hide-selected
@@ -752,8 +754,7 @@ watch(
                             class="full-width"
                             :label="t('globals.user')"
                             v-model="userSelect"
-                            option-label="name"
-                            option-value="id"
+                            filled
                             :url="`${model}Logs/${route.params.id}/editors`"
                             :fields="['id', 'nickname', 'name', 'image']"
                             sort-by="nickname"
@@ -782,6 +783,7 @@ watch(
                         :label="t('globals.changes')"
                         v-model="changeInput"
                         class="full-width"
+                        filled
                         clearable
                         clear-icon="close"
                         @keyup.enter="selectFilter('change')"
@@ -818,6 +820,7 @@ watch(
                         @clear="selectFilter('date', 'to')"
                         v-model="dateFrom"
                         clearable
+                        filled
                         clear-icon="close"
                     />
                 </QItem>
@@ -830,6 +833,7 @@ watch(
                         @clear="selectFilter('date', 'from')"
                         v-model="dateTo"
                         clearable
+                        filled
                         clear-icon="close"
                     />
                 </QItem>
@@ -843,6 +847,7 @@ watch(
             dense
             flat
             minimal
+            filled
             @update:model-value="
                 (value) => {
                     dateFromDialog = false;
diff --git a/src/components/common/__tests__/VnDmsList.spec.js b/src/components/common/__tests__/VnDmsList.spec.js
index 9649943a2..22101239e 100644
--- a/src/components/common/__tests__/VnDmsList.spec.js
+++ b/src/components/common/__tests__/VnDmsList.spec.js
@@ -4,12 +4,15 @@ import { vi, afterEach, beforeAll, describe, expect, it } from 'vitest';
 
 describe('VnDmsList', () => {
     let vm;
-    const dms = { 
-        userFk: 1, 
-        name: 'DMS 1' 
+    const dms = {
+        userFk: 1,
+        name: 'DMS 1',
     };
-    
+
     beforeAll(() => {
+        vi.mock('src/composables/getUrl', () => ({
+            getUrl: vi.fn().mockResolvedValue(''),
+        }));
         vi.spyOn(axios, 'get').mockResolvedValue({ data: [] });
         vm = createWrapper(VnDmsList, {
             props: {
@@ -18,8 +21,8 @@ describe('VnDmsList', () => {
                 filter: 'wd.workerFk',
                 updateModel: 'Workers',
                 deleteModel: 'WorkerDms',
-                downloadModel: 'WorkerDms' 
-            }
+                downloadModel: 'WorkerDms',
+            },
         }).vm;
     });
 
@@ -29,46 +32,45 @@ describe('VnDmsList', () => {
 
     describe('setData()', () => {
         const data = [
-            { 
-                userFk: 1, 
+            {
+                userFk: 1,
                 name: 'Jessica',
                 lastName: 'Jones',
                 file: '4.jpg',
-                created: '2021-07-28 21:00:00'
+                created: '2021-07-28 21:00:00',
             },
-            { 
-                userFk: 2, 
+            {
+                userFk: 2,
                 name: 'Bruce',
                 lastName: 'Banner',
                 created: '2022-07-28 21:00:00',
                 dms: {
-                    userFk: 2, 
+                    userFk: 2,
                     name: 'Bruce',
                     lastName: 'BannerDMS',
                     created: '2022-07-28 21:00:00',
                     file: '4.jpg',
-                } 
+                },
             },
             {
                 userFk: 3,
                 name: 'Natasha',
                 lastName: 'Romanoff',
                 file: '4.jpg',
-                created: '2021-10-28 21:00:00'
-            }  
-        ]
+                created: '2021-10-28 21:00:00',
+            },
+        ];
 
         it('Should replace objects that contain the "dms" property with the value of the same and sort by creation date', () => {
             vm.setData(data);
             expect([vm.rows][0][0].lastName).toEqual('BannerDMS');
             expect([vm.rows][0][1].lastName).toEqual('Romanoff');
-
         });
     });
 
     describe('parseDms()', () => {
-        const resultDms = { ...dms, userId:1};
-        
+        const resultDms = { ...dms, userId: 1 };
+
         it('Should add properties that end with "Fk" by changing the suffix to "Id"', () => {
             const parsedDms = vm.parseDms(dms);
             expect(parsedDms).toEqual(resultDms);
@@ -76,12 +78,12 @@ describe('VnDmsList', () => {
     });
 
     describe('showFormDialog()', () => {
-        const resultDms = { ...dms, userId:1};
-        
+        const resultDms = { ...dms, userId: 1 };
+
         it('should call fn parseDms() and set show true if dms is defined', () => {
             vm.showFormDialog(dms);
             expect(vm.formDialog.show).toEqual(true);
             expect(vm.formDialog.dms).toEqual(resultDms);
         });
     });
-});	
\ No newline at end of file
+});
diff --git a/src/components/ui/CardDescriptor.vue b/src/components/ui/CardDescriptor.vue
index b7d03127c..5f9a89d64 100644
--- a/src/components/ui/CardDescriptor.vue
+++ b/src/components/ui/CardDescriptor.vue
@@ -1,375 +1,38 @@
 <script setup>
-import { onBeforeMount, watch, computed, ref } from 'vue';
-import { useI18n } from 'vue-i18n';
-import SkeletonDescriptor from 'components/ui/SkeletonDescriptor.vue';
-import { useArrayData } from 'composables/useArrayData';
-import { useSummaryDialog } from 'src/composables/useSummaryDialog';
-import { useState } from 'src/composables/useState';
-import { useRoute, useRouter } from 'vue-router';
-import { useClipboard } from 'src/composables/useClipboard';
-import VnMoreOptions from './VnMoreOptions.vue';
+import { ref } from 'vue';
+import VnDescriptor from './VnDescriptor.vue';
 
 const $props = defineProps({
-    url: {
-        type: String,
-        default: '',
-    },
-    filter: {
-        type: Object,
-        default: null,
-    },
-    title: {
-        type: String,
-        default: '',
-    },
-    subtitle: {
+    id: {
         type: Number,
-        default: null,
+        default: false,
     },
-    dataKey: {
-        type: String,
-        default: null,
-    },
-    summary: {
+    card: {
         type: Object,
         default: null,
     },
-    width: {
-        type: String,
-        default: 'md-width',
-    },
-    toModule: {
-        type: String,
-        default: null,
-    },
 });
 
-const state = useState();
-const route = useRoute();
-const router = useRouter();
-const { t } = useI18n();
-const { copyText } = useClipboard();
-const { viewSummary } = useSummaryDialog();
-let arrayData;
-let store;
-let entity;
-const isLoading = ref(false);
-const isSameDataKey = computed(() => $props.dataKey === route.meta.moduleName);
-const DESCRIPTOR_PROXY = 'DescriptorProxy';
-const moduleName = ref();
-const isSameModuleName = route.matched[1].meta.moduleName !== moduleName.value;
-defineExpose({ getData });
-
-onBeforeMount(async () => {
-    arrayData = useArrayData($props.dataKey, {
-        url: $props.url,
-        userFilter: $props.filter,
-        skip: 0,
-        oneRecord: true,
-    });
-    store = arrayData.store;
-    entity = computed(() => {
-        const data = store.data ?? {};
-        if (data) emit('onFetch', data);
-        return data;
-    });
-
-    // It enables to load data only once if the module is the same as the dataKey
-    if (!isSameDataKey.value || !route.params.id) await getData();
-    watch(
-        () => [$props.url, $props.filter],
-        async () => {
-            if (!isSameDataKey.value) await getData();
-        },
-    );
-});
-
-function getName() {
-    let name = $props.dataKey;
-    if ($props.dataKey.includes(DESCRIPTOR_PROXY)) {
-        name = name.split(DESCRIPTOR_PROXY)[0];
-    }
-    return name;
-}
-const routeName = computed(() => {
-    let routeName = getName();
-    return `${routeName}Summary`;
-});
-
-async function getData() {
-    store.url = $props.url;
-    store.filter = $props.filter ?? {};
-    isLoading.value = true;
-    try {
-        const { data } = await arrayData.fetch({ append: false, updateRouter: false });
-        state.set($props.dataKey, data);
-        emit('onFetch', data);
-    } finally {
-        isLoading.value = false;
-    }
-}
-
-function getValueFromPath(path) {
-    if (!path) return;
-    const keys = path.toString().split('.');
-    let current = entity.value;
-
-    for (const key of keys) {
-        if (current[key] === undefined) return undefined;
-        else current = current[key];
-    }
-    return current;
-}
-
-function copyIdText(id) {
-    copyText(id, {
-        component: {
-            copyValue: id,
-        },
-    });
-}
-
 const emit = defineEmits(['onFetch']);
-
-const iconModule = computed(() => {
-    moduleName.value = getName();
-    if ($props.toModule) {
-        return router.getRoutes().find((r) => r.name === $props.toModule.name).meta.icon;
-    }
-    if (isSameModuleName) {
-        return router.options.routes[1].children.find((r) => r.name === moduleName.value)
-            ?.meta?.icon;
-    } else {
-        return route.matched[1].meta.icon;
-    }
-});
-
-const toModule = computed(() => {
-    moduleName.value = getName();
-    if ($props.toModule) return $props.toModule;
-    if (isSameModuleName) {
-        return router.options.routes[1].children.find((r) => r.name === moduleName.value)
-            ?.redirect;
-    } else {
-        return route.matched[1].path.split('/').length > 2
-            ? route.matched[1].redirect
-            : route.matched[1].children[0].redirect;
-    }
-});
+const entity = ref();
 </script>
 
 <template>
-    <div class="descriptor" data-cy="cardDescriptor">
-        <template v-if="entity && !isLoading">
-            <div class="header bg-primary q-pa-sm justify-between">
-                <slot name="header-extra-action">
-                    <QBtn
-                        round
-                        flat
-                        dense
-                        size="md"
-                        :icon="iconModule"
-                        color="white"
-                        class="link"
-                        :to="toModule"
-                    >
-                        <QTooltip>
-                            {{ t('globals.goToModuleIndex') }}
-                        </QTooltip>
-                    </QBtn>
-                </slot>
-                <QBtn
-                    @click.stop="viewSummary(entity.id, $props.summary, $props.width)"
-                    round
-                    flat
-                    dense
-                    size="md"
-                    icon="preview"
-                    color="white"
-                    class="link"
-                    v-if="summary"
-                    data-cy="openSummaryBtn"
-                >
-                    <QTooltip>
-                        {{ t('components.smartCard.openSummary') }}
-                    </QTooltip>
-                </QBtn>
-                <RouterLink :to="{ name: routeName, params: { id: entity.id } }">
-                    <QBtn
-                        class="link"
-                        color="white"
-                        dense
-                        flat
-                        icon="launch"
-                        round
-                        size="md"
-                        data-cy="goToSummaryBtn"
-                    >
-                        <QTooltip>
-                            {{ t('components.cardDescriptor.summary') }}
-                        </QTooltip>
-                    </QBtn>
-                </RouterLink>
-                <VnMoreOptions v-if="$slots.menu">
-                    <template #menu="{ menuRef }">
-                        <slot name="menu" :entity="entity" :menu-ref="menuRef" />
-                    </template>
-                </VnMoreOptions>
-            </div>
-            <slot name="before" />
-            <div class="body q-py-sm">
-                <QList dense>
-                    <QItemLabel header class="ellipsis text-h5" :lines="1">
-                        <div class="title">
-                            <span
-                                v-if="$props.title"
-                                :title="getValueFromPath(title)"
-                                :data-cy="`${$attrs['data-cy'] ?? 'cardDescriptor'}_title`"
-                            >
-                                {{ getValueFromPath(title) ?? $props.title }}
-                            </span>
-                            <slot v-else name="description" :entity="entity">
-                                <span
-                                    :title="entity.name"
-                                    :data-cy="`${$attrs['data-cy'] ?? 'cardDescriptor'}_description`"
-                                    v-text="entity.name"
-                                />
-                            </slot>
-                        </div>
-                    </QItemLabel>
-                    <QItem>
-                        <QItemLabel
-                            class="subtitle"
-                            :data-cy="`${$attrs['data-cy'] ?? 'cardDescriptor'}_subtitle`"
-                        >
-                            #{{ getValueFromPath(subtitle) ?? entity.id }}
-                        </QItemLabel>
-                        <QBtn
-                            round
-                            flat
-                            dense
-                            size="sm"
-                            icon="content_copy"
-                            color="primary"
-                            @click.stop="copyIdText(entity.id)"
-                        >
-                            <QTooltip>
-                                {{ t('globals.copyId') }}
-                            </QTooltip>
-                        </QBtn>
-                    </QItem>
-                </QList>
-                <div
-                    class="list-box q-mt-xs"
-                    :data-cy="`${$attrs['data-cy'] ?? 'cardDescriptor'}_listbox`"
-                >
-                    <slot name="body" :entity="entity" />
-                </div>
-            </div>
-            <div class="icons">
-                <slot name="icons" :entity="entity" />
-            </div>
-            <div class="actions justify-center" data-cy="descriptor_actions">
-                <slot name="actions" :entity="entity" />
-            </div>
-            <slot name="after" />
-        </template>
-        <SkeletonDescriptor v-if="!entity || isLoading" />
-    </div>
-    <QInnerLoading
-        :label="t('globals.pleaseWait')"
-        :showing="isLoading"
-        color="primary"
-    />
-</template>
-
-<style lang="scss">
-.body {
-    background-color: var(--vn-section-color);
-    .text-h5 {
-        font-size: 20px;
-        padding-top: 5px;
-        padding-bottom: 0px;
-    }
-    .q-item {
-        min-height: 20px;
-
-        .link {
-            margin-left: 10px;
-        }
-    }
-    .vn-label-value {
-        display: flex;
-        padding: 0px 16px;
-        .label {
-            color: var(--vn-label-color);
-            font-size: 14px;
-
-            &:not(:has(a))::after {
-                content: ':';
+    <component
+        :is="card"
+        :id
+        :visual="false"
+        v-bind="$attrs"
+        @on-fetch="
+            (data) => {
+                entity = data;
+                emit('onFetch', data);
             }
-        }
-        .value {
-            color: var(--vn-text-color);
-            font-size: 14px;
-            margin-left: 4px;
-            overflow: hidden;
-            text-overflow: ellipsis;
-            white-space: nowrap;
-            text-align: left;
-        }
-        .info {
-            margin-left: 5px;
-        }
-    }
-}
-</style>
-
-<style lang="scss" scoped>
-.title {
-    overflow: hidden;
-    text-overflow: ellipsis;
-    span {
-        color: var(--vn-text-color);
-        font-weight: bold;
-    }
-}
-.subtitle {
-    color: var(--vn-text-color);
-    font-size: 16px;
-    margin-bottom: 2px;
-}
-.list-box {
-    .q-item__label {
-        color: var(--vn-label-color);
-        padding-bottom: 0%;
-    }
-}
-.descriptor {
-    width: 256px;
-    .header {
-        display: flex;
-        align-items: center;
-    }
-    .icons {
-        margin: 0 10px;
-        display: flex;
-        justify-content: center;
-        .q-icon {
-            margin-right: 5px;
-        }
-    }
-    .actions {
-        margin: 0 5px;
-        justify-content: center !important;
-    }
-}
-</style>
-<i18n>
-    en:
-        globals:
-            copyId: Copy ID
-    es:
-        globals:
-            copyId: Copiar ID
-</i18n>
+        "
+    />
+    <VnDescriptor v-model="entity" v-bind="$attrs">
+        <template v-for="(_, slotName) in $slots" #[slotName]="slotData" :key="slotName">
+            <slot :name="slotName" v-bind="slotData ?? {}" :key="slotName" />
+        </template>
+    </VnDescriptor>
+</template>
diff --git a/src/components/ui/EntityDescriptor.vue b/src/components/ui/EntityDescriptor.vue
new file mode 100644
index 000000000..a5dced551
--- /dev/null
+++ b/src/components/ui/EntityDescriptor.vue
@@ -0,0 +1,78 @@
+<script setup>
+import { onBeforeMount, watch, computed, ref } from 'vue';
+import { useArrayData } from 'composables/useArrayData';
+import { useState } from 'src/composables/useState';
+import { useRoute } from 'vue-router';
+import VnDescriptor from './VnDescriptor.vue';
+
+const $props = defineProps({
+    url: {
+        type: String,
+        default: '',
+    },
+    filter: {
+        type: Object,
+        default: null,
+    },
+    dataKey: {
+        type: String,
+        default: null,
+    },
+});
+
+const state = useState();
+const route = useRoute();
+let arrayData;
+let store;
+let entity;
+const isLoading = ref(false);
+const isSameDataKey = computed(() => $props.dataKey === route.meta.moduleName);
+defineExpose({ getData });
+
+onBeforeMount(async () => {
+    arrayData = useArrayData($props.dataKey, {
+        url: $props.url,
+        userFilter: $props.filter,
+        skip: 0,
+        oneRecord: true,
+    });
+    store = arrayData.store;
+    entity = computed(() => {
+        const data = store.data ?? {};
+        if (data) emit('onFetch', data);
+        return data;
+    });
+
+    // It enables to load data only once if the module is the same as the dataKey
+    if (!isSameDataKey.value || !route.params.id) await getData();
+    watch(
+        () => [$props.url, $props.filter],
+        async () => {
+            if (!isSameDataKey.value) await getData();
+        },
+    );
+});
+
+async function getData() {
+    store.url = $props.url;
+    store.filter = $props.filter ?? {};
+    isLoading.value = true;
+    try {
+        const { data } = await arrayData.fetch({ append: false, updateRouter: false });
+        state.set($props.dataKey, data);
+        emit('onFetch', data);
+    } finally {
+        isLoading.value = false;
+    }
+}
+
+const emit = defineEmits(['onFetch']);
+</script>
+
+<template>
+    <VnDescriptor v-model="entity" v-bind="$attrs" :module="dataKey">
+        <template v-for="(_, slotName) in $slots" #[slotName]="slotData" :key="slotName">
+            <slot :name="slotName" v-bind="slotData ?? {}" :key="slotName" />
+        </template>
+    </VnDescriptor>
+</template>
diff --git a/src/components/ui/VnDescriptor.vue b/src/components/ui/VnDescriptor.vue
new file mode 100644
index 000000000..47da98d74
--- /dev/null
+++ b/src/components/ui/VnDescriptor.vue
@@ -0,0 +1,318 @@
+<script setup>
+import { computed, ref } from 'vue';
+import { useI18n } from 'vue-i18n';
+import SkeletonDescriptor from 'components/ui/SkeletonDescriptor.vue';
+import { useSummaryDialog } from 'src/composables/useSummaryDialog';
+import { useRoute, useRouter } from 'vue-router';
+import { useClipboard } from 'src/composables/useClipboard';
+import VnMoreOptions from './VnMoreOptions.vue';
+
+const entity = defineModel({ type: Object, default: null });
+const $props = defineProps({
+    title: {
+        type: String,
+        default: '',
+    },
+    subtitle: {
+        type: Number,
+        default: null,
+    },
+    summary: {
+        type: Object,
+        default: null,
+    },
+    width: {
+        type: String,
+        default: 'md-width',
+    },
+    module: {
+        type: String,
+        default: null,
+    },
+    toModule: {
+        type: String,
+        default: null,
+    },
+});
+
+const route = useRoute();
+const router = useRouter();
+const { t } = useI18n();
+const { copyText } = useClipboard();
+const { viewSummary } = useSummaryDialog();
+const DESCRIPTOR_PROXY = 'DescriptorProxy';
+const moduleName = ref();
+const isSameModuleName = route.matched[1].meta.moduleName !== moduleName.value;
+
+function getName() {
+    let name = $props.module;
+    if ($props.module.includes(DESCRIPTOR_PROXY)) {
+        name = name.split(DESCRIPTOR_PROXY)[0];
+    }
+    return name;
+}
+const routeName = computed(() => {
+    let routeName = getName();
+    return `${routeName}Summary`;
+});
+
+function getValueFromPath(path) {
+    if (!path) return;
+    const keys = path.toString().split('.');
+    let current = entity.value;
+
+    for (const key of keys) {
+        if (current[key] === undefined) return undefined;
+        else current = current[key];
+    }
+    return current;
+}
+
+function copyIdText(id) {
+    copyText(id, {
+        component: {
+            copyValue: id,
+        },
+    });
+}
+
+const emit = defineEmits(['onFetch']);
+
+const iconModule = computed(() => {
+    moduleName.value = getName();
+    if ($props.toModule) {
+        return router.getRoutes().find((r) => r.name === $props.toModule.name).meta.icon;
+    }
+    if (isSameModuleName) {
+        return router.options.routes[1].children.find((r) => r.name === moduleName.value)
+            ?.meta?.icon;
+    } else {
+        return route.matched[1].meta.icon;
+    }
+});
+
+const toModule = computed(() => {
+    moduleName.value = getName();
+    if ($props.toModule) return $props.toModule;
+    if (isSameModuleName) {
+        return router.options.routes[1].children.find((r) => r.name === moduleName.value)
+            ?.redirect;
+    } else {
+        return route.matched[1].path.split('/').length > 2
+            ? route.matched[1].redirect
+            : route.matched[1].children[0].redirect;
+    }
+});
+</script>
+
+<template>
+    <div class="descriptor" data-cy="vnDescriptor">
+        <template v-if="entity && entity?.id">
+            <div class="header bg-primary q-pa-sm justify-between">
+                <slot name="header-extra-action">
+                    <QBtn
+                        round
+                        flat
+                        dense
+                        size="md"
+                        :icon="iconModule"
+                        color="white"
+                        class="link"
+                        :to="toModule"
+                    >
+                        <QTooltip>
+                            {{ t('globals.goToModuleIndex') }}
+                        </QTooltip>
+                    </QBtn>
+                </slot>
+                <QBtn
+                    @click.stop="viewSummary(entity.id, summary, width)"
+                    round
+                    flat
+                    dense
+                    size="md"
+                    icon="preview"
+                    color="white"
+                    class="link"
+                    v-if="summary"
+                    data-cy="openSummaryBtn"
+                >
+                    <QTooltip>
+                        {{ t('components.smartCard.openSummary') }}
+                    </QTooltip>
+                </QBtn>
+                <RouterLink :to="{ name: routeName, params: { id: entity.id } }">
+                    <QBtn
+                        class="link"
+                        color="white"
+                        dense
+                        flat
+                        icon="launch"
+                        round
+                        size="md"
+                        data-cy="goToSummaryBtn"
+                    >
+                        <QTooltip>
+                            {{ t('components.vnDescriptor.summary') }}
+                        </QTooltip>
+                    </QBtn>
+                </RouterLink>
+                <VnMoreOptions v-if="$slots.menu">
+                    <template #menu="{ menuRef }">
+                        <slot name="menu" :entity="entity" :menu-ref="menuRef" />
+                    </template>
+                </VnMoreOptions>
+            </div>
+            <slot name="before" />
+            <div class="body q-py-sm">
+                <QList dense>
+                    <QItemLabel header class="ellipsis text-h5" :lines="1">
+                        <div class="title">
+                            <span
+                                v-if="title"
+                                :title="getValueFromPath(title)"
+                                :data-cy="`${$attrs['data-cy'] ?? 'vnDescriptor'}_title`"
+                            >
+                                {{ getValueFromPath(title) ?? title }}
+                            </span>
+                            <slot v-else name="description" :entity="entity">
+                                <span
+                                    :title="entity.name"
+                                    :data-cy="`${$attrs['data-cy'] ?? 'vnDescriptor'}_description`"
+                                    v-text="entity.name"
+                                />
+                            </slot>
+                        </div>
+                    </QItemLabel>
+                    <QItem>
+                        <QItemLabel
+                            class="subtitle"
+                            :data-cy="`${$attrs['data-cy'] ?? 'vnDescriptor'}_subtitle`"
+                        >
+                            #{{ getValueFromPath(subtitle) ?? entity.id }}
+                        </QItemLabel>
+                        <QBtn
+                            round
+                            flat
+                            dense
+                            size="sm"
+                            icon="content_copy"
+                            color="primary"
+                            @click.stop="copyIdText(entity.id)"
+                        >
+                            <QTooltip>
+                                {{ t('globals.copyId') }}
+                            </QTooltip>
+                        </QBtn>
+                    </QItem>
+                </QList>
+                <div
+                    class="list-box q-mt-xs"
+                    :data-cy="`${$attrs['data-cy'] ?? 'vnDescriptor'}_listbox`"
+                >
+                    <slot name="body" :entity="entity" />
+                </div>
+            </div>
+            <div class="icons">
+                <slot name="icons" :entity="entity" />
+            </div>
+            <div class="actions justify-center" data-cy="descriptor_actions">
+                <slot name="actions" :entity="entity" />
+            </div>
+            <slot name="after" />
+        </template>
+        <SkeletonDescriptor v-if="!entity" />
+    </div>
+    <QInnerLoading :label="t('globals.pleaseWait')" :showing="!entity" color="primary" />
+</template>
+
+<style lang="scss">
+.body {
+    background-color: var(--vn-section-color);
+    .text-h5 {
+        font-size: 20px;
+        padding-top: 5px;
+        padding-bottom: 0px;
+    }
+    .q-item {
+        min-height: 20px;
+
+        .link {
+            margin-left: 10px;
+        }
+    }
+    .vn-label-value {
+        display: flex;
+        padding: 0px 16px;
+        .label {
+            color: var(--vn-label-color);
+            font-size: 14px;
+
+            &:not(:has(a))::after {
+                content: ':';
+            }
+        }
+        .value {
+            color: var(--vn-text-color);
+            font-size: 14px;
+            margin-left: 4px;
+            overflow: hidden;
+            text-overflow: ellipsis;
+            white-space: nowrap;
+            text-align: left;
+        }
+        .info {
+            margin-left: 5px;
+        }
+    }
+}
+</style>
+
+<style lang="scss" scoped>
+.title {
+    overflow: hidden;
+    text-overflow: ellipsis;
+    span {
+        color: var(--vn-text-color);
+        font-weight: bold;
+    }
+}
+.subtitle {
+    color: var(--vn-text-color);
+    font-size: 16px;
+    margin-bottom: 2px;
+}
+.list-box {
+    .q-item__label {
+        color: var(--vn-label-color);
+        padding-bottom: 0%;
+    }
+}
+.descriptor {
+    width: 256px;
+    .header {
+        display: flex;
+        align-items: center;
+    }
+    .icons {
+        margin: 0 10px;
+        display: flex;
+        justify-content: center;
+        .q-icon {
+            margin-right: 5px;
+        }
+    }
+    .actions {
+        margin: 0 5px;
+        justify-content: center !important;
+    }
+}
+</style>
+<i18n>
+    en:
+        globals:
+            copyId: Copy ID
+    es:
+        globals:
+            copyId: Copiar ID
+</i18n>
diff --git a/src/composables/__tests__/downloadFile.spec.js b/src/composables/__tests__/downloadFile.spec.js
index f53b56b3e..f83a973b0 100644
--- a/src/composables/__tests__/downloadFile.spec.js
+++ b/src/composables/__tests__/downloadFile.spec.js
@@ -6,10 +6,12 @@ const session = useSession();
 const token = session.getToken();
 
 describe('downloadFile', () => {
-    const baseUrl = 'http://localhost:9000';
     let defaulCreateObjectURL;
 
     beforeAll(() => {
+        vi.mock('src/composables/getUrl', () => ({
+            getUrl: vi.fn().mockResolvedValue(''),
+        }));
         defaulCreateObjectURL = window.URL.createObjectURL;
         window.URL.createObjectURL = vi.fn(() => 'blob:http://localhost:9000/blob-id');
     });
@@ -22,15 +24,14 @@ describe('downloadFile', () => {
             headers: { 'content-disposition': 'attachment; filename="test-file.txt"' },
         };
         vi.spyOn(axios, 'get').mockImplementation((url) => {
-            if (url == 'Urls/getUrl') return Promise.resolve({ data: baseUrl });
-            else if (url.includes('downloadFile')) return Promise.resolve(res);
+            if (url.includes('downloadFile')) return Promise.resolve(res);
         });
 
         await downloadFile(1);
 
         expect(axios.get).toHaveBeenCalledWith(
-            `${baseUrl}/api/dms/1/downloadFile?access_token=${token}`,
-            { responseType: 'blob' }
+            `/api/dms/1/downloadFile?access_token=${token}`,
+            { responseType: 'blob' },
         );
     });
 });
diff --git a/src/composables/downloadFile.js b/src/composables/downloadFile.js
index 4588265a2..302836e09 100644
--- a/src/composables/downloadFile.js
+++ b/src/composables/downloadFile.js
@@ -5,20 +5,30 @@ import { exportFile } from 'quasar';
 
 const { getTokenMultimedia } = useSession();
 const token = getTokenMultimedia();
+const appUrl = (await getUrl('', 'lilium')).replace('/#/', '');
 
 export async function downloadFile(id, model = 'dms', urlPath = '/downloadFile', url) {
-    const appUrl = (await getUrl('', 'lilium')).replace('/#/', '');
     const response = await axios.get(
         url ?? `${appUrl}/api/${model}/${id}${urlPath}?access_token=${token}`,
         { responseType: 'blob' }
     );
 
+    download(response);
+}
+
+export async function downloadDocuware(url, params) {
+    const response = await axios.get(`${appUrl}/api/` + url, {
+        responseType: 'blob',
+        params,
+    });
+
+    download(response);
+}
+
+function download(response) {
     const contentDisposition = response.headers['content-disposition'];
     const matches = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/.exec(contentDisposition);
-    const filename =
-        matches != null && matches[1]
-            ? matches[1].replace(/['"]/g, '')
-            : 'downloaded-file';
+    const filename = matches?.[1] ? matches[1].replace(/['"]/g, '') : 'downloaded-file';
 
     exportFile(filename, response.data);
 }
diff --git a/src/i18n/locale/en.yml b/src/i18n/locale/en.yml
index 6be11b5ed..7374cda68 100644
--- a/src/i18n/locale/en.yml
+++ b/src/i18n/locale/en.yml
@@ -646,6 +646,7 @@ worker:
         model: Model
         serialNumber: Serial number
         removePDA: Deallocate PDA
+        sendToTablet: Send to tablet
     create:
         lastName: Last name
         birth: Birth
diff --git a/src/i18n/locale/es.yml b/src/i18n/locale/es.yml
index 55e5abd95..f0ce53e37 100644
--- a/src/i18n/locale/es.yml
+++ b/src/i18n/locale/es.yml
@@ -731,6 +731,7 @@ worker:
         model: Modelo
         serialNumber: Número de serie
         removePDA: Desasignar PDA
+        sendToTablet: Enviar a la tablet
     create:
         lastName: Apellido
         birth: Fecha de nacimiento
diff --git a/src/pages/Account/AccountFilter.vue b/src/pages/Account/AccountFilter.vue
index 50c3ee1ac..732e92f77 100644
--- a/src/pages/Account/AccountFilter.vue
+++ b/src/pages/Account/AccountFilter.vue
@@ -47,7 +47,7 @@ const rolesOptions = ref([]);
                         :label="t('globals.name')"
                         v-model="params.name"
                         lazy-rules
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -57,7 +57,7 @@ const rolesOptions = ref([]);
                         :label="t('account.card.alias')"
                         v-model="params.nickname"
                         lazy-rules
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -75,8 +75,7 @@ const rolesOptions = ref([]);
                         use-input
                         hide-selected
                         dense
-                        outlined
-                        rounded
+                        filled
                         :input-debounce="0"
                     />
                 </QItemSection>
diff --git a/src/pages/Account/Acls/AclFilter.vue b/src/pages/Account/Acls/AclFilter.vue
index 8035f92b8..222fe5b77 100644
--- a/src/pages/Account/Acls/AclFilter.vue
+++ b/src/pages/Account/Acls/AclFilter.vue
@@ -56,8 +56,7 @@ onBeforeMount(() => {
                         option-label="name"
                         use-input
                         dense
-                        outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -72,8 +71,7 @@ onBeforeMount(() => {
                         option-label="name"
                         use-input
                         dense
-                        outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -83,7 +81,7 @@ onBeforeMount(() => {
                         :label="t('acls.aclFilter.property')"
                         v-model="params.property"
                         lazy-rules
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -98,8 +96,7 @@ onBeforeMount(() => {
                         option-label="name"
                         use-input
                         dense
-                        outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -114,8 +111,7 @@ onBeforeMount(() => {
                         option-label="name"
                         use-input
                         dense
-                        outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
diff --git a/src/pages/Account/Alias/Card/AliasDescriptor.vue b/src/pages/Account/Alias/Card/AliasDescriptor.vue
index 7f6992bf0..957047cc3 100644
--- a/src/pages/Account/Alias/Card/AliasDescriptor.vue
+++ b/src/pages/Account/Alias/Card/AliasDescriptor.vue
@@ -4,7 +4,7 @@ import { useRoute, useRouter } from 'vue-router';
 import { useI18n } from 'vue-i18n';
 import { useQuasar } from 'quasar';
 
-import CardDescriptor from 'components/ui/CardDescriptor.vue';
+import EntityDescriptor from 'components/ui/EntityDescriptor.vue';
 import VnLv from 'src/components/ui/VnLv.vue';
 
 import axios from 'axios';
@@ -48,7 +48,7 @@ const removeAlias = () => {
 </script>
 
 <template>
-    <CardDescriptor
+    <EntityDescriptor
         ref="descriptor"
         :url="`MailAliases/${entityId}`"
         data-key="Alias"
@@ -63,7 +63,7 @@ const removeAlias = () => {
         <template #body="{ entity }">
             <VnLv :label="t('role.description')" :value="entity.description" />
         </template>
-    </CardDescriptor>
+    </EntityDescriptor>
 </template>
 
 <i18n>
diff --git a/src/pages/Account/Card/AccountDescriptor.vue b/src/pages/Account/Card/AccountDescriptor.vue
index 49328fe87..eb0a9013c 100644
--- a/src/pages/Account/Card/AccountDescriptor.vue
+++ b/src/pages/Account/Card/AccountDescriptor.vue
@@ -1,7 +1,7 @@
 <script setup>
 import { ref, computed, onMounted } from 'vue';
 import { useRoute } from 'vue-router';
-import CardDescriptor from 'components/ui/CardDescriptor.vue';
+import EntityDescriptor from 'components/ui/EntityDescriptor.vue';
 import VnLv from 'src/components/ui/VnLv.vue';
 import AccountDescriptorMenu from './AccountDescriptorMenu.vue';
 import VnImg from 'src/components/ui/VnImg.vue';
@@ -20,7 +20,7 @@ onMounted(async () => {
 </script>
 
 <template>
-    <CardDescriptor
+    <EntityDescriptor
         ref="descriptor"
         :url="`VnUsers/preview`"
         :filter="{ ...filter, where: { id: entityId } }"
@@ -78,7 +78,7 @@ onMounted(async () => {
                 </QIcon>
             </QCardActions>
         </template>
-    </CardDescriptor>
+    </EntityDescriptor>
 </template>
 <style scoped>
 .q-item__label {
diff --git a/src/pages/Account/Role/AccountRolesFilter.vue b/src/pages/Account/Role/AccountRolesFilter.vue
index cbe7a70c8..1358236c6 100644
--- a/src/pages/Account/Role/AccountRolesFilter.vue
+++ b/src/pages/Account/Role/AccountRolesFilter.vue
@@ -27,7 +27,7 @@ const props = defineProps({
                         :label="t('globals.name')"
                         v-model="params.name"
                         lazy-rules
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -37,7 +37,7 @@ const props = defineProps({
                         :label="t('role.description')"
                         v-model="params.description"
                         lazy-rules
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
diff --git a/src/pages/Account/Role/Card/RoleDescriptor.vue b/src/pages/Account/Role/Card/RoleDescriptor.vue
index 051359702..698bea4fa 100644
--- a/src/pages/Account/Role/Card/RoleDescriptor.vue
+++ b/src/pages/Account/Role/Card/RoleDescriptor.vue
@@ -2,7 +2,7 @@
 import { computed } from 'vue';
 import { useRoute } from 'vue-router';
 import { useI18n } from 'vue-i18n';
-import CardDescriptor from 'components/ui/CardDescriptor.vue';
+import EntityDescriptor from 'components/ui/EntityDescriptor.vue';
 import VnLv from 'src/components/ui/VnLv.vue';
 import axios from 'axios';
 import useNotify from 'src/composables/useNotify.js';
@@ -32,7 +32,7 @@ const removeRole = async () => {
 </script>
 
 <template>
-    <CardDescriptor
+    <EntityDescriptor
         url="VnRoles"
         :filter="{ where: { id: entityId } }"
         data-key="Role"
@@ -47,7 +47,7 @@ const removeRole = async () => {
         <template #body="{ entity }">
             <VnLv :label="t('role.description')" :value="entity.description" />
         </template>
-    </CardDescriptor>
+    </EntityDescriptor>
 </template>
 <style scoped>
 .q-item__label {
diff --git a/src/pages/Claim/Card/ClaimDescriptor.vue b/src/pages/Claim/Card/ClaimDescriptor.vue
index d789b63d3..76ede81ed 100644
--- a/src/pages/Claim/Card/ClaimDescriptor.vue
+++ b/src/pages/Claim/Card/ClaimDescriptor.vue
@@ -6,7 +6,7 @@ import { toDateHourMinSec, toPercentage } from 'src/filters';
 import TicketDescriptorProxy from 'pages/Ticket/Card/TicketDescriptorProxy.vue';
 import ClaimDescriptorMenu from 'pages/Claim/Card/ClaimDescriptorMenu.vue';
 import DepartmentDescriptorProxy from 'src/pages/Worker/Department/Card/DepartmentDescriptorProxy.vue';
-import CardDescriptor from 'components/ui/CardDescriptor.vue';
+import EntityDescriptor from 'components/ui/EntityDescriptor.vue';
 import VnLv from 'src/components/ui/VnLv.vue';
 import VnUserLink from 'src/components/ui/VnUserLink.vue';
 import { getUrl } from 'src/composables/getUrl';
@@ -44,7 +44,7 @@ onMounted(async () => {
 </script>
 
 <template>
-    <CardDescriptor
+    <EntityDescriptor
         :url="`Claims/${entityId}`"
         :filter="filter"
         title="client.name"
@@ -147,7 +147,7 @@ onMounted(async () => {
                 </QBtn>
             </QCardActions>
         </template>
-    </CardDescriptor>
+    </EntityDescriptor>
 </template>
 <style scoped>
 .q-item__label {
diff --git a/src/pages/Claim/ClaimFilter.vue b/src/pages/Claim/ClaimFilter.vue
index 37146865c..51460f7e4 100644
--- a/src/pages/Claim/ClaimFilter.vue
+++ b/src/pages/Claim/ClaimFilter.vue
@@ -33,7 +33,7 @@ const props = defineProps({
                     :label="t('claim.customerId')"
                     v-model="params.clientFk"
                     lazy-rules
-                    is-outlined
+                    filled
                 >
                     <template #prepend> <QIcon name="badge" size="xs" /></template>
                 </VnInput>
@@ -41,12 +41,11 @@ const props = defineProps({
                     :label="t('Client Name')"
                     v-model="params.clientName"
                     lazy-rules
-                    is-outlined
+                    filled
                 />
                 <VnSelect
-                    outlined
                     dense
-                    rounded
+                    filled
                     :label="t('globals.params.departmentFk')"
                     v-model="params.departmentFk"
                     option-value="id"
@@ -61,8 +60,7 @@ const props = defineProps({
                     :use-like="false"
                     option-filter="firstName"
                     dense
-                    outlined
-                    rounded
+                    filled
                 />
                 <VnSelect
                     :label="t('claim.state')"
@@ -70,14 +68,12 @@ const props = defineProps({
                     :options="states"
                     option-label="description"
                     dense
-                    outlined
-                    rounded
+                    filled
                 />
                 <VnInputDate
                     v-model="params.created"
                     :label="t('claim.created')"
-                    outlined
-                    rounded
+                    filled
                     dense
                 />
                 <VnSelect
@@ -86,8 +82,7 @@ const props = defineProps({
                     url="Items/withName"
                     :use-like="false"
                     sort-by="id DESC"
-                    outlined
-                    rounded
+                    filled
                     dense
                 />
                 <VnSelect
@@ -98,15 +93,13 @@ const props = defineProps({
                     :use-like="false"
                     option-filter="firstName"
                     dense
-                    outlined
-                    rounded
+                    filled
                 />
                 <VnSelect
                     :label="t('claim.zone')"
                     v-model="params.zoneFk"
                     url="Zones"
-                    outlined
-                    rounded
+                    filled
                     dense
                 />
                 <QCheckbox
diff --git a/src/pages/Customer/Card/CustomerDescriptor.vue b/src/pages/Customer/Card/CustomerDescriptor.vue
index 8978c00f1..cd18cf2c9 100644
--- a/src/pages/Customer/Card/CustomerDescriptor.vue
+++ b/src/pages/Customer/Card/CustomerDescriptor.vue
@@ -7,7 +7,7 @@ import { toCurrency, toDate } from 'src/filters';
 
 import useCardDescription from 'src/composables/useCardDescription';
 
-import CardDescriptor from 'components/ui/CardDescriptor.vue';
+import EntityDescriptor from 'components/ui/EntityDescriptor.vue';
 import VnLv from 'src/components/ui/VnLv.vue';
 import CustomerDescriptorMenu from './CustomerDescriptorMenu.vue';
 import DepartmentDescriptorProxy from 'src/pages/Worker/Department/Card/DepartmentDescriptorProxy.vue';
@@ -54,7 +54,7 @@ const debtWarning = computed(() => {
 </script>
 
 <template>
-    <CardDescriptor
+    <EntityDescriptor
         :url="`Clients/${entityId}/getCard`"
         :summary="$props.summary"
         data-key="Customer"
@@ -232,7 +232,7 @@ const debtWarning = computed(() => {
                 </QBtn>
             </QCardActions>
         </template>
-    </CardDescriptor>
+    </EntityDescriptor>
 </template>
 
 <i18n>
diff --git a/src/pages/Customer/CustomerFilter.vue b/src/pages/Customer/CustomerFilter.vue
index 2ace6dd02..55a7f565e 100644
--- a/src/pages/Customer/CustomerFilter.vue
+++ b/src/pages/Customer/CustomerFilter.vue
@@ -41,7 +41,7 @@ const exprBuilder = (param, value) => {
         <template #body="{ params, searchFn }">
             <QItem class="q-my-sm">
                 <QItemSection>
-                    <VnInput :label="t('FI')" v-model="params.fi" is-outlined>
+                    <VnInput :label="t('FI')" v-model="params.fi" filled>
                         <template #prepend>
                             <QIcon name="badge" size="xs" />
                         </template>
@@ -50,7 +50,7 @@ const exprBuilder = (param, value) => {
             </QItem>
             <QItem class="q-mb-sm">
                 <QItemSection>
-                    <VnInput :label="t('Name')" v-model="params.name" is-outlined />
+                    <VnInput :label="t('Name')" v-model="params.name" filled />
                 </QItemSection>
             </QItem>
             <QItem class="q-mb-sm">
@@ -58,16 +58,15 @@ const exprBuilder = (param, value) => {
                     <VnInput
                         :label="t('customer.summary.socialName')"
                         v-model="params.socialName"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
             <QItem class="q-mb-sm">
                 <QItemSection>
                     <VnSelect
-                        outlined
                         dense
-                        rounded
+                        filled
                         :label="t('globals.params.departmentFk')"
                         v-model="params.departmentFk"
                         option-value="id"
@@ -89,8 +88,7 @@ const exprBuilder = (param, value) => {
                         map-options
                         hide-selected
                         dense
-                        outlined
-                        rounded
+                        filled
                         auto-load
                         :input-debounce="0"
                     />
@@ -98,12 +96,12 @@ const exprBuilder = (param, value) => {
             </QItem>
             <QItem class="q-mb-sm">
                 <QItemSection>
-                    <VnInput :label="t('City')" v-model="params.city" is-outlined />
+                    <VnInput :label="t('City')" v-model="params.city" filled />
                 </QItemSection>
             </QItem>
             <QItem class="q-mb-sm">
                 <QItemSection>
-                    <VnInput :label="t('Phone')" v-model="params.phone" is-outlined>
+                    <VnInput :label="t('Phone')" v-model="params.phone" filled>
                         <template #prepend>
                             <QIcon name="phone" size="xs" />
                         </template>
@@ -112,7 +110,7 @@ const exprBuilder = (param, value) => {
             </QItem>
             <QItem class="q-mb-sm">
                 <QItemSection>
-                    <VnInput :label="t('Email')" v-model="params.email" is-outlined>
+                    <VnInput :label="t('Email')" v-model="params.email" filled>
                         <template #prepend>
                             <QIcon name="email" size="sm" />
                         </template>
@@ -132,19 +130,14 @@ const exprBuilder = (param, value) => {
                         map-options
                         hide-selected
                         dense
-                        outlined
-                        rounded
+                        filled
                         auto-load
                         sortBy="name ASC"
                 /></QItemSection>
             </QItem>
             <QItem class="q-mb-sm">
                 <QItemSection>
-                    <VnInput
-                        :label="t('Postcode')"
-                        v-model="params.postcode"
-                        is-outlined
-                    />
+                    <VnInput :label="t('Postcode')" v-model="params.postcode" filled />
                 </QItemSection>
             </QItem>
         </template>
diff --git a/src/pages/Customer/Defaulter/CustomerDefaulterFilter.vue b/src/pages/Customer/Defaulter/CustomerDefaulterFilter.vue
index 0eab7b7c5..64e3baeb5 100644
--- a/src/pages/Customer/Defaulter/CustomerDefaulterFilter.vue
+++ b/src/pages/Customer/Defaulter/CustomerDefaulterFilter.vue
@@ -45,8 +45,7 @@ const departments = ref();
                     dense
                     option-label="name"
                     option-value="id"
-                    outlined
-                    rounded
+                    filled
                     emit-value
                     hide-selected
                     map-options
@@ -67,8 +66,7 @@ const departments = ref();
                         map-options
                         option-label="name"
                         option-value="id"
-                        outlined
-                        rounded
+                        filled
                         use-input
                         v-model="params.departmentFk"
                         @update:model-value="searchFn()"
@@ -91,8 +89,7 @@ const departments = ref();
                         map-options
                         option-label="name"
                         option-value="id"
-                        outlined
-                        rounded
+                        filled
                         use-input
                         v-model="params.countryFk"
                         @update:model-value="searchFn()"
@@ -108,7 +105,7 @@ const departments = ref();
                     <VnInput
                         :label="t('P. Method')"
                         clearable
-                        is-outlined
+                        filled
                         v-model="params.paymentMethod"
                     />
                 </QItemSection>
@@ -119,7 +116,7 @@ const departments = ref();
                     <VnInput
                         :label="t('Balance D.')"
                         clearable
-                        is-outlined
+                        filled
                         v-model="params.balance"
                     />
                 </QItemSection>
@@ -137,8 +134,7 @@ const departments = ref();
                         map-options
                         option-label="name"
                         option-value="id"
-                        outlined
-                        rounded
+                        filled
                         use-input
                         v-model="params.workerFk"
                         @update:model-value="searchFn()"
@@ -154,7 +150,7 @@ const departments = ref();
                     <VnInputDate
                         :label="t('L. O. Date')"
                         clearable
-                        is-outlined
+                        filled
                         v-model="params.date"
                     />
                 </QItemSection>
@@ -165,7 +161,7 @@ const departments = ref();
                     <VnInput
                         :label="t('Credit I.')"
                         clearable
-                        is-outlined
+                        filled
                         v-model="params.credit"
                     />
                 </QItemSection>
@@ -175,7 +171,7 @@ const departments = ref();
                 <QItemSection>
                     <VnInputDate
                         :label="t('From')"
-                        is-outlined
+                        filled
                         v-model="params.defaulterSinced"
                     />
                 </QItemSection>
diff --git a/src/pages/Customer/Payments/CustomerPaymentsFilter.vue b/src/pages/Customer/Payments/CustomerPaymentsFilter.vue
index 8982cba5a..ec20237b4 100644
--- a/src/pages/Customer/Payments/CustomerPaymentsFilter.vue
+++ b/src/pages/Customer/Payments/CustomerPaymentsFilter.vue
@@ -25,7 +25,7 @@ const props = defineProps({
         <template #body="{ params }">
             <QItem>
                 <QItemSection>
-                    <VnInput :label="t('Order ID')" v-model="params.orderFk" is-outlined>
+                    <VnInput :label="t('Order ID')" v-model="params.orderFk" filled>
                         <template #prepend>
                             <QIcon name="vn:basket" size="xs" />
                         </template>
@@ -34,11 +34,7 @@ const props = defineProps({
             </QItem>
             <QItem>
                 <QItemSection>
-                    <VnInput
-                        :label="t('Customer ID')"
-                        v-model="params.clientFk"
-                        is-outlined
-                    >
+                    <VnInput :label="t('Customer ID')" v-model="params.clientFk" filled>
                         <template #prepend>
                             <QIcon name="vn:client" size="xs" />
                         </template>
@@ -47,19 +43,15 @@ const props = defineProps({
             </QItem>
             <QItem>
                 <QItemSection>
-                    <VnInputNumber
-                        :label="t('Amount')"
-                        v-model="params.amount"
-                        is-outlined
-                    />
+                    <VnInputNumber :label="t('Amount')" v-model="params.amount" filled />
                 </QItemSection>
             </QItem>
             <QItem>
                 <QItemSection>
-                    <VnInputDate v-model="params.from" :label="t('From')" is-outlined />
+                    <VnInputDate v-model="params.from" :label="t('From')" filled />
                 </QItemSection>
                 <QItemSection>
-                    <VnInputDate v-model="params.to" :label="t('To')" is-outlined />
+                    <VnInputDate v-model="params.to" :label="t('To')" filled />
                 </QItemSection>
             </QItem>
         </template>
diff --git a/src/pages/Entry/Card/EntryDescriptor.vue b/src/pages/Entry/Card/EntryDescriptor.vue
index 313ed3d72..560114283 100644
--- a/src/pages/Entry/Card/EntryDescriptor.vue
+++ b/src/pages/Entry/Card/EntryDescriptor.vue
@@ -6,7 +6,7 @@ import { toDate } from 'src/filters';
 import { getUrl } from 'src/composables/getUrl';
 import { useQuasar } from 'quasar';
 import { usePrintService } from 'composables/usePrintService';
-import CardDescriptor from 'components/ui/CardDescriptor.vue';
+import EntityDescriptor from 'components/ui/EntityDescriptor.vue';
 import VnLv from 'src/components/ui/VnLv.vue';
 import TravelDescriptorProxy from 'src/pages/Travel/Card/TravelDescriptorProxy.vue';
 import axios from 'axios';
@@ -145,7 +145,7 @@ async function deleteEntry() {
 </script>
 
 <template>
-    <CardDescriptor
+    <EntityDescriptor
         :url="`Entries/${entityId}`"
         :filter="entryFilter"
         title="supplier.nickname"
@@ -264,7 +264,7 @@ async function deleteEntry() {
                 </QBtn>
             </QCardActions>
         </template>
-    </CardDescriptor>
+    </EntityDescriptor>
 </template>
 <i18n>
 es:
diff --git a/src/pages/Entry/EntryFilter.vue b/src/pages/Entry/EntryFilter.vue
index 82bcb1a79..19f4bca86 100644
--- a/src/pages/Entry/EntryFilter.vue
+++ b/src/pages/Entry/EntryFilter.vue
@@ -101,14 +101,14 @@ const entryFilterPanel = ref();
                         :label="t('params.landed')"
                         v-model="params.landed"
                         @update:model-value="searchFn()"
-                        is-outlined
+                        filled
                         data-cy="landed"
                     />
                 </QItemSection>
             </QItem>
             <QItem>
                 <QItemSection>
-                    <VnInput v-model="params.id" label="Id" is-outlined />
+                    <VnInput v-model="params.id" label="Id" filled />
                 </QItemSection>
             </QItem>
             <QItem>
@@ -118,8 +118,7 @@ const entryFilterPanel = ref();
                         @update:model-value="searchFn()"
                         hide-selected
                         dense
-                        outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -128,7 +127,7 @@ const entryFilterPanel = ref();
                     <VnInput
                         v-model="params.reference"
                         :label="t('entry.list.tableVisibleColumns.reference')"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -143,8 +142,7 @@ const entryFilterPanel = ref();
                         :fields="['id', 'name']"
                         hide-selected
                         dense
-                        outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -153,7 +151,7 @@ const entryFilterPanel = ref();
                     <VnInput
                         v-model="params.evaNotes"
                         :label="t('params.evaNotes')"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -168,8 +166,7 @@ const entryFilterPanel = ref();
                         sort-by="name ASC"
                         hide-selected
                         dense
-                        outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -184,8 +181,7 @@ const entryFilterPanel = ref();
                         sort-by="name ASC"
                         hide-selected
                         dense
-                        outlined
-                        rounded
+                        filled
                     >
                         <template #option="scope">
                             <QItem v-bind="scope.itemProps">
@@ -207,7 +203,7 @@ const entryFilterPanel = ref();
                     <VnInput
                         v-model="params.invoiceNumber"
                         :label="t('params.invoiceNumber')"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -224,8 +220,16 @@ const entryFilterPanel = ref();
                         option-label="description"
                         hide-selected
                         dense
-                        outlined
-                        rounded
+                        filled
+                    />
+                </QItemSection>
+            </QItem>
+            <QItem>
+                <QItemSection>
+                    <VnInput
+                        v-model="params.evaNotes"
+                        :label="t('params.evaNotes')"
+                        filled
                     />
                 </QItemSection>
             </QItem>
diff --git a/src/pages/InvoiceIn/Card/InvoiceInDescriptor.vue b/src/pages/InvoiceIn/Card/InvoiceInDescriptor.vue
index eb673c546..e8df27511 100644
--- a/src/pages/InvoiceIn/Card/InvoiceInDescriptor.vue
+++ b/src/pages/InvoiceIn/Card/InvoiceInDescriptor.vue
@@ -5,7 +5,7 @@ import { useI18n } from 'vue-i18n';
 import axios from 'axios';
 import { toCurrency, toDate } from 'src/filters';
 import VnLv from 'src/components/ui/VnLv.vue';
-import CardDescriptor from 'components/ui/CardDescriptor.vue';
+import EntityDescriptor from 'components/ui/EntityDescriptor.vue';
 import SupplierDescriptorProxy from 'src/pages/Supplier/Card/SupplierDescriptorProxy.vue';
 import filter from './InvoiceInFilter.js';
 import InvoiceInDescriptorMenu from './InvoiceInDescriptorMenu.vue';
@@ -84,7 +84,7 @@ async function setInvoiceCorrection(id) {
 }
 </script>
 <template>
-    <CardDescriptor
+    <EntityDescriptor
         ref="cardDescriptorRef"
         data-key="InvoiceIn"
         :url="`InvoiceIns/${entityId}`"
@@ -159,7 +159,7 @@ async function setInvoiceCorrection(id) {
                 </QBtn>
             </QCardActions>
         </template>
-    </CardDescriptor>
+    </EntityDescriptor>
 </template>
 <style lang="scss" scoped>
 .q-dialog {
diff --git a/src/pages/InvoiceIn/InvoiceInFilter.vue b/src/pages/InvoiceIn/InvoiceInFilter.vue
index a4fb0d653..6551a7ca9 100644
--- a/src/pages/InvoiceIn/InvoiceInFilter.vue
+++ b/src/pages/InvoiceIn/InvoiceInFilter.vue
@@ -40,17 +40,13 @@ function handleDaysAgo(params, daysAgo) {
                     <VnInputDate
                         :label="$t('globals.from')"
                         v-model="params.from"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
             <QItem>
                 <QItemSection>
-                    <VnInputDate
-                        :label="$t('globals.to')"
-                        v-model="params.to"
-                        is-outlined
-                    />
+                    <VnInputDate :label="$t('globals.to')" v-model="params.to" filled />
                 </QItemSection>
             </QItem>
             <QItem>
@@ -58,7 +54,7 @@ function handleDaysAgo(params, daysAgo) {
                     <VnInputNumber
                         :label="$t('globals.daysAgo')"
                         v-model="params.daysAgo"
-                        is-outlined
+                        filled
                         :step="0"
                         @update:model-value="(val) => handleDaysAgo(params, val)"
                         @remove="(val) => handleDaysAgo(params, val)"
@@ -67,12 +63,7 @@ function handleDaysAgo(params, daysAgo) {
             </QItem>
             <QItem>
                 <QItemSection>
-                    <VnSelectSupplier
-                        v-model="params.supplierFk"
-                        dense
-                        outlined
-                        rounded
-                    />
+                    <VnSelectSupplier v-model="params.supplierFk" dense filled />
                 </QItemSection>
             </QItem>
             <QItem>
@@ -80,7 +71,7 @@ function handleDaysAgo(params, daysAgo) {
                     <VnInput
                         :label="getLocale('supplierRef')"
                         v-model="params.supplierRef"
-                        is-outlined
+                        filled
                         lazy-rules
                     />
                 </QItemSection>
@@ -90,7 +81,7 @@ function handleDaysAgo(params, daysAgo) {
                     <VnInput
                         :label="getLocale('fi')"
                         v-model="params.fi"
-                        is-outlined
+                        filled
                         lazy-rules
                     />
                 </QItemSection>
@@ -100,7 +91,7 @@ function handleDaysAgo(params, daysAgo) {
                     <VnInput
                         :label="getLocale('serial')"
                         v-model="params.serial"
-                        is-outlined
+                        filled
                         lazy-rules
                     />
                 </QItemSection>
@@ -110,7 +101,7 @@ function handleDaysAgo(params, daysAgo) {
                     <VnInput
                         :label="getLocale('account')"
                         v-model="params.account"
-                        is-outlined
+                        filled
                         lazy-rules
                     />
                 </QItemSection>
@@ -120,7 +111,7 @@ function handleDaysAgo(params, daysAgo) {
                     <VnInput
                         :label="getLocale('globals.params.awbCode')"
                         v-model="params.awbCode"
-                        is-outlined
+                        filled
                         lazy-rules
                     />
                 </QItemSection>
@@ -130,7 +121,7 @@ function handleDaysAgo(params, daysAgo) {
                     <VnInputNumber
                         :label="$t('globals.amount')"
                         v-model="params.amount"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -142,7 +133,7 @@ function handleDaysAgo(params, daysAgo) {
                         url="Companies"
                         option-label="code"
                         :fields="['id', 'code']"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
diff --git a/src/pages/InvoiceIn/Serial/InvoiceInSerialFilter.vue b/src/pages/InvoiceIn/Serial/InvoiceInSerialFilter.vue
index 19ed73e50..66b7fa433 100644
--- a/src/pages/InvoiceIn/Serial/InvoiceInSerialFilter.vue
+++ b/src/pages/InvoiceIn/Serial/InvoiceInSerialFilter.vue
@@ -25,8 +25,7 @@ const { t } = useI18n();
                     <VnInputNumber
                         v-model="params.daysAgo"
                         :label="t('params.daysAgo')"
-                        outlined
-                        rounded
+                        filled
                         dense
                     />
                 </QItemSection>
@@ -36,8 +35,7 @@ const { t } = useI18n();
                     <VnInput
                         v-model="params.serial"
                         :label="t('params.serial')"
-                        outlined
-                        rounded
+                        filled
                         dense
                     />
                 </QItemSection>
diff --git a/src/pages/InvoiceOut/Card/InvoiceOutDescriptor.vue b/src/pages/InvoiceOut/Card/InvoiceOutDescriptor.vue
index 2402c0bf6..b93b8c8b7 100644
--- a/src/pages/InvoiceOut/Card/InvoiceOutDescriptor.vue
+++ b/src/pages/InvoiceOut/Card/InvoiceOutDescriptor.vue
@@ -3,7 +3,7 @@ import { ref, computed } from 'vue';
 import { useRoute } from 'vue-router';
 import { useI18n } from 'vue-i18n';
 
-import CardDescriptor from 'components/ui/CardDescriptor.vue';
+import EntityDescriptor from 'components/ui/EntityDescriptor.vue';
 import CustomerDescriptorProxy from 'pages/Customer/Card/CustomerDescriptorProxy.vue';
 import VnLv from 'src/components/ui/VnLv.vue';
 import InvoiceOutDescriptorMenu from './InvoiceOutDescriptorMenu.vue';
@@ -34,7 +34,7 @@ function ticketFilter(invoice) {
 </script>
 
 <template>
-    <CardDescriptor
+    <EntityDescriptor
         ref="descriptor"
         :url="`InvoiceOuts/${entityId}`"
         :filter="filter"
@@ -93,5 +93,5 @@ function ticketFilter(invoice) {
                 </QBtn>
             </QCardActions>
         </template>
-    </CardDescriptor>
+    </EntityDescriptor>
 </template>
diff --git a/src/pages/InvoiceOut/InvoiceOutFilter.vue b/src/pages/InvoiceOut/InvoiceOutFilter.vue
index 99524e0d6..93a343565 100644
--- a/src/pages/InvoiceOut/InvoiceOutFilter.vue
+++ b/src/pages/InvoiceOut/InvoiceOutFilter.vue
@@ -33,17 +33,13 @@ const states = ref();
                     <VnInput
                         :label="t('globals.params.clientFk')"
                         v-model="params.clientFk"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
             <QItem>
                 <QItemSection>
-                    <VnInput
-                        v-model="params.fi"
-                        :label="t('globals.params.fi')"
-                        is-outlined
-                    />
+                    <VnInput v-model="params.fi" :label="t('globals.params.fi')" filled />
                 </QItemSection>
             </QItem>
             <QItem>
@@ -51,7 +47,7 @@ const states = ref();
                     <VnInputNumber
                         :label="t('globals.amount')"
                         v-model="params.amount"
-                        is-outlined
+                        filled
                         data-cy="InvoiceOutFilterAmountBtn"
                     />
                 </QItemSection>
@@ -62,8 +58,7 @@ const states = ref();
                         :label="t('invoiceOut.params.min')"
                         dense
                         lazy-rules
-                        outlined
-                        rounded
+                        filled
                         type="number"
                         v-model.number="params.min"
                     />
@@ -73,8 +68,7 @@ const states = ref();
                         :label="t('invoiceOut.params.max')"
                         dense
                         lazy-rules
-                        outlined
-                        rounded
+                        filled
                         type="number"
                         v-model.number="params.max"
                     />
@@ -94,7 +88,7 @@ const states = ref();
                     <VnInputDate
                         v-model="params.created"
                         :label="t('invoiceOut.params.created')"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -103,15 +97,14 @@ const states = ref();
                     <VnInputDate
                         v-model="params.dued"
                         :label="t('invoiceOut.params.dued')"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
             <QItem>
                 <QItemSection>
                     <VnSelect
-                        outlined
-                        rounded
+                        filled
                         :label="t('globals.params.departmentFk')"
                         v-model="params.departmentFk"
                         option-value="id"
diff --git a/src/pages/InvoiceOut/InvoiceOutGlobalForm.vue b/src/pages/InvoiceOut/InvoiceOutGlobalForm.vue
index 392256473..53433c56b 100644
--- a/src/pages/InvoiceOut/InvoiceOutGlobalForm.vue
+++ b/src/pages/InvoiceOut/InvoiceOutGlobalForm.vue
@@ -26,7 +26,7 @@ const serialTypesOptions = ref([]);
 
 const handleInvoiceOutSerialsFetch = (data) => {
     serialTypesOptions.value = Array.from(
-        new Set(data.map((item) => item.type).filter((type) => type))
+        new Set(data.map((item) => item.type).filter((type) => type)),
     );
 };
 
@@ -99,8 +99,7 @@ onMounted(async () => {
                 option-label="name"
                 hide-selected
                 dense
-                outlined
-                rounded
+                filled
                 data-cy="InvoiceOutGlobalClientSelect"
             >
                 <template #option="scope">
@@ -124,19 +123,18 @@ onMounted(async () => {
                 option-label="type"
                 hide-selected
                 dense
-                outlined
-                rounded
+                filled
                 data-cy="InvoiceOutGlobalSerialSelect"
             />
             <VnInputDate
                 v-model="formData.invoiceDate"
                 :label="t('invoiceDate')"
-                is-outlined
+                filled
             />
             <VnInputDate
                 v-model="formData.maxShipped"
                 :label="t('maxShipped')"
-                is-outlined
+                filled
                 data-cy="InvoiceOutGlobalMaxShippedDate"
             />
             <VnSelect
@@ -145,8 +143,7 @@ onMounted(async () => {
                 :options="companiesOptions"
                 option-label="code"
                 dense
-                outlined
-                rounded
+                filled
                 data-cy="InvoiceOutGlobalCompanySelect"
             />
             <VnSelect
@@ -154,8 +151,7 @@ onMounted(async () => {
                 v-model="formData.printer"
                 :options="printersOptions"
                 dense
-                outlined
-                rounded
+                filled
                 data-cy="InvoiceOutGlobalPrinterSelect"
             />
         </div>
@@ -166,7 +162,7 @@ onMounted(async () => {
             color="primary"
             class="q-mt-md full-width"
             unelevated
-            rounded
+            filled
             dense
         />
         <QBtn
@@ -175,7 +171,7 @@ onMounted(async () => {
             color="primary"
             class="q-mt-md full-width"
             unelevated
-            rounded
+            filled
             dense
             @click="getStatus = 'stopping'"
         />
diff --git a/src/pages/InvoiceOut/InvoiceOutNegativeBasesFilter.vue b/src/pages/InvoiceOut/InvoiceOutNegativeBasesFilter.vue
index b24c8b247..1e2f80ec2 100644
--- a/src/pages/InvoiceOut/InvoiceOutNegativeBasesFilter.vue
+++ b/src/pages/InvoiceOut/InvoiceOutNegativeBasesFilter.vue
@@ -35,17 +35,13 @@ const props = defineProps({
                     <VnInputDate
                         v-model="params.from"
                         :label="t('globals.from')"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
             <QItem>
                 <QItemSection>
-                    <VnInputDate
-                        v-model="params.to"
-                        :label="t('globals.to')"
-                        is-outlined
-                    />
+                    <VnInputDate v-model="params.to" :label="t('globals.to')" filled />
                 </QItemSection>
             </QItem>
             <QItem>
@@ -57,8 +53,7 @@ const props = defineProps({
                         option-label="code"
                         option-value="code"
                         dense
-                        outlined
-                        rounded
+                        filled
                         @update:model-value="searchFn()"
                     >
                         <template #option="scope">
@@ -84,9 +79,8 @@ const props = defineProps({
                         v-model="params.country"
                         option-label="name"
                         option-value="name"
-                        outlined
                         dense
-                        rounded
+                        filled
                         @update:model-value="searchFn()"
                     >
                         <template #option="scope">
@@ -110,9 +104,8 @@ const props = defineProps({
                         url="Clients"
                         :label="t('globals.client')"
                         v-model="params.clientId"
-                        outlined
                         dense
-                        rounded
+                        filled
                         @update:model-value="searchFn()"
                     />
                 </QItemSection>
@@ -122,7 +115,7 @@ const props = defineProps({
                     <VnInputNumber
                         v-model="params.amount"
                         :label="t('globals.amount')"
-                        is-outlined
+                        filled
                         :positive="false"
                     />
                 </QItemSection>
@@ -130,9 +123,8 @@ const props = defineProps({
             <QItem>
                 <QItemSection>
                     <VnSelect
-                        outlined
                         dense
-                        rounded
+                        filled
                         :label="t('globals.params.departmentFk')"
                         v-model="params.departmentFk"
                         option-value="id"
diff --git a/src/pages/Item/Card/ItemDescriptor.vue b/src/pages/Item/Card/ItemDescriptor.vue
index 84e07a293..09f63a3b1 100644
--- a/src/pages/Item/Card/ItemDescriptor.vue
+++ b/src/pages/Item/Card/ItemDescriptor.vue
@@ -3,7 +3,7 @@ import { computed, ref, onMounted } from 'vue';
 import { useRoute } from 'vue-router';
 import { useI18n } from 'vue-i18n';
 
-import CardDescriptor from 'src/components/ui/CardDescriptor.vue';
+import EntityDescriptor from 'src/components/ui/EntityDescriptor.vue';
 import VnLv from 'src/components/ui/VnLv.vue';
 import WorkerDescriptorProxy from 'src/pages/Worker/Card/WorkerDescriptorProxy.vue';
 import ItemDescriptorImage from 'src/pages/Item/Card/ItemDescriptorImage.vue';
@@ -90,7 +90,7 @@ const updateStock = async () => {
 </script>
 
 <template>
-    <CardDescriptor
+    <EntityDescriptor
         data-key="Item"
         :summary="$props.summary"
         :url="`Items/${entityId}/getCard`"
@@ -162,7 +162,7 @@ const updateStock = async () => {
                 </QBtn>
             </QCardActions>
         </template>
-    </CardDescriptor>
+    </EntityDescriptor>
 </template>
 
 <i18n>
diff --git a/src/pages/Item/ItemFixedPriceFilter.vue b/src/pages/Item/ItemFixedPriceFilter.vue
index 8d92e245d..d68b966c6 100644
--- a/src/pages/Item/ItemFixedPriceFilter.vue
+++ b/src/pages/Item/ItemFixedPriceFilter.vue
@@ -13,7 +13,6 @@ const props = defineProps({
         required: true,
     },
 });
-
 </script>
 
 <template>
@@ -28,8 +27,7 @@ const props = defineProps({
                         :fields="['id', 'nickname']"
                         option-label="nickname"
                         dense
-                        outlined
-                        rounded
+                        filled
                         use-input
                         @update:model-value="searchFn()"
                         sort-by="nickname ASC"
@@ -46,8 +44,7 @@ const props = defineProps({
                         :label="t('params.warehouseFk')"
                         v-model="params.warehouseFk"
                         dense
-                        outlined
-                        rounded
+                        filled
                         use-input
                         @update:model-value="searchFn()"
                     />
@@ -58,7 +55,7 @@ const props = defineProps({
                     <VnInputDate
                         :label="t('params.started')"
                         v-model="params.started"
-                        is-outlined
+                        filled
                         @update:model-value="searchFn()"
                     />
                 </QItemSection>
@@ -68,7 +65,7 @@ const props = defineProps({
                     <VnInputDate
                         :label="t('params.ended')"
                         v-model="params.ended"
-                        is-outlined
+                        filled
                         @update:model-value="searchFn()"
                     />
                 </QItemSection>
diff --git a/src/pages/Item/ItemListFilter.vue b/src/pages/Item/ItemListFilter.vue
index 22e948e06..f4500d5fa 100644
--- a/src/pages/Item/ItemListFilter.vue
+++ b/src/pages/Item/ItemListFilter.vue
@@ -177,11 +177,7 @@ onMounted(async () => {
         <template #body="{ params, searchFn }">
             <QItem>
                 <QItemSection>
-                    <VnInput
-                        v-model="params.search"
-                        :label="t('params.search')"
-                        is-outlined
-                    />
+                    <VnInput v-model="params.search" :label="t('params.search')" filled />
                 </QItemSection>
             </QItem>
             <QItem>
@@ -197,8 +193,7 @@ onMounted(async () => {
                         option-label="name"
                         hide-selected
                         dense
-                        outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -213,8 +208,7 @@ onMounted(async () => {
                         option-label="name"
                         hide-selected
                         dense
-                        outlined
-                        rounded
+                        filled
                     >
                         <template #option="scope">
                             <QItem v-bind="scope.itemProps">
@@ -240,8 +234,7 @@ onMounted(async () => {
                         option-label="nickname"
                         hide-selected
                         dense
-                        outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -252,8 +245,7 @@ onMounted(async () => {
                         @update:model-value="searchFn()"
                         hide-selected
                         dense
-                        outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -282,8 +274,7 @@ onMounted(async () => {
                         :options="tagOptions"
                         option-label="name"
                         dense
-                        outlined
-                        rounded
+                        filled
                         :emit-value="false"
                         use-input
                         :is-clearable="false"
@@ -299,8 +290,7 @@ onMounted(async () => {
                         option-value="value"
                         option-label="value"
                         dense
-                        outlined
-                        rounded
+                        filled
                         emit-value
                         use-input
                         :disable="!tag"
@@ -312,7 +302,7 @@ onMounted(async () => {
                         v-model="tag.value"
                         :label="t('params.value')"
                         :disable="!tag"
-                        is-outlined
+                        filled
                         :is-clearable="false"
                         @keydown.enter.prevent="applyTags(params, searchFn)"
                     />
@@ -351,8 +341,7 @@ onMounted(async () => {
                         option-label="label"
                         option-value="label"
                         dense
-                        outlined
-                        rounded
+                        filled
                         :emit-value="false"
                         use-input
                         :is-clearable="false"
@@ -377,7 +366,7 @@ onMounted(async () => {
                         v-model="fieldFilter.value"
                         :label="t('params.value')"
                         :disable="!fieldFilter.selectedField"
-                        is-outlined
+                        filled
                         @keydown.enter="applyFieldFilters(params, searchFn)"
                     />
                 </QItemSection>
diff --git a/src/pages/Item/ItemRequestFilter.vue b/src/pages/Item/ItemRequestFilter.vue
index a29203df3..68f36c566 100644
--- a/src/pages/Item/ItemRequestFilter.vue
+++ b/src/pages/Item/ItemRequestFilter.vue
@@ -87,11 +87,7 @@ onMounted(async () => {
         <template #body="{ params, searchFn }">
             <QItem>
                 <QItemSection>
-                    <VnInput
-                        v-model="params.search"
-                        :label="t('params.search')"
-                        is-outlined
-                    />
+                    <VnInput v-model="params.search" :label="t('params.search')" filled />
                 </QItemSection>
             </QItem>
             <QItem>
@@ -99,7 +95,7 @@ onMounted(async () => {
                     <VnInput
                         v-model="params.ticketFk"
                         :label="t('params.ticketFk')"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -114,8 +110,7 @@ onMounted(async () => {
                         option-label="nickname"
                         hide-selected
                         dense
-                        outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -124,7 +119,7 @@ onMounted(async () => {
                     <VnInput
                         v-model="params.clientFk"
                         :label="t('params.clientFk')"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -139,8 +134,7 @@ onMounted(async () => {
                         option-label="name"
                         hide-selected
                         dense
-                        outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -153,25 +147,16 @@ onMounted(async () => {
                         :params="{ departmentCodes: ['VT'] }"
                         hide-selected
                         dense
-                        outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
             <QItem>
                 <QItemSection>
-                    <VnInputDate
-                        v-model="params.from"
-                        :label="t('params.from')"
-                        is-outlined
-                    />
+                    <VnInputDate v-model="params.from" :label="t('params.from')" filled />
                 </QItemSection>
                 <QItemSection>
-                    <VnInputDate
-                        v-model="params.to"
-                        :label="t('params.to')"
-                        is-outlined
-                    />
+                    <VnInputDate v-model="params.to" :label="t('params.to')" filled />
                 </QItemSection>
             </QItem>
             <QItem>
@@ -180,7 +165,7 @@ onMounted(async () => {
                         :label="t('params.daysOnward')"
                         v-model="params.daysOnward"
                         lazy-rules
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -195,8 +180,7 @@ onMounted(async () => {
                         option-label="name"
                         hide-selected
                         dense
-                        outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
diff --git a/src/pages/Item/ItemType/Card/ItemTypeDescriptor.vue b/src/pages/Item/ItemType/Card/ItemTypeDescriptor.vue
index 972f4cad9..106b005bf 100644
--- a/src/pages/Item/ItemType/Card/ItemTypeDescriptor.vue
+++ b/src/pages/Item/ItemType/Card/ItemTypeDescriptor.vue
@@ -2,7 +2,7 @@
 import { computed } from 'vue';
 import { useRoute } from 'vue-router';
 
-import CardDescriptor from 'components/ui/CardDescriptor.vue';
+import EntityDescriptor from 'components/ui/EntityDescriptor.vue';
 import VnLv from 'src/components/ui/VnLv.vue';
 import WorkerDescriptorProxy from 'src/pages/Worker/Card/WorkerDescriptorProxy.vue';
 import filter from './ItemTypeFilter.js';
@@ -25,7 +25,7 @@ const entityId = computed(() => {
 });
 </script>
 <template>
-    <CardDescriptor
+    <EntityDescriptor
         :url="`ItemTypes/${entityId}`"
         :filter="filter"
         title="code"
@@ -46,5 +46,5 @@ const entityId = computed(() => {
                 :value="entity.category?.name"
             />
         </template>
-    </CardDescriptor>
+    </EntityDescriptor>
 </template>
diff --git a/src/pages/Monitor/Ticket/MonitorTicketFilter.vue b/src/pages/Monitor/Ticket/MonitorTicketFilter.vue
index 447dd35b8..535906e17 100644
--- a/src/pages/Monitor/Ticket/MonitorTicketFilter.vue
+++ b/src/pages/Monitor/Ticket/MonitorTicketFilter.vue
@@ -77,7 +77,7 @@ const getLocale = (label) => {
                     <VnInput
                         :label="t('globals.params.clientFk')"
                         v-model="params.clientFk"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -86,7 +86,7 @@ const getLocale = (label) => {
                     <VnInput
                         :label="t('params.orderFk')"
                         v-model="params.orderFk"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -95,7 +95,7 @@ const getLocale = (label) => {
                     <VnInputNumber
                         :label="t('params.scopeDays')"
                         v-model="params.scopeDays"
-                        is-outlined
+                        filled
                         @update:model-value="(val) => handleScopeDays(params, val)"
                         @remove="(val) => handleScopeDays(params, val)"
                     />
@@ -106,66 +106,54 @@ const getLocale = (label) => {
                     <VnInput
                         :label="t('params.nickname')"
                         v-model="params.nickname"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
             <QItem>
                 <QItemSection>
                     <VnSelect
-                        outlined
                         dense
-                        rounded
+                        filled
                         :label="t('globals.params.departmentFk')"
                         v-model="params.departmentFk"
-                        option-value="id"
-                        option-label="name"
                         url="Departments"
                     />
                 </QItemSection>
             </QItem>
             <QItem>
                 <QItemSection>
-                    <VnInput
-                        :label="t('params.refFk')"
-                        v-model="params.refFk"
-                        is-outlined
-                    />
+                    <VnInput :label="t('params.refFk')" v-model="params.refFk" filled />
                 </QItemSection>
             </QItem>
 
             <QItem>
                 <QItemSection>
                     <VnSelect
-                        outlined
                         dense
-                        rounded
+                        filled
                         :label="t('params.agencyModeFk')"
                         v-model="params.agencyModeFk"
                         url="AgencyModes/isActive"
-                        is-outlined
                     />
                 </QItemSection>
             </QItem>
             <QItem>
                 <QItemSection>
                     <VnSelect
-                        outlined
                         dense
-                        rounded
+                        filled
                         :label="t('globals.params.stateFk')"
                         v-model="params.stateFk"
                         url="States"
-                        is-outlined
                     />
                 </QItemSection>
             </QItem>
             <QItem>
                 <QItemSection>
                     <VnSelect
-                        outlined
                         dense
-                        rounded
+                        filled
                         :label="t('params.groupedStates')"
                         v-model="params.alertLevel"
                         :options="groupedStates"
@@ -176,9 +164,8 @@ const getLocale = (label) => {
             <QItem>
                 <QItemSection>
                     <VnSelect
-                        outlined
                         dense
-                        rounded
+                        filled
                         :label="t('globals.params.warehouseFk')"
                         v-model="params.warehouseFk"
                         :options="warehouses"
@@ -188,9 +175,8 @@ const getLocale = (label) => {
             <QItem>
                 <QItemSection>
                     <VnSelect
-                        outlined
                         dense
-                        rounded
+                        filled
                         :label="t('globals.params.countryFk')"
                         v-model="params.countryFk"
                         url="Countries"
@@ -200,9 +186,8 @@ const getLocale = (label) => {
             <QItem>
                 <QItemSection>
                     <VnSelect
-                        outlined
                         dense
-                        rounded
+                        filled
                         :label="t('globals.params.provinceFk')"
                         v-model="params.provinceFk"
                         url="Provinces"
@@ -212,9 +197,8 @@ const getLocale = (label) => {
             <QItem>
                 <QItemSection>
                     <VnSelect
-                        outlined
                         dense
-                        rounded
+                        filled
                         :label="t('globals.params.departmentFk')"
                         v-model="params.department"
                         option-label="name"
@@ -226,9 +210,8 @@ const getLocale = (label) => {
             <QItem>
                 <QItemSection>
                     <VnSelect
-                        outlined
                         dense
-                        rounded
+                        filled
                         :label="t('globals.params.packing')"
                         v-model="params.packing"
                         url="ItemPackingTypes"
diff --git a/src/pages/Order/Card/CatalogFilterValueDialog.vue b/src/pages/Order/Card/CatalogFilterValueDialog.vue
index d1bd48c9e..10273a254 100644
--- a/src/pages/Order/Card/CatalogFilterValueDialog.vue
+++ b/src/pages/Order/Card/CatalogFilterValueDialog.vue
@@ -57,9 +57,8 @@ const getSelectedTagValues = async (tag) => {
                 option-value="id"
                 option-label="name"
                 dense
-                outlined
                 class="q-mb-md"
-                rounded
+                filled
                 :emit-value="false"
                 use-input
                 @update:model-value="getSelectedTagValues"
@@ -79,8 +78,7 @@ const getSelectedTagValues = async (tag) => {
                         option-value="value"
                         option-label="value"
                         dense
-                        outlined
-                        rounded
+                        filled
                         emit-value
                         use-input
                         :disable="!value || !selectedTag"
@@ -92,16 +90,14 @@ const getSelectedTagValues = async (tag) => {
                         v-model="value.value"
                         :label="t('components.itemsFilterPanel.value')"
                         :disable="!value"
-                        is-outlined
                         class="col"
                         data-cy="catalogFilterValueDialogValueInput"
                     />
                     <QBtn
                         icon="delete"
                         size="md"
-                        outlined
                         dense
-                        rounded
+                        filled
                         flat
                         class="filter-icon col-2"
                         @click="tagValues.splice(index, 1)"
diff --git a/src/pages/Order/Card/OrderCard.vue b/src/pages/Order/Card/OrderCard.vue
index 7dab307a0..11dbbe532 100644
--- a/src/pages/Order/Card/OrderCard.vue
+++ b/src/pages/Order/Card/OrderCard.vue
@@ -6,9 +6,11 @@ import filter from './OrderFilter.js';
 
 <template>
     <VnCard
-        data-key="Order"
+        :data-key="$attrs['data-key'] ?? 'Order'"
         url="Orders"
         :filter="filter"
         :descriptor="OrderDescriptor"
+        v-bind="$attrs"
+        v-on="$attrs"
     />
 </template>
diff --git a/src/pages/Order/Card/OrderCatalogFilter.vue b/src/pages/Order/Card/OrderCatalogFilter.vue
index d16a92017..cb380c48f 100644
--- a/src/pages/Order/Card/OrderCatalogFilter.vue
+++ b/src/pages/Order/Card/OrderCatalogFilter.vue
@@ -221,8 +221,7 @@ function addOrder(value, field, params) {
                         option-value="id"
                         option-label="name"
                         dense
-                        outlined
-                        rounded
+                        filled
                         emit-value
                         use-input
                         sort-by="name ASC"
@@ -251,8 +250,7 @@ function addOrder(value, field, params) {
                         v-model="orderBySelected"
                         :options="orderByList"
                         dense
-                        outlined
-                        rounded
+                        filled
                         @update:model-value="(value) => addOrder(value, 'field', params)"
                     />
                 </QItemSection>
@@ -264,8 +262,7 @@ function addOrder(value, field, params) {
                         v-model="orderWaySelected"
                         :options="orderWayList"
                         dense
-                        outlined
-                        rounded
+                        filled
                         @update:model-value="(value) => addOrder(value, 'way', params)"
                     />
                 </QItemSection>
@@ -275,8 +272,7 @@ function addOrder(value, field, params) {
                 <VnInput
                     :label="t('components.itemsFilterPanel.value')"
                     dense
-                    outlined
-                    rounded
+                    filled
                     :is-clearable="false"
                     v-model="searchByTag"
                     @keyup.enter="(val) => onSearchByTag(val, params)"
diff --git a/src/pages/Order/Card/OrderDescriptor.vue b/src/pages/Order/Card/OrderDescriptor.vue
index f34549c1e..ee66bb57e 100644
--- a/src/pages/Order/Card/OrderDescriptor.vue
+++ b/src/pages/Order/Card/OrderDescriptor.vue
@@ -4,10 +4,10 @@ import { useRoute } from 'vue-router';
 import { useI18n } from 'vue-i18n';
 import { toCurrency, toDate } from 'src/filters';
 import { useState } from 'src/composables/useState';
-import filter from './OrderFilter.js';
-import CardDescriptor from 'components/ui/CardDescriptor.vue';
 import VnLv from 'src/components/ui/VnLv.vue';
 import FetchData from 'components/FetchData.vue';
+import OrderCard from './OrderCard.vue';
+import CardDescriptor from 'src/components/ui/CardDescriptor.vue';
 import DepartmentDescriptorProxy from 'src/pages/Worker/Department/Card/DepartmentDescriptorProxy.vue';
 
 const DEFAULT_ITEMS = 0;
@@ -24,11 +24,14 @@ const route = useRoute();
 const state = useState();
 const { t } = useI18n();
 const getTotalRef = ref();
+const total = ref(0);
 
 const entityId = computed(() => {
     return $props.id || route.params.id;
 });
 
+const orderTotal = computed(() => state.get('orderTotal') ?? 0);
+
 const setData = (entity) => {
     if (!entity) return;
     getTotalRef.value && getTotalRef.value.fetch();
@@ -38,9 +41,6 @@ const setData = (entity) => {
 const getConfirmationValue = (isConfirmed) => {
     return t(isConfirmed ? 'globals.confirmed' : 'order.summary.notConfirmed');
 };
-
-const orderTotal = computed(() => state.get('orderTotal') ?? 0);
-const total = ref(0);
 </script>
 
 <template>
@@ -54,12 +54,12 @@ const total = ref(0);
         "
     />
     <CardDescriptor
-        ref="descriptor"
-        :url="`Orders/${entityId}`"
-        :filter="filter"
+        v-bind="$attrs"
+        :id="entityId"
+        :card="OrderCard"
         title="client.name"
         @on-fetch="setData"
-        data-key="Order"
+        module="Order"
     >
         <template #body="{ entity }">
             <VnLv
diff --git a/src/pages/Order/Card/OrderDescriptorProxy.vue b/src/pages/Order/Card/OrderDescriptorProxy.vue
index 04ebb054a..1dff1b620 100644
--- a/src/pages/Order/Card/OrderDescriptorProxy.vue
+++ b/src/pages/Order/Card/OrderDescriptorProxy.vue
@@ -12,6 +12,11 @@ const $props = defineProps({
 
 <template>
     <QPopupProxy>
-        <OrderDescriptor v-if="$props.id" :id="$props.id" :summary="OrderSummary" />
+        <OrderDescriptor
+            v-if="$props.id"
+            :id="$props.id"
+            :summary="OrderSummary"
+            data-key="OrderDescriptor"
+        />
     </QPopupProxy>
 </template>
diff --git a/src/pages/Order/Card/OrderFilter.vue b/src/pages/Order/Card/OrderFilter.vue
index 42578423f..609a1215a 100644
--- a/src/pages/Order/Card/OrderFilter.vue
+++ b/src/pages/Order/Card/OrderFilter.vue
@@ -49,8 +49,7 @@ const sourceList = ref([]);
                     v-model="params.clientFk"
                     lazy-rules
                     dense
-                    outlined
-                    rounded
+                    filled
                 />
                 <VnSelect
                     :label="t('agency')"
@@ -58,13 +57,11 @@ const sourceList = ref([]);
                     :options="agencyList"
                     :input-debounce="0"
                     dense
-                    outlined
-                    rounded
+                    filled
                 />
                 <VnSelect
-                    outlined
                     dense
-                    rounded
+                    filled
                     :label="t('globals.params.departmentFk')"
                     v-model="params.departmentFk"
                     option-value="id"
@@ -75,21 +72,14 @@ const sourceList = ref([]);
                     v-model="params.from"
                     :label="t('fromLanded')"
                     dense
-                    outlined
-                    rounded
-                />
-                <VnInputDate
-                    v-model="params.to"
-                    :label="t('toLanded')"
-                    dense
-                    outlined
-                    rounded
+                    filled
                 />
+                <VnInputDate v-model="params.to" :label="t('toLanded')" dense filled />
                 <VnInput
                     :label="t('orderId')"
                     v-model="params.orderFk"
                     lazy-rules
-                    is-outlined
+                    filled
                 />
                 <VnSelect
                     :label="t('application')"
@@ -98,8 +88,7 @@ const sourceList = ref([]);
                     option-label="value"
                     option-value="value"
                     dense
-                    outlined
-                    rounded
+                    filled
                     :input-debounce="0"
                 />
                 <QCheckbox
diff --git a/src/pages/Route/Agency/Card/AgencyDescriptor.vue b/src/pages/Route/Agency/Card/AgencyDescriptor.vue
index 46aa44be9..64b33cc06 100644
--- a/src/pages/Route/Agency/Card/AgencyDescriptor.vue
+++ b/src/pages/Route/Agency/Card/AgencyDescriptor.vue
@@ -3,7 +3,7 @@ import { computed } from 'vue';
 import { useI18n } from 'vue-i18n';
 import { useRoute } from 'vue-router';
 import { useArrayData } from 'src/composables/useArrayData';
-import CardDescriptor from 'components/ui/CardDescriptor.vue';
+import EntityDescriptor from 'components/ui/EntityDescriptor.vue';
 import VnLv from 'components/ui/VnLv.vue';
 
 const props = defineProps({
@@ -21,7 +21,7 @@ const { store } = useArrayData();
 const card = computed(() => store.data);
 </script>
 <template>
-    <CardDescriptor
+    <EntityDescriptor
         data-key="Agency"
         :url="`Agencies/${entityId}`"
         :title="card?.name"
@@ -31,5 +31,5 @@ const card = computed(() => store.data);
         <template #body="{ entity: agency }">
             <VnLv :label="t('globals.name')" :value="agency.name" />
         </template>
-    </CardDescriptor>
+    </EntityDescriptor>
 </template>
diff --git a/src/pages/Route/Card/RouteAutonomousFilter.vue b/src/pages/Route/Card/RouteAutonomousFilter.vue
index f70f60e1c..fe631a0be 100644
--- a/src/pages/Route/Card/RouteAutonomousFilter.vue
+++ b/src/pages/Route/Card/RouteAutonomousFilter.vue
@@ -71,7 +71,7 @@ const exprBuilder = (param, value) => {
             <QList dense>
                 <QItem class="q-my-sm">
                     <QItemSection>
-                        <VnInput v-model="params.routeFk" :label="t('ID')" is-outlined />
+                        <VnInput v-model="params.routeFk" :label="t('ID')" filled />
                     </QItemSection>
                 </QItem>
                 <QItem class="q-my-sm" v-if="agencyList">
@@ -83,8 +83,7 @@ const exprBuilder = (param, value) => {
                             option-value="id"
                             option-label="name"
                             dense
-                            outlined
-                            rounded
+                            filled
                             emit-value
                             map-options
                             use-input
@@ -102,8 +101,7 @@ const exprBuilder = (param, value) => {
                             option-value="id"
                             option-label="name"
                             dense
-                            outlined
-                            rounded
+                            filled
                             emit-value
                             map-options
                             use-input
@@ -123,8 +121,7 @@ const exprBuilder = (param, value) => {
                             option-value="name"
                             option-label="name"
                             dense
-                            outlined
-                            rounded
+                            filled
                             emit-value
                             map-options
                             use-input
@@ -135,20 +132,12 @@ const exprBuilder = (param, value) => {
                 </QItem>
                 <QItem class="q-my-sm">
                     <QItemSection>
-                        <VnInputDate
-                            v-model="params.dated"
-                            :label="t('Date')"
-                            is-outlined
-                        />
+                        <VnInputDate v-model="params.dated" :label="t('Date')" filled />
                     </QItemSection>
                 </QItem>
                 <QItem class="q-my-sm">
                     <QItemSection>
-                        <VnInputDate
-                            v-model="params.from"
-                            :label="t('From')"
-                            is-outlined
-                        />
+                        <VnInputDate v-model="params.from" :label="t('From')" filled />
                     </QItemSection>
                 </QItem>
                 <QItem class="q-my-sm">
@@ -156,7 +145,7 @@ const exprBuilder = (param, value) => {
                         <VnInputDate
                             v-model="params.to"
                             :label="t('To')"
-                            is-outlined
+                            filled
                             is-clearable
                         />
                     </QItemSection>
@@ -166,23 +155,23 @@ const exprBuilder = (param, value) => {
                         <VnInput
                             v-model="params.packages"
                             :label="t('Packages')"
-                            is-outlined
+                            filled
                         />
                     </QItemSection>
                 </QItem>
                 <QItem class="q-my-sm">
                     <QItemSection>
-                        <VnInput v-model="params.m3" :label="t('m3')" is-outlined />
+                        <VnInput v-model="params.m3" :label="t('m3')" filled />
                     </QItemSection>
                 </QItem>
                 <QItem class="q-my-sm">
                     <QItemSection>
-                        <VnInput v-model="params.kmTotal" :label="t('Km')" is-outlined />
+                        <VnInput v-model="params.kmTotal" :label="t('Km')" filled />
                     </QItemSection>
                 </QItem>
                 <QItem class="q-my-sm">
                     <QItemSection>
-                        <VnInput v-model="params.price" :label="t('Price')" is-outlined />
+                        <VnInput v-model="params.price" :label="t('Price')" filled />
                     </QItemSection>
                 </QItem>
                 <QItem class="q-my-sm">
@@ -190,7 +179,7 @@ const exprBuilder = (param, value) => {
                         <VnInput
                             v-model="params.invoiceInFk"
                             :label="t('Received')"
-                            is-outlined
+                            filled
                         />
                     </QItemSection>
                 </QItem>
diff --git a/src/pages/Route/Card/RouteDescriptor.vue b/src/pages/Route/Card/RouteDescriptor.vue
index c57e51473..ee42d8e76 100644
--- a/src/pages/Route/Card/RouteDescriptor.vue
+++ b/src/pages/Route/Card/RouteDescriptor.vue
@@ -1,7 +1,7 @@
 <script setup>
 import { ref, computed, onMounted } from 'vue';
 import { useRoute } from 'vue-router';
-import CardDescriptor from 'components/ui/CardDescriptor.vue';
+import EntityDescriptor from 'components/ui/EntityDescriptor.vue';
 import useCardDescription from 'composables/useCardDescription';
 import VnLv from 'components/ui/VnLv.vue';
 import { dashIfEmpty, toDate } from 'src/filters';
@@ -41,13 +41,12 @@ const getZone = async () => {
     zone.value = zoneData.name;
 };
 const data = ref(useCardDescription());
-const setData = (entity) => (data.value = useCardDescription(entity.code, entity.id));
 onMounted(async () => {
     getZone();
 });
 </script>
 <template>
-    <CardDescriptor
+    <EntityDescriptor
         :url="`Routes/${entityId}`"
         :filter="filter"
         :title="null"
@@ -69,7 +68,7 @@ onMounted(async () => {
         <template #menu="{ entity }">
             <RouteDescriptorMenu :route="entity" />
         </template>
-    </CardDescriptor>
+    </EntityDescriptor>
 </template>
 <i18n>
 es:
diff --git a/src/pages/Route/Card/RouteFilter.vue b/src/pages/Route/Card/RouteFilter.vue
index cb5158517..f830b83e2 100644
--- a/src/pages/Route/Card/RouteFilter.vue
+++ b/src/pages/Route/Card/RouteFilter.vue
@@ -36,8 +36,7 @@ const emit = defineEmits(['search']);
                         :label="t('globals.worker')"
                         v-model="params.workerFk"
                         dense
-                        outlined
-                        rounded
+                        filled
                         :input-debounce="0"
                     />
                 </QItemSection>
@@ -52,8 +51,7 @@ const emit = defineEmits(['search']);
                         option-value="id"
                         option-label="name"
                         dense
-                        outlined
-                        rounded
+                        filled
                         :input-debounce="0"
                     />
                 </QItemSection>
@@ -63,7 +61,7 @@ const emit = defineEmits(['search']);
                     <VnInputDate
                         v-model="params.from"
                         :label="t('globals.from')"
-                        is-outlined
+                        filled
                         :disable="Boolean(params.scopeDays)"
                         @update:model-value="params.scopeDays = null"
                     />
@@ -74,7 +72,7 @@ const emit = defineEmits(['search']);
                     <VnInputDate
                         v-model="params.to"
                         :label="t('globals.to')"
-                        is-outlined
+                        filled
                         :disable="Boolean(params.scopeDays)"
                         @update:model-value="params.scopeDays = null"
                     />
@@ -86,7 +84,7 @@ const emit = defineEmits(['search']);
                         v-model="params.scopeDays"
                         type="number"
                         :label="t('globals.daysOnward')"
-                        is-outlined
+                        filled
                         clearable
                         :disable="Boolean(params.from || params.to)"
                         @update:model-value="
@@ -107,15 +105,14 @@ const emit = defineEmits(['search']);
                         option-label="numberPlate"
                         option-filter-value="numberPlate"
                         dense
-                        outlined
-                        rounded
+                        filled
                         :input-debounce="0"
                     />
                 </QItemSection>
             </QItem>
             <QItem class="q-my-sm">
                 <QItemSection>
-                    <VnInput v-model="params.m3" label="m³" is-outlined clearable />
+                    <VnInput v-model="params.m3" label="m³" filled clearable />
                 </QItemSection>
             </QItem>
             <QItem class="q-my-sm">
@@ -127,8 +124,7 @@ const emit = defineEmits(['search']);
                         option-value="id"
                         option-label="name"
                         dense
-                        outlined
-                        rounded
+                        filled
                         :input-debounce="0"
                     />
                 </QItemSection>
@@ -138,7 +134,7 @@ const emit = defineEmits(['search']);
                     <VnInput
                         v-model="params.description"
                         :label="t('globals.description')"
-                        is-outlined
+                        filled
                         clearable
                     />
                 </QItemSection>
diff --git a/src/pages/Route/Roadmap/RoadmapDescriptor.vue b/src/pages/Route/Roadmap/RoadmapDescriptor.vue
index bc9230eda..dfa692feb 100644
--- a/src/pages/Route/Roadmap/RoadmapDescriptor.vue
+++ b/src/pages/Route/Roadmap/RoadmapDescriptor.vue
@@ -2,7 +2,7 @@
 import { computed } from 'vue';
 import { useRoute } from 'vue-router';
 import { useI18n } from 'vue-i18n';
-import CardDescriptor from 'components/ui/CardDescriptor.vue';
+import EntityDescriptor from 'components/ui/EntityDescriptor.vue';
 import VnLv from 'components/ui/VnLv.vue';
 import { dashIfEmpty, toDateHourMin } from 'src/filters';
 import SupplierDescriptorProxy from 'pages/Supplier/Card/SupplierDescriptorProxy.vue';
@@ -30,7 +30,7 @@ const entityId = computed(() => {
 </script>
 
 <template>
-    <CardDescriptor
+    <EntityDescriptor
         :url="`Roadmaps/${entityId}`"
         :filter="filter"
         data-key="Roadmap"
@@ -52,7 +52,7 @@ const entityId = computed(() => {
         <template #menu="{ entity }">
             <RoadmapDescriptorMenu :route="entity" />
         </template>
-    </CardDescriptor>
+    </EntityDescriptor>
 </template>
 <i18n>
 es:
diff --git a/src/pages/Route/Roadmap/RoadmapFilter.vue b/src/pages/Route/Roadmap/RoadmapFilter.vue
index 982f1efba..9acbfb740 100644
--- a/src/pages/Route/Roadmap/RoadmapFilter.vue
+++ b/src/pages/Route/Roadmap/RoadmapFilter.vue
@@ -31,12 +31,12 @@ const emit = defineEmits(['search']);
         <template #body="{ params }">
             <QItem class="q-my-sm">
                 <QItemSection>
-                    <VnInputDate v-model="params.from" :label="t('From')" is-outlined />
+                    <VnInputDate v-model="params.from" :label="t('From')" filled />
                 </QItemSection>
             </QItem>
             <QItem class="q-my-sm">
                 <QItemSection>
-                    <VnInputDate v-model="params.to" :label="t('To')" is-outlined />
+                    <VnInputDate v-model="params.to" :label="t('To')" filled />
                 </QItemSection>
             </QItem>
             <QItem class="q-my-sm">
@@ -44,7 +44,7 @@ const emit = defineEmits(['search']);
                     <VnInput
                         v-model="params.tractorPlate"
                         :label="t('Tractor Plate')"
-                        is-outlined
+                        filled
                         clearable
                     />
                 </QItemSection>
@@ -54,7 +54,7 @@ const emit = defineEmits(['search']);
                     <VnInput
                         v-model="params.trailerPlate"
                         :label="t('Trailer Plate')"
-                        is-outlined
+                        filled
                         clearable
                     />
                 </QItemSection>
@@ -66,8 +66,7 @@ const emit = defineEmits(['search']);
                         :fields="['id', 'nickname']"
                         v-model="params.supplierFk"
                         dense
-                        outlined
-                        rounded
+                        filled
                         emit-value
                         map-options
                         use-input
@@ -81,7 +80,7 @@ const emit = defineEmits(['search']);
                         v-model="params.price"
                         :label="t('Price')"
                         type="number"
-                        is-outlined
+                        filled
                         clearable
                     />
                 </QItemSection>
@@ -91,7 +90,7 @@ const emit = defineEmits(['search']);
                     <VnInput
                         v-model="params.driverName"
                         :label="t('Driver name')"
-                        is-outlined
+                        filled
                         clearable
                     />
                 </QItemSection>
@@ -101,7 +100,7 @@ const emit = defineEmits(['search']);
                     <VnInput
                         v-model="params.phone"
                         :label="t('Phone')"
-                        is-outlined
+                        filled
                         clearable
                     />
                 </QItemSection>
diff --git a/src/pages/Route/Vehicle/Card/VehicleDescriptor.vue b/src/pages/Route/Vehicle/Card/VehicleDescriptor.vue
index 10c9fa9e2..bab7fa998 100644
--- a/src/pages/Route/Vehicle/Card/VehicleDescriptor.vue
+++ b/src/pages/Route/Vehicle/Card/VehicleDescriptor.vue
@@ -2,7 +2,7 @@
 import { computed } from 'vue';
 import { useRoute } from 'vue-router';
 import VnLv from 'src/components/ui/VnLv.vue';
-import CardDescriptor from 'components/ui/CardDescriptor.vue';
+import EntityDescriptor from 'components/ui/EntityDescriptor.vue';
 import axios from 'axios';
 import useNotify from 'src/composables/useNotify.js';
 
@@ -20,7 +20,7 @@ const route = useRoute();
 const entityId = computed(() => props.id || route.params.id);
 </script>
 <template>
-    <CardDescriptor
+    <EntityDescriptor
         :url="`Vehicles/${entityId}`"
         data-key="Vehicle"
         title="numberPlate"
@@ -54,7 +54,7 @@ const entityId = computed(() => props.id || route.params.id);
             <VnLv :label="$t('globals.model')" :value="entity.model" />
             <VnLv :label="$t('globals.country')" :value="entity.countryCodeFk" />
         </template>
-    </CardDescriptor>
+    </EntityDescriptor>
 </template>
 <i18n>
 es:
diff --git a/src/pages/Shelving/Card/ShelvingDescriptor.vue b/src/pages/Shelving/Card/ShelvingDescriptor.vue
index 5e618aa7f..2405467da 100644
--- a/src/pages/Shelving/Card/ShelvingDescriptor.vue
+++ b/src/pages/Shelving/Card/ShelvingDescriptor.vue
@@ -2,7 +2,7 @@
 import { computed } from 'vue';
 import { useRoute } from 'vue-router';
 import { useI18n } from 'vue-i18n';
-import CardDescriptor from 'components/ui/CardDescriptor.vue';
+import EntityDescriptor from 'components/ui/EntityDescriptor.vue';
 import VnLv from 'components/ui/VnLv.vue';
 import ShelvingDescriptorMenu from 'pages/Shelving/Card/ShelvingDescriptorMenu.vue';
 import VnUserLink from 'src/components/ui/VnUserLink.vue';
@@ -24,7 +24,7 @@ const entityId = computed(() => {
 });
 </script>
 <template>
-    <CardDescriptor
+    <EntityDescriptor
         :url="`Shelvings/${entityId}`"
         :filter="filter"
         title="code"
@@ -45,5 +45,5 @@ const entityId = computed(() => {
         <template #menu="{ entity }">
             <ShelvingDescriptorMenu :shelving="entity" />
         </template>
-    </CardDescriptor>
+    </EntityDescriptor>
 </template>
diff --git a/src/pages/Shelving/Card/ShelvingFilter.vue b/src/pages/Shelving/Card/ShelvingFilter.vue
index 88d716046..35657a972 100644
--- a/src/pages/Shelving/Card/ShelvingFilter.vue
+++ b/src/pages/Shelving/Card/ShelvingFilter.vue
@@ -39,15 +39,14 @@ const emit = defineEmits(['search']);
                         option-label="code"
                         :filter-options="['id', 'code']"
                         dense
-                        outlined
-                        rounded
+                        filled
                         sort-by="code ASC"
                     />
                 </QItemSection>
             </QItem>
             <QItem class="q-mb-sm">
                 <QItemSection>
-                    <VnSelectWorker v-model="params.userFk" outlined rounded />
+                    <VnSelectWorker v-model="params.userFk" filled />
                 </QItemSection>
             </QItem>
             <QItem class="q-mb-md">
diff --git a/src/pages/Shelving/Parking/Card/ParkingDescriptor.vue b/src/pages/Shelving/Parking/Card/ParkingDescriptor.vue
index 07b168f87..0e01238a0 100644
--- a/src/pages/Shelving/Parking/Card/ParkingDescriptor.vue
+++ b/src/pages/Shelving/Parking/Card/ParkingDescriptor.vue
@@ -1,7 +1,7 @@
 <script setup>
 import { computed } from 'vue';
 import { useRoute } from 'vue-router';
-import CardDescriptor from 'components/ui/CardDescriptor.vue';
+import EntityDescriptor from 'components/ui/EntityDescriptor.vue';
 import VnLv from 'components/ui/VnLv.vue';
 import filter from './ParkingFilter.js';
 const props = defineProps({
@@ -16,7 +16,7 @@ const route = useRoute();
 const entityId = computed(() => props.id || route.params.id);
 </script>
 <template>
-    <CardDescriptor
+    <EntityDescriptor
         data-key="Parking"
         :url="`Parkings/${entityId}`"
         title="code"
@@ -28,5 +28,5 @@ const entityId = computed(() => props.id || route.params.id);
             <VnLv :label="$t('parking.pickingOrder')" :value="entity.pickingOrder" />
             <VnLv :label="$t('parking.sector')" :value="entity.sector?.description" />
         </template>
-    </CardDescriptor>
+    </EntityDescriptor>
 </template>
diff --git a/src/pages/Shelving/Parking/ParkingFilter.vue b/src/pages/Shelving/Parking/ParkingFilter.vue
index 1d7c3a4b6..59cb49459 100644
--- a/src/pages/Shelving/Parking/ParkingFilter.vue
+++ b/src/pages/Shelving/Parking/ParkingFilter.vue
@@ -36,11 +36,7 @@ const emit = defineEmits(['search']);
         <template #body="{ params }">
             <QItem>
                 <QItemSection>
-                    <VnInput
-                        :label="t('params.code')"
-                        v-model="params.code"
-                        is-outlined
-                    />
+                    <VnInput :label="t('params.code')" v-model="params.code" filled />
                 </QItemSection>
             </QItem>
             <QItem>
@@ -51,8 +47,7 @@ const emit = defineEmits(['search']);
                         option-label="description"
                         :label="t('params.sectorFk')"
                         dense
-                        outlined
-                        rounded
+                        filled
                         :options="sectors"
                         use-input
                         input-debounce="0"
diff --git a/src/pages/Supplier/Card/SupplierBalanceFilter.vue b/src/pages/Supplier/Card/SupplierBalanceFilter.vue
index c4b63d9c8..c727688ad 100644
--- a/src/pages/Supplier/Card/SupplierBalanceFilter.vue
+++ b/src/pages/Supplier/Card/SupplierBalanceFilter.vue
@@ -33,7 +33,7 @@ defineProps({
                         :label="t('params.from')"
                         v-model="params.from"
                         @update:model-value="searchFn()"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -47,8 +47,7 @@ defineProps({
                         :include="{ relation: 'accountingType' }"
                         sort-by="id"
                         dense
-                        outlined
-                        rounded
+                        filled
                     >
                         <template #option="scope">
                             <QItem v-bind="scope.itemProps">
@@ -74,8 +73,7 @@ defineProps({
                         option-label="name"
                         hide-selected
                         dense
-                        outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
diff --git a/src/pages/Supplier/Card/SupplierConsumptionFilter.vue b/src/pages/Supplier/Card/SupplierConsumptionFilter.vue
index 390f7d9ff..e21e37eb3 100644
--- a/src/pages/Supplier/Card/SupplierConsumptionFilter.vue
+++ b/src/pages/Supplier/Card/SupplierConsumptionFilter.vue
@@ -25,20 +25,12 @@ defineProps({
         <template #body="{ params, searchFn }">
             <QItem>
                 <QItemSection>
-                    <VnInput
-                        v-model="params.search"
-                        :label="t('params.search')"
-                        is-outlined
-                    />
+                    <VnInput v-model="params.search" :label="t('params.search')" filled />
                 </QItemSection>
             </QItem>
             <QItem>
                 <QItemSection>
-                    <VnInput
-                        v-model="params.itemId"
-                        :label="t('params.itemId')"
-                        is-outlined
-                    />
+                    <VnInput v-model="params.itemId" :label="t('params.itemId')" filled />
                 </QItemSection>
             </QItem>
             <QItem>
@@ -54,8 +46,7 @@ defineProps({
                         option-label="nickname"
                         hide-selected
                         dense
-                        outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -73,8 +64,7 @@ defineProps({
                         option-label="name"
                         hide-selected
                         dense
-                        outlined
-                        rounded
+                        filled
                     >
                         <template #option="scope">
                             <QItem v-bind="scope.itemProps">
@@ -102,8 +92,7 @@ defineProps({
                         option-label="name"
                         hide-selected
                         dense
-                        outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -113,7 +102,7 @@ defineProps({
                         :label="t('params.from')"
                         v-model="params.from"
                         @update:model-value="searchFn()"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -123,7 +112,7 @@ defineProps({
                         :label="t('params.to')"
                         v-model="params.to"
                         @update:model-value="searchFn()"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
diff --git a/src/pages/Supplier/Card/SupplierDescriptor.vue b/src/pages/Supplier/Card/SupplierDescriptor.vue
index 462bdf853..2863784ab 100644
--- a/src/pages/Supplier/Card/SupplierDescriptor.vue
+++ b/src/pages/Supplier/Card/SupplierDescriptor.vue
@@ -3,7 +3,7 @@ import { ref, computed, onMounted } from 'vue';
 import { useRoute } from 'vue-router';
 import { useI18n } from 'vue-i18n';
 
-import CardDescriptor from 'components/ui/CardDescriptor.vue';
+import EntityDescriptor from 'components/ui/EntityDescriptor.vue';
 import VnLv from 'src/components/ui/VnLv.vue';
 
 import { toDateString } from 'src/filters';
@@ -61,7 +61,7 @@ const getEntryQueryParams = (supplier) => {
 </script>
 
 <template>
-    <CardDescriptor
+    <EntityDescriptor
         :url="`Suppliers/${entityId}`"
         :filter="filter"
         data-key="Supplier"
@@ -136,7 +136,7 @@ const getEntryQueryParams = (supplier) => {
                 </QBtn>
             </QCardActions>
         </template>
-    </CardDescriptor>
+    </EntityDescriptor>
 </template>
 
 <i18n>
diff --git a/src/pages/Ticket/Card/TicketDescriptor.vue b/src/pages/Ticket/Card/TicketDescriptor.vue
index 743f2188c..96920231c 100644
--- a/src/pages/Ticket/Card/TicketDescriptor.vue
+++ b/src/pages/Ticket/Card/TicketDescriptor.vue
@@ -4,7 +4,7 @@ import { useRoute } from 'vue-router';
 import { useI18n } from 'vue-i18n';
 import CustomerDescriptorProxy from 'pages/Customer/Card/CustomerDescriptorProxy.vue';
 import DepartmentDescriptorProxy from 'pages/Worker/Department/Card/DepartmentDescriptorProxy.vue';
-import CardDescriptor from 'components/ui/CardDescriptor.vue';
+import EntityDescriptor from 'components/ui/EntityDescriptor.vue';
 import TicketDescriptorMenu from './TicketDescriptorMenu.vue';
 import VnLv from 'src/components/ui/VnLv.vue';
 import { toDateTimeFormat } from 'src/filters/date';
@@ -57,7 +57,7 @@ function getInfo() {
 </script>
 
 <template>
-    <CardDescriptor
+    <EntityDescriptor
         :url="`Tickets/${entityId}`"
         :filter="filter"
         data-key="Ticket"
@@ -155,7 +155,7 @@ function getInfo() {
                 </QBtn>
             </QCardActions>
         </template>
-    </CardDescriptor>
+    </EntityDescriptor>
 </template>
 
 <i18n>
diff --git a/src/pages/Ticket/Negative/TicketLackFilter.vue b/src/pages/Ticket/Negative/TicketLackFilter.vue
index 3762f453d..73d53b247 100644
--- a/src/pages/Ticket/Negative/TicketLackFilter.vue
+++ b/src/pages/Ticket/Negative/TicketLackFilter.vue
@@ -81,7 +81,7 @@ const setUserParams = (params) => {
                             v-model="params.days"
                             :label="t('negative.days')"
                             dense
-                            is-outlined
+                            filled
                             type="number"
                             @update:model-value="
                                 (value) => {
@@ -97,7 +97,7 @@ const setUserParams = (params) => {
                             v-model="params.id"
                             :label="t('negative.id')"
                             dense
-                            is-outlined
+                            filled
                         />
                     </QItemSection>
                 </QItem>
@@ -107,7 +107,7 @@ const setUserParams = (params) => {
                             v-model="params.producer"
                             :label="t('negative.producer')"
                             dense
-                            is-outlined
+                            filled
                         />
                     </QItemSection>
                 </QItem>
@@ -117,7 +117,7 @@ const setUserParams = (params) => {
                             v-model="params.origen"
                             :label="t('negative.origen')"
                             dense
-                            is-outlined
+                            filled
                         />
                     </QItemSection> </QItem
                 ><QItem>
@@ -133,8 +133,7 @@ const setUserParams = (params) => {
                             option-label="name"
                             hide-selected
                             dense
-                            outlined
-                            rounded
+                            filled
                         /> </QItemSection
                     ><QItemSection v-else>
                         <QSkeleton class="full-width" type="QSelect" />
@@ -151,8 +150,7 @@ const setUserParams = (params) => {
                             option-label="name"
                             hide-selected
                             dense
-                            outlined
-                            rounded
+                            filled
                         >
                             <template #option="scope">
                                 <QItem v-bind="scope.itemProps">
diff --git a/src/pages/Ticket/TicketAdvanceFilter.vue b/src/pages/Ticket/TicketAdvanceFilter.vue
index 6d5c7726e..f065eaf2e 100644
--- a/src/pages/Ticket/TicketAdvanceFilter.vue
+++ b/src/pages/Ticket/TicketAdvanceFilter.vue
@@ -71,7 +71,7 @@ onMounted(async () => await getItemPackingTypes());
                     <VnInputDate
                         v-model="params.dateFuture"
                         :label="t('params.dateFuture')"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -80,7 +80,7 @@ onMounted(async () => await getItemPackingTypes());
                     <VnInputDate
                         v-model="params.dateToAdvance"
                         :label="t('params.dateToAdvance')"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -95,8 +95,7 @@ onMounted(async () => await getItemPackingTypes());
                         :info="t('iptInfo')"
                         @update:model-value="searchFn()"
                         dense
-                        outlined
-                        rounded
+                        filled
                         :use-like="false"
                     >
                     </VnSelect>
@@ -113,8 +112,7 @@ onMounted(async () => await getItemPackingTypes());
                         :info="t('iptInfo')"
                         @update:model-value="searchFn()"
                         dense
-                        outlined
-                        rounded
+                        filled
                         :use-like="false"
                     >
                     </VnSelect>
@@ -125,7 +123,7 @@ onMounted(async () => await getItemPackingTypes());
                     <VnInputNumber
                         v-model="params.scopeDays"
                         :label="t('Days onward')"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -147,8 +145,7 @@ onMounted(async () => await getItemPackingTypes());
                         url="Departments"
                         :fields="['id', 'name']"
                         dense
-                        outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -162,8 +159,7 @@ onMounted(async () => await getItemPackingTypes());
                         option-label="name"
                         @update:model-value="searchFn()"
                         dense
-                        outlined
-                        rounded
+                        filled
                     >
                     </VnSelect>
                 </QItemSection>
diff --git a/src/pages/Ticket/TicketFilter.vue b/src/pages/Ticket/TicketFilter.vue
index f959157f6..b763ef970 100644
--- a/src/pages/Ticket/TicketFilter.vue
+++ b/src/pages/Ticket/TicketFilter.vue
@@ -63,18 +63,10 @@ const getGroupedStates = (data) => {
         <template #body="{ params, searchFn }">
             <QItem>
                 <QItemSection>
-                    <VnInput
-                        v-model="params.clientFk"
-                        :label="t('Customer ID')"
-                        is-outlined
-                    />
+                    <VnInput v-model="params.clientFk" :label="t('Customer ID')" filled />
                 </QItemSection>
                 <QItemSection>
-                    <VnInput
-                        v-model="params.orderFk"
-                        :label="t('Order ID')"
-                        is-outlined
-                    />
+                    <VnInput v-model="params.orderFk" :label="t('Order ID')" filled />
                 </QItemSection>
             </QItem>
             <QItem>
@@ -82,7 +74,7 @@ const getGroupedStates = (data) => {
                     <VnInputDate
                         v-model="params.from"
                         :label="t('From')"
-                        is-outlined
+                        filled
                         data-cy="From_date"
                     />
                 </QItemSection>
@@ -90,7 +82,7 @@ const getGroupedStates = (data) => {
                     <VnInputDate
                         v-model="params.to"
                         :label="t('To')"
-                        is-outlined
+                        filled
                         data-cy="To_date"
                     />
                 </QItemSection>
@@ -98,9 +90,8 @@ const getGroupedStates = (data) => {
             <QItem>
                 <QItemSection>
                     <VnSelect
-                        outlined
                         dense
-                        rounded
+                        filled
                         :label="t('globals.params.departmentFk')"
                         v-model="params.departmentFk"
                         option-value="id"
@@ -125,8 +116,7 @@ const getGroupedStates = (data) => {
                         map-options
                         use-input
                         dense
-                        outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -146,19 +136,14 @@ const getGroupedStates = (data) => {
                         map-options
                         use-input
                         dense
-                        outlined
-                        rounded
+                        filled
                         sort-by="name ASC"
                     />
                 </QItemSection>
             </QItem>
             <QItem>
                 <QItemSection>
-                    <VnInput
-                        v-model="params.refFk"
-                        :label="t('Invoice Ref.')"
-                        is-outlined
-                    />
+                    <VnInput v-model="params.refFk" :label="t('Invoice Ref.')" filled />
                 </QItemSection>
             </QItem>
             <QItem>
@@ -166,17 +151,13 @@ const getGroupedStates = (data) => {
                     <VnInput
                         v-model="params.scopeDays"
                         :label="t('Days onward')"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
             <QItem>
                 <QItemSection>
-                    <VnInput
-                        v-model="params.nickname"
-                        :label="t('Nickname')"
-                        is-outlined
-                    />
+                    <VnInput v-model="params.nickname" :label="t('Nickname')" filled />
                 </QItemSection>
             </QItem>
             <QItem>
@@ -241,8 +222,7 @@ const getGroupedStates = (data) => {
                         map-options
                         use-input
                         dense
-                        outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -260,8 +240,7 @@ const getGroupedStates = (data) => {
                         map-options
                         use-input
                         dense
-                        outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -281,8 +260,7 @@ const getGroupedStates = (data) => {
                         map-options
                         use-input
                         dense
-                        outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -291,7 +269,7 @@ const getGroupedStates = (data) => {
                     <VnInput
                         v-model="params.collectionFk"
                         :label="t('Collection')"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
diff --git a/src/pages/Ticket/TicketFutureFilter.vue b/src/pages/Ticket/TicketFutureFilter.vue
index 64e060a39..033b47f72 100644
--- a/src/pages/Ticket/TicketFutureFilter.vue
+++ b/src/pages/Ticket/TicketFutureFilter.vue
@@ -73,7 +73,7 @@ onMounted(async () => {
                     <VnInputDate
                         v-model="params.originScopeDays"
                         :label="t('params.originScopeDays')"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -82,7 +82,7 @@ onMounted(async () => {
                     <VnInputDate
                         v-model="params.futureScopeDays"
                         :label="t('params.futureScopeDays')"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -91,7 +91,7 @@ onMounted(async () => {
                     <VnInput
                         :label="t('params.litersMax')"
                         v-model="params.litersMax"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -100,7 +100,7 @@ onMounted(async () => {
                     <VnInput
                         :label="t('params.linesMax')"
                         v-model="params.linesMax"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -115,8 +115,7 @@ onMounted(async () => {
                         :info="t('iptInfo')"
                         @update:model-value="searchFn()"
                         dense
-                        outlined
-                        rounded
+                        filled
                     >
                     </VnSelect>
                 </QItemSection>
@@ -132,8 +131,7 @@ onMounted(async () => {
                         :info="t('iptInfo')"
                         @update:model-value="searchFn()"
                         dense
-                        outlined
-                        rounded
+                        filled
                     >
                     </VnSelect>
                 </QItemSection>
@@ -148,8 +146,7 @@ onMounted(async () => {
                         option-label="name"
                         @update:model-value="searchFn()"
                         dense
-                        outlined
-                        rounded
+                        filled
                     >
                     </VnSelect>
                 </QItemSection>
@@ -164,8 +161,7 @@ onMounted(async () => {
                         option-label="name"
                         @update:model-value="searchFn()"
                         dense
-                        outlined
-                        rounded
+                        filled
                     >
                     </VnSelect>
                 </QItemSection>
@@ -191,8 +187,7 @@ onMounted(async () => {
                         option-label="name"
                         @update:model-value="searchFn()"
                         dense
-                        outlined
-                        rounded
+                        filled
                     >
                     </VnSelect>
                 </QItemSection>
diff --git a/src/pages/Travel/Card/TravelDescriptor.vue b/src/pages/Travel/Card/TravelDescriptor.vue
index 922f89f33..d4903f794 100644
--- a/src/pages/Travel/Card/TravelDescriptor.vue
+++ b/src/pages/Travel/Card/TravelDescriptor.vue
@@ -3,7 +3,7 @@ import { computed, ref } from 'vue';
 import { useRoute } from 'vue-router';
 import { useI18n } from 'vue-i18n';
 
-import CardDescriptor from 'components/ui/CardDescriptor.vue';
+import EntityDescriptor from 'components/ui/EntityDescriptor.vue';
 import VnLv from 'src/components/ui/VnLv.vue';
 import useCardDescription from 'src/composables/useCardDescription';
 import TravelDescriptorMenuItems from './TravelDescriptorMenuItems.vue';
@@ -31,7 +31,7 @@ const setData = (entity) => (data.value = useCardDescription(entity.ref, entity.
 </script>
 
 <template>
-    <CardDescriptor
+    <EntityDescriptor
         :url="`Travels/${entityId}`"
         :title="data.title"
         :subtitle="data.subtitle"
@@ -79,7 +79,7 @@ const setData = (entity) => (data.value = useCardDescription(entity.ref, entity.
                 </QBtn>
             </QCardActions>
         </template>
-    </CardDescriptor>
+    </EntityDescriptor>
 </template>
 
 <i18n>
diff --git a/src/pages/Travel/ExtraCommunityFilter.vue b/src/pages/Travel/ExtraCommunityFilter.vue
index ae6e695be..76ffdba20 100644
--- a/src/pages/Travel/ExtraCommunityFilter.vue
+++ b/src/pages/Travel/ExtraCommunityFilter.vue
@@ -87,7 +87,7 @@ warehouses();
         <template #body="{ params, searchFn }">
             <QItem>
                 <QItemSection>
-                    <VnInput label="id" v-model="params.id" is-outlined />
+                    <VnInput label="id" v-model="params.id" filled />
                 </QItemSection>
             </QItem>
             <QItem>
@@ -95,7 +95,7 @@ warehouses();
                     <VnInput
                         :label="t('extraCommunity.filter.reference')"
                         v-model="params.reference"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -106,8 +106,7 @@ warehouses();
                         type="number"
                         :label="t('extraCommunity.filter.totalEntries')"
                         dense
-                        outlined
-                        rounded
+                        filled
                         min="0"
                         class="input-number"
                     >
@@ -141,8 +140,7 @@ warehouses();
                         option-label="name"
                         hide-selected
                         dense
-                        outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -152,7 +150,7 @@ warehouses();
                         :label="t('extraCommunity.filter.shippedFrom')"
                         v-model="params.shippedFrom"
                         @update:model-value="searchFn()"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -162,7 +160,7 @@ warehouses();
                         :label="t('extraCommunity.filter.landedTo')"
                         v-model="params.landedTo"
                         @update:model-value="searchFn()"
-                        is-outlined
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -176,8 +174,7 @@ warehouses();
                         option-label="name"
                         hide-selected
                         dense
-                        outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -191,8 +188,7 @@ warehouses();
                         option-label="name"
                         hide-selected
                         dense
-                        outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -206,8 +202,7 @@ warehouses();
                         option-label="name"
                         hide-selected
                         dense
-                        outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -218,8 +213,7 @@ warehouses();
                         v-model="params.cargoSupplierFk"
                         hide-selected
                         dense
-                        outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -229,8 +223,7 @@ warehouses();
                         v-model="params.entrySupplierFk"
                         hide-selected
                         dense
-                        outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
@@ -245,8 +238,7 @@ warehouses();
                         :filter-options="['code', 'name']"
                         hide-selected
                         dense
-                        outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
diff --git a/src/pages/Travel/TravelFilter.vue b/src/pages/Travel/TravelFilter.vue
index 4a9c80952..a26cc0ec0 100644
--- a/src/pages/Travel/TravelFilter.vue
+++ b/src/pages/Travel/TravelFilter.vue
@@ -33,19 +33,14 @@ defineExpose({ states });
         </template>
         <template #body="{ params, searchFn }">
             <div class="q-pa-sm q-gutter-y-sm">
-                <VnInput
-                    :label="t('travel.Id')"
-                    v-model="params.id"
-                    lazy-rules
-                    is-outlined
-                >
+                <VnInput :label="t('travel.Id')" v-model="params.id" lazy-rules filled>
                     <template #prepend> <QIcon name="badge" size="xs" /></template>
                 </VnInput>
                 <VnInput
                     :label="t('travel.ref')"
                     v-model="params.ref"
                     lazy-rules
-                    is-outlined
+                    filled
                 />
                 <VnSelect
                     :label="t('travel.agency')"
@@ -56,8 +51,7 @@ defineExpose({ states });
                     :use-like="false"
                     option-filter="name"
                     dense
-                    outlined
-                    rounded
+                    filled
                 />
                 <VnSelect
                     :label="t('travel.warehouseInFk')"
@@ -69,22 +63,19 @@ defineExpose({ states });
                     option-label="name"
                     option-filter="name"
                     dense
-                    outlined
-                    rounded
+                    filled
                 />
                 <VnInputDate
                     :label="t('travel.shipped')"
                     v-model="params.shipped"
                     @update:model-value="searchFn()"
-                    outlined
-                    rounded
+                    filled
                 />
                 <VnInputTime
                     v-model="params.shipmentHour"
                     @update:model-value="searchFn()"
                     :label="t('travel.shipmentHour')"
-                    outlined
-                    rounded
+                    filled
                     dense
                 />
                 <VnSelect
@@ -97,36 +88,33 @@ defineExpose({ states });
                     option-label="name"
                     option-filter="name"
                     dense
-                    outlined
-                    rounded
+                    filled
                 />
                 <VnInputDate
                     :label="t('travel.landed')"
                     v-model="params.landed"
                     @update:model-value="searchFn()"
                     dense
-                    outlined
-                    rounded
+                    filled
                 />
                 <VnInputTime
                     v-model="params.landingHour"
                     @update:model-value="searchFn()"
                     :label="t('travel.landingHour')"
-                    outlined
-                    rounded
+                    filled
                     dense
                 />
                 <VnInput
                     :label="t('travel.totalEntries')"
                     v-model="params.totalEntries"
                     lazy-rules
-                    is-outlined
+                    filled
                 />
                 <VnInput
                     :label="t('travel.daysOnward')"
                     v-model="params.daysOnward"
                     lazy-rules
-                    is-outlined
+                    filled
                 />
             </div>
         </template>
diff --git a/src/pages/Worker/Card/WorkerCalendarFilter.vue b/src/pages/Worker/Card/WorkerCalendarFilter.vue
index 48fc4094b..f0e2d758a 100644
--- a/src/pages/Worker/Card/WorkerCalendarFilter.vue
+++ b/src/pages/Worker/Card/WorkerCalendarFilter.vue
@@ -40,7 +40,7 @@ watch(
     (newValue) => {
         checkHolidays(newValue);
     },
-    { deep: true, immediate: true }
+    { deep: true, immediate: true },
 );
 const emit = defineEmits(['update:businessFk', 'update:year', 'update:absenceType']);
 
@@ -174,8 +174,7 @@ const yearList = ref(generateYears());
                     v-model="selectedYear"
                     :options="yearList"
                     dense
-                    outlined
-                    rounded
+                    filled
                     use-input
                     :is-clearable="false"
                 />
@@ -188,8 +187,7 @@ const yearList = ref(generateYears());
                     option-value="businessFk"
                     option-label="businessFk"
                     dense
-                    outlined
-                    rounded
+                    filled
                     use-input
                     :is-clearable="false"
                 >
diff --git a/src/pages/Worker/Card/WorkerDescriptor.vue b/src/pages/Worker/Card/WorkerDescriptor.vue
index 910c92fd8..060520e84 100644
--- a/src/pages/Worker/Card/WorkerDescriptor.vue
+++ b/src/pages/Worker/Card/WorkerDescriptor.vue
@@ -2,7 +2,7 @@
 import { computed, ref } from 'vue';
 import { useRoute } from 'vue-router';
 import { useI18n } from 'vue-i18n';
-import CardDescriptor from 'src/components/ui/CardDescriptor.vue';
+import EntityDescriptor from 'src/components/ui/EntityDescriptor.vue';
 import VnLv from 'src/components/ui/VnLv.vue';
 import VnLinkPhone from 'src/components/ui/VnLinkPhone.vue';
 import VnChangePassword from 'src/components/common/VnChangePassword.vue';
@@ -52,7 +52,7 @@ const handlePhotoUpdated = (evt = false) => {
 };
 </script>
 <template>
-    <CardDescriptor
+    <EntityDescriptor
         ref="cardDescriptorRef"
         :data-key="dataKey"
         :summary="$props.summary"
@@ -167,7 +167,7 @@ const handlePhotoUpdated = (evt = false) => {
                 </QBtn>
             </QCardActions>
         </template>
-    </CardDescriptor>
+    </EntityDescriptor>
     <VnChangePassword
         ref="changePassRef"
         :submit-fn="
diff --git a/src/pages/Worker/Card/WorkerPda.vue b/src/pages/Worker/Card/WorkerPda.vue
index d32941494..001eb368a 100644
--- a/src/pages/Worker/Card/WorkerPda.vue
+++ b/src/pages/Worker/Card/WorkerPda.vue
@@ -5,24 +5,25 @@ import { ref, computed } from 'vue';
 
 import axios from 'axios';
 import useNotify from 'src/composables/useNotify.js';
+import { useVnConfirm } from 'composables/useVnConfirm';
+import { useArrayData } from 'src/composables/useArrayData';
+import { downloadDocuware } from 'src/composables/downloadFile';
+
 import FetchData from 'components/FetchData.vue';
 import FormModelPopup from 'src/components/FormModelPopup.vue';
-import { useVnConfirm } from 'composables/useVnConfirm';
-
-import VnPaginate from 'src/components/ui/VnPaginate.vue';
 import VnRow from 'components/ui/VnRow.vue';
 import VnSelect from 'src/components/common/VnSelect.vue';
-import VnInput from 'src/components/common/VnInput.vue';
+import VnTable from 'src/components/VnTable/VnTable.vue';
 
 const { t } = useI18n();
 const { notify } = useNotify();
-
-const paginate = ref();
+const loadingDocuware = ref(true);
+const tableRef = ref();
 const dialog = ref();
 const route = useRoute();
 const { openConfirmationModal } = useVnConfirm();
 const routeId = computed(() => route.params.id);
-
+const worker = computed(() => useArrayData('Worker').store.data);
 const initialData = computed(() => {
     return {
         userFk: routeId.value,
@@ -31,154 +32,268 @@ const initialData = computed(() => {
     };
 });
 
-const deallocatePDA = async (deviceProductionFk) => {
-    await axios.post(`Workers/${route.params.id}/deallocatePDA`, {
-        pda: deviceProductionFk,
-    });
-    notify(t('PDA deallocated'), 'positive');
-
-    paginate.value.fetch();
-};
+const columns = computed(() => [
+    {
+        align: 'center',
+        label: t('globals.state'),
+        name: 'state',
+        format: (row) => row?.docuware?.state,
+        columnFilter: false,
+        chip: {
+            condition: (_, row) => !!row.docuware,
+            color: (row) => (isSigned(row) ? 'bg-positive' : 'bg-warning'),
+        },
+        visible: false,
+    },
+    {
+        align: 'right',
+        label: t('worker.pda.currentPDA'),
+        name: 'deviceProductionFk',
+        columnClass: 'shrink',
+        cardVisible: true,
+    },
+    {
+        align: 'left',
+        label: t('Model'),
+        name: 'modelFk',
+        format: ({ deviceProduction }) => deviceProduction.modelFk,
+        cardVisible: true,
+    },
+    {
+        align: 'right',
+        label: t('Serial number'),
+        name: 'serialNumber',
+        format: ({ deviceProduction }) => deviceProduction.serialNumber,
+        cardVisible: true,
+    },
+    {
+        align: 'left',
+        label: t('Current SIM'),
+        name: 'simFk',
+        cardVisible: true,
+    },
+    {
+        align: 'right',
+        name: 'actions',
+        columnFilter: false,
+        cardVisible: true,
+    },
+]);
 
 function reloadData() {
     initialData.value.deviceProductionFk = null;
     initialData.value.simFk = null;
-    paginate.value.fetch();
+    tableRef.value.reload();
+}
+
+async function fetchDocuware() {
+    loadingDocuware.value = true;
+
+    const id = `${worker.value?.lastName} ${worker.value?.firstName}`;
+    const rows = tableRef.value.CrudModelRef.formData;
+
+    const promises = rows.map(async (row) => {
+        const { data } = await axios.post(`Docuwares/${id}/checkFile`, {
+            fileCabinet: 'hr',
+            signed: false,
+            mergeFilter: [
+                {
+                    DBName: 'TIPO_DOCUMENTO',
+                    Value: ['PDA'],
+                },
+                {
+                    DBName: 'FILENAME',
+                    Value: [`${row.deviceProductionFk}-pda`],
+                },
+            ],
+        });
+        row.docuware = data;
+    });
+
+    await Promise.allSettled(promises);
+    loadingDocuware.value = false;
+}
+
+async function sendToTablet(rows) {
+    const promises = rows.map(async (row) => {
+        await axios.post(`Docuwares/upload-pda-pdf`, {
+            ids: [row.deviceProductionFk],
+        });
+        row.docuware = true;
+    });
+    await Promise.allSettled(promises);
+    notify(t('PDF sended to signed'), 'positive');
+    tableRef.value.reload();
+}
+
+async function deallocatePDA(deviceProductionFk) {
+    await axios.post(`Workers/${route.params.id}/deallocatePDA`, {
+        pda: deviceProductionFk,
+    });
+    const index = tableRef.value.CrudModelRef.formData.findIndex(
+        (data) => data?.deviceProductionFk == deviceProductionFk,
+    );
+    delete tableRef.value.CrudModelRef.formData[index];
+    notify(t('PDA deallocated'), 'positive');
+}
+
+function isSigned(row) {
+    return row.docuware?.state === 'Firmado';
 }
 </script>
 
 <template>
-    <QPage class="column items-center q-pa-md centerCard">
-        <FetchData
-            url="workers/getAvailablePda"
-            @on-fetch="(data) => (deviceProductions = data)"
-            auto-load
-        />
-        <VnPaginate
-            ref="paginate"
-            data-key="WorkerPda"
-            url="DeviceProductionUsers"
-            :user-filter="{ where: { userFk: routeId } }"
-            order="id"
-            search-url="pda"
-            auto-load
-        >
-            <template #body="{ rows }">
-                <QCard
-                    flat
-                    bordered
-                    :key="row.id"
-                    v-for="row of rows"
-                    class="card q-px-md q-mb-sm container"
-                >
-                    <VnRow>
-                        <VnInput
-                            :label="t('worker.pda.currentPDA')"
-                            :model-value="row?.deviceProductionFk"
-                            disable
-                        />
-                        <VnInput
-                            :label="t('Model')"
-                            :model-value="row?.deviceProduction?.modelFk"
-                            disable
-                        />
-                        <VnInput
-                            :label="t('Serial number')"
-                            :model-value="row?.deviceProduction?.serialNumber"
-                            disable
-                        />
-                        <VnInput
-                            :label="t('Current SIM')"
-                            :model-value="row?.simFk"
-                            disable
-                        />
-                        <QBtn
-                            flat
-                            icon="delete"
-                            color="primary"
-                            class="btn-delete"
-                            @click="
-                                openConfirmationModal(
-                                    t(`Remove PDA`),
-                                    t('Do you want to remove this PDA?'),
-                                    () => deallocatePDA(row.deviceProductionFk),
-                                )
-                            "
-                        >
-                            <QTooltip>
-                                {{ t('worker.pda.removePDA') }}
-                            </QTooltip>
-                        </QBtn>
-                    </VnRow>
-                </QCard>
-            </template>
-        </VnPaginate>
-        <QPageSticky :offset="[18, 18]">
+    <FetchData
+        url="workers/getAvailablePda"
+        @on-fetch="(data) => (deviceProductions = data)"
+        auto-load
+    />
+    <VnTable
+        ref="tableRef"
+        data-key="WorkerPda"
+        url="DeviceProductionUsers"
+        :user-filter="{ order: 'id' }"
+        :filter="{ where: { userFk: routeId } }"
+        search-url="pda"
+        auto-load
+        :columns="columns"
+        @onFetch="fetchDocuware"
+        :hasSubToolbar="true"
+        :default-remove="false"
+        :default-reset="false"
+        :default-save="false"
+        :table="{
+            'row-key': 'deviceProductionFk',
+            selection: 'multiple',
+        }"
+        :table-filter="{ hiddenTags: ['userFk'] }"
+    >
+        <template #moreBeforeActions>
             <QBtn
-                @click.stop="dialog.show()"
+                :label="t('globals.refresh')"
+                icon="refresh"
+                @click="tableRef.reload()"
+            />
+            <QBtn
+                :disable="!tableRef?.selected?.length"
+                :label="t('globals.send')"
+                icon="install_mobile"
+                @click="sendToTablet(tableRef?.selected)"
+                class="bg-primary"
+            />
+        </template>
+        <template #column-actions="{ row }">
+            <QBtn
+                flat
+                icon="delete"
                 color="primary"
-                fab
-                icon="add"
-                v-shortcut="'+'"
+                @click="
+                    openConfirmationModal(
+                        t(`Remove PDA`),
+                        t('Do you want to remove this PDA?'),
+                        () => deallocatePDA(row.deviceProductionFk),
+                    )
+                "
+                data-cy="workerPda-remove"
             >
-                <QDialog ref="dialog">
-                    <FormModelPopup
-                        :title="t('Add new device')"
-                        url-create="DeviceProductionUsers"
-                        model="DeviceProductionUser"
-                        :form-initial-data="initialData"
-                        @on-data-saved="reloadData()"
-                    >
-                        <template #form-inputs="{ data }">
-                            <VnRow>
-                                <VnSelect
-                                    :label="t('worker.pda.newPDA')"
-                                    v-model="data.deviceProductionFk"
-                                    :options="deviceProductions"
-                                    option-label="id"
-                                    option-value="id"
-                                    id="deviceProductionFk"
-                                    hide-selected
-                                    data-cy="pda-dialog-select"
-                                    :required="true"
-                                >
-                                    <template #option="scope">
-                                        <QItem v-bind="scope.itemProps">
-                                            <QItemSection>
-                                                <QItemLabel
-                                                    >ID: {{ scope.opt?.id }}</QItemLabel
-                                                >
-                                                <QItemLabel caption>
-                                                    {{ scope.opt?.modelFk }},
-                                                    {{ scope.opt?.serialNumber }}
-                                                </QItemLabel>
-                                            </QItemSection>
-                                        </QItem>
-                                    </template>
-                                </VnSelect>
-                                <VnInput
-                                    v-model="data.simFk"
-                                    :label="t('SIM serial number')"
-                                    id="simSerialNumber"
-                                    use-input
-                                />
-                            </VnRow>
-                        </template>
-                    </FormModelPopup>
-                </QDialog>
+                <QTooltip>
+                    {{ t('worker.pda.removePDA') }}
+                </QTooltip>
             </QBtn>
-            <QTooltip>
-                {{ t('globals.new') }}
-            </QTooltip>
-        </QPageSticky>
-    </QPage>
+            <QBtn
+                v-if="!isSigned(row)"
+                :loading="loadingDocuware"
+                icon="install_mobile"
+                flat
+                color="primary"
+                @click="
+                    openConfirmationModal(
+                        t('Sign PDA'),
+                        t('Are you sure you want to send it?'),
+                        () => sendToTablet([row]),
+                    )
+                "
+                data-cy="workerPda-send"
+            >
+                <QTooltip>
+                    {{ t('worker.pda.sendToTablet') }}
+                </QTooltip>
+            </QBtn>
+            <QBtn
+                v-if="isSigned(row)"
+                :loading="loadingDocuware"
+                icon="cloud_download"
+                flat
+                color="primary"
+                @click="
+                    downloadDocuware('Docuwares/download-pda-pdf', {
+                        file: row.deviceProductionFk + '-pda',
+                        worker: worker?.lastName + ' ' + worker?.firstName,
+                    })
+                "
+                data-cy="workerPda-download"
+            >
+                <QTooltip>
+                    {{ t('worker.pda.download') }}
+                </QTooltip>
+            </QBtn>
+        </template>
+    </VnTable>
+    <QPageSticky :offset="[18, 18]">
+        <QBtn @click.stop="dialog.show()" color="primary" fab icon="add" v-shortcut="'+'">
+            <QDialog ref="dialog">
+                <FormModelPopup
+                    :title="t('Add new device')"
+                    url-create="DeviceProductionUsers"
+                    model="DeviceProductionUser"
+                    :form-initial-data="initialData"
+                    @on-data-saved="reloadData()"
+                >
+                    <template #form-inputs="{ data }">
+                        <VnRow>
+                            <VnSelect
+                                :label="t('PDA')"
+                                v-model="data.deviceProductionFk"
+                                :options="deviceProductions"
+                                option-label="modelFk"
+                                option-value="id"
+                                id="deviceProductionFk"
+                                hide-selected
+                                data-cy="pda-dialog-select"
+                                :required="true"
+                            >
+                                <template #option="scope">
+                                    <QItem v-bind="scope.itemProps">
+                                        <QItemSection>
+                                            <QItemLabel
+                                                >ID: {{ scope.opt?.id }}</QItemLabel
+                                            >
+                                            <QItemLabel caption>
+                                                {{ scope.opt?.modelFk }},
+                                                {{ scope.opt?.serialNumber }}
+                                            </QItemLabel>
+                                        </QItemSection>
+                                    </QItem>
+                                </template>
+                            </VnSelect>
+                            <VnSelect
+                                url="Sims"
+                                option-label="line"
+                                option-value="code"
+                                v-model="data.simFk"
+                                :label="t('SIM serial number')"
+                                id="simSerialNumber"
+                            />
+                        </VnRow>
+                    </template>
+                </FormModelPopup>
+            </QDialog>
+        </QBtn>
+        <QTooltip>
+            {{ t('globals.new') }}
+        </QTooltip>
+    </QPageSticky>
 </template>
-<style lang="scss" scoped>
-.btn-delete {
-    max-width: 4%;
-    margin-top: 30px;
-}
-</style>
 <i18n>
 es:
     Model: Modelo
@@ -190,4 +305,6 @@ es:
     Do you want to remove this PDA?: ¿Desea eliminar este PDA?
     You can only have one PDA: Solo puedes tener un PDA si no eres autonomo
     This PDA is already assigned to another user: Este PDA ya está asignado a otro usuario
+    Are you sure you want to send it?: ¿Seguro que quieres enviarlo?
+    Sign PDA: Firmar PDA
 </i18n>
diff --git a/src/pages/Worker/Department/Card/DepartmentDescriptor.vue b/src/pages/Worker/Department/Card/DepartmentDescriptor.vue
index 4b7dfd9b8..820658593 100644
--- a/src/pages/Worker/Department/Card/DepartmentDescriptor.vue
+++ b/src/pages/Worker/Department/Card/DepartmentDescriptor.vue
@@ -4,7 +4,7 @@ import { useRoute, useRouter } from 'vue-router';
 import { useI18n } from 'vue-i18n';
 import { useVnConfirm } from 'composables/useVnConfirm';
 import VnLv from 'src/components/ui/VnLv.vue';
-import CardDescriptor from 'src/components/ui/CardDescriptor.vue';
+import EntityDescriptor from 'src/components/ui/EntityDescriptor.vue';
 
 import axios from 'axios';
 import useNotify from 'src/composables/useNotify.js';
@@ -40,7 +40,7 @@ const removeDepartment = async () => {
 const { openConfirmationModal } = useVnConfirm();
 </script>
 <template>
-    <CardDescriptor
+    <EntityDescriptor
         ref="DepartmentDescriptorRef"
         :url="`Departments/${entityId}`"
         :summary="$props.summary"
@@ -95,7 +95,7 @@ const { openConfirmationModal } = useVnConfirm();
                 </QBtn>
             </QCardActions>
         </template>
-    </CardDescriptor>
+    </EntityDescriptor>
 </template>
 
 <i18n>
diff --git a/src/pages/Worker/WorkerFilter.vue b/src/pages/Worker/WorkerFilter.vue
index 8210ba0e3..44dfd32b4 100644
--- a/src/pages/Worker/WorkerFilter.vue
+++ b/src/pages/Worker/WorkerFilter.vue
@@ -35,7 +35,7 @@ const getLocale = (label) => {
         <template #body="{ params }">
             <QItem>
                 <QItemSection>
-                    <VnInput :label="t('FI')" v-model="params.fi" is-outlined
+                    <VnInput :label="t('FI')" v-model="params.fi" filled
                         ><template #prepend>
                             <QIcon name="badge" size="xs"></QIcon> </template
                     ></VnInput>
@@ -43,29 +43,17 @@ const getLocale = (label) => {
             </QItem>
             <QItem>
                 <QItemSection>
-                    <VnInput
-                        :label="t('First Name')"
-                        v-model="params.firstName"
-                        is-outlined
-                    />
+                    <VnInput :label="t('First Name')" v-model="params.firstName" filled />
                 </QItemSection>
             </QItem>
             <QItem>
                 <QItemSection>
-                    <VnInput
-                        :label="t('Last Name')"
-                        v-model="params.lastName"
-                        is-outlined
-                    />
+                    <VnInput :label="t('Last Name')" v-model="params.lastName" filled />
                 </QItemSection>
             </QItem>
             <QItem>
                 <QItemSection>
-                    <VnInput
-                        :label="t('User Name')"
-                        v-model="params.userName"
-                        is-outlined
-                    />
+                    <VnInput :label="t('User Name')" v-model="params.userName" filled />
                 </QItemSection>
             </QItem>
             <QItem>
@@ -79,23 +67,18 @@ const getLocale = (label) => {
                         emit-value
                         map-options
                         dense
-                        outlined
-                        rounded
+                        filled
                     />
                 </QItemSection>
             </QItem>
             <QItem>
                 <QItemSection>
-                    <VnInput :label="t('Email')" v-model="params.email" is-outlined />
+                    <VnInput :label="t('Email')" v-model="params.email" filled />
                 </QItemSection>
             </QItem>
             <QItem>
                 <QItemSection>
-                    <VnInput
-                        :label="t('Extension')"
-                        v-model="params.extension"
-                        is-outlined
-                    />
+                    <VnInput :label="t('Extension')" v-model="params.extension" filled />
                 </QItemSection>
             </QItem>
             <QItem>
diff --git a/src/pages/Zone/Card/ZoneDescriptor.vue b/src/pages/Zone/Card/ZoneDescriptor.vue
index 27676212e..f2bcc1247 100644
--- a/src/pages/Zone/Card/ZoneDescriptor.vue
+++ b/src/pages/Zone/Card/ZoneDescriptor.vue
@@ -2,7 +2,7 @@
 import { computed } from 'vue';
 import { useRoute } from 'vue-router';
 
-import CardDescriptor from 'components/ui/CardDescriptor.vue';
+import EntityDescriptor from 'components/ui/EntityDescriptor.vue';
 import VnLv from 'src/components/ui/VnLv.vue';
 import { toTimeFormat } from 'src/filters/date';
 import { toCurrency } from 'filters/index';
@@ -25,7 +25,7 @@ const entityId = computed(() => {
 </script>
 
 <template>
-    <CardDescriptor :url="`Zones/${entityId}`" :filter="filter" data-key="Zone">
+    <EntityDescriptor :url="`Zones/${entityId}`" :filter="filter" data-key="Zone">
         <template #menu="{ entity }">
             <ZoneDescriptorMenuItems :zone="entity" />
         </template>
@@ -36,5 +36,5 @@ const entityId = computed(() => {
             <VnLv :label="$t('list.price')" :value="toCurrency(entity.price)" />
             <VnLv :label="$t('zone.bonus')" :value="toCurrency(entity.bonus)" />
         </template>
-    </CardDescriptor>
+    </EntityDescriptor>
 </template>
diff --git a/src/pages/Zone/ZoneDeliveryPanel.vue b/src/pages/Zone/ZoneDeliveryPanel.vue
index a8cb05afc..fc5c04b41 100644
--- a/src/pages/Zone/ZoneDeliveryPanel.vue
+++ b/src/pages/Zone/ZoneDeliveryPanel.vue
@@ -95,8 +95,7 @@ watch(
                 :filter-options="['code']"
                 hide-selected
                 dense
-                outlined
-                rounded
+                filled
                 map-key="geoFk"
                 data-cy="ZoneDeliveryDaysPostcodeSelect"
             >
@@ -128,8 +127,7 @@ watch(
                 option-label="name"
                 hide-selected
                 dense
-                outlined
-                rounded
+                filled
                 data-cy="ZoneDeliveryDaysAgencySelect"
             />
             <VnSelect
@@ -144,7 +142,6 @@ watch(
                 option-label="name"
                 hide-selected
                 dense
-                outlined
                 rounded
             />
         </div>
diff --git a/test/cypress/integration/vnComponent/VnLog.spec.js b/test/cypress/integration/vnComponent/VnLog.spec.js
index e857457a7..ae0013150 100644
--- a/test/cypress/integration/vnComponent/VnLog.spec.js
+++ b/test/cypress/integration/vnComponent/VnLog.spec.js
@@ -25,7 +25,7 @@ describe('VnLog', () => {
 
     it('should show claimDescriptor', () => {
         cy.dataCy('iconLaunch-claimFk').first().click();
-        cy.dataCy('cardDescriptor_subtitle').contains('1');
+        cy.dataCy('vnDescriptor_subtitle').contains('1');
         cy.dataCy('iconLaunch-claimFk').first().click();
     });
 });
diff --git a/test/cypress/integration/worker/workerPda.spec.js b/test/cypress/integration/worker/workerPda.spec.js
index 31ec19eda..2623e81cf 100644
--- a/test/cypress/integration/worker/workerPda.spec.js
+++ b/test/cypress/integration/worker/workerPda.spec.js
@@ -1,23 +1,80 @@
 describe('WorkerPda', () => {
-    const select = '[data-cy="pda-dialog-select"]';
+    const deviceId = 4;
     beforeEach(() => {
-        cy.viewport(1920, 1080);
         cy.login('developer');
         cy.visit(`/#/worker/1110/pda`);
     });
 
-    it('assign pda', () => {
-        cy.addBtnClick();
-        cy.get(select).click();
-        cy.get(select).type('{downArrow}{enter}');
-        cy.get('.q-notification__message').should('have.text', 'Data created');
+    it('assign and delete pda', () => {
+        creatNewPDA();
+        cy.checkNotification('Data created');
+        cy.visit(`/#/worker/1110/pda`);
+        removeNewPDA();
+        cy.checkNotification('PDA deallocated');
     });
 
-    it('delete pda', () => {
-        cy.get('.btn-delete').click();
-        cy.get(
-            '.q-card__actions > .q-btn--unelevated > .q-btn__content > .block'
-        ).click();
-        cy.get('.q-notification__message').should('have.text', 'PDA deallocated');
+    it('send and download pdf to docuware', () => {
+        //Send
+        cy.intercept('POST', '/api/Docuwares/upload-pda-pdf', (req) => {
+            req.reply({
+                statusCode: 200,
+                body: {},
+            });
+        });
+
+        creatNewPDA();
+
+        cy.dataCy('workerPda-send').click();
+        cy.clickConfirm();
+        cy.checkNotification('PDF sended to signed');
+
+        //Download
+        cy.intercept('POST', /\/api\/Docuwares\/Jones%20Jessica\/checkFile/, (req) => {
+            req.reply({
+                statusCode: 200,
+                body: {
+                    id: deviceId,
+                    state: 'Firmado',
+                },
+            });
+        });
+        cy.get('#st-actions').contains('refresh').click();
+        cy.intercept('GET', '/api/Docuwares/download-pda-pdf**', (req) => {
+            req.reply({
+                statusCode: 200,
+                body: {},
+            });
+        });
+
+        cy.dataCy('workerPda-download').click();
+        removeNewPDA();
     });
+
+    it('send 2 pdfs to docuware', () => {
+        cy.intercept('POST', '/api/Docuwares/upload-pda-pdf', (req) => {
+            req.reply({
+                statusCode: 200,
+                body: {},
+            });
+        });
+
+        creatNewPDA();
+        creatNewPDA(2);
+        cy.selectRows([1, 2]);
+        cy.get('#st-actions').contains('Send').click();
+        cy.checkNotification('PDF sended to signed');
+
+        removeNewPDA();
+    });
+
+    function creatNewPDA(id = deviceId) {
+        cy.addBtnClick();
+        cy.selectOption('[data-cy="pda-dialog-select"]', id);
+        cy.saveCard();
+    }
+
+    function removeNewPDA() {
+        cy.dataCy('workerPda-remove').first().click();
+        cy.clickConfirm();
+    }
 });
diff --git a/test/cypress/support/commands.js b/test/cypress/support/commands.js
index de25959b2..fe8d38e79 100755
--- a/test/cypress/support/commands.js
+++ b/test/cypress/support/commands.js
@@ -371,7 +371,7 @@ Cypress.Commands.add('validateContent', (selector, expectedValue) => {
 });
 
 Cypress.Commands.add('openActionsDescriptor', () => {
-    cy.get('[data-cy="cardDescriptor"] [data-cy="descriptor-more-opts"]').click();
+    cy.get('[data-cy="vnDescriptor"] [data-cy="descriptor-more-opts"]').click();
 });
 
 Cypress.Commands.add('openUserPanel', () => {
@@ -466,16 +466,16 @@ Cypress.Commands.add('validateDescriptor', (toCheck = {}) => {
 
     const popupSelector = popup ? '[role="menu"] ' : '';
 
-    if (title) cy.get(`${popupSelector}[data-cy="cardDescriptor_title"]`).contains(title);
+    if (title) cy.get(`${popupSelector}[data-cy="vnDescriptor_title"]`).contains(title);
     if (description)
-        cy.get(`${popupSelector}[data-cy="cardDescriptor_description"]`).contains(
+        cy.get(`${popupSelector}[data-cy="vnDescriptor_description"]`).contains(
             description,
         );
     if (subtitle)
-        cy.get(`${popupSelector}[data-cy="cardDescriptor_subtitle"]`).contains(subtitle);
+        cy.get(`${popupSelector}[data-cy="vnDescriptor_subtitle"]`).contains(subtitle);
 
     for (const index in listbox)
-        cy.get(`${popupSelector}[data-cy="cardDescriptor_listbox"] > *`)
+        cy.get(`${popupSelector}[data-cy="vnDescriptor_listbox"] > *`)
             .eq(index)
             .should('contain.text', listbox[index]);
 });

From 88c61c8a856b79bd289efaaa022ead0b26f1334c Mon Sep 17 00:00:00 2001
From: alexm <alexm@verdnatura.es>
Date: Mon, 24 Mar 2025 14:27:18 +0100
Subject: [PATCH 44/44] fix: warmFix quasar build async function

---
 src/composables/downloadFile.js | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/src/composables/downloadFile.js b/src/composables/downloadFile.js
index 302836e09..0c4e8edb6 100644
--- a/src/composables/downloadFile.js
+++ b/src/composables/downloadFile.js
@@ -5,18 +5,19 @@ import { exportFile } from 'quasar';
 
 const { getTokenMultimedia } = useSession();
 const token = getTokenMultimedia();
-const appUrl = (await getUrl('', 'lilium')).replace('/#/', '');
 
 export async function downloadFile(id, model = 'dms', urlPath = '/downloadFile', url) {
+    const appUrl = await getAppUrl();
     const response = await axios.get(
         url ?? `${appUrl}/api/${model}/${id}${urlPath}?access_token=${token}`,
-        { responseType: 'blob' }
+        { responseType: 'blob' },
     );
 
     download(response);
 }
 
 export async function downloadDocuware(url, params) {
+    const appUrl = await getAppUrl();
     const response = await axios.get(`${appUrl}/api/` + url, {
         responseType: 'blob',
         params,
@@ -32,3 +33,7 @@ function download(response) {
 
     exportFile(filename, response.data);
 }
+
+async function getAppUrl() {
+    return (await getUrl('', 'lilium')).replace('/#/', '');
+}