From 768b619904b2a5d2f68d4a5e1f7da5799a3ff473 Mon Sep 17 00:00:00 2001 From: wbuezas Date: Sun, 30 Jun 2024 17:43:21 -0300 Subject: [PATCH 01/45] Sale tracking --- src/i18n/locale/en.yml | 1 + src/i18n/locale/es.yml | 1 + src/pages/Ticket/Card/TicketSaleTracking.vue | 539 +++++++++++++++++++ src/pages/Ticket/locale/en.yml | 18 + src/pages/Ticket/locale/es.yml | 18 + src/router/modules/ticket.js | 11 + 6 files changed, 588 insertions(+) create mode 100644 src/pages/Ticket/Card/TicketSaleTracking.vue diff --git a/src/i18n/locale/en.yml b/src/i18n/locale/en.yml index fbab06966..2b8639ef7 100644 --- a/src/i18n/locale/en.yml +++ b/src/i18n/locale/en.yml @@ -448,6 +448,7 @@ ticket: futureTickets: Future tickets purchaseRequest: Purchase request weeklyTickets: Weekly tickets + saleTracking: Sale tracking list: nickname: Nickname state: State diff --git a/src/i18n/locale/es.yml b/src/i18n/locale/es.yml index fec78d5e6..218976e76 100644 --- a/src/i18n/locale/es.yml +++ b/src/i18n/locale/es.yml @@ -447,6 +447,7 @@ ticket: futureTickets: Tickets a futuro purchaseRequest: Petición de compra weeklyTickets: Tickets programados + saleTracking: Líneas preparadas list: nickname: Alias state: Estado diff --git a/src/pages/Ticket/Card/TicketSaleTracking.vue b/src/pages/Ticket/Card/TicketSaleTracking.vue new file mode 100644 index 000000000..a03f75387 --- /dev/null +++ b/src/pages/Ticket/Card/TicketSaleTracking.vue @@ -0,0 +1,539 @@ + + + diff --git a/src/pages/Ticket/locale/en.yml b/src/pages/Ticket/locale/en.yml index 2c648e7f2..2b173eae9 100644 --- a/src/pages/Ticket/locale/en.yml +++ b/src/pages/Ticket/locale/en.yml @@ -136,3 +136,21 @@ weeklyTickets: salesperson: Salesperson search: Search weekly tickets searchInfo: Search weekly tickets by id or client id +ticketSaleTracking: + isChecked: Is checked + item: Item + description: Description + quantity: Quantity + parking: Parking + historyAction: Log states + shelvingAction: Shelvings sale + original: Original + worker: Worker + state: State + created: Created + shelving: Shelving + saleGroupDetail: sale group detail + previousSelected: previous selected + previous: previous + prepared: prepared + checked: checked diff --git a/src/pages/Ticket/locale/es.yml b/src/pages/Ticket/locale/es.yml index 3ce4c0545..f5f4d89f5 100644 --- a/src/pages/Ticket/locale/es.yml +++ b/src/pages/Ticket/locale/es.yml @@ -138,3 +138,21 @@ ticketSale: shipped: F. Envío agency: Agencia address: Consignatario +ticketSaleTracking: + isChecked: Comprobado + item: Artículo + description: Descripción + quantity: Cantidad + parking: Parking + historyAction: Historial estados + shelvingAction: Carros línea + original: Original + worker: Trabajador + state: Estado + created: Fecha creación + shelving: Matrícula + saleGroupDetail: detalle grupo líneas + previousSelected: previa seleccionado + previous: previa + prepared: preparado + checked: revisado diff --git a/src/router/modules/ticket.js b/src/router/modules/ticket.js index 81ca405ee..5850458bb 100644 --- a/src/router/modules/ticket.js +++ b/src/router/modules/ticket.js @@ -19,6 +19,7 @@ export default { 'TicketSale', 'TicketLog', 'TicketPurchaseRequest', + 'TicketSaleTracking', ], }, children: [ @@ -147,6 +148,16 @@ export default { }, component: () => import('src/pages/Ticket/Card/TicketSms.vue'), }, + { + path: 'sale-tracking', + name: 'TicketSaleTracking', + meta: { + title: 'saleTracking', + icon: 'vn:buyrequest', + }, + component: () => + import('src/pages/Ticket/Card/TicketSaleTracking.vue'), + }, ], }, ], From 34ee92ac2464c6af177a70fbb2d83e341c88df19 Mon Sep 17 00:00:00 2001 From: wbuezas Date: Tue, 2 Jul 2024 21:46:45 -0300 Subject: [PATCH 02/45] Small change --- src/pages/Ticket/Card/TicketSaleTracking.vue | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/pages/Ticket/Card/TicketSaleTracking.vue b/src/pages/Ticket/Card/TicketSaleTracking.vue index a03f75387..86f391a1d 100644 --- a/src/pages/Ticket/Card/TicketSaleTracking.vue +++ b/src/pages/Ticket/Card/TicketSaleTracking.vue @@ -29,6 +29,7 @@ const itemShelvignsSales = ref([]); const shelvingsOptions = ref([]); const parkingsOptions = ref([]); const saleTrackingUrl = computed(() => `SaleTrackings/${route.params.id}/filter`); +const oldQuantity = ref(null); watch( () => route.params.id, @@ -191,10 +192,12 @@ const showShelving = async (sale) => { const updateQuantity = async (sale) => { try { + if (oldQuantity.value === sale.quantity) return; const params = { quantity: sale.quantity, }; await axios.patch(`ItemShelvingSales/${sale.id}`, params); + oldQuantity.value = null; } catch (error) { console.error(error); } @@ -431,7 +434,7 @@ const clickControled = (sale) => { {{ row.subName }} - + @@ -498,7 +501,7 @@ const clickControled = (sale) => { v-model.number="row.quantity" @keyup.enter="updateQuantity(row)" @blur="updateQuantity(row)" - @focus="edit.oldQuantity = row.quantity" + @focus="oldQuantity = row.quantity" /> From c25b04e07553df5be5c5aa262233347f326d3701 Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Wed, 3 Jul 2024 11:48:51 +0200 Subject: [PATCH 03/45] improve QChebox --- src/pages/Ticket/Card/TicketSaleTracking.vue | 27 ++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/pages/Ticket/Card/TicketSaleTracking.vue b/src/pages/Ticket/Card/TicketSaleTracking.vue index 86f391a1d..823fe762f 100644 --- a/src/pages/Ticket/Card/TicketSaleTracking.vue +++ b/src/pages/Ticket/Card/TicketSaleTracking.vue @@ -368,6 +368,7 @@ const clickControled = (sale) => { @@ -378,6 +379,7 @@ const clickControled = (sale) => { @@ -388,6 +390,7 @@ const clickControled = (sale) => { @@ -398,6 +401,7 @@ const clickControled = (sale) => { @@ -408,6 +412,8 @@ const clickControled = (sale) => { @@ -540,3 +546,24 @@ const clickControled = (sale) => { + + From 2340aaba0b48f8114d9c64ce4feb4d21a3d26585 Mon Sep 17 00:00:00 2001 From: alexm Date: Wed, 3 Jul 2024 14:39:15 +0200 Subject: [PATCH 04/45] feat: list use vnTable, fix descriptor --- src/components/ui/CardDescriptor.vue | 7 +- src/i18n/locale/en.yml | 63 ----- src/i18n/locale/es.yml | 63 ----- src/pages/Claim/Card/ClaimAction.vue | 8 +- src/pages/Claim/Card/ClaimActionTable.vue | 99 ++++++++ src/pages/Claim/Card/ClaimBasicData.vue | 17 +- src/pages/Claim/Card/ClaimDescriptor.vue | 27 +-- src/pages/Claim/Card/ClaimPhoto.vue | 8 +- src/pages/Claim/ClaimFilter.vue | 277 +++++++++------------- src/pages/Claim/ClaimList.vue | 174 +++++++------- src/pages/Claim/locale/en.yml | 46 ++++ src/pages/Claim/locale/es.yml | 46 ++++ src/pages/Order/Card/OrderDescriptor.vue | 2 +- 13 files changed, 419 insertions(+), 418 deletions(-) create mode 100644 src/pages/Claim/Card/ClaimActionTable.vue create mode 100644 src/pages/Claim/locale/en.yml diff --git a/src/components/ui/CardDescriptor.vue b/src/components/ui/CardDescriptor.vue index 2bb5234ad..e4e007567 100644 --- a/src/components/ui/CardDescriptor.vue +++ b/src/components/ui/CardDescriptor.vue @@ -56,7 +56,12 @@ onBeforeMount(async () => { skip: 0, }); store = arrayData.store; - entity = computed(() => (Array.isArray(store.data) ? store.data[0] : store.data)); + entity = computed(() => { + const data = Array.isArray(store.data) ? store.data[0] : store.data; + emit('onFetch', data); + return data; + }); + // It enables to load data only once if the module is the same as the dataKey if (!isSameDataKey.value || !route.params.id) await getData(); watch( diff --git a/src/i18n/locale/en.yml b/src/i18n/locale/en.yml index e4ef31f8e..766463c1e 100644 --- a/src/i18n/locale/en.yml +++ b/src/i18n/locale/en.yml @@ -627,69 +627,6 @@ ticket: landed: Landed warehouse: Warehouse agency: Agency -claim: - list: - customer: Customer - assignedTo: Assigned - created: Created - state: State - rmaList: - code: Code - records: records - card: - claimId: Claim ID - attendedBy: Attended by - created: Created - state: State - ticketId: Ticket ID - customerSummary: Customer summary - claimedTicket: Claimed ticket - saleTracking: Sale tracking - ticketTracking: Ticket tracking - commercial: Commercial - province: Province - zone: Zone - customerId: client ID - summary: - customer: Customer - assignedTo: Assigned - attendedBy: Attended by - created: Created - state: State - details: Details - item: Item - landed: Landed - quantity: Quantity - claimed: Claimed - price: Price - discount: Discount - total: Total - actions: Actions - responsibility: Responsibility - company: Company - person: Employee/Customer - notes: Notes - photos: Photos - development: Development - reason: Reason - result: Result - responsible: Responsible - worker: Worker - redelivery: Redelivery - changeState: Change state - basicData: - customer: Customer - assignedTo: Assigned - created: Created - state: State - pickup: Pick up - null: No - agency: Agency - delivery: Delivery - photo: - fileDescription: 'Claim id {claimId} from client {clientName} id {clientId}' - noData: 'There are no images/videos, click here or drag and drop the file' - dragDrop: Drag and drop it here invoiceOut: list: ref: Reference diff --git a/src/i18n/locale/es.yml b/src/i18n/locale/es.yml index d02f47afd..585ced8b5 100644 --- a/src/i18n/locale/es.yml +++ b/src/i18n/locale/es.yml @@ -625,69 +625,6 @@ ticket: landed: F. entrega warehouse: Almacén agency: Agencia -claim: - list: - customer: Cliente - assignedTo: Asignada a - created: Creada - state: Estado - rmaList: - code: Código - records: registros - card: - claimId: ID reclamación - attendedBy: Atendida por - created: Creada - state: Estado - ticketId: ID ticket - customerSummary: Resumen del cliente - claimedTicket: Ticket reclamado - saleTracking: Líneas preparadas - ticketTracking: Estados del ticket - commercial: Comercial - province: Provincia - zone: Zona - customerId: ID del cliente - summary: - customer: Cliente - assignedTo: Asignada a - attendedBy: Atendida por - created: Creada - state: Estado - details: Detalles - item: Artículo - landed: Entregado - quantity: Cantidad - claimed: Reclamado - price: Precio - discount: Descuento - total: Total - actions: Acciones - responsibility: Responsabilidad - company: Empresa - person: Comercial/Cliente - notes: Observaciones - photos: Fotos - development: Trazabilidad - reason: Motivo - result: Consecuencias - responsible: Responsable - worker: Trabajador - redelivery: Devolución - changeState: Cambiar estado - basicData: - customer: Cliente - assignedTo: Asignada a - created: Creada - state: Estado - pickup: Recogida - null: No - agency: Agencia - delivery: Reparto - photo: - fileDescription: 'Reclamacion ID {claimId} del cliente {clientName} id {clientId}' - noData: No hay imágenes/videos haz click aquí o arrastra y suelta el archivo - dragDrop: Arrástralo y sueltalo aquí invoiceOut: list: ref: Referencia diff --git a/src/pages/Claim/Card/ClaimAction.vue b/src/pages/Claim/Card/ClaimAction.vue index a24a2a15e..e64eab81d 100644 --- a/src/pages/Claim/Card/ClaimAction.vue +++ b/src/pages/Claim/Card/ClaimAction.vue @@ -33,8 +33,8 @@ const DEFAULT_MAX_RESPONSABILITY = 5; const DEFAULT_MIN_RESPONSABILITY = 1; const arrayData = useArrayData('claimData'); const marker_labels = [ - { value: DEFAULT_MIN_RESPONSABILITY, label: t('claim.summary.company') }, - { value: DEFAULT_MAX_RESPONSABILITY, label: t('claim.summary.person') }, + { value: DEFAULT_MIN_RESPONSABILITY, label: t('claim.company') }, + { value: DEFAULT_MAX_RESPONSABILITY, label: t('claim.person') }, ]; const multiplicatorValue = ref(); const loading = ref(false); @@ -209,12 +209,12 @@ async function post(query, params) {

- {{ t('claim.summary.actions') }} + {{ t('claim.actions') }}

+import { ref, computed, onMounted } from 'vue'; +import { useQuasar } from 'quasar'; +import { useI18n } from 'vue-i18n'; +import { useRoute } from 'vue-router'; +import axios from 'axios'; +import { useStateStore } from 'src/stores/useStateStore'; +import { toDate, toPercentage, toCurrency } from 'filters/index'; +import VnTable from 'src/components/VnTable/VnTable.vue'; +import FetchData from 'src/components/FetchData.vue'; +import VnSelect from 'src/components/common/VnSelect.vue'; +import ItemDescriptorProxy from 'src/pages/Item/Card/ItemDescriptorProxy.vue'; +import TicketDescriptorProxy from 'src/pages/Ticket/Card/TicketDescriptorProxy.vue'; +import { useArrayData } from 'composables/useArrayData'; + +const { t } = useI18n(); +const quasar = useQuasar(); + +const $props = defineProps({ + id: { + type: Number, + required: true, + }, +}); + +const columns = computed(() => [ + { + name: 'id', + label: t('Id item'), + field: (row) => row.itemFk, + }, + { + name: 'ticketFk', + label: t('Ticket'), + align: 'center', + }, + { + name: 'destination', + label: t('Destination'), + field: (row) => row.claimDestinationFk, + align: 'left', + }, + { + name: 'Landed', + label: t('Landed'), + field: (row) => toDate(row.landed), + }, + { + name: 'quantity', + label: t('Quantity'), + field: (row) => row.quantity, + }, + { + name: 'concept', + label: t('Description'), + field: (row) => row.concept, + align: 'left', + }, + { + name: 'price', + label: t('Price'), + field: (row) => row.price, + format: (value) => value, + align: 'center', + }, + { + name: 'discount', + label: t('Discount'), + field: (row) => row.discount, + format: (value) => toPercentage(value / 100), + align: 'left', + }, + { + name: 'total', + label: t('Total'), + field: (row) => row.total, + format: (value) => value, + align: 'center', + }, + { + name: 'delete', + }, +]); + + diff --git a/src/pages/Claim/Card/ClaimBasicData.vue b/src/pages/Claim/Card/ClaimBasicData.vue index 4656980d9..de0dc50c3 100644 --- a/src/pages/Claim/Card/ClaimBasicData.vue +++ b/src/pages/Claim/Card/ClaimBasicData.vue @@ -30,7 +30,7 @@ function setClaimStates(data) { } async function getEnumValues() { - optionsList.value = [{ id: null, description: t('claim.basicData.null') }]; + optionsList.value = [{ id: null, description: t('claim.null') }]; const { data } = await axios.get(`Applications/get-enum-values`, { params: { schema: 'vn', @@ -39,7 +39,7 @@ async function getEnumValues() { }, }); for (let value of data) - optionsList.value.push({ id: value, description: t(`claim.basicData.${value}`) }); + optionsList.value.push({ id: value, description: t(`claim.${value}`) }); } getEnumValues(); @@ -77,17 +77,14 @@ const statesFilter = { - + { From 4a01f1d930b750c82b7ed6979b28a3aa2ad589c4 Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Thu, 4 Jul 2024 10:40:11 +0200 Subject: [PATCH 05/45] perf: cleancode --- src/pages/Ticket/Card/TicketSaleTracking.vue | 66 +++++++------------- 1 file changed, 23 insertions(+), 43 deletions(-) diff --git a/src/pages/Ticket/Card/TicketSaleTracking.vue b/src/pages/Ticket/Card/TicketSaleTracking.vue index 823fe762f..858a35e61 100644 --- a/src/pages/Ticket/Card/TicketSaleTracking.vue +++ b/src/pages/Ticket/Card/TicketSaleTracking.vue @@ -246,9 +246,9 @@ const saleTrackingNew = async (sale, stateCode, isChecked) => { try { const params = { saleFk: sale.saleFk, - isChecked: isChecked, + isChecked, quantity: sale.quantity, - stateCode: stateCode, + stateCode, }; await axios.post(`SaleTrackings/new`, params); notify(t('globals.dataSaved'), 'positive'); @@ -257,10 +257,10 @@ const saleTrackingNew = async (sale, stateCode, isChecked) => { } }; -const saleTrackingDel = async (sale, stateCode) => { +const saleTrackingDel = async ({ saleFk }, stateCode) => { try { const params = { - saleFk: sale.saleFk, + saleFk, stateCodes: [stateCode], }; await axios.post(`SaleTrackings/delete`, params); @@ -284,14 +284,8 @@ const clickSaleGroupDetail = async (sale) => { const clickPreviousSelected = (sale) => { try { - if (!sale.isPreviousSelected) { - saleTrackingNew(sale, 'PREVIOUS_PREPARATION', false); - sale.isPreviousSelected = true; - } else { - saleTrackingDel(sale, 'PREVIOUS_PREPARATION'); - sale.isPreviousSelected = false; - sale.isPrevious = false; - } + qCheckBoxController(sale, 'isPreviousSelected'); + if (!sale.isPreviousSelected) sale.isPrevious = false; } catch (error) { console.error(error); } @@ -299,41 +293,28 @@ const clickPreviousSelected = (sale) => { const clickPrevious = (sale) => { try { - if (!sale.isPrevious) { - saleTrackingNew(sale, 'PREVIOUS_PREPARATION', true); - sale.isPrevious = true; - sale.isPreviousSelected = true; - } else { - saleTrackingNew(sale, 'PREVIOUS_PREPARATION', false); - sale.isPrevious = false; - } + qCheckBoxController(sale, 'isPrevious'); + if (sale.isPrevious) sale.isPreviousSelected = true; } catch (error) { console.error(error); } }; -const clickPrepared = (sale) => { +const qCheckBoxController = (sale, action) => { + const STATE_CODES = { + isControled: 'CHECKED', + isPrepared: 'PREPARED', + isPrevious: 'PREVIOUS_PREPARATION', + isPreviousSelected: 'PREVIOUS_PREPARATION', + }; + const stateCode = STATE_CODES[action]; try { - if (!sale.isPrepared) { - saleTrackingNew(sale, 'PREPARED', true); - sale.isPrepared = true; + if (!sale[action]) { + saleTrackingNew(sale, stateCode, true); + sale[action] = true; } else { - saleTrackingDel(sale, 'PREPARED'); - sale.isPrepared = false; - } - } catch (error) { - console.error(error); - } -}; - -const clickControled = (sale) => { - try { - if (!sale.isControled) { - saleTrackingNew(sale, 'CHECKED', true); - sale.isControled = true; - } else { - saleTrackingDel(sale, 'CHECKED'); - sale.isControled = false; + saleTrackingDel(sale, stateCode); + sale[action] = false; } } catch (error) { console.error(error); @@ -403,7 +384,7 @@ const clickControled = (sale) => { color="warning" class="warning" :toggle-indeterminate="false" - @update:model-value="clickPrepared(row)" + @update:model-value="qCheckBoxController(row, 'isPrepared')" > {{ t('ticketSaleTracking.prepared') }} @@ -413,9 +394,8 @@ const clickControled = (sale) => { :model-value="!!row.isControled" color="yellow" class="yellow" - style="stroke: red" :toggle-indeterminate="false" - @update:model-value="clickControled(row)" + @update:model-value="qCheckBoxController(row, 'isControled')" > {{ t('ticketSaleTracking.checked') }} From 317746b1f5ed078064be819ef0c71d9b59c60ee6 Mon Sep 17 00:00:00 2001 From: guillermo Date: Fri, 5 Jul 2024 07:10:41 +0200 Subject: [PATCH 06/45] hotfix: refs #6769 Changes --- src/pages/Item/Card/ItemDiary.vue | 71 +++++++++++++++---- src/pages/Item/locale/en.yml | 4 +- src/pages/Item/locale/es.yml | 4 +- src/pages/Order/Card/OrderDescriptorProxy.vue | 17 +++++ 4 files changed, 77 insertions(+), 19 deletions(-) create mode 100644 src/pages/Order/Card/OrderDescriptorProxy.vue diff --git a/src/pages/Item/Card/ItemDiary.vue b/src/pages/Item/Card/ItemDiary.vue index c2687e0fd..9e2deef1c 100644 --- a/src/pages/Item/Card/ItemDiary.vue +++ b/src/pages/Item/Card/ItemDiary.vue @@ -5,7 +5,9 @@ import { useRoute } from 'vue-router'; import TicketDescriptorProxy from 'src/pages/Ticket/Card/TicketDescriptorProxy.vue'; import EntryDescriptorProxy from 'src/pages/Entry/Card/EntryDescriptorProxy.vue'; +import OrderDescriptorProxy from 'src/pages/Order/Card/OrderDescriptorProxy.vue'; import CustomerDescriptorProxy from 'src/pages/Customer/Card/CustomerDescriptorProxy.vue'; +import SupplierDescriptorProxy from 'src/pages/Supplier/Card/SupplierDescriptorProxy.vue'; import FetchData from 'components/FetchData.vue'; import VnSelect from 'src/components/common/VnSelect.vue'; import VnInputDate from 'src/components/common/VnInputDate.vue'; @@ -45,8 +47,8 @@ const columns = computed(() => [ align: 'left', }, { - label: t('itemDiary.id'), - name: 'id', + label: t('itemDiary.origin'), + name: 'origin', align: 'left', }, { @@ -65,8 +67,8 @@ const columns = computed(() => [ }, { - label: t('itemDiary.client'), - name: 'client', + label: t('itemDiary.entity'), + name: 'entity', align: 'left', format: (val) => dashIfEmpty(val), }, @@ -111,10 +113,30 @@ const getBadgeAttrs = (_date) => { return attrs; }; -const getIdDescriptor = (row) => { - let descriptor = EntryDescriptorProxy; - if (row.isTicket) descriptor = TicketDescriptorProxy; - return descriptor; +const originTypeMap = { + entry: { + descriptor: EntryDescriptorProxy, + icon: 'vn:entry', + }, + ticket: { + descriptor: TicketDescriptorProxy, + icon: 'vn:ticket', + }, + order: { + descriptor: OrderDescriptorProxy, + icon: 'vn:basket', + }, +}; + +const entityTypeMap = { + client: { + descriptor: CustomerDescriptorProxy, + icon: 'vn:client', + }, + supplier: { + descriptor: SupplierDescriptorProxy, + icon: 'vn:supplier', + }, }; onMounted(async () => { @@ -206,10 +228,10 @@ onUnmounted(() => (stateStore.rightDrawer = false)); -