-- =====================================================
-- 01_tablas.sql - CREACIÓN DE TABLAS DEL MÓDULO DE TARJETAS
-- =====================================================
-- 
-- PROPÓSITO PRINCIPAL:
-- ====================
-- Crea la estructura fundamental de la base de datos para el módulo de tarjetas.
-- Este es el script MÁS IMPORTANTE y debe ejecutarse PRIMERO.
-- 
-- ¿PARA QUÉ SIRVE?
-- =================
-- 1. **ESTRUCTURA BASE**: Crea las 5 tablas principales del sistema
-- 2. **ALMACENAMIENTO**: Define dónde se guardarán todos los datos de tarjetas
-- 3. **RELACIONES**: Establece las relaciones entre lotes, tarjetas y facturas
-- 4. **AUDITORÍA**: Incluye tabla de log para registrar todas las operaciones
-- 
-- CUÁNDO EJECUTAR:
-- =================
-- ✅ **SIEMPRE PRIMERO** - Antes que cualquier otro script
-- ✅ **Para nueva instalación** del sistema
-- ✅ **Para reset completo** de la estructura
-- ❌ **No ejecutar si ya tienes datos importantes** (haz backup primero)
-- 
-- TABLAS CREADAS:
-- =================
-- 1. **tatarlot** - Lotes de tarjetas (grupos de tarjetas generadas)
-- 2. **tatarjeta** - Tarjetas individuales (cada tarjeta física)
-- 3. **tafactura** - Facturas (cabecera de facturación)
-- 4. **tafactura_d** - Detalle de facturas (tarjetas facturadas)
-- 5. **taproceso_log** - Log de auditoría (todas las operaciones)
-- 
-- ESTRUCTURA DE DATOS:
-- =================
-- **tatarlot** (Lotes):
-- - ctarlot: ID único del lote (PK)
-- - xnombre_lote: Nombre descriptivo del lote
-- - ccanalalt: Canal de venta (FK a macanalalt)
-- - cproducto: Tipo de seguro (FK a maproductos)
-- - fingreso: Fecha de creación
-- 
-- **tatarjeta** (Tarjetas):
-- - ctarjeta: ID único de tarjeta (PK)
-- - nro_tarjeta: Número físico de tarjeta (8 dígitos)
-- - xcodigo_unico: Código de activación (8 caracteres, ÚNICO)
-- - ctarlot: Lote al que pertenece (FK)
-- - iestado: 1=Activa, 0=Inactiva
-- - factivacion: Fecha cuando se activó la tarjeta
-- 
-- **tafactura** (Facturas):
-- - cfactura: ID único de factura (PK)
-- - nfactura: Número de factura (único)
-- - ffactura: Fecha de emisión
-- - mmonto: Monto total
-- - xarchivo_factura: Ruta del archivo PDF
-- 
-- **tafactura_d** (Detalle):
-- - cfactura_d: ID único del detalle (PK)
-- - cfactura: Factura padre (FK)
-- - ctarjeta: Tarjeta facturada (FK)
-- - ccedula_cliente: Cédula del cliente
-- - xnombre_cliente: Nombre completo
-- 
-- **taproceso_log** (Auditoría):
-- - ctaproceso_log: ID único del log (PK)
-- - ctarjeta: Tarjeta afectada (FK)
-- - xcodigo_tarjeta: Código de tarjeta
-- - itipo_accion: Tipo de operación (ACTIVAR, VALIDAR, etc.)
-- - xendpoint_api: Endpoint que se ejecutó
-- - fproceso: Fecha y hora del evento
-- 
-- REQUISITOS PREVIOS:
-- ====================
-- 1. **Base de datos**: Sis2000 (o la que especifiques en USE)
-- 2. **Permisos**: CREATE TABLE en la base de datos
-- 3. **Espacio**: Mínimo 100MB para empezar
-- 
-- RESULTADOS ESPERADOS:
-- ====================
-- ✅ **5 tablas creadas** con estructura completa
-- ✅ **Constraints** de llaves primarias
-- ✅ **Defaults** para fechas y estados
-- ✅ **Relaciones** listas para foreign keys
-- ✅ **Índices básicos** de PK
-- 
-- VALIDACIÓN POST-EJECUCIÓN:
-- ====================
-- -- Verificar tablas creadas:
-- SELECT name, create_date FROM sys.tables WHERE name LIKE 'ta%';
-- 
-- -- Verificar estructura:
-- sp_help 'tatarjeta';
-- sp_help 'tatarlot';
-- sp_help 'tafactura';
-- 
-- -- Verificar espacio usado:
-- EXEC sp_spaceused 'tatarjeta';
-- 
-- DEPENDENCIAS:
-- ====================
-- ❌ **Ninguna** - Este script no depende de otros
-- ✅ **Otros scripts dependen de este**:
--    - 02_stored_procedures.sql (necesita las tablas)
--    - 03_vistas.sql (necesita las tablas)
--    - 06_datos_iniciales.sql (necesita las tablas)
-- 
-- NOTAS IMPORTANTES:
-- ====================
-- - **IDEMPOTENTE**: Usa IF NOT EXISTS, es seguro ejecutar múltiples veces
-- - **BACKUP**: Haz backup antes de ejecutar en producción
-- - **TRANSACCIONES**: Cada tabla se crea individualmente
-- - **UTF-8**: Configurado para caracteres especiales (acentos, ñ)
-- 
-- =====================================================

USE [Sis2000]
GO

-- 1. Tabla de Lotes de Tarjetas
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'tatarlot')
BEGIN
    CREATE TABLE tatarlot (
        ctarlot INT IDENTITY(1,1) PRIMARY KEY,
        xnombre_lote VARCHAR(200) NOT NULL,
        ccanalalt INT,              -- FK to macanalalt
        cproducto CHAR(40),         -- FK to maproductos
        cplan CHAR(6),              -- Plan de seguro (FK to maplanes)
        cramos CHAR(6),             -- Ramo del plan (FK to maramos)
        fingreso DATETIME DEFAULT GETDATE(),
        cusuario VARCHAR(50)
    );
    PRINT 'Tabla tatarlot creada';
END
ELSE
    PRINT 'Tabla tatarlot ya existe';
GO

-- 2. Tabla de Tarjetas individuales
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'tatarjeta')
BEGIN
    CREATE TABLE tatarjeta (
        ctarjeta INT IDENTITY(1,1) PRIMARY KEY,
        nro_tarjeta VARCHAR(8) NOT NULL,
        xcodigo_unico VARCHAR(8) NOT NULL UNIQUE,
        ctarlot INT,                -- FK to tatarlot
        iestado INT DEFAULT 1,
        cpoliza VARCHAR(50),
        cnpoliza VARCHAR(50),
        fanopol SMALLINT,
        fmespol TINYINT,
        xfactura VARCHAR(50),       -- Número de factura del cliente
        xfoto_factura VARCHAR(250), -- Ruta del archivo de foto/comprobante
        factivacion DATETIME,
        fultmod DATETIME,
        cusuariomod VARCHAR(50),
        fingreso DATETIME DEFAULT GETDATE(),
        cusuario VARCHAR(50)
    );
    PRINT 'Tabla tatarjeta creada';
END
ELSE
    PRINT 'Tabla tatarjeta ya existe';
GO

-- 3. Tabla de Facturas (cabecera)
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'tafactura')
BEGIN
    CREATE TABLE tafactura (
        cfactura INT IDENTITY(1,1) PRIMARY KEY,
        ccanalt INT,
        nfactura VARCHAR(50) NOT NULL,
        ffactura DATE NOT NULL,
        mmonto DECIMAL(12,2),
        xarchivo_factura VARCHAR(500),
        iestado INT DEFAULT 1,
        fingreso DATETIME DEFAULT GETDATE(),
        cusuario VARCHAR(50)
    );
    PRINT 'Tabla tafactura creada';
END
ELSE
    PRINT 'Tabla tafactura ya existe';
GO

-- 4. Tabla de Facturas (detalle)
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'tafactura_d')
BEGIN
    CREATE TABLE tafactura_d (
        cfactura_d INT IDENTITY(1,1) PRIMARY KEY,
        cfactura INT,               -- FK to tafactura
        ctarjeta INT,               -- FK to tatarjeta
        ccedula_cliente VARCHAR(50),
        xnombre_cliente VARCHAR(200),
        ntelefono_cliente VARCHAR(20),
        fventa DATE,
        xsucursal_canal VARCHAR(250),
        fingreso DATETIME DEFAULT GETDATE(),
        cusuario VARCHAR(50)
    );
    PRINT 'Tabla tafactura_d creada';
END
ELSE
    PRINT 'Tabla tafactura_d ya existe';
GO

-- 5. Tabla de Log de Procesos
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'taproceso_log')
BEGIN
    CREATE TABLE taproceso_log (
        ctaproceso_log BIGINT IDENTITY(1,1) PRIMARY KEY,
        ctarjeta INT,
        xcodigo_tarjeta VARCHAR(8),
        ccanal INT,
        itipo_accion VARCHAR(20),
        xestado_proceso VARCHAR(10),
        xendpoint_api VARCHAR(200),
        xdatos_peticion VARCHAR(MAX),
        xdatos_respuesta VARCHAR(MAX),
        xmensaje_error VARCHAR(MAX),
        ncodigo_http INT,
        xdireccion_ip VARCHAR(45),
        fproceso DATETIME DEFAULT GETDATE()
    );
    PRINT 'Tabla taproceso_log creada';
END
ELSE
    PRINT 'Tabla taproceso_log ya existe';
GO

PRINT '=== 01_tablas.sql completado ===';
GO
