Aller au contenu principal

Documentation MCF : installation et API REST

Installez le driver E-MeCeF sur Windows, macOS ou Linux, activez votre licence et connectez votre logiciel de facturation à un MCF Eltrade CC300 ou Datamega FIS-NANO au Burkina Faso.

Pour préparer votre équipement et choisir entre mode local et cloud, commencez par le guide de la facturation avec un MCF au Burkina Faso.

Introduction

Le Driver MCF (Machine de Certification Fiscale) est un service local qui s'exécute sur le poste de travail et assure la communication entre votre logiciel de facturation et le terminal MCF Eltrade CC300 ou Datamega FIS-NANO. Selon l'édition, une même installation peut piloter plusieurs profils indépendants avec une licence commune. L'édition standard gère 1 MCF ; toute capacité à partir de 2 MCF est disponible uniquement sur commande. Il fonctionne en deux modes : mode local (API REST sur http://127.0.0.1:38917) et mode cloud (client WebSocket sortant vers le serveur SFE, pour les contextes SaaS multi-tenant où les opérateurs travaillent sur mobile ou tablette).

Binaire unifié et architecture multi-MCF

Le driver et la GUI sont regroupés dans un seul binaire e-mecef. La capacité maximale est fixée dans l'édition téléchargée ; seuls les profils activés consomment des ressources série, HTTP et WebSocket.

Sécurisé

JWT RS256 + HMAC-SHA256 pour l'intégrité des données

Léger

Binaire Rust autonome, aucune dépendance à installer

Multi-OS

Windows, macOS et Linux

Architecture

Le système se compose de trois briques qui communiquent entre elles :

SFE (Logiciel)
Driver MCF (e-mecef)
MCF actifs (USB/série)

Le binaire unifié e-mecef contient le driver et la GUI. Mode local : le SFE appelle le driver en HTTP. Mode cloud : le driver se connecte au cloud SFE via WebSocket et reçoit les factures à certifier.

Installation du Driver

Téléchargez le binaire correspondant à votre système d'exploitation depuis la page de téléchargements. Le binaire unifié e-mecef contient à la fois le driver et la GUI.

Choisir la bonne capacité

Le téléchargement public a une capacité maximale de 1 MCF. À partir de 2 MCF, la capacité et le binaire sont préparés uniquement sur commande selon votre environnement. Contactez-nous pour recevoir une proposition et le binaire adapté.

WindowsInstallation Windows

  1. Téléchargez e-mecef-windows-x64.exe. Ce téléchargement public prend en charge 1 MCF. Pour plusieurs MCF, commandez une édition personnalisée auprès de notre équipe.
  2. Placez le fichier dans un répertoire de votre choix (ex : C:\e-mecef\)
  3. Double-cliquez pour lancer la GUI, ou installez comme service Windows (voir Tableau de bord)
  4. La GUI s'ouvre — utilisez la section Service système dans le tableau de bord pour installer le service
  5. Une fois le service installé et démarré, vérifiez : http://127.0.0.1:38917/health

Windows Server sur demande

Une édition dédiée à Windows Server est également disponible. Contactez-nous pour nous présenter votre environnement et recevoir le binaire adapté.

macOSInstallation macOS

  1. Téléchargez puis décompressez l'archive universelle e-mecef-mac-install.zip, compatible Intel et Apple Silicon
  2. Ouvrez le Terminal dans le dossier décompressé puis exécutez ./install-macos.sh
  3. Au premier lancement, macOS peut demander une autorisation de sécurité (Préférences Système → Sécurité)
  4. Lancez la GUI et installez le service via le dashboard

LinuxInstallation Linux

# Téléchargement et installation
chmod +x e-mecef-linux-x64
sudo mv e-mecef-linux-x64 /usr/local/bin/e-mecef

# Lancement de la GUI
e-mecef

# Installation du service (depuis la GUI ou en ligne de commande)
e-mecef --driver-only  # Mode driver seul (pour systemd)

Pour un démarrage automatique, installez le service via la GUI ou créez manuellement un service systemd.

Configuration

La configuration du driver se fait via la GUI (onglet Paramètres) ou manuellement via un fichier .env. Le fichier est automatiquement créé par la GUI dans le répertoire de configuration de la plateforme.

VariableDéfautDescription
MCF_CAPACITY (compilation)1Capacité maximale du binaire. L'édition publique vaut 1 ; toute capacité à partir de 2 MCF est proposée sur commande.
MCF_COUNT1Nombre de profils réellement actifs. Doit être compris entre 1 et la capacité du binaire.
MCF<n>_NAMEMCF <n>Nom lisible du profil dans la GUI et les diagnostics.
MCF<n>_DEVICE_KINDautoModule fiscal : auto, eltrade ou datamega.
MCF<n>_DEVICE_PORT(auto)Port série du MCF. Vide = détection automatique par VID:PID.
MCF<n>_DEVICE_VID / PIDselon le modèleEltrade : 03EB:6119. Datamega observé : 05C6:9018. Les valeurs réelles du terminal restent prioritaires.
MCF<n>_DEVICE_BAUD115200Vitesse de communication (bauds).
MCF<n>_DRIVER_HOST / PORT127.0.0.1 / 38916+nAdresse et port HTTP propres au profil : 38917 pour MCF 1, 38918 pour MCF 2, etc.
MCF<n>_DRIVER_API_TOKEN(vide sur localhost)Jeton Bearer obligatoire si le serveur écoute hors de la boucle locale.
MCF<n>_DRIVER_CORS_ORIGINS(vide)Origines Web autorisées, séparées par des virgules.
MCF<n>_DRIVER_MODElocalMode standard : local ou cloud.
MCF<n>_DRIVER_WSS_URL(vide)URL du serveur SFE en mode cloud : wss://e-sfe.bf/api/mcf-ws.
MCF<n>_DRIVER_API_KEY(vide)Clé API propre au profil pour la connexion WebSocket.
MCF<n>_MCF_MOCKfalsetrue = simulateur MCF interne (pas de matériel requis) + vérification de licence désactivée. Réservé au développement — les factures générées ne sont pas fiscalement valides.
MCF<n>_OPERATION_JOURNAL_FILE(automatique)Journal d'idempotence propre au profil. Un fichier SQLite distinct est créé automatiquement.
LICENSE_SERVER_URLhttps://e-mecef.bfURL du serveur de licence commun à tous les profils.
LICENSE_FILE./license.jsonChemin vers le fichier de licence commun.

Configuration recommandée

Utilisez la GUI pour configurer le driver. Les modifications sont automatiquement sauvegardées dans le fichier .env du répertoire de configuration.

Capacité et profils multi-MCF

MCF_CAPACITY est intégrée au binaire lors de sa compilation. La définir dans le fichier .env ne change donc pas la capacité. Utilisez MCF_COUNT pour activer uniquement le nombre nécessaire. Si cette valeur dépasse la capacité, la GUI et le driver refusent la configuration avec une erreur explicite.

Option disponible sur commande

L'édition standard gère 1 MCF. Toute capacité à partir de 2 MCF est préparée sur commande et n'est pas proposée en téléchargement libre. Contactez notre équipe en précisant le nombre de terminaux, les modèles utilisés et le mode local ou cloud souhaité. Nous vous proposerons la capacité et le binaire correspondant.

MCF_COUNT=2

MCF1_NAME=Caisse principale
MCF1_DEVICE_KIND=eltrade
MCF1_DEVICE_PORT=COM8
MCF1_DRIVER_HOST=127.0.0.1
MCF1_DRIVER_PORT=38917
MCF1_DRIVER_MODE=local

MCF2_NAME=Caisse Datamega
MCF2_DEVICE_KIND=datamega
MCF2_DEVICE_PORT=COM7
MCF2_DRIVER_HOST=127.0.0.1
MCF2_DRIVER_PORT=38918
MCF2_DRIVER_MODE=cloud
MCF2_DRIVER_WSS_URL=wss://e-sfe.bf/api/mcf-ws
MCF2_DRIVER_API_KEY=cle_api_propre_au_profil_2

LICENSE_SERVER_URL=https://e-mecef.bf

Chaque profil actif doit utiliser un port série, un port HTTP et un journal d'opérations distincts. Chaque profil cloud utilise aussi sa propre clé API. La licence et son compteur de factures restent communs. Les anciennes variables sans préfixe configurent encore le premier profil lorsqu'aucune variable MCF1 équivalente n'est définie.

Détection automatique du port série

Si MCF<n>_DEVICE_PORT est vide, le driver recherche automatiquement le MCF par son identifiant USB (VID:PID). Avec MCF<n>_DEVICE_KIND=auto, il distingue aussi Eltrade et Datamega. La route GET /ports retourne la liste des ports disponibles pour faciliter le diagnostic.

Interface GUI — écran de configuration du port série
Interface GUI — écran de configuration du port série

Datamega au Burkina Faso

Le FIS-NANO burkinabè utilise le protocole fiscal SFE-MCF/BCC. Les documents TCC Datamega du Congo ont servi à l'étude initiale, mais leur protocole CRC16 et leurs commandes ne sont pas utilisés pour la certification au Burkina Faso. Les données de facture suivent le même référentiel E-MeCeF Burkina que pour Eltrade.

Activation de la licence

Pour émettre des factures certifiées, le driver doit être activé avec une clé de licence valide. L'activation lie la licence à la machine (via son NIM — Numéro d'Identification de la Machine).

Procédure d'activation

1

Obtenez une clé de licence

Achetez une licence depuis votre espace client E-MeCeF et récupérez la clé au format XXXXX-XXXXX-XXXXX-XXXXX.

2

Installez et démarrez le service

Lancez la GUI e-mecef, allez dans le dashboard et installez le service système. Démarrez le service.

3

Activez via l'interface GUI

Dans le dashboard, si la licence est invalide, un formulaire d'activation apparaît. Entrez votre clé et le NIM, puis cliquez sur Activer.

4

Vérification

L'activation est confirmée par un message de succès. La licence est sauvegardée localement dans license.json.

Interface GUI — activation de la licence dans le tableau de bord
Interface GUI — activation de la licence dans le tableau de bord

Activation via l'API

Vous pouvez également activer la licence directement via l'API REST :

POST http://127.0.0.1:38917/license/activate
Content-Type: application/json

{
  "key": "ABCDE-FGHIJ-KLMNO-PQRST",
  "nim": "NIM-de-la-machine"
}

Interface graphique (GUI)

La GUI est une application de bureau native intégrée au binaire unifié. Elle comporte deux onglets : Tableau de bord et Paramètres.

Important : un seul service driver

Installez puis démarrez le service depuis le tableau de bord. La GUI ne démarre et ne redémarre pas automatiquement un service arrêté, et ne lance jamais un second driver embarqué en parallèle. Pour le diagnostic, utilisez e-mecef --driver-only.

Tableau de bord

L'onglet Tableau de bord est l'interface principale. Il regroupe le monitoring en temps réel et la gestion du service système :

Monitoring

  • Driver — état En cours / Arrêté et numéro de version.
  • Une carte par profil actif — modèle, port et statut Connecté ou Déconnecté.
  • Statut MCF actualisé automatiquement dès l'ouverture, puis environ toutes les 2 secondes ; la vérification est différée pendant une opération en cours.
  • Licence — validité, plan, NIM, quota de factures (émises / max / restantes) et date d'expiration.

Service système

Le dashboard intègre la gestion du service système pour un démarrage automatique au boot :

  • macOS — LaunchAgent launchd (flag --driver-only).
  • Linux — service utilisateur systemd (flag --driver-only).
  • Windows — Service Control Manager (flag --service).

Actions disponibles : Installer, Désinstaller, Démarrer et Arrêter le service.

Sur Windows, l'installation nécessite les droits administrateur. Un bouton "Relancer en admin" est proposé si nécessaire.

Activation de licence

Lorsque la licence est absente ou invalide, un formulaire d'activation apparaît directement dans le tableau de bord (champs clé de licence et NIM).

GUI — tableau de bord avec monitoring, service et activation
GUI — tableau de bord avec monitoring, service et activation

Paramètres

L'onglet Paramètres permet de configurer tous les aspects du driver :

  • Port série MCF (ex. COM3 ou /dev/ttyUSB0), VID, PID et vitesse de communication (baudrate).
  • Nombre de profils actifs et capacité maximale affichés sous la forme 1/1 ou 2/6.
  • Un module, un port série, une adresse et un port HTTP propres à chaque profil actif.
  • URL du serveur de licence et chemin vers le fichier license.json.
  • Mode mock MCF — case à cocher pour activer le simulateur sans matériel.
  • Mode cloud par profil — sélecteur Local / Cloud, URL WSS et clé API (voir section dédiée ci-dessous).

Après enregistrement, les modifications prendront effet au prochain démarrage du driver. Redémarrez le service via le tableau de bord pour appliquer les changements.

GUI — onglet Paramètres et configuration
GUI — onglet Paramètres et configuration

Mode cloud (WebSocket)

Par défaut, chaque profil actif expose une API REST sur son propre port, à partir de http://127.0.0.1:38917 (mode local). En activant le mode cloud, le profil initie sa propre connexion WebSocket permanente vers le serveur SFE. Cette connexion est sortante — aucun port à ouvrir, fonctionne derrière n'importe quel NAT ou firewall.

MCF<n>_DRIVER_MODE=local

Mode LOCAL (défaut)

API REST propre au profil — le SFE appelle le driver directement depuis le même réseau local.

MCF<n>_DRIVER_MODE=cloud

Mode CLOUD (nouveau)

Le driver se connecte au serveur SFE via WebSocket. Les factures sont poussées depuis le cloud et traitées localement.

Pourquoi le mode cloud ?

En mode cloud, les opérateurs peuvent être sur mobile, tablette ou un browser distant — ils ne peuvent jamais atteindre 127.0.0.1 d'un autre réseau. Le mode cloud résout ce problème : le driver établit lui-même la connexion vers le serveur SFE, qui peut ensuite pousser des factures à certifier depuis n'importe quel appareil connecté à Internet.

Flux de certification

1

Mobile / Browser

L'opérateur valide une facture dans l'interface SFE.

2

Cloud SFE

Le serveur stocke le payload MCF pré-calculé et pousse un message BILL vers le driver via WebSocket.

3

Driver MCF (local)

Le driver reçoit le message, appelle le terminal MCF via le port série et obtient le QR code + numéro DGI.

4

Cloud SFE

Le driver répond BILL_RESULT (status: success) avec le QR code. Le serveur met à jour la facture et notifie le client.

5

Mobile / Browser

L'opérateur voit la facture certifiée (QR code affiché), 1 à 3 secondes après validation.

Configuration

Activez le mode cloud via la GUI → Paramètres → profil MCF → Mode cloud (WebSocket) : sélecteur Local / Cloud, champs URL WSS et Clé API. Enregistrez puis redémarrez le service via le dashboard.

Ou manuellement dans le fichier .env :

MCF1_DRIVER_MODE=cloud
MCF1_DRIVER_WSS_URL=wss://e-sfe.bf/api/mcf-ws
MCF1_DRIVER_API_KEY=sk_mcf_1_xxxxxxxxxxxx   # clé propre au profil

Authentification

La clé API (MCF<n>_DRIVER_API_KEY) est transmise lors de la poignée de main WebSocket (handshake HTTP/1.1 Upgrade), dans l'en-tête standard Authorization :

GET /api/mcf-ws HTTP/1.1
Host: e-sfe.bf
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: <clé générée automatiquement>
Sec-WebSocket-Version: 13
Authorization: Bearer sk_mcf_1_xxxxxxxxxxxx
X-MCF-Profile-Id: mcf-1

Le serveur SFE doit vérifier cet en-tête avant d'accepter l'upgrade (répondre 401 Unauthorized si absent ou invalide). Une fois la connexion établie, aucun header supplémentaire n'est nécessaire — les messages JSON circulent librement sur le canal ouvert.

Reconnexion automatique

En cas de déconnexion, chaque profil se reconnecte automatiquement avec un exponential backoff (1 s → 2 s → 4 s → … → 60 s). Les factures reçues pendant la déconnexion restent en statut PENDING_MCF côté cloud et sont traitées dès que le driver se reconnecte.

Protocole de messages

Le WebSocket expose exactement les mêmes opérations que l'API HTTP. Tous les messages suivent le format uniforme { type, status, data|error }.

Message entrant (Cloud → Driver)Équivalent HTTPRéponse (type)
BILLPOST /billBILL_RESULT
CHECKGET /checkCHECK_RESULT
INFOGET /infoINFO_RESULT
PORTSGET /portsPORTS_RESULT
LICENSE_STATUSGET /license/statusLICENSE_STATUS_RESULT
LICENSE_ACTIVATEPOST /license/activateLICENSE_ACTIVATE_RESULT
LICENSE_RENEWPOST /license/renewLICENSE_RENEW_RESULT

Serveur → Driver (facture)

{ "type": "BILL", "invoiceId": "uuid", "payload": { ...BillInput... } }
{ "type": "PONG" }

Driver → Serveur (succès)

{
  "type": "BILL_RESULT",
  "invoiceId": "uuid",
  "status": "success",
  "data": {
    "qr_code": "BFSECEF01;...",
    "security_code": "MOCKSIG000001",
    "nim": "XX01000001-1",
    "ifu": "0000000000001",
    "invoice_number": "SFEMOCK001/1",
    "datetime": "20260512210432",
    "bill_counter": "1",
    "total_counter": "1",
    "bill_type": "FV",
    "mcf_reference": "XX01000001-1-1"
  }
}

Driver → Serveur (erreur)

{ "type": "BILL_RESULT", "invoiceId": "uuid", "status": "error", "error": "Licence invalide" }

{ "type": "PING" }   // heartbeat toutes les 30 s

Le driver envoie un PING JSON toutes les 30 s. Le serveur doit répondre PONG. Si la connexion est perdue, le driver se reconnecte automatiquement (exponential backoff).

Référence API

Chaque profil actif expose une API REST sur son port configuré. Le premier utilise par défaut http://127.0.0.1:38917. Les profils suivants utilisent 38918, 38919, etc. Les routes protégées nécessitent la licence commune valide.

MéthodeRouteAuth.Description
GET/healthNonStatut du driver, version, infos licence et device.
GET/checkNonTeste la connexion avec le MCF (port série).
GET/portsNonListe les ports série disponibles sur le système.
POST/license/activateNonActive une licence avec clé + NIM de la machine.
POST/license/renewNonRenouvelle le token JWT de la licence active.
GET/license/statusNonRetourne le statut de la licence courante.
GET/infoOui¹Informations du device MCF et contribuable.
POST/billOui¹Crée et certifie une facture sur le MCF.
GET/operations/:keyOui¹Consulte une opération persistée par sa clé d'idempotence.

¹ En mode MCF<n>_MCF_MOCK=true, la vérification de licence est désactivée pour toutes les routes protégées.

Validation et idempotence

POST /bill valide le JSON et les règles du référentiel E-MeCeF Burkina avant l'accès au terminal. Une requête invalide renvoie HTTP 400 avec le code VALIDATION_ERROR et des erreurs détaillées par champ.

Fournissez un en-tête Idempotency-Key stable. Une opération fiscalement refusée renvoie OPERATION_REJECTED ; corrigez la demande puis utilisez une nouvelle clé. Une erreur de transport après envoi renvoie RESULT_INDETERMINATE et doit être rapprochée avant toute nouvelle certification.

Exemple : créer une facture

Requête minimale avec un article et un paiement en espèces :

POST http://127.0.0.1:38917/bill
Content-Type: application/json

{
  "isf": "SFE-2026-000042",
  "invoice_number": "FAC-2026-000042",
  "client_type": "PM",
  "client_ifu": "1234567890123",
  "client_name": "Entreprise ACME SARL",
  "price_mode": "TTC",
  "vt": "FV",
  "products": [
    {
      "label": "Prestation de service informatique",
      "tax": "B",
      "price": 150000,
      "quantity": 1,
      "itype": "LOCSER"
    }
  ],
  "payments": [
    {
      "mode": "V",
      "amount": 150000
    }
  ]
}

Réponse en cas de succès :

HTTP/1.1 200 OK

{
  "qr_code": "BFSECEF01;XX01000001-1;MOCKSIG000001;0000000000001;20260511143000",
  "security_code": "MOCKSIG000001",
  "nim": "XX01000001-1",
  "ifu": "0000000000001",
  "invoice_number": "SFE-2026-000042",
  "datetime": "20260511143000",
  "bill_counter": "1",
  "total_counter": "1",
  "bill_type": "FV",
  "mcf_reference": "XX01000001-1-1"
}

Exemple : créer une facture d'avoir

Pour émettre un avoir sur une facture déjà certifiée, utilisez la valeur mcf_reference retournée par le POST /bill original comme champ rn. Le format attendu est {NIM}-{TC} (ex : AB01000001-1-50). Ne pas utiliser invoice_number — le MCF stocke sa propre référence interne et rejettera tout autre valeur.

POST http://127.0.0.1:38917/bill
Content-Type: application/json

{
  "isf": "SFE-2026-000043",
  "invoice_number": "AV-2026-000001",
  "rt": "FA",
  "receipt_nature": "RAN",
  "rn": "XX01000001-1-1",
  "price_mode": "TTC",
  "products": [
    {
      "label": "Prestation de service informatique",
      "tax": "B",
      "price": 150000,
      "quantity": 1,
      "itype": "LOCSER"
    }
  ],
  "payments": [
    {
      "mode": "E",
      "amount": 150000
    }
  ]
}

Modèles

BillInput — Corps de la requête POST /bill

ChampTypeRequisDescription
isfstringOuiIdentifiant Système de Facturation (ISF) — référence interne unique de la facture dans le SFE.
invoice_numberstringOuiNuméro de facture interne (affiché sur le ticket).
productsProductInput[]OuiListe des articles de la facture (minimum 1).
paymentsPaymentInput[]OuiListe des paiements (minimum 1).
operator_idstringNonIdentifiant de l'opérateur/caissier (OPID). Défaut : "1".
operator_namestringNonNom de l'opérateur/caissier (OPNOM). Défaut : "Caisse".
client_type"CC"|"PM"|"PP"|"PC"NonType de client. CC = Client comptant (défaut), PM = Personne morale, PP = Personne physique, PC = Personne physique commerçant.
client_ifustringNonIFU du client (obligatoire si client_type = PM ou PC).
client_namestringNonNom ou raison sociale du client.
client_addressstringNonAdresse du client.
client_phonestringNonNuméro de téléphone du client.
client_emailstringNonAdresse e-mail du client.
client_rccmstringNonNuméro RCCM (Registre du Commerce) du client.
price_mode"TTC"|"HT"NonMode de saisie des prix. TTC = toutes taxes comprises (défaut), HT = hors taxes.
vt"FV"|"FT"|"EV"|"ET"NonType de facture vente. FV = Facture de vente (défaut), FT = Facture d'acompte, EV = Facture de vente à l'exportation, ET = Facture d'acompte à l'exportation.
rt"FA"|"EA"NonType de facture d'avoir. FA = Facture d'avoir, EA = Facture d'avoir à l'exportation. Nécessite rn et receipt_nature.
rnstringNonRéférence MCF de la facture d'origine (obligatoire si rt est défini). Doit être la valeur mcf_reference retournée par le POST /bill de la facture originale. Format : {NIM}-{TC} (ex : "AB01000001-1-50"). Ne pas utiliser invoice_number — le MCF ne le reconnaîtra pas.
receipt_nature"COR"|"RAN"|"RAM"|"RRR"NonNature de la facture d'avoir (obligatoire si rt défini). COR = Correction, RAN = Annulation, RAM = Avoir suite reprise de biens/services, RRR = Remise, ristourne, rabais.
psvbstringNonGroupe PSVB (Prélèvement Sécurité Ventes Boissons) applicable : A | B | C | D. Vide ou absent = aucun précompte PSVB. Non applicable aux factures d'avoir.
supplementary_infoAdditionalInfoEntry[]NonInformations supplémentaires libres (commentaires, régime fiscal, compte bancaire…) envoyées via la commande 36h.

BillResponse — Réponse de POST /bill

ChampTypeRequisDescription
qr_codestringOuiCode QR à imprimer sur la facture certifiée. Format : BFSECEF01;{NIM};{SIG};{IFU};{DT}.
security_codestringOuiCode SECeF/DGI (SIG) — élément de sécurité à imprimer sur la facture.
nimstringOuiNuméro d'Identification de la Machine (NIM) au format NIM-ACNT.
ifustringOuiIdentifiant Fiscal Unique du contribuable.
invoice_numberstringOuiNuméro de facture SFE confirmé par le MCF.
datetimestringOuiDate et heure de certification au format AAAAMMJJHHmmss.
bill_counterstringOuiFC — compteur par type de facture.
total_counterstringOuiTC — compteur total de factures (utilisé dans mcf_reference).
bill_typestringOuiType de facture certifiée (FV, FA, EV…).
mcf_referencestringOuiRéférence MCF de cette facture, à conserver et passer comme champ rn pour tout avoir ultérieur. Format : {NIM}-{TC} (ex : "AB01000001-1-50").

ProductInput — Article de facture

ChampTypeRequisDescription
labelstringOuiDésignation de l'article (1–64 caractères).
tax"A".."P"OuiGroupe de taxe MCF (16 groupes A à P selon la configuration du terminal).
pricenumberOuiPrix unitaire (TTC ou HT selon price_mode), doit être positif. Hors taxe spécifique : la taxe spécifique s'ajoute par-dessus, réintégrée majorée de la TVA du groupe. Total de la ligne = price × quantity + specific_tax_total × (1 + TR), où TR est le taux de taxe du groupe (ex. 0,18 pour 18 %).
quantitynumberNonQuantité (défaut : 1).
itype"LOCBIE"|"LOCSER"|"IMPBIE"|"IMPSER"NonType d'article. LOCBIE = Bien local, LOCSER = Service local, IMPBIE = Bien importé, IMPSER = Service importé.
internal_codestringNonCode interne / référence article (max 24 caractères).
specific_tax_ratestringNonTaxe spécifique, deux modes possibles : (1) MONTANT par unité — un nombre, ex. "60" (le MCF impose specific_tax_rate × quantity = specific_tax_total) ; (2) POURCENTAGE — la valeur suffixée du signe %, ex. "5%" (le MCF calcule lui-même le montant). Attention : "0.05" est interprété comme un montant de 0,05 par unité, PAS comme 5 %. À fournir avec specific_tax_total.
specific_tax_totalnumberNonMontant total de la taxe spécifique pour la ligne (quantité totale). En mode montant, doit être égal à specific_tax_rate × quantity, sinon le MCF refuse l'article (TSR*QTY != TS).
specific_tax_descstringNonLibellé de la taxe spécifique (max 16 caractères).
original_pricenumberNonPrix d'origine avant remise ou modification.
price_change_explanationstringNonMotif du changement de prix.

PaymentInput — Paiement

ChampTypeRequisDescription
mode"V"|"C"|"M"|"D"|"E"|"A"OuiMode : V = Virement, C = Carte bancaire, M = Mobile Money, D = Chèque, E = Espèces, A = Autre.
amountnumberOuiMontant du paiement, doit être positif.

AdditionalInfoEntry — Champ d'information supplémentaire (36h)

ChampTypeRequisDescription
lidstringOuiIdentifiant du champ. A..H = Lignes de commentaire A–H, REGIMP = Régime d'imposition, COMBAN = Comptes bancaires, SERIMP = Centre d'impôts.
contentstringNonContenu du champ (texte libre, optionnel selon le LID).

FAQ & Dépannage

Le driver ne démarre pas automatiquement, que faire ?

Installez puis démarrez le service système depuis le tableau de bord. La GUI ne démarre et ne redémarre pas automatiquement un service arrêté ; les boutons du tableau de bord gardent ces actions explicites. Pour un diagnostic interactif, utilisez e-mecef --driver-only. Sous Windows, le mode --service est réservé au gestionnaire de services et ne doit pas être lancé manuellement.

Le driver ne détecte pas le MCF automatiquement, que faire ?

Vérifiez que le MCF est bien connecté via USB. Consultez GET /ports sur le serveur HTTP du profil concerné. Vous pouvez fixer le modèle avec MCF<n>_DEVICE_KIND=eltrade|datamega et le port avec MCF<n>_DEVICE_PORT. Les anciennes variables DEVICE_KIND et DEVICE_PORT restent reconnues pour le premier profil.

J'obtiens une erreur 'Licence invalide' après l'activation.

Assurez-vous que le serveur de licence (LICENSE_SERVER_URL) est accessible depuis la machine. Vérifiez que la clé de licence n'est pas révoquée depuis l'espace client.

Comment mettre à jour le driver ?

Téléchargez la nouvelle version depuis la page Téléchargements. Arrêtez le service via le dashboard de la GUI (ou via les commandes système). Remplacez le binaire e-mecef par la nouvelle version. Redémarrez le service. La licence est conservée dans le fichier license.json.

Existe-t-il une version pour Windows Server ?

Oui. Une édition dédiée à Windows Server est disponible sur demande. Contactez notre équipe depuis le formulaire du site afin de nous présenter votre environnement et de recevoir le binaire adapté.

Le fichier license.json est-il sécurisé ?

Oui. Sur Linux/macOS, le fichier est créé avec des permissions 600 (lisible uniquement par le propriétaire). Sur Windows, il est stocké dans ProgramData (C:\ProgramData\eltrade\mcf-driver\), répertoire partagé accessible au service qui tourne sous LocalSystem.

Puis-je utiliser le driver sur plusieurs machines avec une seule licence ?

Cela dépend du plan choisi. Chaque plan définit un nombre maximal de machines (maxMachines). Consultez votre espace client pour voir le quota associé à votre licence.

Comment activer le mode développement sans matériel ?

Définissez MCF<n>_MCF_MOCK=true pour le profil concerné. Ce mode active le simulateur MCF interne et désactive la vérification de licence pour ce profil. Les factures générées ne sont pas fiscalement valides — réservé au développement et aux tests d'intégration. L'ancienne variable MCF_MOCK reste compatible avec MCF 1.

Mes opérateurs utilisent des mobiles ou tablettes. Peuvent-ils certifier les factures ?

Oui, grâce au mode cloud. Le driver se connecte lui-même au serveur SFE via WebSocket (connexion sortante — aucun port à ouvrir). Le serveur pousse les factures (message BILL) vers le driver, qui les certifie sur le hardware local et renvoie le QR code via BILL_RESULT. Les mobiles ne communiquent jamais directement avec le driver.

En mode cloud, le driver doit-il être accessible depuis Internet ?

Non. La connexion est initiée par le driver lui-même (sortante). Elle traverse n'importe quel NAT ou firewall sans configuration. Aucun IP public ni port entrant requis. Si la connexion est perdue, le driver se reconnecte automatiquement (exponential backoff) et traite les factures en attente.

Comment configurer le mode cloud dans la GUI ?

Allez dans Paramètres, sélectionnez le profil MCF, puis son mode WebSocket. Sélectionnez Cloud, renseignez wss://e-sfe.bf/api/mcf-ws et la clé API propre à ce profil. Enregistrez puis redémarrez le service. Chaque profil cloud doit utiliser une paire URL + clé distincte.

Comment obtenir l'option multi-MCF ?

L'édition publique gère 1 MCF. À partir de 2 MCF, la capacité est préparée uniquement sur commande selon le nombre de terminaux et l'environnement du client. Contactez notre équipe depuis le formulaire du site afin d'obtenir une proposition et le binaire adapté. L'édition personnalisée n'active que le nombre demandé via MCF_COUNT ; la GUI affiche le rapport actif/capacité, par exemple 2/6.

Que se passe-t-il si MCF_COUNT dépasse la capacité du binaire ?

La configuration est refusée avec une erreur explicite. MCF_CAPACITY est fixé à la compilation et ne peut pas être augmenté dans le fichier .env. Si vous devez activer plusieurs profils, contactez notre équipe pour commander une édition multi-MCF adaptée.

Les MCF actifs partagent-ils la même connexion ?

Non. Chaque profil actif dispose de son port série, de son serveur HTTP, de sa connexion WebSocket et de son journal d'opérations. Les ports série et HTTP doivent être distincts. La licence et son compteur de factures sont communs à l'installation.

Comment configurer un Datamega FIS-NANO au Burkina Faso ?

Sélectionnez Datamega ou Détection automatique dans le profil, puis choisissez le port détecté. Les valeurs USB courantes sont VID 05C6 et PID 9018, avec 115200 bauds, mais la configuration réelle du terminal reste prioritaire. Le driver utilise le protocole fiscal burkinabè SFE-MCF/BCC ; le protocole TCC CRC16 documenté au Congo n'est pas utilisé pour la certification au Burkina Faso.

Le MCF refuse un article avec 'TSR*QTY != TS' (taxe spécifique).

Le MCF impose que, en mode montant, specific_tax_rate × quantity soit exactement égal à specific_tax_total. Exemple correct : specific_tax_rate="60", quantity=2, specific_tax_total=120 (60 × 2 = 120). Pour exprimer un pourcentage, suffixez la valeur du signe % (ex : specific_tax_rate="5%") — sans le %, "0.05" est interprété comme un montant de 0,05 par unité, pas comme 5 %. Rappel : le price est hors taxe spécifique ; la taxe spécifique est réintégrée majorée de la TVA du groupe, donc le paiement doit couvrir price × quantity + specific_tax_total × (1 + TR), où TR est le taux du groupe (ex. 0,18 pour 18 %).

L'ouverture de facture est refusée (client identifié PM / PC).

L'IFU (client_ifu) est obligatoire pour les client_type PM (personne morale) et PC (personne physique commerçant), et le MCF exige un IFU valide (13 chiffres). Un IFU manquant ou mal formé fait échouer l'étape d'identification client (C3h) et donc l'ouverture de la facture. Utilisez un IFU réel, ou omettez l'identification client pour une vente au comptant (CC).

Besoin d'aide supplémentaire ?

Contactez notre support ou consultez votre espace client.