-- ---------------------------------------------------------------------------
-- O cupom do cliente guarda o desconto e o produto do dia em que foi dado
-- (D271, a resposta 94 do dono, 11/10/2026).
--
--   mysql franquia_producao < scripts/migracao-cupons-clientes-desconto-produto.sql
--
-- Roda no laco do passo 0 de `docs/procedimento-de-corte.md`, em PRODUCAO, e no
-- laco da copia do desenvolvimento de `docs/ensaio-geral-do-corte.md`, contra a
-- `franquiabv_dev`; os bancos da suite ja nascem com as colunas (`mysql.sql`, e o
-- `postgres/schema.sql` do gerador). NA COPIA LOCAL DESDE 12/10/2026: a resposta
-- 83 do dono (a opcao (a): o esquema que so acrescenta entra nas duas copias
-- locais quando a resposta pedir) a levou ao MySQL da copia como aquele laco a
-- roda, e ao PostgreSQL dela o que o gerador emite para as duas colunas, com o
-- indice e a chave estrangeira (D271). Ali ela diz "colunas ja existem". A base
-- do teste do BVIP fica sem elas ate a proxima copia exportada daqui, pela mao do
-- dono.
--
-- Ate aqui o cupom emitido nao guardava nada: o caixa (`pesquisarCupom`, a queima
-- do fechamento) e o aplicativo liam o desconto e o produto da CAMPANHA na hora.
-- Mudar a campanha de 30% para 10% mudava os cupons ja dados, e a mensagem que o
-- cliente recebeu dizia 30% (na copia, 487 cupons validos em 9 campanhas, ate 152
-- numa so). O dono escolheu: o cupom guarda os dois do dia em que foi dado, e os
-- de antes seguem a campanha.
--
-- IDEMPOTENTE: so acrescenta se `desconto` nao existir. As duas colunas, o indice
-- e a chave estrangeira vao num ALTER so, e o ALTER do InnoDB e atomico.
--
-- NULL QUER DIZER "O DA CAMPANHA": todo cupom dado antes do codigo novo. Ninguem
-- sabe o desconto que a mensagem de cada um prometeu, e inventar o de hoje seria
-- gravar como fato o que ninguem verificou.
--
-- ---------------------------------------------------------------------------
-- ESTA MIGRACAO PRECISA ESTAR EM PRODUCAO ANTES DO CORTE -- o passo 0 de
-- `docs/procedimento-de-corte.md` (D323).
--
-- O passo 1 do corte refaz o `mysql.sql` a partir da estrutura de producao; sem
-- as colunas la, elas somem do `schema.sql`, e o cupom volta a seguir a campanha
-- (o codigo pergunta se elas existem, `ISBase\Doctrine\ColunaNoBanco`, e nao
-- quebra: so deixa de guardar). A entidade NAO as mapeia, de proposito: a base
-- do teste do BVIP nao as tem ate a proxima copia exportada, e a entidade
-- mapeada pediria as duas em toda leitura de cupom (D473). O codigo antigo de
-- producao nao as le nem as escreve.
--
-- A CHAVE ESTRANGEIRA COPIA A TABELA. Com `foreign_key_checks` ligado, o MySQL
-- so acrescenta chave estrangeira pelo algoritmo COPY: a tabela (100.373 linhas
-- na copia, contadas em 11/10/2026) e reescrita, e as escritas nela -- a emissao e a queima do cupom, no
-- fechamento da venda -- esperam ate o fim. Rode fora do movimento. Na copia, em
-- 12/10/2026, com 100.375 linhas: 1 s no servidor (o `exec_time` do `ALTER` no
-- binlog).
-- ---------------------------------------------------------------------------

SET @existe = (
    SELECT COUNT(*) FROM information_schema.columns
     WHERE table_schema = DATABASE()
       AND table_name = 'cupons_clientes'
       AND column_name = 'desconto'
);

SET @sql = IF(@existe = 0,
    'ALTER TABLE cupons_clientes
       ADD COLUMN desconto INT DEFAULT NULL
       AFTER data_alteracao,
       ADD COLUMN produto_oferecido INT DEFAULT NULL
       AFTER desconto,
       ADD KEY FK_CUPONS_CLIENTES_produto_oferecido (produto_oferecido),
       ADD CONSTRAINT FK_CUPONS_CLIENTES_produto_oferecido
           FOREIGN KEY (produto_oferecido) REFERENCES produtos (id)',
    'SELECT ''colunas ja existem, nada a fazer'' AS aviso'
);

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

-- Conferencia. Antes do codigo novo no ar, o esperado e nenhum cupom que guardou
-- o desconto ou o produto.
SELECT
    COUNT(*)                                                       AS cupons,
    SUM(desconto IS NOT NULL OR produto_oferecido IS NOT NULL)     AS que_guardaram
FROM cupons_clientes;
