Module Factur-X TBNETSYS: Difference between revisions

From Dolibarr ERP CRM Wiki
Jump to navigation Jump to search
(ajout capture écran)
 
(3 intermediate revisions by one other user not shown)
Line 1: Line 1:
[[File:Dispatch pdp.png|alt=Dispatch PDP|thumb|Dispatch PDP]]
[[File:Dispatch pdp.png|alt=Dispatch PDP|thumb|Dispatch PDP]]
=facturxtbnetsys=
Plugin Dolibarr de '''TBNETSYS''' qui régénère chaque facture client au format '''Factur-X'''<span> </span>: un PDF/A-3 avec un XML EN16931 (CII) embarqué, selon les spécifications françaises FNFE (profil EN16931 / Comfort).
Le plugin dispose d'une aide intégrée.
Deux backends de génération PDF interchangeables, sélectionnables dans l'onglet Paramétrage section « Pipeline PDF »<span> </span>:
*'''horstoeko/PDF/A-3B portable''' ''(défaut)''. Sous-processus PHP CLI utilisant la librairie <code>horstoeko/zugferd</code> embarquée dans <code>vendor/</code>. '''Aucune dépendance système''' hors php-cli. Validation FNFE/PDP strictement identique au mode 3U. Fonctionne tel quel sur tout hébergement Dolibarr, y compris mutualisé.
*'''Mustang/PDF/A-3U strict'''. Pipeline historique Ghostscript + Mustang CLI. Recommandé pour archivage légal long terme (extractibilité Unicode garantie). Nécessite Ghostscript, Java JRE, Mustang JAR et le profil ICC sRGB sur le serveur (cf. § Installation des prérequis système). À choisir explicitement dans l'onglet Paramétrage.
Le mode par défaut horstoeko ne nécessite que l'extension PHP <code>simplexml</code> côté CLI (généralement présente). Si votre <code>/usr/bin/php</code> ne l'a pas, pointer la constante <code>FACTURXTBNETSYS_PHP_BIN</code> vers une version qui l'inclut (par exemple <code>/usr/bin/php8.4</code>).
Côté pilotage de la transmission, le plugin fournit une page '''Dispatch PDP''' qui liste les factures candidates avec leur statut local (SIREN vendeur/acheteur, PDF Factur-X présent) et leur statut côté plateforme (conformité, transmission). Deux actions en série sont proposées avec '''popup de progression en temps réel'''<span> </span>:
*'''« Vérifier la sélection »'''. Interroge SUPERPDP pour chaque facture cochée (validation Factur-X + statut transmission). Compteurs colorés (conformes / non conformes / transmises / en cours / en échec / jamais transmises) et journal détaillé par facture.
*'''« Envoyer au PDP la sélection »'''. Envoie effectivement chaque facture éligible vers SUPERPDP (avec confirmation préalable). Compteurs envoyées / ignorées / en erreur ; les factures déjà transmises ou non éligibles sont automatiquement ignorées.
Dans les deux cas, la popup affiche une barre d'avancement, le numéro de la facture en cours, et un bouton d'annulation. Les résultats sont persistés au fur et à mesure<span> </span>: vous pouvez fermer la popup à mi-parcours et reprendre plus tard sans perdre ce qui a déjà été traité, ce qui rend le contrôle et l'envoi de gros stocks (centaines voire milliers de factures) confortables et résistants aux timeouts.
__TOC__
==Compatibilité==
{| class="wikitable"
!Composant!!Version requise
|-
|Dolibarr||22.0.3 ou supérieur
|-
|PHP||8.2 minimum (8.4 recommandé)
|-
|Système d'exploitation cible||Debian 13 (les commandes ci-dessous sont prévues pour Debian/Ubuntu)
|-
|Multi-entité (Multicompany)||Pris en charge. Toutes les requêtes filtrent par <code>entity</code> (<code>getEntity('invoice')</code> / <code>getEntity('bank_account')</code>) et la table de cache PDP <code>llx_facturxtbnetsys_pdp_check</code> porte une colonne <code>entity</code> avec index unique <code>(fk_facture, entity)</code>, ce qui isole les données par société sans collision.
|}
Sur d'autres distributions (RedHat, Alpine, etc.) le principe reste identique mais les noms de paquets et le gestionnaire (<code>dnf</code>, <code>apk</code>…) changent ; adapter en conséquence.
----
==Choix du moteur PDF. Mustang ou horstoeko ?==
Le plugin propose '''deux moteurs PDF interchangeables''' au choix de l'utilisateur, sélectionnables dans l'onglet ''Paramétrage'' après installation. Le mode '''horstoeko (PDF/A-3B portable)''' est le '''défaut depuis la version 1.1.0'''<span> </span>: il fonctionne sans aucune dépendance système et couvre la quasi-totalité des cas d'usage. Le mode Mustang reste disponible pour les utilisateurs qui ont besoin d'un archivage légal PDF/A-3U strict avec extractibilité Unicode garantie ; il s'active explicitement dans l'onglet Paramétrage. Avant de poursuivre, choisissez celui qui correspond à votre environnement et à vos contraintes<span> </span>: la suite du README s'organise autour de ce choix.
===Arbre de décision===
{| class="wikitable"
!Question!!Réponse → Mode à choisir
|-
|'''Votre archivage légal exige-t-il l'extractibilité Unicode du texte (PDF/A-3U strict) ?'''||Non → '''horstoeko''' (défaut, rien à configurer)
|-
|Si oui<span> </span>: avez-vous un accès terminal au serveur avec privilèges sudo ou root ?||Oui → '''Mustang''' recommandé (extractibilité Unicode garantie)
|-
|Sinon (pas d'accès root)<span> </span>:||'''horstoeko''' reste le seul choix possible. Mustang nécessite root pour installer Ghostscript / Java / Mustang JAR
|}
===Comparatif détaillé===
{| class="wikitable"
!Critère!!Mode '''Mustang''' (PDF/A-3U strict)!!Mode '''horstoeko''' (PDF/A-3B portable)
|-
|'''Niveau PDF/A'''||3U. Extractibilité Unicode garantie (archivage légal long terme, accessibilité, indexation, recherche plein texte)||3B. Apparence fidèle, validité format Factur-X, archivage acceptable mais sans garantie d'extractibilité Unicode
|-
|'''Validation FNFE / PDP'''||✓ 0 erreur sur les 189 contrôles XSD CII + EN16931 + BR-FR-CTC-Flux2||✓ 0 erreur sur les '''mêmes''' 189 contrôles (validation strictement identique côté SUPERPDP)
|-
|'''XML CII embarqué'''||Identique (généré par le builder du module)||Identique (généré par le builder du module)
|-
|'''Accès terminal serveur requis'''||'''Oui. Sudo ou root indispensable''' pour installer Ghostscript, Java JRE, Mustang JAR, profil ICC sRGB||'''Non. Aucune installation système'''. Le module fonctionne tel quel via PHP CLI
|-
|'''Hébergement mutualisé / instance managée sans SSH'''||❌ Inadapté||✓ Pleinement supporté
|-
|'''Empreinte serveur'''||~50 Mo (Java + Mustang) en plus des paquets système habituels||~27 Mo de <code>vendor/</code> Composer embarqués dans le module
|-
|'''Robustesse face à un PDF source quelconque'''||Ghostscript ré-encode entièrement le PDF en PDF/A-3 valide, quel que soit le PDF source. Aucune contrainte sur les polices ou les modèles utilisés par Dolibarr ou par d'autres modules||Repose sur le PDF source produit par Dolibarr (modèle « crabe » par défaut). Couvre les cas standards, mais un PDF source produit par un modèle tiers exotique peut donner un PDF/A-3B moins propre
|-
|'''Validation Schematron au niveau pipeline local'''||Oui (Mustang valide XSD + règles métier FNFE en local)||Validation locale par horstoeko/zugferd côté XML uniquement ; la validation Schematron complète est faite côté SUPERPDP via <code>validation_reports</code>
|}
===Les deux modes peuvent coexister===
Le choix est fait par une simple constante dans Dolibarr (<code>FACTURXTBNETSYS_PDF_ENGINE</code>). Vous pouvez<span> </span>:
*'''Démarrer en horstoeko''' (défaut, sans rien configurer) pour valider le plugin sans toucher au système (test, validation fonctionnelle)
*'''Basculer vers Mustang''' plus tard si vos exigences d'archivage évoluent. La bascule est instantanée, sans régénérer les anciennes factures
*'''Inversement, dégrader vers horstoeko''' si une migration vers un hébergement mutualisé devient nécessaire
Aucun re-traitement des factures déjà générées n'est requis lors d'un changement de mode<span> </span>: les anciennes factures restent valides, seules les nouvelles seront générées avec le moteur courant.
----
==Installation des prérequis système. ''Mode Mustang uniquement''==
<blockquote>'''Vous avez choisi le mode horstoeko ?''' Sautez cette section et passez directement à [[#Mode horstoeko. Aucun prérequis système]].</blockquote>
Cette section est conçue pour un utilisateur '''non administrateur système''' mais disposant tout de même d'un '''accès terminal avec privilèges sudo ou root'''. Sans cet accès, le mode Mustang n'est pas installable. Basculer sur le mode horstoeko. Chaque étape est expliquée<span> </span>: à quoi sert l'outil, comment l'installer, comment vérifier qu'il est correctement en place. Suivre les blocs dans l'ordre.
===Conventions===
*Toutes les commandes doivent être exécutées '''avec les droits root''' sur le serveur Dolibarr. Si vous n'êtes pas connecté en root, préfixer chaque commande par <code>sudo</code> (par exemple <code>sudo apt install …</code>).
*<code>www-data</code> est l'utilisateur Linux sous lequel le serveur web (Apache/Nginx) exécute Dolibarr. Lorsqu'une commande doit être lancée en tant que <code>www-data</code>, c'est explicitement indiqué.
*<code>#</code> au début d'une ligne signifie « commentaire, ne pas taper ».
*Toujours '''copier-coller''' les commandes<span> </span>: un caractère manquant ou un tiret recopié à la main peut casser l'installation.
===Étape 1. Mettre à jour la liste des paquets===
Avant d'installer quoi que ce soit, on rafraîchit l'index du gestionnaire de paquets pour récupérer les versions les plus récentes.
<syntaxhighlight lang="bash">
apt update
</syntaxhighlight>
Cette commande ne modifie rien sur le système<span> </span>: elle se contente de télécharger la liste des paquets disponibles. Elle peut afficher quelques avertissements (<code>Different settings for HTTP/HTTPS</code>), c'est normal.
===Étape 2. Installer Ghostscript===
'''À quoi ça sert'''<span> </span>: Ghostscript (commande <code>gs</code>) est l'outil qui convertit le PDF généré par Dolibarr en '''PDF/A-3''', le format obligatoire pour qu'un Factur-X soit valide. Sans lui, le PDF n'est pas conforme et le destinataire le rejettera.
<syntaxhighlight lang="bash">
apt install -y ghostscript
</syntaxhighlight>
L'option <code>-y</code> accepte automatiquement les questions « voulez-vous continuer ? » que pose <code>apt</code>.
'''Vérification'''<span> </span>:
<syntaxhighlight lang="bash">
gs --version
</syntaxhighlight>
Doit afficher un numéro de version (par ex. <code>10.03.1</code>). Si la commande renvoie <code>command not found</code>, l'installation a échoué. Relire les messages d'erreur d'<code>apt install</code>.
===Étape 3. Installer Java (JRE)===
'''À quoi ça sert'''<span> </span>: Mustang (étape suivante) est un programme écrit en Java. Pour pouvoir l'exécuter, il faut une JVM (machine virtuelle Java) installée sur le serveur. On installe le '''JDK headless''' (sans interface graphique, suffisant pour un serveur).
<syntaxhighlight lang="bash">
apt install -y default-jre default-jdk-headless
</syntaxhighlight>
<code>default-jre</code> (Java Runtime Environment) suffirait pour exécuter un programme, mais <code>default-jdk-headless</code> garantit que tous les outils annexes (notamment ceux utilisés par Mustang à l'initialisation) soient disponibles. Les deux paquets ne se contredisent pas.
'''Vérification'''<span> </span>:
<syntaxhighlight lang="bash">
java -version
</syntaxhighlight>
Doit afficher quelque chose comme <code>openjdk version "17.0.x"</code>. La sortie part '''par défaut sur la sortie d'erreur''', c'est normal. Le résultat reste lisible à l'écran.
===Étape 4. Télécharger Mustang CLI===
'''À quoi ça sert'''<span> </span>: Mustang est l'outil qui prend le PDF/A-3 fabriqué à l'étape 2 et le XML EN16931 généré par le plugin, puis les fusionne en un véritable PDF Factur-X (avec les bonnes métadonnées XMP, le nom canonique <code>factur-x.xml</code> du fichier embarqué, etc.). Le plugin appelle Mustang en arrière-plan à chaque régénération de facture.
Mustang n'est pas distribué via <code>apt</code>. Il faut télécharger le <code>.jar</code> (un programme Java empaqueté) depuis sa page officielle GitHub et le placer à un endroit fixe. Le plugin cherche par défaut le fichier dans <code>/opt/Mustang-CLI-2.22.0.jar</code>.
<syntaxhighlight lang="bash">
# Se positionner dans /opt (répertoire conventionnel pour les logiciels tiers)
cd /opt
# Télécharger la version 2.22.0 (testée et validée avec ce plugin)
wget github.com/ZUGFeRD/mustangproject/releases/download/core-2.22.0/Mustang-CLI-2.22.0.jar
</syntaxhighlight>
<code>wget</code> est un téléchargeur en ligne de commande. S'il n'est pas installé, l'ajouter avec <code>apt install -y wget</code>. La commande crée le fichier <code>/opt/Mustang-CLI-2.22.0.jar</code> (~30 Mo).
'''Vérification'''<span> </span>:
<syntaxhighlight lang="bash">
ls -l /opt/Mustang-CLI-2.22.0.jar
</syntaxhighlight>
Doit afficher une ligne avec une taille d'environ 30 Mo. Si le fichier est plus petit (quelques Ko), le téléchargement a échoué. Supprimer le fichier (<code>rm /opt/Mustang-CLI-2.22.0.jar</code>) et recommencer.
'''Si vous voulez utiliser une autre version de Mustang''' (par ex. une plus récente), saisissez le nouveau chemin dans la page '''Configuration > Modules > FacturX > Paramétrage''' de Dolibarr, section « Chemins des utilitaires système » (champ « Mustang CLI (.jar) »).
===Étape 5. Vérifier la présence du profil ICC sRGB===
'''À quoi ça sert'''<span> </span>: un PDF/A-3 doit déclarer un '''profil colorimétrique de référence''' (le profil ICC). Le plugin utilise sRGB par défaut, le plus standard. Ce profil est généralement présent par défaut sur Debian via le paquet <code>icc-profiles-free</code>.
<syntaxhighlight lang="bash">
ls -l /usr/share/color/icc/sRGB.icc
</syntaxhighlight>
*Si le fichier existe<span> </span>: rien à faire.
*Si le fichier est absent (<code>No such file or directory</code>)<span> </span>:
<syntaxhighlight lang="bash">
apt install -y icc-profiles-free
</syntaxhighlight>
Sur certaines distributions, le paquet peut s'appeler différemment (<code>icc-profiles</code>). Si vraiment introuvable, le plugin accepte un chemin alternatif modifiable dans '''Configuration > Modules > FacturX > Paramétrage''', section « Chemins des utilitaires système » (champ « Profil ICC sRGB »).
===Étape 6. Installer les paquets PHP utilisés par Dolibarr===
'''À quoi ça sert'''<span> </span>: Dolibarr et le plugin s'appuient sur quelques bibliothèques PHP pour manipuler les PDF (TCPDF, FPDI), pour parser des PDF lus (Poppler), et pour quelques utilitaires bas niveau (binutils).
<syntaxhighlight lang="bash">
apt install -y binutils php-tcpdf php-fpdi poppler-utils
</syntaxhighlight>
Détail rapide<span> </span>:
{| class="wikitable"
!Paquet!!Utilité
|-
|<code>binutils</code>||Outils binaires bas niveau utilisés par certaines libs
|-
|<code>php-tcpdf</code>||Génération PDF côté Dolibarr
|-
|<code>php-fpdi</code>||Lecture/import de PDF existants
|-
|<code>poppler-utils</code>||Outils annexes (<code>pdfinfo</code>, <code>pdftotext</code>)
|}
'''Vérification'''<span> </span>:
<syntaxhighlight lang="bash">
gs --version && java -version
</syntaxhighlight>
Si les deux commandes répondent, les briques principales sont en place.
----
==Mode horstoeko. Aucun prérequis système==
<blockquote>'''Vous avez choisi le mode Mustang ?''' Cette section ne vous concerne pas, passer à [[#Installation du plugin]].</blockquote>
Le mode horstoeko/PDF/A-3B fonctionne avec un '''PHP CLI''' disposant de l'extension '''SimpleXML'''. Sur l'écrasante majorité des hébergements Dolibarr, c'est déjà le cas. Vous n'avez donc '''aucune installation à effectuer côté système'''.
===Vérification rapide depuis votre Dolibarr===
Si vous avez accès au serveur en SSH (même sans sudo), vérifier que PHP CLI a SimpleXML<span> </span>:
<syntaxhighlight lang="bash">
php -r 'echo extension_loaded("simplexml") ? "OK\n" : "ABSENT\n";'
</syntaxhighlight>
Si vous obtenez <code>OK</code>, vous êtes prêt. Le plugin fonctionnera tel quel. Il suffit de [[#Installation du plugin|l'installer]] puis de sélectionner le mode horstoeko dans le paramétrage.
===Si vous n'avez pas du tout accès au shell===
Sur certains hébergements mutualisés, vous n'avez accès qu'au panel d'administration et à un éditeur de fichiers via FTP/SFTP. Dans ce cas<span> </span>:
#[[#Installation du plugin|Installez le plugin]] en uploadant son répertoire dans <code>custom/</code>
#Activez-le dans Dolibarr
#Allez dans '''Diagnostic'''<span> </span>: la page vérifiera '''automatiquement''' que le PHP CLI cible (via la constante <code>FACTURXTBNETSYS_PHP_BIN</code>) a bien SimpleXML
#Si SimpleXML manque côté CLI, le diagnostic vous l'indiquera<span> </span>: il faudra alors demander à votre hébergeur d'activer l'extension <code>simplexml</code> ou de pointer le plugin sur une autre version de PHP CLI qui l'inclut
===Vendor Composer fourni dans le plugin===
La bibliothèque <code>horstoeko/zugferd</code> et ses dépendances sont '''embarquées dans le plugin''' au moment de la distribution (répertoire <code>vendor/</code>). Aucune installation Composer n'est nécessaire côté serveur cible. Si vous compilez le plugin depuis les sources, exécuter <code>composer install --no-dev --optimize-autoloader</code> à la racine du module avant déploiement.
----
==Installation du plugin==
Cette étape est commune aux deux modes. Une fois les prérequis correspondant à votre choix de mode validés<span> </span>:
#Copier le répertoire <code>facturxtbnetsys/</code> dans le dossier <code>custom/</code> de Dolibarr<span> </span>:
#:<syntaxhighlight lang="bash">
cp -r facturxtbnetsys /var/www/dolibarr/htdocs/custom/
chown -R www-data:www-data /var/www/dolibarr/htdocs/custom/facturxtbnetsys
</syntaxhighlight>
#Activer le module dans Dolibarr<span> </span>: '''Accueil > Configuration > Modules > Onglet "Facturation/Comptabilité"''' → activer '''FacturXTbnetsys'''.
#Créer le fichier <code>.secret</code> '''hors de la racine web''' (à côté de <code>htdocs/</code>, ou dans un répertoire dédié aux secrets) et y renseigner les identifiants de connexion à votre PDP, puis indiquer son chemin absolu à Dolibarr dans l'onglet Paramétrage (voir la sous-section [[#Configuration du fichier .secret (credentials PDP)|Configuration du fichier .secret]] ci-dessous).
#Vérifier la santé de l'installation<span> </span>: '''Configuration > Modules > FacturX > onglet Diagnostic'''. La page liste les vérifications avec un code couleur (le contenu varie selon le backend PDF sélectionné) ; toutes doivent être au vert (à l'exception éventuelle de <code>.secret</code> qui peut être marqué « optionnel » tant que vous n'avez pas finalisé la configuration PDP).
===Configuration du fichier .secret (credentials PDP)===
Le plugin se connecte à votre Plateforme de Dématérialisation Partenaire (PDP) (par défaut '''SUPERPDP''') via OAuth2 (flux <code>client_credentials</code>). Vos identifiants OAuth2 sont stockés dans un fichier <code>.secret</code>, lu uniquement côté serveur.
<blockquote>'''Sans <code>.secret</code>, le plugin reste fonctionnel'''<span> </span>: la régénération Factur-X (PDF/A-3 + XML EN16931) continue de fonctionner. Seul l'envoi automatique vers la PDP est désactivé. Le diagnostic affiche alors <code>.secret</code> en orange « optionnel ».</blockquote>
'''Emplacement recommandé. Hors de la racine web'''
Le fichier <code>.secret</code> doit être placé '''en dehors du dossier <code>htdocs/</code>''' (la racine web servie par Apache / Nginx) afin qu'il ne puisse jamais être servi par le serveur HTTP en cas de mauvaise configuration ou de bug. Sur une installation type <code>/var/www/dolibarr/htdocs/</code>, placez-le par exemple<span> </span>:
{| class="wikitable"
!Emplacement!!Recommandation
|-
|<code>/var/www/dolibarr/.secret</code>||'''Recommandé'''. Au même niveau d'arborescence que <code>htdocs/</code>, donc inaccessible via HTTP par construction
|-
|<code>/etc/dolibarr-secrets/pdp.secret</code>||'''Recommandé'''. Répertoire système dédié aux secrets, idéal pour gérer plusieurs environnements (<code>pdp-prod.secret</code>, <code>pdp-sandbox.secret</code>)
|-
|<code>/var/www/dolibarr/htdocs/custom/facturxtbnetsys/.secret</code>||'''À éviter'''. Fonctionne (chemin par défaut codé), mais place le fichier sous la racine web<span> </span>: tout problème de configuration serveur peut l'exposer en clair
|}
Une fois le fichier créé, son chemin absolu doit être renseigné dans '''Configuration > Modules > FacturX > onglet Paramétrage''', section '''API PDP''', champ '''Chemin du fichier <code>.secret</code>'''. Tant que cette constante n'est pas renseignée, le plugin retombe sur le défaut codé (chemin sous la racine web), ce qui n'est pas l'emplacement souhaitable.
'''Obtention des identifiants'''<span> </span>: récupérer <code>client_id</code> et <code>client_secret</code> depuis l'espace administrateur de votre PDP. Pour SUPERPDP, l'endpoint d'authentification utilisé par le plugin est <code>api.superpdp.tech/oauth2/token</code>.
'''Format attendu'''. Fichier texte, une clé par ligne, valeur entre guillemets droits (les guillemets sont optionnels). Les lignes vides et celles commençant par <code>#</code> sont ignorées<span> </span>:
<pre>
# Credentials OAuth2 SUPERPDP. NE PAS COMMITER
client_id="votre-client-id-fourni-par-la-pdp"
client_secret="votre-client-secret-fourni-par-la-pdp"
</pre>
'''Création et droits Unix'''. Le plugin fournit un modèle <code>.secret.example</code> à la racine du plugin. Copiez-le '''hors de la racine web''' puis complétez-le<span> </span>:
<syntaxhighlight lang="bash">
# Copier le modele HORS de la racine web (exemple : au meme niveau que htdocs/)
cp /var/www/dolibarr/htdocs/custom/facturxtbnetsys/.secret.example /var/www/dolibarr/.secret
# Renseigner client_id et client_secret avec votre editeur favori
nano /var/www/dolibarr/.secret
# Restreindre les droits (lecture/ecriture par www-data uniquement)
chmod 600 /var/www/dolibarr/.secret
chown www-data:www-data /var/www/dolibarr/.secret
</syntaxhighlight>
Puis, dans Dolibarr<span> </span>: '''Configuration > Modules > FacturX > Paramétrage > API PDP > Chemin du fichier <code>.secret</code>''' → saisir <code>/var/www/dolibarr/.secret</code> (adapter à votre installation) et enregistrer.
'''Précautions de sécurité'''<span> </span>:
*'''Placer <code>.secret</code> hors de la racine web''' (cf. tableau ci-dessus)<span> </span>: c'est la garantie la plus solide qu'il ne sera jamais servi en HTTP.
*'''Ne jamais committer <code>.secret</code>''' dans un dépôt git (ajouter <code>.secret</code> au <code>.gitignore</code> du plugin si vous forkez le code).
*'''Ne jamais transmettre le fichier par email/messagerie''' en clair.
*En cas de fuite suspectée, '''révoquer immédiatement le <code>client_secret</code>''' depuis l'admin de la PDP et en générer un nouveau.
*Le fichier doit appartenir à <code>www-data</code> et être en <code>0600</code><span> </span>: aucun autre utilisateur Unix de la machine ne doit pouvoir le lire.
'''Vérification'''. Après création, ouvrir '''Configuration > Modules > FacturX > Diagnostic'''<span> </span>:
{| class="wikitable"
!Ligne diagnostic!!État attendu
|-
|<code>.secret</code>||'''OK''' (vert). Fichier présent et <code>client_id</code> / <code>client_secret</code> non vides
|-
|<code>api.superpdp.tech</code>||'''OK''' (vert). Un Bearer token a été obtenu avec succès
|}
Si <code>.secret</code> ressort « KO » (rouge), le fichier existe mais une des deux clés est absente ou mal formée. Relire le format ci-dessus. Si <code>api.superpdp.tech</code> ressort en erreur, les identifiants sont rejetés par la PDP<span> </span>: vérifier qu'ils sont corrects et actifs côté admin de la plateforme. Les détails de l'erreur sont tracés dans le journal Dolibarr (<code>Accueil > Configuration > Outils > Journaux</code>, préfixe <code>FACTURXTBNETSYS</code>).
===Sélection du moteur PDF dans Dolibarr===
Une fois le module activé, aller dans '''Configuration > Modules > FacturX > onglet Paramétrage'''. La section '''« Pipeline PDF »''' propose un radio à deux choix<span> </span>:
*'''horstoeko/zugferd / PDF/A-3B portable'''. Choix par défaut depuis la version 1.1.0. Aucun prérequis système. Sous le radio, un champ '''« Binaire php-cli »''' permet de pointer vers la version de PHP utilisée par le sous-processus (par défaut <code>/usr/bin/php</code>). Si votre <code>/usr/bin/php</code> ne dispose pas de l'extension SimpleXML, indiquer ici une version qui l'inclut, par exemple <code>/usr/bin/php8.4</code>.
*'''Mustang / PDF/A-3U strict'''. Choix optionnel pour archivage légal long terme. Nécessite que la procédure [[#Installation des prérequis système. Mode Mustang uniquement|Installation des prérequis système]] ait été suivie au préalable.
Sélectionner le mode souhaité, sauvegarder, puis ouvrir l'onglet '''Diagnostic''' pour vérifier que toutes les briques nécessaires au mode choisi sont au vert. Le contenu de cette page s'adapte automatiquement au mode sélectionné. Vous ne verrez les checks Ghostscript/Java/Mustang qu'en mode Mustang, et les checks PHP CLI/SimpleXML/Composer vendor qu'en mode horstoeko.
----
==Vérification finale en une commande==
===Mode Mustang===
Pour vérifier en bloc tous les prérequis Mustang depuis la ligne de commande<span> </span>:
<syntaxhighlight lang="bash">
echo "=== Ghostscript ===" && gs --version && \
echo "=== Java ===" && java -version 2>&1 && \
echo "=== Mustang JAR ===" && ls -l /opt/Mustang-CLI-2.22.0.jar && \
echo "=== ICC sRGB ===" && ls -l /usr/share/color/icc/sRGB.icc && \
echo "=== Tout est OK ==="
</syntaxhighlight>
Si la dernière ligne <code>=== Tout est OK ===</code> s'affiche, l'installation système est complète. Sinon, l'erreur juste avant indique précisément ce qui manque.
===Mode horstoeko===
<syntaxhighlight lang="bash">
echo "=== PHP CLI ===" && php -v | head -1 && \
echo "=== SimpleXML ===" && php -r 'echo extension_loaded("simplexml") ? "OK" : "ABSENT", PHP_EOL;' && \
echo "=== vendor ===" && ls -d /var/www/dolibarr/htdocs/custom/facturxtbnetsys/vendor/horstoeko/zugferd && \
echo "=== Tout est OK ==="
</syntaxhighlight>
Si vous avez configuré une version PHP CLI spécifique (ex. <code>/usr/bin/php8.4</code>), remplacer <code>php</code> par ce binaire dans les deux premières lignes.
----
==Pièges fréquents==
===Mode Mustang===
{| class="wikitable"
!Symptôme!!Cause probable!!Solution
|-
|<code>gs: command not found</code> lors de la régénération||Ghostscript pas installé ou pas dans le <code>PATH</code> du serveur web||Re-vérifier l'étape 2. Au besoin, renseigner le chemin absolu dans '''Configuration > Modules > FacturX > Paramétrage''', champ « Binaire Ghostscript »
|-
|<code>Mustang JAR introuvable/illisible</code>||Le fichier n'est pas à <code>/opt/Mustang-CLI-2.22.0.jar</code>, ou pas lisible par <code>www-data</code>||<code>chmod +r /opt/Mustang-CLI-2.22.0.jar</code> ou ajuster le chemin dans '''Configuration > Modules > FacturX > Paramétrage''', champ « Mustang CLI (.jar) »
|-
|<code>java: command not found</code>||JRE non installé||Re-vérifier l'étape 3
|-
|Erreur PDF/A-3 « no ICC profile »||Le profil sRGB n'est pas trouvé||Re-vérifier l'étape 5, ajuster le chemin dans '''Configuration > Modules > FacturX > Paramétrage''', champ « Profil ICC sRGB » si nécessaire
|}
===Mode horstoeko===
{| class="wikitable"
!Symptôme!!Cause probable!!Solution
|-
|<code>vendor/autoload.php introuvable</code> dans le journal||Le <code>vendor/</code> Composer n'a pas été déployé avec le plugin||Réinstaller le plugin depuis l'archive officielle (qui inclut <code>vendor/</code>) ou exécuter <code>composer install --no-dev --optimize-autoloader</code> à la racine du module
|-
|<code>Binaire php-cli introuvable ou non exécutable</code>||La constante <code>FACTURXTBNETSYS_PHP_BIN</code> pointe sur un chemin invalide||Ajuster dans '''Paramétrage > Pipeline PDF > Binaire php-cli''' (ex. <code>/usr/bin/php8.4</code>)
|-
|<code>extension SimpleXML absente</code> (badge KO dans Diagnostic)||La version de PHP CLI désignée n'a pas l'extension <code>simplexml</code>||Pointer la constante <code>FACTURXTBNETSYS_PHP_BIN</code> sur une autre version de PHP CLI qui inclut SimpleXML, ou demander à l'hébergeur d'activer l'extension côté CLI
|-
|<code>Sous-processus horstoeko a échoué (rc=…)</code>||Erreur dans la lib horstoeko/zugferd ; le PDF source produit par Dolibarr peut être atypique||Consulter le journal Dolibarr (préfixe <code>FACTURXTBNETSYS</code>) ; en dernier recours, basculer temporairement sur le mode Mustang pour identifier si le PDF source est en cause
|}
===Communs aux deux modes===
{| class="wikitable"
!Symptôme!!Cause probable!!Solution
|-
|<code>proc_open() has been disabled</code> dans le syslog||Le serveur (souvent un VPS mutualisé) interdit l'exécution de processus externes||Demander à l'hébergeur d'autoriser <code>proc_open</code> dans <code>php.ini</code> (<code>disable_functions</code>). '''Les deux modes''' utilisent <code>proc_open</code> (Mustang pour Ghostscript+Java, horstoeko pour le sous-processus PHP). Le plugin '''ne peut pas fonctionner sans'''
|-
|Page Diagnostic affiche tout en vert mais erreur à l'usage||Cache OPcache PHP||Redémarrer Apache/Nginx (<code>systemctl reload apache2</code>)
|}
----
==Catégories TVA. Comment le plugin classe vos factures==
À chaque régénération de facture, le plugin détermine '''automatiquement''' le régime TVA applicable à chaque ligne et le code d'exonération correspondant exigé par la norme européenne EN16931. '''Vous n'avez rien à paramétrer'''<span> </span>: tout est déduit de la configuration de votre société, du pays du client et des taux de TVA de la facture.
Cette section explique ce que produit le plugin et dans quels cas, pour que vous puissiez vérifier que cela correspond bien à votre situation fiscale.
===Les 6 cas reconnus (du plus prioritaire au moins prioritaire)===
Pour chaque ligne, le plugin parcourt la liste suivante de haut en bas et s'arrête à la première règle qui s'applique.
====1. Vous êtes en franchise en base de TVA (micro-entreprise)====
'''Condition'''<span> </span>: dans Dolibarr, '''Accueil > Configuration > Société > « Assujetti à la TVA » = Non'''.
→ Toutes les lignes de toutes vos factures sont marquées « hors champ TVA » avec la mention légale '''« TVA non applicable, art. 293 B du CGI »''' ajoutée automatiquement dans le document (factures '''et''' avoirs).
<blockquote>Cette règle est prioritaire<span> </span>: si vous êtes en franchise, le plugin ne tient compte ni des taux, ni du pays du client, ni des lignes de débours. Tout sort en franchise.</blockquote>
====2. La ligne est un débours (refacturation à l'identique d'un frais)====
'''Condition'''<span> </span>: la ligne a été saisie via le plugin '''debourstbnetsys''' (refacturation à l'identique au client d'un frais que vous avez avancé pour son compte).
→ La ligne est marquée « exonérée » avec la justification '''art. 267 II 2° CGI''' (les débours sont par nature hors champ de la TVA, indépendamment du pays du client).
====3. La ligne porte un taux de TVA standard====
'''Condition'''<span> </span>: la ligne a un taux de TVA strictement supérieur à 0 % (5,5 %, 10 %, 20 %, etc.).
→ La ligne est marquée « TVA au taux standard », sans code d'exonération. C'est le cas le plus courant.
====4. Vous facturez un client professionnel établi dans l'Union européenne====
'''Condition'''<span> </span>: le taux est à 0 %, le client est dans un pays UE différent de la France, et '''son numéro de TVA intracommunautaire est renseigné''' dans sa fiche tiers.
→ La ligne est marquée « livraison intracommunautaire » avec autoliquidation par l'acheteur (art. 196 de la directive 2006/112/CE). Vous devrez également mentionner manuellement « Autoliquidation » sur la facture (voir « À savoir » ci-dessous).
====5. Vous facturez un client hors Union européenne====
'''Condition'''<span> </span>: le taux est à 0 % et le client est dans un pays hors UE.
→ La ligne est marquée « export », exonérée au titre de l'''''art. 262 I du CGI'''.''
====6. Tous les autres cas avec un taux à 0 %====
'''Condition'''<span> </span>: taux à 0 %, client en France ou client UE sans numéro de TVA intracommunautaire (cas typique<span> </span>: particulier européen).
→ La ligne est marquée « exonérée » avec la justification française par défaut.
===À savoir avant de mettre en service===
*'''Numéro de TVA intracommunautaire indispensable pour vos clients UE professionnels.''' Si vous facturez un client allemand, italien, espagnol, etc. sans avoir renseigné son n° TVA intra dans Dolibarr, le plugin considérera qu'il s'agit d'un particulier (cas n° 6) au lieu d'une livraison intracommunautaire (cas n° 4). Pensez à compléter la fiche tiers avant la première facture.
*'''Mention « Autoliquidation » à ajouter manuellement.''' Pour les factures intracommunautaires (cas n° 4), la réglementation impose que la facture mentionne explicitement « Autoliquidation ». Le plugin ne l'ajoute pas automatiquement pour l'instant<span> </span>: pensez à le faire dans le libellé de votre facture.
*'''Vérifiez votre statut TVA si vous êtes micro-entreprise.''' Le plugin détecte la franchise via le paramètre Dolibarr '''Configuration > Société > « Assujetti à la TVA »'''. Vérifiez qu'il est bien sur '''Non''' si vous êtes effectivement en franchise. Sinon vos factures sortiront avec un régime TVA classique au lieu de la mention 293 B.
*'''Si vous mettez à jour le plugin depuis une version antérieure''' et que vous émettez régulièrement des factures intracommunautaires ou à l'export<span> </span>: vos prochaines régénérations utiliseront un code TVA plus précis qu'avant (correction de conformité). Les factures déjà émises ne sont pas modifiées. Faites un essai sur une facture représentative pour vérifier qu'elle est bien acceptée par votre PDP avant de regénérer en masse.
----
==Acomptes. Comment le plugin gère les factures d'acompte et leur imputation==
Le plugin reconnaît automatiquement les '''factures d'acompte''' que vous émettez dans Dolibarr (type « Acompte ») ainsi que les '''factures finales''' sur lesquelles ces acomptes sont imputés. '''Vous n'avez rien à paramétrer'''<span> </span>: la détection se fait au moment de la régénération.
Cette section explique ce que produit le plugin pour que vous sachiez à quoi vous attendre dans le XML envoyé à votre PDP ou à votre client.
===Si vous émettez une facture d'acompte===
Quand le type de la facture Dolibarr est '''« Acompte »'''<span> </span>:
→ Le XML est marqué comme « facture d'acompte » (code document <code>386</code> au sens du standard EN16931, distinct du code <code>380</code> des factures classiques et du <code>381</code> des avoirs).
→ Les mentions légales obligatoires en France (indemnité de recouvrement 40 €, pénalités de retard, escompte) sont conservées<span> </span>: un acompte est une '''facture exigible''' au sens fiscal, la TVA y est exigible.
→ Aucune mention d'acompte antérieur n'est ajoutée (par construction, l'acompte est lui-même la première facture du cycle).
===Si vous émettez la facture finale après un ou plusieurs acomptes===
Quand vous facturez le solde d'une commande déjà partiellement payée par acompte(s)<span> </span>:
→ Le plugin lit dans Dolibarr la liste des '''factures d'acompte rattachées''' à cette facture finale et insère pour chacune une référence dans le XML (numéro de la facture d'acompte). Le destinataire et le PDP peuvent ainsi tracer l'historique complet du cycle.
→ Le '''montant total des acomptes imputés''' est inscrit dans le XML sous une balise dédiée (BT-113 « Total prepaid amount » au sens EN16931).
→ Le '''montant restant à payer''' est recalculé automatiquement comme <code>total TTC – acomptes déjà versés</code>. C'est ce montant net qui apparaît comme « somme due » (BT-115 « Due payable amount »), pas le total brut.
→ Si un écart d'arrondi minime existe entre le total TTC Dolibarr et le total recalculé par taux de TVA (cas rare, dépend de la composition des taux sur la facture), il est inscrit séparément (BT-114 « Rounding amount ») pour que la cohérence comptable reste vérifiable par le PDP.
===À savoir avant de mettre en service (acomptes)===
*'''Bien lier l'acompte à la facture finale dans Dolibarr.''' L'imputation est lue depuis la table standard Dolibarr des « remises et avoirs déjà appliqués ». Si vous saisissez la facture finale sans déclarer explicitement l'acompte précédent (par exemple en passant par les écritures de paiement uniquement, sans utiliser le mécanisme « consommer cet acompte »), le plugin ne pourra pas en tenir compte automatiquement.
*'''Avoirs imputés non comptabilisés en BT-113.''' Si vous imputez un avoir sur une facture finale, le plugin ne l'inclut '''pas''' dans le « total déjà payé » (BT-113). C'est conforme à la norme EN16931 qui réserve cette balise aux '''avances reçues''' (acomptes), pas aux compensations (avoirs). Le solde net reste correct car l'avoir est traité comme un mode de règlement classique côté Dolibarr.
*'''Avoir d'acompte (cas marginal).''' Émettre un avoir qui annule une facture d'acompte fonctionne mais le XML produit ne référence pas explicitement la facture d'acompte annulée. À éviter en l'état si vous avez besoin d'une traçabilité formelle ; sinon le résultat reste valide EN16931.
----
==Unités de mesure (UN/ECE Rec 20)==
Chaque ligne de facture est exportée dans le XML EN16931 avec un code unité standardisé UN/ECE Rec 20 dans l'attribut <code>BilledQuantity@unitCode</code> (BT-130). Le plugin lit l'unité saisie sur la ligne Dolibarr (<code>fk_unit</code> → table <code>llx_c_units</code>) et la convertit automatiquement.
Le code Dolibarr (colonne <code>code</code> de <code>llx_c_units</code>) est utilisé comme clé de conversion plutôt que le libellé court (<code>short_label</code>) car celui-ci comporte des collisions (par exemple <code>m</code> désigne à la fois le mètre et le mois dans Dolibarr).
===Table de conversion appliquée===
{| class="wikitable"
!Famille!!Dolibarr (<code>code</code>) → UN/ECE Rec 20
|-
|Temps||<code>S</code>→SEC · <code>MI</code>→MIN · <code>H</code>→HUR · <code>D</code>→DAY · <code>W</code>→WEE · <code>MO</code>→MON · <code>Y</code>→ANN
|-
|Poids||<code>T</code>→TNE · <code>KG</code>→KGM · <code>G</code>→GRM · <code>MG</code>→MGM · <code>OZ</code>→ONZ · <code>LB</code>→LBR
|-
|Longueur||<code>M</code>→MTR · <code>DM</code>→DMT · <code>CM</code>→CMT · <code>MM</code>→MMT · <code>FT</code>→FOT · <code>IN</code>→INH
|-
|Surface||<code>M2</code>→MTK · <code>DM2</code>→DMK · <code>CM2</code>→CMK · <code>MM2</code>→MMK · <code>FT2</code>→FTK · <code>IN2</code>→INK
|-
|Volume||<code>M3</code>→MTQ · <code>DM3</code>→DMQ · <code>CM3</code>→CMQ · <code>MM3</code>→MMQ · <code>FT3</code>→FTQ · <code>IN3</code>→INQ · <code>L</code>→LTR · <code>GAL</code>→GLL
|-
|Quantité||<code>P</code>→C62 (un/pièce) · <code>SET</code>→SET
|}
===Politique de fallback===
*Ligne sans unité renseignée (<code>fk_unit</code> vide)<span> </span>: code <code>C62</code> (one/each), comportement neutre.
*Unité présente mais désactivée dans <code>llx_c_units</code> (colonne <code>active=0</code>)<span> </span>: code <code>C62</code>.
*Code Dolibarr non couvert par la table (unité personnalisée ajoutée par l'instance)<span> </span>: code <code>C62</code>, et un message <code>LOG_INFO</code> est tracé dans le journal Dolibarr (<code>dol_syslog</code>) pour permettre l'extension de la table.
Aucune configuration n'est nécessaire<span> </span>: le mapping s'applique à la régénération, pour les factures et les avoirs, y compris les lignes débours du plugin <code>debourstbnetsys</code>.
----
==Paramétrage du plugin dans Dolibarr==
Une fois l'installation terminée, tout le paramétrage du plugin se fait depuis l'interface Dolibarr. Vous trouverez quatre pages utiles<span> </span>:
*'''Configuration > Modules > FacturX > Paramétrage'''<span> </span>: options principales du plugin. Activer ou non l'envoi des factures vers le PDP, activer ou non la validation à la régénération, taille des pages d'écran, et '''chemins des utilitaires système''' (Ghostscript, Mustang JAR, profil ICC sRGB) si vos outils ne sont pas aux emplacements par défaut.
*'''Configuration > Modules > FacturX > Diagnostic'''<span> </span>: page de contrôle de santé en lecture seule. Affiche en vert/rouge l'état des prérequis (Ghostscript, Java, Mustang, profil ICC, accès à votre PDP…). En cas d'anomalie sur un chemin, l'ajustement se fait dans la page Paramétrage ci-dessus.
*'''Configuration > Modules > FacturX > Adresses Peppol'''<span> </span>: gestion de votre annuaire d'identifiants Peppol/PPF (à utiliser uniquement si vous savez ce que c'est).
*'''FacturX > Dispatch PDP''' (menu principal)<span> </span>: page d'envoi explicite de vos factures vers la plateforme PDP, avec filtres par période, client, état, etc.
===Mode strict (en cas d'échec du pipeline Factur-X)===
Sur la page '''Paramétrage''', l'option '''« Mode strict »''' détermine ce qu'il se passe si la conversion en Factur-X plante (Ghostscript indisponible, Mustang qui échoue, profil ICC introuvable, etc.)<span> </span>:
*'''Décoché (recommandé, valeur par défaut)'''. Mode best-effort. Si le pipeline Factur-X échoue, le PDF classique généré par votre modèle de base (par exemple « crabe ») est '''conservé''' et la facture reste utilisable. Un avertissement orange est affiché à l'utilisateur. La facture peut être imprimée et envoyée par email. Elle n'est juste pas au format Factur-X.
*'''Coché'''. Mode strict. Tout échec du pipeline supprime le PDF et fait remonter une erreur côté Dolibarr. Aucune facture n'est livrée tant que le problème technique n'est pas corrigé. À utiliser uniquement si vous voulez la garantie absolue qu'aucun PDF non-Factur-X ne circule (par ex. exigence contractuelle ou réglementaire).
Dans les deux cas, la validation SUPERPDP (si elle est activée) reste '''purement informative'''. Elle n'a jamais d'effet bloquant, pour ne pas paralyser la facturation en cas d'indisponibilité réseau de la plateforme.
<blockquote>'''Pour les développeurs et intégrateurs''' souhaitant comprendre l'architecture interne du plugin (couches HTTP, mapping XML EN16931, structure de la base, etc.), une documentation technique séparée est fournie dans le fichier <code>ARCHITECTURE.md</code> à la racine du plugin.</blockquote>
----
==Source du plugin==
Le plugin est distribué sur le '''Dolistore''', la place de marché officielle des modules Dolibarr<span> </span>: www.dolistore.com/. C'est la voie recommandée pour les utilisateurs finaux qui souhaitent simplement installer le plugin sur leur Dolibarr.
Les '''développements sont réalisés en interne chez TBNETSYS''' ; le code source est hébergé sur le dépôt git privé de l'auteur.
Vous pouvez aussi simplement télécharger une archive du plugin (depuis le Dolistore) et l'extraire. Le résultat est équivalent. Reprendre ensuite la procédure « Installation du plugin » plus haut.
<blockquote>'''Note documentation'''<span> </span>: ce fichier <code>README.md</code> est repris tel quel dans le wiki Dolibarr de la fiche du plugin. Toute mise à jour du README est donc répercutée par son auteur dans la documentation publique du plugin côté Dolibarr.</blockquote>
----
==Mise à jour du plugin==
Pour mettre à jour le plugin vers une nouvelle version<span> </span>:
#'''Télécharger la mise à jour sur le Dolistore'''<span> </span>: www.dolistore.com/. Récupérer l'archive de la dernière version publiée et l'extraire dans le dossier <code>custom/</code> de votre Dolibarr (par-dessus l'installation existante). Ne pas oublier de rétablir les droits<span> </span>:
#:<syntaxhighlight lang="bash">
chown -R www-data:www-data /var/www/dolibarr/htdocs/custom/facturxtbnetsys
</syntaxhighlight>
#'''Désactiver puis réactiver le plugin''' dans '''Accueil > Configuration > Modules''', onglet « Facturation/Comptabilité ». Ce cycle force Dolibarr à recharger les définitions du module (constantes, hooks, menus, droits) et garantit que les éventuelles nouveautés apportées par la mise à jour sont prises en compte. Vos données existantes ne sont pas affectées.
#'''Reparamétrer si nécessaire'''. Si la mise à jour introduit de nouvelles options ou si certains paramétrages ont changé de format, vérifier la page '''Configuration > Modules > FacturX > Paramétrage''' ainsi que la page '''Diagnostic''' (toutes les vérifications doivent rester au vert).
#'''Optionnellement''', lire le fichier <code>ChangeLog.md</code> à la racine du plugin pour prendre connaissance du détail des changements (corrections de bugs, nouvelles fonctionnalités, modifications de comportement, éventuelles actions manuelles requises).
<blockquote>Le fichier <code>.secret</code> (credentials PDP) n'est jamais embarqué dans l'archive distribuée. Il reste donc inchangé lors d'une mise à jour. Si vous extrayez l'archive par-dessus l'installation existante, prenez garde à ne pas écraser ce fichier.</blockquote>
----
==Signalement de bugs==
Le plugin est maintenu par son auteur qui assure la '''correction des anomalies''' rencontrées par ses utilisateurs. Pour signaler un bug, utilisez le '''formulaire de contact'''<span> </span>: www.tbnetsys.fr/contact/.
'''Ce canal est dédié exclusivement aux corrections de bugs''', c'est-à-dire à des comportements du plugin qui ne sont pas conformes à ce que décrit cette documentation ou à la norme Factur-X / EN16931. Il ne s'agit '''pas d'un service d'assistance utilisateur'''<span> </span>: les questions d'installation Dolibarr, de paramétrage métier, de fiscalité, ou plus généralement « comment faire X dans Dolibarr » ne relèvent pas de ce canal et ne recevront pas de réponse.
Pour qu'un signalement soit exploitable, soyez '''précis et clair''' dans la description du problème. Un bon rapport de bug contient au minimum<span> </span>:
*'''Versions'''<span> </span>: version de Dolibarr, version de PHP, version du plugin (visible sur la page Configuration > Modules), système d'exploitation du serveur.
*'''Contexte précis'''<span> </span>: sur quelle facture (type<span> </span>: standard, acompte, avoir ; pays du client ; régime TVA), à quelle étape (régénération PDF, envoi PDP, validation Mustang…).
*'''Comportement observé'''<span> </span>: message d'erreur exact (copier-coller, pas une reformulation), capture d'écran si pertinent.
*'''Comportement attendu'''<span> </span>: ce qui aurait dû se produire à la place.
*'''Reproductibilité'''<span> </span>: le bug se produit-il à chaque tentative ou de manière intermittente ? sur toutes les factures ou seulement certaines ?
*'''Journaux Dolibarr'''<span> </span>: extrait du journal (<code>Accueil > Configuration > Outils > Journaux</code>) filtré sur le préfixe <code>FACTURXTBNETSYS</code> au moment de l'incident.
Les rapports vagues du type « ça ne marche pas » ou « le PDF est cassé » ne permettent pas de reproduire ni de corriger le problème et ne seront pas traités.
----
==Clause de non responsabilité==
Le plugin est exclusivement destiné aux '''professionnels assujettis aux obligations de facturation électronique en France''' au sens des articles 289 bis et suivants du Code général des impôts. Il n'est ni conçu, ni proposé, ni destiné à un usage par un consommateur au sens de l'article liminaire du Code de la consommation, ni par un non-professionnel.
Le plugin est diffusé sous licence libre '''GPL-3.0-or-later''', qui en garantit le droit de redistribution et d'étude du code source conformément à ses termes. Sa licence d'utilisation est concédée '''à titre onéreux''', selon les conditions tarifaires en vigueur, dans le cadre d'une relation '''strictement entre professionnels''', à l'exclusion de toute relation entrant dans le champ d'application du Code de la consommation. L''''acquisition, l'installation ou l'utilisation du plugin valent reconnaissance par l'utilisateur de sa qualité de professionnel''' ainsi qu'acceptation sans réserve des présentes conditions.
Le plugin est fourni '''« en l'état »''', sans aucune garantie, expresse ou implicite, de quelque nature que ce soit. Notamment, mais sans s'y limiter, de qualité marchande, d'adéquation à un usage particulier, de conformité réglementaire ou fiscale, ni de continuité de service.
L'utilisation du plugin se fait '''aux risques et périls de l'utilisateur'''. Il appartient à ce dernier de vérifier, sous sa seule responsabilité, que les factures Factur-X produites sont conformes à ses obligations légales, fiscales et contractuelles, et qu'elles sont effectivement acceptées par ses destinataires et par sa Plateforme de Dématérialisation Partenaire (PDP).
'''Ni l'auteur, ni TBNETSYS, ni les contributeurs ne pourront en aucun cas être tenus responsables''' d'un quelconque dommage direct ou indirect (notamment, mais sans s'y limiter<span> </span>: perte de données, perte de chiffre d'affaires, perte d'exploitation, rejet de factures par un destinataire ou par un PDP, redressement fiscal, sanction administrative, dommage matériel, immatériel ou moral) résultant de l'installation, de l'utilisation, du dysfonctionnement ou de l'impossibilité d'utiliser le plugin, même dans l'hypothèse où l'auteur, TBNETSYS ou un contributeur auraient été informés de l'éventualité d'un tel dommage.
Cette clause s'applique dans toute la mesure permise par la loi applicable.
Le plugin et la présente clause sont régis par le '''droit français'''. Entre professionnels, en cas de litige relatif à l'installation, à l'utilisation, au fonctionnement ou à l'absence de fonctionnement du plugin et à défaut de résolution amiable préalable, '''compétence exclusive et expresse est attribuée au Tribunal judiciaire de Perpignan''', y compris en cas de référé, de pluralité de défendeurs ou d'appel en garantie, nonobstant toute clause contraire. Si l'utilisateur devait néanmoins être qualifié de consommateur ou de non-professionnel par une juridiction, les règles impératives de protection prévues par le droit français s'appliqueront, sans que cela ne remette en cause les autres stipulations de la présente clause, qui demeurent applicables dans toute la mesure permise par la loi.
----
==Auteur et licence==
Auteur<span> </span>: '''Thierry Bazzanella'''<br />
Contact<span> </span>: www.tbnetsys.fr/contact/<br />
(c) 2026 TBNETSYS. All rights reserved<br />
Licence<span> </span>: GPL-3.0-or-later<br />
----
==Contributeurs et béta-testeurs==
Les '''contributeurs''' (correction de bugs, développement de nouvelles fonctionnalités) et les '''béta-testeurs''' ayant téléchargé le plugin sont éventuellement les bienvenus. Nous pouvons en discuter par téléphone après un premier contact par email. Pour l'instant, l'auteur en assure la maintenance et les évolutions.
Un '''environnement dédié et privé sous GitLab''' est mis à disposition pour ce plugin<span> </span>: il regroupe le code source, le suivi des tickets, les branches de travail et les itérations de test. L'environnement est très '''orienté développement et cycle de vie logiciel''' (branches, revues, intégration continue, jalons, releases). Il s'adresse donc à des intervenants à l'aise avec ces pratiques.
La documentation du code source est intégrée à celui-ci au format PhpDoc. L'outil de développement recommandé est '''Visual Studio Code''' avec les extensions '''PHP Intelephense''' (éditeur<span> </span>: Intelephense) et '''PHP Debug''' (éditeur<span> </span>: Xdebug).
La '''communication entre tous les intervenants se fait principalement par ticket''' (issues GitLab)<span> </span>: signalement, discussion technique, suivi d'avancement, validation. Cela garantit la traçabilité des décisions et permet à chacun de retrouver le contexte d'un changement à tout moment.
Pour rejoindre l'environnement contributeurs/béta-testeurs, prendre contact via le formulaire<span> </span>: www.tbnetsys.fr/contact/.
----
==Prix du plugin==
Le plugin est diffusé en '''paiement unique'''. Une fois acquis, il vous appartient sans abonnement, sans coût récurrent et sans limite de durée d'utilisation.
{| class="wikitable"
!Période!!Prix
|-
|Tarif de lancement, jusqu'au 31 août 2026||'''149 € TTC'''
|-
|À compter du 1er septembre 2026||'''199 € TTC'''
|}
L'auteur n'est pas assujetti à la TVA (franchise en base, art. 293 B du CGI). Les prix indiqués sont nets de taxe<span> </span>: aucun montant de TVA ne s'ajoute au prix affiché.
'''Mises à jour à vie incluses.''' Chaque acquéreur reçoit toutes les versions futures du plugin sans frais supplémentaire<span> </span>: corrections de bugs, mises en conformité réglementaire, nouvelles fonctionnalités, nouveaux profils EN16931, prise en charge des futures versions de Dolibarr. Une seule acquisition couvre l'usage du plugin sur la durée.
'''Modèle de financement.''' Chaque utilisateur participe ainsi au coût de développement et au temps passé sur la maintenance, le suivi des évolutions de la norme Factur-X, l'adaptation aux versions successives de Dolibarr ainsi qu'à la correction des anomalies signalées (cf. § Signalement de bugs). C'est ce financement collectif qui permet à l'auteur de continuer à faire vivre le plugin dans la durée.
'''Aucune obligation, d'aucune sorte, de l'auteur ni des contributeurs.''' Les mises à jour à vie comme la correction des bugs sont fournies dans la mesure des moyens et de la disponibilité de l'auteur et de ses éventuels contributeurs, sans engagement d'aucune sorte<span> </span>: ni de fréquence, ni de délai, ni de périmètre, ni de résultat, ni de continuité de service. L'acquisition du plugin n'ouvre droit à aucune prestation contractuelle de maintenance, de support ou d'évolution. Le plugin est fourni « en l'état » conformément à la § Clause de non responsabilité, qui prévaut sur la présente section en cas de divergence d'interprétation.
===Support payant (optionnel)===
Au-delà du plugin lui-même (paiement unique avec mises à jour à vie, sans obligation), un service d''''assistance technique payante''' peut être souscrit ponctuellement, à la demande, par les utilisateurs souhaitant un accompagnement dépassant le cadre du simple signalement de bugs.
'''Tarif horaire<span> </span>: 85 € TTC / heure.''' L'auteur n'étant pas assujetti à la TVA (franchise en base, art. 293 B du CGI), aucun montant de TVA ne s'ajoute au prix affiché.
'''Modalités de facturation.''' Facturation à la demi-heure indivisible commencée, avec un minimum facturable d'une heure par intervention. Toute prestation est précédée d'un '''devis écrit''' que l'utilisateur doit accepter avant le démarrage de l'intervention. Le devis fixe un '''plafond horaire ferme''' propre à l'intervention. Aucune heure facturable au-delà de ce plafond ne peut être engagée sans '''acceptation écrite préalable''' d'un avenant ou d'un nouveau devis. À défaut d'accord pour poursuivre, l'intervention est interrompue à due concurrence du plafond initial.
'''Périmètre.''' À distance uniquement<span> </span>: email, formulaire de contact, partage d'écran ou accès SSH ponctuel sur autorisation explicite et révocable de l'utilisateur. La prestation porte exclusivement sur le plugin FacturXTbnetsys et son intégration dans Dolibarr (paramétrage, diagnostic, accompagnement à l'installation, analyse de cas particuliers et lecture de journaux). Sont exclus du périmètre<span> </span>: l'administration Dolibarr générale, le conseil fiscal, le conseil métier, l'intervention sur d'autres modules tiers et le développement spécifique non directement lié à une anomalie du plugin.
'''Heures ouvrées (heure de Paris).'''
{| class="wikitable"
!Jour!!Plage horaire
|-
|Lundi à vendredi||9h–12h et 14h–18h
|-
|Samedi, dimanche, jours fériés légaux français||Fermé
|}
'''Délais cibles de prise en charge.''' Les délais ci-dessous courent à compter de la réception de la demande pendant les heures ouvrées<span> </span>: une demande arrivée hors plage est réputée reçue à l'ouverture suivante. Ces délais sont des '''objectifs cibles à effort raisonnable, jamais des engagements contractuels chiffrés opposables'''.
{| class="wikitable"
!Niveau de gravité!!Définition!!Objectif cible de prise en charge
|-
|Critique||Production de factures Factur-X totalement interrompue, aucun contournement disponible||4 heures ouvrées
|-
|Majeur||Fonctionnalité importante dégradée mais contournement possible (par exemple<span> </span>: mode Mustang en échec mais mode horstoeko fonctionnel)||1 jour ouvré
|-
|Mineur||Gêne ponctuelle, question, optimisation, demande de paramétrage ou d'éclaircissement||3 jours ouvrés
|}
'''Obligation de moyen, à l'exclusion de toute obligation de résultat.''' Le support payant constitue une '''prestation de services''' au sens du droit français, exécutée selon une '''obligation de moyen uniquement'''. L'auteur s'engage à mettre en œuvre ses compétences professionnelles et le temps nécessaire pour tenter d'apporter une réponse ou une résolution, '''sans garantir aucun résultat'''<span> </span>: ni la résolution effective de la difficulté signalée, ni le respect des délais cibles ci-dessus, ni l'absence de récidive, ni la compatibilité avec l'environnement particulier de l'utilisateur. Les délais cibles ne sont assortis d''''aucune pénalité''' et n'ouvrent droit à '''aucune indemnité, remise ou avoir''' en cas de dépassement. Cette obligation de moyen prévaut sur toute interprétation contraire pouvant résulter de la rédaction de la présente section.
'''Engagement d'information en cours d'intervention.''' Si l'auteur estime, en cours d'analyse, que la difficulté ne pourra vraisemblablement pas être résolue dans le plafond horaire du devis accepté, ou que la cause apparente est extérieure au plugin (anomalie Dolibarr, conflit avec un autre module tiers, configuration système hors périmètre, environnement non reproductible), il en informe l'utilisateur '''avant de poursuivre la facturation au-delà du temps déjà engagé'''. La poursuite de l'intervention requiert alors l'acceptation écrite de l'utilisateur. Cet engagement d'information demeure une modalité d'exécution de l'obligation de moyen. Il n'emporte aucune obligation de résultat.
'''Exclusivement et uniquement sous forme de services.''' La prestation ne comprend ni produit logiciel additionnel, ni licence supplémentaire, ni garantie, ni assurance, ni cession de droits, ni livrable autre que le '''compte-rendu d'intervention'''. Ce compte-rendu mentionne au minimum<span> </span>: la nature des vérifications effectuées, les éléments diagnostiqués, les actions menées, les points restant ouverts ainsi que les recommandations à destination de l'utilisateur. Il est remis quel que soit le résultat constaté. Le règlement rémunère exclusivement le '''temps de travail effectivement passé''' en assistance, indépendamment du résultat constaté à l'issue de l'intervention.
'''Procédure d'accès au support payant.''' Le support payant n'est pas accessible directement sur facture spontanée. Il suppose au préalable<span> </span>:
#Un '''premier contact via le formulaire'''<span> </span>: www.tbnetsys.fr/contact/, en présentant le contexte de la demande (instance Dolibarr, version du plugin, nature du besoin d'accompagnement).
#La '''signature d'un contrat de support''' entre l'utilisateur (en qualité de professionnel) et TBNETSYS, qui formalise le tarif horaire, les modalités de facturation, le périmètre, les délais cibles, l'obligation de moyen, l'exclusion de l'obligation de résultat ainsi que les autres conditions rappelées dans la présente section.
#L''''acceptation écrite d'un devis''' propre à chaque intervention, dans le cadre du contrat ainsi signé.
Aucune intervention payante n'est démarrée tant que ces trois étapes ne sont pas complétées. Sans contrat de support signé, seul le canal gratuit de signalement de bugs (cf. § Signalement de bugs) reste accessible, dans les limites qui y sont décrites.
La présente offre de support payant ne modifie pas la § Clause de non responsabilité, qui prévaut intégralement sur tout point non explicitement couvert ici.

Latest revision as of 08:48, 12 May 2026

Dispatch PDP
Dispatch PDP

facturxtbnetsys

Plugin Dolibarr de TBNETSYS qui régénère chaque facture client au format Factur-X : un PDF/A-3 avec un XML EN16931 (CII) embarqué, selon les spécifications françaises FNFE (profil EN16931 / Comfort).

Le plugin dispose d'une aide intégrée.

Deux backends de génération PDF interchangeables, sélectionnables dans l'onglet Paramétrage section « Pipeline PDF » :

  • horstoeko/PDF/A-3B portable (défaut). Sous-processus PHP CLI utilisant la librairie horstoeko/zugferd embarquée dans vendor/. Aucune dépendance système hors php-cli. Validation FNFE/PDP strictement identique au mode 3U. Fonctionne tel quel sur tout hébergement Dolibarr, y compris mutualisé.
  • Mustang/PDF/A-3U strict. Pipeline historique Ghostscript + Mustang CLI. Recommandé pour archivage légal long terme (extractibilité Unicode garantie). Nécessite Ghostscript, Java JRE, Mustang JAR et le profil ICC sRGB sur le serveur (cf. § Installation des prérequis système). À choisir explicitement dans l'onglet Paramétrage.

Le mode par défaut horstoeko ne nécessite que l'extension PHP simplexml côté CLI (généralement présente). Si votre /usr/bin/php ne l'a pas, pointer la constante FACTURXTBNETSYS_PHP_BIN vers une version qui l'inclut (par exemple /usr/bin/php8.4).

Côté pilotage de la transmission, le plugin fournit une page Dispatch PDP qui liste les factures candidates avec leur statut local (SIREN vendeur/acheteur, PDF Factur-X présent) et leur statut côté plateforme (conformité, transmission). Deux actions en série sont proposées avec popup de progression en temps réel :

  • « Vérifier la sélection ». Interroge SUPERPDP pour chaque facture cochée (validation Factur-X + statut transmission). Compteurs colorés (conformes / non conformes / transmises / en cours / en échec / jamais transmises) et journal détaillé par facture.
  • « Envoyer au PDP la sélection ». Envoie effectivement chaque facture éligible vers SUPERPDP (avec confirmation préalable). Compteurs envoyées / ignorées / en erreur ; les factures déjà transmises ou non éligibles sont automatiquement ignorées.

Dans les deux cas, la popup affiche une barre d'avancement, le numéro de la facture en cours, et un bouton d'annulation. Les résultats sont persistés au fur et à mesure : vous pouvez fermer la popup à mi-parcours et reprendre plus tard sans perdre ce qui a déjà été traité, ce qui rend le contrôle et l'envoi de gros stocks (centaines voire milliers de factures) confortables et résistants aux timeouts.

Compatibilité

Composant Version requise
Dolibarr 22.0.3 ou supérieur
PHP 8.2 minimum (8.4 recommandé)
Système d'exploitation cible Debian 13 (les commandes ci-dessous sont prévues pour Debian/Ubuntu)
Multi-entité (Multicompany) Pris en charge. Toutes les requêtes filtrent par entity (getEntity('invoice') / getEntity('bank_account')) et la table de cache PDP llx_facturxtbnetsys_pdp_check porte une colonne entity avec index unique (fk_facture, entity), ce qui isole les données par société sans collision.

Sur d'autres distributions (RedHat, Alpine, etc.) le principe reste identique mais les noms de paquets et le gestionnaire (dnf, apk…) changent ; adapter en conséquence.


Choix du moteur PDF. Mustang ou horstoeko ?

Le plugin propose deux moteurs PDF interchangeables au choix de l'utilisateur, sélectionnables dans l'onglet Paramétrage après installation. Le mode horstoeko (PDF/A-3B portable) est le défaut depuis la version 1.1.0 : il fonctionne sans aucune dépendance système et couvre la quasi-totalité des cas d'usage. Le mode Mustang reste disponible pour les utilisateurs qui ont besoin d'un archivage légal PDF/A-3U strict avec extractibilité Unicode garantie ; il s'active explicitement dans l'onglet Paramétrage. Avant de poursuivre, choisissez celui qui correspond à votre environnement et à vos contraintes : la suite du README s'organise autour de ce choix.

Arbre de décision

Question Réponse → Mode à choisir
Votre archivage légal exige-t-il l'extractibilité Unicode du texte (PDF/A-3U strict) ? Non → horstoeko (défaut, rien à configurer)
Si oui : avez-vous un accès terminal au serveur avec privilèges sudo ou root ? Oui → Mustang recommandé (extractibilité Unicode garantie)
Sinon (pas d'accès root) : horstoeko reste le seul choix possible. Mustang nécessite root pour installer Ghostscript / Java / Mustang JAR

Comparatif détaillé

Critère Mode Mustang (PDF/A-3U strict) Mode horstoeko (PDF/A-3B portable)
Niveau PDF/A 3U. Extractibilité Unicode garantie (archivage légal long terme, accessibilité, indexation, recherche plein texte) 3B. Apparence fidèle, validité format Factur-X, archivage acceptable mais sans garantie d'extractibilité Unicode
Validation FNFE / PDP ✓ 0 erreur sur les 189 contrôles XSD CII + EN16931 + BR-FR-CTC-Flux2 ✓ 0 erreur sur les mêmes 189 contrôles (validation strictement identique côté SUPERPDP)
XML CII embarqué Identique (généré par le builder du module) Identique (généré par le builder du module)
Accès terminal serveur requis Oui. Sudo ou root indispensable pour installer Ghostscript, Java JRE, Mustang JAR, profil ICC sRGB Non. Aucune installation système. Le module fonctionne tel quel via PHP CLI
Hébergement mutualisé / instance managée sans SSH ❌ Inadapté ✓ Pleinement supporté
Empreinte serveur ~50 Mo (Java + Mustang) en plus des paquets système habituels ~27 Mo de vendor/ Composer embarqués dans le module
Robustesse face à un PDF source quelconque Ghostscript ré-encode entièrement le PDF en PDF/A-3 valide, quel que soit le PDF source. Aucune contrainte sur les polices ou les modèles utilisés par Dolibarr ou par d'autres modules Repose sur le PDF source produit par Dolibarr (modèle « crabe » par défaut). Couvre les cas standards, mais un PDF source produit par un modèle tiers exotique peut donner un PDF/A-3B moins propre
Validation Schematron au niveau pipeline local Oui (Mustang valide XSD + règles métier FNFE en local) Validation locale par horstoeko/zugferd côté XML uniquement ; la validation Schematron complète est faite côté SUPERPDP via validation_reports

Les deux modes peuvent coexister

Le choix est fait par une simple constante dans Dolibarr (FACTURXTBNETSYS_PDF_ENGINE). Vous pouvez :

  • Démarrer en horstoeko (défaut, sans rien configurer) pour valider le plugin sans toucher au système (test, validation fonctionnelle)
  • Basculer vers Mustang plus tard si vos exigences d'archivage évoluent. La bascule est instantanée, sans régénérer les anciennes factures
  • Inversement, dégrader vers horstoeko si une migration vers un hébergement mutualisé devient nécessaire

Aucun re-traitement des factures déjà générées n'est requis lors d'un changement de mode : les anciennes factures restent valides, seules les nouvelles seront générées avec le moteur courant.


Installation des prérequis système. Mode Mustang uniquement

Vous avez choisi le mode horstoeko ? Sautez cette section et passez directement à #Mode horstoeko. Aucun prérequis système.

Cette section est conçue pour un utilisateur non administrateur système mais disposant tout de même d'un accès terminal avec privilèges sudo ou root. Sans cet accès, le mode Mustang n'est pas installable. Basculer sur le mode horstoeko. Chaque étape est expliquée : à quoi sert l'outil, comment l'installer, comment vérifier qu'il est correctement en place. Suivre les blocs dans l'ordre.

Conventions

  • Toutes les commandes doivent être exécutées avec les droits root sur le serveur Dolibarr. Si vous n'êtes pas connecté en root, préfixer chaque commande par sudo (par exemple sudo apt install …).
  • www-data est l'utilisateur Linux sous lequel le serveur web (Apache/Nginx) exécute Dolibarr. Lorsqu'une commande doit être lancée en tant que www-data, c'est explicitement indiqué.
  • # au début d'une ligne signifie « commentaire, ne pas taper ».
  • Toujours copier-coller les commandes : un caractère manquant ou un tiret recopié à la main peut casser l'installation.

Étape 1. Mettre à jour la liste des paquets

Avant d'installer quoi que ce soit, on rafraîchit l'index du gestionnaire de paquets pour récupérer les versions les plus récentes.

apt update

Cette commande ne modifie rien sur le système : elle se contente de télécharger la liste des paquets disponibles. Elle peut afficher quelques avertissements (Different settings for HTTP/HTTPS), c'est normal.

Étape 2. Installer Ghostscript

À quoi ça sert : Ghostscript (commande gs) est l'outil qui convertit le PDF généré par Dolibarr en PDF/A-3, le format obligatoire pour qu'un Factur-X soit valide. Sans lui, le PDF n'est pas conforme et le destinataire le rejettera.

apt install -y ghostscript

L'option -y accepte automatiquement les questions « voulez-vous continuer ? » que pose apt.

Vérification :

gs --version

Doit afficher un numéro de version (par ex. 10.03.1). Si la commande renvoie command not found, l'installation a échoué. Relire les messages d'erreur d'apt install.

Étape 3. Installer Java (JRE)

À quoi ça sert : Mustang (étape suivante) est un programme écrit en Java. Pour pouvoir l'exécuter, il faut une JVM (machine virtuelle Java) installée sur le serveur. On installe le JDK headless (sans interface graphique, suffisant pour un serveur).

apt install -y default-jre default-jdk-headless

default-jre (Java Runtime Environment) suffirait pour exécuter un programme, mais default-jdk-headless garantit que tous les outils annexes (notamment ceux utilisés par Mustang à l'initialisation) soient disponibles. Les deux paquets ne se contredisent pas.

Vérification :

java -version

Doit afficher quelque chose comme openjdk version "17.0.x". La sortie part par défaut sur la sortie d'erreur, c'est normal. Le résultat reste lisible à l'écran.

Étape 4. Télécharger Mustang CLI

À quoi ça sert : Mustang est l'outil qui prend le PDF/A-3 fabriqué à l'étape 2 et le XML EN16931 généré par le plugin, puis les fusionne en un véritable PDF Factur-X (avec les bonnes métadonnées XMP, le nom canonique factur-x.xml du fichier embarqué, etc.). Le plugin appelle Mustang en arrière-plan à chaque régénération de facture.

Mustang n'est pas distribué via apt. Il faut télécharger le .jar (un programme Java empaqueté) depuis sa page officielle GitHub et le placer à un endroit fixe. Le plugin cherche par défaut le fichier dans /opt/Mustang-CLI-2.22.0.jar.

# Se positionner dans /opt (répertoire conventionnel pour les logiciels tiers)
cd /opt

# Télécharger la version 2.22.0 (testée et validée avec ce plugin)
wget github.com/ZUGFeRD/mustangproject/releases/download/core-2.22.0/Mustang-CLI-2.22.0.jar

wget est un téléchargeur en ligne de commande. S'il n'est pas installé, l'ajouter avec apt install -y wget. La commande crée le fichier /opt/Mustang-CLI-2.22.0.jar (~30 Mo).

Vérification :

ls -l /opt/Mustang-CLI-2.22.0.jar

Doit afficher une ligne avec une taille d'environ 30 Mo. Si le fichier est plus petit (quelques Ko), le téléchargement a échoué. Supprimer le fichier (rm /opt/Mustang-CLI-2.22.0.jar) et recommencer.

Si vous voulez utiliser une autre version de Mustang (par ex. une plus récente), saisissez le nouveau chemin dans la page Configuration > Modules > FacturX > Paramétrage de Dolibarr, section « Chemins des utilitaires système » (champ « Mustang CLI (.jar) »).

Étape 5. Vérifier la présence du profil ICC sRGB

À quoi ça sert : un PDF/A-3 doit déclarer un profil colorimétrique de référence (le profil ICC). Le plugin utilise sRGB par défaut, le plus standard. Ce profil est généralement présent par défaut sur Debian via le paquet icc-profiles-free.

ls -l /usr/share/color/icc/sRGB.icc
  • Si le fichier existe : rien à faire.
  • Si le fichier est absent (No such file or directory) :
apt install -y icc-profiles-free

Sur certaines distributions, le paquet peut s'appeler différemment (icc-profiles). Si vraiment introuvable, le plugin accepte un chemin alternatif modifiable dans Configuration > Modules > FacturX > Paramétrage, section « Chemins des utilitaires système » (champ « Profil ICC sRGB »).

Étape 6. Installer les paquets PHP utilisés par Dolibarr

À quoi ça sert : Dolibarr et le plugin s'appuient sur quelques bibliothèques PHP pour manipuler les PDF (TCPDF, FPDI), pour parser des PDF lus (Poppler), et pour quelques utilitaires bas niveau (binutils).

apt install -y binutils php-tcpdf php-fpdi poppler-utils

Détail rapide :

Paquet Utilité
binutils Outils binaires bas niveau utilisés par certaines libs
php-tcpdf Génération PDF côté Dolibarr
php-fpdi Lecture/import de PDF existants
poppler-utils Outils annexes (pdfinfo, pdftotext)

Vérification :

gs --version && java -version

Si les deux commandes répondent, les briques principales sont en place.


Mode horstoeko. Aucun prérequis système

Vous avez choisi le mode Mustang ? Cette section ne vous concerne pas, passer à #Installation du plugin.

Le mode horstoeko/PDF/A-3B fonctionne avec un PHP CLI disposant de l'extension SimpleXML. Sur l'écrasante majorité des hébergements Dolibarr, c'est déjà le cas. Vous n'avez donc aucune installation à effectuer côté système.

Vérification rapide depuis votre Dolibarr

Si vous avez accès au serveur en SSH (même sans sudo), vérifier que PHP CLI a SimpleXML :

php -r 'echo extension_loaded("simplexml") ? "OK\n" : "ABSENT\n";'

Si vous obtenez OK, vous êtes prêt. Le plugin fonctionnera tel quel. Il suffit de l'installer puis de sélectionner le mode horstoeko dans le paramétrage.

Si vous n'avez pas du tout accès au shell

Sur certains hébergements mutualisés, vous n'avez accès qu'au panel d'administration et à un éditeur de fichiers via FTP/SFTP. Dans ce cas :

  1. Installez le plugin en uploadant son répertoire dans custom/
  2. Activez-le dans Dolibarr
  3. Allez dans Diagnostic : la page vérifiera automatiquement que le PHP CLI cible (via la constante FACTURXTBNETSYS_PHP_BIN) a bien SimpleXML
  4. Si SimpleXML manque côté CLI, le diagnostic vous l'indiquera : il faudra alors demander à votre hébergeur d'activer l'extension simplexml ou de pointer le plugin sur une autre version de PHP CLI qui l'inclut

Vendor Composer fourni dans le plugin

La bibliothèque horstoeko/zugferd et ses dépendances sont embarquées dans le plugin au moment de la distribution (répertoire vendor/). Aucune installation Composer n'est nécessaire côté serveur cible. Si vous compilez le plugin depuis les sources, exécuter composer install --no-dev --optimize-autoloader à la racine du module avant déploiement.


Installation du plugin

Cette étape est commune aux deux modes. Une fois les prérequis correspondant à votre choix de mode validés :

  1. Copier le répertoire facturxtbnetsys/ dans le dossier custom/ de Dolibarr :
    cp -r facturxtbnetsys /var/www/dolibarr/htdocs/custom/
    chown -R www-data:www-data /var/www/dolibarr/htdocs/custom/facturxtbnetsys
    
  2. Activer le module dans Dolibarr : Accueil > Configuration > Modules > Onglet "Facturation/Comptabilité" → activer FacturXTbnetsys.
  3. Créer le fichier .secret hors de la racine web (à côté de htdocs/, ou dans un répertoire dédié aux secrets) et y renseigner les identifiants de connexion à votre PDP, puis indiquer son chemin absolu à Dolibarr dans l'onglet Paramétrage (voir la sous-section Configuration du fichier .secret ci-dessous).
  4. Vérifier la santé de l'installation : Configuration > Modules > FacturX > onglet Diagnostic. La page liste les vérifications avec un code couleur (le contenu varie selon le backend PDF sélectionné) ; toutes doivent être au vert (à l'exception éventuelle de .secret qui peut être marqué « optionnel » tant que vous n'avez pas finalisé la configuration PDP).

Configuration du fichier .secret (credentials PDP)

Le plugin se connecte à votre Plateforme de Dématérialisation Partenaire (PDP) (par défaut SUPERPDP) via OAuth2 (flux client_credentials). Vos identifiants OAuth2 sont stockés dans un fichier .secret, lu uniquement côté serveur.

Sans .secret, le plugin reste fonctionnel : la régénération Factur-X (PDF/A-3 + XML EN16931) continue de fonctionner. Seul l'envoi automatique vers la PDP est désactivé. Le diagnostic affiche alors .secret en orange « optionnel ».

Emplacement recommandé. Hors de la racine web

Le fichier .secret doit être placé en dehors du dossier htdocs/ (la racine web servie par Apache / Nginx) afin qu'il ne puisse jamais être servi par le serveur HTTP en cas de mauvaise configuration ou de bug. Sur une installation type /var/www/dolibarr/htdocs/, placez-le par exemple :

Emplacement Recommandation
/var/www/dolibarr/.secret Recommandé. Au même niveau d'arborescence que htdocs/, donc inaccessible via HTTP par construction
/etc/dolibarr-secrets/pdp.secret Recommandé. Répertoire système dédié aux secrets, idéal pour gérer plusieurs environnements (pdp-prod.secret, pdp-sandbox.secret)
/var/www/dolibarr/htdocs/custom/facturxtbnetsys/.secret À éviter. Fonctionne (chemin par défaut codé), mais place le fichier sous la racine web : tout problème de configuration serveur peut l'exposer en clair

Une fois le fichier créé, son chemin absolu doit être renseigné dans Configuration > Modules > FacturX > onglet Paramétrage, section API PDP, champ Chemin du fichier .secret. Tant que cette constante n'est pas renseignée, le plugin retombe sur le défaut codé (chemin sous la racine web), ce qui n'est pas l'emplacement souhaitable.

Obtention des identifiants : récupérer client_id et client_secret depuis l'espace administrateur de votre PDP. Pour SUPERPDP, l'endpoint d'authentification utilisé par le plugin est api.superpdp.tech/oauth2/token.

Format attendu. Fichier texte, une clé par ligne, valeur entre guillemets droits (les guillemets sont optionnels). Les lignes vides et celles commençant par # sont ignorées :

# Credentials OAuth2 SUPERPDP. NE PAS COMMITER
client_id="votre-client-id-fourni-par-la-pdp"
client_secret="votre-client-secret-fourni-par-la-pdp"

Création et droits Unix. Le plugin fournit un modèle .secret.example à la racine du plugin. Copiez-le hors de la racine web puis complétez-le :

# Copier le modele HORS de la racine web (exemple : au meme niveau que htdocs/)
cp /var/www/dolibarr/htdocs/custom/facturxtbnetsys/.secret.example /var/www/dolibarr/.secret
# Renseigner client_id et client_secret avec votre editeur favori
nano /var/www/dolibarr/.secret
# Restreindre les droits (lecture/ecriture par www-data uniquement)
chmod 600 /var/www/dolibarr/.secret
chown www-data:www-data /var/www/dolibarr/.secret

Puis, dans Dolibarr : Configuration > Modules > FacturX > Paramétrage > API PDP > Chemin du fichier .secret → saisir /var/www/dolibarr/.secret (adapter à votre installation) et enregistrer.

Précautions de sécurité :

  • Placer .secret hors de la racine web (cf. tableau ci-dessus) : c'est la garantie la plus solide qu'il ne sera jamais servi en HTTP.
  • Ne jamais committer .secret dans un dépôt git (ajouter .secret au .gitignore du plugin si vous forkez le code).
  • Ne jamais transmettre le fichier par email/messagerie en clair.
  • En cas de fuite suspectée, révoquer immédiatement le client_secret depuis l'admin de la PDP et en générer un nouveau.
  • Le fichier doit appartenir à www-data et être en 0600 : aucun autre utilisateur Unix de la machine ne doit pouvoir le lire.

Vérification. Après création, ouvrir Configuration > Modules > FacturX > Diagnostic :

Ligne diagnostic État attendu
.secret OK (vert). Fichier présent et client_id / client_secret non vides
api.superpdp.tech OK (vert). Un Bearer token a été obtenu avec succès

Si .secret ressort « KO » (rouge), le fichier existe mais une des deux clés est absente ou mal formée. Relire le format ci-dessus. Si api.superpdp.tech ressort en erreur, les identifiants sont rejetés par la PDP : vérifier qu'ils sont corrects et actifs côté admin de la plateforme. Les détails de l'erreur sont tracés dans le journal Dolibarr (Accueil > Configuration > Outils > Journaux, préfixe FACTURXTBNETSYS).

Sélection du moteur PDF dans Dolibarr

Une fois le module activé, aller dans Configuration > Modules > FacturX > onglet Paramétrage. La section « Pipeline PDF » propose un radio à deux choix :

  • horstoeko/zugferd / PDF/A-3B portable. Choix par défaut depuis la version 1.1.0. Aucun prérequis système. Sous le radio, un champ « Binaire php-cli » permet de pointer vers la version de PHP utilisée par le sous-processus (par défaut /usr/bin/php). Si votre /usr/bin/php ne dispose pas de l'extension SimpleXML, indiquer ici une version qui l'inclut, par exemple /usr/bin/php8.4.
  • Mustang / PDF/A-3U strict. Choix optionnel pour archivage légal long terme. Nécessite que la procédure Installation des prérequis système ait été suivie au préalable.

Sélectionner le mode souhaité, sauvegarder, puis ouvrir l'onglet Diagnostic pour vérifier que toutes les briques nécessaires au mode choisi sont au vert. Le contenu de cette page s'adapte automatiquement au mode sélectionné. Vous ne verrez les checks Ghostscript/Java/Mustang qu'en mode Mustang, et les checks PHP CLI/SimpleXML/Composer vendor qu'en mode horstoeko.


Vérification finale en une commande

Mode Mustang

Pour vérifier en bloc tous les prérequis Mustang depuis la ligne de commande :

echo "=== Ghostscript ===" && gs --version && \
echo "=== Java ===" && java -version 2>&1 && \
echo "=== Mustang JAR ===" && ls -l /opt/Mustang-CLI-2.22.0.jar && \
echo "=== ICC sRGB ===" && ls -l /usr/share/color/icc/sRGB.icc && \
echo "=== Tout est OK ==="

Si la dernière ligne === Tout est OK === s'affiche, l'installation système est complète. Sinon, l'erreur juste avant indique précisément ce qui manque.

Mode horstoeko

echo "=== PHP CLI ===" && php -v | head -1 && \
echo "=== SimpleXML ===" && php -r 'echo extension_loaded("simplexml") ? "OK" : "ABSENT", PHP_EOL;' && \
echo "=== vendor ===" && ls -d /var/www/dolibarr/htdocs/custom/facturxtbnetsys/vendor/horstoeko/zugferd && \
echo "=== Tout est OK ==="

Si vous avez configuré une version PHP CLI spécifique (ex. /usr/bin/php8.4), remplacer php par ce binaire dans les deux premières lignes.


Pièges fréquents

Mode Mustang

Symptôme Cause probable Solution
gs: command not found lors de la régénération Ghostscript pas installé ou pas dans le PATH du serveur web Re-vérifier l'étape 2. Au besoin, renseigner le chemin absolu dans Configuration > Modules > FacturX > Paramétrage, champ « Binaire Ghostscript »
Mustang JAR introuvable/illisible Le fichier n'est pas à /opt/Mustang-CLI-2.22.0.jar, ou pas lisible par www-data chmod +r /opt/Mustang-CLI-2.22.0.jar ou ajuster le chemin dans Configuration > Modules > FacturX > Paramétrage, champ « Mustang CLI (.jar) »
java: command not found JRE non installé Re-vérifier l'étape 3
Erreur PDF/A-3 « no ICC profile » Le profil sRGB n'est pas trouvé Re-vérifier l'étape 5, ajuster le chemin dans Configuration > Modules > FacturX > Paramétrage, champ « Profil ICC sRGB » si nécessaire

Mode horstoeko

Symptôme Cause probable Solution
vendor/autoload.php introuvable dans le journal Le vendor/ Composer n'a pas été déployé avec le plugin Réinstaller le plugin depuis l'archive officielle (qui inclut vendor/) ou exécuter composer install --no-dev --optimize-autoloader à la racine du module
Binaire php-cli introuvable ou non exécutable La constante FACTURXTBNETSYS_PHP_BIN pointe sur un chemin invalide Ajuster dans Paramétrage > Pipeline PDF > Binaire php-cli (ex. /usr/bin/php8.4)
extension SimpleXML absente (badge KO dans Diagnostic) La version de PHP CLI désignée n'a pas l'extension simplexml Pointer la constante FACTURXTBNETSYS_PHP_BIN sur une autre version de PHP CLI qui inclut SimpleXML, ou demander à l'hébergeur d'activer l'extension côté CLI
Sous-processus horstoeko a échoué (rc=…) Erreur dans la lib horstoeko/zugferd ; le PDF source produit par Dolibarr peut être atypique Consulter le journal Dolibarr (préfixe FACTURXTBNETSYS) ; en dernier recours, basculer temporairement sur le mode Mustang pour identifier si le PDF source est en cause

Communs aux deux modes

Symptôme Cause probable Solution
proc_open() has been disabled dans le syslog Le serveur (souvent un VPS mutualisé) interdit l'exécution de processus externes Demander à l'hébergeur d'autoriser proc_open dans php.ini (disable_functions). Les deux modes utilisent proc_open (Mustang pour Ghostscript+Java, horstoeko pour le sous-processus PHP). Le plugin ne peut pas fonctionner sans
Page Diagnostic affiche tout en vert mais erreur à l'usage Cache OPcache PHP Redémarrer Apache/Nginx (systemctl reload apache2)

Catégories TVA. Comment le plugin classe vos factures

À chaque régénération de facture, le plugin détermine automatiquement le régime TVA applicable à chaque ligne et le code d'exonération correspondant exigé par la norme européenne EN16931. Vous n'avez rien à paramétrer : tout est déduit de la configuration de votre société, du pays du client et des taux de TVA de la facture.

Cette section explique ce que produit le plugin et dans quels cas, pour que vous puissiez vérifier que cela correspond bien à votre situation fiscale.

Les 6 cas reconnus (du plus prioritaire au moins prioritaire)

Pour chaque ligne, le plugin parcourt la liste suivante de haut en bas et s'arrête à la première règle qui s'applique.

1. Vous êtes en franchise en base de TVA (micro-entreprise)

Condition : dans Dolibarr, Accueil > Configuration > Société > « Assujetti à la TVA » = Non.

→ Toutes les lignes de toutes vos factures sont marquées « hors champ TVA » avec la mention légale « TVA non applicable, art. 293 B du CGI » ajoutée automatiquement dans le document (factures et avoirs).

Cette règle est prioritaire : si vous êtes en franchise, le plugin ne tient compte ni des taux, ni du pays du client, ni des lignes de débours. Tout sort en franchise.

2. La ligne est un débours (refacturation à l'identique d'un frais)

Condition : la ligne a été saisie via le plugin debourstbnetsys (refacturation à l'identique au client d'un frais que vous avez avancé pour son compte).

→ La ligne est marquée « exonérée » avec la justification art. 267 II 2° CGI (les débours sont par nature hors champ de la TVA, indépendamment du pays du client).

3. La ligne porte un taux de TVA standard

Condition : la ligne a un taux de TVA strictement supérieur à 0 % (5,5 %, 10 %, 20 %, etc.).

→ La ligne est marquée « TVA au taux standard », sans code d'exonération. C'est le cas le plus courant.

4. Vous facturez un client professionnel établi dans l'Union européenne

Condition : le taux est à 0 %, le client est dans un pays UE différent de la France, et son numéro de TVA intracommunautaire est renseigné dans sa fiche tiers.

→ La ligne est marquée « livraison intracommunautaire » avec autoliquidation par l'acheteur (art. 196 de la directive 2006/112/CE). Vous devrez également mentionner manuellement « Autoliquidation » sur la facture (voir « À savoir » ci-dessous).

5. Vous facturez un client hors Union européenne

Condition : le taux est à 0 % et le client est dans un pays hors UE.

→ La ligne est marquée « export », exonérée au titre de lart. 262 I du CGI.

6. Tous les autres cas avec un taux à 0 %

Condition : taux à 0 %, client en France ou client UE sans numéro de TVA intracommunautaire (cas typique : particulier européen).

→ La ligne est marquée « exonérée » avec la justification française par défaut.

À savoir avant de mettre en service

  • Numéro de TVA intracommunautaire indispensable pour vos clients UE professionnels. Si vous facturez un client allemand, italien, espagnol, etc. sans avoir renseigné son n° TVA intra dans Dolibarr, le plugin considérera qu'il s'agit d'un particulier (cas n° 6) au lieu d'une livraison intracommunautaire (cas n° 4). Pensez à compléter la fiche tiers avant la première facture.
  • Mention « Autoliquidation » à ajouter manuellement. Pour les factures intracommunautaires (cas n° 4), la réglementation impose que la facture mentionne explicitement « Autoliquidation ». Le plugin ne l'ajoute pas automatiquement pour l'instant : pensez à le faire dans le libellé de votre facture.
  • Vérifiez votre statut TVA si vous êtes micro-entreprise. Le plugin détecte la franchise via le paramètre Dolibarr Configuration > Société > « Assujetti à la TVA ». Vérifiez qu'il est bien sur Non si vous êtes effectivement en franchise. Sinon vos factures sortiront avec un régime TVA classique au lieu de la mention 293 B.
  • Si vous mettez à jour le plugin depuis une version antérieure et que vous émettez régulièrement des factures intracommunautaires ou à l'export : vos prochaines régénérations utiliseront un code TVA plus précis qu'avant (correction de conformité). Les factures déjà émises ne sont pas modifiées. Faites un essai sur une facture représentative pour vérifier qu'elle est bien acceptée par votre PDP avant de regénérer en masse.

Acomptes. Comment le plugin gère les factures d'acompte et leur imputation

Le plugin reconnaît automatiquement les factures d'acompte que vous émettez dans Dolibarr (type « Acompte ») ainsi que les factures finales sur lesquelles ces acomptes sont imputés. Vous n'avez rien à paramétrer : la détection se fait au moment de la régénération.

Cette section explique ce que produit le plugin pour que vous sachiez à quoi vous attendre dans le XML envoyé à votre PDP ou à votre client.

Si vous émettez une facture d'acompte

Quand le type de la facture Dolibarr est « Acompte » :

→ Le XML est marqué comme « facture d'acompte » (code document 386 au sens du standard EN16931, distinct du code 380 des factures classiques et du 381 des avoirs).

→ Les mentions légales obligatoires en France (indemnité de recouvrement 40 €, pénalités de retard, escompte) sont conservées : un acompte est une facture exigible au sens fiscal, la TVA y est exigible.

→ Aucune mention d'acompte antérieur n'est ajoutée (par construction, l'acompte est lui-même la première facture du cycle).

Si vous émettez la facture finale après un ou plusieurs acomptes

Quand vous facturez le solde d'une commande déjà partiellement payée par acompte(s) :

→ Le plugin lit dans Dolibarr la liste des factures d'acompte rattachées à cette facture finale et insère pour chacune une référence dans le XML (numéro de la facture d'acompte). Le destinataire et le PDP peuvent ainsi tracer l'historique complet du cycle.

→ Le montant total des acomptes imputés est inscrit dans le XML sous une balise dédiée (BT-113 « Total prepaid amount » au sens EN16931).

→ Le montant restant à payer est recalculé automatiquement comme total TTC – acomptes déjà versés. C'est ce montant net qui apparaît comme « somme due » (BT-115 « Due payable amount »), pas le total brut.

→ Si un écart d'arrondi minime existe entre le total TTC Dolibarr et le total recalculé par taux de TVA (cas rare, dépend de la composition des taux sur la facture), il est inscrit séparément (BT-114 « Rounding amount ») pour que la cohérence comptable reste vérifiable par le PDP.

À savoir avant de mettre en service (acomptes)

  • Bien lier l'acompte à la facture finale dans Dolibarr. L'imputation est lue depuis la table standard Dolibarr des « remises et avoirs déjà appliqués ». Si vous saisissez la facture finale sans déclarer explicitement l'acompte précédent (par exemple en passant par les écritures de paiement uniquement, sans utiliser le mécanisme « consommer cet acompte »), le plugin ne pourra pas en tenir compte automatiquement.
  • Avoirs imputés non comptabilisés en BT-113. Si vous imputez un avoir sur une facture finale, le plugin ne l'inclut pas dans le « total déjà payé » (BT-113). C'est conforme à la norme EN16931 qui réserve cette balise aux avances reçues (acomptes), pas aux compensations (avoirs). Le solde net reste correct car l'avoir est traité comme un mode de règlement classique côté Dolibarr.
  • Avoir d'acompte (cas marginal). Émettre un avoir qui annule une facture d'acompte fonctionne mais le XML produit ne référence pas explicitement la facture d'acompte annulée. À éviter en l'état si vous avez besoin d'une traçabilité formelle ; sinon le résultat reste valide EN16931.

Unités de mesure (UN/ECE Rec 20)

Chaque ligne de facture est exportée dans le XML EN16931 avec un code unité standardisé UN/ECE Rec 20 dans l'attribut BilledQuantity@unitCode (BT-130). Le plugin lit l'unité saisie sur la ligne Dolibarr (fk_unit → table llx_c_units) et la convertit automatiquement.

Le code Dolibarr (colonne code de llx_c_units) est utilisé comme clé de conversion plutôt que le libellé court (short_label) car celui-ci comporte des collisions (par exemple m désigne à la fois le mètre et le mois dans Dolibarr).

Table de conversion appliquée

Famille Dolibarr (code) → UN/ECE Rec 20
Temps S→SEC · MI→MIN · H→HUR · D→DAY · W→WEE · MO→MON · Y→ANN
Poids T→TNE · KG→KGM · G→GRM · MG→MGM · OZ→ONZ · LB→LBR
Longueur M→MTR · DM→DMT · CM→CMT · MM→MMT · FT→FOT · IN→INH
Surface M2→MTK · DM2→DMK · CM2→CMK · MM2→MMK · FT2→FTK · IN2→INK
Volume M3→MTQ · DM3→DMQ · CM3→CMQ · MM3→MMQ · FT3→FTQ · IN3→INQ · L→LTR · GAL→GLL
Quantité P→C62 (un/pièce) · SET→SET

Politique de fallback

  • Ligne sans unité renseignée (fk_unit vide) : code C62 (one/each), comportement neutre.
  • Unité présente mais désactivée dans llx_c_units (colonne active=0) : code C62.
  • Code Dolibarr non couvert par la table (unité personnalisée ajoutée par l'instance) : code C62, et un message LOG_INFO est tracé dans le journal Dolibarr (dol_syslog) pour permettre l'extension de la table.

Aucune configuration n'est nécessaire : le mapping s'applique à la régénération, pour les factures et les avoirs, y compris les lignes débours du plugin debourstbnetsys.


Paramétrage du plugin dans Dolibarr

Une fois l'installation terminée, tout le paramétrage du plugin se fait depuis l'interface Dolibarr. Vous trouverez quatre pages utiles :

  • Configuration > Modules > FacturX > Paramétrage : options principales du plugin. Activer ou non l'envoi des factures vers le PDP, activer ou non la validation à la régénération, taille des pages d'écran, et chemins des utilitaires système (Ghostscript, Mustang JAR, profil ICC sRGB) si vos outils ne sont pas aux emplacements par défaut.
  • Configuration > Modules > FacturX > Diagnostic : page de contrôle de santé en lecture seule. Affiche en vert/rouge l'état des prérequis (Ghostscript, Java, Mustang, profil ICC, accès à votre PDP…). En cas d'anomalie sur un chemin, l'ajustement se fait dans la page Paramétrage ci-dessus.
  • Configuration > Modules > FacturX > Adresses Peppol : gestion de votre annuaire d'identifiants Peppol/PPF (à utiliser uniquement si vous savez ce que c'est).
  • FacturX > Dispatch PDP (menu principal) : page d'envoi explicite de vos factures vers la plateforme PDP, avec filtres par période, client, état, etc.

Mode strict (en cas d'échec du pipeline Factur-X)

Sur la page Paramétrage, l'option « Mode strict » détermine ce qu'il se passe si la conversion en Factur-X plante (Ghostscript indisponible, Mustang qui échoue, profil ICC introuvable, etc.) :

  • Décoché (recommandé, valeur par défaut). Mode best-effort. Si le pipeline Factur-X échoue, le PDF classique généré par votre modèle de base (par exemple « crabe ») est conservé et la facture reste utilisable. Un avertissement orange est affiché à l'utilisateur. La facture peut être imprimée et envoyée par email. Elle n'est juste pas au format Factur-X.
  • Coché. Mode strict. Tout échec du pipeline supprime le PDF et fait remonter une erreur côté Dolibarr. Aucune facture n'est livrée tant que le problème technique n'est pas corrigé. À utiliser uniquement si vous voulez la garantie absolue qu'aucun PDF non-Factur-X ne circule (par ex. exigence contractuelle ou réglementaire).

Dans les deux cas, la validation SUPERPDP (si elle est activée) reste purement informative. Elle n'a jamais d'effet bloquant, pour ne pas paralyser la facturation en cas d'indisponibilité réseau de la plateforme.

Pour les développeurs et intégrateurs souhaitant comprendre l'architecture interne du plugin (couches HTTP, mapping XML EN16931, structure de la base, etc.), une documentation technique séparée est fournie dans le fichier ARCHITECTURE.md à la racine du plugin.


Source du plugin

Le plugin est distribué sur le Dolistore, la place de marché officielle des modules Dolibarr : www.dolistore.com/. C'est la voie recommandée pour les utilisateurs finaux qui souhaitent simplement installer le plugin sur leur Dolibarr.

Les développements sont réalisés en interne chez TBNETSYS ; le code source est hébergé sur le dépôt git privé de l'auteur.

Vous pouvez aussi simplement télécharger une archive du plugin (depuis le Dolistore) et l'extraire. Le résultat est équivalent. Reprendre ensuite la procédure « Installation du plugin » plus haut.

Note documentation : ce fichier README.md est repris tel quel dans le wiki Dolibarr de la fiche du plugin. Toute mise à jour du README est donc répercutée par son auteur dans la documentation publique du plugin côté Dolibarr.


Mise à jour du plugin

Pour mettre à jour le plugin vers une nouvelle version :

  1. Télécharger la mise à jour sur le Dolistore : www.dolistore.com/. Récupérer l'archive de la dernière version publiée et l'extraire dans le dossier custom/ de votre Dolibarr (par-dessus l'installation existante). Ne pas oublier de rétablir les droits :
    chown -R www-data:www-data /var/www/dolibarr/htdocs/custom/facturxtbnetsys
    
  2. Désactiver puis réactiver le plugin dans Accueil > Configuration > Modules, onglet « Facturation/Comptabilité ». Ce cycle force Dolibarr à recharger les définitions du module (constantes, hooks, menus, droits) et garantit que les éventuelles nouveautés apportées par la mise à jour sont prises en compte. Vos données existantes ne sont pas affectées.
  3. Reparamétrer si nécessaire. Si la mise à jour introduit de nouvelles options ou si certains paramétrages ont changé de format, vérifier la page Configuration > Modules > FacturX > Paramétrage ainsi que la page Diagnostic (toutes les vérifications doivent rester au vert).
  4. Optionnellement, lire le fichier ChangeLog.md à la racine du plugin pour prendre connaissance du détail des changements (corrections de bugs, nouvelles fonctionnalités, modifications de comportement, éventuelles actions manuelles requises).

Le fichier .secret (credentials PDP) n'est jamais embarqué dans l'archive distribuée. Il reste donc inchangé lors d'une mise à jour. Si vous extrayez l'archive par-dessus l'installation existante, prenez garde à ne pas écraser ce fichier.


Signalement de bugs

Le plugin est maintenu par son auteur qui assure la correction des anomalies rencontrées par ses utilisateurs. Pour signaler un bug, utilisez le formulaire de contact : www.tbnetsys.fr/contact/.

Ce canal est dédié exclusivement aux corrections de bugs, c'est-à-dire à des comportements du plugin qui ne sont pas conformes à ce que décrit cette documentation ou à la norme Factur-X / EN16931. Il ne s'agit pas d'un service d'assistance utilisateur : les questions d'installation Dolibarr, de paramétrage métier, de fiscalité, ou plus généralement « comment faire X dans Dolibarr » ne relèvent pas de ce canal et ne recevront pas de réponse.

Pour qu'un signalement soit exploitable, soyez précis et clair dans la description du problème. Un bon rapport de bug contient au minimum :

  • Versions : version de Dolibarr, version de PHP, version du plugin (visible sur la page Configuration > Modules), système d'exploitation du serveur.
  • Contexte précis : sur quelle facture (type : standard, acompte, avoir ; pays du client ; régime TVA), à quelle étape (régénération PDF, envoi PDP, validation Mustang…).
  • Comportement observé : message d'erreur exact (copier-coller, pas une reformulation), capture d'écran si pertinent.
  • Comportement attendu : ce qui aurait dû se produire à la place.
  • Reproductibilité : le bug se produit-il à chaque tentative ou de manière intermittente ? sur toutes les factures ou seulement certaines ?
  • Journaux Dolibarr : extrait du journal (Accueil > Configuration > Outils > Journaux) filtré sur le préfixe FACTURXTBNETSYS au moment de l'incident.

Les rapports vagues du type « ça ne marche pas » ou « le PDF est cassé » ne permettent pas de reproduire ni de corriger le problème et ne seront pas traités.


Clause de non responsabilité

Le plugin est exclusivement destiné aux professionnels assujettis aux obligations de facturation électronique en France au sens des articles 289 bis et suivants du Code général des impôts. Il n'est ni conçu, ni proposé, ni destiné à un usage par un consommateur au sens de l'article liminaire du Code de la consommation, ni par un non-professionnel.

Le plugin est diffusé sous licence libre GPL-3.0-or-later, qui en garantit le droit de redistribution et d'étude du code source conformément à ses termes. Sa licence d'utilisation est concédée à titre onéreux, selon les conditions tarifaires en vigueur, dans le cadre d'une relation strictement entre professionnels, à l'exclusion de toute relation entrant dans le champ d'application du Code de la consommation. L'acquisition, l'installation ou l'utilisation du plugin valent reconnaissance par l'utilisateur de sa qualité de professionnel ainsi qu'acceptation sans réserve des présentes conditions.

Le plugin est fourni « en l'état », sans aucune garantie, expresse ou implicite, de quelque nature que ce soit. Notamment, mais sans s'y limiter, de qualité marchande, d'adéquation à un usage particulier, de conformité réglementaire ou fiscale, ni de continuité de service.

L'utilisation du plugin se fait aux risques et périls de l'utilisateur. Il appartient à ce dernier de vérifier, sous sa seule responsabilité, que les factures Factur-X produites sont conformes à ses obligations légales, fiscales et contractuelles, et qu'elles sont effectivement acceptées par ses destinataires et par sa Plateforme de Dématérialisation Partenaire (PDP).

Ni l'auteur, ni TBNETSYS, ni les contributeurs ne pourront en aucun cas être tenus responsables d'un quelconque dommage direct ou indirect (notamment, mais sans s'y limiter : perte de données, perte de chiffre d'affaires, perte d'exploitation, rejet de factures par un destinataire ou par un PDP, redressement fiscal, sanction administrative, dommage matériel, immatériel ou moral) résultant de l'installation, de l'utilisation, du dysfonctionnement ou de l'impossibilité d'utiliser le plugin, même dans l'hypothèse où l'auteur, TBNETSYS ou un contributeur auraient été informés de l'éventualité d'un tel dommage.

Cette clause s'applique dans toute la mesure permise par la loi applicable.

Le plugin et la présente clause sont régis par le droit français. Entre professionnels, en cas de litige relatif à l'installation, à l'utilisation, au fonctionnement ou à l'absence de fonctionnement du plugin et à défaut de résolution amiable préalable, compétence exclusive et expresse est attribuée au Tribunal judiciaire de Perpignan, y compris en cas de référé, de pluralité de défendeurs ou d'appel en garantie, nonobstant toute clause contraire. Si l'utilisateur devait néanmoins être qualifié de consommateur ou de non-professionnel par une juridiction, les règles impératives de protection prévues par le droit français s'appliqueront, sans que cela ne remette en cause les autres stipulations de la présente clause, qui demeurent applicables dans toute la mesure permise par la loi.


Auteur et licence

Auteur : Thierry Bazzanella
Contact : www.tbnetsys.fr/contact/
(c) 2026 TBNETSYS. All rights reserved
Licence : GPL-3.0-or-later


Contributeurs et béta-testeurs

Les contributeurs (correction de bugs, développement de nouvelles fonctionnalités) et les béta-testeurs ayant téléchargé le plugin sont éventuellement les bienvenus. Nous pouvons en discuter par téléphone après un premier contact par email. Pour l'instant, l'auteur en assure la maintenance et les évolutions.

Un environnement dédié et privé sous GitLab est mis à disposition pour ce plugin : il regroupe le code source, le suivi des tickets, les branches de travail et les itérations de test. L'environnement est très orienté développement et cycle de vie logiciel (branches, revues, intégration continue, jalons, releases). Il s'adresse donc à des intervenants à l'aise avec ces pratiques.

La documentation du code source est intégrée à celui-ci au format PhpDoc. L'outil de développement recommandé est Visual Studio Code avec les extensions PHP Intelephense (éditeur : Intelephense) et PHP Debug (éditeur : Xdebug).

La communication entre tous les intervenants se fait principalement par ticket (issues GitLab) : signalement, discussion technique, suivi d'avancement, validation. Cela garantit la traçabilité des décisions et permet à chacun de retrouver le contexte d'un changement à tout moment.

Pour rejoindre l'environnement contributeurs/béta-testeurs, prendre contact via le formulaire : www.tbnetsys.fr/contact/.


Prix du plugin

Le plugin est diffusé en paiement unique. Une fois acquis, il vous appartient sans abonnement, sans coût récurrent et sans limite de durée d'utilisation.

Période Prix
Tarif de lancement, jusqu'au 31 août 2026 149 € TTC
À compter du 1er septembre 2026 199 € TTC

L'auteur n'est pas assujetti à la TVA (franchise en base, art. 293 B du CGI). Les prix indiqués sont nets de taxe : aucun montant de TVA ne s'ajoute au prix affiché.

Mises à jour à vie incluses. Chaque acquéreur reçoit toutes les versions futures du plugin sans frais supplémentaire : corrections de bugs, mises en conformité réglementaire, nouvelles fonctionnalités, nouveaux profils EN16931, prise en charge des futures versions de Dolibarr. Une seule acquisition couvre l'usage du plugin sur la durée.

Modèle de financement. Chaque utilisateur participe ainsi au coût de développement et au temps passé sur la maintenance, le suivi des évolutions de la norme Factur-X, l'adaptation aux versions successives de Dolibarr ainsi qu'à la correction des anomalies signalées (cf. § Signalement de bugs). C'est ce financement collectif qui permet à l'auteur de continuer à faire vivre le plugin dans la durée.

Aucune obligation, d'aucune sorte, de l'auteur ni des contributeurs. Les mises à jour à vie comme la correction des bugs sont fournies dans la mesure des moyens et de la disponibilité de l'auteur et de ses éventuels contributeurs, sans engagement d'aucune sorte : ni de fréquence, ni de délai, ni de périmètre, ni de résultat, ni de continuité de service. L'acquisition du plugin n'ouvre droit à aucune prestation contractuelle de maintenance, de support ou d'évolution. Le plugin est fourni « en l'état » conformément à la § Clause de non responsabilité, qui prévaut sur la présente section en cas de divergence d'interprétation.

Support payant (optionnel)

Au-delà du plugin lui-même (paiement unique avec mises à jour à vie, sans obligation), un service d'assistance technique payante peut être souscrit ponctuellement, à la demande, par les utilisateurs souhaitant un accompagnement dépassant le cadre du simple signalement de bugs.

Tarif horaire : 85 € TTC / heure. L'auteur n'étant pas assujetti à la TVA (franchise en base, art. 293 B du CGI), aucun montant de TVA ne s'ajoute au prix affiché.

Modalités de facturation. Facturation à la demi-heure indivisible commencée, avec un minimum facturable d'une heure par intervention. Toute prestation est précédée d'un devis écrit que l'utilisateur doit accepter avant le démarrage de l'intervention. Le devis fixe un plafond horaire ferme propre à l'intervention. Aucune heure facturable au-delà de ce plafond ne peut être engagée sans acceptation écrite préalable d'un avenant ou d'un nouveau devis. À défaut d'accord pour poursuivre, l'intervention est interrompue à due concurrence du plafond initial.

Périmètre. À distance uniquement : email, formulaire de contact, partage d'écran ou accès SSH ponctuel sur autorisation explicite et révocable de l'utilisateur. La prestation porte exclusivement sur le plugin FacturXTbnetsys et son intégration dans Dolibarr (paramétrage, diagnostic, accompagnement à l'installation, analyse de cas particuliers et lecture de journaux). Sont exclus du périmètre : l'administration Dolibarr générale, le conseil fiscal, le conseil métier, l'intervention sur d'autres modules tiers et le développement spécifique non directement lié à une anomalie du plugin.

Heures ouvrées (heure de Paris).

Jour Plage horaire
Lundi à vendredi 9h–12h et 14h–18h
Samedi, dimanche, jours fériés légaux français Fermé

Délais cibles de prise en charge. Les délais ci-dessous courent à compter de la réception de la demande pendant les heures ouvrées : une demande arrivée hors plage est réputée reçue à l'ouverture suivante. Ces délais sont des objectifs cibles à effort raisonnable, jamais des engagements contractuels chiffrés opposables.

Niveau de gravité Définition Objectif cible de prise en charge
Critique Production de factures Factur-X totalement interrompue, aucun contournement disponible 4 heures ouvrées
Majeur Fonctionnalité importante dégradée mais contournement possible (par exemple : mode Mustang en échec mais mode horstoeko fonctionnel) 1 jour ouvré
Mineur Gêne ponctuelle, question, optimisation, demande de paramétrage ou d'éclaircissement 3 jours ouvrés

Obligation de moyen, à l'exclusion de toute obligation de résultat. Le support payant constitue une prestation de services au sens du droit français, exécutée selon une obligation de moyen uniquement. L'auteur s'engage à mettre en œuvre ses compétences professionnelles et le temps nécessaire pour tenter d'apporter une réponse ou une résolution, sans garantir aucun résultat : ni la résolution effective de la difficulté signalée, ni le respect des délais cibles ci-dessus, ni l'absence de récidive, ni la compatibilité avec l'environnement particulier de l'utilisateur. Les délais cibles ne sont assortis d'aucune pénalité et n'ouvrent droit à aucune indemnité, remise ou avoir en cas de dépassement. Cette obligation de moyen prévaut sur toute interprétation contraire pouvant résulter de la rédaction de la présente section.

Engagement d'information en cours d'intervention. Si l'auteur estime, en cours d'analyse, que la difficulté ne pourra vraisemblablement pas être résolue dans le plafond horaire du devis accepté, ou que la cause apparente est extérieure au plugin (anomalie Dolibarr, conflit avec un autre module tiers, configuration système hors périmètre, environnement non reproductible), il en informe l'utilisateur avant de poursuivre la facturation au-delà du temps déjà engagé. La poursuite de l'intervention requiert alors l'acceptation écrite de l'utilisateur. Cet engagement d'information demeure une modalité d'exécution de l'obligation de moyen. Il n'emporte aucune obligation de résultat.

Exclusivement et uniquement sous forme de services. La prestation ne comprend ni produit logiciel additionnel, ni licence supplémentaire, ni garantie, ni assurance, ni cession de droits, ni livrable autre que le compte-rendu d'intervention. Ce compte-rendu mentionne au minimum : la nature des vérifications effectuées, les éléments diagnostiqués, les actions menées, les points restant ouverts ainsi que les recommandations à destination de l'utilisateur. Il est remis quel que soit le résultat constaté. Le règlement rémunère exclusivement le temps de travail effectivement passé en assistance, indépendamment du résultat constaté à l'issue de l'intervention.

Procédure d'accès au support payant. Le support payant n'est pas accessible directement sur facture spontanée. Il suppose au préalable :

  1. Un premier contact via le formulaire : www.tbnetsys.fr/contact/, en présentant le contexte de la demande (instance Dolibarr, version du plugin, nature du besoin d'accompagnement).
  2. La signature d'un contrat de support entre l'utilisateur (en qualité de professionnel) et TBNETSYS, qui formalise le tarif horaire, les modalités de facturation, le périmètre, les délais cibles, l'obligation de moyen, l'exclusion de l'obligation de résultat ainsi que les autres conditions rappelées dans la présente section.
  3. L'acceptation écrite d'un devis propre à chaque intervention, dans le cadre du contrat ainsi signé.

Aucune intervention payante n'est démarrée tant que ces trois étapes ne sont pas complétées. Sans contrat de support signé, seul le canal gratuit de signalement de bugs (cf. § Signalement de bugs) reste accessible, dans les limites qui y sont décrites.

La présente offre de support payant ne modifie pas la § Clause de non responsabilité, qui prévaut intégralement sur tout point non explicitement couvert ici.