🤖 IA : Comment j’ai utilisé une IA pour créer le module de commandes groupées dans MyClub

Créé par Jean-Emmanuel Bissey le 04/02/2026 Publié

Dans l’évolution de MyClub, j’ai récemment ajouté un module de commandes groupées.
Plutôt que de repartir de zéro, j’ai choisi une approche pragmatique : m’appuyer sur un module existant — les sondages — et utiliser une IA comme assistant de développement pour accélérer la mise en place.

Voici un retour d’expérience concret, étape par étape, avec ce qui a bien fonctionné… et les ajustements nécessaires en cours de route.


1) Un cas “facile” pour tester l’IA

Le module de commandes groupées était un bon candidat pour une expérimentation avec une IA, car la logique fonctionnelle était très proche des sondages déjà présents dans MyClub :

  • une question,
  • plusieurs options,
  • des réponses utilisateurs,
  • une date de clôture,
  • des règles de visibilité.

Autrement dit : beaucoup de structure existante, mais avec un vocabulaire et quelques comportements différents.

Plutôt que de lui donner une vague description, je lui ai fourni directement des fichiers réels du projet :

  • app/config/routes/Survey.php
  • app/modules/Article/ArticleController.php
  • /app/modules/Article/views/survey_add.latte
  • /app/modules/Article/views/survey_results.latte

Ainsi que le schéma des nouvelles tables SQL :

CREATE TABLE "Order" ( "Id" INTEGER, "Question" TEXT NOT NULL, "Options" TEXT NOT NULL, "IdArticle" INTEGER NOT NULL, "ClosingDate" TEXT NOT NULL, "Visibility" TEXT NOT NULL, PRIMARY KEY("Id"), FOREIGN KEY("IdArticle") REFERENCES "Article"("Id") );
CREATE TABLE "OrderReply" ( "Id" INTEGER, "IdPerson" INTEGER NOT NULL, "IdOrder" INTEGER NOT NULL, "Answers" TEXT NOT NULL, "LastUpdate" TEXT NOT NULL, PRIMARY KEY("Id"), FOREIGN KEY("IdOrder") REFERENCES "Order"("Id"), FOREIGN KEY("IdPerson") REFERENCES "Person"("Id") );

2) Première génération : une base complète

Dès la première réponse, l’IA a généré :

  • Order.php (routes)
  • OrderController.php
  • order_add.latte
  • order_results.latte
  • orderAdd.js

Elle a également listé les éléments à connecter :

  • OrderVisibility
  • OrderDataHelper
  • autorisations
  • factory contrôleurs
  • enregistrement des routes

La base était très solide… mais nécessitait évidemment validation et ajustements.


3) Adaptations côté PHP

L’enum de visibilité

Initialement copié des sondages, il parlait de « voters ».
Or ici il s’agit de membres qui commandent.

Renommage :

  • Orderers
  • OrderersAfterClosing

Comme la table était vide, les valeurs stockées ont aussi été modifiées.


Création du DataHelper

Mapping automatique très propre :

  • Survey → Order
  • Reply → OrderReply
  • IdSurvey → IdOrder

L’IA a trébuché sur un point de détail :

👉 Order est un mot réservé SQL
→ obligation d’utiliser "Order" dans les requêtes.


  • Autorisations
  • La fonction canPersonReadOrderResults() a été générée sur le modèle des sondages avec :
  • renommage des variables

  • nouvelles valeurs de visibilité

  • mêmes règles d’accès


4) Passage côté JavaScript et transformation en module de commandes

Création de OrderReplyManager.js

Généré à partir de SurveyReplyManager.js avec :

  • IDs DOM renommés
  • API /api/order/reply
  • champs order_answers / order_id
  • textes adaptés (« Commander »)
  • suppression d’un paramètre inutilisé présent dans le code original

Méthode showOrderReplyForm()

Adaptations :

  • Survey → Order
  • JSON surveyorder
  • message : « Aucune commande trouvée »

Point d’attention : vérifier la méthode get_() pour fonctionner avec OrderReply.


Transformation majeure : quantités au lieu de choix

Les cases à cocher ont été remplacées par des champs numériques.

Structure des réponses :

  • avant : tableau de choix
  • après : objet { article: quantité }

Modifications principales

buildOrderForm() : pré-remplissage des quantités précédentes

handleSubmit() :

  • collecte des champs numériques
  • validation quantité > 0

Conséquences :

  • stockage JSON objet
  • adaptation du contrôleur et de la vue des résultats

Ajustements UI

  • modale élargie (modal-lg)
  • libellé extensible
  • champ numérique compact

Simplification des résultats

Suppression :

  • barres de progression
  • pourcentages

Affichage final :

👉 article + quantité totale : le contrôleur a été modifié pour sommer les quantités au lieu de compter des votes.


Corrections techniques rencontrées

stdClass vs tableau

Erreur :

in_array(): Argument #2 must be of type array, stdClass given

Cause : json_decode() retourne un objet.

Solution idéale :

json_decode($reply->Answers, true);

Solution temporaire : syntaxe objet dans la vue.


Affichage des commandants

Boucle adaptée :

  • { article: quantité }
  • affichage uniquement si quantité > 0
  • format : Article (quantité)

Amélioration finale : numérotation des articles

Problème :

  • libellés longs répétés plusieurs fois

Solution :

  • numéro chronologique dans une pastille rouge
  • libellé complet affiché une seule fois
  • ailleurs : numéro + quantité

Résultat :

  • interface plus lisible
  • affichage compact
  • meilleure compréhension globale

5) Ce que l’IA a bien anticipé / ce que j’ai dû corriger

👍 Ce que l’IA a très bien fait

  • reproduire l’architecture existante
  • générer rapidement tous les fichiers nécessaires
  • proposer des mappings cohérents
  • accélérer les tâches répétitives

⚠️ Ce que j’ai dû ajuster moi-même

  • le vocabulaire métier (commande vs vote)
  • détecter certains pièges techniques (mot réservé SQL)
  • les transformations fonctionnelles (quantités)
  • les règles d’affichage spécifiques
  • la structure réelle des données JSON
  • les subtilités PHP (stdClass vs array)
  • les améliorations UX finales

En pratique, l’IA s’est comportée comme :

👉 un développeur junior extrêmement rapide mais nécessitant validation, corrections et décisions humaines.


Conclusion

L’IA ne m’a pas remplacé, elle m’a surtout permis de :

  • d'aller beaucoup plus vite, (14 échanges sur une journée pour ajouter/modifier plus de 1000 lignes de code)
  • éviter la duplication manuelle,
  • me concentrer sur les choix métier et l’intégration.

La clé du succès a été de lui fournir :

  • des fichiers réels,
  • des modèles existants,
  • un contexte précis.

Plus le contexte est concret, plus le résultat est pertinent.