Feature: Atendimento
Introdução ao documento
Este documento cobre a central de atendimento observada no código: abertura do chat Blip e ações de cancelamento/solicitação de cancelamento de matrícula. Evidências: src/app/(protected-routes)/atendimento/page.tsx:12-88, src/components/AttendanceButton/AttendanceButton.component.tsx:56-109, src/components/ParticipacaoTable/ParticipacaoTable.component.tsx:177-205.
Versionamento
- Documento criado em
2026-03-20. - Revisar quando mudarem a página
/atendimento,AtendimentoButton, cancelamento de matrícula ou as rotas/api/blip/config,/api/enroll/cancel/*,/api/enrollment/*/request-cancellation. Evidências:src/app/(protected-routes)/atendimento/page.tsx:12-88,src/app/api/blip/config/route.ts:3-9,src/app/api/enroll/cancel/[enroll_id]/route.ts:6-65,src/app/api/enrollment/[enrollment_id]/request-cancellation/route.ts:6-65.
Referencial teórico
O fluxo foi derivado da tela de atendimento, do widget Blip e dos componentes de cancelamento observados no frontend. Evidências: src/app/(protected-routes)/atendimento/page.tsx:25-80, src/components/AttendanceButton/AttendanceButton.component.tsx:56-109, src/components/CancelRegistrationButton/CancelRegistrationButton.component.tsx:58-90.
Visão geral
- A tela oferece duas ações principais: falar com suporte e cancelar matrícula. Evidências:
src/app/(protected-routes)/atendimento/page.tsx:50-80. - O botão de atendimento busca
BLIP_APP_KEYvia BFF e constrói o widget Blip no cliente. Evidências:src/components/AttendanceButton/AttendanceButton.component.tsx:56-91. - A solicitação de cancelamento pode aparecer tanto na página de atendimento quanto na participação do facilitador. Evidências:
src/app/(protected-routes)/atendimento/page.tsx:77-79,src/components/ParticipacaoTable/ParticipacaoTable.component.tsx:177-205.
Atores
- Participante buscando ajuda ou cancelando sua matrícula. Evidências:
src/app/(protected-routes)/atendimento/page.tsx:58-79. - Facilitador/supervisor solicitando cancelamento de matrícula de um participante. Evidências:
src/components/ParticipacaoTable/ParticipacaoTable.component.tsx:177-205. - Serviço Blip e backend WordPress/Dhedalos. Evidências:
src/components/AttendanceButton/AttendanceButton.component.tsx:57-68,src/app/api/enroll/cancel/[enroll_id]/route.ts:29-37.
Pré-condições
- Sessão válida para acessar
/atendimento. Evidências:src/app/(protected-routes)/atendimento/page.tsx:13-16. BLIP_APP_KEYconfigurado para o chat funcionar. Evidências:src/app/api/blip/config/route.ts:4-9.enroll_ide token disponíveis para o cancelamento direto. Evidências:src/components/CancelRegistrationButton/CancelRegistrationButton.component.tsx:15-18,src/app/(protected-routes)/atendimento/page.tsx:77-79.
Fluxo principal
- O usuário autenticado acessa
/atendimento. Evidências:src/app/(protected-routes)/atendimento/page.tsx:12-16. - Ao clicar em
FALAR COM UM ESPECIALISTA, o cliente usa/api/blip/configpara obterappKeye abre o widget Blip. Evidências:src/components/AttendanceButton/AttendanceButton.component.tsx:56-95. - Ao clicar em cancelamento na própria tela, a UI abre um modal dedicado com
enrollIdetoken. Evidências:src/components/CancelRegistrationButton/CancelRegistrationButton.component.tsx:60-89. - Em contexto de facilitador, a tabela de participação usa
requestEnrollmentCancellation(enrollment_id)para abrir a solicitação de cancelamento. Evidências:src/components/ParticipacaoTable/ParticipacaoTable.component.tsx:177-205,src/app/services/bff/ClassService.ts:123-129.
Fluxos alternativos
- Se
BLIP_APP_KEYnão estiver configurado,/api/blip/configresponde500. Evidências:src/app/api/blip/config/route.ts:4-7. - Se o usuário não estiver autenticado, as rotas de cancelamento retornam
401. Evidências:src/app/api/enroll/cancel/[enroll_id]/route.ts:10-21,src/app/api/enrollment/[enrollment_id]/request-cancellation/route.ts:10-21. - Se o backend remoto recusar o cancelamento, o BFF retorna o status remoto e loga erro. Evidências:
src/app/api/enroll/cancel/[enroll_id]/route.ts:39-50,src/app/api/enrollment/[enrollment_id]/request-cancellation/route.ts:39-50.
Regras de negócio
- O widget Blip usa URL comum
https://weconcept.chat.blip.ai/, autenticaçãoDEV_AUTHe identidade anônima. Evidências:src/components/AttendanceButton/AttendanceButton.component.tsx:61-82. - O cancelamento direto de matrícula exige
reasonno body do POST para/api/enroll/cancel/{enroll_id}. Evidências:src/app/api/enroll/cancel/[enroll_id]/route.ts:27-37. - A solicitação de cancelamento de matrícula em participação depende de
enrollment_ide não envia body. Evidências:src/components/ParticipacaoTable/ParticipacaoTable.component.tsx:181-193,src/app/api/enrollment/[enrollment_id]/request-cancellation/route.ts:26-37.
Estados possíveis
chat_nao_configurado: ausência deBLIP_APP_KEY. Evidências:src/app/api/blip/config/route.ts:4-7.chat_pronto: widget construído e pronto para alternar abertura/fechamento. Evidências:src/components/AttendanceButton/AttendanceButton.component.tsx:87-95.cancelamento_em_andamento:isSubmittingna tabela de participação. Evidências:src/components/ParticipacaoTable/ParticipacaoTable.component.tsx:168-170,src/components/ParticipacaoTable/ParticipacaoTable.component.tsx:177-198.
Endpoints envolvidos
- Ver OpenAPI:
GET /api/blip/config,POST /api/enroll/cancel/{enroll_id},POST /api/enrollment/{enrollment_id}/request-cancellation.
Evidências: src/app/api/blip/config/route.ts:3-9, src/app/api/enroll/cancel/[enroll_id]/route.ts:6-65, src/app/api/enrollment/[enrollment_id]/request-cancellation/route.ts:6-65.
Dados impactados
- Ver model.md: matrícula/enrollment, participante e turma corrente.
- O chat não persiste dados de domínio no repositório local além do uso do widget.
Pendências
- O modal de cancelamento direto da página de atendimento depende de componentes auxiliares não formalizados em documentação de fluxo.
- O destino operacional dos tickets do Blip não é documentado no repositório.