Files
veille-reglementaire/todo.md

144 lines
8.7 KiB
Markdown

# Veille Réglementaire Itinova — TODO
## Fonctionnalités principales
- [x] Schéma BDD : tables veille_entries, aap_entries, import_logs, app_settings, local_users
- [x] Migrations Drizzle poussées avec succès
- [x] Module d'import Excel (xlsx) avec déduplication intelligente
- [x] Support source locale (fichier local)
- [x] Support source OneDrive (Microsoft Graph API)
- [x] Support source FTP (basic-ftp)
- [x] Support source SharePoint (Microsoft Graph API)
- [x] Tâche cron quotidienne à 06h00 pour l'import automatique
- [x] Authentification locale (bcrypt + JWT) avec gestion des utilisateurs
- [x] API tRPC complète : veille, aap, import, settings, users, auth
- [x] Tableau de bord Veille Stratégique (4 onglets : réglementaire, concurrentielle, technologique, générale)
- [x] Tableau de bord Appels à Projets (6 onglets : Handicap, PA, Enfance, Précarité, Sanitaire, Autre)
- [x] Mode d'affichage Liste / Vignettes avec bouton de basculement
- [x] Filtres multi-critères (recherche texte, catégorie, niveau, territoire, région, département, date)
- [x] Tri chronologique du plus récent au plus ancien
- [x] Page Paramètres (source fichiers, chemins, planification, authentification)
- [x] Page Gestion des utilisateurs (création, modification, suppression, activation/désactivation)
- [x] Page Logs d'import (statistiques, historique, import manuel)
- [x] Layout sidebar avec navigation complète
- [x] Page de connexion élégante
- [x] Thème visuel Itinova (bleu marine, palette professionnelle)
- [x] 13 tests Vitest passants (auth + veille)
- [x] Compte admin par défaut créé au démarrage du serveur
## Bugs à corriger
- [x] Import Excel affiche 0 nouvelles entrées alors que les fichiers contiennent des données
## Nouvelles fonctionnalités
- [x] Backend : endpoint POST /api/upload-excel (multipart) pour recevoir les fichiers Excel
- [x] Backend : stocker les fichiers uploadés en S3 et déclencher l'import immédiatement
- [x] Frontend : bouton "Importer un fichier" dans la page Logs d'import avec sélecteur veille/AAP
- [x] Frontend : zone de dépôt (drag & drop) dans la page Paramètres pour les deux fichiers
- [x] Frontend : afficher le résultat de l'import (nouvelles entrées, erreurs) après upload
- [x] Page Paramètres : afficher les zones d'upload (drag & drop) quand la source "local" est sélectionnée
- [x] Veille : bouton "Détail" sur chaque ligne ouvrant une boîte de dialogue avec toutes les infos complètes
- [x] Boîte de dialogue Veille : couleurs douces distinctes pour les vignettes Niveau, Territoire et Source
- [x] Vue liste Veille : coloriser les boutons d'action (Détail et Lien externe)
- [x] Vignettes AAP : coloriser les étiquettes Région (violet) et Date (orange)
- [x] Vignettes Veille : coloriser les étiquettes Niveau (violet), Territoire (teal) et Date (orange)
- [x] Page Login : supprimer l'encart affichant les identifiants du compte par défaut
- [x] Login : accepter un identifiant (e-mail ou nom d'utilisateur) au lieu d'un e-mail obligatoire
- [x] Page Login : logo Itinova en haut, "powered by" + logo Santinova en bas
## Boîte à idées
- [x] BDD : table ideas (id, userId, titre, message, statut, réponseAdmin, createdAt, updatedAt)
- [x] API tRPC : créer une idée, lister toutes les idées (admin), mes idées (user), répondre (admin)
- [x] Page BoiteAIdees : liste avec date, titre, demandeur, texte, statut, réponse admin
- [x] Bouton "Nouvelle demande" en haut à droite ouvrant une boîte de dialogue
- [x] Menu "Boîte à idées" dans la sidebar accessible à tous les utilisateurs
## Authentification username
- [x] BDD : ajouter colonne username (unique, nullable) dans la table users
- [x] Backend : loginLocalUser cherche par username OU email
- [x] Backend : createLocalUser accepte username optionnel
- [x] Frontend : page Gestion utilisateurs affiche et permet de saisir le username
- [x] Mettre à jour le compte adminItinova avec username = adminItinova
- [x] Migration BDD recette : ajouter colonne username dans local_users et recréer compte adminItinova
## Bugs recette
- [x] BUG: Déconnexion lors de l'import Excel sur le VPS — la session expire et redirige vers /login pendant l'upload
- [x] BUG: Déconnexion immédiate après sélection du fichier Excel à importer (avant même l'upload)
## Flux RSS
- [x] Schéma BDD : tables rss_feeds et rss_settings
- [x] Helpers DB pour CRUD flux RSS et paramètres
- [x] Procédures tRPC : rss.list, rss.create, rss.update, rss.delete, rss.settings.get, rss.settings.save
- [x] Page RssFeeds.tsx : liste des flux, ajout/édition/suppression, config fréquence, règles d'automatisme
- [x] Navigation : ajouter l'entrée RSS dans le menu latéral (DashboardLayout)
- [x] Déploiement VPS via Gitea CI/CD
## Moteur RSS automatique
- [x] Installer le parseur RSS (fast-xml-parser) côté serveur
- [x] Ajouter table rss_seen_articles (guid unique pour éviter les doublons)
- [x] Ajouter champ last_fetched_at sur rss_feeds
- [x] Créer server/rssEngine.ts : parseur RSS + application des règles d'automatisme
- [x] Créer endpoint POST /api/scheduled/rss-fetch (auth cookie session)
- [x] Configurer la tâche planifiée Manus à 06h00 quotidien
- [x] Déployer sur le VPS
## Purge des données
- [x] Procédures tRPC : veille.purge et aap.purge (adminProcedure)
- [x] Bouton "Purger les données" en haut à droite de VeilleDashboard.tsx (admin uniquement)
- [x] Bouton "Purger les données" en haut à droite de AAPDashboard.tsx (admin uniquement)
- [x] Boîte de dialogue de confirmation avec message d'avertissement
- [x] Déploiement VPS
## Classification IA des articles RSS
- [x] Ajouter champs IA dans veille_items : iaRelevant (boolean nullable), iaCategorie, iaClassifiedBy, iaReason
- [x] Ajouter champs IA dans aap_items : iaRelevant (boolean nullable), iaCategorie, iaClassifiedBy, iaReason
- [x] Migration base de données (pnpm db:push)
- [x] Créer server/aiClassifier.ts avec prompt 1 (filtre pertinence) et prompt 2 (classification catégorie)
- [x] Intégrer aiClassifier dans rssEngine.ts (remplacer mots-clés par IA, fallback sur règles)
- [x] Procédure tRPC veille.reclassifyWithAI (reclassifier les articles existants)
- [x] Procédure tRPC aap.reclassifyWithAI
- [x] Badge "IA" dans VeilleDashboard.tsx sur les articles classés par IA
- [x] Bouton "Reclassifier avec l'IA" dans l'interface admin
- [x] Tests vitest pour aiClassifier.ts
- [x] Déploiement recette
## Simplification classification IA (automatique + nettoyage UI)
- [x] rssEngine.ts : classifier automatiquement chaque article à l'insertion (appel classifyArticle dans processFeed) — déjà en place
- [x] VeilleDashboard.tsx : supprimer le badge IA violet dans la colonne Catégorie
- [x] VeilleDashboard.tsx : supprimer le bouton "Classer avec l'IA"
- [x] Tester visuellement en sandbox
- [x] Déployer en recette
## Mise à jour AAPDashboard — Classification IA
- [x] Vérifier que aap.list retourne bien les champs IA (iaRelevant, iaCategorie, iaClassifiedBy, iaReason)
- [x] Ajouter les champs IA dans le type AapItem de AAPDashboard.tsx
- [x] Afficher la catégorie IA dans la colonne Catégorie d'AAPDashboard (même logique que VeilleDashboard)
- [x] Vérifier que rssEngine.ts classe bien les AAP via l'IA à l'insertion
- [x] Tester visuellement en sandbox
- [x] Déployer en recette
## Résumé IA automatique + Marquage Lu/Non lu
- [ ] Schéma BDD : ajouter iaResume (text) dans veille_items et aap_items
- [ ] Schéma BDD : créer table article_reads (id, userId, articleType, articleId, readAt)
- [ ] Migration pnpm db:push
- [ ] aiClassifier.ts : ajouter generateSummary() — résumé 3-5 lignes en français adapté au secteur médico-social
- [ ] rssEngine.ts : appeler generateSummary() après classifyArticle() pour chaque article pertinent
- [ ] Procédures tRPC : veille.markAsRead, veille.unreadCount
- [ ] Procédures tRPC : aap.markAsRead, aap.unreadCount
- [ ] VeilleDashboard : afficher iaResume dans la boîte de dialogue détail (à la place du résumé brut si disponible)
- [ ] VeilleDashboard : point bleu sur les articles non lus, clic sur article = markAsRead automatique
- [ ] AAPDashboard : même logique lu/non lu
- [ ] Sidebar DashboardLayout : compteur non lus sur les entrées Veille et AAP
- [ ] Tests visuels en sandbox
- [ ] Checkpoint
## Corrections urgentes — Classification IA + Déploiement recette
- [ ] Corriger le prompt de pertinence dans aiClassifier.ts (articles hors périmètre passent le filtre)
- [ ] Tester en sandbox que les articles hors périmètre (pêche, sport, économie générale) sont bien rejetés
- [ ] Finaliser le déploiement recette : copier les fichiers frontend (marqueur lu/non lu) dans le conteneur
- [ ] Vérifier visuellement en recette que le marqueur lu/non lu et les compteurs s'affichent