From e9e39f6cddbbb9f88c5e6b967e3ce868711e4da7 Mon Sep 17 00:00:00 2001 From: Manus Date: Sun, 18 Jan 2026 07:42:56 -0500 Subject: [PATCH] =?UTF-8?q?Checkpoint:=20Corrections=20multiples=20pour=20?= =?UTF-8?q?le=20syst=C3=A8me=20d'attestations=20:=201.=20Ajout=20de=20l'en?= =?UTF-8?q?registrement=20dans=20l'historique=20lors=20de=20l'envoi=20d'at?= =?UTF-8?q?testations=20(backend=20+=20frontend)=202.=20Correction=20du=20?= =?UTF-8?q?bouton=20Renvoyer=20inactif=20(selectedSequenceId=20->=20appren?= =?UTF-8?q?ant.sequence.id)=203.=20Gestion=20des=20erreurs=20avec=20enregi?= =?UTF-8?q?strement=20dans=20l'historique=20en=20cas=20d'=C3=A9chec=204.?= =?UTF-8?q?=20Support=20des=20chemins=20locaux=20et=20URLs=20pour=20les=20?= =?UTF-8?q?fichiers=20PDF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/src/pages/AdminGestionAttestations.tsx | 2 + server/routers.ts | 45 ++++++++++++++----- todo.md | 1 + 3 files changed, 37 insertions(+), 11 deletions(-) diff --git a/client/src/pages/AdminGestionAttestations.tsx b/client/src/pages/AdminGestionAttestations.tsx index a934e21..c2d8fce 100644 --- a/client/src/pages/AdminGestionAttestations.tsx +++ b/client/src/pages/AdminGestionAttestations.tsx @@ -234,6 +234,8 @@ export default function AdminGestionAttestations() { sendAttestationMutation.mutate({ attestationId: apprenant.attestation.id, + sequenceId: apprenant.sequence.id, + apprenantId: apprenant.apprenant.id, apprenantEmail: apprenant.apprenant.email, apprenantNom: apprenant.apprenant.nom, apprenantPrenom: apprenant.apprenant.prenom, diff --git a/server/routers.ts b/server/routers.ts index 0255b9f..61e53cf 100644 --- a/server/routers.ts +++ b/server/routers.ts @@ -2526,6 +2526,8 @@ export const appRouter = router({ sendAttestation: adminProcedure .input(z.object({ attestationId: z.number(), + sequenceId: z.number(), + apprenantId: z.number(), apprenantEmail: z.string(), apprenantNom: z.string(), apprenantPrenom: z.string(), @@ -2535,20 +2537,41 @@ export const appRouter = router({ .mutation(async ({ input }) => { const { sendAttestationEmail } = await import("./emailService"); const { markAttestationAsSent } = await import("./gestionAttestationsDb"); + const { enregistrerEnvoiAttestation } = await import("./attestationsDb"); - // Envoyer l'email - await sendAttestationEmail({ - to: input.apprenantEmail, - apprenantNom: input.apprenantNom, - apprenantPrenom: input.apprenantPrenom, - formationNom: input.formationNom, - pdfUrl: input.pdfUrl, - }); + try { + // Envoyer l'email + await sendAttestationEmail({ + to: input.apprenantEmail, + apprenantNom: input.apprenantNom, + apprenantPrenom: input.apprenantPrenom, + formationNom: input.formationNom, + pdfUrl: input.pdfUrl, + }); - // Marquer comme envoyé - await markAttestationAsSent(input.attestationId); + // Marquer comme envoyé + await markAttestationAsSent(input.attestationId); - return { success: true }; + // Enregistrer dans l'historique + await enregistrerEnvoiAttestation({ + sequenceId: input.sequenceId, + apprenantId: input.apprenantId, + statut: "envoye", + urlAttestation: input.pdfUrl, + }); + + return { success: true }; + } catch (error: any) { + // Enregistrer l'échec dans l'historique + await enregistrerEnvoiAttestation({ + sequenceId: input.sequenceId, + apprenantId: input.apprenantId, + statut: "erreur", + messageErreur: error.message, + urlAttestation: input.pdfUrl, + }); + throw error; + } }), }), diff --git a/todo.md b/todo.md index e658d59..31ad5fa 100644 --- a/todo.md +++ b/todo.md @@ -863,3 +863,4 @@ - [x] Modifier l'envoi d'attestation pour joindre le PDF directement en pièce jointe au lieu d'un lien de téléchargement - [x] Permettre le renvoi d'une attestation même après qu'elle ait été envoyée (afficher bouton Renvoyer au lieu de masquer Envoyer) - [x] Corriger l'erreur "Failed to parse URL" lors de l'envoi d'attestation avec un chemin local (gérer les chemins locaux et URLs complètes) +- [x] Corriger le bouton Renvoyer inactif dans la gestion des attestations (correction selectedSequenceId -> apprenant.sequence.id)