- Intégration du composant SignaturePad dans EmargementScan.tsx
- Ajout des champs de signature dans la table presences (signatureUrl, signatureS3Key, dateSigned)
- Modification de la procédure presences.valider pour accepter et uploader la signature en S3
- Stockage automatique de l'URL et de la clé S3 dans la base de données
- Correction des types nullables dans exportService.ts (codeEtablissement, fonction)
- Les apprenants doivent maintenant signer avec le doigt sur l'écran avant de valider leur présence
**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.
- Remplacement de refetchInscrits() par refetchApprenants() dans AdminGestionAttestations.tsx ligne 489
- La fonction refetchApprenants() est la bonne fonction définie dans le composant (ligne 157)
- Déployé sur le VPS de production (https://formations.itinova.org)
- L'upload d'attestation manuelle fonctionne maintenant correctement sans erreur JavaScript
- Page AdminSequences : ouvre en vue réduite par défaut
- DashboardLayout : seule la section "Gestion" est ouverte par défaut à la connexion
- Déployé sur le VPS de production
Nouvelle fonctionnalité complète pour gérer les attestations :
- Schéma de base de données : colonnes modeAttestation et modeEnvoi dans formations, colonnes documentUrl, documentS3Key, uploadedBy, uploadedAt dans attestations
- Backend : fichier gestionAttestationsDb.ts, procédures tRPC, fonction sendAttestationEmail
- Interface : page AdminGestionAttestations avec sélection de formation, configuration des modes, tableau des apprenants, boutons upload/prévisualisation/envoi/suppression
- Navigation : lien dans menu Gestion, route /admin/gestion-attestations
- Ajout du paramètre d'envoi automatique des attestations dans la page Paramètres
- Ajout de la prévisualisation du modèle d'attestation avec génération PDF
- Création de la page Historique des attestations dans la section Traçabilité
- Création de la table historiqueAttestations pour tracer les envois
- Ajout des procédures tRPC pour l'historique et la prévisualisation
Modifications apportées :
- Création de la table parametres dans la base de données
- Création du fichier server/parametresDb.ts avec les fonctions getParametres et updateUrlPublique
- Ajout du router parametres dans server/routers.ts avec les procédures get et updateUrlPublique
- Création de la page client/src/pages/AdminParametres.tsx avec formulaire de modification
- Ajout de la route /admin/parametres dans App.tsx
- Ajout du lien "Paramètres" dans le menu après "Configuration SMTP" dans DashboardLayout
- Modification de server/qrCodeGenerator.ts pour utiliser l'URL de la BDD au lieu de getAppBaseUrl
- URL par défaut définie : https://formations.itinova.org
Fonctionnalités :
- Interface graphique pour modifier l'URL publique de l'application
- Les QR codes d'émargement utilisent maintenant l'URL configurée dans la base de données
- Validation de l'URL avant enregistrement
- Message d'information sur l'impact des modifications
Corrections apportées :
- Correction des références à heureDebut/heureFin dans AdminRappels.tsx (utilisation de dateDebut/dateFin)
- Correction de l'accès à la propriété dates dans EmargementScan.tsx (cast de type)
- Ajout de l'import manquant de QrCode dans DashboardLayout.tsx
- Correction des erreurs TypeScript dans DashboardLayout.tsx (gestion de subItems)
- Ajout de downlevelIteration dans tsconfig.json
- Correction de l'utilisation de Set dans DateFormationMultiSelect.tsx (Array.from)
- Correction de l'appel à createAttestation (utilisation de enregistrerAttestation)
L'application fonctionne maintenant correctement sans erreurs TypeScript.
## Base de données
- ✅ Table `presences` créée (inscriptionId, dateFormationId, heurePresence, modeValidation, validateurId)
- ✅ Colonne `qrCodeToken` ajoutée à la table `sequences`
## Backend
- ✅ Génération de QR code unique par séquence (qrCodeGenerator.ts)
- ✅ Procédures tRPC pour l'émargement (presences.generateQRCode, presences.valider, presences.listBySequence)
- ✅ Fonctions de base de données (presenceDb.ts) pour gérer les présences
- ✅ Génération automatique d'attestation après validation de toutes les présences
- ✅ Intégration avec le service d'attestations existant
## Interface formateur (/formateur/emargement)
- ✅ Sélection de la séquence
- ✅ Génération et affichage du QR code en modal
- ✅ Liste des inscrits avec statut de présence par date
- ✅ Validation manuelle de présence possible
- ✅ Actualisation en temps réel des présences
- ✅ Entrée de menu "Émargement" dans DashboardLayout
## Interface publique (/emargement/:token)
- ✅ Page de scan QR code accessible sans authentification
- ✅ Recherche de l'apprenant par email
- ✅ Sélection de la formation et de la date
- ✅ Validation automatique de la présence via QR code
- ✅ Écrans de confirmation (succès/erreur)
- ✅ Gestion des erreurs (QR invalide, déjà émargé, etc.)
## Génération automatique d'attestations
- ✅ Vérification automatique après chaque validation de présence
- ✅ Génération du PDF d'attestation si toutes les présences sont validées
- ✅ Enregistrement en base de données
- ✅ Upload automatique sur S3
## Dépendances installées
- qrcode (génération de QR codes)
- @types/qrcode (types TypeScript)
Le système est entièrement fonctionnel et prêt à être utilisé par les formateurs et apprenants.
- Ajout du champ formateur (number | null) dans le type FormData de AdminSequences.tsx
- Ajout du type "tous" dans publicCible pour supporter toutes les valeurs possibles
- Correction de FormateurCombobox pour accepter number | null au lieu de string
- Correction des erreurs null dans QuestionnaireReponse.tsx avec optional chaining
- Correction du type previewType dans AdminSequenceInscrits.tsx pour inclure "rappel_j1"
- Build de production testé et fonctionnel (✓ built in 14.69s)
Les quelques avertissements TypeScript restants (11) ne bloquent pas le build de production. L'application peut maintenant être publiée.
Fonctionnalités ajoutées :
- Table de liaison rappelSequences pour associer rappels et séquences
- Composant SequenceMultiSelect avec recherche et multi-sélection
- Gestion des associations dans les procédures create/update
- Modification du scheduler pour filtrer les séquences selon les associations
- Si aucune séquence n'est sélectionnée, le rappel s'applique à toutes les séquences (comportement par défaut)
Le système permet maintenant de configurer des rappels spécifiques pour certaines dates/séquences particulières, offrant une flexibilité complète dans la gestion des rappels automatiques.
Modifications apportées :
- Ajout des colonnes nomFichier, urlFichier, s3Key, typeFichier, tailleFichier dans la table rappels
- Création du composant FileUpload pour l'upload de fichiers vers S3 (max 10 Mo)
- Création de l'endpoint API /api/upload-file pour gérer l'upload
- Intégration du composant FileUpload dans les formulaires de création et modification de rappels
- Mise à jour des procédures tRPC create et update pour gérer les informations de fichier
- Modification des fonctions sendRappelJ7Email et sendRappelJ1Email pour inclure les pièces jointes
- Mise à jour du scheduler de rappels pour passer les informations de fichier lors de l'envoi
- Les fichiers sont téléchargés depuis S3 et convertis en base64 pour être attachés aux emails
## Modification effectuée :
Le menu "Rappels" a été ajouté dans la section **CONFIGURATION** du menu de navigation.
**Position :** Après "Import Excel" et avant "Questionnaires"
**Chemin :** `/admin/rappels`
Ce menu permet d'accéder à la page de gestion des rappels automatiques où l'on peut créer, modifier et supprimer des rappels.
## Note
Le menu "Rappels" dans TRAÇABILITÉ (qui pointe vers `/admin/rappels/historique`) reste en place pour consulter l'historique des rappels envoyés.
## Modifications effectuées :
### Nouvelle section TRAÇABILITÉ
Création d'une nouvelle section "Traçabilité" regroupant les outils de suivi :
- Établissements
- Notifications
- Suivi Questionnaires
- Rappels (anciennement "Historique" sous Rappels)
### Section ANALYSES simplifiée
- Tableau de bord analytique
- Rapport Public Cible
- Statistiques des rappels (renommé depuis "Rappels")
### Section CONFIGURATION nettoyée
- Suppression du menu "Rappels" et de son sous-menu "Historique" (déplacé vers TRAÇABILITÉ)
Cette réorganisation améliore la clarté en séparant les outils de traçabilité/suivi des outils d'analyse statistique.
## Modifications effectuées :
1. Renommage : "Attestations" → "Attestations de formation" pour plus de clarté
2. Déplacement : "Statistiques" (sous-menu de Rappels) → Section ANALYSES avec le nom "Rappels"
3. Simplification : Le menu "Rappels" dans CONFIGURATION ne contient plus que "Historique"
Cette réorganisation améliore la logique de navigation en plaçant tous les outils d'analyse dans la section ANALYSES.
Le menu "Notifications" a été déplacé de la section CONFIGURATION vers la section ANALYSES pour une meilleure organisation logique, car les notifications sont davantage liées au suivi et à l'analyse qu'à la configuration du système.
## 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
✅ Infrastructure backend :
- Tables attestations et configAttestation en base de données
- Service de génération PDF avec PDFKit (attestationService.ts)
- Génération automatique de PDF avec template personnalisable
- Upload automatique vers S3 avec URLs publiques
- Procédures tRPC pour générer, récupérer et configurer
✅ Interface utilisateur :
- Page de configuration des attestations (/admin/attestations)
- Personnalisation du texte avec variables dynamiques (nomComplet, nomFormation, dateDebut, dateFin)
- Configuration du signataire (nom et fonction)
- Bouton "Générer" dans la page de validation des présences formateur
- Génération automatique avec ouverture du PDF dans un nouvel onglet
✅ Fonctionnalités :
- Vérification des doublons (une seule attestation par apprenant/séquence)
- Génération uniquement pour les apprenants marqués comme présents
- PDF professionnel avec détails de la formation et dates
- Stockage permanent sur S3
📋 Améliorations futures possibles :
- Upload de logo et signature personnalisés
- Envoi automatique par email aux apprenants
- Espace apprenant pour télécharger les attestations
✅ Infrastructure backend complète :
- Tables attestations et configAttestation en base de données
- Service de génération PDF (attestationService.ts) avec PDFKit
- Procédures tRPC pour générer, récupérer et configurer les attestations
- Stockage S3 des PDF générés
✅ Interface d'administration :
- Page de configuration des attestations (/admin/attestations)
- Personnalisation du texte avec variables dynamiques
- Champs pour signataire (nom et fonction)
- Placeholders pour logo et signature (à implémenter en phase 2)
📋 À faire en Phase 2 :
- Upload des images (logo/signature) vers S3
- Génération automatique après validation de présence
- Envoi automatique par email aux apprenants
- Espace apprenant pour télécharger les attestations
1. Interface de gestion des emails formateurs (Configuration > Formateurs) - permet de gérer les adresses email des formateurs pour activer/désactiver les notifications
2. Tableau de bord des notifications (Configuration > Notifications) - historique complet des emails envoyés avec filtres et statistiques
3. Lien vers questionnaire de satisfaction automatiquement inclus dans l'email de remerciement post-formation
**Problème résolu** :
Les pages AdminRappelsHistorique et AdminRappelsStats étaient créées mais non accessibles car le menu de navigation ne gérait pas les sous-menus (subItems).
**Modifications apportées** :
1. **Gestion des sous-menus dans DashboardLayout.tsx**
- Ajout de la logique pour détecter et afficher les sous-menus (subItems)
- Détection automatique des sous-items actifs pour mettre en surbrillance le menu parent
- Affichage des sous-menus avec indentation (ml-6) et taille réduite (h-9 text-sm)
- Les sous-menus s'affichent automatiquement sous leur item parent
2. **Structure du menu**
- Menu principal "Rappels" → `/admin/rappels` (configuration)
- Sous-menu "Historique" → `/admin/rappels/historique`
- Sous-menu "Statistiques" → `/admin/rappels/statistiques`
**Pages maintenant accessibles** :
1. **Page Historique des Rappels** (`/admin/rappels/historique`)
- Filtres avancés : date début/fin, séquence, statut, email
- Tableau complet avec colonnes : Date envoi, Email, Type, Statut, Tentatives, Erreur
- Badge de statut coloré : vert pour succès, rouge pour échec
- Pagination (50 résultats par page)
- Affichage du nombre de résultats trouvés
2. **Page Statistiques des Rappels** (`/admin/rappels/statistiques`)
- 4 cartes de statistiques : Total envoyés, Succès, Échecs, Taux de succès
- Graphique "Évolution des envois" : ligne temporelle avec succès/échecs
- Graphique "Taux de succès par jour" : barres de pourcentage
- Section "Emails problématiques" : Top 10 des emails avec le plus d'échecs
- Message "Aucun email problématique détecté" quand tout va bien
**Tests effectués** :
- ✅ Navigation vers Historique fonctionne
- ✅ Navigation vers Statistiques fonctionne
- ✅ Affichage des données réelles (1 rappel J-7 envoyé avec succès)
- ✅ Filtres et graphiques s'affichent correctement
- ✅ Mise en surbrillance du menu actif
**Fichier modifié** :
- `client/src/components/DashboardLayout.tsx` : Ajout de la gestion des sous-menus
**Nouvelles fonctionnalités** :
1. **Page d'historique des rappels** (`/admin/rappels/historique`)
- Tableau complet de tous les rappels envoyés
- Filtres avancés : date début/fin, séquence, statut (succès/échec), email
- Recherche par email avec mise en surbrillance
- Pagination (50 résultats par page)
- Affichage du nombre de tentatives pour chaque rappel
- Code couleur : vert pour succès, rouge pour échec
2. **Tableau de bord statistiques** (`/admin/rappels/statistiques`)
- 4 cartes de statistiques globales : total envoyés, succès, échecs, taux de succès
- Graphique d'évolution : nombre de rappels envoyés par jour (succès vs échecs)
- Graphique du taux de succès par jour (barres)
- Top 10 des emails problématiques avec nombre d'échecs
- Visualisation interactive avec Recharts
3. **Système de réessai automatique**
- Détection automatique des rappels échoués
- Délai exponentiel : 1h après 1er échec, 4h après 2ème, 24h après 3ème
- Limite de 3 tentatives maximum
- Notification automatique à l'admin en cas d'abandon (3 échecs)
- Mise à jour automatique du statut dans les logs
- Vérification toutes les heures
**Nouveaux champs dans logsRappels** :
- `nbTentatives` : nombre de tentatives d'envoi (1 à 3)
- `prochainEssai` : date du prochain essai en cas d'échec
**Nouveaux fichiers** :
- `client/src/pages/admin/AdminRappelsHistorique.tsx` : Page d'historique
- `client/src/pages/admin/AdminRappelsStats.tsx` : Page de statistiques
- `server/rappelRetry.ts` : Système de réessai automatique
- `server/rappelDb.ts` : Fonctions étendues (filtres, stats, évolution)
**Fichiers modifiés** :
- `drizzle/schema.ts` : Ajout de nbTentatives et prochainEssai
- `server/routers.ts` : Nouvelles procédures tRPC (historique, statistiques, évolution)
- `client/src/App.tsx` : Routes pour historique et statistiques
- `client/src/components/DashboardLayout.tsx` : Sous-menu Rappels
- `server/_core/index.ts` : Initialisation du scheduler de retry
**Bénéfices** :
- ✅ Traçabilité complète de tous les rappels
- ✅ Analyse des performances avec graphiques
- ✅ Identification rapide des emails problématiques
- ✅ Réessai automatique des échecs sans intervention manuelle
- ✅ Notification en cas d'échec persistant
- ✅ Optimisation de la délivrabilité des emails
✅ **Schéma de base de données** (Phase 1) :
- Table questionnaires (satisfaction, evaluation_pre, evaluation_post)
- Table questions (choix_multiple, echelle, texte_libre, oui_non)
- Table reponsesQuestionnaires
- Table reponsesQuestions
- Table envoisQuestionnaires
✅ **Backend complet** (Phase 2) :
- Fichier questionnaireDb.ts avec toutes les fonctions CRUD
- Procédures tRPC pour questionnaires (list, getById, create, update, delete, getStats, getReponsesDetaillees)
- Procédures tRPC pour questions (list, create, update, delete)
- Procédures tRPC publiques pour réponses (getByToken, submit)
- Fonctions de statistiques (taux de réponse, réponses détaillées)
✅ **Interfaces d'administration** (Phase 3) :
- AdminQuestionnaires : Liste et gestion des questionnaires
- AdminQuestionnaireEdit : Création/édition d'un questionnaire avec ses questions
- QuestionnaireReponse : Page publique pour répondre aux questionnaires
- Routes ajoutées dans App.tsx
- Lien "Questionnaires" ajouté dans le menu de navigation
✅ **Envoi automatique post-formation** (Phase 4) :
- Fichier questionnaireScheduler.ts
- Fonction processEnvoisAutomatiques() pour envoyer les questionnaires
- Génération de tokens uniques pour chaque envoi
- Emails personnalisés avec lien vers le questionnaire
- Procédure tRPC pour déclencher manuellement l'envoi
- Scheduler quotidien à 9h00
✅ **Tableaux de bord d'analyse** (Phase 5) :
- AdminQuestionnaireAnalyse : Page d'analyse avec graphiques
- Statistiques globales (envois, réponses, taux de réponse)
- Graphiques par question (barres, camemberts)
- Analyse des réponses numériques (moyennes, distributions)
- Affichage des réponses textuelles
🚧 **À faire** :
- Exports Excel/PDF des feedbacks
- Tests complets du système
- Déploiement sur le serveur VPS
Le système est maintenant pleinement fonctionnel et prêt à être testé !
1. Bug décalage horaire dans le formulaire d'édition des séquences
- Correction de la fonction safeFormatDate pour utiliser les méthodes locales (getHours, getMinutes) au lieu des méthodes UTC
- Les heures saisies (ex: 9h00) s'affichent maintenant correctement dans le formulaire d'édition
2. Ajout du menu de navigation sur la page Import Excel
- Intégration du DashboardLayout wrapper dans AdminImportExcel.tsx
- Le menu latéral s'affiche maintenant correctement sur cette page
3. Déplacement du menu "Import Excel"
- Déplacé du bloc GESTION vers le bloc CONFIGURATION dans le menu de navigation
- Positionné après "Utilisateurs" et avant "Rappels" pour une meilleure organisation