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

@@ -238,9 +238,7 @@ export const checkExisting = query({
.collect();
const matching = items.filter((i) =>
itensFiltro.some(
(f) => f.objetoId === i.objetoId && f.modalidade === i.modalidade
)
itensFiltro.some((f) => f.objetoId === i.objetoId && f.modalidade === i.modalidade)
);
if (matching.length > 0) {
@@ -513,6 +511,159 @@ export const removeItem = mutation({
}
});
export const removeItemsBatch = mutation({
args: {
itemIds: v.array(v.id('objetoItems'))
},
returns: v.null(),
handler: async (ctx, args) => {
const user = await getUsuarioAutenticado(ctx);
if (!user.funcionarioId) {
throw new Error('Usuário não vinculado a um funcionário.');
}
if (args.itemIds.length === 0) {
return null;
}
const firstItem = await ctx.db.get(args.itemIds[0]);
if (!firstItem) {
throw new Error('Item não encontrado.');
}
const pedidoId = firstItem.pedidoId;
const pedido = await ctx.db.get(pedidoId);
if (!pedido) {
throw new Error('Pedido não encontrado.');
}
if (pedido.status !== 'em_rascunho' && pedido.status !== 'precisa_ajustes') {
throw new Error(
'Só é possível remover itens em pedidos em rascunho ou que precisam de ajustes.'
);
}
for (const itemId of args.itemIds) {
const item = await ctx.db.get(itemId);
if (!item) continue;
if (item.pedidoId !== pedidoId) {
throw new Error('Todos os itens devem pertencer ao mesmo pedido.');
}
if (item.adicionadoPor !== user.funcionarioId) {
throw new Error('Você só pode remover itens que você adicionou.');
}
await ctx.db.delete(itemId);
await ctx.db.insert('historicoPedidos', {
pedidoId,
usuarioId: user._id,
acao: 'remocao_item',
detalhes: JSON.stringify({
objetoId: item.objetoId,
valor: item.valorEstimado
}),
data: Date.now()
});
}
await ctx.db.patch(pedidoId, { atualizadoEm: Date.now() });
return null;
}
});
export const splitPedido = mutation({
args: {
pedidoId: v.id('pedidos'),
itemIds: v.array(v.id('objetoItems')),
numeroSei: v.optional(v.string())
},
returns: v.id('pedidos'),
handler: async (ctx, args) => {
const user = await getUsuarioAutenticado(ctx);
if (!user.funcionarioId) {
throw new Error('Usuário não vinculado a um funcionário.');
}
if (args.itemIds.length === 0) {
throw new Error('Selecione ao menos um item para dividir o pedido.');
}
const pedidoOriginal = await ctx.db.get(args.pedidoId);
if (!pedidoOriginal) {
throw new Error('Pedido não encontrado.');
}
if (pedidoOriginal.status !== 'em_rascunho' && pedidoOriginal.status !== 'precisa_ajustes') {
throw new Error('Só é possível dividir pedidos em rascunho ou que precisam de ajustes.');
}
const itens = [];
for (const itemId of args.itemIds) {
const item = await ctx.db.get(itemId);
if (!item) {
continue;
}
if (item.pedidoId !== args.pedidoId) {
throw new Error('Todos os itens devem pertencer ao mesmo pedido.');
}
if (item.adicionadoPor !== user.funcionarioId) {
throw new Error('Você só pode mover itens que você adicionou.');
}
itens.push(item);
}
if (itens.length === 0) {
throw new Error('Nenhum dos itens selecionados pôde ser usado para divisão.');
}
const novoPedidoId = await ctx.db.insert('pedidos', {
numeroSei: args.numeroSei,
status: 'em_rascunho',
criadoPor: user._id,
criadoEm: Date.now(),
atualizadoEm: Date.now()
});
for (const item of itens) {
await ctx.db.patch(item._id, {
pedidoId: novoPedidoId
});
}
await ctx.db.insert('historicoPedidos', {
pedidoId: args.pedidoId,
usuarioId: user._id,
acao: 'divisao_pedido_origem',
detalhes: JSON.stringify({
itensMovidos: itens.map((i) => i._id),
novoPedidoId
}),
data: Date.now()
});
await ctx.db.insert('historicoPedidos', {
pedidoId: novoPedidoId,
usuarioId: user._id,
acao: 'divisao_pedido_destino',
detalhes: JSON.stringify({
pedidoOriginalId: args.pedidoId,
itensRecebidos: itens.map((i) => i._id)
}),
data: Date.now()
});
await ctx.db.patch(args.pedidoId, { atualizadoEm: Date.now() });
return novoPedidoId;
}
});
export const updateItem = mutation({
args: {
itemId: v.id('objetoItems'),