244 lines
9.5 KiB
Plaintext
244 lines
9.5 KiB
Plaintext
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]); |