From c15a90922521f29ddc9e5a868b9d9fa2c6a5c9cb Mon Sep 17 00:00:00 2001 From: alexm Date: Mon, 1 Jul 2024 10:46:17 +0200 Subject: [PATCH] merge dev --- .eslintrc.js => .eslintrc.cjs | 0 src/boot/axios.js | 15 +- src/components/CrudModel.vue | 4 +- src/components/FormModel.vue | 11 +- src/components/TransferInvoiceForm.vue | 111 ++- src/components/UserPanel.vue | 7 +- src/components/common/VnInput.vue | 6 +- src/components/common/VnInputDate.vue | 6 + src/components/common/VnInputTime.vue | 5 +- src/components/common/VnPopup.vue | 23 + src/components/common/VnProgressModal.vue | 97 +++ src/components/common/VnSelect.vue | 11 +- src/components/common/VnSmsDialog.vue | 4 + src/components/ui/CardDescriptor.vue | 3 +- src/components/ui/CardSummary.vue | 13 +- src/components/ui/SkeletonForm.vue | 30 +- src/components/ui/VnFilterPanel.vue | 42 +- src/components/ui/VnImg.vue | 28 +- src/components/ui/VnLv.vue | 96 ++- src/components/ui/VnNotes.vue | 3 +- src/composables/useArrayData.js | 5 +- src/css/app.scss | 9 + src/filters/toPercentage.js | 9 +- src/i18n/locale/en.yml | 24 + src/i18n/locale/es.yml | 24 + src/pages/Account/Card/AccountBasicData.vue | 1 - src/pages/Account/Card/AccountDescriptor.vue | 12 +- src/pages/Account/Card/AccountSummary.vue | 1 + .../Account/Role/Card/RoleDescriptor.vue | 8 +- .../Account/Role/Card/RoleDescriptorProxy.vue | 17 + src/pages/Account/Role/Card/RoleSummary.vue | 1 + src/pages/Agency/Card/AgencySummary.vue | 2 +- src/pages/Claim/Card/ClaimBasicData.vue | 38 +- src/pages/Claim/Card/ClaimCard.vue | 2 + src/pages/Claim/Card/ClaimDescriptor.vue | 46 +- src/pages/Claim/Card/ClaimFilter.js | 52 ++ src/pages/Claim/Card/ClaimSummary.vue | 1 + src/pages/Customer/Card/CustomerBasicData.vue | 11 +- src/pages/Customer/Card/CustomerSummary.vue | 6 +- .../Customer/Defaulter/CustomerDefaulter.vue | 37 +- .../Defaulter/CustomerDefaulterFilter.vue | 67 +- .../Card/DepartmentDescriptorProxy.vue | 4 +- .../Department/Card/DepartmentSummary.vue | 1 + src/pages/Entry/Card/EntrySummary.vue | 1 + src/pages/Entry/EntryLatestBuys.vue | 16 +- .../InvoiceOut/Card/InvoiceOutSummary.vue | 1 + .../InvoiceOut/InvoiceOutNegativeBases.vue | 8 +- .../InvoiceOutNegativeBasesFilter.vue | 1 + src/pages/Item/Card/ItemDescriptor.vue | 10 - src/pages/Item/ItemFixedPrice.vue | 11 +- src/pages/Item/ItemList.vue | 11 +- src/pages/Order/Card/OrderCatalogFilter.vue | 5 +- src/pages/Order/Card/OrderForm.vue | 2 - src/pages/Order/Card/OrderSummary.vue | 6 +- src/pages/Parking/Card/ParkingSummary.vue | 1 + src/pages/Route/Card/RouteSummary.vue | 1 + src/pages/Route/Cmr/CmrList.vue | 7 +- src/pages/Route/RouteList.vue | 1 - src/pages/Route/RouteRoadmap.vue | 4 +- src/pages/Shelving/Card/ShelvingSummary.vue | 7 +- .../Supplier/Card/SupplierConsumption.vue | 10 +- .../Card/SupplierConsumptionFilter.vue | 2 +- src/pages/Supplier/Card/SupplierSummary.vue | 1 + .../Ticket/Card/BasicData/BasicDataTable.vue | 263 ++++++ .../Card/BasicData/TicketBasicDataForm.vue | 468 +++++++++++ .../Card/BasicData/TicketBasicDataView.vue | 195 +++++ src/pages/Ticket/Card/TicketBasicData.vue | 3 - src/pages/Ticket/Card/TicketCard.vue | 25 +- src/pages/Ticket/Card/TicketCreateRequest.vue | 69 ++ src/pages/Ticket/Card/TicketEditMana.vue | 96 +++ src/pages/Ticket/Card/TicketLog.vue | 10 + .../Ticket/Card/TicketPurchaseRequest.vue | 267 ++++++ src/pages/Ticket/Card/TicketSale.vue | 780 +++++++++++++++++- .../Ticket/Card/TicketSaleMoreActions.vue | 289 +++++++ src/pages/Ticket/Card/TicketSummary.vue | 1 + src/pages/Ticket/Card/TicketTransfer.vue | 196 +++++ src/pages/Ticket/TicketAdvance.vue | 710 ++++++++++++++++ src/pages/Ticket/TicketFuture.vue | 533 ++++++++++++ src/pages/Ticket/TicketWeekly.vue | 326 ++++++++ src/pages/Ticket/locale/en.yml | 138 ++++ src/pages/Ticket/locale/es.yml | 140 +++- src/pages/Travel/Card/TravelLog.vue | 2 +- src/pages/Travel/Card/TravelSummary.vue | 1 + src/pages/Travel/Card/TravelThermographs.vue | 2 +- src/pages/Travel/ExtraCommunity.vue | 35 +- src/pages/Travel/ExtraCommunityFilter.vue | 46 +- src/pages/Wagon/WagonCounter.vue | 14 +- src/pages/Worker/Card/WorkerBalance.vue | 91 ++ src/pages/Worker/Card/WorkerDescriptor.vue | 12 +- src/pages/Worker/Card/WorkerFormation.vue | 125 +++ .../Card/WorkerNotificationsManager.vue | 1 - src/pages/Worker/Card/WorkerSummary.vue | 17 +- src/pages/Zone/Card/ZoneCard.vue | 1 + src/router/modules/customer.js | 2 +- src/router/modules/department.js | 2 +- src/router/modules/ticket.js | 60 +- src/router/modules/worker.js | 20 + .../agency/agencyWorkCenter.spec.js | 10 +- .../invoiceIn/invoiceInCorrective.spec.js | 3 +- .../invoiceIn/invoiceInDescriptor.spec.js | 14 +- test/cypress/integration/vnSearchBar.spec.js | 16 +- 101 files changed, 5534 insertions(+), 448 deletions(-) rename .eslintrc.js => .eslintrc.cjs (100%) create mode 100644 src/components/common/VnPopup.vue create mode 100644 src/components/common/VnProgressModal.vue create mode 100644 src/pages/Account/Role/Card/RoleDescriptorProxy.vue create mode 100644 src/pages/Claim/Card/ClaimFilter.js create mode 100644 src/pages/Ticket/Card/BasicData/BasicDataTable.vue create mode 100644 src/pages/Ticket/Card/BasicData/TicketBasicDataForm.vue create mode 100644 src/pages/Ticket/Card/BasicData/TicketBasicDataView.vue delete mode 100644 src/pages/Ticket/Card/TicketBasicData.vue create mode 100644 src/pages/Ticket/Card/TicketCreateRequest.vue create mode 100644 src/pages/Ticket/Card/TicketEditMana.vue create mode 100644 src/pages/Ticket/Card/TicketLog.vue create mode 100644 src/pages/Ticket/Card/TicketPurchaseRequest.vue create mode 100644 src/pages/Ticket/Card/TicketSaleMoreActions.vue create mode 100644 src/pages/Ticket/Card/TicketTransfer.vue create mode 100644 src/pages/Ticket/TicketAdvance.vue create mode 100644 src/pages/Ticket/TicketFuture.vue create mode 100644 src/pages/Ticket/TicketWeekly.vue create mode 100644 src/pages/Ticket/locale/en.yml create mode 100644 src/pages/Worker/Card/WorkerBalance.vue create mode 100644 src/pages/Worker/Card/WorkerFormation.vue diff --git a/.eslintrc.js b/.eslintrc.cjs similarity index 100% rename from .eslintrc.js rename to .eslintrc.cjs diff --git a/src/boot/axios.js b/src/boot/axios.js index e3e7289af6..4fd83ddea1 100644 --- a/src/boot/axios.js +++ b/src/boot/axios.js @@ -1,11 +1,10 @@ import axios from 'axios'; -import { Notify } from 'quasar'; import { useSession } from 'src/composables/useSession'; import { Router } from 'src/router'; -import { i18n } from './i18n'; +import useNotify from 'src/composables/useNotify.js'; const session = useSession(); -const { t } = i18n.global; +const { notify } = useNotify(); axios.defaults.baseURL = '/api/'; @@ -27,10 +26,7 @@ const onResponse = (response) => { const isSaveRequest = method === 'patch'; if (isSaveRequest) { - Notify.create({ - message: t('globals.dataSaved'), - type: 'positive', - }); + notify('globals.dataSaved', 'positive'); } return response; @@ -67,10 +63,7 @@ const onResponseError = (error) => { return Promise.reject(error); } - Notify.create({ - message: t(message), - type: 'negative', - }); + notify(message, 'negative'); return Promise.reject(error); }; diff --git a/src/components/CrudModel.vue b/src/components/CrudModel.vue index c26a9c4a52..d5d8e2a911 100644 --- a/src/components/CrudModel.vue +++ b/src/components/CrudModel.vue @@ -148,7 +148,7 @@ async function onSubmit() { await saveChanges($props.saveFn ? formData.value : null); } -async function onSumbitAndGo() { +async function onSubmitAndGo() { await onSubmit(); push({ path: $props.goTo }); } @@ -339,7 +339,7 @@ watch(formUrl, async () => { />
+
@@ -332,7 +339,7 @@ defineExpose({ - + { - if (closeButton.value) closeButton.value.click(); +const selectedClient = (client) => { + transferInvoiceParams.selectedClientData = client; }; -const transferInvoice = async () => { +const makeInvoice = async () => { + const hasToInvoiceByAddress = + transferInvoiceParams.selectedClientData.hasToInvoiceByAddress; + + const params = { + id: transferInvoiceParams.id, + cplusRectificationTypeFk: transferInvoiceParams.cplusRectificationTypeFk, + invoiceCorrectionTypeFk: transferInvoiceParams.invoiceCorrectionTypeFk, + newClientFk: transferInvoiceParams.newClientFk, + refFk: transferInvoiceParams.refFk, + siiTypeInvoiceOutFk: transferInvoiceParams.siiTypeInvoiceOutFk, + makeInvoice: checked.value, + }; + try { - const { data } = await axios.post( - 'InvoiceOuts/transferInvoice', - transferInvoiceParams - ); + if (checked.value && hasToInvoiceByAddress) { + const response = await new Promise((resolve) => { + quasar + .dialog({ + component: VnConfirm, + componentProps: { + title: t('Bill destination client'), + message: t('transferInvoiceInfo'), + }, + }) + .onOk(() => { + resolve(true); + }) + .onCancel(() => { + resolve(false); + }); + }); + if (!response) { + return; + } + } + + const { data } = await axios.post('InvoiceOuts/transferInvoice', params); notify(t('Transferred invoice'), 'positive'); - closeForm(); - router.push('InvoiceOutSummary', { id: data.id }); + const id = data?.[0]; + if (id) router.push({ name: 'InvoiceOutSummary', params: { id } }); } catch (err) { console.error('Error transfering invoice', err); } @@ -52,22 +85,30 @@ const transferInvoice = async () => { +en: + checkInfo: New tickets from the destination customer will be generated in the consignee by default. + transferInvoiceInfo: Destination customer is marked to bill in the consignee + confirmTransferInvoice: The destination customer has selected to bill in the consignee, do you want to continue? es: Transfer invoice: Transferir factura Transfer client: Transferir cliente @@ -157,4 +215,7 @@ es: Class: Clase Type: Tipo Transferred invoice: Factura transferida + Bill destination client: Facturar cliente destino + transferInvoiceInfo: Los nuevos tickets del cliente destino, serán generados en el consignatario por defecto. + confirmTransferInvoice: El cliente destino tiene marcado facturar por consignatario, desea continuar? diff --git a/src/components/UserPanel.vue b/src/components/UserPanel.vue index 691d3db8f2..9c3b456b13 100644 --- a/src/components/UserPanel.vue +++ b/src/components/UserPanel.vue @@ -11,6 +11,7 @@ import VnSelect from 'src/components/common/VnSelect.vue'; import VnRow from 'components/ui/VnRow.vue'; import FetchData from 'components/FetchData.vue'; import { useClipboard } from 'src/composables/useClipboard'; +import VnImg from 'src/components/ui/VnImg.vue'; const state = useState(); const session = useSession(); @@ -47,7 +48,6 @@ const darkMode = computed({ }); const user = state.getUser(); -const token = session.getTokenMultimedia(); const warehousesData = ref(); const companiesData = ref(); const accountBankData = ref(); @@ -149,10 +149,7 @@ function saveUserData(param, value) {
- +
diff --git a/src/components/common/VnInput.vue b/src/components/common/VnInput.vue index 07e82abed2..4cd964012f 100644 --- a/src/components/common/VnInput.vue +++ b/src/components/common/VnInput.vue @@ -22,6 +22,10 @@ const $props = defineProps({ type: String, default: '', }, + clearable: { + type: Boolean, + default: true, + }, }); const { t } = useI18n(); @@ -88,7 +92,7 @@ const inputRules = [ diff --git a/src/components/common/VnInputDate.vue b/src/components/common/VnInputDate.vue index 3c1a12f243..77ab2692db 100644 --- a/src/components/common/VnInputDate.vue +++ b/src/components/common/VnInputDate.vue @@ -1,5 +1,6 @@ + diff --git a/src/components/common/VnProgressModal.vue b/src/components/common/VnProgressModal.vue new file mode 100644 index 0000000000..cfd948d5fa --- /dev/null +++ b/src/components/common/VnProgressModal.vue @@ -0,0 +1,97 @@ + + + + + +es: + Progress: Progreso + Total progress: Progreso total + Cancelled: Cancelado + diff --git a/src/components/common/VnSelect.vue b/src/components/common/VnSelect.vue index 04ccca8891..52cb68438d 100644 --- a/src/components/common/VnSelect.vue +++ b/src/components/common/VnSelect.vue @@ -1,6 +1,5 @@ \ No newline at end of file diff --git a/src/components/ui/VnFilterPanel.vue b/src/components/ui/VnFilterPanel.vue index 218e286002..9eff3d3227 100644 --- a/src/components/ui/VnFilterPanel.vue +++ b/src/components/ui/VnFilterPanel.vue @@ -7,8 +7,11 @@ import toDate from 'filters/toDate'; import VnFilterPanelChip from 'components/ui/VnFilterPanelChip.vue'; const { t } = useI18n(); -const params = defineModel({ default: {}, required: true, type: Object }); const $props = defineProps({ + modelValue: { + type: Object, + default: () => {} + }, dataKey: { type: String, required: true, @@ -60,13 +63,14 @@ const emit = defineEmits(['refresh', 'clear', 'search', 'init', 'remove']); const arrayData = useArrayData($props.dataKey, { exprBuilder: $props.exprBuilder, searchUrl: $props.searchUrl, - navigate: {}, + navigate: $props.redirect ? {} : null, }); const route = useRoute(); const store = arrayData.store; - +const userParams = ref({}) onMounted(() => { - emit('init', { params: params.value }); + userParams.value = $props.modelValue ?? {} + emit('init', { params: userParams.value }); }); function setUserParams(watchedParams) { @@ -75,7 +79,7 @@ function setUserParams(watchedParams) { if (typeof watchedParams == 'string') watchedParams = JSON.parse(watchedParams); watchedParams = { ...watchedParams, ...watchedParams.filter?.where }; delete watchedParams.filter; - params.value = { ...params.value, ...watchedParams }; + userParams.value = { ...userParams.value, ...watchedParams }; } watch( @@ -94,12 +98,12 @@ async function search(evt) { store.filter.where = {}; isLoading.value = true; - const filter = { ...params.value }; + const filter = { ...userParams.value }; store.userParamsChanged = true; store.filter.skip = 0; store.skip = 0; - const { params: newParams } = await arrayData.addFilter({ params: params.value }); - params.value = newParams; + const { params: newParams } = await arrayData.addFilter({ params: userParams.value }); + userParams.value = newParams; if (!$props.showAll && !Object.values(filter).length) store.data = []; @@ -109,7 +113,7 @@ async function search(evt) { async function reload() { isLoading.value = true; - const params = Object.values(params.value).filter((param) => param); + const params = Object.values(userParams.value).filter((param) => param); await arrayData.fetch({ append: false }); if (!$props.showAll && !params.length) store.data = []; @@ -123,17 +127,17 @@ async function clearFilters() { store.filter.skip = 0; store.skip = 0; // Filtrar los params no removibles - const removableFilters = Object.keys(params.value).filter((param) => + const removableFilters = Object.keys(userParams.value).filter((param) => $props.unremovableParams.includes(param) ); const newParams = {}; // Conservar solo los params que no son removibles for (const key of removableFilters) { - newParams[key] = params.value[key]; + newParams[key] = userParams.value[key]; } - params.value = {}; - params.value = { ...newParams }; // Actualizar los params con los removibles - await arrayData.applyFilter({ params: params.value }); + userParams.value = {}; + userParams.value = { ...newParams }; // Actualizar los params con los removibles + await arrayData.applyFilter({ params: userParams.value }); if (!$props.showAll) { store.data = []; @@ -145,8 +149,8 @@ async function clearFilters() { const tagsList = computed(() => { const tagList = []; - for (const key of Object.keys(params.value)) { - const value = params.value[key]; + for (const key of Object.keys(userParams.value)) { + const value = userParams.value[key]; if (value == null || ($props.hiddenTags || []).includes(key)) continue; tagList.push({ label: key, value }); } @@ -161,7 +165,7 @@ const customTags = computed(() => ); async function remove(key) { - params.value[key] = undefined; + userParams.value[key] = undefined; search(); emit('remove', key); } @@ -236,7 +240,7 @@ function formatValue(value) { - +