diff --git a/HANDOFF.md b/HANDOFF.md index b7bac20..7fbc036 100644 --- a/HANDOFF.md +++ b/HANDOFF.md @@ -1,15 +1,38 @@ -# HANDOFF — 2026-05-20 (C10 ✅ completo · próximo C11) +# HANDOFF — 2026-05-20 (C10 ✅ + C11 ✅ · próximo C12) Documento de continuidade. **Quando voltar, comece lendo esta página até o fim.** -> **🎯 SE A FORÇA CAIR / SESSÃO PERDER CONTEXTO:** **C10 fechado** (todos -> os 5 sub-testes A/A2/B/C/C2 passaram). Próximo: **Cenário 11** (status -> change em pacote saldo — Carl Jung ou similar). Pós C11: C12 (antecipar -> pagamento) → C13 (edit cobrada). Depois replicar em Rail + Clínica. +> **🎯 SE A FORÇA CAIR / SESSÃO PERDER CONTEXTO:** **C10 e C11 fechados**. +> Próximo: **Cenário 12** (antecipar pagamento). Pós C12: C13 (edit cobrada). +> Depois replicar em Rail + Clínica. -> **🟢 C10 SALVO COMPLETO**. 3 commits: d6423da (pre-fix cancel original) -> → 3caf579 (botão Agendada + popover fixes) → 753182c (lock sessão -> encerrada + addendum doc). Working tree limpo, pronto pra C11. +> **🟢 C10+C11 SALVOS**. Total 10 commits no dia. Reverse transition trava +> implementada (era pendência pós-C13 mas user hit pra valer durante C11 +> e priorizamos). billing_contracts gotcha (sem updated_at) documentado. + +### C11 sub-test results +| # | Teste | DB validado | +|---|---|---| +| 11A | Realizada + markPaid PIX | sessions_used 0→1, record paid R$ 40 PIX | +| 11B | Falta + Descontar saldo | sessions_used 1→2, sem multa | +| 11C | Falta + Multa SEM consumir | sessions_used stays 2, multa pending R$ 30 | +| 11D | Cancelado + default_consume_on_miss=true | sessions_used 2→3, sem multa (>2h) | + +### Bugs descobertos + corrigidos durante C11 +- UI "Como cobrar?" com options "Já recebi" misturadas → refatorado pra "Já recebi?" radio Sim/Não + select condicional +- `billing_contracts` sem coluna `updated_at` → UPDATE falhava silently em Promise.allSettled (root cause do saldo não incrementar). Trocado pra awaits sequenciais com error handling explícito +- Reverse transitions deixavam multa órfã → dialog reverse implementado com radio "cancelar pending" + "devolver saldo" + warning pra paid +- Botão "Gerar cobrança" em sessão encerrada → bloqueado +- Lock total em cancelado/faltou: Editar sessão some, status mudanças disabled exceto Agendada (recovery) +- Label "A cobrar R$ X" em pacote saldo state=none → "Aguardando uso do pacote" +- Badge $ amber em pacote saldo state=none → suprimido +- billing_contract_id não amarrado em alguns flows → link universal antes dos blocos forward +- Reverse saldo decrementar: refresh sessions_used FRESH do DB antes do UPDATE (anti-race) + +### Pendências mapeadas pós-C13 +- **Popover snapshot**: `eventoSelecionado.value = ev` é snapshot. Fix: guardar ev.id, derivar via computed +- ~~Reverse transitions~~ ✓ implementado ahead of schedule +- **Cleanup teste**: Otto sessão 5364f631 leftover (não-critical) ### C10 sub-test results | # | Teste | DB validado | Notas | diff --git a/Obsidian/Brain/log.md b/Obsidian/Brain/log.md index 3d47cf4..f043eac 100644 --- a/Obsidian/Brain/log.md +++ b/Obsidian/Brain/log.md @@ -14,6 +14,48 @@ Chronological, append-only record of everything that's happened in this wiki. --- +## [2026-05-20 16:00] session | C11 OK (A/B/C/D) + reverse trava + 5 bugs achados +Touched: none (codigo + HANDOFF; memoria project_billing_contracts_no_updated_at) +Detalhes: + +CENARIO 11 (Status change pacote saldo) - 4/4 passaram com Andre Green: +- 11A: realizada + markPaid PIX (saldo 0->1, record paid R$ 40) +- 11B: falta + descontar (saldo 1->2, sem multa) +- 11C: falta + multa SEM consumir (saldo stays 2, multa pending R$ 30) +- 11D: cancelado >2h + default_consume_on_miss=true (saldo 2->3, sem multa) + +ROOT CAUSE descoberto: billing_contracts NAO tem coluna updated_at. +Passar esse field em UPDATE falhava silently em Promise.allSettled +(ja documentado em memoria). Refatorado pra awaits sequenciais com +error handling explicito. + +DIALOG UX (refator): bloco "Cobranca no pacote" antes tinha select +"Como cobrar?" com options "Ja recebi - PIX/Dinheiro" misturadas. +Confuso. Agora tem 2 sub-questions: "Ja recebi?" radio + select +condicional (sem prefixo ambiguo). + +REVERSE TRANSITION TRAVA (antecipado pos-C13 pra C11): quando user +clica Agendada em sessao com artefatos (cobranca pending, paid, +ou saldo consumido em pacote), dialog reverse abre mostrando: +- Lista records pending + radio Cancelar/Manter +- Warning textual pra paid (sem auto-estorno) +- Radio devolver saldo se consumido +- Default: cancel + devolver (recovery flow) + +Outros fixes acumulados: +- consumeSaldo amarra billing_contract_id (era omissao) +- link universal pre-forward (antes era so em consumeSaldo/generatePackageCharge) +- reverse decrement saldo: refetch FRESH antes do UPDATE (anti-race) +- label pacote saldo state=none: "Aguardando uso do pacote" +- badge $ amber suprimido em pacote saldo state=none +- lock total em sessao encerrada (Editar some, status disabled excepto Agendada) + +DOC: addendum no HTML cenarios atualizado anteriormente cobre tudo. +Memorias: project_billing_contracts_no_updated_at (novo gotcha). + +PROXIMO: Cenario 12 (antecipar pagamento) ou Cenario 13 (edit +cobrada). Depois replicar em Rail + Clinica. + ## [2026-05-20 14:00] session | C10 OK (A/A2/B/C/C2) + lock sessao encerrada + addendum doc Touched: none (codigo + HANDOFF + addendum HTML; memorias project_agenda_reverse_transitions e project_melissa_popover_snapshot) Detalhes: