[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"theme-db":3,"$fdi9Qh6a75lDIWlut1-vyzbkSRek5GZZebXZzLKGvyio":22,"$fKnz2vuX4bZz1LbUTiuFsvSZ3e07l5_5fqNYp4Tzdhi8":59,"$fYl-bKyJNKGlhg0RtVq1NlYujhAR6bGeu4umB0pU7LMY":140,"header-db":155,"footer-db":169,"megamenu":185},{"theme":4},{"colors":5,"typography":13,"ui":17,"defaultColorMode":21},{"primary":6,"secondary":7,"background":8,"foreground":9,"muted":10,"headerBg":11,"footerBg":12,"topBarBg":9,"topBarText":11},"#4F46E5","#0D9488","#F9FAFB","#111827","#6B7280","#ffffff","#020617",{"fontFamily":14,"fontUrl":15,"baseFontSize":16},"Inter, system-ui, sans-serif","https:\u002F\u002Ffonts.googleapis.com\u002Fcss2?family=Inter:wght@400;500;600;700&family=Playfair+Display:ital,wght@0,400;0,700;0,800;0,900;1,400;1,700&display=swap","16px",{"borderRadius":18,"contentWidth":19,"shadow":20},"lg","7xl",true,"light",{"title":23,"slug":24,"metaDescription":25,"category":26,"tags":27,"difficulty":33,"psVersions":34,"content":37,"faq":38,"tldr":54,"readingTime":55,"generatedAt":56,"publishDate":56,"relatedArticles":57,"sourceCategory":58},"Ajouter un champ date de livraison dans les commandes PrestaShop","ajouter-date-livraison-commande-prestashop","Guide complet pour ajouter et modifier une date de livraison par produit dans le détail des commandes PrestaShop via AJAX. Code, SQL et bonnes pratiques.","commandes",[26,28,29,30,31,32],"ajax","back-office","order-detail","personnalisation","adminorderscontroller","avance",[35,36],"1.7","8.x","\u003Ch2>Pourquoi ajouter une date de livraison par produit dans PrestaShop\u003C\u002Fh2>\n\u003Cp>Par défaut, PrestaShop gère un transporteur et une date d'expédition globale par commande, mais aucune date de livraison individuelle par ligne de produit. C'est un besoin fréquent pour les marchands qui vendent des produits avec des délais de livraison différents (meubles sur-mesure, produits frais, précommandes…).\u003C\u002Fp>\n\u003Cp>L'objectif de ce guide est d'ajouter un champ date de livraison éditable directement dans la vue détail d'une commande en back-office, avec mise à jour en temps réel via AJAX — sans rechargement de page.\u003C\u002Fp>\n\u003Ch2>Architecture de la solution\u003C\u002Fh2>\n\u003Cp>La mise en place repose sur trois briques :\u003C\u002Fp>\n\u003Col>\n\u003Cli>**Une table SQL dédiée** pour stocker la date de livraison par ligne de commande\u003C\u002Fli>\n\u003Cli>**Un traitement AJAX côté contrôleur** pour recevoir et enregistrer la modification\u003C\u002Fli>\n\u003Cli>**Un champ date dans le template** de la vue commande avec le JavaScript associé\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cblockquote>\u003Cp>\u003Cstrong>Bonne pratique PrestaShop 8.x :\u003C\u002Fstrong> Encapsulez toute cette logique dans un module plutôt que de modifier le cœur. Utilisez les hooks \u003Ccode>displayAdminOrderTabContent\u003C\u002Fcode> et \u003Ccode>actionValidateOrder\u003C\u002Fcode> pour rester compatible avec les mises à jour.\u003C\u002Fp>\u003C\u002Fblockquote>\n\u003Ch2>Étape 1 : Créer la table SQL\u003C\u002Fh2>\n\u003Cp>Commencez par créer une table qui lie chaque ligne de commande (\u003Ccode>id_order_detail\u003C\u002Fcode>) à une date de livraison :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-sql\">\nCREATE TABLE IF NOT EXISTS `ps_order_date_liv` (\n  `id_order_date_liv` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,\n  `id_order_detail` INT(11) UNSIGNED NOT NULL,\n  `date` DATE DEFAULT NULL,\n  `date_add` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n  `date_upd` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n  PRIMARY KEY (`id_order_date_liv`),\n  KEY `idx_order_detail` (`id_order_detail`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Placez cette requête dans la méthode \u003Ccode>install()\u003C\u002Fcode> de votre module pour qu'elle s'exécute automatiquement.\u003C\u002Fp>\n\u003Ch2>Étape 2 : Initialiser la date à la validation de commande\u003C\u002Fh2>\n\u003Cp>Utilisez le hook \u003Ccode>actionValidateOrder\u003C\u002Fcode> pour insérer automatiquement une ligne par produit commandé. Cela vous permet de pré-remplir la date à partir d'un champ personnalisé du produit si besoin :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\npublic function hookActionValidateOrder($params)\n{\n    $order = $params['order'];\n    $orderDetails = $order-&gt;getOrderDetailList();\n\n    foreach ($orderDetails as $detail) {\n        \u002F\u002F Optionnel : récupérer une date prévisionnelle depuis le produit\n        $product = new Product((int) $detail['product_id']);\n        $dateLiv = Validate::isDate($product-&gt;available_date) \n            ? $product-&gt;available_date \n            : null;\n\n        Db::getInstance()-&gt;insert('order_date_liv', [\n            'id_order_detail' =&gt; (int) $detail['id_order_detail'],\n            'date' =&gt; $dateLiv ? pSQL($dateLiv) : null,\n        ]);\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2>Étape 3 : Afficher le champ dans la vue commande\u003C\u002Fh2>\n\u003Ch3>PrestaShop 1.7\u003C\u002Fh3>\n\u003Cp>Sur PrestaShop 1.7, le template de la vue commande se trouve dans \u003Ccode>admin-dev\u002Fthemes\u002Fdefault\u002Ftemplate\u002Fcontrollers\u002Forders\u002Fhelpers\u002Fview\u002F\u003C\u002Fcode>. Vous pouvez overrider le template pour y ajouter une colonne dans le tableau des produits :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-html\">\n&lt;td class=\"dateLiv\"&gt;\n    &lt;input type=\"date\" \n           class=\"form-control input-date-liv\" \n           value=\"{$detail.date_liv|default:''}\" \n           data-id-order-detail=\"{$detail.id_order_detail}\" \u002F&gt;\n&lt;\u002Ftd&gt;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>PrestaShop 8.x (Symfony)\u003C\u002Fh3>\n\u003Cp>Sur PrestaShop 8.x, la page commande est entièrement portée sous Symfony. Privilégiez le hook \u003Ccode>displayAdminOrderTabContent\u003C\u002Fcode> pour injecter votre interface sans toucher au cœur :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\npublic function hookDisplayAdminOrderTabContent($params)\n{\n    $orderId = $params['id_order'];\n    $order = new Order((int) $orderId);\n    $orderDetails = $order-&gt;getOrderDetailList();\n\n    $datesLiv = [];\n    foreach ($orderDetails as $detail) {\n        $row = Db::getInstance()-&gt;getRow(\n            'SELECT `date` FROM `' . _DB_PREFIX_ . 'order_date_liv` \n             WHERE `id_order_detail` = ' . (int) $detail['id_order_detail']\n        );\n        $datesLiv[$detail['id_order_detail']] = $row ? $row['date'] : '';\n    }\n\n    $this-&gt;context-&gt;smarty-&gt;assign([\n        'orderDetails' =&gt; $orderDetails,\n        'datesLiv' =&gt; $datesLiv,\n    ]);\n\n    return $this-&gt;display(__FILE__, 'views\u002Ftemplates\u002Fadmin\u002Fdate_livraison.tpl');\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2>Étape 4 : Le JavaScript AJAX\u003C\u002Fh2>\n\u003Cp>Le JavaScript écoute les changements sur les champs date et envoie la nouvelle valeur au contrôleur en AJAX :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-javascript\">\n$(document).on('change', '.input-date-liv', function () {\n    var $input = $(this);\n    var idOrderDetail = $input.data('id-order-detail');\n    var dateLiv = $input.val();\n    var token = window.prestashop && window.prestashop.modules \n        ? window.prestashop.modules.currentToken \n        : token; \u002F\u002F PS 1.7 fallback\n\n    if (!idOrderDetail || !dateLiv) {\n        return;\n    }\n\n    $.ajax({\n        url: currentIndex,\n        type: 'POST',\n        dataType: 'json',\n        data: {\n            ajax: 1,\n            action: 'updateDateLivProd',\n            token: token,\n            id_order_detail: idOrderDetail,\n            date_liv: dateLiv\n        },\n        success: function (response) {\n            if (response.success) {\n                showSuccessMessage('Date de livraison mise à jour');\n            } else {\n                showErrorMessage('Erreur lors de la mise à jour');\n            }\n        },\n        error: function () {\n            showErrorMessage('Erreur de communication avec le serveur');\n        }\n    });\n});\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Cstrong>Point d'attention :\u003C\u002Fstrong> Assurez-vous que votre \u003Ccode>input\u003C\u002Fcode> se trouve bien dans un élément \u003Ccode>\u003Ctd class=\"dateLiv\">\u003C\u002Fcode> lui-même dans un \u003Ccode>\u003Ctr class=\"product-line-row\">\u003C\u002Fcode>. Si la structure HTML ne correspond pas au sélecteur jQuery, vous obtiendrez \u003Ccode>undefined\u003C\u002Fcode> en retour — c'est l'erreur la plus fréquente dans ce type d'implémentation.\u003C\u002Fp>\n\u003Ch2>Étape 5 : Le traitement côté contrôleur\u003C\u002Fh2>\n\u003Ch3>Version sécurisée (à utiliser en production)\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-php\">\npublic function ajaxProcessUpdateDateLivProd()\n{\n    $idOrderDetail = (int) Tools::getValue('id_order_detail');\n    $dateLiv = Tools::getValue('date_liv');\n\n    \u002F\u002F Validation des entrées\n    if (!$idOrderDetail || !Validate::isDate($dateLiv)) {\n        die(json_encode([\n            'success' =&gt; false,\n            'message' =&gt; 'Paramètres invalides',\n        ]));\n    }\n\n    \u002F\u002F Vérifier que la ligne de commande existe\n    $orderDetail = new OrderDetail($idOrderDetail);\n    if (!Validate::isLoadedObject($orderDetail)) {\n        die(json_encode([\n            'success' =&gt; false,\n            'message' =&gt; 'Ligne de commande introuvable',\n        ]));\n    }\n\n    $result = Db::getInstance()-&gt;update(\n        'order_date_liv',\n        ['date' =&gt; pSQL($dateLiv)],\n        'id_order_detail = ' . $idOrderDetail\n    );\n\n    die(json_encode([\n        'success' =&gt; (bool) $result,\n        'message' =&gt; $result ? 'Date mise à jour' : 'Échec de la mise à jour',\n    ]));\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>Ce qui ne va pas dans une approche naïve\u003C\u002Fh3>\n\u003Cp>Une requête SQL construite par concaténation directe expose votre boutique à des injections SQL :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\n\u002F\u002F ❌ DANGEREUX — Ne jamais faire ça\n$sql = 'UPDATE `' . _DB_PREFIX_ . 'order_date_liv` SET Date = ' . $date_liv . ' WHERE id_order_detail = ' . $id_order_detail;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Utilisez \u003Cstrong>toujours\u003C\u002Fstrong> les méthodes \u003Ccode>Db::getInstance()->update()\u003C\u002Fcode> ou au minimum \u003Ccode>pSQL()\u003C\u002Fcode> et le cast \u003Ccode>(int)\u003C\u002Fcode> pour protéger vos requêtes.\u003C\u002Fp>\n\u003Ch2>Étape 6 : Approche module complet (recommandée)\u003C\u002Fh2>\n\u003Cp>Voici la structure recommandée pour un module propre :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-\">\nmy_deliverydate\u002F\n├── my_deliverydate.php          # Classe principale + hooks\n├── sql\u002F\n│   ├── install.sql              # CREATE TABLE\n│   └── uninstall.sql            # DROP TABLE\n├── views\u002F\n│   ├── templates\u002F\n│   │   └── admin\u002F\n│   │       └── date_livraison.tpl\n│   └── js\u002F\n│       └── admin-order.js       # AJAX\n└── controllers\u002F\n    └── admin\u002F\n        └── AdminDeliveryDateController.php  # PS 8.x\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>En PrestaShop 8.x, si vous souhaitez ajouter un contrôleur AJAX propre plutôt que surcharger \u003Ccode>AdminOrdersController\u003C\u002Fcode>, déclarez-le comme service Symfony dans votre module :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-yaml\">\n# my_deliverydate\u002Fconfig\u002Froutes.yml\nmy_deliverydate_update_date:\n    path: \u002Fmy-deliverydate\u002Fupdate\n    methods: [POST]\n    defaults:\n        _controller: 'MyModule\\Controller\\Admin\\DeliveryDateController::updateAction'\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2>Déboguer l'AJAX : méthodologie pas à pas\u003C\u002Fh2>\n\u003Cp>Si votre appel AJAX ne fonctionne pas, procédez par élimination :\u003C\u002Fp>\n\u003Col>\n\u003Cli>**Testez la valeur JavaScript** — Remplacez temporairement la valeur dynamique par une chaîne fixe (`var DateLiv = \"ok\"`) et vérifiez que le contrôleur la reçoit\u003C\u002Fli>\n\u003Cli>**Vérifiez la console réseau** — Ouvrez l'onglet Network (XHR) de votre navigateur et inspectez la requête AJAX : URL, paramètres, réponse\u003C\u002Fli>\n\u003Cli>**Vérifiez le cache** — PrestaShop met en cache les fichiers JS. Faites `Ctrl+F5` ou videz le cache dans Paramètres avancés > Performances\u003C\u002Fli>\n\u003Cli>**Ajoutez un var_dump temporaire** — Dans votre méthode PHP, faites `var_dump(Tools::getValue('date_liv')); die();` pour confirmer la réception du paramètre\u003C\u002Fli>\n\u003Cli>**Vérifiez le sélecteur jQuery** — La cause n°1 d'un `undefined` est un sélecteur CSS qui ne correspond pas à la structure HTML réelle\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2>Récapitulatif des points critiques\u003C\u002Fh2>\n\u003Ctr>\u003Cth>Point\u003C\u002Fth>\u003Cth>Détail\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>Sécurité SQL\u003C\u002Fth>\u003Cth>Toujours utiliser `pSQL()` et `(int)` — jamais de concaténation directe\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>Validation\u003C\u002Fth>\u003Cth>Vérifier `Validate::isDate()` avant toute insertion\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>Cache JS\u003C\u002Fth>\u003Cth>Vider le cache navigateur ET le cache PrestaShop après modification\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>Structure HTML\u003C\u002Fth>\u003Cth>Les sélecteurs jQuery doivent correspondre exactement aux classes CSS\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>Réponse JSON\u003C\u002Fth>\u003Cth>Toujours retourner du JSON structuré avec un champ `success`\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>Module vs override\u003C\u002Fth>\u003Cth>Privilégier un module avec hooks pour la maintenabilité\u003C\u002Fth>\u003C\u002Ftr>",[39,42,45,48,51],{"q":40,"a":41},"Comment ajouter un champ personnalisé dans le détail d'une commande PrestaShop ?","Créez un module qui utilise le hook `displayAdminOrderTabContent` (PrestaShop 8.x) ou un override de template (PrestaShop 1.7). Stockez la donnée dans une table SQL dédiée liée à `id_order_detail`, et utilisez un appel AJAX pour la mise à jour en temps réel depuis le back-office.",{"q":43,"a":44},"Pourquoi mon appel AJAX renvoie undefined dans le back-office PrestaShop ?","C'est presque toujours un problème de sélecteur jQuery. Vérifiez que votre élément HTML possède bien la classe CSS attendue par le sélecteur (par exemple `td.dateLiv` dans un `tr.product-line-row`). Videz également le cache navigateur avec Ctrl+F5 car PrestaShop met en cache les fichiers JavaScript.",{"q":46,"a":47},"Faut-il modifier AdminOrdersController ou créer un module pour personnaliser les commandes ?","Créez toujours un module. Modifier directement AdminOrdersController fonctionne mais rend votre boutique impossible à mettre à jour. Un module avec les hooks appropriés (`actionValidateOrder`, `displayAdminOrderTabContent`) est maintenable et compatible avec les futures versions de PrestaShop.",{"q":49,"a":50},"Comment sécuriser une requête SQL AJAX dans PrestaShop ?","Utilisez `(int)` pour caster les identifiants numériques, `pSQL()` pour échapper les chaînes, et `Validate::isDate()` pour valider les dates. Privilégiez `Db::getInstance()->update()` avec un tableau de paramètres plutôt que la concaténation de requêtes SQL brutes. Vérifiez aussi que l'objet existe avec `Validate::isLoadedObject()` avant toute modification.",{"q":52,"a":53},"Comment gérer les dates de livraison différentes par produit dans une même commande PrestaShop ?","Créez une table `order_date_liv` avec une clé `id_order_detail` pour stocker une date par ligne de produit. À la validation de commande, pré-remplissez depuis le champ `available_date` du produit via le hook `actionValidateOrder`. En back-office, affichez un champ date éditable par ligne avec mise à jour AJAX.","Guide complet pour ajouter un champ date de livraison éditable par produit dans les commandes PrestaShop, avec table SQL dédiée, traitement AJAX sécurisé et approche module compatible 1.7 et 8.x.",6,"2026-03-21T12:55:43.000Z",[],"PrestaShop pour les développeurs",{"columns":60},[61,77,107,128],{"title":62,"links":63},"Plateforme",[64,68,71,74],{"label":65,"href":66,"external":67},"Offre Starter (2 500 €)","\u002Foffre-starter",false,{"label":69,"href":70,"external":67},"Devenir Ambassadeur","\u002Fambassadeur",{"label":72,"href":73,"external":67},"Modules PrestaShop","\u002Fmodules",{"label":75,"href":76,"external":20},"CodeMyShop.com","https:\u002F\u002Fcodemyshop.com",{"title":78,"links":79},"Le Synedre",[80,83,86,89,92,95,98,101,104],{"label":81,"href":82,"external":67},"L'histoire","\u002Fsynedre",{"label":84,"href":85,"external":67},"Constitution","\u002Fsynedre\u002Fconstitution",{"label":87,"href":88,"external":67},"L'équipe","\u002Fequipe",{"label":90,"href":91,"external":67},"Le réacteur en direct","\u002Freacteur",{"label":93,"href":94,"external":67},"Le Drill (entraînement)","\u002Fdrill",{"label":96,"href":97,"external":67},"Protocole de réunion","\u002Fsynedre\u002Freunion",{"label":99,"href":100,"external":67},"Les agents IA","\u002Fagents-ia",{"label":102,"href":103,"external":67},"La Conduite","\u002Fsynedre\u002Fconduite",{"label":105,"href":106,"external":67},"Charte plateforme","\u002Fsynedre\u002Fcharte",{"title":108,"links":109},"Ressources",[110,113,116,119,122,125],{"label":111,"href":112,"external":67},"Blog","\u002Fblog",{"label":114,"href":115,"external":67},"Academy","\u002Facademy",{"label":117,"href":118,"external":67},"Dictionnaire","\u002Fdictionnaire",{"label":120,"href":121,"external":67},"Expertise PrestaShop","\u002Fexpertise",{"label":123,"href":124,"external":67},"Flywheel","\u002Fflywheel",{"label":126,"href":127,"external":67},"Manifeste","\u002Fmanifeste",{"title":129,"links":130},"À propos",[131,134,137],{"label":132,"href":133,"external":67},"Alexandre Carette","\u002Fa-propos",{"label":135,"href":136,"external":67},"Dossier de presse","\u002Fpresse",{"label":138,"href":139,"external":67},"Contact","\u002Fcontact",{"academy":141,"blog":142,"expertise":154},[],[143,148,151],{"title":144,"url":145,"score":146,"type":147},"PrestaShop headless avec Nuxt 3 : pourquoi séparer back et front","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fprestashop-headless-nuxt-separation-front-back",1,"blog",{"title":149,"url":150,"score":146,"type":147},"PrestaShop headless : Nuxt 3, pas Next.js — le choix souverain","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fprestashop-headless-nuxt-nextjs-souverainete",{"title":152,"url":153,"score":146,"type":147},"Sylius rachète PrestaShop : ce que ça change pour vous","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fsylius-rachat-prestashop-headless-souverainete",[],{"header":156},{"logo":157,"topBar":162,"contactEmail":166,"features":167,"navBar":163},{"src":158,"alt":159,"text":132,"href":160,"class":161},"\u002Flogo-ac.svg","Alexandre Carette — Architecte E-commerce Souverain","\u002F","h-10 w-10",{"message":163,"showLanguages":67,"align":164,"languages":165},null,"left",[],"contact@alexandrecarette.fr",{"showSearch":67,"showWishlist":67,"showLogin":20,"showContact":67,"showCart":67,"stickyHeader":20,"headerLayout":168},"inline",{"footer":170},{"theme":171,"description":163,"hours":163,"logo":172,"contact":173,"social":174,"bottomBar":184},"dark",{"src":158,"href":160,"alt":132},{"email":163,"phone":163,"address":163,"cta":163},[175,178,181],{"platform":176,"href":177,"label":176},"linkedin","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Falexandre-carette\u002F",{"platform":179,"href":180,"label":179},"malt","https:\u002F\u002Fwww.malt.fr\u002Fprofile\u002Falexandrecarette",{"platform":182,"href":183,"label":182},"github","https:\u002F\u002Fgithub.com\u002Fprest4cafe",{"copyright":163},{"items":186},[187,195,200,206,214,222,228,233],{"id":188,"type":189,"label":190,"href":121,"icon":163,"description":163,"badge":163,"groupTitle":163,"style":163,"gridColumns":163,"cssClass":163,"psCategoryId":163,"showPsChildren":67,"position":192,"children":193,"psChildren":194},41,"link",{"fr":191},"Expertise",0,[],[],{"id":196,"type":189,"label":197,"href":112,"icon":163,"description":163,"badge":163,"groupTitle":163,"style":163,"gridColumns":163,"cssClass":163,"psCategoryId":163,"showPsChildren":67,"position":146,"children":198,"psChildren":199},42,{"fr":111},[],[],{"id":201,"type":189,"label":202,"href":73,"icon":163,"description":163,"badge":163,"groupTitle":163,"style":163,"gridColumns":163,"cssClass":163,"psCategoryId":163,"showPsChildren":67,"position":203,"children":204,"psChildren":205},43,{"fr":72},2,[],[],{"id":207,"type":189,"label":208,"href":210,"icon":163,"description":163,"badge":163,"groupTitle":163,"style":163,"gridColumns":163,"cssClass":163,"psCategoryId":163,"showPsChildren":67,"position":211,"children":212,"psChildren":213},44,{"fr":209},"Outils IA","\u002Foutils-ia",3,[],[],{"id":215,"type":189,"label":216,"href":66,"icon":163,"description":163,"badge":163,"groupTitle":163,"style":218,"gridColumns":163,"cssClass":163,"psCategoryId":163,"showPsChildren":67,"position":219,"children":220,"psChildren":221},45,{"fr":217},"Offre Starter ✨",{"highlight":20},4,[],[],{"id":223,"type":189,"label":224,"href":115,"icon":163,"description":163,"badge":163,"groupTitle":163,"style":163,"gridColumns":163,"cssClass":163,"psCategoryId":163,"showPsChildren":67,"position":225,"children":226,"psChildren":227},46,{"fr":114},5,[],[],{"id":229,"type":189,"label":230,"href":133,"icon":163,"description":163,"badge":163,"groupTitle":163,"style":163,"gridColumns":163,"cssClass":163,"psCategoryId":163,"showPsChildren":67,"position":55,"children":231,"psChildren":232},47,{"fr":129},[],[],{"id":234,"type":189,"label":235,"href":139,"icon":163,"description":163,"badge":163,"groupTitle":163,"style":163,"gridColumns":163,"cssClass":163,"psCategoryId":163,"showPsChildren":67,"position":236,"children":237,"psChildren":238},48,{"fr":138},7,[],[]]