Checkpoint: Ajout d'une interface d'administration complète pour personnaliser les templates d'emails avec prévisualisation en temps réel, stockage en base de données et intégration avec le service d'envoi

This commit is contained in:
Manus Sandbox
2025-11-17 17:11:27 -05:00
parent f06cd3e8a5
commit 20dc80cd74
14 changed files with 1480 additions and 40 deletions

View File

@@ -5,6 +5,7 @@
import { generateFormationICS } from "./icsGenerator";
import { sendEmail as sendEmailViaService, isEmailServiceConfigured } from "./_core/emailSender";
import { generateEmailFromTemplate } from "./emailTemplateGenerator";
interface EmailParams {
to: string;
@@ -26,41 +27,10 @@ async function sendEmail(params: EmailParams): Promise<boolean> {
}
/**
* Template HTML de base pour les emails
* Template HTML de base pour les emails (avec template personnalisé)
*/
function getEmailTemplate(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; }
.container { max-width: 600px; margin: 0 auto; padding: 20px; }
.header { background-color: #2563eb; color: white; padding: 20px; text-align: center; }
.content { background-color: #f9fafb; padding: 30px; }
.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();
async function getEmailTemplate(content: string, templateType: string = 'inscription'): Promise<string> {
return await generateEmailFromTemplate(templateType, content);
}
/**
@@ -152,7 +122,7 @@ export async function sendInscriptionConfirmation(params: {
subject: isConfirmed
? `Confirmation d'inscription - ${params.formationNom}`
: `Liste d'attente - ${params.formationNom}`,
html: getEmailTemplate(content),
html: await getEmailTemplate(content, 'inscription'),
attachments,
});
}
@@ -204,7 +174,7 @@ export async function sendTeaserEmail(params: {
return sendEmail({
to: params.apprenantEmail,
subject: `Votre formation ${params.formationNom} approche !`,
html: getEmailTemplate(content),
html: await getEmailTemplate(content, 'teaser'),
});
}
@@ -263,7 +233,7 @@ export async function sendRappelJ7Email(params: {
return sendEmail({
to: params.apprenantEmail,
subject: `Rappel J-7 : ${params.formationNom}`,
html: getEmailTemplate(content),
html: await getEmailTemplate(content, 'rappel'),
});
}
@@ -356,6 +326,6 @@ export async function sendPasswordResetEmail(params: {
return sendEmail({
to: params.apprenantEmail,
subject: 'Réinitialisation de votre mot de passe - Manager Itinova',
html: getEmailTemplate(content),
html: await getEmailTemplate(content, 'reset_password'),
});
}