Aller au contenu principal

Gestion des Ventes & Revenus

Enregistrez les revenus de ventes, gérez les créances clients et suivez les sorties de stocks selon les normes SYSCOHADA. Gérez les scénarios complexes incluant les escomptes financiers, frais de transport, consignations d'emballages et paiements échelonnés.

Le Cycle de Vente

En SYSCOHADA, une vente est enregistrée en trois étapes au maximum :

  1. Constatation — Enregistrement de la facture et de la créance client (Compte 4111).
  2. Sortie de Stock (optionnel) — Enregistrement du coût des marchandises vendues (Compte 6031 / 311).
  3. Réglement — Enregistrement du/des paiement(s) reçu(s) pour solder la créance.

Chaque étape est une écriture équilibrée séparée pour piste d'audit claire.

Exemples Rapides

Vente Simple à Crédit

const journal = ohada.recordSale({
amount: 100000,
label: "Marchandises",
saleType: 'GOODS',
vatRate: 18
});

Résultat : 1 écriture (Constatation uniquement)

Vente avec Paiement Immédiat

const journal = ohada.recordSale({
amount: 100000,
label: "Vente comptant",
saleType: 'GOODS',
vatRate: 18,
payments: [{ method: 'cash', amount: 118000 }]
});

Résultat : 2 écritures (Constatation + Réglement)


Référence des Types

SaleInput

interface SaleInput {
// Requis
amount: number; // Montant vente (HT)
label: string; // Description (ex : "Vente marchandises")
saleType: SaleType; // 'GOODS' | 'MANUFACTURED' | 'SERVICES'

// Optionnel
date?: Date; // Date transaction (défaut : maintenant)
vatRate?: number; // Taux TVA en % (défaut : 18)

// Options Avancées
financialDiscount?: FinancialDiscount; // Escompte (enregistré comme dépense)
packagingDeposit?: PackagingDeposit; // Consignation (pas de TVA)
transportCharge?: TransportCharge; // Port facturé (7071)
inventoryExit?: InventoryExit; // Sortie stock (coût des biens)
payments?: SalePayment[]; // Un ou plusieurs paiements
}

SaleType

type SaleType = 'GOODS' | 'MANUFACTURED' | 'SERVICES';

SalePayment

interface SalePayment {
method: 'cash' | 'bank'; // Mode paiement
amount: number; // Montant reçu
}

FinancialDiscount

interface FinancialDiscount {
percentage: number; // ex : 2 pour 2% (enregistré comme dépense 673)
}

TransportCharge

interface TransportCharge {
amount: number; // Montant transport (ajouté à base TVA)
description?: string;
}

PackagingDeposit

interface PackagingDeposit {
amount: number; // Montant consignation (NON soumis à TVA)
description?: string;
}

InventoryExit

interface InventoryExit {
costPrice: number; // Coût des biens vendus (CMUP - coût moyen pondéré)
}

Fonctionnalités Principales

Classification des Revenus

Les revenus sont automatiquement mappés au bon compte SYSCOHADA selon type vente :

Type VenteCompteDescription
GOODS701Vente de marchandises.
MANUFACTURED702Vente de produits finis.
SERVICES706Revenu de services.
const goodsSale = ohada.recordSale({
amount: 50000,
label: "Vente Stock",
saleType: 'GOODS'
});

const serviceSale = ohada.recordSale({
amount: 25000,
label: "Consulting",
saleType: 'SERVICES'
});

Transport & Emballages

Incluez les frais d'expédition et montants de consignation dans factures.

const journal = ohada.recordSale({
amount: 100000,
label: "Vente avec frais",
saleType: 'GOODS',
vatRate: 18,
transportCharge: { amount: 5000 },
packagingDeposit: { amount: 1000 }
});

Points Clés :

  • Transport (5 000) s'ajoute à base imposable → TVA calculée sur 105 000
  • Consignation Emballage (1 000) est dette → PAS soumise à TVA

Escompte Financier

Enregistrez escomptes paiement anticipé comme dépense (Compte 673).

const journal = ohada.recordSale({
amount: 100000,
label: "Vente avec escompte",
saleType: 'GOODS',
vatRate: 18,
financialDiscount: { percentage: 2 } // 2% = 2 000
});

Écriture Générée :

  • D 4111 : 116 360 (Créance client = 100 000 - 2 000 + 18% TVA)
  • D 673 : 2 000 (Charge financière - escompte accordé)
  • C 701 : 100 000 (Revenu)
  • C 4431 : 18 360 (TVA sur 102 000)

Sortie de Stock (Coût des Marchandises)

Enregistrez automatiquement réduction stock lors vente.

const journal = ohada.recordSale({
amount: 100000,
label: "Vente marchandises",
saleType: 'GOODS',
inventoryExit: { costPrice: 65000 }
});

Écritures Générées :

  1. Constatation — Facture (4111/701)
  2. Sortie de Stock — Coût biens :
    • D 6031 : 65 000 (Coût des ventes)
    • C 311 : 65 000 (Réduction stock)

Paiements Échelonnés (Paiements Fractionnés)

Recevez paiement en plusieurs versements via différentes méthodes.

const journal = ohada.recordSale({
amount: 100000,
label: "Vente paiement échelonné",
saleType: 'GOODS',
vatRate: 18,
payments: [
{ method: 'cash', amount: 59000 },
{ method: 'bank', amount: 59000 }
]
});

Écritures Générées :

  1. Constatation (facture)
  2. Réglement #1 (caisse, -59 000)
  3. Réglement #2 (banque, -59 000)

Chaque paiement est écriture séparée pour suivi clair.


Avoirs (Retours / Ventes Négatives)

Enregistrez retours avec montants négatifs.

const journal = ohada.recordSale({
amount: -50000,
label: "Retour produit défectueux",
saleType: 'GOODS',
vatRate: 18
});

Ceci génère avoir avec montants inversés (débits deviennent crédits et vice versa).


Correspondance des Comptes

FonctionnalitéCompteDescription
Vente Marchandises701Ventes marchandises.
Produits Finis702Produits manufacturés.
Services706Revenus services.
Transport Facturé7071Transport/port facturé client.
TVA Collectée4431TVA sur ventes (dette TVA).
Escompte Accordé673Escomptes accordés.
Créance Client4111Créances clients.
Consignation Emballage4194Consignations emballages (dette).
Coût des Ventes6031Coût marchandises vendues.
Stock311Stock marchandises.
Compte Caisse5711Caisse en main.
Compte Banque5211Dépôts bancaires.

Exemple Complet : Vente Complexe

Vente réaliste incluant transport, emballage, escompte, sortie stock et paiement échelonné :

const journal = ohada.recordSale({
amount: 1000000,
label: "Vente - Commande #X2026",
date: new Date('2026-01-15'),
saleType: 'GOODS',
vatRate: 18,

// Frais accessoires
transportCharge: { amount: 50000 },
packagingDeposit: { amount: 10000 },

// Escompte paiement anticipé
financialDiscount: { percentage: 2 },

// Suivi coût standard
inventoryExit: { costPrice: 650000 },

// Paiement échelonné
payments: [
{ method: 'bank', amount: 588000 },
{ method: 'cash', amount: 588000 }
]
});

Écritures de Journal Générées (4 au total) :

#TypeCompteDébitCréditDescription
1Constatation41111 175 600Créance totale
1Constatation67320 000Escompte paiement anticipé (2%)
1Constatation7011 000 000Revenu
1Constatation707150 000Transport facturé
1Constatation4431189 000TVA (18% sur 1 050 000)
1Constatation419410 000Consignation emballage
2Sortie Stock6031650 000Coût marchandises vendues
2Sortie Stock311650 000Réduction stock
3Réglement5211588 000Entrée banque
3Réglement4111588 000Réduction créance
4Réglement5711588 000Entrée caisse
4Réglement4111588 000Réduction créance

Règles Clés

Classification revenus — Mapping automatique selon type vente (GOODS/MANUFACTURED/SERVICES).

Base imposable — Transport inclus ; consignation emballage exclue TVA.

Escompte financier — Enregistré comme dépense (673), réduit créance client.

Suivi inventaire — Écriture séparée coût biens vendus si fourni.

Paiements échelonnés — Chaque paiement est écriture propre pour clarté piste d'audit.

Piste d'audit — Toutes phases transaction sont écritures séparées avec traçabilité totale.


Référence des Paramètres

ParamètreTypeRequisExempleNotes
amountnumberOui100000Montant vente (HT).
labelstringOui"Vente marchandises"Description transaction.
saleTypeSaleTypeOui'GOODS'Détermine compte revenu (701/702/706).
dateDateNonnew Date()Défaut : maintenant.
vatRatenumberNon18Taux TVA (défaut : 18, ignoré si disableVAT: true).
financialDiscountFinancialDiscountNon{percentage: 2}Escompte paiement anticipé (dépense 673).
transportChargeTransportChargeNon{amount: 5000}Inclus dans base imposable.
packagingDepositPackagingDepositNon{amount: 1000}Exclu TVA.
inventoryExitInventoryExitNon{costPrice: 65000}Génère écriture sortie stock séparée.
paymentsSalePayment[]Non[{method: 'bank', amount: 100000}]Un ou plusieurs paiements ; chacun génère écriture séparée.