-- ---------------------------------------------------------------------------
-- O CONSUMO DOS CLIENTES REFEITO UMA VEZ, no corte (04/11/2026, a CA7 da Carteira, a fatia 76o; a resposta 295 (a) do
-- dono, o D698: "uma vez, no corte, o total de todos os clientes e refeito pelas comandas finalizadas (muda o numero
-- guardado, nao apaga nada), e a rotina passa a refaze-lo tambem quando uma comanda e cancelada").
--
--   mysql franquia_producao < /var/www/franquiabv.com.br/public_html/scripts/refazer-consumo-dos-clientes.sql | tee /root/refazer-consumo-<data>.txt; echo "o mysql saiu com ${PIPESTATUS[0]}"
--   docker compose exec -T mysql mysql -uroot -proot <banco descartavel> < scripts/refazer-consumo-dos-clientes.sql
--
-- POR QUE. A coluna `clientes.consumo` e o total das vendas finalizadas do cliente na rede, desde sempre (o
-- `VendaRepository::selecionarConsumoPorCliente`: o `SUM(valor_total)` das vendas de `status` 1, nulo sem nenhuma), e
-- quem a le e o filtro de consumo do Clientes antigo, o das Campanhas e o da Carteira. Ate a CA7 so a rotina da 01:10
-- (`CronJobService::clientesAtualizarConsumo`) a escrevia, e so para quem veio nos dois ultimos dias: a venda cancelada
-- depois nao saia da soma, e quem nao voltou ficou com o numero de antes. Na copia, em 04/11/2026, so por SELECT, 9.184
-- clientes mudam por este roteiro (a 76p, com a 303 (a)): os 4.707 da 76o (os 4.477 ativos do D698, e 230 entre os
-- inativos e os dois sentinelas; nove deles sem venda e com valor, que vao a zero) e os 4.477 nulos de quem nunca
-- comprou, que vao a zero (3.508 ativos); 7.985 ativos ao todo. A rotina nova refaz tambem quem teve venda cancelada, pelo `cancelado_em`; o
-- cancelamento de antes da fatia 70 nao tem o instante, e e este roteiro que o conserta.
--
-- A REGUA E A DO D698: MAIS DE 1 CENTAVO, EM CENTAVOS INTEIROS (`ROUND(x * 100)`). A coluna e a soma sao `double`; a
-- soma em ponto flutuante muda na ultima casa entre rodadas no PostgreSQL (4.727 e 4.728 pela diferenca em qualquer
-- centavo), e a primeira contagem do D698 achou um cliente com 0,010000000000000002 de diferenca. Ate 1 centavo, o
-- cliente fica como esta.
--
-- O NULO VAI A ZERO, TAMBEM O DE QUEM NUNCA COMPROU (04/11/2026, a fatia 76p; a resposta 303 (a) do dono ao D707, "zero
-- nos dois": quem nao tem compra finalizada fica com o consumo zero, pela rotina da 01:10 e por este roteiro, como o
-- cadastro novo ja nasce). Todo nulo muda (o `c.consumo IS NULL` no `WHERE`): o de quem tem venda para a soma, o de quem
-- nunca comprou para zero (o `COALESCE(soma, 0)`); o valor SEM venda tambem vai a zero. Na 76o o nulo sem venda ficava
-- nulo (comparava como zero com a soma vazia); a rotina gravava o nulo e este roteiro o zero, e o filtro antigo pos o
-- zero em "ate R$ X" e deixava o nulo fora. Agora, depois do corte, ninguem fica com o nulo, e a rotina (o
-- `selecionarConsumoPorCliente`, `?? 0`) nao volta a grava-lo. TODOS OS CLIENTES, ativos e inativos, e os dois
-- sentinelas (ids 1 e 2), como a rotina faria se todos viessem. SO A COLUNA `consumo`: sem `DELETE`, sem coluna nova,
-- nenhuma outra coluna da linha.
--
-- ONDE RODA: no passo 7 da etapa 1, depois da troca do codigo e logo depois dos pacotes de venda cancelada, com a
-- aplicacao em manutencao (`docs/procedimento-de-corte-etapa-1.md`): ninguem vende nem cancela no meio, e o codigo novo
-- no lugar ja refaz quem cancelar depois. NAO no laco do passo 0: muda dado, e o passo 0 e so esquema (a 83 (a)). Na
-- etapa 2 a carga leva o numero refeito ao PostgreSQL, e nao ha irmao em `postgres/`. NA COPIA franquiabv_dev NAO RODA:
-- so num banco descartavel, para ensaiar.
--
-- A CONTAGEM VEM ANTES DO UPDATE, para quem opera ler o numero da producao: quantos mudam, quantos ficam acima e abaixo
-- da soma, quantos estao com zero e tem venda, quantos com o nulo e venda, quantos sem venda com valor, e quantos dos que
-- mudam sao ativos; e quantos nulos tem a soma das finalizadas ate 1 centavo (`nulos_ate_1_centavo`: estao em `mudam`,
-- nem acima nem abaixo da soma, e `mudam` e `acima_da_soma` + `abaixo_da_soma` + `nulos_ate_1_centavo`). Quase todos
-- nunca compraram e vao a zero (4.477 na copia); o nulo que so comprou ate 1 centavo vai a essa soma, 0,01 ou zero (na
-- copia, nenhum). Na 76o era `nulos_sem_venda_que_ficam`, fora de `mudam`. NAO E PONTO DE PARADA: a resposta e refazer
-- todos.
--
-- A LISTA, ANTES DO UPDATE: cada cliente que muda, com o numero de antes e o novo (so o id e os dois numeros: nenhum
-- nome, telefone nem e-mail). O `tee` da linha de cima a guarda; e o caminho de volta exato.
--
-- IDEMPOTENTE: depois do UPDATE a coluna e a soma, e a segunda rodada nao acha ninguem. A conferencia no fim: 0.
--
-- PARA DESFAZER, pela lista guardada: `UPDATE clientes SET consumo = <o de antes> WHERE id = <id>;` para cada linha
-- dela (o `NULL` de antes volta como `NULL`). Numa volta ao codigo antigo, o numero refeito FICA: o antigo le a mesma
-- coluna, e a rotina de la a refaz para quem vem, como sempre.
-- ---------------------------------------------------------------------------

-- 1. A contagem, antes.
SELECT COALESCE(SUM(CASE WHEN c.consumo IS NULL OR ABS(ROUND(COALESCE(c.consumo, 0) * 100) - ROUND(COALESCE(s.soma, 0) * 100)) > 1 THEN 1 ELSE 0 END), 0) AS mudam,
       COALESCE(SUM(CASE WHEN ROUND(COALESCE(c.consumo, 0) * 100) - ROUND(COALESCE(s.soma, 0) * 100) > 1 THEN 1 ELSE 0 END), 0) AS acima_da_soma,
       COALESCE(SUM(CASE WHEN ROUND(COALESCE(s.soma, 0) * 100) - ROUND(COALESCE(c.consumo, 0) * 100) > 1 THEN 1 ELSE 0 END), 0) AS abaixo_da_soma,
       COALESCE(SUM(CASE WHEN c.consumo = 0 AND ROUND(COALESCE(s.soma, 0) * 100) > 1 THEN 1 ELSE 0 END), 0) AS com_zero_e_venda,
       COALESCE(SUM(CASE WHEN c.consumo IS NULL AND ROUND(COALESCE(s.soma, 0) * 100) > 1 THEN 1 ELSE 0 END), 0) AS com_nulo_e_venda,
       COALESCE(SUM(CASE WHEN s.soma IS NULL AND ABS(ROUND(COALESCE(c.consumo, 0) * 100)) > 1 THEN 1 ELSE 0 END), 0) AS sem_venda_com_valor,
       COALESCE(SUM(CASE WHEN c.status = TRUE AND (c.consumo IS NULL OR ABS(ROUND(COALESCE(c.consumo, 0) * 100) - ROUND(COALESCE(s.soma, 0) * 100)) > 1) THEN 1 ELSE 0 END), 0) AS ativos_que_mudam,
       COALESCE(SUM(CASE WHEN c.consumo IS NULL AND ABS(ROUND(COALESCE(s.soma, 0) * 100)) <= 1 THEN 1 ELSE 0 END), 0) AS nulos_ate_1_centavo
  FROM clientes c
  LEFT JOIN (SELECT v.cliente, SUM(v.valor_total) AS soma FROM vendas v WHERE v.status = 1 GROUP BY v.cliente) s ON s.cliente = c.id;

-- 2. A lista do que muda, com o numero de antes (o caminho de volta).
SELECT c.id, c.consumo AS consumo_de_antes, COALESCE(s.soma, 0) AS consumo_novo
  FROM clientes c
  LEFT JOIN (SELECT v.cliente, SUM(v.valor_total) AS soma FROM vendas v WHERE v.status = 1 GROUP BY v.cliente) s ON s.cliente = c.id
 WHERE c.consumo IS NULL OR ABS(ROUND(COALESCE(c.consumo, 0) * 100) - ROUND(COALESCE(s.soma, 0) * 100)) > 1
 ORDER BY c.id;

-- 3. O refazer: a soma das finalizadas, ou zero sem nenhuma, onde a coluna e nula ou difere em mais de 1 centavo.
UPDATE clientes c
  LEFT JOIN (SELECT v.cliente, SUM(v.valor_total) AS soma FROM vendas v WHERE v.status = 1 GROUP BY v.cliente) s ON s.cliente = c.id
   SET c.consumo = COALESCE(s.soma, 0)
 WHERE c.consumo IS NULL OR ABS(ROUND(COALESCE(c.consumo, 0) * 100) - ROUND(COALESCE(s.soma, 0) * 100)) > 1;

SELECT ROW_COUNT() AS refeitos_agora;

-- 4. A conferencia. O esperado: 0.
SELECT COUNT(*) AS diferem_depois
  FROM clientes c
  LEFT JOIN (SELECT v.cliente, SUM(v.valor_total) AS soma FROM vendas v WHERE v.status = 1 GROUP BY v.cliente) s ON s.cliente = c.id
 WHERE c.consumo IS NULL OR ABS(ROUND(COALESCE(c.consumo, 0) * 100) - ROUND(COALESCE(s.soma, 0) * 100)) > 1;
