-- ---------------------------------------------------------------------------
-- O irmao no PostgreSQL de `scripts/baixar-debitos-em-dobro.sql` (07/11/2026, a fatia 101; a resposta 86 (a) do dono, o
-- D321): fecha so a copia ainda aberta dos debitos de fiado repetidos, com a marca da quitacao (`status` falso e
-- `data_alteracao`), a contagem antes e a lista com a data de antes. As mesmas regras, o mesmo porque e o mesmo
-- caminho de volta: leia o cabecalho do irmao.
--
--   psql -v ON_ERROR_STOP=1 -f postgres/baixar-debitos-em-dobro.sql | tee /root/debitos-em-dobro-baixar-pg-<data>.txt
--   docker exec -i franquiabv-postgres-1 sh -c 'psql -U "$POSTGRES_USER" -d <banco descartavel> -v ON_ERROR_STOP=1' \
--     < postgres/baixar-debitos-em-dobro.sql
--
-- ONDE RODA: depois do corte, so se a baixa nao tiver rodado no MySQL da producao antes dele (a 86 (a) e "agora"). Com
-- ela feita, a carga trouxe as copias fechadas, e este roteiro conta 0 e nao muda nada. NA COPIA franquiabv_dev NAO
-- RODA: so num banco descartavel.
--
-- O INQUILINO E O DA BASE (o 1); como superusuario o RLS nao vale -- no corte, so ha o 1. O UPDATE e a lista numa
-- transacao so, e o `now()` dela e o instante de todas.
--
-- PARA DESFAZER, pela lista guardada: `UPDATE clientes_debitos SET status = TRUE, data_alteracao = <a de antes> WHERE
-- id = <id>;` para cada linha dela.
-- ---------------------------------------------------------------------------

SET app.inquilino_id = '1';

-- 1. A contagem, antes.
SELECT COUNT(*) AS copias_abertas,
       ROUND(CAST(COALESCE(SUM(d.valor), 0) AS NUMERIC), 2) AS valor_das_copias_abertas,
       COUNT(DISTINCT d.venda) AS vendas,
       COUNT(DISTINCT d.cliente) AS clientes
  FROM (SELECT venda, MIN(id) AS primeiro FROM clientes_debitos GROUP BY venda HAVING COUNT(*) > 1) 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));

BEGIN;

-- 2. A lista do que vai ser fechado, com a data de antes (o caminho de volta).
SELECT d.id, d.venda, CAST(d.valor AS DECIMAL(12,2)) AS valor, d.data_alteracao AS data_alteracao_de_antes
  FROM (SELECT venda, MIN(id) AS primeiro FROM clientes_debitos GROUP BY venda HAVING COUNT(*) > 1) 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;

-- 3. A baixa: a marca da quitacao, o instante da transacao.
WITH fechadas AS (
    UPDATE clientes_debitos alvo
       SET status = FALSE, data_alteracao = now()
     WHERE alvo.id IN (SELECT d.id
                         FROM (SELECT venda, MIN(id) AS primeiro FROM clientes_debitos GROUP BY venda HAVING COUNT(*) > 1) 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)))
 RETURNING alvo.id
)
SELECT COUNT(*) AS fechadas_agora, now() AS instante FROM fechadas;

COMMIT;

-- 4. A conferencia. O esperado: 0 copias abertas.
SELECT COUNT(*) AS copias_abertas_depois
  FROM (SELECT venda, MIN(id) AS primeiro FROM clientes_debitos GROUP BY venda HAVING COUNT(*) > 1) 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));
