From ab103ec88bed926d419ae120e032424128fd3546 Mon Sep 17 00:00:00 2001 From: Leonardo Date: Sun, 26 Apr 2026 08:10:12 -0300 Subject: [PATCH] =?UTF-8?q?Fix=20admin=20adjust=20cr=C3=A9ditos=20WhatsApp?= =?UTF-8?q?:=20clamp=20silencioso=20vira=20erro=20vermelho?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Severidade dos toasts de validação: warn → error (não selecionar tenant, valor < 1, > WA_ADJUST_MAX, nada removível, excede max removível) - Remove :max do no formulário — antes ele clampeava silenciosamente o valor digitado pro máximo permitido, escondendo o erro. Agora deixa o usuário digitar e estourar o toast vermelho do submit. Co-Authored-By: Claude Opus 4.7 (1M context) --- src/views/pages/saas/SaasAddonsPage.vue | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/views/pages/saas/SaasAddonsPage.vue b/src/views/pages/saas/SaasAddonsPage.vue index 4edace8..7e0a817 100644 --- a/src/views/pages/saas/SaasAddonsPage.vue +++ b/src/views/pages/saas/SaasAddonsPage.vue @@ -581,15 +581,15 @@ async function doWaAdjust() { function submitWaTopup() { const t = waTopup.value; - if (!t.tenantId) { toast.add({ severity: 'warn', summary: 'Selecione o tenant', life: 2500 }); return; } + if (!t.tenantId) { toast.add({ severity: 'error', summary: 'Selecione o tenant', life: 2500 }); return; } const amt = Math.round(Number(t.amount) || 0); - if (amt < 1) { toast.add({ severity: 'warn', summary: 'Valor deve ser >= 1', life: 2500 }); return; } - if (amt > WA_ADJUST_MAX) { toast.add({ severity: 'warn', summary: `Máximo ${WA_ADJUST_MAX} por operação`, life: 3000 }); return; } + if (amt < 1) { toast.add({ severity: 'error', summary: 'Valor deve ser >= 1', life: 2500 }); return; } + if (amt > WA_ADJUST_MAX) { toast.add({ severity: 'error', summary: `Máximo ${WA_ADJUST_MAX} por operação`, life: 3000 }); return; } if (t.mode === 'remove') { const max = waMaxAmountForMode(); - if (max <= 0) { toast.add({ severity: 'warn', summary: 'Nada removível', detail: 'Este tenant não tem créditos de cortesia disponíveis pra remoção.', life: 4000 }); return; } - if (amt > max) { toast.add({ severity: 'warn', summary: `Máximo removível: ${max}`, life: 3000 }); return; } + if (max <= 0) { toast.add({ severity: 'error', summary: 'Nada removível', detail: 'Este tenant não tem créditos de cortesia disponíveis pra remoção.', life: 4000 }); return; } + if (amt > max) { toast.add({ severity: 'error', summary: `Máximo removível: ${max}`, life: 3000 }); return; } const msgItems = [ `Vai subtrair ${amt} créditos de ${escapeHtml(tenantName(t.tenantId))} (pool cortesia).`, @@ -1045,7 +1045,7 @@ onMounted(() => { - + Máx. {{ WA_ADJUST_MAX }} por operação · removível agora: {{ Math.min(WA_ADJUST_MAX, waRemovable.removable) }}.