Checkpoint: Ajout de la fonctionnalité "Détail par apprenant"

 Nouvelle procédure tRPC `apprenants.getInscriptions` pour récupérer toutes les inscriptions d'un apprenant avec les détails de formation et séquence
 Nouvelle page AdminApprenantDetail (/admin/apprenants/:id) affichant :
   - Informations personnelles de l'apprenant (nom, prénom, email, code établissement, fonction)
   - Tableau complet de toutes ses inscriptions avec :
     * Nom de la formation
     * Nom de la séquence
     * Toutes les dates de la séquence
     * Lieu
     * Public cible
     * Date d'inscription
     * Statut (avec badge coloré : vert pour confirmée, gris pour en attente, rouge pour annulée)
 Bouton "Détail" (icône œil) ajouté dans la colonne Actions de la page AdminApprenants
 Route /admin/apprenants/:id configurée dans App.tsx
 Bouton "Retour aux apprenants" pour navigation facile

Correction appliquée : La procédure getInscriptions extrait maintenant correctement l'objet inscription du résultat retourné par getInscriptionsByApprenant.

Tests réussis : Affichage correct des inscriptions pour l'apprenant "Nouveau Apprenant" (1 inscription à la séquence "Groupe A" avec statut confirmée).
This commit is contained in:
Manus Sandbox
2025-11-20 11:00:53 -05:00
parent 017ad5dd18
commit 2975d92568
5 changed files with 233 additions and 1 deletions

View File

@@ -114,6 +114,27 @@ export const appRouter = router({
await db.deleteApprenant(input.id);
return { success: true };
}),
getInscriptions: adminProcedure.input(z.object({ id: z.number() })).query(async ({ input }) => {
const results = await db.getInscriptionsByApprenant(input.id);
// Récupérer les informations de formation et séquence pour chaque inscription
const inscriptionsAvecDetails = await Promise.all(
results.map(async (result: any) => {
const insc = result.inscription;
if (!insc) return null;
const sequence = await db.getSequenceById(insc.sequenceId);
if (!sequence) return null;
const formation = await db.getFormationById(sequence.formationId);
const dates = await db.getDatesBySequence(insc.sequenceId);
return {
...insc,
sequence: { ...sequence, dates },
formation,
};
})
);
return inscriptionsAvecDetails.filter(i => i !== null);
}),
}),
// ===== FORMATEURS =====