feat: enhance vacation management system with new employee association functionality, improved email notification handling, and comprehensive documentation; update dependencies and UI components for better user experience

This commit is contained in:
2025-10-30 09:27:10 -03:00
parent 21b41121db
commit fd445e8246
43 changed files with 6097 additions and 515 deletions

View File

@@ -35,23 +35,97 @@
processando = true;
try {
// TODO: Implementar envio de notificação
console.log("Enviar notificação", {
destinatarioId,
canal,
templateId: usarTemplate ? templateId : undefined,
mensagem: !usarTemplate ? mensagemPersonalizada : undefined
});
const destinatario = usuarios?.data?.find(u => u._id === destinatarioId);
alert("Notificação enviada com sucesso!");
if (!destinatario) {
alert("Destinatário não encontrado");
return;
}
let resultadoChat = null;
let resultadoEmail = null;
// ENVIAR PARA CHAT
if (canal === "chat" || canal === "ambos") {
const conversaResult = await client.mutation(
api.chat.criarOuBuscarConversaIndividual,
{ outroUsuarioId: destinatarioId as any }
);
if (conversaResult.conversaId) {
const mensagem = usarTemplate
? templateSelecionado?.corpo || ""
: mensagemPersonalizada;
resultadoChat = await client.mutation(api.chat.enviarMensagem, {
conversaId: conversaResult.conversaId,
conteudo: mensagem,
tipo: "texto", // Tipo de mensagem
permitirNotificacaoParaSiMesmo: true, // ✅ Permite notificação para si mesmo via painel admin
});
}
}
// ENVIAR PARA EMAIL
if (canal === "email" || canal === "ambos") {
if (!destinatario.email) {
alert("Destinatário não possui email cadastrado");
processando = false;
return;
}
if (usarTemplate && templateId) {
// Usar template
const template = templateSelecionado;
if (template) {
resultadoEmail = await client.mutation(api.email.enviarEmailComTemplate, {
destinatario: destinatario.email,
destinatarioId: destinatario._id as any,
templateCodigo: template.codigo,
variaveis: {
nome: destinatario.nome,
matricula: destinatario.matricula,
},
enviadoPorId: destinatario._id as any, // TODO: Pegar usuário logado
});
}
} else {
// Mensagem personalizada
resultadoEmail = await client.mutation(api.email.enfileirarEmail, {
destinatario: destinatario.email,
destinatarioId: destinatario._id as any,
assunto: "Notificação do Sistema",
corpo: mensagemPersonalizada,
enviadoPorId: destinatario._id as any, // TODO: Pegar usuário logado
});
}
}
// Feedback de sucesso
let mensagem = "Notificação enviada com sucesso!";
if (canal === "ambos") {
if (resultadoChat && resultadoEmail) {
mensagem = "✅ Notificação enviada para Chat e Email!";
} else if (resultadoChat) {
mensagem = "✅ Notificação enviada para Chat. Email falhou.";
} else if (resultadoEmail) {
mensagem = "✅ Notificação enviada para Email. Chat falhou.";
}
} else if (canal === "chat" && resultadoChat) {
mensagem = "✅ Mensagem enviada no Chat!";
} else if (canal === "email" && resultadoEmail) {
mensagem = "✅ Email enfileirado para envio!";
}
alert(mensagem);
// Limpar form
destinatarioId = "";
templateId = "";
mensagemPersonalizada = "";
} catch (error) {
} catch (error: any) {
console.error("Erro ao enviar notificação:", error);
alert("Erro ao enviar notificação");
alert("Erro ao enviar notificação: " + (error.message || "Erro desconhecido"));
} finally {
processando = false;
}
@@ -82,10 +156,10 @@
<!-- Destinatário -->
<div class="form-control mb-4">
<label class="label">
<label class="label" for="destinatario-select">
<span class="label-text font-medium">Destinatário *</span>
</label>
<select bind:value={destinatarioId} class="select select-bordered">
<select id="destinatario-select" bind:value={destinatarioId} class="select select-bordered">
<option value="">Selecione um usuário</option>
{#if usuarios?.data}
{#each usuarios.data as usuario}
@@ -99,9 +173,9 @@
<!-- Canal -->
<div class="form-control mb-4">
<label class="label">
<div class="label">
<span class="label-text font-medium">Canal de Envio *</span>
</label>
</div>
<div class="flex gap-4">
<label class="label cursor-pointer">
<input
@@ -135,9 +209,9 @@
<!-- Tipo de Mensagem -->
<div class="form-control mb-4">
<label class="label">
<div class="label">
<span class="label-text font-medium">Tipo de Mensagem</span>
</label>
</div>
<div class="flex gap-4">
<label class="label cursor-pointer">
<input
@@ -163,10 +237,10 @@
{#if usarTemplate}
<!-- Template -->
<div class="form-control mb-4">
<label class="label">
<label class="label" for="template-select">
<span class="label-text font-medium">Template *</span>
</label>
<select bind:value={templateId} class="select select-bordered">
<select id="template-select" bind:value={templateId} class="select select-bordered">
<option value="">Selecione um template</option>
{#if templates?.data}
{#each templates.data as template}
@@ -192,10 +266,11 @@
{:else}
<!-- Mensagem Personalizada -->
<div class="form-control mb-4">
<label class="label">
<label class="label" for="mensagem-textarea">
<span class="label-text font-medium">Mensagem *</span>
</label>
<textarea
id="mensagem-textarea"
bind:value={mensagemPersonalizada}
class="textarea textarea-bordered h-32"
placeholder="Digite sua mensagem personalizada..."
@@ -267,14 +342,15 @@
</div>
{#if template.tipo !== "sistema"}
<div class="dropdown dropdown-end">
<label tabindex="0" class="btn btn-ghost btn-xs">
<button type="button" tabindex="0" class="btn btn-ghost btn-xs" aria-label="Opções do template">
<svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 5v.01M12 12v.01M12 19v.01M12 6a1 1 0 110-2 1 1 0 010 2zm0 7a1 1 0 110-2 1 1 0 010 2zm0 7a1 1 0 110-2 1 1 0 010 2z" />
</svg>
</label>
</button>
<!-- svelte-ignore a11y_no_noninteractive_tabindex -->
<ul tabindex="0" class="dropdown-content menu p-2 shadow bg-base-100 rounded-box w-32">
<li><button>Editar</button></li>
<li><button class="text-error">Excluir</button></li>
<li><button type="button">Editar</button></li>
<li><button type="button" class="text-error">Excluir</button></li>
</ul>
</div>
{/if}