- Amélioration du feedback visuel lors du chargement des attestations (affichage immédiat du nom de fichier)
- Ergonomie unifiée pour tous les uploads de fichiers (composant FileUpload)
- Réorganisation de la modal des rappels (largeur optimisée, disposition horizontale)
- Modification de la feuille de présence (signatures formateur matin/après-midi sans date)
- Permissions de gestion des attestations pour formateurs et super-formateurs
- Rafraîchissement automatique de la page d'émargement numérique (30 secondes)
- Indicateur visuel de rafraîchissement "Mis à jour il y a X secondes"
- Vérification empêchant l'émargement avant la date de formation
Toutes les modifications sont déployées sur le VPS de production.
🐛 Problème identifié :
- Le code utilisait `dateInfo.ordre` (1, 2, 3...) pour chercher les présences
- Mais les présences sont indexées par `dateFormationId` (ID réel de la date en base)
- Résultat : aucune correspondance trouvée, signatures non affichées
✅ Corrections apportées :
- Ajout du champ `id` dans l'interface `FeuillePresenceInfo` (exportService.ts)
- Modification de la logique de recherche : `dateInfo.ordre` → `dateInfo.id` (ligne 228)
- Ajout de l'ID dans le mapping des dates (routers.ts, ligne 1178)
- Déploiement sur VPS (98.71.216.234)
- Application redémarrée avec PM2
📋 Fonctionnement corrigé :
- Les dates incluent maintenant leur ID réel de la base de données
- La recherche des présences utilise cet ID pour la correspondance
- Les signatures sont chargées et affichées dans les bonnes colonnes du PDF
🔍 Test requis :
- Exporter une feuille de présence pour une séquence avec signatures
- Vérifier que les signatures apparaissent dans le PDF généré
✅ Déploiement effectué :
- Fichiers copiés sur le VPS (98.71.216.234)
* server/exportService.ts
* server/routers.ts
- Application redémarrée avec PM2 (formation-manager)
- Vérification des logs : application en ligne et fonctionnelle
- URL de production : https://formations.itinova.org📋 Fonctionnalités déployées :
- Export PDF avec signatures tactiles intégrées
- Chargement automatique des images depuis uploads/signatures/
- Affichage dans les colonnes Matin/Après-midi du tableau
- Gestion des cas sans signature (cellule vide)
🔍 Tests requis :
- Tester l'export de feuille de présence sur une séquence avec présences signées
- Vérifier la qualité et la taille des signatures dans le PDF généré
- Valider que les signatures correspondent aux bonnes dates/périodes
✅ Modifications implémentées :
- Interface ApprenantPresence étendue pour inclure les présences avec signatures
- Fonction generateFeuillePresence modifiée pour charger et afficher les images de signatures
- Hook didDrawCell ajouté pour insérer les images dans les cellules du tableau PDF
- Procédure exportFeuillePresence modifiée pour récupérer toutes les présences avec signatures
- Signatures chargées depuis le système de fichiers local (uploads/signatures/)
- Gestion automatique des cas où la signature n'existe pas (cellule vide)
- Hauteur des cellules augmentée (minCellHeight: 15) pour accommoder les signatures
📋 Fonctionnement :
- Lors de l'export PDF, le système récupère toutes les présences de la séquence
- Pour chaque apprenant, les signatures sont associées à leurs dates respectives
- Les images PNG sont chargées depuis le disque et converties en base64
- Les signatures sont insérées dans les colonnes Matin/Après-midi correspondantes
- Si aucune signature n'existe, la cellule reste vide pour signature manuscrite
🔧 Technique :
- Utilisation de jsPDF avec jspdf-autotable
- Chargement des images avec fs.readFileSync
- Conversion en data URL base64 pour insertion dans le PDF
- Gestion des erreurs avec console.warn si fichier manquant
✅ Fonctionnalités implémentées :
- Signature tactile obligatoire lors de l'émargement via QR code sur smartphone
- Stockage des signatures en local dans uploads/signatures/[formation-id]-[sequence-id]/
- Affichage des informations de validation dans l'interface formateur : "Prénom Nom a validé(e) le [date et heure]"
- Icône cliquable pour visualiser la signature en grand format dans une modale
- Correction du bug Drizzle ORM avec sql.raw() pour les colonnes de signature
✅ Corrections techniques :
- Retrait des logs de debug de routers.ts
- Utilisation de sql.raw() au lieu de l'accès direct aux colonnes dans presenceDb.ts
- Gestion robuste des signatures nulles dans l'affichage
✅ Déploiement :
- Système testé et fonctionnel sur le VPS (formations.itinova.org)
- Signatures stockées localement (S3 abandonné pour problème DNS avec forge.manus.im)
📝 Améliorations futures possibles :
- Intégration des signatures dans les exports PDF des feuilles de présence
- Configuration Nginx pour servir /uploads/signatures/ avec les bons headers
- Validation de signature (nombre minimum de traits, taille minimale)
- Historique/audit trail des signatures
- Ajout des champs signatureUrl, signatureS3Key et dateSigned dans getPresencesBySequence
- L'icône de signature s'affiche maintenant correctement quand une signature existe
- Format modifié : "Prénom Nom a validé(e) le date et heure"
- Icône de signature agrandie (h-5 w-5) et plus visible avec hover bleu
- Ajout d'un title "Voir la signature" sur l'icône
- Espacement amélioré (ml-3)
- Ajout des champs signatureUrl, signatureS3Key et dateSigned dans getPresencesByInscription
- Affichage du nom du signataire, date/heure de validation à côté de chaque puce matin/après-midi
- Icône cliquable pour visualiser la signature en grand format
- Modale Dialog pour afficher la signature manuscrite
- Fonction getPresenceInfo pour récupérer les détails de présence
- Interface moderne avec icône de stylo SVG pour les signatures
- Remplacement de storagePut par fs.writeFileSync dans routers.ts
- Structure de dossiers : uploads/signatures/[formation-id]-[sequence-id]/
- Noms de fichiers uniques avec crypto.randomBytes
- URLs publiques relatives : /uploads/signatures/[formation-id]-[sequence-id]/[fichier].png
- Correction de l'erreur "fetch failed" causée par l'inaccessibilité de forge.manus.im sur le VPS
- 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
- Affichage correct de la liste des apprenants par séquence
- Date de début affichée dans l'en-tête de chaque séquence
- Tri chronologique des séquences par date de début
- Filtre fonctionnel : Toutes les séquences / Séquences terminées / Séquences à venir
- Badge de statut visuel (Terminée en vert, À venir en orange)
- Compteur d'envois par séquence
- Bouton "Tout renvoyer" pour envoi groupé par séquence
- Les données sont maintenant correctement récupérées et affichées
- Affichage de la date de début dans l'en-tête de chaque séquence
- Tri chronologique des séquences par date de début
- Filtre fonctionnel : Toutes les séquences / Séquences terminées / Séquences à venir
- Badge de statut visuel (Terminée en vert, À venir en orange)
- Compteur d'envois par séquence
- Bouton "Tout renvoyer" pour envoi groupé par séquence
- Correction robuste de l'affichage des apprenants