Ajustes final etapa1 #71

Merged
killer-cf merged 12 commits from ajustes_final_etapa1 into master 2025-12-29 17:28:52 +00:00
17 changed files with 1446 additions and 1036 deletions
Showing only changes of commit bdc0afccb8 - Show all commits

View File

@@ -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 // Excluir homologação
await ctx.db.delete(args.homologacaoId); await ctx.db.delete(args.homologacaoId);