From 8e5cfe9fd8b93b17a0fb43e0c7b5cc514e1aa71e Mon Sep 17 00:00:00 2001 From: pablone Date: Mon, 17 Mar 2025 08:55:55 +0100 Subject: [PATCH] feat: refs #8602 update localization for purchased spaces and enhance Entry components with new labels --- src/components/CrudModel.vue | 8 +- src/components/VnTable/VnTable.vue | 21 +-- src/pages/Entry/Card/EntryBasicData.vue | 9 +- src/pages/Entry/Card/EntrySummary.vue | 10 +- src/pages/Entry/EntryStockBought.vue | 133 +++++++++--------- src/pages/Entry/EntryStockBoughtFilter.vue | 70 --------- src/pages/Entry/locale/es.yml | 2 +- src/stores/useArrayDataStore.js | 1 + .../integration/entry/entryList.spec.js | 2 +- .../entry/entryStockBought.spec.js | 43 +----- 10 files changed, 104 insertions(+), 195 deletions(-) delete mode 100644 src/pages/Entry/EntryStockBoughtFilter.vue diff --git a/src/components/CrudModel.vue b/src/components/CrudModel.vue index 8c4f70f3b..31b91a3e3 100644 --- a/src/components/CrudModel.vue +++ b/src/components/CrudModel.vue @@ -181,8 +181,12 @@ async function saveChanges(data) { return; } let changes = data || getChanges(); - if ($props.beforeSaveFn) { + console.log('$props.beforeSaveFn: ', $props.beforeSaveFn); + if ($props.beforeSaveFn && typeof $props.beforeSaveFn === 'function') { + console.log('Ejecutando beforeSaveFn'); changes = await $props.beforeSaveFn(changes, getChanges); + } else { + console.log('beforeSaveFn no es una función válida o no está definida'); } try { if (changes?.creates?.length === 0 && changes?.updates?.length === 0) { @@ -194,7 +198,7 @@ async function saveChanges(data) { isLoading.value = false; } originalData.value = JSON.parse(JSON.stringify(formData.value)); - if (changes.creates?.length) await vnPaginateRef.value.fetch(); + if (changes?.creates?.length) await vnPaginateRef.value.fetch(); hasChanges.value = false; emit('saveChanges', data); diff --git a/src/components/VnTable/VnTable.vue b/src/components/VnTable/VnTable.vue index 9329a183a..49889b340 100644 --- a/src/components/VnTable/VnTable.vue +++ b/src/components/VnTable/VnTable.vue @@ -595,19 +595,20 @@ function cardClick(_, row) { function removeTextValue(data, getChanges) { let changes = data.updates; - if (!changes) return data; - - for (const change of changes) { - for (const key in change.data) { - if (key.endsWith('VnTableTextValue')) { - delete change.data[key]; + if (changes) { + for (const change of changes) { + for (const key in change.data) { + if (key.endsWith('VnTableTextValue')) { + delete change.data[key]; + } } } + + data.updates = changes.filter((change) => Object.keys(change.data).length > 0); + } + if ($attrs?.beforeSaveFn) { + data = $attrs.beforeSaveFn(data, getChanges); } - - data.updates = changes.filter((change) => Object.keys(change.data).length > 0); - - if ($attrs?.beforeSaveFn) data = $attrs.beforeSaveFn(data, getChanges); return data; } diff --git a/src/pages/Entry/Card/EntryBasicData.vue b/src/pages/Entry/Card/EntryBasicData.vue index e487f4e95..34e4a0f9c 100644 --- a/src/pages/Entry/Card/EntryBasicData.vue +++ b/src/pages/Entry/Card/EntryBasicData.vue @@ -146,12 +146,15 @@ onMounted(() => { + - {
{ size="xs" /> import { ref, computed } from 'vue'; import { useI18n } from 'vue-i18n'; -import { useState } from 'src/composables/useState'; -import { useQuasar } from 'quasar'; +import { useQuasar, date } from 'quasar'; import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue'; import FetchData from 'components/FetchData.vue'; import FormModelPopup from 'components/FormModelPopup.vue'; import VnInput from 'src/components/common/VnInput.vue'; import VnRow from 'components/ui/VnRow.vue'; -import RightMenu from 'src/components/common/RightMenu.vue'; -import EntryStockBoughtFilter from './EntryStockBoughtFilter.vue'; import VnTable from 'components/VnTable/VnTable.vue'; import WorkerDescriptorProxy from 'src/pages/Worker/Card/WorkerDescriptorProxy.vue'; import EntryStockBoughtDetail from 'src/pages/Entry/EntryStockBoughtDetail.vue'; +import TravelDescriptorProxy from '../Travel/Card/TravelDescriptorProxy.vue'; +import { useFilterParams } from 'src/composables/useFilterParams'; +import axios from 'axios'; const { t } = useI18n(); const quasar = useQuasar(); -const state = useState(); -const user = state.getUser(); +const filterDate = ref(useFilterParams('StockBoughts').params); const footer = ref({ bought: 0, reserve: 0 }); const columns = computed(() => [ { @@ -46,7 +45,7 @@ const columns = computed(() => [ optionValue: 'id', }, columnFilter: false, - width: '50px', + width: '60%', }, { align: 'center', @@ -56,20 +55,20 @@ const columns = computed(() => [ create: true, component: 'number', summation: true, - width: '50px', format: ({ reserve }, dashIfEmpty) => dashIfEmpty(round(reserve)), + width: '20%', }, { - align: 'center', + align: 'right', label: t('entryStockBought.bought'), name: 'bought', summation: true, cardVisible: true, style: ({ reserve, bought }) => boughtStyle(bought, reserve), columnFilter: false, + width: '20%', }, { - align: 'left', label: t('entryStockBought.date'), name: 'dated', component: 'date', @@ -77,20 +76,20 @@ const columns = computed(() => [ create: true, }, { - align: 'left', + align: 'center', name: 'tableActions', actions: [ { title: t('entryStockBought.viewMoreDetails'), name: 'searchBtn', - icon: 'add', + icon: 'search', isPrimary: true, action: (row) => { quasar.dialog({ component: EntryStockBoughtDetail, componentProps: { workerFk: row.workerFk, - dated: userParams.value.dated, + dated: filterDate.value.dated, }, }); }, @@ -98,39 +97,29 @@ const columns = computed(() => [ ], }, ]); - const fetchDataRef = ref(); const travelDialogRef = ref(false); const tableRef = ref(); const travel = ref(null); -const userParams = ref({ - dated: Date.vnNew().toJSON(), -}); - -const filter = ref({ - fields: ['id', 'm3', 'warehouseInFk'], +const filter = computed(() => ({ + fields: ['id', 'm3', 'ref', 'warehouseInFk'], include: [ { relation: 'warehouseIn', scope: { - fields: ['code'], + fields: ['code', 'name'], }, }, ], where: { - shipped: (userParams.value.dated - ? new Date(userParams.value.dated) - : Date.vnNew() - ).setHours(0, 0, 0, 0), + shipped: date.adjustDate(filterDate.value.dated, { + hour: 0, + minute: 0, + second: 0, + }), m3: { neq: null }, }, -}); - -const setUserParams = async ({ dated }) => { - const shipped = (dated ? new Date(dated) : Date.vnNew()).setHours(0, 0, 0, 0); - filter.value.where.shipped = shipped; - fetchDataRef.value?.fetch(); -}; +})); function openDialog() { travelDialogRef.value = true; @@ -151,6 +140,31 @@ function round(value) { function boughtStyle(bought, reserve) { return reserve < bought ? { color: 'var(--q-negative)' } : ''; } + +async function beforeSave(data, getChanges) { + const changes = data.creates; + if (!changes) return data; + const patchPromises = []; + + for (const change of changes) { + if (change?.isReal === false && change?.reserve > 0) { + const postData = { + workerFk: change.workerFk, + reserve: change.reserve, + dated: filterDate.value.dated, + }; + const promise = axios.post('StockBoughts', postData).catch((error) => { + console.error('Error processing change: ', change, error); + }); + + patchPromises.push(promise); + } + } + + await Promise.all(patchPromises); + const filteredChanges = changes.filter((change) => change?.isReal !== false); + data.creates = filteredChanges; +}