diff --git a/.env b/.env index e0c4a35..ac7ad1b 100644 --- a/.env +++ b/.env @@ -2,3 +2,4 @@ VITE_DEBUG_MODE=true VITE_EFC_API_URL=http://192.168.1.79:8000/api/v1 VITE_EFC_MICROSERVICE_URL=http://192.168.1.79:8001/api/v1 +VITE_EFC_MICROSERVICE_URL_2=http://192.168.1.79:8001/api/v2 diff --git a/src/pages/PedimentoDetail.jsx b/src/pages/PedimentoDetail.jsx index dad0e74..d1f854e 100644 --- a/src/pages/PedimentoDetail.jsx +++ b/src/pages/PedimentoDetail.jsx @@ -25,6 +25,7 @@ import { useNotification } from '../context/NotificationContext'; const API_URL = import.meta.env.VITE_EFC_API_URL; const MICROSERVICE_URL = import.meta.env.VITE_EFC_MICROSERVICE_URL; +const MICROSERVICE_URL_2 = import.meta.env.VITE_EFC_MICROSERVICE_URL_2; // Funciones auxiliares para estados y servicios (copiadas de procesos.js) const getEstadoLabel = (estado) => { @@ -196,6 +197,108 @@ export default function PedimentoDetail() { const [downloadingPartidas, setDownloadingPartidas] = useState(false); const [downloadingAllPartidas, setDownloadingAllPartidas] = useState(false); + // Estados para credenciales VUCEM + const [credenciales, setCredenciales] = useState([]); + const [processingPartida, setProcessingPartida] = useState(null); + const [processingCove, setProcessingCove] = useState(null); + const [processingAcuseCove, setProcessingAcuseCove] = useState(null); + const [processingEdoc, setProcessingEdoc] = useState(null); + const [processingAcuseEdoc, setProcessingAcuseEdoc] = useState(null); + + // Función para obtener credenciales VUCEM + const fetchCredenciales = async (contribuyente) => { + try { + const response = await fetchWithAuth(`${API_URL}/vucem/vucem/?importador=${contribuyente}`); + + if (response.ok) { + const data = await response.json(); + + // La API devuelve un array directamente, no un objeto con results + const credenciales = Array.isArray(data) ? data : (data.results || []); + + return credenciales; + } + return []; + } catch (error) { + console.error('Error fetching credenciales:', error); + return []; + } + }; + + // Función para procesar partida + const handlePartidaProcess = async (partida) => { + setProcessingPartida(partida.id); + + try { + // Obtener credenciales para el contribuyente del pedimento + const credencialesList = await fetchCredenciales(pedimento.contribuyente); + + if (credencialesList.length === 0) { + showMessage('No se encontraron credenciales VUCEM para este contribuyente', 'error'); + return; + } + + // Usar la primera credencial activa disponible + const credencial = credencialesList.find(c => c.is_active) || credencialesList[0]; + + const requestBody = { + partida: { + id: partida.id, + numero: partida.numero_partida + }, + pedimento: { + id: pedimento.id, + pedimento: pedimento.pedimento, + pedimento_app: pedimento.pedimento_app, + aduana: pedimento.aduana, + patente: pedimento.patente, + organizacion: pedimento.organizacion, + regimen: pedimento.regimen || "test", + clave_pedimento: pedimento.clave_pedimento || "test", + numero_operacion: pedimento.numero_operacion || "" + }, + credencial: { + id: credencial.id, + user: credencial.usuario, + password: credencial.password, + efirma: credencial.efirma, + // Convertir URLs completas a rutas relativas + key: credencial.key ? credencial.key.split('/').slice(-2).join('/') : '', + cer: credencial.cer ? credencial.cer.split('/').slice(-2).join('/') : '', + is_active: credencial.is_active, + organizacion: credencial.organizacion + } + }; + + // Verificar si MICROSERVICE_URL_2 está definido + if (!MICROSERVICE_URL_2) { + throw new Error('La variable de entorno VITE_EFC_MICROSERVICE_URL_2 no está configurada'); + } + + const response = await fetchWithAuth(`${MICROSERVICE_URL_2}/services/partida/`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(requestBody) + }); + + if (response.ok) { + const result = await response.json(); + showMessage('Partida procesada correctamente', 'success'); + } else { + const errorData = await response.json().catch(() => ({})); + throw new Error(errorData.message || 'Error al procesar la partida'); + } + + } catch (error) { + console.error('Error procesando partida:', error); + showMessage(`Error al procesar la partida: ${error.message}`, 'error'); + } finally { + setProcessingPartida(null); + } + }; + // Función para obtener partidas const fetchPedimentoPartidas = async (page = 1, pageSize = 10, filters = {}) => { console.log('fetchPedimentoPartidas called with:', { page, pageSize, filters }); @@ -1201,6 +1304,300 @@ export default function PedimentoDetail() { // Aquí implementarías la lógica de petición específica para COVEs }; + // Función para procesar COVE + const handleCoveProcess = async (cove) => { + setProcessingCove(cove.id); + + try { + // Obtener credenciales para el contribuyente del pedimento + const credencialesList = await fetchCredenciales(pedimento.contribuyente); + + if (credencialesList.length === 0) { + showMessage('No se encontraron credenciales VUCEM para este contribuyente', 'error'); + return; + } + + // Usar la primera credencial activa disponible + const credencial = credencialesList.find(c => c.is_active) || credencialesList[0]; + + const requestBody = { + cove: { + id: cove.id, + cove: cove.numero_cove + }, + pedimento: { + id: pedimento.id, + pedimento: pedimento.pedimento, + pedimento_app: pedimento.pedimento_app, + aduana: pedimento.aduana, + patente: pedimento.patente, + organizacion: pedimento.organizacion, + regimen: pedimento.regimen || "test", + clave_pedimento: pedimento.clave_pedimento || "test", + numero_operacion: pedimento.numero_operacion || "test" + }, + credencial: { + id: credencial.id, + user: credencial.usuario, + password: credencial.password, + efirma: credencial.efirma, + key: credencial.key, + cer: credencial.cer, + is_active: credencial.is_active, + organizacion: credencial.organizacion + } + }; + + // Verificar si MICROSERVICE_URL_2 está definido + if (!MICROSERVICE_URL_2) { + throw new Error('La variable de entorno VITE_EFC_MICROSERVICE_URL_2 no está configurada'); + } + + const response = await fetchWithAuth(`${MICROSERVICE_URL_2}/services/cove/`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(requestBody) + }); + + if (response.ok) { + const result = await response.json(); + showMessage('COVE procesado correctamente', 'success'); + } else { + const errorData = await response.json().catch(() => ({})); + throw new Error(errorData.message || 'Error al procesar el COVE'); + } + + } catch (error) { + console.error('Error procesando COVE:', error); + showMessage(`Error al procesar el COVE: ${error.message}`, 'error'); + } finally { + setProcessingCove(null); + } + }; + + // Función para procesar Acuse de COVE + const handleAcuseCoveProcess = async (cove) => { + setProcessingAcuseCove(cove.id); + + try { + // Obtener credenciales para el contribuyente del pedimento + const credencialesList = await fetchCredenciales(pedimento.contribuyente); + + if (credencialesList.length === 0) { + showMessage('No se encontraron credenciales VUCEM para este contribuyente', 'error'); + return; + } + + // Usar la primera credencial activa disponible + const credencial = credencialesList.find(c => c.is_active) || credencialesList[0]; + + const requestBody = { + cove: { + id: cove.id, + cove: cove.numero_cove + }, + pedimento: { + id: pedimento.id, + pedimento: pedimento.pedimento, + pedimento_app: pedimento.pedimento_app, + aduana: pedimento.aduana, + patente: pedimento.patente, + organizacion: pedimento.organizacion, + regimen: pedimento.regimen || "test", + clave_pedimento: pedimento.clave_pedimento || "test", + numero_operacion: pedimento.numero_operacion || "test" + }, + credencial: { + id: credencial.id, + user: credencial.usuario, + password: credencial.password, + efirma: credencial.efirma, + key: credencial.key, + cer: credencial.cer, + is_active: credencial.is_active, + organizacion: credencial.organizacion + } + }; + + // Verificar si MICROSERVICE_URL_2 está definido + if (!MICROSERVICE_URL_2) { + throw new Error('La variable de entorno VITE_EFC_MICROSERVICE_URL_2 no está configurada'); + } + + const response = await fetchWithAuth(`${MICROSERVICE_URL_2}/services/acuse/cove/`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(requestBody) + }); + + if (response.ok) { + const result = await response.json(); + showMessage('Acuse de COVE procesado correctamente', 'success'); + } else { + const errorData = await response.json().catch(() => ({})); + throw new Error(errorData.message || 'Error al procesar el acuse de COVE'); + } + + } catch (error) { + console.error('Error procesando acuse de COVE:', error); + showMessage(`Error al procesar el acuse de COVE: ${error.message}`, 'error'); + } finally { + setProcessingAcuseCove(null); + } + }; + + // Función para procesar EDoc + const handleEdocProcess = async (edoc) => { + setProcessingEdoc(edoc.id); + + try { + // Obtener credenciales para el contribuyente del pedimento + const credencialesList = await fetchCredenciales(pedimento.contribuyente); + + if (credencialesList.length === 0) { + showMessage('No se encontraron credenciales VUCEM para este contribuyente', 'error'); + return; + } + + // Usar la primera credencial activa disponible + const credencial = credencialesList.find(c => c.is_active) || credencialesList[0]; + + const requestBody = { + edoc: { + id: edoc.id, + numero_edocument: edoc.numero_edocument + }, + idEDocument: edoc.numero_edocument, + pedimento: { + id: pedimento.id, + pedimento: pedimento.pedimento, + pedimento_app: pedimento.pedimento_app, + aduana: pedimento.aduana, + patente: pedimento.patente, + organizacion: pedimento.organizacion, + regimen: pedimento.regimen || "test", + clave_pedimento: pedimento.clave_pedimento || "test", + numero_operacion: pedimento.numero_operacion || "test" + }, + credencial: { + id: credencial.id, + user: credencial.usuario, + password: credencial.password, + efirma: credencial.efirma, + key: credencial.key, + cer: credencial.cer, + is_active: credencial.is_active, + organizacion: credencial.organizacion + } + }; + + // Verificar si MICROSERVICE_URL_2 está definido + if (!MICROSERVICE_URL_2) { + throw new Error('La variable de entorno VITE_EFC_MICROSERVICE_URL_2 no está configurada'); + } + + const response = await fetchWithAuth(`${MICROSERVICE_URL_2}/services/download/edoc/`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(requestBody) + }); + + if (response.ok) { + const result = await response.json(); + showMessage('EDoc procesado correctamente', 'success'); + } else { + const errorData = await response.json().catch(() => ({})); + throw new Error(errorData.message || 'Error al procesar el EDoc'); + } + + } catch (error) { + console.error('Error procesando EDoc:', error); + showMessage(`Error al procesar el EDoc: ${error.message}`, 'error'); + } finally { + setProcessingEdoc(null); + } + }; + + // Función para procesar Acuse de EDoc + const handleAcuseEdocProcess = async (edoc) => { + setProcessingAcuseEdoc(edoc.id); + + try { + // Obtener credenciales para el contribuyente del pedimento + const credencialesList = await fetchCredenciales(pedimento.contribuyente); + + if (credencialesList.length === 0) { + showMessage('No se encontraron credenciales VUCEM para este contribuyente', 'error'); + return; + } + + // Usar la primera credencial activa disponible + const credencial = credencialesList.find(c => c.is_active) || credencialesList[0]; + + const requestBody = { + edoc: { + id: edoc.id, + numero_edocument: edoc.numero_edocument + }, + idEDocument: edoc.numero_edocument, + pedimento: { + id: pedimento.id, + pedimento: pedimento.pedimento, + pedimento_app: pedimento.pedimento_app, + aduana: pedimento.aduana, + patente: pedimento.patente, + organizacion: pedimento.organizacion, + regimen: pedimento.regimen || "test", + clave_pedimento: pedimento.clave_pedimento || "test", + numero_operacion: pedimento.numero_operacion || "test" + }, + credencial: { + id: credencial.id, + user: credencial.usuario, + password: credencial.password, + efirma: credencial.efirma, + key: credencial.key, + cer: credencial.cer, + is_active: credencial.is_active, + organizacion: credencial.organizacion + } + }; + + // Verificar si MICROSERVICE_URL_2 está definido + if (!MICROSERVICE_URL_2) { + throw new Error('La variable de entorno VITE_EFC_MICROSERVICE_URL_2 no está configurada'); + } + + const response = await fetchWithAuth(`${MICROSERVICE_URL_2}/services/acuse/`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(requestBody) + }); + + if (response.ok) { + const result = await response.json(); + showMessage('Acuse de EDoc procesado correctamente', 'success'); + } else { + const errorData = await response.json().catch(() => ({})); + throw new Error(errorData.message || 'Error al procesar el acuse de EDoc'); + } + + } catch (error) { + console.error('Error procesando acuse de EDoc:', error); + showMessage(`Error al procesar el acuse de EDoc: ${error.message}`, 'error'); + } finally { + setProcessingAcuseEdoc(null); + } + }; + const handleEdocRequest = async (edoc) => { console.log('Request edoc:', edoc); showMessage(`Procesando petición para EDocs #${edoc.numero_edocument}...`, 'info'); @@ -1231,9 +1628,7 @@ export default function PedimentoDetail() { }; const handlePartidaRequest = async (partida) => { - console.log('Request partida:', partida); - showMessage(`Procesando petición para partida #${partida.numero_partida}...`, 'info'); - // Aquí implementarías la lógica de petición específica para partidas + await handlePartidaProcess(partida); }; // Funciones de selección para partidas @@ -2160,17 +2555,28 @@ export default function PedimentoDetail() { {/* Botón Petición (solo activo si está pendiente) */} @@ -2409,20 +2815,52 @@ export default function PedimentoDetail() {
- {/* Botón Procesar petición (solo activo si está pendiente) */} + {/* Botón COVE */} + + {/* Botón Acuse de COVE */} +
@@ -2712,20 +3150,52 @@ export default function PedimentoDetail() {
- {/* Botón Procesar petición (solo activo si está pendiente) */} + {/* Botón EDoc */} + + {/* Botón Acuse de EDoc */} +
@@ -2991,70 +3461,82 @@ export default function PedimentoDetail() {
- {/* Botón Ejecutar Servicio - solo para estados Pendiente o Error */} - {(proceso.estado === 1 || proceso.estado === 4) && ( - - )} - - {/* Botón Pasar a Espera - solo para estados En Proceso, Completado o Error */} - {(proceso.estado === 2 || proceso.estado === 3 || proceso.estado === 4) && ( - - )} - - {/* Mostrar texto si no hay acciones disponibles */} - {proceso.estado !== 1 && proceso.estado !== 2 && proceso.estado !== 3 && proceso.estado !== 4 && ( - Sin acciones - )} + {/* Botón Play (Ejecutar Servicio) */} + + + {/* Botón Refresh (Pasar a Espera) */} +