-- ---------------------------------------------------------------------------
-- O irmao no PostgreSQL de `scripts/encerrar-pacotes-de-venda-cancelada.sql` (03/11/2026, a fatia 74g,
-- RESPOSTAS-286-E-287; a resposta 287 (a) do dono, o D688): os pacotes de cliente ainda ATIVOS de venda ja cancelada,
-- encerrados uma vez, com a marca do cancelamento novo (`status` falso e `data_alteracao`), a contagem antes e a lista
-- do que muda. 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/encerrar-pacotes-de-venda-cancelada.sql | tee /root/encerrar-pacotes-pg-<data>.txt
--   docker exec -i franquiabv-postgres-1 sh -c 'psql -U "$POSTGRES_USER" -d <banco descartavel> -v ON_ERROR_STOP=1' \
--     < postgres/encerrar-pacotes-de-venda-cancelada.sql
--
-- ONDE RODA: no 7d de `docs/procedimento-de-corte.md`, com a aplicacao nova apontada e antes de liberar. COM A ETAPA 1
-- FEITA, o MySQL ja foi encerrado no passo 7 de la, e a carga (`migrar-dados.sh`) trouxe os pacotes encerrados: este
-- roteiro conta 0 e nao muda nada. So encerra no CORTE DE UMA VEZ SO, quando o codigo da 74f chega junto com o
-- PostgreSQL. NA COPIA franquiabv_dev NAO RODA: so num banco descartavel.
--
-- O INQUILINO E O DA BASE (o 1, como `postgres/semente-usuarios-horarios.sql`): as tabelas tem RLS forcado. O UPDATE e
-- a lista numa transacao so, e o `now()` dela e o instante de todos.
--
-- QUEM RODA DECIDE SE O RLS VALE (medido em 03/11/2026, na correcao da 74g, num banco descartavel com as duas tabelas,
-- as politicas do `schema.sql` e dois inquilinos): como o `bvip_app`, com o `SET` abaixo, o roteiro so ve e so encerra o
-- inquilino 1, e a segunda vez nao muda nada; sem o `SET`, para no primeiro SELECT ("unrecognized configuration
-- parameter"), sem mudar nada. COMO O DONO SUPERUSUARIO -- o `psql` do 7d, o mesmo do portao 2 (`conferir-papeis.sh`) --,
-- o RLS nao vale e o `SET` nao filtra: o roteiro conta e encerra os de TODO inquilino. No corte isso e o mesmo, porque a
-- base so tem o inquilino 1 (o segundo do portao 2 so tem uma unidade, e e apagado no fim dele).
--
-- IDEMPOTENTE: so o ATIVO de venda cancelada; a segunda vez nao acha nada. NENHUM DELETE, nenhuma coluna nova.
-- ---------------------------------------------------------------------------

SET app.inquilino_id = '1';

-- 1. A contagem, antes.
SELECT COUNT(*) AS ativos_de_venda_cancelada,
       COUNT(*) FILTER (WHERE cp.validade IS NULL OR cp.validade >= CURRENT_DATE) AS ainda_validos,
       COUNT(*) FILTER (WHERE cp.quantidade_restante > 0) AS com_saldo_positivo,
       COALESCE(SUM(cp.quantidade_restante) FILTER (WHERE cp.quantidade_restante > 0), 0) AS sessoes_restantes,
       COALESCE(SUM(cp.quantidade_restante) FILTER (WHERE cp.quantidade_restante > 0
                                                     AND (cp.validade IS NULL OR cp.validade >= CURRENT_DATE)), 0) AS sessoes_nos_ainda_validos,
       COUNT(*) FILTER (WHERE cp.quantidade_restante < 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;

BEGIN;

-- 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, o instante da transacao.
WITH encerrados AS (
    UPDATE clientes_pacotes cp
       SET status = FALSE, data_alteracao = now()
      FROM vendas v
     WHERE v.id = cp.venda AND cp.status = TRUE AND v.status = 0
 RETURNING cp.id
)
SELECT COUNT(*) AS encerrados_agora, now() AS instante FROM encerrados;

COMMIT;

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