Référence des commandes
Légende : {} requis · [] optionnel · | choisir une valeur · XXh octet hexadécimal. Les champs de DATA sont séparés par des virgules ; appliquez l’échappement aux valeurs (voir Format des trames). Les réponses sont la chaîne DATA de la trame de réponse.
Liste des commandes
CMD | Nom | Utilisée dans |
|---|---|---|
C1h | Tax Control Status | à tout moment (test de connexion) |
C0h | Start New Invoice (vente ou avoir) | début de transaction |
C3h | Customer Information | vente |
31h | Register New Item (produit/service) | vente |
33h | Subtotal | vente |
35h | Payment / Settlement | les deux |
38h | End Invoice (confirmation finale) | les deux |
C4h | Original Invoice Customer Information | avoir |
41h | Original Invoice Item Information | avoir (boucle) |
43h | Original Invoice Subtotal Information | avoir |
C9h | Cancel Invoice | les deux |
C1h — Status Query
Interroge l’état courant du dispositif. Sert aussi à tester la connexion.
- DATA : aucune
- REPLY :
{result}[,{niu},{terminal_identifier},{TAXT},{TAXR},{TAXE},{verify_url}]
Voir Connexion pour les paramètres et exemples.
C0h — Start New Invoice
Initialise une nouvelle transaction de facture et déclare son type.
- DATA :
{invoice_type} [,{reference_invoice_id}] [,{notes}] - REPLY :
{result}[,{reason}]
| Paramètre | Description |
|---|---|
invoice_type | salesInvoice | creditNote |
reference_invoice_id | Optionnel ; obligatoire quand invoice_type = creditNote — l’ID de la facture d’origine |
notes | Texte libre optionnel |
result | 0 = échec, 1 = succès |
reason | Message d’erreur (en cas d’échec) |
Exemples de DATA :
salesInvoice
salesInvoice,,note message2
creditNote,INV-2025-20
creditNote,INV-2025-20,note message1
Exemples de REPLY :
1
0,invoice no existC3h — Customer Information (vente)
Enregistre le client pour une facture de vente.
- DATA :
{recipient_type},{recipient_name},[{recipient_niu}],[{recipient_rccm}],[{recipient_address}],[{recipient_phone}],[{recipient_email}],{is_recipient_taxable} - REPLY :
{result}[,{reason}]
| Paramètre | Description |
|---|---|
recipient_type | individual | business | government | foreign |
recipient_name | Nom de la personne ou de l’entreprise |
recipient_niu | Optionnel — identifiant fiscal (NIU) du destinataire |
recipient_rccm | Optionnel — numéro RCCM du destinataire |
recipient_address | Optionnel — adresse physique |
recipient_phone | Optionnel — numéro de téléphone |
recipient_email | Optionnel — adresse e-mail |
is_recipient_taxable | 0 = Non, 1 = Oui (assujetti à la TVA) |
Note sur recipient_type. La liste de paramètres ci-dessus (issue de la spécification) utilise les valeurs texte individual / business / government / foreign, mais les exemples C3h de la spécification et la réponse C4h utilisent des codes numériques (1 = individual, 2 = company/business). Confirmez la forme attendue par votre version du dispositif ; les exemples ci-dessous reproduisent la forme numérique de la spécification verbatim.
Exemples de DATA (verbatim) :
1,John Doe,,,,,0
2,John Doe,NIU67890,,,,,1
1,John Doe,NIU67890,RCCM12345,,,,0
2,John Doe,NIU67890,RCCM12345,123 Main St^x2c;New York,,,1
2,John Doe,NIU67890,RCCM12345,123 Main St^x2c;New York,1234567890,,0
2,John Doe,NIU67890,RCCM12345,123 Main St^x2c;New York,1234567890,john.doe@example.com,0
Exemples de REPLY :
1
0,err messageNotez la virgule échappée dans l’adresse (123 Main St^x2c;New York).
31h — Register New Item
Ajoute une ligne produit ou service à la facture de vente courante. À répéter une fois par item.
- DATA :
{designation},[{classification_code}],{type},{unit_price},{quantity},{discount_value},{discount_type},{tax_type} - REPLY :
{result},{subtotal},{net_amount},{tax_amount},{total_amount}
| Paramètre | Description |
|---|---|
designation | Description / nom de l’article |
classification_code | Optionnel — code de classification fiscale du produit |
type | product | service |
unit_price | Prix unitaire hors taxe |
quantity | Quantité |
discount_value | Montant ou pourcentage de remise |
discount_type | fixed | percentage |
tax_type | Catégorie de taux de taxe : T = Tax T, R = Tax R, E = Exempt |
Réponse subtotal | Prix unitaire × quantité |
Réponse net_amount | Montant net après remise |
Réponse tax_amount | Montant de taxe calculé |
Réponse total_amount | Total taxe comprise |
Réponse reason | Message d’erreur (en cas d’échec) |
Exemple de DATA :
apple,,product,99.99,1,5,fixed,T
Exemples de REPLY :
1,99.99,94.99,10,104.99
0,error message33h — Subtotal
Applique une remise globale (au niveau de la facture) et renvoie les totaux calculés de la facture. À appeler après tous les items 31h.
- DATA :
{discount_amount},{discount_type} - REPLY :
{result},{subtotal},{total_tax_t_amount},{total_tax_r_amount},{total_exempt_amount},{total_tax_amount},{discount_amount},{total_line_discount_amount},{additional_cent_tax},{electronic_stamp_duty},{total_amount},{amount_due}
| Paramètre | Description |
|---|---|
discount_amount (data) | Remise globale sur la facture |
discount_type (data) | fixed | percentage |
result | 0 = échec, 1 = succès |
subtotal | Sous-total total hors taxe |
total_tax_t_amount | TVA totale collectée |
total_tax_r_amount | TVA totale déductible |
total_exempt_amount | Montant total exonéré |
total_tax_amount | Montant total de taxe |
discount_amount | Remise globale de la facture |
total_line_discount_amount | Total des remises de lignes |
additional_cent_tax | Taxe additionnelle (centimes) |
electronic_stamp_duty | Droit de timbre électronique |
total_amount | Montant total taxe comprise |
amount_due | Montant final dû |
La réponse est une liste séparée par des virgules dans l’ordre des champs ci-dessus. L’exemple imprimé de la spécification est illustratif et ne correspond pas champ par champ ; utilisez l’ordre des champs du tableau comme contrat.
35h — Payment
Enregistre le mode de paiement. Doit être envoyée avant 38h.
- DATA :
{payment_method} - REPLY :
{result}[,{reason}]
payment_method vaut l’une de : cash, mobile_money, cheque, bank_transfer, card.
Exemples de DATA : Exemples de REPLY :
cash 1
mobile_money 0,err message
cheque
bank_transfer
card38h — End Invoice
Finalise la facture et la soumet. Doit être envoyée après 35h (vente) ou 43h (avoir).
- DATA : aucune
- REPLY :
{result},{receipt_NO},{qrcode}
| Paramètre | Description |
|---|---|
result | 0 = échec, 1 = succès |
receipt_NO | Numéro de reçu |
qrcode | Données de signature QR — à ajouter à verify_url (issue de C1h) pour former le contenu du QR |
reason | Message d’erreur (en cas d’échec) |
Exemple de REPLY (succès) :
1,1,?sign=5c0f97f79a323cf8ff9f112e05490f623bb26fd80c0f150e8ac69e9a5127cf4d^amphmac=da27855ad5a41aca26fb8f746cc8bcbe8eba356f911944f63a21c593d44bfcfe
Exemple de REPLY (échec) :
0,err messageVoir Construction du QR code — notez l’échappement ^amp; dans la valeur qrcode.
C9h — Cancel Invoice
Annule la transaction en cours (voir Annulation pour les moments où c’est autorisé).
- DATA : aucune
- REPLY :
{result}[,{reason}]—1en cas de succès,0,err messageen cas d’échec
Commandes de relecture d’avoir
Pour un avoir, vous relisez la facture d’origine depuis le dispositif au lieu de la ressaisir.
C4h — Original Customer Information
- DATA : aucune
- REPLY :
{result},{recipient_type},{recipient_name},[{recipient_niu}],[{recipient_rccm}],[{recipient_address}],[{recipient_phone}],[{recipient_email}],{is_recipient_taxable} recipient_type:1= Individual,2= Company.is_recipient_taxable:0= Non,1= Oui.
Exemple de REPLY (succès) :
1,2,John Doe,NIU67890,RCCM12345,123 Main St^x2c;New York,1234567890,john.doe@example.com,0
Exemple de REPLY (échec) :
0,err message41h — Get Original Items
À appeler de façon répétée pour parcourir les items de la facture d’origine jusqu’à épuisement.
- DATA : aucune
- REPLY :
{result},{designation},[{classification_code}],{type},{unit_price},{quantity},{discount_amount},{discount_type},{tax_rate},{subtotal},{net_amount},{tax_amount},{total_amount} result:0= échec,1= succès (un item suit),2= terminé (plus d’items).type:product|service.discount_type:fixed|percentage.tax_rate:T|R|E.
Exemples de REPLY :
1,apple,,product,99.99,1,5,fixed,T,99.99,94.99,10,104.99
2,finish
0,err messageBoucle : continuez d’appeler 41h tant que result = 1 ; arrêtez quand result = 2.
43h — Get Original Subtotal
- DATA : aucune
- REPLY : même structure que
33h({result},{subtotal},{total_tax_t_amount},…,{amount_due})
Codes de résultat
resultest le premier champ de chaque réponse :0= échec,1= succès.41hrenvoie en plus2= plus d’items (terminateur de boucle).- En cas d’échec, la réponse est typiquement
0,{reason}(ou0:{reason}pourC1h), ex.0,invoice no exist, ou0:No activation information(C1h). Montrezreasonà l’opérateur et arrêtez la transaction (ou annulez avecC9h). - Une erreur de CRC sur une réponse signifie une trame corrompue ou mal lue — écartez-la, puis renvoyez la commande (avec un nouveau
SEQ) ou resynchronisez en lisant jusqu’au prochainETX. - Aucune réponse (timeout) signifie que le dispositif est injoignable ou occupé — vérifiez le port, le câblage et les réglages série, puis confirmez avec
C1h. - Vérifiez toujours
resultavant d’envoyer la commande suivante de la transaction ; une étape en échec empêche la séquence de continuer.
Construction du QR code
Le QR code du reçu fiscal encode une URL de vérification :
QR content = verify_url + unescape(qrcode)verify_urlprovient de la réponse de statutC1h(ex.https://dev-pgsfec.akieni.tech/verify-invoice/).qrcodeprovient de la réponse de clôture38h(ex.?sign=...^amphmac=...).- Déséchappez le
qrcodeavant de l’ajouter (^amp;→&, ainsi que tout autre échappement), transformant?sign=5c0f...^amphmac=da27...en?sign=5c0f...&hmac=da27....
Bizarrerie de la spécification à gérer. L’exemple 38h du PDF écrit l’esperluette comme ^amp sans le ; final (...cf4d^amphmac=da27...), ce qui ne correspond pas au ^amp; de la table d’échappement. Un simple remplacement ^amp; → & ne touchera pas un ^amp nu ; par sécurité, remplacez à la fois ^amp; et un ^amp nu par &. Confirmez les octets exacts émis par votre dispositif.
Résultat après résolution de l’esperluette :
https://dev-pgsfec.akieni.tech/verify-invoice/?sign=5c0f97f79a323cf8ff9f112e05490f623bb26fd80c0f150e8ac69e9a5127cf4d&hmac=da27855ad5a41aca26fb8f746cc8bcbe8eba356f911944f63a21c593d44bfcfeEncodez cette chaîne sous forme de QR code sur le reçu imprimé.
Énumérations et codes
| Champ | Valeurs |
|---|---|
invoice_type | salesInvoice, creditNote |
recipient_type (data C3h) | individual, business, government, foreign (les exemples / C4h utilisent 1 = individual, 2 = company) |
is_recipient_taxable | 0 = Non, 1 = Oui |
type (item) | product, service |
discount_type | fixed, percentage |
tax_type / tax_rate | T = Tax T, R = Tax R, E = Exempt |
payment_method | cash, mobile_money, cheque, bank_transfer, card |
result | 0 = échec, 1 = succès (41h : 2 = plus d’items) |
Étape suivante → Exemple complet