Checkpoint: Implémentation de trois fonctionnalités majeures :
1. Personnalisation des templates d'emails avec variables {{lieu}} et {{formateur}} (déjà disponible)
2. Aperçu avant envoi avec données réelles d'un apprenant (modal avec iframe)
3. Email de rappel J-1 avec bouton d'envoi et d'aperçu
Les templates personnalisés supportent maintenant toutes les variables disponibles.
L'aperçu permet de vérifier le rendu final avant l'envoi groupé.
Le rappel J-1 complète le système de communication avec les apprenants.
This commit is contained in:
@@ -278,6 +278,81 @@ export async function sendRappelJ7Email(params: {
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Envoie un email de rappel J-1 à un apprenant
|
||||
*/
|
||||
export async function sendRappelJ1Email(params: {
|
||||
apprenantEmail: string;
|
||||
apprenantNom: string;
|
||||
apprenantPrenom: string;
|
||||
apprenantFonction: string;
|
||||
formationNom: string;
|
||||
sequenceNom: string;
|
||||
dates: Array<{ dateDebut: Date; dateFin: Date; ordre: number }>;
|
||||
lieu?: string;
|
||||
formateur?: string;
|
||||
}): Promise<boolean> {
|
||||
const fonctionLabel = params.apprenantFonction === 'directeur' ? 'Directeur' :
|
||||
params.apprenantFonction === 'chef_service' ? 'Chef de service' : '';
|
||||
const salutation = fonctionLabel ? `${fonctionLabel} ${params.apprenantPrenom} ${params.apprenantNom}` : params.apprenantPrenom;
|
||||
|
||||
const datesHTML = params.dates.map(date => `
|
||||
<div class="date-item">
|
||||
<strong>Date ${date.ordre} :</strong> ${date.dateDebut.toLocaleDateString('fr-FR', {
|
||||
weekday: 'long',
|
||||
year: 'numeric',
|
||||
month: 'long',
|
||||
day: 'numeric',
|
||||
hour: '2-digit',
|
||||
minute: '2-digit'
|
||||
})} - ${date.dateFin.toLocaleDateString('fr-FR', {
|
||||
hour: '2-digit',
|
||||
minute: '2-digit'
|
||||
})}
|
||||
</div>
|
||||
`).join('');
|
||||
|
||||
const content = `
|
||||
<h2>Rappel : Votre formation commence demain !</h2>
|
||||
<p>Bonjour ${salutation},</p>
|
||||
|
||||
<p>Nous vous rappelons que votre formation <strong>${params.formationNom}</strong> commence <strong>demain</strong>.</p>
|
||||
|
||||
<div class="info-box">
|
||||
<h3>Informations pratiques</h3>
|
||||
<p><strong>Séquence :</strong> ${params.sequenceNom}</p>
|
||||
${params.lieu ? `<p><strong>Lieu :</strong> ${params.lieu}</p>` : ''}
|
||||
${params.formateur ? `<p><strong>Formateur :</strong> ${params.formateur}</p>` : ''}
|
||||
<h4>Dates :</h4>
|
||||
${datesHTML}
|
||||
</div>
|
||||
|
||||
<p><strong>Merci de vous présenter à l'heure indiquée.</strong></p>
|
||||
<p>N'oubliez pas d'apporter le matériel nécessaire.</p>
|
||||
|
||||
<p>Si vous avez des questions de dernière minute, n'hésitez pas à contacter le service RH.</p>
|
||||
|
||||
<p>À demain !</p>
|
||||
`;
|
||||
|
||||
const variables = {
|
||||
nomApprenant: params.apprenantNom,
|
||||
prenomApprenant: params.apprenantPrenom,
|
||||
nomFormation: params.formationNom,
|
||||
nomSequence: params.sequenceNom,
|
||||
dateDebut: params.dates[0]?.dateDebut.toLocaleDateString('fr-FR') || '',
|
||||
dateFin: params.dates[params.dates.length - 1]?.dateFin.toLocaleDateString('fr-FR') || '',
|
||||
lieu: params.lieu || '',
|
||||
formateur: params.formateur || '',
|
||||
};
|
||||
|
||||
return sendEmail({
|
||||
to: params.apprenantEmail,
|
||||
subject: `Rappel J-1 : ${params.formationNom} - C'est demain !`,
|
||||
html: await getEmailTemplate(content, 'rappel', variables),
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Envoie des emails groupés à tous les inscrits d'une séquence
|
||||
*/
|
||||
@@ -285,7 +360,7 @@ export async function sendGroupEmail(params: {
|
||||
recipients: Array<{ email: string; prenom: string; nom: string; fonction: string }>;
|
||||
formationNom: string;
|
||||
sequenceNom: string;
|
||||
type: 'teaser' | 'rappel';
|
||||
type: 'teaser' | 'rappel' | 'rappel_j1';
|
||||
dates: Array<{ dateDebut: Date; dateFin: Date; ordre: number }>;
|
||||
lieu?: string;
|
||||
formateur?: string;
|
||||
@@ -307,7 +382,7 @@ export async function sendGroupEmail(params: {
|
||||
lieu: params.lieu,
|
||||
formateur: params.formateur,
|
||||
});
|
||||
} else {
|
||||
} else if (params.type === 'rappel') {
|
||||
await sendRappelJ7Email({
|
||||
apprenantEmail: recipient.email,
|
||||
apprenantPrenom: recipient.prenom,
|
||||
@@ -318,6 +393,19 @@ export async function sendGroupEmail(params: {
|
||||
dates: params.dates,
|
||||
lieu: params.lieu || '',
|
||||
});
|
||||
} else {
|
||||
// rappel_j1
|
||||
await sendRappelJ1Email({
|
||||
apprenantEmail: recipient.email,
|
||||
apprenantPrenom: recipient.prenom,
|
||||
apprenantNom: recipient.nom,
|
||||
apprenantFonction: recipient.fonction,
|
||||
formationNom: params.formationNom,
|
||||
sequenceNom: params.sequenceNom,
|
||||
dates: params.dates,
|
||||
lieu: params.lieu,
|
||||
formateur: params.formateur,
|
||||
});
|
||||
}
|
||||
sent++;
|
||||
} catch (error) {
|
||||
|
||||
Reference in New Issue
Block a user