from datetime import datetime
class EcritureComptable:
def __init__(self, compte: str, libelle: str, montant: float, type_operation:
str, date: datetime,
journal: str,
reference_document = None, id_facture_vente = None,
id_facture_achat=None, type_document = None):
if type_operation not in ["DEBIT", "CREDIT"]:
raise ValueError("Le type d'opération doit être 'DEBIT' ou 'CREDIT'.")
if montant < 0:
raise ValueError("Le montant doit être positif.")
[Link] = compte
[Link] = libelle
[Link] = montant
self.type_operation = type_operation # "DEBIT" ou "CREDIT"
[Link] = date
[Link] = journal
self.reference_document = reference_document
self.id_facture_vente = id_facture_vente
self.id_facture_achat = id_facture_achat
self.type_document = type_document # 'VENTE', 'ACHAT', 'DEPENSE_DIRECTE',
'PAIEMENT_PAIE', etc.
def __repr__(self):
return (f"Ecriture(Compte: {[Link]}, Libellé: {[Link]}, Montant:
{[Link]},"
f" Type: {self.type_operation}, Date: {[Link]('%Y-%m-
%d')},"
f" Journal: {[Link]}, Ref: {self.reference_document},
TypeDoc: {self.type_document},"
f" FV_ID: {self.id_facture_vente}, FA_ID:
{self.id_facture_achat})")
# --- Fonctions de Génération d'Écritures pour les Opérations ---
def generer_ecritures_facture_vente(montant_ht: float, tva_taux: float,
date_emission: datetime,
numero_facture: str, id_facture_vente: str,
compte_client: str = "411000"):
"""
Génère les écritures pour une facture de vente avec TVA (créance client).
Codes SYSCOHADA: Client (D), Ventes (C), TVA Facturée (C).
"""
montant_tva = round(montant_ht * tva_taux, 2)
montant_ttc = round(montant_ht + montant_tva, 2)
ecritures = []
# 1. Débit du compte client (créance)
[Link](EcritureComptable(compte_client, f"Facture vente
{numero_facture}", montant_ttc, "DEBIT",
date_emission, journal="Ventes",
reference_document=numero_facture,
id_facture_vente=id_facture_vente, type_document="VENTE"))
# 2. Crédit du compte de produit (chiffre d'affaires)
[Link](EcritureComptable("701000", f"Vente marchandises
{numero_facture}", montant_ht, "CREDIT",
date_emission, journal="Ventes",
reference_document=numero_facture,
id_facture_vente=id_facture_vente, type_document="VENTE"))
# 3. Crédit du compte de TVA collectée
[Link](EcritureComptable("443100", f"TVA facturée {numero_facture}",
montant_tva, "CREDIT",
date_emission, journal="Ventes",
reference_document=numero_facture,
id_facture_vente=id_facture_vente, type_document="VENTE"))
return ecritures
def generer_ecritures_paiement_vente(montant_ttc: float, numero_facture: str,
date_paiement: datetime,
id_facture_vente: str, compte_client: str =
"411000", compte_banque: str = "521100"):
"""
Génère les écritures pour l'encaissement d'une facture client.
Codes SYSCOHADA: Banque (D), Client (C).
"""
ecritures = [
# Débit du compte banque (augmentation de l'argent disponible)
EcritureComptable(
compte_banque,
libelle=f"Paiement facture {numero_facture}",
montant=round(montant_ttc, 2),
type_operation="DEBIT",
date=date_paiement,
journal="Banque",
reference_document=f"PAY-{numero_facture}",
id_facture_vente=id_facture_vente,
type_document="PAIEMENT_VENTE"
),
# Crédit du compte client (diminution de la créance)
EcritureComptable(
compte_client,
libelle=f"Paiement facture {numero_facture}",
montant=round(montant_ttc, 2),
type_operation="CREDIT",
date=date_paiement,
journal="Banque",
reference_document=f"PAY-{numero_facture}",
id_facture_vente=id_facture_vente,
type_document="PAIEMENT_VENTE"
)
]
return ecritures
def generer_ecritures_facture_achat(montant_ht: float, tva_taux: float,
date_reception: datetime,
numero_facture: str, compte_charge_affecte:
str,
id_facture_achat: str, compte_fournisseur: str
= "401000"):
"""
Génère les écritures pour une facture d'achat avec TVA (dette fournisseur).
Codes SYSCOHADA: Compte de charge (D), TVA Récupérable (D), Fournisseur (C).
"""
montant_tva = round(montant_ht * tva_taux, 2)
montant_ttc = round(montant_ht + montant_tva, 2)
ecritures = [
# Débit du compte de charge
EcritureComptable(
compte_charge_affecte,
libelle=f"Facture achat {numero_facture}",
montant=round(montant_ht, 2),
type_operation="DEBIT",
date=date_reception,
journal="Achats",
reference_document=numero_facture,
id_facture_achat=id_facture_achat,
type_document="ACHAT"
),
# Débit du compte de TVA déductible
EcritureComptable(
compte="445200", # SYSCOHADA: TVA récupérable
libelle=f"TVA sur achat {numero_facture}",
montant=montant_tva,
type_operation="DEBIT",
date=date_reception,
journal="Achats",
reference_document=numero_facture,
id_facture_achat=id_facture_achat,
type_document="ACHAT"
),
# Crédit du compte fournisseur
EcritureComptable(
compte_fournisseur,
libelle=f"Facture achat {numero_facture}",
montant=montant_ttc,
type_operation="CREDIT",
date=date_reception,
journal="Achats",
reference_document=numero_facture,
id_facture_achat=id_facture_achat,
type_document="ACHAT"
)
]
return ecritures
def generer_ecritures_paiement_achat(montant_ttc: float, numero_facture: str,
date_paiement: datetime,
id_facture_achat: str, compte_fournisseur: str
= "401000", compte_banque: str = "521100"):
"""
Génère les écritures pour le paiement d'une facture fournisseur.
Codes SYSCOHADA: Fournisseur (D), Banque (C).
"""
ecritures = [
# Débit du compte fournisseur (diminution de la dette)
EcritureComptable(
compte_fournisseur,
libelle=f"Paiement facture fournisseur {numero_facture}",
montant=round(montant_ttc, 2),
type_operation="DEBIT",
date=date_paiement,
journal="Banque",
reference_document=f"PAYF-{numero_facture}",
id_facture_achat=id_facture_achat,
type_document="PAIEMENT_ACHAT"
),
# Crédit du compte banque (diminution de la trésorerie)
EcritureComptable(
compte_banque,
libelle=f"Paiement facture fournisseur {numero_facture}",
montant=round(montant_ttc, 2),
type_operation="CREDIT",
date=date_paiement,
journal="Banque",
reference_document=f"PAYF-{numero_facture}",
id_facture_achat=id_facture_achat,
type_document="PAIEMENT_ACHAT"
)
]
return ecritures
def generer_ecritures_depense_directe(montant: float, compte_charge: str, libelle:
str, date_depense: datetime,
compte_tresorerie: str = "521100", journal:
str = "Banque", reference = None):
"""
Génère les écritures pour une dépense payée directement (sans facture préalable
fournisseur).
Codes SYSCOHADA: Compte de charge (D), Trésorerie (C).
"""
ecritures = [
# Débit du compte de charge
EcritureComptable(
compte_charge,
libelle=libelle,
montant=round(montant, 2),
type_operation="DEBIT",
date=date_depense,
journal=journal,
reference_document=reference,
type_document="DEPENSE"
),
# Crédit du compte banque ou caisse
EcritureComptable(
compte_tresorerie,
libelle=libelle,
montant=round(montant, 2),
type_operation="CREDIT",
date=date_depense,
journal=journal,
reference_document=reference,
type_document="DEPENSE"
)
]
return ecritures
def generer_ecritures_depot_especes(montant: float, date_depot: datetime,
compte_destination_banque: str, reference = None):
"""
Génère les écritures pour un dépôt d'espèces de la caisse du magasin vers un
compte bancaire.
Codes SYSCOHADA: Banque (D), Caisse (C).
"""
ecritures = [
# Débit du compte bancaire (augmentation de la trésorerie en banque)
EcritureComptable(
compte_destination_banque,
libelle= compte_destination_banque,
montant=round(montant, 2),
type_operation="DEBIT",
date=date_depot,
journal="Banque", # L'opération impacte le journal de banque
reference_document=reference,
type_document="DEPOT_ESPECES"
),
# Crédit du compte caisse (diminution de la trésorerie en caisse)
EcritureComptable(
compte="571000", # SYSCOHADA: Caisse
libelle=compte_destination_banque,
montant=round(montant, 2),
type_operation="CREDIT",
date=date_depot,
journal="Caisse", # L'opération impacte aussi le journal de caisse
reference_document=reference,
type_document="DEPOT_ESPECES"
)
]
return ecritures
def generer_ecritures_paie_mensuelle(date: datetime, salaire_brut: float,
taux_cnss_salariale: float, taux_cnss_patronale: float,
libelle_periode: str = "du mois",
compte_banque_paiement: str = "521100"):
"""
Génère les écritures pour la comptabilisation de la paie mensuelle (simplifiée
SYSCOHADA).
N'inclut pas l'IRPP.
Inclut la constatation des charges et dettes, et les paiements.
"""
cotisations_salariales = round(salaire_brut * taux_cnss_salariale, 2)
cotisations_patronales = round(salaire_brut * taux_cnss_patronale, 2)
salaire_net_a_payer = round(salaire_brut - cotisations_salariales, 2)
montant_total_cotisations_sociales = round(cotisations_salariales +
cotisations_patronales, 2)
libelle_constatation = f"Constatation paie {libelle_periode}"
libelle_paiement_net = f"Paiement salaire net {libelle_periode}"
libelle_paiement_social = f"Règlement cotisations sociales {libelle_periode}"
journal_paie_constatation = "Opérations Diverses"
ecritures = []
# Étape 1: Constatation de la charge de rémunération et des dettes (souvent en
fin de mois)
# Débit: 631000 Rémunération du personnel (pour le salaire brut total)
[Link](EcritureComptable("631000", libelle_constatation,
salaire_brut, "DEBIT", date, journal_paie_constatation))
# Crédit: 421000 Personnel - Rémunérations dues (pour le net à payer à
l'employé)
[Link](EcritureComptable("421000", libelle_constatation,
salaire_net_a_payer, "CREDIT", date, journal_paie_constatation))
# Crédit: 431000 Organismes sociaux (pour les cotisations salariales)
[Link](EcritureComptable("431000", libelle_constatation,
cotisations_salariales, "CREDIT", date, journal_paie_constatation))
# Étape 2: Constatation des charges patronales et de la dette envers organismes
sociaux
# Débit: 632000 Charges sociales du personnel (pour les cotisations patronales)
[Link](EcritureComptable("632000", libelle_constatation,
cotisations_patronales, "DEBIT", date, journal_paie_constatation))
# Crédit: 431000 Organismes sociaux (pour les cotisations patronales)
[Link](EcritureComptable("431000", libelle_constatation,
cotisations_patronales, "CREDIT", date, journal_paie_constatation))
# Étape 3: Paiement du salaire net à l'employé (à la date du paiement réel)
# Débit: 421000 Personnel - Rémunérations dues (solde la dette envers
l'employé)
[Link](EcritureComptable("421000", libelle_paiement_net,
salaire_net_a_payer, "DEBIT", date, "Banque", type_document="PAIEMENT_PAIE"))
# Crédit: 521XXX Banque (sortie d'argent)
[Link](EcritureComptable(compte_banque_paiement,
libelle_paiement_net, salaire_net_a_payer, "CREDIT", date, "Banque",
type_document="PAIEMENT_PAIE"))
# Étape 4: Paiement des cotisations sociales aux organismes (à la date du
paiement réel)
# Débit: 431000 Organismes sociaux (solde la dette envers les organismes)
[Link](EcritureComptable("431000", libelle_paiement_social,
montant_total_cotisations_sociales, "DEBIT", date, "Banque",
type_document="PAIEMENT_COTISATIONS"))
# Crédit: 521XXX Banque (sortie d'argent)
[Link](EcritureComptable(compte_banque_paiement,
libelle_paiement_social, montant_total_cotisations_sociales, "CREDIT", date,
"Banque", type_document="PAIEMENT_COTISATIONS"))
return ecritures