Projeto: RioNoTeatro. Fonte principal: /www/wwwroot/rionoteatro.com.br/docs/CHANGELOG.md.
Changelog - Rio no Teatro
> Changelog = historico do que ja foi entregue e validado.
> Backlog vivo de cada BK fica em docs/backlog/BK-XX-*.md.
> Antes de alterar regra compartilhada de governanca/workflow, comparar este repositorio com /root/cerebro.
2026
[2026-06-16] Helper WhatsApp compartilhado com Amor Eterno
bot/whatsapp/server.jspassou a reconhecer mensagens com tag#AEcomo tráfego do projeto Amor Eterno.- Mensagens recebidas com
#AEsão roteadas para o webhook local do Amor Eterno e deixam de cair no webhook/histórico normal do Rio no Teatro. - Envios feitos via API com
project=AEsão marcados para não poluir o histórico do Rio no Teatro. - Adicionado suporte a envio de mídia por
media_pathrestrito a/opt/amoreterno/media. - Service
rnt-whatsappreiniciado e validado conectado em127.0.0.1:3033.
[2026-05-20] Teste real WhatsApp: Enfermeira Zilda no Miguel Falabella
- Criado shortlink
https://rionoteatro.com.br/4pieparaEnfermeira Zildacom UTM da campanha de teste admin. - Importada campanha de teste
#10(enfermeira_zilda_mf_20260520_test_admin) com apenas o numero admin5521999915554, janela00:00-17:30por ser disparo no dia da sessao das19:30. - Enviado teste real pela fila profissional WhatsApp (
queue_id=9741):sent=1,failed=0,blocked=0; kill switch global religado apos o envio. - Ajustado segundo teste admin (
#11,queue_id=9742) com "unica apresentacao da comedia", CTA em frase unica ate18:30e rodape PT-BR com opt-out acentuado + atualizacao de zonas de interesse; envio real:sent=1,failed=0,blocked=0. - Confirmada viabilidade de base:
1256compradores historicos do Teatro Miguel Falabella com celular5521*e3674linhas de fila da base Zona Norte sem statussent.
[2026-05-20] Hotfix: lista digital do produtor abre token gerado pelo disparo diario
- Corrigido
config/listaopen_token_helper.phppara gerar tokens da lista digital com segredo estavel baseado nas variaveisDB_*do ambiente. - Mantida compatibilidade de leitura com tokens legados gerados antes da correcao, incluindo o link ja enviado para
Enfermeira Zilda - 20/05/2026 19:30:00. - Causa confirmada:
z_dispara_diario.phpgerava o token sem constantesDB_definidas, enquanto/produtor/listaopen.phpvalidava com constantesDB_, fazendo o token resolver para0no produtor e mostrar "Sessão não encontrada.". - Validacoes:
php -l config/listaopen_token_helper.php, resolucao do token antigo em contexto raiz e/produtor, resolucao de token novo em/produtorecurlpublico sem "Sessão não encontrada.".
[2026-04-29] BK-280: documentação da política de shortlinks
- Criado
docs/SHORTLINKS.mdcomo referência local da política de retenção. - Adicionado comentário em
config/shortlink_helper.phpapontando para essa documentação. - Reforçado que campanhas usam
expires_at=NULLpor padrão e que expiração é apenas opt-in/manual. - Changelog detalhado:
docs/changelog/2026/CL-2026-04-29-BK-280-doc-politica-shortlinks.md.
[2026-04-29] BK-279: roadmap de shortlink automático em Campanhas
- Documentado roadmap para implementar shortlink automático no fluxo
admin/modulos/campanhas/incluir.php/action.php. - Definida política de retenção: shortlinks de campanha ficam permanentes por padrão;
expires_atpassa a ser recurso opcional, não expiração automática. - Registrada estratégia de execução para amanhã com revisões externas menores e paralelas por pacote.
- Atualizados os links atuais
1a2be9t66paraexpires_at=NULL, mantendo histórico e redirect ativos por tempo indeterminado. - Smoke de revisão externa pequena: Gemini CLI encerrou por timeout em
90s; OpenCode falhou portools[*].eager_input_streaming. - Backlog vivo:
docs/backlog/BK-279-shortlink-automatico-campanhas.md.
[2026-04-29] BK-278: shortlinks rastreáveis para WhatsApp
- Criado
short.phpeconfig/shortlink_helper.phppara gerar, resolver e rastrear links curtos de campanha. - Adicionada regra de shortlink no
.htaccesse no rewrite efetivo do Nginx da VPS. - Gerados os links
https://rionoteatro.com.br/1a2behttps://rionoteatro.com.br/9t66preservando UTMs completas. - Regenerados os CSVs da campanha com copy em português BR, acentuação correta e link curto.
- Canceladas as filas antigas importadas antes da copy final e importadas as filas v2
#3e#4, ainda bloqueadas porglobal_kill_switch=true,dry_run_only=1e sem aprovação. - Validações:
php -l,nginx -t, reload do Nginx,curl -Ldos shortlinks, dedupe dos CSVs e processamento bloqueado por kill switch. - Backlog vivo:
docs/backlog/BK-278-shortlink-whatsapp-campanha.md. - Changelog detalhado:
docs/changelog/2026/CL-2026-04-29-BK-278-shortlink-whatsapp-campanha.md.
[2026-04-29] BK-277: dry-run WhatsApp Zona Norte com allowlist
- Criado
admin/cron/whatsapp_campaign_dry_run_zona_norte.phppara gerar dry-run da campanha deAs Loucas do Meiersem disparo. - A campanha segmenta compradores historicos de Teatro Miguel Falabella e Imperator, nao todos os teatros da Zona Norte; por padrao a query de destinatarios exige allowlist fixa
552199915551. - Adicionados guardrails:
- script CLI-only;
- flags
--send,--execute,--dispatche--enviarabortam; - nenhum helper/fila/webhook de WhatsApp e chamado;
- relatorios com destinatarios ficam em
admin/runtime/campaigns/, ignorado pelo Git. - Apos autorizacao do admin, o script ganhou
--full-csvpara gerar CSV completo sem allowlist, ainda sem qualquer rota de envio. - O CSV final passou a deduplicar por WhatsApp normalizado, preservando o cadastro com compra historica mais recente.
- A mensagem no CSV passou a usar
\nliteral para manter uma linha por destinatario. - Adicionado
--expanded-csvpara gerar CSV posterior de Zona Norte + Baixada, excluindo por WhatsApp normalizado quem ja entrou na base Miguel Falabella + Imperator. - O CSV extra foi validado com
2503WhatsApps unicos,0duplicados internos e0sobreposicao com a base dos 2 locais. - Instalada fila profissional WhatsApp com kill switch global, dry-run por padrao, aprovacao nominal, ciclos randomicos de envio, footer obrigatorio de opt-out e opt-out inbound automatico.
- Auditoria final do commit
8d70565f5confirmouglobal_kill_switch=true, campanhas v2#3/#4sem aprovacao real,sent_count=0,process --executebloqueado por kill switch e smokes de footer/opt-out sem envio. - Por autorizacao humana posterior, a campanha
#3foi aprovada para envio real e oglobal_kill_switchfoi desligado, sem rodarprocess --execute; a campanha#4segue bloqueada. - Disparo real monitorado da campanha
#3enviou15mensagens, bloqueou4numeros sem WhatsApp ativo, pausou automaticamente porauto_failure_rate_21e teve oglobal_kill_switchreligado. - Apos identificar telefones fora do DDD 21 no disparo, o fluxo foi corrigido para aceitar somente
5521+9digitos, preferindoclientes.celulare usandoclientes.telefoneapenas como fallback valido; a fila tambem passou a prechecar/check-numberantes de enviar. - Backlog vivo:
docs/backlog/BK-277-whatsapp-zona-norte-dry-run.md. - Changelog detalhado:
docs/changelog/2026/CL-2026-04-29-BK-277-whatsapp-zona-norte-dry-run.md.
[2026-04-28] BK-276: lock operacional local fora do GitHub
docs/LOCK.mddeixou de carregar estado vivo de locks e passou a ser apenas protocolo/template versionado.- O estado operacional diario passa a ficar em
docs/LOCK.local.md, ignorado pelo Git. - Criado
docs/LOCK.local.example.mdcomo modelo versionado. - Atualizados
AGENTS.md,docs/AGENTS.mdedocs/GIT_WORKFLOW.mdpara apontar o fluxo diario ao lock local. - Changelog detalhado:
docs/changelog/2026/CL-2026-04-28-BK-276-lock-local-fora-github.md.
[2026-04-28] BK-275: hotfix 502 no Gerar com IA do Texto para Audio
- Corrigido
admin/modulos/campanhas/redes_sociais/texto_for_audio.phppara o botaoGerar com IAnao aguardar provedores de IA dentro da requisicao web. - Causa confirmada: o POST sincrono podia ficar preso em chamadas Gemini/Kimi/bridge por 75-120s e estourar o gateway.
- O botao principal e o
Refazer com sugestaoagora criam um job pendente emsocial_audio_jobs, redirecionam o admin e processam a IA em background. - O fluxo
Gerar TUDO (background)passou a reaproveitar o mesmo executor de job pendente. - Apos teste real do job
#13, o processamento passou a marcarprocessandoantes de chamar IA e o timeout do bridge Gemini/Kimi foi reduzido para cair em fallback mais rapido quando o provedor travar. - A tela do job ativo passou a mostrar alerta de status e auto-refresh enquanto o job estiver
pendenteouprocessando. - Apos o job
#14, erros terminais do Gemini direto, como quota/billing/rate-limit, deixam de tentar o bridge e caem em fallback mais rapido com aviso mais fiel. - Por decisao operacional posterior, o provider
geminido Texto para Audio deixou de usar chave/API Google e passou a chamar sempre o Gemini CLI logado na VPS. - Validacao CLI: chamada PHP isolada retornou
provider=gemini,model=gemini_cli_defaulte 3 versoes geradas. - Validacao:
php -l admin/modulos/campanhas/redes_sociais/texto_for_audio.php. - Changelog detalhado:
docs/changelog/2026/CL-2026-04-28-BK-275-hotfix-audio-copy-timeout-502.md.
[2026-04-27] Hotfix: feed pecas.xml inclui sessoes no ultimo dia da temporada
- Corrigido
atualizar_feed.phppara compararDATE(sec_data)comfim_temporadaao montar os feeds Meta/Google. - Causa confirmada:
tab_sessoes.sec_dataedatetime, enquantopecas.fim_temporadaedate; sessoes as 20h no proprio ultimo dia eram removidas do XML. - Impacto confirmado:
pecas.phplistava 3 pecas ativas, maspecas.xmlpublicava apenasFanáticos;As Loucas do MéiereÉ Tudo Culpa Da Mãeficaram fora por terem sessao unica no dia final da temporada. - Feeds regenerados no servidor:
pecas.xml,pecas_inteira.xml,ofertas.csveoffer.csv. - Validacoes:
php -l atualizar_feed.php; consulta SQL comparativa retornando 3 pecas;php atualizar_feed.phpcomitens=3; leitura local e via URL publica dehttps://rionoteatro.com.br/pecas.xmlconfirmando IDs1509,1493e1536. - Changelog detalhado:
docs/changelog/2026/CL-2026-04-27-hotfix-feed-pecas-ultimo-dia.md.
[2026-04-27] Hotfix crítico: valor unitário no Mercado Pago
- Corrigido o fluxo de rascunho do pedido para gravar
pedidos.valorcomo valor unitário, não como total do pedido. - Blindado o cálculo enviado ao Mercado Pago para detectar rascunhos antigos com total salvo em
valore cobrar somentevalor_unitario * qtd. - Ajustada a tela de checkout para exibir e inicializar PIX/cartão com o total protegido.
- Corrigidos rascunhos pendentes contaminados para evitar retomada de checkout com cobrança duplicada.
- Auditoria de impacto confirmou cobrança a maior nos pedidos
#73731e#73767; os estornos da diferença foram executados manualmente pelo admin. - Validações:
php -lemconfig/functions_new.php,pedido.php,pedido_pagseguro.php,action.phpecheckout_pix.php;git diff --check; simulação local de cálculo pós-hotfix para#73731e#73767. - Changelog detalhado:
docs/changelog/2026/CL-2026-04-27-hotfix-mercadopago-valor-unitario.md.
[2026-04-13] BK-271: restauração de agenda e carrossel compacto unificado
eventos.php- Restaurada a versão funcional da agenda (bkp_original_20260413-0354).
- Adicionado botão 'Voltar ao topo' com ícone oficial.
- Sincronizado o visual compacto do carrossel (Nome | Local | Classificação em uma linha).
- Sincronizado o comportamento de scroll direcional (some ao descer, aparece ao subir significativo).
evento.php- Alterada a frase do badge de venda externa para "VENDA EXTERNA | SEM PROMOÇÃO RIONOTEATRO".
- Unificado o visual compacto do carrossel e removido o botão grande de oferta.
- Implementada a lógica de scroll direcional, removendo a trava de visibilidade anterior.
- Estabilizado o offset fixo em 60px para ambos os arquivos.
[2026-04-12] BK-267: memória persistente de preço captado x corrigido
admin/modulos/eventos/action.phppassou a registrar overrides de valor do BOT embot_valor_overridesquando o admin corrige um preço captado errado.- o registro guarda, no mínimo:
- sugestão
- evento
- sessão/data
- valor captado
- valor corrigido
bot/handlers/event_matcher.phppassou a consultar essa memória antes de contarvalor_alterado.- resultado prático:
- se o BOT capturar novamente o mesmo valor errado já corrigido para aquela sessão, isso não volta como
Alteração Detectada.
[2026-04-12] BK-267: hardening de unificação e nome editado do captado
admin/modulos/eventos/action.phpUnificarpassou a forçar o evento destino parastatus = 'A'- o merge agora também propaga para o destino o nome/sinopse/ficha/local editados pelo admin na sugestão captada
- o slug canônico do destino continua preservado
[2026-04-12] BK-267: conciliação preserva produtor/origem
admin/modulos/eventos/action.phpconciliar_vincular,conciliar_unificar,conciliar_aplicar_updateeconciliar_reativarpassaram a preservarorigemeid_produtoratuais do evento destinoadmin/modulos/eventos/conciliacao.php- a UI deixou de oferecer opções de migrar/assumir produtor nesta tela
- a tela passou a deixar explícito que a conciliação só atualiza conteúdo
BK-246 · Clarificação da janela real de lock em docs/LOCK.md
Data: 9 de Abril de 2026
Contexto operacional:
- a regra local de lock ainda deixava margem para manter o proprio docs/LOCK.md em
LOCKEDmesmo sem escrita ativa no arquivo. - isso criava atrito desnecessario porque o quadro canonico precisava continuar disponivel para outros programadores registrarem seus arquivos.
- o alinhamento humano da rodada foi explicitar que espera por teste, autorizacao ou qualquer validacao externa nao justifica bloquear o quadro em si.
Ajustes aplicados:
AGENTS.md- a seção de lock por arquivo passou a declarar que
docs/LOCK.mdso ficaLOCKEDdurante a janela real de edição do proprio arquivo; - o fluxo obrigatorio ganhou a mesma regra nos passos de fechamento.
docs/LOCK.md- a seção
Como usarpassou a declarar expressamente a exceção operacional do proprio quadro; - a seção
Estadospassou a registrar que o caso especial dedocs/LOCK.mdexige lock curto e funcional, não prolongado.
Validações:
- conferência textual dos trechos alterados em
AGENTS.md - conferência textual dos trechos alterados em
docs/LOCK.md - aplicação imediata da regra nas linhas abertas do
BK-245
Referências:
- backlog vivo: BK-246-lock-md-so-durante-edicao-real.md
- changelog detalhado: CL-2026-04-09-BK-246-lock-md-so-durante-edicao-real.md
BK-245 · Hotfix de ultimo dia em peca.php
Data: 9 de Abril de 2026
Contexto operacional:
- a página pública de venda em peca.php considerava a peça encerrada logo após
00:00do própriofim_temporadaquando o campo vinha salvo apenas comoYYYY-MM-DD. - isso fazia a vitrine cair cedo no layout enxuto de fora de cartaz mesmo durante o último dia válido da temporada.
- a validação funcional humana da rodada confirmou que esse era o comportamento observado em produção.
Ajustes aplicados:
peca.php- a regra de
em_cartazdeixou de compararstrtotime($dtFim)diretamente comtime(); - o arquivo passou a calcular
dtFimTimestampde forma defensiva: - se
fim_temporadavier comoYYYY-MM-DD, o fim passa a ser interpretado como23:59:59desse dia; - se no futuro o campo vier com horário real, o horário existente continua valendo.
Validações:
php -l peca.php- revisão do diff final isolado
- validação funcional humana no ar com confirmação de funcionamento
Referências:
- backlog vivo: BK-245-peca-ultimo-dia-fim-temporada.md
- changelog detalhado: CL-2026-04-09-BK-245-hotfix-ultimo-dia-peca.md
BK-244 · Hotfix de performance no painel de pedidos
Data: 9 de Abril de 2026
Contexto operacional:
- a tela painel/modulos/pedidos/index.php estava lenta no fluxo autenticado do cliente.
- a análise confirmou N+1 queries em
pecasetab_sessoes, além de leitura repetida de disponibilidade dentro da renderização. - na mesma rodada, após o hotfix principal, o botão
Carregar maise os botões renderizados dinamicamente precisaram ser ajustados para voltar a funcionar e respeitar o tema dark atual.
Ajustes aplicados:
painel/modulos/pedidos/index.php- criados helpers locais read-only para validade e disponibilidade com cache por request;
- a listagem passou a pré-carregar peças, sessões, última sessão por evento, sessão atual por
id_evento + data, totais comprados e configs mínimas antes do loop principal; - removidas consultas repetidas a
pecasetab_sessoesdentro da renderização da listagem; - o payload JS passou a usar
status_labellimpo para os cards carregados dinamicamente; - o botão
Carregar maisfoi corrigido e o container da seçãoTodosfoi fechado corretamente; - os botões dinâmicos receberam ajuste visual local para respeitar o tema dark da tela atual.
Validações:
php -l painel/modulos/pedidos/index.php- revisão do diff final do arquivo
- validação funcional humana na própria sessão:
- abertura da tela mais rápida
Carregar maisfuncionando- botões/cores coerentes com o tema dark
Referências:
- changelog detalhado: CL-2026-04-09-BK-244-hotfix-performance-painel-pedidos.md
BK-243 · Ajuste local da regra DONE vs UNLOCKED no LOCK
Data: 9 de Abril de 2026
Contexto operacional:
- a regra local ainda deixava margem para encerrar a linha criada pelo próprio BK como
UNLOCKED. - o alinhamento humano da rodada foi deixar
DONEcomo padrão para a linha criada pelo BK atual e usarUNLOCKEDapenas quando uma linha reaproveitada estiver sendo devolvida ao estado livre.
Ajustes aplicados:
docs/LOCK.md- a semântica de
DONEeUNLOCKEDfoi esclarecida; - a limpeza automática/manual de linhas
DONEpassou de5para7dias sem uso; - as linhas abertas pelo
BK-242foram convertidas deUNLOCKEDparaDONE. AGENTS.md- o protocolo do projeto foi alinhado para repetir a mesma regra prática em texto canônico.
Validações:
- conferência textual das regras em
AGENTS.mdedocs/LOCK.md - conversão das linhas do
BK-242para o estado final correto da trilha
Referências:
- backlog vivo: BK-243-regra-done-vs-unlocked-lock.md
- changelog detalhado: CL-2026-04-09-BK-243-regra-done-vs-unlocked-lock.md
BK-242 · Inativação automática de peças vencidas no admin
Data: 9 de Abril de 2026
Contexto operacional:
- a listagem admin/modulos/pecas/index.php tratava a aba
Ativasapenas porstatus = 'A'. - por isso, peças com
fim_temporadajá encerrado continuavam aparecendo no admin quando o status não era limpo a tempo. - o caso real da rodada foi a peça
Bee Gees, Abba e Carpenters - Nos embalos de SÁBADO a noite(id=333), que ainda estava ativa mesmo tendo encerrado em25/03/2026.
Ajustes aplicados:
admin/cron/expired_pecas_status_helper.php- criado helper compartilhado para localizar e inativar peças com
status = 'A'efim_temporada < CURDATE(); - adicionada guarda por lock e throttle curto para evitar reexecução excessiva.
admin/modulos/pecas/index.php- a rotina de saneamento passou a rodar antes da montagem da listagem do admin.
admin/cron/sync_facebook_events.php- a mesma rotina passou a rodar antes da sincronização com Facebook, com log quando houver atualização.
Validações:
php -l admin/cron/expired_pecas_status_helper.phpphp -l admin/modulos/pecas/index.phpphp -l admin/cron/sync_facebook_events.php- execução real da rotina no banco com
79peças inativadas - conferência posterior retornando
0peças comstatus='A'efim_temporada < CURDATE()
Referências:
- changelog detalhado: CL-2026-04-09-BK-242-inativacao-pecas-vencidas-admin.md
BK-241 · Hotfix da Central de Cancelamento para peças online
Data: 9 de Abril de 2026
Contexto operacional:
- a
Central de Cancelamento de Sessãoem admin/modulos/pecas/index.php havia voltado a divergir da vitrine pública. - o select
Espetáculoestava listando todos os eventos ativos, em vez de apenas as peças elegíveis de pecas.php. - o select
Sessãoainda incluía sessões antigas. - a rodada também exigiu refinamento iterativo dos textos padrão enviados por WhatsApp.
Ajustes aplicados:
admin/modulos/pecas/session_cancel_console_helper.php- a elegibilidade pública foi centralizada em
session_cancel_console_public_catalog_where(); - o select
Espetáculopassou a espelhar a mesma regra comercial depecas.php; - a validação do
event_idno backend passou a usar a mesma regra; - o select
Sessãopassou a listar apenas sessões de hoje em diante; - o envio passou a substituir
{primeiro nome}pelo primeiro nome real do destinatário; - as mensagens padrão do console foram alinhadas à copy final validada na rodada.
admin/modulos/pecas/index.php- comentário explícito deixado ao lado do select
Espetáculopara evitar nova regressão por troca da fonte. docs/modules/pecas/KNOWN_TRAPS.md- criado para registrar traps datados do módulo;
- incluída a regra de sempre comparar
arquivo atual + bkp_original mais novo + backup antigo útilantes de reaproveitar trecho antigo.
Validações:
php -l admin/modulos/pecas/session_cancel_console_helper.phpphp -l admin/modulos/pecas/index.php- validação funcional incremental no admin com feedback humano durante a rodada
Referências:
- changelog detalhado: CL-2026-04-09-BK-241-hotfix-central-cancelamento-pecas-online.md
BK-240 · Upload rápido do admin com suporte a imagens
Data: 8 de Abril de 2026
Contexto operacional:
- a área admin/index.php de
Upload Rápido de Arquivoaceitava apenas planilhas, documentos e formatos estruturados. - a operação precisava subir também imagens
jpg,jpegepngsem quebrar a whitelist já existente.
Ajustes aplicados:
admin/index.php- o input de upload passou a aceitar
jpg,jpegepng; - o texto de ajuda foi atualizado para refletir a nova whitelist.
admin/upload_dashboard_arquivo.php- a whitelist do backend passou a aceitar
jpg,jpegepng; - a mensagem de erro foi alinhada à nova lista de formatos.
imgs/20260408-224728-b1904ad8-logomarca-atelie-vo-neinha.png- a imagem enviada no upload real da rodada foi movida de
/arquivos/download/para um caminho estável emimgs/.
Validações:
php -l admin/index.phpphp -l admin/upload_dashboard_arquivo.php- validação funcional com upload real de imagem no admin
Referências:
- changelog detalhado: CL-2026-04-08-BK-240-upload-rapido-admin-imagens.md
BK-239 · Unificacao documental de docs com AGENTS como entrada principal
Data: 8 de Abril de 2026
Contexto operacional:
- a camada
/docsestava com onboarding fragmentado entre docs/AGENTS.md, docs/README.md e docs/00_SITEMAP_DOCUMENTACAO.md. - parte dessa trilha ainda carregava referencias quebradas e descricao desalinhada do estado real do repositorio apos a limpeza recente de legados.
Ajustes aplicados:
docs/AGENTS.md- consolidado como ponto de entrada principal de
/docs; - passou a concentrar onboarding, fontes de verdade, mapa rapido e regras de manutencao da camada documental.
docs/README.md- reduzido a stub minimo de redirecionamento para
docs/AGENTS.mdedocs/00_SITEMAP_DOCUMENTACAO.md. docs/00_SITEMAP_DOCUMENTACAO.md- reescrito para descrever apenas o estado real atual de
docs/; - deixou de tratar como referencia atual arquivos removidos, ausentes ou historicos.
Validações:
- conferência local de existencia dos links principais citados no novo
AGENTSe no novoSITEMAP - revisão da direção proposta com segunda opinião externa trazida via OpenCode pelo usuário, filtrando os itens realmente stale dos falsos positivos
Referências:
- changelog detalhado: CL-2026-04-08-BK-239-docs-agents-readme-sitemap.md
BK-236 · Fechamento do produtor sem seletor de período e sem RG
Data: 8 de Abril de 2026
Contexto operacional:
- a tela produtor/fechamento.php ainda permitia ao produtor trocar manualmente o período do relatório e exibia o
RGdos compradores na planilha. - na mesma rodada, a ação de WhatsApp precisava ser simplificada para um texto curto de aprovação do fechamento, em vez de abrir uma mensagem longa com todo o resumo novamente.
Ajustes aplicados:
produtor/fechamento.php- o seletor de período foi removido e a página passou a exibir apenas o mês vindo pela query
m=YYYY-MM; - o
RGsaiu da consulta SQL e da tabela renderizada para o produtor; - o botão foi renomeado para
Aprovar via WhatsApp; - a mensagem do WhatsApp passou a abrir em formato curto:
Fechamento da Peça {nome} aprovado!Valor Repasse (80%): R$ {valor}Segue PIX:Nome da conta:- o e-mail
financeiro@rionoteatro.com.brfoi removido do rodapé da página.
Validações:
php -l produtor/fechamento.php
Referências:
- changelog detalhado: CL-2026-04-08-BK-236-fechamento-produtor-whatsapp.md
BK-227 · Checkout de créditos com PIX, cartão MP e planos alinhados ao painel
Data: 8 de Abril de 2026
Contexto operacional:
- o módulo de painel/modulos/creditos/index.php ainda expunha um fluxo centrado só em PIX, com pacote teste de
R$ 1, sem detalhar claramente o que cada valor entregava e sem aceitar cartão Mercado Pago dentro da própria tela. - a operação também precisava alinhar os pacotes aos recursos premium reais do painel de eventos e exigir os mesmos dados de faturamento já usados no checkout principal para o cartão.
Ajustes aplicados:
painel/modulos/creditos/index.phppainel/modulos/creditos/action.phppainel/modulos/creditos/callback_mp.php- o pacote teste de
R$ 1foi ocultado e a tela passou a trabalhar com os planos reais50,200,300e500; - ao clicar no plano, a tela agora mostra o que aquele valor engloba, reaproveitando a lógica/copy dos recursos premium do painel de eventos;
- o usuário escolhe entre
PIXeCartãodentro da própria página; - o
PIXpassou a abrir o QR Code em modal; - o
Cartãopassou a usar o Brick oficial do Mercado Pago; - foram adicionados os campos de faturamento exigidos pelo Mercado Pago para cartão:
CEP,Telefone/Celular,Logradouro,Nº,Bairro,CidadeeUF; - o backend de créditos passou a processar cartão Mercado Pago, consultar status da compra e reconciliar callback/webhook para
PIXeCartão; - os textos dos pacotes e observações comerciais foram refinados conforme a regra operacional validada na sessão.
Validações:
php -l painel/modulos/creditos/index.phpphp -l painel/modulos/creditos/action.phpphp -l painel/modulos/creditos/callback_mp.phpnode --checkdo JS inline sanitizado da tela de créditos
Referências:
- changelog detalhado: CL-2026-04-08-BK-227-creditos-pix-cartao-mercadopago.md
BK-225 · Ordem da vitrine de eventos separada por admin, produtor e bot
Data: 8 de Abril de 2026
Contexto operacional:
- a vitrine pública de eventos.php ainda agrupava tudo em apenas dois blocos: venda online/admin primeiro e o restante depois.
- a operação precisava destacar primeiro os eventos sob gestão do admin ou em
parceria_online=1, depois os eventos aprovados de produtor e, por último, os eventos aprovados vindos do bot.
Ajustes aplicados:
eventos.php- o
ORDER BYda listagem principal passou a priorizar em três níveis: admineparceria_online=1produtorbot- os filtros existentes de
status, aprovação e janela de temporada foram preservados.
Validações:
- leitura da query principal em
eventos.php php -l eventos.php- consulta real na base confirmando os primeiros blocos na sequência
admin/parceria -> produtor -> bot
Referências:
- changelog detalhado: CL-2026-04-08-BK-225-ordem-eventos-vitrine.md
BK-224 · Scroll horizontal mobile na lista de eventos do painel
Data: 7 de Abril de 2026
Contexto operacional:
- em telas mobile, a tabela de painel/modulos/eventos/index.php estourava a largura disponível e quebrava o layout da página.
Ajustes aplicados:
painel/modulos/eventos/index.php- a tabela passou a ficar dentro de um wrapper com
overflow-x: autono mobile; - a largura mínima da tabela foi preservada para evitar colapso das colunas.
Validações:
- leitura da estrutura da tabela no painel
php -l painel/modulos/eventos/index.php
Referências:
- changelog detalhado: CL-2026-04-07-BK-224-mobile-scroll-painel-eventos.md
BK-223 · Hotfixes do fluxo produtor/admin de eventos e peças
Data: 7 de Abril de 2026
Contexto operacional:
- o painel do produtor ainda limitava upload de foto a
5MB, mantinha imagens empending_eventossem promover para o caminho canônico em cenários de parceria online e permitia estados inconsistentes entrestatus,editado_produtor,origemeparceria_online. - no admin, a fila de eventos precisava exibir melhor a mídia pendente, o dashboard precisava mostrar solicitações de exclusão, o save/approve precisava bloquear conflito de slug ativo e o módulo de peças precisava voltar a abrir previews válidos e permitir remover a gestão
Adminquando apropriado. - a VPS também estava sem agendamento ativo para o cleanup de imagens antigas, apesar do script já existir no repositório.
Ajustes aplicados:
painel/modulos/eventos/incluir.phppainel/modulos/eventos/editar.phppainel/modulos/eventos/action.php- upload de foto do produtor elevado para
10MB, mantendo crop/resize antes de persistir; - edição do produtor bloqueada quando
parceria_online=1, com aviso explícito e link de WhatsApp do admin; - slug passou a ser validado contra peças/eventos ativos antes de cadastrar ou editar;
- exclusão lógica do produtor passou a apagar mídia local imediatamente;
- quando o evento entra em
parceria_online=1, a foto pendente é promovida para/arquivos/pecas/<id>/...no próprio fluxo do painel. admin/modulos/eventos/index.phpadmin/modulos/eventos/editar.phpadmin/modulos/eventos/action.phpadmin/index.php- dashboard admin ganhou alerta para
Solicitação de Exclusão; - fila admin passou a priorizar foto pendente, depois foto publicada e por fim imagem externa;
- campo
slugfoi exposto para revisão/edição do admin; - aprovação, criação e edição no admin passaram a barrar conflito com slug já ativo.
admin/modulos/pecas/index.phpadmin/modulos/pecas/action.php- previews inativos voltaram a abrir rota pública válida;
- ativar peça/evento em contexto admin agora zera
editado_produtor; - badge
Adminpassou a permitir remover a gestão admin e devolver o item ao produtor comparceria_online=0estatus=I. admin/cron/cleanup_old_pecas_images.php- cleanup endurecido para reconciliar
tb_fotosdurante execução real.
Validações:
php -lem todos os PHPs alterados- validação humana do botão salvar no painel produtor
- validação humana do link real da coluna
Nomeno admin de peças - execução real do cleanup:
241arquivos removidos9.37 MBliberados242registros removidos detb_fotos- segundo dry-run com
0candidatos restantes
Referências:
- changelog detalhado: CL-2026-04-07-BK-223-eventos-pecas-hotfixes.md
BK-222 · Link publico real na coluna Nome das pecas ativas
Data: 7 de Abril de 2026
Contexto operacional:
- na listagem de admin/modulos/pecas/index.php, a coluna
Nomedas peças/eventos ativos ainda abria o preview interno do admin comevento.php?id=...&preview=1. - para operação e conferência rápida, o clique precisava abrir a URL pública real do evento no site, como
https://rionoteatro.com.br/<slug>.
Ajustes aplicados:
admin/modulos/pecas/index.php- a coluna
Nomepassou a usar a URL pública canônicahttps://rionoteatro.com.br/<slug>quando o item está comstatus = A; - quando o
slugestiver vazio, o link faz fallback seguro parahttps://rionoteatro.com.br/evento.php?id=<id>ouhttps://rionoteatro.com.br/peca.php?id=<id>; - itens fora do ar continuam abrindo o preview legado com
&preview=1.
Validações:
- leitura do trecho de montagem da coluna
Nomeemadmin/modulos/pecas/index.php - conferência da regra pública já usada em
admin/modulos/eventos/index.php php -l admin/modulos/pecas/index.php- validação funcional no admin confirmando a abertura do link público real
Referências:
- changelog detalhado: CL-2026-04-07-BK-222-links-publicos-pecas-ativas.md
BK-183 · Correção da validação de datas de temporada no painel
Data: 7 de Abril de 2026
Contexto operacional:
- a edição de evento no painel do cliente-produtor estava bloqueando o salvamento com a mensagem
Datas de temporada invalidas. Use DD/MM/AAAA.mesmo com datas válidas preenchidas. - a comparação com
painel/modulos/eventos/incluir.phpmostrou que o formulário de edição estava sem os IDs esperados pela validação JavaScript.
Ajustes aplicados:
painel/modulos/eventos/editar.php- adicionados apenas
id="inicio_temporada"eid="fim_temporada"nos campos de data; - patch reduzido ao mínimo necessário para alinhar o formulário de edição ao padrão de
incluir.php.
Validações:
- leitura comparativa de
painel/modulos/eventos/incluir.phpepainel/modulos/eventos/editar.php php -l painel/modulos/eventos/editar.php- teste real no navegador confirmando o salvamento sem o erro anterior
Referências:
- changelog detalhado: CL-2026-04-07-BK-183-align-temporada-ids.md
BK-201 · Automação social da peça nova + agenda operacional
Data: 3 de Abril de 2026
Contexto operacional:
- o fluxo de nova peça ainda estava parcial, com approvals inconsistentes, stories pesados, WhatsApp misturado com alertas e agenda sem edição operacional suficiente.
- a operação precisava validar o ciclo real: gerar approvals, aprovar, reagendar, editar e reagendar postagem na plataforma.
Ajustes aplicados:
- a primeira rodada automática da peça nova passou a abrir a trilha de
facebook_feed,instagram_feed,threads_feed,facebook_storyeinstagram_story - o número de approval de postagem foi segregado dos alertas gerais no WhatsApp
- o pipeline de copy ganhou bridge/pool local e a aprovação humana seguiu como gate obrigatório
- a agenda passou a mostrar
queue_id, gatilho humano + código técnico, horário planejado completo e texto aprovado - a agenda ganhou edição operacional de texto, mídia e agendamento para itens editáveis
- o modal da agenda passou a abrir o approval quando o item estiver em
pending_approvale houver artifact - o charset do fluxo foi alinhado para
utf8mb4, corrigindo degradação de emojis na agenda facebook_feedemscheduledganhou fluxo deEditar, cancelando o agendamento remoto e reabrindo o item para edição- o fluxo de mídia passou a priorizar vídeo nos canais compatíveis e a alternar vídeo/capa por peça+canal na semana
facebook_feedcom vídeo do acervo local passou a subir o arquivo por upload binário, evitando dependência dofile_urlremoto para a Graph API- a publicação no Instagram passou a aguardar o container de vídeo ficar pronto antes do
media_publish, reduzindo o erro9007 instagram_feedpassou a montar payload deREELSquando houver vídeothreads_feedpassou a montar payload comvideo_url, ainda dependente de validação real porque o token do canal segue inválido
Validações:
php -lem:admin/cron/sync_facebook_events.phpadmin/cron/ai_copy_helper.phpadmin/classes/FacebookEventService.phpadmin/modulos/campanhas/action_squad.phpadmin/modulos/campanhas/aprovar_squad.phpadmin/modulos/facebook/agendamento.phpadmin/modulos/facebook/agendamento-events.phpadmin/modulos/facebook/agendamento-update-status.phpconfig/connect.phpadmin/data/__CLASS.SQL.php- validação real de approval e fila para
Fanáticos - validação real de
Editaremfacebook_feed scheduled, com novo rascunho agendado na plataforma - rerun real do
queue_id 1024(Fanáticos/facebook_feed) saindo do erro de fetch remoto do vídeo para publicação bem-sucedida - rerun real dos
instagram_storycom vídeo (queue_id 1028e1029) saindo do9007 Media ID is not availablepara publicação bem-sucedida
Referências:
- backlog vivo: BK-201-automacao-social-nova-peca-e-squad.md
- changelog detalhado: CL-2026-04-03-BK-201.md
BK-195 · Análise de mídia e tração 2024 x 2025 x 2026
Data: 1 de Abril de 2026
Contexto operacional:
- o projeto já tem snapshots históricos de Meta Ads e snapshots recentes de GA4, permitindo uma leitura inicial da perda de tração de mídia.
Ajustes aplicados:
- criado ANALISE_MIDIA_TRACAO_2024_2026.md
- criado BK-195-analise-midia-tracao-2024-2026.md
- criado CL-195-analise-midia-tracao-2024-2026.md
Validações:
- leitura dos snapshots persistidos em
campanhas_metricas_importadas - comparação do histórico retroativo do Meta com o snapshot recente de GA4
BK-194 · Add Peça com IA no admin de Peças
Data: 1 de Abril de 2026
Contexto operacional:
- o fluxo atual depende de texto recebido no WhatsApp + consulta manual do Sympla + preenchimento manual em
pecas/detalhe.php. - isso é útil, mas lento e repetitivo.
- o follow-up do mesmo dia fechou a tentativa interrompida de embutir a nova tela direto na aba de Peças.
Ajustes aplicados:
- criada a nova aba
Add Peça com IAem index.php - criada a tela dedicada add_ia.php
- a primeira fase já permite:
- colar o texto do WhatsApp
- extrair campos principais
- detectar o link do Sympla
- abrir rapidamente a conciliação e o link da venda oficial
- o embed da aba passou a:
- respeitar
#tab-add-iano carregamento - manter o POST interno em modo
embed - abrir
detalhe.phpna janela principal quando o rascunho é promovido - ajustar a altura do
iframeno carregamento - o fluxo de peça admin/parceria foi endurecido para:
- persistir
origem='admin'no save do módulo de peças; - exibir endereço + mapa em
peca.php; - exibir CTA operacional de WhatsApp em
evento.phpquando faltar contato cadastrado; - gerar meta descriptions corretas mesmo quando a sinopse antiga vier com entidades HTML;
- fazer novos salvamentos do editor em UTF-8 normal, sem
ó/ç - publicado CL-194-embed-fix-add-ia.md
Validações:
- leitura do fluxo atual em
painel/modulos/eventos/incluir.php - leitura da conciliação em
admin/modulos/eventos/conciliacao.php - leitura da listagem e do formulário de peças em
admin/modulos/pecas/index.phpedetalhe.php php -l admin/modulos/pecas/index.phpphp -l admin/modulos/pecas/add_ia.phpphp -l admin/modulos/pecas/action.phpphp -l peca.phpphp -l evento.phpphp -l meta-analytics.php
BK-188 · Mapa operacional de GTM/GA4/Ads/Meta
Data: 31 de Março de 2026
Contexto operacional:
- O repositório acumulava tracking atual e legado em paralelo, o que dificultava entender com clareza quais tags e eventos ainda são canônicos.
Ajustes aplicados:
- criado MAPA_TRACKING_GTM_GA4.md
- o documento separa:
- containers/tags identificados
- eventos identificados
- arquivos centrais
- camada atual vs legado
- recomendações de manutenção
Validações:
- leitura do HTML público da home
- busca em código por
gtag,dataLayer,fbq,send_to,GTM,GA4,UAeAds
BK-189 · Google Ads em rascunho para aprovação humana
Data: 31 de Março de 2026
Contexto operacional:
- o tracking atual do RNT já permite orientar melhor campanhas de mídia paga.
- o operador quer ajuda das IAs na criação de anúncios, mas sem publicação automática e sem risco de surpresa na fatura.
Ajustes aplicados:
- criado PLANO_GOOGLE_ADS_RASCUNHO_APROVACAO.md
- o documento formaliza:
- uso do tracking atual como base de sugestão;
- campanhas e anúncios em modo rascunho;
- aprovação humana antes de qualquer publicação;
- proibição explícita de automação cega de gasto/orçamento.
Validações:
- leitura do mapa atual de tracking do RNT
- alinhamento do fluxo operacional com a preferência de aprovação humana antes de mídia paga
BK-190 · Padronização de ARCHITECTURE.md e GUIDELINES.md
Data: 31 de Março de 2026
Contexto operacional:
- o projeto já tinha material útil em
.agent/e.context, mas faltava uma dupla curta e explícita na raiz para reduzir custo de contexto.
Ajustes aplicados:
- criado ARCHITECTURE.md
- criado GUIDELINES.md
Validações:
- leitura da estrutura real do projeto
- alinhamento com o mapa atual de tracking, admin e cron
BK-191 · Rascunho inicial de Google Ads e Meta Ads
Data: 31 de Março de 2026
Contexto operacional:
- o RNT já tem tracking suficiente para apoiar uma primeira rodada de mídia assistida.
- a operação continua exigindo aprovação humana antes de qualquer publicação ou gasto.
Ajustes aplicados:
- criado RASCUNHO_INICIAL_GOOGLE_META_ADS.md
- o documento consolida:
- rascunho inicial de Google Ads
- rascunho inicial de Meta Ads
- sinais de tracking usados
- públicos, copies e guardrails
Validações:
- leitura do mapa atual de tracking
- leitura do plano de Google Ads em rascunho
- leitura do sistema de tracking/ROI já documentado no projeto
- alinhamento da regra operacional: toda peça com venda online entra em mídia; ROI governa reforço/manutenção/pausa
BK-192 · Modernizar Analytics para GA4 e Meta Ads API read-only
Data: 31 de Março de 2026
Contexto operacional:
- o projeto já tem base de campanhas, ROI, tracking UTM e integrações iniciais, mas a leitura de Analytics ainda está presa ao modelo antigo.
- para chegar a ROI real com liberdade operacional assistida por IA, é necessário ler GA4 e Ads de forma moderna e segura.
Ajustes aplicados:
- criado PLANO_GA4_META_ADS_API_READONLY.md
- o documento consolida:
- estado atual do projeto
- lacunas da trilha antiga
- arquitetura recomendada para GA4, Google Ads e Meta Ads
- guardrails e fases de implantação
Validações:
- leitura dos módulos atuais de Analytics antigo
- leitura dos pontos de entrada de Google Ads e Facebook Ads no projeto
- leitura do sistema de ROI e tracking UTM já existente
- alinhamento da regra operacional de elegibilidade por peça com venda online
BK-193 · Hardening de token Meta e preparação de Meta Ads read-only
Data: 31 de Março de 2026
Contexto operacional:
- a frente de Meta Ads ainda não está bloqueada só por “falta de integração”; existe também um problema de segurança/hardening, com token Meta hardcoded no código.
- o fluxo admin atual atende página/Instagram, mas não fecha sozinho a camada de Ads Insights.
Ajustes aplicados:
- criado BK-193-hardening-meta-token-e-ads-readonly.md
- o BK separa explicitamente:
- remoção do token hardcoded de
notifications.php - provisão de
META_ADS_ACCESS_TOKEN - provisão de
META_ADS_AD_ACCOUNT_ID - preparação do collector isolado
meta_ads
Validações:
- leitura do wrapper facebook_ads.php
- leitura do fluxo admin de token em
admin/modulos/facebook/configure.phpeadmin/modulos/facebook/token_exchange.php - varredura segura por credenciais Meta e por indícios de
ad_account_id
BK-187 · Governanca global em /root + no-pull automatico na VPS
Data: 30 de Março de 2026
Contexto operacional:
- O repositório local ainda induzia
git pullautomatico na VPS como preflight de governanca. - A nova camada global em
/rootpassou a coordenar a VPS, mas sem substituir a fonte da verdade local do RNT.
Ajustes aplicados:
AGENTS.md- passou a reconhecer explicitamente a camada global em
/root; - passou a exigir conferencia local de branch/base com
git checkout main, semgit pullautomatico; - passou a descrever merge sobre o estado local mais atual validado na VPS.
docs/GIT_WORKFLOW.md- removeu
git pulldo preflight; - passou a declarar que a VPS deve ser tratada como potencialmente mais atual que o remoto;
- ajustou exemplos de fluxo e worktree para nao induzir
pullcego.
Validações:
- leitura integral e diff local de
AGENTS.md - leitura integral e diff local de
docs/GIT_WORKFLOW.md git status -sbconferido para manter os itens doBK-186fora deste recorte
BK-182 · Auditoria e reconciliacao de branches antigas + stash
Data: 27 de Março de 2026
Contexto operacional:
- O repositório local acumulava branches antigas, um worktree documental e um stash com funcionalidades úteis de campanhas ainda fora da
main. - A limpeza exigia auditoria por trecho para não perder conteúdo útil misturado a histórico antigo.
Ajustes aplicados:
- integrados trechos úteis do stash
bk170-campanhas-pendentesno fluxo social/admin; - integrados trechos úteis do
BK-167em scraper Sympla, runtime do WhatsApp e conciliação de eventos/teatros; - incorporado o backlog vivo do
BK-156ao repositório principal; - removidas ou preparadas para remoção as referências locais obsoletas após reconciliar o conteúdo.
Validações:
php -lnos PHP reconciliadosnode --check bot/whatsapp/server.jsgit diff --check
BK-181 · Feed pecas_inteira.xml separado do feed principal
Data: 27 de Março de 2026
Contexto operacional:
- O
pecas.xmlpassou a servir bem ao catálogo principal comprice+sale_price. - Para testes/catálogos alternativos com base no preço cheio, ficou necessário um segundo feed de produtos sem
sale_price.
Ajustes aplicados:
atualizar_feed.php- passou a gerar
pecas_inteira.xml; - manteve
pecas.xmlcomo está; - o novo feed publica apenas
g:pricecom valor cheio. admin/modulos/pecas/action.php- passou a retornar a URL e o timestamp do
pecas_inteira.xml. .gitignore- passou a ignorar
pecas_inteira.xml.
Validações:
php -l atualizar_feed.phpphp -l admin/modulos/pecas/action.phpphp atualizar_feed.php- inspeção direta de
pecas_inteira.xml
BK-180 · Feed de ofertas Meta adiciona min_quantity = 1
Data: 27 de Março de 2026
Contexto operacional:
- O Meta rejeitou
AUTOMATIC_AT_CHECKOUTsem pré-requisito. - A própria documentação oficial exige
min_quantityoumin_subtotalpara esse tipo de oferta.
Ajustes aplicados:
atualizar_feed.php- passou a emitir a coluna
min_quantity; - passou a preencher
min_quantity = 1noofertas.csve nooffer.csv.
Validações:
php -l atualizar_feed.phpphp atualizar_feed.php- inspeção direta de
ofertas.csv
BK-179 · Feed de ofertas Meta usa AUTOMATIC_AT_CHECKOUT
Data: 27 de Março de 2026
Contexto operacional:
- O
ofertas.csvestava emitindoapplication_type = SALE, o que modelava a oferta como desconto direto sobre o preço do item. - Para testar a categoria “Promoção” do Commerce Manager de forma mais fiel, o feed precisava usar aplicação automática no checkout.
Ajustes aplicados:
atualizar_feed.php- passou a emitir
application_type = AUTOMATIC_AT_CHECKOUTnoofertas.csve nooffer.csv; - manteve
exclude_sale_priced_products = YES.
Validações:
php -l atualizar_feed.phpphp atualizar_feed.php- inspeção direta de
ofertas.csv
BK-178 · Feed de ofertas Meta exclui produtos com sale_price
Data: 27 de Março de 2026
Contexto operacional:
- O feed de ofertas continuava modelado como desconto percentual por item.
- Para alinhar com a opção do Commerce Manager de não aplicar oferta sobre produtos já com
sale_price, o arquivo precisava declarar isso explicitamente.
Ajustes aplicados:
atualizar_feed.php- passou a emitir a coluna
exclude_sale_priced_products; - passou a preencher essa coluna com
YESnoofertas.csve nooffer.csv.
Validações:
php -l atualizar_feed.phpphp atualizar_feed.php- inspeção direta de
ofertas.csv - inspeção direta de
offer.csv
BK-174 · Feed Meta com price cheio e sale_price promocional
Data: 26 de Março de 2026
Contexto operacional:
- O
pecas.xmlestava enviando apenas o valor promocional emprice. - Quando o feed de ofertas do Meta também entrava, o Commerce Manager aplicava desconto adicional sobre um valor já reduzido.
Ajustes aplicados:
atualizar_feed.php- passou a calcular
pricea partir do valor cheio (sec_valor_dequando maior quesec_valor); - passou a enviar
sale_pricecom o valor promocional real (sec_valor); - mantém apenas
pricequando não houver diferença entre inteiro e promocional.
Validações:
php -l atualizar_feed.phpphp atualizar_feed.php- conferência direta do
pecas.xmlregenerado g:priceeg:sale_pricevalidados nos itens ativos
BK-172 · Feed de ofertas Meta separado do catálogo
Data: 26 de Março de 2026
Contexto operacional:
- O
pecas.xmlcarregava corretamente como feed de produtos, mas falhava quando era reutilizado no Commerce Manager como feed de ofertas/promoções.
Ajustes aplicados:
atualizar_feed.php- manteve a geração do
pecas.xml; - passou a gerar também
ofertas.csveoffer.csvcom schema de promoções baseado empecas.oferta. - passou a incluir
target_type = line_item, exigido pelo Meta para o subtipo de desconto de produto. meta-analytics.php,pedido.php,confirm_pagamento.php- os eventos do pixel
RNT CLICKSpassaram a usar um helper explícito comtrackSinglepara fixarViewContent,AddToCart,InitiateCheckoutePurchaseno pixel897210417852424. admin/modulos/pecas/action.php- passou a confirmar também a geração dos feeds de ofertas;
- passou a retornar as URLs públicas dos arquivos promocionais.
URLs operacionais:
https://rionoteatro.com.br/pecas.xmlhttps://rionoteatro.com.br/ofertas.csvhttps://rionoteatro.com.br/offer.csv
Validações:
php -l atualizar_feed.phpphp -l admin/modulos/pecas/action.phpphp atualizar_feed.php- conferência direta de
ofertas.csv - validação da action
regenerar_feed_xml
BK-171 · Feed XML respeita status e fim de temporada
Data: 26 de Março de 2026
Contexto operacional:
- O botão manual de regeneração do
pecas.xmlestava executando o gerador corretamente, mas o feed ainda precisava de uma regra mais rígida para impedir peças inativas, vencidas ou com sessão fora da temporada de entrarem no XML.
Ajustes aplicados:
atualizar_feed.php- o feed passou a exigir
status = 'A'; - passou a exigir
fim_temporadaválido ou não vencido; - passou a desconsiderar sessões futuras que ultrapassem
fim_temporada.
Validações:
php -l atualizar_feed.phpphp atualizar_feed.php- validação do endpoint
admin/modulos/pecas/action.php?act=regenerar_feed_xml - conferência direta no
pecas.xmlregenerado
BK-165 · Feed XML no path correto + PalcoFan visível + conciliação Sympla alinhada
Data: 25 de Março de 2026
Contexto operacional:
- O
pecas.xmldo catálogo Meta estava sendo gravado com caminho relativo e podia cair na raiz da VPS dependendo do diretório de trabalho do cron. - O bloco público do PalcoFan ainda mantinha os botões de login/cadastro com contraste ruim.
- O
conciliacao.phpdo Sympla tinha perdido parte do fluxo manual que já existia noconciliacao_eventim.php, especialmente em vínculo manual e separação por fonte.
Ajustes aplicados:
atualizar_feed.php- a gravação do feed passou a usar caminho absoluto com base em
__DIR__, garantindopecas.xmlna raiz do projeto. includes/inc_palcofan.php- os botões
Fazer LogineCadastre-se grátisganharam cores explícitas e contraste seguro sobre o bloco branco. admin/modulos/eventos/conciliacao.php- passou a filtrar por
fonte = 'sympla', alinhando a tela ao particionamento já existente no Eventim; - recuperou formulários de vínculo manual em abas onde o Sympla tinha perdido esse fallback;
- voltou a expor, quando o item já existe como
admin, a opção de manter como Admin ou migrar para BOT.
Auditoria complementar:
- O backend atual de conciliação ainda só persiste edições de sessões já existentes em
bot_sessoes_sugestoes. - Não há hoje suporte completo no
action.phppara criar uma sessão nova capturada do zero via UI, então o botão de “nova sessão” exige um follow-up próprio e não foi improvisado parcialmente nesta entrega.
Validações:
php -l atualizar_feed.phpphp -l includes/inc_palcofan.phpphp -l admin/modulos/eventos/conciliacao.phpgit diff --check
BK-164 · PalcoFan no dashboard/peça + auditoria do pecas.xml
Data: 25 de Março de 2026
Contexto operacional:
- O fluxo do PalcoFan já existia, mas faltavam dois pontos práticos:
- o admin dashboard não sinalizava comentários pendentes de moderação;
- a página da peça não mostrava um minicard de avaliações aprovado no grid principal.
- Em paralelo, foi pedida uma auditoria do gerador do feed
pecas.xml, sem alterar o script nesta rodada.
Ajustes aplicados:
admin/index.php- passou a consultar
tb_avaliacoescomstatus = 'pendente'; - ganhou card/alerta com link direto para
admin/modulos/comentarios/index.php. peca.php- passou a consultar média/quantidade de avaliações aprovadas da peça;
- ganhou minicard
Avaliaçõesno grid superior quando houver pelo menos1comentário aprovado; - o minicard aponta para a âncora da seção completa do PalcoFan.
includes/inc_palcofan.php- ganhou âncora explícita
#palcofan-avaliacoespara receber a rolagem do minicard.
Auditoria executada sem alteração de código:
atualizar_feed.php- confirmado como o arquivo que gera o
pecas.xml; - a gravação continua usando caminho relativo em
file_put_contents('pecas.xml', $xml). /www/server/cron/f1fb970e7ca0b68f38510abb76a86aa0- confirmado como o wrapper do cron que dispara
php -q /www/wwwroot/rionoteatro.com.br/atualizar_feed.php.
Resultado técnico observado:
- O dashboard do admin agora está pronto para acender quando houver comentário PalcoFan realmente em
pendente. - O minicard de avaliações aparece no topo de
peca.phpquando a peça tiver comentários aprovados e leva o cliente para a seção detalhada. - Na auditoria atual do banco, a tabela
tb_avaliacoesestava com0pendentes e1avaliação jáaprovadapara a peça23, então o alerta do dashboard não acenderia nesse instante porque não há pendência real.
Validações:
php -l admin/index.phpphp -l peca.phpphp -l includes/inc_palcofan.php- render local de
peca.phpconfirmando minicard + âncora - leitura integral de
atualizar_feed.phpe do wrapper/www/server/cron/f1fb970e7ca0b68f38510abb76a86aa0
BK-160 · Carrossel semanal cover por peça
Data: 25 de Março de 2026
Contexto operacional:
- O feed semanal que sai do cron
sync_facebook_events.phpvinha empacotando até nove peças em um único mosaico, o que diluía a identidade visual de cada capa e obrigava o Instagram a replicar o mesmo grid pouco legível.
Ajustes aplicados:
admin/cron/sync_facebook_events.php- reduziu a seleção a 10 peças por semana e reaproveitou
image_mtimepara gerar cache key por peça. - substituiu
buildWeeklyCarouselSlidespor um compositor que gera um JPEG 1080x1350 por peça e usa a capa como fundo emcover. - manteve
items[]compatível comcreateFeedCarouselPostecreateInstagramCarousel, preservando a legenda e os UTM já existentes. - passou a espelhar a vitrine de
pecas.phpna elegibilidade comercial da semana-alvo, sem exigir sessão cadastrada para a peça continuar no carrossel se a temporada ainda estiver válida. - passou a aceitar weekly comercial com apenas
1peça e usaPROMOÇÃO DA SEMANA!no singular nesse caso. - separou a cadência operacional em dois fluxos:
- domingo -> approval comercial da segunda;
- segunda -> approval editorial da quarta.
- ganhou um segundo tipo de fila semanal para o carrossel editorial dos eventos mais acessados do site, sem misturar esse fluxo com o weekly comercial.
- passou a reaproveitar o payload visual do weekly carousel no approval, preenchendo preview real do primeiro slide e hash visual para evitar recriação cega do mesmo approval.
- deixou de promover automaticamente o weekly carousel para
queuedquando o item retorna de erro, preservando a aprovação humana como gate antes do publish. admin/modulos/campanhas/aprovar_squad.php- passou a renderizar uma galeria com todos os slides quando o approval contém
carousel_items, mantendo o preview simples para posts comuns. admin/modulos/campanhas/action_squad.php- passou a respeitar headline singular/plural no refresh do weekly e a aceitar também o tipo semanal editorial.
includes/inc_palcofan.php- endurecido para exibir estrelas unicode clicáveis e CTA visível de avaliação, sem depender visualmente do Font Awesome nem de JS mais moderno.
Resultado técnico observado:
- O cron agora freelanca slides individuais do carrossel com rolagem lateral nativa, removendo o card 3x3 e dando destaque à arte oficial de cada peça.
- O payload segue aceito pelas APIs da Meta porque continua entregando
itemscomimagem_url(até 10 itens) e o cache evita rebuilds desnecessários quando a capa não muda. - O link de approval do weekly carousel deixa de ser cego: o operador passa a enxergar o preview do primeiro slide e a galeria completa antes de aprovar.
- A elegibilidade comercial da próxima segunda deixa de cair no falso negativo de sessão ausente e passa a refletir o catálogo comercial ativo de
pecas.php. - O PalcoFan volta a mostrar estrelas e CTA de envio de forma explícita mesmo em browser/mobile mais sensível.
Validações:
php -l admin/cron/sync_facebook_events.phpphp -l admin/modulos/campanhas/aprovar_squad.phpphp -l admin/modulos/campanhas/action_squad.phpphp -l includes/inc_palcofan.phpgit diff --check
BK-159 · Correção de Layout Mobile na Lista de Compradores
Data: 21 de Março de 2026
Contexto operacional:
- O formulário de visualização da lista de compradores (
produtor/listaopen.php) apresentava problemas graves de responsividade no mobile. - A coluna de RG/Documento ficava oculta ou inacessível em telas pequenas.
Ajustes aplicados:
produtor/listaopen.php- Implementado container de rolagem lateral (
overflow-x: auto) para a tabela. - Adicionado aviso visual em vermelho ("Role a tabela para o lado ->") exclusivo para mobile.
- Forçado
display: table-cell !importantpara a coluna de RG via CSS responsivo. - Otimizado formulário de envio de e-mail e botões para touch.
- Adicionado
format-detection="telephone=no"para evitar links automáticos em documentos.
BK-151 · Brand profile bootstrap do RNT
Data: 20 de Março de 2026
Contexto operacional:
- O Squad ainda trabalhava com contexto disperso de marca, campanha e CTA.
- O primeiro corte da entrega mostrava o resumo do profile na UI, mas o helper JSON ainda não garantia
brandProfileno payload da run.
Ajustes aplicados:
admin/modulos/campanhas/social_brand_profile.php- criado como artefato canônico PHP 5.6-safe do perfil inicial de marca.
admin/modulos/campanhas/social_squad_helper.php- passou a incluir o artefato e injetar
brandProfilenopiece_context. admin/modulos/campanhas/redes_sociais_ui_helper.php- passou a renderizar um resumo do profile ativo no workspace do Squad.
Resultado técnico observado:
- o payload do Squad passa a carregar um profile de marca explícito e reutilizável;
- a UI local e o helper JSON passaram a usar a mesma fonte de verdade;
- o profile fica pronto para reutilização nos próximos BKs sem crawler nem banco novo.
BK-150 · Loop de metricas do Squad com social_post_metrics_history
Data: 19 de Março de 2026
Contexto operacional:
- O RNT já tinha coleta de métricas sociais, mas o approval e a próxima run do Squad ainda não aproveitavam esse histórico.
- O primeiro corte do BK-150 ainda ancorava o resumo no
queue_idatual, o que não resolvia o caso real de desempenho anterior antes da aprovação.
Ajustes aplicados:
admin/modulos/campanhas/action_squad.php- passou a anexar
metrics_summarycom base na última performance anterior útil porpeca_id+ canal compatível, excluindo oqueue_idatual; - separou
current_queue_metricspara o caso em que o próprio item já possua histórico. admin/modulos/campanhas/aprovar_squad.php- passou a exibir painel de desempenho anterior útil antes da aprovação.
admin/modulos/campanhas/social_squad_helper.php- ganhou helpers de consulta/resumo de métricas;
- passou a injetar
lastPerformanceno contexto da próxima run; - ficou compatível com uso embedded sem responder JSON bruto.
Resultado técnico observado:
- o approval passa a mostrar performance anterior realmente útil;
- o artefato final preserva esse resumo em
approved_payload; - a próxima run do Squad recebe contexto resumido de performance sem tabela nova e sem cron novo.
BK-149 · Hardening de permissoes e arquivos runtime do social
Data: 19 de Março de 2026
Contexto operacional:
- O fluxo social ainda carregava dívida objetiva de permissões frágeis (
0777/0666) em paths de runtime. - O endurecimento cego para
0755/0644quebraria parte do contrato multi-worker entre cron CLI e painel web.
Ajustes aplicados:
admin/cron/sync_facebook_events.php- passou a diferenciar arquivos compartilhados (
lock,state) de artefatos read-only; - diretórios compartilhados passaram a tentar
02775com fallback explícito para0777; - arquivos compartilhados passaram a tentar
0664com fallback explícito para0666. admin/cron/sync_facebook_page_events.php- alinhado à mesma política de diretórios compartilhados;
- queue/sample do fallback browser passaram a receber permissão de escrita compartilhada porque o painel de approval também regrava esses arquivos.
docs/AI_CEREBRO_RELAY.md- política canônica de permissões reescrita com checklist operacional e rollback.
Resultado técnico observado:
- o fluxo social ficou menos frágil sem romper o contrato de escrita cruzada
root+www-data; - falhas de permissão deixam rastro explícito em log;
- o relay deixou de recomendar
777como política base.
BK-148 · Modularizacao segura de redes_sociais.php (fase 1)
Data: 19 de Março de 2026
Contexto operacional:
admin/modulos/campanhas/redes_sociais.phpconcentrava blocos grandes demais de preparo/render, aumentando risco de manutenção.- A fase 1 precisava extrair apenas os blocos de menor risco, sem reescrever a tela inteira.
Ajustes aplicados:
admin/modulos/campanhas/redes_sociais.php- passou a delegar leitura/render de blocos específicos para helper dedicado.
admin/modulos/campanhas/redes_sociais_ui_helper.php- criado para absorver preparo do estado da ponte social;
- preparo do fallback browser de FB Events;
- render do painel de fallback browser;
- render do Radar de Recomendacao;
- render do conteúdo superior da aba Squad Social.
Resultado técnico observado:
- a tela única da Central de Redes Sociais foi preservada;
- o módulo principal ficou menor e mais legível;
- a base ficou pronta para as próximas fases sem big bang rewrite.
BK-147 · Visibilidade operacional da ponte social na Central de Redes Sociais
Data: 19 de Março de 2026
Contexto operacional:
- A Central de Redes Sociais não mostrava claramente quando a ponte de copy com o Cérebro estava saudável, degradada ou indisponível.
- O caso de failover para bridge local podia ser lido como sucesso remoto, escondendo degradação real da operação.
Ajustes aplicados:
admin/cron/ai_copy_helper.php- passou a persistir telemetria mínima da ponte em
admin/logs/ai_bridge_status.json; - anota
provider = remote|locale propagaai_reviewed_localquando a resposta útil vier da bridge local. admin/modulos/campanhas/redes_sociais.php- passou a ler o snapshot da ponte no topo da tela;
- exibe badges de estado
SAUDÁVEL,DEGRADADA,INDISPONÍVELe sinais separados paraFALLBACK BRIDGEeFALLBACK HARDCODED.
Resultado técnico observado:
- o operador ganhou visibilidade direta do estado da ponte social sem runtime paralelo novo;
- o fallback local deixou de aparecer falsamente como operação saudável;
- a trilha documental canônica do BK-147 ficou regularizada no RNT.
BK-158 · Saneamento P0 de credenciais expostas
Data: 19 de Março de 2026
Contexto operacional:
- O repositório mantinha na raiz um relatório versionado com segredos literais reais.
- O
.gitignorelocal precisava endurecimento mínimo para reduzir risco de versionamento acidental de variantes do.env.
Ajustes aplicados:
CREDENCIAIS_EXPOSTAS_RELATORIO.md- removido da raiz do projeto.
docs/seguranca/credenciais-audit-20260213.md- criado como versão sanitizada e canônica do relatório, com valores literais ofuscados.
.gitignore- endurecido para cobrir
.env,.env.local,.env..locale*/.env.
Resultado técnico observado:
- nenhum relatório explícito de credenciais permaneceu solto na raiz do repositório;
- o conteúdo útil foi preservado em trilha documental segura;
- a proteção contra commit acidental de arquivos de ambiente ficou mais explícita.
BK-132 · Endurecimento do fluxo de prova de Story manual/notificado
Data: 19 de Março de 2026
Contexto operacional:
- O fluxo de prova de Story manual dependia exclusivamente do
draft_urlpara ser considerado sucesso. Falhas na extração do link pela automação de browser resultavam em perda de sinal operacional, mesmo quando o screenshot ou artefato útil existia.
Ajustes aplicados:
- Esquema de Banco:
- Adicionadas colunas
profile_id,draft_url,notification_sent_atenotification_resultà tabelasocial_post_queuepara suporte nativo a metadados de prova. admin/cron/sync_facebook_events.php:- Função
rntExecuteBrowserStoryDraftProofagora aceita sucessos parciais (existência de screenshot/artefato) e sincroniza automaticamente os dados para as novas colunas diretas da fila. admin/modulos/facebook/agendamento-events.php:- Consulta SQL atualizada para carregar os novos campos de prova.
- Função
rnt_social_queue_extract_draft_proofrefatorada para preferir dados estruturados das colunas e oferecer fallback visual detalhado no calendário.
Resultado técnico observado:
- Itens em modo
notifiedagora exibem prova operacional útil na agenda admin, seja via link direto para rascunho ou via sinalização de screenshot disponível, reduzindo a necessidade de conferência manual cega.
BK-138 · Correção de Mídias Invisíveis e Datas no Squad Approval
Data: 18 de Marco de 2026
Contexto operacional:
- o painel de Aprovação de Squad Social (
aprovar_squad.php) acusava a ausência de mídias/criativos para peças mesmo quando os links deveriam estar disponíveis, e as datas de agendamento estavam travadas na hora contínua do disparo da rotina, confundindo a operação.
Ajustes aplicados:
admin/cron/sync_facebook_events.php- alteração em
rntResolvePecaPrimaryImageAssetpara retornar um array estritamente vazio (array()) caso não encontre nenhuma capa física válida via@is_file, permitindo grace-degradation no visualizador do Squad. - resgate do metadado
scheduled_fornos geradores de cronplanSiteEntryFeedQueue,planWeeklyCarouselQueue, e gatilhos de stories, passando avante essa data exata para reescrever o campodatedo json de Aprovação com$meta['scheduled_for'].
Resultado técnico observado:
- próximas peças submetidas pelo Cerebro na fila do Approval possuirão links físicos estritamente confirmados (caso preenchido) ou omitidos (caso em falta), e exibirão os verdadeiros horários projetados para as plataformas ao invés dos horários de processamento.
BK-137 · Fluxo social reconciliado com gate criativo, WhatsApp e prova de rascunho
Data: 18 de Marco de 2026
Contexto operacional:
- o fluxo social ja tinha pecas importantes implantadas, mas seguia com dois problemas reais:
- a copy de approval caia em fallback generico porque nao havia endpoint criativo funcional;
- a tela de aprovacao do admin ainda nao mostrava bem o contexto comercial, a midia prevista e o parecer interno do criativo.
- ao mesmo tempo, o contrato do produto foi finalmente fechado:
criativo -> review interno -> WhatsApp -> agenda -> draft/post -> conferencia final.
Ajustes aplicados:
admin/cron/ai_copy_helper.php- passou a apontar por padrao para
http://127.0.0.1:9903/api/social-copy; - ganhou fallback local e enrich de contexto com capa + pasta
/arquivos/pecas/{id}/video; - passou a preservar
review,selected_media,selected_media_reason,creative_directionecommercial_summary. admin/cron/sync_facebook_events.php- approval payload ficou mais rico;
- midia escolhida pelo Cérebro passou a ser preservada no approval e reaproveitada na fila;
- o fluxo de prova de rascunho/manual draft ficou refletido na agenda.
admin/modulos/campanhas/aprovar_squad.php- a tela de aprovacao passou a mostrar canal, origem, CTA, resumo comercial, midia prevista e revisao interna.
admin/modulos/campanhas/action_squad.php- passou a persistir os novos metadados do approval aprovado em
approved_payload. admin/modulos/facebook/agendamento.phpeadmin/modulos/facebook/agendamento-events.php- seguiram exibindo a prova de rascunho e o estado real da fila.
Resultado tecnico observado:
- o approval do WhatsApp deixou de depender de endpoint vazio.
- o admin passou a aprovar com muito mais contexto.
- o proximo passo ativo volta a ser operacional, nao documental: fechar notificacao pos-publicacao e endurecer o story browser flow.
Validacoes executadas:
php -l admin/cron/ai_copy_helper.phpphp -l admin/cron/sync_facebook_events.phpphp -l admin/modulos/campanhas/aprovar_squad.phpphp -l admin/modulos/campanhas/action_squad.phpphp -l admin/modulos/facebook/agendamento.phpphp -l admin/modulos/facebook/agendamento-events.phpgit diff --check
BK-136 · Governanca compartilhada de auto-fechamento e backlog->changelog
Data: 18 de Marco de 2026
Contexto operacional:
- depois de formalizar no Cérebro a regra de auto-fechamento de BK concluido e a semantica correta de backlog vivo versus changelog historico, o Rio no Teatro precisava receber o mesmo protocolo para eliminar divergencia entre os dois repositorios.
- a auditoria local mostrou duas lacunas principais:
- ainda havia texto permitindo hotfix direto na
mainem alguns trechos, apesar da regra da VPS ja exigir branch; - ainda faltava explicitar aqui que backlog vivo e changelog detalhado devem caminhar juntos no fechamento do BK.
Ajustes aplicados:
AGENTS.md- passou a declarar que hotfix na VPS continua em branch obrigatoria;
- passou a exigir backlog vivo em
docs/backlog/e changelog detalhado emdocs/changelog/; - passou a mandar comparar
/www/wwwroot/rionoteatro.com.brcom/root/cerebroantes de alterar regra compartilhada; - passou a exigir que BK concluido, auditado e validado siga ate merge/push/unlock no mesmo atendimento.
docs/GIT_WORKFLOW.md- ganhou o fluxo BK->CL no passo a passo do branch workflow;
- endureceu o fechamento automatico apos reconciliacao e auditoria de conteudo aprovadas;
- esclareceu que deploy direto fica restrito a fora da VPS.
docs/BACKLOG.md- passou a deixar explicita a semantica de backlog vivo e changelog historico;
- recebeu o fechamento do
BK-136como regra operacional permanente. docs/LOCK.md- ganhou locks do BK-136 e passou a explicitar o significado operacional de
UNLOCKED.
Resultado tecnico observado:
- Cérebro e Rio no Teatro ficam alinhados na mesma governanca para:
- branch obrigatoria na VPS;
- auditoria por
hunk; - backlog vivo + changelog detalhado;
- fechamento completo do BK no mesmo atendimento.
- isso reduz drift documental e evita retrabalho quando a CLI começa em um repo e depois migra para o outro.
Validacoes executadas:
- leitura integral e reconciliacao textual de
AGENTS.md,docs/GIT_WORKFLOW.md,docs/BACKLOG.md,docs/CHANGELOG.mdedocs/LOCK.md - comparacao de governanca com
/root/cerebro git diff --check
BK-135 · Protocolo canonico de auditoria por hunk antes de limpeza Git
Data: 18 de Marco de 2026
Contexto operacional:
- auditorias recentes de branch/worktree/stash mostraram o mesmo risco recorrente: um unico arquivo pode misturar, ao mesmo tempo, trecho novo e util, regressao, backup operacional e ruido de modo/ambiente.
- o erro de processo que precisava ser eliminado era decidir "descartar o arquivo" em vez de decidir por trecho de codigo.
- como a CLI costuma iniciar por este repositório e o
AGENTS.mde a referencia primaria das IAs, a regra foi endurecida aqui de forma explicita.
Ajustes aplicados:
AGENTS.md- passou a declarar como proibicao absoluta descartar arquivo inteiro apenas porque a branch/worktree/stash parece antiga;
- formalizou que a unidade de decisao e o
hunk, nao o arquivo; - exigiu classificacao de cada diferenca em
util e atual,util mas precisa adaptacao,regressaooulixo/backup/legado; - passou a exigir conclusao explicita de que
nao sobrou nenhum hunk util fora da mainantes de qualquer limpeza. docs/GIT_WORKFLOW.md- ganhou a secao canonica
Auditoria de Conteudo Antes de Merge ou Limpeza; - passou a listar comandos minimos para auditar branch/worktree/stash contra a
mainatual e contra a base comum (merge-base); - passou a instruir a mescla manual apenas dos hunks uteis na versao mais nova do arquivo.
docs/BACKLOG.md- recebeu o fechamento do
BK-135como regra operacional permanente.
Resultado tecnico observado:
- o protocolo deixa de permitir a simplificacao errada de "arquivo antigo => apagar tudo".
- futuras limpezas de branch, worktree, stash, tag de archive ou patch temporario passam a exigir triagem por trecho de conteudo.
- quando um arquivo misturar antigo + novo, a acao correta passa a ser montar uma nova versao com o melhor dos dois lados e so entao limpar o restante.
Validacoes executadas:
- leitura integral e reconciliacao textual de
AGENTS.md,docs/GIT_WORKFLOW.md,docs/BACKLOG.mdedocs/LOCK.md git diff --check
BK-104 · Fallback browser operacional para Facebook Page Events
Data: 17 de Marco de 2026
Contexto operacional:
- a RCA do Graph API permaneceu a mesma:
POST /{page_id}/eventssegue bloqueado comcode 100 / subcode 33. - o desbloqueio real passou a depender do
BK-129no Cérebro, que agora ja possui: - storage state autenticado fora do repo;
- probe autenticado validado;
- create-flow em modo seguro sem publicacao.
Ajustes aplicados:
admin/cron/sync_facebook_page_events.php- quando o probe do Graph continuar bloqueado, o cron agora monta a fila operacional do fallback browser em
admin/runtime/facebook_page_events_browser_queue.json; - o mesmo fluxo tambem grava um payload sample em
admin/runtime/facebook_page_events_browser_sample_input.json; - o snapshot inclui:
profile_id;storage_state_path;output_root;- lista de pecas elegiveis com
event_title,event_url,start_iso,description,venue_nameecover_image_url; - comandos prontos para
probeecreate-flowno Cérebro. admin/modulos/campanhas/redes_sociais.php- a Central de Redes Sociais passou a exibir o status do fallback browser quando a fila runtime existir;
- a tela agora mostra:
- quantidade de itens preparados;
- motivo do bloqueio do probe;
- caminhos do snapshot/payload sample;
- comandos exatos para rodar o browser control autenticado no Cérebro.
Resultado tecnico observado:
- o
BK-104deixa de parar no diagnostico do Graph e passa a entregar um handoff operacional real para browser automation. - o admin continua sem publicar nada automaticamente na Meta por este caminho.
- o create-flow fica seguro para endurecimento iterativo: primeiro draft/evidencia, publish apenas quando houver gate humano decidido.
Validacoes executadas:
php -l admin/cron/sync_facebook_page_events.phpphp -l admin/modulos/campanhas/redes_sociais.phpphp admin/cron/sync_facebook_page_events.php- confirmacao do snapshot runtime gerado em
admin/runtime/facebook_page_events_browser_queue.json git diff --check
BK-104 · Probe e hardening do cron de Facebook Page Events
Data: 17 de Marco de 2026
Contexto operacional:
- o fluxo legado de Page Events ja tinha evidenciado leitura ok em
GET /{page_id}/events, mas seguia falhando na criacao emPOST /{page_id}/eventscomGraphMethodException code 100 / subcode 33. - a verificacao de runtime foi repetida no ambiente atual com a propria configuracao da pagina:
GET /{page_id}/eventscontinua retornando eventos reais;- um
POST /{page_id}/eventspropositalmente vazio, portanto incapaz de criar qualquer evento, devolve o mesmoUnsupported post request ... code 100 / subcode 33. - isso fecha a RCA do caminho Graph API atual: o bloqueio nao e apenas payload faltando, e sim operacao nao suportada/perdida para este contexto de pagina/token.
Ajustes aplicados:
admin/classes/FacebookEventService.php- ganhou
probePageEventsCreateSupport()para testar oPOST /{page_id}/eventsde forma segura, sem payload minimo de criacao; - o service agora classifica o retorno entre:
unsupported_endpoint;permission_denied;validation_error_only;unknown_error.admin/cron/sync_facebook_page_events.php- passou a rodar o probe antes de qualquer cleanup/create/update;
- ganhou o modo
probe_only=1; - quando o endpoint continua bloqueado, o cron aborta cedo com diagnostico explicito, sem fingir sucesso operacional e sem tentar mutacoes na pagina.
admin/modulos/campanhas/redes_sociais.php- o botao operacional foi reposicionado para:
FB Events (probe);FB Events (sync);- a tela agora explica que o cron faz probe seguro antes de qualquer tentativa real.
Resultado tecnico observado:
- o sistema deixa de tratar
FB Events (real)como se o problema fosse apenas de payload. - o operador passa a ver um diagnostico honesto:
- se o Graph API estiver morto, o cron para antes;
- se algum dia a Meta voltar a aceitar o endpoint, o sync pode seguir sem remover esse hardening.
- a conclusao pratica deste BK mudou:
- desbloqueio via Graph API nao esta acontecendo neste caminho;
- o proximo passo de automacao real para Page Events precisa migrar para browser automation/orquestracao pelo Cerebro.
Validacoes executadas:
php -l admin/classes/FacebookEventService.phpphp -l admin/cron/sync_facebook_page_events.phpphp -l admin/modulos/campanhas/redes_sociais.phpphp admin/cron/sync_facebook_page_events.php probe_only=1php admin/cron/sync_facebook_page_events.phpcurl GET /{page_id}/eventscom token da pagina retornando eventos reaiscurl POST /{page_id}/eventssem payload minimo retornandoGraphMethodException code 100 / subcode 33git diff --check
BK-103 · TikTok no orquestrador social em modo manual/notificado
Data: 17 de Marco de 2026
Contexto operacional:
- com a trilha
mysql_*do admin adiada durante a venda ativa, o proximo passo operacional foi liberar o TikTok dentro do orquestrador social sem depender de publicacao automatica por API. - o objetivo deste BK foi encaixar TikTok na mesma fila social ja usada por Facebook/Instagram/Threads, mas com regra explicita de operacao manual/notificada.
Ajustes aplicados:
admin/modulos/facebook/agendamento.php- a agenda manual ganhou os canais
TikTok FeedeTikTok Story; - o modal passou a forcar
modo = notifiedpara TikTok; - a UI passou a esconder o fluxo de preset story para TikTok, mantendo esse recurso apenas para stories Meta.
admin/modulos/facebook/agendamento-create.php- o endpoint passou a aceitar
tiktok_feedetiktok_story; - canais TikTok agora gravam a fila como
manual_notified, mesmo que o operador tenteauto. admin/modulos/facebook/agendamento-events.php- calendario/filtros/labels/icones passaram a reconhecer TikTok.
admin/modulos/facebook/agendamento-update-status.php- itens TikTok em
status = notifiedpodem ser concluídos comoposted_manualpela mesma ação da agenda. admin/cron/sync_facebook_events.php- o dispatcher passou a ler itens due de
tiktok_feedetiktok_story; - quando chega o horario, o item vira
notifiede fica aguardando postagem manual; - o resumo final do cron passou a contabilizar
TikTok notificados (manual). admin/modulos/campanhas/redes_sociais.php- a Central de Redes Sociais passou a refletir TikTok em labels, resumos e na acao de trazer stories manuais para agora.
Resultado tecnico observado:
- TikTok passa a existir como canal operacional da
social_post_queue, sem introduzir automacao de publicacao fora do que o ambiente atual suporta. - o fluxo padrao deste BK fica:
- agendar item TikTok na agenda manual;
- dispatcher promover para
notifiedno horario; - operador publicar no app e marcar como
posted_manual.
Validacoes executadas:
php -l admin/modulos/facebook/agendamento.phpphp -l admin/modulos/facebook/agendamento-create.phpphp -l admin/modulos/facebook/agendamento-update-status.phpphp -l admin/modulos/facebook/agendamento-events.phpphp -l admin/cron/sync_facebook_events.phpphp -l admin/modulos/campanhas/redes_sociais.php- extracao do JS inline de
admin/modulos/facebook/agendamento.php+node --check git diff --check- teste seguro em transacao do banco para o ciclo
queued -> notified -> posted_manualcomtiktok_feed, seguido de rollback
BK-102 · Complemento de tracking publico com GTM/dataLayer
Data: 17 de Marco de 2026
Contexto operacional:
- com o
BK-87adiado durante venda ativa, a frente menos invasiva escolhida foi oBK-102, restrito ao tracking publico e sem tocar na migracaomysql_*remanescente do admin. - o objetivo foi complementar os eventos faltantes e padronizar a camada de dados para GTM/GA4 sem desmontar os fallbacks ja existentes de
gtag. - por definicao operacional do projeto:
- a margem real de referencia do negocio e
15%do bruto; - o valor enviado para Google/Facebook continua em
10%do bruto como sinal conservador de otimizacao de midia/ROI.
Ajustes aplicados:
meta-analytics.php- ganhou o helper canonico
window.rntTrackGtmEvent; - o helper passa a:
- clonar o payload recebido;
- montar
ecommerceautomaticamente quando houvercurrency,value,items,transaction_idecoupon; - publicar no
dataLayercomevent = rnt_track_eventeevent_nameseparado, evitando acoplamento direto do GTM ao nome cru do evento; - manter fallback para
window.gtag('event', ...). peca.phpview_itemfoi migrado para o helper canônico, preservando o fallback degtag.pedido.phpbegin_checkoutpublico foi migrado para o helper canônico, preservando o fallback degtag.evento.php- o clique de compra externa passou a usar o helper canônico no
onclick, com fallback paragtag. confirm_pagamento.phpbegin_checkoutde pagamento pendente epurchasede pagamento confirmado passaram a usar o helper canônico;- a regra de
10%ficou documentada como decisao deliberada de otimizacao de midia, e nao como margem operacional real.
Resultado tecnico observado:
- o site passa a expor uma camada de dados publica mais previsivel para GTM, sem remover o comportamento atual de GA4/Ads.
- os principais eventos de funil publico (
view_item,begin_checkout,purchase) ficam padronizados no mesmo helper. - a nomenclatura deixa explicito no codigo que:
10%e sinal conservador para a plataforma de midia;15%permanece como referencia financeira interna do negocio.
Validacoes executadas:
php -l meta-analytics.phpphp -l peca.phpphp -l pedido.phpphp -l evento.phpphp -l confirm_pagamento.phpnode --check /tmp/bk102_tracking_inline_check.jsgit diff --checkcurlem HTML publico confirmando o helperrntTrackGtmEventrenderizado
BK-134 · RCA e hardening do fluxo pos-compra com cupom, assento e cancelamento
Data: 16 de Marco de 2026
Contexto operacional:
- o incidente nasceu de uma compra real de teste com cupom de
100%, que expôs varios sintomas no mesmo fluxo: - pedido sem leitura clara de
voucher/pagono admin; - cliente redirecionado para remarcar assento mesmo ja tendo assento salvo;
- assento inicial permanecendo bloqueado apos solicitacao de cancelamento;
- cancelamento pouco visivel no painel do cliente;
- parceiro de cupom ainda preso ao hardcode
KM de Vantagens. - a RCA confirmou que o desvio principal era de regra de negocio/estado entre modulos, nao um efeito primario da migracao
mysql_*paramysqli. - por exigencia operacional do BK, backups versionados
_bkp_20260316.foram criados antes das edicoes manuais dos arquivos centrais.
Ajustes aplicados:
config/functions_new.php- novos helpers para:
- localizar pedido rascunho reaproveitavel no contexto do voucher;
- localizar cupom por pedido;
- reativar cupom dentro da validade;
- liberar assentos de rascunhos duplicados;
- calcular janela recente de reserva considerando o legado misto de timestamps locais/UTC.
action.phpregister_voucherpassou a:- validar melhor o cliente logado;
- reaproveitar o pedido rascunho correto quando o cupom
100%vira compra gratis; - absorver assentos do rascunho duplicado para o pedido pago quando necessario;
- preservar metadados do pedido/cupom;
- devolver ao front a
response.urlcorreta para o proximo passo. painel/modulos/pedidos/action.php- cancelamento de pedido
VOUCHERpassou a: - refletir cancelamento imediato;
- limpar assentos;
- reativar o cupom quando ainda estiver valido;
- preservar metadados e marcar o foco de retorno para o painel.
painel/modulos/pedidos/index.php,painel/modulos/pedidos/assento.php,painel/modulos/pedidos/detalhe.php- o painel do cliente passou a refletir melhor cancelamento/foco;
- a tela de assento usa a janela de reserva endurecida para nao tratar indevidamente o proprio pedido como nova selecao;
- o detalhe do pedido passou a exibir
Celularno lugar do telefone legado. admin/modulos/pedidos_2/index.phpeadmin/modulos/pedidos_2/detalhe.php- o admin passou a exibir com mais clareza:
- compra por
Voucher; - cupom associado;
- status efetivo de
Solicitado CancelamentoouCancelada. js/voucher.js- o fluxo
freepassou a respeitar aresponse.urldecidida pelo backend, em vez de sempre mandar o cliente para o painel generico. admin/modulos/cupons/index.php,admin/modulos/cupons/action.php,admin/js/cupom.js- o hardcode
KM de Vantagensfoi trocado paraRIONOTEATROcomo parceiro padrao (001); - o modulo ganhou criacao/exclusao de parceiros dinamicos;
- o backend deixou de mutilar
delete_partnerpor causa deanti_injection(), usando sanitizacao propria paraact/id; - o front passou a tratar erro AJAX sem deixar o modal travado em
Excluindo Parceiro.
Resultado funcional observado:
- o pedido pago por voucher deixa de competir com rascunho paralelo por assento.
- o fluxo de cancelamento de voucher passa a:
- liberar assento;
- refletir melhor o estado no painel/admin;
- devolver o cupom dentro da validade, conforme regra definida na RCA.
- o modulo de cupons deixa de depender de parceiro hardcoded e volta a responder corretamente no ciclo
criar -> excluir parceiro. - saneamento do incidente real validado no banco:
- pedidos
73616e73617ficaram cancelados e sem assentos presos; - cupom
12899voltou parastatus=1.
Validacoes executadas:
php -l action.phpphp -l config/functions_new.phpphp -l painel/modulos/pedidos/action.phpphp -l painel/modulos/pedidos/index.phpphp -l painel/modulos/pedidos/assento.phpphp -l painel/modulos/pedidos/detalhe.phpphp -l admin/modulos/pedidos_2/index.phpphp -l admin/modulos/pedidos_2/detalhe.phpphp -l admin/modulos/cupons/index.phpphp -l admin/modulos/cupons/action.phpnode --check js/voucher.jsnode --check admin/js/cupom.jsgit diff --check- reproducao controlada do endpoint de parceiros com sessao admin sintetica:
create_partnerretornando JSON de sucesso;delete_partnerretornando JSON de sucesso apos a correcao doact.
BK-101 · Radar operacional de recomendacao social
Data: 16 de Marco de 2026
Contexto operacional:
- depois do fechamento do
BK-95, a referencia canonica registrada no backlog com base no protocolo doAGENTS.mdapontavaBK-92 -> BK-95 -> BK-101como sequencia imediata de retomada. - a operacao social ja possuia historico tecnico em
social_post_metrics_history, mas ainda faltava transformar esse volume em leitura pratica dentro da propria Central de Redes Sociais. - o objetivo do
BK-101foi entregar um MVP de recomendacao orientado por evidencias reais de performance, sem criar cron novo nem depender de camada externa de BI.
Ajustes aplicados:
admin/modulos/campanhas/redes_sociais.php- ganhou o estado
$social_recommendation_snapshote helpers para: - inferir perfil/tipo da peca por
generose fallback emcategoria; - normalizar labels de canal, formato, dia da semana e janela de postagem;
- calcular score operacional combinando alcance, engajamento e interacoes relevantes do snapshot.
- ganhou o builder
rnt_social_build_recommendation_snapshot(...), que: - verifica a existencia de
social_post_metrics_history; - puxa o ultimo snapshot conhecido por item de fila/post;
- consolida amostras por peca/perfil;
- ranqueia melhor canal, melhor janela e melhor formato com base na media de score;
- produz linhas de recomendacao por peca com indicador de confianca.
- a aba
Operacao Socialpassou a renderizar o painelBK-101 · Radar de Recomendacao, com: - cards de
canal lider,janela lider,formato lidere cobertura da amostra; - tabela por peca/perfil contendo fonte da recomendacao, melhor horario e nivel de confianca;
- fallback textual quando ainda nao existir historico suficiente.
Resultado funcional observado:
- a Central de Redes Sociais passa a exibir um resumo operacional reutilizavel a partir do historico real ja salvo pelo BK-100, sem obrigar a operacao a consultar banco manualmente.
- o painel destaca qual canal/janela/formato estao performando melhor no recorte conhecido e ainda preserva leitura por peca/perfil para orientar publicacao assistida.
- quando a base historica ainda nao for suficiente, o modulo nao quebra: exibe aviso explicando a falta de cobertura.
Validacoes executadas:
php -l admin/modulos/campanhas/redes_sociais.phpgit diff --check- inspecao estrutural do modulo apos o merge para confirmar:
- presenca do painel
BK-101 · Radar de Recomendacao; - uso do ultimo snapshot conhecido por post em
social_post_metrics_history - tentativa de smoke de runtime via bootstrap/CLI do modulo:
- bloqueada por autenticacao MySQL do bootstrap do admin neste contexto de terminal, entao a validacao de runtime ficou parcial
BK-95 · Healthcheck WhatsApp em 5 min com cron canônico reconciliado
Data: 16 de Marco de 2026
Contexto operacional:
- apos o fechamento do
BK-92, a priorizacao do dia foi reaplicada no backlog com base no protocolo de triagem/execucao doAGENTS.md, puxando oBK-95como proxima frente de operacao/venda. - a auditoria do agendamento mostrou que o healthcheck real nao estava mais no desenho documentado:
- o job canonico do aaPanel (
crontab.id=24, wrapper86f580c4ec3c598ee051b7783bacf704) rodava de hora em hora, combash; - havia uma linha manual duplicada no
rootpara0 /2 /www/wwwroot/rionoteatro.com.br/bot/whatsapp/healthcheck.sh, mas ela falhava comPermission denied; - o
watchdog_systemd.shja estava agendado a cada5minutos, porem tambem falhava comPermission deniedpor falta de interpretador explicito na linha manual. - o efeito pratico era drift operacional: a documentacao falava em
2h, o runtime executava1hpelo aaPanel e os jobs manuais geravam ruido de erro sem entregar o comportamento esperado.
Ajustes aplicados:
- runtime aaPanel / cron
- o job
WhatsApp Healthcheckdo aaPanel (id=24) foi reconciliado paraminute-ncom cadencia de5minutos, preservando o wrapper oficial do painel e a execucao viabash; - a linha manual duplicada de
2hparahealthcheck.shfoi removida docrontabdoroot; - a linha manual do
watchdog_systemd.shfoi mantida em*/5, mas passou a chamarbash /www/wwwroot/rionoteatro.com.br/bot/whatsapp/watchdog_systemd.shpara parar oPermission denied. docs/BACKLOG.md- ganhou nota explicita de repriorizacao do
BK-95, referenciando o gate de triagem doAGENTS.md. bot/whatsapp/SETUP_RESILIENCIA.md- passou a documentar
healthcheckcanonico a cada5minutos via aaPanel combash, incluindo a recomendacao de nao manter jobs paralelos duplicados; - passou a registrar o
watchdog_systemd.shtambem com invocacao viabash. docs/documentacao_tecnica/WHATSAPP_HELPER.md- foi atualizado para refletir o runtime atual via
systemd, o papel dohealthcheckcomo job de5minutos e o disparo sob demanda feito pelo helper PHP.
Resultado funcional observado:
- o healthcheck passou a ter uma unica fonte canonica persistente no aaPanel para a cadencia de
5minutos; - o cron manual deixou de carregar a linha redundante quebrada de
2h; - o
watchdogde5minutos deixou de depender do bit de execucao do arquivo para rodar no cron manual.
Validacoes executadas:
sqlite3 /www/server/panel/data/default.db "select id,name,type,where1,where_hour,where_minute from crontab where id=24;"crontab -l | rg "86f580c4ec3c598ee051b7783bacf704|healthcheck\\.sh|watchdog_systemd\\.sh"bash /www/server/cron/86f580c4ec3c598ee051b7783bacf704bash /www/wwwroot/rionoteatro.com.br/bot/whatsapp/watchdog_systemd.shtail -n 20 /www/wwwroot/rionoteatro.com.br/bot/whatsapp/healthcheck.logtail -n 20 /www/server/cron/rnt_whatsapp_watchdog.loggit diff --stat
BK-92 · Hardening operacional do stack WhatsApp e notify_state
Data: 16 de Marco de 2026
Contexto operacional:
- A priorizacao do dia foi registrada no backlog conforme o protocolo de triagem/execucao do
AGENTS.md, com foco imediato em operacao/venda no itemBK-92. - A evidencia coletada antes da alteracao mostrou que o servico
rnt-whatsappestava ativo e enviando, porem com housekeeping incompleto: - fila zerada;
151locks anti-spam com mais de 24h embot/whatsapp/locks/;4arquivos ativos emadmin/cron/logs/notify_state/, sem excesso no momento.- O
bot/whatsapp/healthcheck.shdependia de umaAPI_KEYhardcoded, criando acoplamento fragil com o runtime real do microservico.
Ajustes aplicados:
docs/BACKLOG.md- ganhou nota explicita de priorizacao do
BK-92, referenciando o fluxo orientado porAGENTS.md. includes/whatsapp_helper.php- ganhou limpeza defensiva de locks anti-spam expirados, com cooldown para nao escanear o diretorio a cada envio.
bot/whatsapp/healthcheck.sh- passou a carregar
BOT_WHATSAPP_API_KEY/WPP_API_KEYdo ambiente e/ou.env, removendo dependencia de chave hardcoded no shell; - passou a limpar locks anti-spam expirados e arquivos temporarios antigos de fila antes do processamento.
admin/cron/cron_whatsapp_notify.php- passou a executar auto-limpeza defensiva de
notify_stateno proprio fluxo de debounce, reduzindo dependencia exclusiva do cron noturno. admin/cron/limpar_notify_state.php- foi endurecido com configuracao por ambiente, guarda de
realpath, ignorando symlinks e reportando melhor o que foi preservado/removido.
Resultado funcional observado:
- o healthcheck passou a autenticar usando a chave vigente do runtime, sem depender de segredo hardcoded em shell versionado;
- a execucao manual segura do healthcheck removeu
149locks anti-spam expirados de uma vez, reduzindo o diretorio para12locks totais (10recentes e2ainda dentro da margem de seguranca de25h); - o
notify_stateficou sob duas camadas de limpeza: auto-higiene no helper e cron dedicado como retaguarda, sem remover os4arquivos ainda dentro da janela valida.
Validacoes executadas:
git status -sbsystemctl status rnt-whatsapp --no-pager -n 40- contagem objetiva de runtime:
find bot/whatsapp/locks ...->151locks com mais de 24h antes do hardeningfind admin/cron/logs/notify_state ...->4arquivos ativos no recorte inicialphp -l includes/whatsapp_helper.phpphp -l admin/cron/cron_whatsapp_notify.phpphp -l admin/cron/limpar_notify_state.phpbash -n bot/whatsapp/healthcheck.sh- execucao manual segura:
bash bot/whatsapp/healthcheck.shphp admin/cron/limpar_notify_state.phpphp -r 'require "admin/cron/cron_whatsapp_notify.php"; ... cronNotifyCleanupState(...)'
BK-133 · Auditoria do archive/20260209 e plano de resgate
Data: 15 de Marco de 2026
Contexto operacional:
- Durante a limpeza de branches antigas do projeto, foi preservado no GitHub o snapshot
archive/20260209-stash-fix-url-ajax-teatros, originado de umstashantigo que ainda nao tinha sido auditado contra amain. - O protocolo novo passou a exigir auditoria de conteudo arquivo a arquivo antes de apagar branch, worktree ou stash, entao o snapshot foi tratado como material potencialmente valioso, nao como lixo operacional.
- Na sequencia, o mesmo protocolo foi aplicado tambem ao snapshot
archive/20260206-stash-ci-caminho-remoto-deploy, para permitir limpeza final das branches remotas sem perda de historico.
Evidencia objetiva coletada:
- branch auditada:
archive/20260209-stash-fix-url-ajax-teatros - commit preservado:
764f0849c303bc1c4519d60da2e5ffbfe0e61430 - data original do commit arquivado:
2026-02-09 08:16:02 +0000 - push de preservacao no GitHub:
2026-03-15 19:26:15 -0300 - comparacao contra a
mainatual: 34.766caminhos tocados pelo snapshot;1caminho igual namainatual (admin/data/setup.php);14.386caminhos com conteudo/modo diferente damain;20.379caminhos existentes apenas no snapshot arquivado.
Blocos candidatos a resgate dirigido:
- Roteamento publico / AJAX / admin-data:
action.php,index.php,admin/data/Fotos.php,admin/data/Login.php,admin/data/__CLASS.SQL.php,admin/data/config.php,admin/data/functions.php,admin/data/urlAmigavel.php - Bot captador / Sympla:
bot/cron_captador.php,bot/scrapers/sympla_scraper.php - Referencias auxiliares do snapshot:
README.md,action.php.bak,index.php_bkp
Blocos explicitamente bloqueados para merge cego:
vendor/(20.152caminhos, todos apenas no snapshot)admin/outros/(9.910caminhos, quase todos divergentes damain)painel/,img/,apps/,produtor/,PagSeguroLibrary/,phpmailer/e legado amplo do front/admin- arquivos de infra/estaticos (
.well-known/, paginas de erro, modos de arquivo, backups velhos) sem incidente atual associado
Decisao operacional:
- o snapshot continua preservado em branch propria no GitHub e localmente;
- foi aberto o
BK-133para resgate dirigido, com escopo inicial restrito aos arquivos de maior sinal funcional; - qualquer recuperacao de codigo a partir desse snapshot deve acontecer por revisao manual de diff, arquivo a arquivo, nunca por merge amplo do snapshot.
Resultado final da auditoria:
- no
archive/20260209, o blocoaction.php/index.php/admin/data/*auditado nao trouxe correcao funcional reaproveitavel; o que apareceu ali foi majoritariamente drift historico e mudanca de modo. - as mudancas funcionais encontradas em
bot/cron_captador.phpebot/scrapers/sympla_scraper.phpnao foram portadas para amain, porque o diff contra amainatual mostrou regressao para uma versao mais antiga do captador/scraper. - no
archive/20260206, a auditoria apontou um snapshot muito amplo e historico, sem recorte seguro para merge automatico. - como destino final, ambos os snapshots foram preservados por tags Git:
archive-20260209-stash-fix-url-ajax-teatrosarchive-20260206-stash-ci-caminho-remoto-deploy- com isso, as branches remotas
archive/...ficaram aptas a delecao sem perda de rastreabilidade.
Documento de apoio:
- ver
docs/BK-133-RELATORIO-RESGATE-ARCHIVE-20260209.md
Validacoes executadas:
git show -s --format='%H%n%ci%n%cn%n%s' archive/20260209-stash-fix-url-ajax-teatrosgit reflog show --date=iso refs/remotes/origin/archive/20260209-stash-fix-url-ajax-teatrosgit rev-list --left-right --count main...archive/20260209-stash-fix-url-ajax-teatros- auditoria por arvore Git (blobs/modos) comparando os
34.766caminhos tocados pelo snapshot contra amain git diff --stat main archive/20260209-stash-fix-url-ajax-teatros -- README.md action.php admin/data/Fotos.php admin/data/Login.php admin/data/__CLASS.SQL.php admin/data/config.php admin/data/functions.php admin/data/urlAmigavel.php admin/data/setup.php bot/cron_captador.php bot/scrapers/sympla_scraper.php index.phpgit show -s --format='%H%n%ci%n%cn%n%s' archive/20260206-stash-ci-caminho-remoto-deploygit reflog show --date=iso refs/remotes/origin/archive/20260206-stash-ci-caminho-remoto-deploy- auditoria por arvore Git comparando os
37.638caminhos do snapshot20260206contra amain git tag -a archive-20260209-stash-fix-url-ajax-teatros ...git tag -a archive-20260206-stash-ci-caminho-remoto-deploy ...
BK-132 · Console de cancelamento por sessao em Peças
Data: 14 de Marco de 2026
Contexto operacional:
- O usuario pediu uma ferramenta no admin de Peças para cancelar apenas uma sessao especifica, sem mexer no espetaculo inteiro e sem disparos automaticos fora de confirmacao explicita.
- O fluxo precisava separar dois grupos no momento do aviso:
- compradores com status
3/4, com mensagem editavel antes do envio; - pedidos sem pagamento concluido, com mensagem padrao.
- O ponto mais importante desta entrega foi governanca:
- nao executar nada sozinho;
- exigir preview antes de liberar o envio final.
Ajustes aplicados:
admin/modulos/pecas/index.php- nova area Central de Cancelamento de Sessão dentro da propria tela de Peças.
- fluxo com:
- seletor de espetaculo;
- seletor de sessao;
- textarea editavel para compradores
3/4; - textarea padrao para pedidos nao concluidos;
- resumo visual com contagem de pedidos travaveis, clientes por grupo e avisos de celular ausente.
- o botao final fica desabilitado ate existir uma pre-visualizacao valida.
admin/modulos/pecas/action.php- novos
acts: cancelamento_list_sessionscancelamento_previewcancelamento_execute- o envio/travamento ficou encapsulado em endpoint proprio, separado dos fluxos antigos do modulo.
admin/modulos/pecas/session_cancel_console_helper.php- novo helper para:
- listar pecas/sessoes elegiveis;
- consultar pedidos por sessao;
- agrupar destinatarios por cliente;
- separar
paid,unpaideignored; - aplicar
status_manual+status_transacao=2somente quando o operador confirmar. - query de sessoes endurecida para nao inflar
abertosem sessoes sem pedido. - texto default dos compradores ficou neutro/editavel, sem sugestao automatica de desfecho.
Resultado funcional:
- O admin passa a conseguir preparar cancelamento por sessao sem sair de
admin/modulos/pecas/index.php. - O operador ve antes do envio:
- quantos pedidos serao travados;
- quantos clientes estao em
3/4; - quantos sao pedidos nao concluidos;
- quantos estao sem celular;
- quem ficou fora da regra.
- O envio final continua manual e confirmado.
Validacoes executadas:
php -l admin/modulos/pecas/session_cancel_console_helper.phpphp -l admin/modulos/pecas/action.phpphp -l admin/modulos/pecas/index.php- extracao do JS inline de
admin/modulos/pecas/index.php+node --check - teste funcional seguro do preview:
- listagem real de sessoes por
event_id - chamada real do
act=cancelamento_previewpara a sessao2026-03-14 19:00:00 - sem disparo de mensagens nem update de pedidos nesta validacao
BK-131 · Agenda social story-first + resiliencia do Rodar Squad
Data: 14 de Marco de 2026
Contexto operacional:
- A operacao relatou dois desvios no mesmo fluxo social:
- o botao
Rodar Squadna aba#tab-squadparecia nao responder quando a tela ainda estava conectando/bootstrapando; - o planner social seguia empilhando feed recorrente por sessao, mesmo com a regra operacional atual pedindo Story como padrao e feed apenas como excecao.
- Na agenda manual, a criacao de nova postagem ainda abria em
facebook_feed, empurrando a operacao para o canal errado. - Na sequencia, a operacao acrescentou mais duas exigencias do mesmo eixo:
- o gatilho
last_ticketsprecisava avisar o admin no WhatsApp a cada novo marco de10ingressos vendidos para a proxima sessao; - a segunda-feira precisava ganhar um carrossel semanal multi-peca em feed, sem depender de montagem manual fora do sistema.
Ajustes aplicados:
admin/modulos/campanhas/redes_sociais_squad.js- a intencao de
startpassou a ficar pendente enquanto bootstrap/WebSocket nao estao prontos. - ao concluir a conexao, a run e enviada automaticamente sem exigir novo clique do operador.
- erros de
run_acklimpam o estado pendente para evitar reenvio fantasma. admin/modulos/campanhas/redes_sociais.php- cache-buster do asset
redes_sociais_squad.jsatualizado para forcar o admin a carregar a versao corrigida. admin/modulos/facebook/agendamento.php- o modal
Nova postagemagora abre eminstagram_storycom modoauto. - os canais de Story foram movidos para o topo do seletor.
- o texto operacional passou a reforcar que Story automatico e o padrao;
notifiedfica reservado para casos de sticker/link manual. admin/cron/sync_facebook_events.php- o planner entrou em politica
story-first. - a fila legada
planner_sessionde feed recorrente passou a ser cancelada automaticamente para nao continuar gerando tentativas desalinhadas. - foi criado o planejamento
planner_site_entry, que preserva apenas um feed automatico inicial por peca/canal quando ainda nao existe registro valido (queued,scheduledouposted). - o restante da pressao operacional continua nos gatilhos automaticos de Story que ja existiam no cron.
admin/cron/sync_facebook_events.php- o gatilho
last_ticketspassou a levarmilestone,solde horario de sessao no payload. - foi criado
maybeNotifyLastTicketsMilestone()para enviar alerta ao admin via WhatsApp helper quando a proxima sessao atinge novo marco de10+ingressos vendidos. - foi criado o tipo de fila
planner_weekly_carousel, com agendamento automatico para segunda-feira09:05. - o dispatcher passou a montar e publicar o carrossel semanal diretamente da fila, em
facebook_feedeinstagram_feed. - os slides do carrossel passaram a ser compostos em JPG pelo proprio cron, agrupando varias pecas por pagina para caber toda a semana no limite das plataformas.
admin/classes/FacebookEventService.php- ganhou
createFeedCarouselPost()para publicar album/carrossel de varias imagens no Facebook Page Feed. - ganhou
createInstagramCarousel()para criar containerCAROUSELno Instagram e publicar depois viamedia_publish. admin/modulos/facebook/agendamento-events.php- a agenda passou a renderizar o item semanal com nome amigavel (
Carrossel semanal) e imagem institucional, em vez de exibirPeca #0. docs/BACKLOG.md- foi aberto o
BK-110para a camada editorial/manual do carrossel semanal, cobrindo override de curadoria, ordem e slide de abertura.
Resultado funcional:
- O
Rodar Squaddeixa de depender do timing exato entre clique e conexao do WebSocket. - A agenda manual passa a nascer no fluxo esperado pela operacao social atual.
- O cron deixa de insistir em feed recorrente por sessao e reduz o ruido que estava alimentando erro em fila para um comportamento mais proximo da regra de negocio pedida.
- Quando a proxima sessao cruza um novo patamar de venda (
10,20,30...), o admin recebe alerta para preparar o Story de urgencia. - A segunda-feira passa a ter carrossel semanal multi-peca planejado e publicado automaticamente no feed, com asset composto pelo backend e rastreio na mesma
social_post_queue.
Validacoes executadas:
php -l admin/classes/FacebookEventService.phpphp -l admin/cron/sync_facebook_events.phpphp -l admin/modulos/facebook/agendamento.phpphp -l admin/modulos/facebook/agendamento-events.phpphp -l admin/modulos/campanhas/redes_sociais.phpnode --check admin/modulos/campanhas/redes_sociais_squad.js- extracao do JS inline de
admin/modulos/facebook/agendamento.php+node --check
BK-100 · Metricas por postagem social com historico por item de fila
Data: 13 de Marco de 2026
Contexto operacional:
- A fila social (
social_post_queue) ja persistiaplatform_post_id, mas nao existia historico de snapshots por item nem qualquer leitura de metricas por postagem no admin. - A agenda social mostrava apenas status operacional e
Post ID, o que resolvia publicacao/triagem, mas nao permitia comparar alcance, engajamento ou resposta real por canal. - Havia ainda uma aresta importante no fluxo manual/notificado:
- quando o operador conclui sem informar ID real, a referencia continua como
manual:*, o que precisa ser tratado como nao mensuravel em vez de quebrar o coletor.
Ajustes aplicados:
admin/cron/sync_social_metrics.php- novo cron dedicado para coletar metricas sociais sem inflar ainda mais o
sync_facebook_events.php. - cria/garante
social_post_metrics_historye grava snapshot diario porqueue_id. - processa
posted,posted_manualescheduledja vencidos, com janela de seguranca para itens agendados na plataforma. - trata referencias
manual:*e URLs soltas comoskipped, preservando rastreabilidade sem gerar erro falso. admin/classes/FacebookEventService.php- novos leitores de metricas por canal para Facebook, Instagram e Threads.
- leitura por metrica individual para tolerar respostas parciais da API sem derrubar o snapshot inteiro.
- payload bruto das plataformas passou a ser preservado junto do resumo normalizado.
admin/modulos/facebook/agendamento-events.php- agenda passa a anexar o ultimo snapshot de
social_post_metrics_historypor item da fila. - tooltip/modal agora mostram resumo das metricas disponiveis e usam permalink real da plataforma quando retornado.
admin/modulos/facebook/agendamento.php- CTA do modal foi generalizado para
Ver na plataforma. - prompt de conclusao manual passou a deixar explicito que o ID real ajuda a manter o item mensuravel.
sql_updates/create_social_post_metrics_history.sql- script documental da nova tabela de historico de metricas.
Resultado funcional:
- Cada item elegivel da fila social pode acumular snapshots diarios de desempenho, em vez de sobrescrever um unico estado final.
- O operador passa a ver, na propria agenda social, se o item ja tem alcance/engajamento/resposta e quando a ultima coleta aconteceu.
- O coletor continua robusto em cenarios incompletos:
okquando houve retorno normal;partialquando parte das metricas volta e outra parte falha;skippedquando a referencia nao e mensuravel (manual:*ou URL sem resolucao);errorquando a API nao entrega retorno utilizavel.
Validacoes executadas:
php -l admin/classes/FacebookEventService.phpphp -l admin/cron/sync_social_metrics.phpphp -l admin/modulos/facebook/agendamento-events.phpphp -l admin/modulos/facebook/agendamento.php- extracao do JS inline de
admin/modulos/facebook/agendamento.php+node --check - execucao controlada do novo cron via injecao do
.envda arvore viva: php admin/cron/sync_social_metrics.php --limit=5- resultado do primeiro run: sem candidatos elegiveis dentro do limite consultado
BK-129 · Fundo do carrossel + flutuacao mobile em evento
Data: 13 de Marco de 2026
Contexto operacional:
- O ajuste visual anterior do carrossel em
evento.phpmelhorou contraste e CTA, mas o usuario percebeu que a faixa escura ainda parecia curta por tras do bloco. - Na mesma rodada, tambem foi pedido para o carrossel continuar acompanhando a rolagem na versao mobile da pagina de evento.
Ajustes aplicados:
evento.php.rnt-event-carousel-containerrecebeubox-sizing: border-box,min-height: 170pxepaddingmaior para a faixa escura cobrir melhor a altura visual do carrossel.- o ajuste responsivo em
max-width: 991pxpassou a manter a faixa commin-height: 150pxepaddingproprio, em vez de apenas resetar o wrapper. .rnt-event-carousel-innerpassou a ocuparwidth: 100%, com respiro lateral proprio tambem no mobile.- a funcao
atualizarEstadoFlutuanteCarrosselEventodeixou de desligar o modo flutuante em telas<= 991px.
Resultado funcional:
- A faixa escura do carrossel fica mais consistente por tras dos cards, evitando a sensacao de fundo "curto".
- O carrossel de ofertas da pagina de evento continua acompanhando o scroll tambem no mobile, seguindo a mesma logica de placeholder e offset do header.
Validacoes executadas:
php -l evento.php- extracao do trecho JS de
sincronizarCarrosselEvento+node --check - confirmacao por diff da remocao da guarda
window.innerWidth <= 991
BK-105 · Hardening do fluxo manual Story na agenda social
Data: 13 de Marco de 2026
Contexto operacional:
- O fluxo de Story com sticker/link ja passava por
notified, mas a conclusao manual ainda gravavaposted, misturando no historico itens manuais com publicacoes feitas por API/agendamento. - O endpoint
agendamento-update-status.phpaceitavamark_posted_manualapenas comqueue_id, sem validar no servidor se o item ainda estava emstatus=notified.
Ajustes aplicados:
admin/modulos/facebook/agendamento-update-status.php- passou a validar
canalde Story +tipomanual/notificado +status = 'notified'antes de concluir a publicacao manual. - status final passou de
postedparaposted_manual. last_errore limpo na conclusao manual bem-sucedida.admin/modulos/facebook/agendamento-events.php- agenda ganhou o status/filtro
posted_manualcomo classe propria do historico. admin/modulos/facebook/agendamento.php- filtro visual passou a expor
Publicado manualmente. docs/BACKLOG.md- BK-97 foi removido da lista ativa porque ja estava fechado no historico/codigo.
- a subtarefa remanescente do BK-105 foi marcada como concluida com o fluxo oficial
queued -> notified -> posted_manual.
Resultado funcional:
- Stories manuais deixam de aparecer como
postedgenerico na fila social. - A trilha operacional fica mais auditavel:
queuedpara fila;notifiedpara acao manual aguardando operador;posted_manualsomente depois da confirmacao humana.- O bypass direto de
queuedpara conclusao manual deixa de ser aceito pelo endpoint.
Validacoes executadas:
php -l admin/modulos/facebook/agendamento-update-status.phpphp -l admin/modulos/facebook/agendamento-events.phpphp -l admin/modulos/facebook/agendamento.php- validacao do JS inline de
admin/modulos/facebook/agendamento.phppor extracao do bloco<script>+node --check
BK-128 · Workspace Squad Social na Central de Redes Sociais
Data: 13 de Marco de 2026
Contexto operacional:
- O runtime multiagente do Cerebro ja estava pronto para squads, mas o operador do RNT ainda precisava sair do admin para iniciar e revisar runs.
- A necessidade desta fase era abrir um workspace proprio dentro de
redes_sociais.phppara: - briefing humano;
- escolha de template/modo;
- historico de runs;
- decisao humana (
approve/reject/rerun) sem sair da Central de Redes Sociais. - O escopo foi mantido pragmatico:
- publish continua assistido;
- esta entrega nao automatiza a publicacao final dentro do RNT.
Ajustes aplicados:
admin/modulos/campanhas/redes_sociais.php- nova aba Squad Social adicionada ao lado de
Operacao Social,Videos IAeTexto Audio Story. - novo workspace com:
- seletor de peca elegivel;
- seletor de template do squad;
- modos
economicoealta_performance; - engines
Codex,GeminieKimi; - briefing persistido em
localStorage; - historico de runs da workspace;
- console com resumo da run, etapas, artefatos e timeline;
- acoes manuais
approve,rejectererun. admin/modulos/campanhas/social_squad_helper.php- novo helper JSON para o front da aba.
- expõe:
- bootstrap do Squad (
wsUrl, defaults, namespace de sessao,dashboardUrl); - contexto leve da peca selecionada (
local,bairro, proxima sessao, preco/oferta e briefing base). - faz fallback do endpoint WS para
wss://cerebro.seuimovel.rio.br/api/gatewayquando nenhum env especifico estiver definido.
Resultado funcional:
- O operador passa a conseguir iniciar uma run do Squad Social sem sair do admin do RNT.
- A mesma tela agora mostra:
- templates disponiveis do projeto
rionoteatro; - runs recentes da workspace atual;
- console por etapa com timeline e artefatos;
- decisao humana de aprovacao ou devolucao para rework.
- O fluxo continua seguro para esta fase porque o publish segue assistido, sem automacao cega de postagem final.
Validacoes executadas:
php -l admin/modulos/campanhas/redes_sociais.phpphp -l admin/modulos/campanhas/social_squad_helper.phpnode --check admin/modulos/campanhas/redes_sociais_squad.js
BK-127 · Ajuste visual do carrossel em evento
Data: 13 de Marco de 2026
Contexto operacional:
- Depois da correcao funcional do carrossel flutuante em
evento.php, o usuario pediu apenas refinamento visual. - Os dois pedidos foram objetivos:
- aplicar fundo escuro com transparencia na div do carrossel;
- reduzir a tipografia do CTA
QUERO ESTA OFERTA.
Ajustes aplicados:
evento.php.rnt-event-carousel-containerpassou a usarbackground: rgba(8, 16, 28, 0.86).- foi adicionado
backdrop-filter: blur(10px)para reforcar a leitura do bloco enquanto ele flutua sobre a pagina. - o seletor
.rnt-event-carousel-container .btn.btn-successpassou a aplicarfont-size: 11px.
Resultado funcional:
- O carrossel continua acompanhando o header/menu, mas agora com contraste visual mais claro como faixa destacada.
- O CTA interno fica menos pesado visualmente e ocupa menos area horizontal.
Validacoes executadas:
php -l evento.php- validacao HTTP real da URL
https://rionoteatro.com.br/se-der-corda - confirmada a presenca de:
background: rgba(8, 16, 28, 0.86)font-size: 11px
BK-126 · Correcao do carrossel flutuante em evento
Data: 13 de Marco de 2026
Contexto operacional:
- A URL
https://rionoteatro.com.br/se-der-cordafoi usada como validacao real apos o merge do BK-125. - O HTML mostrava o wrapper novo do carrossel, mas no navegador ele ainda nao acompanhava o menu durante o scroll.
Causa raiz confirmada:
evento.php- o wrapper do carrossel estava em
position: sticky; - mas, na pratica, ele ficava limitado ao
#carousel-placeholder, que nao oferecia area de rolagem suficiente para sustentar o efeito ao longo da pagina. - Resultado:
- o carrossel parecia normal/estatico mesmo com as classes e scripts presentes.
Ajustes aplicados:
evento.php- o modo flutuante passou a usar
position: fixedquando o topo do placeholder e ultrapassado. - o
#carousel-placeholderpassou a reservar dinamicamente a altura do carrossel (minHeight) para evitar salto de layout. - a funcao
window.sincronizarCarrosselEventofoi exposta e continua recalculando: - altura do header;
- offset do topo;
- estado flutuante;
- altura reservada.
- no mobile o comportamento continua estatico.
Resultado funcional:
- O carrossel de
evento.phpdeixa de depender do limite estrutural do placeholder. - Em desktop, ele passa a acompanhar de fato o header/menu durante a rolagem.
- O conteudo abaixo nao "sobe" quando o bloco entra em modo flutuante.
Validacoes executadas:
php -l evento.php- validacao HTTP real da URL
https://rionoteatro.com.br/se-der-corda - confirmada no HTML a presenca de:
window.sincronizarCarrosselEventoplaceholder.style.minHeightposition: fixedno estado.is-floating
BK-125 · Carrossel flutuante na pagina de evento
Data: 13 de Marco de 2026
Contexto operacional:
- O usuario pediu explicitamente para mexer apenas em
evento.php. - O comportamento desejado era manter o carrossel acompanhando o menu/header quando a pagina de evento fosse rolada para baixo.
- O carrossel ja existia no topo da pagina, mas era apenas injetado no placeholder e desaparecia completamente durante a navegacao pelo restante do conteudo.
Ajustes aplicados:
evento.php- criado um wrapper dedicado do carrossel (
#rnt-event-carousel-shell) exclusivo da pagina de evento. - o wrapper passou a usar
position: stickysomente em desktop. - o
topnao ficou fixo em valor magico: um script passa a recalcular--rnt-event-carousel-offseta partir da altura real do.rnt-header. - listeners de
load,resizeescrollmantem o offset sincronizado com o estado do header, inclusive quando ele encolhe no modoscrolled. - o carrossel ganha sombra leve ao entrar em estado flutuante para reforcar visualmente que esta acompanhando o topo.
- em mobile (
max-width: 991px) o comportamento volta para estatico para evitar um bloco grande ocupando a viewport.
Resultado funcional:
- Em desktop, o carrossel da pagina de evento passa a acompanhar o header/menu durante a rolagem.
- O offset acompanha a altura real do header para evitar colisao visual.
- Em mobile, a experiencia permanece conservadora e sem sobrecarga de sticky.
Validacoes executadas:
php -l evento.php- validacao estrutural do arquivo renderizado para confirmar:
#rnt-event-carousel-shell--rnt-event-carousel-offset- listeners de
load,resizeescroll
BK-124 · Hardening de fora de cartaz em metadados + comentarios operacionais
Data: 13 de Marco de 2026
Contexto operacional:
- O usuario reportou a URL
https://rionoteatro.com.br/gonzaguinha-eterno-aprendizcomo se ainda estivesse com cara de peca atual. - A verificacao real mostrou um quadro misto:
- o corpo da pagina ja estava no layout enxuto de fora de cartaz;
- o
<head>ainda anunciava a peca como evento ativo, com oferta antiga, imagem antiga e JSON-LD de evento agendado. - Esse desalinhamento explicava muito bem a percepcao de pagina "atual" em cache, preview social ou snippet, mesmo quando o layout visivel ja estava correto em aba anonima.
Causa raiz confirmada:
meta-analytics.php- o arquivo gerava OG/Twitter/JSON-LD sempre como evento ativo para as paginas de
peca.php. - isso incluia:
og:titlecom sufixo de oferta antiga;og:imagecom a capa historica da peca;event:start_time/event:end_time;- JSON-LD
TheaterEventcomEventScheduled. evento.php- o bloco proprio de OG/Twitter tambem continuava tratando eventos fora de cartaz como
event, reaproveitando imagem e descricao historicas. peca.phpeevento.php- o layout enxuto de fora de cartaz existia, mas a regra operacional de limpeza de assets apos 7 dias nao estava comentada no proprio ponto de decisao da pagina.
Ajustes aplicados:
meta-analytics.php- passou a detectar quando a peca publica esta fora de cartaz.
- nesse caso:
og:typepassa awebsite;og:title/twitter:titledeixam de carregar oferta antiga;meta descriptioninforma que o espetaculo nao esta em cartaz no momento;og:image/twitter:imagepassam a usarimg/logo_2023.png;event:start_time/event:end_timedeixam de ser publicados;- o JSON-LD troca
TheaterEvent/EventScheduledporWebPage. evento.php- o bloco OG/Twitter proprio dos eventos de produtor foi alinhado com a mesma regra de fora de cartaz:
og:type=website;- descricao neutra;
- imagem institucional em vez da capa antiga.
peca.phpeevento.php- comentarios operacionais adicionados para deixar explicito que:
- 7 dias apos o fim da temporada, fotos/videos antigos devem ser removidos pelo cleanup;
- o layout canonico de fora de cartaz deve esconder foto e dados da temporada passada e manter apenas o aviso de indisponibilidade com outras pecas abaixo.
Resultado funcional:
- A URL historica deixa de se vender como evento agendado quando ja esta fora de cartaz.
- O corpo e o
<head>passam a contar a mesma historia: - pagina indisponivel no momento;
- sem oferta antiga;
- sem imagem antiga;
- sem structured data de evento ativo.
Validacoes executadas:
php -l peca.phpphp -l evento.phpphp -l meta-analytics.php- Validacao HTTP real da URL
https://rionoteatro.com.br/gonzaguinha-eterno-aprendiz: - corpo com
Nao temos informacoes deste espetaculo no momento og:type=websiteog:title=Gonzaguinha - o Eterno Aprendiz | Rio no Teatroog:image=https://rionoteatro.com.br/img/logo_2023.png- ausencia de
event:start_time/event:end_time - JSON-LD com
@type=WebPage
BK-123 · Hardening do login admin com fallback sem JSON cru
Data: 13 de Marco de 2026
Contexto operacional:
- O endpoint
admin/action.phpdo login foi desenhado para responder JSON. - Quando o submit do formulario caia como
POSTtradicional, sem o JavaScript interceptar a resposta, o navegador exibia diretamente: {"status":"success","url":"...","message":"Direcionando ..."}- O sintoma era intermitente: em tentativas seguintes o login voltava a funcionar, reforcando que a autenticacao em si nao estava quebrada; o problema estava no acoplamento entre o form e o JS.
Causa raiz confirmada:
admin/login.php- o formulario aponta direto para
admin/action.php. admin/action.php- o
case 'login'respondia JSON tanto para sucesso quanto para erro, sem fallback para submit tradicional. admin/js/parsley-validate-form.js- o redirect real dependia da interceptacao AJAX no front-end.
- Com isso, qualquer falha transitora de carregamento/cache/execucao do JS fazia o navegador receber o JSON cru do endpoint.
Ajustes aplicados:
admin/action.php- adicionada deteccao de requisicao AJAX por
HTTP_X_REQUESTED_WITH. - no
case 'login': - AJAX continua recebendo JSON;
- submit tradicional recebe
302paraindex.phpquando autenticado; - submit tradicional recebe
302paralogin.php?login_error=1quando invalido. - as respostas JSON do endpoint passaram a declarar
Content-Type: application/json; charset=utf-8. admin/login.php- adicionado helper local com
filemtime()para versionar: js/jquery.jsjs/bootstrap.min.jsassets/toastr-master/toastr.jsjs/plugins/parsley/parsley.jsjs/parsley-validate-form.js- adicionado alerta visual simples quando a tela voltar com
login_error=1.
Resultado funcional:
- O login admin passa a ter dois caminhos seguros:
- caminho principal: AJAX + redirect no front-end, como antes;
- caminho de contingencia: redirect HTTP nativo sem exibir JSON cru no navegador.
- O cache-buster reduz a chance de recorrencia por asset JS stale depois de deploy/ajuste.
Validacoes executadas:
php -l admin/login.phpphp -l admin/action.php- Validacao HTTP real do fallback:
POSTtradicional invalido paraadmin/action.phpretorna302 Location: /admin/login.php?login_error=1POSTcom headerX-Requested-With: XMLHttpRequestcontinua retornando JSON (status=error)GET admin/login.phprenderiza os scripts com sufixo?v=...
Riscos residuais:
- O fallback por
header()depende de nao haver output prematuro em includes futuros deadmin/action.php. - Este BK cobre apenas o fluxo
login;remembererecoverycontinuam dependentes do fluxo AJAX legado.
BK-122 · Copy IA multi-formato na Central de Redes Sociais
Data: 12 de Marco de 2026
Contexto operacional:
- A Central de Redes Sociais já tinha fluxo semimanual forte para vídeo, mas o texto para locução ainda estava em modo local/template.
- A operação precisava escalar para copies reutilizáveis por IA, com foco em venda: teatro, bairro, dia, horário, preço e desconto.
- O usuário também definiu um recorte funcional claro para esta fase:
2 storiespor IA;2 reelspor IA;storymais direto/comercial;reelspodendo falar um pouco mais do atrativo do espetáculo.
Ajustes aplicados:
admin/modulos/campanhas/redes_sociais.php- nova aba
Texto Audio Storyincorporada ao módulo. - regra de elegibilidade de peça alinhada com a vitrine pública (
pecas.php) para o seletor interno. - contexto da peça enriquecido com:
- nome limpo da landing;
- teatro;
- bairro/região;
- próxima sessão;
- preço promocional;
- desconto percentual.
- nova tabela
social_audio_jobscriada em runtime para persistir jobs de copy. - geração por IA passou a suportar:
Geminivia CLI na politica atual da VPS;OpenAI(OPENAI_API_KEY).- para cada IA configurada, o clique em
Gerar com IApassa a criar: 2jobsstory;2jobsreels.- prompt endurecido para:
- priorizar local, bairro, dia, horário, preço e desconto;
- destacar quando o desconto supera a meia;
- evitar frases longas e inventar informações como
sem taxa. - listagem de jobs passou a mostrar:
- provider;
- modelo;
- formato;
- versões geradas;
- seleção manual da versão ativa.
Resultado funcional:
- A tela deixou de depender apenas de texto determinístico local.
- Quando as chaves estão configuradas, a operação passa a ter múltiplas versões de copy por IA e por formato.
- Quando as chaves não estão configuradas, o fluxo ainda salva job com fallback local para não interromper a rotina.
Validacoes executadas:
php -l admin/modulos/campanhas/redes_sociais.php- validacao do JS inline equivalente por extracao do bloco
<script>+node
BK-119 · Reabrir sugestões aprovadas na conciliação do bot
Data: 11 de Marco de 2026
Contexto operacional:
- O fluxo de conciliação de bot perdeu funcionalidade após merge anterior: itens aprovados não tinham mais atalho de retorno para revisão.
- O usuário reportou que aprovados sumiam da lista de ação sem como reabrir para ajuste.
Ajustes aplicados:
admin/modulos/eventos/action.php- adicionado o
case 'conciliar_reabrir'. - valida que o usuário é admin.
- carrega a sugestão por
id, valida existência e confirmastatus = 'aprovado'. - atualiza a sugestão para:
status = 'pendente'data_decisao = NULL- retorna sucesso com mensagem e URL de retorno.
admin/modulos/eventos/conciliacao.phpeadmin/modulos/eventos/conciliacao_eventim.php- filtro
getSugestoes()passou a aceitaraprovadoscomWHERE status = 'aprovado'. - a ordenação da aba aprovados passou a usar
ORDER BY COALESCE(data_decisao, data_captacao) DESC. - nova aba Aprovados com cards de revisão e botão
Reabrir para Revisãopara cada item.
Resultado funcional:
- Aprovação continua registrada normalmente.
- Itens aprovados podem ser devolvidos ao fluxo de conciliação com um clique, sem perder histórico.
Validações executadas:
php -l admin/modulos/eventos/action.phpphp -l admin/modulos/eventos/conciliacao.phpphp -l admin/modulos/eventos/conciliacao_eventim.php
BK-116 · Aba Aguardando Aprovação em Peças restrita a produtores reais
Data: 11 de Marco de 2026
Contexto operacional:
- A tela
admin/modulos/pecas/index.php?filtro=aprovacaoestava misturando dois fluxos diferentes: - peças reais enviadas por produtores (
pecas.editado_produtor = 1); - sugestões do bot vindas de
bot_pecas_sugestoes. - Isso inflava o badge de aprovação, gerava linhas
BOT-*dentro do módulo de Peças e confundia a curadoria de cadastro humano com o fluxo de conciliação automática do bot.
Ajustes aplicados:
admin/modulos/pecas/index.php- contador da aba
Aguardando Aprovaçãopassou a considerar apenaspecas.editado_produtor = 1. - bloco que buscava
bot_pecas_sugestoes WHERE status = 'pendente'foi removido da listagem. - comentário operacional adicionado para deixar explícito que sugestões do bot não pertencem a essa aba.
Resultado funcional:
Peças > Aguardando Aprovaçãoagora lista somente eventos enviados por produtores reais.- Sugestões do bot continuam restritas ao fluxo correto de Eventos/Conciliação.
Validacoes executadas:
php -l admin/modulos/pecas/index.php- verificacao estrutural do arquivo para confirmar remocao de:
- contador do bot na aba de aprovação;
- query em
bot_pecas_sugestoes; - linhas
BOT-*renderizadas na tabela de Peças
BK-115 · Painel WhatsApp com fallback de historico e contraste por status
Data: 11 de Marco de 2026
Contexto operacional:
- Depois do redesenho visual do BK-114, a area
Ultimos envioscontinuava sem utilidade pratica quandobot_whatsapp_statsestivesse vazia ou com poucos registros. - A verificacao real confirmou:
SELECT COUNT(*) FROM bot_whatsapp_statsretornava0no momento da analise inicial;whatsapp_mensagensseguia com historico recente e confiavel de envios processados;- o helper de WhatsApp precisava garantir compatibilidade imediata do schema para voltar a alimentar a telemetria dedicada.
Ajustes aplicados:
includes/whatsapp_helper.php_whatsapp_obter_schema_stats(...)deixou de apenas inspecionar e passou a autocorrigir o schema debot_whatsapp_statspara o formato esperado pelo helper atual:status ENUM('sucesso','erro','bloqueado')- coluna
mensagem - coluna
message_id - indice
idx_numero_data admin/modulos/bot/stats.php- a tela agora dispara a autocorrecao de schema logo na abertura, via helper.
Ultimos enviospassou a funcionar em tres modos:- telemetria pura;
- fallback total com
whatsapp_mensagens; - modo misto (
telemetria + fallback) quando a telemetria ainda esta retomando. - refinamento de UX adicional:
- chips de contagem por
sucesso,bloqueadoeerro; - origem da grade visivel (
telemetria,fallback totaloutelemetria + fallback); - destaque visual por linha para cada status;
- preview da mensagem nos sucessos;
- copy operacional explicando quando o fallback esta em uso.
Evidencia operacional confirmada em 11/03/2026:
- schema apos autocorrecao:
bot_whatsapp_statspassou a aceitarmensagem,message_idestatus='bloqueado'- teste controlado do helper:
- insert
sucessocommessage_idvoltou a gravar corretamente - registro de teste removido em seguida
- composicao final da grade:
telemetry=1merged=50fallback_added=49- topo da listagem mostrou primeiro o evento real
bloqueadoe, na sequencia, o historico recente vindo dewhatsapp_mensagens
Validacoes executadas:
php -l includes/whatsapp_helper.phpphp -l admin/modulos/bot/stats.php- validacao do JS inline equivalente via extracao do bloco
<script>+node --check - teste controlado do helper com persistencia e limpeza do registro de teste
- validacao da composicao
telemetria + fallbackcom consulta real ao banco
BK-118 · RCA WhatsApp: ACK pendente, restart agressivo e telemetria restaurada
Data: 11 de Marco de 2026
Contexto operacional:
- Incidente analisado a partir do envio da lista de compradores do evento
pecas.id=333/ sessão17592em11/03/2026. - O banco (
whatsapp_mensagens) mostrava 4 saídas processadas, mas apenas o número21999915554exibia a mensagem na conversa. - O painel de stats também estava cego: o helper chamava
_whatsapp_gravar_telemetria(), porém a tabela realbot_whatsapp_statsnão tinha o mesmo schema esperado pelo código.
Causa raiz confirmada:
includes/whatsapp_helper.php- após cada
HTTP 200do/send, o helper executava um restart preventivo imediato dornt-whatsapp. - no
journalctl -u rnt-whatsapp, os 4 envios do incidente apareceram em sequência, cada um seguido porSIGTERMe restart do serviço antes do próximo destinatário. bot/whatsapp/server.js- os
messageIdreais puderam ser consultados em/message-status, confirmando o estado atual: 5521979346876→ack=0(ACK_PENDING)5521996868181→ack=0(ACK_PENDING)5521999915554→ack=3(ACK_READ)5521967194720→ack=0(ACK_PENDING)cliente_id = NULLnão era causa de bloqueio:- o vínculo com cliente era usado apenas para histórico/CRM; o envio já havia acontecido antes dessa associação.
bot_whatsapp_stats- a tabela aceitava apenas
sucesso|erroe não possuía colunasmensagem/message_id, enquanto o helper tentava gravarbloqueadoemensagem, falhando silenciosamente.
Ajustes aplicados:
includes/whatsapp_helper.php- removido o restart preventivo após envio bem-sucedido para não encerrar a sessão antes do ciclo de ACK do WhatsApp.
- logging de sucesso passou a registrar
message_idretornado pelo microserviço. - telemetria passou a detectar o schema real de
bot_whatsapp_stats, normalizar status aceitos e inserir apenas colunas existentes. bot/whatsapp/server.js- adicionado cache leve de contexto por
messageIdpara correlacionar ACKs de mensagens enviadas. - novo log
message_ackcom rótulos legíveis (ACK_PENDING,ACK_SERVER,ACK_DEVICE,ACK_READ,ACK_PLAYED). - endpoint
POST /message-statuspassou a retornar tambémackLabel. setup_whatsapp_table.php- schema de referência atualizado para refletir a telemetria usada em produção (
bloqueado,mensagem,message_id, índice por número/data). - Banco de dados
bot_whatsapp_statsmigrada para incluir:status ENUM('sucesso','erro','bloqueado')mensagem TEXTmessage_id VARCHAR(120)- índice
idx_numero_data (numero, data_envio)
Validações executadas:
php -l includes/whatsapp_helper.phpnode --check bot/whatsapp/server.jsphp -l setup_whatsapp_table.phpsystemctl restart rnt-whatsapp- consulta real em
journalctl -u rnt-whatsapppara os 4 envios do incidente - chamadas reais ao endpoint local
POST /message-statuscom osmessageIddo incidente - teste controlado de
_whatsapp_gravar_telemetria()confirmando persistência desucessoebloqueadocommessage_id
BK-114 · Reorganizacao visual do painel WhatsApp (admin/modulos/bot/stats.php)
Data: 11 de Marco de 2026
Contexto operacional:
- A tela
admin/modulos/bot/stats.phpestava funcional, mas visualmente achatada e com baixa hierarquia de leitura para operacao diaria. - O layout antigo espalhava status do servico, acao da fila, cards numericos, grafico e tabelas sem um bloco principal de contexto.
- Como esta e a tela mais direta para ver saude do WhatsApp, fila pendente e historico de envio, a leitura precisava ficar mais imediata e mais proxima do padrao visual das telas recentes do admin.
Ajustes aplicados:
admin/modulos/bot/stats.php- novo hero operacional com status do servico, fila atual, protecao 24h, ultimo registro e acoes rapidas.
- cards de KPI refeitos com icones, texto de apoio e destaque para fila atual.
- grafico de envios por hora ganhou container proprio, refinamento visual e resumo de pico do dia.
- resumo operacional lateral adicionado com taxa de sucesso, retentativas, item mais antigo na fila e leitura do helper/status.
- tabelas de historico e fila foram reorganizadas em cards responsivos com estados vazios mais claros.
- ajuste funcional acoplado ao layout:
limparHistoricoEnvios(...)passou a aceitar o botao clicado diretamente, evitando dependencia doevent.currentTargetglobal. docs/BACKLOG.md- BK-114 registrado como melhoria de layout/operacao desta tela.
Validacoes executadas:
php -l admin/modulos/bot/stats.php- validacao do JS inline equivalente com extracao do bloco
<script>enode --checkapos substituir o placeholder PHP<?=$json_grafico?>por um array estatico
BK-113 · Restauracao de common-scripts.js em telas do admin
Data: 11 de Marco de 2026
Contexto operacional:
- Depois do fechamento do BK-111 e do BK-112, ficou evidente que a regressao do submenu lateral do admin nao estava isolada.
- Outras telas ainda encerravam a pagina sem
common-scripts.js, ou com um rodape JS paralelo ao stack oficial do painel, o que deixava o submenu lateral e comportamentos base do admin inconsistentes entre modulos. - A revisao foi aberta especificamente para as telas:
admin/modulos/facebook/configure.phpadmin/modulos/facebook/agendamento.phpadmin/modulos/campanhas/index.phpadmin/modulos/campanhas/redes_sociais.phpadmin/modulos/bot/stats.php
Ajustes aplicados:
admin/modulos/facebook/configure.php- bloco final do admin reforcado com
common-scripts.jsaposinc-js.php. admin/modulos/facebook/agendamento.phpcommon-scripts.jsrestaurado antes do JS especifico do FullCalendar e da agenda social.admin/modulos/bot/stats.phpcommon-scripts.jsrestaurado antes do bloco inline de acoes do dashboard WhatsApp.admin/modulos/campanhas/index.php- rodape JS paralelo por CDN removido do papel de stack principal.
- pagina voltou a usar
inc-js.php+common-scripts.js, mantendo o JS proprio da listagem logo em seguida. admin/modulos/campanhas/redes_sociais.php- rodape JS paralelo por CDN substituido pelo stack padrao do admin (
inc-js.php+common-scripts.js), sem remover o JS operacional da tela. docs/BACKLOG.md- BK-113 registrado como fechamento separado para rastrear a restauracao transversal do submenu.
Validacoes executadas:
php -l admin/modulos/facebook/configure.phpphp -l admin/modulos/facebook/agendamento.phpphp -l admin/modulos/campanhas/index.phpphp -l admin/modulos/campanhas/redes_sociais.phpphp -l admin/modulos/bot/stats.php- verificacao estrutural com busca por
inc-js.phpecommon-scripts.jsnas cinco telas ajustadas
BK-112 · Eventim via API publica + conciliacao admin versionada
Data: 11 de Marco de 2026
Contexto operacional:
- O backlog ainda tratava Eventim como incidente de bloqueio HTTP2 no HTML, com proposta aberta de stealth browser ou investigacao adicional.
- A evidencia real deste ambiente mostrou outro desenho operacional:
- a API publica
public-api.eventim.comresponde normalmente; - o host HTML
www.eventim.com.brcontinua expirando por timeout na VPS; - o scraper Eventim ja estava implementado para priorizar a API publica;
- a tela admin
conciliacao_eventim.phpe os testes CLI existiam no servidor, mas nao estavam versionados no Git.
Ajustes aplicados:
admin/modulos/eventos/conciliacao_eventim.php- tela de conciliacao Eventim passou a ficar versionada no repositorio.
- isso fecha a lacuna entre o Git e o codigo ja referenciado no admin por:
admin/modulos/eventos/index.phpadmin/modulos/eventos/conciliacao.phpadmin/modulos/eventos/action.phpadmin/modulos/eventos/conciliacao_eventim.php- bloco final do JS padrao do admin foi reforcado com
common-scripts.js, evitando regressao do submenu lateral. admin/modulos/eventos/conciliacao.php- o mesmo bloco
common-scripts.jsfoi restaurado para manter consistencia com a conciliacao principal do bot. bot/tests/test_eventim_api.php- versionado teste de diagnostico da API publica.
bot/tests/test_eventim_scraper.php- versionado teste integrado do
EventimScraper. bot/tests/test_eventim_site.php- versionado teste de timeout/challenge do host HTML principal.
bot/tests/test_eventim_validator.php- versionado teste isolado da regra de validacao para diferenciar teatro real de curso/oferta indevida.
bot/scrapers/eventim_scraper.php- comentario operacional adicionado para registrar que HTML fica apenas como contingencia/diagnostico e que a fonte primaria neste ambiente deve ser a API publica.
docs/BACKLOG.md- item aberto de Eventim foi encerrado como BK-112 com evidencia concreta.
Evidencia operacional confirmada em 11/03/2026:
php bot/tests/test_eventim_api.php- HTTP
200 49produtos/sessoes retornados para Rio de Janeirophp bot/tests/test_eventim_scraper.php5espetaculos unicos consolidados a partir da API publicaphp bot/tests/test_eventim_validator.php- caso
eventim_falso_negativovalidado como teatro real - caso
eventim_curso_realrejeitado com erroContém termo de exclusão: 'curso' php bot/tests/test_eventim_site.php- timeout em
ipv6edefaultparahttps://www.eventim.com.br/city/rio-de-janeiro-1672/ - conclusao: o HTML principal segue inadequado como fonte primaria neste ambiente
Validacoes executadas:
php -l admin/modulos/eventos/conciliacao_eventim.phpphp -l admin/modulos/eventos/conciliacao.phpphp -l bot/tests/test_eventim_api.phpphp -l bot/tests/test_eventim_scraper.phpphp -l bot/tests/test_eventim_site.phpphp -l bot/tests/test_eventim_validator.phpphp -l bot/scrapers/eventim_scraper.php- execucao real dos 4 testes CLI acima
BK-111 · Correcao arquitetural do bootstrap do admin PalcoFan
Data: 11 de Marco de 2026
Contexto operacional:
- A tela
admin/modulos/comentarios/index.phpvoltou a abrir sem CSS/JS porque estava subindo apenas com../../data/setup.php. - Nesse modo,
APP_ROOT,MODULO_SLUGeMODULO_ACTIVE_MENUcaiam nos fallbacks vazios desetup.php, quebrando os caminhos de asset do admin emhead.php. - O mesmo modulo executa queries
mysqli_*com$conexao, massetup.phpsozinho nao inicializa a conexao mysqli. - Havia um
admin/modulos/comentarios/bootstrap.phpsolto no worktree, porem nao versionado e ainda incompleto para o uso atual do modulo.
Ajustes aplicados:
admin/modulos/comentarios/bootstrap.php- arquivo passou a ser a entrada obrigatoria do modulo.
- comentario de regra adicionado para deixar explicito que este modulo nao pode voltar a usar
../../data/setup.phpdireto. - bootstrap endurecido com caminhos absolutos via
__DIR__, incluindoconfig/connect.phppara disponibilizar$conexaoas queriesmysqli_*. admin/modulos/comentarios/index.php- topo trocado de
require("../../data/setup.php");para obootstrap.phplocal. - includes compartilhados (
head.php,inc-topo.php,inc-menu.php,inc-footer.php) endurecidos com__DIR__+APP_ROOT. - bloco final de JS do admin restaurado com
inc-js.php+common-scripts.js, reativando o submenu lateral e o comportamento padrao do painel. - comentario operacional adicionado para registrar a dependencia de
APP_ROOT/MODULO_*e$conexao. docs/BACKLOG.md- BK-111 reaberto para rastrear a correcao arquitetural do modulo admin PalcoFan.
- BK-75 ajustado para nao seguir afirmando que a consolidacao do layout/bootstrapping do admin ja estava entregue.
docs/CHANGELOG.md- historico do BK-75 corrigido para refletir que a consolidacao do bootstrap/layout do modulo admin ficou como correcao posterior.
Validacoes executadas:
php -l admin/modulos/comentarios/bootstrap.phpphp -l admin/modulos/comentarios/index.php- renderizacao local via CLI com
HTTP_HOST=localhostpara confirmar: asset_ok;accordion_ok;common_ok;menu_ok.- comparacao estrutural com modulos estaveis do admin para confirmar a presenca do bloco
inc-js.php+common-scripts.jsno fechamento da pagina.
Aba Storie · estabilizacao do upload de video .mp4 no admin
Data: 11 de Marco de 2026
Contexto operacional:
- A nova aba
Storieestava listando assets corretamente, mas o upload de video grande continuava falhando no admin. - Evidencia real coletada no
debug.log: - request chegava como
multipart/form-data; CONTENT_LENGTHvinha preenchido (~37 MB);$_POSTe$_FILESchegavam vazios.- Causa raiz confirmada: override local em
admin/.user.inicompost_max_size = 16M, enquanto o restante do site aceitava uploads maiores.
Ajustes aplicados:
admin/.user.inipost_max_sizeelevado para500M.upload_max_filesizeelevado para500M.max_input_timeelevado para1800.admin/js/gestor-story.js- upload trocado para
XMLHttpRequestpuro comFormData(form). - adicionada barra de progresso real.
- mantido envio dedicado para evitar interferencia do jQuery legado do admin em multipart grande.
admin/inc-gestor.php- adicionada UI de progresso do upload na aba
Storie. admin/modulos/pecas/action.php- logging expandido com
CONTENT_TYPE,CONTENT_LENGTH,post_max_sizeeupload_max_filesizeefetivos. - tratamento explicito para multipart descartado antes de popular
$_POST/$_FILES. admin/modulos/pecas/index.php- cache-buster do JS atualizado para forcar carregamento da versao corrigida.
Evidencia operacional confirmada:
- Upload real da peca
1342concluido com sucesso em 11/03/2026 11:41. - Arquivo salvo em:
/arquivos/pecas/1342/video/lisa-lesa-e-louca-story.mp4- Evidencia de log:
ini_post_max=500M ini_upload_max=500Mfiles_keys=story_fileOK item=0 salvo=/www/wwwroot/rionoteatro.com.br/arquivos/pecas/1342/video/lisa-lesa-e-louca-story.mp4
Validacoes executadas:
php -l admin/modulos/pecas/action.phpphp -l admin/inc-gestor.phpphp -l admin/modulos/pecas/index.phpnode --check admin/js/gestor-story.js- confirmacao em disco via
ls -lah arquivos/pecas/1342/video
Fechamento operacional da branch vps/BK-109-story-video-priority · prioridade de video story por peca
Data: 11 de Marco de 2026
Contexto operacional:
- Em 11/03/2026, a fila
social_post_queueregistrou falhas reais de midia nos canais de feed: facebook_feed:Missing or invalid image fileinstagram_feed:Only photo or video can be accepted as media type.- Casos confirmados no momento da analise:
- peca
333(Bee Gees, Abba e Carpenters - Nos embalos de SABADO a noite) - peca
1341(E O Otimismo Que Faz O Besouro Voar!) - A peca
1341ja possuiamp4em/arquivos/pecas/1341/video, enquanto outras pecas afetadas dependiam apenas da capa.
Ajustes aplicados:
admin/cron/sync_facebook_events.php- adicionado resolvedor de capa principal da peca e normalizacao para JPG compativel com Meta em
uploads/social_meta_assets. - stories passaram a procurar somente video em
/arquivos/pecas/{id}/video. - fallback de story ajustado para:
- usar video quando existir;
- cair direto para a capa da peca quando nao houver video.
- overlay automatico de story continua sendo aplicado apenas em fluxo por imagem.
admin/classes/FacebookEventService.phpcreateInstagramMedia(...)passou a aceitarvideo_urlem stories.createFacebookStory(...)passou a tentarvideo_storiesprimeiro e, se necessario, cair paraphoto_stories.admin/inc-gestor.php- nova aba
Storieno gestor de pecas. admin/modulos/pecas/action.php- upload, listagem e exclusao de assets de story em
/arquivos/pecas/{id}/video. admin/js/gestor-story.js- fluxo AJAX da aba
Storiee deep-link para abrir o gestor da peca ja na aba correta. admin/modulos/facebook/agendamento.php- atalho operacional para abrir o gestor da peca diretamente no contexto de story.
admin/modulos/pecas/index.php- inclusao do JS do gestor de story.
Validacoes executadas:
php -l admin/classes/FacebookEventService.phpphp -l admin/cron/sync_facebook_events.phpphp -l admin/modulos/facebook/agendamento.phpphp -l admin/inc-gestor.phpphp -l admin/modulos/pecas/action.phpphp -l admin/modulos/pecas/index.php- parse do JS novo
admin/js/gestor-story.jsvianode -e - smoke HTTP apos push em
main: https://rionoteatro.com.br/->200https://rionoteatro.com.br/admin/->302https://rionoteatro.com.br/painel/modulos/eventos/->302
Git / deploy:
- Commit funcional do codigo:
8d62d4bf3(fix(social): prioriza video story por peca) - Merge em
mainrealizado na VPS comfast-forward. git push origin mainexecutado com sucesso, disparando o workflow de deploy definido em.github/workflows/deploy.yml.- Branch local
vps/BK-109-story-video-priorityremovida apos merge. - Consulta a
originconfirmou que nao existia branch remotavps/BK-109-story-video-prioritypara exclusao.
Observacao de governanca:
- O identificador
BK-109ja estava em uso no historico do projeto para outra entrega (Corrigir erro de renderizacao da aba WhatsApp no detalhe de cliente). - Para nao duplicar numeracao no backlog/changelog, este fechamento foi registrado como encerramento operacional da branch
vps/BK-109-story-video-priority.
BK-75 · Correcao documental do modulo PalcoFan + inclusao publica em peca.php e evento.php
Data: 10 de Marco de 2026
Contexto:
- O historico do BK-75 estava inconsistente com o que realmente foi entregue para o modulo de avaliacoes PalcoFan.
- A analise do codigo em producao confirmou que o nucleo do modulo existia, mas a inclusao publica estava efetivamente presente apenas em
teatro.php.
Ajustes aplicados:
peca.php- inclusao do bloco
includes/inc_palcofan.phpno frontend da pagina da peca. evento.php- inclusao do bloco
includes/inc_palcofan.phpno frontend da pagina do evento. admin/modulos/comentarios/index.php- modulo administrativo versionado e acessivel pelo submenu nativo
Peças > Comentários. docs/BACKLOG.md- registro consolidado do escopo real entregue pelo BK-75.
Escopo real confirmado do PalcoFan:
- Endpoint AJAX:
includes/ajax_palcofan.php - aceita apenas
POST, - exige cliente logado,
- valida
tipo_item, nota e comentario, - reenvia avaliacao atualizada para
pendente. - Moderacao admin:
admin/modulos/comentarios/index.php - filtros
pendente,aprovado,rejeitadoetodos, - acoes de aprovar, rejeitar e excluir.
- Bloco publico:
includes/inc_palcofan.php - resumo de media,
- comentarios aprovados,
- formulario para cliente logado.
- SEO/Schema:
meta-analytics.php aggregateRatingdinamico para pecas com base emtb_avaliacoes.
Observacoes importantes:
- A tabela
tb_avaliacoesexiste em producao, com indices por item/status, mas a restricao de nota1..5esta implementada no PHP e nao comoCHECKno schema MySQL atual. - O link de contexto do item avaliado foi ajustado para tratar
tipo_item='evento'pelo fluxo real da tabelapecas, com fallback legado paraeventos. - A consolidacao do bootstrap/layout padrao do admin para
admin/modulos/comentarios/nao estava de fato versionada neste momento; essa correcao arquitetural ficou registrada separadamente no BK-111. - Este registro nao apaga o historico anterior do BK-75; ele corrige documentalmente o escopo efetivamente identificado no codigo/ambiente.
BK-108 · Reordenacao de CTA de compra e padronizacao AdSense no evento.php
Data: 06 de Marco de 2026
Objetivo operacional:
- Melhorar a experiência do usuário (UX) e o fluxo de conversão em eventos de produtores externos/bot, movendo o botão de compra para após a seção de localização.
Ajustes aplicados:
evento.php:- Botão de compra externa (CTA) removido do topo da página.
- Removida lógica condicional baseada na origem do evento.
- Inclusão de novo bloco de CTA fixo posicionado imediatamente após a seção de LOCAL.
- Padronização da chamada
renderAdsenseResponsivoPorDispositivo()entre as seções: - Após Sinopse.
- Após Ficha Técnica.
- Após Botão de Compra/Local.
- Após Dúvidas.
- Resultado:
- Layout mais limpo e informativo antes da decisão de compra.
- Melhor distribuição de anúncios ao longo da página.
BK-96 · Migracao de enderecos e bairros estruturados dos teatros
Data: 06 de Marco de 2026
Objetivo operacional:
- Estruturar os dados geográficos da tabela
teatros, movendo informações misturadas no campolocalpara os campos dedicadosenderecoebairro.
Ajustes aplicados:
- Criacao do script de migracao:
admin/cron/migrar_enderecos_teatros.php: - Extração inteligente de endereços de 118 registros via regex (Rua, Av, Pr, Estr).
- Limpeza automatica de HTML,
iframesdo Google Maps e avisos redundantes do campolocal. - Criacao do script de refinamento:
admin/cron/extrair_bairros_do_endereco.php: - Mapeamento de 86 bairros comuns e específicos do Rio de Janeiro e Niterói.
- Lógica de detecção por nome do teatro e sufixos no endereço.
- Resultado Final:
- 148 teatros ativos com
enderecoebairropreenchidos (100% da base ativa). - Campo
localpreservado apenas com informações complementares (capacidade, etc). - Estrutura pronta para integração com mapas dinâmicos e SEO local.
BK-109 · Corrigir erro de renderizacao da aba WhatsApp no detalhe de cliente
Data: 06 de Marco de 2026
Objetivo operacional:
- Corrigir falha crítica no carregamento do histórico da aba
#whatsapp-tabpara clientes com histórico de conversa.
Ajustes aplicados:
admin/modulos/clientes/detalhe.php:- corrigido reset de cursor de resultado de
$obj_sql->data_seek($q_wa, 0)paramysql_data_seek($q_wa, 0). - mantida a lógica de fallback de busca por
cliente_id,celularetelefone. - Resultado observado:
- links como
...detalhe.php?id=50877#whatsapp-tabe...detalhe.php?id=775voltam a renderizar corretamente.
BK-94 · Validação E2E de quebra de linha e fila WhatsApp
Data: 06 de Marco de 2026
Objetivo operacional:
- Validar que o fluxo de envio via fila:
- aceita mensagens com quebra de linha,
- envia com payload JSON seguro,
- remove o item processado (
fila zerada) após sucesso.
Ajustes aplicados:
tests/bk94-whatsapp-e2e.sh(novo)- verifica endpoints de detalhe de cliente (IDs 50877 e 775).
- executa validação offline de fila com mock de
/statuse/send. - valida payload com
linha 1\nlinha 2e remoção do JSON da fila no final.
Validações executadas:
bash tests/bk94-whatsapp-e2e.sh- Resultado esperado: envio com
\\naceito e fila de teste finalizada sem arquivos remanescentes.
BK-107 · Gemini agora + arquivos por peca no modulo de videos
Data: 06 de Marco de 2026
Objetivo operacional:
- Tirar dependencia de
uploads/video_examples, centralizar tudo em/arquivos/pecas/{id}/videoe permitir disparo direto do gerador Gemini por job.
Ajustes aplicados:
admin/modulos/campanhas/redes_sociais.php- fallback operacional para quota da API:
- novo botao por job: "Gerar Prompt (Gemini App)",
- gera prompt manual completo (tom de voz + assets + link da peca + formato/duracao) para colar no app Gemini com upload manual dos arquivos,
- bloco copiavel na tela com botao "Copiar prompt".
- prompts manuais de video refinados para qualidade criativa:
- duracao obrigatoria entre 25 e 30 segundos (evita retorno curto de 8s),
- foco em transicoes e audio final,
- regra explicita para nao deformar textos/imagens e limitar animacao de texto ao nome da peca + CTA curto.
- novo endpoint AJAX interno (
ajax=video_piece_files) para listar dinamicamente os arquivos da pasta da peca selecionada. - painel lateral alterado de "Referencias em uploads/video_examples" para "Arquivos do Video (da peca selecionada)".
- painel "Arquivos do Video" ganhou upload rapido direto para a pasta da peca selecionada.
- seletor de peca passou a manter selecao apos postback e atualizar a listagem da pasta automaticamente.
- tabela "Jobs de Video Recentes" agora filtra pela mesma peca selecionada no topo (com botao para limpar filtro).
- card do job reforcado com bloco explicito para adicionar mais imagens/videos sem recriar job.
- lista de assets no card ganhou exclusao individual com botao
Xpor arquivo (remove do job e tenta remover do disco com seguranca de referencia). - adicionado botao por job: "Gerar com Gemini agora".
- adicionada opcao de excluir job (com escolha de remover tambem os arquivos daquele job).
- fluxo de formato no job:
- criacao/edicao com escolha entre
Story(alvo 30s) eReels(alvo 60s), - campos persistidos no job (
formato,duracao_alvo_sec) com migracao automatica para bases antigas. - novo fluxo
action=video_generate_now: - consulta endpoint de video por variavel de ambiente (
CEREBRO_VIDEO_ENDPOINT/RNT_AI_VIDEO_ENDPOINT), - fallback direto por API Gemini foi removido em 2026-04-29 por politica operacional: sempre CLI/servico interno, nunca chave direta,
- leitura de env ampliada para fallback central da VPS (
/root/cerebro/.enve/root/.env) para evitar duplicacao de segredos por projeto, - ajuste de robustez para
open_basedir(leitura de paths externos com checagem silenciosa, sem warning em tela), - envia payload com job + peca + assets,
- tenta salvar retorno em
/arquivos/pecas/{id}/video(path local, download por URL ou base64), - atualiza
video_final_path,transcricao_audio,statuseassets_json. - aplica regra operacional de duracao para Story: tenta forcar saida final em 30s com ajuste automatico quando vier menor.
- tratamento de erro normalizado no fallback direto/endpoint para nunca retornar mensagem generica
Array(agora mostra texto real da API e HTTP quando existir). - payload direto do Gemini ajustado para compatibilidade com o modelo atual (
durationSecondsnumerico e remocao de campos nao suportados). - chamada direta agora usa duracao por formato do job (
Story=30s,Reels=60s) com fallback tecnico para 8s apenas quando o modelo/API recusar o parametro. - comentarios de regra mantidos para evitar regressao de caminho e de provedor.
- Operacao de arquivos (VPS):
- conteudo de
uploads/video_examplesfoi transferido para/arquivos/pecas/1341/video.
BK-106 · Ajustes de operacao (retencao de video + presets de voz)
Data: 06 de Marco de 2026
Objetivo operacional:
- Evitar acumo de lixo de video na VPS e acelerar a criacao de roteiro/voz com presets reutilizaveis.
Ajustes aplicados:
admin/cron/cleanup_old_pecas_images.php- limpeza passou a considerar tambem a subpasta
videopor padrao. - regra de retencao mantida em
--days=7(1 semana apos fim da temporada). - comentarios de protecao adicionados (
REGRA DE NEGOCIO (NAO REMOVER)). admin/modulos/campanhas/redes_sociais.php- adicionada tabela de presets de voz (
social_video_voice_presets) com seed inicial: - preset comercial padrao,
- preset
Sambarilove (Malandro Carioca). - formulario de criacao de video ganhou:
- seletor de preset salvo,
- textarea de tom de voz (texto longo),
- painel para salvar/atualizar novos presets.
- compatibilidade de schema no job de video:
tom_vozajustado paraTEXT(bases antigas comVARCHAR(180)sao migradas automaticamente).- correcao operacional de upload/job:
- criacao de novo job passou a reaproveitar rascunho existente da mesma peca por padrao (evita duplicacao acidental de jobs),
- adicionado bloco
Anexar assets/video ao jobno card para complementar uploads sem recriar job, - feedback de upload passou a mostrar
Arquivos recebidos no POST, - suporte de assets ampliado para extensoes
heic/heif. - mensagem de tela reforcada para evitar ambiguidade:
- etapa semimanual atual organiza insumos e ainda nao renderiza video automaticamente.
BK-106 · MVP semimanual de Video IA na Central de Redes Sociais
Data: 06 de Marco de 2026
Objetivo operacional:
- Viabilizar criacao de videos por fluxo semimanual (sem cron) diretamente no admin, usando Gemini como provedor padrao na VPS.
Ajustes aplicados:
admin/modulos/campanhas/redes_sociais.php- adicionada aba
Videos IA (Gemini)na central. - criado fluxo de job semimanual com:
- selecao de peca elegivel (somente venda online/Admin),
- upload de assets (imagem/video/audio),
- campo de roteiro base,
- campo de transcricao do audio editavel.
- criado controle de status do job (
rascunho,pronto_revisao,aprovado,publicado,arquivado) com edicao posterior. - criado anexo opcional de video final no proprio job.
- tabela
social_video_jobspassa a ser garantida viaCREATE TABLE IF NOT EXISTS(padrao do modulo). - adicionadas regras comentadas no codigo (
NAO REMOVER) para evitar regressao: - provedor fixo
gemininesse fluxo, - filtro de pecas somente catalogo online/Admin.
- listagem de referencia dos arquivos em
uploads/video_examplesdentro da propria aba.
BK-105/BK-106 · Kickoff de automacao assistida Story + pipeline de video IA
Data: 06 de Marco de 2026
Objetivo operacional:
- Formalizar os proximos passos para:
- automacao assistida de Story com sticker/link (fluxo de risco controlado),
- pipeline de video IA para divulgacao de pecas/eventos (Gemini como motor principal).
Ajustes aplicados:
docs/BACKLOG.md- BK-105 e BK-106 foram detalhados com:
- responsavel inicial,
- tarefas executaveis,
- criterios de operacao/fallback.
docs/documentacao_tecnica/campanha_track/VIDEO_IA_PIPELINE_NOTAS_2026-03.md(novo)- documento tecnico de referencia para BK-106 com:
- contrato de entrada (MVP),
- etapas do pipeline,
- modelo de fila de render,
- regras de qualidade e mitigacao de risco.
BK-99 · Fila social recorrente (social_post_queue) + agenda por fila
Data: 05 de Marco de 2026
Objetivo operacional:
- Encerrar dependencia do ciclo fixo de 21 dias no cron social.
- Permitir programacao recorrente robusta (varios agendamentos por peca/semana) sem duplicar postagens.
- Tornar a tela de agenda aderente ao que realmente esta na fila.
Ajustes aplicados:
admin/cron/sync_facebook_events.php- criada/garantida tabela
social_post_queuevia bootstrap automatico no cron (CREATE TABLE IF NOT EXISTS). - hardening anti-duplicacao:
- garantia de
UNIQUEemdedupe_key(com limpeza defensiva de legado antes de criar o indice). - removido bloco legado de "evergreen 21 dias".
- adicionado planner por sessoes futuras:
- janela configuravel (
SYNC_SOCIAL_PLANNER_DAYS, default 14), - limite por semana/peca (
SYNC_SOCIAL_MAX_FEED_PER_WEEK, default 3), - deduplicacao por
dedupe_key(canal:peca:session_date). - separacao de modos no mesmo cron:
mode=planner(planeja fila, sem enviar),mode=dispatcher(envia fila/gatilhos),mode=full(padrao; planner + dispatcher).- feed FB/IG passou a usar itens da fila:
- FB: envia imediato ou com
scheduled_publish_timepara futuro (statusscheduledna fila). - IG: processa itens due (
scheduled_for <= NOW()), mantendo os futuros emqueued. - reset (
?reset=1) agora limpa tambem asocial_post_queue. - comentarios
REGRA (NAO REMOVER)adicionados para evitar retorno ao fluxo antigo. - ajuste adicional: fallback silencioso de fonte TTF com
@file_existspara evitar warning deopen_basedir.
admin/modulos/facebook/agendamento-events.php- agenda passou a ler
social_post_queuecomo fonte principal. - exibe um evento por item de fila (canal + status + post_id/erro).
- imagem do modal passou a usar pasta
large(corrige falha de thumb ausente em alguns cards). - payload dos eventos agora inclui
icon_classetooltip_htmlpara hover enriquecido no calendario. - fallback legado mantido para
pecas.facebook_scheduled_atse a fila nao existir/estiver vazia.
admin/modulos/facebook/agendamento.php- texto da tela atualizado para explicitar que a agenda usa a fila social.
- adicionados filtros de
statusecanalno calendario (com refetch no endpoint). - calendario localizado em portugues (meses/dias/botoes).
- novos recursos de UX:
- icone por canal no card do calendario (FB/IG),
- tooltip com resumo da postagem no hover.
- criacao manual de postagem diretamente na agenda (modal "Nova postagem").
- duplicacao de postagem direto do modal de detalhes (botao "Duplicar agendamento" com pre-preenchimento).
- comentario de protecao inserido no HTML (
NAO REMOVER) para evitar regressao.
admin/modulos/facebook/agendamento-create.php- novo endpoint para inserir/agendar itens manuais na
social_post_queue(feed e story).
admin/cron/sync_facebook_events.php- dispatcher passou a processar tambem itens manuais de
facebook_storyeinstagram_storyda fila (due por horario), alem dos gatilhos automáticos.
sql_updates/create_social_post_queue.sql- script versionado para criacao da fila social em ambientes externos.
Atualizacao complementar (05/03/2026 - noite):
admin/classes/FacebookEventService.php- adicionados metodos de Threads API:
getThreadsUserInfo()createThreadsMedia()publishThreadsMedia()- suporte por variaveis
THREADS_ACCESS_TOKENeTHREADS_USER_ID. admin/cron/sync_facebook_events.php- planner passou a incluir canal
threads_feedquando Threads estiver configurado. - dispatcher passou a processar
threads_feedda fila. - REGRA COMENTADA NO CODIGO (NAO REMOVER): container do Threads expira em ~24h, portanto o container eh criado/publicado apenas perto do horario due.
- resumo final de execucao passou a incluir
Threads Feed ok/erro. admin/modulos/facebook/agendamento.php- filtros e modal manual com opcao
Threads Feed. - novo fluxo de Story notificado/manual na agenda:
- status
notified, - botoes operacionais: salvar preset, aplicar preset, clonar em massa e marcar publicado manual.
admin/modulos/facebook/agendamento-events.php- canal
threads_feedadicionado no endpoint de agenda (label + icone). - status
notifiedincluido no payload/filtros. admin/modulos/facebook/agendamento-create.php- endpoint manual aceita
threads_feed. - modo de publicacao (
auto/notified) para stories. admin/modulos/facebook/agendamento-preset-save.php- salva preset por peca/canal de story.
admin/modulos/facebook/agendamento-preset-apply.php- aplica preset para gerar agenda semanal em lote.
admin/modulos/facebook/agendamento-bulk-clone.php- clona agendamento base em massa (N semanas).
admin/modulos/facebook/agendamento-update-status.php- marca item notificado como publicado manualmente (com post_id opcional).
docs/documentacao_tecnica/campanha_track/THREADS_E_STORY_LINKS_NOTAS_2026-03.md- documentacao operacional das limitacoes de Story link sticker (API vs notificado/manual) e regra de 24h do Threads.
docs/BACKLOG.md- adicionados BK-100, BK-101, BK-102 para inteligencia de horarios/posts e complemento de tracking via GTM.
Operacao aplicada na VPS (05/03/2026 18:51 - America/Sao_Paulo):
- cron legado horario do
sync_facebook_events.phpfoi substituido por: 0 6 *-> planner (mode=planner)/5 *-> dispatcher (mode=dispatcher)- wrappers criados em
/www/server/cron/: rnt_sync_facebook_plannerrnt_sync_facebook_dispatcher
Atualizacao complementar (05/03/2026 - noite, operacao social + tracking/admin):
admin/modulos/facebook/agendamento.php- REGRA COMENTADA (NAO REMOVER): modal "Nova Postagem" passou a listar somente pecas elegiveis de venda online com contexto/produtor Admin.
- select de peca passou a exibir nome do produtor junto ao titulo.
- campo
Data da sessao (opcional)recebeu texto explicando uso em fila/gatilhos/analise por sessao. admin/modulos/facebook/agendamento-create.php- validacao server-side da mesma regra de elegibilidade (evita bypass via POST manual).
admin/inc-menu.php- submenu legado
Feed Facebook Adsfoi roteado para central de redes sociais no modulo Campanhas. - comentario operacional adicionado para evitar regressao de menu/link.
admin/modulos/campanhas/redes_sociais.php(novo)- central operacional de redes sociais com botoes para:
sync_facebook_events.php(planner/dispatcher/full/reset),- agenda social,
- feed catalogo CSV (
feed_facebook_catalogo.php). - resumo da
social_post_queuepor status/canal. - lista de stories em operacao (queued/notified/error).
- acao manual para adiantar stories notificados para "agora" (uso operacional com sticker/link manual).
admin/modulos/campanhas/index.php- novo atalho "Redes Sociais" no cabecalho do modulo.
admin/modulos/dashboard/tracking.php- correcao de exibicao de horario para
America/Sao_Pauloa partir decliente_tracking.data_hora(UTC). - tabela de eventos recentes ganhou coluna de links operacionais:
- origem do acesso,
- pagina canonica do evento/peca,
- pedido relacionado (quando vinculavel por cliente+peca).
view_itemebegin_checkoutagora mostram nota de contexto de valor para evitar leitura como compra efetivada.docs/BACKLOG.md- adicionado item
BK-103para integracao TikTok no orquestrador social.
Validacao operacional executada (05/03/2026 20:24 BRT):
- Execucao manual CLI:
php admin/cron/sync_facebook_events.php mode=dispatcher- cron executou em modo dispatcher e confirmou processamento de fila/gatilhos sem erro de acesso.
- observacao: stories
manual_notifiedso mudam paranotifiedquandoscheduled_for <= NOW().
Atualizacao complementar (05/03/2026 - catalogo Meta + Facebook Events):
atualizar_feed.php- feed
pecas.xmlpassou a refletir automaticamente pecas de venda online do site: status='A'(id_produtor IS NULL OR parceria_online=1)- exclui
Teste - somente sessoes futuras com
sec_valor > 0(remove vencidas automaticamente). - saida em CLI ficou enxuta (
OK pecas.xml atualizado | itens=N) para evitar log gigante no cron. admin/cron/feed_facebook_catalogo.php- corrigida query (remocao de coluna inexistente
p.foto_homeque deixava CSV sem linhas). - mesmo filtro de elegibilidade do catalogo online.
- ajuste de preco:
priceusa valor cheio quando existir;sale_priceusa valor final de venda (sec_valor) quando menor que o cheio.admin/classes/FacebookEventService.phpupdateEvent()ampliado para aceitarstart_time,end_time,locationecover_url.admin/cron/sync_facebook_page_events.php(novo)- cron para criar/atualizar/remover eventos de pagina FB por peca elegivel.
- inclui
dry_run=1para validacao sem publicar. - cria coluna
pecas.facebook_page_event_idautomaticamente quando ausente. admin/modulos/campanhas/redes_sociais.php- adicionados botoes operacionais:
FB Events (dry-run)FB Events (real).- Operacao de cron (VPS):
- feed
pecas.xmlpassou de diario para/30 *(automatico mais rapido para catalogo). - evidencia:
/www/server/cron/f1fb970e7ca0b68f38510abb76a86aa0executando com retornoOK pecas.xml atualizado | itens=3. - Diagnostico de plataforma (ambiente atual):
- leitura de eventos da pagina funciona (
GET /{page_id}/events). - criacao via API falha (
POST /{page_id}/events) comGraphMethodException code 100 / subcode 33. - item aberto no backlog como
BK-104para desbloqueio definitivo.
BK-98 · Hardening do webhook WhatsApp para CRM externo (LegalizaRJ)
Data: 04 de Marco de 2026
Ajustes aplicados no helper (bot/whatsapp/server.js):
- Webhook passou a aceitar e enviar apenas eventos de chat privado valido (
@c.usou@s.whatsapp.net). - Eventos de grupo/canal/newsletter/ID nao telefonico passam a ser ignorados.
- Inclusao de assinatura HMAC SHA-256 no webhook:
X-Webhook-TimestampX-Webhook-Signature(sha256=<hash>)- Nova variavel obrigatoria no service:
WPP_WEBHOOK_SECRET
Objetivo de seguranca:
- Evitar ingestao de mensagens indevidas no CRM externo.
- Reduzir risco de spoof de webhook com payload sem assinatura valida.
Operacao:
- Service reiniciado com novas variaveis:
WPP_WEBHOOK_TOKEN(rotacionado)WPP_WEBHOOK_SECRET(novo)
BK-91 · Token Facebook/IG bloqueado por instabilidade externa (Meta/JSSDK)
Data: 03 de Marco de 2026
Diagnostico executado:
sync_facebook_events.php?reset=1:Encontradas 3 pecas elegiveis para sincronizacao.- erro de token:
Session has expired on Monday, 02-Mar-26 20:00:00 PST. php admin/cron/monitor_story_roi.php:facebook_token_health=errorexpires_at=2026-03-03 01:00:00instagram_binding_live=warnpor token expirado.- Fluxo do painel em
admin/modulos/facebook/configure.php: - tentativa de
Obter Token Automaticamentebloqueada com mensagem de plataforma: A opção JSSDK não está ativada.
Conclusao operacional:
- Bloqueio externo confirmado (Meta/Facebook instavel + dependencia de OAuth/JSSDK).
- BK-91 permanece aberto e pausado ate estabilizacao do fluxo de login/token no app Meta.
Retomada planejada (quando estabilizar):
- Renovar token da pagina no painel.
- Revalidar:
php admin/cron/monitor_story_roi.phpcom statusok;https://rionoteatro.com.br/admin/cron/sync_facebook_events.php?reset=1sem erro de token.
BK-97 · Governanca do pecas.json (runtime) + filtro da peca Teste no cron social
Data: 03 de Marco de 2026
Contexto validado:
- O endpoint
sync_facebook_events.php?reset=1nao regeneraapi/eventos/pecas.json; ele apenas limpa IDs sociais na tabelapecas. - Consulta real de elegibilidade retornava 4 pecas, incluindo homologacao:
1343 | Teste | parceria=1.
Ajustes aplicados:
admin/cron/sync_facebook_events.php- selecao de pecas elegiveis passou a excluir
nome = 'Teste'. - Governanca de artefato gerado (
api/eventos/pecas.json): - removido do versionamento Git (
git rm --cached); - adicionado no
.gitignore; - criado
api/eventos/pecas.example.jsoncomo base versionada. api/eventos/README.md- documentacao atualizada para diferenciar
pecas.example.json(versionado) depecas.json(runtime).
Token Facebook/IG (evidencia operacional):
- Execucao em 03/03/2026 18:08:10 (PST) retornou:
Session has expired on Monday, 02-Mar-26 20:00:00 PST.- Backlog BK-91 atualizado para exigir renovacao e revalidacao do reset.
BK-86 · SQL/Collation do Robo ROI corrigidos + cron id=19 reativado
Data: 03 de Marco de 2026
Problemas corrigidos:
Truncated incorrect DOUBLE value: 'pago'emsp_calcular_roi_campanhas.Illegal mix of collations for operation 'concat'emsp_gerar_alertas_roi.- Retorno inconsistente
ROI calculado para -1 registros.
Ajustes aplicados:
- Criado script versionado:
SQL/bk86_fix_roi_procedures.sql. - Recriadas procedures:
sp_calcular_roi_campanhas- ajuste de status de pagamento para
p.status_transacao IN (3, 4); - cast/sanitizacao de
pedidos.valor(VARCHAR->DECIMAL) em todos os somatorios; - contagem explicita de linhas inseridas para retorno correto do total.
sp_gerar_alertas_roi- cast robusto de thresholds em
robot_config.valor; - padronizacao de collation em
CONCAT/comparacoes comutf8mb4_unicode_ci.
Validacoes executadas:
CALL sp_calcular_roi_campanhas(CURDATE() - INTERVAL 7 DAY, CURDATE())- resultado:
ROI calculado para 3 registros. CALL sp_gerar_alertas_roi()- resultado:
alertas_gerados = 0. php admin/cron/analisar_roi_campanhas.php- execucao completa sem erros SQL/collation.
Operacao / Cron:
- Cron aaPanel id=19 (
Robo ROI Rio no Teatro) reativado. - Evidencia operacional: wrapper do cron executado manualmente com status final de sucesso.
BK-85 · Alerta WhatsApp para erro critico via debug_log (debounce 30min)
Data: 03 de Marco de 2026
Ajustes aplicados:
admin/logs/debug_helper.phpdebug_log()passou a avaliar erros criticos e acionar notificacao para admin via WhatsApp.- Adicionadas funcoes internas para:
- detectar gatilhos de erro (
ERRO,FATAL,EXCEPTION,CRITICO); - evitar loop de alerta para modulo
WHATSAPP/DEBUG_LOG_ALERT; - aplicar debounce global de 30 minutos (
admin/logs/debug_whatsapp_alert_last_ts.lock); - enviar mensagem resumida com link direto do painel de Debug Log.
Comportamento esperado:
- Ao registrar erro critico com
debug_log('MODULO', '...ERRO...'), o sistema tenta enviar: ALERTA ERRO no site: [MODULO] ...Debug Log: https://www.rionoteatro.com.br/admin/modulos/debug_log/- Novos alertas ficam bloqueados por 30 minutos para evitar flood.
Validacoes executadas:
php -l admin/logs/debug_helper.phpsem erros de sintaxe.- Revisao de diff para confirmar anti-loop, debounce e integracao via
enviar_whatsapp_admin().
BK-83 · Fila WhatsApp: correção de JSON com quebra de linha + higiene de cache
Data: 03 de Março de 2026
Causa raiz confirmada (pendência travada na fila mesmo com WhatsApp online):
- O
bot/whatsapp/healthcheck.shmontava o body JSON do/sendpor interpolação de string. - Mensagens com quebra de linha (
\n) geravam payload inválido e a API retornava: JSON invalido: Bad control character in string literal ...- Resultado: item permanecia na fila com tentativas incrementando.
Ajustes aplicados:
bot/whatsapp/healthcheck.sh- payload do
/sendpassou a ser gerado comjq -cn(escaping seguro de caracteres especiais/quebras de linha). .gitignore- adicionada regra
bot/whatsapp/.wwebjs_cache/(cache runtime do whatsapp-web.js fora do versionamento).
Validações executadas:
bash -n bot/whatsapp/healthcheck.shsem erros.- Execução manual do
healthcheck.shcom serviço conectado: - envio da mensagem pendente concluído com sucesso.
- pasta
bot/whatsapp/queue/ficou vazia após processamento.
BK-82 · QR Code web no admin para reconexao WhatsApp + correcao JSON
Data: 03 de Março de 2026
Causa raiz confirmada (nao exibia QR no navegador):
- O backend Node mostrava QR apenas no terminal (
journalctl) e nao expunha endpoint web para o painel. - O endpoint de restart do admin podia retornar warnings PHP (
open_basediremfile_exists('/bin/bash')), quebrando JSON do AJAX e impedindo o fluxo de exibir QR.
Ajustes aplicados:
bot/whatsapp/server.js- novo endpoint
GET /qrcomqr_image_data_url(PNG base64),qr_pendingeqr_updated_at. - cache do ultimo QR em memoria para entrega ao painel admin.
bot/whatsapp/package.json- adicionada dependencia
qrcode. admin/whatsapp_qr.php(novo)- endpoint autenticado para o admin consultar status + QR do microservico.
admin/index.php- bloco visual para exibir QR quando offline.
- polling de
whatsapp_qr.phpa cada 8s comcache: false. - fluxo do botao reiniciar trata
requires_qrsem reload forcado. admin/whatsapp_restart.php- resposta JSON padronizada com
requires_qreqr_pending. - blindagem de output (
ob_clean) para evitar lixo antes do JSON. includes/whatsapp_helper.php_whatsapp_tentar_restart()passou a usarbashvia PATH (remove warnings deopen_basedirao testar/bin/bash).bot/whatsapp/README.md- documentado endpoint
GET /qr.
Validações executadas:
node --check bot/whatsapp/server.jssem erros.php -lemadmin/index.php,admin/whatsapp_restart.php,admin/whatsapp_qr.php,includes/whatsapp_helper.php.- Teste direto da API local:
GET /status=>disconnectedcomqr_pending=true.GET /qr=>qr_image_data_urlpreenchido.- Teste CLI do endpoint admin:
REQUEST_METHOD=POST HTTP_HOST=localhost php admin/whatsapp_restart.phpretornando JSON valido comrequires_qr=true.
BK-80 · RCA WhatsApp Offline + auto-recuperacao systemd
Data: 03 de Março de 2026
Causa raiz confirmada (incidente):
healthcheck.shtentava reiniciar via PM2 (pm2 restart whatsapp-bot), mas o bot roda via systemd (rnt-whatsapp).cleanup.shlimpava apenas parte dos locks e ainda faziachownparawww-data, divergente do user do service (www), causando falhas recorrentes de lock/sessao.- Timeout curto no AJAX do painel (
30s) gerava falso erro de comunicacao em reinicios mais lentos.
Ajustes aplicados:
bot/whatsapp/healthcheck.sh- troca de PM2 para
systemctlcom fallbacksudo -n. - reinicio apenas quando API local esta indisponivel;
disconnectednao força restart. - lock file com
trappara limpeza garantida. bot/whatsapp/cleanup.sh- limpeza ampliada para
auth/session(Singleton+DevToolsActivePort). - kill de processos Chrome/Chromium relacionados ao userDataDir do bot.
- ownership alinhado dinamicamente ao usuario/grupo do service.
bot/whatsapp/restart.sh- restart via
systemctlcom verificacao em loop. - rotacao simples de
restart.logpara evitar crescimento infinito. includes/whatsapp_helper.php_whatsapp_tentar_restart()passou a aguardar ate 45s por reconexao.admin/index.php- timeout AJAX do botao de restart aumentado para
90s. bot/whatsapp/server.js- removido
webVersionCacheremoto quebrado (URL 404). headlessalterado paratrue(estabilidade com Chrome atual).client.initialize()comcatchexplicito eexit(1)para recovery por systemd.- handler de
SIGTERMpara encerramento limpo (elimina timeout de stop). /etc/systemd/system/rnt-whatsapp.service- adicionado
PermissionsStartOnly=truepara permitirExecStartPrecom privilegio de limpeza.
Validações executadas:
bash -n:healthcheck.sh,cleanup.sh,restart.sh.node --check:bot/whatsapp/server.js.php -l:includes/whatsapp_helper.php,admin/index.php.systemctl restart rnt-whatsappconcluindo sem timeout (elapsed=1s).curl http://127.0.0.1:3033/statusrespondendo com JSON e serviceactive.healthcheck.shmanual nao forca restart quando status estadisconnected.
BK-79 · Teatros canônicos sem /teatro + mapa e slugs normalizados
Data: 03 de Março de 2026
Ajustes:
- Teatros passaram a usar URL canônica pública em
https://rionoteatro.com.br/<slug_do_teatro>. - Rotas legadas
/teatro/<slug|id>agora redirecionam com 301 para o slug direto. - Página de teatro (
teatro.php) passou a gerar/persistir slug automaticamente quando ausente (incluindo casos antigos como/teatro/118). teatros.php,lista-teatros.phpe card de “outros teatros” foram ajustados para links diretos sem/teatro/.- Roteamento de slug direto foi ampliado em
peca.php: quando o slug não é peça, mas é teatro, a página do teatro é exibida. - Mapa em
teatro.phpdeixou de usarmaps/embed/v1/place?key=...e passou a usar o mesmo padrão dos eventos (google.com/maps?output=embed&q=...), eliminando erro de API key inválida. - Geração de slug em eventos/teatros foi reforçada no server-side (admin + painel) para substituir acentuação corretamente (
ç -> c,ê -> e, etc.) mesmo com slug digitado manualmente.
Arquivos modificados:
teatro.phpteatros.phplista-teatros.phppeca.phpadmin/modulos/teatros/action.phpadmin/modulos/eventos/action.phppainel/modulos/eventos/action.php
Validações executadas:
php -lem todos os arquivos PHP alterados: sem erros de sintaxe.- HTTP:
/teatro/118retornando301para/acaso-cultural. - HTTP:
/teatro/grupo-teatros-da-barraretornando301para/grupo-teatros-da-barra. - HTTP:
/grupo-teatros-da-barraretornando200. - Conferência de HTML: sem links públicos restantes com
/teatro/emteatros.phpelista-teatros.php.
BK-78 · Canonical sem /evento/ em todo fluxo público
Data: 03 de Março de 2026
Ajustes:
- URLs públicas de eventos padronizadas para
https://rionoteatro.com.br/<slug>nas listagens deeventos.phpeteatro.php. - Rota legada
/evento/<slug>passou a responder com redirecionamento 301 para o slug canônico (preservando query string útil). go.phpdeixou de gerar destino/evento/<slug>(inclusive quandodest=evento) e agora direciona sempre para/<slug>.- Metadados SEO em
evento.phpatualizados comrel="canonical"eog:urlapontando para o slug canônico. - Link de visualização pública no admin (
admin/modulos/eventos/index.php) atualizado para o padrão sem/evento/.
Arquivos modificados:
eventos.phpteatro.phpevento.phpgo.phpadmin/modulos/eventos/index.php
Validações executadas:
php -lem todos os arquivos PHP alterados: sem erros de sintaxe.- Teste HTTP:
/evento/sarav-a-com-diae/evento/os-homens-querem-casarretornando301para/<slug>. - Teste HTTP:
/go/<slug>?dest=eventoretornando destino final sem/evento/.
BK-74 · UX WhatsApp + Lista diária também por WhatsApp
Data: 03 de Março de 2026
Ajustes:
- CTA de parceria no cadastro de eventos atualizado para "Fechei a Parceria Gratuita + Venda!".
- Texto pré-preenchido da mensagem WhatsApp do fluxo de parceria atualizado para a nova frase.
- Envio da lista digital diária de compradores passou a usar canal duplo:
- e-mail (fluxo existente preservado)
- WhatsApp para o celular do produtor (
clientes.celular) quando disponível.
Observação de auditoria:
painel/modulos/eventos/editar.phpnão possui atualmente botão WhatsApp equivalente ao fluxo de parceria doincluir.php.
Arquivos modificados:
painel/modulos/eventos/incluir.phpdisparaemail.phpdocs/BACKLOG.md
BK-70 · Ajuste de frequência do alerta de token Facebook
Data: 03 de Março de 2026
Ajuste:
- O alerta
cron_sync_facebook_token_errorfoi calibrado para repetição de 1 em 1 hora (min_seconds=3600,force=false). - Objetivo: manter visibilidade do incidente sem voltar ao spam de intervalos curtos.
Arquivo modificado:
admin/cron/sync_facebook_events.php
BK-69 · Debounce de alerta crítico do token Facebook + backlog rápido
Data: 03 de Março de 2026
Ajustes:
- Reduzido spam de WhatsApp no erro de token inválido/expirado do cron social.
- Alterado
cron_sync_facebook_token_errorpara respeitar debounce real: min_seconds:21600(6h)force:false- Mantido o
exit(1)no cron quando token está inválido (comportamento operacional preservado).
Backlog documentado nesta entrega:
- Ajuste textual do CTA WhatsApp em
painel/modulos/eventos/incluir.phpepainel/modulos/eventos/editar.php. - Envio complementar por WhatsApp do link diário da lista de compradores para o produtor.
Arquivos modificados:
admin/cron/sync_facebook_events.phpdocs/BACKLOG.md
BK-66 · Parceria Premium (Admin x Produtor) + Visibilidade em Home/Peças
Data: 03 de Março de 2026
Funcionalidades:
- Admin ganhou ação dedicada para ativar Parceria Premium direto na edição do evento.
- Tela de eventos no admin recebeu botão + modal de confirmação para o fluxo de ativação.
- Módulo de peças do admin recebeu ação para desfazer Parceria Premium e botão de atalho.
- Listagem de peças/home pública passou a aceitar também eventos com
parceria_online = 1. - Fluxo do produtor foi ajustado para manter semântica de pendência (
status/editado_produtor) no modo parceria.
Arquivos modificados:
admin/modulos/eventos/action.phpadmin/modulos/eventos/editar.phpadmin/modulos/pecas/action.phpadmin/modulos/pecas/index.phppainel/modulos/eventos/action.phpindex.phppecas.php
Validações executadas:
php -lem todos os arquivos alterados: sem erros de sintaxe.- Verificação de diff hygiene (
git diff --check): sem trailing whitespace.
Dias da Semana e Horarios nos Eventos + Bot Captador
Data: 12 de Fevereiro de 2026
Funcionalidades:
- Novos campos
dias_semanaehorariosna tabelapecas(eventos) - Painel do produtor: campos para informar dias da semana e horários do evento
- Bot capturador Sympla: extrai automaticamente dias e horários da agenda
- Admin: ao aprovar evento do bot, campos dias_semana e horários são salvos automaticamente
- Busca em eventos.php: agora busca também por dias da semana e horários
- Fallback na busca: se não encontrar sessões cadastradas, verifica se a data está dentro do período da temporada
Banco de Dados:
- Script SQL:
update_pecas_schema.sql- Adiciona colunas dias_semana e horarios - Script PHP:
add_columns.php- Adiciona colunas via PHP (alternativa ao SQL)
Arquivos criados:
update_pecas_schema.sql- Script SQL para adicionar colunasadd_columns.php- Script PHP para adicionar colunas via códigocheck_pecas_schema.php- Verifica estrutura da tabela pecascheck_schema_temp.php- Script temporário de verificação
Arquivos modificados:
eventos.php- Busca agora inclui dias_semana e horarios nos filtrospainel/modulos/eventos/incluir.php- Campos dias_semana e horarios no formuláriopainel/modulos/eventos/editar.php- Campos dias_semana e horarios na ediçãopainel/modulos/eventos/action.php- Salva dias_semana e horarios no cadastroadmin/modulos/eventos/action.php- Salva dias_semana e horarios ao aprovar evento do botbot/scrapers/sympla_scraper.php- Extrai dias e horários da agenda do Sympla
Busca Inteligente em Eventos
Data: 12 de Fevereiro de 2026
Funcionalidades:
- Campo de busca na pagina eventos.php (igual ao de teatros.php)
- Busca por: nome do evento, nome do teatro, bairro
- Busca por dia da semana (ex: "sabado", "segunda-feira")
- Busca por data especifica (ex: "23/04", "15/03/2025")
- Busca por data por extenso (ex: "23 de abril", "15 de março")
- Busca por dia do mes (ex: "15" - encontra eventos no dia 15 de qualquer mes)
- Filtro client-side instantaneo sem recarregar pagina
- Contador de resultados em tempo real
Estilo Visual:
- Implementado modo dark igual ao teatros.php
- Fundo escuro (var(--dark-card)) com borda sutil (var(--dark-border))
- Texto claro (var(--text-primary)) com placeholder em tom medio (var(--text-secondary))
- Efeito glow verde ao focar (var(--accent-green))
- Remove div rnt-container extra para layout mais limpo
Arquivos modificados:
eventos.php- Adicionado campo de busca com filtros inteligentes e estilo dark mode
Arquivos de backup criados:
eventos_backup_20260212.php
Notificacoes WhatsApp para Admin/Produtores + Resiliencia
Data: 09 de Fevereiro de 2026
Funcionalidades:
- Notificacoes WhatsApp para admin: novo produtor cadastrado, novo evento criado, interesse em creditos
- Notificacoes WhatsApp para produtores: cadastro aprovado/rejeitado, evento aprovado/correcao, conta bloqueada
- Sistema de resiliencia com auto-recuperacao: healthcheck antes de enviar, restart automatico se offline, fila de mensagens
- Restart preventivo apos envio bem-sucedido (limpa Chrome zumbis e locks)
- Nenhuma mensagem se perde: toda falha (cURL, HTTP, offline) enfileira automaticamente
- Dashboard admin com status WhatsApp em tempo real (verde=online, vermelho=offline) + contador de fila
- Cron de backup (a cada 2h) para processar fila em horarios sem movimento
Arquivos criados:
includes/whatsapp_helper.php- Helper com funcoes reutilizaveis: enviar_whatsapp(), enviar_whatsapp_admin(), fila, healthcheck, restartbot/whatsapp/cleanup.sh- Mata zumbis Chrome + remove locks Puppeteerbot/whatsapp/restart.sh- Restart seguro do servico (cleanup + systemctl restart)bot/whatsapp/healthcheck.sh- Script cron para verificar saude e processar filabot/whatsapp/SETUP_RESILIENCIA.md- Documentacao completa do setup no servidor
Arquivos modificados:
action.php(root) - Notificacao WhatsApp ao admin quando novo produtor se cadastrapainel/modulos/eventos/action.php- Notificacao WhatsApp ao admin quando novo evento e criadoadmin/modulos/produtores/action.php- WhatsApp para produtor (aprovacao/rejeicao/bloqueio)admin/modulos/eventos/action.php- WhatsApp para produtor (aprovacao/correcao de evento)admin/modulos/eventos/index.php- Fix: badge de eventos pendentes mostrava 0admin/modulos/eventos/editar.php- Fix: alerta de exclusao aparecia indevidamente (editado_produtor==4)admin/index.php- Dashboard com status WhatsApp em tempo real (verde/vermelho)painel/modulos/creditos/action.php- Notificacao WhatsApp quando produtor clica pacote creditospainel/modulos/creditos/index.php- AJAX para notificar + CSS redesign_2026
Setup servidor (manual):
- systemd: ExecStartPre=/bin/bash cleanup.sh (limpeza antes de cada start)
- Sudoers: www-data pode executar systemctl restart/is-active sem senha
- Cron aaPanel: healthcheck.sh a cada 2 horas
- Permissoes: restart.log com ownership www-data
Microservico WhatsApp + Scraping SPA + Alertas Bot Captador
Data: 08-09 de Fevereiro de 2026
Funcionalidades:
- Microservico Node.js para envio de mensagens WhatsApp via whatsapp-web.js (Puppeteer + Chrome headless)
- Endpoint POST /scrape para scraping de paginas SPA (Sympla) com scroll automatico e lazy loading
- Sistema de alertas integrado ao Bot Captador (WhatsApp primario, email fallback)
- Modulo debug_log no admin para monitoramento em tempo real
- Filtro "Somente BOT" no admin de eventos
Arquivos criados:
bot/whatsapp/server.js- Servidor principal (API REST + WhatsApp + Scrape)bot/whatsapp/package.json- Dependencias npm (whatsapp-web.js, qrcode-terminal)bot/whatsapp/setup.sh- Script de instalacao para VPS com systemdbot/whatsapp/README.md- Documentacao completa do microservicobot/handlers/alert_handler.php- Handler de alertas (WhatsApp + email)
Arquivos modificados:
config/bot_config.php- Configuracoes WhatsApp (URL, API key, numero alerta)bot/cron_captador.php- Integracao com AlertHandler pos-execucaoadmin/modulos/eventos/index.php- Filtro "Somente BOT" nas abas
Detalhes tecnicos:
- Engine: whatsapp-web.js v1.26+ com webVersionCache remoto
- Chrome: Google Chrome Stable (nao snap) em servidor headless
- Porta: 3033 (localhost only, protegida por API key)
- Servico: systemd rnt-whatsapp (User=www-data, Restart=on-failure)
- Sessao persistente via LocalAuth em bot/whatsapp/auth/
SQL executado:
SQL/bot_melhorias_20260208.sql- Migracao InnoDB + tabela bot_alertas_log
2025
Sistema de Produtores - Historico Completo
FASES CONCLUIDAS
FASE 18: Integração de Recursos Premium no Cadastro de Eventos
Data: 02 de Dezembro de 2025
Funcionalidade:
- Integração completa da contratação de recursos premium diretamente no formulário de inclusão de eventos (
incluir.php). - Objetivo: Aumentar a conversão de upgrades no momento de maior interesse do produtor (criação do evento).
Implementação:
- [x] 18.1 - Seção de Recursos Premium no Formulário
- Adicionada seção visual "Recursos Premium" ao final do formulário de cadastro.
- Exibição em tempo real do saldo de créditos do produtor.
- Cards informativos com 3 grupos de ofertas:
- Pacotes Completos: Combo Premium (500 créditos).
- Destaques Individuais: Home (300 créditos) e Topo (200 créditos).
- Recursos Adicionais: Link Externo (50 créditos).
- [x] 18.2 - Fluxo de Contratação Inteligente
- Auto-save: Ao clicar em ativar um recurso, o sistema salva automaticamente o evento primeiro (rascunho) para garantir que o ID exista.
- Modals de Confirmação: Detalham custos, benefícios e saldo final antes da confirmação.
- Validação de Saldo: Bloqueia ativação se saldo insuficiente e sugere compra de créditos.
- Feedback Visual: Botões com estados de carregamento e mensagens de sucesso/erro via Toastr.
Arquivos Modificados:
painel/modulos/eventos/incluir.phppainel/modulos/eventos/js/incluir.js(lógica de auto-save e ativação)
Impacto:
- Simplifica a jornada do produtor, permitindo destacar o evento imediatamente após o cadastro sem navegar por múltiplos menus.
FASE 17: Correção de Scroll no Painel 🐛
Data: 02 de Dezembro de 2025
Problema Identificado:
- A página
painel/index.phpnão rolava para baixo apesar de ter conteúdo extenso. - O problema era causado pela biblioteca
jquery.nicescroll.jsque conflita com renderizações modernas no elementohtml.
Correções Aplicadas:
- [x] 17.1 - Desativação Local do NiceScroll
- Adicionado script em
painel/index.phppara remover o nicescroll especificamente nesta página. - Mantido o funcionamento global do nicescroll para outras páginas (sidebar, etc) para evitar regressões visuais.
- Restaurado
overflow: autono elementohtml.
Arquivos Modificados:
painel/index.php
Backups Criados:
painel/index_bkp_20251202.phppainel/js/common-scripts_bkp_20251202.js(criado durante tentativa anterior, mantido por segurança)
Impacto:
- Restaura a usabilidade da Home do Painel permitindo acesso a todo o conteúdo.
FASE 16: Correção de Mensagens de Erro no Checkout 🐛
Data: 12 de Novembro de 2025
Problema Identificado:
- Mensagens de erro (warning/info) não apareciam ao tentar cadastrar email/CPF/RG duplicado
- JavaScript buscava apenas
.alert-dangermasaction.phpretornava status"warning"ou"info" - Usuários não recebiam feedback visual, levando ao abandono do processo de compra
- Possível causa da queda de vendas desde 02/11/2025
Correções Aplicadas:
- [x] 16.1 - Refatoração do Sistema de Alertas no
pedido.php - JavaScript agora busca alerta dinamicamente:
.alert-{status}(warning, info, danger, success) - Adiciona classe
shownecessária para exibir alertas (CSS usadisplay: none !important) - Implementado scroll suave até o alerta para melhor UX
- Esconde alertas anteriores antes de mostrar o novo
- Aplicado em ambos os fluxos:
- Botão "Continuar para Pagamento" (usuário NÃO logado) - linhas 947-966
- Botão "Entendi, Prosseguir" (usuário logado) - linhas 1013-1032
- [x] 16.2 - Testes Completos via CURL
- ✅ Cadastro com CPF/Email/RG duplicado → Retorna
status: "warning"com mensagem - ✅ Cadastro com CPF inválido → Retorna
status: "info"com mensagem - ✅ Cadastro válido (novo usuário) → Retorna
status: "success"+ URL PagSeguro - ✅ Validação de redirecionamento PagSeguro → Funcionando corretamente
- ✅ Validação de datas indisponíveis → Sistema valida corretamente
Arquivos Modificados:
pedido.php- Linhas 947-966 (fluxo novo cadastro) e 1013-1032 (fluxo usuário logado)
Backups Criados:
pedido_bkp_12112025.php- Backup antes das alterações
Impacto:
- Melhora significativa na UX do checkout
- Usuários agora recebem feedback claro sobre erros
- Redução de abandono de carrinho por falta de feedback
- Possível recuperação das vendas que caíram desde 02/11
Deploy:
- Commit:
722f38af - Branch:
main - Deploy automático: ~1 minuto após push
- Status: ✅ EM PRODUÇÃO
FASE 15: Campo Status Admin + Exclusão de Fotos 🎛️
Data: 10 de Novembro de 2025
- [x] 15.1 - Exclusão de Fotos pelo Produtor
- Implementado botão "Excluir Foto" em
painel/modulos/eventos/editar.php - Função JavaScript
deletarFoto()com confirmação - Case
deletar_fotoempainel/modulos/eventos/action.php - Deleta arquivos físicos de
/large/e/media/ - Remove registro do banco (
tb_fotos) - Validação de permissões (produtor só deleta suas fotos)
- Logs detalhados para debugging
- [x] 15.2 - Correção JSON no Admin
- Corrigido erro "SyntaxError: Unexpected token '<'" em
admin/modulos/eventos/action.php - Movido processamento de formulário PARA DENTRO dos cases
- Removido suporte a AVIF (PHP 5.6)
- Adicionados 4 cases especiais: aprovar, informar_correcao, rejeitar_definitivo, limpar_historico
- Restaurado Cropper.js no admin
- [x] 15.3 - Campo Status no Admin ⭐
- Adicionado campo
<select name="status">emadmin/modulos/eventos/editar.php - Dropdown com 2 opções: 'A' (Ativo) e 'I' (Inativo)
- Admin pode controlar visibilidade do evento manualmente
- Processamento em
admin/modulos/eventos/action.php: - Case 'cadastrar': Admin escolhe status inicial
- Case 'editar': Admin altera status manualmente
- Produtor continua sem acesso (status sempre 'I')
- Campo obrigatório com validação
- Help text explicativo
Arquivos Criados:
docs/FUNCIONALIDADE_EXCLUSAO_FOTOS.md- Documentação de exclusão de fotosdocs/CORRECAO_ACTION_ADMIN.md- Correção do action.php do admindocs/RESTAURACAO_CROP_ADMIN.md- Restauração do cropdocs/CAMPO_STATUS_ADMIN.md- Documentação do campo status
Arquivos Modificados:
painel/modulos/eventos/editar.php- Botão de exclusão de fotopainel/modulos/eventos/action.php- Refatoração completa (case deletar_foto)admin/modulos/eventos/editar.php- Campo status + restauração do cropadmin/modulos/eventos/action.php- Refatoração completa + processamento de status
Backups Criados:
painel/modulos/eventos/editar_bkp_20251110.phppainel/modulos/eventos/action_bkp_20251110.phppainel/modulos/eventos/action_bkp_20251110_v2.phpadmin/modulos/eventos/editar_bkp_20251110_simplificado.phpadmin/modulos/eventos/editar_bkp_20251110_v2.phpadmin/modulos/eventos/editar_bkp_20251110_v3.phpadmin/modulos/eventos/action_bkp_20251110_v2.phpadmin/modulos/eventos/action_bkp_20251110_v3.php
Problema Resolvido:
- Código de processamento executava ANTES do switch, causando PHP Notices quando
$_POSTnão tinha os campos esperados - Solução: Movido TODO o processamento para DENTRO de cada case específico
Compatibilidade:
- PHP 5.6+ (sem AVIF)
- WebP com verificação
function_exists() - jQuery (usando
jQueryao invés de$para compatibilidade global)
FASE 14: Sistema Completo de Tracking de ROI 📊
Data: 04 de Novembro de 2025
- [x] 14.1 - Estrutura de Banco de Dados
- Criadas 4 novas tabelas:
campanhas,campanhas_roi,campanhas_alertas,robot_config - Adicionados 5 campos UTM em
cliente_tracking: utm_source, utm_medium, utm_campaign, utm_content, utm_term - Criadas 2 VIEWs:
v_campanhas_performance,v_ranking_fontes - Criadas 2 Stored Procedures:
sp_calcular_roi_campanhas,sp_gerar_alertas_roi - Índices otimizados para performance em todas as tabelas
- [x] 14.2 - Tracking Frontend Automático
- Criado
js/utm-tracker.jspara captura automática de UTM parameters - Sistema de cookies (7 dias) e sessão PHP
- Tracking de 3 eventos: view_item, begin_checkout, purchase
- First touch e last touch attribution
- APIs backend:
api/track-utm.php,api/track-event.php
- [x] 14.3 - Módulo Admin Completo de Campanhas
- 8 arquivos PHP em
admin/modulos/campanhas/: index.php- Listagem com 4 cards de métricasincluir.php- Criar campanha com preview de link UTMeditar.php- Editar com métricas ao vivodetalhes.php- Visão completa + gráfico de evoluçãodashboard-roi.php- Dashboard com Chart.js (3 gráficos)alertas.php- Sistema de alertas inteligentesaction.php- Backend com 8 actions (criar, editar, deletar, etc.)bootstrap.php- Configuração do módulo
- [x] 14.4 - Dashboard Analítico com Gráficos
- Chart.js 3.9.1 para visualizações
- Gráfico 1: Evolução do ROI (linha temporal)
- Gráfico 2: Receita por Fonte (pizza)
- Gráfico 3: Performance por Fonte (barras)
- Top 5 melhores e piores campanhas
- Filtros por período (data início/fim)
- KPIs em tempo real
- [x] 14.5 - Sistema de Alertas Automáticos
- 5 tipos de alertas: roi_positivo, roi_negativo, baixa_conversao, alto_custo, meta_atingida
- 4 níveis de prioridade: urgente, alta, media, baixa
- 4 status: novo, lido, resolvido, ignorado
- Ações sugeridas automáticas
- Interface completa com filtros e ações rápidas
- [x] 14.6 - Robô de Análise Automática
- Script
admin/cron/analisar_roi_campanhas.php - 7 passos de execução automática:
- Carrega configurações do robô
- Calcula ROI de campanhas ativas
- Gera alertas inteligentes
- Busca alertas para notificação
- Envia email HTML com resumo
- Limpa alertas antigos (>30 dias)
- Gera estatísticas finais
- Sistema de logs detalhados em
admin/cron/logs/ - Compatível com CLI e execução WEB
- Pronto para cron job diário
- [x] 14.7 - Métricas Calculadas
- ROI % e Valor (lucro líquido)
- CPA (Custo Por Aquisição)
- Taxa de Conversão
- Ticket Médio
- Receita Bruta
- Visualizações, Checkouts, Vendas
- [x] 14.8 - Documentação Completa
docs/SISTEMA_TRACKING_ROI.md(1000+ linhas) - Manual completodocs/GUIA_TESTES_ROI.md- 34 casos de teste em 7 fasesdocs/RESUMO_IMPLEMENTACAO_ROI.md- Resumo executivodocs/CHECKLIST_POS_UPLOAD.md- Validação pós-deployadmin/cron/README.md- Configuração do cron job
Arquivos Criados:
- SQL:
EXECUTAR_ESTE.sql,EXECUTAR_FALTANTE.sql,adicionar_menu_campanhas.sql - JS:
js/utm-tracker.js - APIs:
api/track-utm.php,api/track-event.php - Admin: 8 arquivos em
admin/modulos/campanhas/ - Cron:
admin/cron/analisar_roi_campanhas.php - Docs: 4 arquivos em
docs/
Arquivos Modificados:
includes/inc_peca.php→includes/inc_peca_2026.php(adicionado utm-tracker.js na linha 451)meta-analytics.php(adicionadas variáveis globais JavaScript nas linhas 250-260)
Banco de Dados:
- 4 novas tabelas
- 5 campos adicionados em cliente_tracking
- 2 VIEWs
- 2 Stored Procedures
- 8 configurações do robô
Tecnologias:
- PHP 5.6+ (mysql_* functions)
- MySQL 5.7+ (VIEWs, Stored Procedures)
- JavaScript ES5 (compatibilidade)
- Chart.js 3.9.1
- Bootstrap 3.x
- Parsley.js (validação)
Total: 24 arquivos criados/modificados | ~8.000 linhas de código
Status: ✅ Testado e funcionando em produção
Documentação: Ver SISTEMA_TRACKING_ROI.md (SISTEMA_TRACKING_ROI.md) para manual completo
FASE 13: Democratização do Acesso aos Eventos 🎭
Data: 03 de Novembro de 2025
- [x] 13.1 - Documento opcional no cadastro de produtor
- Removida obrigatoriedade de anexar documento em
cadastro-produtor.php - Campo "Documento Comprobatório" agora é opcional
- Backend
action.phpadaptado para aceitar envio vazio - Objetivo: Facilitar inclusão de novos produtores
- [x] 13.2 - Link "Divulgue seu Evento" dinâmico
- Link do menu público agora muda baseado no estado de login
- NÃO logado →
/cadastro-produtor.php - Logado →
/painel/modulos/eventos/ - Implementado em desktop e mobile
- [x] 13.3 - Correção de layout da página de login
- Removido
padding-top: 100pxdo body - Menu agora encosta no topo da página
- Login wrapper centralizado com flexbox
- Adicionado
margin: 0 autopara centralização horizontal
- [x] 13.4 - Sistema de redirect inteligente para login
- Login redireciona para
pecas.phppor padrão - Exceção: Se estava em
peca.php, volta para o evento específico - Cadastro e compra mantêm comportamento original (qualquer página)
- Aplicado em login AJAX e Google OAuth
- [x] 13.5 - Menu "Divulgar Eventos" visível para todos
- Removida verificação de
is_produtornopainel/inc-menu.php - Nome alterado: "Meus Eventos" → "Divulgar Eventos"
- Link agora SEMPRE visível para todos os clientes
- Código simplificado (removida query com JOIN)
- [x] 13.6 - Documentação completa atualizada
- Nova seção "Menu do Painel do Cliente" em
menu.md - Resumo de todas as 5 alterações documentado
- Histórico de versões atualizado para 3.2
- Comparação ANTES/DEPOIS dos fluxos
Arquivos Modificados:
- cadastro-produtor.php (../cadastro-produtor.php) (linha 82-85)
- action.php (../action.php) (linhas 145-166, 221-243, 966-999)
- includes/inc_peca.php (../includes/inc_peca.php) (linhas 483-487, 531, 541)
- painel/login.php (../painel/login.php) (linhas 46-71)
- painel/inc-menu.php (../painel/inc-menu.php) (linhas 17-23)
- docs/menu.md (../docs/menu.md) (versão 3.2)
Status: ✅ Funcionando em produção
FASE 12: Implementação de Toastr em Formulários 🔔
Data: 31 de Outubro de 2025
- [x] 12.1 - Correção do sistema de alertas em
cadastre-se.php - Substituído sistema legado de alertas HTML por notificações Toastr
- Adicionada biblioteca Toastr (CSS e JS) no cadastre-se.php
- Configuração centralizada de Toastr com barra de progresso
- Posicionamento: topo centralizado (
toast-top-center)
- [x] 12.2 - Atualização de
js/cadastre-se.js(v1.0.1 → v1.0.2) - Reescrita completa do handler de sucesso AJAX
- Implementada lógica especial para emails duplicados
- Adicionado link clicável para "Recuperar Senha" em erros de duplicidade
- Timeout estendido (15s) para mensagens de erro com ações
- Removido sistema antigo de scroll e manipulação de elementos HTML
- [x] 12.3 - Padronização de notificações
- Formato consistente:
toastrstatus (message) - Suporte a HTML em mensagens (links, botões, ícones)
- Tratamento de erros genéricos (falha de comunicação)
- Redirecionamento automático após 3 segundos em caso de sucesso
- [x] 12.4 - Testes completos via cURL
- ✅ Teste 1: Cadastro novo - PASSOU
- ✅ Teste 2: Email duplicado - PASSOU
- ✅ Teste 3: CPF inválido - PASSOU
- ✅ Teste 4: Segundo cadastro novo - PASSOU
- ✅ Teste 5: Cadastro produtor (email duplicado) - PASSOU
- ✅ Teste 6: Cadastro produtor (sem documento) - PASSOU
- [x] 12.5 - Documentação
- Criado formularios.md (formularios.md) com documentação completa
- Documentados todos os formulários do sistema
- Incluídos exemplos de uso, troubleshooting e testes
- Adicionado roadmap de melhorias futuras
Arquivos Modificados:
- cadastre-se.php (../cadastre-se.php) (linhas 13, 308)
- js/cadastre-se.js (../js/cadastre-se.js) (reescrita)
Status: ✅ Funcionando em produção
FASE 11: Simplificação do Upload de Imagens 🎨
- [x] 11.1 - Refatoração para input file nativo HTML5
- Removido sistema drag-drop complexo do gestor de imagens
- Implementado input file nativo com atributo
acceptpara validação - Interface mais simples e intuitiva para produtores
- [x] 11.2 - Preview instantâneo da imagem
- JavaScript com FileReader API para preview antes do upload
- Validação client-side de formato (JPG, JPEG, PNG)
- Validação de tamanho (máximo 5MB)
- Mensagens de erro claras e específicas
- [x] 11.3 - Unificação da interface
- Campo de foto adicionado diretamente no formulário de incluir.php
- Campo de foto adicionado diretamente no formulário de editar.php
- Removido alerta "Importante: Após preencher os dados..."
- Removida seção separada "Gestor de Foto do Evento"
- [x] 11.4 - Limpeza de código
- Removidos scripts não utilizados (uploader-eventos.js)
- Removidas bibliotecas de drag-drop não necessárias
- Código JavaScript inline simplificado
- Redução de dependências externas
FASE 10: Upload de Imagens para Eventos 📸
- [x] 10.1 - Integração do Gestor de Imagens no fluxo de eventos
- Redirect automático para editar.php após cadastro (com ID do evento)
- Mensagem incentiva: "Agora adicione uma foto para deixar seu evento mais atrativo!"
- [x] 10.2 - Gestor de Fotos no editar.php
- Seção "Foto do Evento" totalmente funcional
- Upload de APENAS 1 foto (limite configurado)
- Sem vídeos, sem tabs (simplificado para produtores)
- Script customizado: painel/modulos/eventos/js/uploader-eventos.js (../painel/modulos/eventos/js/uploader-eventos.js)
- [x] 10.3 - Preview visual no incluir.php
- Seção de foto visível mas desabilitada (
opacity: 0.5; pointer-events: none) - Alerta amarelo: "Salve o evento primeiro!"
- UX clara: produtor já vê onde vai adicionar a foto
- [x] 10.4 - Configurações de upload
- Formatos aceitos: JPG, JPEG, PNG
- Limite: 1 foto por evento
- Mensagem de erro: "Máximo de 1 foto permitida. Delete a foto atual para enviar outra."
- Admin mantém funcionalidades completas (múltiplas fotos e vídeos)
FASE 9: Estrutura de Relacionamento Produtor-Peça 🔗
- [x] 9.1 - Análise completa da estrutura atual vs. ideal
- Documento: ANALISE_ESTRUTURA_PECAS.md (ANALISE_ESTRUTURA_PECAS.md)
- Identificado conflito: código tentava usar
id_cliente, SQL planejado usavaid_produtor - Decisão: implementar
id_produtor(semântica correta + performance) - [x] 9.2 - Alteração do banco de dados
- Script: /SQL/SQL_ADD_ID_PRODUTOR_PECAS.sql (../SQL/SQL_ADD_ID_PRODUTOR_PECAS.sql)
- Executado:
ALTER TABLE pecas ADD COLUMN id_produtor INT NULL - Criado índice:
idx_id_produtorpara performance - Coluna
editado_produtorjá existia (não foi necessário criar) - [x] 9.3 - Correção do código do painel
- painel/modulos/eventos/action.php:84 (../painel/modulos/eventos/action.php#L84) - INSERT com
id_produtor - painel/modulos/eventos/index.php:77 (../painel/modulos/eventos/index.php#L77) - Listagem filtrando por
id_produtor - painel/modulos/eventos/editar.php:14 (../painel/modulos/eventos/editar.php#L14) - Verificação de propriedade
- painel/modulos/eventos/sessoes.php:15 (../painel/modulos/eventos/sessoes.php#L15) - Verificação de propriedade
- Todas queries de segurança atualizadas
- [x] 9.4 - Otimização do código do admin
- admin/modulos/pecas/index.php:111-115 (../admin/modulos/pecas/index.php#L111-L115) - Query otimizada com LEFT JOIN
- Eliminado lookup ineficiente por
produtor_email - Contador de pendentes usando
editado_produtor = 1 - Performance melhorada significativamente
FASE 8: Correções Críticas e Debug 🐛
- [x] 8.1 - Criação de DEBUG.md (DEBUG.md) com processo de exposição de erros SQL
- [x] 8.2 - Correção inicial de nomenclatura (descobriu necessidade da Fase 9)
- [x] 8.3 - Implementação de
editado_produtor=1ao criar/editar peças - Nova peça: marca
editado_produtor=1(aguarda aprovação admin) - Edição de peça: marca
editado_produtor=1estatus=I(aguarda nova aprovação) - Admin aprova: altera
editado_produtor=0estatus=A(peça vai ao ar)
FASE 7: Módulo Admin de Produtores 🎭
- [x] 7.1 - Criação completa do módulo
/admin/modulos/produtores/ - [x] 7.2 - Sistema de listagem com JOIN à tabela clientes
- [x] 7.3 - Formulário de aprovação/rejeição/bloqueio (detalhe.php)
- [x] 7.4 - Campos Email e Celular editáveis no admin
- [x] 7.5 - Visualização de documentos anexados (PDF e imagens)
- [x] 7.6 - Sistema de status com dropdown (pendente, ativo, rejeitado, bloqueado)
- [x] 7.7 - Campos de motivo de rejeição e bloqueio
- [x] 7.8 - Correção de roteamento AJAX com
data-action-url - [x] 7.9 - Refatoração de SQL UPDATE para melhor tratamento de erros
- [x] 7.10 - Exibição de status e motivo de rejeição no painel do cliente
- [x] 7.11 - Sistema de resubmissão após rejeição (máx 3 tentativas)
- [x] 7.12 - Atualização automática de
clientes.is_produtorao aprovar
FASE 6: Backend de Solicitação de Produtor 🚀
- [x] 6.1 - Implementar case
"solicitar_produtor"emprodutor/action.php - [x] 6.2 - Sistema completo de upload de documentos
- [x] 6.3 - Validações de segurança (tipo, tamanho, tentativas)
- [x] 6.4 - Integração com tabela
tb_produtores - [x] 6.5 - Controle de status e tentativas (máx 3)
- [x] 6.6 - Correção do frontend para enviar para
produtor/action.php - [x] 6.7 - Implementação de div para exibir motivo de rejeição
- [x] 6.8 - Backup de segurança do arquivo
produtor/action.php
FASE 1: Preparação e Backup ⚠️
- [x] 1.1 - Backup de todos os arquivos que serão modificados
- [x] 1.2 - Análise da estrutura atual do banco de dados
- [x] 1.3 - Documentação das modificações necessárias
FASE 2: Estrutura de Banco de Dados 🗄️
- [x] 2.1 - Adicionar campo
use_cpfna tabelatab_users - [x] 2.2 - Adicionar campo
produtor_emailna tabelapecas - [x] 2.3 - Adicionar campo
status_aprovacaona tabelapecas - [x] 2.4 - Criar índices necessários for performance
FASE 3: Sistema de Cadastro Público 📝
- [x] 3.1 - Criar página
/cadastro-produtor.php(formulário público) - [x] 3.2 - Criar validação de CPF e e-mail únicos
- [x] 3.3 - Sistema de confirmação por e-mail (no-reply@rionoteatro.com.br)
- [x] 3.4 - Integrar com design atual do site
FASE 4: Modificações no Admin 👨💼
- [x] 4.1 - Modificar
/admin/modulos/administradores/index.php(adicionar CPF) - [x] 4.2 - Modificar
/admin/modulos/pecas/index.php(aba aprovação + filtros) - [x] 4.3 - Sistema de controle via Status (Ativo/Inativo) + campo editado_produtor
- [x] 4.4 - Sistema de notificação por e-mail para produtores
📊 IMPLEMENTAÇÕES RECENTES (Outubro 2025)
🎨 Simplificação do Upload de Imagens para Eventos ✅
Data: 26/10/2025
- FUNCIONALIDADE IMPLEMENTADA: Refatoração completa do sistema de upload de fotos para interface nativa HTML5
- MOTIVAÇÃO:
- Sistema drag-drop anterior era complexo demais para apenas 1 foto
- Dependências externas desnecessárias (uploader-eventos.js, jquery.uploadfile.min.js)
- Interface confusa com seções separadas e alertas múltiplos
- MUDANÇAS IMPLEMENTADAS:
- Input File Nativo:
- Substituído sistema drag-drop por
<input type="file"> - Atributo
accept="image/jpeg,image/jpg,image/png"para validação nativa - Compatível com todos navegadores modernos e mobile
- Preview Instantâneo:
- JavaScript puro com FileReader API
- Preview da imagem antes do upload (sem necessidade de salvar)
- Imagem exibida em tamanho otimizado (max-width: 300px, max-height: 200px)
- Validações Client-Side:
- Tamanho máximo: 5MB (alerta antes do upload)
- Formatos aceitos: JPG, JPEG, PNG (validação dupla: HTML5 + JS)
- Mensagens de erro específicas e claras
- Interface Unificada:
- Campo de foto integrado diretamente no formulário
- Mesmo comportamento em incluir.php e editar.php
- Removidos alertas informativos redundantes
- Removida seção separada "Gestor de Foto do Evento"
- Limpeza de Código:
- Removidos 140+ linhas de código desnecessário
- Eliminadas 5 dependências de bibliotecas externas
- JavaScript simplificado (30 linhas vs. 92 anteriores)
- ARQUIVOS MODIFICADOS:
painel/modulos/eventos/incluir.php- Removido alerta informativo (linhas 76-79)
- Removida seção "Gestor de Foto do Evento" (linhas 177-194)
- Adicionado input file com preview no formulário principal
- Adicionado JavaScript de validação e preview (30 linhas)
painel/modulos/eventos/editar.php- Removida seção "Gestor de Foto do Evento" (linhas 201-216)
- Adicionado input file com preview no formulário principal
- Removidos scripts de upload antigos (linhas 337-344)
- Adicionado JavaScript de validação e preview (30 linhas)
- BENEFÍCIOS:
- ✅ Interface mais simples e intuitiva
- ✅ Menos dependências externas (melhor performance)
- ✅ Preview instantâneo melhora UX
- ✅ Compatibilidade mobile melhorada
- ✅ Código mais limpo e manutenível
- ✅ Validações mais claras para o usuário
- IMPACTO:
- Redução de ~60% no código relacionado a upload
- Interface unificada entre incluir e editar
- Experiência do usuário mais fluida
- OBSERVAÇÃO:
- ⚠️ Backend (action.php) precisará ser ajustado para processar upload via formulário
- 📝 Documentação atualizada em README.md e RESUMO_FASE_11.md
🔒 reCAPTCHA v3 Invisível - Esqueceu Senha ✅
Data: 25/10/2025
- FUNCIONALIDADE IMPLEMENTADA: Sistema de proteção anti-bot invisível no formulário de recuperação de senha
- ARQUIVOS MODIFICADOS:
painel/esqueceu_senha.php- Frontend com reCAPTCHA v3painel/data/functions.php- Funçãoverify_captcha()atualizada- CHAVES reCAPTCHA v3:
- Site Key:
6Ldnb3AqAAAAADI_kdUeqIbA26axUeeKMom3rKOp - Secret Key:
6Ldnb3AqAAAAAORTDGsZCoYo8RHquhsGutVt6trB - IMPLEMENTAÇÃO:
- Script carregado:
https://www.google.com/recaptcha/api.js?render=[SITE_KEY] - Execução invisível com
grecaptcha.execute()na ação 'submit' - Sem checkbox visível (100% invisível para o usuário)
- Validação backend baseada em score (0.0 a 1.0)
- Score mínimo aceito: 0.5 (humano provável)
- FLUXO DE VALIDAÇÃO:
- Usuário preenche email e clica "Enviar"
- reCAPTCHA v3 executa invisível em background
- Token gerado automaticamente
- Backend valida token via API do Google
- Score >= 0.5 = aprovado, email enviado
- Score < 0.5 = rejeitado como bot
- PROTEÇÃO CONTRA:
- Ataques de força bruta
- Spam de emails
- Enumeração de usuários
- DoS (Denial of Service)
- LOGS DE DEBUG:
- Logs detalhados em
error_log()para troubleshooting - Registro de token, score e motivos de rejeição
- BENEFÍCIOS:
- Experiência do usuário sem fricção (sem captcha visível)
- Proteção robusta contra bots automatizados
- Gratuito (até 1 milhão de requisições/mês)
🎨 Simplificação e Ajustes do Formulário de Eventos ✅
Data: 25/10/2025
- FUNCIONALIDADE IMPLEMENTADA: Simplificação do formulário de eventos e correções de validação
- MÓDULO ATUALIZADO:
/painel/modulos/eventos/ - MUDANÇAS IMPLEMENTADAS:
- Campo Contato (WhatsApp):
- Máscara automática: (21) 99999-9999
- Validação de 11 dígitos obrigatórios (DDD + 9 dígitos)
- Salva no banco apenas números limpos (sem formatação)
- Mensagem de ajuda: "Este número precisa ser de WhatsApp pois será o contato dos interessados"
- Campo Classificação:
- Alterado de input text para dropdown
- Opções: LIVRE, 10 anos, 12 anos, 14 anos, 16 anos, 18 anos
- Campo Teatro:
- Agora obrigatório (*)
- Dropdown populado da tabela
teatros - Campo Ficha Técnica:
- Agora é opcional (removido asterisco)
- CKEditor Simplificado:
- Toolbar reduzida: Negrito, Itálico, Sublinhado, Remover Formatação
- Alinhamento: Esquerda, Centro, Direita, Justificado
- Formato: Somente Parágrafo Normal (p) e Título (h1)
- Altura fixada em 200px
- Campos Removidos:
- Quantidade Máxima de Ingressos
- Oferta (Desconto em %)
- Local e Contatos
- Regras
- Contatos Vendas Interno
- E-mail lista de compradores
- Tempo do envio antecipado
- Correção do Action:
- Adicionado
data-action-url="action.php"nos formulários - Corrige envio para o action.php correto do módulo
- Validação JavaScript:
- Máscara dinâmica no campo contato
- Validação de 11 dígitos antes de enviar
- Limpeza automática do número (remove formatação)
- Confirmação:
- Eventos são inseridos na tabela
pecas(corrigido de 'tb_pecas') - Campo
id_produtorrelaciona evento ao cliente produtor - Correção de Nome de Tabela:
- Corrigido
TB_ATUALde 'tb_pecas' para 'pecas' no bootstrap.php - Tabela correta do banco de dados é 'pecas' (sem prefixo 'tb_')
🎭 Módulo Admin de Produtores Completo ✅
Data: 25/10/2025
- FUNCIONALIDADE IMPLEMENTADA: Sistema completo de gestão de solicitações de produtores no painel admin
- MÓDULO CRIADO:
/admin/modulos/produtores/com todos os arquivos necessários - MUDANÇAS IMPLEMENTADAS:
- Estrutura do Módulo:
bootstrap.php- Configuração do móduloindex.php- Listagem de solicitações com JOIN à tabela clientesdetalhe.php- Formulário de aprovação/rejeição/bloqueioaction.php- Processamento de edições e exclusões- Listagem (index.php):
- Query com JOIN entre
tb_produtoreseclientes - Exibição de: Nome, Email, Empresa, Status, Data Solicitação
- Labels coloridos por status (warning=pendente, success=ativo, danger=rejeitado, info=bloqueado)
- Botões de ação: Editar, Deletar
- Formulário de Aprovação (detalhe.php):
- Campos editáveis: Email, Celular (requisito do usuário)
- Campo Empresa (pode ser NULL)
- Dropdown de Status (pendente, ativo, rejeitado, bloqueado)
- Textarea "Motivo da Rejeição" (condicional, só aparece quando status=rejeitado)
- Textarea "Motivo do Bloqueio" (condicional, só aparece quando status=bloqueado)
- Textarea "Observações" (sempre visível)
- Visualização de documento anexado com preview para imagens e link para PDFs
- Atributo
data-action-url="action.php"para roteamento correto - Processamento (action.php):
- Case 'editar': Atualiza
tb_produtoreseclientes(email e celular) - Case 'deletar': Remove registro de solicitação
- Incremento de tentativas ao rejeitar
- Atualização de
clientes.is_produtor = 1ao aprovar - Refatoração para usar UPDATE direto ao invés de
$obj_sql->update() - Tratamento dinâmico de campos NULL (empresa, motivo_rejeicao, motivo_bloqueio)
- Logging de erros MySQL na resposta JSON
- Correções de Roteamento:
- Modificado
admin/js/parsley-validate-form.jslinha 40-44 - Agora verifica
data-action-urlantes de usarAPP_ROOT + 'action.php' - Permite que formulários em submódulos postem para seu próprio action.php
- Exibição de Status no Painel Cliente:
painel/modulos/profile/index.phpagora faz query de status do produtor- Alertas coloridos por status (info=pendente, success=ativo, danger=rejeitado, warning=bloqueado)
- Exibição de motivo de rejeição quando aplicável
- Contador de tentativas (1/3, 2/3, 3/3)
- Sistema permite resubmissão se status=rejeitado e tentativas < 3
- Correções de Upload:
- Upload agora usa
$_SERVER['DOCUMENT_ROOT']para path absoluto - Salva path como
/uploads/produtores/filename.pdfno banco - Evita conflitos com regras nginx rewrite
- BENEFÍCIOS:
- ✅ Admin pode revisar todas as solicitações de produtores
- ✅ Aprovação/rejeição com feedback ao cliente
- ✅ Email e celular editáveis para corrigir dados
- ✅ Preview de documentos anexados
- ✅ Cliente vê status e motivo de rejeição em tempo real
- ✅ Sistema de resubmissão controlado (máx 3 tentativas)
- ARQUIVOS CRIADOS:
admin/modulos/produtores/bootstrap.phpadmin/modulos/produtores/index.phpadmin/modulos/produtores/detalhe.phpadmin/modulos/produtores/action.php- ARQUIVOS MODIFICADOS:
admin/js/parsley-validate-form.jspainel/modulos/profile/index.phpprodutor/action.php(correções de upload)- SQL EXECUTADO:
- INSERT em
tb_menuspara criar submenu "Produtores"
🔧 Correção de Caminhos Absolutos para Login/Logout ✅
Data: 24/10/2025
- PROBLEMA RESOLVIDO: Login/logout falhavam após alterações de rewrite nginx - caminhos relativos causavam redirecionamento para
peca.php - CAUSA RAIZ:
- JavaScript usava caminhos relativos (
'action.php') que eram capturados pelo rewrite - Link de logout apontava para arquivo inexistente (
/admin/logout,/produtor/logout) - Produtor usava HTTP ao invés de HTTPS
- Faltava definição de
APP_ROOTno produtor - MUDANÇAS IMPLEMENTADAS:
- Variável JS Global (11 arquivos HEAD):
admin/head.php- Adicionado<script>var APP_ROOT = '<?=APP_ROOT?>';</script>produtor/head.php- Adicionado<script>var APP_ROOT = '<?=APP_ROOT?>';</script>painel/head.php- Adicionado<script>var APP_ROOT = '<?=APP_ROOT?>';</script>- Links de Logout (3 arquivos):
admin/inc-topo.php- Alterado de<?=APP_ROOT?>logoutpara?logout=1produtor/inc-topo.php- Alterado de<?=APP_ROOT?>logoutpara?logout=1painel/inc-topo.php- JÁ ESTAVA CORRETO (index.php?logout=1)- JavaScript Parsley (3 arquivos):
admin/js/parsley-validate-form.js- 3x alterações:'action.php'→APP_ROOT + 'action.php'produtor/js/parsley-validate-form.js- 3x alterações:'action.php'→APP_ROOT + 'action.php'painel/js/parsley-validate-form.js- 3x alterações:'action.php'→APP_ROOT + 'action.php'- Configurações do Produtor:
produtor/login.php-APP_ROOTde''para'/produtor/'produtor/data/config.php-http://→https://(3 constantes)produtor/data/config.php- Adicionadodefine("APP_ROOT", URL_CLIENTE);- BENEFÍCIOS:
- ✅ Login funciona independente de rewrites nginx
- ✅ Logout usa sistema GET correto (
?logout=1) - ✅ Caminhos absolutos evitam conflitos com regras de rewrite
- ✅ HTTPS forçado em todo sistema produtor
- ✅ Consistência entre admin, produtor e painel
- BACKUPS CRIADOS:
admin/head_backup_20251024.phpadmin/inc-topo_backup_20251024.phpadmin/js/parsley-validate-form_backup_20251024.jsprodutor/head_backup_20251024.phpprodutor/inc-topo_backup_20251024.phpprodutor/js/parsley-validate-form_backup_20251024.jsprodutor/login_backup_20251024.phpprodutor/data/config_backup_20251024.phppainel/head_backup_20251024.phppainel/inc-topo_backup_20251024.phppainel/js/parsley-validate-form_backup_20251024.js
🔒 Tratamento de Erro Google OAuth (access_denied) ✅
Data: 23/10/2025
- PROBLEMA RESOLVIDO: Quando usuário cancelava autorização do Google OAuth, sistema retornava erro confuso "E-mail não encontrado"
- MUDANÇAS IMPLEMENTADAS:
painel/action.php(linhas 20-41):- Validação de
$_GET['error']antes de processar login - Detecta
access_denied(usuário cancelou) e outros erros OAuth - Validação dupla: garante dados POST OU código do Google
- Previne tentativas de login sem informações válidas
- Redireciona para
login.php?google_error=cancelled|oauth_failed painel/login.php(linhas 680-692):- Tratamento visual de erros do Google OAuth
- Mensagem para cancelamento: "Você cancelou o acesso com Google. Use e-mail/CPF e senha ou tente novamente."
- Mensagem para falhas: "Falha na autenticação com Google. Tente novamente ou use e-mail/CPF e senha."
- Integração com Toastr (warning para cancelamento, error para falhas)
- Limpeza automática de parâmetros da URL
- BENEFÍCIOS:
- ✅ Mensagens claras e orientativas para o usuário
- ✅ Previne logs de erros falsos no sistema
- ✅ Melhora UX em caso de cancelamento
- ✅ Segurança adicional contra acesso indevido
- ✅ Zero impacto em fluxos de login existentes
- BACKUPS CRIADOS:
painel/action_backup_20251023.phppainel/login_backup_20251023.php
🎨 Separação de JavaScript em Módulos Externos ✅
Data: 23/10/2025
- MUDANÇA: JavaScript modularizado para melhor manutenção e performance
- ARQUIVOS CRIADOS:
js/cadastre-se.js- Lógica do formulário de cadastro público- Sistema de validação Parsley + AJAX
- Redirecionamento inteligente pós-cadastro
- Scroll suave para alertas
- Tratamento de mensagens de sucesso/erro
js/pedido.js- Lógica do formulário de cadastro no checkout- Máscaras de telefone
(00) 0 0000-0000 - Email autocomplete com domínios populares
- Sugestão inteligente de correção de email (mailcheck)
- Inicialização de Parsley no formulário
#form-cadastro-pedido - IMPACTO:
- Código mais organizado e reutilizável
- Melhor separação de responsabilidades
- Cache de arquivos JS pelo navegador
- Facilita manutenção e testes
- ARQUIVOS MODIFICADOS:
cadastre-se.php- Importajs/cadastre-se.js?v1.0.1pedido.php- Importajs/pedido.js?v=1.0.2
📋 Sistema de Cadastro: Seleção UF/Cidade/Zonas ✅
Data: 23/10/2025
- MUDANÇA: Sistema dinâmico de seleção geográfica implementado
- FUNCIONALIDADES:
- UF: Seleção de estado com opção para estrangeiros
- Cidade: Exibido apenas se UF = RJ (24 cidades do Rio de Janeiro)
- Zonas de Interesse: Exibido apenas se Cidade = Rio de Janeiro
- Centro, Zona Sul, Zona Norte, Zona Oeste, Zona Sudoeste, Baixada, Todo o RJ
- Função
toggleCidadeBairro()- Controla exibição de cidade - Função
toggleZonas()- Controla exibição de zonas - Alertas informativos sobre opcional/obrigatório
- IMPACTO:
- Melhor segmentação de público
- Ofertas personalizadas por região
- UX otimizada (campos condicionais)
- ARQUIVOS MODIFICADOS:
cadastre-se.php(linhas 168-239)
🎯 Campo "Como conheceu o Rio no Teatro?" ✅
Data: 23/10/2025
- MUDANÇA: Campo de origem de tráfego atualizado
- OPÇÕES ADICIONADAS:
- TikTok (nova opção)
- "Outro" com campo texto livre
- OPÇÕES EXISTENTES:
- Google, Facebook, Instagram, Newsletter, Amigo
- IMPACTO: Rastreamento de canais de aquisição mais completo
- ARQUIVOS MODIFICADOS:
cadastre-se.php(linhas 240-283)
💬 Mensagem Especial para Visitantes do Google ✅
Data: 23/10/2025
- MUDANÇA: Detecção de referer do Google e exibição de mensagem de boas-vindas
- FUNCIONALIDADE:
- Verifica
HTTP_REFERER=www.google.com - Exibe alert box amigável com emoji 👋
- Mensagem: "Olá! Que bom que você nos encontrou no Google..."
- IMPACTO: Melhora conversão de visitantes orgânicos
- ARQUIVOS MODIFICADOS:
cadastre-se.php(linhas 25-32)
🔄 Redirecionamento Inteligente Pós-Cadastro ✅
Data: 23/10/2025
- MUDANÇA: Sistema que preserva página de origem para redirecionamento
- FUNCIONALIDADES:
- Captura
HTTP_REFERERao acessar cadastre-se.php - Armazena em
$_SESSION['original_page'] - Exclui loops (não salva se referer = cadastre-se.php ou login)
- Redireciona usuário para página original após login/cadastro
- IMPACTO: UX melhorada - usuário retorna de onde veio
- ARQUIVOS MODIFICADOS:
cadastre-se.php(linhas 19-23)js/cadastre-se.js(redirecionamento viadata.url)
Feat: Imagem responsiva na página da peça
Data: 23/10/2025
- MUDANÇA: A imagem principal do evento em
peca.phpfoi atualizada para usar a tag<picture>do HTML5. - IMPACTO: Otimização de performance. Dispositivos móveis agora carregam uma imagem de resolução média, enquanto desktops carregam a imagem de alta resolução, resultando em um carregamento mais rápido em conexões móveis.
- ARQUIVOS MODIFICADOS:
peca.php
Layout: Reordena seções em peca.php
Data: 23/10/2025
- MUDANÇA: A seção "Regras e Instruções" na página de detalhes da peça foi movida para ser a última seção, posicionada após "Dúvidas".
- IMPACTO: Melhora o fluxo de leitura da página, deixando informações de contato e ajuda mais acessíveis antes das regras detalhadas.
- ARQUIVOS MODIFICADOS:
peca.php
Fix: Salva "Zonas de Interesse" no perfil do usuário ✅
Data: 23/10/2025
- PROBLEMA: O campo "Zonas de Interesse" no perfil do usuário não estava sendo salvo no banco de dados após a edição.
- CAUSA RAIZ: O arquivo
painel/modulos/profile/action.phpnão processava o campozonas[]do formulário para incluí-lo na query de atualização do banco de dados. - SOLUÇÃO IMPLEMENTADA:
- Adicionada uma linha em
painel/modulos/profile/action.phppara converter o array$_POST['zonas']em um texto separado por vírgulas e salvá-lo no campozonas_interesseda tabelaclientes. - O campo
zonas_interessefoi previamente adicionado à tabelaclientes.
- ARQUIVOS MODIFICADOS:
painel/modulos/profile/action.php
- STATUS: ✅ Corrigido. As zonas de interesse agora são salvas corretamente.
🛒 Sistema de Checkout: Formulário de Cadastro no Pedido ✅
Data: 23/10/2025
- MUDANÇA: Formulário de cadastro completo durante o checkout para usuários não logados
- FUNCIONALIDADES:
- Campos implementados:
- Nome, Email, Confirmar Email
- Senha (apenas para não logados)
- Celular com máscara
(00) 0 0000-0000 - CPF obrigatório - Identificador único
- Documento Oficial com Foto obrigatório - Para retirada na bilheteria
- Validação:
- Parsley validation no formulário
#form-cadastro-pedido - Email autocomplete e correção inteligente (mailcheck)
- Validação customizada via
js/pedido.js - Alertas informativos:
- Alerta sobre documentos obrigatórios com foto
- Função
alertDocumento()com informações sobre RG, OAB, Passaporte, CREA, CPF com foto, etc. - Campos hidden:
- Quantidade, data, ID da peça, assentos, nome do espetáculo
- Action
pedidopara processamento - IMPACTO:
- Conversão de venda direta sem redirecionamentos
- Dados completos capturados no momento da compra
- Conformidade com regras de retirada de ingressos
- ARQUIVOS MODIFICADOS:
pedido.php(linhas 439-611 - formulário completo)js/pedido.js(máscaras e validações)
🎭 Modal Informativo sobre Endereço PagSeguro ✅
Data: 23/10/2025
- MUDANÇA: Modal educativo sobre solicitação de endereço pelo PagSeguro
- FUNCIONALIDADES:
- Modal ID:
#modalEnderecoPagSeguro - Trigger: Botão "Confirmar Pedido" (
#btnConfirmarPedido) - Conteúdo:
- Explicação: PagSeguro solicita endereço como medida de segurança
- ℹ️ NÃO utilizamos o endereço informado
- ℹ️ NÃO enviamos ingressos por correio
- ℹ️ Ingressos SEMPRE retirados na bilheteria
- ℹ️ Política de cancelamento (até 3h antes)
- 🎭 Instruções de retirada com documento
- Botão de confirmação: "Entendi, Prosseguir para Pagamento" (
#btnEntendidoProsseguir) - Comportamento:
- Modal não fecha com ESC ou clique fora (
data-backdrop="static") - Após confirmação, processa pedido via AJAX e redireciona para PagSeguro
- IMPACTO:
- Reduz dúvidas sobre solicitação de endereço
- Aumenta confiança do usuário
- Diminui abandono no checkout
- ARQUIVOS MODIFICADOS:
pedido.php(linhas 701-737 - HTML do modal)pedido.php(linhas 912-1018 - JavaScript inline com handlers)
🔄 Fluxo de Duas Etapas: Cadastro → Confirmação ✅
Data: 23/10/2025
- MUDANÇA: Sistema de cadastro em duas etapas durante o checkout
- FLUXO PARA USUÁRIOS NÃO LOGADOS:
- Etapa 1: Preencher formulário de cadastro
- Clicar "Continuar para Pagamento" (
#btnContinuarCadastro) - Sistema valida com Parsley
- AJAX envia dados para
action.phpcomact=pedido - Sistema cadastra usuário e cria sessão
- Página recarrega - Usuário agora está logado
- Etapa 2: Tela de confirmação com resumo do pedido
- Clicar "Confirmar Pedido" (
#btnConfirmarPedido) - Modal informativo é exibido
- Clicar "Entendi, Prosseguir para Pagamento"
- AJAX processa pedido (
act=efetuacompra) - Redireciona para PagSeguro
- FLUXO PARA USUÁRIOS LOGADOS:
- Visualiza resumo do pedido direto
- Clicar "Confirmar Pedido"
- Modal informativo é exibido
- Clicar "Entendi, Prosseguir para Pagamento"
- AJAX processa pedido
- Redireciona para PagSeguro
- IMPACTO:
- Separação clara entre cadastro e confirmação
- Usuário tem tempo de ler informações importantes
- Reduz erros de cadastro apressado
- ARQUIVOS MODIFICADOS:
pedido.php(JavaScript inline - linhas 880-1018)js/pedido.js(apenas helpers - máscaras e autocomplete)
📦 Exibição de Assentos Selecionados ✅
Data: 23/10/2025
- MUDANÇA: Campo de assentos exibido quando aplicável
- FUNCIONALIDADE:
- Verifica se
$assentosnão está vazio - Exibe linha com "Assentos: [lista de assentos]"
- Presente no resumo do pedido (logado e não logado)
- IMPACTO: Transparência sobre assentos escolhidos
- ARQUIVOS MODIFICADOS:
pedido.php(linhas 281-283, 643-645)
🐞 Correção: Fluxo de Cadastro em pedido.php ✅
Data: 23/10/2025
- PROBLEMA: Ao se cadastrar durante a compra em
pedido.php, o modal de endereço do PagSeguro era exibido prematuramente (ou piscava na tela), antes da etapa de confirmação do pedido. - IMPACTO: Interrompia o fluxo de duas etapas (1. Cadastro, 2. Confirmação) e causava confusão visual.
- CAUSA RAIZ: Lógica de
event handlerduplicada. O comportamento correto foi implementado em um script inline empedido.php, mas uma versão antiga e conflitante da mesma lógica ainda existia no arquivo externojs/pedido.js. - SOLUÇÃO IMPLEMENTADA:
- 1ª Parte (pedido.php): O script inline foi corrigido para que o botão de cadastro (
#btnContinuarCadastro) submetesse o formulário via AJAX e recarregasse a página, em vez de abrir o modal. - 2ª Parte (js/pedido.js): O bloco de código duplicado e conflitante, que continha os
event handlersantigos para os botões de cadastro e confirmação, foi completamente removido dejs/pedido.js.
- ARQUIVOS MODIFICADOS:
pedido.php(bloco de script no final do arquivo)js/pedido.js
- STATUS: ✅ Corrigido. O conflito foi eliminado e o fluxo de cadastro para novos usuários foi restaurado.
✨ UX: Modal Informativo no Checkout (pedido.php) ✅
Data: 22/10/2025
- PROBLEMA: Modal com informações importantes sobre PagSeguro abria e redirecionava imediatamente
- IMPACTO: Usuários não tinham tempo de ler informações sobre endereço e retirada de ingressos
- SOLUÇÃO IMPLEMENTADA:
- Botão "Confirmar Pedido" agora apenas abre o modal (não redireciona)
- Redirecionamento para PagSeguro movido para botão "Entendi, Prosseguir para Pagamento" dentro do modal
- Implementado sistema AJAX manual que replica comportamento do Parsley
- Handler específico para usuários logados (sem validação) e não-logados (com validação)
- ARQUIVOS MODIFICADOS:
pedido.php(linhas 370, 915-989)- Botão alterado para
type="button"com IDbtnConfirmarPedido - JavaScript: Handler de click abre modal direto
- JavaScript: Botão do modal executa AJAX e redireciona
- FLUXO ATUAL:
- Usuário clica "Confirmar Pedido"
- Modal abre com informações sobre endereço PagSeguro
- Usuário lê com calma (sem redirecionamento automático)
- Usuário clica "Entendi, Prosseguir para Pagamento"
- AJAX processa pedido e redireciona para PagSeguro
- STATUS: ✅ Implementado e funcionando
- PENDENTE: Verificar comportamento do
history.go(-1)no alert de validação de data
📚 Protocolo de Desenvolvimento Atualizado ✅
Data: 22/10/2025
- ATUALIZAÇÃO CRÍTICA no README.md:
- Seção específica sobre NUNCA EXECUTAR COMANDOS GIT
- Clarificado que assistente apenas PROPÕE comandos
- USUÁRIO é quem executa
git add,git commit,git push - Exemplos de erros comuns adicionados
- Fluxo correto documentado com exemplos práticos
- STATUS: ✅ Documentação atualizada
📊 IMPLEMENTAÇÕES ANTERIORES (Dezembro 2024)
🔧 Política de Privacidade e Footer Legal ✅
- FOOTER ADICIONADO: Links legais em
inc_peca.phpeinc_peca_2026.php - PÁGINAS CRIADAS:
politica-privacidade.php(LGPD) etermos-uso.php - MIGRAÇÃO HOMEPAGE:
index.phpusainc_peca.php(original atualizado) - CONFORMIDADE: Footer com Política de Privacidade, Termos de Uso e Contato
- STATUS: ✅ Ambos arquivos de header têm footer consistente
🔧 Google OAuth Login - REDIRECT LOOP CORRIGIDO ✅
- PROBLEMA: Usuários redirecionados para
myaccount.google.comapós login Google - CAUSA: Sistema salvando URLs externas em
original_pagee redirecionando para elas - SOLUÇÃO: Filtro de URLs internas - apenas
rionoteatro.com.brou/aceitas - MIGRAÇÃO:
login.phpusaaction.php(não maisaction_2026.php) - STATUS: ✅ Google OAuth funcionando corretamente - problema resolvido
🔄 Migração Crítica de Arquivos _2026.php ✅
- Google OAuth Fix: ✅ RESOLVIDO - Filtro de URLs externas implementado
- Login System Migration: Migrado
painel/login_2026.php→painel/login.phpcom design moderno - Action Handler Migration: Migrado
painel/action_2026.php→painel/action.phpcom Google OAuth - Header Migration: Migrado
includes/inc_peca_2026.php→includes/inc_peca.phpcom design responsivo - Logout Fix: Corrigido
painel/data/setup.phppara redirecionar paralogin.phpao invés delogin_2026.php - Security Enhancement: URLs externas bloqueadas - apenas internas aceitas para redirect
🔐 Sistema de Login/Logout Consolidado ✅
- Autenticação Unificada: CPF e email em um único sistema
- Google OAuth Integrado: Login social funcionando corretamente
- Redirecionamento Inteligente: Usuários retornam à página original após login
- Session Management: Sistema de sessão consolidado e funcional
- Password Recovery: Sistema "Lembrar Senha" com case
remember_2026implementado
📁 Arquivos Migrados e Corrigidos:
painel/login.php- ✅ Migrado com design 2026 e Google OAuthpainel/action.php- ✅ Migrado com handlers completosincludes/inc_peca.php- ✅ Migrado com header moderno e menu responsivopainel/data/setup.php- ✅ Corrigido logout redirect- Backups criados:
_backup_20251221.phppara todos os arquivos modificados
💾 BACKUPS CRIADOS
produtor/modulos/administradores/index_20251021.phpprodutor/modulos/administradores/detalhe_20251021.phpadmin/modulos/pecas/index_20251021.php
📊 ARQUIVOS IMPLEMENTADOS
sql_updates/fase2_adicionar_campos.sql- Scripts SQL para bancocadastro-produtor.php- Formulário público de cadastroprocessar-cadastro-produtor.php- Backend de processamentoconfirmar-produtor.php- Confirmação de e-mailadmin/modulos/pecas/notificacao-produtor.php- Sistema de notificaçõesprodutor/completar-cadastro.php- Completar cadastro existente
🎯 MELHORIAS IMPLEMENTADAS
- Documento Único: Campo RG aceita qualquer documento oficial com foto
- Sistema de E-mails: Notificações automáticas para aprovação/reprovação
- Aba de Aprovação: Interface administrativa com filtros e badges
- Validação CPF: Sistema completo de validação e unicidade
- UX Melhorado: Sistema de redirecionamento inteligente pós-login/cadastro
- Formulários Otimizados: Removidos campos desnecessários (telefone, sexo)
- Sistema UF/Cidade/Zonas: Seleção dinâmica com zonas do Rio de Janeiro
- Menu Reorganizado: Nova ordem priorizando funcionalidades principais
🔄 MIGRAÇÃO COMPLETA DOS ARQUIVOS ORIGINAIS (Dezembro 2024)
✅ ARQUIVOS ORIGINAIS 100% MIGRADOS E FUNCIONAIS
Backend/Actions:
painel/action.php✅ MIGRADO COMPLETO- ❌ REMOVIDO: case
remember_2026duplicado - ✅ MIGRADO: case
remember← funcionalidades doremember_2026 - ✅ VALIDAÇÃO SEQUENCIAL: Email primeiro, depois reCAPTCHA
- ✅ LOGS DETALHADOS: Sistema de debug completo
- ✅ REDIRECIONAMENTOS: Todos apontam para arquivos originais
Configurações e Setup:
painel/data/setup.php✅ MIGRADO COMPLETO- ✅ INCLUDES: Usa
functions.php(nãofunctions_2026.php) - ✅ LOGOUT: Redireciona para
login.php(nãologin_2026.php) - ✅ FUNÇÃO:
checkSession_2026()mantida para compatibilidade
painel/data/functions.php✅ MIGRADO COMPLETO- ✅ checkSession() ← checkSession_2026() (IDÊNTICAS)
- ✅ reCAPTCHA Enterprise: Sistema atualizado
- ✅ GLOBAL $login: Corrigido
- ✅ isset($_GET['r']): Adicionado
- ✅ exit(): Adicionado
Interface de Login e Recuperação:
painel/login.php✅ MIGRADO COMPLETO- ✅ INCLUDES: Usa
data/setup.php(correto) - ✅ LINKS: Aponta para
esqueceu_senha.php(correto) - ✅ DESIGN: Mantém design 2026
painel/esqueceu_senha.php✅ MIGRADO COMPLETO- ✅ DESIGN 2026: CSS moderno completo
- ✅ ACTION: Usa
remember(nãoremember_2026) - ✅ INCLUDES: Usa
data/setup.php(nãosetup_2026.php) - ✅ LINKS: Aponta para
login.phpeaction.php - ✅ FUNCIONALIDADE: Validação sequencial idêntica ao
_2026
painel/index.php✅ MIGRADO COMPLETO- ✅ FUNÇÃO: Usa
checkSession()(nãocheckSession_2026()) - ✅ INCLUDES: Todos corretos
Arquivos de Interface:
painel/inc-topo.php✅ SEM INCLUDES PROBLEMÁTICOSpainel/inc-menu.php✅ SEM INCLUDES PROBLEMÁTICOS
📋 MAPEAMENTO DE FUNCIONALIDADES MIGRADAS:
| Funcionalidade | Arquivo Original | Status | Observações |
|---|---|---|---|
| Login CPF/Email | action.php case login | ✅ MIGRADO | Detecta CPF automaticamente |
| Recuperação Senha | action.php case remember | ✅ MIGRADO | Validação sequencial ← remember_2026 |
| Verificação Sessão | functions.php checkSession() | ✅ MIGRADO | Idêntica ao checkSession_2026() |
| reCAPTCHA Enterprise | functions.php verify_captcha() | ✅ MIGRADO | Sistema atualizado |
| Design Moderno | esqueceu_senha.php | ✅ MIGRADO | CSS 2026 completo |
| Redirecionamento Inteligente | action.php case login | ✅ MIGRADO | Página original preservada |
🎯 RESULTADO FINAL:
- ✅ 100% dos arquivos originais possuem TODAS as funcionalidades das versões
_2026 - ✅ 0 dependências de arquivos
_2026.php - ✅ Sistema completo e funcional
- ✅ Compatibilidade total mantida
- ✅ Performance otimizada com validação sequencial
⚠️ IMPORTANTE:
Os arquivos _2026.php podem permanecer para referência, mas NÃO são mais necessários para o funcionamento do sistema. Todos os arquivos originais estão 100% atualizados e funcionais.
🔄 REGRA OFICIAL DE MIGRAÇÃO:
SEMPRE que encontrar remember_2026 pode alterar para remember
- ✅ CONFIRMADO 100%:
rememberpossui TODAS as funcionalidades doremember_2026 - ✅ Validação sequencial: Email primeiro, depois reCAPTCHA
- ✅ Logs detalhados: Sistema de debug completo
- ✅ Mensagens específicas: Tratamento de erros idêntico
- ✅ Compatibilidade total: Funciona com todos os formulários
Exemplo de migração:
```javascript
// ANTES (versão 2026)
data: { act: 'remember_2026', email: email }
// DEPOIS (versão consolidada)
data: { act: 'remember', email: email }
```
🐛 PROBLEMA GOOGLE LOGIN RESOLVIDO:
- CAUSA: Links JavaScript hardcoded para
_2026.php - CORREÇÃO: Todos os links atualizados para arquivos originais
- STATUS: ✅ Login Google funcionando corretamente
📋 STATUS DOS ARQUIVOS _2026.php:
| Arquivo Original | Arquivo _2026 | Status Migração | Funcionalidades |
|---|---|---|---|
| login.php | login_2026.php | ✅ EQUIVALENTE | Mesmas funcionalidades, links diferentes |
| action.php | action_2026.php | ✅ EQUIVALENTE | remember = remember_2026 |
| esqueceu_senha.php | esqueceu_senha_2026.php | ✅ EQUIVALENTE | Design 2026 + action remember |
| functions.php | functions_2026.php | ✅ IDÊNTICOS | Arquivos 100% iguais |
| setup.php | setup_2026.php | ✅ EQUIVALENTE | Mesmas funcionalidades, includes diferentes |
🔓 Arquivos Autorizados para Modificação (Versão 2026)
Arquivos já migrados (versão 2026 ativa):
peca.php- Página de detalhes da peça ✅pecas.php- Listagem de peças ✅ (migrado depecas_2026.php)cadastre-se.php- Página de cadastro ✅index.php- Homepage Broadway com sistema de backgrounds dinâmicos ✅ (migrado deindex_2026.php)
Módulos Admin Implementados:
admin/modulos/indexfotos/- Sistema completo de legendas para backgrounds ✅admin/modulos/slider/- Módulo de sliders integrado ao menu via banco ⚠️ (upload de imagens com problema de permissões)
✅ Arquivos Migrados (_2026.php → originais):
painel/login.php- ✅ MIGRADO (eralogin_2026.php)painel/action.php- ✅ MIGRADO (eraaction_2026.php)includes/inc_peca.php- ✅ MIGRADO (erainc_peca_2026.php) + Footer Legalindex.php- ✅ MIGRADO para usarinc_peca.phporiginal
📁 Arquivos _2026.php (STATUS DETALHADO):
painel/index_2026.php- Painel do clientepainel/esqueceu_senha_2026.php- Recuperação de senha (pronto para migrar)painel/data/setup_2026.php- Configurações e setuppainel/inc-topo_2026.php- Topo do painelpainel/inc-menu_2026.php- Menu lateral do painelcss/redesign_2026.css- CSS do novo design 2026
Funcionalidades Implementadas na Homepage 2026:
- Design Broadway - Fullscreen hero com imagens rotativas
- Sistema de backgrounds dinâmico - Detecção automática de arquivos
- Lazy loading - Carregamento otimizado das imagens
- Legendas preparadas - Sistema pronto para admin
- Cards clicáveis - Todo o card leva para a página da peça
- Responsivo - Adaptado para mobile
- Parallax effect - Efeito de profundidade no scroll
💾 Arquivos de Backup Criados (21/12/2024):
painel/login_backup_20251221.php- Backup do login originalpainel/action_backup_20251221.php- Backup do action originalincludes/inc_peca_backup_20251221.php- Backup do header originalpecas_20251019.php- Backup da listagem original
🔧 Correções Críticas Implementadas:
- Google OAuth Redirect: Corrigido
redirect_urideaction_2026.phpparaaction.php - Logout System: Corrigido redirecionamento de
login_2026.phpparalogin.php - Session Check: Função
checkSession_2026()atualizada para usar arquivos consolidados - AJAX Handlers: Todos os handlers AJAX apontando para arquivos corretos
Arquivos protegidos (NÃO modificar sem autorização):
css/style.min.css- Usado pelas páginas antigas- Todos os demais arquivos do sistema não mencionados
Shortlink de Story + UTM Dinamica por Campanha
Data: 03 de Marco de 2026
Funcionalidades:
- Novo endpoint de redirecionamento curto:
/go/<slug> - Redirecionamento com UTM dinamica por campanha ativa
- Registro de clique no
cliente_trackingcom eventostory_redirect_click - Cron de sincronizacao social atualizado para exibir shortlink no overlay do story
Arquivos modificados:
go.php(novo)admin/cron/sync_facebook_events.php.htaccess/www/server/panel/vhost/rewrite/rionoteatro.com.br.conf
Documentacao complementar:
docs/arquivo_v2026/CL-2026-03-03-shortlink-story-roi.mddocs/arquivo_v2026/BACKLOG_MARKETING_ROI_ADS_2026-03.md
Facebook/Instagram Cron: Token Long-Lived + Diagnostico de Saude (Story/ROI)
Data: 03 de Marco de 2026
Problema corrigido:
- Token de pagina expirado gerava degradacao silenciosa no cron social (IG pulado) e logs pouco objetivos.
Entregas:
- Novo endpoint de exchange long-lived:
admin/modulos/facebook/token_exchange.php. configure.php: botao de token atualizado para fluxo long-lived com escopos de pagina/instagram e fallback.FacebookEventService.php: novogetInstagramIdInfo()para diagnostico real.sync_facebook_events.php: falha explicita comexit(1)quando token invalido/expirado (code 190).monitor_story_roi.php: novos checksfacebook_token_healtheinstagram_binding_live(Graph em tempo real).
Evidencia operacional:
- Monitor agora aponta claramente token expirado e evita falso "sucesso".
- Proximo passo operacional: renovar token em
admin/modulos/facebook/configure.phpe salvar.
Documento tecnico detalhado:
docs/arquivo_v2026/CL-2026-03-03-facebook-token-long-lived-monitor.md
Marketing Playbook Automático (Google Ads + Meta Ads + Social Story)
Data: 03 de Marco de 2026
O que foi entregue:
- Novo gerador automático de ativos de divulgação:
admin/cron/generate_marketing_playbook.php. - Exporta automaticamente:
- JSON consolidado (com contexto e prompts para IA)
- CSV Google RSA
- CSV Google PMAX
- CSV Social captions (Feed/Story)
Gatilhos dinâmicos por sessão:
É Hoje,É Amanhã,Essa Semana,Estreia esta semana,Última semana,Últimas apresentações,Única apresentação, além de urgência (Últimos ingressos/Ingressos limitados).
Tracking e campanha por canal:
- Google Ads com UTM pago (
google/cpc). - Meta Ads com proteção contra fallback orgânico em mídia paga (
facebook/paid_social). - Story com shortlink
/go/<slug>e UTMstory.
Automação (cron):
15 /4 /usr/bin/php -q /www/wwwroot/rionoteatro.com.br/admin/cron/generate_marketing_playbook.php >> /www/server/cron/marketing_playbook.log 2>&1
Documentação técnica:
docs/arquivo_v2026/CL-2026-03-03-marketing-playbook-ads-social.md
Alertas WhatsApp para Crons de Marketing/ROI (Debounce + Resiliência)
Data: 03 de Marco de 2026
Objetivo:
- Notificar automaticamente o número admin do Rionoteatro sobre estado dos crons críticos sem gerar flood.
Entregas técnicas:
- Novo helper:
admin/cron/cron_whatsapp_notify.php - Debounce por chave (
min_seconds) - Persistência de estado em
admin/cron/logs/notify_state/ - Integração segura com
includes/whatsapp_helper.php - Integrações:
admin/cron/generate_marketing_playbook.php- alerta de erro de acesso/token
- alerta de erro SQL
- resumo de sucesso (throttle)
- alerta de playbook vazio
admin/cron/monitor_story_roi.php- alerta de
error(prioritário) - alerta de
warn(throttle maior) - heartbeat
ok(throttle longo) admin/cron/sync_facebook_events.php- alerta de erro de acesso/lock/SQL
- alerta crítico de token Facebook expirado/inválido
- resumo consolidado com contadores FB/IG (ok/erro)
- aviso quando não houver peça pendente
Validação executada:
php -lnos 4 arquivos alterados (100% sem erro de sintaxe).- Execução real:
php admin/cron/generate_marketing_playbook.php(OK)php admin/cron/monitor_story_roi.php(executou e retornou statuserrorpor token Facebook expirado; alerta WhatsApp disparado)
Observações operacionais:
- Houve um evento de fila no WhatsApp helper (
Attempted to use detached Frame), com fallback para queue/restart automático já existente.
Documento técnico detalhado:
docs/arquivo_v2026/CL-2026-03-03-whatsapp-alertas-crons-marketing.md
Copy dinâmico com IA (duas etapas: geração + revisão)
Data: 03 de Marco de 2026
Objetivo:
- Permitir que conteúdos de feed/story sejam gerados por IA e obrigatoriamente revisados por uma segunda IA antes de uso.
Entregas:
- Novo helper:
admin/cron/ai_copy_helper.php aiCopyRefineCaptions(...)para playbookaiCopyRefinePairMessages(...)para mensagens completas FB/IG no cron social- Fallback automático para textos atuais em qualquer falha (timeout, erro, saída vazia, review ausente/reprovada)
- Integrações aplicadas:
admin/cron/generate_marketing_playbook.php- passa a registrar
captions_source,captions_engine,captions_error - resumo com contagem IA/Fallback
admin/cron/sync_facebook_events.php- tenta refinar copy de FB/IG por IA antes de postar
- loga
Copy source,enginee motivo de fallback
Contrato de revisão por 2 IAs:
- IA 1 (geradora):
RNT_AI_COPY_PRIMARY_ENGINE/RNT_AI_COPY_PRIMARY_MODEL - IA 2 (revisora):
RNT_AI_COPY_REVIEW_ENGINE/RNT_AI_COPY_REVIEW_MODEL - revisão obrigatória por padrão:
RNT_AI_COPY_REVIEW_REQUIRED=1
Variáveis de ambiente esperadas:
RNT_AI_COPY_ENABLED(default:1)CEREBRO_COPY_ENDPOINT(endpoint do Cérebro na VPS)CEREBRO_COPY_TOKEN(opcional)CEREBRO_COPY_ENGINE,CEREBRO_COPY_MODEL(roteador externo do Cérebro)CEREBRO_COPY_PRIMARY_ENGINE,CEREBRO_COPY_PRIMARY_MODEL(geração)CEREBRO_COPY_REVIEW_ENGINE,CEREBRO_COPY_REVIEW_MODEL(revisão)CEREBRO_COPY_TIMEOUT- Compatibilidade mantida com prefixo antigo
RNT_AI_COPY_*
Validação local executada:
php -l admin/cron/ai_copy_helper.phpphp -l admin/cron/generate_marketing_playbook.phpphp -l admin/cron/sync_facebook_events.php- Execução real do playbook:
Captions IA: 0 | Fallback: 3(comportamento esperado sem endpoint configurado).
Documento técnico detalhado:
docs/arquivo_v2026/CL-2026-03-03-ia-copy-duas-ias-feed-story.md
BK-75 - Telefone de Lista WhatsApp + Ocultação de Peça de Teste nas Listagens Públicas
Data: 03 de Marco de 2026
O que foi entregue:
- Novo campo no admin de peças para definir quem recebe o link da lista via WhatsApp:
admin/modulos/pecas/detalhe.php(campotelefone_lista, aceita múltiplos separados por vírgula).admin/modulos/pecas/action.php(persistência com fallback seguro caso a coluna ainda não exista no banco).- Atualização do envio diário em
disparaemail.php: - parsing robusto de e-mails/telefones (vírgula ou
;), - prioridade para
pecas.telefone_lista, - fallback para
clientes.celulardo produtor quandotelefone_listaestiver vazio, - envio para múltiplos destinos WhatsApp com contagem de sucesso/erro.
- Script SQL de migração criado:
sql_updates/add_telefone_lista_pecas.sql- coluna adicionada sem
AFTERpara permanecer no final da tabela (compatibilidade com queries legadas por ordem de coluna). - Regra de homologação pública:
- peças com nome exato
Teste(case-sensitive) não aparecem em listagens públicas: index.php,pecas.php,eventos.php,teatros.php,teatro.php.- Busca dessas páginas permanece coerente por operar sobre os cards já renderizados.
Validação executada:
php -lsem erros em:admin/modulos/pecas/action.phpadmin/modulos/pecas/detalhe.phpdisparaemail.phpindex.phppecas.phpeventos.phpteatro.phpteatros.php
[2026-03-26] BK-171 - Botão manual para regerar pecas.xml
- a listagem de peças passou a oferecer um botão para atualizar o feed
pecas.xmlsob demanda; - o módulo reaproveita
atualizar_feed.phpe devolve status/horário ao operador.
[2026-03-26] BK-170 - Squad social automatico com provider/IA configuraveis
- configuracao oficial do Squad migrada para
robot_config.chave = squad_social_runtime_config; - aba Squad passou a salvar provider do copy, engine por etapa, fallback chain, modelo do
opencodee opinioes extras; - runtime do Cérebro passou a respeitar
runtimePreferences.steps[stepKey].engine; - cron social e approval passaram a consumir a configuracao persistida e a anexar
side_opinions. - o copy automatico passou a usar execucao sequencial com
Geminicomo editor final e tolerancia a falha/budget nas opinioes extras.
BK-76 - Ajustes de Rota/Carrossel e Layout de Evento Fora de Cartaz
Data: 03 de Marco de 2026
O que foi entregue:
- Correção de rota para eventos de produtor com parceria online nas listagens:
eventos.phpeteatro.phpagora apontam para/<slug>(layout de peça) quandoparceria_online = 1.- Mantém
/evento/<slug>apenas para eventos de produtor sem parceria online.
[2026-04-12] BK-267: unificação de duplicatas do BOT + CTA por sessão + classificação padronizada no front
bot/handlers/event_matcher.phppassou a distinguir melhorsame_external_linkesame_session_duplicate, priorizandoAtualizaçõesquando a origem é a mesma e fortalecendo a identificação de duplicatas reais por sessão/local.- follow-up do matcher no mesmo BK:
- mudança isolada de preço agora deixa rastro em
Atualizaçõesem vez de sumir quando não houve adição/remoção de sessão; - auto-update de sinopse em evento aprovado só ocorre quando há identidade mínima forte (
mesmo link externooumesmo nome + mesmo local + mesma sessão). admin/modulos/eventos/conciliacao.phpganhou a açãoUnificardentro deProváveis Duplicatas.admin/modulos/eventos/action.phppassou a persistirsec_link_externoemtab_sessoese a sustentar o fluxo de unificação sem perder o link externo correto por data/sessão.evento.phppassou a abrir modal de escolha de data quando existir mais de um link externo futuro por sessão.evento.phpganhou os minicardsValor IndicativoeClassificação.peca.php,evento.php,pecas.phpeeventos.phpreceberam padronização editorial da classificação etária com selo visual, tooltip operacional e sem uso indevido do símbolo18+em faixas menores.docs/documentacao_tecnica/BOT_CAPTADOR_EVENTOS.mdfoi atualizada com as regras vivas de duplicatas, atualizações, unificação, cautela com preço e escopo fora da rodada.
[2026-04-12] BK-269: aprovados similares + retorno para a mesma aba na conciliação
admin/modulos/eventos/conciliacao.phpganhou a abaAprovados Similares, com corte operacional de75%e priorização pormesmo_slug/mesmo_teatro.- a aba nova expõe pares de eventos já aprovados com links, datas, teatro, score e ações manuais de mesclagem nas duas direções.
admin/modulos/eventos/action.phpganhou a actionconciliar_unificar_aprovados.- a mesclagem manual de aprovados bloqueia o evento de origem quando ele possui pedidos, para evitar desativação indevida.
- o fluxo de submit/redirect da conciliação passou a preservar a aba ativa via
return_tab.
- Redirecionamento de segurança no
evento.php: - se acessar
/evento/<slug>de um evento comparceria_online = 1, redireciona para/<slug>. - Carrossel de ofertas no topo de páginas internas atualizado para refletir a mesma regra da home:
- inclui peças admin + parcerias online (
id_produtor IS NULL OR parceria_online = 1); - exclui peça técnica
nome = 'Teste'. - aplicado em
peca.phpeevento.php. - Layout público de evento fora de cartaz restaurado em modo enxuto (
evento.php): - não redireciona mais para lista;
- mostra aviso de fora de cartaz/desatualizado;
- mantém gênero, sinopse e contato (Mais Informações/WhatsApp);
- oculta foto, duração, local e ficha técnica;
- período exibido como
Sem informações.
Ajuste complementar (BK-77 - 03/03/2026):
- regra de layout enxuto fora de cartaz aplicada para qualquer rota pública
/evento/...comfim_temporadano passado (não apenas eventos de produtor).
Validação executada:
php -lsem erros em:eventos.phpteatro.phppeca.phpevento.php
[2026-04-03] BK-207: Migração PagBank Orders API
- Migração de Cartão e PIX para API de Orders (JSON).
- Desativação global de Boleto.
- Patch de backup: pagbank_migration_BK207.patch
[2026-04-08] BK-228: parceria gratuita, créditos e alertas no dashboard admin
painel/modulos/eventos/editar.phprecebeu CTA próprio da parceria com visual alinhado ao layout e persistência do fluxo de salvar + WhatsApp.painel/modulos/eventos/ajax_notificar_parceria.phppassou a enviar alerta duplo para admin +5521999915554, com link direto para o cadastro do produtor.painel/modulos/creditos/action.phpepainel/modulos/creditos/callback_mp.phppassaram a avisar os dois destinos na contratação e na aprovação de pacotes.admin/index.phpganhou bloco de ativações recentes de produtores com ocultação manual por item.- changelog detalhado:
docs/changelog/2026/CL-2026-04-08-BK-228-parceria-creditos-alertas-admin.md
[2026-04-08] BK-231: upload rápido no dashboard admin
admin/index.phpganhou widget de upload rápido com retorno de link público.admin/upload_dashboard_arquivo.phppassou a suportar upload, listagem e exclusão emarquivos/download.arquivos/download/.htaccesspassou a bloquear execução de script e indexação.- changelog detalhado:
docs/changelog/2026/CL-2026-04-08-BK-231-upload-dashboard-admin.md
[2026-04-13] BK-267: performance da conciliação por aba ativa
admin/modulos/eventos/action.phppassou a devolver a aba de retorno como?tab=<aba>#<aba>, em vez de depender só de hash.admin/modulos/eventos/conciliacao.phppassou a renderizar pesado apenas a aba ativa no request inicial.- a navegação entre abas da conciliação passou a recarregar a tela com
tab=para que o servidor monte só o conteúdo necessário. getAprovadosSimilaresConciliacao()deixou de executarCOUNT(pedidos)por evento e passou a pré-carregar os totais em uma query agrupada.admin/modulos/eventos/conciliacao_eventim.phprecebeu paridade funcional das melhorias da trilha Sympla:DuplicatascomUnificar, links dos dois lados e preservação de produtor/origemReativar,Aprovados,Aprovados SimilareseIgnoradosno mesmo padrão operacional- navegação por
tab=e render pesado apenas da aba ativa também no Eventim
[2026-04-13] BK-270: roadmap de base única para conciliação multi-fonte
- aberto roadmap para unificar a estrutura compartilhada entre
conciliacao.phpeconciliacao_eventim.php - objetivo: manter uma base única com configuração por fonte (
sympla/eventim) e reduzir drift futuro entre as duas telas
[2026-04-13] BK-271: carrossel flutuante em eventos + scroll direcional
eventos.phppassou a injetar o carrossel flutuante de ofertas no#carousel-placeholderpúblicoevento.phpeeventos.phppassaram a esconder o carrossel ao rolar para baixo e mostrar ao rolar para cima- o selo de classificação dentro do carrossel foi reduzido para a versão mini, sem o texto redundante
- as duas páginas receberam comentário HTML versionado para validação do admin no código-fonte
- subfix adicional: o carrossel deixou de depender apenas do frame atual do scroll e passou a manter estado persistente de visibilidade, eliminando o flicker ao parar de rolar
- follow-up de estabilidade/performance em
eventos.php: - o shell do carrossel passou a clipar overflow horizontal e a sincronização no scroll foi amortecida por
requestAnimationFrame - a vitrine passou a revelar cards por lote sem AJAX:
12iniciais e+6ao aproximar do fim da tela - cards ocultos preservam metadata para busca/agenda, mas só carregam a imagem real quando ficam visíveis
- a trilha AJAX parcial gerada por worker externo foi descartada antes do fechamento para evitar regressão de layout/rodapé
- follow-up do header público:
includes/inc_peca.phpdeixou de adicionarheader-fixedeheader-scrolledaobodydas páginas públicas- o header continua com efeito visual de scroll no próprio
.rnt-header, mas a página pública voltou a sair com<body>limpo - simplificação final em
eventos.php: - o carrossel volta a iniciar oculto e, no primeiro scroll para cima após o trigger, fica travado como visível
- ele não volta mais a esconder por scroll
- espelhamento da mesma regra final em
evento.php: - o carrossel da página individual também passa a iniciar oculto e travar como visível no primeiro scroll para cima após o trigger
2026-05-17 - Feedback automatico pos-evento
- Criada rotina CLI
admin/cron/post_event_feedback_queue.phppara montar campanha/fila WhatsApp de feedback para compradores de ingressos 1 dia apos a sessao. - Criado helper
includes/post_event_feedback_helper.phpcom texto da mensagem, correlacao de resposta WhatsApp e gravacao de avaliacao pendente emtb_avaliacoes. - O feedback do cliente passa a ser recebido por resposta direta no WhatsApp, sem link/formulario publico na mensagem.
admin/modulos/comentarios/index.phppassou a permitir editar nota, comentario e status antes de aprovar/publicar a avaliacao.- A fila nasce em
whatsapp_campaigns/whatsapp_campaign_queuecomdry_run_only=1,status='imported'e janela neutra00:00-23:59; envio real continua dependendo da aprovacao/processamento do fluxo WhatsApp existente. - Agendado cron diario as 19h para criar automaticamente a fila D+1:
post_event_feedback_queue.php --execute --confirm=POST_EVENT_FEEDBACK_QUEUE. - Backups criados antes da edicao/configuracao:
docs/CHANGELOG.md.bkp_original_20260517_162942,admin/modulos/comentarios/index.php.bkp_original_20260517_164000,/root/AGENTS.md.bkp_original_20260517_162942,/root/crontab.root.bkp_original_20260517_162942.
Ajuste da mesma rodada - resposta direta no WhatsApp
- A mensagem D+1 passou a usar acentuacao normal em portugues e nao inclui mais link.
- A assinatura do remetente no corpo foi ajustada para
Rio no Teatro, evitando texto com.comlinkavel automaticamente pelo WhatsApp. - O texto agora orienta o cliente a responder no proprio WhatsApp com nota de 1 a 5 e comentario, sem link e sem opt-out no corpo.
bot/whatsapp/webhook.phpebot/whatsapp/cloud_webhook.phppassaram a chamar o helper de feedback pos-evento quando uma mensagem recebida chega.includes/post_event_feedback_helper.phpagora localiza o ultimo envio pos-evento efetivamentesentdaquele telefone e pre-inclui a resposta emtb_avaliacoescomopendente.- Apos processar uma resposta, a fila recebe marcador
feedback_received, impedindo reprocessamento/reescrita ao reabrir o chat. admin/modulos/bot/whatsapp.phppassou a reconciliar mensagens recebidas recentes ao carregar a conversa, cobrindo respostas que entraram no historico sem processamento pelo webhook.- Backups adicionais:
includes/post_event_feedback_helper.php.bkp_original_20260517_171000,admin/cron/post_event_feedback_queue.php.bkp_original_20260517_171000,bot/whatsapp/webhook.php.bkp_original_20260517_171000,bot/whatsapp/cloud_webhook.php.bkp_original_20260517_171000,admin/modulos/bot/whatsapp.php.bkp_original_20260518_150300,docs/CHANGELOG.md.bkp_original_20260517_171000,/root/AGENTS.md.bkp_original_20260518_150300.
Ajuste da mesma rodada - texto sem opt-out
- Removida a frase
Se não quiser receber novas mensagens, responda SAIR.da mensagem pos-evento. includes/whatsapp_campaign_queue.phppassou a pular a injecao automatica de opt-out apenas para campanhaspost_event_feedback/variantepost_event, preservando o opt-out das campanhas comerciais comuns.- Atualizadas as mensagens pendentes da campanha pos-evento existente para refletir o texto sem opt-out.
- Enviado teste WhatsApp com o
message_bodyreal doqueue_id=9735(Hamlet, sessao2026-05-16 20:00:00) para a allowlist admin5521999915554; provider local retornou sucesso. - Backups adicionais:
includes/post_event_feedback_helper.php.bkp_original_20260518_151900,includes/whatsapp_campaign_queue.php.bkp_original_20260518_152500,docs/CHANGELOG.md.bkp_original_20260518_151900.
Ajuste de texto pos-evento - 2026-05-19
- Substituida a frase de revisao/comunidade na mensagem pos-evento por:
Seu comentário poderá aparecer na página da peça para ajudar outros espectadores a conhecerem bons espetáculos e fortalecer uma comunidade em que milhares de clientes se beneficiam. - Backups adicionais:
includes/post_event_feedback_helper.php.bkp_original_20260519_104500,docs/CHANGELOG.md.bkp_original_20260519_104500,/root/AGENTS.md.bkp_original_20260519_104500.
Entradas detalhadas
- CL-BK-221 · Login admin com retorno para a URL originalmente solicitada
- CL-BK-219 · Botão Lista no painel de eventos do cliente-produtor
- CL-BK-214 - Checkout PIX Dark Theme
- CL-BK-208 · Checkout PIX dark + Mercado Pago total correto
- CL-BK-196 · Saneamento dos warnings de tracking e Meta no console
- CL-2026-04-29 - BK-280 documentação da política de shortlinks
- CL-2026-04-29 - BK-279 roadmap shortlink automático em Campanhas
- CL-2026-04-29 - BK-278 shortlinks WhatsApp
- CL-2026-04-29 - BK-277 dry-run WhatsApp Zona Norte
- CL-2026-04-28 - BK-276 - Lock operacional local fora do GitHub
- CL-2026-04-28 - BK-275 - Hotfix 502 no Gerar com IA do Texto para Audio
- CL-2026-04-27 - Hotfix Mercado Pago valor unitario
- CL-2026-04-27 - Hotfix feed pecas no ultimo dia da temporada
- CL-2026-04-12 - BK-266 - Banners Google antes dos blocos de evento
- CL-2026-04-12 - BK-265 - Badge vermelho para venda externa em evento
- CL-2026-04-12 - BK-264 - Badge duplicado Bot/BOT no admin de peças
- CL-2026-04-11 - BK-258 - Detalhe Mercado Pago no admin de pedidos_2
- CL-2026-04-10 - Hotfix curto: dias e horários também nos cards da home
- CL-2026-04-10 - BK-200 encerrado: dias e horarios em peca.php e pecas.php
- CL-2026-04-10 - BK-194 encerrado: Add Peca com IA
- CL-2026-04-09-BK-246 - docs/LOCK.md so durante edicao real
- CL-2026-04-09-BK-245 - Hotfix de ultimo dia em peca.php
- CL-2026-04-09-BK-244 - Hotfix de performance no painel de pedidos
- CL-2026-04-09-BK-243 - Regra local de DONE vs UNLOCKED no LOCK
- CL-2026-04-09-BK-242 - Inativação automática de peças vencidas no admin
- CL-2026-04-09-BK-241 - Hotfix da Central de Cancelamento para peças online
- CL-2026-04-08-BK-240 - Upload rápido do admin com suporte a imagens
- CL-2026-04-08-BK-239 - Unificacao documental de docs com AGENTS como entrada principal
- CL-2026-04-08-BK-236 - Fechamento do produtor sem seletor de período e sem RG
- CL-2026-04-08-BK-231
- CL-2026-04-08-BK-228
- CL-2026-04-08-BK-227
- CL-2026-04-08-BK-225
- CL-2026-04-07-BK-224
- CL-2026-04-07-BK-223
- CL-2026-04-07-BK-222
- CL-2026-04-07-BK-183
- CL-2026-04-03-BK-201
- CL-2026-03-27-BK-182
- CL-2026-03-27-BK-181
- CL-2026-03-26-BK-172
- CL-2026-03-26-BK-171
- CL-2026-03-26-BK-170
- CL-2026-03-25-BK-165 · Feed XML no path correto + PalcoFan visível + conciliação Sympla alinhada
- CL-2026-03-25-BK-164 · PalcoFan no dashboard/peça + auditoria do `pecas.xml`
- CL-2026-03-25-BK-160 · Carrossel semanal cover por peça
- CL-2026-03-20-BK-151 · Brand profile bootstrap do RNT
- CL-2026-03-19-BK-158 · Saneamento P0 de credenciais expostas
- CL-2026-03-19-BK-150 · Loop de metricas do Squad com `social_post_metrics_history`
- CL-2026-03-19-BK-149 · Hardening de permissoes e arquivos runtime do social
- CL-2026-03-19-BK-148 · Modularizacao segura de `redes_sociais.php` (fase 1)
- CL-2026-03-19-BK-147 · Visibilidade operacional da ponte social na Central de Redes Sociais
- CL-2026-03-19-BK-132 · Endurecimento do fluxo de prova de Story manual/notificado
- CL-2026-03-18-BK-138 - Fix Approval Payloads
- CL-2026-03-18-BK-137 · Fluxo social reconciliado com gate criativo, WhatsApp e prova de rascunho
- CL-2026-03-18-BK-136
- CL-195 - Análise de mídia e tração 2024 x 2025 x 2026
- CL-194 - Hotfix do embed do Add Peça com IA
- CL-194 - Primeira fase do Add Peça com IA
- CL-193 - Hardening inicial da frente Meta Ads
- CL-192 - Plano de GA4 Data API e Meta Ads API read-only
- CL-191 - Rascunho inicial de Google Ads e Meta Ads
- CL-190 - Padronização de ARCHITECTURE.md e GUIDELINES.md
- CL-189 - Google Ads em rascunho para aprovação humana
- CL-187-governanca-root-no-pull
- CL-186-wa-chat-cancelamento
- CL-2026-03-21-BK-159 - Correção Layout Mobile Lista