Files
agenciapsilmno/HANDOFF.md
T
Leonardo 15103eded5 Cleanup: backups antigos removidos + dashboard config + HANDOFF/log
- Remove database-novo/backups/2026-03-27 e 2026-03-29 (deveriam estar
  no gitignore, mas haviam sido tracked antes)
- Atualiza db.config.json + generate-dashboard.cjs + dashboard.html
- HANDOFF.md atualizado com estado de 05-05 (sprint blueprint tabular +
  arquivamento de pacientes)
- Obsidian/Brain/log.md: entrada da sessao 05-05 adicionada

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 09:15:22 -03:00

437 lines
19 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# HANDOFF — 2026-05-05 (sprint blueprint tabular Melissa + arquivamento de pacientes)
Documento de continuidade. **Quando voltar, comece lendo esta página.**
> **🟡 PENDENTE — Sub-sessão 2 do A66 (V2 dialog)**: skeleton entregue
> em 2026-05-05 mas user **não gostou do design** ao olhar o preview.
> Aguarda feedback específico (3 zonas tá errado? hierarquia? hero
> grande demais? mobile? referência visual?). Iteração só depois disso.
> Detalhes na seção "Sessões dedicadas pendentes" no fim deste doc.
> **🟢 ENTREGUE HOJE — Blueprint de página tabular Melissa**: documentado
> em `blueprints/melissa-table-page-blueprint.md` (~530 linhas, 18 seções)
> e aplicado em **MelissaCadastrosRecebidos** (refator) +
> **MelissaAgendamentosRecebidos** (NOVO, native page) +
> **MelissaPacientes** (refator parcial). Inclui DataTable com `:loading`
> + `paginator` + frozen action column, view toggle list/grade,
> sidebar com filtros coloridos por status, subheader explicativo,
> Tailwind 600 status colors, e mobile pencil + popover menu.
Sessão de polimento e estruturação — não houve commit. Working tree
acumulada de 4 sprints (28 modificados + 22 novos).
---
## 🚦 STATUS — Working tree
**Modificados:**
```
M HANDOFF.md
M database-novo/agenciapsi-db-dashboard.html
M database-novo/db.config.json
M database-novo/generate-dashboard.cjs
M src/components/notifications/NotificationDrawer.vue
M src/components/notifications/NotificationItem.vue
M src/composables/useFeriados.js
M src/features/agenda/components/AgendaClinicMosaic.vue
M src/features/agenda/components/AgendaEventDialog.vue ← A66 sub-sessão 1 done
M src/features/agenda/composables/useAgendaSettings.js
M src/features/agenda/pages/AgendaTerapeutaPage.vue
M src/features/documents/DocumentsListPage.vue
M src/features/patients/cadastro/PatientsCadastroPage.vue ← statusOpts +Arquivado HOJE
M src/features/patients/prontuario/PatientConversationsTab.vue
M src/features/patients/prontuario/PatientProntuario.vue
M src/features/patients/services/patientsRepository.js ← +restorePatient HOJE
M src/layout/melissa/MelissaAgenda.vue
M src/layout/melissa/MelissaCadastrosRecebidos.vue ← refator blueprint HOJE
M src/layout/melissa/MelissaEmbed.vue ← agendamentos-recebidos removido HOJE
M src/layout/melissa/MelissaEventoPanel.vue
M src/layout/melissa/MelissaLayout.vue ← MAR wire-up HOJE
M src/layout/melissa/MelissaPacientes.vue ← refator grande HOJE
M src/layout/melissa/composables/useMelissaAgenda.js
M src/layout/melissa/composables/useMelissaEventos.js
M src/layout/melissa/composables/useMelissaPacientes.js
M src/layout/melissa/composables/useMelissaPacientesAside.js
M src/router/routes.misc.js
D database-novo/backups/2026-03-27/ (3 arquivos antigos)
D database-novo/backups/2026-03-29/ (3 arquivos antigos)
```
**Novos:**
```
?? blueprints/melissa-table-page-blueprint.md ← NOVO HOJE
?? database-novo/migrations/20260504000001_fix_cancel_notifications_excluido.sql
?? src/features/agenda/components/AgendaEventDialog.vue.bak ← rollback A66
?? src/features/agenda/components/AgendaEventDialogV2.vue ← A66 sub-sessão 2 (NÃO TESTADO)
?? src/features/agenda/components/InsurancePlanQuickCreateDialog.vue
?? src/features/agenda/components/ServiceQuickCreateDialog.vue
?? src/features/agenda/composables/agendaEventHelpers.js ← A66 1A
?? src/features/agenda/composables/useAgendaEventActions.js ← A66 1C-i
?? src/features/agenda/composables/useAgendaEventComposer.js ← A66 1B
?? src/features/agenda/composables/useAgendaEventLifecycle.js ← A66 1C-ii-b
?? src/features/agenda/composables/useAgendaEventPickerBilling.js ← A66 1C-ii-a
?? src/features/agenda/composables/__tests__/ (5 specs)
?? src/features/patients/prontuario/PatientProntuario.vue.bak
?? src/layout/melissa/MelissaAgendaHistoricoCard.vue
?? src/layout/melissa/MelissaAgendamentosRecebidos.vue ← NOVO HOJE
?? src/layout/melissa/composables/useMelissaAgendaHistorico.js
?? src/layout/melissa/composables/useMelissaDockPins.js
?? src/stores/melissaCacheStore.js
?? src/views/pages/preview/ (V2 preview)
```
---
## ✅ FEITO HOJE (2026-05-05)
### 1. Blueprint de página tabular — `melissa-table-page-blueprint.md`
Novo arquivo em `blueprints/`. ~530 linhas, **18 seções**:
1. Princípio (sidebar de filtros + main com toolbar + tabela)
2. Estrutura do template (com **subheader explicativo**)
3. Estado JS (script setup) — busca, statusFilter, paginação, viewMode
4. DataTable view Lista — props canônicas explicadas
5. View Grade — cards em CSS grid, `<div role="button">`
6. Tokens de surface (light/dark) — `--p-content-background` canônico
7. Cores de status — Tailwind 600 (azul/verde/vermelho), aplicadas em 4 lugares
8. Filtro de status + Limpar filtro com Transition fade
9. **Subheader explicativo** — diferencia páginas de layout idêntico
10. Toolbar — busca + view toggle
11. DataTable estilos completos (header transparent, frozen column, paginator)
12. Botão pencil — coluna fixa
13. Empty / loading
14. Mobile (<1024px) — scroll horizontal, NÃO esconde colunas
15. Acessibilidade
16. Checklist de adoção (16 itens)
17. Anti-patterns (11 erros documentados)
18. Referência canônica → `MelissaCadastrosRecebidos.vue`
### 2. MelissaCadastrosRecebidos — refator pra blueprint
Antes era lista de cards verticais; agora é DataTable PrimeVue com:
- **Sidebar** `--m-bg-soft` + border-right + sombra `0 2px 8px` nos cards
- **Stats card** (Total / Novos / Convertidos / Rejeitados) — Novos azul / Conv verde / Rej vermelho
- **Status filter card** com 3 níveis de cor (default 5%, hover 10%, active 16% + ring) + botão
"Limpar filtro" com Transition fade quando ativo
- **Toolbar main** com search + view toggle (lista/grade)
- **DataTable** `:loading + paginator + scrollable scrollHeight="flex"
+ tableStyle="min-width:640px"` — colunas: Paciente / Contato / Recebido / Ação (frozen 60px right)
- **Coluna frozen** com bg `--p-content-background` (canônico, opaco em ambos modos),
sombra à esquerda, hover/selected herdam da row
- **Botão pencil** (`mcr-row__action`) primary tinted
- **View Grade** alternativa — cards em CSS grid `auto-fill, minmax(220px, 1fr)`
com Paginator standalone abaixo
- **Subheader explicativo** com `pi pi-info-circle` em primary
### 3. MelissaAgendamentosRecebidos — NOVO native page
Substitui o embed via `MelissaEmbed`. Espelha 1:1 o blueprint, prefixo `mar`.
- Tabela DB: `agendador_solicitacoes` (não `patient_intake_requests`)
- **4 status com cores próprias**:
- 🔵 Pendente (`rgb(37, 99, 235)`)
- 🟢 Autorizado (`rgb(22, 163, 74)`)
- 🟦 Convertido (`rgb(13, 148, 136)` — teal, distinto)
- 🔴 Recusado (`rgb(220, 38, 38)`)
- **DataTable**: 6 colunas (Paciente / Solicitado / Tipo / Contato / Recebido / Ação frozen)
- **3 ações condicionais** no dialog de detalhes:
- **Pendente** → Recusar (com motivo) | Autorizar | Converter em sessão
- **Autorizado** → Converter em sessão (cria paciente se necessário + abre `AgendaEventDialog`)
- **Convertido/Recusado** → só fechar
- **AgendaEventDialog wired** com props canônicas (event-row, owner-id, tenant-id,
agenda-settings, commitment-options, preset-commitment-id,
restrict-patients-to-owner)
- Subheader explicativo próprio
**Wire-up no `MelissaLayout.vue`:**
- Import de MelissaAgendamentosRecebidos
- `MELISSA_EMBED_KEYS` perdeu `agendamentos-recebidos`
- `MELISSA_NON_CONFIG_SLUGS` ganhou direto
- Render block conditional entre Cadastros e Médicos
- `MelissaEmbed.EMBED_MAP` perdeu a entry agendamentos-recebidos (com comentário)
**Importante**: o `MelissaEmbed.vue` foi modificado pra fazer `hideChrome` flag
+ close flutuante numa tentativa anterior — **revertido** ao original
porque ficou ruim. Layout Rail (`/therapist/agendamentos-recebidos`,
`/admin/agendamentos-recebidos`) continua usando `AgendamentosRecebidosPage.vue`
inalterada.
### 4. MelissaPacientes — refator parcial pra blueprint
A página é 3-pane (filters / list / detail) — não converti pra
DataTable (perderia o detail panel). Aplicado o que faz sentido:
**Sidebar:**
- Sombra `0 2px 8px` nos cards `.mp-w` (sidebar + quick view direita)
- Status pills com cores próprias por status:
- Todos = neutral (sem cor)
- 🟢 Ativos verde
- 🟡 Inativos amber `rgb(217, 119, 6)` (warn, pausa temporária)
- 🔴 Arquivados vermelho
- Botão "+" do header de Grupos/Tags **substituído** por:
- Botão `pi pi-cog` no header (sem borda, hover primary) — emite
`goto-grupos`/`goto-tags` que navegam pras Melissa Pages nativas
- Botão tracejado "+ Grupo / + Tag" (texto sem "+", só com ícone
`pi pi-plus`) abaixo de cada lista — abre popover de criação
- Botão `[×]` (clear filter) agora vermelho `rgb(220, 38, 38)`
**Card de paciente (list view):**
- **Email em coluna própria** (220px, truncate) — separada do main
- **Telefone em coluna própria** (140px) — paralela ao email
- Em mobile (<768px) email/phone escondem (info no detail panel)
- Subheader explicativo
**Mobile:**
- Coluna ação fixa (`position: sticky; right: 0; bg --m-bg-medium`)
- 5 botões inline → 1 botão `pi pi-pencil` único que abre `<Popover>`
- **Popover de ações** global no fim da `<section>` com 5 items:
Prontuário / Sessões / WhatsApp / Editar / Arquivar (com divider)
- Bug fix: **`min-height: 0` na `.mp-list`** — sem isso a `mp-list__body`
não scrollava em mobile (`flex: 1; overflow-y: auto` precisa de
parent constrained)
**Toolbar:**
- View toggle list/grade (persistido em `mp.viewMode.v1` localStorage)
- Botão "Novo paciente" usa `PatientCreatePopover` (mesmo do agenda) —
já estava wired, só explicitei `$event` no click handler
**Grid view (NOVO):**
- CSS grid `auto-fill, minmax(240px, 1fr)`
- Cards com avatar+pencil topo, nome+novo, status, email+phone empilhados,
tags, "Última: X" com border-top
- Mantém `selecionarPaciente` (mostra detail panel mesmo no grid)
- `<div role="button" tabindex="0">` com handlers de teclado
### 5. Subheader explicativo (padrão novo do blueprint § 9)
Aplicado em 3 páginas, cada uma com texto próprio que diferencia
páginas de layout idêntico:
- **MelissaCadastrosRecebidos**: "Cadastros completos enviados por
pacientes via formulário externo (link público). Revise os dados,
**converta em paciente ativo** com 1 clique ou **rejeite** com motivo
opcional."
- **MelissaAgendamentosRecebidos**: "Solicitações de horário vindas do
agendador online à espera de ação. **Autorize** pra reservar o slot,
**recuse** com motivo, ou **converta direto em sessão** — a gente cria
o paciente automaticamente se ainda não existir."
- **MelissaPacientes**: "Lista completa dos pacientes cadastrados.
Filtre por **status, grupo ou tag** à esquerda, busque por nome ou
contato, e clique numa linha pra abrir o **prontuário** com histórico,
sessões e documentos."
CSS padrão: `bg --m-bg-soft` + ícone `pi pi-info-circle` em primary +
texto muted 0.78rem com `<strong>` em `--m-text`. Border-bottom matching
o page__head.
### 6. Arquivamento de pacientes — restore implementado
**Repository** (`patientsRepository.js`):
- Novo `restorePatient(id, { tenantId })` — espelha `softDeletePatient`
mas seta `status = 'Ativo'`
**PatientsCadastroPage** (`statusOpts:749`):
- Adicionado `{ label:'Arquivado', value:'Arquivado' }` à lista de
opções do dropdown — fecha o gap de inconsistência ao editar paciente
arquivado
**MelissaPacientes**:
- Helper `isArquivado(p)` (case-insensitive)
- Função `restaurarPaciente(p)` com confirm dialog → `restorePatient` →
toast "Restaurado" → `refetchTudo`
- **Toggle visual condicional**:
- Paciente **ativo**: 🗑 trash vermelho ("Arquivar")
- Paciente **arquivado**: ↶ undo primary ("Restaurar")
- Aplicado em ambos contextos:
- Desktop (5 botões inline) — `mp-card__action--restore` com hover primary
- Mobile popover menu — `mp-actions-menu__item.is-restore`
---
## 🧪 ROTEIRO DE TESTE (rápido — ~15 min)
### Setup
```powershell
Remove-Item -Recurse -Force node_modules\.vite -ErrorAction SilentlyContinue
npm run dev
```
### Fase 1 — MelissaCadastrosRecebidos (5 min)
- `/melissa/cadastros-recebidos` → DataTable com header transparent +
bold, paginator centralizado, coluna Ação frozen direita com bg
branco no light
- Toolbar: search + view toggle (lista/grade)
- Sidebar: stats com Novos azul, Convertidos verde, Rejeitados vermelho
(quando >0); Status filter com 3 cores + Limpar filtro fade
- Subheader azul info-circle explicativo
- Mobile: drawer abre, scroll horizontal funciona, pencil único na
Ação frozen, todas colunas visíveis (não escondem)
### Fase 2 — MelissaAgendamentosRecebidos (5 min)
- `/melissa/agendamentos-recebidos` → mesma estrutura, 4 status com cor
(Pendente azul / Autorizado verde / Convertido teal / Recusado vermelho)
- Click numa pendente → dialog mostra 3 ações (Recusar / Autorizar /
Converter em sessão); converter cria paciente automático + abre
AgendaEventDialog
- Subheader próprio diferenciando da Cadastros Recebidos
### Fase 3 — MelissaPacientes (5 min)
- `/melissa/pacientes`:
- Sidebar com sombras nos cards (Estatísticas, Status, Grupos, Tags)
- Cards Grupos/Tags: cog `` no header (sem borda, navega pra
`/melissa/grupos` e `/melissa/tags`); botão tracejado "+ Grupo" /
"+ Tag" abaixo da lista; X de limpar filtro vermelho
- Status pills coloridas (Ativos verde / Inativos amber / Arquivados
vermelho)
- Card de paciente: email coluna própria, phone coluna própria
- Toolbar: view toggle lista/grade (persiste); "Novo paciente" abre
PatientCreatePopover com 3 opções (rápido / completo / link)
- **Mobile (<1024px)**: scroll vertical funciona (era bug, corrigido com
`min-height: 0` na `.mp-list`); ações reduzem a 1 pencil sticky-right
com Popover de 5 items
- **Restore de arquivado**:
- Filtra por "Arquivados" (cor vermelha)
- Hover num card → desktop mostra ↶ "Restaurar" (primary) no lugar
do 🗑 trash
- Mobile: pencil → popover mostra "Restaurar" primary
- Click → confirm "Restaurar X?" → status volta a Ativo → some do
filtro Arquivados, aparece em Ativos
---
## ⏭️ PRÓXIMOS PASSOS (sugestão)
### 1. Decidir A66 V2 — design
User testou o esqueleto V2 em `/preview/agenda-dialog-v2` (rota em
`routes.misc.js`) e **não gostou do design**. Aguarda feedback
específico antes de iterar:
- Estrutura: 3 zonas (PACIENTE/QUANDO/O QUÊ) tá errado? Prefere 2 zonas?
1 coluna scroll? Tabs?
- Hierarquia: hero PACIENTE muito grande/pequeno?
- Densidade: airy demais ou apertado demais?
- Chips de duração/scope/status: muito visuais?
- Mobile: já testou viewport pequeno?
- Referência visual: Win11? Cleaner? Mais como V1? Algum app?
Quando tiver feedback, iterar em `AgendaEventDialogV2.vue`. Sub-sessão
3 (migração nos 9 consumers) só depois do V2 estabilizar.
### 2. Aplicar blueprint nas demais páginas tabulares Melissa
Ainda faltam (todas seguem `melissa-table-page-blueprint.md`):
- `MelissaCompromissos.vue`
- `MelissaMedicos.vue`
- `MelissaConversas.vue`
- `MelissaRecorrencias.vue`
- `MelissaTags.vue`
- `MelissaGrupos.vue`
Padrão: prefixo próprio (`mco`, `mmd`, etc.), sidebar com filtros
coloridos, DataTable com frozen action column, view toggle, subheader,
mobile pencil+popover.
### 3. Decidir commits
Acumulado de 4 sprints sem commitar (28 mod + 22 novos). Sugestão de
chunks lógicos (em ordem temporal):
1. **Sprint A** — Sprint 04-29/30 (hub Configurações + 7 Melissa Pages
+ dialog blueprint dark)
2. **Sprint B** — Sprint 05-03 (timeline FullCalendar parity, cards
resumo, dock pins, topbar, NotificationDrawer redesign,
melissaCacheStore, useMelissaDockPins)
3. **Sprint C** — Sprint 05-04 (MelissaAgendaHistoricoCard, useFeriados
cache opt-in, PatientProntuario aba Visão Geral, migration
`20260504000001_fix_cancel_notifications_excluido.sql`)
4. **Sprint D** — A66 sub-sessão 1 (5 composables + 5 specs + 265
testes) + sub-sessão 2 esqueleto (V2 + preview) — **MARCAR como WIP**
5. **Sprint E HOJE** — Blueprint tabular Melissa + MelissaCadastrosRecebidos
+ MelissaAgendamentosRecebidos + MelissaPacientes refator + restore
de pacientes arquivados
### 4. Restore em outros layouts
A `PatientsListPage.vue` (layout Rail) também tem KPI "Arquivados"
mas SEM botão Restaurar. Quando tocar nela, replicar o pattern:
botão condicional ↶ "Restaurar" baseado em `p.status === 'Arquivado'`,
chama `restorePatient` do mesmo repository.
---
## 🛠️ Sessões dedicadas pendentes
### A66 — Refactor `AgendaEventDialog` V2 (3 sub-sessões)
**Estado**:
- ✅ Sub-sessão 1 (composables) — 5 composables + 265 testes, 495/495
suite passando, AgendaEventDialog 3522→2632 linhas (-25%)
- 🟡 Sub-sessão 2 (template V2) — esqueleto entregue 2026-05-05,
**user não gostou do design**, aguarda feedback específico
- ⏳ Sub-sessão 3 (migração nos 9 consumers) — depende do V2 estabilizar
**Por que sessão dedicada**: arquivo tinha 3522 linhas, é consumido em
9 páginas críticas (AgendaTerapeutaPage, AgendaClinicaPage,
MelissaLayout, MelissaEventoPanel, useMelissaAgenda,
AgendamentosRecebidosPage, TherapistDashboard, AgendaDevDocs).
Refatoração inteira não cabe em uma única conversa sem alto risco
de regressão.
**Estado dos arquivos**:
- Backup: `src/features/agenda/components/AgendaEventDialog.vue.bak`
(155KB, byte-idêntico ao original)
- 5 composables novos em `src/features/agenda/composables/`:
`agendaEventHelpers.js` (262L) +
`useAgendaEventComposer.js` (485L) +
`useAgendaEventActions.js` (387L) +
`useAgendaEventPickerBilling.js` (378L) +
`useAgendaEventLifecycle.js` (474L)
- 5 specs em `__tests__/` (75+76+28+43+43 = 265 testes)
- `AgendaEventDialogV2.vue` (~1100L, 3 zonas) — não testado visualmente
- Preview em `/preview/agenda-dialog-v2` com 5 cenários
**Próxima ação**: user dá feedback design → eu itero V2.
---
## 📚 Tracking persistente
- **A66** — sub-sessão 2 (V2 design) aguardando feedback do user
- **Blueprint tabular Melissa** — referência canônica:
`MelissaCadastrosRecebidos.vue`. Próximas adoções planejadas:
Compromissos, Médicos, Conversas, Recorrências, Tags, Grupos
- **Restore pacientes** — implementado no Melissa; replicar no Rail
(`PatientsListPage.vue`) quando tocar
- **Migration aplicada local**: `20260504000001_fix_cancel_notifications_excluido.sql`
(cancela 'excluido' do enum trigger). Já aplicada no DB local.
---
## 📦 Setup pra retomar
```powershell
# Limpa cache do Vite (recomendado depois de muita mudança em styles)
Remove-Item -Recurse -Force node_modules\.vite -ErrorAction SilentlyContinue
# Sobe dev
npm run dev
# Build sanity check (opcional, mas roda em ~25s)
npm run build
```
**Suite de testes** (495 testes do A66 incluídos):
```powershell
npm run test
```
**Login**: user com `layout_variant=melissa` no profile pra testar
direto em `/melissa/...`. Pra testar Rail (regressão), troca em
`/account/profile` → terceiro card "Layout".
---
**Boa noite. Amanhã começa pelo feedback do A66 V2 ou aplicação do
blueprint nas demais Melissa Pages tabulares — o que você preferir.**