From 8e20ac40dd0d27cebc94bfeb987d7e1f77292b1c Mon Sep 17 00:00:00 2001 From: Manus Date: Sun, 25 Jan 2026 09:06:36 -0500 Subject: [PATCH] =?UTF-8?q?Checkpoint:=20Correction=20finale=20de=20l'affi?= =?UTF-8?q?chage=20vide=20des=20apprenants=20dans=20la=20gestion=20des=20a?= =?UTF-8?q?ttestations.=20Probl=C3=A8me=20r=C3=A9solu=20en=20aplatissant?= =?UTF-8?q?=20la=20structure=20de=20la=20requ=C3=AAte=20Drizzle=20ORM=20(s?= =?UTF-8?q?tructure=20imbriqu=C3=A9e=20non=20support=C3=A9e)=20et=20en=20r?= =?UTF-8?q?estructurant=20les=20r=C3=A9sultats=20c=C3=B4t=C3=A9=20serveur.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gestionAttestationsDb.ts | 60 +++++++++++++++++++++------------ todo.md | 5 +-- 2 files changed, 42 insertions(+), 23 deletions(-) diff --git a/server/gestionAttestationsDb.ts b/server/gestionAttestationsDb.ts index 22c2a8a..4f4a471 100644 --- a/server/gestionAttestationsDb.ts +++ b/server/gestionAttestationsDb.ts @@ -161,26 +161,22 @@ export async function getApprenantsWithAttestationStatus(formationId: number) { const results = await db .select({ - apprenant: { - id: apprenants.id, - nom: apprenants.nom, - prenom: apprenants.prenom, - email: apprenants.email, - }, - inscription: { - id: inscriptions.id, - sequenceId: inscriptions.sequenceId, - }, - sequence: { - id: sequences.id, - nom: sequences.nom, - }, - attestation: { - id: attestations.id, - documentUrl: attestations.documentUrl, - emailEnvoye: attestations.emailEnvoye, - dateEnvoiEmail: attestations.dateEnvoiEmail, - }, + // Apprenant + apprenantId: apprenants.id, + apprenantNom: apprenants.nom, + apprenantPrenom: apprenants.prenom, + apprenantEmail: apprenants.email, + // Inscription + inscriptionId: inscriptions.id, + inscriptionSequenceId: inscriptions.sequenceId, + // Sequence + sequenceId: sequences.id, + sequenceNom: sequences.nom, + // Attestation + attestationId: attestations.id, + attestationDocumentUrl: attestations.documentUrl, + attestationEmailEnvoye: attestations.emailEnvoye, + attestationDateEnvoiEmail: attestations.dateEnvoiEmail, }) .from(inscriptions) .innerJoin(apprenants, eq(inscriptions.apprenantId, apprenants.id)) @@ -194,7 +190,29 @@ export async function getApprenantsWithAttestationStatus(formationId: number) { ) .orderBy(apprenants.nom, apprenants.prenom); - return results; + // Restructurer les résultats au format attendu + return results.map(r => ({ + apprenant: { + id: r.apprenantId, + nom: r.apprenantNom, + prenom: r.apprenantPrenom, + email: r.apprenantEmail, + }, + inscription: { + id: r.inscriptionId, + sequenceId: r.inscriptionSequenceId, + }, + sequence: { + id: r.sequenceId, + nom: r.sequenceNom, + }, + attestation: r.attestationId ? { + id: r.attestationId, + documentUrl: r.attestationDocumentUrl, + emailEnvoye: r.attestationEmailEnvoye, + dateEnvoiEmail: r.attestationDateEnvoiEmail, + } : null, + })); } /** diff --git a/todo.md b/todo.md index 96f9dd1..5f2803e 100644 --- a/todo.md +++ b/todo.md @@ -1282,6 +1282,7 @@ ## Corriger l'affichage vide de la liste des apprenants après le tri chronologique -- [x] Identifier la cause du problème (champ premiereDate inexistant) -- [x] Corriger le code de regroupement/tri (utiliser l'ID de séquence) +- [x] Identifier la cause du problème (structure imbriquée Drizzle ORM) +- [x] Corriger le code backend (aplatir la structure de la requête) +- [x] Corriger le code frontend (utiliser l'ID de séquence pour le tri) - [ ] Déployer sur le VPS