From f90b27648f08454a2c0f3ad78754835a459653e9 Mon Sep 17 00:00:00 2001 From: killer-cf Date: Tue, 16 Dec 2025 14:20:31 -0300 Subject: [PATCH] feat: enhance ata and objeto management by adding configuration options for quantity limits and usage tracking, improving data integrity and user feedback in pedidos --- .../(dashboard)/compras/atas/+page.svelte | 100 ++++++- .../(dashboard)/pedidos/[id]/+page.svelte | 49 +++- .../(dashboard)/pedidos/novo/+page.svelte | 47 ++-- packages/backend/convex/atas.ts | 134 +++++++++- packages/backend/convex/objetos.ts | 88 +++++++ packages/backend/convex/pedidos.ts | 244 +++++++++++++++++- packages/backend/convex/tables/atas.ts | 10 +- packages/backend/convex/tables/pedidos.ts | 1 + 8 files changed, 618 insertions(+), 55 deletions(-) diff --git a/apps/web/src/routes/(dashboard)/compras/atas/+page.svelte b/apps/web/src/routes/(dashboard)/compras/atas/+page.svelte index 9e9c107..999152d 100644 --- a/apps/web/src/routes/(dashboard)/compras/atas/+page.svelte +++ b/apps/web/src/routes/(dashboard)/compras/atas/+page.svelte @@ -44,6 +44,11 @@ dataFim: '' }); let selectedObjetos = $state[]>([]); + type ObjetoAtaConfig = { + quantidadeTotal: number | undefined; + limitePercentual: number | undefined; + }; + let objetosConfig = $state>({}); let searchObjeto = $state(''); let saving = $state(false); @@ -73,6 +78,15 @@ const linkedObjetos = await client.query(api.atas.getObjetos, { id: ata._id }); selectedObjetos = linkedObjetos.map((o) => o._id); + const linkedConfigs = await client.query(api.atas.getObjetosConfig, { id: ata._id }); + objetosConfig = {}; + for (const cfg of linkedConfigs) { + objetosConfig[String(cfg.objetoId)] = { + quantidadeTotal: cfg.quantidadeTotal ?? undefined, + limitePercentual: cfg.limitePercentual ?? 50 + }; + } + // Fetch attachments attachments = await client.query(api.atas.getDocumentos, { ataId: ata._id }); } else { @@ -85,6 +99,7 @@ dataFim: '' }; selectedObjetos = []; + objetosConfig = {}; attachments = []; } attachmentFiles = []; @@ -97,11 +112,22 @@ editingId = null; } + function getObjetoConfig(id: Id<'objetos'>): ObjetoAtaConfig { + const key = String(id); + if (!objetosConfig[key]) { + objetosConfig[key] = { quantidadeTotal: 1, limitePercentual: 50 }; + } + return objetosConfig[key]; + } + function toggleObjeto(id: Id<'objetos'>) { + const key = String(id); if (selectedObjetos.includes(id)) { selectedObjetos = selectedObjetos.filter((oid) => oid !== id); + delete objetosConfig[key]; } else { selectedObjetos = [...selectedObjetos, id]; + objetosConfig[key] = { quantidadeTotal: 1, limitePercentual: 50 }; } } @@ -124,13 +150,37 @@ } saving = true; try { + const objetos = selectedObjetos.map((objetoId) => { + const cfg = objetosConfig[String(objetoId)]; + if ( + !cfg || + cfg.quantidadeTotal === undefined || + !Number.isFinite(cfg.quantidadeTotal) || + cfg.quantidadeTotal <= 0 + ) { + throw new Error( + 'Informe a quantidade (maior que zero) para todos os objetos vinculados.' + ); + } + const limitePercentual = + cfg.limitePercentual === undefined || !Number.isFinite(cfg.limitePercentual) + ? 50 + : cfg.limitePercentual; + + return { + objetoId, + quantidadeTotal: cfg.quantidadeTotal, + limitePercentual + }; + }); + const payload = { numero: formData.numero, numeroSei: formData.numeroSei, empresaId: formData.empresaId as Id<'empresas'>, dataInicio: formData.dataInicio || undefined, dataFim: formData.dataFim || undefined, - objetosIds: selectedObjetos + objetos }; let ataId: Id<'atas'>; @@ -537,6 +587,54 @@ {/if} + {#if selectedObjetos.length > 0} +
+
Configuração por objeto
+

+ Defina a quantidade total do objeto na ata e o limite de uso em % (padrão 50%). +

+
+ {#each selectedObjetos as objetoId (objetoId)} + {@const obj = objetos.find((o) => o._id === objetoId)} + {@const cfg = getObjetoConfig(objetoId)} +
+
{obj?.nome || 'Objeto'}
+
+
+ + +
+
+ + +
+
+
+ {/each} +
+
+ {/if} +
Anexos
diff --git a/apps/web/src/routes/(dashboard)/pedidos/[id]/+page.svelte b/apps/web/src/routes/(dashboard)/pedidos/[id]/+page.svelte index a84366b..8b17615 100644 --- a/apps/web/src/routes/(dashboard)/pedidos/[id]/+page.svelte +++ b/apps/web/src/routes/(dashboard)/pedidos/[id]/+page.svelte @@ -1,6 +1,7 @@