🤖 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.phpapp/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.phporder_add.latteorder_results.latteorderAdd.js
Elle a également listé les éléments à connecter :
OrderVisibilityOrderDataHelper- 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 :
OrderersOrderersAfterClosing
Comme la table était vide, les valeurs stockées ont aussi été modifiées.
Création du DataHelper
Mapping automatique très propre :
Survey → OrderReply → OrderReplyIdSurvey → 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
survey→order - 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.