<?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=Unareil</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=Unareil"/>
	<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php/Special:Contributions/Unareil"/>
	<updated>2026-10-22T04:41:43Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.17</generator>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Cr%C3%A9er_un_mod%C3%A8le_de_document_PDF&amp;diff=48407</id>
		<title>Créer un modèle de document PDF</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Cr%C3%A9er_un_mod%C3%A8le_de_document_PDF&amp;diff=48407"/>
		<updated>2020-09-14T08:54:18Z</updated>

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

		<summary type="html">&lt;p&gt;Unareil: /* ID 100000 - 499999 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Core]]&lt;br /&gt;
{{TemplateDocDevEn}}&lt;br /&gt;
{{TemplateDocDevEs}}&lt;br /&gt;
{{TemplateDocDevFr}}&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;
{{Flag en}}&lt;br /&gt;
This page list all reserved modules numbers / ID. If you build or want to build your own modules (like this [[:Category:Complementary_modules|complementary module]]), you should take an ID range here. Please pick range into existing holes first.&lt;br /&gt;
&lt;br /&gt;
{{Flag fr}}&lt;br /&gt;
Cette page recense tous les numéros / ID réservés de modules. Si vous avez réalisé ou voulez réaliser vos propres modules (comme les [[:Category:Modules complémentaires|modules complémentaires suivant]]), vous devriez prendre une plage d&#039;ID ici. Merci de prendre dans les trous existant en priorité !&lt;br /&gt;
&lt;br /&gt;
{{Flag sp}}&lt;br /&gt;
Esta página contiene un listado de todos los id reservados para los módulos. Si ha creado o quiere realizar sus propios módulos, (como estos [[:Category:Módulos_complementarios|módulos complementarios]]), deberá reservarse un rango de ID aquí.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=ID 0 - 99999=&lt;br /&gt;
{{Flag en}}&lt;br /&gt;
Reserved for Dolibarr&#039;s internal modules.&lt;br /&gt;
&lt;br /&gt;
{{Flag fr}}&lt;br /&gt;
Réservé aux modules internes de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
{{Flag sp}}&lt;br /&gt;
Reservado a los módulos internos de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
=ID 100000 - 499999=&lt;br /&gt;
{{Flag en}}&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, 1000 max per company)&lt;br /&gt;
&lt;br /&gt;
{{Flag fr}}&lt;br /&gt;
Zone réservé aux éditeurs qui ont besoin d&#039;une plage d&#039;ID spécifiques. Vous pouvez modifier cette page pour réserver votre plage (limité à 50 valeurs la première fois, 1000 maximum par société)&lt;br /&gt;
&lt;br /&gt;
{{Flag sp}}&lt;br /&gt;
Área reservada para los partners que necesiten un rango de ID. Puede modificar esta página para reservar su rango (limitado a 50 valores por editor)&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)&lt;br /&gt;
*ID 101000 - 101999: NLTechno (https://www.nltechno.com)&lt;br /&gt;
*ID 102000 - 102999: Tiaris (http://www.tiaris.fr)&lt;br /&gt;
*ID 103000 - 103999: Open-concept.pro (http://www.open-concept.pro)&lt;br /&gt;
*ID 104000 - 104999: ATM Consulting (http://www.atm-consulting.fr)&lt;br /&gt;
*ID 105000 - 105999: GPC.solutions&lt;br /&gt;
*ID 106000 - 106999: PHPASSO&lt;br /&gt;
*ID 107000 - 107999: TecLib (http://www.teclib.com) / Auguria (http://www.auguria.net)&lt;br /&gt;
*ID 108000 - 108999: ETHICWEB&lt;br /&gt;
*ID 109000 - 109999: Oas services ([http://www.oas-services.fr https://www.oas-services.fr])&lt;br /&gt;
*ID 110000 - 110999: Librethic (https://librethic.io)&lt;br /&gt;
*ID 111000 - 111999: Asset IT (www.assetit.ch)&lt;br /&gt;
*ID 112000 - 112999: Aarboard AG (www.aarboard.ch)&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)&lt;br /&gt;
*ID 121000 - 121999: Oscss - Shop&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: backbone internet service (www.backbone.co.at)&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)&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)&lt;br /&gt;
*ID 131000 - 131999: Joan Louis (itaca.fr)&lt;br /&gt;
*ID 132000 - 132999: Jean-Marie Arsac (https://azimut.fr)&lt;br /&gt;
*ID 133000 - 133999: Oriel Systems Ltd, UK. (www.orielsystems.com)&lt;br /&gt;
*ID 135000 - 135999: Net-Logic (http://netlogic.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: Florian DUFOURG - France&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 150000 - 150999: Jeffinfo&lt;br /&gt;
*ID 160000 - 160999: Charles-François BENKE (http://www.patas-monkey.com)&lt;br /&gt;
*ID 161000 - 161999: Abbes Bahfir (http://dolipar.org)&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 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 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 183000 - 183999: BB2A Anthony Berton (https://www.bb2a.fr)&lt;br /&gt;
*ID 190000 - 190999: Diciannove (http://19.coop)&lt;br /&gt;
*ID 191000 - 191999: Elonet (https://elonet.fr)&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: David Bensel&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 222000 - 222999:  dolibit  (https://www.dolibit.de)&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: &#039;&#039;&#039;Free (take ranges of 50 only please, 1000 max per company)&#039;&#039;&#039;&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: &#039;&#039;&#039;Free (take ranges of 50 only please, 1000 max per company)&#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 332000 - 332099: Gecka (https://gecka.nc)&lt;br /&gt;
*ID 332100 &#039;&#039;&#039;Free (take ranges of 50 only please, 1000 max per company)&#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: &#039;&#039;&#039;Free&#039;&#039;&#039;&lt;br /&gt;
*ID 330150 - 330199: Freshcore (https://www.freshcore.fr)&lt;br /&gt;
*ID 330200 - 399999: (take ranges of 50 only please, 1000 max per company)&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 (http://www.sergibyte.com)&lt;br /&gt;
*ID 404000 - 404999: Aikhan&lt;br /&gt;
*ID 405000 - 405999: AIME (http://www.aime.mx)&lt;br /&gt;
*ID 409000 - 409999: LliureTIC (www.lliuretic.cat)&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 422200 - 422999: Artaban (http://artaban.fr)&lt;br /&gt;
*ID 423000 - 423050: cyberesprit&lt;br /&gt;
*ID 423051 - 423099: R.Bossard&lt;br /&gt;
*ID 423100 - 423199: Joliciel (www.joliciel.fr)&lt;br /&gt;
*ID 424000 - 424049: A3sys - Mon-Dolibarr (http://www.mon-dolibarr.fr) by Philazerty&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 &#039;&#039;&#039;Free (take ranges of 50 only please, 1000 max per company)&#039;&#039;&#039;&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 - 427000: Bruno Caldas (https://github.com/BCaldas)&lt;br /&gt;
*ID 427001 - 427999: Kevin GUERRIER (alias xcl.saian)&lt;br /&gt;
*ID 428000 - 428099: af83&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 436000 - 436099: SOWEBIO (www.soweb.io)&lt;br /&gt;
*ID 436100 - 436199: CAP-REL (www.cap-rel.fr)&lt;br /&gt;
*ID 436200 &#039;&#039;&#039;Free (take ranges of 50 only please at once, 1000 max per company)&#039;&#039;&#039;&lt;br /&gt;
*ID 436400 - 437399: Mohamed AHERDANE - Morocco - IT Consultant ( www.wave.ma )&lt;br /&gt;
*ID 437400 &#039;&#039;&#039;Free (take ranges of 50 only please at once, 1000 max per company)&#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 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 - 460050: torvista - Spain&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 &#039;&#039;&#039;Free (take ranges of 50 only please at once, 1000 max per company)&#039;&#039;&#039;&lt;br /&gt;
*ID 468175 - 468199: Gaëlle Rauffet - France (kiwiscan.net)&lt;br /&gt;
*ID 468200 - 468250: Paulo Oliveira - Brasil (paulorcdo@gmail.com)&lt;br /&gt;
*ID 468251 - 468270:  CD-Systems - France (https://www.cd-systems.fr)&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;
&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;
{{Flag en}}&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, 1000 ids maximum per partner).&lt;br /&gt;
&lt;br /&gt;
{{Flag fr}}&lt;br /&gt;
Si vous n&#039;avez pas de numéros réservés et en avez besoin, n&#039;utilisez pas de chiffres au hasard et utilisez une valeur supérieure à 500000, toutefois, il est préférable d&#039;obtenir un compte wiki, et  réserver vous-même votre plage en ajoutant votre entrée dans la zone 100000 - 499999 (par lot de 50 d&#039;abord, pas plus de 1000 numéros par partenaire).&lt;br /&gt;
&lt;br /&gt;
{{Flag sp}}&lt;br /&gt;
Si no dispone de número reservado y necesita, no use cifras redondeadas y usa un valor superior a 500000. Si tiene una cuenta wiki, puede reservarse usted mismo sus id añadiendo su entrada en la zona 100000 - 499999 (no más de 1000 id por partner).&lt;/div&gt;</summary>
		<author><name>Unareil</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Module_Services_Web_API_SOAP_(d%C3%A9veloppeur)&amp;diff=47527</id>
		<title>Module Services Web API SOAP (développeur)</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Module_Services_Web_API_SOAP_(d%C3%A9veloppeur)&amp;diff=47527"/>
		<updated>2020-06-08T12:42:23Z</updated>

		<summary type="html">&lt;p&gt;Unareil: Ajout de la mention module déprécié et redirection vers les API REST&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Do NOT edit this section&lt;br /&gt;
     Links below are automatically managed by PolyglotBot&lt;br /&gt;
     You can edit links on the English source page : Module_Web_Services_API_SOAP_(developer) --&amp;gt;&lt;br /&gt;
[[en:Module_Web_Services_API_SOAP_(developer)]]&lt;br /&gt;
[[es:Módulo Services Web SOAP (programador)]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{TemplateDocDev}}&lt;br /&gt;
{{TemplateModFR}}&lt;br /&gt;
[[Category:Liste des Modules]]&lt;br /&gt;
{{BasculeDevUser|&lt;br /&gt;
nom=Web services|&lt;br /&gt;
num=2600|&lt;br /&gt;
devdoc=Cette page|&lt;br /&gt;
userdoc=Non applicable|}}&lt;br /&gt;
&lt;br /&gt;
=Fonction=&lt;br /&gt;
En activant ce module (attention ce module est déprécié, utilisez plutôt le module [[Module Web Services API REST (développeur)|Module Web Services API REST]]), vous activez les fonctions web services serveurs de Dolibarr.&lt;br /&gt;
Vous pouvez alors solliciter les différents services SOAP fournis par Dolibarr.&lt;br /&gt;
&lt;br /&gt;
[[File:warning.png]] SOAP est un protocol en cours d&#039;abandon. Il est fortement recommandé d&#039;utiliser le [[Module Web Services REST (développeur)]] à la place.&lt;br /&gt;
&lt;br /&gt;
=Serveur de web services Dolibarr=&lt;br /&gt;
Une fois le module activé, Dolibarr se comporte en serveur de web service. Vous pouvez alors soumettre votre propre requête SOAP en les soumettant à l&#039;URL relative&lt;br /&gt;
&#039;&#039;&#039;/webservices/server_xxx.php&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
où xxx peut valoir&lt;br /&gt;
{{TemplateListOfWebServices}}&lt;br /&gt;
&lt;br /&gt;
Par exemple, sur la démo en ligne de Dolibarr, envoyez votre requête à &#039;&#039;&#039;http://demo.dolibarr.org/webservices/server_other.php&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Seulement quelques services sont disponibles. Vous pouvez obtenir une liste complète des services fournis en appelant l&#039;URL sans paramètres POST.&lt;br /&gt;
&lt;br /&gt;
Par exemple, pour voir tous les webservices fournis avec la version de demo, appelez simplement l&#039;URL suivante sans paramètres:&lt;br /&gt;
 http://demo.dolibarr.org/webservices/server_other.php&lt;br /&gt;
&lt;br /&gt;
Pour obtenir le fichier WSDL qui décrit les contrats webservices, vous pouvez appeler:&lt;br /&gt;
 http://demo.dolibarr.org/webservices/server_other.php?wsdl&lt;br /&gt;
&lt;br /&gt;
=Client de web services Dolibarr=&lt;br /&gt;
Notez que vous trouverez un example de code PHP client qui appelle les web services Dolibarr en sollicitant l&#039;URL&lt;br /&gt;
&#039;&#039;&#039;/webservices/server_other.php&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Par exemple, sur la démo en ligne, appeler la page de client web service suivante&lt;br /&gt;
 http://demo.dolibarr.org/webservices/demo_wsclient_other.php&lt;br /&gt;
&lt;br /&gt;
=Liste des services disponibles=&lt;br /&gt;
La liste des services disponibles peut être consultée en appelant la page &#039;&#039;&#039;/webservices/&#039;&#039;&#039;.&lt;br /&gt;
Par exemple, pour le serveur Dolibarr de démo, ce sera l&#039;URL: https://demo.dolibarr.org/webservices/&lt;br /&gt;
&lt;br /&gt;
Cette liste est très courte actuellement mais elle sera enrichie avec de futures versions...&lt;/div&gt;</summary>
		<author><name>Unareil</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Fonctions_utiles_D%C3%A9veloppeur_Dolibarr&amp;diff=43883</id>
		<title>Fonctions utiles Développeur Dolibarr</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Fonctions_utiles_D%C3%A9veloppeur_Dolibarr&amp;diff=43883"/>
		<updated>2019-08-19T10:52:54Z</updated>

		<summary type="html">&lt;p&gt;Unareil: /* GETPOSTISSET() */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TemplateDocDev}}&lt;br /&gt;
&lt;br /&gt;
La page suivante décrit quelques fonctions importantes utilisées par dolibarr.&lt;br /&gt;
&lt;br /&gt;
==GETPOST==&lt;br /&gt;
GETPOST() : fonction permettant de récupérer le contenu des variables GET ou POST de manière plus sécurisé. Les méthodes PHP $_GET et $_POST ne doivent donc pas être utilisé.&lt;br /&gt;
&lt;br /&gt;
Utilisation possible :&lt;br /&gt;
&lt;br /&gt;
Exemple en php : &amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$monChamp= $_POST[&amp;quot;monChamp&amp;quot;];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;devient si l&#039;élément passé en paramètre est un nombre :&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$monChamp= GETPOST(&amp;quot;monChamp&amp;quot;,&#039;int&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Paramètres possibles du deuxième argument :  &#039;none&#039;,&#039;int&#039;,&#039;intcomma&#039;,&#039;alpha&#039;,&#039;aZ&#039;,&#039;aZ09&#039;,&#039;array&#039;,&#039;san_alpha&#039;,&#039;nohtml&#039;, &#039;alphanohtml&#039;,&#039;custom&#039;.&lt;br /&gt;
&lt;br /&gt;
*&#039;none&#039; pour pas de vérification du type de paramètre,&lt;br /&gt;
*&#039;int&#039;= vérifie que c&#039;est un numérique(entier ou nombre à virgule)&lt;br /&gt;
*&#039;intcomma&#039;=vérifie que c&#039;est un entier avec des virgules (&#039;1,2,3,4...&#039;)&lt;br /&gt;
*&#039;alpha&#039;=vérifie que c&#039;est du texte et des signes&lt;br /&gt;
*&#039;aZ&#039;=vérifie que c&#039;est a-z seulement&lt;br /&gt;
*&#039;aZ09&#039;=vérifie que c&#039;est des caractères non spéciaux et des nombres&lt;br /&gt;
*&#039;array&#039;=vérifie que c&#039;est un tableau&lt;br /&gt;
*&#039;san_alpha&#039;=chaîne de caractères purgée (ne pas utiliser pour du texte libre)&lt;br /&gt;
*&#039;nohtml&#039;=verifie qu&#039;il n&#039;y a pas de code html&lt;br /&gt;
*&#039;alphanohtml&#039;=verifie qu&#039;il n&#039;y a pas de code html&lt;br /&gt;
*&#039;custom&#039;= défini par les filtres et les options qui suivent avec les paramètres $filter et $options&lt;br /&gt;
&lt;br /&gt;
Pour plus d&#039;information voir les commentaires de la fonction dans le fichier htdocs/core/lib/functions.lib.php&lt;br /&gt;
&lt;br /&gt;
==GETPOSTISSET()==&lt;br /&gt;
GETPOSTISSET(nomDeLaVariable) permet de savoir si la variable GET ou POST passée en paramètre est définie.&lt;br /&gt;
&lt;br /&gt;
Exemple en php : &amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
if (isset($_POST[&#039;monChamp&#039;])){...}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;devient : &amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
if (GETPOSTISSET(&#039;monChamp&#039;)){...}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour plus d&#039;information voir les commentaires de la fonction dans le fichier htdocs/core/lib/functions.lib.php&lt;br /&gt;
&lt;br /&gt;
==img_picto==&lt;br /&gt;
img_picto() fonction permettant d&#039;insérer une image.&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
print img_picto(titreDelimage,nomDeLimage);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour plus d&#039;information voir les commentaires de la fonction dans le fichier htdocs/core/lib/functions.lib.php&amp;lt;br /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Unareil</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Fonctions_utiles_D%C3%A9veloppeur_Dolibarr&amp;diff=43882</id>
		<title>Fonctions utiles Développeur Dolibarr</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Fonctions_utiles_D%C3%A9veloppeur_Dolibarr&amp;diff=43882"/>
		<updated>2019-08-19T10:49:14Z</updated>

		<summary type="html">&lt;p&gt;Unareil: ajout de la fonction GETPOSTISSET&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TemplateDocDev}}&lt;br /&gt;
&lt;br /&gt;
La page suivante décrit quelques fonctions importantes utilisées par dolibarr.&lt;br /&gt;
&lt;br /&gt;
==GETPOST==&lt;br /&gt;
GETPOST() : fonction permettant de récupérer le contenu des variables GET ou POST de manière plus sécurisé. Les méthodes PHP $_GET et $_POST ne doivent donc pas être utilisé.&lt;br /&gt;
&lt;br /&gt;
Utilisation possible :&lt;br /&gt;
&lt;br /&gt;
Exemple en php : &amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$monChamp= $_POST[&amp;quot;monChamp&amp;quot;];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;devient si l&#039;élément passé en paramètre est un nombre :&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$monChamp= GETPOST(&amp;quot;monChamp&amp;quot;,&#039;int&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Paramètres possibles du deuxième argument :  &#039;none&#039;,&#039;int&#039;,&#039;intcomma&#039;,&#039;alpha&#039;,&#039;aZ&#039;,&#039;aZ09&#039;,&#039;array&#039;,&#039;san_alpha&#039;,&#039;nohtml&#039;, &#039;alphanohtml&#039;,&#039;custom&#039;.&lt;br /&gt;
&lt;br /&gt;
*&#039;none&#039; pour pas de vérification du type de paramètre,&lt;br /&gt;
*&#039;int&#039;= vérifie que c&#039;est un numérique(entier ou nombre à virgule)&lt;br /&gt;
*&#039;intcomma&#039;=vérifie que c&#039;est un entier avec des virgules (&#039;1,2,3,4...&#039;)&lt;br /&gt;
*&#039;alpha&#039;=vérifie que c&#039;est du texte et des signes&lt;br /&gt;
*&#039;aZ&#039;=vérifie que c&#039;est a-z seulement&lt;br /&gt;
*&#039;aZ09&#039;=vérifie que c&#039;est des caractères non spéciaux et des nombres&lt;br /&gt;
*&#039;array&#039;=vérifie que c&#039;est un tableau&lt;br /&gt;
*&#039;san_alpha&#039;=chaîne de caractères purgée (ne pas utiliser pour du texte libre)&lt;br /&gt;
*&#039;nohtml&#039;=verifie qu&#039;il n&#039;y a pas de code html&lt;br /&gt;
*&#039;alphanohtml&#039;=verifie qu&#039;il n&#039;y a pas de code html&lt;br /&gt;
*&#039;custom&#039;= défini par les filtres et les options qui suivent avec les paramètres $filter et $options&lt;br /&gt;
&lt;br /&gt;
Pour plus d&#039;information voir les commentaires de la fonction dans le fichier htdocs/core/lib/functions.lib.php&lt;br /&gt;
&lt;br /&gt;
== GETPOSTISSET() ==&lt;br /&gt;
GETPOSTISSET(nomDeLaVariable) permet de savoir si la variable GET ou POST passée en paramètre est définie.&lt;br /&gt;
&lt;br /&gt;
Exemple en php : &amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$monChamp= $_POST[&amp;quot;monChamp&amp;quot;];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;devient :&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$monChamp= GETPOST(&amp;quot;monChamp&amp;quot;,&#039;int&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour plus d&#039;information voir les commentaires de la fonction dans le fichier htdocs/core/lib/functions.lib.php&lt;br /&gt;
&lt;br /&gt;
==img_picto==&lt;br /&gt;
img_picto() fonction permettant d&#039;insérer une image.&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
print img_picto(titreDelimage,nomDeLimage);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour plus d&#039;information voir les commentaires de la fonction dans le fichier htdocs/core/lib/functions.lib.php&amp;lt;br /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Unareil</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Fonctions_utiles_D%C3%A9veloppeur_Dolibarr&amp;diff=43881</id>
		<title>Fonctions utiles Développeur Dolibarr</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Fonctions_utiles_D%C3%A9veloppeur_Dolibarr&amp;diff=43881"/>
		<updated>2019-08-19T10:37:15Z</updated>

		<summary type="html">&lt;p&gt;Unareil: /* img_picto */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TemplateDocDev}}&lt;br /&gt;
&lt;br /&gt;
La page suivante décrit quelques fonctions importantes utilisées par dolibarr.&lt;br /&gt;
&lt;br /&gt;
==GETPOST==&lt;br /&gt;
GETPOST() : fonction permettant de récupérer le contenu des variables GET ou POST de manière plus sécurisé. Les méthodes PHP $_GET et $_POST ne doivent donc pas être utilisé.&lt;br /&gt;
&lt;br /&gt;
Utilisation possible :&lt;br /&gt;
&lt;br /&gt;
Exemple en php : &amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$monChamp= $_POST[&amp;quot;monChamp&amp;quot;];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;devient si l&#039;élément passé en paramètre est un nombre :&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$monChamp= GETPOST(&amp;quot;monChamp&amp;quot;,&#039;int&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Paramètres possibles du deuxième argument :  &#039;none&#039;,&#039;int&#039;,&#039;intcomma&#039;,&#039;alpha&#039;,&#039;aZ&#039;,&#039;aZ09&#039;,&#039;array&#039;,&#039;san_alpha&#039;,&#039;nohtml&#039;, &#039;alphanohtml&#039;,&#039;custom&#039;.&lt;br /&gt;
&lt;br /&gt;
*&#039;none&#039; pour pas de vérification du type de paramètre,&lt;br /&gt;
*&#039;int&#039;= vérifie que c&#039;est un numérique(entier ou nombre à virgule)&lt;br /&gt;
*&#039;intcomma&#039;=vérifie que c&#039;est un entier avec des virgules (&#039;1,2,3,4...&#039;)&lt;br /&gt;
*&#039;alpha&#039;=vérifie que c&#039;est du texte et des signes&lt;br /&gt;
*&#039;aZ&#039;=vérifie que c&#039;est a-z seulement&lt;br /&gt;
*&#039;aZ09&#039;=vérifie que c&#039;est des caractères non spéciaux et des nombres&lt;br /&gt;
*&#039;array&#039;=vérifie que c&#039;est un tableau&lt;br /&gt;
*&#039;san_alpha&#039;=chaîne de caractères purgée (ne pas utiliser pour du texte libre)&lt;br /&gt;
*&#039;nohtml&#039;=verifie qu&#039;il n&#039;y a pas de code html&lt;br /&gt;
*&#039;alphanohtml&#039;=verifie qu&#039;il n&#039;y a pas de code html&lt;br /&gt;
*&#039;custom&#039;= défini par les filtres et les options qui suivent avec les paramètres $filter et $options&lt;br /&gt;
&lt;br /&gt;
Pour plus d&#039;information voir les commentaires de la fonction dans le fichier htdocs/core/lib/functions.lib.php&lt;br /&gt;
&lt;br /&gt;
==img_picto==&lt;br /&gt;
img_picto() fonction permettant d&#039;insérer une image.&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
print img_picto(titreDelimage,nomDeLimage);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour plus d&#039;information voir les commentaires de la fonction dans le fichier htdocs/core/lib/functions.lib.php&amp;lt;br /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Unareil</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Fonctions_utiles_D%C3%A9veloppeur_Dolibarr&amp;diff=43878</id>
		<title>Fonctions utiles Développeur Dolibarr</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Fonctions_utiles_D%C3%A9veloppeur_Dolibarr&amp;diff=43878"/>
		<updated>2019-08-19T10:33:02Z</updated>

		<summary type="html">&lt;p&gt;Unareil: Ajout de la fonction img_picto&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TemplateDocDev}}&lt;br /&gt;
&lt;br /&gt;
La page suivante décrit quelques fonctions importantes utilisées par dolibarr.&lt;br /&gt;
&lt;br /&gt;
==GETPOST==&lt;br /&gt;
GETPOST() : fonction permettant de récupérer le contenu des variables GET ou POST de manière plus sécurisé. Les méthodes PHP $_GET et $_POST ne doivent donc pas être utilisé.&lt;br /&gt;
&lt;br /&gt;
Utilisation possible :&lt;br /&gt;
&lt;br /&gt;
Exemple en php : &amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$monChamp= $_POST[&amp;quot;monChamp&amp;quot;];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;devient si l&#039;élément passé en paramètre est un nombre :&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$monChamp= GETPOST(&amp;quot;monChamp&amp;quot;,&#039;int&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Paramètres possibles du deuxième argument :  &#039;none&#039;,&#039;int&#039;,&#039;intcomma&#039;,&#039;alpha&#039;,&#039;aZ&#039;,&#039;aZ09&#039;,&#039;array&#039;,&#039;san_alpha&#039;,&#039;nohtml&#039;, &#039;alphanohtml&#039;,&#039;custom&#039;.&lt;br /&gt;
&lt;br /&gt;
*&#039;none&#039; pour pas de vérification du type de paramètre,&lt;br /&gt;
*&#039;int&#039;= vérifie que c&#039;est un numérique(entier ou nombre à virgule)&lt;br /&gt;
*&#039;intcomma&#039;=vérifie que c&#039;est un entier avec des virgules (&#039;1,2,3,4...&#039;)&lt;br /&gt;
*&#039;alpha&#039;=vérifie que c&#039;est du texte et des signes&lt;br /&gt;
*&#039;aZ&#039;=vérifie que c&#039;est a-z seulement&lt;br /&gt;
*&#039;aZ09&#039;=vérifie que c&#039;est des caractères non spéciaux et des nombres&lt;br /&gt;
*&#039;array&#039;=vérifie que c&#039;est un tableau&lt;br /&gt;
*&#039;san_alpha&#039;=chaîne de caractères purgée (ne pas utiliser pour du texte libre)&lt;br /&gt;
*&#039;nohtml&#039;=verifie qu&#039;il n&#039;y a pas de code html&lt;br /&gt;
*&#039;alphanohtml&#039;=verifie qu&#039;il n&#039;y a pas de code html&lt;br /&gt;
*&#039;custom&#039;= défini par les filtres et les options qui suivent avec les paramètres $filter et $options&lt;br /&gt;
&lt;br /&gt;
Pour plus d&#039;information voir les commentaires de la fonction dans le fichier htdocs/core/lib/functions.lib.php&lt;br /&gt;
&lt;br /&gt;
== img_picto ==&lt;br /&gt;
img_picto() fonction permettant d&#039;insérer une image.&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
print img_picto(titreDelimage,nomDeLimage);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;br /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Unareil</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Langages_et_normes&amp;diff=43864</id>
		<title>Langages et normes</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Langages_et_normes&amp;diff=43864"/>
		<updated>2019-08-19T10:11:45Z</updated>

		<summary type="html">&lt;p&gt;Unareil: /* PHP */ ajout d&amp;#039;un lien vers fonctions utiles Dolibarr&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 : Language_and_development_rules --&amp;gt;&lt;br /&gt;
[[en:Language_and_development_rules]]&lt;br /&gt;
[[es:Lenguaje_y_Normas_de_Desarrollo]]&lt;br /&gt;
[[zh:语言和开发规则]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{TemplateDocDev}}&lt;br /&gt;
&lt;br /&gt;
Voici les quelques règles sur le langage, la syntaxe et normes de développement en vigueur pour le projet Dolibarr:&lt;br /&gt;
&lt;br /&gt;
=Versions=&lt;br /&gt;
&lt;br /&gt;
*Dolibarr doit fonctionner sur:&lt;br /&gt;
&lt;br /&gt;
#Tous OS (Windows, Linux, MACOS...)&lt;br /&gt;
#PHP {{PHPMinVersion}} (Doit fonctionner sans aucun module PHP complémentaire hors les modules d&#039;accès base de donnée).&lt;br /&gt;
#Mysql {{MySqlMinVersion}}&lt;br /&gt;
&lt;br /&gt;
=Normes Copyright=&lt;br /&gt;
&lt;br /&gt;
*Tout fichier PHP doit avoir un en-tête selon le masque suivant&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
/* Copyright (C) YYYY John Doe  &amp;lt;email@email.com&amp;gt;&lt;br /&gt;
 *&lt;br /&gt;
 * Licence information&lt;br /&gt;
 */&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Quand vous éditez un fichier existant du projet, ajouter une ligne Copyright sous celles existantes.&lt;br /&gt;
&lt;br /&gt;
=Normes PHP=&lt;br /&gt;
&lt;br /&gt;
==PHP==&lt;br /&gt;
&lt;br /&gt;
*Dolibarr est écrit en PHP et supporte toutes versions PHP supérieures à la {{PHPMinVersion}}. Les fichiers doivent tous comporter l&#039;extension .php&lt;br /&gt;
&lt;br /&gt;
*L&#039;appel aux variables superglobales PHP doit passer par les opérateurs dédiés $_COOKIES, $_SERVER, $_ENV mais par la fonction dolibarr [[Fonctions utiles Dolibarr|GETPOST()]] pour récupérer les contenus de $_GET ou $_POST.&lt;br /&gt;
&lt;br /&gt;
Les autres opérateurs ($HTTP_SERVER_GET, ...) ayant été passés en deprecated au sein de PHP, ne doivent plus être utilisés. Ainsi le code doit fonctionner y compris quand l&#039;option &#039;&#039;&#039;register_long_arrays&#039;&#039;&#039; est à off.&lt;br /&gt;
De plus, le code doit fonctionner aussi bien quand l&#039;option PHP &#039;&#039;&#039;register_globals&#039;&#039;&#039; est à off (recommandé par PHP)  que quand l&#039;option &#039;&#039;&#039;register_globals&#039;&#039;&#039; est à on (par défaut sur de nombreuses installations).&lt;br /&gt;
&lt;br /&gt;
*Pas d&#039;utilisation de la variable &#039;&#039;&#039;PHP_SELF&#039;&#039;&#039;. Utiliser à la place $_SERVER[&amp;quot;PHP_SELF&amp;quot;]. Notez aussi que le framework Dolibarr passe une routine pour rendre plus sûr le contenu du $_SERVER[&amp;quot;PHP_SELF&amp;quot;] (dans le fichier main.inc.php, donc avant tout traitement métier)&lt;br /&gt;
&lt;br /&gt;
*Quand plusieurs variables doivent être initialisées avec la même valeur, il faut utiliser plusieurs instructions:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$var1=1;$var2=1;$var3=1;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
plutôt que&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$var1=$var2=$var3=1;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
qui est moins performant.&lt;br /&gt;
&lt;br /&gt;
*Les chaines doivent être encadrées de simple quote et les variables sorties de la chaine.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
print &#039;Mon texte affiche ma &#039;.$variable.&#039; !&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Les commentaires doivent suivre la syntaxe C, ie un double antislash pour un commentaire d&#039;une ligne et utilisation slash-étoile pour ouvrir un bloc de plusieurs lignes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/* Bloc de commentaire&lt;br /&gt;
 *&lt;br /&gt;
 * Fin du bloc&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
$monobjet = new MonObjet($db);&lt;br /&gt;
$result=$monobjet-&amp;gt;fetch($idobject);&lt;br /&gt;
&lt;br /&gt;
for ($i = 1 , $i &amp;lt; 2 ; $i++)&lt;br /&gt;
{&lt;br /&gt;
  // commentaire sur une ligne&lt;br /&gt;
  print $i;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Les fonctions doivent retourner une valeure strictement &amp;gt; à 0 en cas de succès, et un nombre &amp;lt; à 0 en cas d&#039;erreur.&lt;br /&gt;
&lt;br /&gt;
*Pas de code mort (non utilisé) dans le code principal de Dolibarr (le code utilisé uniquement par un module externe doit être inclus dans le module externe).&lt;br /&gt;
&lt;br /&gt;
*Utiliser &amp;quot;include_once&amp;quot; pour l&#039;inclusion de tout fichier contenant des définitions de fonction ou de classes (donc fichiers *.class.php et *.lib.php), utiliser &amp;quot;include&amp;quot; pour tout inclusion de fichier de type template ou contenant un mixte de HTML et PHP (donc fichiers *.inc.php et *.tpl.php).&lt;br /&gt;
&lt;br /&gt;
*Le style de code a utiliser est le PSR-2 (https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md). Seules les règles &amp;quot;MUST&amp;quot; sont imposées. Notez aussi les points/excetions suivants:&lt;br /&gt;
**La longueur des lignes: PSR-2 indique que la longueur des lignes a une limite &amp;quot;soft&amp;quot; à 120. Il est en effet préférable d&#039;avoir de longues lignes de données de déclaration plutôt que de longues pages car ce code ne contient aucune logique, toutefois une limite &amp;quot;hard&amp;quot; a été instauré à &#039;&#039;&#039;1000&#039;&#039;&#039; caractères. Du code qui ira au dela provoquera des erreurs dans la plateforme d&#039;Intégration Continue.&lt;br /&gt;
**Les tabulations sont acceptées: L&#039;autre exception est qu&#039;on ne remplace pas les tabulations systématiquement par des espaces. L&#039;utilisation des tabulations simplifie la vie de certains développeurs. De plus, l&#039;utilisation d&#039;espaces rend certaines fonctions d&#039;autoformatage défectueuses (comme sur certaines versions d&#039;Eclipse, lors de copié-collé).&lt;br /&gt;
**Note 1: Les règles suivantes sont particulièrement importantes:&lt;br /&gt;
***Les fichiers doivent être sauvés en format Unix (LF) et non Windows (CR/LF). Le format Unix étant compatible sur les OS Unix like, Windows, Mac, alors que le format fichier texte Windows pose problème sous certains PHP sous Unix.&lt;br /&gt;
***Les smart tags PHP ne sont pas utilisés. Les sections de code doivent commencer par &#039;&#039;&#039;&amp;lt;?php&#039;&#039;&#039;&lt;br /&gt;
**Note 2: Vous pouvez utiliser le fichier &#039;&#039;&#039;dev/codesniffer/ruleset.xml&#039;&#039;&#039; comme fichier de contrôle pour vérifier votre style de code avec PHPCodeSniffer.&lt;br /&gt;
**Note 3: Vous remarquerez que le code actuel ne suit pas forcément tout cela. La raison est historique. La règle fut instaurée en cours de route, aussi, si vous trouvez du code non respectueux de ce standard, n&#039;hésitez pas à le corriger.&lt;br /&gt;
&lt;br /&gt;
==Structures des classes et champs==&lt;br /&gt;
&lt;br /&gt;
Certaines propriétés de classes se retrouvent dans de nombreuses classes. Pour homogénéité, on utilisera les noms suivants:&lt;br /&gt;
{{TemplatePHPFields}}&lt;br /&gt;
&lt;br /&gt;
=Normes SQL=&lt;br /&gt;
&lt;br /&gt;
==Structure des tables et champs==&lt;br /&gt;
&lt;br /&gt;
*Toutes les tables sont préfixées pour éviter les conflits de nommage. Aujourd&#039;hui, le préfixe est modifiable au moment de l&#039;installation. Sa valeur par défaut est &amp;lt;tt&amp;gt;llx_&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*Structure des tables.&lt;br /&gt;
&lt;br /&gt;
Lorsque vous créez une table, il est recommandé de prendre les même conventions de nommages de tables que les autres tables Dolibarr. Avec, à minima les champs suivant:&lt;br /&gt;
 - rowid INTEGER AUTO_INCREMENT PRIMARY KEY    qui est l&#039;id technique&lt;br /&gt;
 - entity INTEGER default 1                    that is id for the multicompany feature&lt;br /&gt;
 - date_creation   datetime                    that is the creation date&lt;br /&gt;
 - tms             timestamp                   qui sera un champ contenant la date de chaque mise à jour (la base de donnée le gère tout seul, pas besoin de le gérer par le code)&lt;br /&gt;
 - import_key                                  qui contiendra le code d&#039;import YYYYMMDDHHMMSS si vous faites des imports en masse dans la table.&lt;br /&gt;
&lt;br /&gt;
Eventuellement&lt;br /&gt;
 - fk_user_creat  integer qui est l&#039;id du user de création (fk_user_author also found)&lt;br /&gt;
 - fk_user_modif  integer qui est l&#039;id du user de modification&lt;br /&gt;
 - fk_user_valid  integer qui est l&#039;id du user de validation&lt;br /&gt;
 - fk_soc integer qui est l&#039;id du tiers (si applicable)&lt;br /&gt;
&lt;br /&gt;
*Type des champs&lt;br /&gt;
&lt;br /&gt;
Dans la pratique, afin d&#039;etre compatible avec toutes les précisions des pays, syntaxes des bases, on utilisera uniquement les types suivants:&lt;br /&gt;
 - smallint pour tout petit nombre entier&lt;br /&gt;
 - integer pour tout nombre entier, id ou clé étrangère&lt;br /&gt;
 - double(24,8) pour tout montant&lt;br /&gt;
 - double(6,3) pour les taux de tva&lt;br /&gt;
 - real pour une quantité&lt;br /&gt;
 - varchar pour une chaine (y compris de longueur 1, le type char est de plus en plus déprécié)&lt;br /&gt;
 - timestamp pour un champ date+heure devant être mis a jour automatiquement&lt;br /&gt;
 - datetime pour un champ date+heure&lt;br /&gt;
 - date pour un champ date&lt;br /&gt;
&lt;br /&gt;
==Clé primaire==&lt;br /&gt;
La clé primaire d&#039;une table s&#039;appelle &amp;lt;tt&amp;gt;rowid&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Il y a quelques tables qui échappent à cette règle actuellement (ex [[Table llx_c_actioncomm]]), pour des raisons historiques. Une évolution pourra être étudiée pour une prochaine version.&lt;br /&gt;
&lt;br /&gt;
==Clés étrangères==&lt;br /&gt;
Le nom d&#039;une clé étrangère commence par le préfixe &amp;lt;tt&amp;gt;fk_&amp;lt;/tt&amp;gt; suivi du nom de la table liée (requis pour éviter doublons globales à la base, problématiques sous certains SGBD comme postgresql) puis du champ lié (pour permettre plusieurs clés étrangères différentes sur une même table).&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
fk_facture_fourn_fk_soc&lt;br /&gt;
&lt;br /&gt;
Note: Si vous développez votre propre module externe, il ne doit pas y avoir de clé étrangère depuis vos tables qui pointent sur les tables standards de Dolibarr. Ceci casserait les fonctionnalités de mise à jour, de réparation, de sauvegardes et de restauration.&lt;br /&gt;
&lt;br /&gt;
==Clés alternatives==&lt;br /&gt;
Parfois, il n&#039;y a pas que la clé primaire qui doit être unique. On peut donc ajouter aussi un index clé alternative unique. Un tel index est nommé par un nom qui commence par le préfixe &amp;lt;tt&amp;gt;uk_&amp;lt;/tt&amp;gt; suivi du nom de la table (requis pour éviter doublons d&#039;index globals à la base, problématiques sous certains SGBD comme postgresql) puis d&#039;un suffixe qui caractérise la clé (pour permettre plusieurs index uniques sur une même table).&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
uk_societe_code_client&lt;br /&gt;
&lt;br /&gt;
==Index performance==&lt;br /&gt;
Certains champs sont souvent utilisés comme critère de recherche, de tri ou de jointure. Il convient dans ce cas, d&#039;y mettre un index de performance. De tels indexes seront nommés avec un préfix &amp;lt;tt&amp;gt;idx_&amp;lt;/tt&amp;gt; puis le nom de la table et le nom du champ sur lequel porte l&#039;index.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
idx_societe_user_creat&lt;br /&gt;
&lt;br /&gt;
==Format de fichier DDL==&lt;br /&gt;
Les fichiers qui contiennent la définition de la structure de la base (DDL) doivent être au nombre de 2 par tables:&lt;br /&gt;
Chaque table est définie dans son propre fichier dont le nom est &amp;lt;tt&amp;gt;llx_&#039;&#039;matable&#039;&#039;.sql&amp;lt;/tt&amp;gt;. &lt;br /&gt;
On mettra un commentaire à côté de chaque champ pour en expliquer la signification.&lt;br /&gt;
Les clés étrangères et index de performance ou autres contraintes d&#039;unicité sont définies dans un fichier séparé dont le nom est &amp;lt;tt&amp;gt;llx_&#039;&#039;matable&#039;&#039;.key.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ces fichiers sont placés dans le répertoire &#039;&#039;&#039;install/mysql/tables&#039;&#039;&#039; pour les fichiers standards ou &#039;&#039;&#039;monmodule/tables&#039;&#039;&#039; pour les tables amenées par un module.&lt;br /&gt;
&lt;br /&gt;
Exemple &#039;&#039;&#039;fichier table llx_matable.sql&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- ===========================================================================&lt;br /&gt;
-- Copyright (C) 2008 Author &amp;lt;email@author.com&amp;gt;&lt;br /&gt;
-- &lt;br /&gt;
-- This program is free software; you can redistribute it and/or modify&lt;br /&gt;
-- it under the terms of the GNU General Public License as published by&lt;br /&gt;
-- the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
-- (at your option) any later version.&lt;br /&gt;
--&lt;br /&gt;
-- This program is distributed in the hope that it will be useful,&lt;br /&gt;
-- but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the&lt;br /&gt;
-- GNU General Public License for more details.&lt;br /&gt;
--&lt;br /&gt;
-- You should have received a copy of the GNU General Public License&lt;br /&gt;
-- along with this program. If not, see &amp;lt;http://www.gnu.org/licenses/&amp;gt;.&lt;br /&gt;
-- ===========================================================================&lt;br /&gt;
&lt;br /&gt;
create table llx_matable&lt;br /&gt;
(&lt;br /&gt;
  rowid       integer AUTO_INCREMENT PRIMARY KEY,&lt;br /&gt;
  field_one   integer,&lt;br /&gt;
  field_two   integer NOT NULL,&lt;br /&gt;
  fk_field    integer,&lt;br /&gt;
  field_date  datetime,&lt;br /&gt;
  tms         timestamp&lt;br /&gt;
)ENGINE=innodb;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple &#039;&#039;&#039;fichier clés/index llx_matable.key.sql&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- ===========================================================================&lt;br /&gt;
-- Copyright (C) 2008 Author &amp;lt;email@author.com&amp;gt;&lt;br /&gt;
-- &lt;br /&gt;
-- This program is free software; you can redistribute it and/or modify&lt;br /&gt;
-- it under the terms of the GNU General Public License as published by&lt;br /&gt;
-- the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
-- (at your option) any later version.&lt;br /&gt;
--&lt;br /&gt;
-- This program is distributed in the hope that it will be useful,&lt;br /&gt;
-- but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the&lt;br /&gt;
-- GNU General Public License for more details.&lt;br /&gt;
--&lt;br /&gt;
-- You should have received a copy of the GNU General Public License&lt;br /&gt;
-- along with this program. If not, see &amp;lt;http://www.gnu.org/licenses/&amp;gt;.&lt;br /&gt;
-- ===========================================================================&lt;br /&gt;
&lt;br /&gt;
ALTER TABLE llx_matable ADD UNIQUE uk_matable_field(field_one, field_two);&lt;br /&gt;
&lt;br /&gt;
ALTER TABLE llx_matable ADD CONSTRAINT fk_matable_fk_field FOREIGN KEY (fk_field) REFERENCES llx_matablepere (rowid);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Règles de codage SQL==&lt;br /&gt;
&lt;br /&gt;
*Utilisation des alias/nommage de champs&lt;br /&gt;
&lt;br /&gt;
Dans le cas des select on pourra utiliser les alias pour simplifier l&#039;écriture des requêtes:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
select chp1, chpxxx2 as chp2 from table2 as t1, table2 as t2 where t1.chpx = t2.chpy&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Toutefois, il ne faut pas utiliser ces alias sur des requêtes update car non compatible avec mysql 3.1.&lt;br /&gt;
&lt;br /&gt;
*Les SELECT * sont interdits ! Chaque SELECT doit spécifier la liste complète des champs à récupérer. Cela permet d&#039;éviter les confusions. Exemple:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT field_a, field_b, field_c FROM table_1 WHERE field_d = &#039;$id&#039;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Dans les requêtes SQL, on quote les champs mais pas les numériques qui contiennent des montants destinés à être stockés dans des champs de type double ou real. Les quotes sur les numériques de type float provoquent parfois un stockage d&#039;une valeur différente. Par exemple 412.62 dans le insert sera en fait stocké avec la valeur 412.61999512 en base (suite à des conversions chaines-numériques implicites) si le champ est de type double(24,8). Et seul le PHP voit 412.61999512. Les autres outils verront 412.62 donnant l&#039;impression qu&#039;il n&#039;y a pas de problème. Et c&#039;est le PHP qui a raison, il y a problème en base. En supprimant les quotes sur les numériques, cela va mieux.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
Bon:     INSERT INTO table_1 (field_txt, field_num) VALUES (&#039;txt&#039;, 412.62)&lt;br /&gt;
Mauvais: INSERT INTO table_1 (field_txt, field_num) VALUES (&#039;txt&#039;, &#039;412.62&#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remarque, le problème des float est général et pas seulement sur les accès base, il est présent dans tous les languages quand on travaille sur des nombres réels, aussi ils doivent être, dès que affectés, nettoyés par la fonction price2num avec le 2eme paramètre renseigné à:&lt;br /&gt;
&#039;MU&#039; (si il s&#039;agit d&#039;un prix unitaire), &#039;MT&#039; (s&#039;il s&#039;agit d&#039;un prix total) ou &#039;MS&#039; (autres cas) selon le besoin.&lt;br /&gt;
Voir aussi le chapitre &amp;quot;Les nombres réels, montants et calculs&amp;quot; plus bas.&lt;br /&gt;
&lt;br /&gt;
*Les fonctions NOW, SYSDATE ou DATEDIFF sont interdites au sein des ordres SQL. S&#039;il faut saisir la date du moment dans un champ, la valeur doit venir du PHP, par exemple par la fonction dol_now(), et non du moteur de base de données. Ceci afin d&#039;avoir une meilleure portabilité du code mais surtout d&#039;avoir une gestion correcte des TimeZone et ne pas dépendre du TimeZone de la base de donnée.&lt;br /&gt;
&lt;br /&gt;
Par exemple, on ne fera pas:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$sql=&amp;quot;SELECT rowid FROM table where datefield = NOW()&amp;quot;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
mais:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$sql=&amp;quot;SELECT rowid FROM table where datefield = &#039;&amp;quot;.$this-&amp;gt;db-&amp;gt;idate(dol_now()).&amp;quot;&#039;&amp;quot;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Par exemple, on ne fera pas:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$sql=&amp;quot;SELECT rowid FROM table where DATEDIFF(table.datefield, NOW()) &amp;gt; 7&amp;quot;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
mais:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$sql=&amp;quot;SELECT rowid FROM table where datefield &amp;lt; &#039;&amp;quot;.$this-&amp;gt;db-&amp;gt;idate(dol_now() - (7 * 24 * 3600)).&amp;quot;&#039;&amp;quot;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un autre avantage de cette règle est que la requête peut bénéficier de l&#039;utilisation de l&#039;index puisqu&#039;on compare datefield à une valeur fixe. Dans le cas du datediff, on applique un traitement sur le champ avant comparaison, rendant impossible l&#039;utilisation de l&#039;index de ce champ. Les conséquences sont des performances très dégradées par rapport à la version sans datediff.&lt;br /&gt;
&lt;br /&gt;
==Règles de migration de base==&lt;br /&gt;
&lt;br /&gt;
*Les scripts de migration de structure sont les fichiers de type &#039;&#039;&#039;install/mysql/migration/a.b.c-x.y.z.sql&#039;&#039;&#039;. Dans un fichier de migration de n vers n+1, on ne détruit une table (DROP TABLE) qui n&#039;est plus utilisée en n+1 que lors de la migration de la version n+1 vers n+2. Ceci afin de toujours conserver les tables deprecated le temps d&#039;une version pour réparer une situation en cas d&#039;erreur de migration.&lt;br /&gt;
&lt;br /&gt;
==Spécificités MySQL==&lt;br /&gt;
&lt;br /&gt;
*Les tables doivent être au format InnoDB.&lt;br /&gt;
&lt;br /&gt;
En effet, ce format gère les clés étrangères, les éventuelles restrictions qui y sont attachées et la notion d&#039;intégrité de transactions requise pour avoir des données en base cohérente entre tables.&lt;br /&gt;
&lt;br /&gt;
*Dolibarr DOIT fonctionner même avec les options &#039;&#039;&#039;strict&#039;&#039;&#039; de Mysql active.&lt;br /&gt;
&lt;br /&gt;
Pour l&#039;activer, ajouter la ligne suivante dans le fichier config du serveur Mysql (my.cnf ou my.ini)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
sql-mode=&amp;quot;STRICT_ALL_TABLES,ONLY_FULL_GROUP_BY,NO_ZERO_DATE&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Spécificités PostgreSQL==&lt;br /&gt;
Seuls les fichiers pour Mysql doivent être maintenus.&lt;br /&gt;
Les fichiers pour les autres bases sont convertis &amp;quot;à la volée&amp;quot; par le driver Dolibarr de la base.&lt;br /&gt;
&lt;br /&gt;
Il existe une exception.&lt;br /&gt;
Les requêtes &amp;quot;UPDATE FROM&amp;quot; : &lt;br /&gt;
Syntax MySQL :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
UPDATE table_taget as target, table_source as source SET fieldtarget=source.fieldsource&lt;br /&gt;
WHERE source.rowid=target.rowid;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Syntax PgSQL:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
UPDATE table_taget as target SET fieldtarget=source.fieldsource&lt;br /&gt;
FROM table_source as source WHERE source.rowid=target.rowid;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il n&#039;en existe pas dans Dolibarr, mais pour vos modules Vous devriez faire tel que :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
if ($this-&amp;gt;db-&amp;gt;type==&#039;pgsql&#039;) {&lt;br /&gt;
$sql=&amp;quot;UPDATE table_taget as target SET fieldtarget=source.fieldsource&lt;br /&gt;
FROM table_source as source WHERE source.rowid=target.rowid&amp;quot;;&lt;br /&gt;
} else {&lt;br /&gt;
$sql= &amp;quot;UPDATE table_taget as target, table_source as source SET fieldtarget=source.fieldsource&lt;br /&gt;
WHERE source.rowid=target.rowid&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Normes HTML=&lt;br /&gt;
&lt;br /&gt;
*Tous les attributs dans les balises HTML doivent être *en minuscule* et quotés avec des *doubles quote*.&lt;br /&gt;
&lt;br /&gt;
*Les liens href doivent être absolus en se basant sur la fonction dol_buildpath() pour obtenir un chemin absolu depuis un chemin relatif au répertoire htdocs. Pour les tags img, il faut faire appel à la fonction img_picto().&lt;br /&gt;
&lt;br /&gt;
Par example:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
print &#039;&amp;lt;a href=&amp;quot;&#039;.dol_buildpath(&#039;/monrep/mapage.php&#039;).&#039;&amp;quot;&amp;gt;&#039;.img_picto(&#039;Texte alt&#039;,&#039;nompictopng&#039;,&#039;&#039;).&#039;&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Les tables HTML doivent avoir des colonnes sans valeurs forcées, excepté pour les colonnes qui contiennent une information dont la longueur est non variable. Par exemple, une colonne avec un picto peut être forcée à with=&amp;quot;20px&amp;quot;. Dans les autres cas, il faut éviter de forcer la largeur des colonnes. La raison est que, dans la plupart des cas, le navigateur fait un meilleur travail pour définir automatiquement la bonne largeur des colonnes qu&#039;en forçant manuellement les largeurs. Et ceci marche quelque soit la résolution de l&#039;écran.&lt;br /&gt;
&lt;br /&gt;
*Le javascript/ajax et l&#039;appel aux scripts java dans les pages php est à proscrire. Si toutefois du code javascript est inclus, il doit être conditionné par le test sur &amp;quot;$conf-&amp;gt;use_javascript_ajax&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
if ($conf-&amp;gt;use_javascript_ajax) {&lt;br /&gt;
...  // Le code php qui génère du javascript est ici&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Les popups windows ne doivent pas être utilisées, sauf pour des tooltips (et restent conditionnées par le point ci-dessus).&lt;br /&gt;
&lt;br /&gt;
*Les scripts externes sont écrits en Perl s&#039;ils ne peuvent l&#039;être en php, l&#039;utilisation d&#039;un autre langage n&#039;est pas interdit mais doit être discuté au préalable dans la mailing list des développeurs.&lt;br /&gt;
&lt;br /&gt;
=Normes Dolibarr et squelettes de code=&lt;br /&gt;
&lt;br /&gt;
==Squelettes de code==&lt;br /&gt;
Afin d&#039;uniformiser le code et d&#039;accélérer le développement de nouveaux composants dans Dolibarr, se trouvent dans le répertoire &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039;, 4 squelettes de code tout préparés.&lt;br /&gt;
&lt;br /&gt;
*1 qui sert d&#039;exemple de descripteur de module: &#039;&#039;&#039;myModule.class.php&#039;&#039;&#039;&lt;br /&gt;
*1 qui sert d&#039;exemple de code pour faire une nouvelle classe: &#039;&#039;&#039;skeleton_class.class.php&#039;&#039;&#039;&lt;br /&gt;
*1 qui sert d&#039;exemple de code pour faire une nouvelle page: &#039;&#039;&#039;skeleton_page.php&#039;&#039;&#039;&lt;br /&gt;
*1 qui sert d&#039;exemple de code pour faire un script à exécuter en ligne de commande: &#039;&#039;&#039;skeleton_script.php&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Servez-vous en comme exemple.&lt;br /&gt;
Notons que ces squelettes sont aussi utilisés par le générateur de code PHP qui est décrit dans la chapitre de développement de module Dolibarr pour accélérer vos développement.&lt;br /&gt;
&lt;br /&gt;
==Les dates et TimeZone==&lt;br /&gt;
Dolibarr se veut une application multi-utilisateur et multi-localisation. Il convient donc de stocker les dates dans le bon format. Pour éviter les problèmes de conversion, les règles suivantes doivent être appliquées:&lt;br /&gt;
&lt;br /&gt;
*Une date en mémoire doit être au format Timestamp GMT.&lt;br /&gt;
*Une date stockée en base de données contient le Timestamp issue de la date soumise dans la requête en heure &amp;lt;b&amp;gt;locale du serveur PHP&amp;lt;/b&amp;gt;. Cela ne concerne pas les dates mises à jour automatiquement par la base (champ &#039;&#039;&#039;tms&#039;&#039;&#039; en base).&lt;br /&gt;
&lt;br /&gt;
Ainsi le 1er janvier 1970, 3 heures à Paris (TZ=+1) = 1er janvier 1970, 2 heures à Greenwich (TZ=0) sera stocké en mémoire par 7200 et sera soumis à la base de données avec la chaine &#039;19700101030000&#039; (PHP convertit en heure de son TZ et la base déconvertit avec son TZ qui est le même que celui de PHP).&lt;br /&gt;
&lt;br /&gt;
Les méthodes select doivent donc traduire les champs dates lus qui sont au format chaine TZ de la base (&#039;19700101030000&#039;) par appel de la méthode db-&amp;gt;jdate afin de récupérer une information en mémoire au format Timestamp GMT. Et les méthodes insert doivent lors de la génération de la requête convertir la date mémoire connue en variable, par la méthode db-&amp;gt;idate (Voir exemples générés par le squelette).&lt;br /&gt;
&lt;br /&gt;
*Les dates mises à jour automatiquement par la base (champ &#039;&#039;&#039;tms&#039;&#039;&#039; en base) contiennent le Timestamp où la modification est faite selon le timezone de la base de donnée. Les méthodes select récupèrent cette donnée en mémoire au format Timestamp GMT en appliquant également le db-&amp;gt;jdate. Si le timezone de la base de donnée diffère de celui du PHP (un des 2 est mal réglé), il peut donc y avoir des écarts entre date de création et modification.&lt;br /&gt;
&lt;br /&gt;
*La manipulation de dates en PHP doit être faite en utilisant les fonctions dates de Dolibarr: &#039;&#039;&#039;dol_now(), dol_mktime(), dol_stringtotime(), dol_getdate(), dol_time_plus_duree()&#039;&#039;&#039;. Vous trouverez également d&#039;autres fonctions prêtes à l&#039;emploi dans le fichier &#039;&#039;&#039;date.lib.php&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==L&#039;encodage UTF8/ISO==&lt;br /&gt;
Dolibarr stocke les informations de manière suivante:&lt;br /&gt;
&lt;br /&gt;
*En base de donnée, les données sont en UTF8 ou ISO. Cela dépend du pagecode de la base, donc des options à la création de cette base. Dans tous les cas le driver d&#039;accès base Dolibarr (dans /lib/database) s&#039;arrange à la lecture et insertion pour convertir vers et depuis de l&#039;UTF8.&lt;br /&gt;
*Les données en mémoires sont donc stockées en UTF8 (instances d&#039;objets PHP).&lt;br /&gt;
*Les pages web affichées à l&#039;écran sont au format UTF8 (avec les versions &amp;lt; 2.5.1, c&#039;est le vieux paramètre $character_set du fichier conf.php qui définissait le format de sortie).&lt;br /&gt;
&lt;br /&gt;
==Les nombres réels, montants et calculs==&lt;br /&gt;
En PHP comme dans d&#039;autres langages (Java par exemple), les données non entières (float, real, double) ne sont pas fiables.&lt;br /&gt;
Essayer de faire par exemple &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
print 239.2 - 229.3 - 9.9;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Vous n&#039;obtiendrez pas zéro mais un nombre très petit en puissance de 10 négative. Si vous obtenez zéro, vous pourrez trouvez d&#039;autres exemples qui ne fonctionnent pas.&lt;br /&gt;
Le problème des float est général, une variable résultante de calcul de nombre réels doit SYSTEMATIQUEMENT être nettoyée par la fonction &#039;&#039;&#039;price2num()&#039;&#039;&#039; avec le 2eme paramètre renseigné à: &#039;MU&#039;, &#039;MT&#039; ou &#039;MS&#039; selon le besoin (voir doc fonction).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
print price2num(239.2 - 229.3 - 9.9, &#039;MT&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
S&#039;il ne s&#039;agit pas d&#039;un prix sur lequel s&#039;adapte les paramètres MU, MT ou MS, il faut utiliser la fonction &#039;&#039;&#039;round()&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==Création de tables==&lt;br /&gt;
Ne pas créer de table à l&#039;utilisation, c&#039;est-à-dire à la &#039;&#039;&#039;première utilisation&#039;&#039;&#039; du module.&lt;br /&gt;
Si vous créez un module qui utilise des tables qui ne sont pas intégrées en standard dans le code de Dolibarr, veillez à suivre le didacticiel [[Développement module]] qui explique comment joindre des tables qui se créent à l&#039;activation du module et non à son utilisation (voir plus haut).&lt;br /&gt;
&lt;br /&gt;
==Comparer la version==&lt;br /&gt;
&lt;br /&gt;
Si votre code a besoin de faire des choses différentes selon la version de Dolibarr, vous pouvez utiliser le truc suivant pour comparer les versions&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$version=preg_split(&#039;/[\.-]/&#039;,DOL_VERSION);&lt;br /&gt;
if (versioncompare($version,array(5,0,-4)) &amp;gt;= 0) { //mycode for 5.0 only; }	// For dolibarr 5.0.* (the -4 means we include also alpha, beta, rc and rcX)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mais cette solution requiert de faire un include avoir la fonction versioncompare. Une alternative est d&#039;utiliser le test suivant:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
if ((float) DOL_VERSION &amp;gt;= 5.0) { //mycode for 5.0 only; }	// For dolibarr 5.0.*&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Logs==&lt;br /&gt;
Ajouter des traces dans votre code avec la fonction&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
dol_syslog($yourmessage, LOG_INFO|LOG_DEBUG|LOG_WARNING|LOG_ERR);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Répertoires de travail==&lt;br /&gt;
Si vous avez besoin de créer un répertoire de travail, dans votre code, faites référence à ce répertoire par&lt;br /&gt;
&#039;&#039;&#039;DOL_DATA_ROOT.&#039;/monmodule&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Le répertoire peut être créé dans votre code à l&#039;exécution par le code suivant:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$mymoduledir=DOL_DATA_ROOT.&#039;/monmodule&#039;;&lt;br /&gt;
dol_mkdir($mymoduledir);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si vous avez besoin d&#039;un répertoire qui contiendra des données temporaires, ce répertoire doit être&#039;&#039;&#039; DOL_DATA_ROOT.&#039;/monmodule/temp&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=Design patterns et programmation objet=&lt;br /&gt;
&lt;br /&gt;
==Design patterns de Création (GoF)==&lt;br /&gt;
Design patterns définis par le Gang Of Four (voir la wikipédia sur les [[wikipedia:Patron de conception|Design patterns]]).&lt;br /&gt;
Dans Dolibarr, pas de mise en oeuvre de design patterns de comportement particulier.&lt;br /&gt;
On trouve des objets proches des Singletons et Fabriques conforme à 100% dans l&#039;esprit mais pas dans la syntaxe, ceci afin d’être compatible avec la plus large plage possible de versions de PHP.&lt;br /&gt;
&lt;br /&gt;
==Design patterns d&#039;entreprises (Martin Fowler)==&lt;br /&gt;
&lt;br /&gt;
===Mode d&#039;organisation du code===&lt;br /&gt;
[[wikipedia:Martin_Fowler|Martin Fowler]] a identifié 3 méthodes d&#039;organisation du code appelées &#039;&#039;&#039;patterns&#039;&#039;&#039; (&#039;&#039;&#039;motifs&#039;&#039;&#039;):&lt;br /&gt;
&lt;br /&gt;
*Le &#039;&#039;&#039;Transaction Script&#039;&#039;&#039; (Le code est linéaire en fonction d&#039;une action utilisateur).&lt;br /&gt;
&lt;br /&gt;
C&#039;est le motif à l&#039;ancienne utilisé dans les langages procéduraux.&lt;br /&gt;
Inconvénient: Redondance du code. Nécessité de connaitre le modèle physique pour développer les parties métiers.&lt;br /&gt;
&lt;br /&gt;
*Le &#039;&#039;&#039;Domain Model&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
C&#039;est un concept possible depuis les langages objets. Ce sont les procédures métiers (qui doivent être identifiés avant) qui servent de bases pour les classes objets.&lt;br /&gt;
Inconvénient: Motif complexe à maintenir.&lt;br /&gt;
&lt;br /&gt;
*Le &#039;&#039;&#039;Table Module&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Un intermédiaire entre les 2 précédents où l&#039;on a une instance unique de classe par table de la base de données.&lt;br /&gt;
&lt;br /&gt;
-&amp;gt; Comme le montre les squelettes de code (voir point précédent), Dolibarr se base sur le principe du &#039;&#039;&#039;Table Module&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
===Communication Logique métier - Données (ORM)===&lt;br /&gt;
Il existe 3 modes de liaisons:&lt;br /&gt;
&lt;br /&gt;
*Le &#039;&#039;&#039;Table And Row Data Gateway&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
C&#039;est le plus simple. On crée une classe par table et chaque classe est un pont avec la table correspondante et propose les méthodes CRUD sur cette table (Create, Read, Update, Delete). Une instance de classe étant alors un enregistrement de la table. La classe ne contient que du code d&#039;accès aux lignes ou colonnes de tables. Le code métier doit alors être ajouté dans d&#039;autres classes. Les liens entre ces classes tables et les classes métiers devant être connues ou déduite de la connaissance du développeur.&lt;br /&gt;
&lt;br /&gt;
Exemple: C&#039;est le mode mis en oeuvre quand on utilise certains Frameworks d&#039;ORM comme &#039;&#039;&#039;iBatis&#039;&#039;&#039; (http://ibatis.apache.org/).&lt;br /&gt;
&lt;br /&gt;
*Le &#039;&#039;&#039;Active Record&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Identique au précédent, mais on se permet d&#039;ajouter quelques fonctions métiers sur la classe, à conditions que ces fonctions soient bien  propres à la table ou à la notion métier porté par l&#039;enregistrement. C&#039;est le pattern qui offre le meilleur rapport fonctionnalité/complexité.&lt;br /&gt;
&lt;br /&gt;
Exemple: C&#039;est le mode choisi pour les développements Dolibarr et de nombreuses autres applications PHP qui ont leur propre framework et pratiques de développements.&lt;br /&gt;
&lt;br /&gt;
*Le &#039;&#039;&#039;Data Mapper&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Les classes représentent les entités du problème et non les données. Il faut donc doubler, tripler... ces classes avec des classes Mapper pour accéder aux données.&lt;br /&gt;
Plus &amp;quot;puriste&amp;quot; sur le papier car plus proche du métier, ce mode a aussi l&#039;inconvénient d&#039;être très complexe et difficile à maintenir dans la réalité (l&#039;expérience pratique constaté ne rejoignant pas les promesses de la théorie).&lt;br /&gt;
&lt;br /&gt;
Exemple: C&#039;est le choix si on utilise le Framework d&#039;ORM &#039;&#039;&#039;Propel&#039;&#039;&#039; (http://propel.phpdb.org/trac/). On le trouve donc sur des applications plus lourdes basées sur cet ORM entre autres.&lt;br /&gt;
&lt;br /&gt;
-&amp;gt; Pour les développements Dolibarr, il est recommandé d&#039;utiliser le mode de liaison &#039;&#039;&#039;Active Record&#039;&#039;&#039; qui offre les avantages d&#039;un modèle proche du métier sans en avoir la complexité et sans trop masquer non plus la technique. C&#039;est dans ce mode que le développement, la compréhension du code et la maintenance technique et/ou fonctionnelle semble la plus productive (ceci est toutefois un éternel débat entre les puristes et les pragmatiques, débat dans lequel personne ne peut vraiment avoir raison, car tout dépend des objectifs à atteindre).&lt;br /&gt;
&lt;br /&gt;
==Design Pattern d&#039;Interface Graphique==&lt;br /&gt;
Il existe plusieurs design pattern pour les interfaces utilisateurs (MVC, MVP, MVVM).&lt;br /&gt;
Beaucoup confonde ce design pattern avec celui consistant à utiliser un framework de templates. C&#039;est sans rapport. Un framework de template (voir point précédent) n&#039;est en lien qu&#039;avec la partie &amp;quot;V&amp;quot; de ces modèles.&lt;br /&gt;
&lt;br /&gt;
-&amp;gt; Dolibarr utilise le Design Pattern MVC. La partie M est matérialisée par une classe DAO contenant les méthode CRUD (Create-Read-Update-Delete) d&#039;accès à la table.&lt;br /&gt;
Beaucoup de frameworks ont fait le choix de mettre la partie de code C (Controller) et la partie de code du V (vue) dans des fichiers, voir même répertoires séparés. La maintenance semble plus aisé sur la papier, en pratique, il faut sans arrêt jonglé entre n fichiers, le C étant fortement lié au V. Aussi dans Dolibarr, la séparation est faite par une simple section de commentaire. La partie de code C (Controller) est donc le code qui se trouve sont la balise&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * Actions&lt;br /&gt;
 */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Elle est suivi par la partie de code V (Vue), bien séparé du C par la balise&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * View&lt;br /&gt;
 */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ce mode de séparation a eu un effet neutre sur les nouveaux développement mais a permis de réduire de manière si importante le temps requis pour la maintenance et correction de bugs qu&#039;il n&#039;est pas envisagé de basculer vers un autre type de séparation (oui les constats fait dans la vraie vie ne sont pas toujours ceux attendus par la théorie scolaire). L&#039;important reste qu&#039;il y ait toujours séparation entre le C et le V, peut importe comment est matérialisé cette séparation, du moment qu&#039;elle l&#039;est (Rappel: Ne pas confondre la notion de séparation du C et du V avec la notion de séparation du code pour alimenter la données d&#039;une Vue et du code pour formater la Vue, ceci un principe de séparation relevant du Design Pattern de Vue, voir point suivant).&lt;br /&gt;
&lt;br /&gt;
==Design Pattern de Vue - Présentation==&lt;br /&gt;
Il existe des frameworks spécialisés dans le Design Pattern de Vue, la partie qui consiste à formater l&#039;écran vue par l&#039;utilisateur.&lt;br /&gt;
Les vieilles versions de Dolibarr utilisaient Smarty. Ce framework est une surcouche à un Framework, déjà très puissant de formatage d&#039;écran nommé PHP. Les bénéfices étant très inférieurs aux inconvénients, il a été abandonné au profit du PHP qui reste le plus simple, le plus universel des frameworks de présentation. Son seul défaut est qu&#039;il ne peut garantir à 100% les écarts d&#039;un développeur qui irait intégrer dans la Vue, une logique sans rapport avec la présentation (donc autre que du code à vocation de génération, de formatage, de sortie HTML, de logique de test ou de boucle). Ce point est toutefois contrôlé par le mécanisme de validation du code des chefs de projets.&lt;br /&gt;
La encore, c&#039;est l&#039;experience et le constat d&#039;un meilleur rendement de productivité qui a motivé l&#039;abandon des frameworks de Présentation externes au profit du framework PHP.&lt;/div&gt;</summary>
		<author><name>Unareil</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Fonctions_utiles_dolibarr&amp;diff=43863</id>
		<title>Fonctions utiles dolibarr</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Fonctions_utiles_dolibarr&amp;diff=43863"/>
		<updated>2019-08-19T10:09:56Z</updated>

		<summary type="html">&lt;p&gt;Unareil: Unareil moved page Fonctions utiles dolibarr to Fonctions utiles Dolibarr&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Fonctions utiles Dolibarr]]&lt;/div&gt;</summary>
		<author><name>Unareil</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Fonctions_utiles_D%C3%A9veloppeur_Dolibarr&amp;diff=43862</id>
		<title>Fonctions utiles Développeur Dolibarr</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Fonctions_utiles_D%C3%A9veloppeur_Dolibarr&amp;diff=43862"/>
		<updated>2019-08-19T10:09:56Z</updated>

		<summary type="html">&lt;p&gt;Unareil: Unareil moved page Fonctions utiles dolibarr to Fonctions utiles Dolibarr&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Lorsque j&#039;ai commencé le développement sous Dolibarr, je me suis retrouvé confronter face à tout un tas de fonctions importantes utilisées par dolibarr que je ne connaissais pas.&lt;br /&gt;
&lt;br /&gt;
N&#039;ayant trouvé que le fichier code source en documentation, j&#039;ai décidé de récapituler ces fonctions dans cette page.&lt;br /&gt;
&lt;br /&gt;
==GETPOST==&lt;br /&gt;
GETPOST() : fonction permettant de récupérer le contenu des variables GET ou POST de manière plus sécurisé.&lt;br /&gt;
&lt;br /&gt;
Utilisation possible :&lt;br /&gt;
&lt;br /&gt;
Exemple en php : &amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$monChamp= $_POST[&amp;quot;monChamp&amp;quot;];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;devient si l&#039;élément passé en paramètre est un nombre :&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$monChamp= GETPOST(&amp;quot;monChamp&amp;quot;,&#039;int&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Paramètres possibles du deuxième argument :  &#039;none&#039;,&#039;int&#039;,&#039;intcomma&#039;,&#039;alpha&#039;,&#039;aZ&#039;,&#039;aZ09&#039;,&#039;array&#039;,&#039;san_alpha&#039;,&#039;nohtml&#039;, &#039;alphanohtml&#039;,&#039;custom&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;none&#039; pour pas de vérification du type de paramètre,&lt;br /&gt;
* &#039;int&#039;= vérifie que c&#039;est un numérique(entier ou nombre à virgule)&lt;br /&gt;
* &#039;intcomma&#039;=vérifie que c&#039;est un entier avec des virgules (&#039;1,2,3,4...&#039;)&lt;br /&gt;
* &#039;alpha&#039;=vérifie que c&#039;est du texte et des signes&lt;br /&gt;
* &#039;aZ&#039;=vérifie que c&#039;est a-z seulement&lt;br /&gt;
* &#039;aZ09&#039;=vérifie que c&#039;est des caractères non spéciaux et des nombres&lt;br /&gt;
* &#039;array&#039;=vérifie que c&#039;est un tableau&lt;br /&gt;
* &#039;san_alpha&#039;=chaîne de caractères purgée (ne pas utiliser pour du texte libre)&lt;br /&gt;
* &#039;nohtml&#039;=verifie qu&#039;il n&#039;y a pas de code html&lt;br /&gt;
* &#039;alphanohtml&#039;=verifie qu&#039;il n&#039;y a pas de code html&lt;br /&gt;
* &#039;custom&#039;= défini par les filtres et les options qui suivent avec les paramètres $filter et $options&lt;br /&gt;
&lt;br /&gt;
Pour plus d&#039;information voir commentaires lignes 252 à 269 du fichier htdocs/core/lib/functions.lib.php&lt;/div&gt;</summary>
		<author><name>Unareil</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Fonctions_utiles_D%C3%A9veloppeur_Dolibarr&amp;diff=43861</id>
		<title>Fonctions utiles Développeur Dolibarr</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Fonctions_utiles_D%C3%A9veloppeur_Dolibarr&amp;diff=43861"/>
		<updated>2019-08-19T10:08:41Z</updated>

		<summary type="html">&lt;p&gt;Unareil: mise en forme&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Lorsque j&#039;ai commencé le développement sous Dolibarr, je me suis retrouvé confronter face à tout un tas de fonctions importantes utilisées par dolibarr que je ne connaissais pas.&lt;br /&gt;
&lt;br /&gt;
N&#039;ayant trouvé que le fichier code source en documentation, j&#039;ai décidé de récapituler ces fonctions dans cette page.&lt;br /&gt;
&lt;br /&gt;
==GETPOST==&lt;br /&gt;
GETPOST() : fonction permettant de récupérer le contenu des variables GET ou POST de manière plus sécurisé.&lt;br /&gt;
&lt;br /&gt;
Utilisation possible :&lt;br /&gt;
&lt;br /&gt;
Exemple en php : &amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$monChamp= $_POST[&amp;quot;monChamp&amp;quot;];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;devient si l&#039;élément passé en paramètre est un nombre :&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$monChamp= GETPOST(&amp;quot;monChamp&amp;quot;,&#039;int&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Paramètres possibles du deuxième argument :  &#039;none&#039;,&#039;int&#039;,&#039;intcomma&#039;,&#039;alpha&#039;,&#039;aZ&#039;,&#039;aZ09&#039;,&#039;array&#039;,&#039;san_alpha&#039;,&#039;nohtml&#039;, &#039;alphanohtml&#039;,&#039;custom&#039;.&lt;br /&gt;
&lt;br /&gt;
* &#039;none&#039; pour pas de vérification du type de paramètre,&lt;br /&gt;
* &#039;int&#039;= vérifie que c&#039;est un numérique(entier ou nombre à virgule)&lt;br /&gt;
* &#039;intcomma&#039;=vérifie que c&#039;est un entier avec des virgules (&#039;1,2,3,4...&#039;)&lt;br /&gt;
* &#039;alpha&#039;=vérifie que c&#039;est du texte et des signes&lt;br /&gt;
* &#039;aZ&#039;=vérifie que c&#039;est a-z seulement&lt;br /&gt;
* &#039;aZ09&#039;=vérifie que c&#039;est des caractères non spéciaux et des nombres&lt;br /&gt;
* &#039;array&#039;=vérifie que c&#039;est un tableau&lt;br /&gt;
* &#039;san_alpha&#039;=chaîne de caractères purgée (ne pas utiliser pour du texte libre)&lt;br /&gt;
* &#039;nohtml&#039;=verifie qu&#039;il n&#039;y a pas de code html&lt;br /&gt;
* &#039;alphanohtml&#039;=verifie qu&#039;il n&#039;y a pas de code html&lt;br /&gt;
* &#039;custom&#039;= défini par les filtres et les options qui suivent avec les paramètres $filter et $options&lt;br /&gt;
&lt;br /&gt;
Pour plus d&#039;information voir commentaires lignes 252 à 269 du fichier htdocs/core/lib/functions.lib.php&lt;/div&gt;</summary>
		<author><name>Unareil</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Fonctions_utiles_D%C3%A9veloppeur_Dolibarr&amp;diff=43860</id>
		<title>Fonctions utiles Développeur Dolibarr</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Fonctions_utiles_D%C3%A9veloppeur_Dolibarr&amp;diff=43860"/>
		<updated>2019-08-19T10:07:46Z</updated>

		<summary type="html">&lt;p&gt;Unareil: /* GETPOST */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Lorsque j&#039;ai commencé le développement sous Dolibarr, je me suis retrouvé confronter face à tout un tas de fonctions importantes utilisées par dolibarr que je ne connaissais pas.&lt;br /&gt;
&lt;br /&gt;
N&#039;ayant trouvé que le fichier code source en documentation, j&#039;ai décidé de récapituler ces fonctions dans cette page.&lt;br /&gt;
&lt;br /&gt;
==GETPOST==&lt;br /&gt;
GETPOST() : fonction permettant de récupérer le contenu des variables GET ou POST de manière plus sécurisé.&lt;br /&gt;
&lt;br /&gt;
Utilisation possible :&lt;br /&gt;
&lt;br /&gt;
Exemple en php : &amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$monChamp= $_POST[&amp;quot;monChamp&amp;quot;];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;devient si l&#039;élément passé en paramètre est un nombre :&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$monChamp= GETPOST(&amp;quot;monChamp&amp;quot;,&#039;int&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Paramètres possibles du deuxième argument :  &#039;none&#039;,&#039;int&#039;,&#039;intcomma&#039;,&#039;alpha&#039;,&#039;aZ&#039;,&#039;aZ09&#039;,&#039;array&#039;,&#039;san_alpha&#039;,&#039;nohtml&#039;, &#039;alphanohtml&#039;,&#039;custom&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;none&#039; pour pas de vérification du type de paramètre,&lt;br /&gt;
&lt;br /&gt;
&#039;int&#039;= vérifie que c&#039;est un numérique(entier ou nombre à virgule)&lt;br /&gt;
&lt;br /&gt;
&#039;intcomma&#039;=vérifie que c&#039;est un entier avec des virgules (&#039;1,2,3,4...&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;alpha&#039;=vérifie que c&#039;est du texte et des signes&lt;br /&gt;
&lt;br /&gt;
&#039;aZ&#039;=vérifie que c&#039;est a-z seulement&lt;br /&gt;
&lt;br /&gt;
&#039;aZ09&#039;=vérifie que c&#039;est des caractères non spéciaux et des nombres&lt;br /&gt;
&lt;br /&gt;
&#039;array&#039;=vérifie que c&#039;est un tableau&lt;br /&gt;
&lt;br /&gt;
&#039;san_alpha&#039;=chaîne de caractères purgée (ne pas utiliser pour du texte libre)&lt;br /&gt;
&lt;br /&gt;
&#039;nohtml&#039;=verifie qu&#039;il n&#039;y a pas de code html&lt;br /&gt;
&lt;br /&gt;
&#039;alphanohtml&#039;=verifie qu&#039;il n&#039;y a pas de code html&lt;br /&gt;
&lt;br /&gt;
&#039;custom&#039;= défini par les filtres et les options qui suivent avec les paramètres $filter et $options&lt;br /&gt;
&lt;br /&gt;
Pour plus d&#039;information voir commentaires lignes 252 à 269 du fichier htdocs/core/lib/functions.lib.php&lt;/div&gt;</summary>
		<author><name>Unareil</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Fonctions_utiles_D%C3%A9veloppeur_Dolibarr&amp;diff=43859</id>
		<title>Fonctions utiles Développeur Dolibarr</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Fonctions_utiles_D%C3%A9veloppeur_Dolibarr&amp;diff=43859"/>
		<updated>2019-08-19T10:07:16Z</updated>

		<summary type="html">&lt;p&gt;Unareil: Précision des paramètres&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Lorsque j&#039;ai commencé le développement sous Dolibarr, je me suis retrouvé confronter face à tout un tas de fonctions importantes utilisées par dolibarr que je ne connaissais pas.&lt;br /&gt;
&lt;br /&gt;
N&#039;ayant trouvé que le fichier code source en documentation, j&#039;ai décidé de récapituler ces fonctions dans cette page.&lt;br /&gt;
&lt;br /&gt;
==GETPOST==&lt;br /&gt;
GETPOST() : fonction permettant de récupérer le contenu des variables GET ou POST de manière plus sécurisé.&lt;br /&gt;
&lt;br /&gt;
Utilisation possible :&lt;br /&gt;
&lt;br /&gt;
Exemple en php : &amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$monChamp= $_POST[&amp;quot;monChamp&amp;quot;];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;devient si l&#039;élément passé en paramètre est un entier :&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$monChamp= GETPOST(&amp;quot;monChamp&amp;quot;,&#039;int&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Paramètres possibles du deuxième argument :  &#039;none&#039;,&#039;int&#039;,&#039;intcomma&#039;,&#039;alpha&#039;,&#039;aZ&#039;,&#039;aZ09&#039;,&#039;array&#039;,&#039;san_alpha&#039;,&#039;nohtml&#039;, &#039;alphanohtml&#039;,&#039;custom&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;none&#039; pour pas de vérification du type de paramètre,&lt;br /&gt;
&lt;br /&gt;
&#039;int&#039;= vérifie que c&#039;est un numérique(entier ou nombre à virgule)&lt;br /&gt;
&lt;br /&gt;
&#039;intcomma&#039;=vérifie que c&#039;est un entier avec des virgules (&#039;1,2,3,4...&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;alpha&#039;=vérifie que c&#039;est du texte et des signes&lt;br /&gt;
&lt;br /&gt;
&#039;aZ&#039;=vérifie que c&#039;est a-z seulement&lt;br /&gt;
&lt;br /&gt;
&#039;aZ09&#039;=vérifie que c&#039;est des caractères non spéciaux et des nombres&lt;br /&gt;
&lt;br /&gt;
&#039;array&#039;=vérifie que c&#039;est un tableau&lt;br /&gt;
&lt;br /&gt;
&#039;san_alpha&#039;=chaîne de caractères purgée (ne pas utiliser pour du texte libre)&lt;br /&gt;
&lt;br /&gt;
&#039;nohtml&#039;=verifie qu&#039;il n&#039;y a pas de code html&lt;br /&gt;
&lt;br /&gt;
&#039;alphanohtml&#039;=verifie qu&#039;il n&#039;y a pas de code html&lt;br /&gt;
&lt;br /&gt;
&#039;custom&#039;= défini par les filtres et les options qui suivent avec les paramètres $filter et $options&lt;br /&gt;
&lt;br /&gt;
Pour plus d&#039;information voir commentaires lignes 252 à 269 du fichier htdocs/core/lib/functions.lib.php&lt;/div&gt;</summary>
		<author><name>Unareil</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Fonctions_utiles_D%C3%A9veloppeur_Dolibarr&amp;diff=43856</id>
		<title>Fonctions utiles Développeur Dolibarr</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Fonctions_utiles_D%C3%A9veloppeur_Dolibarr&amp;diff=43856"/>
		<updated>2019-08-19T09:36:09Z</updated>

		<summary type="html">&lt;p&gt;Unareil: Mise en forme&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Lorsque j&#039;ai commencé le développement sous Dolibarr, je me suis retrouvé confronter face à tout un tas de fonctions importantes utilisées par dolibarr que je ne connaissais pas.&lt;br /&gt;
&lt;br /&gt;
N&#039;ayant trouvé que le fichier code source en documentation, j&#039;ai décidé de récapituler ces fonctions dans cette page.&lt;br /&gt;
&lt;br /&gt;
== GETPOST ==&lt;br /&gt;
GETPOST() : fonction permettant de récupérer le contenu des variables GET ou POST de manière plus sécurisé.&lt;br /&gt;
&lt;br /&gt;
Utilisation possible :&lt;br /&gt;
&lt;br /&gt;
Exemple en php : &amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$monChamp= $_POST[&amp;quot;monChamp&amp;quot;];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;devient&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$monChamp= GETPOST(&amp;quot;monChamp&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Si nous souhaitons être sûr que l&#039;élément passé en paramètre est un entier, nous pouvons préciser :&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$monChamp= GETPOST(&amp;quot;monChamp&amp;quot;,&#039;int&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Unareil</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Fonctions_utiles_D%C3%A9veloppeur_Dolibarr&amp;diff=43855</id>
		<title>Fonctions utiles Développeur Dolibarr</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Fonctions_utiles_D%C3%A9veloppeur_Dolibarr&amp;diff=43855"/>
		<updated>2019-08-19T09:33:34Z</updated>

		<summary type="html">&lt;p&gt;Unareil: Mise en forme&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Lorsque j&#039;ai commencé le développement sous Dolibarr, je me suis retrouvé confronter face à tout un tas de fonctions importantes utilisées par dolibarr que je ne connaissais pas.&lt;br /&gt;
&lt;br /&gt;
N&#039;ayant trouvé que le fichier code source en documentation, j&#039;ai décidé de récapituler ces fonctions dans cette page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
GETPOST() : fonction permettant de récupérer le contenu des variables GET ou POST de manière plus sécurisé.&lt;br /&gt;
&lt;br /&gt;
Utilisation possible :&lt;br /&gt;
&lt;br /&gt;
Exemple en php : &amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$monChamp= $_POST[&amp;quot;monChamp&amp;quot;];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;devient&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$monChamp= GETPOST(&amp;quot;monChamp&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Si nous souhaitons être sûr que l&#039;élément passé en paramètre est un entier, nous pouvons préciser :&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$monChamp= GETPOST(&amp;quot;monChamp&amp;quot;,&#039;int&#039;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Unareil</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Fonctions_utiles_D%C3%A9veloppeur_Dolibarr&amp;diff=43854</id>
		<title>Fonctions utiles Développeur Dolibarr</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Fonctions_utiles_D%C3%A9veloppeur_Dolibarr&amp;diff=43854"/>
		<updated>2019-08-19T09:23:27Z</updated>

		<summary type="html">&lt;p&gt;Unareil: Ajout de fonctions utiles essentielles pour débuter la programmation sous Dolibarr&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Lorsque j&#039;ai commencé le développement sous Dolibarr, je me suis retrouvé confronter face à tout un tas de fonctions importantes utilisées par dolibarr que je ne connaissais pas.&lt;br /&gt;
&lt;br /&gt;
N&#039;ayant trouvé que le fichier code source en documentation, j&#039;ai décidé de récapituler ces fonctions dans cette page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
GETPOST() : fonction permettant de récupérer le contenu des variables GET ou POST de manière plus sécurisé.&lt;br /&gt;
&lt;br /&gt;
Utilisation possible :&lt;br /&gt;
&lt;br /&gt;
Exemple en php : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&amp;lt;code&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$monChamp= $_POST[&amp;quot;monChamp&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
devient &lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&amp;lt;code&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$monChamp= GETPOST(&amp;quot;monChamp&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si nous souhaitons être sûr que l&#039;élément passé en paramètre est un entier, nous pouvons préciser :&amp;lt;nowiki&amp;gt;&amp;lt;code&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$monChamp= $_POST[&amp;quot;monChamp&amp;quot;,&#039;int&#039;];&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Unareil</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=List_of_modules_id&amp;diff=43401</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=43401"/>
		<updated>2019-08-06T17:14:16Z</updated>

		<summary type="html">&lt;p&gt;Unareil: Ajout de la plage 230000 - 230049 pour l&amp;#039;activité Unareil de l&amp;#039;entreprise la Fortune de la Nature&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Core]]&lt;br /&gt;
{{TemplateDocDevEn}}&lt;br /&gt;
{{TemplateDocDevEs}}&lt;br /&gt;
{{TemplateDocDevFr}}&lt;br /&gt;
&lt;br /&gt;
{{Flag en}}&lt;br /&gt;
 This page list all reserved modules numbers / ID. If you build or want to build your own modules (like this [[:Category:Complementary_modules|complementary module]]), you should take an ID range here. &lt;br /&gt;
&lt;br /&gt;
{{Flag fr}}&lt;br /&gt;
 Cette page recense tous les numéros / ID réservés de modules. Si vous avez réalisé ou voulez réaliser vos propres modules (comme les [[:Category:Modules complémentaires|modules complémentaires suivant]]), vous devriez prendre une plage d&#039;ID ici.&lt;br /&gt;
&lt;br /&gt;
{{Flag sp}}&lt;br /&gt;
 Esta página contiene un listado de todos los id reservados para los módulos. Si ha creado o quiere realizar sus propios módulos, (como estos [[:Category:Módulos_complementarios|módulos complementarios]]), deberá reservarse un rango de ID aquí.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=ID 0 - 99999=&lt;br /&gt;
{{Flag en}}&lt;br /&gt;
 Reserved for Dolibarr&#039;s internal modules.&lt;br /&gt;
&lt;br /&gt;
{{Flag fr}}&lt;br /&gt;
 Réservé aux modules internes de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
{{Flag sp}}&lt;br /&gt;
 Reservado a los módulos internos de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
=ID 100000 - 499999=&lt;br /&gt;
{{Flag en}}&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)&lt;br /&gt;
&lt;br /&gt;
{{Flag fr}}&lt;br /&gt;
 Zone réservé aux éditeurs qui ont besoin d&#039;une plage d&#039;ID spécifiques. Vous pouvez modifier cette page pour réserver votre plage (limité à 50 valeurs la première fois)&lt;br /&gt;
&lt;br /&gt;
{{Flag sp}}&lt;br /&gt;
 Área reservada para los partners que necesiten un rango de ID. Puede modificar esta página para reservar su rango (limitado a 50 valores por editor)&lt;br /&gt;
&lt;br /&gt;
[File:Warning]: 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)&lt;br /&gt;
*ID 101000 - 101999: NLTechno (https://www.nltechno.com)&lt;br /&gt;
*ID 102000 - 102999: Tiaris (http://www.tiaris.fr)&lt;br /&gt;
*ID 103000 - 103999: Open-concept.pro (http://www.open-concept.pro)&lt;br /&gt;
*ID 104000 - 104999: ATM Consulting (http://www.atm-consulting.fr)&lt;br /&gt;
*ID 105000 - 105999: GPC.solutions&lt;br /&gt;
*ID 106000 - 106999: PHPASSO&lt;br /&gt;
*ID 107000 - 107999: TecLib (http://www.teclib.com) / Auguria (http://www.auguria.net)&lt;br /&gt;
*ID 108000 - 108999: ETHICWEB&lt;br /&gt;
*ID 109000 - 109999: Aplose (http://www.aplose.fr)&lt;br /&gt;
*ID 110000 - 110999: Librethic (https://librethic.io)&lt;br /&gt;
*ID 111000 - 111999: Asset IT (www.assetit.ch)&lt;br /&gt;
*ID 112000 - 112999: Aarboard AG (www.aarboard.ch)&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)&lt;br /&gt;
*ID 121000 - 121999: Oscss - Shop&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: backbone internet service (www.backbone.co.at)&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)&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)&lt;br /&gt;
*ID 131000 - 131999: Joan Louis (itaca.fr)&lt;br /&gt;
*ID 132000 - 132999: Jean-Marie Arsac (https://azimut.fr)&lt;br /&gt;
*ID 133000 - 133999: Oriel Systems Ltd, UK. (www.orielsystems.com)&lt;br /&gt;
*ID 135000 - 135999: Net-Logic (http://netlogic.fr)&lt;br /&gt;
*ID 140000 - 140999: Altairis&lt;br /&gt;
*ID 150000 - 150999: Jeffinfo&lt;br /&gt;
*ID 160000 - 160999: Charles-François BENKE (http://www.patas-monkey.com)&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 170000 - 170999: TRIDENT CONSULTING LTD (www.tridentdxb.com)&lt;br /&gt;
*ID 171000 - 171999: LVSInformatique (www.lvsinformatique.com)&lt;br /&gt;
*ID 180000 - 180999: Triangle Ingénierie&lt;br /&gt;
*ID 190000 - 190999: Diciannove (http://19.coop)&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 230000 - 230049:  Unareil - La Fortune de la Nature (https://www.unareil.eu)&lt;br /&gt;
*ID 274250 - 274299: Nerv Project (www.nerv-project.eu)&lt;br /&gt;
*ID 300000 - 300999: AtooNet (http://www.atoo-net.com)&lt;br /&gt;
*ID 320000 - 320999: Novus Studios (www.novusstudios.it)&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 Free...&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 (http://www.sergibyte.com)&lt;br /&gt;
*ID 404000 - 404999: Aikhan&lt;br /&gt;
*ID 405000 - 405999: AIME (http://www.aime.mx)&lt;br /&gt;
*ID 409000 - 409999: LliureTIC (www.lliuretic.cat)&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 422200 - 422999: Artaban (http://artaban.fr)&lt;br /&gt;
*ID 423000 - 423050: cyberesprit&lt;br /&gt;
*ID 423051 - 423099: R.Bossard&lt;br /&gt;
*ID 423100 - 423199: Joliciel (www.joliciel.fr)&lt;br /&gt;
*ID 424000 - 424499: A3sys - Mon-Dolibarr (http://www.mon-dolibarr.fr) by Philazerty&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 - 427000: Bruno Caldas (https://github.com/BCaldas)&lt;br /&gt;
*ID 427001 - 427999: Kevin GUERRIER (alias xcl.saian)&lt;br /&gt;
*ID 428000 - 428099: af83&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 436000 - 436099: SOWEBIO (www.soweb.io)&lt;br /&gt;
*ID 436100 - 436199: CAP-REL (www.cap-rel.fr)&lt;br /&gt;
*ID 436200 Free (take ranges of 50 only please)&lt;br /&gt;
*ID 436400 - 437399: Mohamed AHERDANE - Morocco - IT Consultant ( www.wave.ma )&lt;br /&gt;
*ID 437400 Free (take ranges of 50 only please)&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 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 (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 - 460050: torvista - Spain&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 - 468140 Free (take ranges of 20 only please)&lt;br /&gt;
*ID 468150 - 468199 Free (take ranges of 50 only please)&lt;br /&gt;
*ID 468200 - 468250: Paulo Oliveira - Brasil (paulorcdo@gmail.com)&lt;br /&gt;
*ID 468251 - 468270:  CD-Systems - France (https://www.cd-systems.fr)&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
=ID &amp;gt; 500000=&lt;br /&gt;
&lt;br /&gt;
{{Flag en}}&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 (1000 ids maximum per partner).&lt;br /&gt;
&lt;br /&gt;
{{Flag fr}}&lt;br /&gt;
 Si vous n&#039;avez pas de numéros réservés et en avez besoin, n&#039;utilisez pas de chiffres au hasard et utilisez une valeur supérieure à 500000, toutefois, il est préférable d&#039;obtenir un compte wiki, et  réserver vous-même votre plage en ajoutant votre entrée dans la zone 100000 - 499999 (pas plus de 1000 numéros par partenaire).&lt;br /&gt;
&lt;br /&gt;
{{Flag sp}}&lt;br /&gt;
 Si no dispone de número reservado y necesita, no use cifras redondeadas y usa un valor superior a 500000. Si tiene una cuenta wiki, puede reservarse usted mismo sus id añadiendo su entrada en la zona 100000 - 499999 (no más de 1000 id por partner).&lt;/div&gt;</summary>
		<author><name>Unareil</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Configuration_module_facture&amp;diff=39686</id>
		<title>Configuration module facture</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Configuration_module_facture&amp;diff=39686"/>
		<updated>2018-09-11T08:24:49Z</updated>

		<summary type="html">&lt;p&gt;Unareil: /* Module de numérotation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Facture]]&lt;br /&gt;
{{TemplateDocUtil}}&lt;br /&gt;
&lt;br /&gt;
Cette page décrit les options de configuration du [[Module Factures Clients]] (Menu &#039;&#039;&#039;Accueil - Configuration - Modules - Factures&#039;&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Module de numérotation=&lt;br /&gt;
Chaque entreprise numérotant ses factures selon ses règles, Dolibarr propose plusieurs modèle de génération de numéro. Un seul modèle à la fois peut être utilisé à ce jour. Le modèle par défaut ne nécessite aucune configuration particulière et conviendra si vous n&#039;avez aucune exigence particulière sur la manière de fabrication ces références.&lt;br /&gt;
&lt;br /&gt;
Il existe aussi un modèle qui vous permet de spécifier la règle de fabrication du numéro par un masque. Placer la souris sur le picto d&#039;aide afin de voir apparaitre la syntaxe pour définir un tel masque.&lt;br /&gt;
&lt;br /&gt;
Note: Si aucun modèle préexistant ne vous convient (y compris le modèle avancé par configuration du masque), vous avez tout loisir de vous adresser à un développeur pour créer un modèle spécifique à votre besoin.&lt;br /&gt;
&lt;br /&gt;
=Modèles de document=&lt;br /&gt;
De même que pour la numérotation, vous pouvez utiliser différents modèles de génération de document (PDF ou ODT). Il vous faut activer les modèles que vous voulez pouvoir utiliser (Vous pourrez alors les utiliser sur la fiche facture, dans le tableau &amp;quot;Documents&amp;quot; en sélectionnant le modèle et en cliquant sur &amp;quot;Générer&amp;quot; pour régénérer la facture avec un modèle de document particulier).&lt;br /&gt;
&lt;br /&gt;
Le modèle fournit par défaut est le modèle &amp;quot;crabe&amp;quot;, qui est un modèle PDF remplissant les obligations légales de la plupart des pays du monde.&lt;br /&gt;
&lt;br /&gt;
=Mode de paiement suggéré par défaut=&lt;br /&gt;
Vous pouvez définir dans cette zone, le ou les modes de paiement avec les coordonnées que vous voulez voir apparaitre sur les documents générés.&lt;br /&gt;
&lt;br /&gt;
=Mentions complémentaires=&lt;br /&gt;
Si vous voulez ajouter une mention légale complémentaire en pied de page sur les factures, saisissez cette mention dans la rubirque &amp;quot;Mention complémentaire&amp;quot; puis enregistrez. Chaque nouvelle facture aura alors la mention apparente dans le pied de page des factures.&lt;br /&gt;
&lt;br /&gt;
Remarque: Si vous modifiez cette information, pensez à cliquer sur &amp;quot;Regénérer&amp;quot; la facture sur la fiche facture pour refabriquer le document afin de prendre en compte la modification.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Autres options=&lt;br /&gt;
==Date des factures==&lt;br /&gt;
Si cette option est activée la date des factures est définie automatiquement lors de la validation, sans cette option vous êtes libre de définir la date de la facture.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Notes =&lt;br /&gt;
Note: Les règles de calculs de la TVA ne sont pas une option du module Facture. Vous trouverez des informations sur cette page: [[Règles de calcul et arrondi de TVA]]&lt;/div&gt;</summary>
		<author><name>Unareil</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Module_Projets&amp;diff=39681</id>
		<title>Module Projets</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Module_Projets&amp;diff=39681"/>
		<updated>2018-09-10T12:29:12Z</updated>

		<summary type="html">&lt;p&gt;Unareil: /* Permissions traduction en français du png et de l&amp;#039;odg*/&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Projet]]&lt;br /&gt;
{{TemplateDocUtil}}&lt;br /&gt;
{{TemplateModFR}}&lt;br /&gt;
{{BasculeDevUser|&lt;br /&gt;
nom=Projet|&lt;br /&gt;
num=400|&lt;br /&gt;
devdoc=[[Module Projets (développeur)]]|&lt;br /&gt;
userdoc=Cette page|}}&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
Les projets permettent de définir des listes de taches. Ils regroupent aussi des éléments de dolibarr ensemble comme des [[Module Propositions commerciales|propositions commerciales]], des [[Module Commandes Clients|commandes]] ou des [[Module Factures Clients|factures]].&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;
= Définitions =&lt;br /&gt;
Avant d&#039;aller plus loin sur l&#039;utilisation du module Projet, il est important de se familiariser avec les termes de&lt;br /&gt;
Evènements / Taches / Journaux.&lt;br /&gt;
Ces notions souvent confondues ont des vocations différentes, aussi il est important de se familiariser avec ces termes admis dans la plupart des ERP. Pour cela, une définition est donnée sur la page [[EvenementTacheJournal]]&lt;br /&gt;
&lt;br /&gt;
= Workflow =&lt;br /&gt;
&lt;br /&gt;
== Permissions ==&lt;br /&gt;
Voir le fichier [[File:Project.odg]] qui décrit les conditions pour pouvoir réaliser les différentes actions du module ou sa traduction [[File:ProjetPermissions.odg]].&lt;br /&gt;
&lt;br /&gt;
[[File:ProjetPermissions.png|200px]]&lt;br /&gt;
&lt;br /&gt;
== Créer un projet ==&lt;br /&gt;
La création d&#039;un nouveau projet se fait depuis le menu &amp;quot;Nouveau projet&amp;quot; visible dans le menu principal &amp;quot;Projet&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Un projet peut être privé ou public. Les projets publics (et leurs taches) peuvent être lu/éditer par toute personne qui a les permissions Projet. Les projets privés (et leurs taches) peuvent être lus/édités uniquement par les utilisateurs qui ont les permissions Projet et qui en plus sont définis comme contact du projet, ainsi que par le créateur du projet (Si tous les contacts du projet sont retirés, il faut conserver au moins un utilisateur apte à éditer le projet, ne serait-ce que pour ajouter des contacts. C&#039;est le créateur).&lt;br /&gt;
&lt;br /&gt;
== Créer une tache ==&lt;br /&gt;
La création d&#039;une tache se fait via le bouton &amp;quot;Créer Tache&amp;quot; depuis l&#039;onglet &amp;quot;Taches&amp;quot; d&#039;un projet&lt;br /&gt;
ou bien depuis le menu Projets -&amp;gt; Nouvelle tache.&lt;br /&gt;
* On ne peut créer une tache que sur un projet partagé (sans responsable attitré) ou sur un projet dont on est le responsable.&lt;br /&gt;
* Une tache peut être crée sous le projet ou sous une autre tâche du projet.&lt;br /&gt;
&lt;br /&gt;
== Supprimer un projet ==&lt;br /&gt;
{{ToComplete}}&lt;br /&gt;
&lt;br /&gt;
== Supprimer une tache ==&lt;br /&gt;
{{ToComplete}}&lt;br /&gt;
&lt;br /&gt;
== Saisir une activité ==&lt;br /&gt;
Les activités sont le temps passé à travailler sur une tâche.&lt;br /&gt;
&lt;br /&gt;
= Exemples de cas d&#039;utilisation =&lt;br /&gt;
{{ToComplete}}&lt;br /&gt;
{{ExamplesCaseFr&lt;br /&gt;
|nom=UCMP01: &lt;br /&gt;
|situation=&lt;br /&gt;
|actions=&lt;br /&gt;
}}&amp;amp;nbsp;&lt;/div&gt;</summary>
		<author><name>Unareil</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=File:ProjetPermissions.odg&amp;diff=39680</id>
		<title>File:ProjetPermissions.odg</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=File:ProjetPermissions.odg&amp;diff=39680"/>
		<updated>2018-09-10T12:24:08Z</updated>

		<summary type="html">&lt;p&gt;Unareil: Même fichier que celui produit par Eldy mais traduit en français&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Même fichier que celui produit par Eldy mais traduit en français&lt;/div&gt;</summary>
		<author><name>Unareil</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=File:ProjetPermissions.png&amp;diff=39679</id>
		<title>File:ProjetPermissions.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=File:ProjetPermissions.png&amp;diff=39679"/>
		<updated>2018-09-10T12:22:43Z</updated>

		<summary type="html">&lt;p&gt;Unareil: Même support que celui fait par eldy mais traduit en français&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Même support que celui fait par eldy mais traduit en français&lt;/div&gt;</summary>
		<author><name>Unareil</name></author>
	</entry>
</feed>