[CUSTOM WIDGET] Outils de suivi budgétaire

Finora — Widget de gestion budgétaire pour collectivités

:video_camera: Démo complète :

J’ai développé un widget custom intégré à Grist qui centralise le pilotage financier en un seul tableau de bord interactif.

Ce que ça fait concrètement :

  • Tableau de pilotage — indicateurs clés d’exécution budgétaire (mandaté / engagé / reste), graphiques par direction et par politique publique, objectifs trimestriels avec statut automatique
  • Gestion Budget — consultation et saisie du budget par antenne et par nature, virements de crédit tracés avec historique
  • Programmation N+1 & pluriannuelle — saisie des montants proposés / arbitrés / votés sur le mandat 2026–2032, synthèse et graphiques interactifs (Chart.js)
  • Engagements Ciril — liste et fiche détaillée des engagements importés, rattachement à un projet, commentaires
  • Projets — programmation pluriannuelle par projet, taux d’engagement, engagements rattachés
  • Statistiques — graphiques croisés (exécution, comparaison N/N+1, répartition par direction), export PNG et CSV

Circuit de filtrage unifié :

Une toolbar commune (collectivité / budget / exercice / direction) synchronise automatiquement tous les panneaux. Un système de rôles (adminFinances, adminTechnique, gestionnaire) contrôle l’accès aux fonctionnalités sensibles comme la saisie et les virements.

Techniquement :

  • HTML/CSS/JS vanilla + Chart.js, sans framework
  • Connecté en temps réel à Grist via grist-plugin-api
  • Gestion automatique des colonnes formule (retry sur applyUserActions)
  • Interface responsive avec sidebar, toolbar dark, modales et accordéons

Pour les profils utilisateurs :
Voici comment fonctionne le système de rôles dans Finora.


La table Grist Utilisateurs

Le système lit une table appelée Utilisateurs dans votre document Grist. Cette table doit contenir une ligne par utilisateur avec trois colonnes booléennes :

Colonne Valeur acceptée
adminFinances true / oui / 1 / x / o
adminTechnique true / oui / 1 / x / o
gestionnaire true / oui / 1 / x / o

Grist affiche automatiquement à chaque utilisateur sa propre ligne grâce aux filtres de lignes par utilisateur (user.Email), donc chacun ne voit que sa ligne et le widget lit toujours la ligne à l’index 0.


Les 3 profils et leurs accès

Admin Finances — accès complet
Panneaux : Pilotage, Budget, Programmation, Engagements, Projets, Statistiques, Aide.
C’est le seul profil qui voit l’onglet :pencil: Saisie dans Gestion Budget (virements de crédit, modification des montants).

Admin Technique — accès étendu sans pilotage
Panneaux : Budget, Programmation, Engagements, Projets, Statistiques, Aide.
Pas d’accès au Tableau de pilotage ni à la saisie budgétaire.

Gestionnaire — accès restreint
Panneaux : Budget (lecture), Engagements, Aide.
Pas de programmation, pas de projets, pas de statistiques.


Ce qui se passe si aucun profil ne correspond

Si la table Utilisateurs est introuvable, vide, ou qu’aucune colonne booléenne n’est à true, le widget affiche uniquement le panneau Aide. C’est le comportement par défaut sécurisé.


Comment configurer concrètement

Dans Grist, créez une table Utilisateurs avec ces colonnes, ajoutez une ligne par utilisateur, cochez la colonne correspondant à son rôle, puis configurez un filtre de ligne par utilisateur (user.Email = Email) pour que chacun ne voie que sa propre ligne. Le widget récupère automatiquement la ligne au chargement et applique les restrictions d’interface sans rechargement.

9 « J'aime »

Félicitation Bénédicte !
C’est un sacré projet que tu as mené là. Et ça pourrait intéresser pas mal de collectivités. J’en toucherai deux mots à l’occasion aux Collectivités qu’on accompagne via l’ANCT ainsi qu’aux OPSN.

Est-ce que tu peux remettre le lien vers un espace de démo / test?

Enfin, est-ce que tu comptes laisser le widget en open-source pour la communauté ou tu souhaites le monétiser?

Bonjour,

Merci beaucoup pour ce retour et pour votre intérêt ! Je suis ravie que ce projet puisse susciter de l’enthousiasme.

Pour l’instant, je n’ai pas encore réfléchi à un partage du code ou à une monétisation… Étant débutante dans ce domaine, tous vos conseils seront les bienvenus.

Actuellement, je retravaille l’outil pour l’adapter et le présenter à ma collectivité si celle-ci est intéressée. Je pourrais le mettre au minimum à disposition en lecture pour que vous puissiez le tester, mais avec les droits d’accès utilisateurs que j’ai paramétrés, vous serez très restreint, et du coup, ce ne sera d’aucune utilité. Sinon, il faudrait que je mette la structure de l’outil en libre accès afin que vous puissiez la tester/récupérer.:thinking:

Je vais retravailler les droits d’accès, éventuellement les supprimer provisoirement pour que vous puissiez l’essayer.

Je vous tiens au courant dès que j’ai avancé sur ce point. N’hésitez pas à me faire part de vos suggestions ou retours !

Bonjour. Depuis la dernière fois, j’ai ajouté deux nouveaux modules.

Voici le lien pour une version a tester : Finora - Grist

J’ai supprimé les paramètres utilisateurs dans les accès avancés pour ne pas être bloqués par les “types” de profils.

:bullseye: MODULE ATTERRISSAGE

Ce module permet de saisir, pour chaque antenne et chaque nature budgétaire, une projection de consommation finale à fin d’exercice. L’idée : anticiper les dépassements ou sous-consommations avant la clôture, sans attendre les chiffres définitifs.

Concrètement :
• Une liste des antennes avec code couleur (:red_circle: surcoût prévu, :orange_circle: incohérence avec le mandaté, :green_circle: dans l’enveloppe)
• Une saisie par nature avec prévisualisation instantanée de l’écart
• Un champ commentaire pour justifier l’estimation
• Les données sont stockées dans une table Atterrissages dédiée (code_antenne, code_nature, exercice, montant, commentaire, date_saisie)


:money_bag: MODULE SUBVENTIONS

Ce module gère le cycle de vie complet des subventions, de la demande jusqu’à l’encaissement.

Concrètement :
• Enregistrement des subventions par projet (organisme, dispositif, montant demandé / accordé, statut)
• Planification des versements attendus avec leur date et montant prévisionnels
• Liaison avec les engagements Ciril (D/R = R) pour valider les encaissements effectifs
• Un plan de financement visuel qui confronte dépenses programmées et recettes subventionnées
• Alertes automatiques sur les versements en retard (date dépassée sans engagement associé)
• Les KPIs en bandeau : montant accordé total, versé, en attente, en retard

Il s’appuie sur deux tables Grist : Subventions et Versements_subvention, liées aux tables existantes Dim_projets et Import_ciril_engagement.


:speech_balloon: CE QUE J’ATTENDS DE VOUS

J’aimerais recueillir vos impressions sur plusieurs points :
• Les modules vous semblent-ils utiles dans votre contexte ?
• Le modèle de données (tables, colonnes) est-il compatible avec votre organisation ?
• Y a-t-il des fonctionnalités manquantes ou des cas d’usage que je n’ai pas couverts ?
• Seriez-vous intéressés pour tester ou exploiter ces modules dans votre propre instance Grist ?

N’hésitez pas à me faire part de vos retours, même (surtout !) critiques. C’est un projet en cours de développement et vos usages concrets m’aideront beaucoup à l’orienter.

Merci d’avance :folded_hands: