Checkpoint: Amélioration de l'email de teaser avec affichage du formateur et du lieu :

Modifications apportées :
- Ajout des paramètres `lieu` et `formateur` à la fonction sendTeaserEmail
- Récupération du formateur depuis la base de données dans routers.ts via getFormateurById
- Affichage du lieu et du formateur dans le contenu HTML de l'email teaser
- Ajout de `lieu` et `formateur` dans les variables disponibles pour les templates personnalisés

Variables disponibles dans les templates d'emails :
- {{nomApprenant}} - Nom de l'apprenant
- {{prenomApprenant}} - Prénom de l'apprenant
- {{nomFormation}} - Nom de la formation
- {{nomSequence}} - Nom de la séquence
- {{dateDebut}} - Date de début formatée
- {{dateFin}} - Date de fin formatée
- {{lieu}} - Lieu de la formation
- {{formateur}} - Nom du formateur

L'email de teaser affiche maintenant toutes les informations importantes pour les apprenants.
This commit is contained in:
Manus Sandbox
2025-11-30 13:11:16 -05:00
parent fc6bf5ddcc
commit 9e1d574d2e
3 changed files with 25 additions and 0 deletions

View File

@@ -154,6 +154,8 @@ export async function sendTeaserEmail(params: {
formationNom: string; formationNom: string;
sequenceNom: string; sequenceNom: string;
dates: Array<{ dateDebut: Date; dateFin: Date; ordre: number }>; dates: Array<{ dateDebut: Date; dateFin: Date; ordre: number }>;
lieu?: string;
formateur?: string;
}): Promise<boolean> { }): Promise<boolean> {
const fonctionLabel = params.apprenantFonction === 'directeur' ? 'Directeur' : const fonctionLabel = params.apprenantFonction === 'directeur' ? 'Directeur' :
params.apprenantFonction === 'chef_service' ? 'Chef de service' : ''; params.apprenantFonction === 'chef_service' ? 'Chef de service' : '';
@@ -180,6 +182,8 @@ export async function sendTeaserEmail(params: {
<p><strong>Séquence :</strong> ${params.sequenceNom}</p> <p><strong>Séquence :</strong> ${params.sequenceNom}</p>
<h4>Dates :</h4> <h4>Dates :</h4>
${datesHTML} ${datesHTML}
${params.lieu ? `<p><strong>Lieu :</strong> ${params.lieu}</p>` : ''}
${params.formateur ? `<p><strong>Formateur :</strong> ${params.formateur}</p>` : ''}
</div> </div>
<p>Préparez-vous à vivre une expérience enrichissante qui vous permettra de développer vos compétences managériales.</p> <p>Préparez-vous à vivre une expérience enrichissante qui vous permettra de développer vos compétences managériales.</p>
@@ -194,6 +198,8 @@ export async function sendTeaserEmail(params: {
nomSequence: params.sequenceNom, nomSequence: params.sequenceNom,
dateDebut: params.dates[0]?.dateDebut.toLocaleDateString('fr-FR') || '', dateDebut: params.dates[0]?.dateDebut.toLocaleDateString('fr-FR') || '',
dateFin: params.dates[params.dates.length - 1]?.dateFin.toLocaleDateString('fr-FR') || '', dateFin: params.dates[params.dates.length - 1]?.dateFin.toLocaleDateString('fr-FR') || '',
lieu: params.lieu || '',
formateur: params.formateur || '',
}; };
return sendEmail({ return sendEmail({
@@ -282,6 +288,7 @@ export async function sendGroupEmail(params: {
type: 'teaser' | 'rappel'; type: 'teaser' | 'rappel';
dates: Array<{ dateDebut: Date; dateFin: Date; ordre: number }>; dates: Array<{ dateDebut: Date; dateFin: Date; ordre: number }>;
lieu?: string; lieu?: string;
formateur?: string;
}): Promise<{ sent: number; failed: number }> { }): Promise<{ sent: number; failed: number }> {
let sent = 0; let sent = 0;
let failed = 0; let failed = 0;
@@ -297,6 +304,8 @@ export async function sendGroupEmail(params: {
formationNom: params.formationNom, formationNom: params.formationNom,
sequenceNom: params.sequenceNom, sequenceNom: params.sequenceNom,
dates: params.dates, dates: params.dates,
lieu: params.lieu,
formateur: params.formateur,
}); });
} else { } else {
await sendRappelJ7Email({ await sendRappelJ7Email({

View File

@@ -525,6 +525,12 @@ export const appRouter = router({
console.log(`[Email Group] Envoi de ${recipients.length} emails de type ${input.type}`); console.log(`[Email Group] Envoi de ${recipients.length} emails de type ${input.type}`);
console.log(`[Email Group] Destinataires:`, recipients.map(r => r.email)); console.log(`[Email Group] Destinataires:`, recipients.map(r => r.email));
let formateurNom: string | undefined;
if (sequence.formateurId) {
const formateur = await db.getFormateurById(sequence.formateurId);
formateurNom = formateur?.nom;
}
const result = await sendGroupEmail({ const result = await sendGroupEmail({
recipients, recipients,
formationNom: formation.nom, formationNom: formation.nom,
@@ -536,6 +542,7 @@ export const appRouter = router({
ordre: d.ordre, ordre: d.ordre,
})), })),
lieu: sequence.lieu, lieu: sequence.lieu,
formateur: formateurNom,
}); });
console.log(`[Email Group] Résultat: ${result.sent} envoyés, ${result.failed} échoués`); console.log(`[Email Group] Résultat: ${result.sent} envoyés, ${result.failed} échoués`);

View File

@@ -793,3 +793,12 @@
- [x] Vérifier le système de remplacement des tags ({{nomFormation}}) - [x] Vérifier le système de remplacement des tags ({{nomFormation}})
- [x] Corriger le remplacement du tag (ajout des variables dans sendTeaserEmail et sendRappelJ7Email) - [x] Corriger le remplacement du tag (ajout des variables dans sendTeaserEmail et sendRappelJ7Email)
- [x] Corriger et préparer pour test en production - [x] Corriger et préparer pour test en production
## Email teaser sans formateur ni lieu
- [x] Vérifier les données disponibles dans sendTeaserEmail
- [x] Ajouter le formateur et le lieu dans les paramètres de sendTeaserEmail
- [x] Récupérer le formateur depuis la base de données dans routers.ts
- [x] Modifier le template pour afficher lieu et formateur
- [x] Ajouter lieu et formateur dans les variables
- [x] Préparer pour test en production