[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"theme-db":3,"$fQijJyVp2ynfnPdSqqFUAqSuquNubkhuPs57nY-rGOZ0":22,"$fKnz2vuX4bZz1LbUTiuFsvSZ3e07l5_5fqNYp4Tzdhi8":64,"megamenu":145,"header-db":201,"$fx7Sbi19W853VOo8rVWPyshZe6zreCqyrmfSmp3Aczx4":214,"footer-db":228},{"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":34,"psVersions":35,"content":39,"faq":40,"tldr":59,"readingTime":60,"generatedAt":61,"publishDate":61,"relatedArticles":62,"sourceCategory":63},"Extraire les données de facturation PrestaShop via requête SQL","extraire-donnees-facturation-prestashop-requete-sql","Requête SQL complète pour extraire factures, clients et produits depuis PrestaShop. Compatible 1.6, 1.7 et 8.x avec export CSV via le back-office.","commandes",[28,29,30,31,32,33],"facturation","SQL","export données","comptabilité","back-office","requête SQL","intermediaire",[36,37,38],"1.6","1.7","8.x","\u003Ch2>Pourquoi extraire les données de facturation par SQL\u003C\u002Fh2>\n\u003Cp>Le back-office PrestaShop permet d'exporter les commandes au format CSV, mais ce fichier reste limité : il ne croise pas les informations de facturation, les détails produits, les adresses clients et les remises en une seule vue. Pour alimenter un logiciel comptable, produire un reporting fiscal ou simplement auditer vos ventes, une requête SQL sur mesure est souvent la solution la plus rapide et la plus flexible.\u003C\u002Fp>\n\u003Cp>PrestaShop intègre un \u003Cstrong>gestionnaire de requêtes SQL\u003C\u002Fstrong> directement dans le back-office (*Paramètres avancés → Gestionnaire SQL*), ce qui permet d'exécuter ces extractions sans accéder à phpMyAdmin ni ouvrir un terminal.\u003C\u002Fp>\n\u003Ch2>Structure des tables de facturation PrestaShop\u003C\u002Fh2>\n\u003Cp>Avant d'écrire la requête, il est essentiel de comprendre comment PrestaShop organise les données de facturation. Voici les tables principales impliquées :\u003C\u002Fp>\n\u003Ctr>\u003Cth>Table\u003C\u002Fth>\u003Cth>Rôle\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>`ps_order_invoice`\u003C\u002Fth>\u003Cth>Facture : numéro, date, totaux HT\u002FTTC, frais de port\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>`ps_orders`\u003C\u002Fth>\u003Cth>Commande : référence, moyen de paiement, statut\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>`ps_order_detail`\u003C\u002Fth>\u003Cth>Lignes de commande : produit, quantité, prix unitaire\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>`ps_customer`\u003C\u002Fth>\u003Cth>Client : nom, prénom, email\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>`ps_address`\u003C\u002Fth>\u003Cth>Adresse de facturation complète\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>`ps_order_cart_rule`\u003C\u002Fth>\u003Cth>Codes promo et remises appliquées\u003C\u002Fth>\u003C\u002Ftr>\n\u003Cblockquote>\u003Cp>\u003Cstrong>Note :\u003C\u002Fstrong> Le préfixe \u003Ccode>ps_\u003C\u002Fcode> est celui par défaut. Si vous avez personnalisé le préfixe lors de l'installation (recommandé pour la sécurité), adaptez la requête en conséquence.\u003C\u002Fp>\u003C\u002Fblockquote>\n\u003Ch2>Requête SQL complète d'extraction\u003C\u002Fh2>\n\u003Cp>Cette requête joint l'ensemble des tables nécessaires pour obtenir une vue complète de chaque ligne de facturation :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-sql\">\nSELECT\n    oi.id_order_invoice       AS N_facture,\n    oi.date_add               AS Date_facture,\n    oi.id_order               AS N_commande,\n    o.reference               AS Ref_commande,\n    c.lastname                AS Nom,\n    c.firstname               AS Prenom,\n    c.email                   AS Email,\n    CONCAT(\n        a.address1,\n        IF(a.address2 != '', CONCAT(' ', a.address2), ''),\n        ' ', a.postcode,\n        ' ', a.city\n    )                         AS Adresse_facturation,\n    a.country                 AS Pays,\n    o.payment                 AS Moyen_paiement,\n    od.product_name           AS Nom_produit,\n    od.product_reference      AS Ref_produit,\n    od.product_ean13          AS EAN13_produit,\n    od.product_quantity       AS Quantite,\n    od.unit_price_tax_excl    AS Prix_unitaire_HT,\n    od.total_price_tax_incl   AS Total_ligne_TTC,\n    oi.total_products         AS Total_produits_HT,\n    (oi.total_paid_tax_incl\n     - oi.total_paid_tax_excl) AS Montant_TVA,\n    (oi.total_paid_tax_incl\n     - oi.total_shipping_tax_incl) AS Total_produits_TTC,\n    oi.total_shipping_tax_excl AS Frais_expedition_HT,\n    oi.total_shipping_tax_incl AS Frais_expedition_TTC,\n    oi.total_paid_tax_incl    AS Total_paye_TTC,\n    ocr.name                  AS Nom_reduction,\n    ocr.value                 AS Montant_reduction\nFROM ps_order_invoice oi\nLEFT JOIN ps_orders o\n    ON oi.id_order = o.id_order\nLEFT JOIN ps_order_detail od\n    ON o.id_order = od.id_order\nLEFT JOIN ps_customer c\n    ON o.id_customer = c.id_customer\nLEFT JOIN ps_address a\n    ON o.id_address_invoice = a.id_address\nLEFT JOIN ps_order_cart_rule ocr\n    ON o.id_order = ocr.id_order\nORDER BY oi.date_add DESC;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>Explications des jointures\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>**`ps_order_invoice → ps_orders`** : Lie chaque facture à sa commande. Une commande peut générer plusieurs factures (livraisons partielles).\u003C\u002Fli>\n\u003Cli>**`ps_orders → ps_order_detail`** : Récupère chaque ligne produit de la commande. C'est une relation 1-N, donc la requête produit une ligne par produit commandé.\u003C\u002Fli>\n\u003Cli>**`ps_orders → ps_customer`** : Identifie le client via `id_customer`.\u003C\u002Fli>\n\u003Cli>**`ps_orders → ps_address`** : Utilise `id_address_invoice` (et non `id_address_delivery`) pour obtenir l'adresse de facturation.\u003C\u002Fli>\n\u003Cli>**`LEFT JOIN ps_order_cart_rule`** : Récupère les éventuelles réductions. `LEFT JOIN` car toutes les commandes n'ont pas de code promo.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2>Utilisation dans le gestionnaire SQL du back-office\u003C\u002Fh2>\n\u003Col>\n\u003Cli>Rendez-vous dans **Paramètres avancés → Gestionnaire SQL**\u003C\u002Fli>\n\u003Cli>Cliquez sur **Ajouter une nouvelle requête SQL**\u003C\u002Fli>\n\u003Cli>Donnez un nom explicite (ex : *Export facturation complet*)\u003C\u002Fli>\n\u003Cli>Collez la requête ci-dessus\u003C\u002Fli>\n\u003Cli>Cliquez sur **Enregistrer** puis **Lancer**\u003C\u002Fli>\n\u003Cli>Utilisez le bouton **Exporter en CSV** pour récupérer le fichier\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cblockquote>\u003Cp>\u003Cstrong>Astuce :\u003C\u002Fstrong> Le gestionnaire SQL de PrestaShop n'autorise que les requêtes \u003Ccode>SELECT\u003C\u002Fcode>. Aucun risque de modifier vos données par erreur.\u003C\u002Fp>\u003C\u002Fblockquote>\n\u003Ch2>Filtrer par période\u003C\u002Fh2>\n\u003Cp>Pour extraire uniquement les factures d'une période donnée (typiquement pour une déclaration trimestrielle de TVA), ajoutez une clause \u003Ccode>WHERE\u003C\u002Fcode> :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-sql\">\nWHERE oi.date_add BETWEEN '2026-01-01 00:00:00'\n                      AND '2026-03-31 23:59:59'\nORDER BY oi.date_add DESC;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2>Filtrer par statut de commande\u003C\u002Fh2>\n\u003Cp>Pour n'exporter que les commandes effectivement payées et éviter les paniers abandonnés ou les commandes annulées :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-sql\">\nWHERE o.current_state IN (\n    SELECT id_order_state\n    FROM ps_order_state\n    WHERE paid = 1\n)\nORDER BY oi.date_add DESC;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Cette approche est plus robuste que de coder en dur les identifiants de statut, car elle s'adapte automatiquement aux statuts personnalisés marqués comme « payé ».\u003C\u002Fp>\n\u003Ch2>Adaptation pour PrestaShop 8.x\u003C\u002Fh2>\n\u003Cp>La structure des tables de facturation est restée stable de PrestaShop 1.6 à 8.x. Les principales différences à connaître :\u003C\u002Fp>\n\u003Cul>\n\u003Cli>**Préfixe de tables** : En PS 8.x, le préfixe personnalisé est encore plus recommandé. Vérifiez votre préfixe dans `app\u002Fconfig\u002Fparameters.php` (clé `database_prefix`).\u003C\u002Fli>\n\u003Cli>**Champ `product_ean13`** : Renommé en `ean13` dans certaines versions intermédiaires de PS 1.7, puis toujours présent dans `ps_order_detail` en 8.x. Vérifiez avec `DESCRIBE ps_order_detail` si la colonne existe.\u003C\u002Fli>\n\u003Cli>**Symfony et le nouveau back-office** : Le gestionnaire SQL est toujours disponible en 8.x, mais il se trouve désormais dans *Paramètres avancés → Base de données → Gestionnaire SQL*.\u003C\u002Fli>\n\u003Cli>**Multidevise** : Si votre boutique gère plusieurs devises, ajoutez `o.id_currency` et joignez `ps_currency` pour afficher le code devise (EUR, USD…) dans votre export.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2>Bonnes pratiques pour l'export comptable\u003C\u002Fh2>\n\u003Ch3>Automatiser l'extraction\u003C\u002Fh3>\n\u003Cp>Pour les boutiques à fort volume, l'export manuel devient fastidieux. Deux approches :\u003C\u002Fp>\n\u003Col>\n\u003Cli>**Cron + script PHP** : Exécutez la requête via un script CLI qui génère un CSV déposé sur un espace sécurisé.\u003C\u002Fli>\n\u003Cli>**Module dédié** : Développez un module PrestaShop qui expose un endpoint sécurisé (token + IP whitelistée) retournant le CSV, consommable par votre logiciel comptable.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>Sécurité des données\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>Ne stockez jamais les exports contenant des données personnelles (noms, adresses, emails) dans un répertoire accessible publiquement.\u003C\u002Fli>\n\u003Cli>Respectez le RGPD : les données de facturation doivent être conservées 10 ans (obligation légale française), mais les données personnelles associées peuvent être pseudonymisées après ce délai.\u003C\u002Fli>\n\u003Cli>Dans le gestionnaire SQL, seuls les profils administrateurs y ont accès par défaut. Vérifiez vos permissions dans *Administration → Profils*.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>Cohérence des montants\u003C\u002Fh3>\n\u003Cp>Attention aux arrondis TVA : PrestaShop peut calculer la TVA ligne par ligne ou sur le total. Le mode de calcul se configure dans *Commandes → Factures → Options de taxes*. Votre requête SQL reflète le résultat stocké, pas le mode de calcul. Si les montants ne correspondent pas à vos attentes, vérifiez ce paramètre.\u003C\u002Fp>",[41,44,47,50,53,56],{"q":42,"a":43},"Comment exporter les factures PrestaShop au format CSV sans module ?","Utilisez le gestionnaire SQL intégré au back-office (Paramètres avancés → Base de données → Gestionnaire SQL). Créez une requête SELECT joignant les tables ps_order_invoice, ps_orders, ps_order_detail, ps_customer et ps_address, puis cliquez sur Exporter en CSV. Cette méthode fonctionne de PrestaShop 1.6 à 8.x sans installer de module tiers.",{"q":45,"a":46},"La requête SQL d'extraction de factures fonctionne-t-elle sur PrestaShop 8 ?","Oui. La structure des tables de facturation (ps_order_invoice, ps_orders, ps_order_detail) est restée stable depuis PrestaShop 1.6. Seul le préfixe de table peut différer si vous l'avez personnalisé à l'installation. Vérifiez votre préfixe dans app\u002Fconfig\u002Fparameters.php et adaptez la requête si nécessaire.",{"q":48,"a":49},"Comment filtrer l'export de facturation par date ou par statut de commande ?","Ajoutez une clause WHERE à la requête. Pour filtrer par date : WHERE oi.date_add BETWEEN '2026-01-01' AND '2026-03-31'. Pour n'inclure que les commandes payées : WHERE o.current_state IN (SELECT id_order_state FROM ps_order_state WHERE paid = 1). Les deux filtres peuvent être combinés avec AND.",{"q":51,"a":52},"Pourquoi certaines lignes apparaissent en double dans l'export SQL des factures ?","Les doublons proviennent généralement du LEFT JOIN sur ps_order_cart_rule : si une commande a plusieurs codes promo, chaque réduction génère une ligne supplémentaire par produit. Pour éviter cela, vous pouvez regrouper les réductions avec GROUP_CONCAT(ocr.name) et ajouter un GROUP BY sur les colonnes principales, ou retirer la jointure sur ps_order_cart_rule si les remises ne vous intéressent pas.",{"q":54,"a":55},"Est-il possible d'automatiser l'export des données de facturation PrestaShop ?","Oui, via un script PHP exécuté en cron qui se connecte à la base de données, exécute la requête et génère un fichier CSV. Vous pouvez aussi développer un module PrestaShop exposant un endpoint sécurisé par token et restriction IP, que votre logiciel comptable interroge automatiquement. Dans tous les cas, sécurisez l'accès aux fichiers générés car ils contiennent des données personnelles soumises au RGPD.",{"q":57,"a":58},"Comment inclure le pays et la devise dans l'export de facturation PrestaShop ?","Pour le pays, joignez la table ps_country_lang sur a.id_country avec la condition id_lang correspondant à votre langue. Pour la devise, ajoutez o.id_currency dans le SELECT et joignez ps_currency sur o.id_currency pour récupérer le code ISO (EUR, USD). C'est particulièrement important pour les boutiques multidevises ou à l'international.","Requête SQL complète pour extraire toutes les données de facturation PrestaShop (factures, clients, adresses, produits, TVA, remises) depuis le gestionnaire SQL du back-office, avec filtres par date et statut, compatible de PrestaShop 1.6 à 8.x.",5,"2026-03-21T15:48:22.000Z",[],"Recherche d'un module ou d'un thème",{"columns":65},[66,82,112,133],{"title":67,"links":68},"Plateforme",[69,73,76,79],{"label":70,"href":71,"external":72},"Offre Starter (2 500 €)","\u002Foffre-starter",false,{"label":74,"href":75,"external":72},"Devenir Ambassadeur","\u002Fambassadeur",{"label":77,"href":78,"external":72},"Modules PrestaShop","\u002Fmodules",{"label":80,"href":81,"external":20},"CodeMyShop.com","https:\u002F\u002Fcodemyshop.com",{"title":83,"links":84},"Le Synedre",[85,88,91,94,97,100,103,106,109],{"label":86,"href":87,"external":72},"L'histoire","\u002Fsynedre",{"label":89,"href":90,"external":72},"Constitution","\u002Fsynedre\u002Fconstitution",{"label":92,"href":93,"external":72},"L'équipe","\u002Fequipe",{"label":95,"href":96,"external":72},"Le réacteur en direct","\u002Freacteur",{"label":98,"href":99,"external":72},"Le Drill (entraînement)","\u002Fdrill",{"label":101,"href":102,"external":72},"Protocole de réunion","\u002Fsynedre\u002Freunion",{"label":104,"href":105,"external":72},"Les agents IA","\u002Fagents-ia",{"label":107,"href":108,"external":72},"La Conduite","\u002Fsynedre\u002Fconduite",{"label":110,"href":111,"external":72},"Charte plateforme","\u002Fsynedre\u002Fcharte",{"title":113,"links":114},"Ressources",[115,118,121,124,127,130],{"label":116,"href":117,"external":72},"Blog","\u002Fblog",{"label":119,"href":120,"external":72},"Academy","\u002Facademy",{"label":122,"href":123,"external":72},"Dictionnaire","\u002Fdictionnaire",{"label":125,"href":126,"external":72},"Expertise PrestaShop","\u002Fexpertise",{"label":128,"href":129,"external":72},"Flywheel","\u002Fflywheel",{"label":131,"href":132,"external":72},"Manifeste","\u002Fmanifeste",{"title":134,"links":135},"À propos",[136,139,142],{"label":137,"href":138,"external":72},"Alexandre Carette","\u002Fa-propos",{"label":140,"href":141,"external":72},"Dossier de presse","\u002Fpresse",{"label":143,"href":144,"external":72},"Contact","\u002Fcontact",{"items":146},[147,156,162,168,176,184,189,195],{"id":148,"type":149,"label":150,"href":126,"icon":152,"description":152,"badge":152,"groupTitle":152,"style":152,"gridColumns":152,"cssClass":152,"psCategoryId":152,"showPsChildren":72,"position":153,"children":154,"psChildren":155},41,"link",{"fr":151},"Expertise",null,0,[],[],{"id":157,"type":149,"label":158,"href":117,"icon":152,"description":152,"badge":152,"groupTitle":152,"style":152,"gridColumns":152,"cssClass":152,"psCategoryId":152,"showPsChildren":72,"position":159,"children":160,"psChildren":161},42,{"fr":116},1,[],[],{"id":163,"type":149,"label":164,"href":78,"icon":152,"description":152,"badge":152,"groupTitle":152,"style":152,"gridColumns":152,"cssClass":152,"psCategoryId":152,"showPsChildren":72,"position":165,"children":166,"psChildren":167},43,{"fr":77},2,[],[],{"id":169,"type":149,"label":170,"href":172,"icon":152,"description":152,"badge":152,"groupTitle":152,"style":152,"gridColumns":152,"cssClass":152,"psCategoryId":152,"showPsChildren":72,"position":173,"children":174,"psChildren":175},44,{"fr":171},"Outils IA","\u002Foutils-ia",3,[],[],{"id":177,"type":149,"label":178,"href":71,"icon":152,"description":152,"badge":152,"groupTitle":152,"style":180,"gridColumns":152,"cssClass":152,"psCategoryId":152,"showPsChildren":72,"position":181,"children":182,"psChildren":183},45,{"fr":179},"Offre Starter ✨",{"highlight":20},4,[],[],{"id":185,"type":149,"label":186,"href":120,"icon":152,"description":152,"badge":152,"groupTitle":152,"style":152,"gridColumns":152,"cssClass":152,"psCategoryId":152,"showPsChildren":72,"position":60,"children":187,"psChildren":188},46,{"fr":119},[],[],{"id":190,"type":149,"label":191,"href":138,"icon":152,"description":152,"badge":152,"groupTitle":152,"style":152,"gridColumns":152,"cssClass":152,"psCategoryId":152,"showPsChildren":72,"position":192,"children":193,"psChildren":194},47,{"fr":134},6,[],[],{"id":196,"type":149,"label":197,"href":144,"icon":152,"description":152,"badge":152,"groupTitle":152,"style":152,"gridColumns":152,"cssClass":152,"psCategoryId":152,"showPsChildren":72,"position":198,"children":199,"psChildren":200},48,{"fr":143},7,[],[],{"header":202},{"logo":203,"topBar":208,"contactEmail":211,"features":212,"navBar":152},{"src":204,"alt":205,"text":137,"href":206,"class":207},"\u002Flogo-ac.svg","Alexandre Carette — Architecte E-commerce Souverain","\u002F","h-10 w-10",{"message":152,"showLanguages":72,"align":209,"languages":210},"left",[],"contact@alexandrecarette.fr",{"showSearch":72,"showWishlist":72,"showLogin":20,"showContact":72,"showCart":72,"stickyHeader":20,"headerLayout":213},"inline",{"academy":215,"blog":216,"expertise":227},[],[217,221,224],{"title":218,"url":219,"score":159,"type":220},"PrestaShop headless avec Nuxt 3 : pourquoi séparer back et front","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fprestashop-headless-nuxt-separation-front-back","blog",{"title":222,"url":223,"score":159,"type":220},"PrestaShop headless : Nuxt 3, pas Next.js — le choix souverain","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fprestashop-headless-nuxt-nextjs-souverainete",{"title":225,"url":226,"score":159,"type":220},"Sylius rachète PrestaShop : ce que ça change pour vous","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fsylius-rachat-prestashop-headless-souverainete",[],{"footer":229},{"theme":230,"description":152,"hours":152,"logo":231,"contact":232,"social":233,"bottomBar":243},"dark",{"src":204,"href":206,"alt":137},{"email":152,"phone":152,"address":152,"cta":152},[234,237,240],{"platform":235,"href":236,"label":235},"linkedin","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Falexandre-carette\u002F",{"platform":238,"href":239,"label":238},"malt","https:\u002F\u002Fwww.malt.fr\u002Fprofile\u002Falexandrecarette",{"platform":241,"href":242,"label":241},"github","https:\u002F\u002Fgithub.com\u002Fprest4cafe",{"copyright":152}]