Ce que vous saurez faire
- Automatiser OCR factures avec Claude
- Écritures SYSCOHADA auto
- Rapprochement bancaire Python
- Relances impayés automatisées
Étape 1 — Ce qu’on automatise
1. Saisie factures fournisseurs (OCR + catégorisation)
2. Rapprochement bancaire
3. Relances clients impayés
4. Génération/envoi factures clients
5. Déclarations TVA + IS
6. Export SYSCOHADA pour expert-comptable
7. Consolidation multi-entités
Étape 2 — OCR facture PDF avec Claude
import anthropic, base64, json, pathlib
client = anthropic.Anthropic()
pdf = pathlib.Path("factures/FAC_2026_0412.pdf")
b64 = base64.b64encode(pdf.read_bytes()).decode()
r = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=800,
messages=[{"role":"user","content":[
{"type":"document","source":{
"type":"base64","media_type":"application/pdf","data":b64}},
{"type":"text","text":"""Extrais JSON strict:
{
"fournisseur": {"nom":"", "ninea":"", "tel":""},
"numero": "",
"date_emission": "YYYY-MM-DD",
"montant_ht": 0,
"tva_taux": 0.18,
"tva_montant": 0,
"montant_ttc": 0,
"lignes": [{"designation":"","qte":0,"pu":0}],
"iban": ""
}
Vérifie HT+TVA=TTC à 1 FCFA près. Si incohérent, flag "anomalie"."""}
]])
facture = json.loads(r.content[0].text)
Étape 3 — Écritures SYSCOHADA achat
def ecriture_achat(f):
return [
{"compte":"601100",
"libelle":f"Achat {f['fournisseur']['nom']}",
"debit":f["montant_ht"],"credit":0},
{"compte":"445620",
"libelle":"TVA déductible 18%",
"debit":f["tva_montant"],"credit":0},
{"compte":"401000",
"libelle":f"Fournisseur {f['fournisseur']['nom']}",
"debit":0,"credit":f["montant_ttc"]},
]
def ecriture_vente(v):
return [
{"compte":"411000","libelle":f"Client {v['client']}",
"debit":v["montant_ttc"],"credit":0},
{"compte":"701000","libelle":f"Vente {v['designation']}",
"debit":0,"credit":v["montant_ht"]},
{"compte":"443100","libelle":"TVA collectée 18%",
"debit":0,"credit":v["tva_montant"]},
]
def ecriture_paiement(montant, mode="wave"):
comptes = {"wave":"521100","om":"521200","cb":"512000","cheque":"511000"}
return [
{"compte":comptes[mode],"libelle":"Encaissement",
"debit":montant,"credit":0},
{"compte":"411000","libelle":"Client",
"debit":0,"credit":montant},
]
Étape 4 — Rapprochement bancaire
import pandas as pd
banque = pd.read_csv("releve_banque.csv", sep=";", parse_dates=["Date"])
ecritures = pd.read_excel("journal_compta.xlsx")
banque["match"] = None
for i, e in ecritures[ecritures.compte.isin(["512000","521100","521200"])].iterrows():
cond = ((banque["Montant"] == e["debit"] - e["credit"]) &
(abs((banque["Date"] - e["date_ecriture"]).dt.days) <= 3) &
(banque["match"].isna()))
idx = banque[cond].index[:1]
if len(idx):
banque.loc[idx, "match"] = e["id_ecriture"]
non_rapproches = banque[banque.match.isna()]
non_rapproches.to_excel("rapproch_a_traiter.xlsx", index=False)
print(f"{len(non_rapproches)} lignes à traiter manuellement")
Étape 5 — Relances clients
from datetime import date, timedelta
import pandas as pd, smtplib
from email.mime.text import MIMEText
impayes = pd.read_sql("""
SELECT f.id, f.numero, f.date_emission, f.montant_ttc, c.email, c.nom
FROM factures f JOIN clients c ON c.id = f.client_id
WHERE f.statut = 'envoyee' AND f.date_emission < CURRENT_DATE - 30
""", engine)
gabarit = """Bonjour {nom},
La facture {numero} du {date} d'un montant de {mt:,.0f} FCFA
est en attente de règlement ({jours} jours).
Merci de procéder au paiement via Wave au +221 77 123 45 67
ou par virement (IBAN SN...).
Cordialement,
Service comptable ITSkillsCenter
"""
for _, r in impayes.iterrows():
jours = (date.today() - r.date_emission.date()).days
msg = MIMEText(gabarit.format(
nom=r.nom, numero=r.numero, date=r.date_emission.date(),
mt=r.montant_ttc, jours=jours).replace(",", " "))
msg["Subject"] = f"Relance facture {r.numero}"
msg["From"] = "compta@itsc.sn"
msg["To"] = r.email
with smtplib.SMTP("smtp.example.sn", 587) as s:
s.starttls()
s.login("compta@itsc.sn", os.environ["SMTP_PWD"])
s.send_message(msg)
Étape 6 — TVA mensuelle
SELECT
SUM(CASE WHEN compte LIKE '443%' THEN credit - debit ELSE 0 END) AS tva_collectee,
SUM(CASE WHEN compte LIKE '445%' THEN debit - credit ELSE 0 END) AS tva_deductible,
SUM(CASE WHEN compte LIKE '443%' THEN credit - debit ELSE 0 END) -
SUM(CASE WHEN compte LIKE '445%' THEN debit - credit ELSE 0 END) AS tva_a_payer
FROM ecritures
WHERE date_ecriture BETWEEN '2026-04-01' AND '2026-04-30';
Étape 7 — Export FEC
df = pd.read_sql("""
SELECT
e.date_ecriture AS "JournalCode",
j.code AS "JournalLib",
e.numero AS "EcritureNum",
e.date_piece AS "PieceDate",
e.ref AS "PieceRef",
l.compte AS "CompteNum",
l.libelle AS "CompteLib",
l.debit AS "Debit",
l.credit AS "Credit"
FROM ecritures e
JOIN journaux j ON j.id = e.journal_id
JOIN lignes_ecriture l ON l.ecriture_id = e.id
WHERE e.date_ecriture BETWEEN %(d1)s AND %(d2)s
ORDER BY e.date_ecriture, e.numero
""", engine, params={"d1":"2026-01-01","d2":"2026-12-31"})
df.to_csv("FEC_2026.txt", sep="|", index=False, encoding="utf-8")
Étape 8 — Intégrations marché
Pennylane, QuickBooks, Sage: APIs REST
curl -X POST https://api.pennylane.eu/v2/invoices \
-H "Authorization: Bearer $TOKEN" -d @facture.json
Zapier: templates rapprochement
Make: "facture OCR → écriture → Airtable"
Sénégal: Wave Business dashboard + export CSV manuel
Étape 9 — Architecture cible
[Factures PDF] → OCR IA → [Base SQL]
↓
[Banque CSV] → rapprochement → [Base SQL]
↓
[Tableau bord trésorerie]
↓
[Relances auto] [TVA auto] [FEC expert-comptable]
Étape 10 — Checklist
✓ OCR Claude sur factures PDF
✓ Plan comptable SYSCOHADA en code
✓ Rapprochement bancaire mensuel
✓ Relances auto J30/J45/J60
✓ TVA calcul automatique
✓ FEC export annuel
✓ Documentation code dans README
✓ Tests unitaires sur écritures
Étape 1 : Cartographier vos flux comptables avant d’automatiser
Avant d’installer le moindre outil, listez sur papier les flux qui mangent vos heures : factures fournisseurs reçues par WhatsApp, tickets de caisse Mixx by Yas ou Wave, virements bancaires, notes de frais. Une PME dakaroise type traite entre 80 et 250 pièces par mois. Sans cette cartographie, vous automatisez du chaos.
Ouvrez un tableur, créez une colonne par type de pièce, le canal d’entrée, le délai actuel de saisie et l’erreur la plus fréquente. Vous obtenez une matrice qui guide chaque étape suivante.
Étape 2 : Choisir un logiciel adapté à la TVA et au plan SYSCOHADA
Le plan comptable SYSCOHADA révisé reste obligatoire pour toute PME des 17 pays OHADA. Privilégiez Odoo Community, Dolibarr ou Wave Accounting paramétrés en SYSCOHADA. Évitez les SaaS européens qui imposent un plan PCG français inadapté.
# Installation Dolibarr 20 sur Ubuntu 24.04 LTS
sudo apt update && sudo apt install -y apache2 mariadb-server php8.3 php8.3-{mysql,gd,curl,xml,zip,intl}
sudo mysql -e "CREATE DATABASE dolibarr; CREATE USER 'dol'@'localhost' IDENTIFIED BY 'MotDePasseFort'; GRANT ALL ON dolibarr.* TO 'dol'@'localhost';"
wget https://sourceforge.net/projects/dolibarr/files/Dolibarr%20ERP-CRM/20.0.2/dolibarr-20.0.2.tgz
tar xzf dolibarr-20.0.2.tgz -C /var/www/html/
Le serveur répond sur http://votre-vps/dolibarr/htdocs/install. Choisissez le module comptabilité OHADA dans les modules optionnels au premier lancement.
Étape 3 : Connecter Mixx by Yas et Wave pour récupérer les transactions
Mixx by Yas (ex Free Money) et Wave exposent des relevés CSV exportables depuis l’espace marchand. Programmez un cron quotidien à 23h45 qui télécharge le CSV et l’importe dans la table llx_bank_record de Dolibarr.
#!/bin/bash
# /usr/local/bin/import-mixx.sh
curl -u $MIXX_USER:$MIXX_PASS https://merchant.yas.sn/api/v1/transactions?date=$(date +%Y-%m-%d) -o /tmp/mixx.csv
mysql -u dol -p$DOL_PASS dolibarr -e "LOAD DATA LOCAL INFILE '/tmp/mixx.csv' INTO TABLE llx_bank_record FIELDS TERMINATED BY ','"
Le lendemain matin, la comptable retrouve toutes les transactions de la veille déjà rapprochées par référence. Vérifiez le journal /var/log/syslog pour confirmer que le cron s’exécute bien.
Étape 4 : Numériser les factures fournisseurs avec OCR
Installez Paperless-ngx sur le même VPS. Il accepte les PDF reçus par mail, fait l’OCR via Tesseract et extrait fournisseur, montant HT, TVA et date d’échéance. Comptez environ 8 secondes de traitement par facture sur un VPS 4 vCPU.
Connectez Paperless à une boîte mail dédiée comme factures@votre-pme.sn. Chaque PDF reçu déclenche le pipeline OCR puis pousse les métadonnées vers Dolibarr via webhook. Plus aucune saisie manuelle pour les factures lisibles.
Étape 5 : Paramétrer la TVA sénégalaise à 18 % et les exonérations
La TVA standard au Sénégal s’élève à 18 % depuis le Code général des impôts 2012. Certains secteurs comme la santé, l’éducation et l’export bénéficient d’exonérations. Créez dans Dolibarr trois taux : 18 % standard, 0 % export, 0 % exonéré non déductible.
Allez dans Comptabilité puis Configuration puis Taxes. Ajoutez chaque taux en spécifiant le compte SYSCOHADA correspondant : 4431 pour la TVA collectée, 4452 pour la TVA déductible sur biens. Une erreur de paramétrage fausse toutes vos déclarations DGI.
Étape 6 : Automatiser la déclaration DGI mensuelle au 15
La DGI Sénégal exige le dépôt de la déclaration TVA avant le 15 du mois suivant via le portail eTax. Programmez un script qui génère le PDF de déclaration le 10 de chaque mois et l’envoie à la comptable pour validation avant télétransmission.
0 8 10 * * /usr/bin/php /var/www/html/dolibarr/scripts/declaration_tva.php --month=$(date -d "last month" +%Y-%m) --output=/srv/declarations/
Le PDF généré reprend automatiquement le total HT, la TVA collectée et la TVA déductible avec la ventilation par taux. Il suffit de copier les chiffres dans eTax.
Étape 7 : Mettre en place le règlement par mourabaha BIS pour les achats
Pour financer vos achats de stock sans intérêt riba, utilisez la mourabaha de la Banque Islamique du Sénégal. La banque achète le bien et vous le revend avec une marge convenue à l’avance. Comptablement, enregistrez la marge en charge financière étalée sur la durée du paiement.
Dans Dolibarr, créez un journal dédié MOURABAHA-BIS et une nature de tiers Mourabaha pour distinguer ces opérations. Cela facilite l’audit annuel et évite toute confusion avec les emprunts conventionnels.
Étape 8 : Sauvegarder la base comptable chaque nuit
Une base comptable corrompue, c’est trois ans de bilans perdus. Programmez un mysqldump quotidien à 2h du matin chiffré avec age et envoyé sur un bucket Backblaze B2 à 5 USD le To, soit environ 3 280 FCFA.
0 2 * * * mysqldump dolibarr | age -r $AGE_PUBKEY | rclone rcat b2:pme-backup/dolibarr-$(date +%Y%m%d).sql.age
Testez la restauration une fois par trimestre. Une sauvegarde non testée n’existe pas. Le coût mensuel reste sous 2 000 FCFA pour une base de 5 Go.
Étape 9 : Former la comptable à lire les écritures générées
L’automatisation ne dispense pas de comprendre. Bloquez deux heures par semaine pendant un mois pour que la comptable parcoure le journal général et valide les écritures auto-générées. Elle détectera les biais du paramétrage initial.
Documentez chaque règle dans un wiki interne BookStack. Un nouveau collaborateur doit pouvoir reprendre le poste en une journée grâce à cette documentation vivante.
Étape 10 : Connecter Wave Business pour les paiements clients
Wave Business expose depuis 2024 une API REST officielle qui retourne en JSON tous les encaissements clients. Créez un token API depuis le portail Wave Business puis appelez l’endpoint /v1/transactions toutes les heures pour rapprocher les paiements aux factures Dolibarr ouvertes.
curl -H "Authorization: Bearer $WAVE_TOKEN" \
"https://api.wave.com/v1/transactions?since=$(date -d '1 hour ago' -u +%Y-%m-%dT%H:%M:%SZ)" \
| jq '.transactions[] | select(.status=="completed")' \
> /tmp/wave-recent.json
Le script lit ensuite le fichier et marque chaque facture correspondante comme payée dans Dolibarr via l’API REST native. Vous obtenez une trésorerie à jour en quasi temps réel.
Étape 11 : Générer les bulletins de paie conformes IPRES et CSS
Tout salarié sénégalais cotise à l’IPRES retraite à 14 % et à la CSS prestations familiales à 7 %. Le module Salaires de Dolibarr ne couvre pas ces taux locaux nativement. Installez le module dolibarr-paie-ohada disponible sur GitHub pour les calculs corrects.
Configurez les profils salariés cadres et non-cadres avec les plafonds IPRES de 432 000 FCFA et CSS de 63 000 FCFA. Le bulletin PDF généré reprend automatiquement la convention collective interprofessionnelle. Vérifiez chaque trimestre que les taux n’ont pas évolué via le site officiel ipres.sn.
Étape 12 : Tableau de bord trésorerie temps réel avec Metabase
Branchez Metabase sur la base MariaDB de Dolibarr en lecture seule. Créez un dashboard avec quatre cartes : trésorerie consolidée, créances clients à plus de 30 jours, dettes fournisseurs à échéance cette semaine, marge brute du mois en cours.
docker run -d --name metabase -p 3000:3000 \
-v metabase-data:/metabase-data \
metabase/metabase:v0.51
Le dirigeant ouvre l’URL chaque matin sur son téléphone. Plus besoin d’attendre le bilan trimestriel pour piloter. Limitez les droits Metabase à un compte SQL en SELECT uniquement pour éviter toute corruption accidentelle.
Étape 13 : Archiver dix ans de pièces selon le Code de commerce OHADA
L’Acte uniforme OHADA impose la conservation des pièces comptables pendant dix ans. Stockez les PDF originaux dans Paperless-ngx avec horodatage et empreinte SHA-256. Cette empreinte prouve l’intégrité en cas de contrôle fiscal.
Programmez une exportation annuelle vers un disque externe chiffré conservé hors site. Une PME qui perd ses archives risque un redressement forfaitaire reconstitué par la DGI, souvent défavorable.
Pour étoffer le tableau, consultez nos guides sur le blog ITSkillsCenter et la page contact pour un accompagnement personnalisé.
Étape 14 : Auditer chaque mois les écritures suspectes
Programmez une requête SQL qui détecte les écritures dont le montant dépasse trois fois la moyenne du compte ou dont le libellé est vide. Ces deux signaux suffisent à repérer 80 % des erreurs de saisie ou de paramétrage automatique.
SELECT b.rowid, b.label, b.amount, c.label AS compte
FROM llx_bookkeeping b JOIN llx_accounting_account c ON b.numero_compte=c.account_number
WHERE MONTH(b.doc_date)=MONTH(CURRENT_DATE)
AND (b.label='' OR b.amount > 3*(SELECT AVG(amount) FROM llx_bookkeeping WHERE numero_compte=b.numero_compte))
ORDER BY b.amount DESC;
Le rapport sort chaque premier lundi du mois et atterrit dans la boîte mail de la comptable. Vingt minutes de revue suffisent à corriger l’essentiel avant la clôture mensuelle.
Étape 15 : Préparer la migration vers e-facture DGI 2026
La DGI Sénégal prépare la généralisation de la facture électronique au format structuré au cours de 2026. Anticipez en générant déjà vos factures Dolibarr au format Factur-X qui combine PDF lisible et XML CII.
Activez le module factur-x dans Dolibarr et testez la génération sur cinq factures avant de basculer le parc complet. Les PME prêtes au moment du basculement obligatoire éviteront la rupture d’activité que vivront les retardataires.
Étape 16 : Documenter le plan de reprise d’activité comptable
Rédigez un document d’une page qui décrit comment relancer la comptabilité en moins de quatre heures après une panne majeure. Ce document doit lister l’URL du backup chiffré, la clé age de déchiffrement stockée chez le notaire, et la procédure de restauration MariaDB.
Faites un exercice de reprise réel chaque semestre. Une PME qui découvre sa procédure le jour du sinistre perd en moyenne sept jours d’activité, soit l’équivalent d’un mois de marge nette pour beaucoup de structures dakaroises et abidjanaises.