<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.dolibarr.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Florian.mortgat</id>
	<title>Dolibarr ERP CRM Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.dolibarr.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Florian.mortgat"/>
	<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php/Special:Contributions/Florian.mortgat"/>
	<updated>2026-10-24T17:12:51Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.17</generator>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Loi_finances_sur_les_logiciels_de_caisse_et_Certification_NF525_ou_LNE&amp;diff=56232</id>
		<title>Loi finances sur les logiciels de caisse et Certification NF525 ou LNE</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Loi_finances_sur_les_logiciels_de_caisse_et_Certification_NF525_ou_LNE&amp;diff=56232"/>
		<updated>2023-04-03T09:24:35Z</updated>

		<summary type="html">&lt;p&gt;Florian.mortgat: /* Conclusion pour le logiciel Open Source Dolibarr ERP CRM */ quelque → quel que&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;seo metak=&amp;quot;loi finance 2016, loi finance 2018, loi finance 2019, NF525, logs inaltérables, logiciels de caisse, logiciels comptabilité, TPE&amp;quot; /&amp;gt;&lt;br /&gt;
Ceci est une page d&#039;explication  de l&#039;Article 88 de la Loi finance 2016 (n° 2015-1785 du 29 décembre 2015), communément appelée Loi anti-fraude à la TVA, applicable au 1er janvier 2018 en France (cette loi ayant donné lieu à la certification NF525 ou encore au principe d&#039;attestation de conformité).&lt;br /&gt;
&lt;br /&gt;
=Résumé=&lt;br /&gt;
&lt;br /&gt;
La &#039;&#039;&#039;loi finances 2016, article 88 modifiant le 286 du CGI&#039;&#039;&#039;, impose à tous les commerçants, &#039;&#039;&#039;assujettis à la TVA hors franchise en base de TVA&#039;&#039;&#039; (et seulement ces derniers) ET qui sont équipés d&#039;un &amp;quot;logiciel ou système de caisse&amp;quot; (comprendre logiciel d&#039;encaissement d&#039;argent, cela inclut les logiciels de gestion) ET qui réalisent de l&#039;encaissement de particuliers, d&#039;utiliser un logiciel dans un cadre &amp;quot;conforme&amp;quot; à la loi finance 2016, et ce dès le 1er janvier 2018.&lt;br /&gt;
&lt;br /&gt;
La &amp;quot;conformité Loi Finance&amp;quot; dite aussi &amp;quot;Anti Fraude TVA&amp;quot; est absolument sans aucun rapport avec la notion de &amp;quot;Compatible avec les normes de logiciels comptables&amp;quot;, normes requises pour établir les documents fiscaux officiels et les télétransmettre à l&#039;administration. Ces normes (par exemple &amp;quot;la compatibilité avec le format FEC&amp;quot;, obligatoire depuis le 1er janvier 2014 et [https://www.legifrance.gouv.fr/affichCodeArticle.do?cidTexte=LEGITEXT000006069583&amp;amp;idArticle=LEGIARTI000027804775 défini ici], ou encore &amp;quot;la compatibilité pour télétransmission EDI&amp;quot;) existent d&#039;ailleurs depuis plusieurs années, bien avant la loi finance 2016, et concernent uniquement le &amp;quot;logiciel de comptabilité&amp;quot; de l&#039;expert comptable qui approuve les comptes, logiciel utilisé en fin de chaîne pour produire la liasse fiscale. Seul ce dernier logiciel a cette contrainte de &amp;quot;compatibilité logiciel comptable&amp;quot; : le logiciel de gestion ou de suivi de l&#039;entreprise (comme par exemple Dolibarr), même si il est utilisé pour réaliser une comptabilité interne de l&#039;entreprise (par exemple en préparation d&#039;export vers le logiciel de l&#039;expert-comptable, ou utilisé pour offrir un suivi ou mâcher le travail du comptable pour réduire son coût), n&#039;a aucune obligation sur le point de &#039;&#039;&#039;logiciel comptable&#039;&#039;&#039;, si c&#039;est un autre qui sert pour établir les documents légaux...&lt;br /&gt;
&lt;br /&gt;
Par contre, ce logiciel de gestion d&#039;entreprise peut avoir l&#039;obligation d&#039;être &#039;&#039;&#039;conforme Loi finance 2016 - Anti Fraude TVA&#039;&#039;&#039;. Ce qui est tout autre chose. Cette conformité s&#039;applique à tout &amp;quot;logiciel d&#039;encaissements&amp;quot;, ce qui est différent de &amp;quot;logiciel comptable&amp;quot; (et donc s&#039;applique aux logiciels de facturation ou de gestion avec saisie d&#039;encaissements, aux logiciels de caisse enregistreuse (Point de Vente) et, éventuellement, aux logiciels de comptabilité si c&#039;est lui qui est utilisé pour saisir et suivre les encaissements clients, ce qui est rarissime car cela sous-entend que la gestion de l&#039;entreprise est faite directement dans le logiciel du comptable qui certifie les comptes).&lt;br /&gt;
&lt;br /&gt;
Cette conformité &amp;quot;Loi Finance&amp;quot; pour son logiciel d&#039;encaissement, peut s&#039;obtenir de 3 manières différentes (&#039;&#039;&#039;une seule des 3 solutions suffit&#039;&#039;&#039;):&lt;br /&gt;
&lt;br /&gt;
*Par l&#039;utilisation d&#039;une version &#039;&#039;&#039;certifiée Loi Finance&#039;&#039;&#039; du logiciel (Exemple via l&#039;obtention de la certification LNE ou l&#039;obtention de la norme NF525 de l&#039;AFNOR). Une version certifiée l&#039;est pour tout le monde mais, pour évoluer, il faut attendre la prochaine version certifiée, et le processus de certification est long et coûteux pour l&#039;éditeur. Le principe de certification n&#039;est donc plus adapté aux logiciels modernes ni aux logiciels en Cloud/SaaS qui évoluent rapidement). Le choix de conformité du logiciel par obtention d&#039;une certification LNE ou NF525 n&#039;est donc pas celui fait majoritairement par les éditeurs. La certification LNE ou NF525 n&#039;est donc absolument pas obligatoire (même si les éditeurs qui ont fait ce choix essaie de sous-entendre le contraire), à condition qu&#039;une des autres solutions pour être conforme soit mis en oeuvre (voir point suivants).&lt;br /&gt;
&lt;br /&gt;
ou bien&lt;br /&gt;
&lt;br /&gt;
*Par obtention d&#039;une &#039;&#039;&#039;attestation individuelle de conformité Loi Finance&#039;&#039;&#039; décernée par une société Tiers, comme un éditeur ou intégrateur informatique (Voici un exemple de modèle d&#039;attestation suggéré par le gouvernement: http://bofip.impots.gouv.fr/bofip/10692-PGP.html). Une attestation est individuelle, chaque société utilisatrice doit en obtenir une, auprès d&#039;un Tiers, pour elle même. Remarque: pour cette solution, il faut employer le terme de &amp;quot;Attestation&amp;quot; et non de &amp;quot;Certification&amp;quot;, ce dernier terme étant réservé pour la première solution. Mais hélas 9 fois sur 10, on trouvera le terme &amp;quot;certification&amp;quot; ou &amp;quot;certifié&amp;quot; pour ce cas également, car le plus utilisé et mieux compris du grand publique, entrainant des confusions.&lt;br /&gt;
&lt;br /&gt;
ou bien&lt;br /&gt;
&lt;br /&gt;
*En &#039;&#039;&#039;se délivrant à soi-même cette attestation&#039;&#039;&#039; (sans la demander à un tiers donc), on parle d&#039;auto-attestation, mais ce cas est limité aux sociétés qui ont, entre autre, une activité &#039;&#039;&#039;avérée&#039;&#039;&#039; d&#039;édition de logiciel de caisse (le code Nace n&#039;ayant  qu&#039;une valeur indicative statistique, c&#039;est votre activité réelle, dont il vous revient d&#039;en démontrer le côté avéré qui sera pris en compte, et non un code Nace spécifique comme cela avait été cité dans des versions intermédiaires de textes sur le travail de la loi)&lt;br /&gt;
&lt;br /&gt;
Le chapitre &amp;quot;Historique&amp;quot; vous permet de voir les rebondissements et changements de direction de la loi. Connaitre ces rebondissements aide à comprendre pourquoi de nombreux acteurs se sont trompés ou continuent de se tromper sur cette loi. Le chapitre d&#039;après &amp;quot;Questions / Réponses&amp;quot; vous offre une vue rapide de la loi &#039;&#039;&#039;définitive&#039;&#039;&#039; par une approche de questions/réponses.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Historique de la définition de la loi et rebondissements==&lt;br /&gt;
&lt;br /&gt;
Pour ceux qui ont le temps de lire (sinon allez directement au chapitre &amp;quot;Conclusion&amp;quot; ou aux &amp;quot;FAQ&amp;quot;), voici un flux qui décrit les documents originaux qui ont été communiqués par le gouvernement et les mises à jours qui ont suivi pour définir le périmètre et la conclusion de la loi, avec les rebondissements :&lt;br /&gt;
&lt;br /&gt;
*Voici l&#039;article, &#039;&#039;&#039;pour sa publication au BOFIP, de la version définitive du 04/07/2018&#039;&#039;&#039;: https://bofip.impots.gouv.fr/bofip/10691-PGP.html?identifiant=BOI-TVA-DECLA-30-10-30-20180704&lt;br /&gt;
&lt;br /&gt;
Pour résumer, cette publication indique qu&#039;il faudra, pour toute société/organisme &#039;&#039;&amp;quot;... assujettie à la taxe sur la valeur ajoutée (TVA) qui effectue des livraisons de biens et des prestations de services à destination de clients particuliers et qui enregistre les règlements reçus en contrepartie au moyen d’un logiciel ou d&#039;un système de caisse, est tenue d&#039;utiliser un logiciel ou un système qui satisfasse aux conditions d&#039;inaltérabilité, de sécurisation, de conservation et d&#039;archivage des données en vue du contrôle de l&#039;administration fiscale. ... Le respect des conditions d&#039;inaltérabilité, de sécurisation, de conservation et d&#039;archivage des données peut être justifié par un certificat délivré par un organisme accrédité &#039;&#039;&#039;ou&#039;&#039;&#039; par une attestation individuelle de l&#039;éditeur. ...&amp;quot;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Le texte mentionne bien également qu&#039;il n&#039;y a pas obligation à s&#039;informatiser pour tracer ses paiements (&#039;&#039;&amp;quot;... En revanche, cette disposition ne crée pas d&#039;obligation de s&#039;équiper d&#039;un logiciel ou système de caisse...&amp;quot;&#039;&#039;) mais si cela est fait, et que l&#039;on est dans le périmètre, le texte est applicable. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Historique :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Voici l&#039;article &#039;&#039;&#039;initial&#039;&#039;&#039; de la loi finance, datant du 29/12/2015:  [https://www.legifrance.gouv.fr/affichTexteArticle.do?cidTexte=JORFTEXT000031732865&amp;amp;idArticle=LEGIARTI000031734740&amp;amp;dateTexte=20151230 Article sur LegiFrance]&lt;br /&gt;
&lt;br /&gt;
Voici l&#039;article, &#039;&#039;&#039;pour sa publication au BOFIP&#039;&#039;&#039;, du 03/08/2016: https://bofip.impots.gouv.fr/bofip/10691-PGP.html?identifiant=BOI-TVA-DECLA-30-10-30-20160803&lt;br /&gt;
&lt;br /&gt;
[[File:Warning.png]] 15 juin 2017: Communiqué de presse du cabinet du ministère: http://proxy-pubminefi.diffusion.finances.gouv.fr/pub/document/18/22503.pdf -&amp;gt; &lt;br /&gt;
Seules les &amp;quot;logiciels de caisse&amp;quot; seraient concernés (la définition de logiciel de caisse n&#039;est toutefois pas encore apportée, elle le sera le 15 juillet 2018, voir la suite). &lt;br /&gt;
Dès logiciels ERP (comme Dolibarr), ainsi que les logiciels de site ecommerce (comme Prestashop, Magento, ...) n&#039;étant dans pas la catégorie logiciels de caisse (Les ERP sont dans la catégorie logiciels de gestion), on aurait cru que l&#039;obligation de mise en conformité, et tout ce qui suit, semblait ne plus être avéré pour eux, mais la suite des événements (voir la suite) indiquera le contraire si vous enregistrez dans le logiciel des paiements de particuliers, quelquesoit la catégorie du logiciel (seules les sociétés encaissant exclusivement d&#039;autres sociétés, ou ceux en tva en franchise, seront finalement exemptées)...&lt;br /&gt;
&lt;br /&gt;
[[File:Warning.png]] 27 septembre 2017: Voici l&#039;avenant publié le 27 septembre 2017 qui réduit la portée/périmètre de la loi aux seuls &amp;quot;logiciels de caisse&amp;quot;: http://www.assemblee-nationale.fr/15/projets/pl0235.asp (Article 46). En d&#039;autres terme, les applications ERP (Comme Dolibarr) semblent la encore ne plus être concernées, mais la suite des événements (voir la suite) indiquera le contraire si vous encaissez des particuliers (seules les sociétés encaissant exclusivement d&#039;autres sociétés, ou ceux en franchises seront finalement exemptées)...&lt;br /&gt;
&lt;br /&gt;
Suite aux questions des industriels de l&#039;informatique, une FAQ, issue du ministère des finances, est alors parue pour tenter de clarifier le périmètre. Elle indique que tous les assujetis à TVA qui vendent à un non assujetti (particuliers) sont concernés. Si on lit tel quel cette FAQ, alors le périmètre est non seulement pas réduit, comme communiqué par le ministère dans son courrier du 15 juin, mais élargit, y compris aux sites e-commerce. Cette FAQ est le premier élément qui apporte donc une définition au terme &amp;quot;système de caisse&amp;quot; en considérant tout logiciel traçant des encaissements, comme &amp;quot;systeme de caisse&amp;quot;.&lt;br /&gt;
Des amendements ont été rédigés pour tenter de clarifier ou restreindre cette définition, voir la suite...&lt;br /&gt;
&lt;br /&gt;
[[File:Warning.png]] 14 octobre 2017: Une reformulation du texte, plus complète que la FAQ, est donnée stipulant qu&#039;une entité est concernée... &amp;quot;&#039;&#039;Si elle effectue des livraisons de biens et des prestations de services ne donnant pas lieu à facturation conformément à l’article 289 et enregistre ces opérations au moyen d’un logiciel ou d&#039;un système de caisse&#039;&#039; ... &amp;quot;. Dans ce cas, il faut &amp;quot;&#039;&#039;... utiliser un logiciel ou un système satisfaisant à des conditions d&#039;inaltérabilité, de sécurisation, de conservation et d&#039;archivage des données en vue du contrôle de l&#039;administration fiscale, attestées par un certificat délivré par un organisme accrédité dans les conditions prévues à l&#039;article L. 433-4 du code de la consommation OU par une attestation individuelle de l&#039;éditeur, conforme à un modèle fixé par l&#039;administration ;&#039;&#039;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Il est aussi précisé: &#039;&#039;« 2. Les assujettis bénéficiant d&#039;une franchise de taxe mentionnée à l&#039;article 293 B, ceux placés sous le régime du remboursement forfaitaire prévu aux articles 298 quater et 298 quinquies et ceux effectuant exclusivement des opérations ou des prestations exonérées de taxe sur la valeur ajoutée sont dispensés de l&#039;obligation mentionnée au 3° bis du I. » ; &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Voir: [https://www.legifrance.gouv.fr/eli/loi/2017/12/30/CPAX1723900L/jo/texte/fr#JORFARTI000036339313 Article sur LegiFrance] pour le texte complet mentionnant ces 2 points.&lt;br /&gt;
&lt;br /&gt;
[[File:Warning.png]] 20 novembre 2017: Nouveaux éléments permettant de mieux cibler le périmètre. En effet, l&#039;amendement II-CF15 = II-1649 de la loi Finance 2018 sur l&#039;article 46 pour exclure les encaissements de particuliers qui font l&#039;objet de fabrication d&#039;une facture en bon et du forme (afin d&#039;exclure les ERP et plateforme ecommerce) a été rejeté en séance à l&#039;assemblée: Seule l&#039;encaissement de sociétés est bien hors périmètre. En effet, considérant que l&#039;administration a le droit de vérification chez les clients de type société, les traces fournies par les factures suffisent pour assurer un contrôle satisfaisant, mais ce droit n&#039;existe pas en ce qui concerne la facturation des particuliers. Dans ce cas la, même la facture est peu utile à l&#039;administration et par conséquent les contraintes d&#039;inaltérabilité deviennent requises, même si on émet une facture en bon et du forme. Cette conclusion fait suite aux échanges suites à l&#039;amendement II-CF15 = II-1649 de la loi Finance 2018 sur l&#039;article 46. &lt;br /&gt;
&lt;br /&gt;
Pour info, texte complet de la tentative d&#039;amendement: http://www.assemblee-nationale.fr/15/amendements/0235C/AN/1649.asp ou en PDF http://www.assemblee-nationale.fr/15/amendements/0235C/CION_TOUTE/CF15.pdf&lt;br /&gt;
&lt;br /&gt;
Et voici les extraits importants de la discussion:&lt;br /&gt;
&lt;br /&gt;
D&#039;abord, la tentative de M. Bruno Millienne pour tenter d&#039;exclure les logiciels émettant des factures en bon et du forme:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;M. Bruno Millienne. &amp;quot;[...]le renvoi à l’article 289 du code général des impôts – CGI – ne vise que les cas d’émission de factures obligatoires au sens fiscal pour les opérations entre assujettis ou personnes morales. En l’état, le texte conduirait à appliquer le dispositif de certification ou d’attestation à toutes les opérations réalisées avec les particuliers, même lorsqu’elles donnent lieu à l’émission de factures conformes au CGI, par exemple dans le cadre du commerce électronique. [...] La rédaction actuelle de l’article peut conduire à requalifier en logiciel de caisse un logiciel de facturation, si des factures sont émises à l’attention d’un particulier ou d’une administration, ou un logiciel de comptabilité, si des règlements sont comptabilisés directement par l’utilisateur. L’éditeur deviendrait ainsi responsable du mode d’utilisation de son logiciel par l’assujetti. Il est impossible de transposer les exigences d’un logiciel de caisse à un logiciel de facturation : leurs fonctionnalités respectives sont totalement différentes. Actuellement, il existe des dispositifs de certification en matière de caisse, mais pas en matière de facturation.&amp;quot;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;...&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Réponse de &#039;&#039;M. Joël Giraud, rapporteur général de la commission des finances, de l’économie générale et du contrôle budgétaire: Avis défavorable. L’article 46 précise que l’obligation de certification ne vaut que pour les logiciels ou systèmes de caisse. L’obligation ne concernera plus les progiciels de gestion intégrée ou de comptabilité : pour ces logiciels multifonctions qui traitent à la fois la comptabilité, la gestion et la caisse, seuls les modules caisse enregistreuse et encaissement devront être certifiés, non l’ensemble du logiciel.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;...&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Et enfin le complément de &#039;&#039;M. Benjamin Griveaux, secrétaire d’État auprès du ministre de l’économie et des finances: Avis défavorable. Une facture n’est obligatoire, au sens fiscal, que dans le cadre d’une relation B to B – business to business, c’est-à-dire d’entreprise à entreprise. L’administration fiscale peut la contrôler car elle dispose d’un droit de communication envers l’entreprise cliente. A contrario, elle ne peut exercer de droit de communication auprès des particuliers. Cet amendement conduirait donc à exclure du dispositif de sécurisation les entreprises qui émettent des factures contenant les mentions légales, qu’elles soient adressées à des entreprises ou à des particuliers. Je suis donc l’avis du rapporteur général quant au risque de fraude accrue que cet amendement ferait courir.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
La discussion complète de la séance ayant rejeté l&#039;amendement est disponible ici: http://www.assemblee-nationale.fr/15/cri/2017-2018/20180063.asp#P1103690&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;En conclusion, l&#039;amendement ayant été rejeté, il faut en déduire que la volonté est bien d&#039;intégrer, dans le périmètre, toutes les parties/modules de logiciels, utilisés comme caisse enregistreuse OU pour enregistrer des paiements de particuliers (logiciel ecommerce, de caisse, de gestion,...)&#039;&#039;&#039; et que l&#039;émission de facture en bon et du forme à des particuliers ne suffit pas pour sortir du périmètre...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Warning.png]] 30 décembre 2017:&lt;br /&gt;
&lt;br /&gt;
L&#039;article 88 qui disaient &#039;&#039;..toute personne assujettie à la taxe sur la valeur ajoutée (TVA) qui enregistre les règlements de ses clients au moyen d&#039;un logiciel de comptabilité ou de gestion ou d&#039;un système de caisse, doit utiliser un logiciel ou un système satisfaisant à des conditions d&#039;inaltérabilité, de sécurisation, de conservation et d&#039;archivage des données en vue du contrôle de l&#039;administration fiscale&#039;&#039;&lt;br /&gt;
est complété par l&#039;article 105 qui remplace &amp;quot;&#039;&#039;logiciel de comptabilité ou de gestion ou d&#039;un système de caisse&#039;&#039;&amp;quot; par &amp;quot;&#039;&#039;logiciel ou d&#039;un système de caisse&#039;&#039;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[File:Warning.png]] 23 janvier 2018: Un représentant du projet Dolibarr, avec des représentants de l&#039;APRIL et du logiciel libre de caisse Pasteque, ont été reçus au ministère des finances afin d&#039;échanger sur l&#039;interprétation du texte. Les interprétations faites sur cette page (ainsi que les réponses faites aux FAQ qui suivent) ont pu être confirmées. &lt;br /&gt;
Toutefois, il y a intention de réduire le périmètre aux seuls logiciels de caisse. A suivre donc. Une version de travail revue, du Bofip doit être publiée à un comité restreint d&#039;acteurs, dont l&#039;April, fin janvier, afin de faciliter le travail d&#039;interprétations, pour une publication officielle au printemps. En attendant, on ne peut qu&#039;attendre (Cette publication aura lieu finallement le 4 juillet 2018 et une grande partie de nos retours s&#039;avèrera prise en compte).&lt;br /&gt;
&lt;br /&gt;
[[File:Warning.png]] 18 mai 2018: Réponse du gouvernement à quelques questions sur le sujet: https://www.nosdeputes.fr/15/question/QE/3257 . La réponse évoque l&#039;année de tolérance en précisant que l&#039;utilisateur devra montrer sa diligence en cas de contrôle (Soin appliqué à la mise en oeuvre de l&#039;obtention de l&#039;attestation individuelle)&lt;br /&gt;
&lt;br /&gt;
[[File:Warning.png]] 5 juin 2018: Réponse du gouvernement à quelques questions sur le sujet: https://www.nosdeputes.fr/15/question/QE/2736 . La réponse évoque l&#039;année de tolérance en précisant que l&#039;utilisateur devra montrer sa diligence en cas de contrôle (Soin appliqué à la mise en oeuvre de l&#039;obtention de l&#039;attestation individuelle)&lt;br /&gt;
&lt;br /&gt;
[[File:Warning.png]] 4 juillet 2018: Publication de la version corrigée du texte de loi au BOFIP: https://bofip.impots.gouv.fr/bofip/10691-PGP.html?identifiant=BOI-TVA-DECLA-30-10-30-20180704. Cette version conforte tous les points évoqués (le texte clarifie la loi et confirme que les interprétations vu ci-dessus s&#039;avéraient justes), avec toutefois 2 ajouts majeures:&lt;br /&gt;
&lt;br /&gt;
*La définition de logiciel de caisse a été donnée:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Un logiciel ou système de caisse est un système informatique doté d&#039;une fonctionnalité de caisse, laquelle consiste à mémoriser et à enregistrer extra-comptablement des paiements reçus en contrepartie d&#039;une vente de marchandises ou de prestations de services c&#039;est-à-dire que le paiement enregistré ne génère pas concomitamment, automatiquement et obligatoirement la passation d&#039;une écriture comptable.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Ne sont pas considérés comme enregistrés extra-comptablement, quel que soit le mode de paiement, les paiements pour lesquels le logiciel ou système déclenche obligatoirement, instantanément et automatiquement, sans intervention humaine, une écriture dans le système d’information comptable.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Sont visés tous les logiciels ou systèmes de caisse permettant l&#039;enregistrement des règlements de leurs clients quel que soit le mode de règlement (espèces, chèques, CB, virements, prélèvements...).&#039;&#039;&lt;br /&gt;
Cette obligation s&#039;applique y compris en cas d&#039;enregistrement sur un logiciel ou système accessible en ligne.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Sans que cette liste ne soit limitative, sont concernés par l&#039;obligation les instruments de mesures réglementés, comme les balances, mais également les rampes de boissons automatisées, les automates de paiement ou encore les distributeurs automatiques de marchandises (boissons, gâteaux…) qui disposent d&#039;une fonctionnalité de caisse.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Seule cette fonctionnalité de caisse, et non les autres fonctions telles que celles relatives à la pesée, doivent être certifiées.&#039;&#039;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
*L&#039;article 35 qui est un allègement du périmètre: Les professionnels réalisant leur paiement avec l&#039;intermédiation d&#039;un établissement de crédit européen ne sont plus soumis à l&#039;obligation de certification ou attestation. Mais attention, on parle bien de paiements &amp;quot;directs&amp;quot; (donc Virement ou Carte de Débit ou de Crédit mais pas chèques qui n&#039;est pas &amp;quot;direct&amp;quot;) et surtout via un système de paiement géré par un organisme bancaire européen. En d&#039;autres terme, si on ne fait que du paiement CB avec un module de VAD d&#039;une banque, on est NON soumis à la certification/attestation mais si le paiement CB (carte de crédit ou débit) se fait par un service comme Stripe ou Paypal, sauf à être exempté pour un autre motif, on l&#039;est toujours (car l&#039;état français n&#039;a pas de moyen d&#039;obtenir le listing des transactions via ces solutions non européennes, bien que le paiement soit par carte bancaire).&lt;br /&gt;
&lt;br /&gt;
==Conclusion pour le logiciel Open Source Dolibarr ERP CRM==&lt;br /&gt;
&lt;br /&gt;
Dolibarr ERP CRM est une application de gestion qui enregistre des factures (factures acomptes, avoirs ou standards). L&#039;application permet aussi d&#039;enregistrer des paiements. Le module POS (celui fourni par défaut appelé TakePOS), fonctionne aussi sur le principe de génération systématique de facture et d&#039;enregistrement du paiement en temps réel. L&#039;application est donc bien dans le périmètre (comme n&#039;importe quel autre ERP, logiciel de caisse ou de Ecommerce). Mais en tant qu&#039;utilisateur, vous n&#039;êtes concerné que si vous n&#039;êtes pas en franchise de base ET si vous l&#039;utilisez pour saisir des &#039;&#039;&#039;encaissements&#039;&#039;&#039; de particuliers (B2C=Business To Consumer) ou en mode mixte, à savoir encaissement aussi bien de particuliers (B2C) et d&#039;entreprises (B2B), quel que soit le ratio entre les 2. Si vous ne facturez QUE des professionnels, dans ce cas, vous n&#039;êtes pas concerné par la LF2016 (Loi finance 2016, applicable depuis 2018).&lt;br /&gt;
&lt;br /&gt;
Dans le cas où vous utilisez le module Facture, ou le module POS, pour encaisser des particuliers, et êtes assujettis à la TVA mais pas en franchise, vous êtes concerné. Il vous faut alors vous assurer que le module &amp;quot;Log inaltérable&amp;quot; (&amp;quot;BlockedLog&amp;quot;) est bien activé. Sa désactivation, une fois les premières saisies faites ne sera ensuite plus envisageable. Avec Dolibarr v10 ou plus et l&#039;activation de ce module vous aurez alors une version conforme sur le plan technique et fonctionnel. Il vous faudra ensuite, obtenir une attestation de conformité auprès d&#039;un tiers qui confirme cette conformité technique/fonctionnelle pour être conforme d&#039;un point de vue juridique. Si vous utilisez une version en ligne SaaS/Cloud fournie par un tiers, ce dernier vous la fournira sûrement (voir exemples sur https://saas.dolibarr.org). Dans le cas contraire, il vous faut contactez votre intégrateur informatique ou un prestataire pouvant fournir cette d&#039;attestation.&lt;br /&gt;
&lt;br /&gt;
Remarque: cette contrainte sera identique quel que soit l&#039;ERP choisi. L&#039;utilisation d&#039;outils non spécialisés comme un tableur Excel ou autre, DANS LE BUT D&#039;AVOIR UNE CONSERVATION DE TRACES DES PAIEMENTS, ne devient plus permis car le logiciel n&#039;étant pas conforme, vous ne réussirez pas à trouver un prestataire pour fournir l&#039;attestation de conformité. Par contre, si l&#039;utilisation que vous faites d&#039;Excel ou autre tableur est à des fins juste de &amp;quot;génération du PDF de la facture&amp;quot; sans &#039;&#039;conservation des données&#039;&#039; (Le texte de loi parle alors de logiciel &amp;quot;facturier&amp;quot;), vous pouvez continuer à l&#039;utiliser ainsi. Dans le cas où l&#039;utilisation est faite pour conserver trace de vos paiements, et si vous êtes dans le périmètre de la loi, un logiciel &#039;&#039;&#039;certifié OU attestable&#039;&#039;&#039; sur la partie encaissement (comme l&#039;est Dolibarr) devient obligatoire.&lt;br /&gt;
&lt;br /&gt;
Voyons aussi, par une autre approche, à savoir un système de question-réponse, comment synthétiser autrement tout cela:&lt;br /&gt;
&lt;br /&gt;
=Questions / Réponses (FAQ)=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==J&#039;utilise Dolibarr ou autre logiciel ERP, suis-je concerné, pour quelle fonctionnalité ?==&lt;br /&gt;
&lt;br /&gt;
*Votre logiciel n&#039;est concerné que si vous êtes &#039;&#039;&#039;assujetties à la TVA (et pas en franchise en base de TVA)&#039;&#039;&#039;, ET si vous l&#039;utilisez pour saisir des &#039;&#039;&#039;encaissements de particuliers&#039;&#039;&#039; (B2C=Business To Consumer) ou en mode mixte, à savoir encaissement aussi bien de particuliers (B2C) et d&#039;entreprises (B2B), quelque soit le ratio entre les 2, quelque soit les modes de paiement utilisés (sauf à ne faire que du paiement direct par l&#039;intermédiation d&#039;un organisme bancaire européen). Donc:&lt;br /&gt;
**si vous n&#039;encaissez pas d&#039;argent, vous n&#039;êtes PAS concerné.&lt;br /&gt;
**si vous êtes une association/organisme non assujettie à la TVA (association, médecin, ...), vous n&#039;êtes PAS concerné.&lt;br /&gt;
**si vous êtes un professionnel bénéficiant du régime de remboursement forfaitaire de TVA agricole, vous n&#039;êtes PAS concerné.&lt;br /&gt;
**si vous êtes un auto-entrepreneur, vous n&#039;êtes (peut-être) PAS concerné (dispense si vous relevez de la franchise en base).&lt;br /&gt;
**si vous êtes une entreprise dont l&#039;intégralité des encaissements est réalisée avec l&#039;intermédiation directe d’un établissement de crédit (système de paiement VAD d&#039;une banque ou Virements), vous n&#039;êtes PAS concerné. Remarque: Des encaissements par Carte bancaire via Paypal ou via Stripe ne sont pas des encaissements avec intermédiation directe d’un établissement de crédit, car ni Paypal ni Stripe ne sont des établissements de crédit (comprendre Banque).&lt;br /&gt;
**si vous ne facturez QUE des entreprises/professionnels, dans ce cas, vous n&#039;êtes PAS concerné non plus par la loi finance (non B2C). Remarque: Si vous facturez des professionnels la plupart du temps et, exceptionnellement de temps en temps des particuliers via un mode de paiement non assuré par un organisme de crédit européen, si vous pouvez gérer/suivre ces facturations de particuliers à part sur papier, vous sortez alors du champ et n&#039;êtes pas concerné.&lt;br /&gt;
&lt;br /&gt;
Si vous n&#039;êtes dans aucun des cas d&#039;exception précédent, vous êtes concernés si vous utilisez le module Facture pour enregistrer vos paiements et/ou le module POS. Il vous faut alors vous assurer que le module &amp;quot;Log inaltérable&amp;quot; (&amp;quot;BlockedLog&amp;quot;) fourni avec la v10 ou plus est bien activé. Sa désactivation, une fois les premières saisies faites ne sera ensuite plus envisageable. Avec la migration en v10 ou plus et l&#039;activation de ce module vous aurez alors une version conforme sur le plan technique et fonctionnel. Il vous faudra ensuite, obtenir une attestation de conformité auprès d&#039;un tiers qui confirme cette conformité technique/fonctionnelle pour être conforme d&#039;un point de vue juridique. &lt;br /&gt;
&lt;br /&gt;
Si vous utilisez une version en ligne Saas/Cloud fournie par un tiers, ce dernier vous la fournira surement (exemple: https://www.dolicloud.com ou https://www.novafirstcloud.com). Dans le cas contraire, il vous faut contactez votre intégrateur ou un prestataire pouvant fournir cette d&#039;attestation.&lt;br /&gt;
&lt;br /&gt;
Remarque: cette contrainte sera identique quelque soit l&#039;ERP choisi. L&#039;utilisation d&#039;outils non spécialisés comme un tableur Excel ou autre, DANS LE BUT D&#039;AVOIR UNE CONSERVATION DE TRACE DES PAIEMENTS, ne devient plus permis car le logiciel n&#039;étant pas conforme, vous ne réussirez pas à trouver un prestataire pour fournir l&#039;attestation de conformité. Par contre, si l&#039;utilisation que vous faites d&#039;Excel ou autre tableur est à des fins juste de &amp;quot;génération du PDF de la facture&amp;quot; sans &#039;&#039;conservation des données&#039;&#039; (Le texte de loi parle alors de logiciel &#039;&#039;facturier&#039;&#039;), vous pouvez continuer à l&#039;utiliser ainsi. Dans le cas ou l&#039;utilisation est faite pour conserver trace de vos paiements, et si vous êtes dans le périmètre de la loi, un logiciel &#039;&#039;&#039;certifié OU attestable&#039;&#039;&#039; sur la partie encaissement (comme l&#039;est Dolibarr) devient obligatoire (dans le cas d&#039;un logiciel non certifié mais attestable comme Dolibarr, il vous faudra obtenir une attestation papier ou PDF d&#039;un Tiers).&lt;br /&gt;
&lt;br /&gt;
==Je suis concerné, mais à partir de quand ?==&lt;br /&gt;
&lt;br /&gt;
*Si vous êtes concerné, la loi s&#039;applique au 1er janvier 2018. Toutefois, le texte de loi clarifié datant de juillet 2018, si on ajoute le temps requis par les logiciels pour s&#039;adapter à la version définitive, puis le temps de migration sur la nouvelle version, une tolérance est de mise la première année (donc 2018), à condition de montrer que vous suivez le sujet et avez attendu pour avoir le texte définitif puis pour avoir la version conforme puis pour avoir le  bon moment de faire votre migration. Si vous utilisez Dolibarr, les différentes évolutions de cette page montre que la démarche est engagée sur le logiciel depuis novembre 2016 et ce alors que le périmètre de la loi était encore contradictoire début novembre 2017.&lt;br /&gt;
&lt;br /&gt;
A la question posée en janvier 2018 au ministère des finances: &amp;quot;Que pouvons nous dire aux utilisateurs qui sont en attente de texte/règle clarifiée pour agir, sachant que la loi est sensé être déjà effective ?&amp;quot;, la réponse donnée a été que la première année (2018 donc), il y aurait tolérance, dès lors que vous montrez que vous avez pris une trajectoire sur 2018 pour bien faire. Cette année transitoire ayant été officiellement annoncée par le secrétaire d&#039;état, dont voici les propos:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;« Je veux toutefois rassurer les entreprises : la direction générale des finances publiques les accompagnera pendant la première année d’application de ce dispositif, en vertu non pas d’une culture de la sanction ou du contrôle fondée sur le présupposé d’une malveillance des entreprises, mais d’un rôle de conseil. La DGFIP tiendra notamment compte des démarches engagées et des diligences effectuées par les entreprises pour obtenir le certificat ou l’attestation. C’est dans cet esprit que nous travaillerons. Les deux organismes certificateurs prendront également leur part de cet effort de pédagogie, qui est normal. »&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==La nécessité d&#039;attestation ou certification disparaît-elle si on n&#039;enregistre nos paiements que via un mode de règlement qui laisse déjà des traces, comme les chèques ou cartes ?==&lt;br /&gt;
&lt;br /&gt;
Au départ, le type de règlement n&#039;avait aucun impact sur la loi. Tous les types de paiement (chèque, carte, liquide, virement, ...) rentrent dans le périmètre de la loi et aucun ne permet d&#039;être hors du champs d&#039;application. L&#039;amendement suivant https://www.nosdeputes.fr/15/amendement/235/1325C a tenté de restreindre le périmètre à un certain mode de paiement, mais a été rejeté.&lt;br /&gt;
&lt;br /&gt;
Ceci se comprend dans la mesure où, même un paiement par carte, peut se faire via un système comme Paypal ou Stripe, et que l&#039;administration fiscale française a très peu de pouvoir de contrôle sur une société étrangère.&lt;br /&gt;
Toutefois, il existe des cas où l&#039;administration fiscale a un pouvoir de contrôle, c&#039;est pourquoi, dans la re-publication au BOFIP de la loi le 4 juillet 2018, une exception a été introduite: Les professionnels réalisant leur paiement avec l&#039;intermédiation directe d&#039;un établissement de crédit européen ne sont plus soumis à l&#039;obligation de certification ou attestation. Mais attention, on parle bien de paiements &amp;quot;directs&amp;quot; (donc Virement ou Carte de Débit ou de Crédit, mais pas chèques qui n&#039;est pas &amp;quot;direct&amp;quot;) et surtout via un système de paiement géré par un organisme bancaire européen. En d&#039;autres terme, si on ne fait que du paiement CB avec un module de VAD d&#039;une banque, on est NON soumis à la certification/attestation mais si le paiement CB (carte de crédit ou débit) se fait par un service comme Stripe ou Paypal, sauf à être exempté pour un autre motif, on l&#039;est toujours (car l&#039;état français n&#039;a pas de moyen d&#039;obtenir le listing des transactions via ces solutions, bien que le paiement soit par carte bancaire).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Quelles sont les conditions pour une application concernée pour être conforme (conditions pour obtenir la certification OU être attestable conforme par un tiers) ?==&lt;br /&gt;
&lt;br /&gt;
*Principe d&#039;inaltérabilité&lt;br /&gt;
**Logs non modifiable par chaînage (principe de somme de contrôle incluant la somme de contrôle de la trace précédente) pour tout ce qui concerne les saisies d&#039;encaissements (incluant toutes les mentions obligatoires d&#039;une facture). Il est possible d&#039;aller au delà de la loi en traçant aussi ce qui concerne les factures et leur envoi sur une imprimante. Aucune fonction pour modifier ou supprimer ces logs ne doit exister.&lt;br /&gt;
**Quand un paiement est enregistré, la trace et les informations qui ont donné lieu à ce paiement (information du paiement mais aussi de la facture ne peuvent plus être modifier). Rem: Il est toujours possible de faire des modification sur l&#039;objet de gestion mais la trace historique (la log archivée) doit rester non modifié et fidèle à l&#039;acte d&#039;origine. Et si un changement est fait, ce changement doit lui aussi être tracé et reprendre toutes les nouvelles informations et être lui aussi non effaçable, non modifiable.&lt;br /&gt;
&lt;br /&gt;
*Conservation sur 6 ans ou plus (Remarque: Dolibarr conserve les données en base à vie)&lt;br /&gt;
&lt;br /&gt;
*Fonction &amp;quot;Archiver&amp;quot; annuellement qui permet d&#039;exporter dans un fichier externe dans un format lisible sans le logiciel, et par l&#039;administration, pour consulter l&#039;archive (et retrouver les infos d&#039;origine qui composaient la facture, les paiements).&lt;br /&gt;
&lt;br /&gt;
*Fournir, soit la certification de conformité du logiciel, soit une attestation de conformité (Voir dans les FAQ plus loin &amp;quot;Quel éditeur peut fournir des attestations pour ma version ?&amp;quot; sur comment l&#039;obtenir)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!! En d&#039;autres termes, il ne sera plus possible d&#039;utiliser des logiciels tableurs comme Excel ou Google Apps, ni autre solution développée soi même pour avoir une trace et conservation de vos paiements, sans considération de cette loi (sauf à continuer de saisir en parallèle soit dans un autre système conforme, soit sur le bon vieux carnet à souche). Mais vous pouvez continuer à utiliser votre tableur à des fins de logiciel pour générer vos Factures (la loi parle de &amp;quot;logiciel facturier&amp;quot;) si il n&#039;y a pas de conservation de données (le logiciel est alors considéré comme simple facturier et donc hors périmètre). &lt;br /&gt;
Pour un suivi et conservation de vos encaissements via un outils informatique, des logiciels, conforme loi finance 2016 comme Dolibarr ERP CRM v10 ou + deviennent alors obligatoires, dès lors que l&#039;on est concerné (voir FAQ &#039;&#039;&#039;...suis-je concerné...&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
==Quelle est la différence entre certification et attestation ?==&lt;br /&gt;
&lt;br /&gt;
La certification est une procédure par laquelle une tierce partie, l’organisme certificateur (Par exemple la LNE ou L&#039;AFNOR), donne une assurance écrite qu’un système d’organisation, un processus, une personne, un produit ou un service est conforme à des exigences spécifiées dans une norme ou un référentiel. Elle est encadrée par le Code de la Consommation. Sur un logiciel, la certification est faite pour une version donnée sur le périmètre de l&#039;application ou d&#039;une partie de l&#039;application uniquement. Chaque nouvelle version devant être re-certifiée.&lt;br /&gt;
&lt;br /&gt;
L&#039;attestation de conformité est fournie par une tierce partie également, mais ce dernier n&#039;a pas besoin d&#039;être un organisme certifiant. Il peut s&#039;agir de n&#039;importe quelle société. C&#039;est souvent l&#039;éditeur du logiciel, mais il peut s&#039;agir en fait de n&#039;importe quelle société. Cette attestation est une déclaration par laquelle l’éditeur témoigne et s’engage à ce que le système d’encaissement qu’il atteste respecte les conditions d’inaltérabilité, de sécurisation, de conservation et d’archivage des données. L&#039;attestation est elle aussi valable pour une version et éventuellement un paramétrage donné.&lt;br /&gt;
&lt;br /&gt;
Dans le cadre de la loi des finances pour 2016, et si vous êtes dans le périmètre de cette loi (voir autres FAQ), vous devez, soit avoir un logiciel &amp;quot;certifié&amp;quot;, soit avoir un logiciel &amp;quot;attesté conforme&amp;quot; (Notez que le terme &amp;quot;certifié&amp;quot; est souvent utilisé dans les textes (plus rarement dans le texte définitif de la loi) comme raccourci pour signifier &amp;quot;certifié ou attesté conforme&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==L&#039;application Dolibarr sera-t-elle certifiée par l&#039;éditeur ?==&lt;br /&gt;
&lt;br /&gt;
Pour Dolibarr, et de nombreux logiciels Open Source, il n&#039;y a pas un éditeur bien identifié car de nombreuses sociétés différentes contribuent à son évolution.&lt;br /&gt;
&lt;br /&gt;
Au sens de la loi, l&#039;éditeur du logiciel est le &#039;&#039;&#039;&amp;quot;dernier&amp;quot; qui a modifié/validé le code&#039;&#039;&#039;. L&#039;entité qui postule pour une certification peut donc être, aussi bien l&#039;association Dolibarr, comme tout intégrateur, hébergeur ou autre institution externe. &lt;br /&gt;
&lt;br /&gt;
Il est possible que l&#039;association Dolibarr, qui a pour rôle la promotion du logiciel, fasse les démarches pour obtenir la certification pour certaines versions majeures, celles qui sont officiellement packagées par le release manager et qui sont mises à disposition sur l&#039;espace de téléchargement officiel par l&#039;association. Dans cette éventualité, seules quelques versions bien identifiées feront l&#039;objet d&#039;une demande de certification. Toutefois, cette obtention de certification qui fige une version (Certification LNE ou certification NF525) n&#039;est pas obligatoire pour être conforme et non adapté avec les lois du marché qui veut qu&#039;un logiciel doit évoluer très vite. L&#039;autre solution, celle de l&#039;obtention d&#039;une attestation s&#039;avère donc recommandée et plus simple.&lt;br /&gt;
Nous encourageons donc les utilisateurs qui ont obligation d&#039;utiliser un logiciel conforme anti-fraude à la TVA selon la loi finance 2016 (donc les assujettis à TVA hors franchise de base, et qui facture/encaisse des particuliers) à &#039;&#039;&#039;se tourner vers la solution d&#039;attestation&#039;&#039;&#039;. Voir point suivant.&lt;br /&gt;
&lt;br /&gt;
==L&#039;attestation de conformité, autre possibilité, sera-t-elle fournie par l&#039;éditeur ou autre tiers ?==&lt;br /&gt;
&lt;br /&gt;
L&#039;autre solution pour être en règle est d&#039;obtenir une attestation de conformité de votre logiciel de suivi des encaissements. &lt;br /&gt;
 &lt;br /&gt;
En tant qu&#039;utilisateur, et si vous êtes dans le périmètre de la loi, vous pourrez obtenir une attestation auprès de n&#039;importe quel tiers/intégrateur prêt à la fournir (en général moyennant finance), ou vous la délivrer à vous même si vous êtes une société d&#039;édition de logiciel. Voir les 2 FAQ suivantes pour savoir qui pourra délivrer les attestations de conformité...&lt;br /&gt;
Dans le cas d&#039;un logiciel hébergé en Saas, la société qui propose la solution en Saas fournira souvent cette attestation mais parfois non (voir point suivant).&lt;br /&gt;
&lt;br /&gt;
==Quel éditeur peut fournir des attestations pour ma version, à quel prix ?==&lt;br /&gt;
&lt;br /&gt;
N&#039;importe quelle société qui a les compétences pour analyser le logiciel et vérifier que ses fonctionnalités sont bien en règle peut fournir une attestation à autrui. Le code d&#039;une application libre étant ouvert, toute société compétente dans la technologie du produit, peut maîtriser le code aussi bien que les développeurs initiaux. Une telle société peut donc être qualifiée d&#039;&amp;quot;éditeur&amp;quot;, même si elle n&#039;a pas produit ou très peu produit de code au projet final, et par conséquent, et à même de fournir un attestation individuelle à ses clients.&lt;br /&gt;
&lt;br /&gt;
Le BOFIP dit clairement:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;310. Lorsque le logiciel ou système est conçu de manière ouverte pour permettre son adaptation aux besoins spécifiques des clients, on entend par « éditeur » qui peut valablement demander la certification ou fournir l&#039;attestation individuelle.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Bref, si vous utilisez une version en ligne SaaS/Cloud fournie par un tiers, ce dernier vous la fournira surement (Exemple avec https://www.dolicloud.com ou encore https://www.novafirstcloud.com). Dans le cas contraire, il vous faut contactez votre intégrateur ou un prestataire pouvant fournir cette d&#039;attestation. Remarque: cette contrainte sera identique quelque soit l&#039;outil informatique d&#039;enregistrements des encaissements qui aura été choisi.&lt;br /&gt;
&lt;br /&gt;
En ce qui concerne le prix, tout dépend du tiers qui fournit l&#039;attestation. Certains, par exemple, pourront donner l&#039;attestation gratuitement à condition d&#039;héberger le logiciel attesté chez eux. D&#039;autres vous feront payer la prestation d&#039;audit et la délivrance de l&#039;attestation. Cela peut être de manière récurrente si l&#039;attestation doit être réémise régulièrement suite à modification/mise à jour de l&#039;application.&lt;br /&gt;
&lt;br /&gt;
==La loi finance est-elle compatible avec les licences libres de logiciels de caisse ?==&lt;br /&gt;
&lt;br /&gt;
Si le logiciel libre n&#039;est pas un logiciel qui réalise des encaissements ou si vous n&#039;encaissez que des entreprises, la question ne se pose même pas puisque la loi ne s&#039;applique pas à ces cas. &lt;br /&gt;
&lt;br /&gt;
Si le logiciel libre est un logiciel d&#039;encaissements et que les clients encaissés sont des particuliers, alors oui, le logiciel libre est parfaitement compatible: &lt;br /&gt;
&lt;br /&gt;
Le paragraphe 40 du BOI le dit explicitement en reconnaissant aux utilisateurs la possibilité « &#039;&#039;d&#039;adapter le logiciel à leurs besoins spécifiques&#039;&#039; » :  &lt;br /&gt;
&lt;br /&gt;
&amp;quot;&#039;&#039;... Sont notamment concernés les logiciels de comptabilité ou de gestion dits &amp;quot;libres&amp;quot; ou développés en interne, c&#039;est-à-dire développés par l&#039;assujetti lui-même. On entend par logiciel libre un logiciel dont les utilisateurs ont un libre usage, une libre étude, une libre modification et une libre distribution. Ces libertés permettent aux utilisateurs d&#039;adapter le logiciel à leurs besoins spécifiques. Les modifications que les utilisateurs peuvent apporter au logiciel libre ou développé en interne ne doivent pas avoir pour objet ou pour effet d&#039;altérer le respect des conditions d&#039;inaltérabilité, de sécurisation, de conservation et d&#039;archivage décrites ci-dessous...&#039;&#039;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Par ailleurs, le paragraphe 310 évoque à nouveau le cas des logiciels « conçus de manière ouverte », c.à.d les logiciels libres.&lt;br /&gt;
&lt;br /&gt;
Donc, aucune objection à utiliser des logiciels libres. Mais attention, l&#039;autorisation de modification est restreinte au code et paramètres &amp;quot;triviaux&amp;quot;. En effet, que ce soit lors d&#039;une utilisation de la version certifiée ou d&#039;une version rendue conforme par obtention d&#039;une attestation de conformité, la nouvelle loi vous prive d&#039;une partie de votre liberté de &#039;&#039;&#039;modifier le logiciel de caisse SUR LES PARTIES qui concernent les fonctions d&#039;inaltérabilité, sécurisation, conservation et archivage&#039;&#039;&#039;. En effet, en faisant une telle modification, la version est considérée comme changée de manière &amp;quot;non triviale&amp;quot;, aussi la certification n&#039;est plus valable, l&#039;attestation d&#039;un tiers non plus. Les logiciels libres sont donc tout à fait légaux et compatible avec la loi, par contre, c&#039;est à condition de ne pas faire n&#039;importe quelle modification. Vous perdez donc une partie de votre liberté (non pas du fait de la licence du logiciel qui le permet, mais du fait de la loi qui est prioritaire sur les droits accordés par la licence). Le logiciel libre est donc bien compatible avec la loi, mais la loi vous prive d&#039;une des 4 libertés que le logiciel libre apportait, celle de le modifier librement. Vous pouvez toujours le faire, mais à condition que cela ne porte pas sur le comportement de l&#039;encaissement, ou, si cela porte sur celui-ci, que vous ré-obteniez soit la certification à nouveau (complexe et long), soit une nouvelle attestation d&#039;un éditeur ou intégrateur.&lt;br /&gt;
&lt;br /&gt;
==Pour ma propre utilisation, puis-je m&#039;auto-délivrer l&#039;attestation de conformité pour une version que j&#039;ai modifié moi même sur les parties d&#039;encaissements==&lt;br /&gt;
&lt;br /&gt;
Uniquement un nombre très restreints d&#039;entreprise le pourront, celles qui sont dans le domaine de l&#039;&#039;&#039;&#039;Edition de logiciel de comptabilité ou de gestion ou de système de caisse&#039;&#039;&#039;. Toutefois, sur le plan juridique une telle classification n&#039;existe que par les faits. En effet, on serait tenté de penser que les entreprises ayant le codes NACE (Code NACE = terme européen du code NAF/APE) &#039;&#039;&#039;58.29&#039;&#039;&#039; qui signifie &#039;&#039;&#039;Edition de logiciel autre&#039;&#039;&#039; et/ou &#039;&#039;&#039;62.01Z&#039;&#039;&#039; qui signifie &#039;&#039;&#039;Développement de logiciels&#039;&#039;&#039; pourrait être qualifiées. Toutefois, il faut avoir en tête que le code APE est &amp;quot;&#039;&#039;attribué par l&#039;INSEE à des fins statistiques, et ne saurait suffire à créer des droits ou des obligations pour les entreprises&#039;&#039;&amp;quot; (Ceci est dans le décret qui approuve la nomenclature: décret n° 2007-1888 du 26 décembre 2007, article 5, point I). Dans la réalité, ce code est malgré tout utilisé pour avoir des présomptions d&#039;activité au niveau fiscal ou administratif. Donc, c&#039;est un avantage, mais aucunement une garantie et inversement, une entreprise n&#039;ayant pas cette classification peut avoir des arguments suffisamment solide pour démontrer son activité d&#039;&amp;quot;éditeur de logiciel de caisse&amp;quot;. &amp;lt;ref&amp;gt;BOI-TVA-DECLA-30-10-30-20180704, point 375&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Je suis intégrateur ou développeur informatique, je sais que Dolibarr v10 et ultérieur répond aux exigences de conformité, puis-je délivrer l&#039;attestation de conformité, à mon client qui est en v10 ou plus, moi même ?==&lt;br /&gt;
&lt;br /&gt;
Oui. A vous de fournir/indiquer à votre client la version/paramétrage que vous attestez. Avec Dolibarr, vous pouvez générez la signature de la version et paramétrage que vous attestez avec l&#039;outil &#039;&#039;&#039;generate_filelist_xml.php&#039;&#039;&#039; fourni avec les sources de l&#039;application.&lt;br /&gt;
Cette signature vous permettra de vérifier que votre client n&#039;a pas fait de &#039;&#039;&#039;modification de code ou paramétrage sur les parties qui concernent l&#039;encaissement&#039;&#039;&#039;. Auquel cas, il devient l&#039;éditeur, et votre attestation en tant qu&#039;éditeur n&#039;est plus valide, vous n&#039;êtes alors plus responsable d&#039;une apparition d&#039;une fonctionnalité non conforme dans le logiciel.&lt;br /&gt;
&lt;br /&gt;
==Je suis intégrateur ou développeur informatique, quel outil ai-je à ma disposition pour m&#039;assurer que les exigences sur le logiciel sont bien assurées par une version installée de Dolibarr==&lt;br /&gt;
&lt;br /&gt;
Les versions 10.0 et supérieures contiennent l&#039;ensemble des exigences et notamment le module &amp;quot;Log inaltérable&amp;quot; qu&#039;il vous revient d&#039;activer (l&#039;obligation d&#039;activation dépend du fait que vous êtes concerné ou non, voir FAQ précédente pour cela). L&#039;application est une application Open Source, le client utilisateur peut réussir à modifier le code (notons que ceci est aussi possible avec du propriétaire, juste plus difficile). De même, un hacker peut toujours réussir à trafiquer un logiciel. Face à cela, Dolibarr fourni un outil pour obtenir la liste de tous les fichiers qui auraient été modifiés par rapport à la version officielle, ou par rapport à une version packagée par un intégrateur tiers, ainsi que la liste des paramètres de configuration obligatoires pour la conformité (voir plus bas) et qui aurait aussi été modifiés. Le certificat étant délivré pour une version avec une configuration donnée, si un utilisateur ou hacker a pu altérer partiellement l&#039;application sur du code ou des paramètres sensibles, l&#039;outil de contrôle pourra le révéler, auquel cas, la responsabilité de non conformité n&#039;est plus du ressort de l&#039;entité qui a fournit l&#039;attestation, puisque ce n&#039;est plus la même application, mais de la responsabilité de celui qui est à l&#039;origine des modifications.&lt;br /&gt;
&lt;br /&gt;
Paramètres recommandées à contrôler/imposer dans une attestation:&lt;br /&gt;
&lt;br /&gt;
*Pays de la société (doit rester à France). Rem: Une fois le premier encaissement fait avec le module &amp;quot;Log inaltérable&amp;quot;, sa désactivation renverra un warning.&lt;br /&gt;
*Constante MAIN_MODULE_BLOCKEDLOG doit être définie (Cela signifie que le module &amp;quot;Log inaltérable&amp;quot; est bien actif).&lt;br /&gt;
&lt;br /&gt;
Optionnellement, vous pouvez:&lt;br /&gt;
&lt;br /&gt;
*Imposer que la constante BLOCKEDLOG_DISABLE_NOT_ALLOWED_FOR_COUNTRY soit définie et contient le code pays FR (ceci bloque la désactivation du module par erreur).&lt;br /&gt;
&lt;br /&gt;
Remarque:&lt;br /&gt;
Vous pouvez utiliser l&#039;outil &#039;&#039;&#039;build/generate_filecheck_xml.php&#039;&#039;&#039; pour générer un fichier empreinte de la version et/ou paramétrage donné que vous voulez imposer.&lt;br /&gt;
Ensuite utilisez l&#039;outil dans le menu &#039;&#039;&#039;Accueil - Outils administration - Dolibarr - Files integrity check&#039;&#039;&#039; ou bien à distance l&#039;API &#039;&#039;&#039;/setup/checkintegrity&#039;&#039;&#039; (le module API REST doit avoir été activée) pour vérifier qu&#039;une version est conforme à ce fichier empreinte.&lt;br /&gt;
&lt;br /&gt;
==Je suis dans le périmètre de la loi, j&#039;ai ajouté un module externe sur mon Dolibarr, faut-il une attestation Loi Finance pour ce module ?==&lt;br /&gt;
&lt;br /&gt;
Il n&#039;y a pas de notion de &amp;quot;certificat ou d&#039;attestation loi finance&amp;quot; sur un module.&lt;br /&gt;
&lt;br /&gt;
En effet, ce qui doit être certifié ou attesté, c&#039;est la partie du logiciel qui réalise les enregistrements des paiements, pris dans le contexte de l&#039;ensemble du système d&#039;information, et non chaque module de votre application individuellement. Le logiciel Dolibarr v10 ou + est attestable, donc, si vous êtes dans le périmètre de la loi, ce qu&#039;il vous faut obtenir, c&#039;est une attestation de conformité de l&#039;ensemble de la solution, validant les modules ajoutés qui impactent l&#039;enregistrement des paiements. Donc, &lt;br /&gt;
&lt;br /&gt;
*Si vous êtes dans le périmètre de la loi et que le module ajouté ne concerne pas l&#039;enregistrement des paiements, il n&#039;y a rien de particulier à faire de plus (dès lors que vous êtes dans le périmètre de la loi, vous devez obtenir l&#039;attestation pour les fonctions encaissements de paiements de votre Dolibarr, peu importe que vous ajoutiez ce module ou pas, le module n&#039;ayant pas d&#039;effet sur les fonctions d&#039;encaissements, on perle d&#039;effet trivial ou mineur au code).&lt;br /&gt;
*Si toutefois, vous êtes dans le périmètre de la loi et que le module touche à la partie encaissement, il faudra que le tiers fournissant l&#039;attestation prenne en considération ce module (si vous aviez déjà obtenu l&#039;attestation, il vous faudra la ré-obtenir car l&#039;ajout du module l&#039;invalide puisque ce module touche au code de la partie encaissement des paiements).&lt;br /&gt;
&lt;br /&gt;
La nature du module doit vous permettre de savoir si c&#039;est un module qui touche à l&#039;enregistrement des encaissements ou pas. Dans le doute, renseignez vous auprès de l&#039;auteur du module (ce n&#039;est pas lui qui fournira l&#039;attestation mais pourra dire si le module doit être pris en compte ou non dans le processus d&#039;attestation).&lt;br /&gt;
&lt;br /&gt;
=Travaux dans Dolibarr pour permettre la conformité via attestation=&lt;br /&gt;
&lt;br /&gt;
Et Dolibarr dans tout cela ?&lt;br /&gt;
Dolibarr v10+ est prêt et attestable sur l&#039;intégralité de ses modules standard.&lt;br /&gt;
Voici le suivi des travaux réalisés depuis la v5: [[Loi article 88 finances 2016 et Certification NF525 - Travaux Dolibarr]]&lt;br /&gt;
&lt;br /&gt;
=Où trouver un modèle d&#039;attestation ?=&lt;br /&gt;
Les services des impôts proposent un modèle d&#039;attestation individuelle que vous pouvez consulter [https://bofip.impots.gouv.fr/bofip/10692-PGP.html/identifiant%3DBOI-LETTRE-000242-20201230 dans le Bulltein Officiel des Impots du 30/12/2020]&lt;br /&gt;
&lt;br /&gt;
=Notes et références=&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Synthèse détaillée du BOFIP par La Revue Fiduciaire, rédigé le 06/10/2016:  [http://revuefiduciaire.grouperf.com/article/3661/hb/20160919173548859.html Article sur la revue fiduciaire]&lt;br /&gt;
*Synthèse courante par l&#039;APRIL (document en évolution permanente): https://pad.april.org/p/logiciel-caisse-publication-BOI&lt;br /&gt;
*Article de l&#039;APRIL: https://www.april.org/loi-de-finances-2016-une-doctrine-fiscale-qui-reconnait-les-logiciels-libres-mais-avec-une-marge-de&lt;br /&gt;
*Echanges sur les mailing-list de l&#039;April: https://listes.april.org/wws/arc/comptabilite/ (réservé aux adhérents April)&lt;br /&gt;
*Note d&#039;information très courte du service public: https://www.service-public.fr/professionnels-entreprises/actualites/A10279&lt;br /&gt;
*http://creativekara.fr/doku.php?id=pasteque:lf2016&lt;br /&gt;
*Réunion entre le chef de projet Dolibarr, autres représentants April et le ministère des finances en 2018 pour participation à la refonte et clarification du texte de loi.&lt;/div&gt;</summary>
		<author><name>Florian.mortgat</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Roadmap_and_Release_14.0.0&amp;diff=52336</id>
		<title>Roadmap and Release 14.0.0</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Roadmap_and_Release_14.0.0&amp;diff=52336"/>
		<updated>2021-10-22T14:45:09Z</updated>

		<summary type="html">&lt;p&gt;Florian.mortgat: Added warning about signature change vs. 13.0 for LignePrelevement::construct() and RejetPrelevement::construct()&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:RoadMap]]&lt;br /&gt;
{{TemplateVersion|&lt;br /&gt;
version=14.0| &lt;br /&gt;
date=July 2021|&lt;br /&gt;
mainfocus=... }} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Flag_fr}} https://www.atm-consulting.fr/les-nouveautes-de-la-version-14-0-de-dolibarr-erp-crm/&lt;br /&gt;
&lt;br /&gt;
{{Flag_fr}} https://easya.solutions/comptabilite-nouveautes-easya-solutions-dolibarr-v14/&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Detailed Changelog&#039;&#039;&#039;:&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For users:&lt;br /&gt;
----------&lt;br /&gt;
NEW: Module Recruitement to follow application to job positions is now stable.&lt;br /&gt;
NEW: Feature to make Stock Inventories&lt;br /&gt;
NEW: Several security issues after a second private bug hunting campaign.&lt;br /&gt;
NEW: A lot of fix into english text after a small proofreading campaign (still not perfect, but really better)&lt;br /&gt;
NEW: All main menu entries are using the picto of the module&lt;br /&gt;
NEW: Add a copy to clipboard button on some fields&lt;br /&gt;
NEW: Add an example of scheduled job to send email reminder for unpaid invoices&lt;br /&gt;
NEW: Add some color and picto for the direction of movement&lt;br /&gt;
NEW: add the column &amp;quot;Channel&amp;quot; into the list of orders&lt;br /&gt;
NEW: Add the column &amp;quot;alias&amp;quot; of company in the list of proposal, order, invoice&lt;br /&gt;
NEW: Add the column &amp;quot;Office phone&amp;quot; and  &amp;quot;User mobile&amp;quot; in user list&lt;br /&gt;
NEW: Add the column &amp;quot;Price level&amp;quot; in thirdparty list&lt;br /&gt;
NEW: Add some company information in the dropdown login menu&lt;br /&gt;
NEW: Add edit/delete action icons on categories list pages&lt;br /&gt;
NEW: Add hidden option to auto load input line extrafield into new lines&lt;br /&gt;
NEW: Add import profile to import BOM&lt;br /&gt;
NEW: Add link picto to the stock movement on the detail of production&lt;br /&gt;
NEW: Add mass action &amp;quot;Set tag&amp;quot; for product/service, user, thirdparty, warehouse, project, bank account, members&lt;br /&gt;
NEW: Add bulk action Validate and Set to billed on order list.&lt;br /&gt;
NEW: Add possibility to exports userGroups fields on user exports&lt;br /&gt;
NEW: Can search on lots or serials into the quick search bar&lt;br /&gt;
NEW: Add support for Friday as a non working day&lt;br /&gt;
NEW: auto notification with module Notification can use templated emails&lt;br /&gt;
NEW: Can clone a cron job&lt;br /&gt;
NEW: Can create a lot from the list view (Look and feel standardization).&lt;br /&gt;
NEW: Can filter on extrafields date on lists&lt;br /&gt;
NEW: Can filter on rowid in list of blocked logs&lt;br /&gt;
NEW: Can hide columns &amp;quot;time consumed&amp;quot; on timesheet per week&lt;br /&gt;
NEW: Can set an employee on each social contribution&lt;br /&gt;
NEW: Can set order of execution of hooks&lt;br /&gt;
NEW: Can toggle FCKeditor on public/private notes&lt;br /&gt;
NEW: Check update availability for externals modules using a button on module page&lt;br /&gt;
NEW: Choose lines to use while creating intervention card from origin&lt;br /&gt;
NEW: Columns shipment method, payment mode, payment term in proposal and order list&lt;br /&gt;
NEW: Conf for default actioncomm status&lt;br /&gt;
NEW: Dictionary for availability - Add a column position&lt;br /&gt;
NEW: Can set a user related to a social contribution&lt;br /&gt;
NEW: ICS Direct debit can be set with a different value for each bank account&lt;br /&gt;
NEW: LDAP: usergroup search can be filtered&lt;br /&gt;
NEW: Make public bookmarks editable by admin users only&lt;br /&gt;
NEW: If main logo not defined, can use the squarred logo on login page&lt;br /&gt;
NEW: The manifest file can use the squared image if available&lt;br /&gt;
NEW: Enhance the multicurrency rate editor&lt;br /&gt;
NEW: Normalyse Type company field with ajax combobox&lt;br /&gt;
NEW: preload product description on selection for customer propal/order/invoice&lt;br /&gt;
NEW: Search usergroups &amp;amp; resources&lt;br /&gt;
NEW: Setup Page for module creation with module builder enhancement #FoundationFunding&lt;br /&gt;
NEW: Show picto of module into the list of dictionaries&lt;br /&gt;
NEW: Show the total of payment on the payment confirmation page&lt;br /&gt;
NEW: The global setup for Mandatory fields can now be done on combo list too.&lt;br /&gt;
NEW: translate in &amp;quot;en_US&amp;quot; to complete PR 16980&lt;br /&gt;
NEW: Update the list of taxes available by default for France&lt;br /&gt;
NEW: Salary payment request and Salary payment are 2 different steps in workflow on Salary payment recording&lt;br /&gt;
NEW: VAT payment request and VAT payment are now 2 different steps in workflow on VAT payment recording&lt;br /&gt;
NEW: VAT report - Optimisation &amp;amp; collapse by rate&lt;br /&gt;
NEW: When a doc file is shared, link is visible from the main page of doc.&lt;br /&gt;
NEW: #16378 more E-Mail Contact substitution Values for better salutation&lt;br /&gt;
NEW: option to keep the &amp;quot;Automatically create the payment&amp;quot; checkbox empty on the tax creation page&lt;br /&gt;
&lt;br /&gt;
Accountancy&lt;br /&gt;
NEW: Accountancy - Add FEC import&lt;br /&gt;
NEW: Accountancy - Add a confirmation form with options on export&lt;br /&gt;
NEW: Accountancy - Add select date from/to in already bind customer and supplier list&lt;br /&gt;
NEW: Accountancy - Format FEC - Add new field DateLimitReglmt&lt;br /&gt;
NEW: Accountancy - In ledger &amp;amp; journals, show link on bank transaction&lt;br /&gt;
NEW: Accountancy - Possibility to filter on journals in balance&lt;br /&gt;
NEW: Accountancy - Add a page to list subledger accounts&lt;br /&gt;
NEW: Multiselect ledger account code filter on book keeping list&lt;br /&gt;
&lt;br /&gt;
Agenda&lt;br /&gt;
NEW: add support for Friday as a non working day&lt;br /&gt;
NEW: can show the leave dates/holidays on the agenda view&lt;br /&gt;
NEW: Support color for types of event&lt;br /&gt;
&lt;br /&gt;
Bank&lt;br /&gt;
NEW: Bank Entries : display user linked to a salary or a taxes&lt;br /&gt;
NEW: Add bulk actions for Bank Transfer&lt;br /&gt;
&lt;br /&gt;
ECM/GED&lt;br /&gt;
NEW: add DB fields note_public and note_private for ECM module&lt;br /&gt;
NEW: can filter files in ECM/GED on status Shared / Not shared&lt;br /&gt;
&lt;br /&gt;
Invoices&lt;br /&gt;
NEW: add a check to avoid an invoice date in the future&lt;br /&gt;
NEW: add the total of margin in invoice list&lt;br /&gt;
NEW: can set a percentage when creating an invoice from another object&lt;br /&gt;
NEW: Support down payment on supplier invoice (&amp;amp; somes ajustments)&lt;br /&gt;
&lt;br /&gt;
Margin&lt;br /&gt;
NEW: add the total of margin in invoice list&lt;br /&gt;
NEW: add the total of margin in page by user&lt;br /&gt;
&lt;br /&gt;
Members&lt;br /&gt;
NEW: #17292 default subscription amount by adherent type&lt;br /&gt;
NEW: option to automatically create a login/user when a new subscription of a member is done online&lt;br /&gt;
NEW: option to select membership type on the online payment page for membership subscription or renewal&lt;br /&gt;
&lt;br /&gt;
Products&lt;br /&gt;
NEW: Add price min and price min including tax into product export&lt;br /&gt;
NEW: Add a ref in product customer price&lt;br /&gt;
NEW: customer ref for product customer prices&lt;br /&gt;
NEW: Set status of all variants when changing status of parent&lt;br /&gt;
&lt;br /&gt;
Projects/Tasks&lt;br /&gt;
NEW: option to automatically close an open project when all its tasks are done (=progress 100%)&lt;br /&gt;
NEW: can show the project ref into PDF documents&lt;br /&gt;
NEW: when we add contacts/users to a project, ask to also affect them on tasks&lt;br /&gt;
NEW: Can hide columns &amp;quot;time consumed&amp;quot; on timesheet per week&lt;br /&gt;
&lt;br /&gt;
Proposals&lt;br /&gt;
NEW: add bulk action to set a commercial proposal to status &amp;quot;Refused&amp;quot;&lt;br /&gt;
NEW: can set a warehouse in a proposal&lt;br /&gt;
NEW: date and user signature on proposal (Issue 16062) #16980&lt;br /&gt;
&lt;br /&gt;
Shipment&lt;br /&gt;
NEW: add option in Workflow module to set a shipment as closed&lt;br /&gt;
&lt;br /&gt;
TakePOS&lt;br /&gt;
NEW: delayed payment in TakePOS  #14456?&lt;br /&gt;
NEW: display date range if exist in TakePOS&lt;br /&gt;
NEW: display resiliate status in TakePOS for member&lt;br /&gt;
NEW: edit sales lines rights in TakePOS&lt;br /&gt;
NEW: option for TakePOS to show the total price without tax&lt;br /&gt;
NEW: more permissions in TakePOS (can edit added line, can modify once order sent to kitchen)&lt;br /&gt;
&lt;br /&gt;
Third Party / Contacts&lt;br /&gt;
NEW: add contact tag and bulk email status on the thirdparty + contact create form&lt;br /&gt;
NEW: can set a warehouse on a thirdparty&lt;br /&gt;
&lt;br /&gt;
Tickets&lt;br /&gt;
NEW: can use captcha on public page to create a ticket  #16347&lt;br /&gt;
NEW: can set if a ticket group is visible on public interface or not&lt;br /&gt;
&lt;br /&gt;
Warehouse/Stock&lt;br /&gt;
NEW: Feature to make Stock Inventories&lt;br /&gt;
NEW: can make massive stock transfers from a CSV file&lt;br /&gt;
NEW: Stock movement list - add more complete date field&lt;br /&gt;
NEW: can set a warehouse in a proposal&lt;br /&gt;
NEW: can set a warehouse on a thirdparty&lt;br /&gt;
&lt;br /&gt;
Website Module&lt;br /&gt;
NEW: #17113 Can upload a favicon in website module&lt;br /&gt;
NEW: add a new permission &amp;quot;Export website&amp;quot;&lt;br /&gt;
NEW: add last date of modification for website pages in the list of pages&lt;br /&gt;
NEW: Save old page with .old extension on disk when editing a website page&lt;br /&gt;
&lt;br /&gt;
Workflows&lt;br /&gt;
NEW: add option in Workflow module to set a shipment as closed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for Admins&lt;br /&gt;
NEW: Add a security center page with all information and advices related to the security of your instance&lt;br /&gt;
NEW: Add a performance center page with all information and advices related to the performance of your instance&lt;br /&gt;
&lt;br /&gt;
Modules&lt;br /&gt;
NEW: Module Recruitement is now stable&lt;br /&gt;
NEW: start new experimental module Event Organization Management&lt;br /&gt;
NEW: start new experimental module Partnership Management&lt;br /&gt;
NEW: start new experimental module Knowledge Management&lt;br /&gt;
NEW: start new experimental module Workstations Management&lt;br /&gt;
NEW: Check update availability for externals modules using a button on module page&lt;br /&gt;
Module SimplePOS is deprecated - TakePOS is recommended for the future&lt;br /&gt;
&lt;br /&gt;
new Options&lt;br /&gt;
NEW: add option  CONTRACT_ALLOW_EXTERNAL_DOWNLOAD            to make generated doc automatically shared&lt;br /&gt;
NEW: add option  SUPPLIER_PROPOSAL_ALLOW_EXTERNAL_DOWNLOAD   to make generated doc automatically shared&lt;br /&gt;
NEW: add option  MAIN_SECURITY_ANTI_SSRF_SERVER_IP           to define list of IPs that are local IPs&lt;br /&gt;
NEW: add option  SOCIETE_DISABLE_WORKFORCE                   to hide staff field&lt;br /&gt;
NEW: add constant  MAIN_BUGTRACK_URL                         to set a custom url to redirect to when clicking on link &amp;quot;declare a bug&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For developers:&lt;br /&gt;
---------------&lt;br /&gt;
NEW: Can edit an object property in module builder&lt;br /&gt;
NEW: Add data-eec=1 for EEC countries on select for js interaction&lt;br /&gt;
NEW: Add experimental repair script to switch to dynamic row format and utf8mb4 encoding&lt;br /&gt;
NEW: Add function showValueWithClipboardCPButton() to add a copy/paste&lt;br /&gt;
NEW: Upgrade Stripe PHP lib to 7.67.0&lt;br /&gt;
NEW: Support sepa_debit in stripe paymentmethods list&lt;br /&gt;
NEW: Update doleditor.class.php for easily activate SCAYT&lt;br /&gt;
NEW: Add triggers in the function add_object_linked(), updateObjectLinked() and deleteObjectLinked()&lt;br /&gt;
NEW: Add triggers OBJECT_LINK_INSERT, OBJECT_LINK_UPDATE et OBJECT_LINK_DELETE in the function add_object_linked(), updateObjectLinked() and deleteObjectLinked()&lt;br /&gt;
NEW: can set a target image in dolcropresize function&lt;br /&gt;
NEW: can set a label as placeholder for combo lists&lt;br /&gt;
NEW: Add pagination on Get Products response API&lt;br /&gt;
NEW: Add the DefaultValues CRUD class&lt;br /&gt;
NEW: Extrafields of documents lines are inside the lines, not any more on separate TR&lt;br /&gt;
NEW: unit selection on object edit line&lt;br /&gt;
&lt;br /&gt;
APIs&lt;br /&gt;
NEW: API add option $includeifobjectisused to get a product&lt;br /&gt;
NEW: API get the list of product ids only&lt;br /&gt;
NEW: add link to OpenAPI specifications XML file in REST API module setup: swagger.json file can be included into external tools like redoc&lt;br /&gt;
NEW: add native compression in REST APIs&lt;br /&gt;
NEW: Product Variants API, add variant stock to response by parameter&lt;br /&gt;
NEW: Product API route added to get product stock and product with or without variants #13739 #17390&lt;br /&gt;
&lt;br /&gt;
Hooks&lt;br /&gt;
NEW: hook printFieldListTitle for cabyprodserv.php&lt;br /&gt;
NEW: hook to allow external modules to add their own shortlist of recent objects&lt;br /&gt;
NEW: SQL-altering hooks in the turnover by product report&lt;br /&gt;
NEW: add form confirm hook on company card&lt;br /&gt;
NEW: add hook addSectionECMAuto method to add custom diretory into ECM auto files&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
WARNING:&lt;br /&gt;
&lt;br /&gt;
Following changes may create regressions for some external modules, but were necessary to make Dolibarr better:&lt;br /&gt;
* Module SimplePOS is deprecated. If you need a POS module, please use the module TakePOS.&lt;br /&gt;
* The ICS value for direct debit or credit transfer is now stored on each bank account instead of into the global setup.&lt;br /&gt;
* API /setup/shipment_methods has been replaced with API /setup/shipping_methods&lt;br /&gt;
* Field &amp;quot;total&amp;quot; renamed into &amp;quot;total_ht&amp;quot;  for table llx_facture, llx_facture_rec for better field name consistency&lt;br /&gt;
* Field &amp;quot;tva&amp;quot;   renamed into &amp;quot;total_tva&amp;quot; for table llx_propal, llx_supplier_proposal, llx_commande, llx_commande_fournisseur for better field name consistency&lt;br /&gt;
* Field &amp;quot;total&amp;quot; renamed into &amp;quot;total_ttc&amp;quot; for table llx_propal, llx_supplier_proposal for better field name consistency&lt;br /&gt;
* Signature changed: one more required parameter for the constructor of LignePrelevement and RejetPrelevement&lt;br /&gt;
* If your database is PostgreSQL, you must use version 9.1.0 or more (Dolibarr need the SQL function CONCAT)&lt;br /&gt;
* If your database is MySQL or MariaDB, you need at least version 5.1&lt;br /&gt;
* Function set_price_level() has been renamed into setPriceLevel() to follow camelcase rules&lt;br /&gt;
* removed deprecated subtituion key  __REFCLIENT__  (replaced with __REF_CLIENT__)&lt;br /&gt;
* Removed constant MAIN_COUNTRIES_IN_EEC. You can now set if country is in Europe or not from the dictionary of countries.&lt;/div&gt;</summary>
		<author><name>Florian.mortgat</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Installation_-_Upgrade&amp;diff=51734</id>
		<title>Installation - Upgrade</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Installation_-_Upgrade&amp;diff=51734"/>
		<updated>2021-08-02T16:48:52Z</updated>

		<summary type="html">&lt;p&gt;Florian.mortgat: /* File:Gnu.png With Dolibarr (standard .zip package or from git) */ add --depth to git clone command + explanation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN origin interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- You can edit this section but do NOT remove these comments&lt;br /&gt;
     Links below will be automatically replicated on translated pages by PolyglotBot --&amp;gt;&lt;br /&gt;
[[fr:Installation_-_Mise_à_jour]]&lt;br /&gt;
[[es:Instalación_-_Actualización]]&lt;br /&gt;
[[zh:安装_-_升级]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Admin_en]]&lt;br /&gt;
{{TemplateDocUser}}&lt;br /&gt;
&lt;br /&gt;
The following documentation describes processes to install or upgrade Dolibarr on a Windows, MAC OS or Unix like platform.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Install Dolibarr=&lt;br /&gt;
This chapter describe different available methods to install Dolibarr for the first time (from the most simple to the manual one). See next chapter for upgrades.&lt;br /&gt;
&lt;br /&gt;
==On your dedicated computer/server (installation &amp;quot;On Premise&amp;quot;)==&lt;br /&gt;
===[[File:Logo_windows.png]] Manually or with DoliWamp===&lt;br /&gt;
- &#039;&#039;&#039;Prerequisite&#039;&#039;&#039;: Windows&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Level&#039;&#039;&#039;: Non experienced users&lt;br /&gt;
&lt;br /&gt;
This process works only for Windows users and is recommended for user with no computer knowledge. If you have experience with Apache, PHP and Mysql installation, next chapter is better for you. &lt;br /&gt;
&lt;br /&gt;
If you have time and want to learn how to install an Apache, PHP and MariaDB web server, see the [[Manual installation on Windows]] page for step-by-step instructions.&lt;br /&gt;
&lt;br /&gt;
However, if you are a newbie user and running Windows, you can use DoliWamp. DoliWamp is a specialized Dolibarr distribution for Windows. This distribution allows you to make an installation under Windows with all prerequisites (Apache, Mysql, PHP) and with no computer knowledge. This is steps to install DoliWamp:&lt;br /&gt;
&lt;br /&gt;
*Download last Dolibarr version for Windows DoliWamp.&lt;br /&gt;
&lt;br /&gt;
For this, see at {{TemplateURLToDownloadDoliWamp}}&lt;br /&gt;
&lt;br /&gt;
*Run the downloaded .exe and follow instructions.&lt;br /&gt;
&lt;br /&gt;
===[[File:Logo_ubuntu.png]] With DoliDeb (Debian or Ubuntu .deb package)===&lt;br /&gt;
- &#039;&#039;&#039;Prerequisite&#039;&#039;&#039;: Linux Ubuntu&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Level&#039;&#039;&#039;: Non experienced users&lt;br /&gt;
&lt;br /&gt;
This process works only for Ubuntu or Debian Linux users and is recommended for user with little computer knowledge. If you are experienced with Apache, PHP and Mysql installation, the chapter &#039;with standard package&#039; is better for you. However, if you are a newbie user and running Ubuntu, you can use DoliDeb. DoliDeb is a specialized Dolibarr distribution for Debian or Ubuntu. This distribution allows you to make an installation under Ubuntu with all prerequisites (Apache, Mysql, PHP) and with no computer knowledge.&lt;br /&gt;
&lt;br /&gt;
*Steps to install DoliDeb are described into page [[Dolibarr for Ubuntu or Debian]].&lt;br /&gt;
&lt;br /&gt;
===[[File:Logo_rpm.png|42px]] With DoliRpm (Fedora, Redhat, Mandriva, Mageia or OpenSuse .rpm package)===&lt;br /&gt;
- &#039;&#039;&#039;Prerequisite&#039;&#039;&#039;: Linux Fedora, Redhat, Mandriva, Mageia or OpenSuse&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Level&#039;&#039;&#039;: Non experienced users&lt;br /&gt;
&lt;br /&gt;
This process works only for Fedora, Redhat, Mandriva, Mageia or OpenSuse Linux users and is recommended for user with no computer knowledge. If you have experience with Apache, PHP and Mysql installation, next chapter &#039;with standard package&#039; is better for you. However, if you are a newbie user and running Fedora or Redhat, you can use DoliRpm. DoliRpm is a specialized Dolibarr distribution for Fedora, Redhat or Mandriva. This distribution allows you to make an installation under such OS with all prerequisites (Apache, Mysql, PHP) and with no computer knowledge.&lt;br /&gt;
&lt;br /&gt;
*Steps to install DoliRpm are described into page [[Dolibarr for Redhat or Fedora (rpm package)]] or [[Dolibarr for Mandriva or Mageia (rpm package)]] or [[Dolibarr for OpenSuse (rpm package)]].&lt;br /&gt;
&lt;br /&gt;
===[[File:Gnu.png]] With Dolibarr (standard .zip package or from git)===&lt;br /&gt;
- &#039;&#039;&#039;Prerequisite&#039;&#039;&#039;: Apache, PHP and a database server (MySQL or PostgreSQL) are already running correctly and user/pass (of a new database or root server) is known.&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Level&#039;&#039;&#039;: Users with few Web and Database administration knowledge.&lt;br /&gt;
&lt;br /&gt;
This procedure describe manual (and recommended) installation on a GNU/Linux system (Debian, Mandriva, ...), it can be used for other OS with minor changes.&lt;br /&gt;
You can follow this tutorial for any Dolibarr version &amp;gt;= 2.0.0&lt;br /&gt;
&lt;br /&gt;
*Check that you have installed Apache, PHP {{PHPMinVersion}} and a database server (MySQL {{MySqlMinVersion}} or PostGreSQL) correctly (check list of installed packaged on your server by using the package manager of your distribution). If not, install them (use last recent version).&lt;br /&gt;
&lt;br /&gt;
*Check that main root or admin user/password couple for the server is known and works correctly. If this root or admin user/password is not known because not yet defined, read following chapter. Otherwise go on next step:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MySQL database :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
For Linux users, if you have just installed a MySQL server, the admin user is&#039;&#039;&#039; root&#039;&#039;&#039;. If the root password has never been set yet, you must run the following command to initialize the password:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mysql    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Once in Mysql interface, run the SQL command to modify the root password:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
grant all privileges on *.* to root@&#039;localhost&#039; identified by &#039;newrootpass&#039; with grant option;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Then enter and \q to quit.&lt;br /&gt;
&lt;br /&gt;
To check that the connection with the new couple user/password works, launch the command&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mysql -u root -p&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
And type your password &#039;&#039;newrootpass&#039;&#039; then \q to quit if the connection has been successful.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PostgreSQL database :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
For Linux users, if you have just installed a PostgreSQL server, you must run the following command to initialize an admin user and password. For this, add the following line in file &#039;&#039;&#039;/etc/postgresql/x.x/main/pg_hba.conf&#039;&#039;&#039; (replace x.x with your postgres version)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
local   all         dolibarrowner    md5        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Also, comment the line&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
#local   all         all                               ident&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
This line ensure that system login used to connect to database (it will be login the web server run with), is same than database account (this is never the case).&lt;br /&gt;
&lt;br /&gt;
Then launch commands from a root shell&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo -s -u postgres&lt;br /&gt;
createuser dolibarrowner&lt;br /&gt;
psql -U postgres -d template1&lt;br /&gt;
alter user dolibarrowner with password &#039;dolibarrownerpass&#039;;&lt;br /&gt;
ALTER USER dolibarrowner WITH SUPERUSER;&lt;br /&gt;
ALTER USER dolibarrowner WITH CREATEDB;&lt;br /&gt;
ALTER USER dolibarrowner WITH CREATEROLE;&lt;br /&gt;
\du&lt;br /&gt;
exit&lt;br /&gt;
sudo /etc/init.d/postgresql restart&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
You can test a connection with this user with command&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
psql -d postgres -U dolibarrowner -W&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
And type your &#039;&#039;dolibarrownerpass&#039;&#039; as password and \q to quit if connection is ok.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;web root :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Go into the directory where to install Dolibarr (the web root directory defined for your web server)&lt;br /&gt;
&lt;br /&gt;
#For Debian and Ubuntu families, it is generally: /var/www (newer versions: /var/www/html)&lt;br /&gt;
#For Mandriva, RedHat, Fedora: /var/www/html&lt;br /&gt;
#For Suse: /srv/www/htdocs&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ cd /var/www&lt;br /&gt;
or&lt;br /&gt;
$ cd /var/www/html&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Get the application archive of last stable version&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;from zip file&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ wget http://www.dolibarr.org/files/dolibarr.zip&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Uncompress archive&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ unzip dolibarr.zip&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;or from git repository&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ git clone --depth 1 -b X.Y http://github.com/Dolibarr/dolibarr.git dolibarr&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Replace X.Y with the version you want to get. Remove &amp;quot;--depth 1&amp;quot; if you don&#039;t mind downloading the entire history of the project (programmers may find it useful but end users probably won&#039;t).&lt;br /&gt;
&lt;br /&gt;
*Rename directory dolibarr-x.y.z into dolibarr to have a directory name that does not depends on version (replace x.y.z with source version)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ mv dolibarr-x.y.z dolibarr&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Change permissions and owner of the &#039;dolibarr&#039; directory to that of the group under which the web server runs (assumed to be &#039;www-data&#039; for debian, &#039;apache&#039; for redhat, mandriva, fedora)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ chmod -R 755 /var/www/dolibarr&lt;br /&gt;
$ chown -R www-data.www-data /var/www/dolibarr&lt;br /&gt;
or&lt;br /&gt;
$ chmod -R 755 /var/www/html/dolibarr&lt;br /&gt;
$ chown -R apache.apache /var/www/html/dolibarr&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*For Fedora, since SELinux is usually enabled, it is also advisable to run the following commands to make the &#039;dolibarr&#039; directory compliant with the SELinux requirement (else you are likely to get quite a few alerts) :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ semanage fcontext -a -t httpd_sys_rw_content_t &#039;/var/www/html/dolibarr(/.*)?&#039;&lt;br /&gt;
$ restorecon -R -v &#039;/var/www/html/dolibarr&#039;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*As a root user, create, into directory dolibarr/htdocs/conf, an empty configuration file called conf.php and set the web server user as owner (for instance www-data on Debian, apache on Mandriva, RedHat, Fedora or other distributions ...). This is required because the web server will have to write into this file during install process.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ cd dolibarr ; touch htdocs/conf/conf.php ; chown www-data htdocs/conf/conf.php&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Note: For Ubuntu no need of htdocs, you just have to make dolibarr root by placing all files and folders of htdocs in /var/www/dolibarr then from browser do &amp;lt;MyIP&amp;gt;/dolibarr/index.php (see this discussion as reference to this addendum [http://askubuntu.com/questions/874456/php-code-displays-in-browser?noredirect=1#comment1357943_874456])&lt;br /&gt;
&lt;br /&gt;
*As a root user, create a directory that will be used to save all files generated and stocked by Dolibarr (PDf invoices, uploaded images, ...), and attribute to this directory a owner that must be the web server (example www-data on Debian, apache on Mandriva, RedHat, Fedora...). The web server must have write permission into this directory. It is recommanded to use a directory outside of your directory of web pages, for example - &amp;quot;/var/lib/dolibarr/documents&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir -p /var/lib/dolibarr/documents ; chown www-data /var/lib/dolibarr/documents&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Now call your browser to point to the main page&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
http://127.0.0.1/dolibarr/htdocs/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
or if you didn&#039;t create the htdocs directory&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
http://127.0.0.1/dolibarr/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Follow instructions of setup steps until end of install process.&lt;br /&gt;
&lt;br /&gt;
*For security reason, we recommend, once setup is finished, to create a file install.lock into Dolibarr document directory that only root user can delete. This will lock the call of the install process again (you will have to remove this file for upgrades).&lt;br /&gt;
&lt;br /&gt;
If this is not done, Dolibarr will show you a warning once logged by an administrator user.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ touch /var/lib/dolibarr/documents/install.lock; chmod go-w /var/lib/dolibarr/documents;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==On a mutualized Web Hosting Provider (without terminal/SSH access)==&lt;br /&gt;
It is not possible to provide a generic documentation to install Dolibarr on a particular Web hosting provider as this depends on provider.&lt;br /&gt;
In most cases, using the following process should works for most providers:&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Prerequisite&#039;&#039;&#039;: Apache web server, PHP and a database server (MySQL or PostgreSQL) are already running correctly and user/pass (of a new database or root server) is known.&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Level&#039;&#039;&#039;: Users with few Web and Database administration knowledge. Knowledge to use a tool (FTP, SFTP) to upload files on the server.&lt;br /&gt;
&lt;br /&gt;
*Check that you have an Apache web server, PHP and a database server (MySQL or PostGreSQL) that works correctly.&lt;br /&gt;
&lt;br /&gt;
[[File:warning.png]] Warning, check that code page of PHP server and database server are same (utf8 recommended).&lt;br /&gt;
&lt;br /&gt;
*Check that main root or admin user/password couple for the server is known and works correctly. Ask them to your Web Hosting Provider if unknown.&lt;br /&gt;
&lt;br /&gt;
*Get the application archive of last stable version and uncompress it locally.&lt;br /&gt;
&lt;br /&gt;
*Upload all content of htdocs directory to your web root directory, for example using FTP in binary mode.&lt;br /&gt;
&lt;br /&gt;
*Create a directory called &amp;quot;documents&amp;quot; into Dolibarr directory that will serve to save all documents generated and stocked by Dolibarr (PDF invoices, uploaded images, ...). The web server must have write permission into this directory. You can set permissions with your FTP client.&lt;br /&gt;
&lt;br /&gt;
*Now call your browser to point to the main page index.php&lt;br /&gt;
&lt;br /&gt;
*Follow instructions of setup steps until end of install process.&lt;br /&gt;
&lt;br /&gt;
*For security reason, we recommend, once setup is finished, to create a file install.lock into Dolibarr installed directory. This will lock the call of the install process again (you will have to remove it for upgrades). If this is not done, Dolibarr will show you a warning once logged as an administrator user.&lt;br /&gt;
&lt;br /&gt;
==On a SaaS or Cloud web hosting provider==&lt;br /&gt;
Dolibarr is also available on a lot of &amp;quot;ready to use&amp;quot; SaaS or Cloud platforms/services that provides preinstalled versions.&lt;br /&gt;
&lt;br /&gt;
See page [[Cloud Solutions]].&lt;br /&gt;
&lt;br /&gt;
Dolibarr can also be installed manually on all Cloud platforms that support PHP and Mysql.&lt;br /&gt;
&lt;br /&gt;
See page [[Cloud Solutions]].&lt;br /&gt;
&lt;br /&gt;
==Using Docker==&lt;br /&gt;
For admins with Docker experience, it is possible to use the docker build files located in the source repo here: https://github.com/Dolibarr/dolibarr/tree/develop/build&lt;br /&gt;
 git clone https://github.com/Dolibarr/dolibarr/&lt;br /&gt;
 cd ./dolibarr&lt;br /&gt;
 git checkout tags/&amp;lt;desiredrelease&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 cd build/docker&lt;br /&gt;
&lt;br /&gt;
 docker-compose up&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Read the README carefully. As of version 12+ it recommends to use the built in docker files for development only, while an outside repo: https://hub.docker.com/r/tuxgasy/dolibarr  is recommended for production environments.&lt;br /&gt;
&lt;br /&gt;
=Setup=&lt;br /&gt;
&lt;br /&gt;
==First setup==&lt;br /&gt;
See page [[First setup|Setup]].&lt;br /&gt;
&lt;br /&gt;
==Setup a LDAP connection==&lt;br /&gt;
If you want to use a LDAP: See [[Install and configure OpenLDAP]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Import external data=&lt;br /&gt;
For this operation, read page [[Mass imports]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Upgrade Dolibarr=&lt;br /&gt;
This chapter describe processes to upgrade an existing installation of Dolibarr from an old version to a new one. The process is the same, whatever version you are coming from and version you are going to, but it will differ according to the distribution/operating system you used for your first installation. You should use the same for upgrade.&lt;br /&gt;
 &lt;br /&gt;
==[[File:Logo_windows.png]] With DoliWamp (Windows .exe package)==&lt;br /&gt;
&lt;br /&gt;
*First make a backup of your current installation&lt;br /&gt;
*Download new .exe package of DoliWamp.&lt;br /&gt;
*Run downloaded .exe file and follow steps without changing any default values. This will upgrades all your files.&lt;br /&gt;
*At the end of the execution, your browser is launched with a page to ask you to run upgrade of your database. Choose the upgrade according to your case.&lt;br /&gt;
&lt;br /&gt;
If there is more than one version late, the page in your browser will loop to start again the upgrade wizard as often as required to run upgrade process, version by version, until your reach the new installed version.&lt;br /&gt;
&lt;br /&gt;
==[[File:Logo_ubuntu.png]] With DoliDeb (Debian or Ubuntu .deb package)==&lt;br /&gt;
&lt;br /&gt;
*First make a backup of your current installation&lt;br /&gt;
*Process to upgrade using Debian/Ubuntu package is the same as the install process (see previous chapters), so it is as easy as installing a package.&lt;br /&gt;
&lt;br /&gt;
You can also read page [[Dolibarr for Ubuntu or Debian]].&lt;br /&gt;
&lt;br /&gt;
==[[File:Logo_rpm.png|40px]] With DoliRpm (Fedora, Redhat, Mandriva, Mageia or OpenSuse .rpm package)==&lt;br /&gt;
&lt;br /&gt;
*First make a backup of your current installation&lt;br /&gt;
*Process to upgrade using rpm package is the same as the install process, so it is as easy as installing a package (see previous chapters).&lt;br /&gt;
&lt;br /&gt;
==[[File:Gnu.png]] With Dolibarr (standard .zip package or from Git)==&lt;br /&gt;
This is tutorial to use when using standard distribution for a manual upgrade.&lt;br /&gt;
&lt;br /&gt;
*First make a backup of your current installation&lt;br /&gt;
&lt;br /&gt;
*Go into the directory where you installed Dolibarr (it might be the root directory of your web, for example /var/www under Debian)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ cd /var/www&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===For installation that used the zip file===&lt;br /&gt;
&lt;br /&gt;
*Get archive of last version&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ wget https://www.dolibarr.org/files/dolibarr.zip&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Uncompress the archive&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ unzip dolibarr.zip&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Copy all new extracted files (the one uncompressed into directory dolibarr-x.y.z) to the directory where you put your old Dolibarr version. This will overwrite old files with new ones without removing files specifics to your installation (like conf.php file or complementary non official installed modules).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ cp -r dolibarr-x.y.z/* dolibarr&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*If no error, you can now remove the directory of source files&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ rm -fr dolibarr-x.y.z&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Now open your Dolibarr in your browser. It should open automatically the install/&lt;br /&gt;
&lt;br /&gt;
and choose &#039;&#039;Update&#039;&#039; in suggested menu.&lt;br /&gt;
&lt;br /&gt;
===For installation that used GIT===&lt;br /&gt;
If you already cloned the repo simply upgrade by checking out a version tag like so:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ git checkout 13.0&lt;br /&gt;
$ git pull origin 13.0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Now open your Dolibarr in your browser. It should open automatically the install/&lt;br /&gt;
&lt;br /&gt;
and choose &#039;&#039;Update&#039;&#039; in suggested menu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note: &lt;br /&gt;
&lt;br /&gt;
If you want to script the database upgrade process (to avoid the upgrade process from web browser), you can run the 3 upgrade processes from command line:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ cd htdocs/install&lt;br /&gt;
$ php upgrade.php oldx.oldy.oldz x.y.z &amp;gt; output.html&lt;br /&gt;
$ php upgrade2.php oldx.oldy.oldz x.y.z &amp;gt; output2.html&lt;br /&gt;
$ php step5.php oldx.oldy.oldz x.y.z &amp;gt; output3.html&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Note: z must be &amp;quot;0&amp;quot; because only major versions have a migration script to run.&lt;br /&gt;
&lt;br /&gt;
Return code will be 0 if success, 1 if error (if this happens, see file output.html, output2.html or output3.html).&lt;br /&gt;
&lt;br /&gt;
Note: If you have a message that tell the install process is locked by a file, remove the file install.lock stored in Dolibarr root directory.&lt;br /&gt;
&lt;br /&gt;
*For security reason, once setup is finished, you should create a file install.lock into Dolibarr documents directory. This will lock the call of the install process again (you will have to remove this file for future upgrades). If this is not done, Dolibarr will show you a warning once logged with an administrator user.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ echo &amp;gt; documents/install.lock&lt;br /&gt;
$ chmod 444 documents/install.lock&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Florian.mortgat</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Installation_-_Upgrade&amp;diff=51733</id>
		<title>Installation - Upgrade</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Installation_-_Upgrade&amp;diff=51733"/>
		<updated>2021-08-02T16:42:01Z</updated>

		<summary type="html">&lt;p&gt;Florian.mortgat: /* For installation that used GIT */ fix git commands&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN origin interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- You can edit this section but do NOT remove these comments&lt;br /&gt;
     Links below will be automatically replicated on translated pages by PolyglotBot --&amp;gt;&lt;br /&gt;
[[fr:Installation_-_Mise_à_jour]]&lt;br /&gt;
[[es:Instalación_-_Actualización]]&lt;br /&gt;
[[zh:安装_-_升级]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Admin_en]]&lt;br /&gt;
{{TemplateDocUser}}&lt;br /&gt;
&lt;br /&gt;
The following documentation describes processes to install or upgrade Dolibarr on a Windows, MAC OS or Unix like platform.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Install Dolibarr=&lt;br /&gt;
This chapter describe different available methods to install Dolibarr for the first time (from the most simple to the manual one). See next chapter for upgrades.&lt;br /&gt;
&lt;br /&gt;
==On your dedicated computer/server (installation &amp;quot;On Premise&amp;quot;)==&lt;br /&gt;
===[[File:Logo_windows.png]] Manually or with DoliWamp===&lt;br /&gt;
- &#039;&#039;&#039;Prerequisite&#039;&#039;&#039;: Windows&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Level&#039;&#039;&#039;: Non experienced users&lt;br /&gt;
&lt;br /&gt;
This process works only for Windows users and is recommended for user with no computer knowledge. If you have experience with Apache, PHP and Mysql installation, next chapter is better for you. &lt;br /&gt;
&lt;br /&gt;
If you have time and want to learn how to install an Apache, PHP and MariaDB web server, see the [[Manual installation on Windows]] page for step-by-step instructions.&lt;br /&gt;
&lt;br /&gt;
However, if you are a newbie user and running Windows, you can use DoliWamp. DoliWamp is a specialized Dolibarr distribution for Windows. This distribution allows you to make an installation under Windows with all prerequisites (Apache, Mysql, PHP) and with no computer knowledge. This is steps to install DoliWamp:&lt;br /&gt;
&lt;br /&gt;
*Download last Dolibarr version for Windows DoliWamp.&lt;br /&gt;
&lt;br /&gt;
For this, see at {{TemplateURLToDownloadDoliWamp}}&lt;br /&gt;
&lt;br /&gt;
*Run the downloaded .exe and follow instructions.&lt;br /&gt;
&lt;br /&gt;
===[[File:Logo_ubuntu.png]] With DoliDeb (Debian or Ubuntu .deb package)===&lt;br /&gt;
- &#039;&#039;&#039;Prerequisite&#039;&#039;&#039;: Linux Ubuntu&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Level&#039;&#039;&#039;: Non experienced users&lt;br /&gt;
&lt;br /&gt;
This process works only for Ubuntu or Debian Linux users and is recommended for user with little computer knowledge. If you are experienced with Apache, PHP and Mysql installation, the chapter &#039;with standard package&#039; is better for you. However, if you are a newbie user and running Ubuntu, you can use DoliDeb. DoliDeb is a specialized Dolibarr distribution for Debian or Ubuntu. This distribution allows you to make an installation under Ubuntu with all prerequisites (Apache, Mysql, PHP) and with no computer knowledge.&lt;br /&gt;
&lt;br /&gt;
*Steps to install DoliDeb are described into page [[Dolibarr for Ubuntu or Debian]].&lt;br /&gt;
&lt;br /&gt;
===[[File:Logo_rpm.png|42px]] With DoliRpm (Fedora, Redhat, Mandriva, Mageia or OpenSuse .rpm package)===&lt;br /&gt;
- &#039;&#039;&#039;Prerequisite&#039;&#039;&#039;: Linux Fedora, Redhat, Mandriva, Mageia or OpenSuse&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Level&#039;&#039;&#039;: Non experienced users&lt;br /&gt;
&lt;br /&gt;
This process works only for Fedora, Redhat, Mandriva, Mageia or OpenSuse Linux users and is recommended for user with no computer knowledge. If you have experience with Apache, PHP and Mysql installation, next chapter &#039;with standard package&#039; is better for you. However, if you are a newbie user and running Fedora or Redhat, you can use DoliRpm. DoliRpm is a specialized Dolibarr distribution for Fedora, Redhat or Mandriva. This distribution allows you to make an installation under such OS with all prerequisites (Apache, Mysql, PHP) and with no computer knowledge.&lt;br /&gt;
&lt;br /&gt;
*Steps to install DoliRpm are described into page [[Dolibarr for Redhat or Fedora (rpm package)]] or [[Dolibarr for Mandriva or Mageia (rpm package)]] or [[Dolibarr for OpenSuse (rpm package)]].&lt;br /&gt;
&lt;br /&gt;
===[[File:Gnu.png]] With Dolibarr (standard .zip package or from git)===&lt;br /&gt;
- &#039;&#039;&#039;Prerequisite&#039;&#039;&#039;: Apache, PHP and a database server (MySQL or PostgreSQL) are already running correctly and user/pass (of a new database or root server) is known.&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Level&#039;&#039;&#039;: Users with few Web and Database administration knowledge.&lt;br /&gt;
&lt;br /&gt;
This procedure describe manual (and recommended) installation on a GNU/Linux system (Debian, Mandriva, ...), it can be used for other OS with minor changes.&lt;br /&gt;
You can follow this tutorial for any Dolibarr version &amp;gt;= 2.0.0&lt;br /&gt;
&lt;br /&gt;
*Check that you have installed Apache, PHP {{PHPMinVersion}} and a database server (MySQL {{MySqlMinVersion}} or PostGreSQL) correctly (check list of installed packaged on your server by using the package manager of your distribution). If not, install them (use last recent version).&lt;br /&gt;
&lt;br /&gt;
*Check that main root or admin user/password couple for the server is known and works correctly. If this root or admin user/password is not known because not yet defined, read following chapter. Otherwise go on next step:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;MySQL database :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
For Linux users, if you have just installed a MySQL server, the admin user is&#039;&#039;&#039; root&#039;&#039;&#039;. If the root password has never been set yet, you must run the following command to initialize the password:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mysql    &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Once in Mysql interface, run the SQL command to modify the root password:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
grant all privileges on *.* to root@&#039;localhost&#039; identified by &#039;newrootpass&#039; with grant option;      &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Then enter and \q to quit.&lt;br /&gt;
&lt;br /&gt;
To check that the connection with the new couple user/password works, launch the command&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mysql -u root -p&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
And type your password &#039;&#039;newrootpass&#039;&#039; then \q to quit if the connection has been successful.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PostgreSQL database :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
For Linux users, if you have just installed a PostgreSQL server, you must run the following command to initialize an admin user and password. For this, add the following line in file &#039;&#039;&#039;/etc/postgresql/x.x/main/pg_hba.conf&#039;&#039;&#039; (replace x.x with your postgres version)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
local   all         dolibarrowner    md5        &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Also, comment the line&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
#local   all         all                               ident&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
This line ensure that system login used to connect to database (it will be login the web server run with), is same than database account (this is never the case).&lt;br /&gt;
&lt;br /&gt;
Then launch commands from a root shell&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo -s -u postgres&lt;br /&gt;
createuser dolibarrowner&lt;br /&gt;
psql -U postgres -d template1&lt;br /&gt;
alter user dolibarrowner with password &#039;dolibarrownerpass&#039;;&lt;br /&gt;
ALTER USER dolibarrowner WITH SUPERUSER;&lt;br /&gt;
ALTER USER dolibarrowner WITH CREATEDB;&lt;br /&gt;
ALTER USER dolibarrowner WITH CREATEROLE;&lt;br /&gt;
\du&lt;br /&gt;
exit&lt;br /&gt;
sudo /etc/init.d/postgresql restart&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
You can test a connection with this user with command&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
psql -d postgres -U dolibarrowner -W&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
And type your &#039;&#039;dolibarrownerpass&#039;&#039; as password and \q to quit if connection is ok.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;web root :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Go into the directory where to install Dolibarr (the web root directory defined for your web server)&lt;br /&gt;
&lt;br /&gt;
#For Debian and Ubuntu families, it is generally: /var/www (newer versions: /var/www/html)&lt;br /&gt;
#For Mandriva, RedHat, Fedora: /var/www/html&lt;br /&gt;
#For Suse: /srv/www/htdocs&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ cd /var/www&lt;br /&gt;
or&lt;br /&gt;
$ cd /var/www/html&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Get the application archive of last stable version&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;from zip file&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ wget http://www.dolibarr.org/files/dolibarr.zip&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Uncompress archive&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ unzip dolibarr.zip&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;or from git repository&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ git clone -b X.Y http://github.com/Dolibarr/dolibarr.git dolibarr&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Replace X.Y with the version you want to get.&lt;br /&gt;
&lt;br /&gt;
*Rename directory dolibarr-x.y.z into dolibarr to have a directory name that does not depends on version (replace x.y.z with source version)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ mv dolibarr-x.y.z dolibarr&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Change permissions and owner of the &#039;dolibarr&#039; directory to that of the group under which the web server runs (assumed to be &#039;www-data&#039; for debian, &#039;apache&#039; for redhat, mandriva, fedora)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ chmod -R 755 /var/www/dolibarr&lt;br /&gt;
$ chown -R www-data.www-data /var/www/dolibarr&lt;br /&gt;
or&lt;br /&gt;
$ chmod -R 755 /var/www/html/dolibarr&lt;br /&gt;
$ chown -R apache.apache /var/www/html/dolibarr&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*For Fedora, since SELinux is usually enabled, it is also advisable to run the following commands to make the &#039;dolibarr&#039; directory compliant with the SELinux requirement (else you are likely to get quite a few alerts) :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ semanage fcontext -a -t httpd_sys_rw_content_t &#039;/var/www/html/dolibarr(/.*)?&#039;&lt;br /&gt;
$ restorecon -R -v &#039;/var/www/html/dolibarr&#039;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*As a root user, create, into directory dolibarr/htdocs/conf, an empty configuration file called conf.php and set the web server user as owner (for instance www-data on Debian, apache on Mandriva, RedHat, Fedora or other distributions ...). This is required because the web server will have to write into this file during install process.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ cd dolibarr ; touch htdocs/conf/conf.php ; chown www-data htdocs/conf/conf.php&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Note: For Ubuntu no need of htdocs, you just have to make dolibarr root by placing all files and folders of htdocs in /var/www/dolibarr then from browser do &amp;lt;MyIP&amp;gt;/dolibarr/index.php (see this discussion as reference to this addendum [http://askubuntu.com/questions/874456/php-code-displays-in-browser?noredirect=1#comment1357943_874456])&lt;br /&gt;
&lt;br /&gt;
*As a root user, create a directory that will be used to save all files generated and stocked by Dolibarr (PDf invoices, uploaded images, ...), and attribute to this directory a owner that must be the web server (example www-data on Debian, apache on Mandriva, RedHat, Fedora...). The web server must have write permission into this directory. It is recommanded to use a directory outside of your directory of web pages, for example - &amp;quot;/var/lib/dolibarr/documents&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ mkdir -p /var/lib/dolibarr/documents ; chown www-data /var/lib/dolibarr/documents&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Now call your browser to point to the main page&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
http://127.0.0.1/dolibarr/htdocs/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
or if you didn&#039;t create the htdocs directory&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
http://127.0.0.1/dolibarr/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Follow instructions of setup steps until end of install process.&lt;br /&gt;
&lt;br /&gt;
*For security reason, we recommend, once setup is finished, to create a file install.lock into Dolibarr document directory that only root user can delete. This will lock the call of the install process again (you will have to remove this file for upgrades).&lt;br /&gt;
&lt;br /&gt;
If this is not done, Dolibarr will show you a warning once logged by an administrator user.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ touch /var/lib/dolibarr/documents/install.lock; chmod go-w /var/lib/dolibarr/documents;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==On a mutualized Web Hosting Provider (without terminal/SSH access)==&lt;br /&gt;
It is not possible to provide a generic documentation to install Dolibarr on a particular Web hosting provider as this depends on provider.&lt;br /&gt;
In most cases, using the following process should works for most providers:&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Prerequisite&#039;&#039;&#039;: Apache web server, PHP and a database server (MySQL or PostgreSQL) are already running correctly and user/pass (of a new database or root server) is known.&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;Level&#039;&#039;&#039;: Users with few Web and Database administration knowledge. Knowledge to use a tool (FTP, SFTP) to upload files on the server.&lt;br /&gt;
&lt;br /&gt;
*Check that you have an Apache web server, PHP and a database server (MySQL or PostGreSQL) that works correctly.&lt;br /&gt;
&lt;br /&gt;
[[File:warning.png]] Warning, check that code page of PHP server and database server are same (utf8 recommended).&lt;br /&gt;
&lt;br /&gt;
*Check that main root or admin user/password couple for the server is known and works correctly. Ask them to your Web Hosting Provider if unknown.&lt;br /&gt;
&lt;br /&gt;
*Get the application archive of last stable version and uncompress it locally.&lt;br /&gt;
&lt;br /&gt;
*Upload all content of htdocs directory to your web root directory, for example using FTP in binary mode.&lt;br /&gt;
&lt;br /&gt;
*Create a directory called &amp;quot;documents&amp;quot; into Dolibarr directory that will serve to save all documents generated and stocked by Dolibarr (PDF invoices, uploaded images, ...). The web server must have write permission into this directory. You can set permissions with your FTP client.&lt;br /&gt;
&lt;br /&gt;
*Now call your browser to point to the main page index.php&lt;br /&gt;
&lt;br /&gt;
*Follow instructions of setup steps until end of install process.&lt;br /&gt;
&lt;br /&gt;
*For security reason, we recommend, once setup is finished, to create a file install.lock into Dolibarr installed directory. This will lock the call of the install process again (you will have to remove it for upgrades). If this is not done, Dolibarr will show you a warning once logged as an administrator user.&lt;br /&gt;
&lt;br /&gt;
==On a SaaS or Cloud web hosting provider==&lt;br /&gt;
Dolibarr is also available on a lot of &amp;quot;ready to use&amp;quot; SaaS or Cloud platforms/services that provides preinstalled versions.&lt;br /&gt;
&lt;br /&gt;
See page [[Cloud Solutions]].&lt;br /&gt;
&lt;br /&gt;
Dolibarr can also be installed manually on all Cloud platforms that support PHP and Mysql.&lt;br /&gt;
&lt;br /&gt;
See page [[Cloud Solutions]].&lt;br /&gt;
&lt;br /&gt;
==Using Docker==&lt;br /&gt;
For admins with Docker experience, it is possible to use the docker build files located in the source repo here: https://github.com/Dolibarr/dolibarr/tree/develop/build&lt;br /&gt;
 git clone https://github.com/Dolibarr/dolibarr/&lt;br /&gt;
 cd ./dolibarr&lt;br /&gt;
 git checkout tags/&amp;lt;desiredrelease&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 cd build/docker&lt;br /&gt;
&lt;br /&gt;
 docker-compose up&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Read the README carefully. As of version 12+ it recommends to use the built in docker files for development only, while an outside repo: https://hub.docker.com/r/tuxgasy/dolibarr  is recommended for production environments.&lt;br /&gt;
&lt;br /&gt;
=Setup=&lt;br /&gt;
&lt;br /&gt;
==First setup==&lt;br /&gt;
See page [[First setup|Setup]].&lt;br /&gt;
&lt;br /&gt;
==Setup a LDAP connection==&lt;br /&gt;
If you want to use a LDAP: See [[Install and configure OpenLDAP]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Import external data=&lt;br /&gt;
For this operation, read page [[Mass imports]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Upgrade Dolibarr=&lt;br /&gt;
This chapter describe processes to upgrade an existing installation of Dolibarr from an old version to a new one. The process is the same, whatever version you are coming from and version you are going to, but it will differ according to the distribution/operating system you used for your first installation. You should use the same for upgrade.&lt;br /&gt;
 &lt;br /&gt;
==[[File:Logo_windows.png]] With DoliWamp (Windows .exe package)==&lt;br /&gt;
&lt;br /&gt;
*First make a backup of your current installation&lt;br /&gt;
*Download new .exe package of DoliWamp.&lt;br /&gt;
*Run downloaded .exe file and follow steps without changing any default values. This will upgrades all your files.&lt;br /&gt;
*At the end of the execution, your browser is launched with a page to ask you to run upgrade of your database. Choose the upgrade according to your case.&lt;br /&gt;
&lt;br /&gt;
If there is more than one version late, the page in your browser will loop to start again the upgrade wizard as often as required to run upgrade process, version by version, until your reach the new installed version.&lt;br /&gt;
&lt;br /&gt;
==[[File:Logo_ubuntu.png]] With DoliDeb (Debian or Ubuntu .deb package)==&lt;br /&gt;
&lt;br /&gt;
*First make a backup of your current installation&lt;br /&gt;
*Process to upgrade using Debian/Ubuntu package is the same as the install process (see previous chapters), so it is as easy as installing a package.&lt;br /&gt;
&lt;br /&gt;
You can also read page [[Dolibarr for Ubuntu or Debian]].&lt;br /&gt;
&lt;br /&gt;
==[[File:Logo_rpm.png|40px]] With DoliRpm (Fedora, Redhat, Mandriva, Mageia or OpenSuse .rpm package)==&lt;br /&gt;
&lt;br /&gt;
*First make a backup of your current installation&lt;br /&gt;
*Process to upgrade using rpm package is the same as the install process, so it is as easy as installing a package (see previous chapters).&lt;br /&gt;
&lt;br /&gt;
==[[File:Gnu.png]] With Dolibarr (standard .zip package or from Git)==&lt;br /&gt;
This is tutorial to use when using standard distribution for a manual upgrade.&lt;br /&gt;
&lt;br /&gt;
*First make a backup of your current installation&lt;br /&gt;
&lt;br /&gt;
*Go into the directory where you installed Dolibarr (it might be the root directory of your web, for example /var/www under Debian)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ cd /var/www&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===For installation that used the zip file===&lt;br /&gt;
&lt;br /&gt;
*Get archive of last version&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ wget https://www.dolibarr.org/files/dolibarr.zip&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Uncompress the archive&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ unzip dolibarr.zip&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Copy all new extracted files (the one uncompressed into directory dolibarr-x.y.z) to the directory where you put your old Dolibarr version. This will overwrite old files with new ones without removing files specifics to your installation (like conf.php file or complementary non official installed modules).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ cp -r dolibarr-x.y.z/* dolibarr&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*If no error, you can now remove the directory of source files&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ rm -fr dolibarr-x.y.z&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Now open your Dolibarr in your browser. It should open automatically the install/&lt;br /&gt;
&lt;br /&gt;
and choose &#039;&#039;Update&#039;&#039; in suggested menu.&lt;br /&gt;
&lt;br /&gt;
===For installation that used GIT===&lt;br /&gt;
If you already cloned the repo simply upgrade by checking out a version tag like so:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ git checkout 13.0&lt;br /&gt;
$ git pull origin 13.0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Now open your Dolibarr in your browser. It should open automatically the install/&lt;br /&gt;
&lt;br /&gt;
and choose &#039;&#039;Update&#039;&#039; in suggested menu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note: &lt;br /&gt;
&lt;br /&gt;
If you want to script the database upgrade process (to avoid the upgrade process from web browser), you can run the 3 upgrade processes from command line:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ cd htdocs/install&lt;br /&gt;
$ php upgrade.php oldx.oldy.oldz x.y.z &amp;gt; output.html&lt;br /&gt;
$ php upgrade2.php oldx.oldy.oldz x.y.z &amp;gt; output2.html&lt;br /&gt;
$ php step5.php oldx.oldy.oldz x.y.z &amp;gt; output3.html&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Note: z must be &amp;quot;0&amp;quot; because only major versions have a migration script to run.&lt;br /&gt;
&lt;br /&gt;
Return code will be 0 if success, 1 if error (if this happens, see file output.html, output2.html or output3.html).&lt;br /&gt;
&lt;br /&gt;
Note: If you have a message that tell the install process is locked by a file, remove the file install.lock stored in Dolibarr root directory.&lt;br /&gt;
&lt;br /&gt;
*For security reason, once setup is finished, you should create a file install.lock into Dolibarr documents directory. This will lock the call of the install process again (you will have to remove this file for future upgrades). If this is not done, Dolibarr will show you a warning once logged with an administrator user.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ echo &amp;gt; documents/install.lock&lt;br /&gt;
$ chmod 444 documents/install.lock&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Florian.mortgat</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Module_Web_Services_API_REST_(d%C3%A9veloppeur)&amp;diff=50739</id>
		<title>Module Web Services API REST (développeur)</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Module_Web_Services_API_REST_(d%C3%A9veloppeur)&amp;diff=50739"/>
		<updated>2021-05-31T10:28:39Z</updated>

		<summary type="html">&lt;p&gt;Florian.mortgat: /* Développer un nouveau service / sa propre API */ fix typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Do NOT edit this section&lt;br /&gt;
     Links below are automatically managed by PolyglotBot&lt;br /&gt;
     You can edit links on the English source page : Module_Web_Services_API_REST_(developer) --&amp;gt;&lt;br /&gt;
[[en:Module_Web_Services_API_REST_(developer)]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{TemplateDocDevFr}}&lt;br /&gt;
{{TemplateModFR}}&lt;br /&gt;
[[Category:Liste des Modules (développeur)]]&lt;br /&gt;
{{BasculeDevUser|&lt;br /&gt;
nom=Web services|&lt;br /&gt;
num=2610|&lt;br /&gt;
devdoc=Cette page|&lt;br /&gt;
userdoc=Non applicable|}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Fonction =&lt;br /&gt;
Quand ce module est activé, vous activez l&#039;utilisation des Webservices fournis par Dolibarr. Vous pouvez alors faire des appels REST sur différents Webservices fournis par Dolibarr.&lt;br /&gt;
&lt;br /&gt;
= Serveur de Web services REST Dolibarr =&lt;br /&gt;
Une fois que le module Web services REST est activé, Dolibarr devient également un serveur de Web services REST. Vous pouvez alors envoyer vos propres requêtes sur l&#039;url relative :&lt;br /&gt;
&#039;&#039;&#039;/api/index.php/xxx&#039;&#039;&#039; où xxx est l&#039;API à appeler.&lt;br /&gt;
&lt;br /&gt;
= Liste des services fournis =&lt;br /&gt;
Seuls quelques services sont disponibles. À compter de la version 5.0 de Dolibarr, vous pouvez consulter la liste complète des web services proposés en appelant l&#039;explorer à cette adresse :&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;http://yourdolibarrurl/api/index.php/explorer&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Vous devez au préalable faire un premier appel au service &#039;&#039;&#039;login&#039;&#039;&#039; pour obtenir une clé API.&lt;br /&gt;
Vous entrez alors la clé pour obtenir la liste des services proposés&lt;br /&gt;
&lt;br /&gt;
Par exemple, vous pouvez essayer l&#039;explorateur sur l&#039;instance de démonstration à l&#039;adresse suivante : &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;https://demo.dolibarr.org/api/index.php/explorer&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Vous pouvez ensuite tester directement à partir de cet explorateur n&#039;importe quelle API. Ceci est la solution recommandée pour tester toute API Dolibarr, car toutes les API et paramètres sont documentés ici. À la suite d&#039;un test, vous obtiendrez la réponse, mais également un exemple sur la façon d&#039;appeler l&#039;API à partir de la ligne de commande à l&#039;aide de curl.&lt;br /&gt;
&lt;br /&gt;
= Installation =&lt;br /&gt;
&lt;br /&gt;
Pour l&#039;installer, ouvrez la page des modules et activez le module API REST. Sur la page de configuration du module, il y a un lien vers un explorateur. Cliquez dessus pour ouvrir l&#039;explorateur d&#039;API.&lt;br /&gt;
&lt;br /&gt;
Dans le coin supérieur droit, collez le &amp;lt;token&amp;gt; de l&#039;utilisateur que vous souhaitez utiliser pour appeler l&#039;API, puis cliquez sur le bouton &amp;quot;explorer&amp;quot;. Remarque: Le jeton de chaque utilisateur peut être défini sur la page d&#039;enregistrement de l&#039;utilisateur.&lt;br /&gt;
&lt;br /&gt;
Après avoir cliqué sur &amp;quot;Explorer&amp;quot;, vous devriez voir toutes les actions disponibles avec ce jeton. Si vous n&#039;avez pas beaucoup d&#039;actions, c&#039;est probablement parce que les modules correspondants ne sont pas activés. Si vous voulez voir les factures, vous devez activer le module Factures dans la configuration de Dolibarr. Même chose pour les Produits, les Tiers, etc.&lt;br /&gt;
&lt;br /&gt;
Sur cette page d&#039;exploration de l&#039;API, vous pouvez faire beaucoup de tests. Lire des données de Dolibarr et écrire, modifier et supprimer également. Attention: les données sont vraiment modifiées dans votre base de données.&lt;br /&gt;
&lt;br /&gt;
= Utilisation =&lt;br /&gt;
&lt;br /&gt;
Grosso modo, pour utiliser REST, il faut appeler une url du genre suivant &amp;lt;nowiki&amp;gt;http://&amp;lt;mon_serveur&amp;gt;/api/index.php/&amp;lt;action&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
avec une des 4 méthodes : GET, POST, PUT, DELETE, en remplaçant &amp;lt;action&amp;gt; par l&#039;action sur laquelle vous voulez intervenir. Ex : &amp;lt;nowiki&amp;gt;http://&amp;lt;mon_serveur&amp;gt;/api/index.php/invoices&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il existe plusieurs méthodes. Voici un morceau de code opérationnel pour appeler une API, mais il existe également des librairies qui simplifie le travail, telles que phphttpclient.com.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
function CallAPI($method, $apikey, $url, $data = false)&lt;br /&gt;
{&lt;br /&gt;
    $curl = curl_init();&lt;br /&gt;
    $httpheader = [&#039;DOLAPIKEY: &#039;.$apikey];&lt;br /&gt;
&lt;br /&gt;
    switch ($method)&lt;br /&gt;
    {&lt;br /&gt;
        case &amp;quot;POST&amp;quot;:&lt;br /&gt;
            curl_setopt($curl, CURLOPT_POST, 1);&lt;br /&gt;
            $httpheader[] = &amp;quot;Content-Type:application/json&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
            if ($data)&lt;br /&gt;
                curl_setopt($curl, CURLOPT_POSTFIELDS, $data);&lt;br /&gt;
&lt;br /&gt;
            break;&lt;br /&gt;
        case &amp;quot;PUT&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
	    curl_setopt($curl, CURLOPT_CUSTOMREQUEST, &#039;PUT&#039;);&lt;br /&gt;
            $httpheader[] = &amp;quot;Content-Type:application/json&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
            if ($data)&lt;br /&gt;
                curl_setopt($curl, CURLOPT_POSTFIELDS, $data);&lt;br /&gt;
&lt;br /&gt;
            break;&lt;br /&gt;
        default:&lt;br /&gt;
            if ($data)&lt;br /&gt;
                $url = sprintf(&amp;quot;%s?%s&amp;quot;, $url, http_build_query($data));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Optional Authentication:&lt;br /&gt;
	//    curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);&lt;br /&gt;
	//    curl_setopt($curl, CURLOPT_USERPWD, &amp;quot;username:password&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    curl_setopt($curl, CURLOPT_URL, $url);&lt;br /&gt;
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);&lt;br /&gt;
	curl_setopt($curl, CURLOPT_HTTPHEADER, $httpheader);&lt;br /&gt;
&lt;br /&gt;
    $result = curl_exec($curl);&lt;br /&gt;
&lt;br /&gt;
    curl_close($curl);&lt;br /&gt;
&lt;br /&gt;
    return $result;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ce n&#039;est qu&#039;un exemple, ce n&#039;est pas sécurisé, cela ne prend pas en compte les codes erreurs mais vous pouvez le modifier et l&#039;adapter à vos besoins.&lt;br /&gt;
la fonction prend 4 paramètres :&lt;br /&gt;
* $method : string &amp;quot;GET&amp;quot;, &amp;quot;POST&amp;quot;, &amp;quot;PUT&amp;quot;, &amp;quot;DELETE&amp;quot;&lt;br /&gt;
* $apikey : string &amp;quot;votre &amp;lt;token&amp;gt; généré plus haut&amp;quot;&lt;br /&gt;
* $url : string l&#039;url à appeler. Ex : &amp;quot;&amp;lt;nowiki&amp;gt;http://&amp;lt;mon_serveur&amp;gt;/api/index.php/invoices&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
* $data : string flux au format json. Ce champ est requis pour les appels POST ou PUT.&lt;br /&gt;
&lt;br /&gt;
= Exemples =&lt;br /&gt;
&lt;br /&gt;
Maintenant, quelques exemples opérationnels pour différents cas d&#039;utilisation.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans tous les cas, on a :&lt;br /&gt;
* $apiKey = &amp;quot;&amp;lt;mon token&amp;gt;&amp;quot;;&lt;br /&gt;
* $apiUrl = &amp;quot;&amp;lt;nowiki&amp;gt;http://&amp;lt;mon_serveur&amp;gt;/api/index.php/&amp;lt;/nowiki&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Récupérer la liste des produits&lt;br /&gt;
	$listProduits = [];&lt;br /&gt;
	$produitParam = [&amp;quot;limit&amp;quot; =&amp;gt; 10000, &amp;quot;sortfield&amp;quot; =&amp;gt; &amp;quot;rowid&amp;quot;];&lt;br /&gt;
	$listProduitsResult = CallAPI(&amp;quot;GET&amp;quot;, $apiKey, $apiUrl.&amp;quot;products&amp;quot;, $produitParam);&lt;br /&gt;
	$listProduitsResult = json_decode($listProduitsResult, true);&lt;br /&gt;
&lt;br /&gt;
	if (isset($listProduitsResult[&amp;quot;error&amp;quot;]) &amp;amp;&amp;amp; $listProduitsResult[&amp;quot;error&amp;quot;][&amp;quot;code&amp;quot;] &amp;gt;= &amp;quot;300&amp;quot;) {&lt;br /&gt;
	} else {&lt;br /&gt;
		foreach ($listProduitsResult as $produit) {&lt;br /&gt;
			$listProduits[intval($produit[&amp;quot;id&amp;quot;])] = html_entity_decode($produit[&amp;quot;ref&amp;quot;], ENT_QUOTES);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Commentaires :&lt;br /&gt;
* récupérer les 10&#039;000 premiers produits triés par leur id dans la base&lt;br /&gt;
* html_entity_decode est nécessaire car les apostrophes sont encodés&lt;br /&gt;
* il est facile d&#039;utiliser la même méthode (en remplaçant products par dictionnarycountries) pour récupérer la liste des pays&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Créer un produit&lt;br /&gt;
	$ref = &amp;quot;ma_reference_produit_X203ZZ&amp;quot;;&lt;br /&gt;
	$newProduct = [&lt;br /&gt;
		&amp;quot;ref&amp;quot;	=&amp;gt; $ref,&lt;br /&gt;
		&amp;quot;label&amp;quot;	=&amp;gt; $ref&lt;br /&gt;
	];&lt;br /&gt;
	$newProductResult = CallAPI(&amp;quot;POST&amp;quot;, $apiKey, $apiUrl.&amp;quot;products&amp;quot;, json_encode($newProduct));&lt;br /&gt;
	$newProductResult = json_decode($newProductResult, true);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Commentaires :&lt;br /&gt;
* avant de créer un produit, il peut être sage de vérifier qu&#039;il existe. En reprenant le premier exemple, cela fait :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// ma référence&lt;br /&gt;
	$ref = &amp;quot;ma_reference_produit_X203ZZ&amp;quot;;&lt;br /&gt;
// existe-t-elle dans mon tableau&lt;br /&gt;
	$produitKey = array_search($ref, $listProduits);&lt;br /&gt;
	if ($produitKey) {&lt;br /&gt;
// oui&lt;br /&gt;
		$fk_product = $produitKey;&lt;br /&gt;
	} else {&lt;br /&gt;
// non&lt;br /&gt;
// Créer un produit&lt;br /&gt;
		$newProduct = [&lt;br /&gt;
			&amp;quot;ref&amp;quot;	=&amp;gt; $ref,&lt;br /&gt;
			&amp;quot;label&amp;quot;	=&amp;gt; $ref&lt;br /&gt;
		];&lt;br /&gt;
		$newProductResult = CallAPI(&amp;quot;POST&amp;quot;, $apiKey, $apiUrl.&amp;quot;products&amp;quot;, json_encode($newProduct));&lt;br /&gt;
		$newProductResult = json_decode($newProductResult, true);&lt;br /&gt;
		if (isset($newProductResult[&amp;quot;error&amp;quot;]) &amp;amp;&amp;amp; $newProductResult[&amp;quot;error&amp;quot;][&amp;quot;code&amp;quot;] &amp;gt;= &amp;quot;300&amp;quot;) {&lt;br /&gt;
// il y a eu une erreur&lt;br /&gt;
			echo &amp;quot;&amp;lt;pre&amp;gt;ERROR&amp;quot;, var_dump($newProductResult), &amp;quot;&amp;lt;/pre&amp;gt;&amp;quot;;&lt;br /&gt;
			exit;&lt;br /&gt;
		} else {&lt;br /&gt;
// tout va bien&lt;br /&gt;
			$fk_product = $newProductResult;&lt;br /&gt;
			$listProduits[$fk_product] = $ref;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Commentaires :&lt;br /&gt;
* je regarde si la référence de mon article existe dans le tableau créé dans le premier exemple.&lt;br /&gt;
* si elle existe, j&#039;utilise sa clé dans le tableau comme id&lt;br /&gt;
* si elle n&#039;existe pas, je crée l&#039;article puis le j&#039;ajoute à mon tableau pour les prochaines fois et je récupère l&#039;id créé&lt;br /&gt;
* cette méthode permet de limiter les appels API quand on doit importer 500 commandes par exemple. Récupérer une fois la liste des produits au début au lieu de chercher à chaque fois dans Dolibarr.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// créer une commande avec 2 articles&lt;br /&gt;
&lt;br /&gt;
// le tableau qui contiendra toutes les lignes d&#039;articles de la commande&lt;br /&gt;
	$newCommandeLine = [];&lt;br /&gt;
&lt;br /&gt;
// article 1&lt;br /&gt;
	$ref1 = &amp;quot;ma_reference_produit_X203ZZ&amp;quot;;&lt;br /&gt;
	$prix1 = 10;&lt;br /&gt;
	$qtt1  = 100;&lt;br /&gt;
	$tva1 = 20;&lt;br /&gt;
	$fk_product1&lt;br /&gt;
// article 2&lt;br /&gt;
	$ref2 = &amp;quot;ma_reference_produit_B707FD&amp;quot;;&lt;br /&gt;
	$prix2 = 13;&lt;br /&gt;
	$qtt2  = 37;&lt;br /&gt;
	$tva2 = 20;&lt;br /&gt;
&lt;br /&gt;
	$newCommandeLine[] = [&lt;br /&gt;
		&amp;quot;desc&amp;quot;		=&amp;gt; $ref1,&lt;br /&gt;
		&amp;quot;subprice&amp;quot;	=&amp;gt; $prix1,&lt;br /&gt;
		&amp;quot;qty&amp;quot;		=&amp;gt; $qtt1,&lt;br /&gt;
		&amp;quot;tva_tx&amp;quot;	=&amp;gt; floatval($tva1),&lt;br /&gt;
		&amp;quot;fk_product&amp;quot;=&amp;gt; $fk_product1&lt;br /&gt;
	];&lt;br /&gt;
&lt;br /&gt;
	$newCommandeLine[] = [&lt;br /&gt;
		&amp;quot;desc&amp;quot;		=&amp;gt; $ref2,&lt;br /&gt;
		&amp;quot;subprice&amp;quot;	=&amp;gt; $prix2,&lt;br /&gt;
		&amp;quot;qty&amp;quot;		=&amp;gt; $qtt2,&lt;br /&gt;
		&amp;quot;tva_tx&amp;quot;	=&amp;gt; floatval($tva2),&lt;br /&gt;
		&amp;quot;fk_product&amp;quot;=&amp;gt; $fk_product2&lt;br /&gt;
	];&lt;br /&gt;
&lt;br /&gt;
	if (count($newCommandeLine) &amp;gt; 0) {&lt;br /&gt;
		$newCommande = [&lt;br /&gt;
			&amp;quot;socid&amp;quot;			=&amp;gt; $clientDoliId,&lt;br /&gt;
			&amp;quot;type&amp;quot; 			=&amp;gt; &amp;quot;0&amp;quot;,&lt;br /&gt;
			&amp;quot;lines&amp;quot;			=&amp;gt; $newCommandeLine,&lt;br /&gt;
			&amp;quot;note_private&amp;quot;	=&amp;gt; &amp;quot;Commande importée automatiquement depuis l&#039;application&amp;quot;,&lt;br /&gt;
		];&lt;br /&gt;
		$newCommandeResult = CallAPI(&amp;quot;POST&amp;quot;, $apiKey, $apiUrl.&amp;quot;orders&amp;quot;, json_encode($newCommande));&lt;br /&gt;
		$newCommandeResult = json_decode($newCommandeResult, true);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Commentaires :&lt;br /&gt;
* $clientDoliId vaut l&#039;id du client dans la base doli. Soit vous le connaissez, soit vous pouvez le chercher auparavant&lt;br /&gt;
* type =&amp;gt; 0, c&#039;est une commande client (par opposition à 1 = commande fournisseur)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Valider une commande &lt;br /&gt;
	$newCommandeValider = [&lt;br /&gt;
		&amp;quot;idwarehouse&amp;quot;	=&amp;gt; &amp;quot;0&amp;quot;,&lt;br /&gt;
		&amp;quot;notrigger&amp;quot;		=&amp;gt; &amp;quot;0&amp;quot;&lt;br /&gt;
	];&lt;br /&gt;
	$newCommandeValiderResult = CallAPI(&amp;quot;POST&amp;quot;, $apiKey, $apiUrl.&amp;quot;orders/&amp;quot;.$newCommandeResult.&amp;quot;/validate&amp;quot;, json_encode($newCommandeValider));&lt;br /&gt;
	$newCommandeValiderResult = json_decode($newCommandeValiderResult, true);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Commentaires :&lt;br /&gt;
* on voit dans cet exemple, en avant dernière lignes, on a : $apiUrl.&amp;quot;orders/&amp;quot;.$newCommandeResult.&amp;quot;/validate&amp;quot;.&amp;lt;br/&amp;gt;&lt;br /&gt;
$newCommandeResult est l&#039;id de la commande crée (récupéré dans l&#039;exemple précédent)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// chercher si le client existe dans la base&lt;br /&gt;
	$clientSearch = json_decode(CallAPI(&amp;quot;GET&amp;quot;, $apiKey, $apiUrl.&amp;quot;thirdparties&amp;quot;, array(&lt;br /&gt;
		&amp;quot;sortfield&amp;quot; =&amp;gt; &amp;quot;t.rowid&amp;quot;, &lt;br /&gt;
		&amp;quot;sortorder&amp;quot; =&amp;gt; &amp;quot;ASC&amp;quot;, &lt;br /&gt;
		&amp;quot;limit&amp;quot; =&amp;gt; &amp;quot;1&amp;quot;, &lt;br /&gt;
		&amp;quot;mode&amp;quot; =&amp;gt; &amp;quot;1&amp;quot;,&lt;br /&gt;
		&amp;quot;sqlfilters&amp;quot; =&amp;gt; &amp;quot;(t.nom:=:&#039;&amp;quot;.$nom_client.&amp;quot;&#039;)&amp;quot;&lt;br /&gt;
		)&lt;br /&gt;
	), true);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Commentaires :&lt;br /&gt;
* limit =&amp;gt; 1 pour ne renvoyer que 1 client&lt;br /&gt;
* mode =&amp;gt; 1 car on cherche un client (on aurait aussi pu chercher un fournisseur qui est aussi un tiers mais avec un statut différent)&lt;br /&gt;
* sqlfilters syntaxe un peu particulière mais il y a qq autres exemples sur la page d&#039;explorer d&#039;API&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
//client n&#039;existe pas. le crée puis on récupère son id&lt;br /&gt;
	$newClient = [&lt;br /&gt;
		&amp;quot;name&amp;quot; 			=&amp;gt; &amp;quot;nom société client&amp;quot;,&lt;br /&gt;
		&amp;quot;email&amp;quot;			=&amp;gt; &amp;quot;email société client&amp;quot;,&lt;br /&gt;
		&amp;quot;client&amp;quot; 		=&amp;gt; &amp;quot;1&amp;quot;,&lt;br /&gt;
		&amp;quot;code_client&amp;quot;	=&amp;gt; &amp;quot;-1&amp;quot;&lt;br /&gt;
	];&lt;br /&gt;
	$newClientResult = CallAPI(&amp;quot;POST&amp;quot;, $apiKey, $apiUrl.&amp;quot;thirdparties&amp;quot;, json_encode($newClient));&lt;br /&gt;
	$newClientResult = json_decode($newClientResult, true);&lt;br /&gt;
	$clientDoliId = $newClientResult;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Commentaires :&lt;br /&gt;
* client =&amp;gt; 1 car c&#039;est un client (et pas un fournisseur)&lt;br /&gt;
* code_client =&amp;gt; -1 pour que le code client soit généré automatiquement.&lt;br /&gt;
* on récupère l&#039;id du client dans $clientDoliId&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Développer un nouveau service / sa propre API =&lt;br /&gt;
&lt;br /&gt;
Ajouter un nouveau service est aussi facile qu&#039;ajouter un fichier nommé &#039;&#039;&#039;api_monmoduleobject.class.php&#039;&#039;&#039; dans le dossier &#039;&#039;&#039;htdocs/monmodule/class&#039;&#039;&#039;. &lt;br /&gt;
Si vous utilisez le &amp;quot;modulebuilder&amp;quot; pour développer sur Dolibarr, cette API avec les méthode CRUD pourra même être générée pour vous.&lt;br /&gt;
Sinon, un copié-collé d&#039;un fichier API existant fera l&#039;affaire. Vous pouvez prendre comme exemple le fichier dans &#039;&#039;&#039;htdocs/commande/class/api_orders.class.php&#039;&#039;&#039; et l&#039;adapter à votre classe / besoin.&lt;br /&gt;
&lt;br /&gt;
Le framework détecte automatiquement les API et elle devrait être visible dans l&#039;explorateur.&lt;br /&gt;
&lt;br /&gt;
Les méthodes et paramètres sont détectées en fonction de l&#039;introspection réalisée dans les classes PHP de l&#039;objet (&#039;&#039;&#039;htdocs/monmodule/class/object.class.php&#039;&#039;&#039;) en utilisant les &#039;&#039;&#039;annotations&#039;&#039;&#039; trouvées dans la classe.&lt;br /&gt;
&lt;br /&gt;
Pour une documentation à propos des annotations : https://github.com/Luracast/Restler/blob/master/ANNOTATIONS.md&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Vous trouverez pas mal d&#039;autres informations dans le code de Dolibarr, en regardant dans &#039;&#039;&#039;htdocs/&amp;lt;dossier&amp;gt;/class/api_xxx_class.php&#039;&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Ex pour les tiers: htdocs/societe/class/api_thirdparties.class.php pour les tiers.&amp;lt;br/&amp;gt;&lt;br /&gt;
Ex pour les factures: htdocs/compta/facture/class/api_invoices.class.php&amp;lt;br/&amp;gt;&lt;br /&gt;
...&lt;/div&gt;</summary>
		<author><name>Florian.mortgat</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Ce_que_ne_fait_pas_Dolibarr&amp;diff=46689</id>
		<title>Ce que ne fait pas Dolibarr</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Ce_que_ne_fait_pas_Dolibarr&amp;diff=46689"/>
		<updated>2020-03-13T14:26:32Z</updated>

		<summary type="html">&lt;p&gt;Florian.mortgat: entre elle -&amp;gt; entre elles&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Do NOT edit this section&lt;br /&gt;
     Links below are automatically managed by PolyglotBot&lt;br /&gt;
     You can edit links on the English source page : What_Dolibarr_can&#039;t_do --&amp;gt;&lt;br /&gt;
[[en:What_Dolibarr_can&#039;t_do]]&lt;br /&gt;
[[es:Lo_que_no_hace_Dolibarr]]&lt;br /&gt;
[[zh:Dolibarr不能做什么？]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ_FR]]&lt;br /&gt;
{{TemplateDocUtil}}&lt;br /&gt;
&lt;br /&gt;
Ces fonctionnalités ne sont pas disponibles, y compris dans les dernières versions&lt;br /&gt;
&lt;br /&gt;
*Dolibarr ne contient pas de module de Gestion de la paie. Un module Salaire permet la saisie et donc le suivi du paiement des salaires, mais il n&#039;y a pas de fonction pour calculer et générer la feuille de paie.&lt;br /&gt;
*Les taches du module de gestion de projets n&#039;ont pas de dépendance entre elles.&lt;br /&gt;
*Dolibarr ne contient pas de Webmail.&lt;br /&gt;
*La comptabilité double-partie est disponible depuis la version 6.0, toutefois les rapports ne sont pas encore tous disponibles.&lt;br /&gt;
*La gestion du multi-société (plusieurs sociétés gérées avec une seule installation et partage d&#039;éléments, comme les clients) nécessite d&#039;installer le module [[Module MultiCompany]] disponible sur {{LinkToPluginDownloadDoliStore}}. A défaut, il est toujours possible de créer autant d&#039;instance que de sociétés mais il n&#039;y aura pas de partages d&#039;information (comme le partage des clients comme on peut le faire avec le module).&lt;br /&gt;
*Dolibarr ne fait pas le café (pas encore... enfin avec un rasbpberry et un peu de connaissances en électronique : c&#039;est quand même faisable ;) ).&lt;br /&gt;
&lt;br /&gt;
Pour la liste des fonctionnalités fournies, voir la page [[Ce que fait Dolibarr]].&lt;/div&gt;</summary>
		<author><name>Florian.mortgat</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Syst%C3%A8me_de_menus&amp;diff=46274</id>
		<title>Système de menus</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Syst%C3%A8me_de_menus&amp;diff=46274"/>
		<updated>2020-02-20T15:23:21Z</updated>

		<summary type="html">&lt;p&gt;Florian.mortgat: /* Le système de menu Dolibarr */ conjugaison&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Do NOT edit this section&lt;br /&gt;
     Links below are automatically managed by PolyglotBot&lt;br /&gt;
     You can edit links on the English source page : Menus_system --&amp;gt;&lt;br /&gt;
[[en:Menus_system]]&lt;br /&gt;
[[es:Sistema_de_menús]]&lt;br /&gt;
[[de:Menü_System]]&lt;br /&gt;
[[zh:菜单]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Noyau]]&lt;br /&gt;
{{TemplateDocDev}}&lt;br /&gt;
&lt;br /&gt;
=Le système de menu Dolibarr=&lt;br /&gt;
&lt;br /&gt;
Il y a 2 systèmes de menu. Un système de menu définit les entrées de menu à afficher, conditions et localisation.&lt;br /&gt;
&lt;br /&gt;
Changer de système de menu est possible via la page &#039;&#039;&#039;Configuration - Menus&#039;&#039;&#039;. Choisir ensuite &#039;&#039;&#039;Editeur de menus&#039;&#039;&#039;. Prendre par exemple les gestionnaires de menu &amp;quot;auguria&amp;quot;, fournis en standard au lieu de &amp;quot;eldy&amp;quot;. Ces gestionnaires de menu (gauche et haut) sont complètement opérationnels et offre la même vision mais en utilisant une technologie de stockage différente.&lt;br /&gt;
&lt;br /&gt;
Pour personnaliser ces menus par défaut, vous pouvez, soit ajouter votre propre entrée menu, soit développer votre propre gestionnaire de menu qui remplacera complètement le gestionnaire par défaut. Vous décidez alors comment stocker votre menu (en base de données comme avec le gestionnaire de menu &#039;&#039;&#039;auguria&#039;&#039;&#039;, centralisé en dur dans un fichier comme avec le gestionnaire de menu &#039;&#039;&#039;eldy&#039;&#039;&#039;, dans un fichier xml, ...). Voir les chapitres suivant pour cela....&lt;br /&gt;
&lt;br /&gt;
=Ajouter votre entrée menu=&lt;br /&gt;
Imaginez que vous vouliez ajouter une entrée menu. Allez dans &#039;&#039;&#039;Accueil - Configuration - Menus&#039;&#039;&#039;. Choisir &#039;&#039;&#039;Editeur de menu&#039;&#039;&#039;. Ajouter l&#039;entrée. &lt;br /&gt;
&lt;br /&gt;
Par exemple, pour ajouter une entrée de menu afin d&#039;arriver sur la page qui liste uniquement les opportunités avec les filtres déjà positionnées, vous ajouterez une entrée qui ressemblera à ceci:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;divforimgcentpercent&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Menu editor.png]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Développer son propre système de menu=&lt;br /&gt;
&lt;br /&gt;
Le but de cet article est de décrire comment créer un nouveau système de menu dans son intégralité (remplacement de l&#039;intégralité des entrées menus, chamboulement complet du concept de navigation).&lt;br /&gt;
&lt;br /&gt;
Cela ne concerne pas le simple ajout d&#039;entrées de menus. Si tel et le cas et que vous désirez juste savoir comment ajouter des entrées menus au sein d&#039;un gestionnaire de menu existant, dans le cadre du développement d&#039;une extension ou d&#039;un nouveau module par exemple, reporter vous plutôt à la page [[Developpement module]].&lt;br /&gt;
&lt;br /&gt;
Si vous voulez remplacer intégralement un systeme de menu par le votre, le plus simple est de prendre exemple sur le gestionnaire de menu &amp;quot;eldy_backoffice&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Pour développer son &#039;&#039;&#039;système de menu haut&#039;&#039;&#039;==&lt;br /&gt;
Il suffit de&lt;br /&gt;
&lt;br /&gt;
#Copier le fichier htdocs/core/menus/standard/eldy_backoffice.php sous un autre nom comme htdocs/core/menus/standard/monmenu.php&lt;br /&gt;
#Editer ensuite le fichier monmenu.php. La fonction showmenu() de la classe MenuTop est la fonction appelée par Dolibarr lorsqu&#039;il génère une page pour afficher ce menu haut. On peut y mettre le code que l&#039;on veut, cette fonction ne modifie aucune variable extérieur et doit juste afficher par des &amp;quot;print&amp;quot; le menu que l&#039;on veut voir. On peut ainsi récupérer le menu à afficher depuis un fichier de configuration, une base de données et le personnaliser par rapport à l&#039;environnement. L&#039;environnement Dolibarr étant stocké dans les 3 objets global suivant: $user, $conf, $langs.&lt;br /&gt;
&lt;br /&gt;
 $user contient les informations propres à l&#039;utilisateur.&lt;br /&gt;
 $conf contient les informations propres à la configuration (modules actifs, permissions actives, etc...)&lt;br /&gt;
 $langs contient les informations propres à la langue active.&lt;br /&gt;
&lt;br /&gt;
Exemple de fonction showmenu() du fichier htdocs/core/menus/standard/monmenu.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
    function showmenu()&lt;br /&gt;
    {&lt;br /&gt;
        global $user,$conf,$langs,$dolibarr_main_db_name;&lt;br /&gt;
        &lt;br /&gt;
        print &#039;&amp;lt;table class=&amp;quot;tmenu&amp;quot;&amp;gt;&amp;lt;tr class=&amp;quot;tmenu&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
	    // Menu Home&lt;br /&gt;
	    print &#039;&amp;lt;td class=&amp;quot;tmenu&amp;quot;&amp;gt;&amp;lt;a &#039;.$class.&#039; href=&amp;quot;&#039;.DOL_URL_ROOT.&#039;/index.php?mainmenu=home&amp;amp;leftmenu=&amp;quot;&#039;.($this-&amp;gt;atarget?&amp;quot; target=&amp;quot;.$this-&amp;gt;atarget:&amp;quot;&amp;quot;).&#039;&amp;gt;&#039;.$langs-&amp;gt;trans(&amp;quot;Home&amp;quot;).&#039;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&#039;;&lt;br /&gt;
	    &lt;br /&gt;
	    // Put here other entries&lt;br /&gt;
	    // ...&lt;br /&gt;
	    &lt;br /&gt;
        print &#039;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Pour développer son &#039;&#039;&#039;système de menu gauche&#039;&#039;&#039;==&lt;br /&gt;
Le principe est aussi simple que le menu haut.&lt;br /&gt;
&lt;br /&gt;
#Copier le fichier htdocs/core/menus/standard/eldy_backoffice.php sous un autre nom comme htdocs/core/menus/standard/monmenu.php.&lt;br /&gt;
#Il faut ensuite modifier la fonction showmenu() de la classe MenuLeft afin de fabriquer son menu gauche. Si on veut afficher le menu standard ou juste le modifier légèrement sans recréer le sien complètement, il suffit de boucler sur le contenu du tableau $menu-&amp;gt;liste. Si vous voulez afficher un menu complètement différent et totalement contrôlé par vous, il vous faut, dans la fonction showmenu(), créer un objet $newmenu=new Menu() et utiliser les méthodes $newmenu-&amp;gt;add et $newmenu-&amp;gt;add_submenu pour définir la liste des entrées menu gauche à faire apparaitre. Une fois cela fait, on affiche par des &amp;quot;print&amp;quot; le contenu du tableau $newmenu-&amp;gt;liste (qui vient d’être construit) au lieu de $menu-&amp;gt;liste.&lt;br /&gt;
&lt;br /&gt;
Exemple de fichier htdocs/core/menus/standard/monmenu.php&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
    function showmenu()&lt;br /&gt;
    {&lt;br /&gt;
        global $user,$conf,$langs,$dolibarr_main_db_name;&lt;br /&gt;
        $newmenu = new Menu();&lt;br /&gt;
        &lt;br /&gt;
	// Put here left menu entries&lt;br /&gt;
	// ***** START *****&lt;br /&gt;
&lt;br /&gt;
	$langs-&amp;gt;load(&amp;quot;admin&amp;quot;);	// Load translation file admin.lang&lt;br /&gt;
	$newmenu-&amp;gt;add(DOL_URL_ROOT.&amp;quot;/admin/index.php?leftmenu=setup&amp;quot;, $langs-&amp;gt;trans(&amp;quot;Setup&amp;quot;));&lt;br /&gt;
	$newmenu-&amp;gt;add_submenu(DOL_URL_ROOT.&amp;quot;/admin/company.php&amp;quot;, $langs-&amp;gt;trans(&amp;quot;MenuCompanySetup&amp;quot;));&lt;br /&gt;
	$newmenu-&amp;gt;add_submenu(DOL_URL_ROOT.&amp;quot;/admin/modules.php&amp;quot;, $langs-&amp;gt;trans(&amp;quot;Modules&amp;quot;));&lt;br /&gt;
	$newmenu-&amp;gt;add_submenu(DOL_URL_ROOT.&amp;quot;/admin/ihm.php&amp;quot;, $langs-&amp;gt;trans(&amp;quot;GUISetup&amp;quot;));&lt;br /&gt;
	$newmenu-&amp;gt;add_submenu(DOL_URL_ROOT.&amp;quot;/admin/boxes.php&amp;quot;, $langs-&amp;gt;trans(&amp;quot;Boxes&amp;quot;));&lt;br /&gt;
	$newmenu-&amp;gt;add_submenu(DOL_URL_ROOT.&amp;quot;/admin/delais.php&amp;quot;,$langs-&amp;gt;trans(&amp;quot;Alerts&amp;quot;));&lt;br /&gt;
	$newmenu-&amp;gt;add_submenu(DOL_URL_ROOT.&amp;quot;/admin/triggers.php&amp;quot;, $langs-&amp;gt;trans(&amp;quot;Triggers&amp;quot;));&lt;br /&gt;
	$newmenu-&amp;gt;add_submenu(DOL_URL_ROOT.&amp;quot;/admin/perms.php&amp;quot;, $langs-&amp;gt;trans(&amp;quot;Security&amp;quot;));&lt;br /&gt;
	$newmenu-&amp;gt;add_submenu(DOL_URL_ROOT.&amp;quot;/admin/dict.php&amp;quot;, $langs-&amp;gt;trans(&amp;quot;DictionnarySetup&amp;quot;));&lt;br /&gt;
	$newmenu-&amp;gt;add_submenu(DOL_URL_ROOT.&amp;quot;/admin/const.php&amp;quot;, $langs-&amp;gt;trans(&amp;quot;OtherSetup&amp;quot;));&lt;br /&gt;
		&lt;br /&gt;
	// ***** END *****&lt;br /&gt;
		&lt;br /&gt;
        // do not change code after this&lt;br /&gt;
&lt;br /&gt;
        // override menu_array by value array in $newmenu&lt;br /&gt;
	$this-&amp;gt;menu_array=$newmenu-&amp;gt;liste;&lt;br /&gt;
&lt;br /&gt;
        $alt=0;&lt;br /&gt;
        for ($i = 0 ; $i &amp;lt; sizeof($this-&amp;gt;menu_array) ; $i++) &lt;br /&gt;
        {&lt;br /&gt;
            $alt++;&lt;br /&gt;
            if ($this-&amp;gt;menu_array[$i][&#039;level&#039;]==0) {&lt;br /&gt;
                if (($alt%2==0))&lt;br /&gt;
                {&lt;br /&gt;
                    print &#039;&amp;lt;div class=&amp;quot;blockvmenuimpair&amp;quot;&amp;gt;&#039;.&amp;quot;\n&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    print &#039;&amp;lt;div class=&amp;quot;blockvmenupair&amp;quot;&amp;gt;&#039;.&amp;quot;\n&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            if ($this-&amp;gt;menu_array[$i][&#039;level&#039;]==0) {&lt;br /&gt;
                if ($this-&amp;gt;menu_array[$i][&#039;enabled&#039;])&lt;br /&gt;
                    print &#039;&amp;lt;a class=&amp;quot;vmenu&amp;quot; href=&amp;quot;&#039;.$this-&amp;gt;menu_array[$i][&#039;url&#039;].&#039;&amp;quot;&amp;gt;&#039;.$this-&amp;gt;menu_array[$i][&#039;titre&#039;].&#039;&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                else &lt;br /&gt;
                    print &#039;&amp;lt;font class=&amp;quot;vmenudisabled&amp;quot;&amp;gt;&#039;.$this-&amp;gt;menu_array[$i][&#039;titre&#039;].&#039;&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
            }&lt;br /&gt;
            if ($this-&amp;gt;menu_array[$i][&#039;level&#039;]==1) {&lt;br /&gt;
                if ($this-&amp;gt;menu_array[$i][&#039;enabled&#039;])&lt;br /&gt;
                    print &#039;&amp;lt;a class=&amp;quot;vsmenu&amp;quot; href=&amp;quot;&#039;.$this-&amp;gt;menu_array[$i][&#039;url&#039;].&#039;&amp;quot;&amp;gt;&#039;.$this-&amp;gt;menu_array[$i][&#039;titre&#039;].&#039;&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                else &lt;br /&gt;
                    print &#039;&amp;lt;font class=&amp;quot;vsmenudisabled&amp;quot;&amp;gt;&#039;.$this-&amp;gt;menu_array[$i][&#039;titre&#039;].&#039;&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
            }&lt;br /&gt;
            if ($this-&amp;gt;menu_array[$i][&#039;level&#039;]==2) {&lt;br /&gt;
                if ($this-&amp;gt;menu_array[$i][&#039;enabled&#039;])&lt;br /&gt;
                    print &#039;&amp;amp;nbsp; &amp;amp;nbsp; &amp;lt;a class=&amp;quot;vsmenu&amp;quot; href=&amp;quot;&#039;.$this-&amp;gt;menu_array[$i][&#039;url&#039;].&#039;&amp;quot;&amp;gt;&#039;.$this-&amp;gt;menu_array[$i][&#039;titre&#039;].&#039;&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                else &lt;br /&gt;
                    print &#039;&amp;amp;nbsp; &amp;amp;nbsp; &amp;lt;font class=&amp;quot;vsmenudisabled&amp;quot;&amp;gt;&#039;.$this-&amp;gt;menu_array[$i][&#039;titre&#039;].&#039;&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
            }&lt;br /&gt;
            if ($this-&amp;gt;menu_array[$i][&#039;level&#039;]==3) {&lt;br /&gt;
                if ($this-&amp;gt;menu_array[$i][&#039;enabled&#039;])&lt;br /&gt;
                    print &#039;&amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;lt;a class=&amp;quot;vsmenu&amp;quot; href=&amp;quot;&#039;.$this-&amp;gt;menu_array[$i][&#039;url&#039;].&#039;&amp;quot;&amp;gt;&#039;.$this-&amp;gt;menu_array[$i][&#039;titre&#039;].&#039;&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
                else &lt;br /&gt;
                    print &#039;&amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;lt;font class=&amp;quot;vsmenudisabled&amp;quot;&amp;gt;&#039;.$this-&amp;gt;menu_array[$i][&#039;titre&#039;].&#039;&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&#039;;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            if ($i == (sizeof($this-&amp;gt;menu_array)-1) || $this-&amp;gt;menu_array[$i+1][&#039;level&#039;]==0)  {&lt;br /&gt;
                print &amp;quot;&amp;lt;/div&amp;gt;\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Forcer l&#039;utilisation de votre gestionnaire de menu=&lt;br /&gt;
Vous pouvez aussi forcer l&#039;utilisation de votre gestionnaire au dépend de tout autre en développant un module.&lt;br /&gt;
Pour cela, il suffit d&#039;ajouter les 4 constantes suivantes dans le tableau $this-&amp;gt;const de votre descripteur de module (Voir la page [[Développement module]]).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
* 1=&amp;gt;array(&#039;MAIN_MENU_STANDARD_FORCED&#039;,&#039;chaine&#039;,&#039;monmenu.php&#039;,&#039;Force menu handler to this value&#039;,1,&#039;current&#039;,1),&lt;br /&gt;
* 2=&amp;gt;array(&#039;MAIN_MENUFRONT_STANDARD_FORCED&#039;,&#039;chaine&#039;,&#039;monmenu.php&#039;,&#039;Force menu handler to this value&#039;,1,&#039;current&#039;,1),&lt;br /&gt;
* 3=&amp;gt;array(&#039;MAIN_MENU_SMARTPHONE_FORCED&#039;,&#039;chaine&#039;,&#039;monmenu.php&#039;,&#039;Force menu handler to this value&#039;,1,&#039;current&#039;,1),&lt;br /&gt;
* 4=&amp;gt;array(&#039;MAIN_MENUFRONT_SMARTPHONE_FORCED&#039;,&#039;chaine&#039;,&#039;monmenu.php&#039;,&#039;Force menu handler to this value&#039;,1,&#039;current&#039;,1),&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Votre gestionnaire de menu sera utilisé, quelque soit la configuration, une fois que le module aura été activé.&lt;/div&gt;</summary>
		<author><name>Florian.mortgat</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Loi_finances_sur_les_logiciels_de_caisse_et_Certification_NF525_ou_LNE&amp;diff=46216</id>
		<title>Loi finances sur les logiciels de caisse et Certification NF525 ou LNE</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Loi_finances_sur_les_logiciels_de_caisse_et_Certification_NF525_ou_LNE&amp;diff=46216"/>
		<updated>2020-02-19T13:07:48Z</updated>

		<summary type="html">&lt;p&gt;Florian.mortgat: /* Résumé */ à soit même → à soi-même&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;seo metak=&amp;quot;loi finance 2016, loi finance 2018, loi finance 2019, NF525, logs inaltérables, logiciels de caisse, logiciels comptabilité&amp;quot; /&amp;gt;&lt;br /&gt;
Ceci est une page de suivi du projet Article 88 de la Loi finance 2016 (n° 2015-1785 du 29 décembre 2015), applicable au 1er janvier 2018 en France (sans tolérance en 2019).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Résumé =&lt;br /&gt;
&lt;br /&gt;
La &#039;&#039;&#039;loi finances 2016, article 88 modifiant le 286 du CGI&#039;&#039;&#039;, impose à tous les commerçants, &#039;&#039;&#039;assujettis à la TVA hors franchise en base de TVA&#039;&#039;&#039; (et seulement ces derniers) ET qui sont équipés d&#039;un &amp;quot;logiciel ou système de caisse&amp;quot; (comprendre logiciel d&#039;encaissement d&#039;argent, cela inclut les logiciels de gestion) ET qui réalisent de l&#039;encaissement de particuliers, d&#039;utiliser un logiciel dans un cadre &amp;quot;conforme&amp;quot; à la loi finance 2016, et ce dès le 1er janvier 2018 (avec tolérance sur 2018 si l&#039;utilisateur peut montrer qu&#039;il a entamé une trajectoire dans le but de mise en conformité, mais n&#039;a pas encore pu finaliser sa démarche par exemple pour cause d&#039;attente de publication d&#039;une version conforme, ou de délai nécessaire pour la migration technique).&lt;br /&gt;
&lt;br /&gt;
La &amp;quot;conformité Loi Finance&amp;quot; dite aussi &amp;quot;Anti Fraude TVA&amp;quot; est absolument sans aucun rapport avec la notion de &amp;quot;Compatible avec les normes de logiciels comptables&amp;quot;, normes requises pour établir les documents fiscaux officiels et les télétransmettre à l&#039;administration. Ces normes (par exemple &amp;quot;la compatibilité avec le format FEC&amp;quot; obligatoire depuis le 1er janvier 2014 [https://www.legifrance.gouv.fr/affichCodeArticle.do?cidTexte=LEGITEXT000006069583&amp;amp;idArticle=LEGIARTI000027804775 défini ici], ou encore &amp;quot;la compatibilité pour télétransmission EDI&amp;quot;) existent d&#039;ailleurs depuis plusieurs années bien avant la loi finance 2016 et concernent uniquement le &amp;quot;logiciel de comptabilité&amp;quot; de l&#039;expert comptable qui approuve les comptes, logiciel utilisé en fin de chaîne pour produire la liasse fiscale, et, seul ce dernier logiciel a cette contrainte de &amp;quot;compatibilité logiciel comptable&amp;quot; : le logiciel de gestion ou de suivi de l&#039;entreprise (comme par exemple Dolibarr), même si il est utilisé pour réaliser une comptabilité interne de l&#039;entreprise (par exemple en préparation d&#039;export vers le logiciel de l&#039;expert-comptable, ou utilisé pour offrir un suivi ou mâcher le travail du comptable pour réduire son coût), n&#039;a &#039;&#039;&#039;aucune obligation sur ce point &#039;&#039;&#039; si c&#039;est un autre qui sert pour établir les documents légaux. &lt;br /&gt;
&lt;br /&gt;
Par contre, le logiciel de l&#039;entreprise peut avoir l&#039;obligation d&#039;être &#039;&#039;&#039;conforme Loi finance 2016 - Anti Fraude TVA&#039;&#039;&#039;. Cette conformité s&#039;applique à tout &amp;quot;logiciel d&#039;encaissements&amp;quot;, ce qui est différent de &amp;quot;logiciel comptable&amp;quot; (et donc s&#039;applique aux logiciels de facturation ou de gestion avec saisie d&#039;encaissements, aux logiciels de caisse enregistreuse (Point de Vente) et, éventuellement, aux logiciels de comptabilité si c&#039;est lui qui est utilisé pour saisir et suivre les encaissements clients, ce qui est rarissime car cela sous-entend que la gestion de l&#039;entreprise est faite directement dans le logiciel du comptable qui certifie les comptes !).&lt;br /&gt;
&lt;br /&gt;
Cette conformité &amp;quot;Loi Finance&amp;quot; pour son logiciel d&#039;encaissement, peut s&#039;obtenir de 3 manières différentes (une seule des 3 solutions suffit):&lt;br /&gt;
&lt;br /&gt;
* Par l&#039;utilisation d&#039;une version &#039;&#039;&#039;certifiée Loi Finance&#039;&#039;&#039; du logiciel (Exemple via l&#039;obtention de la certification LNE ou l&#039;obtention de la norme NF525 de l&#039;AFNOR). Une version certifiée l&#039;est pour tout le monde mais, pour évoluer, il faut attendre la prochaine version certifiée, et le processus de certification est long et coûteux pour l&#039;éditeur. Le principe de certification n&#039;est donc plus adapté aux logiciels modernes ni aux logiciels en Cloud/SaaS qui évoluent rapidement).&lt;br /&gt;
ou bien&lt;br /&gt;
* Par obtention d&#039;une &#039;&#039;&#039;attestation individuelle de conformité Loi Finance&#039;&#039;&#039; décernée par une société Tiers, comme un éditeur ou intégrateur informatique (Exemple d&#039;attestation vierge proposé par le gouvernement: http://bofip.impots.gouv.fr/bofip/10692-PGP.html). Une attestation est individuelle, chaque société utilisatrice doit en obtenir une, auprès d&#039;un Tiers, pour elle même.&lt;br /&gt;
ou bien&lt;br /&gt;
* En &#039;&#039;&#039;se délivrant à soi-même cette attestation&#039;&#039;&#039; (sans la demander à un tiers donc), on parle d&#039;auto-attestation, mais ce cas est limité aux sociétés qui ont, entre autre, une activité &#039;&#039;&#039;avérée&#039;&#039;&#039; d&#039;édition de logiciel de caisse (le code Nace n&#039;ayant  qu&#039;une valeur indicative statistique, c&#039;est votre activité réelle, dont il vous revient d&#039;en démontrer le côté avéré qui sera pris en compte, et non un code Nace spécifique comme cela avait été cité dans des versions intermédiaires de texte de loi)&lt;br /&gt;
&lt;br /&gt;
Le chapitre &amp;quot;Historique&amp;quot; vous permet de voir les rebondissements et changements de direction de la loi. Connaitre ces rebondissements aide à comprendre pourquoi de nombreux acteurs se sont trompés ou continuent de se tromper sur cette loi. Le chapitre d&#039;après &amp;quot;Questions / Réponses&amp;quot; vous offre une vue rapide de la loi définitive par une approche de questions/réponses.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Historique de la définition de la loi et rebondissements ==&lt;br /&gt;
&lt;br /&gt;
Pour ceux qui ont le temps de lire, voici un flux qui décrit les documents originaux qui ont été communiqués par le gouvernement et les mises à jours qui ont suivi pour définir le périmètre et la conclusion de la loi, avec les rebondissements:&lt;br /&gt;
&lt;br /&gt;
* Voici l&#039;article &#039;&#039;&#039;initial&#039;&#039;&#039; de la loi finance, datant du 29/12/2015:  [https://www.legifrance.gouv.fr/affichTexteArticle.do?cidTexte=JORFTEXT000031732865&amp;amp;idArticle=LEGIARTI000031734740&amp;amp;dateTexte=20151230 Article sur LegiFrance]&lt;br /&gt;
* Voici l&#039;article, &#039;&#039;&#039;pour sa publication au BOFIP&#039;&#039;&#039;, du 03/08/2016: http://bofip.impots.gouv.fr/bofip/10691-PGP.html?identifiant=BOI-TVA-DECLA-30-10-30-20160803&lt;br /&gt;
&lt;br /&gt;
Pour résumer, ces 2 publications indiquent qu&#039;il faudra, pour toute société/organisme qui &#039;&#039;enregistre les règlements de ses clients au moyen d&#039;un logiciel de comptabilité ou de gestion ou d&#039;un système de caisse, utiliser un logiciel ou un système satisfaisant à des conditions d&#039;inaltérabilité, de sécurisation, de conservation et d&#039;archivage des données en vue du contrôle de l&#039;administration fiscale, attestées par un certificat délivré par un organisme accrédité dans les conditions prévues à l&#039;article L. 115-28 du code de la consommation OU par une attestation individuelle de l&#039;éditeur, conforme à un modèle fixé par l&#039;administration&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:Warning.png]] 15 juin 2017: Communiqué de presse du cabinet du ministère: http://proxy-pubminefi.diffusion.finances.gouv.fr/pub/document/18/22503.pdf -&amp;gt; &lt;br /&gt;
Seules les &amp;quot;logiciels de caisse&amp;quot; seraient concernés (la définition de logiciel de caisse n&#039;est toutefois pas encore apportée, elle le sera le 15 juillet 2018, voir la suite). &lt;br /&gt;
Dès logiciels ERP (comme Dolibarr), ainsi que les logiciels de site ecommerce (comme Prestashop, Magento, ...) n&#039;étant dans pas la catégorie logiciels de caisse (Les ERP sont dans la catégorie logiciels de gestion), on aurait cru que l&#039;obligation de mise en conformité et tout ce qui suit semblait ne plus être avéré pour eux, mais la suite des événements (voir la suite) indiquera le contraire si vous enregistrez dans le logiciel des paiements de particuliers, quelquesoit la catégorie du logiciel (seules les sociétés encaissant exclusivement d&#039;autres sociétés, ou ceux en tva en franchise, seront finalement exemptées)...&lt;br /&gt;
&lt;br /&gt;
[[File:Warning.png]] 27 septembre 2017: Voici l&#039;avenant publié le 27 septembre 2017 qui réduit la portée/périmètre de la loi aux seuls &amp;quot;logiciels de caisse&amp;quot;: http://www.assemblee-nationale.fr/15/projets/pl0235.asp (Article 46). En d&#039;autres terme, les applications ERP (Comme Dolibarr) semblent la encore ne plus être concernées, mais la suite des événements (voir la suite) indiquera le contraire si vous encaissez des particuliers (seules les sociétés encaissant exclusivement d&#039;autres sociétés, ou ceux en franchises seront finalement exemptées)...&lt;br /&gt;
&lt;br /&gt;
Suite aux questions, une FAQ, issue du ministère des finances, est alors parue pour tenter de clarifier le périmètre. Elle indique que tous les assujetis à TVA qui vendent à un non assujetti (particuliers) sont concernés. Si on lit tel quel cette FAQ, alors le périmètre est non seulement pas réduit, comme communiqué par le ministère dans son courrier du 15 juin, mais élargit, y compris aux sites e-commerce. Cette FAQ est le premier élément qui apporte donc une définition au terme &amp;quot;système de caisse&amp;quot; en considérant tout logiciel traçant des encaissements, comme &amp;quot;systeme de caisse&amp;quot;.&lt;br /&gt;
Des amendements ont été rédigés pour tenter de clarifier ou restreindre cette définition, voir la suite...&lt;br /&gt;
&lt;br /&gt;
[[File:Warning.png]] 14 octobre 2017: Une reformulation du texte, plus complète que la FAQ, est donnée stipulant qu&#039;une entité est concernée... &amp;quot;&#039;&#039;Si elle effectue des livraisons de biens et des prestations de services ne donnant pas lieu à facturation conformément à l’article 289 et enregistre ces opérations au moyen d’un logiciel ou d&#039;un système de caisse&#039;&#039; ... &amp;quot;. Dans ce cas, il faut &amp;quot;&#039;&#039;... utiliser un logiciel ou un système satisfaisant à des conditions d&#039;inaltérabilité, de sécurisation, de conservation et d&#039;archivage des données en vue du contrôle de l&#039;administration fiscale, attestées par un certificat délivré par un organisme accrédité dans les conditions prévues à l&#039;article L. 433-4 du code de la consommation OU par une attestation individuelle de l&#039;éditeur, conforme à un modèle fixé par l&#039;administration ;&#039;&#039;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Il est aussi précisé: &#039;&#039;« 2. Les assujettis bénéficiant d&#039;une franchise de taxe mentionnée à l&#039;article 293 B, ceux placés sous le régime du remboursement forfaitaire prévu aux articles 298 quater et 298 quinquies et ceux effectuant exclusivement des opérations ou des prestations exonérées de taxe sur la valeur ajoutée sont dispensés de l&#039;obligation mentionnée au 3° bis du I. » ; &lt;br /&gt;
&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Voir: [https://www.legifrance.gouv.fr/eli/loi/2017/12/30/CPAX1723900L/jo/texte/fr#JORFARTI000036339313 Article sur LegiFrance] pour le texte complet mentionnant ces 2 points.&lt;br /&gt;
&lt;br /&gt;
[[File:Warning.png]] 20 novembre 2017: Nouveaux éléments permettant de mieux cibler le périmètre. En effet, l&#039;amendement II-CF15 = II-1649 de la loi Finance 2018 sur l&#039;article 46 pour exclure les encaissements de particuliers qui font l&#039;objet de fabrication d&#039;une facture en bon et du forme (afin d&#039;exclure les ERP et plateforme ecommerce) a été rejeté en séance à l&#039;assemblée: Seule l&#039;encaissement de sociétés est bien hors périmètre. En effet, considérant que l&#039;administration a le droit de vérification chez les clients de type société, les traces fournies par les factures suffisent pour assurer un contrôle satisfaisant, mais ce droit n&#039;existe pas en ce qui concerne la facturation des particuliers. Dans ce cas la, même la facture est peu utile à l&#039;administration et par conséquent les contraintes d&#039;inaltérabilité deviennent requises, même si on émet une facture en bon et du forme. Cette conclusion fait suite aux échanges suites à l&#039;amendement II-CF15 = II-1649 de la loi Finance 2018 sur l&#039;article 46. &lt;br /&gt;
&lt;br /&gt;
Pour info, texte complet de la tentative d&#039;amendement: http://www.assemblee-nationale.fr/15/amendements/0235C/AN/1649.asp ou en PDF http://www.assemblee-nationale.fr/15/amendements/0235C/CION_TOUTE/CF15.pdf&lt;br /&gt;
&lt;br /&gt;
Et voici les extraits importants de la discussion:&lt;br /&gt;
&lt;br /&gt;
D&#039;abord, la tentative de M. Bruno Millienne pour tenter d&#039;exclure les logiciels émettant des factures en bon et du forme:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;M. Bruno Millienne. &amp;quot;[...]le renvoi à l’article 289 du code général des impôts – CGI – ne vise que les cas d’émission de factures obligatoires au sens fiscal pour les opérations entre assujettis ou personnes morales. En l’état, le texte conduirait à appliquer le dispositif de certification ou d’attestation à toutes les opérations réalisées avec les particuliers, même lorsqu’elles donnent lieu à l’émission de factures conformes au CGI, par exemple dans le cadre du commerce électronique. [...] La rédaction actuelle de l’article peut conduire à requalifier en logiciel de caisse un logiciel de facturation, si des factures sont émises à l’attention d’un particulier ou d’une administration, ou un logiciel de comptabilité, si des règlements sont comptabilisés directement par l’utilisateur. L’éditeur deviendrait ainsi responsable du mode d’utilisation de son logiciel par l’assujetti. Il est impossible de transposer les exigences d’un logiciel de caisse à un logiciel de facturation : leurs fonctionnalités respectives sont totalement différentes. Actuellement, il existe des dispositifs de certification en matière de caisse, mais pas en matière de facturation.&amp;quot;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;...&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Réponse de &#039;&#039;M. Joël Giraud, rapporteur général de la commission des finances, de l’économie générale et du contrôle budgétaire: Avis défavorable. L’article 46 précise que l’obligation de certification ne vaut que pour les logiciels ou systèmes de caisse. L’obligation ne concernera plus les progiciels de gestion intégrée ou de comptabilité : pour ces logiciels multifonctions qui traitent à la fois la comptabilité, la gestion et la caisse, seuls les modules caisse enregistreuse et encaissement devront être certifiés, non l’ensemble du logiciel.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;...&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Et enfin le complément de &#039;&#039;M. Benjamin Griveaux, secrétaire d’État auprès du ministre de l’économie et des finances: Avis défavorable. Une facture n’est obligatoire, au sens fiscal, que dans le cadre d’une relation B to B – business to business, c’est-à-dire d’entreprise à entreprise. L’administration fiscale peut la contrôler car elle dispose d’un droit de communication envers l’entreprise cliente. A contrario, elle ne peut exercer de droit de communication auprès des particuliers. Cet amendement conduirait donc à exclure du dispositif de sécurisation les entreprises qui émettent des factures contenant les mentions légales, qu’elles soient adressées à des entreprises ou à des particuliers. Je suis donc l’avis du rapporteur général quant au risque de fraude accrue que cet amendement ferait courir.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
La discussion complète de la séance ayant rejeté l&#039;amendement est disponible ici: http://www.assemblee-nationale.fr/15/cri/2017-2018/20180063.asp#P1103690&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;En conclusion, l&#039;amendement ayant été rejeté, il faut en déduire que la volonté est bien d&#039;intégrer, dans le périmètre, toutes les parties/modules de logiciels, utilisés comme caisse enregistreuse OU pour enregistrer des paiements de particuliers (logiciel ecommerce, de caisse, de gestion,...)&#039;&#039;&#039; et que l&#039;émission de facture en bon et du forme à des particuliers ne permet pas de sortir du périmètre...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Warning.png]] 30 décembre 2017:&lt;br /&gt;
&lt;br /&gt;
L&#039;article 88 qui disaient &#039;&#039;..toute personne assujettie à la taxe sur la valeur ajoutée (TVA) qui enregistre les règlements de ses clients au moyen d&#039;un logiciel de comptabilité ou de gestion ou d&#039;un système de caisse, doit utiliser un logiciel ou un système satisfaisant à des conditions d&#039;inaltérabilité, de sécurisation, de conservation et d&#039;archivage des données en vue du contrôle de l&#039;administration fiscale&#039;&#039;&lt;br /&gt;
est complété par l&#039;article 105 qui remplace &amp;quot;&#039;&#039;logiciel de comptabilité ou de gestion ou d&#039;un système de caisse&#039;&#039;&amp;quot; par &amp;quot;&#039;&#039;logiciel ou d&#039;un système de caisse&#039;&#039;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[File:Warning.png]] 23 janvier 2018: Un représentant du projet Dolibarr, avec des représentants de l&#039;APRIL et du logiciel libre de caisse Pasteque, ont été reçus au ministère des finances afin d&#039;échanger sur l&#039;interprétation du texte. Les interprétations faites sur cette page (ainsi que les réponses faites aux FAQ qui suivent) ont pu être confirmées. &lt;br /&gt;
Toutefois, il y a intention de réduire le périmètre aux seuls logiciels de caisse. A suivre donc. Une version de travail revue, du Bofip doit être publiée à un comité restreint d&#039;acteurs, dont l&#039;April, fin janvier, afin de faciliter le travail d&#039;interprétations, pour une publication officielle au printemps. En attendant, on ne peut qu&#039;attendre (Cette publication aura lieu finallement le 4 juillet 2018 et une grande partie de nos retours s&#039;avèrera prise en compte).&lt;br /&gt;
&lt;br /&gt;
[[File:Warning.png]] 18 mai 2018: Réponse du gouvernement à quelques questions sur le sujet: https://www.nosdeputes.fr/15/question/QE/3257 . La réponse évoque l&#039;année de tolérance en précisant que l&#039;utilisateur devra montrer sa diligence en cas de contrôle (Soin appliqué à la mise en oeuvre de l&#039;obtention de l&#039;attestation individuelle)&lt;br /&gt;
&lt;br /&gt;
[[File:Warning.png]] 5 juin 2018: Réponse du gouvernement à quelques questions sur le sujet: https://www.nosdeputes.fr/15/question/QE/2736 . La réponse évoque l&#039;année de tolérance en précisant que l&#039;utilisateur devra montrer sa diligence en cas de contrôle (Soin appliqué à la mise en oeuvre de l&#039;obtention de l&#039;attestation individuelle)&lt;br /&gt;
&lt;br /&gt;
[[File:Warning.png]] 4 juillet 2018: Publication de la version corrigée du texte de loi au BOFIP: http://bofip.impots.gouv.fr/bofip/10691-PGP.html?ftsq=boi-tva-decla-30-10-30&amp;amp;identifiant=BOI-TVA-DECLA-30-10-30-20180704. Cette version conforte tous les points évoqués (le texte clarifie la loi et confirme que les interprétations vu ci-dessus s&#039;avéraient justes), avec toutefois 2 ajouts majeures:&lt;br /&gt;
* La définition de logiciel de caisse a été donnée: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Un logiciel ou système de caisse est un système informatique doté d&#039;une fonctionnalité de caisse, laquelle consiste à mémoriser et à enregistrer extra-comptablement des paiements reçus en contrepartie d&#039;une vente de marchandises ou de prestations de services c&#039;est-à-dire que le paiement enregistré ne génère pas concomitamment, automatiquement et obligatoirement la passation d&#039;une écriture comptable.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Ne sont pas considérés comme enregistrés extra-comptablement, quel que soit le mode de paiement, les paiements pour lesquels le logiciel ou système déclenche obligatoirement, instantanément et automatiquement, sans intervention humaine, une écriture dans le système d’information comptable.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Sont visés tous les logiciels ou systèmes de caisse permettant l&#039;enregistrement des règlements de leurs clients quel que soit le mode de règlement (espèces, chèques, CB, virements, prélèvements...).&lt;br /&gt;
Cette obligation s&#039;applique y compris en cas d&#039;enregistrement sur un logiciel ou système accessible en ligne.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Sans que cette liste ne soit limitative, sont concernés par l&#039;obligation les instruments de mesures réglementés, comme les balances, mais également les rampes de boissons automatisées, les automates de paiement ou encore les distributeurs automatiques de marchandises (boissons, gâteaux…) qui disposent d&#039;une fonctionnalité de caisse.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Seule cette fonctionnalité de caisse, et non les autres fonctions telles que celles relatives à la pesée, doivent être certifiées.&#039;&#039;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* L&#039;article 35 qui est un allègement du périmètre: Les professionnels réalisant leur paiement avec l&#039;intermédiation d&#039;un établissement de crédit européen ne sont plus soumis à l&#039;obligation de certification ou attestation. Mais attention, on parle bien de paiements &amp;quot;directs&amp;quot; (donc Virement ou Carte de Débit ou de Crédit mais pas chèques qui n&#039;est pas &amp;quot;direct&amp;quot;) et surtout via un système de paiement géré par un organisme bancaire européen. En d&#039;autres terme, si on ne fait que du paiement CB avec un module de VAD d&#039;une banque, on est NON soumis à la certification/attestation mais si le paiement CB (carte de crédit ou débit) se fait par un service comme Stripe ou Paypal, sauf à être exempté pour un autre motif, on l&#039;est toujours (car l&#039;état français n&#039;a pas de moyen d&#039;obtenir le listing des transactions via ces solutions, bien que le paiement soit par carte bancaire).&lt;br /&gt;
&lt;br /&gt;
== Conclusion pour le logiciel Open Source Dolibarr ERP CRM ==&lt;br /&gt;
&lt;br /&gt;
Dolibarr ERP CRM est une application de gestion qui enregistre des factures (factures acomptes, avoirs ou standards). L&#039;application permet aussi d&#039;enregistrer des paiements. Le module POS (celui fourni par défaut), fonctionne aussi sur le principe de génération systématique de facture et d&#039;enregistrement du paiement en temps réel. L&#039;application est donc bien dans le périmètre (comme n&#039;importe quel autre ERP, logiciel de caisse ou de Ecommerce). Mais en tant qu&#039;utilisateur, vous n&#039;êtes concerné que si vous n&#039;etes pas en franchise de base ET si vous l&#039;utilisez pour saisir des &#039;&#039;&#039;encaissements&#039;&#039;&#039; de particuliers (B2C=Business To Consumer) ou en mode mixte, à savoir encaissement aussi bien de particuliers (B2C) et d&#039;entreprises (B2B), quelquesoit le ratio entre les 2. Si vous ne facturez QUE des professionnels, dans ce cas, vous n&#039;êtes pas concerné par la LF2018 (Loi finance 2018).&lt;br /&gt;
&lt;br /&gt;
Dans le cas où vous utilisez le module Facture, ou le module POS, pour encaisser des particuliers, et êtes assujettis à la TVA mais pas en franchise, vous êtes concerné. Il vous faut alors vous assurer que le module &amp;quot;Log inaltérable&amp;quot; (&amp;quot;BlockedLog&amp;quot;) fourni avec la v7 est bien activé. Sa désactivation, une fois les premières saisies faites ne sera ensuite plus envisageable. Avec la migration en v7 et l&#039;activation de ce module vous aurez alors une version conforme sur le plan technique et fonctionnel. Il vous faudra ensuite, obtenir une attestation de conformité auprès d&#039;un tiers qui confirme cette conformité technique/fonctionnelle pour être conforme d&#039;un point de vue juridique. Si vous utilisez une version en ligne Saas/Cloud fournie par un tiers, ce dernier vous la fournira surement (voir exemples sur https://saas.dolibarr.org). Dans le cas contraire, il vous faut contactez votre intégrateur informatique ou un prestataire pouvant fournir cette d&#039;attestation.&lt;br /&gt;
&lt;br /&gt;
Remarque: cette contrainte sera identique quelque soit l&#039;ERP choisi. L&#039;utilisation d&#039;outils non spécialisés comme un tableur Excel ou autre, DANS LE BUT D&#039;AVOIR UNE CONSERVATION DE TRACES DES PAIEMENTS, ne devient plus permis car le logiciel n&#039;étant pas conforme, vous ne réussirez pas à trouver un prestataire pour fournir l&#039;attestation de conformité. Par contre, si l&#039;utilisation que vous faites d&#039;Excel ou autre tableur est à des fins juste de &amp;quot;génération du PDF de la facture&amp;quot; sans &#039;&#039;conservation des données&#039;&#039; (Le texte de loi parle alors de logiciel &amp;quot;facturier&amp;quot;), vous pouvez continuer à l&#039;utiliser ainsi. Dans le cas où l&#039;utilisation est faite pour conserver trace de vos paiements, et si vous êtes dans le périmètre de la loi, un logiciel &#039;&#039;&#039;certifié ou attestable&#039;&#039;&#039; sur la partie encaissement (comme l&#039;est Dolibarr) devient obligatoire.&lt;br /&gt;
&lt;br /&gt;
Voyons aussi, par une autre approche, à savoir un système de question-réponse, comment synthétiser autrement tout cela:&lt;br /&gt;
&lt;br /&gt;
= Questions / Réponses (FAQ) =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;J&#039;utilise Dolibarr ou autre logiciel ERP, suis-je concerné, pour quelle fonctionnalité ?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Votre logiciel n&#039;est concerné que si vous êtes &#039;&#039;&#039;assujetties à la TVA (et pas en franchise en base de TVA)&#039;&#039;&#039;, ET si vous l&#039;utilisez pour saisir des &#039;&#039;&#039;encaissements de particuliers&#039;&#039;&#039; (B2C=Business To Consumer) ou en mode mixte, à savoir encaissement aussi bien de particuliers (B2C) et d&#039;entreprises (B2B), quelque soit le ratio entre les 2, quelque soit les modes de paiement utilisés (sauf à ne faire que du paiement direct par l&#039;intermédiation d&#039;un organisme bancaire européen). Donc:&lt;br /&gt;
** si vous n&#039;encaissez pas d&#039;argent, vous n&#039;êtes PAS concerné.&lt;br /&gt;
** si vous êtes une association/organisme non assujettie à la TVA (association, médecin, ...), vous n&#039;êtes PAS concerné.&lt;br /&gt;
** si vous êtes un professionnel bénéficiant du régime de remboursement forfaitaire de TVA agricole, vous n&#039;êtes PAS concerné.&lt;br /&gt;
** si vous êtes un auto-entrepreneur, vous n&#039;êtes PAS concerné (car assujettie en franchise en base).&lt;br /&gt;
** si vous êtes une entreprise dont l&#039;intégralité des encaissements est réalisée avec l&#039;intermédiation directe d’un établissement de crédit (système de paiement VAD d&#039;une banque ou Virements), vous n&#039;êtes PAS concerné. Remarque: Des encaissements par Carte bancaire via Paypal ou via Stripe ne sont pas des encaissements avec intermédiation directe d’un établissement de crédit, car ni Paypal ni Stripe ne sont des établissements de crédit (comprendre Banque).&lt;br /&gt;
** si vous ne facturez QUE des entreprises/professionnels, dans ce cas, vous n&#039;êtes PAS concerné non plus par la loi finance (non B2C). Remarque: Si vous facturez des professionnels la plupart du temps et, exceptionnellement de temps en temps des particuliers via un mode de paiement non assuré par un organisme de crédit européen, si vous pouvez gérer/suivre ces facturations de particuliers à part sur papier, vous sortez alors du champ et n&#039;êtes pas concerné.&lt;br /&gt;
&lt;br /&gt;
Si vous n&#039;êtes dans aucun des cas d&#039;exception précédent, vous êtes concernés si vous utilisez le module Facture pour enregistrer vos paiements et/ou le module POS. Il vous faut alors vous assurer que le module &amp;quot;Log inaltérable&amp;quot; (&amp;quot;BlockedLog&amp;quot;) fourni avec la v7 est bien activé. Sa désactivation, une fois les premières saisies faites ne sera ensuite plus envisageable. Avec la migration en v7 et l&#039;activation de ce module vous aurez alors une version conforme sur le plan technique et fonctionnel. Il vous faudra ensuite, obtenir une attestation de conformité auprès d&#039;un tiers qui confirme cette conformité technique/fonctionnelle pour être conforme d&#039;un point de vue juridique. &lt;br /&gt;
&lt;br /&gt;
Si vous utilisez une version en ligne Saas/Cloud fournie par un tiers, ce dernier vous la fournira surement (exemple: https://www.dolicloud.com ou https://www.novafirstcloud.com). Dans le cas contraire, il vous faut contactez votre intégrateur ou un prestataire pouvant fournir cette d&#039;attestation.&lt;br /&gt;
&lt;br /&gt;
Remarque: cette contrainte sera identique quelque soit l&#039;ERP choisi. L&#039;utilisation d&#039;outils non spécialisés comme un tableur Excel ou autre, DANS LE BUT D&#039;AVOIR UNE CONSERVATION DE TRACE DES PAIEMENTS, ne devient plus permis car le logiciel n&#039;étant pas conforme, vous ne réussirez pas à trouver un prestataire pour fournir l&#039;attestation de conformité. Par contre, si l&#039;utilisation que vous faites d&#039;Excel ou autre tableur est à des fins juste de &amp;quot;génération du PDF de la facture&amp;quot; sans &#039;&#039;conservation des données&#039;&#039; (Le texte de loi parle alors de logiciel &#039;&#039;facturier&#039;&#039;), vous pouvez continuer à l&#039;utiliser ainsi. Dans le cas ou l&#039;utilisation est faite pour conserver trace de vos paiements, et si vous êtes dans le périmètre de la loi, un logiciel &#039;&#039;&#039;certifié ou attestable&#039;&#039;&#039; sur la partie encaissement (comme l&#039;est Dolibarr) devient obligatoire.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Je suis concerné, mais à partir de quand ?&#039;&#039;&#039;&lt;br /&gt;
* Si vous êtes concerné, la loi s&#039;applique au 1er janvier 2018. Toutefois, le texte de loi clarifié datant de juillet 2018, si on ajoute le temps requis par les logiciels pour s&#039;adapter à la version définitive, puis le temps de migration sur la nouvelle version, une tolérance est de mise la première année (donc 2018), à condition de montrer que vous suivez le sujet et avez attendu pour avoir le texte définitif puis pour avoir la version conforme puis pour avoir le  bon moment de faire votre migration. Si vous utilisez Dolibarr, les différentes évolutions de cette page montre que la démarche est engagée sur le logiciel depuis novembre 2016 et ce alors que le périmètre de la loi était encore contradictoire début novembre 2017.&lt;br /&gt;
&lt;br /&gt;
A la question posée en janvier 2018 au ministère des finances: &amp;quot;Que pouvons nous dire aux utilisateurs qui sont en attente de texte/règle clarifiée pour agir, sachant que la loi est sensé être déjà effective ?&amp;quot;, la réponse donnée a été que la première année (2018 donc), il y aurait tolérance, dès lors que vous montrez que vous avez pris une trajectoire sur 2018 pour bien faire. Cette année transitoire ayant été officiellement annoncée par le secrétaire d&#039;état, dont voici les propos:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;« Je veux toutefois rassurer les entreprises : la direction générale des finances publiques les accompagnera pendant la première année d’application de ce dispositif, en vertu non pas d’une culture de la sanction ou du contrôle fondée sur le présupposé d’une malveillance des entreprises, mais d’un rôle de conseil. La DGFIP tiendra notamment compte des démarches engagées et des diligences effectuées par les entreprises pour obtenir le certificat ou l’attestation. C’est dans cet esprit que nous travaillerons. Les deux organismes certificateurs prendront également leur part de cet effort de pédagogie, qui est normal. »&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;La nécessité d&#039;attestation ou certification disparaît-elle si on n&#039;enregistre nos paiements que via un mode de règlement qui laisse déjà des traces, comme les chèques ou cartes ?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Au départ, le type de règlement n&#039;avait aucun impact sur la loi. Tous les types de paiement (chèque, carte, liquide, virement, ...) rentrent dans le périmètre de la loi et aucun ne permet d&#039;être hors du champs d&#039;application. L&#039;amendement suivant https://www.nosdeputes.fr/15/amendement/235/1325C a tenté de restreindre le périmètre à un certain mode de paiement, mais a été rejeté.&lt;br /&gt;
&lt;br /&gt;
Ceci se comprend dans la mesure où, même un paiement par carte, peut se faire via un système comme Paypal ou Stripe, et que l&#039;administration fiscale française a très peu de pouvoir de contrôle sur une société étrangère.&lt;br /&gt;
Toutefois, il existe des cas où l&#039;administration fiscale a un pouvoir de contrôle, c&#039;est pourquoi, dans la re-publication au BOFIP de la loi le 4 juillet 2018, une exception a été introduite: Les professionnels réalisant leur paiement avec l&#039;intermédiation directe d&#039;un établissement de crédit européen ne sont plus soumis à l&#039;obligation de certification ou attestation. Mais attention, on parle bien de paiements &amp;quot;directs&amp;quot; (donc Virement ou Carte de Débit ou de Crédit, mais pas chèques qui n&#039;est pas &amp;quot;direct&amp;quot;) et surtout via un système de paiement géré par un organisme bancaire européen. En d&#039;autres terme, si on ne fait que du paiement CB avec un module de VAD d&#039;une banque, on est NON soumis à la certification/attestation mais si le paiement CB (carte de crédit ou débit) se fait par un service comme Stripe ou Paypal, sauf à être exempté pour un autre motif, on l&#039;est toujours (car l&#039;état français n&#039;a pas de moyen d&#039;obtenir le listing des transactions via ces solutions, bien que le paiement soit par carte bancaire).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Quelles sont les conditions pour une application concernée pour être conforme (conditions pour obtenir la certification ou l&#039;attestation de conformité) ?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Principe d&#039;inaltérabilité&lt;br /&gt;
** Logs non modifiable par chaînage pour tout ce qui concerne les ventes, encaissements et impression (incluant toutes les mentions obligatoires d&#039;une facture)&lt;br /&gt;
** Quand une facture est validée, la trace et les informations qui ont donné lieu au contenu de la facture ne peuvent plus être modifier. Rem: Il est toujours possible de modifier mais la trace historique (log archivé) doit rester. Si un changement est fait, ce changement doit lui aussi être tracé et reprendre toutes les nouvelles informations et être lui aussi non effaçable.&lt;br /&gt;
** Liens de correspondance afin de vérifier différence entre les logs/archives et les tables de factures et paiements.&lt;br /&gt;
&lt;br /&gt;
* Conservation sur 6 ans ou plus (Remarque: Dolibarr conserve les données en base à vie)&lt;br /&gt;
&lt;br /&gt;
* Fonction &amp;quot;Archiver&amp;quot; annuellement qui permet d&#039;exporter dans un fichier externe dans un format lisible sans le logiciel, et par l&#039;administration, pour consulter l&#039;archive (et retrouver les infos qui compose la facture, les paiements). &lt;br /&gt;
&lt;br /&gt;
* Fournir, soit la certification de conformité du logiciel, soit une attestation de conformité (Voir dans les FAQ plus loin &amp;quot;Quel éditeur peut fournir des attestations pour ma version ?&amp;quot; sur comment l&#039;obtenir)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!! En d&#039;autres termes, il ne sera plus possible d&#039;utiliser des logiciels tableurs comme Excel ou Google Apps, ni autre solution développée soi même pour avoir une trace et conservation de vos paiements, sans considération de cette loi (sauf à continuer de saisir en parallèle soit dans un autre système conforme, soit sur le bon vieux carnet à souche). Mais vous pouvez continuer à utiliser votre tableur à des fins de logiciel pour générer vos Factures (la loi parle de &amp;quot;logiciel facturier&amp;quot;) si il n&#039;y a pas de conservation de données (le logiciel est alors considéré comme simple facturier et donc hors périmètre). &lt;br /&gt;
Pour un suivi et conservation de vos encaissements via un outils informatique, des logiciels, conforme loi finance 2016 comme Dolibarr ERP CRM v7 ou + deviennent alors obligatoires, dès lors que l&#039;on est concerné (voir FAQ &#039;&#039;&#039;...suis-je concerné...&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;L&#039;application Dolibarr sera-t-elle certifiée par l&#039;éditeur ?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Pour Dolibarr, et de nombreux logiciels Open Source, il n&#039;y a pas un éditeur bien identifié car de nombreuses sociétés différentes contribuent à son évolution.&lt;br /&gt;
&lt;br /&gt;
Au sens de la loi, l&#039;éditeur du logiciel est le &#039;&#039;&#039;&amp;quot;dernier&amp;quot; qui a modifié/validé le code&#039;&#039;&#039;. L&#039;entité qui postule pour une certification peut donc être, aussi bien l&#039;association Dolibarr, comme tout intégrateur ou autre institution externe. &lt;br /&gt;
&lt;br /&gt;
Il est possible que l&#039;association Dolibarr, qui a pour rôle la promotion du logiciel, fasse les démarches pour obtenir la certification pour certaines versions majeures, celles qui sont officiellement packagées par le release manager et qui sont mises à disposition sur l&#039;espace de téléchargement officiel par l&#039;association. Il est fort probable que seules quelques versions bien identifiées feront l&#039;objet d&#039;une demande de certification. Toutefois, cette obtention de certification n&#039;est pas obligatoire pour être conforme. L&#039;autre solution, celle de l&#039;obtention d&#039;une attestation s&#039;avère plus simple.&lt;br /&gt;
Nous encourageons donc les utilisateurs qui ont obligation d&#039;utiliser un logiciel conforme (donc les assujettis à TVA hors franchise de base, et qui facture/encaisse des particuliers) à &#039;&#039;&#039;se tourner vers la solution d&#039;attestation&#039;&#039;&#039;. Voir point suivant.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;L&#039;attestation de conformité, autre possibilité, sera-t-elle fournie par l&#039;éditeur ou autre tiers ?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
L&#039;autre solution pour être en règle est d&#039;obtenir une attestation de conformité de votre logiciel de caisse. &lt;br /&gt;
 &lt;br /&gt;
En tant qu&#039;utilisateur, et si vous êtes dans le périmètre de la loi, vous pourrez obtenir une attestation auprès de n&#039;importe quel tiers/intégrateur prêt à la fournir (en général moyennant finance), ou vous la délivrer à vous même si vous êtes une société d&#039;édition de logiciel. Voir les 2 FAQ suivantes pour savoir qui pourra délivrer les attestations de conformité...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Quel éditeur peut fournir des attestations pour ma version, à quel prix ?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
N&#039;importe quelle société qui a les compétences pour analyser le logiciel et vérifier que ses fonctionnalités sont bien en règle peut fournir une attestation à autrui. Le code d&#039;une application libre étant ouvert, toute société compétente dans la technologie du produit, peut maîtriser le code aussi bien que les développeurs initiaux. Une telle société peut donc être qualifiée d&#039;&amp;quot;éditeur&amp;quot;, même si elle n&#039;a pas produit ou très peu produit de code au projet final, et par conséquent, et à même de fournir un attestation individuelle à ses clients.&lt;br /&gt;
&lt;br /&gt;
Le BOFIP dit clairement:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;310. Lorsque le logiciel ou système est conçu de manière ouverte pour permettre son adaptation aux besoins spécifiques des clients, on entend par « éditeur » qui peut valablement demander la certification ou fournir l&#039;attestation individuelle.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Bref, si vous utilisez une version en ligne saas/cloud fournie par un tiers, ce dernier vous la fournira surement (Exemple avec https://www.dolicloud.com ou encore https://www.novafirstcloud.com). Dans le cas contraire, il vous faut contactez votre intégrateur ou un prestataire pouvant fournir cette d&#039;attestation. Une liste de prestataires possibles, non exhaustive, sera ouverte courant 1er trimestre 2018.&lt;br /&gt;
Remarque: cette contrainte sera identique quelque soit l&#039;outil d&#039;enregistrements des encaissements choisi.&lt;br /&gt;
&lt;br /&gt;
En ce qui concerne le prix, tout dépend du tiers qui fournit l&#039;attestation. Certains, par exemple, pourront donner l&#039;attestation gratuitement à condition d&#039;héberger le logiciel attesté chez eux. D&#039;autres vous feront payer la prestation d&#039;audit et la délivrance de l&#039;attestation. Cela peut être de manière récurrente si l&#039;attestation doit être réémise régulièrement suite à modification/mise à jour de l&#039;application.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;La loi finance est-elle compatible avec les licences libres de logiciels de caisse ? &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Si le logiciel libre n&#039;est pas un logiciel qui réalise des encaissements ou si vous n&#039;encaissez que des entreprises, la question ne pose même pas. &lt;br /&gt;
&lt;br /&gt;
Si le logiciel libre est un logiciel d&#039;encaissements et que les clients encaissés sont des particuliers, alors oui, le logiciel libre est parfaitement compatible: &lt;br /&gt;
&lt;br /&gt;
Le paragraphe 40 du BOI le dit explicitement en reconnaissant aux utilisateurs la possibilité « &#039;&#039;d&#039;adapter le logiciel à leurs besoins spécifiques&#039;&#039; » :  &lt;br /&gt;
&lt;br /&gt;
&amp;quot;&#039;&#039;... Sont notamment concernés les logiciels de comptabilité ou de gestion dits &amp;quot;libres&amp;quot; ou développés en interne, c&#039;est-à-dire développés par l&#039;assujetti lui-même. On entend par logiciel libre un logiciel dont les utilisateurs ont un libre usage, une libre étude, une libre modification et une libre distribution. Ces libertés permettent aux utilisateurs d&#039;adapter le logiciel à leurs besoins spécifiques. Les modifications que les utilisateurs peuvent apporter au logiciel libre ou développé en interne ne doivent pas avoir pour objet ou pour effet d&#039;altérer le respect des conditions d&#039;inaltérabilité, de sécurisation, de conservation et d&#039;archivage décrites ci-dessous...&#039;&#039;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Par ailleurs, le paragraphe 310 évoque à nouveau le cas des logiciels « conçus de manière ouverte », c.à.d les logiciels libres.&lt;br /&gt;
&lt;br /&gt;
Donc, aucune objection à utiliser des logiciels libres. Mais attention, l&#039;autorisation de modification est restreinte au code et paramètres &amp;quot;triviaux&amp;quot;. En effet, que ce soit lors d&#039;une utilisation de la version certifiée ou d&#039;une version rendue conforme par obtention d&#039;une attestation de conformité, la nouvelle loi vous prive d&#039;une partie de votre liberté de &#039;&#039;&#039;modifier le logiciel de caisse SUR LES PARTIES qui concernent les fonctions d&#039;inaltérabilité, sécurisation, conservation et archivage&#039;&#039;&#039;. En effet, en faisant une telle modification, la version est considérée comme changée de manière &amp;quot;non triviale&amp;quot;, aussi la certification n&#039;est plus valable, l&#039;attestation d&#039;un tiers non plus. Les logiciels libres sont donc tout à fait légaux et compatible avec la loi, par contre, c&#039;est à condition de ne pas faire n&#039;importe quelle modification. Vous perdez donc une partie de votre liberté (non pas du fait de la licence du logiciel qui le permet, mais du fait de la loi qui est prioritaire sur les droits accordés par la licence. Le logiciel libre est donc bien compatible avec la loi, mais la loi vous prive d&#039;une des 4 libertés que le logiciel libre apportait, celle de le modifier librement. Vous pouvez toujours le faire, mais à condition que cela ne porte pas sur le comportement de l&#039;encaissement, ou, si cela porte sur celui-ci, que vous ré-obteniez soit la certification à nouveau (complexe et payant), soit une nouvelle attestation d&#039;un éditeur ou intégrateur.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pour ma propre utilisation, puis-je m&#039;auto délivré l&#039;attestation de conformité pour une version que j&#039;ai modifié moi même sur les parties d&#039;encaissements&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Uniquement un nombre très restreints d&#039;entreprise le pourront, celles qui sont dans le domaine de l&#039;&#039;&#039;&#039;Edition de logiciel de comptabilité ou de gestion ou de système de caisse&#039;&#039;&#039;. Toutefois, sur le plan juridique une telle classification n&#039;existe que par les faits. En effet, on serait tenté de penser que les entreprises ayant le codes NACE (Code NACE = terme européen du code NAF/APE) &#039;&#039;&#039;58.29&#039;&#039;&#039; qui signifie &#039;&#039;&#039;Edition de logiciel autre&#039;&#039;&#039; et/ou &#039;&#039;&#039;62.01Z&#039;&#039;&#039; qui signifie &#039;&#039;&#039;Développement de logiciels&#039;&#039;&#039; pourrait être qualifiées. Toutefois, il faut avoir en tête que le code APE est &amp;quot;&#039;&#039;attribué par l&#039;INSEE à des fins statistiques, et ne saurait suffire à créer des droits ou des obligations pour les entreprises&#039;&#039;&amp;quot; (Ceci est dans le décret qui approuve la nomenclature: décret n° 2007-1888 du 26 décembre 2007, article 5, point I). Dans la réalité, ce code est malgré tout utilisé pour avoir des présomptions d&#039;activité au niveau fiscal ou administratif. Donc, c&#039;est un avantage, mais aucunement une garantie et inversement, une entreprise n&#039;ayant pas cette classification peut avoir des arguments suffisamment solide pour démontrer son activité d&#039;&amp;quot;éditeur de logiciel de caisse&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Je suis intégrateur ou développeur informatique, je sais que Dolibarr v7 répond aux exigences de conformité, puis-je délivrer l&#039;attestation de conformité, à mon client qui est en v7, moi même ?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Oui. A vous de fournir/indiquer à votre client la version/paramétrage que vous attestez. Vous pouvez générez la signature de la version et paramétrage que vous attestez avec l&#039;outil &#039;&#039;&#039;generate_filelist_xml.php&#039;&#039;&#039; fourni avec les sources de l&#039;application.&lt;br /&gt;
Cette signature vous permettra de vérifier que votre client n&#039;a pas fait de &#039;&#039;&#039;modification de code ou paramétrage sur les parties qui concernent l&#039;encaissement&#039;&#039;&#039;. Auquel cas, il devient éditeur, et votre attestation n&#039;est plus valide, vous n&#039;êtes alors plus responsable d&#039;une apparition d&#039;une fonctionnalité non conforme dans le logiciel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Je suis intégrateur ou développeur informatique, quel outil ai-je à ma disposition pour m&#039;assurer que les exigences sur le logiciel sont bien assurées par une version installée de Dolibarr&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
La version 7.0 contient l&#039;ensemble des exigences et notamment le module &amp;quot;Log inaltérable&amp;quot; qu&#039;il vous revient d&#039;activer (l&#039;obligation d&#039;activation dépend du fait que vous êtes concerné ou non, voir FAQ précédente pour cela). L&#039;application est une application Open Source, le client utilisateur peut réussir à modifier le code (notons que ceci est aussi possible avec du propriétaire, juste plus difficile). De même, un hacker peut toujours réussir à trafiquer un logiciel. Face à cela, Dolibarr fourni, à partir de la version 6.0, un outil pour obtenir la liste de tous les fichiers qui auraient été modifiés par rapport à la version officielle, ou par rapport à une version packagée par un intégrateur tiers, ainsi que la liste des paramètres de configuration obligatoires pour la conformité (voir plus bas) et qui aurait aussi été modifiés. Le certificat étant délivré pour une version avec une configuration donnée, si un utilisateur ou hacker a pu altérer partiellement l&#039;application sur du code ou des paramètres sensibles, l&#039;outil de contrôle pourra le révéler, auquel cas, la responsabilité de non conformité n&#039;est plus du ressort de l&#039;entité qui a fournit l&#039;attestation, puisque ce n&#039;est plus la même application, mais de la responsabilité de celui qui est à l&#039;origine des modifications.&lt;br /&gt;
&lt;br /&gt;
Paramètres recommandées à contrôler/imposer dans une attestation:&lt;br /&gt;
&lt;br /&gt;
* Pays de la société (doit rester à France). Rem: Une fois le premier encaissement fait avec le module &amp;quot;Log inaltérable LF 2016&amp;quot;, sa désactivation renverra un warning.&lt;br /&gt;
* Constante MAIN_MODULE_BLOCKEDLOG doit être définie (Cela signifie que le module &amp;quot;Log inaltérable LF 2016&amp;quot; est bien actif).&lt;br /&gt;
Optionnellement, vous pouvez:&lt;br /&gt;
* Imposer que la constante BLOCKEDLOG_DISABLE_NOT_ALLOWED_FOR_COUNTRY soit définie et contient le code pays FR (ceci bloque la désactivation du module par erreur).&lt;br /&gt;
&lt;br /&gt;
Remarque:&lt;br /&gt;
Vous pouvez utiliser l&#039;outil &#039;&#039;&#039;build/generate_filecheck_xml.php&#039;&#039;&#039; pour générer un fichier emprunte de la version et/ou paramétrage donné que vous voulez imposer.&lt;br /&gt;
Ensuite utilisez l&#039;outil dans le menu &#039;&#039;&#039;Accueil - Outils administration - Dolibarr - Files integrity check&#039;&#039;&#039; ou bien à distance l&#039;API &#039;&#039;&#039;/setup/checkintegrity&#039;&#039;&#039; (le module API REST doit avoir été activée) pour vérifier qu&#039;une version est conforme à ce fichier emprunte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Je suis dans le périmètre de la loi, j&#039;ai ajouté un module externe sur mon Dolibarr, faut-il une attestation Loi Finance pour ce module ?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Il n&#039;y a pas notion de &amp;quot;certificat ou d&#039;attestation loi finance&amp;quot; sur un module:&lt;br /&gt;
&lt;br /&gt;
En effet, ce qui doit être certifié ou attesté, c&#039;est la partie du logiciel qui réalise les enregistrements des paiements, pris dans le contexte de l&#039;ensemble du système d&#039;information, et non chaque module de votre application individuellement. Le logiciel Dolibarr v7 ou + est attestable, donc, si vous êtes dans le périmètre de la loi, ce qu&#039;il vous faut obtenir, c&#039;est une attestation de conformité de l&#039;ensemble de la solution, validant les modules ajoutés qui impactent l&#039;enregistrement des paiements. Donc, &lt;br /&gt;
* Si vous êtes dans le périmètre de la loi et que le module ajouté ne concerne pas l&#039;enregistrement des paiements, il n&#039;y a rien de particulier à faire de plus (dès lors que vous êtes dans le périmètre de la loi, vous devez obtenir l&#039;attestation pour les fonctions encaissements de paiements de votre Dolibarr, peu importe que vous ajoutiez ce module ou pas, le module n&#039;ayant pas d&#039;effet sur les fonctions d&#039;encaissements, on perle d&#039;effet trivial ou mineur au code). &lt;br /&gt;
* Si toutefois, vous êtes dans le périmètre de la loi et que le module touche à la partie encaissement, il faudra que le tiers fournissant l&#039;attestation prenne en considération ce module (si vous aviez déjà obtenu l&#039;attestation, il vous faudra la ré-obtenir car l&#039;ajout du module l&#039;invalide puisque ce module touche au code de la partie encaissement des paiements).&lt;br /&gt;
&lt;br /&gt;
La nature du module doit vous permettre de savoir si c&#039;est un module qui touche à l&#039;enregistrement des encaissements ou pas. Dans le doute, renseignez vous auprès de l&#039;auteur du module (ce n&#039;est pas lui qui fournira l&#039;attestation mais pourra dire si le module doit être pris en compte ou non dans le processus d&#039;attestation).&lt;br /&gt;
&lt;br /&gt;
= Travaux dans Dolibarr pour permettre la conformité via attestation =&lt;br /&gt;
&lt;br /&gt;
Et Dolibarr dans tout cela ?&lt;br /&gt;
Dolibarr v7+ est prêt et attestable (si vous n&#039;utilisez pas le module POS). Dolibarr v10+ est prêt et attestable même pour la fonction POS. &lt;br /&gt;
Voici le suivi des travaux réalisés depuis la v5: [[Loi article 88 finances 2016 et Certification NF525 - Travaux Dolibarr]]&lt;br /&gt;
&lt;br /&gt;
= Autres ressources diverses sur le sujet =&lt;br /&gt;
&lt;br /&gt;
* Synthèse détaillée du BOFIP par La Revue Fiduciaire, rédigé le 06/10/2016:  [http://revuefiduciaire.grouperf.com/article/3661/hb/20160919173548859.html Article sur la revue fiduciaire]&lt;br /&gt;
* Synthèse courante par l&#039;APRIL (document en évolution permanente): https://pad.april.org/p/logiciel-caisse-publication-BOI&lt;br /&gt;
* Article de l&#039;APRIL: https://www.april.org/loi-de-finances-2016-une-doctrine-fiscale-qui-reconnait-les-logiciels-libres-mais-avec-une-marge-de&lt;br /&gt;
* Echanges sur les mailing-list de l&#039;April: https://listes.april.org/wws/arc/comptabilite/ (réservé aux adhérents April)&lt;br /&gt;
* Note d&#039;information très courte du service public: https://www.service-public.fr/professionnels-entreprises/actualites/A10279&lt;br /&gt;
* http://creativekara.fr/doku.php?id=pasteque:lf2016&lt;/div&gt;</summary>
		<author><name>Florian.mortgat</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=User:Florian.mortgat&amp;diff=45603</id>
		<title>User:Florian.mortgat</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=User:Florian.mortgat&amp;diff=45603"/>
		<updated>2020-01-15T09:53:36Z</updated>

		<summary type="html">&lt;p&gt;Florian.mortgat: aide-mémoire sur l’attribut &amp;quot;visible&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==== Aide-mémoire sur la valeur de l’attribut &#039;visible&#039; des champs d’objet et champs complémentaires ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Valeur&lt;br /&gt;
!Affichage sur&lt;br /&gt;
!Exclu de&lt;br /&gt;
!Note&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|&lt;br /&gt;
|toutes les pages&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|liste, fiche (en affichage, création, modification)&lt;br /&gt;
|aucune page&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|liste&lt;br /&gt;
|fiche (en affichage, création, modification)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|fiche (en affichage, création, modification)&lt;br /&gt;
|liste&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|liste, fiche (en affichage, modification)&lt;br /&gt;
|fiche en création&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| -1&lt;br /&gt;
|fiche (en affichage, création, modification)&lt;br /&gt;
|liste (par défaut)&lt;br /&gt;
|L’utilisateur peut sélectionner le champ pour affichage sur liste&lt;br /&gt;
|-&lt;br /&gt;
| -2&lt;br /&gt;
|&lt;br /&gt;
|liste (par défaut), fiche (en affichage, création, modification)&lt;br /&gt;
|L’utilisateur peut sélectionner le champ pour affichage sur liste&lt;br /&gt;
|-&lt;br /&gt;
| -3&lt;br /&gt;
|??&lt;br /&gt;
|??&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| -4&lt;br /&gt;
|fiche (en affichage, modification)&lt;br /&gt;
|fiche en création&lt;br /&gt;
liste (par défaut)&lt;br /&gt;
|L’utilisateur peut sélectionner le champ pour affichage sur liste&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Florian.mortgat</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Cr%C3%A9er_un_mod%C3%A8le_de_document_PDF&amp;diff=44693</id>
		<title>Créer un modèle de document PDF</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Cr%C3%A9er_un_mod%C3%A8le_de_document_PDF&amp;diff=44693"/>
		<updated>2019-10-31T09:25:35Z</updated>

		<summary type="html">&lt;p&gt;Florian.mortgat: /* Créer le nouveau modèle */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Do NOT edit this section&lt;br /&gt;
     Links below are automatically managed by PolyglotBot&lt;br /&gt;
     You can edit links on the English source page : Create_a_PDF_document_template --&amp;gt;&lt;br /&gt;
[[en:Create_a_PDF_document_template]]&lt;br /&gt;
[[es:Crear_un_modelo_de_documento_PDF]]&lt;br /&gt;
[[zh:创建PDF模板]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{TemplateDocDev}}&lt;br /&gt;
Ce document décrit comment créer son propre modèle de génération de document PDF afin de personnaliser ses documents (propales, factures, etc...)&lt;br /&gt;
Il se base sur les propositions commerciales comme exemple mais s&#039;applique à tout type de document.&lt;br /&gt;
&lt;br /&gt;
Pour savoir comment générer un modèle de document ODT, voir la page [[Créer un modèle de document ODT]].&lt;br /&gt;
Créer un modèle PDF requiert des connaissances en programmation PHP mais pas la création de modèles ODT. &lt;br /&gt;
&lt;br /&gt;
=Prérequis=&lt;br /&gt;
&lt;br /&gt;
*Dolibarr: 3.0+&lt;br /&gt;
*Connaissance en PHP&lt;br /&gt;
&lt;br /&gt;
=Trouver le modèle existant le plus proche=&lt;br /&gt;
Dans Dolibarr, tester les modèles existants en allant dans la configuration du module puis en consultant l&#039;aperçu en cliquant le picto &amp;quot;Aperçu&amp;quot; en fin de ligne du modèle. Consulter chacun des modèles disponibles.&lt;br /&gt;
&lt;br /&gt;
Parmi ceux existant, noter le modèle le plus proche de vos besoins. Dans cet exemple, c&#039;est le modèle azur (correspondant au fichier pdf_propale_azur.modules.php).&lt;br /&gt;
&lt;br /&gt;
Pour info, tous les modèles sont dans &#039;&#039;&#039;htdocs/core/modules&#039;&#039;&#039; puis le sous-répertoire propale pour les propositions commerciales, facture pour les factures, commandes pour les commandes, etc... et enfin &#039;&#039;&#039;doc&#039;&#039;&#039;.&lt;br /&gt;
Par exemple, un modèle personnalisé de proposition sera dans &#039;&#039;&#039;...core/modules/propale/doc/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=Créer le nouveau modèle=&lt;br /&gt;
Par sécurité, on conservera les modèles d&#039;origine. Pour l&#039;exemple, on part du principe qu&#039;on crée un nouveau module de proposition commerciale qu&#039;on nommera &#039;masocietebleu&#039; et qui s&#039;inspire du module &#039;azur&#039;:&lt;br /&gt;
&lt;br /&gt;
*Copier-coller pdf_propale_azur.modules.php&lt;br /&gt;
*Renommer la copie en pdf_propale_masocietebleu.modules.php&lt;br /&gt;
*L&#039;éditer et faire les modifs suivantes dans le code:&lt;br /&gt;
&lt;br /&gt;
#Renommer “&#039;&#039;Class pdf_propale_azur {&#039;&#039;”    en “&#039;&#039;Class pdf_propale_masocietebleu {&#039;&#039;” (important : le nom de la classe et celui du fichier doivent correspondre)&lt;br /&gt;
#Pour les anciennes versions de dolibarr (dans les nouvelles __construct($db) n&#039;a pas besoin d&#039;être renommé,)Renommer &#039;Function pdf_propale_azur($db=0)&#039; en &#039;Function pdf_propale_masocietebleu($db=0)&#039;&lt;br /&gt;
#Renommer la variable $this-&amp;gt;name pour refléter le nouveau nom. Par exemple pour le modèle &#039;azur&#039;, changer la ligne &#039;$this-&amp;gt;name = &amp;quot;azur&amp;quot;;&#039; en &#039;$this-&amp;gt;name = &amp;quot;masocietebleu&amp;quot;;&#039;.&lt;br /&gt;
#Sauvegarder : le modèle &#039;masocietebleu&#039; est disponible dans la liste des modèles de propales de Dolibarr&lt;br /&gt;
&lt;br /&gt;
*Tester ce modèle (Voir chapitre précédent) avant d&#039;aller plus loin...&lt;br /&gt;
*Ajouter dans la table llx_document_model le nouveau modéle que vous venez de créer&lt;br /&gt;
&lt;br /&gt;
=Personnaliser votre nouveau modèle=&lt;br /&gt;
Personnaliser le modèle créé.&lt;br /&gt;
Toujours dans pdf_propale_masocietebleu.modules.php, chercher la fonction &#039;Function _pagehead(&amp;amp;$pdf, $fac)&#039;. C&#039;est elle qui gère l&#039;affichage de l&#039;entête.  &lt;br /&gt;
&lt;br /&gt;
==Librairie de manipulation de PDF==&lt;br /&gt;
La librairie utilisée pour la création de documents en PDF se nomme TCPDF et peut être trouvée dans htdocs/includes/tcpdf/tcpdf.class.php. C&#039;est également dans cette classe que l&#039;on trouve les nombreuses méthodes utilisées pour générer les différents éléments des documents.&lt;br /&gt;
&lt;br /&gt;
Les modèles eux-même instancient la classe FPDF et utilisent ensuite ses méthodes, combinées avec les données d&#039;une facture, d&#039;une commande ou d&#039;autres types de données.&lt;br /&gt;
&lt;br /&gt;
On retrouve généralement les appels suivants dans les scripts de création de documents:&lt;br /&gt;
&lt;br /&gt;
*$pdf-&amp;gt;SetFont() - &#039;&#039;Désigne la fonte à utiliser pour le texte qui suivra&#039;&#039;&lt;br /&gt;
*$pdf-&amp;gt;SetXY() - &#039;&#039;Désigne le point de départ pour dessiner le prochain texte en coordonnées X,Y qui sont exprimées en millimètres de la page&#039;&#039;&lt;br /&gt;
*$pdf-&amp;gt;MultiCell() - &#039;&#039;Dessine une boîte pouvant contenir du texte, et dont on doit d&#039;abord donner la largeur et la hauteur - très utilisée&#039;&#039;&lt;br /&gt;
*$pdf-&amp;gt;GetY() - &#039;&#039;Renvoie la position courante en Y&#039;&#039;&lt;br /&gt;
*$pdf-&amp;gt;SetDrawColor() - &#039;&#039;Désigne la couleur à utiliser pour le prochain texte à écrire - généralement noir (0,0,0) ou blanc (255,255,255)&#039;&#039;&lt;br /&gt;
*$pdf-&amp;gt;Rect() - &#039;&#039;Dessine un rectangle dont le coin supérieur gauche est au point indiqué par les deux premiers paramètres et le coin inférieur droit utilise les deux derniers paramètres en mode relatif aux deux premiers&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Structure des scripts==&lt;br /&gt;
Les scripts de génération des documents PDF, au moment du développement de la version 2.2, disposent des méthodes suivantes (prenant pour exemple le modèle &amp;quot;crabe&amp;quot;) au sein de la classe du nom du modèle:&lt;br /&gt;
&lt;br /&gt;
*pdf_crabe() - &#039;&#039;Constructeur de l&#039;objet pdf&#039;&#039;&lt;br /&gt;
*write_pdf_file() - &#039;&#039;Méthode générale pour la génération du fichier. Cette méthode appelle toute les suivantes après avoir initialisé quelques variables&#039;&#039;&lt;br /&gt;
*_pagehead() - &#039;&#039;Méthode de dessin de l&#039;en-tête du document, incluant généralement le logo, le titre du document (et la date) ainsi que les cadres de l&#039;émetteur et du destinataire du document&#039;&#039;&lt;br /&gt;
*_tableau() - &#039;&#039;Méthode de dessin du tableau de détails (produits, services, etc)&#039;&#039;&lt;br /&gt;
*_tableau_info() - &#039;&#039;Méthode de dessin du tableau reprenant une liste d&#039;informations sur la facture&#039;&#039;&lt;br /&gt;
*_tableau_tot() - &#039;&#039;Méthode de dessin du tableau des totaux&#039;&#039;&lt;br /&gt;
*_tableau_versement() - &#039;&#039;Méthode de dessin du tableau des règles de versement&#039;&#039;&lt;br /&gt;
*_pagefoot() - &#039;&#039;Méthode de dessin du pied de page&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Example de personnalisation==     &lt;br /&gt;
===Insertion d&#039;un logo===&lt;br /&gt;
&lt;br /&gt;
*Ajouter l&#039;instruction:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$pdf-&amp;gt;Image(&#039;\www\htdocs\dolibarr\document\societe\logo.jpg&#039;, 10, 5, 60.00);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Avec dans l&#039;exemple: 10=abscisse, 5=ordonnée, 60=largeur logo&lt;br /&gt;
&lt;br /&gt;
*Si le logo se trouve par dessous ou dessus du text existant, supprimer le texte existant en commentant le code qui affiche l&#039;information ou en modifiant sa position.&lt;br /&gt;
&lt;br /&gt;
===Insertion d&#039;une signature ou autre en bas de page facture===&lt;br /&gt;
&lt;br /&gt;
*ouvrir le modèle à modifier crabe ou oursin (dans htdocs/core/modules/facture/)&lt;br /&gt;
*insérer (pour ma part ligne 618 juste avant // Show payment mode CHQ)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$pdf-&amp;gt;Image(&#039;http://localhost/dolibarr/doc/images/signature.jpg&#039;,120,250,74);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
l&#039;image (largeur 74mm) est affichée colonne de droite juste avant le pied de page.&lt;br /&gt;
&lt;br /&gt;
*copier l&#039;image dans le répertoire. il semble qu&#039;une image png avec transparence pose problème.&lt;br /&gt;
*générer le pdf, la signature apparaît.&lt;br /&gt;
&lt;br /&gt;
===Insertion de texte===&lt;br /&gt;
Principales fonctions utilisées&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$pdf-&amp;gt;setX(float a); // fixe la position x courante&lt;br /&gt;
$pdf-&amp;gt;setY(float b); // fixe la position y courante&lt;br /&gt;
$pdf-&amp;gt;setXY(float a,float b); // fixe les positions x et y courantes&lt;br /&gt;
$pdf-&amp;gt;SetTextColor(0,0,200); // fixe la couleur du texte&lt;br /&gt;
$pdf-&amp;gt;SetFont(&#039;Arial&#039;,&#039;B&#039;,14); // fixe la police, le type ( &#039;B&#039; pour gras, &#039;I&#039; pour italique, &#039;&#039; pour normal,...)&lt;br /&gt;
$pdf-&amp;gt;MultiCell(60, 8, &#039;Mon texte&amp;quot;, 0, &#039;L&#039;); // imprime &#039;Mon texte&#039; avec saut de ligne&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Rappel: l&#039;origine des fonctions setXY est le coin supérieur gauche de la page&lt;br /&gt;
&lt;br /&gt;
==Pour plus d&#039;infos==&lt;br /&gt;
&lt;br /&gt;
*http://www.fpdf.org/?lang=fr&lt;br /&gt;
*Liste des méthodes: tcpdf.org/doc/code/classTCPDF.html&lt;br /&gt;
&lt;br /&gt;
=Activer son modèle dans Dolibarr=&lt;br /&gt;
Dans la fonction d&#039;initialisation du module ajoutez votre modèle:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
sql=array(&amp;quot;INSERT INTO &amp;quot;.MAIN_DB_PREFIX.&amp;quot;document_model (nom, type, entity) VALUES(&amp;quot;.$MODELNAME.&amp;quot;,&amp;quot;.$MODEL_TARGET_MODULE.&amp;quot;,&amp;quot;.$conf-&amp;gt;entity.&amp;quot; )&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
avant&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt; return $this-&amp;gt;_init($sql,$option);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis&lt;br /&gt;
&lt;br /&gt;
Dans Accueil =&amp;gt; Configuration =&amp;gt; Modules =&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*activer votre module qui doit apparaitre&lt;br /&gt;
*éventuellement le mettre en modèle proposé par défaut.&lt;/div&gt;</summary>
		<author><name>Florian.mortgat</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Objets_m%C3%A9tiers&amp;diff=43034</id>
		<title>Objets métiers</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Objets_m%C3%A9tiers&amp;diff=43034"/>
		<updated>2019-07-26T09:47:29Z</updated>

		<summary type="html">&lt;p&gt;Florian.mortgat: /* Lien entre Objets métiers */ Exemple mis à jour pour les versions plus récentes de Dolibarr où load_object_linked est remplacé par fetchObjectLinked&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Do NOT edit this section&lt;br /&gt;
     Links below are automatically managed by PolyglotBot&lt;br /&gt;
     You can edit links on the English source page : Business_Objects --&amp;gt;&lt;br /&gt;
[[en:Business_Objects]]&lt;br /&gt;
[[es:Objetos_de_negociado]]&lt;br /&gt;
[[zh:业务对象]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{TemplateDocDev}}&lt;br /&gt;
&lt;br /&gt;
= Objets métiers =&lt;br /&gt;
Tous les objets métiers sont définis par une classe PHP qui hérite de la classe CommonObject (définie dans le fichier commonobject.class.php).&lt;br /&gt;
&lt;br /&gt;
Pour trouver la classe qui correspond à l&#039;objet métier qui vous interessent, parcourez l&#039;arborescence de fichiers de Dolibarr à la recherche des fichier  &#039;&#039;&#039;*/class/*.class.php&#039;&#039;&#039;. En effet, toutes les classes se trouvent dans un sous répertoire class d&#039;un répertoire en rapport avec l&#039;objet.&lt;br /&gt;
Par exemple:&lt;br /&gt;
* htdocs/societe/class/societe.class.php  pour les tiers&lt;br /&gt;
* htdocs/compta/facture/class/facture.class.php  pour les factures clients&lt;br /&gt;
* htdocs/fourn/class/fournisseur.facture.class.php  pour les factures fournisseurs&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
Chaque classe métier possède les 4 méthodes CRUD à utiliser pour réaliser vos lectures ou mises à jours en base:&lt;br /&gt;
* Créer (C pour Create): Utiliser la méthode create()&lt;br /&gt;
* Lire (R pour Read): Utiliser la méthode fetch()&lt;br /&gt;
* Modifier (U pour Update): Utiliser la méthode update()&lt;br /&gt;
* Supprimer (D pour Delete): Utiliser la méthode delete()&lt;br /&gt;
&lt;br /&gt;
Voir exemples plus bas...&lt;br /&gt;
&lt;br /&gt;
= Lien entre Objets métiers =&lt;br /&gt;
Certains objets métiers sont liés les uns aux autres. Ceci est fait dans Dolibarr via la [[Table llx_element_element]]. Mais vous n&#039;avez pas à lire cette table pour récupérer les objets liés à un autre.&lt;br /&gt;
Voici la portion de code qui montre comment faire cela:&lt;br /&gt;
&lt;br /&gt;
Dolibarr 3.1 et versions ultérieures :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$commande = new Commande($db);&lt;br /&gt;
$commande-&amp;gt;fetch($commande_id);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// on veut récupérer des factures à partir d’une commande dont on connaît l’ID&lt;br /&gt;
$result = $commande-&amp;gt;fetchObjectLinked($commande-&amp;gt;id, &#039;commande&#039;, null, &#039;facture&#039;);&lt;br /&gt;
if ($result &amp;lt;= 0) {&lt;br /&gt;
    // erreur&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// important : les tableaux créés sont associatifs : leurs clés sont des rowid de llx_element_element.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// FAUX (renverra NULL): &lt;br /&gt;
$facture_id = $commande-&amp;gt;linkedObjectsIds[&#039;facture&#039;][0]&lt;br /&gt;
&lt;br /&gt;
// CORRECT:&lt;br /&gt;
$facture_id = array_values($commande-&amp;gt;linkedObjectsIds[&#039;facture&#039;])[0]&lt;br /&gt;
&lt;br /&gt;
// MIEUX (permet de gérer le cas où il y aurait plus d’une facture) :&lt;br /&gt;
foreach ($commande-&amp;gt;linkedObjectsIds[&#039;facture&#039;] as $element_element_id =&amp;gt; $facture_id) {&lt;br /&gt;
    // ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Avant Dolibarr 3.1 :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// This load the array linked_object with objects that link to this one&lt;br /&gt;
$object-&amp;gt;load_object_linked($object-&amp;gt;id, $object-&amp;gt;element);&lt;br /&gt;
// To load array linked_object with objects that are linked by this one&lt;br /&gt;
$object-&amp;gt;load_object_linked($object-&amp;gt;id, $object-&amp;gt;element);&lt;br /&gt;
&lt;br /&gt;
// Then choose id with objects type you need&lt;br /&gt;
$org_order_array = $object-&amp;gt;linked_object[&amp;quot;commande&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
// Now use them&lt;br /&gt;
$thelinkedobjectid = $org_order_array[0];&lt;br /&gt;
// new order instance&lt;br /&gt;
$thelinkedobject = new Commande($object-&amp;gt;db);&lt;br /&gt;
// load the object&lt;br /&gt;
$thelinkedobject-&amp;gt;fetch($thelinkedobjectid);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exemples =&lt;br /&gt;
== Exemple pour la création d&#039;un tiers ==&lt;br /&gt;
&lt;br /&gt;
Voici un exemple pour la création d&#039;un tiers (société client par exemple):&lt;br /&gt;
&lt;br /&gt;
Si on est dans le cas d&#039;un script nouveau ou externe à Dolibarr, il est nécessaire de faire au début de son code, avant toute chose&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
include(&#039;/pathofdolibarrhtdocs/master.inc.php&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
pour que l&#039;environnement Dolibarr (objets $conf, $db, $lang et $user) soit créé. Si on veut que les actions (creation, mise à jour), soit associées dans le suivi à un utilisateur particulier, il est nécessaire de faire après l&#039;include du master.inc.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$user-&amp;gt;fetch(0,&#039;loginuser&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, on peut manipuler nos actions métiers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// On declare la classe que l&#039;on va manipuler&lt;br /&gt;
include_once(&#039;/pathofdolibarrhtdocs/societe/class/societe.class.php&#039;);&lt;br /&gt;
 &lt;br /&gt;
// On cree une instance de l&#039;objet à manipuler&lt;br /&gt;
$mycompany = new Societe($db);&lt;br /&gt;
 &lt;br /&gt;
// On renseigne ces caractéristiques&lt;br /&gt;
$mycompany-&amp;gt;nom=&#039;Big Brother&#039;;&lt;br /&gt;
$mycompany-&amp;gt;client=1;&lt;br /&gt;
 &lt;br /&gt;
// Si on veut que l&#039;action de création soit associé a un utilisateur &#039;loginuser&#039; particulier,&lt;br /&gt;
// il faut decommenter cette ligne pour charger les caractéristiques de cet utilisateur.&lt;br /&gt;
// Si on laisse commenté, Dolibarr mettra null dans les champs du user de création ou mise à jour.&lt;br /&gt;
// $user-&amp;gt;fetch(&#039;loginuser&#039;);&lt;br /&gt;
 &lt;br /&gt;
// On invoque la creation&lt;br /&gt;
$id=$mycompany-&amp;gt;create($user);&lt;br /&gt;
 &lt;br /&gt;
// Pour relire l&#039;objet&lt;br /&gt;
$mycompany-&amp;gt;fetch($id);&lt;br /&gt;
 &lt;br /&gt;
// Pour le mettre à jour&lt;br /&gt;
$mycompany-&amp;gt;nom=&#039;Big Brother 2&#039;&lt;br /&gt;
$mycompany-&amp;gt;update($user);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Autres exemples ==&lt;br /&gt;
Vous trouverez d&#039;autres exemples de manipulation d&#039;objet Dolibarr (Création, Lecture, Modification, Suppression) dans le répertoire dev/samples du snapshot de Dolibarr.&lt;/div&gt;</summary>
		<author><name>Florian.mortgat</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Business_Objects&amp;diff=43033</id>
		<title>Business Objects</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Business_Objects&amp;diff=43033"/>
		<updated>2019-07-26T09:43:46Z</updated>

		<summary type="html">&lt;p&gt;Florian.mortgat: /* Link between Business objects */  updated for Dolibarr 3.1 &amp;amp; higher&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN origin interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- You can edit this section but do NOT remove these comments&lt;br /&gt;
     Links below will be automatically replicated on translated pages by PolyglotBot --&amp;gt;&lt;br /&gt;
[[fr:Objets_métiers]]&lt;br /&gt;
[[es:Objetos_de_negociado]]&lt;br /&gt;
[[zh:业务对象]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{TemplateDocDevEn}}&lt;br /&gt;
= Business objects =&lt;br /&gt;
All business objects are defined by a PHP class that inherits the class CommonObject (defined in file commonobject.class.php).&lt;br /&gt;
Every business object has the 4 CRUD methods you can use to read or save into database:&lt;br /&gt;
* Create: create()&lt;br /&gt;
* Read: fetch()&lt;br /&gt;
* Update: update()&lt;br /&gt;
* Delete: delete()&lt;br /&gt;
&lt;br /&gt;
See examples later...&lt;br /&gt;
&lt;br /&gt;
= Link between Business objects =&lt;br /&gt;
Some business objects are linked to other business objects. This is done in Dolibarr using the [[Table llx_element_element]]. But you don&#039;t have to read this table to get objects linked to another.&lt;br /&gt;
&lt;br /&gt;
Here is how you can use this (Dolibarr 3.1 and higher):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// get invoices from an already loaded order:&lt;br /&gt;
$result = $order-&amp;gt;fetchObjectLinked($order-&amp;gt;id, &#039;commande&#039;, null, &#039;facture&#039;);&lt;br /&gt;
if ($result &amp;lt;= 0) {&lt;br /&gt;
    // handle error&lt;br /&gt;
}&lt;br /&gt;
// important notice : the newly populated arrays are associative. Keys are llx_element_element row ids.&lt;br /&gt;
&lt;br /&gt;
// now if we expect only one linked invoice:&lt;br /&gt;
&lt;br /&gt;
// WRONG way to get it ($invoice_id will be NULL): &lt;br /&gt;
$invoice_id = $order-&amp;gt;linkedObjectsIds[&#039;facture&#039;][0]&lt;br /&gt;
&lt;br /&gt;
// CORRECT way ($invoice_id will hold the ID):&lt;br /&gt;
$invoice_id = array_values($order-&amp;gt;linkedObjectsIds[&#039;facture&#039;])[0]&lt;br /&gt;
&lt;br /&gt;
// Better (if there are more than one linked invoices) :&lt;br /&gt;
foreach ($order-&amp;gt;linkedObjectsIds[&#039;facture&#039;] as $element_element_id =&amp;gt; $facture_id) {&lt;br /&gt;
    // process it&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Prior to Dolibarr &amp;lt; 3.1:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// This load the array linked_object with objects that link to this one&lt;br /&gt;
$object-&amp;gt;load_object_linked($object-&amp;gt;id, $object-&amp;gt;element);&lt;br /&gt;
// To load array linked_object with objects that are linked by this one&lt;br /&gt;
$object-&amp;gt;load_object_linked($object-&amp;gt;id, $object-&amp;gt;element);&lt;br /&gt;
&lt;br /&gt;
// Then choose id with objects type you need&lt;br /&gt;
$org_order_array = $object-&amp;gt;linked_object[&amp;quot;commande&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
// Now use them&lt;br /&gt;
$thelinkedobjectid = $org_order_array[0];&lt;br /&gt;
// new order instance&lt;br /&gt;
$thelinkedobject = new Commande($object-&amp;gt;db);&lt;br /&gt;
// load the object&lt;br /&gt;
$thelinkedobject-&amp;gt;fetch($thelinkedobjectid);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Examples =&lt;br /&gt;
&lt;br /&gt;
== Example for a third party ==&lt;br /&gt;
Here is an example for the creation of a third party (eg customer company):&lt;br /&gt;
&lt;br /&gt;
If we make a new script or an external script, we must add at the beginning, before making anything else:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
include(&#039;/pathofdolibarrhtdocs/master.inc.php&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
This will initialize Dolibarr environment objects ($conf, $db, $lang and $user).&lt;br /&gt;
If we want that actions (create, update) are tagged with a particular user as the create/update user, we must do after the include of master.inc.php and before calling any create or update method&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$user-&amp;gt;fetch(0,&#039;loginuser&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now we can make our business code.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// We declare the class we want to use&lt;br /&gt;
include_once(&#039;/pathofdolibarrhtdocs/societe/class/societe.class.php&#039;);&lt;br /&gt;
&lt;br /&gt;
// We create an instance of object to manipulate&lt;br /&gt;
$mycompany = new Societe($db);&lt;br /&gt;
&lt;br /&gt;
// We set properties on object&lt;br /&gt;
$mycompany-&amp;gt;nom=&#039;Big Brother&#039;;&lt;br /&gt;
$mycompany-&amp;gt;client=1;&lt;br /&gt;
&lt;br /&gt;
// If we want that creation is tagged as done by a particular user &#039;loginuser&#039;,&lt;br /&gt;
// you must uncomment this line to load all characteristics of this user.&lt;br /&gt;
// If we keep the comment, Dolibarr will use null into fields that should store the create or update user.&lt;br /&gt;
// $user-&amp;gt;fetch(&#039;loginuser&#039;);&lt;br /&gt;
&lt;br /&gt;
// We call method to create&lt;br /&gt;
$id=$mycompany-&amp;gt;create($user);&lt;br /&gt;
&lt;br /&gt;
// This is to read/load an already created object&lt;br /&gt;
$mycompany-&amp;gt;fetch($id);&lt;br /&gt;
&lt;br /&gt;
// To update object&lt;br /&gt;
$mycompany-&amp;gt;nom=&#039;Big Brother 2&#039;;&lt;br /&gt;
$mycompany-&amp;gt;update($user);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Other examples ==&lt;br /&gt;
You may find other example for manipulating Dolibarr objects (Create, Read, Update, Delete) into directory &#039;&#039;&#039;dev/samples&#039;&#039;&#039; of Dolibarr snapshot.&lt;/div&gt;</summary>
		<author><name>Florian.mortgat</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Module_Comptabilit%C3%A9_en_Partie_Double&amp;diff=42915</id>
		<title>Module Comptabilité en Partie Double</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Module_Comptabilit%C3%A9_en_Partie_Double&amp;diff=42915"/>
		<updated>2019-07-24T08:37:47Z</updated>

		<summary type="html">&lt;p&gt;Florian.mortgat: Coquille (expert -&amp;gt; export)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Do NOT edit this section&lt;br /&gt;
     Links below are automatically managed by PolyglotBot&lt;br /&gt;
     You can edit links on the English source page : Module_Accounting_Advanced --&amp;gt;&lt;br /&gt;
[[en:Module_Accounting_Advanced]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Compta]]&lt;br /&gt;
{{TemplateDocUtil}}&lt;br /&gt;
{{TemplateModFR}}&lt;br /&gt;
{{BasculeDevUser|&lt;br /&gt;
nom=Comptabilité Avancée|&lt;br /&gt;
num=50400| &lt;br /&gt;
devdoc=[[Module Comptabilité Avancée (développeur)]]|&lt;br /&gt;
userdoc=Cette page|}}&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
Ce module offre des fonctions comptables plus évolués que le module comptabilité et permet de générer des écritures comptables.&lt;br /&gt;
&lt;br /&gt;
= Installation =&lt;br /&gt;
{{NoInstallModuleFr}}&lt;br /&gt;
&lt;br /&gt;
= Configuration =&lt;br /&gt;
{{ActivationModuleFr}}&lt;br /&gt;
&lt;br /&gt;
= Cycle de vie / Règles de gestion =&lt;br /&gt;
&lt;br /&gt;
L&#039;utilisation du module de comptabilité se fait en plusieurs étapes:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
Les actions suivantes sont habituellement exécutées une seule fois, ou une fois par an ...&lt;br /&gt;
&lt;br /&gt;
 Etape 1: Créer un modèle de plan de compte depuis le menu Compta/Tréso-Comptabilité-Configuration-Modèle de plan de compte&lt;br /&gt;
&lt;br /&gt;
 Etape 2: Créer ou vérifier le contenu de votre plan de compte depuis le menu Compta/Tréso-Comptabilité-Configuration-Plan comptable&lt;br /&gt;
&lt;br /&gt;
Les prochaines étapes doivent être faites pour vous faire gagner du temps à l&#039;avenir en vous proposant le bon compte comptable par défaut lors de la journalisation (écrire des enregistrements dans les journaux et Grand Livre)&lt;br /&gt;
&lt;br /&gt;
 Etape 3: Vérifier que la liaison par défaut entre les lignes de transactions diverses et le compte comptable est faite. Compléter les liaisons manquantes. Pour cela, vous pouvez utiliser l&#039;entrée de menu Compta/Tréso-Comptabilité-Configuration-Comptes par défaut.&lt;br /&gt;
&lt;br /&gt;
 Etape 4: Vérifiez que la liaison entre le paiement de la TVA et le compte comptable est faite. Compléter les liaisons manquantes. Vous pouvez définir les comptes comptables à utiliser pour chaque taux de TVA sur la page Compta/Tréso-Comptabilité-Configuration-Compte TVA.&lt;br /&gt;
&lt;br /&gt;
 Etape 5: Vérifier que la liaison entre les dépenses spéciales (cotisations sociales ou fiscales) et le compte comptable est faite. Compléter les liaisons manquantes. Pour cela, vous pouvez utiliser l&#039;entrée de menu Compta/Tréso-Comptabilité-Configuration-Comptes charges.&lt;br /&gt;
&lt;br /&gt;
 Etape 6: Vérifiez que la liaison entre le type de notes de frais et le compte comptable est faite. Compléter les liaisons manquantes. Vous pouvez définir les comptes comptables à utiliser pour chaque type de ligne de note de frais sur la page Compta/Tréso-Comptabilité-Configuration-Comptes notes de frais.&lt;br /&gt;
&lt;br /&gt;
 Etape 7: Vérifier que la liaison entre les paiements de prêts et les comptes comptables est faite. Compléter les liaisons manquantes. Pour cela, vous pouvez utiliser l&#039;entrée de menu Compta/Tréso-Dépenses spéciales-Emprunts ou Compta/Tréso-Comptabilité-Configuration-Comptes par défaut.&lt;br /&gt;
&lt;br /&gt;
 Etape 8: Vérifier que la liaison entre les comptes bancaires et le compte comptable est faite. Compléter les liaisons manquantes. Pour cela, rendez-vous sur la fiche de chaque compte financier. Vous pouvez commencer à partir de la page Accueil-Banques/Caisses.&lt;br /&gt;
&lt;br /&gt;
 Etape 9: Vérifier que la liaison entre les produits/services et le compte comptable est faite. Compléter les liaisons manquantes. Pour cela, vous pouvez utiliser l&#039;entrée de menu Compta/Tréso-Comptabilité-Configuration-Comptes produits.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
Les actions suivantes sont habituellement exécutées chaque mois, semaine, ou jour pour les très grandes entreprises ...&lt;br /&gt;
&lt;br /&gt;
 Etape 1: Vérifier que la liaison entre les lignes de factures client existantes et le compte comptable est faite. Compléter les liaisons manquantes. Pour cela, vous pouvez utiliser l&#039;entrée de menu Compta/Tréso-Comptabilité-Liaison factures client.&lt;br /&gt;
&lt;br /&gt;
 Etape 2: Vérifier que la liaison entre les lignes de factures fournisseurs existantes et le compte comptable est faite. Compléter les liaisons manquantes. Pour cela, vous pouvez utiliser l&#039;entrée de menu Compta/Tréso-Comptabilité-Liaison factures fournisseur.&lt;br /&gt;
&lt;br /&gt;
 Etape 3: Vérifiez que la liaison entre le type de notes de frais et le compte comptable est faite. Compléter les liaisons manquantes. Vous pouvez définir les comptes comptables à utiliser pour chaque type de ligne de note de frais sur la page Compta/Tréso-Comptabilité-Liaison notes de frais.&lt;br /&gt;
&lt;br /&gt;
 Etape 4: Ecrire les transactions dans le Grand Livre. Pour cela, aller sur chaque Journal, et cliquer sur le bouton &amp;quot;Enregistrer les opérations dans le Grand Livre&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
 Etape 5: Ajouter ou modifier les opérations existantes et générer des rapports et des exportations.&lt;br /&gt;
&lt;br /&gt;
= Plan comptable =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Exports =&lt;br /&gt;
&lt;br /&gt;
Voici un exemple des formats d&#039;export disponibles.  L&#039;export se fait depuis le grand livre:&lt;br /&gt;
&lt;br /&gt;
{{AccountingExpertExportExamples}}&lt;/div&gt;</summary>
		<author><name>Florian.mortgat</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Syst%C3%A8me_de_Hooks&amp;diff=41859</id>
		<title>Système de Hooks</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Syst%C3%A8me_de_Hooks&amp;diff=41859"/>
		<updated>2019-07-10T09:31:11Z</updated>

		<summary type="html">&lt;p&gt;Florian.mortgat: spelling&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TemplateDocDevFr}}&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
Les Hooks sont une fonctionnalité pour les développeurs, disponible à partir de Dolibarr 3.2, leur permettant d&#039;ajouter du code personnalisé aux pages standards de Dolibarr sans avoir à modifier les fichiers du coeur de Dolibarr. Contrairement aux [[triggers]] (autre manière d&#039;interagir avec le code de Dolibarr) qui sont liés aux événements de Dolibarr, les Hooks peuvent s&#039;exécuter n&#039;importe ou et à n&#039;importe quel moment dès lors qu&#039;ils ont été prévu dans le core de Dolibarr. Ce sont des points d&#039;insertion dans le programme.&lt;br /&gt;
* Les Hooks sont actifs ou pas selon un contexte (souvent un contexte par module : par exemple &amp;quot;productcard&amp;quot; pour les produits, &amp;quot;invoicecard&amp;quot; pour les factures...). Pour trouver les Hooks existants faites une recherche pour &amp;quot;&#039;&#039;&#039;initHooks(&#039;&#039;&#039;&amp;quot;&lt;br /&gt;
* Les Hooks sont des fonctions qui s&#039;insèrent dans ou remplacent le code standard. Pour rechercher le code qu&#039;il est possible de surcharger faites une recherche pour &amp;quot;&#039;&#039;&#039;executeHooks(&#039;&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= Ajouter un hook pour permettre l&#039;insertion de code =&lt;br /&gt;
Pour implémenter un hook dans votre propre module (afin que votre module puisse être &amp;quot;hooké&amp;quot; par d&#039;autres), vous devrez procéder à 2 étapes.&lt;br /&gt;
&lt;br /&gt;
Ces étapes doivent êtres reproduites pour chaque script php de votre module où vous voulez implémenter des hooks.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1- Initialiser l&#039;object HookManager (placez ce bout de code au début de votre script php, juste après ou avant les includes):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Initialize technical object to manage hooks of thirdparties. Note that conf-&amp;gt;hooks_modules contains array array&lt;br /&gt;
include_once(DOL_DOCUMENT_ROOT.&#039;/core/class/hookmanager.class.php&#039;);&lt;br /&gt;
$hookmanager=new HookManager($db);&lt;br /&gt;
$hookmanager-&amp;gt;initHooks(array(&#039;context&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$hookmanager-&amp;gt;initHooks() accepte 1 paramètre (un array de contextes) et active la prise en charge des hooks pour ce script:&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;&#039;context&#039;&#039;&#039;&#039; est la chaine qui contient le contexte d&#039;exécution. C&#039;est un simple indicateur qui peut être utilisé par les fonctions de hook pour détecter dans quel cas elles sont appelées (plusieurs pages/modules peuvent appeler le même hook à différent endroit, et une fonction de hook peut ne vouloir s&#039;exécuter que pour un contexte donné et pas les autres).&lt;br /&gt;
&lt;br /&gt;
Note: Vous pouvez positionner plusieurs contextes en même temps (par exemple si vous avez besoin d&#039;avoir un context commun à plusieurs pages mais que vous voulez aussi un context propre à une page donnée).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2- Placer ensuite l&#039;appel des hooks la où permettre l&#039;ajout de code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$parameters=array();&lt;br /&gt;
$reshook=$hookmanager-&amp;gt;executeHooks(&#039;hookname&#039;,$parameters,$object,$action); // See description below&lt;br /&gt;
// Note that $action and $object may have been modified by hook&lt;br /&gt;
if (empty($reshook))&lt;br /&gt;
{&lt;br /&gt;
   ... // standard code that can be disabled/replaced by hook if return code &amp;gt; 0.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;$hookmanager-&amp;gt;executeHooks()&#039;&#039;&#039; accepte 4 paramètres et ajoute un hook (qui est un point d&#039;entrée dans votre script pour des fonctions externes à votre script et module):&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;&#039;hookname&#039;&#039;&#039;&#039; est le nom de la méthode qui sera appelée. Par exemple: &#039;formObjectOptions&#039;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;$parameters&#039;&#039;&#039; est un tableau personnalisé pour transmettre plus de données personnalisées au hook (la fonction dans le hook peut traiter ces données). Placez ici ce que vous voulez, ce peut être un fichier, un tableau de chaînes de caractères, n&#039;importe quoi... Par exemple :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$parameters=array(&#039;file&#039;=&amp;gt;&#039;my/path/to/a/file&#039;, &#039;customnames&#039;=&amp;gt;array(&#039;henry&#039;,&#039;david&#039;,&#039;john&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;$object&#039;&#039;&#039; est l&#039;objet que vous voulez passer à la fonction du hook, certainement les données du module courant (ex: l&#039;objet facture si on est dans un module de facture, etc..). Ce peut être ce que vous voulez, mais souvenez vous qu&#039;il sera le principal composant utilisé par les fonctions du hook.&lt;br /&gt;
&lt;br /&gt;
- &#039;&#039;&#039;$action&#039;&#039;&#039; est une chaîne indiquant l&#039;action courante (peut être null ou quelque chose qui ressemble à &#039;create&#039; ou &#039;edit&#039;).&lt;br /&gt;
&lt;br /&gt;
Note: Vous devrez refaire cette étape plusieurs fois si vous voulez ajouter plusieurs hooks à différent endroits de votre script.&lt;br /&gt;
&lt;br /&gt;
Maintenant votre module devrait pouvoir être hooké, vous pouvez suivre la procédure ci-dessous dans &#039;&#039;&#039;Implémenter un hook&#039;&#039;&#039; pour implémenter une fonction hook qui en prendra avantage (permet aussi de tester que cela fonctionne).&lt;br /&gt;
&lt;br /&gt;
= Implémenter un Hook =&lt;br /&gt;
Pour utiliser un Hook (donc ajouter ou surcharger une partie de code), vous devez d&#039;abord avoir défini un descripteur de module (voir [[Développement_module#Créer_un_descripteur_de_Module_(obligatoire)]] pour cela). Ensuite vous devez suivre les étapes suivantes :&lt;br /&gt;
&lt;br /&gt;
1. Ajouter votre module au contexte où le hook doit s&#039;exécuter. &lt;br /&gt;
Ce qui veut dire que lorsqu&#039;on se trouve dans le contexte donné, votre code sera appelé. &lt;br /&gt;
Pour cela, éditer le descripteur de votre module (&#039;&#039;&#039;/htdocs/&#039;&#039;yourmodulename&#039;&#039;/core/modules/mod&#039;&#039;YourModuleName&#039;&#039;.class.php&#039;&#039;&#039;) et renseignez la variable &#039;&#039;&#039;$this-&amp;gt;module_parts&#039;&#039;&#039; comme sur l&#039;exemple :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;module_parts = array(&lt;br /&gt;
&#039;hooks&#039; =&amp;gt; array(&#039;hookcontext1&#039;,&#039;hookcontext2&#039;)  // Set here all hooks context you want to support&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: il est possible de trouver le contexte d&#039;un module en rajoutant &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
print(&#039;Module context: &#039;.$object-&amp;gt;context);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
(rajoutez ce bout de code dans le fichier php où réside l&#039;appel des hooks, et supprimez le, une fois la valeur du context relevée).&lt;br /&gt;
&lt;br /&gt;
[[File:warning.png]] Attention: N&#039;oubliez pas de désactiver puis de réactiver votre module dans l&#039;interface d&#039;administration des modules afin que la modification soit prise en compte car la sauvegarde des couples &amp;quot;modules-hooks&amp;quot; qui doit être gérée est faite en base, laquelle n&#039;est mise à jour qu&#039;au moment de l&#039;activation du module.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Pour remplacer une fonction existante par la votre (surcharge)&lt;br /&gt;
&lt;br /&gt;
Créez &#039;&#039;&#039;/htdocs/&#039;&#039;yourmodulename&#039;&#039;/class/actions_&#039;&#039;yourmodulename&#039;&#039;.class.php&#039;&#039;&#039; dans votre module avec un code qui contient la méthode appelée par le hook (le nom de cette méthode se voit au moment de l&#039;appel executeHooks). Voici un exemple:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class ActionsYourModuleName &lt;br /&gt;
{ &lt;br /&gt;
	/**&lt;br /&gt;
	 * Overloading the doActions function : replacing the parent&#039;s function with the one below&lt;br /&gt;
	 *&lt;br /&gt;
	 * @param   array()         $parameters     Hook metadatas (context, etc...)&lt;br /&gt;
	 * @param   CommonObject    &amp;amp;$object        The object to process (an invoice if you are in invoice module, a propale in propale&#039;s module, etc...)&lt;br /&gt;
	 * @param   string          &amp;amp;$action        Current action (if set). Generally create or edit or null&lt;br /&gt;
	 * @param   HookManager     $hookmanager    Hook manager propagated to allow calling another hook&lt;br /&gt;
	 * @return  int                             &amp;lt; 0 on error, 0 on success, 1 to replace standard code&lt;br /&gt;
	 */&lt;br /&gt;
	function doActions($parameters, &amp;amp;$object, &amp;amp;$action, $hookmanager)&lt;br /&gt;
	{&lt;br /&gt;
		$error = 0; // Error counter&lt;br /&gt;
		$myvalue = &#039;test&#039;; // A result value&lt;br /&gt;
&lt;br /&gt;
		print_r($parameters);&lt;br /&gt;
		echo &amp;quot;action: &amp;quot; . $action;&lt;br /&gt;
		print_r($object);&lt;br /&gt;
&lt;br /&gt;
		if (in_array(&#039;somecontext&#039;, explode(&#039;:&#039;, $parameters[&#039;context&#039;])))&lt;br /&gt;
		{&lt;br /&gt;
		  // do something only for the context &#039;somecontext&#039;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if (! $error)&lt;br /&gt;
		{&lt;br /&gt;
			$this-&amp;gt;results = array(&#039;myreturn&#039; =&amp;gt; $myvalue);&lt;br /&gt;
			$this-&amp;gt;resprints = &#039;A text to show&#039;;&lt;br /&gt;
			return 0; // or return 1 to replace standard code&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			$this-&amp;gt;errors[] = &#039;Error message&#039;;&lt;br /&gt;
			return -1;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La méthode sera alors automatiquement appelée au moment de l&#039;appel du code qui contient le executeHooks fournissant à votre code les éléments $parameters, $object et $action.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Avec&#039;&#039;&#039;:&lt;br /&gt;
* &#039;&#039;&#039;$parameters&#039;&#039;&#039; est un tableau (array) de meta-data regroupant les données du hook (son contexte accessible par $parameters[&#039;context&#039;] mais d&#039;autres information peuvent etre disponible selon le cas)&lt;br /&gt;
* &#039;&#039;&#039;$object&#039;&#039;&#039; est l&#039;objet sur lequel vous désirez travailler (par exemple : product pour le contexte productcard) &lt;br /&gt;
* &#039;&#039;&#039;$action&#039;&#039;&#039; désigne l&#039;action à exécuter (par exemple &amp;quot;create&amp;quot;, &amp;quot;edit&amp;quot; or &amp;quot;view&amp;quot;).&lt;br /&gt;
* &#039;&#039;&#039;$hookmanager&#039;&#039;&#039; n&#039;est propagé que pour permettre à votre hook d&#039;appeler d&#039;autres hooks.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retours&#039;&#039;&#039;:&lt;br /&gt;
* Le code retour d&#039;un hook doit 0 ou 1 en cas de succès, négatif en cas d&#039;erreur. En général, il sera 0. Il peut être 1, ce qui dans certains cas signifie que ce que fait votre hook remplace complètement ce que devait faire Dolibarr juste après l&#039;appel du hook. Si le code est négatif, il est possible de fournir un message d&#039;erreur à l&#039;utilisateur en positionnant $this-&amp;gt;errors[]=&#039;Message erreur&#039;&lt;br /&gt;
* Si la méthode positionne la propriété $this-&amp;gt;results avec un tableau, alors le tableau $hookmanager-&amp;gt;resArray sera automatiquement enrichi avec le contenu de ce tableau, lequel pourra être réutilisé plus tard.&lt;br /&gt;
* Si la méthode positionne la propriété $this-&amp;gt;resprints avec une chaîne, alors cette chaîne sera affiché par le gestionnaire de hook (executeHook), tout de suite à la sortie de votre méthode.&lt;br /&gt;
* Votre hook peut de plus modifier les valeurs de $object et $action.&lt;br /&gt;
&lt;br /&gt;
= Liste des Hooks disponibles dans Dolibarr =&lt;br /&gt;
Trouver les hooks disponibles dans Dolibarr ? &lt;br /&gt;
Faites une recherche sur  &amp;quot;&#039;&#039;&#039;executeHooks(&#039;&#039;&#039;&amp;quot; dans le code source et vous trouverez facilement toutes les fonctions déjà implémentées.&lt;br /&gt;
&lt;br /&gt;
En voici une liste (non complète):&lt;br /&gt;
{{ListOfHooks}}&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
Note: veuillez noter que cette liste s&#039;enrichit à chaque version, donc si vous voulez vraiment savoir si un hook ou contexte spécifique existe, veuillez chercher directement dans le code source avec la méthode indiquée ci-dessus.&lt;br /&gt;
&lt;br /&gt;
= Liste des Contexts disponibles dans Dolibarr =&lt;br /&gt;
Pour trouver les contextes disponibles dans Dolibarr, la procédure est similaire aux hooks.&lt;br /&gt;
Faites une recherche sur  &amp;quot;&#039;&#039;&#039;initHooks(&#039;&#039;&#039;&amp;quot; dans le code source et vous trouverez facilement tous les contextes déjà implémentées.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Context&lt;br /&gt;
! File / Fichier&lt;br /&gt;
|-&lt;br /&gt;
| accountancycustomerlist&lt;br /&gt;
| htdocs\accountancy\customer\list.php &lt;br /&gt;
|-&lt;br /&gt;
| accountancyindex&lt;br /&gt;
| htdocs\accountancy\index.php &lt;br /&gt;
|-&lt;br /&gt;
| accountancysupplierlist&lt;br /&gt;
| htdocs\accountancy\supplier\list.php &lt;br /&gt;
|-&lt;br /&gt;
| actioncard&lt;br /&gt;
| htdocs\comm\action\card.php&lt;br /&gt;
|-&lt;br /&gt;
| actiondao&lt;br /&gt;
| htdocs\comm\action\class\actioncomm.class.php&lt;br /&gt;
|-&lt;br /&gt;
| admin&lt;br /&gt;
| htdocs\accountancy\admin\accountmodel.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\accountancy\admin\categories_list.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\accountancy\admin\journals_list.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\admin\dict.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\admin\website_options.php &lt;br /&gt;
|-&lt;br /&gt;
| admincompany&lt;br /&gt;
| htdocs\admin\company.php &lt;br /&gt;
|-&lt;br /&gt;
| admindefaultvalues&lt;br /&gt;
| htdocs\admin\defaultvalues.php &lt;br /&gt;
|-&lt;br /&gt;
| adminldap&lt;br /&gt;
| htdocs\admin\ldap.php &lt;br /&gt;
|-&lt;br /&gt;
| adminmodules&lt;br /&gt;
| htdocs\admin\modules.php &lt;br /&gt;
|-&lt;br /&gt;
| admintranslation&lt;br /&gt;
| htdocs\admin\translation.php&lt;br /&gt;
|-&lt;br /&gt;
| agenda&lt;br /&gt;
| htdocs\comm\action\index.php&lt;br /&gt;
htdocs\comm\action\pertype.php&lt;br /&gt;
htdocs\comm\action\peruser.php &lt;br /&gt;
|-&lt;br /&gt;
| agendaexport&lt;br /&gt;
| htdocs\public\agenda\agendaexport.php &lt;br /&gt;
|-&lt;br /&gt;
| agendalist&lt;br /&gt;
| htdocs\comm\action\list.php &lt;br /&gt;
|-&lt;br /&gt;
| agendaresource&lt;br /&gt;
| htdocs\resource\agenda.php &lt;br /&gt;
|-&lt;br /&gt;
| agendathirdparty&lt;br /&gt;
| htdocs\societe\agenda.php&lt;br /&gt;
htdocs\product\agenda.php &lt;br /&gt;
|-&lt;br /&gt;
| assetcard&lt;br /&gt;
| htdocs\asset\card.php &lt;br /&gt;
|-&lt;br /&gt;
| assetdocument&lt;br /&gt;
| htdocs\asset\document.php &lt;br /&gt;
|-&lt;br /&gt;
| assetlist&lt;br /&gt;
| htdocs\asset\list.php&lt;br /&gt;
|-&lt;br /&gt;
| assetnote&lt;br /&gt;
| htdocs\asset\note.php &lt;br /&gt;
|-&lt;br /&gt;
| assettypecard&lt;br /&gt;
| htdocs\asset\type.php &lt;br /&gt;
|-&lt;br /&gt;
| bankaccountlist&lt;br /&gt;
| htdocs\compta\bank\list.php &lt;br /&gt;
|-&lt;br /&gt;
| bankcard&lt;br /&gt;
| htdocs\compta\bank\card.php &lt;br /&gt;
|-&lt;br /&gt;
| banktransactionlist&lt;br /&gt;
| htdocs\compta\bank\bankentries_list.php &lt;br /&gt;
|-&lt;br /&gt;
| banktreso&lt;br /&gt;
| htdocs\compta\bank\treso.php &lt;br /&gt;
|-&lt;br /&gt;
| bomagenda&lt;br /&gt;
| htdocs\bom\bom_agenda.php&lt;br /&gt;
|-&lt;br /&gt;
| bomcard&lt;br /&gt;
| htdocs\bom\bom_card.php&lt;br /&gt;
|-&lt;br /&gt;
| bomdao&lt;br /&gt;
| htdocs\bom\class\bom.class.php&lt;br /&gt;
|-&lt;br /&gt;
| bomdocument&lt;br /&gt;
| htdocs\bom\bom_document.php &lt;br /&gt;
|-&lt;br /&gt;
| bomlinedao&lt;br /&gt;
| htdocs\bom\class\bom.class.php&lt;br /&gt;
|-&lt;br /&gt;
| bomlist&lt;br /&gt;
| htdocs\bom\bom_list.php&lt;br /&gt;
|-&lt;br /&gt;
| bomnote&lt;br /&gt;
| htdocs\bom\bom_note.php &lt;br /&gt;
|-&lt;br /&gt;
| cashcontrol&lt;br /&gt;
| htdocs\compta\cashcontrol\cashcontrol_list.php &lt;br /&gt;
|-&lt;br /&gt;
| cashcontrolcard&lt;br /&gt;
| htdocs\compta\cashcontrol\cashcontrol_card.php &lt;br /&gt;
|-&lt;br /&gt;
| cashdeskloginpage&lt;br /&gt;
| htdocs\cashdesk\index.php&lt;br /&gt;
|-&lt;br /&gt;
| cashdeskTplTicket&lt;br /&gt;
| htdocs\cashdesk\validation_ticket.php &lt;br /&gt;
|-&lt;br /&gt;
| cashfencedao&lt;br /&gt;
| htdocs\compta\cashcontrol\class\cashcontrol.class.php&lt;br /&gt;
|-&lt;br /&gt;
| categorycard&lt;br /&gt;
| htdocs\categories\card.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\categories\edit.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\categories\viewcat.php &lt;br /&gt;
|-&lt;br /&gt;
| commandefournisseurdispatchdao&lt;br /&gt;
| htdocs\fourn\class\fournisseur.commande.dispatch.class.php&lt;br /&gt;
|-&lt;br /&gt;
| commonobject&lt;br /&gt;
| htdocs\core\class\html.form.class.php&lt;br /&gt;
|-&lt;br /&gt;
| comptafileslist&lt;br /&gt;
| htdocs\compta\compta-files.php &lt;br /&gt;
|-&lt;br /&gt;
| consumptioncontact&lt;br /&gt;
| htdocs\contact\consumption.php &lt;br /&gt;
|-&lt;br /&gt;
| consumptionthirdparty&lt;br /&gt;
| htdocs\societe\consumption.php&lt;br /&gt;
|-&lt;br /&gt;
| contactagenda&lt;br /&gt;
| htdocs\contact\agenda.php &lt;br /&gt;
|-&lt;br /&gt;
| contactcard&lt;br /&gt;
| htdocs\contact\card.php &lt;br /&gt;
|-&lt;br /&gt;
| contactdao&lt;br /&gt;
| htdocs\contact\class\contact.class.php&lt;br /&gt;
|-&lt;br /&gt;
| contactlist&lt;br /&gt;
| htdocs\contact\list.php &lt;br /&gt;
|-&lt;br /&gt;
| contactthirdparty&lt;br /&gt;
| htdocs\societe\societecontact.php &lt;br /&gt;
|-&lt;br /&gt;
| contacttpl&lt;br /&gt;
| htdocs\core\tpl\contacts.tpl.php&lt;br /&gt;
htdocs\projet\tasks\contact.php &lt;br /&gt;
|-&lt;br /&gt;
| contractcard&lt;br /&gt;
| htdocs\contrat\card.php htdocs\contrat\contact.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\contrat\document.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\contrat\info.php htdocs\contrat\note.php &lt;br /&gt;
|-&lt;br /&gt;
| contractlist&lt;br /&gt;
| htdocs\contrat\list.php &lt;br /&gt;
|-&lt;br /&gt;
| contractservicelist&lt;br /&gt;
| htdocs\contrat\services_list.php &lt;br /&gt;
|-&lt;br /&gt;
| cron&lt;br /&gt;
| htdocs\cron\class\cronjob.class.php &lt;br /&gt;
|-&lt;br /&gt;
| cronjoblist&lt;br /&gt;
| htdocs\cron\list.php &lt;br /&gt;
|-&lt;br /&gt;
| defineholidaylist&lt;br /&gt;
| htdocs\holiday\define_holiday.php &lt;br /&gt;
|-&lt;br /&gt;
| deliverycard&lt;br /&gt;
| htdocs\livraison\card.php &lt;br /&gt;
|-&lt;br /&gt;
| doncard&lt;br /&gt;
| htdocs\don\card.php&lt;br /&gt;
|-&lt;br /&gt;
| element_resource&lt;br /&gt;
| htdocs\resource\element_resource.php &lt;br /&gt;
|-&lt;br /&gt;
| emailcollectoractiondao&lt;br /&gt;
| htdocs\emailcollector\class\emailcollectoraction.class.php&lt;br /&gt;
|-&lt;br /&gt;
| emailcollectorcard&lt;br /&gt;
| htdocs\admin\emailcollector_card.php &lt;br /&gt;
|-&lt;br /&gt;
| emailcollectordao&lt;br /&gt;
| htdocs\emailcollector\class\emailcollector.class.php&lt;br /&gt;
|-&lt;br /&gt;
| emailcollectorfilterdao&lt;br /&gt;
| htdocs\emailcollector\class\emailcollectorfilter.class.php&lt;br /&gt;
|-&lt;br /&gt;
| emailcollectorlist&lt;br /&gt;
| htdocs\admin\emailcollector_list.php &lt;br /&gt;
|-&lt;br /&gt;
| emailingdao&lt;br /&gt;
| htdocs\comm\mailing\class\mailing.class.php&lt;br /&gt;
|-&lt;br /&gt;
| emailsenderprofilelist&lt;br /&gt;
| htdocs\admin\mails_senderprofile_list.php &lt;br /&gt;
|-&lt;br /&gt;
| emailtemplates&lt;br /&gt;
| htdocs\admin\mails_templates.php &lt;br /&gt;
|-&lt;br /&gt;
| expeditioncard&lt;br /&gt;
| htdocs\expedition\card.php&lt;br /&gt;
|-&lt;br /&gt;
| expensereportcard&lt;br /&gt;
| htdocs\expensereport\card.php &lt;br /&gt;
|-&lt;br /&gt;
| expensereportlist&lt;br /&gt;
| htdocs\expensereport\list.php&lt;br /&gt;
|-&lt;br /&gt;
| externalbalance&lt;br /&gt;
| htdocs\compta\localtax\clients.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\compta\localtax\index.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\compta\resultat\clientfourn.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\compta\resultat\index.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\compta\tva\clients.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\compta\tva\index.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\compta\tva\quadri_detail.php &lt;br /&gt;
|-&lt;br /&gt;
| fichinterdao&lt;br /&gt;
| htdocs\fichinter\class\fichinter.class.php&lt;br /&gt;
|-&lt;br /&gt;
| fileslib&lt;br /&gt;
| htdocs\core\lib\files.lib.php &lt;br /&gt;
|-&lt;br /&gt;
| formfile&lt;br /&gt;
| htdocs\core\class\html.formfile.class.php &lt;br /&gt;
|-&lt;br /&gt;
| formmail&lt;br /&gt;
| htdocs\core\class\html.formmail.class.php &lt;br /&gt;
|-&lt;br /&gt;
| globaladmin&lt;br /&gt;
| htdocs\admin\company.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\admin\defaultvalues.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\admin\ldap.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\admin\modules.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\admin\translation.php&lt;br /&gt;
|-&lt;br /&gt;
| globalcard&lt;br /&gt;
| htdocs\adherents\card.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\categories\viewcat.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\comm\action\card.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\asset\type.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\bom\bom_agenda.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\bom\bom_card.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\bom\bom_document.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\bom\bom_note.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\adherents\type.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\adherents\type_ldap.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\comm\propal\card.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\commande\card.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\compta\bank\card.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\compta\bank\treso.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\compta\bank\various_payment\card.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\compta\cashcontrol\cashcontrol_card.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\compta\deplacement\card.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\compta\facture\card.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\compta\facture\fiche-rec.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\compta\facture\invoicetemplate_list.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\compta\localtax\card.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\compta\paiement.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\compta\recap-compta.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\compta\salaries\card.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\compta\tva\card.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\contact\agenda.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\contact\card.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\contrat\card.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\contrat\contact.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\contrat\document.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\contrat\info.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\contrat\note.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\comm\card.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\comm\mailing\card.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\don\card.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\expedition\card.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\expensereport\card.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\fichinter\card.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\fourn\card.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\fourn\commande\card.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\fourn\facture\card.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\fourn\recap-fourn.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\livraison\card.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\loan\card.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\margin\tabs\thirdpartyMargins.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\modulebuilder\template\myobject_agenda.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\modulebuilder\template\myobject_card.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\modulebuilder\template\myobject_document.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\modulebuilder\template\myobject_note.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\product\card.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\product\fournisseurs.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\product\price.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\product\stock\card.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\product\stock\product.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\product\stock\productlot_card.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\projet\card.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\projet\comment.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\projet\contact.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\projet\tasks\comment.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\projet\tasks\task.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\projet\tasks\time.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\projet\tasks.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\reception\card.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\resource\card.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\societe\card.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\societe\contact.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\societe\document.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\societe\note.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\societe\notify\card.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\societe\paymentmodes.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\societe\price.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\societe\societecontact.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\stripe\payment.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\supplier_proposal\card.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\ticket\card.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\user\agenda_extsites.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\user\card.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\user\clicktodial.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\user\document.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\user\group\card.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\user\group\perms.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\user\ldap.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\user\note.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\user\param_ihm.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\user\perms.php &lt;br /&gt;
|-&lt;br /&gt;
| globallist&lt;br /&gt;
| htdocs\compta\compta-files.php &lt;br /&gt;
|-&lt;br /&gt;
| groupcard&lt;br /&gt;
| htdocs\user\group\card.php&lt;br /&gt;
|-&lt;br /&gt;
| groupdao&lt;br /&gt;
| htdocs\user\class\usergroup.class.php&lt;br /&gt;
|-&lt;br /&gt;
| groupperms&lt;br /&gt;
| htdocs\user\group\perms.php &lt;br /&gt;
|-&lt;br /&gt;
| holidaylist&lt;br /&gt;
| htdocs\holiday\list.php &lt;br /&gt;
|-&lt;br /&gt;
| homesetup&lt;br /&gt;
| htdocs\admin\index.php &lt;br /&gt;
|-&lt;br /&gt;
| idprofurl&lt;br /&gt;
| htdocs\societe\class\societe.class.php&lt;br /&gt;
|-&lt;br /&gt;
| index&lt;br /&gt;
| htdocs\index.php &lt;br /&gt;
|-&lt;br /&gt;
| interventioncard&lt;br /&gt;
| htdocs\fichinter\card.php &lt;br /&gt;
|-&lt;br /&gt;
| interventionlist&lt;br /&gt;
| htdocs\fichinter\list.php &lt;br /&gt;
|-&lt;br /&gt;
| intervnetiondao&lt;br /&gt;
| htdocs\fichinter\class\fichinter.class.php&lt;br /&gt;
|-&lt;br /&gt;
| inventorycard&lt;br /&gt;
| htdocs\product\inventory\card.php &lt;br /&gt;
|-&lt;br /&gt;
| inventorylist&lt;br /&gt;
| htdocs\product\inventory\list.php &lt;br /&gt;
|-&lt;br /&gt;
| invoicecard&lt;br /&gt;
| htdocs\compta\facture\card.php &lt;br /&gt;
|-&lt;br /&gt;
| invoicedao&lt;br /&gt;
| htdocs\compta\facture\class\facture.class.php &lt;br /&gt;
|-&lt;br /&gt;
| invoiceindex&lt;br /&gt;
| htdocs\compta\index.php &lt;br /&gt;
|-&lt;br /&gt;
| invoicelist&lt;br /&gt;
| htdocs\compta\facture\list.php &lt;br /&gt;
|-&lt;br /&gt;
| invoicereccard&lt;br /&gt;
| htdocs\compta\facture\fiche-rec.php&lt;br /&gt;
htdocs\compta\facture\invoicetemplate_list.php &lt;br /&gt;
|-&lt;br /&gt;
| invoicesuppliercard&lt;br /&gt;
| htdocs\fourn\facture\card.php&lt;br /&gt;
|-&lt;br /&gt;
| leavemovementlist&lt;br /&gt;
| htdocs\holiday\view_log.php &lt;br /&gt;
|-&lt;br /&gt;
| leftblock&lt;br /&gt;
| htdocs\main.inc.php&lt;br /&gt;
|-&lt;br /&gt;
| loancard&lt;br /&gt;
| htdocs\loan\card.php &lt;br /&gt;
|-&lt;br /&gt;
| localtaxvatcard&lt;br /&gt;
| htdocs\compta\localtax\card.php &lt;br /&gt;
|-&lt;br /&gt;
| login&lt;br /&gt;
| htdocs\main.inc.php&lt;br /&gt;
|-&lt;br /&gt;
| logout&lt;br /&gt;
| htdocs\user\logout.php &lt;br /&gt;
|-&lt;br /&gt;
| mail&lt;br /&gt;
| htdocs\core\class\CMailFile.class.php &lt;br /&gt;
|-&lt;br /&gt;
| mailingcard&lt;br /&gt;
| htdocs\comm\mailing\card.php &lt;br /&gt;
|-&lt;br /&gt;
| mailinglist&lt;br /&gt;
| htdocs\comm\mailing\list.php &lt;br /&gt;
|-&lt;br /&gt;
| main&lt;br /&gt;
| htdocs\core\lib\security.lib.php&lt;br /&gt;
htdocs\main.inc.php&lt;br /&gt;
|-&lt;br /&gt;
| mainloginpage&lt;br /&gt;
| htdocs\core\lib\security2.lib.php &lt;br /&gt;
|-&lt;br /&gt;
| membercard&lt;br /&gt;
| htdocs\adherents\card.php &lt;br /&gt;
|-&lt;br /&gt;
| memberlist&lt;br /&gt;
| htdocs\adherents\list.php &lt;br /&gt;
|-&lt;br /&gt;
| membertypecard&lt;br /&gt;
| htdocs\adherents\type.php &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| membertypeldapcard&lt;br /&gt;
| htdocs\adherents\type_ldap.php &lt;br /&gt;
|-&lt;br /&gt;
| movementlist&lt;br /&gt;
| htdocs\core\modules\stock\doc\pdf_stdmovement.modules.php&lt;br /&gt;
htdocs\product\stock\movement_card.php&lt;br /&gt;
htdocs\product\stock\movement_list.php &lt;br /&gt;
|-&lt;br /&gt;
| myobjectagenda&lt;br /&gt;
| htdocs\modulebuilder\template\myobject_agenda.php&lt;br /&gt;
|-&lt;br /&gt;
| myobjectcard&lt;br /&gt;
| htdocs\modulebuilder\template\myobject_card.php &lt;br /&gt;
|-&lt;br /&gt;
| myobjectdao&lt;br /&gt;
| htdocs\comm\mailing\class\mailing.class.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\modulebuilder\template\class\myobject.class.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\compta\bank\class\paymentvarious.class.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\compta\cashcontrol\class\cashcontrol.class.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\compta\salaries\class\paymentsalary.class.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\emailcollector\class\emailcollector.class.php&lt;br /&gt;
|-&lt;br /&gt;
| myobjectdocument&lt;br /&gt;
| htdocs\modulebuilder\template\myobject_document.php &lt;br /&gt;
|-&lt;br /&gt;
| myobjectlist&lt;br /&gt;
| htdocs\modulebuilder\template\myobject_list.php &lt;br /&gt;
|-&lt;br /&gt;
| myobjectnote&lt;br /&gt;
| htdocs\modulebuilder\template\myobject_note.php &lt;br /&gt;
|-&lt;br /&gt;
| notification&lt;br /&gt;
| htdocs\core\class\notify.class.php &lt;br /&gt;
|-&lt;br /&gt;
| odtgeneration&lt;br /&gt;
| htdocs\core\modules\user\doc\doc_generic_user_odt.modules.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\core\modules\usergroup\doc\doc_generic_usergroup_odt.modules.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\core\modules\supplier_proposal\doc\doc_generic_supplier_proposal_odt.modules.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\core\modules\societe\doc\doc_generic_odt.modules.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\core\modules\stock\doc\doc_generic_stock_odt.modules.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\core\modules\facture\doc\doc_generic_invoice_odt.modules.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\core\modules\product\doc\doc_generic_product_odt.modules.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\core\modules\project\doc\doc_generic_project_odt.modules.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\core\modules\propale\doc\doc_generic_proposal_odt.modules.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\core\modules\reception\doc\doc_generic_reception_odt.modules.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\core\modules\commande\doc\doc_generic_order_odt.modules.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\core\modules\contract\doc\doc_generic_contract_odt.modules.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\core\modules\expedition\doc\doc_generic_shipment_odt.modules.php&lt;br /&gt;
|-&lt;br /&gt;
| ordercard&lt;br /&gt;
| htdocs\commande\card.php &lt;br /&gt;
|-&lt;br /&gt;
| orderdao&lt;br /&gt;
| htdocs\commande\class\commande.class.php&lt;br /&gt;
|-&lt;br /&gt;
| orderlist&lt;br /&gt;
| htdocs\commande\list.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\don\list.php &lt;br /&gt;
|-&lt;br /&gt;
| ordershipmentcard&lt;br /&gt;
| htdocs\expedition\shipment.php &lt;br /&gt;
|-&lt;br /&gt;
| orderstoinvoice&lt;br /&gt;
| htdocs\commande\orderstoinvoice.php &lt;br /&gt;
|-&lt;br /&gt;
| orderstoinvoicesupplier&lt;br /&gt;
| htdocs\fourn\commande\orderstoinvoice.php &lt;br /&gt;
|-&lt;br /&gt;
| ordersuppliercard&lt;br /&gt;
| htdocs\fourn\commande\card.php &lt;br /&gt;
|-&lt;br /&gt;
| ordersupplierdispatch&lt;br /&gt;
| htdocs\fourn\commande\dispatch.php &lt;br /&gt;
|-&lt;br /&gt;
| paiementcard&lt;br /&gt;
| htdocs\stripe\payment.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\compta\paiement.php &lt;br /&gt;
|-&lt;br /&gt;
| passwordforgottenpage&lt;br /&gt;
| htdocs\user\passwordforgotten.php &lt;br /&gt;
|-&lt;br /&gt;
| paymentlist&lt;br /&gt;
| htdocs\compta\paiement\list.php &lt;br /&gt;
|-&lt;br /&gt;
| paymentsupplierlist&lt;br /&gt;
| htdocs\fourn\facture\paiement.php &lt;br /&gt;
|-&lt;br /&gt;
| pdfgeneration&lt;br /&gt;
| htdocs\core\modules\action\rapport.pdf.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\core\modules\bank\doc\pdf_ban.modules.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\core\modules\bank\doc\pdf_sepamandate.modules.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\core\modules\cheque\doc\pdf_blochet.class.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\core\modules\commande\doc\pdf_einstein.modules.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\core\modules\commande\doc\pdf_eratosthene.modules.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\core\modules\contract\doc\pdf_strato.modules.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\core\modules\expedition\doc\pdf_espadon.modules.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\core\modules\expedition\doc\pdf_merou.modules.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\core\modules\expedition\doc\pdf_rouget.modules.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\core\modules\expensereport\doc\pdf_standard.modules.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\core\modules\facture\doc\pdf_crabe.modules.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\core\modules\facture\doc\pdf_sponge.modules.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\core\modules\fichinter\doc\pdf_soleil.modules.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\core\modules\livraison\doc\pdf_typhon.modules.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\core\modules\product\doc\pdf_standard.modules.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\core\modules\project\doc\pdf_baleine.modules.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\core\modules\project\doc\pdf_beluga.modules.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\core\modules\project\doc\pdf_timespent.modules.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\core\modules\propale\doc\pdf_azur.modules.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\core\modules\propale\doc\pdf_cyan.modules.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\core\modules\rapport\pdf_paiement.class.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\core\modules\reception\doc\pdf_squille.modules.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\core\modules\stock\doc\pdf_standard.modules.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\core\modules\stock\doc\pdf_stdmovement.modules.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\core\modules\supplier_invoice\pdf\pdf_canelle.modules.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\core\modules\supplier_order\pdf\pdf_cornas.modules.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\core\modules\supplier_order\pdf\pdf_muscadet.modules.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\core\modules\supplier_payment\doc\pdf_standard.modules.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\core\modules\supplier_proposal\doc\pdf_aurore.modules.php&lt;br /&gt;
|-&lt;br /&gt;
| pricesuppliercard&lt;br /&gt;
| htdocs\product\fournisseurs.php &lt;br /&gt;
|-&lt;br /&gt;
| product_lotlist&lt;br /&gt;
| htdocs\product\stock\productlot_list.php &lt;br /&gt;
|-&lt;br /&gt;
| productcard&lt;br /&gt;
| htdocs\product\card.php &lt;br /&gt;
|-&lt;br /&gt;
| productdao&lt;br /&gt;
| htdocs\product\class\product.class.php&lt;br /&gt;
|-&lt;br /&gt;
| productdocuments&lt;br /&gt;
| htdocs\product\document.php &lt;br /&gt;
|-&lt;br /&gt;
| productindex&lt;br /&gt;
| htdocs\product\index.php &lt;br /&gt;
|-&lt;br /&gt;
| productlotcard&lt;br /&gt;
| htdocs\product\stock\productlot_card.php &lt;br /&gt;
|-&lt;br /&gt;
| productlotdocuments&lt;br /&gt;
| htdocs\product\stock\productlot_document.php &lt;br /&gt;
|-&lt;br /&gt;
| productpricecard&lt;br /&gt;
| htdocs\product\price.php &lt;br /&gt;
|-&lt;br /&gt;
| productservicelist&lt;br /&gt;
| htdocs\product\list.php &lt;br /&gt;
|-&lt;br /&gt;
| productstatscontract&lt;br /&gt;
| htdocs\product\stats\contrat.php &lt;br /&gt;
|-&lt;br /&gt;
| productstatsinvoice&lt;br /&gt;
| htdocs\product\stats\facture.php&lt;br /&gt;
|-&lt;br /&gt;
| productstatsorder&lt;br /&gt;
| htdocs\product\stats\commande.php &lt;br /&gt;
|-&lt;br /&gt;
| productstatspropal&lt;br /&gt;
| htdocs\product\stats\propal.php&lt;br /&gt;
htdocs\product\stats\supplier_proposal.php &lt;br /&gt;
|-&lt;br /&gt;
| productstatssupplyinvoice&lt;br /&gt;
| htdocs\product\stats\facture_fournisseur.php &lt;br /&gt;
|-&lt;br /&gt;
| productstatssupplyorder&lt;br /&gt;
| htdocs\product\stats\commande_fournisseur.php &lt;br /&gt;
|-&lt;br /&gt;
| projectcard&lt;br /&gt;
| htdocs\projet\card.php&lt;br /&gt;
htdocs\projet\comment.php &lt;br /&gt;
|-&lt;br /&gt;
| projectcontactcard&lt;br /&gt;
| htdocs\projet\contact.php &lt;br /&gt;
|-&lt;br /&gt;
| projectdao&lt;br /&gt;
| htdocs\projet\class\project.class.php &lt;br /&gt;
|-&lt;br /&gt;
| projectlist&lt;br /&gt;
| htdocs\projet\list.php &lt;br /&gt;
|-&lt;br /&gt;
| projectOverview&lt;br /&gt;
| htdocs\projet\element.php &lt;br /&gt;
|-&lt;br /&gt;
| projecttaskcard&lt;br /&gt;
| htdocs\projet\tasks\task.php &lt;br /&gt;
|-&lt;br /&gt;
| projecttaskcommentcard&lt;br /&gt;
| htdocs\projet\tasks\comment.php &lt;br /&gt;
|-&lt;br /&gt;
| projecttaskscard&lt;br /&gt;
| htdocs\projet\tasks.php &lt;br /&gt;
|-&lt;br /&gt;
| projecttasktime&lt;br /&gt;
| htdocs\projet\tasks\time.php&lt;br /&gt;
|-&lt;br /&gt;
| projectthirdparty&lt;br /&gt;
| htdocs\societe\project.php&lt;br /&gt;
|-&lt;br /&gt;
| projectticket&lt;br /&gt;
| htdocs\ticket\list.php&lt;br /&gt;
|-&lt;br /&gt;
| propalcard&lt;br /&gt;
| htdocs\comm\propal\card.php &lt;br /&gt;
|-&lt;br /&gt;
| propallist&lt;br /&gt;
| htdocs\comm\propal\list.php&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| purchasesjournal&lt;br /&gt;
| htdocs\accountancy\journal\purchasesjournal.php &lt;br /&gt;
|-&lt;br /&gt;
| recapcomptacard&lt;br /&gt;
| htdocs\compta\recap-compta.php&lt;br /&gt;
|-&lt;br /&gt;
| receptioncard&lt;br /&gt;
| htdocs\reception\card.php&lt;br /&gt;
|-&lt;br /&gt;
| receptiondao&lt;br /&gt;
| htdocs\reception\card.php&lt;br /&gt;
htdocs\reception\class\reception.class.php &lt;br /&gt;
|-&lt;br /&gt;
| receptionlist&lt;br /&gt;
| htdocs\reception\list.php &lt;br /&gt;
|-&lt;br /&gt;
| resource&lt;br /&gt;
| htdocs\resource\card.php &lt;br /&gt;
|-&lt;br /&gt;
| resource_card&lt;br /&gt;
| htdocs\resource\card.php &lt;br /&gt;
|-&lt;br /&gt;
| resourcelist&lt;br /&gt;
| htdocs\resource\list.php &lt;br /&gt;
|-&lt;br /&gt;
| salarycard&lt;br /&gt;
| htdocs\compta\salaries\card.php &lt;br /&gt;
|-&lt;br /&gt;
| salarypayment&lt;br /&gt;
| htdocs\compta\salaries\class\paymentsalary.class.php&lt;br /&gt;
|-&lt;br /&gt;
| searchform&lt;br /&gt;
| htdocs\core\ajax\selectsearchbox.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\core\search_page.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\main.inc.php&lt;br /&gt;
|-&lt;br /&gt;
| sellsjournal&lt;br /&gt;
| htdocs\accountancy\journal\sellsjournal.php &lt;br /&gt;
|-&lt;br /&gt;
| shipmentlist&lt;br /&gt;
| htdocs\expedition\list.php &lt;br /&gt;
|-&lt;br /&gt;
| stockproductcard&lt;br /&gt;
| htdocs\product\stock\product.php &lt;br /&gt;
|-&lt;br /&gt;
| stockreplenishlist&lt;br /&gt;
| htdocs\product\stock\replenish.php &lt;br /&gt;
|-&lt;br /&gt;
| subscription&lt;br /&gt;
| htdocs\adherents\subscription.php &lt;br /&gt;
|-&lt;br /&gt;
| subscriptionlist&lt;br /&gt;
| htdocs\adherents\subscription\list.php &lt;br /&gt;
|-&lt;br /&gt;
| supplier_proposalcard&lt;br /&gt;
| htdocs\supplier_proposal\card.php &lt;br /&gt;
|-&lt;br /&gt;
| supplier_proposallist&lt;br /&gt;
| htdocs\supplier_proposal\list.php &lt;br /&gt;
|-&lt;br /&gt;
| supplierbalencelist&lt;br /&gt;
| htdocs\compta\recap-compta.php&lt;br /&gt;
htdocs\fourn\recap-fourn.php &lt;br /&gt;
|-&lt;br /&gt;
| suppliercard&lt;br /&gt;
| htdocs\fourn\card.php &lt;br /&gt;
|-&lt;br /&gt;
| supplierinvoicelist&lt;br /&gt;
| htdocs\fourn\facture\list.php &lt;br /&gt;
|-&lt;br /&gt;
| supplierorderlist&lt;br /&gt;
| htdocs\fourn\commande\list.php &lt;br /&gt;
|-&lt;br /&gt;
| supplierpricelist&lt;br /&gt;
| htdocs\fourn\product\list.php &lt;br /&gt;
|-&lt;br /&gt;
| surveylist&lt;br /&gt;
| htdocs\opensurvey\list.php &lt;br /&gt;
|-&lt;br /&gt;
| takeposfrontend&lt;br /&gt;
| htdocs\takepos\takepos.php &lt;br /&gt;
|-&lt;br /&gt;
| tasklist&lt;br /&gt;
| htdocs\projet\tasks\list.php &lt;br /&gt;
|-&lt;br /&gt;
| tasktimelist&lt;br /&gt;
| htdocs\projet\tasks\time.php&lt;br /&gt;
|-&lt;br /&gt;
| taxvatcard&lt;br /&gt;
| htdocs\compta\tva\card.php &lt;br /&gt;
|-&lt;br /&gt;
| thirdpartybancard&lt;br /&gt;
| htdocs\societe\paymentmodes.php &lt;br /&gt;
|-&lt;br /&gt;
| thirdpartycard&lt;br /&gt;
| htdocs\core\tpl\advtarget.tpl.php&lt;br /&gt;
htdocs\societe\card.php &lt;br /&gt;
|-&lt;br /&gt;
| thirdpartycomm&lt;br /&gt;
| htdocs\comm\card.php &lt;br /&gt;
|-&lt;br /&gt;
| thirdpartycontact&lt;br /&gt;
| htdocs\societe\contact.php &lt;br /&gt;
|-&lt;br /&gt;
| thirdpartycustomerprice&lt;br /&gt;
| htdocs\societe\price.php &lt;br /&gt;
|-&lt;br /&gt;
| thirdpartydao&lt;br /&gt;
| htdocs\societe\class\societe.class.php&lt;br /&gt;
|-&lt;br /&gt;
| thirdpartydocument&lt;br /&gt;
| htdocs\societe\document.php &lt;br /&gt;
|-&lt;br /&gt;
| thirdpartylist&lt;br /&gt;
| htdocs\societe\list.php &lt;br /&gt;
|-&lt;br /&gt;
| thirdpartymargins&lt;br /&gt;
| htdocs\margin\tabs\thirdpartyMargins.php &lt;br /&gt;
|-&lt;br /&gt;
| thirdpartynote&lt;br /&gt;
| htdocs\societe\note.php&lt;br /&gt;
|-&lt;br /&gt;
| thirdpartynotification&lt;br /&gt;
| htdocs\societe\notify\card.php &lt;br /&gt;
|-&lt;br /&gt;
| thirdpartyticket&lt;br /&gt;
| htdocs\ticket\list.php&lt;br /&gt;
|-&lt;br /&gt;
| ticketcard&lt;br /&gt;
| htdocs\ticket\card.php &lt;br /&gt;
|-&lt;br /&gt;
| ticketlist&lt;br /&gt;
| htdocs\ticket\list.php&lt;br /&gt;
|-&lt;br /&gt;
| timesheetperdaycard&lt;br /&gt;
| htdocs\projet\activity\perday.php &lt;br /&gt;
|-&lt;br /&gt;
| timesheetperweekcard&lt;br /&gt;
| htdocs\projet\activity\perweek.php &lt;br /&gt;
|-&lt;br /&gt;
| toprightmenu&lt;br /&gt;
| htdocs\main.inc.php&lt;br /&gt;
|-&lt;br /&gt;
| tripsandexpensescard&lt;br /&gt;
| htdocs\compta\deplacement\card.php &lt;br /&gt;
|-&lt;br /&gt;
| upgrade&lt;br /&gt;
| htdocs\install\upgrade2.php &lt;br /&gt;
|-&lt;br /&gt;
| useragenda&lt;br /&gt;
| htdocs\user\agenda_extsites.php &lt;br /&gt;
|-&lt;br /&gt;
| usercard&lt;br /&gt;
| htdocs\user\agenda_extsites.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\user\card.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\user\clicktodial.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\user\document.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\user\ldap.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\user\note.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\user\param_ihm.php&amp;lt;br /&amp;gt;&lt;br /&gt;
htdocs\user\perms.php &lt;br /&gt;
|-&lt;br /&gt;
| userdao&lt;br /&gt;
| htdocs\user\class\user.class.php&lt;br /&gt;
|-&lt;br /&gt;
| userdoc&lt;br /&gt;
| htdocs\user\document.php &lt;br /&gt;
|-&lt;br /&gt;
| userhome&lt;br /&gt;
| htdocs\user\home.php&lt;br /&gt;
|-&lt;br /&gt;
| userihm&lt;br /&gt;
| htdocs\user\param_ihm.php &lt;br /&gt;
|-&lt;br /&gt;
| userldap&lt;br /&gt;
| htdocs\user\ldap.php &lt;br /&gt;
|-&lt;br /&gt;
| userlist&lt;br /&gt;
| htdocs\user\list.php&lt;br /&gt;
|-&lt;br /&gt;
| usernote&lt;br /&gt;
| htdocs\user\note.php &lt;br /&gt;
|-&lt;br /&gt;
| userperms&lt;br /&gt;
| htdocs\user\perms.php &lt;br /&gt;
|-&lt;br /&gt;
| variouscard&lt;br /&gt;
| htdocs\compta\bank\various_payment\card.php &lt;br /&gt;
|-&lt;br /&gt;
| variouspayment&lt;br /&gt;
| htdocs\compta\bank\class\paymentvarious.class.php&lt;br /&gt;
|-&lt;br /&gt;
| warehousecard&lt;br /&gt;
| htdocs\product\stock\card.php &lt;br /&gt;
|-&lt;br /&gt;
| website&lt;br /&gt;
| htdocs\admin\website.php &lt;br /&gt;
|-&lt;br /&gt;
| websiteaccountcard&lt;br /&gt;
| htdocs\website\websiteaccount_card.php &lt;br /&gt;
|-&lt;br /&gt;
| websitethirdpartylist&lt;br /&gt;
| htdocs\societe\website.php &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note: veuillez noter que cette liste s&#039;enrichie à chaque version, donc si vous voulez vraiment savoir si un hook ou contexte spécifique existe, veuillez chercher directement dans le code source avec la méthode indiquée ci-dessus.&lt;br /&gt;
&lt;br /&gt;
= Voir aussi =&lt;br /&gt;
* [[Triggers]]&lt;br /&gt;
* [[Interfaces Dolibarr toward foreign systems]]&lt;br /&gt;
* [[Interfaces from foreign systems toward Dolibarr]]&lt;/div&gt;</summary>
		<author><name>Florian.mortgat</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Syst%C3%A8me_de_Triggers&amp;diff=41559</id>
		<title>Système de Triggers</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Syst%C3%A8me_de_Triggers&amp;diff=41559"/>
		<updated>2019-06-06T12:36:27Z</updated>

		<summary type="html">&lt;p&gt;Florian.mortgat: typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TemplateDocDevFr}}&lt;br /&gt;
&lt;br /&gt;
= Ajouter son code sur un événement Dolibarr =&lt;br /&gt;
&lt;br /&gt;
Pour permettre de déclencher du code personnalisé en réaction à un évènement Dolibarr (création/modification/suppression d&#039;une société/facture/produit/utilisateur ou autre), Dolibarr propose un mécanisme de triggers métiers. Ce mécanisme vous permet de personnaliser un workflow afin que les évènements de gestion Dolibarr soient répercutés dans une autre application par exemple.&lt;br /&gt;
Rien n&#039;empêche également de l&#039;utiliser pour modifier le comportement de Dolibarr même: par exemple, pour que la validation d&#039;une facture provoque la création d&#039;un contrat automatiquement.&lt;br /&gt;
&lt;br /&gt;
Donc, pour ajouter son propre code qui sera déclenché par trigger, la procédure est la suivante:&lt;br /&gt;
&lt;br /&gt;
1) Copier le fichier &#039;&#039;&#039;htdocs/core/triggers/interface_90_all_Demo.class.php-NORUN&#039;&#039;&#039; sous le nom:&lt;br /&gt;
* &#039;&#039;&#039;interface_99_all_&#039;&#039;Xxx&#039;&#039;.class.php&#039;&#039;&#039;&lt;br /&gt;
ou bien&lt;br /&gt;
* &#039;&#039;&#039;interface_99_mod&#039;&#039;MonModule_Xxx&#039;&#039;.class.php&#039;&#039;&#039;&lt;br /&gt;
où &#039;&#039;Xxx&#039;&#039; est une chaine de votre choix commençant par une majuscule, &#039;&#039;99&#039;&#039; est le numéro de priorité du trigger (&#039;&#039;01&#039;&#039; étant le plus prioritaire), &#039;&#039;MonModule&#039;&#039; est le nom du module si votre trigger ne doit être activé que si le module MonModule est actif. Si on désire que le trigger soit toujours actif, on mettra &#039;&#039;all&#039;&#039; à la place de modMonModule.&lt;br /&gt;
Il faut laisser ce nouveau fichier dans le même répertoire.&lt;br /&gt;
Rem: Les valeurs utilisables pour modMonModule sont visibles dans le répertoire&lt;br /&gt;
&#039;&#039;htdocs/core/modules&#039;&#039;.&lt;br /&gt;
&#039;&#039;&#039;ATTENTION&#039;&#039;&#039;: &#039;&#039;&#039;Tous&#039;&#039;&#039; ces paramètres sont nécessaires pour que le trigger soit détecté! Ex: si vous oubliez le numéro de priorité, le module ne sera pas detecté!&lt;br /&gt;
&lt;br /&gt;
Par exemple, on pourra nommer notre nouveau trigger: &lt;br /&gt;
&#039;&#039;htdocs/core/triggers/interface_99_modFacture_Monworkflow.class.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
En créant un fichier nommé comme dans cet exemple, notre nouveau trigger sera déclenché à chaque évènement métier Dolibarr et à condition que le module Facture soit actif.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note&#039;&#039;&#039;: Avec Dolibarr 3.2+, il est aussi possible de placer les fichiers triggers dans un sous-dossier de module. Ex: si le module réside dans htdocs/mymodule/, alors il est possible de placer les triggers dans htdocs/mymodule/core/triggers/.&lt;br /&gt;
Mais dans ce cas, le trigger ne sera trouvé que si vous le déclarer dans le fichier descripteur de votre module. Pour cela, ajouter ajouter triggers-&amp;gt;1 dans le tableau module_parts (ex: &#039;&#039;&#039;/monmodule/core/modules/modMonModule.class.php&#039;&#039;&#039;):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Defined all module parts (triggers, login, substitutions, menus, etc...) (0=disable,1=enable)&lt;br /&gt;
   $this-&amp;gt;module_parts = array(&#039;triggers&#039; =&amp;gt; 1);&lt;br /&gt;
   //$this-&amp;gt;module_parts = array(&#039;triggers&#039; =&amp;gt; 1,&lt;br /&gt;
   //              &#039;login&#039; =&amp;gt; 0,&lt;br /&gt;
   //              &#039;substitutions&#039; =&amp;gt; 0,&lt;br /&gt;
   //              &#039;menus&#039; =&amp;gt; 0);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Puis désactiver et réactiver le module. Ceci aura pour effet d&#039;ajouter une ligne dans la [[Table llx_const]] pour indiquer à Dolibarr qu&#039;il faut recherch un trigger dans le répertoire de votre module &#039;&#039;&#039;htdocs/monmodule/core/triggers&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2) Editer ce fichier &#039;&#039;interface_99_modMonModule_Monworkflow.class.php&#039;&#039; afin de renommer la classe &#039;&#039;InterfaceDemo&#039;&#039; par &#039;&#039;InterfaceMonworkflow&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ensuite, accéder à la page Accueil-&amp;gt; Infos Systèmes -&amp;gt; Dolibarr -&amp;gt; Triggers.&lt;br /&gt;
Votre fichier trigger doit apparaitre dans la liste sans erreur indiquant que les opérations précédentes ont été réalisées avec succès.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3) Revenez maintenant à l&#039;édition du fichier trigger afin d&#039;ajouter votre code dans la fonction &#039;&#039;run_trigger&#039;&#039;.&lt;br /&gt;
Cette fonction est appelée à chaque évènement Dolibarr. Placer votre code en fonction du ou des évènements sur lesquels vous voulez réagir, chaque évènement étant identifié par un code (voir chapitres suivant pour la liste des codes), on peut réagir ou non à un évènement donné par un test sur la variable &#039;&#039;&#039;$action&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
public function runtrigger($action,$object,$user,$langs,$conf)&lt;br /&gt;
{&lt;br /&gt;
      // Mettre ici le code à exécuter en réaction de l&#039;action&lt;br /&gt;
      // Le type de l&#039;évènement Dolibarr est stocké dans $action&lt;br /&gt;
      // Les données de l&#039;action sont stockées dans $object&lt;br /&gt;
      // La configuration, utilisateur et langage sont dans $conf,$user et $lang&lt;br /&gt;
      if ($action == &#039;COMPANY_CREATE&#039;)&lt;br /&gt;
      {&lt;br /&gt;
          dol_syslog(&amp;quot;Trigger for action &#039;$action&#039; launched. id=&amp;quot;.$object-&amp;gt;id);&lt;br /&gt;
      }&lt;br /&gt;
      elseif ($action == &#039;COMPANY_MODIFY&#039;)&lt;br /&gt;
      {        &lt;br /&gt;
          dol_syslog(&amp;quot;Trigger for action &#039;$action&#039; launched. id=&amp;quot;.$object-&amp;gt;id);&lt;br /&gt;
      }&lt;br /&gt;
      elseif ($action == &#039;COMPANY_DELETE&#039;)&lt;br /&gt;
      ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous pouvez faire ce que vous voulez dans cette portion de code du moment que la fonction runtrigger renvoie un code retour sur le principe suivant:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;0 si ko, 0 si aucune action faite, &amp;gt;0 si ok&lt;br /&gt;
&lt;br /&gt;
Vous pouvez de plus dans cette fonction utiliser les objets suivant:&lt;br /&gt;
* &#039;&#039;&#039;$object&#039;&#039;&#039; est l&#039;objet sur lequel porte l&#039;action (voir chapitre suivant)&lt;br /&gt;
* &#039;&#039;&#039;$user&#039;&#039;&#039; est l&#039;objet de l&#039;utilisateur Dolibarr qui réalise l&#039;action&lt;br /&gt;
* &#039;&#039;&#039;$langs&#039;&#039;&#039; est l&#039;objet qui contient la langue de l&#039;utilisateur Dolibarr&lt;br /&gt;
* &#039;&#039;&#039;$conf&#039;&#039;&#039; est l&#039;objet qui contient toute la configuration de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4) Une fois le code réalisé, il n&#039;y a plus qu&#039;à tester, en provoquant l&#039;évènement déclencheur dans Dolibarr. Attention, l&#039;appel au &#039;&#039;&#039;runtrigger&#039;&#039;&#039; et encapsuler dans un transaction. Si votre trigger renvoie un code ko, la fonction appelante peut annuler la transaction (ceci dépend de la fonction appelante).&lt;br /&gt;
Ajouter des traces dans un fichier dans la fonction &#039;&#039;&#039;run_trigger&#039;&#039;&#039; afin de vous assurer que le code s&#039;exécute bien. Vous pouvez pour cela si vous le désirer, utiliser la fonction&lt;br /&gt;
dol_syslog(&amp;quot;mon texte de trace&amp;quot;, LOG_DEBUG);&lt;br /&gt;
&lt;br /&gt;
= Liste des événements gérés =&lt;br /&gt;
La liste de tous les événements qui provoquent un déclenchement de trigger est disponible dans la table [[Table llx c action trigger]]. Voici un vue rapide des événements identifiés par la valeur suivante au code &#039;&#039;&#039;$action&#039;&#039;&#039;, avec le type de l&#039;objet reçu dans &#039;&#039;&#039;$object&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
En général, le code action de trigger est composé du:&lt;br /&gt;
* Nom du module (en majuscule)&lt;br /&gt;
* D&#039;autres informations isolés par le caractère _&lt;br /&gt;
* L&#039;action.&lt;br /&gt;
&lt;br /&gt;
{{TemplateListOfTriggers}}&lt;br /&gt;
&lt;br /&gt;
Liste non exhaustive.&lt;br /&gt;
&lt;br /&gt;
= Gérer de nouveau évènements =&lt;br /&gt;
&lt;br /&gt;
Pour gérer d&#039;autre évènements que ceux ci-dessus, il faut modifier le code Dolibarr pour y ajouter la séquence suivante dans les méthodes métiers des classes utilisées pour gérer les évenements:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Appel des triggers&lt;br /&gt;
include_once(DOL_DOCUMENT_ROOT . &amp;quot;/core/class/interfaces.class.php&amp;quot;);&lt;br /&gt;
$interface=new Interfaces($this-&amp;gt;db);&lt;br /&gt;
$result=$interface-&amp;gt;run_triggers(&#039;XXXXX_YYYYY&#039;,$this,$user,$langs,$conf);&lt;br /&gt;
if ($result &amp;lt; 0) { $error++; $this-&amp;gt;errors=$interface-&amp;gt;errors; }&lt;br /&gt;
// Fin appel triggers&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ici, $this doit être l&#039;objet de la classe métier qui contient toutes les informations à passer au trigger. Remplacer, de plus, le &#039;XXXXX_YYYYY&#039; par un code évènement non déjà utilisé.&lt;br /&gt;
&#039;&#039;&#039;D&#039;autre part, si l’exécution du trigger revient en erreur, vous devez annuler l&#039;action correspondante.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A partir de la version 3.7, vous devez utiliser ce type de code :&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Call trigger&lt;br /&gt;
$result=$this-&amp;gt;call_trigger(&#039;XXXXX_YYYYY&#039;,$user);&lt;br /&gt;
if ($result &amp;lt; 0) $error++;          &lt;br /&gt;
// End call triggers&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il sera alors possible d&#039;ajouter dans la méthode run_trigger, un if qui permet de gérer ce code. La méthode run_trigger serait alors de la forme :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
function run_trigger($action,$object,$user,$lang,$conf)&lt;br /&gt;
{&lt;br /&gt;
      // Mettre ici le code à exécuter en réaction de l&#039;action&lt;br /&gt;
      // Le type de l&#039;évènement Dolibarr est stocké dans $action&lt;br /&gt;
      // Les données de l&#039;action sont stockées dans $object&lt;br /&gt;
      // La configuration, utilisateur et langage sont dans $conf,$user et $lang&lt;br /&gt;
      if ($action == &#039;XXXXX_YYYYY&#039;)&lt;br /&gt;
      {&lt;br /&gt;
          dol_syslog(&amp;quot;Trigger for action &#039;$action&#039; launched. id=&amp;quot;.$object-&amp;gt;id);&lt;br /&gt;
      }&lt;br /&gt;
      elseif ($action == &#039;COMPANY_CREATE&#039;)&lt;br /&gt;
      {&lt;br /&gt;
          dol_syslog(&amp;quot;Trigger for action &#039;$action&#039; launched. id=&amp;quot;.$object-&amp;gt;id);&lt;br /&gt;
      }&lt;br /&gt;
      elseif ($action == &#039;COMPANY_MODIFY&#039;)&lt;br /&gt;
      {        &lt;br /&gt;
          dol_syslog(&amp;quot;Trigger for action &#039;$action&#039; launched. id=&amp;quot;.$object-&amp;gt;id);&lt;br /&gt;
      }&lt;br /&gt;
      elseif ($action == &#039;COMPANY_DELETE&#039;)&lt;br /&gt;
      ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Conclusion =&lt;br /&gt;
Vous pouvez donc en quelques minutes, ajouter une interface Dolibarr vers exterieur sans risque puisqu&#039;on ne touche pas au code Dolibarr, on s&#039;est contenté de placer un nouveau fichier trigger dans le répertoire des triggers.&lt;br /&gt;
Si cette interface peut être utile à d&#039;autre, n&#039;hésitez pas à la packager en tgz (voir la page [[Développement_module#Créer_un_package_pour_livrer_et_installer_votre_module]]) et de la soumettre dans l&#039;espace des téléchargement-contributions sur le site de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
= Voir aussi =&lt;br /&gt;
* [[Système de Hooks]]&lt;br /&gt;
* [[Interfaces Dolibarr vers exterieur]]&lt;br /&gt;
* [[Interfaces Exterieur vers Dolibarr]]&lt;/div&gt;</summary>
		<author><name>Florian.mortgat</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Prerequisites&amp;diff=41491</id>
		<title>Prerequisites</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Prerequisites&amp;diff=41491"/>
		<updated>2019-05-29T07:31:35Z</updated>

		<summary type="html">&lt;p&gt;Florian.mortgat: /* Disk storage */ wording&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Admin]]&lt;br /&gt;
[[Category:Admin_en]]&lt;br /&gt;
{{TemplateDocUser}}&lt;br /&gt;
&lt;br /&gt;
Dolibarr was built to work on following components:&lt;br /&gt;
&lt;br /&gt;
= OS (Operating Systems) =&lt;br /&gt;
Nearly every modern OS is supported.&lt;br /&gt;
* Clients: every OS, that can run a webbrowser&lt;br /&gt;
* Server: every os, that supports a webserver with PHP and a SQL Database (see below)&lt;br /&gt;
&lt;br /&gt;
for example: GNU/Linux, BSD, Windows, MacOS, AIX, ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note for Windows 7 users:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 When using Windows 7 the Visual C++ Redistributable for Visual Studio 2012 Update 4 must be already installed.  &lt;br /&gt;
 An error message during installation will indicate if this is missing.&lt;br /&gt;
 &#039;&#039;&#039;Make sure you choose the 32-bit version (vcredist_x86.exe).&#039;&#039;&#039;&lt;br /&gt;
 It can be obtained here:&lt;br /&gt;
 * https://www.microsoft.com/en-us/download/details.aspx?id=30679&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Database =&lt;br /&gt;
* MySQL {{MySqlMinVersion}} (any MySQL options/parameters supported). &lt;br /&gt;
 !! Do not use MySQL version 5.5.40 nor 5.5.41, this version has critical bugs with data loss.&lt;br /&gt;
If using option mode=STRICT returns some warnings or error, please report them to us.&lt;br /&gt;
* MariaDB {{MySqlMinVersion}}&lt;br /&gt;
* PostgreSQL {{PostgresMinVersion}}&lt;br /&gt;
&lt;br /&gt;
* MS SQL (experimental support not working yet)&lt;br /&gt;
&lt;br /&gt;
* Database size need is lower than &#039;&#039;&#039;1Mb per 100&#039;&#039;&#039; customers/suppliers registered into database.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= PHP = &lt;br /&gt;
* Min. required version: {{PHPMinVersion}}, Max {{PHPMaxVersion}}&lt;br /&gt;
* Support for user sessions must be enabled (it is the default value for PHP)&lt;br /&gt;
* PHP configuration must allow use of {{PHPMinMemory}}Mb of memory (parameter PHP memory_limit).&lt;br /&gt;
* Works however magick_quotes parameter is set&lt;br /&gt;
* Works however register_globals parameter is set&lt;br /&gt;
* Works however safe_mode parameter is set&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Oldest versions&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dolibarr 9.0.x&#039;&#039;&#039;&lt;br /&gt;
* min. required version: PHP 5.4+&lt;br /&gt;
* max version: PHP 7.3&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dolibarr 8.0.x&#039;&#039;&#039;&lt;br /&gt;
* min. required version: PHP 5.4+&lt;br /&gt;
* max version: PHP 7.2&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dolibarr 7.0.x&#039;&#039;&#039;&lt;br /&gt;
* min. required version: PHP 5.3+&lt;br /&gt;
* max version: PHP 7.2&lt;br /&gt;
&lt;br /&gt;
= Disk storage = &lt;br /&gt;
&lt;br /&gt;
* Dolibarr program files use about &#039;&#039;&#039;150 MByte&#039;&#039;&#039; on disk. &lt;br /&gt;
* Extra Modules or Templates need some additional disk space. &lt;br /&gt;
* Dolibarr Database Files use about &#039;&#039;&#039;35 MByte&#039;&#039;&#039; on disk. &lt;br /&gt;
* Database-System itself need also some disk-space and more space for temporary files.&lt;br /&gt;
&lt;br /&gt;
However, it will need more disk space if you upload joined files or to store generated PDF or ODT documents. Storage will depend on number and size of attached files.&lt;br /&gt;
&lt;br /&gt;
= CPU =&lt;br /&gt;
You can start even with an old Intel Pentium processor or equal.&lt;br /&gt;
If you have more than 30 users, a 1GHz CPU or more is recommended.&lt;/div&gt;</summary>
		<author><name>Florian.mortgat</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Champs_personnalises&amp;diff=41456</id>
		<title>Champs personnalises</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Champs_personnalises&amp;diff=41456"/>
		<updated>2019-05-24T07:34:21Z</updated>

		<summary type="html">&lt;p&gt;Florian.mortgat: coquilles&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TemplateDocDevFr}}&lt;br /&gt;
= Extrafields =&lt;br /&gt;
&lt;br /&gt;
Extrafields permet d’ajouter d’autres données au schéma de base de données standard Dolibarr. Introduits dans la version 3.2, les extrafields sont maintenant implémentés dans la plupart des objets métier:&lt;br /&gt;
* Tiers et contacts&lt;br /&gt;
* Utilisateurs&lt;br /&gt;
* Événements&lt;br /&gt;
* Proposition&lt;br /&gt;
* Factures Clients&lt;br /&gt;
* Ordres&lt;br /&gt;
* Proposition du fournisseur&lt;br /&gt;
* Factures fournisseurs&lt;br /&gt;
* Commandes de fournisseurs&lt;br /&gt;
* Produits&lt;br /&gt;
* Membre &amp;amp; type de membre&lt;br /&gt;
* Projets et tâches du projet (depuis 3.4)&lt;br /&gt;
* Les catégories&lt;br /&gt;
* Rapport de dépenses &lt;br /&gt;
&lt;br /&gt;
= Mise en œuvre technique =&lt;br /&gt;
&lt;br /&gt;
Chaque objet a sa table dans la base de données pour stocker les valeurs de extrafields.&lt;br /&gt;
&lt;br /&gt;
== Modèles de tables extrafield de Datatables ==&lt;br /&gt;
&lt;br /&gt;
  llx_&#039;&#039;BaseTableNAme&#039;&#039;_extrafields&lt;br /&gt;
  rowid                     integer AUTO_INCREMENT PRIMARY KEY,&lt;br /&gt;
  tms                       timestamp,&lt;br /&gt;
  fk_object                 integer NOT NULL,&lt;br /&gt;
  import_key                varchar(14)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Un exemple de fichier de définition mysql pour l&#039;implémentation extrafields sur un objet:&lt;br /&gt;
&lt;br /&gt;
  créer la table llx_place_room_extrafields&lt;br /&gt;
  (&lt;br /&gt;
    rowid                     integer AUTO_INCREMENT PRIMARY KEY,&lt;br /&gt;
    tms                       timestamp,&lt;br /&gt;
    fk_object                 integer NOT NULL,&lt;br /&gt;
    import_key                varchar(14)                          		-- import key&lt;br /&gt;
  ) ENGINE=innodb;&lt;br /&gt;
&lt;br /&gt;
== Classe de chargement des extrafields ==&lt;br /&gt;
Pour utiliser extrafields, toutes les pages doivent inclure&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
require_once DOL_DOCUMENT_ROOT.&#039;/core/class/extrafields.class.php&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Charger un tableau extrafield dans un objet ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$extrafields = new ExtraFields($db);&lt;br /&gt;
$extralabels=$extrafields-&amp;gt;fetch_name_optionals_label($object-&amp;gt;table_element);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$ extralabels sera un tableau avec le code et l’étiquette des extrafields. &lt;br /&gt;
Ce code doit être placé dans la classe par exemple dans la fonction &amp;quot;write_file&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Charger extrafield dans l&#039;objet ==&lt;br /&gt;
&lt;br /&gt;
Les extra-champs sont chargés dans le tableau $object-&amp;gt;array_options.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$object-&amp;gt;fetch($rowid);&lt;br /&gt;
$object-&amp;gt;fetch_optionals($rowid,$extralabels);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ce code doit être placé juste après ce qui précède.&lt;br /&gt;
&lt;br /&gt;
== Afficher la valeur extrafield en PDF ou HTML ==&lt;br /&gt;
Après chargement extrafields&lt;br /&gt;
&lt;br /&gt;
Exemple HTML&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
print $object-&amp;gt;array_options [&#039;options_XXX&#039;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Où XXX est le code des extrafields&lt;br /&gt;
&lt;br /&gt;
Exemple PDF&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$pdf-&amp;gt;MultiCell (0,5, $outputlangs-&amp;gt;convToOutputCharset($object-&amp;gt;array_options [&#039;options_XXX&#039;]),0,&#039;L&#039;); )&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Où XXX est le code des extrafields&lt;br /&gt;
&lt;br /&gt;
== Afficher la valeur supplémentaire des lignes en PDF ou HTML ==&lt;br /&gt;
Après chargement extrafields&lt;br /&gt;
&lt;br /&gt;
Exemple HTML&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
print $object-&amp;gt;lines[$i]-&amp;gt;array_options[&#039;options_XXX&#039;];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Où XXX est le code des extrafields&lt;br /&gt;
&lt;br /&gt;
Exemple PDF&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$pdf-&amp;gt;MultiCell (0,5, $outputlangs-&amp;gt;convToOutputCharset($object-&amp;gt;lines[$i]-&amp;gt;array_options[&#039;options_XXX&#039;]),0,&#039;L&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Où XXX est le code des extrafields&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Avant l&#039;appel $object-&amp;gt;create() ou $object-&amp;gt;update() ==&lt;br /&gt;
&lt;br /&gt;
Les valeurs des extrafields envoyées par formulaire doivent être récupérées. Pour ce faire, utilisez cette méthode:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$ret = $extrafields-&amp;gt;setOptionalsFromPost($extralabels,$object);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Dans la page d&#039;édition pour afficher des champs supplémentaires ==&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$reshook=$hookmanager-&amp;gt;executeHooks(&#039;formObjectOptions&#039;,$parameters,$object,$action);    // Note that $action and $object may have been modified by hook&lt;br /&gt;
if (empty($reshook) &amp;amp;&amp;amp; ! empty($extrafields-&amp;gt;attribute_label))&lt;br /&gt;
{&lt;br /&gt;
      print $object-&amp;gt;showOptionals($extrafields,&#039;edit&#039;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Dans une page pour afficher des champs supplémentaires ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$reshook=$hookmanager-&amp;gt;executeHooks(&#039;formObjectOptions&#039;,$parameters,$object,$action);    // Note that $action and $object may have been modified by hook&lt;br /&gt;
if (empty($reshook) &amp;amp;&amp;amp; ! empty($extrafields-&amp;gt;attribute_label))&lt;br /&gt;
{&lt;br /&gt;
      print $object-&amp;gt;showOptionals($extrafields);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Après la méthode de récupération de cette classe d&#039;objet ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
require_once(DOL_DOCUMENT_ROOT.&#039;/core/class/extrafields.class.php&#039;);&lt;br /&gt;
$extrafields=new ExtraFields($this-&amp;gt;db);&lt;br /&gt;
$extralabels=$extrafields-&amp;gt;fetch_name_optionals_label($this-&amp;gt;table_element,true);&lt;br /&gt;
if (count($extralabels)&amp;gt;0) {&lt;br /&gt;
	$this-&amp;gt;fetch_optionals($this-&amp;gt;id,$extralabels);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Après la méthode Update de cette classe d&#039;objet : ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Actions sur des champs supplémentaires (par module externe ou code standard)&lt;br /&gt;
// FIXME le hook fait double emploi avec le trigger !!&lt;br /&gt;
$hookmanager-&amp;gt;initHooks(array(&#039;HookModuleNamedao&#039;));&lt;br /&gt;
$parameters=array(&#039;socid&#039;=&amp;gt;$this-&amp;gt;id);&lt;br /&gt;
$reshook=$hookmanager-&amp;gt;executeHooks(&#039;insertExtraFields&#039;,$parameters,$this,$action);    // Note that $action and $object may have been modified by some hooks&lt;br /&gt;
if (empty($reshook))&lt;br /&gt;
{&lt;br /&gt;
	if (empty($conf-&amp;gt;global-&amp;gt;MAIN_EXTRAFIELDS_DISABLED)) // For avoid conflicts if trigger used&lt;br /&gt;
	{&lt;br /&gt;
            $result=$this-&amp;gt;insertExtraFields();&lt;br /&gt;
            if ($result &amp;lt; 0)&lt;br /&gt;
            {&lt;br /&gt;
            	$error++;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
else if ($reshook &amp;lt; 0) $error++;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Après la méthode supprimer de cette classe d&#039;objet ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Suppression d&#039;extrafields&lt;br /&gt;
if (! $error)&lt;br /&gt;
{&lt;br /&gt;
      if (empty($conf-&amp;gt;global-&amp;gt;MAIN_EXTRAFIELDS_DISABLED)) // For avoid conflicts if trigger used&lt;br /&gt;
      {&lt;br /&gt;
      $result=$this-&amp;gt;deleteExtraFields();&lt;br /&gt;
      if ($result &amp;lt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        $error++;&lt;br /&gt;
        dol_syslog(get_class($this).&amp;quot;::delete erreur &amp;quot;.$errorflag.&amp;quot; &amp;quot;.$this-&amp;gt;error, LOG_ERR);&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pages d&#039;administration ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$elementtype=&#039;facture&#039;; // Doit être l&#039;élément $table_element de la classe qui gère extrafield&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Réparation de Base de données  ==&lt;br /&gt;
Rechercher et trouver la définition de $listofmodulesextra ajouter la nouvelle déclaration extrafield&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$listofmodulesextra=array(&#039;societe&#039;=&amp;gt;&#039;societe&#039;,&#039;adherent&#039;=&amp;gt;&#039;adherent&#039;,&#039;product&#039;=&amp;gt;&#039;product&#039;,&lt;br /&gt;
			&#039;socpeople&#039;=&amp;gt;&#039;socpeople&#039;, &#039;commande&#039;=&amp;gt;&#039;commande&#039;, &#039;facture&#039;=&amp;gt;&#039;facture&#039;,&lt;br /&gt;
			&#039;commande_fournisseur&#039;=&amp;gt;&#039;commande_fournisseur&#039;, &#039;actioncomm&#039;=&amp;gt;&#039;actioncomm&#039;,&lt;br /&gt;
			&#039;adherent_type&#039;=&amp;gt;&#039;adherent_type&#039;,&#039;user&#039;=&amp;gt;&#039;user&#039;,&#039;projet&#039;=&amp;gt;&#039;projet&#039;, &#039;projet_task&#039;=&amp;gt;&#039;projet_task&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Comment changer les étiquettes des colonnes lors de l&#039;utilisation de modèles (propals, etc.) ==&lt;br /&gt;
&lt;br /&gt;
Dans le code PHP du modèle, vous pouvez changer les étiquettes de votre extrafield en changeant la fonction &amp;quot;_tableau (...)&amp;quot;&lt;/div&gt;</summary>
		<author><name>Florian.mortgat</name></author>
	</entry>
</feed>