agenda: consumeSaldo agora amarra billing_contract_id no evento

Bug em cascata descoberto durante C11/B com Andre Green:
- User clicou Falta + Descontar (consumeSaldo) -> sessions_used: 1->2
- billing_contract_id do agenda_evento ficou NULL (omissao no flow)
- User clicou Agendada (reverse) -> detector saldoConsumed em
  _loadStatusChangeContext checa evRow.billing_contract_id, que esta
  NULL -> saldoConsumed=false -> bloco "Devolver saldo" NAO aparece
  no dialog -> saldo NAO devolvido
- Next Falta mostra "Descontar 2 para 3" em vez de "1 para 2"

Fix: bloco consumeSaldo agora tambem amarra billing_contract_id no
agenda_eventos. Replica o padrao que ja existe no generatePackageCharge
e no onUsarSessao. Sem isso, qualquer reverse pos-consumeSaldo nao
detecta o saldo consumido.

Backfill manual do Andre: sessions_used voltou pra 1.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Leonardo
2026-05-20 11:50:26 -03:00
parent 5684297243
commit 3f3f2acc70
@@ -1564,6 +1564,9 @@ function _buildHandlers(deps) {
// 1) Consumir saldo (pacote saldo + faltou/cancelado + decisão sim)
// ⚠ billing_contracts NÃO tem coluna updated_at — passar esse campo
// causa "column does not exist" silenciosamente em Promise.allSettled.
// Também precisa amarrar billing_contract_id no evento — sem isso, o
// reverse não detecta saldoConsumed depois (bug cascata descoberto
// durante teste C11/B: Falta+Descontar, depois Agendada não devolvia).
if (decision.consumeSaldo && ctx.billingContract?.id) {
tasks.push(
supabase
@@ -1573,6 +1576,13 @@ function _buildHandlers(deps) {
})
.eq('id', ctx.billingContract.id)
);
// Amarra evento ao contrato pra rastreabilidade + reverse correto
tasks.push(
supabase
.from('agenda_eventos')
.update({ billing_contract_id: ctx.billingContract.id, updated_at: new Date().toISOString() })
.eq('id', eventoId)
);
}
// 2) Aplicar multa (cria financial_record avulsa). Description leva