Projet 01 / 06 · Next.js · Concertation territoriale

Pilotage de concertation territoriale

Parties prenantes, risques, communication, engagements et actions dans un seul outil, pour des projets d'infrastructure énergétique — avec un score d'acceptabilité calculé, pas déclaratif.

🖥 Voir un échantillon de l'interface → ⚡ Version light
5modules reliés
17projets réels suivis
12types d'alertes
73tests automatisés
Avant : suivi éparpillé entre tableurs, e-mails et mémoire. Après : un tableau de bord unique, à jour.
L'ampleur du chantier — mesurée sur l'historique réel du dépôt, pas une estimation
208commits
43 966lignes de TypeScript
76pages / écrans
7migrations de schéma
417fichiers
11jours de développement intensif
Genèse du projet

Diagnostic, réflexion, décision

🔍
Diagnostic
Un projet d'infrastructure énergétique (solaire, hydrogène, e-fuels...) génère des dizaines de parties prenantes, des risques à suivre, des engagements pris à l'oral, des jalons réglementaires (CNDP) et une communication à piloter — dispersés entre tableurs, e-mails et mémoire des équipes. Aucune vue d'ensemble, aucun indicateur calculé : l'acceptabilité territoriale s'évaluait au ressenti.
💡
Réflexion
Pas un tableur de plus : un outil structuré autour de 5 modules distincts mais reliés — deux d'écoute (Concertation, Risques), deux de réponse (Communication, Engagements), un transverse (Actions, toujours rattachée à sa source). Des permissions réelles par rôle et par projet. Et l'IA seulement là où elle a une vraie valeur : suggérer, jamais décider.
✓
Résultat
Une application fonctionnelle, 17 projets réels d'infrastructure importés avec leurs jalons réglementaires et documents officiels, un score d'acceptabilité recalculé à chaque consultation, des permissions par rôle et par projet, un journal d'audit complet, 60 tests automatisés.
Problème résolu

L'acceptabilité au ressenti, pas au calcul

Un chef de projet sait rarement dire, un matin donné, si son projet est en train de gagner ou de perdre l'acceptation de son territoire — l'information existe, mais dispersée : qui s'est exprimé, avec quelle influence, sur quel ton ; quels risques restent ouverts ; quelle tendance se dessine. Sans un endroit unique pour la croiser, la décision reste au feeling.

Règle 80/20 — L'humain reste le décideur
L'IA suggère un sentiment et des sujets sur les échanges et les contributions du public consignés — rien n'est enregistré sans relecture et validation humaine. Le score d'acceptabilité, lui, n'est jamais une note libre : il se recalcule à partir de données réelles (position, influence, mobilisation des parties prenantes, criticité des risques, tendance récente), pour ne jamais confondre un chiffre calculé avec une impression.
Architecture

Comment ça fonctionne

🔐
Permissions par rôle et par projet
Auth.js (NextAuth v5) — Admin et Direction voient tout le portefeuille, un Responsable de projet ne gère que les siens, un Contributeur consulte et contribue, un Lecteur ne fait que consulter.
🗂️
5 modules reliés, pas 5 listes séparées
Concertation (échanges terrain), Risques & Opportunités, Communication (calendrier éditorial à 7 statuts), Engagements (promesses formelles), Actions — le seul module transverse, toujours rattaché à sa source.
🤖
Suggestion IA sur les échanges
Claude propose un sentiment et des sujets à partir du texte saisi sur un échange ou une contribution du public. L'utilisateur valide, corrige ou ignore — jamais enregistré automatiquement.
Claude API · Anthropic
📊
Score d'acceptabilité calculé
Combine la position/influence/mobilisation des parties prenantes, la criticité des risques ouverts et la tendance récente du projet — recalculé à chaque consultation, jamais saisi à la main.
🔔
Alertes proactives
Risque critique, échéance dépassée, partie prenante influente jamais recontactée, sujet récurrent sur plusieurs projets du portefeuille — remontées automatiquement, pas à découvrir au hasard d'une relecture.
Fonctionnalités

Ce que couvre l'outil, au-delà des 5 modules

Un pilotage réel ne s'arrête pas à la saisie — il faut pouvoir agir en masse, remonter un rapport, savoir qui porte quoi, et ne jamais perdre la trace d'un changement.

📅
Parcours réglementaire
Jalons CNDP typés (saisine, décision, concertation, enquête publique...) — chacun génère automatiquement sa propre checklist d'actions.
📄
Reporting PDF
Rapport de portefeuille et rapport par projet, bilan de la concertation — générés à la demande, pas maintenus à la main.
☑️
Actions en masse
Changer le statut ou supprimer plusieurs actions, risques ou engagements sélectionnés en un clic, plutôt qu'un par un.
📜
Journal d'audit complet
Chaque modification tracée — qui, quoi, quand, avant/après — sur les 5 modules et les parties prenantes.
👥
Équipe & charge de travail
Qui fait quoi, par personne et par projet — vue agrégée sur les actions, risques, engagements et communications assignés.
📎
Gestion documentaire
Documents catégorisés et rattachés à un échange, une communication, un engagement ou un jalon réglementaire précis.
🔍
Détection de doublons
Une même personne repérée sous deux fiches, ou déjà contact d'une autre partie prenante — signalé avant de recréer un doublon.
✎
Édition en ligne
Statut, priorité, échéance, responsable — modifiables directement depuis la liste, sans ouvrir un formulaire complet.
☎
Contacts en un clic
Appeler ou écrire à une partie prenante directement depuis le tableau — sans ouvrir sa fiche.
🙋
Demande de compte en libre-service
Un responsable de projet fait remonter un besoin d'accès sans jamais quitter l'application ni écrire un e-mail — l'admin valide, le rattachement à l'équipe du projet se fait tout seul.
💬
Brouillon de réponse au public
Sur une question ou un avis déposé, un brouillon de réponse s'appuie sur le message clé déjà validé — sans jamais inventer un fait ou un chiffre qui n'y figure pas.
📈
Reporting interactif
Chaque graphique de répartition (statuts, positions, canaux) renvoie vers la liste filtrée correspondante, en un clic.
Méthode

Un vrai portefeuille, pas une démo vide

Une application testée uniquement avec des données inventées ne prouve rien sur son utilisabilité réelle. Les 17 projets ont été importés à partir de sources publiques — sites de concertation officiels, décisions et avis de la CNDP, pages projet des porteurs — jamais improvisés.

✓ Discipline appliquée à l'import
Dates clés réglementaires, intervenants et documents officiels : uniquement quand une source publique les confirmait. Aucune partie prenante, aucun risque, aucune position n'a été inventé faute de base pour l'évaluer honnêtement — mieux vaut un champ vide qu'une donnée plausible mais fausse.
✓ Un cas réel — retrouver un élu, pas l'inventer
Une partie prenante affichait « Mairie » sans nom d'interlocuteur. Plutôt que de laisser un champ vide ou d'en inventer un, recherche du nom réel du maire, recoupé sur deux sources publiques indépendantes, avec sa date de mandat et sa réserve (élection municipale de mars 2026 non reconfirmée depuis) — puis ajouté comme contact nommé de l'institution, pas comme une nouvelle partie prenante avec une position politique qu'il n'y avait aucune base réelle pour évaluer.
Défis techniques

Les vrais problèmes à résoudre

Frontière serveur/client React franchie par erreur
Une fonction passée en prop d'une page serveur à un composant client — interdit en React Server Components, plantage en production (erreur #441). Détecté via les logs serveur (pas la console minifiée du navigateur) et corrigé avant tout déploiement réel.
Un projet réel à cheval sur deux communes
Une centrale solaire s'étendant sur deux communes limitrophes ne tenait pas dans un simple champ texte — migré en cours de route vers une vraie relation many-to-many (ProjectCommune), avec migration Prisma en deux temps pour ne perdre aucune donnée déjà en base.
Date affichée en heure locale, valeur stockée en UTC
Un libellé de date formaté avec le fuseau du navigateur pouvait afficher un jour différent de la valeur réellement stockée (UTC) — décalage silencieux dans un fuseau négatif, corrigé par un formatage explicite en UTC.
Un score calculé qui ne doit jamais mentir sur son absence
Sans aucune partie prenante ni risque renseigné, le score d'acceptabilité retombait sur sa base neutre (70) — un chiffre qui avait l'air d'une vraie évaluation. Ajout d'un indicateur explicite « pas encore de données » pour ne jamais confondre un calcul vide avec un résultat favorable.
Le bon contact masqué par le mauvais champ
Un contact nommé (ex. le maire d'une commune) pouvait être éclipsé dans l'affichage par un champ générique de la partie prenante laissé vide puis renseigné par erreur — corrigé en donnant toujours la priorité au contact le plus spécifique.
Import de données réelles sans rien inventer
17 projets réels importés avec leurs jalons réglementaires, intervenants et documents officiels — uniquement des faits publiquement sourcés (sites de concertation, décisions CNDP) ; jamais de partie prenante ou de risque fabriqué faute de base pour l'évaluer honnêtement.
PostgreSQL n'indexe pas une clé étrangère par défaut
Contrairement à une idée reçue, une colonne projectId n'est indexée automatiquement par aucun moteur PostgreSQL — or c'est le filtre le plus répété de toute l'application. Invisible avec 17 projets réels, mais un balayage séquentiel complet à chaque requête dès que le volume grossit. Audit exhaustif des 30 modèles du schéma, 13 index ajoutés sur les tables qui n'étaient pas déjà couvertes par une contrainte d'unicité existante.
Pas de débordement horizontal, mais illisible sur téléphone
Un en-tête « phrase de contexte + bouton(s) » sans flex-wrap ne débordait pas de l'écran (aucune alerte des vérifications automatiques classiques) — il comprimait le texte sur 4-5 lignes étroites à côté d'un bouton resté sur une seule ligne. Repéré en testant en vrai à 375px de large, pas en relisant le code.
Stack technique

Technologies utilisées

CatégorieOutil
FrameworkNext.js 16 · App Router · Server Actions
LangageTypeScript
Base de donnéesPrisma ORM · PostgreSQL (Neon)
AuthentificationAuth.js (NextAuth v5)
IAClaude API · Anthropic
InterfaceTailwind CSS · Base UI
CartographieLeaflet · OpenStreetMap
HébergementVercel
TestsVitest — 73 tests automatisés
Résultats

Ce que ça produit concrètement

17projets réels importés, jalons réglementaires et documents officiels sourcés publiquement
73tests automatisés sur les permissions, calculs et validations
5modules reliés — écoute, réponse, et un module transverse
0note d'acceptabilité saisie à la main — toujours calculée
12types d'alertes proactives sur le portefeuille
4types d'entités éditables en ligne, sans formulaire
5rôles avec permissions par projet, pas seulement globales
2rapports PDF générés à la demande — portefeuille et par projet
🖥 Interface — fiche projet, données de démonstration

Échantillon simplifié et stylisé (structure et couleurs fidèles, contenu allégé) — score d'acceptabilité, alertes, table des parties prenantes. L'application réelle est nettement plus complète. Données de démonstration, pas de portefeuille client.