-- ---------------------------------------------------------------------------
-- O registro de quem abre e de quem baixa cada arquivo da franqueadora:
-- `arquivos_acessos` (22/10/2026, a fatia 29b da fila das telas que faltam,
-- RESPOSTA-253-QUEM-ABRIU; a resposta 253 do dono, a opcao (c): "Um registro por
-- pessoa: quem abriu, qual arquivo e quando; responde o gerente novo leu o manual
-- da marca?"). O desenho e `docs/f3-telas-restantes/tela-arquivos.md`, a pergunta 6.
--
--   mysql franquia_producao < scripts/migracao-arquivos-acessos.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 22/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. Cada entrega do arquivo que SAI -- o "abrir" (inline) e o
-- "baixar" (anexo), pelas duas portas: a do ERP (`arquivosUsuarios/abrir` e
-- `/download`) e a da tela nova (`/adm/api/arquivos/:id/conteudo`), as duas pelo
-- `ISConfiguracao\Service\EntregaDoArquivo` -- vira uma linha:
--
--   arquivo     qual (chave estrangeira para `arquivos`);
--   usuario,    quem abriu: quem entrou na sessao, e a pessoa assumida so quando
--   em_nome_de  difere (`CrudController::autorDaEscrita`, o molde da devolucao de
--               credito). Inteiros sem chave estrangeira, como la;
--   unidade     a unidade da sessao (chave estrangeira para `unidades`; nula se a
--               sessao nao tiver);
--   acao        `abrir` ou `baixar`;
--   aberto_em   quando, pelo relogio do servidor.
--
-- O 404 e a recusa nao gravam. A falha ao gravar nao impede a entrega: fica no log.
--
-- NASCE VAZIA: o que foi aberto antes dela nao esta em lugar nenhum (`usuarios_acessos`
-- guarda o login, nao a pagina). So ganha linhas; nada aqui as apaga. O PRAZO DE GUARDA,
-- quem pode ver e o aviso aos funcionarios sao da LGPD, que o dono mandou marcar como
-- debito futuro (o D583).
--
-- O INDICE (arquivo, aberto_em) e a consulta da tela: as aberturas de um arquivo, da
-- mais nova para a mais antiga. A chave estrangeira de `arquivo` usa a primeira coluna
-- dele.
--
-- 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 entrega volta a nao deixar registro:
-- o codigo pergunta se ela existe (`ISBase\Doctrine\ColunaNoBanco`) e, sem ela, entrega
-- o arquivo como antes, sem quebrar e sem a linha daqui; a consulta da tela diz que o
-- registro ainda nao esta ligado.
--
-- PARA O CODIGO DE PRODUCAO A TABELA VAZIA E INOFENSIVA: ele nao a le nem a escreve.
-- Cria-la nao copia tabela nenhuma; as chaves estrangeiras so pedem uma trava curta
-- de metadados em `arquivos` e `unidades`.
-- ---------------------------------------------------------------------------

CREATE TABLE IF NOT EXISTS `arquivos_acessos` (
  `id` int NOT NULL AUTO_INCREMENT,
  `arquivo` int NOT NULL,
  `usuario` int NOT NULL COMMENT 'Quem abriu ou baixou: quem entrou na sessao (CrudController::autorDaEscrita)',
  `em_nome_de` int DEFAULT NULL COMMENT 'A pessoa da sessao, so quando difere de usuario (personificacao)',
  `unidade` int DEFAULT NULL COMMENT 'A unidade da sessao',
  `acao` varchar(6) NOT NULL COMMENT 'abrir (a entrega inline) ou baixar (o anexo)',
  `aberto_em` datetime NOT NULL,
  PRIMARY KEY (`id`),
  KEY `IDX_ARQUIVOS_ACESSOS_arquivo_aberto_em` (`arquivo`,`aberto_em`),
  KEY `FK_ARQUIVOS_ACESSOS_unidade` (`unidade`),
  CONSTRAINT `FK_ARQUIVOS_ACESSOS_arquivo` FOREIGN KEY (`arquivo`) REFERENCES `arquivos` (`id`),
  CONSTRAINT `FK_ARQUIVOS_ACESSOS_unidade` FOREIGN KEY (`unidade`) REFERENCES `unidades` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;

-- Conferencia. O esperado: a tabela, com a chave primaria e os dois indices.
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 = 'arquivos_acessos'
 GROUP BY index_name
 ORDER BY index_name;

SELECT COUNT(*) AS acessos FROM arquivos_acessos;
