+
+
+
+
1. Multa cancela original + cria novo
+
+ Antes do fix: _applyStatusDecisions INSERIA o record da multa MAS deixava o original pending → cobrança dupla (R$ 200 + R$ 30 = R$ 230). Fix em useMelissaAgenda.js:1450-1505: aplicar multa agora cancela o ctx.pendingRecord com nota de auditoria em notes ("[YYYY-MM-DD] Cancelada — substituída por multa de no-show"). Description do novo record carrega data da sessão pra paciente identificar na fatura: "Multa por falta · sessão dd/mm/aa". ✅ Match com o mock C10/b.
+
+
+
+
+
+
2. Hint contextual explicando regra min_hours_notice novo
+
+ No bloco "Aplicar multa?" do
AgendaStatusChangeConfirmDialog, embaixo do checkbox aparece texto explicando por que veio (des)marcado por padrão:
+
+ - > janela: "Cancelou 18.5h antes da sessão. Regra: multa apenas quando cancelamento ocorre com menos de 2h de antecedência → sem multa por padrão."
+ - < janela: "Cancelou 45min antes da sessão (menos que os 2h da regra) → multa aplicada por padrão."
+ - Após início: "Cancelou 0.5h após o início da sessão (menos que os 2h da regra) → multa aplicada por padrão."
+
+ Terapeuta vê a razão da pré-seleção e pode inverter conscientemente.
+
+
+
+
+
+
3. Botão "Agendada" no popover novo
+
+ O grupo "Marcar sessão como:" agora tem 5 botões (antes 4): Agendada (pi-calendar, variante --info cyan) | Realizada | Falta | Reagendar | Cancelar. Permite reset de status (realizado/faltou/cancelado → agendado) direto do popover sem precisar abrir o AgendaEventDialog completo. Único caminho de saída do estado encerrado (ver item 5).
+
+
+
+
+
+
4. Label do popover muda em sessão encerrada UX
+
+ Antes mostrava "A cobrar R$ 150" + botão "Gerar fatura" mesmo em sessão cancelada — sugeria que dava pra cobrar uma sessão que não aconteceu. Agora:
+
+ status='cancelado' + sem record ativo → "Sessão cancelada · sem cobrança ativa"
+ status='faltou' + sem record ativo → "Sessão não realizada · sem cobrança ativa"
+ - Multa pending continua mostrando "A receber R$ X (pendente)" normalmente
+
+ Bug paralelo fixado:
paymentLabel agora usa
paymentAmount também pra
'pending' (antes só pra
'paid'; multa de R$ 30 mostrava R$ 150 do
ev.price original).
+
+
+
+
+
+
5. Lock em sessão encerrada (cancelado/faltou) trava
+
+ Sessão com status
cancelado ou
faltou bloqueia ações que abrem porta pra dados inconsistentes:
+
+ - Botão "Editar sessão" some do popover
+ - Botão "Gerar cobrança" some do
AgendaEventoFinanceiroPanel (dentro do AgendaEventDialog) — antes dava pra emitir fatura nova mesmo em sessão cancelada
+ - Botões Realizada / Falta / Reagendar / Cancelar ficam
disabled com tooltip "Sessão encerrada — use Agendada pra reativar antes"
+ - SÓ Agendada continua funcional (caminho explícito de recuperação caso tenha sido marcado por engano)
+ - Badge $ amber some do card no FullCalendar (sessão encerrada + record cancelled → no badge)
+
+
+
+
+
+
+
6. _reloadRange() após status change fix
+
+ onUpdateSeriesEvent não chamava _reloadRange() após _applyStatusDecisions — badge $ e label "A receber" ficavam stale até trocar de view ou F5. Fix: reload no fim do flow. Bug paralelo: _reloadRange não estava destruturado em _buildHandlers(deps) (era passado em deps mas não desempacotado) → toast "ReferenceError: _reloadRange is not defined" ao tentar reload. Ambos corrigidos.
+
+
+
+
+
+
7. Bug dormente em useAgendaFinanceiro.js fix
+
+ calcChargeAmount comparava charge_mode === 'fixed', mas o schema usa 'fixed_fee'. Off-by-key silencioso que caía no fallback. Path não exercitado na Melissa (que usa _applyStatusDecisions, não handleStatusChange), mas iria quebrar se algum dia fosse. Fix: 'fixed_fee'.
+
+
+
+