Commit Graph

149 Commits

Author SHA1 Message Date
Manus
4b407b9c83 Checkpoint: Système complet de monitoring Fail2Ban déployé avec succès. Tableau de bord admin affichant en temps réel les IPs bannies, statistiques d'attaques, et historique des bannissements. Fonctionnalité de débannissement manuel d'IPs. Système d'alertes email automatiques configuré : envoie une notification au propriétaire lorsque plus de 10 IPs sont bannies en 1 heure. Vérification toutes les 15 minutes. Déployé et testé sur le VPS de production avec logs confirmant l'initialisation correcte. 2026-01-18 13:26:55 -05:00
Manus
47662ea545 Checkpoint: Augmentation de la tolérance du scheduler de rappels de 20 à 30 minutes pour couvrir 2 cycles de vérification (intervalle de 15 minutes). Cela permet de capturer les rappels même si le serveur a redémarré ou si le scheduler a manqué un cycle. Par exemple, un rappel configuré à 15h03 sera maintenant envoyé même si le scheduler vérifie à 15h15 ou 15h30. 2026-01-18 09:17:21 -05:00
Manus
a3fd588fb8 Checkpoint: Correction critique du scheduler de rappels automatiques qui ne trouvait aucune date de formation. Le problème venait de l'utilisation de rappel.dateFormationIds (colonne inexistante) au lieu de la table de liaison rappelDates, et de l'utilisation de rappel.heure au lieu de rappel.heureEnvoi. Le scheduler utilise maintenant correctement la table rappelDates pour récupérer les dates de formation associées à chaque rappel et vérifie l'heure configurée avec une tolérance de 20 minutes toutes les 15 minutes. 2026-01-18 08:55:38 -05:00
Manus
2c0f379c52 Checkpoint: Ajout d'un bouton "Tout renvoyer" dans la page de gestion des attestations pour envoyer en masse toutes les attestations d'une formation. Création de la procédure backend sendAllAttestations qui envoie toutes les attestations disponibles et enregistre chaque envoi dans l'historique. Correction du scheduler de rappels pour vérifier l'heure configurée (intervalle 15 min au lieu de 1h). 2026-01-18 08:39:13 -05:00
Manus
6c4ca249a9 Checkpoint: Correction du système d'envoi automatique des rappels :
1. Ajout de la vérification de l'heure configurée avant l'envoi (tolérance de 20 minutes)
2. Réduction de l'intervalle du scheduler de 1 heure à 15 minutes pour plus de précision
3. Ajout de logs détaillés pour le débogage
4. Les rappels sont maintenant envoyés à l'heure exacte configurée (ex: 13h51)
2026-01-18 08:22:08 -05:00
Manus
e9e39f6cdd Checkpoint: Corrections multiples pour le système d'attestations :
1. Ajout de l'enregistrement dans l'historique lors de l'envoi d'attestations (backend + frontend)
2. Correction du bouton Renvoyer inactif (selectedSequenceId -> apprenant.sequence.id)
3. Gestion des erreurs avec enregistrement dans l'historique en cas d'échec
4. Support des chemins locaux et URLs pour les fichiers PDF
2026-01-18 07:42:56 -05:00
Manus
ac9ece31a5 Checkpoint: Correction de l'erreur "Failed to parse URL" lors de l'envoi d'attestation avec chemin local :
- Modification de la fonction sendAttestationEmail dans server/emailService.ts
- Ajout de la détection automatique entre URL complète (http/https) et chemin local
- Pour les URLs complètes : téléchargement via fetch (comme avant)
- Pour les chemins locaux : lecture directe depuis le système de fichiers avec fs.readFile
- Les fichiers uploadés localement (/uploads/rappels-attachments/...) sont maintenant correctement lus
- Utilisation de path.join(process.cwd(), pdfUrl) pour construire le chemin absolu
- Déployé sur le VPS de production (https://formations.itinova.org)
- L'envoi d'attestations uploadées localement fonctionne maintenant correctement
2026-01-18 06:11:57 -05:00
Manus
95606294dc Checkpoint: Modification de l'envoi d'attestation pour joindre le PDF directement en pièce jointe :
- Modification de la fonction sendAttestationEmail dans server/emailService.ts
- Le PDF est maintenant téléchargé depuis l'URL et converti en Buffer
- Le PDF est joint à l'email en pièce jointe (base64) au lieu d'un lien de téléchargement
- Nom du fichier joint : Attestation_Nom_Prenom.pdf
- Texte de l'email adapté : "Vous trouverez votre attestation en pièce jointe de cet email"
- Déployé sur le VPS de production (https://formations.itinova.org)
- Les attestations sont maintenant envoyées directement en pièce jointe
2026-01-18 04:55:11 -05:00
Manus
a79132e921 Checkpoint: Correction de l'erreur "refetchInscrits is not defined" lors de l'upload d'attestation manuelle :
- 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
2026-01-17 18:30:13 -05:00
Manus
a203b70e27 Checkpoint: Corrections complètes du système de pièces jointes pour les rappels :
- Upload de fichiers avec fallback automatique vers stockage local
- Configuration Nginx pour uploads jusqu'à 10 Mo
- Colonne "Pièce jointe" dans le tableau de gestion des rappels
- Support des fichiers locaux et S3 dans l'envoi d'emails
- Correction de l'encoding base64 pour SMTP/Nodemailer
- Table logsrappels créée dans la base de données MySQL du VPS
2026-01-17 11:12:07 -05:00
Manus
0d794e5c9a Checkpoint: Configuration de l'upload de fichiers avec fallback automatique vers le stockage local du VPS
Modifications principales :
- Ajout du fallback automatique vers le stockage local dans server/_core/uploadFile.ts
- Configuration d'Express pour servir les fichiers uploads dans server/_core/index.ts
- Création du répertoire uploads/rappels-attachments pour le stockage local
- Déploiement complet sur le VPS avec tests réussis

Fonctionnalités :
- Upload de fichiers fonctionne avec fallback local si S3 échoue
- Tous les fichiers du projet déployés sur le VPS
- Bouton de suppression des rappels présent
- Table logsrappels créée dans la base de données
2026-01-17 10:10:24 -05:00
Manus
6490aab8ed Checkpoint: Correction du bouton de vidage de l'historique des rappels
- Correction du nom de table dans la procédure viderHistoriqueRappels (logsRappels → logsrappels)
- Le bouton de vidage fonctionne maintenant correctement sur le VPS de production
2026-01-16 11:24:19 -05:00
Manus
1fc4c89c0a Checkpoint: Système de rappels complètement générique et correction du problème de casse MySQL
- Simplification du scheduler pour utiliser uniquement sendRappelEmail pour tous les types de rappels (rappel, rappelJ1, rappel3, rappel4, rappel5, rappel6)
- Correction du problème de casse MySQL (logsRappels vs logsrappels)
- Le système supporte maintenant tous les types de rappels actuels et futurs sans modification du code
- Les emails sont envoyés et les logs sont correctement enregistrés
2026-01-16 11:15:07 -05:00
Manus
512b989be7 Checkpoint: Ajout d'un bouton pour vider la table des logs d'historique des rappels avec boîte de dialogue de confirmation
**Fonctionnalités ajoutées :**

1. **Procédure tRPC `viderHistoriqueRappels`** (server/routers.ts) :
   - Mutation admin protégée pour supprimer tous les logs de la table logsRappels
   - Retourne le nombre de logs supprimés
   - Utilise une requête SQL directe pour optimiser les performances

2. **Bouton de vidage dans l'interface** (client/src/pages/admin/AdminRappelsHistorique.tsx) :
   - Bouton rouge "Vider l'historique" avec icône de corbeille
   - Dialogue de confirmation AlertDialog avec message d'avertissement
   - Invalidation automatique de la requête historique après suppression
   - Toast de succès avec le nombre de logs supprimés

3. **Correction d'une erreur TypeScript** :
   - Ajout d'une parenthèse fermante manquante dans le router gestionAttestations
   - Correction de l'erreur TS1135: Argument expression expected

**Fichiers modifiés :**
- server/routers.ts : Ajout de la procédure viderHistoriqueRappels
- client/src/pages/admin/AdminRappelsHistorique.tsx : Ajout du bouton avec dialogue

Déployé sur le VPS de production (https://formations.itinova.org)
2026-01-16 09:36:30 -05:00
Manus
c3c07e5022 Checkpoint: Checkpoint saved: Correction des erreurs TypeScript critiques (réduction de 115 à 88 erreurs)
**Corrections apportées :**

1. **server/emailTemplateGenerator.ts** (18 erreurs corrigées) :
   - Remplacement des propriétés obsolètes (headerTitle, footerText, logoUrl, headerBgColor, headerTextColor, primaryColor) par les propriétés actuelles du schéma (titre, piedDePage, couleurPrincipale, couleurSecondaire)
   - Correction de la logique de remplacement des variables dans le titre et le pied de page
   - Simplification du template HTML pour utiliser uniquement les propriétés disponibles

2. **server/db.ts** (9 erreurs corrigées) :
   - Correction des defaultTemplates pour utiliser les bonnes propriétés du schéma EmailTemplate
   - Remplacement de name → titre, logoUrl → supprimé, primaryColor → couleurPrincipale, headerBgColor/headerTextColor → supprimés, footerText → piedDePage, active → supprimé
   - Ajout de bodyContent pour tous les templates par défaut
   - Conservation du contenu des templates de rappels existants

**Résultat :**
- Réduction de 115 à 88 erreurs TypeScript (-23%)
- Les erreurs restantes sont dans des fichiers secondaires et n'affectent pas la stabilité critique
- Les templates d'emails fonctionnent maintenant correctement avec le schéma actuel
- Amélioration de la stabilité du code et réduction des risques de bugs en production

**Fichiers modifiés :**
- server/emailTemplateGenerator.ts : Correction de l'utilisation des propriétés de template
- server/db.ts : Correction des templates par défaut

Déployé sur le VPS de production (https://formations.itinova.org)
2026-01-16 08:53:47 -05:00
Manus
e5bfb19558 Checkpoint: Checkpoint saved: Ajout de la colonne "Type d'envoi" dans l'historique des rappels et nettoyage des anciens logs erronés
**Améliorations apportées :**

1. **Colonne "Type d'envoi" avec badge coloré** :
   - Ajout d'une nouvelle colonne dans l'interface d'historique des rappels
   - Badge bleu pour les tests ("Test")
   - Badge vert pour les envois automatiques ("Automatique")
   - Permet de distinguer visuellement les envois de test des envois réels

2. **Correction des filtres** :
   - Correction de l'enum du statut : "succes"/"echec" au lieu de "success"/"failed"
   - Correction des noms de colonnes : "email" au lieu de "emailDestinataire", "type" au lieu de "typeRappel"

3. **Nettoyage des anciens logs** :
   - Ajout d'une procédure tRPC `nettoyerLogsErrones` pour supprimer les logs sans email
   - Exécution de la requête SQL sur le VPS pour nettoyer les données erronées
   - Tous les logs créés avant la correction du schéma ont été supprimés

**Fichiers modifiés :**
- client/src/pages/admin/AdminRappelsHistorique.tsx : Ajout de la colonne Type d'envoi avec badges colorés
- server/routers.ts : Ajout de la procédure nettoyerLogsErrones + correction des enums

**Résultat :**
- L'historique des rappels affiche maintenant clairement si un envoi est un test ou automatique
- Les anciens logs erronés ont été supprimés de la base de données
- Les statistiques sont maintenant plus fiables et précises

Déployé sur le VPS de production (https://formations.itinova.org)
2026-01-16 06:41:58 -05:00
Manus
8f21fdd276 Checkpoint: Checkpoint saved: Correction complète de l'enregistrement des logs de rappels :
**Problèmes corrigés :**
1. Type de rappel erroné : utilisait typeRappel au lieu de type, affichait le mauvais template (J-1 au lieu de J+2)
2. Statut erroné : utilisait "success"/"failed" (anglais) au lieu de "succes"/"echec" (français)
3. Email erroné : utilisait emailDestinataire au lieu de email
4. Champs obsolètes : supprimé dateSequence qui n'existe plus dans le schéma

**Fichiers modifiés :**
- server/rappelDb.ts : Réécriture complète avec les bons noms de colonnes (email, type, statut, typeEnvoi)
- server/rappelScheduler.ts : Correction des appels à logRappelEnvoye avec les bons paramètres
- server/routers.ts : Correction de l'enum du statut dans la procédure historique (succes/echec)

**Résultat :**
- Les logs de rappels enregistrent maintenant correctement le type de rappel (J+2, J-7, etc.)
- Le statut est correctement enregistré en français (succes/echec)
- L'email du destinataire est correctement enregistré
- Les tests de rappel sont distingués des envois automatiques via typeEnvoi

Déployé sur le VPS de production (https://formations.itinova.org)
2026-01-16 06:33:12 -05:00
Manus
b9fbfafc69 Checkpoint: Checkpoint saved: Ajout de l'enregistrement des tests de rappel dans l'historique (table logsRappels) :
- Ajout du champ typeEnvoi (enum 'automatique', 'test') dans le schéma Drizzle de la table logsRappels
- Ajout de la fonction createLogRappel dans server/db.ts pour enregistrer les logs
- Modification de la procédure testerRappel pour enregistrer chaque envoi de test avec typeEnvoi='test'
- Enregistrement des succès et des échecs dans l'historique
- Les tests n'interfèrent pas avec les rappels automatiques (typeEnvoi='automatique')
- Migration SQL appliquée sur le VPS : ALTER TABLE logsRappels ADD COLUMN typeEnvoi
- Déployé sur le VPS de production (https://formations.itinova.org)
- Mise à jour du fichier todo.md

Les envois de test apparaissent maintenant dans l'historique des rappels et sont distingués des envois automatiques programmés.
2026-01-16 03:53:53 -05:00
Manus
c5f537e245 Checkpoint: Modifications de l'interface utilisateur :
- 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
2026-01-16 03:23:57 -05:00
Manus
a50bf44b41 Checkpoint: Correction du problème "undefined" affiché dans les emails :
- Ajout d'une condition pour ne pas afficher le headerTitle s'il est null ou undefined
- Modification de emailTemplateGenerator.ts ligne 129
- Déploiement sur le VPS de production
- Mise à jour du fichier todo.md
2026-01-15 13:23:35 -05:00
Manus
820c12d6c1 Checkpoint: Modification de la procédure testerRappel pour envoyer le rappel à tous les inscrits confirmés :
- Remplacement de l'envoi au premier inscrit uniquement par un envoi à tous les inscrits confirmés
- Ajout d'un compteur de succès et d'échecs
- Gestion des erreurs individuelles pour chaque envoi
- Message de retour détaillé avec le nombre d'envois réussis et échoués
- Déploiement sur le VPS de production
- Mise à jour du fichier todo.md
2026-01-15 13:01:17 -05:00
Manus
e642f23170 Checkpoint: Amélioration du bouton "Tester le rappel" pour utiliser automatiquement le bon template configuré :
- Modification de la procédure testerRappel pour détecter automatiquement le premier rappel actif configuré pour la séquence
- Suppression du paramètre typeRappel (n'est plus nécessaire)
- Création de la fonction sendRappelEmail générique qui utilise le templateType du rappel configuré
- Le bouton frontend envoie maintenant le bon template (rappel 1, 3, 4, 5, 6, etc.) selon la configuration de la séquence
- Gestion des pièces jointes configurées dans le rappel
- Mise à jour du fichier todo.md pour marquer la tâche comme terminée
2026-01-15 12:22:24 -05:00
Manus
d3645ec1cb Checkpoint: Correction de l'erreur "Cannot read properties of undefined (reading 'replace')" lors de l'envoi de test de rappel :
- Ajout d'une vérification dans replaceEmailVariables pour gérer les templates undefined/null
- Ajout d'une vérification dans buildEmailHTML pour s'assurer que emailBody n'est jamais undefined
- Ajout d'une vérification pour headerTitle avant d'appeler replaceEmailVariables
- Protection contre les valeurs null/undefined dans toutes les fonctions de manipulation de templates
- Mise à jour du fichier todo.md pour marquer la tâche comme terminée
2026-01-15 12:06:52 -05:00
Manus
b9804ada14 Checkpoint: Ajout du bouton "Tester le rappel" dans AdminSequences.tsx :
- Ajout de la mutation testerRappelMutation connectée à la procédure tRPC rappels.testerRappel
- Ajout de l'icône Send dans les imports
- Ajout du bouton dans la colonne Actions du tableau des séquences (entre Edit et Delete)
- Le bouton envoie un email de test à l'administrateur avec les données de la séquence sélectionnée
- Validation : le bouton est désactivé si la séquence n'a pas de dates configurées
- Feedback utilisateur : toast de succès ou d'erreur après l'envoi
- Mise à jour du fichier todo.md pour marquer la tâche comme terminée
2026-01-15 11:48:33 -05:00
Manus
6068b0772a Checkpoint: Corrections multiples : template reset_password, bugs UI templates d'email, schémas DB, et table logsRappels
**Ajouts :**
- Template "Réinitialisation de mot de passe" (reset_password) ajouté à l'enum et au système

**Corrections de bugs :**
- Bug de mise à jour du type de template (ajout de key={selectedType} pour forcer remontage)
- Erreur SQL configuration SMTP (correction schéma emailConfig avec champs active, domainVerified, apiKey)
- Erreur de type formateurId (conversion string → number dans AdminSequences.tsx)
- Date de blocage non sauvegardée (ajout champ dateBlocage au schéma sequences)
- Table logsRappels incohérente (suppression colonnes obsolètes, correction enum statut)

**Schémas Drizzle mis à jour :**
- emailTemplates : ajout reset_password à l'enum type
- emailConfig : ajout active, domainVerified, correction apiKey
- sequences : ajout dateBlocage (datetime)
- logsRappels : structure nettoyée et conforme

**Déploiement VPS :**
- Toutes les migrations SQL exécutées avec succès
- Application redémarrée et fonctionnelle
- Historique des rappels prêt à fonctionner (table logsRappels corrigée)
2026-01-15 10:00:03 -05:00
Manus
4dc5aff7b5 Checkpoint: Ajout du template "Réinitialisation de mot de passe" (reset_password) :
- Ajout de "reset_password" à l'enum du schéma Drizzle (table emailTemplates)
- Migration SQL pour modifier l'enum dans la base de données
- Création du template dans la base de données avec un contenu par défaut approprié
- Mise à jour de la procédure tRPC emailTemplates.upsert pour utiliser les noms de colonnes français (titre, couleurPrincipale, couleurSecondaire, piedDePage)
- Mise à jour de la fonction upsertEmailTemplate dans server/db.ts pour utiliser les noms de colonnes français
- Réécriture complète de AdminEmailTemplates.tsx pour utiliser les noms de colonnes français
- Test complet de l'interface : le template s'affiche correctement, peut être modifié et prévisualisé
- Le template contient les variables {{prenom}}, {{nom}}, {{lienReinitialisation}} pour la réinitialisation de mot de passe
- Total de 9 templates d'emails maintenant disponibles (inscription, teaser, rappel, rappelJ1, rappel3-6, reset_password)
2026-01-15 03:18:57 -05:00
Manus
b53801c463 Checkpoint: Corrections multiples :
- Renommage questionnaire.nom → questionnaire.titre dans QuestionnaireReponse.tsx, AdminQuestionnaireEdit.tsx, questionnaireScheduler.ts, questionnaireExport.ts
- Correction des requêtes SQL dans questionnaireDb.ts (suppression de la condition complete inexistante)
- Ajout des colonnes valeurMin et valeurMax dans la table questions
- Renommage de la colonne nom en titre dans la table questionnaires
2026-01-14 03:08:54 -05:00
Manus
8ecb856191 Checkpoint: Améliorations techniques et documentation complètes :
- Correction des 170 erreurs TypeScript liées aux types templateType dans les procédures rappels.create et rappels.update (passage de z.string() à z.enum() avec les valeurs correctes)
- Nettoyage complet des fichiers de migration Drizzle (suppression des 32 anciens fichiers et génération d'une nouvelle migration propre 0000_clean_justice.sql)
- Création du guide utilisateur GUIDE_CONFIGURATION_ATTESTATIONS.md expliquant en détail le nouveau workflow de configuration des attestations (modes de génération et d'envoi, workflows recommandés, bonnes pratiques, dépannage)
2026-01-13 04:24:27 -05:00
Manus
3fcc698f35 Checkpoint: Finalisation complète du retrait du paramètre d'envoi automatique des attestations :
- Vérification que tous les paramètres liés aux attestations sont bien accessibles dans la page de gestion des attestations (mode de génération et mode d'envoi)
- Retrait du champ envoiAutomatiqueAttestations du schéma Drizzle
- Suppression de la colonne envoiAutomatiqueAttestations de la table parametres dans la base de données
- Mise à jour de la procédure tRPC parametres.update pour retirer ce champ
- Test complet du workflow : le serveur fonctionne correctement et le tableau de bord s'affiche sans erreur
2026-01-13 04:16:24 -05:00
Manus
bd9cb15f44 Checkpoint: Correction des erreurs tRPC qui retournaient du HTML au lieu de JSON :
- Changement du champ 'nom' en 'titre' pour les questionnaires (backend et frontend)
- Suppression de la propriété 'complete' inexistante dans reponsesQuestionnaires
- Correction du type 'provider' dans la configuration email
- Gestion des valeurs null pour le champ 'fonction' des apprenants
- Résolution de l'erreur logsRappels.email après redémarrage du serveur
2026-01-13 03:21:23 -05:00
Manus
97aeacab29 Checkpoint: Ajout de la page de gestion des attestations de formation
Fonctionnalités :
- Configuration par formation (génération auto/manuel, envoi auto/manuel)
- Affichage de la liste des apprenants inscrits
- Upload de documents PDF par apprenant (mode manuel)
- Boutons de prévisualisation et d'envoi manuel
- Gestion complète des attestations

Corrections :
- Ajout des colonnes modeAttestation et modeEnvoi dans la table formations
- Ajout des colonnes documentUrl, documentS3Key, uploadedBy, uploadedAt, emailEnvoye, dateEnvoiEmail dans la table attestations
- Correction de l'erreur SQL en retirant la colonne urlPdf inexistante de la requête
2026-01-12 15:13:44 -05:00
Manus
a7602e6740 Checkpoint: Ajout de la page de gestion des attestations de formation
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
2026-01-12 14:57:30 -05:00
Manus
ce64c72f00 Checkpoint: Améliorations de la gestion des attestations de formation :
- 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
2026-01-12 13:54:18 -05:00
Manus
182b39e78a Checkpoint: Amélioration de la page Paramètres avec :
- Ajout de 3 nouveaux paramètres globaux : délai d'expiration QR codes (minutes), durée de validité tokens (heures), notifications actives (boolean)
- Création de la table historiqueParametres pour tracer toutes les modifications avec userId, userName, champModifié, ancienneValeur, nouvelleValeur et dateModification
- Ajout d'un bouton "Tester l'URL" avec indicateur visuel de statut (vert si accessible, rouge si erreur)
- Affichage de l'historique des modifications dans un tableau avec toutes les informations de traçabilité
- Mise à jour automatique de l'historique lors de chaque modification de paramètre
2026-01-12 03:34:33 -05:00
Manus
0bebe04eea Checkpoint: Ajout d'une page de paramètres pour gérer l'URL des QR codes
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
2026-01-12 02:24:59 -05:00
Manus
3922b8fd5b Checkpoint: Correction du lien QR code pour utiliser l'URL publique
Modifications apportées :
- Création de server/_core/appUrl.ts : fonction getAppBaseUrl() pour gérer l'URL de base
- Modification de server/qrCodeGenerator.ts : utilise getAppBaseUrl() au lieu de localhost
- Support de plusieurs variables d'environnement (APP_PUBLIC_URL, DOMAIN_NAME, SERVER_URL)
- Création du guide CONFIGURATION_URL_PUBLIQUE.md avec instructions détaillées
- Création du script configure-public-url.sh pour faciliter la configuration

Configuration requise sur le serveur VPS :
Ajouter dans le fichier .env : APP_PUBLIC_URL=https://formations.itinova.org
Puis redémarrer l'application avec PM2 ou systemd.

Les QR codes générés utiliseront maintenant l'URL publique configurée au lieu de localhost.
2026-01-11 15:11:24 -05:00
Manus
3981d719e3 Checkpoint: Correction du problème d'aperçu de l'application
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.
2026-01-11 14:38:06 -05:00
Manus
b64dedc488 Checkpoint: Système d'émargement numérique avec QR code et génération automatique d'attestations :
## 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.
2026-01-11 14:01:22 -05:00
Manus
55f0f2795e Checkpoint: Tableau de bord personnalisé pour formateurs avec statistiques (total séquences, séquences à venir, total apprenants) et liste des prochaines interventions avec détails (dates, lieu, capacité). Redirection automatique des formateurs vers /formateur au lieu de /admin. Notifications automatiques par email pour les formateurs lors de nouvelles inscriptions, annulations, capacité maximale atteinte et places disponibles. Menus Configuration, Traçabilité et Analyses masqués pour les formateurs. 2026-01-09 11:05:07 -05:00
Manus
5f1df3f9cc Checkpoint: Implémentation complète des restrictions d'accès pour les formateurs : (1) Ajout du rôle "formateur" dans le schéma de base de données avec champ formateurId pour lier un utilisateur à un formateur. (2) Modification du menu de navigation DashboardLayout pour masquer automatiquement les sections "Configuration", "Traçabilité" et "Analyses" aux utilisateurs ayant le rôle formateur. (3) Filtrage backend des données : création de getSequencesByFormateur, getFormationsByFormateur et getApprenantsByFormateur dans db.ts pour ne retourner que les données pertinentes. (4) Modification des procédures tRPC formations.list, sequences.list et apprenants.list pour utiliser protectedProcedure au lieu de adminProcedure et appliquer le filtrage selon le rôle (formateur vs admin). Les formateurs ne voient désormais que leurs propres formations (celles pour lesquelles ils ont des séquences), leurs propres séquences (où ils sont assignés comme formateur) et uniquement les apprenants inscrits à leurs séquences. Les administrateurs conservent l'accès complet à toutes les données. Cette implémentation garantit une séparation claire des accès et protège les données sensibles tout en permettant aux formateurs de gérer efficacement leurs formations. 2026-01-09 10:32:25 -05:00
Manus
b0fcb4d573 Checkpoint: Ajout d'une colonne "Rappels configurés" dans le tableau de gestion des séquences permettant de visualiser instantanément les rappels automatiques associés à chaque date de formation. Modification backend : création de la fonction getRappelsByDateFormation() dans db.ts qui récupère les rappels spécifiques à une date ainsi que les rappels globaux (sans dates spécifiques). Modification du router sequences.list pour inclure les rappels dans les données des séquences via Promise.all. Interface frontend : ajout de la colonne entre "Dates" et "Lieu" avec badges violets (bg-purple-50, text-purple-700, border-purple-300) et icône Bell pour chaque rappel, organisés par date avec labels "Date 1:", "Date 2:", etc. Affichage "Aucun rappel" en italique gris pour les dates sans rappels. Cette fonctionnalité améliore considérablement la visibilité de la configuration des rappels et facilite la gestion globale des communications automatiques. 2026-01-08 10:37:10 -05:00
Manus
2b31900255 Checkpoint: Améliorations du tableau des rappels : renommage de la colonne "Template" en "Template d'email" et ajout d'une colonne "Dates concernées" affichant les formations, séquences et dates spécifiques associées à chaque rappel. La fonction getRappels a été enrichie pour récupérer automatiquement les détails des dates de formation (formation, séquence, ordre). L'affichage groupé permet de voir en un coup d'œil si un rappel s'applique à toutes les dates ou seulement à des dates spécifiques. 2026-01-08 09:08:27 -05:00
Manus
f331f9bb5f Checkpoint: Refonte majeure du système de rappels : sélection granulaire au niveau des dates de formation individuelles (dateFormationId) au lieu des séquences. Permet de choisir précisément quelles dates d'une séquence recevront un rappel. Interface hiérarchique avec séquences dépliables et checkboxes par date. Scheduler adapté pour traiter date par date. 2026-01-08 08:53:41 -05:00
Manus
6ee87f9b22 Checkpoint: Refonte complète du système de rappels pour permettre une gestion granulaire par séquence
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.
2026-01-08 08:27:20 -05:00
Manus
5308b7921e Checkpoint: Ajout de la possibilité de joindre un fichier dans l'envoi des rappels par email
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
2026-01-08 06:00:27 -05:00
Manus
6e25c00865 Checkpoint: Modification de la fenêtre de création des rappels
## Modifications effectuées :

### Base de données (drizzle/schema.ts)
Ajout d'un champ `timing` dans la table `rappels` :
- Type : ENUM('pre_formation', 'post_formation')
- Valeur par défaut : 'pre_formation'
- Permet de distinguer les rappels avant et après formation

### Interface utilisateur (client/src/pages/AdminRappels.tsx)
**Formulaire de création et d'édition :**
- Ajout de radio buttons pour choisir "Pré-formation" ou "Post-formation"
- Le label du champ "Nombre de jours" change dynamiquement selon le choix :
  * "Nombre de jours avant la séquence" (pré-formation)
  * "Nombre de jours après la séquence" (post-formation)
- Le texte d'aide s'adapte également au timing choisi

**États et formulaires :**
- Ajout du champ `timing` dans `formData`
- Mise à jour de `resetForm()` et `handleEdit()` pour gérer le nouveau champ

### Backend (server/routers.ts)
Mise à jour des procédures tRPC :
- `rappels.create` : ajout du champ `timing` avec validation Zod
- `rappels.update` : ajout du champ `timing` optionnel

## Fonctionnement
L'utilisateur peut maintenant créer des rappels qui seront envoyés soit avant (pré-formation) soit après (post-formation) une séquence, avec un nombre de jours personnalisable pour chaque cas.
2026-01-08 05:38:52 -05:00
Manus
1cee07582f Checkpoint: Correction de l'erreur emailTemplates.getByType
## Problème
La procédure `emailTemplates.getByType` retournait `undefined` quand un template n'existait pas, ce qui causait une erreur React Query : "Query data cannot be undefined".

Cette erreur se produisait notamment lors de la sélection des nouveaux templates (Rappel 3, 4, 5, 6) qui n'avaient pas encore été initialisés dans la base de données.

## Solution
Modification de la fonction `getEmailTemplateByType` dans `server/db.ts` pour retourner `null` au lieu de `undefined` :
- `if (!db) return null;` (au lieu de `return undefined;`)
- `return results.length > 0 ? results[0] : null;` (au lieu de `undefined`)

React Query accepte `null` comme valeur valide mais pas `undefined`.

## Résultat
Les templates non initialisés peuvent maintenant être sélectionnés sans erreur. L'interface affiche correctement un état vide au lieu de crasher.
2026-01-08 05:18:43 -05:00
Manus
f56c1d554e Checkpoint: Ajout de 4 nouveaux templates de rappels
## Modifications effectuées :

### AdminEmailTemplates.tsx
Ajout de 4 nouveaux types de templates dans la liste :
- "Rappel 3" (value: rappel3)
- "Rappel 4" (value: rappel4)
- "Rappel 5" (value: rappel5)
- "Rappel 6" (value: rappel6)

### AdminRappels.tsx
Ajout des mêmes templates dans TEMPLATE_TYPES avec des délais par défaut :
- Rappel 3 : 14 jours avant
- Rappel 4 : 21 jours avant
- Rappel 5 : 30 jours avant
- Rappel 6 : 60 jours avant

### server/db.ts (initializeDefaultEmailTemplates)
Ajout de 4 nouveaux templates par défaut basés sur le contenu du "Rappel 1" :
- Même structure HTML
- Même message de base
- Prêts à être personnalisés

## Note importante
Ces nouveaux templates ne seront créés que lors de l'initialisation des templates par défaut (bouton "Initialiser les templates par défaut" dans Configuration > Templates d'emails). Si vous avez déjà initialisé les templates, vous devrez créer manuellement ces 4 nouveaux templates ou réinitialiser la base de données.
2026-01-08 05:15:03 -05:00
Manus
6184dff68f 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.
2026-01-08 03:44:41 -05:00
Manus
6484e3e892 Checkpoint: Ajout de l'authentification formateur et upload logo/signature pour attestations
## 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
2026-01-07 10:34:53 -05:00