Sistemas -- Administrador General INSERT INTO [Importaciones_HC].[dbo].[usuarios_sistema] ([nombre], [email], [password_hash], [tipo_usuario], [activo], [creado_en], [dos_factores], [notificaciones], [notificaciones_extra]) VALUES ( '4a77Tj9XtOCnvkUrxuxLCg==', -- nombre encriptado 'QVaqkaWSvUtgAfKN51JNDkoyUiZGVQs3+ARpoGtdD/I=', -- email encriptado '$2y$10$.8CI5zuJ6MICQRRGqksYjOyuIYnln4xgUKJiQkZdEpLWfvUpg1f9m', -- password hash bcrypt 'super_admin', 1, GETDATE(), 0, 0, 0 ); CREATE TABLE solicitudes_agencias( [request_id] [int] IDENTITY(1,1) NOT NULL, [agencia_name] [varchar](255) NULL, [rfc] [varchar](100) NULL, [email] [varchar](255) NULL, [phone] [varchar](20) NULL, [direccion] [varchar](100) NULL, [opinion_file] [varchar](500) NULL, [admin_name] [varchar](255) NULL, [admin_email] [varchar](255) NULL, [request_status] [varchar](20) NULL, [request_date] [datetime] NULL, [approval_date] [datetime] NULL, [approved_by] [int] NULL, [timestamp_request] [timestamp] NOT NULL ); -- 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]); CREATE TABLE [dbo].[credenciales_db_agencias] ( [id_credencial] INT IDENTITY(1,1) NOT NULL, [id_agencia] INT NOT NULL, [db_instance] NVARCHAR(255) NOT NULL, [db_ip] NVARCHAR(50) NOT NULL, [db_user] NVARCHAR(100) NOT NULL, [db_password] NVARCHAR(255) NOT NULL, -- Considera encriptar o manejar de forma segura [db_port] INT NOT NULL DEFAULT 1433, -- Default SQL Server port [creado_en] DATETIME NOT NULL DEFAULT GETDATE(), [actualizado_en] DATETIME NULL, CONSTRAINT [PK_credenciales_db_agencias] PRIMARY KEY CLUSTERED ([id_credencial] ASC), CONSTRAINT [FK_credenciales_db_agencia] FOREIGN KEY ([id_agencia]) REFERENCES [dbo].[agencias_aduanales]([id_agencia]) ); CREATE UNIQUE INDEX [IX_credenciales_db_agencias_id_agencia] ON [dbo].[credenciales_db_agencias]([id_agencia]); -- 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 [creado_por] [int] NULL; -- 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; -- 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]) ); -- Luego creas el índice filtrado: CREATE UNIQUE INDEX [UQ_agente_activo] ON [dbo].[agente_agencia]([id_agente]) WHERE [activo] = 1; -- Índice único para evitar duplicados activos CREATE UNIQUE INDEX [IX_agente_agencia_unique] ON [dbo].[agente_agencia] ([id_agente], [id_agencia]) WHERE [activo] = 1; -- 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]) ); -- Tabla para auditoría de cambios de agencia CREATE TABLE [dbo].[bitacora_agencias]( [id_bitacora] [int] IDENTITY(1,1) NOT NULL, [id_agencia] [int] NULL, [nombre] [varchar](100) NULL, [accion] [varchar](50) NOT NULL, -- 'CREACION', 'DESACTIVACION' [realizado_por] [int] NOT NULL, [fecha] [datetime] NOT NULL DEFAULT GETDATE(), CONSTRAINT [PK_bitacora_agenciaS] PRIMARY KEY CLUSTERED ([id_bitacora] ASC) ); ALTER TABLE [dbo].[bitacora_agencias] ADD CONSTRAINT [FK_bitacora_agencias_agencia] FOREIGN KEY ([id_agencia]) REFERENCES [dbo].[agencias_aduanales]([id_agencia]); ALTER TABLE [dbo].[bitacora_agencias] ADD CONSTRAINT [FK_bitacora_agencias_administrador] FOREIGN KEY ([realizado_por]) REFERENCES [dbo].[usuarios_sistema]([id_usuario]); ALTER TABLE [dbo].[bitacora_agencias] ADD CONSTRAINT [CK_bitacora_agencias_accion] CHECK ([accion] IN ('CREACION', 'DESACTIVACION')); -- Índices adicionales para mejorar rendimiento 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]); == MODIFICACIONES MULLTI-AGENCIA == ALTER TABLE usuarios_sistema ADD id_agencia_en_uso INT NULL; ALTER TABLE usuarios_sistema ADD CONSTRAINT FK_usuario_agencia_uso FOREIGN KEY (id_agencia_en_uso) REFERENCES agencias_aduanales(id_agencia); -- 1. Modificar la tabla de solicitudes para incluir la relación con agencia ALTER TABLE [dbo].[solicitud_importacion_factura] ADD [id_agencia] [int] NULL; -- Agregar foreign key para la agencia ALTER TABLE [dbo].[solicitud_importacion_factura] ADD CONSTRAINT [FK_solicitud_agencia] FOREIGN KEY ([id_agencia]) REFERENCES [dbo].[agencias_aduanales]([id_agencia]); -- 2. Crear índices para mejorar el rendimiento CREATE INDEX [IX_solicitud_importador_agencia] ON [dbo].[solicitud_importacion_factura] ([id_importador], [id_agencia]); CREATE INDEX [IX_solicitud_agencia_status] ON [dbo].[solicitud_importacion_factura] ([id_agencia], [status]); -- 3. Agregar campos adicionales a la tabla expediente_archivos existente para mejor control ALTER TABLE [dbo].[expediente_archivos] ADD [estado_archivo] [varchar](20) NULL DEFAULT 'ACTIVO', -- ACTIVO, INACTIVO, ELIMINADO [subido_por] [int] NULL, -- ID del usuario que subió el archivo [observaciones] [nvarchar](500) NULL, [fecha_modificacion] [datetime] NULL; -- Agregar foreign key para el usuario que subió el archivo ALTER TABLE [dbo].[expediente_archivos] ADD CONSTRAINT [FK_expediente_archivos_usuario] FOREIGN KEY ([subido_por]) REFERENCES [dbo].[usuarios_sistema]([id_usuario]);