-- ---------------------------------------------------------------------------
-- A vigencia da taxa de royalty: `royalties_aliquotas` (D368; a resposta 134 do
-- dono, a opcao (b), "So a do royalty", 13/10/2026).
--
--   mysql franquia_producao < scripts/migracao-royalties-aliquotas.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 13/10/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). A base do teste do BVIP fica sem
-- ela ate a proxima copia exportada daqui, pela mao do dono.
--
-- O QUE ELA GUARDA. A taxa de royalty mora em `unidades` (`royltes_*`) e era
-- gravada por cima: o retrato das 05:25 refaz ontem e hoje com a taxa do cadastro,
-- e o aumento dado no dia 15 reescrevia a quinzena ja paga. Agora a taxa nova vale
-- do CICLO SEGUINTE (o ciclo da fatura, de 16 a 15), e cada mudanca vira uma linha
-- aqui, com quando mudou e quem mudou:
--
--   ciclo_inicial   `AAAA-MM` do mes em que comeca o primeiro ciclo em que ela
--                   vale (o ciclo de 16/10 a 15/11 e "2026-10"); NULO e "desde
--                   sempre": as taxas que valiam antes da primeira mudanca
--                   gravada, sem autor, que ninguem registrou;
--   gravado_por,    o autor, como na vigencia do horario e em Contas a Pagar
--   em_nome_de      (`CrudController::autorDaEscrita`): quem entrou na sessao, e a
--                   pessoa assumida so quando difere. Inteiro sem chave estrangeira,
--                   como la;
--   data_criacao    quando mudou.
--
-- SO GANHA LINHAS (`ISRelatorio\Service\VigenciaDaAliquota`): duas mudancas no mesmo
-- ciclo valem pela de maior `id`. Sem restricao de unicidade, como a do horario.
--
-- NASCE VAZIA, E NAO COM UMA SEMENTE: sem linha nenhuma da unidade, quem le usa a
-- taxa do cadastro, como antes; a primeira mudanca grava a linha "desde sempre" com
-- as taxas de antes, e depois a nova. Uma semente diria "desde o dia da migracao",
-- e o dia da migracao nao e o dia em que a taxa comecou -- 9 de 38 unidades com
-- retrato ja tiveram mais de uma taxa de servico desde 01/2024.
--
-- 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 a taxa nova volta a valer no dia em
-- que muda: o codigo pergunta se ela existe (`ISBase\Doctrine\ColunaNoBanco`) e, sem
-- ela, grava e apura como antes -- sem quebrar e sem guardar quem mudou.
--
-- PARA O CODIGO DE PRODUCAO A TABELA VAZIA E INOFENSIVA: ele nao a le nem a escreve.
-- Cria-la nao copia tabela nenhuma, e a chave estrangeira so pede uma trava curta de
-- metadados em `unidades`.
-- ---------------------------------------------------------------------------

CREATE TABLE IF NOT EXISTS `royalties_aliquotas` (
  `id` int NOT NULL AUTO_INCREMENT,
  `unidade` int NOT NULL,
  `ciclo_inicial` char(7) DEFAULT NULL COMMENT 'AAAA-MM do primeiro ciclo (16 a 15) em que vale; nulo e desde sempre',
  `servico` double NOT NULL,
  `produto_barbearia` double NOT NULL,
  `produto_emporio` double NOT NULL,
  `lavavip` double NOT NULL,
  `gravado_por` int DEFAULT NULL COMMENT 'Quem entrou na sessao (CrudController::autorDaEscrita); nulo na linha desde sempre',
  `em_nome_de` int DEFAULT NULL COMMENT 'A pessoa da sessao, so quando difere de gravado_por (personificacao)',
  `data_criacao` datetime NOT NULL,
  PRIMARY KEY (`id`),
  KEY `FK_ROYALTIES_ALIQUOTAS_unidade` (`unidade`,`ciclo_inicial`),
  CONSTRAINT `FK_ROYALTIES_ALIQUOTAS_unidade` FOREIGN KEY (`unidade`) REFERENCES `unidades` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;

-- Conferencia. O esperado: a tabela, com a chave primaria e o indice da unidade.
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 = 'royalties_aliquotas'
 GROUP BY index_name
 ORDER BY index_name;
