-- =====================================================================
--  SISCONTABLE / Facturación Electrónica SRI - Esquema Multi-Emisor
--  MySQL 8.0+ / MariaDB 10.5+  |  InnoDB  |  utf8mb4
--  Convención: aislamiento por contador_id (tenant) y por emisor_id.
-- =====================================================================


-- ---------------------------------------------------------------------
-- 1. PLANES COMERCIALES (incluye el plan Demo)
-- ---------------------------------------------------------------------
CREATE TABLE planes (
    id              INT UNSIGNED NOT NULL AUTO_INCREMENT,
    nombre          VARCHAR(80)  NOT NULL,
    precio          DECIMAL(10,2) NOT NULL DEFAULT 0.00,
    periodicidad    ENUM('DEMO','MENSUAL','ANUAL') NOT NULL DEFAULT 'MENSUAL',
    max_emisores    INT UNSIGNED NOT NULL DEFAULT 1,
    max_facturas_mes INT UNSIGNED NULL,            -- NULL = ilimitado
    dias_vigencia_demo SMALLINT UNSIGNED NULL,     -- 15, 30... (solo DEMO)
    limite_facturas_demo INT UNSIGNED NULL,        -- 10 (solo DEMO)
    marca_agua      TINYINT(1) NOT NULL DEFAULT 0, -- 1 = RIDE con watermark
    activo          TINYINT(1) NOT NULL DEFAULT 1,
    created_at      TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (id),
    KEY idx_planes_activo (activo)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ---------------------------------------------------------------------
-- 2. CONTADORES (tenant / usuario que inicia sesión)
-- ---------------------------------------------------------------------
CREATE TABLE contadores (
    id              BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    uuid            CHAR(36) NOT NULL,
    nombres         VARCHAR(150) NOT NULL,
    email           VARCHAR(150) NOT NULL,
    password_hash   VARCHAR(255) NOT NULL,          -- password_hash() BCRYPT/ARGON2
    telefono        VARCHAR(20)  NULL,
    rol             ENUM('SUPER_ADMIN','CONTADOR') NOT NULL DEFAULT 'CONTADOR',
    plan_id         INT UNSIGNED NULL,
    tipo_cuenta     ENUM('DEMO','ACTIVA','SUSPENDIDA') NOT NULL DEFAULT 'DEMO',
    demo_inicio     DATE NULL,
    demo_fin        DATE NULL,
    facturas_emitidas_demo INT UNSIGNED NOT NULL DEFAULT 0,
    ultimo_acceso   TIMESTAMP NULL,
    activo          TINYINT(1) NOT NULL DEFAULT 1,
    created_at      TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at      TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (id),
    UNIQUE KEY uq_contadores_email (email),
    UNIQUE KEY uq_contadores_uuid (uuid),
    KEY idx_contadores_tipo (tipo_cuenta),
    KEY fk_contadores_plan (plan_id),
    CONSTRAINT fk_contadores_plan FOREIGN KEY (plan_id)
        REFERENCES planes (id) ON UPDATE CASCADE ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ---------------------------------------------------------------------
-- 3. EMISORES (empresas / personas naturales que gestiona el contador)
--    El .p12 se guarda en disco fuera de public_html; aquí va la RUTA
--    y la clave cifrada con AES-256-GCM (la llave maestra vive en config).
-- ---------------------------------------------------------------------
CREATE TABLE emisores (
    id              BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    contador_id     BIGINT UNSIGNED NOT NULL,
    ruc             CHAR(13) NOT NULL,
    razon_social    VARCHAR(300) NOT NULL,
    nombre_comercial VARCHAR(300) NULL,
    dir_matriz      VARCHAR(300) NOT NULL,
    dir_establecimiento VARCHAR(300) NOT NULL,
    cod_establecimiento CHAR(3) NOT NULL DEFAULT '001',
    cod_punto_emision   CHAR(3) NOT NULL DEFAULT '001',
    obligado_contabilidad ENUM('SI','NO') NOT NULL DEFAULT 'NO',
    tipo_regimen    ENUM('RIMPE_POPULAR','RIMPE_EMPRENDEDOR','GENERAL','AGENTE_RETENCION')
                    NOT NULL DEFAULT 'GENERAL',
    contribuyente_especial VARCHAR(13) NULL,        -- número de resolución
    ambiente        ENUM('1','2') NOT NULL DEFAULT '1', -- 1=Pruebas 2=Producción
    tipo_emision    ENUM('1') NOT NULL DEFAULT '1',
    -- Firma electrónica
    p12_path        VARCHAR(255) NULL,              -- ruta fuera del webroot
    p12_pass_cipher VARBINARY(512) NULL,            -- AES-256-GCM ciphertext
    p12_pass_iv     VARBINARY(16)  NULL,
    p12_pass_tag    VARBINARY(16)  NULL,
    p12_expira      DATE NULL,                      -- vencimiento del certificado
    -- Notificaciones
    email_notificacion VARCHAR(150) NULL,
    logo_path       VARCHAR(255) NULL,
    activo          TINYINT(1) NOT NULL DEFAULT 1,
    created_at      TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at      TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (id),
    UNIQUE KEY uq_emisor_contador_ruc (contador_id, ruc),
    KEY idx_emisor_contador (contador_id),
    KEY idx_emisor_ruc (ruc),
    CONSTRAINT fk_emisor_contador FOREIGN KEY (contador_id)
        REFERENCES contadores (id) ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ---------------------------------------------------------------------
-- 4. SECUENCIALES (control de correlativos por emisor/estab/punto/tipo)
--    Se actualiza con SELECT ... FOR UPDATE para evitar duplicados.
-- ---------------------------------------------------------------------
CREATE TABLE secuenciales (
    id              BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    emisor_id       BIGINT UNSIGNED NOT NULL,
    cod_establecimiento CHAR(3) NOT NULL,
    cod_punto_emision   CHAR(3) NOT NULL,
    tipo_comprobante CHAR(2) NOT NULL DEFAULT '01', -- 01 factura, 04 NC, ...
    ultimo_secuencial INT UNSIGNED NOT NULL DEFAULT 0,
    PRIMARY KEY (id),
    UNIQUE KEY uq_secuencial (emisor_id, cod_establecimiento, cod_punto_emision, tipo_comprobante),
    CONSTRAINT fk_secuencial_emisor FOREIGN KEY (emisor_id)
        REFERENCES emisores (id) ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ---------------------------------------------------------------------
-- 5. CLIENTES (adquirentes) por emisor
-- ---------------------------------------------------------------------
CREATE TABLE clientes (
    id              BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    emisor_id       BIGINT UNSIGNED NOT NULL,
    tipo_identificacion CHAR(2) NOT NULL,  -- 04 RUC,05 Céd,06 Pasap,07 Cons.Final,08 Exterior
    identificacion  VARCHAR(20) NOT NULL,
    razon_social    VARCHAR(300) NOT NULL,
    direccion       VARCHAR(300) NULL,
    telefono        VARCHAR(20)  NULL,
    email           VARCHAR(150) NULL,
    activo          TINYINT(1) NOT NULL DEFAULT 1,
    created_at      TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (id),
    KEY idx_cliente_emisor (emisor_id),
    KEY idx_cliente_ident (emisor_id, identificacion),
    CONSTRAINT fk_cliente_emisor FOREIGN KEY (emisor_id)
        REFERENCES emisores (id) ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ---------------------------------------------------------------------
-- 6. PRODUCTOS / SERVICIOS por emisor
-- ---------------------------------------------------------------------
CREATE TABLE productos (
    id              BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    emisor_id       BIGINT UNSIGNED NOT NULL,
    codigo_principal VARCHAR(25) NOT NULL,
    codigo_auxiliar VARCHAR(25) NULL,
    descripcion     VARCHAR(300) NOT NULL,
    tipo            ENUM('BIEN','SERVICIO') NOT NULL DEFAULT 'BIEN',
    precio_unitario DECIMAL(14,6) NOT NULL DEFAULT 0,
    cod_impuesto    CHAR(1) NOT NULL DEFAULT '2',       -- 2 = IVA
    cod_porcentaje_iva CHAR(1) NOT NULL DEFAULT '4',    -- 0,4,5,6,7,8
    tiene_ice       TINYINT(1) NOT NULL DEFAULT 0,
    cod_ice         VARCHAR(5) NULL,
    activo          TINYINT(1) NOT NULL DEFAULT 1,
    created_at      TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (id),
    KEY idx_prod_emisor (emisor_id),
    KEY idx_prod_codigo (emisor_id, codigo_principal),
    CONSTRAINT fk_prod_emisor FOREIGN KEY (emisor_id)
        REFERENCES emisores (id) ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ---------------------------------------------------------------------
-- 7. FACTURAS (cabecera)
-- ---------------------------------------------------------------------
CREATE TABLE facturas (
    id              BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    emisor_id       BIGINT UNSIGNED NOT NULL,
    cliente_id      BIGINT UNSIGNED NOT NULL,
    clave_acceso    CHAR(49) NOT NULL,
    numero_comprobante VARCHAR(17) NOT NULL,   -- 001-001-000000001
    ambiente        ENUM('1','2') NOT NULL,
    tipo_emision    CHAR(1) NOT NULL DEFAULT '1',
    fecha_emision   DATE NOT NULL,
    -- Totales
    total_sin_impuestos DECIMAL(14,2) NOT NULL DEFAULT 0,
    total_descuento     DECIMAL(14,2) NOT NULL DEFAULT 0,
    base_0          DECIMAL(14,2) NOT NULL DEFAULT 0,
    base_5          DECIMAL(14,2) NOT NULL DEFAULT 0,
    base_15         DECIMAL(14,2) NOT NULL DEFAULT 0,
    base_no_objeto  DECIMAL(14,2) NOT NULL DEFAULT 0,
    base_exento     DECIMAL(14,2) NOT NULL DEFAULT 0,
    iva_5           DECIMAL(14,2) NOT NULL DEFAULT 0,
    iva_15          DECIMAL(14,2) NOT NULL DEFAULT 0,
    ice             DECIMAL(14,2) NOT NULL DEFAULT 0,
    propina         DECIMAL(14,2) NOT NULL DEFAULT 0,
    importe_total   DECIMAL(14,2) NOT NULL DEFAULT 0,
    moneda          VARCHAR(15) NOT NULL DEFAULT 'DOLAR',
    -- Estado / SRI
    estado          ENUM('CREADA','FIRMADA','ENVIADA','DEVUELTA','RECIBIDA',
                         'AUTORIZADA','NO_AUTORIZADA','ANULADA')
                    NOT NULL DEFAULT 'CREADA',
    numero_autorizacion VARCHAR(49) NULL,
    fecha_autorizacion  DATETIME NULL,
    mensajes_sri    TEXT NULL,                  -- JSON con identificador/mensaje
    xml_firmado_path   VARCHAR(255) NULL,
    xml_autorizado_path VARCHAR(255) NULL,
    ride_pdf_path   VARCHAR(255) NULL,
    es_demo         TINYINT(1) NOT NULL DEFAULT 0,
    created_at      TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at      TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (id),
    UNIQUE KEY uq_factura_clave (clave_acceso),
    KEY idx_factura_emisor_fecha (emisor_id, fecha_emision),
    KEY idx_factura_cliente (cliente_id),
    KEY idx_factura_estado (estado),
    CONSTRAINT fk_factura_emisor FOREIGN KEY (emisor_id)
        REFERENCES emisores (id) ON UPDATE CASCADE ON DELETE RESTRICT,
    CONSTRAINT fk_factura_cliente FOREIGN KEY (cliente_id)
        REFERENCES clientes (id) ON UPDATE CASCADE ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ---------------------------------------------------------------------
-- 8. DETALLE DE FACTURA (líneas)
-- ---------------------------------------------------------------------
CREATE TABLE factura_detalles (
    id              BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    factura_id      BIGINT UNSIGNED NOT NULL,
    producto_id     BIGINT UNSIGNED NULL,
    codigo_principal VARCHAR(25) NOT NULL,
    descripcion     VARCHAR(300) NOT NULL,
    cantidad        DECIMAL(14,6) NOT NULL,
    precio_unitario DECIMAL(14,6) NOT NULL,
    descuento       DECIMAL(14,2) NOT NULL DEFAULT 0,
    precio_total_sin_impuesto DECIMAL(14,2) NOT NULL,
    cod_impuesto    CHAR(1) NOT NULL DEFAULT '2',
    cod_porcentaje  CHAR(1) NOT NULL,
    tarifa          DECIMAL(5,2) NOT NULL,      -- 0, 5, 15
    base_imponible  DECIMAL(14,2) NOT NULL,
    valor_impuesto  DECIMAL(14,2) NOT NULL,
    PRIMARY KEY (id),
    KEY idx_detalle_factura (factura_id),
    CONSTRAINT fk_detalle_factura FOREIGN KEY (factura_id)
        REFERENCES facturas (id) ON UPDATE CASCADE ON DELETE CASCADE,
    CONSTRAINT fk_detalle_producto FOREIGN KEY (producto_id)
        REFERENCES productos (id) ON UPDATE CASCADE ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ---------------------------------------------------------------------
-- 9. FORMAS DE PAGO de la factura (Tabla 24 SRI: 01,16,19,20,...)
-- ---------------------------------------------------------------------
CREATE TABLE factura_pagos (
    id              BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    factura_id      BIGINT UNSIGNED NOT NULL,
    forma_pago      CHAR(2) NOT NULL,           -- 01,16,19,20
    total           DECIMAL(14,2) NOT NULL,
    plazo           INT UNSIGNED NULL,
    unidad_tiempo   VARCHAR(10) NULL,           -- dias / meses
    PRIMARY KEY (id),
    KEY idx_pago_factura (factura_id),
    CONSTRAINT fk_pago_factura FOREIGN KEY (factura_id)
        REFERENCES facturas (id) ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ---------------------------------------------------------------------
-- 10. INFORMACIÓN ADICIONAL (campoAdicional)
-- ---------------------------------------------------------------------
CREATE TABLE factura_info_adicional (
    id              BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    factura_id      BIGINT UNSIGNED NOT NULL,
    nombre          VARCHAR(50) NOT NULL,
    valor           VARCHAR(300) NOT NULL,
    PRIMARY KEY (id),
    KEY idx_info_factura (factura_id),
    CONSTRAINT fk_info_factura FOREIGN KEY (factura_id)
        REFERENCES facturas (id) ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ---------------------------------------------------------------------
-- 11. BITÁCORA DE ENVÍOS AL SRI (recepción + autorización)
-- ---------------------------------------------------------------------
CREATE TABLE sri_transacciones (
    id              BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    factura_id      BIGINT UNSIGNED NOT NULL,
    fase            ENUM('RECEPCION','AUTORIZACION') NOT NULL,
    estado_respuesta VARCHAR(30) NULL,          -- RECIBIDA/DEVUELTA/AUTORIZADO/...
    respuesta_xml   MEDIUMTEXT NULL,
    created_at      TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (id),
    KEY idx_sritx_factura (factura_id),
    CONSTRAINT fk_sritx_factura FOREIGN KEY (factura_id)
        REFERENCES facturas (id) ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ---------------------------------------------------------------------
-- 12. CATÁLOGO DE IVA (referencia; se puede seedear/validar contra ficha)
-- ---------------------------------------------------------------------
CREATE TABLE cat_iva (
    cod_porcentaje  CHAR(1) NOT NULL,
    tarifa          DECIMAL(5,2) NOT NULL,
    descripcion     VARCHAR(60) NOT NULL,
    vigente         TINYINT(1) NOT NULL DEFAULT 1,
    PRIMARY KEY (cod_porcentaje)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO cat_iva (cod_porcentaje, tarifa, descripcion, vigente) VALUES
    ('0', 0.00, 'IVA 0%', 1),
    ('4', 15.00,'IVA 15%', 1),
    ('5', 5.00, 'IVA 5% (vivienda interés social)', 1),
    ('6', 0.00, 'No objeto de impuesto', 1),
    ('7', 0.00, 'Exento de IVA', 1),
    ('8', 8.00, 'IVA 8% (turismo, feriados)', 1),
    ('2', 12.00,'IVA 12% (histórico)', 0),
    ('3', 14.00,'IVA 14% (histórico)', 0);

-- Planes base (Demo + comercial)
INSERT INTO planes (nombre, precio, periodicidad, max_emisores, max_facturas_mes,
                    dias_vigencia_demo, limite_facturas_demo, marca_agua, activo) VALUES
    ('Demo 15 días', 0.00, 'DEMO', 1, NULL, 15, 10, 1, 1),
    ('Profesional',  15.00,'MENSUAL', 10, NULL, NULL, NULL, 0, 1),
    ('Firma',        39.00,'MENSUAL', 50, NULL, NULL, NULL, 0, 1);

-- ---------------------------------------------------------------------
-- 13. SUPER ADMIN inicial
--    Usuario: cplazagranda@janickec.com / Clave: e3QyvyKT (BCRYPT)
--    Cambia la clave desde /usuarios apenas inicies sesión la primera vez.
-- ---------------------------------------------------------------------
INSERT INTO contadores (uuid, nombres, email, password_hash, rol, tipo_cuenta, activo) VALUES
    (UUID(), 'Carlos Plazagranda', 'cplazagranda@janickec.com',
     '$2y$12$GPZYEaII6B0OuVMRLTWbRujCE82Y1cAWpfkqw9HVeQStPlvriZfie',
     'SUPER_ADMIN', 'ACTIVA', 1);

