-- ---------------------------------------------------------------------------
-- O numero de cada confirmacao das escritas de dinheiro: `confirmacoes` (07/11/2026, a
-- fatia 103, IDEMPOTENCIA-DAS-ESCRITAS-DE-DINHEIRO; o D162 e o D285; a resposta 87 do
-- dono, a opcao (a), "Um numero por confirmacao", 12/10/2026).
--
--   mysql franquia_producao < scripts/migracao-confirmacoes.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 a tabela (`mysql.sql`, e o `postgres/schema.sql` do
-- gerador). NA COPIA LOCAL DESDE 07/11/2026, nos dois bancos, pela resposta 83 do dono (a
-- opcao (a): o esquema que so acrescenta entra nas duas copias locais quando a resposta
-- pedir); o PostgreSQL da copia, por `postgres/migracao-confirmacoes.sql`. A base do teste
-- do BVIP fica sem ela ate a proxima copia exportada daqui, pela mao do dono.
--
-- O QUE ELA GUARDA. O pagamento da comanda, a compra e a devolucao de credito que chegavam
-- duas vezes -- a rede que reenvia, a resposta que se perde e o operador que tenta de novo
-- -- gravavam duas vezes. Pela resposta 87, a tela nova gera um numero ao confirmar e o
-- repete na nova tentativa (o cabecalho `Idempotency-Key`), e o servidor responde ao numero
-- repetido o que respondeu da primeira vez, sem gravar de novo:
--
--   usuario   quem confirmou: o usuario da sessao (inteiro sem chave estrangeira, como
--             `gravado_por` nas outras tabelas de registro);
--   chave     o numero, unico por usuario (`UNQ_CONFIRMACOES_usuario_chave`): e o indice
--             que enfileira os dois pedidos com o mesmo numero que chegam juntos;
--   unidade   a unidade da sessao;
--   rota      a escrita -- o verbo e o endereco, com o id do recurso;
--   pedido    o sha256 do corpo do pedido sem a senha, e da unidade: o mesmo numero com
--             outro pedido e recusado (`ISBase\Regra\RegraDaConfirmacao::assinatura`);
--   situacao, o codigo HTTP e o corpo da primeira resposta -- so a que deu certo (2xx): a
--   resposta recusa nao grava nada, nem o numero;
--   data      quando.
--
-- NASCE VAZIA, e so ganha linhas; nada aqui as apaga. Quanto tempo guardar e decisao do
-- dono (a pergunta do D735); ate la, toda linha fica.
--
-- IDEMPOTENTE: `CREATE TABLE IF NOT EXISTS`. O DDL e o mesmo do `mysql.sql` (menos o
-- `AUTO_INCREMENT=1`), e o portao do passo 0 compara os dois.
--
-- ---------------------------------------------------------------------------
-- ESTA MIGRACAO PRECISA ESTAR EM PRODUCAO ANTES DO PASSO 1 -- o passo 0 (D323).
--
-- O passo 1 refaz o `mysql.sql` a partir da estrutura de producao. Sem a tabela la, ela
-- some do `mysql.sql` e do `schema.sql`, e o numero da confirmacao deixa de valer: o
-- codigo pergunta se ela existe (`ISBase\Doctrine\ColunaNoBanco`) e, sem ela, grava como
-- antes do numero, sem quebrar.
--
-- PARA O CODIGO DE PRODUCAO A TABELA VAZIA E INOFENSIVA: ele nao a le nem a escreve.
-- Cria-la nao copia tabela nenhuma, e ela nao tem chave estrangeira.
-- ---------------------------------------------------------------------------

CREATE TABLE IF NOT EXISTS `confirmacoes` (
  `id` int NOT NULL AUTO_INCREMENT,
  `usuario` int NOT NULL COMMENT 'Quem confirmou: o usuario da sessao',
  `chave` varchar(64) NOT NULL COMMENT 'O numero que a tela gera ao confirmar (cabecalho Idempotency-Key)',
  `unidade` int NOT NULL COMMENT 'A unidade da sessao',
  `rota` varchar(150) NOT NULL COMMENT 'A escrita: o verbo e o endereco, com o id do recurso',
  `pedido` char(64) NOT NULL COMMENT 'O sha256 do corpo do pedido, sem a senha, e da unidade (RegraDaConfirmacao::assinatura)',
  `situacao` smallint DEFAULT NULL COMMENT 'O codigo HTTP da primeira resposta; nulo so dentro da transacao que grava',
  `resposta` mediumtext COMMENT 'O corpo da primeira resposta (JSON), devolvido ao numero repetido',
  `data` datetime NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `UNQ_CONFIRMACOES_usuario_chave` (`usuario`,`chave`),
  KEY `IDX_CONFIRMACOES_data` (`data`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;

-- Conferencia. O esperado: a tabela, com a chave primaria, o indice unico (`usuario`,
-- `chave`) e o da data.
SELECT index_name                                         AS indice,
       GROUP_CONCAT(column_name ORDER BY seq_in_index)    AS colunas,
       MAX(non_unique)                                    AS nao_unico
  FROM information_schema.statistics
 WHERE table_schema = DATABASE()
   AND table_name = 'confirmacoes'
 GROUP BY index_name
 ORDER BY index_name;

SELECT COUNT(*) AS confirmacoes FROM confirmacoes;
