refactor: optimize database queries in almoxarifado and configuracaoAlmoxarifado files by replacing filter methods with indexed queries for improved performance and clarity

This commit is contained in:
2025-12-20 13:45:21 -03:00
parent d4c7488cab
commit 8dd2674305
3 changed files with 70 additions and 43 deletions

View File

@@ -33,18 +33,21 @@ export const listarMateriais = query({
return []; return [];
} }
let query = ctx.db.query('materiais'); let materiais;
if (args.ativo !== undefined) { if (args.ativo !== undefined) {
query = query.withIndex('by_ativo', (q) => q.eq('ativo', args.ativo)); materiais = await ctx.db
.query('materiais')
.withIndex('by_ativo', (q) => q.eq('ativo', args.ativo!))
.collect();
} else if (args.categoria) { } else if (args.categoria) {
query = query.withIndex('by_categoria', (q) => q.eq('categoria', args.categoria)); materiais = await ctx.db
.query('materiais')
.withIndex('by_categoria', (q) => q.eq('categoria', args.categoria!))
.collect();
} else { } else {
query = query; materiais = await ctx.db.query('materiais').collect();
} }
let materiais = await query.collect();
// Filtros adicionais // Filtros adicionais
if (args.busca) { if (args.busca) {
const buscaLower = args.busca.toLowerCase(); const buscaLower = args.busca.toLowerCase();
@@ -98,20 +101,29 @@ export const listarMovimentacoes = query({
return []; return [];
} }
let query = ctx.db.query('movimentacoesEstoque'); let movimentacoes;
if (args.materialId) { if (args.materialId) {
query = query.withIndex('by_materialId', (q) => q.eq('materialId', args.materialId)); movimentacoes = await ctx.db
.query('movimentacoesEstoque')
.withIndex('by_materialId', (q) => q.eq('materialId', args.materialId!))
.collect();
} else if (args.tipo) { } else if (args.tipo) {
query = query.withIndex('by_tipo', (q) => q.eq('tipo', args.tipo)); movimentacoes = await ctx.db
.query('movimentacoesEstoque')
.withIndex('by_tipo', (q) => q.eq('tipo', args.tipo!))
.collect();
} else if (args.funcionarioId) { } else if (args.funcionarioId) {
query = query.withIndex('by_funcionarioId', (q) => q.eq('funcionarioId', args.funcionarioId)); movimentacoes = await ctx.db
.query('movimentacoesEstoque')
.withIndex('by_funcionarioId', (q) => q.eq('funcionarioId', args.funcionarioId!))
.collect();
} else { } else {
query = query.withIndex('by_data'); movimentacoes = await ctx.db
.query('movimentacoesEstoque')
.withIndex('by_data')
.collect();
} }
let movimentacoes = await query.collect();
// Filtros de data // Filtros de data
if (args.dataInicio) { if (args.dataInicio) {
movimentacoes = movimentacoes.filter((m) => m.data >= args.dataInicio!); movimentacoes = movimentacoes.filter((m) => m.data >= args.dataInicio!);
@@ -146,18 +158,26 @@ export const listarRequisicoes = query({
return []; return [];
} }
let query = ctx.db.query('requisicoesMaterial'); let requisicoes;
if (args.status) { if (args.status) {
query = query.withIndex('by_status', (q) => q.eq('status', args.status)); requisicoes = await ctx.db
.query('requisicoesMaterial')
.withIndex('by_status', (q) => q.eq('status', args.status!))
.collect();
} else if (args.solicitanteId) { } else if (args.solicitanteId) {
query = query.withIndex('by_solicitanteId', (q) => q.eq('solicitanteId', args.solicitanteId)); requisicoes = await ctx.db
.query('requisicoesMaterial')
.withIndex('by_solicitanteId', (q) => q.eq('solicitanteId', args.solicitanteId!))
.collect();
} else if (args.setorId) { } else if (args.setorId) {
query = query.withIndex('by_setorId', (q) => q.eq('setorId', args.setorId)); requisicoes = await ctx.db
.query('requisicoesMaterial')
.withIndex('by_setorId', (q) => q.eq('setorId', args.setorId!))
.collect();
} else {
requisicoes = await ctx.db.query('requisicoesMaterial').collect();
} }
const requisicoes = await query.collect();
// Ordenar por data de criação (mais recente primeiro) // Ordenar por data de criação (mais recente primeiro)
requisicoes.sort((a, b) => b.criadoEm - a.criadoEm); requisicoes.sort((a, b) => b.criadoEm - a.criadoEm);
@@ -207,16 +227,21 @@ export const listarAlertas = query({
return []; return [];
} }
let query = ctx.db.query('alertasEstoque'); let alertas;
if (args.status) { if (args.status) {
query = query.withIndex('by_status', (q) => q.eq('status', args.status)); alertas = await ctx.db
.query('alertasEstoque')
.withIndex('by_status', (q) => q.eq('status', args.status!))
.collect();
} else if (args.tipo) { } else if (args.tipo) {
query = query.withIndex('by_tipo', (q) => q.eq('tipo', args.tipo)); alertas = await ctx.db
.query('alertasEstoque')
.withIndex('by_tipo', (q) => q.eq('tipo', args.tipo!))
.collect();
} else {
alertas = await ctx.db.query('alertasEstoque').collect();
} }
const alertas = await query.collect();
// Ordenar por data de criação (mais recente primeiro) // Ordenar por data de criação (mais recente primeiro)
alertas.sort((a, b) => b.criadoEm - a.criadoEm); alertas.sort((a, b) => b.criadoEm - a.criadoEm);
@@ -486,7 +511,7 @@ export const editarMaterial = mutation({
if (args.codigo && args.codigo !== material.codigo) { if (args.codigo && args.codigo !== material.codigo) {
const codigoExistente = await ctx.db const codigoExistente = await ctx.db
.query('materiais') .query('materiais')
.withIndex('by_codigo', (q) => q.eq('codigo', args.codigo)) .withIndex('by_codigo', (q) => q.eq('codigo', args.codigo!))
.unique(); .unique();
if (codigoExistente) { if (codigoExistente) {
@@ -1100,11 +1125,13 @@ export const listarMateriaisInterno = internalQuery({
ativo: v.optional(v.boolean()) ativo: v.optional(v.boolean())
}, },
handler: async (ctx, args) => { handler: async (ctx, args) => {
let query = ctx.db.query('materiais');
if (args.ativo !== undefined) { if (args.ativo !== undefined) {
query = query.withIndex('by_ativo', (q) => q.eq('ativo', args.ativo)); return await ctx.db
.query('materiais')
.withIndex('by_ativo', (q) => q.eq('ativo', args.ativo!))
.collect();
} }
return await query.collect(); return await ctx.db.query('materiais').collect();
} }
}); });
@@ -1114,11 +1141,11 @@ export const listarAlertasPorMaterial = internalQuery({
status: v.optional(alertaStatus) status: v.optional(alertaStatus)
}, },
handler: async (ctx, args) => { handler: async (ctx, args) => {
let query = ctx.db const query = ctx.db
.query('alertasEstoque') .query('alertasEstoque')
.withIndex('by_materialId', (q) => q.eq('materialId', args.materialId)); .withIndex('by_materialId', (q) => q.eq('materialId', args.materialId));
if (args.status) { if (args.status) {
query = query.filter((q) => q.eq(q.field('status'), args.status)); return await query.filter((q) => q.eq(q.field('status'), args.status!)).collect();
} }
return await query.collect(); return await query.collect();
} }
@@ -1129,11 +1156,13 @@ export const listarAlertasInterno = internalQuery({
status: v.optional(alertaStatus) status: v.optional(alertaStatus)
}, },
handler: async (ctx, args) => { handler: async (ctx, args) => {
let query = ctx.db.query('alertasEstoque');
if (args.status) { if (args.status) {
query = query.withIndex('by_status', (q) => q.eq('status', args.status)); return await ctx.db
.query('alertasEstoque')
.withIndex('by_status', (q) => q.eq('status', args.status!))
.collect();
} }
return await query.collect(); return await ctx.db.query('alertasEstoque').collect();
} }
}); });

View File

@@ -14,7 +14,7 @@ export const obterConfiguracao = query({
const config = await ctx.db const config = await ctx.db
.query('configuracoesAlmoxarifado') .query('configuracoesAlmoxarifado')
.filter((q) => q.eq(q.field('ativo'), true)) .withIndex('by_ativo', (q) => q.eq('ativo', true))
.first(); .first();
// Se não existe configuração, retornar valores padrão // Se não existe configuração, retornar valores padrão
@@ -142,7 +142,7 @@ export const obterConfiguracaoInterno = internalQuery({
handler: async (ctx) => { handler: async (ctx) => {
const config = await ctx.db const config = await ctx.db
.query('configuracoesAlmoxarifado') .query('configuracoesAlmoxarifado')
.filter((q) => q.eq(q.field('ativo'), true)) .withIndex('by_ativo', (q) => q.eq('ativo', true))
.first(); .first();
if (!config) { if (!config) {

View File

@@ -143,7 +143,5 @@ export const almoxarifadoTables = {
ativo: v.boolean(), ativo: v.boolean(),
atualizadoPor: v.id('usuarios'), atualizadoPor: v.id('usuarios'),
atualizadoEm: v.number() atualizadoEm: v.number()
}) }).index('by_ativo', ['ativo'])
}; };