-- Consolidacion de movimientos de facturacion en una sola tabla

CREATE TABLE IF NOT EXISTS facturacion_comprobante_movimientos (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    comprobante_id BIGINT UNSIGNED NOT NULL,
    tipo_movimiento ENUM('PAGO','CUOTA') NOT NULL,
    numero_cuota INT UNSIGNED NULL,
    medio_pago_id BIGINT UNSIGNED NULL,
    fecha_movimiento DATE NULL,
    monto DECIMAL(14,2) NOT NULL DEFAULT 0,
    estado ENUM('PENDIENTE','PAGADO','ANULADO') NOT NULL DEFAULT 'PENDIENTE',
    referencia VARCHAR(150) NULL,
    observacion VARCHAR(255) NULL,
    created_by BIGINT UNSIGNED NULL,
    updated_by BIGINT UNSIGNED NULL,
    created_at DATETIME NOT NULL,
    updated_at DATETIME NULL,
    deleted_at DATETIME NULL,
    KEY idx_fact_mov_comprobante (comprobante_id),
    KEY idx_fact_mov_tipo (tipo_movimiento),
    KEY idx_fact_mov_estado (estado),
    KEY idx_fact_mov_medio (medio_pago_id),
    KEY idx_fact_mov_fecha (fecha_movimiento),
    UNIQUE KEY uq_fact_mov_comprobante_cuota (comprobante_id, tipo_movimiento, numero_cuota),
    CONSTRAINT fk_fact_mov_comprobante FOREIGN KEY (comprobante_id) REFERENCES facturacion_comprobantes(id),
    CONSTRAINT fk_fact_mov_medio FOREIGN KEY (medio_pago_id) REFERENCES catalogo_medios_pago(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT INTO facturacion_comprobante_movimientos
    (comprobante_id, tipo_movimiento, numero_cuota, medio_pago_id, fecha_movimiento, monto, estado, referencia, observacion, created_by, created_at)
SELECT
    p.comprobante_id,
    'PAGO',
    NULL,
    p.medio_pago_id,
    p.fecha_pago,
    p.monto,
    'PAGADO',
    p.referencia,
    p.observacion,
    p.created_by,
    p.created_at
FROM facturacion_comprobante_pagos p
LEFT JOIN facturacion_comprobante_movimientos m
    ON m.comprobante_id = p.comprobante_id
   AND m.tipo_movimiento = 'PAGO'
   AND m.medio_pago_id = p.medio_pago_id
   AND COALESCE(m.fecha_movimiento, '1000-01-01') = COALESCE(p.fecha_pago, '1000-01-01')
   AND COALESCE(m.monto, 0) = COALESCE(p.monto, 0)
WHERE p.deleted_at IS NULL
  AND m.id IS NULL;

INSERT INTO facturacion_comprobante_movimientos
    (comprobante_id, tipo_movimiento, numero_cuota, medio_pago_id, fecha_movimiento, monto, estado, observacion, created_by, created_at)
SELECT
    q.comprobante_id,
    'CUOTA',
    q.numero_cuota,
    NULL,
    q.fecha_vencimiento,
    q.monto,
    q.estado,
    q.observacion,
    q.created_by,
    q.created_at
FROM facturacion_comprobante_cuotas q
LEFT JOIN facturacion_comprobante_movimientos m
    ON m.comprobante_id = q.comprobante_id
   AND m.tipo_movimiento = 'CUOTA'
   AND m.numero_cuota = q.numero_cuota
WHERE q.deleted_at IS NULL
  AND m.id IS NULL;

DROP TABLE IF EXISTS facturacion_comprobante_pagos;
DROP TABLE IF EXISTS facturacion_comprobante_cuotas;
