VAN INTERNATIONAL SA

Documentation VAN Comptabilité

Guide utilisateur, architecture technique, exploitation, schéma de base de données et inventaire des dépendances — OHADA / SYSCOHADA.

Produitvan-comptabilite 1.0.0
APIapi.vancomptabilite.com
StackReact · Express · MySQL
Réalisé parDOWHILE SARL

Guide utilisateur

Documentation utilisateur

VAN Comptabilité

Guide complet pour utiliser la plateforme comptable VAN INTERNATIONAL SA, conforme au référentiel OHADA / SYSCOHADA : comptabilité générale, achats, ventes, stocks, trésorerie, contrôle de gestion et intégrations.

Public Comptables, DAF, assistants, dirigeants
Devise courante XAF (FCFA) — multi-devises possible
Accès typique Navigateur web (desktop recommandé)

1. Connexion & session

Se connecter

  1. Ouvrez l’application dans votre navigateur.
  2. Saisissez votre email et votre mot de passe.
  3. Cliquez sur le bouton de connexion.
  4. Après authentification, la société active et l’exercice sont chargés.
Session sécurisée. L’accès est géré par cookies httpOnly. Vous n’avez pas à gérer de jeton manuellement. Après une période d’inactivité, reconnectez-vous si la session a expiré.

Se déconnecter

Utilisez l’action Déconnexion dans la barre supérieure. Cela invalide la session côté serveur.

Mot de passe oublié / changement

Pour changer votre mot de passe une fois connecté : Paramètres → Mot de passe.

2. Interface générale

Menu latéral

Le menu regroupe les modules :

  • Accueil comptable
  • Comptabilité générale
  • Tiers
  • Achats & ventes
  • Stocks
  • Trésorerie
  • Contrôle de gestion
  • Déclarations & états
  • VAN & intégrations
  • Paramètres

Barre supérieure

  • Société active — société sur laquelle vous travaillez
  • Exercice — année / période comptable
  • Notifications
  • Déconnexion
Important. Toutes les opérations (factures, stocks, écritures) s’appliquent à la société active sélectionnée.

Conventions d’écran

  • Tableaux avec filtres, recherche et actions par ligne
  • Boutons + Nouveau / Ajouter pour créer
  • Statuts affichés sous forme de pastilles (Brouillon, Validé, Payée…)
  • Exports PDF / Excel / Impression selon l’écran

3. Multi-sociétés

L’application gère plusieurs entités du groupe. Chaque document, écriture et stock est isolé par société.

Changer de société

  1. Cliquez sur le sélecteur Société active en haut.
  2. Choisissez la société autorisée pour votre compte.
  3. Attendez le rechargement des données.

Les utilisateurs SUPER_ADMIN peuvent accéder à toutes les sociétés. Les autres utilisateurs ne voient que les sociétés qui leur sont attribuées.

Création / édition des sociétés : menu Paramètres → Sociétés.

4. Rôles & permissions

Rôle Droits typiques
SUPER_ADMIN Tous les modules + gestion des utilisateurs & privilèges + toutes les sociétés
ADMIN Accès large à tous les modules métier
ASSISTANT_COMPTABLE / COMPTABLE Modules selon les permissions cochées

Modules de permission

CléAccès
dashboardAccueil & tableaux de bord
accountingComptabilité générale
tiersClients & fournisseurs
purchasesAchats
salesVentes
stocksStocks
treasuryTrésorerie
analyticsContrôle de gestion
reportsDéclarations & états
integrationsVAN & imports
settingsParamètres / sociétés / devises

Gestion : Paramètres → Utilisateurs & privilèges (réservé au SUPER_ADMIN). Le profil, les infos société et le mot de passe restent accessibles à tout utilisateur connecté.

5. Accueil & tableaux de bord

Accueil /

Vue de pilotage : indicateurs OHADA/SYSCOHADA, alertes de workflows (factures ouvertes, validations en attente, etc.) et raccourcis vers les écrans clés.

Tableau de bord financier /tresorerie/dashboard-daf

Vision DAF consolidée de la trésorerie et de la santé financière de la société active.

6. Comptabilité générale

6.1 Plan comptable général

Référentiel des comptes SYSCOHADA de la société.

  • Créer un compte (code, libellé, classe, type)
  • Importer / exporter le plan
  • Activer ou désactiver un compte

6.2 Saisie des écritures

Pièces manuelles (OD, régularisations, etc.).

  1. Cliquez sur + Nouvelle écriture.
  2. Renseignez la date, le journal, le libellé et la référence.
  3. Ajoutez les lignes débit / crédit (le total débit doit égaler le total crédit).
  4. Enregistrez. L’écriture alimente le journal, le grand livre et la balance.
De nombreuses écritures sont aussi générées automatiquement par les factures, règlements, réceptions et livraisons.

6.3 Livres & états comptables

ÉcranUsage
Livre journalChronologie obligatoire des écritures
Journaux comptablesParamétrage des journaux (ACH, VTE, BNQ…)
Journal généralCentralisation
Grand LivreMouvements par compte, filtrables par période
Balance généraleSoldes (vues 2 / 4 / 6 colonnes)
Livre d’inventaireSynthèse utile en clôture
Piste d’auditHistorique des actions sensibles

6.4 Clôtures périodiques

Verrouillez un mois pour empêcher les modifications a posteriori. Vous pouvez clôturer ou rouvrir une période selon vos droits.

Statuts : Ouverte Clôturée

7. Tiers

Fichier clients

Référentiel clients : identité, contacts, compte tiers, conditions.

Actions : Ajouter, Modifier, Supprimer, consulter le détail.

Fichier fournisseurs

Référentiel fournisseurs, même logique que les clients.

Balances âgées

Analyse de l’ancienneté des créances (clients) et dettes (fournisseurs) par tranches d’âge. Utile pour le recouvrement et le pilotage trésorerie.

8. Cycle achats

Commande (BC) Réception (BR) Facture Paiement

8.1 Commandes fournisseurs

  1. Ouvrez Achats & ventes → Commandes fournisseurs.
  2. Créez un Nouveau bon : fournisseur, lignes articles, quantités, prix.
  3. Enregistrez en Brouillon puis validez si nécessaire.

Statuts fréquents : Brouillon Validé Réception partielle Réception totale Facturé Clôturé Annulé

8.2 Réceptions fournisseurs

  • Réception depuis une commande (totale ou partielle)
  • Ou BR manuel
  • Validation de réception → entrée en stock SYSCOHADA
  • PDF / Impression disponibles

8.3 Factures fournisseurs

  1. Créez une facture depuis une réception ou manuellement.
  2. À l’enregistrement, la facture est en général Comptabilisée avec écriture automatique.
  3. Lancez le paiement (« Oui, payer maintenant ») ou passez par Règlements fournisseurs.

Statuts paiement : Impayée Partiellement payée Payée

8.4 Avoirs fournisseurs

Notes de crédit fournisseur pour retours, rabais ou corrections.

9. Cycle ventes

Devis Commande (BC) Livraison (BL) Facture Encaissement

9.1 Devis

  1. Créez un devis client avec les lignes de produits / services.
  2. Soumettez puis validez (ou rejetez).
  3. Utilisez Transformer en BC pour générer la commande client.

Statuts : Brouillon Soumis Validé Rejeté Transformé en BC

9.2 Commandes clients

  • Soumettre → Valider / Rejeter
  • Livrer : génère un bon de livraison
  • Facturer : crée la facture client

9.3 Livraisons clients

Création depuis commande ou manuelle. Après validation : sortie de stock et possibilité de facturer.

9.4 Factures clients

Facture comptabilisée avec écriture automatique, puis Valider l’encaissement ou passer par Règlements clients.

9.5 Avoirs clients

Avoirs de vente pour retours, remises ou annulations partielles.

10. Stocks

Articles

Catalogue produits / services : référence, libellé, comptes associés, suivi de stock, quantités.

Si un article est en suivi de stock, les quantités évoluent surtout via réceptions (entrées) et livraisons (sorties).

Tarifs fournisseurs

Définissez les prix d’achat par fournisseur pour faciliter les commandes.

Mouvements de stock

Traçabilité des entrées, sorties et ajustements (souvent automatiques).

Valorisation

Valorisation selon la méthode CMUPACE (coût moyen pondéré).

11. Trésorerie

Prévisions

Anticipation J+30 / J+60 / J+90. Vous pouvez générer des prévisions à partir des factures ouvertes ou ajouter des lignes manuelles.

Règlements clients

  1. Choisissez le client et la (les) facture(s) à encaisser.
  2. Indiquez le mode (espèces, virement, chèque, OM, MoMo…), le compte de trésorerie et le montant.
  3. Enregistrez : écriture + lettrage (lettré / partiellement lettré).

Règlements fournisseurs

Même logique en décaissement : payer une facture ou le solde restant.

Rapprochement bancaire

  • Créer un rapprochement sur un compte banque / caisse
  • Importer un relevé
  • Comparer solde relevé vs solde comptable
  • Analyser les écarts (Rapproché / Écart à analyser)

12. Contrôle de gestion

ÉcranÀ quoi ça sert
Projets & ChantiersSuivi BTP / prestations par projet
Prix de revientCoûts réels vs budget
Centres de coûtsNomenclature analytique DAF
Saisie budgétaireSaisir les budgets
Suivi budgétaireÉcarts et alertes de dépassement
SectionsAxes analytiques
Postes analytiquesDétail des postes
Balance analytiqueSoldes par axe / poste

13. Déclarations & états

États financiers

Bilan et compte de résultat périodiques (mois, trimestre, semestre, exercice) pour la société active.

Déclaration TVA

Synthèse TVA collectée / déductible. Préparez la déclaration, enregistrez, exportez en PDF ou Excel.

Immobilisations

  • Ajouter un actif (valeur, durée, compte…)
  • Générer les dotations aux amortissements

14. VAN & outils

Validations VAN

Demandes provenant des systèmes RH, Logistique ou BTP. Pour chaque demande :

  • Valider → génère les écritures comptables associées
  • Rejeter → refuse le flux

Statuts : PENDING VALIDATED REJECTED

Import de données

Import Excel des référentiels :

  • Clients
  • Fournisseurs
  • Produits
  • Plan comptable

Modes : Ajouter (append) ou Remplacer. Téléchargez d’abord le modèle, remplissez-le, puis lancez l’import.

Sauvegarde / restauration

Menu VAN & intégrations → Sauvegarde / restauration (/outils/sauvegarde).

Procédure de sauvegarde (JSON applicatif)

  1. Connectez-vous avec un compte autorisé (permissions intégrations ou paramètres).
  2. Vérifiez la société active si vous travaillez en multi-sociétés.
  3. Ouvrez Sauvegarde / restauration.
  4. Contrôlez les compteurs affichés (clients, fournisseurs, écritures, factures).
  5. Cliquez sur Télécharger la sauvegarde.
  6. Conservez le fichier van-compta-backup-AAAA-MM-JJ.json hors du poste (disque externe, cloud sécurisé).

Procédure de restauration (JSON applicatif)

Attention. La restauration remplace la base locale du navigateur. Faites d’abord une nouvelle sauvegarde de l’état actuel avant de restaurer.
  1. Ouvrez Sauvegarde / restauration.
  2. Cliquez sur Restaurer un fichier.
  3. Sélectionnez un fichier .json de sauvegarde VAN valide.
  4. Attendez le message de confirmation « Restauration terminée ».
  5. Rechargez la page si nécessaire et contrôlez quelques écrans clés (clients, factures, écritures).

En production, cette sauvegarde JSON est un complément : la sauvegarde de référence reste le dump MySQL + le dossier uploads/ (voir document d’exploitation).

15. Paramètres

Hub Paramètres

  • Mon profil — identité utilisateur
  • Informations société — raison sociale, RCCM, NIU, adresse, devise, exercice, logo…
  • Mot de passe — changement sécurisé
  • Utilisateurs & privilèges — SUPER_ADMIN uniquement

Devises

Taux de change (référentiel BEAC) et convertisseur.

Consolidation

Vue groupe : détection des transactions intra-groupe, éliminations, validation et saisie manuelle si besoin.

16. Bonnes pratiques

  1. Toujours vérifier la société active avant de saisir.
  2. Respecter l’ordre des workflows (ne pas facturer sans réception / livraison si le processus l’impose).
  3. Équilibrer chaque écriture manuelle (Débit = Crédit).
  4. Clôturer les mois une fois les contrôles terminés.
  5. Utiliser les règlements pour le lettrage plutôt que des OD « brutes ».
  6. Exporter / sauvegarder avant une restauration ou un import « Remplacer ».
  7. Limiter les comptes SUPER_ADMIN ; attribuer des permissions précises aux assistants.
  8. Changer immédiatement tout mot de passe par défaut.

17. FAQ

Je ne vois pas un menu

Votre compte n’a probablement pas la permission du module. Demandez au SUPER_ADMIN d’activer le droit correspondant (achats, ventes, stocks, etc.).

Une facture reste « Impayée » alors qu’il y a une écriture

L’écriture de facturation (comptabilisation) n’est pas celle de règlement. Le statut « Payée » change après un encaissement / décaissement (ou validation de paiement) avec lettrage.

Le stock ne bouge pas

Vérifiez que l’article est en suivi de stock, puis que la réception ou la livraison a bien été validée.

Je suis déconnecté souvent

Les sessions sont courtes pour la sécurité. Reconnectez-vous ; le renouvellement automatique peut aussi échouer si le serveur a redémarré avec de nouveaux secrets.

Puis-je travailler hors ligne ?

Une session locale peut être disponible si un utilisateur est déjà en cache, mais le mode nominal est connecté à l’API (mode strict recommandé).

Où paramétrer le logo et les infos légales ?

Paramètres → Informations société.

Annexes — Carte rapide des menus

Architecture technique

Documentation technique

Architecture système

Document d’architecture de l’ERP comptable VAN INTERNATIONAL SA : frontend React, API Express, MySQL / Sequelize, référentiel OHADA / SYSCOHADA, multi-sociétés et intégrations M2M.

API prod https://api.vancomptabilite.com/api
Prérequis Node.js 18+ · MySQL 8+
Packages van-comptabilite · van-comptabilite-backend

1. Stack technique

Frontend

  • React 18.2
  • React Router 6.28
  • Create React App 5
  • Axios 1.18
  • jsPDF / xlsx (exports)

Backend

  • Express 4.22
  • Sequelize 6.37
  • mysql2 3.11
  • jsonwebtoken 9
  • bcryptjs · multer 2

Données & ops

  • MySQL 8 (source de vérité)
  • Cookies httpOnly
  • Médias signés HMAC
  • Rate limiting in-memory
Navigateur (React CRA :3000)
        │  HTTPS + cookies (withCredentials)
        ▼
API Express (:4000)  ── /api/* ──► Controllers / Services / Modules
        │
        ▼
MySQL 8  (van_comptabilite)
        ▲
uploads/ (médias privés via /api/media ou /uploads signés)

2. Structure du dépôt

comptable-ohadas/
├── package.json                 # Frontend CRA
├── .env / .env.example
├── public/                      # PWA, assets
├── src/                         # Frontend React
│   ├── app/                     # providers, router
│   ├── components/              # écrans métier
│   ├── modules/                 # workspaces UI
│   ├── context/                 # Auth, notifications
│   ├── services/                # apiClient, auth, sync, domain
│   └── shared/config/           # menu, pageRegistry
├── backend/
│   ├── package.json
│   ├── .env / .env.example
│   └── src/
│       ├── server.js            # bootstrap + listen
│       ├── app.js               # Express pipeline
│       ├── bootstrap/           # schéma, OHADA, validate prod
│       ├── config/              # database, jwt
│       ├── routes/api/          # REST + permissions
│       ├── controllers/
│       ├── models/              # Sequelize (~49)
│       ├── middlewares/
│       ├── services/            # posting, stock, media, auth
│       ├── modules/             # achats, ventes, trésorerie…
│       ├── utils/               # companyScope, cookies, upload
│       └── seeders/
├── guide/                       # Guide utilisateur HTML
└── architecture/                # Ce document

Une version courte existe aussi dans docs/architecture.md.

3. Frontend

Entrée & routage

  • src/index.js → providers → router
  • src/app/router.jsx : /login + routes protégées
  • Routes métier : src/shared/config/pageRegistry.js
  • Menu : src/shared/config/menuSections.js

Couche services

Fichier / dossierRôle
src/services/apiClient.js Axios : withCredentials, header X-Company-Id, refresh auto sur 401
src/services/authService.js login / me / refresh / logout ; profil user en localStorage
src/services/sync/ Hydratation API, cache société, file offline
src/services/domain/ Règles métier UI (achats, ventes, trésorerie…)
src/services/core/companyScope.js Société active van_active_company_id
Auth front. Les JWT ne sont plus en localStorage. Cookies van_at / van_rt httpOnly uniquement. Seul le profil utilisateur (UI / offline) reste en localStorage.

4. Backend

Pipeline Express

backend/src/server.js charge l’env, valide la prod, authentifie Sequelize, synchronise le schéma (alter: false), bootstrap OHADA, puis écoute 0.0.0.0:PORT.

backend/src/app.js enchaîne : security headers → rate limit → cookies → CORS credentials → JSON → CSRF Origin → morgan → routes médias → /api → errorHandler.

Montage des routes

backend/src/routes/api/index.js : helper mount(path, permissions, router) = auth + requireAnyPermission.

PréfixeAuthExemples
/api/healthPublicSanté DB
/api/auth/*Mixtelogin, refresh, me, logout
/api/media/*Signature ou sessionImages
/api/purchase-ordersJWT + permissionsCRUD métier
/api/integrations/vanAPI key (+ JWT validation)RH / Logistique / BTP

Middlewares clés

FichierRôle
middlewares/auth.jsJWT + tokenVersion + société active
middlewares/permissions.jsCatalogue modules, bypass ADMIN
middlewares/rateLimit.jsAPI / login / refresh
middlewares/integrationAuth.jsAPI key + HMAC optionnel
middlewares/secureImageUpload.jsMulter sécurisé
middlewares/csrfOriginCheck.jsOrigin/Referer si cookies
utils/companyScope.jsAnti-IDOR companyId

5. Authentification & sessions

ÉlémentDétail
Access JWTTTL défaut 15 min — payload : id, email, role, companyId, tv
RefreshOpaque 48 bytes, hash HMAC-SHA256 en table RefreshToken, TTL 14 j
Cookiesvan_at, van_rt — httpOnly, Secure en prod, SameSite lax/none
RotationChaque refresh révoque l’ancien ; réutilisation → révocation globale
tokenVersionMismatch → TOKEN_REVOKED ; bump à logout / reset MDP

Services : backend/src/services/authToken.service.js, backend/src/utils/authCookies.js, backend/src/controllers/authController.js.

6. Multi-société (tenant)

  1. JWT / cookies authentifient l’utilisateur.
  2. Société demandée via X-Company-Id (sinon JWT / société par défaut).
  3. canUseCompany : SUPER_ADMIN libre ; sinon société autorisée / groupe.
  4. req.companyId propage le scope à tous les contrôleurs.
  5. Helpers scopedWhere, findByPkInCompany, assertBelongsToCompany empêchent l’IDOR.
Sans société active résolue, le filtre tombe sur companyId: -1 (aucune ligne retournée) plutôt qu’un accès global.

7. Médias & uploads

  • Plus de express.static public sur /uploads.
  • Accès : GET /uploads/:subdir/:filename et GET /api/media/....
  • Autorisation : signature HMAC ?exp=&sig= ou session JWT.
  • Sous-dossiers whitelist : products, companies.
  • Upload : JPEG / PNG / WebP, max 2 Mo, magic bytes, noms aléatoires.
  • Fichiers : services/mediaAccess.service.js, utils/uploadSecurity.js, middlewares/secureImageUpload.js.

8. Intégrations VAN

Préfixe /api/integrations/van (vanIntegrations.routes.js).

  • M2M : header X-API-Key = VAN_INTEGRATION_API_KEY
  • Optionnel : X-Van-Timestamp + X-Van-Signature (HMAC-SHA256, skew 5 min)
  • Ingestion : RH, logistique, BTP
  • Validation humaine : endpoints pending avec JWT + permission integrations / accounting

9. Modèle de données (Sequelize)

Index : backend/src/models/index.js — tables underscored + timestamps.

DomaineModèles
IdentitéCompany, User, RefreshToken, AuditLog
ComptableAccount, Journal, FiscalYear, AccountingPeriod, Section, AnalyticPost
ÉcrituresAccountingEntry, EntryLine, EntryLineAnalytic
Tiers / stockClient, Supplier, Product, SupplierPrice, StockMovement
AchatsPurchaseOrder(+Line), GoodsReceipt(+Line), PurchaseInvoice(+Line), SupplierCreditNote
VentesSalesQuote(+Line), SalesOrder(+Line), DeliveryNote(+Line), SalesInvoice(+Line), CustomerCreditNote
TrésorerieBankAccount, Payment, PaymentAllocation, BankReconciliation, CashForecast, ExchangeRate
Fiscal / analytiqueFixedAsset, Depreciation, VatDeclaration, Budget, Project, InterCompanyTransaction

10. Comptabilité automatique

BC approuvé BR + stock Facture ACH Règlement BNQ
DocumentServiceJournal / comptes typiques
Réception stockstockPostingService.applyGoodsReceiptStockSTK/OD — 311 / 603
Facture achataccountingPostingService.postPurchaseInvoiceACH — 601 / 445 / 401
Facture ventepostSalesInvoiceVTE — 411 / 701 / 443…
RèglementpostPaymentBNQ/CAI — 401↔521 ou 411↔521
Idempotence : ensureEntry(sourceType, sourceId) garantit une seule écriture par document source. Orchestrateur : modules/comptabilite/services/accountingEngineV2.service.js.

11. Variables d’environnement

Frontend (racine)

VariableRôle
REACT_APP_API_BASE_URLBase API (prod : api.vancomptabilite.com/api)
REACT_APP_STRICT_APIMode strict API / cache

Backend

VariableRôle
DB_*Connexion MySQL
JWT_SECRET / JWT_EXPIRES_INAccess token
REFRESH_TOKEN_SECRET / REFRESH_TOKEN_EXPIRES_INPepper refresh
COOKIE_*SameSite, Secure, Domain
CORS_ORIGINOrigines front autorisées
PUBLIC_BASE_URLBase URLs médias signées
MEDIA_URL_SECRETHMAC médias
VAN_INTEGRATION_API_KEYIntégrations M2M
LOGIN_* / API_*Rate limits

En production, le démarrage est refusé si secrets faibles ou CORS * (bootstrap/validateProductionEnv.js).

12. Contrôles de sécurité

  1. Cookies httpOnly + CORS credentials + contrôle Origin/Referer
  2. JWT court + refresh opaque hashé + rotation + anti-reuse
  3. Révocation via tokenVersion
  4. Rate limiting login / refresh / API
  5. Permissions granulaires par module
  6. Scoping companyId anti-IDOR
  7. Headers sécurité (+ HSTS en prod)
  8. Médias non publics (signature ou session)
  9. Uploads whitelist + magic bytes
  10. Intégrations : clé + HMAC optionnel timing-safe
  11. Validation env production
  12. Audit log sur opérations sensibles
  13. Mots de passe bcrypt + politique de complexité

13. Diagramme de cas d’utilisation

Acteurs principaux et cas d’utilisation métier de VAN Comptabilité. Les inclusions (include) représentent des prérequis techniques (authentification, choix de société).

Vue globale

flowchart TB
  subgraph Acteurs
    SA((SUPER_ADMIN))
    AD((ADMIN / Comptable))
    AS((Assistant))
    DAF((DAF / Direction))
    SYS((Systèmes VAN
RH / Logistique / BTP)) end subgraph Authentification UC_LOGIN[Se connecter] UC_LOGOUT[Se déconnecter] UC_PWD[Changer mot de passe] UC_CO[Changer de société] end subgraph Comptabilite UC_PC[Gérer plan comptable] UC_ECR[Saisir écritures] UC_LIV[Consulter livres / balance] UC_CLO[Clôturer une période] end subgraph Achats UC_BC[Créer commande fournisseur] UC_BR[Réceptionner marchandises] UC_FA[Facturer un achat] UC_PA[Payer un fournisseur] end subgraph Ventes UC_DV[Émettre un devis] UC_BCV[Valider commande client] UC_BL[Livrer un client] UC_FV[Facturer une vente] UC_ENC[Encaisser un client] end subgraph Stocks UC_ART[Gérer articles] UC_MOV[Consulter mouvements] UC_VAL[Valoriser stocks CMUPACE] end subgraph Tresorerie UC_PREV[Prévoir trésorerie] UC_RAP[Rapprocher banque] end subgraph Pilotage UC_KPI[Consulter tableaux de bord] UC_TVA[Préparer déclaration TVA] UC_EF[Consulter états financiers] UC_BUD[Suivre budget / projets] end subgraph Administration UC_USER[Gérer utilisateurs et permissions] UC_SOC[Gérer sociétés] UC_IMP[Importer données Excel] UC_BAK[Sauvegarder / restaurer] end subgraph Integrations UC_ING[Injecter flux RH / Logistique / BTP] UC_VALV[Valider ou rejeter demandes VAN] end SA --> UC_USER SA --> UC_SOC SA --> UC_LOGIN AD --> UC_LOGIN AD --> UC_PC AD --> UC_ECR AD --> UC_BC AD --> UC_BR AD --> UC_FA AD --> UC_PA AD --> UC_DV AD --> UC_BCV AD --> UC_BL AD --> UC_FV AD --> UC_ENC AD --> UC_ART AD --> UC_RAP AD --> UC_TVA AD --> UC_VALV AD --> UC_IMP AS --> UC_LOGIN AS --> UC_BC AS --> UC_BR AS --> UC_DV AS --> UC_LIV DAF --> UC_LOGIN DAF --> UC_KPI DAF --> UC_PREV DAF --> UC_EF DAF --> UC_BUD DAF --> UC_CLO SYS --> UC_ING UC_BC -.->|include| UC_LOGIN UC_FA -.->|include| UC_BR UC_PA -.->|include| UC_FA UC_FV -.->|include| UC_BL UC_ENC -.->|include| UC_FV UC_VALV -.->|include| UC_LOGIN UC_ING -.->|API key| SYS

Cycle achats (zoom)

flowchart LR
  Comptable((Comptable))
  UC1([Créer BC fournisseur])
  UC2([Valider réception BR])
  UC3([Comptabiliser facture achat])
  UC4([Enregistrer règlement])
  UC5([Générer écriture SYSCOHADA])
  UC6([Mettre à jour stock])

  Comptable --> UC1
  Comptable --> UC2
  Comptable --> UC3
  Comptable --> UC4
  UC2 -->|include| UC6
  UC3 -->|include| UC5
  UC4 -->|include| UC5
  UC2 --> UC3
  UC3 --> UC4
        

Cycle ventes (zoom)

flowchart LR
  Commercial((Commercial / Comptable))
  V1([Créer devis])
  V2([Transformer en BC])
  V3([Livrer BL])
  V4([Facturer client])
  V5([Encaisser])
  V6([Sortie stock])
  V7([Écritures VTE / BNQ])

  Commercial --> V1
  Commercial --> V2
  Commercial --> V3
  Commercial --> V4
  Commercial --> V5
  V1 --> V2 --> V3 --> V4 --> V5
  V3 -->|include| V6
  V4 -->|include| V7
  V5 -->|include| V7
        
ActeurObjectif principal
SUPER_ADMINAdministration globale, multi-sociétés, utilisateurs
ADMIN / ComptableOpérations comptables, achats, ventes, stocks, TVA
AssistantSaisie opérationnelle selon permissions
DAF / DirectionPilotage, budgets, clôtures, états
Systèmes VANInjection M2M de flux à valider en comptabilité

14. Diagramme de classes

Classes dérivées des modèles Sequelize (backend/src/models/). Attributs essentiels uniquement ; toutes les entités métier portent un companyId (multi-tenant).

Diagramme de classes général

Vue d’ensemble du domaine : société, utilisateurs, référentiels, cycles achats / ventes, stocks, écritures et trésorerie.

classDiagram
  direction TB

  class Company {
    +id
    +name
    +currency
    +companyId scope
  }
  class User {
    +email
    +role
    +permissions
    +tokenVersion
  }
  class Account {
    +number
    +name
    +classCode
  }
  class Journal {
    +code
    +name
  }
  class Client {
    +code
    +name
  }
  class Supplier {
    +code
    +name
  }
  class Product {
    +sku
    +trackStock
    +stockQuantity
  }
  class PurchaseOrder {
    +number
    +status
  }
  class GoodsReceipt {
    +number
    +status
  }
  class PurchaseInvoice {
    +number
    +status
    +totalAmount
  }
  class SalesQuote {
    +number
    +status
  }
  class SalesOrder {
    +number
    +status
  }
  class DeliveryNote {
    +number
    +status
  }
  class SalesInvoice {
    +number
    +status
    +totalAmount
  }
  class StockMovement {
    +quantity
    +unitCost
    +sourceType
  }
  class AccountingEntry {
    +number
    +sourceType
    +sourceId
  }
  class EntryLine {
    +debit
    +credit
  }
  class Payment {
    +amount
    +method
  }
  class PaymentAllocation {
    +allocatedAmount
  }
  class BankAccount {
    +code
    +name
  }

  Company "1" --> "*" User : emploie
  Company "1" --> "*" Account
  Company "1" --> "*" Journal
  Company "1" --> "*" Client
  Company "1" --> "*" Supplier
  Company "1" --> "*" Product
  Company "1" --> "*" BankAccount

  Supplier "1" --> "*" PurchaseOrder
  PurchaseOrder "1" --> "*" GoodsReceipt
  GoodsReceipt "1" --> "*" PurchaseInvoice
  Product "1" --> "*" StockMovement
  GoodsReceipt ..> StockMovement : génère IN

  Client "1" --> "*" SalesQuote
  SalesQuote "1" --> "0..1" SalesOrder
  SalesOrder "1" --> "*" DeliveryNote
  DeliveryNote "1" --> "*" SalesInvoice
  DeliveryNote ..> StockMovement : génère OUT

  Journal "1" --> "*" AccountingEntry
  AccountingEntry "1" --> "*" EntryLine
  EntryLine --> Account
  PurchaseInvoice ..> AccountingEntry : poste ACH
  SalesInvoice ..> AccountingEntry : poste VTE
  Payment ..> AccountingEntry : poste BNQ

  BankAccount "1" --> "*" Payment
  Payment "1" --> "*" PaymentAllocation
  PaymentAllocation --> PurchaseInvoice : lettrage
  PaymentAllocation --> SalesInvoice : lettrage
        

Identité & multi-société

classDiagram
  class Company {
    +id
    +name
    +rccm
    +niu
    +currency
    +parentCompanyId
  }
  class User {
    +id
    +email
    +passwordHash
    +role
    +permissions
    +tokenVersion
    +companyId
  }
  class RefreshToken {
    +id
    +tokenHash
    +expiresAt
    +revokedAt
    +userId
  }
  class AuditLog {
    +id
    +action
    +entity
    +payload
    +userId
    +companyId
  }
  Company "1" --> "*" User : emploie
  User "1" --> "*" RefreshToken : sessions
  Company "1" --> "*" Company : filiales
  User --> AuditLog : produit
  Company --> AuditLog : scope
        

Référentiel comptable & écritures

classDiagram
  class Account {
    +code
    +label
    +class
    +type
    +companyId
  }
  class Journal {
    +code
    +label
    +type
    +companyId
  }
  class FiscalYear {
    +year
    +status
    +companyId
  }
  class AccountingPeriod {
    +month
    +status
    +fiscalYearId
  }
  class AccountingEntry {
    +number
    +date
    +label
    +sourceType
    +sourceId
    +journalId
    +companyId
  }
  class EntryLine {
    +debit
    +credit
    +accountId
    +entryId
  }
  Company "1" --> "*" Account : possède
  Company "1" --> "*" Journal : possède
  Company "1" --> "*" FiscalYear : possède
  FiscalYear "1" --> "*" AccountingPeriod
  Journal "1" --> "*" AccountingEntry
  AccountingEntry "1" --> "*" EntryLine
  EntryLine --> Account
  note for AccountingEntry "Idempotence ensureEntry(sourceType, sourceId)"
        

Achats & stocks

classDiagram
  class Supplier {
    +code
    +name
    +collectiveAccountId
  }
  class Product {
    +sku
    +name
    +trackStock
    +stockQty
    +cmp
  }
  class PurchaseOrder {
    +number
    +status
    +supplierId
  }
  class PurchaseOrderLine {
    +qty
    +unitPrice
    +productId
  }
  class GoodsReceipt {
    +number
    +status
    +purchaseOrderId
  }
  class GoodsReceiptLine {
    +qtyReceived
    +productId
  }
  class PurchaseInvoice {
    +number
    +status
    +goodsReceiptId
    +totalTTC
  }
  class PurchaseInvoiceLine {
    +qty
    +amount
  }
  class StockMovement {
    +type
    +qty
    +unitCost
    +productId
    +sourceType
  }
  Supplier "1" --> "*" PurchaseOrder
  PurchaseOrder "1" --> "*" PurchaseOrderLine
  PurchaseOrder "1" --> "*" GoodsReceipt
  GoodsReceipt "1" --> "*" GoodsReceiptLine
  GoodsReceipt "1" --> "*" PurchaseInvoice
  PurchaseInvoice "1" --> "*" PurchaseInvoiceLine
  Product "1" --> "*" PurchaseOrderLine
  Product "1" --> "*" StockMovement
  GoodsReceipt --> StockMovement : génère IN
        

Ventes & trésorerie

classDiagram
  class Client {
    +code
    +name
    +collectiveAccountId
  }
  class SalesQuote {
    +number
    +status
    +clientId
  }
  class SalesOrder {
    +number
    +status
    +salesQuoteId
  }
  class DeliveryNote {
    +number
    +status
    +salesOrderId
  }
  class SalesInvoice {
    +number
    +status
    +totalTTC
  }
  class Payment {
    +number
    +amount
    +method
    +direction
    +bankAccountId
  }
  class PaymentAllocation {
    +amount
    +invoiceId
    +paymentId
  }
  class BankAccount {
    +code
    +label
    +type
  }
  class PurchaseInvoice {
    +number
    +status
    +totalTTC
  }
  Client "1" --> "*" SalesQuote
  SalesQuote "1" --> "0..1" SalesOrder
  SalesOrder "1" --> "*" DeliveryNote
  DeliveryNote "1" --> "*" SalesInvoice
  Client "1" --> "*" SalesInvoice
  Payment "1" --> "*" PaymentAllocation
  PaymentAllocation --> SalesInvoice : lettrage vente
  PaymentAllocation --> PurchaseInvoice : lettrage achat
  BankAccount "1" --> "*" Payment
        

Couches applicatives (backend)

classDiagram
  class Router {
    +mount(path, permissions)
  }
  class AuthMiddleware {
    +verifyJWT()
    +resolveCompany()
  }
  class Controller {
    +create()
    +update()
    +remove()
  }
  class DomainService {
    +postPurchaseInvoice()
    +applyGoodsReceiptStock()
    +postPayment()
  }
  class SequelizeModel {
    +findAll()
    +create()
  }
  Router --> AuthMiddleware : protège
  Router --> Controller : délègue
  Controller --> DomainService : métier
  DomainService --> SequelizeModel : persiste
  AuthMiddleware --> SequelizeModel : User / Company
        

15. Diagrammes de séquence

Login

sequenceDiagram
  participant U as Utilisateur
  participant F as React
  participant A as API /auth
  participant DB as MySQL
  U->>F: email + password
  F->>A: POST /auth/login
  A->>DB: User + bcrypt
  A->>DB: RefreshToken.create
  A-->>F: Set-Cookie van_at / van_rt
  F->>A: GET /auth/me
  A-->>F: user + société
        

Si Mermaid ne charge pas hors-ligne, le flux est décrit dans le tableau Auth ci-dessus.

Achats : BC → BR → facture → règlement

sequenceDiagram
  participant F as Frontend
  participant API as Controllers
  participant Stock as stockPosting
  participant Acc as accountingPosting
  participant DB as MySQL
  F->>API: POST purchase-orders
  API->>DB: PO APPROVED
  F->>API: POST goods-receipts
  API->>Stock: applyGoodsReceiptStock
  Stock->>DB: StockMovement IN
  Stock->>Acc: écriture stock 311/603
  F->>API: POST purchase-invoices
  API->>Acc: postPurchaseInvoice
  Acc->>DB: Entry ACH 601/445/401
  F->>API: POST payments
  API->>Acc: postPayment
  Acc->>DB: Entry BNQ 401/521
  API->>DB: invoice PAID / PARTIAL
        

Accès média

sequenceDiagram
  participant C as Client
  participant API as serveMedia
  participant S as mediaAccess
  participant FS as uploads/
  C->>API: GET /api/media/... ?exp&sig
  API->>S: whitelist + vérif
  alt Signature HMAC OK
    S-->>API: autorisé
  else Session JWT OK
    S-->>API: autorisé
  else
    API-->>C: 401
  end
  API->>FS: resolveSafeLocalPath
  API-->>C: fichier + nosniff
        

16. Déploiement

Diagramme de déploiement (production)

Vue des nœuds physiques / logiques, artefacts déployés et protocoles. Les cookies d’auth (van_at / van_rt) transitent en HTTPS entre le navigateur et l’API.

flowchart TB
  subgraph Clients["Nœud : Postes utilisateurs"]
    BR["« device » Navigateur
Chrome / Firefox / Safari"] end subgraph Edge["Nœud : Frontière Internet / TLS"] DNS["DNS
api.vancomptabilite.com"] PX["« device » Reverse proxy
Nginx / Caddy
TLS 1.2+"] end subgraph AppTier["Nœud : Serveur applicatif"] WEB["« artifact » Frontend SPA
build/ React CRA
fichiers statiques"] API["« artifact » API Node.js
van-comptabilite-backend
Express :4000
PM2 / systemd"] UP["« artifact » Stockage médias
uploads/products
uploads/companies"] end subgraph DataTier["Nœud : Serveur de données"] DB[("« database » MySQL 8
van_comptabilite")] end subgraph Ext["Nœuds externes VAN"] RH["RH"] LOG["Logistique"] BTP["BTP"] end BR -->|HTTPS| DNS DNS --> PX PX -->|static HTTPS| WEB PX -->|/api HTTPS| API WEB -.->|Axios cookies
withCredentials| API API -->|TCP 3306| DB API --- UP RH -->|X-API-Key HTTPS| API LOG -->|X-API-Key HTTPS| API BTP -->|X-API-Key HTTPS| API

Diagramme de déploiement (développement local)

flowchart LR
  subgraph DevMachine["Nœud : Machine développeur"]
    B["Navigateur :3000"]
    F["« artifact » yarn start
react-scripts"] A["« artifact » npm run dev
Express :4000"] M[("MySQL local
:3306")] U["uploads/"] end B --> F F -->|http://localhost:4000/api
cookies| A A --> M A --- U

Artefacts & responsabilités

Nœud / artefactContenuExposition
Frontend SPA yarn build → dossier build/ HTTPS via proxy (domaine app)
API Express backend/src/server.js + .env prod https://api.vancomptabilite.com → :4000
MySQL Schéma Sequelize, données multi-sociétés Réseau privé uniquement
uploads/ Logos & photos (accès signé / session) Via API /api/media ou /uploads
Systèmes VAN RH, Logistique, BTP /api/integrations/van + API key

Développement

  • Front : yarn start → :3000
  • API : cd backend && npm run dev → :4000
  • CORS local autorisé si non strict

Production

  • NODE_ENV=production
  • Secrets forts distincts du local
  • CORS_ORIGIN = URL front exacte
  • COOKIE_SECURE=true
  • PUBLIC_BASE_URL = URL API publique
  • Build front : yarn build
  • Proxy TLS + process manager (PM2 / systemd)

Exploitation

Procédures d’installation, configuration, exploitation courante, sauvegarde et incident pour l’API et le frontend VAN Comptabilité.

FrontendNode 18+ · Yarn
BackendNode 18+ · npm
BaseMySQL 8+
Ports dév3000 / 4000

1. Prérequis

  • Node.js 18 ou supérieur
  • Yarn (front) et npm (backend)
  • MySQL 8 avec une base (ex. van_comptabilite)
  • Accès réseau HTTPS en production

2. Installation locale

Base de données

  1. Créer la base MySQL et un utilisateur avec droits CRUD.
  2. Copier backend/.env.examplebackend/.env.
  3. Renseigner DB_HOST, DB_PORT, DB_NAME, DB_USER, DB_PASSWORD.

Backend

cd backend
npm install
# Éditer .env (JWT, refresh, VAN_INTEGRATION_API_KEY, MEDIA_URL_SECRET…)
npm run dev

Au démarrage : sequelize.authenticate(), ensure*Schema, sync({ alter: false }), bootstrap OHADA, écoute 0.0.0.0:4000.

Santé : GET /api/health{ ok: true }.

Frontend

# Racine du projet
cp .env.example .env
# REACT_APP_API_BASE_URL=http://localhost:4000/api   (local)
# ou https://api.vancomptabilite.com/api             (prod)
yarn install
yarn start

3. Variables d’environnement critiques

VariableNotes
JWT_SECRETbackend≥ 24 car. aléatoires ; refus démarrage prod si faible
REFRESH_TOKEN_SECRETbackendPepper distinct du JWT
VAN_INTEGRATION_API_KEYbackendClé M2M RH/Logistique/BTP
MEDIA_URL_SECRETbackendHMAC URLs médias
CORS_ORIGINbackendOrigines front exactes (pas * en prod)
COOKIE_SECUREbackendtrue en HTTPS
PUBLIC_BASE_URLbackendURL publique API pour médias
REACT_APP_API_BASE_URLfrontBase API consommée par Axios
REACT_APP_STRICT_APIfrontMode strict API recommandé true

4. Mise en production

Diagramme de déploiement

flowchart TB
  U["Navigateur utilisateur"] --> PX["Reverse proxy TLS
Nginx / Caddy"] PX --> WEB["SPA React
build/"] PX --> API["API Express
:4000"] API --> DB[("MySQL 8")] API --> FS["uploads/"] VAN["RH / Logistique / BTP"] -->|API key| API WEB -.->|cookies HTTPS| API
  1. NODE_ENV=production
  2. Secrets forts, différents du local
  3. CORS_ORIGIN = URL HTTPS du front
  4. COOKIE_SECURE=true (+ COOKIE_DOMAIN si besoin)
  5. PUBLIC_BASE_URL=https://api.vancomptabilite.com
  6. Process manager (systemd, PM2) pour node src/server.js
  7. Reverse proxy TLS (nginx / Caddy) vers :4000
  8. Build front : yarn build puis héberger le dossier build/ complet (y compris static/)
  9. Configurer le fallback SPA (sinon seules / et index.html marchent) — voir §4b
  10. Changer le mot de passe admin bootstrap
  11. Configurer les permissions des utilisateurs non-admin
  12. Déployer VAN_INTEGRATION_API_KEY côté systèmes VAN
Attention. Changer JWT_SECRET / REFRESH_TOKEN_SECRET invalide toutes les sessions : les utilisateurs doivent se reconnecter.

4b. Frontend en ligne — pourquoi seule index.html s’affiche

React utilise le routage côté client (BrowserRouter). Si le serveur web ne renvoie pas index.html pour les URLs comme /login ou /comptabilite/…, la page reste cassée ou en 404. De même, si le dossier build/static/ n’est pas déployé, le HTML s’affiche mais sans CSS/JS.

  1. Déployer tout le contenu de yarn build (pas seulement index.html).
  2. Nginx : try_files $uri $uri/ /index.html; — exemple dans deploy/nginx-frontend.conf.example.
  3. Apache : le fichier .htaccess est copié dans build/ au build CRA.
  4. Netlify / Cloudflare Pages : _redirects inclus au build.
  5. Option même serveur que l’API : définir FRONTEND_BUILD_PATH vers le dossier build/.
  6. Vérifier dans les DevTools (onglet Réseau) que /static/js/… et /static/css/… répondent 200.
# Build + déploiement typique
yarn build
# Copier TOUT le dossier build/ vers le serveur, ex. :
# rsync -av --delete build/ user@serveur:/var/www/van-comptabilite/build/

# Nginx (extrait)
# root /var/www/van-comptabilite/build;
# location / { try_files $uri $uri/ /index.html; }

5. Comptes & sécurité opérationnelle

  • Compte bootstrap dév (non prod) : admin@vaninternational.local
  • Cookies auth : van_at (access 15m), van_rt (refresh 14j)
  • Rate limit login / API configurables via env
  • Logs HTTP : morgan combined en prod
  • Ne jamais committer les fichiers .env

6. Procédures de sauvegarde et de restauration

Trois niveaux complémentaires. En production, le couple MySQL + uploads est obligatoire. La sauvegarde JSON de l’écran applicatif est un secours / migration de poste.

NiveauContenuUsage
MySQL (mysqldump) Toute la base métier multi-sociétés Sauvegarde principale production
Fichiers uploads/ Logos sociétés, photos produits Toujours avec le dump SQL
JSON applicatif Export navigateur (écran Sauvegarde) Démo, poste local, secours UI
Fichier .env Secrets & config (hors git) Coffre-fort ops, jamais dans le dump public

6.1 Sauvegarde MySQL (production)

  1. Connectez-vous au serveur de base (ou bastion autorisé).
  2. Choisissez un répertoire de backup avec droits restreints.
  3. Exécutez un dump cohérent :
# Sauvegarde complète (recommandée)
mysqldump -u USER -p \
  --single-transaction \
  --routines --triggers \
  van_comptabilite \
  > /backups/van_comptabilite_$(date +%F_%H%M).sql

# Compression optionnelle
gzip /backups/van_comptabilite_*.sql
  1. Vérifiez la taille du fichier et qu’il n’est pas vide.
  2. Copiez la sauvegarde vers un stockage externe (autre disque / offsite).
  3. Conservez une rotation (ex. 7 journalières + 4 hebdomadaires).

6.2 Restauration MySQL

Attention. La restauration écrase les données de la base cible. Arrêtez l’API pendant l’opération pour éviter les écritures concurrentes.
  1. Stoppez le process API (pm2 stop, systemd, etc.).
  2. Si besoin, créez une base vide ou utilisez la base existante :
# Option : sauvegarder l’état actuel avant restore
mysqldump -u USER -p van_comptabilite > /backups/pre_restore_$(date +%F_%H%M).sql

# Restauration
gunzip -c /backups/van_comptabilite_YYYY-MM-DD_HHMM.sql.gz \
  | mysql -u USER -p van_comptabilite

# ou fichier non compressé
mysql -u USER -p van_comptabilite < /backups/van_comptabilite_YYYY-MM-DD_HHMM.sql
  1. Redémarrez l’API.
  2. Contrôlez GET /api/health puis un login + quelques lectures métier.

6.3 Sauvegarde / restauration des médias (uploads/)

  1. Sauvegarde : archiver le dossier backend des médias.
tar -czf /backups/uploads_$(date +%F).tar.gz -C /chemin/vers/backend uploads
  1. Restauration : arrêter l’API, extraire l’archive au même emplacement, redémarrer.
cd /chemin/vers/backend
tar -xzf /backups/uploads_YYYY-MM-DD.tar.gz
# permissions lecture pour l’utilisateur du process Node

6.4 Sauvegarde JSON depuis l’application

Écran VAN & intégrations → Sauvegarde / restauration.

Sauvegarder

  1. Se connecter à l’application.
  2. Ouvrir Sauvegarde / restauration.
  3. Cliquer sur Télécharger la sauvegarde.
  4. Conserver le fichier van-compta-backup-AAAA-MM-JJ.json.

Restaurer

  1. Télécharger d’abord une sauvegarde de l’état courant (filet de sécurité).
  2. Cliquer sur Restaurer un fichier et choisir le .json.
  3. Vérifier le message de succès, puis contrôler clients / factures / écritures.
Ce JSON restaure surtout le cache / base locale côté navigateur. Il ne remplace pas un restore MySQL serveur en production.

6.5 Bonnes pratiques

  1. Tester une restauration (dry-run) au moins une fois par trimestre.
  2. Sauvegarder .env séparément dans un coffre (pas dans le même zip public que le SQL).
  3. Nommer les fichiers avec date/heure et environnement (prod, preprod).
  4. Après restore prod : invalider éventuellement les sessions (redémarrage API / rotation secrets si compromission).
  5. Documenter qui a restauré, quand, et depuis quel fichier.

7. Monitoring & santé

ContrôleComment
API upGET /api/health
DB upRéponse health + logs démarrage Sequelize
AuthLogin → cookies posés → GET /api/auth/me
CORSFront prod appelle API sans erreur Origin
MédiasImage logo/produit charge via URL signée ou session
IntégrationsAppel sans clé → 401 ; avec clé → OK

8. Incidents fréquents

SymptômePistes
API refuse de démarrer en prodSecrets faibles, CORS * → voir validateProductionEnv.js
Utilisateur déconnecté en boucleSecrets JWT changés, cookies bloqués, SameSite / Secure
CORS error navigateurCORS_ORIGIN ne contient pas l’origine exacte du front
Images 401Signature expirée ou session absente ; vérifier MEDIA_URL_SECRET
Données d’une autre sociétéVérifier header X-Company-Id / société active
Facture Impayée après écritureÉcriture de facturation ≠ règlement ; passer par paiements

9. Scripts utiles (backend)

CommandeUsage
npm run devAPI + nodemon
npm startAPI production
npm run db:seedBootstrap données
npm run db:repair:*Scripts de réparation compta / stock / documents

10. Checklist go-live

  1. Secrets prod générés et stockés hors git
  2. Dump MySQL + uploads testés (restore dry-run)
  3. HTTPS front + API
  4. Login / refresh / logout OK
  5. Création facture + paiement → écritures OK
  6. Isolation multi-société testée
  7. Intégrations VAN avec vraie clé
  8. Admin bootstrap MDP changé
  9. yarn audit / npm audit notés (résidus connus : xlsx, CRA)

Schéma de la base de données

MySQL 8 via Sequelize 6 — convention underscored: true + timestamps (created_at / updated_at). Source : backend/src/models/ (47 modèles métier). Base typique : van_comptabilite.

Multi-tenant. La quasi-totalité des tables métier portent company_id. Les accès API filtrent systématiquement sur la société active.

1. Diagramme entité-relation (cœur métier)

erDiagram
  COMPANY ||--o{ USER : emploie
  USER ||--o{ REFRESH_TOKEN : sessions
  COMPANY ||--o{ ACCOUNT : plan
  COMPANY ||--o{ JOURNAL : journaux
  COMPANY ||--o{ CLIENT : clients
  COMPANY ||--o{ SUPPLIER : fournisseurs
  COMPANY ||--o{ PRODUCT : articles
  SUPPLIER ||--o{ PURCHASE_ORDER : commande
  PURCHASE_ORDER ||--|{ PURCHASE_ORDER_LINE : lignes
  PURCHASE_ORDER ||--o{ GOODS_RECEIPT : reception
  GOODS_RECEIPT ||--|{ GOODS_RECEIPT_LINE : lignes
  GOODS_RECEIPT ||--o{ PURCHASE_INVOICE : facture
  PURCHASE_INVOICE ||--|{ PURCHASE_INVOICE_LINE : lignes
  PRODUCT ||--o{ STOCK_MOVEMENT : mouvements
  CLIENT ||--o{ SALES_QUOTE : devis
  SALES_QUOTE ||--o| SALES_ORDER : transforme
  SALES_ORDER ||--o{ DELIVERY_NOTE : livraison
  DELIVERY_NOTE ||--o{ SALES_INVOICE : facture
  JOURNAL ||--o{ ACCOUNTING_ENTRY : pieces
  ACCOUNTING_ENTRY ||--|{ ENTRY_LINE : lignes
  ENTRY_LINE }o--|| ACCOUNT : impute
  PAYMENT ||--o{ PAYMENT_ALLOCATION : lettrage
  PAYMENT_ALLOCATION }o--o| SALES_INVOICE : client
  PAYMENT_ALLOCATION }o--o| PURCHASE_INVOICE : fournisseur
  BANK_ACCOUNT ||--o{ PAYMENT : tresorerie
    

2. Inventaire des tables par domaine

Identité & multi-société

ModèleTable (approx.)Champs clés
Companycompaniesname tradeName email phone address taxId rccm country currency logoUrl parentId isGroup isActive timezone fiscalYearStart vatRate
UseruserscompanyId fullName email passwordHash role permissions isActive tokenVersion
RefreshTokenrefresh_tokensuserId tokenHash expiresAt revokedAt replacedByTokenHash userAgent ipAddress
AuditLogaudit_logscompanyId userId entity entityId action beforeData afterData

Référentiel comptable

ModèleTable (approx.)Champs clés
AccountaccountscompanyId number name classCode reportingType isCollective isActive
JournaljournalscompanyId code name defaultAccountId treasuryType treasuryAccountId sectionId
FiscalYearfiscal_yearscompanyId code name startDate endDate status
AccountingPeriodaccounting_periodscompanyId fiscalYearId period label startDate endDate status closedAt closedBy closingNote totalDebit totalCredit resultNet entryCount checksJson
SectionsectionscompanyId code name centreType parentId budgetAmount description isActive sortOrder
AnalyticPostanalytic_postscompanyId sectionId code name description nature budgetAmount isActive

Écritures

ModèleTable (approx.)Champs clés
AccountingEntryaccounting_entriescompanyId journalId fiscalYearId number entryDate reference label sourceType sourceId status totalDebit totalCredit sectionId currency exchangeRate
EntryLineentry_linesentryId accountId clientId supplierId label debit credit counterpartAccountId sectionId analyticPostId projectId currency amountFc exchangeRate
EntryLineAnalyticentry_line_analyticsentryLineId sectionId analyticPostId percentage debit credit projectId label

Tiers & stocks

ModèleTable (approx.)Champs clés
ClientclientscompanyId code name email phone address bp taxId rccm vatRegime family paymentMethod creditLimit contactName contactRole bankAccount capitalAmount collectiveAccountId thirdPartyAccountNumber linkedCompanyId
SuppliersupplierscompanyId code name email phone address bp paymentTermDays paymentMethod taxId vatRegime rib bankAccount hasVat family contactName contactRole capitalAmount collectiveAccountId thirdPartyAccountNumber linkedCompanyId
ProductproductscompanyId code sku name description imageUrl basePurchasePrice baseSalePrice trackStock stockQuantity purchaseAccountId saleAccountId stockAccountId
SupplierPricesupplier_pricescompanyId supplierId productId price currency
StockMovementstock_movementscompanyId productId sourceType sourceId sectionId movementDate quantity unitCost notes

Achats

ModèleTable (approx.)Champs clés
PurchaseOrderpurchase_orderscompanyId supplierId fiscalYearId sectionId number orderDate status currency notes subtotal taxAmount totalAmount
PurchaseOrderLinepurchase_order_linespurchaseOrderId productId description lineLabel sectionId quantity receivedQuantity unitPrice taxRate lineTotal
GoodsReceiptgoods_receiptscompanyId supplierId purchaseOrderId sectionId number receiptDate status notes
GoodsReceiptLinegoods_receipt_linesgoodsReceiptId purchaseOrderLineId productId description lineLabel sectionId quantityReceived unitPrice taxRate
PurchaseInvoicepurchase_invoicescompanyId supplierId goodsReceiptId purchaseOrderId journalId sectionId number invoiceDate dueDate status notes subtotal taxAmount totalAmount balanceDue
PurchaseInvoiceLinepurchase_invoice_linespurchaseInvoiceId goodsReceiptLineId productId description lineLabel sectionId quantity unitPrice taxRate lineTotal
SupplierCreditNotesupplier_credit_notescompanyId supplierId purchaseInvoiceId number reference reason creditDate amount status

Ventes

ModèleTable (approx.)Champs clés
SalesQuotesales_quotescompanyId clientId sectionId number quoteDate validUntil status subtotal taxAmount totalAmount
SalesQuoteLinesales_quote_linessalesQuoteId productId description quantity unitPrice taxRate lineTotal
SalesOrdersales_orderscompanyId clientId salesQuoteId sectionId number orderDate status subtotal taxAmount totalAmount
SalesOrderLinesales_order_linessalesOrderId productId description quantity deliveredQuantity unitPrice taxRate lineTotal
DeliveryNotedelivery_notescompanyId clientId salesOrderId sectionId number deliveryDate status
DeliveryNoteLinedelivery_note_linesdeliveryNoteId salesOrderLineId productId quantityDelivered unitPrice
SalesInvoicesales_invoicescompanyId clientId deliveryNoteId salesOrderId journalId sectionId number invoiceDate dueDate status subtotal taxAmount totalAmount balanceDue
SalesInvoiceLinesales_invoice_linessalesInvoiceId deliveryNoteLineId productId description quantity unitPrice taxRate lineTotal
CustomerCreditNotecustomer_credit_notescompanyId clientId salesInvoiceId number reference reason creditDate amount status

Trésorerie

ModèleTable (approx.)Champs clés
BankAccountbank_accountscompanyId accountId code name institution accountNumber openingBalance currentBalance
PaymentpaymentscompanyId bankAccountId journalId clientId supplierId sectionId number paymentDate method reference amount status
PaymentAllocationpayment_allocationspaymentId purchaseInvoiceId salesInvoiceId customerCreditNoteId supplierCreditNoteId allocatedAmount
BankReconciliationbank_reconciliationscompanyId bankAccountId fiscalYearId statementDate statementBalance bookBalance difference status
CashForecastcash_forecastscompanyId bankAccountId sectionId forecastDate horizon category label expectedAmount actualAmount status sourceType sourceId note
ExchangeRateexchange_ratescompanyId fromCurrency toCurrency rate rateDate source note

Immobilisations & fiscal

ModèleTable (approx.)Champs clés
FixedAssetfixed_assetscompanyId accountId depreciationAccountId expenseAccountId sectionId code name family acquisitionDate commissionDate grossValue usefulLifeMonths salvageValue depreciationMethod cumulativeDepreciation disposalDate disposalValue status reference location description
DepreciationdepreciationscompanyId fixedAssetId accountingEntryId periodDate amount
VatDeclarationvat_declarationscompanyId fiscalYearId periodStart periodEnd collectedVat deductibleVat netVat status

Analytique & groupe

ModèleTable (approx.)Champs clés
BudgetbudgetscompanyId fiscalYearId sectionId analyticPostId projectId accountId period periodType nature label amount note
ProjectprojectscompanyId sectionId clientId code name status description startDate endDate budgetRevenue budgetExpense location reference isActive
ProjectCostLineproject_cost_linesprojectId analyticPostId accountId label category budgetAmount actualAmount unit quantity unitPrice date note
InterCompanyTransactioninter_company_transactionssellerCompanyId buyerCompanyId sourceType sourceId sourceRef transactionDate fiscalYear nature amount currency amountXAF sellerAccountNumber buyerAccountNumber eliminationStatus note

3. Relations documentaires clés

FluxChaîne FK
Achatspurchase_orders → goods_receipts → purchase_invoices → payments / payment_allocations
Ventessales_quotes → sales_orders → delivery_notes → sales_invoices → payments / payment_allocations
Stockgoods_receipts / delivery_notes → stock_movements (product_id)
Compta autodocuments → accounting_entries (source_type + source_id) → entry_lines

4. Idempotence comptable

Les écritures automatiques sont dédupliquées par couple source_type + source_id sur accounting_entries (service ensureEntry).

Inventaire des dépendances

État des packages déclarés dans package.json (front) et backend/package.json. Gestionnaire front recommandé : Yarn (yarn.lock). Backend : npm.

Frontvan-comptabilite 1.0.0
Backvan-comptabilite-backend 1.0.0
Audit back0 vulnérabilité (npm audit)
Audit frontRésidu xlsx + CRA/webpack-dev-server

1. Frontend — dépendances de production

PackageVersionType
ajv^8.20.0prod
ajv-keywords^5.1.0prod
axios^1.18.1prod
jspdf^4.2.1prod
jspdf-autotable^5.0.8prod
react^18.2.0prod
react-dom^18.2.0prod
react-router-dom^6.28.0prod
react-scripts5.0.1prod
xlsx^0.18.5prod

2. Frontend — resolutions / overrides (sécurité)

PackageVersion forcéeType
nth-check^2.0.1resolution Yarn
shell-quote^1.10.0resolution Yarn
form-data^4.0.6resolution Yarn
ws^8.21.1resolution Yarn
serialize-javascript^7.0.5resolution Yarn
websocket-driver^0.7.5resolution Yarn
axios^1.18.1resolution Yarn
jspdf^4.2.1resolution Yarn
underscore^1.13.8resolution Yarn
postcss^8.5.10resolution Yarn
uuid^11.1.1resolution Yarn
@tootallnate/once^3.0.1resolution Yarn
Résidus connus. xlsx : pas de correctif communautaire gratuit (n’importer que des fichiers de confiance). webpack-dev-server via CRA : impact limité au poste de développement.

3. Backend — dépendances

PackageVersionType
bcryptjs^2.4.3prod
cors^2.8.5prod
dotenv^16.4.5prod
express^4.22.2prod
jsonwebtoken^9.0.2prod
morgan^1.11.0prod
multer^2.1.1prod
mysql2^3.11.3prod
sequelize^6.37.3prod
xlsx-populate^1.21.0prod
nodemon^3.1.4dev
Override npmVersion
uuid^11.1.1override

4. Rôle fonctionnel des libs critiques

LibRôle
react / react-dom / react-router-domUI SPA & navigation
react-scriptsBuild / dev server CRA
axiosClient HTTP (cookies, refresh)
jspdf / jspdf-autotableExports PDF
xlsxImport / export Excel côté navigateur
expressAPI HTTP
sequelize / mysql2ORM & driver MySQL
jsonwebtoken / bcryptjsAuth JWT & hash MDP
multerUploads images
xlsx-populateExports Excel côté serveur (DSF…)
cors / morgan / dotenvCORS, logs, configuration

5. Commandes d’audit

# Frontend
yarn audit

# Backend
cd backend && npm audit