feat: implement automatic adjustment removal for deleted records in absence and atestado mutations, enhancing data integrity and recalculating work hours for specific periods

This commit is contained in:
2025-12-23 07:44:54 -03:00
parent 414ae85264
commit a731015c89
4 changed files with 191 additions and 16 deletions

View File

@@ -941,10 +941,13 @@ export const excluirSolicitacao = mutation({
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');
}
// IMPORTANTE: Salvar o período exato da ausência ANTES de excluir
// para recalcular o banco de horas apenas para esse período específico
const funcionarioId = solicitacao.funcionarioId;
const dataInicio = solicitacao.dataInicio;
const dataFim = solicitacao.dataFim;
const statusOriginal = solicitacao.status;
const ausenciaId = args.solicitacaoId.toString(); // ID da ausência para remover ajustes
// Verificar se o usuário é o criador original da solicitação
const usuario = await ctx.db.get(args.usuarioId);
@@ -963,7 +966,34 @@ export const excluirSolicitacao = mutation({
throw new Error('Você não tem permissão para excluir esta solicitação');
}
// Permitir exclusão de ausências aprovadas (não apenas pendentes)
// Se estiver aprovada, o gestor pode excluir para corrigir erros
if (statusOriginal === 'aprovado' && !usuarioEhGestor) {
throw new Error('Apenas o gestor pode excluir ausências aprovadas');
}
// Excluir o registro do banco de dados
await ctx.db.delete(args.solicitacaoId);
// Remover ajustes automáticos relacionados à ausência excluída (apenas se estava aprovada)
if (statusOriginal === 'aprovado') {
try {
await ctx.runMutation(internal.pontos.removerAjustesAutomaticosInternal, {
funcionarioId,
motivoTipo: 'ausencia',
motivoId: ausenciaId,
dataInicio,
dataFim
});
} catch (error) {
console.error('[excluirSolicitacao] Erro ao remover ajustes automáticos:', error);
}
// Recalcular banco de horas APENAS para o período específico da ausência excluída
// Isso garante que os dias da ausência sejam removidos corretamente dos registros de ponto
await recalcularBancoHorasPeriodo(ctx, funcionarioId, dataInicio, dataFim);
}
return null;
}
});