Files
formation-manager-itinova/server/emailTemplateGenerator.ts
manus-admin 2cac56b8c6
Some checks failed
Validation applicative / TypeScript, tests et build (push) Failing after 2m22s
fix: corriger le flux de réinitialisation par e-mail
2026-09-02 11:30:37 +02:00

189 lines
5.6 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* Générateur de templates d'emails personnalisés
* Utilise les templates stockés en base de données
*/
import * as db from "./db";
import { EmailTemplate } from "../drizzle/schema";
import { replaceEmailVariables, EmailVariables } from "./emailTemplateUtils";
/**
* Génère le HTML d'un email en utilisant le template personnalisé
* @param templateType - Type de template (à utiliser)
* @param content - Contenu de l'email (legacy, sera remplacé par bodyContent)
* @param variables - Variables à remplacer dans le template
*/
export async function generateEmailFromTemplate(
templateType: string,
content: string,
variables?: EmailVariables
): Promise<string> {
// Récupérer le template depuis la base de données
const template = await db.getEmailTemplateByType(templateType);
// Si pas de template trouvé, utiliser le template par défaut
if (!template) {
const defaultContent = variables ? replaceEmailVariables(content, variables) : content;
return getDefaultEmailTemplate(defaultContent);
}
return buildEmailHTML(template, content, variables);
}
/**
* Construit le HTML de l'email avec le template
*/
function buildEmailHTML(template: EmailTemplate, content: string, variables?: EmailVariables): string {
// Utiliser bodyContent si disponible, sinon utiliser content (legacy)
let emailBody = template.bodyContent || content || '';
// Les anciens modèles reset_password enregistrés avant lajout de la variable
// ne contiennent que du texte. On conserve ce texte, puis on ajoute le contenu
// métier (bouton et lien unique) afin que le destinataire puisse agir.
if (template.type === 'reset_password' && !emailBody.includes('{{lienReinitialisation}}')) {
emailBody = `${emailBody}\n${content}`;
}
// Remplacer les variables si fournies
if (variables && emailBody) {
emailBody = replaceEmailVariables(emailBody, variables);
}
// Remplacer les variables dans le titre et le pied de page
let titre = template.titre;
let piedDePage = template.piedDePage || 'Cet email a été envoyé automatiquement par le système de gestion des formations Itinova.';
if (variables) {
titre = replaceEmailVariables(titre, variables);
piedDePage = replaceEmailVariables(piedDePage, variables);
}
return `
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style>
body {
font-family: Arial, sans-serif;
line-height: 1.6;
color: #333;
margin: 0;
padding: 20px;
background-color: #f5f5f5;
}
.container {
max-width: 600px;
margin: 0 auto;
background-color: white;
}
.header {
background-color: ${template.couleurPrincipale};
color: white;
padding: 30px 20px;
text-align: center;
}
.header h1 {
margin: 0;
font-size: 24px;
}
.header img {
max-width: 150px;
margin-bottom: 15px;
display: block;
margin-left: auto;
margin-right: auto;
}
.content {
background-color: #f9fafb;
padding: 30px 20px;
}
.content h2 {
color: ${template.couleurPrincipale};
margin-top: 0;
}
.footer {
background-color: #f3f4f6;
padding: 20px;
text-align: center;
font-size: 12px;
color: #6b7280;
}
.button {
display: inline-block;
padding: 12px 24px;
background-color: ${template.couleurPrincipale};
color: white;
text-decoration: none;
border-radius: 6px;
margin: 10px 0;
}
.info-box {
background-color: #dbeafe;
border-left: 4px solid ${template.couleurPrincipale};
padding: 15px;
margin: 15px 0;
}
.date-item {
margin: 10px 0;
padding: 10px;
background-color: white;
border-radius: 4px;
}
</style>
</head>
<body>
<div class="container">
<div class="header">
<h1>${titre}</h1>
</div>
<div class="content">
${emailBody}
</div>
<div class="footer">
<p>${piedDePage}</p>
</div>
</div>
</body>
</html>
`.trim();
}
/**
* Template par défaut si aucun template personnalisé n'est trouvé
*/
function getDefaultEmailTemplate(content: string): string {
return `
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style>
body { font-family: Arial, sans-serif; line-height: 1.6; color: #333; margin: 0; padding: 20px; background-color: #f5f5f5; }
.container { max-width: 600px; margin: 0 auto; background-color: white; }
.header { background-color: #2563eb; color: white; padding: 30px 20px; text-align: center; }
.header h1 { margin: 0; font-size: 24px; }
.content { background-color: #f9fafb; padding: 30px 20px; }
.footer { background-color: #f3f4f6; padding: 20px; text-align: center; font-size: 12px; color: #6b7280; }
.button { display: inline-block; padding: 12px 24px; background-color: #2563eb; color: white; text-decoration: none; border-radius: 6px; margin: 10px 0; }
.info-box { background-color: #dbeafe; border-left: 4px solid #2563eb; padding: 15px; margin: 15px 0; }
.date-item { margin: 10px 0; padding: 10px; background-color: white; border-radius: 4px; }
</style>
</head>
<body>
<div class="container">
<div class="header">
<h1>Formation Manager Itinova</h1>
</div>
<div class="content">
${content}
</div>
<div class="footer">
<p>Cet email a été envoyé automatiquement par le système de gestion des formations Itinova.</p>
<p>Pour toute question, veuillez contacter le service RH.</p>
</div>
</div>
</body>
</html>
`.trim();
}