agenda: C5+C6 testes OK + atalho Gerar fatura + RPC idempotência fix
DB - migration 20260519000001: create_financial_record_for_session passa a ignorar status='cancelled' na idempotência (era bug — cancelar e tentar regerar travava silencioso retornando o cancelado) Cenário 5 (convênio) — fixes pra save + visualização - Convênio: amount lia 'price' (null) → agora detecta via insurance_plan_id e usa insurance_value. payment_method forçado 'convenio' (era 'asaas') - Popover: ev.price era null em convênio → normalize expõe insurance_value e paymentLabel faz fallback. Linha mostra "A receber R$ X" corretamente - /financeiro: branch novo pra payment_method='convenio' → pill violeta com pi-id-card (antes ficava sem indicador, igual particular) Cenário 6 (recorrente sem pacote, Maria Magali) — materialização - chargeMode='none' não materializava a 1ª (todas viravam virtuais, sem badge $). Agora materializa a 1ª no fluxo de criação recorrente - Bug intermediário: usei 'paciente_id' (Portuguese) mas agendaRepository dropa esse campo. Corrigido pra 'patient_id' (English DB column) Atalho "Gerar fatura" no popover - Pill amber pequeno ao lado de "A cobrar R$ X" no popover (paymentVariant ='none' + sessão materializada) - Wire em MelissaLayout via emit gerar-cobranca + handler onGerarCobrancaQuick (chama gerarCobrancaManual, fecha popover pra impedir double-click) - Bulk-load do useMelissaAgenda e fetchRecord do AgendaEventoFinanceiroPanel agora filtram status='cancelled' (resolve badge $ residual + botão sumido) Header do popover: info de pacote/série - "Sessão · Pacote · N sessões" ou "Sessão X de Y" abaixo do tipo (computed seriesLabel lê do _raw da rule) Título do dialog "Sessão do Pacote · Sessão" - Quando commitment name é "Sessão" (default), drop pra evitar duplicação - Outros nomes (Avaliação, etc) permanecem com forma completa Excluir série inteira (popover) - Novo botão "Excluir série" no popover quando evento pertence a recorrência - Hard delete: financial_records pendentes → agenda_eventos materializados → recurrence_rules (CASCADE leva exceptions + rule_services) - Bloqueia se algum record tem status='paid' (estornar primeiro) cancel_session some da agenda - useRecurrence.expandRules agora pula occurrence com exception type= 'cancel_session' (era visível com status cancelado; doc dizia "some da agenda" mas código mantinha. Honra a promessa do diálogo) - patient_missed / therapist_canceled / holiday_block permanecem visíveis como histórico UX outros - "+ Novo convênio" toolbar em ConfiguracoesConveniosPage (botão faltava — empty state mandava clicar em botão inexistente) - InsurancePlanServiceQuickCreateDialog: cadastrar procedimento POR CIMA do AgendaEventDialog sem sair da agenda. Auto-seleciona quando nada estava selecionado antes - Hint contextual abaixo do card Sessão/Honorários: convênio = "Nº guia opcional"; gratuito = "sem cobrança". Particular sem hint - recurrence_exceptions cancel agora usa upsert com onConflict (idempotente, não quebra com unique violation em re-cancel) - goToConveniosConfig removida (dead code após quick-create inline) CSS - .aed-row-50 perdeu margin-bottom (user request) - .field-card.mb-4 ganhou margin-top: 1rem (scoped a composer wrappers) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
+21
-21
@@ -1,38 +1,36 @@
|
||||
# HANDOFF — 2026-05-18 noite (C1-C4 OK, UX convênio refinado, C5 ainda não rodou save)
|
||||
# HANDOFF — 2026-05-19 (C1-C6 ✅, próximo C7 — pacote upfront)
|
||||
|
||||
Documento de continuidade. **Quando voltar, comece lendo esta página até o fim.**
|
||||
|
||||
> **🎯 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).
|
||||
> `src/docs/agenda-compromisso-financeiro-cenarios.html`. **C1-C6 ✅**.
|
||||
> Próximo passo: **Cenário 7** (Donald Winnicott · pacote UPFRONT · 4 ×
|
||||
> R$ 200 = cobrança única de R$ 800).
|
||||
|
||||
> **🟡 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.
|
||||
> **🟢 WORKING TREE LIMPO** após commit/push de 19/05 da manhã. Migration
|
||||
> nova (20260519000001) já rodada no DB local. Pronto pra próximo bloco.
|
||||
|
||||
---
|
||||
|
||||
## 🔴 PRÓXIMO PASSO IMEDIATO — Cenário 5 (Convênio)
|
||||
|
||||
Receita do doc HTML. Resumo:
|
||||
## 🔴 PRÓXIMO PASSO IMEDIATO — Cenário 7 (Pacote UPFRONT)
|
||||
|
||||
| Campo | Valor |
|
||||
|---|---|
|
||||
| Paciente | **Sándor** |
|
||||
| Convênio | **Unimed Nacional** (criar via `InsurancePlanQuickCreateDialog` se não existir) |
|
||||
| Valor | **R$ 95** |
|
||||
| Paciente | **Donald Winnicott** |
|
||||
| Frequência | **Semanal · 4 ocorrências** |
|
||||
| Serviço | qualquer (ex: Sessão particular R$ 200) |
|
||||
| Cobrança ao salvar | **Gerar cobrança** + estilo **"Pacote único (upfront)"** |
|
||||
| Total esperado | **R$ 800** (4 × 200) |
|
||||
|
||||
**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)"
|
||||
- 1 row em `recurrence_rules` + **1 row em `agenda_eventos`** (1ª materializada)
|
||||
- 1 row em `billing_contracts` (type=package, charging_style=upfront, total_sessions=4, package_price=800)
|
||||
- **1 row em `financial_records`** com amount=800, status=pending (cobrança ÚNICA do pacote, vencimento na 1ª sessão)
|
||||
- Agenda: 1ª com badge $ (R$ 800 a cobrar) + 3 virtuais limpas (cobertas pelo pacote)
|
||||
|
||||
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`).
|
||||
Após C7: C8 (saldo) → C9 (per_session) → C10-C13 (status change + edit cobrada).
|
||||
Quando todos passarem, replicar em **Rail** (`AgendaTerapeutaPage.vue`) e **Clínica** (`AgendaClinicaPage.vue`).
|
||||
|
||||
---
|
||||
|
||||
@@ -150,7 +148,9 @@ User tentou rodar C5 e bateu em 3 problemas seguidos. Cada um virou um fix:
|
||||
| 2 | Avulsa sem cobrança | ✅ |
|
||||
| 3 | Avulsa cobrar ao salvar | ✅ |
|
||||
| 4 | Avulsa "já recebi" no salvar | ✅ |
|
||||
| **5** | **Avulsa convênio (Sándor + Unimed)** | 🔴 **PRÓXIMO** |
|
||||
| 5 | Avulsa convênio (Sándor + Unimed) | ✅ |
|
||||
| 6 | Recorrente sem pacote (Maria Magali / Anna Freud) | ✅ |
|
||||
| **7** | **Pacote UPFRONT (Donald Winnicott 4 × R$ 200)** | 🔴 **PRÓXIMO** |
|
||||
| 6 | Recorrente sem pacote (Anna Freud 4 sem) | ⏳ |
|
||||
| 7 | Pacote upfront (Donald Winnicott 4× R$ 200) | ⏳ |
|
||||
| 8 | Pacote saldo (Carl Jung 4× R$ 40) | ⏳ |
|
||||
|
||||
Reference in New Issue
Block a user