From 95606294dcad7a504b8793c0f534d6be610f5e06 Mon Sep 17 00:00:00 2001 From: Manus Date: Sun, 18 Jan 2026 04:55:11 -0500 Subject: [PATCH] =?UTF-8?q?Checkpoint:=20Modification=20de=20l'envoi=20d'a?= =?UTF-8?q?ttestation=20pour=20joindre=20le=20PDF=20directement=20en=20pi?= =?UTF-8?q?=C3=A8ce=20jointe=20:=20-=20Modification=20de=20la=20fonction?= =?UTF-8?q?=20sendAttestationEmail=20dans=20server/emailService.ts=20-=20L?= =?UTF-8?q?e=20PDF=20est=20maintenant=20t=C3=A9l=C3=A9charg=C3=A9=20depuis?= =?UTF-8?q?=20l'URL=20et=20converti=20en=20Buffer=20-=20Le=20PDF=20est=20j?= =?UTF-8?q?oint=20=C3=A0=20l'email=20en=20pi=C3=A8ce=20jointe=20(base64)?= =?UTF-8?q?=20au=20lieu=20d'un=20lien=20de=20t=C3=A9l=C3=A9chargement=20-?= =?UTF-8?q?=20Nom=20du=20fichier=20joint=20:=20Attestation=5FNom=5FPrenom.?= =?UTF-8?q?pdf=20-=20Texte=20de=20l'email=20adapt=C3=A9=20:=20"Vous=20trou?= =?UTF-8?q?verez=20votre=20attestation=20en=20pi=C3=A8ce=20jointe=20de=20c?= =?UTF-8?q?et=20email"=20-=20D=C3=A9ploy=C3=A9=20sur=20le=20VPS=20de=20pro?= =?UTF-8?q?duction=20(https://formations.itinova.org)=20-=20Les=20attestat?= =?UTF-8?q?ions=20sont=20maintenant=20envoy=C3=A9es=20directement=20en=20p?= =?UTF-8?q?i=C3=A8ce=20jointe?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/emailService.ts | 27 ++++++++++++++++++++------- todo.md | 1 + 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/server/emailService.ts b/server/emailService.ts index 8dac7e5..4340629 100644 --- a/server/emailService.ts +++ b/server/emailService.ts @@ -1135,13 +1135,7 @@ export async function sendAttestationEmail(params: {

${params.formationNom}

-

Vous pouvez télécharger votre attestation en cliquant sur le lien ci-dessous :

- -
- - 📄 Télécharger mon attestation - -
+

Vous trouverez votre attestation en pièce jointe de cet email.

Cette attestation certifie votre participation à la formation et peut être utilisée pour votre dossier professionnel.

@@ -1150,10 +1144,29 @@ export async function sendAttestationEmail(params: {

Cordialement,
L'équipe Formation

`; + // Télécharger le PDF depuis l'URL + let pdfBuffer: Buffer; + try { + const response = await fetch(params.pdfUrl); + if (!response.ok) { + throw new Error(`Failed to download PDF: ${response.statusText}`); + } + const arrayBuffer = await response.arrayBuffer(); + pdfBuffer = Buffer.from(arrayBuffer); + } catch (error) { + console.error('[sendAttestationEmail] Error downloading PDF:', error); + throw error; + } + return sendEmail({ to: params.to, subject: `Votre attestation de formation - ${params.formationNom}`, html: await getEmailTemplate(content, 'attestation'), + attachments: [{ + filename: `Attestation_${params.apprenantNom}_${params.apprenantPrenom}.pdf`, + content: pdfBuffer.toString('base64'), + contentType: 'application/pdf', + }], }); } diff --git a/todo.md b/todo.md index db690dc..dc749aa 100644 --- a/todo.md +++ b/todo.md @@ -860,3 +860,4 @@ - [x] Corriger l'erreur SQL "Failed query: insert into attestations" lors de l'upload d'attestation manuelle (ajout de apprenantId et sequenceId) - [x] Corriger l'erreur "refetchInscrits is not defined" lors de l'upload d'attestation manuelle (remplacement par refetchApprenants) - [x] Corriger l'erreur "aucune attestation disponible pour cet apprenant" lors de l'envoi manuel d'une attestation uploadée (vérification de documentUrl ou urlPdf) +- [x] Modifier l'envoi d'attestation pour joindre le PDF directement en pièce jointe au lieu d'un lien de téléchargement