agenda: C8 OK + Usar/Revogar pacote saldo + UI de contract + ajustes UX
Cenário 8 (Pacote SALDO — Otávio Souza Ferreira 12 × R$ 50)
- Testado e passou. DB: 1 rule, 0 events, 1 contract (saldo), 0 records.
Visual: 12 virtuais limpas no calendário.
UI de pacote (saldo + upfront)
- _ruleContractMap em useMelissaAgenda: bulk-load popula contract info
(id, style, totalSessions, sessionsUsed, packagePrice) por
recurrence_id. Query recurrence_rules.patient_id como fonte
autoritativa — cobre saldo sem materializadas (sem isso, ruleToPatient
via records vinha vazio pra saldo)
- normalize injeta `contract` no evento via ruleContractMap
- MelissaEventoPanel: nova linha colorida (violeta saldo, verde upfront)
com "Pacote saldo · N/M usadas" ou "Pacote · N/M realizadas"
- AgendaEventDialog: info card mt-4 com header+body+hint explicando
modelo, gateado por occFinancialLoading (spinner durante carga
pra evitar piscar entre Usar/Revogar)
Handlers Usar/Revogar atômicos
- onUsarSessao em MelissaLayout: materializa virtual (preserva
determined_commitment_id da regra) → status=realizado +
billing_contract_id → create_financial_record_for_session →
sessions_used++ → (se atingiu total) contract.status=completed
- onRevogarSessao: cancela record + sessions_used-- + reativa contract
se estava completed + status=agendado. Bloqueia se record paid
(precisa estorno formal pelo Financeiro)
- Ambos aceitam payload {eventRow, contract} do dialog OU fallback
pra eventoSelecionado do popover
- Botão "Usar" verde no popover (paymentState=none) substituído por
"Revogar" vermelho (paymentState=pending). Equivalente "Usar agora"/
"Revogar uso" no info card do dialog
Fix enum status_evento_agenda
- 'realizada' não existe no enum — DB exige 'realizado' (masculino).
Corrigido em todas as ocorrências do handler
Fix campo "Título" indevido em sessão
- Sessão sem determined_commitment_id → selectedCommitment=null →
isSessionEvent=false → mostra campo Título (que é só pra não-sessão)
- Fix: materialize do Usar inclui determined_commitment_id (insert
path); update path backfilla via query da rule se NULL; Revogar
também backfilla pra consistência
Fix "Gerar fatura" não cabe em saldo
- Botão "Gerar fatura" do popover hide quando há contractInfo. Em
saldo, gerar fatura solta criaria cobrança duplicada sem incrementar
sessions_used. Fluxo correto: "Usar"
Recorrências Aplicadas — UI
- Header stats coloridos: total **azul**, realizadas **verde**,
faltaram **amber**, canceladas **cinza**, remarcadas **violeta**
- Pills com badge sólido por status (emerald-600 realizado, amber-600
faltou, stone-500 cancelado, violet-600 remarcado)
Race condition no dialog
- AgendaEventDialog mostrava botões Usar/Revogar baseado em
occFinancialRecord async; durante ~500ms de load, botão errado
podia piscar. Fix: spinner "Verificando estado…" enquanto
occFinancialLoading=true; botões só renderizam após
- Popover não fixado (race window pequena, fechar/reabrir resolve)
3 decisões UX confirmadas antes de codar
- Editar serviço pago → NÃO (cobrança fiscal imutável)
- Alternar Particular/Convênio/Gratuito em série cobrada → NÃO
- Gerar fatura individual em pacote upfront → NÃO (duplicação)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -14,6 +14,63 @@ Chronological, append-only record of everything that's happened in this wiki.
|
||||
|
||||
---
|
||||
|
||||
## [2026-05-20 03:00] session | C8 OK + Usar/Revogar saldo + UI pacote + ajustes UX
|
||||
Touched: none (sem nova wiki page; mudancas em codigo + HANDOFF)
|
||||
Detalhes: noite longa cobrindo C8 (pacote saldo) e principalmente
|
||||
construindo a UI/UX de pacote saldo do zero — antes nao tinha
|
||||
indicacao alguma no dialog/popover de que era saldo.
|
||||
|
||||
CENARIO 8 (Pacote SALDO):
|
||||
- Criou Otavio 12 sessoes R$50 saldo
|
||||
- DB conforme esperado: 1 rule, 0 events, 1 contract (saldo), 0 records
|
||||
- Visual conforme esperado: 12 virtuais limpas
|
||||
|
||||
UI DE PACOTE (saldo + upfront):
|
||||
- _ruleContractMap em useMelissaAgenda: bulk-load popula contract info
|
||||
por recurrence_id (query recurrence_rules.patient_id como fonte
|
||||
autoritativa, cobre saldo sem materializadas)
|
||||
- Normalize injeta `contract` no evento
|
||||
- Popover MelissaEventoPanel: linha colorida (violeta saldo, verde
|
||||
upfront) com "Pacote X · N/M usadas|realizadas" + botão Usar
|
||||
(verde, paymentState=none) OU Revogar (vermelho, paymentState=pending)
|
||||
- AgendaEventDialog: info card mt-4 com header+body+hint explicando
|
||||
modelo, botão "Usar agora"/"Revogar uso" gateado por
|
||||
occFinancialLoading (spinner durante carga)
|
||||
|
||||
HANDLERS USAR/REVOGAR ATOMICOS:
|
||||
- onUsarSessao: materializa virtual + status=realizado + record per-session
|
||||
+ sessions_used++ + (se total) contract status=completed
|
||||
- onRevogarSessao: cancela record + sessions_used-- + reativa contract
|
||||
+ status=agendado. Bloqueia se record paid (estorno formal precisa)
|
||||
- Ambos aceitam payload do popover OU do dialog
|
||||
|
||||
FIXES NA RODADA:
|
||||
- Enum status_evento_agenda usa 'realizado' (masculino), nao 'realizada'
|
||||
- determined_commitment_id backfill no materialize+revogar+update path
|
||||
(sem isso, dialog mostrava campo "Titulo" indevidamente)
|
||||
- "Gerar fatura" do popover esconde quando ha contract (evita
|
||||
duplicacao em saldo)
|
||||
- Race condition no dialog: spinner enquanto occFinancialLoading,
|
||||
botoes so renderizam apos carga
|
||||
|
||||
RECORRENCIAS APLICADAS — UI:
|
||||
- Header stats coloridos por status (azul total, verde realizadas,
|
||||
amber faltaram, cinza canceladas, violeta remarcadas)
|
||||
- Pills com badge solido por status (em vez de texto cinza)
|
||||
|
||||
DECISAO UX antes de codar (3 perguntas):
|
||||
- Editar servico pago? NAO (cobranca fiscal imutavel)
|
||||
- Alternar Particular/Convenio/Gratuito em serie cobrada? NAO
|
||||
- Gerar fatura individual em pacote upfront? NAO (duplicacao)
|
||||
Tudo isso o lock-edit (Fase 6) cobre.
|
||||
|
||||
DECISAO UX "Usar" vs "Confirmacao":
|
||||
- Recomendei Revogar (undo) em vez de confirmacao toda vez
|
||||
- Friction baixo no fluxo principal (usuario "Usa" 12x ao longo de 3 meses)
|
||||
- Reversivel enquanto record pending; paid bloqueia
|
||||
|
||||
PROXIMO: Cenario 9 (Michael Balint per_session 12 x R$150).
|
||||
|
||||
## [2026-05-19 23:00] session | C7 OK + Fase 6 lock em Melissa + cross-week propagation
|
||||
Touched: project_cross_week_propagation (nova)
|
||||
Detalhes: rodada longa cobrindo C7 (pacote upfront, Ana Souza Ferreira 4xR$200=R$800),
|
||||
|
||||
Reference in New Issue
Block a user