diff --git a/packages/backend/convex/ausencias.ts b/packages/backend/convex/ausencias.ts index 2155289..bb3f6a8 100644 --- a/packages/backend/convex/ausencias.ts +++ b/packages/backend/convex/ausencias.ts @@ -922,3 +922,48 @@ export const marcarComoLida = mutation({ 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; + } +}); diff --git a/packages/backend/convex/pontos.ts b/packages/backend/convex/pontos.ts index 7b7f488..332a0b0 100644 --- a/packages/backend/convex/pontos.ts +++ b/packages/backend/convex/pontos.ts @@ -605,6 +605,15 @@ export const registrarPonto = mutation({ const dia = String(dataObj.getUTCDate()).padStart(2, '0'); 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 const funcionarioId = usuario.funcionarioId; // Já verificado acima, não é undefined const registrosMinuto = await ctx.db