✅ 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 51 [M9] — Checklist Auditoria Pedagógica (GPS + Fotos)
📚 Referência SULTS: https://www.sults.com.br/produtos/checklist Sistema de checklist digital para padronizar inspeções e auditorias. App mobile com GPS, +40 tipos de resposta, scoring automático, evidências fotográficas geolocalizadas e plano de ação 5W2H.
🎯 Objetivo
Adaptar o Checklist da SULTS para o contexto escolar — auditoria pedagógica e de padronização de filiais da rede ANIK. Permite ao SUPERVISOR/MASTER auditar uma unidade em visita presencial:
- Formulários customizáveis por tipo (Pedagógico, Operacional, LGPD, Financeiro)
- +10 tipos de resposta: sim/não, múltipla escolha, texto, número, data, foto, escala, assinatura
- GPS + check-in/check-out geolocalizado (valida que auditor esteve na filial)
- Evidências fotográficas com GPS + data/hora vinculadas ao item
- Questão crítica zera inspeção inteira se reprovada
- Scoring automático com pesos por questão + ranking comparativo entre filiais
- Gera Plano de Ação 5W2H para cada não conformidade (Card 52)
- Funciona offline no mobile (PWA já pronto do Card 8)
📚 Documentação de Referência
docs/DESIGN_SYSTEM.md§6 (componentes nativos)- PWA já existe (Card 8) — service worker para offline
prisma/schema.prisma— novos models
🛠️ Especificação Técnica
Schema Prisma (novo)
model ChecklistTemplate {
id String @id @default(cuid())
name String // "Auditoria Pedagógica Padrão"
type ChecklistType // PEDAGOGICAL, OPERATIONAL, LGPD, FINANCIAL, SAFETY
description String?
sections ChecklistSection[]
isActive Boolean @default(true)
version Int @default(1)
createdBy String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model ChecklistSection {
id String @id @default(cuid())
templateId String
template ChecklistTemplate @relation(fields: [templateId], references: [id])
title String // "Sala de Aula", "Recepção", "Banheiros"
order Int @default(0)
questions ChecklistQuestion[]
}
model ChecklistQuestion {
id String @id @default(cuid())
sectionId String
section ChecklistSection @relation(fields: [sectionId], references: [id])
text String
type ChecklistQType // YES_NO, MULTI_CHOICE, TEXT, NUMBER, DATE, PHOTO, SCALE, SIGNATURE
required Boolean @default(true)
weight Float @default(1) // peso no scoring
isCritical Boolean @default(false) // zera inspeção se reprovar
options String[] // para MULTI_CHOICE
expectsPhoto Boolean @default(false) // exige anexo
order Int @default(0)
}
model ChecklistApplication {
id String @id @default(cuid())
templateId String
template ChecklistTemplate @relation(fields: [templateId], references: [id])
branchId String // filial auditada
branch Branch @relation(fields: [branchId], references: [id])
auditorId String // quem aplicou
auditor User @relation(fields: [auditorId], references: [id])
status ApplicationStatus @default(IN_PROGRESS) // IN_PROGRESS, COMPLETED, VALIDATED
score Float? // 0-100
checkInAt DateTime?
checkInGps Json? // {lat, lng, accuracy}
checkOutAt DateTime?
checkOutGps Json?
answers ChecklistAnswer[]
actionPlans ActionPlan[] // Card 52
createdAt DateTime @default(now())
completedAt DateTime?
}
model ChecklistAnswer {
id String @id @default(cuid())
applicationId String
application ChecklistApplication @relation(fields: [applicationId], references: [id])
questionId String
question ChecklistQuestion @relation(fields: [questionId], references: [id])
value Json // resposta (string/number/array/etc)
photoUrls String[] // evidências
gps Json? // GPS da foto
isConform Boolean? // conforme ou não
notes String?
}
enum ChecklistType { PEDAGOGICAL OPERATIONAL LGPD FINANCIAL SAFETY }
enum ChecklistQType { YES_NO MULTI_CHOICE TEXT NUMBER DATE PHOTO SCALE SIGNATURE }
enum ApplicationStatus { IN_PROGRESS COMPLETED VALIDATED }
Rotas (page.tsx)
/master/checklist— gerenciar templates/master/checklist/[templateId]/editor— editor visual de template/supervisor/checklist— SUPERVISOR aplica/valida (visita filial)/master/checklist/aplicacoes— lista aplicações + ranking filiais/master/checklist/aplicacoes/[id]— detalhe + scoring + planos de ação
Procedures tRPC
master.checklist.templates.*(CRUD templates)supervisor.checklist.apply.*(iniciar, salvar offline, finalizar)master.checklist.validate(valida aplicação)master.checklist.ranking(scoring comparativo entre filiais)
Mobile Offline (PWA)
- Reusar service worker do Card 8 (PWA)
- IndexedDB para respostas offline (
idb-keyval) - Sync quando voltar online
- Captura GPS via
navigator.geolocation(requires HTTPS + permissão) - Câmera via
<input type="file" accept="image/*" capture>ou getUserMedia
✅ Critérios de Aceite
- MASTER cria templates com seções + questões + pesos + criticidade
- SUPERVISOR aplica checklist na filial com check-in GPS
- 8+ tipos de resposta funcionais (incluindo foto + assinatura)
- Questão crítica zera inspeção
- Scoring automático (soma ponderada de conformidades)
- Ranking comparativo entre filiais
- Funciona offline (PWA) + sync ao reconectar
- Evidências fotográficas com GPS + timestamp
- Build passa + lint OK
🔌 Handoff
- Templates padrão (seed): Auditoria Pedagógica, LGPD, Operacional
- Integração com Card 52 (Plano 5W2H): não conformidades viram planos
- Integração com Card 50 (NES): score da auditoria alimenta prontuário da filial
🎯 Próximo
Card 52: Plano de Ação 5W2H