-- 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]);