-- ---------------------------------------------------------------------------
-- O irmao no PostgreSQL de `scripts/medir-debitos-em-dobro.sql` (07/11/2026, a fatia 101; a resposta 86 (a) do dono, o
-- D321): a CONSULTA que so le e lista, venda por venda, os debitos de fiado repetidos -- as copias abertas e fechadas,
-- os repetidos que nao sao copia e os primeiros que seguem abertos com uma copia ja fechada. As mesmas regras e a mesma
-- saida: leia o cabecalho do irmao (e o aviso de la: `primeiros_abertos_com_copia_fechada` e o numero de ANTES da
-- baixa).
--
--   psql -v ON_ERROR_STOP=1 -f postgres/medir-debitos-em-dobro.sql | tee /root/debitos-em-dobro-medir-pg-<data>.txt
--   docker exec -i franquiabv-postgres-1 sh -c 'psql -U "$POSTGRES_USER" -d <banco> -v ON_ERROR_STOP=1' \
--     < postgres/medir-debitos-em-dobro.sql
--
-- ONDE RODA: depois do corte, se a baixa da 86 (a) nao tiver rodado no MySQL da producao antes dele -- a carga
-- (`migrar-dados.sh`) traz os debitos como estao. Com a baixa feita no MySQL, conta as mesmas copias fechadas.
--
-- O INQUILINO E O DA BASE (o 1), como o `postgres/encerrar-pacotes-de-venda-cancelada.sql`: as tabelas tem RLS forcado.
-- Como superusuario o RLS nao vale e o roteiro le todos os inquilinos -- no corte, so ha o 1.
--
-- NAO ESCREVE NADA: so SELECT.
-- ---------------------------------------------------------------------------

SET app.inquilino_id = '1';

-- 1. O resumo.
WITH primeiros AS (
    SELECT venda, MIN(id) AS primeiro FROM clientes_debitos GROUP BY venda HAVING COUNT(*) > 1
), repetidos AS (
    SELECT d.id, d.venda, d.valor, d.status,
           CASE WHEN d.cliente = p.cliente AND d.unidade = p.unidade
                     AND CAST(d.valor AS DECIMAL(12,2)) = CAST(p.valor AS DECIMAL(12,2)) THEN 1 ELSE 0 END AS copia
      FROM primeiros f
      JOIN clientes_debitos p ON p.id = f.primeiro
      JOIN clientes_debitos d ON d.venda = f.venda AND d.id <> f.primeiro
)
SELECT COUNT(DISTINCT r.venda) AS vendas_com_debito_repetido,
       COALESCE(SUM(r.copia), 0) AS copias,
       COALESCE(SUM(CASE WHEN r.copia = 1 AND r.status = TRUE THEN 1 ELSE 0 END), 0) AS copias_abertas,
       ROUND(CAST(COALESCE(SUM(CASE WHEN r.copia = 1 AND r.status = TRUE THEN r.valor ELSE 0 END), 0) AS NUMERIC), 2) AS valor_das_copias_abertas,
       COALESCE(SUM(CASE WHEN r.copia = 1 AND r.status = FALSE THEN 1 ELSE 0 END), 0) AS copias_fechadas,
       ROUND(CAST(COALESCE(SUM(CASE WHEN r.copia = 1 AND r.status = FALSE THEN r.valor ELSE 0 END), 0) AS NUMERIC), 2) AS valor_das_copias_fechadas,
       COALESCE(SUM(1 - r.copia), 0) AS repetidos_que_nao_sao_copia,
       (SELECT COUNT(*) FROM primeiros f JOIN clientes_debitos p ON p.id = f.primeiro
         WHERE p.status = TRUE AND EXISTS (SELECT 1 FROM repetidos c WHERE c.venda = f.venda AND c.copia = 1 AND c.status = FALSE)) AS primeiros_abertos_com_copia_fechada,
       (SELECT ROUND(CAST(COALESCE(SUM(p.valor), 0) AS NUMERIC), 2) FROM primeiros f JOIN clientes_debitos p ON p.id = f.primeiro
         WHERE p.status = TRUE AND EXISTS (SELECT 1 FROM repetidos c WHERE c.venda = f.venda AND c.copia = 1 AND c.status = FALSE)) AS valor_dos_primeiros_abertos_com_copia_fechada
  FROM repetidos r;

-- 2. A lista, venda por venda.
SELECT d.venda, v.status AS status_da_venda, MIN(d.cliente) AS cliente, MIN(d.unidade) AS unidade,
       COUNT(*) AS debitos,
       SUM(CASE WHEN d.status = TRUE THEN 1 ELSE 0 END) AS abertos,
       SUM(CASE WHEN d.status = FALSE THEN 1 ELSE 0 END) AS fechados,
       string_agg(CONCAT(d.id, CASE WHEN d.status = TRUE THEN ':aberto:' ELSE ':fechado:' END, CAST(d.valor AS DECIMAL(12,2))),
                  ' ' ORDER BY d.id) AS os_debitos,
       COALESCE(SUM(q.quitacoes), 0) AS vendas_de_quitacao
  FROM clientes_debitos d
  JOIN vendas v ON v.id = d.venda
  LEFT JOIN (SELECT debito, COUNT(*) AS quitacoes FROM vendas WHERE debito IS NOT NULL GROUP BY debito) q ON q.debito = d.id
 WHERE d.venda IN (SELECT venda FROM clientes_debitos GROUP BY venda HAVING COUNT(*) > 1)
 GROUP BY d.venda, v.status
 ORDER BY d.venda;

-- 3. As copias abertas: o que a baixa (`postgres/baixar-debitos-em-dobro.sql`) fecharia.
WITH primeiros AS (
    SELECT venda, MIN(id) AS primeiro FROM clientes_debitos GROUP BY venda HAVING COUNT(*) > 1
)
SELECT d.id, d.venda, CAST(d.valor AS DECIMAL(12,2)) AS valor, d.data_criacao, d.data_alteracao
  FROM primeiros f
  JOIN clientes_debitos p ON p.id = f.primeiro
  JOIN clientes_debitos d ON d.venda = f.venda AND d.id <> f.primeiro
 WHERE d.status = TRUE AND d.cliente = p.cliente AND d.unidade = p.unidade
   AND CAST(d.valor AS DECIMAL(12,2)) = CAST(p.valor AS DECIMAL(12,2))
 ORDER BY d.id;
