Checkpoint: Évolution du système de rappels pour permettre jusqu'à 2 pièces jointes au lieu d'une seule. Migration SQL appliquée en local et sur le VPS de production. Les rappels existants sont préservés.

This commit is contained in:
Manus
2026-01-28 10:13:32 -05:00
parent 8c6dda473a
commit 86d3d437bd
10 changed files with 2445 additions and 17 deletions

View File

@@ -233,6 +233,9 @@ export async function sendRappelEmail(params: {
attachmentUrl?: string;
attachmentFilename?: string;
attachmentMimeType?: string;
attachmentUrl2?: string;
attachmentFilename2?: string;
attachmentMimeType2?: string;
}): Promise<boolean> {
const fonctionLabel = params.apprenantFonction === 'directeur' ? 'Directeur' :
params.apprenantFonction === 'chef_service' ? 'Chef de service' : '';
@@ -318,6 +321,37 @@ export async function sendRappelEmail(params: {
// Continuer l'envoi sans la pièce jointe
}
}
// Charger la deuxième pièce jointe si présente
if (params.attachmentUrl2 && params.attachmentFilename2 && params.attachmentMimeType2) {
try {
let base64: string;
// Vérifier si c'est une URL locale (commence par /uploads/)
if (params.attachmentUrl2.startsWith('/uploads/')) {
// Lire le fichier depuis le système de fichiers
const fs = await import('fs/promises');
const path = await import('path');
const filePath = path.join(process.cwd(), params.attachmentUrl2);
const fileBuffer = await fs.readFile(filePath);
base64 = fileBuffer.toString('base64');
} else {
// Télécharger le fichier depuis une URL externe (S3)
const response = await fetch(params.attachmentUrl2);
const arrayBuffer = await response.arrayBuffer();
base64 = Buffer.from(arrayBuffer).toString('base64');
}
attachments.push({
filename: params.attachmentFilename2,
content: base64,
contentType: params.attachmentMimeType2,
});
} catch (error) {
console.error('[Email] Erreur lors du chargement de la pièce jointe 2:', error);
// Continuer l'envoi sans la pièce jointe
}
}
return sendEmail({
to: params.apprenantEmail,