--- name: aprovacao-link-sem-expiracao-2026-05-13 description: Regra atual de expiração dos links de aprovação social (planejamento e publicação individual) metadata: node_type: memory type: project originSessionId: 93abc636-0896-4e4e-9efe-8ac423bf4430 --- # Aprovacao Social: link so expira por acao do cliente (2026-05-13) Regra antiga (REMOVIDA): link de publicacao individual expirava em **4 horas**, e cron `autoAprovar()` aprovava sozinho. Cliente que nao respondia em 4h tinha conteudo publicado a revelia. Regra atual (vigente desde 2026-05-13): **Link de PLANEJAMENTO** (cronograma com varios posts) — `/aprovacao-cronograma/`: - Nao expira por tempo - So fica indisponivel quando **TODOS** os posts pendentes ja foram aceitos/aprovados/publicados - Verificacao em `app/Controllers/AprovacaoCronograma.php:index()` — `if (empty($posts)) → view expirado motivo=ja_processado` - Cliente pode aprovar/rejeitar UM post por vez, link continua valido enquanto sobrar pendente **Link de PUBLICACAO INDIVIDUAL** (1 post = 1 link) — `/aprovacao/`: - Nao expira por tempo - So invalida quando cliente **aprova** ou **rejeita** (pois e link individual) - aprovar() zera `aprovacao_token` e seta `aprovacao_status='aprovado'` - rejeitar() seta `aprovacao_status='rejeitado'` (validarToken exige `pendente`) **Why:** Cliente perdia janela de revisao por 4h e tinha conteudo publicado sem ver. Designer reenviar precisava ficar bombardeando WhatsApp pedindo "ainda da tempo de aprovar". Sem expiracao, cliente revisa quando pode. **How to apply:** - Quando criar/editar posts em `SocialMedia.php`, sempre `aprovacao_token_expira = null` (linhas 599 e 882) - Quando enviar via `SocialDemandaService::criarDemandaParaPost`, idem (linha 395) - Reenvio apos rejeicao: designer edita post no painel, clica "Enviar para aprovacao" → gera novo token, expira=null (mesmo fluxo) - NUNCA reativar `CronSocialMedia::autoAprovar()` — endpoint desativado retorna no-op - Cron job pode continuar batendo no endpoint, esta inerte **Endpoints/codigo afetados:** - `app/Controllers/SocialMedia.php:599,636,882` - `app/Controllers/AprovacaoCronograma.php:51` (bloqueio quando posts vazios) - `app/Controllers/CronSocialMedia.php:autoAprovar()` (no-op) - `app/Libraries/SocialDemandaService.php:395` - `app/Views/social_media/index.php:273,864,1231,1783` (textos) - `app/Views/aprovacao_publica/expirado.php:32` - `app/Config/Routes.php:1641` **Verificacoes em controllers de aprovacao** (mantidas como salvaguarda): - `AprovacaoPublica.php:36,329` — `if (!empty(aprovacao_token_expira) && expirou)` segue passando quando NULL - `AprovacaoExterna.php:45,92` — idem Mantidas para defesa retroativa caso alguem repopule manualmente o campo.