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.