feat: enhance 'Almoxarifado' UI with improved styling, updated component layouts, and added barcode functionality for better inventory management and user experience

This commit is contained in:
2025-12-22 00:08:13 -03:00
parent ef9dbedb34
commit ae4f8fc6b3
10 changed files with 1283 additions and 753 deletions

View File

@@ -165,6 +165,101 @@ export const listarMovimentacoes = query({
}
});
export const listarMovimentacoesComHistorico = query({
args: {},
handler: async (ctx) => {
const usuario = await getCurrentUserFunction(ctx);
if (!usuario) return [];
try {
await ctx.runQuery(internal.permissoesAcoes.assertPermissaoAcaoAtual, {
recurso: 'almoxarifado',
acao: 'listar'
});
} catch {
return [];
}
// Buscar movimentações de estoque
const movimentacoes = await ctx.db
.query('movimentacoesEstoque')
.withIndex('by_data')
.collect();
// Buscar histórico de alterações de materiais (criação, edição, exclusão)
const historicoMateriais = await ctx.db
.query('historicoAlteracoes')
.withIndex('by_tipoEntidade', (q) => q.eq('tipoEntidade', 'material'))
.collect();
// Buscar todos os usuários únicos para enriquecer os dados
const usuarioIds = new Set<Id<'usuarios'>>();
for (const mov of movimentacoes) {
usuarioIds.add(mov.usuarioId);
}
for (const hist of historicoMateriais) {
usuarioIds.add(hist.usuarioId);
}
// Buscar informações dos usuários
const usuariosMap = new Map<Id<'usuarios'>, Doc<'usuarios'>>();
for (const userId of usuarioIds) {
const usuario = await ctx.db.get(userId);
if (usuario) {
usuariosMap.set(userId, usuario);
}
}
// Transformar movimentações em formato unificado
const movimentacoesFormatadas = movimentacoes.map((mov) => {
const usuario = usuariosMap.get(mov.usuarioId);
return {
id: mov._id,
tipo: 'movimentacao' as const,
tipoMovimentacao: mov.tipo,
materialId: mov.materialId,
data: mov.data,
quantidade: mov.quantidade,
quantidadeAnterior: mov.quantidadeAnterior,
quantidadeNova: mov.quantidadeNova,
motivo: mov.motivo,
funcionarioId: mov.funcionarioId,
usuarioId: mov.usuarioId,
usuarioNome: usuario?.nome || 'Usuário desconhecido',
observacoes: mov.observacoes
};
});
// Transformar histórico de alterações em formato unificado
const historicoFormatado = historicoMateriais.map((hist) => {
const usuario = usuariosMap.get(hist.usuarioId);
return {
id: hist._id,
tipo: 'alteracao' as const,
tipoAlteracao: hist.acao, // 'criacao', 'edicao', 'exclusao'
materialId: hist.entidadeId as Id<'materiais'>, // Converter string para Id
data: hist.timestamp,
quantidade: undefined,
quantidadeAnterior: undefined,
quantidadeNova: undefined,
motivo: hist.observacoes || hist.acao,
funcionarioId: undefined,
usuarioId: hist.usuarioId,
usuarioNome: usuario?.nome || 'Usuário desconhecido',
observacoes: hist.observacoes,
dadosAnteriores: hist.dadosAnteriores,
dadosNovos: hist.dadosNovos
};
});
// Combinar e ordenar por data (mais recente primeiro)
const todos = [...movimentacoesFormatadas, ...historicoFormatado];
todos.sort((a, b) => b.data - a.data);
return todos;
}
});
export const listarRequisicoes = query({
args: {
status: v.optional(requisicaoStatus),