diff --git a/app/controllers/agentes.php b/app/controllers/agentes.php
index b63ee69..d509fb1 100644
--- a/app/controllers/agentes.php
+++ b/app/controllers/agentes.php
@@ -13,7 +13,8 @@ use PHPMailer\PHPMailer\Exception;
loadEnv();
-function dashboard() {
+function dashboard()
+{
if (!isset($_SESSION['usuario_id']) || $_SESSION['tipo_usuario'] !== 'agente_aduanal') {
header("Location: /IMPORTADORES/login");
exit;
@@ -28,7 +29,8 @@ function dashboard() {
include __DIR__ . '/../../views/agentes/dashboard.php';
}
-function importadores_activos() {
+function importadores_activos()
+{
if (!($_SESSION['usuario_id'] ?? false) || $_SESSION['tipo_usuario'] !== 'agente_aduanal') {
header('Location: /IMPORTADORES/login');
exit;
@@ -175,8 +177,8 @@ function aprobar_solicitud()
exit;
}
-function activos() {
-
+function activos()
+{
if (!($_SESSION['usuario_id'] ?? false)) {
die("⚠️ No autorizado.");
}
@@ -203,9 +205,8 @@ function activos() {
include __DIR__ . '/../../views/agentes/importadores_activos.php';
}
-function toggle_estado() {
-
-
+function toggle_estado()
+{
if (!($_SESSION['usuario_id'] ?? false) || $_SESSION['tipo_usuario'] !== 'agente_aduanal') {
die("⚠️ No autorizado.");
}
@@ -240,4 +241,33 @@ function toggle_estado() {
header("Location: /IMPORTADORES/agentes/activos");
exit;
+}
+
+function bitacora()
+{
+ $conn = getConnection();
+ if (!($_SESSION['usuario_id'] ?? false)) {
+ header('Location: /IMPORTADORES/login');
+ exit;
+ }
+
+ $sql = "
+ SELECT u.id_usuario, u.nombre, b.email, b.ip, b.fecha, b.exito, b.detalle
+ FROM dbo.bitacora_login b
+ JOIN dbo.usuarios_sistema u ON u.id_usuario = b.id_usuario
+ ORDER BY b.fecha DESC
+ ";
+
+ $stmt = sqlsrv_query($conn, $sql);
+ if ($stmt === false) {
+ die("Error en bitacora(): " . print_r(sqlsrv_errors(), true));
+ }
+
+ $bitacoras = [];
+ while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
+ $row['nombre'] = decrypt($row['nombre']); // Desencripta aquí
+ $bitacoras[] = $row;
+ }
+
+ include __DIR__ . '/../../views/agentes/bitacora.php';
}
\ No newline at end of file
diff --git a/app/controllers/configuracion.php b/app/controllers/configuracion.php
index 08d7928..07224a7 100644
--- a/app/controllers/configuracion.php
+++ b/app/controllers/configuracion.php
@@ -62,7 +62,7 @@ function guardar()
// Captura los datos del formulario
$campos = [
'clave', 'tipo_identificador', 'curp', 'calle', 'num_exterior', 'num_interior',
- 'ciudad', 'colonia', 'pais', 'codigo_postal', 'municipio', 'estado', 'fax', 'observaciones'
+ 'ciudad', 'colonia', 'pais', 'codigo_postal', 'municipio', 'estado', 'telefono', 'fax', 'observaciones'
];
$sql_parts = [];
@@ -75,23 +75,95 @@ function guardar()
}
}
- // Si no hay datos que actualizar
if (empty($sql_parts)) {
header("Location: /IMPORTADORES/configuracion");
exit;
}
- $sql = "UPDATE informacion_general SET " . implode(", ", $sql_parts) . " WHERE id_usuario = ?";
- $params[] = $id_usuario;
+ // Iniciar transacción para asegurar consistencia
+ sqlsrv_begin_transaction($conn);
- $stmt = sqlsrv_query($conn, $sql, $params);
+ try {
+ // 1. Actualiza la tabla informacion_general
+ $sql = "UPDATE informacion_general SET " . implode(", ", $sql_parts) . " WHERE id_usuario = ?";
+ $params[] = $id_usuario;
- if ($stmt === false) {
- die(print_r(sqlsrv_errors(), true));
+ $stmt = sqlsrv_query($conn, $sql, $params);
+ if ($stmt === false) {
+ throw new Exception(print_r(sqlsrv_errors(), true));
+ }
+
+ // 2. Actualiza el teléfono en solicitudes_importadores usando company_name encriptado
+ if (isset($_POST['telefono']) && $_POST['telefono'] !== '') {
+ $telefono = $_POST['telefono'];
+
+ // Primero obtenemos el nombre de la empresa de informacion_general
+ $sql_get_name = "SELECT nombre FROM informacion_general WHERE id_usuario = ?";
+ $params_get_name = [$id_usuario];
+ $stmt_get_name = sqlsrv_query($conn, $sql_get_name, $params_get_name);
+
+ if ($stmt_get_name === false) {
+ throw new Exception("Error al obtener nombre de empresa: " . print_r(sqlsrv_errors(), true));
+ }
+
+ $empresa_data = sqlsrv_fetch_array($stmt_get_name, SQLSRV_FETCH_ASSOC);
+
+ if ($empresa_data && !empty($empresa_data['nombre'])) {
+ $nombre_empresa = $empresa_data['nombre'];
+
+ // Encriptar el nombre de la empresa para comparar
+ $nombre_encriptado = encrypt($nombre_empresa);
+
+ // Actualizar solicitudes_importadores usando el company_name encriptado
+ $sql_solicitud = "UPDATE solicitudes_importadores SET phone = ? WHERE company_name = ?";
+ $params_solicitud = [$telefono, $nombre_encriptado];
+
+ $stmt_solicitud = sqlsrv_query($conn, $sql_solicitud, $params_solicitud);
+
+ if ($stmt_solicitud === false) {
+ throw new Exception("Error al actualizar teléfono en solicitudes: " . print_r(sqlsrv_errors(), true));
+ }
+
+ // Verificar si se actualizó algún registro
+ $rows_affected = sqlsrv_rows_affected($stmt_solicitud);
+ if ($rows_affected === false || $rows_affected == 0) {
+ // Log para debugging
+ error_log("No se encontró registro en solicitudes_importadores para actualizar teléfono. Empresa: " . $nombre_empresa);
+
+ // Opcional: Buscar por RFC como fallback
+ $sql_rfc = "SELECT rfc FROM informacion_general WHERE id_usuario = ?";
+ $stmt_rfc = sqlsrv_query($conn, $sql_rfc, [$id_usuario]);
+
+ if ($stmt_rfc) {
+ $rfc_data = sqlsrv_fetch_array($stmt_rfc, SQLSRV_FETCH_ASSOC);
+ if ($rfc_data && !empty($rfc_data['rfc'])) {
+ $sql_solicitud_rfc = "UPDATE solicitudes_importadores SET phone = ? WHERE rfc = ?";
+ $params_solicitud_rfc = [$telefono, $rfc_data['rfc']];
+
+ $stmt_solicitud_rfc = sqlsrv_query($conn, $sql_solicitud_rfc, $params_solicitud_rfc);
+
+ if ($stmt_solicitud_rfc === false) {
+ error_log("Error al actualizar por RFC: " . print_r(sqlsrv_errors(), true));
+ }
+ }
+ }
+ }
+ } else {
+ error_log("No se pudo obtener el nombre de la empresa para el usuario: " . $id_usuario);
+ }
+ }
+
+ // Confirmar transacción
+ sqlsrv_commit($conn);
+
+ header("Location: /IMPORTADORES/configuracion/index");
+ exit;
+
+ } catch (Exception $e) {
+ // Revertir transacción en caso de error
+ sqlsrv_rollback($conn);
+ die("Error al actualizar datos: " . $e->getMessage());
}
-
- header("Location: /IMPORTADORES/configuracion/index");
- exit;
}
function automatizaciones()
diff --git a/app/controllers/seguridad.php b/app/controllers/seguridad.php
index 937b24e..6da955a 100644
--- a/app/controllers/seguridad.php
+++ b/app/controllers/seguridad.php
@@ -24,6 +24,17 @@ function index()
function opciones()
{
+ $conn = getConnection();
+ $id_usuario = $_SESSION['usuario_id'] ?? null;
+
+ // Asegúrate de que el usuario está autenticado
+ if (!$id_usuario) {
+ die("Usuario no autenticado.");
+ }
+
+ // Obtener correos
+ $correos = obtenerCorreos($conn, $id_usuario);
+
include __DIR__ . '/../../views/seguridad/agregar.php';
}
@@ -145,6 +156,35 @@ function correoExtra()
}
}
+function modificarCorreoExtra()
+{
+ 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();
+
+ $correo = $_POST['email-extra'] ?? '';
+
+ if (!filter_var($correo, FILTER_VALIDATE_EMAIL)) {
+ echo "Correo inválido.";
+ return;
+ }
+
+ $query = "UPDATE correo_extra SET correo = ? WHERE id_usuario = ?";
+ $stmt = sqlsrv_prepare($conn, $query, [$correo, $id_usuario]);
+
+ if ($stmt && sqlsrv_execute($stmt)) {
+ $_SESSION['config_success'] = 'Correo adicional actualizado correctamente.';
+ header('Location: /IMPORTADORES/seguridad/index');
+ exit;
+ } else {
+ echo "Error al actualizar el correo extra.";
+ }
+}
+
function correoRespaldo()
{
// CORRIGIDO: Cambiar id_usuario por usuario_id y verificar confirmación
@@ -184,6 +224,35 @@ function correoRespaldo()
}
}
+function modificarCorreoRspaldo()
+{
+ 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();
+
+ $correo = $_POST['email-respaldo'] ?? '';
+
+ if (!filter_var($correo, FILTER_VALIDATE_EMAIL)) {
+ echo "Correo inválido.";
+ return;
+ }
+
+ $query = "UPDATE correo_respaldo SET correo = ? WHERE id_usuario = ?";
+ $stmt = sqlsrv_prepare($conn, $query, [$correo, $id_usuario]);
+
+ if ($stmt && sqlsrv_execute($stmt)) {
+ $_SESSION['config_success'] = 'Correo de respaldo actualizado correctamente.';
+ header('Location: /IMPORTADORES/seguridad/index');
+ exit;
+ } else {
+ echo "Error al actualizar el correo de respaldo.";
+ }
+}
+
function obtenerCorreos($conn, $id_usuario)
{
$correos = [
diff --git a/app/controllers/solicitud_importacion.php b/app/controllers/solicitud_importacion.php
index 04bccd7..048c8e0 100644
--- a/app/controllers/solicitud_importacion.php
+++ b/app/controllers/solicitud_importacion.php
@@ -77,14 +77,17 @@ function lista() {
f.*,
tr.nombre AS transportista,
(c.nombre + ' ' + c.apellido) AS chofer,
+ p.nombre AS nombre_pais_proveedor,
f.foto_solicitud_url
FROM dbo.solicitud_importacion_factura f
JOIN dbo.transportistas tr
- ON f.transportista_id = tr.id_transportista
+ ON f.transportista_id = tr.id_transportista
LEFT JOIN dbo.choferes c
- ON f.chofer_id = c.id_chofer
+ ON f.chofer_id = c.id_chofer
+ LEFT JOIN dbo.paises p
+ ON f.pais_proveedor = p.id_pais
WHERE f.id_importador = ?
- AND f.status >= 1
+ AND f.status >= 1
ORDER BY f.created_at DESC
";
$stmt = sqlsrv_query($conn, $sql, [$id_importador]);
@@ -104,7 +107,8 @@ function lista() {
}
/** Formulario de nueva factura **/
-function crear() {
+function crear()
+{
if (!($_SESSION['usuario_id'] ?? false)) {
header('Location: /IMPORTADORES/login');
exit;
@@ -114,7 +118,7 @@ function crear() {
// Carga de datos para selects
$transportistas = [];
- $stmtT = sqlsrv_query($conn, "SELECT id_transportista,nombre FROM dbo.transportistas WHERE id_usuario=? AND activo=1 ORDER BY nombre",[$id_importador]);
+ $stmtT = sqlsrv_query($conn, "SELECT id_transportista, clave_identificador, nombre FROM dbo.transportistas WHERE id_usuario=? AND activo=1 ORDER BY nombre",[$id_importador]);
while ($r = sqlsrv_fetch_array($stmtT, SQLSRV_FETCH_ASSOC)) { $transportistas[] = $r; }
$choferes = [];
@@ -122,15 +126,15 @@ function crear() {
while ($r = sqlsrv_fetch_array($stmtC, SQLSRV_FETCH_ASSOC)) { $choferes[] = $r; }
$paises = [];
- $stmtP = sqlsrv_query($conn, "SELECT id_pais,nombre FROM dbo.paises ORDER BY nombre");
+ $stmtP = sqlsrv_query($conn, "SELECT id_pais, nombre FROM dbo.paises ORDER BY nombre");
while ($r = sqlsrv_fetch_array($stmtP, SQLSRV_FETCH_ASSOC)) { $paises[] = $r; }
$aduanas = [];
- $stmtA = sqlsrv_query($conn, "SELECT aduana_seccion,nombre FROM dbo.aduanas ORDER BY aduana_seccion");
+ $stmtA = sqlsrv_query($conn, "SELECT DISTINCT RIGHT(REPLICATE('0', 3) + CAST(aduana_seccion AS VARCHAR), 3) AS aduana_seccion, nombre FROM dbo.aduanas ORDER BY aduana_seccion");
while ($r = sqlsrv_fetch_array($stmtA, SQLSRV_FETCH_ASSOC)) { $aduanas[] = $r; }
$incoterms = [];
- $stmtI = sqlsrv_query($conn, "SELECT INCOTERM,DESCESPANOL FROM dbo.gIncoterms ORDER BY INCOTERM");
+ $stmtI = sqlsrv_query($conn, "SELECT INCOTERM, DESCESPANOL FROM dbo.gIncoterms ORDER BY INCOTERM");
while ($r = sqlsrv_fetch_array($stmtI, SQLSRV_FETCH_ASSOC)) { $incoterms[] = $r; }
$unidades_medida = [];
@@ -143,7 +147,8 @@ function crear() {
}
/** Procesa la creación de una nueva factura y sus partidas **/
-function guardar() {
+function guardar()
+{
if (!($_SESSION['usuario_id'] ?? false)) {
die("⚠️ No autorizado.");
}
diff --git a/app/controllers/transportes.php b/app/controllers/transportes.php
index 6741a92..d2216b8 100644
--- a/app/controllers/transportes.php
+++ b/app/controllers/transportes.php
@@ -2,9 +2,7 @@
session_start();
require_once __DIR__ . '/../../config/database.php';
-/**
- * Listado de transportes (sólo activos) para el importador logueado
- */
+/** Listado de transportes (sólo activos) para el importador logueado **/
function lista() {
if (!($_SESSION['usuario_id'] ?? false)) {
header('Location: /IMPORTADORES/login');
@@ -31,9 +29,7 @@ function lista() {
include __DIR__ . '/../../views/transportes/lista.php';
}
-/**
- * Formulario de alta de transporte
- */
+/** Formulario de alta de transporte **/
function crear() {
if (!($_SESSION['usuario_id'] ?? false)) {
header('Location: /IMPORTADORES/login');
@@ -44,7 +40,7 @@ function crear() {
// Traer transportistas propios para el select
$sql = "
- SELECT id_transportista, nombre
+ SELECT id_transportista, clave_identificador, nombre
FROM dbo.transportistas
WHERE id_usuario = ? AND activo = 1
ORDER BY nombre
@@ -58,9 +54,7 @@ function crear() {
include __DIR__ . '/../../views/transportes/crear.php';
}
-/**
- * Procesa la creación de un nuevo transporte
- */
+/** Procesa la creación de un nuevo transporte **/
function guardar() {
if (!($_SESSION['usuario_id'] ?? false)) {
@@ -101,9 +95,7 @@ function guardar() {
exit;
}
-/**
- * Formulario de edición
- */
+/** Formulario de edición **/
function editar() {
if (!($_SESSION['usuario_id'] ?? false)) {
@@ -143,9 +135,7 @@ function editar() {
include __DIR__ . '/../../views/transportes/editar.php';
}
-/**
- * Procesa la actualización
- */
+/** Procesa la actualización **/
function actualizar() {
if (!($_SESSION['usuario_id'] ?? false)) {
die("⚠️ No autorizado.");
@@ -206,11 +196,7 @@ function actualizar() {
exit;
}
-
-
-/**
- * “Soft-delete” (status = 0)
- */
+/** “Soft-delete” (status = 0) **/
function eliminar() {
if (!($_SESSION['usuario_id'] ?? false)) {
@@ -232,9 +218,7 @@ function eliminar() {
}
-/**
- * Formulario de importación masiva
- */
+/** Formulario de importación masiva **/
function masivo() {
if (!($_SESSION['usuario_id'] ?? false)) {
header('Location: /IMPORTADORES/login');
@@ -243,9 +227,7 @@ function masivo() {
include __DIR__ . '/../../views/transportes/importar_masivo.php';
}
-/**
- * Procesa la importación masiva desde CSV
- */
+/** Procesa la importación masiva desde CSV **/
function importarGuardar() {
if (!($_SESSION['usuario_id'] ?? false)) {
die("⚠️ No autorizado.");
@@ -316,4 +298,4 @@ function importarGuardar() {
];
header('Location: /IMPORTADORES/transportes/masivo');
exit;
-}
+}
\ No newline at end of file
diff --git a/app/controllers/transportistas.php b/app/controllers/transportistas.php
index f66b9d8..2001c08 100644
--- a/app/controllers/transportistas.php
+++ b/app/controllers/transportistas.php
@@ -460,7 +460,6 @@ function actualizar() {
exit;
}
-
function eliminar() {
session_start();
if (!($_SESSION['usuario_id'] ?? false)) {
diff --git a/views/agentes/bitacora.php b/views/agentes/bitacora.php
new file mode 100644
index 0000000..2b22ef8
--- /dev/null
+++ b/views/agentes/bitacora.php
@@ -0,0 +1,132 @@
+
+
+
+
+
+ Dashboard | Agente Aduanal
+
+
+
+
+
+
+
+
+
+
+
+
+
👥 Acceso de Usuarios
+
+
+
+
+
+
+ | ID |
+ Nombre |
+ Correo |
+ IP |
+ Fecha |
+ Estatus |
+ Detalles |
+
+
+
+
+
+ | = htmlspecialchars($b['id_usuario']) ?> |
+ = htmlspecialchars($b['nombre']) ?> |
+ = htmlspecialchars($b['email']) ?> |
+ = htmlspecialchars($b['ip']) ?> |
+ = $b['fecha']->format('Y-m-d H:i:s') ?> |
+
+ = $b['exito'] == 1 ? 'Éxito' : 'Fallido' ?>
+ |
+ = htmlspecialchars($b['detalle']) ?> |
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/views/agentes/dashboard.php b/views/agentes/dashboard.php
index 5da4940..1d9d44f 100644
--- a/views/agentes/dashboard.php
+++ b/views/agentes/dashboard.php
@@ -1,3 +1,7 @@
+
@@ -47,40 +51,36 @@
-
-
-
-
Panel principal del agente
+
+
+
Panel principal del agente
-
-
-
-
Importadores activos
-
Consulta los que ya fueron autorizados.
-
Ver importadores
+
+
+
+
Importadores activos
+
Consulta los que ya fueron autorizados.
+
Ver importadores
+
-
-
-
-
Solicitudes pendientes
-
Valida nuevas solicitudes de registro.
-
Ver solicitudes
+
+
+
Solicitudes pendientes
+
Valida nuevas solicitudes de registro.
+
Ver solicitudes
+
-
-
-
-
Bitácora del sistema
-
Revisa los accesos y acciones recientes.
-
Ver bitácora
+
+
+
Bitácora del sistema
+
Revisa los accesos y acciones recientes.
+
Ver bitácora
+
-