-- ---------------------------------------------------------------------------
-- Os pacotes de cliente ainda ATIVOS de venda ja cancelada, encerrados UMA VEZ, no corte (03/11/2026, a fatia 74g,
-- RESPOSTAS-286-E-287; a resposta 287 (a) do dono, o D688: "no corte, os pacotes ativos de venda ja cancelada passam a
-- encerrados, com a mesma marca do cancelamento novo (nada e apagado; as sessoes que restavam ficam registradas), e o
-- passo conta antes quantos sao e quantos ainda estavam validos").
--
--   mysql franquia_producao < scripts/encerrar-pacotes-de-venda-cancelada.sql | tee /root/encerrar-pacotes-<data>.txt
--   docker compose exec -T mysql mysql -uroot -proot <banco descartavel> < scripts/encerrar-pacotes-de-venda-cancelada.sql
--
-- POR QUE. Desde a fatia 74f (a resposta 285 (a), o D686) cancelar a venda encerra o pacote do cliente que ela criou
-- (`ClientePacoteRepository::encerrarOsDaVenda`, chamado pelo `VendaService::cancelar`). A regra vale daqui em diante:
-- os pacotes de vendas canceladas ANTES dela continuam ativos -- na copia, em 03/11/2026, 118, de 66 vendas e 39
-- clientes, nenhum dentro da validade. Este roteiro os deixa iguais aos de depois.
--
-- A MARCA E A DO CANCELAMENTO NOVO, e so ela: `status` falso e `data_alteracao` (o mesmo instante em todos), em todo
-- `clientes_pacotes` ATIVO cuja `venda` esta cancelada -- o `status` 0 da venda (`RegraDaVendaNoPdv::VENDA_CANCELADA`, a
-- regra da 74d e da 74f), e nao o `cancelado_em`, que as canceladas de antes da fatia 70 nao tem. O restante, a validade,
-- o valor da sessao e o resto da linha ficam como estavam. SEM `DELETE`, sem coluna nova. NAO TOCA o pacote de venda
-- valida (concluida, aberta, em andamento) nem o ja encerrado (a `data_alteracao` dele fica a de antes). O pacote sem
-- venda de origem nao existe: `clientes_pacotes.venda` e NOT NULL, com a chave para `vendas` (0 sem venda na copia).
--
-- ONDE RODA: DEPOIS DO CODIGO DA 74f no lugar, com a aplicacao em manutencao -- na etapa 1, no passo 7 da janela, logo
-- depois das linhas de `colunas_gravadas` (`docs/procedimento-de-corte-etapa-1.md`). Antes do codigo, a venda cancelada
-- entre este roteiro e a troca da arvore deixaria o pacote dela ativo, pelo cancelamento antigo. A carga da etapa 2 leva
-- o estado ao PostgreSQL (`migrar-dados.sh`); o irmao em `postgres/` roda no 7d de `docs/procedimento-de-corte.md`, e com
-- a etapa 1 feita nao acha nada (so encerra no corte de uma vez so). NA COPIA franquiabv_dev NAO RODA (a 287 (a) e do
-- corte): so num banco descartavel, para ensaiar.
--
-- A CONTAGEM VEM ANTES DO UPDATE, para quem opera ler o numero da producao: quantos sao, quantos ainda estavam dentro
-- da validade (a validade nula conta como valida: ela "nao vence", como no `selecionarPacote`), quantas sessoes restavam
-- nos de saldo positivo (e nos ainda validos), quantos com o saldo negativo, de quantos clientes e de quantas vendas.
-- NAO PARA com pacote ainda valido: a resposta e encerrar todos ("se houver pacote ainda valido voce ve o numero"), e
-- o numero vai ao dono no relato da janela.
--
-- A LISTA, ANTES DO UPDATE: cada pacote que vai ser encerrado, com a `data_alteracao` de antes (so ids, datas e
-- contagens: nenhum dado pessoal). O `tee` da linha de cima a guarda; e o caminho de volta exato.
--
-- IDEMPOTENTE: o UPDATE so pega o ATIVO de venda cancelada; rodado de novo, nao acha nada, e a `data_alteracao` dos
-- encerrados na primeira vez fica a dela. A conferencia no fim: 0 ativos de venda cancelada.
--
-- PARA DESFAZER, pela lista guardada: `UPDATE clientes_pacotes SET status = TRUE, data_alteracao = <a de antes> WHERE
-- id = <id>;` para cada linha dela. Sem a lista, pelo instante impresso na conferencia (a aplicacao em manutencao: nada
-- mais grava aquele instante): `UPDATE clientes_pacotes SET status = TRUE WHERE status = FALSE AND data_alteracao =
-- '<instante>';` -- a `data_alteracao` fica a deste roteiro.
-- ---------------------------------------------------------------------------

-- 1. A contagem, antes.
SELECT COUNT(*) AS ativos_de_venda_cancelada,
       COALESCE(SUM(cp.validade IS NULL OR cp.validade >= CURRENT_DATE), 0) AS ainda_validos,
       COALESCE(SUM(CASE WHEN cp.quantidade_restante > 0 THEN 1 ELSE 0 END), 0) AS com_saldo_positivo,
       COALESCE(SUM(CASE WHEN cp.quantidade_restante > 0 THEN cp.quantidade_restante ELSE 0 END), 0) AS sessoes_restantes,
       COALESCE(SUM(CASE WHEN cp.quantidade_restante > 0 AND (cp.validade IS NULL OR cp.validade >= CURRENT_DATE)
                         THEN cp.quantidade_restante ELSE 0 END), 0) AS sessoes_nos_ainda_validos,
       COALESCE(SUM(CASE WHEN cp.quantidade_restante < 0 THEN 1 ELSE 0 END), 0) AS com_saldo_negativo,
       COUNT(DISTINCT cp.cliente) AS clientes,
       COUNT(DISTINCT cp.venda) AS vendas
  FROM clientes_pacotes cp
  JOIN vendas v ON v.id = cp.venda
 WHERE cp.status = TRUE AND v.status = 0;

-- 2. A lista do que vai ser encerrado, com a data de antes (o caminho de volta).
SELECT cp.id, cp.venda, cp.validade, cp.quantidade_restante, cp.data_alteracao AS data_alteracao_de_antes
  FROM clientes_pacotes cp
  JOIN vendas v ON v.id = cp.venda
 WHERE cp.status = TRUE AND v.status = 0
 ORDER BY cp.id;

-- 3. O encerramento: a marca do cancelamento novo, um instante so.
SET @instante = NOW();

UPDATE clientes_pacotes cp
  JOIN vendas v ON v.id = cp.venda
   SET cp.status = FALSE, cp.data_alteracao = @instante
 WHERE cp.status = TRUE AND v.status = 0;

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

-- 4. A conferencia. O esperado: 0 ativos de venda cancelada.
SELECT COUNT(*) AS ativos_de_venda_cancelada_depois
  FROM clientes_pacotes cp
  JOIN vendas v ON v.id = cp.venda
 WHERE cp.status = TRUE AND v.status = 0;
