Checkpoint: Affichage unifié des formateurs dans la page Utilisateurs

## Modifications effectuées :

### Backend (server/routers.ts)
- Ajout de la procédure `users.listWithFormateurs` qui retourne :
  * Tous les utilisateurs
  * Tous les formateurs avec leur statut de compte (hasAccount, user)
- Cette procédure combine les données des tables `users` et `formateurs`

### Frontend (client/src/pages/AdminUsers.tsx)
- Remplacement de `users.list` par `users.listWithFormateurs`
- Ajout d'une section dédiée "Formateurs sans compte utilisateur" affichée en haut de la page
- Cette section liste tous les formateurs qui n'ont pas encore de compte utilisateur
- Bouton "Créer un compte" pour chaque formateur qui :
  * Pré-remplit le formulaire avec les données du formateur (nom, email)
  * Lie automatiquement le `formateurId`
  * Définit le rôle sur "formateur"

## Résultat
Les formateurs existants dans la table `formateurs` sont maintenant visibles dans la page Utilisateurs. L'administrateur peut facilement créer un compte pour chaque formateur en un clic, ce qui lie automatiquement le compte au formateur existant.
This commit is contained in:
Manus
2026-01-08 03:44:41 -05:00
parent 5367c7ea7a
commit 6184dff68f
3 changed files with 82 additions and 2 deletions

View File

@@ -894,6 +894,38 @@ export const appRouter = router({
return db.getAllUsers();
}),
listWithFormateurs: adminProcedure.query(async () => {
const dbInstance = await import("./db").then(m => m.getDb());
if (!dbInstance) throw new Error("Base de données non disponible");
const { formateurs, users } = await import("../drizzle/schema");
const { eq } = await import("drizzle-orm");
// Récupérer tous les formateurs
const allFormateurs = await dbInstance.select().from(formateurs);
// Récupérer tous les utilisateurs
const allUsers = await dbInstance.select().from(users);
// Créer une map des formateurs liés à des comptes
const formateurIdToUser = new Map();
allUsers.forEach(user => {
if (user.formateurId) {
formateurIdToUser.set(user.formateurId, user);
}
});
// Combiner les données
return {
users: allUsers,
formateurs: allFormateurs.map(formateur => ({
...formateur,
hasAccount: formateurIdToUser.has(formateur.id),
user: formateurIdToUser.get(formateur.id) || null,
})),
};
}),
getById: adminProcedure.input(z.object({ id: z.number() })).query(async ({ input }) => {
return db.getUserById(input.id);
}),