Ajustes final etapa1 #71
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user