agenda: C7 OK + Fase 6 lock-edit ativada em Melissa + cross-week payment propagation
Cenário 7 (Pacote UPFRONT — Ana Souza Ferreira 4×R$ 200 = R$ 800)
- Testado e passou. User criou Ana, pagou os R$ 800 em dinheiro pelo
Financeiro. Borda verde + popover "Pago R$ 800" funcionando.
Fase 6 (lock-edit cobrada) ativada em Melissa
- Removido guard `if (!props.occurrenceMode) return;` em
loadOccFinancialRecord (useAgendaEventLifecycle.js:217+). Agora ele
carrega em ambos modos (Rail/Clínica E Melissa)
- loadOccFinancialRecord SINTETIZA record paid/pending pra siblings de
contrato upfront ativo — assim TODAS as ocorrências da série mostram
"Cobrança paga R$ 800 do pacote" no AgendaEventDialog
- AgendaEventDialog card Sessão/Honorários (flow Melissa) ganhou lock
template: Tag em vez de Select billingType quando occFinancialRecord
existe; Message com cadeado "Cobrança de R$ X já emitida"
- AgendaEventoFinanceiroPanel só renderiza dentro do lock quando record
é REAL (não sintetizado) — evita "Gerar cobrança" indevido em sibling
- paymentSummary do Resumo lateral unificado pra usar occFinancialRecord
(em vez do sessionPaymentRecord paralelo de antes)
Cross-week propagation de pacote upfront
- BUG: ao navegar pra semana só com virtuais (sem reais), bulk-load
caía no else `_rulePaymentMap.value = {}` — virtuais perdiam estado
paid herdado
- FIX em useMelissaAgenda._reloadRange:
* Maps (payment/amount/rule) inicializados SEMPRE no início
* Propagação roda independente de realIds.length (depende só de
ruleIdsInView.size>0, considera reais E virtuais com recurrence_id)
* Query cross-week: pra cada rule em view, busca QUALQUER evento
sibling em qualquer semana + seus records pra determinar estado do
contrato. Encontra o record do pacote mesmo em outra semana
- Saldo NÃO propaga (filter: charging_style='upfront' || NULL); cada
sessão de saldo gera cobrança individual ao realizar
- Memória durável: memory/project_cross_week_propagation.md
Visualização de virtuais cobertas
- MelissaEventoPanel.showPaymentRow: virtuais só escondem quando state
='none'. Com paid/pending herdado, exibem linha colorida
- MelissaAgenda fcEvents: isPaidSession e badge $ pendente removeram
exigência de !is_occurrence. Virtuais herdadas via propagação mostram
borda verde / badge amber
Atalho "Gerar fatura" no popover
- Pill amber pequeno ao lado de "A cobrar R$ X" quando paymentVariant
='none' && !is_occurrence. Click → gerarCobrancaManual direto, fecha
popover pra impedir double-click. Tooltip: "Gerar fatura agora"
- Wire em MelissaLayout via novo emit gerar-cobranca + handler
onGerarCobrancaQuick
Info de pacote no popover
- Header agora mostra "Sessão · Pacote · N sessões" (computed
seriesLabel lê de _raw do rule)
Botão "Excluir série inteira"
- Novo emit delete-series em MelissaEventoPanel + botão ao lado de
"Excluir sessão" quando evento tem recurrence_id
- Handler onDeleteSeries em MelissaLayout: hard delete em 3 etapas
(financial_records pendentes → agenda_eventos materializados →
recurrence_rules CASCADE leva exceptions). Bloqueia se algum record
paid (estorno via Financeiro primeiro)
cancel_session some da agenda
- useRecurrence.expandRules agora pula occurrence com exception.type=
'cancel_session' (era visível com status cancelado; doc dizia que
some). patient_missed/therapist_canceled/holiday_block permanecem
como histórico
recurrence_exceptions cancel idempotente
- MelissaLayout onDeleteEvento usa upsert com onConflict pra exception
cancel — não quebra mais com unique violation em re-cancel
billing_contract_id na 1ª materializada
- _createPackageContract agora .select() o contrato após insert e seta
billing_contract_id no insert da 1ª agenda_eventos materializada
onVerLancamentos cobre virtual de upfront
- Antes virtual sempre toast "Sem lançamentos". Agora busca records via
siblings da série pra encontrar o do pacote. Saldo/sem pacote continua
com toast
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -14,6 +14,65 @@ Chronological, append-only record of everything that's happened in this wiki.
|
||||
|
||||
---
|
||||
|
||||
## [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),
|
||||
ativacao do lock-edit (Fase 6) em Melissa e correcao de bug cross-week
|
||||
na propagacao de estado de pagamento.
|
||||
|
||||
CENARIO 7 (Pacote UPFRONT):
|
||||
- User criou Ana, pagou os R$800 em dinheiro pelo Financeiro
|
||||
- Borda verde + popover "Pago R$800" no card materializado funcionou
|
||||
- 4 pills no dialog da serie, todas com "Cobranca paga R$800 do pacote"
|
||||
ate as virtuais (via synthesized record em loadOccFinancialRecord)
|
||||
|
||||
LOCK-EDIT (Fase 6) ATIVADO EM MELISSA:
|
||||
- Antes: loadOccFinancialRecord tinha guard occurrenceMode, so ativo
|
||||
em Rail/Clinica. Em Melissa havia sessionPaymentRecord paralelo so
|
||||
pro Resumo lateral (sem trigger de lock).
|
||||
- Agora unificado: removido guard, occFinancialRecord carrega em ambos
|
||||
modos. Card Sessao/Honorarios ganha Tag em vez de Select billingType
|
||||
quando ha cobranca. Body mostra Message lock + cadeado.
|
||||
AgendaEventoFinanceiroPanel so renderiza se record real (nao
|
||||
sintetizado).
|
||||
- Antes do codar, alinhei 3 perguntas de UX com user:
|
||||
1) Editar servico pago? NAO (cobranca fiscal imutavel)
|
||||
2) Alternar Particular/Convenio/Gratuito em serie cobrada? NAO
|
||||
3) Gerar fatura individual em upfront? NAO (duplicaria cobranca)
|
||||
|
||||
CROSS-WEEK PROPAGATION (descoberto durante C7):
|
||||
- Bug: virtuais isoladas em semanas futuras nao mostravam paid.
|
||||
- Root cause: bulk-load tinha "if (realIds.length) { ... propagacao ... }
|
||||
else { _rulePaymentMap.value = {} }". Quando user navegava pra semana
|
||||
so com virtuais (sem reais), else zerava o ruleMap.
|
||||
- Fix: maps inicializados SEMPRE, propagacao roda sempre, atribuicao
|
||||
final tambem fora do if. Propagacao tambem ficou cross-week — pega
|
||||
ruleIdsInView de TODOS eventos da view (real+virtual com recurrence_id),
|
||||
busca records de QUALQUER evento da rule (em qualquer semana). Memoria
|
||||
durador em project_cross_week_propagation.md.
|
||||
|
||||
OUTROS FIXES NA RODADA:
|
||||
- Atalho "Gerar fatura" no popover (pill amber ao lado de "A cobrar R$ X").
|
||||
- Info de pacote no header popover ("Sessao · Pacote · N sessoes").
|
||||
- Botao "Excluir serie inteira" no popover (hard delete, bloqueia se
|
||||
algum record paid).
|
||||
- Migration 20260519000001: RPC create_financial_record_for_session
|
||||
ignora cancelled na idempotencia. Memoria em
|
||||
project_rpc_idempotency_cancelled.md.
|
||||
- cancel_session exception some da agenda (era visivel com status
|
||||
cancelado, doc dizia que sumia).
|
||||
- recurrence_exceptions cancel agora upsert idempotente (nao quebra
|
||||
com unique violation em re-cancel).
|
||||
- onVerLancamentos busca records via siblings da serie pra virtuais de
|
||||
upfront.
|
||||
- Visualizacao: virtuais herdadas via propagacao agora mostram borda
|
||||
verde + linha verde no popover (showPaymentRow e isPaidSession
|
||||
relaxados pra paymentState !== 'none').
|
||||
|
||||
PROXIMO: Cenario 8 (Carl Jung pacote SALDO 4x R$40 = R$160).
|
||||
Esperado: 0 records iniciais, 4 virtuais limpas (saldo NAO propaga —
|
||||
cada sessao gera cobranca quando vira realidade).
|
||||
|
||||
## [2026-05-19 14:00] session | C5+C6 OK + atalho gerar fatura + RPC idempotencia fix
|
||||
Touched: project_rpc_idempotency_cancelled (nova)
|
||||
Detalhes: sessao longa cobrindo C5 e C6 ate green checkmark, com varios
|
||||
|
||||
Reference in New Issue
Block a user