#!/bin/sh
#
# Roda todos os portoes de conferencia e diz quais falharam.
#
# POR QUE ISTO EXISTE. Sao dezenas de roteiros de conferencia, com tres formas
# de invocacao: PHP local, PHP dentro do container (os que falam com o banco
# pelo host `mysql`, que so existe na rede do Docker), e shell. Ninguem decora
# isso, e portao que ninguem lembra de rodar nao protege nada.
#
# O NUMERO SAIU DAQUI, e nao foi por preguica. Ele dizia "treze" com dezenove
# linhas abaixo, foi corrigido para "vinte", e estava errado de novo na semana
# seguinte -- ninguem atualiza contagem em comentario ao acrescentar portao, e
# nenhuma guarda confere. Quem quiser o numero pergunta ao arquivo:
#
#     grep -cE '^rodar |^rodar_conhecido ' scripts/conferir-tudo.sh
#
# O VERMELHO CONHECIDO E UMA CATEGORIA, e nao um detalhe. `conferir-agendamento`
# acusa duas rotinas sem entrada no crontab, e as duas estao certas em acusar:
# uma espera decisao de negocio (D43) e a outra espera a producao ser
# descongelada (D50). Sem essa categoria, o conjunto ficaria vermelho para
# sempre -- e conjunto sempre vermelho e conjunto que ninguem roda. E a mesma
# doenca das listas de excecao que nunca encolhem.
#
# Desde 25/10/2026 nenhum portao usa a categoria: o `conferir-agendamento`, o
# unico que a usava, passou a dizer a conhecida pelo nome (`--conhecidas=`), porque
# o codigo de saida sozinho escondia atras dela qualquer acusacao nova. A categoria
# fica para o proximo, com o mesmo cuidado.
#
# O QUE ELE NAO INCLUI, de proposito:
#
#   conferir-migracao.php   leva ~10 min e compara DOIS bancos carregados da
#                           mesma origem. E portao de CORTE, roda no passo 5.
#   conferir-papeis.sh      exige SENHA_APP.
#
# Uso:
#     sh scripts/conferir-tudo.sh

falhou=0
nomes=''
conhecidos=0

rodar() {
    rotulo="$1"
    shift

    printf '  %-34s ' "$rotulo"

    if "$@" > /tmp/portao.txt 2>&1; then
        echo 'ok'
        return 0
    fi

    echo 'FALHOU'
    falhou=$((falhou + 1))
    nomes="$nomes $rotulo"
}

# Portao que se espera vermelho, com o motivo a vista. Ele roda igual, e a
# saida dele aparece igual -- o que muda e nao contar como falha do conjunto.
rodar_conhecido() {
    rotulo="$1"
    motivo="$2"
    shift 2

    printf '  %-34s ' "$rotulo"

    if "$@" > /tmp/portao.txt 2>&1; then
        echo 'ok -- E O VERMELHO CONHECIDO SUMIU. Tire-o da lista.'
        falhou=$((falhou + 1))
        nomes="$nomes $rotulo(sarou)"
        return 0
    fi

    echo "vermelho conhecido -- $motivo"
    conhecidos=$((conhecidos + 1))
}

echo ''
echo 'PORTOES DE CONFERENCIA'
echo '=============================================================================='
echo ''

# --- os que leem so arquivo -------------------------------------------------
rodar 'referencias da documentacao' php scripts/conferir-referencias-docs.php
rodar 'debitos repetidos'           php scripts/conferir-debitos-repetidos.php
rodar 'resposta do cron'            php scripts/conferir-resposta-cron.php
# O PORTAO DE SEGREDOS, o mesmo do CI e do pre-push (03/10/2026, SEGREDOS). Com
# o CI parado desde 13/09/2026, so o pre-push o rodava -- e so no push. Aqui ele
# le a arvore, com os arquivos ainda nao adicionados.
rodar 'nenhum segredo versionado'   sh scripts/conferir-segredos.sh
rodar 'entidade duplicada'          php scripts/conferir-entidade-duplicada.php
rodar 'ordenacao sem desempate'     php scripts/conferir-ordenacao-empates.php
rodar 'cobertura do contrato'       php scripts/conferir-cobertura-contrato.php
rodar 'linha sorteada'              php scripts/conferir-linha-sorteada.php
rodar 'tempo limite de rede'        php scripts/conferir-tempo-limite-rede.php
# NENHUM TESTE CHEGA A ANTHROPIC (a fatia 133, 08/11/2026): o endereco da API nao esta
# escrito em module/, tests/, scripts/ nem frontend/src (os PHP lidos sem comentario), e o
# cliente do Claude nao tem endereco padrao. A primeira chamada de verdade e do dono.
rodar 'sem a anthropic nos testes'  php scripts/conferir-sem-anthropic-nos-testes.php
rodar 'rastro das rotinas'          php scripts/conferir-rastro-das-rotinas.php
rodar 'registro de acesso'          php scripts/conferir-registro-de-acesso.php
rodar 'autorizacao privilegiada'    php scripts/conferir-autorizacao-privilegiada.php
rodar 'relogio nos testes'          php scripts/conferir-relogio-nos-testes.php
# O PORTAO DO RELOGIO, posto a prova (D440, desde 07/11/2026): cada forma de ler o
# relogio -- o `new` sem parentese, o `null`, o nome com a barra -- plantada num
# diretorio temporario, com o que ele tem de acusar e o que nao.
rodar 'ensaio do portao do relogio' bash scripts/ensaiar-portao-do-relogio.sh
# O DIA DO CENARIO DA AGENDA -- D437, desde 07/10/2026. Os cinco arquivos que
# montavam o cenario "daqui a 45 dias" escolhem o dia (`DiaLivreNaAgenda`), e
# desfazer a escolha fica verde com o relogio de hoje: so cai na data fixa da
# fixture no dia em que a alcanca. Este le os tokens e recusa o dia escrito.
rodar 'dia do cenario da agenda'    php scripts/conferir-dia-do-cenario-da-agenda.php
# A LACUNA DO CI NAS DUAS DIRECOES -- D441, desde 07/10/2026. So a declaracao,
# sem rodar ensaio nenhum: portao posto nesta lista que nao esteja num `run:` do
# `ci.yml` nem na tabela FORA_DO_CI do roteiro, com o motivo, deixa este conjunto
# vermelho -- e o mesmo vale para passo novo no CI que ninguem declarou. O
# portao que nao chama roteiro de `scripts/` (os testes do front) vale pelo
# comando: o mesmo texto tem de estar num `run:`.
rodar 'lacuna do ci, nas duas direcoes' bash scripts/conferir-lacuna-do-ci.sh --so-declaracao
# O LEITOR DA LACUNA E O PRE-PUSH, postos a prova (D441, D442) -- copias e um
# repositorio de rascunho num diretorio temporario; nada daqui e tocado.
rodar 'ensaio do leitor da lacuna'  bash scripts/ensaiar-lacuna-do-ci.sh
rodar 'ensaio do pre-push'          bash scripts/ensaiar-pre-push.sh

# OS PROVEDORES DE PRODUCAO NO LOOPBACK -- D360, desde 05/10/2026.
#
# A maquina de quem programa falava com Asaas, WhatsApp e OneSignal de verdade:
# duas unidades de fixture tem o WhatsApp ligado e uma chave de mentira. O corte
# mora no `docker-compose.desenvolvimento.yml` e, desde 06/10/2026 (decisao do
# dono), no `docker-compose.homologacao.yml` e no laboratorio do BVIP -- desde
# 08/10/2026 pelo `.env.laboratorio.example`, num clone proprio (D431). Este
# portao compara as listas (do servico app) com a do deploy de teste, procura
# provedor novo no codigo e confere que o `.env` daqui, os modelos do BVIP e o
# laboratorio carregam o corte, e que o laboratorio tem projeto e portas dele.
# O irmao de baixo, com `--conteiner`, mede a resolucao no conteiner DAQUI: e
# ele que pega o conteiner que nao foi recriado (o do BVIP se mede la).
rodar 'provedores no loopback'      php scripts/conferir-provedores-no-loopback.php
# E os blocos da secao do laboratorio PARAM fora do clone dele (D431, a revisao
# de 08/10/2026): a conferencia que so fazia `echo "PARE"` deixava as linhas de
# baixo rodarem no clone da homologacao. O ensaio roda cada bloco com dubles do
# `docker`, do `php` e do `git`, sem o clone, com o `.env` errado e com o certo.
rodar 'blocos do laboratorio'       sh scripts/ensaiar-blocos-do-laboratorio.sh
# E o `deploy-teste.sh conferir` mede o Google no loopback no teste de sempre (a
# verificacao de 11/10/2026, D461): o ensaio roda a funcao dele com um duble do
# conteiner, com o Google aberto, com e sem o arquivo do Firebase no COMPOSE_FILE.
rodar 'hosts mortos do deploy'      bash scripts/ensaiar-hosts-mortos-do-deploy.sh
# E o ensaio geral do corte roda a suite nos CLONES, com as fixtures so neles, e
# as guardas do local.php seguram (a verificacao de 11/10/2026, D378): o roteiro
# inteiro, num diretorio temporario, com dubles do `docker` e do `php`. Nao toca
# banco nenhum nem o local.php daqui.
rodar 'clones do ensaio de corte'   sh scripts/ensaiar-clones-do-ensaio-de-corte.sh
# OS ROTEIROS DO CORTE E DA CARGA (08/11/2026, a fatia 128). A carga versionada e
# a saida do gerador dela (D584: duas vezes ela ficou para tras sem ninguem ver);
# a carga para na tabela que a origem nao tem, com o nome dela (D462: o roteiro
# gerado inteiro, com um `docker` de mentira); o passo 7 troca so o bloco
# `doctrine` do local.php de producao (D329: sobre um local.php inventado); e a
# apuracao do dia 0 e o inventario do aplicativo leem o log do site, ou dizem que
# nao leram (D332: logs inventados). Nenhum toca banco nem o local.php daqui.
rodar 'carga do corte igual ao gerador' php scripts/conferir-carga-gerada.php
rodar 'carga que para na tabela que falta' sh scripts/ensaiar-carga-que-para.sh
rodar 'troca do doctrine do passo 7' sh scripts/ensaiar-troca-do-doctrine.sh
rodar 'varredura dos logs do dia 0'  sh scripts/ensaiar-varredura-dos-logs.sh
# O DEPLOY DO TESTE E O ROTEIRO DE PUBLICAR NA PRODUCAO (08/11/2026, a fatia 129).
# Sem a senha HTTP escolhida, nada liga o vhost do teste, e o public/app.json da
# tela nao trava mais o deploy (D451 e D549: o roteiro inteiro com dubles, sem
# docker); a trava do teste e uma por servidor (D444: o root e outro usuario,
# num conteiner descartavel da imagem do app); e o roteiro de publicar na
# producao monta, leva, troca e volta como o procedimento manda, com os dois
# tempos (D37: o montar com um docker de mentira, o resto num conteiner
# descartavel). Nenhum toca banco, o BVIP nem a producao.
rodar 'escolhas do deploy do teste'  bash scripts/ensaiar-escolhas-do-deploy-teste.sh
rodar 'trava do deploy do teste'     bash scripts/ensaiar-trava-do-deploy-teste.sh
rodar 'publicar na producao'         bash scripts/ensaiar-publicar-producao.sh

# OS QUE SO EXISTIAM NO CI -- trazidos para ca em 15/09/2026, por causa do D187.
#
# O CI esta parado por cobranca da conta desde 13/09/2026 as 21:01, e enquanto
# isso um portao que so vive la nao defende nada. Medi os quatro do host: os
# quatro rodam e saem com 0. `auditar-group-by` nem toca no banco; o
# `conferir-rotas-sem-login` precisa do `vendor/autoload.php`, que aqui existe.
#
# `conferir-recorte-por-unidade` e o mais gritante dos quatro, e o porque exige
# exatidao: o PORTAO nao e novo -- e de 07/09/2026 e rodou no CI ate 13/09. O que
# e novo e a 41a ENTRADA dele, `autenticarComoAction`, posta em 15/09 para vigiar
# a porta da personificacao (D127). Essa entrada nunca foi executada por corredor
# nenhum: nasceu dois dias depois de o CI parar, num portao que so vivia la.
#
# Isto NAO substitui o CI: la eles rodam contra tres bancos e em maquina limpa.
# Substitui o nada.
rodar 'guarda do erp'               php scripts/conferir-guarda-do-erp.php
rodar 'recorte por unidade'         php scripts/conferir-recorte-por-unidade.php
rodar 'rotas sem login'             php scripts/conferir-rotas-sem-login.php
# AS ROTAS ORFAS DESCEM A CONFIG MESCLADA desde 07/11/2026 (a fatia 115; o D621), e por isso
# moram aqui, ao lado do de cima: precisam do `vendor/`.
rodar 'rotas orfas'                 php scripts/conferir-rotas-orfas.php
# A BARREIRA DE ORIGEM NA ENTRADA DO ERP -- a pergunta 38 do lote, desde
# 08/10/2026. Nenhuma rota que leva a um controller do ERP fica fora dela: o de
# fora e so o modulo `ISApi` e a `/adm/api`, derivados da configuracao; e um POST
# de outro site a cada rota, pela aplicacao montada, volta 403 (sem banco, sem
# rodar controller). Como o de cima, precisa do `vendor/`.
rodar 'barreira de origem do erp'   php scripts/conferir-barreira-de-origem.php
rodar 'group by no postgresql'      php scripts/auditar-group-by.php

# O RELOGIO DO BANCO NO CODIGO QUE RODA -- D42, desde 14/09/2026.
#
# O de cima varre `tests/Caracterizacao` e cuida do MOMENTO (a mesma fonte
# lida duas vezes, com a virada no meio -- o D87). Este varre `module/`,
# `public/`, `config/` e `scripts/` e cuida da FONTE: banco contra PHP.
#
# Era esse o vao. O conserto do D42 tirou as duas fontes do codigo de
# producao, e nenhum portao olhava para la -- um `CURDATE()` novo numa
# entidade entraria sem ninguem ver.
rodar 'relogio do banco no codigo'  php scripts/conferir-relogio-do-banco.php
rodar 'injecao de dql'              php scripts/conferir-injecao-dql.php
rodar 'cobertura por par'           php scripts/conferir-cobertura-por-par.php
rodar 'bytes de controle'           php scripts/conferir-bytes-de-controle.php
rodar 'links mortos'                php scripts/conferir-links-mortos.php
rodar 'fosseis lidos'               php scripts/conferir-fosseis.php
rodar 'unicidade do schema'         php scripts/conferir-unicidade-do-schema.php
rodar 'grupo por id'                php scripts/conferir-grupos-por-id.php
rodar 'buffer de saida'             php scripts/conferir-buffer-de-saida.php
rodar 'booleanos em consulta'       docker compose exec -T app php scripts/conferir-booleanos-em-consulta.php
rodar 'caminhos no postgresql'      docker compose exec -T app php scripts/conferir-caminhos-postgres.php
rodar 'booleano em coluna inteira'  docker compose exec -T app php scripts/conferir-booleano-em-coluna-inteira.php
rodar 'tipos do mapeamento'        docker compose exec -T app php scripts/conferir-tipos-do-mapeamento.php
rodar 'provedores no conteiner'    docker compose exec -T app php scripts/conferir-provedores-no-loopback.php --conteiner

# A COPIA PERDEU O TOPO DE ALGUMA TABELA? -- D181, desde 13/09/2026.
#
# Ele compara o maior id de cada tabela com o `AUTO_INCREMENT=` que o
# `mysql.sql` guarda de producao. Contra o banco de fixtures ele se declara
# sem o que conferir e sai verde, em vez de acusar 81 tabelas.
rodar 'completude da copia'        docker compose exec -T app php scripts/conferir-completude-da-copia.php
rodar 'busca por tags'              php scripts/conferir-busca-por-tags.php
rodar 'ancora da medicao'           php scripts/conferir-ancora-de-medicao.php
rodar 'marca das fixtures'          php scripts/marcar-fixtures.php --conferir
rodar 'privilegio da api nova'      php scripts/conferir-acl-da-api.php
rodar 'inventario atualizado'       sh scripts/conferir-inventario-atual.sh

# A VIGENCIA DO HORARIO -- F4.1 do Profissional Parceiro, desde 02/10/2026.
#
# A ocupacao da agenda de um mes passado e medida com o horario daquele mes, e
# ele so existe se cada mudanca gravou uma linha em `usuarios_horarios`. Este
# le o codigo: o horario so se escreve pelas quatro portas do `UsuarioService`,
# e cada uma grava a vigencia. O irmao que le o BANCO,
# `conferir-vigencia-do-horario.php`, fica fora daqui de proposito -- mede o
# estado da copia, e nao o codigo.
rodar 'escritores do horario'       php scripts/conferir-escritores-do-horario.php

# QUEM GRAVA QUANDO E QUEM CANCELOU A VENDA -- a fatia 70 (PDV-CANCELAMENTO), desde
# 03/11/2026. As Vendas Canceladas, o Caixa e os Royalties leem `cancelado_em` e
# `cancelado_por`, e o autor nulo com o instante e a marca da rotina. Este le o codigo:
# os dois setters so no `VendaService::cancelar` e na rotina, a rotina sem autor, nenhum
# UPDATE nas colunas, e as duas telas passando o gerente da senha.
rodar 'escritores do cancelamento'  php scripts/conferir-escritores-do-cancelamento.php

# QUEM GRAVA QUEM LANCOU O DESCONTO DIGITADO -- a fatia 71 (PDV-DESCONTO-LANCADO-POR), desde
# 03/11/2026. O Descontos le `desconto_lancado_por` no "Por quem lancou". Este le o codigo:
# o setter so no `VendaProdutoService`, o ajuste zerando o autor, nenhum UPDATE na coluna, e
# as duas telas passando quem ENTROU (o D315), e nao o `usuarioId`.
rodar 'escritores do desconto'  php scripts/conferir-escritores-do-desconto.php

# QUEM GRAVA O DINHEIRO CONTADO NA GAVETA -- a fatia 72 (PDV-GAVETA-CONTADA), desde 03/11/2026.
# O relatorio de Caixa le `caixas.valor_contado` na quebra (contado - gaveta ao fechar). Este le o
# codigo: o setter so no `CaixaService::fechar`, privado e sob a trava; nada mais poe o caixa
# fechado; e as duas telas que fecham passam o contado lido pela `RegraDoValorContado`.
rodar 'escritores do contado'  php scripts/conferir-escritores-do-contado.php

# QUEM GRAVA O MOTIVO DA SAIDA DE ESTOQUE -- a fatia 73 (PDV-MOTIVO-DA-RETIRADA), desde 03/11/2026.
# A Retirada de Produtos separa a perda, o vencimento e o acerto por `produtos_estoque.motivo`. Este le
# o codigo: a movimentacao so nasce no `ProdutoService`, com o motivo nas duas portas (o da tela de
# estoque, conferido pela lista; o `uso` da retirada); ninguem mais o grava; e as duas telas o pedem.
rodar 'escritores do motivo'  php scripts/conferir-escritores-do-motivo.php

# QUEM GRAVA A COTA DO PACOTE DE QUEM VENDEU -- 03/11/2026, a fatia 74 (PDV-COTA-DO-PACOTE). O
# percentual (`produtos.cota_parte_pacote`) so pelo cadastro do pacote, conferido pela regra nas duas
# telas; quem vendeu e a cota dele (`vendas_produtos.vendedor_do_pacote` e `cota_do_vendedor`) so na
# finalizacao da sessao, sobre o valor dela; nenhum UPDATE nas colunas.
rodar 'escritores do pacote'  php scripts/conferir-escritores-do-pacote.php

# QUEM GRAVA O CUSTO DO PRODUTO EM CADA ITEM VENDIDO -- 03/11/2026, a fatia 74b (PDV-CUSTO-DO-ITEM; a 224 (b)
# do dono). `vendas_produtos.custo_unitario` so pelo `VendaProdutoService::gravarOCustoDoCadastro` (o produto
# de estoque, fora do pacote), que as duas portas que criam item chamam -- o lancamento e a agenda --; a
# sessao de pacote o zera; nenhum UPDATE na coluna (o passado nao se reescreve com o custo de hoje).
rodar 'escritores do custo'  php scripts/conferir-escritores-do-custo.php

# QUEM GRAVA A PORTA DO CONVITE DE INDICACAO -- 03/11/2026, a fatia 75 (REL-INDICACAO-PORTA; as 264 (b) e
# 265 (b) do dono). Toda criacao de `Indicacao` e de uma das duas portas (o convite do aplicativo e a etapa
# 6 da adesao) e grava a sua (`indicacoes.porta`); a linha do formulario nasce tambem para quem indica
# inativo, e a ligacao so para o ativo; a etapa 3 marca a adesao na linha; nenhum UPDATE na porta.
rodar 'escritores da porta'  php scripts/conferir-escritores-da-porta.php

# QUEM ESCREVE A TAXA DE ROYALTY -- 08/11/2026, a fatia 126 (PORTOES-E-COBERTURA; o D612). A taxa mora em
# `unidades` (`royltes_*`), e cada mudanca grava a vigencia em `royalties_aliquotas` (o D368). Este le o codigo:
# os `setRoyltes*` e o hidratador da unidade so no `UnidadeService`, a porta grava a vigencia depois do `flush`,
# a tabela da vigencia so recebe o INSERT da `VigenciaDaAliquota`, e nenhum UPDATE de unidade escreve a taxa.
rodar 'escritores da aliquota'  php scripts/conferir-escritores-da-aliquota.php

# O PASSO 0 DO CORTE -- D323, desde 03/10/2026.
#
# O passo 1 do corte refaz o `mysql.sql` a partir de PRODUCAO; o que mudou aqui
# depois do dump de 16/08 e nao foi aplicado la antes dele some do schema do
# PostgreSQL. Em 02/10 eram tres tabelas e colunas sem migracao, e a do Lider
# fora do procedimento -- cada uma anotada so no proprio debito. Este compara
# o `mysql.sql` com o do dump (commit 3b1f05c) e exige, para cada diferenca, uma
# migracao do LACO do passo 0 que a faca; e o laco igual as linhas "Aplicar", sem
# nada que o `mysql.sql` de hoje nao tenha (a revisao do mesmo dia achou a
# `sessoes` no laco, que pararia a janela no passo 4). Le o git, e nao o banco:
# fica aqui, e nao no CI, que clona raso e nao acha o commit (sai 2).
rodar 'passo 0 do corte'            php scripts/conferir-passo-zero-do-corte.php

# O PASSO 3 E O PASSO 9 DO CORTE -- as decisoes do dono de 06/10/2026.
#
# O passo 3 roda no MySQL de producao, uma vez e sem volta, o que o dono
# decidiu: o renomear dos pares de login, a caixa, o nascimento, o Lider e o
# dicionario de CEP com as 27 UFs. A primeira prova ficou num rascunho, e
# nenhum portao ficava vermelho se um desses passos saisse do procedimento. O
# primeiro abaixo ENSAIA os quatro roteiros num banco descartavel
# (`descartavel_ensaio_passo3`, criado e apagado por ele, pelo `docker exec` no
# conteiner do MySQL; `CONTEINER_MYSQL` aponta outro) e confere que o
# procedimento ainda manda roda-los. O segundo roda os blocos do passo 9,
# tirados do procedimento, sobre um crontab inventado, e exige que eles so
# instalem com a conferencia batendo. Nenhum dos dois toca o `franquiabv_dev`
# nem o `local.php`. Saida 2 e "nao consegui medir" (o conteiner parado).
rodar 'SQL do passo 3 do corte'     php scripts/ensaiar-sql-do-passo-3.php
# AS QUATRO PERMISSOES COM O NOME DA TELA (04/11/2026, a DE3 das Datas da equipe; a
# resposta 298 (c) do dono; o D701): o roteiro do passo 7 da etapa 1 e o inverso
# dele, num banco descartavel do MySQL, com as paradas (o nome novo em outro id, o id
# com outro nome) e a "plano carreira" intacta; e as fixtures carregadas por cima do
# catalogo antigo e do vazio, nos dois bancos, sem nome novo nem repetido. Pelo
# `docker exec` nos conteineres (`CONTEINER_MYSQL` e `CONTEINER_POSTGRES` apontam
# outros); bancos `descartavel_ensaio_de3*`, criados e apagados por ele. Nao esta no
# CI: o job do passo 3 so tem o MySQL, e este carrega tambem o PostgreSQL.
rodar 'permissoes com o nome da tela' php scripts/ensaiar-permissoes-com-o-nome-da-tela.php
rodar 'crontab do passo 9 do corte' sh scripts/ensaiar-crontab-do-passo-9.sh
# E a conta de quem chama as tres unidadeVendas* (a resposta 33 do dono, de
# 07/10/2026): roda no dia 0, uma vez, sobre o log da producao, e o numero volta
# ao dono. O ensaio a roda sobre um log de acesso INVENTADO e exige as contagens
# por dia, o que fica de fora, nenhum IP nem hash na saida, e a saida 2 quando
# nao mediu. Nao toca banco nenhum.
rodar 'conta das unidadeVendas* do dia 0' sh scripts/ensaiar-medir-chamadas-unidade-vendas.sh

# O D50 PELO NOME, e nao pelo codigo de saida (25/10/2026, a verificacao da fatia 41).
# Ate aqui este portao rodava por `rodar_conhecido`, que so le a saida: com o D50 ja
# dando 1, qualquer acusacao a mais -- a linha das 03:10 da Fidelizacao de volta a
# tabela do `f1-6-agendamento.md`, uma orfa -- ficava escondida atras dele. Agora o
# `--conhecidas=` tira da conta so a `conveniosAtualizarVencimento` (o D50: espera a
# producao), e o resto reprova; a conhecida que deixar de ser acusada tambem.
# E AS DUAS LIMPEZAS DO D26 (07/11/2026, a fatia 113; a resposta 195 (a)): as rotinas
# existem, e as linhas delas estao em `docs/crontab-a-aplicar.md`, a espera do passo 12
# da etapa 1 do corte -- conhecidas pelo mesmo motivo do D50, e pelo nome.
rodar 'agendamento das rotinas (fora D50 e as limpezas do D26)' \
    php scripts/conferir-agendamento.php --conhecidas=conveniosAtualizarVencimento,pushAppLimpar,agendasExclusoesLimpar

# --- os que falam com o banco -----------------------------------------------
#
# DO HOST, e nao de dentro do container, e a diferenca e grande: os dois varrem
# `module/` inteiro antes de consultar, e o scan atraves do bind mount do
# Windows leva MINUTOS. Do host, o de relacoes leva 1,3 s e o de nulos, 16 s.
#
# O que impedia rodar do host era o endereco -- `local.php` diz `host => mysql`,
# nome que so existe na rede do Docker. As duas variaveis contornam sem tocar na
# configuracao. As portas sao as publicadas pelo `docker-compose.yml`.
#
# Portao que demora minutos e portao que ninguem roda.
BANCO_HOST=${BANCO_HOST:-127.0.0.1}
BANCO_PORTA=${BANCO_PORTA:-3307}
export BANCO_HOST BANCO_PORTA

rodar 'ordenacao por coluna anulavel' php scripts/conferir-ordenacao-nulos.php
rodar 'unicidade das relacoes'        php scripts/conferir-relacoes-doctrine.php
rodar 'chaves unicas nos dados'       php scripts/conferir-unicidade.php
rodar 'limpeza por tras da unicidade' php scripts/conferir-limpeza-da-unicidade.php
rodar 'scripts que chegam ao navegador' php scripts/conferir-scripts-servidos.php
rodar 'protecao do webroot'           php scripts/conferir-protecao-do-webroot.php
rodar 'getAcl como booleano'          php scripts/conferir-acl-como-booleano.php
rodar 'guarda da agenda'              php scripts/conferir-guarda-da-agenda.php
rodar 'guarda do caixa'               php scripts/conferir-guarda-do-caixa.php
rodar 'remocao por POST'              php scripts/conferir-remocao-por-post.php
# O MEDIDOR DO D203 PARA TODA FORMA (19/10/2026, o D344): o indice de arranjo, o getter e a
# variavel impressos sem escape nas views vigiadas -- hoje, as quatro das etiquetas.
rodar 'escape nas views vigiadas'     php scripts/conferir-escape-nas-views.php
# O ID QUE VEM DE FORA SO VAI AO BANCO QUANDO CABE NA COLUNA -- a fatia 116 (API-ADM-IDS-E-PDV),
# desde 07/11/2026; o D516. O 99999999999 passa no `\d+` da rota e era 500 no PostgreSQL: este le
# os controllers da `/adm/api` sem comentarios e acusa o `find((int)` cru que voltar.
rodar 'id que cabe na coluna'         php scripts/conferir-id-que-cabe.php
# A MENSAGEM DO flashMessenger SO ANTES DE UM REDIRECIONAMENTO -- a fatia 120 (ERP-ANTIGO-ESCAPE-E-
# MENSAGENS), desde 08/11/2026; o D521. A pagina que volta sem redirecionar diz a frase com
# `dizerNaPagina`: a guardada saia de novo na pagina seguinte. Le os controllers sem comentarios.
rodar 'mensagem sem redirecionar'     php scripts/conferir-mensagem-sem-redirecionar.php

# --- o que fala com o Doctrine CLI (lento: ~1 min) --------------------------
rodar 'schema-tool destrutivo'      sh scripts/conferir-schema-tool.sh

# O FRONT PASSOU A TER TESTE -- 16/09/2026, e ate aqui nao tinha nenhum.
#
# POR QUE ELE ENTRA NESTA LISTA. Os 44 portoes acima leem ARQUIVO; nenhum deles
# executa React. Na vespera uma mudanca no front passou pelos 44 VERDE, e quem a
# pegou foi a suite de PHP -- que nao tem por que saber de TypeScript. O vao era
# esse, e ele custou um defeito de dado no menu que so apareceu no console do
# navegador, por acidente.
#
# E o primeiro caso que este arranjo rodou achou um segundo defeito, no proprio
# `MenuPrincipal`: sem a prop `ativo`, `undefined === undefined` abria TODOS os
# grupos de uma vez. Nao aparece no Console, onde `ativo` e sempre string --
# aparece em quem consome o componente publicado sem passar a prop.
#
# Leva ~60s, como o schema-tool. Se o `node_modules` do front nao estiver
# instalado, ele reprova dizendo isso, que e melhor que pular calado.
#
# QUATRO PROCESSOS, e nao um por nucleo. Com todos, o Windows estoura o prazo
# de um `findBy` em um ou dois casos DIFERENTES a cada rodada, em arquivos que
# nao mudaram: em 01/10/2026 este portao ficou vermelho duas vezes seguidas sem
# nenhum arquivo do front alterado, e o caso que caiu passava sozinho (32 de 32)
# e na suite inteira com `--maxWorkers=4` (1514 de 1514). Vermelho que nao diz
# nada ensina a ignorar o portao.
rodar 'testes do front'             npm test --prefix frontend -- --maxWorkers=4

echo ''

if [ "$conhecidos" -gt 0 ]; then
    echo "  $conhecidos vermelho(s) conhecido(s), com motivo escrito acima."
fi

if [ "$falhou" -eq 0 ]; then
    echo '  Nenhuma falha inesperada.'
    echo ''
    exit 0
fi

echo "  $falhou PORTAO(OES) FALHARAM:$nomes"
echo ''
echo '  Rode o que falhou sozinho para ver o motivo -- este roteiro engole a'
echo '  saida de proposito, para caber numa tela.'
echo ''
exit 1
