Certains d'entre-vous ont peut-être créé leur société et ont alors été confrontés aux joies de la comptabilité… Cette dépêche les intéressera particulièrement ! Le développement de ce premier module libre de facturation électronique pour Odoo est le fruit d'une histoire amusante que je vais vous raconter.
NdM. : pour mémoire, Odoo est un progiciel libre de gestion intégré, anciennement connu sous le nom d'OpenERP.
Sommaire
Le problème
Un week-end de septembre 2015, quelques jours avant la date limite de dépôt de la liasse fiscale (la déclaration fiscale qui sert de base au calcul de l'impôt sur les sociétés) de notre SS2L Akretion, un de mes associés, développeur Odoo lui aussi, termine sa comptabilité de l'année écoulée pour pouvoir éditer son bilan. « Terminer » n'est pas le bon terme, je devrai plutôt dire « commence sa comptabilité », en tout cas en ce qui concerne la saisie des factures fournisseur !
Saisir ses factures fournisseur dans son logiciel comptable, même s'il s'appelle Odoo, n'est pas une partie de plaisir, et il a donc attendu la dernière minute pour s'y mettre. Il doit notamment saisir de nombreux billets de train achetés sur Capitaine Train dont il a l'historique dans sa boite mail avec le justificatif de paiement sous forme de fichier PDF en pièce jointe.
La solution
Et comme tout bon développeur, il est un peu paresseux. Plutôt que de se mettre à la tâche, il tente de développer un script pour automatiser ce travail ingrat et rébarbatif. Après quelques heures de travail, le script est au point : il prend les reçus PDF de CapitaineTrain, extrait le texte du PDF, récupère les informations pertinentes (date, descriptif du trajet, montant) via des expressions régulières et créé la facture fournisseur dans Odoo !
Si cela marche pour les billets de train, cela doit aussi pouvoir marcher pour les factures de téléphone mobile, d'accès Internet, de loyer, etc. Autant de factures qu'il faut saisir chaque mois dans son logiciel comptable ! L'idée est lancée.
Le produit
Elle aboutit au développement du module Odoo account_invoice_import annoncé comme un cadeau de Noël à la communauté Odoo et disponible sur le projet account-invoicing de l'Odoo Community Association (OCA). Ce module utilise la bibliothèque Python invoice2data qui contient des templates pour de nombreux fournisseurs, dont beaucoup de fournisseurs français.
Dès janvier 2016, j'équipe nos clients utilisateurs d'Odoo de ce nouveau module et je leur montre comment ils peuvent importer leurs factures de téléphone mobile, d'électricité, leurs billets de train… Ainsi que les factures de notre SS2L !
Un mois après le déploiement de ce nouveau module, ma société met à jour son serveur Odoo vers une nouvelle version et adopte un nouveau moteur de rapport pour les factures. La mise en page de la facture est complètement revue, et les expressions régulières destinées à extraire les informations de la facture PDF pour créer la facture fournisseur dans Odoo ne fonctionnent plus !
Un obstacle
Après à peine un mois d'utilisation, on atteint déjà les limites du système : tout changement dans la mise en page de la facture du fournisseur impose de mettre à jour le template d'import. Pour éviter cet écueil, il faut passer à la facturation électronique !
Et me voilà reparti à coder. Dans la seconde partie de la dépêche vous apprendrez certains principes de la facturation électronique, en particulier le format ZUGFeRD, et comment il est possible de générer et d'importer des factures électroniques ZUGFeRD dans Odoo.
Aujourd'hui, quand une entreprise reçoit une facture PDF par courriel, le comptable va visualiser la facture avec son logiciel de lecture PDF préféré et, ensuite, il va saisir manuellement la facture dans le logiciel comptable de l’entreprise pour générer les écritures comptables dans le journal d’achats. Pour éviter cela, il faut automatiser l’import des factures fournisseur dans le logiciel comptable, ce qui nécessite d’avoir des données structurées sur la facture afin de pouvoir l’importer de façon fiable dans le logiciel comptable de l’entreprise.
Le format PDF est parfait pour visualiser ou imprimer une facture, mais il ne fournit pas d’informations structurées sur la facture. Pour cela, mieux vaut utiliser un fichier XML. Il existe deux standards internationaux pour les factures XML :
- Universal Business Language (UBL) normalisé par l’OASIS,
- Cross Industry Invoice (CII) publié par UN/CEFACT, une agence des Nations-Unies.
La solution serait-elle d’envoyer des factures sous forme de fichiers XML par courriel ? Peut-être pas. En effet, si votre entreprise est équipée d’un logiciel comptable moderne capable de générer des factures sous forme de fichiers XML, comment être sûr que vos clients possèdent un logiciel comptable moderne capable de lire de telles factures XML ? Et si votre client ne peut pas lire vos factures, il y a fort à parier que vous ne serez jamais payé ! C’est pour résoudre ce problème que le standard ZUGFeRD a été inventé. Ce standard fournit une solution intelligente et pragmatique à ce problème : il définit une façon d’intégrer un fichier XML à l’intérieur de la facture PDF. Avec l’arrivée de la norme PDF/A-3 en 2012, il est devenu possible d’intégrer un ou plusieurs fichiers de n'importe quel format à l’intérieur d’un document PDF (sous Acrobat Reader, il faut cliquer sur l’icône représentant un trombone pour lister les fichiers intégrés dans le document PDF ; si vous connaissez des lecteurs PDF libres capables de lister les fichiers intégrés, signalez-les en commentaire !). Ainsi, une facture au format ZUGFeRD est simplement une facture PDF avec un fichier XML embarqué au format Cross Industry Invoice (CII).
L’Allemagne est l’auteur du standard ZUGFeRD et elle incite ses entreprises à envoyer leurs factures dans ce format. À partir du 1er janvier 2017, les grandes entreprises fournisseur de l’État français auront l’obligation d’envoyer à l’administration des factures électroniques, et cette obligation sera étendue progressivement à toutes les entreprises jusqu’au 1er janvier 2020. En France, le FNFE-MPE (Forum National de la Facture Electronique et des Marchés Publics Electroniques, qui n'a pas encore de site web !) coordonne la standardisation des factures électroniques et adopte la même approche technique que le standard ZUGFeRD : un fichier XML standardisé embarqué dans une facture PDF. Ce communiqué de presse annonce que la France et l’Allemagne travaillent ensemble pour adopter un standard commun pour les factures électroniques.
Certains pays, comme par exemple la Belgique, ont choisi une autre approche : le format belge de facture électronique e-fff spécifie que la facture est un fichier XML au format UBL à l'intérieur duquel on intègre le fichier PDF. C'est exactement l'inverse de l'approche franco-allemande ! Si vous n'avez pas de logiciel comptable moderne capable de lire la facture XML, vous ne pourrez même pas accéder au fichier PDF pour voir la facture, c'est la double peine ! Une histoire belge en quelque sorte… Aux Pays-Bas, la norme UBL a également été choisie ; la pratique semble être d'envoyer à la fois le fichier XML et le fichier PDF côte à côte.
J'ai développé le support de la norme ZUGFeRD à la fois pour la génération des factures client (module account_invoice_zugferd) et pour l’import des factures fournisseur (module account_invoice_import_zugferd) dans Odoo. Ces développements sont publiés sous la licence AGPL dans le projet account-invoicing de l’Odoo Community Association (OCA) sur Github. Ce screencast en anglais (22 minutes, format OGV) offre une démonstration de l’utilisation d’Odoo à la fois pour l'import de factures PDF normales, mais aussi pour la génération de factures électroniques ZUGFeRD et leur import dans Odoo. J'ai également développé un module d'import de factures XML au format UBL (module account_invoice_import_ubl).
Ces modules sont la première implémentation libre de la norme ZUGFeRD en Python. C'est aussi à ma connaissance la première implémentation libre de la norme ZUGFeRD dans un ERP opensource. Le module utilise la bibliothèque Python PyPDF2 pour l'ajout du fichier XML à l'intérieur du fichier PDF et pour toutes les autres contraintes imposées sur le fichier PDF par la norme ZUGFeRD. C'est une alternative au module Odoo propriétaire itis_account_invoice_zugferd vendu au prix de 800 € sur l'App Store d'Odoo et qui nécessite Java pour la génération de la facture ZUGFeRD.
Les factures électroniques sont amenées à remplacer les factures papier, tout comme le courrier électronique est en passe de remplacer le courrier postal. Selon le gouvernement français, la généralisation de la facturation électronique devrait générer des économies de 335 millions d’euros pour les entreprises françaises et de 375 millions d'euros pour l’État (cf. cet article).
Aller plus loin
- Annonce détaillée sur les factures électroniques ZUGFeRD (365 clics)
- Annonce précédente sur l'import de factures PDF "normales" (193 clics)
- Odoo Community Association (153 clics)
- Odoo (394 clics)
- Le code des modules sur Github (232 clics)
# Merci !
Posté par jnoel . Évalué à 6.
Encore une fois, je suis impressionné par le boulot fait sur Odoo par la société Akretion.
Pour ma part je me suis déjà servi de plusieurs de vos modules pour divers projets (dernièrement ooor et pos_customer_display et peut-être d'autres sans savoir que c'est de vous !).
Merci pour tout ça et bonne continuation à vous.
# Lecteurs PDF capables de voir les documents intégrés
Posté par ariasuni . Évalué à 9.
Okular (le lecteur de PDF de KDE) informe de la présence d’un fichier intégré à un PDF via une petite notification et permet d’y accéder via cette dernière, ou en passant par Fichier → Fichiers intégrés.
Écrit en Bépo selon l’orthographe de 1990
[^] # Re: Lecteurs PDF capables de voir les documents intégrés
Posté par Alexis de Lattre (site web personnel) . Évalué à 3.
Merci pour l'info ! C'est une bonne nouvelle de savoir qu'il existe un lecteur PDF libre capable de lister les fichiers intégrés (comme je ne suis pas sous KDE, je ne l'avais pas testé). Est-ce que Okular sait aussi vérifier les signatures des PDFs ?
[^] # Re: Lecteurs PDF capables de voir les documents intégrés
Posté par ariasuni . Évalué à 3. Dernière modification le 27 mars 2016 à 23:06.
Aucune idée. Comment je peux vérifier ça?
Édition: un rapport de bug ouvert indique que ça n’est pas encore possible d’implanter ça car la bibliothèque utilisée, poppler, ne le permet pas.
Écrit en Bépo selon l’orthographe de 1990
[^] # Re: Lecteurs PDF capables de voir les documents intégrés
Posté par Alexis de Lattre (site web personnel) . Évalué à 4.
D'ailleurs, il faudrait se bouger pour implémenter la possibilité de signer un PDF en utilisant une lib Python libre. A ma connaissance, aucune lib Python libre ne propose cette fonctionnalité. Pour l'instant, le module Odoo dispo dans l'OCA qui permet de signer les PDFs (report_qweb_signer) utilise une lib Java: https://github.com/OCA/reporting-engine/tree/8.0/report_qweb_signer Il existe une lib Python proprio qui signe des PDFs, disponible ici : http://www.kryptokoder.com/index.html
De plus en plus, il est demandé à ce que les factures PDF soit signées pour qu'elles aient une valeur probante, cf par exemple https://chorus-factures.budget.gouv.fr/accueil/aidePdfSigne
et c'est même écrit dans la loi depuis 2013, cf ces explications : http://www.journaldunet.com/management/expert/56880/vos-factures-sont-elles-conformes-aux-nouvelles-regles-applicables.shtml
En résumé, il est encore possible d'envoyer des PDFs non signés, mais il faut alors une "piste d'audit documentée" pour pouvoir rattacher la facture à un contrat/BL et fournir tous les autres documents relatifs à la vente. Alors que, si la facture est un PDF signé, il n'y a besoin de rien d'autre que la facture, donc c'est plus simple.
Et il faudrait aussi un lecteur PDF libre capable de vérifier les signatures…
[^] # Re: Lecteurs PDF capables de voir les documents intégrés
Posté par Alex G. . Évalué à 3.
Merci pour l'article.
Si on pouvait avoir un fichier de test on pourrait vérifier sur d'autres lecteurs :-)
[^] # Re: Lecteurs PDF capables de voir les documents intégrés
Posté par Alexis de Lattre (site web personnel) . Évalué à 3.
Tu peux trouver une douzaine de factures ZUGFeRD de test ici : https://github.com/akretion/account-invoicing/tree/8.0-add-pdf-invoice-import/account_invoice_import_zugferd/test/invoices (c'est le jeu d'exemple fourni par la FeRD).
[^] # Re: Lecteurs PDF capables de voir les documents intégrés
Posté par jyes . Évalué à 7. Dernière modification le 29 mars 2016 à 08:52.
Avec Evince (le lecteur Gnome), le document XML apparaît comme pièce jointe (il y a un onglet pour ça dans la barre latérale, appuyer sur F9 si elle n’est pas visible).
En ligne de commande, il y a aussi "pdfdetach" dans les poppler-utils (nom du paquet Debian) :
Bref, les outils principaux qui utilisent Poppler semblent équipés pour la lecture des pièces jointes. Pour les signatures, c’est une autre histoire.
[^] # Re: Lecteurs PDF capables de voir les documents intégrés
Posté par gouttegd . Évalué à 5.
Ça arrive bientôt dans Poppler, restera ensuite aux applications à s’en servir.
[^] # Re: Lecteurs PDF capables de voir les documents intégrés
Posté par Alexis de Lattre (site web personnel) . Évalué à 2.
Si j'avais su… ! Effectivement, Evince sait lire les fichiers embarqués : dans la barre latérale, il faut sélectionner "Pièces jointes" dans la liste déroulante (qui affiche "Vignettes" par défaut). En fait, je n'avais même pas vu qu'on pouvait sélectionner autre chose que "Vignettes" :(
Donc les lecteurs PDF par défaut de Gnome et KDE savent lire les pièces jointes des PDFs, c'est super !
# Les factures dans le "low cost"
Posté par Zenitram (site web personnel) . Évalué à 2.
Il a de la chance d'avoir des PDF. Parfois, même pas de PDF! (genre AirBnb)
du coup, me voila à "imprimer en PDF" des mails venant de grosses boites, alors pour que ce soit standardisé…
La gestion manuelle des factures, c'est juste chiant, des fois on se demande si on est en 2016.
En tous cas sympa de voir qu'il y a une forme d'avance, même si ce passage fait peur (je prend le cas belge pour de l'humour tellement c'est délirant) :
Le problème est qu'on construit un truc qu'on appelle "Union Européenne", dans un truc qu'on appelle "Monde".
C'est vraiment dommage d'encore une fois ne pas arriver à se mettre d'accord sur une norme internationale (après, quand je vois qu'on n'est même pas encore foutus de se mettre d'accord entre US et EU pour une bête date de changement d'heure… Je me dis que la connerie dans les volontés de faire "sa" norme n'est pas encore tuée).
# Akretion
Posté par cluxter . Évalué à 3.
J'ai une question concernant l'entreprise Akretion : quel est le business model ? Vous programmez des modules à la demande pour des clients, c'est ça ? Et vous leur facturez les modules, que vous mettez en open source ?
Je suis curieux de savoir pour comprendre comment faire à la fois de l'open source et suffisamment de chiffre d'affaires pour payer les factures. Il existe différents business model dans le monde de l'open source, j'aimerais juste savoir quel est le votre. Merci.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.