npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@drcmind/ohada-lib

v2.0.0

Published

A developer-friendly OHADA / SYSCOHADA accounting library that transforms business events into type-safe journal entries, manages stock movements, tracks expenses, and generates compliant financial reports.

Readme

Ohada Lib

npm version License: ISC Documentation

Une bibliothèque comptable OHADA / SYSCOHADA Révisé, pensée pour les développeurs. Transformez les événements métier d'une PME (ventes, achats, dépenses, etc.) en écritures comptables équilibrées et conformes, sans avoir à manipuler manuellement les débits et les crédits.

Fonctionnalités Principales

  • Conformité OHADA : Génération d'écritures respectant le SYSCOHADA Révisé.
  • Façades Métier Intuitives : Ventes, Achats, Dépenses (OPEX), Investissements (CAPEX), Virements, Inventaire et Financement.
  • Support Multi-Moyens de Paiement : Caisse (Cash), Banque (Bank) et Mobile Money.
  • Précision Décimale : Calculs financiers fiables basés sur decimal.js.
  • Typage Strict : Écrit intégralement en TypeScript.
  • Adaptation Locale : Configuration par défaut adaptée à la RDC (CDF, TVA à 16%), entièrement paramétrable.
  • Format Prêt pour Base de Données : Exportation via .toFlatEntries() idéal pour Firestore, SQL ou MongoDB.

Installation

npm install @drcmind/ohada-lib

Initialisation

Instanciez la bibliothèque en passant une configuration optionnelle (les valeurs par défaut sont CDF pour la devise et 16% pour la TVA).

import { Ohada } from '@drcmind/ohada-lib';

const ohada = new Ohada({
  currencyCode: 'CDF',
  defaultVatRate: 0.16,
  // Vous pouvez surcharger le plan comptable par défaut :
  // accountMapping: { salesRevenue: '7011', treasuryCash: '5711', ... }
});

Aperçu des APIs (Façades Métier)

1. Ventes (Sales)

Le cycle complet d'une vente (facturation, paiement, livraison).

// Constatation de la vente (Facturation)
const facture = ohada.sale.constate({
  saleId: 'SALE-001',
  items: [
    { name: 'Produit A', quantity: 2, price: 50000 },
    { name: 'Service B', quantity: 1, price: 20000, isTaxFree: true }
  ]
});

// Paiement (Multi-wallets : Cash, Bank, Mobile)
const paiement = ohada.sale.pay({
  saleId: 'SALE-001',
  payments: [
    { amount: 50000, walletType: 'CASH' },
    { amount: 66000, walletType: 'MOBILE' }
  ]
});

// Sortie de stock
const livraison = ohada.sale.deliver({
  saleId: 'SALE-001',
  inventoryValue: 70000
});

2. Dépenses OPEX & Investissements CAPEX

Enregistrement en une seule étape (Constatation + Paiement).

// Dépense d'exploitation (Ex: Frais internet)
const opex = ohada.expense.record({
  expenseAccountCode: '6241',
  amountHT: 100000,
  vatAmount: 16000,
  walletType: 'BANK',
  description: 'Paiement abonnement Internet'
});

// Achat d'une immobilisation (Ex: Ordinateur)
const capex = ohada.capex.record({
  assetAccountCode: '2441',
  amountHT: 500000,
  vatAmount: 80000,
  walletType: 'BANK',
  description: 'Achat MacBook'
});

3. Achats Fournisseurs (Purchases)

Cycle d'achat : de la constatation au règlement.

// Facture fournisseur
const achat = ohada.purchase.constate({
  amountHT: 100000,
  freightAmount: 5000, // Frais de transport
  vatAmount: 16800,
  description: 'Achat de marchandises'
});

// Réception en stock
const entreeStock = ohada.purchase.receive({
  inventoryValue: 105000
});

// Règlement du fournisseur
const reglement = ohada.purchase.pay({
  payments: [{ amount: 121800, walletType: 'BANK' }]
});

4. Virements Internes (Transfers)

Mouvement de fonds entre vos comptes avec traçabilité (Compte 585).

// Renflouer la caisse depuis la banque
const virement = ohada.transfer.execute({
  amount: 200000,
  fromWalletType: 'BANK',
  toWalletType: 'CASH'
});

5. Inventaire & Stocks (Inventory)

Ajustements, dépréciations et pertes de stock.

// Enregistrement d'un vol ou d'une casse
const perte = ohada.inventory.recordLoss({
  amount: 45000,
  description: 'Vol de stock'
});

// Dotation aux dépréciations
const depreciation = ohada.inventory.depreciate({
  amount: 15000,
  description: 'Obsolescence'
});

6. Financement (Emprunts)

Gestion des prêts reçus et de leurs remboursements.

// Réception d'un emprunt
const pret = ohada.financing.receiveLoan({
  amount: 10000000,
  walletType: 'BANK'
});

// Remboursement (Principal + Intérêts)
const remboursement = ohada.financing.repayLoan({
  principalAmount: 500000,
  interestAmount: 40000,
  walletType: 'BANK'
});

7. Onboarding & Soldes Initiaux

Injection des soldes d'ouverture au lancement du système. Calcule automatiquement le Capital (1011).

const ouverture = ohada.onboarding.generateOpeningBalances({
  assets: {
    '2111': 20000000, // Terrains
    '5211': 5000000   // Banque
  },
  liabilities: {
    '162': 1000000    // Emprunts
  }
});

Cas Pratiques (Use Cases)

Voici quelques exemples montrant comment combiner les différentes façades pour gérer des scénarios métier réels du quotidien d'une PME.

Scénario 1 : Vente au comptant avec paiement par Mobile Money

Un client achète des marchandises pour 100 000 FC HT (TVA 16%) et paie immédiatement via M-Pesa. Les marchandises sortent immédiatement du stock (valeur d'achat estimée à 70 000 FC).

// 1. Facturation
ohada.sale.constate({
  saleId: 'FAC-001',
  items: [{ name: 'Marchandises', quantity: 1, price: 100000 }] // Total TTC: 116 000
});

// 2. Paiement M-Pesa
ohada.sale.pay({
  saleId: 'FAC-001',
  payments: [{ amount: 116000, walletType: 'MOBILE' }]
});

// 3. Sortie de stock
ohada.sale.deliver({
  saleId: 'FAC-001',
  inventoryValue: 70000
});

Scénario 2 : Achat de fournitures de bureau payé par la Petite Caisse

L'entreprise achète du papier et des stylos pour 50 000 FC HT (TVA 16%) et règle directement le fournisseur en espèces depuis la caisse.

// 1. Constatation de la dépense
ohada.expense.record({
  expenseAccountCode: '6044', // Achats de fournitures de bureau
  amountHT: 50000,
  vatAmount: 8000,
  walletType: 'CASH', // Paiement immédiat par la petite caisse
  description: 'Achat RAM de papier'
});
// La librairie génère automatiquement :
// - Débit 6044 (50 000)
// - Débit 445 (8 000)
// - Crédit 4011 (58 000)
// - Débit 4011 (58 000)
// - Crédit 5711 (58 000)

Scénario 3 : Renflouement de la Petite Caisse depuis la Banque

La caisse est presque vide. Le comptable effectue un retrait de 500 000 FC à la banque pour alimenter la petite caisse de l'entreprise.

ohada.transfer.execute({
  amount: 500000,
  fromWalletType: 'BANK',
  toWalletType: 'CASH'
});
// La librairie génère automatiquement les écritures transitant par le compte 585 (Virements de fonds) pour une traçabilité parfaite.

Scénario 4 : Perte de stock suite à une inondation

Suite à un dégât des eaux, des marchandises d'une valeur d'achat de 250 000 FC sont déclarées irrécupérables.

ohada.inventory.recordLoss({
  amount: 250000,
  description: 'Perte de marchandises suite inondation'
});
// - Débit 6031 (Variation des stocks - Charge)
// - Crédit 311 (Stock de marchandises)

Intégration Base de données (Firestore / SQL)

Chaque façade retourne une instance de AccountingTransaction. Appelez la méthode toFlatEntries() pour obtenir un tableau plat facilement insérable dans n'importe quelle base de données (ex: collections Firestore, tables SQL).

const facture = ohada.sale.constate({ /* ... */ });

// Récupération au format plat :
const entries = facture.toFlatEntries();
/*
[
  { ohadaAccountCode: '4111', typeMouvement: 'DEBIT', amount: 116000, label: '...' },
  { ohadaAccountCode: '7011', typeMouvement: 'CREDIT', amount: 100000, label: '...' },
  { ohadaAccountCode: '4431', typeMouvement: 'CREDIT', amount: 16000, label: '...' }
]
*/

// Exemple Firestore :
const batch = db.batch();
entries.forEach(entry => {
  const docRef = db.collection(`companies/C1/accountingEntries`).doc();
  batch.set(docRef, {
    ...entry,
    transactionId: facture.id,
    occurredAt: facture.occurredAt
  });
});
await batch.commit();

Documentation

  • Site de documentation : https://Drc-Mind.github.io/ohda-lib/

License

ISC