/**
 * VIEW: back.v_realizado_conta_mes_por_dia
 * 
 * Realizado agrupado por CONTA + MÊS + DIA (com acumulados)
 * Mesma lógica de árvore de contas da view v_realizado_conta_mes,
 * mas decompõe por dia e calcula valores acumulados.
 * 
 * Colunas:
 * - cdempresa: ID da empresa
 * - anoref: Ano (YYYY)
 * - mesref: Mês (1-12)
 * - diaref: Dia do mês (1-31)
 * - cdcontacontabil: ID da conta contábil (incluindo pais da árvore)
 * - valor_dia: Valor de movimento apenas daquele dia
 * - valor_acumulado: Valor acumulado ATÉ aquele dia (DENTRO DO MÊS)
 * - valor_acumulado_ano: Valor acumulado do ANO inteiro até aquele dia
 *   (de janeiro até o dia/mês especificado)
 * 
 * Exemplo de uso para comparação com período anterior:
 *   SELECT valor_acumulado, valor_acumulado_ano
 *     FROM back.v_realizado_conta_mes_por_dia
 *    WHERE cdempresa = 5
 *      AND anoref = 2025
 *      AND mesref = 1
 *      AND diaref = 22
 *      AND cdcontacontabil = 1;
 *   -- Retorna o acumulado de janeiro até dia 22 (mesref=1, diaref=22)
 *   -- e também o acumulado anual (que neste caso é igual pois é janeiro)
 */

CREATE OR REPLACE VIEW back.v_realizado_conta_mes_por_dia AS
WITH RECURSIVE 
    -- Base: realizado decompostos por dia e conta
    real_base AS (
        SELECT r.cdempresa,
               r.anoref,
               r.mesref,
               EXTRACT(DAY FROM r.dtmovimento)::int AS diaref,
               pc.cdcontacontabil AS cdconta_filho,
               SUM(
                   CASE
                       WHEN r.tpmovimento = 'C'::bpchar THEN r.valor
                       ELSE -r.valor
                   END
               ) AS valor_dia
          FROM back.realizado r
          JOIN back.planocontabil pc ON pc.cdcontacontabil = r.cdplanocontabil
         WHERE r.flcancelado = 0
         GROUP BY r.cdempresa, r.anoref, r.mesref, 
                  EXTRACT(DAY FROM r.dtmovimento), pc.cdcontacontabil
    ),
    -- Hierarquia: monta árvore de contas (mesma lógica que v_realizado_conta_mes)
    hier AS (
        SELECT pc.cdcontacontabil AS leaf,
               pc.cdcontacontabil AS node,
               pc.cdcontapai
          FROM back.planocontabil pc
        UNION ALL
        SELECT h_1.leaf,
               p.cdcontacontabil AS node,
               p.cdcontapai
          FROM hier h_1
          JOIN back.planocontabil p ON p.cdconta::text = h_1.cdcontapai::text
    ),
    -- Agrega por dia e conta (incluindo árvore)
    com_dia AS (
        SELECT rb.cdempresa,
               rb.anoref,
               rb.mesref,
               rb.diaref,
               h.node AS cdcontacontabil,
               SUM(rb.valor_dia) AS valor_dia
          FROM real_base rb
          JOIN hier h ON h.leaf = rb.cdconta_filho
         GROUP BY rb.cdempresa, rb.anoref, rb.mesref, rb.diaref, h.node
    )
-- Calcula acumulados: dentro do mês E acumulado do ano inteiro
SELECT cdempresa,
       anoref,
       mesref,
       diaref,
       cdcontacontabil,
       valor_dia,
       -- Acumulado DENTRO DO MÊS
       SUM(valor_dia) OVER (
           PARTITION BY cdempresa, anoref, mesref, cdcontacontabil
           ORDER BY diaref
           ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
       ) AS valor_acumulado,
       -- Acumulado DO ANO (janeiro até o dia/mês especificado)
       SUM(valor_dia) OVER (
           PARTITION BY cdempresa, anoref, cdcontacontabil
           ORDER BY mesref, diaref
           ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
       ) AS valor_acumulado_ano
  FROM com_dia
 ORDER BY cdempresa, anoref, mesref, cdcontacontabil, diaref;
