Finora — Widget de gestion budgétaire pour collectivités
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
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.