[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"theme-db":3,"$fyTGPovkq6WVHSgbriyfnBkPnDKPCf_POuiO8N9lb42M":22,"$fKnz2vuX4bZz1LbUTiuFsvSZ3e07l5_5fqNYp4Tzdhi8":62,"header-db":143,"megamenu":157,"$fbXLa3cZMP0W41yhATMe1EOMAFfTtfUT-bJ2B3xQxeOo":212,"footer-db":226},{"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":57,"readingTime":58,"generatedAt":59,"publishDate":59,"relatedArticles":60,"sourceCategory":61},"Mettre à jour le stock depuis hookActionValidateOrder dans PrestaShop","mettre-a-jour-stock-hookactionvalidateorder-prestashop","Comment modifier le stock produit via hookActionValidateOrder dans PrestaShop : classe Db, ObjectModel, erreurs courantes et bonnes pratiques.","developpement",[28,29,30,31,32],"hook","stock","module","SQL","actionValidateOrder","intermediaire",[35,36],"1.7","8.x","\u003Ch2>Pourquoi modifier le stock au moment de la validation de commande ?\u003C\u002Fh2>\n\u003Cp>Le hook \u003Ccode>actionValidateOrder\u003C\u002Fcode> se déclenche immédiatement après qu'une commande est validée par PrestaShop. C'est un point d'entrée stratégique pour les développeurs de modules qui ont besoin d'appliquer une logique métier personnalisée sur les stocks : synchronisation avec un ERP, gestion de stock multi-entrepôt, réservation conditionnelle, ou encore mise à jour de quantités physiques calculées.\u003C\u002Fp>\n\u003Cp>Pourtant, beaucoup de développeurs se heurtent à des requêtes \u003Ccode>UPDATE\u003C\u002Fcode> qui échouent silencieusement depuis ce hook. Le problème est rarement lié au hook lui-même, mais plutôt à la façon dont la requête SQL est construite.\u003C\u002Fp>\n\u003Ch2>L'erreur classique : écrire du SQL brut au lieu d'utiliser la classe Db\u003C\u002Fh2>\n\u003Cp>Une erreur fréquente consiste à écrire des requêtes SQL directement avec \u003Ccode>mysql_query()\u003C\u002Fcode> ou \u003Ccode>PDO\u003C\u002Fcode> en contournant complètement l'abstraction de PrestaShop. Cela pose plusieurs problèmes :\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Le préfixe de table (`ps_`) n'est pas géré automatiquement\u003C\u002Fli>\n\u003Cli>Les connexions à la base de données peuvent entrer en conflit avec celles de PrestaShop\u003C\u002Fli>\n\u003Cli>Les mécanismes de cache interne ne sont pas invalidés\u003C\u002Fli>\n\u003Cli>Aucune protection contre les injections SQL\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>La bonne approche : `Db::getInstance()->update()`\u003C\u002Fh3>\n\u003Cp>PrestaShop fournit la classe \u003Ccode>Db\u003C\u002Fcode> qui encapsule toutes les opérations SQL. La méthode \u003Ccode>update()\u003C\u002Fcode> gère automatiquement le préfixe de table, l'échappement des valeurs et la construction de la clause \u003Ccode>WHERE\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\n$db = \\Db::getInstance();\n\n$db-&gt;update('stock_available', [\n    'physical_quantity' =&gt; 100,\n    'reserved_quantity' =&gt; 1,\n    'quantity'          =&gt; 99,\n], 'id_product_attribute = 352711');\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Cstrong>Points importants :\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Le premier paramètre est le nom de la table **sans le préfixe** (`stock_available` et non `ps_stock_available`)\u003C\u002Fli>\n\u003Cli>Le deuxième paramètre est un tableau associatif `colonne => valeur`\u003C\u002Fli>\n\u003Cli>Le troisième paramètre est la clause `WHERE` sous forme de chaîne\u003C\u002Fli>\n\u003Cli>Attention à ne pas dupliquer de colonnes dans le tableau — PHP écrasera silencieusement la première occurrence\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2>Erreurs courantes qui font échouer la requête\u003C\u002Fh2>\n\u003Ch3>1. Colonnes dupliquées dans le tableau\u003C\u002Fh3>\n\u003Cp>Si vous passez deux fois la même clé dans un tableau PHP, seule la dernière valeur est conservée :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\n\u002F\u002F ❌ BUG : 'reserved_quantity' apparaît deux fois\n$data = [\n    'physical_quantity'  =&gt; 100,\n    'reserved_quantity'  =&gt; 1,\n    'quantity'           =&gt; 100,\n    'reserved_quantity'  =&gt; 0,  \u002F\u002F Écrase la valeur précédente !\n];\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Cette erreur est particulièrement sournoise car PHP ne génère aucun warning.\u003C\u002Fp>\n\u003Ch3>2. Colonnes NOT NULL sans valeur par défaut\u003C\u002Fh3>\n\u003Cp>La table \u003Ccode>ps_stock_available\u003C\u002Fcode> contient des colonnes obligatoires. Si votre requête est en réalité un \u003Ccode>INSERT\u003C\u002Fcode> déguisé (par exemple via \u003Ccode>ON DUPLICATE KEY UPDATE\u003C\u002Fcode>), vous devez fournir toutes les colonnes \u003Ccode>NOT NULL\u003C\u002Fcode> sans valeur par défaut :\u003C\u002Fp>\n\u003Cul>\n\u003Cli>`id_product`\u003C\u002Fli>\n\u003Cli>`id_product_attribute`\u003C\u002Fli>\n\u003Cli>`id_shop` (ou `id_shop_group`)\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Pour diagnostiquer, inspectez la structure de la table :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-sql\">\nDESCRIBE ps_stock_available;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Vérifiez la colonne \u003Ccode>Null\u003C\u002Fcode> et \u003Ccode>Default\u003C\u002Fcode> pour chaque champ.\u003C\u002Fp>\n\u003Ch3>3. Mauvais id_stock_available\u003C\u002Fh3>\n\u003Cp>La table \u003Ccode>ps_stock_available\u003C\u002Fcode> associe un \u003Ccode>id_stock_available\u003C\u002Fcode> unique à chaque combinaison \u003Ccode>id_product\u003C\u002Fcode> + \u003Ccode>id_product_attribute\u003C\u002Fcode> + \u003Ccode>id_shop\u003C\u002Fcode>. Utiliser directement \u003Ccode>id_product_attribute\u003C\u002Fcode> dans le \u003Ccode>WHERE\u003C\u002Fcode> fonctionne, mais assurez-vous que la valeur existe réellement dans la table.\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\n\u002F\u002F Vérifier que la déclinaison existe dans stock_available\n$exists = (bool) Db::getInstance()-&gt;getValue(\n    'SELECT id_stock_available \n     FROM ' . _DB_PREFIX_ . 'stock_available \n     WHERE id_product_attribute = ' . (int) $idProductAttribute\n);\n\nif (!$exists) {\n    PrestaShopLogger::addLog(\n        'Stock update failed: id_product_attribute ' . $idProductAttribute . ' not found',\n        2 \u002F\u002F severity: warning\n    );\n    return;\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2>L'approche recommandée : utiliser l'ObjectModel StockAvailable\u003C\u002Fh2>\n\u003Cp>Plutôt que de manipuler la base directement, PrestaShop propose la classe \u003Ccode>StockAvailable\u003C\u002Fcode> qui gère toute la logique métier associée (cache, hooks, multiboutique) :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\nuse PrestaShop\\PrestaShop\\Adapter\\StockManager;\n\n\u002F\u002F Méthode simple pour modifier la quantité\nStockAvailable::setQuantity($idProduct, $idProductAttribute, $newQuantity, $idShop);\n\n\u002F\u002F Ou via l'ObjectModel pour un contrôle plus fin\n$stockId = StockAvailable::getStockAvailableIdByProductId($idProduct, $idProductAttribute, $idShop);\n\nif ($stockId) {\n    $stock = new StockAvailable($stockId);\n    $stock-&gt;physical_quantity = 100;\n    $stock-&gt;reserved_quantity = 1;\n    $stock-&gt;quantity = 99;\n    $stock-&gt;update();\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Cstrong>Avantages de l'ObjectModel :\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Invalidation automatique du cache\u003C\u002Fli>\n\u003Cli>Respect des règles multiboutique\u003C\u002Fli>\n\u003Cli>Déclenchement des hooks associés (`actionUpdateQuantity`)\u003C\u002Fli>\n\u003Cli>Validation des données avant écriture\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2>Implémenter correctement le hook actionValidateOrder\u003C\u002Fh2>\n\u003Ch3>Enregistrer le hook dans votre module\u003C\u002Fh3>\n\u003Cp>Première cause d'échec : le hook n'est tout simplement pas enregistré. Vérifiez votre méthode \u003Ccode>install()\u003C\u002Fcode> :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\npublic function install()\n{\n    return parent::install()\n        && $this-&gt;registerHook('actionValidateOrder');\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Après installation, confirmez l'enregistrement en back-office : \u003Cstrong>Modules > Positions\u003C\u002Fstrong> et recherchez \u003Ccode>actionValidateOrder\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Ch3>Récupérer les données de la commande\u003C\u002Fh3>\n\u003Cp>Le hook fournit un tableau de paramètres contenant toutes les informations nécessaires :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\npublic function hookActionValidateOrder($params)\n{\n    \u002F** @var Order $order *\u002F\n    $order = $params['order'];\n    \n    \u002F** @var Cart $cart *\u002F\n    $cart = $params['cart'];\n    \n    $products = $order-&gt;getProducts();\n    \n    foreach ($products as $product) {\n        $idProduct = (int) $product['id_product'];\n        $idProductAttribute = (int) $product['product_attribute_id'];\n        $quantityOrdered = (int) $product['product_quantity'];\n        \n        \u002F\u002F Votre logique de mise à jour du stock ici\n        $this-&gt;updateCustomStock($idProduct, $idProductAttribute, $quantityOrdered);\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2>Déboguer une requête qui échoue silencieusement\u003C\u002Fh2>\n\u003Cp>PrestaShop ne lève pas d'exception par défaut sur une erreur SQL. Pour identifier le problème :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\n$db = Db::getInstance();\n\n$result = $db-&gt;update('stock_available', [\n    'quantity' =&gt; 99,\n], 'id_product_attribute = ' . (int) $idProductAttribute);\n\nif (!$result) {\n    \u002F\u002F Récupérer l'erreur MySQL\n    $error = $db-&gt;getMsgError();\n    $errno = $db-&gt;getNumberError();\n    \n    PrestaShopLogger::addLog(\n        \"Stock update error [{$errno}]: {$error}\",\n        3 \u002F\u002F severity: error\n    );\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Vous pouvez également tester votre requête directement dans phpMyAdmin pour obtenir un retour d'erreur immédiat de MySQL, ce qui permet d'identifier rapidement les problèmes de structure de table ou de contraintes.\u003C\u002Fp>\n\u003Ch2>Bonnes pratiques pour PrestaShop 8.x\u003C\u002Fh2>\n\u003Cp>Depuis PrestaShop 8, certaines évolutions impactent la gestion du stock :\u003C\u002Fp>\n\u003Cul>\n\u003Cli>**Symfony Services** : privilégiez `StockManager` via l'injection de dépendances plutôt que les appels statiques\u003C\u002Fli>\n\u003Cli>**Doctrine** : les nouvelles entités utilisent Doctrine, mais `StockAvailable` reste en ObjectModel\u003C\u002Fli>\n\u003Cli>**Multiboutique** : la colonne `id_shop` est critique — testez toujours en contexte multiboutique si votre module le supporte\u003C\u002Fli>\n\u003Cli>**Type safety** : castez systématiquement vos identifiants avec `(int)` pour éviter les injections SQL\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cpre>\u003Ccode class=\"language-php\">\n\u002F\u002F PrestaShop 8.x — via le container Symfony\n$stockManager = $this-&gt;get('prestashop.core.data_provider.stock_interface');\n\u003C\u002Fcode>\u003C\u002Fpre>",[39,42,45,48,51,54],{"q":40,"a":41},"Pourquoi ma requête UPDATE ne fonctionne pas dans hookActionValidateOrder ?","Les causes les plus fréquentes sont : une erreur de syntaxe dans la requête (colonnes dupliquées dans le tableau PHP, clause WHERE mal formée), un hook non enregistré dans la méthode install() du module, ou des colonnes NOT NULL manquantes. Utilisez Db::getInstance()->getMsgError() après l'appel update() pour obtenir le message d'erreur MySQL exact.",{"q":43,"a":44},"Faut-il utiliser Db::update() ou StockAvailable pour modifier le stock PrestaShop ?","Privilégiez toujours la classe StockAvailable ou la méthode statique StockAvailable::setQuantity(). L'ObjectModel gère automatiquement l'invalidation du cache, le contexte multiboutique et le déclenchement des hooks associés. La manipulation directe via Db::update() contourne ces mécanismes et peut provoquer des incohérences de stock.",{"q":46,"a":47},"Comment vérifier qu'un hook est bien enregistré dans un module PrestaShop ?","Rendez-vous dans le back-office sous Modules > Positions et recherchez le nom du hook (par exemple actionValidateOrder). Vous pouvez aussi vérifier en base de données avec la requête : SELECT * FROM ps_hook_module WHERE id_hook = (SELECT id_hook FROM ps_hook WHERE name = 'actionValidateOrder'). Assurez-vous que registerHook() est bien appelé dans la méthode install() de votre module.",{"q":49,"a":50},"Comment déboguer une erreur SQL silencieuse dans un module PrestaShop ?","Après chaque appel à Db::getInstance()->update() ou execute(), vérifiez la valeur de retour (false en cas d'échec) puis appelez getMsgError() et getNumberError() pour obtenir le détail de l'erreur MySQL. Vous pouvez aussi activer le mode debug de PrestaShop dans config\u002Fdefines.inc.php en passant _PS_MODE_DEV_ à true, ou tester la requête directement dans phpMyAdmin.",{"q":52,"a":53},"La mise à jour du stock fonctionne en SQL direct mais pas depuis mon module PrestaShop, pourquoi ?","Vérifiez trois points : le préfixe de table (Db::update() ajoute automatiquement le préfixe, ne le mettez pas dans le nom de table), le contexte de boutique (Shop::getContextShopID() peut filtrer les résultats en multiboutique), et le cache objet PrestaShop qui peut servir des données obsolètes. Appelez Cache::clean('StockAvailable') après votre mise à jour si nécessaire.",{"q":55,"a":56},"Le hook actionValidateOrder se déclenche-t-il avant ou après la déduction du stock ?","Le hook actionValidateOrder se déclenche après que PrestaShop a validé la commande et mis à jour les stocks standards. Si vous modifiez les quantités dans ce hook, vous intervenez après la déduction automatique. Tenez-en compte dans votre calcul pour éviter une double déduction. Pour intervenir avant la modification du stock, utilisez plutôt le hook actionProductOutOfStock ou actionUpdateQuantity.","Pour mettre à jour le stock depuis hookActionValidateOrder, utilisez Db::getInstance()->update() ou mieux, la classe StockAvailable. Les erreurs courantes sont les colonnes dupliquées dans le tableau PHP, un hook non enregistré, ou des colonnes NOT NULL manquantes.",5,"2026-03-21T13:30:51.000Z",[],"PrestaShop pour les développeurs",{"columns":63},[64,80,110,131],{"title":65,"links":66},"Plateforme",[67,71,74,77],{"label":68,"href":69,"external":70},"Offre Starter (2 500 €)","\u002Foffre-starter",false,{"label":72,"href":73,"external":70},"Devenir Ambassadeur","\u002Fambassadeur",{"label":75,"href":76,"external":70},"Modules PrestaShop","\u002Fmodules",{"label":78,"href":79,"external":20},"CodeMyShop.com","https:\u002F\u002Fcodemyshop.com",{"title":81,"links":82},"Le Synedre",[83,86,89,92,95,98,101,104,107],{"label":84,"href":85,"external":70},"L'histoire","\u002Fsynedre",{"label":87,"href":88,"external":70},"Constitution","\u002Fsynedre\u002Fconstitution",{"label":90,"href":91,"external":70},"L'équipe","\u002Fequipe",{"label":93,"href":94,"external":70},"Le réacteur en direct","\u002Freacteur",{"label":96,"href":97,"external":70},"Le Drill (entraînement)","\u002Fdrill",{"label":99,"href":100,"external":70},"Protocole de réunion","\u002Fsynedre\u002Freunion",{"label":102,"href":103,"external":70},"Les agents IA","\u002Fagents-ia",{"label":105,"href":106,"external":70},"La Conduite","\u002Fsynedre\u002Fconduite",{"label":108,"href":109,"external":70},"Charte plateforme","\u002Fsynedre\u002Fcharte",{"title":111,"links":112},"Ressources",[113,116,119,122,125,128],{"label":114,"href":115,"external":70},"Blog","\u002Fblog",{"label":117,"href":118,"external":70},"Academy","\u002Facademy",{"label":120,"href":121,"external":70},"Dictionnaire","\u002Fdictionnaire",{"label":123,"href":124,"external":70},"Expertise PrestaShop","\u002Fexpertise",{"label":126,"href":127,"external":70},"Flywheel","\u002Fflywheel",{"label":129,"href":130,"external":70},"Manifeste","\u002Fmanifeste",{"title":132,"links":133},"À propos",[134,137,140],{"label":135,"href":136,"external":70},"Alexandre Carette","\u002Fa-propos",{"label":138,"href":139,"external":70},"Dossier de presse","\u002Fpresse",{"label":141,"href":142,"external":70},"Contact","\u002Fcontact",{"header":144},{"logo":145,"topBar":150,"contactEmail":154,"features":155,"navBar":151},{"src":146,"alt":147,"text":135,"href":148,"class":149},"\u002Flogo-ac.svg","Alexandre Carette — Architecte E-commerce Souverain","\u002F","h-10 w-10",{"message":151,"showLanguages":70,"align":152,"languages":153},null,"left",[],"contact@alexandrecarette.fr",{"showSearch":70,"showWishlist":70,"showLogin":20,"showContact":70,"showCart":70,"stickyHeader":20,"headerLayout":156},"inline",{"items":158},[159,167,173,179,187,195,200,206],{"id":160,"type":161,"label":162,"href":124,"icon":151,"description":151,"badge":151,"groupTitle":151,"style":151,"gridColumns":151,"cssClass":151,"psCategoryId":151,"showPsChildren":70,"position":164,"children":165,"psChildren":166},41,"link",{"fr":163},"Expertise",0,[],[],{"id":168,"type":161,"label":169,"href":115,"icon":151,"description":151,"badge":151,"groupTitle":151,"style":151,"gridColumns":151,"cssClass":151,"psCategoryId":151,"showPsChildren":70,"position":170,"children":171,"psChildren":172},42,{"fr":114},1,[],[],{"id":174,"type":161,"label":175,"href":76,"icon":151,"description":151,"badge":151,"groupTitle":151,"style":151,"gridColumns":151,"cssClass":151,"psCategoryId":151,"showPsChildren":70,"position":176,"children":177,"psChildren":178},43,{"fr":75},2,[],[],{"id":180,"type":161,"label":181,"href":183,"icon":151,"description":151,"badge":151,"groupTitle":151,"style":151,"gridColumns":151,"cssClass":151,"psCategoryId":151,"showPsChildren":70,"position":184,"children":185,"psChildren":186},44,{"fr":182},"Outils IA","\u002Foutils-ia",3,[],[],{"id":188,"type":161,"label":189,"href":69,"icon":151,"description":151,"badge":151,"groupTitle":151,"style":191,"gridColumns":151,"cssClass":151,"psCategoryId":151,"showPsChildren":70,"position":192,"children":193,"psChildren":194},45,{"fr":190},"Offre Starter ✨",{"highlight":20},4,[],[],{"id":196,"type":161,"label":197,"href":118,"icon":151,"description":151,"badge":151,"groupTitle":151,"style":151,"gridColumns":151,"cssClass":151,"psCategoryId":151,"showPsChildren":70,"position":58,"children":198,"psChildren":199},46,{"fr":117},[],[],{"id":201,"type":161,"label":202,"href":136,"icon":151,"description":151,"badge":151,"groupTitle":151,"style":151,"gridColumns":151,"cssClass":151,"psCategoryId":151,"showPsChildren":70,"position":203,"children":204,"psChildren":205},47,{"fr":132},6,[],[],{"id":207,"type":161,"label":208,"href":142,"icon":151,"description":151,"badge":151,"groupTitle":151,"style":151,"gridColumns":151,"cssClass":151,"psCategoryId":151,"showPsChildren":70,"position":209,"children":210,"psChildren":211},48,{"fr":141},7,[],[],{"academy":213,"blog":214,"expertise":225},[],[215,219,222],{"title":216,"url":217,"score":170,"type":218},"PrestaShop headless avec Nuxt 3 : pourquoi séparer back et front","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fprestashop-headless-nuxt-separation-front-back","blog",{"title":220,"url":221,"score":170,"type":218},"PrestaShop headless : Nuxt 3, pas Next.js — le choix souverain","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fprestashop-headless-nuxt-nextjs-souverainete",{"title":223,"url":224,"score":170,"type":218},"Sylius rachète PrestaShop : ce que ça change pour vous","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fsylius-rachat-prestashop-headless-souverainete",[],{"footer":227},{"theme":228,"description":151,"hours":151,"logo":229,"contact":230,"social":231,"bottomBar":241},"dark",{"src":146,"href":148,"alt":135},{"email":151,"phone":151,"address":151,"cta":151},[232,235,238],{"platform":233,"href":234,"label":233},"linkedin","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Falexandre-carette\u002F",{"platform":236,"href":237,"label":236},"malt","https:\u002F\u002Fwww.malt.fr\u002Fprofile\u002Falexandrecarette",{"platform":239,"href":240,"label":239},"github","https:\u002F\u002Fgithub.com\u002Fprest4cafe",{"copyright":151}]