From c576ab5b3b00497ee93448cd91e4f89b9dc5f9d6 Mon Sep 17 00:00:00 2001 From: Alexeer Date: Fri, 13 Jun 2025 12:03:40 -0600 Subject: [PATCH] Patentes - Agentes Aduanales --- app/controllers/agentes.php | 512 ----------------- app/controllers/automatizaciones.php | 9 + app/controllers/choferes.php | 10 +- app/controllers/configuracion.php | 5 - app/controllers/locaciones.php | 520 ++++++++++++++++++ app/controllers/login.php | 15 +- app/controllers/patente.php | 310 +++++++++++ app/controllers/seguridad.php | 44 ++ app/controllers/transportistas.php | 3 +- patentes.txt | 31 ++ .../automatizaciones.php | 0 .../configuracion/dashboard_configuracion.php | 241 ++++---- views/configuracion/editar.php | 330 ++++++----- views/importadores/dashboard_importador.php | 2 +- views/partials/sidebar_agente.php | 167 ++++-- views/partials/sidebar_configuracion.php | 56 +- views/patente/alta_patente.php | 436 +++++++++++++++ views/patente/dashboard_patente.php | 69 +++ views/patente/editar.php | 459 ++++++++++++++++ views/patente/lista.php | 120 ++++ views/seguridad/agregar.php | 154 ++++-- views/seguridad/dashboard_seguridad.php | 13 +- views/transportistas/alta.php | 2 +- views/transportistas/lista.php | 2 +- 24 files changed, 2581 insertions(+), 929 deletions(-) create mode 100644 app/controllers/automatizaciones.php create mode 100644 app/controllers/locaciones.php create mode 100644 app/controllers/patente.php create mode 100644 patentes.txt rename views/{configuracion => automatizaciones}/automatizaciones.php (100%) create mode 100644 views/patente/alta_patente.php create mode 100644 views/patente/dashboard_patente.php create mode 100644 views/patente/editar.php create mode 100644 views/patente/lista.php diff --git a/app/controllers/agentes.php b/app/controllers/agentes.php index c43d6b7..53c77cb 100644 --- a/app/controllers/agentes.php +++ b/app/controllers/agentes.php @@ -265,516 +265,4 @@ function bitacora() } include __DIR__ . '/../../views/agentes/bitacora.php'; -} - -function lista() -{ - $conn = getConnection(); - $locaciones = []; - - // CONSULTA CORREGIDA - Agregamos abreviatura e iso2 - $sql = " - SELECT - p.id_pais, p.nombre AS nombre_pais, p.iso2, p.iso3, - e.id_estado, e.nombre AS nombre_estado, e.abreviatura, - c.id_ciudad, c.nombre AS nombre_ciudad - FROM paises p - LEFT JOIN estados e ON p.id_pais = e.pais_id - LEFT JOIN ciudades c ON e.id_estado = c.estado_id - ORDER BY p.id_pais, e.id_estado, c.id_ciudad - "; - - $stmt = sqlsrv_query($conn, $sql); - - if (!$stmt) { - $errors = sqlsrv_errors(); - error_log("Error en consulta lista(): " . print_r($errors, true)); - die("Error en la consulta"); - } - - while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) { - $locaciones[] = $row; - } - - // Obtener países para los selects del modal - $sql_paises_select = "SELECT id_pais, nombre FROM paises ORDER BY nombre"; - $stmt_paises_select = sqlsrv_query($conn, $sql_paises_select); - $paises = []; - while ($row = sqlsrv_fetch_array($stmt_paises_select, SQLSRV_FETCH_ASSOC)) { - $paises[] = $row; - } - - include __DIR__ . '/../../views/locaciones/gestion_locaciones.php'; -} - -function alta() -{ - $conn = getConnection(); - // 1) Cargar países - $sql = "SELECT id_pais, nombre FROM paises ORDER BY nombre"; - $stmt = sqlsrv_query($conn, $sql); - $paises = []; - while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) { - $paises[] = $row; - } - - include __DIR__ . '/../../views/locaciones/alta_locaciones.php'; -} - -// AJAX: devuelve los estados de un país dado -function estados() { - header('Content-Type: application/json; charset=utf-8'); - $pais = $_GET['pais'] ?? ''; - $conn = getConnection(); - $sql = "SELECT id_estado, nombre FROM estados WHERE pais_id = ? ORDER BY nombre"; - $stmt = sqlsrv_query($conn, $sql, [$pais]); - $out = []; - while ($r = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) { - $out[] = $r; - } - echo json_encode($out); - exit; -} - -// Guardar nuevo estado -function guardarEstado() { - header('Content-Type: application/json; charset=utf-8'); - - try { - // Debug: Verificar qué se está recibiendo - error_log("POST data: " . print_r($_POST, true)); - - $pais_id = $_POST['pais'] ?? ''; - $entidad = trim($_POST['entidad'] ?? ''); - - // Debug: Verificar valores específicos - error_log("pais_id: '$pais_id', entidad: '$entidad'"); - - // Validaciones más específicas - if (empty($pais_id)) { - echo json_encode(['success' => false, 'message' => 'Debe seleccionar un país']); - exit; - } - - if (empty($entidad)) { - echo json_encode(['success' => false, 'message' => 'Debe ingresar el nombre del estado']); - exit; - } - - $conn = getConnection(); - - // Verificar que el país existe - $sql_pais = "SELECT COUNT(*) as count FROM paises WHERE id_pais = ?"; - $stmt_pais = sqlsrv_query($conn, $sql_pais, [$pais_id]); - $pais_exists = sqlsrv_fetch_array($stmt_pais, SQLSRV_FETCH_ASSOC); - - if ($pais_exists['count'] == 0) { - echo json_encode(['success' => false, 'message' => 'El país seleccionado no existe']); - exit; - } - - // Verificar si ya existe el estado en ese país - $sql_check = "SELECT COUNT(*) as count FROM estados WHERE pais_id = ? AND nombre = ?"; - $stmt_check = sqlsrv_query($conn, $sql_check, [$pais_id, $entidad]); - $exists = sqlsrv_fetch_array($stmt_check, SQLSRV_FETCH_ASSOC); - - if ($exists['count'] > 0) { - echo json_encode(['success' => false, 'message' => 'Este estado ya existe en el país seleccionado']); - exit; - } - - // Insertar nuevo estado - // Primero obtenemos el siguiente ID disponible - $sql_max = "SELECT ISNULL(MAX(id_estado), 0) + 1 as next_id FROM estados"; - $stmt_max = sqlsrv_query($conn, $sql_max); - $next_id_row = sqlsrv_fetch_array($stmt_max, SQLSRV_FETCH_ASSOC); - $next_id = $next_id_row['next_id']; - - $sql = "INSERT INTO estados (id_estado, pais_id, nombre) VALUES (?, ?, ?)"; - $stmt = sqlsrv_query($conn, $sql, [$next_id, $pais_id, $entidad]); - - if ($stmt) { - echo json_encode(['success' => true, 'message' => 'Estado registrado exitosamente']); - } else { - // Obtener el error específico de SQL Server - $errors = sqlsrv_errors(); - $errorMessage = 'Error al registrar el estado'; - if ($errors) { - $errorMessage .= ': ' . $errors[0]['message']; - } - error_log("Error SQL: " . print_r($errors, true)); - echo json_encode(['success' => false, 'message' => $errorMessage]); - } - - } catch (Exception $e) { - echo json_encode(['success' => false, 'message' => 'Error: ' . $e->getMessage()]); - } - exit; -} - -// Guardar nueva ciudad -function guardarCiudad() { - header('Content-Type: application/json; charset=utf-8'); - - try { - $estado_id = $_POST['entidad'] ?? ''; - $ciudad = trim($_POST['ciudad'] ?? ''); - - // Validaciones - if (empty($estado_id) || empty($ciudad)) { - echo json_encode(['success' => false, 'message' => 'Todos los campos son obligatorios']); - exit; - } - - $conn = getConnection(); - - // Verificar si ya existe la ciudad en ese estado - $sql_check = "SELECT COUNT(*) as count FROM ciudades WHERE estado_id = ? AND nombre = ?"; - $stmt_check = sqlsrv_query($conn, $sql_check, [$estado_id, $ciudad]); - $exists = sqlsrv_fetch_array($stmt_check, SQLSRV_FETCH_ASSOC); - - if ($exists['count'] > 0) { - echo json_encode(['success' => false, 'message' => 'Esta ciudad ya existe en el estado seleccionado']); - exit; - } - - // Insertar nueva ciudad - $sql = "INSERT INTO ciudades (estado_id, nombre) VALUES (?, ?)"; - $stmt = sqlsrv_query($conn, $sql, [$estado_id, $ciudad]); - - if ($stmt) { - echo json_encode(['success' => true, 'message' => 'Ciudad registrada exitosamente']); - } else { - echo json_encode(['success' => false, 'message' => 'Error al registrar la ciudad']); - } - - } catch (Exception $e) { - echo json_encode(['success' => false, 'message' => 'Error: ' . $e->getMessage()]); - } - exit; -} - -// Función para obtener país por estado (necesaria para el modal de edición de ciudades) -function obtenerPaisPorEstado() { - header('Content-Type: application/json; charset=utf-8'); - - try { - $estado_id = $_GET['estado'] ?? ''; - - if (empty($estado_id)) { - echo json_encode(['success' => false, 'message' => 'ID de estado requerido']); - exit; - } - - $conn = getConnection(); - $sql = "SELECT pais_id FROM estados WHERE id_estado = ?"; - $stmt = sqlsrv_query($conn, $sql, [$estado_id]); - - if ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) { - echo json_encode(['success' => true, 'pais_id' => $row['pais_id']]); - } else { - echo json_encode(['success' => false, 'message' => 'Estado no encontrado']); - } - - } catch (Exception $e) { - echo json_encode(['success' => false, 'message' => 'Error: ' . $e->getMessage()]); - } - exit; -} - -// FUNCIÓN DISPATCHER PARA EDICIÓN -function editar() { - $tipo = $_POST['tipo'] ?? ''; - - // Log para debugging - error_log("Función editar llamada con tipo: " . $tipo); - error_log("POST data: " . print_r($_POST, true)); - - switch ($tipo) { - case 'pais': - actualizarPais(); - break; - case 'estado': - actualizarEstado(); - break; - case 'ciudad': - actualizarCiudad(); - break; - default: - header('Content-Type: application/json; charset=utf-8'); - echo json_encode(['success' => false, 'message' => 'Tipo de elemento no válido: ' . $tipo]); - exit; - } -} - -// FUNCIÓN ESPECÍFICA PARA ACTUALIZAR PAÍSES -function actualizarPais() { - header('Content-Type: application/json; charset=utf-8'); - - try { - $id = $_POST['id'] ?? ''; - $nombre = trim($_POST['nombre'] ?? ''); - $iso2 = trim($_POST['iso2'] ?? ''); - $iso3 = trim($_POST['iso3'] ?? ''); - - // Validaciones - if (empty($id) || empty($nombre)) { - echo json_encode(['success' => false, 'message' => 'ID y nombre del país son obligatorios']); - exit; - } - - $conn = getConnection(); - if (!$conn) { - echo json_encode(['success' => false, 'message' => 'Error de conexión a la base de datos']); - exit; - } - - // Verificar duplicados - $sql_check = "SELECT COUNT(*) as count FROM paises WHERE nombre = ? AND id_pais != ?"; - $stmt_check = sqlsrv_query($conn, $sql_check, [$nombre, $id]); - - if (!$stmt_check) { - echo json_encode(['success' => false, 'message' => 'Error al verificar duplicados']); - exit; - } - - $exists = sqlsrv_fetch_array($stmt_check, SQLSRV_FETCH_ASSOC); - if ($exists['count'] > 0) { - echo json_encode(['success' => false, 'message' => 'Ya existe otro país con este nombre']); - exit; - } - - // Actualizar - $iso2_val = empty($iso2) ? null : $iso2; - $iso3_val = empty($iso3) ? null : $iso3; - - $sql = "UPDATE paises SET nombre = ?, iso2 = ?, iso3 = ? WHERE id_pais = ?"; - $params = [$nombre, $iso2_val, $iso3_val, $id]; - - $stmt = sqlsrv_query($conn, $sql, $params); - - if ($stmt && sqlsrv_rows_affected($stmt) > 0) { - echo json_encode(['success' => true, 'message' => 'País actualizado exitosamente']); - } else { - echo json_encode(['success' => false, 'message' => 'No se pudo actualizar el país']); - } - - } catch (Exception $e) { - echo json_encode(['success' => false, 'message' => 'Error: ' . $e->getMessage()]); - } - exit; -} - -// FUNCIÓN ESPECÍFICA PARA ACTUALIZAR ESTADOS -function actualizarEstado() { - header('Content-Type: application/json; charset=utf-8'); - - try { - $id = $_POST['id'] ?? ''; - $nombre = trim($_POST['nombre'] ?? ''); - $abreviatura = trim($_POST['abreviatura'] ?? ''); - $pais_id = $_POST['pais_id'] ?? ''; - - // Validaciones - if (empty($id) || empty($nombre) || empty($pais_id)) { - echo json_encode(['success' => false, 'message' => 'ID, nombre del estado y país son obligatorios']); - exit; - } - - $conn = getConnection(); - if (!$conn) { - echo json_encode(['success' => false, 'message' => 'Error de conexión a la base de datos']); - exit; - } - - // Verificar duplicados - $sql_check = "SELECT COUNT(*) as count FROM estados WHERE nombre = ? AND pais_id = ? AND id_estado != ?"; - $stmt_check = sqlsrv_query($conn, $sql_check, [$nombre, $pais_id, $id]); - - if (!$stmt_check) { - echo json_encode(['success' => false, 'message' => 'Error al verificar duplicados']); - exit; - } - - $exists = sqlsrv_fetch_array($stmt_check, SQLSRV_FETCH_ASSOC); - if ($exists['count'] > 0) { - echo json_encode(['success' => false, 'message' => 'Ya existe otro estado con este nombre en el país seleccionado']); - exit; - } - - // Actualizar - $abreviatura_val = empty($abreviatura) ? null : $abreviatura; - - $sql = "UPDATE estados SET nombre = ?, abreviatura = ?, pais_id = ? WHERE id_estado = ?"; - $params = [$nombre, $abreviatura_val, $pais_id, $id]; - - $stmt = sqlsrv_query($conn, $sql, $params); - - if ($stmt && sqlsrv_rows_affected($stmt) > 0) { - echo json_encode(['success' => true, 'message' => 'Estado actualizado exitosamente']); - } else { - echo json_encode(['success' => false, 'message' => 'No se pudo actualizar el estado']); - } - - } catch (Exception $e) { - echo json_encode(['success' => false, 'message' => 'Error: ' . $e->getMessage()]); - } - exit; -} - -// FUNCIÓN ESPECÍFICA PARA ACTUALIZAR CIUDADES -function actualizarCiudad() { - header('Content-Type: application/json; charset=utf-8'); - - try { - $id = $_POST['id'] ?? ''; - $nombre = trim($_POST['nombre'] ?? ''); - $estado_id = $_POST['estado_id'] ?? ''; - - // Validaciones - if (empty($id) || empty($nombre) || empty($estado_id)) { - echo json_encode(['success' => false, 'message' => 'ID, nombre de la ciudad y estado son obligatorios']); - exit; - } - - $conn = getConnection(); - if (!$conn) { - echo json_encode(['success' => false, 'message' => 'Error de conexión a la base de datos']); - exit; - } - - // Verificar duplicados - $sql_check = "SELECT COUNT(*) as count FROM ciudades WHERE nombre = ? AND estado_id = ? AND id_ciudad != ?"; - $stmt_check = sqlsrv_query($conn, $sql_check, [$nombre, $estado_id, $id]); - - if (!$stmt_check) { - echo json_encode(['success' => false, 'message' => 'Error al verificar duplicados']); - exit; - } - - $exists = sqlsrv_fetch_array($stmt_check, SQLSRV_FETCH_ASSOC); - if ($exists['count'] > 0) { - echo json_encode(['success' => false, 'message' => 'Ya existe otra ciudad con este nombre en el estado seleccionado']); - exit; - } - - // Actualizar - $sql = "UPDATE ciudades SET nombre = ?, estado_id = ? WHERE id_ciudad = ?"; - $params = [$nombre, $estado_id, $id]; - - $stmt = sqlsrv_query($conn, $sql, $params); - - if ($stmt && sqlsrv_rows_affected($stmt) > 0) { - echo json_encode(['success' => true, 'message' => 'Ciudad actualizada exitosamente']); - } else { - echo json_encode(['success' => false, 'message' => 'No se pudo actualizar la ciudad']); - } - - } catch (Exception $e) { - echo json_encode(['success' => false, 'message' => 'Error: ' . $e->getMessage()]); - } - exit; -} - -// Función para eliminar locaciones (países, estados, ciudades) -function eliminar() { - header('Content-Type: application/json; charset=utf-8'); - - try { - // Obtener datos del JSON enviado - $input = json_decode(file_get_contents('php://input'), true); - $tipo = $input['tipo'] ?? ''; - $id = $input['id'] ?? ''; - - if (empty($tipo) || empty($id)) { - echo json_encode(['success' => false, 'message' => 'Datos incompletos']); - exit; - } - - $conn = getConnection(); - - switch ($tipo) { - case 'pais': - // Verificar si el país tiene estados asociados - $sql_check = "SELECT COUNT(*) as count FROM estados WHERE pais_id = ?"; - $stmt_check = sqlsrv_query($conn, $sql_check, [$id]); - $has_estados = sqlsrv_fetch_array($stmt_check, SQLSRV_FETCH_ASSOC); - - if ($has_estados['count'] > 0) { - echo json_encode(['success' => false, 'message' => 'No se puede eliminar el país porque tiene estados asociados']); - exit; - } - - // Eliminar país - $sql = "DELETE FROM paises WHERE id_pais = ?"; - $stmt = sqlsrv_query($conn, $sql, [$id]); - - if ($stmt) { - echo json_encode(['success' => true, 'message' => 'País eliminado exitosamente']); - } else { - $errors = sqlsrv_errors(); - $errorMessage = 'Error al eliminar el país'; - if ($errors) { - $errorMessage .= ': ' . $errors[0]['message']; - } - echo json_encode(['success' => false, 'message' => $errorMessage]); - } - break; - - case 'estado': - // Verificar si el estado tiene ciudades asociadas - $sql_check = "SELECT COUNT(*) as count FROM ciudades WHERE estado_id = ?"; - $stmt_check = sqlsrv_query($conn, $sql_check, [$id]); - $has_ciudades = sqlsrv_fetch_array($stmt_check, SQLSRV_FETCH_ASSOC); - - if ($has_ciudades['count'] > 0) { - echo json_encode(['success' => false, 'message' => 'No se puede eliminar el estado porque tiene ciudades asociadas']); - exit; - } - - // Eliminar estado - $sql = "DELETE FROM estados WHERE id_estado = ?"; - $stmt = sqlsrv_query($conn, $sql, [$id]); - - if ($stmt) { - echo json_encode(['success' => true, 'message' => 'Estado eliminado exitosamente']); - } else { - $errors = sqlsrv_errors(); - $errorMessage = 'Error al eliminar el estado'; - if ($errors) { - $errorMessage .= ': ' . $errors[0]['message']; - } - echo json_encode(['success' => false, 'message' => $errorMessage]); - } - break; - - case 'ciudad': - // Verificar si la ciudad está siendo utilizada en alguna relación - // (aquí puedes agregar más verificaciones según tu modelo de datos) - - // Eliminar ciudad - $sql = "DELETE FROM ciudades WHERE id_ciudad = ?"; - $stmt = sqlsrv_query($conn, $sql, [$id]); - - if ($stmt) { - echo json_encode(['success' => true, 'message' => 'Ciudad eliminada exitosamente']); - } else { - $errors = sqlsrv_errors(); - $errorMessage = 'Error al eliminar la ciudad'; - if ($errors) { - $errorMessage .= ': ' . $errors[0]['message']; - } - echo json_encode(['success' => false, 'message' => $errorMessage]); - } - break; - - default: - echo json_encode(['success' => false, 'message' => 'Tipo de elemento no válido']); - break; - } - - } catch (Exception $e) { - echo json_encode(['success' => false, 'message' => 'Error: ' . $e->getMessage()]); - } - exit; } \ No newline at end of file diff --git a/app/controllers/automatizaciones.php b/app/controllers/automatizaciones.php new file mode 100644 index 0000000..d6a5445 --- /dev/null +++ b/app/controllers/automatizaciones.php @@ -0,0 +1,9 @@ +getMessage()); } -} - -function automatizaciones() -{ - include __DIR__ . '/../../views/configuracion/automatizaciones.php'; } \ No newline at end of file diff --git a/app/controllers/locaciones.php b/app/controllers/locaciones.php new file mode 100644 index 0000000..dcf8a8c --- /dev/null +++ b/app/controllers/locaciones.php @@ -0,0 +1,520 @@ + false, 'message' => 'Debe seleccionar un país']); + exit; + } + + if (empty($entidad)) { + echo json_encode(['success' => false, 'message' => 'Debe ingresar el nombre del estado']); + exit; + } + + $conn = getConnection(); + + // Verificar que el país existe + $sql_pais = "SELECT COUNT(*) as count FROM paises WHERE id_pais = ?"; + $stmt_pais = sqlsrv_query($conn, $sql_pais, [$pais_id]); + $pais_exists = sqlsrv_fetch_array($stmt_pais, SQLSRV_FETCH_ASSOC); + + if ($pais_exists['count'] == 0) { + echo json_encode(['success' => false, 'message' => 'El país seleccionado no existe']); + exit; + } + + // Verificar si ya existe el estado en ese país + $sql_check = "SELECT COUNT(*) as count FROM estados WHERE pais_id = ? AND nombre = ?"; + $stmt_check = sqlsrv_query($conn, $sql_check, [$pais_id, $entidad]); + $exists = sqlsrv_fetch_array($stmt_check, SQLSRV_FETCH_ASSOC); + + if ($exists['count'] > 0) { + echo json_encode(['success' => false, 'message' => 'Este estado ya existe en el país seleccionado']); + exit; + } + + // Insertar nuevo estado + // Primero obtenemos el siguiente ID disponible + $sql_max = "SELECT ISNULL(MAX(id_estado), 0) + 1 as next_id FROM estados"; + $stmt_max = sqlsrv_query($conn, $sql_max); + $next_id_row = sqlsrv_fetch_array($stmt_max, SQLSRV_FETCH_ASSOC); + $next_id = $next_id_row['next_id']; + + $sql = "INSERT INTO estados (id_estado, pais_id, nombre) VALUES (?, ?, ?)"; + $stmt = sqlsrv_query($conn, $sql, [$next_id, $pais_id, $entidad]); + + if ($stmt) { + echo json_encode(['success' => true, 'message' => 'Estado registrado exitosamente']); + } else { + // Obtener el error específico de SQL Server + $errors = sqlsrv_errors(); + $errorMessage = 'Error al registrar el estado'; + if ($errors) { + $errorMessage .= ': ' . $errors[0]['message']; + } + error_log("Error SQL: " . print_r($errors, true)); + echo json_encode(['success' => false, 'message' => $errorMessage]); + } + + } catch (Exception $e) { + echo json_encode(['success' => false, 'message' => 'Error: ' . $e->getMessage()]); + } + exit; +} + +// Guardar nueva ciudad +function guardarCiudad() { + header('Content-Type: application/json; charset=utf-8'); + + try { + $estado_id = $_POST['entidad'] ?? ''; + $ciudad = trim($_POST['ciudad'] ?? ''); + + // Validaciones + if (empty($estado_id) || empty($ciudad)) { + echo json_encode(['success' => false, 'message' => 'Todos los campos son obligatorios']); + exit; + } + + $conn = getConnection(); + + // Verificar si ya existe la ciudad en ese estado + $sql_check = "SELECT COUNT(*) as count FROM ciudades WHERE estado_id = ? AND nombre = ?"; + $stmt_check = sqlsrv_query($conn, $sql_check, [$estado_id, $ciudad]); + $exists = sqlsrv_fetch_array($stmt_check, SQLSRV_FETCH_ASSOC); + + if ($exists['count'] > 0) { + echo json_encode(['success' => false, 'message' => 'Esta ciudad ya existe en el estado seleccionado']); + exit; + } + + // Insertar nueva ciudad + $sql = "INSERT INTO ciudades (estado_id, nombre) VALUES (?, ?)"; + $stmt = sqlsrv_query($conn, $sql, [$estado_id, $ciudad]); + + if ($stmt) { + echo json_encode(['success' => true, 'message' => 'Ciudad registrada exitosamente']); + } else { + echo json_encode(['success' => false, 'message' => 'Error al registrar la ciudad']); + } + + } catch (Exception $e) { + echo json_encode(['success' => false, 'message' => 'Error: ' . $e->getMessage()]); + } + exit; +} + +// Función para obtener país por estado (necesaria para el modal de edición de ciudades) +function obtenerPaisPorEstado() { + header('Content-Type: application/json; charset=utf-8'); + + try { + $estado_id = $_GET['estado'] ?? ''; + + if (empty($estado_id)) { + echo json_encode(['success' => false, 'message' => 'ID de estado requerido']); + exit; + } + + $conn = getConnection(); + $sql = "SELECT pais_id FROM estados WHERE id_estado = ?"; + $stmt = sqlsrv_query($conn, $sql, [$estado_id]); + + if ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) { + echo json_encode(['success' => true, 'pais_id' => $row['pais_id']]); + } else { + echo json_encode(['success' => false, 'message' => 'Estado no encontrado']); + } + + } catch (Exception $e) { + echo json_encode(['success' => false, 'message' => 'Error: ' . $e->getMessage()]); + } + exit; +} + +// FUNCIÓN DISPATCHER PARA EDICIÓN +function editar() { + $tipo = $_POST['tipo'] ?? ''; + + // Log para debugging + error_log("Función editar llamada con tipo: " . $tipo); + error_log("POST data: " . print_r($_POST, true)); + + switch ($tipo) { + case 'pais': + actualizarPais(); + break; + case 'estado': + actualizarEstado(); + break; + case 'ciudad': + actualizarCiudad(); + break; + default: + header('Content-Type: application/json; charset=utf-8'); + echo json_encode(['success' => false, 'message' => 'Tipo de elemento no válido: ' . $tipo]); + exit; + } +} + +// FUNCIÓN ESPECÍFICA PARA ACTUALIZAR PAÍSES +function actualizarPais() { + header('Content-Type: application/json; charset=utf-8'); + + try { + $id = $_POST['id'] ?? ''; + $nombre = trim($_POST['nombre'] ?? ''); + $iso2 = trim($_POST['iso2'] ?? ''); + $iso3 = trim($_POST['iso3'] ?? ''); + + // Validaciones + if (empty($id) || empty($nombre)) { + echo json_encode(['success' => false, 'message' => 'ID y nombre del país son obligatorios']); + exit; + } + + $conn = getConnection(); + if (!$conn) { + echo json_encode(['success' => false, 'message' => 'Error de conexión a la base de datos']); + exit; + } + + // Verificar duplicados + $sql_check = "SELECT COUNT(*) as count FROM paises WHERE nombre = ? AND id_pais != ?"; + $stmt_check = sqlsrv_query($conn, $sql_check, [$nombre, $id]); + + if (!$stmt_check) { + echo json_encode(['success' => false, 'message' => 'Error al verificar duplicados']); + exit; + } + + $exists = sqlsrv_fetch_array($stmt_check, SQLSRV_FETCH_ASSOC); + if ($exists['count'] > 0) { + echo json_encode(['success' => false, 'message' => 'Ya existe otro país con este nombre']); + exit; + } + + // Actualizar + $iso2_val = empty($iso2) ? null : $iso2; + $iso3_val = empty($iso3) ? null : $iso3; + + $sql = "UPDATE paises SET nombre = ?, iso2 = ?, iso3 = ? WHERE id_pais = ?"; + $params = [$nombre, $iso2_val, $iso3_val, $id]; + + $stmt = sqlsrv_query($conn, $sql, $params); + + if ($stmt && sqlsrv_rows_affected($stmt) > 0) { + echo json_encode(['success' => true, 'message' => 'País actualizado exitosamente']); + } else { + echo json_encode(['success' => false, 'message' => 'No se pudo actualizar el país']); + } + + } catch (Exception $e) { + echo json_encode(['success' => false, 'message' => 'Error: ' . $e->getMessage()]); + } + exit; +} + +// FUNCIÓN ESPECÍFICA PARA ACTUALIZAR ESTADOS +function actualizarEstado() { + header('Content-Type: application/json; charset=utf-8'); + + try { + $id = $_POST['id'] ?? ''; + $nombre = trim($_POST['nombre'] ?? ''); + $abreviatura = trim($_POST['abreviatura'] ?? ''); + $pais_id = $_POST['pais_id'] ?? ''; + + // Validaciones + if (empty($id) || empty($nombre) || empty($pais_id)) { + echo json_encode(['success' => false, 'message' => 'ID, nombre del estado y país son obligatorios']); + exit; + } + + $conn = getConnection(); + if (!$conn) { + echo json_encode(['success' => false, 'message' => 'Error de conexión a la base de datos']); + exit; + } + + // Verificar duplicados + $sql_check = "SELECT COUNT(*) as count FROM estados WHERE nombre = ? AND pais_id = ? AND id_estado != ?"; + $stmt_check = sqlsrv_query($conn, $sql_check, [$nombre, $pais_id, $id]); + + if (!$stmt_check) { + echo json_encode(['success' => false, 'message' => 'Error al verificar duplicados']); + exit; + } + + $exists = sqlsrv_fetch_array($stmt_check, SQLSRV_FETCH_ASSOC); + if ($exists['count'] > 0) { + echo json_encode(['success' => false, 'message' => 'Ya existe otro estado con este nombre en el país seleccionado']); + exit; + } + + // Actualizar + $abreviatura_val = empty($abreviatura) ? null : $abreviatura; + + $sql = "UPDATE estados SET nombre = ?, abreviatura = ?, pais_id = ? WHERE id_estado = ?"; + $params = [$nombre, $abreviatura_val, $pais_id, $id]; + + $stmt = sqlsrv_query($conn, $sql, $params); + + if ($stmt && sqlsrv_rows_affected($stmt) > 0) { + echo json_encode(['success' => true, 'message' => 'Estado actualizado exitosamente']); + } else { + echo json_encode(['success' => false, 'message' => 'No se pudo actualizar el estado']); + } + + } catch (Exception $e) { + echo json_encode(['success' => false, 'message' => 'Error: ' . $e->getMessage()]); + } + exit; +} + +// FUNCIÓN ESPECÍFICA PARA ACTUALIZAR CIUDADES +function actualizarCiudad() { + header('Content-Type: application/json; charset=utf-8'); + + try { + $id = $_POST['id'] ?? ''; + $nombre = trim($_POST['nombre'] ?? ''); + $estado_id = $_POST['estado_id'] ?? ''; + + // Validaciones + if (empty($id) || empty($nombre) || empty($estado_id)) { + echo json_encode(['success' => false, 'message' => 'ID, nombre de la ciudad y estado son obligatorios']); + exit; + } + + $conn = getConnection(); + if (!$conn) { + echo json_encode(['success' => false, 'message' => 'Error de conexión a la base de datos']); + exit; + } + + // Verificar duplicados + $sql_check = "SELECT COUNT(*) as count FROM ciudades WHERE nombre = ? AND estado_id = ? AND id_ciudad != ?"; + $stmt_check = sqlsrv_query($conn, $sql_check, [$nombre, $estado_id, $id]); + + if (!$stmt_check) { + echo json_encode(['success' => false, 'message' => 'Error al verificar duplicados']); + exit; + } + + $exists = sqlsrv_fetch_array($stmt_check, SQLSRV_FETCH_ASSOC); + if ($exists['count'] > 0) { + echo json_encode(['success' => false, 'message' => 'Ya existe otra ciudad con este nombre en el estado seleccionado']); + exit; + } + + // Actualizar + $sql = "UPDATE ciudades SET nombre = ?, estado_id = ? WHERE id_ciudad = ?"; + $params = [$nombre, $estado_id, $id]; + + $stmt = sqlsrv_query($conn, $sql, $params); + + if ($stmt && sqlsrv_rows_affected($stmt) > 0) { + echo json_encode(['success' => true, 'message' => 'Ciudad actualizada exitosamente']); + } else { + echo json_encode(['success' => false, 'message' => 'No se pudo actualizar la ciudad']); + } + + } catch (Exception $e) { + echo json_encode(['success' => false, 'message' => 'Error: ' . $e->getMessage()]); + } + exit; +} + +// Función para eliminar locaciones (países, estados, ciudades) +function eliminar() { + header('Content-Type: application/json; charset=utf-8'); + + try { + // Obtener datos del JSON enviado + $input = json_decode(file_get_contents('php://input'), true); + $tipo = $input['tipo'] ?? ''; + $id = $input['id'] ?? ''; + + if (empty($tipo) || empty($id)) { + echo json_encode(['success' => false, 'message' => 'Datos incompletos']); + exit; + } + + $conn = getConnection(); + + switch ($tipo) { + case 'pais': + // Verificar si el país tiene estados asociados + $sql_check = "SELECT COUNT(*) as count FROM estados WHERE pais_id = ?"; + $stmt_check = sqlsrv_query($conn, $sql_check, [$id]); + $has_estados = sqlsrv_fetch_array($stmt_check, SQLSRV_FETCH_ASSOC); + + if ($has_estados['count'] > 0) { + echo json_encode(['success' => false, 'message' => 'No se puede eliminar el país porque tiene estados asociados']); + exit; + } + + // Eliminar país + $sql = "DELETE FROM paises WHERE id_pais = ?"; + $stmt = sqlsrv_query($conn, $sql, [$id]); + + if ($stmt) { + echo json_encode(['success' => true, 'message' => 'País eliminado exitosamente']); + } else { + $errors = sqlsrv_errors(); + $errorMessage = 'Error al eliminar el país'; + if ($errors) { + $errorMessage .= ': ' . $errors[0]['message']; + } + echo json_encode(['success' => false, 'message' => $errorMessage]); + } + break; + + case 'estado': + // Verificar si el estado tiene ciudades asociadas + $sql_check = "SELECT COUNT(*) as count FROM ciudades WHERE estado_id = ?"; + $stmt_check = sqlsrv_query($conn, $sql_check, [$id]); + $has_ciudades = sqlsrv_fetch_array($stmt_check, SQLSRV_FETCH_ASSOC); + + if ($has_ciudades['count'] > 0) { + echo json_encode(['success' => false, 'message' => 'No se puede eliminar el estado porque tiene ciudades asociadas']); + exit; + } + + // Eliminar estado + $sql = "DELETE FROM estados WHERE id_estado = ?"; + $stmt = sqlsrv_query($conn, $sql, [$id]); + + if ($stmt) { + echo json_encode(['success' => true, 'message' => 'Estado eliminado exitosamente']); + } else { + $errors = sqlsrv_errors(); + $errorMessage = 'Error al eliminar el estado'; + if ($errors) { + $errorMessage .= ': ' . $errors[0]['message']; + } + echo json_encode(['success' => false, 'message' => $errorMessage]); + } + break; + + case 'ciudad': + // Verificar si la ciudad está siendo utilizada en alguna relación + // (aquí puedes agregar más verificaciones según tu modelo de datos) + + // Eliminar ciudad + $sql = "DELETE FROM ciudades WHERE id_ciudad = ?"; + $stmt = sqlsrv_query($conn, $sql, [$id]); + + if ($stmt) { + echo json_encode(['success' => true, 'message' => 'Ciudad eliminada exitosamente']); + } else { + $errors = sqlsrv_errors(); + $errorMessage = 'Error al eliminar la ciudad'; + if ($errors) { + $errorMessage .= ': ' . $errors[0]['message']; + } + echo json_encode(['success' => false, 'message' => $errorMessage]); + } + break; + + default: + echo json_encode(['success' => false, 'message' => 'Tipo de elemento no válido']); + break; + } + + } catch (Exception $e) { + echo json_encode(['success' => false, 'message' => 'Error: ' . $e->getMessage()]); + } + exit; +} \ No newline at end of file diff --git a/app/controllers/login.php b/app/controllers/login.php index 8be0084..ab1cfce 100644 --- a/app/controllers/login.php +++ b/app/controllers/login.php @@ -306,7 +306,7 @@ function enviarCodigo() $emailEncrypted = encrypt($email); - $sql = "SELECT id_usuario FROM usuarios_sistema WHERE email = ?"; + $sql = "SELECT id_usuario, activo FROM usuarios_sistema WHERE email = ?"; $stmt = sqlsrv_query($conn, $sql, [$emailEncrypted]); if (!$stmt || !($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC))) { @@ -314,6 +314,13 @@ function enviarCodigo() exit; } $id_usuario = $row['id_usuario']; + $activo = $row['activo']; + + // Validación del estado de la cuenta + if ($activo != 1) { + echo json_encode(['success' => false, 'message' => '❌ Tu cuenta está inactiva. Contacta a tu Agente Aduanal.']); + exit; + } $now = (new DateTime())->format('Y-m-d H:i:s'); $sqlCheck = "SELECT COUNT(*) AS total FROM recuperacion_password @@ -374,7 +381,7 @@ function enviarCodigo()

Este código expirará en 10 minutos.

- © " . date('Y') . " SIIH · Desarrollado por AduanaSoft + © " . date('Y') . " SIIH · Sistema Integral para Importadores de Hidrocarburos
"; @@ -433,7 +440,7 @@ function enviarCorreoRespaldo($conn, $id_usuario, $codigo)

Si no lo solicitaste, ignora este mensaje.

- © " . date('Y') . " SIIH · Desarrollado por AduanaSoft + © " . date('Y') . " SIIH · Sistema Integral para Importadores de Hidrocarburos
"; @@ -1094,7 +1101,7 @@ function cambiarPassword()

Si tú no realizaste esta acción, te recomendamos restablecer tu contraseña inmediatamente o contactar al área de soporte.

- © " . date('Y') . " SIIH · Desarrollado por AduanaSoft + © " . date('Y') . " SIIH · Sistema Integral para Importadores de Hidrocarburos
"; diff --git a/app/controllers/patente.php b/app/controllers/patente.php new file mode 100644 index 0000000..5343775 --- /dev/null +++ b/app/controllers/patente.php @@ -0,0 +1,310 @@ + 3) die("❌ La aduana debe ser numérica y máximo 3 dígitos."); + if (!is_numeric($patente) || strlen($patente) > 4) die("❌ La patente debe ser numérica y máximo 4 dígitos."); + if (strlen($rfc) > 13) die("❌ El RFC no puede exceder 13 caracteres."); + if (strlen($curp) > 18) die("❌ El CURP no puede exceder 18 caracteres."); + + // Validar duplicado para este usuario + $sqlCheck = "SELECT COUNT(*) as count FROM dbo.agentes_aduanales WHERE aduana = ? AND patente = ? AND id_usuario = ?"; + $stmtCheck = sqlsrv_query($conn, $sqlCheck, [$aduana, $patente, $id_usuario]); + + if ($stmtCheck === false) die("❌ Error al verificar duplicados: " . print_r(sqlsrv_errors(), true)); + + $row = sqlsrv_fetch_array($stmtCheck, SQLSRV_FETCH_ASSOC); + if ($row['count'] > 0) die("❌ Ya existe un agente aduanal con esta combinación de aduana y patente."); + + sqlsrv_free_stmt($stmtCheck); + + // Insertar registro + $sql = "INSERT INTO dbo.agentes_aduanales + (aduana, patente, agente_aduanal, rfc, curp, razon_social, id_usuario, activo, + mf_nombre, mf_paterno, mf_materno, + vp_inicio, vp_final, vp_siguiente, + vpe_inicio, vpe_final, vpe_siguiente, + vat_pb_inicio, vat_pb_final, vat_pb_siguiente, + vcc_inicio, vcc_final, vcc_siguiente, + vae_inicio, vae_final, vae_siguiente) + VALUES (?, ?, ?, ?, ?, ?, ?, 1, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; + + $params = [ + $aduana, $patente, $agente_aduanal, $rfc, $curp, $razon_social, $id_usuario, + $mf_nombre, $mf_paterno, $mf_materno, + $vp_inicio, $vp_final, $vp_siguiente, + $vpe_inicio, $vpe_final, $vpe_siguiente, + $vat_pb_inicio, $vat_pb_final, $vat_pb_siguiente, + $vcc_inicio, $vcc_final, $vcc_siguiente, + $vae_inicio, $vae_final, $vae_siguiente + ]; + + $stmt = sqlsrv_query($conn, $sql, $params); + if ($stmt === false) die("❌ Error al guardar agente aduanal."); + + sqlsrv_free_stmt($stmt); + sqlsrv_close($conn); + + header("Location: /IMPORTADORES/patente/lista?success=1"); + exit; +} + +function editar() +{ + if (!($_SESSION['usuario_id'] ?? false)) { + header('Location: /IMPORTADORES/login'); + exit; + } + + $usr = $_SESSION['usuario_id']; + $id = $_GET['id'] ?? null; + + if (!$id || !is_numeric($id)) { + die("❌ ID inválido."); + } + + $conn = getConnection(); + + $sql = " + SELECT aa.* + FROM dbo.agentes_aduanales aa + WHERE aa.id_agente = ? + AND aa.id_usuario = ? + "; + + $stmt = sqlsrv_query($conn, $sql, [(int)$id, $_SESSION['usuario_id']]); + + if ($stmt === false) { + die("Error en editar(): " . print_r(sqlsrv_errors(), true)); + } + + $agente = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC); + + if (!$agente) { + die("❌ Agente no encontrado o no autorizado."); + } + + include __DIR__ . '/../../views/patente/editar.php'; +} + +function actualizar() +{ + if (!($_SESSION['usuario_id'] ?? false)) { + die("⚠️ No autorizado."); + } + + $conn = getConnection(); + + $id_agente = (int)($_POST['id_agente'] ?? 0); + $aduana = trim($_POST['aduana'] ?? ''); + $patente = trim($_POST['patente'] ?? ''); + $agente_aduanal = trim($_POST['agente_aduanal'] ?? ''); + $rfc = trim($_POST['rfc'] ?? ''); + $curp = trim($_POST['curp'] ?? ''); + $razon_social = trim($_POST['razon_social'] ?? ''); + $id_usuario = $_SESSION['usuario_id']; + + $mf_nombre = trim($_POST['mf_nombre'] ?? ''); + $mf_paterno = trim($_POST['mf_paterno'] ?? ''); + $mf_materno = trim($_POST['mf_materno'] ?? ''); + + $vp_inicio = (int)($_POST['vp_inicio'] ?? 0); + $vp_final = (int)($_POST['vp_final'] ?? 0); + $vp_siguiente = (int)($_POST['vp_siguiente'] ?? 0); + + $vpe_inicio = (int)($_POST['vpe_inicio'] ?? 0); + $vpe_final = (int)($_POST['vpe_final'] ?? 0); + $vpe_siguiente = (int)($_POST['vpe_siguiente'] ?? 0); + + $vat_pb_inicio = (int)($_POST['vat_pb_inicio'] ?? 0); + $vat_pb_final = (int)($_POST['vat_pb_final'] ?? 0); + $vat_pb_siguiente = (int)($_POST['vat_pb_siguiente'] ?? 0); + + $vcc_inicio = (int)($_POST['vcc_inicio'] ?? 0); + $vcc_final = (int)($_POST['vcc_final'] ?? 0); + $vcc_siguiente = (int)($_POST['vcc_siguiente'] ?? 0); + + $vae_inicio = (int)($_POST['vae_inicio'] ?? 0); + $vae_final = (int)($_POST['vae_final'] ?? 0); + $vae_siguiente = (int)($_POST['vae_siguiente'] ?? 0); + + if (!$id_agente || empty($aduana) || empty($patente) || empty($agente_aduanal) || empty($rfc) || empty($curp) || empty($razon_social)) { + die("❌ Datos inválidos o incompletos."); + } + + if (!is_numeric($aduana) || strlen($aduana) > 3) die("❌ La aduana debe ser numérica y máximo 3 dígitos."); + if (!is_numeric($patente) || strlen($patente) > 4) die("❌ La patente debe ser numérica y máximo 4 dígitos."); + if (strlen($rfc) > 13) die("❌ El RFC no puede exceder 13 caracteres."); + if (strlen($curp) > 18) die("❌ El CURP no puede exceder 18 caracteres."); + + // Validar duplicado (excepto el propio id) + $sqlCheck = "SELECT COUNT(*) as count FROM dbo.agentes_aduanales + WHERE aduana = ? AND patente = ? AND id_usuario = ? AND id_agente != ?"; + $stmtCheck = sqlsrv_query($conn, $sqlCheck, [$aduana, $patente, $id_usuario, $id_agente]); + + if ($stmtCheck === false) die("❌ Error al verificar duplicados."); + + $row = sqlsrv_fetch_array($stmtCheck, SQLSRV_FETCH_ASSOC); + if ($row['count'] > 0) die("❌ Ya existe un agente aduanal con esta combinación de aduana y patente."); + + sqlsrv_free_stmt($stmtCheck); + + // UPDATE + $sql = "UPDATE dbo.agentes_aduanales SET + aduana = ?, patente = ?, agente_aduanal = ?, rfc = ?, curp = ?, razon_social = ?, + mf_nombre = ?, mf_paterno = ?, mf_materno = ?, + vp_inicio = ?, vp_final = ?, vp_siguiente = ?, + vpe_inicio = ?, vpe_final = ?, vpe_siguiente = ?, + vat_pb_inicio = ?, vat_pb_final = ?, vat_pb_siguiente = ?, + vcc_inicio = ?, vcc_final = ?, vcc_siguiente = ?, + vae_inicio = ?, vae_final = ?, vae_siguiente = ? + WHERE id_agente = ? AND id_usuario = ?"; + + $params = [ + $aduana, $patente, $agente_aduanal, $rfc, $curp, $razon_social, + $mf_nombre, $mf_paterno, $mf_materno, + $vp_inicio, $vp_final, $vp_siguiente, + $vpe_inicio, $vpe_final, $vpe_siguiente, + $vat_pb_inicio, $vat_pb_final, $vat_pb_siguiente, + $vcc_inicio, $vcc_final, $vcc_siguiente, + $vae_inicio, $vae_final, $vae_siguiente, + $id_agente, $id_usuario + ]; + + $stmt = sqlsrv_query($conn, $sql, $params); + if ($stmt === false) die("❌ Error al actualizar agente aduanal."); + + sqlsrv_free_stmt($stmt); + sqlsrv_close($conn); + + header("Location: /IMPORTADORES/patente/lista?updated=ok"); + exit; +} + +/** Borrar de un chofer **/ +function eliminar() +{ + if (!($_SESSION['usuario_id'] ?? false)) { + header('Location: /IMPORTADORES/login'); + exit; + } + + $usr = $_SESSION['usuario_id']; + $id = $_GET['id'] ?? null; + if (!$id || !is_numeric($id)) { + die("❌ ID inválido."); + } + + $conn = getConnection(); + + // Verificar que el transportista exista y pertenezca al usuario + $sqlChk = "SELECT COUNT(*) AS cnt + FROM dbo.agentes_aduanales + WHERE id_agente = ? AND id_usuario = ?"; + $stmtChk = sqlsrv_query($conn, $sqlChk, [$id, $usr]); + $rowChk = sqlsrv_fetch_array($stmtChk, SQLSRV_FETCH_ASSOC); + if ($rowChk['cnt'] == 0) { + die("❌ Agente no encontrado o no autorizado."); + } + + $sql = "UPDATE dbo.agentes_aduanales SET activo = 0 WHERE id_agente = ?"; + $stmt = sqlsrv_query($conn, $sql, [(int)$id]); + if ($stmt === false) { + die("❌ Error en eliminar(): " . print_r(sqlsrv_errors(), true)); + } + + header('Location: /IMPORTADORES/patente/lista?deleted=ok'); + exit; +} \ No newline at end of file diff --git a/app/controllers/seguridad.php b/app/controllers/seguridad.php index 6da955a..001d0da 100644 --- a/app/controllers/seguridad.php +++ b/app/controllers/seguridad.php @@ -185,6 +185,28 @@ function modificarCorreoExtra() } } +function eliminarCorreoExtra() +{ + if (!isset($_SESSION['usuario_id']) || ($_SESSION['pendiente_confirmacion'] ?? false)) { + echo "Error: no se ha iniciado sesión o sesión incompleta."; + exit; + } + + $id_usuario = $_SESSION['usuario_id']; + $conn = getConnection(); + + $query = "DELETE FROM correo_extra WHERE id_usuario = ?"; + $stmt = sqlsrv_prepare($conn, $query, [$id_usuario]); + + if ($stmt && sqlsrv_execute($stmt)) { + $_SESSION['config_success'] = 'Correo adicional eliminado correctamente.'; + header('Location: /IMPORTADORES/seguridad/index'); + exit; + } else { + echo "Error al eliminar el correo adicional."; + } +} + function correoRespaldo() { // CORRIGIDO: Cambiar id_usuario por usuario_id y verificar confirmación @@ -253,6 +275,28 @@ function modificarCorreoRspaldo() } } +function eliminarCorreoRespaldo() +{ + if (!isset($_SESSION['usuario_id']) || ($_SESSION['pendiente_confirmacion'] ?? false)) { + echo "Error: no se ha iniciado sesión o sesión incompleta."; + exit; + } + + $id_usuario = $_SESSION['usuario_id']; + $conn = getConnection(); + + $query = "DELETE FROM correo_respaldo WHERE id_usuario = ?"; + $stmt = sqlsrv_prepare($conn, $query, [$id_usuario]); + + if ($stmt && sqlsrv_execute($stmt)) { + $_SESSION['config_success'] = 'Correo de respaldo eliminado correctamente.'; + header('Location: /IMPORTADORES/seguridad/index'); + exit; + } else { + echo "Error al eliminar el correo de respaldo."; + } +} + function obtenerCorreos($conn, $id_usuario) { $correos = [ diff --git a/app/controllers/transportistas.php b/app/controllers/transportistas.php index aebf046..add0845 100644 --- a/app/controllers/transportistas.php +++ b/app/controllers/transportistas.php @@ -462,7 +462,6 @@ function actualizar() } function eliminar() { - session_start(); if (!($_SESSION['usuario_id'] ?? false)) { header('Location: /IMPORTADORES/login'); exit; @@ -486,7 +485,7 @@ function eliminar() { } // ELIMINACIÓN REAL - DELETE en lugar de UPDATE - $sqlDel = "DELETE FROM dbo.transportistas WHERE id_transportista = ?"; + $sqlDel = "UPDATE dbo.transportistas SET activo = 0 WHERE id_transportista = ?"; $stmtDel = sqlsrv_query($conn, $sqlDel, [$id]); if ($stmtDel === false) { die("❌ Error al eliminar: " . print_r(sqlsrv_errors(), true)); diff --git a/patentes.txt b/patentes.txt new file mode 100644 index 0000000..ecc8e02 --- /dev/null +++ b/patentes.txt @@ -0,0 +1,31 @@ +CREATE TABLE agentes_aduanales ( + id_agente INT IDENTITY(1,1) PRIMARY KEY, + aduana VARCHAR(3), + patente VARCHAR(4), + agente_aduanal NVARCHAR(100), + rfc VARCHAR(13), + curp VARCHAR(18), + razon_social NVARCHAR(100), + id_usuario INT, + activo BIT DEFAULT 0, + creado_en DATETIME DEFAULT GETDATE(), + mf_nombre VARCHAR(50), + mf_paterno VARCHAR(50), + mf_materno VARCHAR(50), + vp_inicio INT DEFAULT 0, + vp_final INT DEFAULT 0, + vp_siguiente INT DEFAULT 0, + vpe_inicio INT DEFAULT 0, + vpe_final INT DEFAULT 0, + vpe_siguiente INT DEFAULT 0, + vat_pb_inicio INT DEFAULT 0, + vat_pb_final INT DEFAULT 0, + vat_pb_siguiente INT DEFAULT 0, + vcc_inicio INT DEFAULT 0, + vcc_final INT DEFAULT 0, + vcc_siguiente INT DEFAULT 0, + vae_inicio INT DEFAULT 0, + vae_final INT DEFAULT 0, + vae_siguiente INT DEFAULT 0 + FOREIGN KEY (id_usuario) REFERENCES usuarios_sistema(id_usuario) +) \ No newline at end of file diff --git a/views/configuracion/automatizaciones.php b/views/automatizaciones/automatizaciones.php similarity index 100% rename from views/configuracion/automatizaciones.php rename to views/automatizaciones/automatizaciones.php diff --git a/views/configuracion/dashboard_configuracion.php b/views/configuracion/dashboard_configuracion.php index ac66121..a72de6e 100644 --- a/views/configuracion/dashboard_configuracion.php +++ b/views/configuracion/dashboard_configuracion.php @@ -31,146 +31,133 @@ -
+

ℹ️ Información General

-
-
-
- -
- -
+
+ +
+ +
+ +
-
+
+ +
+ +
+
- -
- -
-
+
+ +
+ +
+
-
- -
- -
-
+
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
-
- -
- -
+
+ +
+ +
+
+ +
+ +
+
-
+
+ +
+ +
+
+ +
+ +
+
- -
- -
-
+
+ +
+ +
+
+ +
+ +
+
-
- -
- -
-
+
+ +
+ +
+
+ +
+ +
+
-
- -
- -
+
+ +
+ +
+
+ +
+ +
+
-
+
+ +
+ +
+
- -
- -
-
- -
- -
- -
- -
- - -
- -
-
- -
- -
- -
- -
- - -
- -
-
- -
- -
- -
- -
- - -
- -
-
- -
- -
- -
- -
- - -
- -
-
- -
- -
- -
-
- -
- -
- -
-
- - +
+ +
+ +
+
+
+
+
\ No newline at end of file diff --git a/views/configuracion/editar.php b/views/configuracion/editar.php index b2a540c..d2c6287 100644 --- a/views/configuracion/editar.php +++ b/views/configuracion/editar.php @@ -32,193 +32,171 @@ -
+

✏️ Editar Información

-
-
-
- -
- -
- -
- - -
- -
-
- -
- -
- -
-
- -
- -
- -
- -
- - -
- -
-
- -
- -
- -
-
- -
- -
- -
- -
- - -
- -
-
- -
- -
- -
- -
- - -
- -
-
- -
- -
- -
- -
- - -
- -
-
- -
- -
- -
- -
- - -
- -
-
- -
- -
- -
- -
- - -
- -
-
- -
- -
- -
-
- -
- -
- - -
-
-
- Cancelar - -
-
+
+
+
+ +
+ +
+
+ +
+ +
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ + +
+
+
+ Cancelar + +
+
+
- - + + // Si no hay errores, enviar el formulario + this.submit(); // Esto sí lo envía manualmente + }); + \ No newline at end of file diff --git a/views/importadores/dashboard_importador.php b/views/importadores/dashboard_importador.php index 32ad700..73d5417 100644 --- a/views/importadores/dashboard_importador.php +++ b/views/importadores/dashboard_importador.php @@ -64,7 +64,7 @@
-
Solicitud de Importación
+
Solicitudes de Importación

Inicia nuevas solicitudes de pedimentos.

diff --git a/views/partials/sidebar_agente.php b/views/partials/sidebar_agente.php index f4340fa..40bdcd0 100644 --- a/views/partials/sidebar_agente.php +++ b/views/partials/sidebar_agente.php @@ -43,6 +43,15 @@ if (!isset($_SESSION['usuario_id']) || $_SESSION['tipo_usuario'] !== 'agente_adu -
+ \ No newline at end of file diff --git a/views/partials/sidebar_configuracion.php b/views/partials/sidebar_configuracion.php index f6f83f5..c620c19 100644 --- a/views/partials/sidebar_configuracion.php +++ b/views/partials/sidebar_configuracion.php @@ -48,6 +48,8 @@ if (!isset($_SESSION['usuario_id']) || $_SESSION['tipo_usuario'] !== 'importador $esVistaSeguridad = str_contains($_SERVER['REQUEST_URI'], '/seguridad'); // Detecta si estamos en alguna parte de preferencias $esVistaPreferencias = str_contains($_SERVER['REQUEST_URI'], '/preferencias'); + // Detecta si estamos en alguna parte de automatizaciones + $esVistaAutomatizaciones = str_contains($_SERVER['REQUEST_URI'], '/automatizaciones'); ?> @@ -57,10 +59,18 @@ if (!isset($_SESSION['usuario_id']) || $_SESSION['tipo_usuario'] !== 'importador - - ⚙️ Automatizaciones - + + + + ⚙️ Automatizaciones + + + + ⚙️ Automatizaciones + + @@ -69,7 +79,7 @@ if (!isset($_SESSION['usuario_id']) || $_SESSION['tipo_usuario'] !== 'importador href="" role="button" aria-expanded="true" aria-controls="submenuPreferencias" - onclick=""> + onclick=""> ✅ Preferencias 1 @@ -81,7 +91,7 @@ if (!isset($_SESSION['usuario_id']) || $_SESSION['tipo_usuario'] !== 'importador
- + ✅ Preferencias @@ -108,7 +118,7 @@ if (!isset($_SESSION['usuario_id']) || $_SESSION['tipo_usuario'] !== 'importador
- + 👮 Seguridad @@ -136,7 +146,7 @@ if (!isset($_SESSION['usuario_id']) || $_SESSION['tipo_usuario'] !== 'importador
- + @@ -150,19 +160,31 @@ if (!isset($_SESSION['usuario_id']) || $_SESSION['tipo_usuario'] !== 'importador
+
+
Menú
+ +
+ class="nav-link px-3 py-2 "> ℹ️ Información General - - ⚙️ Automatizaciones - + + + + ⚙️ Automatizaciones + + + + ⚙️ Automatizaciones + + @@ -171,7 +193,7 @@ if (!isset($_SESSION['usuario_id']) || $_SESSION['tipo_usuario'] !== 'importador href="" role="button" aria-expanded="true" aria-controls="submenuPreferencias" - onclick=""> + onclick=""> ✅ Preferencias 1 @@ -183,7 +205,7 @@ if (!isset($_SESSION['usuario_id']) || $_SESSION['tipo_usuario'] !== 'importador
- + ✅ Preferencias @@ -210,7 +232,7 @@ if (!isset($_SESSION['usuario_id']) || $_SESSION['tipo_usuario'] !== 'importador
- + 👮 Seguridad @@ -238,7 +260,7 @@ if (!isset($_SESSION['usuario_id']) || $_SESSION['tipo_usuario'] !== 'importador
- + diff --git a/views/patente/alta_patente.php b/views/patente/alta_patente.php new file mode 100644 index 0000000..ee9a44e --- /dev/null +++ b/views/patente/alta_patente.php @@ -0,0 +1,436 @@ + + + + + + + Dashboard | Importador + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/views/patente/dashboard_patente.php b/views/patente/dashboard_patente.php new file mode 100644 index 0000000..198a8a5 --- /dev/null +++ b/views/patente/dashboard_patente.php @@ -0,0 +1,69 @@ + + + + + + + Dashboard | Importador + + + + + + + +
+

📦 Panel del Importador

+ +
+
+
+
Ver patentes
+

Revisa y gestiona las patentes.

+ + Ver transportes + +
+
+ +
+
+
Nueva patente
+

Agrega nuevas patentes:

+ + Ver transportistas + +
+
+ +
+
+ + + \ No newline at end of file diff --git a/views/patente/editar.php b/views/patente/editar.php new file mode 100644 index 0000000..f23e654 --- /dev/null +++ b/views/patente/editar.php @@ -0,0 +1,459 @@ + + + + + + + Dashboard | Importador + + + + + + + + + +
+

CONFIGURACIÓN ADUANA / PATENTE

+
+ +
+ + + + + + +
+ +
+

Datos de la Patente / Aduana

+
+ +
+ +
+ +
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+


+ +
+

Capturar para el llenado de la Manifestación de Valor

+

Datos del Agente Aduanal:

+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ + +
+

Números de Validación y Folios

+ +

Números de Validación para Pedimentos

+
+
+ +
+ +
+
+ +
+ +
+
+ +
+ +
+

+ + +

Números de Validación para Pago Electrónico

+
+
+ +
+ +
+
+ +
+ +
+
+ +
+ +
+

+ + +

Números de Validación para Avisos Traslado / Plantas-Bodegas

+
+
+ +
+ +
+
+ +
+ +
+
+ +
+ +
+

+ + +

Números de Validación para Cartas Cupo

+
+
+ +
+ +
+
+ +
+ +
+
+ +
+ +
+

+ + +

Números de Validación para Avisos Electrónicos

+
+
+ +
+ +
+
+ +
+ +
+
+ +
+ +
+
+
+
+ +
+ + Cancelar +
+
+
+
+ + + + + \ No newline at end of file diff --git a/views/patente/lista.php b/views/patente/lista.php new file mode 100644 index 0000000..81685d7 --- /dev/null +++ b/views/patente/lista.php @@ -0,0 +1,120 @@ + + + + + + + Dashboard | Importador + + + + + + + + + + + +
+

📑 Registro de Patentes Aduanales

+ ➕ Nueva Patente +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
#AduanaPatenteAgente AduanalRFCCURPRazón SocialAcciones
+ ✏️ + +
+
+
+
+ + + + + \ No newline at end of file diff --git a/views/seguridad/agregar.php b/views/seguridad/agregar.php index 8715224..ab2c5ca 100644 --- a/views/seguridad/agregar.php +++ b/views/seguridad/agregar.php @@ -11,6 +11,8 @@ $dos_factores_estado = obtenerEstadoDosFactores(); + + @@ -38,10 +51,10 @@ $dos_factores_estado = obtenerEstadoDosFactores();
-
+

Autenticación de dos factores

-

Al activar esta funcionalidad, blindas el acceso a tu cuenta, recibiras un código de acceso a tu correo electrónico para confirmar identidad

+

Al activar esta funcionalidad, blindas el acceso a tu cuenta, recibiras un código de acceso a tu correo electrónico para confirmar identidad.

- +
+
+ -
+
-

Recibe Notificaciones

+

Recibe notificaciones

Agrega un correo adicional para recibir notificaciones.

-

-
-
- -
-
- -
-
+

+ +
+
+
+ +
+
+ + +
+
-
-
- -
- -
+
+
+ +
+ +
-
+
-

Correo de Respaldo

+

Correo de respaldo

Agrega un correo de respaldo para reuperación de tu cuenta.

-

-
-
- -
- -
+

+ +
+
+
+ +
+ + +
-
-
- -
- -
+
+
+ +
+ +
@@ -115,6 +144,61 @@ $dos_factores_estado = obtenerEstadoDosFactores(); chk.addEventListener('change', () => { label.textContent = chk.checked ? 'Activo' : 'Inactivo'; }); + + // Función para confirmar eliminación con SweetAlert + function confirmarEliminacion(tipo) { + const mensajes = { + 'extra': { + titulo: '¿Eliminar correo adicional?', + texto: 'No podrás recibir notificaciones en este correo.', + confirmado: 'Correo adicional eliminado', + form: 'form-eliminar-extra' + }, + 'respaldo': { + titulo: '¿Eliminar correo de respaldo?', + texto: 'No podrás recuperar tu cuenta con este correo.', + confirmado: 'Correo de respaldo eliminado', + form: 'form-eliminar-respaldo' + } + }; + + const config = mensajes[tipo]; + + swal({ + title: config.titulo, + text: config.texto, + icon: "warning", + buttons: { + cancel: { + text: "Cancelar", + visible: true, + className: "btn-secondary" + }, + confirm: { + text: "Sí, eliminar", + className: "btn-danger" + } + }, + dangerMode: true, + }) + .then((eliminar) => { + if (eliminar) { + // Mostrar mensaje de éxito y enviar formulario + swal({ + title: "¡Eliminado!", + text: config.confirmado, + icon: "success", + timer: 1500, + buttons: false + }); + + // Enviar el formulario después de un pequeño delay + setTimeout(() => { + document.getElementById(config.form).submit(); + }, 1500); + } + }); + } diff --git a/views/seguridad/dashboard_seguridad.php b/views/seguridad/dashboard_seguridad.php index bf7c4e9..6c67bc8 100644 --- a/views/seguridad/dashboard_seguridad.php +++ b/views/seguridad/dashboard_seguridad.php @@ -34,25 +34,29 @@

👮 Seguridad

-
+

Autenticación de dos factores

+

Al activar esta funcionalidad, blindas el acceso a tu cuenta, recibiras un código de acceso a tu correo electrónico para confirmar identidad.

>
-
+
+ +

Recibe notificaciones

+

Agrega un correo adicional para recibir notificaciones.

@@ -62,9 +66,10 @@
-
+

Correo de respaldo

+

Agrega un correo de respaldo para reuperación de tu cuenta.

diff --git a/views/transportistas/alta.php b/views/transportistas/alta.php index 4a109bf..999cb39 100644 --- a/views/transportistas/alta.php +++ b/views/transportistas/alta.php @@ -184,7 +184,7 @@ return; } if (!soloNumerosRegex.test(caat)) { - Swal.fire({ icon: 'error', title: 'Código CAAT inválido', text: 'El código caat solo puede contener números', confirmButtonColor: '#dc3545' }); + Swal.fire({ icon: 'error', title: 'Código CAAT inválido', text: 'El código caat solo puede contener números.', confirmButtonColor: '#dc3545' }); document.getElementById('caat').focus(); return; } diff --git a/views/transportistas/lista.php b/views/transportistas/lista.php index 982f2e1..e3662e0 100644 --- a/views/transportistas/lista.php +++ b/views/transportistas/lista.php @@ -101,7 +101,7 @@ function confirmDelete(id) { Swal.fire({ title: '¿Eliminar transportista?', - text: 'Esto sólo lo eliminara completamente y no se podrá volver a usar.', + text: 'Esto sólo lo marcara como inactivo', icon: 'warning', showCancelButton: true, confirmButtonText: 'Sí, eliminar',