Checkpoint: Amélioration du bouton "Tester le rappel" pour utiliser automatiquement le bon template configuré :

- Modification de la procédure testerRappel pour détecter automatiquement le premier rappel actif configuré pour la séquence
- Suppression du paramètre typeRappel (n'est plus nécessaire)
- Création de la fonction sendRappelEmail générique qui utilise le templateType du rappel configuré
- Le bouton frontend envoie maintenant le bon template (rappel 1, 3, 4, 5, 6, etc.) selon la configuration de la séquence
- Gestion des pièces jointes configurées dans le rappel
- Mise à jour du fichier todo.md pour marquer la tâche comme terminée
This commit is contained in:
Manus
2026-01-15 12:22:24 -05:00
parent d3645ec1cb
commit e642f23170
4 changed files with 136 additions and 37 deletions

View File

@@ -216,6 +216,105 @@ export async function sendTeaserEmail(params: {
});
}
/**
* Envoie un email de rappel générique avec le template spécifié
*/
export async function sendRappelEmail(params: {
apprenantEmail: string;
apprenantPrenom: string;
apprenantNom: string;
apprenantFonction: string;
formationNom: string;
sequenceNom: string;
dates: Array<{ dateDebut: Date; dateFin: Date; ordre: number }>;
lieu: string;
formateur?: string;
templateType: string;
attachmentUrl?: string;
attachmentFilename?: string;
attachmentMimeType?: 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><br/>
${date.dateDebut.toLocaleDateString('fr-FR', {
weekday: 'long',
year: 'numeric',
month: 'long',
day: 'numeric',
hour: '2-digit',
minute: '2-digit'
})}
</div>
`).join('');
const content = `
<h2>Rappel : Votre formation</h2>
<p>Bonjour ${salutation},</p>
<p>Nous vous rappelons votre formation <strong>${params.formationNom}</strong>.</p>
<div class="info-box">
<h3>Informations pratiques</h3>
<p><strong>Séquence :</strong> ${params.sequenceNom}</p>
<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>Si vous avez des questions, n'hésitez pas à contacter le service RH.</p>
<p>À très bientôt !</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') || '',
datesHTML: datesHTML,
lieu: params.lieu,
formateur: params.formateur || '',
};
// Préparer les pièces jointes si nécessaire
const attachments: Array<{ filename: string; content: string; contentType: string }> = [];
if (params.attachmentUrl && params.attachmentFilename && params.attachmentMimeType) {
try {
// Télécharger le fichier depuis S3 et le convertir en base64
const response = await fetch(params.attachmentUrl);
const buffer = await response.arrayBuffer();
const base64 = Buffer.from(buffer).toString('base64');
attachments.push({
filename: params.attachmentFilename,
content: base64,
contentType: params.attachmentMimeType,
});
} catch (error) {
console.error('[Email] Erreur lors du téléchargement de la pièce jointe:', error);
// Continuer l'envoi sans la pièce jointe
}
}
return sendEmail({
to: params.apprenantEmail,
subject: `Rappel : ${params.formationNom}`,
html: await getEmailTemplate(content, params.templateType, variables),
attachments: attachments.length > 0 ? attachments : undefined,
});
}
/**
* Envoie un email de rappel J-7
*/