false, 'message' => 'Usuario no autenticado']); exit; } if ($_SERVER['REQUEST_METHOD'] !== 'POST') { echo json_encode(['success' => false, 'message' => 'Método no permitido']); exit; } // Incluir la clase ImportadorPedimentos include_once __DIR__ . '/../app/controllers/ImportadorPedimentos.php'; // Función segura para obtener conexión function getSafeConnection() { require_once __DIR__ . '/../app/helpers/env.php'; loadEnv(); $serverName = $_ENV['DB_HOST']; $connectionOptions = [ "Database" => $_ENV['DB_DATABASE'], "Uid" => $_ENV['DB_USERNAME'], "PWD" => $_ENV['DB_PASSWORD'], "CharacterSet" => "UTF-8" ]; $conn = sqlsrv_connect($serverName, $connectionOptions); if (!$conn) { $errors = sqlsrv_errors(); $errorMsg = "Error de conexión SQL Server"; if ($errors) { $errorMsg .= ": " . $errors[0]['message']; } throw new Exception($errorMsg); } return $conn; } try { $validar_duplicados = isset($_POST['validar_duplicados']) && $_POST['validar_duplicados'] === 'on'; // Crear timestamp único para esta importación $timestamp_importacion = date('Y-m-d H:i:s'); // Verificar conexión a la base de datos $conn = null; try { $conn = getSafeConnection(); if (!$conn) { throw new Exception("No se pudo establecer conexión con la base de datos"); } } catch (Exception $e) { error_log("Error de conexión a BD: " . $e->getMessage()); throw new Exception("Error de conexión a la base de datos: " . $e->getMessage()); } $importador = new ImportadorPedimentos($conn); $estadisticas_globales = [ 'pedimentos_procesados' => 0, 'facturas_procesadas' => 0, 'partidas_procesadas' => 0, 'duplicados' => 0, 'errores' => 0, 'total_lineas' => 0 ]; $archivos_procesados = 0; $archivos_con_errores = []; // Manejar archivos múltiples enviados como archivos[] if (isset($_FILES)) { error_log("INICIANDO BUCLE DE ARCHIVOS..."); foreach ($_FILES as $key => $archivo_info) { error_log("Procesando key: $key"); error_log("Archivo info: " . print_r($archivo_info, true)); if (is_array($archivo_info['name'])) { // Múltiples archivos for ($i = 0; $i < count($archivo_info['name']); $i++) { if ($archivo_info['error'][$i] !== UPLOAD_ERR_OK) { continue; } $nombre = $archivo_info['name'][$i]; $tmp_name = $archivo_info['tmp_name'][$i]; error_log("Procesando archivo múltiple: $nombre"); try { $resultado = $importador->procesarArchivo($tmp_name, $validar_duplicados, $timestamp_importacion); if ($resultado['success']) { $estadisticas_globales['pedimentos_procesados'] += $resultado['estadisticas']['pedimentos_procesados']; $estadisticas_globales['facturas_procesadas'] += $resultado['estadisticas']['facturas_procesadas']; $estadisticas_globales['partidas_procesadas'] += $resultado['estadisticas']['partidas_procesadas']; $estadisticas_globales['duplicados'] += $resultado['estadisticas']['duplicados']; $estadisticas_globales['errores'] += $resultado['estadisticas']['errores']; $estadisticas_globales['total_lineas'] += $resultado['estadisticas']['total_lineas']; $archivos_procesados++; } else { $archivos_con_errores[] = [ 'archivo' => $nombre, 'error' => $resultado['message'] ?? 'Error desconocido' ]; } } catch (Exception $e) { $archivos_con_errores[] = [ 'archivo' => $nombre, 'error' => $e->getMessage() ]; } } } else { // Archivo individual if ($archivo_info['error'] === UPLOAD_ERR_OK) { $nombre = $archivo_info['name']; $tmp_name = $archivo_info['tmp_name']; error_log("Procesando archivo individual: $nombre"); try { $resultado = $importador->procesarArchivo($tmp_name, $validar_duplicados, $timestamp_importacion); if ($resultado['success']) { $estadisticas_globales = $resultado['estadisticas']; $archivos_procesados = 1; } else { $archivos_con_errores[] = [ 'archivo' => $nombre, 'error' => $resultado['message'] ?? 'Error desconocido' ]; } } catch (Exception $e) { $archivos_con_errores[] = [ 'archivo' => $nombre, 'error' => $e->getMessage() ]; } } } } } sqlsrv_close($conn); // Verificar los datos realmente insertados en la base de datos $estadisticas_reales = verificarEstadisticasReales($estadisticas_globales, $timestamp_importacion); echo json_encode([ 'success' => $archivos_procesados > 0, 'estadisticas' => $estadisticas_reales, 'archivos_procesados' => $archivos_procesados, 'archivos_con_errores' => $archivos_con_errores, 'message' => $archivos_procesados > 0 ? 'Archivos procesados correctamente' : 'No se pudo procesar ningún archivo' ]); } catch (Exception $e) { error_log("ERROR GENERAL: " . $e->getMessage()); error_log("STACK TRACE: " . $e->getTraceAsString()); // Asegurar que se devuelve JSON válido http_response_code(500); echo json_encode([ 'success' => false, 'message' => 'Error del servidor: ' . $e->getMessage(), 'debug' => [ 'file' => $e->getFile(), 'line' => $e->getLine(), 'timestamp' => date('Y-m-d H:i:s') ] ]); } function verificarEstadisticasReales($estadisticas_reportadas, $timestamp_importacion) { try { $conn = getSafeConnection(); // Obtener estadísticas reales de la base de datos para esta importación específica $usuario_id = $_SESSION['usuario_id']; // Contar pedimentos insertados en esta sesión (últimos 2 minutos) $timestamp_desde = date('Y-m-d H:i:s', strtotime($timestamp_importacion . ' -2 minutes')); $sql = "SELECT COUNT(*) as total FROM pedimentos WHERE usuario_id = ? AND fecha_creacion >= ?"; $stmt = sqlsrv_query($conn, $sql, [$usuario_id, $timestamp_desde]); $row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC); $pedimentos_reales = $row ? $row['total'] : 0; sqlsrv_free_stmt($stmt); // Contar facturas insertadas en esta sesión $sql = "SELECT COUNT(f.*) as total FROM pedimento_facturas f INNER JOIN pedimentos p ON f.pedimento_id = p.id WHERE p.usuario_id = ? AND p.fecha_creacion >= ?"; $stmt = sqlsrv_query($conn, $sql, [$usuario_id, $timestamp_desde]); $row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC); $facturas_reales = $row ? $row['total'] : 0; sqlsrv_free_stmt($stmt); // Contar partidas insertadas en esta sesión $sql = "SELECT COUNT(pa.*) as total FROM pedimento_partidas pa INNER JOIN pedimentos p ON pa.pedimento_id = p.id WHERE p.usuario_id = ? AND p.fecha_creacion >= ?"; $stmt = sqlsrv_query($conn, $sql, [$usuario_id, $timestamp_desde]); $row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC); $partidas_reales = $row ? $row['total'] : 0; sqlsrv_free_stmt($stmt); sqlsrv_close($conn); error_log("=== VERIFICACIÓN DE ESTADÍSTICAS ==="); error_log("Timestamp importación: $timestamp_importacion"); error_log("Timestamp desde: $timestamp_desde"); error_log("Reportadas - Pedimentos: {$estadisticas_reportadas['pedimentos_procesados']}, Facturas: {$estadisticas_reportadas['facturas_procesadas']}, Partidas: {$estadisticas_reportadas['partidas_procesadas']}"); error_log("Reales BD - Pedimentos: $pedimentos_reales, Facturas: $facturas_reales, Partidas: $partidas_reales"); // Retornar las estadísticas reales de la base de datos return [ 'total_lineas' => $estadisticas_reportadas['total_lineas'], 'pedimentos_procesados' => $pedimentos_reales, 'facturas_procesadas' => $facturas_reales, 'partidas_procesadas' => $partidas_reales, 'errores' => $estadisticas_reportadas['errores'], 'duplicados' => $estadisticas_reportadas['duplicados'] ]; } catch (Exception $e) { error_log("Error verificando estadísticas reales: " . $e->getMessage()); // En caso de error, retornar las estadísticas originales return $estadisticas_reportadas; } } ?>