📄 Card 74 [M13] — Funcionários (RH Escolar)
📚 Referência Genius:
/funcionario+/funcionario/estatisticas— "Passo 3: Cadastre um(a) professor(a)" 🔥 GENIOON hoje só temTeacher(vinculado a professor). Falta cadastro de outros funcionários (secretária, coordenador, atendente, faxineiro, segurança).
🎯 Objetivo
Criar o módulo Funcionários (RH Escolar) — cadastro completo de colaboradores da escola:
- Cadastro de funcionários (além de professores): secretária, coordenador, atendente, etc
- Cargos e funções configuráveis
- Vínculo com User (login sistema) opcional
- Dados contratuais: admissão, demissão, salário, carga horária, férias
- Documentos: RG, CPF, CTPS, PIS, certidões
- Hierarquia: chefe direto
- Estatísticas (headcount por cargo, filial, período)
📚 Documentação de Referência
prisma/schema.prisma—User+Teacher- Card 25 (Gestão Usuários RBAC)
🛠️ Especificação Técnica
Schema Prisma (novo)
model Employee {
id String @id @default(cuid())
userId String? @unique // login (opcional)
user User? @relation(fields: [userId], references: [id])
branchId String
branch Branch @relation(fields: [branchId], references: [id])
// Pessoal
fullName String
cpf String @unique
rg String?
birthDate DateTime?
photoUrl String?
address Json?
phone String?
email String?
// Contrato
jobTitle String // "Secretária", "Coordenador"
role EmployeeRole // ADMINISTRATIVE, PEDAGOGICAL, OPERATIONAL, SUPPORT
employmentType EmploymentType // CLT, PJ, FREELANCE, INTERNSHIP
admissionDate DateTime
terminationDate DateTime?
status EmployeeStatus @default(ACTIVE) // ACTIVE, ON_LEAVE, TERMINATED
salary Decimal? @db.Decimal(10, 2)
workloadHoursWeek Int? // carga horária semanal
// Hierarquia
managerId String?
manager Employee? @relation("EmployeeHierarchy", fields: [managerId], references: [id])
subordinates Employee[] @relation("EmployeeHierarchy")
// Documentos
ctpsNumber String? // Carteira Trabalho
pisNumber String?
documents Json? // {rg: {url}, cpf: {url}, certidoes: []}
// Benefícios
benefits Json? // {valeRefeicao, valeTransporte, planoSaude}
// Férias
vacations Vacation[]
notes String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model Vacation {
id String @id @default(cuid())
employeeId String
employee Employee @relation(fields: [employeeId], references: [id])
startDate DateTime
endDate DateTime
days Int
status VacationStatus @default(REQUESTED) // REQUESTED, APPROVED, CANCELLED, ENJOYED
requestedAt DateTime @default(now())
approvedAt DateTime?
approvedById String?
notes String?
}
enum EmployeeRole { ADMINISTRATIVE PEDAGOGICAL OPERATIONAL SUPPORT }
enum EmploymentType { CLT PJ FREELANCE INTERNSHIP }
enum EmployeeStatus { ACTIVE ON_LEAVE TERMINATED }
enum VacationStatus { REQUESTED APPROVED CANCELLED ENJOYED }
Rotas
/master/funcionarios— lista + filtros (cargo, filial, status)/master/funcionarios/novo— cadastro/master/funcionarios/[id]— detalhe (documentos, férias, alterações)/master/funcionarios/[id]/ferias— solicitar/aprovar férias/master/cargos— admin cargos
Procedures tRPC (master.employees)
list(filtros)create/update/terminatelinkUser(vincular a User de login)requestVacation/approveVacationdashboard(headcount, turnover, custos)statistics(por cargo, filial, período)
Integração
- Ao cadastrar Professor no Card 12, opcionalmente cria Employee com role=PEDAGOGICAL
- Cargos podem ser vinculados a permissões RBAC (Card 25)
✅ Critérios de Aceite
- MASTER cadastra funcionários (todos os tipos, não só professores)
- Vínculo opcional com User (login sistema)
- Dados contratuais (admissão, salário, carga horária)
- Documentos anexáveis (RG, CPF, CTPS, PIS)
- Hierarquia (chefe direto)
- Solicitação/aprovação de férias
- Estatísticas (headcount, turnover, custo total)
- Build passa + lint OK
🔌 Handoff
- Integração Card 25 (User) e Card 12 (Professor)
- Cargos configuráveis (não hardcoded)
🎯 Próximo
Card 75: Novo AdminShell (M14 - Redesign Visual)
EXECUCAO — 2026-08-15
1. O que foi implementado
Employee (CLT/PJ/FREELANCE/INTERNSHIP, hierarquia chefe, documentos CTPS/PIS Json, benefícios) + Vacation (solicitar/aprovar). /master/funcionarios: CRUD completo, vínculo com User, demissão, férias em modal, dashboard (headcount por cargo/filial, turnover, custo salarial).
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.