From 079509e00193564e086698976fce9b5fe4f9d944 Mon Sep 17 00:00:00 2001 From: Leonardo Date: Wed, 20 May 2026 11:11:28 -0300 Subject: [PATCH] =?UTF-8?q?agenda:=20dialog=20pacote=20saldo=20realizada?= =?UTF-8?q?=20=E2=80=94=202=20sub-questions=20claras?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Antes (UX confusa): bloco "Gerar cobranca no pacote?" tinha so um Select "Como cobrar?" com options mixadas: - "Enviar link de pagamento (Asaas)" - "Ja recebi - PIX" - "Ja recebi - Dinheiro" - etc User selecionou "Ja recebi - PIX" pensando que era "cobrar via PIX" durante teste C11/A com Andre Green. Resultado: fatura virou paid sem o user ter recebido de verdade. Ambiguidade entre "como cobrar" (header) e "ja recebi" (options). Refactor: espelhar o padrao da avulsa (showRegistrarPagto): 1. Sub-question "A sessao ja foi paga?" radio Sim/Nao (default Nao) 2. Se Nao -> Select "Como vai cobrar?" [Apenas registrar pendente | Enviar link de pagamento (Asaas)] 3. Se Sim -> Select "Como recebeu?" [PIX | Dinheiro | Deposito | Maquininha] (sem prefixo "Ja recebi" — header ja deixa claro) Defaults safer: markPaid=false em ambos contextos (avulsa e pacote) pra evitar marcar paid sem querer. paymentMethod='pending' inicial. Handler em useMelissaAgenda._applyStatusDecisions: pos-processamento agora usa decision.markPaid explicito no caso pacote saldo: - markPaid=true -> record vira paid + payment_method=X - markPaid=false + paymentMethod='link' -> pending + payment_method='asaas' - markPaid=false + paymentMethod='pending' -> pending sem metodo Co-Authored-By: Claude Opus 4.7 (1M context) --- .../AgendaStatusChangeConfirmDialog.vue | 62 +++++++++++++++---- .../melissa/composables/useMelissaAgenda.js | 49 +++++++-------- 2 files changed, 74 insertions(+), 37 deletions(-) diff --git a/src/features/agenda/components/AgendaStatusChangeConfirmDialog.vue b/src/features/agenda/components/AgendaStatusChangeConfirmDialog.vue index de3d31a..fd273ab 100644 --- a/src/features/agenda/components/AgendaStatusChangeConfirmDialog.vue +++ b/src/features/agenda/components/AgendaStatusChangeConfirmDialog.vue @@ -72,8 +72,16 @@ watch( consumeSaldo.value = !!props.regraExcecao?.default_consume_on_miss; applyFine.value = _calcInitialFineApply(); fineAmount.value = _calcInitialFineAmount(); - markPaid.value = true; - paymentMethod.value = 'pix'; + // Default markPaid: + // - Avulsa realizada (showRegistrarPagto): default false (manter pendente) + // - Pacote saldo realizada (showCobrancaPacote): default false (gerar pendente) + // Em ambos casos o user precisa selecionar ativamente "Sim, já recebi" + // pra registrar paid — evita marcar paid sem querer. + markPaid.value = false; + // paymentMethod default depende do contexto. Inicia 'pending' (que cai + // no select de "Como vai cobrar?" quando markPaid=false). Quando user + // troca pra "Sim, já recebi", precisa escolher PIX/Dinheiro/etc. + paymentMethod.value = 'pending'; generatePackageCharge.value = true; } ); @@ -138,12 +146,13 @@ const paymentMethodOptions = [ { value: 'deposito', label: 'Depósito' }, { value: 'cartao_maquininha', label: 'Cartão (maquininha)' } ]; -const paymentMethodOptionsCobranca = [ - { value: 'link', label: 'Enviar link de pagamento (Asaas)' }, - { value: 'pix', label: 'Já recebi — PIX' }, - { value: 'dinheiro', label: 'Já recebi — Dinheiro' }, - { value: 'deposito', label: 'Já recebi — Depósito' }, - { value: 'cartao_maquininha', label: 'Já recebi — Cartão (maquininha)' } +// Opções pra "Como vai cobrar?" quando markPaid=false (sessão pendente +// no pacote saldo). 'pending' = só registra como pendente, terapeuta +// cobra depois pelo /financeiro. 'link' = gera link Asaas e marca +// payment_method='asaas' no record (pós-confirm o handler updata). +const paymentMethodOptionsPending = [ + { value: 'pending', label: 'Apenas registrar como pendente' }, + { value: 'link', label: 'Enviar link de pagamento (Asaas)' } ]; const regraResumo = computed(() => { @@ -204,11 +213,16 @@ const fineDefaultReason = computed(() => { // ─── Actions ─────────────────────────────────────────────────────────── function onConfirm() { + // markPaid agora é considerado em DOIS contextos: + // 1. Avulsa pendente (showRegistrarPagto): paciente já pagou a cobrança? + // 2. Pacote saldo realizado (showCobrancaPacote): já recebeu o valor da sessão? + // Em ambos casos: markPaid=true → record vira paid; false → fica pending. + const considerMarkPaid = showRegistrarPagto.value || (showCobrancaPacote.value && generatePackageCharge.value); emit('confirm', { consumeSaldo: showSaldoBlock.value ? consumeSaldo.value : false, applyFine: showFineBlock.value ? applyFine.value : false, fineAmount: showFineBlock.value && applyFine.value ? Number(fineAmount.value) || 0 : 0, - markPaid: showRegistrarPagto.value ? markPaid.value : false, + markPaid: considerMarkPaid ? markPaid.value : false, paymentMethod: paymentMethod.value, generatePackageCharge: showCobrancaPacote.value ? generatePackageCharge.value : false }); @@ -338,11 +352,35 @@ function onCancel() { -
- + +
+ + +
+ +
+