Feature: Participação
Introdução ao documento
Este documento descreve a feature de participação e turmas: listagem de estudantes, marcação de atividades/presença, navegação como participante e solicitação de cancelamento de matrícula. Evidências: src/app/(protected-routes)/participacao/[id]/page.tsx:16-57, src/components/Participacao/Participacao.component.tsx:43-109, src/components/ParticipacaoTable/ParticipacaoTable.component.tsx:148-205.
Versionamento
- Documento criado em
2026-03-20. - Revisar quando mudarem a página
/participacao/[id],ParticipacaoTable,/api/presence*ou a solicitação de cancelamento de matrícula. Evidências:src/app/(protected-routes)/participacao/[id]/page.tsx:16-57,src/app/api/presence/route.ts:6-40,src/app/api/presence/recovery/route.ts:6-39,src/components/ParticipacaoTable/ParticipacaoTable.component.tsx:177-205.
Referencial teórico
O fluxo foi derivado da página protegida de participação, do componente Participacao, da tabela desktop e do BFF de presença. Evidências: src/components/Participacao/Participacao.component.tsx:43-109, src/app/services/bff/ClassService.ts:47-99.
Visão geral
- A tela exibe a turma corrente, lista de participantes e seus status por atividade. Evidências:
src/app/(protected-routes)/participacao/[id]/page.tsx:24-57,src/components/ParticipacaoTable/ParticipacaoTable.component.tsx:285-320. - Em desktop, a feature usa
ParticipacaoTable; em mobile, usaActivitiesSlider. Evidências:src/components/Participacao/Participacao.component.tsx:71-97. - A feature também concentra navegação como participante, cancelamento e uso de WhatsApp para contato. Evidências:
src/components/ParticipacaoTable/ParticipacaoTable.component.tsx:6-21,src/components/ParticipacaoTable/ParticipacaoTable.component.tsx:172-205.
Atores
- Facilitador/supervisor gerindo a participação da turma. Evidências:
src/app/(protected-routes)/participacao/[id]/page.tsx:16-57. - Participante listado na turma. Evidências:
src/components/ParticipacaoTable/ParticipacaoTable.component.tsx:313-320. - Backend de presença, turma e matrícula. Evidências:
src/app/services/bff/ClassService.ts:47-99,src/app/services/bff/ClassService.ts:123-129.
Pré-condições
- Sessão válida. Evidências:
src/app/(protected-routes)/participacao/[id]/page.tsx:18-22. classIdeclassesDatacarregados. Evidências:src/components/Participacao/Participacao.component.tsx:44-52.- A turma precisa ter participantes; caso contrário, a UI avisa que não há participantes. Evidências:
src/components/Participacao/Participacao.component.tsx:55-63.
Fluxo principal
- O usuário autenticado abre
/participacao/{classId}. Evidências:src/app/(protected-routes)/participacao/[id]/page.tsx:18-22. - O componente
Participacaobusca a lista de alunos via hookuseStudents(classId, token). Evidências:src/components/Participacao/Participacao.component.tsx:48-52. - A UI renderiza tabela desktop ou slider mobile com os estudantes e suas atividades. Evidências:
src/components/Participacao/Participacao.component.tsx:71-97. - A tabela permite navegar, solicitar cancelamento e interagir com atividades conforme o período e o perfil. Evidências:
src/components/ParticipacaoTable/ParticipacaoTable.component.tsx:159-205.
Fluxos alternativos
- Se não houver participantes, a UI mostra
NotifyModale permite voltar. Evidências:src/components/Participacao/Participacao.component.tsx:55-63. - Se o hook falhar e
studentsnão vier, a UI mostra erro genérico. Evidências:src/components/Participacao/Participacao.component.tsx:101-108. - Se o usuário clicar em cancelamento de matrícula, o modal confirma e a tabela refaz a busca após sucesso. Evidências:
src/components/ParticipacaoTable/ParticipacaoTable.component.tsx:172-205.
Regras de negócio
- O total de colunas de atividade soma atividades do ciclo e 2 acessos extras quando
enable_certificacao_progressivaestá ativo. Evidências:src/components/ParticipacaoTable/ParticipacaoTable.component.tsx:161,src/components/ParticipacaoTable/ParticipacaoTable.component.tsx:217-258,src/components/ParticipacaoTable/ParticipacaoTable.component.tsx:282-283. - O título de cada coluna prioriza
activity_titles, depoiscollective_meetings, e usa fallback especialCartão de Visitasno cursofocodelasna última atividade. Evidências:src/components/ParticipacaoTable/ParticipacaoTable.component.tsx:88-115. - A solicitação de cancelamento usa
enrollment_iddo aluno selecionado. Evidências:src/components/ParticipacaoTable/ParticipacaoTable.component.tsx:177-183,src/app/services/bff/ClassService.ts:123-129. - A marcação de presença normal usa
class_id,student_ideactivity_id. Evidências:src/app/services/bff/ClassService.ts:61-71,src/app/api/presence/route.ts:21-29. - A presença de recuperação exige
class_id,activityereason. Evidências:src/app/services/bff/ClassService.ts:85-99,src/app/api/presence/recovery/route.ts:21-29.
Estados possíveis
sem_participantes: modal de aviso. Evidências:src/components/Participacao/Participacao.component.tsx:55-63.carregado_desktop:ParticipacaoTablerenderizada. Evidências:src/components/Participacao/Participacao.component.tsx:73-84.carregado_mobile:ActivitiesSliderrenderizado. Evidências:src/components/Participacao/Participacao.component.tsx:85-96.cancelamento_em_andamento:isSubmittingativo. Evidências:src/components/ParticipacaoTable/ParticipacaoTable.component.tsx:168-170,src/components/ParticipacaoTable/ParticipacaoTable.component.tsx:177-198.
Endpoints envolvidos
- Ver OpenAPI:
GET /api/presence/{id},POST /api/presence,POST /api/presence/recovery,GET /api/reasons,POST /api/enrollment/{enrollment_id}/request-cancellation,POST /api/participant-mode-log.
Evidências: src/app/services/bff/ClassService.ts:47-99, src/app/api/presence/route.ts:6-40, src/app/api/presence/recovery/route.ts:6-39, src/app/api/reasons/route.ts:5-21, src/app/api/participant-mode-log/route.ts:6-50.
Dados impactados
- Ver model.md:
Student,Class,Enrollment, presença e motivo de recuperação. - O fluxo de navegação como participante também interage com
participantModeStorageem outras partes da aplicação, mas esse contrato não está centralizado neste documento.
Pendências
- O hook
useStudentsconcentra parte da regra de enriquecimento dos alunos e não está formalizado em documentação funcional. - A política exata de edição por período depende de helpers de data, não de um contrato externo versionado.