From 1900091b99229c0c117d86355dab5004e52658e8 Mon Sep 17 00:00:00 2001 From: Alexeer Date: Thu, 17 Jul 2025 13:31:55 -0600 Subject: [PATCH] Sidebars --- app/controllers/administrador.php | 265 +++++ app/controllers/importadores.php | 15 +- views/admin/agencias_activas.php | 17 +- views/admin/alta_usuarios.php | 20 +- views/admin/aprobar_agencias.php | 41 +- views/admin/aprobar_usuarios.php | 41 +- views/admin/usuarios_inactivos.php | 34 +- views/partials/sidebar_administrador.php | 446 ++++--- views/partials/sidebar_agencia.php | 531 +++++---- views/partials/sidebar_agente.php | 469 +++++--- views/partials/sidebar_configuracion.php | 584 +++++----- views/partials/sidebar_importador.php | 1022 ++++++++++------- .../vinculaciones/importadores_vinculados.php | 17 +- views/vinculaciones/usuarios_vinculados.php | 23 +- .../vinculaciones_importador.php | 17 +- 15 files changed, 2250 insertions(+), 1292 deletions(-) diff --git a/app/controllers/administrador.php b/app/controllers/administrador.php index ee0f5e8..1bbdc79 100644 --- a/app/controllers/administrador.php +++ b/app/controllers/administrador.php @@ -237,6 +237,154 @@ function aprobar_usuario() exit; } +function denegar_usuario() +{ + $conn = getConnection(); + + $id = $_GET['id'] ?? null; + $motivo = trim($_POST['motivo'] ?? ''); + + // Definir motivo por defecto si no se ingresó uno + if ($motivo === '') { + $motivo = 'La solicitud ha sido rechazada por no cumplir con los requisitos establecidos.'; + } + + // Validar parámetros + if (!$id || !is_numeric($id)) { + header("Location: /IMPORTADORES/administrador/aprobarUsuarios?error=invalid_id"); + exit; + } + + if (!$motivo || trim($motivo) === '') { + header("Location: /IMPORTADORES/administrador/aprobarUsuarios?error=motivo_required"); + exit; + } + + // Verificar sesión del usuario administrador + if (!isset($_SESSION['usuario_id']) || empty($_SESSION['usuario_id'])) { + header("Location: /IMPORTADORES/administrador/aprobarUsuarios?error=session_error"); + exit; + } + + try { + // 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)); + } + + $solicitud = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC); + + if (!$solicitud) { + throw new Exception("Solicitud no encontrada"); + } + + // Validar que no haya sido procesada ya + if ($solicitud['request_status'] === 'denied') { + header("Location: /IMPORTADORES/administrador/aprobarUsuarios?error=already_denied"); + exit; + } + + if ($solicitud['request_status'] === 'approved') { + header("Location: /IMPORTADORES/administrador/aprobarUsuarios?error=already_approved"); + exit; + } + + // Preparar datos para el correo + $nombre = !empty($solicitud['company_name']) ? decrypt($solicitud['company_name']) : 'Usuario'; + $email = $solicitud['email'] ?? null; + + if (empty($email)) { + throw new Exception("Email no disponible en la solicitud"); + } + + // Actualizar solicitud como denegada + $sqlUpdate = "UPDATE solicitudes_importadores + SET request_status = 'denied', + 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)); + } + + // Enviar correo de notificación de denegació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 = 'Solicitud de registro denegada - SIIH'; + + $mail->Body = " +
+
+
+

Solicitud Denegada

+
+
+

Estimado(a) $nombre,

+

Lamentamos informarte que tu solicitud de registro como importador en el sistema SIIH ha sido denegada.

+ +
+

Motivo de la denegación:

+

$motivo

+
+ +

Si consideras que esta decisión es incorrecta o deseas obtener más información, puedes contactarnos para revisar tu caso.

+ +

Agradecemos tu interés en formar parte del Sistema Integral para Importadores de Hidrocarburos.

+
+
+ © " . date('Y') . " SIIH · Sistema Integral para Importadores de Hidrocarburos +
+
+
"; + + $mail->send(); + + // Éxito completo (solicitud denegada y correo enviado) + header("Location: /IMPORTADORES/administrador/aprobarUsuarios?success=denied"); + + } catch (Exception $mailException) { + // Error en el correo, pero la solicitud fue denegada exitosamente + error_log("Error al enviar correo de denegación: " . $mailException->getMessage()); + + // Redirigir con mensaje de éxito parcial + header("Location: /IMPORTADORES/administrador/aprobarUsuarios?success=denied&warning=email_failed"); + } + + } catch (Exception $e) { + // Log del error para debugging + error_log("Error al denegar usuario: " . $e->getMessage()); + + // Redirigir con error específico basado en el tipo de error + if (strpos($e->getMessage(), 'Solicitud no encontrada') !== false) { + header("Location: /IMPORTADORES/administrador/aprobarUsuarios?error=invalid_request"); + } elseif (strpos($e->getMessage(), 'Email no disponible') !== false) { + header("Location: /IMPORTADORES/administrador/aprobarUsuarios?error=email_unavailable"); + } else { + header("Location: /IMPORTADORES/administrador/aprobarUsuarios?error=process_failed"); + } + } + + exit; +} + function altaUsuarios() { if (!isset($_SESSION['usuario_id']) || $_SESSION['tipo_usuario'] !== 'super_admin') { @@ -649,6 +797,123 @@ function aprobar_agencia() exit; } +function denegar_agencia() +{ + $conn = getConnection(); + + $id = $_GET['id'] ?? null; + $motivo = trim($_POST['motivo'] ?? ''); + $usuario_id = $_SESSION['usuario_id']; + + // Definir motivo por defecto si no se ingresó uno + if ($motivo === '') { + $motivo = 'La solicitud ha sido rechazada por no cumplir con los requisitos establecidos.'; + } + + // Validar parámetros + if (!$id || !is_numeric($id)) { + header("Location: /IMPORTADORES/administrador/aprobarAgencias?error=invalid_id"); + exit; + } + + if (!$motivo || trim($motivo) === '') { + header("Location: /IMPORTADORES/administrador/aprobarAgencias?error=motivo_required"); + exit; + } + + // Obtener la solicitud + $sql = "SELECT * FROM solicitudes_agencias WHERE request_id = ?"; + $stmt = sqlsrv_query($conn, $sql, [$id]); + $solicitud = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC); + + if (!$solicitud) { + header("Location: /IMPORTADORES/administrador/aprobarAgencias?error=invalid_request"); + exit; + } + + // Validar que no haya sido procesada ya + if ($solicitud['request_status'] === 'denied') { + die("⚠️ Esta solicitud ya fue denegada."); + } + + if ($solicitud['request_status'] === 'approved') { + die("⚠️ Esta solicitud ya fue aprobada y no se puede denegar."); + } + + // Preparar datos para el correo + $nombre = decrypt($solicitud['agencia_name']); + $admin_name = decrypt($solicitud['admin_name']); + $admin_email = $solicitud['admin_email']; + + // Actualizar solicitud como denegada + $sqlUpdate = "UPDATE solicitudes_agencias + SET request_status = 'denied', + approval_date = GETDATE(), + approved_by = ? + WHERE request_id = ? + "; + $stmtUpdate = sqlsrv_query($conn, $sqlUpdate, [$usuario_id, $id]); + + if (!$stmtUpdate) { + header("Location: /IMPORTADORES/administrador/aprobarAgencias?error=update_request_failed"); + exit; + } + + // Enviar correo de notificación de denegació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($admin_email); + $mail->CharSet = 'UTF-8'; + $mail->isHTML(true); + $mail->Subject = 'Solicitud de agencia denegada - SIIH'; + + $mail->Body = " +
+
+
+

Solicitud Denegada

+
+
+

Estimado(a) $admin_name,

+

Lamentamos informarte que tu solicitud para registrar la agencia $nombre en el sistema SIIH ha sido denegada.

+ +
+

Motivo de la denegación:

+

$motivo

+
+ +

Si consideras que esta decisión es incorrecta o deseas obtener más información, puedes contactarnos para revisar tu caso.

+ +

Agradecemos tu interés en formar parte del Sistema Integral para Importadores de Hidrocarburos.

+
+
+ © " . date('Y') . " SIIH · Sistema Integral para Importadores de Hidrocarburos +
+
+
"; + + $mail->send(); + + } catch (Exception $e) { + error_log("Error al enviar correo de denegación: {$mail->ErrorInfo}"); + } + + // Registrar en bitácora (opcional - crear función específica para denegaciones) + registrar_bitacora_agencia($id, $nombre, 'DENEGACION', $usuario_id); + + header("Location: /IMPORTADORES/administrador/aprobarAgencias?success=denied"); + exit; +} + function altaAgencias() { if (!isset($_SESSION['usuario_id']) || $_SESSION['tipo_usuario'] !== 'super_admin') { diff --git a/app/controllers/importadores.php b/app/controllers/importadores.php index eaf0aa3..44dbb40 100644 --- a/app/controllers/importadores.php +++ b/app/controllers/importadores.php @@ -289,6 +289,8 @@ function desvincularUsuario() $conn = getConnection(); try { + $stmtActualizarAgencia = null; + // Iniciar transacción sqlsrv_begin_transaction($conn); @@ -357,9 +359,16 @@ function desvincularUsuario() } // Limpiar statements - sqlsrv_free_stmt($stmtVerificar); - sqlsrv_free_stmt($stmtDesactivar); - sqlsrv_free_stmt($stmtActualizarAgencia); + if (isset($stmtVerificar) && is_resource($stmtVerificar)) { + sqlsrv_free_stmt($stmtVerificar); + } + if (isset($stmtDesactivar) && is_resource($stmtDesactivar)) { + sqlsrv_free_stmt($stmtDesactivar); + } + if (isset($stmtActualizarAgencia) && is_resource($stmtActualizarAgencia)) { + sqlsrv_free_stmt($stmtActualizarAgencia); + } + // Confirmar transacción sqlsrv_commit($conn); diff --git a/views/admin/agencias_activas.php b/views/admin/agencias_activas.php index e81380b..8c0258a 100644 --- a/views/admin/agencias_activas.php +++ b/views/admin/agencias_activas.php @@ -98,7 +98,7 @@ - Suspender + Suspender @@ -119,6 +119,21 @@ } }); }); + + function confirmSuspencion(id) { + Swal.fire({ + title: '¿Estás seguro?', + text: 'Solo se suspenderá el perfil del usuario.', + icon: 'warning', + showCancelButton: true, + confirmButtonText: 'Sí, suspender', + cancelButtonText: 'Cancelar' + }).then((result) => { + if (result.isConfirmed) { + window.location.href = `/IMPORTADORES/administrador/suspenderAgencia?id=${id}`; + } + }); + } diff --git a/views/admin/alta_usuarios.php b/views/admin/alta_usuarios.php index 82f31af..ad2f872 100644 --- a/views/admin/alta_usuarios.php +++ b/views/admin/alta_usuarios.php @@ -228,7 +228,7 @@ format('Y-m-d H:i') : '' ?> - Suspender + Suspender @@ -252,7 +252,8 @@ // Script para manejar las animaciones de validación document.addEventListener('DOMContentLoaded', function() { - const inputs = document.querySelectorAll('input.form-control, select.form_select'); + const inputs = document.querySelectorAll('input.form-control, select.form_select'); + const selects = document.querySelectorAll('select.form_select'); inputs.forEach(input => { // Validación en tiempo real @@ -309,6 +310,21 @@ }); }); }); + + function confirmSuspencion(id) { + Swal.fire({ + title: '¿Estás seguro?', + text: 'Esta acción no se puede deshacer.', + icon: 'warning', + showCancelButton: true, + confirmButtonText: 'Sí, suspender', + cancelButtonText: 'Cancelar' + }).then((result) => { + if (result.isConfirmed) { + window.location.href = `/IMPORTADORES/administrador/suspender?id=${id}`; + } + }); + } diff --git a/views/admin/aprobar_agencias.php b/views/admin/aprobar_agencias.php index 4e2af3f..24ae341 100644 --- a/views/admin/aprobar_agencias.php +++ b/views/admin/aprobar_agencias.php @@ -106,7 +106,8 @@ - Aprobar + Aprobar + Denegar @@ -117,6 +118,14 @@ + + + + diff --git a/views/admin/aprobar_usuarios.php b/views/admin/aprobar_usuarios.php index af9791e..3bb4068 100644 --- a/views/admin/aprobar_usuarios.php +++ b/views/admin/aprobar_usuarios.php @@ -103,7 +103,8 @@ - Aprobar + Aprobar + Denegar @@ -123,14 +124,46 @@ } }); }); + + function confirmAprobacion(id) { + Swal.fire({ + title: '¿Estás seguro?', + text: 'Se creará el perfil y se notificará al usuario.', + icon: 'warning', + showCancelButton: true, + confirmButtonText: 'Sí, aprobar', + cancelButtonText: 'Cancelar' + }).then((result) => { + if (result.isConfirmed) { + window.location.href = `/IMPORTADORES/administrador/aprobar_usuario?id=${id}`; + } + }); + } + + function denegateRequest(id) { + Swal.fire({ + title: '¿Estás seguro?', + text: 'Se denegara la solicitud de registro del usuario.', + icon: 'warning', + showCancelButton: true, + confirmButtonText: 'Sí, denegar', + cancelButtonText: 'Cancelar' + }).then((result) => { + if (result.isConfirmed) { + window.location.href = `/IMPORTADORES/administrador/denegar_usuario?id=${id}`; + } + }); + } diff --git a/views/admin/usuarios_inactivos.php b/views/admin/usuarios_inactivos.php index 1e8098b..5f7ae84 100644 --- a/views/admin/usuarios_inactivos.php +++ b/views/admin/usuarios_inactivos.php @@ -95,8 +95,8 @@ format('Y-m-d H:i') : '' ?> - Activar - Nueva Contraseña + Activar + Restablecer @@ -117,6 +117,36 @@ } }); }); + + function confirmActivacion(id) { + Swal.fire({ + title: '¿Estás seguro?', + text: 'Se reactivara el perfil del usuario.', + icon: 'warning', + showCancelButton: true, + confirmButtonText: 'Sí, reactivar', + cancelButtonText: 'Cancelar' + }).then((result) => { + if (result.isConfirmed) { + window.location.href = `/IMPORTADORES/administrador/activar?id=${id}`; + } + }); + } + + function changePassword(id) { + Swal.fire({ + title: '¿Estás seguro?', + text: 'Se restablecera la contraseña del usuario.', + icon: 'warning', + showCancelButton: true, + confirmButtonText: 'Sí, restablecer', + cancelButtonText: 'Cancelar' + }).then((result) => { + if (result.isConfirmed) { + window.location.href = `/IMPORTADORES/administrador/reset_password?id=${id}`; + } + }); + } diff --git a/views/partials/sidebar_administrador.php b/views/partials/sidebar_administrador.php index f84ecf5..d9493cc 100644 --- a/views/partials/sidebar_administrador.php +++ b/views/partials/sidebar_administrador.php @@ -1,179 +1,315 @@ + + - - + + -
- + - + + + \ No newline at end of file diff --git a/views/partials/sidebar_agencia.php b/views/partials/sidebar_agencia.php index 2715c2d..8b338f5 100644 --- a/views/partials/sidebar_agencia.php +++ b/views/partials/sidebar_agencia.php @@ -1,12 +1,49 @@ + + @@ -14,233 +51,299 @@
-
- +
-
+ \ No newline at end of file +
+ + + \ No newline at end of file diff --git a/views/partials/sidebar_agente.php b/views/partials/sidebar_agente.php index c173c8a..67d5ceb 100644 --- a/views/partials/sidebar_agente.php +++ b/views/partials/sidebar_agente.php @@ -1,12 +1,49 @@ + + @@ -14,207 +51,263 @@ -
- +
-
+ \ No newline at end of file +
+ + + \ No newline at end of file diff --git a/views/partials/sidebar_configuracion.php b/views/partials/sidebar_configuracion.php index d04d5ec..8a60a5d 100644 --- a/views/partials/sidebar_configuracion.php +++ b/views/partials/sidebar_configuracion.php @@ -8,8 +8,7 @@ if (!isset($_SESSION['usuario_id'])) { // Obtener información del usuario $tipoUsuario = $_SESSION['tipo_usuario'] ?? ''; -$agenciaId = $_SESSION['agencia_id'] ?? null; -$usuarioId = $_SESSION['usuario_id'] ?? null; +$usuarioId = $_SESSION['usuario_id'] ?? null; // Definir permisos por tipo de usuario $permisos = [ @@ -82,6 +81,15 @@ function contarBitacorasDisponibles($permisosBitacoras) { $cantidadBitacoras = contarBitacorasDisponibles($permisosBitacoras); +// Variables para detectar las vistas actuales +$currentPath = $_SERVER['REQUEST_URI']; +$esConfiguracion = $currentPath === '/IMPORTADORES/configuracion/index' || $currentPath === '/IMPORTADORES/configuracion'; +$esVistaAutomatizaciones = strpos($currentPath, '/IMPORTADORES/automatizaciones/') === 0; +$esVistaPreferencias = strpos($currentPath, '/IMPORTADORES/preferencias/') === 0; +$esVistaSeguridad = strpos($currentPath, '/IMPORTADORES/seguridad/') === 0; +$esVistaBitacoras = strpos($currentPath, '/IMPORTADORES/bitacoras/') === 0 && $currentPath !== '/IMPORTADORES/configuracion'; +$esVistaReset = strpos($currentPath, '/IMPORTADORES/reset/') === 0; + // Función para obtener el texto descriptivo según el permiso function obtenerTextoPermiso($permiso, $tipoUsuario) { $textos = [ @@ -98,22 +106,6 @@ function obtenerTextoPermiso($permiso, $tipoUsuario) { return $textos[$permiso] ?? ucfirst(str_replace('_', ' ', $permiso)); } -// Función para obtener el icono según el permiso -function obtenerIconoPermiso($permiso) { - $iconos = [ - 'registro_accesos' => '🌐', - 'registro_cambios' => '🔄', - 'registro_usuarios' => '👥', - 'registro_agencias' => '🏪', - 'acceso_usuarios_agencia' => '👥', - 'registro_vinculaciones' => '🔗', - 'mi_actividad' => '👤', - 'vinculaciones_usuario' => '🔗' - ]; - - return $iconos[$permiso] ?? '📋'; -} - // Función para obtener la URL según el permiso function obtenerUrlPermiso($permiso) { $urls = [ @@ -131,15 +123,52 @@ function obtenerUrlPermiso($permiso) { } ?> + + @@ -14,410 +51,603 @@ -
- + -
+
Menú
- - - - 🏠 Inicio - - - - - 🗺️ Locaciones - - - - - - - - - - - - - - - - - - - - - 🏭 Proveedores - 2 - - - - - - - - - - - - - - - - - - ⚙️ Configuración - - +
+ + + \ No newline at end of file diff --git a/views/vinculaciones/importadores_vinculados.php b/views/vinculaciones/importadores_vinculados.php index 0722d33..f811547 100644 --- a/views/vinculaciones/importadores_vinculados.php +++ b/views/vinculaciones/importadores_vinculados.php @@ -89,7 +89,7 @@ format('Y-m-d H:i') : '' ?> - Desvincular + Desvincular @@ -108,6 +108,21 @@ } }); }); + + function confirmUnlink(id) { + Swal.fire({ + title: '¿Estás seguro?', + text: 'Esta acción no se puede deshacer.', + icon: 'warning', + showCancelButton: true, + confirmButtonText: 'Sí, desvincular', + cancelButtonText: 'Cancelar' + }).then((result) => { + if (result.isConfirmed) { + window.location.href = `/IMPORTADORES/agentes/desvincularAgente?id=${id}`; + } + }); + } diff --git a/views/vinculaciones/usuarios_vinculados.php b/views/vinculaciones/usuarios_vinculados.php index 6b1d5e8..39e6f56 100644 --- a/views/vinculaciones/usuarios_vinculados.php +++ b/views/vinculaciones/usuarios_vinculados.php @@ -94,10 +94,10 @@ format('Y-m-d H:i') : '' ?> - - - Desvincular - + + + + N/A @@ -120,6 +120,21 @@ } }); }); + + function confirmUnlink(id, tipo) { + Swal.fire({ + title: '¿Estás seguro?', + text: 'Esta acción no se puede deshacer.', + icon: 'warning', + showCancelButton: true, + confirmButtonText: 'Sí, desvincular', + cancelButtonText: 'Cancelar' + }).then((result) => { + if (result.isConfirmed) { + window.location.href = `/IMPORTADORES/vinculaciones/desvincularAgencia?id=${id}&tipo=${tipo}`; + } + }); + } diff --git a/views/vinculaciones/vinculaciones_importador.php b/views/vinculaciones/vinculaciones_importador.php index c5739a7..5870af4 100644 --- a/views/vinculaciones/vinculaciones_importador.php +++ b/views/vinculaciones/vinculaciones_importador.php @@ -103,7 +103,7 @@ Usar Agencia - Desvincular + @@ -123,6 +123,21 @@ } }); }); + + function confirmUnlink(id) { + Swal.fire({ + title: '¿Estás seguro?', + text: 'Esta acción no se puede deshacer.', + icon: 'warning', + showCancelButton: true, + confirmButtonText: 'Sí, desvincular', + cancelButtonText: 'Cancelar' + }).then((result) => { + if (result.isConfirmed) { + window.location.href = `/IMPORTADORES/importadores/desvincularUsuario?id=${id}`; + } + }); + }