diff --git a/client/src/pages/AdminUsers.tsx b/client/src/pages/AdminUsers.tsx index fccb7e2..79d4129 100644 --- a/client/src/pages/AdminUsers.tsx +++ b/client/src/pages/AdminUsers.tsx @@ -58,8 +58,9 @@ export default function AdminUsers() { formateurId: undefined as number | undefined, }); - const { data: users = [], refetch } = trpc.users.list.useQuery(); - const { data: formateurs = [] } = trpc.formateurs.list.useQuery(); + const { data: usersData, refetch } = trpc.users.listWithFormateurs.useQuery(); + const users = usersData?.users || []; + const formateurs = usersData?.formateurs || []; const createMutation = trpc.users.create.useMutation({ onSuccess: () => { @@ -295,6 +296,46 @@ export default function AdminUsers() { + {/* Formateurs sans compte */} + {formateurs.filter(f => !f.hasAccount).length > 0 && ( +
+

+ Formateurs sans compte utilisateur ({formateurs.filter(f => !f.hasAccount).length}) +

+

+ Ces formateurs existent dans le système mais n'ont pas de compte utilisateur. Créez un compte pour leur permettre de se connecter. +

+
+ {formateurs.filter(f => !f.hasAccount).map((formateur) => ( +
+
+

{formateur.nom}

+

{formateur.email || "Pas d'email"}

+
+ +
+ ))} +
+
+ )} + {/* Compteur de résultats */}

diff --git a/server/routers.ts b/server/routers.ts index 5a4758e..27bc23a 100644 --- a/server/routers.ts +++ b/server/routers.ts @@ -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); }), diff --git a/todo.md b/todo.md index 46add70..7e55900 100644 --- a/todo.md +++ b/todo.md @@ -486,3 +486,10 @@ - [x] Retirer le bouton de création de formateur de la page Formateurs - [x] Supprimer le dialogue de création et les mutations associées - [x] Ajouter un message explicatif indiquant que la création se fait via la page Utilisateurs + +## Liaison formateurs existants avec utilisateurs +- [x] Analyser les formateurs existants dans la table formateurs +- [x] Créer une procédure listWithFormateurs pour afficher tous les formateurs +- [x] Afficher les formateurs sans compte dans une section dédiée +- [x] Ajouter un bouton "Créer un compte" qui pré-remplit le formulaire +- [x] Lier automatiquement le formateurId lors de la création