-- ============================================================
-- quoERP — Módulo Retenciones (Ecuador)
-- Migración: 017_retenciones.sql
-- Versión: 1.0.0 | Fecha: 2026-06-06
-- ============================================================
-- Comprobantes de retención emitidos (somos agentes de retención)
-- y recibidos (clientes nos retienen a nosotros).
-- Códigos SRI vigentes Ecuador 2025.
-- ============================================================

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ─────────────────────────────────────────────────────────────
-- TABLA: retention_types — Catálogo de tipos de retención SRI
-- company_id = NULL → tipos globales del sistema (seed)
-- company_id = N   → tipos personalizados por empresa
-- ─────────────────────────────────────────────────────────────
CREATE TABLE IF NOT EXISTS retention_types (
    id          INT UNSIGNED     NOT NULL AUTO_INCREMENT,
    company_id  INT UNSIGNED     DEFAULT NULL
        COMMENT 'NULL = tipo global/seed SRI',
    tax_type    ENUM('ir','iva') NOT NULL
        COMMENT 'ir = Impuesto a la Renta | iva = IVA',
    code        VARCHAR(10)      NOT NULL
        COMMENT 'Código SRI (ej: 303, 721)',
    name        VARCHAR(200)     NOT NULL,
    percentage  DECIMAL(6,2)     NOT NULL DEFAULT 0.00,
    is_active   TINYINT(1)       NOT NULL DEFAULT 1,
    created_at  DATETIME         NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (id),
    INDEX idx_tax_type  (tax_type),
    INDEX idx_company   (company_id),
    INDEX idx_active    (is_active)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ─────────────────────────────────────────────────────────────
-- TABLA: retention_vouchers — Comprobantes de retención
-- ─────────────────────────────────────────────────────────────
CREATE TABLE IF NOT EXISTS retention_vouchers (
    id               INT UNSIGNED                   NOT NULL AUTO_INCREMENT,
    company_id       INT UNSIGNED                   NOT NULL,
    voucher_type     ENUM('issued','received')      NOT NULL
        COMMENT 'issued = emitido a proveedor | received = recibido de cliente',
    number           VARCHAR(20)                    DEFAULT NULL
        COMMENT 'Número secuencial 001-001-000000001',
    date             DATE                           NOT NULL,
    -- Entidad (proveedor o cliente)
    entity_type      ENUM('supplier','customer')    NOT NULL,
    entity_id        INT UNSIGNED                   NOT NULL,
    entity_name      VARCHAR(200)                   NOT NULL  COMMENT 'Snapshot',
    entity_ruc       VARCHAR(20)                    DEFAULT NULL COMMENT 'Snapshot',
    -- Documento origen (factura de compra o venta)
    source_type      VARCHAR(30)                    DEFAULT NULL
        COMMENT 'purchase_order | sale_invoice',
    source_id        INT UNSIGNED                   DEFAULT NULL,
    source_number    VARCHAR(50)                    DEFAULT NULL COMMENT 'Número de la factura',
    source_date      DATE                           DEFAULT NULL,
    source_subtotal  DECIMAL(12,4)                  NOT NULL DEFAULT 0.0000 COMMENT 'Base IR',
    source_tax       DECIMAL(12,4)                  NOT NULL DEFAULT 0.0000 COMMENT 'IVA factura',
    -- Totales
    total_ir         DECIMAL(12,4)                  NOT NULL DEFAULT 0.0000,
    total_iva_ret    DECIMAL(12,4)                  NOT NULL DEFAULT 0.0000,
    total_retention  DECIMAL(12,4)                  NOT NULL DEFAULT 0.0000,
    -- Estado y trazabilidad
    status           ENUM('draft','issued','cancelled') NOT NULL DEFAULT 'draft',
    notes            TEXT                           DEFAULT NULL,
    journal_entry_id INT UNSIGNED                   DEFAULT NULL,
    created_by       INT UNSIGNED                   DEFAULT NULL,
    created_at       DATETIME                       NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at       DATETIME                       DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (id),
    INDEX idx_company      (company_id),
    INDEX idx_type         (voucher_type),
    INDEX idx_status       (status),
    INDEX idx_source       (source_type, source_id),
    INDEX idx_entity       (entity_type, entity_id),
    INDEX idx_date         (date)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ─────────────────────────────────────────────────────────────
-- TABLA: retention_voucher_lines — Líneas del comprobante
-- ─────────────────────────────────────────────────────────────
CREATE TABLE IF NOT EXISTS retention_voucher_lines (
    id                INT UNSIGNED     NOT NULL AUTO_INCREMENT,
    voucher_id        INT UNSIGNED     NOT NULL,
    retention_type_id INT UNSIGNED     NOT NULL,
    tax_type          ENUM('ir','iva') NOT NULL,
    code              VARCHAR(10)      NOT NULL  COMMENT 'Snapshot código SRI',
    name              VARCHAR(200)     NOT NULL  COMMENT 'Snapshot nombre',
    percentage        DECIMAL(6,2)     NOT NULL,
    base_amount       DECIMAL(12,4)    NOT NULL DEFAULT 0.0000,
    retention_amount  DECIMAL(12,4)    NOT NULL DEFAULT 0.0000,
    PRIMARY KEY (id),
    INDEX idx_voucher (voucher_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ─────────────────────────────────────────────────────────────
-- Secuencia de retenciones en sri_invoice_config
-- ─────────────────────────────────────────────────────────────
ALTER TABLE sri_invoice_config
    ADD COLUMN IF NOT EXISTS retention_seq INT UNSIGNED NOT NULL DEFAULT 0
        COMMENT 'Secuencia para comprobantes de retención emitidos';

-- ─────────────────────────────────────────────────────────────
-- Cuentas de retención en company_account_map
-- ─────────────────────────────────────────────────────────────
ALTER TABLE company_account_map
    ADD COLUMN IF NOT EXISTS acc_ir_ret_payable  INT UNSIGNED DEFAULT NULL
        COMMENT 'IR retenido por pagar al SRI (agente de retención)',
    ADD COLUMN IF NOT EXISTS acc_iva_ret_payable INT UNSIGNED DEFAULT NULL
        COMMENT 'IVA retenido por pagar al SRI',
    ADD COLUMN IF NOT EXISTS acc_ir_ret_credit   INT UNSIGNED DEFAULT NULL
        COMMENT 'Crédito tributario IR (retenciones recibidas de clientes)',
    ADD COLUMN IF NOT EXISTS acc_iva_ret_credit  INT UNSIGNED DEFAULT NULL
        COMMENT 'Crédito tributario IVA';

-- ─────────────────────────────────────────────────────────────
-- SEED: Tipos de retención SRI Ecuador (vigentes 2025)
-- ─────────────────────────────────────────────────────────────
INSERT IGNORE INTO retention_types (id, company_id, tax_type, code, name, percentage) VALUES
-- RETENCIÓN EN LA FUENTE — Impuesto a la Renta
(1,  NULL, 'ir',  '303', 'Honorarios y demás pagos por servicios profesionales',    10.00),
(2,  NULL, 'ir',  '304', 'Servicios donde predomina la mano de obra',                2.00),
(3,  NULL, 'ir',  '307', 'Servicios de publicidad y comunicación',                   1.00),
(4,  NULL, 'ir',  '308', 'Servicios de transporte privado de pasajeros',              1.00),
(5,  NULL, 'ir',  '309', 'Arrendamiento mercantil / Leasing',                         1.00),
(6,  NULL, 'ir',  '310', 'Arrendamiento de bienes inmuebles',                         8.00),
(7,  NULL, 'ir',  '312', 'Transferencia de bienes muebles de naturaleza corporal',   1.00),
(8,  NULL, 'ir',  '319', 'Seguros y reaseguros (prima neta)',                         1.00),
(9,  NULL, 'ir',  '320', 'Rendimientos financieros — intereses y descuentos',        2.00),
(10, NULL, 'ir',  '322', 'Otras compras de bienes — 1%',                              1.00),
(11, NULL, 'ir',  '323', 'Otros servicios — 2%',                                      2.00),
(12, NULL, 'ir',  '324', 'Otros servicios — 8%',                                      8.00),
(13, NULL, 'ir',  '325', 'Agencias de viaje — comisiones',                            1.00),
(14, NULL, 'ir',  '327', 'Honorarios a notarios y registradores',                    8.00),
(15, NULL, 'ir',  '332', 'Pago con tarjeta de débito/crédito emitida en Ecuador',    0.00),
(16, NULL, 'ir',  '340', 'Otras retenciones aplicables al 1%',                        1.00),
(17, NULL, 'ir',  '341', 'Otras retenciones aplicables al 2%',                        2.00),
(18, NULL, 'ir',  '342', 'Otras retenciones aplicables al 8%',                        8.00),
-- RETENCIÓN DE IVA
(20, NULL, 'iva', '721', 'Retención IVA 30% — bienes',                               30.00),
(21, NULL, 'iva', '723', 'Retención IVA 70% — servicios y arrendamiento inmuebles',  70.00),
(22, NULL, 'iva', '724', 'Retención IVA 100% — servicios profesionales y honorarios',100.00),
(23, NULL, 'iva', '725', 'Retención IVA 100% — liquidación de compras',              100.00);

SET FOREIGN_KEY_CHECKS = 1;

-- ─────────────────────────────────────────────────────────────
-- FIN DE MIGRACIÓN
-- Tablas nuevas: retention_types, retention_vouchers, retention_voucher_lines
-- ALTER: sri_invoice_config (retention_seq), company_account_map (4 cuentas)
-- ─────────────────────────────────────────────────────────────
