✅ EXECUÇÃO — 15/08/2026
Implementado e validado em produção (homolog). Commits: 2062f6c (fundação: 21 tabelas), 080c857 (features), bbfa277 (lint). Deploy CI verde.
Validação ao vivo: página(s) da feature respondendo 200 com a role correta + procedures tRPC testadas via HTTP (respostas JSON corretas). Ver relatório da sessão.
Detalhes de implementação e decisões: conforme o design acima deste documento (schema, procedures e páginas seguidos conforme especificado; ajustes menores documentados no commit).
📄 Card 44 [M8] — Notícias Institucionais (Painel Home Customizado)
📚 Referência SULTS: https://www.sults.com.br/produtos/noticias Módulo de comunicação institucional que posiciona atualizações na home do sistema (não em aba escondida). Garante visualização imediata ao logar. Funciona como memória institucional pesquisável.
🎯 Objetivo
Criar o módulo Notícias Institucionais — um feed de comunicações da escola/rede exibido em destaque nas Homes de todos os roles (Master/Local/Professor/Aluno/Pai), com:
- Carrossel de 4 cards automáticos (imagem + título + categoria)
- Destaque (artigo em evidência com capa + prévia)
- Feed navegável (acervo cronológico pesquisável, filtrável por período/título)
- Segmentação por filial (toda a rede, unidades selecionadas ou só interna)
📚 Documentação de Referência
docs/DESIGN_SYSTEM.md§6 (Recharts não se aplica; usar componentes nativos)prisma/schema.prisma— criar modelNews(similar aoAnnouncementmas rico)- Padrão visual: Cards arredondados ~12px, cores Design System GENIOON
🛠️ Especificação Técnica
Schema Prisma (novo)
model News {
id String @id @default(cuid())
title String
slug String @unique
summary String @db.VarChar(280) // prévia curta
content String @db.Text // editor rico (markdown/HTML)
coverImageUrl String? // S3/MinIO
category String? // "Lançamentos", "Resultados", "Eventos"
isFeatured Boolean @default(false) // aparece no carrossel/destaque
isPublished Boolean @default(false)
publishedAt DateTime?
targetScope NewsScope @default(ALL) // ALL, BRANCH_SPECIFIC, INTERNAL
branches NewsBranch[] // se BRANCH_SPECIFIC
roles NewsRole[] // MASTER/LOCAL/PROFESSOR/STUDENT/PARENT
authorId String
author User @relation(fields: [authorId], references: [id])
viewCount Int @default(0)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
enum NewsScope { ALL BRANCH_SPECIFIC INTERNAL }
enum NewsRole { MASTER SUPERVISOR LOCAL ATTENDANT PROFESSOR STUDENT PARENT }
Rotas (page.tsx) — novas
/master/noticias— painel admin (CRUD + criar + editar + agendar publicação)/noticias— feed público dos usuários (acervo pesquisável, acesso após login)- Componente
<NewsCarousel />injetado na Home de cada role (carrossel 4 cards) - Componente
<NewsHighlight />injetado na Home (destaque principal)
Procedures tRPC (novo sub-router master.news)
list(com filtros: categoria, período, scope, published/draft)create/update/delete/publish/unpublishfeatured(retorna 4 para carrossel + 1 destaque)feed(para/noticias— paginação cursor)trackView(incrementa viewCount, idempotente por IP+userId)
Upload capa
- Reusar
/api/uploadexistente (Card 15) → S3/MinIO bucketnews-covers - Tamanho máx 2MB, formatos JPG/PNG/WEBP
✅ Critérios de Aceite
- MASTER cria/edita/exclui/agenda notícias no painel admin
- Home de cada role mostra carrossel de 4 cards automáticos + 1 destaque
- Página
/noticiaslista acervo com filtros (categoria, período, busca) - Segmentação: notícia
BRANCH_SPECIFICsó aparece pra quem é da filial viewCountincrementa ao abrir (idempotente)- Upload de capa funcional (S3/MinIO)
- Build passa + lint OK
🔌 Handoff
- Componentes reutilizáveis:
<NewsCarousel />,<NewsHighlight />,<NewsCard /> - Procedures em
master.news.*(MASTER-only create/edit; outros roles leem)
🎯 Próximo
Card 45: Disco Virtual (drive 3 níveis)