Propuesta Multi-agencia
This commit is contained in:
64
agencias.txt
Normal file
64
agencias.txt
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
-- 1. Tabla de Agencias Aduanales
|
||||||
|
CREATE TABLE [dbo].[agencias_aduanales](
|
||||||
|
[id_agencia] [int] IDENTITY(1,1) NOT NULL,
|
||||||
|
[nombre_agencia] [nvarchar](255) NOT NULL,
|
||||||
|
[rfc_agencia] [nvarchar](13) NOT NULL,
|
||||||
|
[direccion] [nvarchar](500) NULL,
|
||||||
|
[telefono] [nvarchar](20) NULL,
|
||||||
|
[email] [nvarchar](255) NULL,
|
||||||
|
[activo] [bit] NOT NULL DEFAULT 1,
|
||||||
|
[creado_en] [datetime] NOT NULL DEFAULT GETDATE(),
|
||||||
|
[actualizado_en] [datetime] NULL,
|
||||||
|
CONSTRAINT [PK_agencias_aduanales] PRIMARY KEY CLUSTERED ([id_agencia] ASC)
|
||||||
|
);
|
||||||
|
|
||||||
|
-- 2. Modificar tabla usuarios_sistema para agregar referencia a agencia (solo para agentes)
|
||||||
|
ALTER TABLE [dbo].[usuarios_sistema]
|
||||||
|
ADD [id_agencia] [int] NULL;
|
||||||
|
|
||||||
|
-- Agregar foreign key constraint
|
||||||
|
ALTER TABLE [dbo].[usuarios_sistema]
|
||||||
|
ADD CONSTRAINT [FK_usuarios_agencia]
|
||||||
|
FOREIGN KEY ([id_agencia]) REFERENCES [dbo].[agencias_aduanales]([id_agencia]);
|
||||||
|
|
||||||
|
-- 3. Tabla de relación importador-agencia (many-to-many)
|
||||||
|
CREATE TABLE [dbo].[importador_agencia](
|
||||||
|
[id_relacion] [int] IDENTITY(1,1) NOT NULL,
|
||||||
|
[id_importador] [int] NOT NULL,
|
||||||
|
[id_agencia] [int] NOT NULL,
|
||||||
|
[activo] [bit] NOT NULL DEFAULT 1,
|
||||||
|
[fecha_vinculacion] [datetime] NOT NULL DEFAULT GETDATE(),
|
||||||
|
[fecha_desvinculacion] [datetime] NULL,
|
||||||
|
[creado_por] [int] NULL, -- ID del usuario que creó la relación
|
||||||
|
CONSTRAINT [PK_importador_agencia] PRIMARY KEY CLUSTERED ([id_relacion] ASC),
|
||||||
|
CONSTRAINT [FK_importador_agencia_usuario]
|
||||||
|
FOREIGN KEY ([id_importador]) REFERENCES [dbo].[usuarios_sistema]([id_usuario]),
|
||||||
|
CONSTRAINT [FK_importador_agencia_agencia]
|
||||||
|
FOREIGN KEY ([id_agencia]) REFERENCES [dbo].[agencias_aduanales]([id_agencia]),
|
||||||
|
CONSTRAINT [FK_importador_agencia_creador]
|
||||||
|
FOREIGN KEY ([creado_por]) REFERENCES [dbo].[usuarios_sistema]([id_usuario])
|
||||||
|
);
|
||||||
|
|
||||||
|
-- Índice único para evitar duplicados activos
|
||||||
|
CREATE UNIQUE INDEX [IX_importador_agencia_unique]
|
||||||
|
ON [dbo].[importador_agencia] ([id_importador], [id_agencia])
|
||||||
|
WHERE [activo] = 1;
|
||||||
|
|
||||||
|
-- 4. Tabla para auditoría de cambios de agencia
|
||||||
|
CREATE TABLE [dbo].[historial_agencia_cambios](
|
||||||
|
[id_historial] [int] IDENTITY(1,1) NOT NULL,
|
||||||
|
[id_importador] [int] NOT NULL,
|
||||||
|
[id_agencia_anterior] [int] NULL,
|
||||||
|
[id_agencia_nueva] [int] NULL,
|
||||||
|
[accion] [varchar](50) NOT NULL, -- 'VINCULACION', 'DESVINCULACION', 'CAMBIO'
|
||||||
|
[motivo] [nvarchar](500) NULL,
|
||||||
|
[realizado_por] [int] NOT NULL,
|
||||||
|
[fecha_cambio] [datetime] NOT NULL DEFAULT GETDATE(),
|
||||||
|
CONSTRAINT [PK_historial_agencia_cambios] PRIMARY KEY CLUSTERED ([id_historial] ASC)
|
||||||
|
);
|
||||||
|
|
||||||
|
-- Índices adicionales para mejorar rendimiento
|
||||||
|
CREATE INDEX [IX_usuarios_tipo_agencia] ON [dbo].[usuarios_sistema] ([tipo_usuario], [id_agencia]);
|
||||||
|
CREATE INDEX [IX_importador_agencia_importador] ON [dbo].[importador_agencia] ([id_importador]);
|
||||||
|
CREATE INDEX [IX_importador_agencia_agencia] ON [dbo].[importador_agencia] ([id_agencia]);
|
||||||
|
CREATE INDEX [IX_agencias_activo] ON [dbo].[agencias_aduanales] ([activo]);
|
||||||
45
app/controllers/agencias.php
Normal file
45
app/controllers/agencias.php
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
<?php
|
||||||
|
require_once __DIR__ . '/../../vendor/autoload.php';
|
||||||
|
|
||||||
|
require_once __DIR__ . '/../helpers/session.php';
|
||||||
|
require_once __DIR__ . '/../../config/database.php';
|
||||||
|
require_once __DIR__ . '/../helpers/crypto.php';
|
||||||
|
require_once __DIR__ . '/../helpers/bitacoras.php';
|
||||||
|
require_once __DIR__ . '/../helpers/env.php';
|
||||||
|
|
||||||
|
use PHPMailer\PHPMailer\PHPMailer;
|
||||||
|
use PHPMailer\PHPMailer\Exception;
|
||||||
|
|
||||||
|
loadEnv();
|
||||||
|
|
||||||
|
function dashboard()
|
||||||
|
{
|
||||||
|
if (!isset($_SESSION['usuario_id']) || $_SESSION['tipo_usuario'] !== 'agente_aduanal') {
|
||||||
|
header("Location: /IMPORTADORES/login");
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
$nombreAgencia = $_SESSION['nombre_agencia'];
|
||||||
|
|
||||||
|
include __DIR__ . '/../../views/agencias/dashboard_agencias.php';
|
||||||
|
}
|
||||||
|
|
||||||
|
function alta()
|
||||||
|
{
|
||||||
|
include __DIR__ . '/../../views/agencias/.php';
|
||||||
|
}
|
||||||
|
|
||||||
|
function alta_agente()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function activos()
|
||||||
|
{
|
||||||
|
include __DIR__ . '/../../views/agencias/usuarios_activos.php';
|
||||||
|
}
|
||||||
|
|
||||||
|
function bitacora()
|
||||||
|
{
|
||||||
|
include __DIR__ . '/../../views/agencias/dashboard_agencias.php';
|
||||||
|
}
|
||||||
38
views/admin/agencias_activas.php
Normal file
38
views/admin/agencias_activas.php
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
<?php include __DIR__ . '/../partials/sidebar_sistemas.php'; ?>
|
||||||
|
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Dashboard | Agencia Aduanal</title>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
|
||||||
|
<style>
|
||||||
|
body { font-family: 'Segoe UI', sans-serif; background-color: #f4f6f9; }
|
||||||
|
.sidebar { width: 220px; height: 100vh; background-color: #343a40; position: fixed; top: 0; left: 0; padding-top: 56px; z-index: 1040; }
|
||||||
|
.sidebar .nav-link { font-weight: normal; color: white; transition: all 0.3s ease; }
|
||||||
|
.sidebar .nav-link:hover,
|
||||||
|
.sidebar .nav-link.active { background-color: #495057; color: #fff; }
|
||||||
|
.content { margin-top: 56px; padding: 40px 20px; position: relative; z-index: 1; background-color: #f4f6f9; transition: margin-left 0.3s ease; }
|
||||||
|
.navbar { position: fixed; top: 0; width: 100%; z-index: 1050; }
|
||||||
|
/* A partir de dispositivos medianos (>=768px), deja espacio lateral */
|
||||||
|
@media (min-width: 768px) { .content { margin-left: 250px; /* Ancho del sidebar */ } }
|
||||||
|
/* En móviles, sin margen lateral */
|
||||||
|
@media (max-width: 767.98px) {
|
||||||
|
.content { margin-left: 0; }
|
||||||
|
.sidebar .nav-link { font-weight: normal; color: #343a40; background-color: transparent; }
|
||||||
|
.sidebar .nav-link:hover,
|
||||||
|
.sidebar .nav-link.active { background-color: #e9ecef; color: #212529; }
|
||||||
|
}
|
||||||
|
.card { border-radius: 12px; }
|
||||||
|
.table thead th { background: #343a40; color: #fff; }
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<div class="content">
|
||||||
|
<h4>✅ Agencias Activas</h4>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
69
views/agencias/alta_agentes.php
Normal file
69
views/agencias/alta_agentes.php
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
<?php include __DIR__ . '/../partials/sidebar_agencia.php'; ?>
|
||||||
|
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="es">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Dashboard | Agencia Aduanal</title>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
|
||||||
|
<link href="https://cdn.datatables.net/1.13.4/css/jquery.dataTables.min.css" rel="stylesheet">
|
||||||
|
<script src="https://code.jquery.com/jquery-3.7.0.min.js"></script>
|
||||||
|
<script src="https://cdn.datatables.net/1.13.4/js/jquery.dataTables.min.js"></script>
|
||||||
|
<style>
|
||||||
|
body { font-family: 'Segoe UI', sans-serif; background-color: #f4f6f9; }
|
||||||
|
.sidebar { width: 220px; height: 100vh; background-color: #343a40; position: fixed; top: 0; left: 0; padding-top: 56px; z-index: 1040; }
|
||||||
|
.sidebar .nav-link { font-weight: normal; color: white; transition: all 0.3s ease; }
|
||||||
|
.sidebar .nav-link:hover,
|
||||||
|
.sidebar .nav-link.active { background-color: #495057; color: #fff; }
|
||||||
|
.content { margin-top: 56px; padding: 40px 20px; position: relative; z-index: 1; background-color: #f4f6f9; transition: margin-left 0.3s ease; }
|
||||||
|
.navbar { position: fixed; top: 0; width: 100%; z-index: 1050; }
|
||||||
|
/* A partir de dispositivos medianos (>=768px), deja espacio lateral */
|
||||||
|
@media (min-width: 768px) { .content { margin-left: 250px; /* Ancho del sidebar */ } }
|
||||||
|
/* En móviles, sin margen lateral */
|
||||||
|
@media (max-width: 767.98px) {
|
||||||
|
.content { margin-left: 0; }
|
||||||
|
.sidebar .nav-link { font-weight: normal; color: #343a40; background-color: transparent; }
|
||||||
|
.sidebar .nav-link:hover,
|
||||||
|
.sidebar .nav-link.active { background-color: #e9ecef; color: #212529; }
|
||||||
|
}
|
||||||
|
.card { border-radius: 12px; }
|
||||||
|
table.dataTable thead th { background: #343a40; color: #fff; }
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<!-- 📄 CONTENIDO -->
|
||||||
|
<div class="content px-4">
|
||||||
|
<h3 class="mb-4">Administración de Agentes</h3>
|
||||||
|
|
||||||
|
<!-- FORMULARIO -->
|
||||||
|
<form action="/IMPORTADORES/agencias/alta_agente" method="POST" class="card p-4 mb-5 shadow-sm">
|
||||||
|
<h5 class="mb-3">➕ Nuevo Agente</h5>
|
||||||
|
<div class="row g-3">
|
||||||
|
<div class="col-md-4">
|
||||||
|
<input name="nombre" class="form-control" placeholder="Nombre completo" required>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-4">
|
||||||
|
<input name="email" type="email" class="form-control" placeholder="Correo electrónico" required>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-2">
|
||||||
|
<input name="password" type="password" class="form-control" placeholder="Contraseña" required>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-2">
|
||||||
|
<select name="tipo_usuario" class="form-select" required>
|
||||||
|
<option value="">Tipo</option>
|
||||||
|
<option value="agente_aduanal">Agente Aduanal</option>
|
||||||
|
<option value="importador">Importador</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="text-end mt-4">
|
||||||
|
<button class="btn btn-success px-4">Registrar</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
42
views/agencias/bitacora.php
Normal file
42
views/agencias/bitacora.php
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
<?php include __DIR__ . '/../partials/sidebar_agencia.php'; ?>
|
||||||
|
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="es">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Dashboard | Agencia Aduanal</title>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
|
||||||
|
<link href="https://cdn.datatables.net/1.13.4/css/jquery.dataTables.min.css" rel="stylesheet">
|
||||||
|
<script src="https://code.jquery.com/jquery-3.7.0.min.js"></script>
|
||||||
|
<script src="https://cdn.datatables.net/1.13.4/js/jquery.dataTables.min.js"></script>
|
||||||
|
<style>
|
||||||
|
body { font-family: 'Segoe UI', sans-serif; background-color: #f4f6f9; }
|
||||||
|
.sidebar { width: 220px; height: 100vh; background-color: #343a40; position: fixed; top: 0; left: 0; padding-top: 56px; z-index: 1040; }
|
||||||
|
.sidebar .nav-link { font-weight: normal; color: white; transition: all 0.3s ease; }
|
||||||
|
.sidebar .nav-link:hover,
|
||||||
|
.sidebar .nav-link.active { background-color: #495057; color: #fff; }
|
||||||
|
.content { margin-top: 56px; padding: 40px 20px; position: relative; z-index: 1; background-color: #f4f6f9; transition: margin-left 0.3s ease; }
|
||||||
|
.navbar { position: fixed; top: 0; width: 100%; z-index: 1050; }
|
||||||
|
/* A partir de dispositivos medianos (>=768px), deja espacio lateral */
|
||||||
|
@media (min-width: 768px) { .content { margin-left: 250px; /* Ancho del sidebar */ } }
|
||||||
|
/* En móviles, sin margen lateral */
|
||||||
|
@media (max-width: 767.98px) {
|
||||||
|
.content { margin-left: 0; }
|
||||||
|
.sidebar .nav-link { font-weight: normal; color: #343a40; background-color: transparent; }
|
||||||
|
.sidebar .nav-link:hover,
|
||||||
|
.sidebar .nav-link.active { background-color: #e9ecef; color: #212529; }
|
||||||
|
}
|
||||||
|
.card { border-radius: 12px; }
|
||||||
|
table.dataTable thead th { background: #343a40; color: #fff; }
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<div class="content">
|
||||||
|
<h4 class="mb-4">👥 Acceso de Usuarios</h4>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
77
views/agencias/dashboard_agencias.php
Normal file
77
views/agencias/dashboard_agencias.php
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
<?php include __DIR__ . '/../partials/sidebar_agencia.php'; ?>
|
||||||
|
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="es">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Dashboard | Agencia Aduanal</title>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
|
||||||
|
<style>
|
||||||
|
body { font-family: 'Segoe UI', sans-serif; background-color: #f4f6f9; }
|
||||||
|
.sidebar { width: 220px; height: 100vh; background-color: #343a40; position: fixed; top: 0; left: 0; padding-top: 56px; z-index: 1040; }
|
||||||
|
.sidebar .nav-link { font-weight: normal; color: white; transition: all 0.3s ease; }
|
||||||
|
.sidebar .nav-link:hover,
|
||||||
|
.sidebar .nav-link.active { background-color: #495057; color: #fff; }
|
||||||
|
.content { margin-top: 56px; padding: 40px 20px; position: relative; z-index: 1; background-color: #f4f6f9; transition: margin-left 0.3s ease; }
|
||||||
|
.navbar { position: fixed; top: 0; width: 100%; z-index: 1050; }
|
||||||
|
.btn-orange { background-color: orangeRed; color: white;}
|
||||||
|
.btn-orange:hover { background-color: #ff3600; color: white;}
|
||||||
|
.text-orange { color: orangeRed;}
|
||||||
|
/* A partir de dispositivos medianos (>=768px), deja espacio lateral */
|
||||||
|
@media (min-width: 768px) { .content { margin-left: 250px; /* Ancho del sidebar */ } }
|
||||||
|
/* En móviles, sin margen lateral */
|
||||||
|
@media (max-width: 767.98px) {
|
||||||
|
.content { margin-left: 0; }
|
||||||
|
.sidebar .nav-link { font-weight: normal; color: #343a40; background-color: transparent; }
|
||||||
|
.sidebar .nav-link:hover,
|
||||||
|
.sidebar .nav-link.active { background-color: #e9ecef; color: #212529; }
|
||||||
|
}
|
||||||
|
.card { border-radius: 12px; }
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<!-- 📄 CONTENIDO -->
|
||||||
|
<div class="content">
|
||||||
|
<h4 class="mb-4">📦 Panel del Agencia Aduanal</h4>
|
||||||
|
|
||||||
|
<div class="row g-4">
|
||||||
|
<div class="col-md-4">
|
||||||
|
<div class="card shadow-sm p-3">
|
||||||
|
<h5 class="text-primary">Usuarios activos</h5>
|
||||||
|
<p>Consulta los que ya fueron autorizados.</p>
|
||||||
|
<a href="/IMPORTADORES/agencias/activos" class="btn btn-primary btn-sm mt-2">Ver usuarios</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-4">
|
||||||
|
<div class="card shadow-sm p-3">
|
||||||
|
<h5 class="text-success">Alta de agentes</h5>
|
||||||
|
<p>Da de alta a tus agentes aduanales</p>
|
||||||
|
<a href="/IMPORTADORES/agencias/alta" class="btn btn-success btn-sm mt-2">Nuevo agente</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-4">
|
||||||
|
<div class="card shadow-sm p-3">
|
||||||
|
<h5 class="text-warning">Bitácora del sistema</h5>
|
||||||
|
<p>Revisa los accesos y acciones recientes.</p>
|
||||||
|
<a href="/IMPORTADORES/agencias/bitacora" class="btn btn-warning btn-sm mt-2">Ver bitácora</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-4">
|
||||||
|
<div class="card shadow-sm p-3">
|
||||||
|
<h5 class="text-danger">Cerrar sesión</h5>
|
||||||
|
<p>Salir del sistema de forma segura.</p>
|
||||||
|
<a href="/IMPORTADORES/sistemas/logout" class="btn btn-danger btn-sm mt-2">Logout</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
38
views/agencias/usuarios_activos.php
Normal file
38
views/agencias/usuarios_activos.php
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
<?php include __DIR__ . '/../partials/sidebar_agencia.php'; ?>
|
||||||
|
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Dashboard | Agencia Aduanal</title>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
|
||||||
|
<style>
|
||||||
|
body { font-family: 'Segoe UI', sans-serif; background-color: #f4f6f9; }
|
||||||
|
.sidebar { width: 220px; height: 100vh; background-color: #343a40; position: fixed; top: 0; left: 0; padding-top: 56px; z-index: 1040; }
|
||||||
|
.sidebar .nav-link { font-weight: normal; color: white; transition: all 0.3s ease; }
|
||||||
|
.sidebar .nav-link:hover,
|
||||||
|
.sidebar .nav-link.active { background-color: #495057; color: #fff; }
|
||||||
|
.content { margin-top: 56px; padding: 40px 20px; position: relative; z-index: 1; background-color: #f4f6f9; transition: margin-left 0.3s ease; }
|
||||||
|
.navbar { position: fixed; top: 0; width: 100%; z-index: 1050; }
|
||||||
|
/* A partir de dispositivos medianos (>=768px), deja espacio lateral */
|
||||||
|
@media (min-width: 768px) { .content { margin-left: 250px; /* Ancho del sidebar */ } }
|
||||||
|
/* En móviles, sin margen lateral */
|
||||||
|
@media (max-width: 767.98px) {
|
||||||
|
.content { margin-left: 0; }
|
||||||
|
.sidebar .nav-link { font-weight: normal; color: #343a40; background-color: transparent; }
|
||||||
|
.sidebar .nav-link:hover,
|
||||||
|
.sidebar .nav-link.active { background-color: #e9ecef; color: #212529; }
|
||||||
|
}
|
||||||
|
.card { border-radius: 12px; }
|
||||||
|
.table thead th { background: #343a40; color: #fff; }
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<div class="content">
|
||||||
|
<h4>✅ Usuarios Activos</h4>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -45,7 +45,7 @@ include __DIR__ . '/../partials/sidebar_agente.php';
|
|||||||
<div class="card shadow-sm p-3">
|
<div class="card shadow-sm p-3">
|
||||||
<h5 class="text-primary">Importadores activos</h5>
|
<h5 class="text-primary">Importadores activos</h5>
|
||||||
<p>Consulta los que ya fueron autorizados.</p>
|
<p>Consulta los que ya fueron autorizados.</p>
|
||||||
<a href="/IMPORTADORES/AGENTES/activos" class="btn btn-primary btn-sm mt-2">Ver importadores</a>
|
<a href="/IMPORTADORES/agentes/activos" class="btn btn-primary btn-sm mt-2">Ver importadores</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -53,7 +53,7 @@ include __DIR__ . '/../partials/sidebar_agente.php';
|
|||||||
<div class="card shadow-sm p-3">
|
<div class="card shadow-sm p-3">
|
||||||
<h5 class="text-success">Solicitudes pendientes</h5>
|
<h5 class="text-success">Solicitudes pendientes</h5>
|
||||||
<p>Valida nuevas solicitudes de registro.</p>
|
<p>Valida nuevas solicitudes de registro.</p>
|
||||||
<a href="/IMPORTADORES/AGENTES/solicitudes_pendientes" class="btn btn-success btn-sm mt-2">Ver solicitudes</a>
|
<a href="/IMPORTADORES/agentes/solicitudes_pendientes" class="btn btn-success btn-sm mt-2">Ver solicitudes</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
98
views/partials/sidebar_agencia.php
Normal file
98
views/partials/sidebar_agencia.php
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
<style>
|
||||||
|
.nav .nav-link { font-weight: normal; color: white; transition: all 0.3s ease; }
|
||||||
|
.nav .nav-link:hover,
|
||||||
|
.nav .nav-link.active { background-color: #495057; color: #fff; }
|
||||||
|
/* Estilo inverso solo para pantallas pequeñas (sidebar tipo offcanvas) */
|
||||||
|
@media (max-width: 767.98px) {
|
||||||
|
.nav .nav-link { font-weight: normal; color: #343a40; background-color: transparent; }
|
||||||
|
.nav .nav-link:hover,
|
||||||
|
.nav .nav-link.active { background-color: #e9ecef; color: #212529; }
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<!-- 🔷 NAVBAR -->
|
||||||
|
<nav class="navbar navbar-dark bg-dark fixed-top">
|
||||||
|
<div class="container-fluid">
|
||||||
|
<!-- Botón de menú para móviles -->
|
||||||
|
<button class="btn btn-outline-light d-md-none me-2" type="button" data-bs-toggle="offcanvas" data-bs-target="#sidebarMenu">
|
||||||
|
☰
|
||||||
|
</button>
|
||||||
|
<span class="navbar-brand">SIIH | Agencia Aduanal</span>
|
||||||
|
<div class="d-flex ms-auto text-white">
|
||||||
|
<?php
|
||||||
|
// Verifica si estás en el dashboard principal del importador
|
||||||
|
$esDashboard = str_contains($_SERVER['REQUEST_URI'], '/agencias/dashboard');
|
||||||
|
|
||||||
|
if ($esDashboard): ?>
|
||||||
|
Bienvenido, <?= htmlspecialchars($_SESSION['usuario_nombre']) ?>
|
||||||
|
<?php else: ?>
|
||||||
|
<a href="/IMPORTADORES/sistemas/logout" class="btn btn-outline-light btn-sm">Cerrar Sesión</a>
|
||||||
|
<?php endif; ?>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<!-- SIDEBAR FIJA (escritorio) -->
|
||||||
|
<div class="d-none d-md-block bg-dark text-white position-fixed h-100 pt-5" style="width: 250px;">
|
||||||
|
<nav class="nav flex-column">
|
||||||
|
|
||||||
|
<!-- INICIO -->
|
||||||
|
<a href="/IMPORTADORES/agencias/dashboard"
|
||||||
|
class="nav-link px-3 py-2 <?= $_SERVER['REQUEST_URI'] === '/IMPORTADORES/agencias/dashboard' ? 'active' : '' ?>">
|
||||||
|
🏠 Inicio
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<!-- USUARIOS ACTIVOS -->
|
||||||
|
<a href="/IMPORTADORES/agencias/activos"
|
||||||
|
class="nav-link px-3 py-2 <?= $_SERVER['REQUEST_URI'] === '/IMPORTADORES/agencias/activos' ? 'active' : '' ?>">
|
||||||
|
✅ Usuarios Activos
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<!-- ALTA DE AGENTES -->
|
||||||
|
<a href="/IMPORTADORES/agencias/alta"
|
||||||
|
class="nav-link px-3 py-2 <?= $_SERVER['REQUEST_URI'] === '/IMPORTADORES/agencias/alta' ? 'active' : '' ?>">
|
||||||
|
📥 Alta de Agentes
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<!-- BITÁCORA -->
|
||||||
|
<a href="/IMPORTADORES/agencias/bitacora"
|
||||||
|
class="nav-link px-3 py-2 <?= $_SERVER['REQUEST_URI'] === '/IMPORTADORES/agencias/bitacora' ? 'active' : '' ?>">
|
||||||
|
🕓 Bitácora
|
||||||
|
</a>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- OFFCANVAS PARA MÓVILES -->
|
||||||
|
<div class="offcanvas offcanvas-start d-md-none" tabindex="-1" id="sidebarMenu" style="top: 56px;">
|
||||||
|
<div class="offcanvas-header">
|
||||||
|
<h5 class="offcanvas-title">Menú</h5>
|
||||||
|
<button type="button" class="btn-close" data-bs-dismiss="offcanvas"></button>
|
||||||
|
</div>
|
||||||
|
<div class="offcanvas-body">
|
||||||
|
|
||||||
|
<!-- INICIO -->
|
||||||
|
<a href="/IMPORTADORES/agencias/dashboard"
|
||||||
|
class="nav-link px-3 py-2 <?= $_SERVER['REQUEST_URI'] === '/IMPORTADORES/agencias/dashboard' ? 'active' : '' ?>">
|
||||||
|
🏠 Inicio
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<!-- USUARIOS ACTIVOS -->
|
||||||
|
<a href="/IMPORTADORES/agencias/activos"
|
||||||
|
class="nav-link px-3 py-2 <?= $_SERVER['REQUEST_URI'] === '/IMPORTADORES/agencias/activos' ? 'active' : '' ?>">
|
||||||
|
✅ Usuarios Activos
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<!-- ALTA DE AGENTES -->
|
||||||
|
<a href="/IMPORTADORES/agencias/alta"
|
||||||
|
class="nav-link px-3 py-2 <?= $_SERVER['REQUEST_URI'] === '/IMPORTADORES/agencias/alta' ? 'active' : '' ?>">
|
||||||
|
📥 Alta de Agentes
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<!-- BITÁCORA -->
|
||||||
|
<a href="/IMPORTADORES/agencias/bitacora"
|
||||||
|
class="nav-link px-3 py-2 <?= $_SERVER['REQUEST_URI'] === '/IMPORTADORES/agencias/bitacora' ? 'active' : '' ?>">
|
||||||
|
🕓 Bitácora
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
@@ -19,11 +19,13 @@
|
|||||||
</div>
|
</div>
|
||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
<!-- 📘 SIDEBAR -->
|
<!-- SIDEBAR FIJA (escritorio) -->
|
||||||
<div class="sidebar text-white">
|
<div class="d-none d-md-block bg-dark text-white position-fixed h-100 pt-5" style="width: 250px;">
|
||||||
<nav class="nav flex-column">
|
<nav class="nav flex-column">
|
||||||
<a href="/IMPORTADORES/sistemas/alta_usuarios" class="nav-link px-3 py-2 <?= $_GET['url'] === 'sistemas/alta_usuarios' ? 'active' : '' ?>">👥 Usuarios</a>
|
<a href="/IMPORTADORES/sistemas/alta_usuarios" class="nav-link px-3 py-2 <?= $_GET['url'] === 'sistemas/alta_usuarios' ? 'active' : '' ?>">👥 Usuarios</a>
|
||||||
|
|
||||||
|
<a href="/IMPORTADORES/sistemas/agencias_activas" class="nav-link px-3 py-2 <?= $_GET['url'] === 'sistemas/agencias_activas' ? 'active' : '' ?>">🏪 Agencias</a>
|
||||||
|
|
||||||
<a href="/IMPORTADORES/sistemas/bitacora_login" class="nav-link px-3 py-2 <?= $_GET['url'] === 'sistemas/bitacora_login' ? 'active' : '' ?>">🕵️ Bitácora Accesos</a>
|
<a href="/IMPORTADORES/sistemas/bitacora_login" class="nav-link px-3 py-2 <?= $_GET['url'] === 'sistemas/bitacora_login' ? 'active' : '' ?>">🕵️ Bitácora Accesos</a>
|
||||||
|
|
||||||
<a href="/IMPORTADORES/sistemas/bitacora_usuarios" class="nav-link px-3 py-2 <?= $_GET['url'] === 'sistemas/bitacora_usuarios' ? 'active' : '' ?>">🛠️ Bitácora Usuarios</a>
|
<a href="/IMPORTADORES/sistemas/bitacora_usuarios" class="nav-link px-3 py-2 <?= $_GET['url'] === 'sistemas/bitacora_usuarios' ? 'active' : '' ?>">🛠️ Bitácora Usuarios</a>
|
||||||
@@ -33,3 +35,27 @@
|
|||||||
<a href="/IMPORTADORES/sistemas/logout" class="nav-link px-3 py-2 text-danger">🚪 Cerrar sesión</a>
|
<a href="/IMPORTADORES/sistemas/logout" class="nav-link px-3 py-2 text-danger">🚪 Cerrar sesión</a>
|
||||||
</nav>
|
</nav>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- OFFCANVAS PARA MÓVILES -->
|
||||||
|
<div class="offcanvas offcanvas-start d-md-none" tabindex="-1" id="sidebarMenu" style="top: 56px;">
|
||||||
|
<div class="offcanvas-header">
|
||||||
|
<h5 class="offcanvas-title">Menú</h5>
|
||||||
|
<button type="button" class="btn-close" data-bs-dismiss="offcanvas"></button>
|
||||||
|
</div>
|
||||||
|
<div class="offcanvas-body">
|
||||||
|
|
||||||
|
<!-- INICIO -->
|
||||||
|
<a href="/IMPORTADORES/sistemas/alta_usuarios" class="nav-link px-3 py-2 <?= $_GET['url'] === 'sistemas/alta_usuarios' ? 'active' : '' ?>">👥 Usuarios</a>
|
||||||
|
|
||||||
|
<a href="/IMPORTADORES/sistemas/agencias_activas" class="nav-link px-3 py-2 <?= $_GET['url'] === 'sistemas/agencias_activas' ? 'active' : '' ?>">🏪 Agencias</a>
|
||||||
|
|
||||||
|
<a href="/IMPORTADORES/sistemas/bitacora_login" class="nav-link px-3 py-2 <?= $_GET['url'] === 'sistemas/bitacora_login' ? 'active' : '' ?>">🕵️ Bitácora Accesos</a>
|
||||||
|
|
||||||
|
<a href="/IMPORTADORES/sistemas/bitacora_usuarios" class="nav-link px-3 py-2 <?= $_GET['url'] === 'sistemas/bitacora_usuarios' ? 'active' : '' ?>">🛠️ Bitácora Usuarios</a>
|
||||||
|
|
||||||
|
<a href="#" class="nav-link px-3 py-2">📦 Configuración</a>
|
||||||
|
|
||||||
|
<a href="/IMPORTADORES/sistemas/logout" class="nav-link px-3 py-2 text-danger">🚪 Cerrar sesión</a>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
Reference in New Issue
Block a user