Pular para o conteúdo principal

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_KEY via 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_KEY configurado para o chat funcionar. Evidências: src/app/api/blip/config/route.ts:4-9.
  • enroll_id e 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

  1. O usuário autenticado acessa /atendimento. Evidências: src/app/(protected-routes)/atendimento/page.tsx:12-16.
  2. Ao clicar em FALAR COM UM ESPECIALISTA, o cliente usa /api/blip/config para obter appKey e abre o widget Blip. Evidências: src/components/AttendanceButton/AttendanceButton.component.tsx:56-95.
  3. Ao clicar em cancelamento na própria tela, a UI abre um modal dedicado com enrollId e token. Evidências: src/components/CancelRegistrationButton/CancelRegistrationButton.component.tsx:60-89.
  4. 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_KEY não estiver configurado, /api/blip/config responde 500. 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ção DEV_AUTH e identidade anônima. Evidências: src/components/AttendanceButton/AttendanceButton.component.tsx:61-82.
  • O cancelamento direto de matrícula exige reason no 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_id e 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 de BLIP_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: isSubmitting na 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.