Checkpoint: Corrections multiples sur les attestations : bug de modal bloquée corrigé, remplacement des variables dans l'email d'attestation fonctionnel, et type attestation ajouté au schéma de validation

This commit is contained in:
Manus
2026-01-30 08:46:39 -05:00
parent 8bfc851fe8
commit c102572403
3 changed files with 24 additions and 7 deletions

View File

@@ -1,4 +1,4 @@
import { useState, useMemo } from "react"; import { useState, useMemo, useEffect } from "react";
import { trpc } from "@/lib/trpc"; import { trpc } from "@/lib/trpc";
import DashboardLayout from "@/components/DashboardLayout"; import DashboardLayout from "@/components/DashboardLayout";
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
@@ -34,6 +34,15 @@ function UploadAttestationDialog({
tailleFichier: number; tailleFichier: number;
} | null>(null); } | null>(null);
// Réinitialiser l'état quand la modal s'ouvre
useEffect(() => {
if (open) {
setUploading(false);
setUploadProgress(0);
setFileData(null);
}
}, [open]);
const uploadMutation = trpc.gestionAttestations.uploadDocument.useMutation({ const uploadMutation = trpc.gestionAttestations.uploadDocument.useMutation({
onSuccess: () => { onSuccess: () => {
onSuccess(); onSuccess();

View File

@@ -1175,11 +1175,15 @@ export async function sendAttestationEmail(params: {
const template = templates[0]; const template = templates[0];
// Remplacer les variables dans le template // Préparer les variables pour le remplacement
let content = template.bodyContent; const variables = {
content = content.replace(/{{prenomApprenant}}/g, params.apprenantPrenom); prenomApprenant: params.apprenantPrenom,
content = content.replace(/{{nomApprenant}}/g, params.apprenantNom); nomApprenant: params.apprenantNom,
content = content.replace(/{{nomFormation}}/g, params.formationNom); nomFormation: params.formationNom,
};
// Le contenu sera remplacé par generateEmailFromTemplate
const content = template.bodyContent;
// Récupérer le PDF (depuis URL ou chemin local) // Récupérer le PDF (depuis URL ou chemin local)
let pdfBuffer: Buffer; let pdfBuffer: Buffer;
@@ -1211,7 +1215,7 @@ export async function sendAttestationEmail(params: {
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', variables),
attachments: [{ attachments: [{
filename: `Attestation_${params.apprenantNom}_${params.apprenantPrenom}.pdf`, filename: `Attestation_${params.apprenantNom}_${params.apprenantPrenom}.pdf`,
content: pdfBuffer.toString('base64'), content: pdfBuffer.toString('base64'),

View File

@@ -1466,3 +1466,7 @@
- [x] Corriger le bug où le statut reste "envoyé" après la suppression d'une attestation - [x] Corriger le bug où le statut reste "envoyé" après la suppression d'une attestation
- [x] Corriger l'erreur de validation lors de la modification du template attestation - [x] Corriger l'erreur de validation lors de la modification du template attestation
- [x] Corriger le remplacement des variables dans le template email d'attestation
- [x] Corriger le bug de la modal de chargement d'attestation qui reste bloquée sur l'état précédent