Extraire les données de facturation PrestaShop via requête 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.
En bref : 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.
Pourquoi extraire les données de facturation par SQL
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.
PrestaShop intègre un gestionnaire de requêtes SQL 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.
Structure des tables de facturation PrestaShop
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 :
Note : Le préfixe
ps_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.
Requête SQL complète d'extraction
Cette requête joint l'ensemble des tables nécessaires pour obtenir une vue complète de chaque ligne de facturation :
SELECT
oi.id_order_invoice AS N_facture,
oi.date_add AS Date_facture,
oi.id_order AS N_commande,
o.reference AS Ref_commande,
c.lastname AS Nom,
c.firstname AS Prenom,
c.email AS Email,
CONCAT(
a.address1,
IF(a.address2 != '', CONCAT(' ', a.address2), ''),
' ', a.postcode,
' ', a.city
) AS Adresse_facturation,
a.country AS Pays,
o.payment AS Moyen_paiement,
od.product_name AS Nom_produit,
od.product_reference AS Ref_produit,
od.product_ean13 AS EAN13_produit,
od.product_quantity AS Quantite,
od.unit_price_tax_excl AS Prix_unitaire_HT,
od.total_price_tax_incl AS Total_ligne_TTC,
oi.total_products AS Total_produits_HT,
(oi.total_paid_tax_incl
- oi.total_paid_tax_excl) AS Montant_TVA,
(oi.total_paid_tax_incl
- oi.total_shipping_tax_incl) AS Total_produits_TTC,
oi.total_shipping_tax_excl AS Frais_expedition_HT,
oi.total_shipping_tax_incl AS Frais_expedition_TTC,
oi.total_paid_tax_incl AS Total_paye_TTC,
ocr.name AS Nom_reduction,
ocr.value AS Montant_reduction
FROM ps_order_invoice oi
LEFT JOIN ps_orders o
ON oi.id_order = o.id_order
LEFT JOIN ps_order_detail od
ON o.id_order = od.id_order
LEFT JOIN ps_customer c
ON o.id_customer = c.id_customer
LEFT JOIN ps_address a
ON o.id_address_invoice = a.id_address
LEFT JOIN ps_order_cart_rule ocr
ON o.id_order = ocr.id_order
ORDER BY oi.date_add DESC;
Explications des jointures
- **`ps_order_invoice → ps_orders`** : Lie chaque facture à sa commande. Une commande peut générer plusieurs factures (livraisons partielles).
- **`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é.
- **`ps_orders → ps_customer`** : Identifie le client via `id_customer`.
- **`ps_orders → ps_address`** : Utilise `id_address_invoice` (et non `id_address_delivery`) pour obtenir l'adresse de facturation.
- **`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.
Utilisation dans le gestionnaire SQL du back-office
- Rendez-vous dans **Paramètres avancés → Gestionnaire SQL**
- Cliquez sur **Ajouter une nouvelle requête SQL**
- Donnez un nom explicite (ex : *Export facturation complet*)
- Collez la requête ci-dessus
- Cliquez sur **Enregistrer** puis **Lancer**
- Utilisez le bouton **Exporter en CSV** pour récupérer le fichier
- **Préfixe de tables** : En PS 8.x, le préfixe personnalisé est encore plus recommandé. Vérifiez votre préfixe dans `app/config/parameters.php` (clé `database_prefix`).
- **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.
- **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*.
- **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.
- **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é.
- **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.
- Ne stockez jamais les exports contenant des données personnelles (noms, adresses, emails) dans un répertoire accessible publiquement.
- 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.
- Dans le gestionnaire SQL, seuls les profils administrateurs y ont accès par défaut. Vérifiez vos permissions dans *Administration → Profils*.
Astuce : Le gestionnaire SQL de PrestaShop n'autorise que les requêtes
SELECT. Aucun risque de modifier vos données par erreur.
Filtrer par période
Pour extraire uniquement les factures d'une période donnée (typiquement pour une déclaration trimestrielle de TVA), ajoutez une clause WHERE :
WHERE oi.date_add BETWEEN '2026-01-01 00:00:00'
AND '2026-03-31 23:59:59'
ORDER BY oi.date_add DESC;
Filtrer par statut de commande
Pour n'exporter que les commandes effectivement payées et éviter les paniers abandonnés ou les commandes annulées :
WHERE o.current_state IN (
SELECT id_order_state
FROM ps_order_state
WHERE paid = 1
)
ORDER BY oi.date_add DESC;
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é ».
Adaptation pour PrestaShop 8.x
La structure des tables de facturation est restée stable de PrestaShop 1.6 à 8.x. Les principales différences à connaître :
Bonnes pratiques pour l'export comptable
Automatiser l'extraction
Pour les boutiques à fort volume, l'export manuel devient fastidieux. Deux approches :
Sécurité des données
Cohérence des montants
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.
Questions fréquentes
Tout ce que vous devez savoir sur ce sujet.
Un projet PrestaShop ?
Discutons-en directement.
193 projets livrés
Lire sur le blog

Alexandre Carette
Expert PrestaShop & Architecture E-commerce
Développeur PrestaShop depuis 2014, 193 projets livrés. Je conçois des architectures headless Nuxt + PrestaShop et des outils d'automatisation IA pour les e-commerçants.