diff --git a/src/pages/Auditor.jsx b/src/pages/Auditor.jsx index 73517eb..62d55d8 100644 --- a/src/pages/Auditor.jsx +++ b/src/pages/Auditor.jsx @@ -1,10 +1,18 @@ import React, { useState, useEffect } from 'react'; import { Link } from 'react-router-dom'; -import { getWithAuth, postWithAuth } from '../fetchWithAuth'; +import { getWithAuth, postWithAuth, fetchWithAuth } from '../fetchWithAuth'; +import { useNotification } from '../context/NotificationContext'; +import hljs from 'highlight.js/lib/core'; +import xml from 'highlight.js/lib/languages/xml'; +import 'highlight.js/styles/github.css'; +hljs.registerLanguage('xml', xml); +import { downloadFile } from '../utils/downloadUtils'; + const API_URL = import.meta.env.VITE_EFC_API_URL; function Auditor() { + const { showMessage } = useNotification(); const [loading, setLoading] = useState(false); const [error, setError] = useState(''); const [pedimentos, setPedimentos] = useState([]); @@ -16,14 +24,41 @@ function Auditor() { const [auditandoPartidas, setAuditandoPartidas] = useState(false); const [auditandoRemesas, setAuditandoRemesas] = useState(false); const [procesandoPedimento, setProcesandoPedimento] = useState(null); + const [procesandoPartida, setProcesandoPartida] = useState(null); const [procesandoRemesa, setProcesandoRemesa] = useState(null); const [procesandoAcuse, setProcesandoAcuse] = useState(null); + const [procesandoAcuseCove, setProcesandoAcuseCove] = useState(null); const [procesandoCove, setProcesandoCove] = useState(null); + const [procesandoEdocumento, setProcesandoEdocumento] = useState(null); const [auditandoAcusesCove, setAuditandoAcusesCove] = useState(false); const [pedimentoFilter, setPedimentoFilter] = useState(''); const [auditandoEDocuments, setAuditandoEDocuments] = useState(false); const [auditandoAcuses, setAuditandoAcuses] = useState(false); + const [showXmlModal, setShowXmlModal] = useState(false); + const [xmlData, setXmlData] = useState(null); + // Estados para modal de preview + const [previewOpen, setPreviewOpen] = useState(false); + const [previewUrl, setPreviewUrl] = useState(''); + const [previewType, setPreviewType] = useState(''); + const [previewLoading, setPreviewLoading] = useState(false); + const [previewError, setPreviewError] = useState(''); + const [previewXml, setPreviewXml] = useState(''); + const [previewXmlHtml, setPreviewXmlHtml] = useState(''); + const [previewDoc, setPreviewDoc] = useState(null); + const [previewContent, setPreviewContent] = useState(''); + const [imageZoom, setImageZoom] = useState(1); + + // === Estados Peticiones a VU === // + const [peticionPedimentoVU, setPeticionPedimentoVU] = useState(null); // ID del pedimento en procesamiento + const [viewPeticionPedimentoVU, setViewPeticionPedimentoVU] = useState(null); // ID del pedimento para ver XML + + const [detalleModalXml, setDetalleModalXml] = useState(null); + + // Agrega este estado cerca de los otros estados + const [activeVista, setActiveVista] = useState(null); // 'pc', 'rm', 'pt', 'ac', 'cove', 'ac_cove', 'edoc' + + // Handler para auditar acuses (general) const handleAuditarAcuses = async () => { if (auditandoAcuses) return; @@ -97,13 +132,36 @@ function Auditor() { } }; + // Handler para auditar un pedimento específico + const handleAuditarPedimento = async (pedimentoId) => { + if (procesandoPedimento) return; + try { + setProcesandoPedimento(pedimentoId); + const response = await postWithAuth(`${API_URL}/customs/auditor/auditar-pedimento/`, { + pedimento_id: pedimentoId + }); + if (!response.ok) { + throw new Error('Error al auditar el pedimento'); + } + // alert('El pedimento se ha auditado correctamente'); + showMessage('El pedimento se ha auditado correctamente', 'success'); + } catch (error) { + // console.error('Error:', error); + // alert(error.message); + showMessage(error.message || 'Error al auditar el pedimento', 'error'); + } finally { + setProcesandoPedimento(null); + } + }; + + // Handler para auditar remesas de un pedimento específico const handleAuditarRemesaPedimento = async (pedimentoId) => { if (procesandoRemesa) return; try { setProcesandoRemesa(pedimentoId); - const response = await postWithAuth(`${API_URL}/customs/auditor/auditar-procesamiento-remesa/pedimento/`, { + const response = await postWithAuth(`${API_URL}/customs/auditor/auditar-remesa/pedimento/`, { pedimento_id: pedimentoId }); @@ -112,11 +170,11 @@ function Auditor() { } // Mostrar mensaje de éxito - alert('Las remesas del pedimento se están procesando'); - + showMessage('Las remesas del pedimento se están procesando', 'success'); } catch (error) { - console.error('Error:', error); - alert(error.message); + // console.error('Error:', error); + //alert(error.message); + showMessage(error.message || 'Error al procesar las remesas del pedimento', 'error'); } finally { setProcesandoRemesa(null); } @@ -154,11 +212,12 @@ function Auditor() { }; const handleAuditarPartidasPedimento = async (pedimentoId) => { - if (procesandoPedimento) return; - + // if (procesandoPedimento) return; + if (procesandoPartida) return; + try { - setProcesandoPedimento(pedimentoId); - + // setProcesandoPedimento(pedimentoId); + setProcesandoPartida(pedimentoId); const response = await postWithAuth(`${API_URL}/customs/auditor/crear-partidas/pedimento/`, { pedimento_id: pedimentoId }); @@ -168,13 +227,14 @@ function Auditor() { } // Mostrar mensaje de éxito - alert('Las partidas del pedimento se están procesando'); - + showMessage('Las partidas del pedimento se están procesando', 'success'); } catch (error) { - console.error('Error:', error); - alert(error.message); + //console.error('Error:', error); + // alert(error.message); + showMessage(error.message || 'Error al procesar las partidas del pedimento', 'error'); } finally { - setProcesandoPedimento(null); + // setProcesandoPedimento(null); + setProcesandoPartida(null); } }; @@ -250,15 +310,60 @@ function Auditor() { if (!response.ok) { throw new Error('Error al auditar acuse del pedimento'); } - alert('El acuse del pedimento se está auditando'); + // alert('El acuse del pedimento se está auditando'); + showMessage('El acuse del pedimento se está auditando', 'success'); } catch (error) { - console.error('Error:', error); - alert(error.message); + // console.error('Error:', error); + // alert(error.message); + showMessage(error.message || 'Error al auditar acuse del pedimento', 'error'); } finally { setProcesandoAcuse(null); } }; + const handleAuditarAcusesCovePedimento = async (pedimentoId) => { + if (procesandoAcuseCove) return; + try { + setProcesandoAcuseCove(pedimentoId); + const response = await postWithAuth(`${API_URL}/customs/auditor/auditar-acuse-cove/pedimento/`, { + pedimento_id: pedimentoId + }); + if (!response.ok) { + throw new Error('Error al auditar acuse cove del pedimento'); + } + // alert('El acuse del pedimento se está auditando'); + showMessage('El acuse cove del pedimento se está auditando', 'success'); + } catch (error) { + // console.error('Error:', error); + // alert(error.message); + showMessage(error.message || 'Error al auditar acuse cove del pedimento', 'error'); + } finally { + setProcesandoAcuseCove(null); + } + + }; + +const handleAuditarEDocumentPedimento = async (pedimentoId) => { + if (procesandoEdocumento) return; + try { + setProcesandoEdocumento(pedimentoId); + const response = await postWithAuth(`${API_URL}/customs/auditor/auditar-edocument/pedimento/`, { + pedimento_id: pedimentoId + }); + if (!response.ok) { + throw new Error('Error al auditar eDocument del pedimento'); + } + // alert('El eDocument del pedimento se está auditando'); + showMessage('El eDocument del pedimento se está auditando', 'success'); + } catch (error) { + // console.error('Error:', error); + // alert(error.message); + showMessage(error.message || 'Error al auditar eDocument del pedimento', 'error'); + } finally { + setProcesandoEdocumento(null); + } + }; + const handleAuditarCovePedimento = async (pedimentoId) => { if (procesandoCove) return; try { @@ -269,15 +374,780 @@ function Auditor() { if (!response.ok) { throw new Error('Error al auditar COVE del pedimento'); } - alert('El COVE del pedimento se está auditando'); + // alert('El COVE del pedimento se está auditando'); + showMessage('El COVE del pedimento se está auditando', 'success'); } catch (error) { - console.error('Error:', error); - alert(error.message); + // console.error('Error:', error); + // alert(error.message); + showMessage(error.message || 'Error al auditar COVE del pedimento', 'error'); } finally { setProcesandoCove(null); } }; + const handlePeticionPedimentoVU = async (pedimentoId, pedimentoApp) => { + if(peticionPedimentoVU) return; + + try + { + setPeticionPedimentoVU(pedimentoId); + const response = await postWithAuth(`${API_URL}/record/microservice/pedimento-completo/`, { + pedimento_id: pedimentoId + }); + if (!response.ok) { + showMessage('Error al intentar realizar la peticion de pedimento VU', 'warning'); + return; + } + + // const dataResponse = await response.json(); + + // alert('El pedimento VU se está auditando. ID Tarea: '+dataResponse.task_id); + + showMessage(`Pedimento ${pedimentoApp} en proceso peticion VU (prueba)`, 'success'); + }catch(error) + { + showMessage(error.message || 'Error peticion pedimento VU', 'error'); + }finally + { + setPeticionPedimentoVU(null); + } + }; + +// const handleViewXmlPedimentoVURequest= async (pedimentoId) => { + +// setShowXmlModal(false); + +// if (viewPeticionPedimentoVU) return; + +// try { + +// setViewPeticionPedimentoVU(pedimentoId); + +// const response = await postWithAuth(`${API_URL}/customs/auditor/peticion-respuesta/pedimento-vu/`, { +// pedimento_id: pedimentoId +// }); + +// if (!response.ok) { +// showMessage('Error al intentar mostrar la peticion de pedimento VU', 'error'); +// setViewPeticionPedimentoVU(null); +// return; +// } +// const data = await response.json(); +// // ¡IMPORTANTE! Extraer los datos JSON de la respuesta + +// console.log('Respuesta peticion pedimento VU:', data); +// setXmlData(data); +// setShowXmlModal(true); + +// }catch(error) { +// showMessage(error.message || 'Error en vista de peticion pedimento VU', 'error'); +// }finally +// { +// setViewPeticionPedimentoVU(null); +// } + + +// // showMessage(`${API_URL}/customs/auditor/peticion-respuesta/pedimento-vu/`, 'error'); +// }; + + // const handleModalPeticionRespuesta = async (pedimento, vista_auditar) => { + + // setShowXmlModal(false); + + // if (detalleModalXml) return; + + // try{ + + // setDetalleModalXml(pedimento); + + // // Crear el objeto de datos basado en 'pedimento' + // // const data = { + // // id: pedimento.id, + // // pedimento_app: pedimento.pedimento_app, + // // organizacion: pedimento.organizacion ? pedimento.organizacion : null, + // // contribuyente: pedimento.contribuyente ? pedimento.contribuyente.rfc : null, + // // creado: pedimento.created_at, + // // }; + + // const response = await postWithAuth(`${API_URL}/customs/auditor/peticion-respuesta/pedimento-vu/`, { + // pedimento_id: pedimento.id + // }); + + // if (!response.ok) { + // showMessage('Error al intentar mostrar la peticion de pedimento VU', 'error'); + // setDetalleModalXml(null); + // return; + // } + // const data = await response.json(); + // data.vista = vista_auditar; + + // // console.log('Respuesta peticion pedimento VU:', data); + // setXmlData(data); + // setShowXmlModal(true); + + // console.log('pedimento para modal peticion/response VU:', pedimento); + + // } catch(error) { + // showMessage(error.message || 'Error en vista de peticion pedimento VU', 'error'); + // }finally { + // setDetalleModalXml(null); + // } + + // // console.log('Mostrar modal peticion/response para pedimento:', pedimento); + // }; + + const handleModalPeticionRespuesta = async (pedimento, vista_auditar) => { + + setShowXmlModal(false); + setActiveVista(vista_auditar); + + if (detalleModalXml) return; + + try { + + setDetalleModalXml(pedimento); + let endpoint = `${API_URL}/customs/auditor/peticion-respuesta/pedimento-vu/`; + + const response = await postWithAuth(endpoint, { + pedimento_id: pedimento.id + }); + + if (!response.ok) { + showMessage(`Error al obtener datos para vista ${vista_auditar}`, 'error'); + setDetalleModalXml(null); + return; + } + + const data = await response.json(); + data.vista = vista_auditar; + data.vista_nombre = getVistaNombre(vista_auditar); // Función helper + + setXmlData(data); + setShowXmlModal(true); + + } catch (error) { + showMessage(error.message || `Error en vista ${vista_auditar}`, 'error'); + } + finally { + setDetalleModalXml(null); + } + + }; + + const getVistaNombre = (vista) => { + const nombres = { + 'pc': 'Pedimento Completo', + 'rm': 'Remesas', + 'pt': 'Partidas', + 'ac': 'Acuse', + 'cove': 'COVE', + 'ac_cove': 'Acuse de COVE', + 'edoc': 'E-Document' + }; + return nombres[vista] || vista; +}; + + const formatFileSize = (bytes) => { + if (!bytes) return 'N/A'; + const kb = bytes / 1024; + if (kb < 1024) { + return `${kb.toFixed(1)} KB`; + } + const mb = kb / 1024; + return `${mb.toFixed(1)} MB`; + }; + + const previewDocument = async (doc) => { + await handlePreview(doc); + }; + + // Vista previa de documento + const handlePreview = async (doc) => { + setPreviewLoading(true); + setPreviewError(''); + setPreviewUrl(''); + setPreviewType(''); + setPreviewXml(''); + setPreviewDoc(doc); + setImageZoom(1); + setPreviewContent(''); + setPreviewOpen(true); + try { + const res = await fetchWithAuth(`${API_URL}/record/documents/descargar/${doc.id}/`); + + if (!res.ok) { + setPreviewError('Error al obtener el archivo'); + setPreviewLoading(false); + return; + } + + // Detectar tipo de archivo + let type = ''; + if (doc.extension) { + if (doc.extension.toLowerCase() === 'pdf') type = 'pdf'; + else if (["jpg","jpeg","png","gif","bmp","webp"].includes(doc.extension.toLowerCase())) type = 'img'; + else if (doc.extension.toLowerCase() === 'xml') type = 'xml'; + else if (["txt","log","csv"].includes(doc.extension.toLowerCase())) type = 'txt'; + else type = 'other'; + } + setPreviewType(type); + + if (type === 'xml') { + const text = await res.text(); + const prettyText = formatXml(text); + setPreviewXml(prettyText); + // Formatear y resaltar XML + try { + const highlighted = hljs.highlight(prettyText, { language: 'xml' }).value; + setPreviewXmlHtml(highlighted); + } catch (e) { + setPreviewXmlHtml(prettyText); + } + setPreviewLoading(false); + } else if (type === 'txt') { + const text = await res.text(); + setPreviewContent(text); + setPreviewLoading(false); + } else { + const blob = await res.blob(); + const url = window.URL.createObjectURL(blob); + setPreviewUrl(url); + setPreviewLoading(false); + } + } catch (err) { + console.error('Error in preview:', err); + if (err.message === 'SESSION_EXPIRED') { + setPreviewError('Tu sesión ha expirado, por favor inicia sesión de nuevo.'); + } else { + setPreviewError('Error al obtener el archivo'); + } + setPreviewLoading(false); + } + }; + + const handleSwitchPeticion = (vista_auditar, pedimentoId) => { + switch (vista_auditar) { + case 'pc': + handlePreviewPeticionPedimentoVU(pedimentoId); + break; + case 'rm': + handlePreviewPeticionRemesaVU(pedimentoId); + break; + case 'pt': + handlePreviewPeticionPartidasVU(pedimentoId); + break; + case 'ac': + handlePreviewPeticionAcuseVU(pedimentoId); + break; + case 'cove': + handlePreviewPeticionCoveVU(pedimentoId); + break; + case 'ac_cove': + handlePreviewPeticionAcuseCoveVU(pedimentoId); + break; + case 'edoc': + handlePreviewPeticionEdocVU(pedimentoId); + break; + default: + // handlePreviewPeticionPedimentoVU(pedimentoId); + showMessage('Vista no reconocida para petición VU', 'warning'); + break; + } + }; + + const handleSwitchRespuesta= (vista_auditar, pedimentoId) => { + switch (vista_auditar) { + case 'pc': + handlePreviewRespuestaPedimentoVU(pedimentoId); + break; + case 'rm': + handlePreviewRespuestaRemesaVU(pedimentoId); + break; + case 'pt': + handlePreviewRespuestaPartidasVU(pedimentoId); + break; + case 'ac': + handlePreviewRespuestaAcuseVU(pedimentoId); + break; + case 'cove': + handlePreviewRespuestaCoveVU(pedimentoId); + break; + case 'ac_cove': + handlePreviewRespuestaAcuseCoveVU(pedimentoId); + break; + case 'edoc': + handlePreviewRespuestaEdocVU(pedimentoId); + break; + default: + // handlePreviewPeticionPedimentoVU(pedimentoId); + showMessage('Vista no reconocida para respuesta VU', 'warning'); + break; + } + }; + + // Vista previa de petición Pedimento VU + const handlePreviewPeticionPedimentoVU = async (pedimentoId) => { + + try { + // Obtener el documento de petición + const response = await postWithAuth(`${API_URL}/customs/auditor/obtener-peticion/pedimento-vu/`, { + pedimento_id: pedimentoId + }); + + if (!response.ok) { + // Obtener el JSON de error que devuelve Django + const errorData = await response.json(); + + const errorMessage = errorData.error || + `Error ${response.status}: ${response.statusText}`; + + showMessage(`No se encontró archivo de petición VU: ${errorMessage}`, 'warning'); + return; + } + + const documento = await response.json(); + + // Llamar a la función de vista previa existente + await previewDocument(documento); + + }catch(error) { + console.error('Error al obtener petición VU:', error); + showMessage('Error al cargar la petición VU', 'error'); + } + }; + + // Vista previa de respuesta Pedimento VU + const handlePreviewRespuestaPedimentoVU = async (pedimentoId) => { + try { + // Obtener el documento de petición + const response = await postWithAuth(`${API_URL}/customs/auditor/obtener-respuesta/pedimento-vu/`, { + pedimento_id: pedimentoId + }); + + if (!response.ok) { + // Obtener el JSON de error que devuelve Django + const errorData = await response.json(); + + const errorMessage = errorData.error || + `Error ${response.status}: ${response.statusText}`; + + showMessage(`No se encontró archivo de petición VU: ${errorMessage}`, 'warning'); + return; + } + + const documento = await response.json(); + + // Llamar a la función de vista previa existente + await previewDocument(documento); + + }catch(error) { + console.error('Error al obtener petición VU:', error); + showMessage('Error al cargar la petición VU', 'error'); + } + }; + + // Vista previa de petición Remesa VU + const handlePreviewPeticionRemesaVU = async (pedimentoId) => { + + try { + // Obtener el documento de petición + const response = await postWithAuth(`${API_URL}/customs/auditor/obtener-peticion/remesa-vu/`, { + pedimento_id: pedimentoId + }); + + if (!response.ok) { + // Obtener el JSON de error que devuelve Django + const errorData = await response.json(); + + const errorMessage = errorData.error || + `Error ${response.status}: ${response.statusText}`; + + showMessage(`No se encontró archivo de petición VU: ${errorMessage}`, 'warning'); + return; + } + + const documento = await response.json(); + + // Llamar a la función de vista previa existente + await previewDocument(documento); + + }catch(error) { + console.error('Error al obtener petición VU:', error); + showMessage('Error al cargar la petición VU', 'error'); + } + }; + + // Vista previa de respuesta Remesa VU + const handlePreviewRespuestaRemesaVU = async (pedimentoId) => { + try { + // Obtener el documento de petición + const response = await postWithAuth(`${API_URL}/customs/auditor/obtener-respuesta/remesa-vu/`, { + pedimento_id: pedimentoId + }); + + if (!response.ok) { + // Obtener el JSON de error que devuelve Django + const errorData = await response.json(); + + const errorMessage = errorData.error || + `Error ${response.status}: ${response.statusText}`; + + showMessage(`No se encontró archivo de respuesta VU: ${errorMessage}`, 'warning'); + return; + } + + const documento = await response.json(); + + // Llamar a la función de vista previa existente + await previewDocument(documento); + + }catch(error) { + + showMessage(`Error al cargar la respuesta VU: ${error.message|| 'Error desconocido'}`, 'error'); + } + }; + + // Vista previa de petición Partidas VU + const handlePreviewPeticionPartidasVU = async (pedimentoId) => { + // Obtener el documento de petición + try { + // Obtener el documento de petición + const response = await postWithAuth(`${API_URL}/customs/auditor/obtener-peticion/partidas-vu/`, { + pedimento_id: pedimentoId + }); + + if (!response.ok) { + // Obtener el JSON de error que devuelve Django + const errorData = await response.json(); + + const errorMessage = errorData.error || + `Error ${response.status}: ${response.statusText}`; + + showMessage(`No se encontró archivo de petición VU: ${errorMessage}`, 'warning'); + return; + } + + const documento = await response.json(); + + // Llamar a la función de vista previa existente + await previewDocument(documento); + + }catch(error) { + showMessage(`Error al cargar la petición VU: ${error.message|| 'Error desconocido'}`, 'error'); + } + }; + + // Vista previa de respuesta Partidas VU + const handlePreviewRespuestaPartidasVU = async (pedimentoId) => { + try { + // Obtener el documento de respuesta + const response = await postWithAuth(`${API_URL}/customs/auditor/obtener-respuesta/partidas-vu/`, { + pedimento_id: pedimentoId + }); + + if (!response.ok) { + // Obtener el JSON de error que devuelve Django + const errorData = await response.json(); + + const errorMessage = errorData.error || + `Error ${response.status}: ${response.statusText}`; + + showMessage(`No se encontró archivo de respuesta VU: ${errorMessage}`, 'warning'); + return; + } + + const documento = await response.json(); + + // Llamar a la función de vista previa existente + await previewDocument(documento); + + }catch(error) { + + showMessage(`Error al cargar la respuesta VU: ${error.message|| 'Error desconocido'}`, 'error'); + } + }; + + // Vista previa de petición Acuse VU + const handlePreviewPeticionAcuseVU = async (pedimentoId) => { + try { + // Obtener el documento de petición + const response = await postWithAuth(`${API_URL}/customs/auditor/obtener-peticion/acuse-vu/`, { + pedimento_id: pedimentoId + }); + + if (!response.ok) { + // Obtener el JSON de error que devuelve Django + const errorData = await response.json(); + + const errorMessage = errorData.error || + `Error ${response.status}: ${response.statusText}`; + + showMessage(`No se encontró archivo de petición VU: ${errorMessage}`, 'warning'); + return; + } + + const documento = await response.json(); + + // Llamar a la función de vista previa existente + await previewDocument(documento); + + }catch(error) { + + showMessage(`Error al cargar la petición VU: ${error.message|| 'Error desconocido'}`, 'error'); + } + }; + + // Vista previa de respuesta Acuse VU + const handlePreviewRespuestaAcuseVU = async (pedimentoId) => { + try { + // Obtener el documento de respuesta + const response = await postWithAuth(`${API_URL}/customs/auditor/obtener-respuesta/acuse-vu/`, { + pedimento_id: pedimentoId + }); + + if (!response.ok) { + // Obtener el JSON de error que devuelve Django + const errorData = await response.json(); + + const errorMessage = errorData.error || + `Error ${response.status}: ${response.statusText}`; + + showMessage(`No se encontró archivo de respuesta VU: ${errorMessage}`, 'warning'); + return; + } + + const documento = await response.json(); + + // Llamar a la función de vista previa existente + await previewDocument(documento); + + }catch(error) { + + showMessage(`Error al cargar la respuesta VU: ${error.message|| 'Error desconocido'}`, 'error'); + } + }; + + // Vista previa de petición COVE VU + const handlePreviewPeticionCoveVU = async (pedimentoId) => { + try { + // Obtener el documento de petición + const response = await postWithAuth(`${API_URL}/customs/auditor/obtener-peticion/cove-vu/`, { + pedimento_id: pedimentoId + }); + + if (!response.ok) { + // Obtener el JSON de error que devuelve Django + const errorData = await response.json(); + + const errorMessage = errorData.error || + `Error ${response.status}: ${response.statusText}`; + + showMessage(`No se encontró archivo de petición VU: ${errorMessage}`, 'warning'); + return; + } + + const documento = await response.json(); + + // Llamar a la función de vista previa existente + await previewDocument(documento); + + }catch(error) { + + showMessage(`Error al cargar la petición VU: ${error.message|| 'Error desconocido'}`, 'error'); + } + }; + + // Vista previa de respuesta COVE VU + const handlePreviewRespuestaCoveVU = async (pedimentoId) => { + try { + // Obtener el documento de petición + const response = await postWithAuth(`${API_URL}/customs/auditor/obtener-respuesta/cove-vu/`, { + pedimento_id: pedimentoId + }); + + if (!response.ok) { + // Obtener el JSON de error que devuelve Django + const errorData = await response.json(); + + const errorMessage = errorData.error || + `Error ${response.status}: ${response.statusText}`; + + showMessage(`No se encontró archivo de respuesta VU: ${errorMessage}`, 'warning'); + return; + } + + const documento = await response.json(); + + // Llamar a la función de vista previa existente + await previewDocument(documento); + + }catch(error) { + + showMessage(`Error al cargar la respuesta VU: ${error.message|| 'Error desconocido'}`, 'error'); + } + }; + + // Vista previa de petición Acuse COVE VU + const handlePreviewPeticionAcuseCoveVU = async (pedimentoId) => { + // Obtener el documento de petición + try { + // Obtener el documento de petición + const response = await postWithAuth(`${API_URL}/customs/auditor/obtener-peticion/acuse-cove-vu/`, { + pedimento_id: pedimentoId + }); + + if (!response.ok) { + // Obtener el JSON de error que devuelve Django + const errorData = await response.json(); + + const errorMessage = errorData.error || + `Error ${response.status}: ${response.statusText}`; + + showMessage(`No se encontró archivo de petición VU: ${errorMessage}`, 'warning'); + return; + } + + const documento = await response.json(); + + // Llamar a la función de vista previa existente + await previewDocument(documento); + + }catch(error) { + showMessage(`Error al cargar la petición VU: ${error.message|| 'Error desconocido'}`, 'error'); + } + }; + + // Vista previa de respuesta Acuse COVE VU + const handlePreviewRespuestaAcuseCoveVU = async (pedimentoId) => { + try { + // Obtener el documento de petición + const response = await postWithAuth(`${API_URL}/customs/auditor/obtener-respuesta/acuse-cove-vu/`, { + pedimento_id: pedimentoId + }); + + if (!response.ok) { + // Obtener el JSON de error que devuelve Django + const errorData = await response.json(); + + const errorMessage = errorData.error || + `Error ${response.status}: ${response.statusText}`; + + showMessage(`No se encontró archivo de respuesta VU: ${errorMessage}`, 'warning'); + return; + } + + const documento = await response.json(); + + // Llamar a la función de vista previa existente + await previewDocument(documento); + + }catch(error) { + + showMessage(`Error al cargar la respuesta VU: ${error.message|| 'Error desconocido'}`, 'error'); + } + }; + + // Vista previa de petición E-Document VU + const handlePreviewPeticionEdocVU = async (pedimentoId) => { + // Obtener el documento de petición + try { + // Obtener el documento de petición + const response = await postWithAuth(`${API_URL}/customs/auditor/obtener-peticion/edocument-vu/`, { + pedimento_id: pedimentoId + }); + + if (!response.ok) { + // Obtener el JSON de error que devuelve Django + const errorData = await response.json(); + + const errorMessage = errorData.error || + `Error ${response.status}: ${response.statusText}`; + + showMessage(`No se encontró archivo de petición VU: ${errorMessage}`, 'warning'); + return; + } + + const documento = await response.json(); + + // Llamar a la función de vista previa existente + await previewDocument(documento); + + }catch(error) { + showMessage(`Error al cargar la petición VU: ${error.message|| 'Error desconocido'}`, 'error'); + } + }; + + // Vista previa de respuesta E-Document VU + const handlePreviewRespuestaEdocVU = async (pedimentoId) => { + try { + // Obtener el documento de petición + const response = await postWithAuth(`${API_URL}/customs/auditor/obtener-respuesta/edocument-vu/`, { + pedimento_id: pedimentoId + }); + + if (!response.ok) { + // Obtener el JSON de error que devuelve Django + const errorData = await response.json(); + + const errorMessage = errorData.error || + `Error ${response.status}: ${response.statusText}`; + + showMessage(`No se encontró archivo de respuesta VU: ${errorMessage}`, 'warning'); + return; + } + + const documento = await response.json(); + + // Llamar a la función de vista previa existente + await previewDocument(documento); + + }catch(error) { + + showMessage(`Error al cargar la respuesta VU: ${error.message|| 'Error desconocido'}`, 'error'); + } + }; + + const downloadDocument = async (doc) => { + const fileName = doc.archivo ? doc.archivo.split('/').pop() : `documento_${doc.id}`; + await downloadFile(doc.id, fileName, showMessage); + }; + + // Cerrar modal y limpiar blob + const handleClosePreview = () => { + setPreviewOpen(false); + if (previewUrl) window.URL.revokeObjectURL(previewUrl); + setPreviewUrl(''); + setPreviewType(''); + setPreviewError(''); + setPreviewXml(''); + setPreviewXmlHtml(''); + setPreviewDoc(null); + setPreviewContent(''); + setImageZoom(1); + }; + +// Función para formatear XML (pretty print) +function formatXml(xml) { + const PADDING = ' '; + const reg = /(>)(<)(\/*)/g; + let formatted = ''; + let pad = 0; + xml = xml.replace(reg, '$1\r\n$2$3'); + xml.split(/\r?\n/).forEach((node) => { + let indent = 0; + if (node.match(/.+<\/\w[^>]*>$/)) { + indent = 0; + } else if (node.match(/^<\/\w/)) { + if (pad !== 0) pad -= 1; + } else if (node.match(/^<\w[^>]*[^\/]>/)) { + indent = 1; + } + formatted += PADDING.repeat(pad) + node + '\r\n'; + pad += indent; + }); + return formatted.trim(); +} + useEffect(() => { const fetchPedimentos = async () => { setLoading(true); @@ -308,27 +1178,27 @@ function Auditor() { }, [page, itemsPerPage, pedimentoFilter]); return ( -