diff --git a/packages/backend/convex/funcionarios.ts b/packages/backend/convex/funcionarios.ts index 1244366..e84ed71 100644 --- a/packages/backend/convex/funcionarios.ts +++ b/packages/backend/convex/funcionarios.ts @@ -47,11 +47,24 @@ const regimeTrabalhoValidator = v.optional( export const getAll = query({ args: {}, handler: async (ctx) => { + // Verificar autenticação primeiro + const usuario = await getCurrentUserFunction(ctx); + if (!usuario) { + // Retornar array vazio quando não autenticado + return []; + } + // Autorização: listar funcionários - await ctx.runQuery(internal.permissoesAcoes.assertPermissaoAcaoAtual, { - recurso: 'funcionarios', - acao: 'listar' - }); + try { + await ctx.runQuery(internal.permissoesAcoes.assertPermissaoAcaoAtual, { + recurso: 'funcionarios', + acao: 'listar' + }); + } catch (error) { + // Se não tiver permissão, retornar array vazio + return []; + } + const funcionarios = await ctx.db.query('funcionarios').collect(); // Retornar apenas os campos necessários para listagem return funcionarios.map((f) => ({ diff --git a/packages/backend/convex/pontos.ts b/packages/backend/convex/pontos.ts index 0c79c80..c05c7e8 100644 --- a/packages/backend/convex/pontos.ts +++ b/packages/backend/convex/pontos.ts @@ -862,15 +862,24 @@ export const listarRegistrosPeriodo = query({ handler: async (ctx, args) => { const usuario = await getCurrentUserFunction(ctx); if (!usuario) { - throw new Error('Usuário não autenticado'); + // Retornar array vazio quando não autenticado + return []; } // Verificar permissão (RH ou TI) // Por enquanto, permitir se tiver funcionarioId ou for admin // TODO: Implementar verificação de permissão adequada - const dataFim = new Date(args.dataFim); - dataFim.setHours(23, 59, 59, 999); + // Validar formato das datas + if (!args.dataInicio || !args.dataFim) { + return []; + } + + // Validar formato YYYY-MM-DD + const dataInicioRegex = /^\d{4}-\d{2}-\d{2}$/; + if (!dataInicioRegex.test(args.dataInicio) || !dataInicioRegex.test(args.dataFim)) { + return []; + } let registrosFiltrados; @@ -885,19 +894,26 @@ export const listarRegistrosPeriodo = query({ .withIndex('by_funcionario_data', (q) => q.eq('funcionarioId', funcionarioId)) .collect(); - // Filtrar por período de data + // Filtrar por período de data usando comparação de strings (formato YYYY-MM-DD) registrosFiltrados = todosRegistrosFuncionario.filter((r) => { - const dataRegistro = new Date(r.data); - return dataRegistro >= new Date(args.dataInicio) && dataRegistro <= dataFim; + // Comparação de strings funciona para formato YYYY-MM-DD + return r.data >= args.dataInicio && r.data <= args.dataFim; }); } else { // Se não há funcionário especificado, buscar todos e filtrar (menos eficiente, mas necessário) + // Usar comparação de strings diretamente para datas no formato YYYY-MM-DD const registros = await ctx.db .query('registrosPonto') - .withIndex('by_data', (q) => q.gte('data', args.dataInicio).lte('data', args.dataFim)) + .withIndex('by_data', (q) => + q.gte('data', args.dataInicio).lte('data', args.dataFim) + ) .collect(); - registrosFiltrados = registros; + // Garantir que as datas estão no formato correto e filtrar novamente para garantir + registrosFiltrados = registros.filter((r) => { + // Comparação de strings funciona para formato YYYY-MM-DD + return r.data >= args.dataInicio && r.data <= args.dataFim; + }); } // Buscar informações dos funcionários @@ -964,7 +980,15 @@ export const obterEstatisticas = query({ handler: async (ctx, args) => { const usuario = await getCurrentUserFunction(ctx); if (!usuario) { - throw new Error('Usuário não autenticado'); + // Retornar estatísticas zeradas quando não autenticado + return { + totalRegistros: 0, + dentroDoPrazo: 0, + foraDoPrazo: 0, + totalFuncionarios: 0, + funcionariosDentroPrazo: 0, + funcionariosForaPrazo: 0, + }; } // TODO: Verificar permissão (RH ou TI)