đŸ‘Œ Chorist - programmer et piloter les dĂ©penses numĂ©riques d'un ministĂšre avec Grist (retour d'expĂ©rience + repo)

Bonjour Ă  toutes et tous,

Je voulais partager avec la communautĂ© un outil que j’ai construit sur Grist au sein du MinistĂšre de la Transition Ecologique : Chorist, un outil de programmation et de suivi budgĂ©taire pour l’ensemble des produits numĂ©riques de ma direction gĂ©nĂ©rale.

  • 500+ utilisateurs / 8 rĂŽles
  • 30+ vues / 30+ tables
  • 2 ans d’existence

Le constat de dĂ©part : il n’existait pas de suivi consolidĂ© des dĂ©penses numĂ©riques, chaque produit, chaque direction gĂ©rait ça dans son coin, souvent sur tableur Excel stockĂ©s en local et transmis par mail. Grist m’a permis de construire un outil qui couvre tout le cycle : du recueil des besoins jusqu’au paiement des factures, en passant par la programmation budgĂ©taire et le contrĂŽle.

Plus rĂ©cemment, j’ai fait de Chorist un outil qui donne aux dĂ©cideurs de mon administration les clĂ©s pour savoir combien d’argent donner sur chacun de nos projets numĂ©riques, en objectivant la dĂ©cision.

Cette nouvelle fonctionnalitĂ© s’articule autour de trois briques qui suivent le cycle de dĂ©cision annuel, chacune portĂ©e par une ou plusieurs pages Grist :

1. Auto-évaluation

Un questionnaire d’auto-Ă©valuation, rempli chaque annĂ©e par le porteur du produit ou du projet SI lui-mĂȘme (page « Auto-Ă©val & Besoins »). On y reprend la logique d’évaluation par impact qu’on utilise habituellement pour les seules Startups d’État de beta.gouv — cycle en Saisons, Phases (Investigation / Construction / AccĂ©lĂ©ration / PĂ©rennisation) — et on l’étend Ă  l’ensemble du portefeuille numĂ©rique, y compris aux projets qui ne passent pas par ce cadre d’incubation.

2. Remontée de besoin

À l’issue de l’auto-Ă©valuation, le porteur de projet fait remonter son besoin budgĂ©taire (autorisations d’engagement / crĂ©dits de paiement) pour l’annualitĂ© de son choix. Une seule fois consolidĂ© dans une table Grist, ce n’est plus un mail ou un tableur diffĂ©rent par produit, mais un registre unique interrogeable par produit, financeur, SI fĂ©dĂ©rateur ou domaine (pages « Visualisation » du module Registre des besoins, adossĂ©es Ă  des tables rĂ©sumĂ© calculĂ©es par formule).

3. Programmation des dépenses

C’est le cƓur de nouvelle fonctionnalitĂ© : le module de programmation budgĂ©taire, Ă  destination des sous-directions, des comitĂ©s de domaine et de la direction. Il consolide auto-Ă©valuations et besoins remontĂ©s pour que les dĂ©cideurs arbitrent, projet par projet, avec les mĂȘmes chiffres — plutĂŽt qu’à l’aveugle ou au rapport de force. L’objectif : que l’arbitrage porte sur l’impact du projet, pas sur qui a le mieux plaidĂ© sa cause.

Et en dehors de ces briques ? Ce que j’ai mis en place cĂŽtĂ© technique

Quelques éléments qui pourraient intéresser la communauté :

  • Un systĂšme de rĂŽles entiĂšrement portĂ© par les Permissions avancĂ©es, sans toucher aux groupes natifs Grist (Owner/Editor/Viewer). Une propriĂ©tĂ© d’utilisateur (user.Equipe) relie user.Email Ă  une table Utilisateurs, dont une colonne RĂŽle (choix multiple) porte 8 rĂŽles mĂ©tier diffĂ©rents — du freelance Ă  l’attributaire de marchĂ©. L’accĂšs aux donnĂ©es est ensuite scopĂ© par produit via des colonnes ReferenceList calculĂ©es (ex. Produits_Intrapreneur_Chef_de_projet), pour que chacun ne voie que son pĂ©rimĂštre.

  • Un panneau « qualitĂ© des donnĂ©es » gĂ©nĂ©rique, injectĂ© en widget secondaire sur chaque table opĂ©rationnelle, qui liste en langage clair les champs manquants ou incohĂ©rents et qui doit les corriger. PortĂ© par une seule formule Python par table qui retourne un JSON ({"resp": ..., "champ": ..., "action": ..., "niveau": "manquant"/"incohĂ©rent"}), consommĂ© par le widget.

  • Des formulaires Grist publiĂ©s pour la collecte de donnĂ©es cĂŽtĂ© utilisateurs (demandes de MADI, demandes d’accĂšs Ă  l’outil).

  • Une synchronisation via n8n avec le systĂšme budgĂ©taire interministĂ©riel, chorus, pour faire remonter/redescendre les actes financiers sans ressaisie manuelle.

  • Des colonnes Ă  formule d’initialisation (trigger formulas) utilisĂ©es Ă  la fois par nĂ©cessitĂ© fonctionnelle (traçabilitĂ© : qui/quand a créé ou modifiĂ© une ligne) et pour geler des calculs coĂ»teux plutĂŽt que de les laisser se recalculer Ă  chaque interaction.

Et le changement, pas seulement la technique

Ce qui a comptĂ© au moins autant que l’outil : faire accepter Ă  des chefs de produit, des attributaires de marchĂ© et des Ă©quipes finances de travailler dans le mĂȘme outil, avec la mĂȘme donnĂ©e, en confiance. C’est un vrai chantier de conduite du changement — convaincre, former, itĂ©rer avec les utilisateurs, accepter que l’adoption prenne du temps — pas seulement un chantier technique.

Le repo

On a fait le choix de publier le projet sous licence MIT, pour que ça puisse vraiment devenir un commun numĂ©rique — repris et adaptĂ© par d’autres administrations qui ont les mĂȘmes problĂšmes de pilotage budgĂ©taire du numĂ©rique.

Le repo est ici : DGALN / Mission numérique / Pilotage des dépenses numériques · GitLab

Je quitte le ministĂšre prochainement, mais je serais ravi que d’autres s’en emparent — que ce soit pour des retours, des questions sur l’implĂ©mentation, ou pour le reprendre tel quel ou en s’en inspirant. N’hĂ©sitez pas Ă  commenter ici ou Ă  ouvrir une issue sur le repo.

Merci à la communauté Grist pour les échanges qui ont nourri ce projet !

7 « J'aime »

bravo et merci du partage ! :clap: :clap: :clap:

1 « J'aime »

Super. merci pour le partage et BRAVO pour ce travail

Super intéressant, merci !

Par contre, j’ai essayĂ© de tĂ©lĂ©charger le document .grist (oĂč je m’attendais Ă  retrouver toute la structure de donnĂ©es, les pages, les ACL, etc.), mais il n’y a aucune page et que deux tables quasi inutiles.

Est-ce normal ?

@audezu tu pourrais jeter un coup d’oeil stp ? :smiley:

hello il manquait la rùgle user.Access == OWNER → autoriser

_Chorist(1).grist (1,1 Mo)

(alternativement, il faut libérer uniquement la table utilisateurs, ajouter son propre mail dedans avec un rÎle qui donne accÚs à tout)

Btw, t’avais une erreur : la colonne clĂ© de paiement Ă©tait Ă©crite dans 2 rĂšgles diffĂ©rentes sur la mĂȘme table, ce qui empĂȘchait d’enregistrer, j’ai gardĂ© celle-ci :