**Corrections d'erreurs :**
1. **Erreurs SQL DATE_FORMAT corrigées** (analyticsDb.ts) :
- Remplacement des sous-requêtes corrélées par des JOIN dans getTauxRemplissageByMonth()
- Utilisation de COUNT(CASE WHEN...) au lieu de SUM(SELECT COUNT(*))
- Ajout de leftJoin pour éviter les erreurs de sous-requêtes
2. **Erreur React "Cannot read properties of null" corrigée** (AdminRapportPublicCible.tsx) :
- Ajout de l'opérateur null-safe `?.` pour accéder à `insc.apprenant?.fonction`
- Vérification explicite si la fonction est null/undefined
- Gestion du cas "public cible = tous" qui correspond toujours
3. **Tests réussis** :
- Page rapport-public-cible : affiche correctement les statistiques et recommandations
- Tableau de bord analytique : graphiques et statistiques fonctionnels
- Page suivi questionnaires : affiche correctement les données
**Harmonisation charte graphique :**
- Application du style bleu clair (#6B9FE8) avec ombre portée à tous les titres des 32 pages
- Création de la classe CSS `.page-title` réutilisable dans index.css
- Cohérence visuelle sur toute l'application
**Résultat :**
✅ Toutes les erreurs SQL et React sont corrigées
✅ Les pages fonctionnent correctement sans erreur
✅ Charte graphique harmonisée sur toutes les pages
**Modifications apportées :**
1. **Renommage du bouton d'ajout d'apprenant** :
- Bouton renommé de "Ajouter un inscrit" à "Ajouter un apprenant"
- Titre de la boîte de dialogue mis à jour
- Description améliorée : "Sélectionnez un apprenant dans la liste ci-dessous pour l'inscrire à cette séquence. La liste affichée correspond à l'ensemble des apprenants enregistrés dans le système."
2. **Alternance de couleurs blanc/bleu clair (bg-blue-50/70)** appliquée sur tous les tableaux :
- Liste des formations (AdminFormations.tsx)
- Liste des séquences (AdminSequences.tsx)
- Liste des apprenants (AdminApprenants.tsx)
- Liste des inscrits dans la fenêtre de gestion des attestations (AdminGestionAttestations.tsx)
- Liste des utilisateurs (AdminUsers.tsx)
- Liste des formateurs (AdminFormateurs.tsx)
**Résultat :**
✅ Meilleure cohérence terminologique dans l'interface
✅ Amélioration significative de la lisibilité de tous les tableaux grâce à l'alternance de couleurs
✅ Expérience utilisateur plus fluide et professionnelle
✅ Déployé et testé avec succès sur le VPS de production (https://formations.itinova.org)
## 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.
## Authentification formateur
- Ajout du rôle "formateur" dans l'enum de la table users
- Ajout du champ formateurId pour lier un compte à un formateur
- Mise à jour de l'interface AdminUsers avec sélection du formateur
- Redirection automatique selon le rôle (admin → /admin, formateur → /formateur)
- Badges et filtres mis à jour pour inclure le rôle formateur
## Upload logo et signature
- Création du composant ImageUpload.tsx avec prévisualisation
- Création de l'endpoint /api/upload-image avec multer pour l'upload vers S3
- Intégration dans AdminAttestations.tsx
- Modification du service PDF pour inclure le logo (en haut à droite) et la signature (en bas)
- Mise à jour des procédures tRPC pour accepter logoUrl, logoS3Key, signatureUrl, signatureS3Key
Modification apportée :
- Le champ email est maintenant modifiable pour l'utilisateur adminServFormation
- Mise à jour du message dans le formulaire d'édition : "Seuls l'email et le mot de passe peuvent être modifiés pour cet utilisateur"
- Les champs nom et identifiant restent en lecture seule (grisés et désactivés)
- Les champs email, mot de passe et rôle sont modifiables pour cet utilisateur spécial
Modifications apportées :
- Création de l'utilisateur "Administrateur" avec identifiant "adminServFormation" et mot de passe "Itinova69!" (hashé avec bcrypt)
- Modification de l'interface pour désactiver le bouton de suppression pour cet utilisateur (grisé avec tooltip explicatif)
- Modification du formulaire d'édition pour rendre les champs nom, email et identifiant en lecture seule (grisés et désactivés)
- Ajout d'un message explicatif dans le formulaire : "Seul le mot de passe peut être modifié pour cet utilisateur"
- Seuls les champs "Nouveau mot de passe" et "Rôle" restent modifiables pour cet utilisateur
- L'utilisateur est identifié par son username "adminServFormation" pour appliquer les restrictions
- Cet utilisateur ne peut pas être supprimé et ses informations de base ne peuvent pas être modifiées, garantissant un accès administrateur permanent au système
Modifications apportées :
- Ajout du champ username (identifiant de connexion) dans le schéma de la base de données avec contrainte UNIQUE
- Mise à jour des procédures tRPC create et update pour gérer username et password
- Implémentation du hashage du mot de passe avec bcryptjs dans createUser et updateUser
- Ajout de la colonne "Identifiant" dans le tableau de la page de gestion des utilisateurs
- Ajout des champs "Identifiant de connexion" et "Mot de passe" dans le formulaire de création
- Ajout des champs "Identifiant de connexion" et "Nouveau mot de passe" dans le formulaire d'édition avec notes explicatives
- Les mots de passe sont hashés avant d'être stockés en base de données pour la sécurité
- Dans le formulaire d'édition, les champs username et password sont optionnels (laissez vide pour ne pas modifier)
✅ Modifications apportées :
- Remplacement de l'authentification OAuth Manus par un système local
- Ajout des champs email, password, emailVerified dans la table users
- Implémentation du hashage des mots de passe avec bcrypt
- Création des procédures auth.login et auth.register
- Mise à jour du système de context pour utiliser JWT
- Création des pages de connexion et d'inscription
- Mise à jour de la page AdminUsers pour créer des utilisateurs avec mot de passe
- Ajout de la protection des routes d'administration (vérification du rôle admin)
✅ Tests effectués :
- Connexion avec email/mot de passe ✓
- Création d'utilisateurs via l'interface d'administration ✓
- Protection des routes (seuls les admins peuvent accéder au dashboard) ✓
- Redirection automatique après connexion ✓
Note : Les fichiers OAuth Manus originaux ont été conservés pour référence mais ne sont plus utilisés.