Ce guide a pour objectif d’aider les équipes techniques à exploiter l’API de Dolibarr pour automatiser leurs flux d’Extract‑Transform‑Load (ETL) et ainsi réduire les tâches manuelles.
1. Pourquoi passer par l’API Dolibarr ?
| Enjeu | Solution apportée par l’API |
|---|---|
| Centralisation des données | Récupérer simultanément Customers, Suppliers, Invoices, Stocks, etc., depuis un même point d’entrée. |
| Standardisation des formats | Les réponses sont toujours en JSON (ou XML) et respectent la même nomenclature de champs, éliminant les mappings ad‑hoc. |
| Scalabilité | Possibilité d’appeler les endpoints en parallèle (batch) ou asynchrones (webhooks) pour des volumes élevés. |
| Sécurité intégrée | OAuth 2 / token API → contrôle granulaire (lire seulement les factures, gérer les articles, etc.). |
| Automatisation | Des webhooks (ex. : order.created) peuvent déclencher des pipelines ETL en temps réel. |
2. Architecture du Playbook ETL avec Dolibarr« `
[Planification] → [Extraction via API] → [Transformation] → [Chargement]
│ │ │
└─> ⏱️ Scheduler └─> 📦 DataFrames │
↳ Webhooks / Batch ↳ Writer (DB, DataLake, CSV…)
### 2.1 Étapes clés du pipeline
| Phase | Action concrète | Outils / Bibliothèques recommandés |
|-------|----------------|-------------------------------------|
| **1️⃣ Extraction** | 1. Générer un *API token* (Admin → Setup → Confidentialité → API).<br>2. Questionnaire d’**authentification** (Bearer token).<br>3. Appel d’endpoint : `GET /api.php/V1/customers` (ou `/suppliers`, `/invoices`).<br>4. Paramétrer les filtres (`status`, `date_modified`) pour limiter le volume. | - **Python**: `requests` ou `httpx`<br>- **Node.js**: `axios`<br>- **cURL** pour tests rapides |
| **2️⃣ Transformation** | 1. Normaliser les champs (ex. : `date_create` → `timestamp`).<br>2. Faire des agrégations (somme des lignes de facturation, calcul de réserves).<br>3. Appliquer les règles de nettoyage (trim, validation de champs). | - **pandas** (Python) <br>- **Polars** (plus rapide) <br>- **dbt** pour transformations SQL sur le cible |
| **3️⃣ Chargement** | 1. Choisir le récepteur (PostgreSQL, Snowflake, BigQuery, flat‑file).<br>2. Insérer en **batch** (upsert ou merge).<br>3. Mettre à jour les métriques de suivi (nb lignes, latence). | - **SQLAlchemy** / **Alembic** (Python) <br>- **dbt** (SQL) <br>- **Airflow** / **Prefect** pour orchestration |
---
## 3. Exemple : Script Python d’extraction → charge des factures
> Ce script extrait les factures créées au cours des 7 derniers jours et les importe dans une table PostgreSQL (`invoices_staging`).
```python
#!/usr/bin/env python3
import os, json, datetime
import requests
import pandas as pd
from sqlalchemy import create_engine
# ---------------------------------------------------------
# 1️⃣ Configuration
# ---------------------------------------------------------
API_TOKEN = os.getenv("DOLIBARR_API_TOKEN")
BASE_URL = os.getenv("DOLIBARR_URL", "https://dolibarr.mondomaine.com")
DAYS_BACK = 7
# Endpoint API (V1)
ENDPOINT = f"{BASE_URL}/api.php/V1/invoices"
# Header d’authentification
HEADERS = {
"Content-Type": "application/json",
"Authorization": f"Bearer {API_TOKEN}"
}
# Filtre de date
now = datetime.datetime.utcnow()
start_date = (now - datetime.timedelta(days=DAYS_BACK)).strftime("%Y-%m-%d")
params = {"range": f"now-{DAYS_BACK}d:now"} # Dolibarr supporte les filtres de date ISO
# ---------------------------------------------------------
# 2️⃣ Extraction
# ---------------------------------------------------------
resp = requests.get(ENDPOINT, headers=HEADERS, params=params)
resp.raise_for_status()
raw_data = resp.json()
# On extrait les lignes « linecards » (articles) pour les agréger plus tard
invoices = []
for inv in raw_data["data"]:
invoices.append({
"id": inv["id"],
"label": inv["label"],
"date": inv["date"],
"status": inv["status"],
"total_brut": float(inv["total_brut"]),
"total_ttc": float(inv["total_ttc"])
})
# Chargement en DataFrame
df = pd.DataFrame(invoices)
df["date"] = pd.to_datetime(df["date"])
# ---------------------------------------------------------
# 3️⃣ Transformation (exemple simple)
# ---------------------------------------------------------
df["date"] = df["date"].dt.date # on garde juste la date
df["age_jour"] = (datetime.datetime.now().date() - df["date"]).days
# On crée une colonne de filtrage برای "anciens"
df["is_old"] = df["age_jour"] > 30
# ---------------------------------------------------------
# 4️⃣ Chargement (upsert)
# ---------------------------------------------------------
engine = create_engine(os.getenv("POSTGRES_URI"))
table_name = "stg_invoices"
# Méthode upsert avec `to_sql` + `ON CONFLICT DO UPDATE`
df.to_sql(
table_name,
con=engine,
if_exists="append", # première passe → charger
index=False,
method="multi"
)
# Pour rendre cela réel‑time upsert, on utilise une base temporaire + fonction PL/pgSQL
# (hors du scope de cet extrait).
print(f"✅ {len(df)} factures importées dans {table_name}")
Points à retenir
- Utilisez le filtrage côté Dolibarr (
range,date_from,date_to) pour ne pas télécharger l’intégralité de l’historique. - Regroupez les champs nécessaires en une seule requête (evitez les boucles).
- Normalisez les dates en UTC dès le premier pas pour simplifier les agrégations.
4. Bonnes pratiques & astuces « gain de temps »
| Astuce | Pourquoi ? | Exemple d’implémentation |
|---|---|---|
| Cache des tokens | Éviter le login à chaque exécution. | Stockez le token dans une configuration locale ou un secret manager et réutilisez‑le tant qu’il n’est pas expiré. |
| Rate‑limit & back‑off | Prévenir les erreurs 429 Too Many Requests. | Implémentez une fonction requests.retry ou tenacity avec exponentiel. |
| Chunking | Limiter la taille de la réponse (max ≈ 1000 lignes) pour éviter les time‑outs. | Ajoutez offset / limit ou parcourez les pages (page=1,2,…). |
| Webhooks | Réaction en temps réel (nouveau facture, mise à jour stock). | Créez un endpoint HTTP (FastAPI, Flask, ou même Azure Function) qui écoute POST /webhook/invoice et déclenche le même pipeline. |
| Versionnement des schémas | Maintenir la compatibilité avec les futures évolutions de Dolibarr. | Centralisez les définitions de champs dans un fichier YAML (schema.yml). |
| Documentation auto‑générée | Rendre le playbook accessible à tous les équipesDevOps. | Exportez le script avec des docstrings et générez la doc via mkdocs + mkdocstrings. |
5. Modèle de feuille de route (Road‑map / Gantt simplifié)
| Sprint | Durée | Objectif principal | Livrable |
|---|---|---|---|
| S0 – Pré‑analyse | 1 semaine | Recenser les flux actuels et identifier les champs critiques. | Mapping et liste des endpoints à exploiter. |
| S1 – Mise en place de l’API | 1‑2 semaines | Générer token, tester les endpoints, créer un repo Git contenant les scripts de base. | Suite de notebooks proof‑of‑concept (extraction + JSON‑dump). |
| S2 – Conception du pipeline | 2 semaines | Implémenter extraction → transformation → chargement (ETL) avec Airflow/Prefect. | DAG/Pipeline versionnée. |
| S3 – Tests de charge | 1 semaine | Simuler 10 k factures, mesurer latence et identifier les goulets. | Rapport de performance + réglages (batchSize, chunkSize). |
| S4 – Déploiement en prod | 1 semaine | Passer en production (scheduler quotidien ou webhook). | Dashboard de monitoring (Grafana/Prometheus). |
| S5 – Optimisation continue | Ongoing | Ajouter nouvelles sources (stock, contacts), enrichir transformations. | Fonctionnalités supplémentaires (triggers, calculs d’indicateurs KPI). |
6. Monitoring & Observabilité
- Log centralisé – Ajoutez un
structlogouloguruqui envoie les logs au fichier/var/log/dolibarr-etl.logou à un service (ELK, CloudWatch). - Métriques – Exportez chaque exécution (nb lignes, durée, code HTTP) vers Prometheus (
metrics.prometheus_client). - Alerting – Configurez des seuils (ex. : latence > 30 s ou taux d’erreurs > 5 %) qui déclenchent une alerte Slack/Email.
- Alertes de sécurité – Vérifiez régulièrement l’expiration du token et des logs d’accès API (
/var/log/dolibarr/api.log).
7. Checklist de mise en production| ✅ | Étape |
|—-|——-|
| 1 | Token API avec les droits minimalistes indispensables (lecture uniquement sur invoices). |
| 2 | Environnement de sandbox utilisé pour valider le extractions et les transformations. |
| 3 | Tous les champs nommés conformément au dictionary partagé avec les équipes métier. |
| 4 | Pipeline idempotent (upsert ou merge) pour éviter les doublons. |
| 5 | Chiffrement du token en transit (HTTPS) et stocké dans un secret manager (AWS Secrets Manager, Vault). |
| 6 | Tests unitaires & d’intégration (pytest) couvrant chaque appel API et chaque règle de transformation. |
| 7 | Documentation du processus (README, diagramme de flux, variables d’environnement). |
| 8 | Déploiement automatisé via CI/CD (GitHub Actions / GitLab CI) – build → tests → déploiement sur serveur ETL. |
| 9 | Monitoring initialisé (logs, métriques, alerts). |
| 10| Run‑book de rollback (comment remanier le dernier chargement ou réinitialiser la base staging). |
8. Ressources complémentaires
| Type | Lien / Référence |
|---|---|
| Documentation officielle | https://github.com/Dolibarr/dolibarr/wiki/Use-the-API |
| Exemples de code | https://github.com/Dolibarr/dolibarr/tree/master/api |
| Bibliothèques Python | dolibarr-py (community) – wrapper léger autour de l’API. |
| Webinar | « Automating ERP data pipelines with Dolibarr » – DolibarTech 2024 (vidéo). |
| Complexité de mapping | Étude de cas interne : Facturation → BI (PDF, 4 pages). |
| Forum communautaire | https://forum.dolibarr.org/ – section API & Integration. |
🔚 Conclusion
En exploitant l’API native de Dolibarr comme point d’entrée unique, vous pouvez transformer un processus ETL laborieux (extractions manuelles, mapping ad‑hoc, scripts maison) en un pipeline automatisé, fiable et scalable.
Le playbook présenté vous donne :
- une architecture claire (extraction → transform → load) ;
- des snippets fonctionnels pour démarrer rapidement ; * des bonnes pratiques qui évitent les pièges classiques ;
- un cadre de suivi et de déploiement pour passer de la proof‑of‑concept au système de production.
En suivant ces étapes, votre équipe gagnera des heures de travail manuel chaque semaine, disposera d’une vue toujours à jour de ses indicateurs clés et pourra se concentrer sur l’analyse et la prise de décision plutôt que sur la collecte de données.
Bon codage ! 🚀