From a830e3a84ab7a355c0c70b5c91dd49557fd701e6 Mon Sep 17 00:00:00 2001
From: Alexeer
Date: Wed, 18 Jun 2025 13:10:45 -0600
Subject: [PATCH] Estructura multi-agencias
---
agencias.txt | 108 +++++++++++++++++++---
app/controllers/agencias.php | 2 +-
app/controllers/sistemas.php | 24 ++---
app/controllers/solicitud_importacion.php | 4 -
4 files changed, 104 insertions(+), 34 deletions(-)
diff --git a/agencias.txt b/agencias.txt
index 50c8771..a655797 100644
--- a/agencias.txt
+++ b/agencias.txt
@@ -1,4 +1,5 @@
-- 1. Tabla de Agencias Aduanales
+
CREATE TABLE [dbo].[agencias_aduanales](
[id_agencia] [int] IDENTITY(1,1) NOT NULL,
[nombre_agencia] [nvarchar](255) NOT NULL,
@@ -6,22 +7,39 @@ CREATE TABLE [dbo].[agencias_aduanales](
[direccion] [nvarchar](500) NULL,
[telefono] [nvarchar](20) NULL,
[email] [nvarchar](255) NULL,
+ [id_administrador] [int] NULL, -- Usuario administrador de la agencia
[activo] [bit] NOT NULL DEFAULT 1,
[creado_en] [datetime] NOT NULL DEFAULT GETDATE(),
[actualizado_en] [datetime] NULL,
+ [creado_por] [int] NULL, -- Super admin que creó la agencia
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
+-- Agregar foreign key para administrador de agencia
+
+ALTER TABLE [dbo].[agencias_aduanales]
+ADD CONSTRAINT [FK_agencias_administrador]
+FOREIGN KEY ([id_administrador]) REFERENCES [dbo].[usuarios_sistema]([id_usuario]);
+
+
+-- 2. Actualizar tipos de usuario válidos
+
+-- Los tipos de usuario ahora serán:
+
+-- 'super_admin' - Administrador del sistema completo
+-- 'admin_agencia' - Administrador de una agencia específica
+-- 'agente_aduanal' - Agente que trabaja para una agencia
+-- 'importador' - Cliente que puede trabajar con múltiples agencias
+
+-- Campos de auditoría para usuarios_sistema
ALTER TABLE [dbo].[usuarios_sistema]
-ADD CONSTRAINT [FK_usuarios_agencia]
-FOREIGN KEY ([id_agencia]) REFERENCES [dbo].[agencias_aduanales]([id_agencia]);
+ADD [actualizado_en] [datetime] NULL,
+ [creado_por] [int] NULL;
+
-- 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,
@@ -30,35 +48,101 @@ CREATE TABLE [dbo].[importador_agencia](
[fecha_vinculacion] [datetime] NOT NULL DEFAULT GETDATE(),
[fecha_desvinculacion] [datetime] NULL,
[creado_por] [int] NULL, -- ID del usuario que creó la relación
+ [aprobado_por] [int] NULL, -- Admin de agencia que aprobó la vinculación
+ [estado] [varchar](20) NOT NULL DEFAULT 'PENDIENTE', -- 'PENDIENTE', 'APROBADO', 'RECHAZADO'
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])
+ FOREIGN KEY ([creado_por]) REFERENCES [dbo].[usuarios_sistema]([id_usuario]),
+ CONSTRAINT [FK_importador_agencia_aprobador]
+ FOREIGN KEY ([aprobado_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,
+
+-- 4. Tabla de relación agente-agencia
+
+CREATE TABLE [dbo].[agente_agencia](
+ [id_relacion] INT IDENTITY(1,1) NOT NULL,
+ [id_agente] INT NOT NULL,
+ [id_agencia] INT NOT NULL,
+ [fecha_asignacion] DATETIME NOT NULL DEFAULT GETDATE(),
+ [activo] BIT NOT NULL DEFAULT 1,
+ [asignado_por] INT NULL, -- quien lo asignó (admin agencia o super admin)
+ CONSTRAINT [PK_agente_agencia] PRIMARY KEY CLUSTERED ([id_relacion]),
+ CONSTRAINT [FK_agente_agencia_usuario]
+ FOREIGN KEY ([id_agente]) REFERENCES [dbo].[usuarios_sistema]([id_usuario]),
+ CONSTRAINT [FK_agente_agencia_agencia]
+ FOREIGN KEY ([id_agencia]) REFERENCES [dbo].[agencias_aduanales]([id_agencia]),
+ CONSTRAINT [UQ_agente_activo]
+ UNIQUE ([id_agente]) WHERE [activo] = 1 -- evita duplicados activos
+);
+
+-- Índice único para evitar duplicados activos
+
+CREATE UNIQUE INDEX [IX_agente_agencia_unique]
+ON [dbo].[agente_agencia] ([id_agente], [id_agencia])
+WHERE [activo] = 1;
+
+
+-- 5. Tabla para solicitudes de vinculación de importadores
+
+CREATE TABLE [dbo].[solicitudes_vinculacion](
+ [id_solicitud] [int] IDENTITY(1,1) NOT NULL,
[id_importador] [int] NOT NULL,
+ [id_agencia] [int] NOT NULL,
+ [mensaje] [nvarchar](1000) NULL,
+ [estado] [varchar](20) NOT NULL DEFAULT 'PENDIENTE', -- 'PENDIENTE', 'APROBADA', 'RECHAZADA'
+ [fecha_solicitud] [datetime] NOT NULL DEFAULT GETDATE(),
+ [fecha_respuesta] [datetime] NULL,
+ [respondido_por] [int] NULL, -- Admin de agencia que respondió
+ [comentarios_respuesta] [nvarchar](1000) NULL,
+ CONSTRAINT [PK_solicitudes_vinculacion] PRIMARY KEY CLUSTERED ([id_solicitud] ASC),
+ CONSTRAINT [FK_solicitudes_importador]
+ FOREIGN KEY ([id_importador]) REFERENCES [dbo].[usuarios_sistema]([id_usuario]),
+ CONSTRAINT [FK_solicitudes_agencia]
+ FOREIGN KEY ([id_agencia]) REFERENCES [dbo].[agencias_aduanales]([id_agencia]),
+ CONSTRAINT [FK_solicitudes_respondido]
+ FOREIGN KEY ([respondido_por]) REFERENCES [dbo].[usuarios_sistema]([id_usuario])
+);
+
+
+-- 6. Tabla para auditoría de cambios de agencia
+
+CREATE TABLE [dbo].[historial_agencia](
+ [id_historial] [int] IDENTITY(1,1) NOT NULL,
+ [id_importador] [int] NULL,
+ [id_agente] [int] NULL,
[id_agencia_anterior] [int] NULL,
[id_agencia_nueva] [int] NULL,
- [accion] [varchar](50) NOT NULL, -- 'VINCULACION', 'DESVINCULACION', 'CAMBIO'
+ [accion] [varchar](50) NOT NULL, -- 'VINCULACION', 'DESVINCULACION'
[motivo] [nvarchar](500) NULL,
[realizado_por] [int] NOT NULL,
[fecha_cambio] [datetime] NOT NULL DEFAULT GETDATE(),
+ [datos_adicionales] [nvarchar](max) NULL, -- JSON con información adicional
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]);
\ No newline at end of file
+
+CREATE INDEX [IX_importador_agencia_estado] ON [dbo].[importador_agencia] ([estado], [activo]);
+
+CREATE INDEX [IX_agencias_activo] ON [dbo].[agencias_aduanales] ([activo]);
+
+CREATE INDEX [IX_agencias_administrador] ON [dbo].[agencias_aduanales] ([id_administrador]);
+
+CREATE INDEX [IX_solicitudes_estado] ON [dbo].[solicitudes_vinculacion] ([estado], [id_agencia]);
\ No newline at end of file
diff --git a/app/controllers/agencias.php b/app/controllers/agencias.php
index a7abefa..7072f0b 100644
--- a/app/controllers/agencias.php
+++ b/app/controllers/agencias.php
@@ -29,7 +29,7 @@ function alta()
include __DIR__ . '/../../views/agencias/.php';
}
-function alta_agente()
+function guardarAgente()
{
}
diff --git a/app/controllers/sistemas.php b/app/controllers/sistemas.php
index a48dd7a..5252620 100644
--- a/app/controllers/sistemas.php
+++ b/app/controllers/sistemas.php
@@ -1,16 +1,13 @@
Este es un mensaje automático generado por el sistema. Si no solicitaste esta acción, contacta al administrador.
- © " . date('Y') . " $siglas · Desarrollado por AduanaSoft
+ © " . date('Y') . " $siglas · Sistema Integral para Importadores de Hidrocarburos
@@ -260,8 +252,6 @@ function enviar_password() {
}
}
-
-
function bitacora_login() {
if (!($_SESSION['usuario_sistemas'] ?? false)) {
die("⚠️ No autorizado.");
@@ -294,4 +284,4 @@ function bitacora_usuarios() {
}
include __DIR__ . '/../../views/admin/bitacora_usuarios.php';
-}
+}
\ No newline at end of file
diff --git a/app/controllers/solicitud_importacion.php b/app/controllers/solicitud_importacion.php
index 7cd19cc..afb73d3 100644
--- a/app/controllers/solicitud_importacion.php
+++ b/app/controllers/solicitud_importacion.php
@@ -660,7 +660,6 @@ function actualizar() {
exit;
}
-
/** “Soft-delete” de una factura **/
function eliminar() {
if (!($_SESSION['usuario_id'] ?? false)) {
@@ -674,9 +673,6 @@ function eliminar() {
header('Location: /IMPORTADORES/solicitud_importacion/lista?deleted=ok'); exit;
}
-
-
-
function actualizar_masivo() {
header('Content-Type: application/json; charset=utf-8');