-- ---------------------------------------------------------------------------
-- Quem autorizou a venda em fiado.
--
--   docker compose exec -T mysql mysql -uroot -proot franquiabv_dev \
--     < scripts/migracao-venda-autorizacao-fiado.sql
--
-- A REGRA, dita por quem decide em 02/09/2026: *"caso uma venda seja lançada
-- como fiado, junto com o operador de caixa deve aparecer o gerente que
-- autorizou a venda (hoje não existe isso — expandir visualização e registro)"*.
--
-- Hoje não existe mesmo: `autorizarVendaFiadoAction` confere a credencial do
-- gerente e devolve `{sucesso: true}` — e não grava nada. A venda fica com o
-- operador em `vendas.usuario` e com ninguém no lugar de quem autorizou. Para
-- auditoria, "foi autorizada por alguém" é indistinguível de "ninguém
-- autorizou". Ver D86.
--
-- IDEMPOTENTE: só acrescenta o que não existir.
--
-- ---------------------------------------------------------------------------
-- POR QUE AS DUAS COLUNAS SÃO NULAS, e não podia ser diferente
--
-- Toda venda já gravada — são muitas — foi feita sem este registro, e nenhuma
-- delas tem autorizador para preencher. Inventar um seria pior que não ter:
-- gravaria como fato uma coisa que ninguém verificou. E venda à vista, que é a
-- maioria, nunca vai ter autorizador nenhum.
--
-- Então `NULL` aqui quer dizer exatamente uma coisa: **não há registro de
-- autorização para esta venda**. Não distingue "não precisava" de "precisava e
-- não foi registrada" — para essa distinção, quem lê cruza com
-- `valor_recebido < valor_total`, que é como o próprio sistema decide o que é
-- fiado (`VendaPagamentoService:228`).
--
-- ---------------------------------------------------------------------------
-- POR QUE A DATA SEPARADA, e não só o usuário
--
-- Porque a venda pode ser autorizada e finalizada em momentos diferentes, e a
-- própria `data_criacao` da venda é reescrita no `finalizar`
-- (`VendaPagamentoService:222`). Sem a hora da autorização, o rastro diria quem
-- mas não quando — e "quando" é metade do que uma auditoria pergunta.
--
-- ---------------------------------------------------------------------------
-- ESTA MIGRAÇÃO PRECISA ESTAR EM PRODUÇÃO ANTES DO CORTE
--
-- Mesma armadilha do D54, e pelo mesmo motivo: o passo 1 do
-- `procedimento-de-corte.md` refaz o `mysql.sql` a partir da estrutura de
-- produção, e é dele que `scripts/gerar-ddl-postgres.php` parte. Se o ALTER não
-- tiver rodado em produção antes desse passo, o schema PostgreSQL nasce sem as
-- colunas, e a tela de vendas morre na primeira consulta.
--
-- A coluna precisa existir nos QUATRO lugares: no banco local, no `mysql.sql`
-- versionado, no `postgres/schema.sql` gerado, e no PostgreSQL de pé. Regerar
-- não é o mesmo que aplicar — foi assim que o D54 quebrou 44 testes.
-- ---------------------------------------------------------------------------

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

SET @sql = IF(@existe = 0,
    'ALTER TABLE vendas
       ADD COLUMN autorizado_por INT DEFAULT NULL
       COMMENT ''Gerente que autorizou a venda em fiado. NULL = sem registro de autorizacao.''
       AFTER usuario,
       ADD COLUMN autorizado_em DATETIME DEFAULT NULL
       COMMENT ''Instante da autorizacao do fiado.''
       AFTER autorizado_por,
       ADD KEY FK_VENDAS_autorizado_por (autorizado_por),
       ADD CONSTRAINT FK_VENDAS_autorizado_por
           FOREIGN KEY (autorizado_por) REFERENCES usuarios (id)',
    'SELECT ''colunas ja existem, nada a fazer'' AS aviso'
);

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

-- Conferência. Antes de qualquer venda nova, o esperado é: nenhuma autorizada,
-- e um número de fiados históricos que ninguém autorizou por escrito -- que é
-- justamente o que esta coluna passa a impedir daqui para frente.
SELECT
    COUNT(*)                                                   AS vendas,
    SUM(autorizado_por IS NOT NULL)                            AS com_autorizador,
    SUM(valor_recebido < valor_total)                          AS fiados,
    SUM(valor_recebido < valor_total AND autorizado_por IS NULL) AS fiados_sem_registro
FROM vendas;
