Files
agenciapsilmno/HANDOFF.md
T
Leonardo 646cec5833 HANDOFF: estado completo MelissaPaciente Fases 1-8 + iteracao pos-Fase 8
Reescreve HANDOFF.md com:
- Status final: 24 commits no branch, working tree limpa
- Historico completo dos commits (mais recente -> mais antigo)
- Lista de arquivos novos/modificados (composables, utils, paginas)
- Pendentes pra proxima sessao
- 5 decisoes arquiteturais documentadas
- Hotspots de drift no AgendaEventDialog
- Comandos uteis pra retomar

Adiciona entry no log.md descrevendo a iteracao pos-Fase 8 (16 commits
de UX/funcionalidades novas + debugging do AgendaEventDialog reuse).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 19:52:00 -03:00

9.2 KiB

HANDOFF — 2026-05-08 (MelissaPaciente — port completo + iteração de UX)

Documento de continuidade. Quando voltar, comece lendo esta página.

🟢 PLANO DE 8 FASES COMPLETOMelissaPaciente.vue (~2400L) é a versão Melissa nativa do PatientProntuario.vue legacy (3593L). Todas as 7 abas entregues, wire-up final feito (Dialog → route /melissa/paciente?id=X). 5 composables + utils compartilhados extraídos.

🟢 ITERAÇÃO PÓS-FASE 8 — Várias rodadas de feedback do user com fixes: full-width, sidebar "Voltar pra Pacientes" (no lugar de Configurações), editar inline, openWhatsapp fix, dialog Lançamento, dialog Nova Sessão com AgendaEventDialog real, recorrências do paciente.

🟢 COMMITADO + PUSHED — Working tree limpa.


🚦 STATUS — Working tree LIMPA

On branch main
Your branch is up to date with 'origin/main'.
nothing to commit, working tree clean

📦 Histórico de commits da sessão (mais recente → mais antigo)

# Hash Resumo
24 6ad91e7 passa preset-commitment-id pro AgendaEventDialog (fix botão Salvar sumido)
23 cf1cd67 pré-popula eventRow com commitment_id + paciente nome/avatar/status
22 73788c7 AgendaEventDialog: lockType auto-seleciona commitment "Sessão" (fix jornada/billing/freq sumidos)
21 30d09eb AgendaEventDialog: props lockType + lockPatient + slot #headerLeft (aditivos)
20 88dff50 (REVERTIDO em 30d09eb) usa AgendaEventDialog GLOBAL via inject
19 b040e15 header custom do dialog Nova Sessão (ícone + título + nome)
18 42a39ed dialog Nova Sessão usa "Frequência" estilo AgendaEventDialog
17 9e76e4e bloco "Recorrências do paciente" na Tab Agenda
16 f1d6fba dialog nova sessão integra useRecurrence (recorrência semanal)
15 a8ab13b dialog inline nova sessão + createSession mutation
14 21c71f7 addFinancial navega pra Financeiro + novo botão Agendar
13 64005a5 fix openWhatsapp + dialog inline novo lançamento financeiro
12 301a712 editPatient abre PatientCadastroDialog INLINE (sem sair)
11 5d2c389 fix sidebar cards encolhendo + gap das abas main
10 159b80d full-width + sidebar "Voltar pra Pacientes" no lugar de Configurações
9 71ee51d Fase 8 wire-up final (Dialog → route /melissa/paciente?id=X)
8 167e864 Fase 7 Tabs Documentos + Conversas (KPIs + embed componentes existentes)
7 e7c0f6c Fase 6 Tab Financeiro + mark paid (mutation que legacy não tem)
6 8a8d2e0 Fase 5 Tab Agenda (KPIs + filtros + grupos por mês + ações)
5 1278e93 Fase 4 Tab Prontuário MVP (evolução via session.observacoes)
4 4fc0e3a Fase 3 Tab Perfil (6 sections stacked + anchors)
3 ab7526b Fase 2 Tab Visão Geral (4 KPIs + timeline + msgs + notas)
2 df61cc4 Fase 1 Foundation (5 composables + skeleton 7 tabs + slug paciente)
1 f3f0d83 (pré-MelissaPaciente) preview teleport 3-way no Agendador/LinkExterno + chrome 6 páginas

📂 Arquivos novos / modificados

NOVOS — composables + utils compartilhados

  • src/features/patients/composables/usePatientDetail.js (~108L) — patient + groups + tags
  • src/features/patients/composables/usePatientSessions.js (~155L) — agenda_eventos + computeds + updateStatus/createSession mutations
  • src/features/patients/composables/usePatientFinancial.js (~155L) — financial_records + computeds + markPaid/markUnpaid/createRecord mutations
  • src/features/patients/composables/usePatientMessages.js (~80L) — conversation_messages + computeds
  • src/features/patients/composables/usePatientDocuments.js (~110L) — documents + computeds (topType, pendentes, sizeTotalFormatted)
  • src/features/patients/composables/usePatientRecurrences.js (~110L) — recurrence_rules + cancel/reactivate + ativas/canceladas computeds
  • src/features/patients/utils/patientFormatters.js (~280L) — fmt* helpers + STATUS_LABEL/SEVERITY + tagStyle (luminance) + DOC_TYPE_LABEL + chConvLabel + recordStatus + RECORD_STATUS_LABEL + WEEKDAY_LABEL + fmtRecurrenceLabel/Fim

NOVO — página Melissa

  • src/layout/melissa/MelissaPaciente.vue (~2400L) — 7 abas funcionais, header custom, sidebar com Voltar pra Pacientes, dialog Lançamento inline, dialog Nova Sessão usando AgendaEventDialog real

MODIFICADOS — wire-up

  • src/layout/melissa/MelissaLayout.vue — entry SECOES.paciente + render condicional <MelissaPaciente :patient-id="String(route.query.id || '')" @close="fecharSecao" />
  • src/layout/melissa/MelissaPacientes.vueabrirProntuario agora navega via router.push('/melissa/paciente', query: { id }). Removeu <PatientProntuario> Dialog. Watch em route.query.edit pra abrir cadastro full quando vem de MelissaPaciente.editPatient.
  • src/layout/melissa/MelissaAgenda.vueabrirProntuarioPorId igual. Removeu Dialog legacy.
  • src/layout/melissa/composables/useMelissaAgenda.js — adicionou onCreateEventoForPatient(patientId) (não usado mais após reverter inject, mas mantido)
  • src/features/agenda/components/AgendaEventDialog.vue3 props aditivas (lockType, lockPatient, slot #headerLeft) + watch que auto-seleciona commitment "Sessão" quando lockType. Zero regressão (301 specs passando).

🟡 PENDENTES PRA PRÓXIMA SESSÃO

User mencionou: "tem alguns ajustes pra fazer nessa tela ainda" após o último fix do botão Salvar (commit 6ad91e7). Ajustes específicos não foram detalhados ainda — próxima sessão começa pelo feedback do user no dialog Nova Sessão.

Pendentes conhecidos (não ditos pelo user, mas observados)

  • PatientProntuario.vue legacy (3593L) continua existindo intocado. Usado por:
    • TherapistDashboard.vue (homepage role therapist sem Melissa)
    • PatientsListPage.vue (rota /therapist/patients)
    • Quando user troca pra Melissa em /account/profile, vê a versão nativa
    • Pra deletar de vez precisa portar TherapistDashboard + PatientsListPage também
  • Tab Prontuário é MVP usando agenda_eventos.observacoes como evolução. Quando schema clínico (anamnese, clinical_notes, plano_terapeutico) for adicionado, vira o real
  • 2 errors pré-existentes em MelissaLayout.vue (duplicate key 'financeiro' L242, empty block L1130) — não foram tocados durante o port

🧠 Conhecimento adicional acumulado nesta sessão

Decisões arquiteturais

  1. MelissaPaciente segue o padrão Melissa (mesmo prefix mpa-, glass chrome, sidebar 320px à esquerda, drawer mobile). Diferente das outras Melissa Pages: largura total (sem right: max(...)) porque conteúdo (KPIs grid + tabelas + timeline) precisa de espaço.

  2. Reuso do AgendaEventDialog via 2 props aditivas (lockType + lockPatient) + slot #headerLeft — caminho A escolhido após discussão honesta sobre drift risk de duplicação.

  3. Inject vs state localMelissaPaciente injeta MELISSA_AGENDA_KEY SÓ pra ler dados pesados (commitmentOptions, workRules, etc) e mantém state LOCAL pro dialog (sessaoDialogOpen/EventRow/StartISO/EndISO). Não colide com dialog global da Agenda.

  4. Inicialização do dialog: precisa passar TANTO determined_commitment_id no eventRow QUANTO prop presetCommitmentId separada. O resetForm lê o primeiro pra popular form.commitment_id; o lifecycle lê o segundo pra decidir step inicial. Sem ambos, cair em race condition (lifecycle reset desfaz selectCommitment).

  5. Pré-popular paciente_nome/avatar/status no eventRow é obrigatório pra não-edit — o composer só faz fetch async do nome quando isEdit=true.

Hotspots de drift no AgendaEventDialog

Arquivo tem 5 composables que fazem o trabalho pesado: useAgendaEventComposer (state + computeds), useAgendaEventActions (save/delete), useAgendaEventLifecycle (watchers + init), useAgendaEventPickerBilling (selectCommitment, paciente picker), agendaEventHelpers (utils). Mexer aqui é seguro pelo coverage de 301 specs.

Slug /melissa/paciente?id=<uuid>

Registrado em MelissaLayout.vue SECOES + adicionado a MELISSA_NON_CONFIG_SLUGS. ID vem via query param. Funciona pra deep-link.


🛠️ Comandos úteis

# Specs do agenda (regression check pro AgendaEventDialog)
npx vitest run src/features/agenda/composables/__tests__

# Lint só dos arquivos do MelissaPaciente
npx eslint src/layout/melissa/MelissaPaciente.vue src/features/patients/composables/usePatient*.js src/features/patients/utils/patientFormatters.js

# Testar visualmente
npm run dev
# → http://localhost:5173/melissa/paciente?id=<uuid-real-de-paciente>

▶️ Próxima sessão — onde retomar

  1. Ler primeiro: este HANDOFF.md (você já está nele)
  2. Aguardar feedback do user sobre ajustes específicos no dialog Nova Sessão (mencionou que tem mais alguma coisa)
  3. Possíveis frentes:
    • Polish do dialog Nova Sessão pós-feedback
    • Port do TherapistDashboard pra remover dependência do PatientProntuario legacy
    • Schema clínico (anamnese/evolução) pra Tab Prontuário sair do MVP
  4. Antes de mexer em AgendaEventDialog: rodar npx vitest run src/features/agenda/composables/__tests__ (301 specs) pra confirmar baseline limpo

Boa sessão!