From 3da996350cf714d5772d705bc5066f5d43de8dda Mon Sep 17 00:00:00 2001 From: Alexeer Date: Fri, 27 Jun 2025 07:30:16 -0600 Subject: [PATCH] Correcciones --- app/controllers/administrador.php | 315 ++++++++--------- app/controllers/configuracion.php | 73 +++- app/controllers/importadores.php | 102 ++++++ app/controllers/vinculaciones.php | 120 +------ views/admin/aprobar_usuarios.php | 12 +- views/agencias/dashboard_agencias.php | 8 +- .../configuracion/dashboard_configuracion.php | 316 ++++++++++++------ views/importadores/dashboard_importador.php | 2 +- views/partials/sidebar_importador.php | 2 +- views/vinculaciones/nueva.php | 4 +- views/vinculaciones/usuarios_vinculados.php | 4 +- 11 files changed, 574 insertions(+), 384 deletions(-) diff --git a/app/controllers/administrador.php b/app/controllers/administrador.php index 629cf58..b88f283 100644 --- a/app/controllers/administrador.php +++ b/app/controllers/administrador.php @@ -54,127 +54,171 @@ function aprobar_usuario() exit; } - // Obtener la solicitud - $sql = "SELECT * FROM solicitudes_importadores WHERE request_id = ?"; - $stmt = sqlsrv_query($conn, $sql, [$id]); - $solicitud = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC); - - if (!$solicitud) { - header("Location: /IMPORTADORES/administrador/aprobarUsuarios?error=request_not_found"); + // Verificar sesión del usuario administrador + if (!isset($_SESSION['usuario_id']) || empty($_SESSION['usuario_id'])) { + header("Location: /IMPORTADORES/administrador/aprobarUsuarios?error=session_error"); exit; } - // Validar que no haya sido aprobada ya - if ($solicitud['request_status'] === 'approved') { - header("Location: /IMPORTADORES/administrador/aprobarUsuarios?error=already_approved"); - exit; - } - - // Preparar datos - $nombre = decrypt($solicitud['company_name']); - $email = $solicitud['email']; - $tipo = 'importador'; - - // Generar contraseña aleatoria - $password_plain = bin2hex(random_bytes(5)); - $password_hash = password_hash($password_plain, PASSWORD_DEFAULT); - - // Encriptar datos sensibles - $nombre_encrypt = encrypt($nombre); - $email_encrypt = encrypt($email); - - // Insertar en usuarios_sistema - $sqlInsert = "INSERT INTO usuarios_sistema (nombre, email, password_hash, tipo_usuario, activo, creado_en, dos_factores, creado_por) - VALUES (?, ?, ?, ?, 1, GETDATE(), 0, ?)"; - $stmtInsert = sqlsrv_query($conn, $sqlInsert, [ - $nombre_encrypt, $email_encrypt, $password_hash, $tipo, $_SESSION['usuario_id'] - ]); - - if (!$stmtInsert) { - header("Location: /IMPORTADORES/administrador/aprobarUsuarios?error=save_failed"); - exit; - } - - // insertar tabla de informacion general del nuevo usario - // Obtener ID del nuevo usuario - $sqlGetId = "SELECT SCOPE_IDENTITY() AS id_usuario"; - $stmtGetId = sqlsrv_query($conn, $sqlGetId); - $idUsuarioRow = sqlsrv_fetch_array($stmtGetId, SQLSRV_FETCH_ASSOC); - $id_usuario = $idUsuarioRow['id_usuario'] ?? null; - - if (!$id_usuario) { - header("Location: /IMPORTADORES/administrador/aprobarUsuarios?error=failed"); - exit; - } - - // Insertar en informacion_general - $rfc = decrypt($solicitud['rfc']); - $telefono = $solicitud['phone']; - - $sqlInfo = "INSERT INTO informacion_general - (id_usuario, nombre, rfc, correo, telefono) - VALUES (?, ?, ?, ?, ?)"; - $stmtInfo = sqlsrv_query($conn, $sqlInfo, [ - $id_usuario, $nombre, $rfc, $email, $telefono ]); - - if (!$stmtInfo) { - header("Location: /IMPORTADORES/administrador/aprobarUsuarios?error=failed"); - exit; - } - - // Actualizar solicitud - $sqlUpdate = "UPDATE solicitudes_importadores - SET request_status = 'approved', approval_date = GETDATE(), approved_by = ? - WHERE request_id = ?"; - $stmtUpdate = sqlsrv_query($conn, $sqlUpdate, [$_SESSION['usuario_id'] ?? null, $id]); - - if (!$stmtUpdate) { - header("Location: /IMPORTADORES/administrador/aprobarUsuarios?error=update_failed"); - exit; - } - - // Enviar correo al importador - $mail = new PHPMailer(true); try { - $mail->isSMTP(); - $mail->Host = 'secure.emailsrvr.com'; - $mail->SMTPAuth = true; - $mail->Username = 'noreply@aduanasoft.com.mx'; - $mail->Password = $_ENV['SMTP_PASS']; - $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; - $mail->Port = 587; + // Iniciar transacción + sqlsrv_begin_transaction($conn); - $mail->setFrom('noreply@aduanasoft.com.mx', 'SIIH | Sistema Integral para Importadores de Hidrocarburos'); - $mail->addAddress($email); - $mail->CharSet = 'UTF-8'; - $mail->isHTML(true); - $mail->Subject = 'Tu acceso a la plataforma SIIH ha sido autorizado'; + // Obtener la solicitud + $sql = "SELECT * FROM solicitudes_importadores WHERE request_id = ?"; + $stmt = sqlsrv_query($conn, $sql, [$id]); + + if (!$stmt) { + throw new Exception("Error en consulta de solicitud: " . print_r(sqlsrv_errors(), true)); + } - $mail->Body = " -
-
-
-

¡Bienvenido a SIIH!

-
-
-

Tu registro como importador ha sido aprobado. Aquí tienes tus credenciales de acceso:

-

Correo: $email

-

Contraseña: $password_plain

-

📌 Te recomendamos cambiar tu contraseña una vez que ingreses al sistema.

-

Ir al sistema

-
-
- © " . date('Y') . " SIIH · Sistema Integral para Importadores de Hidrocarburos -
-
-
"; + $solicitud = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC); + + if (!$solicitud) { + throw new Exception("Solicitud no encontrada"); + } + + // Validar que no haya sido aprobada ya + if ($solicitud['request_status'] === 'approved') { + header("Location: /IMPORTADORES/administrador/aprobarUsuarios?error=already_approved"); + exit; + } + + // Preparar datos con validación + $nombre = !empty($solicitud['company_name']) ? decrypt($solicitud['company_name']) : null; + $email = $solicitud['email'] ?? null; + $rfc = !empty($solicitud['rfc']) ? decrypt($solicitud['rfc']) : null; + $telefono = $solicitud['phone'] ?? null; + + // Validar datos requeridos + if (empty($nombre) || empty($email) || empty($rfc)) { + throw new Exception("Datos requeridos faltantes: nombre, email o RFC"); + } + + $tipo = 'importador'; + + // Generar contraseña aleatoria + $password_plain = bin2hex(random_bytes(5)); + $password_hash = password_hash($password_plain, PASSWORD_DEFAULT); + + // Encriptar datos sensibles + $nombre_encrypt = encrypt($nombre); + $email_encrypt = encrypt($email); + + // Insertar en usuarios_sistema y obtener ID en la misma consulta + $sqlInsert = "INSERT INTO usuarios_sistema (nombre, email, password_hash, tipo_usuario, activo, creado_en, dos_factores, creado_por) + OUTPUT INSERTED.id_usuario + VALUES (?, ?, ?, ?, 1, GETDATE(), 0, ?)"; + + $stmtInsert = sqlsrv_query($conn, $sqlInsert, [ + $nombre_encrypt, $email_encrypt, $password_hash, $tipo, $_SESSION['usuario_id'] + ]); + + if (!$stmtInsert) { + throw new Exception("Error al insertar usuario: " . print_r(sqlsrv_errors(), true)); + } + + // Obtener el ID directamente del OUTPUT + $idUsuarioRow = sqlsrv_fetch_array($stmtInsert, SQLSRV_FETCH_ASSOC); + $id_usuario = $idUsuarioRow['id_usuario'] ?? null; + + if (!$id_usuario) { + throw new Exception("No se pudo obtener el ID del usuario creado. ID obtenido: " . var_export($idUsuarioRow, true)); + } + + error_log("✓ Usuario creado exitosamente con ID: " . $id_usuario); + + // Insertar en informacion_general + $sqlInfo = "INSERT INTO informacion_general + (id_usuario, nombre, rfc, correo, telefono) + VALUES (?, ?, ?, ?, ?)"; + $stmtInfo = sqlsrv_query($conn, $sqlInfo, [ + $id_usuario, $nombre, $rfc, $email, $telefono + ]); + + if (!$stmtInfo) { + throw new Exception("Error al insertar información general: " . print_r(sqlsrv_errors(), true)); + } + + // Actualizar solicitud + $sqlUpdate = "UPDATE solicitudes_importadores + SET request_status = 'approved', approval_date = GETDATE(), approved_by = ? + WHERE request_id = ?"; + $stmtUpdate = sqlsrv_query($conn, $sqlUpdate, [$_SESSION['usuario_id'], $id]); + + if (!$stmtUpdate) { + throw new Exception("Error al actualizar solicitud: " . print_r(sqlsrv_errors(), true)); + } + + // Confirmar transacción + sqlsrv_commit($conn); + + // Enviar correo al importador (fuera de la transacción) + $mail = new PHPMailer(true); + try { + $mail->isSMTP(); + $mail->Host = 'secure.emailsrvr.com'; + $mail->SMTPAuth = true; + $mail->Username = 'noreply@aduanasoft.com.mx'; + $mail->Password = $_ENV['SMTP_PASS'] ?? ''; + $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; + $mail->Port = 587; + + $mail->setFrom('noreply@aduanasoft.com.mx', 'SIIH | Sistema Integral para Importadores de Hidrocarburos'); + $mail->addAddress($email); + $mail->CharSet = 'UTF-8'; + $mail->isHTML(true); + $mail->Subject = 'Tu acceso a la plataforma SIIH ha sido autorizado'; + + $mail->Body = " +
+
+
+

¡Bienvenido a SIIH!

+
+
+

Tu registro como importador ha sido aprobado. Aquí tienes tus credenciales de acceso:

+

Correo: $email

+

Contraseña: $password_plain

+

📌 Te recomendamos cambiar tu contraseña una vez que ingreses al sistema.

+

Ir al sistema

+
+
+ © " . date('Y') . " SIIH · Sistema Integral para Importadores de Hidrocarburos +
+
+
"; + + $mail->send(); + + // Éxito completo (usuario creado, solicitud actualizada y correo enviado) + header("Location: /IMPORTADORES/administrador/aprobarUsuarios?success=approved"); + + } catch (Exception $mailException) { + // Error en el correo, pero el usuario fue creado exitosamente + error_log("Error al enviar correo de bienvenida: " . $mailException->getMessage()); + + // Redirigir con mensaje de éxito parcial + header("Location: /IMPORTADORES/administrador/aprobarUsuarios?success=approved&warning=email_failed"); + } - $mail->send(); } catch (Exception $e) { - error_log("Error al enviar correo: {$mail->ErrorInfo}"); + // Revertir transacción + sqlsrv_rollback($conn); + + // Log del error para debugging + error_log("Error al aprobar usuario: " . $e->getMessage()); + + // Redirigir con error específico basado en el tipo de error + if (strpos($e->getMessage(), 'información general') !== false) { + header("Location: /IMPORTADORES/administrador/aprobarUsuarios?error=info_general_failed"); + } elseif (strpos($e->getMessage(), 'ID del usuario') !== false) { + header("Location: /IMPORTADORES/administrador/aprobarUsuarios?error=user_id_failed"); + } else { + header("Location: /IMPORTADORES/administrador/aprobarUsuarios?error=process_failed"); + } } - header("Location: /IMPORTADORES/administrador/aprobarUsuarios?success=approved"); exit; } @@ -208,10 +252,10 @@ function guardar_usuario() $conn = getConnection(); // 1. Capturar y validar datos - $nombre = trim($_POST['nombre'] ?? ''); - $email = trim($_POST['email'] ?? ''); - $password = $_POST['password'] ?? ''; - $tipo = $_POST['tipo_usuario'] ?? ''; + $nombre = trim($_POST['nombre'] ?? ''); + $email = trim($_POST['email'] ?? ''); + $password = $_POST['password'] ?? ''; + $tipo = $_POST['tipo_usuario'] ?? ''; if (empty($nombre) || empty($email) || empty($password) || empty($tipo)) { header("Location: /IMPORTADORES/administrador/altaUsuarios?error=invalid_data"); @@ -241,7 +285,6 @@ function guardar_usuario() $sqlInsert = "INSERT INTO usuarios_sistema (nombre, email, password_hash, tipo_usuario, activo, creado_en, dos_factores, creado_por) VALUES (?, ?, ?, ?, 1, GETDATE(), 0, ?)"; $params = [$nombre_encrypted, $email_encrypted, $password_hash, $tipo, $_SESSION['usuario_id']]; - $stmtInsert = sqlsrv_query($conn, $sqlInsert, $params); if ($stmtInsert === false) { @@ -776,7 +819,6 @@ function agenciasActivas() include __DIR__ . '/../../views/admin/agencias_activas.php'; } - function suspender() { if (!($_SESSION['usuario_id'] ?? false)) { @@ -993,45 +1035,6 @@ function suspenderAgencia() exit; } - -function bitacoraLogin() -{ - if (!isset($_SESSION['usuario_id']) || $_SESSION['tipo_usuario'] !== 'super_admin') { - header('Location: /IMPORTADORES/login'); - exit; - } - - $conn = getConnection(); - $sql = "SELECT * FROM bitacora_login ORDER BY fecha DESC"; - $stmt = sqlsrv_query($conn, $sql); - - $registros = []; - while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) { - $registros[] = $row; - } - - include __DIR__ . '/../../views/admin/bitacora_login.php'; -} - -function bitacoraUsuarios() -{ - if (!isset($_SESSION['usuario_id']) || $_SESSION['tipo_usuario'] !== 'super_admin') { - header('Location: /IMPORTADORES/login'); - exit; - } - - $conn = getConnection(); - $sql = "SELECT * FROM bitacora_usuarios ORDER BY fecha DESC"; - $stmt = sqlsrv_query($conn, $sql); - - $registros = []; - while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) { - $registros[] = $row; - } - - include __DIR__ . '/../../views/admin/bitacora_usuarios.php'; -} - function configuracion() { $conn = getConnection(); diff --git a/app/controllers/configuracion.php b/app/controllers/configuracion.php index 4d284e6..e79022c 100644 --- a/app/controllers/configuracion.php +++ b/app/controllers/configuracion.php @@ -6,23 +6,82 @@ require_once __DIR__ . '/../helpers/crypto.php'; function index() { $conn = getConnection(); - $id_usuario = $_SESSION['usuario_id'] ?? null; if (!$id_usuario) { die("ID de usuario no disponible en la sesión."); } - $sql = "SELECT * FROM informacion_general WHERE id_usuario = ?"; - $params = [$id_usuario]; + // Primero obtenemos la información básica del usuario + $sql_usuario = "SELECT tipo_usuario, nombre, email FROM usuarios_sistema WHERE id_usuario = ?"; + $stmt_usuario = sqlsrv_query($conn, $sql_usuario, [$id_usuario]); - $stmt = sqlsrv_query($conn, $sql, $params); - - if ($stmt === false) { + if ($stmt_usuario === false) { die(print_r(sqlsrv_errors(), true)); } + + $usuario = sqlsrv_fetch_array($stmt_usuario, SQLSRV_FETCH_ASSOC); + + if (!$usuario) { + die("Usuario no encontrado."); + } - $datos = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC); + $datos = [ + 'tipo_usuario' => trim($usuario['tipo_usuario']), + 'nombre' => $usuario['nombre'], + 'correo' => $usuario['email'] + ]; + + // Dependiendo del tipo de usuario, obtenemos información adicional + switch (trim($usuario['tipo_usuario'])) { // Agregué trim() por si hay espacios + case 'importador': + $sql_importador = "SELECT * FROM informacion_general WHERE id_usuario = ?"; + $stmt_importador = sqlsrv_query($conn, $sql_importador, [$id_usuario]); + + if ($stmt_importador !== false) { + $info_importador = sqlsrv_fetch_array($stmt_importador, SQLSRV_FETCH_ASSOC); + if ($info_importador) { + $datos = array_merge($datos, $info_importador); + } + } + break; + + case 'admin_agencia': + case 'agente_aduanal': + $sql_agencia = " + SELECT aa.id_agencia, aa.nombre_agencia, aa.rfc_agencia, + aa.direccion AS direccion_agencia, aa.telefono AS telefono_agencia, + aa.email AS email_agencia, aga.fecha_asignacion + FROM agente_agencia aga + INNER JOIN agencias_aduanales aa ON aga.id_agencia = aa.id_agencia + WHERE aga.id_agente = ? AND aga.activo = 1 AND aa.activo = 1 + "; + + $stmt_agencia = sqlsrv_query($conn, $sql_agencia, [$id_usuario]); + + if ($stmt_agencia !== false) { + $info_agencia = sqlsrv_fetch_array($stmt_agencia, SQLSRV_FETCH_ASSOC); + if ($info_agencia) { + $datos = array_merge($datos, $info_agencia); + } + } + break; + + case 'super_admin': + // Para super_admin, solo necesitamos la información básica que ya tenemos + $datos['es_super_admin'] = true; // Flag para identificar en la vista + break; + + default: + break; + } + + // Comentar la siguiente línea para ver el debug + // exit; + + if (!isset($datos) || !is_array($datos)) { + $datos = []; + } include __DIR__ . '/../../views/configuracion/dashboard_configuracion.php'; } diff --git a/app/controllers/importadores.php b/app/controllers/importadores.php index e82198b..2a50795 100644 --- a/app/controllers/importadores.php +++ b/app/controllers/importadores.php @@ -48,6 +48,108 @@ function lista() include __DIR__ . '/../../views/locaciones/lista.php'; } + +function nuevaVinculacion() +{ + if (!isset($_SESSION['usuario_id']) || $_SESSION['tipo_usuario'] !== 'importador') { + header('Location: /IMPORTADORES/login'); + exit; + } + + $conn = getConnection(); + + $sql = " + SELECT + a.*, + s.estado AS estado_solicitud + FROM agencias_aduanales a + LEFT JOIN solicitudes_vinculacion s + ON s.id_agencia = a.id_agencia AND s.id_importador = ? + AND s.estado = 'PENDIENTE' + WHERE NOT EXISTS ( + SELECT 1 + FROM importador_agencia ia + WHERE ia.id_agencia = a.id_agencia + AND ia.id_importador = ? + AND ia.activo = 1 + ) + ORDER BY a.creado_en DESC + "; + $params = [$_SESSION['usuario_id'], $_SESSION['usuario_id']]; + $stmt = sqlsrv_query($conn, $sql, $params); + + $agencias = []; + while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) { + $agencias[] = $row; + } + + include __DIR__ . '/../../views/vinculaciones/nueva.php'; +} + +function vincular() +{ + if (!isset($_SESSION['usuario_id']) || $_SESSION['tipo_usuario'] !== 'importador') { + header('Location: /IMPORTADORES/login'); + exit; + } + + $conn = getConnection(); + + $id_importador = $_SESSION['usuario_id']; + $id_agencia = (int) $_GET['id']; + + // Verificar si ya existe una solicitud pendiente + $checkSql = "SELECT COUNT(*) AS total FROM solicitudes_vinculacion + WHERE id_importador = ? AND id_agencia = ? AND estado = 'PENDIENTE'"; + $checkParams = [$id_importador, $id_agencia]; + $checkStmt = sqlsrv_query($conn, $checkSql, $checkParams); + + if ($checkStmt && $row = sqlsrv_fetch_array($checkStmt, SQLSRV_FETCH_ASSOC)) { + if ($row['total'] > 0) { + header('Location: /IMPORTADORES/vinculaciones/nuevaVinculacion?error=pending_request'); + exit; + } + } + + // Insertar la nueva solicitud + $sql = "INSERT INTO solicitudes_vinculacion (id_importador, id_agencia, mensaje, estado, fecha_solicitud) VALUES (?, ?, 'Solicitud de vinculación', 'PENDIENTE', GETDATE())"; + $params = [$id_importador, $id_agencia]; + $stmt = sqlsrv_prepare($conn, $sql, $params); + + if ($stmt && sqlsrv_execute($stmt)) { + header('Location: /IMPORTADORES/vinculaciones/nuevaVinculacion?success=sended_request'); + exit; + } else { + header('Location: /IMPORTADORES/vinculaciones/nuevaVinculacion?error=failed_request'); + exit; + } +} + +function cancelarVinculacion() +{ + if (!isset($_SESSION['usuario_id']) || $_SESSION['tipo_usuario'] !== 'importador') { + header('Location: /IMPORTADORES/login'); + exit; + } + + $conn = getConnection(); + + $id_importador = $_SESSION['usuario_id']; + $id_agencia = (int) $_GET['id']; + + $sql = "UPDATE solicitudes_vinculacion + SET estado = 'CANCELADA', fecha_respuesta = GETDATE() + WHERE id_importador = ? AND id_agencia = ? AND estado = 'PENDIENTE'"; + + $params = [$id_importador, $id_agencia]; + $stmt = sqlsrv_prepare($conn, $sql, $params); + + if ($stmt && sqlsrv_execute($stmt)) { + header('Location: /IMPORTADORES/vinculaciones/nuevaVinculacion?success=cancelled'); + exit; + } +} + function desvincularUsuario() { if (!isset($_SESSION['usuario_id']) || $_SESSION['tipo_usuario'] !== 'importador') { diff --git a/app/controllers/vinculaciones.php b/app/controllers/vinculaciones.php index 19d5781..4741179 100644 --- a/app/controllers/vinculaciones.php +++ b/app/controllers/vinculaciones.php @@ -155,83 +155,7 @@ function vinculacionesAgencia() return $b['fecha_vinculacion'] <=> $a['fecha_vinculacion']; }); - include __DIR__ . '/../../views/vinculaciones/usuarios_vinculados.php'; -} - -function nuevaVinculacion() -{ - if (!isset($_SESSION['usuario_id']) || $_SESSION['tipo_usuario'] !== 'importador') { - header('Location: /IMPORTADORES/login'); - exit; - } - - $conn = getConnection(); - - $sql = " - SELECT - a.*, - s.estado AS estado_solicitud - FROM agencias_aduanales a - LEFT JOIN solicitudes_vinculacion s - ON s.id_agencia = a.id_agencia AND s.id_importador = ? - AND s.estado = 'PENDIENTE' - WHERE NOT EXISTS ( - SELECT 1 - FROM importador_agencia ia - WHERE ia.id_agencia = a.id_agencia - AND ia.id_importador = ? - AND ia.activo = 1 - ) - ORDER BY a.creado_en DESC - "; - $params = [$_SESSION['usuario_id'], $_SESSION['usuario_id']]; - $stmt = sqlsrv_query($conn, $sql, $params); - - $agencias = []; - while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) { - $agencias[] = $row; - } - - include __DIR__ . '/../../views/vinculaciones/nueva.php'; -} - -function vincular() -{ - if (!isset($_SESSION['usuario_id']) || $_SESSION['tipo_usuario'] !== 'importador') { - header('Location: /IMPORTADORES/login'); - exit; - } - - $conn = getConnection(); - - $id_importador = $_SESSION['usuario_id']; - $id_agencia = (int) $_GET['id']; - - // Verificar si ya existe una solicitud pendiente - $checkSql = "SELECT COUNT(*) AS total FROM solicitudes_vinculacion - WHERE id_importador = ? AND id_agencia = ? AND estado = 'PENDIENTE'"; - $checkParams = [$id_importador, $id_agencia]; - $checkStmt = sqlsrv_query($conn, $checkSql, $checkParams); - - if ($checkStmt && $row = sqlsrv_fetch_array($checkStmt, SQLSRV_FETCH_ASSOC)) { - if ($row['total'] > 0) { - header('Location: /IMPORTADORES/vinculaciones/nuevaVinculacion?error=pending_request'); - exit; - } - } - - // Insertar la nueva solicitud - $sql = "INSERT INTO solicitudes_vinculacion (id_importador, id_agencia, mensaje, estado, fecha_solicitud) VALUES (?, ?, 'Solicitud de vinculación', 'PENDIENTE', GETDATE())"; - $params = [$id_importador, $id_agencia]; - $stmt = sqlsrv_prepare($conn, $sql, $params); - - if ($stmt && sqlsrv_execute($stmt)) { - header('Location: /IMPORTADORES/vinculaciones/nuevaVinculacion?success=sended_request'); - exit; - } else { - header('Location: /IMPORTADORES/vinculaciones/nuevaVinculacion?error=failed_request'); - exit; - } + include __DIR__ . '/../../views/vinculaciones/usuarios_vinculados.php'; } function desvincularAgencia() @@ -240,20 +164,20 @@ function desvincularAgencia() if (!isset($_SESSION['usuario_id']) || $_SESSION['tipo_usuario'] !== 'admin_agencia') { header('Location: /IMPORTADORES/login'); exit; - } + } // Verificar que se recibió el ID de la relación $id_relacion = $_GET['id'] ?? null; $tipo = $_GET['tipo'] ?? null; if (!$id_relacion || !is_numeric($id_relacion)) { - header('Location: /IMPORTADORES/vinculaciones/usuariosVinculados?error=invalid_id'); + header('Location: /IMPORTADORES/vinculaciones/vinculacionesAgencia?error=invalid_id'); exit; } // Validar que el tipo sea válido if (!in_array($tipo, ['importador', 'agente'])) { - header('Location: /IMPORTADORES/vinculaciones/usuariosVinculados?error=invalid_type'); + header('Location: /IMPORTADORES/vinculaciones/vinculacionesAgencia?error=invalid_type'); exit; } @@ -278,7 +202,7 @@ function desvincularAgencia() WHERE ia.id_relacion = ? AND aa.id_administrador = ? AND u.tipo_usuario = 'importador' "; $stmtVerificar = sqlsrv_query($conn, $sqlVerificar, [$id_relacion, $_SESSION['usuario_id']]); - $relacion = sqlsrv_fetch_array($stmtVerificar, SQLSRV_FETCH_ASSOC); + $relacion = sqlsrv_fetch_array($stmtVerificar, SQLSRV_FETCH_ASSOC); if (!$relacion) { throw new Exception('Relación de importador no encontrada o no tienes permisos para desvincularla'); @@ -311,7 +235,7 @@ function desvincularAgencia() WHERE aa.id_relacion = ? AND ag.id_administrador = ? AND u.tipo_usuario = 'agente_aduanal' "; $stmtVerificar = sqlsrv_query($conn, $sqlVerificar, [$id_relacion, $_SESSION['usuario_id']]); - $relacion = sqlsrv_fetch_array($stmtVerificar, SQLSRV_FETCH_ASSOC); + $relacion = sqlsrv_fetch_array($stmtVerificar, SQLSRV_FETCH_ASSOC); if (!$relacion) { throw new Exception('Relación de agente no encontrada o no tienes permisos para desvincularla'); @@ -324,8 +248,7 @@ function desvincularAgencia() // Desactivar la relación de agente $sqlDesactivar = " UPDATE agente_agencia - SET activo = 0, - fecha_desvinculacion = GETDATE() + SET activo = 0 WHERE id_relacion = ? "; } @@ -339,42 +262,17 @@ function desvincularAgencia() // Confirmar transacción sqlsrv_commit($conn); - header('Location: /IMPORTADORES/vinculaciones/usuariosVinculados?success=unlinked&tipo=' . $tipo); + header('Location: /IMPORTADORES/vinculaciones/vinculacionesAgencia?success=unlinked&tipo=' . $tipo); exit; } catch (Exception $e) { // Revertir transacción en caso de error sqlsrv_rollback($conn); - header('Location: /IMPORTADORES/vinculaciones/usuariosVinculados?error=unlinked_failed&message=' . urlencode($e->getMessage())); + header('Location: /IMPORTADORES/vinculaciones/vinculacionesAgencia?error=unlinked_failed&message=' . urlencode($e->getMessage())); exit; } } -function cancelar() -{ - if (!isset($_SESSION['usuario_id']) || $_SESSION['tipo_usuario'] !== 'importador') { - header('Location: /IMPORTADORES/login'); - exit; - } - - $conn = getConnection(); - - $id_importador = $_SESSION['usuario_id']; - $id_agencia = (int) $_GET['id']; - - $sql = "UPDATE solicitudes_vinculacion - SET estado = 'CANCELADA', fecha_respuesta = GETDATE() - WHERE id_importador = ? AND id_agencia = ? AND estado = 'PENDIENTE'"; - - $params = [$id_importador, $id_agencia]; - $stmt = sqlsrv_prepare($conn, $sql, $params); - - if ($stmt && sqlsrv_execute($stmt)) { - header('Location: /IMPORTADORES/vinculaciones/nuevaVinculacion?success=cancelled'); - exit; - } -} - function solicitudesVinculacion() { if (!($_SESSION['usuario_id'] ?? false) || $_SESSION['tipo_usuario'] !== 'admin_agencia') { diff --git a/views/admin/aprobar_usuarios.php b/views/admin/aprobar_usuarios.php index bec92d3..c2e7ffe 100644 --- a/views/admin/aprobar_usuarios.php +++ b/views/admin/aprobar_usuarios.php @@ -118,12 +118,20 @@ Swal.fire({ icon: 'error', title: 'Error al actualizar', text: 'No se pudo actualizar el estado del usuario.', confirmButtonColor: '#dc3545' }); - Swal.fire({ icon: 'error', title: 'Error inesperado', text: 'Ha ocurrido un error inesperado. Por favor, inténtalo nuevamente.', confirmButtonColor: '#dc3545' }) + Swal.fire({ icon: 'error', title: 'Error inesperado', text: 'Ha ocurrido un error inesperado. Por favor, inténtalo nuevamente.', confirmButtonColor: '#dc3545' }); + + Swal.fire({ icon: 'error', title: 'Error de sesión', text: 'Tu sesión ha expirado. Por favor, inicia sesión nuevamente.', confirmButtonColor: '#dc3545' }); + + Swal.fire({ icon: 'error', title: 'Error en información general', text: 'Se creó el usuario pero falló al guardar la información adicional. Revisa los datos del formulario.', confirmButtonColor: '#dc3545' }); + + Swal.fire({ icon: 'error', title: 'Error interno', text: 'No se pudo obtener el ID del usuario creado. Contacta al soporte técnico.', confirmButtonColor: '#dc3545' }); + + Swal.fire({ icon: 'error', title: 'Error en el proceso', text: 'Ocurrió un error durante el proceso de aprobación. Verifica los logs del sistema.', confirmButtonColor: '#dc3545' }); Swal.fire({ icon: 'error', title: 'Error', text: 'Ha ocurrido un error inesperado. Por favor, inténtalo nuevamente.', confirmButtonColor: '#dc3545' }); - + \ No newline at end of file diff --git a/views/agencias/dashboard_agencias.php b/views/agencias/dashboard_agencias.php index 5cb68a3..5728102 100644 --- a/views/agencias/dashboard_agencias.php +++ b/views/agencias/dashboard_agencias.php @@ -42,8 +42,8 @@
Solicitudes de vinculación

Aprueba las solicitudes de vinculación de los importadores.

- + Ver solicitudes
@@ -53,8 +53,8 @@
Usuarios vinculados

Consulta los que ya fueron autorizados.

- + Ver usuarios
diff --git a/views/configuracion/dashboard_configuracion.php b/views/configuracion/dashboard_configuracion.php index a72de6e..6970c4e 100644 --- a/views/configuracion/dashboard_configuracion.php +++ b/views/configuracion/dashboard_configuracion.php @@ -27,136 +27,258 @@ } .card { border-radius: 12px; } label {font-weight: bold;} + .section-header { background-color: #e9ecef; padding: 10px 15px; margin: 0 0 20px 0; border-radius: 8px 8px 0 0; font-weight: bold; color: #495057; }

ℹ️ Información General

-
-
-
- -
- -
- -
- -
- -
-
+ +
+
👤 Información Personal
+
- -
- + +
+ +
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
🏢 Información de Agencia Aduanal
+
+
+ +
+
-
- -
-
- -
- -
-
-
- -
- -
-
- -
- -
- -
-
- -
- -
-
- -
- -
- -
-
- -
- -
-
- -
- -
- -
-
- -
- -
-
- -
- -
- -
-
- -
- +
-
- -
-
-
- + +
+
+ +
+ +
+
+ +
+ +
+ +
+

+ + +
👤 Mi Información Personal
+
+ +
+ +
+
+ +
+ +
+ +
+
+ + +
+ +
+ setTimezone(new DateTimeZone('America/Mexico_City'))->format('d/m/Y H:i'); + } else { + $fecha_formateada = date('d/m/Y H:i', strtotime($datos['fecha_asignacion'])); + } + ?> + +
+
+ +
+
+ +
+
🔧 Información de Super Administrador
+
+
+ +
+ + +
+ +
+
+
+
- +
- +
- -
- -
+ +
+ +
+
⚠️ Información no disponible
+

No se pudo cargar la información para el tipo de usuario: + +

+

+ Tipos de usuario válidos: admin_agencia, agente_aduanal, super_admin, importador
+ + Datos disponibles: + + +

+
+ diff --git a/views/importadores/dashboard_importador.php b/views/importadores/dashboard_importador.php index 21c072b..da53d5f 100644 --- a/views/importadores/dashboard_importador.php +++ b/views/importadores/dashboard_importador.php @@ -113,7 +113,7 @@
Vinculaciones

Visualiza o establece nuevas vinculaciones con agencias aduanales.

- Ver vinculaciones diff --git a/views/partials/sidebar_importador.php b/views/partials/sidebar_importador.php index 01839a2..0e91e76 100644 --- a/views/partials/sidebar_importador.php +++ b/views/partials/sidebar_importador.php @@ -59,7 +59,7 @@ class="nav-link px-3 py-2 "> • Mis vinculaciones - • Nueva vinculación diff --git a/views/vinculaciones/nueva.php b/views/vinculaciones/nueva.php index 92bbda1..b467e4c 100644 --- a/views/vinculaciones/nueva.php +++ b/views/vinculaciones/nueva.php @@ -68,9 +68,9 @@ format('Y-m-d H:i') : '' ?> - Cancelar solicitud + Cancelar solicitud - Vincular + Vincular diff --git a/views/vinculaciones/usuarios_vinculados.php b/views/vinculaciones/usuarios_vinculados.php index 6a89547..b1ed469 100644 --- a/views/vinculaciones/usuarios_vinculados.php +++ b/views/vinculaciones/usuarios_vinculados.php @@ -65,9 +65,7 @@ format('Y-m-d H:i') : '' ?> - + Desvincular