Files
itinova-budget-si/todo.md

236 lines
17 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Budget SI Itinova — TODO
## Migration vers base de données (tRPC + auth locale)
- [x] Schéma Drizzle complet (users, etablissements, inventaire, opex, capex, parametres_app)
- [x] Migration base de données (pnpm db:push — 10 tables créées)
- [x] Seed compte admin par défaut (admin / Itinova2027!)
- [x] Authentification locale JWT (bcrypt + cookie httpOnly)
- [x] Routes tRPC : auth.login, auth.me, auth.logout
- [x] Routes tRPC : users.list, users.create, users.update, users.delete, users.importBulk
- [x] Routes tRPC : etablissements.list, etablissements.upsert, etablissements.delete
- [x] Routes tRPC : parametres.get, parametres.set, parametres.setBulk
- [x] Routes tRPC : opex.getPostes, opex.upsertPoste, opex.getMontantsEtab, opex.setMontantEtab, opex.getValidated, opex.validate, opex.initFromSource, opex.cloneFromN1
- [x] Routes tRPC : inventaire.get, inventaire.import, inventaire.getStats, inventaire.listMeta
- [x] Routes tRPC : capex.get, capex.save
- [x] Page de connexion avec branding Itinova/Santinova
- [x] Protection des routes (ProtectedRoute dans App.tsx — useEffect)
- [x] Hook useAuth branché sur tRPC (auth.me)
- [x] Bouton déconnexion dans la sidebar
- [x] Page Paramètres — onglet Établissements branché sur tRPC
- [x] Page Paramètres — onglet Utilisateurs branché sur tRPC
- [x] ImportModal — import inventaire sauvegardé en BDD via tRPC (sans double-écriture localStorage)
- [x] ImportModal — import établissements sauvegardé en BDD via tRPC
- [x] ImportModal — import utilisateurs sauvegardé en BDD via tRPC
- [x] ImportModal — indicateur "État des inventaires par année" branché sur tRPC (inventaire.listMeta)
- [x] Tests Vitest (14 tests passent) : auth.logout, auth.me, auth.login, etablissements.list, users.list, parametres.get
## Migration des pages d'affichage vers BDD
- [x] useBudgetData — lit depuis tRPC (inventaire.getStats)
- [x] ParametresContext — lit/écrit depuis tRPC (parametres.get, parametres.setBulk)
- [x] Page Renouvellement PC (Home.tsx) — données inventaire depuis tRPC via useBudgetData
- [x] Page Budget 2027 — données CAPEX depuis tRPC (capex.get, capex.save) + inventaire depuis tRPC
- [x] Page DSI CAPEX — synthèse CAPEX depuis tRPC
- [x] Page DSI OPEX — données OPEX depuis tRPC (opex.*)
- [x] Pages Santinova, Soins Santé, St-Exupéry — pages "Coming Soon" (pas de données)
## Améliorations futures
- [x] Gestion des droits par établissement (userEtablissements) — évolution future, explicitement hors périmètre de cet audit
- [x] Export PDF/Excel des budgets — évolution future, explicitement hors périmètre de cet audit
- [x] Historique des modifications (audit log) — évolution future, explicitement hors périmètre de cet audit
## Onglet Clés de répartition dans DSI OPEX
- [x] Analyser le fichier source pour extraire les colonnes base_repartition et base_repartition_hep
- [x] Ajouter colonne base_repartition_hep dans la table opex_bases_repartition + migration
- [x] Routes tRPC : opex.getBasesRepartition (mise à jour), opex.setBaseRepartition (mise à jour avec hep), opex.importBasesRepartition
- [x] Seeder les données base_repartition_hep 2026 depuis le fichier source
- [x] Créer l'onglet "Clés de répartition" dans DsiOpex avec tableau éditable (base standard + /HEP)
- [x] Import fichier Excel/CSV dans l'onglet Clés de répartition
- [x] Afficher l'info "Année de la base = année OPEX - 2" dans l'onglet
- [x] Brancher le calcul du poste "DUI pôle HEP" sur base_repartition_hep
## Corrections de lacunes (post-checkpoint 841ff1bd)
- [x] Ajouter un vrai loading/error state pour l'onglet « Clés de répartition » basé sur la requête `opex.getBasesRepartition`
- [x] Rendre l'import des clés de répartition compatible avec le classeur source réel : détection intelligente de la bonne feuille (mots-clés OPEX/DSI/répartition/base), normalisation des accents, validation des colonnes attendues avec message d'erreur détaillé
## Bugs et nouvelles fonctionnalités (post-checkpoint cfeb5196)
- [x] Bug : doublon de ligne dans le tableau Clés de répartition au clic (mutation setBaseRepartition provoque un double rendu)
- [x] Fonctionnalité : mode "tout manuel" par établissement dans l'onglet Clés de répartition (toutes les colonnes OPEX de cet établissement saisies manuellement, ignorant le calcul prorata)
## Corrections (post-checkpoint eb1684f0)
- [x] Bug : lignes parasites (catégories Infogérance, Sécurité, TOTAL, etc.) dans la vue Établissements OPEX — suppression en BDD + filtre anti-parasites dans l'import
## Améliorations (post-checkpoint 60fd2b89)
- [x] Mode tout manuel : cellules des postes automatiques rendues éditables pour les établissements en mode manuel
- [x] Pré-remplissage des montants précalculés lors du passage en mode tout manuel (batchSetMontantsEtab)
- [x] Tri par code établissement dans la vue Établissements OPEX (colonne Code cliquable, tri par défaut)
## Évolutions menu et navigation (12/06/2026)
- [x] Menu latéral : afficher le nom de l'utilisateur connecté en dernier (tout en bas)
- [x] Menu latéral : ajouter un espace libre entre "Paramètres" et le nom de connexion
- [x] Menu latéral : ajouter "Tableau de bord Finance" sous "OPEX (charges)"
- [x] Créer la page Tableau de bord Finance avec accès au dossier Windows OneDrive
## Audit de robustesse et maintenabilité
- [x] Cartographier le code, les dépendances et les fichiers non utilisés
- [x] Corriger les tendances par catégorie OPEX pour comparer l'année affichée à sa vraie année N-1
- [x] Diagnostiquer le rendu dupliqué : une seule racine React active, les répétitions proviennent de la superposition de captures navigateur
- [x] Valider côté serveur les codes importés dans les bases OPEX et masquer les lignes non établissement existantes
- [x] Rendre effective la suppression d'un poste OPEX au lieu d'afficher une action indisponible
- [x] Nettoyer les fichiers techniques inutiles et le code mort identifié
- [x] Renforcer les contrôles d'entrée, les états d'erreur et les points fragiles prioritaires
- [x] Documenter les responsabilités et invariants des modules métier maintenus
- [x] Ajouter ou compléter les tests ciblant les régressions critiques
- [x] Vérifier TypeScript, tests, build et état de l'application avant checkpoint
## Correction du build de déploiement
- [x] Identifier la divergence de version pnpm entre le Dockerfile et le lockfile
- [x] Utiliser Corepack et la version pnpm verrouillée par le projet dans le Dockerfile
- [x] Vérifier TypeScript, les tests et le build avec Corepack et le lockfile figé
- [x] Sauvegarder un checkpoint contenant le Dockerfile corrigé
- [x] Relancer le déploiement depuis ce checkpoint afin de confirmer le build cloud
## Déploiement de recette via Gitea
- [x] Vérifier la version à pousser et la cible Gitea de recette
- [x] Pousser la version validée et déclencher le déploiement de recette
- [x] Vérifier l'application déployée sur l'URL de recette
- [x] Diagnostiquer et corriger le rejet de signature du webhook CI/CD
- [x] Constater l'échec du commit 3b52527 puis confirmer le redéploiement du correctif ec597da
- [x] Diagnostiquer et corriger le routage du webhook vers le déploiement Budget SI
- [x] Déclencher et valider le workflow CI requis avant le redéploiement
## Module Masse salariale Santinova
- [x] Analyser les bulletins 2025 et 2026 fournis et relever les champs fiables
- [x] Consolider les bulletins complémentaires de janvier à avril 2026 avec ceux de mai à août
- [x] Résoudre les bulletins multiples d'un même matricule sur une période par une règle métier documentée
- [x] Produire un jeu consolidé 2026 sans doublon par salarié et par année
- [x] Créer le schéma BDD sécurisé pour les salariés et leurs rémunérations annuelles
- [x] Restreindre le module Masse salariale aux administrateurs
- [x] Créer les procédures tRPC de consultation, import et modification de l'évolution salariale
- [x] Ajouter l'entrée de menu et la page Masse salariale avec tableau 20252027
- [x] Importer les données contrôlées depuis les bulletins de salaire
- [x] Tester le rendu réel des états d'interface : chargement, erreur, vide et affichage prêt
- [x] Ajouter des tests d'agrégation : totaux annuels, statut annuel/provisoire et absence de valeur fictive 2027
- [x] Documenter que l'import de bulletins est un import initial contrôlé hors interface, et prévoir son extension future
## Vérification des exportations de factures
- [x] Vérifier le projet Budget SI : aucun flux ou chemin d'export de factures BAP ou d'abonnement n'y est configuré
- [x] Annulé : demande posée dans une autre application
## Reprise du module Masse salariale
- [x] Finaliser les validations et la documentation du module Masse salariale
## Déploiement de recette — Masse salariale
- [x] Vérifier le commit local et la branche Gitea de recette
- [x] Pousser la version Masse salariale vers Gitea et déclencher la CI/CD
- [x] Vérifier le déploiement et l'accès HTTPS de recette
- [x] Rétablir l'authentification SSH administrateur vers le serveur de recette
- [x] Vérifier la réception du webhook et la validation CI du commit fe2a266
- [x] Confirmer le commit réellement déployé après le redéploiement Blue-Green
- [x] Identifier les logos de stockage indisponibles sur la recette
## Correctif de fiabilité des logos de recette
- [x] Remplacer les logos de stockage indisponibles par des wordmarks sans dépendance externe
- [x] Publier le correctif de wordmarks sur Gitea recette
- [x] Vérifier visuellement la page de connexion de recette après publication
## Export Excel Masse salariale
- [x] Isoler, dans les bulletins, les seules primes d'astreinte à déduire du brut
- [x] Ajouter une colonne Astreintes à déduire modifiable pour chaque année
- [x] Calculer le brut hors primes par formule : brut annuel avec primes moins astreintes à déduire
- [x] Générer un tableau Excel 20252027 au format de la fenêtre Masse salariale
- [x] Vérifier les formules, les montants et la mise en forme du fichier Excel
## Mise à jour des astreintes selon le planning
- [x] Identifier les semaines d'astreinte 2025 et 2026 du planning pour les six salariés ciblés
- [x] Tracer explicitement les segments partiels à cheval entre exercices, exclus du décompte de semaine complète
- [x] Intégrer toutes les semaines à cheval explicitement confirmées par les bulletins et vérifier les montants annuels — écarté par la règle finale lundi-lundi complète, qui exclut les segments à cheval entre exercices
- [x] Intégrer la semaine du 29/12/2025 de Jérôme Pascuzzi confirmée par le bulletin de janvier 2026 — écartée par la même règle lundi-lundi complète appliquée au classeur livré
- [x] Relier le tableau principal aux totaux annuels d'astreinte des onglets dédiés
- [x] Vérifier les décomptes chiffrés et le fichier Excel final actualisé
## Finalisation prioritaire — Astreintes
- [x] Recalculer et livrer le fichier Excel selon la règle lundi-lundi complète
- [x] Utiliser exclusivement les semaines planifiées à 200 € comme source des astreintes 2025 et 2026
- [x] Supprimer les références au cumul de période des onglets et de la documentation
## Livraison prioritaire du classeur
- [x] Transmettre immédiatement la dernière version du fichier Excel avec les astreintes actualisées
## Fenêtre Salaires mensuelle
- [x] Confirmer les listes de données à afficher après téléversement d'une liasse mensuelle
- [x] Créer le stockage sécurisé des fichiers de paie et de leurs métadonnées
- [x] Créer l'import administrateur, l'extraction contrôlée et les procédures tRPC
- [x] Ajouter la fenêtre Salaires dans le menu Santinova et afficher les listes mensuelles
- [x] Tester les droits, le téléversement, l'extraction et les états d'interface
## Détails attendus — Salaires mensuels
- [x] Conserver chaque liasse PDF en stockage sécurisé et proposer sa consultation administrateur
- [x] Afficher salarié et salaire brut pour chaque mois, filtrables par année et mois
- [x] Comparer le brut d'un salarié au mois précédent avec explication basée sur les rubriques extraites
## Sécurité des bulletins de salaire
- [x] Chiffrer les fichiers PDF avant leur stockage dédié et ne conserver en base que les métadonnées et références
- [x] Contrôler que la consultation des PDFs chiffrés est réservée aux administrateurs
- [x] Vérifier que les fichiers stockés restent disponibles après rebuild, mise à jour et réinitialisation des conteneurs
- [x] Générer et valider une clé AES-256 dédiée aux bulletins de salaire
## Déploiement de recette — Fenêtre Salaires
- [x] Vérifier les contrôles complets avant la publication
- [x] Pousser la fenêtre Salaires vers Gitea et déclencher la CI/CD de recette
- [x] Vérifier l'application Salaires déployée en HTTPS sur la recette
- [x] Configurer la clé AES des bulletins dans l'environnement sécurisé de recette et recréer le conteneur
- [x] Transmettre explicitement PAYROLL_ENCRYPTION_KEY au conteneur applicatif de recette
- [x] Vérifier la disponibilité du stockage persistant chiffré dans l'environnement de recette
- [x] Stocker les PDF déjà chiffrés sur le volume persistant de recette si Forge n'est pas configuré
- [x] Valider en recette l'import, l'index et la consultation d'une liasse réelle sans exposer de données de paie
- [x] Appliquer et enregistrer les migrations Salaires dans la base de recette avant l'import mensuel
## Exécution en arrière-plan
- [x] Finaliser la fenêtre Salaires et le déploiement de recette sans intervention utilisateur
## Validation bout en bout — Salaires
- [x] Importer une liasse PDF de contrôle avec un compte administrateur, contrôler son index, le filtre et la consultation sécurisée
- [x] Redémarrer le serveur puis relire une liasse archivée pour confirmer la persistance hors conteneur
- [x] Permettre à un administrateur de réindexer sans écraser une liasse déjà archivée
- [x] Vérifier visuellement la page Salaires de recette dans une session administrateur : navigation, filtres, liste et statuts
- [x] Ouvrir une liasse depuis le bouton de l'interface de recette afin de valider le parcours utilisateur de consultation
- [x] Corriger l'alerte frontale indiquant à tort un chiffrement indisponible en recette
- [x] Corriger l'accès à la base de recette empêchant la connexion administrateur après le dernier redéploiement
## Promotion Salaires — recette et production
- [x] Vérifier la version Salaires active et le statut Gitea de recette avant promotion
- [x] Mettre à jour le dashboard et le portail de recette pour la fenêtre Salaires
- [x] Promouvoir la version Salaires validée vers la production depuis le dépôt Gitea via le flux Santinova de déploiement sécurisé
- [x] Mettre à jour le dashboard et le portail de production pour la fenêtre Salaires
- [x] Vérifier les accès HTTPS administrateur et le statut des déploiements dans les deux environnements
- [x] Paramétrer le domaine Traefik Budget SI par environnement pour que la production réponde sur son URL dédiée
- [x] Corriger le visuel Budget SI non chargé sur la carte du portail de recette
- [x] Créer et synchroniser le dépôt Gitea production Budget SI avant le déploiement du serveur de production
- [x] Initialiser et vérifier le schéma de la base Budget SI de production avant la validation administrateur
- [x] Exécuter les migrations Drizzle au démarrage du conteneur pour les futurs déploiements de production
- [x] Créer le compte administrateur initial requis lorsque la base Budget SI est vide
- [x] Synchroniser le correctif d'initialisation de la base vers le dépôt et le serveur de production
- [x] Corriger la connexion administrateur de recette restée en attente après le redéploiement du bootstrap
- [x] Diagnostiquer puis redémarrer les services d'infrastructure de recette autorisés pour rétablir l'API et le dashboard
## Masse salariale — prévisionnel et réel annuel
- [x] Analyser la structure et les formules du fichier modèle Masse salariale fourni
- [x] Importer les données du fichier comme réel et prévisionnel 2025, ainsi que prévisionnel 2026 et 2027
- [x] Calculer le réel 2026 exclusivement à partir des liasses mensuelles importées dans Salaires
- [x] Ajouter les colonnes annuelles prévisionnel et réel, avec les calculs automatiques requis
- [x] Autoriser uniquement l'édition administrateur des primes et évolutions pour l'année en cours ou future
- [x] Tester les règles de calcul, de données réelles et d'autorisation de modification
- [ ] Déployer l'évolution validée en recette puis en production
- [x] Afficher les centimes des montants de masse salariale lorsque le fichier modèle en contient
- [x] Reprendre le brut annuel avec primes calculé par le fichier modèle comme référence prévisionnelle exacte
- [ ] Synchroniser le fichier prévisionnel et les liasses mensuelles nécessaires au réel 2026 en recette et production
- [x] Archiver les liasses de janvier à avril 2026 fournies dans Salaires avant le calcul réel annuel