All checks were successful
Validation applicative / TypeScript, tests et build (push) Successful in 5m21s
237 lines
17 KiB
Markdown
237 lines
17 KiB
Markdown
# 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 2025–2027
|
||
- [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 2025–2027 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
|
||
- [x] Ajouter un téléversement administrateur du fichier Excel de référence dans Masse salariale
|