From 3f3f2acc70920cdce38e328ead37443711ec9d42 Mon Sep 17 00:00:00 2001 From: Leonardo Date: Wed, 20 May 2026 11:50:26 -0300 Subject: [PATCH] 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) --- src/layout/melissa/composables/useMelissaAgenda.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/layout/melissa/composables/useMelissaAgenda.js b/src/layout/melissa/composables/useMelissaAgenda.js index 620b35a..bbc7420 100644 --- a/src/layout/melissa/composables/useMelissaAgenda.js +++ b/src/layout/melissa/composables/useMelissaAgenda.js @@ -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