feat: implement date parsing utility across absence management components for improved date handling and consistency

This commit is contained in:
2025-12-05 11:57:15 -03:00
parent 4a1f48300f
commit 66f995cb08
16 changed files with 2053 additions and 87 deletions

View File

@@ -3,6 +3,7 @@ import { mutation, query } from './_generated/server';
import type { QueryCtx, MutationCtx } from './_generated/server';
import { internal, api } from './_generated/api';
import { Id, Doc } from './_generated/dataModel';
import { parseLocalDate, formatarDataBR } from './utils/datas';
// Query: Listar todas as solicitações (para RH)
export const listarTodas = query({
@@ -257,10 +258,10 @@ function verificarSobreposicao(
inicio2: string,
fim2: string
): boolean {
const d1Inicio = new Date(inicio1);
const d1Fim = new Date(fim1);
const d2Inicio = new Date(inicio2);
const d2Fim = new Date(fim2);
const d1Inicio = parseLocalDate(inicio1);
const d1Fim = parseLocalDate(fim1);
const d2Inicio = parseLocalDate(inicio2);
const d2Fim = parseLocalDate(fim2);
return d1Inicio <= d2Fim && d2Inicio <= d1Fim;
}
@@ -299,12 +300,14 @@ export const criarSolicitacao = mutation({
throw new Error('O motivo deve ter no mínimo 10 caracteres');
}
const dataInicio = new Date(args.dataInicio);
const dataFim = new Date(args.dataFim);
const dataInicio = parseLocalDate(args.dataInicio);
const dataFim = parseLocalDate(args.dataFim);
// Criar data de hoje em UTC para comparação
const hoje = new Date();
hoje.setHours(0, 0, 0, 0);
const hojeUTC = new Date(Date.UTC(hoje.getUTCFullYear(), hoje.getUTCMonth(), hoje.getUTCDate(), 0, 0, 0, 0));
if (dataInicio < hoje) {
if (dataInicio < hojeUTC) {
throw new Error('A data de início não pode ser no passado');
}
@@ -351,7 +354,7 @@ export const criarSolicitacao = mutation({
solicitacaoAusenciaId: solicitacaoId,
tipo: 'nova_solicitacao',
lida: false,
mensagem: `${funcionario.nome} solicitou uma ausência de ${new Date(args.dataInicio).toLocaleDateString('pt-BR')} até ${new Date(args.dataFim).toLocaleDateString('pt-BR')}`
mensagem: `${funcionario.nome} solicitou uma ausência de ${formatarDataBR(args.dataInicio)} até ${formatarDataBR(args.dataFim)}`
});
// Buscar usuário do gestor para enviar email e chat
@@ -377,8 +380,8 @@ export const criarSolicitacao = mutation({
variaveis: {
gestorNome: gestorUsuario.nome,
funcionarioNome: funcionario.nome,
dataInicio: new Date(args.dataInicio).toLocaleDateString('pt-BR'),
dataFim: new Date(args.dataFim).toLocaleDateString('pt-BR'),
dataInicio: formatarDataBR(args.dataInicio),
dataFim: formatarDataBR(args.dataFim),
motivo: args.motivo,
urlSistema
},
@@ -397,7 +400,7 @@ export const criarSolicitacao = mutation({
corpo: `<p>Olá ${gestorUsuario.nome},</p>
<p>O funcionário <strong>${funcionario.nome}</strong> solicitou uma ausência:</p>
<ul>
<li><strong>Período:</strong> ${new Date(args.dataInicio).toLocaleDateString('pt-BR')} até ${new Date(args.dataFim).toLocaleDateString('pt-BR')}</li>
<li><strong>Período:</strong> ${formatarDataBR(args.dataInicio)} até ${formatarDataBR(args.dataFim)}</li>
<li><strong>Motivo:</strong> ${args.motivo}</li>
</ul>
<p>Por favor, acesse o sistema para aprovar ou reprovar esta solicitação.</p>`,
@@ -437,7 +440,7 @@ export const criarSolicitacao = mutation({
conversaId,
remetenteId: funcionarioUsuario._id,
tipo: 'texto',
conteudo: `Solicitei uma ausência de ${new Date(args.dataInicio).toLocaleDateString('pt-BR')} até ${new Date(args.dataFim).toLocaleDateString('pt-BR')}. Motivo: ${args.motivo}`,
conteudo: `Solicitei uma ausência de ${formatarDataBR(args.dataInicio)} até ${formatarDataBR(args.dataFim)}. Motivo: ${args.motivo}`,
enviadaEm: Date.now()
});
}
@@ -499,7 +502,7 @@ export const aprovar = mutation({
solicitacaoAusenciaId: args.solicitacaoId,
tipo: 'aprovado',
lida: false,
mensagem: `Sua solicitação de ausência de ${new Date(solicitacao.dataInicio).toLocaleDateString('pt-BR')} até ${new Date(solicitacao.dataFim).toLocaleDateString('pt-BR')} foi aprovada!`
mensagem: `Sua solicitação de ausência de ${formatarDataBR(solicitacao.dataInicio)} até ${formatarDataBR(solicitacao.dataFim)} foi aprovada!`
});
const gestorUsuario = await ctx.db.get(args.gestorId);
@@ -520,8 +523,8 @@ export const aprovar = mutation({
variaveis: {
funcionarioNome: funcionarioUsuario.nome,
gestorNome: gestorUsuario.nome,
dataInicio: new Date(solicitacao.dataInicio).toLocaleDateString('pt-BR'),
dataFim: new Date(solicitacao.dataFim).toLocaleDateString('pt-BR'),
dataInicio: formatarDataBR(solicitacao.dataInicio),
dataFim: formatarDataBR(solicitacao.dataFim),
motivo: solicitacao.motivo,
urlSistema
},
@@ -540,7 +543,7 @@ export const aprovar = mutation({
corpo: `<p>Olá ${funcionarioUsuario.nome},</p>
<p>Sua solicitação de ausência foi <strong>aprovada</strong> pelo gestor ${gestorUsuario.nome}:</p>
<ul>
<li><strong>Período:</strong> ${new Date(solicitacao.dataInicio).toLocaleDateString('pt-BR')} até ${new Date(solicitacao.dataFim).toLocaleDateString('pt-BR')}</li>
<li><strong>Período:</strong> ${formatarDataBR(solicitacao.dataInicio)} até ${formatarDataBR(solicitacao.dataFim)}</li>
<li><strong>Motivo:</strong> ${solicitacao.motivo}</li>
</ul>`,
enviadoPor: args.gestorId
@@ -579,7 +582,7 @@ export const aprovar = mutation({
conversaId,
remetenteId: args.gestorId,
tipo: 'texto',
conteudo: `Aprovei sua solicitação de ausência de ${new Date(solicitacao.dataInicio).toLocaleDateString('pt-BR')} até ${new Date(solicitacao.dataFim).toLocaleDateString('pt-BR')}.`,
conteudo: `Aprovei sua solicitação de ausência de ${formatarDataBR(solicitacao.dataInicio)} até ${formatarDataBR(solicitacao.dataFim)}.`,
enviadaEm: Date.now()
});
}
@@ -643,7 +646,7 @@ export const reprovar = mutation({
solicitacaoAusenciaId: args.solicitacaoId,
tipo: 'reprovado',
lida: false,
mensagem: `Sua solicitação de ausência de ${new Date(solicitacao.dataInicio).toLocaleDateString('pt-BR')} até ${new Date(solicitacao.dataFim).toLocaleDateString('pt-BR')} foi reprovada. Motivo: ${args.motivoReprovacao}`
mensagem: `Sua solicitação de ausência de ${formatarDataBR(solicitacao.dataInicio)} até ${formatarDataBR(solicitacao.dataFim)} foi reprovada. Motivo: ${args.motivoReprovacao}`
});
const gestorUsuario = await ctx.db.get(args.gestorId);
@@ -664,8 +667,8 @@ export const reprovar = mutation({
variaveis: {
funcionarioNome: funcionarioUsuario.nome,
gestorNome: gestorUsuario.nome,
dataInicio: new Date(solicitacao.dataInicio).toLocaleDateString('pt-BR'),
dataFim: new Date(solicitacao.dataFim).toLocaleDateString('pt-BR'),
dataInicio: formatarDataBR(solicitacao.dataInicio),
dataFim: formatarDataBR(solicitacao.dataFim),
motivo: solicitacao.motivo,
motivoReprovacao: args.motivoReprovacao,
urlSistema
@@ -685,7 +688,7 @@ export const reprovar = mutation({
corpo: `<p>Olá ${funcionarioUsuario.nome},</p>
<p>Sua solicitação de ausência foi <strong>reprovada</strong> pelo gestor ${gestorUsuario.nome}:</p>
<ul>
<li><strong>Período:</strong> ${new Date(solicitacao.dataInicio).toLocaleDateString('pt-BR')} até ${new Date(solicitacao.dataFim).toLocaleDateString('pt-BR')}</li>
<li><strong>Período:</strong> ${formatarDataBR(solicitacao.dataInicio)} até ${formatarDataBR(solicitacao.dataFim)}</li>
<li><strong>Motivo:</strong> ${solicitacao.motivo}</li>
<li><strong>Motivo da Reprovação:</strong> ${args.motivoReprovacao}</li>
</ul>`,
@@ -725,7 +728,7 @@ export const reprovar = mutation({
conversaId,
remetenteId: args.gestorId,
tipo: 'texto',
conteudo: `Reprovei sua solicitação de ausência de ${new Date(solicitacao.dataInicio).toLocaleDateString('pt-BR')} até ${new Date(solicitacao.dataFim).toLocaleDateString('pt-BR')}. Motivo: ${args.motivoReprovacao}`,
conteudo: `Reprovei sua solicitação de ausência de ${formatarDataBR(solicitacao.dataInicio)} até ${formatarDataBR(solicitacao.dataFim)}. Motivo: ${args.motivoReprovacao}`,
enviadaEm: Date.now()
});
}