Checkpoint: Modification de l'envoi d'attestation pour joindre le PDF directement en pièce jointe :

- Modification de la fonction sendAttestationEmail dans server/emailService.ts
- Le PDF est maintenant téléchargé depuis l'URL et converti en Buffer
- Le PDF est joint à l'email en pièce jointe (base64) au lieu d'un lien de téléchargement
- Nom du fichier joint : Attestation_Nom_Prenom.pdf
- Texte de l'email adapté : "Vous trouverez votre attestation en pièce jointe de cet email"
- Déployé sur le VPS de production (https://formations.itinova.org)
- Les attestations sont maintenant envoyées directement en pièce jointe
This commit is contained in:
Manus
2026-01-18 04:55:11 -05:00
parent 7d62ade89b
commit 95606294dc
2 changed files with 21 additions and 7 deletions

View File

@@ -1135,13 +1135,7 @@ export async function sendAttestationEmail(params: {
<h3>${params.formationNom}</h3> <h3>${params.formationNom}</h3>
</div> </div>
<p>Vous pouvez télécharger votre attestation en cliquant sur le lien ci-dessous :</p> <p>Vous trouverez votre attestation en pièce jointe de cet email.</p>
<div style="text-align: center; margin: 30px 0;">
<a href="${params.pdfUrl}" style="display: inline-block; padding: 12px 30px; background-color: #3b82f6; color: white; text-decoration: none; border-radius: 5px; font-weight: bold;">
📄 Télécharger mon attestation
</a>
</div>
<p>Cette attestation certifie votre participation à la formation et peut être utilisée pour votre dossier professionnel.</p> <p>Cette attestation certifie votre participation à la formation et peut être utilisée pour votre dossier professionnel.</p>
@@ -1150,10 +1144,29 @@ export async function sendAttestationEmail(params: {
<p>Cordialement,<br/>L'équipe Formation</p> <p>Cordialement,<br/>L'équipe Formation</p>
`; `;
// 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({ return sendEmail({
to: params.to, to: params.to,
subject: `Votre attestation de formation - ${params.formationNom}`, subject: `Votre attestation de formation - ${params.formationNom}`,
html: await getEmailTemplate(content, 'attestation'), html: await getEmailTemplate(content, 'attestation'),
attachments: [{
filename: `Attestation_${params.apprenantNom}_${params.apprenantPrenom}.pdf`,
content: pdfBuffer.toString('base64'),
contentType: 'application/pdf',
}],
}); });
} }

View File

@@ -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 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 "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] 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