-- =============================================
-- Author:      System
-- Create date: 2025-12-31
-- Description: Generates the daily cash balance report (Arqueo de Caja)
--              Uses 'caja_chica_movimientos' table.
-- =============================================

CREATE OR REPLACE FUNCTION sp_reporte_arqueo_caja(p_fecha DATE)
RETURNS TABLE (
    saldo_inicial DECIMAL(12,2),
    total_ingresos DECIMAL(12,2),
    total_egresos DECIMAL(12,2),
    saldo_final_teorico DECIMAL(12,2),
    ingresos_efectivo DECIMAL(12,2),
    ingresos_cheque DECIMAL(12,2),
    ingresos_transferencia DECIMAL(12,2)
) AS $$
DECLARE
    v_saldo_inicial DECIMAL(12,2);
    v_total_ingresos DECIMAL(12,2);
    v_total_egresos DECIMAL(12,2);
BEGIN
    -- 1. Saldo Inicial (Todo lo anterior a p_fecha)
    -- Ingresos: APERTURA, REPOSICION, AUMENTO_FONDO
    -- Egresos: GASTO, DISMINUCION_FONDO
    SELECT COALESCE(SUM(
        CASE 
            WHEN tipo_movimiento IN ('APERTURA', 'REPOSICION', 'AUMENTO_FONDO') THEN monto 
            WHEN tipo_movimiento IN ('GASTO', 'DISMINUCION_FONDO') THEN -monto
            ELSE 0 
        END), 0)
    INTO v_saldo_inicial
    FROM caja_chica_movimientos
    WHERE fecha_movimiento < p_fecha;

    -- 2. Totales del Día
    SELECT 
        COALESCE(SUM(CASE WHEN tipo_movimiento IN ('APERTURA', 'REPOSICION', 'AUMENTO_FONDO') THEN monto ELSE 0 END), 0),
        COALESCE(SUM(CASE WHEN tipo_movimiento IN ('GASTO', 'DISMINUCION_FONDO') THEN monto ELSE 0 END), 0)
    INTO 
        v_total_ingresos, 
        v_total_egresos
    FROM caja_chica_movimientos
    WHERE fecha_movimiento = p_fecha;

    -- 3. Retornar
    saldo_inicial := v_saldo_inicial;
    total_ingresos := v_total_ingresos;
    total_egresos := v_total_egresos;
    saldo_final_teorico := v_saldo_inicial + v_total_ingresos - v_total_egresos;
    
    -- Asumimos todo es efectivo en Caja Chica por definición
    ingresos_efectivo := v_total_ingresos;
    ingresos_cheque := 0;
    ingresos_transferencia := 0;
    
    RETURN NEXT;
END;
$$ LANGUAGE plpgsql;
