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'); }); });