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 @@
= htmlspecialchars(decrypt($ag['nombre_admin'] ?? '')) ?>
- 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 @@
= isset($u['creado_en']) && $u['creado_en'] instanceof DateTime ? $u['creado_en']->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 @@
= isset($u['creado_en']) && $u['creado_en'] instanceof DateTime ? $u['creado_en']->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 @@
+
+
-
-
+
+
-
- ☰
+
SIIH | Administrador
-
+
- Bienvenido, = htmlspecialchars($_SESSION['usuario_nombre']) ?>
-
-
Cerrar Sesión
-
-
+ if ($esDashboard): ?>
+ Bienvenido, = htmlspecialchars($_SESSION['usuario_nombre']) ?>
+
+ Cerrar Sesión
+
+
+
-
-
-
-
-
- 🏠 Inicio
-
-
-
-
- 🏪 Agencias
- 3
-
-
-
-
-
- 👥 Usuarios
- 3
-
-
-
-
-
- ⚙️ Configuración
-
-
-
+
-
+
+
+
\ 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 @@
-
+
SIIH | Agencia Aduanal
-
+
- Bienvenido, = htmlspecialchars($_SESSION['usuario_nombre']) ?>
-
-
Cerrar Sesión
-
+ if ($esDashboard): ?>
+
Bienvenido, = htmlspecialchars($_SESSION['usuario_nombre']) ?>
+
+
Cerrar Sesión
+
+
-
-
-
-
-
-
-
- 🏠 Inicio
-
-
-
-
- 🔗 Vinculación
-
-
-
-
- 👥 Usuarios Vinculados
-
-
-
-
-
-
- role="button" aria-expanded="true" aria-controls="submenuAgentesAduanales"
- onclick="= $enDashboardPatente ? '' : 'event.preventDefault(); window.location.href = \'/IMPORTADORES/patente/dashboard\';' ?>">
- 📑 Patentes
- 2
-
-
-
+
+
+
\ 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 @@
-
+
SIIH | Agente Aduanal
-
+
- Bienvenido, = htmlspecialchars($_SESSION['usuario_nombre']) ?>
-
-
Cerrar Sesión
-
+ if ($esDashboard): ?>
+
Bienvenido, = htmlspecialchars($_SESSION['usuario_nombre']) ?>
+
+
Cerrar Sesión
+
+
-
-
-
-
-
-
-
- 🏠 Inicio
-
-
-
-
- 🔗 Vinculados
-
-
-
-
-
-
- role="button" aria-expanded="true" aria-controls="submenuAgentesAduanales"
- onclick="= $enDashboardPatente ? '' : 'event.preventDefault(); window.location.href = \'/IMPORTADORES/patente/dashboard\';' ?>">
- 📑 Patentes
- 2
-
-
-
+
+
+
\ 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 @@
-
+
- SIIH | Importador
+ SIIH | Administrador
-
- Bienvenido, = htmlspecialchars($_SESSION['usuario_nombre']) ?>
-
-
Cerrar Sesión
-
+
+
+
Bienvenido, = htmlspecialchars($_SESSION['usuario_nombre']) ?>
+
+
Cerrar Sesión
+
+
-