Files
MVE/agencias.txt
2025-06-18 13:10:45 -06:00

148 lines
6.1 KiB
Plaintext

-- 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,
[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)
);
-- 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 [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,
[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
[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]),
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 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'
[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_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]);