From 06806ebe10d3121d14715bd44c253f8cad90443f Mon Sep 17 00:00:00 2001 From: Guido Date: Fri, 25 Apr 2025 11:19:26 -0300 Subject: [PATCH] feat(ticket): implementar useTicketData y reemplazar Promise.all() por Promise.allSettled() en TicketView para mejorar manejo de errores MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Se reemplazó Promise.all() por Promise.allSettled() para que si una de las promesas falla, el resto pueda seguir ejecutándose. Esto evita que un solo fallo detenga toda la carga de datos. --- src/composables/useTicketData.js | 133 ++++++++++++++++++++++++++++++ src/pages/Ecomerce/TicketView.vue | 83 +------------------ 2 files changed, 137 insertions(+), 79 deletions(-) create mode 100644 src/composables/useTicketData.js diff --git a/src/composables/useTicketData.js b/src/composables/useTicketData.js new file mode 100644 index 00000000..de406855 --- /dev/null +++ b/src/composables/useTicketData.js @@ -0,0 +1,133 @@ +import { ref } from 'vue'; +import { formatDate } from 'src/lib/filters.js'; + +export const useTicketData = api => { + const ticket = ref({}); + const rows = ref([]); + const services = ref(null); + const packages = ref(null); + const dateFormat = 'DD/MM/YYYY'; + + const fetchTicketData = async ticketId => { + const { data } = await api.post( + 'applications/myTicket_get/execute-proc', + { + schema: 'hedera', + params: [ticketId] + } + ); + return data?.[0] || null; + }; + + const fetchTicketRows = async ticketId => { + const { data } = await api.post( + 'applications/myTicket_getRows/execute-proc', + { + schema: 'hedera', + params: [ticketId] + } + ); + return data || []; + }; + + const fetchTicketServices = async ticketId => { + const { data } = await api.post( + 'applications/myTicket_getServices/execute-proc', + { + schema: 'hedera', + params: [ticketId] + } + ); + return data || null; + }; + + const fetchTicketPackages = async ticketId => { + const { data } = await api.post( + 'applications/myTicket_getPackages/execute-proc', + { + schema: 'hedera', + params: [ticketId] + } + ); + return data || null; + }; + + const formatTicketDates = ticketData => { + if (!ticketData) return; + + const dateFields = ['landed', 'shipped']; + dateFields.forEach(field => { + if (ticketData[field]) { + ticketData[field] = formatDate(ticketData[field], dateFormat); + } + }); + }; + + const processResults = results => { + const [ticketResult, rowsResult, servicesResult, packagesResult] = + results; + + const dataConfig = [ + { + result: ticketResult, + ref: ticket, + errorMessage: 'Error al obtener datos del ticket', + postProcess: data => { + if (data) formatTicketDates(data); + return data; + } + }, + { + result: rowsResult, + ref: rows, + errorMessage: 'Error al obtener filas del ticket' + }, + { + result: servicesResult, + ref: services, + errorMessage: 'Error al obtener servicios del ticket' + }, + { + result: packagesResult, + ref: packages, + errorMessage: 'Error al obtener paquetes del ticket' + } + ]; + + dataConfig.forEach(({ result, ref, errorMessage, postProcess }) => { + if (result.status === 'fulfilled') { + ref.value = postProcess + ? postProcess(result.value) + : result.value; + } else { + console.error(errorMessage, result.reason); + } + }); + }; + + const loadTicketData = async ticketId => { + try { + const results = await Promise.allSettled([ + fetchTicketData(ticketId), + fetchTicketRows(ticketId), + fetchTicketServices(ticketId), + fetchTicketPackages(ticketId) + ]); + + processResults(results); + } catch (error) { + console.error( + 'Error en el procesamiento de datos del ticket:', + error + ); + } + }; + + return { + ticket, + rows, + services, + packages, + loadTicketData + }; +}; diff --git a/src/pages/Ecomerce/TicketView.vue b/src/pages/Ecomerce/TicketView.vue index 20a4cdfe..99fc8a0d 100644 --- a/src/pages/Ecomerce/TicketView.vue +++ b/src/pages/Ecomerce/TicketView.vue @@ -1,5 +1,5 @@