Réalisations

Mission en cours · depuis 2023

SeineYonne, du champ au silo

Pour la coopérative agricole SeineYonne, je fais évoluer depuis 2023 l’application de gestion qui suit les exploitations des adhérents, leurs cultures, les contrats qualité et la collecte jusqu’au silo. De nouvelles fonctions métier, et en même temps une application plus rapide, plus cohérente et plus simple à faire évoluer.

  • ≈ 40 %des évolutions du projet depuis 2023, 1er contributeur sur 8
  • 10 h → 10 spour reporter le paramétrage des silos d’une année sur l’autre
  • 92 %du code d’origine réécrit ou supprimé
  • 80 %de mon temps, du front à la base de données
Application de gestion · fiche adhérent
La fiche d’un adhérent : chiffres clés de l’année, onglets par thème et synthèse. Illustration simplifiée, données fictives.

Le contexte

Un métier riche, longtemps géré sous Excel

Une coopérative agricole accompagne des centaines d’exploitations, année après année : ce qui est semé et où, les contrats aux cahiers des charges exigeants (agriculture biologique, industriels de l’agroalimentaire), les justificatifs à fournir, puis la collecte des récoltes jusqu’aux silos.

Chaque contrat a ses règles, chaque saison ses échéances. L’application réunit tout cela dans un seul outil, utilisé par les techniciens, les responsables de silo, les équipes qualité et les adhérents.

Au sein d’une équipe produit de huit personnes, en lien direct avec les équipes métier, j’ai rejoint le projet en février 2023. Cette application occupe 80 % de mon temps, du front aux vues PostgreSQL et aux endpoints Symfony qui l’alimentent. Le reste va aux autres applications de la coopérative.

  1. Champ
  2. Exploitation
  3. Contrats
  4. Collecte
  5. Silo

Le point de départ

Une application qui avait grandi vite

Comme beaucoup d’applications construites pour répondre rapidement au besoin, l’application avait accumulé, à mon arrivée, plusieurs bibliothèques d’interface, du code dupliqué et un outillage minimal. Plutôt qu’une refonte qui aurait gelé les livraisons, j’ai amélioré l’application au fil de l’eau, à chaque évolution.

  • Une interface unifiée

    En 2023

    Cinq bibliothèques d’interface coexistaient (Syncfusion, Bootstrap, Font Awesome, styles maison…), certaines chargées deux fois.

    Aujourd’hui

    Une seule bibliothèque de composants (MUI) et Tailwind pour la mise en page, un design system commun, une navigation adaptée au mobile et un mode sombre.

    Syncfusion, présent dans 130 fichiers à son maximum, a été retiré entièrement.

  • Moins de code pour les mêmes fonctions

    En 2023

    Des pages d’administration copiées-collées, des fichiers de 600 à 800 lignes et du code qui ne servait plus.

    Aujourd’hui

    Des composants communs (boutons, fenêtres, grilles, listes de choix) utilisés dans des centaines de fichiers, un modèle unique de page d’administration et de grands nettoyages.

    Des pages d’administration deux à trois fois plus courtes, plus de 17 000 lignes de code mort supprimées.

  • Une architecture lisible

    En 2023

    Des composants qui interrogeaient directement la base de données, un fichier principal et un fichier de routes de plusieurs centaines de lignes, des droits codés en dur.

    Aujourd’hui

    Une couche d’accès aux données commune, des routes organisées par domaine, des permissions stockées en base et administrables.

    Un seul composant accède encore directement à la base, contre 28 au départ.

  • Un socle moderne et outillé

    En 2023

    Create React App et React 17, aucune règle de code appliquée, pas de TypeScript, deux tests.

    Aujourd’hui

    Vite et React 19, un formateur et linter appliqué à chaque commit, TypeScript, des tests sur les règles métier, une documentation technique et des outils d’assistance IA partagés.

    Des montées de version par étapes, sans bloquer les livraisons, et une application qui se met à jour d’elle-même à chaque mise en production.

Performances

Des traitements de plusieurs heures ramenés à quelques secondes

Côté navigateur comme côté serveur, j’ai traqué les requêtes inutiles, regroupé les envois et réécrit les calculs les plus lents. Chaque optimisation est vérifiée sur les volumes réels, des centaines de milliers de lignes, avant sa mise en production.

  • 10 h → 10 s

    Passage à l’année suivante

    Jusqu’à 740 000 lignes de paramétrage des silos à reporter chaque année : une seule requête au lieu d’environ 1,5 million d’allers-retours avec la base de données.

  • × 1 400

    Tableaux de pilotage

    La page du chiffre d’affaires d’une année sur l’autre se charge jusqu’à 1 400 fois plus vite, avec des résultats vérifiés à l’identique.

  • 2 requêtes

    Préparation d’une nouvelle saison

    Elle envoyait des milliers de demandes au serveur, l’une après l’autre. Elles sont désormais regroupées en deux envois.

  • 250 → 5

    Saisie en masse

    Afficher 50 lignes à modifier demandait jusqu’à 250 requêtes, il en faut 5. À l’enregistrement, seules les valeurs modifiées sont envoyées.

  • 1 requête

    Fini les appels en boucle

    La fiche d’un adhérent interrogeait le serveur toutes les 3 secondes tant qu’elle restait ouverte, l’accueil 40 fois en 20 secondes. Une seule demande suffit.

  • 1 fois

    Contrôles d’accès en base

    Les droits de chaque utilisateur sont calculés une seule fois par requête, plutôt que pour chaque ligne lue : chacun ne voit que ses données, sans ralentir l’application.

Au-delà du code

Construire avec les équipes, pas seulement pour elles

  • Partir du terrain

    Lors d’un atelier avec des utilisateurs, je les ai observés chercher une information. La recherche des pages de l’application est née de cette observation.

  • Construire avec le métier

    Des règles définies avec les équipes, des barèmes validés avec elles et une démonstration en vidéo avant et après chaque développement.

  • Savoir renoncer

    Un développement arrêté quand il n’était plus utile, une fonction retirée parce que personne ne s’en servait : moins de code à maintenir.

  • Une équipe qui avance ensemble

    Pair programming, présentations internes, revues de code et documentation partagée.

  • Accompagner les utilisateurs

    Un suivi des erreurs en production chaque semaine, et un outil pour voir l’application comme un utilisateur et reproduire son problème.

  • Rendre compte

    Un compte rendu chaque jour et un résumé chaque mois : le client sait toujours où en est son application.

Ce que j’ai construit

Des outils pensés pour le quotidien des équipes

Application de gestion · suivi des justificatifs
Le suivi des justificatifs attendus, par responsable et par type de document. Illustration simplifiée, données fictives.
Application de gestion · générateur de formulaires
L’édition d’un formulaire : champs à glisser, champs propres à l’application et règle d’affichage conditionnelle. Illustration simplifiée, données fictives.
  • Une saisie guidée

    Des formulaires qui appliquent d’eux-mêmes les règles de chaque contrat, avec une modification en masse pour aller vite.

  • Les justificatifs

    Dépôt, réutilisation d’une année sur l’autre, génération automatique et suivi des pièces demandées par les partenaires.

  • Des formulaires sans développeur

    Un éditeur visuel pour créer des questionnaires, les envoyer et suivre les réponses.

  • Un espace documentaire

    Dossiers partagés et personnels, droits d’accès, versions successives et aperçu des fichiers.

  • Une place de marché interne

    Des offres publiées par la coopérative, des commandes passées en ligne et leur suivi.

  • Des équipes autonomes

    Des écrans d’administration au lieu de manipulations en base, des droits réglables par les administrateurs, des invitations et un support gérés sans développeur.

Zoom sur le générateur de formulaires

Questionnaires annuels, collecte de documents réglementaires : les équipes créent elles-mêmes leurs formulaires, les envoient et suivent les réponses, sans faire appel à un développeur. Ils ont remplacé peu à peu les outils tiers de formulaires, et les agriculteurs déposent eux-mêmes leurs documents réglementaires par un lien sécurisé.

Tout repose sur un standard ouvert, JSON Schema. Les besoins propres à l’application passent par des plugins : par exemple un champ qui vérifie un fichier officiel avant de l’envoyer, et prévient s’il est déjà à jour.

  • Glisser-déposer pour ajouter et réordonner les champs, y compris dans des groupes.
  • Champs conditionnels affichés selon la réponse donnée à une autre question.
  • Annuler et rétablir chaque modification, pour expérimenter sans crainte.
  • Aperçu du formulaire tel que le verra l’adhérent.
  • Brouillons pour reprendre une saisie plus tard.
  • Champs pré-remplis ou en lecture seule, avec des valeurs par défaut.
  • Noms techniques générés à partir du libellé, et descriptions en Markdown.
  • Campagnes d’envoi par e-mail, avec des formulaires publics et le suivi des réponses.

Zoom sur un outil d’aide à la décision

Pour certaines cultures, la coopérative doit évaluer un risque agricole parcelle par parcelle (ici, une céréale qui se couche avant la récolte) et le justifier auprès de ses partenaires.

J’ai conçu l’ensemble de la fonction, de la base de données à l’écran : une saisie des critères avec modification groupée, le calcul automatique d’une note et d’un statut, la génération du justificatif et un tableau de bord pour toute la coopérative. La même architecture a ensuite servi à une deuxième analyse.

Application de gestion · aide à la décision
Des critères saisis ligne par ligne, une note calculée et le statut qui en découle. Illustration simplifiée, données fictives.

React · TypeScript · Vite · MUI X (DataGrid Premium, graphiques) · Tailwind CSS · TanStack Query · React Hook Form · JSON Schema · Supabase / PostgreSQL · Symfony · Jest · Biome · GitLab CI · Netlify · Bugsnag

Autour de l’application

Du front à la base de données, et au-delà

  • Back-end de l’application

    Les données derrière les écrans

    Plus de 400 évolutions côté serveur : vues PostgreSQL pour les tableaux de pilotage, contrôles d’accès en base, tables des nouvelles fonctions, endpoints Symfony pour les exports et la génération de documents.

  • Application de collecte · Next.js

    La collecte et les silos

    L’application de la collecte des récoltes : gestion des silos, des stocks et des transferts, droits d’accès par site et connexion « en tant que » pour aider les utilisateurs.

  • Pour toute l’équipe

    Sécurité, outillage et autres applications

    Environ 70 % de vulnérabilités en moins sur trois applications de la coopérative, des contributions à l’intégration continue partagée et des outils d’assistance IA communs (Claude Code).

Ma façon de travailler

La technique au service de l’utilisateur

  • Comprendre le métier avant de coder

    Saisons, parcelles, contrats, cahiers des charges : je traduis des règles agricoles complexes, souvent gérées sous Excel, en écrans que les techniciens utilisent au quotidien.

  • Soigner chaque détail

    Des pages rapides, à commencer par les plus utilisées, un libellé clair, un cas particulier prévu : ces petits détails font la différence pour ceux qui utilisent l’outil toute la journée.

  • Penser à la suite

    Chaque évolution est l’occasion d’assainir le code autour. L’application reste simple à faire évoluer, et le socle avance par étapes pendant que les nouvelles fonctions sortent.

  • Outiller l’équipe

    Documentation technique, conventions, composants partagés et outils d’assistance IA communs : ce qui fait gagner du temps à une personne doit en faire gagner à toute l’équipe.