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