Facturation électronique (lot 10, v1.19.0)
Le module Facturation électronique remplace l'application Serenity de déclaration des factures signées. Il vit dans l'intranet
(menu Facturation électronique, /invoicing), utilise ses sociétés, ses droits, ses notifications, son audit et son temps réel,
et il est conçu pour plusieurs pays : un modèle pivot unique (inspiré de la norme européenne EN 16931) et un pack par pays
qui sait valider, sérialiser, nommer et relire les documents de ce pays. La Tunisie (TEIF / El Fatoora / TTN) est le premier pack ;
l'Angola (AGT) est le suivant prévu.
1. Cycle de vie d'une facture
| État | Signification | Actions possibles |
|---|---|---|
| Brouillon | Saisie libre, pas de numéro | Modifier, aperçu, émettre, supprimer |
| Émise | Numéro légal attribué, contenu figé, XML non signé conservé | Signer et déposer, remettre en brouillon, annuler le numéro |
| Signée | XML signé par le cachet de la société (XAdES, TunTrust) | Déposer à nouveau, remettre en brouillon, annuler |
| Déposée | Remise à El Fatoora, en attente de validation | Actualiser (le suivi est automatique) |
| Acceptée | Validée par TTN : référence, date, QR, XML validé conservés | Imprimer, créer un avoir |
| Rejetée | Refusée par TTN (motif affiché et notifié) | Remettre en brouillon (même numéro), annuler |
| Annulée | Numéro annulé, conservé pour la continuité | — |
Règles :
- Numérotation continue par série et par année :
PRÉFIXE-AAAA-00001(préfixes et nombre de chiffres réglables ; séries séparées pour les factures et les avoirs). Le numéro n'est attribué qu'à l'émission ; une émission concurrente est rejouée automatiquement avec le numéro suivant (index unique en base). - Chronologie : une facture ne peut pas être datée avant la dernière facture émise de la même série.
- Une facture numérotée ne se supprime jamais : elle s'annule. Une facture acceptée ne s'annule pas : on émet un avoir (bouton Créer un avoir : brouillon qui reprend le client et les lignes, rattaché à la facture d'origine).
- Aperçu avant signature : l'écran montre exactement le document qui sera signé et liste les points bloquants (identité fiscale, format du matricule, dates, lignes, totaux, chronologie).
- Documents légaux : XML émis, XML signé, XML validé par TTN, stockés en base avec leur empreinte SHA-256 vérifiée à chaque
lecture (téléchargement :
/invoicing/{id}/document/unsigned|signed|cleared). - Suivi des dépôts : un service de fond consulte El Fatoora avec des délais croissants (20 s, 40 s, 1 min… jusqu'à 2 h) pendant au plus Invoicing.MaxPollDays jours ; l'émetteur est notifié de l'acceptation ou du rejet ; le bouton Actualiser force une consultation. Au-delà du délai, le suivi s'arrête (le bouton reste disponible).
2. Calculs
Fonction unique (InvoiceCalculator), partagée par l'écran (totaux en direct), le moteur et l'API :
- montant de ligne = quantité × prix unitaire − remise, arrondi à l'unité mineure de la devise (millime pour le dinar) ;
- taxe de ligne (FODEC ou autre) calculée sur le net, et incluse dans la base de TVA si la taxe le prévoit ;
- TVA regroupée par taux (l'ancienne application ne retenait que le taux de la première ligne) ;
- droit de timbre (montant fixe réglable, 1,000 TND par défaut), toujours déclaré, même à 0 ;
- retenue à la source facultative : n'entre pas dans le TTC, elle donne le net à payer ;
- montant en lettres (« MILLE SEPT CENT SIX DINARS ET HUIT CENT SOIXANTE MILLIMES ») conforme à celui des factures acceptées.
3. Tunisie : TEIF, signature, El Fatoora
Format : TEIF 1.8.8 (version réglable ; TTN annonce une 1.8.9). Codes utilisés, vérifiés sur 50 factures acceptées : en-tête I-01, facture I-11, dates I-31 / I-36 (période) / I-32 (échéance), vendeur I-62, acheteur I-64, références I-815 (RC), I-816 (forme juridique), I-81 (8 premiers caractères du matricule de l'acheteur), I-814 (code client), contacts I-94 et I-101 à I-104, paiement I-114 et I-142, TVA I-1602, timbre I-1601, montants de ligne I-183 / I-171, montants de facture I-179 à I-182 et I-176, taxes I-177 / I-178. À confirmer avec TTN ou le comptable : le code d'un avoir (I-12 par défaut, réglable dans les paramètres de la société) et le code du FODEC (à saisir dans la table des taxes).
Signature : service de signature XAdES existant (api/sign, api/check, en-tête X-API-Key), cachet TunTrust de la société
(cachet, rôle, PIN, identifiant client — chiffrés en base).
Dépôt : service SOAP El Fatoora (saveEfact, consultEfact), environnement de test par défaut
(https://test.elfatoora.tn/ElfatouraServices/EfactService). L'identifiant de dépôt est lu dans la réponse, la validation
dans consultEfact (référence TTN I-88, date I-37, QR ReferenceCEV).
4. Paramétrage
Administration → Paramètres → Facturation électronique (commun à toutes les sociétés) : adresse et clé du service de signature, adresses El Fatoora de test et de production, intervalle et durée du suivi.
Facturation électronique → Paramètres (par société, droit invoicing.manage) : activation, version du format, environnement
(test ou production), identité fiscale et coordonnées, compte El Fatoora, cachet, RIB et conditions de règlement, numérotation,
timbre, codes TEIF, pied de page, table des taxes (TVA 19 / 13 / 7 / 0 %, timbre, autres taxes de ligne) et diagnostic
(identité, cachet, connexion à El Fatoora).
Droits : invoicing.use (saisir, consulter), invoicing.issue (émettre, signer, déposer, rouvrir, annuler), invoicing.manage
(paramètres). À la mise à jour, les rôles qui administrent la société les reçoivent tous les trois.
5. API (api/v1/invoicing, jeton Bearer)
GET invoices, GET invoices/{id}, POST invoices?issue=true&submit=true (création ou mise à jour d'un brouillon, idempotente
par externalRef : un ERP peut rejouer sans doublon), POST invoices/{id}/issue|submit|refresh|reopen|cancel|credit-note,
DELETE invoices/{id}, GET invoices/{id}/documents/{kind}, GET invoices/{id}/print, GET|POST customers, GET|POST items,
GET taxes, GET counters.
6. Vérifications faites avant livraison
- Montant en lettres : 50 sur 50 identiques aux factures acceptées par TTN.
- Forme du XML TEIF (éléments, ordre, attributs, codes) reconstruit à partir des 50 factures : 50 sur 50 identique à ce que TTN a accepté (hors signature et bloc de validation ajoutés par TTN).
- Client SOAP contre un faux serveur : action SOAP, échappement des identifiants, dépôt, acceptation, rejet, attente.
- Lecture de l'accusé TTN (référence, date, QR).
- Service, service de fond et API compilés sans erreur ni avertissement ; tests
Lot10InvoicingTests. - Pages Razor compilées et essayées dans le navigateur le 01/10/2026 (base SQL Server vide, quatre onglets, client, article,
facture, aperçu, émission, documents, lien direct, arabe), après une relecture qui a conduit aux corrections suivantes :
- lien direct
/invoicing/<id>réutilisable (l'adresse est effacée une fois la facture ouverte), message si la facture est introuvable, liste et fiche relues au retour sur l'onglet Factures ; - éditeur : calcul sur les mêmes taxes que l'enregistrement (une taxe désactivée mais citée reste visible, marquée Inactif), client ou article retiré toujours affiché, montants relus sans les zéros de la base (2 et non 2,0000), case du timbre grisée si le timbre est désactivé pour la société, montant en lettres borné (au-delà de 999 milliards : en chiffres) ;
- documents légaux : un lien par document (et non par nature), taille localisée ; empreinte altérée → réponse 409 journalisée ;
- paramètres : version du format affichée dès l'ouverture, préfixes comparés après normalisation (« FA » / « fa » refusés), le diagnostic enregistre d'abord la fiche (il vérifie ce qui est à l'écran) ;
- suppression d'une taxe, d'un client ou d'un article déjà utilisés : le message dit « retiré », plus « supprimé » ;
- libellés « TVA » et « Ko » traduits, dates au format de la langue, liseré d'état et historique corrects en arabe.
- lien direct
Constats sur l'historique de l'ancienne application (à connaître pour la recette et pour votre comptable) :
- Dans 49 factures sur 50, le « Total TTC » déclaré (I-180) vaut 82 % de HT + TVA : une déduction de 18 % était appliquée sans apparaître. TTN ne contrôle pas l'arithmétique et a accepté ces factures. Le nouveau module déclare TTC = HT + taxes + timbre, et traite une éventuelle retenue à la source à part (net à payer).
- La TVA était arrondie au centime (303,790) ; elle est désormais calculée au millime (303,787).
- Le bloc acheteur portait le matricule du vendeur ; les désignations étaient doublement échappées (
l'eauvisible) ; les quantités s'écrivaient selon la culture du serveur (1,0). Tout cela est corrigé.
7. Recette conseillée (environnement de test TTN)
- Renseigner les paramètres généraux (service de signature) puis ceux de la société ; lancer le diagnostic : trois coches vertes.
- Créer un client (matricule réel de test), une facture de deux lignes à deux taux de TVA ; vérifier l'aperçu, émettre, signer et déposer.
- Attendre l'acceptation (notification), imprimer : référence et QR TTN présents ; télécharger les trois XML.
- Provoquer un rejet (matricule acheteur invalide) : motif affiché, remise en brouillon, correction, nouveau dépôt avec le même numéro.
- Créer un avoir sur la facture acceptée ; faire confirmer par TTN le code de document retenu.
- Passer en production société par société, après accord du comptable.
8. Suite prévue
- Lot 10-2 : reprise de l'historique Serenity (XML signés et validés, déchiffrés avec l'ancienne clé AES).
- Pack Angola (AGT) pour SOFTIC INTERNATIONAL, sur le même modèle pivot.