-- ---------------------------------------------------------------------------
-- Os debitos de fiado criados em dobro pelo PDV antigo: a BAIXA, que fecha so a copia ainda aberta (07/11/2026, a
-- fatia 101, FINALIZAR-E-CANCELAR-SEM-DINHEIRO-EM-DOBRO; a resposta 86 (a) do dono, o D321: "a baixa fecha so a copia
-- ainda aberta, sem venda nem caixa").
--
--   mysql franquia_producao < baixar-debitos-em-dobro.sql | tee /root/debitos-em-dobro-baixar-<data>.txt
--   docker compose exec -T mysql mysql -uroot -proot <banco descartavel> < scripts/baixar-debitos-em-dobro.sql
--
-- RODE ANTES A CONSULTA (`medir-debitos-em-dobro.sql`) e guarde a saida: ela tem o numero que vai ao dono e as copias
-- ja fechadas, que esta baixa nao toca. Na producao, o arquivo copiado para o servidor (a arvore de la e a antiga). NA
-- COPIA franquiabv_dev NAO RODA: so a consulta; a baixa, num banco descartavel, para ensaiar.
--
-- A COPIA E A DA CONSULTA: o debito de uma venda que tem mais de um, que nao e o primeiro dela (o menor id) e que
-- repete o primeiro no cliente, na unidade e no valor, ate o centavo. A BAIXA FECHA SO A COPIA ABERTA: `status`
-- falso e a `data_alteracao` (o mesmo instante em todas) -- a marca da quitacao, e nada mais. O primeiro debito de cada
-- venda fica como esta, aberto ou fechado; a copia ja fechada (talvez paga em dobro) fica; o repetido que difere do
-- primeiro fica. NAO TOCA a venda, o caixa, o credito nem os pontos. SEM `DELETE`, sem coluna nova.
--
-- O PRIMEIRO QUE CONTINUA ABERTO COM UMA COPIA JA FECHADA NAO E FECHADO AQUI: a copia foi paga e o primeiro ainda
-- cobra a mesma venda -- quem o quitar paga duas vezes --, mas ele nao e a copia, e a 86 (a) nao fala dele (ela fala
-- da copia aberta, que esta baixa fecha, e da copia ja paga, que fica para depois). A consulta o conta
-- (`primeiros_abertos_com_copia_fechada`; na copia local de agosto, 3, R$ 149,50), e o que fazer com ele e do dono:
-- a pergunta foi ao lote em 07/11/2026 (TELAS-RESTANTES [vendas], D321). Ate a resposta, ele fica como esta.
--
-- A CONTAGEM VEM ANTES DO UPDATE, e a LISTA com a `data_alteracao` de antes: o `tee` da linha de cima a guarda, e e o
-- caminho de volta exato.
--
-- IDEMPOTENTE: rodada de novo, nao acha copia aberta, e as fechadas na primeira vez ficam com a data delas. Se o PDV
-- antigo criar copia nova depois (a corrida que o codigo novo fecha so no corte), rodar de novo fecha so ela.
--
-- PARA DESFAZER, pela lista guardada: `UPDATE clientes_debitos SET status = 1, data_alteracao = <a de antes> WHERE
-- id = <id>;` para cada linha dela.
-- ---------------------------------------------------------------------------

-- 1. A contagem, antes.
SELECT COUNT(*) AS copias_abertas,
       ROUND(COALESCE(SUM(d.valor), 0), 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));

-- 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, um instante so. O `DISTINCT` faz o MySQL materializar a lista antes do UPDATE (a
--    mesma tabela nos dois lados).
SET @instante = NOW();

UPDATE clientes_debitos alvo
  JOIN (SELECT DISTINCT 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))) copia ON copia.id = alvo.id
   SET alvo.status = FALSE, alvo.data_alteracao = @instante;

SELECT ROW_COUNT() AS fechadas_agora, @instante AS instante;

-- 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));
