Lecture : 15 minutes · Niveau : intermédiaire · Mise à jour : avril 2026
Tutoriel pratique pour installer Odoo Community Edition en local, activer les modules essentiels (CRM, Ventes, Achats, Stock, Comptabilité, Projet), créer des données de test, et automatiser des tâches via XML-RPC. Tout est testé sur Odoo 17 + PostgreSQL 15 + Docker. À la fin de cet article vous avez un Odoo opérationnel avec 6 modules configurés et un script Python qui crée 100 contacts CRM en quelques secondes.
Voir aussi → Odoo PME Afrique : guide complet, Odoo personnalisation et développement, Odoo paiement mobile money intégration.
Sommaire
- Lab : Odoo 17 en Docker en 5 minutes
- Module Contacts : import CSV en masse
- Module CRM : pipeline et étapes
- Module Ventes : devis → commande → facture
- Module Stock : entrepôt et inventaire
- Module Achats : workflow fournisseur
- Module Comptabilité : plan SYSCOHADA
- Module Projet : tâches et timesheet
- Automatisation XML-RPC depuis Python
- Sauvegarde et restauration de la DB
- FAQ
1. Lab : Odoo 17 en Docker en 5 minutes
docker-compose.yml :
services:
db:
image: postgres:15
environment:
POSTGRES_USER: odoo
POSTGRES_PASSWORD: odoo
POSTGRES_DB: postgres
volumes:
- pg-data:/var/lib/postgresql/data
odoo:
image: odoo:17
depends_on: [db]
ports:
- "8069:8069"
environment:
HOST: db
USER: odoo
PASSWORD: odoo
volumes:
- odoo-data:/var/lib/odoo
- ./addons:/mnt/extra-addons
volumes:
pg-data:
odoo-data:
docker compose up -d
docker compose logs -f odoo | grep "HTTP service"
# odoo.service.server: HTTP service running on http://0.0.0.0:8069
Ouvrir http://localhost:8069 → Master Password (à choisir et noter) → Create Database :
– Database Name : pme-test
– Email : admin@pme.local
– Password : Admin123!
– Country : Sénégal (ou pays de la PME)
– Demo data : ✓ activé pour tester
Login admin@pme.local / Admin123!. L’écran Apps s’ouvre.
2. Module Contacts : import CSV en masse
Activer le module : déjà installé par défaut. Sinon : Apps → rechercher « Contacts » → Install.
Import CSV depuis l’interface :
Préparer contacts.csv :
name,is_company,email,phone,street,city,country_id/id
"Diop & Frères SARL",True,contact@diopfreres.sn,+221 33 822 11 22,"Avenue Bourguiba",Dakar,base.sn
"Aïcha Diop",False,aicha.diop@gmail.com,+221 77 555 44 33,"Mermoz",Dakar,base.sn
"Boutique Mermoz",True,info@boutique-mermoz.sn,+221 33 824 55 66,"Sacré Coeur",Dakar,base.sn
Dans Odoo : menu Contacts → Favorites → Import records → Upload CSV → Map automatique → Test → Import.
Vérifier en SQL :
docker exec -it $(docker ps -qf name=db) \
psql -U odoo -d pme-test -c \
"SELECT name, email, phone FROM res_partner WHERE is_company=true LIMIT 5;"
3. Module CRM : pipeline et étapes
Installer : Apps → « CRM » → Install (1-2 min).
Configurer les étapes du pipeline : CRM → Configuration → Stages.
Étapes recommandées pour PME :
1. Nouveau (10%)
2. Qualifié (30%)
3. Proposition envoyée (50%)
4. Négociation (75%)
5. Gagné (100%)
6. Perdu (0%)
Créer une opportunité de test via UI : CRM → Pipeline → New :
– Nom : « Vente lot ordinateurs – Lycée Demba Diop »
– Société : Diop & Frères SARL
– Revenu attendu : 5 000 000 FCFA
– Probabilité : 30%
Créer 50 opportunités de test en CLI (script Python utilisant XML-RPC, voir section 9).
Activer les emails entrants : Settings → General Settings → External Email Servers → Incoming Mail Servers. Configurer un compte IMAP dédié commercial@pme.local. Chaque email reçu peut créer une lead automatiquement (alias : crm@pme.local).
4. Module Ventes : devis → commande → facture
Installer : Apps → « Sales » → Install.
Créer un produit :
Sales → Products → Create :
– Nom : « Ordinateur portable HP ProBook 450 »
– Type : Storable Product (suivi en stock)
– Prix de vente : 650 000 FCFA
– Coût : 520 000 FCFA
– Catégorie : All / Saleable
Workflow devis → facture :
- Sales → Quotations → New
- Customer : Diop & Frères SARL
- Add a product : « Ordinateur portable HP » qty 10
- Send by email (ou Confirm directement)
- Une fois confirmé → bouton « Create Invoice » → Regular Invoice → Validate
Vérifier le numéro de facture généré : Accounting → Customer Invoices → INV/2026/0001.
Configurer la TVA Sénégal (18%) :
Accounting → Configuration → Taxes → New :
– Tax Name : « TVA 18% »
– Tax Computation : Percentage of Price
– Amount : 18.0000
– Tax Scope : Sales
Affecter la TVA à tous les produits via filtre + bulk action.
5. Module Stock : entrepôt et inventaire
Installer : Apps → « Inventory » → Install (auto-installé avec Sales si Storable Product).
Créer un entrepôt :
Inventory → Configuration → Warehouses → New :
– Name : « Entrepôt Dakar Centre »
– Short Name : DKR
– Address : Avenue Bourguiba, Dakar
Créer un emplacement (rack) : Inventory → Configuration → Locations → New → Parent Location : DKR/Stock → Name : « Rack A ».
Inventaire physique initial :
Inventory → Operations → Physical Inventory → New :
– Location : DKR/Stock/Rack A
– Add product : « Ordinateur HP » qty théorique 0, qty comptée 50
– Validate
Vérifier le stock :
docker exec -it $(docker ps -qf name=db) \
psql -U odoo -d pme-test -c \
"SELECT product_id, location_id, quantity FROM stock_quant WHERE quantity > 0;"
6. Module Achats : workflow fournisseur
Installer : Apps → « Purchase » → Install.
Créer un fournisseur : Contacts → Create → cocher « Is a Vendor ».
Créer une demande d’achat (RFQ) :
Purchase → Requests for Quotation → New :
– Vendor : « Fournisseur HP Dakar »
– Product : « Ordinateur HP » qty 20 prix unitaire 480 000
– Send by email → Confirm Order
– Receive Products → Validate (entrée stock)
– Create Bill → Validate (facture fournisseur)
Automatiser la commande de réapprovisionnement :
Inventory → Products → Edit « Ordinateur HP » → onglet Purchase → Reordering Rules :
– Min Quantity : 5
– Max Quantity : 20
– Vendor : « Fournisseur HP Dakar »
Quand le stock passe sous 5, Odoo crée automatiquement une RFQ.
7. Module Comptabilité : plan SYSCOHADA
Installer : Apps → « Invoicing » (gratuit) ou « Accounting » (Enterprise pour comptabilité complète).
Plan comptable SYSCOHADA pour Afrique francophone :
Apps → rechercher « OHADA » → installer le module l10n_syscohada si présent dans votre version. Sinon : importer manuellement le plan.
Vérifier le plan via SQL :
docker exec -it $(docker ps -qf name=db) \
psql -U odoo -d pme-test -c \
"SELECT code, name FROM account_account WHERE code LIKE '6%' ORDER BY code LIMIT 10;"
Doit afficher les comptes 60xxx (Achats), 61xxx (Transports), 62xxx (Services extérieurs), etc.
Configurer les journaux :
Accounting → Configuration → Journals :
– Banque : « BICIS Dakar Compte Pro »
– Caisse : « Caisse Bureau »
– Ventes : « Factures clients »
– Achats : « Factures fournisseurs »
Importer un relevé bancaire CSV : Accounting → Banking → Import → CSV → mapper Date / Label / Amount.
8. Module Projet : tâches et timesheet
Installer : Apps → « Project » + « Timesheets » → Install.
Créer un projet :
Project → Projects → New :
– Name : « Implémentation Odoo Diop & Frères »
– Customer : Diop & Frères SARL
– Allow timesheets : ✓
– Stages : To do → In progress → Done
Créer des tâches :
- Audit existant (2 jours)
- Migration données legacy (5 jours)
- Formation équipe (3 jours)
- Go-live et support (5 jours)
Saisir du temps (timesheet) :
Cliquer sur une tâche → onglet Timesheets → ligne :
– Description : « Audit base SAGE existante »
– Hours : 6.5
Voir les heures cumulées : Timesheets → Reporting → By Employee / By Project.
9. Automatisation XML-RPC depuis Python
Odoo expose une API XML-RPC complète pour automatiser depuis l’extérieur.
Script bulk_contacts.py créant 100 contacts CRM en quelques secondes :
import xmlrpc.client
from random import choice
URL = "http://localhost:8069"
DB = "pme-test"
USER = "admin@pme.local"
PASS = "Admin123!"
# 1. Authentification
common = xmlrpc.client.ServerProxy(f"{URL}/xmlrpc/2/common")
uid = common.authenticate(DB, USER, PASS, {})
print(f"UID = {uid}")
# 2. Modèle de données
models = xmlrpc.client.ServerProxy(f"{URL}/xmlrpc/2/object")
# 3. Récupérer l'ID du pays Sénégal
sn_id = models.execute_kw(DB, uid, PASS,
'res.country', 'search', [[['code', '=', 'SN']]])[0]
# 4. Créer 100 contacts
prenoms = ["Aïcha", "Mamadou", "Fatou", "Ousmane", "Awa", "Cheikh", "Ndèye"]
noms = ["Diop", "Ba", "Ndiaye", "Sow", "Faye", "Sarr", "Gueye"]
for i in range(100):
partner_id = models.execute_kw(DB, uid, PASS,
'res.partner', 'create', [{
'name': f"{choice(prenoms)} {choice(noms)}",
'is_company': False,
'email': f"contact{i}@pme.local",
'phone': f"+221 77 {100+i:03d} {1000+i}",
'country_id': sn_id,
'city': "Dakar",
}])
print(f"Created partner {partner_id}")
# 5. Créer 50 opportunités CRM
crm_stage = models.execute_kw(DB, uid, PASS,
'crm.stage', 'search', [[['name', '=', 'New']]])[0]
partners = models.execute_kw(DB, uid, PASS,
'res.partner', 'search', [[]], {'limit': 50})
for pid in partners:
models.execute_kw(DB, uid, PASS,
'crm.lead', 'create', [{
'name': f"Opportunité auto-{pid}",
'partner_id': pid,
'expected_revenue': 1_000_000 + (pid * 50_000),
'probability': 30,
'stage_id': crm_stage,
}])
print("Bulk import OK")
pip install --user defusedxml # Optionnel - sécurise XML-RPC parsing
python bulk_contacts.py
Vérifier dans l’UI : Contacts → 100+ entries. CRM → Pipeline → 50 opportunités sur étape New.
Méthodes courantes XML-RPC :
| Méthode | Usage |
|---|---|
search |
Liste IDs matching domain |
read |
Lit champs |
search_read |
Combine search + read |
create |
Crée un record |
write |
Met à jour |
unlink |
Supprime |
execute_kw |
Appel générique |
10. Sauvegarde et restauration de la DB
Backup CLI (sans passer par /web/database/manager) :
# Dump SQL
docker exec $(docker ps -qf name=db) \
pg_dump -U odoo -F c pme-test > pme-test-$(date +%F).dump
# Backup filestore (attachements, images)
docker run --rm -v $(docker volume ls -qf name=odoo-data):/data \
-v $(pwd):/backup alpine \
tar czf /backup/filestore-$(date +%F).tar.gz -C /data filestore/pme-test
Restauration sur autre instance :
# Recréer la DB
docker exec $(docker ps -qf name=db) \
createdb -U odoo pme-test-restore
# Restaurer SQL
docker exec -i $(docker ps -qf name=db) \
pg_restore -U odoo -d pme-test-restore < pme-test-2026-04-25.dump
# Restaurer filestore
docker run --rm -v $(docker volume ls -qf name=odoo-data):/data \
-v $(pwd):/backup alpine \
tar xzf /backup/filestore-2026-04-25.tar.gz -C /data
Tester en production avant chaque mise en prod : voir tutoriel Sauvegarde 3-2-1.
FAQ
Combien de modules activer en démarrage ?
Démarrer petit : 3-4 modules max au lancement (Contacts + CRM + Ventes + Stock par exemple). Ajouter les autres après 4-6 semaines de pratique. Activer 10+ modules d’un coup paralyse l’adoption.
Odoo Community ou Enterprise ?
Community gratuit suffit pour CRM, Ventes, Achats, Stock, Projet, Inventory. Pour Comptabilité complète SYSCOHADA, signature électronique, planning RH avancé : Enterprise. Pour beaucoup de PME : Community + modules tiers gratuits couvrent 90% des besoins.
Comment importer un catalogue produits volumineux ?
CSV via UI fonctionne jusqu’à ~10 000 lignes. Au-delà, utiliser XML-RPC en batch (chunks de 100-500). Couper en lots et logger les erreurs. Le module base_import accepte aussi du XML.
Comment sauvegarder Odoo automatiquement ?
Cron quotidien combinant pg_dump + tar du filestore + upload chiffré (Restic vers B2/Wasabi). Voir le script complet section 10. Tester la restauration mensuellement sur une instance staging.
Peut-on connecter Odoo à un autre logiciel (SAGE, Sage X3) ?
Via XML-RPC ou API REST (Odoo 16+). Pour des intégrations complexes : module connector ou des outils ETL comme n8n / Apache Airflow. Pour SAGE legacy : export CSV + script Python d’import vers Odoo.
Comment gérer plusieurs sociétés (multi-companies) ?
Settings → General Settings → Manage Companies → Create. Chaque société a son propre plan comptable, ses produits (peut être partagé), ses clients. Activer le module multi-company. Disponible en Community.
Y a-t-il des modules SYSCOHADA officiels ?
Le module l10n_syscohada existe selon la version. Sinon, des modules communautaires gratuits (OCA – Odoo Community Association) couvrent l’OHADA. Toujours tester en staging avant production.
Quelle taille de serveur pour 50 utilisateurs ?
Indicatif : 4 vCPU, 8 Go RAM, SSD 100 Go, PostgreSQL bien tuné (shared_buffers, work_mem). Pour 200+ utilisateurs : passer à du dédié 8+ vCPU, 16+ Go RAM, monitoring (Grafana + odoo-prometheus-exporter).
Articles liés (cluster Odoo)
- 👉 Odoo PME Afrique : guide complet
- 👉 Odoo personnalisation et développement
- 👉 Odoo paiement mobile money intégration
Voir aussi : Sauvegarde 3-2-1 connexion limitée, Linux administration avancée pour PME pour héberger soi-même Odoo.
Article mis à jour le 25 avril 2026. Pour signaler une erreur ou suggérer une amélioration, écrivez-nous.