From 658bd015caa50faaa47cca00c0f3767de21f5e5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Andr=C3=A9s?= <carlosap@verdnatura.es> Date: Fri, 14 Feb 2025 12:41:11 +0100 Subject: [PATCH 01/59] feat: refs #8529 invoiceIn move deductible field from head to lines --- .../InvoiceIn/Card/InvoiceInBasicData.vue | 28 ++++--------------- src/pages/InvoiceIn/Card/InvoiceInSummary.vue | 4 --- src/pages/InvoiceIn/Card/InvoiceInVat.vue | 15 ++++++++++ 3 files changed, 20 insertions(+), 27 deletions(-) diff --git a/src/pages/InvoiceIn/Card/InvoiceInBasicData.vue b/src/pages/InvoiceIn/Card/InvoiceInBasicData.vue index 905ddebb2..9fe365a38 100644 --- a/src/pages/InvoiceIn/Card/InvoiceInBasicData.vue +++ b/src/pages/InvoiceIn/Card/InvoiceInBasicData.vue @@ -143,20 +143,12 @@ function deleteFile(dmsFk) { </VnRow> <VnRow> <VnSelect - :label="t('Undeductible VAT')" - v-model="data.deductibleExpenseFk" - :options="expenses" + :label="t('invoiceIn.summary.sage')" + v-model="data.withholdingSageFk" + :options="sageWithholdings" option-value="id" - option-label="id" - :filter-options="['id', 'name']" - data-cy="UnDeductibleVatSelect" - > - <template #option="scope"> - <QItem v-bind="scope.itemProps"> - {{ `${scope.opt.id}: ${scope.opt.name}` }} - </QItem> - </template> - </VnSelect> + option-label="withholding" + /> <div class="row no-wrap"> <VnInput @@ -253,15 +245,6 @@ function deleteFile(dmsFk) { option-label="code" /> </VnRow> - <VnRow> - <VnSelect - :label="t('invoiceIn.summary.sage')" - v-model="data.withholdingSageFk" - :options="sageWithholdings" - option-value="id" - option-label="withholding" - /> - </VnRow> </template> </FormModel> <QDialog v-model="documentDialogRef.show"> @@ -313,7 +296,6 @@ function deleteFile(dmsFk) { supplierFk: Proveedor Expedition date: Fecha expedición Operation date: Fecha operación - Undeductible VAT: Iva no deducible Document: Documento Download file: Descargar archivo Entry date: Fecha asiento diff --git a/src/pages/InvoiceIn/Card/InvoiceInSummary.vue b/src/pages/InvoiceIn/Card/InvoiceInSummary.vue index d358601d3..f2393a56d 100644 --- a/src/pages/InvoiceIn/Card/InvoiceInSummary.vue +++ b/src/pages/InvoiceIn/Card/InvoiceInSummary.vue @@ -272,10 +272,6 @@ const getLink = (param) => `#/invoice-in/${entityId.value}/${param}`; :label="t('invoiceIn.summary.sage')" :value="entity.sageWithholding?.withholding" /> - <VnLv - :label="t('invoiceIn.summary.vat')" - :value="entity.expenseDeductible?.name" - /> <VnLv :label="t('invoiceIn.card.company')" :value="entity.company?.code" diff --git a/src/pages/InvoiceIn/Card/InvoiceInVat.vue b/src/pages/InvoiceIn/Card/InvoiceInVat.vue index e77453bc0..e3ed617c6 100644 --- a/src/pages/InvoiceIn/Card/InvoiceInVat.vue +++ b/src/pages/InvoiceIn/Card/InvoiceInVat.vue @@ -53,6 +53,13 @@ const columns = computed(() => [ sortable: true, align: 'left', }, + { + name: 'isDeductible', + label: t('Deductible'), + field: (row) => row.isDeductible, + model: 'isDeductible', + align: 'center', + }, { name: 'sageiva', label: t('Sage iva'), @@ -119,6 +126,7 @@ const filter = { 'foreignValue', 'taxTypeSageFk', 'transactionTypeSageFk', + 'isDeductible', ], where: { invoiceInFk: route.params.id, @@ -227,6 +235,11 @@ function setCursor(ref) { </VnSelectDialog> </QTd> </template> + <template #body-cell-isDeductible="{ row }"> + <QTd align="center"> + <QCheckbox v-model="row.isDeductible" /> + </QTd> + </template> <template #body-cell-taxablebase="{ row }"> <QTd shrink> <VnInputNumber @@ -321,6 +334,7 @@ function setCursor(ref) { </QTd> <QTd /> <QTd /> + <QTd /> <QTd> {{ toCurrency(taxRateTotal) }} </QTd> @@ -491,6 +505,7 @@ es: Create a new expense: Crear nuevo gasto Add tax: Crear gasto Taxable base: Base imp. + Deductible: Deducible Sage tax: Sage iva Sage transaction: Sage transacción Rate: Tasa From 0e48701bc709fdb7a11ae34323ce429bef561330 Mon Sep 17 00:00:00 2001 From: benjaminedc <benjaminedc@verdnatura.es> Date: Fri, 28 Feb 2025 11:36:24 +0100 Subject: [PATCH 02/59] feat: refs #8118 add VnDropdown component and integrate it into Claim and Ticket summaries --- src/components/common/VnDropdown.vue | 60 +++++++++++++++++++++++++ src/pages/Claim/Card/ClaimSummary.vue | 49 +++++++------------- src/pages/Ticket/Card/TicketSummary.vue | 30 ++++--------- 3 files changed, 86 insertions(+), 53 deletions(-) create mode 100644 src/components/common/VnDropdown.vue diff --git a/src/components/common/VnDropdown.vue b/src/components/common/VnDropdown.vue new file mode 100644 index 000000000..63d6b96f6 --- /dev/null +++ b/src/components/common/VnDropdown.vue @@ -0,0 +1,60 @@ +<script setup> +import { ref } from 'vue'; +import VnSelect from './VnSelect.vue'; + +const stateBtnDropdownRef = ref(); + +const emit = defineEmits(['changeState']); + +const $props = defineProps({ + disable: { + type: Boolean, + default: null, + }, + moduleName: { + type: String, + default: null, + }, + options: { + type: Array, + default: null, + }, +}); + +async function changeState(value) { + stateBtnDropdownRef.value?.hide(); + emit('changeState', value); +} +</script> + +<template> + <QBtnDropdown + ref="stateBtnDropdownRef" + color="black" + text-color="white" + :label="$t('globals.changeState')" + :disable="$props.disable" + > + <VnSelect + :options="$props.options" + hide-selected + option-value="code" + hide-dropdown-icon + focus-on-mount + @update:model-value="changeState" + > + <template #option="scope"> + <QItem v-bind="scope.itemProps"> + <QItemSection> + <QItemLabel v-if="$props.moduleName === 'Ticket'"> + {{ scope.opt?.name }} + </QItemLabel> + <QItemLabel v-if="$props.moduleName === 'Claim'"> + {{ scope.opt?.description }} + </QItemLabel> + </QItemSection> + </QItem> + </template> + </VnSelect> + </QBtnDropdown> +</template> diff --git a/src/pages/Claim/Card/ClaimSummary.vue b/src/pages/Claim/Card/ClaimSummary.vue index 210b0c982..b0476716b 100644 --- a/src/pages/Claim/Card/ClaimSummary.vue +++ b/src/pages/Claim/Card/ClaimSummary.vue @@ -1,6 +1,6 @@ <script setup> import axios from 'axios'; -import { ref, computed } from 'vue'; +import { ref, computed, onMounted } from 'vue'; import { useRoute, useRouter } from 'vue-router'; import { useI18n } from 'vue-i18n'; import { toDate, toCurrency } from 'src/filters'; @@ -20,6 +20,7 @@ import ItemDescriptorProxy from 'src/pages/Item/Card/ItemDescriptorProxy.vue'; import CustomerDescriptorProxy from 'src/pages/Customer/Card/CustomerDescriptorProxy.vue'; import WorkerDescriptorProxy from 'src/pages/Worker/Card/WorkerDescriptorProxy.vue'; import ClaimDescriptorMenu from './ClaimDescriptorMenu.vue'; +import VnDropdown from 'src/components/common/VnDropdown.vue'; const route = useRoute(); const router = useRouter(); @@ -35,7 +36,7 @@ const $props = defineProps({ }); const entityId = computed(() => $props.id || route.params.id); -const ClaimStates = ref([]); +const claimStates = ref([]); const claimDmsRef = ref(); const claimDms = ref([]); const multimediaDialog = ref(); @@ -172,13 +173,21 @@ function openDialog(dmsId) { } async function changeState(value) { - await axios.patch(`Claims/updateClaim/${entityId.value}`, { claimStateFk: value }); + const newState = claimStates.value.find((state) => state.code == value); + await axios.patch(`Claims/updateClaim/${entityId.value}`, { + claimStateFk: newState.id, + }); router.go(route.fullPath); } function claimUrl(section) { return '#/claim/' + entityId.value + '/' + section; } + +onMounted(async () => { + const { data } = await axios.get('ClaimStates'); + claimStates.value = data; +}); </script> <template> @@ -188,7 +197,6 @@ function claimUrl(section) { @on-fetch="(data) => setClaimDms(data)" ref="claimDmsRef" /> - <FetchData url="ClaimStates" @on-fetch="(data) => (ClaimStates = data)" auto-load /> <CardSummary ref="summary" :url="`Claims/${entityId}/getSummary`" @@ -200,34 +208,11 @@ function claimUrl(section) { {{ claim.id }} - {{ claim.client.name }} ({{ claim.client.id }}) </template> <template #header-right> - <QBtnDropdown - side - top - color="black" - text-color="white" - :label="t('globals.changeState')" - > - <QList> - <QVirtualScroll - class="max-container-height" - :items="ClaimStates" - separator - v-slot="{ item, index }" - > - <QItem - :key="index" - dense - clickable - v-close-popup - @click="changeState(item.id)" - > - <QItemSection> - <QItemLabel>{{ item.description }}</QItemLabel> - </QItemSection> - </QItem> - </QVirtualScroll> - </QList> - </QBtnDropdown> + <VnDropdown + :moduleName="route.meta.moduleName" + :options="claimStates" + @change-state="changeState($event)" + /> </template> <template #menu="{ entity }"> <ClaimDescriptorMenu :claim="entity.claim" /> diff --git a/src/pages/Ticket/Card/TicketSummary.vue b/src/pages/Ticket/Card/TicketSummary.vue index 5838efa88..a575d66e7 100644 --- a/src/pages/Ticket/Card/TicketSummary.vue +++ b/src/pages/Ticket/Card/TicketSummary.vue @@ -21,6 +21,7 @@ import VnSelect from 'src/components/common/VnSelect.vue'; import VnToSummary from 'src/components/ui/VnToSummary.vue'; import TicketDescriptorMenu from './TicketDescriptorMenu.vue'; import TicketProblems from 'src/components/TicketProblems.vue'; +import VnDropdown from 'src/components/common/VnDropdown.vue'; const route = useRoute(); const { notify } = useNotify(); @@ -40,7 +41,7 @@ const ticket = computed(() => summary.value?.entity); const editableStates = ref([]); const ticketUrl = ref(); const grafanaUrl = 'https://grafana.verdnatura.es'; -const stateBtnDropdownRef = ref(); + const descriptorData = useArrayData('Ticket'); onMounted(async () => { @@ -67,7 +68,6 @@ function isEditable() { } async function changeState(value) { - stateBtnDropdownRef.value?.hide(); const formData = { ticketFk: entityId.value, code: value, @@ -113,25 +113,13 @@ onMounted(async () => { </div> </template> <template #header-right> - <div> - <QBtnDropdown - ref="stateBtnDropdownRef" - color="black" - text-color="white" - :label="t('globals.changeState')" - :disable="!isEditable()" - > - <VnSelect - :options="editableStates" - hide-selected - option-label="name" - option-value="code" - hide-dropdown-icon - focus-on-mount - @update:model-value="changeState" - /> - </QBtnDropdown> - </div> + <VnDropdown + :moduleName="route.meta.moduleName" + :moduleId="entityId" + :options="editableStates" + :disable="!isEditable()" + @change-state="changeState($event)" + /> </template> <template #menu="{ entity }"> <TicketDescriptorMenu :ticket="entity" /> From 0bfb1344dc5f5d104bb5c9d6ac806c0ab8bb27b3 Mon Sep 17 00:00:00 2001 From: Jon <jon@verdnatura.es> Date: Fri, 28 Feb 2025 12:03:23 +0100 Subject: [PATCH 03/59] feat: refs #8326 wip added new style --- src/components/ui/VnLv.vue | 3 +- src/css/app.scss | 23 ++ src/pages/InvoiceIn/Card/InvoiceInSummary.vue | 205 ++++++++-------- src/pages/Order/Card/OrderSummary.vue | 114 ++++----- src/pages/Ticket/Card/TicketSummary.vue | 224 +++++++++--------- src/pages/Travel/Card/TravelSummary.vue | 126 +++++----- src/pages/Worker/Card/WorkerSummary.vue | 147 ++++++------ src/pages/Zone/Card/ZoneSummary.vue | 35 ++- 8 files changed, 461 insertions(+), 416 deletions(-) diff --git a/src/components/ui/VnLv.vue b/src/components/ui/VnLv.vue index a198c9c05..93c2b9963 100644 --- a/src/components/ui/VnLv.vue +++ b/src/components/ui/VnLv.vue @@ -35,6 +35,7 @@ const val = computed(() => $props.value); :label="label" disable dense + size="sm" /> <template v-else> <div v-if="label || $slots.label" class="label"> @@ -44,7 +45,7 @@ const val = computed(() => $props.value); </div> <div class="value"> <slot name="value"> - <span :title="value"> + <span :title="value" style="text-overflow: ellipsis"> {{ dash ? dashIfEmpty(value) : value }} </span> </slot> diff --git a/src/css/app.scss b/src/css/app.scss index 994ae7ff1..97097cebf 100644 --- a/src/css/app.scss +++ b/src/css/app.scss @@ -339,3 +339,26 @@ input::-webkit-inner-spin-button { .containerShrinked { width: 80%; } + +.vn-card-group { + display: flex; + flex-direction: column; +} + +.vn-card-content { + display: flex; + flex-direction: column; + text-overflow: ellipsis; + > div { + max-height: 80px; + } +} + +@media (min-width: 1010px) { + .vn-card-group { + flex-direction: row; + } + .vn-card-content { + flex: 1; + } +} diff --git a/src/pages/InvoiceIn/Card/InvoiceInSummary.vue b/src/pages/InvoiceIn/Card/InvoiceInSummary.vue index d358601d3..3515e3bce 100644 --- a/src/pages/InvoiceIn/Card/InvoiceInSummary.vue +++ b/src/pages/InvoiceIn/Card/InvoiceInSummary.vue @@ -205,113 +205,106 @@ const getLink = (param) => `#/invoice-in/${entityId.value}/${param}`; <InvoiceInDescriptorMenu :invoice="entity" /> </template> <template #body="{ entity }"> - <!--Basic Data--> - <QCard class="vn-one"> - <QCardSection class="q-pa-none"> - <VnTitle - :url="getLink('basic-data')" - :text="t('globals.pageTitles.basicData')" - /> - </QCardSection> - <VnLv - :label="t('invoiceIn.list.supplier')" - :value="entity.supplier?.name" - > - <template #value> - <span class="link"> - {{ entity.supplier?.name }} - <SupplierDescriptorProxy :id="entity.supplierFk" /> - </span> - </template> - </VnLv> - <VnLv :label="t('invoiceIn.supplierRef')" :value="entity.supplierRef" /> - <VnLv - :label="t('invoiceIn.summary.currency')" - :value="entity.currency?.code" + <QCard class="max-width"> + <VnTitle + :url="getLink('basic-data')" + :text="t('globals.pageTitles.basicData')" /> - <VnLv :label="t('invoiceIn.serial')" :value="`${entity.serial}`" /> - <VnLv - :label="t('globals.country')" - :value="entity.supplier?.country?.code" - /> - </QCard> - <QCard class="vn-one"> - <QCardSection class="q-pa-none"> - <VnTitle - :url="getLink('basic-data')" - :text="t('globals.pageTitles.basicData')" - /> - </QCardSection> - <VnLv - :ellipsis-value="false" - :label="t('invoiceIn.summary.issued')" - :value="toDate(entity.issued)" - /> - <VnLv - :label="t('invoiceIn.summary.operated')" - :value="toDate(entity.operated)" - /> - <VnLv - :label="t('invoiceIn.summary.bookEntried')" - :value="toDate(entity.bookEntried)" - /> - <VnLv - :label="t('invoiceIn.summary.bookedDate')" - :value="toDate(entity.booked)" - /> - <VnLv :label="t('globals.isVies')" :value="entity.supplier?.isVies" /> - </QCard> - <QCard class="vn-one"> - <QCardSection class="q-pa-none"> - <VnTitle - :url="getLink('basic-data')" - :text="t('globals.pageTitles.basicData')" - /> - </QCardSection> - <VnLv - :label="t('invoiceIn.summary.sage')" - :value="entity.sageWithholding?.withholding" - /> - <VnLv - :label="t('invoiceIn.summary.vat')" - :value="entity.expenseDeductible?.name" - /> - <VnLv - :label="t('invoiceIn.card.company')" - :value="entity.company?.code" - /> - <VnLv :label="t('invoiceIn.isBooked')" :value="invoiceIn?.isBooked" /> - </QCard> - <QCard class="vn-one"> - <QCardSection class="q-pa-none"> - <VnTitle - :url="getLink('basic-data')" - :text="t('globals.pageTitles.basicData')" - /> - </QCardSection> - <QCardSection class="q-pa-none"> - <VnLv - :label="t('invoiceIn.summary.taxableBase')" - :value="toCurrency(entity.totals.totalTaxableBase)" - /> - <VnLv label="Total" :value="toCurrency(entity.totals.totalVat)" /> - <VnLv :label="t('invoiceIn.summary.dueTotal')"> - <template #value> - <QChip - dense - class="q-pa-xs" - :color="amountsNotMatch ? 'negative' : 'transparent'" - :title=" - amountsNotMatch - ? t('invoiceIn.summary.noMatch') - : t('invoiceIn.summary.dueTotal') - " - > - {{ toCurrency(entity.totals.totalDueDay) }} - </QChip> - </template> - </VnLv> - </QCardSection> + <div class="vn-card-group"> + <div class="vn-card-content"> + <VnLv + :label="t('invoiceIn.list.supplier')" + :value="entity.supplier?.name" + > + <template #value> + <span class="link"> + {{ entity.supplier?.name }} + <SupplierDescriptorProxy :id="entity.supplierFk" /> + </span> + </template> + </VnLv> + <VnLv + :label="t('invoiceIn.supplierRef')" + :value="entity.supplierRef" + /> + <VnLv + :label="t('invoiceIn.summary.currency')" + :value="entity.currency?.code" + /> + <VnLv + :label="t('invoiceIn.serial')" + :value="`${entity.serial}`" + /> + <VnLv + :label="t('globals.country')" + :value="entity.supplier?.country?.code" + /> + </div> + <div class="vn-card-content"> + <VnLv + :ellipsis-value="false" + :label="t('invoiceIn.summary.issued')" + :value="toDate(entity.issued)" + /> + <VnLv + :label="t('invoiceIn.summary.operated')" + :value="toDate(entity.operated)" + /> + <VnLv + :label="t('invoiceIn.summary.bookEntried')" + :value="toDate(entity.bookEntried)" + /> + <VnLv + :label="t('invoiceIn.summary.bookedDate')" + :value="toDate(entity.booked)" + /> + <VnLv + :label="t('globals.isVies')" + :value="entity.supplier?.isVies" + /> + </div> + <div class="vn-card-content"> + <VnLv + :label="t('invoiceIn.summary.sage')" + :value="entity.sageWithholding?.withholding" + /> + <VnLv + :label="t('invoiceIn.summary.vat')" + :value="entity.expenseDeductible?.name" + /> + <VnLv + :label="t('invoiceIn.card.company')" + :value="entity.company?.code" + /> + <VnLv + :label="t('invoiceIn.isBooked')" + :value="invoiceIn?.isBooked" + /> + </div> + <div class="vn-card-content"> + <VnLv + :label="t('invoiceIn.summary.taxableBase')" + :value="toCurrency(entity.totals.totalTaxableBase)" + /> + <VnLv label="Total" :value="toCurrency(entity.totals.totalVat)" /> + <VnLv :label="t('invoiceIn.summary.dueTotal')"> + <template #value> + <QChip + dense + class="q-pa-xs" + :color="amountsNotMatch ? 'negative' : 'transparent'" + :title=" + amountsNotMatch + ? t('invoiceIn.summary.noMatch') + : t('invoiceIn.summary.dueTotal') + " + > + {{ toCurrency(entity.totals.totalDueDay) }} + </QChip> + </template> + </VnLv> + </div> + </div> </QCard> <!--Vat--> <QCard v-if="entity.invoiceInTax.length" class="vat"> diff --git a/src/pages/Order/Card/OrderSummary.vue b/src/pages/Order/Card/OrderSummary.vue index a4bdb2881..55c309cf5 100644 --- a/src/pages/Order/Card/OrderSummary.vue +++ b/src/pages/Order/Card/OrderSummary.vue @@ -96,67 +96,67 @@ async function handleConfirm() { <OrderDescriptorMenu :order="entity" /> </template> <template #body="{ entity }"> - <QCard class="vn-one"> + <QCard class="vn-two"> <VnTitle :url="`#/order/${entity.id}/basic-data`" :text="t('globals.pageTitles.basicData')" /> - <VnLv label="ID" :value="entity.id" /> - <VnLv :label="t('globals.alias')" dash> - <template #value> - <span class="link"> - {{ dashIfEmpty(entity?.address?.nickname) }} - <CustomerDescriptorProxy :id="entity?.clientFk" /> - </span> - </template> - </VnLv> - <VnLv - :label="t('globals.company')" - :value="entity?.address?.companyFk" - /> - <VnLv - :label="t('globals.confirmed')" - :value="Boolean(entity?.isConfirmed)" - /> - </QCard> - <QCard class="vn-one"> - <VnTitle - :url="`#/order/${entity.id}/basic-data`" - :text="t('globals.pageTitles.basicData')" - /> - <VnLv - :label="t('order.summary.created')" - :value="toDateHourMinSec(entity?.created)" - /> - <VnLv - :label="t('globals.confirmed')" - :value="toDateHourMinSec(entity?.confirmed)" - /> - <VnLv - :label="t('globals.landed')" - :value="toDateHourMinSec(entity?.landed)" - /> - <VnLv :label="t('globals.phone')"> - <template #value> - {{ dashIfEmpty(entity?.address?.phone) }} - <a - v-if="entity?.address?.phone" - :href="`tel:${entity?.address?.phone}`" - class="text-primary" - > - <QIcon name="phone" /> - </a> - </template> - </VnLv> - <VnLv - :label="t('order.summary.createdFrom')" - :value="entity?.sourceApp" - /> - <VnLv - :label="t('order.summary.address')" - :value="`${entity?.address?.street} - ${entity?.address?.city} (${entity?.address?.province?.name})`" - class="order-summary-address" - /> + <div class="vn-card-group"> + <div class="vn-card-content"> + <VnLv label="ID" :value="entity.id" /> + <VnLv :label="t('globals.alias')" dash> + <template #value> + <span class="link"> + {{ dashIfEmpty(entity?.address?.nickname) }} + <CustomerDescriptorProxy :id="entity?.clientFk" /> + </span> + </template> + </VnLv> + <VnLv + :label="t('globals.company')" + :value="entity?.address?.companyFk" + /> + <VnLv + :label="t('globals.confirmed')" + :value="Boolean(entity?.isConfirmed)" + /> + </div> + <div class="vn-card-content"> + <VnLv + :label="t('order.summary.created')" + :value="toDateHourMinSec(entity?.created)" + /> + <VnLv + :label="t('globals.confirmed')" + :value="toDateHourMinSec(entity?.confirmed)" + /> + <VnLv + :label="t('globals.landed')" + :value="toDateHourMinSec(entity?.landed)" + /> + <VnLv :label="t('globals.phone')"> + <template #value> + {{ dashIfEmpty(entity?.address?.phone) }} + <a + v-if="entity?.address?.phone" + :href="`tel:${entity?.address?.phone}`" + class="text-primary" + > + <QIcon name="phone" /> + </a> + </template> + </VnLv> + <VnLv + :label="t('order.summary.createdFrom')" + :value="entity?.sourceApp" + /> + <VnLv + :label="t('order.summary.address')" + :value="`${entity?.address?.street} - ${entity?.address?.city} (${entity?.address?.province?.name})`" + class="order-summary-address" + /> + </div> + </div> </QCard> <QCard class="vn-one"> <VnTitle :text="t('globals.pageTitles.notes')" /> diff --git a/src/pages/Ticket/Card/TicketSummary.vue b/src/pages/Ticket/Card/TicketSummary.vue index 5838efa88..52454ccf1 100644 --- a/src/pages/Ticket/Card/TicketSummary.vue +++ b/src/pages/Ticket/Card/TicketSummary.vue @@ -137,118 +137,130 @@ onMounted(async () => { <TicketDescriptorMenu :ticket="entity" /> </template> <template #body="{ entity }"> - <QCard class="vn-one"> + <QCard class="vn-two"> <VnTitle :url="toTicketUrl('basic-data')" :text="t('globals.summary.basicData')" /> - <VnLv v-if="entity.ticketState" :label="t('globals.state')"> - <template #value> - <QBadge - text-color="black" - :color="entity.ticketState.state.classColor" - > - {{ entity.ticketState.state.name }} - </QBadge> - </template> - </VnLv> - <VnLv :label="t('globals.salesPerson')"> - <template #value> - <VnUserLink - :name="entity.client?.salesPersonUser?.name" - :worker-id="entity.client?.salesPersonFk" + <div class="vn-card-group"> + <div class="vn-card-content"> + <VnLv v-if="entity.ticketState" :label="t('globals.state')"> + <template #value> + <QBadge + text-color="black" + :color="entity.ticketState.state.classColor" + > + {{ entity.ticketState.state.name }} + </QBadge> + </template> + </VnLv> + <VnLv :label="t('globals.salesPerson')"> + <template #value> + <VnUserLink + :name="entity.client?.salesPersonUser?.name" + :worker-id="entity.client?.salesPersonFk" + /> + </template> + </VnLv> + <VnLv + :label="t('globals.agency')" + :value="entity.agencyMode?.name" /> - </template> - </VnLv> - <VnLv :label="t('globals.agency')" :value="entity.agencyMode?.name" /> - <VnLv :label="t('ticket.summary.zone')"> - <template #value> - <span class="link" @click.stop> - {{ entity?.zone?.name }} - <ZoneDescriptorProxy :id="entity.zoneFk" /> - </span> - </template> - </VnLv> - <VnLv :label="t('globals.warehouse')" :value="entity.warehouse?.name" /> - <VnLv - v-if="ticket?.ticketCollections?.length > 0" - :label="t('ticket.summary.collection')" - :value="ticket?.ticketCollections[0]?.collectionFk" - > - <template #value> - <a - :href="`${grafanaUrl}/d/d552ab74-85b4-4e7f-a279-fab7cd9c6124/control-de-expediciones?orgId=1&var-collectionFk=${entity.ticketCollections[0]?.collectionFk}`" - target="_blank" - class="grafana" + <VnLv :label="t('ticket.summary.zone')"> + <template #value> + <span class="link" @click.stop> + {{ entity?.zone?.name }} + <ZoneDescriptorProxy :id="entity.zoneFk" /> + </span> + </template> + </VnLv> + <VnLv + :label="t('globals.warehouse')" + :value="entity.warehouse?.name" + /> + <VnLv + v-if="ticket?.ticketCollections?.length > 0" + :label="t('ticket.summary.collection')" + :value="ticket?.ticketCollections[0]?.collectionFk" > - {{ entity.ticketCollections[0]?.collectionFk }} - </a> - </template> - </VnLv> - <VnLv :label="t('ticket.summary.route')"> - <template #value> - <span class="link"> - {{ entity.routeFk }} - <RouteDescriptorProxy :id="entity.routeFk" /> - </span> - </template> - </VnLv> - <VnLv :label="t('ticket.summary.invoice')"> - <template #value> - <span :class="{ link: entity.refFk }"> - {{ dashIfEmpty(entity.refFk) }} - <InvoiceOutDescriptorProxy - :id="entity.invoiceOut.id" - v-if="entity.refFk" - /> - </span> - </template> - </VnLv> - <VnLv :label="t('globals.weight')" :value="dashIfEmpty(entity.weight)" /> - </QCard> - <QCard class="vn-one"> - <VnTitle - :url="toTicketUrl('basic-data')" - :text="t('globals.summary.basicData')" - /> - <VnLv - :label="t('ticket.summary.shipped')" - :value="toDate(entity.shipped)" - /> - <VnLv :label="t('globals.landed')" :value="toDate(entity.landed)" /> - <VnLv :label="t('globals.packages')" :value="entity.packages" /> - <VnLv :value="entity.address.phone"> - <template #label> - {{ t('ticket.summary.consigneePhone') }} - <VnLinkPhone :phone-number="entity.address.phone" /> - </template> - </VnLv> - <VnLv :value="entity.address.mobile"> - <template #label> - {{ t('ticket.summary.consigneeMobile') }} - <VnLinkPhone :phone-number="entity.address.mobile" /> - </template> - </VnLv> - <VnLv :value="entity.client.phone"> - <template #label> - {{ t('ticket.summary.clientPhone') }} - <VnLinkPhone :phone-number="entity.client.phone" /> - </template> - </VnLv> - <VnLv :value="entity.client.mobile"> - <template #label> - {{ t('ticket.summary.clientMobile') }} - <VnLinkPhone :phone-number="entity.client.mobile" /> - </template> - </VnLv> - <VnLv - :label="t('ticket.summary.consignee')" - :value="`${entity.address?.nickname} #${entity.address?.id}`" - /> - <VnLv - :label="t('ticket.summary.consigneeStreet')" - :value="formattedAddress" - /> + <template #value> + <a + :href="`${grafanaUrl}/d/d552ab74-85b4-4e7f-a279-fab7cd9c6124/control-de-expediciones?orgId=1&var-collectionFk=${entity.ticketCollections[0]?.collectionFk}`" + target="_blank" + class="grafana" + > + {{ entity.ticketCollections[0]?.collectionFk }} + </a> + </template> + </VnLv> + <VnLv :label="t('ticket.summary.route')"> + <template #value> + <span class="link"> + {{ entity.routeFk }} + <RouteDescriptorProxy :id="entity.routeFk" /> + </span> + </template> + </VnLv> + <VnLv :label="t('ticket.summary.invoice')"> + <template #value> + <span :class="{ link: entity.refFk }"> + {{ dashIfEmpty(entity.refFk) }} + <InvoiceOutDescriptorProxy + :id="entity.invoiceOut.id" + v-if="entity.refFk" + /> + </span> + </template> + </VnLv> + <VnLv + :label="t('globals.weight')" + :value="dashIfEmpty(entity.weight)" + /> + </div> + <div class="vn-card-content"> + <VnLv + :label="t('ticket.summary.shipped')" + :value="toDate(entity.shipped)" + /> + <VnLv + :label="t('globals.landed')" + :value="toDate(entity.landed)" + /> + <VnLv :label="t('globals.packages')" :value="entity.packages" /> + <VnLv :value="entity.address.phone"> + <template #label> + {{ t('ticket.summary.consigneePhone') }} + <VnLinkPhone :phone-number="entity.address.phone" /> + </template> + </VnLv> + <VnLv :value="entity.address.mobile"> + <template #label> + {{ t('ticket.summary.consigneeMobile') }} + <VnLinkPhone :phone-number="entity.address.mobile" /> + </template> + </VnLv> + <VnLv :value="entity.client.phone"> + <template #label> + {{ t('ticket.summary.clientPhone') }} + <VnLinkPhone :phone-number="entity.client.phone" /> + </template> + </VnLv> + <VnLv :value="entity.client.mobile"> + <template #label> + {{ t('ticket.summary.clientMobile') }} + <VnLinkPhone :phone-number="entity.client.mobile" /> + </template> + </VnLv> + <VnLv + :label="t('ticket.summary.consignee')" + :value="`${entity.address?.nickname} #${entity.address?.id}`" + /> + <VnLv + :label="t('ticket.summary.consigneeStreet')" + :value="formattedAddress" + /> + </div> + </div> </QCard> <QCard class="vn-one" v-if="entity.notes.length"> <VnTitle diff --git a/src/pages/Travel/Card/TravelSummary.vue b/src/pages/Travel/Card/TravelSummary.vue index 9f9552611..68af36474 100644 --- a/src/pages/Travel/Card/TravelSummary.vue +++ b/src/pages/Travel/Card/TravelSummary.vue @@ -275,72 +275,68 @@ const getLink = (param) => `#/travel/${entityId.value}/${param}`; <TravelDescriptorMenuItems :travel="entity" /> </template> <template #body> - <QCard class="vn-one"> - <QCardSection class="q-pa-none"> - <VnTitle - :url="getLink('basic-data')" - :text="t('globals.pageTitles.basicData')" - /> - </QCardSection> - <VnLv :label="t('globals.shipped')" :value="toDate(travel.shipped)" /> - <VnLv - :label="t('globals.warehouseOut')" - :value="travel.warehouseOut?.name" - /> - <VnRow> - <QCheckbox - :label="t('travel.basicData.isRaid')" - v-model="travel.isRaid" - :disable="true" - /> - </VnRow> - <VnRow> - <QCheckbox - :label="t('travel.summary.delivered')" - v-model="travel.isDelivered" - :disable="true" - /> - </VnRow> - </QCard> - <QCard class="vn-one"> - <QCardSection class="q-pa-none"> - <VnTitle - :url="getLink('basic-data')" - :text="t('globals.pageTitles.basicData')" - /> - </QCardSection> - <VnLv :label="t('globals.landed')" :value="toDate(travel.landed)" /> - <VnLv - :label="t('globals.warehouseIn')" - :value="travel.warehouseIn?.name" - /> - <VnLv - :label="t('travel.basicData.daysInForward')" - :value="travel?.daysInForward" - /> - <QCheckbox - :label="t('travel.summary.received')" - v-model="travel.isReceived" - :disable="true" - /> - </QCard> - <QCard class="vn-one"> - <QCardSection class="q-pa-none"> - <VnTitle - :url="getLink('basic-data')" - :text="t('globals.pageTitles.basicData')" - /> - </QCardSection> - <VnLv :label="t('globals.agency')" :value="travel.agency?.name" /> - <VnLv :label="t('globals.reference')" :value="travel.ref" /> - <VnLv label="m³" :value="travel.m3" /> - <VnLv :label="t('globals.totalEntries')" :value="travel.totalEntries" /> - <VnLv - :label="t('travel.summary.availabled')" - :value=" - dashIfEmpty(toDateTimeFormat(travel.availabled)) - " + <QCard class="full-width"> + <VnTitle + :url="getLink('basic-data')" + :text="t('globals.pageTitles.basicData')" /> + <div class="vn-card-group"> + <div class="vn-card-content"> + <VnLv + :label="t('globals.shipped')" + :value="toDate(travel.shipped)" + /> + <VnLv + :label="t('globals.warehouseOut')" + :value="travel.warehouseOut?.name" + /> + <QCheckbox + :label="t('travel.basicData.isRaid')" + v-model="travel.isRaid" + :disable="true" + size="sm" + /> + <QCheckbox + :label="t('travel.summary.delivered')" + v-model="travel.isDelivered" + :disable="true" + size="sm" + /> + </div> + <div class="vn-card-content"> + <VnLv + :label="t('globals.landed')" + :value="toDate(travel.landed)" + /> + <VnLv + :label="t('globals.warehouseIn')" + :value="travel.warehouseIn?.name" + /> + <VnLv + :label="t('travel.basicData.daysInForward')" + :value="travel?.daysInForward" + /> + <QCheckbox + :label="t('travel.summary.received')" + v-model="travel.isReceived" + :disable="true" + size="sm" + /> + </div> + <div class="vn-card-content"> + <VnLv :label="t('globals.agency')" :value="travel.agency?.name" /> + <VnLv :label="t('globals.reference')" :value="travel.ref" /> + <VnLv label="m³" :value="travel.m3" /> + <VnLv + :label="t('globals.totalEntries')" + :value="travel.totalEntries" + /> + <VnLv + :label="t('travel.summary.availabled')" + :value="dashIfEmpty(toDateTimeFormat(travel.availabled))" + /> + </div> + </div> </QCard> <QCard class="full-width"> <VnTitle :text="t('travel.summary.entries')" /> diff --git a/src/pages/Worker/Card/WorkerSummary.vue b/src/pages/Worker/Card/WorkerSummary.vue index 78c5dfd82..1f7584389 100644 --- a/src/pages/Worker/Card/WorkerSummary.vue +++ b/src/pages/Worker/Card/WorkerSummary.vue @@ -47,77 +47,88 @@ onBeforeMount(async () => { <WorkerDescriptorMenu :worker="entity" :is-excluded="workerExcluded" /> </template> <template #body="{ entity: worker }"> - <QCard class="vn-one"> + <QCard class="vn-two"> <VnTitle :url="basicDataUrl" :text="t('globals.summary.basicData')" /> - <VnLv :label="t('globals.name')" :value="worker.user?.nickname" /> - <VnLv :label="t('worker.list.department')"> - <template #value> - <span class="link" v-text="worker.department?.department?.name" /> - <DepartmentDescriptorProxy - :id="worker.department?.department?.id" + <div class="vn-card-group"> + <div class="vn-card-content"> + <VnLv :label="t('globals.name')" :value="worker.user?.nickname" /> + <VnLv :label="t('worker.list.department')"> + <template #value> + <span + class="link" + v-text="worker.department?.department?.name" + /> + <DepartmentDescriptorProxy + :id="worker.department?.department?.id" + /> + </template> + </VnLv> + <VnLv :label="t('worker.summary.boss')" link> + <template #value> + <VnUserLink + v-if="worker.boss" + :name="dashIfEmpty(worker.boss?.name)" + :worker-id="worker.bossFk" + /> + </template> + </VnLv> + <VnLv :value="worker.mobileExtension"> + <template #label> + {{ t('worker.summary.phoneExtension') }} + <VnLinkPhone :phone-number="worker.mobileExtension" /> + </template> + </VnLv> + <VnLv :value="worker.phone"> + <template #label> + {{ t('worker.summary.entPhone') }} + <VnLinkPhone :phone-number="worker.phone" /> + </template> + </VnLv> + <VnLv :value="advancedSummary?.client?.phone"> + <template #label> + {{ t('worker.summary.personalPhone') }} + <VnLinkPhone + :phone-number="advancedSummary?.client?.phone" + /> + </template> + </VnLv> + </div> + <div class="vn-card-content"> + <VnLv + :label="t('worker.summary.fiDueDate')" + :value="toDate(advancedSummary.fiDueDate)" /> - </template> - </VnLv> - <VnLv :label="t('worker.summary.boss')" link> - <template #value> - <VnUserLink - v-if="worker.boss" - :name="dashIfEmpty(worker.boss?.name)" - :worker-id="worker.bossFk" + <VnLv :label="t('worker.summary.sex')" :value="worker.sex" /> + <VnLv + :label="t('worker.summary.seniority')" + :value="toDate(advancedSummary.seniority)" /> - </template> - </VnLv> - <VnLv :value="worker.mobileExtension"> - <template #label> - {{ t('worker.summary.phoneExtension') }} - <VnLinkPhone :phone-number="worker.mobileExtension" /> - </template> - </VnLv> - <VnLv :value="worker.phone"> - <template #label> - {{ t('worker.summary.entPhone') }} - <VnLinkPhone :phone-number="worker.phone" /> - </template> - </VnLv> - <VnLv :value="advancedSummary?.client?.phone"> - <template #label> - {{ t('worker.summary.personalPhone') }} - <VnLinkPhone :phone-number="advancedSummary?.client?.phone" /> - </template> - </VnLv> - </QCard> - <QCard class="vn-one" v-if="advancedSummary"> - <VnTitle :url="basicDataUrl" :text="t('globals.summary.basicData')" /> - <VnLv - :label="t('worker.summary.fiDueDate')" - :value="toDate(advancedSummary.fiDueDate)" - /> - <VnLv :label="t('worker.summary.sex')" :value="worker.sex" /> - <VnLv - :label="t('worker.summary.seniority')" - :value="toDate(advancedSummary.seniority)" - /> - <VnLv :label="t('worker.summary.fi')" :value="advancedSummary.fi" /> - <VnLv - :label="t('worker.summary.birth')" - :value="toDate(advancedSummary.birth)" - /> - <VnLv - :label="t('worker.summary.isFreelance')" - :value="advancedSummary.isFreelance" - /> - <VnLv - :label="t('worker.summary.isSsDiscounted')" - :value="advancedSummary.isSsDiscounted" - /> - <VnLv - :label="t('worker.summary.hasMachineryAuthorized')" - :value="advancedSummary.hasMachineryAuthorized" - /> - <VnLv - :label="t('worker.summary.isDisable')" - :value="advancedSummary.isDisable" - /> + <VnLv + :label="t('worker.summary.fi')" + :value="advancedSummary.fi" + /> + <VnLv + :label="t('worker.summary.birth')" + :value="toDate(advancedSummary.birth)" + /> + <VnLv + :label="t('worker.summary.isFreelance')" + :value="advancedSummary.isFreelance" + /> + <VnLv + :label="t('worker.summary.isSsDiscounted')" + :value="advancedSummary.isSsDiscounted" + /> + <VnLv + :label="t('worker.summary.hasMachineryAuthorized')" + :value="advancedSummary.hasMachineryAuthorized" + /> + <VnLv + :label="t('worker.summary.isDisable')" + :value="advancedSummary.isDisable" + /> + </div> + </div> </QCard> <QCard class="vn-one"> <VnTitle :text="t('worker.summary.userData')" /> diff --git a/src/pages/Zone/Card/ZoneSummary.vue b/src/pages/Zone/Card/ZoneSummary.vue index 5b29b495b..04ba14ce4 100644 --- a/src/pages/Zone/Card/ZoneSummary.vue +++ b/src/pages/Zone/Card/ZoneSummary.vue @@ -74,21 +74,30 @@ onMounted(async () => { <template #body="{ entity: zone }"> <QCard class="vn-one"> <VnTitle :url="zoneUrl + `basic-data`" :text="t('summary.basicData')" /> - <VnLv :label="t('list.agency')" :value="zone.agencyMode?.name" /> - <VnLv :label="t('list.price')" :value="toCurrency(zone.price)" /> - <VnLv :label="t('zone.bonus')" :value="toCurrency(zone.bonus)" /> + <div class="vn-card-group"> + <div class="vn-card-content"> + <VnLv :label="t('list.agency')" :value="zone.agencyMode?.name" /> + <VnLv :label="t('list.price')" :value="toCurrency(zone.price)" /> + <VnLv :label="t('zone.bonus')" :value="toCurrency(zone.bonus)" /> + </div> + <div class="vn-card-content"> + <VnLv + :label="t('summary.closeHour')" + :value="toTimeFormat(zone.hour)" + /> + <VnLv + :label="t('zone.travelingDays')" + :value="zone.travelingDays" + /> + <QCheckbox + :label="t('zone.volumetric')" + v-model="zone.isVolumetric" + :disable="true" + /> + </div> + </div> </QCard> <QCard class="vn-one"> - <VnTitle :url="zoneUrl + `basic-data`" :text="t('summary.basicData')" /> - <VnLv :label="t('summary.closeHour')" :value="toTimeFormat(zone.hour)" /> - <VnLv :label="t('zone.travelingDays')" :value="zone.travelingDays" /> - <QCheckbox - :label="t('zone.volumetric')" - v-model="zone.isVolumetric" - :disable="true" - /> - </QCard> - <QCard class="full-width"> <VnTitle :url="zoneUrl + `warehouses`" :text="t('list.warehouse')" /> <QTable :columns="columns" From a07afe3a94bc7e1911576a1fc6f2ce2bf7cdc4c6 Mon Sep 17 00:00:00 2001 From: benjaminedc <benjaminedc@verdnatura.es> Date: Fri, 28 Feb 2025 13:44:14 +0100 Subject: [PATCH 04/59] refactor: refs #8683 enhance sorting logic in VnSelect component --- src/components/common/VnSelect.vue | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/components/common/VnSelect.vue b/src/components/common/VnSelect.vue index d111780bd..eb387fe61 100644 --- a/src/components/common/VnSelect.vue +++ b/src/components/common/VnSelect.vue @@ -152,6 +152,10 @@ const value = computed({ }, }); +const computedSortBy = computed(() => { + return $props.sortBy || $props.optionLabel; +}); + watch(options, (newValue) => { setOptions(newValue); }); @@ -186,7 +190,7 @@ function findKeyInOptions() { } function setOptions(data) { - data = dataByOrder(data, $props.sortBy); + data = dataByOrder(data, computedSortBy.value); myOptions.value = JSON.parse(JSON.stringify(data)); myOptionsOriginal.value = JSON.parse(JSON.stringify(data)); emit('update:options', data); From 816a6197c72bd11b3e44a10d700569738491e937 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Andr=C3=A9s?= <carlosap@verdnatura.es> Date: Mon, 3 Mar 2025 18:05:19 +0100 Subject: [PATCH 05/59] feat: refs #8529 enhance InvoiceInVat component with data-cy attribute for isDeductible checkbox --- src/pages/InvoiceIn/Card/InvoiceInVat.vue | 5 ++++- .../invoiceIn/invoiceInBasicData.spec.js | 6 +----- .../invoiceIn/invoiceInDescriptor.spec.js | 4 ++-- .../integration/invoiceIn/invoiceInVat.spec.js | 13 ++++++++++++- 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/pages/InvoiceIn/Card/InvoiceInVat.vue b/src/pages/InvoiceIn/Card/InvoiceInVat.vue index 0f8f9a6c5..7077c9a59 100644 --- a/src/pages/InvoiceIn/Card/InvoiceInVat.vue +++ b/src/pages/InvoiceIn/Card/InvoiceInVat.vue @@ -237,7 +237,10 @@ function setCursor(ref) { </template> <template #body-cell-isDeductible="{ row }"> <QTd align="center"> - <QCheckbox v-model="row.isDeductible" /> + <QCheckbox + v-model="row.isDeductible" + data-cy="isDeductible_checkbox" + /> </QTd> </template> <template #body-cell-taxablebase="{ row }"> diff --git a/test/cypress/integration/invoiceIn/invoiceInBasicData.spec.js b/test/cypress/integration/invoiceIn/invoiceInBasicData.spec.js index 11ca1bb59..5b6836784 100644 --- a/test/cypress/integration/invoiceIn/invoiceInBasicData.spec.js +++ b/test/cypress/integration/invoiceIn/invoiceInBasicData.spec.js @@ -11,13 +11,9 @@ describe('InvoiceInBasicData', () => { }); it('should edit the provideer and supplier ref', () => { - cy.dataCy('UnDeductibleVatSelect').type('4751000000'); - cy.get('.q-menu .q-item').contains('4751000000').click(); - cy.get(resetBtn).click(); - cy.waitForElement('#formModel').within(() => { cy.dataCy('vnSupplierSelect').type('Bros nick'); - }) + }); cy.get('.q-menu .q-item').contains('Bros nick').click(); cy.saveCard(); cy.get(`${firstFormSelect} input`).invoke('val').should('eq', 'Bros nick'); diff --git a/test/cypress/integration/invoiceIn/invoiceInDescriptor.spec.js b/test/cypress/integration/invoiceIn/invoiceInDescriptor.spec.js index 97a9fe976..fed90c517 100644 --- a/test/cypress/integration/invoiceIn/invoiceInDescriptor.spec.js +++ b/test/cypress/integration/invoiceIn/invoiceInDescriptor.spec.js @@ -1,7 +1,7 @@ describe('InvoiceInDescriptor', () => { const book = '.summaryHeader > .no-wrap > .q-btn'; - const firstDescritorOpt = '.q-menu > .q-list > :nth-child(5) > .q-item__section'; - const checkbox = ':nth-child(5) > .q-checkbox'; + const firstDescritorOpt = '.q-menu > .q-list > :nth-child(4) > .q-item__section'; + const checkbox = ':nth-child(4) > .q-checkbox'; it('should booking and unbooking the invoice properly', () => { cy.viewport(1280, 720); diff --git a/test/cypress/integration/invoiceIn/invoiceInVat.spec.js b/test/cypress/integration/invoiceIn/invoiceInVat.spec.js index 1e7ce1003..2693ac410 100644 --- a/test/cypress/integration/invoiceIn/invoiceInVat.spec.js +++ b/test/cypress/integration/invoiceIn/invoiceInVat.spec.js @@ -1,7 +1,7 @@ /// <reference types="cypress" /> describe('InvoiceInVat', () => { const thirdRow = 'tbody > :nth-child(3)'; - const firstLineVat = 'tbody > :nth-child(1) > :nth-child(4)'; + const firstLineVat = 'tbody > :nth-child(1) '; const vats = '[data-cy="vat-sageiva"]'; const dialogInputs = '.q-dialog label input'; const addBtn = 'tbody tr:nth-child(1) td:nth-child(2) .--add-icon'; @@ -20,6 +20,17 @@ describe('InvoiceInVat', () => { cy.get(vats).eq(0).should('have.value', '8: H.P. IVA 21% CEE'); }); + it('should mark the line as deductible VAT', () => { + cy.get(`${firstLineVat} [data-cy="isDeductible_checkbox"]`).click(); + + cy.saveCard(); + + cy.get(`${firstLineVat} [data-cy="isDeductible_checkbox"]`) + + .click(); + cy.saveCard(); + }); + it('should add a new row', () => { cy.addRow(); cy.fillRow(thirdRow, [true, 2000000001, 30, 'H.P. IVA 10']); From d893505cd6bd660813ac867db0db61f9ac9f79a1 Mon Sep 17 00:00:00 2001 From: benjaminedc <benjaminedc@verdnatura.es> Date: Fri, 7 Mar 2025 09:14:18 +0100 Subject: [PATCH 06/59] fix: refs #8683 update fetchFilter to use computed sortBy value --- src/components/common/VnSelect.vue | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/common/VnSelect.vue b/src/components/common/VnSelect.vue index 37bb55ca4..9405baa4f 100644 --- a/src/components/common/VnSelect.vue +++ b/src/components/common/VnSelect.vue @@ -220,7 +220,8 @@ function filter(val, options) { async function fetchFilter(val) { if (!$props.url) return; - const { fields, include, sortBy, limit } = $props; + const { fields, include, limit } = $props; + const sortBy = computedSortBy.value; const key = optionFilterValue.value ?? (new RegExp(/\d/g).test(val) From 68af7a50fa7410cedb20b67b14e4faa21b7b5498 Mon Sep 17 00:00:00 2001 From: benjaminedc <benjaminedc@verdnatura.es> Date: Fri, 7 Mar 2025 11:59:22 +0100 Subject: [PATCH 07/59] fix: refs #8683 update computedSortBy to append ' ASC' to optionLabel --- src/components/common/VnSelect.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/common/VnSelect.vue b/src/components/common/VnSelect.vue index 9405baa4f..296a212e7 100644 --- a/src/components/common/VnSelect.vue +++ b/src/components/common/VnSelect.vue @@ -153,7 +153,7 @@ const value = computed({ }); const computedSortBy = computed(() => { - return $props.sortBy || $props.optionLabel; + return $props.sortBy || $props.optionLabel + ' ASC'; }); watch(options, (newValue) => { From 37f1882530043f0ddcdb4a73ad3e9facf2ef5c03 Mon Sep 17 00:00:00 2001 From: benjaminedc <benjaminedc@verdnatura.es> Date: Mon, 10 Mar 2025 13:55:36 +0100 Subject: [PATCH 08/59] test(UserPanel): refs #8683 update initial values and options in user selection --- test/cypress/integration/vnComponent/UserPanel.spec.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/cypress/integration/vnComponent/UserPanel.spec.js b/test/cypress/integration/vnComponent/UserPanel.spec.js index 25724e873..216797dfa 100644 --- a/test/cypress/integration/vnComponent/UserPanel.spec.js +++ b/test/cypress/integration/vnComponent/UserPanel.spec.js @@ -15,7 +15,7 @@ describe('UserPanel', () => { cy.openUserPanel(); // Compruebo la opcion inicial - cy.get(userWarehouse).should('have.value', 'VNL').click(); + cy.get(userWarehouse).should('have.value', 'ORN').click(); // Actualizo la opción cy.getOption(3); @@ -36,14 +36,14 @@ describe('UserPanel', () => { cy.openUserPanel(); // Compruebo la opcion inicial - cy.get(userCompany).should('have.value', 'Warehouse One').click(); + cy.get(userCompany).should('have.value', 'Inventory').click(); //Actualizo la opción - cy.getOption(2); + cy.getOption(3); //Compruebo la notificación cy.get('.q-notification').should('be.visible'); - cy.get(userCompany).should('have.value', 'Warehouse Two'); + cy.get(userCompany).should('have.value', 'TestingWarehouse'); //Restauro el valor cy.get(userCompany).click(); From 6a48ff93269fee8d7da4f557cf2399514035aea3 Mon Sep 17 00:00:00 2001 From: benjaminedc <benjaminedc@verdnatura.es> Date: Mon, 10 Mar 2025 14:14:22 +0100 Subject: [PATCH 09/59] test(UserPanel): refs #8683 update initial value in user selection --- test/cypress/integration/vnComponent/UserPanel.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/cypress/integration/vnComponent/UserPanel.spec.js b/test/cypress/integration/vnComponent/UserPanel.spec.js index 216797dfa..ec6774f58 100644 --- a/test/cypress/integration/vnComponent/UserPanel.spec.js +++ b/test/cypress/integration/vnComponent/UserPanel.spec.js @@ -36,7 +36,7 @@ describe('UserPanel', () => { cy.openUserPanel(); // Compruebo la opcion inicial - cy.get(userCompany).should('have.value', 'Inventory').click(); + cy.get(userCompany).should('have.value', 'Algemesi').click(); //Actualizo la opción cy.getOption(3); From 781c8050a88d7a757db7492e7419d1739e98baa6 Mon Sep 17 00:00:00 2001 From: Jon <jon@verdnatura.es> Date: Tue, 11 Mar 2025 11:56:50 +0100 Subject: [PATCH 10/59] refactor: refs #8326 modified sumaryDialog width --- src/pages/InvoiceIn/InvoiceInList.vue | 2 +- src/pages/Order/Card/OrderSummary.vue | 338 ++++++++++++------------ src/pages/Order/OrderList.vue | 2 +- src/pages/Ticket/TicketList.vue | 2 +- src/pages/Travel/Card/TravelSummary.vue | 18 +- src/pages/Travel/TravelList.vue | 2 +- src/pages/Worker/WorkerList.vue | 2 +- 7 files changed, 179 insertions(+), 187 deletions(-) diff --git a/src/pages/InvoiceIn/InvoiceInList.vue b/src/pages/InvoiceIn/InvoiceInList.vue index 0960d0d6c..9b62fdf6a 100644 --- a/src/pages/InvoiceIn/InvoiceInList.vue +++ b/src/pages/InvoiceIn/InvoiceInList.vue @@ -119,7 +119,7 @@ const cols = computed(() => [ icon: 'preview', type: 'submit', isPrimary: true, - action: (row) => viewSummary(row.id, InvoiceInSummary), + action: (row) => viewSummary(row.id, InvoiceInSummary, 'lg-width'), }, { title: t('globals.download'), diff --git a/src/pages/Order/Card/OrderSummary.vue b/src/pages/Order/Card/OrderSummary.vue index 55c309cf5..10a458bfb 100644 --- a/src/pages/Order/Card/OrderSummary.vue +++ b/src/pages/Order/Card/OrderSummary.vue @@ -71,180 +71,174 @@ async function handleConfirm() { </script> <template> - <div class="q-pa-md"> - <CardSummary - ref="summary" - :url="`Orders/${entityId}/summary`" - data-key="OrderSummary" - > - <template #header="{ entity }"> - {{ t('order.summary.basket') }} #{{ entity?.id }} - - {{ entity?.client?.name }} ({{ entity?.clientFk }}) - </template> - <template #header-right> - <QBtn - flat - text-color="white" - :disabled="isConfirmed" - :label="t('order.summary.confirm')" - @click="handleConfirm()" - > - <QTooltip>{{ t('order.summary.confirmLines') }}</QTooltip> - </QBtn> - </template> - <template #menu="{ entity }"> - <OrderDescriptorMenu :order="entity" /> - </template> - <template #body="{ entity }"> - <QCard class="vn-two"> - <VnTitle - :url="`#/order/${entity.id}/basic-data`" - :text="t('globals.pageTitles.basicData')" - /> - <div class="vn-card-group"> - <div class="vn-card-content"> - <VnLv label="ID" :value="entity.id" /> - <VnLv :label="t('globals.alias')" dash> - <template #value> - <span class="link"> - {{ dashIfEmpty(entity?.address?.nickname) }} - <CustomerDescriptorProxy :id="entity?.clientFk" /> - </span> - </template> - </VnLv> - <VnLv - :label="t('globals.company')" - :value="entity?.address?.companyFk" - /> - <VnLv - :label="t('globals.confirmed')" - :value="Boolean(entity?.isConfirmed)" - /> - </div> - <div class="vn-card-content"> - <VnLv - :label="t('order.summary.created')" - :value="toDateHourMinSec(entity?.created)" - /> - <VnLv - :label="t('globals.confirmed')" - :value="toDateHourMinSec(entity?.confirmed)" - /> - <VnLv - :label="t('globals.landed')" - :value="toDateHourMinSec(entity?.landed)" - /> - <VnLv :label="t('globals.phone')"> - <template #value> - {{ dashIfEmpty(entity?.address?.phone) }} - <a - v-if="entity?.address?.phone" - :href="`tel:${entity?.address?.phone}`" - class="text-primary" - > - <QIcon name="phone" /> - </a> - </template> - </VnLv> - <VnLv - :label="t('order.summary.createdFrom')" - :value="entity?.sourceApp" - /> - <VnLv - :label="t('order.summary.address')" - :value="`${entity?.address?.street} - ${entity?.address?.city} (${entity?.address?.province?.name})`" - class="order-summary-address" - /> - </div> + <CardSummary + ref="summary" + :url="`Orders/${entityId}/summary`" + data-key="OrderSummary" + > + <template #header="{ entity }"> + {{ t('order.summary.basket') }} #{{ entity?.id }} - + {{ entity?.client?.name }} ({{ entity?.clientFk }}) + </template> + <template #header-right> + <QBtn + flat + text-color="white" + :disabled="isConfirmed" + :label="t('order.summary.confirm')" + @click="handleConfirm()" + > + <QTooltip>{{ t('order.summary.confirmLines') }}</QTooltip> + </QBtn> + </template> + <template #menu="{ entity }"> + <OrderDescriptorMenu :order="entity" /> + </template> + <template #body="{ entity }"> + <QCard class="vn-two"> + <VnTitle + :url="`#/order/${entity.id}/basic-data`" + :text="t('globals.pageTitles.basicData')" + /> + <div class="vn-card-group"> + <div class="vn-card-content"> + <VnLv label="ID" :value="entity.id" /> + <VnLv :label="t('globals.alias')" dash> + <template #value> + <span class="link"> + {{ dashIfEmpty(entity?.address?.nickname) }} + <CustomerDescriptorProxy :id="entity?.clientFk" /> + </span> + </template> + </VnLv> + <VnLv + :label="t('globals.company')" + :value="entity?.address?.companyFk" + /> + <VnLv + :label="t('globals.confirmed')" + :value="Boolean(entity?.isConfirmed)" + /> </div> - </QCard> - <QCard class="vn-one"> - <VnTitle :text="t('globals.pageTitles.notes')" /> - <p v-if="entity?.note" class="no-margin"> - {{ entity?.note }} - </p> - </QCard> - <QCard class="vn-one"> - <VnTitle :text="t('order.summary.total')" /> - <VnLv> - <template #label> - <span class="text-h6">{{ t('globals.subtotal') }}</span> - </template> - <template #value> - <span class="text-h6">{{ - toCurrency(entity?.subTotal) - }}</span> - </template> - </VnLv> - <VnLv> - <template #label> - <span class="text-h6">{{ t('globals.vat') }}</span> - </template> - <template #value> - <span class="text-h6">{{ toCurrency(entity?.VAT) }}</span> - </template> - </VnLv> - <VnLv> - <template #label> - <span class="text-h6">{{ t('order.summary.total') }}</span> - </template> - <template #value> - <span class="text-h6">{{ toCurrency(entity?.total) }}</span> - </template> - </VnLv> - </QCard> - <QCard> - <VnTitle :text="t('globals.details')" /> - <QTable :columns="detailsColumns" :rows="entity?.rows" flat> - <template #header="props"> - <QTr :props="props"> - <QTh auto-width>{{ t('globals.item') }}</QTh> - <QTh>{{ t('globals.description') }}</QTh> - <QTh auto-width>{{ t('globals.quantity') }}</QTh> - <QTh auto-width>{{ t('globals.price') }}</QTh> - <QTh auto-width>{{ t('order.summary.amount') }}</QTh> - </QTr> - </template> - <template #body="props"> - <QTr :props="props"> - <QTd key="item" :props="props" class="item"> - <span class="link"> - {{ props.row.item?.id }} - <ItemDescriptorProxy :id="props.row.item?.id" /> - </span> - </QTd> - <QTd key="description" :props="props"> - <div class="description"> - <div class="name"> - {{ props.row.item.name }} - <span - v-if="props.row.item.subName" - class="subName" - > - {{ props.row.item.subName }} - </span> - </div> + <div class="vn-card-content"> + <VnLv + :label="t('order.summary.created')" + :value="toDateHourMinSec(entity?.created)" + /> + <VnLv + :label="t('globals.confirmed')" + :value="toDateHourMinSec(entity?.confirmed)" + /> + <VnLv + :label="t('globals.landed')" + :value="toDateHourMinSec(entity?.landed)" + /> + <VnLv :label="t('globals.phone')"> + <template #value> + {{ dashIfEmpty(entity?.address?.phone) }} + <a + v-if="entity?.address?.phone" + :href="`tel:${entity?.address?.phone}`" + class="text-primary" + > + <QIcon name="phone" /> + </a> + </template> + </VnLv> + <VnLv + :label="t('order.summary.createdFrom')" + :value="entity?.sourceApp" + /> + <VnLv + :label="t('order.summary.address')" + :value="`${entity?.address?.street} - ${entity?.address?.city} (${entity?.address?.province?.name})`" + class="order-summary-address" + /> + </div> + </div> + </QCard> + <QCard class="vn-one"> + <VnTitle :text="t('globals.pageTitles.notes')" /> + <p v-if="entity?.note" class="no-margin"> + {{ entity?.note }} + </p> + </QCard> + <QCard class="vn-one"> + <VnTitle :text="t('order.summary.total')" /> + <VnLv> + <template #label> + <span class="text-h6">{{ t('globals.subtotal') }}</span> + </template> + <template #value> + <span class="text-h6">{{ toCurrency(entity?.subTotal) }}</span> + </template> + </VnLv> + <VnLv> + <template #label> + <span class="text-h6">{{ t('globals.vat') }}</span> + </template> + <template #value> + <span class="text-h6">{{ toCurrency(entity?.VAT) }}</span> + </template> + </VnLv> + <VnLv> + <template #label> + <span class="text-h6">{{ t('order.summary.total') }}</span> + </template> + <template #value> + <span class="text-h6">{{ toCurrency(entity?.total) }}</span> + </template> + </VnLv> + </QCard> + <QCard> + <VnTitle :text="t('globals.details')" /> + <QTable :columns="detailsColumns" :rows="entity?.rows" flat> + <template #header="props"> + <QTr :props="props"> + <QTh auto-width>{{ t('globals.item') }}</QTh> + <QTh>{{ t('globals.description') }}</QTh> + <QTh auto-width>{{ t('globals.quantity') }}</QTh> + <QTh auto-width>{{ t('globals.price') }}</QTh> + <QTh auto-width>{{ t('order.summary.amount') }}</QTh> + </QTr> + </template> + <template #body="props"> + <QTr :props="props"> + <QTd key="item" :props="props" class="item"> + <span class="link"> + {{ props.row.item?.id }} + <ItemDescriptorProxy :id="props.row.item?.id" /> + </span> + </QTd> + <QTd key="description" :props="props"> + <div class="description"> + <div class="name"> + {{ props.row.item.name }} + <span + v-if="props.row.item.subName" + class="subName" + > + {{ props.row.item.subName }} + </span> </div> - <FetchedTags :item="props.row.item" :columns="3" /> - </QTd> - <QTd key="quantity" :props="props"> - {{ props.row.quantity }} - </QTd> - <QTd key="price" :props="props"> - {{ toCurrency(props.row.price) }} - </QTd> - <QTd key="amount" :props="props"> - {{ - toCurrency(props.row?.quantity * props.row?.price) - }} - </QTd> - </QTr> - </template> - </QTable> - </QCard> - </template> - </CardSummary> - </div> + </div> + <FetchedTags :item="props.row.item" :columns="3" /> + </QTd> + <QTd key="quantity" :props="props"> + {{ props.row.quantity }} + </QTd> + <QTd key="price" :props="props"> + {{ toCurrency(props.row.price) }} + </QTd> + <QTd key="amount" :props="props"> + {{ toCurrency(props.row?.quantity * props.row?.price) }} + </QTd> + </QTr> + </template> + </QTable> + </QCard> + </template> + </CardSummary> </template> <style lang="scss"> .cardSummary .summaryBody .vn-label-value.order-summary-address { diff --git a/src/pages/Order/OrderList.vue b/src/pages/Order/OrderList.vue index 2a1997f21..42f90c33a 100644 --- a/src/pages/Order/OrderList.vue +++ b/src/pages/Order/OrderList.vue @@ -147,7 +147,7 @@ const columns = computed(() => [ { title: t('globals.pageTitles.summary'), icon: 'preview', - action: (row) => viewSummary(row.id, OrderSummary), + action: (row) => viewSummary(row.id, OrderSummary, 'lg-width'), isPrimary: true, }, ], diff --git a/src/pages/Ticket/TicketList.vue b/src/pages/Ticket/TicketList.vue index dfaabc848..fa4e3c89f 100644 --- a/src/pages/Ticket/TicketList.vue +++ b/src/pages/Ticket/TicketList.vue @@ -253,7 +253,7 @@ const columns = computed(() => [ name: 'TicketCard', }).href; window.open(url, '_blank'); - } else viewSummary(row.id, TicketSummary); + } else viewSummary(row.id, TicketSummary, 'lg-width'); }, }, ], diff --git a/src/pages/Travel/Card/TravelSummary.vue b/src/pages/Travel/Card/TravelSummary.vue index 68af36474..af6db6304 100644 --- a/src/pages/Travel/Card/TravelSummary.vue +++ b/src/pages/Travel/Card/TravelSummary.vue @@ -1,5 +1,5 @@ <script setup> -import { ref, computed } from 'vue'; +import { ref, computed, onMounted } from 'vue'; import { useRoute } from 'vue-router'; import { useI18n } from 'vue-i18n'; @@ -7,8 +7,6 @@ import CardSummary from 'components/ui/CardSummary.vue'; import VnLv from 'src/components/ui/VnLv.vue'; import VnTitle from 'src/components/common/VnTitle.vue'; import EntryDescriptorProxy from 'src/pages/Entry/Card/EntryDescriptorProxy.vue'; -import FetchData from 'src/components/FetchData.vue'; -import VnRow from 'components/ui/VnRow.vue'; import { toDate, toCurrency, toCelsius } from 'src/filters'; import { toDateTimeFormat } from 'src/filters/date.js'; import { dashIfEmpty } from 'src/filters'; @@ -252,16 +250,16 @@ async function setTravelData(travelData) { } const getLink = (param) => `#/travel/${entityId.value}/${param}`; + +onMounted(async () => { + const { data } = await axios.get('Warehouses', { + params: { fields: ['id', 'name'] }, + }); + warehouses.value = data; +}); </script> <template> - <FetchData - url="Warehouses" - :filter="{ fields: ['id', 'name'] }" - order="name" - @on-fetch="(data) => (warehouses = data)" - auto-load - /> <CardSummary ref="summaryRef" :url="`Travels/${entityId}/getTravel`" diff --git a/src/pages/Travel/TravelList.vue b/src/pages/Travel/TravelList.vue index b227afcb2..32ddc639a 100644 --- a/src/pages/Travel/TravelList.vue +++ b/src/pages/Travel/TravelList.vue @@ -201,7 +201,7 @@ const columns = computed(() => [ { title: t('components.smartCard.viewSummary'), icon: 'preview', - action: (row) => viewSummary(row.id, TravelSummary), + action: (row) => viewSummary(row.id, TravelSummary, 'lg-width'), isPrimary: true, }, ], diff --git a/src/pages/Worker/WorkerList.vue b/src/pages/Worker/WorkerList.vue index b76790075..cb722a139 100644 --- a/src/pages/Worker/WorkerList.vue +++ b/src/pages/Worker/WorkerList.vue @@ -105,7 +105,7 @@ const columns = computed(() => [ { title: t('components.smartCard.viewSummary'), icon: 'preview', - action: (row) => viewSummary(row.id, WorkerSummary), + action: (row) => viewSummary(row.id, WorkerSummary, 'lg-width'), isPrimary: true, }, ], From d82369a62cd726d2d9b54254fb48cada64e28c8a Mon Sep 17 00:00:00 2001 From: benjaminedc <benjaminedc@verdnatura.es> Date: Tue, 11 Mar 2025 13:10:13 +0100 Subject: [PATCH 11/59] fix(UserPanel): refs #8683 update initial values for user warehouse and company selections --- test/cypress/integration/vnComponent/UserPanel.spec.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/cypress/integration/vnComponent/UserPanel.spec.js b/test/cypress/integration/vnComponent/UserPanel.spec.js index ec6774f58..8722fe37e 100644 --- a/test/cypress/integration/vnComponent/UserPanel.spec.js +++ b/test/cypress/integration/vnComponent/UserPanel.spec.js @@ -15,7 +15,7 @@ describe('UserPanel', () => { cy.openUserPanel(); // Compruebo la opcion inicial - cy.get(userWarehouse).should('have.value', 'ORN').click(); + cy.get(userWarehouse).should('have.value', 'VNL').click(); // Actualizo la opción cy.getOption(3); @@ -36,7 +36,7 @@ describe('UserPanel', () => { cy.openUserPanel(); // Compruebo la opcion inicial - cy.get(userCompany).should('have.value', 'Algemesi').click(); + cy.get(userCompany).should('have.value', 'Warehouse One').click(); //Actualizo la opción cy.getOption(3); From 13cf7c6031bd093cc5962b8507201b020bc7489f Mon Sep 17 00:00:00 2001 From: benjaminedc <benjaminedc@verdnatura.es> Date: Tue, 11 Mar 2025 13:17:36 +0100 Subject: [PATCH 12/59] fix(VnLog): refs #8683 update validation content for entity filter test --- test/cypress/integration/vnComponent/VnLog.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/cypress/integration/vnComponent/VnLog.spec.js b/test/cypress/integration/vnComponent/VnLog.spec.js index 80b9d07df..782fb9fbe 100644 --- a/test/cypress/integration/vnComponent/VnLog.spec.js +++ b/test/cypress/integration/vnComponent/VnLog.spec.js @@ -20,6 +20,6 @@ describe('VnLog', () => { it('should filter by entity', () => { cy.selectOption('.q-drawer--right .q-item > .q-select', 'Claim'); cy.get('.q-page').click(); - cy.validateContent(chips[0], 'Claim'); + cy.validateContent(chips[0], 'Beginning'); }); }); From df3bbfe5e4f2937b095e80fa065d0046d9eb0ac7 Mon Sep 17 00:00:00 2001 From: jorgep <jorgep@verdnatura.es> Date: Tue, 11 Mar 2025 13:41:52 +0100 Subject: [PATCH 13/59] fix: refs #8388 update file attachment logic and redirect after invoice creation --- src/components/common/VnDms.vue | 4 +++- src/pages/InvoiceIn/InvoiceInList.vue | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/components/common/VnDms.vue b/src/components/common/VnDms.vue index 35308c2c4..03f85f855 100644 --- a/src/components/common/VnDms.vue +++ b/src/components/common/VnDms.vue @@ -46,9 +46,11 @@ const dms = ref({}); onMounted(() => { defaultData(); - if (!$props.formInitialData) + if (!$props.formInitialData) { dms.value.description = $props.description ?? t($props.model + 'Description', dms.value); + dms.value.hasFile = false; + } }); function onFileChange(files) { dms.value.hasFileAttached = !!files; diff --git a/src/pages/InvoiceIn/InvoiceInList.vue b/src/pages/InvoiceIn/InvoiceInList.vue index 0960d0d6c..8dbee6501 100644 --- a/src/pages/InvoiceIn/InvoiceInList.vue +++ b/src/pages/InvoiceIn/InvoiceInList.vue @@ -156,7 +156,7 @@ const cols = computed(() => [ :create="{ urlCreate: 'InvoiceIns', title: t('globals.createInvoiceIn'), - onDataSaved: ({ id }) => tableRef.redirect(id), + onDataSaved: ({ id }) => tableRef.redirect(`${id}/basic-data`), formInitialData: { companyFk: user.companyFk, issued: Date.vnNew() }, }" redirect="invoice-in" From bce7e2ad565f31d4f3f374d4fe082186f25c43f8 Mon Sep 17 00:00:00 2001 From: benjaminedc <benjaminedc@verdnatura.es> Date: Thu, 13 Mar 2025 08:06:39 +0100 Subject: [PATCH 14/59] feat: refs #8118 enhance VnDropdown component; simplify usage in Claim and Ticket summaries --- src/components/common/VnDropdown.vue | 22 ++++++++++++---------- src/pages/Claim/Card/ClaimSummary.vue | 9 ++------- src/pages/Ticket/Card/TicketSummary.vue | 1 - 3 files changed, 14 insertions(+), 18 deletions(-) diff --git a/src/components/common/VnDropdown.vue b/src/components/common/VnDropdown.vue index 63d6b96f6..75b6878a0 100644 --- a/src/components/common/VnDropdown.vue +++ b/src/components/common/VnDropdown.vue @@ -11,14 +11,18 @@ const $props = defineProps({ type: Boolean, default: null, }, - moduleName: { - type: String, - default: null, - }, options: { type: Array, default: null, }, + optionLabel: { + type: String, + default: 'name', + }, + optionValue: { + type: String, + default: 'id', + }, }); async function changeState(value) { @@ -37,8 +41,9 @@ async function changeState(value) { > <VnSelect :options="$props.options" + :option-label="$props.optionLabel" + :option-value="$props.optionValue" hide-selected - option-value="code" hide-dropdown-icon focus-on-mount @update:model-value="changeState" @@ -46,11 +51,8 @@ async function changeState(value) { <template #option="scope"> <QItem v-bind="scope.itemProps"> <QItemSection> - <QItemLabel v-if="$props.moduleName === 'Ticket'"> - {{ scope.opt?.name }} - </QItemLabel> - <QItemLabel v-if="$props.moduleName === 'Claim'"> - {{ scope.opt?.description }} + <QItemLabel> + {{ scope.opt?.name || scope.opt?.description }} </QItemLabel> </QItemSection> </QItem> diff --git a/src/pages/Claim/Card/ClaimSummary.vue b/src/pages/Claim/Card/ClaimSummary.vue index 23a9f1073..25910cfc0 100644 --- a/src/pages/Claim/Card/ClaimSummary.vue +++ b/src/pages/Claim/Card/ClaimSummary.vue @@ -173,9 +173,8 @@ function openDialog(dmsId) { } async function changeState(value) { - const newState = claimStates.value.find((state) => state.code == value); await axios.patch(`Claims/updateClaim/${entityId.value}`, { - claimStateFk: newState.id, + claimStateFk: value, }); router.go(route.fullPath); } @@ -208,11 +207,7 @@ onMounted(async () => { {{ claim.id }} - {{ claim.client.name }} ({{ claim.client.id }}) </template> <template #header-right> - <VnDropdown - :moduleName="route.meta.moduleName" - :options="claimStates" - @change-state="changeState($event)" - /> + <VnDropdown :options="claimStates" @change-state="changeState($event)" /> </template> <template #menu="{ entity }"> <ClaimDescriptorMenu :claim="entity.claim" /> diff --git a/src/pages/Ticket/Card/TicketSummary.vue b/src/pages/Ticket/Card/TicketSummary.vue index a575d66e7..907276849 100644 --- a/src/pages/Ticket/Card/TicketSummary.vue +++ b/src/pages/Ticket/Card/TicketSummary.vue @@ -114,7 +114,6 @@ onMounted(async () => { </template> <template #header-right> <VnDropdown - :moduleName="route.meta.moduleName" :moduleId="entityId" :options="editableStates" :disable="!isEditable()" From 96b02a3b223591ad98226291d4101b37368bdc1a Mon Sep 17 00:00:00 2001 From: benjaminedc <benjaminedc@verdnatura.es> Date: Thu, 13 Mar 2025 13:10:55 +0100 Subject: [PATCH 15/59] fix: refs #8118 correct spelling in success message for work center removal --- test/cypress/integration/route/agency/agencyWorkCenter.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/cypress/integration/route/agency/agencyWorkCenter.spec.js b/test/cypress/integration/route/agency/agencyWorkCenter.spec.js index a3e0aac81..79dcd6f70 100644 --- a/test/cypress/integration/route/agency/agencyWorkCenter.spec.js +++ b/test/cypress/integration/route/agency/agencyWorkCenter.spec.js @@ -9,7 +9,7 @@ describe('AgencyWorkCenter', () => { const messages = { dataCreated: 'Data created', alreadyAssigned: 'This workCenter is already assigned to this agency', - removed: 'WorkCenter removed successfully', + removed: 'Work center removed successfully', }; beforeEach(() => { From 01d1ca83ea12fcb02fd00496438694ee1fcb5d61 Mon Sep 17 00:00:00 2001 From: jorgep <jorgep@verdnatura.es> Date: Mon, 17 Mar 2025 13:25:40 +0100 Subject: [PATCH 16/59] fix: refs #8388 improve error handling and notification for invoice booking --- src/pages/InvoiceIn/InvoiceInToBook.vue | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/pages/InvoiceIn/InvoiceInToBook.vue b/src/pages/InvoiceIn/InvoiceInToBook.vue index 5bdbe197b..7bb465d70 100644 --- a/src/pages/InvoiceIn/InvoiceInToBook.vue +++ b/src/pages/InvoiceIn/InvoiceInToBook.vue @@ -56,22 +56,21 @@ async function checkToBook(id) { componentProps: { title: t('Are you sure you want to book this invoice?'), message: messages.reduce((acc, msg) => `${acc}<p>${msg}</p>`, ''), + promise: () => toBook(id), }, - }).onOk(() => toBook(id)); + }); } async function toBook(id) { - let type = 'positive'; - let message = t('globals.dataSaved'); - + let err; try { await axios.post(`InvoiceIns/${id}/toBook`); store.data.isBooked = true; } catch (e) { - type = 'negative'; - message = t('It was not able to book the invoice'); + err = true; + throw e; } finally { - notify({ type, message }); + if (!err) notify({ type: 'positive', message: t('globals.dataSaved') }); } } </script> From 6546d06f60d62356e86c50d9386a30756b49bab2 Mon Sep 17 00:00:00 2001 From: jorgep <jorgep@verdnatura.es> Date: Tue, 18 Mar 2025 12:04:54 +0100 Subject: [PATCH 17/59] refactor: refs #8388 update UI feedback --- src/pages/InvoiceIn/Card/InvoiceInDueDay.vue | 36 +++++++++++++++----- src/pages/InvoiceIn/locale/en.yml | 1 + src/pages/InvoiceIn/locale/es.yml | 2 ++ 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/src/pages/InvoiceIn/Card/InvoiceInDueDay.vue b/src/pages/InvoiceIn/Card/InvoiceInDueDay.vue index 20cc1cc71..59bebcae2 100644 --- a/src/pages/InvoiceIn/Card/InvoiceInDueDay.vue +++ b/src/pages/InvoiceIn/Card/InvoiceInDueDay.vue @@ -25,7 +25,8 @@ const invoiceInFormRef = ref(); const invoiceId = +route.params.id; const filter = { where: { invoiceInFk: invoiceId } }; const areRows = ref(false); -const totals = ref(); +const totalTaxableBase = ref(); +const noMatch = computed(() => totalAmount.value != totalTaxableBase.value); const columns = computed(() => [ { name: 'duedate', @@ -74,9 +75,12 @@ async function insert() { notify(t('globals.dataSaved'), 'positive'); } -onBeforeMount(async () => { - totals.value = (await axios.get(`InvoiceIns/${invoiceId}/getTotals`)).data; -}); +async function setTaxableBase() { + const { data } = await axios.get(`InvoiceIns/${invoiceId}/getTotals`); + totalTaxableBase.value = data.totalTaxableBase; +} + +onBeforeMount(async () => await setTaxableBase()); </script> <template> <CrudModel @@ -89,13 +93,14 @@ onBeforeMount(async () => { :data-required="{ invoiceInFk: invoiceId }" v-model:selected="rowsSelected" @on-fetch="(data) => (areRows = !!data.length)" + @save-changes="setTaxableBase" > <template #body="{ rows }"> <QTable v-model:selected="rowsSelected" selection="multiple" - :columns="columns" - :rows="rows" + :columns + :rows row-key="$index" :grid="$q.screen.lt.sm" > @@ -151,7 +156,18 @@ onBeforeMount(async () => { <QTd /> <QTd /> <QTd> - {{ toCurrency(totalAmount) }} + <QChip + dense + :color="noMatch ? 'negative' : 'transparent'" + class="q-pa-xs" + :title=" + noMatch + ? t('invoiceIn.noMatch', { totalTaxableBase }) + : '' + " + > + {{ toCurrency(totalAmount) }} + </QChip> </QTd> <QTd> <template v-if="isNotEuro(invoiceIn.currency.code)"> @@ -237,7 +253,7 @@ onBeforeMount(async () => { if (!areRows) insert(); else invoiceInFormRef.insert({ - amount: (totals.totalTaxableBase - totalAmount).toFixed(2), + amount: (totalTaxableBase - totalAmount).toFixed(2), invoiceInFk: invoiceId, }); } @@ -249,6 +265,10 @@ onBeforeMount(async () => { .bg { background-color: var(--vn-light-gray); } + +.q-chip { + color: var(--vn-text-color); +} </style> <i18n> es: diff --git a/src/pages/InvoiceIn/locale/en.yml b/src/pages/InvoiceIn/locale/en.yml index 548e6c201..085f351b2 100644 --- a/src/pages/InvoiceIn/locale/en.yml +++ b/src/pages/InvoiceIn/locale/en.yml @@ -68,3 +68,4 @@ invoiceIn: isBooked: Is booked account: Ledger account correctingFk: Rectificative + noMatch: No match with the vat({totalTaxableBase}) diff --git a/src/pages/InvoiceIn/locale/es.yml b/src/pages/InvoiceIn/locale/es.yml index 142d95f92..516da1149 100644 --- a/src/pages/InvoiceIn/locale/es.yml +++ b/src/pages/InvoiceIn/locale/es.yml @@ -60,9 +60,11 @@ invoiceIn: net: Neto stems: Tallos country: País + noMatch: No cuadra params: search: Id o nombre proveedor correctedFk: Rectificada isBooked: Contabilizada account: Cuenta contable correctingFk: Rectificativa + noMatch: No cuadra con el iva({totalTaxableBase}) From b7309298aa591f06059a389f8e8f0320a760fb95 Mon Sep 17 00:00:00 2001 From: benjaminedc <benjaminedc@verdnatura.es> Date: Thu, 20 Mar 2025 10:04:27 +0100 Subject: [PATCH 18/59] refactor: refs #8118 simplify VnDropdown usage and replace onMounted data fetching with FetchData component --- src/components/common/VnDropdown.vue | 9 --------- src/pages/Claim/Card/ClaimSummary.vue | 18 ++++++++++++------ src/pages/Ticket/Card/TicketSummary.vue | 2 ++ 3 files changed, 14 insertions(+), 15 deletions(-) diff --git a/src/components/common/VnDropdown.vue b/src/components/common/VnDropdown.vue index 75b6878a0..1b3f2237b 100644 --- a/src/components/common/VnDropdown.vue +++ b/src/components/common/VnDropdown.vue @@ -48,15 +48,6 @@ async function changeState(value) { focus-on-mount @update:model-value="changeState" > - <template #option="scope"> - <QItem v-bind="scope.itemProps"> - <QItemSection> - <QItemLabel> - {{ scope.opt?.name || scope.opt?.description }} - </QItemLabel> - </QItemSection> - </QItem> - </template> </VnSelect> </QBtnDropdown> </template> diff --git a/src/pages/Claim/Card/ClaimSummary.vue b/src/pages/Claim/Card/ClaimSummary.vue index f43ba4dad..37e73a99d 100644 --- a/src/pages/Claim/Card/ClaimSummary.vue +++ b/src/pages/Claim/Card/ClaimSummary.vue @@ -183,14 +183,15 @@ async function changeState(value) { function claimUrl(section) { return '#/claim/' + entityId.value + '/' + section; } - -onMounted(async () => { - const { data } = await axios.get('ClaimStates'); - claimStates.value = data; -}); </script> <template> + <FetchData + url="ClaimStates" + :filter="{ fields: ['id', 'description'] }" + @on-fetch="(data) => (claimStates = data)" + auto-load + /> <FetchData url="ClaimDms" :filter="claimDmsFilter" @@ -208,7 +209,12 @@ onMounted(async () => { {{ claim.id }} - {{ claim.client.name }} ({{ claim.client.id }}) </template> <template #header-right> - <VnDropdown :options="claimStates" @change-state="changeState($event)" /> + <VnDropdown + :options="claimStates" + option-value="id" + option-label="description" + @change-state="changeState($event)" + /> </template> <template #menu="{ entity }"> <ClaimDescriptorMenu :claim="entity.claim" /> diff --git a/src/pages/Ticket/Card/TicketSummary.vue b/src/pages/Ticket/Card/TicketSummary.vue index f1c5a1072..9cd8a75d2 100644 --- a/src/pages/Ticket/Card/TicketSummary.vue +++ b/src/pages/Ticket/Card/TicketSummary.vue @@ -117,6 +117,8 @@ onMounted(async () => { :moduleId="entityId" :options="editableStates" :disable="!isEditable()" + :option-label="'name'" + :option-value="'code'" @change-state="changeState($event)" /> </template> From efb6c2357bd4c491472642878a63a9f948e39b78 Mon Sep 17 00:00:00 2001 From: benjaminedc <benjaminedc@verdnatura.es> Date: Thu, 20 Mar 2025 12:55:46 +0100 Subject: [PATCH 19/59] fix: refs #8118 update Cypress parallel test execution to run with a single instance --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 7f4144a54..05ef34791 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -126,7 +126,7 @@ pipeline { sh "docker-compose ${env.COMPOSE_PARAMS} up -d" image.inside("--network ${env.COMPOSE_PROJECT}_default -e CI -e TZ --init") { - sh 'sh test/cypress/cypressParallel.sh 2' + sh 'sh test/cypress/cypressParallel.sh 1' } } } From 489fcda41057d4546ea3be5e06e1ddc5e5e09913 Mon Sep 17 00:00:00 2001 From: benjaminedc <benjaminedc@verdnatura.es> Date: Thu, 20 Mar 2025 12:59:33 +0100 Subject: [PATCH 20/59] fix: refs #8683 update Cypress parallel test execution to run with a single instance --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 7f4144a54..05ef34791 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -126,7 +126,7 @@ pipeline { sh "docker-compose ${env.COMPOSE_PARAMS} up -d" image.inside("--network ${env.COMPOSE_PROJECT}_default -e CI -e TZ --init") { - sh 'sh test/cypress/cypressParallel.sh 2' + sh 'sh test/cypress/cypressParallel.sh 1' } } } From 7de4bd4f4a4ce1de7a4fc3ed990b09c475272262 Mon Sep 17 00:00:00 2001 From: benjaminedc <benjaminedc@verdnatura.es> Date: Thu, 20 Mar 2025 13:01:13 +0100 Subject: [PATCH 21/59] fix: refs #8118 update Cypress parallel test execution to run with two instances --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 05ef34791..7f4144a54 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -126,7 +126,7 @@ pipeline { sh "docker-compose ${env.COMPOSE_PARAMS} up -d" image.inside("--network ${env.COMPOSE_PROJECT}_default -e CI -e TZ --init") { - sh 'sh test/cypress/cypressParallel.sh 1' + sh 'sh test/cypress/cypressParallel.sh 2' } } } From 767511cec080356dceeef617a423c39a2fdbab22 Mon Sep 17 00:00:00 2001 From: Jon <jon@verdnatura.es> Date: Fri, 21 Mar 2025 09:13:34 +0100 Subject: [PATCH 22/59] fix: refs #8326 e2e --- .../integration/invoiceIn/invoiceInList.spec.js | 6 +++--- .../integration/ticket/ticketDescriptor.spec.js | 4 ++-- .../integration/worker/workerSummary.spec.js | 16 +++++++--------- 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/test/cypress/integration/invoiceIn/invoiceInList.spec.js b/test/cypress/integration/invoiceIn/invoiceInList.spec.js index 44a61609e..6b5d28c70 100644 --- a/test/cypress/integration/invoiceIn/invoiceInList.spec.js +++ b/test/cypress/integration/invoiceIn/invoiceInList.spec.js @@ -4,7 +4,7 @@ describe('InvoiceInList', () => { const firstRow = 'tbody.q-virtual-scroll__content tr:nth-child(1)'; const firstId = `${firstRow} > td:nth-child(2) span`; const firstDetailBtn = `${firstRow} .q-btn:nth-child(1)`; - const summaryHeaders = '.summaryBody .header-link'; + const summaryHeaders = (opt) => `.summaryBody > .${opt} > .q-pb-lg > .header-link`; const mockInvoiceRef = `createMockInvoice${Math.floor(Math.random() * 100)}`; const mock = { vnSupplierSelect: { val: 'farmer king', type: 'select' }, @@ -32,8 +32,8 @@ describe('InvoiceInList', () => { it('should open the details', () => { cy.get(firstDetailBtn).click(); - cy.get(summaryHeaders).eq(1).contains('Basic data'); - cy.get(summaryHeaders).eq(4).contains('Vat'); + cy.get(summaryHeaders('max-width')).contains('Basic data'); + cy.get(summaryHeaders('vat')).contains('Vat'); }); it('should create a new Invoice', () => { diff --git a/test/cypress/integration/ticket/ticketDescriptor.spec.js b/test/cypress/integration/ticket/ticketDescriptor.spec.js index 0ba2723a2..b5c95c463 100644 --- a/test/cypress/integration/ticket/ticketDescriptor.spec.js +++ b/test/cypress/integration/ticket/ticketDescriptor.spec.js @@ -3,10 +3,10 @@ describe('Ticket descriptor', () => { const listItem = '[role="menu"] .q-list .q-item'; const toCloneOpt = 'To clone ticket'; const setWeightOpt = 'Set weight'; - const warehouseValue = ':nth-child(1) > :nth-child(6) > .value > span'; + const warehouseValue = ':nth-child(1) > [data-cy="vnLvWarehouse"]'; const summaryHeader = '.summaryHeader > div'; const weight = 25; - const weightValue = '.summaryBody.row :nth-child(1) > :nth-child(9) > .value > span'; + const weightValue = '[data-cy="vnLvWeight"]'; beforeEach(() => { cy.login('developer'); cy.viewport(1920, 1080); diff --git a/test/cypress/integration/worker/workerSummary.spec.js b/test/cypress/integration/worker/workerSummary.spec.js index c50b2c943..6071c4cdf 100644 --- a/test/cypress/integration/worker/workerSummary.spec.js +++ b/test/cypress/integration/worker/workerSummary.spec.js @@ -1,27 +1,25 @@ describe('WorkerSummary', () => { - const departmentDescriptor = ':nth-child(1) > :nth-child(3) > .value > .link'; - const roleDescriptor = ':nth-child(3) > :nth-child(4) > .value > .link'; + const department = ':nth-child(1) > [data-cy="vnLvDepartment"] > .value'; + const role = '[data-cy="vnLvRole"] > .value'; beforeEach(() => { cy.viewport(1280, 720); cy.login('developer'); cy.visit('/#/worker/19/summary'); }); - it('should load worker summary', () => { + it('should load worker summary and show the department', () => { cy.waitForElement('.summaryHeader'); cy.get('.summaryHeader > div').should('have.text', '19 - salesboss salesboss'); - cy.get(':nth-child(1) > :nth-child(2) > .value > span').should( - 'have.text', - 'salesBossNick', - ); + cy.get(department).should('have.text', 'VENTAS'); }); it('should try descriptors', () => { cy.waitForElement('.summaryHeader'); - cy.get(departmentDescriptor).click(); + cy.get(department).click(); cy.get('.descriptor').should('be.visible'); cy.get('.q-item > .q-item__label').should('include.text', '43'); - cy.get(roleDescriptor).click(); + cy.get('.summaryBody').click(); + cy.get(role).click(); cy.get('.descriptor').should('be.visible'); cy.get('.q-item > .q-item__label').should('include.text', '19'); }); From 3e956cda6998f4b6bc5c59f91bd09aa49baa09d9 Mon Sep 17 00:00:00 2001 From: benjaminedc <benjaminedc@verdnatura.es> Date: Fri, 21 Mar 2025 09:26:09 +0100 Subject: [PATCH 23/59] fix: refs #8118 update VnDropdown options in ClaimSummary and TicketSummary components --- src/pages/Claim/Card/ClaimSummary.vue | 2 +- src/pages/Ticket/Card/TicketSummary.vue | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/pages/Claim/Card/ClaimSummary.vue b/src/pages/Claim/Card/ClaimSummary.vue index 37e73a99d..85f37f440 100644 --- a/src/pages/Claim/Card/ClaimSummary.vue +++ b/src/pages/Claim/Card/ClaimSummary.vue @@ -211,8 +211,8 @@ function claimUrl(section) { <template #header-right> <VnDropdown :options="claimStates" - option-value="id" option-label="description" + option-value="id" @change-state="changeState($event)" /> </template> diff --git a/src/pages/Ticket/Card/TicketSummary.vue b/src/pages/Ticket/Card/TicketSummary.vue index 9cd8a75d2..d79c5a9ac 100644 --- a/src/pages/Ticket/Card/TicketSummary.vue +++ b/src/pages/Ticket/Card/TicketSummary.vue @@ -114,9 +114,8 @@ onMounted(async () => { </template> <template #header-right> <VnDropdown - :moduleId="entityId" - :options="editableStates" :disable="!isEditable()" + :options="editableStates" :option-label="'name'" :option-value="'code'" @change-state="changeState($event)" From a74ff042bcc0ad4866a728eb0a0dec25b8c6ab0c Mon Sep 17 00:00:00 2001 From: Jon <jon@verdnatura.es> Date: Fri, 21 Mar 2025 11:09:42 +0100 Subject: [PATCH 24/59] feat: refs #7358 added chip in navbar to show environment --- src/components/NavBar.vue | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/components/NavBar.vue b/src/components/NavBar.vue index dbb6f1fe6..605d8786a 100644 --- a/src/components/NavBar.vue +++ b/src/components/NavBar.vue @@ -18,7 +18,18 @@ const state = useState(); const user = state.getUser(); const appName = 'Lilium'; const pinnedModulesRef = ref(); +const env = process.env.NODE_ENV; +function getEnvironment() { + switch (env) { + case 'development': + return 'dev'; + case 'production': + return; + default: + return env; + } +} onMounted(() => stateStore.setMounted()); const refresh = () => window.location.reload(); </script> @@ -50,6 +61,9 @@ const refresh = () => window.location.reload(); </QTooltip> </QBtn> </RouterLink> + <QChip class="q-ml-xs q-mr-xs envChip"> + {{ getEnvironment() }} + </QChip> <VnBreadcrumbs v-if="$q.screen.gt.sm" /> <QSpinner color="primary" @@ -118,4 +132,7 @@ const refresh = () => window.location.reload(); .q-header { background-color: var(--vn-section-color); } +.envChip { + background-color: $primary; +} </style> From d279d284c2189dc3ed8cad7764f280d95950d7ab Mon Sep 17 00:00:00 2001 From: benjaminedc <benjaminedc@verdnatura.es> Date: Fri, 21 Mar 2025 11:09:56 +0100 Subject: [PATCH 25/59] fix: refs #8790 format code and update default SMS message in SendSmsDialog component --- src/components/common/SendSmsDialog.vue | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/components/common/SendSmsDialog.vue b/src/components/common/SendSmsDialog.vue index 269a4ec9a..74aa64c72 100644 --- a/src/components/common/SendSmsDialog.vue +++ b/src/components/common/SendSmsDialog.vue @@ -1,15 +1,15 @@ <script setup> -import {useDialogPluginComponent} from 'quasar'; -import {useI18n} from 'vue-i18n'; -import {computed, ref} from 'vue'; +import { useDialogPluginComponent } from 'quasar'; +import { useI18n } from 'vue-i18n'; +import { computed, ref } from 'vue'; import VnInput from 'components/common/VnInput.vue'; import axios from 'axios'; -import useNotify from "composables/useNotify"; +import useNotify from 'composables/useNotify'; const MESSAGE_MAX_LENGTH = 160; -const {t} = useI18n(); -const {notify} = useNotify(); +const { t } = useI18n(); +const { notify } = useNotify(); const props = defineProps({ title: { type: String, @@ -34,7 +34,7 @@ const props = defineProps({ }); const emit = defineEmits([...useDialogPluginComponent.emits, 'sent']); -const {dialogRef, onDialogHide} = useDialogPluginComponent(); +const { dialogRef, onDialogHide } = useDialogPluginComponent(); const smsRules = [ (val) => (val && val.length > 0) || t("The message can't be empty"), @@ -43,10 +43,12 @@ const smsRules = [ t("The message it's too long"), ]; -const message = ref(''); +const message = ref( + 'Retraso en ruta.\nInformamos que la ruta que lleva su pedido ha sufrido un retraso y la entrega se hará a lo largo del día.\nDisculpe las molestias.', +); const charactersRemaining = computed( - () => MESSAGE_MAX_LENGTH - new Blob([message.value]).size + () => MESSAGE_MAX_LENGTH - new Blob([message.value]).size, ); const charactersChipColor = computed(() => { @@ -114,7 +116,7 @@ const onSubmit = async () => { <QTooltip> {{ t( - 'Special characters like accents counts as a multiple' + 'Special characters like accents counts as a multiple', ) }} </QTooltip> From 197a4a0ca73ed94b976ebdba5a39dc84d2210f30 Mon Sep 17 00:00:00 2001 From: benjaminedc <benjaminedc@verdnatura.es> Date: Fri, 21 Mar 2025 11:42:31 +0100 Subject: [PATCH 26/59] fix: refs #8790 update default SMS message in SendSmsDialog component for improved clarity and localization --- src/components/common/SendSmsDialog.vue | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/components/common/SendSmsDialog.vue b/src/components/common/SendSmsDialog.vue index 74aa64c72..ee468a42f 100644 --- a/src/components/common/SendSmsDialog.vue +++ b/src/components/common/SendSmsDialog.vue @@ -43,9 +43,7 @@ const smsRules = [ t("The message it's too long"), ]; -const message = ref( - 'Retraso en ruta.\nInformamos que la ruta que lleva su pedido ha sufrido un retraso y la entrega se hará a lo largo del día.\nDisculpe las molestias.', -); +const message = ref(t('routeLack')); const charactersRemaining = computed( () => MESSAGE_MAX_LENGTH - new Blob([message.value]).size, @@ -147,6 +145,8 @@ const onSubmit = async () => { } </style> <i18n> +en: + routeLack: Your order has been delayed in transit. Delivery will take place throughout the day. We apologize for the inconvenience and appreciate your patience. es: Message: Mensaje Send: Enviar @@ -155,4 +155,5 @@ es: The destination can't be empty: El destinatario no puede estar vacio The message can't be empty: El mensaje no puede estar vacio The message it's too long: El mensaje es demasiado largo + routeLack: Retraso en ruta. Informamos que la ruta que lleva su pedido ha sufrido un retraso y la entrega se hará a lo largo del día. Disculpe las molestias. </i18n> From d8b9f3467a5fab53b7739c99c3c8c0c2fd5824f4 Mon Sep 17 00:00:00 2001 From: Jon <jon@verdnatura.es> Date: Fri, 21 Mar 2025 13:25:59 +0100 Subject: [PATCH 27/59] refactor: refs #7358 changed function to computed --- src/components/NavBar.vue | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/components/NavBar.vue b/src/components/NavBar.vue index 605d8786a..6365fcd07 100644 --- a/src/components/NavBar.vue +++ b/src/components/NavBar.vue @@ -1,5 +1,5 @@ <script setup> -import { onMounted, ref } from 'vue'; +import { onMounted, ref, computed } from 'vue'; import { useI18n } from 'vue-i18n'; import { useState } from 'src/composables/useState'; import { useStateStore } from 'stores/useStateStore'; @@ -20,16 +20,16 @@ const appName = 'Lilium'; const pinnedModulesRef = ref(); const env = process.env.NODE_ENV; -function getEnvironment() { +const getEnvironment = computed(() => { switch (env) { case 'development': - return 'dev'; + return 'DEV'; case 'production': return; default: - return env; + return env.toUpperCase(); } -} +}); onMounted(() => stateStore.setMounted()); const refresh = () => window.location.reload(); </script> @@ -62,7 +62,7 @@ const refresh = () => window.location.reload(); </QBtn> </RouterLink> <QChip class="q-ml-xs q-mr-xs envChip"> - {{ getEnvironment() }} + {{ getEnvironment }} </QChip> <VnBreadcrumbs v-if="$q.screen.gt.sm" /> <QSpinner From 517dc49cefc8604ebbb111c72e3d398aa4761f38 Mon Sep 17 00:00:00 2001 From: jorgep <jorgep@verdnatura.es> Date: Fri, 21 Mar 2025 15:41:40 +0100 Subject: [PATCH 28/59] fix: refs #8388 update translation for invoice summary mismatch message --- src/pages/InvoiceIn/Card/InvoiceInSummary.vue | 5 ++++- src/pages/InvoiceIn/locale/en.yml | 1 - src/pages/InvoiceIn/locale/es.yml | 1 - 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/pages/InvoiceIn/Card/InvoiceInSummary.vue b/src/pages/InvoiceIn/Card/InvoiceInSummary.vue index f6beecd3d..5af6a94f7 100644 --- a/src/pages/InvoiceIn/Card/InvoiceInSummary.vue +++ b/src/pages/InvoiceIn/Card/InvoiceInSummary.vue @@ -305,7 +305,10 @@ const getLink = (param) => `#/invoice-in/${entityId.value}/${param}`; :color="amountsNotMatch ? 'negative' : 'transparent'" :title=" amountsNotMatch - ? t('invoiceIn.summary.noMatch') + ? t('invoiceIn.noMatch', { + totalTaxableBase: + entity.totals.totalTaxableBase, + }) : t('invoiceIn.summary.dueTotal') " > diff --git a/src/pages/InvoiceIn/locale/en.yml b/src/pages/InvoiceIn/locale/en.yml index 085f351b2..2f9435b00 100644 --- a/src/pages/InvoiceIn/locale/en.yml +++ b/src/pages/InvoiceIn/locale/en.yml @@ -57,7 +57,6 @@ invoiceIn: bank: Bank foreignValue: Foreign value dueTotal: Due day - noMatch: Do not match code: Code net: Net stems: Stems diff --git a/src/pages/InvoiceIn/locale/es.yml b/src/pages/InvoiceIn/locale/es.yml index 516da1149..9144d6ab1 100644 --- a/src/pages/InvoiceIn/locale/es.yml +++ b/src/pages/InvoiceIn/locale/es.yml @@ -60,7 +60,6 @@ invoiceIn: net: Neto stems: Tallos country: País - noMatch: No cuadra params: search: Id o nombre proveedor correctedFk: Rectificada From 028477ecbeb760559f8999aa9f77bdab6f52d01c Mon Sep 17 00:00:00 2001 From: jorgep <jorgep@verdnatura.es> Date: Mon, 24 Mar 2025 11:12:15 +0100 Subject: [PATCH 29/59] feat: refs #8388 add hasFile prop to VnDms component --- src/components/common/VnDms.vue | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/components/common/VnDms.vue b/src/components/common/VnDms.vue index e667e1558..8f5cc73c4 100644 --- a/src/components/common/VnDms.vue +++ b/src/components/common/VnDms.vue @@ -35,6 +35,10 @@ const $props = defineProps({ type: String, default: null, }, + hasFile: { + type: Boolean, + default: false, + }, }); const warehouses = ref(); @@ -49,7 +53,7 @@ onMounted(() => { if (!$props.formInitialData) { dms.value.description = $props.description ?? t($props.model + 'Description', dms.value); - dms.value.hasFile = false; + dms.value.hasFile = $props.hasFile; } }); function onFileChange(files) { From 2fabff05be50ab957997e7cd371dc4a5e1e9efb3 Mon Sep 17 00:00:00 2001 From: jorgep <jorgep@verdnatura.es> Date: Mon, 24 Mar 2025 11:15:59 +0100 Subject: [PATCH 30/59] feat: refs #8388 add hasFile property handling in VnDms component --- src/components/common/VnDms.vue | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/components/common/VnDms.vue b/src/components/common/VnDms.vue index 8f5cc73c4..de22e4857 100644 --- a/src/components/common/VnDms.vue +++ b/src/components/common/VnDms.vue @@ -50,11 +50,9 @@ const dms = ref({}); onMounted(() => { defaultData(); - if (!$props.formInitialData) { + if (!$props.formInitialData) dms.value.description = $props.description ?? t($props.model + 'Description', dms.value); - dms.value.hasFile = $props.hasFile; - } }); function onFileChange(files) { dms.value.hasFileAttached = !!files; @@ -96,6 +94,7 @@ function defaultData() { if ($props.formInitialData) return (dms.value = $props.formInitialData); return addDefaultData({ reference: route.params.id, + hasFile: $props.hasFile, }); } From 53f6f5278f154e6e7ccb55492be84230efcbf6ad Mon Sep 17 00:00:00 2001 From: Jon <jon@verdnatura.es> Date: Mon, 24 Mar 2025 12:08:24 +0100 Subject: [PATCH 31/59] refactor: refs #8326 requested changes --- src/components/ui/CardSummary.vue | 23 +++++ src/css/app.scss | 23 ----- src/pages/Route/Card/RouteSummary.vue | 141 +++++++++++++------------- src/pages/Zone/Card/ZoneSummary.vue | 18 +++- 4 files changed, 111 insertions(+), 94 deletions(-) diff --git a/src/components/ui/CardSummary.vue b/src/components/ui/CardSummary.vue index 05bfed998..2ec6bea78 100644 --- a/src/components/ui/CardSummary.vue +++ b/src/components/ui/CardSummary.vue @@ -201,6 +201,29 @@ async function fetch() { } } } + +.vn-card-group { + display: flex; + flex-direction: column; +} + +.vn-card-content { + display: flex; + flex-direction: column; + text-overflow: ellipsis; + > div { + max-height: 70px; + } +} + +@media (min-width: 1010px) { + .vn-card-group { + flex-direction: row; + } + .vn-card-content { + flex: 1; + } +} </style> <style lang="scss" scoped> .summaryHeader .vn-label-value { diff --git a/src/css/app.scss b/src/css/app.scss index 6a0ce8fb0..5befd150b 100644 --- a/src/css/app.scss +++ b/src/css/app.scss @@ -341,26 +341,3 @@ input::-webkit-inner-spin-button { .containerShrinked { width: 70%; } - -.vn-card-group { - display: flex; - flex-direction: column; -} - -.vn-card-content { - display: flex; - flex-direction: column; - text-overflow: ellipsis; - > div { - max-height: 80px; - } -} - -@media (min-width: 1010px) { - .vn-card-group { - flex-direction: row; - } - .vn-card-content { - flex: 1; - } -} diff --git a/src/pages/Route/Card/RouteSummary.vue b/src/pages/Route/Card/RouteSummary.vue index f68628095..86bdbb5c5 100644 --- a/src/pages/Route/Card/RouteSummary.vue +++ b/src/pages/Route/Card/RouteSummary.vue @@ -138,74 +138,79 @@ const ticketColumns = ref([ :url="`#/${route.meta.moduleName.toLowerCase()}/${entityId}/basic-data`" :text="t('globals.pageTitles.basicData')" /> - </QCard> - - <QCard class="vn-one"> - <VnLv - :label="t('route.summary.date')" - :value="toDate(entity?.route.dated)" - /> - <VnLv - :label="t('route.summary.agency')" - :value="entity?.route?.agencyMode?.name" - /> - <VnLv - :label="t('route.summary.vehicle')" - :value="entity.route?.vehicle?.numberPlate" - /> - <VnLv :label="t('route.summary.driver')"> - <template #value> - <span class="link"> - {{ dashIfEmpty(entity?.route?.worker?.user?.name) }} - <WorkerDescriptorProxy :id="entity.route?.workerFk" /> - </span> - </template> - </VnLv> - <VnLv - :label="t('route.summary.cost')" - :value="toCurrency(entity.route?.cost)" - /> - <VnLv - :label="t('route.summary.volume')" - :value="`${dashIfEmpty(entity?.route?.m3)} / ${dashIfEmpty( - entity?.route?.vehicle?.m3, - )} m³`" - /> - <VnLv - :label="t('route.summary.packages')" - :value="getTotalPackages(entity.tickets)" - /> - <QCheckbox - :label=" - entity.route.isOk - ? t('route.summary.closed') - : t('route.summary.open') - " - v-model="entity.route.isOk" - :disable="true" - /> - </QCard> - <QCard class="vn-one"> - <VnLv - :label="t('route.summary.started')" - :value="toHour(entity?.route.started)" - /> - <VnLv - :label="t('route.summary.finished')" - :value="toHour(entity?.route.finished)" - /> - <VnLv - :label="t('route.summary.kmStart')" - :value="dashIfEmpty(entity?.route?.kmStart)" - /> - <VnLv - :label="t('route.summary.kmEnd')" - :value="dashIfEmpty(entity?.route?.kmEnd)" - /> - <VnLv - :label="t('globals.description')" - :value="dashIfEmpty(entity?.route?.description)" - /> + <div class="vn-card-group"> + <div class="vn-card-content"> + <VnLv + :label="t('route.summary.date')" + :value="toDate(entity?.route.dated)" + /> + <VnLv + :label="t('route.summary.agency')" + :value="entity?.route?.agencyMode?.name" + /> + <VnLv + :label="t('route.summary.vehicle')" + :value="entity.route?.vehicle?.numberPlate" + /> + <VnLv :label="t('route.summary.driver')"> + <template #value> + <span class="link"> + {{ + dashIfEmpty(entity?.route?.worker?.user?.name) + }} + <WorkerDescriptorProxy + :id="entity.route?.workerFk" + /> + </span> + </template> + </VnLv> + <VnLv + :label="t('route.summary.cost')" + :value="toCurrency(entity.route?.cost)" + /> + <VnLv + :label="t('route.summary.volume')" + :value="`${dashIfEmpty(entity?.route?.m3)} / ${dashIfEmpty( + entity?.route?.vehicle?.m3, + )} m³`" + /> + <VnLv + :label="t('route.summary.packages')" + :value="getTotalPackages(entity.tickets)" + /> + <QCheckbox + :label=" + entity.route.isOk + ? t('route.summary.closed') + : t('route.summary.open') + " + v-model="entity.route.isOk" + :disable="true" + /> + </div> + <div class="vn-card-content"> + <VnLv + :label="t('route.summary.started')" + :value="toHour(entity?.route.started)" + /> + <VnLv + :label="t('route.summary.finished')" + :value="toHour(entity?.route.finished)" + /> + <VnLv + :label="t('route.summary.kmStart')" + :value="dashIfEmpty(entity?.route?.kmStart)" + /> + <VnLv + :label="t('route.summary.kmEnd')" + :value="dashIfEmpty(entity?.route?.kmEnd)" + /> + <VnLv + :label="t('globals.description')" + :value="dashIfEmpty(entity?.route?.description)" + /> + </div> + </div> </QCard> <QCard class="vn-max"> <VnTitle diff --git a/src/pages/Zone/Card/ZoneSummary.vue b/src/pages/Zone/Card/ZoneSummary.vue index cd5a80ba2..61475b1f6 100644 --- a/src/pages/Zone/Card/ZoneSummary.vue +++ b/src/pages/Zone/Card/ZoneSummary.vue @@ -75,13 +75,13 @@ onMounted(async () => { <template #body="{ entity: zone }"> <QCard class="vn-one"> <VnTitle :url="zoneUrl + `basic-data`" :text="t('summary.basicData')" /> - <div class="vn-card-group"> - <div class="vn-card-content"> + <div class="card-group"> + <div class="card-content"> <VnLv :label="t('list.agency')" :value="zone.agencyMode?.name" /> <VnLv :label="t('list.price')" :value="toCurrency(zone.price)" /> <VnLv :label="t('zone.bonus')" :value="toCurrency(zone.bonus)" /> </div> - <div class="vn-card-content"> + <div class="card-content"> <VnLv :label="t('summary.closeHour')" :value="toTimeFormat(zone.hour)" @@ -109,3 +109,15 @@ onMounted(async () => { </template> </CardSummary> </template> + +<style lang="scss" scoped> +.card-group { + display: flex; + flex-direction: column; +} + +.card-content { + display: flex; + flex-direction: column; +} +</style> From 43701bd58607b6cfb415fcd570b4816b73a60feb Mon Sep 17 00:00:00 2001 From: benjaminedc <benjaminedc@verdnatura.es> Date: Mon, 24 Mar 2025 12:24:49 +0100 Subject: [PATCH 32/59] refactor: refs #8118 simplify dropdown change event handling in ClaimSummary and TicketSummary components --- src/pages/Claim/Card/ClaimSummary.vue | 5 ++--- src/pages/Ticket/Card/TicketSummary.vue | 5 ++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/pages/Claim/Card/ClaimSummary.vue b/src/pages/Claim/Card/ClaimSummary.vue index 85f37f440..67d57004f 100644 --- a/src/pages/Claim/Card/ClaimSummary.vue +++ b/src/pages/Claim/Card/ClaimSummary.vue @@ -1,6 +1,6 @@ <script setup> import axios from 'axios'; -import { ref, computed, onMounted } from 'vue'; +import { ref, computed } from 'vue'; import { useRoute, useRouter } from 'vue-router'; import { useI18n } from 'vue-i18n'; import { toDate, toCurrency } from 'src/filters'; @@ -212,8 +212,7 @@ function claimUrl(section) { <VnDropdown :options="claimStates" option-label="description" - option-value="id" - @change-state="changeState($event)" + @change-state="changeState" /> </template> <template #menu="{ entity }"> diff --git a/src/pages/Ticket/Card/TicketSummary.vue b/src/pages/Ticket/Card/TicketSummary.vue index d79c5a9ac..f865abfc4 100644 --- a/src/pages/Ticket/Card/TicketSummary.vue +++ b/src/pages/Ticket/Card/TicketSummary.vue @@ -116,9 +116,8 @@ onMounted(async () => { <VnDropdown :disable="!isEditable()" :options="editableStates" - :option-label="'name'" - :option-value="'code'" - @change-state="changeState($event)" + option-value="code" + @change-state="changeState" /> </template> <template #menu="{ entity }"> From 3587be39973a6f570c11e9601d510b3bf70b9680 Mon Sep 17 00:00:00 2001 From: benjaminedc <benjaminedc@verdnatura.es> Date: Mon, 24 Mar 2025 12:41:40 +0100 Subject: [PATCH 33/59] refactor: refs #8790 update SMS delay message and localization keys --- src/components/common/SendSmsDialog.vue | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/components/common/SendSmsDialog.vue b/src/components/common/SendSmsDialog.vue index ee468a42f..a953abd75 100644 --- a/src/components/common/SendSmsDialog.vue +++ b/src/components/common/SendSmsDialog.vue @@ -43,7 +43,7 @@ const smsRules = [ t("The message it's too long"), ]; -const message = ref(t('routeLack')); +const message = ref(t('routeDelay')); const charactersRemaining = computed( () => MESSAGE_MAX_LENGTH - new Blob([message.value]).size, @@ -144,9 +144,10 @@ const onSubmit = async () => { max-width: 450px; } </style> + <i18n> en: - routeLack: Your order has been delayed in transit. Delivery will take place throughout the day. We apologize for the inconvenience and appreciate your patience. + routeDelay: "Your order has been delayed in transit.\nDelivery will take place throughout the day.\nWe apologize for the inconvenience and appreciate your patience." es: Message: Mensaje Send: Enviar @@ -155,5 +156,5 @@ es: The destination can't be empty: El destinatario no puede estar vacio The message can't be empty: El mensaje no puede estar vacio The message it's too long: El mensaje es demasiado largo - routeLack: Retraso en ruta. Informamos que la ruta que lleva su pedido ha sufrido un retraso y la entrega se hará a lo largo del día. Disculpe las molestias. -</i18n> + routeDelay: "Retraso en ruta.\nInformamos que la ruta que lleva su pedido ha sufrido un retraso y la entrega se hará a lo largo del día.\nDisculpe las molestias." + </i18n> From 65d21c9fe5f6000c9084e449f1a2280e588a4cda Mon Sep 17 00:00:00 2001 From: jorgep <jorgep@verdnatura.es> Date: Mon, 24 Mar 2025 16:15:17 +0100 Subject: [PATCH 34/59] test: refs #8388 update invoice creation test to include spinner wait and company field validation --- .../integration/invoiceIn/invoiceInList.spec.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test/cypress/integration/invoiceIn/invoiceInList.spec.js b/test/cypress/integration/invoiceIn/invoiceInList.spec.js index 44a61609e..3338684d6 100644 --- a/test/cypress/integration/invoiceIn/invoiceInList.spec.js +++ b/test/cypress/integration/invoiceIn/invoiceInList.spec.js @@ -36,17 +36,17 @@ describe('InvoiceInList', () => { cy.get(summaryHeaders).eq(4).contains('Vat'); }); - it('should create a new Invoice', () => { + it.only('should create a new Invoice', () => { cy.dataCy('vnTableCreateBtn').click(); cy.fillInForm({ ...mock }, { attr: 'data-cy' }); cy.dataCy('FormModelPopup_save').click(); cy.intercept('GET', /\/api\/InvoiceIns\/\d+\/getTotals$/).as('invoice'); - cy.wait('@invoice').then(() => + cy.wait('@invoice').then(() => { cy.validateDescriptor({ title: mockInvoiceRef, listBox: { 0: '11/16/2001', 3: 'The farmer' }, - }), - ); - cy.get('[data-cy="vnLvCompany"]').should('contain.text', 'ORN'); + }); + cy.dataCy('invoiceInBasicDataCompanyFk').should('have.value', 'ORN'); + }); }); }); From 535fe011f61f3511ff5cc2df7c1a942cb668c97e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Andr=C3=A9s?= <carlosap@verdnatura.es> Date: Mon, 24 Mar 2025 17:51:29 +0100 Subject: [PATCH 35/59] feat: refs #8529 add isDeductible column and localization for InvoiceIn summary --- src/pages/InvoiceIn/Card/InvoiceInSummary.vue | 16 ++++++++++++++++ src/pages/InvoiceIn/Card/InvoiceInVat.vue | 3 +-- src/pages/InvoiceIn/locale/en.yml | 1 + src/pages/InvoiceIn/locale/es.yml | 1 + .../invoiceIn/invoiceInDescriptor.spec.js | 3 --- 5 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/pages/InvoiceIn/Card/InvoiceInSummary.vue b/src/pages/InvoiceIn/Card/InvoiceInSummary.vue index 4f1140a9a..d5fded4bc 100644 --- a/src/pages/InvoiceIn/Card/InvoiceInSummary.vue +++ b/src/pages/InvoiceIn/Card/InvoiceInSummary.vue @@ -40,6 +40,13 @@ const vatColumns = ref([ sortable: true, align: 'left', }, + { + name: 'isDeductible', + label: 'invoiceIn.isDeductible', + field: (row) => row.isDeductible, + sortable: true, + align: 'center', + }, { name: 'vat', label: 'invoiceIn.summary.sageVat', @@ -331,6 +338,15 @@ const getLink = (param) => `#/invoice-in/${entityId.value}/${param}`; </QTh> </QTr> </template> + <template #body-cell-isDeductible="{ row }"> + <QTd align="center"> + <QCheckbox + v-model="row.isDeductible" + disable + data-cy="isDeductible_checkbox" + /> + </QTd> + </template> <template #body-cell-vat="{ value: vatCell }"> <QTd :title="vatCell" shrink> {{ vatCell }} diff --git a/src/pages/InvoiceIn/Card/InvoiceInVat.vue b/src/pages/InvoiceIn/Card/InvoiceInVat.vue index 5a868d32d..61c3040ae 100644 --- a/src/pages/InvoiceIn/Card/InvoiceInVat.vue +++ b/src/pages/InvoiceIn/Card/InvoiceInVat.vue @@ -55,7 +55,7 @@ const columns = computed(() => [ }, { name: 'isDeductible', - label: t('Deductible'), + label: t('invoiceIn.isDeductible'), field: (row) => row.isDeductible, model: 'isDeductible', align: 'center', @@ -511,7 +511,6 @@ es: Create a new expense: Crear nuevo gasto Add tax: Crear gasto Taxable base: Base imp. - Deductible: Deducible Sage tax: Sage iva Sage transaction: Sage transacción Rate: Tasa diff --git a/src/pages/InvoiceIn/locale/en.yml b/src/pages/InvoiceIn/locale/en.yml index 548e6c201..7e3603f0f 100644 --- a/src/pages/InvoiceIn/locale/en.yml +++ b/src/pages/InvoiceIn/locale/en.yml @@ -4,6 +4,7 @@ invoiceIn: serial: Serial isBooked: Is booked supplierRef: Invoice nº + isDeductible: Deductible list: ref: Reference supplier: Supplier diff --git a/src/pages/InvoiceIn/locale/es.yml b/src/pages/InvoiceIn/locale/es.yml index 142d95f92..e6ac9273c 100644 --- a/src/pages/InvoiceIn/locale/es.yml +++ b/src/pages/InvoiceIn/locale/es.yml @@ -4,6 +4,7 @@ invoiceIn: serial: Serie isBooked: Contabilizada supplierRef: Nº factura + isDeductible: Deducible list: ref: Referencia supplier: Proveedor diff --git a/test/cypress/integration/invoiceIn/invoiceInDescriptor.spec.js b/test/cypress/integration/invoiceIn/invoiceInDescriptor.spec.js index ee1a55434..7058e154c 100644 --- a/test/cypress/integration/invoiceIn/invoiceInDescriptor.spec.js +++ b/test/cypress/integration/invoiceIn/invoiceInDescriptor.spec.js @@ -1,7 +1,4 @@ describe('InvoiceInDescriptor', () => { - const book = '.summaryHeader > .no-wrap > .q-btn'; - const firstDescritorOpt = '.q-menu > .q-list > :nth-child(4) > .q-item__section'; - const checkbox = ':nth-child(4) > .q-checkbox'; beforeEach(() => cy.login('administrative')); describe('more options', () => { From 8da61655e2cc10aa186989211332b795fe820060 Mon Sep 17 00:00:00 2001 From: pablone <pablone@verdnatura.es> Date: Mon, 24 Mar 2025 23:02:05 +0100 Subject: [PATCH 36/59] fix: refs #8602 disable use-like option in EntryBuys component --- src/pages/Entry/Card/EntryBuys.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pages/Entry/Card/EntryBuys.vue b/src/pages/Entry/Card/EntryBuys.vue index 3990fde19..89c6d52c4 100644 --- a/src/pages/Entry/Card/EntryBuys.vue +++ b/src/pages/Entry/Card/EntryBuys.vue @@ -652,6 +652,7 @@ onMounted(() => { :fields="['id', 'nickname']" option-label="nickname" sort-by="nickname ASC" + :use-like="false" /> <VnSelect :label="t('Family')" From ca4e02a2bf0e3a07ee91a88c83b20cd68b87cac1 Mon Sep 17 00:00:00 2001 From: alexm <alexm@verdnatura.es> Date: Tue, 25 Mar 2025 08:39:19 +0100 Subject: [PATCH 37/59] chore: update changelog --- CHANGELOG.md | 211 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 211 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index dd75a00a4..3b654a1ad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,214 @@ +# Version 25.12 - 2025-03-25 + +### Added 🆕 + +- chore: add junit-merge dependency to package.json by:alexm +- chore: downgrade version from 25.14.0 to 25.12.0 in package.json by:alexm +- chore: reduce page load timeout in Cypress configuration by:alexm +- chore: refs #6695 update Cypress to version 14.1.0 and simplify test execution in Jenkinsfile by:alexm +- chore: refs #8602 add comments for clarity in Cypress commands file by:pablone +- chore: refs #8602 enhance Cypress support files with detailed comments and organization by:pablone +- ci: refs #6695 feat jenkins parallel e2e by:alexm +- feat: integrate vue-router to enhance routing capabilities in ZoneCard component by:alexm +- feat: refs #6695 implement parallel Cypress testing and enhance timeout configurations by:alexm +- feat: refs #6695 update Cypress parallel test execution to use 3 instances by:alexm +- feat: refs #6802 add dash placeholder for empty department names in InvoiceOut list by:jgallego +- feat: refs #6802 add DepartmentDescriptorProxy to InvoiceOutList and update translations by:jgallego +- feat: refs #6802 add DepartmentDescriptorProxy to various components and update department handling by:jgallego +- feat: refs #7587 add 'ticketClaimed' translation and implement claims retrieval in TicketDescriptor by:jtubau +- feat: refs #7949 show new field in ticket sales by:Jon +- feat: refs #8045 added new logic to show the correct icon and the correct path to redirect by:Jon +- feat: refs #8045 modified icon and route to redirect from CardDescriptor by:Jon +- feat: refs #8074 modified spinner size by:Jon +- feat: refs #8600 added calendar e2e and modified basic data by:Jon +- feat: refs #8600 added deliveryDays and modified warehouse E2Es by:Jon +- feat: refs #8600 added new tests for zoneSummary & zoneLocations by:provira +- feat: refs #8602 add custom Cypress commands for improved element interaction and request handling by:pablone +- feat: refs #8602 add new Cypress command for clicking buttons with icons by:pablone +- feat: refs #8602 add remove functionality for tag filters in EntryBuys component by:pablone +- feat: refs #8602 add sorting options for select fields and update locale files with supplier name by:pablone +- feat: refs #8602 refactor EntryBuys component and enhance observation tests by:pablone +- feat: refs #8602 remove unused state property from useArrayDataStore by:pablone +- feat: refs #8602 remove unused URL property from VnTable in ClaimList component by:pablone +- feat: refs #8602 skip warehouse creation and removal test in ZoneWarehouse spec by:pablone +- feat: refs #8602 streamline beforeSaveFn execution in CrudModel component by:pablone +- feat: refs #8602 streamline beforeSaveFn execution in VnTable component by:pablone +- feat: refs #8602 streamline filter logic in EntryBuys component by:pablone +- feat: refs #8602 update entry components and tests, add data-cy attributes for Cypress integration by:pablone +- feat: refs #8602 update localization for purchased spaces and enhance Entry components with new labels by:pablone +- feat: refs #8606 adapt module to VnCatdBeta by:Jon +- feat: refs #8612 added summary button & changed e2e tests by:provira +- feat: refs #8612 changed shelving to VnTable & created e2e tests by:provira +- feat: refs #8616 add summary prop to CardDescriptor in RoadmapDescriptor and WorkerDescriptor by:jtubau +- feat: refs #8616 add VnCheckbox component to VnFilter and update prop types in VnFilterPanel and VnSearchbar by:jtubau +- feat: refs #8630 add Agency and Vehicle descriptor components with summary props by:jtubau +- feat: refs #8638 add AWB field to travel and entry forms, update translations and styles by:pablone +- feat: refs #8638 add data attributes for transfer buys functionality in EntryBuys.vue and corresponding tests by:pablone +- feat: refs #8648 enhance roadmapList tests with improved selectors and additional scenarios by:jtubau +- feat: refs #8664 add CmrFilter component and integrate it into CmrList for enhanced filtering options by:jtubau +- feat: refs #8721 add ticket navigation and update route columns by:jtubau +- feat: run.sh build neccessary images by:alexm +- feat: update Jenkinsfile to pull Docker images for back and db services by:alexm +- feat: update labels and add department selection in InvoiceOut filter and list by:jgallego +- refactor: refs #8626 update button styles and improve route redirection logic by:jtubau +- style: refs #8041 new variable by:benjaminedc + +### Changed 📦 + +- feat: refs #8602 refactor EntryBuys component and enhance observation tests by:pablone +- refactor(cypress): refs #6695 simplify parallel test execution script by:alexm +- refactor: deleted useless (origin/Warmfix-DepartmentIcon) by:Jon +- refactor: refs #6695 enable ClaimNotes test suite by:alexm +- refactor: refs #6695 fix invoiceOutSummary by:alexm +- refactor: refs #6695 improve notification check and extend waitForElement timeout by:alexm +- refactor: refs #6695 remove mocha dependency and optimize Cypress command execution by:alexm +- refactor: refs #6695 skips by:alexm +- refactor: refs #6695 skip zoneWarehouse by:alexm +- refactor: refs #6695 streamline Cypress test execution and remove deprecated configurations by:alexm +- refactor: refs #6802 replace salesPerson references with department in claims and tickets by:jgallego +- refactor: refs #6802 replace 'salesPerson' terminology with 'team' across multiple locales and components by:jgallego +- refactor: refs #6802 update import paths for DepartmentDescriptorProxy to use Worker directory by:jgallego +- refactor: refs #6802 update InvoiceOutNegativeBases to use Department instead of Worker by:jgallego +- refactor: refs #6802 update TicketFilter and TicketSale components to use departmentFk and adjust API endpoints by:jgallego +- refactor: refs #8041 unify class link and unify titles to VnTitles by:benjaminedc +- refactor: refs #8045 modified icon and module const by:Jon +- refactor: refs #8197 rename VnCardBeta to VnCard by:alexm +- refactor: refs #8197 simplify menu retrieval logic in LeftMenu component by:alexm +- refactor: refs #8322 changed Wagon component to use VnSection/VnCardBeta by:provira +- refactor: refs #8322 remove keyBinding from Wagon router module by:alexm +- refactor: refs #8322 update WagonCard component and routing structure by:alexm +- refactor: refs #8370 modified function to get the correct date by:Jon +- refactor: refs #8472 remove added div and add class to VnInput by:jtubau +- refactor: refs #8472 unified styling for the more-create-dialog slot to ensure consistency across all scenarios by:jtubau +- refactor: refs #8472 update class names from q-span-2 to col-span-2 for consistency in layout by:jtubau +- refactor: refs #8600 changed test case description by:provira +- refactor: refs #8600 modified make invoice and send dialog e2es by:Jon +- refactor: refs #8600 modified upcomingDeliveries e2e and created deliveryDays by:Jon +- refactor: refs #8600 modified zoneSummary e2e by:Jon +- refactor: refs #8602 remove redundant date input test from entryList.spec.js by:pablone +- refactor: refs #8606 clear some warnings by:Jon +- refactor: refs #8606 deleted code and fixed translation by:Jon +- refactor: refs #8606 merged previous and e2e changes and corrected minor errors by:Jon +- refactor: refs #8606 requested changes by:Jon +- refactor: refs #8616 integrate summary dialog and update navigation in Agency and Vehicle components by:jtubau +- refactor: refs #8616 integrate VnSelectWorker component in RouteList and optimize format functions by:jtubau +- refactor: refs #8616 simplify template bindings and improve link generation in VehicleSummary by:jtubau +- refactor: refs #8616 update routing components for AgencyList and RouteRoadmap in route.js by:jtubau +- refactor: refs #8619 simplify empty data check in RouteDescriptor component by:jtubau +- refactor: refs #8626 add cardVisible property to RouteList columns by:jtubau +- refactor: refs #8626 add formatting for agency and vehicle columns in RouteList by:jtubau +- refactor: refs #8626 enhance Worker and Agency components with data attributes and improved routing by:jtubau +- refactor: refs #8626 improve test messages and selectors in route tests by:jtubau +- refactor: refs #8626 update button styles and improve route redirection logic by:jtubau +- refactor: refs #8626 update RouteList columns and enable AgencyWorkCenter tests by:jtubau +- refactor: refs #8630 add vehicle translations and enhance route list columns by:jtubau +- refactor: refs #8648 update roadmap deletion test to use current element text by:jtubau +- refactor: refs #8664 enhance CmrList component with query initialization and user parameters by:jtubau +- refactor: refs #8664 localization files by:jtubau +- refactor: refs #8664 remove CmrFilter and replace with VnSearchbar in CmrList by:jtubau +- refactor: remove unnecessary login and reload calls in ClaimDevelopment tests by:alexm +- refactor: simplify client selection in order creation test by:alexm +- refactor: update client ID input selector and remove viewport setting by:alexm +- test: refs #8197 comment out ticket list tests for refactoring by:alexm +- test: refs #8626 refactor notification check in routeList.spec.js by:jtubau +- test: refs #8626 refactor routeList.spec.js to use a constant for summary URL by:jtubau +- test: refs #8626 refactor routeList.spec.js to use selectors and improve readability by:jtubau + +### Fixed 🛠️ + +- fix: add --init flag to Docker container for Cypress tests by:alexm +- fix: agency list filters by:jtubau +- fix: align Article label to the left in EntryBuys component by:alexm +- fix: card descriptor imports by:Jon +- fix: card descriptor merge by:Jon +- fix(ClaimAction): update shelving options to use URL instead of static data by:jgallego +- fix(ClaimSummary): clean url by:alexm +- fix(cypress.config.js): refs #6695 update reporter to junit and remove unused dependencies by:alexm +- fix(cypressParallel.sh): refs #6695 improve script readability by:alexm +- fix(cypressParallel.sh): refs #6695 improve test execution output for clarity by:alexm +- fix(cypressParallel.sh): refs #6695 simplify test execution output format by:alexm +- fix(cypress scripts): refs #6695 improve cleanup process and adjust output redirection by:alexm +- fix: fixed department descriptor icon by:Jon +- fix: fixed submodule descriptors icons by:Jon +- fix(invoiceOutSummary.spec.js): refs #6695 remove unnecessary visibility check for descriptor by:alexm +- fix(Jenkinsfile): reduce parallel Cypress test execution from 3 to 2 by:alexm +- fix(Jenkinsfile): refs #6695 add credentials for Docker login in E2E stage by:alexm +- fix(Jenkinsfile): refs #6695 change parallel test execution from 4 to 2 by:alexm +- fix(Jenkinsfile): refs #6695 increase parallel test execution from 2 to 4 by:alexm +- fix(Jenkinsfile): refs #6695 update parallel test execution to 4 by:alexm +- fix(LeftMenu): refs #8197 handle missing children in findRoute and update menu structure by:alexm +- fix: refs #6695 update Cypress configuration and test result paths by:alexm +- fix: refs #6695 update Jenkinsfile to build Docker image correctly and modify logout test visit method by:alexm +- fix: refs #6695 update Jenkinsfile to remove specific e2e XML files and adjust Cypress parallel execution by:alexm +- fix: refs #6695 update Jenkinsfile to source cypressParallel.sh correctly by:alexm +- fix: refs #6695 update visit method in TicketLackDetail.spec.js to prevent page reload by:alexm +- fix: refs #6802 update import path for DepartmentDescriptorProxy in OrderList.vue by:jgallego +- fix: refs #6802 update OrderFilter to use department relation instead of salesPerson by:jgallego +- fix: refs #8041 update redirection from preview to summary in ShelvingList tests by:benjaminedc +- fix: refs #8041 update selector for summary header in ParkingList tests by:benjaminedc +- fix: refs #8041 update summaryHeader selector in ParkingList test by:benjaminedc +- fix: refs #8322 update order property for WagonList component by:alexm +- fix: refs #8370 change param rely on month by:Jon +- fix: refs #8417 added data-cy to all files and fixed test by:provira +- fix: refs #8417 added data-cy to delete button by:provira +- fix: refs #8417 fixed claimPhoto e2e by:provira +- fix: refs #8417 fixed claimPhoto e2e test by:provira +- fix: refs #8417 fixed e2e test by:provira +- fix: refs #8417 fixed e2e test case by:provira +- fix: refs #8417 fixed failing test case by:provira +- fix: refs #8417 fixed invoiceOutSummary e2e test by:provira +- fix: refs #8417 removed .only by:provira +- fix: refs #8583 basicData, business, summary by:carlossa +- fix: refs #8583 basicData e2e by:carlossa +- fix: refs #8583 basicData timeControl by:carlossa +- fix: refs #8583 cypressconf by:carlossa +- fix: refs #8583 dataCy operator by:carlossa +- fix: refs #8583 fix AddCard by:carlossa +- fix: refs #8583 mutual create by:carlossa +- fix: refs #8583 operator by:carlossa +- fix: refs #8583 remove workerTimeControl by:carlossa +- fix: refs #8583 tMutual, tNotes, TOperator by:carlossa +- fix: refs #8583 wBusiness by:carlossa +- fix: refs #8583 wBusiness e2e by:carlossa +- fix: refs #8583 workerBasicData & workerTimeControl by:carlossa +- fix: refs #8583 workerBusiness by:carlossa +- fix: refs #8583 workerBusiness e2e by:carlossa +- fix: refs #8583 workerBusiness test by:carlossa +- fix: refs #8583 workerE2E by:carlossa +- fix: refs #8583 worker mutual e2e by:carlossa +- fix: refs #8583 workerSummary test by:carlossa +- fix: refs #8583 workerTimeControl by:carlossa +- fix: refs #8583 workerTimeControl e2e by:carlossa +- fix: refs #8600 e2e by:Jon +- fix: refs #8600 fixed calendar e2e by:Jon +- fix: refs #8600 fixed e2e and skip client ones by:Jon +- fix: refs #8600 fixed e2e by:Jon +- fix: refs #8600 fixed invoiceOut summary e2e by:Jon +- fix: refs #8600 fixed zoneList & added test case to zoneSummary by:provira +- fix: refs #8600 zone basic data e2e and skip intermitent invoice out summary it by:Jon +- fix: refs #8602 delete unused entryDms and stockBought test files (origin/8581-e2eInvoiceIn) by:pablone +- fix: refs #8606 deleted code by:Jon +- fix: refs #8612 changed QCheckbox for VnCheckbox by:provira +- fix: refs #8612 fixed shelving e2e tests by:provira +- fix: refs #8616 add conditional for SupplierDescriptorProxy and bind attributes in CardDescriptor by:jtubau +- fix: refs #8616 remove redundant v-on binding from QCheckbox in VnCheckbox.vue by:jtubau +- fix: refs #8616 update binding syntax for is-editable prop in AgencyList.vue by:jtubau +- fix: refs #8616 update FormModel prop from 'update-url' to 'url-update' in Agency and RoadMap BasicData by:jtubau +- fix: refs #8619 handle empty ticket records in RouteDescriptor component by:jtubau +- fix: refs #8619 update route descriptor to handle empty ticket records and adjust test cases by:jtubau +- fix: refs #8626 remove duplicate ref attribute from RouteList.vue by:jtubau +- fix: refs #8630 remove duplicated locations by:jtubau +- fix: refs #8638 restore invoiceInBasicData by:pablone +- fix: refs #8638 update comment formatting in VnTable.vue by:pablone +- fix: refs #8638 update null check for maxlength validation in VnInput.vue by:pablone +- fix: simplify menu structure in monitor router module (origin/fix_monitor_leftMenu) by:Javier Segarra +- refactor: refs #6695 fix invoiceOutSummary by:alexm +- refactor: refs #8606 deleted code and fixed translation by:Jon +- test: fix intermitent e2e by:alexm +- test: fix orderList e2e, unestables by:alexm +- test(OrderList): fix inconsistency by:alexm +- test(TicketList): fix inconsistency by:alexm + # Version 25.10 - 2025-03-11 ### Added 🆕 From 0361958b47c47ef94819d0fec2ca67b99a5cc103 Mon Sep 17 00:00:00 2001 From: jorgep <jorgep@verdnatura.es> Date: Tue, 25 Mar 2025 09:37:46 +0100 Subject: [PATCH 38/59] test: refs #8388 remove exclusive focus from Invoice creation test --- test/cypress/integration/invoiceIn/invoiceInList.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/cypress/integration/invoiceIn/invoiceInList.spec.js b/test/cypress/integration/invoiceIn/invoiceInList.spec.js index 3338684d6..d0d87d9f0 100644 --- a/test/cypress/integration/invoiceIn/invoiceInList.spec.js +++ b/test/cypress/integration/invoiceIn/invoiceInList.spec.js @@ -36,7 +36,7 @@ describe('InvoiceInList', () => { cy.get(summaryHeaders).eq(4).contains('Vat'); }); - it.only('should create a new Invoice', () => { + it('should create a new Invoice', () => { cy.dataCy('vnTableCreateBtn').click(); cy.fillInForm({ ...mock }, { attr: 'data-cy' }); cy.dataCy('FormModelPopup_save').click(); From 0014356b3358709a4d5401d49f592e1bf93a2109 Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Tue, 25 Mar 2025 10:08:58 +0100 Subject: [PATCH 39/59] fix: use store instead formData --- src/pages/Ticket/Card/BasicData/TicketBasicDataView.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/Ticket/Card/BasicData/TicketBasicDataView.vue b/src/pages/Ticket/Card/BasicData/TicketBasicDataView.vue index 3c2fe95e5..76191b099 100644 --- a/src/pages/Ticket/Card/BasicData/TicketBasicDataView.vue +++ b/src/pages/Ticket/Card/BasicData/TicketBasicDataView.vue @@ -44,7 +44,7 @@ const getPriceDifference = async () => { shipped: ticket.value.shipped, }; const { data } = await axios.post( - `tickets/${formData.value.id}/priceDifference`, + `tickets/${ticket.value.id}/priceDifference`, params, ); ticket.value.sale = data; @@ -71,7 +71,7 @@ const submit = async () => { }; const { data } = await axios.post( - `tickets/${formData.value.id}/componentUpdate`, + `tickets/${ticket.value.id}/componentUpdate`, params, ); From 9446202dee42c3a48e2aacb17c5a04d626f1457d Mon Sep 17 00:00:00 2001 From: alexm <alexm@verdnatura.es> Date: Tue, 25 Mar 2025 11:30:09 +0100 Subject: [PATCH 40/59] fix: update file path in useDescriptorStore to remove leading slash --- src/stores/useDescriptorStore.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/stores/useDescriptorStore.js b/src/stores/useDescriptorStore.js index 89189f32e..c6a95fa85 100644 --- a/src/stores/useDescriptorStore.js +++ b/src/stores/useDescriptorStore.js @@ -8,7 +8,7 @@ export const useDescriptorStore = defineStore('descriptorStore', () => { if (Object.keys(descriptors).length) return descriptors; const currentDescriptors = {}; - const files = import.meta.glob(`/src/**/*DescriptorProxy.vue`); + const files = import.meta.glob(`src/**/*DescriptorProxy.vue`); const moduleParser = { account: 'user', client: 'customer', From af5a850311debf2d612e4dd1d824a9d5a4d37ee2 Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Tue, 25 Mar 2025 11:41:04 +0100 Subject: [PATCH 41/59] fix: remove create prop departmentFk --- src/pages/Customer/Card/CustomerDescriptor.vue | 9 --------- .../Customer/Card/CustomerDescriptorMenu.vue | 17 ----------------- src/pages/Order/OrderList.vue | 1 - 3 files changed, 27 deletions(-) diff --git a/src/pages/Customer/Card/CustomerDescriptor.vue b/src/pages/Customer/Card/CustomerDescriptor.vue index 8978c00f1..bd127c9ed 100644 --- a/src/pages/Customer/Card/CustomerDescriptor.vue +++ b/src/pages/Customer/Card/CustomerDescriptor.vue @@ -105,15 +105,6 @@ const debtWarning = computed(() => { > <QTooltip>{{ t('customer.card.isDisabled') }}</QTooltip> </QIcon> - - <QIcon - v-if="entity?.substitutionAllowed" - name="help" - size="xs" - color="primary" - > - <QTooltip>{{ t('Allowed substitution') }}</QTooltip> - </QIcon> <QIcon v-if="!entity.account?.active" color="primary" diff --git a/src/pages/Customer/Card/CustomerDescriptorMenu.vue b/src/pages/Customer/Card/CustomerDescriptorMenu.vue index aea45721c..fb78eab69 100644 --- a/src/pages/Customer/Card/CustomerDescriptorMenu.vue +++ b/src/pages/Customer/Card/CustomerDescriptorMenu.vue @@ -61,16 +61,6 @@ const openCreateForm = (type) => { .join('&'); useOpenURL(`/#/${type}/list?${params}`); }; -const updateSubstitutionAllowed = async () => { - try { - await axios.patch(`Clients/${route.params.id}`, { - substitutionAllowed: !$props.customer.substitutionAllowed, - }); - notify('globals.notificationSent', 'positive'); - } catch (error) { - notify(error.message, 'positive'); - } -}; </script> <template> @@ -79,13 +69,6 @@ const updateSubstitutionAllowed = async () => { {{ t('globals.pageTitles.createTicket') }} </QItemSection> </QItem> - <QItem v-ripple clickable> - <QItemSection @click="updateSubstitutionAllowed()">{{ - $props.customer.substitutionAllowed - ? t('Disable substitution') - : t('Allow substitution') - }}</QItemSection> - </QItem> <QItem v-ripple clickable> <QItemSection @click="showSmsDialog()">{{ t('Send SMS') }}</QItemSection> </QItem> diff --git a/src/pages/Order/OrderList.vue b/src/pages/Order/OrderList.vue index d75390d96..1241c4ee2 100644 --- a/src/pages/Order/OrderList.vue +++ b/src/pages/Order/OrderList.vue @@ -65,7 +65,6 @@ const columns = computed(() => [ attrs: { url: 'Departments', }, - create: true, columnField: { component: null, }, From c0e9efc5d8b36fafd33de1547c5b7cdab02eab13 Mon Sep 17 00:00:00 2001 From: alexm <alexm@verdnatura.es> Date: Tue, 25 Mar 2025 11:54:14 +0100 Subject: [PATCH 42/59] fix(useDescriptorStore): simplify async component import logic --- src/stores/useDescriptorStore.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/stores/useDescriptorStore.js b/src/stores/useDescriptorStore.js index c6a95fa85..425411709 100644 --- a/src/stores/useDescriptorStore.js +++ b/src/stores/useDescriptorStore.js @@ -16,9 +16,7 @@ export const useDescriptorStore = defineStore('descriptorStore', () => { for (const file in files) { const name = file.split('/').at(-1).slice(0, -19).toLowerCase(); const descriptor = moduleParser[name] ?? name; - currentDescriptors[descriptor + 'Fk'] = defineAsyncComponent( - () => import(/* @vite-ignore */ file), - ); + currentDescriptors[descriptor + 'Fk'] = defineAsyncComponent(files[file]); } setDescriptors(currentDescriptors); return currentDescriptors; From 79e6530d3965e45174fb96ae3f74ba1dacf462c1 Mon Sep 17 00:00:00 2001 From: Javier Segarra <jsegarra@verdnatura.es> Date: Tue, 25 Mar 2025 12:23:49 +0100 Subject: [PATCH 43/59] docs: add production serving instructions to README --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index d280e29ce..8eff99137 100644 --- a/README.md +++ b/README.md @@ -49,3 +49,9 @@ pnpm run test:e2e:summary ```bash quasar build ``` + +### Serve the app for production + +```bash +quasar build quasar serve dist/spa --host 0.0.0.0 --proxy=./proxy-serve.js +``` From 6dffa7823545a8b6995775343f31b0a008bce1ba Mon Sep 17 00:00:00 2001 From: alexm <alexm@verdnatura.es> Date: Tue, 25 Mar 2025 12:47:43 +0100 Subject: [PATCH 44/59] fix(useDescriptorStore): correct file path for descriptor proxy imports --- src/stores/useDescriptorStore.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/stores/useDescriptorStore.js b/src/stores/useDescriptorStore.js index 425411709..a5b83a42e 100644 --- a/src/stores/useDescriptorStore.js +++ b/src/stores/useDescriptorStore.js @@ -8,7 +8,7 @@ export const useDescriptorStore = defineStore('descriptorStore', () => { if (Object.keys(descriptors).length) return descriptors; const currentDescriptors = {}; - const files = import.meta.glob(`src/**/*DescriptorProxy.vue`); + const files = import.meta.glob(`/src/**/*DescriptorProxy.vue`); const moduleParser = { account: 'user', client: 'customer', From 77df2d40ecd32ff2ea6dc70b5cd2938b7e32d851 Mon Sep 17 00:00:00 2001 From: alexm <alexm@verdnatura.es> Date: Tue, 25 Mar 2025 12:51:21 +0100 Subject: [PATCH 45/59] fix(VnLog): refs #6994 simplify value binding and improve descriptor handling --- src/components/common/VnLog.vue | 12 +++++------- src/components/common/VnLogValue.vue | 24 +++++++++++++++--------- src/stores/useDescriptorStore.js | 2 +- 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/src/components/common/VnLog.vue b/src/components/common/VnLog.vue index 804147539..7402ceb3e 100644 --- a/src/components/common/VnLog.vue +++ b/src/components/common/VnLog.vue @@ -561,9 +561,7 @@ watch( }}: </span> <VnLogValue - :value=" - value.val.val - " + :value="value.val" :name="value.name" /> </QItem> @@ -616,7 +614,7 @@ watch( {{ prop.nameI18n }}: </span> <VnLogValue - :value="prop.val.val" + :value="prop.val" :name="prop.name" /> <span @@ -647,7 +645,7 @@ watch( </span> <span v-if="log.action == 'update'"> <VnLogValue - :value="prop.old.val" + :value="prop.old" :name="prop.name" /> <span @@ -658,7 +656,7 @@ watch( </span> → <VnLogValue - :value="prop.val.val" + :value="prop.val" :name="prop.name" /> <span @@ -670,7 +668,7 @@ watch( </span> <span v-else="prop.old.val"> <VnLogValue - :value="prop.val.val" + :value="prop.val" :name="prop.name" /> <span diff --git a/src/components/common/VnLogValue.vue b/src/components/common/VnLogValue.vue index df0be4011..3f1617ce7 100644 --- a/src/components/common/VnLogValue.vue +++ b/src/components/common/VnLogValue.vue @@ -5,18 +5,24 @@ import { computed } from 'vue'; const descriptorStore = useDescriptorStore(); const $props = defineProps({ - name: { type: [String], default: undefined }, + value: { type: Object, default: () => {} }, + name: { type: String, default: undefined }, }); const descriptor = computed(() => descriptorStore.has($props.name)); </script> <template> - <VnJsonValue v-bind="$attrs" /> - <QIcon - name="launch" - class="link" - v-if="$attrs.value && descriptor" - :data-cy="'iconLaunch-' + $props.name" - /> - <component :is="descriptor" :id="$attrs.value" v-if="$attrs.value && descriptor" /> + <VnJsonValue :value="value.val" /> + <span + v-if="(value.id || typeof value.val == 'number') && descriptor" + style="margin-left: 2px" + > + <QIcon + name="launch" + class="link" + :data-cy="'iconLaunch-' + $props.name" + style="padding-bottom: 2px" + /> + <component :is="descriptor" :id="value.id ?? value.val" /> + </span> </template> diff --git a/src/stores/useDescriptorStore.js b/src/stores/useDescriptorStore.js index a5b83a42e..be342b016 100644 --- a/src/stores/useDescriptorStore.js +++ b/src/stores/useDescriptorStore.js @@ -11,7 +11,7 @@ export const useDescriptorStore = defineStore('descriptorStore', () => { const files = import.meta.glob(`/src/**/*DescriptorProxy.vue`); const moduleParser = { account: 'user', - client: 'customer', + customer: 'client', }; for (const file in files) { const name = file.split('/').at(-1).slice(0, -19).toLowerCase(); From 31205d40d39de60b6cf6e6f3aad43163cd1b3cff Mon Sep 17 00:00:00 2001 From: pablone <pablone@verdnatura.es> Date: Tue, 25 Mar 2025 14:01:29 +0100 Subject: [PATCH 46/59] fix: update default DMS code and improve filter handling in various components --- src/components/common/VnDmsInput.vue | 2 +- src/pages/Entry/Card/EntryBuys.vue | 2 +- src/pages/Entry/Card/EntryDescriptor.vue | 2 +- src/pages/Entry/EntryStockBought.vue | 1 + src/pages/Travel/Card/TravelSummary.vue | 10 ++++++---- src/pages/Travel/TravelFilter.vue | 4 +++- 6 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/components/common/VnDmsInput.vue b/src/components/common/VnDmsInput.vue index 25d625d5d..5a3ef351b 100644 --- a/src/components/common/VnDmsInput.vue +++ b/src/components/common/VnDmsInput.vue @@ -15,7 +15,7 @@ const editDownloadDisabled = ref(false); const $props = defineProps({ defaultDmsCode: { type: String, - default: 'InvoiceIn', + default: 'invoiceIn', }, disable: { type: Boolean, diff --git a/src/pages/Entry/Card/EntryBuys.vue b/src/pages/Entry/Card/EntryBuys.vue index a93b0801b..dedc9fc85 100644 --- a/src/pages/Entry/Card/EntryBuys.vue +++ b/src/pages/Entry/Card/EntryBuys.vue @@ -648,7 +648,7 @@ onMounted(() => { :url="`Entries/${entityId}/getBuyList`" search-url="EntryBuys" save-url="Buys/crud" - :filter="filter" + :filter="editableMode ? filter : {}" :disable-option="{ card: true }" v-model:selected="selectedRows" @on-fetch="() => footerFetchDataRef.fetch()" diff --git a/src/pages/Entry/Card/EntryDescriptor.vue b/src/pages/Entry/Card/EntryDescriptor.vue index 784f6e8a3..9a8b79744 100644 --- a/src/pages/Entry/Card/EntryDescriptor.vue +++ b/src/pages/Entry/Card/EntryDescriptor.vue @@ -147,7 +147,7 @@ async function deleteEntry() { <template> <CardDescriptor :url="`Entries/${entityId}`" - :user-filter="entryFilter" + :filter="entryFilter" title="supplier.nickname" data-key="Entry" width="lg-width" diff --git a/src/pages/Entry/EntryStockBought.vue b/src/pages/Entry/EntryStockBought.vue index 6168f0737..9e97e2ad5 100644 --- a/src/pages/Entry/EntryStockBought.vue +++ b/src/pages/Entry/EntryStockBought.vue @@ -116,6 +116,7 @@ const filter = computed(() => ({ hour: 0, minute: 0, second: 0, + milliseconds: 0, }), m3: { neq: null }, }, diff --git a/src/pages/Travel/Card/TravelSummary.vue b/src/pages/Travel/Card/TravelSummary.vue index 9f9552611..da933de60 100644 --- a/src/pages/Travel/Card/TravelSummary.vue +++ b/src/pages/Travel/Card/TravelSummary.vue @@ -199,7 +199,11 @@ const entriesTotals = computed(() => { entriesTableRows.value.forEach((row) => { for (const key in totals) { - totals[key] += row[key] || 0; + if (key === 'cc') { + totals[key] += Math.ceil(row[key] || 0); + } else { + totals[key] += row[key] || 0; + } } }); @@ -337,9 +341,7 @@ const getLink = (param) => `#/travel/${entityId.value}/${param}`; <VnLv :label="t('globals.totalEntries')" :value="travel.totalEntries" /> <VnLv :label="t('travel.summary.availabled')" - :value=" - dashIfEmpty(toDateTimeFormat(travel.availabled)) - " + :value="dashIfEmpty(toDateTimeFormat(travel.availabled))" /> </QCard> <QCard class="full-width"> diff --git a/src/pages/Travel/TravelFilter.vue b/src/pages/Travel/TravelFilter.vue index 4a9c80952..d2cf6092d 100644 --- a/src/pages/Travel/TravelFilter.vue +++ b/src/pages/Travel/TravelFilter.vue @@ -89,7 +89,7 @@ defineExpose({ states }); /> <VnSelect :label="t('travel.warehouseOut')" - v-model="params.warehouseOut" + v-model="params.warehouseOutFk" @update:model-value="searchFn()" url="warehouses" :use-like="false" @@ -140,6 +140,7 @@ en: ref: Reference agency: Agency warehouseInFk: Warehouse In + warehouseOutFk: Warehouse Out shipped: Shipped shipmentHour: Shipment Hour warehouseOut: Warehouse Out @@ -153,6 +154,7 @@ es: ref: Referencia agency: Agencia warehouseInFk: Alm.Entrada + warehouseOutFk: Alm.Salida shipped: F.Envío shipmentHour: Hora de envío warehouseOut: Alm.Salida From 90f6486fc1495cdd347a79d1971c1e94513ce9fd Mon Sep 17 00:00:00 2001 From: Jon <jon@verdnatura.es> Date: Tue, 25 Mar 2025 14:20:38 +0100 Subject: [PATCH 47/59] refactor: refs #7358 use QBadge instead of QChip --- src/components/NavBar.vue | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/components/NavBar.vue b/src/components/NavBar.vue index 6365fcd07..c71a0a887 100644 --- a/src/components/NavBar.vue +++ b/src/components/NavBar.vue @@ -25,9 +25,9 @@ const getEnvironment = computed(() => { case 'development': return 'DEV'; case 'production': - return; + return null; default: - return env.toUpperCase(); + return env; } }); onMounted(() => stateStore.setMounted()); @@ -60,10 +60,10 @@ const refresh = () => window.location.reload(); {{ t('globals.backToDashboard') }} </QTooltip> </QBtn> + <QBadge v-if="getEnvironment" color="primary" align="top"> + {{ getEnvironment }} + </QBadge> </RouterLink> - <QChip class="q-ml-xs q-mr-xs envChip"> - {{ getEnvironment }} - </QChip> <VnBreadcrumbs v-if="$q.screen.gt.sm" /> <QSpinner color="primary" @@ -132,7 +132,4 @@ const refresh = () => window.location.reload(); .q-header { background-color: var(--vn-section-color); } -.envChip { - background-color: $primary; -} </style> From ef3a2c0ee99b5f23f7ad2ef737c4f96174730888 Mon Sep 17 00:00:00 2001 From: Jon <jon@verdnatura.es> Date: Tue, 25 Mar 2025 15:10:57 +0100 Subject: [PATCH 48/59] refactor: refs #7358 use location.hostname --- src/components/NavBar.vue | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/components/NavBar.vue b/src/components/NavBar.vue index c71a0a887..7329ddae2 100644 --- a/src/components/NavBar.vue +++ b/src/components/NavBar.vue @@ -18,18 +18,15 @@ const state = useState(); const user = state.getUser(); const appName = 'Lilium'; const pinnedModulesRef = ref(); -const env = process.env.NODE_ENV; +const hostname = window.location.hostname; +const env = ref(); const getEnvironment = computed(() => { - switch (env) { - case 'development': - return 'DEV'; - case 'production': - return null; - default: - return env; - } + env.value = hostname.split('-'); + if (env.value.length <= 1) return; + return env.value[0]; }); + onMounted(() => stateStore.setMounted()); const refresh = () => window.location.reload(); </script> From 73c6b7dea9ee720d44411424be758ec95c42012b Mon Sep 17 00:00:00 2001 From: jorgep <jorgep@verdnatura.es> Date: Tue, 25 Mar 2025 17:34:10 +0100 Subject: [PATCH 49/59] fix: refs #8388 update tooltip message in InvoiceInSummary to include total taxable base --- src/pages/InvoiceIn/Card/InvoiceInSummary.vue | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/pages/InvoiceIn/Card/InvoiceInSummary.vue b/src/pages/InvoiceIn/Card/InvoiceInSummary.vue index dad1da8d6..74936f00a 100644 --- a/src/pages/InvoiceIn/Card/InvoiceInSummary.vue +++ b/src/pages/InvoiceIn/Card/InvoiceInSummary.vue @@ -304,7 +304,10 @@ const getLink = (param) => `#/invoice-in/${entityId.value}/${param}`; :color="amountsNotMatch ? 'negative' : 'transparent'" :title=" amountsNotMatch - ? t('invoiceIn.summary.noMatch') + ? t('invoiceIn.noMatch', { + totalTaxableBase: + entity.totals.totalTaxableBase, + }) : t('invoiceIn.summary.dueTotal') " > From 02e29c167a38a4ef1c391d25f378f238fdf36285 Mon Sep 17 00:00:00 2001 From: pablone <pablone@verdnatura.es> Date: Wed, 26 Mar 2025 07:46:39 +0100 Subject: [PATCH 50/59] feat: add rounded CC field to travel summary and translations --- src/i18n/locale/en.yml | 1 + src/i18n/locale/es.yml | 1 + src/pages/Travel/Card/TravelSummary.vue | 25 +++++++++++++++++++++---- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/i18n/locale/en.yml b/src/i18n/locale/en.yml index d0911d41d..09431dce0 100644 --- a/src/i18n/locale/en.yml +++ b/src/i18n/locale/en.yml @@ -841,6 +841,7 @@ travel: availabledHour: Availabled hour thermographs: Thermographs hb: HB + roundedCc: Rounded CC basicData: daysInForward: Automatic movement (Raid) isRaid: Raid diff --git a/src/i18n/locale/es.yml b/src/i18n/locale/es.yml index ac441d28d..10ff812df 100644 --- a/src/i18n/locale/es.yml +++ b/src/i18n/locale/es.yml @@ -924,6 +924,7 @@ travel: availabled: F. Disponible availabledHour: Hora Disponible hb: HB + roundedCc: CC redondeado basicData: daysInForward: Desplazamiento automatico (redada) isRaid: Redada diff --git a/src/pages/Travel/Card/TravelSummary.vue b/src/pages/Travel/Card/TravelSummary.vue index 9f9552611..5a824ddc3 100644 --- a/src/pages/Travel/Card/TravelSummary.vue +++ b/src/pages/Travel/Card/TravelSummary.vue @@ -91,6 +91,13 @@ const entriesTableColumns = computed(() => { showValue: true, }, { label: 'CC', field: 'cc', name: 'cc', align: 'left', showValue: true }, + { + label: t('travel.summary.roundedCc'), + field: 'cc', + name: 'roundedCc', + align: 'left', + showValue: true, + }, { label: 'Pallet', field: 'pallet', @@ -193,13 +200,18 @@ const entriesTotals = computed(() => { freightValue: 0, packageValue: 0, cc: 0, + roundedCc: 0, pallet: 0, m3: 0, }; entriesTableRows.value.forEach((row) => { for (const key in totals) { - totals[key] += row[key] || 0; + if (key === 'roundedCc') { + totals['roundedCc'] += Math.ceil(row['cc'] || 0); + } else { + totals[key] += row[key] || 0; + } } }); @@ -208,6 +220,7 @@ const entriesTotals = computed(() => { freight: toCurrency(totals.freightValue), packageValue: toCurrency(totals.packageValue), cc: totals.cc.toFixed(2), + roundedCc: totals.roundedCc, pallet: totals.pallet.toFixed(2), m3: totals.m3.toFixed(2), }; @@ -337,9 +350,7 @@ const getLink = (param) => `#/travel/${entityId.value}/${param}`; <VnLv :label="t('globals.totalEntries')" :value="travel.totalEntries" /> <VnLv :label="t('travel.summary.availabled')" - :value=" - dashIfEmpty(toDateTimeFormat(travel.availabled)) - " + :value="dashIfEmpty(toDateTimeFormat(travel.availabled))" /> </QCard> <QCard class="full-width"> @@ -376,6 +387,11 @@ const getLink = (param) => `#/travel/${entityId.value}/${param}`; </QBtn> </QTd> </template> + <template #body-cell-roundedCc="{ col, value }"> + <QTd> + {{ Math.ceil(value) || 0 }} + </QTd> + </template> <template #body-cell-observation="{ value }"> <QTd> <QIcon name="insert_drive_file" color="primary" size="24px"> @@ -392,6 +408,7 @@ const getLink = (param) => `#/travel/${entityId.value}/${param}`; <QTd class="text-bold">{{ entriesTotals.freight }}</QTd> <QTd class="text-bold">{{ entriesTotals.packageValue }}</QTd> <QTd class="text-bold">{{ entriesTotals.cc }}</QTd> + <QTd class="text-bold">{{ entriesTotals.roundedCc }}</QTd> <QTd class="text-bold">{{ entriesTotals.pallet }}</QTd> <QTd class="text-bold">{{ entriesTotals.m3 }}</QTd> </template> From 659d73e11a559175f1b392955153d399e5650a1f Mon Sep 17 00:00:00 2001 From: alexm <alexm@verdnatura.es> Date: Wed, 26 Mar 2025 08:13:42 +0100 Subject: [PATCH 51/59] test: skip RouteAutonomous tests temporarily --- test/cypress/integration/route/routeAutonomous.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/cypress/integration/route/routeAutonomous.spec.js b/test/cypress/integration/route/routeAutonomous.spec.js index acf82bd95..08fd7d7ea 100644 --- a/test/cypress/integration/route/routeAutonomous.spec.js +++ b/test/cypress/integration/route/routeAutonomous.spec.js @@ -1,4 +1,4 @@ -describe('RouteAutonomous', () => { +describe.skip('RouteAutonomous', () => { const getLinkSelector = (colField) => `tr:first-child > [data-col-field="${colField}"] > .no-padding > .link`; From bbc03ddcad713bce6fbcb14c26bf283bca12ff56 Mon Sep 17 00:00:00 2001 From: alexm <alexm@verdnatura.es> Date: Wed, 26 Mar 2025 08:30:20 +0100 Subject: [PATCH 52/59] fix: remove duplicated department selection from MonitorTicketFilter --- src/pages/Monitor/Ticket/MonitorTicketFilter.vue | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/src/pages/Monitor/Ticket/MonitorTicketFilter.vue b/src/pages/Monitor/Ticket/MonitorTicketFilter.vue index 447dd35b8..258a90583 100644 --- a/src/pages/Monitor/Ticket/MonitorTicketFilter.vue +++ b/src/pages/Monitor/Ticket/MonitorTicketFilter.vue @@ -209,20 +209,6 @@ const getLocale = (label) => { /> </QItemSection> </QItem> - <QItem> - <QItemSection> - <VnSelect - outlined - dense - rounded - :label="t('globals.params.departmentFk')" - v-model="params.department" - option-label="name" - option-value="name" - url="Departments" - /> - </QItemSection> - </QItem> <QItem> <QItemSection> <VnSelect From 42d613429fcbba851a7a4d31ded907d4b0e126f7 Mon Sep 17 00:00:00 2001 From: pablone <pablone@verdnatura.es> Date: Wed, 26 Mar 2025 09:55:26 +0100 Subject: [PATCH 53/59] test: mark specific tests as skipped for tasks 8814 and 8779 --- test/cypress/integration/route/routeExtendedList.spec.js | 3 ++- test/cypress/integration/ticket/ticketList.spec.js | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/test/cypress/integration/route/routeExtendedList.spec.js b/test/cypress/integration/route/routeExtendedList.spec.js index fb2885f35..2d59b5514 100644 --- a/test/cypress/integration/route/routeExtendedList.spec.js +++ b/test/cypress/integration/route/routeExtendedList.spec.js @@ -146,7 +146,8 @@ describe('Route extended list', () => { cy.readFile(`${downloadsFolder}/${fileName}`).should('exist'); }); - it('Should mark as served the selected route', () => { + // task https://redmine.verdnatura.es/issues/8814 + xit('Should mark as served the selected route', () => { cy.get(selectors.lastRowSelectCheckBox).click(); cy.get(selectors.markServedBtn).click(); diff --git a/test/cypress/integration/ticket/ticketList.spec.js b/test/cypress/integration/ticket/ticketList.spec.js index 5613a5854..85356ed15 100644 --- a/test/cypress/integration/ticket/ticketList.spec.js +++ b/test/cypress/integration/ticket/ticketList.spec.js @@ -35,7 +35,8 @@ describe('TicketList', () => { cy.get('.summaryBody').should('exist'); }); - it('filter client and create ticket', () => { + // task https://redmine.verdnatura.es/issues/8779 + xit('filter client and create ticket', () => { cy.intercept('GET', /\/api\/Tickets\/filter/).as('ticketSearchbar'); searchResults(); cy.wait('@ticketSearchbar'); From 1a1b39960694139e855a03ec8f068cc3a9365297 Mon Sep 17 00:00:00 2001 From: pablone <pablone@verdnatura.es> Date: Wed, 26 Mar 2025 09:57:40 +0100 Subject: [PATCH 54/59] fix: move warning badge condition to the correct position in getBadgeAttrs function --- src/pages/Entry/EntryList.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/Entry/EntryList.vue b/src/pages/Entry/EntryList.vue index 5ebad3144..556f89b0e 100644 --- a/src/pages/Entry/EntryList.vue +++ b/src/pages/Entry/EntryList.vue @@ -249,7 +249,6 @@ function getBadgeAttrs(row) { let timeDiff = today - timeTicket; if (timeDiff > 0) return { color: 'info', 'text-color': 'black' }; - if (timeDiff < 0) return { color: 'warning', 'text-color': 'black' }; switch (row.entryTypeCode) { case 'regularization': case 'life': @@ -274,6 +273,7 @@ function getBadgeAttrs(row) { default: break; } + if (timeDiff < 0) return { color: 'warning', 'text-color': 'black' }; return { color: 'transparent' }; } From 4e83c31d354c099fd667fcde204f60f149381a63 Mon Sep 17 00:00:00 2001 From: alexm <alexm@verdnatura.es> Date: Wed, 26 Mar 2025 09:59:11 +0100 Subject: [PATCH 55/59] feat: refs #6994 create ParkingDescriptorProxy to VnLog --- .../Parking/Card/ParkingDescriptorProxy.vue | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 src/pages/Shelving/Parking/Card/ParkingDescriptorProxy.vue diff --git a/src/pages/Shelving/Parking/Card/ParkingDescriptorProxy.vue b/src/pages/Shelving/Parking/Card/ParkingDescriptorProxy.vue new file mode 100644 index 000000000..e78a2b238 --- /dev/null +++ b/src/pages/Shelving/Parking/Card/ParkingDescriptorProxy.vue @@ -0,0 +1,14 @@ +<script setup> +import ParkingDescriptor from './ParkingDescriptor.vue'; +import ParkingSummary from './ParkingSummary.vue'; +</script> +<template> + <QPopupProxy style="max-width: 10px"> + <ParkingDescriptor + v-if="$attrs.id" + v-bind="$attrs.id" + :summary="ParkingSummary" + :proxy-render="true" + /> + </QPopupProxy> +</template> From 1b280ef9fc8a544d86b18a3a261ce434673c0043 Mon Sep 17 00:00:00 2001 From: alexm <alexm@verdnatura.es> Date: Wed, 26 Mar 2025 10:03:53 +0100 Subject: [PATCH 56/59] refactor: rename cardDescriptor to vnDescriptor in localization files --- src/i18n/locale/en.yml | 2 +- src/i18n/locale/es.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/i18n/locale/en.yml b/src/i18n/locale/en.yml index c62305f95..5118c16c0 100644 --- a/src/i18n/locale/en.yml +++ b/src/i18n/locale/en.yml @@ -884,7 +884,7 @@ components: openCard: View openSummary: Summary viewSummary: Summary - cardDescriptor: + vnDescriptor: mainList: Main list summary: Summary moreOptions: More options diff --git a/src/i18n/locale/es.yml b/src/i18n/locale/es.yml index 86d15e985..a1a173bf3 100644 --- a/src/i18n/locale/es.yml +++ b/src/i18n/locale/es.yml @@ -968,7 +968,7 @@ components: openCard: Ficha openSummary: Detalles viewSummary: Vista previa - cardDescriptor: + vnDescriptor: mainList: Listado principal summary: Resumen moreOptions: Más opciones From ef2ce0500e7e81bb15d254f2f06baa856438a280 Mon Sep 17 00:00:00 2001 From: pablone <pablone@verdnatura.es> Date: Wed, 26 Mar 2025 12:05:32 +0100 Subject: [PATCH 57/59] test: mark route cloning test as skipped for task 8814 --- test/cypress/integration/route/routeExtendedList.spec.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/cypress/integration/route/routeExtendedList.spec.js b/test/cypress/integration/route/routeExtendedList.spec.js index 2d59b5514..fee8369e3 100644 --- a/test/cypress/integration/route/routeExtendedList.spec.js +++ b/test/cypress/integration/route/routeExtendedList.spec.js @@ -118,8 +118,8 @@ describe('Route extended list', () => { cy.validateContent(selector, value); }); }); - - it('Should clone selected route and add ticket', () => { + // task https://redmine.verdnatura.es/issues/8814 + xit('Should clone selected route and add ticket', () => { cy.get(selectors.firstRowSelectCheckBox).click(); cy.get(selectors.cloneBtn).click(); cy.dataCy('Starting date_inputDate').type('01-01-2001'); From dcc45cf3d4a4b173ea18a9b7ddab3a6cb17e4e95 Mon Sep 17 00:00:00 2001 From: pablone <pablone@verdnatura.es> Date: Wed, 26 Mar 2025 12:38:53 +0100 Subject: [PATCH 58/59] test: skip TicketList test suite --- test/cypress/integration/ticket/ticketList.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/cypress/integration/ticket/ticketList.spec.js b/test/cypress/integration/ticket/ticketList.spec.js index 85356ed15..fb6a1a641 100644 --- a/test/cypress/integration/ticket/ticketList.spec.js +++ b/test/cypress/integration/ticket/ticketList.spec.js @@ -1,5 +1,5 @@ /// <reference types="cypress" /> -describe('TicketList', () => { +describe.skip('TicketList', () => { const firstRow = 'tbody.q-virtual-scroll__content tr:nth-child(1)'; beforeEach(() => { From 522e900e550835310b3f853551671138c188b74c Mon Sep 17 00:00:00 2001 From: alexm <alexm@verdnatura.es> Date: Wed, 26 Mar 2025 13:23:56 +0100 Subject: [PATCH 59/59] test: enable previously skipped tests in route and ticket list --- test/cypress/integration/route/routeExtendedList.spec.js | 7 +++---- test/cypress/integration/ticket/ticketList.spec.js | 5 ++--- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/test/cypress/integration/route/routeExtendedList.spec.js b/test/cypress/integration/route/routeExtendedList.spec.js index fee8369e3..fb2885f35 100644 --- a/test/cypress/integration/route/routeExtendedList.spec.js +++ b/test/cypress/integration/route/routeExtendedList.spec.js @@ -118,8 +118,8 @@ describe('Route extended list', () => { cy.validateContent(selector, value); }); }); - // task https://redmine.verdnatura.es/issues/8814 - xit('Should clone selected route and add ticket', () => { + + it('Should clone selected route and add ticket', () => { cy.get(selectors.firstRowSelectCheckBox).click(); cy.get(selectors.cloneBtn).click(); cy.dataCy('Starting date_inputDate').type('01-01-2001'); @@ -146,8 +146,7 @@ describe('Route extended list', () => { cy.readFile(`${downloadsFolder}/${fileName}`).should('exist'); }); - // task https://redmine.verdnatura.es/issues/8814 - xit('Should mark as served the selected route', () => { + it('Should mark as served the selected route', () => { cy.get(selectors.lastRowSelectCheckBox).click(); cy.get(selectors.markServedBtn).click(); diff --git a/test/cypress/integration/ticket/ticketList.spec.js b/test/cypress/integration/ticket/ticketList.spec.js index fb6a1a641..5613a5854 100644 --- a/test/cypress/integration/ticket/ticketList.spec.js +++ b/test/cypress/integration/ticket/ticketList.spec.js @@ -1,5 +1,5 @@ /// <reference types="cypress" /> -describe.skip('TicketList', () => { +describe('TicketList', () => { const firstRow = 'tbody.q-virtual-scroll__content tr:nth-child(1)'; beforeEach(() => { @@ -35,8 +35,7 @@ describe.skip('TicketList', () => { cy.get('.summaryBody').should('exist'); }); - // task https://redmine.verdnatura.es/issues/8779 - xit('filter client and create ticket', () => { + it('filter client and create ticket', () => { cy.intercept('GET', /\/api\/Tickets\/filter/).as('ticketSearchbar'); searchResults(); cy.wait('@ticketSearchbar');