feat: Implement batch item removal and pedido splitting for pedidos, and add document management for atas.

This commit is contained in:
2025-12-03 23:37:26 -03:00
parent fb78866a0e
commit 7746dce25a
6 changed files with 796 additions and 100 deletions

View File

@@ -47,9 +47,7 @@ export const listByObjetoIds = query({
links.push(...partial);
}
const ataIds = Array.from(
new Set(links.map((l) => l.ataId as Id<'atas'>))
);
const ataIds = Array.from(new Set(links.map((l) => l.ataId as Id<'atas'>)));
if (ataIds.length === 0) return [];
@@ -64,9 +62,9 @@ export const create = mutation({
dataInicio: v.optional(v.string()),
dataFim: v.optional(v.string()),
empresaId: v.id('empresas'),
pdf: v.optional(v.string()),
pdf: v.optional(v.id('_storage')),
numeroSei: v.string(),
objetosIds: v.optional(v.array(v.id('objetos')))
objetosIds: v.array(v.id('objetos'))
},
handler: async (ctx, args) => {
const user = await getCurrentUserFunction(ctx);
@@ -74,23 +72,22 @@ export const create = mutation({
const ataId = await ctx.db.insert('atas', {
numero: args.numero,
numeroSei: args.numeroSei,
empresaId: args.empresaId,
dataInicio: args.dataInicio,
dataFim: args.dataFim,
empresaId: args.empresaId,
pdf: args.pdf,
numeroSei: args.numeroSei,
criadoPor: user._id,
criadoEm: Date.now(),
atualizadoEm: Date.now()
});
if (args.objetosIds) {
for (const objetoId of args.objetosIds) {
await ctx.db.insert('atasObjetos', {
ataId,
objetoId
});
}
// Vincular objetos
for (const objetoId of args.objetosIds) {
await ctx.db.insert('atasObjetos', {
ataId,
objetoId
});
}
return ataId;
@@ -101,12 +98,12 @@ export const update = mutation({
args: {
id: v.id('atas'),
numero: v.string(),
numeroSei: v.string(),
empresaId: v.id('empresas'),
dataInicio: v.optional(v.string()),
dataFim: v.optional(v.string()),
empresaId: v.id('empresas'),
pdf: v.optional(v.string()),
numeroSei: v.string(),
objetosIds: v.optional(v.array(v.id('objetos')))
pdf: v.optional(v.id('_storage')),
objetosIds: v.array(v.id('objetos'))
},
handler: async (ctx, args) => {
const user = await getCurrentUserFunction(ctx);
@@ -114,45 +111,42 @@ export const update = mutation({
await ctx.db.patch(args.id, {
numero: args.numero,
numeroSei: args.numeroSei,
empresaId: args.empresaId,
dataInicio: args.dataInicio,
dataFim: args.dataFim,
empresaId: args.empresaId,
pdf: args.pdf,
numeroSei: args.numeroSei,
atualizadoEm: Date.now()
});
if (args.objetosIds !== undefined) {
// Remove existing links
const existingLinks = await ctx.db
.query('atasObjetos')
.withIndex('by_ataId', (q) => q.eq('ataId', args.id))
.collect();
// Atualizar objetos vinculados
// Primeiro remove todos os vínculos existentes
const existingLinks = await ctx.db
.query('atasObjetos')
.withIndex('by_ataId', (q) => q.eq('ataId', args.id))
.collect();
for (const link of existingLinks) {
await ctx.db.delete(link._id);
}
for (const link of existingLinks) {
await ctx.db.delete(link._id);
}
// Add new links
for (const objetoId of args.objetosIds) {
await ctx.db.insert('atasObjetos', {
ataId: args.id,
objetoId
});
}
// Adiciona os novos vínculos
for (const objetoId of args.objetosIds) {
await ctx.db.insert('atasObjetos', {
ataId: args.id,
objetoId
});
}
}
});
export const remove = mutation({
args: {
id: v.id('atas')
},
args: { id: v.id('atas') },
handler: async (ctx, args) => {
const user = await getCurrentUserFunction(ctx);
if (!user) throw new Error('Unauthorized');
// Remove linked objects
// Remover vínculos com objetos
const links = await ctx.db
.query('atasObjetos')
.withIndex('by_ataId', (q) => q.eq('ataId', args.id))
@@ -162,6 +156,79 @@ export const remove = mutation({
await ctx.db.delete(link._id);
}
// Remover documentos vinculados
const docs = await ctx.db
.query('atasDocumentos')
.withIndex('by_ataId', (q) => q.eq('ataId', args.id))
.collect();
for (const doc of docs) {
await ctx.storage.delete(doc.storageId);
await ctx.db.delete(doc._id);
}
await ctx.db.delete(args.id);
}
});
export const generateUploadUrl = mutation({
args: {},
handler: async (ctx) => {
return await ctx.storage.generateUploadUrl();
}
});
export const saveDocumento = mutation({
args: {
ataId: v.id('atas'),
nome: v.string(),
storageId: v.id('_storage'),
tipo: v.string(),
tamanho: v.number()
},
handler: async (ctx, args) => {
const user = await getCurrentUserFunction(ctx);
if (!user) throw new Error('Unauthorized');
return await ctx.db.insert('atasDocumentos', {
ataId: args.ataId,
nome: args.nome,
storageId: args.storageId,
tipo: args.tipo,
tamanho: args.tamanho,
criadoPor: user._id,
criadoEm: Date.now()
});
}
});
export const removeDocumento = mutation({
args: { id: v.id('atasDocumentos') },
handler: async (ctx, args) => {
const user = await getCurrentUserFunction(ctx);
if (!user) throw new Error('Unauthorized');
const doc = await ctx.db.get(args.id);
if (!doc) throw new Error('Documento não encontrado');
await ctx.storage.delete(doc.storageId);
await ctx.db.delete(args.id);
}
});
export const getDocumentos = query({
args: { ataId: v.id('atas') },
handler: async (ctx, args) => {
const docs = await ctx.db
.query('atasDocumentos')
.withIndex('by_ataId', (q) => q.eq('ataId', args.ataId))
.collect();
return await Promise.all(
docs.map(async (doc) => ({
...doc,
url: await ctx.storage.getUrl(doc.storageId)
}))
);
}
});