diff --git a/src/pages/Expedientes.jsx b/src/pages/Expedientes.jsx index 38626c1..363054c 100644 --- a/src/pages/Expedientes.jsx +++ b/src/pages/Expedientes.jsx @@ -638,6 +638,7 @@ const downloadExpediente = async (pedimentoId, pedimentoName, setSuccess, showMe showMessage(`Error durante la subida: ${error.message}`, 'error'); } finally { setIsUploading(false); + fetchPendingBulkUploads(); } }; @@ -671,6 +672,160 @@ const downloadExpediente = async (pedimentoId, pedimentoName, setSuccess, showMe // El layout principal y la tabla siempre se renderizan, loader/error/empty solo dentro del área de la tabla + // En tu componente Reports, agrega este estado y efecto + const [pendingBulkUploads, setPendingBulkUploads] = useState([]); + + // Función para obtener tareas pendientes de bulk upload + const fetchPendingBulkUploads = async () => { + try { + const url = `${API_URL}/customs/pedimentos/bulk-upload-status/`; + const res = await fetchWithAuth(url); + if (!res.ok) throw new Error('Error al obtener tareas pendientes'); + const data = await res.json(); + setPendingBulkUploads(data.pending_tasks || []); + + // Si hay tareas en progreso, mostrar notificación + const processingTasks = data.pending_tasks?.filter(t => t.status === 'processing') || []; + if (processingTasks.length > 0) { + console.log(`📊 ${processingTasks.length} tarea(s) de carga en progreso`); + } + } catch (err) { + console.error('Error fetching pending bulk uploads:', err); + setPendingBulkUploads([]); + } + }; + + // Efecto para ejecutar cada 30 segundos + useEffect(() => { + // Ejecutar inmediatamente al cargar + fetchPendingBulkUploads(); + + // Configurar intervalo cada 30 segundos + const intervalId = setInterval(fetchPendingBulkUploads, 30000); + + // Limpiar intervalo al desmontar + return () => clearInterval(intervalId); + }, []); + + // Función para renderizar notificación de tareas pendientes + const renderBulkUploadNotifications = () => { + if (!pendingBulkUploads || pendingBulkUploads.length === 0) { + return null; + } + + const processingTasks = pendingBulkUploads.filter(t => t.status === 'processing'); + const pendingTasks = pendingBulkUploads.filter(t => t.status === 'pending'); + // const failedTasks = pendingBulkUploads.filter(t => t.status === 'failed'); + + return ( +
+
+
+
+
+
+ + + +
+
+

Cargas en Progreso

+

+ {pendingBulkUploads.length} tarea(s) activa(s) +

+
+
+ +
+
+ +
+ {/* Tareas en procesamiento */} + {processingTasks.length > 0 && ( +
+

+ + + + En Proceso ({processingTasks.length}) +

+
+ {processingTasks.map(task => ( +
+
+
+ {task.task_type === 'bulk_create' ? 'Carga Masiva' : 'Carga Desk'} - {task.contribuyente} +
+
+ {task.progress.percentage_files.toFixed(1)}% +
+
+
+ • Pedimentos Creados: {task.progress.created_pedimentos} • Documentos cargados: {task.progress.created_documents} +
+
+
+
+
+ Actualización en ~{task.metadata.next_batch_update - task.progress.created_documents} documentos +
+
+ ))} +
+
+ )} + + {/* Tareas pendientes */} + {pendingTasks.length > 0 && ( +
+

Pendientes ({pendingTasks.length})

+
+ {pendingTasks.map(task => ( +
+
+ {task.task_type === 'bulk_create' ? 'Carga Masiva' : 'Carga Desk'} - {task.contribuyente} +
+
+ {task.total_files} archivos • Pendiente de inicio +
+
+ ))} +
+
+ )} + + {/* Tareas fallidas */} + {/* {failedTasks.length > 0 && ( +
+

Fallidas ({failedTasks.length})

+
+ {failedTasks.map(task => ( +
+
+ {task.task_type === 'bulk_create' ? 'Carga Masiva' : 'Carga Desk'} - {task.contribuyente} +
+
+ {task.error_message || 'Error desconocido'} +
+
+ ))} +
+
+ )} */} +
+
+
+ ); + }; + return (
@@ -734,6 +889,19 @@ const downloadExpediente = async (pedimentoId, pedimentoName, setSuccess, showMe (showAnimation && !hasAnimated ? ' animate-fadein-slideup opacity-0' : '') } style={showAnimation && !hasAnimated ? { animation: 'fadein-slideup 0.7s cubic-bezier(0.22,1,0.36,1) 0.15s forwards' } : undefined}> + +
+ {renderBulkUploadNotifications()} + +
+
{/* Filtros avanzados */}