feat: add mutation to exclude absence requests and enhance point registration by blocking entries during approved absences

This commit is contained in:
2025-12-16 08:55:06 -03:00
parent 60b53dac74
commit 0cbae42df5
2 changed files with 54 additions and 0 deletions

View File

@@ -922,3 +922,48 @@ export const marcarComoLida = mutation({
return null; return null;
} }
}); });
// Mutation: Excluir solicitação de ausência
export const excluirSolicitacao = mutation({
args: {
solicitacaoId: v.id('solicitacoesAusencias'),
usuarioId: v.id('usuarios')
},
returns: v.null(),
handler: async (ctx, args) => {
await ctx.runQuery(internal.permissoesAcoes.assertPermissaoAcaoAtual, {
recurso: 'ausencias',
acao: 'reprovar'
});
const solicitacao = await ctx.db.get(args.solicitacaoId);
if (!solicitacao) {
throw new Error('Solicitação não encontrada');
}
// Apenas solicitações ainda não processadas podem ser excluídas
if (solicitacao.status !== 'aguardando_aprovacao') {
throw new Error('Apenas solicitações pendentes podem ser excluídas');
}
// Verificar se o usuário é o criador original da solicitação
const usuario = await ctx.db.get(args.usuarioId);
if (!usuario) {
throw new Error('Usuário não encontrado');
}
const usuarioEhFuncionario = usuario.funcionarioId === solicitacao.funcionarioId;
const gestorIdDoFuncionario = await encontrarGestorDoFuncionario(
ctx,
solicitacao.funcionarioId
);
const usuarioEhGestor = gestorIdDoFuncionario === args.usuarioId;
if (!usuarioEhFuncionario && !usuarioEhGestor) {
throw new Error('Você não tem permissão para excluir esta solicitação');
}
await ctx.db.delete(args.solicitacaoId);
return null;
}
});

View File

@@ -605,6 +605,15 @@ export const registrarPonto = mutation({
const dia = String(dataObj.getUTCDate()).padStart(2, '0'); const dia = String(dataObj.getUTCDate()).padStart(2, '0');
const data = `${ano}-${mes}-${dia}`; const data = `${ano}-${mes}-${dia}`;
// Bloquear registro de ponto quando houver ausência aprovada ativa na data
const ausenciaInfo = await verificarAusenciaAprovada(ctx, usuario.funcionarioId, data);
if (ausenciaInfo.temAusencia) {
throw new Error(
ausenciaInfo.motivo ||
'Não é possível registrar ponto: existe uma ausência aprovada ativa para esta data.'
);
}
// Verificar se já existe registro no mesmo minuto // Verificar se já existe registro no mesmo minuto
const funcionarioId = usuario.funcionarioId; // Já verificado acima, não é undefined const funcionarioId = usuario.funcionarioId; // Já verificado acima, não é undefined
const registrosMinuto = await ctx.db const registrosMinuto = await ctx.db