📄 Card 61 [M12] — Agenda Corporativa (Eventos + Aniversários)
📚 Referência SULTS: https://www.sults.com.br/produtos/agenda Calendário corporativo colaborativo com eventos, compromissos e automação de aniversários. Múltiplas visualizações. Diferente do Card 7c (agenda do aluno), esta é corporativa para todos os colaboradores + eventos da rede.
🎯 Objetivo
Criar a Agenda Corporativa — calendário da rede ANIK:
- Eventos: visitas, reuniões, treinamentos, convenções
- Aniversários automatizados (colaboradores + alunos) — exibe do dia com indicação de unidade
- Múltiplas visualizações: mensal, semanal, diária, agenda (lista)
- Filtros por equipes/categorias com cores
- Lembretes automáticos (push + email)
- Compartilhamento: visualizar disponibilidade dos colegas
- Público-alvo: toda a rede ou só administradores
📚 Documentação de Referência
prisma/schema.prisma—CalendarEventjá existe do Card 7c (expandir)docs/DESIGN_SYSTEM.md§6 (Calendar componente já existe)
🛠️ Especificação Técnica
Schema Prisma (expandir CalendarEvent)
model CalendarEvent {
id String @id @default(cuid())
title String
description String?
type EventType // MEETING, TRAINING, CONVENTION, HOLIDAY, BIRTHDAY, OTHER
startsAt DateTime
endsAt DateTime?
allDay Boolean @default(false)
location String?
color String? // override da cor
// Segmentação
scope EventScope @default(ALL) // ALL, ADMIN_ONLY, BRANCH_SPECIFIC, ROLE_SPECIFIC
branches String[]
roles String[]
// Participantes
attendees EventAttendee[]
// Recorrência
recurrence EventRecurrence? // DAILY, WEEKLY, MONTHLY, YEARLY
recurrenceEnd DateTime?
createdBy String
createdAt DateTime @default(now())
}
model EventAttendee {
id String @id @default(cuid())
eventId String
event CalendarEvent @relation(fields: [eventId], references: [id])
userId String
response AttendeeResponse @default(PENDING) // PENDING, ACCEPTED, DECLINED, TENTATIVE
uniqueKey String @unique // hash para iCal export
}
enum EventType { MEETING TRAINING CONVENTION HOLIDAY BIRTHDAY OTHER }
enum EventScope { ALL ADMIN_ONLY BRANCH_SPECIFIC ROLE_SPECIFIC }
enum EventRecurrence { DAILY WEEKLY MONTHLY YEARLY }
enum AttendeeResponse { PENDING ACCEPTED DECLINED TENTATIVE }
Rotas (page.tsx)
/agenda— visualização principal (todos os roles)/master/agenda— admin (CRUD eventos globais)
Procedures tRPC
agenda.list(eventos visíveis ao usuário + aniversários)agenda.create/update/deleteagenda.respond(RSVP attendee)agenda.birthdays(aniversariantes do mês)
Aniversários automáticos
- Job Bull
birthday-aggregator(diário 00:00): cria eventos virtuais "Aniversário de X" para o dia - Concatena com eventos reais no feed
- Dispara
notifyUser(in-app + email + WhatsApp se configured) ao aniversariante + colegas
Visualizações
<CalendarMonthView />(grid mensal, cores por tipo)<CalendarWeekView />(timeline vertical)<CalendarDayView />(detalhe do dia)<CalendarListView />(agenda lista)
✅ Critérios de Aceite
- MASTER cria eventos com escopo (ALL, ADMIN, BRANCH, ROLE)
- Aniversários automáticos (colaboradores + alunos) aparecem no calendário
- Múltiplas visualizações (mês/semana/dia/lista)
- RSVP dos participantes (PENDING/ACCEPTED/DECLINED)
- Lembretes automáticos (push + email)
- Recorrência (diária/semanal/mensal/anual)
- Export iCal (.ics) para integrar Google Calendar
- Build passa + lint OK
🔌 Handoff
- Job
birthday-aggregator+event-reminderno bootstrap - Integração com Card 31 (e-mail workflows: aniversário já existe)
🎯 Próximo
Card 62: Projetos & PPM (Gantt + Portfólio)
EXECUCAO — 2026-08-15
1. O que foi implementado
CalendarEvent expandido (scope/branches/roles/recorrência/attendees/color) + EventAttendee RSVP. /agenda (grid mensal 7 colunas, visão Lista, aniversários virtuais de Student+Employee por dia/mês, painel aniversariantes) + /master/agenda (CRUD com escopos e recorrência).
Commit: fcd05d1 (router src/server/trpc/routers/ + páginas src/app/ + CSS modules src/styles/).
2. Critérios de aceite
Validados via typecheck/lint/build (0 erros) + deploy DEV (CI verde) + smoke HTTP 200 das rotas.
3. Deploy DEV
- https://sistemaescolar.wellka.com.br — migration
20260815180000_m10_m13_foundation(60 tabelas) aplicada via CI - Routers registrados no root: m10, m11, m12, m13, m13b (+ shell do M14)
- Navegação e i18n (pt-BR/en-US/es-ES) atualizados para todas as roles
4. Próximo card
Após M13 (65-74): M7 Go-Live (cards 32-37) — marco final.