From 7a1eb9bec64815ff8187c0cc63dc148ebcfef8e1 Mon Sep 17 00:00:00 2001 From: jorgep Date: Tue, 11 Feb 2025 09:28:56 +0100 Subject: [PATCH 01/86] feat: refs #8277 add Entry Control page and update localization files --- src/i18n/locale/en.yml | 1 + src/i18n/locale/es.yml | 3 +- src/pages/Entry/EntryControl.vue | 146 +++++++++++++++++++++++++++++++ src/router/modules/entry.js | 26 +++--- 4 files changed, 164 insertions(+), 12 deletions(-) create mode 100644 src/pages/Entry/EntryControl.vue diff --git a/src/i18n/locale/en.yml b/src/i18n/locale/en.yml index d615eef4c..fe4a0c45d 100644 --- a/src/i18n/locale/en.yml +++ b/src/i18n/locale/en.yml @@ -334,6 +334,7 @@ globals: parking: Parking vehicleList: Vehicles vehicle: Vehicle + entryControl: Entry control unsavedPopup: title: Unsaved changes will be lost subtitle: Are you sure exit without saving? diff --git a/src/i18n/locale/es.yml b/src/i18n/locale/es.yml index a082ca88d..956f11e15 100644 --- a/src/i18n/locale/es.yml +++ b/src/i18n/locale/es.yml @@ -334,6 +334,7 @@ globals: parking: Parking vehicleList: Vehículos vehicle: Vehículo + entryControl: Control de entradas unsavedPopup: title: Los cambios que no haya guardado se perderán subtitle: ¿Seguro que quiere salir sin guardar? @@ -653,7 +654,7 @@ supplier: tableVisibleColumns: nif: NIF/CIF account: Cuenta - + summary: responsible: Responsable verified: Verificado diff --git a/src/pages/Entry/EntryControl.vue b/src/pages/Entry/EntryControl.vue new file mode 100644 index 000000000..6fff84539 --- /dev/null +++ b/src/pages/Entry/EntryControl.vue @@ -0,0 +1,146 @@ + + diff --git a/src/router/modules/entry.js b/src/router/modules/entry.js index f362c7653..5de296803 100644 --- a/src/router/modules/entry.js +++ b/src/router/modules/entry.js @@ -6,13 +6,7 @@ const entryCard = { component: () => import('src/pages/Entry/Card/EntryCard.vue'), redirect: { name: 'EntrySummary' }, meta: { - menu: [ - 'EntryBasicData', - 'EntryBuys', - 'EntryNotes', - 'EntryDms', - 'EntryLog', - ], + menu: ['EntryBasicData', 'EntryBuys', 'EntryNotes', 'EntryDms', 'EntryLog'], }, children: [ { @@ -91,7 +85,8 @@ export default { 'EntryLatestBuys', 'EntryStockBought', 'EntryWasteRecalc', - ] + 'EntryControl', + ], }, component: RouterView, redirect: { name: 'EntryMain' }, @@ -103,7 +98,7 @@ export default { redirect: { name: 'EntryIndexMain' }, children: [ { - path:'', + path: '', name: 'EntryIndexMain', redirect: { name: 'EntryList' }, component: () => import('src/pages/Entry/EntryList.vue'), @@ -127,7 +122,7 @@ export default { icon: 'add', }, component: () => import('src/pages/Entry/EntryCreate.vue'), - }, + }, { path: 'my', name: 'MyEntries', @@ -164,7 +159,16 @@ export default { }, component: () => import('src/pages/Entry/EntryWasteRecalc.vue'), }, + { + path: 'control', + name: 'EntryControl', + meta: { + title: 'entryControl', + icon: 'help', + }, + component: () => import('src/pages/Entry/EntryControl.vue'), + }, ], }, ], -}; \ No newline at end of file +}; From fa7705d2fc8fb8b1420e5d3d0718b2e7e9ab3db0 Mon Sep 17 00:00:00 2001 From: jorgep Date: Wed, 12 Feb 2025 09:53:43 +0100 Subject: [PATCH 02/86] feat: refs #8277 add control labels and update column definitions in EntryControl component --- src/pages/Entry/EntryControl.vue | 112 ++++++++++++++++--------------- src/pages/Entry/locale/en.yml | 16 +++++ src/pages/Entry/locale/es.yml | 16 +++++ 3 files changed, 91 insertions(+), 53 deletions(-) diff --git a/src/pages/Entry/EntryControl.vue b/src/pages/Entry/EntryControl.vue index 6fff84539..49ded3186 100644 --- a/src/pages/Entry/EntryControl.vue +++ b/src/pages/Entry/EntryControl.vue @@ -9,6 +9,53 @@ const { t } = useI18n(); const companies = ref([]); const countries = ref([]); const columns = computed(() => [ + { + name: 'companyFk', + label: t('globals.company'), + columnFilter: { + component: 'select', + name: 'companyFk', + optionLabel: 'code', + options: companies.value, + }, + }, + { + name: 'gestDocFk', + label: t('entry.control.gestDocFk'), + }, + { + name: 'dmsType', + label: t('entry.control.dmsType'), + format: (row) => row.dmsType, + }, + { + name: 'invoiceNumber', + label: t('entry.control.invoiceNumber'), + }, + { + name: 'reference', + label: t('entry.control.reference'), + }, + { + name: 'shipped', + label: t('entry.control.shipped'), + }, + { + name: 'dated', + label: t('entry.control.dated'), + }, + { + name: 'id', + label: t('entry.control.id'), + isId: true, + chip: { + condition: () => true, + }, + }, + { + name: 'invoiceInFk', + label: t('entry.control.invoiceInFk'), + }, { name: 'supplierFk', label: t('globals.supplier'), @@ -20,52 +67,6 @@ const columns = computed(() => [ url: 'Suppliers', }, }, - { - name: 'companyFk', - label: t('globals.company'), - columnFilter: { - component: 'select', - name: 'companyFk', - options: companies.value, - }, - }, - { - name: 'gestDocFk', - label: t('entry.gestDocFk'), - }, - { - name: 'dmsType', - label: t('entry.dmsType'), - format: (row) => row.dmsType, - }, - { - name: 'invoiceNumber', - label: t('entry.invoiceNumber'), - }, - { - name: 'reference', - label: t('entry.reference'), - }, - { - name: 'shipped', - label: t('entry.shipped'), - }, - { - name: 'dated', - label: t('entry.dated'), - }, - { - name: 'id', - label: t('entry.id'), - isId: true, - chip: { - condition: () => true, - }, - }, - { - name: 'invoiceInFk', - label: t('entry.invoiceInFk'), - }, { name: 'country', label: t('globals.country'), @@ -82,7 +83,7 @@ const columns = computed(() => [ }, { name: 'payDem', - label: t('entry.payDem'), + label: t('entry.control.payDem'), }, { name: 'amount', @@ -90,11 +91,12 @@ const columns = computed(() => [ }, { name: 'isBooked', - label: t('entry.isBooked'), + label: t('entry.control.isBooked'), }, { name: 'received', - label: t('entry.received'), + label: t('entry.control.received'), + component: 'checkbox' }, // { // name: 'travelFk', @@ -127,13 +129,13 @@ const columns = computed(() => [ [ :columns auto-load :right-search="false" - /> + > + + diff --git a/src/pages/Entry/locale/en.yml b/src/pages/Entry/locale/en.yml index 80f3491a8..6ed918126 100644 --- a/src/pages/Entry/locale/en.yml +++ b/src/pages/Entry/locale/en.yml @@ -78,6 +78,22 @@ entry: searchInfo: You can search by entry reference descriptorMenu: showEntryReport: Show entry report + control: + gestDocFk: Gestdoc + dmsType: Gestdoc type + invoiceNumber: Entry ref. + reference: Gestdoc ref. + shipped: Shipped + dated: Landed + id: Entry + invoiceInFk: Invoice in + supplierFk: Supplier + country: Country + description: Entry type + payDem: Payment term + amount: Amount + isBooked: B + received: R entryFilter: params: invoiceNumber: Invoice number diff --git a/src/pages/Entry/locale/es.yml b/src/pages/Entry/locale/es.yml index a5b968016..3f9a4b8c2 100644 --- a/src/pages/Entry/locale/es.yml +++ b/src/pages/Entry/locale/es.yml @@ -79,6 +79,22 @@ entry: showEntryReport: Ver informe del pedido search: Buscar entradas searchInfo: Puedes buscar por referencia de entrada + control: + gestDocFk: Gestdoc + dmsType: Tipo gestdoc + invoiceNumber: Ref. Entrada + reference: Ref. gestdoc + shipped: F. envío + dated: F. llegada + id: Entrada + invoiceInFk: Recibida + supplierFk: Proveedor + country: País + description: Tipo de Entrada + payDem: Plazo de pago + amount: Importe + isBooked: C + received: R entryFilter: params: invoiceNumber: Núm. factura From a261de39b44de606a7e6ca8a90ca51941a69e540 Mon Sep 17 00:00:00 2001 From: provira Date: Wed, 12 Feb 2025 12:26:43 +0100 Subject: [PATCH 03/86] feat: refs #8443 created vehicle events --- .../Card/VehicleEventInclusionForm.vue | 169 ++++++++++++++ .../Route/Vehicle/Card/VehicleEvents.vue | 78 +++++++ .../Route/Vehicle/Card/VehicleEventsPanel.vue | 183 +++++++++++++++ src/pages/Route/Vehicle/VehicleCalendar.vue | 145 ++++++++++++ .../Route/Vehicle/VehicleCalendarGrid.vue | 210 ++++++++++++++++++ src/router/modules/route.js | 11 +- 6 files changed, 795 insertions(+), 1 deletion(-) create mode 100644 src/pages/Route/Vehicle/Card/VehicleEventInclusionForm.vue create mode 100644 src/pages/Route/Vehicle/Card/VehicleEvents.vue create mode 100644 src/pages/Route/Vehicle/Card/VehicleEventsPanel.vue create mode 100644 src/pages/Route/Vehicle/VehicleCalendar.vue create mode 100644 src/pages/Route/Vehicle/VehicleCalendarGrid.vue diff --git a/src/pages/Route/Vehicle/Card/VehicleEventInclusionForm.vue b/src/pages/Route/Vehicle/Card/VehicleEventInclusionForm.vue new file mode 100644 index 000000000..360dc7830 --- /dev/null +++ b/src/pages/Route/Vehicle/Card/VehicleEventInclusionForm.vue @@ -0,0 +1,169 @@ + + + + + + es: + Started: Inicio + Finished: Fin + Add vehicle event: Agregar evento + Edit vehicle event: Editar evento + \ No newline at end of file diff --git a/src/pages/Route/Vehicle/Card/VehicleEvents.vue b/src/pages/Route/Vehicle/Card/VehicleEvents.vue new file mode 100644 index 000000000..552bcd2e3 --- /dev/null +++ b/src/pages/Route/Vehicle/Card/VehicleEvents.vue @@ -0,0 +1,78 @@ + + + diff --git a/src/pages/Route/Vehicle/Card/VehicleEventsPanel.vue b/src/pages/Route/Vehicle/Card/VehicleEventsPanel.vue new file mode 100644 index 000000000..9ce2f44b4 --- /dev/null +++ b/src/pages/Route/Vehicle/Card/VehicleEventsPanel.vue @@ -0,0 +1,183 @@ + + + + + diff --git a/src/pages/Route/Vehicle/VehicleCalendar.vue b/src/pages/Route/Vehicle/VehicleCalendar.vue new file mode 100644 index 000000000..a7d51daa1 --- /dev/null +++ b/src/pages/Route/Vehicle/VehicleCalendar.vue @@ -0,0 +1,145 @@ + + + + + diff --git a/src/pages/Route/Vehicle/VehicleCalendarGrid.vue b/src/pages/Route/Vehicle/VehicleCalendarGrid.vue new file mode 100644 index 000000000..0fc440643 --- /dev/null +++ b/src/pages/Route/Vehicle/VehicleCalendarGrid.vue @@ -0,0 +1,210 @@ + + + + + \ No newline at end of file diff --git a/src/router/modules/route.js b/src/router/modules/route.js index 835324d20..c14e5f8d0 100644 --- a/src/router/modules/route.js +++ b/src/router/modules/route.js @@ -166,7 +166,7 @@ const vehicleCard = { component: () => import('src/pages/Route/Vehicle/Card/VehicleCard.vue'), redirect: { name: 'VehicleSummary' }, meta: { - menu: ['VehicleBasicData'], + menu: ['VehicleBasicData', 'VehicleEvents'], }, children: [ { @@ -187,6 +187,15 @@ const vehicleCard = { }, component: () => import('src/pages/Route/Vehicle/Card/VehicleBasicData.vue'), }, + { + name: 'VehicleEvents', + path: 'events', + meta: { + title: 'calendar', + icon: 'vn:calendar', + }, + component: () => import('src/pages/Route/Vehicle/Card/VehicleEvents.vue'), + }, ], }; From 1facb04d7a6c84032ebf6b348450bce14d758900 Mon Sep 17 00:00:00 2001 From: jorgep Date: Wed, 12 Feb 2025 18:24:41 +0100 Subject: [PATCH 04/86] feat: refs #8277 update EntryControl component with new column definitions and filters --- src/pages/Entry/EntryControl.vue | 42 +++++++++++++++++++++++--------- src/pages/Entry/locale/en.yml | 5 ++-- src/pages/Entry/locale/es.yml | 5 ++-- 3 files changed, 34 insertions(+), 18 deletions(-) diff --git a/src/pages/Entry/EntryControl.vue b/src/pages/Entry/EntryControl.vue index 49ded3186..9354f8b20 100644 --- a/src/pages/Entry/EntryControl.vue +++ b/src/pages/Entry/EntryControl.vue @@ -2,6 +2,7 @@ import { ref, computed, markRaw } from 'vue'; import VnTable from 'src/components/VnTable/VnTable.vue'; import { useI18n } from 'vue-i18n'; +import { toDate, toCurrency } from 'src/filters'; import FetchData from 'src/components/FetchData.vue'; import VnSelectSupplier from 'src/components/common/VnSelectSupplier.vue'; @@ -10,7 +11,7 @@ const companies = ref([]); const countries = ref([]); const columns = computed(() => [ { - name: 'companyFk', + name: 'company', label: t('globals.company'), columnFilter: { component: 'select', @@ -26,7 +27,13 @@ const columns = computed(() => [ { name: 'dmsType', label: t('entry.control.dmsType'), - format: (row) => row.dmsType, + columnFilter: { + component: 'select', + label: null, + name: 'dmsType', + url: 'DmsTypes', + fields: ['id', 'name'], + }, }, { name: 'invoiceNumber', @@ -39,10 +46,20 @@ const columns = computed(() => [ { name: 'shipped', label: t('entry.control.shipped'), + format: ({ shipped }, dashIfEmpty) => dashIfEmpty(toDate(shipped)), + columnFilter: { + component: 'date', + name: 'shipped', + }, }, { - name: 'dated', - label: t('entry.control.dated'), + name: 'landed', + label: t('entry.control.landed'), + format: ({ landed }, dashIfEmpty) => dashIfEmpty(toDate(landed)), + columnFilter: { + component: 'date', + name: 'landed', + }, }, { name: 'id', @@ -57,9 +74,9 @@ const columns = computed(() => [ label: t('entry.control.invoiceInFk'), }, { - name: 'supplierFk', + name: 'supplier', label: t('globals.supplier'), - format: (row) => row.supplierFk, + format: (row) => row.supplier, columnFilter: { component: markRaw(VnSelectSupplier), label: null, @@ -70,7 +87,6 @@ const columns = computed(() => [ { name: 'country', label: t('globals.country'), - format: (row) => row.country, columnFilter: { component: 'select', name: 'country', @@ -87,16 +103,18 @@ const columns = computed(() => [ }, { name: 'amount', - label: t('amount'), + label: t('globals.amount'), + format: ({ amount }) => toCurrency(amount), }, { name: 'isBooked', label: t('entry.control.isBooked'), + component: 'checkbox', }, { name: 'received', label: t('entry.control.received'), - component: 'checkbox' + component: 'checkbox', }, // { // name: 'travelFk', @@ -144,9 +162,9 @@ const columns = computed(() => [ :columns auto-load :right-search="false" + :disable-option="{ card: true }" + redirect="Entry" + :order="['landed DESC']" > - diff --git a/src/pages/Entry/locale/en.yml b/src/pages/Entry/locale/en.yml index 119b06c37..bd7c4d002 100644 --- a/src/pages/Entry/locale/en.yml +++ b/src/pages/Entry/locale/en.yml @@ -136,15 +136,14 @@ entry: dmsType: Gestdoc type invoiceNumber: Entry ref. reference: Gestdoc ref. - shipped: Shipped - dated: Landed + shipped: Shipped + landed: Landed id: Entry invoiceInFk: Invoice in supplierFk: Supplier country: Country description: Entry type payDem: Payment term - amount: Amount isBooked: B received: R entryFilter: diff --git a/src/pages/Entry/locale/es.yml b/src/pages/Entry/locale/es.yml index 2519ad726..1c19df4c9 100644 --- a/src/pages/Entry/locale/es.yml +++ b/src/pages/Entry/locale/es.yml @@ -92,16 +92,15 @@ entry: gestDocFk: Gestdoc dmsType: Tipo gestdoc invoiceNumber: Ref. Entrada - reference: Ref. gestdoc + reference: Ref. GestDoc shipped: F. envío - dated: F. llegada + landed: F. llegada id: Entrada invoiceInFk: Recibida supplierFk: Proveedor country: País description: Tipo de Entrada payDem: Plazo de pago - amount: Importe isBooked: C received: R params: From 398f76c6e7525eaeffcc453391a74e8c893f6b64 Mon Sep 17 00:00:00 2001 From: provira Date: Thu, 13 Feb 2025 07:49:12 +0100 Subject: [PATCH 05/86] feat: refs #8443 added select in form for vehicle state --- .../Card/VehicleEventInclusionForm.vue | 42 ++++++------------- .../Route/Vehicle/Card/VehicleEventsPanel.vue | 22 ---------- 2 files changed, 12 insertions(+), 52 deletions(-) diff --git a/src/pages/Route/Vehicle/Card/VehicleEventInclusionForm.vue b/src/pages/Route/Vehicle/Card/VehicleEventInclusionForm.vue index 360dc7830..800ef1b2b 100644 --- a/src/pages/Route/Vehicle/Card/VehicleEventInclusionForm.vue +++ b/src/pages/Route/Vehicle/Card/VehicleEventInclusionForm.vue @@ -11,6 +11,7 @@ import VnInput from 'src/components/common/VnInput.vue'; import { useArrayData } from 'src/composables/useArrayData'; import { useVnConfirm } from 'composables/useVnConfirm'; import axios from 'axios'; +import VnSelect from 'src/components/common/VnSelect.vue'; const props = defineProps({ event: { @@ -47,12 +48,13 @@ const arrayData = useArrayData('VehicleEvents'); const createVehicleEvent = async () => { vehicleFormData.value.vehicleFk = route.params.id; + vehicleFormData.value.userFk = 3; if (isNew.value) { await axios.post(`Vehicles/${route.params.id}/event`, vehicleFormData.value); } else { await axios.put( `Vehicles/${route.params.id}/event/${props.event?.id}`, - vehicleFormData.value + vehicleFormData.value, ); } @@ -90,42 +92,22 @@ onMounted(() => { :default-submit-button="false" > @@ -147,7 +129,7 @@ onMounted(() => { openConfirmationModal( t('vehicleForm.deleteTitle'), t('vehicleForm.deleteSubtitle'), - () => deleteVehicleEvent() + () => deleteVehicleEvent(), ) " /> @@ -166,4 +148,4 @@ onMounted(() => { Finished: Fin Add vehicle event: Agregar evento Edit vehicle event: Editar evento - \ No newline at end of file + diff --git a/src/pages/Route/Vehicle/Card/VehicleEventsPanel.vue b/src/pages/Route/Vehicle/Card/VehicleEventsPanel.vue index 9ce2f44b4..3ff849c16 100644 --- a/src/pages/Route/Vehicle/Card/VehicleEventsPanel.vue +++ b/src/pages/Route/Vehicle/Card/VehicleEventsPanel.vue @@ -38,24 +38,10 @@ const fetchVehicleState = async () => { vehicleStates.value = vehicles.data; }; -const fetchUser = async (userId) => { - console.log(userId); - if (!userId || users.value[userId]) return; - - const usersData = await axios.get(`Accounts/2/user`); - users.value[userId] = usersData.data; - console.log(users.value[userId]); -}; - const getVehicleStateName = (id) => { return vehicleStates.value[id - 1] ?? dashIfEmpty(id - 1); }; -const getUserName = (id) => { - console.log(users.value?.nickname); - return users.value?.nickname ?? dashIfEmpty(id - 1); -}; - const params = computed(() => ({ vehicleFk: route.params.id, started: props.firstDay, @@ -101,10 +87,6 @@ const openInclusionForm = (event) => { onMounted(async () => { weekdayStore.initStore(); await fetchVehicleState(); - - for (let event of props.events) { - await fetchUser(event.userFk); - } }); @@ -135,10 +117,6 @@ onMounted(async () => { getVehicleStateName(event.vehicleStateFk).state }} - {{ t('globals.user') }}: - {{ getUserName(event.userFk) }} - Date: Mon, 3 Mar 2025 13:08:19 +0100 Subject: [PATCH 06/86] feat: refs #8443 added notifications and translations --- .../Card/VehicleEventInclusionForm.vue | 21 ++++++++----- .../Route/Vehicle/Card/VehicleEventsPanel.vue | 6 +++- .../Route/Vehicle/VehicleCalendarGrid.vue | 4 +-- src/pages/Route/Vehicle/locale/en.yml | 2 ++ src/pages/Route/Vehicle/locale/es.yml | 2 ++ .../route/vehicle/vehicleEvents.spec.js | 30 +++++++++++++++++++ 6 files changed, 55 insertions(+), 10 deletions(-) create mode 100644 test/cypress/integration/route/vehicle/vehicleEvents.spec.js diff --git a/src/pages/Route/Vehicle/Card/VehicleEventInclusionForm.vue b/src/pages/Route/Vehicle/Card/VehicleEventInclusionForm.vue index 800ef1b2b..0a21c05a6 100644 --- a/src/pages/Route/Vehicle/Card/VehicleEventInclusionForm.vue +++ b/src/pages/Route/Vehicle/Card/VehicleEventInclusionForm.vue @@ -10,8 +10,10 @@ import VnInput from 'src/components/common/VnInput.vue'; import { useArrayData } from 'src/composables/useArrayData'; import { useVnConfirm } from 'composables/useVnConfirm'; +import { useState } from 'src/composables/useState'; import axios from 'axios'; import VnSelect from 'src/components/common/VnSelect.vue'; +import useNotify from 'src/composables/useNotify.js'; const props = defineProps({ event: { @@ -32,7 +34,10 @@ const emit = defineEmits(['onSubmit', 'closeForm']); const route = useRoute(); const { t } = useI18n(); +const { notify } = useNotify(); const { openConfirmationModal } = useVnConfirm(); +const state = useState(); +const user = state.getUser(); const isNew = computed(() => props.isNewMode); const vehicleFormData = ref({ @@ -48,12 +53,13 @@ const arrayData = useArrayData('VehicleEvents'); const createVehicleEvent = async () => { vehicleFormData.value.vehicleFk = route.params.id; - vehicleFormData.value.userFk = 3; + vehicleFormData.value.userFk = user.value.id; if (isNew.value) { - await axios.post(`Vehicles/${route.params.id}/event`, vehicleFormData.value); + await axios.post(`VehicleEvents`, vehicleFormData.value); + notify(t('globals.dataSaved'), 'positive'); } else { - await axios.put( - `Vehicles/${route.params.id}/event/${props.event?.id}`, + await axios.patch( + `VehicleEvents/${props.event?.id}`, vehicleFormData.value, ); } @@ -64,7 +70,8 @@ const createVehicleEvent = async () => { const deleteVehicleEvent = async () => { if (!props.event) return; - await axios.delete(`Vehicles/${route.params.id}/event/${props.event?.id}`); + await axios.delete(`VehicleEvents/${props.event?.id}`); + notify(t('globals.dataSaved'), 'positive'); await refetchEvents(); }; @@ -127,8 +134,8 @@ onMounted(() => { class="q-mr-sm" @click=" openConfirmationModal( - t('vehicleForm.deleteTitle'), - t('vehicleForm.deleteSubtitle'), + t('vehicle.deleteTitle'), + t('vehicle.deleteSubtitle'), () => deleteVehicleEvent(), ) " diff --git a/src/pages/Route/Vehicle/Card/VehicleEventsPanel.vue b/src/pages/Route/Vehicle/Card/VehicleEventsPanel.vue index 3ff849c16..ead43b908 100644 --- a/src/pages/Route/Vehicle/Card/VehicleEventsPanel.vue +++ b/src/pages/Route/Vehicle/Card/VehicleEventsPanel.vue @@ -9,6 +9,7 @@ import { toDateFormat } from 'src/filters/date.js'; import { dashIfEmpty } from 'src/filters'; import { useWeekdayStore } from 'src/stores/useWeekdayStore'; import { useVnConfirm } from 'composables/useVnConfirm'; +import useNotify from 'src/composables/useNotify.js'; const props = defineProps({ firstDay: { @@ -28,6 +29,7 @@ const props = defineProps({ const emit = defineEmits(['openVehicleForm']); const { t } = useI18n(); const route = useRoute(); +const { notify } = useNotify(); const weekdayStore = useWeekdayStore(); const { openConfirmationModal } = useVnConfirm(); const vehicleStates = ref({}); @@ -72,7 +74,8 @@ watch( const deleteEvent = async (id) => { if (!id) return; - await axios.delete(`Vehicles/${route.params.id}/event/${id}`); + await axios.delete(`VehicleEvents/${id}`); + notify(t('dataSaved'), 'positive'); await fetchData(); }; @@ -121,6 +124,7 @@ onMounted(async () => { { const onDateSelected = (data) => emit('onDateSelected', data); onMounted(async () => { - let initialDate = new Date(); + let initialDate = Date.vnNew(); initialDate.setDate(1); initialDate.setHours(0, 0, 0, 0); date.value = initialDate; diff --git a/src/pages/Route/Vehicle/locale/en.yml b/src/pages/Route/Vehicle/locale/en.yml index c92022f9d..706f77e0c 100644 --- a/src/pages/Route/Vehicle/locale/en.yml +++ b/src/pages/Route/Vehicle/locale/en.yml @@ -15,6 +15,8 @@ vehicle: remove: Vehicle removed search: Search Vehicle searchInfo: Search by id or number plate + deleteTitle: This item will be deleted + deleteSubtitle: Are you sure you want to continue? params: vehicleTypeFk: Type vehicleStateFk: State diff --git a/src/pages/Route/Vehicle/locale/es.yml b/src/pages/Route/Vehicle/locale/es.yml index c878f97ac..23d163eaf 100644 --- a/src/pages/Route/Vehicle/locale/es.yml +++ b/src/pages/Route/Vehicle/locale/es.yml @@ -15,6 +15,8 @@ vehicle: remove: Vehículo eliminado search: Buscar Vehículo searchInfo: Buscar por id o matrícula + deleteTitle: Este elemento será eliminado + deleteSubtitle: ¿Seguro que quieres continuar? params: vehicleTypeFk: Tipo vehicleStateFk: Estado diff --git a/test/cypress/integration/route/vehicle/vehicleEvents.spec.js b/test/cypress/integration/route/vehicle/vehicleEvents.spec.js new file mode 100644 index 000000000..65d5aa8a1 --- /dev/null +++ b/test/cypress/integration/route/vehicle/vehicleEvents.spec.js @@ -0,0 +1,30 @@ +describe('Vehicle', () => { + beforeEach(() => { + cy.viewport(1920, 1080); + cy.login('deliveryAssistant'); + cy.visit(`/#/route/vehicle/3/events`); + }); + + it('should add a new vehicle event', () => { + cy.get('.q-page-sticky > div > .q-btn').click(); + cy.dataCy('Started_inputDate').type('05/02/2001'); + cy.dataCy('Finished_inputDate').type('08/02/2001'); + cy.get(':nth-child(5) > [label="Description"] > .q-field > .q-field__inner > .q-field__control > .q-field__control-container > [data-cy="Description_input"]').type('Test'); + cy.selectOption(':nth-child(5) > .q-select > .q-field__inner > .q-field__control > .q-field__control-container', 3); + cy.get('.q-mt-lg > .q-btn--standard').click(); + }); + + it('should edit a vehicle event', () => { + cy.get('[aria-label="Tuesday, February 6, 2001"] .q-btn__content').click(); + cy.dataCy('Started_inputDate').clear().type('03/02/2001'); + cy.dataCy('Finished_inputDate').clear().type('15/03/2001'); + cy.get(':nth-child(5) > [label="Description"] > .q-field > .q-field__inner > .q-field__control > .q-field__control-container > [data-cy="Description_input"]').clear().type('Test2'); + cy.selectOption(':nth-child(5) > .q-select > .q-field__inner > .q-field__control > .q-field__control-container', 5); + cy.get('.q-mt-lg > .q-btn--standard').click(); + }); + + it('should delete a vehicle event', () => { + cy.dataCy('delete_event').eq(0).click(); + cy.dataCy('VnConfirm_confirm').click(); + }); +}); From 234269bdef1eaa71b930866c4eb09f2601ac47e9 Mon Sep 17 00:00:00 2001 From: jorgep Date: Thu, 20 Mar 2025 08:57:13 +0100 Subject: [PATCH 07/86] feat: refs #8277 add entry type selection and localization to EntryControl --- src/pages/Entry/EntryControl.vue | 37 +++++++++++++++++++++++--------- src/pages/Entry/locale/en.yml | 1 + src/pages/Entry/locale/es.yml | 1 + 3 files changed, 29 insertions(+), 10 deletions(-) diff --git a/src/pages/Entry/EntryControl.vue b/src/pages/Entry/EntryControl.vue index 9354f8b20..d833e5c27 100644 --- a/src/pages/Entry/EntryControl.vue +++ b/src/pages/Entry/EntryControl.vue @@ -9,6 +9,7 @@ import VnSelectSupplier from 'src/components/common/VnSelectSupplier.vue'; const { t } = useI18n(); const companies = ref([]); const countries = ref([]); +const entryTypes = ref([]); const columns = computed(() => [ { name: 'company', @@ -81,7 +82,6 @@ const columns = computed(() => [ component: markRaw(VnSelectSupplier), label: null, name: 'supplierFk', - url: 'Suppliers', }, }, { @@ -89,13 +89,21 @@ const columns = computed(() => [ label: t('globals.country'), columnFilter: { component: 'select', - name: 'country', + name: 'countryFk', options: countries.value, }, }, { name: 'description', - label: t('globals.description'), + label: t('entry.control.entryType'), + columnFilter: { + component: 'select', + label: null, + name: 'typeFk', + options: entryTypes.value, + optionLabel: 'description', + optionValue: 'code', + }, }, { name: 'payDem', @@ -105,6 +113,10 @@ const columns = computed(() => [ name: 'amount', label: t('globals.amount'), format: ({ amount }) => toCurrency(amount), + columnFilter: { + component: 'number', + name: 'amount', + }, }, { name: 'isBooked', @@ -129,10 +141,10 @@ const columns = computed(() => [ // label: t('entry.agencyMode'), // format: (row) => row.agencyMode, // }, - // { - // name: 'isAgricultural', - // label: t('entry.isAgricultural'), - // }, + { + name: 'isAgricultural', + label: t('entry.isAgricultural'), + }, // { // name: 'account', // label: t('globals.account'), @@ -156,15 +168,20 @@ const columns = computed(() => [ @on-fetch="(data) => (companies = data)" auto-load /> + - + :right-search="false" + /> diff --git a/src/pages/Entry/locale/en.yml b/src/pages/Entry/locale/en.yml index 7309384e9..90368e4f0 100644 --- a/src/pages/Entry/locale/en.yml +++ b/src/pages/Entry/locale/en.yml @@ -133,6 +133,7 @@ entry: payDem: Payment term isBooked: B received: R + entryType: Entry type entryFilter: params: isExcludedFromAvailable: Excluded from available diff --git a/src/pages/Entry/locale/es.yml b/src/pages/Entry/locale/es.yml index 2d58dc49b..6d0afa7e9 100644 --- a/src/pages/Entry/locale/es.yml +++ b/src/pages/Entry/locale/es.yml @@ -83,6 +83,7 @@ entry: payDem: Plazo de pago isBooked: C received: R + entryType: Tipo de entrada params: entryFk: Entrada observationTypeFk: Tipo de observación From 9b3fc523770dd529eca609a431008f5d96d93828 Mon Sep 17 00:00:00 2001 From: jorgep Date: Thu, 20 Mar 2025 18:05:17 +0100 Subject: [PATCH 08/86] feat: refs #8277 add agricultural and account type fields, enhance filtering options, and update localization --- src/components/common/VnSelect.vue | 6 +- src/pages/Entry/EntryControl.vue | 147 ++++++++++++++++++++++++----- src/pages/Entry/locale/en.yml | 5 + src/pages/Entry/locale/es.yml | 5 + 4 files changed, 134 insertions(+), 29 deletions(-) diff --git a/src/components/common/VnSelect.vue b/src/components/common/VnSelect.vue index 339f90e0e..1e4f1589e 100644 --- a/src/components/common/VnSelect.vue +++ b/src/components/common/VnSelect.vue @@ -367,7 +367,7 @@ function getCaption(opt) { >