diff --git a/src/components/VnTable/VnFilter.vue b/src/components/VnTable/VnFilter.vue
index 2dad8fe52..0de3834ea 100644
--- a/src/components/VnTable/VnFilter.vue
+++ b/src/components/VnTable/VnFilter.vue
@@ -152,7 +152,7 @@ const onTabPressed = async () => {
 };
 </script>
 <template>
-    <div v-if="showFilter" class="full-width flex-center" style="overflow: hidden">
+    <div v-if="showFilter" class="full-width" style="overflow: hidden">
         <VnColumn
             :column="$props.column"
             default="input"
diff --git a/src/components/VnTable/VnOrder.vue b/src/components/VnTable/VnOrder.vue
index e3795cc4b..47ed9acf4 100644
--- a/src/components/VnTable/VnOrder.vue
+++ b/src/components/VnTable/VnOrder.vue
@@ -23,6 +23,10 @@ const $props = defineProps({
         type: Boolean,
         default: false,
     },
+    align: {
+        type: String,
+        default: 'end',
+    },
 });
 const hover = ref();
 const arrayData = useArrayData($props.dataKey, { searchUrl: $props.searchUrl });
@@ -46,16 +50,27 @@ async function orderBy(name, direction) {
 }
 
 defineExpose({ orderBy });
+
+function textAlignToFlex(textAlign) {
+    return `justify-content: ${
+        {
+            'text-center': 'center',
+            'text-left': 'start',
+            'text-right': 'end',
+        }[textAlign] || 'start'
+    };`;
+}
 </script>
 <template>
     <div
         @mouseenter="hover = true"
         @mouseleave="hover = false"
         @click="orderBy(name, model?.direction)"
-        class="row items-center no-wrap cursor-pointer title"
+        class="items-center no-wrap cursor-pointer title"
+        :style="textAlignToFlex(align)"
     >
         <span :title="label">{{ label }}</span>
-        <sup v-if="name && model?.index">
+        <div v-if="name && model?.index">
             <QChip
                 :label="!vertical ? model?.index : ''"
                 :icon="
@@ -92,20 +107,16 @@ defineExpose({ orderBy });
                     />
                 </div>
             </QChip>
-        </sup>
+        </div>
     </div>
 </template>
 <style lang="scss" scoped>
 .title {
     display: flex;
-    justify-content: center;
     align-items: center;
     height: 30px;
     width: 100%;
     color: var(--vn-label-color);
-}
-sup {
-    vertical-align: super; /* Valor predeterminado */
-    /* También puedes usar otros valores como "baseline", "top", "text-top", etc. */
+    white-space: nowrap;
 }
 </style>
diff --git a/src/components/VnTable/VnTable.vue b/src/components/VnTable/VnTable.vue
index 805a6fbd5..fe4806193 100644
--- a/src/components/VnTable/VnTable.vue
+++ b/src/components/VnTable/VnTable.vue
@@ -519,7 +519,7 @@ function getToggleIcon(value) {
 }
 
 function formatColumnValue(col, row, dashIfEmpty) {
-    if (col?.format) {
+    if (col?.format || row[col?.name + 'TextValue']) {
         if (selectRegex.test(col?.component) && row[col?.name + 'TextValue']) {
             return dashIfEmpty(row[col?.name + 'TextValue']);
         } else {
@@ -551,9 +551,8 @@ function formatColumnValue(col, row, dashIfEmpty) {
             return dashIfEmpty(row[urlRelation][col?.attrs.optionLabel ?? 'name']);
         }
         if (typeof row[urlRelation] == 'string') return dashIfEmpty(row[urlRelation]);
-    } else {
-        return dashIfEmpty(row[col?.name]);
     }
+    return dashIfEmpty(row[col?.name]);
 }
 function cardClick(_, row) {
     if ($props.redirect) router.push({ path: `/${$props.redirect}/${row.id}` });
@@ -648,15 +647,14 @@ function cardClick(_, row) {
                         v-bind:class="col.headerClass"
                         class="body-cell"
                         :style="col?.width ? `max-width: ${col?.width}` : ''"
-                        style="padding: inherit"
                     >
                         <div
                             class="no-padding"
-                            :style="
-                                withFilters && $props.columnSearch ? 'height: 75px' : ''
-                            "
+                            :style="[
+                                withFilters && $props.columnSearch ? 'height: 75px' : '',
+                            ]"
                         >
-                            <div class="text-center" style="height: 30px">
+                            <div style="height: 30px">
                                 <QTooltip v-if="col.toolTip">{{ col.toolTip }}</QTooltip>
                                 <VnTableOrder
                                     v-model="orders[col.orderBy ?? col.name]"
@@ -664,6 +662,7 @@ function cardClick(_, row) {
                                     :label="col?.labelAbbreviation ?? col?.label"
                                     :data-key="$attrs['data-key']"
                                     :search-url="searchUrl"
+                                    :align="getColAlign(col)"
                                 />
                             </div>
                             <VnFilter
@@ -1045,8 +1044,8 @@ es:
 }
 
 .body-cell {
-    padding-left: 2px !important;
-    padding-right: 2px !important;
+    padding-left: 4px !important;
+    padding-right: 4px !important;
     position: relative;
 }
 .bg-chip-secondary {
diff --git a/src/components/common/VnComponent.vue b/src/components/common/VnComponent.vue
index d9d1ea26b..a9e1c8cff 100644
--- a/src/components/common/VnComponent.vue
+++ b/src/components/common/VnComponent.vue
@@ -48,7 +48,8 @@ function toValueAttrs(attrs) {
     <span
         v-for="toComponent of componentArray"
         :key="toComponent.name"
-        class="column flex-center fit"
+        class="column fit"
+        :class="toComponent?.component == 'checkbox' ? 'flex-center' : ''"
     >
         <component
             v-if="toComponent?.component"
diff --git a/src/composables/getColAlign.js b/src/composables/getColAlign.js
index 6e963b437..a930fd7d8 100644
--- a/src/composables/getColAlign.js
+++ b/src/composables/getColAlign.js
@@ -1,14 +1,14 @@
 export function getColAlign(col) {
     let align;
     switch (col.component) {
+        case 'time':
+        case 'date':
         case 'select':
             align = 'left';
             break;
         case 'number':
             align = 'right';
             break;
-        case 'time':
-        case 'date':
         case 'checkbox':
             align = 'center';
             break;
diff --git a/src/filters/toDate.js b/src/filters/toDate.js
index 8fe8f3836..002797af5 100644
--- a/src/filters/toDate.js
+++ b/src/filters/toDate.js
@@ -3,6 +3,8 @@ import { useI18n } from 'vue-i18n';
 export default function (value, options = {}) {
     if (!value) return;
 
+    if (!isValidDate(value)) return null;
+
     if (!options.dateStyle && !options.timeStyle) {
         options.day = '2-digit';
         options.month = '2-digit';
@@ -10,7 +12,12 @@ export default function (value, options = {}) {
     }
 
     const { locale } = useI18n();
-    const date = new Date(value);
+    const newDate = new Date(value);
 
-    return new Intl.DateTimeFormat(locale.value, options).format(date);
+    return new Intl.DateTimeFormat(locale.value, options).format(newDate);
+}
+// handle 0000-00-00
+function isValidDate(date) {
+    const parsedDate = new Date(date);
+    return parsedDate instanceof Date && !isNaN(parsedDate.getTime());
 }
diff --git a/src/pages/Entry/Card/EntryBuys.vue b/src/pages/Entry/Card/EntryBuys.vue
index f3b73cb04..81578c609 100644
--- a/src/pages/Entry/Card/EntryBuys.vue
+++ b/src/pages/Entry/Card/EntryBuys.vue
@@ -16,7 +16,6 @@ import ItemDescriptor from 'src/pages/Item/Card/ItemDescriptor.vue';
 import axios from 'axios';
 import VnSelectEnum from 'src/components/common/VnSelectEnum.vue';
 import { checkEntryLock } from 'src/composables/checkEntryLock';
-import SkeletonDescriptor from 'src/components/ui/SkeletonDescriptor.vue';
 
 const $props = defineProps({
     id: {
@@ -103,7 +102,7 @@ const columns = [
         name: 'itemFk',
         component: 'number',
         isEditable: false,
-        width: '40px',
+        width: '35px',
     },
     {
         labelAbbreviation: '',
@@ -111,7 +110,7 @@ const columns = [
         name: 'hex',
         columnSearch: false,
         isEditable: false,
-        width: '5px',
+        width: '9px',
         component: 'select',
         attrs: {
             url: 'Inks',
@@ -181,6 +180,7 @@ const columns = [
             url: 'packagings',
             fields: ['id'],
             optionLabel: 'id',
+            optionValue: 'id',
         },
         create: true,
         width: '40px',
@@ -192,7 +192,7 @@ const columns = [
         component: 'number',
         create: true,
         width: '35px',
-        format: (row, dashIfEmpty) => parseFloat(row['weight']).toFixed(1),
+        format: (row) => parseFloat(row['weight']).toFixed(1),
     },
     {
         labelAbbreviation: 'P',
@@ -330,6 +330,25 @@ const columns = [
         create: true,
         format: (row) => parseFloat(row['price3']).toFixed(2),
     },
+    {
+        align: 'center',
+        labelAbbreviation: 'CM',
+        label: t('Check min price'),
+        toolTip: t('Check min price'),
+        name: 'hasMinPrice',
+        attrs: {
+            toggleIndeterminate: false,
+        },
+        component: 'checkbox',
+        cellEvent: {
+            'update:modelValue': async (value, oldValue, row) => {
+                await axios.patch(`Items/${row['itemFk']}`, {
+                    hasMinPrice: value,
+                });
+            },
+        },
+        width: '25px',
+    },
     {
         align: 'center',
         labelAbbreviation: 'Min.',
@@ -350,25 +369,6 @@ const columns = [
         },
         format: (row) => parseFloat(row['minPrice']).toFixed(2),
     },
-    {
-        align: 'center',
-        labelAbbreviation: 'CM',
-        label: t('Check min price'),
-        toolTip: t('Check min price'),
-        name: 'hasMinPrice',
-        attrs: {
-            toggleIndeterminate: false,
-        },
-        component: 'checkbox',
-        cellEvent: {
-            'update:modelValue': async (value, oldValue, row) => {
-                await axios.patch(`Items/${row['itemFk']}`, {
-                    hasMinPrice: value,
-                });
-            },
-        },
-        width: '25px',
-    },
     {
         align: 'center',
         labelAbbreviation: t('P.Sen'),
@@ -378,6 +378,9 @@ const columns = [
         component: 'number',
         isEditable: false,
         width: '40px',
+        style: () => {
+            return { color: 'var(--vn-label-color)' };
+        },
     },
     {
         align: 'center',
@@ -417,6 +420,9 @@ const columns = [
         component: 'input',
         isEditable: false,
         width: '35px',
+        style: () => {
+            return { color: 'var(--vn-label-color)' };
+        },
     },
 ];
 
@@ -644,8 +650,8 @@ onMounted(() => {
         :is-editable="editableMode"
         :without-header="!editableMode"
         :with-filters="editableMode"
-        :right-search="false"
-        :right-search-icon="false"
+        :right-search="true"
+        :right-search-icon="true"
         :row-click="false"
         :columns="columns"
         :beforeSaveFn="beforeSave"
diff --git a/src/pages/Entry/EntryList.vue b/src/pages/Entry/EntryList.vue
index d50f6b219..3c96a2302 100644
--- a/src/pages/Entry/EntryList.vue
+++ b/src/pages/Entry/EntryList.vue
@@ -199,7 +199,6 @@ const columns = computed(() => [
             optionValue: 'code',
             optionLabel: 'description',
         },
-        cardVisible: true,
         width: '65px',
         format: (row, dashIfEmpty) => dashIfEmpty(row.entryTypeDescription),
     },
diff --git a/src/pages/Entry/EntryStockBought.vue b/src/pages/Entry/EntryStockBought.vue
index da8557828..4bd0fe640 100644
--- a/src/pages/Entry/EntryStockBought.vue
+++ b/src/pages/Entry/EntryStockBought.vue
@@ -57,7 +57,7 @@ const columns = computed(() => [
         create: true,
         component: 'number',
         summation: true,
-        width: '60px',
+        width: '50px',
     },
     {
         align: 'center',
@@ -286,7 +286,7 @@ function round(value) {
     justify-content: center;
 }
 .column {
-    min-width: 30%;
+    min-width: 40%;
     margin-top: 5%;
     display: flex;
     flex-direction: column;
diff --git a/src/pages/Entry/EntryStockBoughtDetail.vue b/src/pages/Entry/EntryStockBoughtDetail.vue
index 9d382f23a..1a37994d9 100644
--- a/src/pages/Entry/EntryStockBoughtDetail.vue
+++ b/src/pages/Entry/EntryStockBoughtDetail.vue
@@ -101,7 +101,8 @@ const columns = [
 </template>
 <style lang="css" scoped>
 .container {
-    max-width: 50vw;
+    max-width: 100%;
+    width: 50%;
     overflow: auto;
     justify-content: center;
     align-items: center;
@@ -109,9 +110,6 @@ const columns = [
     background-color: var(--vn-section-color);
     padding: 2%;
 }
-.container > div > div > .q-table__top.relative-position.row.items-center {
-    background-color: red !important;
-}
 </style>
 <i18n>
     es:
diff --git a/src/pages/InvoiceOut/Card/InvoiceOutDescriptorMenu.vue b/src/pages/InvoiceOut/Card/InvoiceOutDescriptorMenu.vue
index 1fd9f3e92..8be928134 100644
--- a/src/pages/InvoiceOut/Card/InvoiceOutDescriptorMenu.vue
+++ b/src/pages/InvoiceOut/Card/InvoiceOutDescriptorMenu.vue
@@ -163,10 +163,14 @@ const showExportationLetter = () => {
         <QMenu anchor="top end" self="top start">
             <QList>
                 <QItem v-ripple clickable @click="showSendInvoiceDialog('pdf')">
-                    <QItemSection>{{ t('Send PDF') }}</QItemSection>
+                    <QItemSection data-cy="InvoiceOutDescriptorMenuSendPdfOption">
+                        {{ t('Send PDF') }}
+                    </QItemSection>
                 </QItem>
                 <QItem v-ripple clickable @click="showSendInvoiceDialog('csv')">
-                    <QItemSection>{{ t('Send CSV') }}</QItemSection>
+                    <QItemSection data-cy="InvoiceOutDescriptorMenuSendCsvOption">
+                        {{ t('Send CSV') }}
+                    </QItemSection>
                 </QItem>
             </QList>
         </QMenu>
diff --git a/src/pages/InvoiceOut/locale/en.yml b/src/pages/InvoiceOut/locale/en.yml
index 9dd31d186..f1baef432 100644
--- a/src/pages/InvoiceOut/locale/en.yml
+++ b/src/pages/InvoiceOut/locale/en.yml
@@ -24,6 +24,7 @@ invoiceOut:
         min: Min
         max: Max
         hasPdf: Has PDF
+        search: Contains
     card:
         issued: Issued
         customerCard: Customer card
diff --git a/src/pages/InvoiceOut/locale/es.yml b/src/pages/InvoiceOut/locale/es.yml
index 79ceb4aa8..afca27871 100644
--- a/src/pages/InvoiceOut/locale/es.yml
+++ b/src/pages/InvoiceOut/locale/es.yml
@@ -24,6 +24,7 @@ invoiceOut:
         min: Min
         max: Max
         hasPdf: Tiene PDF
+        search: Contiene
     card:
         issued: Fecha emisión
         customerCard: Ficha del cliente
diff --git a/src/pages/Item/ItemRequestFilter.vue b/src/pages/Item/ItemRequestFilter.vue
index af48f7f5c..c2a63ddd9 100644
--- a/src/pages/Item/ItemRequestFilter.vue
+++ b/src/pages/Item/ItemRequestFilter.vue
@@ -8,6 +8,7 @@ import VnInput from 'src/components/common/VnInput.vue';
 import FetchData from 'components/FetchData.vue';
 import { useArrayData } from 'src/composables/useArrayData';
 import VnSelectWorker from 'src/components/common/VnSelectWorker.vue';
+import VnInputDate from 'src/components/common/VnInputDate.vue';
 
 const { t } = useI18n();
 const props = defineProps({
@@ -52,7 +53,7 @@ onMounted(async () => {
                 name: key,
                 value,
                 selectedField: { name: key, label: t(`params.${key}`) },
-            })
+            }),
         );
     }
     exprBuilder('state', arrayData.store?.userParams?.state);
@@ -157,6 +158,32 @@ onMounted(async () => {
                     />
                 </QItemSection>
             </QItem>
+            <QItem>
+                <QItemSection>
+                    <VnInputDate
+                        v-model="params.from"
+                        :label="t('params.from')"
+                        is-outlined
+                    />
+                </QItemSection>
+                <QItemSection>
+                    <VnInputDate
+                        v-model="params.to"
+                        :label="t('params.to')"
+                        is-outlined
+                    />
+                </QItemSection>
+            </QItem>
+            <QItem>
+                <QItemSection>
+                    <VnInput
+                        :label="t('params.daysOnward')"
+                        v-model="params.daysOnward"
+                        lazy-rules
+                        is-outlined
+                    />
+                </QItemSection>
+            </QItem>
             <QItem>
                 <QItemSection>
                     <VnSelect
@@ -175,11 +202,10 @@ onMounted(async () => {
             </QItem>
             <QItem>
                 <QItemSection>
-                    <VnInput
-                        :label="t('params.daysOnward')"
-                        v-model="params.daysOnward"
-                        lazy-rules
-                        is-outlined
+                    <QCheckbox
+                        :label="t('params.mine')"
+                        v-model="params.mine"
+                        :toggle-indeterminate="false"
                     />
                 </QItemSection>
             </QItem>
diff --git a/src/pages/Worker/Card/WorkerMedical.vue b/src/pages/Worker/Card/WorkerMedical.vue
index b3a599af7..c04f6496b 100644
--- a/src/pages/Worker/Card/WorkerMedical.vue
+++ b/src/pages/Worker/Card/WorkerMedical.vue
@@ -3,6 +3,7 @@ import { ref, computed } from 'vue';
 import { useI18n } from 'vue-i18n';
 import { useRoute } from 'vue-router';
 import VnTable from 'components/VnTable/VnTable.vue';
+import { dashIfEmpty } from 'src/filters';
 const tableRef = ref();
 const { t } = useI18n();
 const route = useRoute();
@@ -44,9 +45,12 @@ const columns = [
         create: true,
         component: 'select',
         attrs: {
-            url: 'centers',
+            url: 'medicalCenters',
             fields: ['id', 'name'],
         },
+        format: (row, dashIfEmpty) => {
+            return dashIfEmpty(row.center?.name);
+        },
     },
     {
         align: 'left',
diff --git a/test/cypress/integration/invoiceOut/invoiceOutList.spec.js b/test/cypress/integration/invoiceOut/invoiceOutList.spec.js
index 82f0fa3b6..d3a84d226 100644
--- a/test/cypress/integration/invoiceOut/invoiceOutList.spec.js
+++ b/test/cypress/integration/invoiceOut/invoiceOutList.spec.js
@@ -1,6 +1,16 @@
 /// <reference types="cypress" />
 describe('InvoiceOut list', () => {
     const serial = 'Española rapida';
+    const columnCheckbox =
+        '.bg-header > :nth-child(1) > .q-checkbox > .q-checkbox__inner';
+    const firstRowDescriptor =
+        'tbody > :nth-child(1) > [data-col-field="clientFk"] > .no-padding > .link';
+    const firstRowCheckbox =
+        'tbody > :nth-child(1) > :nth-child(1) > .q-checkbox > .q-checkbox__inner ';
+    const summaryPopupIcon = '.header > :nth-child(2) > .q-btn__content > .q-icon';
+    const filterBtn = '.q-scrollarea__content > .q-btn--standard > .q-btn__content';
+    const firstSummaryIcon =
+        ':nth-child(1) > .text-right > [data-cy="tableAction-0"] > .q-btn__content > .q-icon';
 
     beforeEach(() => {
         cy.viewport(1920, 1080);
@@ -9,18 +19,32 @@ describe('InvoiceOut list', () => {
         cy.typeSearchbar('{enter}');
     });
 
-    it('should search and filter an invoice and enter to the summary', () => {
-        cy.typeSearchbar('1{enter}');
-        cy.get('.q-virtual-scroll__content > :nth-child(2) > :nth-child(7)').click();
-        cy.get('.header > a.q-btn > .q-btn__content').click();
-        cy.typeSearchbar('{enter}');
-        cy.dataCy('InvoiceOutFilterAmountBtn').find('input').type('8.88{enter}');
+    it('should download one pdf from the subtoolbar button', () => {
+        cy.get(firstRowCheckbox).click();
+        cy.dataCy('InvoiceOutDownloadPdfBtn').click();
     });
 
     it('should download all pdfs', () => {
-        cy.get('.bg-header > :nth-child(1) > .q-checkbox > .q-checkbox__inner').click();
+        cy.get(columnCheckbox).click();
         cy.dataCy('InvoiceOutDownloadPdfBtn').click();
-        cy.get('.bg-header > :nth-child(1) > .q-checkbox > .q-checkbox__inner').click();
+    });
+
+    it('should open the invoice descriptor from table icon', () => {
+        cy.get(firstSummaryIcon).click();
+        cy.get('.cardSummary').should('be.visible');
+        cy.get('.summaryHeader > div').should('include.text', 'A1111111');
+    });
+
+    it('should open the client descriptor', () => {
+        cy.get(firstRowDescriptor).click();
+        cy.get(summaryPopupIcon).click();
+    });
+
+    it('should filter the results by client ID, then check the first result is correct', () => {
+        cy.dataCy('Customer ID_input').type('1103');
+        cy.get(filterBtn).click();
+        cy.get(firstRowDescriptor).click();
+        cy.get('.q-item > .q-item__label').should('include.text', '1103');
     });
 
     it('should give an error when manual invoicing a ticket that is already invoiced', () => {
@@ -31,11 +55,14 @@ describe('InvoiceOut list', () => {
         cy.checkNotification('This ticket is already invoiced');
     });
 
-    it('should create a manual invoice and enter to its summary', () => {
+    it('should create a manual invoice and enter to its summary, then delete that invoice', () => {
         cy.dataCy('vnTableCreateBtn').click();
-        cy.dataCy('InvoiceOutCreateTicketinput').type(8);
+        cy.dataCy('InvoiceOutCreateTicketinput').type(9);
         cy.selectOption('[data-cy="InvoiceOutCreateSerialSelect"]', serial);
         cy.dataCy('FormModelPopup_save').click();
         cy.checkNotification('Data created');
+        cy.dataCy('descriptor-more-opts').click();
+        cy.get('.q-menu > .q-list > :nth-child(4)').click();
+        cy.dataCy('VnConfirm_confirm').click();
     });
 });
diff --git a/test/cypress/integration/invoiceOut/invoiceOutNegativeBases.spec.js b/test/cypress/integration/invoiceOut/invoiceOutNegativeBases.spec.js
index 02b7fbb43..4d530de05 100644
--- a/test/cypress/integration/invoiceOut/invoiceOutNegativeBases.spec.js
+++ b/test/cypress/integration/invoiceOut/invoiceOutNegativeBases.spec.js
@@ -1,11 +1,26 @@
 /// <reference types="cypress" />
 describe('InvoiceOut negative bases', () => {
+    const getDescriptors = (opt) =>
+        `:nth-child(1) > [data-col-field="${opt}"] > .no-padding > .link`;
+
     beforeEach(() => {
         cy.viewport(1920, 1080);
         cy.login('developer');
         cy.visit(`/#/invoice-out/negative-bases`);
     });
 
+    it('should open the posible descriptors', () => {
+        cy.get(getDescriptors('clientId')).click();
+        cy.get('.descriptor').should('be.visible');
+        cy.get('.q-item > .q-item__label').should('include.text', '1101');
+        cy.get(getDescriptors('ticketFk')).click();
+        cy.get('.descriptor').should('be.visible');
+        cy.get('.q-item > .q-item__label').should('include.text', '23');
+        cy.get(getDescriptors('workerName')).click();
+        cy.get('.descriptor').should('be.visible');
+        cy.get('.q-item > .q-item__label').should('include.text', '18');
+    });
+
     it('should filter and download as CSV', () => {
         cy.get('input[name="ticketFk"]').type('23{enter}');
         cy.get('#subToolbar > .q-btn').click();
diff --git a/test/cypress/integration/invoiceOut/invoiceOutSummary.spec.js b/test/cypress/integration/invoiceOut/invoiceOutSummary.spec.js
index 44b0a9961..333f7e2c4 100644
--- a/test/cypress/integration/invoiceOut/invoiceOutSummary.spec.js
+++ b/test/cypress/integration/invoiceOut/invoiceOutSummary.spec.js
@@ -5,40 +5,91 @@ describe('InvoiceOut summary', () => {
         Type: { val: 'Error in customer data', type: 'select' },
     };
 
+    const firstRowDescriptors = (opt) =>
+        `tbody > :nth-child(1) > :nth-child(${opt}) > .q-btn`;
+    const toCustomerSummary = '[href="#/customer/1101"]';
+    const toTicketList = '[href="#/ticket/list?table={%22refFk%22:%22T1111111%22}"]';
+    const selectMenuOption = (opt) => `.q-menu > .q-list > :nth-child(${opt})`;
+    const confirmSend = '.q-btn--unelevated';
+
     beforeEach(() => {
         cy.viewport(1920, 1080);
         cy.login('developer');
-        cy.visit(`/#/invoice-out/list`);
+        cy.visit(`/#/invoice-out/1/summary`);
     });
 
-    it('should generate the invoice PDF', () => {
-        cy.typeSearchbar('T1111111{enter}');
-        cy.dataCy('descriptor-more-opts').click();
-        cy.get('.q-menu > .q-list > :nth-child(6)').click();
-        cy.dataCy('VnConfirm_confirm').click();
-        cy.checkNotification('The invoice PDF document has been regenerated');
+    it('open the descriptors', () => {
+        cy.get(firstRowDescriptors(1)).click();
+        cy.get('.descriptor').should('be.visible');
+        cy.get('.q-item > .q-item__label').should('include.text', '1');
+        cy.get(firstRowDescriptors(2)).click();
+        cy.get('.descriptor').should('be.visible');
+        cy.get('.q-item > .q-item__label').should('include.text', '1101');
     });
-    it('should refund the invoice ', () => {
+
+    it('should open the client summary and the ticket list', () => {
+        cy.get(toCustomerSummary).click();
+        cy.get('.descriptor').should('be.visible');
+        cy.get('.q-item > .q-item__label').should('include.text', '1101');
+    });
+
+    it('should open the ticket list', () => {
+        cy.get(toTicketList).click();
+        cy.get('.descriptor').should('be.visible');
+        cy.dataCy('vnFilterPanelChip').should('include.text', 'T1111111');
+    });
+
+    it('should transfer the invoice ', () => {
         cy.typeSearchbar('T1111111{enter}');
         cy.dataCy('descriptor-more-opts').click();
-        cy.get('.q-menu > .q-list > :nth-child(7)').click();
-        cy.get('#q-portal--menu--3 > .q-menu > .q-list > :nth-child(2)').click();
-        cy.checkNotification('The following refund ticket have been created');
+        cy.get(selectMenuOption(1)).click();
+        cy.fillInForm(transferInvoice);
+        cy.get('.q-mt-lg > .q-btn').click();
+        cy.checkNotification('Transferred invoice');
+    });
+
+    it('should send the invoice as PDF', () => {
+        cy.dataCy('descriptor-more-opts').click();
+        cy.get(selectMenuOption(3)).click();
+        cy.dataCy('InvoiceOutDescriptorMenuSendPdfOption').click();
+        cy.get(confirmSend).click();
+        cy.checkNotification('Notification sent');
+    });
+
+    it('should send the invoice as CSV', () => {
+        cy.dataCy('descriptor-more-opts').click();
+        cy.get(selectMenuOption(3)).click();
+        cy.dataCy('InvoiceOutDescriptorMenuSendCsvOption').click();
+        cy.get(confirmSend).click();
+        cy.checkNotification('Notification sent');
     });
 
     it('should delete an invoice ', () => {
         cy.typeSearchbar('T2222222{enter}');
         cy.dataCy('descriptor-more-opts').click();
-        cy.get('.q-menu > .q-list > :nth-child(4)').click();
+        cy.get(selectMenuOption(4)).click();
         cy.dataCy('VnConfirm_confirm').click();
         cy.checkNotification('InvoiceOut deleted');
     });
-    it('should transfer the invoice ', () => {
-        cy.typeSearchbar('T1111111{enter}');
+
+    it('should book the invoice', () => {
         cy.dataCy('descriptor-more-opts').click();
-        cy.get('.q-menu > .q-list > :nth-child(1)').click();
-        cy.fillInForm(transferInvoice);
-        cy.get('.q-mt-lg > .q-btn').click();
-        cy.checkNotification('Transferred invoice');
+        cy.get(selectMenuOption(5)).click();
+        cy.dataCy('VnConfirm_confirm').click();
+        cy.checkNotification('InvoiceOut booked');
+    });
+
+    it('should generate the invoice PDF', () => {
+        cy.dataCy('descriptor-more-opts').click();
+        cy.get(selectMenuOption(6)).click();
+        cy.dataCy('VnConfirm_confirm').click();
+        cy.checkNotification('The invoice PDF document has been regenerated');
+    });
+
+    it('should refund the invoice ', () => {
+        cy.dataCy('descriptor-more-opts').click();
+        cy.get(selectMenuOption(7)).click();
+        cy.get('#q-portal--menu--3 > .q-menu > .q-list > :nth-child(2)').click();
+        cy.checkNotification('The following refund ticket have been created');
     });
 });