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. Il expose une API REST sur http://127.0.0.1:38917 à destination du Système de Facturation d'Entreprise (SFE).
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 (Intel + Apple Silicon) et Linux
Architecture
Le système se compose de trois briques qui communiquent entre elles :
Le SFE envoie les données de facturation au Driver via HTTP, qui les transmet au terminal MCF via le port série.
Installation du Driver
Téléchargez le binaire correspondant à votre système d'exploitation depuis la page de téléchargements.
WindowsInstallation Windows
- Téléchargez
e-mecef-driver-x86_64-pc-windows-gnu.exe - Placez le fichier dans un répertoire de votre choix (ex :
C:\eltrade\) - Créez un fichier
.envdans le même répertoire (voir Configuration) - Lancez l'exécutable en tant qu'administrateur ou configurez-le comme service Windows
- Vérifiez le démarrage : ouvrez
http://127.0.0.1:38917/healthdans le navigateur
Capture d'écran à venir
Installeur Windows — fenêtre d'installation du Driver MCF
macOSInstallation macOS
- Téléchargez le binaire correspondant à votre architecture (Apple Silicon ou Intel)
- Rendez-le exécutable :
chmod +x e-mecef-driver-aarch64-apple-darwin- Créez le fichier de configuration (voir Configuration)
- Au premier lancement, macOS peut demander une autorisation de sécurité (Préférences Système → Sécurité)
- Vérifiez le démarrage :
curl http://127.0.0.1:38917/health
Capture d'écran à venir
macOS — autorisation de sécurité et lancement du Driver
LinuxInstallation Linux
# Téléchargement et installation
chmod +x e-mecef-driver-x86_64-unknown-linux-gnu
sudo mv e-mecef-driver-x86_64-unknown-linux-gnu /usr/local/bin/e-mecef-driver
# Création du répertoire de configuration
mkdir -p ~/.config/mcf-driver
cp .env.example ~/.config/mcf-driver/.env
# Lancement
e-mecef-driverPour un démarrage automatique, créez un service systemd (voir la documentation avancée).
Configuration
La configuration du driver se fait via un fichier .env. Créez ce fichier à côté du binaire (ou dans le répertoire de configuration de la plateforme).
# Exemple de fichier .env
DEVICE_PORT=
DEVICE_VID=03EB
DEVICE_PID=6119
DEVICE_BAUD=115200
DRIVER_PORT=38917
DRIVER_HOST=127.0.0.1
LICENSE_SERVER_URL=https://votre-serveur-licence.com
LICENSE_FILE=./license.json| Variable | Défaut | Description |
|---|---|---|
DEVICE_PORT | (auto) | Port série du MCF. Vide = détection automatique par VID:PID. |
DEVICE_VID | 03EB | Vendor ID USB du MCF Eltrade. |
DEVICE_PID | 6119 | Product ID USB du MCF Eltrade. |
DEVICE_BAUD | 115200 | Vitesse de communication (bauds). |
DRIVER_PORT | 38917 | Port HTTP du serveur local du driver. |
DRIVER_HOST | 127.0.0.1 | Adresse d'écoute (ne pas modifier en prod). |
DRIVER_CORS_ORIGINS | (vide = Any) | Origines CORS autorisées, séparées par virgules. |
LICENSE_SERVER_URL | https://e-mecef.codarno.com | URL du serveur de licence E-MeCeF. |
LICENSE_FILE | ./license.json | Chemin vers le fichier de licence local. |
MCF_MOCK | false | true = 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. |
Détection automatique du port série
Si DEVICE_PORT est vide, le driver recherche automatiquement le MCF par son identifiant USB (VID:PID). La route GET /ports retourne la liste des ports disponibles pour faciliter le diagnostic.
Capture d'écran à venir
Interface GUI — écran de configuration du port série
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
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.
Démarrez le driver
Assurez-vous que le driver est en cours d'exécution et accessible sur http://127.0.0.1:38917.
Activez via l'interface GUI
Ouvrez la GUI, allez dans Paramètres → Licence, entrez votre clé et cliquez sur Activer.
Vérification
L'activation est confirmée par un message de succès. La licence est sauvegardée localement dans license.json.
Capture d'écran à venir
Interface GUI — fenêtre d'activation de la licence
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 qui pilote le driver local. Elle comporte trois onglets : Tableau de bord, Paramètres et Service.
Tableau de bord
L'onglet principal affiche l'état en temps réel du système sous forme de trois cartes :
- Driver — état En cours / Arrêté et numéro de version.
- Appareil MCF — Connecté, Non connecté, ou Mode mock (simulé) si MCF_MOCK=true.
- Licence — validité, plan, NIM, quota de factures (émises / max / restantes) et date d'expiration.
Les boutons Démarrer, Arrêter et Actualiser permettent de contrôler le processus driver. 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).
Capture d'écran à venir
GUI — tableau de bord avec statut driver, MCF et licence
Paramètres
L'onglet Paramètres permet de configurer tous les aspects du driver :
- Chemin vers le binaire driver (avec sélecteur de fichier).
- Port série MCF (ex. COM3 ou /dev/ttyUSB0), VID, PID et vitesse de communication (baudrate).
- Adresse et port HTTP du serveur local (hôte + port).
- URL du serveur de licence et chemin vers le fichier license.json.
- Mode mock MCF — case à cocher pour activer le simulateur sans matériel.
Après enregistrement, si le driver est en cours d'exécution, il redémarre automatiquement pour appliquer la nouvelle configuration.
Capture d'écran à venir
GUI — écran des paramètres et configuration
Gestion du service système
L'onglet Service permet d'installer le driver comme service système (démarrage automatique au boot), sans avoir à le lancer manuellement. Le gestionnaire utilisé dépend de la plateforme :
- macOS — LaunchAgent launchd (plist utilisateur).
- Linux — service utilisateur systemd.
- Windows — entrée HKCU\Run dans le registre.
Les actions disponibles sont : Installer, Désinstaller, Démarrer et Arrêter le service, selon son état courant.
Capture d'écran à venir
GUI — onglet Service avec gestion launchd/systemd
Référence API
Le driver expose une API REST sur http://127.0.0.1:38917. Les routes protégées nécessitent une licence valide.
| Méthode | Route | Auth. | Description |
|---|---|---|---|
| GET | /health | Non | Statut du driver, version, infos licence et device. |
| GET | /check | Non | Teste la connexion avec le MCF (port série). |
| GET | /ports | Non | Liste les ports série disponibles sur le système. |
| POST | /license/activate | Non | Active une licence avec clé + NIM de la machine. |
| POST | /license/renew | Non | Renouvelle le token JWT de la licence active. |
| GET | /license/status | Non | Retourne le statut de la licence courante. |
| GET | /info | Oui¹ | Informations du device MCF et contribuable. |
| POST | /bill | Oui¹ | Crée et certifie une facture sur le MCF. |
¹ En mode MCF_MOCK=true, la vérification de licence est désactivée pour toutes les routes protégées.
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;20260303143000",
"invoice_number": "SFE-2026-000042/001",
"bill_counter": 1,
"total_counter": 1,
"bill_type": "FV"
}Modèles
BillInput — Corps de la requête POST /bill
| Champ | Type | Requis | Description |
|---|---|---|---|
isf | string | Oui | Identifiant Système de Facturation (ISF) — référence interne unique de la facture dans le SFE. |
invoice_number | string | Oui | Numéro de facture interne (affiché sur le ticket). |
products | ProductInput[] | Oui | Liste des articles de la facture (minimum 1). |
payments | PaymentInput[] | Oui | Liste des paiements (minimum 1). |
operator_id | string | Non | Identifiant de l'opérateur/caissier (OPID). Défaut : "1". |
operator_name | string | Non | Nom de l'opérateur/caissier (OPNOM). Défaut : "Caisse". |
client_type | "CC"|"PM"|"PP"|"PC" | Non | Type de client. CC = Client courant (défaut), PM = Personne Morale, PP = Personne Physique, PC = Particulier. |
client_ifu | string | Non | IFU du client (obligatoire si client_type = PM ou PP). |
client_name | string | Non | Nom ou raison sociale du client. |
client_address | string | Non | Adresse du client. |
client_phone | string | Non | Numéro de téléphone du client. |
client_email | string | Non | Adresse e-mail du client. |
client_rccm | string | Non | Numéro RCCM (Registre du Commerce) du client. |
price_mode | "TTC"|"HT" | Non | Mode de saisie des prix. TTC = toutes taxes comprises (défaut), HT = hors taxes. |
vt | "FV"|"CV"|"EV"|"EC" | Non | Type de facture vente. FV = Facture de vente (défaut), CV = Contre vente, EV = État de vente, EC = État de crédit. |
rt | "FA"|"CA"|"EA"|"ER" | Non | Type d'avoir. FA = Facture avoir, CA = Contre avoir, EA = État avoir, ER = État retour. Nécessite rn et receipt_nature. |
rn | string | Non | Numéro de référence de la facture d'origine (obligatoire si rt est défini). |
receipt_nature | "COR"|"RAN"|"RAM"|"RRR" | Non | Nature du reçu pour les avoirs (obligatoire si rt défini). COR = Correction, RAN = Remboursement annulation, RAM = Remboursement article manquant, RRR = Ristourne/remise/rabais. |
psvb | string | Non | Numéro PSVB (Preuve de Sortie de Valeur de Billet) si applicable. |
supplementary_info | AdditionalInfoEntry[] | Non | Informations supplémentaires libres (commentaires, régime fiscal, compte bancaire…) envoyées via la commande 36h. |
ProductInput — Article de facture
| Champ | Type | Requis | Description |
|---|---|---|---|
label | string | Oui | Désignation de l'article (1–64 caractères). |
tax | "A".."P" | Oui | Groupe de taxe MCF (16 groupes A à P selon la configuration du terminal). |
price | number | Oui | Prix unitaire (TTC ou HT selon price_mode), doit être positif. |
quantity | number | Non | Quantité (défaut : 1). |
itype | "LOCBIE"|"LOCSER"|"IMPBIE"|"IMPSER" | Non | Type d'article. LOCBIE = Bien local, LOCSER = Service local, IMPBIE = Bien importé, IMPSER = Service importé. |
internal_code | string | Non | Code interne / référence article (max 24 caractères). |
specific_tax_rate | string | Non | Taux de taxe spécifique (ex. "0.05" pour 5 %). À fournir avec specific_tax_total. |
specific_tax_total | number | Non | Montant total de la taxe spécifique calculé pour cette ligne. |
specific_tax_desc | string | Non | Libellé de la taxe spécifique. |
original_price | number | Non | Prix d'origine avant remise ou modification. |
price_change_explanation | string | Non | Motif du changement de prix. |
PaymentInput — Paiement
| Champ | Type | Requis | Description |
|---|---|---|---|
mode | "V"|"C"|"M"|"D"|"E"|"A" | Oui | Mode : V = Espèces, C = Chèque, M = Mobile Money, D = Carte bancaire, E = Virement, A = Autre. |
amount | number | Oui | Montant du paiement, doit être positif. |
AdditionalInfoEntry — Champ d'information supplémentaire (36h)
| Champ | Type | Requis | Description |
|---|---|---|---|
lid | string | Oui | Identifiant du champ. COMA..COMH = Commentaires libres A–H, REGIMP = Régime d'imposition, COMBAN = Comptes bancaires, SERIMP = Service des impôts. |
content | string | Non | Contenu du champ (texte libre, optionnel selon le LID). |
FAQ & Dépannage
Besoin d'aide supplémentaire ?
Contactez notre support ou consultez votre espace client.