From 743d165af3c17d951397d4f0932124ded3a5a35b Mon Sep 17 00:00:00 2001 From: deyvisonwanderley Date: Mon, 22 Dec 2025 14:20:36 -0300 Subject: [PATCH] feat: update requisition approval process in 'Almoxarifado' to prevent approval with stock issues, enhance error handling, and conditionally render approval button based on stock availability --- .../almoxarifado/requisicoes/+page.svelte | 41 ++++++++++++------- packages/backend/convex/almoxarifado.ts | 31 +------------- 2 files changed, 28 insertions(+), 44 deletions(-) diff --git a/apps/web/src/routes/(dashboard)/almoxarifado/requisicoes/+page.svelte b/apps/web/src/routes/(dashboard)/almoxarifado/requisicoes/+page.svelte index 786c6c3..bcfdfd9 100644 --- a/apps/web/src/routes/(dashboard)/almoxarifado/requisicoes/+page.svelte +++ b/apps/web/src/routes/(dashboard)/almoxarifado/requisicoes/+page.svelte @@ -208,14 +208,23 @@ async function confirmarAprovar() { if (!requisicaoParaAprovar) return; + // Não permitir aprovação se houver problemas de estoque + if (problemasEstoqueAprovar.length > 0) { + return; + } + try { processandoAprovar = true; await client.mutation(api.almoxarifado.aprovarRequisicao, { id: requisicaoParaAprovar }); mostrarMensagem('success', 'Requisição aprovada com sucesso!'); fecharModalAprovar(); } catch (error: unknown) { - const message = error instanceof Error ? error.message : 'Erro ao aprovar requisição'; - mostrarMensagem('error', message); + // Silenciar erros de estoque insuficiente (já verificados no frontend) + const errorMessage = error instanceof Error ? error.message : String(error); + if (!errorMessage.includes('Estoque insuficiente')) { + const message = error instanceof Error ? error.message : 'Erro ao aprovar requisição'; + mostrarMensagem('error', message); + } } finally { processandoAprovar = false; } @@ -929,19 +938,21 @@ > Cancelar - + {#if problemasEstoqueAprovar.length === 0} + + {/if} diff --git a/packages/backend/convex/almoxarifado.ts b/packages/backend/convex/almoxarifado.ts index cb8760a..d593374 100644 --- a/packages/backend/convex/almoxarifado.ts +++ b/packages/backend/convex/almoxarifado.ts @@ -1196,35 +1196,8 @@ export const aprovarRequisicao = mutation({ throw new Error('Apenas requisições pendentes podem ser aprovadas'); } - // Verificar estoque antes de aprovar - const itens = await ctx.db - .query('requisicaoItens') - .withIndex('by_requisicaoId', (q) => q.eq('requisicaoId', args.id)) - .collect(); - - const problemasEstoque: Array<{ - materialNome: string; - quantidadeSolicitada: number; - estoqueAtual: number; - }> = []; - - for (const item of itens) { - const material = await ctx.db.get(item.materialId); - if (!material) continue; - - if (material.estoqueAtual < item.quantidadeSolicitada) { - problemasEstoque.push({ - materialNome: material.nome, - quantidadeSolicitada: item.quantidadeSolicitada, - estoqueAtual: material.estoqueAtual - }); - } - } - - if (problemasEstoque.length > 0) { - const mensagem = `Estoque insuficiente para os seguintes materiais:\n${problemasEstoque.map(p => `- ${p.materialNome}: solicitado ${p.quantidadeSolicitada}, disponível ${p.estoqueAtual}`).join('\n')}`; - throw new Error(mensagem); - } + // Nota: A verificação de estoque é feita no frontend antes de permitir a aprovação + // O botão de aprovar só aparece quando há estoque suficiente const usuario = await getCurrentUserFunction(ctx); if (!usuario) throw new Error('Usuário não autenticado');