diff --git a/HANDOFF.md b/HANDOFF.md index e336933..aa25244 100644 --- a/HANDOFF.md +++ b/HANDOFF.md @@ -1,147 +1,231 @@ -# HANDOFF — 2026-05-08 (MelissaPaciente — port completo + iteração de UX) +# HANDOFF — 2026-05-18 noite (C1-C4 OK, UX convênio refinado, C5 ainda não rodou save) -Documento de continuidade. **Quando voltar, comece lendo esta página.** +Documento de continuidade. **Quando voltar, comece lendo esta página até o fim.** -> **🟢 PLANO DE 8 FASES COMPLETO** — `MelissaPaciente.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. +> **🎯 SE A FORÇA CAIR / SESSÃO PERDER CONTEXTO:** estamos na rodada de +> testes manuais dos 13 cenários do doc viva +> `src/docs/agenda-compromisso-financeiro-cenarios.html`. C1-C4 ✅, **C5 +> ainda não rodou save** — a tarde do dia 18 foi consumida refinando UX +> de convênio (3 bugs/melhorias) e preparando o C5. Próximo passo: +> **executar de fato o save do C5** (Sándor + Unimed Nacional + R$ 95). -> **🟢 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. +> **🟡 WORKING TREE BEM PESADO** — refactor de payment, indicadores +> visuais (barra verde + popover + Resumo do dialog), inline quick-create +> de procedimento, fix de rota convênios, botão "+ Novo convênio", +> hint contextual. Migrations da Fase 5 já rodadas em 14/05. **Considerar +> commitar antes de mais trabalho** — diff tá grande. --- -## 🚦 STATUS — Working tree LIMPA +## 🔴 PRÓXIMO PASSO IMEDIATO — Cenário 5 (Convênio) -``` -On branch main -Your branch is up to date with 'origin/main'. -nothing to commit, working tree clean -``` +Receita do doc HTML. Resumo: + +| Campo | Valor | +|---|---| +| Paciente | **Sándor** | +| Convênio | **Unimed Nacional** (criar via `InsurancePlanQuickCreateDialog` se não existir) | +| Valor | **R$ 95** | + +**Esperado:** +- Record com `insurance_plan_id` preenchido + pill "convênio" visível +- Na agenda: badge $ amber (record pendente até fechamento mensal do convênio) +- Popover: linha amber "A receber R$ 95,00 (cobrança pendente)" + +Após o 5 passar: 6-9 (recorrentes) → 10-13 (status change + edit cobrada). Quando todos passarem, replicar em **Rail** (`AgendaTerapeutaPage.vue`) e **Clínica** (`AgendaClinicaPage.vue`). --- -## 📦 Histórico de commits da sessão (mais recente → mais antigo) +## 📦 O que foi feito em 18/05 -| # | 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 | +### Cenário 4 (Joyce · "Já recebi") ✅ +- Testado e passou: toast "Cobrança paga R$ 180,00 recebido via PIX", record nasceu `paid + payment_method=pix + paid_at=now()`. + +### Novo indicador: barra esquerda verde para sessão paga +- Brainstorm de 6 opções; user escolheu #6 (3 canais visuais distintos por estado). +- `MelissaAgenda.vue:395-419` — computa `isPaidSession` (sessão+paciente+não-virtual+`paymentState==='paid'`) e adiciona classe `ma-evt--paid` ao FC event (combina com `ma-evt--inactive-patient` se ambos). +- `MelissaAgenda.vue:2325-2335` — CSS força `border-left-color: #10b981 !important` (emerald-500, 4px). `!important` necessário porque FC seta `borderColor` inline. Trata também list view (`.fc-list-event-dot`). +- Doc HTML atualizado: legenda "Indicadores visuais" agora descreve **3 estados** (pendente / pago / neutro) com 3 mocks empilhados; estado-alvo do C4 reescrito mencionando a barra verde. +- Decisão salva em `memory/project_agenda_payment_indicators.md`. + +### Linha "Cobrança" no popover + Resumo do dialog +- **Popover `MelissaEventoPanel`** — antes só mostrava amber "A receber R$ X" pra pendente. Agora cobre os 3 estados, com cor + ícone por variante: + - `paid` → `pi-check-circle` verde, label **"Pago · R$ X,XX"** + - `pending` → `pi-dollar` amber, label **"A receber R$ X (cobrança pendente)"** (mantido) + - `none` → `pi-dollar` amber, label **"A cobrar R$ X"** ou **"Cobrança ainda não gerada"** (mantido) + - CSS reescrito em 3 modificadores `.evento-row--pay-{paid|pending|none}` (com dark mode). +- **Resumo lateral do `AgendaEventDialog`** — nova linha entre `pi-clock` e `pi-map-marker` em ambas as cópias (mobile inline + desktop floating). + - Novo ref `sessionPaymentRecord` em `useAgendaEventLifecycle.js:104+` (sem guard de `occurrenceMode`, contrário ao `occFinancialRecord` que continua só pra Rail/Clínica). Loader `loadSessionPaymentRecord` chamado no mesmo lifecycle. + - Computed `paymentSummary` em `AgendaEventDialog.vue:951+` retorna `{icon, cls, label}` pra 5 casos: paid (verde + paid_at), overdue (vermelho + due_date), pending (amber + due_date), sem cobrança c/ valor (neutro), sem cobrança s/ valor (neutro). + - `@cobranca-atualizada` do `AgendaEventoFinanceiroPanel` agora também dispara `loadSessionPaymentRecord` pra a linha refrescar. + - **Importante:** `occFinancialRecord` (que aciona lock-edit) NÃO foi tocado de propósito — esse é território da Fase 6/C13 (Edit cobrada). Manter dois refs separados evita ativar lock prematuro em Melissa. + +### Preparação do C5 (Sándor + Unimed Nacional) — UX de convênio refinado (3 issues) + +User tentou rodar C5 e bateu em 3 problemas seguidos. Cada um virou um fix: + +1. **Botão "Cadastrar" do procedimento navegava pra `/pages/notfound`** + - Root cause: `goToConveniosConfig` em `AgendaEventDialog.vue` prefixava com `/therapist` ou `/admin`, mas `/configuracoes/*` é rota **raiz** sob `AppLayout` (sibling, não filho). Em Melissa, convênios mora dentro do próprio layout via `secao: 'cfg-convenios'` (sem URL própria). + - Fix descartado: o user não queria sair da agenda. Em vez disso, criamos um quick-create inline (ver #2). `goToConveniosConfig` foi removida (dead code virou armadilha). + +2. **Quick-create de procedimento inline (sem sair da agenda)** + - Novo componente `InsurancePlanServiceQuickCreateDialog.vue` (modelo do `InsurancePlanQuickCreateDialog`). 2 campos: nome do procedimento + valor que o convênio paga. Insere em `insurance_plan_services` pro `insurance_plan_id` ativo. + - Wiring em `useAgendaEventLifecycle.js`: novo `planServiceQuickDlgOpen` + `openPlanServiceQuickCreate()` + `onPlanServiceCreated(service)`. Após criar, recarrega `loadInsurancePlans` e **auto-seleciona** o novo procedimento **só quando nada estava selecionado antes** (preserva escolha quando user já tinha selecionado X e está só cadastrando Y pra próxima). + - UI refatorada (`AgendaEventDialog.vue:3110+`): a caixa cinza com botão "Cadastrar" agora aparece **sempre** que um convênio está selecionado. Quando 0 procedimentos: **"Este convênio ainda não tem procedimentos cadastrados."** Quando 1+: **"Se quiser adicionar mais procedimentos a este convênio:"**. + - `planServiceQuickDlgOpen` adicionado ao `anyChildDialogOpen` pra esconder o Resumo flutuante enquanto o quick-create está aberto. + +3. **Botão "+ Novo convênio" faltando em `/melissa/cfg-convenios` (e na rota canônica também)** + - Root cause: `ConfiguracoesConveniosPage.vue` tinha o form de "Novo convênio" condicionado a `addingNew === true`, mas **nenhum botão setava esse flag**. Empty state mandava "Clique em 'Novo convênio'" sem botão pra clicar. + - Fix: toolbar simples no topo do template `