From bdc0afccb87fd3835a1af1adec1b16ff9a127093 Mon Sep 17 00:00:00 2001 From: deyvisonwanderley Date: Wed, 24 Dec 2025 08:36:44 -0300 Subject: [PATCH] feat: implement logic to remove hour adjustments upon homologation deletion, ensuring accurate recalculation of work hours and maintaining data integrity --- packages/backend/convex/pontos.ts | 107 ++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) diff --git a/packages/backend/convex/pontos.ts b/packages/backend/convex/pontos.ts index f43d187..21f15e7 100644 --- a/packages/backend/convex/pontos.ts +++ b/packages/backend/convex/pontos.ts @@ -2916,6 +2916,113 @@ export const excluirHomologacao = mutation({ } } + // Se for um ajuste de banco de horas, remover completamente do banco de dados + if (homologacao.tipoAjuste && homologacao.ajusteMinutos !== undefined) { + // Converter criadoEm da homologação para data (YYYY-MM-DD) + const dataHomologacao = new Date(homologacao.criadoEm).toISOString().split('T')[0]!; + + // Buscar o ajuste correspondente + // Procurar ajustes manuais do mesmo funcionário, gestor, tipo, valor e data + const ajustes = await ctx.db + .query('ajustesBancoHoras') + .withIndex('by_funcionario_data', (q) => + q.eq('funcionarioId', homologacao.funcionarioId).eq('dataAplicacao', dataHomologacao) + ) + .filter((q) => + q.and( + q.eq(q.field('motivoTipo'), 'manual'), + q.eq(q.field('tipo'), homologacao.tipoAjuste), + q.eq(q.field('valorMinutos'), homologacao.ajusteMinutos), + q.eq(q.field('gestorId'), homologacao.gestorId) + ) + ) + .collect(); + + // Se encontrou ajuste(s), encontrar o mais próximo em tempo à homologação + if (ajustes.length > 0) { + // Encontrar o ajuste com timestamp mais próximo ao da homologação + // (o ajuste geralmente é criado um pouco antes da homologação) + let ajusteMaisProximo = ajustes[0]!; + let menorDiferenca = Math.abs(ajustes[0]!.criadoEm - homologacao.criadoEm); + for (const ajusteCandidato of ajustes) { + const diferenca = Math.abs(ajusteCandidato.criadoEm - homologacao.criadoEm); + if (diferenca < menorDiferenca) { + menorDiferenca = diferenca; + ajusteMaisProximo = ajusteCandidato; + } + } + const ajuste = ajusteMaisProximo; + + // Buscar o banco de horas do dia onde o ajuste foi aplicado + const bancoHoras = await ctx.db + .query('bancoHoras') + .withIndex('by_funcionario_data', (q) => + q.eq('funcionarioId', homologacao.funcionarioId).eq('data', ajuste.dataAplicacao) + ) + .first(); + + if (bancoHoras) { + // Remover o ajuste do array ajustesIds + const novosAjustesIds = (bancoHoras.ajustesIds || []).filter( + (id) => id !== ajuste._id + ); + + // Reverter o ajuste do saldo (subtrair o valor que foi adicionado) + const novoSaldoMinutos = bancoHoras.saldoMinutos - ajuste.valorMinutos; + + // Verificar se ainda há outros ajustes ou se precisa resetar tipoDia + let novoTipoDia = bancoHoras.tipoDia; + if (novosAjustesIds.length > 0) { + // Se ainda há outros ajustes, verificar qual tipoDia deve ser mantido + const outrosAjustes = await Promise.all( + novosAjustesIds.map((id) => ctx.db.get(id)) + ); + const temAjusteAbonar = outrosAjustes.some((a) => a?.tipo === 'abonar'); + const temAjusteDescontar = outrosAjustes.some((a) => a?.tipo === 'descontar'); + + // Se há ajuste de abonar, manter ou definir como 'abonado' + if (temAjusteAbonar) { + novoTipoDia = 'abonado'; + } else if (temAjusteDescontar) { + // Se há ajuste de descontar, manter ou definir como 'descontado' + novoTipoDia = 'descontado'; + } else { + // Se não há ajustes que determinem tipoDia, resetar + novoTipoDia = undefined; + } + } else { + // Se não há mais ajustes, verificar se deve resetar tipoDia + // Se o tipoDia estava relacionado ao ajuste removido, resetar + if ( + (bancoHoras.tipoDia === 'abonado' && ajuste.tipo === 'abonar') || + (bancoHoras.tipoDia === 'descontado' && ajuste.tipo === 'descontar') + ) { + novoTipoDia = undefined; + } + } + + // Atualizar banco de horas + await ctx.db.patch(bancoHoras._id, { + saldoMinutos: novoSaldoMinutos, + ajustesIds: novosAjustesIds.length > 0 ? novosAjustesIds : undefined, + tipoDia: novoTipoDia + }); + + // Recalcular banco de horas mensal após remover ajuste + const mes = ajuste.dataAplicacao.substring(0, 7); // YYYY-MM + const hojeDate = new Date(); + const mesAtual = `${hojeDate.getFullYear()}-${String(hojeDate.getMonth() + 1).padStart(2, '0')}`; + const estaRemovendoMesPassado = mes < mesAtual; + + // Recalcular em cascata se for mês passado + await calcularBancoHorasMensal(ctx, homologacao.funcionarioId, mes, estaRemovendoMesPassado); + } + + // Excluir o registro de ajuste do banco de dados + await ctx.db.delete(ajuste._id); + } + } + // Excluir homologação await ctx.db.delete(args.homologacaoId);