<?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=Kusco</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=Kusco"/>
	<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php/Special:Contributions/Kusco"/>
	<updated>2026-10-22T05:38:36Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.17</generator>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=List_of_modules_id&amp;diff=66283</id>
		<title>List of modules id</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=List_of_modules_id&amp;diff=66283"/>
		<updated>2026-05-18T17:38:17Z</updated>

		<summary type="html">&lt;p&gt;Kusco: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TemplateDocDevEn}}&lt;br /&gt;
{{TemplateDocDevEs}}&lt;br /&gt;
{{TemplateDocDevFr}}&lt;br /&gt;
{{TemplateDocDevZh}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This page list all reserved modules numbers / ID.&lt;br /&gt;
&lt;br /&gt;
If you build or want to build your own modules, you should take an ID range here. Please pick range into existing holes first.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=ID 0 - 94999=&lt;br /&gt;
This range is reserved for Dolibarr&#039;s internal core modules, so all modules available into the standard distribution at https://github.com/Dolibarr/dolibarr&lt;br /&gt;
&lt;br /&gt;
=ID 95000 - 99999=&lt;br /&gt;
This range is reserved for Dolibarr&#039;s community modules with sources hosted into the github repository: https://github.com/Dolibarr/dolibarr-community-modules&lt;br /&gt;
&lt;br /&gt;
=ID 100000 - 499999=&lt;br /&gt;
&lt;br /&gt;
Reserved area for editors in need for an ID range. You can edit this page to add your own range (take a range of 20 numbers only the first time, ask us for more)&lt;br /&gt;
&lt;br /&gt;
[[File:Warning.png]] If you reserve more than 20 at once, we may automatically change your reservation range without information and you may experience conflicts with other modules in a future, so please follow the rules! &lt;br /&gt;
&lt;br /&gt;
*ID 100000 - 100999: OpenThink (http://www.openthink.be) - Belgium&lt;br /&gt;
*ID 101000 - 101999: DoliCloud (https://www.dolicloud.com) - France&lt;br /&gt;
*ID 102000 - 102999: Tiaris (http://www.tiaris.fr) - France&lt;br /&gt;
*ID 103000 - 103999: Open-concept.pro (http://www.open-concept.pro) - France&lt;br /&gt;
*ID 104000 - 104999: ATM Consulting (http://www.atm-consulting.fr) - France&lt;br /&gt;
*ID 105000 - 105999: GPC.solutions - France&lt;br /&gt;
*ID 106000 - 106999: PHPASSO&lt;br /&gt;
*ID 107000 - 107999: TecLib (http://www.teclib.com) / Auguria (http://www.auguria.net) - France&lt;br /&gt;
*ID 108000 - 108999: ETHICWEB&lt;br /&gt;
*ID 109000 - 109999: Aplose ([http://www.aplose.fr https://www.aplose.fr]) - France&lt;br /&gt;
*ID 110000 - 110999: Association Dolibarr (https://www.dolibarr.org)&lt;br /&gt;
*ID 111000 - 111999: Asset IT (www.assetit.ch) - Suisse&lt;br /&gt;
*ID 112000 - 112999: Aarboard AG (www.aarboard.ch) - Suisse&lt;br /&gt;
*ID 113000 - 113999: Asilib - Alexandre Spangaro&lt;br /&gt;
*ID 114000 - 114999: Iceleaf OÜ&lt;br /&gt;
*ID 115000 - 115999: 2A2C Conseil - Cyril ZEKSER&lt;br /&gt;
*ID 116000 - 116999: Wolftec GmbH&lt;br /&gt;
*ID 117000 - 117999: Oscim (http://www.oscim.fr)&lt;br /&gt;
*ID 118000 - 118999: Oarces Web (dev.oarces.com)&lt;br /&gt;
*ID 119000 - 119999: Manuel Berrocal - Absolacom&lt;br /&gt;
*ID 120000 - 120999: Régis Houssin (http://www.inodbox.com) - France&lt;br /&gt;
*ID 121000 - 121999: Oscss - Shop - France&lt;br /&gt;
*ID 122000 - 122999: MrSof - la Nation du Web&lt;br /&gt;
*ID 123000 - 123999: Bruno Généré (webiseasy.org)&lt;br /&gt;
*ID 124000 - 124999: 7reasons s.r.l. (www.7reasons.eu) - Austria&lt;br /&gt;
*ID 125000 - 125999: ProgSI (www.progsi.ma)&lt;br /&gt;
*ID 126000 - 126999: Catalanet&lt;br /&gt;
*ID 127000 - 127999: Virgilio Filho pt-BR Brasil (@dolibarr.br) - Brazil&lt;br /&gt;
*ID 128000 - 128999: Nicolas Frappé France (www.sospc.info)&lt;br /&gt;
*ID 129000 - 129999: Adeo-Informatique&lt;br /&gt;
*ID 130000 - 130999: Technicks ICT (http://www.technicks.eu) - Italy&lt;br /&gt;
*ID 131000 - 131999: Joan Louis (itaca.fr) - France&lt;br /&gt;
*ID 132000 - 132999: Jean-Marie Arsac (https://azimut.fr) - France&lt;br /&gt;
*ID 133000 - 133999: Oriel Systems Ltd, UK. (www.orielsystems.com)&lt;br /&gt;
*ID 134000 - 134999: ALSOFT PVT. LTD. (https://www.alsoft.org)&lt;br /&gt;
*ID 135000 - 135999: Net-Logic (https://netlogic.fr)&lt;br /&gt;
*ID 136000 - 136050: MONA.RE - France&lt;br /&gt;
*ID 136051 - 136099: La Vida Marketing&lt;br /&gt;
*ID 136100 - 136149: Synergies-Tech France. (https://www.synergies-france.fr/)&lt;br /&gt;
*ID 136150 - 136199: Lyta&lt;br /&gt;
*ID 136200 - 136219: Maison Théophile Leclerc&lt;br /&gt;
*ID 136220 - 136270: SegoFount - Spain&lt;br /&gt;
*ID 136271 - 136320: Labor Dispatch (Simon Sheng , China)&lt;br /&gt;
*ID 136321 - 136370: MB Informatique (https://www.mb-informatique.fr)&lt;br /&gt;
*ID 136371 - 136420: Daxit Solutions (https://www.daxit.be) [https://wiki.dolibarr.org/index.php/DAXIT-SOLUTIONS_List_of_modules_id Liste complète des modules Daxit]&lt;br /&gt;
*ID 136421 - 136470: HUSCH GmbH (https://husch-gmbh.de)&lt;br /&gt;
*ID 136471 - 138999: NSINFO (https://www.ns-info.fr)&lt;br /&gt;
*ID 139000 - 139999: Synergies-Tech France. (https://www.synergies-france.fr/)&lt;br /&gt;
*ID 140000 - 140999: Altairis (http://altairis.fr)&lt;br /&gt;
*ID 141000 - 141050: Projet2Team (https://www.projet2team.fr)&lt;br /&gt;
*ID 141051 - 141099: Elistair (http://elistair.com)&lt;br /&gt;
*ID 141100 - 141149: Blue Networks Technologies (https://www.blnt.fr)&lt;br /&gt;
*ID 141150 - 141199: Mainlab S.r.l. (https://www.mainlabonline.it) - Italy&lt;br /&gt;
*ID 141200 - 141249: Florian DUFOURG - France&lt;br /&gt;
*ID 141250 - 141299: SoftAddicts - Canada&lt;br /&gt;
*ID 141300 - 141349: Finanboo - (https://www.finanboo.com)&lt;br /&gt;
*ID 141350 - 141399: ConstruxZion Soft - Colombia (https://www.construxzionsoft.com.co)&lt;br /&gt;
*ID 141400 - 141450: COEXDIS - République Démocratique du Congo (https://www.coexdis.com)&lt;br /&gt;
*ID 141451 - 141501: HALFWARE - Algeria (https://www.half-ware.com)&lt;br /&gt;
*ID 141502 - 141552: Quantraum (https://quantraum.com)&lt;br /&gt;
*ID 141553 - 141603: Nateo Group&lt;br /&gt;
*ID 141604 - 141653: digital centric GmbH (https://www.digitalcentric.de/dolibarr)&lt;br /&gt;
*ID 141654 - 141699: Decrypting (https://www.decrypting.fr)&lt;br /&gt;
*ID 141700 - 141749: Zeise IT Consulting - Germany (https://www.zeise-it.de)&lt;br /&gt;
*ID 141750 - 141799: Data Rooster - France (https://datarooster.io)&lt;br /&gt;
*ID 141800 - 141849: IP Développement (https://www.ipdeveloppement.fr)&lt;br /&gt;
*ID 141850 - 141899: MSICCA | MRVL Soluciones de Ingeniería y Construcción, c.a (https://msicca.com)&lt;br /&gt;
*ID 141900 - 141949: THERSANE (https://www.thersane.fr)&lt;br /&gt;
*ID 141950 - 141999: MB Informatique (https://www.mb-informatique.fr)&lt;br /&gt;
*ID 142000 - 142049: ITANéA (https://www.itanea.fr)&lt;br /&gt;
*ID 142050 - 142099: ERP Consulting NZ ([https://www.erpconsulting.co.nz www.erpconsulting.co.nz])&lt;br /&gt;
*ID 142100 - 142149: Bloxera GmbH (https://www.bloxera.com)&lt;br /&gt;
*ID 142150 - 142199: Evangelos Souglakos - Greece&lt;br /&gt;
*ID 142200 - 142249: Luc CALARESU - France&lt;br /&gt;
*ID 142250 - 142299: OmnIT Services - Belgique (https://www.omnitservices.biz)&lt;br /&gt;
*ID 142300 - 142349: Gwadeyes - Guadeloupe (https://www.gwadeyes-informatique.com/)&lt;br /&gt;
*ID 142350 - 142399: Solution Libre (https://www.solution-libre.fr/)&lt;br /&gt;
*ID 142400 - 142449: Res Digital (https://res.digital)&lt;br /&gt;
*ID 142450 - 142499: itopie informatique (https://www.itopie.ch)&lt;br /&gt;
*ID 142500 - 142549: Weblinx.IT GbR (https://weblinx.it/) - Germany&lt;br /&gt;
*ID 142550 - 142599: ASCI-Automation - Mexico (https://asci-automation.com.mx/)&lt;br /&gt;
*ID 142600 - 142649: ZENKO Design - Japan / France / Spain&lt;br /&gt;
*ID 142650 - 142699: AWeerWolf&lt;br /&gt;
*ID 142700 - 148749: Lysis (https://lysis.net/)&lt;br /&gt;
*ID 142750 - 142769: Doliplug (https://www.doliplug.com)&lt;br /&gt;
*ID 142770 - 142799: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 142800 - 142849: Bloxera GmbH (https://www.bloxera.com)&lt;br /&gt;
*ID 142850 - 148999: Everlats S.L. - España (https://www.everlats.com)&lt;br /&gt;
*ID 149000 - 149999: SydTech - America Central (https://www.sydtech.io/)&lt;br /&gt;
*ID 150000 - 150999: Jeffinfo&lt;br /&gt;
*ID 151000 - 151999: Konverseo (https://konverseo.com)&lt;br /&gt;
*ID 152000 - 152049: Tanguy Pénet (http://tanguype.net)&lt;br /&gt;
*ID 152050 - 152099: Web Solutions&lt;br /&gt;
*ID 152100 - 152149: MagicNet (https://www.magicnet.it)&lt;br /&gt;
*ID 152150 - 152199: Benjamin Falière (https://www.faliere.com)&lt;br /&gt;
*ID 152200 - 152249: Solauv&lt;br /&gt;
*ID 152250 - 156499: TecnoGestión Principado S.L. (https://www.tecnogestion.com) - Asturias - España&lt;br /&gt;
*ID 156500 - 156549: ACE Recycling  (https://www.acerecycling.net.au/)&lt;br /&gt;
*ID 156550 - 156599: Kreativität Works ([http://www.kreativitat.com http://kreativitat.com])&lt;br /&gt;
*ID 156600 - 156649: [https://pierre-couy.dev Pierre Couy]&lt;br /&gt;
*ID 156650 - 156699: CXI (https://cyrix.co.za)&lt;br /&gt;
*ID 156700 - 156749: Mustafa Kemerci - Turkiye&lt;br /&gt;
*ID 156750 - 156799: [https://de-grandpre.quebec de Grandpré Technologies] - Québec (Canada)&lt;br /&gt;
*ID 156800 - 156849: Draceo&lt;br /&gt;
*ID 156850 - 156899: Valleiweb&lt;br /&gt;
*ID 156900 - 159949: NEOVIAQ Advisory LU(https://www.neoviaq.com)&lt;br /&gt;
*ID 159950 - 159999: Arve et Giffre INFOGESTION (https://www.ag-infogestion.fr)&lt;br /&gt;
*ID 160000 - 160999: Charles-François BENKE (http://www.patas-monkey.com)&lt;br /&gt;
*ID 161000 - 161999: Abbes Bahfir (https://01consulting.eu)&lt;br /&gt;
*ID 162000 - 162999: Jacques Rébiscoul&lt;br /&gt;
*ID 163000 - 163999: Open-DSI (https://www.open-dsi.fr)&lt;br /&gt;
*ID 164000 - 164999: Pixelada S. Coop. And. (https://pixelada.org)&lt;br /&gt;
*ID 165000 - 165049: DovConnect&lt;br /&gt;
*ID 165050 - 165099: Mind Operated Systems (https://www.mosystems.biz)&lt;br /&gt;
*ID 165100 - 165150: SD-Formation (https://sdformation.fr)&lt;br /&gt;
*ID 165151 - 165199: NUM&#039;X (https://www.numx-sets.eu)&lt;br /&gt;
*ID 165200 - 165249: Benjam Préjent (https://www.benjam-prejent.fr)&lt;br /&gt;
*ID 165250 - 165299: Dhi Loka Private Limited, India (https://www.dhiloka.com)&lt;br /&gt;
*ID 165300 - 169999: Accellier Limited (https://www.accellier.com/)&lt;br /&gt;
*ID 170000 - 170999: TRIDENT CONSULTING LTD (www.tridentdxb.com)&lt;br /&gt;
*ID 171000 - 171999: LVSInformatique (www.lvsinformatique.com)&lt;br /&gt;
*ID 172000 - 172299: Ray Soft-Systems (https://www.ray-soft-systems.com)&lt;br /&gt;
*ID 172300 - 172349: Günter Lukas Consulting (https://gl.co.at)&lt;br /&gt;
*ID 172350 - 172399: MB Informatique (https://www.mb-informatique.fr)&lt;br /&gt;
*ID 172400 - 172449: Professional Structures Limited (https://pstructures.com)&lt;br /&gt;
*ID 172450 - 172699: IT-BS (https://www.it-bs.fr)&lt;br /&gt;
*ID 172700 - 172749: Indelog (https://www.indelog.fr)&lt;br /&gt;
*ID 172750 - 172799: NSINFO (https://www.ns-info.fr)&lt;br /&gt;
*ID 172800 - 172849: E-Concept Applications (https://e-concept-applications.fr)&lt;br /&gt;
*ID 172850 - 172899: B&amp;amp;R Stamm UG (https://stamm-ug.de)&lt;br /&gt;
*ID 172900 - 172949: Dolipive, support@dolipive.fr, www.dolipive.fr&lt;br /&gt;
*ID 172950 - 172999: CKD-Industrie (https://ckd-industrie.com/) - France&lt;br /&gt;
*ID 173000 - 173049: Aneosys (https://aneosys.fr) - France&lt;br /&gt;
*ID 173050 - 173099: Sebastian Schloßer - Germany&lt;br /&gt;
*ID 173100 - 173149: TecnoSoluciones (https://tecnosoluciones.com)&lt;br /&gt;
*ID 173150 - 173199: Digitalworks (https://www.digitalworks.fr) - France&lt;br /&gt;
*ID 173200 - 173249: UNi.D Consulting (https://www.unid-consulting.fr) - France&lt;br /&gt;
*ID 173250 - 173299: NetworkDigital(https://www.networkdigital.fr) - France&lt;br /&gt;
*ID 173300 - 173300: Módulo VeriFactu Dolibarr (https://verifactudolibarr.es/) - España&lt;br /&gt;
*ID 173301 - 173320: Sibanet (https://sibanet.net) - España&lt;br /&gt;
*ID 173321 - 173340: disQutons (https://wiki.dolibarr.org/index.php/Category:DisQutons) - France&lt;br /&gt;
*ID 173341 - 173360: Surática Software (https://suratica.es) - Spain&lt;br /&gt;
*ID 173361 - 173380: UpInvoice (https://upinvoice.eu) - Spain&lt;br /&gt;
*ID 173381 - 179999: Toutatis (https://toutatis.eu)&lt;br /&gt;
*ID 180000 - 180999: BM eXpert Labs&lt;br /&gt;
*ID 181000 - 181999: TI Sin Problemas (https://www.tisinproblemas.com)&lt;br /&gt;
*ID 182000 - 182049: Chipserv Pawel Wlizlo (https://www.testware.it)&lt;br /&gt;
*ID 182050 - 182070: Herolapse (https://herolapse.com/)&lt;br /&gt;
*ID 182061 - 182999: TMC&lt;br /&gt;
*ID 183000 - 183999: BB2A Anthony Berton (https://www.bb2a.fr)&lt;br /&gt;
*ID 184000 - 184999: DPS PRINTING &amp;amp; DOCUMENTS SOCIEDAD ANONIMA (https://www.dps-lat.com)&lt;br /&gt;
*ID 185000 - 185049: Telioskour (https://github.com/telioskour)&lt;br /&gt;
*ID 185050 - 185099: Moko Consulting ([[Moko Consulting]] || https://mokoconsulting.tech)&lt;br /&gt;
*ID 185100 - 185149: Sinabe (https://sinabe.ch) - Suisse&lt;br /&gt;
*ID 185150 - 185169: Anatole Conseil (https://anatoleconseil.com/)&lt;br /&gt;
*ID 185170 - 185189: cferoiu&lt;br /&gt;
*ID 185190 - 185209: Guillemonde (https://guillemonde.family)&lt;br /&gt;
*ID 185210 - 185229: ITized - Finta Ionut (https://itized.com)&lt;br /&gt;
*ID 185230 - 185249: svewa (https://github.com/svewa/)&lt;br /&gt;
*ID 185250 - 185269: Clément Jaunay (https://clement-jny.fr/ || contact@clement-jny.fr)&lt;br /&gt;
*ID 185270 - 185289: AMB Technologies (https://www.ambts.fr)&lt;br /&gt;
*ID 185290 - 185299: VIOLET IT UG (https://violet-it.de)&lt;br /&gt;
*ID 185300 - 185319: lorem.site &#039;&#039;&#039;(&#039;&#039;&#039;https://lorem.site/&#039;&#039;&#039;)&#039;&#039;&#039;&lt;br /&gt;
*ID 185320 - 185340: Rentageek  (https://rentageek.hu) Hungary&lt;br /&gt;
*ID 185341 - 185360: Hamzavi Infotech (&amp;lt;nowiki&amp;gt;https://www.hamzaviinfotech.com&amp;lt;/nowiki&amp;gt;)&lt;br /&gt;
*ID 185361 - 185380: La souris de Gutenberg (&amp;lt;nowiki&amp;gt;https://www.lasourisdegutenberg.fr&amp;lt;/nowiki&amp;gt;)&lt;br /&gt;
*ID 185381 - 185400: LodinPay (https://www.lodinpay.io)&lt;br /&gt;
*ID 185401 - 185420: Avertissance (https://avertissance.fr). France&lt;br /&gt;
*ID 185421 - 185849: TH Investissements / Matelas No Stress - France (internal ERP / production / logistics modules)&lt;br /&gt;
*ID 185850 - 185899: B&amp;amp;R Stamm UG (&amp;lt;nowiki&amp;gt;https://stamm-ug.de&amp;lt;/nowiki&amp;gt;)&lt;br /&gt;
*ID 185900 - 185919: OpenLine Solutions - Olaf John (https://openlinesolutions.de) - Germany&lt;br /&gt;
*ID 185920 - 189999: Abadia Tecnologica - (https://abadiatecnologica.com) - Spain&lt;br /&gt;
*ID 190000 - 190999: Diciannove (http://19.coop)&lt;br /&gt;
*ID 191000 - 191999: Elonet (https://elonet.fr)&lt;br /&gt;
*ID 192000 - 192049: IDFOR Consulting (https://www.idfor-consulting.fr/)&lt;br /&gt;
*ID 192050 - 192069: Stogger (&amp;lt;nowiki&amp;gt;https://stogger.com&amp;lt;/nowiki&amp;gt;)&lt;br /&gt;
*ID 192070 - 192090: Protectora&lt;br /&gt;
*ID 192091 - 192110: CoopCircuits - OpenFoodNetwork (https://coopcircuits.fr/)&lt;br /&gt;
*ID 192111 - 192130: Saidigit - Belgique&lt;br /&gt;
*ID 192131 - 192150: Lia Concept (https://lia-concept.fr)&lt;br /&gt;
*ID 192151 - 192999: GHM LABS (https://ghm-labs.ma/)&lt;br /&gt;
*ID 193000 - 193020: Forlead (https://forlead.fr/)&lt;br /&gt;
*ID 193021 - 193041: Doliway (https://doliway.fr)&lt;br /&gt;
*ID 193042 - 193062: ERPkit ( https://erpkit.app )&lt;br /&gt;
*ID 193063 - 193083: Eric FALCON&lt;br /&gt;
*ID 193084 - 193103: Ienx2&lt;br /&gt;
*ID 193104 - 193123: OpenLine Solutions - Olaf John (https://openlinesolutions.de) - Germany&lt;br /&gt;
*ID 193124 - 193899 &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 199000 - 199999: RFMS&lt;br /&gt;
*ID 200000 - 200999: Noxiome&lt;br /&gt;
*ID 201000 - 201999: Sasa Ostrouska (saxa)&lt;br /&gt;
*ID 202000 - 202999: Z-Application&lt;br /&gt;
*ID 203000 - 203099: Elidee - elidee.com&lt;br /&gt;
*ID 203100 - 203999: Garcia MICHEL (soamichel.fr)&lt;br /&gt;
*ID 204000 - 204999: Ari Elbaz elarifr - accedinfo.com&lt;br /&gt;
*ID 205000 - 205999: Kreiz IT&lt;br /&gt;
*ID 206000 - 206999: GBINFO (www.gbinfo.fr)&lt;br /&gt;
*ID 207000 - 207099: MacroProg (https://www.macroprog.com)&lt;br /&gt;
*ID 207100 - 207149: Reactiva Software&lt;br /&gt;
*ID 207150 - 207199: Ndejje University Water Research and Development Centre ([https://github.com/NDUWRDC/LIMS/])&lt;br /&gt;
*ID 207200 - 207299: Massaoud Bouzenad ([https://www.dzprod.net dzprod.net])&lt;br /&gt;
*ID 207300 - 207349: Ksar&lt;br /&gt;
*ID 207350 - 207399: Easylinux (www.easylinux.fr)&lt;br /&gt;
*ID 207400 - 207449: Arthur LENOBLE&lt;br /&gt;
*ID 207450 - 207499: Vaicop SAS de CV (México)&lt;br /&gt;
*ID 207500 - 207520: Frankie Wong - UK&lt;br /&gt;
*ID 207521 - 207540: Fyssec ([https://fyssec.fr/ fyssec.fr/])&lt;br /&gt;
*ID 207541 - 207560: My easy Office SAS ([https://www.myeasyoffice.fr www.myeasyoffice.fr])&lt;br /&gt;
*ID 207561 - 207580: All-Lock Védelem Kft.&lt;br /&gt;
*ID 207581 - 209199: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 210000 - 210100: Lemon (https://hellolemon.fr)&lt;br /&gt;
*ID 210101 - 212099: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 212100 - 212149: Audio Vidéo Technologies (https://www.avtek.fr)&lt;br /&gt;
*ID 212150 - 212169: AI MYA GROUP ([https://Www.AI-MYA-GROUP.com www.AI-MYA-GROUP.com])&lt;br /&gt;
*ID 212170 - 213999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 214000 - 214049: X-Boss&lt;br /&gt;
*ID 214050 - 221999: PixelJM&lt;br /&gt;
*ID 220000 - 220050: Apex Tech (https://apextechmods.com)&lt;br /&gt;
*ID 220051 - 220100: Technology Xchange Solutions (https://www.txscorp.com)&lt;br /&gt;
*ID 222000 - 222999:  dolibit  (https://www.dolibit.de)&lt;br /&gt;
*ID 223000 - 223049: Tráfico Canada&lt;br /&gt;
*ID 223050 - 223099: VLTN (https://vltn.sh)&lt;br /&gt;
*ID 223100 - 229949: Dazax.io (https://www.dazax.io)&lt;br /&gt;
*ID 229950 - 229999: Solucions Informàtiques, Serveis i Innovació SLU (https://6innova.es)&lt;br /&gt;
*ID 230000 - 230049: Unareil (https://www.unareil.eu)&lt;br /&gt;
*ID 230050 - 230099: Lyra Network (https://www.lyra.com/)&lt;br /&gt;
*ID 230100 - 230149: Gheorghe Iftimi - CTW - RO&lt;br /&gt;
*ID 230150 - 230199: MEMA Machinery &amp;amp; Tools (https://www.mema.be)&lt;br /&gt;
*ID 230200 - 230249: Teleassist&lt;br /&gt;
*ID 230250 - 230299: Nh Developer&lt;br /&gt;
*ID 230300 - 230499: Chickenforce/code-chicken, IT Services Hahn (https://github.com/code-chicken [http://itservices-hahn.de/ https://itservices-hahn.de])&lt;br /&gt;
*ID 230500 - 230549: Hidup Consulting (https://consulting.hidup.io)&lt;br /&gt;
*ID 230550 - 230599: CMR Conseil (https://www.weblockup.fr)&lt;br /&gt;
*ID 230600 - 230649: aFreeMind Studio&lt;br /&gt;
*ID 230650 - 230699: Unideal (https://www.uni-deal.com)&lt;br /&gt;
*ID 230700 - 230749: DevLansdes (https://devlandes.com/)&lt;br /&gt;
*ID 230750 - 230769  Kristof56 / Serpette &amp;amp; Cie /&lt;br /&gt;
*ID 230770 - 262699: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 231200 - 231219: Mugisha || Modules ERP personnalisés (facturation, RH, intégration)&lt;br /&gt;
*ID 250000 - 250019: Barnecki Spirits (https://github.com/Barnecki)&lt;br /&gt;
*ID 262700 - 262799: Scopen (https://www.scopen.fr)&lt;br /&gt;
*ID 262800 - 262849: Christophe BATTAREL EI&lt;br /&gt;
*ID 262850 - 262870: Nicolaus Hofer - Autriche&lt;br /&gt;
*ID 262871 - 271799: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 271800 - 271849: bee solutions sàrl (Switzerland)&lt;br /&gt;
*ID 271850 - 272999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 273000 - 273019: Taler (https://taler.net)&lt;br /&gt;
*ID 273020 - 274199: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 274200 - 274249: Mathilde MAROCCO (https://mminformatique.fr)&lt;br /&gt;
*ID 274250 - 274299: Nerv Project (www.nerv-project.eu)&lt;br /&gt;
*ID 274300 - 274349: Knowhere Consulting S.L. (https://www.knowhere-consulting.eu)&lt;br /&gt;
*ID 274350 - 274399: Milen karaganski (https://blacktiehost.com)&lt;br /&gt;
*ID 274400 - 274449: Vincent MAURY ([https://www.timgroup.fr www.timgroup.fr])&lt;br /&gt;
*ID 274450 - 274499: Daraelmin&lt;br /&gt;
*ID 274500 - 274549: Emilie LAFORET (http://www.ermvallon.com)&lt;br /&gt;
*ID 274550 - 278999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 279000 - 279049: VSDigital Electronics (https://vsdigital.ar) - Argentina&lt;br /&gt;
*ID 279050 - 279999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 280000 - 280049: Bingroup (https://www.beinng.com)&lt;br /&gt;
*ID 280050 - 280099: Medialta (https://medialta.com)&lt;br /&gt;
*ID 280100 - 280149: Cédric Ancelin - Ancode (https://www.dolistore.com/fr/recherche?search_query=ancode)&lt;br /&gt;
*ID 280150 - 280169: Rafael CF (https://virtualmachine.digital) - México&lt;br /&gt;
*ID 280170 - 289999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 290000 - 290099: BNS - Project doliBRA ([https://www.beinng.com https://www.bns.net.br]) - Brasil&lt;br /&gt;
*ID 290100 - 299999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 300000 - 300049: RapidProgress (https://www.rapidprogress.eu) - Bulgaria&lt;br /&gt;
*ID 300050 - 300099: M@ Solution (https://www.ma-solution.fr/)&lt;br /&gt;
*ID 300100 - 300149: LAVA RUN (https://www.lavarun.re)&lt;br /&gt;
*ID 300150 - 300199: PsyCrow Code&lt;br /&gt;
*ID 300200 - 300249: Computences (https://www.computences.com/)&lt;br /&gt;
*ID 300250 - 300299: LEVEL IT (https://levelit.com.ar)&lt;br /&gt;
*ID 300300 - 300349: Progiseize (https://progiseize.fr)&lt;br /&gt;
*ID 300350 - 300399: MB Informatique (https://www.mb-informatique.fr)&lt;br /&gt;
*ID 300400 - 300449: Anouar Touati&lt;br /&gt;
*ID 300450 - 300499: Martin Danger&lt;br /&gt;
*ID 300500 - 301499: Whale Blows&lt;br /&gt;
*ID 301500 - 301549: Tom Trust - International&lt;br /&gt;
*ID 301550 - 301599: MB Informatique (https://www.mb-informatique.fr)&lt;br /&gt;
*ID 301600 - 302479: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 302480 - 302499: akyras (https://akyras.fr)&lt;br /&gt;
*ID 302500 - 302549: Diamubi (https://diamubi.com)&lt;br /&gt;
*ID 302550 - 302599: Datolab (https://www.datolab.com)&lt;br /&gt;
*ID 302600 - 302649: DuMaCo (https://www.dumaco.de)&lt;br /&gt;
*ID 302650 - 302699: Resilio SA&lt;br /&gt;
*ID 302700 - 302749: Aroga&lt;br /&gt;
*ID 302750 - 302799: Productivix (https://www.productivix.com)&lt;br /&gt;
*ID 302800 - 302849: Slibzz&lt;br /&gt;
*ID 302850 - 302899: idea design (https://ideadesign.dz)&lt;br /&gt;
*ID 302900 - 302949: AL MISBAH INFORMATIQUE (https://www.almisbah.ma)&lt;br /&gt;
*ID 302950 - 302999: Atis Solutions - France&lt;br /&gt;
*ID 303000 - 303499: Obixav - Nigeria&lt;br /&gt;
*ID 303500 - 303549: buschler plus GmbH, Germany (https://buschler.plus)&lt;br /&gt;
*ID 303550 - 303599: Prestalidaire - France (https://prestalidaire.com)&lt;br /&gt;
*ID 303600 - 303619: Apertice - France (https://apertice.fr)&lt;br /&gt;
*ID 303620 - 309999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 310000 - 310049: Neilson Dufour (&amp;lt;nowiki&amp;gt;https://hypercode.ca&amp;lt;/nowiki&amp;gt;)&lt;br /&gt;
*ID 310050 - 313999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 314000 - 314049: Ruemmler IT Solutions (https://www.ruemmler.net)&lt;br /&gt;
*ID 314050 - 314149: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 314150 - 314199: Benoît PASCAL&lt;br /&gt;
*ID 314200 - 319999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 320000 - 320999: Novus Studios (www.novusstudios.it)&lt;br /&gt;
*ID 321000 - 321999: AtooNet (http://www.atoo-net.com)&lt;br /&gt;
*ID 322000 - 322049: Doymer Consultores&lt;br /&gt;
*ID 322050 - 329999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 330000 - 330049: XTEC Industries (www.xtec-ind.com)&lt;br /&gt;
*ID 330050 - 330099: 10100 S.R.L. - (www.10100.to)&lt;br /&gt;
*ID 330100 - 330149: AES Dana SRL (https://aes-dana.be)&lt;br /&gt;
*ID 330150 - 330199: Freshcore (https://www.freshcore.fr)&lt;br /&gt;
*ID 330200 - 331999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 332000 - 332099: Gecka (https://gecka.nc)&lt;br /&gt;
*ID 332100 - 332149: Agence Milkshake (http://agencemilkshake.com)&lt;br /&gt;
*ID 332150 - 332199: Daniel Prowald IT – Service (https://prowald-it.de)&lt;br /&gt;
*ID 332200 - 332249: UNITICE (https://unitice.com)&lt;br /&gt;
*ID 332250 - 332299: Sidonie Moulart&lt;br /&gt;
*ID 332300 - 332349: LTDJ (Antonin MARCHAL - Le Temple du Jeu)&lt;br /&gt;
*ID 332350 - 333299: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*ID 333300 - 333349: Sense Africa (http://sense.africa)&lt;br /&gt;
&lt;br /&gt;
*ID 333350 - 333369: Orion module&lt;br /&gt;
*ID 333370 - 339999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*ID 340000 - 340049: M34D (https://m34d.com)&lt;br /&gt;
*ID 340050 - 340069: WiwIT&lt;br /&gt;
*ID 340070 - 349999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 350000 - 350049: SOUNDOU &amp;amp; MIDAS (https://www.soundou.org/)&lt;br /&gt;
*ID 350050 - 350099: Ildefonso González (https://igontek.es)&lt;br /&gt;
*ID 350100 - 350149: 7Kas Servicios de Internet, S.L. (https://7kas.com)&lt;br /&gt;
*ID 350150 - 350169: Silias (https://silias.ch)&lt;br /&gt;
*ID 350170 - 350999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 351000 - 351049: P&#039;tite Tête (https://ptitetete.com) - France&lt;br /&gt;
*ID 351050 - 398999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 359000 - 359049: Milen Karaganski0&lt;br /&gt;
*ID 400000 - 400999: 2byte.es (http://www.2byte.es)&lt;br /&gt;
*ID 401000 - 401999: B&amp;amp;D Informática&lt;br /&gt;
*ID 402000 - 402999: Marcos García de La Fuente (marcosgdf)&lt;br /&gt;
*ID 403000 - 403999: Sergibyte&lt;br /&gt;
*ID 404000 - 404999: Aikhan&lt;br /&gt;
*ID 405000 - 405999: AIME (http://www.aime.mx)&lt;br /&gt;
*ID 406000 - 406999: Som Núvol (https://somnuvol.coop)&lt;br /&gt;
*ID 407000 - 407019: I-Motion SARL&lt;br /&gt;
*ID 407020 - 408999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 409000 - 409999: LliureTIC (https://www.lliuretic.cat)&lt;br /&gt;
*ID 410000 - 410999: DoliGov&lt;br /&gt;
*ID 411000 - 411049: GATTEK SARL (https://www.ga-ttek.com)&lt;br /&gt;
*ID 411050 - 419999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 420000 - 420099: BBS Concept&lt;br /&gt;
*ID 420100 - 420199: LeMousticProduction (www.lemousticproduction.info) -&amp;lt; module DoliRH&lt;br /&gt;
*ID 420200 - 421199: VatCheck (www.abnc.be)&lt;br /&gt;
*ID 421200 - 422199: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 422200 - 422999: Artaban (http://artaban.fr)&lt;br /&gt;
*ID 423000 - 423049: cyberesprit&lt;br /&gt;
*ID 423050 - 423099: R.Bossard&lt;br /&gt;
*ID 423100 - 423199: Joliciel (www.joliciel.fr)&lt;br /&gt;
*ID 423200 - 423299: Pragma-tech (www.pragma-tech.fr)&lt;br /&gt;
*ID 423299 - 423999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 424000 - 424049: Philazerty ([https://www.philazerty.fr www.philazerty.fr])&lt;br /&gt;
*ID 424050 - 424099: Pragma-tech (www.pragma-tech.fr)&lt;br /&gt;
*ID 424100 - 424149: Ohoo Solutions (http://www.ohoosolutions.com)&lt;br /&gt;
*ID 424150 - 424199: DAGARCAM Informática (https://www.dagarcam.com/)&lt;br /&gt;
*ID 424200 - 424999: Lab51 (https://github.com/lab51org)&lt;br /&gt;
*ID 425000 - 425999: Sébastien SERRE Thivinfo (www.thivinfo.com)&lt;br /&gt;
*ID 426000 - 426099: Arkesis-Solution&lt;br /&gt;
*ID 426100 - 426149: GetLandy (www.getlandy.com)&lt;br /&gt;
*ID 426150 - 426649: OOB Software&lt;br /&gt;
*ID 426650 - 426849: Soft-Task Serviços e Sistemas (www.soft-task.com.br)&lt;br /&gt;
*ID 426850 - 426999: Bruno Caldas (https://github.com/BCaldas)&lt;br /&gt;
*ID 427000 - 427999: Kevin GUERRIER (alias xcl.saian)&lt;br /&gt;
*ID 428000 - 428099: af83&lt;br /&gt;
*ID 428100 - 428199: Arnaud Serrut - Adalon&lt;br /&gt;
*ID 428200 - 428249: imschweiler consulting (http://www.imschweiler-consulting.de&#039;&#039;&#039;&amp;lt;nowiki/&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
*ID 428250 - 428299: AL1FO&lt;br /&gt;
*ID 428300 - 428349: Federico García-Patiño Barbolani (&amp;lt;federico.garcia.patino@gmail.com&amp;gt;)&lt;br /&gt;
*ID 428350 - 428399: INTM Groupe - France (www.intm.com)&lt;br /&gt;
*ID 428400 - 428449: Nick Fragoulis - Greece&lt;br /&gt;
*ID 428450 - 428499: Kontava - France ([https://kontava.fr kontava.fr)]&lt;br /&gt;
*ID 428500 - 428549: hkwhitten - USA&lt;br /&gt;
*ID 428550 - 428999: SmartOne&lt;br /&gt;
*ID 429000 - 429999: induslab&lt;br /&gt;
*ID 430000 - 430099: Mixity sprl (www.mixity.be)&lt;br /&gt;
*ID 430100 - 430199: sgiraud&lt;br /&gt;
*ID 430200 - 430299: Merlion TI (www.merlion-si.com.br)&lt;br /&gt;
*ID 430300 - 431299: Libre Expert (www.libre-expert.com)&lt;br /&gt;
*ID 431300 - 431399: ptibogxiv (www.ptibogxiv.net)&lt;br /&gt;
*ID 431400 - 431499: Befox (www.befox.fr)&lt;br /&gt;
*ID 431500 - 431599: rue Béjo (www.ruebejo.fr)&lt;br /&gt;
*ID 431600 - 431699: Avizzeo (www.avizzeo.com)&lt;br /&gt;
*ID 431700 - 432199: Multisistemas (www.multisistemas.com.sv)&lt;br /&gt;
*ID 432200 - 432399: Burbuja - Chile (www.burbuja.cl)&lt;br /&gt;
*ID 432400 - 433399: INOVEA CONSEIL (https://www.inovea-conseil.com)&lt;br /&gt;
*ID 433400 - 434399: Rachid HRICH - Maroc (HricH ServiceS.)&lt;br /&gt;
*ID 434400 - 435399: Lance Bleakley - LanceIT (www.lanceit.net)&lt;br /&gt;
*ID 435400 - 435419: Victorien LOS - France&lt;br /&gt;
*ID 435420 - 435439: Clément ESTREM - France&lt;br /&gt;
*ID 435440 - 435999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 436000 - 436099: SOWEBIO (www.soweb.io)&lt;br /&gt;
*ID 436100 - 436199: CAP-REL (www.cap-rel.fr)&lt;br /&gt;
*ID 436200 - 436300: TDE-INFORMATIQUE (www.tde-informatique.fr)&lt;br /&gt;
*ID 436301 - 436349: Evarisk ([https://www.evarisk.com/id-module-dolibarr/ www.evarisk.com])&lt;br /&gt;
*ID 436350 - 436399: Eoxia ([https://www.eoxia.com/dolibarr/modules/ www.eoxia.com])&lt;br /&gt;
*ID 436400 - 437399: Mohamed AHERDANE - Morocco - IT Consultant ( www.wave.ma )&lt;br /&gt;
*ID 437400 - 437449: Martin Neubauer - Germany&lt;br /&gt;
*ID 437450 - 437599: Club1click (www.club1click.es)&lt;br /&gt;
*ID 437600 - 437629: Coulon Vincent (https://github.com/HoverEpic)&lt;br /&gt;
*ID 437630 - 437649: Aytechnet (https://www.aytechnet.fr/) - François Pons&lt;br /&gt;
*ID 437650 - 437699: LibreMaster (https://libremaster.com) - Christophe T.&lt;br /&gt;
*ID 437700 - 437749: STELLAR Broadband (https://www.stellarbb.com) - U.S.A. - Philip Laycock&lt;br /&gt;
*ID 437750 - 437799: DIGITA.LU Ajous Solutions&lt;br /&gt;
*ID 437800 - 437850: iProspective (https://iprospective.fr) - Mathieu Moulin&lt;br /&gt;
*ID 437851 - 437900: Theobald Groupe.&lt;br /&gt;
*ID 437901 - 437950: Neuronnexion (http://neuronnexion.coop)&lt;br /&gt;
*ID 437951 - 437952: jmbc - APIA-ASSO (https://www.apia-asso.fr)&lt;br /&gt;
*ID 437953 - 438002: IPCZEN SARL (https://www.ipczeninformatique.fr/)&lt;br /&gt;
*ID 438003 - 438052: FESF IT Department (https://fesf.org.pk)&lt;br /&gt;
*ID 438053 - 438103: Pilot Engineering team&lt;br /&gt;
*ID 438104 - 438153: u2042 (https://u2042.com)&lt;br /&gt;
*ID 438154 - 438204: Djair E Pereira (ocultooooo@gmail.com) - Brasil&lt;br /&gt;
*ID 438205 - 438255: yoandm (https://yoandm.com)&lt;br /&gt;
*ID 438256 - 438299: PTMSoft (&amp;lt;nowiki&amp;gt;https://www.ptmsoft.fr&amp;lt;/nowiki&amp;gt;)&lt;br /&gt;
*ID 438300 - 438399: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 438400 - 439399: Tetras Libre - France - Développement logiciels libres (www.tetras-libre.fr)&lt;br /&gt;
*ID 439400 - 440399: Dolibarr-pro - France - Développement Dolibarr (www.dolibarr-pro.com)&lt;br /&gt;
*ID 440400 - 441399: Quidlab Co., Ltd - Thailand - ( www.quidlab.com )&lt;br /&gt;
*ID 441400 - 442399: Ide@log - France - (https://www.idealog-info.net) - Laurent Leblanc&lt;br /&gt;
*ID 442400 - 443399: Valerio Bianchi (www.valeriobianchi.com)&lt;br /&gt;
*ID 443400 - 444399: delassalle - France - (www.delassalle.fr) - Joseph Delassalle&lt;br /&gt;
*ID 444400 - 445399: Webartis - Maroc - (www.webartis.net) - François Dry&lt;br /&gt;
*ID 445400 - 445499: SCOP Au-delà des nuages - France&lt;br /&gt;
*ID 445500 - 445549: X Net Systems - Egypt - (https://www.xneteg.com)&lt;br /&gt;
*ID 445550 - 445569: Schiefer.IT - Austria ([https://schiefer.it schiefer.it])&lt;br /&gt;
*ID 445570 - 445999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 446000 - 446999: iouston (http://www.iouston.com) - France - Julien Marchand&lt;br /&gt;
*ID 447000 - 447999: rSanjoSEO - Rafael San José Tovar (www.rsanjoseo.com) - Spain&lt;br /&gt;
*ID 448000 - 448999: Code 42 (www.code42.fr)&lt;br /&gt;
*ID 449000 - 449999: TakePOS (www.takepos.com)&lt;br /&gt;
*ID 450000 - 450999: Pierre ARDOIN&lt;br /&gt;
*ID 451000 - 451999: Éditeur depordi.fr&lt;br /&gt;
*ID 452000 - 452999: Dylan NAKONG&lt;br /&gt;
*ID 453000 - 453999: Menahd Ouchenir - France - menahd-ouchenir.com&lt;br /&gt;
*ID 454000 - 454999: Withheld - Canada&lt;br /&gt;
*ID 455000 - 455999: Gaëtan MAISON - Info Libre @ Dom - France (https://www.infolibreadom.com)&lt;br /&gt;
*ID 456000 - 456999: Laurent LEBLEU - B.L.C. - Blue Line Company - Lille - France (www.bluelinecompany.fr/dolibarr)&lt;br /&gt;
*ID 457000 - 457999: Sébastien BOUCHER&lt;br /&gt;
*ID 458000 - 458999: Lester HERNÁNDEZ - Argentina - (freelancerlrhd@gmail.com)&lt;br /&gt;
*ID 459000 - 459999: Infopen - France&lt;br /&gt;
*ID 460000 - 460049: torvista - Spain&lt;br /&gt;
*ID 460050 - 460099: ADVAISION.com (Belgique www.advaision.com)&lt;br /&gt;
*ID 460100 - 460999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 461000 - 461999: MEGALOGI - Maroc (www.erpcloud.ma)&lt;br /&gt;
*ID 462000 - 462999: Making Digital (www.making-digital.fr) - France&lt;br /&gt;
*ID 463000 - 463999: linx s.r.l.s.&lt;br /&gt;
*ID 464000 - 464999: NimbleCubed Inc. (www.nimblecubed.com)&lt;br /&gt;
*ID 465000 - 465999: Artefacts (www.artefacts.coop) - Pascal Daugeron&lt;br /&gt;
*ID 466000 - 466999: CDM Consultores - (www.cdm.guru)&lt;br /&gt;
*ID 467000 - 467999: M71 Service GmbH - (www.m71-service.de)&lt;br /&gt;
*ID 468000 - 468049: Clément Segonzac - France (clement.segonzac@gmail.com)&lt;br /&gt;
*ID 468050 - 468099: Flavien Belli - France (https://github.com/Marshlyin || belliflaviencontactpro@gmail.com)&lt;br /&gt;
*ID 468100 - 468119: Chl (https://code.bugness.org/Dolibarr)&lt;br /&gt;
*ID 468120 - 468169: Commotron GmbH (https://www.commotron.com/)&lt;br /&gt;
*ID 468170 - 468219: Infans Group (franck.lauby@infans.fr)&lt;br /&gt;
*ID 468175 - 468199: Gaëlle Rauffet - France (kiwiscan.net)&lt;br /&gt;
*ID 468200 - 468249: Paulo Oliveira - Brasil (paulorcdo@gmail.com)&lt;br /&gt;
*ID 468250 - 468269: CD-Systems - France (https://www.cd-systems.fr)&lt;br /&gt;
*ID 468270 - 468299: Nicolas Testori&lt;br /&gt;
*ID 468300 - 468349: Uvensys - Germany (https://uvensys.de)&lt;br /&gt;
*ID 468350 - 468399: Laudeco - Belgium (http://github.com/laudeco)&lt;br /&gt;
*ID 468400 - 468449: Alexis LAURIER - France (https://www.alexislaurier.fr)&lt;br /&gt;
*ID 468450 - 468499: Mehdi Belkhayat - Maroc (https://opensi.ma)&lt;br /&gt;
*ID 468500 - 468599: InvIT GmbH - Germany (https://invit.sh)&lt;br /&gt;
*ID 468600 - 468649: Ricardo Sequeira - Portugal (https://ricardo-sequeira.com)&lt;br /&gt;
*ID 468650 - 468699: J-IT - Belgique (https://www.j-it.be)&lt;br /&gt;
*ID 468700 - 468749: Fidesio - France (https://www.fidesio.com/)&lt;br /&gt;
*ID 468750 - 468799: Sgestion - Spain (http://www.sgestion.net/)&lt;br /&gt;
*ID 468800 - 468849: Denis JULIEN - Brasil (matrinxa@free.fr)&lt;br /&gt;
*ID 468850 - 468899: Mmariko - Module GED - Effios&lt;br /&gt;
*ID 468900 - 468949: Maazou Amadou Abdoul aziz - Maroc (yaronfada@gmail.com)&lt;br /&gt;
*ID 468950 - 468999: Alexis LAURIER - France (https://www.alexislaurier.fr)&lt;br /&gt;
*ID 469000 - 469049: John Livingston (https://github.com/JohnXLivingston/)&lt;br /&gt;
*ID 469050 - 469099: Macrorom ICT-services (https://macrorom.nl/)&lt;br /&gt;
*ID 469100 - 469149: HABOT IT - France (https://habot.it)&lt;br /&gt;
*ID 469150 - 469159: CaribbeanConsult.Com CCC - France Guadeloupe (https://dolibarr.ccc.gp)&lt;br /&gt;
*ID 469160 - 469171: GMBG - Portugal&lt;br /&gt;
*ID 469172 - 469199: BGi Lda - Portugal&lt;br /&gt;
*ID 469200 - 469219: elsotec GmbH&lt;br /&gt;
*ID 469220 - 469949: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 469950 - 469999: Goldoweb (http://goldoweb.com)&lt;br /&gt;
*ID 470000 - 470999: Reindeer Digital (https://rdeer.cz)&lt;br /&gt;
*ID 471000 - 471099: CAP-REL (www.cap-rel.fr)&lt;br /&gt;
*ID 471100 - 471199: M. Morillon&lt;br /&gt;
*ID 471200 - 471209: Pablo Nuñez&lt;br /&gt;
*ID 471210 - 471249: FANEL A.Ş  (https://www.fanel.com.tr)&lt;br /&gt;
*ID 471250 - 480999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 481000 - 481999: Alhaidab-ITIS (https://alhaidab.dolibarr.sd)&lt;br /&gt;
*ID 482000 - 482999: Basix IT (https://www.basix.de)&lt;br /&gt;
*ID 483000 - 483049: SASCO SpA (https://www.sasco.cl)&lt;br /&gt;
*ID 483050 - 483099: WIP Engineering (https://www.wip-gmbh.com)&lt;br /&gt;
*ID 483100 - 483149: J.Kaiser&lt;br /&gt;
*ID 483150 - 483199: CodLines (https://www.codlines.com)&lt;br /&gt;
*ID 483200 - 483249: BleepalSoftware (https://bleepal.com)&lt;br /&gt;
*ID 485000 - 485049: Gest Info Service Plus (contact@gest-plus.fr)&lt;br /&gt;
*ID 485050 - 485069: DJOB&#039; Services&lt;br /&gt;
*ID 485070 - 489999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 490000 - 490049: VOLD (https://www.voldgroup.com)&lt;br /&gt;
*ID 490050 - 490249: QUANTIVO (http://quantivo.eu/)&lt;br /&gt;
*ID 490250 - 490299: VOLD (https://www.voldgroup.com)&lt;br /&gt;
*ID 490300 - 490999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 491000 - 491049: NORD ERP CRM (https://www.nord-erp-crm.fr/)&lt;br /&gt;
*ID 491050 - 491099: KJR-online (https://kjr-online.fr/)&lt;br /&gt;
*ID 491100 - 491149: eNova&lt;br /&gt;
*ID 491150 - 491199: App 4 Business&lt;br /&gt;
*ID 491200 - 491249: Mil24 (http://www.mil24.com.py)&lt;br /&gt;
*ID 491250 - 491299: M2AM&lt;br /&gt;
*ID 491300 - 491349: luigifab (https://github.com/luigifab), also reuse id:105009 for Sentry fork&lt;br /&gt;
*ID 491350 - 491399: Frédéric France (https://github.com/frederic34)&lt;br /&gt;
*ID 491400 - 491449: E-dem (https://www.e-dem.com/)&lt;br /&gt;
*ID 491450 - 491499: Burofree (https://burofreeai.es)&lt;br /&gt;
*ID 491500 - 491549: EMDELEN (https://emdelen.fr/)&lt;br /&gt;
*ID 491550 - 491599: eSoUrCeS Technologie (https://techno.esources.ca/) - Canada&lt;br /&gt;
*ID 491600 - 491649: GoSouce Peru - Peru&lt;br /&gt;
*ID 491650 - 491669: Kaféin Studio (https://kafein.studio) - France&lt;br /&gt;
*ID 491670 - 491699: Neykinfo  - France&lt;br /&gt;
*ID 491700 - 491999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 492000 - 492020: Anura (https://www.anura.fr/)&lt;br /&gt;
*ID 492021 - 492999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 493000 - 493020: Bourez Bastien EI (https://bastien-b.fr/)&lt;br /&gt;
*ID 493051 - 493071: benhmida ilyess (bhilyess98@gmail.com)&lt;br /&gt;
*ID 493101 - 493120: George TS, George SP (gspanos@makeasite.gr)&lt;br /&gt;
*ID 493200 - 493219: Stéphane Mallet (https://framagit.org/Steph501/dolibarr-mod-autoreminder)&lt;br /&gt;
*ID 493220 - 493239: TBNETSYS (www.tbnetsys.fr)&lt;br /&gt;
*ID 499001 - 499020: IT GENIUSES (https://www.itgeniuses.com)&lt;br /&gt;
*ID 499051 - 499071: KREATIV PROJECT MANAGEMENT&lt;br /&gt;
&lt;br /&gt;
DO NOT ADD RECORD HERE, PLEASE FILL HOLES FIRST !!!!&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
=ID &amp;gt; 500000=&lt;br /&gt;
&lt;br /&gt;
This range can&#039;t be reserved. It is a common range. If you don&#039;t plan to distribute your module, you can use an ID in this range with no need to reserve it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t already have reserved ids and need some, please don&#039;t use hazardous number and use a number higher than 500000, but it is better to ask a wiki account, and reserve your own range by editing the  100000 - 499999 range (20 ids at once).&lt;/div&gt;</summary>
		<author><name>Kusco</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Module_Coffre-fort&amp;diff=65992</id>
		<title>Module Coffre-fort</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Module_Coffre-fort&amp;diff=65992"/>
		<updated>2026-04-23T12:53:29Z</updated>

		<summary type="html">&lt;p&gt;Kusco: /* Informations */&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:Module_Subventions FR]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Complementary modules]]&lt;br /&gt;
[[Category:disQutons]]&lt;br /&gt;
[[Category:Nonprofit organization]]&lt;br /&gt;
{{TemplateDocDevEn}}&lt;br /&gt;
{{TemplateDocUser}}&lt;br /&gt;
=Informations=&lt;br /&gt;
{{TemplateModuleInfo&lt;br /&gt;
|modulename=Coffre-fort : Gestionnaire de mot de passe&lt;br /&gt;
|editor=[https://www.disqutons.fr disQutons]&lt;br /&gt;
|webbuy={{LinkToPluginDownloadDoliStore|keyword=coffre-fort-gestionnaire-de-mot-de-passe}}&lt;br /&gt;
|status=stable&lt;br /&gt;
|minversion=V22&lt;br /&gt;
|note=Module disponible en français, anglais, allemand, italien et espagnol.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Fonctionnalités=&lt;br /&gt;
Module permettant de stocker les identifiants et mots de passe :&lt;br /&gt;
&lt;br /&gt;
* Création de clé (utilisateur, mot de passe, url)&lt;br /&gt;
* Mots de passe cryptés en base de données&lt;br /&gt;
* Vérification des accès par utilisateur&lt;br /&gt;
&lt;br /&gt;
=Installation=&lt;br /&gt;
{{InstallModuleDoliStoreEn|keyword=subvention}}&lt;br /&gt;
&lt;br /&gt;
=Paramétrage=&lt;br /&gt;
{{ActivationModuleEn}}&lt;br /&gt;
&lt;br /&gt;
=Développement &amp;amp; Contributions=&lt;br /&gt;
Le développement de cette application Open Source n&#039;est pas inclus dans le dépôt GIT standard de Dolibarr, mais dans un dépôt dédié aux modules non pris en charge par l&#039;équipe de développement de Dolibarr&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
*Dépôt : https://github.com/disQutons/dolibarr_module_keyvault/&lt;br /&gt;
&lt;br /&gt;
Vos demandes de correction ou d&#039;amélioration sont les bienvenues.&lt;/div&gt;</summary>
		<author><name>Kusco</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Module_Coffre-fort&amp;diff=65991</id>
		<title>Module Coffre-fort</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Module_Coffre-fort&amp;diff=65991"/>
		<updated>2026-04-23T12:46:59Z</updated>

		<summary type="html">&lt;p&gt;Kusco: Création de la page liée au module&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:Module_Subventions FR]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Complementary modules]]&lt;br /&gt;
[[Category:disQutons]]&lt;br /&gt;
[[Category:Nonprofit organization]]&lt;br /&gt;
{{TemplateDocDevEn}}&lt;br /&gt;
{{TemplateDocUser}}&lt;br /&gt;
=Informations=&lt;br /&gt;
{{TemplateModuleInfo&lt;br /&gt;
|modulename=Suivi des subventions&lt;br /&gt;
|editor=[https://www.disqutons.fr disQutons]&lt;br /&gt;
|webbuy={{LinkToPluginDownloadDoliStore|keyword=subventions}}&lt;br /&gt;
|status=stable&lt;br /&gt;
|minversion=V21&lt;br /&gt;
|note=Module disponible en français, anglais, allemand, italien et espagnol.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Fonctionnalités=&lt;br /&gt;
Module permettant de stocker les identifiants et mots de passe :&lt;br /&gt;
&lt;br /&gt;
* Création de clé (utilisateur, mot de passe, url)&lt;br /&gt;
* Mots de passe cryptés en base de données&lt;br /&gt;
* Vérification des accès par utilisateur&lt;br /&gt;
&lt;br /&gt;
=Installation=&lt;br /&gt;
{{InstallModuleDoliStoreEn|keyword=subvention}}&lt;br /&gt;
&lt;br /&gt;
=Paramétrage=&lt;br /&gt;
{{ActivationModuleEn}}&lt;br /&gt;
&lt;br /&gt;
=Développement &amp;amp; Contributions=&lt;br /&gt;
Le développement de cette application Open Source n&#039;est pas inclus dans le dépôt GIT standard de Dolibarr, mais dans un dépôt dédié aux modules non pris en charge par l&#039;équipe de développement de Dolibarr&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
*Dépôt : https://github.com/disQutons/dolibarr_module_keyvault/&lt;br /&gt;
&lt;br /&gt;
Vos demandes de correction ou d&#039;amélioration sont les bienvenues.&lt;/div&gt;</summary>
		<author><name>Kusco</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=%E7%BF%BB%E8%AF%91%E6%96%87%E6%A1%A3&amp;diff=65907</id>
		<title>翻译文档</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=%E7%BF%BB%E8%AF%91%E6%96%87%E6%A1%A3&amp;diff=65907"/>
		<updated>2026-04-17T08:49:24Z</updated>

		<summary type="html">&lt;p&gt;Kusco: /* 使用Web界面（适用于翻译人员） */&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 : Translator_documentation --&amp;gt;&lt;br /&gt;
[[en:Translator_documentation]]&lt;br /&gt;
[[fr:Documentation_traducteur]]&lt;br /&gt;
[[es:Documentación_traductores]]&lt;br /&gt;
[[de:Dokumentation_Uebersetzung]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
{{#metamaster:keywords|translation, documentation, translator, localize, localization, i18n, internationalization, language}}&lt;br /&gt;
{{Template用户手册}}&lt;br /&gt;
{{TemplateMainPageZh}}&lt;br /&gt;
&lt;br /&gt;
=[[File:Language.png]] 翻译 Dolibarr 应用程序=&lt;br /&gt;
&lt;br /&gt;
Dolibarr的语言文件已经被翻译成多种语言。&lt;br /&gt;
英语是其默认的语言，并且其内容会始终保持完整。其他语言的文档是否完整依赖于自愿者的贡献。 本教程帮助您针对未被翻译或者翻译错误的文档完成语言翻译工作。&lt;br /&gt;
Dolibarr可以用三种不同的方式翻译：&lt;br /&gt;
&lt;br /&gt;
#手动使用Transifex （官方和推荐的方法）&lt;br /&gt;
#手动编辑语言文件&lt;br /&gt;
#全自动：自动翻译机&lt;br /&gt;
&lt;br /&gt;
==使用Transifex在线服务进行手动翻译（推荐）==&lt;br /&gt;
&lt;br /&gt;
Transifex 是一个为翻译项目提供在线平台的Web应用程序。它包括团队和讨论工具、翻译记忆库、词汇表、校对和许多其他功能。&lt;br /&gt;
它非常容易使用，所有翻译都可以通过Web界面或者使用TX客户端终端上传或下载。&lt;br /&gt;
Transifex 是一个开源项目，“社区版”可以免费下载和安装，但我们将使用在线托管服务。&lt;br /&gt;
&lt;br /&gt;
===使用Web界面（适用于翻译人员）===&lt;br /&gt;
如果你想帮忙把Dolibarr翻译成自己的语言，请进入该项目的页面 https://app.transifex.com/dolibarr-association/dolibarr/dashboard/&lt;br /&gt;
&lt;br /&gt;
然后，您可以注册一个帐户，并请求加入目标语言的项目团队。管理员会接受您的请求，所以请耐心等待。&lt;br /&gt;
&lt;br /&gt;
一旦被接受，您就可以马上开始翻译了。&lt;br /&gt;
&lt;br /&gt;
欲了解更多信息，请查阅网站 http://docs.transifex.com/introduction/translators/ 上的Transifex Getting Started（入门）介绍规范和网站 http://docs.transifex.com/tutorials/txeditor/ 上的web editor tutorial（编辑器向导）。&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;&#039;关于 en_US 的备注&#039;&#039;&#039;====&lt;br /&gt;
这个Web界面不能用来翻译源代码的en_US语言。&lt;br /&gt;
&lt;br /&gt;
对en_US语言的任何更改都必须在Dolibarr源代码中完成，并在我们的GitHub存储库上使用Pull Request提交。&lt;br /&gt;
&lt;br /&gt;
===使用TX 命令行客户端 (适用于管理员团队 [[:Category:Yoda]] )===&lt;br /&gt;
这部分描述了如何从命令行中使用Transifex。然而，这是保留给Dolibarr管理员用户（Yoda团队）的，用于将Transifex与Dolibarr主源码同步。&lt;br /&gt;
&lt;br /&gt;
更多信息请参考Transifex [http://docs.transifex.com/developer/client/ 官方文档]&lt;br /&gt;
&lt;br /&gt;
====TX 客户端设置====&lt;br /&gt;
首先要安装 TX 客户端，操作系统使用 Debian/Ubuntu/Mint:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
apt-get install python-pip&lt;br /&gt;
pip install transifex-client&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
然后你必须初始化你的TX环境。这是通过进入Dolibarr项目根目录运行 tx init &#039;&#039;来完成的。&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd git/dolibarr&lt;br /&gt;
tx init&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
接受覆盖配置文件。保留Transifex实例的默认值，然后输入您的Transifex登录名和密码。&lt;br /&gt;
&lt;br /&gt;
在此之后，一个.transifexrc文件已经创建到您的HOME目录，并且一个通用配置文件被创建为项目根目录中的&#039;&#039;&#039;.tx/config&#039;&#039;&#039;。&lt;br /&gt;
目录的内容看起来会是这样的：&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
|-- build&lt;br /&gt;
|-- build.xml&lt;br /&gt;
|-- ChangeLog&lt;br /&gt;
|-- COPYING&lt;br /&gt;
|-- COPYRIGHT&lt;br /&gt;
|-- dev&lt;br /&gt;
|-- doc&lt;br /&gt;
|-- .gitignore&lt;br /&gt;
|-- htdocs&lt;br /&gt;
|-- INSTALL&lt;br /&gt;
|-- pom.xml&lt;br /&gt;
|-- quickbuild.xml&lt;br /&gt;
|-- README&lt;br /&gt;
|-- README-FR&lt;br /&gt;
|-- README.md&lt;br /&gt;
|-- robots.txt&lt;br /&gt;
|-- scripts&lt;br /&gt;
|-- test&lt;br /&gt;
`-- .tx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
当前的配置文件可以从 https://github.com/Dolibarr/dolibarr/tree/develop/.tx 下载，将其放入.tx目录，覆盖由 tx init &#039;&#039;创建的配置文件。&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
此项目配置文件用于存储项目的详细信息和文件到资源的映射。&lt;br /&gt;
&lt;br /&gt;
这是配置文件包含的内容的示例：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[main]&lt;br /&gt;
host = https://www.transifex.com&lt;br /&gt;
lang_map = uz: uz_UZ&lt;br /&gt;
&lt;br /&gt;
[dolibarr.admin]&lt;br /&gt;
file_filter = htdocs/langs/&amp;lt;lang&amp;gt;/admin.lang&lt;br /&gt;
source_file = htdocs/langs/en_US/admin.lang&lt;br /&gt;
source_lang = en_US&lt;br /&gt;
type = MOZILLAPROPERTIES&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
下面是配置文件中使用的片段和选项的说明：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;[main] section&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在本片段中，我们有项目范围的选项，例如：所有项目的默认transifex主机。如果需要的话，这些可以被每个资源覆盖。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;[dolibarr.resource]&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
source_lang: 这是资源的源语言&amp;lt;br /&amp;gt;&lt;br /&gt;
source_file: 这直接指向源文件&amp;lt;br /&amp;gt;&lt;br /&gt;
file_filter: 在这里，我们保存用于标识特定项目下的翻译文件的表达式。&#039;&#039;非强制性&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
trans.&amp;lt;lang&amp;gt;: 这用于不遵循公共命名模式的翻译文件，并且文件表达式不能用于跟踪它们。&#039;&#039;非强制性&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
host: 如果项目不使用[main]片段中指定的默认Transifex服务器，它可以使用此选项覆盖它。&#039;&#039;非强制性&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====TX 客户端使用====&lt;br /&gt;
一些有用的 &#039;&#039;&#039;tx&#039;&#039;&#039; 命令。&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;tx status&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
显示翻译状态&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;tx push&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
用于将更改从你的计算机推送到Transifex服务器。&lt;br /&gt;
&lt;br /&gt;
tx push命令的其他选项包括：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
-h - 显示命令行帮助&lt;br /&gt;
-l &amp;lt;lang&amp;gt; - 指定要推送哪些翻译（默认为所有）&lt;br /&gt;
-r &amp;lt;resource&amp;gt; - 指定要向其推送翻译的资源（默认为所有）&lt;br /&gt;
-f - 在不修改修改时间的情况下推送源文件&lt;br /&gt;
--skip - 错误时不要停止。当同时推多个文件时很有用。&lt;br /&gt;
-s - 将源文件推送到服务器&lt;br /&gt;
-t - 将翻译文件推送到服务器&lt;br /&gt;
--no-interactive - 强制推送时不需要用户输入。&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;tx pull&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
用于将更改从Transifex服务器拉到您的计算机上。&amp;lt;br /&amp;gt;tx pull命令的其他选项包括：&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
-h - Shows the help screen for the command&lt;br /&gt;
-l &amp;lt;lang&amp;gt; - Specify which translations you want to pull (defaults to all)&lt;br /&gt;
-r &amp;lt;resource&amp;gt; - Specify the resource for which you want to pull the translations (defaults to all)&lt;br /&gt;
-a - Fetch all translation files from server (even new ones)&lt;br /&gt;
-s - Force the fetching of the source file (default: False)&lt;br /&gt;
-f - Force download of translations files&lt;br /&gt;
--skip - Don&#039;t stop on errors. Useful when pushing many files concurrently.&lt;br /&gt;
--disable-overwrite - By default Transifex will fetch new translations files and replace existing ones. Use this flag if you want to disable this feature.&lt;br /&gt;
--minimum_perc=VALUE - Specify the minimum acceptable percentage of a translation in order to download it.&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;示例：&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
要拉取翻译文档，可以使用:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tx -d pull -l it_IT  # Get italian language only&lt;br /&gt;
tx -d pull -a   # Get all languages&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
要推送源文件，只需键入:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tx -d push -t -l it_IT [-r dolibarr.file]   # To push only a specific translation file&lt;br /&gt;
tx -d push -s  # To push source file&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===关于transifex流程的其他问题===&lt;br /&gt;
这是一个简短的Q&amp;amp;A，你也可以询问transifex翻译进程：&lt;br /&gt;
&lt;br /&gt;
1) 同步是否按固定的时间间隔完成?&lt;br /&gt;
&lt;br /&gt;
不，只有在提交了足够的译文时才进行翻译。在创建最终发布包之前，它也会在beta分支上完成。&lt;br /&gt;
 &lt;br /&gt;
2) 是否所有的翻译都同步到git，还是仅仅同步经过审核的翻译。在同步完成之前我需要进行检查吗?&lt;br /&gt;
&lt;br /&gt;
当同步完成时，transifex文件将覆盖git中的文件，但前提是该文件至少有一条记录被修改。&lt;br /&gt;
在同步完成之前，您不必进行复查。最重要的是，要知道哪些行是手动审核的，哪些行是最初使用机器人翻译的。同步始终采用最后翻译的版本，即使新的翻译没有被审核。&lt;br /&gt;
 &lt;br /&gt;
3) 在哪些Dolibarr版本中提供翻译？Transifex翻译是否也同步到维护版本？&lt;br /&gt;
&lt;br /&gt;
同步总是在develop和/或beta版本上完成。&lt;br /&gt;
因此，transifex更改会出现在其分支在Transifex更改之后创建的所有版本中（在创建新分支之前总是进行同步）。&lt;br /&gt;
&lt;br /&gt;
一旦创建了一个分支，对Transifex的新更改将仅适用于下一个分支。这样做的原因是我们不管理Transifex上的分支/版本（目前还没有）。&lt;br /&gt;
==手动翻译（不推荐）==&lt;br /&gt;
&lt;br /&gt;
要将Dolibarr翻译成另一种语言，请转到Langs目录，并创建一个用要翻译的语言代码命名的文件夹/目录（遵循现有格式，例如en_US, en_GB, es_ES, de_DE, 等）。然后将文件从现有的语言目录（例如en_US/main.lang, en_GB/bills.lang）复制到您刚刚创建的新语言目录中。&lt;br /&gt;
&lt;br /&gt;
这些文件在每行中具有键/值对的格式，如下所示：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
Code1 = translate phrase 1&lt;br /&gt;
Code2 = translate phrase 2&lt;br /&gt;
...&lt;br /&gt;
Coden = translate phrase n&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如上所述，翻译“=”右侧的短语（键/值对的值部分），“=”左侧的代码（键部分）应保持不变。&lt;br /&gt;
&lt;br /&gt;
可以逐个翻译这些文件，而不必一次就把它们全部翻译出来。&lt;br /&gt;
&lt;br /&gt;
如果文件尚未被翻译成新的语言，Dolibarr将使用英语。&lt;br /&gt;
&lt;br /&gt;
要将本地化（翻译）的字符串放入PHP代码中，您所要做的就是加载语言文件并使用下述方法来获取翻译后的值，如下所示：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$langs-&amp;gt;load(&amp;quot;myfile&amp;quot;); // or use $langs-&amp;gt;load(&amp;quot;myfile@mymodule&amp;quot;) if myfile.lang is inside directory htdocs/mymodule/langs/xx_XX   &lt;br /&gt;
&lt;br /&gt;
print $langs-&amp;gt;trans(&amp;quot;CodeX&amp;quot;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
条目类型：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
CodeX = phrase X&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
必须存在或添加到myfile.lang文件中。&lt;br /&gt;
&lt;br /&gt;
==使用autotranslator.php工具自动翻译==&lt;br /&gt;
&lt;br /&gt;
*Translator OS: All&lt;br /&gt;
*Tool: &#039;&#039;&#039;autotranslator.php&#039;&#039;&#039; 随 Dolibarr 提供，位于目录 &#039;&#039;&#039;dev/translation&#039;&#039;&#039; 下&lt;br /&gt;
&lt;br /&gt;
当刚开始翻译为尚未初始化的语言时，建议使用此方法。如果已经有一个可用的翻译，但您需要添加一个丢失的键或纠正错误，请尝试使用Transifex方法（见下文）。&lt;br /&gt;
&lt;br /&gt;
要创建或更新语言代码的所有文件，只需运行脚本：&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
php autotranslator.php lang_code_source lang_code_target GOOGLEAPIKEY&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
例如：&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
php autotranslator.php en_US pt_PT GOOGLEAPIKEY&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
使用英语（en_US）文件翻译成葡萄牙语（pt_PT）。&lt;br /&gt;
&lt;br /&gt;
此操作将创建所有不存在的文件，并更新所有现有文件。 该工具使用Google翻译服务来查找字符串的翻译值，因此需要从运行脚本的站点进行工作的Internet连接。此外，还需要GOOGLEAPIKEY，Google会收取使用此服务的费用（20欧元/1000000翻译字符）。 你的PHP还必须有写入&#039;&#039;&#039;htdocs/langs&#039;&#039;&#039;目录的权限，并且必须有可用的curl函数。&lt;br /&gt;
&lt;br /&gt;
此操作将创建所有不存在的文件，并更新所有现有文件。 该工具使用 [http://translate.google.com Google translation] 翻译服务来查找字符串的翻译值，因此运行脚本的工作站点需要有Internet连接。此外，还需要GOOGLEAPIKEY，Google会收取使用此服务的费用（20欧元/1 000 000翻译字符）。 你的PHP还必须有写入&#039;&#039;&#039;htdocs/langs&#039;&#039;&#039;目录的权限，并且必须有可用的curl函数。 &lt;br /&gt;
&lt;br /&gt;
=[[File:Language.png]] 将你的翻译分发或纳入到核心源代码中=&lt;br /&gt;
&lt;br /&gt;
一旦你开始翻译，分享它将是一个明智的决定，因为它可以被包含在Dolibarr的官方代码中。 如果您保留它，当添加新术语或修改以前的术语时，其他人将无法改进它，并且您仍然必须自己管理翻译。&lt;br /&gt;
&lt;br /&gt;
如果你是通过Transifex系统翻译的，那就没什么可做的了。您的翻译将被包含在Dolibarr的下一个版本中。没有额外的工作！从技术上讲，翻译将从Transifex导出，并由我们的开发人员导入Dolibarr，每月至少一次。&lt;br /&gt;
&lt;br /&gt;
但是，如果您直接在Dolibarr文件中进行翻译，则必须首先将这些翻译传输到Transifex，然后才能将其包含在内。所以，真的，你应该一开始就翻译成Transifex。 如果你通过Github上的Pull Request向我们发送你的翻译，很遗憾，它会被Transifex的下一次导入所覆盖，所以它的生命周期将是非常短暂的。&lt;br /&gt;
&lt;br /&gt;
注意事项：&lt;br /&gt;
&lt;br /&gt;
参考语言是en_US，并且其内容始终是完整的。您可以在htdocs/langs/en_US/文件夹中找到它。所有其他语言文件都可能是轻微或高度不完整的，具体取决于语言。&lt;br /&gt;
&lt;br /&gt;
如果你正在开发一个新的模块，你可能需要添加新的语言变量。这完全通过更新en_US语言（htdocs/langs/en_US/文件夹）完成。只需修改这些文件以添加所需的变量，并将生成的文件夹作为Pull Request的一部分发送。请参阅开发人员文档以了解如何贡献代码（您需要在 https://github.com/Dolibarr/dolibarr 上创建一个帐户）。&lt;br /&gt;
&lt;br /&gt;
=[[File:Language.png]] 翻译Wiki上的文档=&lt;br /&gt;
wiki是用3种语言写成的：英语、法语和西班牙语。&lt;br /&gt;
&lt;br /&gt;
如果你想增强这些语言中的一种语言的文档，你所要做的就是在wiki上创建一个帐户。&lt;br /&gt;
&lt;br /&gt;
然后，您可以编辑现有的页面来纠正错误的翻译或翻译等待翻译的页面 [[:Category:Page_waiting_for_translation]]。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====如何翻译现有页面？====&lt;br /&gt;
&lt;br /&gt;
=====为翻译版本创建一个新页面。=====&lt;br /&gt;
首先为翻译后的版本创建一个新页面。为此，您可以访问一个不存在的URL：例如 &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://wiki.dolibarr.org/index.php/Ma_nouvelle_page_en_français&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
选择的翻译版本的页面标题应该是原始英语页面标题的翻译。&lt;/div&gt;</summary>
		<author><name>Kusco</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Dokumentation_Uebersetzung&amp;diff=65906</id>
		<title>Dokumentation Uebersetzung</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Dokumentation_Uebersetzung&amp;diff=65906"/>
		<updated>2026-04-17T08:49:06Z</updated>

		<summary type="html">&lt;p&gt;Kusco: /* Verwendung der Weboberfläche (für Übersetzer) */&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 : Translator_documentation --&amp;gt;&lt;br /&gt;
[[en:Translator_documentation]]&lt;br /&gt;
[[fr:Documentation_traducteur]]&lt;br /&gt;
[[es:Documentación_traductores]]&lt;br /&gt;
[[zh:翻译文档]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
{{#metamaster:keywords|translation, documentation, translator, localize, localization, i18n, internationalization, language}}&lt;br /&gt;
&lt;br /&gt;
=[[File:Language.png]] Übersetzen Sie die Dolibarr-Anwendung in Ihre Sprache.=&lt;br /&gt;
&lt;br /&gt;
Die Dolibarr-Sprachdateien sind bereits in viele Sprachen (teilweise) übersetzt. Englisch [en_US] ist die Standardeinstellung und immer vollständig. &lt;br /&gt;
&lt;br /&gt;
Andere Sprachen sind von Beiträgen Freiwilliger abhängig. Dieses Tutorial kann Ihnen helfen, eine Übersetzung für eine Sprache zu erstellen, die noch nicht verfügbar oder unvollständig ist oder in der es Übersetzungsfehler gibt. &lt;br /&gt;
&lt;br /&gt;
Dolibarr kann mit drei verschiedenen Mitteln übersetzt werden:&lt;br /&gt;
&lt;br /&gt;
#manuelle Eingabe über &#039;&#039;&#039;Transifex&#039;&#039;&#039; (offizielle und empfohlene Methode)&lt;br /&gt;
#Sprachdateien (lokal) manuell bearbeiten&lt;br /&gt;
#Vollautomatisch: Autotranslator&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
==Manuelle Übersetzung mit Transifex Online-Service (empfohlen)==&lt;br /&gt;
&lt;br /&gt;
Transifex ist eine Webanwendung, die eine Online-Plattform für Übersetzungsprojekte bietet. Es umfasst Teams und Diskussionstools, Translation Memory, Glossar, Korrekturlesen und viele andere Funktionen.&lt;br /&gt;
Es ist sehr einfach zu bedienen und alle Übersetzungen können über die Weboberfläche oder mit dem TX-Client von einem Terminal aus hoch- und heruntergeladen werden.&lt;br /&gt;
Transifex ist ein Open-Source-Projekt und die &amp;quot;Community Edition&amp;quot; kann kostenlos heruntergeladen und installiert werden, aber wir werden den online gehosteten Dienst nutzen.&lt;br /&gt;
&lt;br /&gt;
===Verwendung der Weboberfläche (für Übersetzer)===&lt;br /&gt;
Wenn Sie helfen möchten, Dolibarr in Ihre Muttersprache zu übersetzen, besuchen Sie die Seite des Projekts unter https://app.transifex.com/dolibarr-association/dolibarr/dashboard/&lt;br /&gt;
&lt;br /&gt;
Sie können dann ein Konto registrieren und den Beitritt zum Projektteam für die Sprache(n) beantragen, die Sie anstreben. Ein Manager wird Ihre Anfrage bearbeiten, also haben Sie bitte etwas Geduld.&lt;br /&gt;
&lt;br /&gt;
Nach der Annahme können Sie sofort mit der Übersetzung beginnen.&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen finden Sie unter Transifex &amp;quot;Getting Started&amp;quot; Einführung unter http://docs.transifex.com/introduction/translators/ und das Webeditor-Tutorial unter http://docs.transifex.com/tutorials/txeditor/&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hinweis zum en_US Sprachpaket &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Das Webinterface kann nicht verwendet werden, um das Sprachpaket en_US zu übersetzen, da es die Quelle für Übersetzungen darstellt.&lt;br /&gt;
&lt;br /&gt;
Jede Änderung für das en_US Sprachpaket muss im Dolibarr Sourcecode erfolgen und via Pull-Request über das GitHub repository eingereicht werden.&lt;br /&gt;
&lt;br /&gt;
===Verwendung des TX-Befehlszeilen-Clients (für Dolibarr [[:Category:Yoda]] team)===&lt;br /&gt;
Hier wird beschrieben, wie Sie Transifex von der Kommandozeile aus verwenden können. Dies ist jedoch den Dolibarr-Administratoren vorbehalten, um Transifex mit den Hauptquellen von Dolibarr zu synchronisieren.&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen finden Sie auch auf der Seite [http://docs.transifex.com/developer/client/ Transifex Official documentation]&lt;br /&gt;
&lt;br /&gt;
====TX Client Konfiguration====&lt;br /&gt;
First install TX Client.&lt;br /&gt;
With Debian/Ubuntu/Mint:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
apt-get install python-pip&lt;br /&gt;
pip install transifex-client&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Then you have to initialize your TX environment. This is done by running &#039;&#039;&#039;tx init&#039;&#039;&#039; into dolibarr project root directory.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd git/dolibarr&lt;br /&gt;
tx init&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Akzeptieren Sie das Überschreiben der Konfigurationsdatei. Behalten Sie den Standardwert für die Transifex-Instanz bei und geben Sie dann Ihren Transifex-Login und Ihr Passwort ein.&lt;br /&gt;
Danach, a .transifexrc has been created into your HOME dir and a generic config file has been created as &#039;&#039;&#039;.tx/config&#039;&#039;&#039; in project&#039;s root.&lt;br /&gt;
So your directory&#039;s contents will look like that:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
|-- build&lt;br /&gt;
|-- build.xml&lt;br /&gt;
|-- ChangeLog&lt;br /&gt;
|-- COPYING&lt;br /&gt;
|-- COPYRIGHT&lt;br /&gt;
|-- dev&lt;br /&gt;
|-- doc&lt;br /&gt;
|-- .gitignore&lt;br /&gt;
|-- htdocs&lt;br /&gt;
|-- INSTALL&lt;br /&gt;
|-- pom.xml&lt;br /&gt;
|-- quickbuild.xml&lt;br /&gt;
|-- README&lt;br /&gt;
|-- README-FR&lt;br /&gt;
|-- README.md&lt;br /&gt;
|-- robots.txt&lt;br /&gt;
|-- scripts&lt;br /&gt;
|-- test&lt;br /&gt;
`-- .tx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die aktuelle Konfigurationsdatei kann heruntergeladen werden unter https://github.com/Dolibarr/dolibarr/tree/develop/.tx , hineingelegt in die .tx Verzeichnis, überschreibt diejenige, die von &#039;&#039;&#039;tx init&#039;&#039;&#039; erzeugt wurden.&lt;br /&gt;
&lt;br /&gt;
This project configuration file is used to store the project’s details and the file-to-resource mappings.&lt;br /&gt;
&lt;br /&gt;
Das ist ein Beispiel für die Inhalte der Konfigurationsdatei:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[main]&lt;br /&gt;
host = https://www.transifex.com&lt;br /&gt;
lang_map = uz: uz_UZ&lt;br /&gt;
&lt;br /&gt;
[dolibarr.admin]&lt;br /&gt;
file_filter = htdocs/langs/&amp;lt;lang&amp;gt;/admin.lang&lt;br /&gt;
source_file = htdocs/langs/en_US/admin.lang&lt;br /&gt;
source_lang = en_US&lt;br /&gt;
type = MOZILLAPROPERTIES&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier folgt eine Erläuterung der Abschnitte und Optionen, die in der Konfigurationsdatei verwendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;[main] section&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In diesem Abschnitt finden wir projektübergreifende Optionen, wie z.B. den Standard Transifex-Host für alle Projekte. Dies kann von jeder Ressource bei Bedarf überschrieben werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;[dolibarr.resource]&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
source_lang: this is the source language of the resource.&amp;lt;br /&amp;gt;&lt;br /&gt;
source_file: zeigt direkt auf die Quelldatei.&amp;lt;br /&amp;gt;&lt;br /&gt;
file_filter: here we hold the expression used to identify translation files under the specific project. &#039;&#039;not mandatory&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
trans.&amp;lt;lang&amp;gt;: this is used for translation files that don’t follow a common naming schema and the file expression cannot be used to track them. &#039;&#039;not mandatory&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
host: in case the project doesn’t use the default Transifex server as specified in the [main] section, it can override it using this option. &#039;&#039;not mandatory&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====TX Client Nutzung====&lt;br /&gt;
Nützliche Informationen zu &#039;&#039;&#039;tx&#039;&#039;&#039; Kommandos.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;tx status&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Zeige den Status von Übersetzungen&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;tx push&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Used to push changes from your computer to Transifex server&amp;lt;br&amp;gt;&lt;br /&gt;
Additional options for the tx push command are:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
-h - Shows the help screen for the command&lt;br /&gt;
-l &amp;lt;lang&amp;gt; - Specify which translations you want to push (defaults to all)&lt;br /&gt;
-r &amp;lt;resource&amp;gt; - Specify the resource for which you want to push the translations (defaults to all)&lt;br /&gt;
-f - Push source files without checking modification times&lt;br /&gt;
--skip - Don&#039;t stop on errors. Useful when pushing many files concurrently.&lt;br /&gt;
-s - Push the source file to the server&lt;br /&gt;
-t - Push the translation files to the server&lt;br /&gt;
--no-interactive - Don&#039;t require user input when forcing a push&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;tx pull&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Used to pull changes from Transifex server to your computer&amp;lt;br /&amp;gt;&lt;br /&gt;
Additional options for the tx pull command are:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
-h - Shows the help screen for the command&lt;br /&gt;
-l &amp;lt;lang&amp;gt; - Specify which translations you want to pull (defaults to all)&lt;br /&gt;
-r &amp;lt;resource&amp;gt; - Specify the resource for which you want to pull the translations (defaults to all)&lt;br /&gt;
-a - Fetch all translation files from the server (even new ones)&lt;br /&gt;
-s - Force the fetching of the source file (default: False)&lt;br /&gt;
-f - Force download of translations files&lt;br /&gt;
--skip - Don&#039;t stop on errors. Useful when pushing many files concurrently.&lt;br /&gt;
--disable-overwrite - By default Transifex will fetch new translations files and replace existing ones. Use this flag if you want to disable this feature.&lt;br /&gt;
--minimum_perc=VALUE - Specify the minimum acceptable percentage of a translation in order to download it.&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Examples&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
To pull translation files, you can use:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tx -d pull -l it_IT  # Get italian language only&lt;br /&gt;
tx -d pull -a   # Get all languages&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To push source files, just type:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tx -d push -t -l it_IT [-r dolibarr.file]   # To push only a specific translation file&lt;br /&gt;
tx -d push -s  # To push source file&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Weitere Fragen zum Transifex-Prozess===&lt;br /&gt;
Dies sind kurze Fragen und Antworten, die Sie auch zum Übersetzungsprozess von transifex stellen können:&lt;br /&gt;
&lt;br /&gt;
1) Liegt die Synchronisation in einem regelmäßigen Zeitintervall?&lt;br /&gt;
&lt;br /&gt;
Nein. Es wird dort durchgeführt, wo genügend Übersetzungen eingereicht wurden. Es wird auch in einem Beta-Zweig durchgeführt, kurz bevor das endgültige Release-Paket erstellt wird.&lt;br /&gt;
 &lt;br /&gt;
2) Werden alle Übersetzungen mit git synchronisiert oder nur die korrigierten Übersetzungen? Muss ich das überprüfen, bevor die Synchronisierung durchgeführt wird?&lt;br /&gt;
&lt;br /&gt;
Wenn eine Synchronisierung durchgeführt wird, überschreiben Transifex-Dateien Dateien in git, aber nur, wenn zumindest ein Datensatz für die Datei geändert wurde. &lt;br /&gt;
Sie müssen keine Überprüfung durchführen, bevor die Synchronisierung abgeschlossen ist. Beim Review ist vor allem zu wissen, welche Zeilen manuell überprüft wurden und welche zunächst mit einem Roboter übersetzt wurde.&lt;br /&gt;
 &lt;br /&gt;
3) In welchen Dolibarr-Versionen werden Übersetzungen verfügbar sein? Werden Transifex-Übersetzungen auch mit Wartungsreleases synchronisiert?&lt;br /&gt;
&lt;br /&gt;
Die Synchronisation erfolgt immer in der Entwicklungsphase und/oder in der Beta-Phase.&lt;br /&gt;
So erscheinen Transifex-Änderungen in allen Versionen, deren Zweig nach der Transifex-Änderung erstellt wird (eine Synchronisierung wird immer durchgeführt, bevor ein neue branch erstellt wird). Sobald eine branch erstellt wurde, sind die neuen Änderungen in transifex nur noch für den nächste branch verfügbar. Der Grund dafür ist, dass transifex nicht in der Lage ist, Zweig/Versionen zu verwalten (noch nicht).&lt;br /&gt;
&lt;br /&gt;
Übersetzt mit www.DeepL.com/Translator (kostenlose Version)&lt;br /&gt;
&lt;br /&gt;
==Manuelle Übersetzung (nicht empfohlen)==&lt;br /&gt;
&lt;br /&gt;
To translate Dolibarr into another language, go to the langs directory and create a folder/directory named with the code language to translate (follow the existing format, for example en_US, en_GB, es_ES, de_DE, etc...). Then copy the files from an existing language directory (for example en_US/main.lang, en_GB/bills.lang), into the new language directory that you have just created.&lt;br /&gt;
&lt;br /&gt;
These files have the format of key/value pairs in each line like the followings:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
Code1 = translate phrase 1&lt;br /&gt;
Code2 = translate phrase 2&lt;br /&gt;
...&lt;br /&gt;
Coden = translate phrase n&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Translate the phrases (the value portion of the key/value pairs) on the right side of the &amp;quot;=&amp;quot; as seen above, the code (the key portion) on the left side of &amp;quot;=&amp;quot; should remain unchanged. It is possible to translate the files one by one, without bringing them all at once. If a file has not been translated into the new language, Dolibarr uses English.&lt;br /&gt;
&lt;br /&gt;
To have a localised (translated) string into the PHP code, all you have to do is load the language file and use the method to get the translated value, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$langs-&amp;gt;load(&amp;quot;myfile&amp;quot;); // or use $langs-&amp;gt;load(&amp;quot;myfile@mymodule&amp;quot;) if myfile.lang is inside directory htdocs/mymodule/langs/xx_XX   &lt;br /&gt;
&lt;br /&gt;
print $langs-&amp;gt;trans(&amp;quot;CodeX&amp;quot;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An entry type;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
CodeX = phrase X&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
muß vorhanden sein oder in die Datei myfile.lang hinzugefügt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Automatische Übersetzung mit dem Tool  &#039;&#039;&#039;autotranslator.php&#039;&#039;&#039;==&lt;br /&gt;
&lt;br /&gt;
*Translator OS: All&lt;br /&gt;
*Tool: &#039;&#039;&#039;autotranslator.php&#039;&#039;&#039; provided with Dolibarr in directory &#039;&#039;&#039;dev/translation&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Diese Methode wird empfohlen, wenn Sie mit der Übersetzung für eine Sprache beginnen, die noch nicht initialisiert/vorhanden ist. &lt;br /&gt;
&lt;br /&gt;
Wenn bereits eine Übersetzung verfügbar ist, Sie aber einen fehlenden Schlüssel hinzufügen oder einen Fehler korrigieren müssen, sollten Sie Transifex verwenden (siehe oben).&lt;br /&gt;
&lt;br /&gt;
Um alle Dateien eines Sprachcodes zu erstellen oder zu aktualisieren, führen Sie einfach das Skript aus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
php autotranslator.php lang_code_source lang_code_target GOOGLEAPIKEY&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum Beispiel:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
php autotranslator.php en_US pt_PT GOOGLEAPIKEY&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
to translate into Portuguese (pt_PT) using English (en_US) files.&lt;br /&gt;
&lt;br /&gt;
Alle nicht existierenden Dateien werden erstellt, alle bestehenden Dateien werden aktualisiert.&lt;br /&gt;
Die Verwendung des Tools [http://translate.google.com Google translation] Service, um den Übersetzungswert einer Zeichenkette zu finden.&lt;br /&gt;
service to find the translation value of a string, so a working Internet connection is required from station running the script. &lt;br /&gt;
&lt;br /&gt;
Also, a GOOGLEAPIKEY is required and Google charges a fee for using this service (20 euros / 1 000 000 of translated chars).&lt;br /&gt;
&lt;br /&gt;
Your PHP must also have permissions to write into &#039;&#039;&#039;htdocs/langs&#039;&#039;&#039; directory and must have curl functions available.&lt;br /&gt;
&lt;br /&gt;
=[[File:Language.png]] Verteilen oder integrieren Sie Ihre Übersetzung in die Kernquelle.=&lt;br /&gt;
&lt;br /&gt;
Once you start translating, it&#039;s a smart decision to share it, so it can be included in the official code of Dolibarr.&lt;br /&gt;
If you keep it for you, others will not be able to improve it when new terms are added or previous terms are modified, and you will still have to manage the translation on your own.&lt;br /&gt;
&lt;br /&gt;
If you translated through the Transifex system, there&#039;s nothing to be done. Your translation will be included in the next version of Dolibarr. No additional work! In technical terms, the translation will be exported from Transifex and imported into Dolibarr by our developers, at least once every month.&lt;br /&gt;
&lt;br /&gt;
If, however, you translated directly in Dolibarr files, then you will first have to transfer those translations to Transifex before they can be included. So, really, you should start translating into Transifex.&lt;br /&gt;
If you send us your translation through a Pull Request on Github, sadly, it will be overwritten by the next import from Transifex, so it would be very short-lived.&lt;br /&gt;
&lt;br /&gt;
Hinweis:&lt;br /&gt;
&lt;br /&gt;
The reference language is en_US and is always complete. You can find it in the htdocs/langs/en_US/ folder. All other language files are likely to be slightly or highly incomplete, depending on the language.&lt;br /&gt;
&lt;br /&gt;
If you are developing a new module, you are likely going to need the addition of new language variables. This is done exclusively through the update of the en_US language (htdocs/langs/en_US/ folder). Just modify these files to add the variable you need and send the resulting folder as part of your Pull Request. Refer to the developer documentation to learn how to contribute code (you will need an account on {{TemplateUrlSCM}}.&lt;br /&gt;
&lt;br /&gt;
=[[File:Language.png]] Übersetzungen für dieses Wiki=&lt;br /&gt;
Das Wiki ist zumeist in den Sprachen Englisch, Französisch und teilweise Spansich, aber auch Deutsch geschrieben. &lt;br /&gt;
&lt;br /&gt;
Wenn Sie die Dokumentation in einer dieser Sprachen verbessern möchten oder eine neue Übersetzung hinzufügen wollen, müssen Sie lediglich ein Konto in diesem Wiki erstellen.&lt;br /&gt;
&lt;br /&gt;
Danach können Sie die Übersetzung existierender Seiten verbessern und bisher noch nicht übersetzte Seiten neu übersetzen (siehe: [[:Category:Page_waiting_for_translation]]).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Wie man eine bestehende Seite übersetzt ?===&lt;br /&gt;
&lt;br /&gt;
====Erstellen Sie eine neue Seite für die übersetzte Version.====&lt;br /&gt;
Erstellen Sie zunächst eine neue Seite für die übersetzte Version. Dazu können Sie auf eine nicht vorhandene URL zugreifen: z.B. [[Translator documentation|&amp;lt;code&amp;gt;https://wiki.dolibarr.org/index.php/Ma_nouvelle_page_en_français&amp;lt;/code&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Der gewählte Titel für die übersetzte Version der Seite sollte die Übersetzung des Titels der englischen Originalseite sein.&lt;/div&gt;</summary>
		<author><name>Kusco</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Documentaci%C3%B3n_traductores&amp;diff=65905</id>
		<title>Documentación traductores</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Documentaci%C3%B3n_traductores&amp;diff=65905"/>
		<updated>2026-04-17T08:48:33Z</updated>

		<summary type="html">&lt;p&gt;Kusco: /* Using the web interface (for translators) */&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 : Translator_documentation --&amp;gt;&lt;br /&gt;
[[en:Translator_documentation]]&lt;br /&gt;
[[fr:Documentation_traducteur]]&lt;br /&gt;
[[de:Dokumentation_Uebersetzung]]&lt;br /&gt;
[[zh:翻译文档]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=[[File:Language.png]] Traducir Dolibarr a otro idioma=&lt;br /&gt;
Dolibarr se desarrolla por defecto en inglés&lt;br /&gt;
&lt;br /&gt;
Existen 3 métodos para realizar la traducción de Dolibarr:&lt;br /&gt;
&lt;br /&gt;
#Automático mediante autotranslator.php&lt;br /&gt;
#Manualmente mediante la modificación de los archivos de idiomas&lt;br /&gt;
#Manualmente usando Transifex.com (oficial y recomendado).&lt;br /&gt;
&lt;br /&gt;
Los describimos por orden de preferencia:&lt;br /&gt;
&lt;br /&gt;
==Traducción via transifex (recomendada)==&lt;br /&gt;
{{ToTranslate}}&lt;br /&gt;
&lt;br /&gt;
Transifex is a web application that provides an online platform for translation projects. It includes teams and discussion tools, translation memory, glossary, proofreading and a lot of other features.&lt;br /&gt;
It is quite easy to use and all translations can be uploaded or downloaded through the web interface or using their TX client in a terminal.&lt;br /&gt;
Transifex is an open source project and the &amp;quot;community edition&amp;quot; can be freely downloaded and installed, but we will use the online hosted service.&lt;br /&gt;
&lt;br /&gt;
===Create transifex account and choose language===&lt;br /&gt;
If you want to help translating Dolibarr in your own language, please refer to https://app.transifex.com/dolibarr-association/dolibarr/dashboard/ and see if language is already supported. If it exists (many teams are already working for the project), you can ask to join the team and start to translate right away; if there is not a team for your language, you should request a new translation team on Transifex. It can be done directly using transifex.com interface on the website.&lt;br /&gt;
&lt;br /&gt;
===Using the web interface (for translators)===&lt;br /&gt;
If language is already available onto page  https://app.transifex.com/dolibarr-association/dolibarr/dashboard/, just create an account and follow instruction of transifex web site to translate files.&lt;br /&gt;
&lt;br /&gt;
Note, that this web interface must not be used to translate en_US language that is source. Any change on source language must be done by submiting code change using GitHub Pull Requests.&lt;br /&gt;
&lt;br /&gt;
===Using TX command line client (for Dolibarr [[:Category:Yoda]] team)===&lt;br /&gt;
This describe how to use Transifex from command line. However, this is reserved to Dolibarr admin users to synchronize Transifex with Dolibarr main sources.&lt;br /&gt;
&lt;br /&gt;
[http://docs.transifex.com/developer/client/ Official documentation]&lt;br /&gt;
&lt;br /&gt;
====TX Client configuration====&lt;br /&gt;
First install TX Client.&lt;br /&gt;
With Debian/Ubuntu/Mint:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
apt-get install python-pip&lt;br /&gt;
pip install transifex-client&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Then you have to initialize your TX environment. This is done by running &#039;&#039;&#039;tx init&#039;&#039;&#039; into dolibarr project root directory.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd git/dolibarr&lt;br /&gt;
tx init&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Accept to overwrite config file. Keep default value for Transifex instance, then enter your Transifex login and password.&lt;br /&gt;
&lt;br /&gt;
After this, a .transifexrc has been created into your HOME dir and a generic config file has been created as &#039;&#039;&#039;.tx/config&#039;&#039;&#039; in project&#039;s root.&lt;br /&gt;
So your directory&#039;s contents will look like that:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
|-- build&lt;br /&gt;
|-- build.xml&lt;br /&gt;
|-- ChangeLog&lt;br /&gt;
|-- COPYING&lt;br /&gt;
|-- COPYRIGHT&lt;br /&gt;
|-- dev&lt;br /&gt;
|-- doc&lt;br /&gt;
|-- .gitignore&lt;br /&gt;
|-- htdocs&lt;br /&gt;
|-- INSTALL&lt;br /&gt;
|-- pom.xml&lt;br /&gt;
|-- quickbuild.xml&lt;br /&gt;
|-- README&lt;br /&gt;
|-- README-FR&lt;br /&gt;
|-- README.md&lt;br /&gt;
|-- robots.txt&lt;br /&gt;
|-- scripts&lt;br /&gt;
|-- test&lt;br /&gt;
`-- .tx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The current config file can be downloaded from https://github.com/Dolibarr/dolibarr/tree/develop/.tx , put it into .tx directory, overwriting the one created by &#039;&#039;&#039;tx init&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
This project configuration file is used to store the project’s details and the file-to-resource mappings.&lt;br /&gt;
&lt;br /&gt;
That is a sample of what the config file contains:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[main]&lt;br /&gt;
host = https://www.transifex.com&lt;br /&gt;
lang_map = uz: uz_UZ&lt;br /&gt;
&lt;br /&gt;
[dolibarr.admin]&lt;br /&gt;
file_filter = htdocs/langs/&amp;lt;lang&amp;gt;/admin.lang&lt;br /&gt;
source_file = htdocs/langs/en_US/admin.lang&lt;br /&gt;
source_lang = en_US&lt;br /&gt;
type = MOZILLAPROPERTIES&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here is an explanation of the sections and options used in the config file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;[main] section&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this section we have project-wide options, such as the default transifex host for all projects. These can be overriden by each resource, in case it is needed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;[dolibarr.resource]&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
source_lang: this is the source language of the resource.&amp;lt;br /&amp;gt;&lt;br /&gt;
source_file: this points to the source file directly.&amp;lt;br /&amp;gt;&lt;br /&gt;
file_filter: here we hold the expression used to identify translation files under the specific project. &#039;&#039;not mandatory&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
trans.&amp;lt;lang&amp;gt;: this is used for translation files that don’t follow a common naming schema and the file expression cannot be used to track them. &#039;&#039;not mandatory&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
host: in case the project doesn’t use the default Transifex server as specified in the [main] section, it can override it using this option. &#039;&#039;not mandatory&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====TX Client use====&lt;br /&gt;
Some useful information on &#039;&#039;&#039;tx&#039;&#039;&#039; commands.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;tx status&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Show status of translations&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;tx push&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Used to push changes from your computer to Transifex server&amp;lt;br&amp;gt;&lt;br /&gt;
Additional options for the tx push command are:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
-h - Shows the help screen for the command&lt;br /&gt;
-l &amp;lt;lang&amp;gt; - Specify which translations you want to push (defaults to all)&lt;br /&gt;
-r &amp;lt;resource&amp;gt; - Specify the resource for which you want to push the translations (defaults to all)&lt;br /&gt;
-f - Push source files without checking modification times&lt;br /&gt;
--skip - Don&#039;t stop on errors. Useful when pushing many files concurrently.&lt;br /&gt;
-s - Push the source file to the server&lt;br /&gt;
-t - Push the translation files to the server&lt;br /&gt;
--no-interactive - Don&#039;t require user input when forcing a push&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;tx pull&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Used to pull changes from Transifex server to your computer&amp;lt;br /&amp;gt;&lt;br /&gt;
Additional options for the tx pull command are:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
-h - Shows the help screen for the command&lt;br /&gt;
-l &amp;lt;lang&amp;gt; - Specify which translations you want to pull (defaults to all)&lt;br /&gt;
-r &amp;lt;resource&amp;gt; - Specify the resource for which you want to pull the translations (defaults to all)&lt;br /&gt;
-a - Fetch all translation files from server (even new ones)&lt;br /&gt;
-s - Force the fetching of the source file (default: False)&lt;br /&gt;
-f - Force download of translations files&lt;br /&gt;
--skip - Don&#039;t stop on errors. Useful when pushing many files concurrently.&lt;br /&gt;
--disable-overwrite - By default Transifex will fetch new translations files and replace existing ones. Use this flag if you want to disable this feature.&lt;br /&gt;
--minimum_perc=VALUE - Specify the minimum acceptable percentage of a translation in order to download it.&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Examples&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
To pull translation files, you can use:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tx -d pull -l it_IT  # Get italian language only&lt;br /&gt;
tx -d pull -a   # Get all languages&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To push source files, just type:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tx -d push -t -l it_IT [-r dolibarr.file]   # To push only a specific translation file&lt;br /&gt;
tx -d push -s  # To push source file&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Other questions on transifex process===&lt;br /&gt;
This is short questions and answer yuo may also ask about transifex translation process:&lt;br /&gt;
&lt;br /&gt;
1) Is the sync on a regular time interval ?&lt;br /&gt;
&lt;br /&gt;
No. It is done where there is enough translation submited. It is also done on a beta branch just before creating the final release package.&lt;br /&gt;
 &lt;br /&gt;
2) Are all the translations synced to git, or only the reviewed translations. Do I need to review before sync is done ?&lt;br /&gt;
&lt;br /&gt;
When a Sync is done, transifex files overwrites files into git, but only if there is at least on record modified for the file. &lt;br /&gt;
You don&#039;t have to make review before sync is done. Making review is above all to know which lines were manually reviewed and wich one were intially translated using a robot.&lt;br /&gt;
 &lt;br /&gt;
3) In which Dolibarr releases will translations be available ? Are transifex translations also synced to maintenance releases ?&lt;br /&gt;
&lt;br /&gt;
Sync is always done on develop and/or beta.&lt;br /&gt;
So transifex changes appear in all version whose branch is created after the transifex change (a sync is always done before creating a new branch). Once a branch is created, then new changes into transifex will be available only for next branch. Reason of this is that transifex is not able to manage branch/versions (not yet).&lt;br /&gt;
&lt;br /&gt;
==Traducción totalmente manual (no recomendada)==&lt;br /&gt;
&lt;br /&gt;
Para traducir Dolibarr a otro idioma, vaya a la carpeta langs y cree una carpeta llamada con el código de idioma a traducir (Siguiendo el mismo formato de las ya existentes, por ejemplo en_US, fr_FR, es_ES, de_DE, etc...).&lt;br /&gt;
Deberá copiar los archivos de una carpeta lang ya traducida (por ejemplo en_US/main.lang ó fr_FR/bills.lang), y pegarlas en la carpeta del nuevo idioma que acabamos de crear y empezaremos a traducir el contenido de estos archivos.&lt;br /&gt;
&lt;br /&gt;
Estos ficheros están constituidos de la siguiente manera:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
Code1=Frase a traducir 1&lt;br /&gt;
Code2=Frase a traducir  2&lt;br /&gt;
...&lt;br /&gt;
Coden=Frase a traducir  n&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Solamente las frases a la derecha del = se deben traducir, el código debe permanecer sin cambios.&lt;br /&gt;
Es posible traducir los archivos uno por uno, sin tener que traducirlos todos a la vez. Si un archivo no se ha traducido en el nuevo idioma, Dolibarr utilizará el Inglés.&lt;br /&gt;
&lt;br /&gt;
Para tener una variable de cadena para el idioma en el código PHP, todo lo que necesita hacer es cargar el archivo de idioma y utilizar el método para recuperar la variable traducida. Esto se puede hacer de la siguiente manera:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$langs-&amp;gt;load(&amp;quot;nombredelarchivo&amp;quot;); // o $langs-&amp;gt;load(&amp;quot;nombredelarchivo@mimodulo&amp;quot;) si miarchivo.lang se encuentra en el directorio htdocs/mimodulo/langs/xx_XX   &lt;br /&gt;
&lt;br /&gt;
print $langs-&amp;gt;trans(&amp;quot;CodeX&amp;quot;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y una entrada del tipo&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
CodeX=Phrase X&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
debe de ser añadida a los ficheros .lang&lt;br /&gt;
&lt;br /&gt;
==Traducción automática mediante la utilidad autotranslator.php (no recomendada)==&lt;br /&gt;
&lt;br /&gt;
*SO del traductor: Cualquiera&lt;br /&gt;
*Utilidad: autotranslator.php viene con Dolibarr, se encuentra en la carpeta &#039;&#039;&#039;dev/translation&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Para traducir o actualizar todos los archivos en un nuevo idioma, símplemente ejecute el script:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
php autotranslator.php lang_code_source lang_code_target GOOGLEAPIKEY&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Por ejemplo:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
php autotranslator.php en_US pt_PT GOOGLEAPIKEY&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
para realizar la traducción al portugés (pt_PT) utilizando el inglés (en_US) como origen.&lt;br /&gt;
&lt;br /&gt;
Todos los ficheros no existentes serán creados, y los existentes se actualizarán con las cadenas inexistentes. Las cadenas ya traducidas anteriormente se conservarán tal cual.&lt;br /&gt;
La utilidad utiliza el servicio de [http://translate.google.com traducción de Google] para encontrar el valor traducido de una cadena.&lt;br /&gt;
Su PHP debe de tener permisios de escritura en la carpeta &#039;&#039;&#039;htdocs/langs&#039;&#039;&#039; y disponer de las funciones de la extensión curl disponibles.&lt;br /&gt;
&lt;br /&gt;
=[[File:Language.png]] Difusión o inegras su idioma=&lt;br /&gt;
&lt;br /&gt;
Lo mejor que puede hacer, después de realizar una traducción, es incluirla incluye en la versión oficial de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
Si usted ha completado archivos .lang existentes en Dolibarr de forma incompleta o si ha creado nuevos archivos .lang para un nuevo idioma, puede&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
*Incluir sus cambios o archivos en la versión oficial de Dolibarr. Es posible, si sabe usar un sistema GIT. Para ello cree una cuenta en {{TemplateUrlSCM}}, haga un fork del proyecto Dolibarr, haga sus cambios y mande un Pull Request.&lt;br /&gt;
*o envíe sus archivos por e-mail en un adjunto a la lista inglesa: &#039;&#039;&#039;dolibarr-dev@nongnu.org&#039;&#039;&#039; (Inscripción en {{TemplateURLMLDev}}). Un desarrollador lo integrará por usted.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Nota:&#039;&#039; Hay un idoma principale, que siempre están completos:&lt;br /&gt;
&lt;br /&gt;
*El inglés (ficheros .lang de la carpeta lang/en_US)&lt;br /&gt;
&lt;br /&gt;
Puede utilizar indistintamente tanto uno como el otro (el que prefiera) como referencia ya que los dos están actualizados. Todos los demás archivos de idioma son susceptibles de estar incompletos.&lt;br /&gt;
&lt;br /&gt;
=[[File:Language.png]] Traducción del wiki=&lt;br /&gt;
El wiki se mantiene en 3 idiomas: Inglés, Francés y Español.&lt;br /&gt;
Si desea mejorar la documentación en uno de estos idiomas, simplemente debe de crear una cuenta en este wiki.&lt;br /&gt;
Entonces, podrá modificar una traducción incorrecta o traducir una página a la espera de traducción. La lista de estas páginas se encuentra disponible en la página [[:Category:Page_waiting_for_translation]].&lt;/div&gt;</summary>
		<author><name>Kusco</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Translator_documentation&amp;diff=65904</id>
		<title>Translator documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Translator_documentation&amp;diff=65904"/>
		<updated>2026-04-17T08:47:59Z</updated>

		<summary type="html">&lt;p&gt;Kusco: /* Using the web interface (for translators) */&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:Documentation_traducteur]]&lt;br /&gt;
[[es:Documentación_traductores]]&lt;br /&gt;
[[de:Dokumentation_Uebersetzung]]&lt;br /&gt;
[[zh:翻译文档]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
{{#metamaster:keywords|translation, documentation, translator, localize, localization, i18n, l18n, internationalization, language}}&lt;br /&gt;
&lt;br /&gt;
=[[File:Language.png]] Translate Dolibarr Application into your language=&lt;br /&gt;
&lt;br /&gt;
Dolibarr language files are already translated in several languages.&lt;br /&gt;
English is the default and always complete. Other languages depend on contributions. This tutorial can help you complete a translation for a language not yet available or somehow incorrect.&lt;br /&gt;
Dolibarr can be translated by three different means:&lt;br /&gt;
&lt;br /&gt;
#Manually using Transifex (Official and recommended method).&lt;br /&gt;
#Manually editing language files&lt;br /&gt;
#Completely automatic: autotranslator&lt;br /&gt;
&lt;br /&gt;
==Manual Translation using Transifex online service (recommended)==&lt;br /&gt;
&lt;br /&gt;
Transifex is a web application that provides an online platform for translation projects. It includes teams and discussion tools, translation memory, glossary, proofreading and a lot of other features.&lt;br /&gt;
It is quite easy to use and all translations can be uploaded and downloaded through the web interface or using their TX client from a terminal.&lt;br /&gt;
Transifex is an open source project and the &amp;quot;community edition&amp;quot; can be freely downloaded and installed, but we will use the online hosted service.&lt;br /&gt;
&lt;br /&gt;
===Using the web interface (for translators)===&lt;br /&gt;
If you want to help to translate Dolibarr in your own language, check the project&#039;s page at https://app.transifex.com/dolibarr-association/dolibarr/dashboard/&lt;br /&gt;
&lt;br /&gt;
You can then register an account and request joining the project team for the language(s) you&#039;re targeting. A manager will have to accept your request, so please be patient.&lt;br /&gt;
&lt;br /&gt;
Once accepted, you can start translating right away.&lt;br /&gt;
&lt;br /&gt;
For more information, please check Transifex &amp;quot;Getting Started&amp;quot; introduction at http://docs.transifex.com/introduction/translators/ and the web editor tutorial at http://docs.transifex.com/tutorials/txeditor/&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Note about en_US &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The web interface can not be used to translate the en_US language which is source.&lt;br /&gt;
&lt;br /&gt;
Any change for en_US language must be done in Dolibarr source code and submitted using a Pull Request on our GitHub repository.&lt;br /&gt;
&lt;br /&gt;
===Using TX command line client (for Dolibarr [[:Category:Yoda]] team)===&lt;br /&gt;
This describes how to use Transifex from the command line. However, this is reserved to Dolibarr admin users to synchronize Transifex with Dolibarr main sources.&lt;br /&gt;
&lt;br /&gt;
More information can also be found on the [http://docs.transifex.com/developer/client/ Transifex Official documentation]&lt;br /&gt;
&lt;br /&gt;
====TX Client configuration====&lt;br /&gt;
First install TX Client.&lt;br /&gt;
With Debian/Ubuntu/Mint:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
apt-get install python-pip&lt;br /&gt;
pip install transifex-client&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Then you have to initialize your TX environment. This is done by running &#039;&#039;&#039;tx init&#039;&#039;&#039; into dolibarr project root directory.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd git/dolibarr&lt;br /&gt;
tx init&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Accept to overwrite config file. Keep default value for Transifex instance, then enter your Transifex login and password.&lt;br /&gt;
&lt;br /&gt;
After this, a .transifexrc has been created into your HOME dir and a generic config file has been created as &#039;&#039;&#039;.tx/config&#039;&#039;&#039; in project&#039;s root.&lt;br /&gt;
So your directory&#039;s contents will look like that:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
|-- build&lt;br /&gt;
|-- build.xml&lt;br /&gt;
|-- ChangeLog&lt;br /&gt;
|-- COPYING&lt;br /&gt;
|-- COPYRIGHT&lt;br /&gt;
|-- dev&lt;br /&gt;
|-- doc&lt;br /&gt;
|-- .gitignore&lt;br /&gt;
|-- htdocs&lt;br /&gt;
|-- INSTALL&lt;br /&gt;
|-- pom.xml&lt;br /&gt;
|-- quickbuild.xml&lt;br /&gt;
|-- README&lt;br /&gt;
|-- README-FR&lt;br /&gt;
|-- README.md&lt;br /&gt;
|-- robots.txt&lt;br /&gt;
|-- scripts&lt;br /&gt;
|-- test&lt;br /&gt;
`-- .tx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The current config file can be downloaded from https://github.com/Dolibarr/dolibarr/tree/develop/.tx , put it into .tx directory, overwriting the one created by &#039;&#039;&#039;tx init&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
This project configuration file is used to store the project’s details and the file-to-resource mappings.&lt;br /&gt;
&lt;br /&gt;
That is a sample of what the config file contains:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[main]&lt;br /&gt;
host = https://www.transifex.com&lt;br /&gt;
lang_map = uz: uz_UZ&lt;br /&gt;
&lt;br /&gt;
[dolibarr.admin]&lt;br /&gt;
file_filter = htdocs/langs/&amp;lt;lang&amp;gt;/admin.lang&lt;br /&gt;
source_file = htdocs/langs/en_US/admin.lang&lt;br /&gt;
source_lang = en_US&lt;br /&gt;
type = MOZILLAPROPERTIES&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here is an explanation of the sections and options used in the config file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;[main] section&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this section, we have project-wide options, such as the default transifex host for all projects. These can be overridden by each resource, in case it is needed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;[dolibarr.resource]&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
source_lang: this is the source language of the resource.&amp;lt;br /&amp;gt;&lt;br /&gt;
source_file: this points to the source file directly.&amp;lt;br /&amp;gt;&lt;br /&gt;
file_filter: here we hold the expression used to identify translation files under the specific project. &#039;&#039;not mandatory&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
trans.&amp;lt;lang&amp;gt;: this is used for translation files that don’t follow a common naming schema and the file expression cannot be used to track them. &#039;&#039;not mandatory&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
host: in case the project doesn’t use the default Transifex server as specified in the [main] section, it can override it using this option. &#039;&#039;not mandatory&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====TX Client use====&lt;br /&gt;
Some useful information on &#039;&#039;&#039;tx&#039;&#039;&#039; commands.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;tx status&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Show status of translations&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;tx push&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Used to push changes from your computer to Transifex server&amp;lt;br&amp;gt;&lt;br /&gt;
Additional options for the tx push command are:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
-h - Shows the help screen for the command&lt;br /&gt;
-l &amp;lt;lang&amp;gt; - Specify which translations you want to push (defaults to all)&lt;br /&gt;
-r &amp;lt;resource&amp;gt; - Specify the resource for which you want to push the translations (defaults to all)&lt;br /&gt;
-f - Push source files without checking modification times&lt;br /&gt;
--skip - Don&#039;t stop on errors. Useful when pushing many files concurrently.&lt;br /&gt;
-s - Push the source file to the server&lt;br /&gt;
-t - Push the translation files to the server&lt;br /&gt;
--no-interactive - Don&#039;t require user input when forcing a push&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;tx pull&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Used to pull changes from Transifex server to your computer&amp;lt;br /&amp;gt;&lt;br /&gt;
Additional options for the tx pull command are:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
-h - Shows the help screen for the command&lt;br /&gt;
-l &amp;lt;lang&amp;gt; - Specify which translations you want to pull (defaults to all)&lt;br /&gt;
-r &amp;lt;resource&amp;gt; - Specify the resource for which you want to pull the translations (defaults to all)&lt;br /&gt;
-a - Fetch all translation files from the server (even new ones)&lt;br /&gt;
-s - Force the fetching of the source file (default: False)&lt;br /&gt;
-f - Force download of translations files&lt;br /&gt;
--skip - Don&#039;t stop on errors. Useful when pushing many files concurrently.&lt;br /&gt;
--disable-overwrite - By default Transifex will fetch new translations files and replace existing ones. Use this flag if you want to disable this feature.&lt;br /&gt;
--minimum_perc=VALUE - Specify the minimum acceptable percentage of a translation in order to download it.&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Examples&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
To pull translation files, you can use:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tx -d pull -l it_IT  # Get italian language only&lt;br /&gt;
tx -d pull -a   # Get all languages&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To push source files, just type:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tx -d push -t -l it_IT [-r dolibarr.file]   # To push only a specific translation file&lt;br /&gt;
tx -d push -s  # To push source file&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Other questions on transifex process===&lt;br /&gt;
This is short questions and answers you may also ask about transifex translation process:&lt;br /&gt;
&lt;br /&gt;
1) Is the sync done on a regular time interval?&lt;br /&gt;
&lt;br /&gt;
No. It is done where there is enough translation submitted. It is also done on a beta branch just before creating the final release package.&lt;br /&gt;
 &lt;br /&gt;
2) Are all the translations synced to git or only the reviewed translations ? Do I need to review before sync is done?&lt;br /&gt;
&lt;br /&gt;
When a Sync is done, transifex files overwrites files into git, but only if there is at least on record modified for the file. &lt;br /&gt;
You don&#039;t have to make a review before sync is done. Making review is above all to know which lines were manually reviewed and which one was initially translated using a robot. The sync always take the last translated version, even if the new translation was not reviewed.&lt;br /&gt;
 &lt;br /&gt;
3) In which Dolibarr releases will translations be available? Are Transifex translations also synced to maintenance releases?&lt;br /&gt;
&lt;br /&gt;
Sync is always done on develop and/or beta.&lt;br /&gt;
So Transifex changes appear in all versions whose branch is created after the Transifex change (a sync is always done before creating a new branch). Once a branch is created, the new changes into Transifex will be available only for the next branch. The reason for this is that we do not manage branch/versions on Transifex (not yet).&lt;br /&gt;
&lt;br /&gt;
==Manual Translation (not recommended)==&lt;br /&gt;
&lt;br /&gt;
To translate Dolibarr into another language, go to the langs directory and create a folder/directory named with the code language to translate (follow the existing format, for example en_US, en_GB, es_ES, de_DE, etc...). Then copy the files from an existing language directory (for example en_US/main.lang, en_GB/bills.lang), into the new language directory that you have just created.&lt;br /&gt;
&lt;br /&gt;
These files have the format of key/value pairs in each line like the followings:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
Code1 = translate phrase 1&lt;br /&gt;
Code2 = translate phrase 2&lt;br /&gt;
...&lt;br /&gt;
Coden = translate phrase n&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Translate the phrases (the value portion of the key/value pairs) on the right side of the &amp;quot;=&amp;quot; as seen above, the code (the key portion) on the left side of &amp;quot;=&amp;quot; should remain unchanged. It is possible to translate the files one by one, without bringing them all at once. If a file has not been translated into the new language, Dolibarr uses English.&lt;br /&gt;
&lt;br /&gt;
To have a localised (translated) string into the PHP code, all you have to do is load the language file and use the method to get the translated value, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$langs-&amp;gt;load(&amp;quot;myfile&amp;quot;); // or use $langs-&amp;gt;load(&amp;quot;myfile@mymodule&amp;quot;) if myfile.lang is inside directory htdocs/mymodule/langs/xx_XX   &lt;br /&gt;
&lt;br /&gt;
print $langs-&amp;gt;trans(&amp;quot;CodeX&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An entry type;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
CodeX = phrase X&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
must be present or added to the myfile.lang file.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Automatic Translation with autotranslator.php tool==&lt;br /&gt;
&lt;br /&gt;
*Translator OS: All&lt;br /&gt;
*Tool: &#039;&#039;&#039;autotranslator.php&#039;&#039;&#039; provided with Dolibarr in directory &#039;&#039;&#039;dev/translation&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
This method is recommended when starting translation for a language not already initialized. If there is already a translation available but you need to add a missing key or correct errors, try to use method using Transifex (see later).&lt;br /&gt;
&lt;br /&gt;
To make or update all files of a language code, just run the script:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
php autotranslator.php lang_code_source lang_code_target GOOGLEAPIKEY&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
For example&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
php autotranslator.php en_US pt_PT GOOGLEAPIKEY&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
to translate into Portuguese (pt_PT) using English (en_US) files.&lt;br /&gt;
&lt;br /&gt;
All nonexisting files will be created, all existing files will be updated.&lt;br /&gt;
The tool use [http://translate.google.com Google translation] service to find the translation value of a string, so a working Internet connection is required from station running the script. Also, a GOOGLEAPIKEY is required and Google charges a fee for using this service (20 euros / 1 000 000 of translated chars).&lt;br /&gt;
Your PHP must also have permissions to write into &#039;&#039;&#039;htdocs/langs&#039;&#039;&#039; directory and must have curl functions available.&lt;br /&gt;
&lt;br /&gt;
=[[File:Language.png]] Distribute or include your translation into core source=&lt;br /&gt;
&lt;br /&gt;
Once you start translating, it&#039;s a smart decision to share it, so it can be included in the official code of Dolibarr.&lt;br /&gt;
If you keep it for you, others will not be able to improve it when new terms are added or previous terms are modified, and you will still have to manage the translation on your own.&lt;br /&gt;
&lt;br /&gt;
If you translated through the Transifex system, there&#039;s nothing to be done. Your translation will be included in the next version of Dolibarr. No additional work! In technical terms, the translation will be exported from Transifex and imported into Dolibarr by our developers, at least once every month.&lt;br /&gt;
&lt;br /&gt;
If, however, you translated directly in Dolibarr files, then you will first have to transfer those translations to Transifex before they can be included. So, really, you should start translating into Transifex.&lt;br /&gt;
If you send us your translation through a Pull Request on Github, sadly, it will be overwritten by the next import from Transifex, so it would be very short-lived.&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
&lt;br /&gt;
The reference language is en_US and is always complete. You can find it in the htdocs/langs/en_US/ folder. All other language files are likely to be slightly or highly incomplete, depending on the language.&lt;br /&gt;
&lt;br /&gt;
If you are developing a new module, you are likely going to need the addition of new language variables. This is done exclusively through the update of the en_US language (htdocs/langs/en_US/ folder). Just modify these files to add the variable you need and send the resulting folder as part of your Pull Request. Refer to the developer documentation to learn how to contribute code (you will need an account on {{TemplateUrlSCM}}.&lt;br /&gt;
&lt;br /&gt;
=[[File:Language.png]] Translate documentation on wiki=&lt;br /&gt;
The wiki is written in 3 languages: English, French, and Spanish.&lt;br /&gt;
If you want to enhance documentation on one of these languages, all you have to do is to create an account on this wiki.&lt;br /&gt;
Then, you can edit existing pages to correct a bad translation or translate pages waiting for translation [[:Category:Page_waiting_for_translation]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===How to translate an existing page ?===&lt;br /&gt;
&lt;br /&gt;
====Create a new page for the translated version.====&lt;br /&gt;
Start by creating a new page for the translated version. To do this, you can access an non existant URL&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: for example [[Translator documentation|&amp;lt;code&amp;gt;https://wiki.dolibarr.org/index.php/Ma_nouvelle_page_en_français&amp;lt;/code&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
The chosen title for the translated version of the page should be the translation of the title of the original English page.&lt;/div&gt;</summary>
		<author><name>Kusco</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Documentation_traducteur&amp;diff=65903</id>
		<title>Documentation traducteur</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Documentation_traducteur&amp;diff=65903"/>
		<updated>2026-04-17T08:46:50Z</updated>

		<summary type="html">&lt;p&gt;Kusco: /* Créer un compte transifex et choisissez votre langue */&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 : Translator_documentation --&amp;gt;&lt;br /&gt;
[[en:Translator_documentation]]&lt;br /&gt;
[[es:Documentación_traductores]]&lt;br /&gt;
[[de:Dokumentation_Uebersetzung]]&lt;br /&gt;
[[zh:翻译文档]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
{{#metamaster:keywords|traduction, documentation, traducteur, localisation, localiser, internationalise, langage}}&lt;br /&gt;
=[[File:Language.png]] Traduire l&#039;application Dolibarr dans une autre langue=&lt;br /&gt;
Dolibarr est livré avec plusieurs langues. Par défaut, l&#039;Anglais est toujours complet. Les autres langues dépendent des contributions. Cette documentation vous présente comment traduire les fichiers langues pour ajouter une langue non traduite ou traduite de manière incomplète.&lt;br /&gt;
&lt;br /&gt;
Il existe 3 méthodes pour réaliser la traduction de Dolibarr:&lt;br /&gt;
&lt;br /&gt;
#Manuelle en utilisant Transifex.com (officielle et recommandée).&lt;br /&gt;
#Manuelle par modification des fichiers langues&lt;br /&gt;
#Automatique avec autotranslator.php&lt;br /&gt;
&lt;br /&gt;
Les voici par ordre de préférences:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Traduction manuelle en utilisation le service en ligne de traduction Transifex (recommandé)==&lt;br /&gt;
&lt;br /&gt;
Transifex est une solution web qui fournit une plateforme pour la traduction des projets. Cela inclut la gestion d&#039;équipes et de discussions, la mémoire de traduction, glossaires, and nombreuses autres fonctionnalités.&lt;br /&gt;
C&#039;est assez simple d&#039;utilisation et toute traduction peut être soumise ou récupérer à traver de l&#039;interface web ou en utilisant le client TX dans un terminal.&lt;br /&gt;
&lt;br /&gt;
Transifex fournit un service hébergé en ligne.&lt;br /&gt;
&lt;br /&gt;
{{ToTranslate}}&lt;br /&gt;
&lt;br /&gt;
==Créer un compte transifex et choisissez votre langue==&lt;br /&gt;
Si vous souhaitez contribuer à la traduction de Dolibarr dans votre langue, référez-vous s&#039;il vous plaît au lien suivant : https://app.transifex.com/dolibarr-association/dolibarr/dashboard/, puis vérifiez si votre langue est prise en compte.&lt;br /&gt;
Si elle existe (plusieurs équipes sont disponibles pour travailler sur le projet), vous pouvez demander à rejoindre l&#039;équipe et commencer à traduire tout de suite. S&#039;il n&#039;existe pas d’équipe pour votre langue, vous pouvez demander une nouvelle équipe sur Transifex. Cela peut être fait directement sur le site Web de http://transifex.com&lt;br /&gt;
&lt;br /&gt;
===Utilisation de l&#039;interface Web (pour les traducteurs)===&lt;br /&gt;
Si la langue est déjà disponible sur la page https://app.transifex.com/dolibarr-association/dolibarr/dashboard/, créez un compte et suivez les instructions du site Web de transifex pour traduire les fichiers.&lt;br /&gt;
&lt;br /&gt;
Notez que cette interface Web ne doit pas être utilisée pour traduire le langage en_US source. Toute modification de la langue source doit être effectuée en soumettant une modification de code à l&#039;aide de demandes d&#039;extraction GitHub.&lt;br /&gt;
&lt;br /&gt;
===Utilisation du client en ligne de commande TX (pour Dolibarr [[:Category:Yoda]] team)===&lt;br /&gt;
Ceci décrit comment utiliser Transifex à partir de la ligne de commande. Toutefois, cela est réservé aux administrateurs Dolibarr pour synchroniser Transifex avec les sources principales de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
[http://docs.transifex.com/developer/client/ Documentation officielle]&lt;br /&gt;
&lt;br /&gt;
====TX Client configuration====&lt;br /&gt;
Installez d&#039;abord TX Client.&lt;br /&gt;
Avec Debian/Ubuntu/Mint:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
apt-get install python-pip&lt;br /&gt;
pip install transifex-client&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Ensuite, vous devez initialiser votre environnement TX. Ceci est fait en exécutant &#039;&#039;&#039;tx init&#039;&#039;&#039;  dans le répertoire racine du projet dolibarr.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd git/dolibarr&lt;br /&gt;
tx init&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Acceptez pour écraser le fichier de configuration. Conservez la valeur par défaut pour l&#039;instance Transifex, puis entrez votre identifiant et votre mot de passe Transifex.&lt;br /&gt;
&lt;br /&gt;
After this, a .transifexrc has been created into your HOME dir and a generic config file has been created as &#039;&#039;&#039;.tx/config&#039;&#039;&#039; dans la racine du projet.&lt;br /&gt;
Ainsi, le contenu de votre répertoire ressemblera à cela:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
|-- build&lt;br /&gt;
|-- build.xml&lt;br /&gt;
|-- ChangeLog&lt;br /&gt;
|-- COPYING&lt;br /&gt;
|-- COPYRIGHT&lt;br /&gt;
|-- dev&lt;br /&gt;
|-- doc&lt;br /&gt;
|-- .gitignore&lt;br /&gt;
|-- htdocs&lt;br /&gt;
|-- INSTALL&lt;br /&gt;
|-- pom.xml&lt;br /&gt;
|-- quickbuild.xml&lt;br /&gt;
|-- README&lt;br /&gt;
|-- README-FR&lt;br /&gt;
|-- README.md&lt;br /&gt;
|-- robots.txt&lt;br /&gt;
|-- scripts&lt;br /&gt;
|-- test&lt;br /&gt;
`-- .tx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The current config file can be downloaded from https://github.com/Dolibarr/dolibarr/tree/develop/.tx , put it into .tx directory, overwriting the one created by &#039;&#039;&#039;tx init&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
This project configuration file is used to store the project’s details and the file-to-resource mappings.&lt;br /&gt;
&lt;br /&gt;
That is a sample of what the config file contains:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[main]&lt;br /&gt;
host = https://www.transifex.com&lt;br /&gt;
lang_map = uz: uz_UZ&lt;br /&gt;
&lt;br /&gt;
[dolibarr.admin]&lt;br /&gt;
file_filter = htdocs/langs/&amp;lt;lang&amp;gt;/admin.lang&lt;br /&gt;
source_file = htdocs/langs/en_US/admin.lang&lt;br /&gt;
source_lang = en_US&lt;br /&gt;
type = MOZILLAPROPERTIES&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here is an explanation of the sections and options used in the config file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;[main] section&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this section we have project-wide options, such as the default transifex host for all projects. These can be overriden by each resource, in case it is needed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;[dolibarr.resource]&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
source_lang: this is the source language of the resource.&amp;lt;br /&amp;gt;&lt;br /&gt;
source_file: this points to the source file directly.&amp;lt;br /&amp;gt;&lt;br /&gt;
file_filter: here we hold the expression used to identify translation files under the specific project. &#039;&#039;not mandatory&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
trans.&amp;lt;lang&amp;gt;: this is used for translation files that don’t follow a common naming schema and the file expression cannot be used to track them. &#039;&#039;not mandatory&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
host: in case the project doesn’t use the default Transifex server as specified in the [main] section, it can override it using this option. &#039;&#039;not mandatory&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====TX Client use====&lt;br /&gt;
Some useful information on &#039;&#039;&#039;tx&#039;&#039;&#039; commands.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;tx status&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Show status of translations&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;tx push&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Used to push changes from your computer to Transifex server&amp;lt;br&amp;gt;&lt;br /&gt;
Additional options for the tx push command are:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
-h - Shows the help screen for the command&lt;br /&gt;
-l &amp;lt;lang&amp;gt; - Specify which translations you want to push (defaults to all)&lt;br /&gt;
-r &amp;lt;resource&amp;gt; - Specify the resource for which you want to push the translations (defaults to all)&lt;br /&gt;
-f - Push source files without checking modification times&lt;br /&gt;
--skip - Don&#039;t stop on errors. Useful when pushing many files concurrently.&lt;br /&gt;
-s - Push the source file to the server&lt;br /&gt;
-t - Push the translation files to the server&lt;br /&gt;
--no-interactive - Don&#039;t require user input when forcing a push&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;tx pull&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Used to pull changes from Transifex server to your computer&amp;lt;br /&amp;gt;&lt;br /&gt;
Additional options for the tx pull command are:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
-h - Shows the help screen for the command&lt;br /&gt;
-l &amp;lt;lang&amp;gt; - Specify which translations you want to pull (defaults to all)&lt;br /&gt;
-r &amp;lt;resource&amp;gt; - Specify the resource for which you want to pull the translations (defaults to all)&lt;br /&gt;
-a - Fetch all translation files from server (even new ones)&lt;br /&gt;
-s - Force the fetching of the source file (default: False)&lt;br /&gt;
-f - Force download of translations files&lt;br /&gt;
--skip - Don&#039;t stop on errors. Useful when pushing many files concurrently.&lt;br /&gt;
--disable-overwrite - By default Transifex will fetch new translations files and replace existing ones. Use this flag if you want to disable this feature.&lt;br /&gt;
--minimum_perc=VALUE - Specify the minimum acceptable percentage of a translation in order to download it.&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Examples&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
To pull translation files, you can use:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tx -d pull -l it_IT  # Get italian language only&lt;br /&gt;
tx -d pull -a   # Get all languages&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To push source files, just type:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tx -d push -t -l it_IT [-r dolibarr.file]   # To push only a specific translation file&lt;br /&gt;
tx -d push -s  # To push source file&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Other questions on transifex process===&lt;br /&gt;
This is short questions and answer yuo may also ask about transifex translation process:&lt;br /&gt;
&lt;br /&gt;
1) Is the sync on a regular time interval ?&lt;br /&gt;
&lt;br /&gt;
No. It is done where there is enough translation submited. It is also done on a beta branch just before creating the final release package.&lt;br /&gt;
 &lt;br /&gt;
2) Are all the translations synced to git, or only the reviewed translations. Do I need to review before sync is done ?&lt;br /&gt;
&lt;br /&gt;
When a Sync is done, transifex files overwrites files into git, but only if there is at least on record modified for the file. &lt;br /&gt;
You don&#039;t have to make review before sync is done. Making review is above all to know which lines were manually reviewed and wich one were intially translated using a robot.&lt;br /&gt;
 &lt;br /&gt;
3) In which Dolibarr releases will translations be available ? Are transifex translations also synced to maintenance releases ?&lt;br /&gt;
&lt;br /&gt;
Sync is always done on develop and/or beta.&lt;br /&gt;
So transifex changes appear in all version whose branch is created after the transifex change (a sync is always done before creating a new branch). Once a branch is created, then new changes into transifex will be available only for next branch. Reason of this is that transifex is not able to manage branch/versions (not yet).&lt;br /&gt;
&lt;br /&gt;
==Traduction manuelle complètement (non recommandé)==&lt;br /&gt;
&lt;br /&gt;
Pour traduire Dolibarr dans une autre langue, il faut aller dans le répertoire langs et créer un répertoire ayant pour nom le code langue à traduire (En suivant le même format que ceux déjà existant, par exemple en_US, fr_FR, es_ES, de_DE, etc...).&lt;br /&gt;
Il faut ensuite recopier les fichiers lang depuis un répertoire déjà traduit (par exemple en_US/main.lang ou fr_FR/bills.lang), les recopier dans le répertoire de la nouvelle langue que l&#039;on vient de créer et traduire le contenu de ces fichiers.&lt;br /&gt;
&lt;br /&gt;
Ces fichiers sont constitués de la manière suivante:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
Code1=Phrases à traduire 1&lt;br /&gt;
Code2=Phrases à traduire 2&lt;br /&gt;
...&lt;br /&gt;
Coden=Phrases à traduire n&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Seules les phrases à droite du = sont à traduire, le code doit rester inchangé.&lt;br /&gt;
Il est possible de traduire les fichiers un par un, sans tous les traduire d&#039;un coup. Si un fichier n&#039;a pas été traduit dans la nouvelle langue, Dolibarr utilisera l&#039;anglais.&lt;br /&gt;
&lt;br /&gt;
Pour avoir une chaine variable selon la langue dans le code PHP, tout ce que vous avez à faire  et de charger le fichier lang et d&#039;utiliser la méthode pour récupérer la variable traduite. Ceci peut se faire de la manière suivante:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$langs-&amp;gt;load(&amp;quot;nomdufichier&amp;quot;); // ou $langs-&amp;gt;load(&amp;quot;nomdufichier@monmodule&amp;quot;) si monfichier.lang est dans le répertoire htdocs/monmodule/langs/xx_XX   &lt;br /&gt;
&lt;br /&gt;
print $langs-&amp;gt;trans(&amp;quot;CodeX&amp;quot;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et une entrée du type&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
CodeX=Phrase X&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
doit être ajoutée aux fichiers .lang&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Traduction automatique avec l&#039;outil autotranslator.php (non recommandée)==&lt;br /&gt;
&lt;br /&gt;
*OS du traducteur: Tous&lt;br /&gt;
*Outil: autotranslator.php fourni avec Dolibarr dans le répertoire &#039;&#039;&#039;dev/translation&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Pour traduire ou mettre à jour tous les fichiers dans une nouvelle langue, lancez simplement le script:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
php autotranslator.php lang_code_source lang_code_target GOOGLEAPIKEY&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Par exemple&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
php autotranslator.php en_US pt_PT GOOGLEAPIKEY&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
pour traduire en portugais (pt_PT) en utilisant l&#039;anglais (en_US) comme fichiers sources.&lt;br /&gt;
&lt;br /&gt;
Tous les fichiers non existant seront créés, et ceux existant déjà seront mis à jour pour être complétés avec les chaines manquantes.&lt;br /&gt;
Les chaines déjà traduites sont conservées tel quelles.&lt;br /&gt;
L&#039;outil utilise le service de [http://translate.google.com traduction Google] pour trouver la valeur traduite d&#039;une chaine, aussi un accès internet depuis le poste où est lancé la commande est requis.&lt;br /&gt;
De plus, une clé pour utiliser les API Google Translate sont nécessaire et Google fait payer l&#039;utilisation de cette API (20 $ / 1 000 000 de caractères traduits).&lt;br /&gt;
Votre PHP doit de plus avoir les permissions d&#039;écrire dans le répertoire &#039;&#039;&#039;htdocs/langs&#039;&#039;&#039; directory et doit avoir les fonctions de l&#039;extension curl disponibles.&lt;br /&gt;
&lt;br /&gt;
=[[File:Language.png]] Diffusion ou intégration en standard de votre traduction=&lt;br /&gt;
&lt;br /&gt;
La meilleure chose à faire, après avoir réalisé une traduction, est de les inclure dans la version officielle de Dolibarr. &lt;br /&gt;
&lt;br /&gt;
Si vous avez complété des fichiers .lang existant déjà dans Dolibarr mais incomplets ou si vous avez créé des nouveaux fichiers .lang pour une nouvelle langue, vous pouvez&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
*Si la traduction a été faite en utilisant le système Transifex, il n&#039;y a rien de particulier à faire. Votre traduction sera intégré lors des synchros régulières qui ont lieu avec les sources Git officielles (au moins 1 par mois).&lt;br /&gt;
*Si la traduction a été faite dans des fichiers directement pour les langues en_US, pt_BR, xx_ES, ..., il est possible de les intégrer si vous connaissez le système GIT. Pour cela, créer un compte sur {{TemplateUrlSCM}}, forker le projet, modifier les fichiers concernés et envoyer une Pull Request. A défaut de savoir utiliser GIT, envoyer vos fichiers sur la mailing-list des développeurs &#039;&#039;&#039;dolibarr-dev&#039;&#039;&#039; (Inscription sur {{TemplateURLMLDev}}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Remarque:&#039;&#039; Il y a une langue maitre toujours complète:&lt;br /&gt;
&lt;br /&gt;
*L&#039;anglais (fichiers .lang du répertoire lang/en_US)&lt;br /&gt;
&lt;br /&gt;
Tous les autres fichiers langues sont susceptibles d&#039;être incomplets.&lt;br /&gt;
&lt;br /&gt;
=[[File:Language.png]] Traduire la documentation du wiki=&lt;br /&gt;
Le wiki est maintenu en 3 langues: Anglais, Français et Espagnol.&lt;br /&gt;
Si vous voulez améliorer la documentation d&#039;une de ces langues, il vous suffit de créer un compte sur ce wiki.&lt;br /&gt;
Ensuite, vous pouvez modifier toute page qui possède une traduction incorrecte ou traduire une page qui attend d&#039;être traduite. La liste de ces pages est disponible sur la page [[:Category:Page_waiting_for_translation]].&lt;/div&gt;</summary>
		<author><name>Kusco</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=List_of_modules_id&amp;diff=64876</id>
		<title>List of modules id</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=List_of_modules_id&amp;diff=64876"/>
		<updated>2025-11-30T00:03:44Z</updated>

		<summary type="html">&lt;p&gt;Kusco: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TemplateDocDevEn}}&lt;br /&gt;
{{TemplateDocDevEs}}&lt;br /&gt;
{{TemplateDocDevFr}}&lt;br /&gt;
{{TemplateDocDevZh}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This page list all reserved modules numbers / ID.&lt;br /&gt;
&lt;br /&gt;
If you build or want to build your own modules, you should take an ID range here. Please pick range into existing holes first.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=ID 0 - 94999=&lt;br /&gt;
This range is reserved for Dolibarr&#039;s internal core modules, so all modules available into the standard distribution at https://github.com/Dolibarr/dolibarr&lt;br /&gt;
&lt;br /&gt;
=ID 95000 - 99999=&lt;br /&gt;
This range is reserved for Dolibarr&#039;s community modules with sources hosted into the github repository: https://github.com/Dolibarr/dolibarr-community-modules&lt;br /&gt;
&lt;br /&gt;
=ID 100000 - 499999=&lt;br /&gt;
&lt;br /&gt;
Reserved area for editors in need for an ID range. You can edit this page to add your own range (take a range of 20 numbers only the first time, ask us for more)&lt;br /&gt;
&lt;br /&gt;
[[File:Warning.png]] If you reserve more than 20 at once, we may automatically change your reservation range without information and you may experience conflicts with other modules in a future, so please follow the rules! &lt;br /&gt;
&lt;br /&gt;
*ID 100000 - 100999: OpenThink (http://www.openthink.be) - Belgium&lt;br /&gt;
*ID 101000 - 101999: NLTechno (https://www.nltechno.com) - France&lt;br /&gt;
*ID 102000 - 102999: Tiaris (http://www.tiaris.fr) - France&lt;br /&gt;
*ID 103000 - 103999: Open-concept.pro (http://www.open-concept.pro) - France&lt;br /&gt;
*ID 104000 - 104999: ATM Consulting (http://www.atm-consulting.fr) - France&lt;br /&gt;
*ID 105000 - 105999: GPC.solutions - France&lt;br /&gt;
*ID 106000 - 106999: PHPASSO&lt;br /&gt;
*ID 107000 - 107999: TecLib (http://www.teclib.com) / Auguria (http://www.auguria.net) - France&lt;br /&gt;
*ID 108000 - 108999: ETHICWEB&lt;br /&gt;
*ID 109000 - 109999: Aplose ([http://www.aplose.fr https://www.aplose.fr]) - France&lt;br /&gt;
*ID 110000 - 110999: Association Dolibarr (https://www.dolibarr.org)&lt;br /&gt;
*ID 111000 - 111999: Asset IT (www.assetit.ch) - Suisse&lt;br /&gt;
*ID 112000 - 112999: Aarboard AG (www.aarboard.ch) - Suisse&lt;br /&gt;
*ID 113000 - 113999: Asilib - Alexandre Spangaro&lt;br /&gt;
*ID 114000 - 114999: Iceleaf OÜ&lt;br /&gt;
*ID 115000 - 115999: 2A2C Conseil - Cyril ZEKSER&lt;br /&gt;
*ID 116000 - 116999: Wolftec GmbH&lt;br /&gt;
*ID 117000 - 117999: Oscim (http://www.oscim.fr)&lt;br /&gt;
*ID 118000 - 118999: Oarces Web (dev.oarces.com)&lt;br /&gt;
*ID 119000 - 119999: Manuel Berrocal - Absolacom&lt;br /&gt;
*ID 120000 - 120999: Régis Houssin (http://www.inodbox.com) - France&lt;br /&gt;
*ID 121000 - 121999: Oscss - Shop - France&lt;br /&gt;
*ID 122000 - 122999: MrSof - la Nation du Web&lt;br /&gt;
*ID 123000 - 123999: Bruno Généré (webiseasy.org)&lt;br /&gt;
*ID 124000 - 124999: 7reasons s.r.l. (www.7reasons.eu) - Austria&lt;br /&gt;
*ID 125000 - 125999: ProgSI (www.progsi.ma)&lt;br /&gt;
*ID 126000 - 126999: Catalanet&lt;br /&gt;
*ID 127000 - 127999: Virgilio Filho pt-BR Brasil (@dolibarr.br) - Brazil&lt;br /&gt;
*ID 128000 - 128999: Nicolas Frappé France (www.sospc.info)&lt;br /&gt;
*ID 129000 - 129999: Adeo-Informatique&lt;br /&gt;
*ID 130000 - 130999: Technicks ICT (http://www.technicks.eu) - Italy&lt;br /&gt;
*ID 131000 - 131999: Joan Louis (itaca.fr) - France&lt;br /&gt;
*ID 132000 - 132999: Jean-Marie Arsac (https://azimut.fr) - France&lt;br /&gt;
*ID 133000 - 133999: Oriel Systems Ltd, UK. (www.orielsystems.com)&lt;br /&gt;
*ID 134000 - 134999: ALSOFT PVT. LTD. (https://www.alsoft.org)&lt;br /&gt;
*ID 135000 - 135999: Net-Logic (https://netlogic.fr)&lt;br /&gt;
*ID 136000 - 136050: MONA.RE - France&lt;br /&gt;
*ID 136051 - 136099: La Vida Marketing&lt;br /&gt;
*ID 136100 - 136149: Synergies-Tech France. (https://www.synergies-france.fr/)&lt;br /&gt;
*ID 136150 - 136199: Lyta&lt;br /&gt;
*ID 136200 - 136219: Maison Théophile Leclerc&lt;br /&gt;
*ID 136220 - 136270: SegoFount - Spain&lt;br /&gt;
*ID 136271 - 136320: Labor Dispatch (Simon Sheng , China)&lt;br /&gt;
*ID 136321 - 136370: MB Informatique (https://www.mb-informatique.fr)&lt;br /&gt;
*ID 136371 - 136420: Daxit Solutions (https://www.daxit.be)&lt;br /&gt;
*ID 136421 - 136470: HUSCH GmbH (https://husch-gmbh.de)&lt;br /&gt;
*ID 136471 - 138999: NSINFO (https://www.ns-info.fr)&lt;br /&gt;
*ID 139000 - 139999: Synergies-Tech France. (https://www.synergies-france.fr/)&lt;br /&gt;
*ID 140000 - 140999: Altairis (http://altairis.fr)&lt;br /&gt;
*ID 141000 - 141050: Projet2Team (https://www.projet2team.fr)&lt;br /&gt;
*ID 141051 - 141099: Elistair (http://elistair.com)&lt;br /&gt;
*ID 141100 - 141149: Blue Networks Technologies (https://www.blnt.fr)&lt;br /&gt;
*ID 141150 - 141199: Mainlab S.r.l. (https://www.mainlabonline.it) - Italy&lt;br /&gt;
*ID 141200 - 141249: Florian DUFOURG - France&lt;br /&gt;
*ID 141250 - 141299: SoftAddicts - Canada&lt;br /&gt;
*ID 141300 - 141349: Finanboo - (https://www.finanboo.com)&lt;br /&gt;
*ID 141350 - 141399: ConstruxZion Soft - Colombia (https://www.construxzionsoft.com.co)&lt;br /&gt;
*ID 141400 - 141450: COEXDIS - République Démocratique du Congo (https://www.coexdis.com)&lt;br /&gt;
*ID 141451 - 141501: HALFWARE - Algeria (https://www.half-ware.com)&lt;br /&gt;
*ID 141502 - 141552: Quantraum (https://quantraum.com)&lt;br /&gt;
*ID 141553 - 141603: Nateo Group&lt;br /&gt;
*ID 141604 - 141653: digital centric GmbH (https://www.digitalcentric.de/dolibarr)&lt;br /&gt;
*ID 141654 - 141699: Decrypting (https://www.decrypting.fr)&lt;br /&gt;
*ID 141700 - 141749: Zeise IT Consulting - Germany (https://www.zeise-it.de)&lt;br /&gt;
*ID 141750 - 141799: Data Rooster - France (https://datarooster.io)&lt;br /&gt;
*ID 141800 - 141849: IP Développement (https://www.ipdeveloppement.fr)&lt;br /&gt;
*ID 141850 - 141899: MSICCA | MRVL Soluciones de Ingeniería y Construcción, c.a (https://msicca.com)&lt;br /&gt;
*ID 141900 - 141949: THERSANE (https://www.thersane.fr)&lt;br /&gt;
*ID 141950 - 141999: MB Informatique (https://www.mb-informatique.fr)&lt;br /&gt;
*ID 142000 - 142049: ITANéA (https://www.itanea.fr)&lt;br /&gt;
*ID 142050 - 142099: ERP Consulting NZ ([https://www.erpconsulting.co.nz www.erpconsulting.co.nz])&lt;br /&gt;
*ID 142100 - 142149: Bloxera GmbH (https://www.bloxera.com)&lt;br /&gt;
*ID 142150 - 142199: Evangelos Souglakos - Greece&lt;br /&gt;
*ID 142200 - 142249: Luc CALARESU - France&lt;br /&gt;
*ID 142250 - 142299: OmnIT Services - Belgique (https://www.omnitservices.biz)&lt;br /&gt;
*ID 142300 - 142349: Gwadeyes - Guadeloupe (https://www.gwadeyes-informatique.com/)&lt;br /&gt;
*ID 142350 - 142399: Solution Libre (https://www.solution-libre.fr/)&lt;br /&gt;
*ID 142400 - 142449: Res Digital (https://res.digital)&lt;br /&gt;
*ID 142450 - 142499: itopie informatique (https://www.itopie.ch)&lt;br /&gt;
*ID 142500 - 142549: Weblinx.IT GbR (https://weblinx.it/) - Germany&lt;br /&gt;
*ID 142550 - 142599: ASCI-Automation - Mexico (https://asci-automation.com.mx/)&lt;br /&gt;
*ID 142600 - 142649: ZENKO Design - Japan / France / Spain&lt;br /&gt;
*ID 142650 - 142699: AWeerWolf&lt;br /&gt;
*ID 142700 - 148749: Lysis (https://lysis.net/)&lt;br /&gt;
*ID 142750 - 142799: Hadritech (https://www.hadritech.com/)&lt;br /&gt;
*ID 142800 - 142849: Bloxera GmbH (https://www.bloxera.com)&lt;br /&gt;
*ID 142850 - 148999: Everlats S.L. - España (https://www.everlats.com)&lt;br /&gt;
*ID 149000 - 149999: SydTech - America Central (https://www.sydtech.io/)&lt;br /&gt;
*ID 150000 - 150999: Jeffinfo&lt;br /&gt;
*ID 151000 - 151999: Konverseo (https://konverseo.com)&lt;br /&gt;
*ID 152000 - 152049: Tanguy Pénet (http://tanguype.net)&lt;br /&gt;
*ID 152050 - 152099: Web Solutions&lt;br /&gt;
*ID 152100 - 152149: MagicNet (https://www.magicnet.it)&lt;br /&gt;
*ID 152150 - 152199: Benjamin Falière (https://www.faliere.com)&lt;br /&gt;
*ID 152200 - 152249: Solauv&lt;br /&gt;
*ID 152250 - 156499: TecnoGestión Principado S.L. (https://www.tecnogestion.com) - Asturias - España&lt;br /&gt;
*ID 156500 - 156549: ACE Recycling  (https://www.acerecycling.net.au/)&lt;br /&gt;
*ID 156550 - 156599: Kreativität Works ([http://www.kreativitat.com http://kreativitat.com])&lt;br /&gt;
*ID 156600 - 156649: [https://pierre-couy.dev Pierre Couy]&lt;br /&gt;
*ID 156650 - 156699: CXI (https://cyrix.co.za)&lt;br /&gt;
*ID 156700 - 156749: Mustafa Kemerci - Turkiye&lt;br /&gt;
*ID 156750 - 156799: [https://de-grandpre.quebec de Grandpré Technologies] - Québec (Canada)&lt;br /&gt;
*ID 156800 - 156849: Draceo&lt;br /&gt;
*ID 156850 - 156899: Valleiweb&lt;br /&gt;
*ID 156900 - 159949: NEOVIAQ Advisory LU(https://www.neoviaq.com)&lt;br /&gt;
*ID 159950 - 159999: Arve et Giffre INFOGESTION (https://www.ag-infogestion.fr)&lt;br /&gt;
*ID 160000 - 160999: Charles-François BENKE (http://www.patas-monkey.com)&lt;br /&gt;
*ID 161000 - 161999: Abbes Bahfir (https://01consulting.eu)&lt;br /&gt;
*ID 162000 - 162999: Jacques Rébiscoul&lt;br /&gt;
*ID 163000 - 163999: Open-DSI (https://www.open-dsi.fr)&lt;br /&gt;
*ID 164000 - 164999: Pixelada S. Coop. And. (https://pixelada.org)&lt;br /&gt;
*ID 165000 - 165049: DovConnect&lt;br /&gt;
*ID 165050 - 165099: Mind Operated Systems (https://www.mosystems.biz)&lt;br /&gt;
*ID 165100 - 165150: SD-Formation (https://sdformation.fr)&lt;br /&gt;
*ID 165151 - 165199: NUM&#039;X (https://www.numx-sets.eu)&lt;br /&gt;
*ID 165200 - 165249: Benjam Préjent (https://www.benjam-prejent.fr)&lt;br /&gt;
*ID 165250 - 165299: Dhi Loka Private Limited, India (https://www.dhiloka.com)&lt;br /&gt;
*ID 165300 - 169999: Accellier Limited (https://www.accellier.com/)&lt;br /&gt;
*ID 170000 - 170999: TRIDENT CONSULTING LTD (www.tridentdxb.com)&lt;br /&gt;
*ID 171000 - 171999: LVSInformatique (www.lvsinformatique.com)&lt;br /&gt;
*ID 172000 - 172299: Ray Soft-Systems (https://www.ray-soft-systems.com)&lt;br /&gt;
*ID 172300 - 172349: Günter Lukas Consulting (https://gl.co.at)&lt;br /&gt;
*ID 172350 - 172399: MB Informatique (https://www.mb-informatique.fr)&lt;br /&gt;
*ID 172400 - 172449: Professional Structures Limited (https://pstructures.com)&lt;br /&gt;
*ID 172450 - 172699: IT-BS (https://www.it-bs.fr)&lt;br /&gt;
*ID 172700 - 172749: Indelog (https://www.indelog.fr)&lt;br /&gt;
*ID 172750 - 172799: NSINFO (https://www.ns-info.fr)&lt;br /&gt;
*ID 172800 - 172849: E-Concept Applications (https://e-concept-applications.fr)&lt;br /&gt;
*ID 172850 - 172899: B&amp;amp;R Stamm UG (https://stamm-ug.de)&lt;br /&gt;
*ID 172900 - 172949: Dolipive, support@dolipive.fr, www.dolipive.fr&lt;br /&gt;
*ID 172950 - 172999: CKD-Industrie (https://ckd-industrie.com/) - France&lt;br /&gt;
*ID 173000 - 173049: Aneosys (https://aneosys.fr) - France&lt;br /&gt;
*ID 173050 - 173099: Sebastian Schloßer - Germany&lt;br /&gt;
*ID 173100 - 173149: TecnoSoluciones (https://tecnosoluciones.com)&lt;br /&gt;
*ID 173150 - 173199: Digitalworks (https://www.digitalworks.fr) - France&lt;br /&gt;
*ID 173200 - 173249: UNi.D Consulting (https://www.unid-consulting.fr) - France&lt;br /&gt;
*ID 173250 - 173299: NetworkDigital(https://www.networkdigital.fr) - France&lt;br /&gt;
*ID 173300 - 173300: Módulo VeriFactu Dolibarr (https://verifactudolibarr.es/) - España&lt;br /&gt;
*ID 173301 - 173320: Sibanet (https://sibanet.net) - España&lt;br /&gt;
*ID 173321 - 173340: disQutons (https://wiki.dolibarr.org/index.php/Category:DisQutons)&lt;br /&gt;
*ID 173341 - 173360: Surática Software (https://suratica.es) - Spain&lt;br /&gt;
*ID 173361 - 173380: UpInvoice (https://upinvoice.eu) - Spain&lt;br /&gt;
*ID 173381 - 179999: Toutatis (https://toutatis.eu)&lt;br /&gt;
*ID 180000 - 180999: Triangle Ingénierie&lt;br /&gt;
*ID 181000 - 181999: TI Sin Problemas (https://www.tisinproblemas.com)&lt;br /&gt;
*ID 182000 - 182049: Chipserv Pawel Wlizlo (https://www.testware.it)&lt;br /&gt;
*ID 182050 - 182070: Herolapse (https://herolapse.com/)&lt;br /&gt;
*ID 182061 - 182999: TMC&lt;br /&gt;
*ID 183000 - 183999: BB2A Anthony Berton (https://www.bb2a.fr)&lt;br /&gt;
*ID 184000 - 184999: DPS PRINTING &amp;amp; DOCUMENTS SOCIEDAD ANONIMA (https://www.dps-lat.com)&lt;br /&gt;
*ID 185000 - 185049: Telioskour (https://github.com/telioskour)&lt;br /&gt;
*ID 185050 - 185099: Moko Consulting ([[Moko Consulting]] || https://mokoconsulting.tech)&lt;br /&gt;
*ID 185100 - 185149: Sinabe (https://sinabe.ch) - Suisse&lt;br /&gt;
*ID 185150 - 185169: Anatole Conseil (https://anatoleconseil.com/)&lt;br /&gt;
*ID 185170 - 185189: cferoiu&lt;br /&gt;
*ID 185190 - 185209: Guillemonde (https://guillemonde.family)&lt;br /&gt;
*ID 185210 - 189999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 190000 - 190999: Diciannove (http://19.coop)&lt;br /&gt;
*ID 191000 - 191999: Elonet (https://elonet.fr)&lt;br /&gt;
*ID 192000 - 192049: IDFOR Consulting (https://www.idfor-consulting.fr/)&lt;br /&gt;
*ID 192050 - 192069: Stogger (&amp;lt;nowiki&amp;gt;https://stogger.com&amp;lt;/nowiki&amp;gt;)&lt;br /&gt;
*ID 192070 - 192090: Protectora&lt;br /&gt;
*ID 192091 - 198999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 199000 - 199999: RFMS&lt;br /&gt;
*ID 200000 - 200999: Noxiome&lt;br /&gt;
*ID 201000 - 201999: Sasa Ostrouska (saxa)&lt;br /&gt;
*ID 202000 - 202999: Z-Application&lt;br /&gt;
*ID 203000 - 203099: Elidee - elidee.com&lt;br /&gt;
*ID 203100 - 203999: Garcia MICHEL (soamichel.fr)&lt;br /&gt;
*ID 204000 - 204999: Ari Elbaz elarifr - accedinfo.com&lt;br /&gt;
*ID 205000 - 205999: Kreiz IT&lt;br /&gt;
*ID 206000 - 206999: GBINFO (www.gbinfo.fr)&lt;br /&gt;
*ID 207000 - 207099: MacroProg (https://www.macroprog.com)&lt;br /&gt;
*ID 207100 - 207149: Reactiva Software&lt;br /&gt;
*ID 207150 - 207199: Ndejje University Water Research and Development Centre ([https://github.com/NDUWRDC/LIMS/])&lt;br /&gt;
*ID 207200 - 207299: Massaoud Bouzenad ([https://www.dzprod.net dzprod.net])&lt;br /&gt;
*ID 207300 - 207349: Ksar&lt;br /&gt;
*ID 207350 - 207399: Easylinux (www.easylinux.fr)&lt;br /&gt;
*ID 207400 - 207449: Arthur LENOBLE&lt;br /&gt;
*ID 207450 - 207499: Vaicop SAS de CV (México)&lt;br /&gt;
*ID 207500 - 207520: Frankie Wong - UK&lt;br /&gt;
*ID 207521 - 212099: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 212100 - 212149: Audio Vidéo Technologies (https://www.avtek.fr)&lt;br /&gt;
*ID 212150 - 213999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 214000 - 214049: X-Boss&lt;br /&gt;
*ID 214050 - 221999: PixelJM&lt;br /&gt;
*ID 220000 - 220050: Apex Tech (https://apextechmods.com)&lt;br /&gt;
*ID 220051 - 220100: Technology Xchange Solutions (https://www.txscorp.com)&lt;br /&gt;
*ID 222000 - 222999:  dolibit  (https://www.dolibit.de)&lt;br /&gt;
*ID 223000 - 223049: Tráfico Canada&lt;br /&gt;
*ID 223050 - 223099&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: VLTN (https://vltn.sh)&lt;br /&gt;
*ID 223100 - 229949: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 229950 - 229999: Solucions Informàtiques, Serveis i Innovació SLU (https://6innova.es)&lt;br /&gt;
*ID 230000 - 230049: Unareil (https://www.unareil.eu)&lt;br /&gt;
*ID 230050 - 230099: Lyra Network (https://www.lyra.com/)&lt;br /&gt;
*ID 230100 - 230149: Gheorghe Iftimi - CTW - RO&lt;br /&gt;
*ID 230150 - 230199: MEMA Machinery &amp;amp; Tools (https://www.mema.be)&lt;br /&gt;
*ID 230200 - 230249: Teleassist&lt;br /&gt;
*ID 230250 - 230299: Nh Developer&lt;br /&gt;
*ID 230300 - 230499: Chickenforce/code-chicken, IT Services Hahn (https://github.com/code-chicken [http://itservices-hahn.de/ https://itservices-hahn.de])&lt;br /&gt;
*ID 230500 - 230549: Hidup Consulting (https://consulting.hidup.io)&lt;br /&gt;
*ID 230550 - 230599&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: CMR Conseil (https://www.weblockup.fr)&lt;br /&gt;
*ID 230600 - 230649&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: aFreeMind Studio&lt;br /&gt;
*ID 230650 - 230699&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: Unideal (https://www.uni-deal.com)&lt;br /&gt;
*ID 230700 - 230749&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: DevLansdes (https://devlandes.com/)&lt;br /&gt;
*ID 230750 - 262699: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 262700 - 262799: Scopen (https://www.scopen.fr)&lt;br /&gt;
*ID 262800 - 262849: Christophe BATTAREL EI&lt;br /&gt;
*ID 262850 - 271799: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 271800 - 271849: bee solutions sàrl (Switzerland)&lt;br /&gt;
*ID 271850 - 272999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 273000 - 273019: Taler (https://taler.net)&lt;br /&gt;
*ID 273020 - 274199: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 274200 - 274249: Mathilde MAROCCO (https://mminformatique.fr)&lt;br /&gt;
*ID 274250 - 274299: Nerv Project (www.nerv-project.eu)&lt;br /&gt;
*ID 274300 - 274349: Knowhere Consulting S.L. (https://www.knowhere-consulting.eu)&lt;br /&gt;
*ID 274350 - 274399: Milen karaganski (https://blacktiehost.com)&lt;br /&gt;
*ID 274400 - 274449: Vincent MAURY ([https://www.timgroup.fr www.timgroup.fr])&lt;br /&gt;
*ID 274450 - 274499: Daraelmin&lt;br /&gt;
*ID 274500 - 274549: Emilie LAFORET (http://www.ermvallon.com)&lt;br /&gt;
*ID 274550 - 278999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 279000 - 279049: VSDigital Electronics (https://vsdigital.ar) - Argentina&lt;br /&gt;
*ID 279050 - 279999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 280000 - 280049: Bingroup (https://www.beinng.com)&lt;br /&gt;
*ID 280050 - 280099: Medialta (https://medialta.com)&lt;br /&gt;
*ID 280100 - 280149: Cédric Ancelin - Ancode (https://www.dolistore.com/fr/recherche?search_query=ancode)&lt;br /&gt;
*ID 280150 - 289999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 290000 - 290099: BNS - Project doliBRA ([https://www.beinng.com https://www.bns.net.br]) - Brasil&lt;br /&gt;
*ID 290100 - 299999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 300000 - 300049: RapidProgress (https://www.rapidprogress.eu) - Bulgaria&lt;br /&gt;
*ID 300050&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: 300099: M@ Solution (https://www.ma-solution.fr/)&lt;br /&gt;
*ID 300100&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: 300149: LAVA RUN (https://www.lavarun.re)&lt;br /&gt;
*ID 300150 - 300199: PsyCrow Code&lt;br /&gt;
*ID 300200&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: 300249&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: Computences (https://www.computences.com/)&lt;br /&gt;
*ID 300250&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: 300299&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: LEVEL IT (https://levelit.com.ar)&lt;br /&gt;
*ID 300300&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: 300349&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: Progiseize (https://progiseize.fr)&lt;br /&gt;
*ID 300350 - 300399: MB Informatique (https://www.mb-informatique.fr)&lt;br /&gt;
*ID 300400 - 300449: Anouar Touati&lt;br /&gt;
*ID 300450 - 300499: Martin Danger&lt;br /&gt;
*ID 300500 - 301499: Whale Blows&lt;br /&gt;
*ID 301500 - 301549: Tom Trust - International&lt;br /&gt;
*ID 301550 - 301599: MB Informatique (https://www.mb-informatique.fr)&lt;br /&gt;
*ID 301600 - 302479: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 302480 - 302499: akyras (https://akyras.fr)&lt;br /&gt;
*ID 302500 - 302549: Diamubi (https://diamubi.com)&lt;br /&gt;
*ID 302550 - 302599: Datolab (https://www.datolab.com)&lt;br /&gt;
*ID 302600 - 302649: DuMaCo (https://www.dumaco.de)&lt;br /&gt;
*ID 302650 - 302699: Resilio SA&lt;br /&gt;
*ID 302700 - 302749: Aroga&lt;br /&gt;
*ID 302750 - 302799: Productivix (https://www.productivix.com)&lt;br /&gt;
*ID 302800 - 302849: Slibzz&lt;br /&gt;
*ID 302850 - 302899: idea design (https://ideadesign.dz)&lt;br /&gt;
*ID 302900 - 302949: AL MISBAH INFORMATIQUE (https://www.almisbah.ma)&lt;br /&gt;
*ID 302950 - 302999: Atis Solutions - France&lt;br /&gt;
*ID 303000 - 303499: Obixav - Nigeria&lt;br /&gt;
*ID 303500 - 303549: buschler plus GmbH, Germany (https://buschler.plus)&lt;br /&gt;
*ID 303550 - 303599: Prestalidaire - France (https://prestalidaire.com)&lt;br /&gt;
*ID 303600 - 309999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 310000 - 310049: Neilson Dufour (&amp;lt;nowiki&amp;gt;https://hypercode.ca&amp;lt;/nowiki&amp;gt;)&lt;br /&gt;
*ID 310050 - 313999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 314000 - 314049: Ruemmler IT Solutions (https://www.ruemmler.net)&lt;br /&gt;
*ID 314050 - 314149: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 314150 - 314199: Benoît PASCAL&lt;br /&gt;
*ID 314200 - 319999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 320000 - 320999: Novus Studios (www.novusstudios.it)&lt;br /&gt;
*ID 321000 - 321999: AtooNet (http://www.atoo-net.com)&lt;br /&gt;
*ID 322000 - 322049: Doymer Consultores&lt;br /&gt;
*ID 322050 - 329999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 330000 - 330049: XTEC Industries (www.xtec-ind.com)&lt;br /&gt;
*ID 330050 - 330099: 10100 S.R.L. - (www.10100.to)&lt;br /&gt;
*ID 330100 - 330149: AES Dana SRL (https://aes-dana.be)&lt;br /&gt;
*ID 330150 - 330199: Freshcore (https://www.freshcore.fr)&lt;br /&gt;
*ID 330200 - 331999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 332000 - 332099: Gecka (https://gecka.nc)&lt;br /&gt;
*ID 332100 - 332149: Agence Milkshake (http://agencemilkshake.com)&lt;br /&gt;
*ID 332150 - 332199: Daniel Prowald IT – Service (https://prowald-it.de)&lt;br /&gt;
*ID 332200 - 332249: UNITICE (https://unitice.com)&lt;br /&gt;
*ID 332250 - 332299: Sidonie Moulart&lt;br /&gt;
*ID 332300 - 332349: LTDJ (Antonin MARCHAL - Le Temple du Jeu)&lt;br /&gt;
*ID 332350 - 333299: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 333300 - 333349: Sense Africa (http://sense.africa)&lt;br /&gt;
*ID 333350 - 339999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 340000 - 340049: M34D (https://m34d.com)&lt;br /&gt;
*ID 340050 - 340069: WiwIT&lt;br /&gt;
*ID 340070 - 349999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 350000 - 350049: SOUNDOU &amp;amp; MIDAS (https://www.soundou.org/)&lt;br /&gt;
*ID 350050 - 350099: Ildefonso González (https://igontek.es)&lt;br /&gt;
*ID 350100 - 350149: 7Kas Servicios de Internet, S.L. (https://7kas.com)&lt;br /&gt;
*ID 350150 - 350999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 351000 - 351049: P&#039;tite Tête (https://ptitetete.com) - France&lt;br /&gt;
*ID 351050 - 398999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 359000 - 359049: Milen Karaganski0&lt;br /&gt;
*ID 400000 - 400999: 2byte.es (http://www.2byte.es)&lt;br /&gt;
*ID 401000 - 401999: B&amp;amp;D Informática&lt;br /&gt;
*ID 402000 - 402999: Marcos García de La Fuente (marcosgdf)&lt;br /&gt;
*ID 403000 - 403999: Sergibyte&lt;br /&gt;
*ID 404000 - 404999: Aikhan&lt;br /&gt;
*ID 405000 - 405999: AIME (http://www.aime.mx)&lt;br /&gt;
*ID 406000 - 406999: Som Núvol (https://somnuvol.coop)&lt;br /&gt;
*ID 407000 - 407019: I-Motion SARL&lt;br /&gt;
*ID 407020 - 408999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 409000 - 409999: LliureTIC (https://www.lliuretic.cat)&lt;br /&gt;
*ID 410000 - 410999: DoliGov&lt;br /&gt;
*ID 411000 - 411049: GATTEK SARL (https://www.ga-ttek.com)&lt;br /&gt;
*ID 411050 - 419999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 420000 - 420099: BBS Concept&lt;br /&gt;
*ID 420100 - 420199: LeMousticProduction (www.lemousticproduction.info) -&amp;lt; module DoliRH&lt;br /&gt;
*ID 420200 - 421199: VatCheck (www.abnc.be)&lt;br /&gt;
*ID 421200 - 422199: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 422200 - 422999: Artaban (http://artaban.fr)&lt;br /&gt;
*ID 423000 - 423049: cyberesprit&lt;br /&gt;
*ID 423050 - 423099: R.Bossard&lt;br /&gt;
*ID 423100 - 423199: Joliciel (www.joliciel.fr)&lt;br /&gt;
*ID 423200 - 423299: Pragma-tech (www.pragma-tech.fr)&lt;br /&gt;
*ID 423299 - 423999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 424000 - 424049: Philazerty ([https://www.philazerty.fr www.philazerty.fr])&lt;br /&gt;
*ID 424050 - 424099: Pragma-tech (www.pragma-tech.fr)&lt;br /&gt;
*ID 424100 - 424149: Ohoo Solutions (http://www.ohoosolutions.com)&lt;br /&gt;
*ID 424150 - 424199: DAGARCAM Informática (https://www.dagarcam.com/)&lt;br /&gt;
*ID 424200 - 424999: Lab51 (https://github.com/lab51org)&lt;br /&gt;
*ID 425000 - 425999: Sébastien SERRE Thivinfo (www.thivinfo.com)&lt;br /&gt;
*ID 426000 - 426099: Arkesis-Solution&lt;br /&gt;
*ID 426100 - 426149: GetLandy (www.getlandy.com)&lt;br /&gt;
*ID 426150 - 426649: OOB Software&lt;br /&gt;
*ID 426650 - 426849: Soft-Task Serviços e Sistemas (www.soft-task.com.br)&lt;br /&gt;
*ID 426850 - 426999: Bruno Caldas (https://github.com/BCaldas)&lt;br /&gt;
*ID 427000 - 427999: Kevin GUERRIER (alias xcl.saian)&lt;br /&gt;
*ID 428000 - 428099: af83&lt;br /&gt;
*ID 428100 - 428199: Arnaud Serrut - Adalon&lt;br /&gt;
*ID 428200 - 428249: imschweiler consulting (http://www.imschweiler-consulting.de&#039;&#039;&#039;&amp;lt;nowiki/&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
*ID 428250 - 428299: AL1FO&lt;br /&gt;
*ID 428300 - 428349: Federico García-Patiño Barbolani (&amp;lt;federico.garcia.patino@gmail.com&amp;gt;)&lt;br /&gt;
*ID 428350 - 428399: INTM Groupe - France (www.intm.com)&lt;br /&gt;
*ID 428400 - 428449: Nick Fragoulis - Greece&lt;br /&gt;
*ID 428450 - 428499: Kontava - France ([https://www.kontava.fr www.kontava.fr)]&lt;br /&gt;
*ID 428500 - 428549: hkwhitten - USA&lt;br /&gt;
*ID 428550 - 428999: SmartOne&lt;br /&gt;
*ID 429000 - 429999: induslab&lt;br /&gt;
*ID 430000 - 430099: Mixity sprl (www.mixity.be)&lt;br /&gt;
*ID 430100 - 430199: sgiraud&lt;br /&gt;
*ID 430200 - 430299: Merlion TI (www.merlion-si.com.br)&lt;br /&gt;
*ID 430300 - 431299: Libre Expert (www.libre-expert.com)&lt;br /&gt;
*ID 431300 - 431399: ptibogxiv (www.ptibogxiv.net)&lt;br /&gt;
*ID 431400 - 431499: Befox (www.befox.fr)&lt;br /&gt;
*ID 431500 - 431599: rue Béjo (www.ruebejo.fr)&lt;br /&gt;
*ID 431600 - 431699: Avizzeo (www.avizzeo.com)&lt;br /&gt;
*ID 431700 - 432199: Multisistemas (www.multisistemas.com.sv)&lt;br /&gt;
*ID 432200 - 432399: Burbuja - Chile (www.burbuja.cl)&lt;br /&gt;
*ID 432400 - 433399: INOVEA CONSEIL (https://www.inovea-conseil.com)&lt;br /&gt;
*ID 433400 - 434399: Rachid HRICH - Maroc (HricH ServiceS.)&lt;br /&gt;
*ID 434400 - 435399: Lance Bleakley - LanceIT (www.lanceit.net)&lt;br /&gt;
*ID 435400 - 435999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 436000 - 436099: SOWEBIO (www.soweb.io)&lt;br /&gt;
*ID 436100 - 436199: CAP-REL (www.cap-rel.fr)&lt;br /&gt;
*ID 436200 - 436300: TDE-INFORMATIQUE (www.tde-informatique.fr)&lt;br /&gt;
*ID 436301 - 436349: Evarisk ([https://www.evarisk.com/id-module-dolibarr/ www.evarisk.com])&lt;br /&gt;
*ID 436350 - 436399: Eoxia ([https://www.eoxia.com/dolibarr/modules/ www.eoxia.com])&lt;br /&gt;
*ID 436400 - 437399: Mohamed AHERDANE - Morocco - IT Consultant ( www.wave.ma )&lt;br /&gt;
*ID 437400 - 437449: Martin Neubauer - Germany&lt;br /&gt;
*ID 437450 - 437599: Club1click (www.club1click.es)&lt;br /&gt;
*ID 437600 - 437629: Coulon Vincent (https://github.com/HoverEpic)&lt;br /&gt;
*ID 437630 - 437649: Aytechnet (https://www.aytechnet.fr/) - François Pons&lt;br /&gt;
*ID 437650 - 437699: LibreMaster (https://libremaster.com) - Christophe T.&lt;br /&gt;
*ID 437700 - 437749: STELLAR Broadband (https://www.stellarbb.com) - U.S.A. - Philip Laycock&lt;br /&gt;
*ID 437750 - 437799: DIGITA.LU Ajous Solutions&lt;br /&gt;
*ID 437800 - 437850: iProspective (https://iprospective.fr) - Mathieu Moulin&lt;br /&gt;
*ID 437851 - 437900: Theobald Groupe.&lt;br /&gt;
*ID 437901 - 437950: Neuronnexion (http://neuronnexion.coop)&lt;br /&gt;
*ID 437951 - 437952: jmbc - APIA-ASSO (https://www.apia-asso.fr)&lt;br /&gt;
*ID 437953 - 438002: IPCZEN SARL (https://www.ipczeninformatique.fr/)&lt;br /&gt;
*ID 438003 - 438052: FESF IT Department (https://fesf.org.pk)&lt;br /&gt;
*ID 438053 - 438103: Pilot Engineering team&lt;br /&gt;
*ID 438104 - 438153: u2042 (https://u2042.com)&lt;br /&gt;
*ID 438154 - 438204: Djair E Pereira (ocultooooo@gmail.com) - Brasil&lt;br /&gt;
*ID 438205 - 438255: yoandm (https://yoandm.com)&lt;br /&gt;
*ID 438256 - 438299: PTMSoft (&amp;lt;nowiki&amp;gt;https://www.ptmsoft.fr&amp;lt;/nowiki&amp;gt;)&lt;br /&gt;
*ID 438300 - 438399: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 438400 - 439399: Tetras Libre - France - Développement logiciels libres (www.tetras-libre.fr)&lt;br /&gt;
*ID 439400 - 440399: Dolibarr-pro - France - Développement Dolibarr (www.dolibarr-pro.com)&lt;br /&gt;
*ID 440400 - 441399: Quidlab Co., Ltd - Thailand - ( www.quidlab.com )&lt;br /&gt;
*ID 441400 - 442399: Ide@log - France - (https://www.idealog-info.net) - Laurent Leblanc&lt;br /&gt;
*ID 442400 - 443399: Valerio Bianchi (www.valeriobianchi.com)&lt;br /&gt;
*ID 443400 - 444399: delassalle - France - (www.delassalle.fr) - Joseph Delassalle&lt;br /&gt;
*ID 444400 - 445399: Webartis - Maroc - (www.webartis.net) - François Dry&lt;br /&gt;
*ID 445400 - 445499: SCOP Au-delà des nuages - France&lt;br /&gt;
*ID 445500 - 445549: X Net Systems - Egypt - (https://www.xneteg.com)&lt;br /&gt;
*ID 445550 - 445569: Schiefer.IT - Austria ([https://schiefer.it schiefer.it])&lt;br /&gt;
*ID 445570 - 445999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 446000 - 446999: iouston (http://www.iouston.com) - France - Julien Marchand&lt;br /&gt;
*ID 447000 - 447999: rSanjoSEO - Rafael San José Tovar (www.rsanjoseo.com) - Spain&lt;br /&gt;
*ID 448000 - 448999: Code 42 (www.code42.fr)&lt;br /&gt;
*ID 449000 - 449999: TakePOS (www.takepos.com)&lt;br /&gt;
*ID 450000 - 450999: Pierre ARDOIN&lt;br /&gt;
*ID 451000 - 451999: Éditeur depordi.fr&lt;br /&gt;
*ID 452000 - 452999: Dylan NAKONG&lt;br /&gt;
*ID 453000 - 453999: Menahd Ouchenir - France - menahd-ouchenir.com&lt;br /&gt;
*ID 454000 - 454999: Withheld - Canada&lt;br /&gt;
*ID 455000 - 455999: Gaëtan MAISON - Info Libre @ Dom - France (https://www.infolibreadom.com)&lt;br /&gt;
*ID 456000 - 456999: Laurent LEBLEU - B.L.C. - Blue Line Company - Lille - France (www.bluelinecompany.fr/dolibarr)&lt;br /&gt;
*ID 457000 - 457999: Sébastien BOUCHER&lt;br /&gt;
*ID 458000 - 458999: Lester HERNÁNDEZ - Argentina - (freelancerlrhd@gmail.com)&lt;br /&gt;
*ID 459000 - 459999: Infopen - France&lt;br /&gt;
*ID 460000 - 460049: torvista - Spain&lt;br /&gt;
*ID 460050 - 460099:ADVAISION.com (Belgique www.advaision.com)&lt;br /&gt;
*ID460100  - 460999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 461000 - 461999: MEGALOGI - Maroc (www.erpcloud.ma)&lt;br /&gt;
*ID 462000 - 462999: Making Digital (www.making-digital.fr) - France&lt;br /&gt;
*ID 463000 - 463999: linx s.r.l.s.&lt;br /&gt;
*ID 464000 - 464999: NimbleCubed Inc. (www.nimblecubed.com)&lt;br /&gt;
*ID 465000 - 465999: Artefacts - CourantAlternatif&lt;br /&gt;
*ID 466000 - 466999: CDM Consultores - (www.cdm.guru)&lt;br /&gt;
*ID 467000 - 467999: M71 Service GmbH - (www.m71-service.de)&lt;br /&gt;
*ID 468000 - 468049: Clément Segonzac - France (clement.segonzac@gmail.com)&lt;br /&gt;
*ID 468050 - 468099: Flavien Belli - France (https://github.com/Marshlyin || belliflaviencontactpro@gmail.com)&lt;br /&gt;
*ID 468100 - 468119: Chl (https://code.bugness.org/Dolibarr)&lt;br /&gt;
*ID 468120 - 468169: Commotron GmbH (https://www.commotron.com/)&lt;br /&gt;
*ID 468170 - &#039;&#039;&#039;468219&#039;&#039;&#039;: Infans Group (franck.lauby@infans.fr)&lt;br /&gt;
*ID &#039;&#039;&#039;468175&#039;&#039;&#039; - &#039;&#039;&#039;468199&#039;&#039;&#039;: Gaëlle Rauffet - France (kiwiscan.net)&lt;br /&gt;
*ID &#039;&#039;&#039;468200&#039;&#039;&#039; - 468249: Paulo Oliveira - Brasil (paulorcdo@gmail.com)&lt;br /&gt;
*ID 468250 - 468269:  CD-Systems - France (https://www.cd-systems.fr)&lt;br /&gt;
*ID 468270 - 468299: Nicolas Testori&lt;br /&gt;
*ID 468300 - 468349: Uvensys - Germany (https://uvensys.de)&lt;br /&gt;
*ID 468350 - 468399: Laudeco - Belgium (http://github.com/laudeco)&lt;br /&gt;
*ID 468400 - 468449: Alexis LAURIER - France (https://www.alexislaurier.fr)&lt;br /&gt;
*ID 468450 - 468499: Mehdi Belkhayat - Maroc (https://opensi.ma)&lt;br /&gt;
*ID 468500 - 468599: InvIT GmbH - Germany (https://invit.sh)&lt;br /&gt;
*ID 468600 - 468649: Ricardo Sequeira - Portugal (https://ricardo-sequeira.com)&lt;br /&gt;
*ID 468650 - 468699: J-IT - Belgique (https://www.j-it.be)&lt;br /&gt;
*ID 468700 - 468749: Fidesio - France (https://www.fidesio.com/)&lt;br /&gt;
*ID 468750 - 468799: Sgestion - Spain (http://www.sgestion.net/)&lt;br /&gt;
*ID 468800 - 468849: Denis JULIEN - Brasil (matrinxa@free.fr)&lt;br /&gt;
*ID 468850 - 468899: Mmariko - Module GED - Effios&lt;br /&gt;
*ID 468900 - 468949: Maazou Amadou Abdoul aziz - Maroc (yaronfada@gmail.com)&lt;br /&gt;
*ID 468950 - 468999: Alexis LAURIER - France (https://www.alexislaurier.fr)&lt;br /&gt;
*ID 469000 - 469049: John Livingston (https://github.com/JohnXLivingston/)&lt;br /&gt;
*ID 469050 - 469099: Macrorom ICT-services (https://macrorom.nl/)&lt;br /&gt;
*ID 469100 - 469149: HABOT IT - France (https://habot.it)&lt;br /&gt;
*ID 469150 - 469159: CaribbeanConsult.Com CCC - France Guadeloupe (https://dolibarr.ccc.gp)&lt;br /&gt;
*ID 469160 - 469171: GMBG - Portugal&lt;br /&gt;
*ID 469172 - 469199: BGi Lda - Portugal&lt;br /&gt;
*ID 469200 - 469949: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 469950 - 469999: Goldoweb (http://goldoweb.com)&lt;br /&gt;
*ID 470000 - 470999: Reindeer Digital (https://rdeer.cz)&lt;br /&gt;
*ID 471000 - 471099: CAP-REL (www.cap-rel.fr)&lt;br /&gt;
*ID 471100 - 471199: M. Morillon&lt;br /&gt;
*ID 471200 - 471209: Pablo Nuñez&lt;br /&gt;
*ID 471210 - 471249: FANEL A.Ş  (https://www.fanel.com.tr)&lt;br /&gt;
*ID 471250 - 480999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 481000 - 481999: Alhaidab-ITIS (https://alhaidab.dolibarr.sd)&lt;br /&gt;
*ID 482000 - 482999: Basix IT (https://www.basix.de)&lt;br /&gt;
*ID 483000 - 483049: SASCO SpA (https://www.sasco.cl)&lt;br /&gt;
*ID 483050 - 483099: WIP Engineering (https://www.wip-gmbh.com)&lt;br /&gt;
*ID 483100 - 483149: J.Kaiser&lt;br /&gt;
*ID 483150 - 483199: CodLines (https://www.codlines.com)&lt;br /&gt;
*ID 483200 - 483249: BleepalSoftware (https://bleepal.com)&lt;br /&gt;
*ID 485000 - 485049: Gest Info Service Plus (contact@gest-plus.fr)&lt;br /&gt;
*ID 485050 - 489999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 490000 - 490049: VOLD (https://vold.lu)&lt;br /&gt;
*ID 490050 - 490999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 491000 - 491049: NORD ERP CRM (https://www.nord-erp-crm.fr/)&lt;br /&gt;
*ID 491050 - 491099: KJR-online (https://kjr-online.fr/)&lt;br /&gt;
*ID 491100 - 491149: eNova&lt;br /&gt;
*ID 491150 - 491199: App 4 Business&lt;br /&gt;
*ID 491200 - 491249: Mil24 (http://www.mil24.com.py)&lt;br /&gt;
*ID 491250 - 491299: M2AM&lt;br /&gt;
*ID 491300 - 491349: luigifab (https://github.com/luigifab), also reuse id:105009 for Sentry fork&lt;br /&gt;
*ID 491350 - 491399: Frédéric France (https://github.com/frederic34)&lt;br /&gt;
*ID 491400 - 491449: E-dem (https://www.e-dem.com/)&lt;br /&gt;
*ID 491450 - 491499: Burofree (https://burofreeai.es)&lt;br /&gt;
*ID 491500 - 491549: EMDELEN (https://emdelen.fr/)&lt;br /&gt;
*ID 491550 - 491599: eSoUrCeS Technologie (https://techno.esources.ca/) - Canada&lt;br /&gt;
*ID 491600 - 491649: GoSouce Peru - Peru&lt;br /&gt;
*ID 491650 - 491669: Kaféin Studio (https://kafein.studio) - France&lt;br /&gt;
*ID 491670 - 491999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 492000 - 492999: Anura (https://www.anura.fr/)&lt;br /&gt;
*ID 493000 - 493050: Bourez Bastien EI (https://bastien-b.fr/)&lt;br /&gt;
*ID 493051 - 493100: benhmida ilyess (bhilyess98@gmail.com)&lt;br /&gt;
*ID 493101 - 493150 George TS,  George SP (gspanos@makeasite.gr)&lt;br /&gt;
**&lt;br /&gt;
*ID 499001 - 499050: IT GENIUSES (https://www.itgeniuses.com)&lt;br /&gt;
&lt;br /&gt;
DO NOT ADD RECORD HERE, PLEASE FILL HOLES FIRST !!!!&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
=ID &amp;gt; 500000=&lt;br /&gt;
&lt;br /&gt;
This range can&#039;t be reserved. It is a common range. If you don&#039;t plan to distribute your module, you can use an ID in this range with no need to reserve it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t already have reserved ids and need some, please don&#039;t use hazardous number and use a number higher than 500000, but it is better to ask a wiki account, and reserve your own range by editing the  100000 - 499999 range (20 ids at once).&lt;/div&gt;</summary>
		<author><name>Kusco</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Category:DisQutons&amp;diff=64875</id>
		<title>Category:DisQutons</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Category:DisQutons&amp;diff=64875"/>
		<updated>2025-11-30T00:02:45Z</updated>

		<summary type="html">&lt;p&gt;Kusco: Création page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Flag fr}} Liste des modules développés par l&#039;association disQutons (https://www.disQutons.fr)&lt;/div&gt;</summary>
		<author><name>Kusco</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Module_Subventions&amp;diff=64874</id>
		<title>Module Subventions</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Module_Subventions&amp;diff=64874"/>
		<updated>2025-11-29T23:59:17Z</updated>

		<summary type="html">&lt;p&gt;Kusco: &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:Module_Subventions FR]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Complementary modules]]&lt;br /&gt;
[[Category:disQutons]]&lt;br /&gt;
[[Category:Nonprofit organization]]&lt;br /&gt;
{{TemplateDocDevEn}}&lt;br /&gt;
{{TemplateDocUser}}&lt;br /&gt;
=Informations=&lt;br /&gt;
{{TemplateModuleInfo&lt;br /&gt;
|modulename=Suivi des subventions&lt;br /&gt;
|editor=[https://www.disqutons.fr disQutons]&lt;br /&gt;
|webbuy={{LinkToPluginDownloadDoliStore|keyword=subventions}}&lt;br /&gt;
|status=stable&lt;br /&gt;
|minversion=V21&lt;br /&gt;
|note=Module disponible en français, anglais, allemand, italien et espagnol.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Fonctionnalités=&lt;br /&gt;
Module permettant de suivre les demandes de subventions&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
*Suivi des subventions, demandes de financements, financeurs et paiements&lt;br /&gt;
*Possibilité d&#039;ajouter des documents&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: demande, notification, convention, bilan, etc.&lt;br /&gt;
*Suivi des différents statuts&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: non déposé, déposé, accepté, refusé, financé, bilan déposé&lt;br /&gt;
*Statistiques par année, financeurs et groupe de financeurs&lt;br /&gt;
*[Module Projets] Possibilité d&#039;ajouter les subventions à la vue d&#039;ensemble&lt;br /&gt;
*[Module Tiers] Ajout d&#039;un onglet au sein de la fiche tiers des projets&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Installation=&lt;br /&gt;
{{InstallModuleDoliStoreEn|keyword=subvention}}&lt;br /&gt;
&lt;br /&gt;
=Paramétrage=&lt;br /&gt;
{{ActivationModuleEn}}&lt;br /&gt;
&lt;br /&gt;
=Développement &amp;amp; Contributions=&lt;br /&gt;
Le développement de cette application Open Source n&#039;est pas inclus dans le dépôt GIT standard de Dolibarr, mais dans un dépôt dédié aux modules non pris en charge par l&#039;équipe de développement de Dolibarr :&lt;br /&gt;
&lt;br /&gt;
*Dépôt : https://github.com/disQutons/dolibarr_module_subventions&lt;br /&gt;
&lt;br /&gt;
Vos demandes de correction ou d&#039;amélioration sont les bienvenues.&lt;/div&gt;</summary>
		<author><name>Kusco</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Module_Subventions&amp;diff=64873</id>
		<title>Module Subventions</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Module_Subventions&amp;diff=64873"/>
		<updated>2025-11-29T23:59:02Z</updated>

		<summary type="html">&lt;p&gt;Kusco: &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:Module_Subventions FR]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Complementary modules]]&lt;br /&gt;
[[Category:disQutons]]&lt;br /&gt;
[[Category:Nonprofit organization]]&lt;br /&gt;
{{TemplateDocDevEn}}&lt;br /&gt;
{{TemplateDocUser}}&lt;br /&gt;
=Informations=&lt;br /&gt;
{{TemplateModuleInfo&lt;br /&gt;
|modulename=Suivi des subventions&lt;br /&gt;
|editor=[https://www.disqutons.fr disQutons]&lt;br /&gt;
|webbuy={{LinkToPluginDownloadDoliStore|keyword=subventions}}&lt;br /&gt;
|status=stable&lt;br /&gt;
|minversion=V21&lt;br /&gt;
|languages=Module disponible en français, anglais, allemand, italien et espagnol.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Fonctionnalités=&lt;br /&gt;
Module permettant de suivre les demandes de subventions&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
*Suivi des subventions, demandes de financements, financeurs et paiements&lt;br /&gt;
*Possibilité d&#039;ajouter des documents&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: demande, notification, convention, bilan, etc.&lt;br /&gt;
*Suivi des différents statuts&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: non déposé, déposé, accepté, refusé, financé, bilan déposé&lt;br /&gt;
*Statistiques par année, financeurs et groupe de financeurs&lt;br /&gt;
*[Module Projets] Possibilité d&#039;ajouter les subventions à la vue d&#039;ensemble&lt;br /&gt;
*[Module Tiers] Ajout d&#039;un onglet au sein de la fiche tiers des projets&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Installation=&lt;br /&gt;
{{InstallModuleDoliStoreEn|keyword=subvention}}&lt;br /&gt;
&lt;br /&gt;
=Paramétrage=&lt;br /&gt;
{{ActivationModuleEn}}&lt;br /&gt;
&lt;br /&gt;
=Développement &amp;amp; Contributions=&lt;br /&gt;
Le développement de cette application Open Source n&#039;est pas inclus dans le dépôt GIT standard de Dolibarr, mais dans un dépôt dédié aux modules non pris en charge par l&#039;équipe de développement de Dolibarr :&lt;br /&gt;
&lt;br /&gt;
*Dépôt : https://github.com/disQutons/dolibarr_module_subventions&lt;br /&gt;
&lt;br /&gt;
Vos demandes de correction ou d&#039;amélioration sont les bienvenues.&lt;/div&gt;</summary>
		<author><name>Kusco</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Module_Subventions&amp;diff=64872</id>
		<title>Module Subventions</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Module_Subventions&amp;diff=64872"/>
		<updated>2025-11-29T23:58:28Z</updated>

		<summary type="html">&lt;p&gt;Kusco: &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:Module_Subventions FR]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Complementary modules]]&lt;br /&gt;
[[Category:disQutons]]&lt;br /&gt;
[[Category:Nonprofit organization]]&lt;br /&gt;
{{TemplateDocDevEn}}&lt;br /&gt;
{{TemplateDocUser}}&lt;br /&gt;
=Informations=&lt;br /&gt;
{{TemplateModuleInfo&lt;br /&gt;
|modulename=Suivi des subventions&lt;br /&gt;
|editor=[https://www.disqutons.fr disQutons]&lt;br /&gt;
|webbuy={{LinkToPluginDownloadDoliStore|keyword=subventions}}&lt;br /&gt;
|status=stable&lt;br /&gt;
|minversion=V21&lt;br /&gt;
|note=Module disponible en français, anglais, allemand, italien et espagnol.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Fonctionnalités=&lt;br /&gt;
Module permettant de suivre les demandes de subventions&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
*Suivi des subventions, demandes de financements, financeurs et paiements&lt;br /&gt;
*Possibilité d&#039;ajouter des documents&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: demande, notification, convention, bilan, etc.&lt;br /&gt;
*Suivi des différents statuts&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: non déposé, déposé, accepté, refusé, financé, bilan déposé&lt;br /&gt;
*Statistiques par année, financeurs et groupe de financeurs&lt;br /&gt;
*[Module Projets] Possibilité d&#039;ajouter les subventions à la vue d&#039;ensemble&lt;br /&gt;
*[Module Tiers] Ajout d&#039;un onglet au sein de la fiche tiers des projets&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Installation=&lt;br /&gt;
{{InstallModuleDoliStoreEn|keyword=subvention}}&lt;br /&gt;
&lt;br /&gt;
=Paramétrage=&lt;br /&gt;
{{ActivationModuleEn}}&lt;br /&gt;
&lt;br /&gt;
=Développement &amp;amp; Contributions=&lt;br /&gt;
Le développement de cette application Open Source n&#039;est pas inclus dans le dépôt GIT standard de Dolibarr, mais dans un dépôt dédié aux modules non pris en charge par l&#039;équipe de développement de Dolibarr :&lt;br /&gt;
&lt;br /&gt;
*Dépôt : https://github.com/disQutons/dolibarr_module_subventions&lt;br /&gt;
&lt;br /&gt;
Vos demandes de correction ou d&#039;amélioration sont les bienvenues.&lt;/div&gt;</summary>
		<author><name>Kusco</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Module_Subventions&amp;diff=64871</id>
		<title>Module Subventions</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Module_Subventions&amp;diff=64871"/>
		<updated>2025-11-29T23:56:35Z</updated>

		<summary type="html">&lt;p&gt;Kusco: Création de la page du module&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:Module_Subventions FR]]&lt;br /&gt;
[[en:Subsidies module]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Complementary modules]]&lt;br /&gt;
[[Category:disQutons]]&lt;br /&gt;
[[Category:Nonprofit organization]]&lt;br /&gt;
{{TemplateDocDevEn}}&lt;br /&gt;
{{TemplateDocUser}}&lt;br /&gt;
=Informations=&lt;br /&gt;
{{TemplateModuleInfo&lt;br /&gt;
|modulename=Suivi des subventions&lt;br /&gt;
|editor=[https://www.disqutons.fr disQutons]&lt;br /&gt;
|web={{URLNLTechno}}&lt;br /&gt;
|webbuy={{LinkToPluginDownloadDoliStore|keyword=subventions}}&lt;br /&gt;
|status=stable&lt;br /&gt;
|minversion=Le module a été développé en V22, il est possible qu&#039;il fonctionne sur des versions antérieures.&lt;br /&gt;
|note=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Fonctionnalités=&lt;br /&gt;
Module permettant de suivre les demandes de subventions&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
*Suivi des subventions, demandes de financements, financeurs et paiements&lt;br /&gt;
*Possibilité d&#039;ajouter des documents&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: demande, notification, convention, bilan, etc.&lt;br /&gt;
*Suivi des différents statuts&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: non déposé, déposé, accepté, refusé, financé, bilan déposé&lt;br /&gt;
*Statistiques par année, financeurs et groupe de financeurs&lt;br /&gt;
*[Module Projets] Possibilité d&#039;ajouter les subventions à la vue d&#039;ensemble&lt;br /&gt;
*[Module Tiers] Ajout d&#039;un onglet au sein de la fiche tiers des projets&lt;br /&gt;
&lt;br /&gt;
Module disponible en français, anglais, allemand, italien et espagnol.&lt;br /&gt;
&lt;br /&gt;
=Installation=&lt;br /&gt;
{{InstallModuleDoliStoreEn|keyword=bittorent}}&lt;br /&gt;
&lt;br /&gt;
=Paramétrage=&lt;br /&gt;
{{ActivationModuleEn}}&lt;br /&gt;
&lt;br /&gt;
=Développement &amp;amp; Contributions=&lt;br /&gt;
Le développement de cette application Open Source n&#039;est pas inclus dans le dépôt GIT standard de Dolibarr, mais dans un dépôt dédié aux modules non pris en charge par l&#039;équipe de développement de Dolibarr :&lt;br /&gt;
&lt;br /&gt;
*Dépôt : https://github.com/disQutons/dolibarr_module_subventions&lt;br /&gt;
&lt;br /&gt;
Vos demandes de correction ou d&#039;amélioration sont les bienvenues.&lt;/div&gt;</summary>
		<author><name>Kusco</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Template:TagsOdtMyCompany&amp;diff=64841</id>
		<title>Template:TagsOdtMyCompany</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Template:TagsOdtMyCompany&amp;diff=64841"/>
		<updated>2025-11-23T12:22:21Z</updated>

		<summary type="html">&lt;p&gt;Kusco: Ajout {mycompany_managers}&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
{mycompany_logo} : Your company logo&lt;br /&gt;
{mycompany_name} : Your company name&lt;br /&gt;
{mycompany_address} : Your company address&lt;br /&gt;
{mycompany_zip} : Your company zip&lt;br /&gt;
{mycompany_town} : Your company town&lt;br /&gt;
{mycompany_country} : Your company country (label)&lt;br /&gt;
{mycompany_country_code} : Your company country (code: FR, US, IT...)&lt;br /&gt;
{mycompany_state} : Your company state (label)&lt;br /&gt;
{mycompany_state_code} : Your company state (code)&lt;br /&gt;
{mycompany_managers} : Your managers/director/president&lt;br /&gt;
{mycompany_phone}&lt;br /&gt;
{mycompany_fax}&lt;br /&gt;
{mycompany_email}&lt;br /&gt;
{mycompany_web}&lt;br /&gt;
{mycompany_barcode}&lt;br /&gt;
{mycompany_capital}&lt;br /&gt;
{mycompany_juridicalstatus}&lt;br /&gt;
{mycompany_managers}&lt;br /&gt;
{mycompany_idprof1}&lt;br /&gt;
{mycompany_idprof2}&lt;br /&gt;
{mycompany_idprof3}&lt;br /&gt;
{mycompany_idprof4}&lt;br /&gt;
{mycompany_idprof5}&lt;br /&gt;
{mycompany_idprof6}&lt;br /&gt;
{mycompany_vatnumber} : Your company VAT number&lt;br /&gt;
{mycompany_object}&lt;br /&gt;
{mycompany_note_private} : Your company private note&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kusco</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Exemple_de_cas_pratique_de_Module_Builder&amp;diff=64687</id>
		<title>Exemple de cas pratique de Module Builder</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Exemple_de_cas_pratique_de_Module_Builder&amp;diff=64687"/>
		<updated>2025-11-05T14:18:35Z</updated>

		<summary type="html">&lt;p&gt;Kusco: Lowercase&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Guide début pour Module-Builder=&lt;br /&gt;
&lt;br /&gt;
L’idée générale de ce cas pratique est d’utiliser l’ossature de fichiers du MODULE BUILDER et de les modifier le moins possible pour ne pas faire d’erreurs ou de bêtises.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Le module que nous allons créer&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;:&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Son rôle est d’afficher dans un calendrier les délais de livraison des commandes fournisseur sur une plage donnée à partir de la date du jour.&lt;br /&gt;
&lt;br /&gt;
Il faut donc que vos commandes fournisseurs aient une Date prévue de livraison&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;:[[File:Screen date prévue de livraison.jpg|thumb|alt=|left]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cliquer sur une des commandes du calendrier vous renverra directement vers la fiche Dolibarr de la commande fournisseur concernée. Il sera disponible dans un nouvel onglet du menu principal.&lt;br /&gt;
&lt;br /&gt;
On utilisera &amp;quot;fullcalendar&amp;quot; pour le calendrier https://fullcalendar.io/&lt;br /&gt;
[[File:Screen Calendrier.png|alt=|left|883x883px]]&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;
&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;
&amp;lt;br /&amp;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;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
==Étape 1 : Actier le module-builder dans Dolibarr==&lt;br /&gt;
Accueil → Configuration → Configuration - Modules/Applications → MODULE BUILDER&lt;br /&gt;
[[File:Screen ModuleBuilder.jpg|left|thumb]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
==Étape 2 : Créer les fichiers de base du module==&lt;br /&gt;
Lancer le MODULE BUILDER via l’icone en haut à droite de Dolibarr&lt;br /&gt;
&lt;br /&gt;
Remplissez les champs puis cliquez sur CREER&lt;br /&gt;
&lt;br /&gt;
A partir de maintenant vous devriez avoir dans le dossier « custom » un nouveau dossier au nom de votre module que je vais appeler CalendrierFournisseurs dans mon cas&lt;br /&gt;
&lt;br /&gt;
[[File:Champs MB.png|left|thumb]]&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;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
==Étape 3 : Upload des fichiers FullCalendar==&lt;br /&gt;
Notre code aura besoin des bibliothèques Fullcalendar.&lt;br /&gt;
&lt;br /&gt;
A l’heure de ce tuto j’utilise la dernière version 6.1.15 que vous trouverez ici https://github.com/fullcalendar/fullcalendar/releases/tag/v6.1.15&lt;br /&gt;
&lt;br /&gt;
Décompressez le Zip pour avoir le dossier fullcalendar-6.1.15 comme suit&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: /custom/calendrierfournisseurs/fullcalendar-6.1.15&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Étape 4 : Création du module==&lt;br /&gt;
Editez le fichier « /custom/calendrierfournisseurs/calendrierfournisseursindex.php » avec le notepad ou visual studio code.&lt;br /&gt;
&lt;br /&gt;
Ce fichier contiendra le contenu de notre page à afficher. Effacez le contenu et mettez-y le code suivant&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;:&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
require &#039;../../main.inc.php&#039;; // Inclusion du fichier principal Dolibarr&lt;br /&gt;
&lt;br /&gt;
llxHeader(&#039;&#039;, &#039;Calendrier Fournisseur&#039;, &#039;&#039;); // En-tête de Dolibarr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Connexion à la base de données Dolibarr (utilisation des connexions intégrées à Dolibarr)&lt;br /&gt;
global $db;&lt;br /&gt;
&lt;br /&gt;
// Récupération des configurations de plage de dates&lt;br /&gt;
$weeksBefore = getDolGlobalInt(&#039;CALENDRIERFOURNISSEURS_WEEKS_BEFORE&#039;, 1);&lt;br /&gt;
$weeksAfter = getDolGlobalInt(&#039;CALENDRIERFOURNISSEURS_WEEKS_AFTER&#039;, 4);&lt;br /&gt;
&lt;br /&gt;
// Calcul de la plage de dates&lt;br /&gt;
$date_start = date(&#039;Y-m-d&#039;, strtotime(&amp;quot;-$weeksBefore week&amp;quot;));&lt;br /&gt;
$date_end = date(&#039;Y-m-d&#039;, strtotime(&amp;quot;+$weeksAfter week&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
// Afficher un titre&lt;br /&gt;
print &amp;quot;&amp;lt;h1&amp;gt;Calendrier livraisons Commandes Fournisseurs  du &amp;quot; . date(&amp;quot;d/m/Y&amp;quot;, strtotime($date_start)) . &amp;quot; au &amp;quot; . date(&amp;quot;d/m/Y&amp;quot;, strtotime($date_end)) . &amp;quot;&amp;lt;/h1&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Récupération des données de la base de données&lt;br /&gt;
$requete = &amp;quot;SELECT t.rowid as rowid, t.ref_supplier as ref, DATE_FORMAT(t.date_livraison, &#039;%Y-%m-%d&#039;) as date_livraison, &lt;br /&gt;
                   t.fk_statut as statut, s.nom as nom_fournisseur&lt;br /&gt;
            FROM llx_commande_fournisseur as t&lt;br /&gt;
            INNER JOIN llx_societe as s ON t.fk_soc = s.rowid&lt;br /&gt;
            WHERE t.date_livraison BETWEEN &#039;$date_start&#039; AND &#039;$date_end&#039;&lt;br /&gt;
            AND t.fk_statut IN (1, 2, 3, 4, 5, 9)&lt;br /&gt;
            ORDER BY t.date_livraison ASC&amp;quot;;&lt;br /&gt;
$resultat = $db-&amp;gt;query($requete);&lt;br /&gt;
&lt;br /&gt;
// Préparation des données pour FullCalendar&lt;br /&gt;
$events = array();&lt;br /&gt;
while ($ligne = $resultat-&amp;gt;fetch_assoc()) {&lt;br /&gt;
    $backgroundColor = &#039;&#039;;&#039;&#039;&lt;br /&gt;
    switch ($ligne[&#039;statut&#039;]) {&lt;br /&gt;
        case 2: // Validée&lt;br /&gt;
            $backgroundColor = &#039;#bc9526&#039;; // Marron orangé&lt;br /&gt;
            break;&lt;br /&gt;
        case 3: // Transmise au fournisseur&lt;br /&gt;
            $backgroundColor = &#039;#25a580&#039;; // Vert&lt;br /&gt;
            break;&lt;br /&gt;
        case 4: // Livrée partiellement ou refusée&lt;br /&gt;
            $backgroundColor = &#039;#ffa07a&#039;; // Rouge clair&lt;br /&gt;
            break;&lt;br /&gt;
        case 5: // Totalement livrée&lt;br /&gt;
            $backgroundColor = &#039;#cad2d2&#039;; // Gris clair&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    $events[] = array(&lt;br /&gt;
        &#039;title&#039; =&amp;gt; mb_convert_encoding($ligne[&#039;nom_fournisseur&#039;], &#039;UTF-8&#039;) . &#039; - &#039; . mb_convert_encoding($ligne[&#039;ref&#039;], &#039;UTF-8&#039;),&lt;br /&gt;
        &#039;start&#039; =&amp;gt; mb_convert_encoding($ligne[&#039;date_livraison&#039;], &#039;UTF-8&#039;),&lt;br /&gt;
        &#039;id&#039; =&amp;gt; mb_convert_encoding($ligne[&#039;rowid&#039;], &#039;UTF-8&#039;),&lt;br /&gt;
        &#039;status&#039; =&amp;gt; mb_convert_encoding($ligne[&#039;statut&#039;], &#039;UTF-8&#039;),&lt;br /&gt;
        &#039;url&#039; =&amp;gt; &#039;../../fourn/commande/card.php?id=&#039; . mb_convert_encoding($ligne[&#039;rowid&#039;], &#039;UTF-8&#039;),&lt;br /&gt;
        &#039;backgroundColor&#039; =&amp;gt; $backgroundColor&lt;br /&gt;
    );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Conversion en JSON&lt;br /&gt;
$json_events = json_encode($events);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;fr&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;Calendrier Fournisseur&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&#039;../../custom/calendrierfournisseurs/fullcalendar-6.1.15/dist/index.global.js&#039;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&#039;../../custom/calendrierfournisseurs/fullcalendar-6.1.15/packages/core/locales/fr.global.js&#039;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;script&amp;gt;&lt;br /&gt;
        document.addEventListener(&#039;DOMContentLoaded&#039;, function() {&lt;br /&gt;
            var calendarEl = document.getElementById(&#039;calendar&#039;);&lt;br /&gt;
            var calendar = new FullCalendar.Calendar(calendarEl, {&lt;br /&gt;
                initialView: &#039;dayGridMonth&#039;,&lt;br /&gt;
                locale: &#039;fr&#039;,&lt;br /&gt;
                weekNumbers: true,&lt;br /&gt;
                height: &#039;auto&#039;,&lt;br /&gt;
                headerToolbar: {&lt;br /&gt;
                    left: &#039;prev,next today&#039;,&lt;br /&gt;
                    center: &#039;title&#039;,&lt;br /&gt;
                    right: &#039;dayGridMonth,timeGridWeek,timeGridDay,listWeek&#039;&lt;br /&gt;
                },&lt;br /&gt;
                events: &amp;lt;?php echo $json_events; ?&amp;gt;,&lt;br /&gt;
                eventContent: function(arg) {&lt;br /&gt;
                    return {&lt;br /&gt;
                        html: arg.event.title.split(&#039; - &#039;)[0] + &#039;&amp;lt;br&amp;gt;&#039; + arg.event.title.split(&#039; - &#039;)[1]&lt;br /&gt;
                    };&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
            calendar.render();&lt;br /&gt;
        });&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;style&amp;gt;&lt;br /&gt;
        html, body {&lt;br /&gt;
            overflow: hidden;&lt;br /&gt;
            font-family: Arial, Helvetica Neue, Helvetica, sans-serif;&lt;br /&gt;
            font-size: 14px;&lt;br /&gt;
        }&lt;br /&gt;
        #calendar-container {&lt;br /&gt;
            position: fixed;&lt;br /&gt;
            top: 0;&lt;br /&gt;
            left: 0;&lt;br /&gt;
            right: 0;&lt;br /&gt;
            bottom: 0;&lt;br /&gt;
        }&lt;br /&gt;
        .fc-header-toolbar {&lt;br /&gt;
            padding-top: 1em;&lt;br /&gt;
            padding-left: 1em;&lt;br /&gt;
            padding-right: 1em;&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;table border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;0&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;width:800px&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;tr&amp;gt;&lt;br /&gt;
            &amp;lt;td style=&amp;quot;background-color:#bc9526; width:50px&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;span style=&amp;quot;font-size:12px&amp;quot;&amp;gt;Commande Approuvée&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td style=&amp;quot;background-color:#25a580; width:50px&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;span style=&amp;quot;font-size:12px&amp;quot;&amp;gt;Commande Transmise au fournisseur&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td style=&amp;quot;background-color:#ffa07a; width:50px&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;span style=&amp;quot;font-size:12px&amp;quot;&amp;gt;Commande livrée partiellement ou refusée&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td style=&amp;quot;background-color:#cad2d2; width:50px&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;
            &amp;lt;td&amp;gt;&amp;lt;span style=&amp;quot;font-size:12px&amp;quot;&amp;gt;Commande totalement livrée&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;div id=&amp;quot;calendar&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
llxFooter(); // Pied de page Dolibarr&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Étape 5 : Page de configuration du module==&lt;br /&gt;
Editez le fichier « /custom/calendrierfournisseurs/admin/setup.php» avec le notepad ou visual studio code ou directement depuis le module builder.&lt;br /&gt;
&lt;br /&gt;
Ce fichier contiendra le contenu de notre page de configuration du module à afficher.&lt;br /&gt;
&lt;br /&gt;
Supprimez (ou mettez en commentaire avec /* et */) les données d’exemple soient les lignes 102 à 166 de la zone commençant par le commentaire&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;:&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
// Enter here all parameters in your setup page&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ajouter le code suivant&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;:&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
// Setup conf for selection of weeks before current date to display in calendar&lt;br /&gt;
$item = $formSetup-&amp;gt;newItem(&#039;CALENDRIERFOURNISSEURS_WEEKS_BEFORE&#039;);&lt;br /&gt;
$item-&amp;gt;defaultFieldValue = &#039;1&#039;; // Valeur par défaut de 1 semaine avant&lt;br /&gt;
$item-&amp;gt;fieldAttr[&#039;placeholder&#039;] = &#039;Nombre de semaines avant&#039;;&lt;br /&gt;
$item-&amp;gt;nameText = $langs-&amp;gt;trans(&#039;Nombre de semaines avant&#039;); // Langue pour l&#039;étiquette&lt;br /&gt;
&lt;br /&gt;
// Setup conf for selection of weeks after current date to display in calendar&lt;br /&gt;
$item = $formSetup-&amp;gt;newItem(&#039;CALENDRIERFOURNISSEURS_WEEKS_AFTER&#039;);&lt;br /&gt;
$item-&amp;gt;defaultFieldValue = &#039;4&#039;; // Valeur par défaut de 4 semaines après&lt;br /&gt;
$item-&amp;gt;fieldAttr[&#039;placeholder&#039;] = &#039;Nombre de semaines après&#039;;&lt;br /&gt;
$item-&amp;gt;nameText = $langs-&amp;gt;trans(&#039;Nombre de semaines après&#039;); // Langue pour l&#039;étiquette&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Étape 6 : Activer le module==&lt;br /&gt;
Directement dans le MODULE BUILDER, activez le module et allez sur la roue crantée pour configurer la plage de dates que calendrier doit afficher&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
*Nombre de semaines avant&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: nombre de semaines avant la date du jour&lt;br /&gt;
*Nombre de semaines après&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: nombre de semaines après la date du jour&lt;br /&gt;
&lt;br /&gt;
Normalement, après cette étape le calendrier devrait s’afficher quand on clique sur le bouton de l’onglet principal&lt;/div&gt;</summary>
		<author><name>Kusco</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Hook_completeListOfReferent&amp;diff=64533</id>
		<title>Hook completeListOfReferent</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Hook_completeListOfReferent&amp;diff=64533"/>
		<updated>2025-10-22T10:50:19Z</updated>

		<summary type="html">&lt;p&gt;Kusco: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Hooks]]&lt;br /&gt;
Le Hook completeListOfReferent permet d&#039;afficher les informations dans l&#039;onglet vue d&#039;ensemble d&#039;un projet.&lt;br /&gt;
&lt;br /&gt;
Voici un exemple de création d&#039;un module qu&#039;on appelerait &amp;quot;Subventions&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Dans votre de déclaration de Hook (class/actions_nomModule.class.php)&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;:&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    require_once DOL_DOCUMENT_ROOT.&#039;/custom/subventions/class/subvention.class.php&#039;;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
    /*&lt;br /&gt;
    * Hook pour afficher des informations dans l&#039;onglet vue d&#039;ensemble d&#039;un projet&lt;br /&gt;
    */&lt;br /&gt;
    public function completeListOfReferent($parameters, &amp;amp;$object, &amp;amp;$action) {&lt;br /&gt;
        global $conf, $user, $langs;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
        if ($object-&amp;gt;element == &#039;project&#039;){&lt;br /&gt;
            $this-&amp;gt;results = array(&lt;br /&gt;
                &#039;subvention&#039; =&amp;gt; array(&lt;br /&gt;
                &#039;name&#039; =&amp;gt; &amp;quot;Subventions&amp;quot;,&lt;br /&gt;
                &#039;title&#039; =&amp;gt; &amp;quot;ListSubventionsAssociatedProject&amp;quot;,&lt;br /&gt;
                &#039;class&#039; =&amp;gt; &#039;Subvention&#039;,&lt;br /&gt;
                &#039;table&#039; =&amp;gt; &#039;subventions_subvention&#039;,&lt;br /&gt;
                &#039;datefieldname&#039; =&amp;gt; &#039;date_creation&#039;,&lt;br /&gt;
                &#039;margin&#039; =&amp;gt; &#039;add&#039;, // add si c&#039;est en plus, minus si c&#039;est en moins, rien si ça ne rentre pas dans le calcul de bénéfice&lt;br /&gt;
                &#039;project_field&#039; =&amp;gt; &#039;fk_project&#039;, // facultatif si le nom de ta colonne est fk_project&lt;br /&gt;
                &#039;url&#039; =&amp;gt; DOL_URL_ROOT.&#039;/custom/subventions/subvention_list.php?fk_project=&#039;.$object-&amp;gt;id, // URL pour lister les subventions&lt;br /&gt;
                &#039;urlnew&#039; =&amp;gt; DOL_URL_ROOT.&#039;/custom/subventions/subvention_card.php?action=create&amp;amp;origin=project&amp;amp;originid=&#039;.$id.&#039;&amp;amp;backtopage=&#039;.urlencode($_SERVER[&#039;PHP_SELF&#039;].&#039;?id=&#039;.$id),&lt;br /&gt;
                &#039;lang&#039; =&amp;gt; &#039;subventions&#039;,&lt;br /&gt;
                &#039;buttonnew&#039; =&amp;gt; &#039;AddSubvention&#039;,&lt;br /&gt;
                &#039;testnew&#039; =&amp;gt; $user-&amp;gt;hasRight(&#039;subventions&#039;, &#039;subvention&#039;, &#039;write&#039;),&lt;br /&gt;
                &#039;test&#039; =&amp;gt; isModEnabled(&#039;subventions&#039;) &amp;amp;&amp;amp; $user-&amp;gt;hasRight(&#039;subventions&#039;, &#039;subvention&#039;, &#039;read&#039;),&lt;br /&gt;
            ),&lt;br /&gt;
        );&lt;br /&gt;
    return 0;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme vous devez le remarquer, à aucun moment, nous n&#039;indiquons le montant.&lt;br /&gt;
&lt;br /&gt;
Tout ceci est précisé directement dans le fichier &#039;&#039;&#039;element.php&#039;&#039;&#039; dans la gestion des projets.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour éviter de modifier ce fichier, on peut gérer les montants autrement en créant ces champs dans ta table&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;total_ttc&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;total_ht&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kusco</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Hook_completeListOfReferent&amp;diff=64532</id>
		<title>Hook completeListOfReferent</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Hook_completeListOfReferent&amp;diff=64532"/>
		<updated>2025-10-22T10:49:55Z</updated>

		<summary type="html">&lt;p&gt;Kusco: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Hooks]]&lt;br /&gt;
Le Hook completeListOfReferent permet d&#039;afficher les informations dans l&#039;onglet vue d&#039;ensemble d&#039;un projet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici un exemple de création d&#039;un module qu&#039;on appelerait &amp;quot;Subventions&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans votre de déclaration de Hook (class/actions_nomModule.class.php)&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;:&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    require_once DOL_DOCUMENT_ROOT.&#039;/custom/subventions/class/subvention.class.php&#039;;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
    /*&lt;br /&gt;
    * Hook pour afficher des informations dans l&#039;onglet vue d&#039;ensemble d&#039;un projet&lt;br /&gt;
    */&lt;br /&gt;
    public function completeListOfReferent($parameters, &amp;amp;$object, &amp;amp;$action) {&lt;br /&gt;
        global $conf, $user, $langs;&lt;br /&gt;
        if ($object-&amp;gt;element == &#039;project&#039;){&lt;br /&gt;
            $this-&amp;gt;results = array(&lt;br /&gt;
                &#039;subvention&#039; =&amp;gt; array(&lt;br /&gt;
                &#039;name&#039; =&amp;gt; &amp;quot;Subventions&amp;quot;,&lt;br /&gt;
                &#039;title&#039; =&amp;gt; &amp;quot;ListSubventionsAssociatedProject&amp;quot;,&lt;br /&gt;
                &#039;class&#039; =&amp;gt; &#039;Subvention&#039;,&lt;br /&gt;
                &#039;table&#039; =&amp;gt; &#039;subventions_subvention&#039;,&lt;br /&gt;
                &#039;datefieldname&#039; =&amp;gt; &#039;date_creation&#039;,&lt;br /&gt;
                &#039;margin&#039; =&amp;gt; &#039;add&#039;, // add si c&#039;est en plus, minus si c&#039;est en moins, rien si ça ne rentre pas dans le calcul de bénéfice&lt;br /&gt;
                &#039;project_field&#039; =&amp;gt; &#039;fk_project&#039;, // facultatif si le nom de ta colonne est fk_project&lt;br /&gt;
                &#039;url&#039; =&amp;gt; DOL_URL_ROOT.&#039;/custom/subventions/subvention_list.php?fk_project=&#039;.$object-&amp;gt;id, // URL pour lister les subventions&lt;br /&gt;
                &#039;urlnew&#039; =&amp;gt; DOL_URL_ROOT.&#039;/custom/subventions/subvention_card.php?action=create&amp;amp;origin=project&amp;amp;originid=&#039;.$id.&#039;&amp;amp;backtopage=&#039;.urlencode($_SERVER[&#039;PHP_SELF&#039;].&#039;?id=&#039;.$id),&lt;br /&gt;
                &#039;lang&#039; =&amp;gt; &#039;subventions&#039;,&lt;br /&gt;
                &#039;buttonnew&#039; =&amp;gt; &#039;AddSubvention&#039;,&lt;br /&gt;
                &#039;testnew&#039; =&amp;gt; $user-&amp;gt;hasRight(&#039;subventions&#039;, &#039;subvention&#039;, &#039;write&#039;),&lt;br /&gt;
                &#039;test&#039; =&amp;gt; isModEnabled(&#039;subventions&#039;) &amp;amp;&amp;amp; $user-&amp;gt;hasRight(&#039;subventions&#039;, &#039;subvention&#039;, &#039;read&#039;),&lt;br /&gt;
            ),&lt;br /&gt;
        );&lt;br /&gt;
    return 0;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme vous devez le remarquer, à aucun moment, nous n&#039;indiquons le montant.&lt;br /&gt;
&lt;br /&gt;
Tout ceci est précisé directement dans le fichier &#039;&#039;&#039;element.php&#039;&#039;&#039; dans la gestion des projets.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour éviter de modifier ce fichier, on peut gérer les montants autrement en créant ces champs dans ta table&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;total_ttc&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;total_ht&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kusco</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Hook_completeListOfReferent&amp;diff=64531</id>
		<title>Hook completeListOfReferent</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Hook_completeListOfReferent&amp;diff=64531"/>
		<updated>2025-10-22T10:49:34Z</updated>

		<summary type="html">&lt;p&gt;Kusco: Création complète de la page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Hooks]]&lt;br /&gt;
Le Hook completeListOfReferent permet d&#039;afficher les informations dans l&#039;onglet vue d&#039;ensemble d&#039;un projet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici un exemple de création d&#039;un module qu&#039;on appelerait &amp;quot;Subventions&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans votre de déclaration de Hook (class/actions_nomModule.class.php) :&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    require_once DOL_DOCUMENT_ROOT.&#039;/custom/subventions/class/subvention.class.php&#039;;&lt;br /&gt;
    /*&lt;br /&gt;
    * Hook pour afficher des informations dans l&#039;onglet vue d&#039;ensemble d&#039;un projet&lt;br /&gt;
    */&lt;br /&gt;
    public function completeListOfReferent($parameters, &amp;amp;$object, &amp;amp;$action) {&lt;br /&gt;
        global $conf, $user, $langs;&lt;br /&gt;
        if ($object-&amp;gt;element == &#039;project&#039;){&lt;br /&gt;
            $this-&amp;gt;results = array(&lt;br /&gt;
                &#039;subvention&#039; =&amp;gt; array(&lt;br /&gt;
                &#039;name&#039; =&amp;gt; &amp;quot;Subventions&amp;quot;,&lt;br /&gt;
                &#039;title&#039; =&amp;gt; &amp;quot;ListSubventionsAssociatedProject&amp;quot;,&lt;br /&gt;
                &#039;class&#039; =&amp;gt; &#039;Subvention&#039;,&lt;br /&gt;
                &#039;table&#039; =&amp;gt; &#039;subventions_subvention&#039;,&lt;br /&gt;
                &#039;datefieldname&#039; =&amp;gt; &#039;date_creation&#039;,&lt;br /&gt;
                &#039;margin&#039; =&amp;gt; &#039;add&#039;, // add si c&#039;est en plus, minus si c&#039;est en moins, rien si ça ne rentre pas dans le calcul de bénéfice&lt;br /&gt;
                &#039;project_field&#039; =&amp;gt; &#039;fk_project&#039;, // facultatif si le nom de ta colonne est fk_project&lt;br /&gt;
                &#039;url&#039; =&amp;gt; DOL_URL_ROOT.&#039;/custom/subventions/subvention_list.php?fk_project=&#039;.$object-&amp;gt;id, // URL pour lister les subventions&lt;br /&gt;
                &#039;urlnew&#039; =&amp;gt; DOL_URL_ROOT.&#039;/custom/subventions/subvention_card.php?action=create&amp;amp;origin=project&amp;amp;originid=&#039;.$id.&#039;&amp;amp;backtopage=&#039;.urlencode($_SERVER[&#039;PHP_SELF&#039;].&#039;?id=&#039;.$id),&lt;br /&gt;
                &#039;lang&#039; =&amp;gt; &#039;subventions&#039;,&lt;br /&gt;
                &#039;buttonnew&#039; =&amp;gt; &#039;AddSubvention&#039;,&lt;br /&gt;
                &#039;testnew&#039; =&amp;gt; $user-&amp;gt;hasRight(&#039;subventions&#039;, &#039;subvention&#039;, &#039;write&#039;),&lt;br /&gt;
                &#039;test&#039; =&amp;gt; isModEnabled(&#039;subventions&#039;) &amp;amp;&amp;amp; $user-&amp;gt;hasRight(&#039;subventions&#039;, &#039;subvention&#039;, &#039;read&#039;),&lt;br /&gt;
            ),&lt;br /&gt;
        );&lt;br /&gt;
    return 0;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme vous devez le remarquer, à aucun moment, nous n&#039;indiquons le montant.&lt;br /&gt;
&lt;br /&gt;
Tout ceci est précisé directement dans le fichier &#039;&#039;&#039;element.php&#039;&#039;&#039; dans la gestion des projets.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour éviter de modifier ce fichier, on peut gérer les montants autrement en créant ces champs dans ta table :&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;total_ttc&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;total_ht&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kusco</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Syst%C3%A8me_de_Hooks&amp;diff=63962</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=63962"/>
		<updated>2025-08-25T08:42:26Z</updated>

		<summary type="html">&lt;p&gt;Kusco: Correction de la syntaxe déclarative.&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 : Hooks_system --&amp;gt;&lt;br /&gt;
[[en:Hooks_system]]&lt;br /&gt;
[[es:El_sistema_Hooks]]&lt;br /&gt;
[[de:System_von_Hooks]] ]]&lt;br /&gt;
[[zh:钩子系统]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{TemplateDocDevFr}}&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
Les Hooks (crochet en anglais, dans le sens de détour) sont une fonctionnalité destinée aux développeurs, leur permettant d&#039;ajouter du code personnalisé aux pages standards de Dolibarr sans avoir à modifier le &#039;&#039;core&#039;&#039; de Dolibarr. Contrairement au [[Système de 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 où et à n&#039;importe quel moment dès lors qu&#039;ils ont été prévus dans le &#039;&#039;core&#039;&#039; de Dolibarr. Ce sont des points d&#039;insertion dans le programme.&lt;br /&gt;
&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 Dolibarr ou dans votre propre module (afin que votre module puisse être &amp;quot;crocheté&amp;quot;, &amp;quot;détourné&amp;quot; par d&#039;autres), vous devrez procéder en 2 étapes.&lt;br /&gt;
&lt;br /&gt;
Ces étapes doivent êtres reproduites pour chaque script php dans lequel vous voulez implémenter des hooks.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1- Initialiser l&#039;object HookManager &lt;br /&gt;
&lt;br /&gt;
Pour une page, placez ce bout de code au début de votre script php (après le &#039;&#039;include&#039;&#039; du &#039;&#039;main&#039;&#039;):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&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. &#039;&amp;lt;nowiki/&amp;gt;&#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 contexte commun à plusieurs pages mais que vous voulez aussi un contexte propre à une page donnée).&lt;br /&gt;
&lt;br /&gt;
Pour une méthode ou fonction, il est possible de récupérer le gestionnaire de Hook par:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
global $hookmanager;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2- Placer ensuite l&#039;appel des hooks là où la possibilité d&#039;insertion de code est désirée :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&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;&amp;lt;nowiki/&amp;gt;&#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;syntaxhighlight 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;/syntaxhighlight&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 &#039;&#039;null&#039;&#039; 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 exécuté des hooks d&#039;autres origines. Vous pouvez à présent suivre la procédure ci-dessous ( &#039;&#039;&#039;Implémenter un hook&#039;&#039;&#039; ) pour construire une fonction qui se raccrochera au hook  (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 insérer 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;syntaxhighlight 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(&lt;br /&gt;
        &#039;data&#039; =&amp;gt; array(&lt;br /&gt;
            &#039;hookcontext1&#039;,&lt;br /&gt;
            &#039;hookcontext2&#039;,&lt;br /&gt;
        ),&lt;br /&gt;
        &#039;entity&#039; =&amp;gt; &#039;0&#039;,&lt;br /&gt;
    ),&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: il est possible de trouver tous les contextes dans lequel vous êtes au sein d&#039;une portion de code PHP en faisant &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
print(&#039;Module context: &#039;.join(&#039;,&#039;, $object-&amp;gt;contextarray));&lt;br /&gt;
&amp;lt;/syntaxhighlight&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 des contextes relevée).&lt;br /&gt;
&lt;br /&gt;
Notez que le contexte &#039;&#039;&#039;all&#039;&#039;&#039; signifie que vous souhaitez que votre hook soit exécuté quel que soit le contexte. Le &#039;&#039;&#039;main&#039;&#039;&#039; signifie que vous voulez que votre hook soit exécuté pour n&#039;importe quelle page Web, et &#039;&#039;&#039;cli&#039;&#039;&#039; signifie dans chaque script de ligne de commande (même si vous ne pouvez pas voir ces clés de contexte dans $object-&amp;gt;contextarray).&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 (ou directement dans le &amp;quot;constructeur de module&amp;quot;) afin que la modification soit prise en compte, car l&#039;enregistrement qui relie les éléments du couple &amp;quot;module-hook&amp;quot; est géré en base de donnée; celle-ci n&#039;étant mise à jour qu&#039;au moment de la (ré)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;syntaxhighlight 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;/syntaxhighlight&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;
&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.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Retours de fonction&#039;&#039;&#039; :&lt;br /&gt;
&lt;br /&gt;
*Le code retour d&#039;un hook doit être 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) : [[:Category:Hooks]]&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;
&lt;br /&gt;
=Liste des Contextes 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;
{{ListOfContexts}}&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;
&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>Kusco</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=List_of_modules_id&amp;diff=63838</id>
		<title>List of modules id</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=List_of_modules_id&amp;diff=63838"/>
		<updated>2025-08-11T10:03:25Z</updated>

		<summary type="html">&lt;p&gt;Kusco: /* ID 100000 - 499999 */ Ajout Kusco 173321&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TemplateDocDevEn}}&lt;br /&gt;
{{TemplateDocDevEs}}&lt;br /&gt;
{{TemplateDocDevFr}}&lt;br /&gt;
{{TemplateDocDevZh}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This page list all reserved modules numbers / ID.&lt;br /&gt;
&lt;br /&gt;
If you build or want to build your own modules, you should take an ID range here. Please pick range into existing holes first.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=ID 0 - 94999=&lt;br /&gt;
This range is reserved for Dolibarr&#039;s internal core modules, so all modules available into the standard distribution at https://github.com/Dolibarr/dolibarr&lt;br /&gt;
&lt;br /&gt;
=ID 95000 - 99999=&lt;br /&gt;
This range is reserved for Dolibarr&#039;s community modules availble on the github repository: https://github.com/Dolibarr/dolibarr-community-modules&lt;br /&gt;
&lt;br /&gt;
=ID 100000 - 499999=&lt;br /&gt;
&lt;br /&gt;
Reserved area for editors in need for an ID range. You can edit this page to add your own range (take a range of 50 numbers only the first time, ask us for more)&lt;br /&gt;
&lt;br /&gt;
[[File:Warning.png]] If you reserve more than 50, we may automatically change your reservation range without information and you may experience conflicts with other modules in a future, so please follow the rules! &lt;br /&gt;
&lt;br /&gt;
*ID 100000 - 100999: OpenThink (http://www.openthink.be) - Belgium&lt;br /&gt;
*ID 101000 - 101999: NLTechno (https://www.nltechno.com) - France&lt;br /&gt;
*ID 102000 - 102999: Tiaris (http://www.tiaris.fr) - France&lt;br /&gt;
*ID 103000 - 103999: Open-concept.pro (http://www.open-concept.pro) - France&lt;br /&gt;
*ID 104000 - 104999: ATM Consulting (http://www.atm-consulting.fr) - France&lt;br /&gt;
*ID 105000 - 105999: GPC.solutions - France&lt;br /&gt;
*ID 106000 - 106999: PHPASSO&lt;br /&gt;
*ID 107000 - 107999: TecLib (http://www.teclib.com) / Auguria (http://www.auguria.net) - France&lt;br /&gt;
*ID 108000 - 108999: ETHICWEB&lt;br /&gt;
*ID 109000 - 109999: Aplose ([http://www.aplose.fr https://www.aplose.fr]) - France&lt;br /&gt;
*ID 110000 - 110999: Association Dolibarr (https://www.dolibarr.org)&lt;br /&gt;
*ID 111000 - 111999: Asset IT (www.assetit.ch) - Suisse&lt;br /&gt;
*ID 112000 - 112999: Aarboard AG (www.aarboard.ch) - Suisse&lt;br /&gt;
*ID 113000 - 113999: Asilib - Alexandre Spangaro&lt;br /&gt;
*ID 114000 - 114999: Iceleaf OÜ&lt;br /&gt;
*ID 115000 - 115999: 2A2C Conseil - Cyril ZEKSER&lt;br /&gt;
*ID 116000 - 116999: Wolftec GmbH&lt;br /&gt;
*ID 117000 - 117999: Oscim (http://www.oscim.fr)&lt;br /&gt;
*ID 118000 - 118999: Oarces Web (dev.oarces.com)&lt;br /&gt;
*ID 119000 - 119999: Manuel Berrocal - Absolacom&lt;br /&gt;
*ID 120000 - 120999: Régis Houssin (http://www.inodbox.com) - France&lt;br /&gt;
*ID 121000 - 121999: Oscss - Shop - France&lt;br /&gt;
*ID 122000 - 122999: MrSof - la Nation du Web&lt;br /&gt;
*ID 123000 - 123999: Bruno Généré (webiseasy.org)&lt;br /&gt;
*ID 124000 - 124999: 7reasons s.r.l. (www.7reasons.eu) - Austria&lt;br /&gt;
*ID 125000 - 125999: ProgSI (www.progsi.ma)&lt;br /&gt;
*ID 126000 - 126999: Catalanet&lt;br /&gt;
*ID 127000 - 127999: Virgilio Filho pt-BR Brasil (@dolibarr.br) - Brazil&lt;br /&gt;
*ID 128000 - 128999: Nicolas Frappé France (www.sospc.info)&lt;br /&gt;
*ID 129000 - 129999: Adeo-Informatique&lt;br /&gt;
*ID 130000 - 130999: Technicks ICT (http://www.technicks.eu) - Italy&lt;br /&gt;
*ID 131000 - 131999: Joan Louis (itaca.fr) - France&lt;br /&gt;
*ID 132000 - 132999: Jean-Marie Arsac (https://azimut.fr) - France&lt;br /&gt;
*ID 133000 - 133999: Oriel Systems Ltd, UK. (www.orielsystems.com)&lt;br /&gt;
*ID 134000 - 134999: ALSOFT PVT. LTD. (https://www.alsoft.org)&lt;br /&gt;
*ID 135000 - 135999: Net-Logic (https://netlogic.fr)&lt;br /&gt;
*ID 136000 - 136050: MONA.RE - France&lt;br /&gt;
*ID 136051 - 136099: La Vida Marketing&lt;br /&gt;
*ID 136100 - 136149: Synergies-Tech France. (https://www.synergies-france.fr/)&lt;br /&gt;
*ID 136150 - 136199: Lyta&lt;br /&gt;
*ID 136200 - 136219: Maison Théophile Leclerc&lt;br /&gt;
*ID 136220 - 136270: SegoFount - Spain&lt;br /&gt;
*ID 136271 - 136320: Labor Dispatch (Simon Sheng , China)&lt;br /&gt;
*ID 136321 - 136370: MB Informatique (https://www.mb-informatique.fr)&lt;br /&gt;
*ID 136371 - 136420: Daxit Solutions (https://www.daxit.be)&lt;br /&gt;
*ID 136421 - 136470: HUSCH GmbH (https://husch-gmbh.de)&lt;br /&gt;
*ID 136471 - 138999: NSINFO (https://www.ns-info.fr)&lt;br /&gt;
*ID 139000 - 139999: Synergies-Tech France. (https://www.synergies-france.fr/)&lt;br /&gt;
*ID 140000 - 140999: Altairis (http://altairis.fr)&lt;br /&gt;
*ID 141000 - 141050: Projet2Team (https://www.projet2team.fr)&lt;br /&gt;
*ID 141051 - 141099: Elistair (http://elistair.com)&lt;br /&gt;
*ID 141100 - 141149: Blue Networks Technologies (https://www.blnt.fr)&lt;br /&gt;
*ID 141150 - 141199: Mainlab S.r.l. (https://www.mainlabonline.it) - Italy&lt;br /&gt;
*ID 141200 - 141249: Florian DUFOURG - France&lt;br /&gt;
*ID 141250 - 141299: SoftAddicts - Canada&lt;br /&gt;
*ID 141300 - 141349: Finanboo - (https://www.finanboo.com)&lt;br /&gt;
*ID 141350 - 141399: ConstruxZion Soft - Colombia (https://www.construxzionsoft.com.co)&lt;br /&gt;
*ID 141400 - 141450: COEXDIS - République Démocratique du Congo (https://www.coexdis.com)&lt;br /&gt;
*ID 141451 - 141501: HALFWARE - Algeria (https://www.half-ware.com)&lt;br /&gt;
*ID 141502 - 141552: Quantraum (https://quantraum.com)&lt;br /&gt;
*ID 141553 - 141603: Nateo Group&lt;br /&gt;
*ID 141604 - 141653: digital centric GmbH (https://www.digitalcentric.de/dolibarr)&lt;br /&gt;
*ID 141654 - 141699: Decrypting (https://www.decrypting.fr)&lt;br /&gt;
*ID 141700 - 141749: Zeise IT Consulting - Germany (https://www.zeise-it.de)&lt;br /&gt;
*ID 141750 - 141799: Data Rooster - France (https://datarooster.io)&lt;br /&gt;
*ID 141800 - 141849: IP Développement (https://www.ipdeveloppement.fr)&lt;br /&gt;
*ID 141850 - 141899: MSICCA | MRVL Soluciones de Ingeniería y Construcción, c.a (https://msicca.com)&lt;br /&gt;
*ID 141900 - 141949: THERSANE (https://www.thersane.fr)&lt;br /&gt;
*ID 141950 - 141999: MB Informatique (https://www.mb-informatique.fr)&lt;br /&gt;
*ID 142000 - 142049: ITANéA (https://www.itanea.fr)&lt;br /&gt;
*ID 142050 - 142099: ERP Consulting NZ ([https://www.erpconsulting.co.nz www.erpconsulting.co.nz])&lt;br /&gt;
*ID 142100 - 142149: Bloxera GmbH (https://www.bloxera.com)&lt;br /&gt;
*ID 142150 - 142199: Evangelos Souglakos - Greece&lt;br /&gt;
*ID 142200 - 142249: Luc CALARESU - France&lt;br /&gt;
*ID 142250 - 142299: OmnIT Services - Belgique (https://www.omnitservices.biz)&lt;br /&gt;
*ID 142300 - 142349: Gwadeyes - Guadeloupe (https://www.gwadeyes-informatique.com/)&lt;br /&gt;
*ID 142350 - 142399: Solution Libre (https://www.solution-libre.fr/)&lt;br /&gt;
*ID 142400 - 142449: Res Digital (https://res.digital)&lt;br /&gt;
*ID 142450 - 142499: itopie informatique (https://www.itopie.ch)&lt;br /&gt;
*ID 142500 - 142549: Weblinx.IT GbR (https://weblinx.it/) - Germany&lt;br /&gt;
*ID 142550 - 142599: ASCI-Automation - Mexico (https://asci-automation.com.mx/)&lt;br /&gt;
*ID 142600 - 142649: ZENKO Design - Japan / France / Spain&lt;br /&gt;
*ID 142650 - 142699: AWeerWolf&lt;br /&gt;
*ID 142700 - 148749: Lysis (https://lysis.net/)&lt;br /&gt;
*ID 142750 - 142799: Hadritech (https://www.hadritech.com/)&lt;br /&gt;
*ID 142800 - 142849: Bloxera GmbH (https://www.bloxera.com)&lt;br /&gt;
*ID 142850 - 148999: Everlats S.L. - España (https://www.everlats.com)&lt;br /&gt;
*ID 149000 - 149999: SydTech - America Central (https://www.sydtech.io/)&lt;br /&gt;
*ID 150000 - 150999: Jeffinfo&lt;br /&gt;
*ID 151000 - 151999: Konverseo (https://konverseo.com)&lt;br /&gt;
*ID 152000 - 152049: Tanguy Pénet (http://tanguype.net)&lt;br /&gt;
*ID 152050 - 152099: Web Solutions&lt;br /&gt;
*ID 152100 - 152149: MagicNet (https://www.magicnet.it)&lt;br /&gt;
*ID 152150 - 152199: Benjamin Falière (https://www.faliere.com)&lt;br /&gt;
*ID 152200 - 152249: Solauv&lt;br /&gt;
*ID 152250 - 156499: TecnoGestión Principado S.L. (https://www.tecnogestion.com) - Asturias - España&lt;br /&gt;
*ID 156500 - 156549: ACE Recycling  (https://www.acerecycling.net.au/)&lt;br /&gt;
*ID 156550 - 156599: Kreativität Works ([http://www.kreativitat.com http://kreativitat.com])&lt;br /&gt;
*ID 156600 - 156649: [https://pierre-couy.dev Pierre Couy]&lt;br /&gt;
*ID 156650 - 156699: CXI (https://cyrix.co.za)&lt;br /&gt;
*ID 156700 - 156749: Mustafa Kemerci - Turkiye&lt;br /&gt;
*ID 156750 - 156799: [https://de-grandpre.quebec de Grandpré Technologies] - Québec (Canada)&lt;br /&gt;
*ID 156800 - 156849: Draceo&lt;br /&gt;
*ID 156850 - 156899: Valleiweb&lt;br /&gt;
*ID 156900 - 159949: NEOVIAQ Advisory LU(https://www.neoviaq.com)&lt;br /&gt;
*ID 159950 - 159999: Arve et Giffre INFOGESTION (https://www.ag-infogestion.fr)&lt;br /&gt;
*ID 160000 - 160999: Charles-François BENKE (http://www.patas-monkey.com)&lt;br /&gt;
*ID 161000 - 161999: Abbes Bahfir (https://01consulting.eu)&lt;br /&gt;
*ID 162000 - 162999: Jacques Rébiscoul&lt;br /&gt;
*ID 163000 - 163999: Open-DSI (https://www.open-dsi.fr)&lt;br /&gt;
*ID 164000 - 164999: Pixelada S. Coop. And. (https://pixelada.org)&lt;br /&gt;
*ID 165000 - 165049: DovConnect&lt;br /&gt;
*ID 165050 - 165099: Mind Operated Systems (https://www.mosystems.biz)&lt;br /&gt;
*ID 165100 - 165150: SD-Formation (https://sdformation.fr)&lt;br /&gt;
*ID 165151 - 165199: NUM&#039;X (https://www.numx-sets.eu)&lt;br /&gt;
*ID 165200 - 165249: Benjam Préjent (https://www.benjam-prejent.fr)&lt;br /&gt;
*ID 165250 - 165299: Dhi Loka Private Limited, India (https://www.dhiloka.com)&lt;br /&gt;
*ID 165300 - 169999: Accellier Limited (https://www.accellier.com/)&lt;br /&gt;
*ID 170000 - 170999: TRIDENT CONSULTING LTD (www.tridentdxb.com)&lt;br /&gt;
*ID 171000 - 171999: LVSInformatique (www.lvsinformatique.com)&lt;br /&gt;
*ID 172000 - 172299: Ray Soft-Systems (https://www.ray-soft-systems.com)&lt;br /&gt;
*ID 172300 - 172349: Günter Lukas Consulting (https://gl.co.at)&lt;br /&gt;
*ID 172350 - 172399: MB Informatique (https://www.mb-informatique.fr)&lt;br /&gt;
*ID 172400 - 172449: Professional Structures Limited (https://pstructures.com)&lt;br /&gt;
*ID 172450 - 172699: IT-BS (https://www.it-bs.fr)&lt;br /&gt;
*ID 172700 - 172749: Indelog (https://www.indelog.fr)&lt;br /&gt;
*ID 172750 - 172799: NS-INFO90 (https://www.ns-info90.fr)&lt;br /&gt;
*ID 172800 - 172849: E-Concept Applications (https://e-concept-applications.fr)&lt;br /&gt;
*ID 172850 - 172899: B&amp;amp;R Stamm UG (https://stamm-ug.de)&lt;br /&gt;
*ID 172900 - 172949: Dolipive, support@dolipive.fr, www.dolipive.fr&lt;br /&gt;
*ID 172950 - 172999: CKD-Industrie (https://ckd-industrie.com/) - France&lt;br /&gt;
*ID 173000 - 173049: Aneosys (https://aneosys.fr) - France&lt;br /&gt;
*ID 173050 - 173099: Sebastian Schloßer - Germany&lt;br /&gt;
*ID 173100 - 173149: TecnoSoluciones (https://tecnosoluciones.com)&lt;br /&gt;
*ID 173150 - 173199: Digitalworks (https://www.digitalworks.fr) - France&lt;br /&gt;
*ID 173200 - 173249: UNi.D Consulting (https://www.unid-consulting.fr) - France&lt;br /&gt;
*ID 173250 - 173299: NetworkDigital(https://www.networkdigital.fr) - France&lt;br /&gt;
*ID 173300 - 173300: Módulo VeriFactu Dolibarr (https://verifactudolibarr.es/) - España&lt;br /&gt;
*ID 173301 - 173320: Sibanet (https://sibanet.net) - España&lt;br /&gt;
*ID 173321 - 173340: [https://www.dolibarr.fr/forum/u/kusco/summary Kusco]&lt;br /&gt;
*ID 173341 - 179999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 180000 - 180999: Triangle Ingénierie&lt;br /&gt;
*ID 181000 - 181999: TI Sin Problemas (https://www.tisinproblemas.com)&lt;br /&gt;
*ID 182000 - 182049: Chipserv Pawel Wlizlo (https://www.testware.it)&lt;br /&gt;
*ID 182050 - 182070: Herolapse (https://herolapse.com/)&lt;br /&gt;
*ID 182061 - 182999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 183000 - 183999: BB2A Anthony Berton (https://www.bb2a.fr)&lt;br /&gt;
*ID 184000 - 184999: DPS PRINTING &amp;amp; DOCUMENTS SOCIEDAD ANONIMA (https://www.dps-lat.com)&lt;br /&gt;
*ID 185000 - 185049: Telioskour (https://github.com/telioskour)&lt;br /&gt;
*ID 185050 - 185099: Moko Consulting ([[Moko Consulting]] || https://mokoconsulting.tech)&lt;br /&gt;
*ID 185100 - 185149: Sinabe (https://sinabe.ch) - Suisse&lt;br /&gt;
*ID 185150 - 189999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 190000 - 190999: Diciannove (http://19.coop)&lt;br /&gt;
*ID 191000 - 191999: Elonet (https://elonet.fr)&lt;br /&gt;
*ID 192000 - 192049: IDFOR Consulting (https://www.idfor-consulting.fr/)&lt;br /&gt;
*ID 192050 - 198999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 199000 - 199999: RFMS&lt;br /&gt;
*ID 200000 - 200999: Noxiome&lt;br /&gt;
*ID 201000 - 201999: Sasa Ostrouska (saxa)&lt;br /&gt;
*ID 202000 - 202999: Z-Application&lt;br /&gt;
*ID 203000 - 203099: Elidee - elidee.com&lt;br /&gt;
*ID 203100 - 203999: Garcia MICHEL (soamichel.fr)&lt;br /&gt;
*ID 204000 - 204999: Ari Elbaz elarifr - accedinfo.com&lt;br /&gt;
*ID 205000 - 205999: Kreiz IT&lt;br /&gt;
*ID 206000 - 206999: GBINFO (www.gbinfo.fr)&lt;br /&gt;
*ID 207000 - 207099: MacroProg (https://www.macroprog.com)&lt;br /&gt;
*ID 207100 - 207149: Reactiva Software&lt;br /&gt;
*ID 207150 - 207199: Ndejje University Water Research and Development Centre ([https://github.com/NDUWRDC/LIMS/])&lt;br /&gt;
*ID 207200 - 207299: Massaoud Bouzenad ([https://www.dzprod.net dzprod.net])&lt;br /&gt;
*ID 207300 - 207349: Ksar&lt;br /&gt;
*ID 207350 - 207399: Easylinux (www.easylinux.fr)&lt;br /&gt;
*ID 207400 - 207449: Arthur LENOBLE&lt;br /&gt;
*ID 207450 - 207499: Vaicop SAS de CV (México)&lt;br /&gt;
*ID 207500 - 212099: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 212100 - 212149: Audio Vidéo Technologies (https://www.avtek.fr)&lt;br /&gt;
*ID 212150 - 213999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 214000 - 214049: X-Boss&lt;br /&gt;
*ID 214050 - 221999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 220000 - 220050: Apex Tech (https://apextechmods.com)&lt;br /&gt;
*ID 220051 - 220100: Technology Xchange Solutions (https://www.txscorp.com)&lt;br /&gt;
*ID 222000 - 222999:  dolibit  (https://www.dolibit.de)&lt;br /&gt;
*ID 223000 - 223049: Tráfico Canada&lt;br /&gt;
*ID 223050 - 223099 : VLTN (https://vltn.sh)&lt;br /&gt;
*ID 223100 - 229949: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 229950 - 229999: Solucions Informàtiques, Serveis i Innovació SLU (https://6innova.es)&lt;br /&gt;
*ID 230000 - 230049: Unareil (https://www.unareil.eu)&lt;br /&gt;
*ID 230050 - 230099: Lyra Network (https://www.lyra.com/)&lt;br /&gt;
*ID 230100 - 230149: Gheorghe Iftimi - CTW - RO&lt;br /&gt;
*ID 230150 - 230199: MEMA Machinery &amp;amp; Tools (https://www.mema.be)&lt;br /&gt;
*ID 230200 - 230249: Teleassist&lt;br /&gt;
*ID 230250 - 230299: Nh Developer&lt;br /&gt;
*ID 230300 - 230499: Chickenforce/code-chicken, IT Services Hahn (https://github.com/code-chicken [http://itservices-hahn.de/ https://itservices-hahn.de])&lt;br /&gt;
*ID 230500 - 230549: Hidup Consulting (https://consulting.hidup.io)&lt;br /&gt;
*ID 230550 - 230599 : CMR Conseil (https://www.weblockup.fr)&lt;br /&gt;
*ID 230600 - 230649 : aFreeMind Studio&lt;br /&gt;
*ID 230650 - 230699 : Unideal (https://www.uni-deal.com)&lt;br /&gt;
*ID 230700 - 230749 : DevLansdes (https://devlandes.com/)&lt;br /&gt;
*ID 230750 - 262699: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 262700 - 262799: Scopen (https://www.scopen.fr)&lt;br /&gt;
*ID 262800 - 262849: Christophe BATTAREL EI&lt;br /&gt;
*ID 262850 - 271799: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 271800 - 271849: bee solutions sàrl (Switzerland)&lt;br /&gt;
*ID 271850 - 274199: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 274200- 274249: Mathilde MAROCCO (https://mminformatique.fr)&lt;br /&gt;
*ID 274250 - 274299: Nerv Project (www.nerv-project.eu)&lt;br /&gt;
*ID 274300 - 274349: Knowhere Consulting S.L. (https://www.knowhere-consulting.eu)&lt;br /&gt;
*ID 274350 - 274399: Milen karaganski (https://blacktiehost.com)&lt;br /&gt;
*ID 274400 - 274449: Vincent MAURY ([https://www.timgroup.fr www.timgroup.fr])&lt;br /&gt;
*ID 274450 - 274499: Daraelmin&lt;br /&gt;
*ID 274500 - 274549: Emilie LAFORET (http://www.ermvallon.com)&lt;br /&gt;
*ID 274550 - 278999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 279000 - 279049: VSDigital Electronics (https://vsdigital.ar) - Argentina&lt;br /&gt;
*ID 279050 - 279999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 280000 - 280049: Bingroup (https://www.beinng.com)&lt;br /&gt;
*ID 280050 - 280099: Medialta (https://medialta.com)&lt;br /&gt;
*ID 280100 - 280149: Cédric Ancelin - Ancode (https://www.dolistore.com/fr/recherche?search_query=ancode)&lt;br /&gt;
*ID 280150 - 289999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 290000 - 290099: BNS - Project doliBRA ([https://www.beinng.com https://www.bns.net.br]) - Brasil&lt;br /&gt;
*ID 290100 - 299999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 300000 - 300049: RapidProgress (https://www.rapidprogress.eu) - Bulgaria&lt;br /&gt;
*ID 300050 : 300099: M@ Solution (https://www.ma-solution.fr/)&lt;br /&gt;
*ID 300100 : 300149: LAVA RUN (https://www.lavarun.re)&lt;br /&gt;
*ID 300150 - 300199: PsyCrow Code&lt;br /&gt;
*ID 300200 : 300249 : Computences (https://www.computences.com/)&lt;br /&gt;
*ID 300250 : 300299 : LEVEL IT (https://levelit.com.ar)&lt;br /&gt;
*ID 300300 : 300349 : Progiseize (https://progiseize.fr)&lt;br /&gt;
*ID 300350 - 300399: MB Informatique (https://www.mb-informatique.fr)&lt;br /&gt;
*ID 300400 - 300449: Anouar Touati&lt;br /&gt;
*ID 300450 - 300499: Martin Danger&lt;br /&gt;
*ID 300500 - 301499: Whale Blows&lt;br /&gt;
*ID 301500 - 301549: Tom Trust - International&lt;br /&gt;
*ID 301550 - 301599: MB Informatique (https://www.mb-informatique.fr)&lt;br /&gt;
*ID 301600 - 302499: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 302500 - 302549: Diamubi (https://diamubi.com)&lt;br /&gt;
*ID 302550 - 302599: Datolab (https://www.datolab.com)&lt;br /&gt;
*ID 302600 - 302649: DuMaCo (https://www.dumaco.de)&lt;br /&gt;
*ID 302650 - 302699: Resilio SA&lt;br /&gt;
*ID 302700 - 302749: Aroga&lt;br /&gt;
*ID 302750 - 302799: Productivix (https://www.productivix.com)&lt;br /&gt;
*ID 302800 - 302849: Slibzz&lt;br /&gt;
*ID 302850 - 302899: idea design (https://ideadesign.dz)&lt;br /&gt;
*ID 302900 - 302949: AL MISBAH INFORMATIQUE (https://www.almisbah.ma)&lt;br /&gt;
*ID 302950 - 302999: Atis Solutions - France&lt;br /&gt;
*ID 303000 - 303499: Obixav - Nigeria&lt;br /&gt;
*ID 303500 - 303549: buschler plus GmbH, Germany (https://buschler.plus)&lt;br /&gt;
*ID 303550 - 303599: Prestalidaire - France (https://prestalidaire.com)&lt;br /&gt;
*ID 303600 - 309999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 310000 - 310049: Neilson Dufour (&amp;lt;nowiki&amp;gt;https://hypercode.ca&amp;lt;/nowiki&amp;gt;)&lt;br /&gt;
*ID 310050 - 313999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 314000 - 314049: Ruemmler IT Solutions (https://www.ruemmler.net)&lt;br /&gt;
*ID 314050 - 314149: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 314150 - 314199: Benoît PASCAL&lt;br /&gt;
*ID 314200 - 319999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 320000 - 320999: Novus Studios (www.novusstudios.it)&lt;br /&gt;
*ID 321000 - 321999: AtooNet (http://www.atoo-net.com)&lt;br /&gt;
*ID 322000 - 322049: Doymer Consultores&lt;br /&gt;
*ID 322050 - 329999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 330000 - 330049: XTEC Industries (www.xtec-ind.com)&lt;br /&gt;
*ID 330050 - 330099: 10100 S.R.L. - (www.10100.to)&lt;br /&gt;
*ID 330100 - 330149: AES Dana SRL (https://aes-dana.be)&lt;br /&gt;
*ID 330150 - 330199: Freshcore (https://www.freshcore.fr)&lt;br /&gt;
*ID 330200 - 331999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 332000 - 332099: Gecka (https://gecka.nc)&lt;br /&gt;
*ID 332100 - 332149: Agence Milkshake (http://agencemilkshake.com)&lt;br /&gt;
*ID 332150 - 332199: Daniel Prowald IT – Service (https://prowald-it.de)&lt;br /&gt;
*ID 332200 - 332249: UNITICE (https://unitice.com)&lt;br /&gt;
*ID 332250 - 332299: Sidonie Moulart&lt;br /&gt;
*ID 332300 - 332349: LTDJ (Antonin MARCHAL - Le Temple du Jeu)&lt;br /&gt;
*ID 332350 - 333299: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 333300 - 333349: Sense Africa (http://sense.africa)&lt;br /&gt;
*ID 333350 - 349999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 350000 - 350049: SOUNDOU &amp;amp; MIDAS (https://www.soundou.org/)&lt;br /&gt;
*ID 350050 - 350099: Ildefonso González (https://igontek.es)&lt;br /&gt;
*ID 350100 - 350149: 7Kas Servicios de Internet, S.L. (https://7kas.com)&lt;br /&gt;
*ID 350150 - 350999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 351000 - 351049: P&#039;tite Tête (https://ptitetete.com) - France&lt;br /&gt;
*ID 351050 - 398999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 359000 - 359049: Milen Karaganski0&lt;br /&gt;
*ID 400000 - 400999: 2byte.es (http://www.2byte.es)&lt;br /&gt;
*ID 401000 - 401999: B&amp;amp;D Informática&lt;br /&gt;
*ID 402000 - 402999: Marcos García de La Fuente (marcosgdf)&lt;br /&gt;
*ID 403000 - 403999: Sergibyte&lt;br /&gt;
*ID 404000 - 404999: Aikhan&lt;br /&gt;
*ID 405000 - 405999: AIME (http://www.aime.mx)&lt;br /&gt;
*ID 406000 - 406999: Som Núvol (https://somnuvol.coop)&lt;br /&gt;
*ID 407000 - 408999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 409000 - 409999: LliureTIC (https://www.lliuretic.cat)&lt;br /&gt;
*ID 410000 - 410999: DoliGov&lt;br /&gt;
*ID 411000 - 411049: GATTEK SARL (https://www.ga-ttek.com)&lt;br /&gt;
*ID 411050 - 419999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 420000 - 420099: BBS Concept&lt;br /&gt;
*ID 420100 - 420199: LeMousticProduction (www.lemousticproduction.info) -&amp;lt; module DoliRH&lt;br /&gt;
*ID 420200 - 421199: VatCheck (www.abnc.be)&lt;br /&gt;
*ID 421200 - 422199: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 422200 - 422999: Artaban (http://artaban.fr)&lt;br /&gt;
*ID 423000 - 423049: cyberesprit&lt;br /&gt;
*ID 423050 - 423099: R.Bossard&lt;br /&gt;
*ID 423100 - 423199: Joliciel (www.joliciel.fr)&lt;br /&gt;
*ID 423200 - 423299: Pragma-tech (www.pragma-tech.fr)&lt;br /&gt;
*ID 423299 - 423999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 424000 - 424049: Philazerty ([https://www.philazerty.fr www.philazerty.fr])&lt;br /&gt;
*ID 424050 - 424099: Pragma-tech (www.pragma-tech.fr)&lt;br /&gt;
*ID 424100 - 424149: Ohoo Solutions (http://www.ohoosolutions.com)&lt;br /&gt;
*ID 424150 - 424199: DAGARCAM Informática (https://www.dagarcam.com/)&lt;br /&gt;
*ID 424200 - 424999: Lab51 (https://github.com/lab51org)&lt;br /&gt;
*ID 425000 - 425999: Sébastien SERRE Thivinfo (www.thivinfo.com)&lt;br /&gt;
*ID 426000 - 426099: Arkesis-Solution&lt;br /&gt;
*ID 426100 - 426149: GetLandy (www.getlandy.com)&lt;br /&gt;
*ID 426150 - 426649: OOB Software&lt;br /&gt;
*ID 426650 - 426849: Soft-Task Serviços e Sistemas (www.soft-task.com.br)&lt;br /&gt;
*ID 426850 - 426999: Bruno Caldas (https://github.com/BCaldas)&lt;br /&gt;
*ID 427000 - 427999: Kevin GUERRIER (alias xcl.saian)&lt;br /&gt;
*ID 428000 - 428099: af83&lt;br /&gt;
*ID 428100 - 428199: Arnaud Serrut - Adalon&lt;br /&gt;
*ID 428200 - 428249: imschweiler consulting (http://www.imschweiler-consulting.de&#039;&#039;&#039;&amp;lt;nowiki/&amp;gt;&#039;&#039;&#039;)&lt;br /&gt;
*ID 428250 - 428299: AL1FO&lt;br /&gt;
*ID 428300 - 428349: Federico García-Patiño Barbolani (&amp;lt;federico.garcia.patino@gmail.com&amp;gt;)&lt;br /&gt;
*ID 428350 - 428399: INTM Groupe - France (www.intm.com)&lt;br /&gt;
*ID 428400 - 428449: Nick Fragoulis - Greece&lt;br /&gt;
*ID 428450 - 428499: Kontava - France ([https://www.kontava.fr www.kontava.fr)]&lt;br /&gt;
*ID 428500 - 428549: hkwhitten - USA&lt;br /&gt;
*ID 428550 - 428999: SmartOne&lt;br /&gt;
*ID 429000 - 429999: induslab&lt;br /&gt;
*ID 430000 - 430099: Mixity sprl (www.mixity.be)&lt;br /&gt;
*ID 430100 - 430199: sgiraud&lt;br /&gt;
*ID 430200 - 430299: Merlion TI (www.merlion-si.com.br)&lt;br /&gt;
*ID 430300 - 431299: Libre Expert (www.libre-expert.com)&lt;br /&gt;
*ID 431300 - 431399: ptibogxiv (www.ptibogxiv.net)&lt;br /&gt;
*ID 431400 - 431499: Befox (www.befox.fr)&lt;br /&gt;
*ID 431500 - 431599: rue Béjo (www.ruebejo.fr)&lt;br /&gt;
*ID 431600 - 431699: Avizzeo (www.avizzeo.com)&lt;br /&gt;
*ID 431700 - 432199: Multisistemas (www.multisistemas.com.sv)&lt;br /&gt;
*ID 432200 - 432399: Burbuja - Chile (www.burbuja.cl)&lt;br /&gt;
*ID 432400 - 433399: INOVEA CONSEIL (https://www.inovea-conseil.com)&lt;br /&gt;
*ID 433400 - 434399: Rachid HRICH - Maroc (HricH ServiceS.)&lt;br /&gt;
*ID 434400 - 435399: Lance Bleakley - LanceIT (www.lanceit.net)&lt;br /&gt;
*ID 435400 - 435999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 436000 - 436099: SOWEBIO (www.soweb.io)&lt;br /&gt;
*ID 436100 - 436199: CAP-REL (www.cap-rel.fr)&lt;br /&gt;
*ID 436200 - 436300: TDE-INFORMATIQUE (www.tde-informatique.fr)&lt;br /&gt;
*ID 436301 - 436349: Evarisk ([https://www.evarisk.com/id-module-dolibarr/ www.evarisk.com])&lt;br /&gt;
*ID 436350 - 436399: Eoxia ([https://www.eoxia.com/dolibarr/modules/ www.eoxia.com])&lt;br /&gt;
*ID 436400 - 437399: Mohamed AHERDANE - Morocco - IT Consultant ( www.wave.ma )&lt;br /&gt;
*ID 437400 - 437449: Martin Neubauer - Germany&lt;br /&gt;
*ID 437450 - 437599: Club1click (www.club1click.es)&lt;br /&gt;
*ID 437600 - 437629: Coulon Vincent (https://github.com/HoverEpic)&lt;br /&gt;
*ID 437630 - 437649: Aytechnet (https://www.aytechnet.fr/) - François Pons&lt;br /&gt;
*ID 437650 - 437699: LibreMaster (https://libremaster.com) - Christophe T.&lt;br /&gt;
*ID 437700 - 437749: STELLAR Broadband (https://www.stellarbb.com) - U.S.A. - Philip Laycock&lt;br /&gt;
*ID 437750 - 437799: DIGITA.LU Ajous Solutions&lt;br /&gt;
*ID 437800 - 437850: iProspective (https://iprospective.fr) - Mathieu Moulin&lt;br /&gt;
*ID 437851 - 437900: Theobald Groupe.&lt;br /&gt;
*ID 437901 - 437950: Neuronnexion (http://neuronnexion.coop)&lt;br /&gt;
*ID 437951 - 437952: jmbc - APIA-ASSO (https://www.apia-asso.fr)&lt;br /&gt;
*ID 437953 - 438002: IPCZEN SARL (https://www.ipczeninformatique.fr/)&lt;br /&gt;
*ID 438003 - 438052: FESF IT Department (https://fesf.org.pk)&lt;br /&gt;
*ID 438053 - 438103: Pilot Engineering team&lt;br /&gt;
*ID 438104 - 438153: u2042 (https://u2042.com)&lt;br /&gt;
*ID 438154 - 438204: Djair E Pereira (ocultooooo@gmail.com) - Brasil&lt;br /&gt;
*ID 438205 - 438255: yoandm (https://yoandm.com)&lt;br /&gt;
*ID 438256 - 438299: PTMSoft (&amp;lt;nowiki&amp;gt;https://www.ptmsoft.fr&amp;lt;/nowiki&amp;gt;)&lt;br /&gt;
*ID 438300 - 438399: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 438400 - 439399: Tetras Libre - France - Développement logiciels libres (www.tetras-libre.fr)&lt;br /&gt;
*ID 439400 - 440399: Dolibarr-pro - France - Développement Dolibarr (www.dolibarr-pro.com)&lt;br /&gt;
*ID 440400 - 441399: Quidlab Co., Ltd - Thailand - ( www.quidlab.com )&lt;br /&gt;
*ID 441400 - 442399: Ide@log - France - (https://www.idealog-info.net) - Laurent Leblanc&lt;br /&gt;
*ID 442400 - 443399: Valerio Bianchi (www.valeriobianchi.com)&lt;br /&gt;
*ID 443400 - 444399: delassalle - France - (www.delassalle.fr) - Joseph Delassalle&lt;br /&gt;
*ID 444400 - 445399: Webartis - Maroc - (www.webartis.net) - François Dry&lt;br /&gt;
*ID 445400 - 445499: SCOP Au-delà des nuages - France&lt;br /&gt;
*ID 445500 - 445549: X Net Systems - Egypt - (https://www.xneteg.com)&lt;br /&gt;
*ID 445550 - 445999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 446000 - 446999: iouston (http://www.iouston.com) - France - Julien Marchand&lt;br /&gt;
*ID 447000 - 447999: rSanjoSEO - Rafael San José Tovar (www.rsanjoseo.com) - Spain&lt;br /&gt;
*ID 448000 - 448999: Code 42 (www.code42.fr)&lt;br /&gt;
*ID 449000 - 449999: TakePOS (www.takepos.com)&lt;br /&gt;
*ID 450000 - 450999: Pierre ARDOIN&lt;br /&gt;
*ID 451000 - 451999: Éditeur depordi.fr&lt;br /&gt;
*ID 452000 - 452999: Dylan NAKONG&lt;br /&gt;
*ID 453000 - 453999: Menahd Ouchenir - France - menahd-ouchenir.com&lt;br /&gt;
*ID 454000 - 454999: Withheld - Canada&lt;br /&gt;
*ID 455000 - 455999: Gaëtan MAISON - Info Libre @ Dom - France (https://www.infolibreadom.com)&lt;br /&gt;
*ID 456000 - 456999: Laurent LEBLEU - B.L.C. - Blue Line Company - Lille - France (www.bluelinecompany.fr/dolibarr)&lt;br /&gt;
*ID 457000 - 457999: Sébastien BOUCHER&lt;br /&gt;
*ID 458000 - 458999: Lester HERNÁNDEZ - Argentina - (freelancerlrhd@gmail.com)&lt;br /&gt;
*ID 459000 - 459999: Infopen - France&lt;br /&gt;
*ID 460000 - 460049: torvista - Spain&lt;br /&gt;
*ID 460050 - 460999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 461000 - 461999: MEGALOGI - Maroc (www.erpcloud.ma)&lt;br /&gt;
*ID 462000 - 462999: Making Digital (www.making-digital.fr) - France&lt;br /&gt;
*ID 463000 - 463999: linx s.r.l.s.&lt;br /&gt;
*ID 464000 - 464999: NimbleCubed Inc. (www.nimblecubed.com)&lt;br /&gt;
*ID 465000 - 465999: Artefacts - CourantAlternatif&lt;br /&gt;
*ID 466000 - 466999: CDM Consultores - (www.cdm.guru)&lt;br /&gt;
*ID 467000 - 467999: M71 Service GmbH - (www.m71-service.de)&lt;br /&gt;
*ID 468000 - 468049: Clément Segonzac - France (clement.segonzac@gmail.com)&lt;br /&gt;
*ID 468050 - 468099: Flavien Belli - France (https://github.com/Marshlyin || belliflaviencontactpro@gmail.com)&lt;br /&gt;
*ID 468100 - 468119: Chl (https://code.bugness.org/Dolibarr)&lt;br /&gt;
*ID 468120 - 468169: Commotron GmbH (https://www.commotron.com/)&lt;br /&gt;
*ID 468170 - &#039;&#039;&#039;468219&#039;&#039;&#039;: Infans Group (franck.lauby@infans.fr)&lt;br /&gt;
*ID &#039;&#039;&#039;468175&#039;&#039;&#039; - &#039;&#039;&#039;468199&#039;&#039;&#039;: Gaëlle Rauffet - France (kiwiscan.net)&lt;br /&gt;
*ID &#039;&#039;&#039;468200&#039;&#039;&#039; - 468249: Paulo Oliveira - Brasil (paulorcdo@gmail.com)&lt;br /&gt;
*ID 468250 - 468269:  CD-Systems - France (https://www.cd-systems.fr)&lt;br /&gt;
*ID 468270 - 468299: Nicolas Testori&lt;br /&gt;
*ID 468300 - 468349: Uvensys - Germany (https://uvensys.de)&lt;br /&gt;
*ID 468350 - 468399: Laudeco - Belgium (http://github.com/laudeco)&lt;br /&gt;
*ID 468400 - 468449: Alexis LAURIER - France (https://www.alexislaurier.fr)&lt;br /&gt;
*ID 468450 - 468499: Mehdi Belkhayat - Maroc (https://opensi.ma)&lt;br /&gt;
*ID 468500 - 468599: InvIT GmbH - Germany (https://invit.sh)&lt;br /&gt;
*ID 468600 - 468649: Ricardo Sequeira - Portugal (https://ricardo-sequeira.com)&lt;br /&gt;
*ID 468650 - 468699: J-IT - Belgique (https://www.j-it.be)&lt;br /&gt;
*ID 468700 - 468749: Fidesio - France (https://www.fidesio.com/)&lt;br /&gt;
*ID 468750 - 468799: Sgestion - Spain (http://www.sgestion.net/)&lt;br /&gt;
*ID 468800 - 468849: Denis JULIEN - Brasil (matrinxa@free.fr)&lt;br /&gt;
*ID 468850 - 468899: Mmariko - Module GED - Effios&lt;br /&gt;
*ID 468900 - 468949: Maazou Amadou Abdoul aziz - Maroc (yaronfada@gmail.com)&lt;br /&gt;
*ID 468950 - 468999: Alexis LAURIER - France (https://www.alexislaurier.fr)&lt;br /&gt;
*ID 469000 - 469049: John Livingston (https://github.com/JohnXLivingston/)&lt;br /&gt;
*ID 469050 - 469099: Macrorom ICT-services (https://macrorom.nl/)&lt;br /&gt;
*ID 469100 - 469149: HABOT IT - France (https://habot.it)&lt;br /&gt;
*ID 469150 - 469159: CaribbeanConsult.Com CCC - France Guadeloupe (https://dolibarr.ccc.gp)&lt;br /&gt;
*ID 469160 - 469171: GMBG - Portugal&lt;br /&gt;
*ID 469172 - 469199: BGi Lda - Portugal&lt;br /&gt;
*ID 469200 - 469949: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 469950 - 469999: Goldoweb (http://goldoweb.com)&lt;br /&gt;
*ID 470000 - 470999: Reindeer Digital (https://rdeer.cz)&lt;br /&gt;
*ID 471000 - 471099: CAP-REL (www.cap-rel.fr)&lt;br /&gt;
*ID 471100 - 471199: M. Morillon&lt;br /&gt;
*ID 471200 - 471209: Pablo Nuñez&lt;br /&gt;
*ID 471210 - 471249: FANEL A.Ş  (https://www.fanel.com.tr)  [[mail@fanel.com.tr]]&lt;br /&gt;
*ID 471250 - 480999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 481000 - 481999: Alhaidab-ITIS (https://alhaidab.dolibarr.sd)&lt;br /&gt;
*ID 482000 - 482999: Basix IT (https://www.basix.de)&lt;br /&gt;
*ID 483000 - 483049: SASCO SpA (https://www.sasco.cl)&lt;br /&gt;
*ID 483050 - 483099: WIP Engineering (https://www.wip-gmbh.com)&lt;br /&gt;
*ID 483100 - 483149: J.Kaiser&lt;br /&gt;
*ID 483150 - 483199: CodLines (https://www.codlines.com)&lt;br /&gt;
*ID 483200 - 483249: BleepalSoftware (https://bleepal.com)&lt;br /&gt;
*ID 485000 - 485049: Gest Info Service Plus (contact@gest-plus.fr)&lt;br /&gt;
*ID 485050 - 489999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 490000 - 490049: VOLD (https://vold.lu)&lt;br /&gt;
*ID 490050 - 490999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 491000 - 491049: NORD ERP CRM (https://www.nord-erp-crm.fr/)&lt;br /&gt;
*ID 491050 - 491099: KJR-online (https://kjr-online.fr/)&lt;br /&gt;
*ID 491100 - 491149: eNova&lt;br /&gt;
*ID 491150 - 491199: App 4 Business&lt;br /&gt;
*ID 491200 - 491249: Mil24 (http://www.mil24.com.py)&lt;br /&gt;
*ID 491250 - 491299: M2AM&lt;br /&gt;
*ID 491300 - 491349: luigifab (https://github.com/luigifab), also reuse id:105009 for Sentry fork&lt;br /&gt;
*ID 491350 - 491399: Frédéric France (https://github.com/frederic34)&lt;br /&gt;
*ID 491400 - 491449: E-dem (https://www.e-dem.com/)&lt;br /&gt;
*ID 491450 - 491499: Burofree (https://burofreeai.es)&lt;br /&gt;
*ID 491500 - 491549: EMDELEN (https://emdelen.fr/)&lt;br /&gt;
*ID 491550 - 491599: eSoUrCeS Technologie (https://techno.esources.ca/) - Canada&lt;br /&gt;
*ID 491600 - 491649: GoSouce Peru - Peru&lt;br /&gt;
*ID 491650 - 491999: &#039;&#039;&#039;Free (take ranges of 20 only please at once, ask us for more)&#039;&#039;&#039;&lt;br /&gt;
*ID 492000 - 492999: Anura (https://www.anura.fr/)&lt;br /&gt;
*ID 493000 - 493050: Bourez Bastien EI (https://bastien-b.fr/)&lt;br /&gt;
*ID 493051 - 493100: benhmida ilyess (bhilyess98@gmail.com)&lt;br /&gt;
*ID 493101 - 493150 George TS,  George SP (gspanos@makeasite.gr)&lt;br /&gt;
**&lt;br /&gt;
*ID 499001 - 499050: IT GENIUSES (https://www.itgeniuses.com)&lt;br /&gt;
&lt;br /&gt;
DO NOT ADD RECORD HERE, PLEASE FILL HOLES FIRST !!!!&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
=ID &amp;gt; 500000=&lt;br /&gt;
&lt;br /&gt;
This range can&#039;t be reserved. It is a common range. If you don&#039;t plan to distribute your module, you can use an ID in this range with no need to reserve it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t already have reserved ids and need some, please don&#039;t use hazardous number and use a number higher than 500000, but it is better to ask a wiki account, and reserve your own range by editing the  100000 - 499999 range (50 ids at once).&lt;/div&gt;</summary>
		<author><name>Kusco</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Module_Zapier_FR&amp;diff=60369</id>
		<title>Module Zapier FR</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Module_Zapier_FR&amp;diff=60369"/>
		<updated>2024-05-15T10:15:38Z</updated>

		<summary type="html">&lt;p&gt;Kusco: /* Installation */&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 : Modul_Zapier --&amp;gt;&lt;br /&gt;
[[es:Módulo_Zapier]]&lt;br /&gt;
[[fr:Module_Zapier_FR]]&lt;br /&gt;
[[de:Modul_Zapier]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Zapier]]&lt;br /&gt;
[[Category:No Code Automation]]&lt;br /&gt;
{{TemplateDocUser}}&lt;br /&gt;
{{TemplateModFR}}&lt;br /&gt;
{{BasculeDevUser|&lt;br /&gt;
nom=Zapier|&lt;br /&gt;
num=50330|&lt;br /&gt;
devdoc=[[Module Zapier (developer)]]|&lt;br /&gt;
userdoc=This page|}}&lt;br /&gt;
&lt;br /&gt;
=Présentation=&lt;br /&gt;
Ce module sert à gérer les liens entre Dolibarr et Zapier.&lt;br /&gt;
&lt;br /&gt;
=Installation=&lt;br /&gt;
Ce module nécessite de mettre la variable MAIN_FEATURES_LEVEL à 2.&lt;br /&gt;
Pour l&#039;ajouter, aller dans Configuration --&amp;gt; Divers et mettez la valeur à 2. Enfin, activez le module dans la gestion des modules classique.&lt;br /&gt;
&lt;br /&gt;
=Configuration=&lt;br /&gt;
{{ActivationModuleFr}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Créer un compte développeur Zapier==&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, vous devez avoir un compte développeur Zapier, créez-le ici : [https://developer.zapier.com Zapier Platform]&lt;br /&gt;
&lt;br /&gt;
==Créer et déployer « l&#039;application Zapier » sur la plateforme Zapier==&lt;br /&gt;
&lt;br /&gt;
L&#039;App Zapier est un petit package en javascript que vous devez déployer sur Zapier pour que Zapier puisse communiquer avec votre application Dolibarr.&lt;br /&gt;
&lt;br /&gt;
===Installer Node.js===&lt;br /&gt;
&lt;br /&gt;
Une option simple pour configurer Node.js consiste à visiter [https://nodejs.org/en/download/](https://nodejs.org/en/download/) et à télécharger le programme d&#039;installation officiel de votre système d&#039;exploitation. . Si vous installez avec un gestionnaire de packages, c&#039;est encore plus simple.&lt;br /&gt;
&lt;br /&gt;
Après l&#039;installation, confirmez que Node.js est prêt à être utilisé :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
node --version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Installer la CLI Zapier===&lt;br /&gt;
&lt;br /&gt;
Ensuite, installons les outils CLI &#039;&#039;&#039;zapier&#039;&#039;&#039;. Cet utilitaire CLI vous permettra de créer votre application, de la déployer sur la plateforme Zapier, d&#039;effectuer des tests locaux, de gérer les utilisateurs et les testeurs, d&#039;afficher les journaux à distance, de collaborer avec votre équipe, et bien plus encore :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd dev/examples/zapier&lt;br /&gt;
npm install zapier-platform-cli&lt;br /&gt;
zapier --version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Exécuter la connexion Zapier===&lt;br /&gt;
&lt;br /&gt;
Configurons l&#039;authentification entre votre environnement de développement et la plateforme Zapier. Vous utiliserez l&#039;adresse e-mail et le mot de passe que vous utilisez pour vous connecter à l&#039;application Zapier.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
zapier login&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette commande créera un fichier &#039;&#039;&#039;.zapierrc&#039;&#039;&#039; dans votre répertoire personnel.&lt;br /&gt;
&lt;br /&gt;
===Installer le projet===&lt;br /&gt;
&lt;br /&gt;
Dans le répertoire d&#039;exemples Zapier, exécutez :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd dev/examples/zapier&lt;br /&gt;
npm install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Déploiement de votre application===&lt;br /&gt;
&lt;br /&gt;
Lorsque vous êtes prêt à essayer votre code sur la plateforme Zapier, utilisez la commande push. Vous seul pourrez voir l&#039;application jusqu&#039;à ce que vous invitiez des testeurs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
zapier register   (la première fois, choisir le nom par exemple &amp;quot;Mon Dolibarr&amp;quot;)&lt;br /&gt;
zapier push&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Après un push, l&#039;Application, portant le nom que vous avez défini lors de l&#039;étape d&#039;inscription, est disponible en &#039;&#039;&#039;Application Privée&#039;&#039;&#039; lors de la création d&#039;un Zap.&lt;br /&gt;
&lt;br /&gt;
Vous trouverez un tutoriel ici : [https://zapier.com/developer/start/introduction](https://zapier.com/developer/start/introduction)&lt;br /&gt;
&lt;br /&gt;
=Utilisation=&lt;br /&gt;
&lt;br /&gt;
===Création d&#039;une connexion pour l&#039;application===&lt;br /&gt;
&lt;br /&gt;
Activez l&#039;API REST dans Dolibarr. Ils sont utilisés par Zapier, à commencer par l&#039;API de connexion.&lt;br /&gt;
&lt;br /&gt;
Allez dans le tableau de bord Zapier et créez une connexion : Allez dans « Mes applications – Intégration personnalisée », puis « Ajouter une connexion ».&lt;br /&gt;
&lt;br /&gt;
Si l&#039;App n&#039;apparaît pas dans la liste pour ajouter une connexion, oubliez cette étape et pour créer directement un Zap, la création de connexion pourra être demandée ultérieurement).&lt;br /&gt;
Si la Connexion peut être créée, saisissez l&#039;URL de votre page de connexion Dolibarr.&lt;br /&gt;
&lt;br /&gt;
*L&#039;URL ne doit pas se terminer par /. Par exemple : https://mondomaine ou https://mondomaine/mydoli/htdocs&lt;br /&gt;
&lt;br /&gt;
Saisissez le login/pass d&#039;un compte existant.&lt;br /&gt;
&lt;br /&gt;
*Pour l&#039;authentification, vous devez saisir le login/pass d&#039;un compte existant qui sera utilisé par Zapier pour appeler les API. Donnez la permission à cet utilisateur selon l&#039;action que Zapier demandera à votre Dolibarr.&lt;br /&gt;
*Si vous rencontrez une erreur de certificat SSL lors de l&#039;accès à votre site Web en raison d&#039;un certificat signé automatiquement, vous pouvez désactiver la vérification du certificat SSL dans Paramètres Zapier - Paramètres avancés.&lt;br /&gt;
*Si votre instance Web est protégée par une protection HTTP Basic, vous devez conserver les URL publiques ouvertes pour les outils externes. Ceci est un exemple de directive à utiliser pour exclure certaines pages de la protection HTTP Basic&lt;br /&gt;
{{ExcludeDirForBasicHTTP}}&lt;br /&gt;
&lt;br /&gt;
==Créer un Zap==&lt;br /&gt;
&lt;br /&gt;
Créez un ZAP qui utilise l&#039;application que vous avez enregistrée depuis l&#039;interface Zapier https://www.zapier.com&lt;/div&gt;</summary>
		<author><name>Kusco</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Module_Zapier_FR&amp;diff=60368</id>
		<title>Module Zapier FR</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Module_Zapier_FR&amp;diff=60368"/>
		<updated>2024-05-15T10:15:17Z</updated>

		<summary type="html">&lt;p&gt;Kusco: /* Installation */&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 : Modul_Zapier --&amp;gt;&lt;br /&gt;
[[es:Módulo_Zapier]]&lt;br /&gt;
[[fr:Module_Zapier_FR]]&lt;br /&gt;
[[de:Modul_Zapier]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Zapier]]&lt;br /&gt;
[[Category:No Code Automation]]&lt;br /&gt;
{{TemplateDocUser}}&lt;br /&gt;
{{TemplateModFR}}&lt;br /&gt;
{{BasculeDevUser|&lt;br /&gt;
nom=Zapier|&lt;br /&gt;
num=50330|&lt;br /&gt;
devdoc=[[Module Zapier (developer)]]|&lt;br /&gt;
userdoc=This page|}}&lt;br /&gt;
&lt;br /&gt;
=Présentation=&lt;br /&gt;
Ce module sert à gérer les liens entre Dolibarr et Zapier.&lt;br /&gt;
&lt;br /&gt;
=Installation=&lt;br /&gt;
Ce module nécessite de mettre la variable MAIN_FEATURES_LEVEL à 2.&lt;br /&gt;
Pour l&#039;ajouter, aller dans Configuration --&amp;gt; Divers et mettez la valeur à 2.&lt;br /&gt;
&lt;br /&gt;
=Configuration=&lt;br /&gt;
{{ActivationModuleFr}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Créer un compte développeur Zapier==&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, vous devez avoir un compte développeur Zapier, créez-le ici : [https://developer.zapier.com Zapier Platform]&lt;br /&gt;
&lt;br /&gt;
==Créer et déployer « l&#039;application Zapier » sur la plateforme Zapier==&lt;br /&gt;
&lt;br /&gt;
L&#039;App Zapier est un petit package en javascript que vous devez déployer sur Zapier pour que Zapier puisse communiquer avec votre application Dolibarr.&lt;br /&gt;
&lt;br /&gt;
===Installer Node.js===&lt;br /&gt;
&lt;br /&gt;
Une option simple pour configurer Node.js consiste à visiter [https://nodejs.org/en/download/](https://nodejs.org/en/download/) et à télécharger le programme d&#039;installation officiel de votre système d&#039;exploitation. . Si vous installez avec un gestionnaire de packages, c&#039;est encore plus simple.&lt;br /&gt;
&lt;br /&gt;
Après l&#039;installation, confirmez que Node.js est prêt à être utilisé :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
node --version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Installer la CLI Zapier===&lt;br /&gt;
&lt;br /&gt;
Ensuite, installons les outils CLI &#039;&#039;&#039;zapier&#039;&#039;&#039;. Cet utilitaire CLI vous permettra de créer votre application, de la déployer sur la plateforme Zapier, d&#039;effectuer des tests locaux, de gérer les utilisateurs et les testeurs, d&#039;afficher les journaux à distance, de collaborer avec votre équipe, et bien plus encore :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd dev/examples/zapier&lt;br /&gt;
npm install zapier-platform-cli&lt;br /&gt;
zapier --version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Exécuter la connexion Zapier===&lt;br /&gt;
&lt;br /&gt;
Configurons l&#039;authentification entre votre environnement de développement et la plateforme Zapier. Vous utiliserez l&#039;adresse e-mail et le mot de passe que vous utilisez pour vous connecter à l&#039;application Zapier.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
zapier login&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette commande créera un fichier &#039;&#039;&#039;.zapierrc&#039;&#039;&#039; dans votre répertoire personnel.&lt;br /&gt;
&lt;br /&gt;
===Installer le projet===&lt;br /&gt;
&lt;br /&gt;
Dans le répertoire d&#039;exemples Zapier, exécutez :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd dev/examples/zapier&lt;br /&gt;
npm install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Déploiement de votre application===&lt;br /&gt;
&lt;br /&gt;
Lorsque vous êtes prêt à essayer votre code sur la plateforme Zapier, utilisez la commande push. Vous seul pourrez voir l&#039;application jusqu&#039;à ce que vous invitiez des testeurs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
zapier register   (la première fois, choisir le nom par exemple &amp;quot;Mon Dolibarr&amp;quot;)&lt;br /&gt;
zapier push&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Après un push, l&#039;Application, portant le nom que vous avez défini lors de l&#039;étape d&#039;inscription, est disponible en &#039;&#039;&#039;Application Privée&#039;&#039;&#039; lors de la création d&#039;un Zap.&lt;br /&gt;
&lt;br /&gt;
Vous trouverez un tutoriel ici : [https://zapier.com/developer/start/introduction](https://zapier.com/developer/start/introduction)&lt;br /&gt;
&lt;br /&gt;
=Utilisation=&lt;br /&gt;
&lt;br /&gt;
===Création d&#039;une connexion pour l&#039;application===&lt;br /&gt;
&lt;br /&gt;
Activez l&#039;API REST dans Dolibarr. Ils sont utilisés par Zapier, à commencer par l&#039;API de connexion.&lt;br /&gt;
&lt;br /&gt;
Allez dans le tableau de bord Zapier et créez une connexion : Allez dans « Mes applications – Intégration personnalisée », puis « Ajouter une connexion ».&lt;br /&gt;
&lt;br /&gt;
Si l&#039;App n&#039;apparaît pas dans la liste pour ajouter une connexion, oubliez cette étape et pour créer directement un Zap, la création de connexion pourra être demandée ultérieurement).&lt;br /&gt;
Si la Connexion peut être créée, saisissez l&#039;URL de votre page de connexion Dolibarr.&lt;br /&gt;
&lt;br /&gt;
*L&#039;URL ne doit pas se terminer par /. Par exemple : https://mondomaine ou https://mondomaine/mydoli/htdocs&lt;br /&gt;
&lt;br /&gt;
Saisissez le login/pass d&#039;un compte existant.&lt;br /&gt;
&lt;br /&gt;
*Pour l&#039;authentification, vous devez saisir le login/pass d&#039;un compte existant qui sera utilisé par Zapier pour appeler les API. Donnez la permission à cet utilisateur selon l&#039;action que Zapier demandera à votre Dolibarr.&lt;br /&gt;
*Si vous rencontrez une erreur de certificat SSL lors de l&#039;accès à votre site Web en raison d&#039;un certificat signé automatiquement, vous pouvez désactiver la vérification du certificat SSL dans Paramètres Zapier - Paramètres avancés.&lt;br /&gt;
*Si votre instance Web est protégée par une protection HTTP Basic, vous devez conserver les URL publiques ouvertes pour les outils externes. Ceci est un exemple de directive à utiliser pour exclure certaines pages de la protection HTTP Basic&lt;br /&gt;
{{ExcludeDirForBasicHTTP}}&lt;br /&gt;
&lt;br /&gt;
==Créer un Zap==&lt;br /&gt;
&lt;br /&gt;
Créez un ZAP qui utilise l&#039;application que vous avez enregistrée depuis l&#039;interface Zapier https://www.zapier.com&lt;/div&gt;</summary>
		<author><name>Kusco</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Module_Zapier_FR&amp;diff=60367</id>
		<title>Module Zapier FR</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Module_Zapier_FR&amp;diff=60367"/>
		<updated>2024-05-15T10:13:43Z</updated>

		<summary type="html">&lt;p&gt;Kusco: Modification langue&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 : Modul_Zapier --&amp;gt;&lt;br /&gt;
[[es:Módulo_Zapier]]&lt;br /&gt;
[[fr:Module_Zapier_FR]]&lt;br /&gt;
[[de:Modul_Zapier]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Zapier]]&lt;br /&gt;
[[Category:No Code Automation]]&lt;br /&gt;
{{TemplateDocUser}}&lt;br /&gt;
{{TemplateModFR}}&lt;br /&gt;
{{BasculeDevUser|&lt;br /&gt;
nom=Zapier|&lt;br /&gt;
num=50330|&lt;br /&gt;
devdoc=[[Module Zapier (developer)]]|&lt;br /&gt;
userdoc=This page|}}&lt;br /&gt;
&lt;br /&gt;
=Présentation=&lt;br /&gt;
Ce module sert à gérer les liens entre Dolibarr et Zapier.&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;
&lt;br /&gt;
==Créer un compte développeur Zapier==&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, vous devez avoir un compte développeur Zapier, créez-le ici : [https://developer.zapier.com Zapier Platform]&lt;br /&gt;
&lt;br /&gt;
==Créer et déployer « l&#039;application Zapier » sur la plateforme Zapier==&lt;br /&gt;
&lt;br /&gt;
L&#039;App Zapier est un petit package en javascript que vous devez déployer sur Zapier pour que Zapier puisse communiquer avec votre application Dolibarr.&lt;br /&gt;
&lt;br /&gt;
===Installer Node.js===&lt;br /&gt;
&lt;br /&gt;
Une option simple pour configurer Node.js consiste à visiter [https://nodejs.org/en/download/](https://nodejs.org/en/download/) et à télécharger le programme d&#039;installation officiel de votre système d&#039;exploitation. . Si vous installez avec un gestionnaire de packages, c&#039;est encore plus simple.&lt;br /&gt;
&lt;br /&gt;
Après l&#039;installation, confirmez que Node.js est prêt à être utilisé :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
node --version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Installer la CLI Zapier===&lt;br /&gt;
&lt;br /&gt;
Ensuite, installons les outils CLI &#039;&#039;&#039;zapier&#039;&#039;&#039;. Cet utilitaire CLI vous permettra de créer votre application, de la déployer sur la plateforme Zapier, d&#039;effectuer des tests locaux, de gérer les utilisateurs et les testeurs, d&#039;afficher les journaux à distance, de collaborer avec votre équipe, et bien plus encore :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd dev/examples/zapier&lt;br /&gt;
npm install zapier-platform-cli&lt;br /&gt;
zapier --version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Exécuter la connexion Zapier===&lt;br /&gt;
&lt;br /&gt;
Configurons l&#039;authentification entre votre environnement de développement et la plateforme Zapier. Vous utiliserez l&#039;adresse e-mail et le mot de passe que vous utilisez pour vous connecter à l&#039;application Zapier.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
zapier login&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette commande créera un fichier &#039;&#039;&#039;.zapierrc&#039;&#039;&#039; dans votre répertoire personnel.&lt;br /&gt;
&lt;br /&gt;
===Installer le projet===&lt;br /&gt;
&lt;br /&gt;
Dans le répertoire d&#039;exemples Zapier, exécutez :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd dev/examples/zapier&lt;br /&gt;
npm install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Déploiement de votre application===&lt;br /&gt;
&lt;br /&gt;
Lorsque vous êtes prêt à essayer votre code sur la plateforme Zapier, utilisez la commande push. Vous seul pourrez voir l&#039;application jusqu&#039;à ce que vous invitiez des testeurs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
zapier register   (la première fois, choisir le nom par exemple &amp;quot;Mon Dolibarr&amp;quot;)&lt;br /&gt;
zapier push&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Après un push, l&#039;Application, portant le nom que vous avez défini lors de l&#039;étape d&#039;inscription, est disponible en &#039;&#039;&#039;Application Privée&#039;&#039;&#039; lors de la création d&#039;un Zap.&lt;br /&gt;
&lt;br /&gt;
Vous trouverez un tutoriel ici : [https://zapier.com/developer/start/introduction](https://zapier.com/developer/start/introduction)&lt;br /&gt;
&lt;br /&gt;
=Utilisation=&lt;br /&gt;
&lt;br /&gt;
===Création d&#039;une connexion pour l&#039;application===&lt;br /&gt;
&lt;br /&gt;
Activez l&#039;API REST dans Dolibarr. Ils sont utilisés par Zapier, à commencer par l&#039;API de connexion.&lt;br /&gt;
&lt;br /&gt;
Allez dans le tableau de bord Zapier et créez une connexion : Allez dans « Mes applications – Intégration personnalisée », puis « Ajouter une connexion ».&lt;br /&gt;
&lt;br /&gt;
Si l&#039;App n&#039;apparaît pas dans la liste pour ajouter une connexion, oubliez cette étape et pour créer directement un Zap, la création de connexion pourra être demandée ultérieurement).&lt;br /&gt;
Si la Connexion peut être créée, saisissez l&#039;URL de votre page de connexion Dolibarr.&lt;br /&gt;
&lt;br /&gt;
*L&#039;URL ne doit pas se terminer par /. Par exemple : https://mondomaine ou https://mondomaine/mydoli/htdocs&lt;br /&gt;
&lt;br /&gt;
Saisissez le login/pass d&#039;un compte existant.&lt;br /&gt;
&lt;br /&gt;
*Pour l&#039;authentification, vous devez saisir le login/pass d&#039;un compte existant qui sera utilisé par Zapier pour appeler les API. Donnez la permission à cet utilisateur selon l&#039;action que Zapier demandera à votre Dolibarr.&lt;br /&gt;
*Si vous rencontrez une erreur de certificat SSL lors de l&#039;accès à votre site Web en raison d&#039;un certificat signé automatiquement, vous pouvez désactiver la vérification du certificat SSL dans Paramètres Zapier - Paramètres avancés.&lt;br /&gt;
*Si votre instance Web est protégée par une protection HTTP Basic, vous devez conserver les URL publiques ouvertes pour les outils externes. Ceci est un exemple de directive à utiliser pour exclure certaines pages de la protection HTTP Basic&lt;br /&gt;
{{ExcludeDirForBasicHTTP}}&lt;br /&gt;
&lt;br /&gt;
==Créer un Zap==&lt;br /&gt;
&lt;br /&gt;
Créez un ZAP qui utilise l&#039;application que vous avez enregistrée depuis l&#039;interface Zapier https://www.zapier.com&lt;/div&gt;</summary>
		<author><name>Kusco</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Module_Zapier_FR&amp;diff=60366</id>
		<title>Module Zapier FR</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Module_Zapier_FR&amp;diff=60366"/>
		<updated>2024-05-15T10:10:38Z</updated>

		<summary type="html">&lt;p&gt;Kusco: Traduction de la page anglaise&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TemplateDocUser}}&lt;br /&gt;
{{TemplateModFR}}&lt;br /&gt;
{{BasculeDevUser|&lt;br /&gt;
nom=Zapier|&lt;br /&gt;
num=50330|&lt;br /&gt;
devdoc=[[Module Zapier (developer)]]|&lt;br /&gt;
userdoc=This page|}}&lt;br /&gt;
&lt;br /&gt;
=Présentation=&lt;br /&gt;
Ce module sert à gérer les liens entre Dolibarr et Zapier.&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;
&lt;br /&gt;
==Créer un compte développeur Zapier==&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, vous devez avoir un compte développeur Zapier, créez-le ici : [https://developer.zapier.com Zapier Platform]&lt;br /&gt;
&lt;br /&gt;
==Créer et déployer « l&#039;application Zapier » sur la plateforme Zapier==&lt;br /&gt;
&lt;br /&gt;
L&#039;App Zapier est un petit package en javascript que vous devez déployer sur Zapier pour que Zapier puisse communiquer avec votre application Dolibarr.&lt;br /&gt;
&lt;br /&gt;
===Installer Node.js===&lt;br /&gt;
&lt;br /&gt;
Une option simple pour configurer Node.js consiste à visiter [https://nodejs.org/en/download/](https://nodejs.org/en/download/) et à télécharger le programme d&#039;installation officiel de votre système d&#039;exploitation. . Si vous installez avec un gestionnaire de packages, c&#039;est encore plus simple.&lt;br /&gt;
&lt;br /&gt;
Après l&#039;installation, confirmez que Node.js est prêt à être utilisé :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
node --version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Installer la CLI Zapier===&lt;br /&gt;
&lt;br /&gt;
Ensuite, installons les outils CLI &#039;&#039;&#039;zapier&#039;&#039;&#039;. Cet utilitaire CLI vous permettra de créer votre application, de la déployer sur la plateforme Zapier, d&#039;effectuer des tests locaux, de gérer les utilisateurs et les testeurs, d&#039;afficher les journaux à distance, de collaborer avec votre équipe, et bien plus encore :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd dev/examples/zapier&lt;br /&gt;
npm install zapier-platform-cli&lt;br /&gt;
zapier --version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Exécuter la connexion Zapier===&lt;br /&gt;
&lt;br /&gt;
Configurons l&#039;authentification entre votre environnement de développement et la plateforme Zapier. Vous utiliserez l&#039;adresse e-mail et le mot de passe que vous utilisez pour vous connecter à l&#039;application Zapier.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
zapier login&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette commande créera un fichier &#039;&#039;&#039;.zapierrc&#039;&#039;&#039; dans votre répertoire personnel.&lt;br /&gt;
&lt;br /&gt;
===Installer le projet===&lt;br /&gt;
&lt;br /&gt;
Dans le répertoire d&#039;exemples Zapier, exécutez :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd dev/examples/zapier&lt;br /&gt;
npm install&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Déploiement de votre application===&lt;br /&gt;
&lt;br /&gt;
Lorsque vous êtes prêt à essayer votre code sur la plateforme Zapier, utilisez la commande push. Vous seul pourrez voir l&#039;application jusqu&#039;à ce que vous invitiez des testeurs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
zapier register   (la première fois, choisir le nom par exemple &amp;quot;Mon Dolibarr&amp;quot;)&lt;br /&gt;
zapier push&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Après un push, l&#039;Application, portant le nom que vous avez défini lors de l&#039;étape d&#039;inscription, est disponible en &#039;&#039;&#039;Application Privée&#039;&#039;&#039; lors de la création d&#039;un Zap.&lt;br /&gt;
&lt;br /&gt;
Vous trouverez un tutoriel ici : [https://zapier.com/developer/start/introduction](https://zapier.com/developer/start/introduction)&lt;br /&gt;
&lt;br /&gt;
=Utilisation=&lt;br /&gt;
&lt;br /&gt;
===Création d&#039;une connexion pour l&#039;application===&lt;br /&gt;
&lt;br /&gt;
Activez l&#039;API REST dans Dolibarr. Ils sont utilisés par Zapier, à commencer par l&#039;API de connexion.&lt;br /&gt;
&lt;br /&gt;
Allez dans le tableau de bord Zapier et créez une connexion : Allez dans « Mes applications – Intégration personnalisée », puis « Ajouter une connexion ».&lt;br /&gt;
&lt;br /&gt;
Si l&#039;App n&#039;apparaît pas dans la liste pour ajouter une connexion, oubliez cette étape et pour créer directement un Zap, la création de connexion pourra être demandée ultérieurement).&lt;br /&gt;
Si la Connexion peut être créée, saisissez l&#039;URL de votre page de connexion Dolibarr.&lt;br /&gt;
&lt;br /&gt;
*L&#039;URL ne doit pas se terminer par /. Par exemple : https://mondomaine ou https://mondomaine/mydoli/htdocs&lt;br /&gt;
&lt;br /&gt;
Saisissez le login/pass d&#039;un compte existant.&lt;br /&gt;
&lt;br /&gt;
*Pour l&#039;authentification, vous devez saisir le login/pass d&#039;un compte existant qui sera utilisé par Zapier pour appeler les API. Donnez la permission à cet utilisateur selon l&#039;action que Zapier demandera à votre Dolibarr.&lt;br /&gt;
*Si vous rencontrez une erreur de certificat SSL lors de l&#039;accès à votre site Web en raison d&#039;un certificat signé automatiquement, vous pouvez désactiver la vérification du certificat SSL dans Paramètres Zapier - Paramètres avancés.&lt;br /&gt;
*Si votre instance Web est protégée par une protection HTTP Basic, vous devez conserver les URL publiques ouvertes pour les outils externes. Ceci est un exemple de directive à utiliser pour exclure certaines pages de la protection HTTP Basic&lt;br /&gt;
{{ExcludeDirForBasicHTTP}}&lt;br /&gt;
&lt;br /&gt;
==Créer un Zap==&lt;br /&gt;
&lt;br /&gt;
Créez un ZAP qui utilise l&#039;application que vous avez enregistrée depuis l&#039;interface Zapier https://www.zapier.com&lt;/div&gt;</summary>
		<author><name>Kusco</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=D%C3%A9veloppement_module&amp;diff=59567</id>
		<title>Développement module</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=D%C3%A9veloppement_module&amp;diff=59567"/>
		<updated>2024-02-28T15:37:03Z</updated>

		<summary type="html">&lt;p&gt;Kusco: /* Définissez vos box */ Mini corrections&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_development --&amp;gt;&lt;br /&gt;
[[en:Module_development]]&lt;br /&gt;
[[es:Desarrollo_de_un_módulo]]&lt;br /&gt;
[[de:Modul_Entwicklung]]&lt;br /&gt;
[[zh:模块开发]]&lt;br /&gt;
[[ja:モジュール_開発]]&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;
Pour créer un nouveau module, il existe plusieurs étapes. Ce didacticiel a pour but de vous décrire chacune d&#039;elles afin d&#039;ajouter un module permettant d&#039;étendre les possibilités de Dolibarr, comme par exemple ajouter une ou plusieurs des fonctionnalités suivantes:&lt;br /&gt;
&lt;br /&gt;
*Ajouter de nouvelles tables en base.&lt;br /&gt;
*Ajouter vos propres entrées dans les menus.&lt;br /&gt;
*Ajouter des objets et des écrans de saisie/consultation de nouvelle tables.&lt;br /&gt;
*Ajouter ou supprimer des onglets sur les pages de vues/édition des objets (facture, produit, commande, événement, ...)&lt;br /&gt;
*Ajouter des exports prédéfinis pour la fonction export.&lt;br /&gt;
*Ajouter de nouvelles boites/widgets pour la home page.&lt;br /&gt;
*Ajouter des variables de substitution.&lt;br /&gt;
*Définir de nouvelles permissions.&lt;br /&gt;
*Déclencher du code automatiquement sur une action Dolibarr particulière.&lt;br /&gt;
*Insérer votre code aux emplacements hooks de Dolibarr&lt;br /&gt;
*Ajouter un modèle de numérotation de la référence des objets créés.&lt;br /&gt;
*Ajouter un modèle de document PDF.&lt;br /&gt;
*Ajouter un nouveau thème.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les chapitres suivants vous présentent comment réaliser tout cela en manuel de manière simple.&lt;br /&gt;
&lt;br /&gt;
=[[File:Art.png]] Création de Module avec le générateur de module=&lt;br /&gt;
Depuis Dolibarr 9.0 il est possible de créer les fichiers principaux de votre module avec le &amp;quot;Générateur de module&amp;quot; (aussi appelé &amp;quot;Module Builder&amp;quot;). Pour l&#039;activer :&lt;br /&gt;
&lt;br /&gt;
*Activez le module &amp;quot;Générateur de Module&amp;quot; (ou &amp;quot;Module builder&amp;quot;) dans la section &amp;quot;Outils multi-modules&amp;quot; de Configuration &amp;gt; Modules/Applications&lt;br /&gt;
&lt;br /&gt;
[[File:Mod_builder_2.png|400px]]&lt;br /&gt;
&lt;br /&gt;
*Puis cliquez sur l’icône &amp;quot;bug&amp;quot; qui est apparue dans la barre de menu en haut à droite&lt;br /&gt;
&lt;br /&gt;
[[File:Mod_builder_3.png|400px]]&lt;br /&gt;
&lt;br /&gt;
=[[File:Art.png]] Exemple de modèle de module externe=&lt;br /&gt;
Un bon modèle/squelette de module externe Dolibarr est disponible ici : [https://github.com/Dolibarr/dolibarr/tree/develop/htdocs/modulebuilder/template GitHub Dolibarr Module Modèle]&lt;br /&gt;
&lt;br /&gt;
=[[File:Art.png]] Créer un module=&lt;br /&gt;
Les sous chapitres suivant décrivent les actions à faire pour créer un module Dolibarr. Les premiers chapitres sont obligatoires quelle que soit la vocation du module, les suivants dépendront de ce que doit faire le module.&lt;br /&gt;
&lt;br /&gt;
==Créer un descripteur de Module (obligatoire)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : Obligatoire dès qu&#039;une extension est développée, quelle que soit sa vocation.&lt;br /&gt;
&#039;&#039;&#039;Depuis Dolibarr 9.0, il est possible de créer le descripteur de votre module avec le &amp;quot;Générateur de module&amp;quot;&#039;&#039;&#039;. Cet outil est encore encours de développement et de maturité mais peut d&#039;ores et déjà être utilisé.&lt;br /&gt;
&lt;br /&gt;
===Créer votre descripteur avec le générateur de module===&lt;br /&gt;
&lt;br /&gt;
*Lancez le générateur de module en cliquant sur l’icône &amp;quot;bug&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[File:Mod_builder_3.png|400px]]&lt;br /&gt;
&lt;br /&gt;
*Entrez le nom de votre module sans espaces (le nom de votre module NE DOIT PAS CONTENIR le caractère underscore ou tiret bas : _) et cliquez sur Créer.&lt;br /&gt;
&lt;br /&gt;
[[File:Mod_builder_4.png|400px]]&lt;br /&gt;
&lt;br /&gt;
*Un module avec ses premiers fichiers a été initialisé. Vous pouvez alors modifier les paramètres du descripteur du module :&lt;br /&gt;
&lt;br /&gt;
[[File:Mod_builder_5.png|400px]]&lt;br /&gt;
&lt;br /&gt;
===Alternative : créer votre descripteur manuellement (sans utiliser le générateur de module)===&lt;br /&gt;
La première étape est donc de créer un fichier de description du module (descripteur). Pour cela:&lt;br /&gt;
&lt;br /&gt;
*Créez le répertoire &#039;&#039;&#039;/htdocs/&#039;&#039;monmodule&#039;&#039;/core/modules&#039;&#039;&#039;. Puis, allez dans le répertoire &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039; et recopiez le fichier modMyModule.class.php dans ce répertoire &#039;&#039;&#039;htdocs/&#039;&#039;monmodule&#039;&#039;/core/modules&#039;&#039;&#039;.&lt;br /&gt;
*Renommez le fichier mod&#039;&#039;&#039;MyModule&#039;&#039;&#039;.class.php en modifiant seulement la partie &#039;&#039;&#039;MyModule&#039;&#039;&#039; (le fichier doit commencer par mod)&lt;br /&gt;
&lt;br /&gt;
Ensuite, modifiez le contenu de ce fichier afin de remplacer :&lt;br /&gt;
&lt;br /&gt;
*les &#039;&#039;modMyModule&#039;&#039; en une valeur qui corresponde à la vocation de votre module. Cette valeur doit toujours commencer par &#039;&amp;lt;nowiki/&amp;gt;&#039;&#039;&#039;mod&#039;&#039;&#039;&#039; et ne contenir que des &#039;&#039;&#039;caractères alphabétiques&#039;&#039;&#039;.&lt;br /&gt;
*$this-&amp;gt;numero = &#039;&#039;100000&#039;&#039; par un numéro de module libre. Pour éviter tout conflit, vous pouvez consulter la page suivante pour retrouver les numéros déjà alloués : [[List of modules id|Liste des id de modules]].&lt;br /&gt;
*Modifier éventuellement les autres variables définies dans le constructeurs (Voir le commentaire dans le code du squelette pour leur signification).&lt;br /&gt;
&lt;br /&gt;
Le descripteur de votre module est alors en place.&lt;br /&gt;
&lt;br /&gt;
===Tester votre descripteur===&lt;br /&gt;
&lt;br /&gt;
Lancez Dolibarr et allez sur la page &#039;&#039;&#039;Configuration-&amp;gt;module&#039;&#039;&#039;, vous devez voir apparaître une nouvelle ligne avec votre nouveau module et la possibilité de l&#039;activer ou non (parcourez tous les onglets de chaque catégories de modules jusqu&#039;à le retrouver).&lt;br /&gt;
C&#039;est la valeur de $this-&amp;gt;special qui détermine dans quel onglet se trouve votre module.&lt;br /&gt;
&lt;br /&gt;
===Nom de module===&lt;br /&gt;
&lt;br /&gt;
Le nom de votre module NE DOIT PAS CONTENIR le caractère underscore ou tiret bas : _&lt;br /&gt;
&lt;br /&gt;
==Arborescence d&#039;un nouveau module==&lt;br /&gt;
Voici l&#039;arborescence à respecter pour l&#039;organisation des fichiers d&#039;un module (cette arborescence sera celle prise d&#039;office si vous générer les fichiers à l&#039;aide de ModuleBuilder).&lt;br /&gt;
&lt;br /&gt;
{{TemplateModuleTreeSimple}}&lt;br /&gt;
&lt;br /&gt;
Un bon modèle/squelette de module externe Dolibarr est disponible ici : [https://github.com/Dolibarr/dolibarr/tree/develop/htdocs/modulebuilder/template GitHub Dolibarr Module Modèle]&lt;br /&gt;
&lt;br /&gt;
==Créer vos tables SQL et les classes PHP DAO (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : Si votre module a besoin de gérer des données qui lui sont propres&lt;br /&gt;
&lt;br /&gt;
===Créer vos fichiers .sql===&lt;br /&gt;
Si votre module a vocation à gérer des données bien à lui, qui n&#039;existent pas en base dans la version standard de Dolibarr, il est nécessaire de définir des tables SQL pour stocker ces données.&lt;br /&gt;
&lt;br /&gt;
Créer un sous-répertoire &#039;&#039;&#039;sql&#039;&#039;&#039; dans le répertoire de votre module (&#039;&#039;&#039;monmodule/sql&#039;&#039;&#039;) afin d&#039;y placer les scripts sql que vous allez créer (Avec ModuleBuilder cette étape sera réalisée automatiquement suite à la création d&#039;un nouvel Objet depuis l&#039;onglet Objet).&lt;br /&gt;
&lt;br /&gt;
Ensuite, vérifiez dans votre fichier descripteur de module, dans la fonction &#039;&#039;&#039;init&#039;&#039;&#039; que la ligne&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;$this-&amp;gt;_load_tables(&#039;/mymodule/sql/&#039;);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
n&#039;est pas commentée.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Règles à respecter:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Ajoutez les fichiers d&#039;ordre de création de vos tables sur le principe de 1 fichier par table, nommé &#039;&#039;&#039;llx_matable.sql&#039;&#039;&#039; (pour la table), accompagné éventuellement du fichier &#039;&#039;&#039;llx_matable.key.sql&#039;&#039;&#039; (pour les index ou clé étrangères). Voir les exemples dans les fichiers existants dans &#039;&#039;&#039;install/mysql/tables&#039;&#039;&#039; pour exemple.&lt;br /&gt;
*Les types et noms recommandés pour les champs SQL sont définis sur la page [[https://wiki.dolibarr.org/index.php/Langages_et_normes#R.C3.A8gles_de_codage_SQL]].&lt;br /&gt;
*Pour ce qui est des commandes permettant d&#039;ajouter/manipuler des données, elles doivent toutes se trouver dans un fichier nommé &#039;&#039;&#039;data.sql&#039;&#039;&#039; situé dans le même répertoire &#039;&#039;&#039;/monmodule/sql/&#039;&#039;&#039;.&lt;br /&gt;
*N&#039;utilisez pas &amp;quot;chaine&amp;quot; mais &#039;chaine&#039; car les guillemets doubles (&amp;quot;) ont une signification particulière en PostGreSQL&lt;br /&gt;
&lt;br /&gt;
Exemple de contenu de fichier data.sql&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
 delete from llx_const where name=&#039;MONMODULE_IT_WORKS&#039; and entity=&#039;__ENTITY__&#039;;&lt;br /&gt;
 insert into llx_const (name, value, type, note, visible, entity) values (&#039;MONMODULE_IT_WORKS&#039;,&#039;1&#039;,&#039;chaine&#039;,&#039;A constant for my module&#039;,1,&#039;__ENTITY__&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les ordres SQL des fichiers doivent être opérationnels pour la base de données &#039;&#039;&#039;mysql&#039;&#039;&#039;.&lt;br /&gt;
Rem: Les fichiers des autres types de bases ne sont pas à maintenir. Ils sont lus et convertis à la volée par le driver de la base de données.&lt;br /&gt;
&lt;br /&gt;
===Tester vos fichiers .sql===&lt;br /&gt;
&lt;br /&gt;
Une fois les fichiers prêts, vous pouvez retourner dans l&#039;écran de gestion des modules de Dolibarr puis désactiver le module, dropper les tables en base (si elles existent déjà) et réactiver le module.&lt;br /&gt;
Les tables doivent alors être recréées par l&#039;activation du module.&lt;br /&gt;
Si tel n&#039;est pas le cas, vérifiez vos scripts en les passant à la main, ou consultez les logs Dolibarr.&lt;br /&gt;
&lt;br /&gt;
===Générer la classe PHP DAO d&#039;accès aux tables===&lt;br /&gt;
&lt;br /&gt;
Le fichier de classe DAO PHP d&#039;un object est généré automatiquement avec ModuleBuilder lors de la création d&#039;un Object.&lt;br /&gt;
&lt;br /&gt;
À défaut d&#039;utiliser le générateur de module, vous trouverez des exemples dans le squelette de module, fichier &#039;&#039;&#039;htdocs/modulebuilder/templates/class/myobject.class.php&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Dans cette classe, se trouvent des méthodes CRUD (Create/Read/Update/Delete) déjà opérationnelles pour faire un insert, un fetch (select), un update, un delete d&#039;une ligne de la table. Éditer le fichier pour utiliser le bon nom de module, de tables et placer ce fichier dans le sous-répertoire de &#039;&#039;&#039;class&#039;&#039;&#039; du module. Le Module Builder permet de faire cela en quelques clics de souris.&lt;br /&gt;
&lt;br /&gt;
==Affichage des onglets (optionnel)==&lt;br /&gt;
&lt;br /&gt;
===Ajouter ou supprimer des onglets sur les fiches objets===&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : Pour ajouter votre propre onglet parmi les onglets d&#039;un object standard (facture, commande, proposition commercial, adhérent...)&lt;br /&gt;
&lt;br /&gt;
Pour cela, allez dans le fichier descripteur de module précédemment créé et modifiez le tableau $this-&amp;gt;tabs:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	// Array to add new pages in new tabs or remove existing one&lt;br /&gt;
	$this-&amp;gt;tabs = array(&#039;objecttype:+tabname1:Title1:mylangfile@monmodule:$user-&amp;gt;rights-&amp;gt;monmodule-&amp;gt;read:/monmodule/mapagetab1.php?id=__ID__&#039;    // To add a new tab identified by code tabname1&lt;br /&gt;
                            &#039;objecttype:+tabname2:Title2:mylangfile@monmodule:$user-&amp;gt;rights-&amp;gt;monmodule-&amp;gt;read:/monmodule/mapagetab2.php?id=__ID__&#039;,   // To add a new tab identified by code tabname2&lt;br /&gt;
                            &#039;objecttype:-tabname&#039;);                                                     // To remove an existing tab identified by code tabname&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le tableau doit contenir une liste de chaîne, chaque chaîne représentant un nouvel onglet.&lt;br /&gt;
Le format de la chaîne étant composé de 6 parties séparées par &amp;quot;:&amp;quot;&lt;br /&gt;
&lt;br /&gt;
*Partie 1 : le type d&#039;élément (objecttype) dans lequel doit apparaître l&#039;onglet qui est une valeur parmi celle-ci:&lt;br /&gt;
{{TemplateModuleTabs-fr}}&lt;br /&gt;
&lt;br /&gt;
*Partie 2 : nom de code pour l&#039;onglet à ajouter (commence par +) ou à enlever (commence par -)&lt;br /&gt;
*Partie 3 : le titre de l&#039;onglet. Cela peut être un libellé en dur ou mieux un code traduction présent dans un fichier lang.&lt;br /&gt;
*Partie 4 : le nom du fichier .lang (sans l&#039;extension .lang) qui contient la correspondance entre le code traduction et le libellé à afficher. Si ce com est suivi de @monmodule, Dolibarr cherche le fichier dans le répertoire lang propre au module, c&#039;est à dire htdocs/monmodule/langs/code_CODE/monmodule.lang, sinon Dolibarr cherche le fichier traduction dans htdocs/langs/code_CODE/mylangfile.lang&lt;br /&gt;
*Partie 5 : une condition à tester pour savoir si l&#039;onglet doit être visible ou pas. Mettre &#039;1&#039; pour qu&#039;il soit toujours visible.&lt;br /&gt;
*Partie 6 : l&#039;url de la page à afficher quand on clique sur l&#039;onglet. La chaine __ID__ sera remplacée automatiquement par l&#039;Id de l&#039;entité concernée.&lt;br /&gt;
&lt;br /&gt;
Pour que la déclaration soit effective, il faut désactiver et réactiver le module.&lt;br /&gt;
&lt;br /&gt;
Pour alimenter le contenu de l&#039;onglet avec des données issues de la base, voir le chapitre suivant.&lt;br /&gt;
&lt;br /&gt;
===Ajouter les onglets standard d&#039;un objet sur sa propre page d&#039;onglet===&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : Pour afficher les onglets existant d&#039;un objet standard (produit, tiers, etc.) sur votre nouvelle page onglet.&lt;br /&gt;
&lt;br /&gt;
Il faut appliquer la procédure suivante :&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Inclure les fichiers définissant les fonctions utiles dans vos fichiers&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Pour chaque fiche entité, il y a deux fichiers à inclure avec l&#039;instruction&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;require_once($url_fichier) ;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici quelques exemples de fichiers à inclure (DOL_DOCUMENT_ROOT correspond au dossier dolibarr/htdocs/) :&lt;br /&gt;
&lt;br /&gt;
*Entité tiers (thirdparty) :&lt;br /&gt;
**DOL_DOCUMENT_ROOT/societe/class/societe.class.php&lt;br /&gt;
**DOL_DOCUMENT_ROOT/core/lib/company.lib.php&lt;br /&gt;
*Entité produit (product) :&lt;br /&gt;
**DOL_DOCUMENT_ROOT/product/class/product.class.php&lt;br /&gt;
**DOL_DOCUMENT_ROOT/core/lib/product.lib.php&lt;br /&gt;
*Entité facture (invoice) :&lt;br /&gt;
**DOL_DOCUMENT_ROOT/compta/facture/facture.class.php&lt;br /&gt;
**DOL_DOCUMENT_ROOT/core/lib/invoice.lib.php&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Créer et charger l&#039;objet à afficher dans votre onglet&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Créez l&#039;objet de la classe voulue, et récupérez les données de l&#039;objet à partir de la base de données. Pour cela il faut utiliser les fonctions fetch() de la classe correspondante, en passant en paramètre l&#039;identifiant de l&#039;objet que vous récupérez depuis l&#039;url (ex : /mononglet.php?id=1).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Exemple :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$id=GETPOST(&#039;id&#039;,&#039;int&#039;);&lt;br /&gt;
$ref=GETPOST(&#039;ref&#039;,&#039;alpha&#039;);&lt;br /&gt;
$product = new Product($db) ;&lt;br /&gt;
$result = $product-&amp;gt;fetch($id, $ref) ; //Tester $result pour vérifier que l&#039;accès à la base s&#039;est bien passée&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3. Récupérer la liste des onglets correspondant à l&#039;entité choisie&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Utilisez la fonction XXX_prepare_head($obj), ou XXX est le nom de l&#039;entité, permettant de créer un tableau contenant les définitions des onglets à afficher. Le paramètre à passer est l&#039;objet pour lequel vous voulez afficher les onglets.&lt;br /&gt;
&lt;br /&gt;
Le tableau retourné est composé de la façon suivante :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$head        // Tableau des onglets&lt;br /&gt;
$head[$h]    // Élément décrivant un onglet. Il y aura autant de $h que d&#039;onglets à afficher&lt;br /&gt;
$head[$h][0] // Url de la page affichée quand on clique sur l&#039;onglet&lt;br /&gt;
$head[$h][1] // Titre de l’onglet&lt;br /&gt;
$head[$h][2] // Code de l&#039;onglet, à utiliser pour choisir quel onglet sera &#039;actif&#039; (voir paragraphe suivant)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Exemple :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$head = product_prepare_head($product, $user) ; //le paramètre $user n&#039;est pas présent sur certaines fonctions&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4. Afficher les onglets sur votre page onglet&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Utilisez la fonction dol_fiche_head() qui affiche les onglets contenus dans le tableau $head retourné par XX_prepare_head().&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
dol_fiche_head($links, $active=&#039;0&#039;, $title=&#039;&#039;, $notab=0, $picto=&#039;&#039;)&lt;br /&gt;
//$links  // Tableau des onglets, appelé $head plus haut.&lt;br /&gt;
//$active // Onglet actif (mettre le nom de l&#039;onglet défini dans votre fichier de module, ou un nom contenu dans $head[$h][2]). Cet onglet sera mis en surbrillance&lt;br /&gt;
//$title  // ?&lt;br /&gt;
//$notab  // Mettre ce paramètre à 1 permet de ne pas afficher de zone bleue en dessous des onglets.&lt;br /&gt;
//$picto  // Nom de l&#039;image à utiliser au début de la barre des onglet. Les choix suivant sont possibles :&lt;br /&gt;
//            product&lt;br /&gt;
//            service&lt;br /&gt;
//            company&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette fonction affiche les onglets voulus et ouvre un élément &#039;&#039;&amp;lt; div class=&amp;quot;&amp;quot; &amp;gt;&#039;&#039; qui correspond à la zone bleue sous les onglets (si paramètre $notab = 0). Pour fermer la zone bleue, il suffit de fermer l&#039;élément &#039;&#039;&amp;lt; /div &amp;gt;&#039;&#039; dans le code PHP.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Remarque&#039;&#039; :&lt;br /&gt;
Pour plus de détail, se référer à la [http://www.dolibarr.fr/doxygen/ documentation Doxygen] ou directement au code de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
==Créer vos pages écran PHP (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : Si l&#039;objet de votre module est d&#039;ajouter des fonctionnalités qui nécessitent de nouveaux écrans.&lt;br /&gt;
&lt;br /&gt;
===Créer une page écran PHP brute===&lt;br /&gt;
Vous pouvez ensuite créer vos pages PHP, qui se basent sur les données de vos tables, en utilisant les squelettes fournis comme exemple dans le répertoire &#039;&#039;&#039;modulebuilder&#039;&#039;&#039; (Pour le développement d&#039;un script en ligne de commande, voir [[Développement de scripts]]). La encore, si vous avez utilisez ModuleBuilder, des cas de pages (liste, page de création, onglet notes, etc...) auront été créés automatiquement lors de l&#039;initialisation de l&#039;objet.&lt;br /&gt;
&lt;br /&gt;
Pour créer une nouvelle page écran utilisateur, créez un sous-répertoire de &#039;&#039;&#039;htdocs&#039;&#039;&#039; (si non déjà fait) propre à votre module (Dans &#039;&#039;&#039;htdocs/monmodule&#039;&#039;&#039; par exemple) afin d&#039;y placer les pages que vous allez créer.&lt;br /&gt;
&lt;br /&gt;
Y recopier le fichier &#039;&#039;&#039;myobject_page.php&#039;&#039;&#039; qui va servir de point de départ.&lt;br /&gt;
Modifiez le fichier afin que le main.inc.php soit trouvé&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Load Dolibarr environment&lt;br /&gt;
$res=0;&lt;br /&gt;
// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined)&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; ! empty($_SERVER[&amp;quot;CONTEXT_DOCUMENT_ROOT&amp;quot;])) $res=@include($_SERVER[&amp;quot;CONTEXT_DOCUMENT_ROOT&amp;quot;].&amp;quot;/main.inc.php&amp;quot;);&lt;br /&gt;
// Try main.inc.php into web root detected using web root calculated from SCRIPT_FILENAME&lt;br /&gt;
$tmp=empty($_SERVER[&#039;SCRIPT_FILENAME&#039;])?&#039;&#039;:$_SERVER[&#039;SCRIPT_FILENAME&#039;];$tmp2=realpath(__FILE__); $i=strlen($tmp)-1; $j=strlen($tmp2)-1;&lt;br /&gt;
while($i &amp;gt; 0 &amp;amp;&amp;amp; $j &amp;gt; 0 &amp;amp;&amp;amp; isset($tmp[$i]) &amp;amp;&amp;amp; isset($tmp2[$j]) &amp;amp;&amp;amp; $tmp[$i]==$tmp2[$j]) { $i--; $j--; }&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; $i &amp;gt; 0 &amp;amp;&amp;amp; file_exists(substr($tmp, 0, ($i+1)).&amp;quot;/main.inc.php&amp;quot;)) $res=@include(substr($tmp, 0, ($i+1)).&amp;quot;/main.inc.php&amp;quot;);&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; $i &amp;gt; 0 &amp;amp;&amp;amp; file_exists(dirname(substr($tmp, 0, ($i+1))).&amp;quot;/main.inc.php&amp;quot;)) $res=@include(dirname(substr($tmp, 0, ($i+1))).&amp;quot;/main.inc.php&amp;quot;);&lt;br /&gt;
// Try main.inc.php using relative path&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; file_exists(&amp;quot;../main.inc.php&amp;quot;)) $res=@include(&amp;quot;../main.inc.php&amp;quot;);&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; file_exists(&amp;quot;../../main.inc.php&amp;quot;)) $res=@include(&amp;quot;../../main.inc.php&amp;quot;);&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; file_exists(&amp;quot;../../../main.inc.php&amp;quot;)) $res=@include(&amp;quot;../../../main.inc.php&amp;quot;);&lt;br /&gt;
if (! $res) die(&amp;quot;Include of main fails&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Comme vous pouvez le constater, plusieurs tentatives de chargement du fichier main.inc.php (ou master.inc.php) ont été tentées. Le but est de réussir dans le plus grand nombre de cas possibles. Le minimum est de 2 lignes: une pour essayer de charger le fichier master / main.inc.php dans le répertoire racine de dolibarr et une autre pour essayer de charger le fichier afin de prendre en charge le cas où le module est déployé dans le répertoire &amp;quot;custom&amp;quot;. Mais vous pouvez avoir à gérer plus de situations. L&#039;exemple fourni devrait pouvoir charger le fichier main / master.inc.php dans presque toutes les situations / configurations.&lt;br /&gt;
&lt;br /&gt;
Notez que vous pouvez ajouter plus &amp;quot;../&amp;quot; en fonction de la profondeur du fichier par rapport à l&#039;arborescence de votre module.&lt;br /&gt;
&lt;br /&gt;
C&#039;est dans le main qu&#039;est chargé l&#039;environnement technique ainsi que les habilitations. Les variables objets suivantes sont alors positionnées:&lt;br /&gt;
&lt;br /&gt;
*$user    L&#039;objet qui contient les caractéristiques de l&#039;utilisateur + ses droits.&lt;br /&gt;
*$conf    L&#039;objet qui contient la configuration de Dolibarr.&lt;br /&gt;
*$db      L&#039;objet qui contient le handler de connexion à la base de données.&lt;br /&gt;
*$langs   L&#039;objet qui contient la langue de l&#039;utilisateur.&lt;br /&gt;
&lt;br /&gt;
*L&#039;inclusion d&#039;une classe ou librairie dédiée au module, sans savoir d&#039;où le fichier sera appelé, se fait en utilisant une fonction de Dolibarr (et non en utilisant directement le include_once)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Exemple :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
dol_include_once(&#039;/monmodule/class/maclasse.class.php&#039;, &#039;MaClasse&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*L&#039;appel des classes fournies en standard avec Dolibarr se fera par contre par le require_once directe avec la syntaxe suivante:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Exemple :&#039;&#039;&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/doli.class.php&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La raison est que si le dol_include_once est pratique car il scanne chaque répertoire de chemin alternatif pour trouver le fichier, il est aussi moins performant car génère des accès et recherches disque à chaque appel (en effet, PHP intègre un cache des fichiers lus mais n&#039;intègre pas un cache des fichiers &amp;quot;non trouvés&amp;quot;. Et comme un fichier donné n&#039;est que dans une seule arborescence, il y a toujours une arborescence alternative où il ne se trouve pas et qui génère des accès superflus au disque dur, pénalisant en terme de performance. Comme pour les fichiers internes à Dolibarr, on connait toujours le chemin exacte, le require_once avec ce chemin direct doit être préféré).&lt;br /&gt;
&lt;br /&gt;
===Accès à la base===&lt;br /&gt;
Si vous avez besoin de réaliser des modifications en base dans votre propre table ajoutée, utilisez la classe générée plus haut qui contient les méthodes pour cela.&lt;br /&gt;
&lt;br /&gt;
Si toutefois vous voulez faire des accès dans des tables sans objet PHP dédié, ceci reste possible (par exemple pour récupérer une liste d&#039;enregistrement). Dans ce cas, pensez à suivre ces exemples:&lt;br /&gt;
&lt;br /&gt;
Pour un insert, update ou delete :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$db-&amp;gt;begin();   // Debut transaction&lt;br /&gt;
$db-&amp;gt;query(&amp;quot;Ma requete insert, update ou delete&amp;quot;);&lt;br /&gt;
$db-&amp;gt;commit();       // Valide&lt;br /&gt;
ou $db-&amp;gt;rollback()  // Annule&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour une lecture :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$resql=$db-&amp;gt;query(&amp;quot;Ma requete select&amp;quot;);&lt;br /&gt;
if ($resql)&lt;br /&gt;
{&lt;br /&gt;
	$num = $db-&amp;gt;num_rows($resql);&lt;br /&gt;
	$i = 0;&lt;br /&gt;
	if ($num)&lt;br /&gt;
	{&lt;br /&gt;
		while ($i &amp;lt; $num)&lt;br /&gt;
		{&lt;br /&gt;
			$obj = $db-&amp;gt;fetch_object($resql);&lt;br /&gt;
			if ($obj)&lt;br /&gt;
			{&lt;br /&gt;
				// You can use here results&lt;br /&gt;
				print $obj-&amp;gt;field1;&lt;br /&gt;
				print $obj-&amp;gt;field2;&lt;br /&gt;
			}&lt;br /&gt;
			$i++;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Définition du style===&lt;br /&gt;
Pour que le look de la page soit aligné avec le thème Dolibarr, il est nécessaire d&#039;utiliser les styles des CSS de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
Par exemple :&lt;br /&gt;
&lt;br /&gt;
*class=&amp;quot;&#039;&#039;&#039;liste_titre&#039;&#039;&#039;&amp;quot; sur les balises &#039;&#039;tr&#039;&#039; et &#039;&#039;td&#039;&#039; pour une ligne de titre de tableau.&lt;br /&gt;
*class=&amp;quot;&#039;&#039;&#039;pair&#039;&#039;&#039;&amp;quot; ou class=&amp;quot;&#039;&#039;&#039;impair&#039;&#039;&#039;&amp;quot; sur les balises &#039;&#039;tr&#039;&#039; et &#039;&#039;td&#039;&#039; des lignes de données de tableau.&lt;br /&gt;
*class=&amp;quot;&#039;&#039;&#039;flat&#039;&#039;&#039;&amp;quot; sur tous les champs de saisie (&#039;&#039;input, select, textarea&#039;&#039;...).&lt;br /&gt;
*class=&amp;quot;&#039;&#039;&#039;button&#039;&#039;&#039;&amp;quot; sur les objets de type &#039;&#039;input type=&amp;quot;submit&amp;quot;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Utilisez le sélecteur de date de Dolibarr===&lt;br /&gt;
Si vous le désirez, vous pouvez profiter du sélecteur de date dans des écrans Dolibarr. Pour cela, utilisez la ligne suivante:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$form=new Form($db);&lt;br /&gt;
$form-&amp;gt;select_date(&#039;&#039;,&#039;mykey&#039;,0,0,0,&amp;quot;myform&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La chaîne mykey identifie la zone date. Il faut y mettre une valeur différente s&#039;il y a plusieurs zones.&lt;br /&gt;
La chaine myform est le nom de la zone FORM (dans form name=&amp;quot;myform&amp;quot; de la page HTML).&lt;br /&gt;
L&#039;affichage d&#039;un sélecteur de date doit donc être intégré dans une zone FORM Html.&lt;br /&gt;
&lt;br /&gt;
Pour récupérer la valeur, à l&#039;issu du POST, la commande est:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$mydate = dol_mktime(12, 0 , 0, GETPOST(&#039;mykeymonth&#039;, &#039;int&#039;), GETPOST(&#039;mykeyday&#039;, &#039;int&#039;), GETPOST(&#039;mykeyyear&#039;, &#039;int&#039;));&lt;br /&gt;
print strftime(&#039;%A %d %B %Y&#039;, $mydate);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Définir votre page de configuration (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : si votre module offre plusieurs options paramétrables.&lt;br /&gt;
&lt;br /&gt;
===Créez votre page d&#039;édition de configuration===&lt;br /&gt;
Si votre module offre plusieurs options paramétrables, il est nécessaire de créer une page PHP pour éditer les options (qui sont stockées dans la [[Table llx_const|table &#039;&#039;&#039;llx_const&#039;&#039;&#039;]]).&lt;br /&gt;
Créez une page PHP nommée &#039;&#039;&#039;monmodule_setupapage.php&#039;&#039;&#039; qui affiche les options possibles et les met à jour.&lt;br /&gt;
Il est nécessaire de prendre exemple sur une page dans &#039;&#039;&#039;/admin&#039;&#039;&#039; qui vous montre la méthode pour lire ou sauvegarder en base votre option.&lt;br /&gt;
Placez cette page de configuration dans le répertoire &#039;&#039;&#039;/admin&#039;&#039;&#039; également.&lt;br /&gt;
Ensuite dans le descripteur de module, modifiez la variable pour indiquer le nom de cette page PHP (sans le chemin qui n&#039;est pas nécessaire, la page étant forcément dans le rep admin).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;config_page_url = array(&amp;quot;setup.php@mymodule&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Testez votre page===&lt;br /&gt;
Allez sur la page &#039;&#039;&#039;Configuration-&amp;gt;module&#039;&#039;&#039;, vous devez voir apparaître une icône qui permet d&#039;accéder à la page de configuration et vous devez être capable de modifier ces options et les voir conservées en base.&lt;br /&gt;
&lt;br /&gt;
==Définir vos entrées de menu (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : si vous avez créé des pages PHP, il est nécessaire que ces écrans soient accessibles depuis le menu Dolibarr.&lt;br /&gt;
&lt;br /&gt;
===Définissez vos entrées menus===&lt;br /&gt;
Pour cela, il vous faut définir dans le fichier descripteur de module, le tableau this-&amp;gt;menu qui déclare les menus.&lt;br /&gt;
Ce tableau contient toutes les entrées qui apparaîtront dans les menus une fois le module activé.&lt;br /&gt;
Le fichier de descripteur de module exemple &#039;&#039;&#039;modMonModule.class.php&#039;&#039;&#039; possède un exemple de déclaration de menu haut ainsi que de ses entrées menu gauche associées.&lt;br /&gt;
&lt;br /&gt;
Voici un exemple de déclaration d&#039;entrées de menu dans le fichier descripteur:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Main menu entries&lt;br /&gt;
$this-&amp;gt;menu = array();			// List of menus to add&lt;br /&gt;
$r=0;&lt;br /&gt;
&lt;br /&gt;
// Add here entries to declare new menus&lt;br /&gt;
// Example to declare the Top Menu entry:&lt;br /&gt;
$this-&amp;gt;menu[$r]=array(	&#039;fk_menu&#039;=&amp;gt;0,			// Put 0 if this is a top menu&lt;br /&gt;
			&#039;type&#039;=&amp;gt;&#039;top&#039;,			// This is a Top menu entry&lt;br /&gt;
			&#039;titre&#039;=&amp;gt;&#039;MonModule top menu&#039;,&lt;br /&gt;
			&#039;mainmenu&#039;=&amp;gt;&#039;monmodule&#039;,&lt;br /&gt;
			&#039;leftmenu&#039;=&amp;gt;&#039;monmodule&#039;,&lt;br /&gt;
			&#039;url&#039;=&amp;gt;&#039;/monmodule/pagetop.php&#039;,&lt;br /&gt;
			&#039;langs&#039;=&amp;gt;&#039;mylangfile&#039;,	// Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.&lt;br /&gt;
			&#039;position&#039;=&amp;gt;100,&lt;br /&gt;
			&#039;enabled&#039;=&amp;gt;&#039;1&#039;,			// Define condition to show or hide menu entry. Use &#039;$conf-&amp;gt;monmodule-&amp;gt;enabled&#039; if entry must be visible if module is enabled.&lt;br /&gt;
			&#039;perms&#039;=&amp;gt;&#039;1&#039;,			// Use &#039;perms&#039;=&amp;gt;&#039;$user-&amp;gt;rights-&amp;gt;monmodule-&amp;gt;level1-&amp;gt;level2&#039; if you want your menu with a permission rules&lt;br /&gt;
			&#039;target&#039;=&amp;gt;&#039;&#039;,&lt;br /&gt;
			&#039;user&#039;=&amp;gt;2);				// 0=Menu for internal users, 1=external users, 2=both&lt;br /&gt;
$r++;&lt;br /&gt;
&lt;br /&gt;
// Example to declare a Left Menu entry:&lt;br /&gt;
$this-&amp;gt;menu[$r]=array(	&#039;fk_menu&#039;=&amp;gt;&#039;fk_mainmenu=xxx&#039;,	// Use &#039;fk_mainmenu=xxx&#039; or &#039;fk_mainmenu=xxx,fk_leftmenu=yyy&#039; where xxx is mainmenucode and yyy is a leftmenucode of parent menu&lt;br /&gt;
			&#039;type&#039;=&amp;gt;&#039;left&#039;,			// This is a Left menu entry&lt;br /&gt;
			&#039;titre&#039;=&amp;gt;&#039;MonModule left menu 1&#039;,&lt;br /&gt;
			&#039;mainmenu&#039;=&amp;gt;&#039;xxx&#039;,&lt;br /&gt;
                        &#039;leftmenu&#039;=&amp;gt;&#039;yyy&#039;,&lt;br /&gt;
			&#039;url&#039;=&amp;gt;&#039;/monmodule/pagelevel1.php&#039;,&lt;br /&gt;
			&#039;langs&#039;=&amp;gt;&#039;mylangfile&#039;,	// Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.&lt;br /&gt;
			&#039;position&#039;=&amp;gt;100,&lt;br /&gt;
			&#039;enabled&#039;=&amp;gt;&#039;1&#039;,			// Define condition to show or hide menu entry. Use &#039;$conf-&amp;gt;monmodule-&amp;gt;enabled&#039; if entry must be visible if module is enabled.&lt;br /&gt;
			&#039;perms&#039;=&amp;gt;&#039;1&#039;,			// Use &#039;perms&#039;=&amp;gt;&#039;$user-&amp;gt;rights-&amp;gt;monmodule-&amp;gt;level1-&amp;gt;level2&#039; if you want your menu with a permission rules&lt;br /&gt;
			&#039;target&#039;=&amp;gt;&#039;&#039;,&lt;br /&gt;
			&#039;user&#039;=&amp;gt;2);				// 0=Menu for internal users,1=external users, 2=both&lt;br /&gt;
$r++;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour conditionner l&#039;accès au menu selon des permission, modifier la propriété &#039;&#039;&#039;perms&#039;&#039;&#039; du tableau. Voir le chapitre sur les permissions un peu plus loin pour savoir comment ajouter des permissions.&lt;br /&gt;
&lt;br /&gt;
===Testez vos entrées menus===&lt;br /&gt;
Désactiver et réactiver votre module sous Dolibarr, les entrées menus doivent alors apparaître (si la condition dans &#039;enabled&#039; est vraie).&lt;br /&gt;
&lt;br /&gt;
==Définir vos propres permissions (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : Si vous voulez ajouter de nouvelles permissions.&lt;br /&gt;
&lt;br /&gt;
La définition des permissions que gérera votre module se fait dans le fichier descripteur créé dans la première étape.&lt;br /&gt;
Modifier la ligne &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;rights_class = &#039;monmodule&#039;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
pour y mettre la bonne valeur de monmodule.&lt;br /&gt;
&lt;br /&gt;
Ensuite remplissez le tableau $this-&amp;gt;rights avec autant d&#039;entrées que de permissions différentes à gérer.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;rights[$r][0] = 10001;&lt;br /&gt;
$this-&amp;gt;rights[$r][1] = &#039;Libelle par défaut de ma permission&#039;;&lt;br /&gt;
$this-&amp;gt;rights[$r][3] = 1;&lt;br /&gt;
$this-&amp;gt;rights[$r][4] = &#039;action&#039;;&lt;br /&gt;
$this-&amp;gt;rights[$r][5] = &#039;sousaction&#039;;&lt;br /&gt;
$r++;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans $this-&amp;gt;rights[$r][0], mettre un id de permission non déjà pris (Voir dans le menu &#039;&#039;&#039;Infos Système&#039;&#039;&#039; sur une installation de Dolibarr opérationnelle pour connaître les id déjà utilisés.&lt;br /&gt;
Dans $this-&amp;gt;rights[$r][3], mettre 1 si cette permission est attribué d&#039;office par défaut quand un utilisateur est créé.&lt;br /&gt;
Dans $this-&amp;gt;rights[$r][1], mettre un libellé par défaut (il sera affiché si aucune traduction n&#039;est trouvé pour votre permission dans le fichier &#039;&#039;&#039;admin.lang&#039;&#039;&#039;. La clé de traduction dit être &amp;quot;Permission10001=Description de ma super permission&#039;&#039;&#039;&amp;quot;&#039;&#039;&#039;).&lt;br /&gt;
Dans $this-&amp;gt;rights[$r][4] et $this-&amp;gt;rights[$r][5], mettre une chaîne action et sous action sans espace. Vous pourrez alors tester dans le code PHP si un utilisateurs a bien les droits par la séquence suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
if ($user-&amp;gt;rights-&amp;gt;monmodule-&amp;gt;action-&amp;gt;sousaction) ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Définir vos propres box/widgets (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : si votre module amène avec lui une ou plusieurs Boxes.&lt;br /&gt;
&lt;br /&gt;
===Définissez vos box===&lt;br /&gt;
Pour cela, modifiez les tableaux $this-&amp;gt;boxes du fichier descripteur de module.&lt;br /&gt;
Il suffit d&#039;ajouter 2 lignes par fichier box que vous allez créer dans le répertoire &#039;&#039;&#039;htdocs/monmodule/core/boxes&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Exemple :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;boxes[0][&#039;file&#039;]=&#039;mabox0.php@monmodule&#039;&lt;br /&gt;
$this-&amp;gt;boxes[0][&#039;note&#039;]=&#039;Ma box 0&#039;&lt;br /&gt;
 ...&lt;br /&gt;
$this-&amp;gt;boxes[n][&#039;file&#039;]=&#039;maboxn.php@monmodule&#039;&lt;br /&gt;
$this-&amp;gt;boxes[n][&#039;note&#039;]=&#039;Ma box n&#039;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite créez les fichiers &#039;&#039;&#039;htdocs/monmodule/core/boxes/mabox0.php&#039;&#039;&#039;, &#039;&#039;&#039;htdocs/monmodule/core/boxes/maboxn.php&#039;&#039;&#039;... en prenant exemple sur des box existantes (exemple dans le répertoire &#039;&#039;&#039;htdocs/core/boxes&#039;&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
===Testez la présence de vos box dans Dolibarr===&lt;br /&gt;
Désactivez et réactivez le module.&lt;br /&gt;
&lt;br /&gt;
Allez dans le menu &#039;&#039;&#039;Accueil - Configuration - Widgets&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Vos box doivent apparaître dans la liste des box activables. Activez les puis allez sur la page d&#039;accueil et vérifiez qu&#039;elles s&#039;affichent correctement.&lt;br /&gt;
&lt;br /&gt;
==Définir vos propres exports (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : si votre module amène avec lui des exports prédéfinis de données (pour ces propres tables ou des tables déjà existantes d&#039;un autre module de Dolibarr).&lt;br /&gt;
&lt;br /&gt;
===Définissez l&#039;export===&lt;br /&gt;
Pour cela, décommentez et modifiez les tableaux $this-&amp;gt;export_xxx du votre fichier descripteur de module.&lt;br /&gt;
&lt;br /&gt;
===Testez votre export===&lt;br /&gt;
Allez dans le menu outils -&amp;gt; export de Dolibarr. Votre export doit apparaitre dans la liste des exports prédéfinis disponibles (si votre module est bien activé).&lt;br /&gt;
Le choisir, vous devez alors voir les champs possibles définis dans le tableau à l&#039;étape précédente.&lt;br /&gt;
Choissez quelques champs et tentez une génération du fichier export.&lt;br /&gt;
&lt;br /&gt;
==Définir vos styles CSS (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : lorsque dans vos écrans PHP, vous utiliser des classes de styles qui ne sont pas celle des thèmes de Dolibarr (non recommandé).&lt;br /&gt;
&lt;br /&gt;
Cette fonctionnalité est décrite mais pas encore opérationnel en 2.4&lt;br /&gt;
&lt;br /&gt;
===Créez et déclarez votre feuille de style===&lt;br /&gt;
Créez un fichier de style css nommé &#039;&#039;&#039;monmodule.css&#039;&#039;&#039; ou &#039;&#039;&#039;monmodule.css.php&#039;&#039;&#039; et placez le dans le répertoire &#039;&#039;&#039;&#039;&#039;monmodule&#039;&#039;&#039;&#039;&#039; dans &#039;&#039;&#039;htdocs&#039;&#039;&#039;. Il ne peut y avoir qu&#039;un fichier css propre à chaque module.&lt;br /&gt;
Rappelons qu&#039;il vaut mieux utiliser les styles déjà existant de Dolibarr (le fichier css utilisé par Dolibarr étant le fichier &#039;&#039;&#039;themes/nomtheme/&#039;&#039;nomtheme&#039;&#039;.css.php&#039;&#039;&#039;). Ne créez un fichier css propre à votre module que si vous devez absolument gérer des styles non déjà existants.&lt;br /&gt;
Une fois votre feuille de style prête, déclarez la dans votre fichier descripteur de module en modifiant la propriété &#039;&#039;&#039;$this-&amp;gt;module_parts&#039;&#039;&#039;.&lt;br /&gt;
La valeur à renseigner ici doit être le chemin relatif de l&#039;URL de votre fichier css.&lt;br /&gt;
Par exemple&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;module_parts = array(&#039;css&#039; =&amp;gt; array(&#039;/monmodule/css/monmodule.css.php&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Testez votre feuille de style===&lt;br /&gt;
Désactivez et réactivez votre module.&lt;br /&gt;
&lt;br /&gt;
Appelez la page d&#039;accueil de Dolibarr. Affichez la source de la page HTML.&lt;br /&gt;
&lt;br /&gt;
Vous devriez voir dans l&#039;entête HTML, une ligne déclarant votre feuille de style.&lt;br /&gt;
&lt;br /&gt;
==Définir vos fonctions Javascript (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : lorsque dans vos écrans PHP, vous utiliser des fonctions javascript non dispo en standard (fichier lib_head.js)&lt;br /&gt;
&lt;br /&gt;
Si dans vos écrans PHP, vous utilisez des fonctions javascript, il est nécessaire de faire en sorte que vos fonctions déclarées dans un fichier javascript &#039;&#039;&#039;htdocs/monmodule/js/monmodule.js&#039;&#039;&#039; soit chargées dans l&#039;entête head html.&lt;br /&gt;
Pour demander à Dolibarr qui gère la génération de la section header d&#039;inclure un de vos fichiers javascript, il est nécessaire de fournir en paramètre de la fonction llxHeader() appelée au début de votre page, d&#039;inclure le paramètre qui contient l&#039;URL vers le js à inclure.&lt;br /&gt;
&lt;br /&gt;
Exemple pour la page /htdocs/monmodule/mapage.php :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
require(&#039;../main.inc.php&#039;);&lt;br /&gt;
$morejs=array(&amp;quot;/monmodule/js/monmodule.js&amp;quot;);&lt;br /&gt;
llxHeader(&#039;&#039;,&#039;Titre&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,$morejs,&#039;&#039;,0,0); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Déclencher du code sur un évènement Dolibarr (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : lorsque vous voulez que des actions particulières s&#039;exécutent suite au déclenchement d&#039;actions standards de Dolibarr (exemple : je veux mettre à jour une table de mon module quand une facture se crée dans Dolibarr), il vous faut créer un fichier de &#039;&#039;&#039;triggers&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Voir aussi [[Interfaces_Dolibarr_vers_exterieur|Interfaces de Dolibarr vers l&#039;exterieur]]&lt;br /&gt;
et [[Interfaces_Exterieur_vers_Dolibarr|Interfaces exterieures vers Dolibarr]]&lt;br /&gt;
&lt;br /&gt;
==Insérer votre code aux emplacement hooks de Dolibarr (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : lorsque vous voulez modifier ou ajouter du code autrement que lors d&#039;un événement métier (voir le chapitre précédent pour cela).&lt;br /&gt;
&lt;br /&gt;
Voir la page [[Système de Hooks]].&lt;br /&gt;
&lt;br /&gt;
==Ajouter un module de numérotation (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : lorsque vous voulez ajouter une règle de numérotation non couverte par les modules par défaut.&lt;br /&gt;
&lt;br /&gt;
Voir la page [[Créer un module de numérotation]].&lt;br /&gt;
&lt;br /&gt;
==Ajouter un nouveau modèle de document (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : lorsque vous voulez ajouter un nouveau modèle de document.&lt;br /&gt;
&lt;br /&gt;
La documentation au sujet de la génération de documents depuis des modèles est disponible sur la page [[Créer un modèle de document PDF]] ou [[Créer un modèle de document ODT]].&lt;br /&gt;
&lt;br /&gt;
==Ajouter un thème (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039;: Lorsque vous voulez une interface aux couleurs personnalisées à votre cas.&lt;br /&gt;
&lt;br /&gt;
Voir la page [[Themes]].&lt;br /&gt;
&lt;br /&gt;
==Ajouter un bouton (optionnel)==&lt;br /&gt;
Si vous souhaitez ajouter des boutons à vos enregistrements.&lt;br /&gt;
&lt;br /&gt;
Voir la page [[Création de boutons]].&lt;br /&gt;
&lt;br /&gt;
=[[File:Art.png]] Quelques règles de codage et fonctions pour développeurs=&lt;br /&gt;
Les règles de codage à suivre sont définis dans la [[Documentation Développeur|Documentation développeur]], rubrique &amp;quot;Informations Générales - Langage et normes de développement&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
De nombreuses fonctions prédéfinies pour les développeurs sont disponibles et décrites sur la page [[Documentation Développeur|Documentation développeur]] sous la section &amp;quot;Les couches techniques de Dolibarr&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=[[File:Art.png]] Créer un package pour livrer et installer votre module=&lt;br /&gt;
Cette procédure doit être utilisée pour fabriquer un package afin de le soumettre sur la place de marché http://www.dolistore.com.&lt;br /&gt;
Mais vous pouvez aussi l&#039;utiliser pour distribuer facillement votre module via votre propre réseau de distribution.&lt;br /&gt;
&lt;br /&gt;
*Allez dans le répertoire &#039;&#039;&#039;/build&#039;&#039;&#039; et recopiez le fichier &#039;&#039;&#039;makepack-dolibarrmodules.conf&#039;&#039;&#039; en &#039;&#039;&#039;makepack-monmodule.conf&#039;&#039;&#039;. Attention, ce répertoire peut ne pas être fourni dans les packages de versions stables. Si c&#039;est le cas, il peut être récupéré dans le snapshot disponible en téléchargement sur le site web Dolibarr dans la rubrique Version de développement (prenez dans ce cas tout le répertoire build qui est un répertoire autonome et indépendant de la version).&lt;br /&gt;
&lt;br /&gt;
Saisissez dans ce fichier la liste des noms des nouveaux fichiers que vous avez créé pour votre module (descripteur de module, nouveaux fichiers sql de tables, page php, images, etc...)&lt;br /&gt;
&lt;br /&gt;
*Lancer le script via Perl (besoin de la version Perl 5.0 ou +):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
perl makepack-dolibarrmodule.pl&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Le script vous demande le nom de votre module, sa version majeure et mineure.&lt;br /&gt;
Un fichier &#039;&#039;&#039;monmodule.zip&#039;&#039;&#039; va alors être fabriqué contenant votre module prêt pour être déployé.&lt;br /&gt;
&lt;br /&gt;
*La personne qui reçoit votre module doit alors placer le fichier dans son répertoire racine d&#039;installation de Dolibarr et réaliser la commande :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tar -xvf monmodule.zip&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Si vous désirez que votre module profite à tous, vous pouvez le soumettre (le fichier zip) sur la place de marché des modules complémentaires: {{LinkToPluginDownload}} (vous devez avoir créé un compte auparavant et utiliser le lien &amp;quot;Soumettre un module/produit&amp;quot;).&lt;br /&gt;
**Si votre module a été fabriqué correctement, le fichier sera validé rapidement.&lt;br /&gt;
**Si la qualité est suffisante, que la licence le permet et que la fonctionnalité du module s&#039;avère être d&#039;un intérêt général, le code pourra être ajouté au code source de Dolibarr (sauf si vous ne le désirez pas).&lt;br /&gt;
&lt;br /&gt;
=[[File:Art.png]] Dépôt et validation du module externe sur Dolistore=&lt;br /&gt;
&lt;br /&gt;
Voir [[Module_Dolistore_Validation_Regles|Règles de Validation]]&lt;/div&gt;</summary>
		<author><name>Kusco</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=FAQ_Am%C3%A9liorer_les_performances&amp;diff=59166</id>
		<title>FAQ Améliorer les performances</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=FAQ_Am%C3%A9liorer_les_performances&amp;diff=59166"/>
		<updated>2024-01-10T10:04:27Z</updated>

		<summary type="html">&lt;p&gt;Kusco: /* Désactivation de xdebug */ Mise à jour du chemin d&amp;#039;accès&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 : FAQ_Increase_Performance --&amp;gt;&lt;br /&gt;
[[en:FAQ_Increase_Performance]]&lt;br /&gt;
[[es:FAQ_Mejorar_el_rendimiento]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ FR]]&lt;br /&gt;
{{TemplateDocDev}}&lt;br /&gt;
{{TemplateDocUtil}}&lt;br /&gt;
Dolibarr est une application Web qui a fait l&#039;objet d&#039;une conception poussée pour obtenir un temps de réponse le plus optimisé possible.&lt;br /&gt;
De nombreuses technologies sont mises en oeuvre mais certaines ne sont pas actives par défaut car nécessite des compétences ou habilitations particulières pour les mettre en oeuvre. Voici toutes les choses que vous pouvez mettre en oeuvre pour améliorer encore plus la réactivité de l&#039;application.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Solutions recommandées=&lt;br /&gt;
A partir de la v14, vous trouverez dans le menu &#039;&#039;&#039;Accueil - Outils d&#039;administration - Performances&#039;&#039;&#039;, une page avec des conseils sur votre configuration pour obtenir les meilleures performances de votre application. Commencez par cela si votre version est v14+.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez ensuite compléter avec les recommandations suivantes...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Utilisez la dernière version de PHP==&lt;br /&gt;
Efficacité: ***&lt;br /&gt;
&lt;br /&gt;
Principe : Chaque nouvelle version de PHP rend l&#039;application plus rapide que la précédente. Donc, si vous le pouvez, effectuez simplement une mise à niveau.&lt;br /&gt;
&lt;br /&gt;
==Activer HTTP/2==&lt;br /&gt;
Efficacité: *&lt;br /&gt;
&lt;br /&gt;
Principe : Le protocole HTTP/2 est connu pour être plus rapide que HTTP/1.1. Donc, si votre système d&#039;exploitation et votre serveur Web sont compatibles, activez-le simplement.&lt;br /&gt;
&lt;br /&gt;
==Désactivation de xdebug==&lt;br /&gt;
Efficacité: *****&lt;br /&gt;
&lt;br /&gt;
Principe: Si le module php xdebug est actif, il vous faut le désactiver. Ce module est une fonctionnalité de PHP qui sert aux développeurs mais ralentit fortement le fonctionnement de toute application PHP. &lt;br /&gt;
Pour savoir si ce module est actif, aller dans la pages &#039;&#039;&#039;Accueil-Outils d&#039;administrations-Infos PHP&#039;&#039;&#039; et faites une recherche sur &#039;&#039;&#039;xdebug&#039;&#039;&#039;. Si vous ne trouvez rien, le module n&#039;est pas actif. Si vous trouvez une occurrence, il est actif et peut être désactivé.&lt;br /&gt;
Son activation/désactivation dépend de votre système PHP et OS mais le plus souvent on le désactive en commentant une ligne dans le fichier php.ini&lt;br /&gt;
&lt;br /&gt;
==Cache applicatif via MemCached==&lt;br /&gt;
Efficacité: *****&lt;br /&gt;
&lt;br /&gt;
Principe: Installer un serveur de cache Memcached et le [[Module MemCached]].&lt;br /&gt;
&lt;br /&gt;
==Cache PHP OPCODE==&lt;br /&gt;
Efficacité: ****&lt;br /&gt;
&lt;br /&gt;
Principe: Installer un module apache/php qui met en cache la compilation de vos pages PHP. A chaque accès, une page auquel on a déjà accédé sera plus rapide d&#039;accès.&lt;br /&gt;
Pour cela vous pouvez installer n&#039;importe quel [http://en.wikipedia.org/wiki/List_of_PHP_accelerators accélérateur PHP]. xcache fait partie des solutions recommandées.&lt;br /&gt;
Notons que ce cache joue ici sur un niveau différent que le [[Module MemCached]], les gains sont donc cumulatifs !&lt;br /&gt;
&lt;br /&gt;
==Cache HTTP des pages statiques==&lt;br /&gt;
Efficacité: ***&lt;br /&gt;
&lt;br /&gt;
Principe: Vous pouvez configurer apache pour activer le cache explicite des ressources statiques en ajoutant les directives:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
# Cache for static resources (Enable expiration and set it to A2592000 = 1 month)&lt;br /&gt;
ExpiresActive On&lt;br /&gt;
ExpiresByType image/x-icon A2592000&lt;br /&gt;
ExpiresByType image/gif A2592000&lt;br /&gt;
ExpiresByType image/png A2592000&lt;br /&gt;
ExpiresByType image/jpeg A2592000&lt;br /&gt;
ExpiresByType text/css A2592000&lt;br /&gt;
ExpiresByType text/javascript A2592000&lt;br /&gt;
ExpiresByType application/x-javascript A2592000&lt;br /&gt;
ExpiresByType application/javascript A2592000&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La encore les gains sont cumulatifs avec les caches précédents.&lt;br /&gt;
&lt;br /&gt;
[[File:warning.png]] Après avoir ajouté cela, vous devez recharger la configuration du serveur web mais également vider le cache local du navigateur afin de forcer ce dernier à redemander la ressource et récupérer le nouvel entête.&lt;br /&gt;
&lt;br /&gt;
==Compression des ressources par Apache==&lt;br /&gt;
Efficacité: ***&lt;br /&gt;
&lt;br /&gt;
Principe: Vous pouvez configurer Apache pour activer la compression des ressources renvoyées par le serveur grâce aux directives suivantes:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
# Compress returned resources of type php pages, text file export, css and javascript&lt;br /&gt;
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript application/x-javascript&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:warning.png]] Après avoir ajouté cela, vous devez recharger la configuration du serveur web mais également vider le cache local du navigateur afin de forcer ce dernier à redemander la ressource et récupérer le nouvel entête.&lt;br /&gt;
&lt;br /&gt;
==Utilisation du driver mysqli plutôt que mysql==&lt;br /&gt;
Efficacité: ***&lt;br /&gt;
&lt;br /&gt;
Principe: Si vous utilisez une base de données Mysql, vérifiez dans votre fichier de configuration Dolibarr htdocs/conf/conf.php que vous avez bien la ligne&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$dolibarr_main_db_type=&#039;mysqli&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Si la valeur vaut &#039;&#039;&#039;mysql&#039;&#039;&#039;, changez la en &#039;&#039;&#039;mysqli&#039;&#039;&#039; qui donne de meilleures performances (gain de 30ms à chaque page).&lt;br /&gt;
&lt;br /&gt;
==Recherche sur début de champ==&lt;br /&gt;
Efficacité: ***&lt;br /&gt;
&lt;br /&gt;
Principe: Si vous avez activé dans le module Produit la recherche par &amp;quot;autocomplete&amp;quot; et si la liste met du temps à apparaitre à chaque saisie de caractère, c&#039;est que vous avez un nombre important de produit. La recherche se faisant n&#039;importe ou dans le texte, l&#039;index de base de donnée ne peut être utilisé. En ajoutant la constante PRODUCT_DONOTSEARCH_ANYWHERE à 1 dans &#039;&#039;&#039;Accueil-Configuration-Divers&#039;&#039;&#039;, vous limitez la recherche au début de la chaine rendant possible l&#039;utilisation de l&#039;index et obtiendrez une réponse immédiate.&lt;br /&gt;
&lt;br /&gt;
==Désactivation des ajax combo==&lt;br /&gt;
Efficacité: ***&lt;br /&gt;
&lt;br /&gt;
Si vous avez un large nombre de tiers, contacts ou produits (&amp;gt; 5000), vous pouvez désactiver la fonctionnalité de préchargements de produits pour ne charger la liste qu&#039;après avoir cliquer sur 1, 2 ou 3 caractères.&lt;br /&gt;
Ceci se fait depuis la page de configuration du module Tiers ou Produit.&lt;br /&gt;
&lt;br /&gt;
==Utilisation d&#039;un navigateur récent==&lt;br /&gt;
Efficacité: ***&lt;br /&gt;
&lt;br /&gt;
Principe: De plus en plus de fonctionnalités sont basés sur les technologies Ajax ou javascript afin d&#039;offrir une ergonomie moderne. Ces technologies, ont une part non négligeable dans le temps d&#039;affichage de certaines pages et sont beaucoup mieux exploités avec un navigateur Web récent. Les écarts en performance d&#039;une version à l&#039;autre sont parfois très importante, aussi pensez à utiliser un navigateur web optimisé et en version la plus récente possible (Firefox, Chrome, Safari ou Opera). Eviter IE ou autre navigateurs exotiques.&lt;br /&gt;
&lt;br /&gt;
==Mise à jour de statistiques de base==&lt;br /&gt;
Efficacité: **&lt;br /&gt;
&lt;br /&gt;
Principe: Si vous avez une base de donnée volumineuse (plus de 100 000 enregistrements), vérifiez que les statistiques de vos données sont à jour. Ceci requiert un accès administrateur à la base de donnée et des connaissances en administration de base. Consulter le manuel de la base de donnée sur le sujet &amp;quot;mise à jour des statistiques&amp;quot; pour cela.&lt;br /&gt;
&lt;br /&gt;
=Autres solutions=&lt;br /&gt;
Toutes les solutions ici sont catégorisées à part dans ce chapitre &amp;quot;Autres solutions&amp;quot; car elles ne sont pas recommandées. Toutes les solutions suivantes peuvent nécessiter des connaissances techniques avancées, peuvent être instables, non supportées ou peuvent rendre certaines fonctionnalités inopérationnelles... mais elles existent, aussi ne les employez que si vous savez ce que vous faites !&lt;br /&gt;
&lt;br /&gt;
==Cache applicatif via la Shared memory==&lt;br /&gt;
Efficacité: ****&lt;br /&gt;
&lt;br /&gt;
Prérequis: Utilisation du serveur web Apache&lt;br /&gt;
&lt;br /&gt;
Principe: Ajouter dans &#039;&#039;&#039;Accueil-Configuration-Divers&#039;&#039;&#039; la constante MAIN_OPTIMIZE_SPEED. Si la valeur de cette constante a le bit 1 défini (Exemple: MAIN_OPTIMIZE_SPEED=2), la shared memory de votre OS est utilisée pour mettre en cache les fichiers lang, mais cela implique aussi que tout l&#039;interface ne sera visible que dans une seule langue, celle du premier qui se connecte après un redémarrage du serveur web (qui charge les fichiers langues en cache). De plus, la shared memory peut s&#039;avérer instable sur certains OS (Windows). Utiliser plutôt le [[Module MemCached]] pour une optimisation par un cache applicatif qui n&#039;a aucune de ces contraintes et est encore plus performant, cette action sera alors inutile.&lt;br /&gt;
&lt;br /&gt;
==Désactiver le génération des PDF &amp;quot;à la volée&amp;quot;==&lt;br /&gt;
Efficacité: **&lt;br /&gt;
&lt;br /&gt;
Vous pouvez ajouter la constante MAIN_DISABLE_PDF_AUTOUPDATE dans Accueil - Configuration - Autre.&lt;br /&gt;
&lt;br /&gt;
Ceci désactivera la régénération du PDF à chaque fous que vous modifier un élément (facture, commande, ...). La génération du PDF aura lieu uniquement sur click du bouton &amp;quot;Générer&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Compression des ressources par Dolibarr==&lt;br /&gt;
Efficacité: **&lt;br /&gt;
&lt;br /&gt;
Principe:  Ajouter dans &#039;&#039;&#039;Accueil-Configuration-Divers&#039;&#039;&#039; la constante MAIN_OPTIMIZE_SPEED. Si la valeur de cette constante a le bit 2 défini (Exemple: MAIN_OPTIMIZE_SPEED=4), Dolibarr renverra les pages compressés en GZ (et si le navigateur le supporte). Cela consomme plus de CPU sur le serveur mais réduit le temps de transfert. Préferrez toutefois la compression configuré par Apache (voir plus haut). Ne pas activez les 2 méthodes en même temps.&lt;br /&gt;
&lt;br /&gt;
==Désactiver la fonction Canvas==&lt;br /&gt;
Efficacité: *&lt;br /&gt;
&lt;br /&gt;
Principe: Ajouter dans &#039;&#039;&#039;Accueil-Configuration-Divers&#039;&#039;&#039; la constante MAIN_DISABLE_CANVAS à la valeur 1. Ceci désactivera les fonctions de gestion de canvas qui peut être utilisé par certains modules externes et économisera une requête sur la base à chaque fois que vous accédez à la fiche d&#039;un objet.&lt;br /&gt;
Cependant, si un module externe utilise cette fonction de canvas, ceci rendra le module défectueux. Si vous n&#039;avez installé aucun module complémentaire externe, il n&#039;y a pas de risques.&lt;/div&gt;</summary>
		<author><name>Kusco</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=D%C3%A9veloppement_module&amp;diff=58821</id>
		<title>Développement module</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=D%C3%A9veloppement_module&amp;diff=58821"/>
		<updated>2023-11-21T11:57:04Z</updated>

		<summary type="html">&lt;p&gt;Kusco: /* Ajouter un bouton (optionnel) */&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_development --&amp;gt;&lt;br /&gt;
[[en:Module_development]]&lt;br /&gt;
[[es:Desarrollo_de_un_módulo]]&lt;br /&gt;
[[de:Modul_Entwicklung]]&lt;br /&gt;
[[zh:模块开发]]&lt;br /&gt;
[[ja:モジュール_開発]]&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;
Pour créer un nouveau module, il existe plusieurs étapes. Ce didacticiel a pour but de vous décrire chacune d&#039;elles afin d&#039;ajouter un module permettant d&#039;étendre les possibilités de Dolibarr, comme par exemple ajouter une ou plusieurs des fonctionnalités suivantes:&lt;br /&gt;
&lt;br /&gt;
*Ajouter de nouvelles tables en base.&lt;br /&gt;
*Ajouter vos propres entrées dans les menus.&lt;br /&gt;
*Ajouter des objets et des écrans de saisie/consultation de nouvelle tables.&lt;br /&gt;
*Ajouter ou supprimer des onglets sur les pages de vues/édition des objets (facture, produit, commande, événement, ...)&lt;br /&gt;
*Ajouter des exports prédéfinis pour la fonction export.&lt;br /&gt;
*Ajouter de nouvelles boites/widgets pour la home page.&lt;br /&gt;
*Ajouter des variables de substitution.&lt;br /&gt;
*Définir de nouvelles permissions.&lt;br /&gt;
*Déclencher du code automatiquement sur une action Dolibarr particulière.&lt;br /&gt;
*Insérer votre code aux emplacements hooks de Dolibarr&lt;br /&gt;
*Ajouter un modèle de numérotation de la référence des objets créés.&lt;br /&gt;
*Ajouter un modèle de document PDF.&lt;br /&gt;
*Ajouter un nouveau thème.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les chapitres suivants vous présentent comment réaliser tout cela en manuel de manière simple.&lt;br /&gt;
&lt;br /&gt;
=[[File:Art.png]] Création de Module avec le générateur de module=&lt;br /&gt;
Depuis Dolibarr 9.0 il est possible de créer les fichiers principaux de votre module avec le &amp;quot;Générateur de module&amp;quot; (aussi appelé &amp;quot;Module Builder&amp;quot;). Pour l&#039;activer :&lt;br /&gt;
&lt;br /&gt;
*Activez le module &amp;quot;Générateur de Module&amp;quot; (ou &amp;quot;Module builder&amp;quot;) dans la section &amp;quot;Outils multi-modules&amp;quot; de Configuration &amp;gt; Modules/Applications&lt;br /&gt;
&lt;br /&gt;
[[File:Mod_builder_2.png|400px]]&lt;br /&gt;
&lt;br /&gt;
*Puis cliquez sur l’icône &amp;quot;bug&amp;quot; qui est apparue dans la barre de menu en haut à droite&lt;br /&gt;
&lt;br /&gt;
[[File:Mod_builder_3.png|400px]]&lt;br /&gt;
&lt;br /&gt;
=[[File:Art.png]] Exemple de modèle de module externe=&lt;br /&gt;
Un bon modèle/squelette de module externe Dolibarr est disponible ici : [https://github.com/Dolibarr/dolibarr/tree/develop/htdocs/modulebuilder/template GitHub Dolibarr Module Modèle]&lt;br /&gt;
&lt;br /&gt;
=[[File:Art.png]] Créer un module=&lt;br /&gt;
Les sous chapitres suivant décrivent les actions à faire pour créer un module Dolibarr. Les premiers chapitres sont obligatoires quelle que soit la vocation du module, les suivants dépendront de ce que doit faire le module.&lt;br /&gt;
&lt;br /&gt;
==Créer un descripteur de Module (obligatoire)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : Obligatoire dès qu&#039;une extension est développée, quelle que soit sa vocation.&lt;br /&gt;
&#039;&#039;&#039;Depuis Dolibarr 9.0, il est possible de créer le descripteur de votre module avec le &amp;quot;Générateur de module&amp;quot;&#039;&#039;&#039;. Cet outil est encore encours de développement et de maturité mais peut d&#039;ores et déjà être utilisé.&lt;br /&gt;
&lt;br /&gt;
===Créer votre descripteur avec le générateur de module===&lt;br /&gt;
&lt;br /&gt;
*Lancez le générateur de module en cliquant sur l’icône &amp;quot;bug&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[File:Mod_builder_3.png|400px]]&lt;br /&gt;
&lt;br /&gt;
*Entrez le nom de votre module sans espaces (le nom de votre module NE DOIT PAS CONTENIR le caractère underscore ou tiret bas : _) et cliquez sur Créer.&lt;br /&gt;
&lt;br /&gt;
[[File:Mod_builder_4.png|400px]]&lt;br /&gt;
&lt;br /&gt;
*Un module avec ses premiers fichiers a été initialisé. Vous pouvez alors modifier les paramètres du descripteur du module :&lt;br /&gt;
&lt;br /&gt;
[[File:Mod_builder_5.png|400px]]&lt;br /&gt;
&lt;br /&gt;
===Alternative : créer votre descripteur manuellement (sans utiliser le générateur de module)===&lt;br /&gt;
La première étape est donc de créer un fichier de description du module (descripteur). Pour cela:&lt;br /&gt;
&lt;br /&gt;
*Créez le répertoire &#039;&#039;&#039;/htdocs/&#039;&#039;monmodule&#039;&#039;/core/modules&#039;&#039;&#039;. Puis, allez dans le répertoire &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039; et recopiez le fichier modMyModule.class.php dans ce répertoire &#039;&#039;&#039;htdocs/&#039;&#039;monmodule&#039;&#039;/core/modules&#039;&#039;&#039;.&lt;br /&gt;
*Renommez le fichier mod&#039;&#039;&#039;MyModule&#039;&#039;&#039;.class.php en modifiant seulement la partie &#039;&#039;&#039;MyModule&#039;&#039;&#039; (le fichier doit commencer par mod)&lt;br /&gt;
&lt;br /&gt;
Ensuite, modifiez le contenu de ce fichier afin de remplacer :&lt;br /&gt;
&lt;br /&gt;
*les &#039;&#039;modMyModule&#039;&#039; en une valeur qui corresponde à la vocation de votre module. Cette valeur doit toujours commencer par &#039;&amp;lt;nowiki/&amp;gt;&#039;&#039;&#039;mod&#039;&#039;&#039;&#039; et ne contenir que des &#039;&#039;&#039;caractères alphabétiques&#039;&#039;&#039;.&lt;br /&gt;
*$this-&amp;gt;numero = &#039;&#039;100000&#039;&#039; par un numéro de module libre. Pour éviter tout conflit, vous pouvez consulter la page suivante pour retrouver les numéros déjà alloués : [[List of modules id|Liste des id de modules]].&lt;br /&gt;
*Modifier éventuellement les autres variables définies dans le constructeurs (Voir le commentaire dans le code du squelette pour leur signification).&lt;br /&gt;
&lt;br /&gt;
Le descripteur de votre module est alors en place.&lt;br /&gt;
&lt;br /&gt;
===Tester votre descripteur===&lt;br /&gt;
&lt;br /&gt;
Lancez Dolibarr et allez sur la page &#039;&#039;&#039;Configuration-&amp;gt;module&#039;&#039;&#039;, vous devez voir apparaître une nouvelle ligne avec votre nouveau module et la possibilité de l&#039;activer ou non (parcourez tous les onglets de chaque catégories de modules jusqu&#039;à le retrouver).&lt;br /&gt;
C&#039;est la valeur de $this-&amp;gt;special qui détermine dans quel onglet se trouve votre module.&lt;br /&gt;
&lt;br /&gt;
===Nom de module===&lt;br /&gt;
&lt;br /&gt;
Le nom de votre module NE DOIT PAS CONTENIR le caractère underscore ou tiret bas : _&lt;br /&gt;
&lt;br /&gt;
==Arborescence d&#039;un nouveau module==&lt;br /&gt;
Voici l&#039;arborescence à respecter pour l&#039;organisation des fichiers d&#039;un module (cette arborescence sera celle prise d&#039;office si vous générer les fichiers à l&#039;aide de ModuleBuilder).&lt;br /&gt;
&lt;br /&gt;
{{TemplateModuleTreeSimple}}&lt;br /&gt;
&lt;br /&gt;
Un bon modèle/squelette de module externe Dolibarr est disponible ici : [https://github.com/Dolibarr/dolibarr/tree/develop/htdocs/modulebuilder/template GitHub Dolibarr Module Modèle]&lt;br /&gt;
&lt;br /&gt;
==Créer vos tables SQL et les classes PHP DAO (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : Si votre module a besoin de gérer des données qui lui sont propres&lt;br /&gt;
&lt;br /&gt;
===Créer vos fichiers .sql===&lt;br /&gt;
Si votre module a vocation à gérer des données bien à lui, qui n&#039;existent pas en base dans la version standard de Dolibarr, il est nécessaire de définir des tables SQL pour stocker ces données.&lt;br /&gt;
&lt;br /&gt;
Créer un sous-répertoire &#039;&#039;&#039;sql&#039;&#039;&#039; dans le répertoire de votre module (&#039;&#039;&#039;monmodule/sql&#039;&#039;&#039;) afin d&#039;y placer les scripts sql que vous allez créer (Avec ModuleBuilder cette étape sera réalisée automatiquement suite à la création d&#039;un nouvel Objet depuis l&#039;onglet Objet).&lt;br /&gt;
&lt;br /&gt;
Ensuite, vérifiez dans votre fichier descripteur de module, dans la fonction &#039;&#039;&#039;init&#039;&#039;&#039; que la ligne&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;$this-&amp;gt;_load_tables(&#039;/mymodule/sql/&#039;);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
n&#039;est pas commentée.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Règles à respecter:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Ajoutez les fichiers d&#039;ordre de création de vos tables sur le principe de 1 fichier par table, nommé &#039;&#039;&#039;llx_matable.sql&#039;&#039;&#039; (pour la table), accompagné éventuellement du fichier &#039;&#039;&#039;llx_matable.key.sql&#039;&#039;&#039; (pour les index ou clé étrangères). Voir les exemples dans les fichiers existants dans &#039;&#039;&#039;install/mysql/tables&#039;&#039;&#039; pour exemple.&lt;br /&gt;
*Les types et noms recommandés pour les champs SQL sont définis sur la page [[https://wiki.dolibarr.org/index.php/Langages_et_normes#R.C3.A8gles_de_codage_SQL]].&lt;br /&gt;
*Pour ce qui est des commandes permettant d&#039;ajouter/manipuler des données, elles doivent toutes se trouver dans un fichier nommé &#039;&#039;&#039;data.sql&#039;&#039;&#039; situé dans le même répertoire &#039;&#039;&#039;/monmodule/sql/&#039;&#039;&#039;.&lt;br /&gt;
*N&#039;utilisez pas &amp;quot;chaine&amp;quot; mais &#039;chaine&#039; car les guillemets doubles (&amp;quot;) ont une signification particulière en PostGreSQL&lt;br /&gt;
&lt;br /&gt;
Exemple de contenu de fichier data.sql&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
 delete from llx_const where name=&#039;MONMODULE_IT_WORKS&#039; and entity=&#039;__ENTITY__&#039;;&lt;br /&gt;
 insert into llx_const (name, value, type, note, visible, entity) values (&#039;MONMODULE_IT_WORKS&#039;,&#039;1&#039;,&#039;chaine&#039;,&#039;A constant for my module&#039;,1,&#039;__ENTITY__&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les ordres SQL des fichiers doivent être opérationnels pour la base de données &#039;&#039;&#039;mysql&#039;&#039;&#039;.&lt;br /&gt;
Rem: Les fichiers des autres types de bases ne sont pas à maintenir. Ils sont lus et convertis à la volée par le driver de la base de données.&lt;br /&gt;
&lt;br /&gt;
===Tester vos fichiers .sql===&lt;br /&gt;
&lt;br /&gt;
Une fois les fichiers prêts, vous pouvez retourner dans l&#039;écran de gestion des modules de Dolibarr puis désactiver le module, dropper les tables en base (si elles existent déjà) et réactiver le module.&lt;br /&gt;
Les tables doivent alors être recréées par l&#039;activation du module.&lt;br /&gt;
Si tel n&#039;est pas le cas, vérifiez vos scripts en les passant à la main, ou consultez les logs Dolibarr.&lt;br /&gt;
&lt;br /&gt;
===Générer la classe PHP DAO d&#039;accès aux tables===&lt;br /&gt;
&lt;br /&gt;
Le fichier de classe DAO PHP d&#039;un object est généré automatiquement avec ModuleBuilder lors de la création d&#039;un Object.&lt;br /&gt;
&lt;br /&gt;
À défaut d&#039;utiliser le générateur de module, vous trouverez des exemples dans le squelette de module, fichier &#039;&#039;&#039;htdocs/modulebuilder/templates/class/myobject.class.php&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Dans cette classe, se trouvent des méthodes CRUD (Create/Read/Update/Delete) déjà opérationnelles pour faire un insert, un fetch (select), un update, un delete d&#039;une ligne de la table. Éditer le fichier pour utiliser le bon nom de module, de tables et placer ce fichier dans le sous-répertoire de &#039;&#039;&#039;class&#039;&#039;&#039; du module. Le Module Builder permet de faire cela en quelques clics de souris.&lt;br /&gt;
&lt;br /&gt;
==Affichage des onglets (optionnel)==&lt;br /&gt;
&lt;br /&gt;
===Ajouter ou supprimer des onglets sur les fiches objets===&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : Pour ajouter votre propre onglet parmi les onglets d&#039;un object standard (facture, commande, proposition commercial, adhérent...)&lt;br /&gt;
&lt;br /&gt;
Pour cela, allez dans le fichier descripteur de module précédemment créé et modifiez le tableau $this-&amp;gt;tabs:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	// Array to add new pages in new tabs or remove existing one&lt;br /&gt;
	$this-&amp;gt;tabs = array(&#039;objecttype:+tabname1:Title1:mylangfile@monmodule:$user-&amp;gt;rights-&amp;gt;monmodule-&amp;gt;read:/monmodule/mapagetab1.php?id=__ID__&#039;    // To add a new tab identified by code tabname1&lt;br /&gt;
                            &#039;objecttype:+tabname2:Title2:mylangfile@monmodule:$user-&amp;gt;rights-&amp;gt;monmodule-&amp;gt;read:/monmodule/mapagetab2.php?id=__ID__&#039;,   // To add a new tab identified by code tabname2&lt;br /&gt;
                            &#039;objecttype:-tabname&#039;);                                                     // To remove an existing tab identified by code tabname&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le tableau doit contenir une liste de chaîne, chaque chaîne représentant un nouvel onglet.&lt;br /&gt;
Le format de la chaîne étant composé de 6 parties séparées par &amp;quot;:&amp;quot;&lt;br /&gt;
&lt;br /&gt;
*Partie 1 : le type d&#039;élément (objecttype) dans lequel doit apparaître l&#039;onglet qui est une valeur parmi celle-ci:&lt;br /&gt;
{{TemplateModuleTabs-fr}}&lt;br /&gt;
&lt;br /&gt;
*Partie 2 : nom de code pour l&#039;onglet à ajouter (commence par +) ou à enlever (commence par -)&lt;br /&gt;
*Partie 3 : le titre de l&#039;onglet. Cela peut être un libellé en dur ou mieux un code traduction présent dans un fichier lang.&lt;br /&gt;
*Partie 4 : le nom du fichier .lang (sans l&#039;extension .lang) qui contient la correspondance entre le code traduction et le libellé à afficher. Si ce com est suivi de @monmodule, Dolibarr cherche le fichier dans le répertoire lang propre au module, c&#039;est à dire htdocs/monmodule/langs/code_CODE/monmodule.lang, sinon Dolibarr cherche le fichier traduction dans htdocs/langs/code_CODE/mylangfile.lang&lt;br /&gt;
*Partie 5 : une condition à tester pour savoir si l&#039;onglet doit être visible ou pas. Mettre &#039;1&#039; pour qu&#039;il soit toujours visible.&lt;br /&gt;
*Partie 6 : l&#039;url de la page à afficher quand on clique sur l&#039;onglet. La chaine __ID__ sera remplacée automatiquement par l&#039;Id de l&#039;entité concernée.&lt;br /&gt;
&lt;br /&gt;
Pour que la déclaration soit effective, il faut désactiver et réactiver le module.&lt;br /&gt;
&lt;br /&gt;
Pour alimenter le contenu de l&#039;onglet avec des données issues de la base, voir le chapitre suivant.&lt;br /&gt;
&lt;br /&gt;
===Ajouter les onglets standard d&#039;un objet sur sa propre page d&#039;onglet===&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : Pour afficher les onglets existant d&#039;un objet standard (produit, tiers, etc.) sur votre nouvelle page onglet.&lt;br /&gt;
&lt;br /&gt;
Il faut appliquer la procédure suivante :&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Inclure les fichiers définissant les fonctions utiles dans vos fichiers&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Pour chaque fiche entité, il y a deux fichiers à inclure avec l&#039;instruction&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;require_once($url_fichier) ;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici quelques exemples de fichiers à inclure (DOL_DOCUMENT_ROOT correspond au dossier dolibarr/htdocs/) :&lt;br /&gt;
&lt;br /&gt;
*Entité tiers (thirdparty) :&lt;br /&gt;
**DOL_DOCUMENT_ROOT/societe/class/societe.class.php&lt;br /&gt;
**DOL_DOCUMENT_ROOT/core/lib/company.lib.php&lt;br /&gt;
*Entité produit (product) :&lt;br /&gt;
**DOL_DOCUMENT_ROOT/product/class/product.class.php&lt;br /&gt;
**DOL_DOCUMENT_ROOT/core/lib/product.lib.php&lt;br /&gt;
*Entité facture (invoice) :&lt;br /&gt;
**DOL_DOCUMENT_ROOT/compta/facture/facture.class.php&lt;br /&gt;
**DOL_DOCUMENT_ROOT/core/lib/invoice.lib.php&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Créer et charger l&#039;objet à afficher dans votre onglet&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Créez l&#039;objet de la classe voulue, et récupérez les données de l&#039;objet à partir de la base de données. Pour cela il faut utiliser les fonctions fetch() de la classe correspondante, en passant en paramètre l&#039;identifiant de l&#039;objet que vous récupérez depuis l&#039;url (ex : /mononglet.php?id=1).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Exemple :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$id=GETPOST(&#039;id&#039;,&#039;int&#039;);&lt;br /&gt;
$ref=GETPOST(&#039;ref&#039;,&#039;alpha&#039;);&lt;br /&gt;
$product = new Product($db) ;&lt;br /&gt;
$result = $product-&amp;gt;fetch($id, $ref) ; //Tester $result pour vérifier que l&#039;accès à la base s&#039;est bien passée&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3. Récupérer la liste des onglets correspondant à l&#039;entité choisie&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Utilisez la fonction XXX_prepare_head($obj), ou XXX est le nom de l&#039;entité, permettant de créer un tableau contenant les définitions des onglets à afficher. Le paramètre à passer est l&#039;objet pour lequel vous voulez afficher les onglets.&lt;br /&gt;
&lt;br /&gt;
Le tableau retourné est composé de la façon suivante :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$head        // Tableau des onglets&lt;br /&gt;
$head[$h]    // Élément décrivant un onglet. Il y aura autant de $h que d&#039;onglets à afficher&lt;br /&gt;
$head[$h][0] // Url de la page affichée quand on clique sur l&#039;onglet&lt;br /&gt;
$head[$h][1] // Titre de l’onglet&lt;br /&gt;
$head[$h][2] // Code de l&#039;onglet, à utiliser pour choisir quel onglet sera &#039;actif&#039; (voir paragraphe suivant)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Exemple :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$head = product_prepare_head($product, $user) ; //le paramètre $user n&#039;est pas présent sur certaines fonctions&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4. Afficher les onglets sur votre page onglet&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Utilisez la fonction dol_fiche_head() qui affiche les onglets contenus dans le tableau $head retourné par XX_prepare_head().&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
dol_fiche_head($links, $active=&#039;0&#039;, $title=&#039;&#039;, $notab=0, $picto=&#039;&#039;)&lt;br /&gt;
//$links  // Tableau des onglets, appelé $head plus haut.&lt;br /&gt;
//$active // Onglet actif (mettre le nom de l&#039;onglet défini dans votre fichier de module, ou un nom contenu dans $head[$h][2]). Cet onglet sera mis en surbrillance&lt;br /&gt;
//$title  // ?&lt;br /&gt;
//$notab  // Mettre ce paramètre à 1 permet de ne pas afficher de zone bleue en dessous des onglets.&lt;br /&gt;
//$picto  // Nom de l&#039;image à utiliser au début de la barre des onglet. Les choix suivant sont possibles :&lt;br /&gt;
//            product&lt;br /&gt;
//            service&lt;br /&gt;
//            company&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette fonction affiche les onglets voulus et ouvre un élément &#039;&#039;&amp;lt; div class=&amp;quot;&amp;quot; &amp;gt;&#039;&#039; qui correspond à la zone bleue sous les onglets (si paramètre $notab = 0). Pour fermer la zone bleue, il suffit de fermer l&#039;élément &#039;&#039;&amp;lt; /div &amp;gt;&#039;&#039; dans le code PHP.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Remarque&#039;&#039; :&lt;br /&gt;
Pour plus de détail, se référer à la [http://www.dolibarr.fr/doxygen/ documentation Doxygen] ou directement au code de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
==Créer vos pages écran PHP (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : Si l&#039;objet de votre module est d&#039;ajouter des fonctionnalités qui nécessitent de nouveaux écrans.&lt;br /&gt;
&lt;br /&gt;
===Créer une page écran PHP brute===&lt;br /&gt;
Vous pouvez ensuite créer vos pages PHP, qui se basent sur les données de vos tables, en utilisant les squelettes fournis comme exemple dans le répertoire &#039;&#039;&#039;modulebuilder&#039;&#039;&#039; (Pour le développement d&#039;un script en ligne de commande, voir [[Développement de scripts]]). La encore, si vous avez utilisez ModuleBuilder, des cas de pages (liste, page de création, onglet notes, etc...) auront été créés automatiquement lors de l&#039;initialisation de l&#039;objet.&lt;br /&gt;
&lt;br /&gt;
Pour créer une nouvelle page écran utilisateur, créez un sous-répertoire de &#039;&#039;&#039;htdocs&#039;&#039;&#039; (si non déjà fait) propre à votre module (Dans &#039;&#039;&#039;htdocs/monmodule&#039;&#039;&#039; par exemple) afin d&#039;y placer les pages que vous allez créer.&lt;br /&gt;
&lt;br /&gt;
Y recopier le fichier &#039;&#039;&#039;myobject_page.php&#039;&#039;&#039; qui va servir de point de départ.&lt;br /&gt;
Modifiez le fichier afin que le main.inc.php soit trouvé&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Load Dolibarr environment&lt;br /&gt;
$res=0;&lt;br /&gt;
// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined)&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; ! empty($_SERVER[&amp;quot;CONTEXT_DOCUMENT_ROOT&amp;quot;])) $res=@include($_SERVER[&amp;quot;CONTEXT_DOCUMENT_ROOT&amp;quot;].&amp;quot;/main.inc.php&amp;quot;);&lt;br /&gt;
// Try main.inc.php into web root detected using web root calculated from SCRIPT_FILENAME&lt;br /&gt;
$tmp=empty($_SERVER[&#039;SCRIPT_FILENAME&#039;])?&#039;&#039;:$_SERVER[&#039;SCRIPT_FILENAME&#039;];$tmp2=realpath(__FILE__); $i=strlen($tmp)-1; $j=strlen($tmp2)-1;&lt;br /&gt;
while($i &amp;gt; 0 &amp;amp;&amp;amp; $j &amp;gt; 0 &amp;amp;&amp;amp; isset($tmp[$i]) &amp;amp;&amp;amp; isset($tmp2[$j]) &amp;amp;&amp;amp; $tmp[$i]==$tmp2[$j]) { $i--; $j--; }&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; $i &amp;gt; 0 &amp;amp;&amp;amp; file_exists(substr($tmp, 0, ($i+1)).&amp;quot;/main.inc.php&amp;quot;)) $res=@include(substr($tmp, 0, ($i+1)).&amp;quot;/main.inc.php&amp;quot;);&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; $i &amp;gt; 0 &amp;amp;&amp;amp; file_exists(dirname(substr($tmp, 0, ($i+1))).&amp;quot;/main.inc.php&amp;quot;)) $res=@include(dirname(substr($tmp, 0, ($i+1))).&amp;quot;/main.inc.php&amp;quot;);&lt;br /&gt;
// Try main.inc.php using relative path&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; file_exists(&amp;quot;../main.inc.php&amp;quot;)) $res=@include(&amp;quot;../main.inc.php&amp;quot;);&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; file_exists(&amp;quot;../../main.inc.php&amp;quot;)) $res=@include(&amp;quot;../../main.inc.php&amp;quot;);&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; file_exists(&amp;quot;../../../main.inc.php&amp;quot;)) $res=@include(&amp;quot;../../../main.inc.php&amp;quot;);&lt;br /&gt;
if (! $res) die(&amp;quot;Include of main fails&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Comme vous pouvez le constater, plusieurs tentatives de chargement du fichier main.inc.php (ou master.inc.php) ont été tentées. Le but est de réussir dans le plus grand nombre de cas possibles. Le minimum est de 2 lignes: une pour essayer de charger le fichier master / main.inc.php dans le répertoire racine de dolibarr et une autre pour essayer de charger le fichier afin de prendre en charge le cas où le module est déployé dans le répertoire &amp;quot;custom&amp;quot;. Mais vous pouvez avoir à gérer plus de situations. L&#039;exemple fourni devrait pouvoir charger le fichier main / master.inc.php dans presque toutes les situations / configurations.&lt;br /&gt;
&lt;br /&gt;
Notez que vous pouvez ajouter plus &amp;quot;../&amp;quot; en fonction de la profondeur du fichier par rapport à l&#039;arborescence de votre module.&lt;br /&gt;
&lt;br /&gt;
C&#039;est dans le main qu&#039;est chargé l&#039;environnement technique ainsi que les habilitations. Les variables objets suivantes sont alors positionnées:&lt;br /&gt;
&lt;br /&gt;
*$user    L&#039;objet qui contient les caractéristiques de l&#039;utilisateur + ses droits.&lt;br /&gt;
*$conf    L&#039;objet qui contient la configuration de Dolibarr.&lt;br /&gt;
*$db      L&#039;objet qui contient le handler de connexion à la base de données.&lt;br /&gt;
*$langs   L&#039;objet qui contient la langue de l&#039;utilisateur.&lt;br /&gt;
&lt;br /&gt;
*L&#039;inclusion d&#039;une classe ou librairie dédiée au module, sans savoir d&#039;où le fichier sera appelé, se fait en utilisant une fonction de Dolibarr (et non en utilisant directement le include_once)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Exemple :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
dol_include_once(&#039;/monmodule/class/maclasse.class.php&#039;, &#039;MaClasse&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*L&#039;appel des classes fournies en standard avec Dolibarr se fera par contre par le require_once directe avec la syntaxe suivante:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Exemple :&#039;&#039;&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/doli.class.php&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La raison est que si le dol_include_once est pratique car il scanne chaque répertoire de chemin alternatif pour trouver le fichier, il est aussi moins performant car génère des accès et recherches disque à chaque appel (en effet, PHP intègre un cache des fichiers lus mais n&#039;intègre pas un cache des fichiers &amp;quot;non trouvés&amp;quot;. Et comme un fichier donné n&#039;est que dans une seule arborescence, il y a toujours une arborescence alternative où il ne se trouve pas et qui génère des accès superflus au disque dur, pénalisant en terme de performance. Comme pour les fichiers internes à Dolibarr, on connait toujours le chemin exacte, le require_once avec ce chemin direct doit être préféré).&lt;br /&gt;
&lt;br /&gt;
===Accès à la base===&lt;br /&gt;
Si vous avez besoin de réaliser des modifications en base dans votre propre table ajoutée, utilisez la classe générée plus haut qui contient les méthodes pour cela.&lt;br /&gt;
&lt;br /&gt;
Si toutefois vous voulez faire des accès dans des tables sans objet PHP dédié, ceci reste possible (par exemple pour récupérer une liste d&#039;enregistrement). Dans ce cas, pensez à suivre ces exemples:&lt;br /&gt;
&lt;br /&gt;
Pour un insert, update ou delete :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$db-&amp;gt;begin();   // Debut transaction&lt;br /&gt;
$db-&amp;gt;query(&amp;quot;Ma requete insert, update ou delete&amp;quot;);&lt;br /&gt;
$db-&amp;gt;commit();       // Valide&lt;br /&gt;
ou $db-&amp;gt;rollback()  // Annule&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour une lecture :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$resql=$db-&amp;gt;query(&amp;quot;Ma requete select&amp;quot;);&lt;br /&gt;
if ($resql)&lt;br /&gt;
{&lt;br /&gt;
	$num = $db-&amp;gt;num_rows($resql);&lt;br /&gt;
	$i = 0;&lt;br /&gt;
	if ($num)&lt;br /&gt;
	{&lt;br /&gt;
		while ($i &amp;lt; $num)&lt;br /&gt;
		{&lt;br /&gt;
			$obj = $db-&amp;gt;fetch_object($resql);&lt;br /&gt;
			if ($obj)&lt;br /&gt;
			{&lt;br /&gt;
				// You can use here results&lt;br /&gt;
				print $obj-&amp;gt;field1;&lt;br /&gt;
				print $obj-&amp;gt;field2;&lt;br /&gt;
			}&lt;br /&gt;
			$i++;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Définition du style===&lt;br /&gt;
Pour que le look de la page soit aligné avec le thème Dolibarr, il est nécessaire d&#039;utiliser les styles des CSS de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
Par exemple :&lt;br /&gt;
&lt;br /&gt;
*class=&amp;quot;&#039;&#039;&#039;liste_titre&#039;&#039;&#039;&amp;quot; sur les balises &#039;&#039;tr&#039;&#039; et &#039;&#039;td&#039;&#039; pour une ligne de titre de tableau.&lt;br /&gt;
*class=&amp;quot;&#039;&#039;&#039;pair&#039;&#039;&#039;&amp;quot; ou class=&amp;quot;&#039;&#039;&#039;impair&#039;&#039;&#039;&amp;quot; sur les balises &#039;&#039;tr&#039;&#039; et &#039;&#039;td&#039;&#039; des lignes de données de tableau.&lt;br /&gt;
*class=&amp;quot;&#039;&#039;&#039;flat&#039;&#039;&#039;&amp;quot; sur tous les champs de saisie (&#039;&#039;input, select, textarea&#039;&#039;...).&lt;br /&gt;
*class=&amp;quot;&#039;&#039;&#039;button&#039;&#039;&#039;&amp;quot; sur les objets de type &#039;&#039;input type=&amp;quot;submit&amp;quot;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Utilisez le sélecteur de date de Dolibarr===&lt;br /&gt;
Si vous le désirez, vous pouvez profiter du sélecteur de date dans des écrans Dolibarr. Pour cela, utilisez la ligne suivante:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$form=new Form($db);&lt;br /&gt;
$form-&amp;gt;select_date(&#039;&#039;,&#039;mykey&#039;,0,0,0,&amp;quot;myform&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La chaîne mykey identifie la zone date. Il faut y mettre une valeur différente s&#039;il y a plusieurs zones.&lt;br /&gt;
La chaine myform est le nom de la zone FORM (dans form name=&amp;quot;myform&amp;quot; de la page HTML).&lt;br /&gt;
L&#039;affichage d&#039;un sélecteur de date doit donc être intégré dans une zone FORM Html.&lt;br /&gt;
&lt;br /&gt;
Pour récupérer la valeur, à l&#039;issu du POST, la commande est:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$mydate = dol_mktime(12, 0 , 0, GETPOST(&#039;mykeymonth&#039;, &#039;int&#039;), GETPOST(&#039;mykeyday&#039;, &#039;int&#039;), GETPOST(&#039;mykeyyear&#039;, &#039;int&#039;));&lt;br /&gt;
print strftime(&#039;%A %d %B %Y&#039;, $mydate);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Définir votre page de configuration (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : si votre module offre plusieurs options paramétrables.&lt;br /&gt;
&lt;br /&gt;
===Créez votre page d&#039;édition de configuration===&lt;br /&gt;
Si votre module offre plusieurs options paramétrables, il est nécessaire de créer une page PHP pour éditer les options (qui sont stockées dans la [[Table llx_const|table &#039;&#039;&#039;llx_const&#039;&#039;&#039;]]).&lt;br /&gt;
Créez une page PHP nommée &#039;&#039;&#039;monmodule_setupapage.php&#039;&#039;&#039; qui affiche les options possibles et les met à jour.&lt;br /&gt;
Il est nécessaire de prendre exemple sur une page dans &#039;&#039;&#039;/admin&#039;&#039;&#039; qui vous montre la méthode pour lire ou sauvegarder en base votre option.&lt;br /&gt;
Placez cette page de configuration dans le répertoire &#039;&#039;&#039;/admin&#039;&#039;&#039; également.&lt;br /&gt;
Ensuite dans le descripteur de module, modifiez la variable pour indiquer le nom de cette page PHP (sans le chemin qui n&#039;est pas nécessaire, la page étant forcément dans le rep admin).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;config_page_url = array(&amp;quot;setup.php@mymodule&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Testez votre page===&lt;br /&gt;
Allez sur la page &#039;&#039;&#039;Configuration-&amp;gt;module&#039;&#039;&#039;, vous devez voir apparaître une icône qui permet d&#039;accéder à la page de configuration et vous devez être capable de modifier ces options et les voir conservées en base.&lt;br /&gt;
&lt;br /&gt;
==Définir vos entrées de menu (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : si vous avez créé des pages PHP, il est nécessaire que ces écrans soient accessibles depuis le menu Dolibarr.&lt;br /&gt;
&lt;br /&gt;
===Définissez vos entrées menus===&lt;br /&gt;
Pour cela, il vous faut définir dans le fichier descripteur de module, le tableau this-&amp;gt;menu qui déclare les menus.&lt;br /&gt;
Ce tableau contient toutes les entrées qui apparaîtront dans les menus une fois le module activé.&lt;br /&gt;
Le fichier de descripteur de module exemple &#039;&#039;&#039;modMonModule.class.php&#039;&#039;&#039; possède un exemple de déclaration de menu haut ainsi que de ses entrées menu gauche associées.&lt;br /&gt;
&lt;br /&gt;
Voici un exemple de déclaration d&#039;entrées de menu dans le fichier descripteur:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Main menu entries&lt;br /&gt;
$this-&amp;gt;menu = array();			// List of menus to add&lt;br /&gt;
$r=0;&lt;br /&gt;
&lt;br /&gt;
// Add here entries to declare new menus&lt;br /&gt;
// Example to declare the Top Menu entry:&lt;br /&gt;
$this-&amp;gt;menu[$r]=array(	&#039;fk_menu&#039;=&amp;gt;0,			// Put 0 if this is a top menu&lt;br /&gt;
			&#039;type&#039;=&amp;gt;&#039;top&#039;,			// This is a Top menu entry&lt;br /&gt;
			&#039;titre&#039;=&amp;gt;&#039;MonModule top menu&#039;,&lt;br /&gt;
			&#039;mainmenu&#039;=&amp;gt;&#039;monmodule&#039;,&lt;br /&gt;
			&#039;leftmenu&#039;=&amp;gt;&#039;monmodule&#039;,&lt;br /&gt;
			&#039;url&#039;=&amp;gt;&#039;/monmodule/pagetop.php&#039;,&lt;br /&gt;
			&#039;langs&#039;=&amp;gt;&#039;mylangfile&#039;,	// Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.&lt;br /&gt;
			&#039;position&#039;=&amp;gt;100,&lt;br /&gt;
			&#039;enabled&#039;=&amp;gt;&#039;1&#039;,			// Define condition to show or hide menu entry. Use &#039;$conf-&amp;gt;monmodule-&amp;gt;enabled&#039; if entry must be visible if module is enabled.&lt;br /&gt;
			&#039;perms&#039;=&amp;gt;&#039;1&#039;,			// Use &#039;perms&#039;=&amp;gt;&#039;$user-&amp;gt;rights-&amp;gt;monmodule-&amp;gt;level1-&amp;gt;level2&#039; if you want your menu with a permission rules&lt;br /&gt;
			&#039;target&#039;=&amp;gt;&#039;&#039;,&lt;br /&gt;
			&#039;user&#039;=&amp;gt;2);				// 0=Menu for internal users, 1=external users, 2=both&lt;br /&gt;
$r++;&lt;br /&gt;
&lt;br /&gt;
// Example to declare a Left Menu entry:&lt;br /&gt;
$this-&amp;gt;menu[$r]=array(	&#039;fk_menu&#039;=&amp;gt;&#039;fk_mainmenu=xxx&#039;,	// Use &#039;fk_mainmenu=xxx&#039; or &#039;fk_mainmenu=xxx,fk_leftmenu=yyy&#039; where xxx is mainmenucode and yyy is a leftmenucode of parent menu&lt;br /&gt;
			&#039;type&#039;=&amp;gt;&#039;left&#039;,			// This is a Left menu entry&lt;br /&gt;
			&#039;titre&#039;=&amp;gt;&#039;MonModule left menu 1&#039;,&lt;br /&gt;
			&#039;mainmenu&#039;=&amp;gt;&#039;xxx&#039;,&lt;br /&gt;
                        &#039;leftmenu&#039;=&amp;gt;&#039;yyy&#039;,&lt;br /&gt;
			&#039;url&#039;=&amp;gt;&#039;/monmodule/pagelevel1.php&#039;,&lt;br /&gt;
			&#039;langs&#039;=&amp;gt;&#039;mylangfile&#039;,	// Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.&lt;br /&gt;
			&#039;position&#039;=&amp;gt;100,&lt;br /&gt;
			&#039;enabled&#039;=&amp;gt;&#039;1&#039;,			// Define condition to show or hide menu entry. Use &#039;$conf-&amp;gt;monmodule-&amp;gt;enabled&#039; if entry must be visible if module is enabled.&lt;br /&gt;
			&#039;perms&#039;=&amp;gt;&#039;1&#039;,			// Use &#039;perms&#039;=&amp;gt;&#039;$user-&amp;gt;rights-&amp;gt;monmodule-&amp;gt;level1-&amp;gt;level2&#039; if you want your menu with a permission rules&lt;br /&gt;
			&#039;target&#039;=&amp;gt;&#039;&#039;,&lt;br /&gt;
			&#039;user&#039;=&amp;gt;2);				// 0=Menu for internal users,1=external users, 2=both&lt;br /&gt;
$r++;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour conditionner l&#039;accès au menu selon des permission, modifier la propriété &#039;&#039;&#039;perms&#039;&#039;&#039; du tableau. Voir le chapitre sur les permissions un peu plus loin pour savoir comment ajouter des permissions.&lt;br /&gt;
&lt;br /&gt;
===Testez vos entrées menus===&lt;br /&gt;
Désactiver et réactiver votre module sous Dolibarr, les entrées menus doivent alors apparaître (si la condition dans &#039;enabled&#039; est vraie).&lt;br /&gt;
&lt;br /&gt;
==Définir vos propres permissions (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : Si vous voulez ajouter de nouvelles permissions.&lt;br /&gt;
&lt;br /&gt;
La définition des permissions que gérera votre module se fait dans le fichier descripteur créé dans la première étape.&lt;br /&gt;
Modifier la ligne &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;rights_class = &#039;monmodule&#039;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
pour y mettre la bonne valeur de monmodule.&lt;br /&gt;
&lt;br /&gt;
Ensuite remplissez le tableau $this-&amp;gt;rights avec autant d&#039;entrées que de permissions différentes à gérer.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;rights[$r][0] = 10001;&lt;br /&gt;
$this-&amp;gt;rights[$r][1] = &#039;Libelle par défaut de ma permission&#039;;&lt;br /&gt;
$this-&amp;gt;rights[$r][3] = 1;&lt;br /&gt;
$this-&amp;gt;rights[$r][4] = &#039;action&#039;;&lt;br /&gt;
$this-&amp;gt;rights[$r][5] = &#039;sousaction&#039;;&lt;br /&gt;
$r++;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans $this-&amp;gt;rights[$r][0], mettre un id de permission non déjà pris (Voir dans le menu &#039;&#039;&#039;Infos Système&#039;&#039;&#039; sur une installation de Dolibarr opérationnelle pour connaître les id déjà utilisés.&lt;br /&gt;
Dans $this-&amp;gt;rights[$r][3], mettre 1 si cette permission est attribué d&#039;office par défaut quand un utilisateur est créé.&lt;br /&gt;
Dans $this-&amp;gt;rights[$r][1], mettre un libellé par défaut (il sera affiché si aucune traduction n&#039;est trouvé pour votre permission dans le fichier &#039;&#039;&#039;admin.lang&#039;&#039;&#039;. La clé de traduction dit être &amp;quot;Permission10001=Description de ma super permission&#039;&#039;&#039;&amp;quot;&#039;&#039;&#039;).&lt;br /&gt;
Dans $this-&amp;gt;rights[$r][4] et $this-&amp;gt;rights[$r][5], mettre une chaîne action et sous action sans espace. Vous pourrez alors tester dans le code PHP si un utilisateurs a bien les droits par la séquence suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
if ($user-&amp;gt;rights-&amp;gt;monmodule-&amp;gt;action-&amp;gt;sousaction) ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Définir vos propres box/widgets (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : si votre module amène avec lui une ou plusieurs Boxes.&lt;br /&gt;
&lt;br /&gt;
===Définissez vos box===&lt;br /&gt;
Pour cela, modifiez les tableaux $this-&amp;gt;boxes du fichier descripteur de module.&lt;br /&gt;
Il suffit d&#039;ajouter 2 lignes par fichier box que vous allez créer dans le répertoire &#039;&#039;&#039;htdocs/monmodule/core/boxes&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Exemple :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;boxes[0][&#039;file&#039;]=&#039;mabox0.php@monmodule&#039;&lt;br /&gt;
$this-&amp;gt;boxes[0][&#039;note&#039;]=&#039;Ma box 0&#039;&lt;br /&gt;
 ...&lt;br /&gt;
$this-&amp;gt;boxes[n][&#039;file&#039;]=&#039;maboxn.php@monmodule&#039;&lt;br /&gt;
$this-&amp;gt;boxes[n][&#039;note&#039;]=&#039;Ma box n&#039;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite créez les fichiers &#039;&#039;&#039;htdocs/monmodule/core/boxes/mabox0.php&#039;&#039;&#039;, &#039;&#039;&#039;htdocs/monmodule/core/boxes/mabox1.php&#039;&#039;&#039;... en prenant exemple sur des box existantes (exemple dans le répertoire &#039;&#039;&#039;htdocs/core/boxes&#039;&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
===Testez la présence de vos box dans Dolibarr===&lt;br /&gt;
Désactivez et réactivez le module.&lt;br /&gt;
&lt;br /&gt;
Allez dans le menu &#039;&#039;&#039;Accueil - Configuration - Boite&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Vos box doivent apparaître dans la liste des box activables. Activez les puis allez sur la page d&#039;accueil et vérifiez qu&#039;elles s&#039;affichent correctement.&lt;br /&gt;
&lt;br /&gt;
==Définir vos propres exports (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : si votre module amène avec lui des exports prédéfinis de données (pour ces propres tables ou des tables déjà existantes d&#039;un autre module de Dolibarr).&lt;br /&gt;
&lt;br /&gt;
===Définissez l&#039;export===&lt;br /&gt;
Pour cela, décommentez et modifiez les tableaux $this-&amp;gt;export_xxx du votre fichier descripteur de module.&lt;br /&gt;
&lt;br /&gt;
===Testez votre export===&lt;br /&gt;
Allez dans le menu outils -&amp;gt; export de Dolibarr. Votre export doit apparaitre dans la liste des exports prédéfinis disponibles (si votre module est bien activé).&lt;br /&gt;
Le choisir, vous devez alors voir les champs possibles définis dans le tableau à l&#039;étape précédente.&lt;br /&gt;
Choissez quelques champs et tentez une génération du fichier export.&lt;br /&gt;
&lt;br /&gt;
==Définir vos styles CSS (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : lorsque dans vos écrans PHP, vous utiliser des classes de styles qui ne sont pas celle des thèmes de Dolibarr (non recommandé).&lt;br /&gt;
&lt;br /&gt;
Cette fonctionnalité est décrite mais pas encore opérationnel en 2.4&lt;br /&gt;
&lt;br /&gt;
===Créez et déclarez votre feuille de style===&lt;br /&gt;
Créez un fichier de style css nommé &#039;&#039;&#039;monmodule.css&#039;&#039;&#039; ou &#039;&#039;&#039;monmodule.css.php&#039;&#039;&#039; et placez le dans le répertoire &#039;&#039;&#039;&#039;&#039;monmodule&#039;&#039;&#039;&#039;&#039; dans &#039;&#039;&#039;htdocs&#039;&#039;&#039;. Il ne peut y avoir qu&#039;un fichier css propre à chaque module.&lt;br /&gt;
Rappelons qu&#039;il vaut mieux utiliser les styles déjà existant de Dolibarr (le fichier css utilisé par Dolibarr étant le fichier &#039;&#039;&#039;themes/nomtheme/&#039;&#039;nomtheme&#039;&#039;.css.php&#039;&#039;&#039;). Ne créez un fichier css propre à votre module que si vous devez absolument gérer des styles non déjà existants.&lt;br /&gt;
Une fois votre feuille de style prête, déclarez la dans votre fichier descripteur de module en modifiant la propriété &#039;&#039;&#039;$this-&amp;gt;module_parts&#039;&#039;&#039;.&lt;br /&gt;
La valeur à renseigner ici doit être le chemin relatif de l&#039;URL de votre fichier css.&lt;br /&gt;
Par exemple&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;module_parts = array(&#039;css&#039; =&amp;gt; array(&#039;/monmodule/css/monmodule.css.php&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Testez votre feuille de style===&lt;br /&gt;
Désactivez et réactivez votre module.&lt;br /&gt;
&lt;br /&gt;
Appelez la page d&#039;accueil de Dolibarr. Affichez la source de la page HTML.&lt;br /&gt;
&lt;br /&gt;
Vous devriez voir dans l&#039;entête HTML, une ligne déclarant votre feuille de style.&lt;br /&gt;
&lt;br /&gt;
==Définir vos fonctions Javascript (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : lorsque dans vos écrans PHP, vous utiliser des fonctions javascript non dispo en standard (fichier lib_head.js)&lt;br /&gt;
&lt;br /&gt;
Si dans vos écrans PHP, vous utilisez des fonctions javascript, il est nécessaire de faire en sorte que vos fonctions déclarées dans un fichier javascript &#039;&#039;&#039;htdocs/monmodule/js/monmodule.js&#039;&#039;&#039; soit chargées dans l&#039;entête head html.&lt;br /&gt;
Pour demander à Dolibarr qui gère la génération de la section header d&#039;inclure un de vos fichiers javascript, il est nécessaire de fournir en paramètre de la fonction llxHeader() appelée au début de votre page, d&#039;inclure le paramètre qui contient l&#039;URL vers le js à inclure.&lt;br /&gt;
&lt;br /&gt;
Exemple pour la page /htdocs/monmodule/mapage.php :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
require(&#039;../main.inc.php&#039;);&lt;br /&gt;
$morejs=array(&amp;quot;/monmodule/js/monmodule.js&amp;quot;);&lt;br /&gt;
llxHeader(&#039;&#039;,&#039;Titre&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,$morejs,&#039;&#039;,0,0); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Déclencher du code sur un évènement Dolibarr (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : lorsque vous voulez que des actions particulières s&#039;exécutent suite au déclenchement d&#039;actions standards de Dolibarr (exemple : je veux mettre à jour une table de mon module quand une facture se crée dans Dolibarr), il vous faut créer un fichier de &#039;&#039;&#039;triggers&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Voir aussi [[Interfaces_Dolibarr_vers_exterieur|Interfaces de Dolibarr vers l&#039;exterieur]]&lt;br /&gt;
et [[Interfaces_Exterieur_vers_Dolibarr|Interfaces exterieures vers Dolibarr]]&lt;br /&gt;
&lt;br /&gt;
==Insérer votre code aux emplacement hooks de Dolibarr (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : lorsque vous voulez modifier ou ajouter du code autrement que lors d&#039;un événement métier (voir le chapitre précédent pour cela).&lt;br /&gt;
&lt;br /&gt;
Voir la page [[Système de Hooks]].&lt;br /&gt;
&lt;br /&gt;
==Ajouter un module de numérotation (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : lorsque vous voulez ajouter une règle de numérotation non couverte par les modules par défaut.&lt;br /&gt;
&lt;br /&gt;
Voir la page [[Créer un module de numérotation]].&lt;br /&gt;
&lt;br /&gt;
==Ajouter un nouveau modèle de document (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : lorsque vous voulez ajouter un nouveau modèle de document.&lt;br /&gt;
&lt;br /&gt;
La documentation au sujet de la génération de documents depuis des modèles est disponible sur la page [[Créer un modèle de document PDF]] ou [[Créer un modèle de document ODT]].&lt;br /&gt;
&lt;br /&gt;
==Ajouter un thème (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039;: Lorsque vous voulez une interface aux couleurs personnalisées à votre cas.&lt;br /&gt;
&lt;br /&gt;
Voir la page [[Themes]].&lt;br /&gt;
&lt;br /&gt;
==Ajouter un bouton (optionnel)==&lt;br /&gt;
Si vous souhaitez ajouter des boutons à vos enregistrements.&lt;br /&gt;
&lt;br /&gt;
Voir la page [[Création de boutons]].&lt;br /&gt;
&lt;br /&gt;
=[[File:Art.png]] Quelques règles de codage et fonctions pour développeurs=&lt;br /&gt;
Les règles de codage à suivre sont définis dans la [[Documentation Développeur|Documentation développeur]], rubrique &amp;quot;Informations Générales - Langage et normes de développement&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
De nombreuses fonctions prédéfinies pour les développeurs sont disponibles et décrites sur la page [[Documentation Développeur|Documentation développeur]] sous la section &amp;quot;Les couches techniques de Dolibarr&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=[[File:Art.png]] Créer un package pour livrer et installer votre module=&lt;br /&gt;
Cette procédure doit être utilisée pour fabriquer un package afin de le soumettre sur la place de marché http://www.dolistore.com.&lt;br /&gt;
Mais vous pouvez aussi l&#039;utiliser pour distribuer facillement votre module via votre propre réseau de distribution.&lt;br /&gt;
&lt;br /&gt;
*Allez dans le répertoire &#039;&#039;&#039;/build&#039;&#039;&#039; et recopiez le fichier &#039;&#039;&#039;makepack-dolibarrmodules.conf&#039;&#039;&#039; en &#039;&#039;&#039;makepack-monmodule.conf&#039;&#039;&#039;. Attention, ce répertoire peut ne pas être fourni dans les packages de versions stables. Si c&#039;est le cas, il peut être récupéré dans le snapshot disponible en téléchargement sur le site web Dolibarr dans la rubrique Version de développement (prenez dans ce cas tout le répertoire build qui est un répertoire autonome et indépendant de la version).&lt;br /&gt;
&lt;br /&gt;
Saisissez dans ce fichier la liste des noms des nouveaux fichiers que vous avez créé pour votre module (descripteur de module, nouveaux fichiers sql de tables, page php, images, etc...)&lt;br /&gt;
&lt;br /&gt;
*Lancer le script via Perl (besoin de la version Perl 5.0 ou +):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
perl makepack-dolibarrmodule.pl&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Le script vous demande le nom de votre module, sa version majeure et mineure.&lt;br /&gt;
Un fichier &#039;&#039;&#039;monmodule.zip&#039;&#039;&#039; va alors être fabriqué contenant votre module prêt pour être déployé.&lt;br /&gt;
&lt;br /&gt;
*La personne qui reçoit votre module doit alors placer le fichier dans son répertoire racine d&#039;installation de Dolibarr et réaliser la commande :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tar -xvf monmodule.zip&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Si vous désirez que votre module profite à tous, vous pouvez le soumettre (le fichier zip) sur la place de marché des modules complémentaires: {{LinkToPluginDownload}} (vous devez avoir créé un compte auparavant et utiliser le lien &amp;quot;Soumettre un module/produit&amp;quot;).&lt;br /&gt;
**Si votre module a été fabriqué correctement, le fichier sera validé rapidement.&lt;br /&gt;
**Si la qualité est suffisante, que la licence le permet et que la fonctionnalité du module s&#039;avère être d&#039;un intérêt général, le code pourra être ajouté au code source de Dolibarr (sauf si vous ne le désirez pas).&lt;br /&gt;
&lt;br /&gt;
=[[File:Art.png]] Dépôt et validation du module externe sur Dolistore=&lt;br /&gt;
&lt;br /&gt;
Voir [[Module_Dolistore_Validation_Regles|Règles de Validation]]&lt;/div&gt;</summary>
		<author><name>Kusco</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=D%C3%A9veloppement_module&amp;diff=58820</id>
		<title>Développement module</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=D%C3%A9veloppement_module&amp;diff=58820"/>
		<updated>2023-11-21T11:56:51Z</updated>

		<summary type="html">&lt;p&gt;Kusco: Ajout des boutons&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_development --&amp;gt;&lt;br /&gt;
[[en:Module_development]]&lt;br /&gt;
[[es:Desarrollo_de_un_módulo]]&lt;br /&gt;
[[de:Modul_Entwicklung]]&lt;br /&gt;
[[zh:模块开发]]&lt;br /&gt;
[[ja:モジュール_開発]]&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;
Pour créer un nouveau module, il existe plusieurs étapes. Ce didacticiel a pour but de vous décrire chacune d&#039;elles afin d&#039;ajouter un module permettant d&#039;étendre les possibilités de Dolibarr, comme par exemple ajouter une ou plusieurs des fonctionnalités suivantes:&lt;br /&gt;
&lt;br /&gt;
*Ajouter de nouvelles tables en base.&lt;br /&gt;
*Ajouter vos propres entrées dans les menus.&lt;br /&gt;
*Ajouter des objets et des écrans de saisie/consultation de nouvelle tables.&lt;br /&gt;
*Ajouter ou supprimer des onglets sur les pages de vues/édition des objets (facture, produit, commande, événement, ...)&lt;br /&gt;
*Ajouter des exports prédéfinis pour la fonction export.&lt;br /&gt;
*Ajouter de nouvelles boites/widgets pour la home page.&lt;br /&gt;
*Ajouter des variables de substitution.&lt;br /&gt;
*Définir de nouvelles permissions.&lt;br /&gt;
*Déclencher du code automatiquement sur une action Dolibarr particulière.&lt;br /&gt;
*Insérer votre code aux emplacements hooks de Dolibarr&lt;br /&gt;
*Ajouter un modèle de numérotation de la référence des objets créés.&lt;br /&gt;
*Ajouter un modèle de document PDF.&lt;br /&gt;
*Ajouter un nouveau thème.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les chapitres suivants vous présentent comment réaliser tout cela en manuel de manière simple.&lt;br /&gt;
&lt;br /&gt;
=[[File:Art.png]] Création de Module avec le générateur de module=&lt;br /&gt;
Depuis Dolibarr 9.0 il est possible de créer les fichiers principaux de votre module avec le &amp;quot;Générateur de module&amp;quot; (aussi appelé &amp;quot;Module Builder&amp;quot;). Pour l&#039;activer :&lt;br /&gt;
&lt;br /&gt;
*Activez le module &amp;quot;Générateur de Module&amp;quot; (ou &amp;quot;Module builder&amp;quot;) dans la section &amp;quot;Outils multi-modules&amp;quot; de Configuration &amp;gt; Modules/Applications&lt;br /&gt;
&lt;br /&gt;
[[File:Mod_builder_2.png|400px]]&lt;br /&gt;
&lt;br /&gt;
*Puis cliquez sur l’icône &amp;quot;bug&amp;quot; qui est apparue dans la barre de menu en haut à droite&lt;br /&gt;
&lt;br /&gt;
[[File:Mod_builder_3.png|400px]]&lt;br /&gt;
&lt;br /&gt;
=[[File:Art.png]] Exemple de modèle de module externe=&lt;br /&gt;
Un bon modèle/squelette de module externe Dolibarr est disponible ici : [https://github.com/Dolibarr/dolibarr/tree/develop/htdocs/modulebuilder/template GitHub Dolibarr Module Modèle]&lt;br /&gt;
&lt;br /&gt;
=[[File:Art.png]] Créer un module=&lt;br /&gt;
Les sous chapitres suivant décrivent les actions à faire pour créer un module Dolibarr. Les premiers chapitres sont obligatoires quelle que soit la vocation du module, les suivants dépendront de ce que doit faire le module.&lt;br /&gt;
&lt;br /&gt;
==Créer un descripteur de Module (obligatoire)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : Obligatoire dès qu&#039;une extension est développée, quelle que soit sa vocation.&lt;br /&gt;
&#039;&#039;&#039;Depuis Dolibarr 9.0, il est possible de créer le descripteur de votre module avec le &amp;quot;Générateur de module&amp;quot;&#039;&#039;&#039;. Cet outil est encore encours de développement et de maturité mais peut d&#039;ores et déjà être utilisé.&lt;br /&gt;
&lt;br /&gt;
===Créer votre descripteur avec le générateur de module===&lt;br /&gt;
&lt;br /&gt;
*Lancez le générateur de module en cliquant sur l’icône &amp;quot;bug&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[File:Mod_builder_3.png|400px]]&lt;br /&gt;
&lt;br /&gt;
*Entrez le nom de votre module sans espaces (le nom de votre module NE DOIT PAS CONTENIR le caractère underscore ou tiret bas : _) et cliquez sur Créer.&lt;br /&gt;
&lt;br /&gt;
[[File:Mod_builder_4.png|400px]]&lt;br /&gt;
&lt;br /&gt;
*Un module avec ses premiers fichiers a été initialisé. Vous pouvez alors modifier les paramètres du descripteur du module :&lt;br /&gt;
&lt;br /&gt;
[[File:Mod_builder_5.png|400px]]&lt;br /&gt;
&lt;br /&gt;
===Alternative : créer votre descripteur manuellement (sans utiliser le générateur de module)===&lt;br /&gt;
La première étape est donc de créer un fichier de description du module (descripteur). Pour cela:&lt;br /&gt;
&lt;br /&gt;
*Créez le répertoire &#039;&#039;&#039;/htdocs/&#039;&#039;monmodule&#039;&#039;/core/modules&#039;&#039;&#039;. Puis, allez dans le répertoire &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039; et recopiez le fichier modMyModule.class.php dans ce répertoire &#039;&#039;&#039;htdocs/&#039;&#039;monmodule&#039;&#039;/core/modules&#039;&#039;&#039;.&lt;br /&gt;
*Renommez le fichier mod&#039;&#039;&#039;MyModule&#039;&#039;&#039;.class.php en modifiant seulement la partie &#039;&#039;&#039;MyModule&#039;&#039;&#039; (le fichier doit commencer par mod)&lt;br /&gt;
&lt;br /&gt;
Ensuite, modifiez le contenu de ce fichier afin de remplacer :&lt;br /&gt;
&lt;br /&gt;
*les &#039;&#039;modMyModule&#039;&#039; en une valeur qui corresponde à la vocation de votre module. Cette valeur doit toujours commencer par &#039;&amp;lt;nowiki/&amp;gt;&#039;&#039;&#039;mod&#039;&#039;&#039;&#039; et ne contenir que des &#039;&#039;&#039;caractères alphabétiques&#039;&#039;&#039;.&lt;br /&gt;
*$this-&amp;gt;numero = &#039;&#039;100000&#039;&#039; par un numéro de module libre. Pour éviter tout conflit, vous pouvez consulter la page suivante pour retrouver les numéros déjà alloués : [[List of modules id|Liste des id de modules]].&lt;br /&gt;
*Modifier éventuellement les autres variables définies dans le constructeurs (Voir le commentaire dans le code du squelette pour leur signification).&lt;br /&gt;
&lt;br /&gt;
Le descripteur de votre module est alors en place.&lt;br /&gt;
&lt;br /&gt;
===Tester votre descripteur===&lt;br /&gt;
&lt;br /&gt;
Lancez Dolibarr et allez sur la page &#039;&#039;&#039;Configuration-&amp;gt;module&#039;&#039;&#039;, vous devez voir apparaître une nouvelle ligne avec votre nouveau module et la possibilité de l&#039;activer ou non (parcourez tous les onglets de chaque catégories de modules jusqu&#039;à le retrouver).&lt;br /&gt;
C&#039;est la valeur de $this-&amp;gt;special qui détermine dans quel onglet se trouve votre module.&lt;br /&gt;
&lt;br /&gt;
===Nom de module===&lt;br /&gt;
&lt;br /&gt;
Le nom de votre module NE DOIT PAS CONTENIR le caractère underscore ou tiret bas : _&lt;br /&gt;
&lt;br /&gt;
==Arborescence d&#039;un nouveau module==&lt;br /&gt;
Voici l&#039;arborescence à respecter pour l&#039;organisation des fichiers d&#039;un module (cette arborescence sera celle prise d&#039;office si vous générer les fichiers à l&#039;aide de ModuleBuilder).&lt;br /&gt;
&lt;br /&gt;
{{TemplateModuleTreeSimple}}&lt;br /&gt;
&lt;br /&gt;
Un bon modèle/squelette de module externe Dolibarr est disponible ici : [https://github.com/Dolibarr/dolibarr/tree/develop/htdocs/modulebuilder/template GitHub Dolibarr Module Modèle]&lt;br /&gt;
&lt;br /&gt;
==Créer vos tables SQL et les classes PHP DAO (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : Si votre module a besoin de gérer des données qui lui sont propres&lt;br /&gt;
&lt;br /&gt;
===Créer vos fichiers .sql===&lt;br /&gt;
Si votre module a vocation à gérer des données bien à lui, qui n&#039;existent pas en base dans la version standard de Dolibarr, il est nécessaire de définir des tables SQL pour stocker ces données.&lt;br /&gt;
&lt;br /&gt;
Créer un sous-répertoire &#039;&#039;&#039;sql&#039;&#039;&#039; dans le répertoire de votre module (&#039;&#039;&#039;monmodule/sql&#039;&#039;&#039;) afin d&#039;y placer les scripts sql que vous allez créer (Avec ModuleBuilder cette étape sera réalisée automatiquement suite à la création d&#039;un nouvel Objet depuis l&#039;onglet Objet).&lt;br /&gt;
&lt;br /&gt;
Ensuite, vérifiez dans votre fichier descripteur de module, dans la fonction &#039;&#039;&#039;init&#039;&#039;&#039; que la ligne&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;$this-&amp;gt;_load_tables(&#039;/mymodule/sql/&#039;);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
n&#039;est pas commentée.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Règles à respecter:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Ajoutez les fichiers d&#039;ordre de création de vos tables sur le principe de 1 fichier par table, nommé &#039;&#039;&#039;llx_matable.sql&#039;&#039;&#039; (pour la table), accompagné éventuellement du fichier &#039;&#039;&#039;llx_matable.key.sql&#039;&#039;&#039; (pour les index ou clé étrangères). Voir les exemples dans les fichiers existants dans &#039;&#039;&#039;install/mysql/tables&#039;&#039;&#039; pour exemple.&lt;br /&gt;
*Les types et noms recommandés pour les champs SQL sont définis sur la page [[https://wiki.dolibarr.org/index.php/Langages_et_normes#R.C3.A8gles_de_codage_SQL]].&lt;br /&gt;
*Pour ce qui est des commandes permettant d&#039;ajouter/manipuler des données, elles doivent toutes se trouver dans un fichier nommé &#039;&#039;&#039;data.sql&#039;&#039;&#039; situé dans le même répertoire &#039;&#039;&#039;/monmodule/sql/&#039;&#039;&#039;.&lt;br /&gt;
*N&#039;utilisez pas &amp;quot;chaine&amp;quot; mais &#039;chaine&#039; car les guillemets doubles (&amp;quot;) ont une signification particulière en PostGreSQL&lt;br /&gt;
&lt;br /&gt;
Exemple de contenu de fichier data.sql&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
 delete from llx_const where name=&#039;MONMODULE_IT_WORKS&#039; and entity=&#039;__ENTITY__&#039;;&lt;br /&gt;
 insert into llx_const (name, value, type, note, visible, entity) values (&#039;MONMODULE_IT_WORKS&#039;,&#039;1&#039;,&#039;chaine&#039;,&#039;A constant for my module&#039;,1,&#039;__ENTITY__&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les ordres SQL des fichiers doivent être opérationnels pour la base de données &#039;&#039;&#039;mysql&#039;&#039;&#039;.&lt;br /&gt;
Rem: Les fichiers des autres types de bases ne sont pas à maintenir. Ils sont lus et convertis à la volée par le driver de la base de données.&lt;br /&gt;
&lt;br /&gt;
===Tester vos fichiers .sql===&lt;br /&gt;
&lt;br /&gt;
Une fois les fichiers prêts, vous pouvez retourner dans l&#039;écran de gestion des modules de Dolibarr puis désactiver le module, dropper les tables en base (si elles existent déjà) et réactiver le module.&lt;br /&gt;
Les tables doivent alors être recréées par l&#039;activation du module.&lt;br /&gt;
Si tel n&#039;est pas le cas, vérifiez vos scripts en les passant à la main, ou consultez les logs Dolibarr.&lt;br /&gt;
&lt;br /&gt;
===Générer la classe PHP DAO d&#039;accès aux tables===&lt;br /&gt;
&lt;br /&gt;
Le fichier de classe DAO PHP d&#039;un object est généré automatiquement avec ModuleBuilder lors de la création d&#039;un Object.&lt;br /&gt;
&lt;br /&gt;
À défaut d&#039;utiliser le générateur de module, vous trouverez des exemples dans le squelette de module, fichier &#039;&#039;&#039;htdocs/modulebuilder/templates/class/myobject.class.php&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Dans cette classe, se trouvent des méthodes CRUD (Create/Read/Update/Delete) déjà opérationnelles pour faire un insert, un fetch (select), un update, un delete d&#039;une ligne de la table. Éditer le fichier pour utiliser le bon nom de module, de tables et placer ce fichier dans le sous-répertoire de &#039;&#039;&#039;class&#039;&#039;&#039; du module. Le Module Builder permet de faire cela en quelques clics de souris.&lt;br /&gt;
&lt;br /&gt;
==Affichage des onglets (optionnel)==&lt;br /&gt;
&lt;br /&gt;
===Ajouter ou supprimer des onglets sur les fiches objets===&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : Pour ajouter votre propre onglet parmi les onglets d&#039;un object standard (facture, commande, proposition commercial, adhérent...)&lt;br /&gt;
&lt;br /&gt;
Pour cela, allez dans le fichier descripteur de module précédemment créé et modifiez le tableau $this-&amp;gt;tabs:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	// Array to add new pages in new tabs or remove existing one&lt;br /&gt;
	$this-&amp;gt;tabs = array(&#039;objecttype:+tabname1:Title1:mylangfile@monmodule:$user-&amp;gt;rights-&amp;gt;monmodule-&amp;gt;read:/monmodule/mapagetab1.php?id=__ID__&#039;    // To add a new tab identified by code tabname1&lt;br /&gt;
                            &#039;objecttype:+tabname2:Title2:mylangfile@monmodule:$user-&amp;gt;rights-&amp;gt;monmodule-&amp;gt;read:/monmodule/mapagetab2.php?id=__ID__&#039;,   // To add a new tab identified by code tabname2&lt;br /&gt;
                            &#039;objecttype:-tabname&#039;);                                                     // To remove an existing tab identified by code tabname&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le tableau doit contenir une liste de chaîne, chaque chaîne représentant un nouvel onglet.&lt;br /&gt;
Le format de la chaîne étant composé de 6 parties séparées par &amp;quot;:&amp;quot;&lt;br /&gt;
&lt;br /&gt;
*Partie 1 : le type d&#039;élément (objecttype) dans lequel doit apparaître l&#039;onglet qui est une valeur parmi celle-ci:&lt;br /&gt;
{{TemplateModuleTabs-fr}}&lt;br /&gt;
&lt;br /&gt;
*Partie 2 : nom de code pour l&#039;onglet à ajouter (commence par +) ou à enlever (commence par -)&lt;br /&gt;
*Partie 3 : le titre de l&#039;onglet. Cela peut être un libellé en dur ou mieux un code traduction présent dans un fichier lang.&lt;br /&gt;
*Partie 4 : le nom du fichier .lang (sans l&#039;extension .lang) qui contient la correspondance entre le code traduction et le libellé à afficher. Si ce com est suivi de @monmodule, Dolibarr cherche le fichier dans le répertoire lang propre au module, c&#039;est à dire htdocs/monmodule/langs/code_CODE/monmodule.lang, sinon Dolibarr cherche le fichier traduction dans htdocs/langs/code_CODE/mylangfile.lang&lt;br /&gt;
*Partie 5 : une condition à tester pour savoir si l&#039;onglet doit être visible ou pas. Mettre &#039;1&#039; pour qu&#039;il soit toujours visible.&lt;br /&gt;
*Partie 6 : l&#039;url de la page à afficher quand on clique sur l&#039;onglet. La chaine __ID__ sera remplacée automatiquement par l&#039;Id de l&#039;entité concernée.&lt;br /&gt;
&lt;br /&gt;
Pour que la déclaration soit effective, il faut désactiver et réactiver le module.&lt;br /&gt;
&lt;br /&gt;
Pour alimenter le contenu de l&#039;onglet avec des données issues de la base, voir le chapitre suivant.&lt;br /&gt;
&lt;br /&gt;
===Ajouter les onglets standard d&#039;un objet sur sa propre page d&#039;onglet===&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : Pour afficher les onglets existant d&#039;un objet standard (produit, tiers, etc.) sur votre nouvelle page onglet.&lt;br /&gt;
&lt;br /&gt;
Il faut appliquer la procédure suivante :&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Inclure les fichiers définissant les fonctions utiles dans vos fichiers&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Pour chaque fiche entité, il y a deux fichiers à inclure avec l&#039;instruction&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;require_once($url_fichier) ;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici quelques exemples de fichiers à inclure (DOL_DOCUMENT_ROOT correspond au dossier dolibarr/htdocs/) :&lt;br /&gt;
&lt;br /&gt;
*Entité tiers (thirdparty) :&lt;br /&gt;
**DOL_DOCUMENT_ROOT/societe/class/societe.class.php&lt;br /&gt;
**DOL_DOCUMENT_ROOT/core/lib/company.lib.php&lt;br /&gt;
*Entité produit (product) :&lt;br /&gt;
**DOL_DOCUMENT_ROOT/product/class/product.class.php&lt;br /&gt;
**DOL_DOCUMENT_ROOT/core/lib/product.lib.php&lt;br /&gt;
*Entité facture (invoice) :&lt;br /&gt;
**DOL_DOCUMENT_ROOT/compta/facture/facture.class.php&lt;br /&gt;
**DOL_DOCUMENT_ROOT/core/lib/invoice.lib.php&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Créer et charger l&#039;objet à afficher dans votre onglet&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Créez l&#039;objet de la classe voulue, et récupérez les données de l&#039;objet à partir de la base de données. Pour cela il faut utiliser les fonctions fetch() de la classe correspondante, en passant en paramètre l&#039;identifiant de l&#039;objet que vous récupérez depuis l&#039;url (ex : /mononglet.php?id=1).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Exemple :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$id=GETPOST(&#039;id&#039;,&#039;int&#039;);&lt;br /&gt;
$ref=GETPOST(&#039;ref&#039;,&#039;alpha&#039;);&lt;br /&gt;
$product = new Product($db) ;&lt;br /&gt;
$result = $product-&amp;gt;fetch($id, $ref) ; //Tester $result pour vérifier que l&#039;accès à la base s&#039;est bien passée&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3. Récupérer la liste des onglets correspondant à l&#039;entité choisie&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Utilisez la fonction XXX_prepare_head($obj), ou XXX est le nom de l&#039;entité, permettant de créer un tableau contenant les définitions des onglets à afficher. Le paramètre à passer est l&#039;objet pour lequel vous voulez afficher les onglets.&lt;br /&gt;
&lt;br /&gt;
Le tableau retourné est composé de la façon suivante :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$head        // Tableau des onglets&lt;br /&gt;
$head[$h]    // Élément décrivant un onglet. Il y aura autant de $h que d&#039;onglets à afficher&lt;br /&gt;
$head[$h][0] // Url de la page affichée quand on clique sur l&#039;onglet&lt;br /&gt;
$head[$h][1] // Titre de l’onglet&lt;br /&gt;
$head[$h][2] // Code de l&#039;onglet, à utiliser pour choisir quel onglet sera &#039;actif&#039; (voir paragraphe suivant)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Exemple :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$head = product_prepare_head($product, $user) ; //le paramètre $user n&#039;est pas présent sur certaines fonctions&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4. Afficher les onglets sur votre page onglet&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Utilisez la fonction dol_fiche_head() qui affiche les onglets contenus dans le tableau $head retourné par XX_prepare_head().&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
dol_fiche_head($links, $active=&#039;0&#039;, $title=&#039;&#039;, $notab=0, $picto=&#039;&#039;)&lt;br /&gt;
//$links  // Tableau des onglets, appelé $head plus haut.&lt;br /&gt;
//$active // Onglet actif (mettre le nom de l&#039;onglet défini dans votre fichier de module, ou un nom contenu dans $head[$h][2]). Cet onglet sera mis en surbrillance&lt;br /&gt;
//$title  // ?&lt;br /&gt;
//$notab  // Mettre ce paramètre à 1 permet de ne pas afficher de zone bleue en dessous des onglets.&lt;br /&gt;
//$picto  // Nom de l&#039;image à utiliser au début de la barre des onglet. Les choix suivant sont possibles :&lt;br /&gt;
//            product&lt;br /&gt;
//            service&lt;br /&gt;
//            company&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette fonction affiche les onglets voulus et ouvre un élément &#039;&#039;&amp;lt; div class=&amp;quot;&amp;quot; &amp;gt;&#039;&#039; qui correspond à la zone bleue sous les onglets (si paramètre $notab = 0). Pour fermer la zone bleue, il suffit de fermer l&#039;élément &#039;&#039;&amp;lt; /div &amp;gt;&#039;&#039; dans le code PHP.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Remarque&#039;&#039; :&lt;br /&gt;
Pour plus de détail, se référer à la [http://www.dolibarr.fr/doxygen/ documentation Doxygen] ou directement au code de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
==Créer vos pages écran PHP (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : Si l&#039;objet de votre module est d&#039;ajouter des fonctionnalités qui nécessitent de nouveaux écrans.&lt;br /&gt;
&lt;br /&gt;
===Créer une page écran PHP brute===&lt;br /&gt;
Vous pouvez ensuite créer vos pages PHP, qui se basent sur les données de vos tables, en utilisant les squelettes fournis comme exemple dans le répertoire &#039;&#039;&#039;modulebuilder&#039;&#039;&#039; (Pour le développement d&#039;un script en ligne de commande, voir [[Développement de scripts]]). La encore, si vous avez utilisez ModuleBuilder, des cas de pages (liste, page de création, onglet notes, etc...) auront été créés automatiquement lors de l&#039;initialisation de l&#039;objet.&lt;br /&gt;
&lt;br /&gt;
Pour créer une nouvelle page écran utilisateur, créez un sous-répertoire de &#039;&#039;&#039;htdocs&#039;&#039;&#039; (si non déjà fait) propre à votre module (Dans &#039;&#039;&#039;htdocs/monmodule&#039;&#039;&#039; par exemple) afin d&#039;y placer les pages que vous allez créer.&lt;br /&gt;
&lt;br /&gt;
Y recopier le fichier &#039;&#039;&#039;myobject_page.php&#039;&#039;&#039; qui va servir de point de départ.&lt;br /&gt;
Modifiez le fichier afin que le main.inc.php soit trouvé&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Load Dolibarr environment&lt;br /&gt;
$res=0;&lt;br /&gt;
// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined)&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; ! empty($_SERVER[&amp;quot;CONTEXT_DOCUMENT_ROOT&amp;quot;])) $res=@include($_SERVER[&amp;quot;CONTEXT_DOCUMENT_ROOT&amp;quot;].&amp;quot;/main.inc.php&amp;quot;);&lt;br /&gt;
// Try main.inc.php into web root detected using web root calculated from SCRIPT_FILENAME&lt;br /&gt;
$tmp=empty($_SERVER[&#039;SCRIPT_FILENAME&#039;])?&#039;&#039;:$_SERVER[&#039;SCRIPT_FILENAME&#039;];$tmp2=realpath(__FILE__); $i=strlen($tmp)-1; $j=strlen($tmp2)-1;&lt;br /&gt;
while($i &amp;gt; 0 &amp;amp;&amp;amp; $j &amp;gt; 0 &amp;amp;&amp;amp; isset($tmp[$i]) &amp;amp;&amp;amp; isset($tmp2[$j]) &amp;amp;&amp;amp; $tmp[$i]==$tmp2[$j]) { $i--; $j--; }&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; $i &amp;gt; 0 &amp;amp;&amp;amp; file_exists(substr($tmp, 0, ($i+1)).&amp;quot;/main.inc.php&amp;quot;)) $res=@include(substr($tmp, 0, ($i+1)).&amp;quot;/main.inc.php&amp;quot;);&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; $i &amp;gt; 0 &amp;amp;&amp;amp; file_exists(dirname(substr($tmp, 0, ($i+1))).&amp;quot;/main.inc.php&amp;quot;)) $res=@include(dirname(substr($tmp, 0, ($i+1))).&amp;quot;/main.inc.php&amp;quot;);&lt;br /&gt;
// Try main.inc.php using relative path&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; file_exists(&amp;quot;../main.inc.php&amp;quot;)) $res=@include(&amp;quot;../main.inc.php&amp;quot;);&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; file_exists(&amp;quot;../../main.inc.php&amp;quot;)) $res=@include(&amp;quot;../../main.inc.php&amp;quot;);&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; file_exists(&amp;quot;../../../main.inc.php&amp;quot;)) $res=@include(&amp;quot;../../../main.inc.php&amp;quot;);&lt;br /&gt;
if (! $res) die(&amp;quot;Include of main fails&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Comme vous pouvez le constater, plusieurs tentatives de chargement du fichier main.inc.php (ou master.inc.php) ont été tentées. Le but est de réussir dans le plus grand nombre de cas possibles. Le minimum est de 2 lignes: une pour essayer de charger le fichier master / main.inc.php dans le répertoire racine de dolibarr et une autre pour essayer de charger le fichier afin de prendre en charge le cas où le module est déployé dans le répertoire &amp;quot;custom&amp;quot;. Mais vous pouvez avoir à gérer plus de situations. L&#039;exemple fourni devrait pouvoir charger le fichier main / master.inc.php dans presque toutes les situations / configurations.&lt;br /&gt;
&lt;br /&gt;
Notez que vous pouvez ajouter plus &amp;quot;../&amp;quot; en fonction de la profondeur du fichier par rapport à l&#039;arborescence de votre module.&lt;br /&gt;
&lt;br /&gt;
C&#039;est dans le main qu&#039;est chargé l&#039;environnement technique ainsi que les habilitations. Les variables objets suivantes sont alors positionnées:&lt;br /&gt;
&lt;br /&gt;
*$user    L&#039;objet qui contient les caractéristiques de l&#039;utilisateur + ses droits.&lt;br /&gt;
*$conf    L&#039;objet qui contient la configuration de Dolibarr.&lt;br /&gt;
*$db      L&#039;objet qui contient le handler de connexion à la base de données.&lt;br /&gt;
*$langs   L&#039;objet qui contient la langue de l&#039;utilisateur.&lt;br /&gt;
&lt;br /&gt;
*L&#039;inclusion d&#039;une classe ou librairie dédiée au module, sans savoir d&#039;où le fichier sera appelé, se fait en utilisant une fonction de Dolibarr (et non en utilisant directement le include_once)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Exemple :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
dol_include_once(&#039;/monmodule/class/maclasse.class.php&#039;, &#039;MaClasse&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*L&#039;appel des classes fournies en standard avec Dolibarr se fera par contre par le require_once directe avec la syntaxe suivante:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Exemple :&#039;&#039;&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/doli.class.php&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La raison est que si le dol_include_once est pratique car il scanne chaque répertoire de chemin alternatif pour trouver le fichier, il est aussi moins performant car génère des accès et recherches disque à chaque appel (en effet, PHP intègre un cache des fichiers lus mais n&#039;intègre pas un cache des fichiers &amp;quot;non trouvés&amp;quot;. Et comme un fichier donné n&#039;est que dans une seule arborescence, il y a toujours une arborescence alternative où il ne se trouve pas et qui génère des accès superflus au disque dur, pénalisant en terme de performance. Comme pour les fichiers internes à Dolibarr, on connait toujours le chemin exacte, le require_once avec ce chemin direct doit être préféré).&lt;br /&gt;
&lt;br /&gt;
===Accès à la base===&lt;br /&gt;
Si vous avez besoin de réaliser des modifications en base dans votre propre table ajoutée, utilisez la classe générée plus haut qui contient les méthodes pour cela.&lt;br /&gt;
&lt;br /&gt;
Si toutefois vous voulez faire des accès dans des tables sans objet PHP dédié, ceci reste possible (par exemple pour récupérer une liste d&#039;enregistrement). Dans ce cas, pensez à suivre ces exemples:&lt;br /&gt;
&lt;br /&gt;
Pour un insert, update ou delete :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$db-&amp;gt;begin();   // Debut transaction&lt;br /&gt;
$db-&amp;gt;query(&amp;quot;Ma requete insert, update ou delete&amp;quot;);&lt;br /&gt;
$db-&amp;gt;commit();       // Valide&lt;br /&gt;
ou $db-&amp;gt;rollback()  // Annule&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour une lecture :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$resql=$db-&amp;gt;query(&amp;quot;Ma requete select&amp;quot;);&lt;br /&gt;
if ($resql)&lt;br /&gt;
{&lt;br /&gt;
	$num = $db-&amp;gt;num_rows($resql);&lt;br /&gt;
	$i = 0;&lt;br /&gt;
	if ($num)&lt;br /&gt;
	{&lt;br /&gt;
		while ($i &amp;lt; $num)&lt;br /&gt;
		{&lt;br /&gt;
			$obj = $db-&amp;gt;fetch_object($resql);&lt;br /&gt;
			if ($obj)&lt;br /&gt;
			{&lt;br /&gt;
				// You can use here results&lt;br /&gt;
				print $obj-&amp;gt;field1;&lt;br /&gt;
				print $obj-&amp;gt;field2;&lt;br /&gt;
			}&lt;br /&gt;
			$i++;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Définition du style===&lt;br /&gt;
Pour que le look de la page soit aligné avec le thème Dolibarr, il est nécessaire d&#039;utiliser les styles des CSS de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
Par exemple :&lt;br /&gt;
&lt;br /&gt;
*class=&amp;quot;&#039;&#039;&#039;liste_titre&#039;&#039;&#039;&amp;quot; sur les balises &#039;&#039;tr&#039;&#039; et &#039;&#039;td&#039;&#039; pour une ligne de titre de tableau.&lt;br /&gt;
*class=&amp;quot;&#039;&#039;&#039;pair&#039;&#039;&#039;&amp;quot; ou class=&amp;quot;&#039;&#039;&#039;impair&#039;&#039;&#039;&amp;quot; sur les balises &#039;&#039;tr&#039;&#039; et &#039;&#039;td&#039;&#039; des lignes de données de tableau.&lt;br /&gt;
*class=&amp;quot;&#039;&#039;&#039;flat&#039;&#039;&#039;&amp;quot; sur tous les champs de saisie (&#039;&#039;input, select, textarea&#039;&#039;...).&lt;br /&gt;
*class=&amp;quot;&#039;&#039;&#039;button&#039;&#039;&#039;&amp;quot; sur les objets de type &#039;&#039;input type=&amp;quot;submit&amp;quot;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Utilisez le sélecteur de date de Dolibarr===&lt;br /&gt;
Si vous le désirez, vous pouvez profiter du sélecteur de date dans des écrans Dolibarr. Pour cela, utilisez la ligne suivante:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$form=new Form($db);&lt;br /&gt;
$form-&amp;gt;select_date(&#039;&#039;,&#039;mykey&#039;,0,0,0,&amp;quot;myform&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La chaîne mykey identifie la zone date. Il faut y mettre une valeur différente s&#039;il y a plusieurs zones.&lt;br /&gt;
La chaine myform est le nom de la zone FORM (dans form name=&amp;quot;myform&amp;quot; de la page HTML).&lt;br /&gt;
L&#039;affichage d&#039;un sélecteur de date doit donc être intégré dans une zone FORM Html.&lt;br /&gt;
&lt;br /&gt;
Pour récupérer la valeur, à l&#039;issu du POST, la commande est:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$mydate = dol_mktime(12, 0 , 0, GETPOST(&#039;mykeymonth&#039;, &#039;int&#039;), GETPOST(&#039;mykeyday&#039;, &#039;int&#039;), GETPOST(&#039;mykeyyear&#039;, &#039;int&#039;));&lt;br /&gt;
print strftime(&#039;%A %d %B %Y&#039;, $mydate);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Définir votre page de configuration (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : si votre module offre plusieurs options paramétrables.&lt;br /&gt;
&lt;br /&gt;
===Créez votre page d&#039;édition de configuration===&lt;br /&gt;
Si votre module offre plusieurs options paramétrables, il est nécessaire de créer une page PHP pour éditer les options (qui sont stockées dans la [[Table llx_const|table &#039;&#039;&#039;llx_const&#039;&#039;&#039;]]).&lt;br /&gt;
Créez une page PHP nommée &#039;&#039;&#039;monmodule_setupapage.php&#039;&#039;&#039; qui affiche les options possibles et les met à jour.&lt;br /&gt;
Il est nécessaire de prendre exemple sur une page dans &#039;&#039;&#039;/admin&#039;&#039;&#039; qui vous montre la méthode pour lire ou sauvegarder en base votre option.&lt;br /&gt;
Placez cette page de configuration dans le répertoire &#039;&#039;&#039;/admin&#039;&#039;&#039; également.&lt;br /&gt;
Ensuite dans le descripteur de module, modifiez la variable pour indiquer le nom de cette page PHP (sans le chemin qui n&#039;est pas nécessaire, la page étant forcément dans le rep admin).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;config_page_url = array(&amp;quot;setup.php@mymodule&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Testez votre page===&lt;br /&gt;
Allez sur la page &#039;&#039;&#039;Configuration-&amp;gt;module&#039;&#039;&#039;, vous devez voir apparaître une icône qui permet d&#039;accéder à la page de configuration et vous devez être capable de modifier ces options et les voir conservées en base.&lt;br /&gt;
&lt;br /&gt;
==Définir vos entrées de menu (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : si vous avez créé des pages PHP, il est nécessaire que ces écrans soient accessibles depuis le menu Dolibarr.&lt;br /&gt;
&lt;br /&gt;
===Définissez vos entrées menus===&lt;br /&gt;
Pour cela, il vous faut définir dans le fichier descripteur de module, le tableau this-&amp;gt;menu qui déclare les menus.&lt;br /&gt;
Ce tableau contient toutes les entrées qui apparaîtront dans les menus une fois le module activé.&lt;br /&gt;
Le fichier de descripteur de module exemple &#039;&#039;&#039;modMonModule.class.php&#039;&#039;&#039; possède un exemple de déclaration de menu haut ainsi que de ses entrées menu gauche associées.&lt;br /&gt;
&lt;br /&gt;
Voici un exemple de déclaration d&#039;entrées de menu dans le fichier descripteur:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Main menu entries&lt;br /&gt;
$this-&amp;gt;menu = array();			// List of menus to add&lt;br /&gt;
$r=0;&lt;br /&gt;
&lt;br /&gt;
// Add here entries to declare new menus&lt;br /&gt;
// Example to declare the Top Menu entry:&lt;br /&gt;
$this-&amp;gt;menu[$r]=array(	&#039;fk_menu&#039;=&amp;gt;0,			// Put 0 if this is a top menu&lt;br /&gt;
			&#039;type&#039;=&amp;gt;&#039;top&#039;,			// This is a Top menu entry&lt;br /&gt;
			&#039;titre&#039;=&amp;gt;&#039;MonModule top menu&#039;,&lt;br /&gt;
			&#039;mainmenu&#039;=&amp;gt;&#039;monmodule&#039;,&lt;br /&gt;
			&#039;leftmenu&#039;=&amp;gt;&#039;monmodule&#039;,&lt;br /&gt;
			&#039;url&#039;=&amp;gt;&#039;/monmodule/pagetop.php&#039;,&lt;br /&gt;
			&#039;langs&#039;=&amp;gt;&#039;mylangfile&#039;,	// Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.&lt;br /&gt;
			&#039;position&#039;=&amp;gt;100,&lt;br /&gt;
			&#039;enabled&#039;=&amp;gt;&#039;1&#039;,			// Define condition to show or hide menu entry. Use &#039;$conf-&amp;gt;monmodule-&amp;gt;enabled&#039; if entry must be visible if module is enabled.&lt;br /&gt;
			&#039;perms&#039;=&amp;gt;&#039;1&#039;,			// Use &#039;perms&#039;=&amp;gt;&#039;$user-&amp;gt;rights-&amp;gt;monmodule-&amp;gt;level1-&amp;gt;level2&#039; if you want your menu with a permission rules&lt;br /&gt;
			&#039;target&#039;=&amp;gt;&#039;&#039;,&lt;br /&gt;
			&#039;user&#039;=&amp;gt;2);				// 0=Menu for internal users, 1=external users, 2=both&lt;br /&gt;
$r++;&lt;br /&gt;
&lt;br /&gt;
// Example to declare a Left Menu entry:&lt;br /&gt;
$this-&amp;gt;menu[$r]=array(	&#039;fk_menu&#039;=&amp;gt;&#039;fk_mainmenu=xxx&#039;,	// Use &#039;fk_mainmenu=xxx&#039; or &#039;fk_mainmenu=xxx,fk_leftmenu=yyy&#039; where xxx is mainmenucode and yyy is a leftmenucode of parent menu&lt;br /&gt;
			&#039;type&#039;=&amp;gt;&#039;left&#039;,			// This is a Left menu entry&lt;br /&gt;
			&#039;titre&#039;=&amp;gt;&#039;MonModule left menu 1&#039;,&lt;br /&gt;
			&#039;mainmenu&#039;=&amp;gt;&#039;xxx&#039;,&lt;br /&gt;
                        &#039;leftmenu&#039;=&amp;gt;&#039;yyy&#039;,&lt;br /&gt;
			&#039;url&#039;=&amp;gt;&#039;/monmodule/pagelevel1.php&#039;,&lt;br /&gt;
			&#039;langs&#039;=&amp;gt;&#039;mylangfile&#039;,	// Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.&lt;br /&gt;
			&#039;position&#039;=&amp;gt;100,&lt;br /&gt;
			&#039;enabled&#039;=&amp;gt;&#039;1&#039;,			// Define condition to show or hide menu entry. Use &#039;$conf-&amp;gt;monmodule-&amp;gt;enabled&#039; if entry must be visible if module is enabled.&lt;br /&gt;
			&#039;perms&#039;=&amp;gt;&#039;1&#039;,			// Use &#039;perms&#039;=&amp;gt;&#039;$user-&amp;gt;rights-&amp;gt;monmodule-&amp;gt;level1-&amp;gt;level2&#039; if you want your menu with a permission rules&lt;br /&gt;
			&#039;target&#039;=&amp;gt;&#039;&#039;,&lt;br /&gt;
			&#039;user&#039;=&amp;gt;2);				// 0=Menu for internal users,1=external users, 2=both&lt;br /&gt;
$r++;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour conditionner l&#039;accès au menu selon des permission, modifier la propriété &#039;&#039;&#039;perms&#039;&#039;&#039; du tableau. Voir le chapitre sur les permissions un peu plus loin pour savoir comment ajouter des permissions.&lt;br /&gt;
&lt;br /&gt;
===Testez vos entrées menus===&lt;br /&gt;
Désactiver et réactiver votre module sous Dolibarr, les entrées menus doivent alors apparaître (si la condition dans &#039;enabled&#039; est vraie).&lt;br /&gt;
&lt;br /&gt;
==Définir vos propres permissions (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : Si vous voulez ajouter de nouvelles permissions.&lt;br /&gt;
&lt;br /&gt;
La définition des permissions que gérera votre module se fait dans le fichier descripteur créé dans la première étape.&lt;br /&gt;
Modifier la ligne &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;rights_class = &#039;monmodule&#039;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
pour y mettre la bonne valeur de monmodule.&lt;br /&gt;
&lt;br /&gt;
Ensuite remplissez le tableau $this-&amp;gt;rights avec autant d&#039;entrées que de permissions différentes à gérer.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;rights[$r][0] = 10001;&lt;br /&gt;
$this-&amp;gt;rights[$r][1] = &#039;Libelle par défaut de ma permission&#039;;&lt;br /&gt;
$this-&amp;gt;rights[$r][3] = 1;&lt;br /&gt;
$this-&amp;gt;rights[$r][4] = &#039;action&#039;;&lt;br /&gt;
$this-&amp;gt;rights[$r][5] = &#039;sousaction&#039;;&lt;br /&gt;
$r++;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans $this-&amp;gt;rights[$r][0], mettre un id de permission non déjà pris (Voir dans le menu &#039;&#039;&#039;Infos Système&#039;&#039;&#039; sur une installation de Dolibarr opérationnelle pour connaître les id déjà utilisés.&lt;br /&gt;
Dans $this-&amp;gt;rights[$r][3], mettre 1 si cette permission est attribué d&#039;office par défaut quand un utilisateur est créé.&lt;br /&gt;
Dans $this-&amp;gt;rights[$r][1], mettre un libellé par défaut (il sera affiché si aucune traduction n&#039;est trouvé pour votre permission dans le fichier &#039;&#039;&#039;admin.lang&#039;&#039;&#039;. La clé de traduction dit être &amp;quot;Permission10001=Description de ma super permission&#039;&#039;&#039;&amp;quot;&#039;&#039;&#039;).&lt;br /&gt;
Dans $this-&amp;gt;rights[$r][4] et $this-&amp;gt;rights[$r][5], mettre une chaîne action et sous action sans espace. Vous pourrez alors tester dans le code PHP si un utilisateurs a bien les droits par la séquence suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
if ($user-&amp;gt;rights-&amp;gt;monmodule-&amp;gt;action-&amp;gt;sousaction) ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Définir vos propres box/widgets (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : si votre module amène avec lui une ou plusieurs Boxes.&lt;br /&gt;
&lt;br /&gt;
===Définissez vos box===&lt;br /&gt;
Pour cela, modifiez les tableaux $this-&amp;gt;boxes du fichier descripteur de module.&lt;br /&gt;
Il suffit d&#039;ajouter 2 lignes par fichier box que vous allez créer dans le répertoire &#039;&#039;&#039;htdocs/monmodule/core/boxes&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Exemple :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;boxes[0][&#039;file&#039;]=&#039;mabox0.php@monmodule&#039;&lt;br /&gt;
$this-&amp;gt;boxes[0][&#039;note&#039;]=&#039;Ma box 0&#039;&lt;br /&gt;
 ...&lt;br /&gt;
$this-&amp;gt;boxes[n][&#039;file&#039;]=&#039;maboxn.php@monmodule&#039;&lt;br /&gt;
$this-&amp;gt;boxes[n][&#039;note&#039;]=&#039;Ma box n&#039;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite créez les fichiers &#039;&#039;&#039;htdocs/monmodule/core/boxes/mabox0.php&#039;&#039;&#039;, &#039;&#039;&#039;htdocs/monmodule/core/boxes/mabox1.php&#039;&#039;&#039;... en prenant exemple sur des box existantes (exemple dans le répertoire &#039;&#039;&#039;htdocs/core/boxes&#039;&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
===Testez la présence de vos box dans Dolibarr===&lt;br /&gt;
Désactivez et réactivez le module.&lt;br /&gt;
&lt;br /&gt;
Allez dans le menu &#039;&#039;&#039;Accueil - Configuration - Boite&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Vos box doivent apparaître dans la liste des box activables. Activez les puis allez sur la page d&#039;accueil et vérifiez qu&#039;elles s&#039;affichent correctement.&lt;br /&gt;
&lt;br /&gt;
==Définir vos propres exports (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : si votre module amène avec lui des exports prédéfinis de données (pour ces propres tables ou des tables déjà existantes d&#039;un autre module de Dolibarr).&lt;br /&gt;
&lt;br /&gt;
===Définissez l&#039;export===&lt;br /&gt;
Pour cela, décommentez et modifiez les tableaux $this-&amp;gt;export_xxx du votre fichier descripteur de module.&lt;br /&gt;
&lt;br /&gt;
===Testez votre export===&lt;br /&gt;
Allez dans le menu outils -&amp;gt; export de Dolibarr. Votre export doit apparaitre dans la liste des exports prédéfinis disponibles (si votre module est bien activé).&lt;br /&gt;
Le choisir, vous devez alors voir les champs possibles définis dans le tableau à l&#039;étape précédente.&lt;br /&gt;
Choissez quelques champs et tentez une génération du fichier export.&lt;br /&gt;
&lt;br /&gt;
==Définir vos styles CSS (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : lorsque dans vos écrans PHP, vous utiliser des classes de styles qui ne sont pas celle des thèmes de Dolibarr (non recommandé).&lt;br /&gt;
&lt;br /&gt;
Cette fonctionnalité est décrite mais pas encore opérationnel en 2.4&lt;br /&gt;
&lt;br /&gt;
===Créez et déclarez votre feuille de style===&lt;br /&gt;
Créez un fichier de style css nommé &#039;&#039;&#039;monmodule.css&#039;&#039;&#039; ou &#039;&#039;&#039;monmodule.css.php&#039;&#039;&#039; et placez le dans le répertoire &#039;&#039;&#039;&#039;&#039;monmodule&#039;&#039;&#039;&#039;&#039; dans &#039;&#039;&#039;htdocs&#039;&#039;&#039;. Il ne peut y avoir qu&#039;un fichier css propre à chaque module.&lt;br /&gt;
Rappelons qu&#039;il vaut mieux utiliser les styles déjà existant de Dolibarr (le fichier css utilisé par Dolibarr étant le fichier &#039;&#039;&#039;themes/nomtheme/&#039;&#039;nomtheme&#039;&#039;.css.php&#039;&#039;&#039;). Ne créez un fichier css propre à votre module que si vous devez absolument gérer des styles non déjà existants.&lt;br /&gt;
Une fois votre feuille de style prête, déclarez la dans votre fichier descripteur de module en modifiant la propriété &#039;&#039;&#039;$this-&amp;gt;module_parts&#039;&#039;&#039;.&lt;br /&gt;
La valeur à renseigner ici doit être le chemin relatif de l&#039;URL de votre fichier css.&lt;br /&gt;
Par exemple&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;module_parts = array(&#039;css&#039; =&amp;gt; array(&#039;/monmodule/css/monmodule.css.php&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Testez votre feuille de style===&lt;br /&gt;
Désactivez et réactivez votre module.&lt;br /&gt;
&lt;br /&gt;
Appelez la page d&#039;accueil de Dolibarr. Affichez la source de la page HTML.&lt;br /&gt;
&lt;br /&gt;
Vous devriez voir dans l&#039;entête HTML, une ligne déclarant votre feuille de style.&lt;br /&gt;
&lt;br /&gt;
==Définir vos fonctions Javascript (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : lorsque dans vos écrans PHP, vous utiliser des fonctions javascript non dispo en standard (fichier lib_head.js)&lt;br /&gt;
&lt;br /&gt;
Si dans vos écrans PHP, vous utilisez des fonctions javascript, il est nécessaire de faire en sorte que vos fonctions déclarées dans un fichier javascript &#039;&#039;&#039;htdocs/monmodule/js/monmodule.js&#039;&#039;&#039; soit chargées dans l&#039;entête head html.&lt;br /&gt;
Pour demander à Dolibarr qui gère la génération de la section header d&#039;inclure un de vos fichiers javascript, il est nécessaire de fournir en paramètre de la fonction llxHeader() appelée au début de votre page, d&#039;inclure le paramètre qui contient l&#039;URL vers le js à inclure.&lt;br /&gt;
&lt;br /&gt;
Exemple pour la page /htdocs/monmodule/mapage.php :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
require(&#039;../main.inc.php&#039;);&lt;br /&gt;
$morejs=array(&amp;quot;/monmodule/js/monmodule.js&amp;quot;);&lt;br /&gt;
llxHeader(&#039;&#039;,&#039;Titre&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,$morejs,&#039;&#039;,0,0); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Déclencher du code sur un évènement Dolibarr (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : lorsque vous voulez que des actions particulières s&#039;exécutent suite au déclenchement d&#039;actions standards de Dolibarr (exemple : je veux mettre à jour une table de mon module quand une facture se crée dans Dolibarr), il vous faut créer un fichier de &#039;&#039;&#039;triggers&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Voir aussi [[Interfaces_Dolibarr_vers_exterieur|Interfaces de Dolibarr vers l&#039;exterieur]]&lt;br /&gt;
et [[Interfaces_Exterieur_vers_Dolibarr|Interfaces exterieures vers Dolibarr]]&lt;br /&gt;
&lt;br /&gt;
==Insérer votre code aux emplacement hooks de Dolibarr (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : lorsque vous voulez modifier ou ajouter du code autrement que lors d&#039;un événement métier (voir le chapitre précédent pour cela).&lt;br /&gt;
&lt;br /&gt;
Voir la page [[Système de Hooks]].&lt;br /&gt;
&lt;br /&gt;
==Ajouter un module de numérotation (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : lorsque vous voulez ajouter une règle de numérotation non couverte par les modules par défaut.&lt;br /&gt;
&lt;br /&gt;
Voir la page [[Créer un module de numérotation]].&lt;br /&gt;
&lt;br /&gt;
==Ajouter un nouveau modèle de document (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : lorsque vous voulez ajouter un nouveau modèle de document.&lt;br /&gt;
&lt;br /&gt;
La documentation au sujet de la génération de documents depuis des modèles est disponible sur la page [[Créer un modèle de document PDF]] ou [[Créer un modèle de document ODT]].&lt;br /&gt;
&lt;br /&gt;
==Ajouter un thème (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039;: Lorsque vous voulez une interface aux couleurs personnalisées à votre cas.&lt;br /&gt;
&lt;br /&gt;
Voir la page [[Themes]].&lt;br /&gt;
&lt;br /&gt;
==Ajouter un bouton (optionnel)==&lt;br /&gt;
Si vous souhaitez ajouter des boutons à vos enregistrements.&lt;br /&gt;
&lt;br /&gt;
Voir la page [[Création_de_boutons]].&lt;br /&gt;
&lt;br /&gt;
=[[File:Art.png]] Quelques règles de codage et fonctions pour développeurs=&lt;br /&gt;
Les règles de codage à suivre sont définis dans la [[Documentation Développeur|Documentation développeur]], rubrique &amp;quot;Informations Générales - Langage et normes de développement&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
De nombreuses fonctions prédéfinies pour les développeurs sont disponibles et décrites sur la page [[Documentation Développeur|Documentation développeur]] sous la section &amp;quot;Les couches techniques de Dolibarr&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=[[File:Art.png]] Créer un package pour livrer et installer votre module=&lt;br /&gt;
Cette procédure doit être utilisée pour fabriquer un package afin de le soumettre sur la place de marché http://www.dolistore.com.&lt;br /&gt;
Mais vous pouvez aussi l&#039;utiliser pour distribuer facillement votre module via votre propre réseau de distribution.&lt;br /&gt;
&lt;br /&gt;
*Allez dans le répertoire &#039;&#039;&#039;/build&#039;&#039;&#039; et recopiez le fichier &#039;&#039;&#039;makepack-dolibarrmodules.conf&#039;&#039;&#039; en &#039;&#039;&#039;makepack-monmodule.conf&#039;&#039;&#039;. Attention, ce répertoire peut ne pas être fourni dans les packages de versions stables. Si c&#039;est le cas, il peut être récupéré dans le snapshot disponible en téléchargement sur le site web Dolibarr dans la rubrique Version de développement (prenez dans ce cas tout le répertoire build qui est un répertoire autonome et indépendant de la version).&lt;br /&gt;
&lt;br /&gt;
Saisissez dans ce fichier la liste des noms des nouveaux fichiers que vous avez créé pour votre module (descripteur de module, nouveaux fichiers sql de tables, page php, images, etc...)&lt;br /&gt;
&lt;br /&gt;
*Lancer le script via Perl (besoin de la version Perl 5.0 ou +):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
perl makepack-dolibarrmodule.pl&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Le script vous demande le nom de votre module, sa version majeure et mineure.&lt;br /&gt;
Un fichier &#039;&#039;&#039;monmodule.zip&#039;&#039;&#039; va alors être fabriqué contenant votre module prêt pour être déployé.&lt;br /&gt;
&lt;br /&gt;
*La personne qui reçoit votre module doit alors placer le fichier dans son répertoire racine d&#039;installation de Dolibarr et réaliser la commande :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tar -xvf monmodule.zip&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Si vous désirez que votre module profite à tous, vous pouvez le soumettre (le fichier zip) sur la place de marché des modules complémentaires: {{LinkToPluginDownload}} (vous devez avoir créé un compte auparavant et utiliser le lien &amp;quot;Soumettre un module/produit&amp;quot;).&lt;br /&gt;
**Si votre module a été fabriqué correctement, le fichier sera validé rapidement.&lt;br /&gt;
**Si la qualité est suffisante, que la licence le permet et que la fonctionnalité du module s&#039;avère être d&#039;un intérêt général, le code pourra être ajouté au code source de Dolibarr (sauf si vous ne le désirez pas).&lt;br /&gt;
&lt;br /&gt;
=[[File:Art.png]] Dépôt et validation du module externe sur Dolistore=&lt;br /&gt;
&lt;br /&gt;
Voir [[Module_Dolistore_Validation_Regles|Règles de Validation]]&lt;/div&gt;</summary>
		<author><name>Kusco</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Cr%C3%A9ation_de_boutons&amp;diff=58819</id>
		<title>Création de boutons</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Cr%C3%A9ation_de_boutons&amp;diff=58819"/>
		<updated>2023-11-21T11:54:37Z</updated>

		<summary type="html">&lt;p&gt;Kusco: Création complète de la page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Pour chaque enregistrement, il est possible de créer des boutons et d&#039;y associer des actions. On retrouvera par exemple des actions comme valider, désactiver, mettre en brouillon, etc.&lt;br /&gt;
&lt;br /&gt;
Nous utiliserons, dans nos exemples, la possibilité d&#039;activer ou désactiver un enregistrement.&lt;br /&gt;
&lt;br /&gt;
== Fichier class.php ==&lt;br /&gt;
&lt;br /&gt;
=== Constantes ===&lt;br /&gt;
Au début du fichier, nous allons vérifier les différentes constantes et les valeurs attribuées.&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
	const STATUS_DRAFT = -1;&lt;br /&gt;
	const STATUS_DISABLED = 0;&lt;br /&gt;
	const STATUS_VALIDATED = 1;&lt;br /&gt;
	const STATUS_CANCELED = 9;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Création fonctions ===&lt;br /&gt;
On vient ensuite ajouter les fonctions&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
public function enable($user, $notrigger = 0)&lt;br /&gt;
	{&lt;br /&gt;
	    // Protection pour véfifier le statut de départ&lt;br /&gt;
		if ($this-&amp;gt;status != self::STATUS_DISABLED) {&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
		return $this-&amp;gt;setStatusCommon($user, self::STATUS_VALIDATED, $notrigger, &#039;&#039;);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Choisir le statut ===&lt;br /&gt;
La fonction viendra modifier l&#039;apparence des status :&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
public function LibStatut($status, $mode = 0)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour chaque statut, on peut y venir apposer un numéro de statut et donc une mise en forme particulière :&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
if ($status == self::STATUS_DRAFT) {&lt;br /&gt;
    $statusType = &#039;status1&#039;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici une liste des statuts et de leur apparence (peut varier en fonction des thèmes et versions utilisées) :&amp;lt;gallery mode=&amp;quot;packed-overlay&amp;quot;&amp;gt;&lt;br /&gt;
File:Status0.png|Status 0&lt;br /&gt;
File:Status1.png|Status 1&lt;br /&gt;
File:Status2.png|Status 2&lt;br /&gt;
File:Status3.png|Status 3&lt;br /&gt;
File:Status4.png|Status 4&lt;br /&gt;
File:Status5.png|Status 5&lt;br /&gt;
File:Status6.png|Status 6&lt;br /&gt;
File:Status7.png|Status 7&lt;br /&gt;
File:Status8.png|Status 8&lt;br /&gt;
File:Status9.png|Status 9&lt;br /&gt;
File:Status10.png|Status 10&lt;br /&gt;
File:Status11.png|Status 11&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fichier _card.php ==&lt;br /&gt;
&lt;br /&gt;
=== Création du bouton ===&lt;br /&gt;
Avec le module builder, un fichier _card.php est créé où on y retrouvera le commentaire suivant, en dessous duquel on pourra nos créations :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;// Buttons for actions&amp;lt;/source&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le code pour ajouter un bouton est le suivant :&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
if ($permissiontoadd) { // Vérification au niveau des permissions&lt;br /&gt;
    if ($object-&amp;gt;status == $object::STATUS_VALIDATED) { // Si notre statut est déjà validé, on affiche un bouton pour désactiver&lt;br /&gt;
        print dolGetButtonAction(&#039;&#039;,$langs-&amp;gt;trans(&#039;Disable&#039;), &#039;default&#039;, $_SERVER[&#039;PHP_SELF&#039;].&#039;?id=&#039;.$object-&amp;gt;id.&#039;&amp;amp;action=disable&amp;amp;token=&#039;.newToken(), &#039;&#039;, $permissiontoadd);&lt;br /&gt;
    } else { // Si notre statut est désactivé on afficher un bouton pour le réactiver&lt;br /&gt;
        print dolGetButtonAction(&#039;&#039;,$langs-&amp;gt;trans(&#039;Enable&#039;), &#039;default&#039;, $_SERVER[&#039;PHP_SELF&#039;].&#039;?id=&#039;.$object-&amp;gt;id.&#039;&amp;amp;action=enable&amp;amp;token=&#039;.newToken(), &#039;&#039;, $permissiontoadd);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Appel de l&#039;action ===&lt;br /&gt;
Dans le haut du fichier _card.php, on retrouvera le commentaire suivant :&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
* Actions&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
C&#039;est à ce niveau que l&#039;on va venir ajouter les appels de fonction, que nous avons mis dans la création de nos bouttons&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
if ($action == &#039;enable&#039; &amp;amp;&amp;amp; $permissiontoadd) { // Si on choisit l&#039;action enable et que nous en avons la permission&lt;br /&gt;
    $object-&amp;gt;enable($object-&amp;gt;fk_user_modif,0); // Nous appelons la fonction enable, qui se trouve dans notreobjet/class.php&lt;br /&gt;
    setEventMessages(&amp;quot;&amp;quot;, &amp;quot;Bénéficiaire activé&amp;quot;, &#039;mesgs&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if ($action == &#039;disable&#039; &amp;amp;&amp;amp; $permissiontoadd) {&lt;br /&gt;
    if ($object-&amp;gt;action_fin == null) { // On peut ajouter une condition et un message d&#039;erreur pour bloquer la désactivation&lt;br /&gt;
    setEventMessages(&amp;quot;&amp;quot;, &amp;quot;Il faut ajouter une date de fin de l&#039;action pour pouvoir désactiver un bénéficiaire&amp;quot;, &#039;errors&#039;);&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
    $object-&amp;gt;disable($object-&amp;gt;fk_user_modif,0);&lt;br /&gt;
    setEventMessages(&amp;quot;&amp;quot;, &amp;quot;Bénéficiaire désactivé&amp;quot;, &#039;mesgs&#039;); // Ou bien ajouter un message pour indiquer la bonne marche des choses&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kusco</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=File:Status11.png&amp;diff=58818</id>
		<title>File:Status11.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=File:Status11.png&amp;diff=58818"/>
		<updated>2023-11-21T11:51:11Z</updated>

		<summary type="html">&lt;p&gt;Kusco: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Status11&lt;/div&gt;</summary>
		<author><name>Kusco</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=File:Status10.png&amp;diff=58817</id>
		<title>File:Status10.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=File:Status10.png&amp;diff=58817"/>
		<updated>2023-11-21T11:51:04Z</updated>

		<summary type="html">&lt;p&gt;Kusco: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Status10&lt;/div&gt;</summary>
		<author><name>Kusco</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=File:Status9.png&amp;diff=58816</id>
		<title>File:Status9.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=File:Status9.png&amp;diff=58816"/>
		<updated>2023-11-21T11:50:53Z</updated>

		<summary type="html">&lt;p&gt;Kusco: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Status9&lt;/div&gt;</summary>
		<author><name>Kusco</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=File:Status8.png&amp;diff=58815</id>
		<title>File:Status8.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=File:Status8.png&amp;diff=58815"/>
		<updated>2023-11-21T11:50:45Z</updated>

		<summary type="html">&lt;p&gt;Kusco: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Status8&lt;/div&gt;</summary>
		<author><name>Kusco</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=File:Status7.png&amp;diff=58814</id>
		<title>File:Status7.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=File:Status7.png&amp;diff=58814"/>
		<updated>2023-11-21T11:50:39Z</updated>

		<summary type="html">&lt;p&gt;Kusco: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Status7&lt;/div&gt;</summary>
		<author><name>Kusco</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=File:Status6.png&amp;diff=58813</id>
		<title>File:Status6.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=File:Status6.png&amp;diff=58813"/>
		<updated>2023-11-21T11:50:30Z</updated>

		<summary type="html">&lt;p&gt;Kusco: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Status6&lt;/div&gt;</summary>
		<author><name>Kusco</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=File:Status5.png&amp;diff=58812</id>
		<title>File:Status5.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=File:Status5.png&amp;diff=58812"/>
		<updated>2023-11-21T11:50:21Z</updated>

		<summary type="html">&lt;p&gt;Kusco: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Status5&lt;/div&gt;</summary>
		<author><name>Kusco</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=File:Status4.png&amp;diff=58810</id>
		<title>File:Status4.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=File:Status4.png&amp;diff=58810"/>
		<updated>2023-11-21T11:50:14Z</updated>

		<summary type="html">&lt;p&gt;Kusco: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Status4&lt;/div&gt;</summary>
		<author><name>Kusco</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=File:Status3.png&amp;diff=58809</id>
		<title>File:Status3.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=File:Status3.png&amp;diff=58809"/>
		<updated>2023-11-21T11:50:05Z</updated>

		<summary type="html">&lt;p&gt;Kusco: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Status3&lt;/div&gt;</summary>
		<author><name>Kusco</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=File:Status2.png&amp;diff=58808</id>
		<title>File:Status2.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=File:Status2.png&amp;diff=58808"/>
		<updated>2023-11-21T11:49:57Z</updated>

		<summary type="html">&lt;p&gt;Kusco: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Status2&lt;/div&gt;</summary>
		<author><name>Kusco</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=File:Status1.png&amp;diff=58807</id>
		<title>File:Status1.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=File:Status1.png&amp;diff=58807"/>
		<updated>2023-11-21T11:49:49Z</updated>

		<summary type="html">&lt;p&gt;Kusco: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Status1&lt;/div&gt;</summary>
		<author><name>Kusco</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=File:Status0.png&amp;diff=58806</id>
		<title>File:Status0.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=File:Status0.png&amp;diff=58806"/>
		<updated>2023-11-21T11:49:18Z</updated>

		<summary type="html">&lt;p&gt;Kusco: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Status0&lt;/div&gt;</summary>
		<author><name>Kusco</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Gestion_d%27erreur&amp;diff=58805</id>
		<title>Gestion d&#039;erreur</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Gestion_d%27erreur&amp;diff=58805"/>
		<updated>2023-11-21T11:10:31Z</updated>

		<summary type="html">&lt;p&gt;Kusco: /* Les fonctions */&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 : Error_reporting --&amp;gt;&lt;br /&gt;
[[en:Error_reporting]]&lt;br /&gt;
[[es:Gestión_de_errores]]&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Les fonctions=&lt;br /&gt;
La fonction suivante permet de tracer des informations dans le fichier log de Dolibarr :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;dol_syslog($message, LOG_DEBUG|LOG_INFO|LOG_WARN|LOG_ERR);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La fonction suivante provoque l&#039;affichage d&#039;un message d&#039;erreur :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;dol_print_error($db,texte);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les fonctions suivantes permettent d&#039;émettre des messages d&#039;erreurs ou d&#039;information pour les utilisateurs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;setEventMessages(&amp;quot;&amp;quot;, &amp;quot;Message d&#039;erreur à transmettre&amp;quot;, &#039;errors&#039;);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Message bloquant qui empêche l&#039;action&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;setEventMessages(&amp;quot;&amp;quot;, &amp;quot;Message d&#039;information à transmettre&amp;quot;, &#039;mesgs&#039;);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Message non bloquant pour indiquer une validation par exemple&lt;br /&gt;
&lt;br /&gt;
=Module Syslog= &lt;br /&gt;
Le module de traçage est inclus parmi les autres modules administrables de Dolibarr et vous permet de activer/modifier le niveau d&#039;erreur que vous désirez observer.&lt;br /&gt;
&lt;br /&gt;
Pour atteindre la page de configuration de ce module, aller sur la page Accueil-&amp;gt;Configuration-&amp;gt;Modules et cliquez sur l&#039;icone en fin de ligne sur la ligne du module &#039;&#039;Syslog&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Bien sûr, ce module (&#039;&#039;&#039;Syslog&#039;&#039;&#039;) doit être activé pour que les traces fonctionnent.&lt;br /&gt;
&lt;br /&gt;
La notion de &#039;&#039;&#039;facility&#039;&#039;&#039; de syslog est une notion de configuration pré-définie pour loguer les messages. C&#039;est une fonctionnalité système pour dire à l&#039;opérateur système d&#039;où vient une erreur (ici Dolibarr) et indiquer sa priorité. Vous trouverez plus d&#039;informations dans la documentation PHP pour la fonction &#039;&#039;openlog()&#039;&#039; function qui est utilisé dans la fonction &#039;&#039;dol_syslog()&#039;&#039;: http://www.php.ne/openlog&lt;br /&gt;
En général, il vous faut laisser cette valeur à &#039;&#039;&#039;LOG_USER&#039;&#039;&#039;, sauf si vous savez ce que vous faites.&lt;br /&gt;
&lt;br /&gt;
L&#039;option suivante, &#039;&#039;&#039;fichier&#039;&#039;&#039;, permet de choisir dans quel fichier vous allez sauver les logs. Le chemin indiqué doit etre relatif à la racine (/). Si vous le laisser tel quel (option par défaut DOL_DATA_ROOT/dolibarr.log), il sera créé dans le répertoire documents de Dolibarr. Bien sûr, pour cela, votre serveur web doit avoir les droits en écriture sur ce répertoire.&lt;br /&gt;
&lt;br /&gt;
En général, la facility &#039;&#039;&#039;fichier&#039;&#039;&#039; fonctionnera plus souvent car elle ne dépend pas de la configuration système de votre serveur, ni d&#039;un éventuel démon syslog requis (le seul problème qui peut arriver est que le répertoire n&#039;ait pas la permission d&#039;écriture pour le seveur web).&lt;br /&gt;
&lt;br /&gt;
Enfin, le niveau de rapport représente le nombre de types de messages que vous désirez voir. LOG_DEBUG(7) est l&#039;option la plus verbeuse, affichant tout message qui passe par la fonction dol_syslog(). LOG_EMERG(0) est son contraire, ne traçant que les messages qui sont des erreurs graves.&lt;br /&gt;
&lt;br /&gt;
Plus d&#039;information sur la page [[Module Syslog (développeur)]].&lt;br /&gt;
&lt;br /&gt;
=Autres logs systèmes rares=&lt;br /&gt;
Notez, qu&#039;indépendamment du module syslog, vous pouvez aussi trouvez des erreurs techniques PHP/Apache dans les logs d&#039;apache (quelquesoit l&#039;état/configuration du module syslog). Mais cela n&#039;arrive qu&#039;en cas de probleme technique d&#039;installation ou d&#039;environnement. Une application Dolibarr qui fonctionne n&#039;affichera jamais rien dans ces fichiers. Sur un système Linux standard, de telle traces sont visibles dans les fichiers &#039;&#039;&#039;/var/log/apache[2]/[dolibarr]-error.log&#039;&#039;&#039;. Vous pouvez les voir en &#039;&#039;live&#039;&#039; depuis un terminal avec la commande:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;tail -f /var/log/apache2/dolibarr-error.log&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kusco</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Gestion_d%27erreur&amp;diff=58804</id>
		<title>Gestion d&#039;erreur</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Gestion_d%27erreur&amp;diff=58804"/>
		<updated>2023-11-21T11:10:16Z</updated>

		<summary type="html">&lt;p&gt;Kusco: /* Les fonctions */&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 : Error_reporting --&amp;gt;&lt;br /&gt;
[[en:Error_reporting]]&lt;br /&gt;
[[es:Gestión_de_errores]]&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Les fonctions=&lt;br /&gt;
La fonction suivante permet de tracer des informations dans le fichier log de Dolibarr :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;dol_syslog($message, LOG_DEBUG|LOG_INFO|LOG_WARN|LOG_ERR);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La fonction suivante provoque l&#039;affichage d&#039;un message d&#039;erreur :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;dol_print_error($db,texte);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les fonctions suivantes permettent d&#039;émettre des messages d&#039;erreurs ou d&#039;information pour les utilisateurs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;setEventMessages(&amp;quot;&amp;quot;, &amp;quot;Message d&#039;erreur à transmettre&amp;quot;, &#039;errors&#039;);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Message bloquant qui empêche l&#039;action&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;setEventMessages(&amp;quot;&amp;quot;, &amp;quot;Message d&#039;erreur à transmettre&amp;quot;, &#039;mesgs&#039;);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Message non bloquant pour indiquer une validation par exemple&lt;br /&gt;
&lt;br /&gt;
=Module Syslog= &lt;br /&gt;
Le module de traçage est inclus parmi les autres modules administrables de Dolibarr et vous permet de activer/modifier le niveau d&#039;erreur que vous désirez observer.&lt;br /&gt;
&lt;br /&gt;
Pour atteindre la page de configuration de ce module, aller sur la page Accueil-&amp;gt;Configuration-&amp;gt;Modules et cliquez sur l&#039;icone en fin de ligne sur la ligne du module &#039;&#039;Syslog&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Bien sûr, ce module (&#039;&#039;&#039;Syslog&#039;&#039;&#039;) doit être activé pour que les traces fonctionnent.&lt;br /&gt;
&lt;br /&gt;
La notion de &#039;&#039;&#039;facility&#039;&#039;&#039; de syslog est une notion de configuration pré-définie pour loguer les messages. C&#039;est une fonctionnalité système pour dire à l&#039;opérateur système d&#039;où vient une erreur (ici Dolibarr) et indiquer sa priorité. Vous trouverez plus d&#039;informations dans la documentation PHP pour la fonction &#039;&#039;openlog()&#039;&#039; function qui est utilisé dans la fonction &#039;&#039;dol_syslog()&#039;&#039;: http://www.php.ne/openlog&lt;br /&gt;
En général, il vous faut laisser cette valeur à &#039;&#039;&#039;LOG_USER&#039;&#039;&#039;, sauf si vous savez ce que vous faites.&lt;br /&gt;
&lt;br /&gt;
L&#039;option suivante, &#039;&#039;&#039;fichier&#039;&#039;&#039;, permet de choisir dans quel fichier vous allez sauver les logs. Le chemin indiqué doit etre relatif à la racine (/). Si vous le laisser tel quel (option par défaut DOL_DATA_ROOT/dolibarr.log), il sera créé dans le répertoire documents de Dolibarr. Bien sûr, pour cela, votre serveur web doit avoir les droits en écriture sur ce répertoire.&lt;br /&gt;
&lt;br /&gt;
En général, la facility &#039;&#039;&#039;fichier&#039;&#039;&#039; fonctionnera plus souvent car elle ne dépend pas de la configuration système de votre serveur, ni d&#039;un éventuel démon syslog requis (le seul problème qui peut arriver est que le répertoire n&#039;ait pas la permission d&#039;écriture pour le seveur web).&lt;br /&gt;
&lt;br /&gt;
Enfin, le niveau de rapport représente le nombre de types de messages que vous désirez voir. LOG_DEBUG(7) est l&#039;option la plus verbeuse, affichant tout message qui passe par la fonction dol_syslog(). LOG_EMERG(0) est son contraire, ne traçant que les messages qui sont des erreurs graves.&lt;br /&gt;
&lt;br /&gt;
Plus d&#039;information sur la page [[Module Syslog (développeur)]].&lt;br /&gt;
&lt;br /&gt;
=Autres logs systèmes rares=&lt;br /&gt;
Notez, qu&#039;indépendamment du module syslog, vous pouvez aussi trouvez des erreurs techniques PHP/Apache dans les logs d&#039;apache (quelquesoit l&#039;état/configuration du module syslog). Mais cela n&#039;arrive qu&#039;en cas de probleme technique d&#039;installation ou d&#039;environnement. Une application Dolibarr qui fonctionne n&#039;affichera jamais rien dans ces fichiers. Sur un système Linux standard, de telle traces sont visibles dans les fichiers &#039;&#039;&#039;/var/log/apache[2]/[dolibarr]-error.log&#039;&#039;&#039;. Vous pouvez les voir en &#039;&#039;live&#039;&#039; depuis un terminal avec la commande:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;tail -f /var/log/apache2/dolibarr-error.log&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kusco</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Gestion_d%27erreur&amp;diff=58803</id>
		<title>Gestion d&#039;erreur</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Gestion_d%27erreur&amp;diff=58803"/>
		<updated>2023-11-21T11:09:49Z</updated>

		<summary type="html">&lt;p&gt;Kusco: /* Les fonctions */&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 : Error_reporting --&amp;gt;&lt;br /&gt;
[[en:Error_reporting]]&lt;br /&gt;
[[es:Gestión_de_errores]]&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Les fonctions=&lt;br /&gt;
La fonction suivante permet de tracer des informations dans le fichier log de Dolibarr :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;dol_syslog($message, LOG_DEBUG|LOG_INFO|LOG_WARN|LOG_ERR);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La fonction suivante provoque l&#039;affichage d&#039;un message d&#039;erreur :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;dol_print_error($db,texte);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les fonctions suivantes permettent d&#039;émettre des messages d&#039;erreurs ou d&#039;information pour les utilisateurs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;setEventMessages(&amp;quot;&amp;quot;, &amp;quot;Message d&#039;erreur à transmettre&amp;quot;, &#039;errors&#039;);&amp;lt;nowiki&amp;gt;&amp;lt;/source&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Message bloquant qui empêche l&#039;action&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;setEventMessages(&amp;quot;&amp;quot;, &amp;quot;Message d&#039;erreur à transmettre&amp;quot;, &#039;mesgs&#039;);&amp;lt;nowiki&amp;gt;&amp;lt;/source&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Message non bloquant pour indiquer une validation par exemple&lt;br /&gt;
&lt;br /&gt;
=Module Syslog= &lt;br /&gt;
Le module de traçage est inclus parmi les autres modules administrables de Dolibarr et vous permet de activer/modifier le niveau d&#039;erreur que vous désirez observer.&lt;br /&gt;
&lt;br /&gt;
Pour atteindre la page de configuration de ce module, aller sur la page Accueil-&amp;gt;Configuration-&amp;gt;Modules et cliquez sur l&#039;icone en fin de ligne sur la ligne du module &#039;&#039;Syslog&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Bien sûr, ce module (&#039;&#039;&#039;Syslog&#039;&#039;&#039;) doit être activé pour que les traces fonctionnent.&lt;br /&gt;
&lt;br /&gt;
La notion de &#039;&#039;&#039;facility&#039;&#039;&#039; de syslog est une notion de configuration pré-définie pour loguer les messages. C&#039;est une fonctionnalité système pour dire à l&#039;opérateur système d&#039;où vient une erreur (ici Dolibarr) et indiquer sa priorité. Vous trouverez plus d&#039;informations dans la documentation PHP pour la fonction &#039;&#039;openlog()&#039;&#039; function qui est utilisé dans la fonction &#039;&#039;dol_syslog()&#039;&#039;: http://www.php.ne/openlog&lt;br /&gt;
En général, il vous faut laisser cette valeur à &#039;&#039;&#039;LOG_USER&#039;&#039;&#039;, sauf si vous savez ce que vous faites.&lt;br /&gt;
&lt;br /&gt;
L&#039;option suivante, &#039;&#039;&#039;fichier&#039;&#039;&#039;, permet de choisir dans quel fichier vous allez sauver les logs. Le chemin indiqué doit etre relatif à la racine (/). Si vous le laisser tel quel (option par défaut DOL_DATA_ROOT/dolibarr.log), il sera créé dans le répertoire documents de Dolibarr. Bien sûr, pour cela, votre serveur web doit avoir les droits en écriture sur ce répertoire.&lt;br /&gt;
&lt;br /&gt;
En général, la facility &#039;&#039;&#039;fichier&#039;&#039;&#039; fonctionnera plus souvent car elle ne dépend pas de la configuration système de votre serveur, ni d&#039;un éventuel démon syslog requis (le seul problème qui peut arriver est que le répertoire n&#039;ait pas la permission d&#039;écriture pour le seveur web).&lt;br /&gt;
&lt;br /&gt;
Enfin, le niveau de rapport représente le nombre de types de messages que vous désirez voir. LOG_DEBUG(7) est l&#039;option la plus verbeuse, affichant tout message qui passe par la fonction dol_syslog(). LOG_EMERG(0) est son contraire, ne traçant que les messages qui sont des erreurs graves.&lt;br /&gt;
&lt;br /&gt;
Plus d&#039;information sur la page [[Module Syslog (développeur)]].&lt;br /&gt;
&lt;br /&gt;
=Autres logs systèmes rares=&lt;br /&gt;
Notez, qu&#039;indépendamment du module syslog, vous pouvez aussi trouvez des erreurs techniques PHP/Apache dans les logs d&#039;apache (quelquesoit l&#039;état/configuration du module syslog). Mais cela n&#039;arrive qu&#039;en cas de probleme technique d&#039;installation ou d&#039;environnement. Une application Dolibarr qui fonctionne n&#039;affichera jamais rien dans ces fichiers. Sur un système Linux standard, de telle traces sont visibles dans les fichiers &#039;&#039;&#039;/var/log/apache[2]/[dolibarr]-error.log&#039;&#039;&#039;. Vous pouvez les voir en &#039;&#039;live&#039;&#039; depuis un terminal avec la commande:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;tail -f /var/log/apache2/dolibarr-error.log&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kusco</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Gestion_d%27erreur&amp;diff=58802</id>
		<title>Gestion d&#039;erreur</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Gestion_d%27erreur&amp;diff=58802"/>
		<updated>2023-11-21T11:09:32Z</updated>

		<summary type="html">&lt;p&gt;Kusco: /* Les fonctions */&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 : Error_reporting --&amp;gt;&lt;br /&gt;
[[en:Error_reporting]]&lt;br /&gt;
[[es:Gestión_de_errores]]&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Les fonctions=&lt;br /&gt;
La fonction suivante permet de tracer des informations dans le fichier log de Dolibarr :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;dol_syslog($message, LOG_DEBUG|LOG_INFO|LOG_WARN|LOG_ERR);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La fonction suivante provoque l&#039;affichage d&#039;un message d&#039;erreur :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;dol_print_error($db,texte);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les fonctions suivantes permettent d&#039;émettre des messages d&#039;erreurs ou d&#039;information pour les utilisateurs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;dol_syslog($message, LOG_DEBUG|LOG_INFO|LOG_WARN|LOG_ERR);&amp;lt;/source&amp;gt;setEventMessages(&amp;quot;&amp;quot;, &amp;quot;Message d&#039;erreur à transmettre&amp;quot;, &#039;errors&#039;);&amp;lt;nowiki&amp;gt;&amp;lt;/source&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Message bloquant qui empêche l&#039;action&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;dol_syslog($message, LOG_DEBUG|LOG_INFO|LOG_WARN|LOG_ERR);&amp;lt;/source&amp;gt;setEventMessages(&amp;quot;&amp;quot;, &amp;quot;Message d&#039;erreur à transmettre&amp;quot;, &#039;mesgs&#039;);&amp;lt;nowiki&amp;gt;&amp;lt;/source&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Message non bloquant pour indiquer une validation par exemple&lt;br /&gt;
&lt;br /&gt;
=Module Syslog= &lt;br /&gt;
Le module de traçage est inclus parmi les autres modules administrables de Dolibarr et vous permet de activer/modifier le niveau d&#039;erreur que vous désirez observer.&lt;br /&gt;
&lt;br /&gt;
Pour atteindre la page de configuration de ce module, aller sur la page Accueil-&amp;gt;Configuration-&amp;gt;Modules et cliquez sur l&#039;icone en fin de ligne sur la ligne du module &#039;&#039;Syslog&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Bien sûr, ce module (&#039;&#039;&#039;Syslog&#039;&#039;&#039;) doit être activé pour que les traces fonctionnent.&lt;br /&gt;
&lt;br /&gt;
La notion de &#039;&#039;&#039;facility&#039;&#039;&#039; de syslog est une notion de configuration pré-définie pour loguer les messages. C&#039;est une fonctionnalité système pour dire à l&#039;opérateur système d&#039;où vient une erreur (ici Dolibarr) et indiquer sa priorité. Vous trouverez plus d&#039;informations dans la documentation PHP pour la fonction &#039;&#039;openlog()&#039;&#039; function qui est utilisé dans la fonction &#039;&#039;dol_syslog()&#039;&#039;: http://www.php.ne/openlog&lt;br /&gt;
En général, il vous faut laisser cette valeur à &#039;&#039;&#039;LOG_USER&#039;&#039;&#039;, sauf si vous savez ce que vous faites.&lt;br /&gt;
&lt;br /&gt;
L&#039;option suivante, &#039;&#039;&#039;fichier&#039;&#039;&#039;, permet de choisir dans quel fichier vous allez sauver les logs. Le chemin indiqué doit etre relatif à la racine (/). Si vous le laisser tel quel (option par défaut DOL_DATA_ROOT/dolibarr.log), il sera créé dans le répertoire documents de Dolibarr. Bien sûr, pour cela, votre serveur web doit avoir les droits en écriture sur ce répertoire.&lt;br /&gt;
&lt;br /&gt;
En général, la facility &#039;&#039;&#039;fichier&#039;&#039;&#039; fonctionnera plus souvent car elle ne dépend pas de la configuration système de votre serveur, ni d&#039;un éventuel démon syslog requis (le seul problème qui peut arriver est que le répertoire n&#039;ait pas la permission d&#039;écriture pour le seveur web).&lt;br /&gt;
&lt;br /&gt;
Enfin, le niveau de rapport représente le nombre de types de messages que vous désirez voir. LOG_DEBUG(7) est l&#039;option la plus verbeuse, affichant tout message qui passe par la fonction dol_syslog(). LOG_EMERG(0) est son contraire, ne traçant que les messages qui sont des erreurs graves.&lt;br /&gt;
&lt;br /&gt;
Plus d&#039;information sur la page [[Module Syslog (développeur)]].&lt;br /&gt;
&lt;br /&gt;
=Autres logs systèmes rares=&lt;br /&gt;
Notez, qu&#039;indépendamment du module syslog, vous pouvez aussi trouvez des erreurs techniques PHP/Apache dans les logs d&#039;apache (quelquesoit l&#039;état/configuration du module syslog). Mais cela n&#039;arrive qu&#039;en cas de probleme technique d&#039;installation ou d&#039;environnement. Une application Dolibarr qui fonctionne n&#039;affichera jamais rien dans ces fichiers. Sur un système Linux standard, de telle traces sont visibles dans les fichiers &#039;&#039;&#039;/var/log/apache[2]/[dolibarr]-error.log&#039;&#039;&#039;. Vous pouvez les voir en &#039;&#039;live&#039;&#039; depuis un terminal avec la commande:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;tail -f /var/log/apache2/dolibarr-error.log&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kusco</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Gestion_d%27erreur&amp;diff=58801</id>
		<title>Gestion d&#039;erreur</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Gestion_d%27erreur&amp;diff=58801"/>
		<updated>2023-11-21T11:08:10Z</updated>

		<summary type="html">&lt;p&gt;Kusco: Ajouts des messages d&amp;#039;erreurs et d&amp;#039;informations pour les utilisateurs&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 : Error_reporting --&amp;gt;&lt;br /&gt;
[[en:Error_reporting]]&lt;br /&gt;
[[es:Gestión_de_errores]]&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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Les fonctions=&lt;br /&gt;
La fonction suivante permet de tracer des informations dans le fichier log de Dolibarr :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;dol_syslog($message, LOG_DEBUG|LOG_INFO|LOG_WARN|LOG_ERR);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La fonction suivante provoque l&#039;affichage d&#039;un message d&#039;erreur :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;dol_print_error($db,texte);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les fonctions suivantes permettent d&#039;émettre des messages d&#039;erreurs ou d&#039;information pour les utilisateurs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;dol_syslog($message, LOG_DEBUG|LOG_INFO|LOG_WARN|LOG_ERR);&amp;lt;/source&amp;gt;setEventMessages(&amp;quot;&amp;quot;, &amp;quot;Message d&#039;erreur à transmettre&amp;quot;, &#039;errors&#039;);&amp;lt;nowiki&amp;gt;&amp;lt;/source&amp;gt;&amp;lt;/nowiki&amp;gt; Message bloquant qui empêche l&#039;action&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;dol_syslog($message, LOG_DEBUG|LOG_INFO|LOG_WARN|LOG_ERR);&amp;lt;/source&amp;gt;setEventMessages(&amp;quot;&amp;quot;, &amp;quot;Message d&#039;erreur à transmettre&amp;quot;, &#039;mesgs&#039;);&amp;lt;nowiki&amp;gt;&amp;lt;/source&amp;gt;&amp;lt;/nowiki&amp;gt; Message non bloquant pour indiquer une validation par exemple&lt;br /&gt;
&lt;br /&gt;
=Module Syslog= &lt;br /&gt;
Le module de traçage est inclus parmi les autres modules administrables de Dolibarr et vous permet de activer/modifier le niveau d&#039;erreur que vous désirez observer.&lt;br /&gt;
&lt;br /&gt;
Pour atteindre la page de configuration de ce module, aller sur la page Accueil-&amp;gt;Configuration-&amp;gt;Modules et cliquez sur l&#039;icone en fin de ligne sur la ligne du module &#039;&#039;Syslog&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Bien sûr, ce module (&#039;&#039;&#039;Syslog&#039;&#039;&#039;) doit être activé pour que les traces fonctionnent.&lt;br /&gt;
&lt;br /&gt;
La notion de &#039;&#039;&#039;facility&#039;&#039;&#039; de syslog est une notion de configuration pré-définie pour loguer les messages. C&#039;est une fonctionnalité système pour dire à l&#039;opérateur système d&#039;où vient une erreur (ici Dolibarr) et indiquer sa priorité. Vous trouverez plus d&#039;informations dans la documentation PHP pour la fonction &#039;&#039;openlog()&#039;&#039; function qui est utilisé dans la fonction &#039;&#039;dol_syslog()&#039;&#039;: http://www.php.ne/openlog&lt;br /&gt;
En général, il vous faut laisser cette valeur à &#039;&#039;&#039;LOG_USER&#039;&#039;&#039;, sauf si vous savez ce que vous faites.&lt;br /&gt;
&lt;br /&gt;
L&#039;option suivante, &#039;&#039;&#039;fichier&#039;&#039;&#039;, permet de choisir dans quel fichier vous allez sauver les logs. Le chemin indiqué doit etre relatif à la racine (/). Si vous le laisser tel quel (option par défaut DOL_DATA_ROOT/dolibarr.log), il sera créé dans le répertoire documents de Dolibarr. Bien sûr, pour cela, votre serveur web doit avoir les droits en écriture sur ce répertoire.&lt;br /&gt;
&lt;br /&gt;
En général, la facility &#039;&#039;&#039;fichier&#039;&#039;&#039; fonctionnera plus souvent car elle ne dépend pas de la configuration système de votre serveur, ni d&#039;un éventuel démon syslog requis (le seul problème qui peut arriver est que le répertoire n&#039;ait pas la permission d&#039;écriture pour le seveur web).&lt;br /&gt;
&lt;br /&gt;
Enfin, le niveau de rapport représente le nombre de types de messages que vous désirez voir. LOG_DEBUG(7) est l&#039;option la plus verbeuse, affichant tout message qui passe par la fonction dol_syslog(). LOG_EMERG(0) est son contraire, ne traçant que les messages qui sont des erreurs graves.&lt;br /&gt;
&lt;br /&gt;
Plus d&#039;information sur la page [[Module Syslog (développeur)]].&lt;br /&gt;
&lt;br /&gt;
=Autres logs systèmes rares=&lt;br /&gt;
Notez, qu&#039;indépendamment du module syslog, vous pouvez aussi trouvez des erreurs techniques PHP/Apache dans les logs d&#039;apache (quelquesoit l&#039;état/configuration du module syslog). Mais cela n&#039;arrive qu&#039;en cas de probleme technique d&#039;installation ou d&#039;environnement. Une application Dolibarr qui fonctionne n&#039;affichera jamais rien dans ces fichiers. Sur un système Linux standard, de telle traces sont visibles dans les fichiers &#039;&#039;&#039;/var/log/apache[2]/[dolibarr]-error.log&#039;&#039;&#039;. Vous pouvez les voir en &#039;&#039;live&#039;&#039; depuis un terminal avec la commande:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;tail -f /var/log/apache2/dolibarr-error.log&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kusco</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=D%C3%A9veloppement_module&amp;diff=58689</id>
		<title>Développement module</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=D%C3%A9veloppement_module&amp;diff=58689"/>
		<updated>2023-11-10T15:08:48Z</updated>

		<summary type="html">&lt;p&gt;Kusco: /* Définir vos propres box (optionnel) */&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_development --&amp;gt;&lt;br /&gt;
[[en:Module_development]]&lt;br /&gt;
[[es:Desarrollo_de_un_módulo]]&lt;br /&gt;
[[de:Modul_Entwicklung]]&lt;br /&gt;
[[zh:模块开发]]&lt;br /&gt;
[[ja:モジュール_開発]]&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;
Pour créer un nouveau module, il existe plusieurs étapes. Ce didacticiel a pour but de vous décrire chacune d&#039;elles afin d&#039;ajouter un module permettant d&#039;étendre les possibilités de Dolibarr, comme par exemple ajouter une ou plusieurs des fonctionnalités suivantes:&lt;br /&gt;
&lt;br /&gt;
*Ajouter de nouvelles tables en base.&lt;br /&gt;
*Ajouter vos propres entrées dans les menus.&lt;br /&gt;
*Ajouter des objets et des écrans de saisie/consultation de nouvelle tables.&lt;br /&gt;
*Ajouter ou supprimer des onglets sur les pages de vues/édition des objets (facture, produit, commande, événement, ...)&lt;br /&gt;
*Ajouter des exports prédéfinis pour la fonction export.&lt;br /&gt;
*Ajouter de nouvelles boites/widgets pour la home page.&lt;br /&gt;
*Ajouter des variables de substitution.&lt;br /&gt;
*Définir de nouvelles permissions.&lt;br /&gt;
*Déclencher du code automatiquement sur une action Dolibarr particulière.&lt;br /&gt;
*Insérer votre code aux emplacements hooks de Dolibarr&lt;br /&gt;
*Ajouter un modèle de numérotation de la référence des objets créés.&lt;br /&gt;
*Ajouter un modèle de document PDF.&lt;br /&gt;
*Ajouter un nouveau thème.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les chapitres suivants vous présentent comment réaliser tout cela en manuel de manière simple.&lt;br /&gt;
&lt;br /&gt;
=[[File:Art.png]] Création de Module avec le générateur de module=&lt;br /&gt;
Depuis Dolibarr 9.0 il est possible de créer les fichiers principaux de votre module avec le &amp;quot;Générateur de module&amp;quot; (aussi appelé &amp;quot;Module Builder&amp;quot;). Pour l&#039;activer :&lt;br /&gt;
&lt;br /&gt;
*Activez le module &amp;quot;Générateur de Module&amp;quot; (ou &amp;quot;Module builder&amp;quot;) dans la section &amp;quot;Outils multi-modules&amp;quot; de Configuration &amp;gt; Modules/Applications&lt;br /&gt;
&lt;br /&gt;
[[File:Mod_builder_2.png|400px]]&lt;br /&gt;
&lt;br /&gt;
*Puis cliquez sur l’icône &amp;quot;bug&amp;quot; qui est apparue dans la barre de menu en haut à droite&lt;br /&gt;
&lt;br /&gt;
[[File:Mod_builder_3.png|400px]]&lt;br /&gt;
&lt;br /&gt;
=[[File:Art.png]] Exemple de modèle de module externe=&lt;br /&gt;
Un bon modèle/squelette de module externe Dolibarr est disponible ici : [https://github.com/Dolibarr/dolibarr/tree/develop/htdocs/modulebuilder/template GitHub Dolibarr Module Modèle]&lt;br /&gt;
&lt;br /&gt;
=[[File:Art.png]] Créer un module=&lt;br /&gt;
Les sous chapitres suivant décrivent les actions à faire pour créer un module Dolibarr. Les premiers chapitres sont obligatoires quelle que soit la vocation du module, les suivants dépendront de ce que doit faire le module.&lt;br /&gt;
&lt;br /&gt;
==Créer un descripteur de Module (obligatoire)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : Obligatoire dès qu&#039;une extension est développée, quelle que soit sa vocation.&lt;br /&gt;
&#039;&#039;&#039;Depuis Dolibarr 9.0, il est possible de créer le descripteur de votre module avec le &amp;quot;Générateur de module&amp;quot;&#039;&#039;&#039;. Cet outil est encore encours de développement et de maturité mais peut d&#039;ores et déjà être utilisé.&lt;br /&gt;
&lt;br /&gt;
===Créer votre descripteur avec le générateur de module===&lt;br /&gt;
&lt;br /&gt;
*Lancez le générateur de module en cliquant sur l’icône &amp;quot;bug&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[File:Mod_builder_3.png|400px]]&lt;br /&gt;
&lt;br /&gt;
*Entrez le nom de votre module sans espaces (le nom de votre module NE DOIT PAS CONTENIR le caractère underscore ou tiret bas : _) et cliquez sur Créer.&lt;br /&gt;
&lt;br /&gt;
[[File:Mod_builder_4.png|400px]]&lt;br /&gt;
&lt;br /&gt;
*Un module avec ses premiers fichiers a été initialisé. Vous pouvez alors modifier les paramètres du descripteur du module :&lt;br /&gt;
&lt;br /&gt;
[[File:Mod_builder_5.png|400px]]&lt;br /&gt;
&lt;br /&gt;
===Alternative : créer votre descripteur manuellement (sans utiliser le générateur de module)===&lt;br /&gt;
La première étape est donc de créer un fichier de description du module (descripteur). Pour cela:&lt;br /&gt;
&lt;br /&gt;
*Créez le répertoire &#039;&#039;&#039;/htdocs/&#039;&#039;monmodule&#039;&#039;/core/modules&#039;&#039;&#039;. Puis, allez dans le répertoire &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039; et recopiez le fichier modMyModule.class.php dans ce répertoire &#039;&#039;&#039;htdocs/&#039;&#039;monmodule&#039;&#039;/core/modules&#039;&#039;&#039;.&lt;br /&gt;
*Renommez le fichier mod&#039;&#039;&#039;MyModule&#039;&#039;&#039;.class.php en modifiant seulement la partie &#039;&#039;&#039;MyModule&#039;&#039;&#039; (le fichier doit commencer par mod)&lt;br /&gt;
&lt;br /&gt;
Ensuite, modifiez le contenu de ce fichier afin de remplacer :&lt;br /&gt;
&lt;br /&gt;
*les &#039;&#039;modMyModule&#039;&#039; en une valeur qui corresponde à la vocation de votre module. Cette valeur doit toujours commencer par &#039;&amp;lt;nowiki/&amp;gt;&#039;&#039;&#039;mod&#039;&#039;&#039;&#039; et ne contenir que des &#039;&#039;&#039;caractères alphabétiques&#039;&#039;&#039;.&lt;br /&gt;
*$this-&amp;gt;numero = &#039;&#039;100000&#039;&#039; par un numéro de module libre. Pour éviter tout conflit, vous pouvez consulter la page suivante pour retrouver les numéros déjà alloués : [[List of modules id|Liste des id de modules]].&lt;br /&gt;
*Modifier éventuellement les autres variables définies dans le constructeurs (Voir le commentaire dans le code du squelette pour leur signification).&lt;br /&gt;
&lt;br /&gt;
Le descripteur de votre module est alors en place.&lt;br /&gt;
&lt;br /&gt;
===Tester votre descripteur===&lt;br /&gt;
&lt;br /&gt;
Lancez Dolibarr et allez sur la page &#039;&#039;&#039;Configuration-&amp;gt;module&#039;&#039;&#039;, vous devez voir apparaître une nouvelle ligne avec votre nouveau module et la possibilité de l&#039;activer ou non (parcourez tous les onglets de chaque catégories de modules jusqu&#039;à le retrouver).&lt;br /&gt;
C&#039;est la valeur de $this-&amp;gt;special qui détermine dans quel onglet se trouve votre module.&lt;br /&gt;
&lt;br /&gt;
===Nom de module===&lt;br /&gt;
&lt;br /&gt;
Le nom de votre module NE DOIT PAS CONTENIR le caractère underscore ou tiret bas : _&lt;br /&gt;
&lt;br /&gt;
==Arborescence d&#039;un nouveau module==&lt;br /&gt;
Voici l&#039;arborescence à respecter pour l&#039;organisation des fichiers d&#039;un module (cette arborescence sera celle prise d&#039;office si vous générer les fichiers à l&#039;aide de ModuleBuilder).&lt;br /&gt;
&lt;br /&gt;
{{TemplateModuleTreeSimple}}&lt;br /&gt;
&lt;br /&gt;
Un bon modèle/squelette de module externe Dolibarr est disponible ici : [https://github.com/Dolibarr/dolibarr/tree/develop/htdocs/modulebuilder/template GitHub Dolibarr Module Modèle]&lt;br /&gt;
&lt;br /&gt;
==Créer vos tables SQL et les classes PHP DAO (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : Si votre module a besoin de gérer des données qui lui sont propres&lt;br /&gt;
&lt;br /&gt;
===Créer vos fichiers .sql===&lt;br /&gt;
Si votre module a vocation à gérer des données bien à lui, qui n&#039;existent pas en base dans la version standard de Dolibarr, il est nécessaire de définir des tables SQL pour stocker ces données.&lt;br /&gt;
&lt;br /&gt;
Créer un sous-répertoire &#039;&#039;&#039;sql&#039;&#039;&#039; dans le répertoire de votre module (&#039;&#039;&#039;monmodule/sql&#039;&#039;&#039;) afin d&#039;y placer les scripts sql que vous allez créer (Avec ModuleBuilder cette étape sera réalisée automatiquement suite à la création d&#039;un nouvel Objet depuis l&#039;onglet Objet).&lt;br /&gt;
&lt;br /&gt;
Ensuite, vérifiez dans votre fichier descripteur de module, dans la fonction &#039;&#039;&#039;init&#039;&#039;&#039; que la ligne&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;$this-&amp;gt;_load_tables(&#039;/mymodule/sql/&#039;);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
n&#039;est pas commentée.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Règles à respecter:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Ajoutez les fichiers d&#039;ordre de création de vos tables sur le principe de 1 fichier par table, nommé &#039;&#039;&#039;llx_matable.sql&#039;&#039;&#039; (pour la table), accompagné éventuellement du fichier &#039;&#039;&#039;llx_matable.key.sql&#039;&#039;&#039; (pour les index ou clé étrangères). Voir les exemples dans les fichiers existants dans &#039;&#039;&#039;install/mysql/tables&#039;&#039;&#039; pour exemple.&lt;br /&gt;
*Les types et noms recommandés pour les champs SQL sont définis sur la page [[https://wiki.dolibarr.org/index.php/Langages_et_normes#R.C3.A8gles_de_codage_SQL]].&lt;br /&gt;
*Pour ce qui est des commandes permettant d&#039;ajouter/manipuler des données, elles doivent toutes se trouver dans un fichier nommé &#039;&#039;&#039;data.sql&#039;&#039;&#039; situé dans le même répertoire &#039;&#039;&#039;/monmodule/sql/&#039;&#039;&#039;.&lt;br /&gt;
*N&#039;utilisez pas &amp;quot;chaine&amp;quot; mais &#039;chaine&#039; car les guillemets doubles (&amp;quot;) ont une signification particulière en PostGreSQL&lt;br /&gt;
&lt;br /&gt;
Exemple de contenu de fichier data.sql&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
 delete from llx_const where name=&#039;MONMODULE_IT_WORKS&#039; and entity=&#039;__ENTITY__&#039;;&lt;br /&gt;
 insert into llx_const (name, value, type, note, visible, entity) values (&#039;MONMODULE_IT_WORKS&#039;,&#039;1&#039;,&#039;chaine&#039;,&#039;A constant for my module&#039;,1,&#039;__ENTITY__&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les ordres SQL des fichiers doivent être opérationnels pour la base de données &#039;&#039;&#039;mysql&#039;&#039;&#039;.&lt;br /&gt;
Rem: Les fichiers des autres types de bases ne sont pas à maintenir. Ils sont lus et convertis à la volée par le driver de la base de données.&lt;br /&gt;
&lt;br /&gt;
===Tester vos fichiers .sql===&lt;br /&gt;
&lt;br /&gt;
Une fois les fichiers prêts, vous pouvez retourner dans l&#039;écran de gestion des modules de Dolibarr puis désactiver le module, dropper les tables en base (si elles existent déjà) et réactiver le module.&lt;br /&gt;
Les tables doivent alors être recréées par l&#039;activation du module.&lt;br /&gt;
Si tel n&#039;est pas le cas, vérifiez vos scripts en les passant à la main, ou consultez les logs Dolibarr.&lt;br /&gt;
&lt;br /&gt;
===Générer la classe PHP DAO d&#039;accès aux tables===&lt;br /&gt;
&lt;br /&gt;
Le fichier de classe DAO PHP d&#039;un object est généré automatiquement avec ModuleBuilder lors de la création d&#039;un Object.&lt;br /&gt;
&lt;br /&gt;
À défaut d&#039;utiliser le générateur de module, vous trouverez des exemples dans le squelette de module, fichier &#039;&#039;&#039;htdocs/modulebuilder/templates/class/myobject.class.php&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Dans cette classe, se trouvent des méthodes CRUD (Create/Read/Update/Delete) déjà opérationnelles pour faire un insert, un fetch (select), un update, un delete d&#039;une ligne de la table. Éditer le fichier pour utiliser le bon nom de module, de tables et placer ce fichier dans le sous-répertoire de &#039;&#039;&#039;class&#039;&#039;&#039; du module. Le Module Builder permet de faire cela en quelques clics de souris.&lt;br /&gt;
&lt;br /&gt;
==Affichage des onglets (optionnel)==&lt;br /&gt;
&lt;br /&gt;
===Ajouter ou supprimer des onglets sur les fiches objets===&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : Pour ajouter votre propre onglet parmi les onglets d&#039;un object standard (facture, commande, proposition commercial, adhérent...)&lt;br /&gt;
&lt;br /&gt;
Pour cela, allez dans le fichier descripteur de module précédemment créé et modifiez le tableau $this-&amp;gt;tabs:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	// Array to add new pages in new tabs or remove existing one&lt;br /&gt;
	$this-&amp;gt;tabs = array(&#039;objecttype:+tabname1:Title1:mylangfile@monmodule:$user-&amp;gt;rights-&amp;gt;monmodule-&amp;gt;read:/monmodule/mapagetab1.php?id=__ID__&#039;    // To add a new tab identified by code tabname1&lt;br /&gt;
                            &#039;objecttype:+tabname2:Title2:mylangfile@monmodule:$user-&amp;gt;rights-&amp;gt;monmodule-&amp;gt;read:/monmodule/mapagetab2.php?id=__ID__&#039;,   // To add a new tab identified by code tabname2&lt;br /&gt;
                            &#039;objecttype:-tabname&#039;);                                                     // To remove an existing tab identified by code tabname&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le tableau doit contenir une liste de chaîne, chaque chaîne représentant un nouvel onglet.&lt;br /&gt;
Le format de la chaîne étant composé de 6 parties séparées par &amp;quot;:&amp;quot;&lt;br /&gt;
&lt;br /&gt;
*Partie 1 : le type d&#039;élément (objecttype) dans lequel doit apparaître l&#039;onglet qui est une valeur parmi celle-ci:&lt;br /&gt;
{{TemplateModuleTabs-fr}}&lt;br /&gt;
&lt;br /&gt;
*Partie 2 : nom de code pour l&#039;onglet à ajouter (commence par +) ou à enlever (commence par -)&lt;br /&gt;
*Partie 3 : le titre de l&#039;onglet. Cela peut être un libellé en dur ou mieux un code traduction présent dans un fichier lang.&lt;br /&gt;
*Partie 4 : le nom du fichier .lang (sans l&#039;extension .lang) qui contient la correspondance entre le code traduction et le libellé à afficher. Si ce com est suivi de @monmodule, Dolibarr cherche le fichier dans le répertoire lang propre au module, c&#039;est à dire htdocs/monmodule/langs/code_CODE/monmodule.lang, sinon Dolibarr cherche le fichier traduction dans htdocs/langs/code_CODE/mylangfile.lang&lt;br /&gt;
*Partie 5 : une condition à tester pour savoir si l&#039;onglet doit être visible ou pas. Mettre &#039;1&#039; pour qu&#039;il soit toujours visible.&lt;br /&gt;
*Partie 6 : l&#039;url de la page à afficher quand on clique sur l&#039;onglet. La chaine __ID__ sera remplacée automatiquement par l&#039;Id de l&#039;entité concernée.&lt;br /&gt;
&lt;br /&gt;
Pour que la déclaration soit effective, il faut désactiver et réactiver le module.&lt;br /&gt;
&lt;br /&gt;
Pour alimenter le contenu de l&#039;onglet avec des données issues de la base, voir le chapitre suivant.&lt;br /&gt;
&lt;br /&gt;
===Ajouter les onglets standard d&#039;un objet sur sa propre page d&#039;onglet===&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : Pour afficher les onglets existant d&#039;un objet standard (produit, tiers, etc.) sur votre nouvelle page onglet.&lt;br /&gt;
&lt;br /&gt;
Il faut appliquer la procédure suivante :&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Inclure les fichiers définissant les fonctions utiles dans vos fichiers&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Pour chaque fiche entité, il y a deux fichiers à inclure avec l&#039;instruction&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;require_once($url_fichier) ;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici quelques exemples de fichiers à inclure (DOL_DOCUMENT_ROOT correspond au dossier dolibarr/htdocs/) :&lt;br /&gt;
&lt;br /&gt;
*Entité tiers (thirdparty) :&lt;br /&gt;
**DOL_DOCUMENT_ROOT/societe/class/societe.class.php&lt;br /&gt;
**DOL_DOCUMENT_ROOT/core/lib/company.lib.php&lt;br /&gt;
*Entité produit (product) :&lt;br /&gt;
**DOL_DOCUMENT_ROOT/product/class/product.class.php&lt;br /&gt;
**DOL_DOCUMENT_ROOT/core/lib/product.lib.php&lt;br /&gt;
*Entité facture (invoice) :&lt;br /&gt;
**DOL_DOCUMENT_ROOT/compta/facture/facture.class.php&lt;br /&gt;
**DOL_DOCUMENT_ROOT/core/lib/invoice.lib.php&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Créer et charger l&#039;objet à afficher dans votre onglet&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Créez l&#039;objet de la classe voulue, et récupérez les données de l&#039;objet à partir de la base de données. Pour cela il faut utiliser les fonctions fetch() de la classe correspondante, en passant en paramètre l&#039;identifiant de l&#039;objet que vous récupérez depuis l&#039;url (ex : /mononglet.php?id=1).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Exemple :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$id=GETPOST(&#039;id&#039;,&#039;int&#039;);&lt;br /&gt;
$ref=GETPOST(&#039;ref&#039;,&#039;alpha&#039;);&lt;br /&gt;
$product = new Product($db) ;&lt;br /&gt;
$result = $product-&amp;gt;fetch($id, $ref) ; //Tester $result pour vérifier que l&#039;accès à la base s&#039;est bien passée&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3. Récupérer la liste des onglets correspondant à l&#039;entité choisie&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Utilisez la fonction XXX_prepare_head($obj), ou XXX est le nom de l&#039;entité, permettant de créer un tableau contenant les définitions des onglets à afficher. Le paramètre à passer est l&#039;objet pour lequel vous voulez afficher les onglets.&lt;br /&gt;
&lt;br /&gt;
Le tableau retourné est composé de la façon suivante :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$head        // Tableau des onglets&lt;br /&gt;
$head[$h]    // Élément décrivant un onglet. Il y aura autant de $h que d&#039;onglets à afficher&lt;br /&gt;
$head[$h][0] // Url de la page affichée quand on clique sur l&#039;onglet&lt;br /&gt;
$head[$h][1] // Titre de l’onglet&lt;br /&gt;
$head[$h][2] // Code de l&#039;onglet, à utiliser pour choisir quel onglet sera &#039;actif&#039; (voir paragraphe suivant)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Exemple :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$head = product_prepare_head($product, $user) ; //le paramètre $user n&#039;est pas présent sur certaines fonctions&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4. Afficher les onglets sur votre page onglet&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Utilisez la fonction dol_fiche_head() qui affiche les onglets contenus dans le tableau $head retourné par XX_prepare_head().&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
dol_fiche_head($links, $active=&#039;0&#039;, $title=&#039;&#039;, $notab=0, $picto=&#039;&#039;)&lt;br /&gt;
//$links  // Tableau des onglets, appelé $head plus haut.&lt;br /&gt;
//$active // Onglet actif (mettre le nom de l&#039;onglet défini dans votre fichier de module, ou un nom contenu dans $head[$h][2]). Cet onglet sera mis en surbrillance&lt;br /&gt;
//$title  // ?&lt;br /&gt;
//$notab  // Mettre ce paramètre à 1 permet de ne pas afficher de zone bleue en dessous des onglets.&lt;br /&gt;
//$picto  // Nom de l&#039;image à utiliser au début de la barre des onglet. Les choix suivant sont possibles :&lt;br /&gt;
//            product&lt;br /&gt;
//            service&lt;br /&gt;
//            company&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette fonction affiche les onglets voulus et ouvre un élément &#039;&#039;&amp;lt; div class=&amp;quot;&amp;quot; &amp;gt;&#039;&#039; qui correspond à la zone bleue sous les onglets (si paramètre $notab = 0). Pour fermer la zone bleue, il suffit de fermer l&#039;élément &#039;&#039;&amp;lt; /div &amp;gt;&#039;&#039; dans le code PHP.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Remarque&#039;&#039; :&lt;br /&gt;
Pour plus de détail, se référer à la [http://www.dolibarr.fr/doxygen/ documentation Doxygen] ou directement au code de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
==Créer vos pages écran PHP (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : Si l&#039;objet de votre module est d&#039;ajouter des fonctionnalités qui nécessitent de nouveaux écrans.&lt;br /&gt;
&lt;br /&gt;
===Créer une page écran PHP brute===&lt;br /&gt;
Vous pouvez ensuite créer vos pages PHP, qui se basent sur les données de vos tables, en utilisant les squelettes fournis comme exemple dans le répertoire &#039;&#039;&#039;modulebuilder&#039;&#039;&#039; (Pour le développement d&#039;un script en ligne de commande, voir [[Développement de scripts]]). La encore, si vous avez utilisez ModuleBuilder, des cas de pages (liste, page de création, onglet notes, etc...) auront été créés automatiquement lors de l&#039;initialisation de l&#039;objet.&lt;br /&gt;
&lt;br /&gt;
Pour créer une nouvelle page écran utilisateur, créez un sous-répertoire de &#039;&#039;&#039;htdocs&#039;&#039;&#039; (si non déjà fait) propre à votre module (Dans &#039;&#039;&#039;htdocs/monmodule&#039;&#039;&#039; par exemple) afin d&#039;y placer les pages que vous allez créer.&lt;br /&gt;
&lt;br /&gt;
Y recopier le fichier &#039;&#039;&#039;myobject_page.php&#039;&#039;&#039; qui va servir de point de départ.&lt;br /&gt;
Modifiez le fichier afin que le main.inc.php soit trouvé&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Load Dolibarr environment&lt;br /&gt;
$res=0;&lt;br /&gt;
// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined)&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; ! empty($_SERVER[&amp;quot;CONTEXT_DOCUMENT_ROOT&amp;quot;])) $res=@include($_SERVER[&amp;quot;CONTEXT_DOCUMENT_ROOT&amp;quot;].&amp;quot;/main.inc.php&amp;quot;);&lt;br /&gt;
// Try main.inc.php into web root detected using web root calculated from SCRIPT_FILENAME&lt;br /&gt;
$tmp=empty($_SERVER[&#039;SCRIPT_FILENAME&#039;])?&#039;&#039;:$_SERVER[&#039;SCRIPT_FILENAME&#039;];$tmp2=realpath(__FILE__); $i=strlen($tmp)-1; $j=strlen($tmp2)-1;&lt;br /&gt;
while($i &amp;gt; 0 &amp;amp;&amp;amp; $j &amp;gt; 0 &amp;amp;&amp;amp; isset($tmp[$i]) &amp;amp;&amp;amp; isset($tmp2[$j]) &amp;amp;&amp;amp; $tmp[$i]==$tmp2[$j]) { $i--; $j--; }&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; $i &amp;gt; 0 &amp;amp;&amp;amp; file_exists(substr($tmp, 0, ($i+1)).&amp;quot;/main.inc.php&amp;quot;)) $res=@include(substr($tmp, 0, ($i+1)).&amp;quot;/main.inc.php&amp;quot;);&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; $i &amp;gt; 0 &amp;amp;&amp;amp; file_exists(dirname(substr($tmp, 0, ($i+1))).&amp;quot;/main.inc.php&amp;quot;)) $res=@include(dirname(substr($tmp, 0, ($i+1))).&amp;quot;/main.inc.php&amp;quot;);&lt;br /&gt;
// Try main.inc.php using relative path&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; file_exists(&amp;quot;../main.inc.php&amp;quot;)) $res=@include(&amp;quot;../main.inc.php&amp;quot;);&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; file_exists(&amp;quot;../../main.inc.php&amp;quot;)) $res=@include(&amp;quot;../../main.inc.php&amp;quot;);&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; file_exists(&amp;quot;../../../main.inc.php&amp;quot;)) $res=@include(&amp;quot;../../../main.inc.php&amp;quot;);&lt;br /&gt;
if (! $res) die(&amp;quot;Include of main fails&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Comme vous pouvez le constater, plusieurs tentatives de chargement du fichier main.inc.php (ou master.inc.php) ont été tentées. Le but est de réussir dans le plus grand nombre de cas possibles. Le minimum est de 2 lignes: une pour essayer de charger le fichier master / main.inc.php dans le répertoire racine de dolibarr et une autre pour essayer de charger le fichier afin de prendre en charge le cas où le module est déployé dans le répertoire &amp;quot;custom&amp;quot;. Mais vous pouvez avoir à gérer plus de situations. L&#039;exemple fourni devrait pouvoir charger le fichier main / master.inc.php dans presque toutes les situations / configurations.&lt;br /&gt;
&lt;br /&gt;
Notez que vous pouvez ajouter plus &amp;quot;../&amp;quot; en fonction de la profondeur du fichier par rapport à l&#039;arborescence de votre module.&lt;br /&gt;
&lt;br /&gt;
C&#039;est dans le main qu&#039;est chargé l&#039;environnement technique ainsi que les habilitations. Les variables objets suivantes sont alors positionnées:&lt;br /&gt;
&lt;br /&gt;
*$user    L&#039;objet qui contient les caractéristiques de l&#039;utilisateur + ses droits.&lt;br /&gt;
*$conf    L&#039;objet qui contient la configuration de Dolibarr.&lt;br /&gt;
*$db      L&#039;objet qui contient le handler de connexion à la base de données.&lt;br /&gt;
*$langs   L&#039;objet qui contient la langue de l&#039;utilisateur.&lt;br /&gt;
&lt;br /&gt;
*L&#039;inclusion d&#039;une classe ou librairie dédiée au module, sans savoir d&#039;où le fichier sera appelé, se fait en utilisant une fonction de Dolibarr (et non en utilisant directement le include_once)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Exemple :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
dol_include_once(&#039;/monmodule/class/maclasse.class.php&#039;, &#039;MaClasse&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*L&#039;appel des classes fournies en standard avec Dolibarr se fera par contre par le require_once directe avec la syntaxe suivante:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Exemple :&#039;&#039;&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/doli.class.php&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La raison est que si le dol_include_once est pratique car il scanne chaque répertoire de chemin alternatif pour trouver le fichier, il est aussi moins performant car génère des accès et recherches disque à chaque appel (en effet, PHP intègre un cache des fichiers lus mais n&#039;intègre pas un cache des fichiers &amp;quot;non trouvés&amp;quot;. Et comme un fichier donné n&#039;est que dans une seule arborescence, il y a toujours une arborescence alternative où il ne se trouve pas et qui génère des accès superflus au disque dur, pénalisant en terme de performance. Comme pour les fichiers internes à Dolibarr, on connait toujours le chemin exacte, le require_once avec ce chemin direct doit être préféré).&lt;br /&gt;
&lt;br /&gt;
===Accès à la base===&lt;br /&gt;
Si vous avez besoin de réaliser des modifications en base dans votre propre table ajoutée, utilisez la classe générée plus haut qui contient les méthodes pour cela.&lt;br /&gt;
&lt;br /&gt;
Si toutefois vous voulez faire des accès dans des tables sans objet PHP dédié, ceci reste possible (par exemple pour récupérer une liste d&#039;enregistrement). Dans ce cas, pensez à suivre ces exemples:&lt;br /&gt;
&lt;br /&gt;
Pour un insert, update ou delete :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$db-&amp;gt;begin();   // Debut transaction&lt;br /&gt;
$db-&amp;gt;query(&amp;quot;Ma requete insert, update ou delete&amp;quot;);&lt;br /&gt;
$db-&amp;gt;commit();       // Valide&lt;br /&gt;
ou $db-&amp;gt;rollback()  // Annule&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour une lecture :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$resql=$db-&amp;gt;query(&amp;quot;Ma requete select&amp;quot;);&lt;br /&gt;
if ($resql)&lt;br /&gt;
{&lt;br /&gt;
	$num = $db-&amp;gt;num_rows($resql);&lt;br /&gt;
	$i = 0;&lt;br /&gt;
	if ($num)&lt;br /&gt;
	{&lt;br /&gt;
		while ($i &amp;lt; $num)&lt;br /&gt;
		{&lt;br /&gt;
			$obj = $db-&amp;gt;fetch_object($resql);&lt;br /&gt;
			if ($obj)&lt;br /&gt;
			{&lt;br /&gt;
				// You can use here results&lt;br /&gt;
				print $obj-&amp;gt;field1;&lt;br /&gt;
				print $obj-&amp;gt;field2;&lt;br /&gt;
			}&lt;br /&gt;
			$i++;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Définition du style===&lt;br /&gt;
Pour que le look de la page soit aligné avec le thème Dolibarr, il est nécessaire d&#039;utiliser les styles des CSS de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
Par exemple :&lt;br /&gt;
&lt;br /&gt;
*class=&amp;quot;&#039;&#039;&#039;liste_titre&#039;&#039;&#039;&amp;quot; sur les balises &#039;&#039;tr&#039;&#039; et &#039;&#039;td&#039;&#039; pour une ligne de titre de tableau.&lt;br /&gt;
*class=&amp;quot;&#039;&#039;&#039;pair&#039;&#039;&#039;&amp;quot; ou class=&amp;quot;&#039;&#039;&#039;impair&#039;&#039;&#039;&amp;quot; sur les balises &#039;&#039;tr&#039;&#039; et &#039;&#039;td&#039;&#039; des lignes de données de tableau.&lt;br /&gt;
*class=&amp;quot;&#039;&#039;&#039;flat&#039;&#039;&#039;&amp;quot; sur tous les champs de saisie (&#039;&#039;input, select, textarea&#039;&#039;...).&lt;br /&gt;
*class=&amp;quot;&#039;&#039;&#039;button&#039;&#039;&#039;&amp;quot; sur les objets de type &#039;&#039;input type=&amp;quot;submit&amp;quot;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Utilisez le sélecteur de date de Dolibarr===&lt;br /&gt;
Si vous le désirez, vous pouvez profiter du sélecteur de date dans des écrans Dolibarr. Pour cela, utilisez la ligne suivante:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$form=new Form($db);&lt;br /&gt;
$form-&amp;gt;select_date(&#039;&#039;,&#039;mykey&#039;,0,0,0,&amp;quot;myform&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La chaîne mykey identifie la zone date. Il faut y mettre une valeur différente s&#039;il y a plusieurs zones.&lt;br /&gt;
La chaine myform est le nom de la zone FORM (dans form name=&amp;quot;myform&amp;quot; de la page HTML).&lt;br /&gt;
L&#039;affichage d&#039;un sélecteur de date doit donc être intégré dans une zone FORM Html.&lt;br /&gt;
&lt;br /&gt;
Pour récupérer la valeur, à l&#039;issu du POST, la commande est:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$mydate = dol_mktime(12, 0 , 0, GETPOST(&#039;mykeymonth&#039;, &#039;int&#039;), GETPOST(&#039;mykeyday&#039;, &#039;int&#039;), GETPOST(&#039;mykeyyear&#039;, &#039;int&#039;));&lt;br /&gt;
print strftime(&#039;%A %d %B %Y&#039;, $mydate);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Définir votre page de configuration (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : si votre module offre plusieurs options paramétrables.&lt;br /&gt;
&lt;br /&gt;
===Créez votre page d&#039;édition de configuration===&lt;br /&gt;
Si votre module offre plusieurs options paramétrables, il est nécessaire de créer une page PHP pour éditer les options (qui sont stockées dans la [[Table llx_const|table &#039;&#039;&#039;llx_const&#039;&#039;&#039;]]).&lt;br /&gt;
Créez une page PHP nommée &#039;&#039;&#039;monmodule_setupapage.php&#039;&#039;&#039; qui affiche les options possibles et les met à jour.&lt;br /&gt;
Il est nécessaire de prendre exemple sur une page dans &#039;&#039;&#039;/admin&#039;&#039;&#039; qui vous montre la méthode pour lire ou sauvegarder en base votre option.&lt;br /&gt;
Placez cette page de configuration dans le répertoire &#039;&#039;&#039;/admin&#039;&#039;&#039; également.&lt;br /&gt;
Ensuite dans le descripteur de module, modifiez la variable pour indiquer le nom de cette page PHP (sans le chemin qui n&#039;est pas nécessaire, la page étant forcément dans le rep admin).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;config_page_url = array(&amp;quot;setup.php@mymodule&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Testez votre page===&lt;br /&gt;
Allez sur la page &#039;&#039;&#039;Configuration-&amp;gt;module&#039;&#039;&#039;, vous devez voir apparaître une icône qui permet d&#039;accéder à la page de configuration et vous devez être capable de modifier ces options et les voir conservées en base.&lt;br /&gt;
&lt;br /&gt;
==Définir vos entrées de menu (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : si vous avez créé des pages PHP, il est nécessaire que ces écrans soient accessibles depuis le menu Dolibarr.&lt;br /&gt;
&lt;br /&gt;
===Définissez vos entrées menus===&lt;br /&gt;
Pour cela, il vous faut définir dans le fichier descripteur de module, le tableau this-&amp;gt;menu qui déclare les menus.&lt;br /&gt;
Ce tableau contient toutes les entrées qui apparaîtront dans les menus une fois le module activé.&lt;br /&gt;
Le fichier de descripteur de module exemple &#039;&#039;&#039;modMonModule.class.php&#039;&#039;&#039; possède un exemple de déclaration de menu haut ainsi que de ses entrées menu gauche associées.&lt;br /&gt;
&lt;br /&gt;
Voici un exemple de déclaration d&#039;entrées de menu dans le fichier descripteur:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Main menu entries&lt;br /&gt;
$this-&amp;gt;menu = array();			// List of menus to add&lt;br /&gt;
$r=0;&lt;br /&gt;
&lt;br /&gt;
// Add here entries to declare new menus&lt;br /&gt;
// Example to declare the Top Menu entry:&lt;br /&gt;
$this-&amp;gt;menu[$r]=array(	&#039;fk_menu&#039;=&amp;gt;0,			// Put 0 if this is a top menu&lt;br /&gt;
			&#039;type&#039;=&amp;gt;&#039;top&#039;,			// This is a Top menu entry&lt;br /&gt;
			&#039;titre&#039;=&amp;gt;&#039;MonModule top menu&#039;,&lt;br /&gt;
			&#039;mainmenu&#039;=&amp;gt;&#039;monmodule&#039;,&lt;br /&gt;
			&#039;leftmenu&#039;=&amp;gt;&#039;monmodule&#039;,&lt;br /&gt;
			&#039;url&#039;=&amp;gt;&#039;/monmodule/pagetop.php&#039;,&lt;br /&gt;
			&#039;langs&#039;=&amp;gt;&#039;mylangfile&#039;,	// Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.&lt;br /&gt;
			&#039;position&#039;=&amp;gt;100,&lt;br /&gt;
			&#039;enabled&#039;=&amp;gt;&#039;1&#039;,			// Define condition to show or hide menu entry. Use &#039;$conf-&amp;gt;monmodule-&amp;gt;enabled&#039; if entry must be visible if module is enabled.&lt;br /&gt;
			&#039;perms&#039;=&amp;gt;&#039;1&#039;,			// Use &#039;perms&#039;=&amp;gt;&#039;$user-&amp;gt;rights-&amp;gt;monmodule-&amp;gt;level1-&amp;gt;level2&#039; if you want your menu with a permission rules&lt;br /&gt;
			&#039;target&#039;=&amp;gt;&#039;&#039;,&lt;br /&gt;
			&#039;user&#039;=&amp;gt;2);				// 0=Menu for internal users, 1=external users, 2=both&lt;br /&gt;
$r++;&lt;br /&gt;
&lt;br /&gt;
// Example to declare a Left Menu entry:&lt;br /&gt;
$this-&amp;gt;menu[$r]=array(	&#039;fk_menu&#039;=&amp;gt;&#039;fk_mainmenu=xxx&#039;,	// Use &#039;fk_mainmenu=xxx&#039; or &#039;fk_mainmenu=xxx,fk_leftmenu=yyy&#039; where xxx is mainmenucode and yyy is a leftmenucode of parent menu&lt;br /&gt;
			&#039;type&#039;=&amp;gt;&#039;left&#039;,			// This is a Left menu entry&lt;br /&gt;
			&#039;titre&#039;=&amp;gt;&#039;MonModule left menu 1&#039;,&lt;br /&gt;
			&#039;mainmenu&#039;=&amp;gt;&#039;xxx&#039;,&lt;br /&gt;
                        &#039;leftmenu&#039;=&amp;gt;&#039;yyy&#039;,&lt;br /&gt;
			&#039;url&#039;=&amp;gt;&#039;/monmodule/pagelevel1.php&#039;,&lt;br /&gt;
			&#039;langs&#039;=&amp;gt;&#039;mylangfile&#039;,	// Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.&lt;br /&gt;
			&#039;position&#039;=&amp;gt;100,&lt;br /&gt;
			&#039;enabled&#039;=&amp;gt;&#039;1&#039;,			// Define condition to show or hide menu entry. Use &#039;$conf-&amp;gt;monmodule-&amp;gt;enabled&#039; if entry must be visible if module is enabled.&lt;br /&gt;
			&#039;perms&#039;=&amp;gt;&#039;1&#039;,			// Use &#039;perms&#039;=&amp;gt;&#039;$user-&amp;gt;rights-&amp;gt;monmodule-&amp;gt;level1-&amp;gt;level2&#039; if you want your menu with a permission rules&lt;br /&gt;
			&#039;target&#039;=&amp;gt;&#039;&#039;,&lt;br /&gt;
			&#039;user&#039;=&amp;gt;2);				// 0=Menu for internal users,1=external users, 2=both&lt;br /&gt;
$r++;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour conditionner l&#039;accès au menu selon des permission, modifier la propriété &#039;&#039;&#039;perms&#039;&#039;&#039; du tableau. Voir le chapitre sur les permissions un peu plus loin pour savoir comment ajouter des permissions.&lt;br /&gt;
&lt;br /&gt;
===Testez vos entrées menus===&lt;br /&gt;
Désactiver et réactiver votre module sous Dolibarr, les entrées menus doivent alors apparaître (si la condition dans &#039;enabled&#039; est vraie).&lt;br /&gt;
&lt;br /&gt;
==Définir vos propres permissions (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : Si vous voulez ajouter de nouvelles permissions.&lt;br /&gt;
&lt;br /&gt;
La définition des permissions que gérera votre module se fait dans le fichier descripteur créé dans la première étape.&lt;br /&gt;
Modifier la ligne &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;rights_class = &#039;monmodule&#039;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
pour y mettre la bonne valeur de monmodule.&lt;br /&gt;
&lt;br /&gt;
Ensuite remplissez le tableau $this-&amp;gt;rights avec autant d&#039;entrées que de permissions différentes à gérer.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;rights[$r][0] = 10001;&lt;br /&gt;
$this-&amp;gt;rights[$r][1] = &#039;Libelle par défaut de ma permission&#039;;&lt;br /&gt;
$this-&amp;gt;rights[$r][3] = 1;&lt;br /&gt;
$this-&amp;gt;rights[$r][4] = &#039;action&#039;;&lt;br /&gt;
$this-&amp;gt;rights[$r][5] = &#039;sousaction&#039;;&lt;br /&gt;
$r++;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans $this-&amp;gt;rights[$r][0], mettre un id de permission non déjà pris (Voir dans le menu &#039;&#039;&#039;Infos Système&#039;&#039;&#039; sur une installation de Dolibarr opérationnelle pour connaître les id déjà utilisés.&lt;br /&gt;
Dans $this-&amp;gt;rights[$r][3], mettre 1 si cette permission est attribué d&#039;office par défaut quand un utilisateur est créé.&lt;br /&gt;
Dans $this-&amp;gt;rights[$r][1], mettre un libellé par défaut (il sera affiché si aucune traduction n&#039;est trouvé pour votre permission dans le fichier &#039;&#039;&#039;admin.lang&#039;&#039;&#039;. La clé de traduction dit être &amp;quot;Permission10001=Description de ma super permission&#039;&#039;&#039;&amp;quot;&#039;&#039;&#039;).&lt;br /&gt;
Dans $this-&amp;gt;rights[$r][4] et $this-&amp;gt;rights[$r][5], mettre une chaîne action et sous action sans espace. Vous pourrez alors tester dans le code PHP si un utilisateurs a bien les droits par la séquence suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
if ($user-&amp;gt;rights-&amp;gt;monmodule-&amp;gt;action-&amp;gt;sousaction) ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Définir vos propres box/widgets (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : si votre module amène avec lui une ou plusieurs Boxes.&lt;br /&gt;
&lt;br /&gt;
===Définissez vos box===&lt;br /&gt;
Pour cela, modifiez les tableaux $this-&amp;gt;boxes du fichier descripteur de module.&lt;br /&gt;
Il suffit d&#039;ajouter 2 lignes par fichier box que vous allez créer dans le répertoire &#039;&#039;&#039;htdocs/monmodule/core/boxes&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Exemple :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;boxes[0][&#039;file&#039;]=&#039;mabox0.php@monmodule&#039;&lt;br /&gt;
$this-&amp;gt;boxes[0][&#039;note&#039;]=&#039;Ma box 0&#039;&lt;br /&gt;
 ...&lt;br /&gt;
$this-&amp;gt;boxes[n][&#039;file&#039;]=&#039;maboxn.php@monmodule&#039;&lt;br /&gt;
$this-&amp;gt;boxes[n][&#039;note&#039;]=&#039;Ma box n&#039;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite créez les fichiers &#039;&#039;&#039;htdocs/monmodule/core/boxes/mabox0.php&#039;&#039;&#039;, &#039;&#039;&#039;htdocs/monmodule/core/boxes/mabox1.php&#039;&#039;&#039;... en prenant exemple sur des box existantes (exemple dans le répertoire &#039;&#039;&#039;htdocs/core/boxes&#039;&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
===Testez la présence de vos box dans Dolibarr===&lt;br /&gt;
Désactivez et réactivez le module.&lt;br /&gt;
&lt;br /&gt;
Allez dans le menu &#039;&#039;&#039;Accueil - Configuration - Boite&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Vos box doivent apparaître dans la liste des box activables. Activez les puis allez sur la page d&#039;accueil et vérifiez qu&#039;elles s&#039;affichent correctement.&lt;br /&gt;
&lt;br /&gt;
==Définir vos propres exports (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : si votre module amène avec lui des exports prédéfinis de données (pour ces propres tables ou des tables déjà existantes d&#039;un autre module de Dolibarr).&lt;br /&gt;
&lt;br /&gt;
===Définissez l&#039;export===&lt;br /&gt;
Pour cela, décommentez et modifiez les tableaux $this-&amp;gt;export_xxx du votre fichier descripteur de module.&lt;br /&gt;
&lt;br /&gt;
===Testez votre export===&lt;br /&gt;
Allez dans le menu outils -&amp;gt; export de Dolibarr. Votre export doit apparaitre dans la liste des exports prédéfinis disponibles (si votre module est bien activé).&lt;br /&gt;
Le choisir, vous devez alors voir les champs possibles définis dans le tableau à l&#039;étape précédente.&lt;br /&gt;
Choissez quelques champs et tentez une génération du fichier export.&lt;br /&gt;
&lt;br /&gt;
==Définir vos styles CSS (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : lorsque dans vos écrans PHP, vous utiliser des classes de styles qui ne sont pas celle des thèmes de Dolibarr (non recommandé).&lt;br /&gt;
&lt;br /&gt;
Cette fonctionnalité est décrite mais pas encore opérationnel en 2.4&lt;br /&gt;
&lt;br /&gt;
===Créez et déclarez votre feuille de style===&lt;br /&gt;
Créez un fichier de style css nommé &#039;&#039;&#039;monmodule.css&#039;&#039;&#039; ou &#039;&#039;&#039;monmodule.css.php&#039;&#039;&#039; et placez le dans le répertoire &#039;&#039;&#039;&#039;&#039;monmodule&#039;&#039;&#039;&#039;&#039; dans &#039;&#039;&#039;htdocs&#039;&#039;&#039;. Il ne peut y avoir qu&#039;un fichier css propre à chaque module.&lt;br /&gt;
Rappelons qu&#039;il vaut mieux utiliser les styles déjà existant de Dolibarr (le fichier css utilisé par Dolibarr étant le fichier &#039;&#039;&#039;themes/nomtheme/&#039;&#039;nomtheme&#039;&#039;.css.php&#039;&#039;&#039;). Ne créez un fichier css propre à votre module que si vous devez absolument gérer des styles non déjà existants.&lt;br /&gt;
Une fois votre feuille de style prête, déclarez la dans votre fichier descripteur de module en modifiant la propriété &#039;&#039;&#039;$this-&amp;gt;module_parts&#039;&#039;&#039;.&lt;br /&gt;
La valeur à renseigner ici doit être le chemin relatif de l&#039;URL de votre fichier css.&lt;br /&gt;
Par exemple&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;module_parts = array(&#039;css&#039; =&amp;gt; array(&#039;/monmodule/css/monmodule.css.php&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Testez votre feuille de style===&lt;br /&gt;
Désactivez et réactivez votre module.&lt;br /&gt;
&lt;br /&gt;
Appelez la page d&#039;accueil de Dolibarr. Affichez la source de la page HTML.&lt;br /&gt;
&lt;br /&gt;
Vous devriez voir dans l&#039;entête HTML, une ligne déclarant votre feuille de style.&lt;br /&gt;
&lt;br /&gt;
==Définir vos fonctions Javascript (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : lorsque dans vos écrans PHP, vous utiliser des fonctions javascript non dispo en standard (fichier lib_head.js)&lt;br /&gt;
&lt;br /&gt;
Si dans vos écrans PHP, vous utilisez des fonctions javascript, il est nécessaire de faire en sorte que vos fonctions déclarées dans un fichier javascript &#039;&#039;&#039;htdocs/monmodule/js/monmodule.js&#039;&#039;&#039; soit chargées dans l&#039;entête head html.&lt;br /&gt;
Pour demander à Dolibarr qui gère la génération de la section header d&#039;inclure un de vos fichiers javascript, il est nécessaire de fournir en paramètre de la fonction llxHeader() appelée au début de votre page, d&#039;inclure le paramètre qui contient l&#039;URL vers le js à inclure.&lt;br /&gt;
&lt;br /&gt;
Exemple pour la page /htdocs/monmodule/mapage.php :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
require(&#039;../main.inc.php&#039;);&lt;br /&gt;
$morejs=array(&amp;quot;/monmodule/js/monmodule.js&amp;quot;);&lt;br /&gt;
llxHeader(&#039;&#039;,&#039;Titre&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,$morejs,&#039;&#039;,0,0); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Déclencher du code sur un évènement Dolibarr (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : lorsque vous voulez que des actions particulières s&#039;exécutent suite au déclenchement d&#039;actions standards de Dolibarr (exemple : je veux mettre à jour une table de mon module quand une facture se crée dans Dolibarr), il vous faut créer un fichier de &#039;&#039;&#039;triggers&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Voir aussi [[Interfaces_Dolibarr_vers_exterieur|Interfaces de Dolibarr vers l&#039;exterieur]]&lt;br /&gt;
et [[Interfaces_Exterieur_vers_Dolibarr|Interfaces exterieures vers Dolibarr]]&lt;br /&gt;
&lt;br /&gt;
==Insérer votre code aux emplacement hooks de Dolibarr (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : lorsque vous voulez modifier ou ajouter du code autrement que lors d&#039;un événement métier (voir le chapitre précédent pour cela).&lt;br /&gt;
&lt;br /&gt;
Voir la page [[Système de Hooks]].&lt;br /&gt;
&lt;br /&gt;
==Ajouter un module de numérotation (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : lorsque vous voulez ajouter une règle de numérotation non couverte par les modules par défaut.&lt;br /&gt;
&lt;br /&gt;
Voir la page [[Créer un module de numérotation]].&lt;br /&gt;
&lt;br /&gt;
==Ajouter un nouveau modèle de document (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : lorsque vous voulez ajouter un nouveau modèle de document.&lt;br /&gt;
&lt;br /&gt;
La documentation au sujet de la génération de documents depuis des modèles est disponible sur la page [[Créer un modèle de document PDF]] ou [[Créer un modèle de document ODT]].&lt;br /&gt;
&lt;br /&gt;
==Ajouter un thème (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039;: Lorsque vous voulez une interface aux couleurs personnalisées à votre cas.&lt;br /&gt;
&lt;br /&gt;
Voir la page [[Themes]].&lt;br /&gt;
&lt;br /&gt;
=[[File:Art.png]] Quelques règles de codage et fonctions pour développeurs=&lt;br /&gt;
Les règles de codage à suivre sont définis dans la [[Documentation Développeur|Documentation développeur]], rubrique &amp;quot;Informations Générales - Langage et normes de développement&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
De nombreuses fonctions prédéfinies pour les développeurs sont disponibles et décrites sur la page [[Documentation Développeur|Documentation développeur]] sous la section &amp;quot;Les couches techniques de Dolibarr&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=[[File:Art.png]] Créer un package pour livrer et installer votre module=&lt;br /&gt;
Cette procédure doit être utilisée pour fabriquer un package afin de le soumettre sur la place de marché http://www.dolistore.com.&lt;br /&gt;
Mais vous pouvez aussi l&#039;utiliser pour distribuer facillement votre module via votre propre réseau de distribution.&lt;br /&gt;
&lt;br /&gt;
*Allez dans le répertoire &#039;&#039;&#039;/build&#039;&#039;&#039; et recopiez le fichier &#039;&#039;&#039;makepack-dolibarrmodules.conf&#039;&#039;&#039; en &#039;&#039;&#039;makepack-monmodule.conf&#039;&#039;&#039;. Attention, ce répertoire peut ne pas être fourni dans les packages de versions stables. Si c&#039;est le cas, il peut être récupéré dans le snapshot disponible en téléchargement sur le site web Dolibarr dans la rubrique Version de développement (prenez dans ce cas tout le répertoire build qui est un répertoire autonome et indépendant de la version).&lt;br /&gt;
&lt;br /&gt;
Saisissez dans ce fichier la liste des noms des nouveaux fichiers que vous avez créé pour votre module (descripteur de module, nouveaux fichiers sql de tables, page php, images, etc...)&lt;br /&gt;
&lt;br /&gt;
*Lancer le script via Perl (besoin de la version Perl 5.0 ou +):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
perl makepack-dolibarrmodule.pl&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Le script vous demande le nom de votre module, sa version majeure et mineure.&lt;br /&gt;
Un fichier &#039;&#039;&#039;monmodule.zip&#039;&#039;&#039; va alors être fabriqué contenant votre module prêt pour être déployé.&lt;br /&gt;
&lt;br /&gt;
*La personne qui reçoit votre module doit alors placer le fichier dans son répertoire racine d&#039;installation de Dolibarr et réaliser la commande :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tar -xvf monmodule.zip&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Si vous désirez que votre module profite à tous, vous pouvez le soumettre (le fichier zip) sur la place de marché des modules complémentaires: {{LinkToPluginDownload}} (vous devez avoir créé un compte auparavant et utiliser le lien &amp;quot;Soumettre un module/produit&amp;quot;).&lt;br /&gt;
**Si votre module a été fabriqué correctement, le fichier sera validé rapidement.&lt;br /&gt;
**Si la qualité est suffisante, que la licence le permet et que la fonctionnalité du module s&#039;avère être d&#039;un intérêt général, le code pourra être ajouté au code source de Dolibarr (sauf si vous ne le désirez pas).&lt;br /&gt;
&lt;br /&gt;
=[[File:Art.png]] Dépôt et validation du module externe sur Dolistore=&lt;br /&gt;
&lt;br /&gt;
Voir [[Module_Dolistore_Validation_Regles|Règles de Validation]]&lt;/div&gt;</summary>
		<author><name>Kusco</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Module_Adh%C3%A9rents&amp;diff=58402</id>
		<title>Module Adhérents</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Module_Adh%C3%A9rents&amp;diff=58402"/>
		<updated>2023-10-16T14:55:37Z</updated>

		<summary type="html">&lt;p&gt;Kusco: Correction orthographe et ponctuation&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_Membership_management --&amp;gt;&lt;br /&gt;
[[en:Module_Membership_management]]&lt;br /&gt;
[[es:Módulo_Miembros]]&lt;br /&gt;
[[de:Modul_Mitglieder]]&lt;br /&gt;
[[zh:会员管理模块]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Adhérent]]&lt;br /&gt;
{{TemplateDocUtil}}&lt;br /&gt;
{{TemplateModFR}}&lt;br /&gt;
{{BasculeDevUser|&lt;br /&gt;
nom=Adhérents|&lt;br /&gt;
num=310|&lt;br /&gt;
devdoc=[[Module Adhérents (développeur)]]|&lt;br /&gt;
userdoc=Cette page|}}&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
Le module adhérent permet de gérer les adhérents d&#039;une association.&lt;br /&gt;
&lt;br /&gt;
*Définition de plusieurs types d&#039;adhérent.&lt;br /&gt;
*Création/Validation/Modification/Résiliation/Suppression d&#039;une fiche adhérent (caractéristiques, photos, ...)&lt;br /&gt;
*Notions d&#039;adhérents soumis à cotisation ou non.&lt;br /&gt;
*Saisie/Modifications/Suppression des adhésions.&lt;br /&gt;
*En association avec le module [[Module Mailing|EMailing]], envoi de mailings aux adhérents ou à une certaine catégorie d&#039;adhérents.&lt;br /&gt;
*En association avec le module [[Module LDAP|LDAP]], synchronisation des adhérents vers un annuaire LDAP.&lt;br /&gt;
*En association avec le module [[Module Banques et Caisses]], interaction avec les adhésions et la trésorerie de l&#039;association.&lt;br /&gt;
*Reporting.&lt;br /&gt;
*Fonction générique d&#039;exports avec le [[Module Exports]].&lt;br /&gt;
&lt;br /&gt;
Les fonctions du module Adhérent sont centralisées dans le menu du haut &amp;quot;Adhérents&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Dolibarr fait de la gestion de la trésorerie, mais ne fait pas de comptabilité analytique. Cette lacune suffit pour dire que Dolibarr n&#039;est pas adapté à une association de grosse taille (plus de 5000 adhérents).&lt;br /&gt;
Il n&#039;y a pas non plus de module de gestion de la paie, ce qui limite là aussi son utilisation aux associations qui n&#039;ont pas de salariés.&lt;br /&gt;
Le module de gestion d&#039;association appelé &amp;quot;module Adhérents&amp;quot; est en fait orienté sur les petites associations. Un budget de 10 000 euros annuel me semble la cible type.&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;
=Utilisation=&lt;br /&gt;
&lt;br /&gt;
==Création d&#039;un type d&#039;adhérent==&lt;br /&gt;
Avant de commencer, il est nécessaire de définir les profils d&#039;adhérents.&lt;br /&gt;
Pour cela, il faut créer un type d&#039;adhérent via le menu &#039;&#039;Type d&#039;adhérents&#039;&#039; puis &#039;&#039;Nouveau type&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==Création des attributs personnalisés d&#039;adhérent==&lt;br /&gt;
Si vous avez besoin de gérer des attributs particuliers sur les fiches adhérents qui ne seraient pas prévus (âge du capitaine, tour de poitrine), vous pouvez définir par le menu &#039;&#039;Attributs d&#039;adhérents&#039;&#039; puis &#039;&#039;Nouvel attribut&#039;&#039;.&lt;br /&gt;
Choisissez le libellé de l&#039;attribut qui sera visible, son code (qui sera utilisé comme nom de champ dans la base de données), son type et la taille maximale.&lt;br /&gt;
&lt;br /&gt;
==Création d&#039;un adhérent==&lt;br /&gt;
Un adhérent passe par le cycle de vie suivant:&lt;br /&gt;
&lt;br /&gt;
[[Image:Diagramme_etats_adherents.png|center|Diagramme d&#039;états d&#039;un adhérent]]&lt;br /&gt;
&lt;br /&gt;
Pour créer un adhérent, on va dans le menu &#039;&#039;&#039;Adhérents - Nouvel adhérent&#039;&#039;. Un formulaire de création est alors proposé.&lt;br /&gt;
Renseignez tous les champs et cliquez &#039;&#039;&#039;Créer&#039;&#039;&#039;.&lt;br /&gt;
Ensuite, on passe l&#039;adhérent à l&#039;état &#039;&#039;&#039;Validé&#039;&#039;&#039; en cliquant sur le bouton &#039;&#039;&#039;Valider&#039;&#039;&#039; sur la fiche adhérent.&lt;br /&gt;
&lt;br /&gt;
Si on veut offrir un accès Dolibarr à ce membre, cliquer sur &#039;&#039;&#039;Créer un compte&#039;&#039;&#039; depuis sa fiche membre.&lt;br /&gt;
Si on veut manipuler un tiers propre à ce membre (pour facturation, devis), cliquer sur &#039;&#039;&#039;Créer un compte&#039;&#039;&#039; depuis sa fiche membre.&lt;br /&gt;
&lt;br /&gt;
==Nouvelle adhésion ou renouvellement==&lt;br /&gt;
&lt;br /&gt;
Une adhésion peut être vue comme une cotisation (un paiement). Toutefois, on emploie le terme d&#039;adhésion pour certains types d&#039;adhérents non soumis à cotisation et dans ce cas la cotisation est gratuite. Cela n&#039;exclut pas que leur présence en tant que membre est limitée dans le temps au même titre que celui qui paie une cotisation. Le terme &amp;quot;adhésion&amp;quot; caractérise donc un renouvèlement à l&#039;association à partir d&#039;une date et pour une durée fixe, que ce renouvellement soit payant ou pas.&lt;br /&gt;
&lt;br /&gt;
Pour saisir une adhésion, aller dans le menu &#039;&#039;Adhésion&#039;&#039; puis &#039;&#039;Nouvelle adhésion&#039;&#039; et saisir l&#039;adhérent recherché.&lt;br /&gt;
Ou bien, aller sur la &#039;&#039;fiche adhérent&#039;&#039; puis &#039;&#039;onglet adhésion&#039;&#039; puis &#039;&#039;Nouvelle adhésion&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
L&#039;historique des adhésions est conservé également l&#039;onglet &#039;&#039;Adhésion&#039;&#039; de la fiche adhérent.&lt;br /&gt;
&lt;br /&gt;
==Cas d&#039;une adhésion payée en plusieurs fois==&lt;br /&gt;
&lt;br /&gt;
Prenons le cas d&#039;une adhésion payée en trois fois. Demandez à votre adhérent trois chèques dont la somme est égale à la cotisation qu&#039;il doit. Puis, pour dolibarr, le principe est le même que ci-dessus.&lt;br /&gt;
&lt;br /&gt;
Une fois que vous avec cliqué sur &#039;&#039;Nouvelle adhésion&#039;&#039;, entrez la contre-partie correspondant au premier chèque, et spécifiez la période de validité, dans notre cas cela correspond à 1/3 de l&#039;année. Puis, dans le champ &#039;&#039;Libellé,&#039;&#039; indiquez par exemple &#039;&#039;Adhésion 2008 1/3&#039;&#039;. Puis validez par un clic sur &#039;&#039;ajout adhésion&#039;&#039;. Recommencez l&#039;opération deux fois de plus en adaptant les valeurs pour couvrir toute l&#039;année.&lt;br /&gt;
&lt;br /&gt;
==Résiliation d&#039;adhérent==&lt;br /&gt;
Aller sur la fiche adhérent et cliquer sur le bouton &#039;&#039;Résilier&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Exemples de cas d&#039;utilisation=&lt;br /&gt;
&lt;br /&gt;
{{ExamplesCaseFr&lt;br /&gt;
|nom=UCFO01: L&#039;association veut définir un nouveau type d&#039;adhérent&lt;br /&gt;
|situation=L&#039;association veut définir un nouveau type d&#039;adhérent&lt;br /&gt;
|actions=Je crée un type d&#039;adhérent par &#039;&#039;Menu Adhérents - Configuration - Types d&#039;adhérents - Nouveau type d&#039;adhérent&#039;&#039;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ExamplesCaseFr&lt;br /&gt;
|nom=UCFO02: Un nouvel adhérent se présente avec un chèque ou en liquide&lt;br /&gt;
|situation=Un nouvel adhérent se présente avec un chèque ou en liquide&lt;br /&gt;
|actions=Je crée un adhérent par &#039;&#039;Menu Adhérents - Nouvel adhérent&#039;&#039;.&lt;br /&gt;
Je crée une adhésion par onglet &#039;&#039;Adhésion&#039;&#039;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ExamplesCaseFr&lt;br /&gt;
|nom=UCFO03: Un adhérent vient renouveler son adhésion avec un chèque ou en liquide&lt;br /&gt;
|situation=Un adhérent vient renouveler son adhésion avec un chèque ou en liquide&lt;br /&gt;
|actions=Je vais sur la fiche adhérent puis onglet &#039;&#039;Adhésion&#039;&#039;.&lt;br /&gt;
Je saisis une nouvelle adhésion.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ExamplesCaseFr&lt;br /&gt;
|nom=UCFO04: Je veux résilier un adhérent car son adhésion a expirée et non renouvelée depuis longtemps&lt;br /&gt;
|situation=Je veux résilier un adhérent car son adhésion a expirée et non renouvelée depuis longtemps&lt;br /&gt;
|actions=Je vais sur la fiche adhérent.&lt;br /&gt;
Je clique sur &#039;&#039;Résilier&#039;&#039;.&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Kusco</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=D%C3%A9veloppement_module&amp;diff=57800</id>
		<title>Développement module</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=D%C3%A9veloppement_module&amp;diff=57800"/>
		<updated>2023-09-11T15:44:22Z</updated>

		<summary type="html">&lt;p&gt;Kusco: Simple faute de frappe&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 : モジュール_開発 --&amp;gt;&lt;br /&gt;
[[en:モジュール_開発]]&lt;br /&gt;
[[es:Desarrollo_de_un_módulo]]&lt;br /&gt;
[[de:Modul_Entwicklung]]&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;
Pour créer un nouveau module, il existe plusieurs étapes. Ce didacticiel a pour but de vous décrire chacune d&#039;elles afin d&#039;ajouter un module permettant d&#039;étendre les possibilités de Dolibarr, comme par exemple ajouter une ou plusieurs des fonctionnalités suivantes:&lt;br /&gt;
&lt;br /&gt;
*Ajouter de nouvelles tables en base.&lt;br /&gt;
*Ajouter vos propres entrées dans les menus.&lt;br /&gt;
*Ajouter des objets et des écrans de saisie/consultation de nouvelle tables.&lt;br /&gt;
*Ajouter ou supprimer des onglets sur les pages de vues/édition des objets (facture, produit, commande, événement, ...)&lt;br /&gt;
*Ajouter des exports prédéfinis pour la fonction export.&lt;br /&gt;
*Ajouter de nouvelles boites/widgets pour la home page.&lt;br /&gt;
*Ajouter des variables de substitution.&lt;br /&gt;
*Définir de nouvelles permissions.&lt;br /&gt;
*Déclencher du code automatiquement sur une action Dolibarr particulière.&lt;br /&gt;
*Insérer votre code aux emplacements hooks de Dolibarr&lt;br /&gt;
*Ajouter un modèle de numérotation de la référence des objets créés.&lt;br /&gt;
*Ajouter un modèle de document PDF.&lt;br /&gt;
*Ajouter un nouveau thème.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les chapitres suivants vous présentent comment réaliser tout cela en manuel de manière simple.&lt;br /&gt;
&lt;br /&gt;
=[[File:Art.png]] Création de Module avec le générateur de module=&lt;br /&gt;
Depuis Dolibarr 9.0 il est possible de créer les fichiers principaux de votre module avec le &amp;quot;Générateur de module&amp;quot; (aussi appelé &amp;quot;Module Builder&amp;quot;). Pour l&#039;activer :&lt;br /&gt;
&lt;br /&gt;
*Activez le module &amp;quot;Générateur de Module&amp;quot; dans la section &amp;quot;Outils multi-modules&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[File:Mod_builder_2.png|400px]]&lt;br /&gt;
&lt;br /&gt;
*Puis cliquez sur l’icône &amp;quot;bug&amp;quot; qui est apparue dans la barre de menu en haut à droite&lt;br /&gt;
&lt;br /&gt;
[[File:Mod_builder_3.png|400px]]&lt;br /&gt;
&lt;br /&gt;
=[[File:Art.png]] Exemple de modèle de module externe=&lt;br /&gt;
Un bon modèle/squelette de module externe Dolibarr est disponible ici : [https://github.com/Dolibarr/dolibarr/tree/develop/htdocs/modulebuilder/template GitHub Dolibarr Module Modèle]&lt;br /&gt;
&lt;br /&gt;
=[[File:Art.png]] Créer un module=&lt;br /&gt;
Les sous chapitres suivant décrivent les actions à faire pour créer un module Dolibarr. Les premiers chapitres sont obligatoires quelle que soit la vocation du module, les suivants dépendront de ce que doit faire le module.&lt;br /&gt;
&lt;br /&gt;
==Créer un descripteur de Module (obligatoire)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : Obligatoire dès qu&#039;une extension est développée, quelle que soit sa vocation.&lt;br /&gt;
&#039;&#039;&#039;Depuis Dolibarr 9.0, il est possible de créer le descripteur de votre module avec le &amp;quot;Générateur de module&amp;quot;&#039;&#039;&#039;. Cet outil est encore encours de développement et de maturité mais peut dors et déjà être utilisé.&lt;br /&gt;
&lt;br /&gt;
===Créer votre descripteur avec le générateur de module===&lt;br /&gt;
&lt;br /&gt;
*Lancez le générateur de module en cliquant sur l’icône &amp;quot;bug&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[File:Mod_builder_3.png|400px]]&lt;br /&gt;
&lt;br /&gt;
*Entrez le nom de votre module sans espaces (le nom de votre module NE DOIT PAS CONTENIR le caractère underscore ou tiret bas : _) et cliquez sur Créer.&lt;br /&gt;
&lt;br /&gt;
[[File:Mod_builder_4.png|400px]]&lt;br /&gt;
&lt;br /&gt;
*Un module avec ses premiers fichiers a été initialisé. Vous pouvez alors modifier les paramètres du descripteur du module :&lt;br /&gt;
&lt;br /&gt;
[[File:Mod_builder_5.png|400px]]&lt;br /&gt;
&lt;br /&gt;
===Alternative : créer votre descripteur manuellement (sans utiliser le générateur de module)===&lt;br /&gt;
La première étape est donc de créer un fichier de description du module (descripteur). Pour cela:&lt;br /&gt;
&lt;br /&gt;
*Créez le répertoire &#039;&#039;&#039;/htdocs/&#039;&#039;monmodule&#039;&#039;/core/modules&#039;&#039;&#039;. Puis, allez dans le répertoire &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039; et recopiez le fichier modMyModule.class.php dans ce répertoire &#039;&#039;&#039;htdocs/&#039;&#039;monmodule&#039;&#039;/core/modules&#039;&#039;&#039;.&lt;br /&gt;
*Renommez le fichier mod&#039;&#039;&#039;MyModule&#039;&#039;&#039;.class.php en modifiant seulement la partie &#039;&#039;&#039;MyModule&#039;&#039;&#039; (le fichier doit commencer par mod)&lt;br /&gt;
&lt;br /&gt;
Ensuite, modifiez le contenu de ce fichier afin de remplacer :&lt;br /&gt;
&lt;br /&gt;
*les &#039;&#039;modMyModule&#039;&#039; en une valeur qui corresponde à la vocation de votre module. Cette valeur doit toujours commencer par &#039;&amp;lt;nowiki/&amp;gt;&#039;&#039;&#039;mod&#039;&#039;&#039;&#039; et ne contenir que des &#039;&#039;&#039;caractères alphabétiques&#039;&#039;&#039;.&lt;br /&gt;
*$this-&amp;gt;numero = &#039;&#039;100000&#039;&#039; par un numéro de module libre. Pour éviter tout conflit, vous pouvez consulter la page suivante pour retrouver les numéros déjà alloués : [[List of modules id|Liste des id de modules]].&lt;br /&gt;
*Modifier éventuellement les autres variables définies dans le constructeurs (Voir le commentaire dans le code du squelette pour leur signification).&lt;br /&gt;
&lt;br /&gt;
Le descripteur de votre module est alors en place.&lt;br /&gt;
&lt;br /&gt;
===Tester votre descripteur===&lt;br /&gt;
&lt;br /&gt;
Lancez Dolibarr et allez sur la page &#039;&#039;&#039;Configuration-&amp;gt;module&#039;&#039;&#039;, vous devez voir apparaître une nouvelle ligne avec votre nouveau module et la possibilité de l&#039;activer ou non (parcourez tous les onglets de chaque catégories de modules jusqu&#039;à le retrouver).&lt;br /&gt;
C&#039;est la valeur de $this-&amp;gt;special qui détermine dans quel onglet se trouve votre module.&lt;br /&gt;
&lt;br /&gt;
===Nom de module===&lt;br /&gt;
&lt;br /&gt;
Le nom de votre module NE DOIT PAS CONTENIR le caractère underscore ou tiret bas : _&lt;br /&gt;
&lt;br /&gt;
==Arborescence d&#039;un nouveau module==&lt;br /&gt;
Voici l&#039;arborescence à respecter pour l&#039;organisation des fichiers d&#039;un module (cette arborescence sera celle prise d&#039;office si vous générer les fichiers à l&#039;aide de ModuleBuilder).&lt;br /&gt;
&lt;br /&gt;
{{TemplateModuleTreeSimple}}&lt;br /&gt;
&lt;br /&gt;
Un bon modèle/squelette de module externe Dolibarr est disponible ici : [https://github.com/Dolibarr/dolibarr/tree/develop/htdocs/modulebuilder/template GitHub Dolibarr Module Modèle]&lt;br /&gt;
&lt;br /&gt;
==Créer vos tables SQL et les classes PHP DAO (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039;: Si votre module a besoin de gérer des données qui lui sont propres&lt;br /&gt;
&lt;br /&gt;
===Créer vos fichiers .sql===&lt;br /&gt;
Si votre module a vocation à gérer des données bien à lui, qui n&#039;existent pas en base dans la version standard de Dolibarr, il est nécessaire de définir des tables SQL pour stocker ces données.&lt;br /&gt;
&lt;br /&gt;
Créer un sous-répertoire &#039;&#039;&#039;sql&#039;&#039;&#039; dans le répertoire de votre module (&#039;&#039;&#039;monmodule/sql&#039;&#039;&#039;) afin d&#039;y placer les scripts sql que vous allez créer (Avec ModuleBuilder cette étape sera réalisée automatiquement suite à la création d&#039;un nouvel Objet depuis l&#039;onglet Objet).&lt;br /&gt;
&lt;br /&gt;
Ensuite, vérifiez dans votre fichier descripteur de module, dans la fonction &#039;&#039;&#039;init&#039;&#039;&#039; que la ligne&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;$this-&amp;gt;_load_tables(&#039;/mymodule/sql/&#039;);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
n&#039;est pas commentée.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Règles à respecter:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Ajoutez les fichiers d&#039;ordre de création de vos tables sur le principe de 1 fichier par table, nommé &#039;&#039;&#039;llx_matable.sql&#039;&#039;&#039; (pour la table), accompagné éventuellement du fichier &#039;&#039;&#039;llx_matable.key.sql&#039;&#039;&#039; (pour les index ou clé étrangères). Voir les exemples dans les fichiers existants dans &#039;&#039;&#039;install/mysql/tables&#039;&#039;&#039; pour exemple.&lt;br /&gt;
*Les types et noms recommandés pour les champs SQL sont définis sur la page [[https://wiki.dolibarr.org/index.php/Langages_et_normes#R.C3.A8gles_de_codage_SQL]].&lt;br /&gt;
*Pour ce qui est des commandes permettant d&#039;ajouter/manipuler des données, elles doivent toutes se trouver dans un fichier nommé &#039;&#039;&#039;data.sql&#039;&#039;&#039; situé dans le même répertoire &#039;&#039;&#039;/monmodule/sql/&#039;&#039;&#039;.&lt;br /&gt;
*N&#039;utilisez pas &amp;quot;chaine&amp;quot; mais &#039;chaine&#039; car les guillemets doubles (&amp;quot;) ont une signification particulière en PostGreSQL&lt;br /&gt;
&lt;br /&gt;
Exemple de contenu de fichier data.sql&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
 delete from llx_const where name=&#039;MONMODULE_IT_WORKS&#039; and entity=&#039;__ENTITY__&#039;;&lt;br /&gt;
 insert into llx_const (name, value, type, note, visible, entity) values (&#039;MONMODULE_IT_WORKS&#039;,&#039;1&#039;,&#039;chaine&#039;,&#039;A constant for my module&#039;,1,&#039;__ENTITY__&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les ordres SQL des fichiers doivent être opérationnels pour la base de données &#039;&#039;&#039;mysql&#039;&#039;&#039;.&lt;br /&gt;
Rem: Les fichiers des autres types de bases ne sont pas à maintenir. Ils sont lus et convertis à la volée par le driver de la base de données.&lt;br /&gt;
&lt;br /&gt;
===Tester vos fichiers .sql===&lt;br /&gt;
&lt;br /&gt;
Une fois les fichiers prêts, vous pouvez retourner dans l&#039;écran de gestion des modules de Dolibarr puis désactiver le module, dropper les tables en base (si elles existe déjà) et réactiver le module.&lt;br /&gt;
Les tables doivent alors être recréées par l&#039;activation du module.&lt;br /&gt;
Si tel n&#039;est pas le cas, vérifiez vos scripts en les passant à la main, ou consultez les logs Dolibarr.&lt;br /&gt;
&lt;br /&gt;
===Générer la classe PHP DAO d&#039;accès aux tables===&lt;br /&gt;
&lt;br /&gt;
Le fichier de classe DAO PHP d&#039;un object est généré automatiquement avec ModuleBuilder lors de la création d&#039;un Object.&lt;br /&gt;
&lt;br /&gt;
A défaut d&#039;utiliser le générateur de module, vous trouverez des exemples dans le squelette de module, fichier &#039;&#039;&#039;htdocs/modulebuilder/templates/class/myobject.class.php&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Dans cette classe, se trouve des méthodes CRUD (Create/Read/Update/Delete) déjà opérationnelles pour faire un insert, un fetch (select), un update, un delete d&#039;une ligne de la table. Editer le fichier pour utiliser le bon nom de module, de tables et placer ce fichier dans le sous-répertoire de &#039;&#039;&#039;class&#039;&#039;&#039; du module. Le Module Builder permet de faire cela en quelques clics de souris.&lt;br /&gt;
&lt;br /&gt;
==Affichage des onglets (optionnel)==&lt;br /&gt;
&lt;br /&gt;
===Ajouter ou supprimer des onglets sur les fiches objets===&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : Pour ajouter votre propre onglet parmi les onglets d&#039;un object standard (facture, commande, proposition commercial, adhérent...)&lt;br /&gt;
&lt;br /&gt;
Pour cela, allez dans le fichier descripteur de module précédemment créé et modifiez le tableau $this-&amp;gt;tabs:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	// Array to add new pages in new tabs or remove existing one&lt;br /&gt;
	$this-&amp;gt;tabs = array(&#039;objecttype:+tabname1:Title1:mylangfile@monmodule:$user-&amp;gt;rights-&amp;gt;monmodule-&amp;gt;read:/monmodule/mapagetab1.php?id=__ID__&#039;    // To add a new tab identified by code tabname1&lt;br /&gt;
                            &#039;objecttype:+tabname2:Title2:mylangfile@monmodule:$user-&amp;gt;rights-&amp;gt;monmodule-&amp;gt;read:/monmodule/mapagetab2.php?id=__ID__&#039;,   // To add a new tab identified by code tabname2&lt;br /&gt;
                            &#039;objecttype:-tabname&#039;);                                                     // To remove an existing tab identified by code tabname&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le tableau doit contenir une liste de chaîne, chaque chaîne représentant un nouvel onglet.&lt;br /&gt;
Le format de la chaîne étant composé de 6 parties séparées par &amp;quot;:&amp;quot;&lt;br /&gt;
&lt;br /&gt;
*Partie 1 : le type d&#039;élément (objecttype) dans lequel doit apparaître l&#039;onglet qui est une valeur parmi celle-ci:&lt;br /&gt;
{{TemplateModuleTabs-fr}}&lt;br /&gt;
&lt;br /&gt;
*Partie 2 : nom de code pour l&#039;onglet à ajouter (commence par +) ou à enlever (commence par -)&lt;br /&gt;
*Partie 3 : le titre de l&#039;onglet. Cela peut être un libellé en dur ou mieux un code traduction présent dans un fichier lang.&lt;br /&gt;
*Partie 4 : le nom du fichier .lang (sans l&#039;extension .lang) qui contient la correspondance entre le code traduction et le libellé à afficher. Si ce com est suivi de @monmodule, Dolibarr cherche le fichier dans le répertoire lang propre au module, c&#039;est à dire htdocs/monmodule/langs/code_CODE/monmodule.lang, sinon Dolibarr cherche le fichier traduction dans htdocs/langs/code_CODE/mylangfile.lang&lt;br /&gt;
*Partie 5 : une condition à tester pour savoir si l&#039;onglet doit être visible ou pas. Mettre &#039;1&#039; pour qu&#039;il soit toujours visible.&lt;br /&gt;
*Partie 6 : l&#039;url de la page à afficher quand on clique sur l&#039;onglet. La chaine __ID__ sera remplacée automatiquement par l&#039;Id de l&#039;entité concernée.&lt;br /&gt;
&lt;br /&gt;
Pour que la déclaration soit effective, il faut désactiver et réactiver le module.&lt;br /&gt;
&lt;br /&gt;
Pour alimenter le contenu de l&#039;onglet avec des données issues de la base, voir le chapitre suivant.&lt;br /&gt;
&lt;br /&gt;
===Ajouter les onglets standard d&#039;un objet sur sa propre page d&#039;onglet===&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : Pour afficher les onglets existant d&#039;un objet standard (produit, tiers, etc.) sur votre nouvelle page onglet.&lt;br /&gt;
&lt;br /&gt;
Il faut appliquer la procédure suivante :&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Inclure les fichiers définissant les fonctions utiles dans vos fichiers&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Pour chaque fiche entité, il y a deux fichiers à inclure avec l&#039;instruction&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;require_once($url_fichier) ;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici quelques exemples de fichiers à inclure (DOL_DOCUMENT_ROOT correspond au dossier dolibarr/htdocs/) :&lt;br /&gt;
&lt;br /&gt;
*Entité tiers (thirdparty) :&lt;br /&gt;
**DOL_DOCUMENT_ROOT/societe/class/societe.class.php&lt;br /&gt;
**DOL_DOCUMENT_ROOT/core/lib/company.lib.php&lt;br /&gt;
*Entité produit (product) :&lt;br /&gt;
**DOL_DOCUMENT_ROOT/product/class/product.class.php&lt;br /&gt;
**DOL_DOCUMENT_ROOT/core/lib/product.lib.php&lt;br /&gt;
*Entité facture (invoice) :&lt;br /&gt;
**DOL_DOCUMENT_ROOT/compta/facture/facture.class.php&lt;br /&gt;
**DOL_DOCUMENT_ROOT/core/lib/invoice.lib.php&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Créer et charger l&#039;objet à afficher dans votre onglet&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Créez l&#039;objet de la classe voulue, et récupérez les données de l&#039;objet à partir de la base de données. Pour cela il faut utiliser les fonctions fetch() de la classe correspondante, en passant en paramètre l&#039;identifiant de l&#039;objet que vous récupérez depuis l&#039;url (ex : /mononglet.php?id=1).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Exemple :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$id=GETPOST(&#039;id&#039;,&#039;int&#039;);&lt;br /&gt;
$ref=GETPOST(&#039;ref&#039;,&#039;alpha&#039;);&lt;br /&gt;
$product = new Product($db) ;&lt;br /&gt;
$result = $product-&amp;gt;fetch($id, $ref) ; //Tester $result pour vérifier que l&#039;accès à la base s&#039;est bien passée&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3. Récupérer la liste des onglets correspondants à l&#039;entité choisie&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Utilisez la fonction XXX_prepare_head($obj), ou XXX est le nom de l&#039;entité, permettant de créer un tableau contenant les définitions des onglets à afficher. Le paramètre à passer est l&#039;objet pour lequel vous voulez afficher les onglets.&lt;br /&gt;
&lt;br /&gt;
Le tableau retourné est composé de la façon suivante :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$head        // Tableau des onglets&lt;br /&gt;
$head[$h]    // Élément décrivant un onglet. Il y aura autant de $h que d&#039;onglets à afficher&lt;br /&gt;
$head[$h][0] // Url de la page affichée quand on clique sur l&#039;onglet&lt;br /&gt;
$head[$h][1] // Titre de l’onglet&lt;br /&gt;
$head[$h][2] // Code de l&#039;onglet, à utiliser pour choisir quel onglet sera &#039;actif&#039; (voir paragraphe suivant)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Exemple :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$head = product_prepare_head($product, $user) ; //le paramètre $user n&#039;est pas présent sur certaines fonctions&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4. Afficher les onglets sur votre page onglet&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Utilisez la fonction dol_fiche_head() qui affiche les onglets contenus dans le tableau $head retourné par XX_prepare_head().&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
dol_fiche_head($links, $active=&#039;0&#039;, $title=&#039;&#039;, $notab=0, $picto=&#039;&#039;)&lt;br /&gt;
//$links  // Tableau des onglets, appelé $head plus haut.&lt;br /&gt;
//$active // Onglet actif (mettre le nom de l&#039;onglet défini dans votre fichier de module, ou un nom contenu dans $head[$h][2]). Cet onglet sera mis en surbrillance&lt;br /&gt;
//$title  // ?&lt;br /&gt;
//$notab  // Mettre ce paramètre à 1 permet de ne pas afficher de zone bleue en dessous des onglets.&lt;br /&gt;
//$picto  // Nom de l&#039;image à utiliser au début de la barre des onglet. Les choix suivant sont possibles :&lt;br /&gt;
//            product&lt;br /&gt;
//            service&lt;br /&gt;
//            company&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette fonction affiche les onglets voulus et ouvre un élément &#039;&#039;&amp;lt; div class=&amp;quot;&amp;quot; &amp;gt;&#039;&#039; qui correspond à la zone bleue sous les onglets (si paramètre $notab = 0). Pour fermer la zone bleue, il suffit de fermer l&#039;élément &#039;&#039;&amp;lt; /div &amp;gt;&#039;&#039; dans le code PHP.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Remarque&#039;&#039; :&lt;br /&gt;
Pour plus de détail, se référer à la [http://www.dolibarr.fr/doxygen/ documentation Doxygen] ou directement au code de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
==Créer vos pages écran PHP (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : Si l&#039;objet de votre module est d&#039;ajouter des fonctionnalités qui nécessitent de nouveaux écrans.&lt;br /&gt;
&lt;br /&gt;
===Créer une page écran PHP brute===&lt;br /&gt;
Vous pouvez ensuite créer vos pages PHP, qui se basent sur les données de vos tables, en utilisant les squelettes fournis comme exemple dans le répertoire &#039;&#039;&#039;modulebuilder&#039;&#039;&#039; (Pour le développement d&#039;un script en ligne de commande, voir [[Développement de scripts]]). La encore, si vous avez utilisez ModuleBuilder, des cas de pages (liste, page de création, onglet notes, etc...) auront été créés automatiquement lors de l&#039;initialisation de l&#039;objet.&lt;br /&gt;
&lt;br /&gt;
Pour créer une nouvelle page écran utilisateur, créez un sous-répertoire de &#039;&#039;&#039;htdocs&#039;&#039;&#039; (si non déjà fait) propre à votre module (Dans &#039;&#039;&#039;htdocs/monmodule&#039;&#039;&#039; par exemple) afin d&#039;y placer les pages que vous allez créer.&lt;br /&gt;
&lt;br /&gt;
Y recopier le fichier &#039;&#039;&#039;myobject_page.php&#039;&#039;&#039; qui va servir de point de départ.&lt;br /&gt;
Modifiez le fichier afin que le main.inc.php soit trouvé&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Load Dolibarr environment&lt;br /&gt;
$res=0;&lt;br /&gt;
// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined)&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; ! empty($_SERVER[&amp;quot;CONTEXT_DOCUMENT_ROOT&amp;quot;])) $res=@include($_SERVER[&amp;quot;CONTEXT_DOCUMENT_ROOT&amp;quot;].&amp;quot;/main.inc.php&amp;quot;);&lt;br /&gt;
// Try main.inc.php into web root detected using web root calculated from SCRIPT_FILENAME&lt;br /&gt;
$tmp=empty($_SERVER[&#039;SCRIPT_FILENAME&#039;])?&#039;&#039;:$_SERVER[&#039;SCRIPT_FILENAME&#039;];$tmp2=realpath(__FILE__); $i=strlen($tmp)-1; $j=strlen($tmp2)-1;&lt;br /&gt;
while($i &amp;gt; 0 &amp;amp;&amp;amp; $j &amp;gt; 0 &amp;amp;&amp;amp; isset($tmp[$i]) &amp;amp;&amp;amp; isset($tmp2[$j]) &amp;amp;&amp;amp; $tmp[$i]==$tmp2[$j]) { $i--; $j--; }&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; $i &amp;gt; 0 &amp;amp;&amp;amp; file_exists(substr($tmp, 0, ($i+1)).&amp;quot;/main.inc.php&amp;quot;)) $res=@include(substr($tmp, 0, ($i+1)).&amp;quot;/main.inc.php&amp;quot;);&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; $i &amp;gt; 0 &amp;amp;&amp;amp; file_exists(dirname(substr($tmp, 0, ($i+1))).&amp;quot;/main.inc.php&amp;quot;)) $res=@include(dirname(substr($tmp, 0, ($i+1))).&amp;quot;/main.inc.php&amp;quot;);&lt;br /&gt;
// Try main.inc.php using relative path&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; file_exists(&amp;quot;../main.inc.php&amp;quot;)) $res=@include(&amp;quot;../main.inc.php&amp;quot;);&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; file_exists(&amp;quot;../../main.inc.php&amp;quot;)) $res=@include(&amp;quot;../../main.inc.php&amp;quot;);&lt;br /&gt;
if (! $res &amp;amp;&amp;amp; file_exists(&amp;quot;../../../main.inc.php&amp;quot;)) $res=@include(&amp;quot;../../../main.inc.php&amp;quot;);&lt;br /&gt;
if (! $res) die(&amp;quot;Include of main fails&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Comme vous pouvez le constater, plusieurs tentatives de chargement du fichier main.inc.php (ou master.inc.php) ont été tentées. Le but est de réussir dans le plus grand nombre de cas possibles. Le minimum est de 2 lignes: une pour essayer de charger le fichier master / main.inc.php dans le répertoire racine de dolibarr et une autre pour essayer de charger le fichier afin de prendre en charge le cas où le module est déployé dans le répertoire &amp;quot;custom&amp;quot;. Mais vous pouvez avoir à gérer plus de situations. L&#039;exemple fourni devrait pouvoir charger le fichier main / master.inc.php dans presque toutes les situations / configurations.&lt;br /&gt;
&lt;br /&gt;
Notez que vous pouvez ajouter plus &amp;quot;../&amp;quot; en fonction de la profondeur du fichier par rapport à l&#039;arborescence de votre module.&lt;br /&gt;
&lt;br /&gt;
C&#039;est dans le main qu&#039;est chargé l&#039;environnement technique ainsi que les habilitations. Les variables objets suivantes sont alors positionnées:&lt;br /&gt;
&lt;br /&gt;
*$user    L&#039;objet qui contient les caractéristiques de l&#039;utilisateur + ses droits.&lt;br /&gt;
*$conf    L&#039;objet qui contient la configuration de Dolibarr.&lt;br /&gt;
*$db      L&#039;objet qui contient le handler de connexion à la base de données.&lt;br /&gt;
*$langs   L&#039;objet qui contient la langue de l&#039;utilisateur.&lt;br /&gt;
&lt;br /&gt;
*L&#039;inclusion d&#039;une classe ou librairie dédiée au module, sans savoir d&#039;où le fichier sera appelé, se fait en utilisant une fonction de Dolibarr (et non en utilisant directement le include_once)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Exemple :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
dol_include_once(&#039;/monmodule/class/maclasse.class.php&#039;, &#039;MaClasse&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*L&#039;appel des classes fournies en standard avec Dolibarr se fera par contre par le require_once directe avec la syntaxe suivante:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Exemple :&#039;&#039;&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/doli.class.php&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La raison est que si le dol_include_once est pratique car il scanne chaque répertoire de chemin alternatif pour trouver le fichier, il est aussi moins performant car génère des accès et recherches disque à chaque appel (en effet, PHP intègre un cache des fichiers lus mais n&#039;intègre pas un cache des fichiers &amp;quot;non trouvés&amp;quot;. Et comme un fichier donné n&#039;est que dans une seule arborescence, il y a toujours une arborescence alternative où il ne se trouve pas et qui génère des accès superflus au disque dur, pénalisant en terme de performance. Comme pour les fichiers internes à Dolibarr, on connait toujours le chemin exacte, le require_once avec ce chemin direct doit être préféré).&lt;br /&gt;
&lt;br /&gt;
===Accès à la base===&lt;br /&gt;
Si vous avez besoin de réaliser des modifications en base dans votre propre table ajoutée, utilisez la classe générée plus haut qui contient les méthodes pour cela.&lt;br /&gt;
&lt;br /&gt;
Si toutefois vous voulez faire des accès dans des tables sans objet PHP dédié, ceci reste possible (par exemple pour récupérer une liste d&#039;enregistrement). Dans ce cas, pensez à suivre ces exemples:&lt;br /&gt;
&lt;br /&gt;
Pour un insert, update ou delete :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$db-&amp;gt;begin();   // Debut transaction&lt;br /&gt;
$db-&amp;gt;query(&amp;quot;Ma requete insert, update ou delete&amp;quot;);&lt;br /&gt;
$db-&amp;gt;commit();       // Valide&lt;br /&gt;
ou $db-&amp;gt;rollback()  // Annule&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour une lecture :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$resql=$db-&amp;gt;query(&amp;quot;Ma requete select&amp;quot;);&lt;br /&gt;
if ($resql)&lt;br /&gt;
{&lt;br /&gt;
	$num = $db-&amp;gt;num_rows($resql);&lt;br /&gt;
	$i = 0;&lt;br /&gt;
	if ($num)&lt;br /&gt;
	{&lt;br /&gt;
		while ($i &amp;lt; $num)&lt;br /&gt;
		{&lt;br /&gt;
			$obj = $db-&amp;gt;fetch_object($resql);&lt;br /&gt;
			if ($obj)&lt;br /&gt;
			{&lt;br /&gt;
				// You can use here results&lt;br /&gt;
				print $obj-&amp;gt;field1;&lt;br /&gt;
				print $obj-&amp;gt;field2;&lt;br /&gt;
			}&lt;br /&gt;
			$i++;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Définition du style===&lt;br /&gt;
Pour que le look de la page soit aligné avec le thème Dolibarr, il est nécessaire d&#039;utiliser les styles des CSS de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
Par exemple :&lt;br /&gt;
&lt;br /&gt;
*class=&amp;quot;&#039;&#039;&#039;liste_titre&#039;&#039;&#039;&amp;quot; sur les balises &#039;&#039;tr&#039;&#039; et &#039;&#039;td&#039;&#039; pour une ligne de titre de tableau.&lt;br /&gt;
*class=&amp;quot;&#039;&#039;&#039;pair&#039;&#039;&#039;&amp;quot; ou class=&amp;quot;&#039;&#039;&#039;impair&#039;&#039;&#039;&amp;quot; sur les balises &#039;&#039;tr&#039;&#039; et &#039;&#039;td&#039;&#039; des lignes de données de tableau.&lt;br /&gt;
*class=&amp;quot;&#039;&#039;&#039;flat&#039;&#039;&#039;&amp;quot; sur tous les champs de saisie (&#039;&#039;input, select, textarea&#039;&#039;...).&lt;br /&gt;
*class=&amp;quot;&#039;&#039;&#039;button&#039;&#039;&#039;&amp;quot; sur les objets de type &#039;&#039;input type=&amp;quot;submit&amp;quot;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Utilisez le sélecteur de date de Dolibarr===&lt;br /&gt;
Si vous le désirez, vous pouvez profiter du sélecteur de date dans des écrans Dolibarr. Pour cela, utilisez la ligne suivante:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$form=new Form($db);&lt;br /&gt;
$form-&amp;gt;select_date(&#039;&#039;,&#039;mykey&#039;,0,0,0,&amp;quot;myform&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La chaîne mykey identifie la zone date. Il faut y mettre une valeur différente s&#039;il y a plusieurs zones.&lt;br /&gt;
La chaine myform est le nom de la zone FORM (dans form name=&amp;quot;myform&amp;quot; de la page HTML).&lt;br /&gt;
L&#039;affichage d&#039;un sélecteur de date doit donc être intégré dans une zone FORM Html.&lt;br /&gt;
&lt;br /&gt;
Pour récupérer la valeur, à l&#039;issu du POST, la commande est:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$mydate = dol_mktime(12, 0 , 0, GETPOST(&#039;mykeymonth&#039;, &#039;int&#039;), GETPOST(&#039;mykeyday&#039;, &#039;int&#039;), GETPOST(&#039;mykeyyear&#039;, &#039;int&#039;));&lt;br /&gt;
print strftime(&#039;%A %d %B %Y&#039;, $mydate);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Définir votre page de configuration (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : si votre module offre plusieurs options paramétrables.&lt;br /&gt;
&lt;br /&gt;
===Créez votre page d&#039;édition de configuration===&lt;br /&gt;
Si votre module offre plusieurs options paramétrables, il est nécessaire de créer une page PHP pour éditer les options (qui sont stockées dans la [[Table llx_const|table &#039;&#039;&#039;llx_const&#039;&#039;&#039;]]).&lt;br /&gt;
Créez une page PHP nommée &#039;&#039;&#039;monmodule_setupapage.php&#039;&#039;&#039; qui affiche les options possibles et les met à jour.&lt;br /&gt;
Il est nécessaire de prendre exemple sur une page dans &#039;&#039;&#039;/admin&#039;&#039;&#039; qui vous montre la méthode pour lire ou sauvegarder en base votre option.&lt;br /&gt;
Placez cette page de configuration dans le répertoire &#039;&#039;&#039;/admin&#039;&#039;&#039; également.&lt;br /&gt;
Ensuite dans le descripteur de module, modifiez la variable pour indiquer le nom de cette page PHP (sans le chemin qui n&#039;est pas nécessaire, la page étant forcément dans le rep admin).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;config_page_url = array(&amp;quot;setup.php@mymodule&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Testez votre page===&lt;br /&gt;
Allez sur la page &#039;&#039;&#039;Configuration-&amp;gt;module&#039;&#039;&#039;, vous devez voir apparaître une icône qui permet d&#039;accéder à la page de configuration et vous devez être capable de modifier ces options et les voir conservées en base.&lt;br /&gt;
&lt;br /&gt;
==Définir vos entrées de menu (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : si vous avez créé des pages PHP, il est nécessaire que ces écrans soient accessibles depuis le menu Dolibarr.&lt;br /&gt;
&lt;br /&gt;
===Définissez vos entrées menus===&lt;br /&gt;
Pour cela, il vous faut définir dans le fichier descripteur de module, le tableau this-&amp;gt;menu qui déclare les menus.&lt;br /&gt;
Ce tableau contient toutes les entrées qui apparaîtront dans les menus une fois le module activé.&lt;br /&gt;
Le fichier de descripteur de module exemple &#039;&#039;&#039;modMonModule.class.php&#039;&#039;&#039; possède un exemple de déclaration de menu haut ainsi que de ses entrées menu gauche associées.&lt;br /&gt;
&lt;br /&gt;
Voici un exemple de déclaration d&#039;entrées de menu dans le fichier descripteur:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Main menu entries&lt;br /&gt;
$this-&amp;gt;menu = array();			// List of menus to add&lt;br /&gt;
$r=0;&lt;br /&gt;
&lt;br /&gt;
// Add here entries to declare new menus&lt;br /&gt;
// Example to declare the Top Menu entry:&lt;br /&gt;
$this-&amp;gt;menu[$r]=array(	&#039;fk_menu&#039;=&amp;gt;0,			// Put 0 if this is a top menu&lt;br /&gt;
			&#039;type&#039;=&amp;gt;&#039;top&#039;,			// This is a Top menu entry&lt;br /&gt;
			&#039;titre&#039;=&amp;gt;&#039;MonModule top menu&#039;,&lt;br /&gt;
			&#039;mainmenu&#039;=&amp;gt;&#039;monmodule&#039;,&lt;br /&gt;
			&#039;leftmenu&#039;=&amp;gt;&#039;monmodule&#039;,&lt;br /&gt;
			&#039;url&#039;=&amp;gt;&#039;/monmodule/pagetop.php&#039;,&lt;br /&gt;
			&#039;langs&#039;=&amp;gt;&#039;mylangfile&#039;,	// Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.&lt;br /&gt;
			&#039;position&#039;=&amp;gt;100,&lt;br /&gt;
			&#039;enabled&#039;=&amp;gt;&#039;1&#039;,			// Define condition to show or hide menu entry. Use &#039;$conf-&amp;gt;monmodule-&amp;gt;enabled&#039; if entry must be visible if module is enabled.&lt;br /&gt;
			&#039;perms&#039;=&amp;gt;&#039;1&#039;,			// Use &#039;perms&#039;=&amp;gt;&#039;$user-&amp;gt;rights-&amp;gt;monmodule-&amp;gt;level1-&amp;gt;level2&#039; if you want your menu with a permission rules&lt;br /&gt;
			&#039;target&#039;=&amp;gt;&#039;&#039;,&lt;br /&gt;
			&#039;user&#039;=&amp;gt;2);				// 0=Menu for internal users, 1=external users, 2=both&lt;br /&gt;
$r++;&lt;br /&gt;
&lt;br /&gt;
// Example to declare a Left Menu entry:&lt;br /&gt;
$this-&amp;gt;menu[$r]=array(	&#039;fk_menu&#039;=&amp;gt;&#039;fk_mainmenu=xxx&#039;,	// Use &#039;fk_mainmenu=xxx&#039; or &#039;fk_mainmenu=xxx,fk_leftmenu=yyy&#039; where xxx is mainmenucode and yyy is a leftmenucode of parent menu&lt;br /&gt;
			&#039;type&#039;=&amp;gt;&#039;left&#039;,			// This is a Left menu entry&lt;br /&gt;
			&#039;titre&#039;=&amp;gt;&#039;MonModule left menu 1&#039;,&lt;br /&gt;
			&#039;mainmenu&#039;=&amp;gt;&#039;xxx&#039;,&lt;br /&gt;
                        &#039;leftmenu&#039;=&amp;gt;&#039;yyy&#039;,&lt;br /&gt;
			&#039;url&#039;=&amp;gt;&#039;/monmodule/pagelevel1.php&#039;,&lt;br /&gt;
			&#039;langs&#039;=&amp;gt;&#039;mylangfile&#039;,	// Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.&lt;br /&gt;
			&#039;position&#039;=&amp;gt;100,&lt;br /&gt;
			&#039;enabled&#039;=&amp;gt;&#039;1&#039;,			// Define condition to show or hide menu entry. Use &#039;$conf-&amp;gt;monmodule-&amp;gt;enabled&#039; if entry must be visible if module is enabled.&lt;br /&gt;
			&#039;perms&#039;=&amp;gt;&#039;1&#039;,			// Use &#039;perms&#039;=&amp;gt;&#039;$user-&amp;gt;rights-&amp;gt;monmodule-&amp;gt;level1-&amp;gt;level2&#039; if you want your menu with a permission rules&lt;br /&gt;
			&#039;target&#039;=&amp;gt;&#039;&#039;,&lt;br /&gt;
			&#039;user&#039;=&amp;gt;2);				// 0=Menu for internal users,1=external users, 2=both&lt;br /&gt;
$r++;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour conditionner l&#039;accès au menu selon des permission, modifier la propriété &#039;&#039;&#039;perms&#039;&#039;&#039; du tableau. Voir le chapitre sur les permissions un peu plus loin pour savoir comment ajouter des permissions.&lt;br /&gt;
&lt;br /&gt;
===Testez vos entrées menus===&lt;br /&gt;
Désactiver et réactiver votre module sous Dolibarr, les entrées menus doivent alors apparaître (si la condition dans &#039;enabled&#039; est vraie).&lt;br /&gt;
&lt;br /&gt;
==Définir vos propres permissions (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : Si vous voulez ajouter de nouvelles permissions.&lt;br /&gt;
&lt;br /&gt;
La définition des permissions que gérera votre module se fait dans le fichier descripteur créé dans la première étape.&lt;br /&gt;
Modifier la ligne &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;rights_class = &#039;monmodule&#039;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
pour y mettre la bonne valeur de monmodule.&lt;br /&gt;
&lt;br /&gt;
Ensuite remplissez le tableau $this-&amp;gt;rights avec autant d&#039;entrées que de permissions différentes à gérer.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;rights[$r][0] = 10001;&lt;br /&gt;
$this-&amp;gt;rights[$r][1] = &#039;Libelle par défaut de ma permission&#039;;&lt;br /&gt;
$this-&amp;gt;rights[$r][3] = 1;&lt;br /&gt;
$this-&amp;gt;rights[$r][4] = &#039;action&#039;;&lt;br /&gt;
$this-&amp;gt;rights[$r][5] = &#039;sousaction&#039;;&lt;br /&gt;
$r++;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans $this-&amp;gt;rights[$r][0], mettre un id de permission non déjà pris (Voir dans le menu &#039;&#039;&#039;Infos Système&#039;&#039;&#039; sur une installation de Dolibarr opérationnelle pour connaître les id déjà utilisés.&lt;br /&gt;
Dans $this-&amp;gt;rights[$r][3], mettre 1 si cette permission est attribué d&#039;office par défaut quand un utilisateur est créé.&lt;br /&gt;
Dans $this-&amp;gt;rights[$r][1], mettre un libellé par défaut (il sera affiché si aucune traduction n&#039;est trouvé pour votre permission dans le fichier &#039;&#039;&#039;admin.lang&#039;&#039;&#039;. La clé de traduction dit être &amp;quot;Permission10001=Description de ma super permission&#039;&#039;&#039;&amp;quot;&#039;&#039;&#039;).&lt;br /&gt;
Dans $this-&amp;gt;rights[$r][4] et $this-&amp;gt;rights[$r][5], mettre une chaîne action et sous action sans espace. Vous pourrez alors tester dans le code PHP si un utilisateurs a bien les droits par la séquence suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
if ($user-&amp;gt;rights-&amp;gt;monmodule-&amp;gt;action-&amp;gt;sousaction) ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Définir vos propres box (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : si votre module amène avec lui une ou plusieurs Boxes.&lt;br /&gt;
&lt;br /&gt;
===Définissez vos box===&lt;br /&gt;
Pour cela, modifiez les tableaux $this-&amp;gt;boxes du fichier descripteur de module.&lt;br /&gt;
Il suffit d&#039;ajouter 2 lignes par fichier box que vous allez créer dans le répertoire &#039;&#039;&#039;htdocs/monmodule/core/boxes&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Exemple :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;boxes[0][&#039;file&#039;]=&#039;mabox0.php@monmodule&#039;&lt;br /&gt;
$this-&amp;gt;boxes[0][&#039;note&#039;]=&#039;Ma box 0&#039;&lt;br /&gt;
 ...&lt;br /&gt;
$this-&amp;gt;boxes[n][&#039;file&#039;]=&#039;maboxn.php@monmodule&#039;&lt;br /&gt;
$this-&amp;gt;boxes[n][&#039;note&#039;]=&#039;Ma box n&#039;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite créez les fichiers &#039;&#039;&#039;htdocs/monmodule/core/boxes/mabox0.php&#039;&#039;&#039;, &#039;&#039;&#039;htdocs/monmodule/core/boxes/mabox1.php&#039;&#039;&#039;... en prenant exemple sur des box existantes (exemple dans le répertoire &#039;&#039;&#039;htdocs/core/boxes&#039;&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
===Testez la présence de vos box dans Dolibarr===&lt;br /&gt;
Désactivez et réactivez le module.&lt;br /&gt;
&lt;br /&gt;
Allez dans le menu &#039;&#039;&#039;Accueil - Configuration - Boite&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Vos box doivent apparaître dans la liste des box activables. Activez les puis allez sur la page d&#039;accueil et vérifiez qu&#039;elles s&#039;affichent correctement.&lt;br /&gt;
&lt;br /&gt;
==Définir vos propres exports (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : si votre module amène avec lui des exports prédéfinis de données (pour ces propres tables ou des tables déjà existantes d&#039;un autre module de Dolibarr).&lt;br /&gt;
&lt;br /&gt;
===Définissez l&#039;export===&lt;br /&gt;
Pour cela, décommentez et modifiez les tableaux $this-&amp;gt;export_xxx du votre fichier descripteur de module.&lt;br /&gt;
&lt;br /&gt;
===Testez votre export===&lt;br /&gt;
Allez dans le menu outils -&amp;gt; export de Dolibarr. Votre export doit apparaitre dans la liste des exports prédéfinis disponibles (si votre module est bien activé).&lt;br /&gt;
Le choisir, vous devez alors voir les champs possibles définis dans le tableau à l&#039;étape précédente.&lt;br /&gt;
Choissez quelques champs et tentez une génération du fichier export.&lt;br /&gt;
&lt;br /&gt;
==Définir vos styles CSS (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : lorsque dans vos écrans PHP, vous utiliser des classes de styles qui ne sont pas celle des thèmes de Dolibarr (non recommandé).&lt;br /&gt;
&lt;br /&gt;
Cette fonctionnalité est décrite mais pas encore opérationnel en 2.4&lt;br /&gt;
&lt;br /&gt;
===Créez et déclarez votre feuille de style===&lt;br /&gt;
Créez un fichier de style css nommé &#039;&#039;&#039;monmodule.css&#039;&#039;&#039; ou &#039;&#039;&#039;monmodule.css.php&#039;&#039;&#039; et placez le dans le répertoire &#039;&#039;&#039;&#039;&#039;monmodule&#039;&#039;&#039;&#039;&#039; dans &#039;&#039;&#039;htdocs&#039;&#039;&#039;. Il ne peut y avoir qu&#039;un fichier css propre à chaque module.&lt;br /&gt;
Rappelons qu&#039;il vaut mieux utiliser les styles déjà existant de Dolibarr (le fichier css utilisé par Dolibarr étant le fichier &#039;&#039;&#039;themes/nomtheme/&#039;&#039;nomtheme&#039;&#039;.css.php&#039;&#039;&#039;). Ne créez un fichier css propre à votre module que si vous devez absolument gérer des styles non déjà existants.&lt;br /&gt;
Une fois votre feuille de style prête, déclarez la dans votre fichier descripteur de module en modifiant la propriété &#039;&#039;&#039;$this-&amp;gt;module_parts&#039;&#039;&#039;.&lt;br /&gt;
La valeur à renseigner ici doit être le chemin relatif de l&#039;URL de votre fichier css.&lt;br /&gt;
Par exemple&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;module_parts = array(&#039;css&#039; =&amp;gt; array(&#039;/monmodule/css/monmodule.css.php&#039;));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Testez votre feuille de style===&lt;br /&gt;
Désactivez et réactivez votre module.&lt;br /&gt;
&lt;br /&gt;
Appelez la page d&#039;accueil de Dolibarr. Affichez la source de la page HTML.&lt;br /&gt;
&lt;br /&gt;
Vous devriez voir dans l&#039;entête HTML, une ligne déclarant votre feuille de style.&lt;br /&gt;
&lt;br /&gt;
==Définir vos fonctions Javascript (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : lorsque dans vos écrans PHP, vous utiliser des fonctions javascript non dispo en standard (fichier lib_head.js)&lt;br /&gt;
&lt;br /&gt;
Si dans vos écrans PHP, vous utilisez des fonctions javascript, il est nécessaire de faire en sorte que vos fonctions déclarées dans un fichier javascript &#039;&#039;&#039;htdocs/monmodule/js/monmodule.js&#039;&#039;&#039; soit chargées dans l&#039;entête head html.&lt;br /&gt;
Pour demander à Dolibarr qui gère la génération de la section header d&#039;inclure un de vos fichiers javascript, il est nécessaire de fournir en paramètre de la fonction llxHeader() appelée au début de votre page, d&#039;inclure le paramètre qui contient l&#039;URL vers le js à inclure.&lt;br /&gt;
&lt;br /&gt;
Exemple pour la page /htdocs/monmodule/mapage.php :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
require(&#039;../main.inc.php&#039;);&lt;br /&gt;
$morejs=array(&amp;quot;/monmodule/js/monmodule.js&amp;quot;);&lt;br /&gt;
llxHeader(&#039;&#039;,&#039;Titre&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,&#039;&#039;,$morejs,&#039;&#039;,0,0); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Déclencher du code sur un évènement Dolibarr (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : lorsque vous voulez que des actions particulières s&#039;exécutent suite au déclenchement d&#039;actions standards de Dolibarr (exemple : je veux mettre à jour une table de mon module quand une facture se crée dans Dolibarr), il vous faut créer un fichier de &#039;&#039;&#039;triggers&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Voir aussi [[Interfaces_Dolibarr_vers_exterieur|Interfaces de Dolibarr vers l&#039;exterieur]]&lt;br /&gt;
et [[Interfaces_Exterieur_vers_Dolibarr|Interfaces exterieures vers Dolibarr]]&lt;br /&gt;
&lt;br /&gt;
==Insérer votre code aux emplacement hooks de Dolibarr (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : lorsque vous voulez modifier ou ajouter du code autrement que lors d&#039;un événement métier (voir le chapitre précédent pour cela).&lt;br /&gt;
&lt;br /&gt;
Voir la page [[Système de Hooks]].&lt;br /&gt;
&lt;br /&gt;
==Ajouter un module de numérotation (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : lorsque vous voulez ajouter une règle de numérotation non couverte par les modules par défaut.&lt;br /&gt;
&lt;br /&gt;
Voir la page [[Créer un module de numérotation]].&lt;br /&gt;
&lt;br /&gt;
==Ajouter un nouveau modèle de document (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : lorsque vous voulez ajouter un nouveau modèle de document.&lt;br /&gt;
&lt;br /&gt;
La documentation au sujet de la génération de documents depuis des modèles est disponible sur la page [[Créer un modèle de document PDF]] ou [[Créer un modèle de document ODT]].&lt;br /&gt;
&lt;br /&gt;
==Ajouter un thème (optionnel)==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039;: Lorsque vous voulez une interface aux couleurs personnalisées à votre cas.&lt;br /&gt;
&lt;br /&gt;
Voir la page [[Themes]].&lt;br /&gt;
&lt;br /&gt;
=[[File:Art.png]] Quelques règles de codage et fonctions pour développeurs=&lt;br /&gt;
Les règles de codage à suivre sont définis dans la [[Documentation Développeur|Documentation développeur]], rubrique &amp;quot;Informations Générales - Langage et normes de développement&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
De nombreuses fonctions prédéfinies pour les développeurs sont disponibles et décrites sur la page [[Documentation Développeur|Documentation développeur]] sous la section &amp;quot;Les couches techniques de Dolibarr&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=[[File:Art.png]] Créer un package pour livrer et installer votre module=&lt;br /&gt;
Cette procédure doit être utilisée pour fabriquer un package afin de le soumettre sur la place de marché http://www.dolistore.com.&lt;br /&gt;
Mais vous pouvez aussi l&#039;utiliser pour distribuer facillement votre module via votre propre réseau de distribution.&lt;br /&gt;
&lt;br /&gt;
*Allez dans le répertoire &#039;&#039;&#039;/build&#039;&#039;&#039; et recopiez le fichier &#039;&#039;&#039;makepack-dolibarrmodules.conf&#039;&#039;&#039; en &#039;&#039;&#039;makepack-monmodule.conf&#039;&#039;&#039;. Attention, ce répertoire peut ne pas être fourni dans les packages de versions stables. Si c&#039;est le cas, il peut être récupéré dans le snapshot disponible en téléchargement sur le site web Dolibarr dans la rubrique Version de développement (prenez dans ce cas tout le répertoire build qui est un répertoire autonome et indépendant de la version).&lt;br /&gt;
&lt;br /&gt;
Saisissez dans ce fichier la liste des noms des nouveaux fichiers que vous avez créé pour votre module (descripteur de module, nouveaux fichiers sql de tables, page php, images, etc...)&lt;br /&gt;
&lt;br /&gt;
*Lancer le script via Perl (besoin de la version Perl 5.0 ou +):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
perl makepack-dolibarrmodule.pl&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Le script vous demande le nom de votre module, sa version majeure et mineure.&lt;br /&gt;
Un fichier &#039;&#039;&#039;monmodule.zip&#039;&#039;&#039; va alors être fabriqué contenant votre module prêt pour être déployé.&lt;br /&gt;
&lt;br /&gt;
*La personne qui reçoit votre module doit alors placer le fichier dans son répertoire racine d&#039;installation de Dolibarr et réaliser la commande :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tar -xvf monmodule.zip&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Si vous désirez que votre module profite à tous, vous pouvez le soumettre (le fichier zip) sur la place de marché des modules complémentaires: {{LinkToPluginDownload}} (vous devez avoir créé un compte auparavant et utiliser le lien &amp;quot;Soumettre un module/produit&amp;quot;).&lt;br /&gt;
**Si votre module a été fabriqué correctement, le fichier sera validé rapidement.&lt;br /&gt;
**Si la qualité est suffisante, que la licence le permet et que la fonctionnalité du module s&#039;avère être d&#039;un intérêt général, le code pourra être ajouté au code source de Dolibarr (sauf si vous ne le désirez pas).&lt;br /&gt;
&lt;br /&gt;
=[[File:Art.png]] Dépôt et validation du module externe sur Dolistore=&lt;br /&gt;
&lt;br /&gt;
Voir [[Module_Dolistore_Validation_Regles|Règles de Validation]]&lt;/div&gt;</summary>
		<author><name>Kusco</name></author>
	</entry>
</feed>