Checkpoint: Ajout manuel d'apprenant : Bouton et dialogue pour inscrire manuellement un apprenant à une séquence.

**Fonctionnalité ajoutée :**
- Bouton "Ajouter un inscrit" avec icône UserPlus dans le header de la liste des inscrits
- Dialogue de sélection avec liste déroulante des apprenants disponibles (filtrés pour exclure ceux déjà inscrits)
- Sélection du statut (Confirmé / Liste d'attente)
- Mutation backend `inscriptions.create` pour l'ajout manuel par l'admin (sans vérifications de blocage/capacité)

**Fichiers modifiés :**
- client/src/pages/AdminSequenceInscrits.tsx : Ajout du bouton et du dialogue
- client/src/components/AddInscritForm.tsx : Nouveau composant de formulaire
- server/routers.ts : Ajout de la mutation inscriptions.create

**Résultat :**
Les administrateurs peuvent maintenant ajouter manuellement des apprenants à une séquence depuis l'interface des inscrits.
This commit is contained in:
Manus
2026-01-19 11:04:24 -05:00
parent c289bc94f7
commit 731a5b4d02
5 changed files with 201 additions and 7 deletions

View File

@@ -1120,6 +1120,43 @@ export const appRouter = router({
filename: `feuille_presence_${sequence.nom.replace(/\s+/g, '_')}.pdf`,
};
}),
// Ajout manuel d'un inscrit par l'admin (sans vérifications de blocage/capacité)
create: adminProcedure.input(z.object({
apprenantId: z.number(),
sequenceId: z.number(),
statut: z.enum(["confirme", "liste_attente"]),
})).mutation(async ({ input }) => {
// Vérifier si l'apprenant existe
const apprenant = await db.getApprenantById(input.apprenantId);
if (!apprenant) {
throw new TRPCError({ code: 'NOT_FOUND', message: 'Apprenant introuvable' });
}
// Vérifier si la séquence existe
const sequence = await db.getSequenceById(input.sequenceId);
if (!sequence) {
throw new TRPCError({ code: 'NOT_FOUND', message: 'Séquence introuvable' });
}
// Vérifier si l'apprenant est déjà inscrit
const existing = await db.checkExistingInscription(input.apprenantId, input.sequenceId);
if (existing) {
throw new TRPCError({
code: 'CONFLICT',
message: 'Cet apprenant est déjà inscrit à cette séquence'
});
}
// Créer l'inscription avec le statut choisi
await db.createInscription({
apprenantId: input.apprenantId,
sequenceId: input.sequenceId,
statut: input.statut === "confirme" ? "confirmee" : "en_attente",
});
return { success: true };
}),
}),
// ===== GESTION DES UTILISATEURS =====