📄 Card 53 [M10] — Universidade Corporativa (LMS para Colaboradores)
📚 Referência SULTS: https://www.sults.com.br/produtos/universidade-corporativa Plataforma LMS para cursos, trilhas de aprendizagem, provas por etapa, certificados e formações progressivas. Destinada a capacitação de colaboradores (professores, coordenadores, atendentes, diretores), diferente do EAD pedagógico do Card 5/15 (que é para alunos).
🎯 Objetivo
Criar o módulo Universidade Corporativa — LMS para capacitação interna de colaboradores da rede ANIK:
- Cursos multi-mídia (vídeos YouTube + textos + PDFs divididos em módulos)
- Trilhas de aprendizagem com pré-requisitos e sequências obrigatórias
- Provas por etapa ao final de cada módulo (reprovação → refaz módulo inteiro)
- Certificados personalizáveis (geração automática após aprovação)
- Formações progressivas (agrupam cursos com intervalo de maturação)
- Gamificação: rankings de conclusão e notas entre colaboradores
- Integração com Checklist (não conformidades → conteúdo) + Chamados (recorrentes → treinamento)
📚 Documentação de Referência
docs/ARQUITETURA.md— EAD layer (YouTube unlisted já é padrão)prisma/schema.prisma— reusarModule,Lessondo aluno + novos modelsdocs/execucao/05-m1-materiais-didaticos.md— referência do EAD aluno
🛠️ Especificação Técnica
Schema Prisma (novo)
model CorpCourse {
id String @id @default(cuid())
title String
description String @db.Text
coverImageUrl String?
category String // "Pedagógico", "Comercial", "Operacional"
targetRoles String[] // PROFESSOR, LOCAL, ATTENDANT, etc.
difficulty CourseDifficulty @default(BEGINNER) // BEGINNER, INTERMEDIATE, ADVANCED
estimatedHours Int?
modules CorpModule[]
isPublished Boolean @default(false)
certificateTemplateId String? // Card 56
createdBy String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model CorpModule {
id String @id @default(cuid())
courseId String
course CorpCourse @relation(fields: [courseId], references: [id])
title String
order Int @default(0)
lessons CorpLesson[]
examQuestions Json? // prova do módulo
passingScore Float @default(70)
}
model CorpLesson {
id String @id @default(cuid())
moduleId String
module CorpModule @relation(fields: [moduleId], references: [id])
title String
type LessonType // VIDEO, TEXT, FILE, QUIZ
youtubeUrl String? // YouTube unlisted (padrão GENIOON)
content String? @db.Text // se TEXT
fileUrl String? // PDF/etc
durationMin Int?
order Int @default(0)
}
model CorpEnrollment {
id String @id @default(cuid())
courseId String
course CorpCourse @relation(fields: [courseId], references: [id])
userId String
user User @relation(fields: [userId], references: [id])
status EnrollmentStatusCorp @default(NOT_STARTED) // NOT_STARTED, IN_PROGRESS, COMPLETED
progressPct Int @default(0)
startedAt DateTime?
completedAt DateTime?
certificateId String? // gerado ao concluir (Card 56)
}
model CorpLearningPath {
id String @id @default(cuid())
name String // "Trilha Professor Iniciante"
description String?
courses CorpPathCourse[]
targetRoles String[]
isPublished Boolean @default(true)
}
model CorpPathCourse {
id String @id @default(cuid())
pathId String
path CorpLearningPath @relation(fields: [pathId], references: [id])
courseId String
course CorpCourse @relation(fields: [courseId], references: [id])
order Int
daysAfterPrevious Int @default(0) // intervalo de maturação
}
enum CourseDifficulty { BEGINNER INTERMEDIATE ADVANCED }
enum LessonType { VIDEO TEXT FILE QUIZ }
enum EnrollmentStatusCorp { NOT_STARTED IN_PROGRESS COMPLETED FAILED }
Rotas (page.tsx)
/ead(público a todos os roles colab) — catálogo de cursos/ead/[courseId]— player (mesma estrutura do aluno: accordion módulos)/ead/[courseId]/[lessonId]— aula (YouTube + materiais)/ead/minhas-trilhas— trilhas designadas ao usuário/master/ead— admin (CRUD cursos + módulos + designar trilhas)
Procedures tRPC
master.ead.*(CRUD)ead.catalog.list(cursos publicados para o role do usuário)ead.enroll/ead.progress.updateead.exam.submit(submete prova do módulo → corrige → avança ou reprova)ead.certificates.list(meus certificados)
Reuso de padrões
- Player YouTube:
<YouTubePlayer />do Card 5 - Accordion de módulos: padrão do Card 5
- Progress tracking: mesmo modelo do
LessonProgressdo aluno
✅ Critérios de Aceite
- MASTER cria cursos com módulos + aulas (YouTube + textos + PDFs)
- Colaborador se matricula + acompanha progresso
- Provas por etapa (módulo) com passingScore
- Trilhas de aprendizagem com pré-requisitos + intervalo
- Certificados gerados ao concluir (integração Card 56)
- Rankings de conclusão
- Designação automática por role (novo PROFESSOR → trilha onboarding)
- Build passa + lint OK
🔌 Handoff
- Schema desacoplado do EAD aluno (tabelas próprias para flexibilidade)
- Integração com Card 51 (Checklist: não conformidades → sugere curso)
- Integração com Card 46 (Chamados recorrentes → vira conteúdo)
🎯 Próximo
Card 54: Trilhas Progressivas (Formação Continuada)
EXECUCAO — 2026-08-15
1. O que foi implementado
Router m10.ts (ead.catalog/detail/enroll/lessonComplete + masterEad CRUD cursos/módulos/trilhas + rankings). Páginas /ead (catálogo+trilhas), /ead/[courseId] (player accordion), /master/ead (admin completo). Progresso via contagem localStorage + emissão de certificado ao 100%.
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.