feat: add tab navigation and content management for notifications page, allowing users to switch between Enviar Notificação, Gerenciar Templates, and Agendamentos for improved organization and usability

This commit is contained in:
2025-11-30 16:33:52 -03:00
parent 2fb7df8849
commit 4ab151bed7
11 changed files with 1370 additions and 57 deletions

View File

@@ -358,20 +358,45 @@ export const criarSolicitacao = mutation({
.first();
if (gestorUsuario && funcionarioUsuario) {
// Enviar email ao gestor
await ctx.runMutation(api.email.enfileirarEmail, {
destinatario: gestorUsuario.email,
destinatarioId: gestorId,
assunto: `Nova Solicitação de Ausência - ${funcionario.nome}`,
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>Motivo:</strong> ${args.motivo}</li>
</ul>
<p>Por favor, acesse o sistema para aprovar ou reprovar esta solicitação.</p>`,
enviadoPor: funcionarioUsuario._id,
});
// Obter URL do sistema
let urlSistema = process.env.FRONTEND_URL || "http://localhost:5173";
if (!urlSistema.match(/^https?:\/\//i)) {
urlSistema = `http://${urlSistema}`;
}
// Enviar email ao gestor usando template
try {
await ctx.runAction(api.email.enviarEmailComTemplate, {
destinatario: gestorUsuario.email,
destinatarioId: gestorId,
templateCodigo: "ausencia_solicitada",
variaveis: {
gestorNome: gestorUsuario.nome,
funcionarioNome: funcionario.nome,
dataInicio: new Date(args.dataInicio).toLocaleDateString("pt-BR"),
dataFim: new Date(args.dataFim).toLocaleDateString("pt-BR"),
motivo: args.motivo,
urlSistema,
},
enviadoPor: funcionarioUsuario._id,
});
} catch (error) {
// Fallback para envio direto se template não existir
console.warn("Template ausencia_solicitada não encontrado, usando envio direto:", error);
await ctx.runMutation(api.email.enfileirarEmail, {
destinatario: gestorUsuario.email,
destinatarioId: gestorId,
assunto: `Nova Solicitação de Ausência - ${funcionario.nome}`,
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>Motivo:</strong> ${args.motivo}</li>
</ul>
<p>Por favor, acesse o sistema para aprovar ou reprovar esta solicitação.</p>`,
enviadoPor: funcionarioUsuario._id,
});
}
// Criar ou obter conversa entre gestor e funcionário
const conversasExistentes = await ctx.db
@@ -475,19 +500,44 @@ export const aprovar = mutation({
const gestorUsuario = await ctx.db.get(args.gestorId);
if (gestorUsuario) {
// Enviar email ao funcionário
await ctx.runMutation(api.email.enfileirarEmail, {
destinatario: funcionarioUsuario.email,
destinatarioId: funcionarioUsuario._id,
assunto: "Solicitação de Ausência Aprovada",
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>Motivo:</strong> ${solicitacao.motivo}</li>
</ul>`,
enviadoPor: args.gestorId,
});
// Obter URL do sistema
let urlSistema = process.env.FRONTEND_URL || "http://localhost:5173";
if (!urlSistema.match(/^https?:\/\//i)) {
urlSistema = `http://${urlSistema}`;
}
// Enviar email ao funcionário usando template
try {
await ctx.runAction(api.email.enviarEmailComTemplate, {
destinatario: funcionarioUsuario.email,
destinatarioId: funcionarioUsuario._id,
templateCodigo: "ausencia_aprovada",
variaveis: {
funcionarioNome: funcionarioUsuario.nome,
gestorNome: gestorUsuario.nome,
dataInicio: new Date(solicitacao.dataInicio).toLocaleDateString("pt-BR"),
dataFim: new Date(solicitacao.dataFim).toLocaleDateString("pt-BR"),
motivo: solicitacao.motivo,
urlSistema,
},
enviadoPor: args.gestorId,
});
} catch (error) {
// Fallback para envio direto se template não existir
console.warn("Template ausencia_aprovada não encontrado, usando envio direto:", error);
await ctx.runMutation(api.email.enfileirarEmail, {
destinatario: funcionarioUsuario.email,
destinatarioId: funcionarioUsuario._id,
assunto: "Solicitação de Ausência Aprovada",
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>Motivo:</strong> ${solicitacao.motivo}</li>
</ul>`,
enviadoPor: args.gestorId,
});
}
// Criar ou obter conversa
const conversasExistentes = await ctx.db
@@ -593,20 +643,46 @@ export const reprovar = mutation({
const gestorUsuario = await ctx.db.get(args.gestorId);
if (gestorUsuario) {
// Enviar email ao funcionário
await ctx.runMutation(api.email.enfileirarEmail, {
destinatario: funcionarioUsuario.email,
destinatarioId: funcionarioUsuario._id,
assunto: "Solicitação de Ausência Reprovada",
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>Motivo:</strong> ${solicitacao.motivo}</li>
<li><strong>Motivo da Reprovação:</strong> ${args.motivoReprovacao}</li>
</ul>`,
enviadoPor: args.gestorId,
});
// Obter URL do sistema
let urlSistema = process.env.FRONTEND_URL || "http://localhost:5173";
if (!urlSistema.match(/^https?:\/\//i)) {
urlSistema = `http://${urlSistema}`;
}
// Enviar email ao funcionário usando template
try {
await ctx.runAction(api.email.enviarEmailComTemplate, {
destinatario: funcionarioUsuario.email,
destinatarioId: funcionarioUsuario._id,
templateCodigo: "ausencia_reprovada",
variaveis: {
funcionarioNome: funcionarioUsuario.nome,
gestorNome: gestorUsuario.nome,
dataInicio: new Date(solicitacao.dataInicio).toLocaleDateString("pt-BR"),
dataFim: new Date(solicitacao.dataFim).toLocaleDateString("pt-BR"),
motivo: solicitacao.motivo,
motivoReprovacao: args.motivoReprovacao,
urlSistema,
},
enviadoPor: args.gestorId,
});
} catch (error) {
// Fallback para envio direto se template não existir
console.warn("Template ausencia_reprovada não encontrado, usando envio direto:", error);
await ctx.runMutation(api.email.enfileirarEmail, {
destinatario: funcionarioUsuario.email,
destinatarioId: funcionarioUsuario._id,
assunto: "Solicitação de Ausência Reprovada",
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>Motivo:</strong> ${solicitacao.motivo}</li>
<li><strong>Motivo da Reprovação:</strong> ${args.motivoReprovacao}</li>
</ul>`,
enviadoPor: args.gestorId,
});
}
// Criar ou obter conversa
const conversasExistentes = await ctx.db