-- ============================================================
-- quoERP — Contabilización automática de ventas y compras
-- Migración: 009_accounting_auto_entries.sql
-- Versión: 1.0.0 | Fecha: 2026-06-05
-- ============================================================

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ─────────────────────────────────────────────────────────────
-- TABLA: company_account_map — Configuración de cuentas contables
-- Mapea cada evento de negocio a las cuentas del plan de cuentas.
-- Permite que la contabilización automática sepa a qué cuenta
-- débitar/acreditar para cada tipo de operación.
-- ─────────────────────────────────────────────────────────────
CREATE TABLE IF NOT EXISTS company_account_map (
    id          INT UNSIGNED    NOT NULL AUTO_INCREMENT,
    company_id  INT UNSIGNED    NOT NULL,

    -- ── Ventas ──────────────────────────────────────────────
    -- Cuenta a débitar cuando se emite una factura (cliente debe)
    acc_receivable      INT UNSIGNED DEFAULT NULL COMMENT '1.1.03.01 CxC Clientes',
    -- Cuenta a acreditar con los ingresos gravados IVA 12%
    acc_sales_iva12     INT UNSIGNED DEFAULT NULL COMMENT '4.1.01 Ventas IVA 12%',
    -- Cuenta a acreditar con los ingresos tarifa 0%
    acc_sales_iva0      INT UNSIGNED DEFAULT NULL COMMENT '4.1.02 Ventas 0%',
    -- Cuenta a acreditar con el IVA cobrado al cliente
    acc_iva_collected   INT UNSIGNED DEFAULT NULL COMMENT '2.1.03.01 IVA ventas por pagar',
    -- Cuenta del costo de ventas (al despachar)
    acc_cost_of_sales   INT UNSIGNED DEFAULT NULL COMMENT '5.1.01 Costo de mercaderías vendidas',
    -- Cuenta del inventario (al despachar se acredita)
    acc_inventory       INT UNSIGNED DEFAULT NULL COMMENT '1.1.06.01 Inventario mercaderías',

    -- ── Cobros ──────────────────────────────────────────────
    -- Cuenta bancaria predeterminada para cobros (se puede seleccionar por transacción)
    acc_bank_default    INT UNSIGNED DEFAULT NULL COMMENT '1.1.01.03 Bancos cuenta corriente',

    -- ── Compras ─────────────────────────────────────────────
    -- Cuenta a acreditar cuando se recibe una compra (proveedor nos debe cobrar)
    acc_payable         INT UNSIGNED DEFAULT NULL COMMENT '2.1.01.01 Proveedores nacionales',
    -- Cuenta de IVA recuperable en compras
    acc_iva_recoverable INT UNSIGNED DEFAULT NULL COMMENT '1.1.07.01 IVA crédito tributario',
    -- Cuenta de retenciones en la fuente aplicadas a proveedores
    acc_ret_fuente      INT UNSIGNED DEFAULT NULL COMMENT '2.1.03.02 Retenciones fuente por pagar',

    -- ── Gastos generales ────────────────────────────────────
    -- Cuenta de gasto por defecto (para OC sin producto específico)
    acc_general_expense INT UNSIGNED DEFAULT NULL COMMENT '5.3.22 Otros gastos administrativos',

    updated_at  DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

    PRIMARY KEY (id),
    UNIQUE KEY uq_company (company_id),

    CONSTRAINT fk_cam_company       FOREIGN KEY (company_id)        REFERENCES companies(id)         ON DELETE CASCADE,
    CONSTRAINT fk_cam_receivable    FOREIGN KEY (acc_receivable)    REFERENCES chart_of_accounts(id) ON DELETE SET NULL,
    CONSTRAINT fk_cam_sales12       FOREIGN KEY (acc_sales_iva12)   REFERENCES chart_of_accounts(id) ON DELETE SET NULL,
    CONSTRAINT fk_cam_sales0        FOREIGN KEY (acc_sales_iva0)    REFERENCES chart_of_accounts(id) ON DELETE SET NULL,
    CONSTRAINT fk_cam_iva_coll      FOREIGN KEY (acc_iva_collected) REFERENCES chart_of_accounts(id) ON DELETE SET NULL,
    CONSTRAINT fk_cam_cos           FOREIGN KEY (acc_cost_of_sales) REFERENCES chart_of_accounts(id) ON DELETE SET NULL,
    CONSTRAINT fk_cam_inv           FOREIGN KEY (acc_inventory)     REFERENCES chart_of_accounts(id) ON DELETE SET NULL,
    CONSTRAINT fk_cam_bank          FOREIGN KEY (acc_bank_default)  REFERENCES chart_of_accounts(id) ON DELETE SET NULL,
    CONSTRAINT fk_cam_payable       FOREIGN KEY (acc_payable)       REFERENCES chart_of_accounts(id) ON DELETE SET NULL,
    CONSTRAINT fk_cam_iva_rec       FOREIGN KEY (acc_iva_recoverable) REFERENCES chart_of_accounts(id) ON DELETE SET NULL,
    CONSTRAINT fk_cam_expense       FOREIGN KEY (acc_general_expense) REFERENCES chart_of_accounts(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
  COMMENT='Mapeo de eventos contables a cuentas del plan. Un registro por empresa.';

SET FOREIGN_KEY_CHECKS = 1;
