Checkpoint: Corrections multiples pour le système d'attestations :

1. Ajout de l'enregistrement dans l'historique lors de l'envoi d'attestations (backend + frontend)
2. Correction du bouton Renvoyer inactif (selectedSequenceId -> apprenant.sequence.id)
3. Gestion des erreurs avec enregistrement dans l'historique en cas d'échec
4. Support des chemins locaux et URLs pour les fichiers PDF
This commit is contained in:
Manus
2026-01-18 07:42:56 -05:00
parent ac9ece31a5
commit e9e39f6cdd
3 changed files with 37 additions and 11 deletions

View File

@@ -234,6 +234,8 @@ export default function AdminGestionAttestations() {
sendAttestationMutation.mutate({ sendAttestationMutation.mutate({
attestationId: apprenant.attestation.id, attestationId: apprenant.attestation.id,
sequenceId: apprenant.sequence.id,
apprenantId: apprenant.apprenant.id,
apprenantEmail: apprenant.apprenant.email, apprenantEmail: apprenant.apprenant.email,
apprenantNom: apprenant.apprenant.nom, apprenantNom: apprenant.apprenant.nom,
apprenantPrenom: apprenant.apprenant.prenom, apprenantPrenom: apprenant.apprenant.prenom,

View File

@@ -2526,6 +2526,8 @@ export const appRouter = router({
sendAttestation: adminProcedure sendAttestation: adminProcedure
.input(z.object({ .input(z.object({
attestationId: z.number(), attestationId: z.number(),
sequenceId: z.number(),
apprenantId: z.number(),
apprenantEmail: z.string(), apprenantEmail: z.string(),
apprenantNom: z.string(), apprenantNom: z.string(),
apprenantPrenom: z.string(), apprenantPrenom: z.string(),
@@ -2535,7 +2537,9 @@ export const appRouter = router({
.mutation(async ({ input }) => { .mutation(async ({ input }) => {
const { sendAttestationEmail } = await import("./emailService"); const { sendAttestationEmail } = await import("./emailService");
const { markAttestationAsSent } = await import("./gestionAttestationsDb"); const { markAttestationAsSent } = await import("./gestionAttestationsDb");
const { enregistrerEnvoiAttestation } = await import("./attestationsDb");
try {
// Envoyer l'email // Envoyer l'email
await sendAttestationEmail({ await sendAttestationEmail({
to: input.apprenantEmail, to: input.apprenantEmail,
@@ -2548,7 +2552,26 @@ export const appRouter = router({
// Marquer comme envoyé // Marquer comme envoyé
await markAttestationAsSent(input.attestationId); await markAttestationAsSent(input.attestationId);
// Enregistrer dans l'historique
await enregistrerEnvoiAttestation({
sequenceId: input.sequenceId,
apprenantId: input.apprenantId,
statut: "envoye",
urlAttestation: input.pdfUrl,
});
return { success: true }; 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;
}
}), }),
}), }),

View File

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