-- ---------------------------------------------------------------------------
-- Quem autorizou o resgate de pontuacao sem o codigo do cliente (D88).
--
--   docker compose exec -T mysql mysql -uroot -proot franquiabv_dev \
--     < scripts/migracao-pontuacao-resgate-autorizado.sql
--
-- Ate 03/09/2026 a tela do programa de fidelidade aceitava "000000" como
-- codigo de QUALQUER cliente. A saida operacional continua existindo -- cliente
-- sem sinal, WhatsApp da unidade fora do ar --, mas virou uma autorizacao com o
-- desenho do fiado (D86): o gerente reconfirma a propria senha, e fica gravado
-- quem foi, nesta coluna. Texto livre na `descricao` serve para ler, nao para
-- perguntar.
--
-- IDEMPOTENTE: so acrescenta se a coluna nao existir.
--
-- NULL QUER DIZER "SEM REGISTRO DE AUTORIZACAO": o resgate com o codigo do
-- cliente, que e a maioria, e todo o historico anterior. Inventar autorizador
-- para o passado 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).
--
-- A coluna entrou no `mysql.sql` em 03/09/2026 (a96346e), sem migracao. O
-- passo 1 do corte refaz o `mysql.sql` a partir da estrutura de producao; sem
-- a coluna la, ela some do `schema.sql` -- e a entidade `PontuacaoHistorico` a
-- mapeia, entao o Doctrine a pede em toda leitura e toda gravacao da entidade,
-- e as duas falham -- o resgate com codigo junto, porque grava uma linha nova.
-- O codigo antigo de producao nao a le nem a escreve.
--
-- A CHAVE ESTRANGEIRA COPIA A TABELA. Com `foreign_key_checks` ligado, o MySQL
-- so acrescenta chave estrangeira pelo algoritmo COPY: a tabela (1,18 milhao de
-- linhas na ultima medida do procedimento) e reescrita, e as escritas nela
-- esperam ate o fim. Rode fora do movimento. As tres mudancas vao num ALTER
-- so, para copiar uma vez.
-- ---------------------------------------------------------------------------

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

SET @sql = IF(@existe = 0,
    'ALTER TABLE pontuacoes_historicos
       ADD COLUMN autorizado_por INT DEFAULT NULL
       AFTER data_alteracao,
       ADD KEY FK_PONTUACOES_HISTORICOS_autorizado_por (autorizado_por),
       ADD CONSTRAINT FK_PONTUACOES_HISTORICOS_autorizado_por
           FOREIGN KEY (autorizado_por) REFERENCES usuarios (id)',
    'SELECT ''coluna ja existe, 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 resgate com
-- autorizador.
SELECT
    COUNT(*)                        AS historicos,
    SUM(autorizado_por IS NOT NULL) AS com_autorizador
FROM pontuacoes_historicos;
