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

@@ -1,12 +1,43 @@
import { v } from 'convex/values';
import { mutation, query, internalMutation } from './_generated/server';
import { internal } from './_generated/api';
import type { MutationCtx } from './_generated/server';
import { Id, Doc } from './_generated/dataModel';
import { verificarLicencaAtiva } from './atestadosLicencas';
import { getCurrentUserFunction } from './auth';
import { formatarDataBR } from './utils/datas';
import { api } from './_generated/api';
// Helper: Recalcular banco de horas em um período
async function recalcularBancoHorasPeriodo(
ctx: MutationCtx,
funcionarioId: Id<'funcionarios'>,
dataInicio: string,
dataFim: string
): Promise<void> {
// Gerar todas as datas do período
const dataInicioObj = new Date(dataInicio);
const dataFimObj = new Date(dataFim);
const datas: string[] = [];
const dataAtual = new Date(dataInicioObj);
while (dataAtual <= dataFimObj) {
const ano = dataAtual.getFullYear();
const mes = String(dataAtual.getMonth() + 1).padStart(2, '0');
const dia = String(dataAtual.getDate()).padStart(2, '0');
datas.push(`${ano}-${mes}-${dia}`);
dataAtual.setDate(dataAtual.getDate() + 1);
}
// Recalcular para cada data usando a mutation interna (agendar para execução assíncrona)
for (let i = 0; i < datas.length; i++) {
await ctx.scheduler.runAfter(i * 100, internal.pontos.recalcularBancoHorasData, {
funcionarioId,
data: datas[i]!
});
}
}
// Validador para períodos
const periodoValidator = v.object({
dataInicio: v.string(),
@@ -878,6 +909,26 @@ export const atualizarStatus = mutation({
);
}
// Se o status foi alterado para Cancelado_RH, recalcular banco de horas
// para garantir que os dias de férias sejam removidos do registro de ponto
if (args.novoStatus === 'Cancelado_RH') {
// IMPORTANTE: Recalcular banco de horas para o período das férias canceladas
// Isso garante que os dias de férias sejam removidos corretamente dos registros de ponto
try {
await recalcularBancoHorasPeriodo(
ctx,
registro.funcionarioId,
registro.dataInicio,
registro.dataFim
);
} catch (error) {
console.error(
'[ferias.atualizarStatus] Erro ao recalcular banco de horas após cancelamento:',
error
);
}
}
// Se o status foi alterado para Cancelado_RH, notificar o funcionário
if (args.novoStatus === 'Cancelado_RH') {
const funcionario = await ctx.db.get(registro.funcionarioId);