diff --git a/server/api/auth/login.post.ts b/server/api/auth/login.post.ts index 2004b14..8dc90c4 100644 --- a/server/api/auth/login.post.ts +++ b/server/api/auth/login.post.ts @@ -16,11 +16,16 @@ export default defineEventHandler(async (event) => { const { codeVerifier, codeChallenge, state } = await generatePkce() const returnTo = body.data.returnTo ?? '/portal/painel' - await savePkceState(state, { - codeVerifier, - returnTo, - createdAt: Date.now(), - }) + try { + await savePkceState(state, { + codeVerifier, + returnTo, + createdAt: Date.now(), + }) + } catch (err) { + console.error('[auth/login] falha ao salvar estado PKCE (Redis indisponível?):', (err as Error).message) + throw createError({ statusCode: 503, statusMessage: 'Serviço temporariamente indisponível. Tente novamente em instantes.' }) + } const redirectUri = callbackUrlFromEvent(event) const authUrl = buildAuthUrl({ diff --git a/server/api/proxy/[...path].ts b/server/api/proxy/[...path].ts index bb915bf..88a6c86 100644 --- a/server/api/proxy/[...path].ts +++ b/server/api/proxy/[...path].ts @@ -97,6 +97,9 @@ export default defineEventHandler(async (event) => { setResponseHeader(event, 'content-type', 'application/json; charset=utf-8') return body } - throw err + + // Erro de rede (backend inacessível — ECONNREFUSED, timeout, etc.) + console.error(`[proxy] backend inacessível: ${url}`, (err as Error).message) + throw createError({ statusCode: 503, statusMessage: 'Sistema temporariamente indisponível.' }) } }) diff --git a/src/composables/useExtratoDebitosPortal.js b/src/composables/useExtratoDebitosPortal.js index 2e0c325..94f357f 100644 --- a/src/composables/useExtratoDebitosPortal.js +++ b/src/composables/useExtratoDebitosPortal.js @@ -24,10 +24,18 @@ export function useExtratoDebitosPortal() { { label: 'Saldo Crédito', value: 3 }, ] + const ESTADO_DEBITO = 1 + const temSelecionado = computed(() => resultados.value.some(t => t.selecionados?.length > 0) ) + const temDebitoSelecionado = computed(() => + resultados.value.some(t => + t.selecionados?.some(d => d.codigoEstadoConta === ESTADO_DEBITO) + ) + ) + const totalizadores = computed(() => { let principal = 0, multa = 0, juros = 0, valorTotal = 0 resultados.value.forEach(t => { @@ -85,7 +93,13 @@ export function useExtratoDebitosPortal() { function montarDtoGuia() { return { listaDebitos: resultados.value - .filter(t => t.selecionados?.length > 0) + .map(t => ({ + ...t, + selecionados: (t.selecionados || []).filter( + d => d.codigoEstadoConta === ESTADO_DEBITO + ), + })) + .filter(t => t.selecionados.length > 0) .map(t => ({ idTributo: t.idTributo, identificador: t.identificador, @@ -139,8 +153,8 @@ export function useExtratoDebitosPortal() { } async function gerarGuia() { - if (!temSelecionado.value) { - mensagemErro.value = 'Selecione pelo menos um débito.' + if (!temDebitoSelecionado.value) { + mensagemErro.value = 'Selecione pelo menos um débito em aberto. Parcelas quitadas ou com saldo zerado não geram guia.' return } if (!dataVencimento.value) { @@ -202,6 +216,7 @@ export function useExtratoDebitosPortal() { filtro, opcoesEstadoConta, temSelecionado, + temDebitoSelecionado, totalizadores, consultar, limparFiltros, diff --git a/src/error.vue b/src/error.vue new file mode 100644 index 0000000..f7235f1 --- /dev/null +++ b/src/error.vue @@ -0,0 +1,58 @@ + + + diff --git a/src/pages/portal/certidoes.vue b/src/pages/portal/certidoes.vue index 89b0649..645e9cc 100644 --- a/src/pages/portal/certidoes.vue +++ b/src/pages/portal/certidoes.vue @@ -1,6 +1,7 @@