diff --git a/apps/web/src/routes/(dashboard)/pedidos/[id]/+page.svelte b/apps/web/src/routes/(dashboard)/pedidos/[id]/+page.svelte index 24adb6a..b2b665b 100644 --- a/apps/web/src/routes/(dashboard)/pedidos/[id]/+page.svelte +++ b/apps/web/src/routes/(dashboard)/pedidos/[id]/+page.svelte @@ -31,6 +31,7 @@ const objetosQuery = $derived.by(() => useQuery(api.objetos.list, {})); const acoesQuery = $derived.by(() => useQuery(api.acoes.list, {})); const permissionsQuery = $derived.by(() => useQuery(api.pedidos.getPermissions, { pedidoId })); + const requestsQuery = $derived.by(() => useQuery(api.pedidos.getItemRequests, { pedidoId })); // Derived state let pedido = $derived(pedidoQuery.data); @@ -39,6 +40,7 @@ let objetos = $derived(objetosQuery.data || []); let acoes = $derived(acoesQuery.data || []); let permissions = $derived(permissionsQuery.data); + let requests = $derived(requestsQuery.data || []); type Modalidade = 'dispensa' | 'inexgibilidade' | 'adesao' | 'consumo'; @@ -116,8 +118,10 @@ itemsQuery.isLoading || historyQuery.isLoading || objetosQuery.isLoading || + objetosQuery.isLoading || acoesQuery.isLoading || - permissionsQuery.isLoading + permissionsQuery.isLoading || + requestsQuery.isLoading ); let error = $derived( @@ -207,7 +211,7 @@ }); async function handleAddItem() { - if (!newItem.objetoId || !newItem.valorEstimado) return; + if (!pedido || !newItem.objetoId || !newItem.valorEstimado) return; addingItem = true; try { await client.mutation(api.pedidos.addItem, { @@ -228,6 +232,9 @@ ataId: '' }; showAddItem = false; + if (pedido.status === 'em_analise') { + alert('Solicitação de adição enviada para análise.'); + } } catch (e) { alert('Erro ao adicionar item: ' + (e as Error).message); } finally { @@ -236,6 +243,8 @@ } async function handleUpdateQuantity(itemId: Id<'objetoItems'>, novaQuantidade: number) { + if (!pedido) return; + if (novaQuantidade < 1) { alert('Quantidade deve ser pelo menos 1.'); return; @@ -245,15 +254,22 @@ itemId, novaQuantidade }); + if (pedido.status === 'em_analise') { + alert('Solicitação de alteração de quantidade enviada para análise.'); + } } catch (e) { alert('Erro ao atualizar quantidade: ' + (e as Error).message); } } async function handleRemoveItem(itemId: Id<'objetoItems'>) { + if (!pedido) return; if (!confirm('Remover este item?')) return; try { await client.mutation(api.pedidos.removeItem, { itemId }); + if (pedido.status === 'em_analise') { + alert('Solicitação de remoção enviada para análise.'); + } } catch (e) { alert('Erro ao remover item: ' + (e as Error).message); } @@ -625,6 +641,32 @@ alert('Erro: ' + (e as Error).message); } } + + async function handleApproveRequest(requestId: Id<'solicitacoesItens'>) { + if (!confirm('Aprovar esta solicitação?')) return; + try { + await client.mutation(api.pedidos.approveItemRequest, { requestId }); + } catch (e) { + alert('Erro ao aprovar: ' + (e as Error).message); + } + } + + async function handleRejectRequest(requestId: Id<'solicitacoesItens'>) { + if (!confirm('Rejeitar esta solicitação?')) return; + try { + await client.mutation(api.pedidos.rejectItemRequest, { requestId }); + } catch (e) { + alert('Erro ao rejeitar: ' + (e as Error).message); + } + } + + function parseRequestData(json: string) { + try { + return JSON.parse(json); + } catch { + return {}; + } + }
@@ -752,6 +794,87 @@
+ + {#if requests.length > 0} +
+
+

Solicitações Pendentes

+
+
+
+ + + + + + + + + + + {#each requests as req (req._id)} + {@const data = parseRequestData(req.dados)} + + + + + + + {/each} + +
TipoSolicitanteDetalhesAções
+ {#if req.tipo === 'adicao'} + Adição + {:else if req.tipo === 'alteracao_quantidade'} + Alteração Qtd + {:else if req.tipo === 'exclusao'} + Exclusão + {/if} + {req.solicitadoPorNome} + {#if req.tipo === 'adicao'} + {getObjetoName(data.objetoId)} - {data.quantidade}x ({data.modalidade}) + {:else if req.tipo === 'alteracao_quantidade'} + {#if data.itemId} + {@const item = items.find((i) => i._id === data.itemId)} + {item ? getObjetoName(item.objetoId) : 'Item desconhecido'} (Nova Qtd: {data.novaQuantidade}) + {:else} + Qtd: {data.novaQuantidade} + {/if} + {:else if req.tipo === 'exclusao'} + {#if data.itemId} + {@const item = items.find((i) => i._id === data.itemId)} + Remover: {item ? getObjetoName(item.objetoId) : 'Item desconhecido'} + {:else} + Remover Item + {/if} + {/if} + + {#if permissions?.canManageRequests} + + + {:else} + Aguardando Análise + {/if} +
+
+
+
+ {/if} +
@@ -998,7 +1121,7 @@ {/if} {getObjetoName(item.objetoId)} - {#if pedido.status === 'em_rascunho' || pedido.status === 'precisa_ajustes'} + {#if pedido.status === 'em_rascunho' || pedido.status === 'precisa_ajustes' || pedido.status === 'em_analise'} - {#if pedido.status === 'em_rascunho' || pedido.status === 'precisa_ajustes'} + {#if pedido.status === 'em_rascunho' || pedido.status === 'precisa_ajustes' || pedido.status === 'em_analise'}