<?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=Eldy</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=Eldy"/>
	<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php/Special:Contributions/Eldy"/>
	<updated>2026-10-22T00:25:10Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.17</generator>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=MediaWiki:Common.css&amp;diff=68404</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=MediaWiki:Common.css&amp;diff=68404"/>
		<updated>2026-10-21T20:46:10Z</updated>

		<summary type="html">&lt;p&gt;Eldy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
&lt;br /&gt;
:root {&lt;br /&gt;
	--pictocolor: rgb(85, 165, 155);	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* We disable the talk tab */&lt;br /&gt;
body:not(.mw-editable) #ca-talk {&lt;br /&gt;
	display:none;&lt;br /&gt;
}&lt;br /&gt;
/* We disable the tab &amp;quot;Page&amp;quot; */&lt;br /&gt;
li#ca-nstab-main, li#ca-nstab-mediawiki {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
#ca-talk, #ca-nstab-user_talk {&lt;br /&gt;
    display: none !important;&lt;br /&gt;
}&lt;br /&gt;
/* we disabe a link w already have into Info on page */&lt;br /&gt;
li#t-whatlinkshere, li#t-recentchangeslinked {&lt;br /&gt;
	display: none !important;&lt;br /&gt;
}&lt;br /&gt;
/* we disable also search entries not used */&lt;br /&gt;
div.oo-ui-labelElement:has(#mw-search-ns1),&lt;br /&gt;
div.oo-ui-labelElement:has(#mw-search-ns2),&lt;br /&gt;
div.oo-ui-labelElement:has(#mw-search-ns3),&lt;br /&gt;
div.oo-ui-labelElement:has(#mw-search-ns4),&lt;br /&gt;
div.oo-ui-labelElement:has(#mw-search-ns5),&lt;br /&gt;
div.oo-ui-labelElement:has(#mw-search-ns7),&lt;br /&gt;
div.oo-ui-labelElement:has(#mw-search-ns9),&lt;br /&gt;
div.oo-ui-labelElement:has(#mw-search-ns11),&lt;br /&gt;
div.oo-ui-labelElement:has(#mw-search-ns12),&lt;br /&gt;
div.oo-ui-labelElement:has(#mw-search-ns13),&lt;br /&gt;
div.oo-ui-labelElement:has(#mw-search-ns15),&lt;br /&gt;
div.oo-ui-labelElement:has(#mw-search-ns16),&lt;br /&gt;
div.oo-ui-labelElement:has(#mw-search-ns101) {&lt;br /&gt;
	display:none;&lt;br /&gt;
}&lt;br /&gt;
/*&lt;br /&gt;
input#mw-search-ns1, label[for=&amp;quot;mw-search-ns1&amp;quot;], input#mw-search-ns3, label[for=&amp;quot;mw-search-ns3&amp;quot;], input#mw-search-ns5, label[for=&amp;quot;mw-search-ns5&amp;quot;], input#mw-search-ns7, label[for=&amp;quot;mw-search-ns7&amp;quot;],&lt;br /&gt;
input#mw-search-ns9, label[for=&amp;quot;mw-search-ns9&amp;quot;], input#mw-search-ns11, label[for=&amp;quot;mw-search-ns11&amp;quot;], input#mw-search-ns13, label[for=&amp;quot;mw-search-ns13&amp;quot;], input#mw-search-ns15, label[for=&amp;quot;mw-search-ns15&amp;quot;],&lt;br /&gt;
input#mw-search-ns4, label[for=&amp;quot;mw-search-ns4&amp;quot;], input#mw-search-ns12, label[for=&amp;quot;mw-search-ns12&amp;quot;] {&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#pt-anonuserpage, #pt-userpage a {&lt;br /&gt;
    background-image: url(/skins/Vector/images/user-avatar.png?494);&lt;br /&gt;
/*    background-image: linear-gradient(transparent,transparent),url(data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%2220%22 height=%2220%22 viewBox=%220 0 20 20%22%3E %3Cg fill=%22%2384898d%22%3E %3Cpath d=%22M10 11c-5.92 0-8 3-8 5v3h16v-3c0-2-2.08-5-8-5z%22/%3E %3Ccircle cx=%2210%22 cy=%225.5%22 r=%224.5%22/%3E %3C/g%3E %3C/svg%3E); */&lt;br /&gt;
}&lt;br /&gt;
#simpleSearch #searchButton {&lt;br /&gt;
    background-image: url(/skins/Vector/images/search-ltr.png?39f97);&lt;br /&gt;
/*    background-image: linear-gradient(transparent,transparent),url(data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%2212%22 height=%2213%22%3E %3Cg fill=%22none%22 stroke=%22%2394595d%22 stroke-width=%222%22%3E %3Cpath d=%22M11.29 11.71l-4-4%22/%3E %3Ccircle cx=%225%22 cy=%225%22 r=%224%22/%3E %3C/g%3E %3C/svg%3E); */&lt;br /&gt;
}    &lt;br /&gt;
&lt;br /&gt;
/* Hide the wheel on language */&lt;br /&gt;
#p-lang button.uls-settings-trigger.webfonts-changed {&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
label.toctogglelabel {&lt;br /&gt;
    outline: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.toctogglelabel:focus {&lt;br /&gt;
	outline: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-menu-tabs, .vector-menu-tabs a, #mw-head .vector-menu-dropdown h3 {&lt;br /&gt;
	background-image: unset !important;	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#right-navigation ul.vector-menu-content-list a { background: #263c5c !important; }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*.ca-watch */&lt;br /&gt;
#ca-view a, #ca-ve-edit a, #ca-edit a, #ca-history a, #ca-nstab-mediawiki:not(.selected) a, #ca-nstab-main:not(.selected) a {&lt;br /&gt;
	color: #fff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
/*div#mw-head {&lt;br /&gt;
    top: 0;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    z-index: 100;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
}&lt;br /&gt;
a.mw-wiki-logo {&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 0;&lt;br /&gt;
    z-index: 200;&lt;br /&gt;
}*/&lt;br /&gt;
&lt;br /&gt;
.mw-body-content h1 {&lt;br /&gt;
    clear: both;&lt;br /&gt;
}&lt;br /&gt;
.mw-body-content h2 {&lt;br /&gt;
    clear: both;&lt;br /&gt;
}&lt;br /&gt;
.mw-body-content h4 {&lt;br /&gt;
	font-size: 1.1em;&lt;br /&gt;
}&lt;br /&gt;
.mw-body-content h5, .mw-body-content h6 {&lt;br /&gt;
	font-size: 0.9em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media screen and (min-width: 982px) {&lt;br /&gt;
	.mw-body {&lt;br /&gt;
		padding-left: 3em;&lt;br /&gt;
		padding-right: 2.5em;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table.welcometext {&lt;br /&gt;
    position: relative;&lt;br /&gt;
    top: -30px;&lt;br /&gt;
}&lt;br /&gt;
.tdwelcometext {&lt;br /&gt;
	padding: 0 15px; &lt;br /&gt;
	color: #fff; &lt;br /&gt;
	background-color:rgba(70, 3, 62, 0.3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#mw-indicator-mw-helplink {&lt;br /&gt;
	display: none;	&lt;br /&gt;
}&lt;br /&gt;
#mw-panel {&lt;br /&gt;
	padding-left: unset;	&lt;br /&gt;
}&lt;br /&gt;
#mw-panel #p-logo + .portal {&lt;br /&gt;
    margin-top: 1.5em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
span.h2fa {&lt;br /&gt;
    background-color: var(--pictocolor);&lt;br /&gt;
    padding: 12px;&lt;br /&gt;
    margin-right: 5px;&lt;br /&gt;
    border-radius: 50px;&lt;br /&gt;
    color: #fff;&lt;br /&gt;
    text-shadow: none;&lt;br /&gt;
    box-shadow: 1px 1px 5px #ccc;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ul.gallery.mw-gallery-traditional {&lt;br /&gt;
    clear: both;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#content.mw-body {&lt;br /&gt;
	padding-top: 2.55em;&lt;br /&gt;
	border: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#p-views ul li.selected span a {&lt;br /&gt;
    color: #fff !important;&lt;br /&gt;
    text-decoration: underline;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*div#contentSub {&lt;br /&gt;
	display: none;&lt;br /&gt;
}*/&lt;br /&gt;
&lt;br /&gt;
/* Change to have banner dolibarr blue */&lt;br /&gt;
#mw-head-base {&lt;br /&gt;
	    height: 4em;&lt;br /&gt;
}&lt;br /&gt;
#mw-head {&lt;br /&gt;
    background: #263c5c;&lt;br /&gt;
    height: 4em;&lt;br /&gt;
}&lt;br /&gt;
#left-navigation {&lt;br /&gt;
	margin-top: 1.5em;&lt;br /&gt;
}&lt;br /&gt;
#right-navigation {&lt;br /&gt;
	margin-top: 1.5em;&lt;br /&gt;
}&lt;br /&gt;
h3#p-cactions-label span {&lt;br /&gt;
    color: #fff;&lt;br /&gt;
}&lt;br /&gt;
li.selected span a {&lt;br /&gt;
    color: #000 !important;&lt;br /&gt;
}&lt;br /&gt;
ul.menu li a {&lt;br /&gt;
    color: #000 !important;&lt;br /&gt;
}&lt;br /&gt;
div#mw-head li:not(#ca-nstab-main):not(#ca-nstab-mediawiki):not(#ca-nstab-special):not(.selected) a:not(.selected) {&lt;br /&gt;
    color: #fff;&lt;br /&gt;
}&lt;br /&gt;
.vectorTabs span, #mw-head .vectorMenu h3 {&lt;br /&gt;
	background-image: none;&lt;br /&gt;
}&lt;br /&gt;
pt-anonuserpage, #pt-userpage a {&lt;br /&gt;
	background-size: unset;&lt;br /&gt;
    padding-left: 26px !important;&lt;br /&gt;
}&lt;br /&gt;
    &lt;br /&gt;
/* To force some TOC to be on 1 line */&lt;br /&gt;
@media (max-width: 767px) {&lt;br /&gt;
	.tocinline ul li {&lt;br /&gt;
	    display: inline-block;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
@media (min-width: 768px) {&lt;br /&gt;
	.tocinline ul {&lt;br /&gt;
		columns: 2 !important;	&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
@media (min-width: 1024px) {&lt;br /&gt;
	.tocinline ul {&lt;br /&gt;
		columns: 3 !important;	&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
@media (min-width: 1300px) {&lt;br /&gt;
	.tocinline ul {&lt;br /&gt;
		columns: 4 !important;	&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
@media (min-width: 1700px) {&lt;br /&gt;
	.tocinline ul {&lt;br /&gt;
		columns: 5 !important;	&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
.tocinline .toc {&lt;br /&gt;
	display: inline-block !important;&lt;br /&gt;
}&lt;br /&gt;
div#toc {&lt;br /&gt;
    margin-top: 20px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.catlinks {&lt;br /&gt;
	margin-top: 3em;&lt;br /&gt;
	border: none;&lt;br /&gt;
    background: none;&lt;br /&gt;
    font-size: 0.9em;&lt;br /&gt;
}&lt;br /&gt;
.catlinks li a {&lt;br /&gt;
	background-color: #aaa;&lt;br /&gt;
	color: #fff;&lt;br /&gt;
	padding: 5px;&lt;br /&gt;
	border-radius: 5px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#simpleSearch {&lt;br /&gt;
	background-image: none;&lt;br /&gt;
	height: unset;&lt;br /&gt;
	border-radius: 5px;&lt;br /&gt;
	/* padding: 2px; */&lt;br /&gt;
	background-color: #fff !important;	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* The insertInterlangLinks tool should be displayed only in source mode */&lt;br /&gt;
.ve-init-target-visual .oo-ui-tool-name-insertInterlangLinks {&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-search-result-data {&lt;br /&gt;
    color: #888888;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
a.feedlink {&lt;br /&gt;
	background-image: none;&lt;br /&gt;
	padding-left: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.opacitymedium {&lt;br /&gt;
	opacity: 0.5;	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
.vectorTabs li.new a, .vectorTabs li.new a:visited, a.new {&lt;br /&gt;
    color: #a58838;&lt;br /&gt;
}&lt;br /&gt;
*/&lt;br /&gt;
a, a:visited, .vector-menu-portal .vector-menu-content li a:visited, .vector-menu-portal .vector-menu-content li a {&lt;br /&gt;
	color: #048;&lt;br /&gt;
}&lt;br /&gt;
a.external, a.external:visited {&lt;br /&gt;
	color: #048 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.mw-changeslist-legend {&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ul.vector-menu-content-list li#n-Facebook, ul.vector-menu-content-list li#n-LinkedIn, ul.vector-menu-content-list li#n-Twitter, ul.vector-menu-content-list li#n-Youtube {&lt;br /&gt;
    filter: saturate(0.1);&lt;br /&gt;
    opacity: 0.3;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Using logos for social networks links instead of plain text */&lt;br /&gt;
#p-Social_networks .body {&lt;br /&gt;
	text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#p-Social_networks li, nav[aria-labelledby=&amp;quot;p-Social networks-label&amp;quot;] li {&lt;br /&gt;
	display: inline-block;&lt;br /&gt;
	width: 24px;&lt;br /&gt;
	height: 24px;&lt;br /&gt;
	margin: 0 5px !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#p-Social_networks a, nav[aria-labelledby=&amp;quot;p-Social networks-label&amp;quot;] a {&lt;br /&gt;
	direction: ltr;&lt;br /&gt;
	text-indent: -9999px;&lt;br /&gt;
	width: 24px;&lt;br /&gt;
	height: 24px;&lt;br /&gt;
	display: inline-block;&lt;br /&gt;
	background-repeat: no-repeat;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#n-Facebook a {&lt;br /&gt;
	background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAApElEQVRIx2O0ipz+n4GGgImWhg8PC1iIVcjHzcGQE2PBYG0oz8DLw87AxMjIwMDAwGATPZM6FpQm2zI4mivRLogs9GVpG0Qc7Ail0SWrGB49f89ATPom2gJGaJgzMDAwPHz+nmgfMBLKaEeWpuOU+/7jN4Nr8jy8FlCUTD98/kFQDUUWfCTCAoJBBAPIQUUo7VPNB6MWjFpAHwuIzgeD1gdD3wIA0CskwBBfwqYAAAAASUVORK5CYII=);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#n-LinkedIn a {&lt;br /&gt;
	background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAA7EAAAOxAGVKw4bAAABFUlEQVRIx2NkKN/6n4GGgImWhg+cBTmW8gyH0s0ZcizlKbaABV1AQ5SbYYKvJgMTIyODlbwgw547bxhuvP5KPR/8+fcfL59iH9x5+40hafVlhhBdCYY1l18w3Hn7jSILGGmdTFmwCf5r94SzmSq3Y4gJNe5maHJVZQjRlWQQ4mJluPT8M0Pd7lsMO269wTCLrGS6I8mUIcdKgUGCl52BjZmJwUSGn2FTnDGDg5IQdSwwkxVg+Pf/P8Off/8QQcHMxFDlqEwdC3bdfs0g0bKXQahxD8O6Ky8QFssIUMeCrA1XGd58+83w5ddfhqIt1+HiPOzM1LHg3rvvcPajjz8QhjEyUscCUsCoBQNvAc3LoqEfREPfAgDdrVLViTsGJwAAAABJRU5ErkJggg==);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#n-Twitter a {&lt;br /&gt;
	background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAByUlEQVRIx+2Vz0tUURTHP/e9d+c9e9PgD8QhKpyEGAzcSBCDuKhdi8xFtIhAApEW/QOtcm9QQksXRRtx6VorhoJslQpRNOWiQMVAXzk/3q/bOue+8TVguOgsz7n3fODLOecrzjzdUxxhGEfZ/D/gXwBEe4C+jtYfL/WZLF49QeWWy4sxl7F+i15HcHNApgPMlBymBqW2ebHT4NmVDoZ6TCxDcC5n8GjEoTzuYlvQ64jDAd224P6ww+MRhy77zw+3z0ts80ATIZAGlPImO3V1OODtVgTA9YKkPO4yfdGmlDfJSuhJkG+rprj7qs7BrbV0j5e/h1w+bVLImZyUgoliholiBqUUSWvv+fqaFjA5mKGQM5vyQojEufnixdq8VqIn6z5h/Hcn6s1mlB6wsh0x9bLGVy8iTewHisWNID0AIO8aWpl0MffBZ8/X1xIBzz8FzK42aEStpVr9ETG75ifWW56Kh+997pXr/Az0kI+7EXeWawRxco+mKcpKuNYvOZsVjJ6yuNDdLFOsFAuVgAfvGlTD1vI1AX4FsPQt5MaApBoqdhuKXAaqIWx4Ma83I+Y/B1S8mDQh0lmmANpz1pTnun3bPu6GcwwAvwExXIo+zrNKOwAAAABJRU5ErkJggg==);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#n-Youtube a {&lt;br /&gt;
	background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAALy3pUWHRSYXcgcHJvZmlsZSB0eXBlIGV4aWYAAHja5Zhrdtw6DoT/cxWzBBIk+FgOn+fcHczy5wO73XHsJDfO3D9zxrJbslqiSFShUJDb//7ruH/xE3OtLmmpueXs+UktNekcVP/4afcz+HQ/H/+8fRe+P+9eXwinIvv4+Lf05/Wd8/rthtc44/vzrj6/kfoc6PnF24DRniwcrPeT5Lw8zof0HKjtx0Futbyf6pDHfj4vvFN5/sVyh34NYv+79ydSIUpLuSqK7Biiv5/1MYP4+OucCfezcF2ImeMUk7u78pwJAflueW97798H6Lsgvx25j9F/HX0IvvTn+fghlvkZIw5++EXQHwf/hvjdg+NrRvLhC3nD53OQz1n1nP1YXU+ZiOYno7x7i47dw4WDkMd7W2Yr/CnH5W6NrfruJ+AsP/1gm6EFAZXjQgor9HDCvvsZJlNMsgVMRGRKvOcqGDWZ0XBKtoUjJba4YgXLKdvFyGl5zSXc57b7vAnrl1+BSyUwWOCWn27uV19+ZXPnTAtR8PUVK+YlxlymYcjZJ1cBSDhP3PQG+G17wu/f8QeqgqDeMFcW2P14DDE0fONWvDhHrlP2j6wIrqznAISIZyuTIQVS8DlEDTn4IlJCII4VgDozl5hkgEBQlcUkJcWYxRWpYs/mnhLutaKSxU6jTQChZFMBmxY7YKWk8KekCoe6Rk2qmrVoddq055hT1pxzySZyvcSSipZcSqmllV5jTVVrrqXW2mpv0iIaqC230mprrXdxnQd1xupc3zkzZMSRho48yqijjT6hz0xTZ55l1tlmX7LiQiZWXmXV1VbfwW2UYqetO++y6267H7h24klHTz7l1NNOf6H2RPXT9gXUwhM1uUjZdeWFGmddKW9DBJMTNcxATFIA8WIIQGgxzHwNKYkhZ5j5JiSFCpNUw8atYIgBYdpB9IQXdt+Q+y3cnNbfwk3+Djln0P0TyDmg+4zbD1BbVufmReyRhRZTH8m+E2uX6rqMGePR5PmP31A1JLW68rW9++oN/2MDaTxNxga22EKSCLE79VYlzfy8fN4AdvMIP967v7vgd/evgdY+e8oAaBzHbv7sXM6U3qBFa1QNFDFnKCQD39G4rO/RRziaDxTpTs+hZh3Spk+oOUuDisEcwoixnTIwYqtI6kdnIf9Oy2tz4VnznDsQBNY2XCp55ryg07rRqCv90ercn4Rl9H38YOVUPFbU9yzHHfSi75Q7STh1ldPxTYv55zAyq2KtNc3eZ9rphIUd674vgqWzKyrgc1ZF2x3pHOfJo0cqNqm1Ej6h9E5g4ticCroMgFqLhiZL9paRicAVqRhk+NgQMrftQbP13ctsetSCThrLnvNgwJZuhKudSCwj6tFXCWcPX5b0WphAIp8nz4aQEs/m9tKxDSvltXpuA/zCRNMjWUzOL27WiqSYawBH1lXPkoaUtUIlC+JwODWXPe6wvl8eMfOzdJzYUbm2NABzrr0kZarNL0rkUyv8a+8+nvjTves7UydwCSwdvuqsl51LFLnd4m+gDzLHHnTJSuJZp5QT/AnobiRGSB8zKpftMZ8eiLisuSbKu+vyjfBg6KkC2tIpEtelkA2N1Pc7+DyD7DrLHcubqVpaX0F3TR1jmPaexwxB3Z34g6pHl8vZS5nBaFJsbhPShOULCVKSG4E6Z/zUWoaHnpvlxZV3rpc/gaXbXherlMBMcleQzLsetfkXTiw9jtHJubYw/dCXUQcpKxTQMI+QzeQedGFlkH9O8sIGrWU3tGBUoUTE3XdLTmNteZwRt56NwXyqRywDkaMFUqpaISeGrZ4rUAyNBfmrS1ukEqbmR8qDGVEJr0DAHJMjZfUIBULk5waU0V960H9BAvdF1vyULO5rbOmRFLNRj/pT06cZxUVKt4qFgAoV+f9uwGz/bTIKLpwT98lqZ8qMF0+8pE8Lo5XHIp1mOuhR3gguVcTXTuUoatpAwvsEM2iBOe6hzcygcYx89gaUdIdz9dT7xIKkVaxBn/nQNk6TONxGSJ0Oq9Y0UBkEYStsUMsEgKbz2LiEnSGnQ5gKDoJOgdoxYzDp92OB8aq7SB/zsYxi6ZGoNDgUbp/jNJMLItBDQXlcommZ1tLGvXfBhq10BhRAepAj3R51HZip2TbyUc2VKxSbRXL3R/A0aSWt21WN6WSRR/xt+9MCiY8CY+hMUJDsIuHMaRmjcx3DfQM9n+MWTRN30nwmkHnSppAOvToKhA06Voo7fH4e1YOWeuL6tBJqCgWpchnTMVkHhuHcUlvJSWq7VB6VcuXWEPCLdHS+jBbIzEUrh+8LC27ugvJYpOsl7jYk1q7doOz0awXPmWkty8KN+J0qPrEnS92JPI9398ND7obVlJvEyqSmtaxI09+6ujZm3Gi+U4lrRPDADXZoSrCsU7s+vd05jE1JuCUVv6GCKpn77fje7DJn4e5WK64RiS1pkRe0XZQyAxevgZOGQP0ONixfr9SM0vMZNVKo/CoujNojZpbKBo+pivAwmTKxpDQL5t3jYgKjIZmKlpmWRqKHaykEloSixk3aLFNoaUyU7GaeBEpYcm/rzaTl61LUXqH8Yu/s4GeMSS/5sc5o36W9JCiA3Zaw5bIQhTSPjaGwYXWThta7fH4iuoDHV4E4I4ZMZ5+jzRbakttqVYR7sSqL1mWsUnOmGhDcOlF2yhokTB61WPi8h/wlJPphEE+1jB4boTiVXgSfg8EJxTqaFebAB6A8cfJM8zsrlOlhkHhhbU8GWCdN82JkNQfM3lEcNynGHbduJgZRepRUNjMN1ruEttCvfMixlqA9tSosWraCdcNeMAmxpoY8QDkblGFio+HCBo2dlLXMZ2KIsDAbdRKzLYpGUtlv8PGgdDqAY7WcGcELinGgDMMmLFxO1Hw6+s1l2VsRi3sRt0P7dtDKnaBryhTx2C3ek2QYOXiXaasYMfWs0rIQ6xaGfNnVTId7aVdYrnAm86jP4tHeSxW/52cUugxyLOUXFLL14HoYBGQMb7n5tteFpjZym1417wOP6B7TAQlkkV4Q7qQ6KQfbYEVO1lsF/ThjCpzS3fab2iytYb2lrYbMloZLCIsvJ4UUU9B8FRihaAO16lEzSJQNohb8a3PmfqSOg37gg2tFnxKms2CWIkYDpwJxEnp5pU479xerRDtRiZgh+Js7a1MOJSMQozOwtP7JDbIDfo5tQoHUQSF6XKhEh7MwVdI9BXo11LtRqikTaGUkxMFpKFTMFGDwsxe07Td048PepV/piM7vvW19CO6PCpP7VpnoI5DPaN1fVFIXK5hGptBBaHuPmJOnkKIHlf50TcugjSGhHK/dwh0oYoEgBiUc1oR4vS1m4vYjeNtoyasdU4m3hZF9IQlUlzjXY4ZmJlyivpRVszyNBfPBjmw8K/kOsvZOZna4l+pmdbheLPICLmwrRoGGheHJLvwRzkUpHJ5pFrRfzHvGVlIdwI2q1SNwasdmSQ5sZ2A7zXNhhXkQLSmtVXJLIGB5BzpJMRLGe9MGbKuTGf9iNqWR8VAImAGch9NvQUqcmRUMmuPE4yZtHBMPy2o7Llcoxb5PCtZvmxT3m66FKkoIKW6YJ2YGX3BkuH8kbA4RpdICPkICtUGmkkpjxmEKfZoxivK6kyUPHiHgKcKkj1zeGgk6lLgoWIJ5LNNFEmYDRYI0/DQGxg7Yizaa/2AKXSMZtGNFiPSsYSpItetNbp+08MnWA7tGdxAb4jTwD2dikiiyUotMmliEDM5ZP/Du5QTNd2o5AHUfmCfybWJs3Az04TmarcXNKE0KhI1Pvc5kaZNccRAUfLoiW1zGa6r5Z8oemmcA1XAc7gG9WdgtPAKduRUMusDVEJ1ubyaIq1hu/qiRfbd3/00jG3Eyk+bZst1tCGgZiNLiFtYg3a2RH+fRxaO5gxXRwadIH+IllED7fhv8Yas+V7kawdaFLTiPbO4HjR6tlIDm0anj6e0Nxq1dgncgj+5kWugfX2y5f+jN2OeBQiSzx65YsZK9GUqsmXoqgfzyBaP7Bybz/zwQPggD9R/NVVyqvaZxNAAAAYRpQ0NQSUNDIHByb2ZpbGUAAHicfZE9SMNAHMVfU6WilSJ2EHHIUJ1aEBVx1CoUoUKoFVp1MLn0C5o0JCkujoJrwcGPxaqDi7OuDq6CIPgB4uTopOgiJf4vKbSI9eC4H+/uPe7eAUK9zDSraxzQdNtMJeJiJrsqBl7RhwGEEIUoM8uYk6QkOo6ve/j4ehfjWZ3P/Tn61ZzFAJ9IPMsM0ybeIJ7etA3O+8RhVpRV4nPiqEkXJH7kuuLxG+eCywLPDJvp1DxxmFgstLHSxqxoasRTxBFV0ylfyHisct7irJWrrHlP/sJgTl9Z5jrNESSwiCVIEKGgihLKsBGjVSfFQor24x38w65fIpdCrhIYORZQgQbZ9YP/we9urfzkhJcUjAPdL47zMQoEdoFGzXG+jx2ncQL4n4ErveWv1IGZT9JrLS1yBIS2gYvrlqbsAZc7wNCTIZuyK/lpCvk88H5G35QFBm+B3jWvt+Y+Th+ANHWVvAEODoGxAmWvd3h3T3tv/55p9vcDk4xytG+447oAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfkCxEPLC9HyOMVAAACHklEQVRIx7WVP2hTURTGf/fmpaUxqQYjSbeAmqDSTralYMEOHZqpJeoiSNFBEdIODiIuHbQ4SlucOzjXLYh/aMTFQhFdSugfaCglCU1CheQ1pMm7DkkxkDSS99JveVzOu9+533fOPVesAgqQMAVEgGHAgTnowBqwCHxQgPgK2OAtMEtnsQDMilWYErBilkXVvqJ5OKyJqi2mIVqHI7LmeePG3t50B2walqcV9Pz4uN/m978QDoduIUGPiP2zsUHEpelpjvb2PPrGxmsjm31IqaS1m0G2Ct5YXsbucmU+J5OPu/v7A7KvL4qURls1aqXgdt3iHXBN0+gKBEYrudy8kUrdsqygHk+BsXIZVzD43UilRu3B4D3hdsc7pqAeXo+HjyMjCKXs+Xj8USWZfKUKhYsdS1B/B35OTFDO5y8UE4kZI5N5rnTdYcqipv7abNXTSSkBuyqXG/g0M8TXvV7eDwyAlF369vaTyv7+nNJ1d7N/tXZHwK9QiGw0ytHu7v3ywcGcOjy80uow2v+G2AmWgMtAYWdnzO71vjne2hqy1KYnCn6Hw9wFbg4OXj3n83063tz8YqTTQ5YvmgDhnpykmEr5ionEvJHNPqBUsrVbr1MtcoZCjj/r68+MXO6l0vVu0+M8Vn3mehoCTmdG5fMei+O6KIEfTYtsnRxgTdYa5KywIKm+x4tnQL4ErMhaC80AYSAGFK14DnwD7gARBfwFJz6znZ0PWkwAAAAASUVORK5CYII=);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Add by LDR to hide the footer, the link discussion and menu entry we don&#039;t want */&lt;br /&gt;
footer#footer { display: none; }&lt;br /&gt;
#footer-info { display: none; }&lt;br /&gt;
#pt-mytalk { display: none; }&lt;br /&gt;
#t-permalink { display: none; }&lt;br /&gt;
#footer-places-mobileview { font-size: 1.3em !important; }&lt;br /&gt;
&lt;br /&gt;
/* Add by LDR to hide the title on main pages */&lt;br /&gt;
/*&lt;br /&gt;
body.page-Home.action-view h1.firstHeading, body.page-Main_Page.action-submit h1.firstHeading { display: none; padding-bottom: 0 !important;}&lt;br /&gt;
body.page-Main_Page.action-view h1.firstHeading, body.page-Main_Page.action-submit h1.firstHeading { display: none; padding-bottom: 0 !important;}&lt;br /&gt;
body.page-Accueil.action-view h1.firstHeading, body.page-Accueil.action-submit h1.firstHeading { display: none; padding-bottom: 0 !important; }&lt;br /&gt;
body.page-Portada.action-view h1.firstHeading, body.page-Portada.action-submit h1.firstHeading { display: none; padding-bottom: 0 !important; }&lt;br /&gt;
body.page-Hauptseite.action-view h1.firstHeading, body.page-Hauptseite.action-submit h1.firstHeading { display: none; padding-bottom: 0 !important; }&lt;br /&gt;
body.page-Αρχική.action-view h1.firstHeading, body.page-Αρχική.action-submit h1.firstHeading { display: none; padding-bottom: 0 !important; }&lt;br /&gt;
body.page-Página_Principal.action-view h1.firstHeading, body.page-Página_Principal.action-submit h1.firstHeading { display: none; padding-bottom: 0 !important; }&lt;br /&gt;
body.page-简体中文官方文档.action-view h1.firstHeading, body.page-简体中文官方文档.action-submit h1.firstHeading { display: none; padding-bottom: 0 !important; }&lt;br /&gt;
body.page-ホームページ.action-view h1.firstHeading, body.page-ホームページ.action-submit h1.firstHeading { display: none; padding-bottom: 0 !important; }&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
/* Add by LDR to reduce size of logo */&lt;br /&gt;
#p-logo a { height: 60px; }&lt;br /&gt;
.mw-wiki-logo {&lt;br /&gt;
    background-size: contain;&lt;br /&gt;
    margin-top: 0.5em;&lt;br /&gt;
    background-image: url(/images/5/51/Dolibarr_124x124_white.svg);&lt;br /&gt;
}&lt;br /&gt;
#p-logo {&lt;br /&gt;
    height: 60px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Add LDR to increase font size */&lt;br /&gt;
html, body {&lt;br /&gt;
  font-size: 1.1em;&lt;br /&gt;
  font-family: Roboto,Arial,Verdana,Helvetica;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body-content .dolbox p {&lt;br /&gt;
	margin: 0px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h2:not(#mw-toc-heading) {&lt;br /&gt;
    background-image: linear-gradient(120deg, rgb(38, 60, 92, 0.3) 0%, rgba(140, 100, 152, 1) 100%);&lt;br /&gt;
    background-repeat: no-repeat;&lt;br /&gt;
    background-size: 100px 0.2em;&lt;br /&gt;
    background-position: 0 90%;&lt;br /&gt;
    padding-bottom: 20px !important;&lt;br /&gt;
    border-bottom: none;&lt;br /&gt;
}&lt;br /&gt;
h2 + table.dolbox {&lt;br /&gt;
    margin-top: 25px;&lt;br /&gt;
}&lt;br /&gt;
table.dolbox {&lt;br /&gt;
    margin-top: 0;&lt;br /&gt;
    padding: 10px;&lt;br /&gt;
    border: 2px solid #000;&lt;br /&gt;
    border-radius: 6px;&lt;br /&gt;
}&lt;br /&gt;
table.dolbox tr td {&lt;br /&gt;
    /* border: 1px #f0f0f0 solid; */&lt;br /&gt;
}&lt;br /&gt;
table.dolbox.marginleft {&lt;br /&gt;
    margin-left: 20px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* For title style */&lt;br /&gt;
.mw-body h1, .mw-body-content h1, .mw-body-content h2, .mw-body-content h3, .mw-body-content h4 {&lt;br /&gt;
    font-family: Roboto,Arial,Verdana,Helvetica;&lt;br /&gt;
}&lt;br /&gt;
h1 .mw-headline, .searchresults .mw-headline {&lt;br /&gt;
	color: rgb(0,135,160);&lt;br /&gt;
}&lt;br /&gt;
h2 .mw-headline, .searchresults .mw-headline {&lt;br /&gt;
	color: rgb(0,135,160);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h1#firstHeading {&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    border-bottom: none;&lt;br /&gt;
    margin-top: 0.2em !important;&lt;br /&gt;
    /* text-shadow: 3px 3px 5px #DDD; */&lt;br /&gt;
    color: #220050 !important;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    padding-bottom: 1em;&lt;br /&gt;
}&lt;br /&gt;
.mw-body h1, .mw-body-content h1 {&lt;br /&gt;
    font-size: 1.6em;&lt;br /&gt;
	margin-top: 1.5em;&lt;br /&gt;
}&lt;br /&gt;
.mw-body h2, .mw-body-content h2 {&lt;br /&gt;
    font-size: 1.6em;&lt;br /&gt;
    margin-top: 2.5em;&lt;br /&gt;
    padding-bottom: 0.2em;&lt;br /&gt;
}&lt;br /&gt;
.mw-body h3, .mw-body-content h3 {&lt;br /&gt;
	color: #220050;&lt;br /&gt;
    font-size: 1.3em;&lt;br /&gt;
    padding-bottom: 10px;&lt;br /&gt;
}&lt;br /&gt;
h2 + h3 {&lt;br /&gt;
    padding-top: 10px !important;&lt;br /&gt;
}&lt;br /&gt;
h3 {&lt;br /&gt;
    padding-top: 20px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
div.company {&lt;br /&gt;
        margin-left: 0px;&lt;br /&gt;
        margin-bottom: 40px;&lt;br /&gt;
        margin-top: 30px;&lt;br /&gt;
        background-color: #FBFAFC;&lt;br /&gt;
		-moz-border-radius: 10px;&lt;br /&gt;
		border-radius: 10px;&lt;br /&gt;
		box-shadow: 1px 1px 20px #ccc;&lt;br /&gt;
/*&lt;br /&gt;
		padding-left: 10px;&lt;br /&gt;
		padding-right: 12px;&lt;br /&gt;
*/		&lt;br /&gt;
	padding-left: 20px;&lt;br /&gt;
    padding-right: 20px;&lt;br /&gt;
    padding-top: 15px;&lt;br /&gt;
    padding-bottom: 15px;		&lt;br /&gt;
}&lt;br /&gt;
div.companylogo {&lt;br /&gt;
	text-align: right;&lt;br /&gt;
	margin-right: 15px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* For images / screenshots */&lt;br /&gt;
div.divforimgcentpercent {&lt;br /&gt;
	text-align: center;&lt;br /&gt;
	margin-top: 15px;&lt;br /&gt;
	margin-bottom: 15px;&lt;br /&gt;
}&lt;br /&gt;
div.divforimgcentpercent p a img {&lt;br /&gt;
    width: 90% !important;&lt;br /&gt;
    height: auto !important;&lt;br /&gt;
	box-shadow: 1px 1px 15px #ccc;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Add link to mobile if we are on large display */&lt;br /&gt;
@media (min-width: 1024px) {&lt;br /&gt;
	#footer-places { display: none; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hide some tabs when we don&#039;t have edit permissions */&lt;br /&gt;
body:not(.mw-editable) #ca-nstab-main { display: none; }&lt;br /&gt;
body:not(.mw-editable) #ca-view { display: none; }&lt;br /&gt;
body:not(.mw-editable) #ca-viewsource { display: none; }&lt;br /&gt;
&lt;br /&gt;
#p-views ul li.selected {&lt;br /&gt;
    background: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.vectorTabs, .vectorTabs ul, .vectorTabs li, .vectorTabs #ca-history span, .vectorTabs #ca-watch span {&lt;br /&gt;
    background-image: none;&lt;br /&gt;
}&lt;br /&gt;
.vectorTabs li {&lt;br /&gt;
	line-height: unset;&lt;br /&gt;
}&lt;br /&gt;
	&lt;br /&gt;
/* Allow word wrap */&lt;br /&gt;
pre {&lt;br /&gt;
	word-break: break-word;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
table.dolbox {&lt;br /&gt;
    margin-right: 5px;&lt;br /&gt;
    /* margin-left: 25px; */&lt;br /&gt;
    margin-bottom: 15px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Allow limiting of which header levels are shown in a TOC;&lt;br /&gt;
 * &amp;lt;div class=&amp;quot;toclimit-3&amp;quot;&amp;gt;, for instance, will limit to&lt;br /&gt;
 * showing ==headings== and ===headings=== but no further.&lt;br /&gt;
 * Used in [[Template:TOC]]&lt;br /&gt;
 */&lt;br /&gt;
.toclimit-1 li.toclevel-2,&lt;br /&gt;
.toclimit-1 li.toclevel-3,&lt;br /&gt;
.toclimit-1 li.toclevel-4,&lt;br /&gt;
.toclimit-1 li.toclevel-5,&lt;br /&gt;
.toclimit-1 li.toclevel-6&lt;br /&gt;
{&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wraponmobile {&lt;br /&gt;
	white-space: nowrap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
a#stopMobileRedirectToggle {&lt;br /&gt;
	font-size: 1.3em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wikibox {&lt;br /&gt;
	box-shadow: 2px 2px 10px #bbb;&lt;br /&gt;
	border:unset !important;&lt;br /&gt;
}&lt;br /&gt;
center, center p, .wikibox p {&lt;br /&gt;
    text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
p {&lt;br /&gt;
    text-align: justify;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wikibox {&lt;br /&gt;
text-align: center;&lt;br /&gt;
float:right; &lt;br /&gt;
font-size:80%; &lt;br /&gt;
background: #eef; &lt;br /&gt;
border: 1px solid #ccf; &lt;br /&gt;
margin-bottom: 0px; &lt;br /&gt;
margin-left: 25px; &lt;br /&gt;
margin-right: 25px; &lt;br /&gt;
padding: 1px; &lt;br /&gt;
height: 120px;&lt;br /&gt;
width: 150px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.suggestions-result {&lt;br /&gt;
	line-height: 2em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Test for combo list of lang&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
h3#p-lang-label {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Conteneur */&lt;br /&gt;
#p-lang .vector-menu-content {&lt;br /&gt;
    position: relative;&lt;br /&gt;
    float: left;&lt;br /&gt;
    width: 90%;&lt;br /&gt;
    font-family: sans-serif;&lt;br /&gt;
    padding-top: 5px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Cache la liste par défaut */&lt;br /&gt;
#p-lang .vector-menu-content-list {&lt;br /&gt;
    max-height: 0;&lt;br /&gt;
    overflow: hidden;&lt;br /&gt;
&lt;br /&gt;
    list-style: none;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    top: 100%;&lt;br /&gt;
    left: 0;&lt;br /&gt;
&lt;br /&gt;
    width: 100%;&lt;br /&gt;
&lt;br /&gt;
    background: white;&lt;br /&gt;
    &lt;br /&gt;
    transition: max-height 0.3s ease;&lt;br /&gt;
    z-index: 1000;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Affiche au survol */&lt;br /&gt;
#p-lang .vector-menu-content:hover .vector-menu-content-list {&lt;br /&gt;
    max-height: 500px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Bouton visible */&lt;br /&gt;
#p-lang .vector-menu-content::before {&lt;br /&gt;
    content: &amp;quot;Language ▼&amp;quot;;&lt;br /&gt;
    display: block;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
    font-size: 0.75em;&lt;br /&gt;
    color: #54595d;&lt;br /&gt;
    padding-bottom: 5px;&lt;br /&gt;
    padding-top: 5px;&lt;br /&gt;
    border-bottom: 1px solid #ccc;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Styles des liens */&lt;br /&gt;
#p-lang .vector-menu-content-list li a {&lt;br /&gt;
    display: block;&lt;br /&gt;
    padding: 8px 12px;&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
    color: #333;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#p-lang .vector-menu-content-list li a:hover {&lt;br /&gt;
    background: #eee;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Eldy</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=MediaWiki:Common.css&amp;diff=68403</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=MediaWiki:Common.css&amp;diff=68403"/>
		<updated>2026-10-21T20:44:33Z</updated>

		<summary type="html">&lt;p&gt;Eldy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
&lt;br /&gt;
:root {&lt;br /&gt;
	--pictocolor: rgb(85, 165, 155);	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* We disable the talk tab */&lt;br /&gt;
body:not(.mw-editable) #ca-talk {&lt;br /&gt;
	display:none;&lt;br /&gt;
}&lt;br /&gt;
/* We disable the tab &amp;quot;Page&amp;quot; */&lt;br /&gt;
li#ca-nstab-main, li#ca-nstab-mediawiki {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
#ca-talk, #ca-nstab-user_talk {&lt;br /&gt;
    display: none !important;&lt;br /&gt;
}&lt;br /&gt;
/* we disabe a link w already have into Info on page */&lt;br /&gt;
li#t-whatlinkshere, li#t-recentchangeslinked {&lt;br /&gt;
	display: none !important;&lt;br /&gt;
}&lt;br /&gt;
/* we disable also search entries not used */&lt;br /&gt;
div.oo-ui-labelElement:has(.mw-advancedSearch-namespace-1),&lt;br /&gt;
div.oo-ui-labelElement:has(.mw-advancedSearch-namespace-2),&lt;br /&gt;
div.oo-ui-labelElement:has(.mw-advancedSearch-namespace-3),&lt;br /&gt;
div.oo-ui-labelElement:has(.mw-advancedSearch-namespace-4),&lt;br /&gt;
div.oo-ui-labelElement:has(#mw-search-ns5),&lt;br /&gt;
div.oo-ui-labelElement:has(.mw-advancedSearch-namespace-7),&lt;br /&gt;
div.oo-ui-labelElement:has(.mw-advancedSearch-namespace-9),&lt;br /&gt;
div.oo-ui-labelElement:has(.mw-advancedSearch-namespace-11),&lt;br /&gt;
div.oo-ui-labelElement:has(.mw-advancedSearch-namespace-12),&lt;br /&gt;
div.oo-ui-labelElement:has(.mw-advancedSearch-namespace-13),&lt;br /&gt;
div.oo-ui-labelElement:has(.mw-advancedSearch-namespace-15),&lt;br /&gt;
div.oo-ui-labelElement:has(.mw-advancedSearch-namespace-16),&lt;br /&gt;
div.oo-ui-labelElement:has(.mw-advancedSearch-namespace-101) {&lt;br /&gt;
	display:none;&lt;br /&gt;
}&lt;br /&gt;
/*&lt;br /&gt;
input#mw-search-ns1, label[for=&amp;quot;mw-search-ns1&amp;quot;], input#mw-search-ns3, label[for=&amp;quot;mw-search-ns3&amp;quot;], input#mw-search-ns5, label[for=&amp;quot;mw-search-ns5&amp;quot;], input#mw-search-ns7, label[for=&amp;quot;mw-search-ns7&amp;quot;],&lt;br /&gt;
input#mw-search-ns9, label[for=&amp;quot;mw-search-ns9&amp;quot;], input#mw-search-ns11, label[for=&amp;quot;mw-search-ns11&amp;quot;], input#mw-search-ns13, label[for=&amp;quot;mw-search-ns13&amp;quot;], input#mw-search-ns15, label[for=&amp;quot;mw-search-ns15&amp;quot;],&lt;br /&gt;
input#mw-search-ns4, label[for=&amp;quot;mw-search-ns4&amp;quot;], input#mw-search-ns12, label[for=&amp;quot;mw-search-ns12&amp;quot;] {&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#pt-anonuserpage, #pt-userpage a {&lt;br /&gt;
    background-image: url(/skins/Vector/images/user-avatar.png?494);&lt;br /&gt;
/*    background-image: linear-gradient(transparent,transparent),url(data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%2220%22 height=%2220%22 viewBox=%220 0 20 20%22%3E %3Cg fill=%22%2384898d%22%3E %3Cpath d=%22M10 11c-5.92 0-8 3-8 5v3h16v-3c0-2-2.08-5-8-5z%22/%3E %3Ccircle cx=%2210%22 cy=%225.5%22 r=%224.5%22/%3E %3C/g%3E %3C/svg%3E); */&lt;br /&gt;
}&lt;br /&gt;
#simpleSearch #searchButton {&lt;br /&gt;
    background-image: url(/skins/Vector/images/search-ltr.png?39f97);&lt;br /&gt;
/*    background-image: linear-gradient(transparent,transparent),url(data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%2212%22 height=%2213%22%3E %3Cg fill=%22none%22 stroke=%22%2394595d%22 stroke-width=%222%22%3E %3Cpath d=%22M11.29 11.71l-4-4%22/%3E %3Ccircle cx=%225%22 cy=%225%22 r=%224%22/%3E %3C/g%3E %3C/svg%3E); */&lt;br /&gt;
}    &lt;br /&gt;
&lt;br /&gt;
/* Hide the wheel on language */&lt;br /&gt;
#p-lang button.uls-settings-trigger.webfonts-changed {&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
label.toctogglelabel {&lt;br /&gt;
    outline: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.toctogglelabel:focus {&lt;br /&gt;
	outline: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-menu-tabs, .vector-menu-tabs a, #mw-head .vector-menu-dropdown h3 {&lt;br /&gt;
	background-image: unset !important;	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#right-navigation ul.vector-menu-content-list a { background: #263c5c !important; }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*.ca-watch */&lt;br /&gt;
#ca-view a, #ca-ve-edit a, #ca-edit a, #ca-history a, #ca-nstab-mediawiki:not(.selected) a, #ca-nstab-main:not(.selected) a {&lt;br /&gt;
	color: #fff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
/*div#mw-head {&lt;br /&gt;
    top: 0;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    z-index: 100;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
}&lt;br /&gt;
a.mw-wiki-logo {&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 0;&lt;br /&gt;
    z-index: 200;&lt;br /&gt;
}*/&lt;br /&gt;
&lt;br /&gt;
.mw-body-content h1 {&lt;br /&gt;
    clear: both;&lt;br /&gt;
}&lt;br /&gt;
.mw-body-content h2 {&lt;br /&gt;
    clear: both;&lt;br /&gt;
}&lt;br /&gt;
.mw-body-content h4 {&lt;br /&gt;
	font-size: 1.1em;&lt;br /&gt;
}&lt;br /&gt;
.mw-body-content h5, .mw-body-content h6 {&lt;br /&gt;
	font-size: 0.9em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media screen and (min-width: 982px) {&lt;br /&gt;
	.mw-body {&lt;br /&gt;
		padding-left: 3em;&lt;br /&gt;
		padding-right: 2.5em;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table.welcometext {&lt;br /&gt;
    position: relative;&lt;br /&gt;
    top: -30px;&lt;br /&gt;
}&lt;br /&gt;
.tdwelcometext {&lt;br /&gt;
	padding: 0 15px; &lt;br /&gt;
	color: #fff; &lt;br /&gt;
	background-color:rgba(70, 3, 62, 0.3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#mw-indicator-mw-helplink {&lt;br /&gt;
	display: none;	&lt;br /&gt;
}&lt;br /&gt;
#mw-panel {&lt;br /&gt;
	padding-left: unset;	&lt;br /&gt;
}&lt;br /&gt;
#mw-panel #p-logo + .portal {&lt;br /&gt;
    margin-top: 1.5em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
span.h2fa {&lt;br /&gt;
    background-color: var(--pictocolor);&lt;br /&gt;
    padding: 12px;&lt;br /&gt;
    margin-right: 5px;&lt;br /&gt;
    border-radius: 50px;&lt;br /&gt;
    color: #fff;&lt;br /&gt;
    text-shadow: none;&lt;br /&gt;
    box-shadow: 1px 1px 5px #ccc;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ul.gallery.mw-gallery-traditional {&lt;br /&gt;
    clear: both;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#content.mw-body {&lt;br /&gt;
	padding-top: 2.55em;&lt;br /&gt;
	border: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#p-views ul li.selected span a {&lt;br /&gt;
    color: #fff !important;&lt;br /&gt;
    text-decoration: underline;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*div#contentSub {&lt;br /&gt;
	display: none;&lt;br /&gt;
}*/&lt;br /&gt;
&lt;br /&gt;
/* Change to have banner dolibarr blue */&lt;br /&gt;
#mw-head-base {&lt;br /&gt;
	    height: 4em;&lt;br /&gt;
}&lt;br /&gt;
#mw-head {&lt;br /&gt;
    background: #263c5c;&lt;br /&gt;
    height: 4em;&lt;br /&gt;
}&lt;br /&gt;
#left-navigation {&lt;br /&gt;
	margin-top: 1.5em;&lt;br /&gt;
}&lt;br /&gt;
#right-navigation {&lt;br /&gt;
	margin-top: 1.5em;&lt;br /&gt;
}&lt;br /&gt;
h3#p-cactions-label span {&lt;br /&gt;
    color: #fff;&lt;br /&gt;
}&lt;br /&gt;
li.selected span a {&lt;br /&gt;
    color: #000 !important;&lt;br /&gt;
}&lt;br /&gt;
ul.menu li a {&lt;br /&gt;
    color: #000 !important;&lt;br /&gt;
}&lt;br /&gt;
div#mw-head li:not(#ca-nstab-main):not(#ca-nstab-mediawiki):not(#ca-nstab-special):not(.selected) a:not(.selected) {&lt;br /&gt;
    color: #fff;&lt;br /&gt;
}&lt;br /&gt;
.vectorTabs span, #mw-head .vectorMenu h3 {&lt;br /&gt;
	background-image: none;&lt;br /&gt;
}&lt;br /&gt;
pt-anonuserpage, #pt-userpage a {&lt;br /&gt;
	background-size: unset;&lt;br /&gt;
    padding-left: 26px !important;&lt;br /&gt;
}&lt;br /&gt;
    &lt;br /&gt;
/* To force some TOC to be on 1 line */&lt;br /&gt;
@media (max-width: 767px) {&lt;br /&gt;
	.tocinline ul li {&lt;br /&gt;
	    display: inline-block;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
@media (min-width: 768px) {&lt;br /&gt;
	.tocinline ul {&lt;br /&gt;
		columns: 2 !important;	&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
@media (min-width: 1024px) {&lt;br /&gt;
	.tocinline ul {&lt;br /&gt;
		columns: 3 !important;	&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
@media (min-width: 1300px) {&lt;br /&gt;
	.tocinline ul {&lt;br /&gt;
		columns: 4 !important;	&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
@media (min-width: 1700px) {&lt;br /&gt;
	.tocinline ul {&lt;br /&gt;
		columns: 5 !important;	&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
.tocinline .toc {&lt;br /&gt;
	display: inline-block !important;&lt;br /&gt;
}&lt;br /&gt;
div#toc {&lt;br /&gt;
    margin-top: 20px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.catlinks {&lt;br /&gt;
	margin-top: 3em;&lt;br /&gt;
	border: none;&lt;br /&gt;
    background: none;&lt;br /&gt;
    font-size: 0.9em;&lt;br /&gt;
}&lt;br /&gt;
.catlinks li a {&lt;br /&gt;
	background-color: #aaa;&lt;br /&gt;
	color: #fff;&lt;br /&gt;
	padding: 5px;&lt;br /&gt;
	border-radius: 5px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#simpleSearch {&lt;br /&gt;
	background-image: none;&lt;br /&gt;
	height: unset;&lt;br /&gt;
	border-radius: 5px;&lt;br /&gt;
	/* padding: 2px; */&lt;br /&gt;
	background-color: #fff !important;	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* The insertInterlangLinks tool should be displayed only in source mode */&lt;br /&gt;
.ve-init-target-visual .oo-ui-tool-name-insertInterlangLinks {&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-search-result-data {&lt;br /&gt;
    color: #888888;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
a.feedlink {&lt;br /&gt;
	background-image: none;&lt;br /&gt;
	padding-left: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.opacitymedium {&lt;br /&gt;
	opacity: 0.5;	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
.vectorTabs li.new a, .vectorTabs li.new a:visited, a.new {&lt;br /&gt;
    color: #a58838;&lt;br /&gt;
}&lt;br /&gt;
*/&lt;br /&gt;
a, a:visited, .vector-menu-portal .vector-menu-content li a:visited, .vector-menu-portal .vector-menu-content li a {&lt;br /&gt;
	color: #048;&lt;br /&gt;
}&lt;br /&gt;
a.external, a.external:visited {&lt;br /&gt;
	color: #048 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.mw-changeslist-legend {&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ul.vector-menu-content-list li#n-Facebook, ul.vector-menu-content-list li#n-LinkedIn, ul.vector-menu-content-list li#n-Twitter, ul.vector-menu-content-list li#n-Youtube {&lt;br /&gt;
    filter: saturate(0.1);&lt;br /&gt;
    opacity: 0.3;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Using logos for social networks links instead of plain text */&lt;br /&gt;
#p-Social_networks .body {&lt;br /&gt;
	text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#p-Social_networks li, nav[aria-labelledby=&amp;quot;p-Social networks-label&amp;quot;] li {&lt;br /&gt;
	display: inline-block;&lt;br /&gt;
	width: 24px;&lt;br /&gt;
	height: 24px;&lt;br /&gt;
	margin: 0 5px !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#p-Social_networks a, nav[aria-labelledby=&amp;quot;p-Social networks-label&amp;quot;] a {&lt;br /&gt;
	direction: ltr;&lt;br /&gt;
	text-indent: -9999px;&lt;br /&gt;
	width: 24px;&lt;br /&gt;
	height: 24px;&lt;br /&gt;
	display: inline-block;&lt;br /&gt;
	background-repeat: no-repeat;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#n-Facebook a {&lt;br /&gt;
	background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAApElEQVRIx2O0ipz+n4GGgImWhg8PC1iIVcjHzcGQE2PBYG0oz8DLw87AxMjIwMDAwGATPZM6FpQm2zI4mivRLogs9GVpG0Qc7Ail0SWrGB49f89ATPom2gJGaJgzMDAwPHz+nmgfMBLKaEeWpuOU+/7jN4Nr8jy8FlCUTD98/kFQDUUWfCTCAoJBBAPIQUUo7VPNB6MWjFpAHwuIzgeD1gdD3wIA0CskwBBfwqYAAAAASUVORK5CYII=);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#n-LinkedIn a {&lt;br /&gt;
	background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAA7EAAAOxAGVKw4bAAABFUlEQVRIx2NkKN/6n4GGgImWhg+cBTmW8gyH0s0ZcizlKbaABV1AQ5SbYYKvJgMTIyODlbwgw547bxhuvP5KPR/8+fcfL59iH9x5+40hafVlhhBdCYY1l18w3Hn7jSILGGmdTFmwCf5r94SzmSq3Y4gJNe5maHJVZQjRlWQQ4mJluPT8M0Pd7lsMO269wTCLrGS6I8mUIcdKgUGCl52BjZmJwUSGn2FTnDGDg5IQdSwwkxVg+Pf/P8Off/8QQcHMxFDlqEwdC3bdfs0g0bKXQahxD8O6Ky8QFssIUMeCrA1XGd58+83w5ddfhqIt1+HiPOzM1LHg3rvvcPajjz8QhjEyUscCUsCoBQNvAc3LoqEfREPfAgDdrVLViTsGJwAAAABJRU5ErkJggg==);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#n-Twitter a {&lt;br /&gt;
	background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAByUlEQVRIx+2Vz0tUURTHP/e9d+c9e9PgD8QhKpyEGAzcSBCDuKhdi8xFtIhAApEW/QOtcm9QQksXRRtx6VorhoJslQpRNOWiQMVAXzk/3q/bOue+8TVguOgsz7n3fODLOecrzjzdUxxhGEfZ/D/gXwBEe4C+jtYfL/WZLF49QeWWy4sxl7F+i15HcHNApgPMlBymBqW2ebHT4NmVDoZ6TCxDcC5n8GjEoTzuYlvQ64jDAd224P6ww+MRhy77zw+3z0ts80ATIZAGlPImO3V1OODtVgTA9YKkPO4yfdGmlDfJSuhJkG+rprj7qs7BrbV0j5e/h1w+bVLImZyUgoliholiBqUUSWvv+fqaFjA5mKGQM5vyQojEufnixdq8VqIn6z5h/Hcn6s1mlB6wsh0x9bLGVy8iTewHisWNID0AIO8aWpl0MffBZ8/X1xIBzz8FzK42aEStpVr9ETG75ifWW56Kh+997pXr/Az0kI+7EXeWawRxco+mKcpKuNYvOZsVjJ6yuNDdLFOsFAuVgAfvGlTD1vI1AX4FsPQt5MaApBoqdhuKXAaqIWx4Ma83I+Y/B1S8mDQh0lmmANpz1pTnun3bPu6GcwwAvwExXIo+zrNKOwAAAABJRU5ErkJggg==);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#n-Youtube a {&lt;br /&gt;
	background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAALy3pUWHRSYXcgcHJvZmlsZSB0eXBlIGV4aWYAAHja5Zhrdtw6DoT/cxWzBBIk+FgOn+fcHczy5wO73XHsJDfO3D9zxrJbslqiSFShUJDb//7ruH/xE3OtLmmpueXs+UktNekcVP/4afcz+HQ/H/+8fRe+P+9eXwinIvv4+Lf05/Wd8/rthtc44/vzrj6/kfoc6PnF24DRniwcrPeT5Lw8zof0HKjtx0Futbyf6pDHfj4vvFN5/sVyh34NYv+79ydSIUpLuSqK7Biiv5/1MYP4+OucCfezcF2ImeMUk7u78pwJAflueW97798H6Lsgvx25j9F/HX0IvvTn+fghlvkZIw5++EXQHwf/hvjdg+NrRvLhC3nD53OQz1n1nP1YXU+ZiOYno7x7i47dw4WDkMd7W2Yr/CnH5W6NrfruJ+AsP/1gm6EFAZXjQgor9HDCvvsZJlNMsgVMRGRKvOcqGDWZ0XBKtoUjJba4YgXLKdvFyGl5zSXc57b7vAnrl1+BSyUwWOCWn27uV19+ZXPnTAtR8PUVK+YlxlymYcjZJ1cBSDhP3PQG+G17wu/f8QeqgqDeMFcW2P14DDE0fONWvDhHrlP2j6wIrqznAISIZyuTIQVS8DlEDTn4IlJCII4VgDozl5hkgEBQlcUkJcWYxRWpYs/mnhLutaKSxU6jTQChZFMBmxY7YKWk8KekCoe6Rk2qmrVoddq055hT1pxzySZyvcSSipZcSqmllV5jTVVrrqXW2mpv0iIaqC230mprrXdxnQd1xupc3zkzZMSRho48yqijjT6hz0xTZ55l1tlmX7LiQiZWXmXV1VbfwW2UYqetO++y6267H7h24klHTz7l1NNOf6H2RPXT9gXUwhM1uUjZdeWFGmddKW9DBJMTNcxATFIA8WIIQGgxzHwNKYkhZ5j5JiSFCpNUw8atYIgBYdpB9IQXdt+Q+y3cnNbfwk3+Djln0P0TyDmg+4zbD1BbVufmReyRhRZTH8m+E2uX6rqMGePR5PmP31A1JLW68rW9++oN/2MDaTxNxga22EKSCLE79VYlzfy8fN4AdvMIP967v7vgd/evgdY+e8oAaBzHbv7sXM6U3qBFa1QNFDFnKCQD39G4rO/RRziaDxTpTs+hZh3Spk+oOUuDisEcwoixnTIwYqtI6kdnIf9Oy2tz4VnznDsQBNY2XCp55ryg07rRqCv90ercn4Rl9H38YOVUPFbU9yzHHfSi75Q7STh1ldPxTYv55zAyq2KtNc3eZ9rphIUd674vgqWzKyrgc1ZF2x3pHOfJo0cqNqm1Ej6h9E5g4ticCroMgFqLhiZL9paRicAVqRhk+NgQMrftQbP13ctsetSCThrLnvNgwJZuhKudSCwj6tFXCWcPX5b0WphAIp8nz4aQEs/m9tKxDSvltXpuA/zCRNMjWUzOL27WiqSYawBH1lXPkoaUtUIlC+JwODWXPe6wvl8eMfOzdJzYUbm2NABzrr0kZarNL0rkUyv8a+8+nvjTves7UydwCSwdvuqsl51LFLnd4m+gDzLHHnTJSuJZp5QT/AnobiRGSB8zKpftMZ8eiLisuSbKu+vyjfBg6KkC2tIpEtelkA2N1Pc7+DyD7DrLHcubqVpaX0F3TR1jmPaexwxB3Z34g6pHl8vZS5nBaFJsbhPShOULCVKSG4E6Z/zUWoaHnpvlxZV3rpc/gaXbXherlMBMcleQzLsetfkXTiw9jtHJubYw/dCXUQcpKxTQMI+QzeQedGFlkH9O8sIGrWU3tGBUoUTE3XdLTmNteZwRt56NwXyqRywDkaMFUqpaISeGrZ4rUAyNBfmrS1ukEqbmR8qDGVEJr0DAHJMjZfUIBULk5waU0V960H9BAvdF1vyULO5rbOmRFLNRj/pT06cZxUVKt4qFgAoV+f9uwGz/bTIKLpwT98lqZ8qMF0+8pE8Lo5XHIp1mOuhR3gguVcTXTuUoatpAwvsEM2iBOe6hzcygcYx89gaUdIdz9dT7xIKkVaxBn/nQNk6TONxGSJ0Oq9Y0UBkEYStsUMsEgKbz2LiEnSGnQ5gKDoJOgdoxYzDp92OB8aq7SB/zsYxi6ZGoNDgUbp/jNJMLItBDQXlcommZ1tLGvXfBhq10BhRAepAj3R51HZip2TbyUc2VKxSbRXL3R/A0aSWt21WN6WSRR/xt+9MCiY8CY+hMUJDsIuHMaRmjcx3DfQM9n+MWTRN30nwmkHnSppAOvToKhA06Voo7fH4e1YOWeuL6tBJqCgWpchnTMVkHhuHcUlvJSWq7VB6VcuXWEPCLdHS+jBbIzEUrh+8LC27ugvJYpOsl7jYk1q7doOz0awXPmWkty8KN+J0qPrEnS92JPI9398ND7obVlJvEyqSmtaxI09+6ujZm3Gi+U4lrRPDADXZoSrCsU7s+vd05jE1JuCUVv6GCKpn77fje7DJn4e5WK64RiS1pkRe0XZQyAxevgZOGQP0ONixfr9SM0vMZNVKo/CoujNojZpbKBo+pivAwmTKxpDQL5t3jYgKjIZmKlpmWRqKHaykEloSixk3aLFNoaUyU7GaeBEpYcm/rzaTl61LUXqH8Yu/s4GeMSS/5sc5o36W9JCiA3Zaw5bIQhTSPjaGwYXWThta7fH4iuoDHV4E4I4ZMZ5+jzRbakttqVYR7sSqL1mWsUnOmGhDcOlF2yhokTB61WPi8h/wlJPphEE+1jB4boTiVXgSfg8EJxTqaFebAB6A8cfJM8zsrlOlhkHhhbU8GWCdN82JkNQfM3lEcNynGHbduJgZRepRUNjMN1ruEttCvfMixlqA9tSosWraCdcNeMAmxpoY8QDkblGFio+HCBo2dlLXMZ2KIsDAbdRKzLYpGUtlv8PGgdDqAY7WcGcELinGgDMMmLFxO1Hw6+s1l2VsRi3sRt0P7dtDKnaBryhTx2C3ek2QYOXiXaasYMfWs0rIQ6xaGfNnVTId7aVdYrnAm86jP4tHeSxW/52cUugxyLOUXFLL14HoYBGQMb7n5tteFpjZym1417wOP6B7TAQlkkV4Q7qQ6KQfbYEVO1lsF/ThjCpzS3fab2iytYb2lrYbMloZLCIsvJ4UUU9B8FRihaAO16lEzSJQNohb8a3PmfqSOg37gg2tFnxKms2CWIkYDpwJxEnp5pU479xerRDtRiZgh+Js7a1MOJSMQozOwtP7JDbIDfo5tQoHUQSF6XKhEh7MwVdI9BXo11LtRqikTaGUkxMFpKFTMFGDwsxe07Td048PepV/piM7vvW19CO6PCpP7VpnoI5DPaN1fVFIXK5hGptBBaHuPmJOnkKIHlf50TcugjSGhHK/dwh0oYoEgBiUc1oR4vS1m4vYjeNtoyasdU4m3hZF9IQlUlzjXY4ZmJlyivpRVszyNBfPBjmw8K/kOsvZOZna4l+pmdbheLPICLmwrRoGGheHJLvwRzkUpHJ5pFrRfzHvGVlIdwI2q1SNwasdmSQ5sZ2A7zXNhhXkQLSmtVXJLIGB5BzpJMRLGe9MGbKuTGf9iNqWR8VAImAGch9NvQUqcmRUMmuPE4yZtHBMPy2o7Llcoxb5PCtZvmxT3m66FKkoIKW6YJ2YGX3BkuH8kbA4RpdICPkICtUGmkkpjxmEKfZoxivK6kyUPHiHgKcKkj1zeGgk6lLgoWIJ5LNNFEmYDRYI0/DQGxg7Yizaa/2AKXSMZtGNFiPSsYSpItetNbp+08MnWA7tGdxAb4jTwD2dikiiyUotMmliEDM5ZP/Du5QTNd2o5AHUfmCfybWJs3Az04TmarcXNKE0KhI1Pvc5kaZNccRAUfLoiW1zGa6r5Z8oemmcA1XAc7gG9WdgtPAKduRUMusDVEJ1ubyaIq1hu/qiRfbd3/00jG3Eyk+bZst1tCGgZiNLiFtYg3a2RH+fRxaO5gxXRwadIH+IllED7fhv8Yas+V7kawdaFLTiPbO4HjR6tlIDm0anj6e0Nxq1dgncgj+5kWugfX2y5f+jN2OeBQiSzx65YsZK9GUqsmXoqgfzyBaP7Bybz/zwQPggD9R/NVVyqvaZxNAAAAYRpQ0NQSUNDIHByb2ZpbGUAAHicfZE9SMNAHMVfU6WilSJ2EHHIUJ1aEBVx1CoUoUKoFVp1MLn0C5o0JCkujoJrwcGPxaqDi7OuDq6CIPgB4uTopOgiJf4vKbSI9eC4H+/uPe7eAUK9zDSraxzQdNtMJeJiJrsqBl7RhwGEEIUoM8uYk6QkOo6ve/j4ehfjWZ3P/Tn61ZzFAJ9IPMsM0ybeIJ7etA3O+8RhVpRV4nPiqEkXJH7kuuLxG+eCywLPDJvp1DxxmFgstLHSxqxoasRTxBFV0ylfyHisct7irJWrrHlP/sJgTl9Z5jrNESSwiCVIEKGgihLKsBGjVSfFQor24x38w65fIpdCrhIYORZQgQbZ9YP/we9urfzkhJcUjAPdL47zMQoEdoFGzXG+jx2ncQL4n4ErveWv1IGZT9JrLS1yBIS2gYvrlqbsAZc7wNCTIZuyK/lpCvk88H5G35QFBm+B3jWvt+Y+Th+ANHWVvAEODoGxAmWvd3h3T3tv/55p9vcDk4xytG+447oAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfkCxEPLC9HyOMVAAACHklEQVRIx7WVP2hTURTGf/fmpaUxqQYjSbeAmqDSTralYMEOHZqpJeoiSNFBEdIODiIuHbQ4SlucOzjXLYh/aMTFQhFdSugfaCglCU1CheQ1pMm7DkkxkDSS99JveVzOu9+533fOPVesAgqQMAVEgGHAgTnowBqwCHxQgPgK2OAtMEtnsQDMilWYErBilkXVvqJ5OKyJqi2mIVqHI7LmeePG3t50B2walqcV9Pz4uN/m978QDoduIUGPiP2zsUHEpelpjvb2PPrGxmsjm31IqaS1m0G2Ct5YXsbucmU+J5OPu/v7A7KvL4qURls1aqXgdt3iHXBN0+gKBEYrudy8kUrdsqygHk+BsXIZVzD43UilRu3B4D3hdsc7pqAeXo+HjyMjCKXs+Xj8USWZfKUKhYsdS1B/B35OTFDO5y8UE4kZI5N5rnTdYcqipv7abNXTSSkBuyqXG/g0M8TXvV7eDwyAlF369vaTyv7+nNJ1d7N/tXZHwK9QiGw0ytHu7v3ywcGcOjy80uow2v+G2AmWgMtAYWdnzO71vjne2hqy1KYnCn6Hw9wFbg4OXj3n83063tz8YqTTQ5YvmgDhnpykmEr5ionEvJHNPqBUsrVbr1MtcoZCjj/r68+MXO6l0vVu0+M8Vn3mehoCTmdG5fMei+O6KIEfTYtsnRxgTdYa5KywIKm+x4tnQL4ErMhaC80AYSAGFK14DnwD7gARBfwFJz6znZ0PWkwAAAAASUVORK5CYII=);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Add by LDR to hide the footer, the link discussion and menu entry we don&#039;t want */&lt;br /&gt;
footer#footer { display: none; }&lt;br /&gt;
#footer-info { display: none; }&lt;br /&gt;
#pt-mytalk { display: none; }&lt;br /&gt;
#t-permalink { display: none; }&lt;br /&gt;
#footer-places-mobileview { font-size: 1.3em !important; }&lt;br /&gt;
&lt;br /&gt;
/* Add by LDR to hide the title on main pages */&lt;br /&gt;
/*&lt;br /&gt;
body.page-Home.action-view h1.firstHeading, body.page-Main_Page.action-submit h1.firstHeading { display: none; padding-bottom: 0 !important;}&lt;br /&gt;
body.page-Main_Page.action-view h1.firstHeading, body.page-Main_Page.action-submit h1.firstHeading { display: none; padding-bottom: 0 !important;}&lt;br /&gt;
body.page-Accueil.action-view h1.firstHeading, body.page-Accueil.action-submit h1.firstHeading { display: none; padding-bottom: 0 !important; }&lt;br /&gt;
body.page-Portada.action-view h1.firstHeading, body.page-Portada.action-submit h1.firstHeading { display: none; padding-bottom: 0 !important; }&lt;br /&gt;
body.page-Hauptseite.action-view h1.firstHeading, body.page-Hauptseite.action-submit h1.firstHeading { display: none; padding-bottom: 0 !important; }&lt;br /&gt;
body.page-Αρχική.action-view h1.firstHeading, body.page-Αρχική.action-submit h1.firstHeading { display: none; padding-bottom: 0 !important; }&lt;br /&gt;
body.page-Página_Principal.action-view h1.firstHeading, body.page-Página_Principal.action-submit h1.firstHeading { display: none; padding-bottom: 0 !important; }&lt;br /&gt;
body.page-简体中文官方文档.action-view h1.firstHeading, body.page-简体中文官方文档.action-submit h1.firstHeading { display: none; padding-bottom: 0 !important; }&lt;br /&gt;
body.page-ホームページ.action-view h1.firstHeading, body.page-ホームページ.action-submit h1.firstHeading { display: none; padding-bottom: 0 !important; }&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
/* Add by LDR to reduce size of logo */&lt;br /&gt;
#p-logo a { height: 60px; }&lt;br /&gt;
.mw-wiki-logo {&lt;br /&gt;
    background-size: contain;&lt;br /&gt;
    margin-top: 0.5em;&lt;br /&gt;
    background-image: url(/images/5/51/Dolibarr_124x124_white.svg);&lt;br /&gt;
}&lt;br /&gt;
#p-logo {&lt;br /&gt;
    height: 60px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Add LDR to increase font size */&lt;br /&gt;
html, body {&lt;br /&gt;
  font-size: 1.1em;&lt;br /&gt;
  font-family: Roboto,Arial,Verdana,Helvetica;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body-content .dolbox p {&lt;br /&gt;
	margin: 0px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h2:not(#mw-toc-heading) {&lt;br /&gt;
    background-image: linear-gradient(120deg, rgb(38, 60, 92, 0.3) 0%, rgba(140, 100, 152, 1) 100%);&lt;br /&gt;
    background-repeat: no-repeat;&lt;br /&gt;
    background-size: 100px 0.2em;&lt;br /&gt;
    background-position: 0 90%;&lt;br /&gt;
    padding-bottom: 20px !important;&lt;br /&gt;
    border-bottom: none;&lt;br /&gt;
}&lt;br /&gt;
h2 + table.dolbox {&lt;br /&gt;
    margin-top: 25px;&lt;br /&gt;
}&lt;br /&gt;
table.dolbox {&lt;br /&gt;
    margin-top: 0;&lt;br /&gt;
    padding: 10px;&lt;br /&gt;
    border: 2px solid #000;&lt;br /&gt;
    border-radius: 6px;&lt;br /&gt;
}&lt;br /&gt;
table.dolbox tr td {&lt;br /&gt;
    /* border: 1px #f0f0f0 solid; */&lt;br /&gt;
}&lt;br /&gt;
table.dolbox.marginleft {&lt;br /&gt;
    margin-left: 20px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* For title style */&lt;br /&gt;
.mw-body h1, .mw-body-content h1, .mw-body-content h2, .mw-body-content h3, .mw-body-content h4 {&lt;br /&gt;
    font-family: Roboto,Arial,Verdana,Helvetica;&lt;br /&gt;
}&lt;br /&gt;
h1 .mw-headline, .searchresults .mw-headline {&lt;br /&gt;
	color: rgb(0,135,160);&lt;br /&gt;
}&lt;br /&gt;
h2 .mw-headline, .searchresults .mw-headline {&lt;br /&gt;
	color: rgb(0,135,160);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h1#firstHeading {&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    border-bottom: none;&lt;br /&gt;
    margin-top: 0.2em !important;&lt;br /&gt;
    /* text-shadow: 3px 3px 5px #DDD; */&lt;br /&gt;
    color: #220050 !important;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    padding-bottom: 1em;&lt;br /&gt;
}&lt;br /&gt;
.mw-body h1, .mw-body-content h1 {&lt;br /&gt;
    font-size: 1.6em;&lt;br /&gt;
	margin-top: 1.5em;&lt;br /&gt;
}&lt;br /&gt;
.mw-body h2, .mw-body-content h2 {&lt;br /&gt;
    font-size: 1.6em;&lt;br /&gt;
    margin-top: 2.5em;&lt;br /&gt;
    padding-bottom: 0.2em;&lt;br /&gt;
}&lt;br /&gt;
.mw-body h3, .mw-body-content h3 {&lt;br /&gt;
	color: #220050;&lt;br /&gt;
    font-size: 1.3em;&lt;br /&gt;
    padding-bottom: 10px;&lt;br /&gt;
}&lt;br /&gt;
h2 + h3 {&lt;br /&gt;
    padding-top: 10px !important;&lt;br /&gt;
}&lt;br /&gt;
h3 {&lt;br /&gt;
    padding-top: 20px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
div.company {&lt;br /&gt;
        margin-left: 0px;&lt;br /&gt;
        margin-bottom: 40px;&lt;br /&gt;
        margin-top: 30px;&lt;br /&gt;
        background-color: #FBFAFC;&lt;br /&gt;
		-moz-border-radius: 10px;&lt;br /&gt;
		border-radius: 10px;&lt;br /&gt;
		box-shadow: 1px 1px 20px #ccc;&lt;br /&gt;
/*&lt;br /&gt;
		padding-left: 10px;&lt;br /&gt;
		padding-right: 12px;&lt;br /&gt;
*/		&lt;br /&gt;
	padding-left: 20px;&lt;br /&gt;
    padding-right: 20px;&lt;br /&gt;
    padding-top: 15px;&lt;br /&gt;
    padding-bottom: 15px;		&lt;br /&gt;
}&lt;br /&gt;
div.companylogo {&lt;br /&gt;
	text-align: right;&lt;br /&gt;
	margin-right: 15px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* For images / screenshots */&lt;br /&gt;
div.divforimgcentpercent {&lt;br /&gt;
	text-align: center;&lt;br /&gt;
	margin-top: 15px;&lt;br /&gt;
	margin-bottom: 15px;&lt;br /&gt;
}&lt;br /&gt;
div.divforimgcentpercent p a img {&lt;br /&gt;
    width: 90% !important;&lt;br /&gt;
    height: auto !important;&lt;br /&gt;
	box-shadow: 1px 1px 15px #ccc;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Add link to mobile if we are on large display */&lt;br /&gt;
@media (min-width: 1024px) {&lt;br /&gt;
	#footer-places { display: none; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hide some tabs when we don&#039;t have edit permissions */&lt;br /&gt;
body:not(.mw-editable) #ca-nstab-main { display: none; }&lt;br /&gt;
body:not(.mw-editable) #ca-view { display: none; }&lt;br /&gt;
body:not(.mw-editable) #ca-viewsource { display: none; }&lt;br /&gt;
&lt;br /&gt;
#p-views ul li.selected {&lt;br /&gt;
    background: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.vectorTabs, .vectorTabs ul, .vectorTabs li, .vectorTabs #ca-history span, .vectorTabs #ca-watch span {&lt;br /&gt;
    background-image: none;&lt;br /&gt;
}&lt;br /&gt;
.vectorTabs li {&lt;br /&gt;
	line-height: unset;&lt;br /&gt;
}&lt;br /&gt;
	&lt;br /&gt;
/* Allow word wrap */&lt;br /&gt;
pre {&lt;br /&gt;
	word-break: break-word;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
table.dolbox {&lt;br /&gt;
    margin-right: 5px;&lt;br /&gt;
    /* margin-left: 25px; */&lt;br /&gt;
    margin-bottom: 15px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Allow limiting of which header levels are shown in a TOC;&lt;br /&gt;
 * &amp;lt;div class=&amp;quot;toclimit-3&amp;quot;&amp;gt;, for instance, will limit to&lt;br /&gt;
 * showing ==headings== and ===headings=== but no further.&lt;br /&gt;
 * Used in [[Template:TOC]]&lt;br /&gt;
 */&lt;br /&gt;
.toclimit-1 li.toclevel-2,&lt;br /&gt;
.toclimit-1 li.toclevel-3,&lt;br /&gt;
.toclimit-1 li.toclevel-4,&lt;br /&gt;
.toclimit-1 li.toclevel-5,&lt;br /&gt;
.toclimit-1 li.toclevel-6&lt;br /&gt;
{&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wraponmobile {&lt;br /&gt;
	white-space: nowrap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
a#stopMobileRedirectToggle {&lt;br /&gt;
	font-size: 1.3em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wikibox {&lt;br /&gt;
	box-shadow: 2px 2px 10px #bbb;&lt;br /&gt;
	border:unset !important;&lt;br /&gt;
}&lt;br /&gt;
center, center p, .wikibox p {&lt;br /&gt;
    text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
p {&lt;br /&gt;
    text-align: justify;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wikibox {&lt;br /&gt;
text-align: center;&lt;br /&gt;
float:right; &lt;br /&gt;
font-size:80%; &lt;br /&gt;
background: #eef; &lt;br /&gt;
border: 1px solid #ccf; &lt;br /&gt;
margin-bottom: 0px; &lt;br /&gt;
margin-left: 25px; &lt;br /&gt;
margin-right: 25px; &lt;br /&gt;
padding: 1px; &lt;br /&gt;
height: 120px;&lt;br /&gt;
width: 150px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.suggestions-result {&lt;br /&gt;
	line-height: 2em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Test for combo list of lang&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
h3#p-lang-label {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Conteneur */&lt;br /&gt;
#p-lang .vector-menu-content {&lt;br /&gt;
    position: relative;&lt;br /&gt;
    float: left;&lt;br /&gt;
    width: 90%;&lt;br /&gt;
    font-family: sans-serif;&lt;br /&gt;
    padding-top: 5px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Cache la liste par défaut */&lt;br /&gt;
#p-lang .vector-menu-content-list {&lt;br /&gt;
    max-height: 0;&lt;br /&gt;
    overflow: hidden;&lt;br /&gt;
&lt;br /&gt;
    list-style: none;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    top: 100%;&lt;br /&gt;
    left: 0;&lt;br /&gt;
&lt;br /&gt;
    width: 100%;&lt;br /&gt;
&lt;br /&gt;
    background: white;&lt;br /&gt;
    &lt;br /&gt;
    transition: max-height 0.3s ease;&lt;br /&gt;
    z-index: 1000;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Affiche au survol */&lt;br /&gt;
#p-lang .vector-menu-content:hover .vector-menu-content-list {&lt;br /&gt;
    max-height: 500px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Bouton visible */&lt;br /&gt;
#p-lang .vector-menu-content::before {&lt;br /&gt;
    content: &amp;quot;Language ▼&amp;quot;;&lt;br /&gt;
    display: block;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
    font-size: 0.75em;&lt;br /&gt;
    color: #54595d;&lt;br /&gt;
    padding-bottom: 5px;&lt;br /&gt;
    padding-top: 5px;&lt;br /&gt;
    border-bottom: 1px solid #ccc;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Styles des liens */&lt;br /&gt;
#p-lang .vector-menu-content-list li a {&lt;br /&gt;
    display: block;&lt;br /&gt;
    padding: 8px 12px;&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
    color: #333;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#p-lang .vector-menu-content-list li a:hover {&lt;br /&gt;
    background: #eee;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Eldy</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=MediaWiki:Common.css&amp;diff=68402</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=MediaWiki:Common.css&amp;diff=68402"/>
		<updated>2026-10-21T20:42:02Z</updated>

		<summary type="html">&lt;p&gt;Eldy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
&lt;br /&gt;
:root {&lt;br /&gt;
	--pictocolor: rgb(85, 165, 155);	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* We disable the talk tab */&lt;br /&gt;
body:not(.mw-editable) #ca-talk {&lt;br /&gt;
	display:none;&lt;br /&gt;
}&lt;br /&gt;
/* We disable the tab &amp;quot;Page&amp;quot; */&lt;br /&gt;
li#ca-nstab-main, li#ca-nstab-mediawiki {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
#ca-talk, #ca-nstab-user_talk {&lt;br /&gt;
    display: none !important;&lt;br /&gt;
}&lt;br /&gt;
/* we disabe a link w already have into Info on page */&lt;br /&gt;
li#t-whatlinkshere, li#t-recentchangeslinked {&lt;br /&gt;
	display: none !important;&lt;br /&gt;
}&lt;br /&gt;
/* we disable also search entries not used */&lt;br /&gt;
div.oo-ui-labelElement:has(.mw-advancedSearch-namespace-1),&lt;br /&gt;
div.oo-ui-labelElement:has(.mw-advancedSearch-namespace-2),&lt;br /&gt;
div.oo-ui-labelElement:has(.mw-advancedSearch-namespace-3),&lt;br /&gt;
div.oo-ui-labelElement:has(.mw-advancedSearch-namespace-4),&lt;br /&gt;
div.oo-ui-labelElement:has(.mw-advancedSearch-namespace-5),&lt;br /&gt;
div.oo-ui-labelElement:has(.mw-advancedSearch-namespace-7),&lt;br /&gt;
div.oo-ui-labelElement:has(.mw-advancedSearch-namespace-9),&lt;br /&gt;
div.oo-ui-labelElement:has(.mw-advancedSearch-namespace-11),&lt;br /&gt;
div.oo-ui-labelElement:has(.mw-advancedSearch-namespace-12),&lt;br /&gt;
div.oo-ui-labelElement:has(.mw-advancedSearch-namespace-13),&lt;br /&gt;
div.oo-ui-labelElement:has(.mw-advancedSearch-namespace-15),&lt;br /&gt;
div.oo-ui-labelElement:has(.mw-advancedSearch-namespace-16),&lt;br /&gt;
div.oo-ui-labelElement:has(.mw-advancedSearch-namespace-101) {&lt;br /&gt;
	display:none;&lt;br /&gt;
}&lt;br /&gt;
/*&lt;br /&gt;
input#mw-search-ns1, label[for=&amp;quot;mw-search-ns1&amp;quot;], input#mw-search-ns3, label[for=&amp;quot;mw-search-ns3&amp;quot;], input#mw-search-ns5, label[for=&amp;quot;mw-search-ns5&amp;quot;], input#mw-search-ns7, label[for=&amp;quot;mw-search-ns7&amp;quot;],&lt;br /&gt;
input#mw-search-ns9, label[for=&amp;quot;mw-search-ns9&amp;quot;], input#mw-search-ns11, label[for=&amp;quot;mw-search-ns11&amp;quot;], input#mw-search-ns13, label[for=&amp;quot;mw-search-ns13&amp;quot;], input#mw-search-ns15, label[for=&amp;quot;mw-search-ns15&amp;quot;],&lt;br /&gt;
input#mw-search-ns4, label[for=&amp;quot;mw-search-ns4&amp;quot;], input#mw-search-ns12, label[for=&amp;quot;mw-search-ns12&amp;quot;] {&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#pt-anonuserpage, #pt-userpage a {&lt;br /&gt;
    background-image: url(/skins/Vector/images/user-avatar.png?494);&lt;br /&gt;
/*    background-image: linear-gradient(transparent,transparent),url(data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%2220%22 height=%2220%22 viewBox=%220 0 20 20%22%3E %3Cg fill=%22%2384898d%22%3E %3Cpath d=%22M10 11c-5.92 0-8 3-8 5v3h16v-3c0-2-2.08-5-8-5z%22/%3E %3Ccircle cx=%2210%22 cy=%225.5%22 r=%224.5%22/%3E %3C/g%3E %3C/svg%3E); */&lt;br /&gt;
}&lt;br /&gt;
#simpleSearch #searchButton {&lt;br /&gt;
    background-image: url(/skins/Vector/images/search-ltr.png?39f97);&lt;br /&gt;
/*    background-image: linear-gradient(transparent,transparent),url(data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%2212%22 height=%2213%22%3E %3Cg fill=%22none%22 stroke=%22%2394595d%22 stroke-width=%222%22%3E %3Cpath d=%22M11.29 11.71l-4-4%22/%3E %3Ccircle cx=%225%22 cy=%225%22 r=%224%22/%3E %3C/g%3E %3C/svg%3E); */&lt;br /&gt;
}    &lt;br /&gt;
&lt;br /&gt;
/* Hide the wheel on language */&lt;br /&gt;
#p-lang button.uls-settings-trigger.webfonts-changed {&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
label.toctogglelabel {&lt;br /&gt;
    outline: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.toctogglelabel:focus {&lt;br /&gt;
	outline: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-menu-tabs, .vector-menu-tabs a, #mw-head .vector-menu-dropdown h3 {&lt;br /&gt;
	background-image: unset !important;	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#right-navigation ul.vector-menu-content-list a { background: #263c5c !important; }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*.ca-watch */&lt;br /&gt;
#ca-view a, #ca-ve-edit a, #ca-edit a, #ca-history a, #ca-nstab-mediawiki:not(.selected) a, #ca-nstab-main:not(.selected) a {&lt;br /&gt;
	color: #fff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
/*div#mw-head {&lt;br /&gt;
    top: 0;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    z-index: 100;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
}&lt;br /&gt;
a.mw-wiki-logo {&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 0;&lt;br /&gt;
    z-index: 200;&lt;br /&gt;
}*/&lt;br /&gt;
&lt;br /&gt;
.mw-body-content h1 {&lt;br /&gt;
    clear: both;&lt;br /&gt;
}&lt;br /&gt;
.mw-body-content h2 {&lt;br /&gt;
    clear: both;&lt;br /&gt;
}&lt;br /&gt;
.mw-body-content h4 {&lt;br /&gt;
	font-size: 1.1em;&lt;br /&gt;
}&lt;br /&gt;
.mw-body-content h5, .mw-body-content h6 {&lt;br /&gt;
	font-size: 0.9em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media screen and (min-width: 982px) {&lt;br /&gt;
	.mw-body {&lt;br /&gt;
		padding-left: 3em;&lt;br /&gt;
		padding-right: 2.5em;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table.welcometext {&lt;br /&gt;
    position: relative;&lt;br /&gt;
    top: -30px;&lt;br /&gt;
}&lt;br /&gt;
.tdwelcometext {&lt;br /&gt;
	padding: 0 15px; &lt;br /&gt;
	color: #fff; &lt;br /&gt;
	background-color:rgba(70, 3, 62, 0.3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#mw-indicator-mw-helplink {&lt;br /&gt;
	display: none;	&lt;br /&gt;
}&lt;br /&gt;
#mw-panel {&lt;br /&gt;
	padding-left: unset;	&lt;br /&gt;
}&lt;br /&gt;
#mw-panel #p-logo + .portal {&lt;br /&gt;
    margin-top: 1.5em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
span.h2fa {&lt;br /&gt;
    background-color: var(--pictocolor);&lt;br /&gt;
    padding: 12px;&lt;br /&gt;
    margin-right: 5px;&lt;br /&gt;
    border-radius: 50px;&lt;br /&gt;
    color: #fff;&lt;br /&gt;
    text-shadow: none;&lt;br /&gt;
    box-shadow: 1px 1px 5px #ccc;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ul.gallery.mw-gallery-traditional {&lt;br /&gt;
    clear: both;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#content.mw-body {&lt;br /&gt;
	padding-top: 2.55em;&lt;br /&gt;
	border: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#p-views ul li.selected span a {&lt;br /&gt;
    color: #fff !important;&lt;br /&gt;
    text-decoration: underline;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*div#contentSub {&lt;br /&gt;
	display: none;&lt;br /&gt;
}*/&lt;br /&gt;
&lt;br /&gt;
/* Change to have banner dolibarr blue */&lt;br /&gt;
#mw-head-base {&lt;br /&gt;
	    height: 4em;&lt;br /&gt;
}&lt;br /&gt;
#mw-head {&lt;br /&gt;
    background: #263c5c;&lt;br /&gt;
    height: 4em;&lt;br /&gt;
}&lt;br /&gt;
#left-navigation {&lt;br /&gt;
	margin-top: 1.5em;&lt;br /&gt;
}&lt;br /&gt;
#right-navigation {&lt;br /&gt;
	margin-top: 1.5em;&lt;br /&gt;
}&lt;br /&gt;
h3#p-cactions-label span {&lt;br /&gt;
    color: #fff;&lt;br /&gt;
}&lt;br /&gt;
li.selected span a {&lt;br /&gt;
    color: #000 !important;&lt;br /&gt;
}&lt;br /&gt;
ul.menu li a {&lt;br /&gt;
    color: #000 !important;&lt;br /&gt;
}&lt;br /&gt;
div#mw-head li:not(#ca-nstab-main):not(#ca-nstab-mediawiki):not(#ca-nstab-special):not(.selected) a:not(.selected) {&lt;br /&gt;
    color: #fff;&lt;br /&gt;
}&lt;br /&gt;
.vectorTabs span, #mw-head .vectorMenu h3 {&lt;br /&gt;
	background-image: none;&lt;br /&gt;
}&lt;br /&gt;
pt-anonuserpage, #pt-userpage a {&lt;br /&gt;
	background-size: unset;&lt;br /&gt;
    padding-left: 26px !important;&lt;br /&gt;
}&lt;br /&gt;
    &lt;br /&gt;
/* To force some TOC to be on 1 line */&lt;br /&gt;
@media (max-width: 767px) {&lt;br /&gt;
	.tocinline ul li {&lt;br /&gt;
	    display: inline-block;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
@media (min-width: 768px) {&lt;br /&gt;
	.tocinline ul {&lt;br /&gt;
		columns: 2 !important;	&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
@media (min-width: 1024px) {&lt;br /&gt;
	.tocinline ul {&lt;br /&gt;
		columns: 3 !important;	&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
@media (min-width: 1300px) {&lt;br /&gt;
	.tocinline ul {&lt;br /&gt;
		columns: 4 !important;	&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
@media (min-width: 1700px) {&lt;br /&gt;
	.tocinline ul {&lt;br /&gt;
		columns: 5 !important;	&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
.tocinline .toc {&lt;br /&gt;
	display: inline-block !important;&lt;br /&gt;
}&lt;br /&gt;
div#toc {&lt;br /&gt;
    margin-top: 20px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.catlinks {&lt;br /&gt;
	margin-top: 3em;&lt;br /&gt;
	border: none;&lt;br /&gt;
    background: none;&lt;br /&gt;
    font-size: 0.9em;&lt;br /&gt;
}&lt;br /&gt;
.catlinks li a {&lt;br /&gt;
	background-color: #aaa;&lt;br /&gt;
	color: #fff;&lt;br /&gt;
	padding: 5px;&lt;br /&gt;
	border-radius: 5px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#simpleSearch {&lt;br /&gt;
	background-image: none;&lt;br /&gt;
	height: unset;&lt;br /&gt;
	border-radius: 5px;&lt;br /&gt;
	/* padding: 2px; */&lt;br /&gt;
	background-color: #fff !important;	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* The insertInterlangLinks tool should be displayed only in source mode */&lt;br /&gt;
.ve-init-target-visual .oo-ui-tool-name-insertInterlangLinks {&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-search-result-data {&lt;br /&gt;
    color: #888888;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
a.feedlink {&lt;br /&gt;
	background-image: none;&lt;br /&gt;
	padding-left: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.opacitymedium {&lt;br /&gt;
	opacity: 0.5;	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
.vectorTabs li.new a, .vectorTabs li.new a:visited, a.new {&lt;br /&gt;
    color: #a58838;&lt;br /&gt;
}&lt;br /&gt;
*/&lt;br /&gt;
a, a:visited, .vector-menu-portal .vector-menu-content li a:visited, .vector-menu-portal .vector-menu-content li a {&lt;br /&gt;
	color: #048;&lt;br /&gt;
}&lt;br /&gt;
a.external, a.external:visited {&lt;br /&gt;
	color: #048 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.mw-changeslist-legend {&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ul.vector-menu-content-list li#n-Facebook, ul.vector-menu-content-list li#n-LinkedIn, ul.vector-menu-content-list li#n-Twitter, ul.vector-menu-content-list li#n-Youtube {&lt;br /&gt;
    filter: saturate(0.1);&lt;br /&gt;
    opacity: 0.3;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Using logos for social networks links instead of plain text */&lt;br /&gt;
#p-Social_networks .body {&lt;br /&gt;
	text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#p-Social_networks li, nav[aria-labelledby=&amp;quot;p-Social networks-label&amp;quot;] li {&lt;br /&gt;
	display: inline-block;&lt;br /&gt;
	width: 24px;&lt;br /&gt;
	height: 24px;&lt;br /&gt;
	margin: 0 5px !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#p-Social_networks a, nav[aria-labelledby=&amp;quot;p-Social networks-label&amp;quot;] a {&lt;br /&gt;
	direction: ltr;&lt;br /&gt;
	text-indent: -9999px;&lt;br /&gt;
	width: 24px;&lt;br /&gt;
	height: 24px;&lt;br /&gt;
	display: inline-block;&lt;br /&gt;
	background-repeat: no-repeat;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#n-Facebook a {&lt;br /&gt;
	background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAApElEQVRIx2O0ipz+n4GGgImWhg8PC1iIVcjHzcGQE2PBYG0oz8DLw87AxMjIwMDAwGATPZM6FpQm2zI4mivRLogs9GVpG0Qc7Ail0SWrGB49f89ATPom2gJGaJgzMDAwPHz+nmgfMBLKaEeWpuOU+/7jN4Nr8jy8FlCUTD98/kFQDUUWfCTCAoJBBAPIQUUo7VPNB6MWjFpAHwuIzgeD1gdD3wIA0CskwBBfwqYAAAAASUVORK5CYII=);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#n-LinkedIn a {&lt;br /&gt;
	background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAA7EAAAOxAGVKw4bAAABFUlEQVRIx2NkKN/6n4GGgImWhg+cBTmW8gyH0s0ZcizlKbaABV1AQ5SbYYKvJgMTIyODlbwgw547bxhuvP5KPR/8+fcfL59iH9x5+40hafVlhhBdCYY1l18w3Hn7jSILGGmdTFmwCf5r94SzmSq3Y4gJNe5maHJVZQjRlWQQ4mJluPT8M0Pd7lsMO269wTCLrGS6I8mUIcdKgUGCl52BjZmJwUSGn2FTnDGDg5IQdSwwkxVg+Pf/P8Off/8QQcHMxFDlqEwdC3bdfs0g0bKXQahxD8O6Ky8QFssIUMeCrA1XGd58+83w5ddfhqIt1+HiPOzM1LHg3rvvcPajjz8QhjEyUscCUsCoBQNvAc3LoqEfREPfAgDdrVLViTsGJwAAAABJRU5ErkJggg==);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#n-Twitter a {&lt;br /&gt;
	background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAByUlEQVRIx+2Vz0tUURTHP/e9d+c9e9PgD8QhKpyEGAzcSBCDuKhdi8xFtIhAApEW/QOtcm9QQksXRRtx6VorhoJslQpRNOWiQMVAXzk/3q/bOue+8TVguOgsz7n3fODLOecrzjzdUxxhGEfZ/D/gXwBEe4C+jtYfL/WZLF49QeWWy4sxl7F+i15HcHNApgPMlBymBqW2ebHT4NmVDoZ6TCxDcC5n8GjEoTzuYlvQ64jDAd224P6ww+MRhy77zw+3z0ts80ATIZAGlPImO3V1OODtVgTA9YKkPO4yfdGmlDfJSuhJkG+rprj7qs7BrbV0j5e/h1w+bVLImZyUgoliholiBqUUSWvv+fqaFjA5mKGQM5vyQojEufnixdq8VqIn6z5h/Hcn6s1mlB6wsh0x9bLGVy8iTewHisWNID0AIO8aWpl0MffBZ8/X1xIBzz8FzK42aEStpVr9ETG75ifWW56Kh+997pXr/Az0kI+7EXeWawRxco+mKcpKuNYvOZsVjJ6yuNDdLFOsFAuVgAfvGlTD1vI1AX4FsPQt5MaApBoqdhuKXAaqIWx4Ma83I+Y/B1S8mDQh0lmmANpz1pTnun3bPu6GcwwAvwExXIo+zrNKOwAAAABJRU5ErkJggg==);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#n-Youtube a {&lt;br /&gt;
	background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAALy3pUWHRSYXcgcHJvZmlsZSB0eXBlIGV4aWYAAHja5Zhrdtw6DoT/cxWzBBIk+FgOn+fcHczy5wO73XHsJDfO3D9zxrJbslqiSFShUJDb//7ruH/xE3OtLmmpueXs+UktNekcVP/4afcz+HQ/H/+8fRe+P+9eXwinIvv4+Lf05/Wd8/rthtc44/vzrj6/kfoc6PnF24DRniwcrPeT5Lw8zof0HKjtx0Futbyf6pDHfj4vvFN5/sVyh34NYv+79ydSIUpLuSqK7Biiv5/1MYP4+OucCfezcF2ImeMUk7u78pwJAflueW97798H6Lsgvx25j9F/HX0IvvTn+fghlvkZIw5++EXQHwf/hvjdg+NrRvLhC3nD53OQz1n1nP1YXU+ZiOYno7x7i47dw4WDkMd7W2Yr/CnH5W6NrfruJ+AsP/1gm6EFAZXjQgor9HDCvvsZJlNMsgVMRGRKvOcqGDWZ0XBKtoUjJba4YgXLKdvFyGl5zSXc57b7vAnrl1+BSyUwWOCWn27uV19+ZXPnTAtR8PUVK+YlxlymYcjZJ1cBSDhP3PQG+G17wu/f8QeqgqDeMFcW2P14DDE0fONWvDhHrlP2j6wIrqznAISIZyuTIQVS8DlEDTn4IlJCII4VgDozl5hkgEBQlcUkJcWYxRWpYs/mnhLutaKSxU6jTQChZFMBmxY7YKWk8KekCoe6Rk2qmrVoddq055hT1pxzySZyvcSSipZcSqmllV5jTVVrrqXW2mpv0iIaqC230mprrXdxnQd1xupc3zkzZMSRho48yqijjT6hz0xTZ55l1tlmX7LiQiZWXmXV1VbfwW2UYqetO++y6267H7h24klHTz7l1NNOf6H2RPXT9gXUwhM1uUjZdeWFGmddKW9DBJMTNcxATFIA8WIIQGgxzHwNKYkhZ5j5JiSFCpNUw8atYIgBYdpB9IQXdt+Q+y3cnNbfwk3+Djln0P0TyDmg+4zbD1BbVufmReyRhRZTH8m+E2uX6rqMGePR5PmP31A1JLW68rW9++oN/2MDaTxNxga22EKSCLE79VYlzfy8fN4AdvMIP967v7vgd/evgdY+e8oAaBzHbv7sXM6U3qBFa1QNFDFnKCQD39G4rO/RRziaDxTpTs+hZh3Spk+oOUuDisEcwoixnTIwYqtI6kdnIf9Oy2tz4VnznDsQBNY2XCp55ryg07rRqCv90ercn4Rl9H38YOVUPFbU9yzHHfSi75Q7STh1ldPxTYv55zAyq2KtNc3eZ9rphIUd674vgqWzKyrgc1ZF2x3pHOfJo0cqNqm1Ej6h9E5g4ticCroMgFqLhiZL9paRicAVqRhk+NgQMrftQbP13ctsetSCThrLnvNgwJZuhKudSCwj6tFXCWcPX5b0WphAIp8nz4aQEs/m9tKxDSvltXpuA/zCRNMjWUzOL27WiqSYawBH1lXPkoaUtUIlC+JwODWXPe6wvl8eMfOzdJzYUbm2NABzrr0kZarNL0rkUyv8a+8+nvjTves7UydwCSwdvuqsl51LFLnd4m+gDzLHHnTJSuJZp5QT/AnobiRGSB8zKpftMZ8eiLisuSbKu+vyjfBg6KkC2tIpEtelkA2N1Pc7+DyD7DrLHcubqVpaX0F3TR1jmPaexwxB3Z34g6pHl8vZS5nBaFJsbhPShOULCVKSG4E6Z/zUWoaHnpvlxZV3rpc/gaXbXherlMBMcleQzLsetfkXTiw9jtHJubYw/dCXUQcpKxTQMI+QzeQedGFlkH9O8sIGrWU3tGBUoUTE3XdLTmNteZwRt56NwXyqRywDkaMFUqpaISeGrZ4rUAyNBfmrS1ukEqbmR8qDGVEJr0DAHJMjZfUIBULk5waU0V960H9BAvdF1vyULO5rbOmRFLNRj/pT06cZxUVKt4qFgAoV+f9uwGz/bTIKLpwT98lqZ8qMF0+8pE8Lo5XHIp1mOuhR3gguVcTXTuUoatpAwvsEM2iBOe6hzcygcYx89gaUdIdz9dT7xIKkVaxBn/nQNk6TONxGSJ0Oq9Y0UBkEYStsUMsEgKbz2LiEnSGnQ5gKDoJOgdoxYzDp92OB8aq7SB/zsYxi6ZGoNDgUbp/jNJMLItBDQXlcommZ1tLGvXfBhq10BhRAepAj3R51HZip2TbyUc2VKxSbRXL3R/A0aSWt21WN6WSRR/xt+9MCiY8CY+hMUJDsIuHMaRmjcx3DfQM9n+MWTRN30nwmkHnSppAOvToKhA06Voo7fH4e1YOWeuL6tBJqCgWpchnTMVkHhuHcUlvJSWq7VB6VcuXWEPCLdHS+jBbIzEUrh+8LC27ugvJYpOsl7jYk1q7doOz0awXPmWkty8KN+J0qPrEnS92JPI9398ND7obVlJvEyqSmtaxI09+6ujZm3Gi+U4lrRPDADXZoSrCsU7s+vd05jE1JuCUVv6GCKpn77fje7DJn4e5WK64RiS1pkRe0XZQyAxevgZOGQP0ONixfr9SM0vMZNVKo/CoujNojZpbKBo+pivAwmTKxpDQL5t3jYgKjIZmKlpmWRqKHaykEloSixk3aLFNoaUyU7GaeBEpYcm/rzaTl61LUXqH8Yu/s4GeMSS/5sc5o36W9JCiA3Zaw5bIQhTSPjaGwYXWThta7fH4iuoDHV4E4I4ZMZ5+jzRbakttqVYR7sSqL1mWsUnOmGhDcOlF2yhokTB61WPi8h/wlJPphEE+1jB4boTiVXgSfg8EJxTqaFebAB6A8cfJM8zsrlOlhkHhhbU8GWCdN82JkNQfM3lEcNynGHbduJgZRepRUNjMN1ruEttCvfMixlqA9tSosWraCdcNeMAmxpoY8QDkblGFio+HCBo2dlLXMZ2KIsDAbdRKzLYpGUtlv8PGgdDqAY7WcGcELinGgDMMmLFxO1Hw6+s1l2VsRi3sRt0P7dtDKnaBryhTx2C3ek2QYOXiXaasYMfWs0rIQ6xaGfNnVTId7aVdYrnAm86jP4tHeSxW/52cUugxyLOUXFLL14HoYBGQMb7n5tteFpjZym1417wOP6B7TAQlkkV4Q7qQ6KQfbYEVO1lsF/ThjCpzS3fab2iytYb2lrYbMloZLCIsvJ4UUU9B8FRihaAO16lEzSJQNohb8a3PmfqSOg37gg2tFnxKms2CWIkYDpwJxEnp5pU479xerRDtRiZgh+Js7a1MOJSMQozOwtP7JDbIDfo5tQoHUQSF6XKhEh7MwVdI9BXo11LtRqikTaGUkxMFpKFTMFGDwsxe07Td048PepV/piM7vvW19CO6PCpP7VpnoI5DPaN1fVFIXK5hGptBBaHuPmJOnkKIHlf50TcugjSGhHK/dwh0oYoEgBiUc1oR4vS1m4vYjeNtoyasdU4m3hZF9IQlUlzjXY4ZmJlyivpRVszyNBfPBjmw8K/kOsvZOZna4l+pmdbheLPICLmwrRoGGheHJLvwRzkUpHJ5pFrRfzHvGVlIdwI2q1SNwasdmSQ5sZ2A7zXNhhXkQLSmtVXJLIGB5BzpJMRLGe9MGbKuTGf9iNqWR8VAImAGch9NvQUqcmRUMmuPE4yZtHBMPy2o7Llcoxb5PCtZvmxT3m66FKkoIKW6YJ2YGX3BkuH8kbA4RpdICPkICtUGmkkpjxmEKfZoxivK6kyUPHiHgKcKkj1zeGgk6lLgoWIJ5LNNFEmYDRYI0/DQGxg7Yizaa/2AKXSMZtGNFiPSsYSpItetNbp+08MnWA7tGdxAb4jTwD2dikiiyUotMmliEDM5ZP/Du5QTNd2o5AHUfmCfybWJs3Az04TmarcXNKE0KhI1Pvc5kaZNccRAUfLoiW1zGa6r5Z8oemmcA1XAc7gG9WdgtPAKduRUMusDVEJ1ubyaIq1hu/qiRfbd3/00jG3Eyk+bZst1tCGgZiNLiFtYg3a2RH+fRxaO5gxXRwadIH+IllED7fhv8Yas+V7kawdaFLTiPbO4HjR6tlIDm0anj6e0Nxq1dgncgj+5kWugfX2y5f+jN2OeBQiSzx65YsZK9GUqsmXoqgfzyBaP7Bybz/zwQPggD9R/NVVyqvaZxNAAAAYRpQ0NQSUNDIHByb2ZpbGUAAHicfZE9SMNAHMVfU6WilSJ2EHHIUJ1aEBVx1CoUoUKoFVp1MLn0C5o0JCkujoJrwcGPxaqDi7OuDq6CIPgB4uTopOgiJf4vKbSI9eC4H+/uPe7eAUK9zDSraxzQdNtMJeJiJrsqBl7RhwGEEIUoM8uYk6QkOo6ve/j4ehfjWZ3P/Tn61ZzFAJ9IPMsM0ybeIJ7etA3O+8RhVpRV4nPiqEkXJH7kuuLxG+eCywLPDJvp1DxxmFgstLHSxqxoasRTxBFV0ylfyHisct7irJWrrHlP/sJgTl9Z5jrNESSwiCVIEKGgihLKsBGjVSfFQor24x38w65fIpdCrhIYORZQgQbZ9YP/we9urfzkhJcUjAPdL47zMQoEdoFGzXG+jx2ncQL4n4ErveWv1IGZT9JrLS1yBIS2gYvrlqbsAZc7wNCTIZuyK/lpCvk88H5G35QFBm+B3jWvt+Y+Th+ANHWVvAEODoGxAmWvd3h3T3tv/55p9vcDk4xytG+447oAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfkCxEPLC9HyOMVAAACHklEQVRIx7WVP2hTURTGf/fmpaUxqQYjSbeAmqDSTralYMEOHZqpJeoiSNFBEdIODiIuHbQ4SlucOzjXLYh/aMTFQhFdSugfaCglCU1CheQ1pMm7DkkxkDSS99JveVzOu9+533fOPVesAgqQMAVEgGHAgTnowBqwCHxQgPgK2OAtMEtnsQDMilWYErBilkXVvqJ5OKyJqi2mIVqHI7LmeePG3t50B2walqcV9Pz4uN/m978QDoduIUGPiP2zsUHEpelpjvb2PPrGxmsjm31IqaS1m0G2Ct5YXsbucmU+J5OPu/v7A7KvL4qURls1aqXgdt3iHXBN0+gKBEYrudy8kUrdsqygHk+BsXIZVzD43UilRu3B4D3hdsc7pqAeXo+HjyMjCKXs+Xj8USWZfKUKhYsdS1B/B35OTFDO5y8UE4kZI5N5rnTdYcqipv7abNXTSSkBuyqXG/g0M8TXvV7eDwyAlF369vaTyv7+nNJ1d7N/tXZHwK9QiGw0ytHu7v3ywcGcOjy80uow2v+G2AmWgMtAYWdnzO71vjne2hqy1KYnCn6Hw9wFbg4OXj3n83063tz8YqTTQ5YvmgDhnpykmEr5ionEvJHNPqBUsrVbr1MtcoZCjj/r68+MXO6l0vVu0+M8Vn3mehoCTmdG5fMei+O6KIEfTYtsnRxgTdYa5KywIKm+x4tnQL4ErMhaC80AYSAGFK14DnwD7gARBfwFJz6znZ0PWkwAAAAASUVORK5CYII=);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Add by LDR to hide the footer, the link discussion and menu entry we don&#039;t want */&lt;br /&gt;
footer#footer { display: none; }&lt;br /&gt;
#footer-info { display: none; }&lt;br /&gt;
#pt-mytalk { display: none; }&lt;br /&gt;
#t-permalink { display: none; }&lt;br /&gt;
#footer-places-mobileview { font-size: 1.3em !important; }&lt;br /&gt;
&lt;br /&gt;
/* Add by LDR to hide the title on main pages */&lt;br /&gt;
/*&lt;br /&gt;
body.page-Home.action-view h1.firstHeading, body.page-Main_Page.action-submit h1.firstHeading { display: none; padding-bottom: 0 !important;}&lt;br /&gt;
body.page-Main_Page.action-view h1.firstHeading, body.page-Main_Page.action-submit h1.firstHeading { display: none; padding-bottom: 0 !important;}&lt;br /&gt;
body.page-Accueil.action-view h1.firstHeading, body.page-Accueil.action-submit h1.firstHeading { display: none; padding-bottom: 0 !important; }&lt;br /&gt;
body.page-Portada.action-view h1.firstHeading, body.page-Portada.action-submit h1.firstHeading { display: none; padding-bottom: 0 !important; }&lt;br /&gt;
body.page-Hauptseite.action-view h1.firstHeading, body.page-Hauptseite.action-submit h1.firstHeading { display: none; padding-bottom: 0 !important; }&lt;br /&gt;
body.page-Αρχική.action-view h1.firstHeading, body.page-Αρχική.action-submit h1.firstHeading { display: none; padding-bottom: 0 !important; }&lt;br /&gt;
body.page-Página_Principal.action-view h1.firstHeading, body.page-Página_Principal.action-submit h1.firstHeading { display: none; padding-bottom: 0 !important; }&lt;br /&gt;
body.page-简体中文官方文档.action-view h1.firstHeading, body.page-简体中文官方文档.action-submit h1.firstHeading { display: none; padding-bottom: 0 !important; }&lt;br /&gt;
body.page-ホームページ.action-view h1.firstHeading, body.page-ホームページ.action-submit h1.firstHeading { display: none; padding-bottom: 0 !important; }&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
/* Add by LDR to reduce size of logo */&lt;br /&gt;
#p-logo a { height: 60px; }&lt;br /&gt;
.mw-wiki-logo {&lt;br /&gt;
    background-size: contain;&lt;br /&gt;
    margin-top: 0.5em;&lt;br /&gt;
    background-image: url(/images/5/51/Dolibarr_124x124_white.svg);&lt;br /&gt;
}&lt;br /&gt;
#p-logo {&lt;br /&gt;
    height: 60px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Add LDR to increase font size */&lt;br /&gt;
html, body {&lt;br /&gt;
  font-size: 1.1em;&lt;br /&gt;
  font-family: Roboto,Arial,Verdana,Helvetica;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body-content .dolbox p {&lt;br /&gt;
	margin: 0px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h2:not(#mw-toc-heading) {&lt;br /&gt;
    background-image: linear-gradient(120deg, rgb(38, 60, 92, 0.3) 0%, rgba(140, 100, 152, 1) 100%);&lt;br /&gt;
    background-repeat: no-repeat;&lt;br /&gt;
    background-size: 100px 0.2em;&lt;br /&gt;
    background-position: 0 90%;&lt;br /&gt;
    padding-bottom: 20px !important;&lt;br /&gt;
    border-bottom: none;&lt;br /&gt;
}&lt;br /&gt;
h2 + table.dolbox {&lt;br /&gt;
    margin-top: 25px;&lt;br /&gt;
}&lt;br /&gt;
table.dolbox {&lt;br /&gt;
    margin-top: 0;&lt;br /&gt;
    padding: 10px;&lt;br /&gt;
    border: 2px solid #000;&lt;br /&gt;
    border-radius: 6px;&lt;br /&gt;
}&lt;br /&gt;
table.dolbox tr td {&lt;br /&gt;
    /* border: 1px #f0f0f0 solid; */&lt;br /&gt;
}&lt;br /&gt;
table.dolbox.marginleft {&lt;br /&gt;
    margin-left: 20px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* For title style */&lt;br /&gt;
.mw-body h1, .mw-body-content h1, .mw-body-content h2, .mw-body-content h3, .mw-body-content h4 {&lt;br /&gt;
    font-family: Roboto,Arial,Verdana,Helvetica;&lt;br /&gt;
}&lt;br /&gt;
h1 .mw-headline, .searchresults .mw-headline {&lt;br /&gt;
	color: rgb(0,135,160);&lt;br /&gt;
}&lt;br /&gt;
h2 .mw-headline, .searchresults .mw-headline {&lt;br /&gt;
	color: rgb(0,135,160);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h1#firstHeading {&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    border-bottom: none;&lt;br /&gt;
    margin-top: 0.2em !important;&lt;br /&gt;
    /* text-shadow: 3px 3px 5px #DDD; */&lt;br /&gt;
    color: #220050 !important;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    padding-bottom: 1em;&lt;br /&gt;
}&lt;br /&gt;
.mw-body h1, .mw-body-content h1 {&lt;br /&gt;
    font-size: 1.6em;&lt;br /&gt;
	margin-top: 1.5em;&lt;br /&gt;
}&lt;br /&gt;
.mw-body h2, .mw-body-content h2 {&lt;br /&gt;
    font-size: 1.6em;&lt;br /&gt;
    margin-top: 2.5em;&lt;br /&gt;
    padding-bottom: 0.2em;&lt;br /&gt;
}&lt;br /&gt;
.mw-body h3, .mw-body-content h3 {&lt;br /&gt;
	color: #220050;&lt;br /&gt;
    font-size: 1.3em;&lt;br /&gt;
    padding-bottom: 10px;&lt;br /&gt;
}&lt;br /&gt;
h2 + h3 {&lt;br /&gt;
    padding-top: 10px !important;&lt;br /&gt;
}&lt;br /&gt;
h3 {&lt;br /&gt;
    padding-top: 20px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
div.company {&lt;br /&gt;
        margin-left: 0px;&lt;br /&gt;
        margin-bottom: 40px;&lt;br /&gt;
        margin-top: 30px;&lt;br /&gt;
        background-color: #FBFAFC;&lt;br /&gt;
		-moz-border-radius: 10px;&lt;br /&gt;
		border-radius: 10px;&lt;br /&gt;
		box-shadow: 1px 1px 20px #ccc;&lt;br /&gt;
/*&lt;br /&gt;
		padding-left: 10px;&lt;br /&gt;
		padding-right: 12px;&lt;br /&gt;
*/		&lt;br /&gt;
	padding-left: 20px;&lt;br /&gt;
    padding-right: 20px;&lt;br /&gt;
    padding-top: 15px;&lt;br /&gt;
    padding-bottom: 15px;		&lt;br /&gt;
}&lt;br /&gt;
div.companylogo {&lt;br /&gt;
	text-align: right;&lt;br /&gt;
	margin-right: 15px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* For images / screenshots */&lt;br /&gt;
div.divforimgcentpercent {&lt;br /&gt;
	text-align: center;&lt;br /&gt;
	margin-top: 15px;&lt;br /&gt;
	margin-bottom: 15px;&lt;br /&gt;
}&lt;br /&gt;
div.divforimgcentpercent p a img {&lt;br /&gt;
    width: 90% !important;&lt;br /&gt;
    height: auto !important;&lt;br /&gt;
	box-shadow: 1px 1px 15px #ccc;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Add link to mobile if we are on large display */&lt;br /&gt;
@media (min-width: 1024px) {&lt;br /&gt;
	#footer-places { display: none; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hide some tabs when we don&#039;t have edit permissions */&lt;br /&gt;
body:not(.mw-editable) #ca-nstab-main { display: none; }&lt;br /&gt;
body:not(.mw-editable) #ca-view { display: none; }&lt;br /&gt;
body:not(.mw-editable) #ca-viewsource { display: none; }&lt;br /&gt;
&lt;br /&gt;
#p-views ul li.selected {&lt;br /&gt;
    background: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.vectorTabs, .vectorTabs ul, .vectorTabs li, .vectorTabs #ca-history span, .vectorTabs #ca-watch span {&lt;br /&gt;
    background-image: none;&lt;br /&gt;
}&lt;br /&gt;
.vectorTabs li {&lt;br /&gt;
	line-height: unset;&lt;br /&gt;
}&lt;br /&gt;
	&lt;br /&gt;
/* Allow word wrap */&lt;br /&gt;
pre {&lt;br /&gt;
	word-break: break-word;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
table.dolbox {&lt;br /&gt;
    margin-right: 5px;&lt;br /&gt;
    /* margin-left: 25px; */&lt;br /&gt;
    margin-bottom: 15px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Allow limiting of which header levels are shown in a TOC;&lt;br /&gt;
 * &amp;lt;div class=&amp;quot;toclimit-3&amp;quot;&amp;gt;, for instance, will limit to&lt;br /&gt;
 * showing ==headings== and ===headings=== but no further.&lt;br /&gt;
 * Used in [[Template:TOC]]&lt;br /&gt;
 */&lt;br /&gt;
.toclimit-1 li.toclevel-2,&lt;br /&gt;
.toclimit-1 li.toclevel-3,&lt;br /&gt;
.toclimit-1 li.toclevel-4,&lt;br /&gt;
.toclimit-1 li.toclevel-5,&lt;br /&gt;
.toclimit-1 li.toclevel-6&lt;br /&gt;
{&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wraponmobile {&lt;br /&gt;
	white-space: nowrap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
a#stopMobileRedirectToggle {&lt;br /&gt;
	font-size: 1.3em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wikibox {&lt;br /&gt;
	box-shadow: 2px 2px 10px #bbb;&lt;br /&gt;
	border:unset !important;&lt;br /&gt;
}&lt;br /&gt;
center, center p, .wikibox p {&lt;br /&gt;
    text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
p {&lt;br /&gt;
    text-align: justify;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wikibox {&lt;br /&gt;
text-align: center;&lt;br /&gt;
float:right; &lt;br /&gt;
font-size:80%; &lt;br /&gt;
background: #eef; &lt;br /&gt;
border: 1px solid #ccf; &lt;br /&gt;
margin-bottom: 0px; &lt;br /&gt;
margin-left: 25px; &lt;br /&gt;
margin-right: 25px; &lt;br /&gt;
padding: 1px; &lt;br /&gt;
height: 120px;&lt;br /&gt;
width: 150px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.suggestions-result {&lt;br /&gt;
	line-height: 2em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Test for combo list of lang&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
h3#p-lang-label {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Conteneur */&lt;br /&gt;
#p-lang .vector-menu-content {&lt;br /&gt;
    position: relative;&lt;br /&gt;
    float: left;&lt;br /&gt;
    width: 90%;&lt;br /&gt;
    font-family: sans-serif;&lt;br /&gt;
    padding-top: 5px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Cache la liste par défaut */&lt;br /&gt;
#p-lang .vector-menu-content-list {&lt;br /&gt;
    max-height: 0;&lt;br /&gt;
    overflow: hidden;&lt;br /&gt;
&lt;br /&gt;
    list-style: none;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    top: 100%;&lt;br /&gt;
    left: 0;&lt;br /&gt;
&lt;br /&gt;
    width: 100%;&lt;br /&gt;
&lt;br /&gt;
    background: white;&lt;br /&gt;
    &lt;br /&gt;
    transition: max-height 0.3s ease;&lt;br /&gt;
    z-index: 1000;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Affiche au survol */&lt;br /&gt;
#p-lang .vector-menu-content:hover .vector-menu-content-list {&lt;br /&gt;
    max-height: 500px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Bouton visible */&lt;br /&gt;
#p-lang .vector-menu-content::before {&lt;br /&gt;
    content: &amp;quot;Language ▼&amp;quot;;&lt;br /&gt;
    display: block;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
    font-size: 0.75em;&lt;br /&gt;
    color: #54595d;&lt;br /&gt;
    padding-bottom: 5px;&lt;br /&gt;
    padding-top: 5px;&lt;br /&gt;
    border-bottom: 1px solid #ccc;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Styles des liens */&lt;br /&gt;
#p-lang .vector-menu-content-list li a {&lt;br /&gt;
    display: block;&lt;br /&gt;
    padding: 8px 12px;&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
    color: #333;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#p-lang .vector-menu-content-list li a:hover {&lt;br /&gt;
    background: #eee;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Eldy</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=MediaWiki:Common.css&amp;diff=68401</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=MediaWiki:Common.css&amp;diff=68401"/>
		<updated>2026-10-21T20:41:37Z</updated>

		<summary type="html">&lt;p&gt;Eldy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
&lt;br /&gt;
:root {&lt;br /&gt;
	--pictocolor: rgb(85, 165, 155);	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* We disable the talk tab */&lt;br /&gt;
body:not(.mw-editable) #ca-talk {&lt;br /&gt;
	display:none;&lt;br /&gt;
}&lt;br /&gt;
/* We disable the tab &amp;quot;Page&amp;quot; */&lt;br /&gt;
li#ca-nstab-main, li#ca-nstab-mediawiki {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
#ca-talk, #ca-nstab-user_talk {&lt;br /&gt;
    display: none !important;&lt;br /&gt;
}&lt;br /&gt;
/* we disabe a link w already have into Info on page */&lt;br /&gt;
li#t-whatlinkshere, li#t-recentchangeslinked {&lt;br /&gt;
	display: none !important;&lt;br /&gt;
}&lt;br /&gt;
/* we disable also search entries not used */&lt;br /&gt;
div.oo-ui-labelElement:has(.mw-advancedSearch-namespace-1),&lt;br /&gt;
div.oo-ui-labelElement:has(.mw-advancedSearch-namespace-2),&lt;br /&gt;
div.oo-ui-labelElement:has(.mw-advancedSearch-namespace-3),&lt;br /&gt;
div.oo-ui-labelElement:has(.mw-advancedSearch-namespace-4),&lt;br /&gt;
div.oo-ui-labelElement:has(.mw-advancedSearch-namespace-5),&lt;br /&gt;
div.oo-ui-labelElement:has(.mw-advancedSearch-namespace-7),&lt;br /&gt;
div.oo-ui-labelElement:has(.mw-advancedSearch-namespace-9),&lt;br /&gt;
div.oo-ui-labelElement:has(.mw-advancedSearch-namespace-11),&lt;br /&gt;
div.oo-ui-labelElement:has(.mw-advancedSearch-namespace-12),&lt;br /&gt;
div.oo-ui-labelElement:has(.mw-advancedSearch-namespace-13),&lt;br /&gt;
div.oo-ui-labelElement:has(.mw-advancedSearch-namespace-15),&lt;br /&gt;
div.oo-ui-labelElement:has(.mw-advancedSearch-namespace-16),&lt;br /&gt;
div.oo-ui-labelElement:has(.mw-advancedSearch-namespace-101) {&lt;br /&gt;
	display:none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
input#mw-search-ns1, label[for=&amp;quot;mw-search-ns1&amp;quot;], input#mw-search-ns3, label[for=&amp;quot;mw-search-ns3&amp;quot;], input#mw-search-ns5, label[for=&amp;quot;mw-search-ns5&amp;quot;], input#mw-search-ns7, label[for=&amp;quot;mw-search-ns7&amp;quot;],&lt;br /&gt;
input#mw-search-ns9, label[for=&amp;quot;mw-search-ns9&amp;quot;], input#mw-search-ns11, label[for=&amp;quot;mw-search-ns11&amp;quot;], input#mw-search-ns13, label[for=&amp;quot;mw-search-ns13&amp;quot;], input#mw-search-ns15, label[for=&amp;quot;mw-search-ns15&amp;quot;],&lt;br /&gt;
input#mw-search-ns4, label[for=&amp;quot;mw-search-ns4&amp;quot;], input#mw-search-ns12, label[for=&amp;quot;mw-search-ns12&amp;quot;] {&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#pt-anonuserpage, #pt-userpage a {&lt;br /&gt;
    background-image: url(/skins/Vector/images/user-avatar.png?494);&lt;br /&gt;
/*    background-image: linear-gradient(transparent,transparent),url(data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%2220%22 height=%2220%22 viewBox=%220 0 20 20%22%3E %3Cg fill=%22%2384898d%22%3E %3Cpath d=%22M10 11c-5.92 0-8 3-8 5v3h16v-3c0-2-2.08-5-8-5z%22/%3E %3Ccircle cx=%2210%22 cy=%225.5%22 r=%224.5%22/%3E %3C/g%3E %3C/svg%3E); */&lt;br /&gt;
}&lt;br /&gt;
#simpleSearch #searchButton {&lt;br /&gt;
    background-image: url(/skins/Vector/images/search-ltr.png?39f97);&lt;br /&gt;
/*    background-image: linear-gradient(transparent,transparent),url(data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%2212%22 height=%2213%22%3E %3Cg fill=%22none%22 stroke=%22%2394595d%22 stroke-width=%222%22%3E %3Cpath d=%22M11.29 11.71l-4-4%22/%3E %3Ccircle cx=%225%22 cy=%225%22 r=%224%22/%3E %3C/g%3E %3C/svg%3E); */&lt;br /&gt;
}    &lt;br /&gt;
&lt;br /&gt;
/* Hide the wheel on language */&lt;br /&gt;
#p-lang button.uls-settings-trigger.webfonts-changed {&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
label.toctogglelabel {&lt;br /&gt;
    outline: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.toctogglelabel:focus {&lt;br /&gt;
	outline: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-menu-tabs, .vector-menu-tabs a, #mw-head .vector-menu-dropdown h3 {&lt;br /&gt;
	background-image: unset !important;	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#right-navigation ul.vector-menu-content-list a { background: #263c5c !important; }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*.ca-watch */&lt;br /&gt;
#ca-view a, #ca-ve-edit a, #ca-edit a, #ca-history a, #ca-nstab-mediawiki:not(.selected) a, #ca-nstab-main:not(.selected) a {&lt;br /&gt;
	color: #fff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
/*div#mw-head {&lt;br /&gt;
    top: 0;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    z-index: 100;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
}&lt;br /&gt;
a.mw-wiki-logo {&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 0;&lt;br /&gt;
    z-index: 200;&lt;br /&gt;
}*/&lt;br /&gt;
&lt;br /&gt;
.mw-body-content h1 {&lt;br /&gt;
    clear: both;&lt;br /&gt;
}&lt;br /&gt;
.mw-body-content h2 {&lt;br /&gt;
    clear: both;&lt;br /&gt;
}&lt;br /&gt;
.mw-body-content h4 {&lt;br /&gt;
	font-size: 1.1em;&lt;br /&gt;
}&lt;br /&gt;
.mw-body-content h5, .mw-body-content h6 {&lt;br /&gt;
	font-size: 0.9em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media screen and (min-width: 982px) {&lt;br /&gt;
	.mw-body {&lt;br /&gt;
		padding-left: 3em;&lt;br /&gt;
		padding-right: 2.5em;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table.welcometext {&lt;br /&gt;
    position: relative;&lt;br /&gt;
    top: -30px;&lt;br /&gt;
}&lt;br /&gt;
.tdwelcometext {&lt;br /&gt;
	padding: 0 15px; &lt;br /&gt;
	color: #fff; &lt;br /&gt;
	background-color:rgba(70, 3, 62, 0.3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#mw-indicator-mw-helplink {&lt;br /&gt;
	display: none;	&lt;br /&gt;
}&lt;br /&gt;
#mw-panel {&lt;br /&gt;
	padding-left: unset;	&lt;br /&gt;
}&lt;br /&gt;
#mw-panel #p-logo + .portal {&lt;br /&gt;
    margin-top: 1.5em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
span.h2fa {&lt;br /&gt;
    background-color: var(--pictocolor);&lt;br /&gt;
    padding: 12px;&lt;br /&gt;
    margin-right: 5px;&lt;br /&gt;
    border-radius: 50px;&lt;br /&gt;
    color: #fff;&lt;br /&gt;
    text-shadow: none;&lt;br /&gt;
    box-shadow: 1px 1px 5px #ccc;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ul.gallery.mw-gallery-traditional {&lt;br /&gt;
    clear: both;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#content.mw-body {&lt;br /&gt;
	padding-top: 2.55em;&lt;br /&gt;
	border: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#p-views ul li.selected span a {&lt;br /&gt;
    color: #fff !important;&lt;br /&gt;
    text-decoration: underline;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*div#contentSub {&lt;br /&gt;
	display: none;&lt;br /&gt;
}*/&lt;br /&gt;
&lt;br /&gt;
/* Change to have banner dolibarr blue */&lt;br /&gt;
#mw-head-base {&lt;br /&gt;
	    height: 4em;&lt;br /&gt;
}&lt;br /&gt;
#mw-head {&lt;br /&gt;
    background: #263c5c;&lt;br /&gt;
    height: 4em;&lt;br /&gt;
}&lt;br /&gt;
#left-navigation {&lt;br /&gt;
	margin-top: 1.5em;&lt;br /&gt;
}&lt;br /&gt;
#right-navigation {&lt;br /&gt;
	margin-top: 1.5em;&lt;br /&gt;
}&lt;br /&gt;
h3#p-cactions-label span {&lt;br /&gt;
    color: #fff;&lt;br /&gt;
}&lt;br /&gt;
li.selected span a {&lt;br /&gt;
    color: #000 !important;&lt;br /&gt;
}&lt;br /&gt;
ul.menu li a {&lt;br /&gt;
    color: #000 !important;&lt;br /&gt;
}&lt;br /&gt;
div#mw-head li:not(#ca-nstab-main):not(#ca-nstab-mediawiki):not(#ca-nstab-special):not(.selected) a:not(.selected) {&lt;br /&gt;
    color: #fff;&lt;br /&gt;
}&lt;br /&gt;
.vectorTabs span, #mw-head .vectorMenu h3 {&lt;br /&gt;
	background-image: none;&lt;br /&gt;
}&lt;br /&gt;
pt-anonuserpage, #pt-userpage a {&lt;br /&gt;
	background-size: unset;&lt;br /&gt;
    padding-left: 26px !important;&lt;br /&gt;
}&lt;br /&gt;
    &lt;br /&gt;
/* To force some TOC to be on 1 line */&lt;br /&gt;
@media (max-width: 767px) {&lt;br /&gt;
	.tocinline ul li {&lt;br /&gt;
	    display: inline-block;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
@media (min-width: 768px) {&lt;br /&gt;
	.tocinline ul {&lt;br /&gt;
		columns: 2 !important;	&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
@media (min-width: 1024px) {&lt;br /&gt;
	.tocinline ul {&lt;br /&gt;
		columns: 3 !important;	&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
@media (min-width: 1300px) {&lt;br /&gt;
	.tocinline ul {&lt;br /&gt;
		columns: 4 !important;	&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
@media (min-width: 1700px) {&lt;br /&gt;
	.tocinline ul {&lt;br /&gt;
		columns: 5 !important;	&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
.tocinline .toc {&lt;br /&gt;
	display: inline-block !important;&lt;br /&gt;
}&lt;br /&gt;
div#toc {&lt;br /&gt;
    margin-top: 20px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.catlinks {&lt;br /&gt;
	margin-top: 3em;&lt;br /&gt;
	border: none;&lt;br /&gt;
    background: none;&lt;br /&gt;
    font-size: 0.9em;&lt;br /&gt;
}&lt;br /&gt;
.catlinks li a {&lt;br /&gt;
	background-color: #aaa;&lt;br /&gt;
	color: #fff;&lt;br /&gt;
	padding: 5px;&lt;br /&gt;
	border-radius: 5px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#simpleSearch {&lt;br /&gt;
	background-image: none;&lt;br /&gt;
	height: unset;&lt;br /&gt;
	border-radius: 5px;&lt;br /&gt;
	/* padding: 2px; */&lt;br /&gt;
	background-color: #fff !important;	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* The insertInterlangLinks tool should be displayed only in source mode */&lt;br /&gt;
.ve-init-target-visual .oo-ui-tool-name-insertInterlangLinks {&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-search-result-data {&lt;br /&gt;
    color: #888888;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
a.feedlink {&lt;br /&gt;
	background-image: none;&lt;br /&gt;
	padding-left: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.opacitymedium {&lt;br /&gt;
	opacity: 0.5;	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
.vectorTabs li.new a, .vectorTabs li.new a:visited, a.new {&lt;br /&gt;
    color: #a58838;&lt;br /&gt;
}&lt;br /&gt;
*/&lt;br /&gt;
a, a:visited, .vector-menu-portal .vector-menu-content li a:visited, .vector-menu-portal .vector-menu-content li a {&lt;br /&gt;
	color: #048;&lt;br /&gt;
}&lt;br /&gt;
a.external, a.external:visited {&lt;br /&gt;
	color: #048 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.mw-changeslist-legend {&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ul.vector-menu-content-list li#n-Facebook, ul.vector-menu-content-list li#n-LinkedIn, ul.vector-menu-content-list li#n-Twitter, ul.vector-menu-content-list li#n-Youtube {&lt;br /&gt;
    filter: saturate(0.1);&lt;br /&gt;
    opacity: 0.3;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Using logos for social networks links instead of plain text */&lt;br /&gt;
#p-Social_networks .body {&lt;br /&gt;
	text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#p-Social_networks li, nav[aria-labelledby=&amp;quot;p-Social networks-label&amp;quot;] li {&lt;br /&gt;
	display: inline-block;&lt;br /&gt;
	width: 24px;&lt;br /&gt;
	height: 24px;&lt;br /&gt;
	margin: 0 5px !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#p-Social_networks a, nav[aria-labelledby=&amp;quot;p-Social networks-label&amp;quot;] a {&lt;br /&gt;
	direction: ltr;&lt;br /&gt;
	text-indent: -9999px;&lt;br /&gt;
	width: 24px;&lt;br /&gt;
	height: 24px;&lt;br /&gt;
	display: inline-block;&lt;br /&gt;
	background-repeat: no-repeat;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#n-Facebook a {&lt;br /&gt;
	background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAApElEQVRIx2O0ipz+n4GGgImWhg8PC1iIVcjHzcGQE2PBYG0oz8DLw87AxMjIwMDAwGATPZM6FpQm2zI4mivRLogs9GVpG0Qc7Ail0SWrGB49f89ATPom2gJGaJgzMDAwPHz+nmgfMBLKaEeWpuOU+/7jN4Nr8jy8FlCUTD98/kFQDUUWfCTCAoJBBAPIQUUo7VPNB6MWjFpAHwuIzgeD1gdD3wIA0CskwBBfwqYAAAAASUVORK5CYII=);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#n-LinkedIn a {&lt;br /&gt;
	background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAA7EAAAOxAGVKw4bAAABFUlEQVRIx2NkKN/6n4GGgImWhg+cBTmW8gyH0s0ZcizlKbaABV1AQ5SbYYKvJgMTIyODlbwgw547bxhuvP5KPR/8+fcfL59iH9x5+40hafVlhhBdCYY1l18w3Hn7jSILGGmdTFmwCf5r94SzmSq3Y4gJNe5maHJVZQjRlWQQ4mJluPT8M0Pd7lsMO269wTCLrGS6I8mUIcdKgUGCl52BjZmJwUSGn2FTnDGDg5IQdSwwkxVg+Pf/P8Off/8QQcHMxFDlqEwdC3bdfs0g0bKXQahxD8O6Ky8QFssIUMeCrA1XGd58+83w5ddfhqIt1+HiPOzM1LHg3rvvcPajjz8QhjEyUscCUsCoBQNvAc3LoqEfREPfAgDdrVLViTsGJwAAAABJRU5ErkJggg==);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#n-Twitter a {&lt;br /&gt;
	background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAByUlEQVRIx+2Vz0tUURTHP/e9d+c9e9PgD8QhKpyEGAzcSBCDuKhdi8xFtIhAApEW/QOtcm9QQksXRRtx6VorhoJslQpRNOWiQMVAXzk/3q/bOue+8TVguOgsz7n3fODLOecrzjzdUxxhGEfZ/D/gXwBEe4C+jtYfL/WZLF49QeWWy4sxl7F+i15HcHNApgPMlBymBqW2ebHT4NmVDoZ6TCxDcC5n8GjEoTzuYlvQ64jDAd224P6ww+MRhy77zw+3z0ts80ATIZAGlPImO3V1OODtVgTA9YKkPO4yfdGmlDfJSuhJkG+rprj7qs7BrbV0j5e/h1w+bVLImZyUgoliholiBqUUSWvv+fqaFjA5mKGQM5vyQojEufnixdq8VqIn6z5h/Hcn6s1mlB6wsh0x9bLGVy8iTewHisWNID0AIO8aWpl0MffBZ8/X1xIBzz8FzK42aEStpVr9ETG75ifWW56Kh+997pXr/Az0kI+7EXeWawRxco+mKcpKuNYvOZsVjJ6yuNDdLFOsFAuVgAfvGlTD1vI1AX4FsPQt5MaApBoqdhuKXAaqIWx4Ma83I+Y/B1S8mDQh0lmmANpz1pTnun3bPu6GcwwAvwExXIo+zrNKOwAAAABJRU5ErkJggg==);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#n-Youtube a {&lt;br /&gt;
	background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAALy3pUWHRSYXcgcHJvZmlsZSB0eXBlIGV4aWYAAHja5Zhrdtw6DoT/cxWzBBIk+FgOn+fcHczy5wO73XHsJDfO3D9zxrJbslqiSFShUJDb//7ruH/xE3OtLmmpueXs+UktNekcVP/4afcz+HQ/H/+8fRe+P+9eXwinIvv4+Lf05/Wd8/rthtc44/vzrj6/kfoc6PnF24DRniwcrPeT5Lw8zof0HKjtx0Futbyf6pDHfj4vvFN5/sVyh34NYv+79ydSIUpLuSqK7Biiv5/1MYP4+OucCfezcF2ImeMUk7u78pwJAflueW97798H6Lsgvx25j9F/HX0IvvTn+fghlvkZIw5++EXQHwf/hvjdg+NrRvLhC3nD53OQz1n1nP1YXU+ZiOYno7x7i47dw4WDkMd7W2Yr/CnH5W6NrfruJ+AsP/1gm6EFAZXjQgor9HDCvvsZJlNMsgVMRGRKvOcqGDWZ0XBKtoUjJba4YgXLKdvFyGl5zSXc57b7vAnrl1+BSyUwWOCWn27uV19+ZXPnTAtR8PUVK+YlxlymYcjZJ1cBSDhP3PQG+G17wu/f8QeqgqDeMFcW2P14DDE0fONWvDhHrlP2j6wIrqznAISIZyuTIQVS8DlEDTn4IlJCII4VgDozl5hkgEBQlcUkJcWYxRWpYs/mnhLutaKSxU6jTQChZFMBmxY7YKWk8KekCoe6Rk2qmrVoddq055hT1pxzySZyvcSSipZcSqmllV5jTVVrrqXW2mpv0iIaqC230mprrXdxnQd1xupc3zkzZMSRho48yqijjT6hz0xTZ55l1tlmX7LiQiZWXmXV1VbfwW2UYqetO++y6267H7h24klHTz7l1NNOf6H2RPXT9gXUwhM1uUjZdeWFGmddKW9DBJMTNcxATFIA8WIIQGgxzHwNKYkhZ5j5JiSFCpNUw8atYIgBYdpB9IQXdt+Q+y3cnNbfwk3+Djln0P0TyDmg+4zbD1BbVufmReyRhRZTH8m+E2uX6rqMGePR5PmP31A1JLW68rW9++oN/2MDaTxNxga22EKSCLE79VYlzfy8fN4AdvMIP967v7vgd/evgdY+e8oAaBzHbv7sXM6U3qBFa1QNFDFnKCQD39G4rO/RRziaDxTpTs+hZh3Spk+oOUuDisEcwoixnTIwYqtI6kdnIf9Oy2tz4VnznDsQBNY2XCp55ryg07rRqCv90ercn4Rl9H38YOVUPFbU9yzHHfSi75Q7STh1ldPxTYv55zAyq2KtNc3eZ9rphIUd674vgqWzKyrgc1ZF2x3pHOfJo0cqNqm1Ej6h9E5g4ticCroMgFqLhiZL9paRicAVqRhk+NgQMrftQbP13ctsetSCThrLnvNgwJZuhKudSCwj6tFXCWcPX5b0WphAIp8nz4aQEs/m9tKxDSvltXpuA/zCRNMjWUzOL27WiqSYawBH1lXPkoaUtUIlC+JwODWXPe6wvl8eMfOzdJzYUbm2NABzrr0kZarNL0rkUyv8a+8+nvjTves7UydwCSwdvuqsl51LFLnd4m+gDzLHHnTJSuJZp5QT/AnobiRGSB8zKpftMZ8eiLisuSbKu+vyjfBg6KkC2tIpEtelkA2N1Pc7+DyD7DrLHcubqVpaX0F3TR1jmPaexwxB3Z34g6pHl8vZS5nBaFJsbhPShOULCVKSG4E6Z/zUWoaHnpvlxZV3rpc/gaXbXherlMBMcleQzLsetfkXTiw9jtHJubYw/dCXUQcpKxTQMI+QzeQedGFlkH9O8sIGrWU3tGBUoUTE3XdLTmNteZwRt56NwXyqRywDkaMFUqpaISeGrZ4rUAyNBfmrS1ukEqbmR8qDGVEJr0DAHJMjZfUIBULk5waU0V960H9BAvdF1vyULO5rbOmRFLNRj/pT06cZxUVKt4qFgAoV+f9uwGz/bTIKLpwT98lqZ8qMF0+8pE8Lo5XHIp1mOuhR3gguVcTXTuUoatpAwvsEM2iBOe6hzcygcYx89gaUdIdz9dT7xIKkVaxBn/nQNk6TONxGSJ0Oq9Y0UBkEYStsUMsEgKbz2LiEnSGnQ5gKDoJOgdoxYzDp92OB8aq7SB/zsYxi6ZGoNDgUbp/jNJMLItBDQXlcommZ1tLGvXfBhq10BhRAepAj3R51HZip2TbyUc2VKxSbRXL3R/A0aSWt21WN6WSRR/xt+9MCiY8CY+hMUJDsIuHMaRmjcx3DfQM9n+MWTRN30nwmkHnSppAOvToKhA06Voo7fH4e1YOWeuL6tBJqCgWpchnTMVkHhuHcUlvJSWq7VB6VcuXWEPCLdHS+jBbIzEUrh+8LC27ugvJYpOsl7jYk1q7doOz0awXPmWkty8KN+J0qPrEnS92JPI9398ND7obVlJvEyqSmtaxI09+6ujZm3Gi+U4lrRPDADXZoSrCsU7s+vd05jE1JuCUVv6GCKpn77fje7DJn4e5WK64RiS1pkRe0XZQyAxevgZOGQP0ONixfr9SM0vMZNVKo/CoujNojZpbKBo+pivAwmTKxpDQL5t3jYgKjIZmKlpmWRqKHaykEloSixk3aLFNoaUyU7GaeBEpYcm/rzaTl61LUXqH8Yu/s4GeMSS/5sc5o36W9JCiA3Zaw5bIQhTSPjaGwYXWThta7fH4iuoDHV4E4I4ZMZ5+jzRbakttqVYR7sSqL1mWsUnOmGhDcOlF2yhokTB61WPi8h/wlJPphEE+1jB4boTiVXgSfg8EJxTqaFebAB6A8cfJM8zsrlOlhkHhhbU8GWCdN82JkNQfM3lEcNynGHbduJgZRepRUNjMN1ruEttCvfMixlqA9tSosWraCdcNeMAmxpoY8QDkblGFio+HCBo2dlLXMZ2KIsDAbdRKzLYpGUtlv8PGgdDqAY7WcGcELinGgDMMmLFxO1Hw6+s1l2VsRi3sRt0P7dtDKnaBryhTx2C3ek2QYOXiXaasYMfWs0rIQ6xaGfNnVTId7aVdYrnAm86jP4tHeSxW/52cUugxyLOUXFLL14HoYBGQMb7n5tteFpjZym1417wOP6B7TAQlkkV4Q7qQ6KQfbYEVO1lsF/ThjCpzS3fab2iytYb2lrYbMloZLCIsvJ4UUU9B8FRihaAO16lEzSJQNohb8a3PmfqSOg37gg2tFnxKms2CWIkYDpwJxEnp5pU479xerRDtRiZgh+Js7a1MOJSMQozOwtP7JDbIDfo5tQoHUQSF6XKhEh7MwVdI9BXo11LtRqikTaGUkxMFpKFTMFGDwsxe07Td048PepV/piM7vvW19CO6PCpP7VpnoI5DPaN1fVFIXK5hGptBBaHuPmJOnkKIHlf50TcugjSGhHK/dwh0oYoEgBiUc1oR4vS1m4vYjeNtoyasdU4m3hZF9IQlUlzjXY4ZmJlyivpRVszyNBfPBjmw8K/kOsvZOZna4l+pmdbheLPICLmwrRoGGheHJLvwRzkUpHJ5pFrRfzHvGVlIdwI2q1SNwasdmSQ5sZ2A7zXNhhXkQLSmtVXJLIGB5BzpJMRLGe9MGbKuTGf9iNqWR8VAImAGch9NvQUqcmRUMmuPE4yZtHBMPy2o7Llcoxb5PCtZvmxT3m66FKkoIKW6YJ2YGX3BkuH8kbA4RpdICPkICtUGmkkpjxmEKfZoxivK6kyUPHiHgKcKkj1zeGgk6lLgoWIJ5LNNFEmYDRYI0/DQGxg7Yizaa/2AKXSMZtGNFiPSsYSpItetNbp+08MnWA7tGdxAb4jTwD2dikiiyUotMmliEDM5ZP/Du5QTNd2o5AHUfmCfybWJs3Az04TmarcXNKE0KhI1Pvc5kaZNccRAUfLoiW1zGa6r5Z8oemmcA1XAc7gG9WdgtPAKduRUMusDVEJ1ubyaIq1hu/qiRfbd3/00jG3Eyk+bZst1tCGgZiNLiFtYg3a2RH+fRxaO5gxXRwadIH+IllED7fhv8Yas+V7kawdaFLTiPbO4HjR6tlIDm0anj6e0Nxq1dgncgj+5kWugfX2y5f+jN2OeBQiSzx65YsZK9GUqsmXoqgfzyBaP7Bybz/zwQPggD9R/NVVyqvaZxNAAAAYRpQ0NQSUNDIHByb2ZpbGUAAHicfZE9SMNAHMVfU6WilSJ2EHHIUJ1aEBVx1CoUoUKoFVp1MLn0C5o0JCkujoJrwcGPxaqDi7OuDq6CIPgB4uTopOgiJf4vKbSI9eC4H+/uPe7eAUK9zDSraxzQdNtMJeJiJrsqBl7RhwGEEIUoM8uYk6QkOo6ve/j4ehfjWZ3P/Tn61ZzFAJ9IPMsM0ybeIJ7etA3O+8RhVpRV4nPiqEkXJH7kuuLxG+eCywLPDJvp1DxxmFgstLHSxqxoasRTxBFV0ylfyHisct7irJWrrHlP/sJgTl9Z5jrNESSwiCVIEKGgihLKsBGjVSfFQor24x38w65fIpdCrhIYORZQgQbZ9YP/we9urfzkhJcUjAPdL47zMQoEdoFGzXG+jx2ncQL4n4ErveWv1IGZT9JrLS1yBIS2gYvrlqbsAZc7wNCTIZuyK/lpCvk88H5G35QFBm+B3jWvt+Y+Th+ANHWVvAEODoGxAmWvd3h3T3tv/55p9vcDk4xytG+447oAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfkCxEPLC9HyOMVAAACHklEQVRIx7WVP2hTURTGf/fmpaUxqQYjSbeAmqDSTralYMEOHZqpJeoiSNFBEdIODiIuHbQ4SlucOzjXLYh/aMTFQhFdSugfaCglCU1CheQ1pMm7DkkxkDSS99JveVzOu9+533fOPVesAgqQMAVEgGHAgTnowBqwCHxQgPgK2OAtMEtnsQDMilWYErBilkXVvqJ5OKyJqi2mIVqHI7LmeePG3t50B2walqcV9Pz4uN/m978QDoduIUGPiP2zsUHEpelpjvb2PPrGxmsjm31IqaS1m0G2Ct5YXsbucmU+J5OPu/v7A7KvL4qURls1aqXgdt3iHXBN0+gKBEYrudy8kUrdsqygHk+BsXIZVzD43UilRu3B4D3hdsc7pqAeXo+HjyMjCKXs+Xj8USWZfKUKhYsdS1B/B35OTFDO5y8UE4kZI5N5rnTdYcqipv7abNXTSSkBuyqXG/g0M8TXvV7eDwyAlF369vaTyv7+nNJ1d7N/tXZHwK9QiGw0ytHu7v3ywcGcOjy80uow2v+G2AmWgMtAYWdnzO71vjne2hqy1KYnCn6Hw9wFbg4OXj3n83063tz8YqTTQ5YvmgDhnpykmEr5ionEvJHNPqBUsrVbr1MtcoZCjj/r68+MXO6l0vVu0+M8Vn3mehoCTmdG5fMei+O6KIEfTYtsnRxgTdYa5KywIKm+x4tnQL4ErMhaC80AYSAGFK14DnwD7gARBfwFJz6znZ0PWkwAAAAASUVORK5CYII=);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Add by LDR to hide the footer, the link discussion and menu entry we don&#039;t want */&lt;br /&gt;
footer#footer { display: none; }&lt;br /&gt;
#footer-info { display: none; }&lt;br /&gt;
#pt-mytalk { display: none; }&lt;br /&gt;
#t-permalink { display: none; }&lt;br /&gt;
#footer-places-mobileview { font-size: 1.3em !important; }&lt;br /&gt;
&lt;br /&gt;
/* Add by LDR to hide the title on main pages */&lt;br /&gt;
/*&lt;br /&gt;
body.page-Home.action-view h1.firstHeading, body.page-Main_Page.action-submit h1.firstHeading { display: none; padding-bottom: 0 !important;}&lt;br /&gt;
body.page-Main_Page.action-view h1.firstHeading, body.page-Main_Page.action-submit h1.firstHeading { display: none; padding-bottom: 0 !important;}&lt;br /&gt;
body.page-Accueil.action-view h1.firstHeading, body.page-Accueil.action-submit h1.firstHeading { display: none; padding-bottom: 0 !important; }&lt;br /&gt;
body.page-Portada.action-view h1.firstHeading, body.page-Portada.action-submit h1.firstHeading { display: none; padding-bottom: 0 !important; }&lt;br /&gt;
body.page-Hauptseite.action-view h1.firstHeading, body.page-Hauptseite.action-submit h1.firstHeading { display: none; padding-bottom: 0 !important; }&lt;br /&gt;
body.page-Αρχική.action-view h1.firstHeading, body.page-Αρχική.action-submit h1.firstHeading { display: none; padding-bottom: 0 !important; }&lt;br /&gt;
body.page-Página_Principal.action-view h1.firstHeading, body.page-Página_Principal.action-submit h1.firstHeading { display: none; padding-bottom: 0 !important; }&lt;br /&gt;
body.page-简体中文官方文档.action-view h1.firstHeading, body.page-简体中文官方文档.action-submit h1.firstHeading { display: none; padding-bottom: 0 !important; }&lt;br /&gt;
body.page-ホームページ.action-view h1.firstHeading, body.page-ホームページ.action-submit h1.firstHeading { display: none; padding-bottom: 0 !important; }&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
/* Add by LDR to reduce size of logo */&lt;br /&gt;
#p-logo a { height: 60px; }&lt;br /&gt;
.mw-wiki-logo {&lt;br /&gt;
    background-size: contain;&lt;br /&gt;
    margin-top: 0.5em;&lt;br /&gt;
    background-image: url(/images/5/51/Dolibarr_124x124_white.svg);&lt;br /&gt;
}&lt;br /&gt;
#p-logo {&lt;br /&gt;
    height: 60px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Add LDR to increase font size */&lt;br /&gt;
html, body {&lt;br /&gt;
  font-size: 1.1em;&lt;br /&gt;
  font-family: Roboto,Arial,Verdana,Helvetica;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body-content .dolbox p {&lt;br /&gt;
	margin: 0px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h2:not(#mw-toc-heading) {&lt;br /&gt;
    background-image: linear-gradient(120deg, rgb(38, 60, 92, 0.3) 0%, rgba(140, 100, 152, 1) 100%);&lt;br /&gt;
    background-repeat: no-repeat;&lt;br /&gt;
    background-size: 100px 0.2em;&lt;br /&gt;
    background-position: 0 90%;&lt;br /&gt;
    padding-bottom: 20px !important;&lt;br /&gt;
    border-bottom: none;&lt;br /&gt;
}&lt;br /&gt;
h2 + table.dolbox {&lt;br /&gt;
    margin-top: 25px;&lt;br /&gt;
}&lt;br /&gt;
table.dolbox {&lt;br /&gt;
    margin-top: 0;&lt;br /&gt;
    padding: 10px;&lt;br /&gt;
    border: 2px solid #000;&lt;br /&gt;
    border-radius: 6px;&lt;br /&gt;
}&lt;br /&gt;
table.dolbox tr td {&lt;br /&gt;
    /* border: 1px #f0f0f0 solid; */&lt;br /&gt;
}&lt;br /&gt;
table.dolbox.marginleft {&lt;br /&gt;
    margin-left: 20px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* For title style */&lt;br /&gt;
.mw-body h1, .mw-body-content h1, .mw-body-content h2, .mw-body-content h3, .mw-body-content h4 {&lt;br /&gt;
    font-family: Roboto,Arial,Verdana,Helvetica;&lt;br /&gt;
}&lt;br /&gt;
h1 .mw-headline, .searchresults .mw-headline {&lt;br /&gt;
	color: rgb(0,135,160);&lt;br /&gt;
}&lt;br /&gt;
h2 .mw-headline, .searchresults .mw-headline {&lt;br /&gt;
	color: rgb(0,135,160);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h1#firstHeading {&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    border-bottom: none;&lt;br /&gt;
    margin-top: 0.2em !important;&lt;br /&gt;
    /* text-shadow: 3px 3px 5px #DDD; */&lt;br /&gt;
    color: #220050 !important;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    padding-bottom: 1em;&lt;br /&gt;
}&lt;br /&gt;
.mw-body h1, .mw-body-content h1 {&lt;br /&gt;
    font-size: 1.6em;&lt;br /&gt;
	margin-top: 1.5em;&lt;br /&gt;
}&lt;br /&gt;
.mw-body h2, .mw-body-content h2 {&lt;br /&gt;
    font-size: 1.6em;&lt;br /&gt;
    margin-top: 2.5em;&lt;br /&gt;
    padding-bottom: 0.2em;&lt;br /&gt;
}&lt;br /&gt;
.mw-body h3, .mw-body-content h3 {&lt;br /&gt;
	color: #220050;&lt;br /&gt;
    font-size: 1.3em;&lt;br /&gt;
    padding-bottom: 10px;&lt;br /&gt;
}&lt;br /&gt;
h2 + h3 {&lt;br /&gt;
    padding-top: 10px !important;&lt;br /&gt;
}&lt;br /&gt;
h3 {&lt;br /&gt;
    padding-top: 20px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
div.company {&lt;br /&gt;
        margin-left: 0px;&lt;br /&gt;
        margin-bottom: 40px;&lt;br /&gt;
        margin-top: 30px;&lt;br /&gt;
        background-color: #FBFAFC;&lt;br /&gt;
		-moz-border-radius: 10px;&lt;br /&gt;
		border-radius: 10px;&lt;br /&gt;
		box-shadow: 1px 1px 20px #ccc;&lt;br /&gt;
/*&lt;br /&gt;
		padding-left: 10px;&lt;br /&gt;
		padding-right: 12px;&lt;br /&gt;
*/		&lt;br /&gt;
	padding-left: 20px;&lt;br /&gt;
    padding-right: 20px;&lt;br /&gt;
    padding-top: 15px;&lt;br /&gt;
    padding-bottom: 15px;		&lt;br /&gt;
}&lt;br /&gt;
div.companylogo {&lt;br /&gt;
	text-align: right;&lt;br /&gt;
	margin-right: 15px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* For images / screenshots */&lt;br /&gt;
div.divforimgcentpercent {&lt;br /&gt;
	text-align: center;&lt;br /&gt;
	margin-top: 15px;&lt;br /&gt;
	margin-bottom: 15px;&lt;br /&gt;
}&lt;br /&gt;
div.divforimgcentpercent p a img {&lt;br /&gt;
    width: 90% !important;&lt;br /&gt;
    height: auto !important;&lt;br /&gt;
	box-shadow: 1px 1px 15px #ccc;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Add link to mobile if we are on large display */&lt;br /&gt;
@media (min-width: 1024px) {&lt;br /&gt;
	#footer-places { display: none; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hide some tabs when we don&#039;t have edit permissions */&lt;br /&gt;
body:not(.mw-editable) #ca-nstab-main { display: none; }&lt;br /&gt;
body:not(.mw-editable) #ca-view { display: none; }&lt;br /&gt;
body:not(.mw-editable) #ca-viewsource { display: none; }&lt;br /&gt;
&lt;br /&gt;
#p-views ul li.selected {&lt;br /&gt;
    background: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.vectorTabs, .vectorTabs ul, .vectorTabs li, .vectorTabs #ca-history span, .vectorTabs #ca-watch span {&lt;br /&gt;
    background-image: none;&lt;br /&gt;
}&lt;br /&gt;
.vectorTabs li {&lt;br /&gt;
	line-height: unset;&lt;br /&gt;
}&lt;br /&gt;
	&lt;br /&gt;
/* Allow word wrap */&lt;br /&gt;
pre {&lt;br /&gt;
	word-break: break-word;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
table.dolbox {&lt;br /&gt;
    margin-right: 5px;&lt;br /&gt;
    /* margin-left: 25px; */&lt;br /&gt;
    margin-bottom: 15px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Allow limiting of which header levels are shown in a TOC;&lt;br /&gt;
 * &amp;lt;div class=&amp;quot;toclimit-3&amp;quot;&amp;gt;, for instance, will limit to&lt;br /&gt;
 * showing ==headings== and ===headings=== but no further.&lt;br /&gt;
 * Used in [[Template:TOC]]&lt;br /&gt;
 */&lt;br /&gt;
.toclimit-1 li.toclevel-2,&lt;br /&gt;
.toclimit-1 li.toclevel-3,&lt;br /&gt;
.toclimit-1 li.toclevel-4,&lt;br /&gt;
.toclimit-1 li.toclevel-5,&lt;br /&gt;
.toclimit-1 li.toclevel-6&lt;br /&gt;
{&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wraponmobile {&lt;br /&gt;
	white-space: nowrap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
a#stopMobileRedirectToggle {&lt;br /&gt;
	font-size: 1.3em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wikibox {&lt;br /&gt;
	box-shadow: 2px 2px 10px #bbb;&lt;br /&gt;
	border:unset !important;&lt;br /&gt;
}&lt;br /&gt;
center, center p, .wikibox p {&lt;br /&gt;
    text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
p {&lt;br /&gt;
    text-align: justify;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wikibox {&lt;br /&gt;
text-align: center;&lt;br /&gt;
float:right; &lt;br /&gt;
font-size:80%; &lt;br /&gt;
background: #eef; &lt;br /&gt;
border: 1px solid #ccf; &lt;br /&gt;
margin-bottom: 0px; &lt;br /&gt;
margin-left: 25px; &lt;br /&gt;
margin-right: 25px; &lt;br /&gt;
padding: 1px; &lt;br /&gt;
height: 120px;&lt;br /&gt;
width: 150px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.suggestions-result {&lt;br /&gt;
	line-height: 2em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Test for combo list of lang&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
h3#p-lang-label {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Conteneur */&lt;br /&gt;
#p-lang .vector-menu-content {&lt;br /&gt;
    position: relative;&lt;br /&gt;
    float: left;&lt;br /&gt;
    width: 90%;&lt;br /&gt;
    font-family: sans-serif;&lt;br /&gt;
    padding-top: 5px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Cache la liste par défaut */&lt;br /&gt;
#p-lang .vector-menu-content-list {&lt;br /&gt;
    max-height: 0;&lt;br /&gt;
    overflow: hidden;&lt;br /&gt;
&lt;br /&gt;
    list-style: none;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    top: 100%;&lt;br /&gt;
    left: 0;&lt;br /&gt;
&lt;br /&gt;
    width: 100%;&lt;br /&gt;
&lt;br /&gt;
    background: white;&lt;br /&gt;
    &lt;br /&gt;
    transition: max-height 0.3s ease;&lt;br /&gt;
    z-index: 1000;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Affiche au survol */&lt;br /&gt;
#p-lang .vector-menu-content:hover .vector-menu-content-list {&lt;br /&gt;
    max-height: 500px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Bouton visible */&lt;br /&gt;
#p-lang .vector-menu-content::before {&lt;br /&gt;
    content: &amp;quot;Language ▼&amp;quot;;&lt;br /&gt;
    display: block;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
    font-size: 0.75em;&lt;br /&gt;
    color: #54595d;&lt;br /&gt;
    padding-bottom: 5px;&lt;br /&gt;
    padding-top: 5px;&lt;br /&gt;
    border-bottom: 1px solid #ccc;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Styles des liens */&lt;br /&gt;
#p-lang .vector-menu-content-list li a {&lt;br /&gt;
    display: block;&lt;br /&gt;
    padding: 8px 12px;&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
    color: #333;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#p-lang .vector-menu-content-list li a:hover {&lt;br /&gt;
    background: #eee;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Eldy</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=MediaWiki:Common.css&amp;diff=68400</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=MediaWiki:Common.css&amp;diff=68400"/>
		<updated>2026-10-21T20:39:58Z</updated>

		<summary type="html">&lt;p&gt;Eldy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
&lt;br /&gt;
:root {&lt;br /&gt;
	--pictocolor: rgb(85, 165, 155);	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* We disable the talk tab */&lt;br /&gt;
body:not(.mw-editable) #ca-talk {&lt;br /&gt;
	display:none;&lt;br /&gt;
}&lt;br /&gt;
/* We disable the tab &amp;quot;Page&amp;quot; */&lt;br /&gt;
li#ca-nstab-main, li#ca-nstab-mediawiki {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
#ca-talk, #ca-nstab-user_talk {&lt;br /&gt;
    display: none !important;&lt;br /&gt;
}&lt;br /&gt;
/* we disabe a link w already have into Info on page */&lt;br /&gt;
li#t-whatlinkshere, li#t-recentchangeslinked {&lt;br /&gt;
	display: none !important;&lt;br /&gt;
}&lt;br /&gt;
/* we disable also search entries not used */&lt;br /&gt;
div.oo-ui-labelElement:has(.mw-advancedSearch-namespace-1),&lt;br /&gt;
div.oo-ui-labelElement:has(.mw-advancedSearch-namespace-2),&lt;br /&gt;
div.oo-ui-labelElement:has(.mw-advancedSearch-namespace-3),&lt;br /&gt;
div.oo-ui-labelElement:has(.mw-advancedSearch-namespace-4) {&lt;br /&gt;
	display:none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-advancedSearch-namespace-1, .mw-advancedSearch-namespace-2, .mw-advancedSearch-namespace-3, .mw-advancedSearch-namespace-4, .mw-advancedSearch-namespace-5,&lt;br /&gt;
.mw-advancedSearch-namespace-7, .mw-advancedSearch-namespace-9, .mw-advancedSearch-namespace-11, .mw-advancedSearch-namespace-12, .mw-advancedSearch-namespace-13, &lt;br /&gt;
.mw-advancedSearch-namespace-15, .mw-advancedSearch-namespace-16, .mw-advancedSearch-namespace-101 {&lt;br /&gt;
	display: none !important;&lt;br /&gt;
}&lt;br /&gt;
input#mw-search-ns1, label[for=&amp;quot;mw-search-ns1&amp;quot;], input#mw-search-ns3, label[for=&amp;quot;mw-search-ns3&amp;quot;], input#mw-search-ns5, label[for=&amp;quot;mw-search-ns5&amp;quot;], input#mw-search-ns7, label[for=&amp;quot;mw-search-ns7&amp;quot;],&lt;br /&gt;
input#mw-search-ns9, label[for=&amp;quot;mw-search-ns9&amp;quot;], input#mw-search-ns11, label[for=&amp;quot;mw-search-ns11&amp;quot;], input#mw-search-ns13, label[for=&amp;quot;mw-search-ns13&amp;quot;], input#mw-search-ns15, label[for=&amp;quot;mw-search-ns15&amp;quot;],&lt;br /&gt;
input#mw-search-ns4, label[for=&amp;quot;mw-search-ns4&amp;quot;], input#mw-search-ns12, label[for=&amp;quot;mw-search-ns12&amp;quot;] {&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#pt-anonuserpage, #pt-userpage a {&lt;br /&gt;
    background-image: url(/skins/Vector/images/user-avatar.png?494);&lt;br /&gt;
/*    background-image: linear-gradient(transparent,transparent),url(data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%2220%22 height=%2220%22 viewBox=%220 0 20 20%22%3E %3Cg fill=%22%2384898d%22%3E %3Cpath d=%22M10 11c-5.92 0-8 3-8 5v3h16v-3c0-2-2.08-5-8-5z%22/%3E %3Ccircle cx=%2210%22 cy=%225.5%22 r=%224.5%22/%3E %3C/g%3E %3C/svg%3E); */&lt;br /&gt;
}&lt;br /&gt;
#simpleSearch #searchButton {&lt;br /&gt;
    background-image: url(/skins/Vector/images/search-ltr.png?39f97);&lt;br /&gt;
/*    background-image: linear-gradient(transparent,transparent),url(data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%2212%22 height=%2213%22%3E %3Cg fill=%22none%22 stroke=%22%2394595d%22 stroke-width=%222%22%3E %3Cpath d=%22M11.29 11.71l-4-4%22/%3E %3Ccircle cx=%225%22 cy=%225%22 r=%224%22/%3E %3C/g%3E %3C/svg%3E); */&lt;br /&gt;
}    &lt;br /&gt;
&lt;br /&gt;
/* Hide the wheel on language */&lt;br /&gt;
#p-lang button.uls-settings-trigger.webfonts-changed {&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
label.toctogglelabel {&lt;br /&gt;
    outline: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.toctogglelabel:focus {&lt;br /&gt;
	outline: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-menu-tabs, .vector-menu-tabs a, #mw-head .vector-menu-dropdown h3 {&lt;br /&gt;
	background-image: unset !important;	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#right-navigation ul.vector-menu-content-list a { background: #263c5c !important; }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*.ca-watch */&lt;br /&gt;
#ca-view a, #ca-ve-edit a, #ca-edit a, #ca-history a, #ca-nstab-mediawiki:not(.selected) a, #ca-nstab-main:not(.selected) a {&lt;br /&gt;
	color: #fff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
/*div#mw-head {&lt;br /&gt;
    top: 0;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    z-index: 100;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
}&lt;br /&gt;
a.mw-wiki-logo {&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 0;&lt;br /&gt;
    z-index: 200;&lt;br /&gt;
}*/&lt;br /&gt;
&lt;br /&gt;
.mw-body-content h1 {&lt;br /&gt;
    clear: both;&lt;br /&gt;
}&lt;br /&gt;
.mw-body-content h2 {&lt;br /&gt;
    clear: both;&lt;br /&gt;
}&lt;br /&gt;
.mw-body-content h4 {&lt;br /&gt;
	font-size: 1.1em;&lt;br /&gt;
}&lt;br /&gt;
.mw-body-content h5, .mw-body-content h6 {&lt;br /&gt;
	font-size: 0.9em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media screen and (min-width: 982px) {&lt;br /&gt;
	.mw-body {&lt;br /&gt;
		padding-left: 3em;&lt;br /&gt;
		padding-right: 2.5em;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table.welcometext {&lt;br /&gt;
    position: relative;&lt;br /&gt;
    top: -30px;&lt;br /&gt;
}&lt;br /&gt;
.tdwelcometext {&lt;br /&gt;
	padding: 0 15px; &lt;br /&gt;
	color: #fff; &lt;br /&gt;
	background-color:rgba(70, 3, 62, 0.3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#mw-indicator-mw-helplink {&lt;br /&gt;
	display: none;	&lt;br /&gt;
}&lt;br /&gt;
#mw-panel {&lt;br /&gt;
	padding-left: unset;	&lt;br /&gt;
}&lt;br /&gt;
#mw-panel #p-logo + .portal {&lt;br /&gt;
    margin-top: 1.5em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
span.h2fa {&lt;br /&gt;
    background-color: var(--pictocolor);&lt;br /&gt;
    padding: 12px;&lt;br /&gt;
    margin-right: 5px;&lt;br /&gt;
    border-radius: 50px;&lt;br /&gt;
    color: #fff;&lt;br /&gt;
    text-shadow: none;&lt;br /&gt;
    box-shadow: 1px 1px 5px #ccc;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ul.gallery.mw-gallery-traditional {&lt;br /&gt;
    clear: both;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#content.mw-body {&lt;br /&gt;
	padding-top: 2.55em;&lt;br /&gt;
	border: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#p-views ul li.selected span a {&lt;br /&gt;
    color: #fff !important;&lt;br /&gt;
    text-decoration: underline;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*div#contentSub {&lt;br /&gt;
	display: none;&lt;br /&gt;
}*/&lt;br /&gt;
&lt;br /&gt;
/* Change to have banner dolibarr blue */&lt;br /&gt;
#mw-head-base {&lt;br /&gt;
	    height: 4em;&lt;br /&gt;
}&lt;br /&gt;
#mw-head {&lt;br /&gt;
    background: #263c5c;&lt;br /&gt;
    height: 4em;&lt;br /&gt;
}&lt;br /&gt;
#left-navigation {&lt;br /&gt;
	margin-top: 1.5em;&lt;br /&gt;
}&lt;br /&gt;
#right-navigation {&lt;br /&gt;
	margin-top: 1.5em;&lt;br /&gt;
}&lt;br /&gt;
h3#p-cactions-label span {&lt;br /&gt;
    color: #fff;&lt;br /&gt;
}&lt;br /&gt;
li.selected span a {&lt;br /&gt;
    color: #000 !important;&lt;br /&gt;
}&lt;br /&gt;
ul.menu li a {&lt;br /&gt;
    color: #000 !important;&lt;br /&gt;
}&lt;br /&gt;
div#mw-head li:not(#ca-nstab-main):not(#ca-nstab-mediawiki):not(#ca-nstab-special):not(.selected) a:not(.selected) {&lt;br /&gt;
    color: #fff;&lt;br /&gt;
}&lt;br /&gt;
.vectorTabs span, #mw-head .vectorMenu h3 {&lt;br /&gt;
	background-image: none;&lt;br /&gt;
}&lt;br /&gt;
pt-anonuserpage, #pt-userpage a {&lt;br /&gt;
	background-size: unset;&lt;br /&gt;
    padding-left: 26px !important;&lt;br /&gt;
}&lt;br /&gt;
    &lt;br /&gt;
/* To force some TOC to be on 1 line */&lt;br /&gt;
@media (max-width: 767px) {&lt;br /&gt;
	.tocinline ul li {&lt;br /&gt;
	    display: inline-block;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
@media (min-width: 768px) {&lt;br /&gt;
	.tocinline ul {&lt;br /&gt;
		columns: 2 !important;	&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
@media (min-width: 1024px) {&lt;br /&gt;
	.tocinline ul {&lt;br /&gt;
		columns: 3 !important;	&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
@media (min-width: 1300px) {&lt;br /&gt;
	.tocinline ul {&lt;br /&gt;
		columns: 4 !important;	&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
@media (min-width: 1700px) {&lt;br /&gt;
	.tocinline ul {&lt;br /&gt;
		columns: 5 !important;	&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
.tocinline .toc {&lt;br /&gt;
	display: inline-block !important;&lt;br /&gt;
}&lt;br /&gt;
div#toc {&lt;br /&gt;
    margin-top: 20px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.catlinks {&lt;br /&gt;
	margin-top: 3em;&lt;br /&gt;
	border: none;&lt;br /&gt;
    background: none;&lt;br /&gt;
    font-size: 0.9em;&lt;br /&gt;
}&lt;br /&gt;
.catlinks li a {&lt;br /&gt;
	background-color: #aaa;&lt;br /&gt;
	color: #fff;&lt;br /&gt;
	padding: 5px;&lt;br /&gt;
	border-radius: 5px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#simpleSearch {&lt;br /&gt;
	background-image: none;&lt;br /&gt;
	height: unset;&lt;br /&gt;
	border-radius: 5px;&lt;br /&gt;
	/* padding: 2px; */&lt;br /&gt;
	background-color: #fff !important;	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* The insertInterlangLinks tool should be displayed only in source mode */&lt;br /&gt;
.ve-init-target-visual .oo-ui-tool-name-insertInterlangLinks {&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-search-result-data {&lt;br /&gt;
    color: #888888;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
a.feedlink {&lt;br /&gt;
	background-image: none;&lt;br /&gt;
	padding-left: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.opacitymedium {&lt;br /&gt;
	opacity: 0.5;	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
.vectorTabs li.new a, .vectorTabs li.new a:visited, a.new {&lt;br /&gt;
    color: #a58838;&lt;br /&gt;
}&lt;br /&gt;
*/&lt;br /&gt;
a, a:visited, .vector-menu-portal .vector-menu-content li a:visited, .vector-menu-portal .vector-menu-content li a {&lt;br /&gt;
	color: #048;&lt;br /&gt;
}&lt;br /&gt;
a.external, a.external:visited {&lt;br /&gt;
	color: #048 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.mw-changeslist-legend {&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ul.vector-menu-content-list li#n-Facebook, ul.vector-menu-content-list li#n-LinkedIn, ul.vector-menu-content-list li#n-Twitter, ul.vector-menu-content-list li#n-Youtube {&lt;br /&gt;
    filter: saturate(0.1);&lt;br /&gt;
    opacity: 0.3;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Using logos for social networks links instead of plain text */&lt;br /&gt;
#p-Social_networks .body {&lt;br /&gt;
	text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#p-Social_networks li, nav[aria-labelledby=&amp;quot;p-Social networks-label&amp;quot;] li {&lt;br /&gt;
	display: inline-block;&lt;br /&gt;
	width: 24px;&lt;br /&gt;
	height: 24px;&lt;br /&gt;
	margin: 0 5px !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#p-Social_networks a, nav[aria-labelledby=&amp;quot;p-Social networks-label&amp;quot;] a {&lt;br /&gt;
	direction: ltr;&lt;br /&gt;
	text-indent: -9999px;&lt;br /&gt;
	width: 24px;&lt;br /&gt;
	height: 24px;&lt;br /&gt;
	display: inline-block;&lt;br /&gt;
	background-repeat: no-repeat;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#n-Facebook a {&lt;br /&gt;
	background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAApElEQVRIx2O0ipz+n4GGgImWhg8PC1iIVcjHzcGQE2PBYG0oz8DLw87AxMjIwMDAwGATPZM6FpQm2zI4mivRLogs9GVpG0Qc7Ail0SWrGB49f89ATPom2gJGaJgzMDAwPHz+nmgfMBLKaEeWpuOU+/7jN4Nr8jy8FlCUTD98/kFQDUUWfCTCAoJBBAPIQUUo7VPNB6MWjFpAHwuIzgeD1gdD3wIA0CskwBBfwqYAAAAASUVORK5CYII=);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#n-LinkedIn a {&lt;br /&gt;
	background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAA7EAAAOxAGVKw4bAAABFUlEQVRIx2NkKN/6n4GGgImWhg+cBTmW8gyH0s0ZcizlKbaABV1AQ5SbYYKvJgMTIyODlbwgw547bxhuvP5KPR/8+fcfL59iH9x5+40hafVlhhBdCYY1l18w3Hn7jSILGGmdTFmwCf5r94SzmSq3Y4gJNe5maHJVZQjRlWQQ4mJluPT8M0Pd7lsMO269wTCLrGS6I8mUIcdKgUGCl52BjZmJwUSGn2FTnDGDg5IQdSwwkxVg+Pf/P8Off/8QQcHMxFDlqEwdC3bdfs0g0bKXQahxD8O6Ky8QFssIUMeCrA1XGd58+83w5ddfhqIt1+HiPOzM1LHg3rvvcPajjz8QhjEyUscCUsCoBQNvAc3LoqEfREPfAgDdrVLViTsGJwAAAABJRU5ErkJggg==);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#n-Twitter a {&lt;br /&gt;
	background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAByUlEQVRIx+2Vz0tUURTHP/e9d+c9e9PgD8QhKpyEGAzcSBCDuKhdi8xFtIhAApEW/QOtcm9QQksXRRtx6VorhoJslQpRNOWiQMVAXzk/3q/bOue+8TVguOgsz7n3fODLOecrzjzdUxxhGEfZ/D/gXwBEe4C+jtYfL/WZLF49QeWWy4sxl7F+i15HcHNApgPMlBymBqW2ebHT4NmVDoZ6TCxDcC5n8GjEoTzuYlvQ64jDAd224P6ww+MRhy77zw+3z0ts80ATIZAGlPImO3V1OODtVgTA9YKkPO4yfdGmlDfJSuhJkG+rprj7qs7BrbV0j5e/h1w+bVLImZyUgoliholiBqUUSWvv+fqaFjA5mKGQM5vyQojEufnixdq8VqIn6z5h/Hcn6s1mlB6wsh0x9bLGVy8iTewHisWNID0AIO8aWpl0MffBZ8/X1xIBzz8FzK42aEStpVr9ETG75ifWW56Kh+997pXr/Az0kI+7EXeWawRxco+mKcpKuNYvOZsVjJ6yuNDdLFOsFAuVgAfvGlTD1vI1AX4FsPQt5MaApBoqdhuKXAaqIWx4Ma83I+Y/B1S8mDQh0lmmANpz1pTnun3bPu6GcwwAvwExXIo+zrNKOwAAAABJRU5ErkJggg==);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#n-Youtube a {&lt;br /&gt;
	background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAALy3pUWHRSYXcgcHJvZmlsZSB0eXBlIGV4aWYAAHja5Zhrdtw6DoT/cxWzBBIk+FgOn+fcHczy5wO73XHsJDfO3D9zxrJbslqiSFShUJDb//7ruH/xE3OtLmmpueXs+UktNekcVP/4afcz+HQ/H/+8fRe+P+9eXwinIvv4+Lf05/Wd8/rthtc44/vzrj6/kfoc6PnF24DRniwcrPeT5Lw8zof0HKjtx0Futbyf6pDHfj4vvFN5/sVyh34NYv+79ydSIUpLuSqK7Biiv5/1MYP4+OucCfezcF2ImeMUk7u78pwJAflueW97798H6Lsgvx25j9F/HX0IvvTn+fghlvkZIw5++EXQHwf/hvjdg+NrRvLhC3nD53OQz1n1nP1YXU+ZiOYno7x7i47dw4WDkMd7W2Yr/CnH5W6NrfruJ+AsP/1gm6EFAZXjQgor9HDCvvsZJlNMsgVMRGRKvOcqGDWZ0XBKtoUjJba4YgXLKdvFyGl5zSXc57b7vAnrl1+BSyUwWOCWn27uV19+ZXPnTAtR8PUVK+YlxlymYcjZJ1cBSDhP3PQG+G17wu/f8QeqgqDeMFcW2P14DDE0fONWvDhHrlP2j6wIrqznAISIZyuTIQVS8DlEDTn4IlJCII4VgDozl5hkgEBQlcUkJcWYxRWpYs/mnhLutaKSxU6jTQChZFMBmxY7YKWk8KekCoe6Rk2qmrVoddq055hT1pxzySZyvcSSipZcSqmllV5jTVVrrqXW2mpv0iIaqC230mprrXdxnQd1xupc3zkzZMSRho48yqijjT6hz0xTZ55l1tlmX7LiQiZWXmXV1VbfwW2UYqetO++y6267H7h24klHTz7l1NNOf6H2RPXT9gXUwhM1uUjZdeWFGmddKW9DBJMTNcxATFIA8WIIQGgxzHwNKYkhZ5j5JiSFCpNUw8atYIgBYdpB9IQXdt+Q+y3cnNbfwk3+Djln0P0TyDmg+4zbD1BbVufmReyRhRZTH8m+E2uX6rqMGePR5PmP31A1JLW68rW9++oN/2MDaTxNxga22EKSCLE79VYlzfy8fN4AdvMIP967v7vgd/evgdY+e8oAaBzHbv7sXM6U3qBFa1QNFDFnKCQD39G4rO/RRziaDxTpTs+hZh3Spk+oOUuDisEcwoixnTIwYqtI6kdnIf9Oy2tz4VnznDsQBNY2XCp55ryg07rRqCv90ercn4Rl9H38YOVUPFbU9yzHHfSi75Q7STh1ldPxTYv55zAyq2KtNc3eZ9rphIUd674vgqWzKyrgc1ZF2x3pHOfJo0cqNqm1Ej6h9E5g4ticCroMgFqLhiZL9paRicAVqRhk+NgQMrftQbP13ctsetSCThrLnvNgwJZuhKudSCwj6tFXCWcPX5b0WphAIp8nz4aQEs/m9tKxDSvltXpuA/zCRNMjWUzOL27WiqSYawBH1lXPkoaUtUIlC+JwODWXPe6wvl8eMfOzdJzYUbm2NABzrr0kZarNL0rkUyv8a+8+nvjTves7UydwCSwdvuqsl51LFLnd4m+gDzLHHnTJSuJZp5QT/AnobiRGSB8zKpftMZ8eiLisuSbKu+vyjfBg6KkC2tIpEtelkA2N1Pc7+DyD7DrLHcubqVpaX0F3TR1jmPaexwxB3Z34g6pHl8vZS5nBaFJsbhPShOULCVKSG4E6Z/zUWoaHnpvlxZV3rpc/gaXbXherlMBMcleQzLsetfkXTiw9jtHJubYw/dCXUQcpKxTQMI+QzeQedGFlkH9O8sIGrWU3tGBUoUTE3XdLTmNteZwRt56NwXyqRywDkaMFUqpaISeGrZ4rUAyNBfmrS1ukEqbmR8qDGVEJr0DAHJMjZfUIBULk5waU0V960H9BAvdF1vyULO5rbOmRFLNRj/pT06cZxUVKt4qFgAoV+f9uwGz/bTIKLpwT98lqZ8qMF0+8pE8Lo5XHIp1mOuhR3gguVcTXTuUoatpAwvsEM2iBOe6hzcygcYx89gaUdIdz9dT7xIKkVaxBn/nQNk6TONxGSJ0Oq9Y0UBkEYStsUMsEgKbz2LiEnSGnQ5gKDoJOgdoxYzDp92OB8aq7SB/zsYxi6ZGoNDgUbp/jNJMLItBDQXlcommZ1tLGvXfBhq10BhRAepAj3R51HZip2TbyUc2VKxSbRXL3R/A0aSWt21WN6WSRR/xt+9MCiY8CY+hMUJDsIuHMaRmjcx3DfQM9n+MWTRN30nwmkHnSppAOvToKhA06Voo7fH4e1YOWeuL6tBJqCgWpchnTMVkHhuHcUlvJSWq7VB6VcuXWEPCLdHS+jBbIzEUrh+8LC27ugvJYpOsl7jYk1q7doOz0awXPmWkty8KN+J0qPrEnS92JPI9398ND7obVlJvEyqSmtaxI09+6ujZm3Gi+U4lrRPDADXZoSrCsU7s+vd05jE1JuCUVv6GCKpn77fje7DJn4e5WK64RiS1pkRe0XZQyAxevgZOGQP0ONixfr9SM0vMZNVKo/CoujNojZpbKBo+pivAwmTKxpDQL5t3jYgKjIZmKlpmWRqKHaykEloSixk3aLFNoaUyU7GaeBEpYcm/rzaTl61LUXqH8Yu/s4GeMSS/5sc5o36W9JCiA3Zaw5bIQhTSPjaGwYXWThta7fH4iuoDHV4E4I4ZMZ5+jzRbakttqVYR7sSqL1mWsUnOmGhDcOlF2yhokTB61WPi8h/wlJPphEE+1jB4boTiVXgSfg8EJxTqaFebAB6A8cfJM8zsrlOlhkHhhbU8GWCdN82JkNQfM3lEcNynGHbduJgZRepRUNjMN1ruEttCvfMixlqA9tSosWraCdcNeMAmxpoY8QDkblGFio+HCBo2dlLXMZ2KIsDAbdRKzLYpGUtlv8PGgdDqAY7WcGcELinGgDMMmLFxO1Hw6+s1l2VsRi3sRt0P7dtDKnaBryhTx2C3ek2QYOXiXaasYMfWs0rIQ6xaGfNnVTId7aVdYrnAm86jP4tHeSxW/52cUugxyLOUXFLL14HoYBGQMb7n5tteFpjZym1417wOP6B7TAQlkkV4Q7qQ6KQfbYEVO1lsF/ThjCpzS3fab2iytYb2lrYbMloZLCIsvJ4UUU9B8FRihaAO16lEzSJQNohb8a3PmfqSOg37gg2tFnxKms2CWIkYDpwJxEnp5pU479xerRDtRiZgh+Js7a1MOJSMQozOwtP7JDbIDfo5tQoHUQSF6XKhEh7MwVdI9BXo11LtRqikTaGUkxMFpKFTMFGDwsxe07Td048PepV/piM7vvW19CO6PCpP7VpnoI5DPaN1fVFIXK5hGptBBaHuPmJOnkKIHlf50TcugjSGhHK/dwh0oYoEgBiUc1oR4vS1m4vYjeNtoyasdU4m3hZF9IQlUlzjXY4ZmJlyivpRVszyNBfPBjmw8K/kOsvZOZna4l+pmdbheLPICLmwrRoGGheHJLvwRzkUpHJ5pFrRfzHvGVlIdwI2q1SNwasdmSQ5sZ2A7zXNhhXkQLSmtVXJLIGB5BzpJMRLGe9MGbKuTGf9iNqWR8VAImAGch9NvQUqcmRUMmuPE4yZtHBMPy2o7Llcoxb5PCtZvmxT3m66FKkoIKW6YJ2YGX3BkuH8kbA4RpdICPkICtUGmkkpjxmEKfZoxivK6kyUPHiHgKcKkj1zeGgk6lLgoWIJ5LNNFEmYDRYI0/DQGxg7Yizaa/2AKXSMZtGNFiPSsYSpItetNbp+08MnWA7tGdxAb4jTwD2dikiiyUotMmliEDM5ZP/Du5QTNd2o5AHUfmCfybWJs3Az04TmarcXNKE0KhI1Pvc5kaZNccRAUfLoiW1zGa6r5Z8oemmcA1XAc7gG9WdgtPAKduRUMusDVEJ1ubyaIq1hu/qiRfbd3/00jG3Eyk+bZst1tCGgZiNLiFtYg3a2RH+fRxaO5gxXRwadIH+IllED7fhv8Yas+V7kawdaFLTiPbO4HjR6tlIDm0anj6e0Nxq1dgncgj+5kWugfX2y5f+jN2OeBQiSzx65YsZK9GUqsmXoqgfzyBaP7Bybz/zwQPggD9R/NVVyqvaZxNAAAAYRpQ0NQSUNDIHByb2ZpbGUAAHicfZE9SMNAHMVfU6WilSJ2EHHIUJ1aEBVx1CoUoUKoFVp1MLn0C5o0JCkujoJrwcGPxaqDi7OuDq6CIPgB4uTopOgiJf4vKbSI9eC4H+/uPe7eAUK9zDSraxzQdNtMJeJiJrsqBl7RhwGEEIUoM8uYk6QkOo6ve/j4ehfjWZ3P/Tn61ZzFAJ9IPMsM0ybeIJ7etA3O+8RhVpRV4nPiqEkXJH7kuuLxG+eCywLPDJvp1DxxmFgstLHSxqxoasRTxBFV0ylfyHisct7irJWrrHlP/sJgTl9Z5jrNESSwiCVIEKGgihLKsBGjVSfFQor24x38w65fIpdCrhIYORZQgQbZ9YP/we9urfzkhJcUjAPdL47zMQoEdoFGzXG+jx2ncQL4n4ErveWv1IGZT9JrLS1yBIS2gYvrlqbsAZc7wNCTIZuyK/lpCvk88H5G35QFBm+B3jWvt+Y+Th+ANHWVvAEODoGxAmWvd3h3T3tv/55p9vcDk4xytG+447oAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfkCxEPLC9HyOMVAAACHklEQVRIx7WVP2hTURTGf/fmpaUxqQYjSbeAmqDSTralYMEOHZqpJeoiSNFBEdIODiIuHbQ4SlucOzjXLYh/aMTFQhFdSugfaCglCU1CheQ1pMm7DkkxkDSS99JveVzOu9+533fOPVesAgqQMAVEgGHAgTnowBqwCHxQgPgK2OAtMEtnsQDMilWYErBilkXVvqJ5OKyJqi2mIVqHI7LmeePG3t50B2walqcV9Pz4uN/m978QDoduIUGPiP2zsUHEpelpjvb2PPrGxmsjm31IqaS1m0G2Ct5YXsbucmU+J5OPu/v7A7KvL4qURls1aqXgdt3iHXBN0+gKBEYrudy8kUrdsqygHk+BsXIZVzD43UilRu3B4D3hdsc7pqAeXo+HjyMjCKXs+Xj8USWZfKUKhYsdS1B/B35OTFDO5y8UE4kZI5N5rnTdYcqipv7abNXTSSkBuyqXG/g0M8TXvV7eDwyAlF369vaTyv7+nNJ1d7N/tXZHwK9QiGw0ytHu7v3ywcGcOjy80uow2v+G2AmWgMtAYWdnzO71vjne2hqy1KYnCn6Hw9wFbg4OXj3n83063tz8YqTTQ5YvmgDhnpykmEr5ionEvJHNPqBUsrVbr1MtcoZCjj/r68+MXO6l0vVu0+M8Vn3mehoCTmdG5fMei+O6KIEfTYtsnRxgTdYa5KywIKm+x4tnQL4ErMhaC80AYSAGFK14DnwD7gARBfwFJz6znZ0PWkwAAAAASUVORK5CYII=);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Add by LDR to hide the footer, the link discussion and menu entry we don&#039;t want */&lt;br /&gt;
footer#footer { display: none; }&lt;br /&gt;
#footer-info { display: none; }&lt;br /&gt;
#pt-mytalk { display: none; }&lt;br /&gt;
#t-permalink { display: none; }&lt;br /&gt;
#footer-places-mobileview { font-size: 1.3em !important; }&lt;br /&gt;
&lt;br /&gt;
/* Add by LDR to hide the title on main pages */&lt;br /&gt;
/*&lt;br /&gt;
body.page-Home.action-view h1.firstHeading, body.page-Main_Page.action-submit h1.firstHeading { display: none; padding-bottom: 0 !important;}&lt;br /&gt;
body.page-Main_Page.action-view h1.firstHeading, body.page-Main_Page.action-submit h1.firstHeading { display: none; padding-bottom: 0 !important;}&lt;br /&gt;
body.page-Accueil.action-view h1.firstHeading, body.page-Accueil.action-submit h1.firstHeading { display: none; padding-bottom: 0 !important; }&lt;br /&gt;
body.page-Portada.action-view h1.firstHeading, body.page-Portada.action-submit h1.firstHeading { display: none; padding-bottom: 0 !important; }&lt;br /&gt;
body.page-Hauptseite.action-view h1.firstHeading, body.page-Hauptseite.action-submit h1.firstHeading { display: none; padding-bottom: 0 !important; }&lt;br /&gt;
body.page-Αρχική.action-view h1.firstHeading, body.page-Αρχική.action-submit h1.firstHeading { display: none; padding-bottom: 0 !important; }&lt;br /&gt;
body.page-Página_Principal.action-view h1.firstHeading, body.page-Página_Principal.action-submit h1.firstHeading { display: none; padding-bottom: 0 !important; }&lt;br /&gt;
body.page-简体中文官方文档.action-view h1.firstHeading, body.page-简体中文官方文档.action-submit h1.firstHeading { display: none; padding-bottom: 0 !important; }&lt;br /&gt;
body.page-ホームページ.action-view h1.firstHeading, body.page-ホームページ.action-submit h1.firstHeading { display: none; padding-bottom: 0 !important; }&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
/* Add by LDR to reduce size of logo */&lt;br /&gt;
#p-logo a { height: 60px; }&lt;br /&gt;
.mw-wiki-logo {&lt;br /&gt;
    background-size: contain;&lt;br /&gt;
    margin-top: 0.5em;&lt;br /&gt;
    background-image: url(/images/5/51/Dolibarr_124x124_white.svg);&lt;br /&gt;
}&lt;br /&gt;
#p-logo {&lt;br /&gt;
    height: 60px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Add LDR to increase font size */&lt;br /&gt;
html, body {&lt;br /&gt;
  font-size: 1.1em;&lt;br /&gt;
  font-family: Roboto,Arial,Verdana,Helvetica;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body-content .dolbox p {&lt;br /&gt;
	margin: 0px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h2:not(#mw-toc-heading) {&lt;br /&gt;
    background-image: linear-gradient(120deg, rgb(38, 60, 92, 0.3) 0%, rgba(140, 100, 152, 1) 100%);&lt;br /&gt;
    background-repeat: no-repeat;&lt;br /&gt;
    background-size: 100px 0.2em;&lt;br /&gt;
    background-position: 0 90%;&lt;br /&gt;
    padding-bottom: 20px !important;&lt;br /&gt;
    border-bottom: none;&lt;br /&gt;
}&lt;br /&gt;
h2 + table.dolbox {&lt;br /&gt;
    margin-top: 25px;&lt;br /&gt;
}&lt;br /&gt;
table.dolbox {&lt;br /&gt;
    margin-top: 0;&lt;br /&gt;
    padding: 10px;&lt;br /&gt;
    border: 2px solid #000;&lt;br /&gt;
    border-radius: 6px;&lt;br /&gt;
}&lt;br /&gt;
table.dolbox tr td {&lt;br /&gt;
    /* border: 1px #f0f0f0 solid; */&lt;br /&gt;
}&lt;br /&gt;
table.dolbox.marginleft {&lt;br /&gt;
    margin-left: 20px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* For title style */&lt;br /&gt;
.mw-body h1, .mw-body-content h1, .mw-body-content h2, .mw-body-content h3, .mw-body-content h4 {&lt;br /&gt;
    font-family: Roboto,Arial,Verdana,Helvetica;&lt;br /&gt;
}&lt;br /&gt;
h1 .mw-headline, .searchresults .mw-headline {&lt;br /&gt;
	color: rgb(0,135,160);&lt;br /&gt;
}&lt;br /&gt;
h2 .mw-headline, .searchresults .mw-headline {&lt;br /&gt;
	color: rgb(0,135,160);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h1#firstHeading {&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    border-bottom: none;&lt;br /&gt;
    margin-top: 0.2em !important;&lt;br /&gt;
    /* text-shadow: 3px 3px 5px #DDD; */&lt;br /&gt;
    color: #220050 !important;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    padding-bottom: 1em;&lt;br /&gt;
}&lt;br /&gt;
.mw-body h1, .mw-body-content h1 {&lt;br /&gt;
    font-size: 1.6em;&lt;br /&gt;
	margin-top: 1.5em;&lt;br /&gt;
}&lt;br /&gt;
.mw-body h2, .mw-body-content h2 {&lt;br /&gt;
    font-size: 1.6em;&lt;br /&gt;
    margin-top: 2.5em;&lt;br /&gt;
    padding-bottom: 0.2em;&lt;br /&gt;
}&lt;br /&gt;
.mw-body h3, .mw-body-content h3 {&lt;br /&gt;
	color: #220050;&lt;br /&gt;
    font-size: 1.3em;&lt;br /&gt;
    padding-bottom: 10px;&lt;br /&gt;
}&lt;br /&gt;
h2 + h3 {&lt;br /&gt;
    padding-top: 10px !important;&lt;br /&gt;
}&lt;br /&gt;
h3 {&lt;br /&gt;
    padding-top: 20px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
div.company {&lt;br /&gt;
        margin-left: 0px;&lt;br /&gt;
        margin-bottom: 40px;&lt;br /&gt;
        margin-top: 30px;&lt;br /&gt;
        background-color: #FBFAFC;&lt;br /&gt;
		-moz-border-radius: 10px;&lt;br /&gt;
		border-radius: 10px;&lt;br /&gt;
		box-shadow: 1px 1px 20px #ccc;&lt;br /&gt;
/*&lt;br /&gt;
		padding-left: 10px;&lt;br /&gt;
		padding-right: 12px;&lt;br /&gt;
*/		&lt;br /&gt;
	padding-left: 20px;&lt;br /&gt;
    padding-right: 20px;&lt;br /&gt;
    padding-top: 15px;&lt;br /&gt;
    padding-bottom: 15px;		&lt;br /&gt;
}&lt;br /&gt;
div.companylogo {&lt;br /&gt;
	text-align: right;&lt;br /&gt;
	margin-right: 15px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* For images / screenshots */&lt;br /&gt;
div.divforimgcentpercent {&lt;br /&gt;
	text-align: center;&lt;br /&gt;
	margin-top: 15px;&lt;br /&gt;
	margin-bottom: 15px;&lt;br /&gt;
}&lt;br /&gt;
div.divforimgcentpercent p a img {&lt;br /&gt;
    width: 90% !important;&lt;br /&gt;
    height: auto !important;&lt;br /&gt;
	box-shadow: 1px 1px 15px #ccc;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Add link to mobile if we are on large display */&lt;br /&gt;
@media (min-width: 1024px) {&lt;br /&gt;
	#footer-places { display: none; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hide some tabs when we don&#039;t have edit permissions */&lt;br /&gt;
body:not(.mw-editable) #ca-nstab-main { display: none; }&lt;br /&gt;
body:not(.mw-editable) #ca-view { display: none; }&lt;br /&gt;
body:not(.mw-editable) #ca-viewsource { display: none; }&lt;br /&gt;
&lt;br /&gt;
#p-views ul li.selected {&lt;br /&gt;
    background: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.vectorTabs, .vectorTabs ul, .vectorTabs li, .vectorTabs #ca-history span, .vectorTabs #ca-watch span {&lt;br /&gt;
    background-image: none;&lt;br /&gt;
}&lt;br /&gt;
.vectorTabs li {&lt;br /&gt;
	line-height: unset;&lt;br /&gt;
}&lt;br /&gt;
	&lt;br /&gt;
/* Allow word wrap */&lt;br /&gt;
pre {&lt;br /&gt;
	word-break: break-word;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
table.dolbox {&lt;br /&gt;
    margin-right: 5px;&lt;br /&gt;
    /* margin-left: 25px; */&lt;br /&gt;
    margin-bottom: 15px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Allow limiting of which header levels are shown in a TOC;&lt;br /&gt;
 * &amp;lt;div class=&amp;quot;toclimit-3&amp;quot;&amp;gt;, for instance, will limit to&lt;br /&gt;
 * showing ==headings== and ===headings=== but no further.&lt;br /&gt;
 * Used in [[Template:TOC]]&lt;br /&gt;
 */&lt;br /&gt;
.toclimit-1 li.toclevel-2,&lt;br /&gt;
.toclimit-1 li.toclevel-3,&lt;br /&gt;
.toclimit-1 li.toclevel-4,&lt;br /&gt;
.toclimit-1 li.toclevel-5,&lt;br /&gt;
.toclimit-1 li.toclevel-6&lt;br /&gt;
{&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wraponmobile {&lt;br /&gt;
	white-space: nowrap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
a#stopMobileRedirectToggle {&lt;br /&gt;
	font-size: 1.3em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wikibox {&lt;br /&gt;
	box-shadow: 2px 2px 10px #bbb;&lt;br /&gt;
	border:unset !important;&lt;br /&gt;
}&lt;br /&gt;
center, center p, .wikibox p {&lt;br /&gt;
    text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
p {&lt;br /&gt;
    text-align: justify;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wikibox {&lt;br /&gt;
text-align: center;&lt;br /&gt;
float:right; &lt;br /&gt;
font-size:80%; &lt;br /&gt;
background: #eef; &lt;br /&gt;
border: 1px solid #ccf; &lt;br /&gt;
margin-bottom: 0px; &lt;br /&gt;
margin-left: 25px; &lt;br /&gt;
margin-right: 25px; &lt;br /&gt;
padding: 1px; &lt;br /&gt;
height: 120px;&lt;br /&gt;
width: 150px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.suggestions-result {&lt;br /&gt;
	line-height: 2em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Test for combo list of lang&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
h3#p-lang-label {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Conteneur */&lt;br /&gt;
#p-lang .vector-menu-content {&lt;br /&gt;
    position: relative;&lt;br /&gt;
    float: left;&lt;br /&gt;
    width: 90%;&lt;br /&gt;
    font-family: sans-serif;&lt;br /&gt;
    padding-top: 5px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Cache la liste par défaut */&lt;br /&gt;
#p-lang .vector-menu-content-list {&lt;br /&gt;
    max-height: 0;&lt;br /&gt;
    overflow: hidden;&lt;br /&gt;
&lt;br /&gt;
    list-style: none;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    top: 100%;&lt;br /&gt;
    left: 0;&lt;br /&gt;
&lt;br /&gt;
    width: 100%;&lt;br /&gt;
&lt;br /&gt;
    background: white;&lt;br /&gt;
    &lt;br /&gt;
    transition: max-height 0.3s ease;&lt;br /&gt;
    z-index: 1000;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Affiche au survol */&lt;br /&gt;
#p-lang .vector-menu-content:hover .vector-menu-content-list {&lt;br /&gt;
    max-height: 500px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Bouton visible */&lt;br /&gt;
#p-lang .vector-menu-content::before {&lt;br /&gt;
    content: &amp;quot;Language ▼&amp;quot;;&lt;br /&gt;
    display: block;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
    font-size: 0.75em;&lt;br /&gt;
    color: #54595d;&lt;br /&gt;
    padding-bottom: 5px;&lt;br /&gt;
    padding-top: 5px;&lt;br /&gt;
    border-bottom: 1px solid #ccc;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Styles des liens */&lt;br /&gt;
#p-lang .vector-menu-content-list li a {&lt;br /&gt;
    display: block;&lt;br /&gt;
    padding: 8px 12px;&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
    color: #333;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#p-lang .vector-menu-content-list li a:hover {&lt;br /&gt;
    background: #eee;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Eldy</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=MediaWiki:Common.css&amp;diff=68399</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=MediaWiki:Common.css&amp;diff=68399"/>
		<updated>2026-10-21T20:35:34Z</updated>

		<summary type="html">&lt;p&gt;Eldy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
&lt;br /&gt;
:root {&lt;br /&gt;
	--pictocolor: rgb(85, 165, 155);	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* We disable the talk tab */&lt;br /&gt;
body:not(.mw-editable) #ca-talk {&lt;br /&gt;
	display:none;&lt;br /&gt;
}&lt;br /&gt;
/* We disable the tab &amp;quot;Page&amp;quot; */&lt;br /&gt;
li#ca-nstab-main, li#ca-nstab-mediawiki {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
#ca-talk, #ca-nstab-user_talk {&lt;br /&gt;
    display: none !important;&lt;br /&gt;
}&lt;br /&gt;
/* we disabe a link w already have into Info on page */&lt;br /&gt;
li#t-whatlinkshere, li#t-recentchangeslinked {&lt;br /&gt;
	display: none !important;&lt;br /&gt;
}&lt;br /&gt;
/* we disable also search entries not used */&lt;br /&gt;
/*&lt;br /&gt;
.mw-advancedSearch-namespace-1, .mw-advancedSearch-namespace-2, .mw-advancedSearch-namespace-3, .mw-advancedSearch-namespace-4, .mw-advancedSearch-namespace-5,&lt;br /&gt;
.mw-advancedSearch-namespace-7, .mw-advancedSearch-namespace-9, .mw-advancedSearch-namespace-11, .mw-advancedSearch-namespace-12, .mw-advancedSearch-namespace-13, &lt;br /&gt;
.mw-advancedSearch-namespace-15, .mw-advancedSearch-namespace-16, .mw-advancedSearch-namespace-101 {&lt;br /&gt;
	display: none !important;&lt;br /&gt;
}&lt;br /&gt;
input#mw-search-ns1, label[for=&amp;quot;mw-search-ns1&amp;quot;], input#mw-search-ns3, label[for=&amp;quot;mw-search-ns3&amp;quot;], input#mw-search-ns5, label[for=&amp;quot;mw-search-ns5&amp;quot;], input#mw-search-ns7, label[for=&amp;quot;mw-search-ns7&amp;quot;],&lt;br /&gt;
input#mw-search-ns9, label[for=&amp;quot;mw-search-ns9&amp;quot;], input#mw-search-ns11, label[for=&amp;quot;mw-search-ns11&amp;quot;], input#mw-search-ns13, label[for=&amp;quot;mw-search-ns13&amp;quot;], input#mw-search-ns15, label[for=&amp;quot;mw-search-ns15&amp;quot;],&lt;br /&gt;
input#mw-search-ns4, label[for=&amp;quot;mw-search-ns4&amp;quot;], input#mw-search-ns12, label[for=&amp;quot;mw-search-ns12&amp;quot;] {&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#pt-anonuserpage, #pt-userpage a {&lt;br /&gt;
    background-image: url(/skins/Vector/images/user-avatar.png?494);&lt;br /&gt;
/*    background-image: linear-gradient(transparent,transparent),url(data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%2220%22 height=%2220%22 viewBox=%220 0 20 20%22%3E %3Cg fill=%22%2384898d%22%3E %3Cpath d=%22M10 11c-5.92 0-8 3-8 5v3h16v-3c0-2-2.08-5-8-5z%22/%3E %3Ccircle cx=%2210%22 cy=%225.5%22 r=%224.5%22/%3E %3C/g%3E %3C/svg%3E); */&lt;br /&gt;
}&lt;br /&gt;
#simpleSearch #searchButton {&lt;br /&gt;
    background-image: url(/skins/Vector/images/search-ltr.png?39f97);&lt;br /&gt;
/*    background-image: linear-gradient(transparent,transparent),url(data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%2212%22 height=%2213%22%3E %3Cg fill=%22none%22 stroke=%22%2394595d%22 stroke-width=%222%22%3E %3Cpath d=%22M11.29 11.71l-4-4%22/%3E %3Ccircle cx=%225%22 cy=%225%22 r=%224%22/%3E %3C/g%3E %3C/svg%3E); */&lt;br /&gt;
}    &lt;br /&gt;
&lt;br /&gt;
/* Hide the wheel on language */&lt;br /&gt;
#p-lang button.uls-settings-trigger.webfonts-changed {&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
label.toctogglelabel {&lt;br /&gt;
    outline: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.toctogglelabel:focus {&lt;br /&gt;
	outline: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-menu-tabs, .vector-menu-tabs a, #mw-head .vector-menu-dropdown h3 {&lt;br /&gt;
	background-image: unset !important;	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#right-navigation ul.vector-menu-content-list a { background: #263c5c !important; }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*.ca-watch */&lt;br /&gt;
#ca-view a, #ca-ve-edit a, #ca-edit a, #ca-history a, #ca-nstab-mediawiki:not(.selected) a, #ca-nstab-main:not(.selected) a {&lt;br /&gt;
	color: #fff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
/*div#mw-head {&lt;br /&gt;
    top: 0;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    z-index: 100;&lt;br /&gt;
    position: fixed;&lt;br /&gt;
}&lt;br /&gt;
a.mw-wiki-logo {&lt;br /&gt;
    position: fixed;&lt;br /&gt;
    top: 0;&lt;br /&gt;
    z-index: 200;&lt;br /&gt;
}*/&lt;br /&gt;
&lt;br /&gt;
.mw-body-content h1 {&lt;br /&gt;
    clear: both;&lt;br /&gt;
}&lt;br /&gt;
.mw-body-content h2 {&lt;br /&gt;
    clear: both;&lt;br /&gt;
}&lt;br /&gt;
.mw-body-content h4 {&lt;br /&gt;
	font-size: 1.1em;&lt;br /&gt;
}&lt;br /&gt;
.mw-body-content h5, .mw-body-content h6 {&lt;br /&gt;
	font-size: 0.9em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media screen and (min-width: 982px) {&lt;br /&gt;
	.mw-body {&lt;br /&gt;
		padding-left: 3em;&lt;br /&gt;
		padding-right: 2.5em;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
table.welcometext {&lt;br /&gt;
    position: relative;&lt;br /&gt;
    top: -30px;&lt;br /&gt;
}&lt;br /&gt;
.tdwelcometext {&lt;br /&gt;
	padding: 0 15px; &lt;br /&gt;
	color: #fff; &lt;br /&gt;
	background-color:rgba(70, 3, 62, 0.3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#mw-indicator-mw-helplink {&lt;br /&gt;
	display: none;	&lt;br /&gt;
}&lt;br /&gt;
#mw-panel {&lt;br /&gt;
	padding-left: unset;	&lt;br /&gt;
}&lt;br /&gt;
#mw-panel #p-logo + .portal {&lt;br /&gt;
    margin-top: 1.5em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
span.h2fa {&lt;br /&gt;
    background-color: var(--pictocolor);&lt;br /&gt;
    padding: 12px;&lt;br /&gt;
    margin-right: 5px;&lt;br /&gt;
    border-radius: 50px;&lt;br /&gt;
    color: #fff;&lt;br /&gt;
    text-shadow: none;&lt;br /&gt;
    box-shadow: 1px 1px 5px #ccc;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ul.gallery.mw-gallery-traditional {&lt;br /&gt;
    clear: both;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#content.mw-body {&lt;br /&gt;
	padding-top: 2.55em;&lt;br /&gt;
	border: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#p-views ul li.selected span a {&lt;br /&gt;
    color: #fff !important;&lt;br /&gt;
    text-decoration: underline;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*div#contentSub {&lt;br /&gt;
	display: none;&lt;br /&gt;
}*/&lt;br /&gt;
&lt;br /&gt;
/* Change to have banner dolibarr blue */&lt;br /&gt;
#mw-head-base {&lt;br /&gt;
	    height: 4em;&lt;br /&gt;
}&lt;br /&gt;
#mw-head {&lt;br /&gt;
    background: #263c5c;&lt;br /&gt;
    height: 4em;&lt;br /&gt;
}&lt;br /&gt;
#left-navigation {&lt;br /&gt;
	margin-top: 1.5em;&lt;br /&gt;
}&lt;br /&gt;
#right-navigation {&lt;br /&gt;
	margin-top: 1.5em;&lt;br /&gt;
}&lt;br /&gt;
h3#p-cactions-label span {&lt;br /&gt;
    color: #fff;&lt;br /&gt;
}&lt;br /&gt;
li.selected span a {&lt;br /&gt;
    color: #000 !important;&lt;br /&gt;
}&lt;br /&gt;
ul.menu li a {&lt;br /&gt;
    color: #000 !important;&lt;br /&gt;
}&lt;br /&gt;
div#mw-head li:not(#ca-nstab-main):not(#ca-nstab-mediawiki):not(#ca-nstab-special):not(.selected) a:not(.selected) {&lt;br /&gt;
    color: #fff;&lt;br /&gt;
}&lt;br /&gt;
.vectorTabs span, #mw-head .vectorMenu h3 {&lt;br /&gt;
	background-image: none;&lt;br /&gt;
}&lt;br /&gt;
pt-anonuserpage, #pt-userpage a {&lt;br /&gt;
	background-size: unset;&lt;br /&gt;
    padding-left: 26px !important;&lt;br /&gt;
}&lt;br /&gt;
    &lt;br /&gt;
/* To force some TOC to be on 1 line */&lt;br /&gt;
@media (max-width: 767px) {&lt;br /&gt;
	.tocinline ul li {&lt;br /&gt;
	    display: inline-block;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
@media (min-width: 768px) {&lt;br /&gt;
	.tocinline ul {&lt;br /&gt;
		columns: 2 !important;	&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
@media (min-width: 1024px) {&lt;br /&gt;
	.tocinline ul {&lt;br /&gt;
		columns: 3 !important;	&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
@media (min-width: 1300px) {&lt;br /&gt;
	.tocinline ul {&lt;br /&gt;
		columns: 4 !important;	&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
@media (min-width: 1700px) {&lt;br /&gt;
	.tocinline ul {&lt;br /&gt;
		columns: 5 !important;	&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
.tocinline .toc {&lt;br /&gt;
	display: inline-block !important;&lt;br /&gt;
}&lt;br /&gt;
div#toc {&lt;br /&gt;
    margin-top: 20px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.catlinks {&lt;br /&gt;
	margin-top: 3em;&lt;br /&gt;
	border: none;&lt;br /&gt;
    background: none;&lt;br /&gt;
    font-size: 0.9em;&lt;br /&gt;
}&lt;br /&gt;
.catlinks li a {&lt;br /&gt;
	background-color: #aaa;&lt;br /&gt;
	color: #fff;&lt;br /&gt;
	padding: 5px;&lt;br /&gt;
	border-radius: 5px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#simpleSearch {&lt;br /&gt;
	background-image: none;&lt;br /&gt;
	height: unset;&lt;br /&gt;
	border-radius: 5px;&lt;br /&gt;
	/* padding: 2px; */&lt;br /&gt;
	background-color: #fff !important;	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* The insertInterlangLinks tool should be displayed only in source mode */&lt;br /&gt;
.ve-init-target-visual .oo-ui-tool-name-insertInterlangLinks {&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-search-result-data {&lt;br /&gt;
    color: #888888;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
a.feedlink {&lt;br /&gt;
	background-image: none;&lt;br /&gt;
	padding-left: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.opacitymedium {&lt;br /&gt;
	opacity: 0.5;	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
.vectorTabs li.new a, .vectorTabs li.new a:visited, a.new {&lt;br /&gt;
    color: #a58838;&lt;br /&gt;
}&lt;br /&gt;
*/&lt;br /&gt;
a, a:visited, .vector-menu-portal .vector-menu-content li a:visited, .vector-menu-portal .vector-menu-content li a {&lt;br /&gt;
	color: #048;&lt;br /&gt;
}&lt;br /&gt;
a.external, a.external:visited {&lt;br /&gt;
	color: #048 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.mw-changeslist-legend {&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ul.vector-menu-content-list li#n-Facebook, ul.vector-menu-content-list li#n-LinkedIn, ul.vector-menu-content-list li#n-Twitter, ul.vector-menu-content-list li#n-Youtube {&lt;br /&gt;
    filter: saturate(0.1);&lt;br /&gt;
    opacity: 0.3;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Using logos for social networks links instead of plain text */&lt;br /&gt;
#p-Social_networks .body {&lt;br /&gt;
	text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#p-Social_networks li, nav[aria-labelledby=&amp;quot;p-Social networks-label&amp;quot;] li {&lt;br /&gt;
	display: inline-block;&lt;br /&gt;
	width: 24px;&lt;br /&gt;
	height: 24px;&lt;br /&gt;
	margin: 0 5px !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#p-Social_networks a, nav[aria-labelledby=&amp;quot;p-Social networks-label&amp;quot;] a {&lt;br /&gt;
	direction: ltr;&lt;br /&gt;
	text-indent: -9999px;&lt;br /&gt;
	width: 24px;&lt;br /&gt;
	height: 24px;&lt;br /&gt;
	display: inline-block;&lt;br /&gt;
	background-repeat: no-repeat;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#n-Facebook a {&lt;br /&gt;
	background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAApElEQVRIx2O0ipz+n4GGgImWhg8PC1iIVcjHzcGQE2PBYG0oz8DLw87AxMjIwMDAwGATPZM6FpQm2zI4mivRLogs9GVpG0Qc7Ail0SWrGB49f89ATPom2gJGaJgzMDAwPHz+nmgfMBLKaEeWpuOU+/7jN4Nr8jy8FlCUTD98/kFQDUUWfCTCAoJBBAPIQUUo7VPNB6MWjFpAHwuIzgeD1gdD3wIA0CskwBBfwqYAAAAASUVORK5CYII=);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#n-LinkedIn a {&lt;br /&gt;
	background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAA7EAAAOxAGVKw4bAAABFUlEQVRIx2NkKN/6n4GGgImWhg+cBTmW8gyH0s0ZcizlKbaABV1AQ5SbYYKvJgMTIyODlbwgw547bxhuvP5KPR/8+fcfL59iH9x5+40hafVlhhBdCYY1l18w3Hn7jSILGGmdTFmwCf5r94SzmSq3Y4gJNe5maHJVZQjRlWQQ4mJluPT8M0Pd7lsMO269wTCLrGS6I8mUIcdKgUGCl52BjZmJwUSGn2FTnDGDg5IQdSwwkxVg+Pf/P8Off/8QQcHMxFDlqEwdC3bdfs0g0bKXQahxD8O6Ky8QFssIUMeCrA1XGd58+83w5ddfhqIt1+HiPOzM1LHg3rvvcPajjz8QhjEyUscCUsCoBQNvAc3LoqEfREPfAgDdrVLViTsGJwAAAABJRU5ErkJggg==);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#n-Twitter a {&lt;br /&gt;
	background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAByUlEQVRIx+2Vz0tUURTHP/e9d+c9e9PgD8QhKpyEGAzcSBCDuKhdi8xFtIhAApEW/QOtcm9QQksXRRtx6VorhoJslQpRNOWiQMVAXzk/3q/bOue+8TVguOgsz7n3fODLOecrzjzdUxxhGEfZ/D/gXwBEe4C+jtYfL/WZLF49QeWWy4sxl7F+i15HcHNApgPMlBymBqW2ebHT4NmVDoZ6TCxDcC5n8GjEoTzuYlvQ64jDAd224P6ww+MRhy77zw+3z0ts80ATIZAGlPImO3V1OODtVgTA9YKkPO4yfdGmlDfJSuhJkG+rprj7qs7BrbV0j5e/h1w+bVLImZyUgoliholiBqUUSWvv+fqaFjA5mKGQM5vyQojEufnixdq8VqIn6z5h/Hcn6s1mlB6wsh0x9bLGVy8iTewHisWNID0AIO8aWpl0MffBZ8/X1xIBzz8FzK42aEStpVr9ETG75ifWW56Kh+997pXr/Az0kI+7EXeWawRxco+mKcpKuNYvOZsVjJ6yuNDdLFOsFAuVgAfvGlTD1vI1AX4FsPQt5MaApBoqdhuKXAaqIWx4Ma83I+Y/B1S8mDQh0lmmANpz1pTnun3bPu6GcwwAvwExXIo+zrNKOwAAAABJRU5ErkJggg==);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#n-Youtube a {&lt;br /&gt;
	background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAALy3pUWHRSYXcgcHJvZmlsZSB0eXBlIGV4aWYAAHja5Zhrdtw6DoT/cxWzBBIk+FgOn+fcHczy5wO73XHsJDfO3D9zxrJbslqiSFShUJDb//7ruH/xE3OtLmmpueXs+UktNekcVP/4afcz+HQ/H/+8fRe+P+9eXwinIvv4+Lf05/Wd8/rthtc44/vzrj6/kfoc6PnF24DRniwcrPeT5Lw8zof0HKjtx0Futbyf6pDHfj4vvFN5/sVyh34NYv+79ydSIUpLuSqK7Biiv5/1MYP4+OucCfezcF2ImeMUk7u78pwJAflueW97798H6Lsgvx25j9F/HX0IvvTn+fghlvkZIw5++EXQHwf/hvjdg+NrRvLhC3nD53OQz1n1nP1YXU+ZiOYno7x7i47dw4WDkMd7W2Yr/CnH5W6NrfruJ+AsP/1gm6EFAZXjQgor9HDCvvsZJlNMsgVMRGRKvOcqGDWZ0XBKtoUjJba4YgXLKdvFyGl5zSXc57b7vAnrl1+BSyUwWOCWn27uV19+ZXPnTAtR8PUVK+YlxlymYcjZJ1cBSDhP3PQG+G17wu/f8QeqgqDeMFcW2P14DDE0fONWvDhHrlP2j6wIrqznAISIZyuTIQVS8DlEDTn4IlJCII4VgDozl5hkgEBQlcUkJcWYxRWpYs/mnhLutaKSxU6jTQChZFMBmxY7YKWk8KekCoe6Rk2qmrVoddq055hT1pxzySZyvcSSipZcSqmllV5jTVVrrqXW2mpv0iIaqC230mprrXdxnQd1xupc3zkzZMSRho48yqijjT6hz0xTZ55l1tlmX7LiQiZWXmXV1VbfwW2UYqetO++y6267H7h24klHTz7l1NNOf6H2RPXT9gXUwhM1uUjZdeWFGmddKW9DBJMTNcxATFIA8WIIQGgxzHwNKYkhZ5j5JiSFCpNUw8atYIgBYdpB9IQXdt+Q+y3cnNbfwk3+Djln0P0TyDmg+4zbD1BbVufmReyRhRZTH8m+E2uX6rqMGePR5PmP31A1JLW68rW9++oN/2MDaTxNxga22EKSCLE79VYlzfy8fN4AdvMIP967v7vgd/evgdY+e8oAaBzHbv7sXM6U3qBFa1QNFDFnKCQD39G4rO/RRziaDxTpTs+hZh3Spk+oOUuDisEcwoixnTIwYqtI6kdnIf9Oy2tz4VnznDsQBNY2XCp55ryg07rRqCv90ercn4Rl9H38YOVUPFbU9yzHHfSi75Q7STh1ldPxTYv55zAyq2KtNc3eZ9rphIUd674vgqWzKyrgc1ZF2x3pHOfJo0cqNqm1Ej6h9E5g4ticCroMgFqLhiZL9paRicAVqRhk+NgQMrftQbP13ctsetSCThrLnvNgwJZuhKudSCwj6tFXCWcPX5b0WphAIp8nz4aQEs/m9tKxDSvltXpuA/zCRNMjWUzOL27WiqSYawBH1lXPkoaUtUIlC+JwODWXPe6wvl8eMfOzdJzYUbm2NABzrr0kZarNL0rkUyv8a+8+nvjTves7UydwCSwdvuqsl51LFLnd4m+gDzLHHnTJSuJZp5QT/AnobiRGSB8zKpftMZ8eiLisuSbKu+vyjfBg6KkC2tIpEtelkA2N1Pc7+DyD7DrLHcubqVpaX0F3TR1jmPaexwxB3Z34g6pHl8vZS5nBaFJsbhPShOULCVKSG4E6Z/zUWoaHnpvlxZV3rpc/gaXbXherlMBMcleQzLsetfkXTiw9jtHJubYw/dCXUQcpKxTQMI+QzeQedGFlkH9O8sIGrWU3tGBUoUTE3XdLTmNteZwRt56NwXyqRywDkaMFUqpaISeGrZ4rUAyNBfmrS1ukEqbmR8qDGVEJr0DAHJMjZfUIBULk5waU0V960H9BAvdF1vyULO5rbOmRFLNRj/pT06cZxUVKt4qFgAoV+f9uwGz/bTIKLpwT98lqZ8qMF0+8pE8Lo5XHIp1mOuhR3gguVcTXTuUoatpAwvsEM2iBOe6hzcygcYx89gaUdIdz9dT7xIKkVaxBn/nQNk6TONxGSJ0Oq9Y0UBkEYStsUMsEgKbz2LiEnSGnQ5gKDoJOgdoxYzDp92OB8aq7SB/zsYxi6ZGoNDgUbp/jNJMLItBDQXlcommZ1tLGvXfBhq10BhRAepAj3R51HZip2TbyUc2VKxSbRXL3R/A0aSWt21WN6WSRR/xt+9MCiY8CY+hMUJDsIuHMaRmjcx3DfQM9n+MWTRN30nwmkHnSppAOvToKhA06Voo7fH4e1YOWeuL6tBJqCgWpchnTMVkHhuHcUlvJSWq7VB6VcuXWEPCLdHS+jBbIzEUrh+8LC27ugvJYpOsl7jYk1q7doOz0awXPmWkty8KN+J0qPrEnS92JPI9398ND7obVlJvEyqSmtaxI09+6ujZm3Gi+U4lrRPDADXZoSrCsU7s+vd05jE1JuCUVv6GCKpn77fje7DJn4e5WK64RiS1pkRe0XZQyAxevgZOGQP0ONixfr9SM0vMZNVKo/CoujNojZpbKBo+pivAwmTKxpDQL5t3jYgKjIZmKlpmWRqKHaykEloSixk3aLFNoaUyU7GaeBEpYcm/rzaTl61LUXqH8Yu/s4GeMSS/5sc5o36W9JCiA3Zaw5bIQhTSPjaGwYXWThta7fH4iuoDHV4E4I4ZMZ5+jzRbakttqVYR7sSqL1mWsUnOmGhDcOlF2yhokTB61WPi8h/wlJPphEE+1jB4boTiVXgSfg8EJxTqaFebAB6A8cfJM8zsrlOlhkHhhbU8GWCdN82JkNQfM3lEcNynGHbduJgZRepRUNjMN1ruEttCvfMixlqA9tSosWraCdcNeMAmxpoY8QDkblGFio+HCBo2dlLXMZ2KIsDAbdRKzLYpGUtlv8PGgdDqAY7WcGcELinGgDMMmLFxO1Hw6+s1l2VsRi3sRt0P7dtDKnaBryhTx2C3ek2QYOXiXaasYMfWs0rIQ6xaGfNnVTId7aVdYrnAm86jP4tHeSxW/52cUugxyLOUXFLL14HoYBGQMb7n5tteFpjZym1417wOP6B7TAQlkkV4Q7qQ6KQfbYEVO1lsF/ThjCpzS3fab2iytYb2lrYbMloZLCIsvJ4UUU9B8FRihaAO16lEzSJQNohb8a3PmfqSOg37gg2tFnxKms2CWIkYDpwJxEnp5pU479xerRDtRiZgh+Js7a1MOJSMQozOwtP7JDbIDfo5tQoHUQSF6XKhEh7MwVdI9BXo11LtRqikTaGUkxMFpKFTMFGDwsxe07Td048PepV/piM7vvW19CO6PCpP7VpnoI5DPaN1fVFIXK5hGptBBaHuPmJOnkKIHlf50TcugjSGhHK/dwh0oYoEgBiUc1oR4vS1m4vYjeNtoyasdU4m3hZF9IQlUlzjXY4ZmJlyivpRVszyNBfPBjmw8K/kOsvZOZna4l+pmdbheLPICLmwrRoGGheHJLvwRzkUpHJ5pFrRfzHvGVlIdwI2q1SNwasdmSQ5sZ2A7zXNhhXkQLSmtVXJLIGB5BzpJMRLGe9MGbKuTGf9iNqWR8VAImAGch9NvQUqcmRUMmuPE4yZtHBMPy2o7Llcoxb5PCtZvmxT3m66FKkoIKW6YJ2YGX3BkuH8kbA4RpdICPkICtUGmkkpjxmEKfZoxivK6kyUPHiHgKcKkj1zeGgk6lLgoWIJ5LNNFEmYDRYI0/DQGxg7Yizaa/2AKXSMZtGNFiPSsYSpItetNbp+08MnWA7tGdxAb4jTwD2dikiiyUotMmliEDM5ZP/Du5QTNd2o5AHUfmCfybWJs3Az04TmarcXNKE0KhI1Pvc5kaZNccRAUfLoiW1zGa6r5Z8oemmcA1XAc7gG9WdgtPAKduRUMusDVEJ1ubyaIq1hu/qiRfbd3/00jG3Eyk+bZst1tCGgZiNLiFtYg3a2RH+fRxaO5gxXRwadIH+IllED7fhv8Yas+V7kawdaFLTiPbO4HjR6tlIDm0anj6e0Nxq1dgncgj+5kWugfX2y5f+jN2OeBQiSzx65YsZK9GUqsmXoqgfzyBaP7Bybz/zwQPggD9R/NVVyqvaZxNAAAAYRpQ0NQSUNDIHByb2ZpbGUAAHicfZE9SMNAHMVfU6WilSJ2EHHIUJ1aEBVx1CoUoUKoFVp1MLn0C5o0JCkujoJrwcGPxaqDi7OuDq6CIPgB4uTopOgiJf4vKbSI9eC4H+/uPe7eAUK9zDSraxzQdNtMJeJiJrsqBl7RhwGEEIUoM8uYk6QkOo6ve/j4ehfjWZ3P/Tn61ZzFAJ9IPMsM0ybeIJ7etA3O+8RhVpRV4nPiqEkXJH7kuuLxG+eCywLPDJvp1DxxmFgstLHSxqxoasRTxBFV0ylfyHisct7irJWrrHlP/sJgTl9Z5jrNESSwiCVIEKGgihLKsBGjVSfFQor24x38w65fIpdCrhIYORZQgQbZ9YP/we9urfzkhJcUjAPdL47zMQoEdoFGzXG+jx2ncQL4n4ErveWv1IGZT9JrLS1yBIS2gYvrlqbsAZc7wNCTIZuyK/lpCvk88H5G35QFBm+B3jWvt+Y+Th+ANHWVvAEODoGxAmWvd3h3T3tv/55p9vcDk4xytG+447oAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfkCxEPLC9HyOMVAAACHklEQVRIx7WVP2hTURTGf/fmpaUxqQYjSbeAmqDSTralYMEOHZqpJeoiSNFBEdIODiIuHbQ4SlucOzjXLYh/aMTFQhFdSugfaCglCU1CheQ1pMm7DkkxkDSS99JveVzOu9+533fOPVesAgqQMAVEgGHAgTnowBqwCHxQgPgK2OAtMEtnsQDMilWYErBilkXVvqJ5OKyJqi2mIVqHI7LmeePG3t50B2walqcV9Pz4uN/m978QDoduIUGPiP2zsUHEpelpjvb2PPrGxmsjm31IqaS1m0G2Ct5YXsbucmU+J5OPu/v7A7KvL4qURls1aqXgdt3iHXBN0+gKBEYrudy8kUrdsqygHk+BsXIZVzD43UilRu3B4D3hdsc7pqAeXo+HjyMjCKXs+Xj8USWZfKUKhYsdS1B/B35OTFDO5y8UE4kZI5N5rnTdYcqipv7abNXTSSkBuyqXG/g0M8TXvV7eDwyAlF369vaTyv7+nNJ1d7N/tXZHwK9QiGw0ytHu7v3ywcGcOjy80uow2v+G2AmWgMtAYWdnzO71vjne2hqy1KYnCn6Hw9wFbg4OXj3n83063tz8YqTTQ5YvmgDhnpykmEr5ionEvJHNPqBUsrVbr1MtcoZCjj/r68+MXO6l0vVu0+M8Vn3mehoCTmdG5fMei+O6KIEfTYtsnRxgTdYa5KywIKm+x4tnQL4ErMhaC80AYSAGFK14DnwD7gARBfwFJz6znZ0PWkwAAAAASUVORK5CYII=);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Add by LDR to hide the footer, the link discussion and menu entry we don&#039;t want */&lt;br /&gt;
footer#footer { display: none; }&lt;br /&gt;
#footer-info { display: none; }&lt;br /&gt;
#pt-mytalk { display: none; }&lt;br /&gt;
#t-permalink { display: none; }&lt;br /&gt;
#footer-places-mobileview { font-size: 1.3em !important; }&lt;br /&gt;
&lt;br /&gt;
/* Add by LDR to hide the title on main pages */&lt;br /&gt;
/*&lt;br /&gt;
body.page-Home.action-view h1.firstHeading, body.page-Main_Page.action-submit h1.firstHeading { display: none; padding-bottom: 0 !important;}&lt;br /&gt;
body.page-Main_Page.action-view h1.firstHeading, body.page-Main_Page.action-submit h1.firstHeading { display: none; padding-bottom: 0 !important;}&lt;br /&gt;
body.page-Accueil.action-view h1.firstHeading, body.page-Accueil.action-submit h1.firstHeading { display: none; padding-bottom: 0 !important; }&lt;br /&gt;
body.page-Portada.action-view h1.firstHeading, body.page-Portada.action-submit h1.firstHeading { display: none; padding-bottom: 0 !important; }&lt;br /&gt;
body.page-Hauptseite.action-view h1.firstHeading, body.page-Hauptseite.action-submit h1.firstHeading { display: none; padding-bottom: 0 !important; }&lt;br /&gt;
body.page-Αρχική.action-view h1.firstHeading, body.page-Αρχική.action-submit h1.firstHeading { display: none; padding-bottom: 0 !important; }&lt;br /&gt;
body.page-Página_Principal.action-view h1.firstHeading, body.page-Página_Principal.action-submit h1.firstHeading { display: none; padding-bottom: 0 !important; }&lt;br /&gt;
body.page-简体中文官方文档.action-view h1.firstHeading, body.page-简体中文官方文档.action-submit h1.firstHeading { display: none; padding-bottom: 0 !important; }&lt;br /&gt;
body.page-ホームページ.action-view h1.firstHeading, body.page-ホームページ.action-submit h1.firstHeading { display: none; padding-bottom: 0 !important; }&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
/* Add by LDR to reduce size of logo */&lt;br /&gt;
#p-logo a { height: 60px; }&lt;br /&gt;
.mw-wiki-logo {&lt;br /&gt;
    background-size: contain;&lt;br /&gt;
    margin-top: 0.5em;&lt;br /&gt;
    background-image: url(/images/5/51/Dolibarr_124x124_white.svg);&lt;br /&gt;
}&lt;br /&gt;
#p-logo {&lt;br /&gt;
    height: 60px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Add LDR to increase font size */&lt;br /&gt;
html, body {&lt;br /&gt;
  font-size: 1.1em;&lt;br /&gt;
  font-family: Roboto,Arial,Verdana,Helvetica;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body-content .dolbox p {&lt;br /&gt;
	margin: 0px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h2:not(#mw-toc-heading) {&lt;br /&gt;
    background-image: linear-gradient(120deg, rgb(38, 60, 92, 0.3) 0%, rgba(140, 100, 152, 1) 100%);&lt;br /&gt;
    background-repeat: no-repeat;&lt;br /&gt;
    background-size: 100px 0.2em;&lt;br /&gt;
    background-position: 0 90%;&lt;br /&gt;
    padding-bottom: 20px !important;&lt;br /&gt;
    border-bottom: none;&lt;br /&gt;
}&lt;br /&gt;
h2 + table.dolbox {&lt;br /&gt;
    margin-top: 25px;&lt;br /&gt;
}&lt;br /&gt;
table.dolbox {&lt;br /&gt;
    margin-top: 0;&lt;br /&gt;
    padding: 10px;&lt;br /&gt;
    border: 2px solid #000;&lt;br /&gt;
    border-radius: 6px;&lt;br /&gt;
}&lt;br /&gt;
table.dolbox tr td {&lt;br /&gt;
    /* border: 1px #f0f0f0 solid; */&lt;br /&gt;
}&lt;br /&gt;
table.dolbox.marginleft {&lt;br /&gt;
    margin-left: 20px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* For title style */&lt;br /&gt;
.mw-body h1, .mw-body-content h1, .mw-body-content h2, .mw-body-content h3, .mw-body-content h4 {&lt;br /&gt;
    font-family: Roboto,Arial,Verdana,Helvetica;&lt;br /&gt;
}&lt;br /&gt;
h1 .mw-headline, .searchresults .mw-headline {&lt;br /&gt;
	color: rgb(0,135,160);&lt;br /&gt;
}&lt;br /&gt;
h2 .mw-headline, .searchresults .mw-headline {&lt;br /&gt;
	color: rgb(0,135,160);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
h1#firstHeading {&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    border-bottom: none;&lt;br /&gt;
    margin-top: 0.2em !important;&lt;br /&gt;
    /* text-shadow: 3px 3px 5px #DDD; */&lt;br /&gt;
    color: #220050 !important;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    padding-bottom: 1em;&lt;br /&gt;
}&lt;br /&gt;
.mw-body h1, .mw-body-content h1 {&lt;br /&gt;
    font-size: 1.6em;&lt;br /&gt;
	margin-top: 1.5em;&lt;br /&gt;
}&lt;br /&gt;
.mw-body h2, .mw-body-content h2 {&lt;br /&gt;
    font-size: 1.6em;&lt;br /&gt;
    margin-top: 2.5em;&lt;br /&gt;
    padding-bottom: 0.2em;&lt;br /&gt;
}&lt;br /&gt;
.mw-body h3, .mw-body-content h3 {&lt;br /&gt;
	color: #220050;&lt;br /&gt;
    font-size: 1.3em;&lt;br /&gt;
    padding-bottom: 10px;&lt;br /&gt;
}&lt;br /&gt;
h2 + h3 {&lt;br /&gt;
    padding-top: 10px !important;&lt;br /&gt;
}&lt;br /&gt;
h3 {&lt;br /&gt;
    padding-top: 20px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
div.company {&lt;br /&gt;
        margin-left: 0px;&lt;br /&gt;
        margin-bottom: 40px;&lt;br /&gt;
        margin-top: 30px;&lt;br /&gt;
        background-color: #FBFAFC;&lt;br /&gt;
		-moz-border-radius: 10px;&lt;br /&gt;
		border-radius: 10px;&lt;br /&gt;
		box-shadow: 1px 1px 20px #ccc;&lt;br /&gt;
/*&lt;br /&gt;
		padding-left: 10px;&lt;br /&gt;
		padding-right: 12px;&lt;br /&gt;
*/		&lt;br /&gt;
	padding-left: 20px;&lt;br /&gt;
    padding-right: 20px;&lt;br /&gt;
    padding-top: 15px;&lt;br /&gt;
    padding-bottom: 15px;		&lt;br /&gt;
}&lt;br /&gt;
div.companylogo {&lt;br /&gt;
	text-align: right;&lt;br /&gt;
	margin-right: 15px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* For images / screenshots */&lt;br /&gt;
div.divforimgcentpercent {&lt;br /&gt;
	text-align: center;&lt;br /&gt;
	margin-top: 15px;&lt;br /&gt;
	margin-bottom: 15px;&lt;br /&gt;
}&lt;br /&gt;
div.divforimgcentpercent p a img {&lt;br /&gt;
    width: 90% !important;&lt;br /&gt;
    height: auto !important;&lt;br /&gt;
	box-shadow: 1px 1px 15px #ccc;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Add link to mobile if we are on large display */&lt;br /&gt;
@media (min-width: 1024px) {&lt;br /&gt;
	#footer-places { display: none; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hide some tabs when we don&#039;t have edit permissions */&lt;br /&gt;
body:not(.mw-editable) #ca-nstab-main { display: none; }&lt;br /&gt;
body:not(.mw-editable) #ca-view { display: none; }&lt;br /&gt;
body:not(.mw-editable) #ca-viewsource { display: none; }&lt;br /&gt;
&lt;br /&gt;
#p-views ul li.selected {&lt;br /&gt;
    background: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.vectorTabs, .vectorTabs ul, .vectorTabs li, .vectorTabs #ca-history span, .vectorTabs #ca-watch span {&lt;br /&gt;
    background-image: none;&lt;br /&gt;
}&lt;br /&gt;
.vectorTabs li {&lt;br /&gt;
	line-height: unset;&lt;br /&gt;
}&lt;br /&gt;
	&lt;br /&gt;
/* Allow word wrap */&lt;br /&gt;
pre {&lt;br /&gt;
	word-break: break-word;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
table.dolbox {&lt;br /&gt;
    margin-right: 5px;&lt;br /&gt;
    /* margin-left: 25px; */&lt;br /&gt;
    margin-bottom: 15px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Allow limiting of which header levels are shown in a TOC;&lt;br /&gt;
 * &amp;lt;div class=&amp;quot;toclimit-3&amp;quot;&amp;gt;, for instance, will limit to&lt;br /&gt;
 * showing ==headings== and ===headings=== but no further.&lt;br /&gt;
 * Used in [[Template:TOC]]&lt;br /&gt;
 */&lt;br /&gt;
.toclimit-1 li.toclevel-2,&lt;br /&gt;
.toclimit-1 li.toclevel-3,&lt;br /&gt;
.toclimit-1 li.toclevel-4,&lt;br /&gt;
.toclimit-1 li.toclevel-5,&lt;br /&gt;
.toclimit-1 li.toclevel-6&lt;br /&gt;
{&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wraponmobile {&lt;br /&gt;
	white-space: nowrap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
a#stopMobileRedirectToggle {&lt;br /&gt;
	font-size: 1.3em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wikibox {&lt;br /&gt;
	box-shadow: 2px 2px 10px #bbb;&lt;br /&gt;
	border:unset !important;&lt;br /&gt;
}&lt;br /&gt;
center, center p, .wikibox p {&lt;br /&gt;
    text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
p {&lt;br /&gt;
    text-align: justify;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wikibox {&lt;br /&gt;
text-align: center;&lt;br /&gt;
float:right; &lt;br /&gt;
font-size:80%; &lt;br /&gt;
background: #eef; &lt;br /&gt;
border: 1px solid #ccf; &lt;br /&gt;
margin-bottom: 0px; &lt;br /&gt;
margin-left: 25px; &lt;br /&gt;
margin-right: 25px; &lt;br /&gt;
padding: 1px; &lt;br /&gt;
height: 120px;&lt;br /&gt;
width: 150px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.suggestions-result {&lt;br /&gt;
	line-height: 2em !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Test for combo list of lang&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
h3#p-lang-label {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Conteneur */&lt;br /&gt;
#p-lang .vector-menu-content {&lt;br /&gt;
    position: relative;&lt;br /&gt;
    float: left;&lt;br /&gt;
    width: 90%;&lt;br /&gt;
    font-family: sans-serif;&lt;br /&gt;
    padding-top: 5px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Cache la liste par défaut */&lt;br /&gt;
#p-lang .vector-menu-content-list {&lt;br /&gt;
    max-height: 0;&lt;br /&gt;
    overflow: hidden;&lt;br /&gt;
&lt;br /&gt;
    list-style: none;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    top: 100%;&lt;br /&gt;
    left: 0;&lt;br /&gt;
&lt;br /&gt;
    width: 100%;&lt;br /&gt;
&lt;br /&gt;
    background: white;&lt;br /&gt;
    &lt;br /&gt;
    transition: max-height 0.3s ease;&lt;br /&gt;
    z-index: 1000;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Affiche au survol */&lt;br /&gt;
#p-lang .vector-menu-content:hover .vector-menu-content-list {&lt;br /&gt;
    max-height: 500px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Bouton visible */&lt;br /&gt;
#p-lang .vector-menu-content::before {&lt;br /&gt;
    content: &amp;quot;Language ▼&amp;quot;;&lt;br /&gt;
    display: block;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
    font-size: 0.75em;&lt;br /&gt;
    color: #54595d;&lt;br /&gt;
    padding-bottom: 5px;&lt;br /&gt;
    padding-top: 5px;&lt;br /&gt;
    border-bottom: 1px solid #ccc;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Styles des liens */&lt;br /&gt;
#p-lang .vector-menu-content-list li a {&lt;br /&gt;
    display: block;&lt;br /&gt;
    padding: 8px 12px;&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
    color: #333;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#p-lang .vector-menu-content-list li a:hover {&lt;br /&gt;
    background: #eee;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Eldy</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Developer_documentation&amp;diff=68398</id>
		<title>Developer documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Developer_documentation&amp;diff=68398"/>
		<updated>2026-10-21T20:15:20Z</updated>

		<summary type="html">&lt;p&gt;Eldy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#metamaster:keywords|developer, development, documentation, guide, doc, tutorial, usage, help, api, coding, standard, rules}}&lt;br /&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 : Developer_documentation --&amp;gt;&lt;br /&gt;
[[fr:Documentation_Développeur]]&lt;br /&gt;
[[es:Documentación_Desarrolladores]]&lt;br /&gt;
[[de:Entwickler_Dokumentation]]&lt;br /&gt;
[[zh:开发文档]]&lt;br /&gt;
[[ja:JA_Developer_documentation]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This page is main index of documents relating to developer documentation. For user documentation [[User documentation|see here]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Development organization and tools=&lt;br /&gt;
This chapter contains global information that must be read before starting any development on Dolibarr.&lt;br /&gt;
&lt;br /&gt;
#[[Dolibarr Project|Organization of project]]&lt;br /&gt;
#[[To known before to start|To be known before starting to develop]]&lt;br /&gt;
#[[Environment and development tools]]&lt;br /&gt;
#[[Dependencies and external libraries]]&lt;br /&gt;
#[[FAQ_Get,update_project_sources|Get or update sources of a development version]]&lt;br /&gt;
&lt;br /&gt;
=Coding rules and best practices=&lt;br /&gt;
&lt;br /&gt;
#[[Prerequisite|Prerequisites]]&lt;br /&gt;
#[[Language and development rules|Language and development rules (PHP, SQL, HTML)]]&lt;br /&gt;
#[[:Category:Table SQL|List of tables]]&lt;br /&gt;
#Tree structure of files and classes are available in the [https://doxygen.dolibarr.org/ doxygen generated documentation]&lt;br /&gt;
&lt;br /&gt;
=List of modules=&lt;br /&gt;
Technical documentation on standard business modules is available in each module&#039;s developer documentation pages. Choose the appropriate page you are interested in:&lt;br /&gt;
&lt;br /&gt;
*[[:Category:List of Modules (developer)‎|List of standard modules]]&lt;br /&gt;
*[[:Category:Complementary modules|List of complementary modules]]&lt;br /&gt;
*[[Informations for developpers of complementary modules]]&lt;br /&gt;
&lt;br /&gt;
=To develop a new module/addon for GUI=&lt;br /&gt;
This section describes how to develop a new module changing the Dolibarr user interface. This can be screens, themes, data, its own CSS stylesheet, source code or all of this.&lt;br /&gt;
&lt;br /&gt;
Script development is not included in this section (this is described in the next chapter).&lt;br /&gt;
&lt;br /&gt;
To develop your own module, check the [[Module development]] tutorial.&lt;br /&gt;
&lt;br /&gt;
=To develop a batch or command line script=&lt;br /&gt;
This chapter describes how to develop command line scripts to execute tasks in Dolibarr (read, update data...).&lt;br /&gt;
&lt;br /&gt;
Making modifications to the graphical user interface (GUI) is not included in this chapter. See the previous chapter for this.&lt;br /&gt;
&lt;br /&gt;
To develop a script, like a cron script or a command line import tool to import data from an external source, you can have a look at the [[Script development]] page.&lt;br /&gt;
&lt;br /&gt;
=Technical components of Dolibarr=&lt;br /&gt;
==Tree structure==&lt;br /&gt;
The path hierarchy of the current version files is available from the [http://doxygen.dolibarr.org/ doxygen generated documentation] (similar to generated &amp;quot;javadoc&amp;quot; documentation).&lt;br /&gt;
&lt;br /&gt;
Paths to use to add new files by a new module are defined in the documentation to develop a new module (see [[Module development]]).&lt;br /&gt;
&lt;br /&gt;
==Setup storage==&lt;br /&gt;
There are 3 places for Dolibarr setup parameters.&lt;br /&gt;
&lt;br /&gt;
*Dolibarr technical setup parameters (authentication mode, database logins and storage area for files) are defined in only one setup file: &amp;lt;code&amp;gt;/conf/conf.php&amp;lt;/code&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
:See [[Configuration file]] for more information.&lt;br /&gt;
&lt;br /&gt;
*Global features parameters are stored in [[Table llx_const]].&lt;br /&gt;
&lt;br /&gt;
:See the [[Constants]] page for more information.&lt;br /&gt;
&lt;br /&gt;
*Feature parameters specific to a user are stored in [[Table llx_user_param]].&lt;br /&gt;
&lt;br /&gt;
==Business objects==&lt;br /&gt;
See [[Business Objects]] &lt;br /&gt;
&lt;br /&gt;
==Menus system==&lt;br /&gt;
See [[Menus system]] &lt;br /&gt;
&lt;br /&gt;
==Tabs system==&lt;br /&gt;
See [[Tabs system]] &lt;br /&gt;
&lt;br /&gt;
==Skins system==&lt;br /&gt;
See [[Skins]] &lt;br /&gt;
&lt;br /&gt;
==Widget system==&lt;br /&gt;
See [[Widget system]]&lt;br /&gt;
&lt;br /&gt;
==Authentication system==&lt;br /&gt;
See [[Authentication]] &lt;br /&gt;
&lt;br /&gt;
==Permission system==&lt;br /&gt;
See [[Permissions En|Permissions]] &lt;br /&gt;
&lt;br /&gt;
==Translation system==&lt;br /&gt;
See [[Translation system]] &lt;br /&gt;
&lt;br /&gt;
==Error management==&lt;br /&gt;
See [[Error reporting|Error reporting]] &lt;br /&gt;
&lt;br /&gt;
==Canvas system==&lt;br /&gt;
Canvas is a developer feature to replace screens to create, update or view a record (products, thirdparties, contacts, ...). For example, you can replace the input form used to create a new third party, or its editing form, or replace its viewing template.&lt;br /&gt;
 &lt;br /&gt;
See [[Canvas development]] &lt;br /&gt;
&lt;br /&gt;
==Triggers system==&lt;br /&gt;
Triggers are a development feature to execute personalized code during a Dolibarr &amp;quot;business event&amp;quot; (creation of an invoice, deleting a user, update of third party, etc...), and only for a business event. To personalize code for other contexts, see the &#039;&#039;&#039;Hooks system&#039;&#039;&#039; chapter instead.&lt;br /&gt;
&lt;br /&gt;
For triggers usage, see [[Interfaces Dolibarr toward foreign systems|this page]].&lt;br /&gt;
&lt;br /&gt;
==Hooks system==&lt;br /&gt;
See [[Hooks system]] &lt;br /&gt;
&lt;br /&gt;
==Variable substitution system==&lt;br /&gt;
See [[Variable substitution system]] &lt;br /&gt;
&lt;br /&gt;
==Web services==&lt;br /&gt;
Dolibarr can be setup to provide some services.&lt;br /&gt;
&lt;br /&gt;
See [[Module Web Services API REST (developer)]] &lt;br /&gt;
&lt;br /&gt;
Note: The [[Module Web Services API SOAP (developer)]] is deprecated.&lt;br /&gt;
&lt;br /&gt;
==Files/Documents storage management==&lt;br /&gt;
See [[Generated documents]] &lt;br /&gt;
&lt;br /&gt;
==Numbering modules==&lt;br /&gt;
For each entity created in the application, Dolibarr assigns a reference. In order to adapt the reference to any use, Dolibarr use modules to define the reference generation rule. Several standard modules are supplied. Some are generic and are used to define the numbering mask (number on x characters, with or without prefix, including the date or not, etc.), which can meet most needs. However, there are still cases where the modules provided don&#039;t meet the needs. In this case it is necessary to develop a custom numbering module.&lt;br /&gt;
&lt;br /&gt;
For more information, see [[Create numeration module|Create numbering module]].&lt;br /&gt;
&lt;br /&gt;
==Document templates and documents generation==&lt;br /&gt;
&lt;br /&gt;
More documentation about document generation from templates is available to [[Create a PDF document template]] or [[Create an ODT document template]].&lt;br /&gt;
&lt;br /&gt;
==Extrafields==&lt;br /&gt;
See [[Extrafields]]&lt;br /&gt;
&lt;br /&gt;
==Online payment system==&lt;br /&gt;
See [[Online payment system]]&lt;br /&gt;
&lt;br /&gt;
==Other internal function==&lt;br /&gt;
There are many internal libraries your code can use.&lt;br /&gt;
You may find a lot of generic functions in the functions.lib.php, functions2.lib.php or admin.lib.php. Any function found in htdocs/core/lib/*.lib files can be used.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;To specify a requirement based on Dolibarr version number&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
For example, to make a condition based on requiring Dolibarr version &amp;gt; 3.5, you can use versioncompare and versiondolibarrarray found in admin.lib.php:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
if (versioncompare(versiondolibarrarray(), array(3,5,0)) &amp;gt; 0)&lt;br /&gt;
{&lt;br /&gt;
 ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Mass exports/imports=&lt;br /&gt;
&lt;br /&gt;
*[[Mass imports]]&lt;br /&gt;
*[[Module Exports En|Mass exports]]&lt;br /&gt;
&lt;br /&gt;
=Interfaces and links with other applications=&lt;br /&gt;
&lt;br /&gt;
Interfaces using API or WebHooks:&lt;br /&gt;
&lt;br /&gt;
*[[Interfaces Dolibarr toward foreign systems]] or Dolibarr toward Dolibarr (Dolibarr Triggers, Hooks or WebHooks)&lt;br /&gt;
*[[Interfaces from foreign systems toward Dolibarr]] (API WebServices)&lt;br /&gt;
&lt;br /&gt;
Integrate Dolibarr to synchronization platforms: &lt;br /&gt;
&lt;br /&gt;
*[[Module Splash|Integration of Dolibarr with Splash]]&lt;br /&gt;
&lt;br /&gt;
Integrate Dolibarr to automation/no code platforms:&lt;br /&gt;
&lt;br /&gt;
*[[Integration of Dolibarr to the Zapier automation platform]]&lt;br /&gt;
*[[Integration of Dolibarr to the n8n automation platform]]&lt;br /&gt;
*[[Integration of Dolibarr to the Make automation platform]]&lt;br /&gt;
&lt;br /&gt;
Integrate Dolibarr to ELT/ETL/data integration/no code platforms:&lt;br /&gt;
&lt;br /&gt;
*[[Integration of Dolibarr to the Airbyte data integration platform]]&lt;br /&gt;
&lt;br /&gt;
=FAQ=&lt;br /&gt;
All FAQs are available through the FAQ index page [[:Category:FAQ EN|FAQ EN]]&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Eldy</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Home&amp;diff=68397</id>
		<title>Home</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Home&amp;diff=68397"/>
		<updated>2026-10-21T20:11:25Z</updated>

		<summary type="html">&lt;p&gt;Eldy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN origin interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- You can edit this section but do NOT remove these comments&lt;br /&gt;
     Links below will be automatically replicated on translated pages by PolyglotBot --&amp;gt;&lt;br /&gt;
[[fr:Accueil]]&lt;br /&gt;
[[es:Portada]]&lt;br /&gt;
[[de:Hauptseite]]&lt;br /&gt;
[[el:Αρχική]]&lt;br /&gt;
[[pt:Página Principal]]&lt;br /&gt;
[[zh:简体中文官方文档]]&lt;br /&gt;
[[ja:ホームページ]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
{{#metamaster:keywords|documentation, help, information, development, user, guide, tutorial, wiki, dolibarr}}&lt;br /&gt;
{{DISPLAYTITLE:Open source software for business}}&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
[[File:Dolibarr logo.png|180x180px|link=]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Be free to manage your business, freelance or association activity&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
This wiki contains all the documentation (&#039;&#039;&#039;users&#039;&#039;&#039;, &#039;&#039;&#039;developers&#039;&#039;&#039; and &#039;&#039;&#039;translators&#039;&#039;&#039; documentation) and resources about Dolibarr ERP/CRM.&lt;br /&gt;
Downloads of application are available on the Dolibarr project web portal (go to https://www.dolibarr.org). You can contribute to this documentation by creating an account.&lt;br /&gt;
&lt;br /&gt;
{{Info}}{{InfoEn}}&lt;br /&gt;
&lt;br /&gt;
=[[File:art.png|link=]] The project=&lt;br /&gt;
&lt;br /&gt;
*[[What Dolibarr Does|What is Dolibarr ?]] - [[FAQ Who uses Dolibarr|Who uses Dolibarr ?]]&lt;br /&gt;
*[[Dolibarr Project|Resources, history and project organization]]&lt;br /&gt;
*[[Dolibarr foundation|The Dolibarr foundation]]&lt;br /&gt;
*[https://www.dolibarr.org/onlinedemo Online demos]&lt;br /&gt;
*[https://www.dolibarr.org/downloads Downloads]&lt;br /&gt;
&lt;br /&gt;
=[[File:File_Doc_user.png|link=]] User documentation=&lt;br /&gt;
&lt;br /&gt;
*[[User documentation]] and [[User FAQ]]&lt;br /&gt;
*[https://www.youtube.com/playlist?list=PL317BA167DF5A1D3E The Video tutorials]&lt;br /&gt;
*[[Dolibarr help and support|Help and support center]] for users (community forum, commercial support...)&lt;br /&gt;
*[[Security information]]&lt;br /&gt;
&lt;br /&gt;
=[[File:File_Doc_dev.png|link=]] Developer documentation=&lt;br /&gt;
&lt;br /&gt;
*[[Developer documentation]] and [[Developer FAQ]]&lt;br /&gt;
*[[Dolibarr help and support|Help and support center]] for developers (community forum, commercial support...)&lt;br /&gt;
*[[Dolibarr Project|Resources and project organization]]&lt;br /&gt;
&lt;br /&gt;
=[[File:File_Doc_trans.png|link=]] Translators documentation=&lt;br /&gt;
&lt;br /&gt;
*[[Translator documentation]]&lt;br /&gt;
&lt;br /&gt;
=[[File:File_Doc_tester.png|link=]] Testers documentation=&lt;br /&gt;
&lt;br /&gt;
*[[Tester documentation]]&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;br /&gt;
__NOEDITSECTION__&lt;br /&gt;
[[Category:Proofreading done]]&lt;/div&gt;</summary>
		<author><name>Eldy</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Imports_de_masse_-_Migrer_mes_donn%C3%A9es_dans_Dolibarr&amp;diff=68396</id>
		<title>Imports de masse - Migrer mes données dans Dolibarr</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Imports_de_masse_-_Migrer_mes_donn%C3%A9es_dans_Dolibarr&amp;diff=68396"/>
		<updated>2026-10-21T15:49:19Z</updated>

		<summary type="html">&lt;p&gt;Eldy: /* File:OpenOffice.png Utiliser un ETL ou une passerelle outil Tiers */&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 : Mass_imports_-_Migrate_my_Data_To_Dolibarr --&amp;gt;&lt;br /&gt;
[[en:Mass_imports_-_Migrate_my_Data_To_Dolibarr]]&lt;br /&gt;
[[es:Importaciones]]&lt;br /&gt;
[[zh:批量导入]]&lt;br /&gt;
[[ja:一括インポート]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Admin fr]]&lt;br /&gt;
[[Category:Imports]]&lt;br /&gt;
{{TemplateDocDev}}&lt;br /&gt;
Suite à une installation neuve de Dolibarr, les bases sont vides. Parfois on désire démarrer avec des données importées d&#039;un autre système.&lt;br /&gt;
Il existe plusieurs méthodes possibles. Les chapitres suivante présentes quelques informations pour vous y aider.&lt;br /&gt;
&lt;br /&gt;
Il y a plusieurs méthodes d&#039;import de données. Les chapitres suivant fournissent des informations sur celle ci. Les informations pour exporter des données sont décrites sur la page [[Module Exports]].&lt;br /&gt;
&lt;br /&gt;
Attention, si l&#039;objectif est d&#039;importer depuis une autre base Dolibarr, ce n&#039;est pas l&#039;import/export de masse qu&#039;il faut utiliser (dédiés aux imports/exports avec d&#039;autres systèmes), mais la procédure décrite sur le page [[Dupliquer_une_instance_de_production_en_instance_de_test]] ou bien les procédures de [[Sauvegardes]] et [[Restaurations]].&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Utiliser le module Import de Dolibarr =&lt;br /&gt;
Pour importer des données disponibles en fichiers (Excel ou CSV), vous pouvez décider d&#039;utiliser l&#039;outil d&#039;import. &lt;br /&gt;
&lt;br /&gt;
Vous trouverez cet assistant qui vous guidera étape par étape dans l&#039;importation de vos données. Cet outil est disponible si les [[Module Imports FR|Module Imports]] ont été activés.&lt;br /&gt;
Vous pouvez l&#039;utiliser pour importer des fichiers plats (CSV ou Excel). Pour éviter des problèmes de performances ou de mémoire, nous vous recommandons d&#039;utiliser des fichiers plats CSV comme fichiers sources au lieu de fichiers Excel ; Cet outil vous permettra d&#039;importer des données (une table par table) à partir de fichiers plats.&lt;br /&gt;
Cette méthode est lente, limitée à l&#039;objet pour lequel un profil d&#039;import prédéfini est disponible. L&#039;avantage est que la seule connaissance dont vous avez besoin pour l&#039;utiliser est de savoir comment obtenir un fichier plat CSV à partir de votre système source.&lt;br /&gt;
Vous trouverez plus d&#039;informations sur la page [[Module Imports FR|Module Imports]].&lt;br /&gt;
&lt;br /&gt;
Pour les scénarios d&#039;importation non couverts par le module intégré, les alternatives suivantes sont également possibles...&lt;br /&gt;
&lt;br /&gt;
= [[File:OpenOffice.png]] Utiliser un ETL ou une passerelle outil Tiers =&lt;br /&gt;
&lt;br /&gt;
Vous pouvez migrer des données d&#039;un logiciel/système externe vers Dolibarr en utilisant des outils tiers, capables de vous connecter à la fois à votre ancien système et à votre installation Dolibarr. Il peut s&#039;agir d&#039;un outil local ou d&#039;un outil SaaS en ligne si vos systèmes sont accessibles par un outil SaaS. La documentation et le processus dépendront de l&#039;outil tiers.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Outils commerciaux spécialisés&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Avec &#039;&#039;&#039;CRM Bridge&#039;&#039;&#039;, vous basculer vos données d&#039;un logiciel vers un autre (comme Dolibarr). Voir [https://crm-bridge.fr/dolibarr?gbraid=0AAAABE0nmV_6W86CxwH5jNJ8FJdtYnPkG https://crm-bridge.fr/]&lt;br /&gt;
&lt;br /&gt;
* Avec &#039;&#039;&#039;Airbyte&#039;&#039;&#039;, vous pouvez lire la page [[Integration of Dolibarr to the Airbyte data integration platform]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Logiciels indépendants&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Vous pouvez utiliser &#039;&#039;&#039;LibreOffice&#039;&#039;&#039; qui est capable d&#039;injecter le contenu d&#039;un tableau dans la base une base de donnée Mysql Dolibarr. Voici un tutorial sur cette méthode : [[Importer des données avec LibreOffice]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Logiciels d&#039;Automation&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Des outils d&#039;automatisation spécialisés dans la migration de donnée peuvent aussi faire le travail. Voir la page [[:Category:No_Code_Automation]]&lt;br /&gt;
&lt;br /&gt;
= [[File:Outils.png]] Développer son propre script d&#039;import =&lt;br /&gt;
&lt;br /&gt;
Vous pouvez décider de développer des scripts personnalisés pour charger des données dans la base de données Dolibarr.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez développer des scripts personnalisés pour lire vos informations source. En fonction de votre système source, vous pouvez effectuer :&lt;br /&gt;
&lt;br /&gt;
* Un accès direct à la base de données pour lire les données&lt;br /&gt;
* Utiliser l&#039;API de votre système source pour lire ses données. &lt;br /&gt;
* Si le système source est un autre Dolibarr, vous pouvez également utiliser les objets CRUD de Dolibarr (la Classe PHP pour manipuler les objets Data, vous pouvez donc appeler les méthodes fetch() et fetchAll() pour récupérer les données). Cela nécessite d&#039;avoir des connaissances en développement PHP.&lt;br /&gt;
&lt;br /&gt;
Ces scripts peuvent ensuite écrire les données lues dans votre Dolibarr cible en utilisant également les 3 méthodes:&lt;br /&gt;
&lt;br /&gt;
* L&#039;utilisation de l&#039;API est la méthode la plus sécurisée (la plupart des contrôles métier sont inclus).&lt;br /&gt;
* Utiliser les objets de la classe CRUD pour appeler la méthode (vous pouvez donc appeler la méthode fetch() pour vérifier si l&#039;objet existe déjà dans la cible, appeler la méthode create() ou update() pour insérer ou mettre à jour l&#039;enregistrement). Cela nécessite d&#039;avoir des connaissances en développement PHP. Vous pouvez trouver des exemples de script pour charger des données de fichiers CSV dans la base de données en utilisant la deuxième méthode (objets Dolibarr CRUD) dans ce répertoire : https://github.com/Dolibarr/dolibarr/tree/develop/dev/initdata&lt;br /&gt;
* Vous pouvez également effectuer une écriture directe dans la base de données par un accès direct à la base de données (cette méthode n&#039;est pas recommandée car elle contourne toutes les règles métier implémentées dans la classe CRUD ou dans les API, cependant, elle est la plus performante). Cela nécessite de comprendre la structure de la base de données. Ce n&#039;est pas si difficile car chaque donnée est enregistrée une et une seule fois dans la structure de la base de données Dolibarr.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici des exemples de quelques cas d&#039;utilisation :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Import des tiers et contacts ==&lt;br /&gt;
Il faut distinguer les tiers des contacts physiques.&lt;br /&gt;
Dans les tiers on aura toutes les entités sujettes à facturation (aussi bien entreprises, association que particuliers). Les tiers sont obligatoires.&lt;br /&gt;
Les contacts physiques sont optionnels. Il s&#039;agit juste d&#039;un annuaire de personnes (avec téléphone et fonction) liées à un tiers. Dans le cas d&#039;un tiers entreprise, il pourra y avoir plusieurs contacts physiques. Dans le cas d&#039;un particulier, le contact physique sera unique et identique au tiers (voire le contact physique ne sera pas renseigné).&lt;br /&gt;
&lt;br /&gt;
L&#039;import des tiers consiste à insérer des lignes dans la table [[Table llx_societe]].&lt;br /&gt;
S&#039;assurer que les champs importants sont bien renseignés:&lt;br /&gt;
* Nom: Doit contenir le nom de la société&lt;br /&gt;
* Client: Doit contenir 1 si client, 2 si prospect, 3 si prospect+client, 0 sinon&lt;br /&gt;
* Fournisseur: Doit contenir 1 si fournisseur, 0 sinon&lt;br /&gt;
&lt;br /&gt;
L&#039;import des contacts physiques consiste à insérer des lignes dans la table [[Table llx_socpeople]].&lt;br /&gt;
S&#039;assurer que les champs importants sont bien renseignés:&lt;br /&gt;
* Name: Doit contenir le nom de la personne&lt;br /&gt;
* Firstname: Doit contenir le prénom de la société&lt;br /&gt;
* fk_soc: Doit contenir l&#039;id de la ligne Tiers dans la [[Table llx_societe]].&lt;br /&gt;
&lt;br /&gt;
== Import des produits ou services ==&lt;br /&gt;
L&#039;import des tiers consiste à insérer des lignes dans la table [[Table llx_product]].&lt;br /&gt;
S&#039;assurer que les champs importants sont bien renseignés:&lt;br /&gt;
* Ref: Doit contenir la référence courte du produit&lt;br /&gt;
* Nom: Doit contenir le libellé du produit&lt;br /&gt;
* Type: Doit contenir 0 pour un produit, 1 pour un service&lt;br /&gt;
&lt;br /&gt;
== Import des factures ==&lt;br /&gt;
A compléter&lt;br /&gt;
&lt;br /&gt;
== Mise en pratique ==&lt;br /&gt;
La page [[Développement de scripts]] vous explique comment créer votre propre script de traitement Dolibarr.&lt;br /&gt;
&lt;br /&gt;
== Quelques didacticiels/exemples soumis par la communauté ==&lt;br /&gt;
Des scripts exemples sont disponibles avec la distribution snapshot de Dolibarr dans le répertoire &#039;&#039;&#039;/dev/samples&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
D&#039;autres exemples sont soumis par des contributeurs:&lt;br /&gt;
* [[Importer des clients en automatique]]&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
=Sous-traiter à un Freelance=&lt;br /&gt;
Vous pouvez également faire appel à un expert qui choisira la meilleure méthode et réalisera les actions à votre place.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez vous appuyer par exemple sur un Partenaire Préféré Dolibarr https://partners.dolibarr.org&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Vidéos sur le sujet=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;youtube width=&amp;quot;200&amp;quot; height=&amp;quot;120&amp;quot;&amp;gt;WAv9wHIjy9c&amp;lt;/youtube&amp;gt;&lt;/div&gt;</summary>
		<author><name>Eldy</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Imports_de_masse_-_Migrer_mes_donn%C3%A9es_dans_Dolibarr&amp;diff=68395</id>
		<title>Imports de masse - Migrer mes données dans Dolibarr</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Imports_de_masse_-_Migrer_mes_donn%C3%A9es_dans_Dolibarr&amp;diff=68395"/>
		<updated>2026-10-21T15:49:08Z</updated>

		<summary type="html">&lt;p&gt;Eldy: /* File:OpenOffice.png Utiliser un ETL ou une passerelle outil Tiers */&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 : Mass_imports_-_Migrate_my_Data_To_Dolibarr --&amp;gt;&lt;br /&gt;
[[en:Mass_imports_-_Migrate_my_Data_To_Dolibarr]]&lt;br /&gt;
[[es:Importaciones]]&lt;br /&gt;
[[zh:批量导入]]&lt;br /&gt;
[[ja:一括インポート]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Admin fr]]&lt;br /&gt;
[[Category:Imports]]&lt;br /&gt;
{{TemplateDocDev}}&lt;br /&gt;
Suite à une installation neuve de Dolibarr, les bases sont vides. Parfois on désire démarrer avec des données importées d&#039;un autre système.&lt;br /&gt;
Il existe plusieurs méthodes possibles. Les chapitres suivante présentes quelques informations pour vous y aider.&lt;br /&gt;
&lt;br /&gt;
Il y a plusieurs méthodes d&#039;import de données. Les chapitres suivant fournissent des informations sur celle ci. Les informations pour exporter des données sont décrites sur la page [[Module Exports]].&lt;br /&gt;
&lt;br /&gt;
Attention, si l&#039;objectif est d&#039;importer depuis une autre base Dolibarr, ce n&#039;est pas l&#039;import/export de masse qu&#039;il faut utiliser (dédiés aux imports/exports avec d&#039;autres systèmes), mais la procédure décrite sur le page [[Dupliquer_une_instance_de_production_en_instance_de_test]] ou bien les procédures de [[Sauvegardes]] et [[Restaurations]].&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Utiliser le module Import de Dolibarr =&lt;br /&gt;
Pour importer des données disponibles en fichiers (Excel ou CSV), vous pouvez décider d&#039;utiliser l&#039;outil d&#039;import. &lt;br /&gt;
&lt;br /&gt;
Vous trouverez cet assistant qui vous guidera étape par étape dans l&#039;importation de vos données. Cet outil est disponible si les [[Module Imports FR|Module Imports]] ont été activés.&lt;br /&gt;
Vous pouvez l&#039;utiliser pour importer des fichiers plats (CSV ou Excel). Pour éviter des problèmes de performances ou de mémoire, nous vous recommandons d&#039;utiliser des fichiers plats CSV comme fichiers sources au lieu de fichiers Excel ; Cet outil vous permettra d&#039;importer des données (une table par table) à partir de fichiers plats.&lt;br /&gt;
Cette méthode est lente, limitée à l&#039;objet pour lequel un profil d&#039;import prédéfini est disponible. L&#039;avantage est que la seule connaissance dont vous avez besoin pour l&#039;utiliser est de savoir comment obtenir un fichier plat CSV à partir de votre système source.&lt;br /&gt;
Vous trouverez plus d&#039;informations sur la page [[Module Imports FR|Module Imports]].&lt;br /&gt;
&lt;br /&gt;
Pour les scénarios d&#039;importation non couverts par le module intégré, les alternatives suivantes sont également possibles...&lt;br /&gt;
&lt;br /&gt;
= [[File:OpenOffice.png]] Utiliser un ETL ou une passerelle outil Tiers =&lt;br /&gt;
&lt;br /&gt;
Vous pouvez migrer des données d&#039;un logiciel/système externe vers Dolibarr en utilisant des outils tiers, capables de vous connecter à la fois à votre ancien système et à votre installation Dolibarr. Il peut s&#039;agir d&#039;un outil local ou d&#039;un outil SaaS en ligne si vos systèmes sont accessibles par un outil SaaS. La documentation et le processus dépendront de l&#039;outil tiers.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Outils commerciaux spécialisés&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Avec &#039;&#039;&#039;CRM Bridge&#039;&#039;&#039;, vous basculer vos données d&#039;un logiciel vers un autre (comme Dolibarr). Voir [https://crm-bridge.fr/ https://crm-bridge.fr/dolibarr?gbraid=0AAAABE0nmV_6W86CxwH5jNJ8FJdtYnPkG]&lt;br /&gt;
&lt;br /&gt;
* Avec &#039;&#039;&#039;Airbyte&#039;&#039;&#039;, vous pouvez lire la page [[Integration of Dolibarr to the Airbyte data integration platform]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Logiciels indépendants&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Vous pouvez utiliser &#039;&#039;&#039;LibreOffice&#039;&#039;&#039; qui est capable d&#039;injecter le contenu d&#039;un tableau dans la base une base de donnée Mysql Dolibarr. Voici un tutorial sur cette méthode : [[Importer des données avec LibreOffice]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Logiciels d&#039;Automation&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Des outils d&#039;automatisation spécialisés dans la migration de donnée peuvent aussi faire le travail. Voir la page [[:Category:No_Code_Automation]]&lt;br /&gt;
&lt;br /&gt;
= [[File:Outils.png]] Développer son propre script d&#039;import =&lt;br /&gt;
&lt;br /&gt;
Vous pouvez décider de développer des scripts personnalisés pour charger des données dans la base de données Dolibarr.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez développer des scripts personnalisés pour lire vos informations source. En fonction de votre système source, vous pouvez effectuer :&lt;br /&gt;
&lt;br /&gt;
* Un accès direct à la base de données pour lire les données&lt;br /&gt;
* Utiliser l&#039;API de votre système source pour lire ses données. &lt;br /&gt;
* Si le système source est un autre Dolibarr, vous pouvez également utiliser les objets CRUD de Dolibarr (la Classe PHP pour manipuler les objets Data, vous pouvez donc appeler les méthodes fetch() et fetchAll() pour récupérer les données). Cela nécessite d&#039;avoir des connaissances en développement PHP.&lt;br /&gt;
&lt;br /&gt;
Ces scripts peuvent ensuite écrire les données lues dans votre Dolibarr cible en utilisant également les 3 méthodes:&lt;br /&gt;
&lt;br /&gt;
* L&#039;utilisation de l&#039;API est la méthode la plus sécurisée (la plupart des contrôles métier sont inclus).&lt;br /&gt;
* Utiliser les objets de la classe CRUD pour appeler la méthode (vous pouvez donc appeler la méthode fetch() pour vérifier si l&#039;objet existe déjà dans la cible, appeler la méthode create() ou update() pour insérer ou mettre à jour l&#039;enregistrement). Cela nécessite d&#039;avoir des connaissances en développement PHP. Vous pouvez trouver des exemples de script pour charger des données de fichiers CSV dans la base de données en utilisant la deuxième méthode (objets Dolibarr CRUD) dans ce répertoire : https://github.com/Dolibarr/dolibarr/tree/develop/dev/initdata&lt;br /&gt;
* Vous pouvez également effectuer une écriture directe dans la base de données par un accès direct à la base de données (cette méthode n&#039;est pas recommandée car elle contourne toutes les règles métier implémentées dans la classe CRUD ou dans les API, cependant, elle est la plus performante). Cela nécessite de comprendre la structure de la base de données. Ce n&#039;est pas si difficile car chaque donnée est enregistrée une et une seule fois dans la structure de la base de données Dolibarr.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici des exemples de quelques cas d&#039;utilisation :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Import des tiers et contacts ==&lt;br /&gt;
Il faut distinguer les tiers des contacts physiques.&lt;br /&gt;
Dans les tiers on aura toutes les entités sujettes à facturation (aussi bien entreprises, association que particuliers). Les tiers sont obligatoires.&lt;br /&gt;
Les contacts physiques sont optionnels. Il s&#039;agit juste d&#039;un annuaire de personnes (avec téléphone et fonction) liées à un tiers. Dans le cas d&#039;un tiers entreprise, il pourra y avoir plusieurs contacts physiques. Dans le cas d&#039;un particulier, le contact physique sera unique et identique au tiers (voire le contact physique ne sera pas renseigné).&lt;br /&gt;
&lt;br /&gt;
L&#039;import des tiers consiste à insérer des lignes dans la table [[Table llx_societe]].&lt;br /&gt;
S&#039;assurer que les champs importants sont bien renseignés:&lt;br /&gt;
* Nom: Doit contenir le nom de la société&lt;br /&gt;
* Client: Doit contenir 1 si client, 2 si prospect, 3 si prospect+client, 0 sinon&lt;br /&gt;
* Fournisseur: Doit contenir 1 si fournisseur, 0 sinon&lt;br /&gt;
&lt;br /&gt;
L&#039;import des contacts physiques consiste à insérer des lignes dans la table [[Table llx_socpeople]].&lt;br /&gt;
S&#039;assurer que les champs importants sont bien renseignés:&lt;br /&gt;
* Name: Doit contenir le nom de la personne&lt;br /&gt;
* Firstname: Doit contenir le prénom de la société&lt;br /&gt;
* fk_soc: Doit contenir l&#039;id de la ligne Tiers dans la [[Table llx_societe]].&lt;br /&gt;
&lt;br /&gt;
== Import des produits ou services ==&lt;br /&gt;
L&#039;import des tiers consiste à insérer des lignes dans la table [[Table llx_product]].&lt;br /&gt;
S&#039;assurer que les champs importants sont bien renseignés:&lt;br /&gt;
* Ref: Doit contenir la référence courte du produit&lt;br /&gt;
* Nom: Doit contenir le libellé du produit&lt;br /&gt;
* Type: Doit contenir 0 pour un produit, 1 pour un service&lt;br /&gt;
&lt;br /&gt;
== Import des factures ==&lt;br /&gt;
A compléter&lt;br /&gt;
&lt;br /&gt;
== Mise en pratique ==&lt;br /&gt;
La page [[Développement de scripts]] vous explique comment créer votre propre script de traitement Dolibarr.&lt;br /&gt;
&lt;br /&gt;
== Quelques didacticiels/exemples soumis par la communauté ==&lt;br /&gt;
Des scripts exemples sont disponibles avec la distribution snapshot de Dolibarr dans le répertoire &#039;&#039;&#039;/dev/samples&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
D&#039;autres exemples sont soumis par des contributeurs:&lt;br /&gt;
* [[Importer des clients en automatique]]&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
=Sous-traiter à un Freelance=&lt;br /&gt;
Vous pouvez également faire appel à un expert qui choisira la meilleure méthode et réalisera les actions à votre place.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez vous appuyer par exemple sur un Partenaire Préféré Dolibarr https://partners.dolibarr.org&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Vidéos sur le sujet=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;youtube width=&amp;quot;200&amp;quot; height=&amp;quot;120&amp;quot;&amp;gt;WAv9wHIjy9c&amp;lt;/youtube&amp;gt;&lt;/div&gt;</summary>
		<author><name>Eldy</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Imports_de_masse_-_Migrer_mes_donn%C3%A9es_dans_Dolibarr&amp;diff=68394</id>
		<title>Imports de masse - Migrer mes données dans Dolibarr</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Imports_de_masse_-_Migrer_mes_donn%C3%A9es_dans_Dolibarr&amp;diff=68394"/>
		<updated>2026-10-21T15:48:02Z</updated>

		<summary type="html">&lt;p&gt;Eldy: /* File:OpenOffice.png Utiliser un ETL ou une passerelle outil Tiers */&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 : Mass_imports_-_Migrate_my_Data_To_Dolibarr --&amp;gt;&lt;br /&gt;
[[en:Mass_imports_-_Migrate_my_Data_To_Dolibarr]]&lt;br /&gt;
[[es:Importaciones]]&lt;br /&gt;
[[zh:批量导入]]&lt;br /&gt;
[[ja:一括インポート]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Admin fr]]&lt;br /&gt;
[[Category:Imports]]&lt;br /&gt;
{{TemplateDocDev}}&lt;br /&gt;
Suite à une installation neuve de Dolibarr, les bases sont vides. Parfois on désire démarrer avec des données importées d&#039;un autre système.&lt;br /&gt;
Il existe plusieurs méthodes possibles. Les chapitres suivante présentes quelques informations pour vous y aider.&lt;br /&gt;
&lt;br /&gt;
Il y a plusieurs méthodes d&#039;import de données. Les chapitres suivant fournissent des informations sur celle ci. Les informations pour exporter des données sont décrites sur la page [[Module Exports]].&lt;br /&gt;
&lt;br /&gt;
Attention, si l&#039;objectif est d&#039;importer depuis une autre base Dolibarr, ce n&#039;est pas l&#039;import/export de masse qu&#039;il faut utiliser (dédiés aux imports/exports avec d&#039;autres systèmes), mais la procédure décrite sur le page [[Dupliquer_une_instance_de_production_en_instance_de_test]] ou bien les procédures de [[Sauvegardes]] et [[Restaurations]].&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Utiliser le module Import de Dolibarr =&lt;br /&gt;
Pour importer des données disponibles en fichiers (Excel ou CSV), vous pouvez décider d&#039;utiliser l&#039;outil d&#039;import. &lt;br /&gt;
&lt;br /&gt;
Vous trouverez cet assistant qui vous guidera étape par étape dans l&#039;importation de vos données. Cet outil est disponible si les [[Module Imports FR|Module Imports]] ont été activés.&lt;br /&gt;
Vous pouvez l&#039;utiliser pour importer des fichiers plats (CSV ou Excel). Pour éviter des problèmes de performances ou de mémoire, nous vous recommandons d&#039;utiliser des fichiers plats CSV comme fichiers sources au lieu de fichiers Excel ; Cet outil vous permettra d&#039;importer des données (une table par table) à partir de fichiers plats.&lt;br /&gt;
Cette méthode est lente, limitée à l&#039;objet pour lequel un profil d&#039;import prédéfini est disponible. L&#039;avantage est que la seule connaissance dont vous avez besoin pour l&#039;utiliser est de savoir comment obtenir un fichier plat CSV à partir de votre système source.&lt;br /&gt;
Vous trouverez plus d&#039;informations sur la page [[Module Imports FR|Module Imports]].&lt;br /&gt;
&lt;br /&gt;
Pour les scénarios d&#039;importation non couverts par le module intégré, les alternatives suivantes sont également possibles...&lt;br /&gt;
&lt;br /&gt;
= [[File:OpenOffice.png]] Utiliser un ETL ou une passerelle outil Tiers =&lt;br /&gt;
&lt;br /&gt;
Vous pouvez migrer des données d&#039;un logiciel/système externe vers Dolibarr en utilisant des outils tiers, capables de vous connecter à la fois à votre ancien système et à votre installation Dolibarr. Il peut s&#039;agir d&#039;un outil local ou d&#039;un outil SaaS en ligne si vos systèmes sont accessibles par un outil SaaS. La documentation et le processus dépendront de l&#039;outil tiers.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Outils commerciaux spécialisés&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Avec &#039;&#039;&#039;CRM Bridge&#039;&#039;&#039;, vous basculer vos données d&#039;un logiciel vers un autre (comme Dolibarr). Voir https://crm-bridge.fr/&lt;br /&gt;
&lt;br /&gt;
* Avec &#039;&#039;&#039;Airbyte&#039;&#039;&#039;, vous pouvez lire la page [[Integration of Dolibarr to the Airbyte data integration platform]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Logiciels indépendants&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Vous pouvez utiliser &#039;&#039;&#039;LibreOffice&#039;&#039;&#039; qui est capable d&#039;injecter le contenu d&#039;un tableau dans la base une base de donnée Mysql Dolibarr. Voici un tutorial sur cette méthode : [[Importer des données avec LibreOffice]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Logiciels d&#039;Automation&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Des outils d&#039;automatisation spécialisés dans la migration de donnée peuvent aussi faire le travail. Voir la page [[:Category:No_Code_Automation]]&lt;br /&gt;
&lt;br /&gt;
= [[File:Outils.png]] Développer son propre script d&#039;import =&lt;br /&gt;
&lt;br /&gt;
Vous pouvez décider de développer des scripts personnalisés pour charger des données dans la base de données Dolibarr.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez développer des scripts personnalisés pour lire vos informations source. En fonction de votre système source, vous pouvez effectuer :&lt;br /&gt;
&lt;br /&gt;
* Un accès direct à la base de données pour lire les données&lt;br /&gt;
* Utiliser l&#039;API de votre système source pour lire ses données. &lt;br /&gt;
* Si le système source est un autre Dolibarr, vous pouvez également utiliser les objets CRUD de Dolibarr (la Classe PHP pour manipuler les objets Data, vous pouvez donc appeler les méthodes fetch() et fetchAll() pour récupérer les données). Cela nécessite d&#039;avoir des connaissances en développement PHP.&lt;br /&gt;
&lt;br /&gt;
Ces scripts peuvent ensuite écrire les données lues dans votre Dolibarr cible en utilisant également les 3 méthodes:&lt;br /&gt;
&lt;br /&gt;
* L&#039;utilisation de l&#039;API est la méthode la plus sécurisée (la plupart des contrôles métier sont inclus).&lt;br /&gt;
* Utiliser les objets de la classe CRUD pour appeler la méthode (vous pouvez donc appeler la méthode fetch() pour vérifier si l&#039;objet existe déjà dans la cible, appeler la méthode create() ou update() pour insérer ou mettre à jour l&#039;enregistrement). Cela nécessite d&#039;avoir des connaissances en développement PHP. Vous pouvez trouver des exemples de script pour charger des données de fichiers CSV dans la base de données en utilisant la deuxième méthode (objets Dolibarr CRUD) dans ce répertoire : https://github.com/Dolibarr/dolibarr/tree/develop/dev/initdata&lt;br /&gt;
* Vous pouvez également effectuer une écriture directe dans la base de données par un accès direct à la base de données (cette méthode n&#039;est pas recommandée car elle contourne toutes les règles métier implémentées dans la classe CRUD ou dans les API, cependant, elle est la plus performante). Cela nécessite de comprendre la structure de la base de données. Ce n&#039;est pas si difficile car chaque donnée est enregistrée une et une seule fois dans la structure de la base de données Dolibarr.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici des exemples de quelques cas d&#039;utilisation :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Import des tiers et contacts ==&lt;br /&gt;
Il faut distinguer les tiers des contacts physiques.&lt;br /&gt;
Dans les tiers on aura toutes les entités sujettes à facturation (aussi bien entreprises, association que particuliers). Les tiers sont obligatoires.&lt;br /&gt;
Les contacts physiques sont optionnels. Il s&#039;agit juste d&#039;un annuaire de personnes (avec téléphone et fonction) liées à un tiers. Dans le cas d&#039;un tiers entreprise, il pourra y avoir plusieurs contacts physiques. Dans le cas d&#039;un particulier, le contact physique sera unique et identique au tiers (voire le contact physique ne sera pas renseigné).&lt;br /&gt;
&lt;br /&gt;
L&#039;import des tiers consiste à insérer des lignes dans la table [[Table llx_societe]].&lt;br /&gt;
S&#039;assurer que les champs importants sont bien renseignés:&lt;br /&gt;
* Nom: Doit contenir le nom de la société&lt;br /&gt;
* Client: Doit contenir 1 si client, 2 si prospect, 3 si prospect+client, 0 sinon&lt;br /&gt;
* Fournisseur: Doit contenir 1 si fournisseur, 0 sinon&lt;br /&gt;
&lt;br /&gt;
L&#039;import des contacts physiques consiste à insérer des lignes dans la table [[Table llx_socpeople]].&lt;br /&gt;
S&#039;assurer que les champs importants sont bien renseignés:&lt;br /&gt;
* Name: Doit contenir le nom de la personne&lt;br /&gt;
* Firstname: Doit contenir le prénom de la société&lt;br /&gt;
* fk_soc: Doit contenir l&#039;id de la ligne Tiers dans la [[Table llx_societe]].&lt;br /&gt;
&lt;br /&gt;
== Import des produits ou services ==&lt;br /&gt;
L&#039;import des tiers consiste à insérer des lignes dans la table [[Table llx_product]].&lt;br /&gt;
S&#039;assurer que les champs importants sont bien renseignés:&lt;br /&gt;
* Ref: Doit contenir la référence courte du produit&lt;br /&gt;
* Nom: Doit contenir le libellé du produit&lt;br /&gt;
* Type: Doit contenir 0 pour un produit, 1 pour un service&lt;br /&gt;
&lt;br /&gt;
== Import des factures ==&lt;br /&gt;
A compléter&lt;br /&gt;
&lt;br /&gt;
== Mise en pratique ==&lt;br /&gt;
La page [[Développement de scripts]] vous explique comment créer votre propre script de traitement Dolibarr.&lt;br /&gt;
&lt;br /&gt;
== Quelques didacticiels/exemples soumis par la communauté ==&lt;br /&gt;
Des scripts exemples sont disponibles avec la distribution snapshot de Dolibarr dans le répertoire &#039;&#039;&#039;/dev/samples&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
D&#039;autres exemples sont soumis par des contributeurs:&lt;br /&gt;
* [[Importer des clients en automatique]]&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
=Sous-traiter à un Freelance=&lt;br /&gt;
Vous pouvez également faire appel à un expert qui choisira la meilleure méthode et réalisera les actions à votre place.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez vous appuyer par exemple sur un Partenaire Préféré Dolibarr https://partners.dolibarr.org&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Vidéos sur le sujet=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;youtube width=&amp;quot;200&amp;quot; height=&amp;quot;120&amp;quot;&amp;gt;WAv9wHIjy9c&amp;lt;/youtube&amp;gt;&lt;/div&gt;</summary>
		<author><name>Eldy</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Imports_de_masse_-_Migrer_mes_donn%C3%A9es_dans_Dolibarr&amp;diff=68393</id>
		<title>Imports de masse - Migrer mes données dans Dolibarr</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Imports_de_masse_-_Migrer_mes_donn%C3%A9es_dans_Dolibarr&amp;diff=68393"/>
		<updated>2026-10-21T15:43:16Z</updated>

		<summary type="html">&lt;p&gt;Eldy: /* File:OpenOffice.png Utiliser un ETL ou une passerelle outil Tiers */&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 : Mass_imports_-_Migrate_my_Data_To_Dolibarr --&amp;gt;&lt;br /&gt;
[[en:Mass_imports_-_Migrate_my_Data_To_Dolibarr]]&lt;br /&gt;
[[es:Importaciones]]&lt;br /&gt;
[[zh:批量导入]]&lt;br /&gt;
[[ja:一括インポート]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Admin fr]]&lt;br /&gt;
[[Category:Imports]]&lt;br /&gt;
{{TemplateDocDev}}&lt;br /&gt;
Suite à une installation neuve de Dolibarr, les bases sont vides. Parfois on désire démarrer avec des données importées d&#039;un autre système.&lt;br /&gt;
Il existe plusieurs méthodes possibles. Les chapitres suivante présentes quelques informations pour vous y aider.&lt;br /&gt;
&lt;br /&gt;
Il y a plusieurs méthodes d&#039;import de données. Les chapitres suivant fournissent des informations sur celle ci. Les informations pour exporter des données sont décrites sur la page [[Module Exports]].&lt;br /&gt;
&lt;br /&gt;
Attention, si l&#039;objectif est d&#039;importer depuis une autre base Dolibarr, ce n&#039;est pas l&#039;import/export de masse qu&#039;il faut utiliser (dédiés aux imports/exports avec d&#039;autres systèmes), mais la procédure décrite sur le page [[Dupliquer_une_instance_de_production_en_instance_de_test]] ou bien les procédures de [[Sauvegardes]] et [[Restaurations]].&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Utiliser le module Import de Dolibarr =&lt;br /&gt;
Pour importer des données disponibles en fichiers (Excel ou CSV), vous pouvez décider d&#039;utiliser l&#039;outil d&#039;import. &lt;br /&gt;
&lt;br /&gt;
Vous trouverez cet assistant qui vous guidera étape par étape dans l&#039;importation de vos données. Cet outil est disponible si les [[Module Imports FR|Module Imports]] ont été activés.&lt;br /&gt;
Vous pouvez l&#039;utiliser pour importer des fichiers plats (CSV ou Excel). Pour éviter des problèmes de performances ou de mémoire, nous vous recommandons d&#039;utiliser des fichiers plats CSV comme fichiers sources au lieu de fichiers Excel ; Cet outil vous permettra d&#039;importer des données (une table par table) à partir de fichiers plats.&lt;br /&gt;
Cette méthode est lente, limitée à l&#039;objet pour lequel un profil d&#039;import prédéfini est disponible. L&#039;avantage est que la seule connaissance dont vous avez besoin pour l&#039;utiliser est de savoir comment obtenir un fichier plat CSV à partir de votre système source.&lt;br /&gt;
Vous trouverez plus d&#039;informations sur la page [[Module Imports FR|Module Imports]].&lt;br /&gt;
&lt;br /&gt;
Pour les scénarios d&#039;importation non couverts par le module intégré, les alternatives suivantes sont également possibles...&lt;br /&gt;
&lt;br /&gt;
= [[File:OpenOffice.png]] Utiliser un ETL ou une passerelle outil Tiers =&lt;br /&gt;
&lt;br /&gt;
Vous pouvez migrer des données d&#039;un logiciel/système externe vers Dolibarr en utilisant des outils tiers, capables de vous connecter à la fois à votre ancien système et à votre installation Dolibarr. Il peut s&#039;agir d&#039;un outil local ou d&#039;un outil SaaS en ligne si vos systèmes sont accessibles par un outil SaaS. La documentation et le processus dépendront de l&#039;outil tiers.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Outils commerciaux spécialisés&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Avec &#039;&#039;&#039;CRM Bridge&#039;&#039;&#039;, vous basculer vos données d&#039;un logiciel vers un autre (comme Dolibarr)&lt;br /&gt;
&lt;br /&gt;
* Avec &#039;&#039;&#039;Airbyte&#039;&#039;&#039;, vous pouvez lire la page [[Integration of Dolibarr to the Airbyte data integration platform]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Logiciels indépendants&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Vous pouvez utiliser &#039;&#039;&#039;LibreOffice&#039;&#039;&#039; qui est capable d&#039;injecter le contenu d&#039;un tableau dans la base une base de donnée Mysql Dolibarr. Voici un tutorial sur cette méthode : [[Importer des données avec LibreOffice]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Logiciels d&#039;Automation&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Des outils d&#039;automatisation spécialisés dans la migration de donnée peuvent aussi faire le travail. Voir la page [[:Category:No_Code_Automation]]&lt;br /&gt;
&lt;br /&gt;
= [[File:Outils.png]] Développer son propre script d&#039;import =&lt;br /&gt;
&lt;br /&gt;
Vous pouvez décider de développer des scripts personnalisés pour charger des données dans la base de données Dolibarr.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez développer des scripts personnalisés pour lire vos informations source. En fonction de votre système source, vous pouvez effectuer :&lt;br /&gt;
&lt;br /&gt;
* Un accès direct à la base de données pour lire les données&lt;br /&gt;
* Utiliser l&#039;API de votre système source pour lire ses données. &lt;br /&gt;
* Si le système source est un autre Dolibarr, vous pouvez également utiliser les objets CRUD de Dolibarr (la Classe PHP pour manipuler les objets Data, vous pouvez donc appeler les méthodes fetch() et fetchAll() pour récupérer les données). Cela nécessite d&#039;avoir des connaissances en développement PHP.&lt;br /&gt;
&lt;br /&gt;
Ces scripts peuvent ensuite écrire les données lues dans votre Dolibarr cible en utilisant également les 3 méthodes:&lt;br /&gt;
&lt;br /&gt;
* L&#039;utilisation de l&#039;API est la méthode la plus sécurisée (la plupart des contrôles métier sont inclus).&lt;br /&gt;
* Utiliser les objets de la classe CRUD pour appeler la méthode (vous pouvez donc appeler la méthode fetch() pour vérifier si l&#039;objet existe déjà dans la cible, appeler la méthode create() ou update() pour insérer ou mettre à jour l&#039;enregistrement). Cela nécessite d&#039;avoir des connaissances en développement PHP. Vous pouvez trouver des exemples de script pour charger des données de fichiers CSV dans la base de données en utilisant la deuxième méthode (objets Dolibarr CRUD) dans ce répertoire : https://github.com/Dolibarr/dolibarr/tree/develop/dev/initdata&lt;br /&gt;
* Vous pouvez également effectuer une écriture directe dans la base de données par un accès direct à la base de données (cette méthode n&#039;est pas recommandée car elle contourne toutes les règles métier implémentées dans la classe CRUD ou dans les API, cependant, elle est la plus performante). Cela nécessite de comprendre la structure de la base de données. Ce n&#039;est pas si difficile car chaque donnée est enregistrée une et une seule fois dans la structure de la base de données Dolibarr.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici des exemples de quelques cas d&#039;utilisation :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Import des tiers et contacts ==&lt;br /&gt;
Il faut distinguer les tiers des contacts physiques.&lt;br /&gt;
Dans les tiers on aura toutes les entités sujettes à facturation (aussi bien entreprises, association que particuliers). Les tiers sont obligatoires.&lt;br /&gt;
Les contacts physiques sont optionnels. Il s&#039;agit juste d&#039;un annuaire de personnes (avec téléphone et fonction) liées à un tiers. Dans le cas d&#039;un tiers entreprise, il pourra y avoir plusieurs contacts physiques. Dans le cas d&#039;un particulier, le contact physique sera unique et identique au tiers (voire le contact physique ne sera pas renseigné).&lt;br /&gt;
&lt;br /&gt;
L&#039;import des tiers consiste à insérer des lignes dans la table [[Table llx_societe]].&lt;br /&gt;
S&#039;assurer que les champs importants sont bien renseignés:&lt;br /&gt;
* Nom: Doit contenir le nom de la société&lt;br /&gt;
* Client: Doit contenir 1 si client, 2 si prospect, 3 si prospect+client, 0 sinon&lt;br /&gt;
* Fournisseur: Doit contenir 1 si fournisseur, 0 sinon&lt;br /&gt;
&lt;br /&gt;
L&#039;import des contacts physiques consiste à insérer des lignes dans la table [[Table llx_socpeople]].&lt;br /&gt;
S&#039;assurer que les champs importants sont bien renseignés:&lt;br /&gt;
* Name: Doit contenir le nom de la personne&lt;br /&gt;
* Firstname: Doit contenir le prénom de la société&lt;br /&gt;
* fk_soc: Doit contenir l&#039;id de la ligne Tiers dans la [[Table llx_societe]].&lt;br /&gt;
&lt;br /&gt;
== Import des produits ou services ==&lt;br /&gt;
L&#039;import des tiers consiste à insérer des lignes dans la table [[Table llx_product]].&lt;br /&gt;
S&#039;assurer que les champs importants sont bien renseignés:&lt;br /&gt;
* Ref: Doit contenir la référence courte du produit&lt;br /&gt;
* Nom: Doit contenir le libellé du produit&lt;br /&gt;
* Type: Doit contenir 0 pour un produit, 1 pour un service&lt;br /&gt;
&lt;br /&gt;
== Import des factures ==&lt;br /&gt;
A compléter&lt;br /&gt;
&lt;br /&gt;
== Mise en pratique ==&lt;br /&gt;
La page [[Développement de scripts]] vous explique comment créer votre propre script de traitement Dolibarr.&lt;br /&gt;
&lt;br /&gt;
== Quelques didacticiels/exemples soumis par la communauté ==&lt;br /&gt;
Des scripts exemples sont disponibles avec la distribution snapshot de Dolibarr dans le répertoire &#039;&#039;&#039;/dev/samples&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
D&#039;autres exemples sont soumis par des contributeurs:&lt;br /&gt;
* [[Importer des clients en automatique]]&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
=Sous-traiter à un Freelance=&lt;br /&gt;
Vous pouvez également faire appel à un expert qui choisira la meilleure méthode et réalisera les actions à votre place.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez vous appuyer par exemple sur un Partenaire Préféré Dolibarr https://partners.dolibarr.org&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Vidéos sur le sujet=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;youtube width=&amp;quot;200&amp;quot; height=&amp;quot;120&amp;quot;&amp;gt;WAv9wHIjy9c&amp;lt;/youtube&amp;gt;&lt;/div&gt;</summary>
		<author><name>Eldy</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Imports_de_masse_-_Migrer_mes_donn%C3%A9es_dans_Dolibarr&amp;diff=68392</id>
		<title>Imports de masse - Migrer mes données dans Dolibarr</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Imports_de_masse_-_Migrer_mes_donn%C3%A9es_dans_Dolibarr&amp;diff=68392"/>
		<updated>2026-10-21T15:41:00Z</updated>

		<summary type="html">&lt;p&gt;Eldy: /* File:OpenOffice.png Utilise un ETL ou une passerelle outil Tiers */&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 : Mass_imports_-_Migrate_my_Data_To_Dolibarr --&amp;gt;&lt;br /&gt;
[[en:Mass_imports_-_Migrate_my_Data_To_Dolibarr]]&lt;br /&gt;
[[es:Importaciones]]&lt;br /&gt;
[[zh:批量导入]]&lt;br /&gt;
[[ja:一括インポート]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Admin fr]]&lt;br /&gt;
[[Category:Imports]]&lt;br /&gt;
{{TemplateDocDev}}&lt;br /&gt;
Suite à une installation neuve de Dolibarr, les bases sont vides. Parfois on désire démarrer avec des données importées d&#039;un autre système.&lt;br /&gt;
Il existe plusieurs méthodes possibles. Les chapitres suivante présentes quelques informations pour vous y aider.&lt;br /&gt;
&lt;br /&gt;
Il y a plusieurs méthodes d&#039;import de données. Les chapitres suivant fournissent des informations sur celle ci. Les informations pour exporter des données sont décrites sur la page [[Module Exports]].&lt;br /&gt;
&lt;br /&gt;
Attention, si l&#039;objectif est d&#039;importer depuis une autre base Dolibarr, ce n&#039;est pas l&#039;import/export de masse qu&#039;il faut utiliser (dédiés aux imports/exports avec d&#039;autres systèmes), mais la procédure décrite sur le page [[Dupliquer_une_instance_de_production_en_instance_de_test]] ou bien les procédures de [[Sauvegardes]] et [[Restaurations]].&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Utiliser le module Import de Dolibarr =&lt;br /&gt;
Pour importer des données disponibles en fichiers (Excel ou CSV), vous pouvez décider d&#039;utiliser l&#039;outil d&#039;import. &lt;br /&gt;
&lt;br /&gt;
Vous trouverez cet assistant qui vous guidera étape par étape dans l&#039;importation de vos données. Cet outil est disponible si les [[Module Imports FR|Module Imports]] ont été activés.&lt;br /&gt;
Vous pouvez l&#039;utiliser pour importer des fichiers plats (CSV ou Excel). Pour éviter des problèmes de performances ou de mémoire, nous vous recommandons d&#039;utiliser des fichiers plats CSV comme fichiers sources au lieu de fichiers Excel ; Cet outil vous permettra d&#039;importer des données (une table par table) à partir de fichiers plats.&lt;br /&gt;
Cette méthode est lente, limitée à l&#039;objet pour lequel un profil d&#039;import prédéfini est disponible. L&#039;avantage est que la seule connaissance dont vous avez besoin pour l&#039;utiliser est de savoir comment obtenir un fichier plat CSV à partir de votre système source.&lt;br /&gt;
Vous trouverez plus d&#039;informations sur la page [[Module Imports FR|Module Imports]].&lt;br /&gt;
&lt;br /&gt;
Pour les scénarios d&#039;importation non couverts par le module intégré, les alternatives suivantes sont également possibles...&lt;br /&gt;
&lt;br /&gt;
= [[File:OpenOffice.png]] Utiliser un ETL ou une passerelle outil Tiers =&lt;br /&gt;
&lt;br /&gt;
Vous pouvez migrer des données d&#039;un logiciel/système externe vers Dolibarr en utilisant des outils tiers, capables de vous connecter à la fois à votre ancien système et à votre installation Dolibarr. Il peut s&#039;agir d&#039;un outil local ou d&#039;un outil SaaS en ligne si vos systèmes sont accessibles par un outil SaaS. La documentation et le processus dépendront de l&#039;outil tiers.&lt;br /&gt;
&lt;br /&gt;
* Par exemple, vous pouvez utiliser &#039;&#039;&#039;LibreOffice&#039;&#039;&#039; qui est capable d&#039;injecter le contenu d&#039;un tableau dans la base une base de donnée Mysql Dolibarr. Voici un tutorial sur cette méthode : [[Importer des données avec LibreOffice]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Outils spécialisés&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Avec &#039;&#039;&#039;CRM Bridge&#039;&#039;&#039;, vous basculer vos données d&#039;un logiciel vers un autre (comme Dolibarr)&lt;br /&gt;
&lt;br /&gt;
* Avec &#039;&#039;&#039;Airbyte&#039;&#039;&#039;, vous pouvez lire la page [[Integration of Dolibarr to the Airbyte data integration platform]].&lt;br /&gt;
&lt;br /&gt;
Des outils d&#039;automatisation spécialisés dans la migration de donnée peuvent aussi faire le travail. Voir la page [[:Category:No_Code_Automation]]&lt;br /&gt;
&lt;br /&gt;
= [[File:Outils.png]] Développer son propre script d&#039;import =&lt;br /&gt;
&lt;br /&gt;
Vous pouvez décider de développer des scripts personnalisés pour charger des données dans la base de données Dolibarr.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez développer des scripts personnalisés pour lire vos informations source. En fonction de votre système source, vous pouvez effectuer :&lt;br /&gt;
&lt;br /&gt;
* Un accès direct à la base de données pour lire les données&lt;br /&gt;
* Utiliser l&#039;API de votre système source pour lire ses données. &lt;br /&gt;
* Si le système source est un autre Dolibarr, vous pouvez également utiliser les objets CRUD de Dolibarr (la Classe PHP pour manipuler les objets Data, vous pouvez donc appeler les méthodes fetch() et fetchAll() pour récupérer les données). Cela nécessite d&#039;avoir des connaissances en développement PHP.&lt;br /&gt;
&lt;br /&gt;
Ces scripts peuvent ensuite écrire les données lues dans votre Dolibarr cible en utilisant également les 3 méthodes:&lt;br /&gt;
&lt;br /&gt;
* L&#039;utilisation de l&#039;API est la méthode la plus sécurisée (la plupart des contrôles métier sont inclus).&lt;br /&gt;
* Utiliser les objets de la classe CRUD pour appeler la méthode (vous pouvez donc appeler la méthode fetch() pour vérifier si l&#039;objet existe déjà dans la cible, appeler la méthode create() ou update() pour insérer ou mettre à jour l&#039;enregistrement). Cela nécessite d&#039;avoir des connaissances en développement PHP. Vous pouvez trouver des exemples de script pour charger des données de fichiers CSV dans la base de données en utilisant la deuxième méthode (objets Dolibarr CRUD) dans ce répertoire : https://github.com/Dolibarr/dolibarr/tree/develop/dev/initdata&lt;br /&gt;
* Vous pouvez également effectuer une écriture directe dans la base de données par un accès direct à la base de données (cette méthode n&#039;est pas recommandée car elle contourne toutes les règles métier implémentées dans la classe CRUD ou dans les API, cependant, elle est la plus performante). Cela nécessite de comprendre la structure de la base de données. Ce n&#039;est pas si difficile car chaque donnée est enregistrée une et une seule fois dans la structure de la base de données Dolibarr.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici des exemples de quelques cas d&#039;utilisation :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Import des tiers et contacts ==&lt;br /&gt;
Il faut distinguer les tiers des contacts physiques.&lt;br /&gt;
Dans les tiers on aura toutes les entités sujettes à facturation (aussi bien entreprises, association que particuliers). Les tiers sont obligatoires.&lt;br /&gt;
Les contacts physiques sont optionnels. Il s&#039;agit juste d&#039;un annuaire de personnes (avec téléphone et fonction) liées à un tiers. Dans le cas d&#039;un tiers entreprise, il pourra y avoir plusieurs contacts physiques. Dans le cas d&#039;un particulier, le contact physique sera unique et identique au tiers (voire le contact physique ne sera pas renseigné).&lt;br /&gt;
&lt;br /&gt;
L&#039;import des tiers consiste à insérer des lignes dans la table [[Table llx_societe]].&lt;br /&gt;
S&#039;assurer que les champs importants sont bien renseignés:&lt;br /&gt;
* Nom: Doit contenir le nom de la société&lt;br /&gt;
* Client: Doit contenir 1 si client, 2 si prospect, 3 si prospect+client, 0 sinon&lt;br /&gt;
* Fournisseur: Doit contenir 1 si fournisseur, 0 sinon&lt;br /&gt;
&lt;br /&gt;
L&#039;import des contacts physiques consiste à insérer des lignes dans la table [[Table llx_socpeople]].&lt;br /&gt;
S&#039;assurer que les champs importants sont bien renseignés:&lt;br /&gt;
* Name: Doit contenir le nom de la personne&lt;br /&gt;
* Firstname: Doit contenir le prénom de la société&lt;br /&gt;
* fk_soc: Doit contenir l&#039;id de la ligne Tiers dans la [[Table llx_societe]].&lt;br /&gt;
&lt;br /&gt;
== Import des produits ou services ==&lt;br /&gt;
L&#039;import des tiers consiste à insérer des lignes dans la table [[Table llx_product]].&lt;br /&gt;
S&#039;assurer que les champs importants sont bien renseignés:&lt;br /&gt;
* Ref: Doit contenir la référence courte du produit&lt;br /&gt;
* Nom: Doit contenir le libellé du produit&lt;br /&gt;
* Type: Doit contenir 0 pour un produit, 1 pour un service&lt;br /&gt;
&lt;br /&gt;
== Import des factures ==&lt;br /&gt;
A compléter&lt;br /&gt;
&lt;br /&gt;
== Mise en pratique ==&lt;br /&gt;
La page [[Développement de scripts]] vous explique comment créer votre propre script de traitement Dolibarr.&lt;br /&gt;
&lt;br /&gt;
== Quelques didacticiels/exemples soumis par la communauté ==&lt;br /&gt;
Des scripts exemples sont disponibles avec la distribution snapshot de Dolibarr dans le répertoire &#039;&#039;&#039;/dev/samples&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
D&#039;autres exemples sont soumis par des contributeurs:&lt;br /&gt;
* [[Importer des clients en automatique]]&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
=Sous-traiter à un Freelance=&lt;br /&gt;
Vous pouvez également faire appel à un expert qui choisira la meilleure méthode et réalisera les actions à votre place.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez vous appuyer par exemple sur un Partenaire Préféré Dolibarr https://partners.dolibarr.org&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Vidéos sur le sujet=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;youtube width=&amp;quot;200&amp;quot; height=&amp;quot;120&amp;quot;&amp;gt;WAv9wHIjy9c&amp;lt;/youtube&amp;gt;&lt;/div&gt;</summary>
		<author><name>Eldy</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Imports_de_masse_-_Migrer_mes_donn%C3%A9es_dans_Dolibarr&amp;diff=68391</id>
		<title>Imports de masse - Migrer mes données dans Dolibarr</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Imports_de_masse_-_Migrer_mes_donn%C3%A9es_dans_Dolibarr&amp;diff=68391"/>
		<updated>2026-10-21T15:36:21Z</updated>

		<summary type="html">&lt;p&gt;Eldy: /* File:Art.png Utiliser le module Import de 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 : Mass_imports_-_Migrate_my_Data_To_Dolibarr --&amp;gt;&lt;br /&gt;
[[en:Mass_imports_-_Migrate_my_Data_To_Dolibarr]]&lt;br /&gt;
[[es:Importaciones]]&lt;br /&gt;
[[zh:批量导入]]&lt;br /&gt;
[[ja:一括インポート]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Admin fr]]&lt;br /&gt;
[[Category:Imports]]&lt;br /&gt;
{{TemplateDocDev}}&lt;br /&gt;
Suite à une installation neuve de Dolibarr, les bases sont vides. Parfois on désire démarrer avec des données importées d&#039;un autre système.&lt;br /&gt;
Il existe plusieurs méthodes possibles. Les chapitres suivante présentes quelques informations pour vous y aider.&lt;br /&gt;
&lt;br /&gt;
Il y a plusieurs méthodes d&#039;import de données. Les chapitres suivant fournissent des informations sur celle ci. Les informations pour exporter des données sont décrites sur la page [[Module Exports]].&lt;br /&gt;
&lt;br /&gt;
Attention, si l&#039;objectif est d&#039;importer depuis une autre base Dolibarr, ce n&#039;est pas l&#039;import/export de masse qu&#039;il faut utiliser (dédiés aux imports/exports avec d&#039;autres systèmes), mais la procédure décrite sur le page [[Dupliquer_une_instance_de_production_en_instance_de_test]] ou bien les procédures de [[Sauvegardes]] et [[Restaurations]].&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Utiliser le module Import de Dolibarr =&lt;br /&gt;
Pour importer des données disponibles en fichiers (Excel ou CSV), vous pouvez décider d&#039;utiliser l&#039;outil d&#039;import. &lt;br /&gt;
&lt;br /&gt;
Vous trouverez cet assistant qui vous guidera étape par étape dans l&#039;importation de vos données. Cet outil est disponible si les [[Module Imports FR|Module Imports]] ont été activés.&lt;br /&gt;
Vous pouvez l&#039;utiliser pour importer des fichiers plats (CSV ou Excel). Pour éviter des problèmes de performances ou de mémoire, nous vous recommandons d&#039;utiliser des fichiers plats CSV comme fichiers sources au lieu de fichiers Excel ; Cet outil vous permettra d&#039;importer des données (une table par table) à partir de fichiers plats.&lt;br /&gt;
Cette méthode est lente, limitée à l&#039;objet pour lequel un profil d&#039;import prédéfini est disponible. L&#039;avantage est que la seule connaissance dont vous avez besoin pour l&#039;utiliser est de savoir comment obtenir un fichier plat CSV à partir de votre système source.&lt;br /&gt;
Vous trouverez plus d&#039;informations sur la page [[Module Imports FR|Module Imports]].&lt;br /&gt;
&lt;br /&gt;
Pour les scénarios d&#039;importation non couverts par le module intégré, les alternatives suivantes sont également possibles...&lt;br /&gt;
&lt;br /&gt;
= [[File:OpenOffice.png]] Utilise un ETL ou une passerelle outil Tiers =&lt;br /&gt;
&lt;br /&gt;
Vous pouvez utiliser des outils tiers, capables de vous connecter à la fois à votre ancien système et à votre installation Dolibarr. Il peut s&#039;agir d&#039;un outil local ou d&#039;un outil SaaS en ligne si vos systèmes sont accessibles par un outil SaaS. La documentation et le processus dépendront de l&#039;outil tiers.&lt;br /&gt;
&lt;br /&gt;
* Par exemple, vous pouvez utiliser &#039;&#039;&#039;LibreOffice&#039;&#039;&#039; qui est capable d&#039;injecter le contenu d&#039;un tableau dans la base une base de donnée Mysql Dolibarr. Voici un tutorial sur cette méthode : [[Importer des données avec LibreOffice]]&lt;br /&gt;
&lt;br /&gt;
* Autre exemple avec &#039;&#039;&#039;Airbyte&#039;&#039;&#039;, vous pouvez lire la page [[Integration of Dolibarr to the Airbyte data integration platform]].&lt;br /&gt;
&lt;br /&gt;
Des outils d&#039;automatisation spécialisés dans la migration de donnée peuvent aussi faire le travail. Voir la page [[:Category:No_Code_Automation]]&lt;br /&gt;
&lt;br /&gt;
= [[File:Outils.png]] Développer son propre script d&#039;import =&lt;br /&gt;
&lt;br /&gt;
Vous pouvez décider de développer des scripts personnalisés pour charger des données dans la base de données Dolibarr.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez développer des scripts personnalisés pour lire vos informations source. En fonction de votre système source, vous pouvez effectuer :&lt;br /&gt;
&lt;br /&gt;
* Un accès direct à la base de données pour lire les données&lt;br /&gt;
* Utiliser l&#039;API de votre système source pour lire ses données. &lt;br /&gt;
* Si le système source est un autre Dolibarr, vous pouvez également utiliser les objets CRUD de Dolibarr (la Classe PHP pour manipuler les objets Data, vous pouvez donc appeler les méthodes fetch() et fetchAll() pour récupérer les données). Cela nécessite d&#039;avoir des connaissances en développement PHP.&lt;br /&gt;
&lt;br /&gt;
Ces scripts peuvent ensuite écrire les données lues dans votre Dolibarr cible en utilisant également les 3 méthodes:&lt;br /&gt;
&lt;br /&gt;
* L&#039;utilisation de l&#039;API est la méthode la plus sécurisée (la plupart des contrôles métier sont inclus).&lt;br /&gt;
* Utiliser les objets de la classe CRUD pour appeler la méthode (vous pouvez donc appeler la méthode fetch() pour vérifier si l&#039;objet existe déjà dans la cible, appeler la méthode create() ou update() pour insérer ou mettre à jour l&#039;enregistrement). Cela nécessite d&#039;avoir des connaissances en développement PHP. Vous pouvez trouver des exemples de script pour charger des données de fichiers CSV dans la base de données en utilisant la deuxième méthode (objets Dolibarr CRUD) dans ce répertoire : https://github.com/Dolibarr/dolibarr/tree/develop/dev/initdata&lt;br /&gt;
* Vous pouvez également effectuer une écriture directe dans la base de données par un accès direct à la base de données (cette méthode n&#039;est pas recommandée car elle contourne toutes les règles métier implémentées dans la classe CRUD ou dans les API, cependant, elle est la plus performante). Cela nécessite de comprendre la structure de la base de données. Ce n&#039;est pas si difficile car chaque donnée est enregistrée une et une seule fois dans la structure de la base de données Dolibarr.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici des exemples de quelques cas d&#039;utilisation :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Import des tiers et contacts ==&lt;br /&gt;
Il faut distinguer les tiers des contacts physiques.&lt;br /&gt;
Dans les tiers on aura toutes les entités sujettes à facturation (aussi bien entreprises, association que particuliers). Les tiers sont obligatoires.&lt;br /&gt;
Les contacts physiques sont optionnels. Il s&#039;agit juste d&#039;un annuaire de personnes (avec téléphone et fonction) liées à un tiers. Dans le cas d&#039;un tiers entreprise, il pourra y avoir plusieurs contacts physiques. Dans le cas d&#039;un particulier, le contact physique sera unique et identique au tiers (voire le contact physique ne sera pas renseigné).&lt;br /&gt;
&lt;br /&gt;
L&#039;import des tiers consiste à insérer des lignes dans la table [[Table llx_societe]].&lt;br /&gt;
S&#039;assurer que les champs importants sont bien renseignés:&lt;br /&gt;
* Nom: Doit contenir le nom de la société&lt;br /&gt;
* Client: Doit contenir 1 si client, 2 si prospect, 3 si prospect+client, 0 sinon&lt;br /&gt;
* Fournisseur: Doit contenir 1 si fournisseur, 0 sinon&lt;br /&gt;
&lt;br /&gt;
L&#039;import des contacts physiques consiste à insérer des lignes dans la table [[Table llx_socpeople]].&lt;br /&gt;
S&#039;assurer que les champs importants sont bien renseignés:&lt;br /&gt;
* Name: Doit contenir le nom de la personne&lt;br /&gt;
* Firstname: Doit contenir le prénom de la société&lt;br /&gt;
* fk_soc: Doit contenir l&#039;id de la ligne Tiers dans la [[Table llx_societe]].&lt;br /&gt;
&lt;br /&gt;
== Import des produits ou services ==&lt;br /&gt;
L&#039;import des tiers consiste à insérer des lignes dans la table [[Table llx_product]].&lt;br /&gt;
S&#039;assurer que les champs importants sont bien renseignés:&lt;br /&gt;
* Ref: Doit contenir la référence courte du produit&lt;br /&gt;
* Nom: Doit contenir le libellé du produit&lt;br /&gt;
* Type: Doit contenir 0 pour un produit, 1 pour un service&lt;br /&gt;
&lt;br /&gt;
== Import des factures ==&lt;br /&gt;
A compléter&lt;br /&gt;
&lt;br /&gt;
== Mise en pratique ==&lt;br /&gt;
La page [[Développement de scripts]] vous explique comment créer votre propre script de traitement Dolibarr.&lt;br /&gt;
&lt;br /&gt;
== Quelques didacticiels/exemples soumis par la communauté ==&lt;br /&gt;
Des scripts exemples sont disponibles avec la distribution snapshot de Dolibarr dans le répertoire &#039;&#039;&#039;/dev/samples&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
D&#039;autres exemples sont soumis par des contributeurs:&lt;br /&gt;
* [[Importer des clients en automatique]]&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
=Sous-traiter à un Freelance=&lt;br /&gt;
Vous pouvez également faire appel à un expert qui choisira la meilleure méthode et réalisera les actions à votre place.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez vous appuyer par exemple sur un Partenaire Préféré Dolibarr https://partners.dolibarr.org&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Vidéos sur le sujet=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;youtube width=&amp;quot;200&amp;quot; height=&amp;quot;120&amp;quot;&amp;gt;WAv9wHIjy9c&amp;lt;/youtube&amp;gt;&lt;/div&gt;</summary>
		<author><name>Eldy</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Module_TdhpMizan&amp;diff=68128</id>
		<title>Module TdhpMizan</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Module_TdhpMizan&amp;diff=68128"/>
		<updated>2026-10-18T15:54:44Z</updated>

		<summary type="html">&lt;p&gt;Eldy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Complementary modules]]&lt;br /&gt;
[[Category:Financial]]&lt;br /&gt;
[[Category:Accountancy]]&lt;br /&gt;
&lt;br /&gt;
{{TemplateDocDev}}&lt;br /&gt;
{{TemplateDocUtil}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border:1px solid #d7e3f4; border-radius:14px; padding:22px; margin:12px 0 22px 0; background:linear-gradient(135deg,#f6faff,#ffffff); box-shadow:0 2px 10px rgba(20,60,110,0.08);&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;font-size:28px; font-weight:700; color:#17365d; margin-bottom:8px;&amp;quot;&amp;gt;TDHP Mizan for Dolibarr&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;font-size:18px; color:#345; margin-bottom:14px;&amp;quot;&amp;gt;Hierarchical trial balance (mizan) for the Turkish uniform chart of accounts&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display:flex; flex-wrap:wrap; gap:8px; margin-top:10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;background:#e8f1ff; color:#17365d; padding:6px 10px; border-radius:999px; font-weight:600;&amp;quot;&amp;gt;Main / sub-account roll-up&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;background:#e8f1ff; color:#17365d; padding:6px 10px; border-radius:999px; font-weight:600;&amp;quot;&amp;gt;Debit · Credit balances&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background:#e8f1ff; color:#17365d; padding:6px 10px; border-radius:999px; font-weight:600;&amp;quot;&amp;gt;Period types&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background:#e8f1ff; color:#17365d; padding:6px 10px; border-radius:999px; font-weight:600;&amp;quot;&amp;gt;PDF printing&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background:#e8f1ff; color:#17365d; padding:6px 10px; border-radius:999px; font-weight:600;&amp;quot;&amp;gt;Sayıştay CSV&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background:#e8f1ff; color:#17365d; padding:6px 10px; border-radius:999px; font-weight:600;&amp;quot;&amp;gt;Free · GPLv3&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Overview==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TDHP Mizan&#039;&#039;&#039; is a free external module for &#039;&#039;&#039;Dolibarr ERP/CRM&#039;&#039;&#039; that builds a hierarchical trial balance (&#039;&#039;mizan&#039;&#039;) for the &#039;&#039;&#039;Turkish uniform chart of accounts&#039;&#039;&#039; (Tekdüzen Hesap Planı, TDHP) from the Dolibarr general ledger.&lt;br /&gt;
&lt;br /&gt;
It only reads the ledger and the chart of accounts, has no tables of its own and does not modify any core file.&lt;br /&gt;
&lt;br /&gt;
==Publisher and support==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%; border-collapse:collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;width:24%; background:#f0f6ff;&amp;quot; |Item&lt;br /&gt;
! style=&amp;quot;background:#f0f6ff;&amp;quot; |Information&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Publisher&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;M. Burak Şentürk&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Website&#039;&#039;&#039;&lt;br /&gt;
|https://buraksenturk.net&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Support&#039;&#039;&#039;&lt;br /&gt;
|https://github.com/mbrksntrk/dolibarr-tdhp-mizan/issues&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Source code&#039;&#039;&#039;&lt;br /&gt;
|https://github.com/mbrksntrk/dolibarr-tdhp-mizan&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Module information==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
! style=&amp;quot;width:24%; background:#f7f7f7;&amp;quot; |Information&lt;br /&gt;
! style=&amp;quot;background:#f7f7f7;&amp;quot; |Detail&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Module name&#039;&#039;&#039;&lt;br /&gt;
|TDHP Mizan (&amp;lt;code&amp;gt;tdhpmizan&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Module number&#039;&#039;&#039;&lt;br /&gt;
|194096&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Main use&#039;&#039;&#039;&lt;br /&gt;
|Trial balance report for the Turkish uniform chart of accounts&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Type&#039;&#039;&#039;&lt;br /&gt;
|External Dolibarr module&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Family&#039;&#039;&#039;&lt;br /&gt;
|Financial&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Documented version&#039;&#039;&#039;&lt;br /&gt;
|1.1.0&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Dolibarr compatibility&#039;&#039;&#039;&lt;br /&gt;
|Dolibarr 20.0 or higher (developed and tested on 24.0)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PHP compatibility&#039;&#039;&#039;&lt;br /&gt;
|PHP 7.4 or higher&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Required modules&#039;&#039;&#039;&lt;br /&gt;
|Accounting (double entry)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Dolibarr core modification&#039;&#039;&#039;&lt;br /&gt;
|No&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;License&#039;&#039;&#039;&lt;br /&gt;
|GNU GPL v3 or later (with an author attribution term)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Price&#039;&#039;&#039;&lt;br /&gt;
|Free&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Available languages&#039;&#039;&#039;&lt;br /&gt;
|Turkish, English&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Official links==&lt;br /&gt;
&lt;br /&gt;
*Source code and releases: [https://github.com/mbrksntrk/dolibarr-tdhp-mizan GitHub]&lt;br /&gt;
*Detailed documentation (Turkish): [https://github.com/mbrksntrk/dolibarr-tdhp-mizan/wiki GitHub wiki]&lt;br /&gt;
&lt;br /&gt;
==Main features==&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Hierarchical roll-up&#039;&#039;&#039;: movements of every sub-account are summed up the chart&#039;s parent tree to the 3-digit main accounts (100, 102, 120…).&lt;br /&gt;
*Debit and credit totals and &#039;&#039;&#039;debit / credit balances&#039;&#039;&#039; on every level, with a grand total.&lt;br /&gt;
*&#039;&#039;&#039;Period types&#039;&#039;&#039;: monthly, date range including or excluding closing entries, monthly main accounts, opening, closing, opening excluded, opening and closing excluded.&lt;br /&gt;
*&#039;&#039;&#039;Filters&#039;&#039;&#039;: account range, code prefix, account group (PCG), currency, balance direction, amount condition, search by code or name, show/hide main and sub accounts.&lt;br /&gt;
*&#039;&#039;&#039;PDF printing&#039;&#039;&#039; in the classic Turkish layout: A4, framed title box with period, company name and page &amp;quot;x / y&amp;quot; on every page, repeated column headers, level-based row style, zero amounts blank.&lt;br /&gt;
*&#039;&#039;&#039;Sayıştay-style CSV&#039;&#039;&#039; export (UTF-8 BOM, semicolon separated).&lt;br /&gt;
*Configurable debit/credit balance colours on screen.&lt;br /&gt;
&lt;br /&gt;
==Configuration==&lt;br /&gt;
&lt;br /&gt;
From Home → Setup → Modules → TDHP Mizan: debit and credit balance colours. In the chart of accounts, each sub-account must have its parent account set (e.g. 102.10.001 → 102.10 → 102).&lt;br /&gt;
&lt;br /&gt;
==User permissions==&lt;br /&gt;
&lt;br /&gt;
The report is available to administrators and to users with the core permission to read accounting movements.&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
&lt;br /&gt;
#Download &amp;lt;code&amp;gt;module_tdhpmizan-x.y.z.zip&amp;lt;/code&amp;gt; from GitHub Releases.&lt;br /&gt;
#Home → Setup → Modules → &#039;&#039;&#039;Deploy/install external app/module&#039;&#039;&#039;, or unzip into &amp;lt;code&amp;gt;htdocs/custom/&amp;lt;/code&amp;gt;.&lt;br /&gt;
#Enable the &#039;&#039;&#039;Accounting&#039;&#039;&#039; module, then &#039;&#039;&#039;TDHP Mizan&#039;&#039;&#039;.&lt;br /&gt;
#Open Accounting → &#039;&#039;&#039;TDHP Mizan&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==Summary==&lt;br /&gt;
&lt;br /&gt;
TDHP Mizan gives Dolibarr users in Türkiye the familiar hierarchical trial balance — on screen, as a printable PDF and as a Sayıştay-style CSV — using only the standard Dolibarr ledger.&lt;/div&gt;</summary>
		<author><name>Eldy</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Module_TdhpMizan&amp;diff=68127</id>
		<title>Module TdhpMizan</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Module_TdhpMizan&amp;diff=68127"/>
		<updated>2026-10-18T15:54:36Z</updated>

		<summary type="html">&lt;p&gt;Eldy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Complementary modules]]&lt;br /&gt;
[[Category:Financial]]&lt;br /&gt;
[[Category:Accountancy]]&lt;br /&gt;
&lt;br /&gt;
{{TemplateDocDev}}&lt;br /&gt;
{{TemplateDocUtil}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border:1px solid #d7e3f4; border-radius:14px; padding:22px; margin:12px 0 22px 0; background:linear-gradient(135deg,#f6faff,#ffffff); box-shadow:0 2px 10px rgba(20,60,110,0.08);&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;font-size:28px; font-weight:700; color:#17365d; margin-bottom:8px;&amp;quot;&amp;gt;TDHP Mizan for Dolibarr&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;font-size:18px; color:#345; margin-bottom:14px;&amp;quot;&amp;gt;Hierarchical trial balance (mizan) for the Turkish uniform chart of accounts&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display:flex; flex-wrap:wrap; gap:8px; margin-top:10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;background:#e8f1ff; color:#17365d; padding:6px 10px; border-radius:999px; font-weight:600;&amp;quot;&amp;gt;Main / sub-account roll-up&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;background:#e8f1ff; color:#17365d; padding:6px 10px; border-radius:999px; font-weight:600;&amp;quot;&amp;gt;Debit · Credit balances&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background:#e8f1ff; color:#17365d; padding:6px 10px; border-radius:999px; font-weight:600;&amp;quot;&amp;gt;Period types&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background:#e8f1ff; color:#17365d; padding:6px 10px; border-radius:999px; font-weight:600;&amp;quot;&amp;gt;PDF printing&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background:#e8f1ff; color:#17365d; padding:6px 10px; border-radius:999px; font-weight:600;&amp;quot;&amp;gt;Sayıştay CSV&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background:#e8f1ff; color:#17365d; padding:6px 10px; border-radius:999px; font-weight:600;&amp;quot;&amp;gt;Free · GPLv3&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Overview==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TDHP Mizan&#039;&#039;&#039; is a free external module for &#039;&#039;&#039;Dolibarr ERP/CRM&#039;&#039;&#039; that builds a hierarchical trial balance (&#039;&#039;mizan&#039;&#039;) for the &#039;&#039;&#039;Turkish uniform chart of accounts&#039;&#039;&#039; (Tekdüzen Hesap Planı, TDHP) from the Dolibarr general ledger.&lt;br /&gt;
&lt;br /&gt;
It only reads the ledger and the chart of accounts, has no tables of its own and does not modify any core file.&lt;br /&gt;
&lt;br /&gt;
==Publisher and support==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%; border-collapse:collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;width:24%; background:#f0f6ff;&amp;quot; |Item&lt;br /&gt;
! style=&amp;quot;background:#f0f6ff;&amp;quot; |Information&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Publisher&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;M. Burak Şentürk&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Website&#039;&#039;&#039;&lt;br /&gt;
|https://buraksenturk.net&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Support&#039;&#039;&#039;&lt;br /&gt;
|https://github.com/mbrksntrk/dolibarr-tdhp-mizan/issues&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Source code&#039;&#039;&#039;&lt;br /&gt;
|https://github.com/mbrksntrk/dolibarr-tdhp-mizan&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Module information==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
! style=&amp;quot;width:24%; background:#f7f7f7;&amp;quot; |Information&lt;br /&gt;
! style=&amp;quot;background:#f7f7f7;&amp;quot; |Detail&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Module name&#039;&#039;&#039;&lt;br /&gt;
|TDHP Mizan (&amp;lt;code&amp;gt;tdhpmizan&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Module number&#039;&#039;&#039;&lt;br /&gt;
|194096&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Main use&#039;&#039;&#039;&lt;br /&gt;
|Trial balance report for the Turkish uniform chart of accounts&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Type&#039;&#039;&#039;&lt;br /&gt;
|External Dolibarr module&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Family&#039;&#039;&#039;&lt;br /&gt;
|Financial&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Documented version&#039;&#039;&#039;&lt;br /&gt;
|1.1.0&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Dolibarr compatibility&#039;&#039;&#039;&lt;br /&gt;
|Dolibarr 20.0 or higher (developed and tested on 24.0)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PHP compatibility&#039;&#039;&#039;&lt;br /&gt;
|PHP 7.4 or higher&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Required modules&#039;&#039;&#039;&lt;br /&gt;
|Accounting (double entry)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Dolibarr core modification&#039;&#039;&#039;&lt;br /&gt;
|No&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;License&#039;&#039;&#039;&lt;br /&gt;
|GNU GPL v3 or later (with an author attribution term)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Price&#039;&#039;&#039;&lt;br /&gt;
|Free&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Available languages&#039;&#039;&#039;&lt;br /&gt;
|Turkish, English&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Official links==&lt;br /&gt;
&lt;br /&gt;
*Source code and releases: [https://github.com/mbrksntrk/dolibarr-tdhp-mizan GitHub]&lt;br /&gt;
*Detailed documentation (Turkish): [https://github.com/mbrksntrk/dolibarr-tdhp-mizan/wiki GitHub wiki]&lt;br /&gt;
&lt;br /&gt;
==Main features==&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Hierarchical roll-up&#039;&#039;&#039;: movements of every sub-account are summed up the chart&#039;s parent tree to the 3-digit main accounts (100, 102, 120…).&lt;br /&gt;
*Debit and credit totals and &#039;&#039;&#039;debit / credit balances&#039;&#039;&#039; on every level, with a grand total.&lt;br /&gt;
*&#039;&#039;&#039;Period types&#039;&#039;&#039;: monthly, date range including or excluding closing entries, monthly main accounts, opening, closing, opening excluded, opening and closing excluded.&lt;br /&gt;
*&#039;&#039;&#039;Filters&#039;&#039;&#039;: account range, code prefix, account group (PCG), currency, balance direction, amount condition, search by code or name, show/hide main and sub accounts.&lt;br /&gt;
*&#039;&#039;&#039;PDF printing&#039;&#039;&#039; in the classic Turkish layout: A4, framed title box with period, company name and page &amp;quot;x / y&amp;quot; on every page, repeated column headers, level-based row style, zero amounts blank.&lt;br /&gt;
*&#039;&#039;&#039;Sayıştay-style CSV&#039;&#039;&#039; export (UTF-8 BOM, semicolon separated).&lt;br /&gt;
*Configurable debit/credit balance colours on screen.&lt;br /&gt;
&lt;br /&gt;
==Configuration==&lt;br /&gt;
&lt;br /&gt;
From Home → Setup → Modules → TDHP Mizan: debit and credit balance colours. In the chart of accounts, each sub-account must have its parent account set (e.g. 102.10.001 → 102.10 → 102).&lt;br /&gt;
&lt;br /&gt;
==User permissions==&lt;br /&gt;
&lt;br /&gt;
The report is available to administrators and to users with the core permission to read accounting movements.&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
&lt;br /&gt;
#Download &amp;lt;code&amp;gt;module_tdhpmizan-x.y.z.zip&amp;lt;/code&amp;gt; from GitHub Releases.&lt;br /&gt;
#Home → Setup → Modules → &#039;&#039;&#039;Deploy/install external app/module&#039;&#039;&#039;, or unzip into &amp;lt;code&amp;gt;htdocs/custom/&amp;lt;/code&amp;gt;.&lt;br /&gt;
#Enable the &#039;&#039;&#039;Accounting&#039;&#039;&#039; module, then &#039;&#039;&#039;TDHP Mizan&#039;&#039;&#039;.&lt;br /&gt;
#Open Accounting → &#039;&#039;&#039;TDHP Mizan&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==Summary==&lt;br /&gt;
&lt;br /&gt;
TDHP Mizan gives Dolibarr users in Türkiye the familiar hierarchical trial balance — on screen, as a printable PDF and as a Sayıştay-style CSV — using only the standard Dolibarr ledger.&lt;/div&gt;</summary>
		<author><name>Eldy</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Module_TdhpMizan&amp;diff=68126</id>
		<title>Module TdhpMizan</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Module_TdhpMizan&amp;diff=68126"/>
		<updated>2026-10-18T15:54:28Z</updated>

		<summary type="html">&lt;p&gt;Eldy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Complementary modules]]&lt;br /&gt;
[[Category:Financial]]&lt;br /&gt;
[[Category:Accountancy]]&lt;br /&gt;
&lt;br /&gt;
{{TemplateDocDev}}&lt;br /&gt;
{{TemplateDocUtil}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border:1px solid #d7e3f4; border-radius:14px; padding:22px; margin:12px 0 22px 0; background:linear-gradient(135deg,#f6faff,#ffffff); box-shadow:0 2px 10px rgba(20,60,110,0.08);&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;font-size:28px; font-weight:700; color:#17365d; margin-bottom:8px;&amp;quot;&amp;gt;TDHP Mizan for Dolibarr&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;font-size:18px; color:#345; margin-bottom:14px;&amp;quot;&amp;gt;Hierarchical trial balance (mizan) for the Turkish uniform chart of accounts&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;display:flex; flex-wrap:wrap; gap:8px; margin-top:10px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;span style=&amp;quot;background:#e8f1ff; color:#17365d; padding:6px 10px; border-radius:999px; font-weight:600;&amp;quot;&amp;gt;Main / sub-account roll-up&amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;background:#e8f1ff; color:#17365d; padding:6px 10px; border-radius:999px; font-weight:600;&amp;quot;&amp;gt;Debit · Credit balances&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background:#e8f1ff; color:#17365d; padding:6px 10px; border-radius:999px; font-weight:600;&amp;quot;&amp;gt;Period types&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background:#e8f1ff; color:#17365d; padding:6px 10px; border-radius:999px; font-weight:600;&amp;quot;&amp;gt;PDF printing&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background:#e8f1ff; color:#17365d; padding:6px 10px; border-radius:999px; font-weight:600;&amp;quot;&amp;gt;Sayıştay CSV&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;background:#e8f1ff; color:#17365d; padding:6px 10px; border-radius:999px; font-weight:600;&amp;quot;&amp;gt;Free · GPLv3&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Overview==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TDHP Mizan&#039;&#039;&#039; is a free external module for &#039;&#039;&#039;Dolibarr ERP/CRM&#039;&#039;&#039; that builds a hierarchical trial balance (&#039;&#039;mizan&#039;&#039;) for the &#039;&#039;&#039;Turkish uniform chart of accounts&#039;&#039;&#039; (Tekdüzen Hesap Planı, TDHP) from the Dolibarr general ledger.&lt;br /&gt;
&lt;br /&gt;
It only reads the ledger and the chart of accounts, has no tables of its own and does not modify any core file.&lt;br /&gt;
&lt;br /&gt;
==Publisher and support==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%; border-collapse:collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;width:24%; background:#f0f6ff;&amp;quot; |Item&lt;br /&gt;
! style=&amp;quot;background:#f0f6ff;&amp;quot; |Information&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Publisher&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;M. Burak Şentürk&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Website&#039;&#039;&#039;&lt;br /&gt;
|https://buraksenturk.net&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Support&#039;&#039;&#039;&lt;br /&gt;
|https://github.com/mbrksntrk/dolibarr-tdhp-mizan/issues&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Source code&#039;&#039;&#039;&lt;br /&gt;
|https://github.com/mbrksntrk/dolibarr-tdhp-mizan&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Module information==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
! style=&amp;quot;width:24%; background:#f7f7f7;&amp;quot; |Information&lt;br /&gt;
! style=&amp;quot;background:#f7f7f7;&amp;quot; |Detail&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Module name&#039;&#039;&#039;&lt;br /&gt;
|TDHP Mizan (&amp;lt;code&amp;gt;tdhpmizan&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Module number&#039;&#039;&#039;&lt;br /&gt;
|194096&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Main use&#039;&#039;&#039;&lt;br /&gt;
|Trial balance report for the Turkish uniform chart of accounts&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Type&#039;&#039;&#039;&lt;br /&gt;
|External Dolibarr module&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Family&#039;&#039;&#039;&lt;br /&gt;
|Financial&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Documented version&#039;&#039;&#039;&lt;br /&gt;
|1.1.0&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Dolibarr compatibility&#039;&#039;&#039;&lt;br /&gt;
|Dolibarr 20.0 or higher (developed and tested on 24.0)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;PHP compatibility&#039;&#039;&#039;&lt;br /&gt;
|PHP 7.4 or higher&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Required modules&#039;&#039;&#039;&lt;br /&gt;
|Accounting (double entry)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Dolibarr core modification&#039;&#039;&#039;&lt;br /&gt;
|No&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;License&#039;&#039;&#039;&lt;br /&gt;
|GNU GPL v3 or later (with an author attribution term)&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Price&#039;&#039;&#039;&lt;br /&gt;
|Free&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Available languages&#039;&#039;&#039;&lt;br /&gt;
|Turkish, English&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Official links==&lt;br /&gt;
&lt;br /&gt;
*Source code and releases: [https://github.com/mbrksntrk/dolibarr-tdhp-mizan GitHub]&lt;br /&gt;
*Detailed documentation (Turkish): [https://github.com/mbrksntrk/dolibarr-tdhp-mizan/wiki GitHub wiki]&lt;br /&gt;
&lt;br /&gt;
==Main features==&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Hierarchical roll-up&#039;&#039;&#039;: movements of every sub-account are summed up the chart&#039;s parent tree to the 3-digit main accounts (100, 102, 120…).&lt;br /&gt;
*Debit and credit totals and &#039;&#039;&#039;debit / credit balances&#039;&#039;&#039; on every level, with a grand total.&lt;br /&gt;
*&#039;&#039;&#039;Period types&#039;&#039;&#039;: monthly, date range including or excluding closing entries, monthly main accounts, opening, closing, opening excluded, opening and closing excluded.&lt;br /&gt;
*&#039;&#039;&#039;Filters&#039;&#039;&#039;: account range, code prefix, account group (PCG), currency, balance direction, amount condition, search by code or name, show/hide main and sub accounts.&lt;br /&gt;
*&#039;&#039;&#039;PDF printing&#039;&#039;&#039; in the classic Turkish layout: A4, framed title box with period, company name and page &amp;quot;x / y&amp;quot; on every page, repeated column headers, level-based row style, zero amounts blank.&lt;br /&gt;
*&#039;&#039;&#039;Sayıştay-style CSV&#039;&#039;&#039; export (UTF-8 BOM, semicolon separated).&lt;br /&gt;
*Configurable debit/credit balance colours on screen.&lt;br /&gt;
&lt;br /&gt;
==Configuration==&lt;br /&gt;
&lt;br /&gt;
From Home → Setup → Modules → TDHP Mizan: debit and credit balance colours. In the chart of accounts, each sub-account must have its parent account set (e.g. 102.10.001 → 102.10 → 102).&lt;br /&gt;
&lt;br /&gt;
==User permissions==&lt;br /&gt;
&lt;br /&gt;
The report is available to administrators and to users with the core permission to read accounting movements.&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
&lt;br /&gt;
#Download &amp;lt;code&amp;gt;module_tdhpmizan-x.y.z.zip&amp;lt;/code&amp;gt; from GitHub Releases.&lt;br /&gt;
#Home → Setup → Modules → &#039;&#039;&#039;Deploy/install external app/module&#039;&#039;&#039;, or unzip into &amp;lt;code&amp;gt;htdocs/custom/&amp;lt;/code&amp;gt;.&lt;br /&gt;
#Enable the &#039;&#039;&#039;Accounting&#039;&#039;&#039; module, then &#039;&#039;&#039;TDHP Mizan&#039;&#039;&#039;.&lt;br /&gt;
#Open Accounting → &#039;&#039;&#039;TDHP Mizan&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==Summary==&lt;br /&gt;
&lt;br /&gt;
TDHP Mizan gives Dolibarr users in Türkiye the familiar hierarchical trial balance — on screen, as a printable PDF and as a Sayıştay-style CSV — using only the standard Dolibarr ledger.&lt;/div&gt;</summary>
		<author><name>Eldy</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Modules_-_Rules_for_community_modules&amp;diff=68123</id>
		<title>Modules - Rules for community modules</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Modules_-_Rules_for_community_modules&amp;diff=68123"/>
		<updated>2026-10-18T12:54:54Z</updated>

		<summary type="html">&lt;p&gt;Eldy: /* Elligible features and Duplicate rules */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN origin interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- You can edit this section but do NOT remove these comments&lt;br /&gt;
     Links below will be automatically replicated on translated pages by PolyglotBot --&amp;gt;&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Introduction =&lt;br /&gt;
This page contains the rules defined for all modules integrated into the community repository.&lt;br /&gt;
https://github.com/Dolibarr/dolibarr-community-modules&lt;br /&gt;
&lt;br /&gt;
= New module integration requests / Authority =&lt;br /&gt;
The Dolibarr board is the owner of the community repository.&lt;br /&gt;
&lt;br /&gt;
Modules integration requests must be done by doing a Pull Request. The Dolibarr foundation board will merge the first pull request if accepted and if the module is hosted on the repository itlsef, will grant the permission to merge Pull Request to the initial author of the module so he can assume its responsability of merging following Pull Requests as explained into the Maintenance chapter.&lt;br /&gt;
&lt;br /&gt;
The Dolibarr foundation board should decide if a module is integrated or not according to all the following rules...&lt;br /&gt;
&lt;br /&gt;
= Rules =&lt;br /&gt;
&lt;br /&gt;
== Compatibility==&lt;br /&gt;
A module added into the community repository can have prerequisites that differs from Dolibarr. So minimum and maximum version of PHP is not necessarly the same as the one of the Dolibarr version the module is compatible with.&lt;br /&gt;
&lt;br /&gt;
== Price ==&lt;br /&gt;
A module provided into the Dolibarr community repository must be free (as in speech but also as in beer). There is another source for opensource but non-free (as in beer) modules, so  &#039;&#039;&#039;commercial modules&#039;&#039;&#039;, administrated by the Dolibarr foundation, that is [https://www.doliStore.com Dolistore.com].&lt;br /&gt;
&lt;br /&gt;
So modules added on the Community Repository should not be sell on any platform the Dolibarr skateholders have control on, above all on DoliStore (modules may be published on other platform, but for free).&lt;br /&gt;
&lt;br /&gt;
== Maintenance and no barriers to contributions ==&lt;br /&gt;
The user(s) that publish initialy the module in the Community repository agrees to analyze, check and approve, on a regular basis, issues or Pull Requests related to its module. We called this user(s) as the MAINTAINER(S). Issues and Pull Requests on project can be submited by everybody, we called them the CONTRIBUTORS.&lt;br /&gt;
&lt;br /&gt;
The name and github account of the maintainers (better if there is 2 or more persons per module) will be mentioned in the file MAINTAINERS (in the root of the project). The Dolibarr foundation will grant them permission to merge pull requests and manage issues. The maintainers agree to not validate Pull Request that is not related to files inside their directory module (in a future a check may be done automatically to avoid errors).&lt;br /&gt;
Maintainers of a module are allowed to commit directly files of their modules directory.&lt;br /&gt;
&lt;br /&gt;
Note: &lt;br /&gt;
* When an issue is pushed in the community module, a combo list with module name is mandatory into the ticket, so the maintainers can see and filters issues related to their and only their module.&lt;br /&gt;
* When a PR is pushed in the community module, a CI action automatically adds a tag with the name of the module, so the maintainers can see and filters Pull Requests related to their and only their module.&lt;br /&gt;
&lt;br /&gt;
The reference of all the sources and issues of the module must be the community repo. Any hosting onto another external source repository must be a mirroring only. This guarantee that the following needs for a community modules will always be met:&lt;br /&gt;
&lt;br /&gt;
* Getting sources with a simple &amp;quot;git clone&amp;quot; with no need to create any account must be possible, for exemple using the &amp;quot;git clone&amp;quot; command with the http url of the repository.&lt;br /&gt;
&lt;br /&gt;
* Contributing to sources must be as easy as doing a Pull or Merge Request. Registration of a user account for this on the source control platform should not request personal information (except a login, email, firstname and lastname). Registration process should also be fully automatic (so contributors can register any day at any hour and push its Pull Request few seconds after). The Dolibarr foundation keep control on the source control platform to be able to switch to another one at any time.&lt;br /&gt;
&lt;br /&gt;
* Building a zip of the module and hosting the zip file in the repository become possible and easy to do, automatically, so the module can be searched and installed directly from Dolibarr application.&lt;br /&gt;
&lt;br /&gt;
== Code ==&lt;br /&gt;
Modules must follow the same quality and coding rules than the Dolibarr project (See [[Language_and_development_rules]]), except the &#039;&#039;&#039;minimal and maximal PHP version&#039;&#039;&#039; (See chapter &amp;quot;Compatibility&amp;quot;) that can be diffrent than the Dolibarr official range.&lt;br /&gt;
&lt;br /&gt;
Modules are allowed to be compatible with a limited list of Dolibarr versions.&lt;br /&gt;
&lt;br /&gt;
Of course, the licence of the module, as a derivative work of Dolibarr that is licensed under GPL v3+, should use the GPL license or any OSI license compatible with GPL v3+.&lt;br /&gt;
&lt;br /&gt;
== Attribution and authors ==&lt;br /&gt;
Source files of module can (should) contains name, email of each author, however, the module should not contain any mention to the company at any other places, except into source files header or some text files (like README, COPYRIGHT, ...) or the &amp;quot;About page&amp;quot; of the module (in setup section). If a mention of the initial authoring company is made, the mention to refer to other authors must also be added with a mention &amp;quot;... and the Dolibarr community&amp;quot;. Name, email and company name of authors can be mentionned inside source files but on the &amp;quot;About page&amp;quot; visible by end user, we can have one and only one mention of the initial authoring company. We can have several links to it if they link to external pages related to documentation of the module , demo or resources.&lt;br /&gt;
&lt;br /&gt;
== Elligible features and Duplicate rules ==&lt;br /&gt;
* Features of a community module must NOT:&lt;br /&gt;
** provide a feature too similar to a Dolibarr existing feature. If the module just complete a Dolibarr official existing feature, it is better to try to submit a PR to enhance the official existing feature.&lt;br /&gt;
** be a feature for a niche market. In such a case, providing an external module, hosted on your own forge, and published on DoliStore.com is a better choice.&lt;br /&gt;
&lt;br /&gt;
* A community module MUST offer a feature that is interesting for a lot of users of a given country and bring a real added-value, related to at least one of this point:&lt;br /&gt;
** Sovereignty or emancipation from the GAFAM &lt;br /&gt;
** Legal requirement&lt;br /&gt;
** Interface with an external system too complex to maintain in the core.&lt;br /&gt;
** Cyber security (safety related to accidents or IT disaster are not part, risk management is not involved either).&lt;br /&gt;
&lt;br /&gt;
* Finally, we must answer the question: What is impact if suddenly the module become not availablefor end users that started to use it ? Is it a big trouble for end users or not ? If not (can be replaced easily), module is not elligible.&lt;br /&gt;
&lt;br /&gt;
Note: If a can provide the same features than another Community module, the Dolibarr foundation board will decide which one to keep and which one to remove on a case per case basis, so only one module will remain for the same feature.&lt;br /&gt;
&lt;br /&gt;
= Responsability of the Dolibarr foundation =&lt;br /&gt;
If some rules are not met,for example, if the pendings PRs are not correctly followed by the maintener (not merged and no answer), the Dolibarr foundation can revoke the permissions of the mainteners and grant then to other mainteners.&lt;br /&gt;
&lt;br /&gt;
The Dolibarr foundation can also decide to remove a community module from the repository at any time for other reasons, for example:&lt;br /&gt;
* Module is deprecated&lt;br /&gt;
* CI return bad quality indicators on code&lt;br /&gt;
* Too many security vulnerabilities reported and not fixed&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
The Dolibarr foundation decision about min and max version of Dolibarr or PHP supported by a module has priority on the choice of the maintener.&lt;br /&gt;
&lt;br /&gt;
= Version and validation of these rules =&lt;br /&gt;
&lt;br /&gt;
More rules will be added in future, the community repository is not a commercial repository and list of modules will be restricted to few modules only.&lt;br /&gt;
&lt;br /&gt;
History of all changes on this rules can be found using the tab &amp;quot;See historic&amp;quot; when logged on this wiki (creation of account is free).&lt;br /&gt;
&lt;br /&gt;
Version validated by the Dolibarr foundation the 24th of march 2026, clarified on july 2026.&lt;/div&gt;</summary>
		<author><name>Eldy</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Modules_-_Rules_for_community_modules&amp;diff=68122</id>
		<title>Modules - Rules for community modules</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Modules_-_Rules_for_community_modules&amp;diff=68122"/>
		<updated>2026-10-18T12:51:08Z</updated>

		<summary type="html">&lt;p&gt;Eldy: /* Elligible features and Duplicate rules */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN origin interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- You can edit this section but do NOT remove these comments&lt;br /&gt;
     Links below will be automatically replicated on translated pages by PolyglotBot --&amp;gt;&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Introduction =&lt;br /&gt;
This page contains the rules defined for all modules integrated into the community repository.&lt;br /&gt;
https://github.com/Dolibarr/dolibarr-community-modules&lt;br /&gt;
&lt;br /&gt;
= New module integration requests / Authority =&lt;br /&gt;
The Dolibarr board is the owner of the community repository.&lt;br /&gt;
&lt;br /&gt;
Modules integration requests must be done by doing a Pull Request. The Dolibarr foundation board will merge the first pull request if accepted and if the module is hosted on the repository itlsef, will grant the permission to merge Pull Request to the initial author of the module so he can assume its responsability of merging following Pull Requests as explained into the Maintenance chapter.&lt;br /&gt;
&lt;br /&gt;
The Dolibarr foundation board should decide if a module is integrated or not according to all the following rules...&lt;br /&gt;
&lt;br /&gt;
= Rules =&lt;br /&gt;
&lt;br /&gt;
== Compatibility==&lt;br /&gt;
A module added into the community repository can have prerequisites that differs from Dolibarr. So minimum and maximum version of PHP is not necessarly the same as the one of the Dolibarr version the module is compatible with.&lt;br /&gt;
&lt;br /&gt;
== Price ==&lt;br /&gt;
A module provided into the Dolibarr community repository must be free (as in speech but also as in beer). There is another source for opensource but non-free (as in beer) modules, so  &#039;&#039;&#039;commercial modules&#039;&#039;&#039;, administrated by the Dolibarr foundation, that is [https://www.doliStore.com Dolistore.com].&lt;br /&gt;
&lt;br /&gt;
So modules added on the Community Repository should not be sell on any platform the Dolibarr skateholders have control on, above all on DoliStore (modules may be published on other platform, but for free).&lt;br /&gt;
&lt;br /&gt;
== Maintenance and no barriers to contributions ==&lt;br /&gt;
The user(s) that publish initialy the module in the Community repository agrees to analyze, check and approve, on a regular basis, issues or Pull Requests related to its module. We called this user(s) as the MAINTAINER(S). Issues and Pull Requests on project can be submited by everybody, we called them the CONTRIBUTORS.&lt;br /&gt;
&lt;br /&gt;
The name and github account of the maintainers (better if there is 2 or more persons per module) will be mentioned in the file MAINTAINERS (in the root of the project). The Dolibarr foundation will grant them permission to merge pull requests and manage issues. The maintainers agree to not validate Pull Request that is not related to files inside their directory module (in a future a check may be done automatically to avoid errors).&lt;br /&gt;
Maintainers of a module are allowed to commit directly files of their modules directory.&lt;br /&gt;
&lt;br /&gt;
Note: &lt;br /&gt;
* When an issue is pushed in the community module, a combo list with module name is mandatory into the ticket, so the maintainers can see and filters issues related to their and only their module.&lt;br /&gt;
* When a PR is pushed in the community module, a CI action automatically adds a tag with the name of the module, so the maintainers can see and filters Pull Requests related to their and only their module.&lt;br /&gt;
&lt;br /&gt;
The reference of all the sources and issues of the module must be the community repo. Any hosting onto another external source repository must be a mirroring only. This guarantee that the following needs for a community modules will always be met:&lt;br /&gt;
&lt;br /&gt;
* Getting sources with a simple &amp;quot;git clone&amp;quot; with no need to create any account must be possible, for exemple using the &amp;quot;git clone&amp;quot; command with the http url of the repository.&lt;br /&gt;
&lt;br /&gt;
* Contributing to sources must be as easy as doing a Pull or Merge Request. Registration of a user account for this on the source control platform should not request personal information (except a login, email, firstname and lastname). Registration process should also be fully automatic (so contributors can register any day at any hour and push its Pull Request few seconds after). The Dolibarr foundation keep control on the source control platform to be able to switch to another one at any time.&lt;br /&gt;
&lt;br /&gt;
* Building a zip of the module and hosting the zip file in the repository become possible and easy to do, automatically, so the module can be searched and installed directly from Dolibarr application.&lt;br /&gt;
&lt;br /&gt;
== Code ==&lt;br /&gt;
Modules must follow the same quality and coding rules than the Dolibarr project (See [[Language_and_development_rules]]), except the &#039;&#039;&#039;minimal and maximal PHP version&#039;&#039;&#039; (See chapter &amp;quot;Compatibility&amp;quot;) that can be diffrent than the Dolibarr official range.&lt;br /&gt;
&lt;br /&gt;
Modules are allowed to be compatible with a limited list of Dolibarr versions.&lt;br /&gt;
&lt;br /&gt;
Of course, the licence of the module, as a derivative work of Dolibarr that is licensed under GPL v3+, should use the GPL license or any OSI license compatible with GPL v3+.&lt;br /&gt;
&lt;br /&gt;
== Attribution and authors ==&lt;br /&gt;
Source files of module can (should) contains name, email of each author, however, the module should not contain any mention to the company at any other places, except into source files header or some text files (like README, COPYRIGHT, ...) or the &amp;quot;About page&amp;quot; of the module (in setup section). If a mention of the initial authoring company is made, the mention to refer to other authors must also be added with a mention &amp;quot;... and the Dolibarr community&amp;quot;. Name, email and company name of authors can be mentionned inside source files but on the &amp;quot;About page&amp;quot; visible by end user, we can have one and only one mention of the initial authoring company. We can have several links to it if they link to external pages related to documentation of the module , demo or resources.&lt;br /&gt;
&lt;br /&gt;
== Elligible features and Duplicate rules ==&lt;br /&gt;
* Features of a community module must NOT:&lt;br /&gt;
** provide a feature too similar to a Dolibarr existing feature. If the module just complete a Dolibarr official existing feature, it is better to try to submit a PR to enhance the official existing feature.&lt;br /&gt;
** be a feature for a niche market. In such a case, providing an external module, hosted on your own forge, and published on DoliStore.com is a better choice.&lt;br /&gt;
&lt;br /&gt;
* A community module MUST offer a feature that is interesting for a lot of users of a given country and bring a real added-value, related to at least one of this point:&lt;br /&gt;
** Sovereignty or emancipation from the GAFAM &lt;br /&gt;
** Legal requirement&lt;br /&gt;
** Interface with an external system too complex to maintain in the core.&lt;br /&gt;
** Cyber security (safety related to accidents or IT disaster are not part, risk management is not involved either).&lt;br /&gt;
&lt;br /&gt;
* Finally, we must answer the question: What is impact if suddenly the module become not available ? Is it a big trouble for end users or not ? If not (can be replaced easily), module is not elligible.&lt;br /&gt;
&lt;br /&gt;
Note: If a can provide the same features than another Community module, the Dolibarr foundation board will decide which one to keep and which one to remove on a case per case basis, so only one module will remain for the same feature.&lt;br /&gt;
&lt;br /&gt;
= Responsability of the Dolibarr foundation =&lt;br /&gt;
If some rules are not met,for example, if the pendings PRs are not correctly followed by the maintener (not merged and no answer), the Dolibarr foundation can revoke the permissions of the mainteners and grant then to other mainteners.&lt;br /&gt;
&lt;br /&gt;
The Dolibarr foundation can also decide to remove a community module from the repository at any time for other reasons, for example:&lt;br /&gt;
* Module is deprecated&lt;br /&gt;
* CI return bad quality indicators on code&lt;br /&gt;
* Too many security vulnerabilities reported and not fixed&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
The Dolibarr foundation decision about min and max version of Dolibarr or PHP supported by a module has priority on the choice of the maintener.&lt;br /&gt;
&lt;br /&gt;
= Version and validation of these rules =&lt;br /&gt;
&lt;br /&gt;
More rules will be added in future, the community repository is not a commercial repository and list of modules will be restricted to few modules only.&lt;br /&gt;
&lt;br /&gt;
History of all changes on this rules can be found using the tab &amp;quot;See historic&amp;quot; when logged on this wiki (creation of account is free).&lt;br /&gt;
&lt;br /&gt;
Version validated by the Dolibarr foundation the 24th of march 2026, clarified on july 2026.&lt;/div&gt;</summary>
		<author><name>Eldy</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Modules_-_Rules_for_community_modules&amp;diff=68121</id>
		<title>Modules - Rules for community modules</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Modules_-_Rules_for_community_modules&amp;diff=68121"/>
		<updated>2026-10-18T12:47:14Z</updated>

		<summary type="html">&lt;p&gt;Eldy: /* Elligible features and Duplicate rules */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN origin interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- You can edit this section but do NOT remove these comments&lt;br /&gt;
     Links below will be automatically replicated on translated pages by PolyglotBot --&amp;gt;&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Introduction =&lt;br /&gt;
This page contains the rules defined for all modules integrated into the community repository.&lt;br /&gt;
https://github.com/Dolibarr/dolibarr-community-modules&lt;br /&gt;
&lt;br /&gt;
= New module integration requests / Authority =&lt;br /&gt;
The Dolibarr board is the owner of the community repository.&lt;br /&gt;
&lt;br /&gt;
Modules integration requests must be done by doing a Pull Request. The Dolibarr foundation board will merge the first pull request if accepted and if the module is hosted on the repository itlsef, will grant the permission to merge Pull Request to the initial author of the module so he can assume its responsability of merging following Pull Requests as explained into the Maintenance chapter.&lt;br /&gt;
&lt;br /&gt;
The Dolibarr foundation board should decide if a module is integrated or not according to all the following rules...&lt;br /&gt;
&lt;br /&gt;
= Rules =&lt;br /&gt;
&lt;br /&gt;
== Compatibility==&lt;br /&gt;
A module added into the community repository can have prerequisites that differs from Dolibarr. So minimum and maximum version of PHP is not necessarly the same as the one of the Dolibarr version the module is compatible with.&lt;br /&gt;
&lt;br /&gt;
== Price ==&lt;br /&gt;
A module provided into the Dolibarr community repository must be free (as in speech but also as in beer). There is another source for opensource but non-free (as in beer) modules, so  &#039;&#039;&#039;commercial modules&#039;&#039;&#039;, administrated by the Dolibarr foundation, that is [https://www.doliStore.com Dolistore.com].&lt;br /&gt;
&lt;br /&gt;
So modules added on the Community Repository should not be sell on any platform the Dolibarr skateholders have control on, above all on DoliStore (modules may be published on other platform, but for free).&lt;br /&gt;
&lt;br /&gt;
== Maintenance and no barriers to contributions ==&lt;br /&gt;
The user(s) that publish initialy the module in the Community repository agrees to analyze, check and approve, on a regular basis, issues or Pull Requests related to its module. We called this user(s) as the MAINTAINER(S). Issues and Pull Requests on project can be submited by everybody, we called them the CONTRIBUTORS.&lt;br /&gt;
&lt;br /&gt;
The name and github account of the maintainers (better if there is 2 or more persons per module) will be mentioned in the file MAINTAINERS (in the root of the project). The Dolibarr foundation will grant them permission to merge pull requests and manage issues. The maintainers agree to not validate Pull Request that is not related to files inside their directory module (in a future a check may be done automatically to avoid errors).&lt;br /&gt;
Maintainers of a module are allowed to commit directly files of their modules directory.&lt;br /&gt;
&lt;br /&gt;
Note: &lt;br /&gt;
* When an issue is pushed in the community module, a combo list with module name is mandatory into the ticket, so the maintainers can see and filters issues related to their and only their module.&lt;br /&gt;
* When a PR is pushed in the community module, a CI action automatically adds a tag with the name of the module, so the maintainers can see and filters Pull Requests related to their and only their module.&lt;br /&gt;
&lt;br /&gt;
The reference of all the sources and issues of the module must be the community repo. Any hosting onto another external source repository must be a mirroring only. This guarantee that the following needs for a community modules will always be met:&lt;br /&gt;
&lt;br /&gt;
* Getting sources with a simple &amp;quot;git clone&amp;quot; with no need to create any account must be possible, for exemple using the &amp;quot;git clone&amp;quot; command with the http url of the repository.&lt;br /&gt;
&lt;br /&gt;
* Contributing to sources must be as easy as doing a Pull or Merge Request. Registration of a user account for this on the source control platform should not request personal information (except a login, email, firstname and lastname). Registration process should also be fully automatic (so contributors can register any day at any hour and push its Pull Request few seconds after). The Dolibarr foundation keep control on the source control platform to be able to switch to another one at any time.&lt;br /&gt;
&lt;br /&gt;
* Building a zip of the module and hosting the zip file in the repository become possible and easy to do, automatically, so the module can be searched and installed directly from Dolibarr application.&lt;br /&gt;
&lt;br /&gt;
== Code ==&lt;br /&gt;
Modules must follow the same quality and coding rules than the Dolibarr project (See [[Language_and_development_rules]]), except the &#039;&#039;&#039;minimal and maximal PHP version&#039;&#039;&#039; (See chapter &amp;quot;Compatibility&amp;quot;) that can be diffrent than the Dolibarr official range.&lt;br /&gt;
&lt;br /&gt;
Modules are allowed to be compatible with a limited list of Dolibarr versions.&lt;br /&gt;
&lt;br /&gt;
Of course, the licence of the module, as a derivative work of Dolibarr that is licensed under GPL v3+, should use the GPL license or any OSI license compatible with GPL v3+.&lt;br /&gt;
&lt;br /&gt;
== Attribution and authors ==&lt;br /&gt;
Source files of module can (should) contains name, email of each author, however, the module should not contain any mention to the company at any other places, except into source files header or some text files (like README, COPYRIGHT, ...) or the &amp;quot;About page&amp;quot; of the module (in setup section). If a mention of the initial authoring company is made, the mention to refer to other authors must also be added with a mention &amp;quot;... and the Dolibarr community&amp;quot;. Name, email and company name of authors can be mentionned inside source files but on the &amp;quot;About page&amp;quot; visible by end user, we can have one and only one mention of the initial authoring company. We can have several links to it if they link to external pages related to documentation of the module , demo or resources.&lt;br /&gt;
&lt;br /&gt;
== Elligible features and Duplicate rules ==&lt;br /&gt;
* Features of a community module must NOT:&lt;br /&gt;
** provide a feature too similar to a Dolibarr existing feature. If the module just complete a Dolibarr official existing feature, it is better to try to submit a PR to enhance the official existing feature.&lt;br /&gt;
** be a feature for a niche market. In such a case, providing an external module, hosted on your own forge, and published on DoliStore.com is a better choice.&lt;br /&gt;
&lt;br /&gt;
* A community module MUST offer a feature that is interesting for a lot of users of a given country and bring a real added-value, related to at least one of this point:&lt;br /&gt;
** Sustainability&lt;br /&gt;
** Sovereignty or emancipation from the GAFAM &lt;br /&gt;
** Legal requirement&lt;br /&gt;
** Interface with an external system too complex to maintain in the core. &lt;br /&gt;
&lt;br /&gt;
* Finally, we must answer the question: What is impact if suddenly the module become not available ? Is it a big trouble for end users or not ? If not (can be replaced easily), module is not elligible.&lt;br /&gt;
&lt;br /&gt;
Note: If a can provide the same features than another Community module, the Dolibarr foundation board will decide which one to keep and which one to remove on a case per case basis, so only one module will remain for the same feature.&lt;br /&gt;
&lt;br /&gt;
= Responsability of the Dolibarr foundation =&lt;br /&gt;
If some rules are not met,for example, if the pendings PRs are not correctly followed by the maintener (not merged and no answer), the Dolibarr foundation can revoke the permissions of the mainteners and grant then to other mainteners.&lt;br /&gt;
&lt;br /&gt;
The Dolibarr foundation can also decide to remove a community module from the repository at any time for other reasons, for example:&lt;br /&gt;
* Module is deprecated&lt;br /&gt;
* CI return bad quality indicators on code&lt;br /&gt;
* Too many security vulnerabilities reported and not fixed&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
The Dolibarr foundation decision about min and max version of Dolibarr or PHP supported by a module has priority on the choice of the maintener.&lt;br /&gt;
&lt;br /&gt;
= Version and validation of these rules =&lt;br /&gt;
&lt;br /&gt;
More rules will be added in future, the community repository is not a commercial repository and list of modules will be restricted to few modules only.&lt;br /&gt;
&lt;br /&gt;
History of all changes on this rules can be found using the tab &amp;quot;See historic&amp;quot; when logged on this wiki (creation of account is free).&lt;br /&gt;
&lt;br /&gt;
Version validated by the Dolibarr foundation the 24th of march 2026, clarified on july 2026.&lt;/div&gt;</summary>
		<author><name>Eldy</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Modules_-_Rules_for_community_modules&amp;diff=68120</id>
		<title>Modules - Rules for community modules</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Modules_-_Rules_for_community_modules&amp;diff=68120"/>
		<updated>2026-10-18T12:42:57Z</updated>

		<summary type="html">&lt;p&gt;Eldy: /* Elligible features and Duplicate rules */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN origin interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- You can edit this section but do NOT remove these comments&lt;br /&gt;
     Links below will be automatically replicated on translated pages by PolyglotBot --&amp;gt;&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Introduction =&lt;br /&gt;
This page contains the rules defined for all modules integrated into the community repository.&lt;br /&gt;
https://github.com/Dolibarr/dolibarr-community-modules&lt;br /&gt;
&lt;br /&gt;
= New module integration requests / Authority =&lt;br /&gt;
The Dolibarr board is the owner of the community repository.&lt;br /&gt;
&lt;br /&gt;
Modules integration requests must be done by doing a Pull Request. The Dolibarr foundation board will merge the first pull request if accepted and if the module is hosted on the repository itlsef, will grant the permission to merge Pull Request to the initial author of the module so he can assume its responsability of merging following Pull Requests as explained into the Maintenance chapter.&lt;br /&gt;
&lt;br /&gt;
The Dolibarr foundation board should decide if a module is integrated or not according to all the following rules...&lt;br /&gt;
&lt;br /&gt;
= Rules =&lt;br /&gt;
&lt;br /&gt;
== Compatibility==&lt;br /&gt;
A module added into the community repository can have prerequisites that differs from Dolibarr. So minimum and maximum version of PHP is not necessarly the same as the one of the Dolibarr version the module is compatible with.&lt;br /&gt;
&lt;br /&gt;
== Price ==&lt;br /&gt;
A module provided into the Dolibarr community repository must be free (as in speech but also as in beer). There is another source for opensource but non-free (as in beer) modules, so  &#039;&#039;&#039;commercial modules&#039;&#039;&#039;, administrated by the Dolibarr foundation, that is [https://www.doliStore.com Dolistore.com].&lt;br /&gt;
&lt;br /&gt;
So modules added on the Community Repository should not be sell on any platform the Dolibarr skateholders have control on, above all on DoliStore (modules may be published on other platform, but for free).&lt;br /&gt;
&lt;br /&gt;
== Maintenance and no barriers to contributions ==&lt;br /&gt;
The user(s) that publish initialy the module in the Community repository agrees to analyze, check and approve, on a regular basis, issues or Pull Requests related to its module. We called this user(s) as the MAINTAINER(S). Issues and Pull Requests on project can be submited by everybody, we called them the CONTRIBUTORS.&lt;br /&gt;
&lt;br /&gt;
The name and github account of the maintainers (better if there is 2 or more persons per module) will be mentioned in the file MAINTAINERS (in the root of the project). The Dolibarr foundation will grant them permission to merge pull requests and manage issues. The maintainers agree to not validate Pull Request that is not related to files inside their directory module (in a future a check may be done automatically to avoid errors).&lt;br /&gt;
Maintainers of a module are allowed to commit directly files of their modules directory.&lt;br /&gt;
&lt;br /&gt;
Note: &lt;br /&gt;
* When an issue is pushed in the community module, a combo list with module name is mandatory into the ticket, so the maintainers can see and filters issues related to their and only their module.&lt;br /&gt;
* When a PR is pushed in the community module, a CI action automatically adds a tag with the name of the module, so the maintainers can see and filters Pull Requests related to their and only their module.&lt;br /&gt;
&lt;br /&gt;
The reference of all the sources and issues of the module must be the community repo. Any hosting onto another external source repository must be a mirroring only. This guarantee that the following needs for a community modules will always be met:&lt;br /&gt;
&lt;br /&gt;
* Getting sources with a simple &amp;quot;git clone&amp;quot; with no need to create any account must be possible, for exemple using the &amp;quot;git clone&amp;quot; command with the http url of the repository.&lt;br /&gt;
&lt;br /&gt;
* Contributing to sources must be as easy as doing a Pull or Merge Request. Registration of a user account for this on the source control platform should not request personal information (except a login, email, firstname and lastname). Registration process should also be fully automatic (so contributors can register any day at any hour and push its Pull Request few seconds after). The Dolibarr foundation keep control on the source control platform to be able to switch to another one at any time.&lt;br /&gt;
&lt;br /&gt;
* Building a zip of the module and hosting the zip file in the repository become possible and easy to do, automatically, so the module can be searched and installed directly from Dolibarr application.&lt;br /&gt;
&lt;br /&gt;
== Code ==&lt;br /&gt;
Modules must follow the same quality and coding rules than the Dolibarr project (See [[Language_and_development_rules]]), except the &#039;&#039;&#039;minimal and maximal PHP version&#039;&#039;&#039; (See chapter &amp;quot;Compatibility&amp;quot;) that can be diffrent than the Dolibarr official range.&lt;br /&gt;
&lt;br /&gt;
Modules are allowed to be compatible with a limited list of Dolibarr versions.&lt;br /&gt;
&lt;br /&gt;
Of course, the licence of the module, as a derivative work of Dolibarr that is licensed under GPL v3+, should use the GPL license or any OSI license compatible with GPL v3+.&lt;br /&gt;
&lt;br /&gt;
== Attribution and authors ==&lt;br /&gt;
Source files of module can (should) contains name, email of each author, however, the module should not contain any mention to the company at any other places, except into source files header or some text files (like README, COPYRIGHT, ...) or the &amp;quot;About page&amp;quot; of the module (in setup section). If a mention of the initial authoring company is made, the mention to refer to other authors must also be added with a mention &amp;quot;... and the Dolibarr community&amp;quot;. Name, email and company name of authors can be mentionned inside source files but on the &amp;quot;About page&amp;quot; visible by end user, we can have one and only one mention of the initial authoring company. We can have several links to it if they link to external pages related to documentation of the module , demo or resources.&lt;br /&gt;
&lt;br /&gt;
== Elligible features and Duplicate rules ==&lt;br /&gt;
* Features of a community module must NOT:&lt;br /&gt;
** provide a feature too similar to a Dolibarr existing feature. If the module just complete a Dolibarr official existing feature, it is better to try to submit a PR to enhance the official existing feature.&lt;br /&gt;
** be a feature for a niche market. In such a case, providing an external module, hosted on your own forge, and published on DoliStore.com is a better choice.&lt;br /&gt;
&lt;br /&gt;
* A community module MUST offer a feature that is interesting for a lot of users of a given country and bring a real added-value, related to at least one of this point:&lt;br /&gt;
** Sustainability&lt;br /&gt;
** Sovereignty&lt;br /&gt;
** Legal requirement&lt;br /&gt;
** Interface with an external system too complex to maintain in the core. &lt;br /&gt;
&lt;br /&gt;
* Finally, we must answer the question: What is impact if suddenly the module become not available ? Is it a big trouble for end users or not ? If not (can be replaced easily), module is not elligible.&lt;br /&gt;
&lt;br /&gt;
Note: If a can provide the same features than another Community module, the Dolibarr foundation board will decide which one to keep and which one to remove on a case per case basis, so only one module will remain for the same feature.&lt;br /&gt;
&lt;br /&gt;
= Responsability of the Dolibarr foundation =&lt;br /&gt;
If some rules are not met,for example, if the pendings PRs are not correctly followed by the maintener (not merged and no answer), the Dolibarr foundation can revoke the permissions of the mainteners and grant then to other mainteners.&lt;br /&gt;
&lt;br /&gt;
The Dolibarr foundation can also decide to remove a community module from the repository at any time for other reasons, for example:&lt;br /&gt;
* Module is deprecated&lt;br /&gt;
* CI return bad quality indicators on code&lt;br /&gt;
* Too many security vulnerabilities reported and not fixed&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
The Dolibarr foundation decision about min and max version of Dolibarr or PHP supported by a module has priority on the choice of the maintener.&lt;br /&gt;
&lt;br /&gt;
= Version and validation of these rules =&lt;br /&gt;
&lt;br /&gt;
More rules will be added in future, the community repository is not a commercial repository and list of modules will be restricted to few modules only.&lt;br /&gt;
&lt;br /&gt;
History of all changes on this rules can be found using the tab &amp;quot;See historic&amp;quot; when logged on this wiki (creation of account is free).&lt;br /&gt;
&lt;br /&gt;
Version validated by the Dolibarr foundation the 24th of march 2026, clarified on july 2026.&lt;/div&gt;</summary>
		<author><name>Eldy</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Modules_-_Rules_for_community_modules&amp;diff=68119</id>
		<title>Modules - Rules for community modules</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Modules_-_Rules_for_community_modules&amp;diff=68119"/>
		<updated>2026-10-18T12:40:47Z</updated>

		<summary type="html">&lt;p&gt;Eldy: /* Elligible features and Duplicate rules */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN origin interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- You can edit this section but do NOT remove these comments&lt;br /&gt;
     Links below will be automatically replicated on translated pages by PolyglotBot --&amp;gt;&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Introduction =&lt;br /&gt;
This page contains the rules defined for all modules integrated into the community repository.&lt;br /&gt;
https://github.com/Dolibarr/dolibarr-community-modules&lt;br /&gt;
&lt;br /&gt;
= New module integration requests / Authority =&lt;br /&gt;
The Dolibarr board is the owner of the community repository.&lt;br /&gt;
&lt;br /&gt;
Modules integration requests must be done by doing a Pull Request. The Dolibarr foundation board will merge the first pull request if accepted and if the module is hosted on the repository itlsef, will grant the permission to merge Pull Request to the initial author of the module so he can assume its responsability of merging following Pull Requests as explained into the Maintenance chapter.&lt;br /&gt;
&lt;br /&gt;
The Dolibarr foundation board should decide if a module is integrated or not according to all the following rules...&lt;br /&gt;
&lt;br /&gt;
= Rules =&lt;br /&gt;
&lt;br /&gt;
== Compatibility==&lt;br /&gt;
A module added into the community repository can have prerequisites that differs from Dolibarr. So minimum and maximum version of PHP is not necessarly the same as the one of the Dolibarr version the module is compatible with.&lt;br /&gt;
&lt;br /&gt;
== Price ==&lt;br /&gt;
A module provided into the Dolibarr community repository must be free (as in speech but also as in beer). There is another source for opensource but non-free (as in beer) modules, so  &#039;&#039;&#039;commercial modules&#039;&#039;&#039;, administrated by the Dolibarr foundation, that is [https://www.doliStore.com Dolistore.com].&lt;br /&gt;
&lt;br /&gt;
So modules added on the Community Repository should not be sell on any platform the Dolibarr skateholders have control on, above all on DoliStore (modules may be published on other platform, but for free).&lt;br /&gt;
&lt;br /&gt;
== Maintenance and no barriers to contributions ==&lt;br /&gt;
The user(s) that publish initialy the module in the Community repository agrees to analyze, check and approve, on a regular basis, issues or Pull Requests related to its module. We called this user(s) as the MAINTAINER(S). Issues and Pull Requests on project can be submited by everybody, we called them the CONTRIBUTORS.&lt;br /&gt;
&lt;br /&gt;
The name and github account of the maintainers (better if there is 2 or more persons per module) will be mentioned in the file MAINTAINERS (in the root of the project). The Dolibarr foundation will grant them permission to merge pull requests and manage issues. The maintainers agree to not validate Pull Request that is not related to files inside their directory module (in a future a check may be done automatically to avoid errors).&lt;br /&gt;
Maintainers of a module are allowed to commit directly files of their modules directory.&lt;br /&gt;
&lt;br /&gt;
Note: &lt;br /&gt;
* When an issue is pushed in the community module, a combo list with module name is mandatory into the ticket, so the maintainers can see and filters issues related to their and only their module.&lt;br /&gt;
* When a PR is pushed in the community module, a CI action automatically adds a tag with the name of the module, so the maintainers can see and filters Pull Requests related to their and only their module.&lt;br /&gt;
&lt;br /&gt;
The reference of all the sources and issues of the module must be the community repo. Any hosting onto another external source repository must be a mirroring only. This guarantee that the following needs for a community modules will always be met:&lt;br /&gt;
&lt;br /&gt;
* Getting sources with a simple &amp;quot;git clone&amp;quot; with no need to create any account must be possible, for exemple using the &amp;quot;git clone&amp;quot; command with the http url of the repository.&lt;br /&gt;
&lt;br /&gt;
* Contributing to sources must be as easy as doing a Pull or Merge Request. Registration of a user account for this on the source control platform should not request personal information (except a login, email, firstname and lastname). Registration process should also be fully automatic (so contributors can register any day at any hour and push its Pull Request few seconds after). The Dolibarr foundation keep control on the source control platform to be able to switch to another one at any time.&lt;br /&gt;
&lt;br /&gt;
* Building a zip of the module and hosting the zip file in the repository become possible and easy to do, automatically, so the module can be searched and installed directly from Dolibarr application.&lt;br /&gt;
&lt;br /&gt;
== Code ==&lt;br /&gt;
Modules must follow the same quality and coding rules than the Dolibarr project (See [[Language_and_development_rules]]), except the &#039;&#039;&#039;minimal and maximal PHP version&#039;&#039;&#039; (See chapter &amp;quot;Compatibility&amp;quot;) that can be diffrent than the Dolibarr official range.&lt;br /&gt;
&lt;br /&gt;
Modules are allowed to be compatible with a limited list of Dolibarr versions.&lt;br /&gt;
&lt;br /&gt;
Of course, the licence of the module, as a derivative work of Dolibarr that is licensed under GPL v3+, should use the GPL license or any OSI license compatible with GPL v3+.&lt;br /&gt;
&lt;br /&gt;
== Attribution and authors ==&lt;br /&gt;
Source files of module can (should) contains name, email of each author, however, the module should not contain any mention to the company at any other places, except into source files header or some text files (like README, COPYRIGHT, ...) or the &amp;quot;About page&amp;quot; of the module (in setup section). If a mention of the initial authoring company is made, the mention to refer to other authors must also be added with a mention &amp;quot;... and the Dolibarr community&amp;quot;. Name, email and company name of authors can be mentionned inside source files but on the &amp;quot;About page&amp;quot; visible by end user, we can have one and only one mention of the initial authoring company. We can have several links to it if they link to external pages related to documentation of the module , demo or resources.&lt;br /&gt;
&lt;br /&gt;
== Elligible features and Duplicate rules ==&lt;br /&gt;
* Features of a community module must NOT:&lt;br /&gt;
[] provide a feature too similar to a Dolibarr existing feature. If the module just complete a Dolibarr official existing feature, it is better to try to submit a PR to enhance the official existing feature.&lt;br /&gt;
[] be a feature for a niche market. In such a case, providing an external module, hosted on your own forge, and published on DoliStore.com is a better choice.&lt;br /&gt;
&lt;br /&gt;
* A community module MUST offer a feature that is interesting for a lot of users of a given country and bring a real added-value, related to at least one of this point:&lt;br /&gt;
** Sustainability&lt;br /&gt;
** Sovereignty&lt;br /&gt;
** Legal requirement&lt;br /&gt;
** Interface with an external system too complex to maintain in the core. &lt;br /&gt;
&lt;br /&gt;
* If a can provide the same features than another Community module, the Dolibarr foundation board will decide which one to keep and which one to remove on a case per case basis, so only one module will remain for the same feature.&lt;br /&gt;
&lt;br /&gt;
= Responsability of the Dolibarr foundation =&lt;br /&gt;
If some rules are not met,for example, if the pendings PRs are not correctly followed by the maintener (not merged and no answer), the Dolibarr foundation can revoke the permissions of the mainteners and grant then to other mainteners.&lt;br /&gt;
&lt;br /&gt;
The Dolibarr foundation can also decide to remove a community module from the repository at any time for other reasons, for example:&lt;br /&gt;
* Module is deprecated&lt;br /&gt;
* CI return bad quality indicators on code&lt;br /&gt;
* Too many security vulnerabilities reported and not fixed&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
The Dolibarr foundation decision about min and max version of Dolibarr or PHP supported by a module has priority on the choice of the maintener.&lt;br /&gt;
&lt;br /&gt;
= Version and validation of these rules =&lt;br /&gt;
&lt;br /&gt;
More rules will be added in future, the community repository is not a commercial repository and list of modules will be restricted to few modules only.&lt;br /&gt;
&lt;br /&gt;
History of all changes on this rules can be found using the tab &amp;quot;See historic&amp;quot; when logged on this wiki (creation of account is free).&lt;br /&gt;
&lt;br /&gt;
Version validated by the Dolibarr foundation the 24th of march 2026, clarified on july 2026.&lt;/div&gt;</summary>
		<author><name>Eldy</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Modules_-_Rules_for_community_modules&amp;diff=68118</id>
		<title>Modules - Rules for community modules</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Modules_-_Rules_for_community_modules&amp;diff=68118"/>
		<updated>2026-10-18T12:37:54Z</updated>

		<summary type="html">&lt;p&gt;Eldy: /* Elligible features and Duplicate rules */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN origin interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- You can edit this section but do NOT remove these comments&lt;br /&gt;
     Links below will be automatically replicated on translated pages by PolyglotBot --&amp;gt;&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Introduction =&lt;br /&gt;
This page contains the rules defined for all modules integrated into the community repository.&lt;br /&gt;
https://github.com/Dolibarr/dolibarr-community-modules&lt;br /&gt;
&lt;br /&gt;
= New module integration requests / Authority =&lt;br /&gt;
The Dolibarr board is the owner of the community repository.&lt;br /&gt;
&lt;br /&gt;
Modules integration requests must be done by doing a Pull Request. The Dolibarr foundation board will merge the first pull request if accepted and if the module is hosted on the repository itlsef, will grant the permission to merge Pull Request to the initial author of the module so he can assume its responsability of merging following Pull Requests as explained into the Maintenance chapter.&lt;br /&gt;
&lt;br /&gt;
The Dolibarr foundation board should decide if a module is integrated or not according to all the following rules...&lt;br /&gt;
&lt;br /&gt;
= Rules =&lt;br /&gt;
&lt;br /&gt;
== Compatibility==&lt;br /&gt;
A module added into the community repository can have prerequisites that differs from Dolibarr. So minimum and maximum version of PHP is not necessarly the same as the one of the Dolibarr version the module is compatible with.&lt;br /&gt;
&lt;br /&gt;
== Price ==&lt;br /&gt;
A module provided into the Dolibarr community repository must be free (as in speech but also as in beer). There is another source for opensource but non-free (as in beer) modules, so  &#039;&#039;&#039;commercial modules&#039;&#039;&#039;, administrated by the Dolibarr foundation, that is [https://www.doliStore.com Dolistore.com].&lt;br /&gt;
&lt;br /&gt;
So modules added on the Community Repository should not be sell on any platform the Dolibarr skateholders have control on, above all on DoliStore (modules may be published on other platform, but for free).&lt;br /&gt;
&lt;br /&gt;
== Maintenance and no barriers to contributions ==&lt;br /&gt;
The user(s) that publish initialy the module in the Community repository agrees to analyze, check and approve, on a regular basis, issues or Pull Requests related to its module. We called this user(s) as the MAINTAINER(S). Issues and Pull Requests on project can be submited by everybody, we called them the CONTRIBUTORS.&lt;br /&gt;
&lt;br /&gt;
The name and github account of the maintainers (better if there is 2 or more persons per module) will be mentioned in the file MAINTAINERS (in the root of the project). The Dolibarr foundation will grant them permission to merge pull requests and manage issues. The maintainers agree to not validate Pull Request that is not related to files inside their directory module (in a future a check may be done automatically to avoid errors).&lt;br /&gt;
Maintainers of a module are allowed to commit directly files of their modules directory.&lt;br /&gt;
&lt;br /&gt;
Note: &lt;br /&gt;
* When an issue is pushed in the community module, a combo list with module name is mandatory into the ticket, so the maintainers can see and filters issues related to their and only their module.&lt;br /&gt;
* When a PR is pushed in the community module, a CI action automatically adds a tag with the name of the module, so the maintainers can see and filters Pull Requests related to their and only their module.&lt;br /&gt;
&lt;br /&gt;
The reference of all the sources and issues of the module must be the community repo. Any hosting onto another external source repository must be a mirroring only. This guarantee that the following needs for a community modules will always be met:&lt;br /&gt;
&lt;br /&gt;
* Getting sources with a simple &amp;quot;git clone&amp;quot; with no need to create any account must be possible, for exemple using the &amp;quot;git clone&amp;quot; command with the http url of the repository.&lt;br /&gt;
&lt;br /&gt;
* Contributing to sources must be as easy as doing a Pull or Merge Request. Registration of a user account for this on the source control platform should not request personal information (except a login, email, firstname and lastname). Registration process should also be fully automatic (so contributors can register any day at any hour and push its Pull Request few seconds after). The Dolibarr foundation keep control on the source control platform to be able to switch to another one at any time.&lt;br /&gt;
&lt;br /&gt;
* Building a zip of the module and hosting the zip file in the repository become possible and easy to do, automatically, so the module can be searched and installed directly from Dolibarr application.&lt;br /&gt;
&lt;br /&gt;
== Code ==&lt;br /&gt;
Modules must follow the same quality and coding rules than the Dolibarr project (See [[Language_and_development_rules]]), except the &#039;&#039;&#039;minimal and maximal PHP version&#039;&#039;&#039; (See chapter &amp;quot;Compatibility&amp;quot;) that can be diffrent than the Dolibarr official range.&lt;br /&gt;
&lt;br /&gt;
Modules are allowed to be compatible with a limited list of Dolibarr versions.&lt;br /&gt;
&lt;br /&gt;
Of course, the licence of the module, as a derivative work of Dolibarr that is licensed under GPL v3+, should use the GPL license or any OSI license compatible with GPL v3+.&lt;br /&gt;
&lt;br /&gt;
== Attribution and authors ==&lt;br /&gt;
Source files of module can (should) contains name, email of each author, however, the module should not contain any mention to the company at any other places, except into source files header or some text files (like README, COPYRIGHT, ...) or the &amp;quot;About page&amp;quot; of the module (in setup section). If a mention of the initial authoring company is made, the mention to refer to other authors must also be added with a mention &amp;quot;... and the Dolibarr community&amp;quot;. Name, email and company name of authors can be mentionned inside source files but on the &amp;quot;About page&amp;quot; visible by end user, we can have one and only one mention of the initial authoring company. We can have several links to it if they link to external pages related to documentation of the module , demo or resources.&lt;br /&gt;
&lt;br /&gt;
== Elligible features and Duplicate rules ==&lt;br /&gt;
* Features of a community module must NOT:&lt;br /&gt;
** provide a feature too similar to a Dolibarr existing feature. If the module just complete a Dolibarr official existing feature, it is better to try to submit a PR to enhance the official existing feature.&lt;br /&gt;
** be a feature for a niche market. In such a case, providing an external module, hosted on your own forge, and published on DoliStore.com is a better choice.&lt;br /&gt;
&lt;br /&gt;
* A community module MUST offer a feature that is interesting for a lot of users of a given country and bring a real added-value related to one of this point:&lt;br /&gt;
** Sustainability&lt;br /&gt;
** Sovereignty&lt;br /&gt;
** Legal requirement&lt;br /&gt;
** Interface with an external system too complex to maintain in the core. &lt;br /&gt;
&lt;br /&gt;
* If a module provides the same features than another Community module, the Dolibarr foundation board will decide which one to keep and which one to remove on a case per case basis, so only one module will remain for the same feature.&lt;br /&gt;
&lt;br /&gt;
= Responsability of the Dolibarr foundation =&lt;br /&gt;
If some rules are not met,for example, if the pendings PRs are not correctly followed by the maintener (not merged and no answer), the Dolibarr foundation can revoke the permissions of the mainteners and grant then to other mainteners.&lt;br /&gt;
&lt;br /&gt;
The Dolibarr foundation can also decide to remove a community module from the repository at any time for other reasons, for example:&lt;br /&gt;
* Module is deprecated&lt;br /&gt;
* CI return bad quality indicators on code&lt;br /&gt;
* Too many security vulnerabilities reported and not fixed&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
The Dolibarr foundation decision about min and max version of Dolibarr or PHP supported by a module has priority on the choice of the maintener.&lt;br /&gt;
&lt;br /&gt;
= Version and validation of these rules =&lt;br /&gt;
&lt;br /&gt;
More rules will be added in future, the community repository is not a commercial repository and list of modules will be restricted to few modules only.&lt;br /&gt;
&lt;br /&gt;
History of all changes on this rules can be found using the tab &amp;quot;See historic&amp;quot; when logged on this wiki (creation of account is free).&lt;br /&gt;
&lt;br /&gt;
Version validated by the Dolibarr foundation the 24th of march 2026, clarified on july 2026.&lt;/div&gt;</summary>
		<author><name>Eldy</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Language_and_development_rules&amp;diff=68019</id>
		<title>Language and development rules</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Language_and_development_rules&amp;diff=68019"/>
		<updated>2026-10-13T02:15:41Z</updated>

		<summary type="html">&lt;p&gt;Eldy: /* Closure or anonymous function */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN origin interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- You can edit this section but do NOT remove these comments&lt;br /&gt;
     Links below will be automatically replicated on translated pages by PolyglotBot --&amp;gt;&lt;br /&gt;
[[de:Sprachen_und_Programmierregeln]]&lt;br /&gt;
[[fr:Langages_et_normes]]&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;
{{TemplateDocDevEn}}&lt;br /&gt;
&lt;br /&gt;
These are some rules on language, syntax and norm we use in the Dolibarr project:&lt;br /&gt;
&lt;br /&gt;
=Versions=&lt;br /&gt;
&lt;br /&gt;
*Current version of Dolibarr must work on:&lt;br /&gt;
&lt;br /&gt;
#All OS (Windows, Linux, MACOS...)&lt;br /&gt;
#PHP {{PHPMinVersion}} (Must work with no need of complementary PHP module, except module to PHP module to access database). See [[List of releases, change log and compatibilities]] for pre-requisites for older versions.&lt;br /&gt;
#MySQL {{MySqlMinVersion}}&lt;br /&gt;
&lt;br /&gt;
=Copyright Norms=&lt;br /&gt;
&lt;br /&gt;
*All PHP files must start with a header that looks like&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
When you edit an existing file of project, you must add a Copyright line under others.&lt;br /&gt;
&lt;br /&gt;
=PHP Norms=&lt;br /&gt;
==PHP==&lt;br /&gt;
&lt;br /&gt;
*Dolibarr is written with PHP and supports all versions of PHP higher than {{PHPMinVersion}}. All files must end with extension .php&lt;br /&gt;
&lt;br /&gt;
*Usage of PHP superglobals variables must use the dedicated operators $_COOKIE, $_SERVER, $_ENV but use the Dolibarr functions [[Fonctions utiles Dolibarr|GETPOST...()]] to get the contents of $_GET or $_POST..&lt;br /&gt;
&lt;br /&gt;
*Other operators ($HTTP_SERVER_GET, ...) are now deprecated in PHP, so they must not be used. Code must work if option &#039;&#039;&#039;register_long_arrays&#039;&#039;&#039; is set to off. Moreover, the code must work when PHP option &#039;&#039;&#039;register_globals&#039;&#039;&#039; is off (recommended by PHP). It must also work  if the option &#039;&#039;&#039;register_globals&#039;&#039;&#039; is on (by default on a lot of installations).&lt;br /&gt;
&lt;br /&gt;
*Do not use &#039;&#039;&#039;&amp;lt;s&amp;gt;PHP_SELF&amp;lt;/s&amp;gt;&#039;&#039;&#039;. Use instead &#039;&#039;&#039;$_SERVER[&amp;quot;PHP_SELF&amp;quot;]&#039;&#039;&#039;. Also, Dolibarr framework sanitizes content of $_SERVER[&amp;quot;PHP_SELF&amp;quot;] variable (into main.inc.php file, before any business code).&lt;br /&gt;
&lt;br /&gt;
*When several variables must be initialized with the same value, you must use individual declarations (separated by ;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$var1 = 1;&lt;br /&gt;
$var2 = 1;&lt;br /&gt;
$var3 = 1;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
instead of&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$var1 = $var2 = $var3 = 1;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
which is slower.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Strings====&lt;br /&gt;
&lt;br /&gt;
*Strings must be have variables outside of the quote.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
print &amp;quot;My text show my &amp;quot;.$variable.&amp;quot; !\n&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Closure or anonymous function====&lt;br /&gt;
If you new a function, just create a real one (or a method).&lt;br /&gt;
Anonymous function are just &#039;&#039;&#039;forbidden&#039;&#039;&#039; (existing one should be removed), they brings a lot of problem:&lt;br /&gt;
* Code readability&lt;br /&gt;
* $tihs can create cyclic reference.&lt;br /&gt;
* Broken static analytics tools that can&#039;t guess type or path of variable&lt;br /&gt;
* Unit test more difficult&lt;br /&gt;
* AI become crazy&lt;br /&gt;
* Coding debug trouble (no name function into stack trace)&lt;br /&gt;
* Impact analysis more difficult as the stack trace of code can&#039;t be guess easily when function are not named explicitely.&lt;br /&gt;
* Memory overload not under control.&lt;br /&gt;
&lt;br /&gt;
====Comments====&lt;br /&gt;
&lt;br /&gt;
*Comments must use the C syntax, ie a double slash for a comment on one line and a slash-star to open a bloc for several lines&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
/* Bloc of comment&lt;br /&gt;
 *&lt;br /&gt;
 * End of 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;
    // comment on one line&lt;br /&gt;
    print $i;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function myFunction($param1, $param2)&lt;br /&gt;
{&lt;br /&gt;
    // code&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Functions must return a value equal or higher than 0 if successful and strictly lower than 0 if error.&lt;br /&gt;
&lt;br /&gt;
*No dead code (code never used) into Dolibarr core code (code used by external modules only must be included within the external modules).&lt;br /&gt;
&lt;br /&gt;
*Use &amp;quot;include_once&amp;quot; for anything with functions or class definitions in it (like *.class.php and *.lib.php files), use &amp;quot;include&amp;quot; for template-style php with files containing common part of HTML and PHP code (like *.inc.php and *.tpl.php files).&lt;br /&gt;
&lt;br /&gt;
*Coding style to use is the &#039;&#039;&#039;PSR-12&#039;&#039;&#039; (https://www.php-fig.org/psr/psr-12/). Only rules tagged &amp;quot;MUST&amp;quot; are currently required. So note however the exceptions:&lt;br /&gt;
**Length of line: PSR-12 mention we can&#039;t go up to 120 characters on same line, this is a soft limit. It is better to have long lines instead of long page with code content that is just data declaration and does not contain any logic. However, we introduced a hard limit of &#039;&#039;&#039;1000&#039;&#039;&#039; characters (having line larger than this may return errors on Continuous Integration tests).&lt;br /&gt;
**Tabs are allowed: The other exception is that we don&#039;t replace systematically the tabs with spaces. Using tabs is more convenient for most editors/developers. Also using spaces breaks some auto-format features (like Eclipse autoformat feature on some Eclipse version). For the moment, the best setup is &amp;quot;Keep spaces/tabs as it is&amp;quot;, however, you can activate the option &amp;quot;Remove spaces at end of lines&amp;quot;.&lt;br /&gt;
**We allow elements of an array on same line and we do not always add a new line at end of each element.&lt;br /&gt;
**Note 1: The following rule are very important to follow:&lt;br /&gt;
***Files must be saved with Unix format (LF) and not Windows (CR/LF). Unix format is compatible on all OS such as Unix like, Windows, Mac, but the Windows text file format may not work on some PHP under Unix.&lt;br /&gt;
***Smart tags PHP must not be used. PHP code section must start with &#039;&#039;&#039;&amp;lt;?php&#039;&#039;&#039; (the &amp;quot;smart tags&amp;quot; &amp;lt;? or &amp;lt;?=, also known as the &amp;quot;short tags&amp;quot;, depend on php configuration option &#039;&#039;&#039;short_open_tag&#039;&#039;&#039;, even if this is no more true after php5.4. The use of &amp;lt;? can still have conflict with XML syntax. The smartags may not be supported by all IDE. Also, the use of &amp;lt;?= make easier for a hacker to make PHP injection. To fight this, some Dolibarr components, like the website PHP editor, accepts only full php tags to detect, parse and filter PHP. Finaly, using the same tag everywhere make also easier to make code scanning or impact analysis when we are sure of the tags that is used, and the best solution, to be sure of which tag is used, is to use one, only one and the same tag everywhere.&lt;br /&gt;
**Note 2: You can use the file &#039;&#039;&#039;dev/setup/codesniffer/ruleset.xml&#039;&#039;&#039; as rule file to control coding style with PHPCodeSniffer.&lt;br /&gt;
**Note 3: You can use the file &#039;&#039;&#039;dev/setup/eclipse/PSR-12 [built-in].xml&#039;&#039;&#039; as rule file to setup Eclipse syntax formater.&lt;br /&gt;
**Note 4: You may note that current code is not yet compliant with the PSR-12. The reason is that we must &amp;quot;now&amp;quot; follow the &amp;quot;MUST&amp;quot; rules of PSR-12, but it wasn&#039;t in the past. So feel free to change coding style to match new rules (keep in mind the 2 exceptions) if you find such cases.&lt;br /&gt;
&lt;br /&gt;
==Classes and properties structures==&lt;br /&gt;
&lt;br /&gt;
Some properties of classes are found in different classes. To avoid having different names, we will use the following PHP properties names:&lt;br /&gt;
&lt;br /&gt;
{{TemplatePHPFields}}&lt;br /&gt;
&lt;br /&gt;
=SQL and Database rules=&lt;br /&gt;
&lt;br /&gt;
==DDL file format==&lt;br /&gt;
Files containing definition of the database structure (DDL files) must be &#039;&#039;&#039;2 per table&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
*The first file defines the table and its fields. The file name contains the table name, e.g. like this: &amp;lt;tt&amp;gt;llx_&#039;&#039;mytable&#039;&#039;.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A comment will be added for each field to explain its usage.&lt;br /&gt;
&lt;br /&gt;
*The second file defines all foreign keys, performance indexes or other constraints and the file name will be like: &amp;lt;tt&amp;gt;llx_&#039;&#039;mytable&#039;&#039;.key.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These files must be stored in the directory &#039;&#039;&#039;install/mysql/tables&#039;&#039;&#039; for all standard files or &#039;&#039;&#039;mymodule/tables&#039;&#039;&#039; for tables provided by an external module.&lt;br /&gt;
&lt;br /&gt;
Example: &#039;&#039;&#039;file for creating the table llx_mytable will be llx_mytable.sql&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- ===========================================================================&lt;br /&gt;
-- Copyright (C) 2013 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 3 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_mytable&lt;br /&gt;
(&lt;br /&gt;
  rowid       integer NOT NULL AUTO_INCREMENT PRIMARY KEY,&lt;br /&gt;
  ref	      varchar(30)       NOT NULL,		-- object reference number&lt;br /&gt;
  entity      integer DEFAULT 1 NOT NULL,	        -- multi company id&lt;br /&gt;
  ref_ext     varchar(255),-- reference into an external system (not used by dolibarr)&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;
  datec       timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,,   -- creation datetime&lt;br /&gt;
  tms         timestamp,    -- update time stamp&lt;br /&gt;
  fk_user_author integer NOT NULL,                     -- Author, foreign key of llx_user&lt;br /&gt;
  fk_user_mod    integer NOT NULL,                      -- Last updater, foreign key of llx_user&lt;br /&gt;
  import_key	varchar(14)                -- Use by import process&lt;br /&gt;
)type=innodb;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: &#039;&#039;&#039;file for creating keys/indexes for the table llx_mytable will be llx_mytable.key.sql&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- ===========================================================================&lt;br /&gt;
-- Copyright (C) 2013 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 3 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_mytable ADD UNIQUE uk_mytable_field (field_one, field_two);&lt;br /&gt;
&lt;br /&gt;
ALTER TABLE llx_mytable ADD CONSTRAINT fk_mytable_fk_field FOREIGN KEY (fk_field) REFERENCES llx_matablepere (rowid);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Table and fields structures==&lt;br /&gt;
&lt;br /&gt;
*Structure of tables.&lt;br /&gt;
&lt;br /&gt;
When you create a new table, it is recommended to use the same conventions as other Dolibarr tables. This means the following fields:&lt;br /&gt;
 - rowid INTEGER AUTO_INCREMENT PRIMARY KEY    that is technical id of record&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                   that will contain date of last modification (the database manages this field automatically, no need to manage it by the code, just create the field)&lt;br /&gt;
 - date_valid      datetime                    that is the validation date (if applicable)&lt;br /&gt;
 - import_key      varchar(32)                 that will contain the import code YYYYMMDDHHMMSS if you make mass import&lt;br /&gt;
 - status          smallint                    to store a status&lt;br /&gt;
Optional&lt;br /&gt;
 - fk_user_creat or fk_user_author integer that is the id of user making creation&lt;br /&gt;
 - fk_user_modif integer that is the id of user making change&lt;br /&gt;
 - fk_user_valid integer that is the id of user validating record (if applicable)&lt;br /&gt;
 - fk_soc integer that is the ID of the Third party (if applicable)&lt;br /&gt;
&lt;br /&gt;
Note field:&lt;br /&gt;
 - note_private text for private comment of the object&lt;br /&gt;
 - note_public text for public comment of the object&lt;br /&gt;
or &lt;br /&gt;
 - note text if there is no need to have private and public&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Type of fields:&lt;br /&gt;
&lt;br /&gt;
To be compatible with any accuracy required by any country on amounts, to be compatible with any database syntax and with the Dolibarr upgrade framework, we will use the following types for database fields:&lt;br /&gt;
&lt;br /&gt;
 - integer for a primary key, an integer or any of foreign key (bigint may also be accepted for very large tables)&lt;br /&gt;
 - smallint for a small number (like for a status) or a boolean&lt;br /&gt;
 - double(24,8) for any amount&lt;br /&gt;
 - double(6,3) for any vat rate&lt;br /&gt;
 - real for a quantity&lt;br /&gt;
 - varchar for a string (also if length is 1, the type char is more and more deprecated)&lt;br /&gt;
 - timestamp for a field date+time that is automatically updated&lt;br /&gt;
 - datetime for a field date+time&lt;br /&gt;
 - date for a field date&lt;br /&gt;
 - text or medium text for large fields (no index allowed on such fields)&lt;br /&gt;
&lt;br /&gt;
All business rules must be in the same place, in PHP code, not in the client or the database, that&#039;s why type enum is also not allowed.&lt;br /&gt;
Other types are not allowed for compatibility reasons. &lt;br /&gt;
&lt;br /&gt;
*All tables have a prefix to avoid name conflicts with other projects. In the current version this prefix is fixed and can&#039;t be modified. Its value is &amp;lt;tt&amp;gt;llx_&amp;lt;/tt&amp;gt;. In a future version this value should be modified during installation process.&lt;br /&gt;
&lt;br /&gt;
==Primary keys==&lt;br /&gt;
The primary key of a table must be called &amp;lt;tt&amp;gt;rowid&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Some old tables do not use this rule and use a primary key called &amp;lt;tt&amp;gt;id&amp;lt;/tt&amp;gt; (e.g. [[Table llx_c_actioncomm]]). The reason is historical and this should not happen anymore.&lt;br /&gt;
&lt;br /&gt;
==Foreign keys==&lt;br /&gt;
The name of a foreign key must start with the prefix &amp;lt;tt&amp;gt;fk_&amp;lt;/tt&amp;gt; followed by the table name (i.e. name of the referencing table) (this is required to avoid duplicate names in project that are not allowed even if in different tables by some DBMS like Postgresql) then the field name (i.e. name of the referencing field) (this is to allow to have several foreign keys in same table).&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&#039;&#039;fk_facture_fourn_fk_soc&#039;&#039;  is a foreign key in the table llx_facture_fourn for the field fk_soc in this table (that references the rowid field in another table)&lt;br /&gt;
&lt;br /&gt;
Note when using a foreing key:&lt;br /&gt;
- Do not add a hard foreign key (a foreign key controled bydatabase) when the link is not important. This generates more trouble than solution. For exemple, a link to a user table to follow the author of creation of an object is NOT an important link. If parent object,the user, is deleted,the child record will be orphelin but this is not a problem. Record will appear with a cretion author that is &amp;quot;unknown&amp;quot; and that is the truth if we have deleted the parent user.&lt;br /&gt;
&lt;br /&gt;
- If you develop your own external module, it must have no hard foreign keys that point to Dolibarr standard tables. This will break standard dolibarr upgrades, repair, backup and restore tools and may also break standard features. Foreign keys must be soft foreign keys so managed by the code with no database contraints.&lt;br /&gt;
&lt;br /&gt;
==Alternative keys==&lt;br /&gt;
Sometimes, we need other unique keys than primary key. When we need this, we can create an alternate unique key. Such a key should have a name that starts with &amp;lt;tt&amp;gt;uk_&amp;lt;/tt&amp;gt;, then the table name (this is required to avoid duplicate names of unique keys that may create problems for some DBMS like Postgresql) and then another string to define the key (this is to allow having several unique keys on the same table).&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&#039;&#039;uk_societe_code_client&#039;&#039; is a unique key on table llx_societe on field code_client.&lt;br /&gt;
&lt;br /&gt;
==Index performance==&lt;br /&gt;
Some fields are often used as search or order criteria, or for joins. In such case, we need to set a performance index on field to increase performances. Such indexes are named with a prefix &amp;lt;tt&amp;gt;idx_&amp;lt;/tt&amp;gt; then the table name and then the field name.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&#039;&#039;idx_societe_user_creat&#039;&#039; is a performance index on table llx_societe for field user_creat&lt;br /&gt;
&lt;br /&gt;
==Denormalized field==&lt;br /&gt;
Fields that store a data that is result of calculation of other data already stored is a &amp;quot;denormalized field&amp;quot;. It must be avoid if we can, and must be used only for performance purpose.&lt;br /&gt;
In such a case, to allow developper to understand that the data is not the value that rule, we must prefix the nameof fiel with &#039;&#039;&#039;&amp;quot;denormalized_&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
For example the field &amp;quot;denormalized_lower_planned_end_date&amp;quot; to store the ending date of the last membership of a member. We already have the information, but doing search or filter on it is difficult as it is stored into another table into another level, so we can duplicate the information into a such field.&lt;br /&gt;
&lt;br /&gt;
If this happen, we must :&lt;br /&gt;
* check the any import profile has a function to update the denormalized value during import.&lt;br /&gt;
* have a task in the repair.php to recalculate the value and align the data with the original source.&lt;br /&gt;
* into the crud method that update any data that impact the field, we must include the update or the denormalized value.&lt;br /&gt;
&lt;br /&gt;
==SQL Coding rules==&lt;br /&gt;
&lt;br /&gt;
*Alias usage/Fields naming&lt;br /&gt;
&lt;br /&gt;
When doing select, we can use alias to simplify writing/reading of requests:&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
However, we must not used alias for update request as they are not compatible with Mysql 3.1.&lt;br /&gt;
&lt;br /&gt;
*Using SELECT * is forbidden ! When using SELECT you must define complete list of fields to get. This avoids confusion. And above all, this make reengeering of code easier and make impact analysis of change on a field possible. Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Into SQL requests, you must quote fields except the fields that contain amounts which must be stored as double or real type. Quotes on numbers may result in saving as a different value. For example 412.62 in an insert will be saved as value 412.61999512 into database (due to implicit conversion string to numeric) if the target field has type double(24,8). Only PHP see value 412.61999512. Other tools will see 412.62 letting think that there is no problem. But it&#039;s PHP that has the good vision. There is really a wrong value into database. By removing quotes on numbers, no problem occurs.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
Good:     INSERT INTO table_1 (field_txt, field_num) VALUES (&#039;txt&#039;, 412.62)&lt;br /&gt;
Bad:      INSERT INTO table_1 (field_txt, field_num) VALUES (&#039;txt&#039;, &#039;412.62&#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note, the problem of float numbers is the same on all languages and not only when inserting data into database. It occurs also with any language when you work on &amp;quot;real&amp;quot; numbers, so numbers must be, as soon as they are affected into variable, cleaned with function price2num with second parameter defined to&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;:&lt;br /&gt;
&#039;MU&#039; (for unit prices), &#039;MT&#039; (for total prices) or &#039;MS&#039; (otherwise) depending on usage of number. (see function documentation)&lt;br /&gt;
&lt;br /&gt;
*SQL Date functions NOW, SYSDATE, DATEDIFF or DATE are forbidden inside SQL requests. Other functions like (MONTH, YEAR) must also be avoided if possible. If you must use the current date into a field, value must come from the PHP and not from the database engine. This is for 3 reasons:&lt;br /&gt;
**better portability of code&lt;br /&gt;
**better management of TimeZone (reference timezone is the PHP timezone and timezone of database may differs so all dates functions must be on PHP side).&lt;br /&gt;
**better performance (see example and final comment)&lt;br /&gt;
&lt;br /&gt;
For example, don&#039;t do:&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
but do:&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example, don&#039;t do:&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
but do:&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An other advantage of this rule, is that request benefits of index because we are making a compare of a field with a fixed value. When using datediff, you make an operation on field before comparison, this means database can&#039;t use the index on field, resulting on very bad performance compared to solution without the datediff.&lt;br /&gt;
&lt;br /&gt;
*The statement WITH ROLLUP is prohibited:&lt;br /&gt;
&lt;br /&gt;
This statement should not be used: it is not handled the same way by different databases.&lt;br /&gt;
Also, using WITH ROLLUP breaks the purity of the returned data. The intermediate subtotal generation aggregation performed by this statement can easily be done using PHP and helps keep the returned data array clean (not corrupted by artificially inserted data).&lt;br /&gt;
&lt;br /&gt;
*The sql function GROUP_CONCAT can&#039;t be used. It is not portable and ask the database to make subrequests for line into main table, this can be done easier by doing a subrequest inside the PHP loop when building the output of each line.&lt;br /&gt;
&lt;br /&gt;
*Use $db-&amp;gt;ifsql for SQL IF&lt;br /&gt;
&lt;br /&gt;
Do not include the IF into your forged SQL request. But use instead $db-&amp;gt;ifsql() method to you will make a SQL IF that is compatible with all SQL databases.&lt;br /&gt;
&lt;br /&gt;
*No DELETE CASCADE and ON UPDATE CASCADE&lt;br /&gt;
&lt;br /&gt;
Such SQL instructions are forbidden because they bypass the business rules of the application bringing a lot of troubles out of control of the developers. For example, if there is a delete cascade between table A and B, when the application will execute the code to remove a record in A, the children into table B will also be removed (this is the goal). But if there was a Dolibarr PHP trigger (for example provided by an external module) on the deletion of record of B (for example to validate the deletion or to execute a complementary action), the DELETE CASCADE will be executed without having the Dolibarr PHP trigger on B deletion executed, missing the validation or actions of the PHP trigger of the module. All business rules must be implemented on the same side (so the server PHP side), this is the reason why business rules implemented on Database side (like with delete cascade) are not allowed (same conclusion than the next point about Database triggers).&lt;br /&gt;
Note that an external module can use them for links between Dolibarr tables and its module tables but a better recommended solution is to use the trigger to implement the deletion of its tables when a record of a parent official table is deleted.&lt;br /&gt;
&lt;br /&gt;
==Using Database triggers / stored procedures==&lt;br /&gt;
Using Database triggers is not allowed into the code of Dolibarr, so you should have no troubles with Database triggers. &lt;br /&gt;
&lt;br /&gt;
*Database triggers are not portable. Compatibility may be broken when upgrading your version of your database&lt;br /&gt;
*Database triggers are often forgotten into backup tools&lt;br /&gt;
*Database triggers need special permissions that you may not have (and should not have) on a common secured database&lt;br /&gt;
*Database triggers means also that you include some &amp;quot;business rules&amp;quot; of your application into the database where most other rules are managed by the code itself (this can create conflict or code that can&#039;t be debugged with a step by step debugger)&lt;br /&gt;
*Database triggers execute code using the timezone, the default language of the database instead of the reference timezone of the application that may be different (generating offset into database) and the default language setup in application ...&lt;br /&gt;
*There is tons of other reasons why we do not recommend to use database triggers in your own development.&lt;br /&gt;
&lt;br /&gt;
Using Database triggers can save you time when you make development but is a very bad practice when quality, portability, security and sustainability are priority, so it is forbidden as it is not compatible with the high level of quality of code expected by Dolibarr team. External modules that uses Database triggers may also be refused on the market place since it won&#039;t work for more than 50% of users.&lt;br /&gt;
&lt;br /&gt;
==Basic Migration Rules==&lt;br /&gt;
&lt;br /&gt;
*Structure migration scripts are files of the type &#039;&#039;&#039;install/mysql/migration/a.b.c-x.y.z.sql&#039;&#039;&#039;. In a migration file from version n to n+1, a table that is no longer used in n+1 is only dropped (DROP TABLE) during the migration from version n+1 to n+2. This is to ensure that obsolete tables are always kept for the duration of a version to correct any issues in case of a migration error.&lt;br /&gt;
&lt;br /&gt;
==MySQL-MariaDB specificity==&lt;br /&gt;
&lt;br /&gt;
*Tables must be declared with format InnoDB.&lt;br /&gt;
&lt;br /&gt;
This format supports foreign keys and their restrictions, and transactions integrity is also supported. This guarantees that Dolibarr events keep all data with correct values between tables even when transaction modify different tables.&lt;br /&gt;
&lt;br /&gt;
*Dolibarr MUST work even if MySQL option &#039;&#039;&#039;strict&#039;&#039;&#039; is active.&lt;br /&gt;
&lt;br /&gt;
To activate it (required when developing on Dolibarr), add the following line into the config file of your MySQL server (my.cnf or my.ini)&lt;br /&gt;
{{MySqlStrictMode}}&lt;br /&gt;
&lt;br /&gt;
==PostgreSQL specificities==&lt;br /&gt;
Only MySQL files must be maintained.&lt;br /&gt;
Those files are converted &amp;quot;on the fly&amp;quot; by the database Dolibarr driver into the targeted database system.&lt;br /&gt;
&lt;br /&gt;
There is an exception for the SQL &amp;quot;UPDATE FROM&amp;quot; of Postgres: &lt;br /&gt;
&lt;br /&gt;
MySQL Syntax:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
UPDATE table_target as target, table_source as source SET fieldtarget=source.fieldsource&lt;br /&gt;
WHERE source.rowid=target.rowid;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PgSQL Syntax:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
UPDATE table_target as target SET fieldtarget=source.fieldsource&lt;br /&gt;
FROM table_source as source WHERE source.rowid=target.rowid;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There is no native SQL requests &amp;quot;UPDATE FROM&amp;quot; in all Dolibarr core (only simple &amp;quot;UPDATE&amp;quot;) so this difference of syntax is not a problem. But if you need to use one in your own code of your module, you should do&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight 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_target 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_target 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=HTML norms=&lt;br /&gt;
==Syntax rules==&lt;br /&gt;
&lt;br /&gt;
*HTML used must be HTML compliant and not XHTML. All attributes of HTML tags must be in lower case and quoted with &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
*Links href must be absolute and use the function dol_buildpath() to get absolute path from a relative path and img tag must be build using function img_picto().&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
print &#039;&amp;lt;a href=&amp;quot;&#039;.dol_buildpath(&#039;/mydir/mypage.php&#039;).&#039;&amp;quot;&amp;gt;&#039;.img_picto(&#039;Texte alt&#039;,&#039;namepictopng&#039;,&#039;&#039;).&#039;&amp;lt;/a&amp;gt;&#039;;&#039;&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*HTML tables must have columns with no forced width, except for columns that contains data we know the length. For example, a column with a picto only can be forced to with=&amp;quot;20px&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Otherwise, we must avoid forcing the column width. Reason is that, in most cases, the browser make a better works to define column width automatically than forced values, and it works whatever is the resolution.&lt;br /&gt;
&lt;br /&gt;
*Javascript/ajax code and call to javascript files into php pages must be avoided. However, if you need to include javascript code, you must add a condition on &amp;quot;$conf-&amp;gt;use_javascript_ajax&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
if ($conf-&amp;gt;use_javascript_ajax) {&lt;br /&gt;
...  // php code generating javascript here&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Popup windows must not be used, except for tooltips (and must have a condition as explained before).&lt;br /&gt;
&lt;br /&gt;
*External scripts must be written in Perl if they can&#039;t be written in PHP. Usage of another language is not forbidden but must be argued before in the development mailing-list.&lt;br /&gt;
&lt;br /&gt;
==External template framework ?==&lt;br /&gt;
There is ton of frameworks to provide a template language of an HTML page (smarty, twig, ...). The best and faster one we know is just called &amp;quot;PHP&amp;quot;, and because Dolibarr already depends on PHP, using another framework may introduce a dependency on a third language to make templates.&lt;br /&gt;
&lt;br /&gt;
We must remind that template frameworks are just pre-processor, BEFORE PHP. They can&#039;t be faster than PHP alone. When we say &amp;quot;speed is increased because template framework use a cache&amp;quot;, you must read in fact &amp;quot;the overtime spent by the framework is reduced by cache, not the speed of processing a PHP template file&amp;quot;. We should say &amp;quot;any template framework has an overload over PHP, the cache of the template framework just reduces the slowing effect of using this framework&amp;quot;, but not &amp;quot;the speed is increased, it is always decreased compared to pure PHP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Above all, having a template system is completely possible by doing a &amp;quot;&#039;&#039;&#039;.tpl.php&#039;&#039;&#039;&amp;quot; file that dos not contains any logic code, but only HTML and print of variables. We get same result (but faster and easier to develop because it does not need to do all the setXXX before calling each template). All variables (known by code that include the template) are automatically known into a PHP template page. No risk to forget a set, and a lot of line of codes reduced, a lot of time and development errors are also saved.&lt;br /&gt;
&lt;br /&gt;
But an external template system can keep a guarantee of 100% of isolation between code and HTML output. Yes, but this is interesting in only 1 situation: When teams building design is completely different than team building logic code, AND if you build not too sophisticated pages, AND with no need of too many Ajax features (this need to know how code works).&lt;br /&gt;
And this situation is surely not the Dolibarr future (team are often be same, Ajax will be more and more present, even if we hope not &amp;quot;too much&amp;quot;, and screens are more and more dependent of dynamic or contextual events, difficult to have this with one simple template without transforming the template into a page with high level of code). Also design is more and more managed now in CSS side instead of PHP side.&lt;br /&gt;
&lt;br /&gt;
In the past, Dolibarr has experimented a template system like Smarty. If on the paper the idea was good, we quickly realized that finding a bug become a headache, coding become a treasure hunt, maintenance and development were done so slower (compared to previous situation where output templates are into the &amp;quot;View&amp;quot; section of each PHP file) that we forgot this idea. Pragmatism won.&lt;br /&gt;
&lt;br /&gt;
There is a ton of other reasons to not use an external template system and all arguments to use them are also the best argument to use HTML/PHP as our template system. We just ask to keep separation between &#039;&#039;&#039;Controllers&#039;&#039;&#039; (the first section of PHP pages juste after the &amp;quot;/* Action&amp;quot; line), and the &#039;&#039;&#039;Views&#039;&#039;&#039;, the second section after the &amp;quot;/* View&amp;quot; comment that is the presentation section build with PHP).&lt;br /&gt;
&lt;br /&gt;
=CSS norms=&lt;br /&gt;
&lt;br /&gt;
==Syntax rules==&lt;br /&gt;
&lt;br /&gt;
There is NO syntax rules or norms for CSS. During Dolibarr Devcamp 2024/06 (Montpellier) a collective proposition was made to respect classes name from tailwindcss.&lt;br /&gt;
&lt;br /&gt;
The objective is not to include tailwindcss into Dolibarr but to use syntax and classes norms issued from tailwindcss.&lt;br /&gt;
&lt;br /&gt;
See [[migrating to tailwindcss css norms]]&lt;br /&gt;
&lt;br /&gt;
PR: (link to PR to become)&lt;br /&gt;
&lt;br /&gt;
=Dolibarr norms and code skeleton=&lt;br /&gt;
&lt;br /&gt;
==Skeleton code==&lt;br /&gt;
To standardize the code, and to speed up the development of new components in Dolibarr, you&#039;ll find skeletons of files fully prepared in the directory &#039;&#039;&#039;htdocs/modulebuilder/templates/&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
*1 file that serves as an example of the module description: &#039;&#039;&#039;myModule.class.php&#039;&#039;&#039;&lt;br /&gt;
*1 file that serves as an example of code for creating a new class: &#039;&#039;&#039;skeleton_class.class.php&#039;&#039;&#039;&lt;br /&gt;
*1 file that serves as an example of code for creating a new page: &#039;&#039;&#039;skeleton_page.php&#039;&#039;&#039;&lt;br /&gt;
*1 file that serves as an example of code for creating a script for executing command lines: &#039;&#039;&#039;skeleton_script.php&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
Use it as an example.&lt;br /&gt;
Note that the skeletons are also used by the PHP Code generator ([[Module ModuleBuilder]]), which is described in the development chapter of Dolibarr modules, to speed up your development.&lt;br /&gt;
&lt;br /&gt;
==Global variables==&lt;br /&gt;
There is some information or objects that is common and fixed for all the execution of a PHP page and need to be used nearly everywhere in the code. To avoid to propagate everywhere this&lt;br /&gt;
information or objects, they are stored into global variables that you can access everywhere. This global variables are initialized at the begin of each PHP call (into the master.inc.php or master.inc.php or in top of the page). These objects are instantiated only once. The list of available global variables is defined here:&lt;br /&gt;
{{Template:TemplateGlobalVariables}}&lt;br /&gt;
&lt;br /&gt;
*$conf is the object that contains the configuration (saved into database)&lt;br /&gt;
*$user is the object of the current user&lt;br /&gt;
*$mysoc is the object with all information about the current company&lt;br /&gt;
*$langs is the object with the current language&lt;br /&gt;
*$db is the database handler of the current database connexion (inside classes, we should pass it in the constructor and we should get it with $this-&amp;gt;db)&lt;br /&gt;
*$hookmanager is a factory class to manage hooks&lt;br /&gt;
*$extrafields is a factory class to manage extrafields&lt;br /&gt;
&lt;br /&gt;
==Dates and Timezones==&lt;br /&gt;
Dolibarr is an application that is multi-user and multi-location. It&#039;s therefore necessary to store dates in the right format. To avoid problems with conversions, the following rules should be applied:&lt;br /&gt;
&lt;br /&gt;
*A date into memory must always be stored with Timestamp GMT format.&lt;br /&gt;
*A date stored into database, is the GMT Timestamp of date submitted into the request usng the &amp;lt;b&amp;gt;PHP server&amp;lt;/b&amp;gt; timezone. This does not apply to date updated automatically by the database engine (fields &#039;&#039;&#039;tms&#039;&#039;&#039; into database).&lt;br /&gt;
&lt;br /&gt;
For exemple le 1st january 1970, 3 hour at Paris (TZ=+1) = 2 hour at Greenwitch (TZ=0) will be stored into memory with value integer 7200 (2 * 3600s) and will be submitted into a SQL request to database into the string &#039;19700101030000&#039; (PHP convert the int into its TZ hour and database will unconvert it using its timezone too that is same than PHP).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;How to manage this for date with hours:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
So all insert or update methods must convert, during generation of SQL request, the integer memory date into a db string by using db-&amp;gt;idate (you may find examples into skeleton).&lt;br /&gt;
&lt;br /&gt;
And all select methods should translate date fields, coming from the database as a string in TZ of server (here &#039;19700101030000&#039;), into a timestamp field (integer) by calling the method db-&amp;gt;jdate(). So this stores the date into memory as a GTM Timestamp integer. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;How to manage dates with no hours (just day):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
For insert/update, you must convert it with db-&amp;gt;idate(value, &#039;gmt&#039;) so for 0, you will get &#039;19700101000000&#039;.&lt;br /&gt;
&lt;br /&gt;
And all select methods should translate date fields, coming from the database as a string in TZ of server (here &#039;19700101000000&#039;) by using $db-&amp;gt;jdate(..., &#039;gmt&#039;);&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Other cases&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Dates that are updated automatically (field &#039;&#039;&#039;tms&#039;&#039;&#039; into database) contains a GMT Timestamp of the date when the change is done. The select will also use the db-&amp;gt;jdate (that use PHP server TZ) to convert read data into a GMT Timestamp into memory. So if timezone of database differs from timezone of PHP server (one of them is not correctly set), you may experience differences between creation date and update date. Try to never rely on this field in Dolibarr (this autoupdate field is mostly for debug purpose).&lt;br /&gt;
&lt;br /&gt;
*Manipulation date with PHP must be done using the Dolibarr date functions: &#039;&#039;&#039;dol_now(), dol_mktime(), dol_stringtotime(), dol_getdate(), dol_time_plus_duree()&#039;&#039;&#039;. You may also find other functions available into file &#039;&#039;&#039;date.lib.php&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==UTF8/ISO encoding==&lt;br /&gt;
Dolibarr stores data in the following way:&lt;br /&gt;
&lt;br /&gt;
*In database, data is stored in UTF8 or ISO. It depends on the database&#039;s pagecode therefore these options are set at creation time. In any case, Dolibarr&#039;s database driver (in lib/database) deals with it to convert from/to UTF8 at insertion and readout.&lt;br /&gt;
*Memory data is stored in UTF8 (PHP object instances).&lt;br /&gt;
*Web pages are returned and rendered into UTF8&lt;br /&gt;
&lt;br /&gt;
==Float numbers, amount and calculation==&lt;br /&gt;
With PHP, like other languages (Java for exemple), non integer data (float, real, double) are not reliable for calculation.&lt;br /&gt;
Try to make for example &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
print 239.2 - 229.3 - 9.9;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
You wont get zero but a very small decimal number. If you get zero here, you should be able to find other examples that don&#039;t work.&lt;br /&gt;
Problem of float is general, so a variable that is a result of a calculation using decimal numbers must ALWAYS be cleaned using the function &#039;&#039;&#039;price2num()&#039;&#039;&#039; with the second parameter to: &#039;MU&#039;, &#039;MT&#039; or &#039;MS&#039; depending on need (see description of function).&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
If data manipulated is not an amount, then using MU, MT, MS has no sense, and you must use the function &#039;&#039;&#039;round()&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==Creation of tables==&lt;br /&gt;
Do not create tables, on the fly, during execution by a standard user, we mean, during current usage of software.&lt;br /&gt;
If you create a module that uses its own table, not available in the default Dolibarr code, then take a look at tutorial [[Module development]]. It explains how to provide new tables with your module, so that, the tables will be created during module activation and not during module usage.&lt;br /&gt;
&lt;br /&gt;
==Comparing version==&lt;br /&gt;
If your code need to make different things depending on Dolibarr version, you can use the following tip to detect and compare versions&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
But this solution need to include the function versioncompare. An alternative solution to test version is to do:&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Logs==&lt;br /&gt;
Add logs to your code using function&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Working directory==&lt;br /&gt;
If you need to create a working directory for persistent data, into your code, refer to it with &lt;br /&gt;
&#039;&#039;&#039;DOL_DATA_ROOT.&#039;/mymodule&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The directory can be created into your code by the following function:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$mymoduledir=DOL_DATA_ROOT.&#039;/mymodule&#039;;&lt;br /&gt;
dol_mkdir($mymoduledir);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you need a directory to store temporary data, this directory must be &#039;&#039;&#039;DOL_DATA_ROOT.&#039;/mymodule/temp&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=Design patterns and Object programming=&lt;br /&gt;
&lt;br /&gt;
==Creation design patterns (GoF)==&lt;br /&gt;
Design patterns defined by the Gang Of Four (see wikipédia on [[w:Design patterns|Design patterns]]).&lt;br /&gt;
No usage of such patterns is required. We found some objects next to Singletons or Factory but not completely compliant with syntax, this is to be compatible with PHP 4 that is not a pure object language.&lt;br /&gt;
&lt;br /&gt;
==Structure design patterns (GoF)==&lt;br /&gt;
Design patterns defined by the Gang Of Four (see wikipédia on [[w:Design patterns|Design patterns]]). &lt;br /&gt;
No usage of such patterns is required.&lt;br /&gt;
&lt;br /&gt;
==Behavior design patterns (GoF)==&lt;br /&gt;
Design patterns defined by the Gang Of Four (see wikipédia on [[w:Design patterns|Design patterns]]). &lt;br /&gt;
No usage of such patterns is required.&lt;br /&gt;
&lt;br /&gt;
==Design patterns of enterprise (Martin Fowler)==&lt;br /&gt;
&lt;br /&gt;
===Patterns of code organization===&lt;br /&gt;
[[w:Martin Fowler|Martin Fowler]] has identified 3 ways to organize code:&lt;br /&gt;
&lt;br /&gt;
*The &#039;&#039;&#039;Transaction Script&#039;&#039;&#039; (The source code is linear for each user action).&lt;br /&gt;
&lt;br /&gt;
This is the old school used by all procedural languages.&lt;br /&gt;
Inconvenient: Redundancy of code. Need to know the physical model of data to develop.&lt;br /&gt;
&lt;br /&gt;
*The &#039;&#039;&#039;Domain Model&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
This notion is available with object languages. It is business process (to identify before) that are used for objects classes.&lt;br /&gt;
Inconvenient: Model very complex to maintain.&lt;br /&gt;
&lt;br /&gt;
*The &#039;&#039;&#039;Table Module&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
This is a mix between 2 previous where we have only one unique class for each table of database.&lt;br /&gt;
&lt;br /&gt;
-&amp;gt; As shown in code skeletons (see previous chapter), Dolibarr uses concept of &#039;&#039;&#039;Table Module&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
===Communication between business logic - data (ORM)===&lt;br /&gt;
&lt;br /&gt;
There are 3 ways to make links:&lt;br /&gt;
&lt;br /&gt;
*The &#039;&#039;&#039;Table And Row Data Gateway&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
This is the most simple. You have one class per table and each class is a link to the table with CRUD methods (Create, Read, Update, Delete). A class instance is a record in the table. The class contains only code to reach lines and fields of table.&lt;br /&gt;
&lt;br /&gt;
Example: This mode is used by some ORM Frameworks, like &#039;&#039;&#039;iBatis&#039;&#039;&#039; (http://ibatis.apache.org/).&lt;br /&gt;
&lt;br /&gt;
*The &#039;&#039;&#039;Active Record&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Same as previous, but we are allowed to add some business functions into the CRUD class, if such functions are dedicated to manipulate data into this table. &lt;br /&gt;
This pattern is known to be the most productive of the 3, as it is a very good compromise between the &#039;&#039;&#039;Table And Row Data Gateway&#039;&#039;&#039; and the &#039;&#039;&#039;Data Mapper&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Example: This mode is used for Dolibarr development and most PHP software that includes their own framework and best practices.&lt;br /&gt;
&lt;br /&gt;
*The &#039;&#039;&#039;Data Mapper&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Classes represent entities of the problem and not the data. So you have to double, triple ... these classes with Mapper classes to access the data.&lt;br /&gt;
More &amp;quot;purist&amp;quot; on paper (closer of business), this method also has the disadvantage of being more complex in practice.&lt;br /&gt;
&lt;br /&gt;
Example: This is the choice if you use the ORM Framework &#039;&#039;&#039;Propel&#039;&#039;&#039; (https://propelorm.org/). We find this model in heavier applications, based on this ORM among others.&lt;br /&gt;
&lt;br /&gt;
-&amp;gt; For Dolibarr development, the pattern used is the connection mode &#039;&#039;&#039;Active Record&#039;&#039;&#039;, which offers the advantages of a model close to the business without having the complexity, without obfuscating technical architecture. It is by this way that the development, understanding of code and technical maintenance and / or business behavior seems the more productive (this is however an ongoing debate between the purists and the pragmatists, debate in which nobody can really be right, because it depends on the objectives).&lt;br /&gt;
[[Category:Development]]&lt;br /&gt;
&lt;br /&gt;
==Design pattern for Graphic interfaces (MVC)==&lt;br /&gt;
There are several design patterns for user interfaces (MVC, MVP, MVVM).&lt;br /&gt;
Many confuse this design pattern with that of using a template framework. It&#039;s unrelated. A template framework (see previous point) is only linked to the &amp;quot;V&amp;quot; part of these models.&lt;br /&gt;
&lt;br /&gt;
-&amp;gt; Dolibarr uses the &#039;&#039;&#039;MVC&#039;&#039;&#039; Design Pattern (Model - View - Controller). Part M (Model) is materialized by a DAO class containing the CRUD (Create-Read-Update-Delete) methods for accessing the table.&lt;br /&gt;
Many frameworks have chosen to put the C code part (Controller) and the V code part (View) in different files, or even separate directories. The maintenance seems easier on paper, in practice, you have to juggle constantly between a ton of files when your project become larger. In Dolibarr, the separation is made by a simple comment section. The part of code C (Controller) is therefore the code that follow the tag&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;
It is followed by the part of code V (Vue), well separated from the C by the tag&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;
This mode of separation has had a neutral effect on new developments but has made it possible to reduce the time required for maintenance and fixing bugs so significantly that it is not envisaged to switch to another type of separation (yes the findings made in real life are not always those expected by school theory). The important thing remains that there is always a separation between C and V, no matter how this separation is materialized, as long as it is (Reminder: Do not confuse the notion of separation of C and V with the notion of separation of the code to feed the data of a View and of the code to format the View, this a principle of separation relating to the Design Pattern of Vue, see next point).&lt;br /&gt;
&lt;br /&gt;
==Design pattern for Views - Presentation==&lt;br /&gt;
There are frameworks that specialize in Vue Design Pattern, the part of formatting the screen seen by the user.&lt;br /&gt;
Old versions of Dolibarr used Smarty. This framework is an overlay to an already very powerful screen formatting framework called ... PHP. The benefits being much lower than the disadvantages, it has been abandoned in favor of PHP templates (.php files or .tpl.php files) which remain the simplest, the most universal, the most scalable and the most efficient, of the presentation frameworks we tried to use. &lt;br /&gt;
&lt;br /&gt;
Its only flaw is that it cannot guarantee 100% the deviations of a developer who would integrate into the View, a logic unrelated to the presentation (therefore other than code intended for generation, formatting, HTML output , test or loop logic). This point is however controlled by the validation mechanism of the project managers&#039; code.&lt;br /&gt;
&lt;br /&gt;
Here again, it is the experience and the observation of a better productivity performance that has motivated the abandonment of the external Presentation frameworks in favor of the PHP framework.&lt;br /&gt;
&lt;br /&gt;
=Rules to define branch target of a contribution=&lt;br /&gt;
The rules to decide if a contribution (Pull Request) must be pushed into an old maintenance branch or into development are not strict and are often defined by the good sense (pragmastism first). &lt;br /&gt;
We can find help on the graph found on this page [[:Category:RoadMap#Merging_PR_process_.28develop_or_maintenance_.3F.29]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=About composer=&lt;br /&gt;
Composer is a tool to make deployment of PHP packages and dependenciess. Dolibarr is a PHP application that use dependencies that are PHP packages, so we could imagine to use composer to install Dolibarr.&lt;br /&gt;
&lt;br /&gt;
This is not a good idea as it is just technically not possible for the following reasons:&lt;br /&gt;
&lt;br /&gt;
*First, you must understand that composer is a tool &#039;&#039;&#039;to deploy a frozen image of a package&#039;&#039;&#039;. It is a tool to &#039;&#039;&#039;deploy&#039;&#039;&#039;, not a tool to &#039;&#039;&#039;manage dependencies&#039;&#039;&#039; (event if some features exists for that). Dolibarr is an application that has a lot of dependencies, but for each of them, the Dolibarr project has to apply some patches to have the dependencies working correclty (for different reasons, mainly because of bugs or architecture error into original project. See the file &#039;&#039;&#039;dev/dolibarr_changes.txt&#039;&#039;&#039; for full list we have to do on each dependency). Each PHP dependency has at least one change to do to have it working correctly. So the image of a library L that Dolibarr needs is NOT the image provided into the composer package by the L project. After discussion with &#039;&#039;&#039;Nils Adermann&#039;&#039;&#039;, the author of the composer package during the first OSFS congress (https://05f5.com) to get its point of view on this need for large projects, it appears that if a large project is in this situation, the good way to use composer is to build yourself a very large package called &amp;quot;dolibarr&amp;quot; with no composer dependencies and all external libraries embedded into the same composer project so we can deploy all in one composer command, confirming that composer is above all a good &amp;quot;fast deployment system&amp;quot; but a bad &amp;quot;dependency manager&amp;quot;. The dependency system of composer project was simply designed to use an exact version of a library and not to use a patched version of this library. It is even designed to avoid this, making its use not possible in this context.&lt;br /&gt;
*Second point is a different problem with the composer dependencies system: Each dependency on a library has itself a high number of sub-dependency. And all this sub-dependencies have also a high number of dependencies that nobody can&#039;t control (there is always sub-dependencies on the libraries you use that are managed by a lower level dependency project). The result is that when you use composer to install the main library you need, you install (and you can&#039;t avoid it) a ton of other packages you don&#039;t need. For example, Dolibarr is a 80Mb project with all its PHP dependencies. If you install it with composer (we suppose that the first point is not a problem), then the project reach the size of 300 Mb. Size of project is multiplicated by 3.5 with no reason. Not sobriety compliant.&lt;br /&gt;
*Third point is also problems with the dependency system: When you install an external library this library has dependency and each of this depency of depencies are constraints with each other and with PHP version. Imagine the required library L1 is compatible with PHP x to x+n and the library L2 is compatible with PHP y to y+m, etc... To have an application working correctly, you must find a PHP version that will be common to all the required packages, so here inside the intersection of the two ranges [x - x+n] and [y - y+m]. But when you are using a large number of high level libraries, it means you are depending on a very large number of low level libraries (because each high level libraries has a lot of medium level libraries as dependencies that has a high number of low level dependencies). And when this number is very large, the number of different required ranges become so large that you reach a situation where the number of PHP versions that are common to all of them (hte intersection of all ranges) is very low, and even does not exists at all (there is no combination of version that is compatible with ALL packages you need because each sub-project depreciate its PHP version in its own roadmap without taking care of which child or parent dependency use it). But Dolibarr must works for everybody, whatever is other project roadmaps, and on the &amp;quot;as large as possible&amp;quot; number of PHP versions and not just on one or two given major version of PHP. Compatibiliy must also be guaranted during a very long term (an ERP is not a software we can change every year), when low level libraries are changing requirement very often.&lt;br /&gt;
*Last point is about security: As we view in the second point, when using composer, a very high number of PHP files are installed even if you don&#039;t need them. Dolibarr is a critical application that need a very strict security policy. Requirement for security is at a high level (See our page [[Security_information]]). When using composer, you install a lot of files and small sub-project and sub-project of sub-projects where security is not considered as important than what we need on the Dolibarr project. If we make an analysis on a given period, the number of vulnerability reported on the whole project Dolibarr + files of external libraries when installed by composer (that we mostly don&#039;t need) is multiplicated by 20 compared to the number of vulnerabilities that are reported only in the scope of Dolibarr + external libraries when they are embedded manually with the minimal number of files we need). Such an increase is simply not possible, and give a very bad mesage on security   point of view: &amp;quot; yes we reduce 95% of known security vulnerabilities but we don&#039;t do it because we are using composer&amp;quot;. Some companies (due to a strict security requirements of their business, like secnum or iso requirement) would simply not be allowed to use Dolibarr if we accept these.&lt;br /&gt;
&lt;br /&gt;
As we can see, composer, even if it was largely adopted by a lot of small projects, is far away from the state of the art. For all this reasons, it is just not possible to use composer so we keep the composer.json file in the project so we can use it for some development tests or make upgrade tests of some libraries with it, but we have renamed it by adding the extension &amp;quot;.disabled&amp;quot; to be sure that end users won&#039;t try to install or update their Dolibarr with it, in which case, the application will become  unstable (remind point 1) and unsecured (remind point 4)&lt;/div&gt;</summary>
		<author><name>Eldy</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Language_and_development_rules&amp;diff=68018</id>
		<title>Language and development rules</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Language_and_development_rules&amp;diff=68018"/>
		<updated>2026-10-13T02:11:54Z</updated>

		<summary type="html">&lt;p&gt;Eldy: /* PHP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN origin interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- You can edit this section but do NOT remove these comments&lt;br /&gt;
     Links below will be automatically replicated on translated pages by PolyglotBot --&amp;gt;&lt;br /&gt;
[[de:Sprachen_und_Programmierregeln]]&lt;br /&gt;
[[fr:Langages_et_normes]]&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;
{{TemplateDocDevEn}}&lt;br /&gt;
&lt;br /&gt;
These are some rules on language, syntax and norm we use in the Dolibarr project:&lt;br /&gt;
&lt;br /&gt;
=Versions=&lt;br /&gt;
&lt;br /&gt;
*Current version of Dolibarr must work on:&lt;br /&gt;
&lt;br /&gt;
#All OS (Windows, Linux, MACOS...)&lt;br /&gt;
#PHP {{PHPMinVersion}} (Must work with no need of complementary PHP module, except module to PHP module to access database). See [[List of releases, change log and compatibilities]] for pre-requisites for older versions.&lt;br /&gt;
#MySQL {{MySqlMinVersion}}&lt;br /&gt;
&lt;br /&gt;
=Copyright Norms=&lt;br /&gt;
&lt;br /&gt;
*All PHP files must start with a header that looks like&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
When you edit an existing file of project, you must add a Copyright line under others.&lt;br /&gt;
&lt;br /&gt;
=PHP Norms=&lt;br /&gt;
==PHP==&lt;br /&gt;
&lt;br /&gt;
*Dolibarr is written with PHP and supports all versions of PHP higher than {{PHPMinVersion}}. All files must end with extension .php&lt;br /&gt;
&lt;br /&gt;
*Usage of PHP superglobals variables must use the dedicated operators $_COOKIE, $_SERVER, $_ENV but use the Dolibarr functions [[Fonctions utiles Dolibarr|GETPOST...()]] to get the contents of $_GET or $_POST..&lt;br /&gt;
&lt;br /&gt;
*Other operators ($HTTP_SERVER_GET, ...) are now deprecated in PHP, so they must not be used. Code must work if option &#039;&#039;&#039;register_long_arrays&#039;&#039;&#039; is set to off. Moreover, the code must work when PHP option &#039;&#039;&#039;register_globals&#039;&#039;&#039; is off (recommended by PHP). It must also work  if the option &#039;&#039;&#039;register_globals&#039;&#039;&#039; is on (by default on a lot of installations).&lt;br /&gt;
&lt;br /&gt;
*Do not use &#039;&#039;&#039;&amp;lt;s&amp;gt;PHP_SELF&amp;lt;/s&amp;gt;&#039;&#039;&#039;. Use instead &#039;&#039;&#039;$_SERVER[&amp;quot;PHP_SELF&amp;quot;]&#039;&#039;&#039;. Also, Dolibarr framework sanitizes content of $_SERVER[&amp;quot;PHP_SELF&amp;quot;] variable (into main.inc.php file, before any business code).&lt;br /&gt;
&lt;br /&gt;
*When several variables must be initialized with the same value, you must use individual declarations (separated by ;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$var1 = 1;&lt;br /&gt;
$var2 = 1;&lt;br /&gt;
$var3 = 1;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
instead of&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$var1 = $var2 = $var3 = 1;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
which is slower.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Strings====&lt;br /&gt;
&lt;br /&gt;
*Strings must be have variables outside of the quote.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
print &amp;quot;My text show my &amp;quot;.$variable.&amp;quot; !\n&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Closure or anonymous function====&lt;br /&gt;
If you new a function, just create a real one (or a method).&lt;br /&gt;
Anonymous function are just forbidden (existing one should be removed), they brings a lot of problem:&lt;br /&gt;
* Code readability&lt;br /&gt;
* Broken static analytics tools that can&#039;t guess type or path of variable&lt;br /&gt;
* Function documentation&lt;br /&gt;
* AI become crazy&lt;br /&gt;
* Coding debug trouble&lt;br /&gt;
* Impact analysis more difficult as the stack trace of code can&#039;t be guess easily when function are not named explicitely. &lt;br /&gt;
&lt;br /&gt;
====Comments====&lt;br /&gt;
&lt;br /&gt;
*Comments must use the C syntax, ie a double slash for a comment on one line and a slash-star to open a bloc for several lines&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
/* Bloc of comment&lt;br /&gt;
 *&lt;br /&gt;
 * End of 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;
    // comment on one line&lt;br /&gt;
    print $i;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function myFunction($param1, $param2)&lt;br /&gt;
{&lt;br /&gt;
    // code&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Functions must return a value equal or higher than 0 if successful and strictly lower than 0 if error.&lt;br /&gt;
&lt;br /&gt;
*No dead code (code never used) into Dolibarr core code (code used by external modules only must be included within the external modules).&lt;br /&gt;
&lt;br /&gt;
*Use &amp;quot;include_once&amp;quot; for anything with functions or class definitions in it (like *.class.php and *.lib.php files), use &amp;quot;include&amp;quot; for template-style php with files containing common part of HTML and PHP code (like *.inc.php and *.tpl.php files).&lt;br /&gt;
&lt;br /&gt;
*Coding style to use is the &#039;&#039;&#039;PSR-12&#039;&#039;&#039; (https://www.php-fig.org/psr/psr-12/). Only rules tagged &amp;quot;MUST&amp;quot; are currently required. So note however the exceptions:&lt;br /&gt;
**Length of line: PSR-12 mention we can&#039;t go up to 120 characters on same line, this is a soft limit. It is better to have long lines instead of long page with code content that is just data declaration and does not contain any logic. However, we introduced a hard limit of &#039;&#039;&#039;1000&#039;&#039;&#039; characters (having line larger than this may return errors on Continuous Integration tests).&lt;br /&gt;
**Tabs are allowed: The other exception is that we don&#039;t replace systematically the tabs with spaces. Using tabs is more convenient for most editors/developers. Also using spaces breaks some auto-format features (like Eclipse autoformat feature on some Eclipse version). For the moment, the best setup is &amp;quot;Keep spaces/tabs as it is&amp;quot;, however, you can activate the option &amp;quot;Remove spaces at end of lines&amp;quot;.&lt;br /&gt;
**We allow elements of an array on same line and we do not always add a new line at end of each element.&lt;br /&gt;
**Note 1: The following rule are very important to follow:&lt;br /&gt;
***Files must be saved with Unix format (LF) and not Windows (CR/LF). Unix format is compatible on all OS such as Unix like, Windows, Mac, but the Windows text file format may not work on some PHP under Unix.&lt;br /&gt;
***Smart tags PHP must not be used. PHP code section must start with &#039;&#039;&#039;&amp;lt;?php&#039;&#039;&#039; (the &amp;quot;smart tags&amp;quot; &amp;lt;? or &amp;lt;?=, also known as the &amp;quot;short tags&amp;quot;, depend on php configuration option &#039;&#039;&#039;short_open_tag&#039;&#039;&#039;, even if this is no more true after php5.4. The use of &amp;lt;? can still have conflict with XML syntax. The smartags may not be supported by all IDE. Also, the use of &amp;lt;?= make easier for a hacker to make PHP injection. To fight this, some Dolibarr components, like the website PHP editor, accepts only full php tags to detect, parse and filter PHP. Finaly, using the same tag everywhere make also easier to make code scanning or impact analysis when we are sure of the tags that is used, and the best solution, to be sure of which tag is used, is to use one, only one and the same tag everywhere.&lt;br /&gt;
**Note 2: You can use the file &#039;&#039;&#039;dev/setup/codesniffer/ruleset.xml&#039;&#039;&#039; as rule file to control coding style with PHPCodeSniffer.&lt;br /&gt;
**Note 3: You can use the file &#039;&#039;&#039;dev/setup/eclipse/PSR-12 [built-in].xml&#039;&#039;&#039; as rule file to setup Eclipse syntax formater.&lt;br /&gt;
**Note 4: You may note that current code is not yet compliant with the PSR-12. The reason is that we must &amp;quot;now&amp;quot; follow the &amp;quot;MUST&amp;quot; rules of PSR-12, but it wasn&#039;t in the past. So feel free to change coding style to match new rules (keep in mind the 2 exceptions) if you find such cases.&lt;br /&gt;
&lt;br /&gt;
==Classes and properties structures==&lt;br /&gt;
&lt;br /&gt;
Some properties of classes are found in different classes. To avoid having different names, we will use the following PHP properties names:&lt;br /&gt;
&lt;br /&gt;
{{TemplatePHPFields}}&lt;br /&gt;
&lt;br /&gt;
=SQL and Database rules=&lt;br /&gt;
&lt;br /&gt;
==DDL file format==&lt;br /&gt;
Files containing definition of the database structure (DDL files) must be &#039;&#039;&#039;2 per table&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
*The first file defines the table and its fields. The file name contains the table name, e.g. like this: &amp;lt;tt&amp;gt;llx_&#039;&#039;mytable&#039;&#039;.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A comment will be added for each field to explain its usage.&lt;br /&gt;
&lt;br /&gt;
*The second file defines all foreign keys, performance indexes or other constraints and the file name will be like: &amp;lt;tt&amp;gt;llx_&#039;&#039;mytable&#039;&#039;.key.sql&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These files must be stored in the directory &#039;&#039;&#039;install/mysql/tables&#039;&#039;&#039; for all standard files or &#039;&#039;&#039;mymodule/tables&#039;&#039;&#039; for tables provided by an external module.&lt;br /&gt;
&lt;br /&gt;
Example: &#039;&#039;&#039;file for creating the table llx_mytable will be llx_mytable.sql&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- ===========================================================================&lt;br /&gt;
-- Copyright (C) 2013 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 3 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_mytable&lt;br /&gt;
(&lt;br /&gt;
  rowid       integer NOT NULL AUTO_INCREMENT PRIMARY KEY,&lt;br /&gt;
  ref	      varchar(30)       NOT NULL,		-- object reference number&lt;br /&gt;
  entity      integer DEFAULT 1 NOT NULL,	        -- multi company id&lt;br /&gt;
  ref_ext     varchar(255),-- reference into an external system (not used by dolibarr)&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;
  datec       timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,,   -- creation datetime&lt;br /&gt;
  tms         timestamp,    -- update time stamp&lt;br /&gt;
  fk_user_author integer NOT NULL,                     -- Author, foreign key of llx_user&lt;br /&gt;
  fk_user_mod    integer NOT NULL,                      -- Last updater, foreign key of llx_user&lt;br /&gt;
  import_key	varchar(14)                -- Use by import process&lt;br /&gt;
)type=innodb;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example: &#039;&#039;&#039;file for creating keys/indexes for the table llx_mytable will be llx_mytable.key.sql&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- ===========================================================================&lt;br /&gt;
-- Copyright (C) 2013 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 3 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_mytable ADD UNIQUE uk_mytable_field (field_one, field_two);&lt;br /&gt;
&lt;br /&gt;
ALTER TABLE llx_mytable ADD CONSTRAINT fk_mytable_fk_field FOREIGN KEY (fk_field) REFERENCES llx_matablepere (rowid);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Table and fields structures==&lt;br /&gt;
&lt;br /&gt;
*Structure of tables.&lt;br /&gt;
&lt;br /&gt;
When you create a new table, it is recommended to use the same conventions as other Dolibarr tables. This means the following fields:&lt;br /&gt;
 - rowid INTEGER AUTO_INCREMENT PRIMARY KEY    that is technical id of record&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                   that will contain date of last modification (the database manages this field automatically, no need to manage it by the code, just create the field)&lt;br /&gt;
 - date_valid      datetime                    that is the validation date (if applicable)&lt;br /&gt;
 - import_key      varchar(32)                 that will contain the import code YYYYMMDDHHMMSS if you make mass import&lt;br /&gt;
 - status          smallint                    to store a status&lt;br /&gt;
Optional&lt;br /&gt;
 - fk_user_creat or fk_user_author integer that is the id of user making creation&lt;br /&gt;
 - fk_user_modif integer that is the id of user making change&lt;br /&gt;
 - fk_user_valid integer that is the id of user validating record (if applicable)&lt;br /&gt;
 - fk_soc integer that is the ID of the Third party (if applicable)&lt;br /&gt;
&lt;br /&gt;
Note field:&lt;br /&gt;
 - note_private text for private comment of the object&lt;br /&gt;
 - note_public text for public comment of the object&lt;br /&gt;
or &lt;br /&gt;
 - note text if there is no need to have private and public&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Type of fields:&lt;br /&gt;
&lt;br /&gt;
To be compatible with any accuracy required by any country on amounts, to be compatible with any database syntax and with the Dolibarr upgrade framework, we will use the following types for database fields:&lt;br /&gt;
&lt;br /&gt;
 - integer for a primary key, an integer or any of foreign key (bigint may also be accepted for very large tables)&lt;br /&gt;
 - smallint for a small number (like for a status) or a boolean&lt;br /&gt;
 - double(24,8) for any amount&lt;br /&gt;
 - double(6,3) for any vat rate&lt;br /&gt;
 - real for a quantity&lt;br /&gt;
 - varchar for a string (also if length is 1, the type char is more and more deprecated)&lt;br /&gt;
 - timestamp for a field date+time that is automatically updated&lt;br /&gt;
 - datetime for a field date+time&lt;br /&gt;
 - date for a field date&lt;br /&gt;
 - text or medium text for large fields (no index allowed on such fields)&lt;br /&gt;
&lt;br /&gt;
All business rules must be in the same place, in PHP code, not in the client or the database, that&#039;s why type enum is also not allowed.&lt;br /&gt;
Other types are not allowed for compatibility reasons. &lt;br /&gt;
&lt;br /&gt;
*All tables have a prefix to avoid name conflicts with other projects. In the current version this prefix is fixed and can&#039;t be modified. Its value is &amp;lt;tt&amp;gt;llx_&amp;lt;/tt&amp;gt;. In a future version this value should be modified during installation process.&lt;br /&gt;
&lt;br /&gt;
==Primary keys==&lt;br /&gt;
The primary key of a table must be called &amp;lt;tt&amp;gt;rowid&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Some old tables do not use this rule and use a primary key called &amp;lt;tt&amp;gt;id&amp;lt;/tt&amp;gt; (e.g. [[Table llx_c_actioncomm]]). The reason is historical and this should not happen anymore.&lt;br /&gt;
&lt;br /&gt;
==Foreign keys==&lt;br /&gt;
The name of a foreign key must start with the prefix &amp;lt;tt&amp;gt;fk_&amp;lt;/tt&amp;gt; followed by the table name (i.e. name of the referencing table) (this is required to avoid duplicate names in project that are not allowed even if in different tables by some DBMS like Postgresql) then the field name (i.e. name of the referencing field) (this is to allow to have several foreign keys in same table).&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&#039;&#039;fk_facture_fourn_fk_soc&#039;&#039;  is a foreign key in the table llx_facture_fourn for the field fk_soc in this table (that references the rowid field in another table)&lt;br /&gt;
&lt;br /&gt;
Note when using a foreing key:&lt;br /&gt;
- Do not add a hard foreign key (a foreign key controled bydatabase) when the link is not important. This generates more trouble than solution. For exemple, a link to a user table to follow the author of creation of an object is NOT an important link. If parent object,the user, is deleted,the child record will be orphelin but this is not a problem. Record will appear with a cretion author that is &amp;quot;unknown&amp;quot; and that is the truth if we have deleted the parent user.&lt;br /&gt;
&lt;br /&gt;
- If you develop your own external module, it must have no hard foreign keys that point to Dolibarr standard tables. This will break standard dolibarr upgrades, repair, backup and restore tools and may also break standard features. Foreign keys must be soft foreign keys so managed by the code with no database contraints.&lt;br /&gt;
&lt;br /&gt;
==Alternative keys==&lt;br /&gt;
Sometimes, we need other unique keys than primary key. When we need this, we can create an alternate unique key. Such a key should have a name that starts with &amp;lt;tt&amp;gt;uk_&amp;lt;/tt&amp;gt;, then the table name (this is required to avoid duplicate names of unique keys that may create problems for some DBMS like Postgresql) and then another string to define the key (this is to allow having several unique keys on the same table).&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&#039;&#039;uk_societe_code_client&#039;&#039; is a unique key on table llx_societe on field code_client.&lt;br /&gt;
&lt;br /&gt;
==Index performance==&lt;br /&gt;
Some fields are often used as search or order criteria, or for joins. In such case, we need to set a performance index on field to increase performances. Such indexes are named with a prefix &amp;lt;tt&amp;gt;idx_&amp;lt;/tt&amp;gt; then the table name and then the field name.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&#039;&#039;idx_societe_user_creat&#039;&#039; is a performance index on table llx_societe for field user_creat&lt;br /&gt;
&lt;br /&gt;
==Denormalized field==&lt;br /&gt;
Fields that store a data that is result of calculation of other data already stored is a &amp;quot;denormalized field&amp;quot;. It must be avoid if we can, and must be used only for performance purpose.&lt;br /&gt;
In such a case, to allow developper to understand that the data is not the value that rule, we must prefix the nameof fiel with &#039;&#039;&#039;&amp;quot;denormalized_&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
For example the field &amp;quot;denormalized_lower_planned_end_date&amp;quot; to store the ending date of the last membership of a member. We already have the information, but doing search or filter on it is difficult as it is stored into another table into another level, so we can duplicate the information into a such field.&lt;br /&gt;
&lt;br /&gt;
If this happen, we must :&lt;br /&gt;
* check the any import profile has a function to update the denormalized value during import.&lt;br /&gt;
* have a task in the repair.php to recalculate the value and align the data with the original source.&lt;br /&gt;
* into the crud method that update any data that impact the field, we must include the update or the denormalized value.&lt;br /&gt;
&lt;br /&gt;
==SQL Coding rules==&lt;br /&gt;
&lt;br /&gt;
*Alias usage/Fields naming&lt;br /&gt;
&lt;br /&gt;
When doing select, we can use alias to simplify writing/reading of requests:&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
However, we must not used alias for update request as they are not compatible with Mysql 3.1.&lt;br /&gt;
&lt;br /&gt;
*Using SELECT * is forbidden ! When using SELECT you must define complete list of fields to get. This avoids confusion. And above all, this make reengeering of code easier and make impact analysis of change on a field possible. Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Into SQL requests, you must quote fields except the fields that contain amounts which must be stored as double or real type. Quotes on numbers may result in saving as a different value. For example 412.62 in an insert will be saved as value 412.61999512 into database (due to implicit conversion string to numeric) if the target field has type double(24,8). Only PHP see value 412.61999512. Other tools will see 412.62 letting think that there is no problem. But it&#039;s PHP that has the good vision. There is really a wrong value into database. By removing quotes on numbers, no problem occurs.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
Good:     INSERT INTO table_1 (field_txt, field_num) VALUES (&#039;txt&#039;, 412.62)&lt;br /&gt;
Bad:      INSERT INTO table_1 (field_txt, field_num) VALUES (&#039;txt&#039;, &#039;412.62&#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note, the problem of float numbers is the same on all languages and not only when inserting data into database. It occurs also with any language when you work on &amp;quot;real&amp;quot; numbers, so numbers must be, as soon as they are affected into variable, cleaned with function price2num with second parameter defined to&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;:&lt;br /&gt;
&#039;MU&#039; (for unit prices), &#039;MT&#039; (for total prices) or &#039;MS&#039; (otherwise) depending on usage of number. (see function documentation)&lt;br /&gt;
&lt;br /&gt;
*SQL Date functions NOW, SYSDATE, DATEDIFF or DATE are forbidden inside SQL requests. Other functions like (MONTH, YEAR) must also be avoided if possible. If you must use the current date into a field, value must come from the PHP and not from the database engine. This is for 3 reasons:&lt;br /&gt;
**better portability of code&lt;br /&gt;
**better management of TimeZone (reference timezone is the PHP timezone and timezone of database may differs so all dates functions must be on PHP side).&lt;br /&gt;
**better performance (see example and final comment)&lt;br /&gt;
&lt;br /&gt;
For example, don&#039;t do:&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
but do:&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example, don&#039;t do:&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
but do:&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An other advantage of this rule, is that request benefits of index because we are making a compare of a field with a fixed value. When using datediff, you make an operation on field before comparison, this means database can&#039;t use the index on field, resulting on very bad performance compared to solution without the datediff.&lt;br /&gt;
&lt;br /&gt;
*The statement WITH ROLLUP is prohibited:&lt;br /&gt;
&lt;br /&gt;
This statement should not be used: it is not handled the same way by different databases.&lt;br /&gt;
Also, using WITH ROLLUP breaks the purity of the returned data. The intermediate subtotal generation aggregation performed by this statement can easily be done using PHP and helps keep the returned data array clean (not corrupted by artificially inserted data).&lt;br /&gt;
&lt;br /&gt;
*The sql function GROUP_CONCAT can&#039;t be used. It is not portable and ask the database to make subrequests for line into main table, this can be done easier by doing a subrequest inside the PHP loop when building the output of each line.&lt;br /&gt;
&lt;br /&gt;
*Use $db-&amp;gt;ifsql for SQL IF&lt;br /&gt;
&lt;br /&gt;
Do not include the IF into your forged SQL request. But use instead $db-&amp;gt;ifsql() method to you will make a SQL IF that is compatible with all SQL databases.&lt;br /&gt;
&lt;br /&gt;
*No DELETE CASCADE and ON UPDATE CASCADE&lt;br /&gt;
&lt;br /&gt;
Such SQL instructions are forbidden because they bypass the business rules of the application bringing a lot of troubles out of control of the developers. For example, if there is a delete cascade between table A and B, when the application will execute the code to remove a record in A, the children into table B will also be removed (this is the goal). But if there was a Dolibarr PHP trigger (for example provided by an external module) on the deletion of record of B (for example to validate the deletion or to execute a complementary action), the DELETE CASCADE will be executed without having the Dolibarr PHP trigger on B deletion executed, missing the validation or actions of the PHP trigger of the module. All business rules must be implemented on the same side (so the server PHP side), this is the reason why business rules implemented on Database side (like with delete cascade) are not allowed (same conclusion than the next point about Database triggers).&lt;br /&gt;
Note that an external module can use them for links between Dolibarr tables and its module tables but a better recommended solution is to use the trigger to implement the deletion of its tables when a record of a parent official table is deleted.&lt;br /&gt;
&lt;br /&gt;
==Using Database triggers / stored procedures==&lt;br /&gt;
Using Database triggers is not allowed into the code of Dolibarr, so you should have no troubles with Database triggers. &lt;br /&gt;
&lt;br /&gt;
*Database triggers are not portable. Compatibility may be broken when upgrading your version of your database&lt;br /&gt;
*Database triggers are often forgotten into backup tools&lt;br /&gt;
*Database triggers need special permissions that you may not have (and should not have) on a common secured database&lt;br /&gt;
*Database triggers means also that you include some &amp;quot;business rules&amp;quot; of your application into the database where most other rules are managed by the code itself (this can create conflict or code that can&#039;t be debugged with a step by step debugger)&lt;br /&gt;
*Database triggers execute code using the timezone, the default language of the database instead of the reference timezone of the application that may be different (generating offset into database) and the default language setup in application ...&lt;br /&gt;
*There is tons of other reasons why we do not recommend to use database triggers in your own development.&lt;br /&gt;
&lt;br /&gt;
Using Database triggers can save you time when you make development but is a very bad practice when quality, portability, security and sustainability are priority, so it is forbidden as it is not compatible with the high level of quality of code expected by Dolibarr team. External modules that uses Database triggers may also be refused on the market place since it won&#039;t work for more than 50% of users.&lt;br /&gt;
&lt;br /&gt;
==Basic Migration Rules==&lt;br /&gt;
&lt;br /&gt;
*Structure migration scripts are files of the type &#039;&#039;&#039;install/mysql/migration/a.b.c-x.y.z.sql&#039;&#039;&#039;. In a migration file from version n to n+1, a table that is no longer used in n+1 is only dropped (DROP TABLE) during the migration from version n+1 to n+2. This is to ensure that obsolete tables are always kept for the duration of a version to correct any issues in case of a migration error.&lt;br /&gt;
&lt;br /&gt;
==MySQL-MariaDB specificity==&lt;br /&gt;
&lt;br /&gt;
*Tables must be declared with format InnoDB.&lt;br /&gt;
&lt;br /&gt;
This format supports foreign keys and their restrictions, and transactions integrity is also supported. This guarantees that Dolibarr events keep all data with correct values between tables even when transaction modify different tables.&lt;br /&gt;
&lt;br /&gt;
*Dolibarr MUST work even if MySQL option &#039;&#039;&#039;strict&#039;&#039;&#039; is active.&lt;br /&gt;
&lt;br /&gt;
To activate it (required when developing on Dolibarr), add the following line into the config file of your MySQL server (my.cnf or my.ini)&lt;br /&gt;
{{MySqlStrictMode}}&lt;br /&gt;
&lt;br /&gt;
==PostgreSQL specificities==&lt;br /&gt;
Only MySQL files must be maintained.&lt;br /&gt;
Those files are converted &amp;quot;on the fly&amp;quot; by the database Dolibarr driver into the targeted database system.&lt;br /&gt;
&lt;br /&gt;
There is an exception for the SQL &amp;quot;UPDATE FROM&amp;quot; of Postgres: &lt;br /&gt;
&lt;br /&gt;
MySQL Syntax:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
UPDATE table_target as target, table_source as source SET fieldtarget=source.fieldsource&lt;br /&gt;
WHERE source.rowid=target.rowid;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PgSQL Syntax:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
UPDATE table_target as target SET fieldtarget=source.fieldsource&lt;br /&gt;
FROM table_source as source WHERE source.rowid=target.rowid;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There is no native SQL requests &amp;quot;UPDATE FROM&amp;quot; in all Dolibarr core (only simple &amp;quot;UPDATE&amp;quot;) so this difference of syntax is not a problem. But if you need to use one in your own code of your module, you should do&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight 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_target 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_target 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=HTML norms=&lt;br /&gt;
==Syntax rules==&lt;br /&gt;
&lt;br /&gt;
*HTML used must be HTML compliant and not XHTML. All attributes of HTML tags must be in lower case and quoted with &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
*Links href must be absolute and use the function dol_buildpath() to get absolute path from a relative path and img tag must be build using function img_picto().&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
print &#039;&amp;lt;a href=&amp;quot;&#039;.dol_buildpath(&#039;/mydir/mypage.php&#039;).&#039;&amp;quot;&amp;gt;&#039;.img_picto(&#039;Texte alt&#039;,&#039;namepictopng&#039;,&#039;&#039;).&#039;&amp;lt;/a&amp;gt;&#039;;&#039;&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*HTML tables must have columns with no forced width, except for columns that contains data we know the length. For example, a column with a picto only can be forced to with=&amp;quot;20px&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Otherwise, we must avoid forcing the column width. Reason is that, in most cases, the browser make a better works to define column width automatically than forced values, and it works whatever is the resolution.&lt;br /&gt;
&lt;br /&gt;
*Javascript/ajax code and call to javascript files into php pages must be avoided. However, if you need to include javascript code, you must add a condition on &amp;quot;$conf-&amp;gt;use_javascript_ajax&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
if ($conf-&amp;gt;use_javascript_ajax) {&lt;br /&gt;
...  // php code generating javascript here&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Popup windows must not be used, except for tooltips (and must have a condition as explained before).&lt;br /&gt;
&lt;br /&gt;
*External scripts must be written in Perl if they can&#039;t be written in PHP. Usage of another language is not forbidden but must be argued before in the development mailing-list.&lt;br /&gt;
&lt;br /&gt;
==External template framework ?==&lt;br /&gt;
There is ton of frameworks to provide a template language of an HTML page (smarty, twig, ...). The best and faster one we know is just called &amp;quot;PHP&amp;quot;, and because Dolibarr already depends on PHP, using another framework may introduce a dependency on a third language to make templates.&lt;br /&gt;
&lt;br /&gt;
We must remind that template frameworks are just pre-processor, BEFORE PHP. They can&#039;t be faster than PHP alone. When we say &amp;quot;speed is increased because template framework use a cache&amp;quot;, you must read in fact &amp;quot;the overtime spent by the framework is reduced by cache, not the speed of processing a PHP template file&amp;quot;. We should say &amp;quot;any template framework has an overload over PHP, the cache of the template framework just reduces the slowing effect of using this framework&amp;quot;, but not &amp;quot;the speed is increased, it is always decreased compared to pure PHP&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Above all, having a template system is completely possible by doing a &amp;quot;&#039;&#039;&#039;.tpl.php&#039;&#039;&#039;&amp;quot; file that dos not contains any logic code, but only HTML and print of variables. We get same result (but faster and easier to develop because it does not need to do all the setXXX before calling each template). All variables (known by code that include the template) are automatically known into a PHP template page. No risk to forget a set, and a lot of line of codes reduced, a lot of time and development errors are also saved.&lt;br /&gt;
&lt;br /&gt;
But an external template system can keep a guarantee of 100% of isolation between code and HTML output. Yes, but this is interesting in only 1 situation: When teams building design is completely different than team building logic code, AND if you build not too sophisticated pages, AND with no need of too many Ajax features (this need to know how code works).&lt;br /&gt;
And this situation is surely not the Dolibarr future (team are often be same, Ajax will be more and more present, even if we hope not &amp;quot;too much&amp;quot;, and screens are more and more dependent of dynamic or contextual events, difficult to have this with one simple template without transforming the template into a page with high level of code). Also design is more and more managed now in CSS side instead of PHP side.&lt;br /&gt;
&lt;br /&gt;
In the past, Dolibarr has experimented a template system like Smarty. If on the paper the idea was good, we quickly realized that finding a bug become a headache, coding become a treasure hunt, maintenance and development were done so slower (compared to previous situation where output templates are into the &amp;quot;View&amp;quot; section of each PHP file) that we forgot this idea. Pragmatism won.&lt;br /&gt;
&lt;br /&gt;
There is a ton of other reasons to not use an external template system and all arguments to use them are also the best argument to use HTML/PHP as our template system. We just ask to keep separation between &#039;&#039;&#039;Controllers&#039;&#039;&#039; (the first section of PHP pages juste after the &amp;quot;/* Action&amp;quot; line), and the &#039;&#039;&#039;Views&#039;&#039;&#039;, the second section after the &amp;quot;/* View&amp;quot; comment that is the presentation section build with PHP).&lt;br /&gt;
&lt;br /&gt;
=CSS norms=&lt;br /&gt;
&lt;br /&gt;
==Syntax rules==&lt;br /&gt;
&lt;br /&gt;
There is NO syntax rules or norms for CSS. During Dolibarr Devcamp 2024/06 (Montpellier) a collective proposition was made to respect classes name from tailwindcss.&lt;br /&gt;
&lt;br /&gt;
The objective is not to include tailwindcss into Dolibarr but to use syntax and classes norms issued from tailwindcss.&lt;br /&gt;
&lt;br /&gt;
See [[migrating to tailwindcss css norms]]&lt;br /&gt;
&lt;br /&gt;
PR: (link to PR to become)&lt;br /&gt;
&lt;br /&gt;
=Dolibarr norms and code skeleton=&lt;br /&gt;
&lt;br /&gt;
==Skeleton code==&lt;br /&gt;
To standardize the code, and to speed up the development of new components in Dolibarr, you&#039;ll find skeletons of files fully prepared in the directory &#039;&#039;&#039;htdocs/modulebuilder/templates/&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
*1 file that serves as an example of the module description: &#039;&#039;&#039;myModule.class.php&#039;&#039;&#039;&lt;br /&gt;
*1 file that serves as an example of code for creating a new class: &#039;&#039;&#039;skeleton_class.class.php&#039;&#039;&#039;&lt;br /&gt;
*1 file that serves as an example of code for creating a new page: &#039;&#039;&#039;skeleton_page.php&#039;&#039;&#039;&lt;br /&gt;
*1 file that serves as an example of code for creating a script for executing command lines: &#039;&#039;&#039;skeleton_script.php&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
Use it as an example.&lt;br /&gt;
Note that the skeletons are also used by the PHP Code generator ([[Module ModuleBuilder]]), which is described in the development chapter of Dolibarr modules, to speed up your development.&lt;br /&gt;
&lt;br /&gt;
==Global variables==&lt;br /&gt;
There is some information or objects that is common and fixed for all the execution of a PHP page and need to be used nearly everywhere in the code. To avoid to propagate everywhere this&lt;br /&gt;
information or objects, they are stored into global variables that you can access everywhere. This global variables are initialized at the begin of each PHP call (into the master.inc.php or master.inc.php or in top of the page). These objects are instantiated only once. The list of available global variables is defined here:&lt;br /&gt;
{{Template:TemplateGlobalVariables}}&lt;br /&gt;
&lt;br /&gt;
*$conf is the object that contains the configuration (saved into database)&lt;br /&gt;
*$user is the object of the current user&lt;br /&gt;
*$mysoc is the object with all information about the current company&lt;br /&gt;
*$langs is the object with the current language&lt;br /&gt;
*$db is the database handler of the current database connexion (inside classes, we should pass it in the constructor and we should get it with $this-&amp;gt;db)&lt;br /&gt;
*$hookmanager is a factory class to manage hooks&lt;br /&gt;
*$extrafields is a factory class to manage extrafields&lt;br /&gt;
&lt;br /&gt;
==Dates and Timezones==&lt;br /&gt;
Dolibarr is an application that is multi-user and multi-location. It&#039;s therefore necessary to store dates in the right format. To avoid problems with conversions, the following rules should be applied:&lt;br /&gt;
&lt;br /&gt;
*A date into memory must always be stored with Timestamp GMT format.&lt;br /&gt;
*A date stored into database, is the GMT Timestamp of date submitted into the request usng the &amp;lt;b&amp;gt;PHP server&amp;lt;/b&amp;gt; timezone. This does not apply to date updated automatically by the database engine (fields &#039;&#039;&#039;tms&#039;&#039;&#039; into database).&lt;br /&gt;
&lt;br /&gt;
For exemple le 1st january 1970, 3 hour at Paris (TZ=+1) = 2 hour at Greenwitch (TZ=0) will be stored into memory with value integer 7200 (2 * 3600s) and will be submitted into a SQL request to database into the string &#039;19700101030000&#039; (PHP convert the int into its TZ hour and database will unconvert it using its timezone too that is same than PHP).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;How to manage this for date with hours:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
So all insert or update methods must convert, during generation of SQL request, the integer memory date into a db string by using db-&amp;gt;idate (you may find examples into skeleton).&lt;br /&gt;
&lt;br /&gt;
And all select methods should translate date fields, coming from the database as a string in TZ of server (here &#039;19700101030000&#039;), into a timestamp field (integer) by calling the method db-&amp;gt;jdate(). So this stores the date into memory as a GTM Timestamp integer. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;How to manage dates with no hours (just day):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
For insert/update, you must convert it with db-&amp;gt;idate(value, &#039;gmt&#039;) so for 0, you will get &#039;19700101000000&#039;.&lt;br /&gt;
&lt;br /&gt;
And all select methods should translate date fields, coming from the database as a string in TZ of server (here &#039;19700101000000&#039;) by using $db-&amp;gt;jdate(..., &#039;gmt&#039;);&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Other cases&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Dates that are updated automatically (field &#039;&#039;&#039;tms&#039;&#039;&#039; into database) contains a GMT Timestamp of the date when the change is done. The select will also use the db-&amp;gt;jdate (that use PHP server TZ) to convert read data into a GMT Timestamp into memory. So if timezone of database differs from timezone of PHP server (one of them is not correctly set), you may experience differences between creation date and update date. Try to never rely on this field in Dolibarr (this autoupdate field is mostly for debug purpose).&lt;br /&gt;
&lt;br /&gt;
*Manipulation date with PHP must be done using the Dolibarr date functions: &#039;&#039;&#039;dol_now(), dol_mktime(), dol_stringtotime(), dol_getdate(), dol_time_plus_duree()&#039;&#039;&#039;. You may also find other functions available into file &#039;&#039;&#039;date.lib.php&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==UTF8/ISO encoding==&lt;br /&gt;
Dolibarr stores data in the following way:&lt;br /&gt;
&lt;br /&gt;
*In database, data is stored in UTF8 or ISO. It depends on the database&#039;s pagecode therefore these options are set at creation time. In any case, Dolibarr&#039;s database driver (in lib/database) deals with it to convert from/to UTF8 at insertion and readout.&lt;br /&gt;
*Memory data is stored in UTF8 (PHP object instances).&lt;br /&gt;
*Web pages are returned and rendered into UTF8&lt;br /&gt;
&lt;br /&gt;
==Float numbers, amount and calculation==&lt;br /&gt;
With PHP, like other languages (Java for exemple), non integer data (float, real, double) are not reliable for calculation.&lt;br /&gt;
Try to make for example &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
print 239.2 - 229.3 - 9.9;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
You wont get zero but a very small decimal number. If you get zero here, you should be able to find other examples that don&#039;t work.&lt;br /&gt;
Problem of float is general, so a variable that is a result of a calculation using decimal numbers must ALWAYS be cleaned using the function &#039;&#039;&#039;price2num()&#039;&#039;&#039; with the second parameter to: &#039;MU&#039;, &#039;MT&#039; or &#039;MS&#039; depending on need (see description of function).&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
If data manipulated is not an amount, then using MU, MT, MS has no sense, and you must use the function &#039;&#039;&#039;round()&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==Creation of tables==&lt;br /&gt;
Do not create tables, on the fly, during execution by a standard user, we mean, during current usage of software.&lt;br /&gt;
If you create a module that uses its own table, not available in the default Dolibarr code, then take a look at tutorial [[Module development]]. It explains how to provide new tables with your module, so that, the tables will be created during module activation and not during module usage.&lt;br /&gt;
&lt;br /&gt;
==Comparing version==&lt;br /&gt;
If your code need to make different things depending on Dolibarr version, you can use the following tip to detect and compare versions&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
But this solution need to include the function versioncompare. An alternative solution to test version is to do:&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Logs==&lt;br /&gt;
Add logs to your code using function&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Working directory==&lt;br /&gt;
If you need to create a working directory for persistent data, into your code, refer to it with &lt;br /&gt;
&#039;&#039;&#039;DOL_DATA_ROOT.&#039;/mymodule&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The directory can be created into your code by the following function:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$mymoduledir=DOL_DATA_ROOT.&#039;/mymodule&#039;;&lt;br /&gt;
dol_mkdir($mymoduledir);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you need a directory to store temporary data, this directory must be &#039;&#039;&#039;DOL_DATA_ROOT.&#039;/mymodule/temp&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=Design patterns and Object programming=&lt;br /&gt;
&lt;br /&gt;
==Creation design patterns (GoF)==&lt;br /&gt;
Design patterns defined by the Gang Of Four (see wikipédia on [[w:Design patterns|Design patterns]]).&lt;br /&gt;
No usage of such patterns is required. We found some objects next to Singletons or Factory but not completely compliant with syntax, this is to be compatible with PHP 4 that is not a pure object language.&lt;br /&gt;
&lt;br /&gt;
==Structure design patterns (GoF)==&lt;br /&gt;
Design patterns defined by the Gang Of Four (see wikipédia on [[w:Design patterns|Design patterns]]). &lt;br /&gt;
No usage of such patterns is required.&lt;br /&gt;
&lt;br /&gt;
==Behavior design patterns (GoF)==&lt;br /&gt;
Design patterns defined by the Gang Of Four (see wikipédia on [[w:Design patterns|Design patterns]]). &lt;br /&gt;
No usage of such patterns is required.&lt;br /&gt;
&lt;br /&gt;
==Design patterns of enterprise (Martin Fowler)==&lt;br /&gt;
&lt;br /&gt;
===Patterns of code organization===&lt;br /&gt;
[[w:Martin Fowler|Martin Fowler]] has identified 3 ways to organize code:&lt;br /&gt;
&lt;br /&gt;
*The &#039;&#039;&#039;Transaction Script&#039;&#039;&#039; (The source code is linear for each user action).&lt;br /&gt;
&lt;br /&gt;
This is the old school used by all procedural languages.&lt;br /&gt;
Inconvenient: Redundancy of code. Need to know the physical model of data to develop.&lt;br /&gt;
&lt;br /&gt;
*The &#039;&#039;&#039;Domain Model&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
This notion is available with object languages. It is business process (to identify before) that are used for objects classes.&lt;br /&gt;
Inconvenient: Model very complex to maintain.&lt;br /&gt;
&lt;br /&gt;
*The &#039;&#039;&#039;Table Module&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
This is a mix between 2 previous where we have only one unique class for each table of database.&lt;br /&gt;
&lt;br /&gt;
-&amp;gt; As shown in code skeletons (see previous chapter), Dolibarr uses concept of &#039;&#039;&#039;Table Module&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
===Communication between business logic - data (ORM)===&lt;br /&gt;
&lt;br /&gt;
There are 3 ways to make links:&lt;br /&gt;
&lt;br /&gt;
*The &#039;&#039;&#039;Table And Row Data Gateway&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
This is the most simple. You have one class per table and each class is a link to the table with CRUD methods (Create, Read, Update, Delete). A class instance is a record in the table. The class contains only code to reach lines and fields of table.&lt;br /&gt;
&lt;br /&gt;
Example: This mode is used by some ORM Frameworks, like &#039;&#039;&#039;iBatis&#039;&#039;&#039; (http://ibatis.apache.org/).&lt;br /&gt;
&lt;br /&gt;
*The &#039;&#039;&#039;Active Record&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Same as previous, but we are allowed to add some business functions into the CRUD class, if such functions are dedicated to manipulate data into this table. &lt;br /&gt;
This pattern is known to be the most productive of the 3, as it is a very good compromise between the &#039;&#039;&#039;Table And Row Data Gateway&#039;&#039;&#039; and the &#039;&#039;&#039;Data Mapper&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Example: This mode is used for Dolibarr development and most PHP software that includes their own framework and best practices.&lt;br /&gt;
&lt;br /&gt;
*The &#039;&#039;&#039;Data Mapper&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Classes represent entities of the problem and not the data. So you have to double, triple ... these classes with Mapper classes to access the data.&lt;br /&gt;
More &amp;quot;purist&amp;quot; on paper (closer of business), this method also has the disadvantage of being more complex in practice.&lt;br /&gt;
&lt;br /&gt;
Example: This is the choice if you use the ORM Framework &#039;&#039;&#039;Propel&#039;&#039;&#039; (https://propelorm.org/). We find this model in heavier applications, based on this ORM among others.&lt;br /&gt;
&lt;br /&gt;
-&amp;gt; For Dolibarr development, the pattern used is the connection mode &#039;&#039;&#039;Active Record&#039;&#039;&#039;, which offers the advantages of a model close to the business without having the complexity, without obfuscating technical architecture. It is by this way that the development, understanding of code and technical maintenance and / or business behavior seems the more productive (this is however an ongoing debate between the purists and the pragmatists, debate in which nobody can really be right, because it depends on the objectives).&lt;br /&gt;
[[Category:Development]]&lt;br /&gt;
&lt;br /&gt;
==Design pattern for Graphic interfaces (MVC)==&lt;br /&gt;
There are several design patterns for user interfaces (MVC, MVP, MVVM).&lt;br /&gt;
Many confuse this design pattern with that of using a template framework. It&#039;s unrelated. A template framework (see previous point) is only linked to the &amp;quot;V&amp;quot; part of these models.&lt;br /&gt;
&lt;br /&gt;
-&amp;gt; Dolibarr uses the &#039;&#039;&#039;MVC&#039;&#039;&#039; Design Pattern (Model - View - Controller). Part M (Model) is materialized by a DAO class containing the CRUD (Create-Read-Update-Delete) methods for accessing the table.&lt;br /&gt;
Many frameworks have chosen to put the C code part (Controller) and the V code part (View) in different files, or even separate directories. The maintenance seems easier on paper, in practice, you have to juggle constantly between a ton of files when your project become larger. In Dolibarr, the separation is made by a simple comment section. The part of code C (Controller) is therefore the code that follow the tag&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;
It is followed by the part of code V (Vue), well separated from the C by the tag&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;
This mode of separation has had a neutral effect on new developments but has made it possible to reduce the time required for maintenance and fixing bugs so significantly that it is not envisaged to switch to another type of separation (yes the findings made in real life are not always those expected by school theory). The important thing remains that there is always a separation between C and V, no matter how this separation is materialized, as long as it is (Reminder: Do not confuse the notion of separation of C and V with the notion of separation of the code to feed the data of a View and of the code to format the View, this a principle of separation relating to the Design Pattern of Vue, see next point).&lt;br /&gt;
&lt;br /&gt;
==Design pattern for Views - Presentation==&lt;br /&gt;
There are frameworks that specialize in Vue Design Pattern, the part of formatting the screen seen by the user.&lt;br /&gt;
Old versions of Dolibarr used Smarty. This framework is an overlay to an already very powerful screen formatting framework called ... PHP. The benefits being much lower than the disadvantages, it has been abandoned in favor of PHP templates (.php files or .tpl.php files) which remain the simplest, the most universal, the most scalable and the most efficient, of the presentation frameworks we tried to use. &lt;br /&gt;
&lt;br /&gt;
Its only flaw is that it cannot guarantee 100% the deviations of a developer who would integrate into the View, a logic unrelated to the presentation (therefore other than code intended for generation, formatting, HTML output , test or loop logic). This point is however controlled by the validation mechanism of the project managers&#039; code.&lt;br /&gt;
&lt;br /&gt;
Here again, it is the experience and the observation of a better productivity performance that has motivated the abandonment of the external Presentation frameworks in favor of the PHP framework.&lt;br /&gt;
&lt;br /&gt;
=Rules to define branch target of a contribution=&lt;br /&gt;
The rules to decide if a contribution (Pull Request) must be pushed into an old maintenance branch or into development are not strict and are often defined by the good sense (pragmastism first). &lt;br /&gt;
We can find help on the graph found on this page [[:Category:RoadMap#Merging_PR_process_.28develop_or_maintenance_.3F.29]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=About composer=&lt;br /&gt;
Composer is a tool to make deployment of PHP packages and dependenciess. Dolibarr is a PHP application that use dependencies that are PHP packages, so we could imagine to use composer to install Dolibarr.&lt;br /&gt;
&lt;br /&gt;
This is not a good idea as it is just technically not possible for the following reasons:&lt;br /&gt;
&lt;br /&gt;
*First, you must understand that composer is a tool &#039;&#039;&#039;to deploy a frozen image of a package&#039;&#039;&#039;. It is a tool to &#039;&#039;&#039;deploy&#039;&#039;&#039;, not a tool to &#039;&#039;&#039;manage dependencies&#039;&#039;&#039; (event if some features exists for that). Dolibarr is an application that has a lot of dependencies, but for each of them, the Dolibarr project has to apply some patches to have the dependencies working correclty (for different reasons, mainly because of bugs or architecture error into original project. See the file &#039;&#039;&#039;dev/dolibarr_changes.txt&#039;&#039;&#039; for full list we have to do on each dependency). Each PHP dependency has at least one change to do to have it working correctly. So the image of a library L that Dolibarr needs is NOT the image provided into the composer package by the L project. After discussion with &#039;&#039;&#039;Nils Adermann&#039;&#039;&#039;, the author of the composer package during the first OSFS congress (https://05f5.com) to get its point of view on this need for large projects, it appears that if a large project is in this situation, the good way to use composer is to build yourself a very large package called &amp;quot;dolibarr&amp;quot; with no composer dependencies and all external libraries embedded into the same composer project so we can deploy all in one composer command, confirming that composer is above all a good &amp;quot;fast deployment system&amp;quot; but a bad &amp;quot;dependency manager&amp;quot;. The dependency system of composer project was simply designed to use an exact version of a library and not to use a patched version of this library. It is even designed to avoid this, making its use not possible in this context.&lt;br /&gt;
*Second point is a different problem with the composer dependencies system: Each dependency on a library has itself a high number of sub-dependency. And all this sub-dependencies have also a high number of dependencies that nobody can&#039;t control (there is always sub-dependencies on the libraries you use that are managed by a lower level dependency project). The result is that when you use composer to install the main library you need, you install (and you can&#039;t avoid it) a ton of other packages you don&#039;t need. For example, Dolibarr is a 80Mb project with all its PHP dependencies. If you install it with composer (we suppose that the first point is not a problem), then the project reach the size of 300 Mb. Size of project is multiplicated by 3.5 with no reason. Not sobriety compliant.&lt;br /&gt;
*Third point is also problems with the dependency system: When you install an external library this library has dependency and each of this depency of depencies are constraints with each other and with PHP version. Imagine the required library L1 is compatible with PHP x to x+n and the library L2 is compatible with PHP y to y+m, etc... To have an application working correctly, you must find a PHP version that will be common to all the required packages, so here inside the intersection of the two ranges [x - x+n] and [y - y+m]. But when you are using a large number of high level libraries, it means you are depending on a very large number of low level libraries (because each high level libraries has a lot of medium level libraries as dependencies that has a high number of low level dependencies). And when this number is very large, the number of different required ranges become so large that you reach a situation where the number of PHP versions that are common to all of them (hte intersection of all ranges) is very low, and even does not exists at all (there is no combination of version that is compatible with ALL packages you need because each sub-project depreciate its PHP version in its own roadmap without taking care of which child or parent dependency use it). But Dolibarr must works for everybody, whatever is other project roadmaps, and on the &amp;quot;as large as possible&amp;quot; number of PHP versions and not just on one or two given major version of PHP. Compatibiliy must also be guaranted during a very long term (an ERP is not a software we can change every year), when low level libraries are changing requirement very often.&lt;br /&gt;
*Last point is about security: As we view in the second point, when using composer, a very high number of PHP files are installed even if you don&#039;t need them. Dolibarr is a critical application that need a very strict security policy. Requirement for security is at a high level (See our page [[Security_information]]). When using composer, you install a lot of files and small sub-project and sub-project of sub-projects where security is not considered as important than what we need on the Dolibarr project. If we make an analysis on a given period, the number of vulnerability reported on the whole project Dolibarr + files of external libraries when installed by composer (that we mostly don&#039;t need) is multiplicated by 20 compared to the number of vulnerabilities that are reported only in the scope of Dolibarr + external libraries when they are embedded manually with the minimal number of files we need). Such an increase is simply not possible, and give a very bad mesage on security   point of view: &amp;quot; yes we reduce 95% of known security vulnerabilities but we don&#039;t do it because we are using composer&amp;quot;. Some companies (due to a strict security requirements of their business, like secnum or iso requirement) would simply not be allowed to use Dolibarr if we accept these.&lt;br /&gt;
&lt;br /&gt;
As we can see, composer, even if it was largely adopted by a lot of small projects, is far away from the state of the art. For all this reasons, it is just not possible to use composer so we keep the composer.json file in the project so we can use it for some development tests or make upgrade tests of some libraries with it, but we have renamed it by adding the extension &amp;quot;.disabled&amp;quot; to be sure that end users won&#039;t try to install or update their Dolibarr with it, in which case, the application will become  unstable (remind point 1) and unsecured (remind point 4)&lt;/div&gt;</summary>
		<author><name>Eldy</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Setup_Other&amp;diff=68016</id>
		<title>Setup Other</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Setup_Other&amp;diff=68016"/>
		<updated>2026-10-12T19:17:07Z</updated>

		<summary type="html">&lt;p&gt;Eldy: /* Global Options */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN origin interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- You can edit this section but do NOT remove these comments&lt;br /&gt;
     Links below will be automatically replicated on translated pages by PolyglotBot --&amp;gt;&lt;br /&gt;
[[fr:Paramétrage_Divers]]&lt;br /&gt;
[[es:Configuración_Varios]]&lt;br /&gt;
[[de:Erweiterte_Einstellungen]]&lt;br /&gt;
[[zh:其他设置]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Admin]]&lt;br /&gt;
{{TemplateDocUser}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Help About Screen&#039;&#039;&#039;: Other setup&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Menu Path&#039;&#039;&#039;: Home ► Setup ► Other&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Introduction&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Some options are not visible in the interface (often because they are deprecated or are beta features). In most cases you do not need these functions and their use may make the application unstable or may not work as expected.&lt;br /&gt;
&lt;br /&gt;
 {{warning|32px}} This page contains the list of some advanced development parameters. In most cases, they are parameters for internal usage, development, external modules, features in development not stable or that may lead to security risk. For standard usage of Dolibarr, such parameters &#039;&#039;&#039;SHOULD NOT&#039;&#039;&#039; be used. All experimental options are NOT supported. They may be removed in a future, modified at any version and break stability of your application.&lt;br /&gt;
&lt;br /&gt;
To enable/override a parameter you have to define the constant name and set it to 1 (unless otherwise stated) in &amp;lt;code&amp;gt;Home ► Setup ► Other Setup&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The options here may not be documented since they are not stable and are unsupported (remember they are experimental or development options). The basic format of how the list is written is broken down in the example below:&lt;br /&gt;
&lt;br /&gt;
UNSTABLE_OR_DEV_OPTION ► &#039;&#039;Description of config and goal&#039;&#039; ► &#039;&#039;(specific version information) or values&#039;&#039;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
=Global Options=&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;ADD_UNSPLASH_LOGIN_BACKGROUND&#039;&#039;&#039; ► The background image will be refreshed on every login page refresh. Background image is pulled from the popular open source image website Unsplash. If an already saved static background image exists, then this code will override it (but not delete the saved image). Warning: Using this may allow this external website to steel your login credentials (the value to be put is the URL of the service, exemple&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: https://source.unsplash.com/random) ► (v10.0)&lt;br /&gt;
*&#039;&#039;&#039;MAIN_HIDE_POWERED_BY&#039;&#039;&#039; ► Hide the &amp;quot;Powered by Dolibarr&amp;quot; picto on public pages&lt;br /&gt;
*&#039;&#039;&#039;MAIN_APPLICATION_TITLE&#039;&#039;&#039; ► This will change the title of software (that appears on the login page by default). Warning: changing this may make Dolibarr version detection to fail by smartphone applications like [[Application Android - DoliDroid]], breaking some features when using Dolibarr from such application. If the text start with a &amp;quot;+&amp;quot;, the text will be added to the standard &amp;quot;Dolibarr&amp;quot; label instead of replacing it.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_AUTOFILL_DATE&#039;&#039;&#039; ► If this constant is defined (to something other than &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;), the date of invoice, proposal, order or payment are auto-filled with the current date. It is highly recommended to NOT ENABLE this feature. This can create a lot of input errors with data not validated by users. This leads to incorrect values saved in the database causing confusion when you have to do your accountancy reports!&lt;br /&gt;
*&#039;&#039;&#039;MAIN_AUTOFILL_DATE_PROPOSAL►&#039;&#039;&#039;If this constant is defined (to something other than 0), the date of  proposal is auto-filled with the current date.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_AUTO_TIMESTAMP_IN_PUBLIC_NOTES&#039;&#039;&#039; ► Add a timestamp and user automatically when editing the &#039;&#039;public&#039;&#039; note.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_AUTO_TIMESTAMP_IN_PRIVATE_NOTES&#039;&#039;&#039; ► Add a timestamp and user automatically when editing the &#039;&#039;private&#039;&#039; note.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_DEFAULT_PAYMENT_TERM_ID&#039;&#039;&#039; ► With ID of a payment term, will use this as default payment term each time you create a new proposal, order, invoice (customer and supplier). Deprecated. Replaced with the default setup feature instead (see French page of wiki for some exemple&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: [[Paramétrage Valeurs par défaut]])&lt;br /&gt;
*&#039;&#039;&#039;MAIN_DEFAULT_PAYMENT_TYPE_ID&#039;&#039;&#039; ► With ID of a payment type, will use this as default payment type each time you create a new proposal, order, invoice (customer and supplier). Deprecated. Replaced with the default setup feature instead (see French page of wiki for some exemple&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: [[Paramétrage Valeurs par défaut]])&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_DEFAULT_LANGUAGE_FILTER&#039;&#039;&#039; ► Useful if you do not want to show &amp;lt;code&amp;gt;en_US&amp;lt;/code&amp;gt; language option in combo boxes (other languages can easily be removed in &amp;lt;code&amp;gt;langs&amp;lt;/code&amp;gt; directory but not &amp;lt;code&amp;gt;en_US&amp;lt;/code&amp;gt;) ► (v10.0)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_LANGUAGES_ALLOWED&#039;&#039;&#039; ► Is a list of languages without spaces, example&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: &amp;lt;code&amp;gt;fr_FR,en_US,de_DE,it_IT&amp;lt;/code&amp;gt; If defined, only those languages will appear in combos. ► (v11.0)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_DISABLE_NOTES_TAB&#039;&#039;&#039; ► Show or hide notes tab in the card page&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_DISABLE_CONTACTS_TAB&#039;&#039;&#039; ► Show or hide contacts tab in the card page&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_DISABLE_FULL_SCANLIST&#039;&#039;&#039; ► Disables the complete scan of tables to allow the pagination to show total number of pages. May be useful to activate on systems with a very high quantity of data (tables with more than 2 000 000 records).&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_DISABLE_JQUERY_JNOTIFY&#039;&#039;&#039; ► Disable usage of &amp;lt;code&amp;gt;JNotify&amp;lt;/code&amp;gt; to show confirm or error messages&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_DISABLE_AJAX_COMBOX&#039;&#039;&#039; ► If you have a large number of third parties or products, you can disable the autocomplete feature on the third parties list by setting this constant to &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; ► (v3.6.0+)&lt;br /&gt;
*&#039;&#039;&#039;MAIN_DISABLE_MULTIPLE_FILEUPLOAD&#039;&#039;&#039; ► Disable users to upload multiple files at once.&lt;br /&gt;
*&#039;&#039;&#039;MAIN_DISABLE_TRUNC&#039;&#039;&#039; ► Disable all truncings in select list. ► (v7.0+)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_DISABLEDRAFTSTATUS&#039;&#039;&#039; ► Disable the status &amp;quot;Draft&amp;quot; for some objects (project, donation, ...) so the object is directly created with status &amp;quot;Validated&amp;quot;&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_DOC_USE_OBJECT_THIRDPARTY_NAME&#039;&#039;&#039; ► Add name of thirdparty at begin of generated document.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_DOC_USE_TIMING&#039;&#039;&#039; ► Add a timestamp at end of generated document. Value must be format of timestamp. For example: &amp;lt;code&amp;gt;%Y%m%d%H%M&amp;lt;/code&amp;gt; (only for ODT files)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_DOC_UPLOAD_NOT_RENAME_BY_DEFAULT&#039;&#039;&#039; ► Disable the auto renaming on upload file ► (v10.0)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_DOL_SCRIPTS_ROOT&#039;&#039;&#039; ► Define directory who contains &#039;scripts&#039; directory (e.g. &amp;lt;code&amp;gt;/var/www/dolibarr&amp;lt;/code&amp;gt;). Value of this variable may be requested by some external script or tools.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_ENABLE_LOG_TO_HTML&#039;&#039;&#039; ► If this constant is defined, it is possible to have logs inside pages by adding the parameter &amp;lt;code&amp;gt;&amp;amp;logtohtml=1&amp;lt;/code&amp;gt; into URL.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_ENABLE_IMPORT_LINKED_OBJECT_LINES&#039;&#039;&#039; ► Allow to import lines into current document from &amp;quot;linked&amp;quot; compatible documents ► (v8.0+)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_FIRST_TO_UPPER&#039;&#039;&#039; ► Dolibarr add uppercase to Third Parties, contacts or members names if not done. Warning: with some languages (whose words with uppercase are not same words, or pagecode does not always have an uppercase, like Cyrillic languages), this feature may alter your data.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_ALL_TO_UPPER&#039;&#039;&#039; ► Dolibarr puts uppercase for Third Parties, contacts or members names if not done. Warning, with some languages (whose words with uppercase are not same words, or pagecode does not always have an uppercase, like Cyrillic languages), this feature may alter your data. ► (v11.0)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_ALL_TOWN_TO_UPPER&#039;&#039;&#039; ► Dolibarr puts uppercase for town names if not done. ► (v13.0)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_FILESYSTEM_ENCODING&#039;&#039;&#039; ► With some PHP versions, PHP is not able to detect the page code for filesystem of the server OS. To solve this, Dolibarr assumes your OS filesystem is &amp;lt;code&amp;gt;UTF-8&amp;lt;/code&amp;gt; if on Linux or OSX system, and &amp;lt;code&amp;gt;ISO-8859-1&amp;lt;/code&amp;gt; if on Windows. If not, for example on a Windows server with a NTFS &amp;lt;code&amp;gt;UTF-8&amp;lt;/code&amp;gt; pagecode, you can set the variable &amp;lt;code&amp;gt;MAIN_FILESYSTEM_ENCODING&amp;lt;/code&amp;gt; to &amp;quot;&amp;lt;code&amp;gt;utf-8&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_FORCELANGDIR&#039;&#039;&#039; ► Relative path of the directory holding your custom &amp;lt;code&amp;gt;langs&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
*&#039;&#039;&#039;MAIN_HTML_TITLE&#039;&#039;&#039; ► Can be used to control how the html page title is formatted. If value contains key &#039;&amp;lt;code&amp;gt;noapp&amp;lt;/code&amp;gt;&#039;, application name will not be output. If value contains &#039;&amp;lt;code&amp;gt;thirdpartynameonly&amp;lt;/code&amp;gt;&#039;, on tab for thirdparties, only name of thirdparties are output. Value can be list of tags: &#039;&amp;lt;code&amp;gt;noapp;thirdpartynameonly&amp;lt;/code&amp;gt;&#039;&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_HELPCENTER_LINKTOUSE&#039;&#039;&#039; ► Define the URL link to use as the target page for link &amp;quot;I need help&amp;quot; onto logon page&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_LOGOUT_GOTO_URL&#039;&#039;&#039; ► URL to which the user will be redirected after LOGOUT&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_MAXTABS_IN_CARD&#039;&#039;&#039; ► Maximum number of tabs visible. Others are grouped into a combo list.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_MAXLIST_OVERLOAD&#039;&#039;&#039; ► Maximum number of line in space&#039;s domain.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_MIN_NB_ENABLED_MODULE_FOR_WARNING&#039;&#039;&#039; ► A warning saying setup of modules is not complete is shown if the number of enabled modules is lower or equal than this value (&amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; if not defined)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_NO_CONCAT_DESCRIPTION&#039;&#039;&#039; ► Allow to use only input custom description in lines (proposal, order, invoice) ► (v10.0)   &amp;lt; v20.0. [ OSBOLETE since 20.0 | SEE Product module admin configuration to set the description behavior of products and services ]. This value is overwritten by PRODUCT_AUTOFILL_DESC, controled by the option in the product module admin configuration, and is no longer used. Kept in code to allow compatibility if custom modules are using it. Removed completely from v22.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_OPTIMIZE_SPEED&#039;&#039;&#039; ► Use some speed enhancements. See page [[FAQ Increase Performance]] for more information.&lt;br /&gt;
*&#039;&#039;&#039;MAIN_PASSWORD_FORGOTLINK  ►&#039;&#039;&#039; Change forgotten password link on login page. ► (v9.0)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_PROPAGATE_CONTACTS_FROM_ORIGIN&#039;&#039;&#039; ► When creating an order, contract, invoice from another object, specific contacts of objects are set as specific contact of the new object when possible. ► (v4.0+)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_PUBLIC_NOTE_IN_ADDRESS&#039;&#039;&#039; ► Show public note in address block ► (v4.0+)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_REMOVE_INSTALL_WARNING&#039;&#039;&#039; ► Remove all security warnings that appear to administrator users if URL &amp;lt;code&amp;gt;/install&amp;lt;/code&amp;gt; is public. You should solve the problem if warning occurs, instead of removing the warning! For this, create a file called &amp;lt;code&amp;gt;install.lock&amp;lt;/code&amp;gt; into Dolibarr root directory. This will stop the warning but also make the page &amp;lt;code&amp;gt;/install&amp;lt;/code&amp;gt; not possible to use, to protect your installation.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_REPEATCONTACTONEACHTAB&#039;&#039;&#039; ► If added and set to &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, this adds contacts on all tabs, not only main tab.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_REPLACE_TRANS_xx_XX&#039;&#039;&#039; ► Where &amp;lt;code&amp;gt;xx_XX&amp;lt;/code&amp;gt; is language code. If value is &amp;lt;code&amp;gt;string1:newstring1;string2:newstring2&amp;lt;/code&amp;gt; then replace &amp;lt;code&amp;gt;string1&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;newstring1&amp;lt;/code&amp;gt; in all translation done for language &amp;lt;code&amp;gt;xx_XX&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND&#039;&#039;&#039; ► Change way of rounding total including tax of lines, rounding first of after.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND_SUPPLIER&#039;&#039;&#039;► Change way of rounding total including tax of lines, rounding first of after.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_SERVER_TZ&#039;&#039;&#039; ► If you can&#039;t set the time zone of your PHP installation, set this constant. Better is to set it to UTC. In future, this constant will be forced to &#039;&amp;lt;code&amp;gt;UTC&amp;lt;/code&amp;gt;&#039; so PHP server time zone will not have effect any more. Examples: &amp;lt;code&amp;gt;Europe/Paris&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;auto&amp;lt;/code&amp;gt;. Dolibarr will apply the timezone before saving dates in the database. Meaning that if you remove the parameter the dates saved will not change back to UTC.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_SEARCH_FORM_ON_HOME_AREAS&#039;&#039;&#039; ► Show the search form on home page areas for core modules (Removed after v5 due to global search combo) ► (v6.0+)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_SEARCHFORM_SUPPLIER_INVOICE_DISABLED&#039;&#039;&#039; ► Disable the supplier invoice on the search form&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE&#039;&#039;&#039; ► If only one result is found, then setting this value to &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; will take you direct to the item (default method).  Setting the value to &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; will show the result in the list as a single result ► (v5.0+)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_SERVICES_ARE_ECOMMERCE_200238EC&#039;&#039;&#039;  ► If seller and buyer are in Europe and buyer is not a company, use the VAT of buying country. It can have value &#039;1&#039; or &#039;2&#039;. If value 2, the VATs available to select only the ones of buying country. If &#039;1&#039;, the VATs available to select mix the ones of selling country and the ones of buying country. ► (v18.0+)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_SHOW_TUNING_INFO&#039;&#039;&#039; ► Add tuning information into JavaScript console. Better when xdebug is enabled.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_SHOW_TECHNICAL_ID&#039;&#039;&#039; ► Show also technical IDs on elements cards or some lists (not supported everywhere).&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_SHOWDATABASENAMEINHELPPAGESLINK&#039;&#039;&#039; ► Show database name in upper help menu ► (v8.0+)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_USE_ALTERNATE_TRANSLATION_FOR&#039;&#039;&#039; ► List of fields per object that need an alternate translation. Example: &amp;lt;code&amp;gt;MAIN_USE_ALTERNATE_TRANSLATION_FOR=societe:name,town;contact:firstname,lastname&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_USE_HOURMIN_IN_DATE_RANGE&#039;&#039;&#039; ► On all entities lines (invoice, order, contract...), it is possible to add hour and minutes with date on fields &amp;quot;date start&amp;quot; and &amp;quot;date end&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_USE_JQUERY_JEDITABLE&#039;&#039;&#039; ► Allow to update from screen, directly into database, some properties of elements (invoices, proposals, ...) using Ajax. This make response time faster, but avoid using this feature, because it bypasses some business actions (updates on other data that should be done consistently) and ignores business controls on data you saved. Consequently this feature breaks consistency of data and possibly the stability of the software.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_USE_JQUERY_MULTISELECT&#039;&#039;&#039; ► Allow to use Ajax when a choice that require multiselect is used (for the moment only external modules uses select box with multiselect values). Set the value to the jQuery plugin name to use (multiselect, multiple-select, select2…). Setting it to any other value will result in unwanted side-effects and/or bugs.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_USE_OLD_SEARCH_FORM&#039;&#039;&#039; ► Display the old search form in left menu.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_VAT_DEFAULT_IF_AUTODETECT_FAILS&#039;&#039;&#039; ► Allow to force the VAT rate to a given value (instead of higher VAT rate of country) if the VAT rate of product was not defined.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_UNKNOWN_CUSTOMERS_ARE_COMPANIES&#039;&#039;&#039; ► If we can&#039;t guess if a thirdparty is a company or individual (not VAT ID fill, no Prof ID fill, no type of thirdparty fill), then we suppose it is a company (B2B business) if 1, we suppose it is an individual (B2C business) if 0.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_USE_VAT_COMPANIES_IN_EEC_WITH_INVALID_VAT_ID_ARE_INDIVIDUAL&#039;&#039;&#039; ► For intra CEE sales, we use by default, on proposal, order or invoice creation, a 0 VAT for customers that are companies (see MAIN_UNKNOWN_CUSTOMERS_ARE_COMPANIES to change behaviour to know if a thirdparty is a company or an individual). But if the option MAIN_USE_VAT_COMPANIES_IN_EEC_WITH_INVALID_VAT_ID_ARE_INDIVIDUAL is set, we will use the 0 VAT only if a VAT ID is defined for the customer.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_USE_VAT_OF_PRODUCT_FOR_INDIVIDUAL_CUSTOMER_OUT_OF_EEC&#039;&#039;&#039; ► For to use the default VAT of product for individual customers that are out E.E.C. (European Economic Community) ► (v7.0+). &#039;&#039;There is no reason to use this.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_VIEW_LINE_NUMBER&#039;&#039;&#039; ► Shows a line number for each line of products/services at documents like proposal / order / invoice. Only on screen, not on PDF (available with PDF_ADD_POSITION).&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_VIEW_LINE_NUMBER_IN_LIST&#039;&#039;&#039; ► Shows a line number in lists ► (v12.0)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_VOLUME_DEFAULT_ROUND&#039;&#039;&#039; ► Accuracy of volume (number of decimals)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_VOLUME_DEFAULT_UNIT&#039;&#039;&#039; ► Default unit for weight (&amp;lt;code&amp;gt;0=kg&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;-3=g&amp;lt;/code&amp;gt;, ...)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_WEIGHT_DEFAULT_ROUND&#039;&#039;&#039; ► Accuracy of weight (number of decimals)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_WEIGHT_DEFAULT_UNIT&#039;&#039;&#039; ► Default unit for weight (&amp;lt;code&amp;gt;0=kg&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;-3=g&amp;lt;/code&amp;gt;, ...)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;USER_HIDE_INACTIVE_IN_COMBOBOX&#039;&#039;&#039; ► Disable display inactive users in combobox.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_DISABLE_PDF_THUMBS&#039;&#039;&#039; ► Disable the thumbs PDF (used for preview on screen). Can be used in case of imagick bug or non availability&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_KEEP_REF_CUSTOMER_ON_CLONING&#039;&#039;&#039; ► Keep the Customer Reference on cloned object (Propal/Invoice)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_DONT_KEEP_NOTE_ON_CLONING&#039;&#039;&#039; ► Remove the object notes during cloning ► (v11.0)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_DOC_SORT_FIELD&#039;&#039;&#039; ► Set the default sorting field on document page (name by default) ► (v11.0)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_DOC_SORT_ORDER&#039;&#039;&#039; ► Set the default sorting order (ASC or DESC) on document page (ASC by default) ► (v11.0)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_USE_ZIPTOWN_DICTIONNARY&#039;&#039;&#039; ► Use dictionary ZIP for create card.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_USE_TOP_MENU_SEARCH_DROPDOWN&#039;&#039;&#039; ► Show search in top menu with theme eldy ► (v11.0)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_PHONE_SEPAR&#039;&#039;&#039; ► Separ phone number other space ► (v12.0)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;GRAPH_USE_FISCAL_YEAR&#039;&#039;&#039; ► Widgets uses fiscal year&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;SHOW_SOCINFO_ON_PRINT&#039;&#039;&#039; ► Permit to add user company information on each printed document (when click on Dolibarr print button) ► (v12.0)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_FEATURES_LEVEL&#039;&#039;&#039; ► Level of features to show: &amp;lt;code&amp;gt;-1=stable+deprecated&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0=stable only (default)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1=stable+experimental&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;2=stable+experimental+development&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_SHOW_TECHNICAL_ID&#039;&#039;&#039; ► Show technical id for object.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_HTTP_CONTENT_SECURITY_POLICY&#039;&#039;&#039; ► Allows you to fill in the content security rules ► (v6.0)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;SOCIETE_ON_SEARCH_AND_LIST_GO_ON_CUSTOMER_OR_SUPPLIER_CARD&#039;&#039;&#039; ► Allow to change the link of the third party to customer/supplier card instead of contact card on List.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_MODULE_SETUP_ON_LIST_BY_DEFAULT&#039;&#039;&#039; ► If set to &amp;quot;common&amp;quot; the setup module becomes list by defaut&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_PAGESIZE_CHOICES&#039;&#039;&#039;  ► Configure select field to choose number of lines displayed on listing (&amp;lt;code&amp;gt;10:10,15:15,20:20,30:30,40:40,50:50,100:100,250:250,500:500,1000:1000,5000:5000&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_USE_TOP_MENU_QUICKADD_DROPDOWN&#039;&#039;&#039; ► Add a dropdown menu with shortcuts to create new objects ► (v13.0)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_EMAILCOLLECTOR_MAIL_WITHOUT_HEADER&#039;&#039;&#039; ► Remove the header stored by email collector ► (v13.0)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_USE_VAT_OF_PRODUCT_FOR_COMPANIES_IN_EEC_WITH_INVALID_VAT_ID&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_OPTIMIZEFORTEXTBROWSER&#039;&#039;&#039; ► Optimise interface for a text only browser. This variable is set to 1 automatically if your browser is lynx or links&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_NB_OF_YEAR_IN_WIDGET_GRAPH&#039;&#039;&#039; ► Set the number of years visible on some graph of some widgets (2 is default value)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_CREATEFROM_KEEP_LINE_ORIGIN_INFORMATION&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;API_DISABLE_LOGIN_API&#039;&#039;&#039; ►(v14.0)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_LOGIN_BADCHARUNAUTHORIZED&#039;&#039;&#039; ► Add possibility to define bad character unauthorized into login name REGEX expression (Default value is @&amp;lt;&amp;gt;&amp;quot;\&#039;)  ► (v16.0)&lt;br /&gt;
*&#039;&#039;&#039;MAIN_SHOW_ALL_FILES_ON_DOCUMENT_TOOLTIP&#039;&#039;&#039;  ► Add all files visible from the object to be visible from the list of object.&lt;br /&gt;
*&#039;&#039;&#039;MAIN_LIST_ALLOW_PUBLIC_NOTES&#039;&#039;&#039;  ► Display public notes on list&lt;br /&gt;
*&#039;&#039;&#039;MAIN_LIST_ALLOW_PRIVATE_NOTES&#039;&#039;&#039;  ► Display private notes on list&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_CHECKBOX_LEFT_COLUMN&#039;&#039;&#039; ► Display private check boxes on the left ► (v17.0)&lt;br /&gt;
*&#039;&#039;&#039;MAIN_STATS_GRAPHS_SHOW_N_YEARS&#039;&#039;&#039; ► Nb of years to shows in widget and graph ► (v14.0)&lt;br /&gt;
*&#039;&#039;&#039;MAIN_HOOK_DEBUG&#039;&#039;&#039; ► if &amp;gt;=2 the hook in the logs are more verbose ► (v18.0)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_ENABLE_AJAX_TOOLTIP&#039;&#039;&#039; ► if 1 the tooltips are updated with AJAX request ► (v18.0)&lt;br /&gt;
*&#039;&#039;&#039;MAIN_NO_INPUT_PRICE_WITH_TAX&#039;&#039;&#039; ► if 1 the TTC input field is removed from propal/invoices/... ► (v17.0)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_DISABLE_SELECT2_FOCUS_PROTECTION&#039;&#039;&#039; ► if 1 disable the focus protection ► (v17.0)&lt;br /&gt;
*&#039;&#039;&#039;MAIN_USE_ADVANCED_PERMS ►&#039;&#039;&#039; Add advanced user permission&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_FREE_PRODUCT_CHECKED_BY_DEFAULT ►&#039;&#039;&#039; Check &amp;quot;product&amp;quot; or &amp;quot;service&amp;quot; by default on order/invoices/propal cards (set value &amp;quot;product&amp;quot; or &amp;quot;service&amp;quot;)&lt;br /&gt;
*&#039;&#039;&#039;MAIN_LINK_BY_REF ►&#039;&#039;&#039; Allow to link documents by choosing the type and ref from the object linked option&lt;br /&gt;
*&#039;&#039;&#039;MAIN_STORE_COMPUTED_EXTRAFIELDS ►&#039;&#039;&#039; when enabled, computed extrafields have their formula result evaluated and persisted to the database on save (instead of the default behavior where the formula is re-evaluated on the fly at each display and the column is left null).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Official supported option&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The following options are not hidden option. They are available by default from the interface.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_ONLY_LOGIN_ALLOWED ►&#039;&#039;&#039; Activate maintenance mode and set user that is allowed to login. Value must be user login. Available into menu Home - Admin tools - User session, it is filled with admin user when clicking on button &amp;quot;Block other session&amp;quot;. Enable &amp;lt;code&amp;gt;MAIN_STORE_COMPUTED_EXTRAFIELDS&amp;lt;/code&amp;gt; when you need to sort, filter, sum or report on a computed extrafield&#039;s value in SQL/lists: instead of recalculating the formula on every display (leaving the column null), it stores the result in the database on each save, at the cost of the value being a snapshot that only refreshes when the record is saved again.&lt;br /&gt;
&lt;br /&gt;
[[#Top|(back to top)]]&lt;br /&gt;
&lt;br /&gt;
=Security Options=&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_SECURITY_ANTI_SSRF_SERVER_IP&#039;&#039;&#039; ► Can set a complete list of IPs of server.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_SECURITY_CSRF_WITH_TOKEN&#039;&#039;&#039; ► Activate a second anti-CSRF protection on POST (so a POST from another web site can&#039;t be done). Note there is also a default protection using test on referrer that is not reliable. This second protection uses TOKEN on forms and is more powerful. Value can be: 0=CSRF protection disabled; 1=CSRF protection is on POST URLs only (default from version Dolibarr 15.0+); 2=CSRF protection is required on POST + some GET URL that contains some white listed parameters like the parameter &amp;quot;action&amp;quot; used to request database change (default from version Dolibarr 16+), 3=CSRF protection is enabled on any POST and GET URLs (a valid CSRF token is expected whatever are the parameters, warning: can be enabled on Dolibarr but some external modules developped by thirdparty may not be ready yet with this option)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_MODULES_FOR_EXTERNAL&#039;&#039;&#039; ► Limit available modules for external users. By default value is &#039;&amp;lt;code&amp;gt;facture,commande,contact,propal,projet,contrat,societe,ficheinter,expedition,agenda&amp;lt;/code&amp;gt;&#039;&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_ALLOW_SVG_FILES_AS_IMAGES&#039;&#039;&#039; ► Allow to use SVG file as image files. Warning: This may introduce security vulnerability (javascript can be embedded into SVG file).&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_RESTRICTHTML_ONLY_VALID_HTML&#039;&#039;&#039; ► Refused parameter if value is not a valid HTML content. The content is also sanitized with Tidy.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_RESTRICTHTML_ONLY_VALID_HTML_TIDY&#039;&#039;&#039; ► Refused parameter if value is not a HTML content validated by Tidy PHP library. The content is also sanitized with Tidy.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_RESTRICTHTML_REMOVE_ALSO_BAD_ATTRIBUTES&#039;&#039;&#039; ► Sanitize also non standard attributes on HTML content.&lt;br /&gt;
*&#039;&#039;&#039;MAIN_SECURITY_SALT&#039;&#039;&#039; ► A salt string to base the hashing on. 8 strings length recommended.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_SECURITY_MAX_IMG_IN_HTML_CONTENT&#039;&#039;&#039; ► Maximum number of Images on the HTML content&lt;br /&gt;
*&#039;&#039;&#039;MAIN_SECURITY_ALLOW_UNSECURED_LABELS_WITH_HTML&#039;&#039;&#039; ► Allow HTML tags into products label&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_SECURITY_FORCERP&#039;&#039;&#039; = &amp;quot;strict-origin-when-cross-origin&amp;quot; (default) so browser doesn&#039;t send any referrer when going into another web site domain / &amp;quot;same-origin&amp;quot; / &amp;quot;strict-origin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[#Top|(back to top)]]&lt;br /&gt;
&lt;br /&gt;
=Members Module=&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MEMBER_NEWFORM_FORCEMORPHY&#039;&#039;&#039; ► Force nature of member set to &amp;quot;phy&amp;quot; for physical or to &amp;quot;mor&amp;quot; for moral ► (v12.0)&lt;br /&gt;
*&#039;&#039;&#039;MEMBER_ALLOW_CHANGE_OF_TYPE&#039;&#039;&#039; ► Member can edit their type on public subscription page ► (v13.0)&lt;br /&gt;
*&#039;&#039;&#039;ADHERENT_DEFAULT_CREATE_THIRDPARTY&#039;&#039;&#039; ► Thirdparty is created when creating a new member ► (v13.0)&lt;br /&gt;
*&#039;&#039;&#039;MEMBER_SUBSCRIPTION_SUGGEST_END_OF_MONTH&#039;&#039;&#039; ► If set to 1, the member subscription end date will be suggested for the end of the month ► (v18.0)&lt;br /&gt;
*&#039;&#039;&#039;MEMBER_SUBSCRIPTION_SUGGEST_END_OF_YEAR&#039;&#039;&#039; ► If set to 1, the member subscription end date will be suggested for the end of the year ► (v18.0)&lt;br /&gt;
*&#039;&#039;&#039;MAIN_NB_OF_YEAR_IN_MEMBERSHIP_WIDGET_GRAPH&#039;&#039;&#039; ► If set, it limits the number of years visible on graph and widgets of membership (empty is default value to show all) ► (v18.0)&lt;br /&gt;
*&#039;&#039;&#039;MEMBER_NO_SYNC_LINKED_THIRDPARTY ►&#039;&#039;&#039; If set, changes to a member will not be synchronized to a linked third party. ► (v23.0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[#Top|(back to top)]]&lt;br /&gt;
&lt;br /&gt;
=Accounting Module=&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;ACCOUNTANCY_COMBO_FOR_AUX&#039;&#039;&#039; ► Add graphic option for ACCOUNTANCY_COMBO_FOR_AUX. Having this option on may slow down and even freeze the accounting features if you have a very large number of thirdparties ► (v10.0)&lt;br /&gt;
*&#039;&#039;&#039;ACCOUNTING_DEFAULT_NOT_NOTIFIED_VALIDATION_DATE&#039;&#039;&#039; ► Avoid validating the lines with the accountancy export.(1= box unchecked by default / 0 = box checked by default) ► (v14.0)&lt;br /&gt;
*&#039;&#039;&#039;ACCOUNTING_DEFAULT_NOT_NOTIFIED_EXPORT_DATE&#039;&#039;&#039; ► Avoid flagging the lines as exported with the accountancy export.(1= box unchecked by default / 0 = box checked by default) ► (v14.0)&lt;br /&gt;
*&#039;&#039;&#039;ACCOUNTANCY_USE_PRODUCT_ACCOUNT_ON_THIRDPARTY ►&#039;&#039;&#039; Add 2 fields on thirdparty card which allow you to set an account for all sells products and an other for all buying products for this customer ► (v14.0)&lt;br /&gt;
*&#039;&#039;&#039;ACCOUNTING_MANAGE_ZERO&#039;&#039;&#039; &#039;&#039;&#039;►&#039;&#039;&#039; Allow to manage char 0 in accounting account (if enabled 1 ≠ 10) ► (v14.0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[#Top|(back to top)]]&lt;br /&gt;
&lt;br /&gt;
=Agenda Module=&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;AGENDA_ALL_CALENDARS&#039;&#039;&#039; ► Change the default view of calendar pages to see all the Agenda&#039;s (instead or yours only be default)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;AGENDA_AUTOSET_END_DATE_WITH_DELTA_HOURS&#039;&#039;&#039; ► To automatically set end date of event to start date + delta on event creation page.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;AGENDA_DISABLE_LOCATION&#039;&#039;&#039; ► Disable location field in action card  ► (&amp;gt;=v5.0)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;AGENDA_MAX_EVENTS_DAY_VIEW&#039;&#039;&#039; ► Define the maximum number of visible entries for each day in agenda. Default value is 3. Value 0 means no limit.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;AGENDA_USE_EVENT_TYPE&#039;&#039;&#039; ► Add a mandatory field &amp;quot;Type&amp;quot; when creating an event (&#039;&#039;&#039;&#039;&#039;deprecated&#039;&#039;&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_ADD_EVENT_ON_ELEMENT_CARD&#039;&#039;&#039; ► Allow to create an event from a document (proposal, order, invoice)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;AGENDA_SUPPORT_PRIORITY_IN_EVENTS&#039;&#039;&#039; ► Allow to have priorities in events ► (&amp;gt;=v13.0)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;AGENDA_ADDACTIONFORPHONE&#039;&#039;&#039; ► Allow you to create a event from phone number ► (=&amp;lt;v12.0) - Need to be fix for (=&amp;gt;v12.0) https://github.com/Dolibarr/dolibarr/issues/22720&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;AGENDA_ADDACTIONFOREMAIL&#039;&#039;&#039; ► Allow you to create a event from Email ► (=&amp;lt;v12.0) - Need to be fix for (=&amp;gt;v12.0) https://github.com/Dolibarr/dolibarr/issues/22720&lt;br /&gt;
*&#039;&#039;&#039;MAIN_ACTIONCOM_CAN_ADD_ANY_CONTACT&#039;&#039;&#039; ► Allow you to add any contact on events if set at 1a https://github.com/Dolibarr/dolibarr/releases/tag/18.0.0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[#Top|(back to top)]]&lt;br /&gt;
=Bank Module=&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;BANK_CAN_RECONCILIATE_CASHACCOUNT&#039;&#039;&#039; ► Can reconciliate cash accounts ► (v3.8)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;BANK_DISABLE_CHECK_DEPOSIT&#039;&#039;&#039; ► Disable check deposit feature&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;BANK_ASK_PAYMENT_BANK_DURING_ORDER&#039;&#039;&#039; ► Ask bank account during creation of an order&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;BANK_ASK_PAYMENT_BANK_DURING_PROPOSAL&#039;&#039;&#039; ► Ask bank account during creation of a proposal&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;BANK_USE_OLD_VARIOUS_PAYMENT&#039;&#039;&#039; ► To allow to enter miscellaneous payments (not covered by other modules) using old method. &#039;&#039;&#039;&#039;&#039;Deprecated&#039;&#039;&#039;&#039;&#039;. Entering various payment is preferred ► (&amp;lt;=v12.0).&lt;br /&gt;
*&#039;&#039;&#039;MAIN_IBAN_IS_NEVER_MANDATORY&#039;&#039;&#039; ► IBAN and BIC informations not mandatory. (V15)&lt;br /&gt;
&lt;br /&gt;
[[#Top|(back to top)]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=BOM and MO Module=&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;ALLOW_USE_KITS_INTO_BOM_AND_MO&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;BOM_SUB_BOM&#039;&#039;&#039; ►Allow to add a BOM in another BOM►(v16.0)&lt;br /&gt;
&lt;br /&gt;
[[#Top|(back to top)]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Bookmarks Module=&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;BOOKMARKS_SHOW_IN_MENU&#039;&#039;&#039; ► Numbers of bookmark entries to be displayed (10 by default)&lt;br /&gt;
&lt;br /&gt;
[[#Top|(back to top)]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Inalterable Log Module=&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;BLOCKEDLOG_ADD_ACTIONS_SUPPORTED&#039;&#039;&#039; ► Can complete list of triggered action that are logged&lt;br /&gt;
*&#039;&#039;&#039;BLOCKEDLOG_USE_REMOTE_AUTHORITY&#039;&#039;&#039; ► URL of the remote authority for the blockchain&lt;br /&gt;
&lt;br /&gt;
[[#Top|(back to top)]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Category-Tags Module=&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;CATEGORY_SHOW_COUNTS&#039;&#039;&#039; ► Shows nb of object by tags in tag tree&lt;br /&gt;
*&#039;&#039;&#039;CATEGORY_EDIT_IN_MENU_NOT_IN_POPUP ►&#039;&#039;&#039; Display categories menu instead of managing it only from &amp;quot;Tools&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[#Top|(back to top)]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Contracts=&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;CONTRACT_SUPPORT_PRODUCTS&#039;&#039;&#039; ► Products are also suggested into module contract.&lt;br /&gt;
*&#039;&#039;&#039;CONTRACT_ALLOW_EXTERNAL_DOWNLOAD&#039;&#039;&#039; ► When a PDF is generated, a share key is automatically set so the file can be downloaded using the share key. ► (v7.0+)&lt;br /&gt;
*&#039;&#039;&#039;CONTRACT_HIDE_PLANNED_DATE_ON_PDF&#039;&#039;&#039; ► allows you to not display dates on pdf files.&lt;br /&gt;
*&#039;&#039;&#039;CONTRACT_HIDE_REAL_DATE_ON_PDF&#039;&#039;&#039; ► allows you to not display dates on pdf files.&lt;br /&gt;
*&#039;&#039;&#039;CONTRACT_HIDE_PRICE_ON_PDF&#039;&#039;&#039; ► allows you to not display price on pdf files.&lt;br /&gt;
*&#039;&#039;&#039;CONTRACT_HIDE_QTY_ON_PDF&#039;&#039;&#039; ► allows you to not quantity dates on pdf files.&lt;br /&gt;
*&#039;&#039;&#039;CONTRACT_SHOW_SIGNATURE_STATUS_WITH_SERVICE_STATUS&#039;&#039;&#039; ► Show signature status in contract card (Sign by all parties).► (v21.0+)&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[#Top|(back to top)]]&lt;br /&gt;
&lt;br /&gt;
=Cron module=&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;CRON_DISABLE_KEY_CHANGE&#039;&#039;&#039; ► When you provide an instance to a customer, you probably also add an entry in the cron of this user so Dolibarr batch and scheduler can work correctly. For security purpose, it may have a security key that is inside the command line into the cron entry and this entry must match the value defined into Dolibarr setup (setup of module &#039;Scheduled Jobs&#039;). Because, a customer of a Saas platform will probably have no access to edit the cron file, it is also import that he has no way to edit the key into the Dolibarr setup, so the key in the cron command line will always match the key in Dolibarr setup, and the Dolibarr batches will executed without security errors. To be sure, the customer does not change the value, you can set this constant to 1 into the table [[Table_llx_const]].&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;CRON_DISABLE_TUTORIAL_CRON&#039;&#039;&#039; ► Disable the tutorial about how to install the cron script (on a SaaS hosting, this should be done by the web hosting provider)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;CRON_WARNING_DELAY_HOURS&#039;&#039;&#039; ► Set this value to the frequency set for the cron script (so a warning will be shown to user to warn it about max frequency of its scheduled jobs)&lt;br /&gt;
&lt;br /&gt;
[[#Top|(back to top)]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Direct Debit Orders=&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;WITHDRAWAL_ALLOW_ANY_INVOICE_STATUS&#039;&#039;&#039; ► If this option is set, all invoices status (even already paid) may appear on the list of invoices qualified for a direct debit payment. This is the list of invoices with a payment request done, and not linked to a direct debit payment. By default, only &amp;quot;unpayed&amp;quot; invoices are used to avoid to pay twice the same invoice.&lt;br /&gt;
&lt;br /&gt;
[[#Top|(back to top)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Donation Module=&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;DONATION_USE_THIRDPARTIES&#039;&#039;&#039; ► If this option is set, a thirdparty field appear on donation forms.&lt;br /&gt;
&lt;br /&gt;
[[#Top|(back to top)]]&lt;br /&gt;
=Email=&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_COPY_FILE_IN_EVENT_AUTO&#039;&#039;&#039; ► Add attachment document on event auto generated by sending email from dolibarr. ► (v6.0+)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_EMAIL_USE_LAYOUT&#039;&#039;&#039;► Enable the use of predefined layout when writing an email.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_MAILFORM_DISABLE_ENTERKEY&#039;&#039;&#039; ► Activate JavaScript code to disable the enter key in the MAIL form. ► (&amp;gt;= 8.0.1)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_MAIL_DEBUG&#039;&#039;&#039; ► Write content with header of last mail into file &amp;lt;code&amp;gt;dolibarr_mail.log&amp;lt;/code&amp;gt; into directory &amp;lt;code&amp;gt;dolibarr_main_data_root&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_MAIL_DEBUG_ERR_WITH_DATE&#039;&#039;&#039; ► Use a different filename (by adding a prefix of date) for each email sent with error when MAIN_MAIL_DEBUG.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_MAIL_DEBUG_LOG_WITH_DATE&#039;&#039;&#039; ► Use a different filename (by adding a prefix of date) to log each email sent (whatever is result) when MAIN_MAIL_DEBUG.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_MAIL_FORCE_FROM&#039;&#039;&#039; ► (v19+) Can force the value into the From field of the SMTP header. Note that email sender is always saved into the &amp;quot;Reply-To&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_MAIL_ALLOW_SENDMAIL_F&#039;&#039;&#039; ► On Linux or BSD system, PHP email function use the command sendmail local to server. In some cases, the sender email must be provided on command line of sendmail with option &amp;lt;code&amp;gt;-f&amp;lt;/code&amp;gt;. This option is here to ask Dolibarr to call the function mail of PHP by adding value for the option &amp;lt;code&amp;gt;-f&amp;lt;/code&amp;gt;. Note that in most cases, even with sendmail, sender email is correctly managed as it is added in the email technical header. This option is here only for setup or version of sendmail that ask the -f option to be mandatory or for sendmail setup that does not use by default the From of the header email to define the sender (with this option, the from can be forced on command line to avoid to have the from lost by sendmail).&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_MAIL_SENDMAIL_FORCE_BA&#039;&#039;&#039; ► On Linux or BSD system, PHP email function use the command sendmail local to server. In some case, we want to recipient to be provided to sendmail into the email content instead of its command line parameter. For this we must add the -ba parameter to sendmail. This option asks PHP to provide this parameter when sending a mail. Note that another solution is to edit the mail.force_extra_parameters=-ba into &amp;lt;code&amp;gt;php.ini&amp;lt;/code&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_MAIL_NO_FULL_EMAIL&#039;&#039;&#039; ► Recipient email and sender are cleaned to be on form &amp;quot;&amp;lt;email&amp;gt;&amp;quot; instead of &amp;quot;Name &amp;lt;email&amp;gt;&amp;quot;. This might solve problem of compatibility with very old mailers.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_FIX_FOR_BUGGED_MTA&#039;&#039;&#039; ► Some MTA agent are bugged and add some CR chars each time they saw a LF. Because Dolibarr emails are forged to be already cleaned, if MTA agent do that, you will send an email with two CR chars. This may result in having recipient not able to read your email. To fix this, add this constant to 1. Dolibarr will then create an email that is not RFC compliant, but because the MTA agent is bugged, the email will be modified and become correct during sending, solving the problem of bad email received. Add this constant to 1 if your recipient experience problems when opening email for example users using webmail of &amp;lt;code&amp;gt;orange.fr&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;hotmail.com&amp;lt;/code&amp;gt;. Note that some users have reported that when using Exim (Exim 4), you must set this parameter to 0. Default value is 1 but may be changed to 0 in future.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_MAIL_DO_NOT_USE_SIGN&#039;&#039;&#039; ► Do not add user signature at end of suggested pre-defined email&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_MAIL_FORCE_NOT_SENDING_TO&#039;&#039;&#039; ► If en email is defined into this variable, emails will never be sent to this email.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIL_FORCE_DELIVERY_RECEIPT_INVOICE&#039;&#039;&#039; ► Set default as &amp;quot;Yes&amp;quot; on requesting delivery receipt when sending email through the &#039;&#039;Customer Invoice&#039;&#039; module.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIL_FORCE_DELIVERY_RECEIPT_ORDER&#039;&#039;&#039; ► Set default as &amp;quot;Yes&amp;quot; on requesting delivery receipt when sending email through the &#039;&#039;Customer Order&#039;&#039; module.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIL_FORCE_DELIVERY_RECEIPT_PROPAL&#039;&#039;&#039; ► Set default as &amp;quot;Yes&amp;quot; on requesting delivery receipt when sending email through the &#039;&#039;Customer Proposal&#039;&#039; module.&lt;br /&gt;
*&#039;&#039;&#039;MAIL_FORCE_DELIVERY_RECEIPT_SUPPLIER_PROPOSAL&#039;&#039;&#039; ► Set default as &amp;quot;Yes&amp;quot; on requesting delivery receipt when sending email through the &#039;&#039;Supplier Proposal&#039;&#039; module.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_EMAIL_SUPPORT_ACK ►&#039;&#039;&#039; Restore email acknowledgment checkbox on sending emails. This feature is commonly abandoned by mailers. Active from Dolibarr V17 - see [https://github.com/Dolibarr/dolibarr/blob/33744f74da1a5c20f8aa9950018ab4e549e00205/ChangeLog#L53 changelog]&lt;br /&gt;
*&#039;&#039;&#039;MAIN_EMAIL_USECCC&#039;&#039;&#039; ► 1 = Shows field BCC into email forms, If value is an email = Shows the BCC pre filled with the email value.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_MAIL_AUTOCOPY_PROPOSAL_TO&#039;&#039;&#039;, &#039;&#039;&#039;MAIN_MAIL_AUTOCOPY_ORDER_TO&#039;&#039;&#039;, &#039;&#039;&#039;MAIN_MAIL_AUTOCOPY_INVOICE_TO&#039;&#039;&#039;, &#039;&#039;&#039;MAIN_MAIL_AUTOCOPY_SHIPMENT_TO&#039;&#039;&#039;, &#039;&#039;&#039;MAIN_MAIL_AUTOCOPY_..._TO&#039;&#039;&#039; ► Email to use as a BCC recipient when sending email for proposal, order or invoice. You can make this value visible by setting MAIN_EMAIL_USECCC (to 1 or to another email, see previous point)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_EMAIL_ADD_TRACK_ID&#039;&#039;&#039; ► When value is 1 (this is also default value if option is not set): The record &amp;quot;Message-id&amp;quot; added into smtp header includes a tracking id to define where the email was sent from. When value is 2: you send an email from third party card, the sender email is completed with the email source tracking string  &amp;quot;+thiXXX&amp;quot; on email (your email will be sent with the &amp;quot;From&amp;quot; that is myname+thi123@mycompany.com). So when user receiving email will make &amp;quot;Answer&amp;quot;, email will be sent to myname@mycompany.com but with the tracking id included (into header or into target email), allowing you to know to which third party or object, the email exchange is related to.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIL_MAX_NB_OF_RECIPIENTS_IN_SAME_EMAIL&#039;&#039;&#039; ► Restrict sending of 1 email message to &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; recipients for same email message (x for To: + CC: + BCC:). If not defined, value is &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt;. Required to fight against spamming that include 1000 recipients in 1 message. Note that &#039;&#039;&#039;MAIL_MAX_NB_OF_RECIPIENTS_TO_IN_SAME_EMAIL&#039;&#039;&#039;, &#039;&#039;&#039;MAIL_MAX_NB_OF_RECIPIENTS_CC_IN_SAME_EMAIL&#039;&#039;&#039; and &#039;&#039;&#039;MAIL_MAX_NB_OF_RECIPIENTS_BCC_IN_SAME_EMAIL&#039;&#039;&#039; are also available.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_MAIL_FORCE_CONTENT_TYPE_TO_HTML&#039;&#039;&#039; ► Force to send all email (event with text only content) as HTML formatted email.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_MAIL_USE_MULTI_PART&#039;&#039;&#039; ► Forge email content using an alternate text part ► (for 5.0.2+). By default with 6.0+&lt;br /&gt;
*&#039;&#039;&#039;MAIN_INFO_SOCIETE_MAIL_ALIASES&#039;&#039;&#039; ► add address aliases for the from field on mail. Set his value with &amp;quot;Firstname Name &amp;lt;firstname.lastname@mydomain.tld, Otherfirstname OtherlastName &amp;lt;othermail@mydomain.tld&amp;gt;,...&amp;quot; ► (v5.0.0+)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_MAIL_ADD_INLINE_IMAGES_IF_IN_MEDIAS&#039;&#039;&#039; ► If images were stored into the medias directory from CKEditor, then images into emails are replaced with &amp;quot;inline content&amp;quot;. This may increase seriously risk of being detected as SPAM.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_EXTERNAL_SMTP_CLIENT_IP_ADDRESS&#039;&#039;&#039; ► (A better name of this option should be MAIN_EXTERNAL_MAIL_CLIENT_IP_ADDRESS). Set here the list of IPs where your Dolibarr instances are hosted. You can also set the URLs where to get the IP addresses, for exemple: &amp;quot;https://ipv4.urltoshowip.com/_service_showmyip.php,https://ipv6.urltoshowup.com/_service_showmyip.php. So when your customer go into the setup area of email:&lt;br /&gt;
**If he chose mail method, a message will explain him how to setup its SPF record for its email domain (showing the list of IP). This is to avoid to have its emails, sent from its Dolibarr instance, fails due to strict antispam rule of some emailing servers.&lt;br /&gt;
**If he chose smtp method, a message will explain him the list of IP he can use if there is restriction on IP by the SMTP agent. If you also need to add a message to help SPF setup, see option &#039;&#039;&#039;MAIN_EXTERNAL_SMTP_SPF_STRING_TO_ADD&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_IMAP_USE_PHPIMAP&#039;&#039;&#039; ► Use embedded PHP-imap library (not using the native php imap) instead of native php imap extension ► (v17.0+, available as official option in setup of emailcollector by default from v19)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_MAIL_ENABLED_USER_DEST_SELECT&#039;&#039;&#039; ► Show also internal users into list of recipients of email in email sending form ► (v8.0+)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIL_PREFIX_FOR_EMAIL_ID&#039;&#039;&#039; ► Prefix for the mails ID. Default value is &amp;lt;code&amp;gt;$_SERVER[&amp;quot;SERVER_NAME&amp;quot;]&amp;lt;/code&amp;gt; ► (&amp;gt;= 8.0.1)&lt;br /&gt;
*&#039;&#039;&#039;MAIL_MASS_ACTION_SEARCH_MOST_RECENT_FILE_IF_NOT_FOUND&#039;&#039;&#039; ► When sending an email from a mass action. If the path saved in DB does not point to an existing file, then search for the most recent file and use it as an attahcment.► (&amp;gt;= 24.0.0)&lt;br /&gt;
&lt;br /&gt;
[[#Top|(back to top)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Emailing Module=&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAILING_PREFIX_FOR_EMAIL_ID&#039;&#039;&#039; ► Set the value that will be used to compose the &amp;quot;Email ID&amp;quot; into email headers. If you set this value to &#039;&amp;lt;code&amp;gt;SERVER_NAME&amp;lt;/code&amp;gt;&#039;, the virtual host of web server will be used. By default, this is not defined, so a hash key, unique to each instance, is used.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAILING_NO_USING_PHPMAIL&#039;&#039;&#039; ► If set, the module emailing can&#039;t be used with mail setup of &amp;quot;phpmail&amp;quot;. Using a thirdparty SMTP server is required. You can complete warning message by adding an email to contact for setup help with constant &amp;lt;code&amp;gt;&#039;&#039;&#039;MAILING_SMTP_SETUP_EMAILS_FOR_QUESTIONS&#039;&#039;&#039;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAILING_SMTP_SETUP_EMAILS_FOR_QUESTIONS&#039;&#039;&#039; ► Contains the email of contact to show into the message visible to a user when he try to use emailing module without SMTP server and if option &#039;&#039;&#039;MAILING_NO_USING_PHPMAIL&#039;&#039;&#039; is set to on.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAILING_LIMIT_WARNING_PHPMAIL&#039;&#039;&#039; ► Show a warning message (var contains the &#039;&#039;&#039;message to show&#039;&#039;&#039;, or &#039;&#039;&#039;translation key&#039;&#039;&#039;) on emailing send form if setup is on &amp;quot;phpmail&amp;quot;. Note: The application always try to translate the message considering the message is a translation key, before showing the translation or message if translation was not found.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAILING_LIMIT_WARNING_NOPHPMAIL&#039;&#039;&#039; ► Show a warning message (var contains the &#039;&#039;&#039;message to show&#039;&#039;&#039;, or &#039;&#039;&#039;translation key&#039;&#039;&#039;) on emailing send form if setup is something else than &amp;quot;phpmail&amp;quot;. Note: The application always try to translation the message considering the message is a translation key, before showing the translation or message if translation was not found.&lt;br /&gt;
*&#039;&#039;&#039;EMAILING_USE_ADVANCED_SELECTOR&#039;&#039;&#039; ► Enable the advanced selector for recipients.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAILING_LIMIT_SENDBYWEB&#039;&#039;&#039; ► Restrict number of emails you can send in same sending session with emailing module from GUI. The value &amp;quot;&amp;lt;code&amp;gt;dolibarr_mailing_limit_sendbyweb&amp;lt;/code&amp;gt;&amp;quot; if defined into config file is used in priority for this limit. A negative value means, sending by web is forbidden.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAILING_LIMIT_SENDBYCLI&#039;&#039;&#039; ► Restrict number of emails you can send in same sending session with emailing module from CLI script. The value &amp;quot;&amp;lt;code&amp;gt;dolibarr_mailing_limit_sendbycli&amp;lt;/code&amp;gt;&amp;quot; if defined into config file is used in priority for this limit.&lt;br /&gt;
&lt;br /&gt;
[[#Top|(back to top)]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Expense Report=&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;EXPENSEREPORT_ALLOW_OVERLAPPING_PERIODS&#039;&#039;&#039; ► Can enter several expense reports on same or overlapping date periods. ► (v7.0+)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;EXPENSEREPORT_OVERRIDE_VAT&#039;&#039;&#039; ► Setting this constant to 1 will allow expense reports to show VAT even if the global VAT setting is off ► (v10.0)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;EXPENSEREPORT_USE_OLD_NUMBERING_RULE&#039;&#039;&#039; ► The module Expense Report use numbering rules that you can setup (like other modules do). If you need to keep the hard-coded numbering rule of expenses report used in v6.0 set this constant to 1 ► (&amp;gt;=v7.0+)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_USE_EXPENSE_IK&#039;&#039;&#039; ► This feature allows you to set index kilometres against a mileage index for different types of vehicles. ► (v7.0+)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_USE_EXPENSE_RULE&#039;&#039;&#039; ► This feature allows you to set a variety of rules per user/group/all so they can only create reports within their limits. ► (v7.0+)&lt;br /&gt;
&lt;br /&gt;
[[#Top|(back to top)]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Export Module=&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;EXPORT_CSV_SEPARATOR_TO_USE&#039;&#039;&#039; ► String value to use as default separator to delimit fields of exported files (by default Dolibarr uses &amp;quot;&amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt;&amp;quot;). Example: EXPORT_CSV_SEPARATOR_TO_USE=&amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;EXPORT_CSV_FORCE_CHARSET&#039;&#039;&#039; ► Choose the charset used in the output file built by the CSV exporter. By default it is ISO-8859-1. Example: EXPORT_CSV_FORCE_CHARSET= &amp;lt;code&amp;gt;utf-8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;EXPORTTOOL_CATEGORIES&#039;&#039;&#039; ► Can export categories (several lines) into one column with the &amp;quot;product export profile&amp;quot;&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;USE_STRICT_CSV_RULES&#039;&#039;&#039; ► Use strict/real CSV format for export. Do not clean/replace CR+LF with &#039;\n&#039; but quote them using the escaping CSV char (&amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt;).&lt;br /&gt;
*&#039;&#039;&#039;EXPORTS_SHARE_MODELS&#039;&#039;&#039;  ► Share export models between users.&lt;br /&gt;
&lt;br /&gt;
[[#Top|(back to top)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Foundation Module=&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MEMBER_URL_REDIRECT_SUBSCRIPTION&#039;&#039;&#039; ► Link called and shown when a member account is autocreated in member module by a guest user.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MEMBER_EXT_URL_SUBSCRIPTION_INFO&#039;&#039;&#039; ► Link of external page pointed by the &amp;quot;Show here&amp;quot; link added in front of payment cell, into the page to make online subscription.&lt;br /&gt;
&lt;br /&gt;
[[#Top|(back to top)]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
=Holiday Module=&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;HOLIDAY_HIDE_BALANCE&#039;&#039;&#039; ► Hide the user&#039;s vacation balance on the vacation request page&lt;br /&gt;
&lt;br /&gt;
[https://wiki.dolibarr.org/Setup_Other#Top (back to top)]&lt;br /&gt;
=Interventions Module=&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;FICHINTER_CLASSIFY_BILLED&#039;&#039;&#039;► Allow to classify an intervention card as &amp;quot;Billed&amp;quot;. This add also trigger &amp;lt;code&amp;gt;FICHINTER_CLASSIFY_BILLED&amp;lt;/code&amp;gt; into list of possible automatic event into agenda.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;FICHINTER_DISABLE_DETAILS&#039;&#039;&#039;► Disable entry of detail lines on intervention. Can validate with no line. Only one line will be shown per intervention on list.&lt;br /&gt;
**If set to &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; details are disabled only on intervention list ► (v21.0+)&lt;br /&gt;
&lt;br /&gt;
[[#Top|(back to top)]]&lt;br /&gt;
&lt;br /&gt;
=Invoice Module=&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_DEPOSIT_MULTI_TVA&#039;&#039;&#039; ► In deposits invoice, creates one line per VAT rate from the origin document ► (6.0)&lt;br /&gt;
*&#039;&#039;&#039;PDF_INVOICE_SHOW_PRICE_INCL_TAX&#039;&#039;&#039; ► In customer&#039;s invoice, add a column with the total including all taxes  ►&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;INVOICE_ALLOW_REUSE_OF_CREDIT_WHEN_PARTIALLY_REFUNDED&#039;&#039;&#039; ► If a credit note was partially refunded (a refund was sent to the customer), with common situation, we wait to have the remain refunded too. With this option, it is possible to convert the remain of invoice into a discount to reuse it into another invoice.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;SUPPLIER_INVOICE_ALLOW_REUSE_OF_CREDIT_WHEN_PARTIALLY_REFUNDED&#039;&#039;&#039; ► See INVOICE_ALLOW_REUSE_OF_CREDIT_WHEN_PARTIALLY_REFUNDED, but for supplier credit notes.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;INVOICE_CAN_BE_EDITED_EVEN_IF_PAYMENT_DONE&#039;&#039;&#039; ► Allow to edit invoices even if payment was started. Note: If the module &amp;quot;BlockedLog&amp;quot; is active (required in some countries for legal reasons), this will not change content of archived logs tracked by this module. By definition there is no way to change or remove archived records. It will just update data in your application and a new record to track your change  will be recorded into the archive log.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;INVOICE_CAN_ALWAYS_BE_REMOVED&#039;&#039;&#039; ► Allow to always delete invoices (even if invoice is not last one). Note: If the module &amp;quot;BlockedLog&amp;quot; is active (required by some countries for legal reason), this will not change content of archived logs tracked by this module. By definition there is no way to change or remove archived records. It will just update data in your application and a new record to track your change into the read-only archive log.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;INVOICE_CAN_NEVER_BE_EDITED&#039;&#039;&#039; ► Never allow to edit invoices (except draft invoices with ref like (PROV%)). See also INVOICE_CAN_NEVER_BE_REMOVED.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;INVOICE_CAN_NEVER_BE_REMOVED&#039;&#039;&#039; ► Never allow to delete invoices (except draft invoices with ref like (PROV%)). See also INVOICE_CAN_NEVER_BE_EDITED&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;INVOICE_POSITIVE_CREDIT_NOTE&#039;&#039;&#039; ► All amounts on PDF credit notes are positive.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;FACTURE_DEPOSITS_ARE_JUST_PAYMENTS&#039;&#039;&#039; ► An old way to create initial payment. This treats deposit invoices as a special case and not as legal deposit invoice. Deposit invoices don&#039;t get counted on turnover. They are then applied as a payment, like a discount, on the final invoice. By default, when you include the deposit into draft of final invoice, the amount of final invoice is reduced. With this option, final amount is not reduced but a payment is registered. WARNING: In a lot of european countries, using this option is not allowed.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;FACTURE_SENDBYEMAIL_FOR_ALL_STATUS&#039;&#039;&#039; ► Can send invoice by email to customer even if invoice has status &amp;quot;draft&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;INVOICE_CREDIT_NOTE_STANDALONE&#039;&#039;&#039; ► Start implementation to allow a credit note even without invoice (dangerous) ► (v3.9)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;INVOICE_USE_SITUATION&#039;&#039;&#039; ► 1=Enable the &amp;quot;situation invoice&amp;quot; feature. Warning, this feature is bugged and may not be compatible with the final version of the feature once the bug will be solved. Also, using the double-entry accountancy module is not possible when this option is on (due to the same design problem). 2=Enable the &amp;quot;situation invoice&amp;quot; feature with a rewrite. This mode should be better to become a future stable feature.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;INVOICE_USE_SITUATION_CREDIT_NOTE&#039;&#039;&#039; ► Enable the &amp;quot;situation credit note&amp;quot; feature (need &amp;lt;code&amp;gt;INVOICE_USE_SITUATION&amp;lt;/code&amp;gt;) ► (v8.0)&lt;br /&gt;
*&#039;&#039;&#039;INVOICE_USE_RETAINED_WARRANTY&#039;&#039;&#039; ► Enable the retained warranty on invoice ► (v14.0)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;INVOICE_DISABLE_DEPOSIT&#039;&#039;&#039; ► Disable deposit invoices&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;INVOICE_DISABLE_REPLACEMENT&#039;&#039;&#039; ► Disable replacement invoices&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;INVOICE_DISABLE_CREDIT_NOTE&#039;&#039;&#039; ► Disable credit notes&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;bdi&amp;gt;&#039;&#039;&#039;INVOICE_ADD_EXTRAFIELD_IN_NOTE&#039;&#039;&#039; ► Add extrafields in note for canelle template ► (v17.0+)&amp;lt;/bdi&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;INVOICE_DEFAULT_NOTE_PUBLIC&#039;&#039;&#039; &amp;lt;bdi&amp;gt;► Default text in public note&amp;lt;/bdi&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: To decode a QR image of a ZATCA code: https://www.onlinebarcodereader.com/. You can also use the mobile application https://play.google.com/store/apps/details?id=com.posbankbh.einvoiceqrreader&amp;amp;gl=FR&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_GENERATE_DOCUMENTS_WITHOUT_VAT&#039;&#039;&#039; ► See PDF option&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_GENERATE_DOCUMENTS_WITHOUT_VAT_COLUMN&#039;&#039;&#039; ► See PDF options&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;WORKFLOW_BILL_ON_SHIPMENT&#039;&#039;&#039; ► Change label of button with suitable label when you need to create invoice on shipments&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;INVOICE_ALLOW_EXTERNAL_DOWNLOAD&#039;&#039;&#039; ► When a PDF is generated, a share key is automatically set so the file can be downloaded using the share key. Use the tag __DIRECTDOWNLOAD_URL_INVOICE__ in email template to insert it. ► (v7.0+)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;INVOICE_POINTOFTAX_DATE&#039;&#039;&#039; ► Add Point of Tax Date on invoices for country-specific legality reasons ► (v4.0+)&lt;br /&gt;
*&#039;&#039;&#039;FACTURE_ENABLE_NEGATIVE&#039;&#039;&#039; ► Can validate an invoice when amount is negative&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;FACTURE_ENABLE_NEGATIVE_LINES&#039;&#039;&#039; ► Allows to add negative lines to an invoice ► (v8.0.2+)&lt;br /&gt;
*&#039;&#039;&#039;SUPPLIER_INVOICE_ENABLE_NEGATIVE&#039;&#039;&#039; ► Can validate an supplier invoice when amount is negative ► (V21 ?)&lt;br /&gt;
*&#039;&#039;&#039;SUPPLIER_INVOICE_ENABLE_NEGATIVE_LINES&#039;&#039;&#039; ► Allows to add negative lines to an supplier invoice ► (V21 ?)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;INVOICE_USE_DEFAULT_DOCUMENT&#039;&#039;&#039; ► Allow user to select a default invoice documents models according to invoice type. On invoice create page, the model is dynamically changed on invoice type selection. ► (v9.0+)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;FACTURE_REUSE_NOTES_ON_CREATE_FROM&#039;&#039;&#039; ► Reuse the Public Note and Private note of the previous object (Proposal,...) when creating the bill.&lt;br /&gt;
*&#039;&#039;&#039;FACTUREFOURN_REUSE_NOTES_ON_CREATE_FROM&#039;&#039;&#039; ► Reuse the Public Note and Private note of the previous object when creating the supplier bill ► (V13.0)&lt;br /&gt;
*&#039;&#039;&#039;MAIN_SHOW_FACNUMBER_IN_DISCOUNT_LIST&#039;&#039;&#039; ► Display the reference of credit notes in discount list when creating the bill.&lt;br /&gt;
*&#039;&#039;&#039;INVOICE_ALLOW_FREE_REF&#039;&#039;&#039; ► Capability to change reference of an invoice. This will be possible as long as the invoice has the status “Draft” and only if your country is not in Europe(V11)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;INVOICE_DISALLOW_REOPEN&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;INVOICE_MAX_FUTURE_DELAY&#039;&#039;&#039; ► Numbers of seconds allowed for billing in the future ► (V14.0)&lt;br /&gt;
*&#039;&#039;&#039;INVOICE_AUTO_NEXT_MONTH_ON_LINES&#039;&#039;&#039; ► Increase start date and end date by one month, if an invoice line is a clone of a time based service AND if this services started on the first day of month and ended on the last day of month ► (V13.0.1)&lt;br /&gt;
*&#039;&#039;&#039;INVOICE_KEEP_DISCOUNT_LINES_AS_IN_ORIGIN&#039;&#039;&#039; ► Does not change a line with a negative price into an absolute discount when creating an invoice ► (V16 ?)&lt;br /&gt;
*&#039;&#039;&#039;INVOICEREC_SET_AUTOFILL_DATE_START&#039;&#039;&#039; and &#039;&#039;&#039;INVOICEREC_SET_AUTOFILL_DATE_END ►&#039;&#039;&#039; Set start and end date to yes for lines of template invoice when created from a draft invoice ► (V16)&lt;br /&gt;
*&#039;&#039;&#039;INVOICE_REC_DATE_TO_YES&#039;&#039;&#039; &#039;&#039;&#039;►&#039;&#039;&#039; Set start and end date to yes by default in add line form for template invoice ► (V16)&lt;br /&gt;
*&#039;&#039;&#039;INVOICE_SUBTYPE_ENABLED&#039;&#039;&#039; ► Extends Dolibarr standard invoice with more invoice types used in some countries. A combo box in the new invoice creation card allows the selection of &amp;quot;subtypes&amp;quot; with values from dictionary &amp;quot;Invoice Subtypes&amp;quot; ► (v19.0+)&lt;br /&gt;
*&#039;&#039;&#039;LIST_OF_QUALIFIED_INVOICES_LIMIT_DEFINED&#039;&#039;&#039; &#039;&#039;&#039;►&#039;&#039;&#039; Perf options to limit list of invoices for &amp;quot;credit note&amp;quot; source (on form &amp;quot;create a credit note&amp;quot;), usable for big quantities of invoices for one customer like you can have with TakePos ► (V22+)&lt;br /&gt;
&lt;br /&gt;
[[#Top|(back to top)]]&lt;br /&gt;
&lt;br /&gt;
=Leave=&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_NON_WORKING_DAYS_INCLUDE_SATURDAY&#039;&#039;&#039; ► Set this value to 0 if you want to have the Saturday as a working day&lt;br /&gt;
*&#039;&#039;&#039;MAIN_NON_WORKING_DAYS_INCLUDE_SUNDAY&#039;&#039;&#039; ► Set this value to 0 if you want to have the Sunday as a working day&lt;br /&gt;
&lt;br /&gt;
=Look or Theme=&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_FAVICON_URL&#039;&#039;&#039; ► favicon url&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_EASTER_EGG_COMMITSTRIP&#039;&#039;&#039; ► Show a comic image from the CommitStrip website. Images are refreshed daily. ► (v6.0+)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_INCLUDE_GLOBAL_STATS_IN_OPENED_DASHBOARD&#039;&#039;&#039; ► This conf will auto remove global stats box item if there are already in the new dashboard of opened elements and keep displayed stats on the opened item box (not only on mouse over) ► (v11.0+)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_USE_TOP_MENU_SEARCH_DROPDOWN&#039;&#039;&#039; ► Actually only for eldy theme, this conf move search input  to top menu and use new design too ► (v11.0+)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;THEME_AGRESSIVENESS_RATIO&#039;&#039;&#039; ► This conf can be used to increase/decrease aggressiveness of colors. Value 0 is medium, value is between -100 (light grey colors) to +100 (very flashy colors) ► (v11.0+)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;THEME_SHOW_BORDER_ON_INPUT&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;MAIN_DISABLE_GLOBAL_WORKBOARD&#039;&#039;&#039; ► Hide the work board of the main page ► (v13.0+)&lt;br /&gt;
*&#039;&#039;&#039;MAIN_DISABLE_GLOBAL_BOXSTATS&#039;&#039;&#039; ► Hide the Statistic Box of the main page&lt;br /&gt;
*&#039;&#039;&#039;ALLOW_THEME_JS ►&#039;&#039;&#039; Allow JS file in theme folder (same name as theme folder)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Manifest (Progressive Web App)=&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_MANIFEST_APPLI_THEME_COLOR ►&#039;&#039;&#039; Theme color for manifest&lt;br /&gt;
*&#039;&#039;&#039;MAIN_MANIFEST_APPLI_BG_COLOR ►&#039;&#039;&#039; Background color  for manifest&lt;br /&gt;
*&#039;&#039;&#039;MAIN_MANIFEST_APPLI_LOGO_URL  ►&#039;&#039;&#039; Logo for manifest&lt;br /&gt;
*&#039;&#039;&#039;MAIN_MANIFEST_APPLI_LOGO_URL_SIZE  ►&#039;&#039;&#039; Logo url size for app (150, 192, 512px) missing 3 configurations&lt;br /&gt;
&lt;br /&gt;
[[#Top|(back to top)]]&lt;br /&gt;
&lt;br /&gt;
=Order Module=&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_MASSACTION_CREATEBILLS_REDIRECT_IF_ONE&#039;&#039;&#039; ► If set 1, redirects to the one bill created from massaction create bills from order list ► (v20.0)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_MASSACTION_CREATEBILLS_REDIRECT_IF_MANY&#039;&#039;&#039; ► If set to 1, redirects to the invoice list after plural invoices where generated from tho massaction create bills from order list  ► (v20.0)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_ORDERLIST_CREATEBILLS_ONEBYTHIRD&#039;&#039;&#039; ► Allow defining value for option &amp;quot;one by thirdparty&amp;quot; in massaction create bills from orders list page (no by default, yes if set to &#039;yes&#039; or 1) ► (v20.0)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_USE_PROPAL_REFCLIENT_FOR_ORDER&#039;&#039;&#039; =&amp;gt; Copy customer reference from proposal to order. ► (v7.0+)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;ORDER_REQUIRE_SOURCE&#039;&#039;&#039; =&amp;gt; Make the input field &amp;quot;Source of order&amp;quot; mandatory.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;ORDER_VALID_AFTER_CLOSE_PROPAL&#039;&#039;&#039; =&amp;gt; When an order is created on a proposal close, the order is directly defined with status &amp;quot;Validated&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;ORDER_ALLOW_EXTERNAL_DOWNLOAD&#039;&#039;&#039; =&amp;gt; When a PDF is generated, a share key is automatically set so the file can be downloaded using the share key. ► (v7.0+)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;ORDER_ENABLE_NEGATIVE&#039;&#039;&#039; =&amp;gt; Can validate an order when amount is negative&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;THIRDPARTY_PROPAGATE_EXTRAFIELDS_TO_ORDER&#039;&#039;&#039; =&amp;gt; Copy also extrafields from thirdparty to order (if name match). ► (v11.0+)&lt;br /&gt;
*&#039;&#039;&#039;ORDER_DEFAULT_NOTE_PUBLIC&#039;&#039;&#039; ► Default text in public note&lt;br /&gt;
*&#039;&#039;&#039;MAIN_REMOVE_DROPDOWN_CREATE_BUTTONS_ON_ORDER&#039;&#039;&#039; =&amp;gt; Remove the create dropdown button on order card (introduce on v19) to come back with old buttons.  &#039;&#039;&#039;►&#039;&#039;&#039; (v20.0+)&lt;br /&gt;
&lt;br /&gt;
[[#Top|(back to top)]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=PDF Options=&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_ADD_PDF_BACKGROUND&#039;&#039;&#039; ► Define this constant with short name of a PDF file (example &amp;quot;&amp;lt;code&amp;gt;mypdf.pdf&amp;lt;/code&amp;gt;&amp;quot;) that must be saved into directory &amp;quot;&amp;lt;code&amp;gt;documents/mycompany&amp;lt;/code&amp;gt;&amp;quot;. This will add PDF as a background of some of your generated PDF files (proposals,invoices,orders). If you need to concat PDF, see instead [[Module Concat PDF]].&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_DISABLE_FORCE_SAVEAS&#039;&#039;&#039; ► If your browser always asks to save downloaded files on disk (like PDF), try this this option. File may be displayed directly in your browser. Values&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: 0= Default (file is auto downloaded), 1= For to output the file into the browser tab, 2= For to output the file into a browser tab open with target_blank&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_DISABLE_PDF_AUTOUPDATE&#039;&#039;&#039; ► Disable automatic generation of PDF each time we add/update/delete a product line (we can still build document by clicking on &amp;quot;Generate&amp;quot;). This option may increase interface speed on servers with low CPU.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_DISABLE_PDF_COMPRESSION&#039;&#039;&#039; ► Disable PDF compression.&lt;br /&gt;
*&#039;&#039;&#039;PDF_ADD_POSITION ►&#039;&#039;&#039; Displays document line numbering on the PDF. Combines with the option. &amp;lt;code&amp;gt;MAIN_VIEW_LINE_NUMBER&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_DOCUMENTS_WITH_PICTURE_WIDTH&#039;&#039;&#039; ► Can change size of picture when hidden option &amp;lt;code&amp;gt;MAIN_GENERATE_PROPOSALS_WITH_PICTURE&amp;lt;/code&amp;gt; is used. By default value is &amp;lt;code&amp;gt;20&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_GENERATE_DOCUMENTS_SHOW_FOOT_DETAILS&#039;&#039;&#039; ► Adding the company address at the bottom of the page. Disabled by default&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_GENERATE_PROPOSALS_WITH_PICTURE&#039;&#039;&#039; ► Include the first image of the product into the line of the generated PDF for customer proposals.&lt;br /&gt;
*&#039;&#039;&#039;MAIN_GENERATE_ORDERS_WITH_PICTURE&#039;&#039;&#039; ► Include the first image of the product into the line of the generated PDF for customer orders.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_GENERATE_INVOICES_WITH_PICTURE&#039;&#039;&#039; ► Include the first image of the product into the line of the generated PDF for customer invoices.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_GENERATE_SUPPLIER_PROPOSAL_WITH_PICTURE&#039;&#039;&#039; ► Include the first image of the product into the line of the generated PDF for supplier proposals ► (v5.0.3+)&lt;br /&gt;
*&#039;&#039;&#039;MAIN_GENERATE_SUPPLIER_ORDER_WITH_PICTURE&#039;&#039;&#039; ► Include the first image of the product into the line of the generated PDF for supplier orders&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_GENERATE_DOCUMENTS_WITHOUT_VAT&#039;&#039;&#039; ► Disable VAT on generated documents. like for an association. (Works with crabe template)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_GENERATE_DOCUMENTS_WITHOUT_VAT_COLUMN&#039;&#039;&#039; ► Hide column with VAT information but only column not total.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_INVERT_SENDER_RECIPIENT&#039;&#039;&#039; ► Invert sender and recipient in some PDF. Note: This option is set automatically if country if Germany.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_ODT_AS_PDF&#039;&#039;&#039; ► Activate ODT to PDF conversion. Value can be &amp;quot;libreoffice&amp;quot; or &amp;quot;unoconv&amp;quot;. Do not use value &#039;&#039;&#039;&amp;lt;nowiki/&amp;gt;&#039;jodconverter&#039;&amp;lt;nowiki/&amp;gt;&#039;&#039;&#039; any more, as it is declared deprecated and partly not functional, use value &#039;&#039;&#039;&amp;lt;nowiki/&amp;gt;&#039;libreoffice&#039;&#039;&#039;&#039; instead, it requires only &#039;&#039;&#039;soffice&#039;&#039;&#039; (OpenOffice or LibreOffice) installed on server (use &#039;&#039;&#039;apt install soffice libreoffice-common libreoffice-writer&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
If you got this error: javaldx failed! Warning: failed to read path from javaldx with no return to prompt when running soffice --headless -env:UserInstallation=file:&amp;quot;/tmp&amp;quot; --convert-to pdf --outdir xxx ./yyy.odt, check that directory defined into env:UserInstallation parameters exists and is writeable.&lt;br /&gt;
&lt;br /&gt;
You may also have a look at this page if your server is on Windows: [[Générer automatiquement des documents PDF à partir de fichier ODT avec Doliwamp]]&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_ODT_AS_PDF_DEL_SOURCE&#039;&#039;&#039; ► For ODT generation. If set, then initial behaviour is conserved but ODT file is removed when option to convert it as PDF (see previous) is on. Disabled by default&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_PDF_FORCE_FONT&#039;&#039;&#039; ► To ignore font defined into language file and force usage of a particular font. For example &amp;quot;&amp;lt;code&amp;gt;DejaVuSans&amp;lt;/code&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_PDF_FORCE_FONT_SIZE&#039;&#039;&#039; ► To force size of font (by default 10). For example &amp;quot;&amp;lt;code&amp;gt;12&amp;lt;/code&amp;gt;&amp;quot; ► (v11.0)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_PDF_FREETEXT_HEIGHT&#039;&#039;&#039; ► Change height of space reserved to output the free text.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_PDF_TITLE_BACKGROUND_COLOR&#039;&#039;&#039; ► Can define a background color onto title line. Example: &amp;lt;code&amp;gt;220,220,200&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_PDF_USE_LARGE_LOGO&#039;&#039;&#039; ► Use the original logo with its higher resolution into the PDF instead of the small thumb. This may lead to very very large PDF !&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_USE_BACKGROUND_ON_PDF&#039;&#039;&#039; ► Define this constant with short name of an image (example &amp;quot;&amp;lt;code&amp;gt;myimage.jpg&amp;lt;/code&amp;gt;&amp;quot;) that must be saved into directory &amp;quot;&amp;lt;code&amp;gt;documents/mycompany/logos&amp;lt;/code&amp;gt;&amp;quot;. This will add this background image into your generated PDF files.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_USE_COMPANY_NAME_OF_CONTACT&#039;&#039;&#039; ► Use contact name and information rather than company&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_PDF_ADDALSOTARGETDETAILS&#039;&#039;&#039; ► If 1, add details of recipient on generated PDFs (email, fax, url and phone). Can be useful in cases where a printed order/invoice etc is given to a delivery driver/courier etc.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_TVAINTRA_IN_SOURCE_ADDRESS&#039;&#039;&#039; ► Show VAT N° in source address of PDF to comply with legalities in certain countries. Note that VAT number should be already visible in footer of page ► (v8.0.1+)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_PDF_PROPAL_USE_ELECTRONIC_SIGNING&#039;&#039;&#039; ► Add optional esign field in pdf propal ► (v8.0+)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_PROFID1_IN_SOURCE_ADDRESS&#039;&#039;&#039; ► Show Professional ID 1 in source address of PDF to comply with legalities in certain countries ► (v8.0.1+)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_PROFID2_IN_SOURCE_ADDRESS&#039;&#039;&#039; ► Show Professional ID 2 in source address of PDF to comply with legalities in certain countries ► (v8.0.1+)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_PROFID3_IN_SOURCE_ADDRESS&#039;&#039;&#039; ► Show Professional ID 3 in source address of PDF to comply with legalities in certain countries ► (v8.0.1+)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_PROFID4_IN_SOURCE_ADDRESS&#039;&#039;&#039; ► Show Professional ID 4 in source address of PDF to comply with legalities in certain countries ► (v8.0.1+)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_PROFID5_IN_SOURCE_ADDRESS&#039;&#039;&#039; ► Show Professional ID 5 in source address of PDF to comply with legalities in certain countries ► (v8.0.1+)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_PROFID6_IN_SOURCE_ADDRESS&#039;&#039;&#039; ► Show Professional ID 6 in source address of PDF to comply with legalities in certain countries ► (v8.0.1+)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;PDF_BANK_HIDE_NUMBER_SHOW_ONLY_BICIBAN&#039;&#039;&#039; ► Hide bank number (&amp;quot;code banque/guichet/compte&amp;quot; for France, &amp;quot;sort code/account number&amp;quot; for GB, ...) and keep only BIC/IBAN on PDF.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;PDF_BOLD_PRODUCT_REF_AND_PERIOD&#039;&#039;&#039; ► Add more visibility (bold) on product ref and period of service in desc. ► (v12.0)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;PDF_HIDE_PRODUCT_REF_IN_SUPPLIER_LINES&#039;&#039;&#039; ► Modify the use/position of Supplier Ref/Internal Ref with the item Label (name) on PDF documents.&lt;br /&gt;
&lt;br /&gt;
Default (constant not set or Value &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;): Internal ref followed by supplier ref in brackets.&amp;quot;COMPANY-REF-001 (Vendor SKU SUPPLIER-REF-001) - LABEL...&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Value &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;: Supplier ref only eg.&amp;quot;SUPPLIER-REF-001 - LABEL...&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Value &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;: Supplier ref followed by internal ref in brackets. eg.&amp;quot;SUPPLIER-REF-001 (InternalRef COMPANY-REF-001) - LABEL...&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;PDF_INCLUDE_ALIAS_IN_THIRDPARTY_NAME&#039;&#039;&#039; ► Include alternative/alias name into name on PDF.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;PDF_SECURITY_ENCRYPTION&#039;&#039;&#039; ► Encrypt PDF produced by dolibarr. See additional parameters&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;:PDF_SECURITY_ENCRYPTION_RIGHTS (block &#039;modify&#039; or &#039;copy&#039;) - &#039;&#039;&#039;PDF_SECURITY_ENCRYPTION_USERPASS&#039;&#039;&#039; - &#039;&#039;&#039;PDF_SECURITY_ENCRYPTION_OWNERPASS&#039;&#039;&#039; (random if not specified) - &#039;&#039;&#039;PDF_SECURITY_ENCRYPTION_STRENGTH&#039;&#039;&#039; (0 = RC4 40 bit; 1 = RC4 128 bit; 2 = AES 128 bit; 3 = AES 256 bit) - &#039;&#039;&#039;PDF_SECURITY_ENCRYPTION_PUBKEYS&#039;&#039;&#039; Array of recipients containing public-key certificates (&#039;c&#039;) and permissions (&#039;p&#039;) - For example: array(array(&#039;c&#039; =&amp;gt; &#039;file://../examples/data/cert/tcpdf.crt&#039;, &#039;p&#039; =&amp;gt; array(&#039;print&#039;))). WARNING: if an &#039;encrypted PDF&#039; provides a protection against manual change done by mistake, it does NOT provide any protection against modification of your PDF in a security point of view: A protected PDF can still be modified by any advanced PDF editors. Don&#039;t forget this: If a software can read the PDF, this software can also rebuild it differently !&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;PDF_SHOW_PROJECT&#039;&#039;&#039; ► Show project onto PDF (supported on supplier order only for the moment)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;PDF_USE_ALSO_LANGUAGE_CODE&#039;&#039;&#039; ► The value of this constant must be a language code (&#039;fr_FR&#039;, &#039;en_US&#039;, &#039;sa_SA&#039;, ...). If set, the PDF document will contains both language (default and the one defined by the constant).&lt;br /&gt;
*&#039;&#039;&#039;DOC_SHOW_FIRST_SALES_REP&#039;&#039;&#039; ► Show the sales representant on header (at least on propal azur and rubis template)&lt;br /&gt;
*&#039;&#039;&#039;MAIN_PDF_DASH_BETWEEN_LINES&#039;&#039;&#039;&lt;br /&gt;
*&lt;br /&gt;
*&#039;&#039;&#039;SHOW_SUBPRODUCT_REF_IN_PDF&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;PDF_HIDE_PRODUCT_LABEL_IN_SUPPLIER_LINES&#039;&#039;&#039; ► hide product label in supplier order lines (V15+)&lt;br /&gt;
*&#039;&#039;&#039;SHIPPING_PDF_DISPLAY_AMOUNT_HT&#039;&#039;&#039; ► Show HT unit price and HT total price for lines of PDF shipment&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_DOCUMENTS_HIDE_DESCRIPTION_FOR_FACTURE&#039;&#039;&#039; ► To Hide product description in Customer Invoice&lt;br /&gt;
*&#039;&#039;&#039;MAIN_DOCUMENTS_HIDE_DESCRIPTION_FOR_COMMANDE&#039;&#039;&#039; ► To Hide product description in Sales Order&lt;br /&gt;
*&#039;&#039;&#039;MAIN_DOCUMENTS_HIDE_DESCRIPTION_FOR_ORDER_SUPPLIER&#039;&#039;&#039; ► To Hide product description in Purchase Order&lt;br /&gt;
*&#039;&#039;&#039;MAIN_DOCUMENTS_HIDE_DESCRIPTION_FOR_INVOICE_SUPPLIER&#039;&#039;&#039; ► To Hide product description in Vendor Invoice&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;PDF_PROPAL_SHOW_PRICE_INCL_TAX&#039;&#039;&#039; ► Display price with tax on Proposal(cyan template) (V17+)&lt;br /&gt;
*&#039;&#039;&#039;PDF_ORDER_SHOW_PRICE_INCL_TAX&#039;&#039;&#039; ► Display price with tax on Order(eratosthene template) (V17+)&lt;br /&gt;
*&#039;&#039;&#039;PDF_INVOICE_SHOW_PRICE_INCL_TAX&#039;&#039;&#039; ► Display price with tax on Invoice(sponge template) (V17+)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;PDF_USE_GETALIASNBPAGE_FOR_TOTAL&#039;&#039;&#039; ► Display the page number alias&lt;br /&gt;
*&#039;&#039;&#039;MAIN_PDF_NO_SENDER_FRAME&#039;&#039;&#039; ► Do not display the &amp;quot;sender&amp;quot; mention&lt;br /&gt;
*&#039;&#039;&#039;MAIN_PDF_HIDE_SENDER_NAME&#039;&#039;&#039; ► Do not display the sender name&lt;br /&gt;
*&#039;&#039;&#039;MAIN_PDF_NO_RECIPENT_FRAME&#039;&#039;&#039; ► Do not display BillTo&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MULTICURRENCY_SHOW_ALSO_MAIN_CURRENCY_ON_PDF&#039;&#039;&#039; ► Show the amount in the 2 currencies on PDF when using the MultiCurrency module&lt;br /&gt;
*&#039;&#039;&#039;MAIN_PDF_DONOTREPEAT_HEAD ►&#039;&#039;&#039; Do not repeat the header of document&lt;br /&gt;
&lt;br /&gt;
[[#Top|(back to top)]]&lt;br /&gt;
&lt;br /&gt;
=Point of Sale (POS)=&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;CASHDESK_SHOW_KEYPAD&#039;&#039;&#039; ► Show a mouse key pad into the &#039;Simple Point of Sale&#039; module.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;POS_ADDON&#039;&#039;&#039; ► Set this value to an existing numbering module rule (for example &#039;&amp;lt;code&amp;gt;mod_facture_terre&amp;lt;/code&amp;gt;&#039;, &#039;&amp;lt;code&amp;gt;mod_facture_mars&amp;lt;/code&amp;gt;&#039;, ...) to force the numbering module to use for invoice ref definition when invoice is created by the POS. For example setting value &amp;lt;code&amp;gt;POS_ADDON&amp;lt;/code&amp;gt; to &#039;&amp;lt;code&amp;gt;mod_facture_terre&amp;lt;/code&amp;gt;&#039; will use the numbering module &#039;&amp;lt;code&amp;gt;terre&amp;lt;/code&amp;gt;&#039; for invoice generated from POS, whatever is the numbering rule defined into invoice module setup (you can also use POS_NUMBERING_TERRE_FORCE_PREFIX and POS_NUMBERING_MARS_FORCE_PREFIX variable to change the prefix used).&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;TAKEPOS_ENABLE_SUMUP&#039;&#039;&#039; ► Enable the compatibility of TakePOS with the card reader terminal [https://SumUp.fr SumUp]&lt;br /&gt;
*&#039;&#039;&#039;TAKEPOS_CAN_FORCE_BANK_ACCOUNT_DURING_PAYMENT&#039;&#039;&#039; ► Possibility to force the bank account during the payment in TakePOS  ► (v13.0)&lt;br /&gt;
*&#039;&#039;&#039;TAKEPOS_CONTROL_CASH_OPENING&#039;&#039;&#039; ► Control the cash opening&lt;br /&gt;
*&#039;&#039;&#039;TAKEPOS_NUMPAD_FORCE_PAYMENT_ICONS_LABELS&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
[[#Top|(back to top)]]&lt;br /&gt;
&lt;br /&gt;
=Products Module=&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;CATEGORY_GRAPHSTATS_ON_PRODUCTS&#039;&#039;&#039; ► Show graph of products with categories and totals in Products Area screen&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_PRODUCT_DISABLE_CUSTOMCOUNTRYCODE&#039;&#039;&#039; ► Avoid customs code and country of origin to be set as product description when added to Propal/Order/Invoice&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;PRODUCT_ADD_TYPE_IN_DOCUMENTS&#039;&#039;&#039; ► Add text &amp;quot;Product&amp;quot; or &amp;quot;Service&amp;quot; at beginning of details lines on built PDF documents.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;PRODUCT_DONOTSEARCH_ANYWHERE&#039;&#039;&#039; ► When Ajax search is enabled, search is done on criteria anywhere in label of product. By adding this option, search is done only on start of label. This is really faster when you have a huge number of products.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_DIRECT_STATUS_UPDATE&#039;&#039;&#039; ► Allows you to change the status of the product (&#039;&#039;for sale/not for sale for purchase/not for purchase&#039;&#039;) directly on the product page via a &#039;&#039;on/off&#039;&#039; switch button. This can be convenient for those who need to quickly disable certain statuses of products without having to go through the editing product page individually. Also can be very useful if used as a filter on the product and product search list. This option doesn&#039;t generate a MODIFY trigger, so be careful with external modules. ► (v4.0+)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_SEARCH_PRODUCT_BY_FOURN_REF&#039;&#039;&#039; ►  Allow to search a product by supplier ref in document&#039;s add line form. ► (&amp;gt;= 8.0)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_DISABLE_FREE_LINES&#039;&#039;&#039; ► Disallow using free lines to add line in documents ► (&amp;gt;= 8.0)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_SHOW_PRODUCT_ACTIVITY_TRIM&#039;&#039;&#039; ► Show Product and Services turnover before for all four quarters tax over recent years recent years on the product area ► (v5.0+)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;PRODUIT_DESC_IN_LIST&#039;&#039;&#039; ► Show long description of product/service into lists.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;PRODUCT_DISABLE_PROPAGATE_CUSTOMER_PRICES_ON_CHILD_COMPANIES&#039;&#039;&#039; ► Disable propagation of prices per customer from a customer to its child company.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;PRODUCT_DISABLE_PUBLIC_URL&#039;&#039;&#039; ► Disable public url in product card ► (v14.0+)&lt;br /&gt;
*&#039;&#039;&#039;PRODUCT_DISABLE_STOCK_LEVELS&#039;&#039;&#039; ► Disable properties of stock limits and desired optimal value on product ► (v14.0+)&lt;br /&gt;
*&#039;&#039;&#039;PRODUCT_DISABLE_NATURE&#039;&#039;&#039; ► Disable nature in product card ► (v14.0+)&lt;br /&gt;
*&#039;&#039;&#039;PRODUCT_DISABLE_WEIGHT&#039;&#039;&#039; ► Disable weight in product card ► (v14.0+)&lt;br /&gt;
*&#039;&#039;&#039;PRODUCT_DISABLE_PRICES&#039;&#039;&#039; ► Disable prices in product card ► (v14.0+)&lt;br /&gt;
*&#039;&#039;&#039;PRODUCT_DISABLE_ACCOUNTING&#039;&#039;&#039;  ► Disable accounting in product card ► (v14.0+)&lt;br /&gt;
*&#039;&#039;&#039;PRODUCT_DISABLE_SIZE&#039;&#039;&#039; ► Disable size in product card.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;PRODUCT_DISABLE_LENGTH&#039;&#039;&#039; ► Disable length in product card ► (v4.0+)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;PRODUCT_DISABLE_SURFACE&#039;&#039;&#039; ► Disable surface in product card. ► (v4.0+)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;PRODUCT_DISABLE_VOLUME&#039;&#039;&#039; ► Disable volume in product card.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;PRODUCT_DISABLE_CUSTOM_INFO&#039;&#039;&#039; ► Disable custom info (custom code and country origin) in product/service card.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;PRODUIT_MULTIPRICES_USE_VAT_PER_LEVEL&#039;&#039;&#039; ► When option to use price per level/segment is on, this allows to also set a dedicated vat for each price level.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;PRODUIT_CUSTOMER_PRICES_BY_QTY&#039;&#039;&#039; ► If price per quantity ► &#039;&#039;Experimental&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;PRODUIT_CUSTOMER_PRICES_BY_QTY_MULTIPRICES&#039;&#039;&#039; ► If price per quantity and customer ► &#039;&#039;Experimental&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;PRODUCT_LOT_ENABLE_QUALITY_CONTROL&#039;&#039;&#039; ► Enable feature (Display fields for life time and quality control duration) for quality control on product and lot&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;PRODUCT_MAX_LENGTH_COMBO&#039;&#039;&#039; ► Limit the length of the label displayed when adding lines in proposals/invoices/orders&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;PRODUCT_MAX_VISIBLE_PHOTO&#039;&#039;&#039; ► Show a maximum number of product photos (as thumbnails) on the product main card. Example, setting this constant to &#039;&amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;&#039; will show the first five product photos found on the product card.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;PRODUIT_PDF_MERGE_PROPAL&#039;&#039;&#039; ► Enable module Propal merge product PDF&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;PRODUCT_USE_OLD_PATH_FOR_PHOTO&#039;&#039;&#039; ► Ask dolibarr to check also old path (before 3.7) where photos were stored.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;PRODUCT_USE_UNITS&#039;&#039;&#039; ► Add other units on products (Use same dictionary as default unit feature) and propagate this unit on line of documents.&lt;br /&gt;
*&#039;&#039;&#039;MAIN_EDIT_LINE_ALLOW_ALL_UNIT_TYPE ►&#039;&#039;&#039; Allow the selection of other unit types when editing the document line&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;RESOURCE_ON_PRODUCTS&#039;&#039;&#039; ► Allow to affect resources on products/services ► (v10.0+)&lt;br /&gt;
*&#039;&#039;&#039;RESOURCE_ON_SERVICES&#039;&#039;&#039; ► Allow to affect resources on products/services ► (v10.0+)&lt;br /&gt;
*&#039;&#039;&#039;PRODUCT_SHOW_ORIGIN_IN_COMBO&#039;&#039;&#039; ► Show origin of products when adding lines in proposals/invoices/orders ► (v12.0+)&lt;br /&gt;
*&#039;&#039;&#039;PRODUIT_ATTRIBUTES_HIDECHILD&#039;&#039;&#039;  ► Add option hide child if variantes&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;PRODUCT_ADD_FORM_ADD_TO&#039;&#039;&#039; ► Add a product to a draft proposal/order/invoice, from the product card.&lt;br /&gt;
*&#039;&#039;&#039;PRODUCT_DISABLE_SELLBY&#039;&#039;&#039; ► Hide the Sell by date ► (v13.0+)&lt;br /&gt;
*&#039;&#039;&#039;PRODUCT_DISABLE_EATBY&#039;&#039;&#039; ► Hide the Eat by date ► (v13.0+)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;PRODUCT_DENY_CHANGE_PRODUCT_TYPE&#039;&#039;&#039; ► Forbid to change the product type&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;PRODUCT_SORT_BY_CATEGORY&#039;&#039;&#039; ► Sort the product by categories instead of by ID&lt;br /&gt;
*&#039;&#039;&#039;PRODUCT_ADD_NET_MEASURE&#039;&#039;&#039; ► Support Net Measure in product&#039;s card.php (For real weight, volume or piece; needed for some business ie fruits, vegetables....). Note brut value is already available natively, use this option only if you need 2 weights, 2 volumes, ...for each product) ► (v11.0.1+)&lt;br /&gt;
*&#039;&#039;&#039;PRODUCT_PRICE_BASE_TYPE&#039;&#039;&#039;  ► value &#039;TTC&#039; / &#039;HT&#039; specify the default value of the price (with or without taxes) ► (v16.0.0+)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;PRODUCT_LOAD_EXTRAFIELD_INTO_OBJECTLINES&#039;&#039;&#039; ► Load product extrafiled on object lines&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;PRODUCT_USE_SUB_COST_PRICES_IF_COST_PRICE_EMPTY&#039;&#039;&#039;&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: Calculate the parent product production price by child prices.&lt;br /&gt;
*&#039;&#039;&#039;PRODUCT_SEARCH_AUTO_SELECT_IF_ONLY_ONE&#039;&#039;&#039;&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: Set to 0 to disable or 1 to enable (by default) the auto select product behavior in combobox when there is only one result.(v21.0+)&lt;br /&gt;
&lt;br /&gt;
[[#Top|(back to top)]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Projects Module=&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;PROJECT_ALLOW_TO_LINK_FROM_OTHER_COMPANY&#039;&#039;&#039; ► Option related to the combo list Project on elements. It is a list of thirdparty IDs. If set, you can link an object to a project owned by one of this thirdparty in the list.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;PROJECT_ALLOW_COMMENT_ON_PROJECT&#039;&#039;&#039; ► Add comment feature on a project&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;PROJECT_ALLOW_COMMENT_ON_TASK&#039;&#039;&#039; ► Add comment feature on project task&lt;br /&gt;
*&#039;&#039;&#039;PROJECT_ALWAYS_DISCARD_CLOSED_PROJECTS_IN_SELECT&#039;&#039;&#039; ► Discards closed projects in every select field. A closed project can&#039;t be associated to an object ► (v20.0+)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;PROJECT_CAN_ALWAYS_LINK_TO_ALL_SUPPLIERS&#039;&#039;&#039; ► Option related to the combo list Project on elements. Can link a supplier element (vendor proposal, purchase order, vendor invoice, reception, ...) to any project even if object has a different supplier than the one of the project to link to. See also PROJECT_ALLOW_TO_LINK_FROM_OTHER_COMPANY that is different because it allows to define some given thirdparty ID to allow.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;PROJECT_CAN_ALWAYS_LINK_TO_ALL_CUSTOMERS&#039;&#039;&#039; ► Option related to the combo list Project on elements. Can link a custom element (proposal, sale order, vendor invoice, shipment, ...) to any project even if object has a different customer than the one of the project to link to.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;PROJECT_CREATE_ON_OVERVIEW_DISABLED&#039;&#039;&#039; ► Hide the &amp;quot;create ...&amp;quot; button on the overview pagec&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;PROJECT_DISABLE_UNLINK_FROM_OVERVIEW&#039;&#039;&#039; ► Enable removing the button from a link in the project overview. ► (&amp;gt;= v8.0.1)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;PROJECT_HIDE_UNSELECTABLES&#039;&#039;&#039; ► Hide into select list, all project that we can&#039;t select (closed or draft)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;PROJECT_HIDE_TASKS&#039;&#039;&#039; ► Hide tasks. For user using project only as an analytics key and not using tasks.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;PROJECT_LIST_SHOW_STARTDATE&#039;&#039;&#039; ► Shows start date of projects in project lists.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;PROJECT_LINK_ON_OVERWIEW_DISABLED&#039;&#039;&#039; ► Hide the &amp;quot;link to&amp;quot; form on the overview page ► (v4.0)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;PROJECT_SHOW_REF_INTO_LISTS&#039;&#039;&#039; ► Add column with project ref into list (with 3.7 list of supplier invoices only, will be expanded to other lists)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;PROJECT_TIME_ON_ALL_TASKS_MY_PROJECTS&#039;&#039;&#039; ► Can add time spent on tasks, even if i am not assigned to task (however, task must be a project i am a contact).&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;PROJECT_OPEN_ALWAYS_ON_TAB&#039;&#039;&#039; ► Set to value &#039;task&#039;, or &#039;preview&#039; to always open the project on the given tab instead of main tab.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;PROJECT_ELEMENTS_FOR_MINUS_MARGIN&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;TIMESPENT_ALWAYS_UPDATE_THM&#039;&#039;&#039; ► when it&#039;s on always check current time of user to update it in task time line ► (v17.0)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;PROJECT_CREATE_NO_DRAFT&#039;&#039;&#039; ► when you create project status will be validate ► (v19.0)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;PROJECT_ENABLE_SUB_PROJECT&#039;&#039;&#039; ► Add support for parent projects ► (v19.0)&lt;br /&gt;
&lt;br /&gt;
[[#Top|(back to top)]]&lt;br /&gt;
&lt;br /&gt;
=Proposals Module=&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_GENERATE_PROPOSALS_WITH_PICTURE&#039;&#039;&#039; ► Add a picture of the product (the first one found if there are several) into the generated PDF of proposals. Note that using this will reduce the available width for the product description.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_PROPAL_CHOOSE_ODT_DOCUMENT&#039;&#039;&#039; ► On setup page, you&#039;ll be able to select which ODT document to use when close or cancel proposals.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_PDF_PROPAL_USE_ELECTRONIC_SIGNING&#039;&#039;&#039; ► add optional esign field in pdf propal ► (v8.0+)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;PROPAL_CLONE_ON_CREATE_PAGE&#039;&#039;&#039; ► On the create proposal page, ask if we want to create the proposal by cloning an already existing one. You should use instead the &amp;quot;Clone&amp;quot; button available on existing proposals.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;PROPAL_DISABLE_SIGNATURE&#039;&#039;&#039; ► Do no show the box for signature.&lt;br /&gt;
*&#039;&#039;&#039;PROPAL_SIGNATURE_ON_SPECIFIC_PAGE ►&#039;&#039;&#039; Will show the signature on which page you wanted . Set to 1 will show on first page , set to -1 will show on last second page .  ( If &#039;&#039;&#039;PROPAL_SIGNATURE_ON_ALL_PAGES&#039;&#039;&#039; is enabled, the &#039;&#039;&#039;PROPAL_SIGNATURE_ON_SPECIFIC_PAGE&#039;&#039;&#039; setting will be ignored.)&lt;br /&gt;
*&#039;&#039;&#039;PROPAL_SIGNATURE_ON_ALL_PAGES ►&#039;&#039;&#039; Will show the signature on every pages .&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;PRODUIT_PDF_MERGE_PROPAL&#039;&#039;&#039; ► When generating the proposal PDF, all PDFs linked to products linked to proposal are also included into final PDF&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;PROPOSAL_ALLOW_EXTERNAL_DOWNLOAD&#039;&#039;&#039; ► When a PDF is generated, a share key is automatically set so the file can be downloaded using the share key. ► (v7.0+)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;PROPOSAL_AUTO_ADD_AUTHOR_AS_CONTACT&#039;&#039;&#039; ► Add Proposal Author as user contact follow proposal&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;PROPOSAL_PDF_HIDE_PAYMENTTERM&#039;&#039;&#039; ► Do not show the payment term on proposal ► (v11.0+)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;PROPOSAL_PDF_HIDE_PAYMENTMODE&#039;&#039;&#039; ► Do not show the payment mode on proposal ► (v11.0+)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;WORKFLOW_PROPAL_CAN_CLASSIFY_BILLED_WITHOUT_INVOICES&#039;&#039;&#039; ► Button &amp;quot;Classified Billed&amp;quot; is visible on proposal even if there is no invoice linked to proposal.&lt;br /&gt;
*&#039;&#039;&#039;PROPAL_REOPEN_UNSIGNED_ONLY&#039;&#039;&#039;  ► Do not allow reopening of signed (or billed) proposals. (V15)&lt;br /&gt;
*&#039;&#039;&#039;PROPOSAL_ARE_NOT_BILLABLE&#039;&#039;&#039;  ► Disable billing button on proposals (V15)&lt;br /&gt;
*&#039;&#039;&#039;PROPAL_DEFAULT_NOTE_PUBLIC&#039;&#039;&#039; ► Default text in public note&lt;br /&gt;
*&#039;&#039;&#039;PROPAL_ENABLE_NEGATIVE&#039;&#039;&#039; ► Can validate a proposal when amount is negative&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[#Top|(back to top)]]&lt;br /&gt;
&lt;br /&gt;
=Receptions=&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;RECEPTION_STANDALONE&#039;&#039;&#039; ► Create a simple Reception not connected to supplier order, warehouse, stock e.t.c. (&amp;gt;=23.0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[#Top|(back to top)]]&lt;br /&gt;
&lt;br /&gt;
=Recruitment=&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;RECRUITMENT_NEWFORM_TEXT&#039;&#039;&#039;► Add a custom text on public recruitment page&lt;br /&gt;
*&#039;&#039;&#039;MAIN_RECRUITMENT_CSS_URL ►&#039;&#039;&#039;Path of custom css file for recruitment public page&lt;br /&gt;
*&#039;&#039;&#039;RECRUITMENT_IMAGE_PUBLIC_INTERFACE ►&#039;&#039;&#039;Path of custom image for recruitment public page&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[#Top|(back to top)]]&lt;br /&gt;
&lt;br /&gt;
=Services Module=&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;SERVICE_ARE_ECOMMERCE_200238EC&#039;&#039;&#039; ►  If seller and buyer are in Europe and buyer is not a company, use the VAT of buying country. For french speaking people, see also the page [[Loi_européenne_TVA_Vente_à_Distance_VAD_et_e-commerce_BtoC]].&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_FILL_SERVICE_DATES_FROM_LAST_SERVICE_LINE&#039;&#039;&#039;  ► (v13.0) On add line form add a button to fill service dates from the last service line&lt;br /&gt;
&lt;br /&gt;
[[#Top|(back to top)]]&lt;br /&gt;
&lt;br /&gt;
=Shipments=&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;STOCK_WAREHOUSE_NOT_REQUIRED_FOR_SHIPMENTS&#039;&#039;&#039; ► If set, you can add a shipment line, with no stock source defined. ► (&amp;gt;= 8.0.1)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;SHIPMENT_GETS_ALL_ORDER_PRODUCTS&#039;&#039;&#039; ► Add all order lines in shipment, including the one with 0 in quantity&lt;br /&gt;
*&#039;&#039;&#039;SHIPPING_PDF_HIDE_ORDERED&#039;&#039;&#039; ►Hide column quantity ordered on shipment pdf (&amp;gt;=15.0)&lt;br /&gt;
*&#039;&#039;&#039;STOCK_SUPPORTS_SERVICES&#039;&#039;&#039; ►Allow to manage services into warehouse and allow to ship services&lt;br /&gt;
*&#039;&#039;&#039;SHIPMENT_SUPPORTS_SERVICES&#039;&#039;&#039; ►Allow to ship services without stock (&amp;gt;=19.0)&lt;br /&gt;
*&#039;&#039;&#039;SHIPPING_DISPLAY_STOCK_ENTRY_DATE&#039;&#039;&#039; ►Display date entry stock exped and sort in date order (&amp;gt;=19.0)&lt;br /&gt;
*&#039;&#039;&#039;SHIPMENT_STANDALONE ►&#039;&#039;&#039;Create a simple shipment not connected to sales order, warehouse, stock e.t.c. (&amp;gt;=23.0)&lt;br /&gt;
&lt;br /&gt;
[[#Top|(back to top)]]&lt;br /&gt;
&lt;br /&gt;
=SMS= &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_SMS_DEBUG&#039;&#039;&#039; ► Write content of SMS sent into file &amp;lt;code&amp;gt;dolibarr_sms.log&amp;lt;/code&amp;gt; into directory &amp;lt;code&amp;gt;dolibarr_main_data_root&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[#Top|(back to top)]]&lt;br /&gt;
&lt;br /&gt;
=Stocks=&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;SUPPLIER_ORDER_DISABLE_STOCK_DISPATCH_WHEN_TOTAL_REACHED&#039;&#039;&#039; ► Disable stock dispatch when total expected was already received&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;STOCK_EXCLUDE_VIRTUAL_PRODUCTS&#039;&#039;&#039; ► If product is a virtual product, we do not manage stock for it.&lt;br /&gt;
*&#039;&#039;&#039;STOCK_ALLOW_DELETE_OF_MOVEMENT&#039;&#039;&#039; ► Enable massaction option to delete in movements list (be carefull !!).&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;ENTREPOT_EXTRA_STATUS&#039;&#039;&#039; ► Instead of the 2 status (Closed, Open), a Warehouse has 3 status: Closed, Open (for all movements), Open (for internal movement only). Internal movement only means you can&#039;t use the warehouse to make shipment or receptions.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;SUPPLIER_ORDER_STATUS_FOR_VIRTUAL_STOCK&#039;&#039;&#039; ► For the calculation of virtual stocks, by default supplier orders with the status 3 (ordered) and 4 (partially received) are used. You can enter the list of statuses to be taken into account separated by commas for this calculation (example: 0,1,2,3)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;STOCK_MOVEMENT_LIST_HIDE_UNIT_PRICE&#039;&#039;&#039; ► to hide unit price on some pages (V15+)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;DISABLE_QTY_OVERWRITE&#039;&#039;&#039; ► Disable quantity overwrites on inventories ► (v19.0)&lt;br /&gt;
*&#039;&#039;&#039;MAIN_WAREHOUSE_LIST_DISPLAY_MODE&#039;&#039;&#039; ► Change warehouse select list display mode  ► (v21.0) (see github pull request [https://github.com/Dolibarr/dolibarr/pull/31013 #31013] for more info)&lt;br /&gt;
**0&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: Default behavior, display parents of warehouse&lt;br /&gt;
**1&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: Display only current warehouse label only&lt;br /&gt;
**2&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: Display last parent warehouse label&lt;br /&gt;
&lt;br /&gt;
[[#Top|(back to top)]]&lt;br /&gt;
&lt;br /&gt;
=Stripe=&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION&#039;&#039;&#039; ► 1 is the default mode and will use the native Stripe form for the checkout (with card only), 2 will use the native Stripe form (PaymentElement complete, multi payment modes). Note that STRIPE_USE_NEW_CHECKOUT is an abandonned alternative (so no more NEW, that does not bring real added value)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Suppliers Module=&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;FOURN_PRODUCT_AVAILABILITY&#039;&#039;&#039; ► On the Suppliers price page of the products, activate the supplier product availability. &#039;&#039;This is duplicate feature with delivery_delay introduced with 3.8.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;RELOAD_PAGE_ON_SUPPLIER_CHANGE&#039;&#039;&#039; ► On creation of a supplier order/invoice, reload form with supplier-specific details when supplier is selected from drop-down list.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;SUPPLIER_INVOICE_WITH_PREDEFINED_PRICES_ONLY&#039;&#039;&#039; ► Restrict selection of products in supplier invoice to only those with a buying price defined for that supplier. ► (v6.0+)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;SUPPLIER_ORDER_AUTOADD_USER_CONTACT&#039;&#039;&#039; ► Add user approving supplier order as a contact automatically.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;SUPPLIER_ORDER_DEFAULT_PAYMENT_MODE_ID&#039;&#039;&#039; ► Set the default payment method for suppliers (&amp;lt;code&amp;gt;rowid&amp;lt;/code&amp;gt; in table &amp;lt;code&amp;gt;llx_c_paiement&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;SUPPLIER_ORDER_USE_DISPATCH_STATUS&#039;&#039;&#039; ► Add a status on each dispatch order line when receiving products from suppliers ► (v4.0+)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;SUPPLIER_ORDER_NO_DIRECT_APPROVE&#039;&#039;&#039; ► No button &amp;quot;Validate and Approve&amp;quot;. Always do step &amp;quot;Validate&amp;quot; and &amp;quot;Approve&amp;quot; in 2 steps.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;SUPPLIER_ORDER_WITH_PREDEFINED_PRICES_ONLY&#039;&#039;&#039; ► Restrict selection of products in supplier order to only those with a buying price defined for that supplier. ► (v6.0+)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;SUPPLIER_ORDER_EDIT_BUYINGPRICE_DURING_RECEIPT&#039;&#039;&#039; ► Can modify the buying price used for PMP calculation when making a stock reception on a supplier order. ► (v6.0+)&lt;br /&gt;
*&#039;&#039;&#039;SUPPLIER_PROPOSAL_WITH_PREDEFINED_PRICES_ONLY&#039;&#039;&#039; ► Restrict selection of products in supplier proposal to only those with a buying price defined for that supplier. ► (v6.0+)&lt;br /&gt;
*&#039;&#039;&#039;SUPPLIER_ORDER_MORE_THAN_WISHED&#039;&#039;&#039; ► The supplier order status is set to &amp;quot;Totally received&amp;quot; even if there are more products received than ordered. ► (v15.0+)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;DISPLAY_DISCOUNTED_SUPPLIER_PRICE&#039;&#039;&#039; ► Allow to display discounted supplier price when searching product in supplier documents ► (v10.0)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_CAN_EDIT_SUPPLIER_ON_SUPPLIER_ORDER&#039;&#039;&#039; ►  Allow to change the supplier on a draft supplier order ► (v10.0)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;SUPPLIER_PROPOSAL_ALLOW_EXTERNAL_DOWNLOAD&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;SUPPLIER_ORDER_CAN_UPDATE_BUYINGPRICE_DURING_RECEIPT&#039;&#039;&#039; ►  Allow to change price on receipt ► (v19.0)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;SUPPLIER_HIDE_SUPPLIER_OBJECTLINES&#039;&#039;&#039; ►  Hide the supplier information on objectlines (invoices, etc..) ► (v19.0)&lt;br /&gt;
&lt;br /&gt;
[[#Top|(back to top)]]&lt;br /&gt;
&lt;br /&gt;
=Third Parties Module=&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;COMPANY_AQUARIUM_CLEAN_REGEX&#039;&#039;&#039; ► Add a REGEX rule on the third parties names. It applies a regex replacement pattern on generated code if COMPANY_AQUARIUM_CLEAN_REGEX is set. Value must be a regex with parenthesis. The part into parenthesis is kept, the rest removed. For example if COMPANY_AQUARIUM_CLEAN_REGEX = &#039;&amp;lt;code&amp;gt;^..(..)..(.*)&amp;lt;/code&amp;gt;&#039; the first char and second char are removed and the char 5 and 6 too ► (&amp;gt;= 8.0.1)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_UNKNOWN_CUSTOMERS_ARE_COMPANIES&#039;&#039;&#039; ► See in Global options section.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_USE_VAT_COMPANIES_IN_EEC_WITH_INVALID_VAT_ID_ARE_INDIVIDUAL&#039;&#039;&#039; ► See in Global options section.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;SOCIETE_EMAIL_MANDATORY&#039;&#039;&#039; ► E-mail is a mandatory field when creating a thirdparty&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;SOCIETE_DISABLE_CUSTOMERS&#039;&#039;&#039; ► Remove all menu and features related to customers&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;SOCIETE_DISABLE_PROSPECTS&#039;&#039;&#039; ► Remove all menu and features related to prospects&lt;br /&gt;
*&#039;&#039;&#039;SOCIETE_DISABLE_PROSPECTSCUSTOMERS ►&#039;&#039;&#039; Remove the status &amp;quot;Customer/Prospect&amp;quot; when thirdparties creation or modification&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;SOCIETE_DISABLE_STATE&#039;&#039;&#039; ► Do not use field &amp;quot;state/province&amp;quot;&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;SOCIETE_SORT_ON_TYPEENT&#039;&#039;&#039; ► The combo list of &amp;quot;type of third party&amp;quot; is sorted on alphabetical order instead of the field &amp;quot;position&amp;quot; that appears into dictionary instead.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;SOCIETE_ASK_FOR_SHIPPING_METHOD&#039;&#039;&#039; ► Shipping method can be predefined on customer card and will be used as default on order creation&lt;br /&gt;
*&#039;&#039;&#039;SOCIETE_ADD_REF_IN_LIST&#039;&#039;&#039; ► Displays the code before the name in the lists  ► Value 1 -&amp;gt; Code + name + alias ou Code + name if colone alias 2 -&amp;gt; Code + alias 3 -&amp;gt; Alias&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;THIRDPARTY_CAN_HAVE_CATEGORY_EVEN_IF_NOT_CUSTOMER_PROSPECT_SUPPLIER&#039;&#039;&#039; ► Possible to add Categories to third parties that are not customer, prospect or supplier.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;THIRDPARTY_DEFAULT_USELOCALTAX1&#039;&#039;&#039; ► When creating a new third party, the field &amp;quot;Use second tax&amp;quot; is set to on or off depending on value of this parameter.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;THIRDPARTY_DEFAULT_USELOCALTAX2&#039;&#039;&#039; ► When creating a new third party, the field &amp;quot;Use third tax&amp;quot; is set to on or off depending on value of this parameter.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;THIRDPARTY_NOTCUSTOMERPROSPECT_BY_DEFAULT&#039;&#039;&#039; ► Do not set status &amp;quot;Customer/Prospect&amp;quot; to &amp;quot;on&amp;quot; when creating a new third party from menu &amp;quot;New third party&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;THIRDPARTY_INCLUDE_PARENT_IN_LINKTO&#039;&#039;&#039; ► Search also for elements on parent third party when using the &amp;quot;link to&amp;quot; object feature.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;THIRDPARTY_INCLUDE_PROJECT_THIRDPARY_IN_LINKTO&#039;&#039;&#039; ► Search also for elements on third party that own the project of the current element when using the &amp;quot;link to&amp;quot; object feature (if project is owned by a different thirdparty than current one).&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;THIRDPARTY_LOGO_ALLOW_EXTERNAL_DOWNLOAD&#039;&#039;&#039; ► When a logo is uploaded, a share key is automatically set so the file can be downloaded using the share key.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;THIRDPARTY_SUGGEST_ALSO_ADDRESS_CREATION&#039;&#039;&#039; ► Enabled contact creation on third-party create card&lt;br /&gt;
*&#039;&#039;&#039;THIRDPARTY_QUICKSEARCH_ON_FIELDS&#039;&#039;&#039; ► Personalized search criteria ► Example: $conf-&amp;gt;global-&amp;gt;THIRDPARTY_QUICKSEARCH_ON_FIELDS = &#039;s.nom=ThirdPartyName;s.name_alias=AliasNameShort;s.code_client=CustomerCode&#039;&lt;br /&gt;
*&#039;&#039;&#039;MEMBER_CAN_CONVERT_CUSTOMERS_TO_MEMBERS&#039;&#039;&#039; ► Enabled member creation on third-party create card&lt;br /&gt;
*&#039;&#039;&#039;SOCIETE_DISABLE_PARENTCOMPANY&#039;&#039;&#039; ► Disables attachment to a parent company.&lt;br /&gt;
*&#039;&#039;&#039;THIRDPARTY_CUSTOMERPROSPECT_BY_DEFAULT&#039;&#039;&#039; ► Set the third party to customer by default&lt;br /&gt;
*&#039;&#039;&#039;THIRDPARTY_SUPPLIER_BY_DEFAULT&#039;&#039;&#039; ► Set the third party to supplier by default&lt;br /&gt;
*&#039;&#039;&#039;THIRDPARTY_CUSTOMERTYPE_BY_DEFAULT&#039;&#039;&#039; ► Set the third party type by default (3 = customer &amp;amp; prospect / 2 = prospect / 1 = customer )&lt;br /&gt;
*&#039;&#039;&#039;CONTACT_DISABLE_PERSONALINFO&#039;&#039;&#039; ► Disable Personal data on contact page&lt;br /&gt;
*&#039;&#039;&#039;SOCIETE_DISABLE_WORKFORCE&#039;&#039;&#039; ► Disable work force selector on society page&lt;br /&gt;
*&#039;&#039;&#039;SOCIETE_SHOW_VAT_IN_LIST&#039;&#039;&#039; ► display VAT number in combo list of thirdparties ► (V15+)&lt;br /&gt;
*&#039;&#039;&#039;THIRDPARTY_DEFAULT_CREATE_CONTACT&#039;&#039;&#039; ► When set, a contact is created at the creation of an individual third party ► (v14.0)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_SUPPORT_SHARED_CONTACT_BETWEEN_THIRDPARTIES&#039;&#039;&#039; ► Able to share contact between several third parties&lt;br /&gt;
*&#039;&#039;&#039;THIRDPARTY_CUSTOMERCODE_EQUALS_MEMBERREF&#039;&#039;&#039; ► When creating third parties out of members, the customer code is set equal to the member Ref. ► (v22.0)&lt;br /&gt;
*&#039;&#039;&#039;SOCIETE_NO_SYNC_LINKED_MEMBER&#039;&#039;&#039; ► If set, changes to a third party will not be synchronized to a linked member. ► (v23.0)&lt;br /&gt;
&lt;br /&gt;
[[#Top|(back to top)]]&lt;br /&gt;
&lt;br /&gt;
=Ticket Module=&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;TICKET_SHOW_MESSAGES_ON_CARD&#039;&#039;&#039; ►Display all ticket related messages on the main ticket card. ► (&amp;gt;= 10.0)&lt;br /&gt;
*&#039;&#039;&#039;TICKET_AUTO_ASSIGN_CONTRACT_CREATE&#039;&#039;&#039; ►Automatically create a contract linked to the ticket ► (&amp;gt;= 10.0)&lt;br /&gt;
*&#039;&#039;&#039;TICKET_AUTO_CREATE_FICHINTER_CREATE&#039;&#039;&#039; ►Automatically create an intervention linked to the ticket ► (&amp;gt;= 10.0)&lt;br /&gt;
*&#039;&#039;&#039;TICKET_AUTO_ASSIGN_USER_CREATE&#039;&#039;&#039; &#039;&#039;&#039;►&#039;&#039;&#039; (&amp;gt;= 21.0) 0=No auto assignement, 1=Auto assign current user if no user was set, 2=Auto assign current user even if another user was set.&lt;br /&gt;
*&#039;&#039;&#039;TICKET_CHECK_NOTIFY_THIRDPARTY_AT_CREATION&#039;&#039;&#039; ►Automatically check &amp;quot;notify thirdparty at creation&amp;quot; ( &amp;gt;=16)&lt;br /&gt;
*&#039;&#039;&#039;TICKETS_MESSAGE_FORCE_MAIL&#039;&#039;&#039; ► Pre check email sending on ticket message (&amp;gt;=15)&lt;br /&gt;
*&#039;&#039;&#039;TICKET_SEND_PRIVATE_EMAIL ►&#039;&#039;&#039; Allow a private message to be sent by mail (&amp;gt;=17)&lt;br /&gt;
*&#039;&#039;&#039;TICKET_LIMIT_VIEW_ASSIGNED_ONLY&#039;&#039;&#039;  &#039;&#039;&#039;►&#039;&#039;&#039; Only display tickets assigned to the user&lt;br /&gt;
*&#039;&#039;&#039;TICKET_ADD_AUTHOR_AS_CONTACT&#039;&#039;&#039; &#039;&#039;&#039;►&#039;&#039;&#039; If set to 1: Automatically adds the author as internal contact. If set to 2: Automatically adds the author as external contact if external user. (&amp;gt;=20)&lt;br /&gt;
*&#039;&#039;&#039;TICKET_ASSIGN_CONTACT_TO_MESSAGE&#039;&#039;&#039; &#039;&#039;&#039;►&#039;&#039;&#039; If known, the external contact is assigned to the message. (&amp;gt;=19)&lt;br /&gt;
*&#039;&#039;&#039;TICKET_ALLOW_CLASSIFICATION_MODIFICATION_EVEN_IF_CLOSED&#039;&#039;&#039; &#039;&#039;&#039;►&#039;&#039;&#039;Allow modify ticket classification even if closed. (&amp;gt;=19)&lt;br /&gt;
*&#039;&#039;&#039;WORKFLOW_TICKET_CLOSE_INTERVENTION&#039;&#039;&#039; ►On ticket close, automatically close an intervention linked to the ticket&lt;br /&gt;
*&#039;&#039;&#039;TICKET_INCLUDE_SUSPENDED_STATUS&#039;&#039;&#039; ► Use ticket suspended status (&amp;gt;=19)&lt;br /&gt;
*&#039;&#039;&#039;TICKET_INCLUDE_LINK_TO_PUBLIC_INTERFACE_IN_MESSAGE&#039;&#039;&#039; ► Add a link in bottom of emails sent from ticket page with link to public ticket admin tool (&amp;gt;=22)&lt;br /&gt;
&lt;br /&gt;
=VAT Report=&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_INCLUDE_ZERO_VAT_IN_REPORTS&#039;&#039;&#039; ► Include lines with VAT to 0% (for &amp;quot;auto-liquidation&amp;quot; in EEC) ► (v8.0.3+)&lt;br /&gt;
&lt;br /&gt;
[[#Top|(back to top)]]&lt;br /&gt;
&lt;br /&gt;
=Website Module=&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;WEBSITE_USE_WEBSITE_ACCOUNTS&#039;&#039;&#039; ► Add a table and a tab to manage some accounts for websites to a third party&lt;br /&gt;
*&#039;&#039;&#039;WEBSITE_ALLOW_OVERWRITE_GIT_SOURCE&#039;&#039;&#039; ► Add a button to export a website over the GIT sources&lt;br /&gt;
*&#039;&#039;&#039;WEBSITE_ADD_CSS_TO_BODY&#039;&#039;&#039; ► Add a CSS class to the body tag of websites&lt;br /&gt;
&lt;br /&gt;
[[#Top|(back to top)]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=WYSIWYG Editor=&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;FCKEDITOR_ENABLE_DETAILS_FULL&#039;&#039;&#039; ► Can cut and paste external images (hosted on external server) into description of proposal, orders or invoices. WARNING: PDF generation is not guaranteed with this. Also if the image is removed or renamed by the image hosting service, your proposal, order or invoice will be broken.&lt;br /&gt;
*&#039;&#039;&#039;FCKEDITOR_ALLOW_ANY_CONTENT&#039;&#039;&#039; ► Allow to enter any content. However, this will totally disable content filtering which is one of the most important CKEditor features. You can use this to keep all your tags and attributes in the html content.&lt;br /&gt;
*&#039;&#039;&#039;FCKEDITOR_ENABLE_SCAYT_AUTOSTARTUP&#039;&#039;&#039;  ► Allow to activate the SpellCheckAsYouType (SCAYT) plugins of CKEditor i.e an automatic spell checking. The value to activate this option is 1.&lt;br /&gt;
*&#039;&#039;&#039;MAIN_ALLOW_WYSIWYG_LOCAL_MEDIAS_ON_PRIVATE_NETWORK&#039;&#039;&#039;  ► By default, you can add medias links (img src or other) into the rich text content editor, but you can&#039;t add links like that use a local host like &amp;quot;https://localhost/file&amp;quot;. If you set this option to 1, you can.&lt;br /&gt;
*&#039;&#039;&#039;MAIN_ALLOW_WYSIWYG_EVEN_ON_UNSECURED_EXTERNAL_HTTP_URL&#039;&#039;&#039;  ► By default, you can add medias links (img src or other) into the rich text content editor, but not if the link is a unsecure &amp;quot;http&amp;quot; url (not https) and your Dolibarr is http. If you set this option to 1, you can.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[#Top|(back to top)]]&lt;br /&gt;
&lt;br /&gt;
=STRIPE Module=&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;STRIPE_FORCE_VERSION&#039;&#039;&#039; ► Force the STRIPE version. For Example: &amp;quot;2019-09-09&amp;quot; (v11+)&lt;br /&gt;
*&#039;&#039;&#039;STRIPE_REUSE_EXISTING_INTENT_IF_FOUND&#039;&#039;&#039; ► With this, you will have idempotency key but the payment intention will be reuse and not Generate again (13+)&lt;br /&gt;
&lt;br /&gt;
[[#Top|(back to top)]]&lt;br /&gt;
&lt;br /&gt;
=ClickToDial Module=&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;CLICKTODIAL_FORCENEWTARGET&#039;&#039;&#039; ► Open in new page.&lt;br /&gt;
&lt;br /&gt;
[[#Top|(back to top)]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=For SaaS / Cloud hosting integrators=&lt;br /&gt;
&lt;br /&gt;
The following options are useless for a common usage of Dolibarr. But they are usefull if you plan to host / provide Dolibarr instances as Software As A Service (SAAS) to your customers.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;CRON_DISABLE_KEY_CHANGE&#039;&#039;&#039; ► When you provide an instance to a customer, you probably also add an entry in the cron of this user so Dolibarr batch and scheduler can work correctly. For security purpose, it may have a security key that is inside the command line into the cron entry and this entry must match the value defined into Dolibarr setup (setup of module &#039;Scheduled Jobs&#039;). Because, a customer of a Saas platform will probably have no access to edit the cron file, it is also import that he has no way to edit the key into the Dolibarr setup, so the key in the cron command line will always match the key in Dolibarr setup, and the Dolibarr batches will executed without security errors. To be sure, the customer does not change the value, you can set this constant to 1 into the table [[Table_llx_const]].&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;CRON_DISABLE_TUTORIAL_CRON&#039;&#039;&#039; ► Disable the tutorial about how to install the cron script (on a SaaS hosting, this should be done by the web hosting provider)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;CRON_WARNING_DELAY_HOURS&#039;&#039;&#039; ► Set this value to the frequency set for the cron script (so a warning will be shown to user to warn it about max frequency of its scheduled jobs)&lt;br /&gt;
 &lt;br /&gt;
*&#039;&#039;&#039;MAILING_NO_USING_PHPMAIL&#039;&#039;&#039; ► To avoid bad use of the emailing module, it is recommended to set this option to 1 (This option is described previously). Also you can complete the message visible by customers when they try to setup the SMTP credentials of their Dolibarr by using the constant MAILING_SMTP_SETUP_EMAILS_FOR_QUESTIONS (This option is described previously). For example, you can point to a FAQ on your website.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIL_MAX_NB_OF_RECIPIENTS_IN_SAME_EMAIL&#039;&#039;&#039; ► If you have set a system limit on number of recipients on your system, you can set also this option to match the same value, so users will be informed: So &#039;&#039;&#039;MAIL_MAX_NB_OF_RECIPIENTS_IN_SAME_EMAIL&#039;&#039;&#039; restricts sending of 1 email message to &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; recipients for the same email message (x for To: + CC: + BCC:). If not defined, value is &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt;. Required to fight against spamming that include a ton of recipients in 1 message. Note that &#039;&#039;&#039;MAIL_MAX_NB_OF_RECIPIENTS_TO_IN_SAME_EMAIL&#039;&#039;&#039;, &#039;&#039;&#039;MAIL_MAX_NB_OF_RECIPIENTS_CC_IN_SAME_EMAIL&#039;&#039;&#039; and &#039;&#039;&#039;MAIL_MAX_NB_OF_RECIPIENTS_BCC_IN_SAME_EMAIL&#039;&#039;&#039; are also available. Note that this is not a hard limit; it is just the quantity that will be displayed on warnings on screen. For a real limit, this must be implemented into the system.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAILING_LIMIT_SENDBYDAY&#039;&#039;&#039; ► This is a limit of number of emails, an instance can send. Note that this is not a hard limit; it is just the quantity that will be displayed on warnings on screen. For a real limit, this must be implemented into the system.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAILING_LIMIT_WARNING_PHPMAIL&#039;&#039;&#039; ► Set this value to a translation key. Then add translation keys into the instance so user will see a message when into the email setup page. For example, you can set a message to say: &#039;&#039;Warning: To avoid abuse, when using default setup, you are restricted to 500 emails per day for all your application (account may be suspended in case of violation of this rule. You can setup application to use your own SMTP server for sending email so you want have no restriction at all (see menu Home-Setup-Emails)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_ALWAYS_CREATE_LOCK_AFTER_LAST_UPGRADE&#039;&#039;&#039; ► If set, when you launch upgrades of your customer instances, you are sure that the upgrade process recreate automatically the file install.lock and remove the upgrade.unlock so the administration tools like install.php, upgrade.php and repair.php can&#039;t be used on your customer instance (until the install.lock file is deleted or the upgrade.unlock file is created).&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_EXTERNAL_SMTP_CLIENT_IP_ADDRESS&#039;&#039;&#039; ► (A better name of this option should be MAIN_EXTERNAL_MAIL_CLIENT_IP_ADDRESS). Set here the list of IPs where your Dolibarr instances are hosted, separated by a comma. So, when your customer go into the Email setup area:&lt;br /&gt;
**If he has chosen mail method, a message will explain him how to setup its SPF record for its email domain (showing the list of IP). This is to avoid to have its emails, sent from its Dolibarr instance, fails due to strict antispam rule of some emailing servers.&lt;br /&gt;
**If he has chosen smtp method, a message will explain him the list of IP he can use if there is restriction on IP by the SMTP agent. If you also need to add a message to help SPF setup, see option &#039;&#039;&#039;MAIN_EXTERNAL_SMTP_SPF_STRING_TO_ADD&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
You can also provide a list of URLs that return just an IP instead of a list of hardcoded IP. So you can for example set 1 url that contact a whoami service that return the public IP of server and another one doing the one on a IPv6 address, so on the setup page, the public IP adress of the server will always be uptodate for both ipv4 and ipv6 (Example: &amp;quot;https://ipv4.server.com/_service_showmyip.php,https://ipv6.server.com/_service_showmyip.php&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_EXTERNAL_SMTP_SPF_STRING_TO_ADD&#039;&#039;&#039; ► Set here the string to add in the SPF record This string will be shown into a help message when the user in in the setup of email page and has choose a method using an external SMTP server.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_FIRST_PING_OK_ID&#039;&#039;&#039; ► Set this value to &amp;quot;disabled&amp;quot; to remove completely any ping after a complete setup.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_FILECHECK_LOCAL_SUFFIX&#039;&#039;&#039; and &#039;&#039;&#039;MAIN_FILECHECK_LOCAL_EXT&#039;&#039;&#039; ► If you offer a customized or patched version of Dolibarr, when the user will use the tool to check the integrity of files, the default xml file name used for signature checking will be the official file provided by the Dolibarr team, so it does not includes your own changes. To have the suggested signature file being your own file, you can set the constant MAIN_FILECHECK_LOCAL_SUFFIX to a suffix. For example, set this to &amp;quot;&#039;&#039;&#039;-mysaassolution&#039;&#039;&#039;&amp;quot;. So, when the user will use the file integrity tool, the default file to check for signature will be &amp;quot;&#039;&#039;&#039;/install/filelist-10.0.2-mysaassolution.xml&#039;&#039;&#039;&amp;quot; instead of &amp;quot;&#039;&#039;&#039;/install/filelist-10.0.2.xml&#039;&#039;&#039;&amp;quot;. All you have to do is generate the signature file &#039;&#039;&#039;mysaassolution&#039;&#039;&#039; using the tool &#039;&#039;&#039;build/generate_filelist_xml.php&#039;&#039;&#039; and put this file into the install directory of your customer instance. Doing this, your customer, and yourself, will be able to check if a file was modified without being disturbed by false alerts due to your customized files or patches (they will be included in the signature used for check). Also, if you want to zip the customized signature file into &amp;quot;&#039;&#039;&#039;/install/filelist-10.0.2-mysaassolution.xml.zip&#039;&#039;&#039;&amp;quot;, you can set the constant MAIN_FILECHECK_LOCAL_EXT to &#039;.zip&#039;.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_HIDE_WARNING_TO_ENCOURAGE_SMTP_SETUP&#039;&#039;&#039; ► Set to 1 by default (so warning is hidden). You can set it to 0 to show a warning to encourage admin to set its own SMTP service.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_MAIL_SENDMODE_password&#039;&#039;&#039; ► To force the mode to send the email on the &amp;quot;password forgotten&amp;quot; page. So you can decide to use php mail or SMTP method for this specific use case.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_MIN_NB_ENABLED_MODULE_FOR_WARNING&#039;&#039;&#039; ► If set to N, the warning saying modules are not activated will be shown if number of activated module is &amp;lt; N (Having this variable not defined is same than having it set to 1). This may be usefull if you preinstall an application with some modules already loaded by default and you want to keep the warning to be sure the user will enable other modules he need, even if some modules are already enabed.&lt;br /&gt;
*&#039;&#039;&#039;MAIN_SETUP_MODULES_DESC&#039;&#039;&#039; ► If your installation is already done with activated module, the help message to explain how to enable a module on the setup page is hidden. You can keep it visible by adding this option to 1.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;MAIN_NO_UPGRADE_REDIRECT_ON_LEVEL_3_CHANGE&#039;&#039;&#039; ► The page to make the migration is not shown automatically when you deploy files of version X.Y.Z+delta over an  installation with a database version X.Y.Z. The upgrade page will be shown automatically only if there is a change on value of X or Y in version.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;SYSLOG_DISABLE_LOGHANDLER_SYSLOG&#039;&#039;&#039; ► Set this to 1 to disable usage of syslog (having all customer instances logging in the same system file is not a good idea).&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;WEBSITE_REPLACE_INFO_ABOUT_USAGE_WITH_WEBSERVER&#039;&#039;&#039; ► Put here a text or a translation key of a text to show when the user will use the feature &amp;quot;Deploy&amp;quot; when he want to deploy a website done with Dolibarr CMS. So you can, for example, show him a message that this feature is not part of its subscription and putting a website online may need a complementary subscription.&lt;br /&gt;
&lt;br /&gt;
[[#Top|(back to top)]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Eldy</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Module_EInvoicing_(Generic,_FR,_...)&amp;diff=67966</id>
		<title>Module EInvoicing (Generic, FR, ...)</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Module_EInvoicing_(Generic,_FR,_...)&amp;diff=67966"/>
		<updated>2026-10-08T10:43:13Z</updated>

		<summary type="html">&lt;p&gt;Eldy: /* On the Dolibarr of your customers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN origin interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- You can edit this section but do NOT remove these comments&lt;br /&gt;
     Links below will be automatically replicated on translated pages by PolyglotBot --&amp;gt;&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
[[Category:Complementary modules]]&lt;br /&gt;
{{TemplateDocDevEn}}&lt;br /&gt;
{{TemplateDocUser}}&lt;br /&gt;
=Information=&lt;br /&gt;
{{TemplateModuleInfo&lt;br /&gt;
|modulename=EInvoicing (Formerly PDPConnectFR)&lt;br /&gt;
|editor=Dolibarr community&lt;br /&gt;
|web=&lt;br /&gt;
|webbuy=From your Dolibarr v24+, menu Home - Setup - Modules - Find external modules, search on &amp;quot;einvoice&amp;quot;&lt;br /&gt;
|status=experimental&lt;br /&gt;
|prerequisites=&lt;br /&gt;
|minversion=&lt;br /&gt;
|maxversion=&lt;br /&gt;
|note=Recommended version: 24.0+&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Features=&lt;br /&gt;
This module adds support of EInvoice in Dolibarr for some countries. Generating, Sending and Receiving EInvoice is mandatory in some countries, this module deals initialy with the case of France (even if it was designed to support other countries).&lt;br /&gt;
&lt;br /&gt;
For a solution dedicated to other countries, take a look at the page [[Electronic Billing]]. &lt;br /&gt;
&lt;br /&gt;
The module allows your Dolibarr to generate EInvoice and to connect to some official Access Point (Plateforme Agréées) to send and retrieve your invoice documents. The supported EInvoice format are:&lt;br /&gt;
&lt;br /&gt;
*CII       (Dolibarr v18+, recommended Dolibarr v24+)&lt;br /&gt;
*Factur-X  (only Dolibarr v24+)&lt;br /&gt;
*More format like UBL could be added by contributing (see Development chapter)&lt;br /&gt;
&lt;br /&gt;
Warning: Using the Factur-X format is not recommended. It works with few Access Point only and even if accepted by your own AP, it may be refused by the AP of your customer due to hidden problems inside the format itself and library conflicts when using Dolibarr &amp;lt; 24.0. Also, it consumes a high amount of disk per invoice (an Einvoice may be 1 Mb if you have large images inside !) and make analysis very difficult when there is a trouble. It is highly recommended to use the CII format that is standard and supported by all Access Points, is easier to produce, analyse and process (an Einvoice is a text xml file of 10Kb only) and is not sentitive to PHP or Dolibarr versions.&lt;br /&gt;
&lt;br /&gt;
=Installation=&lt;br /&gt;
==With Dolibarr v24+==&lt;br /&gt;
Go into menu Home - Setup - Search external modules&lt;br /&gt;
Search on einvoicing and click on Install.&lt;br /&gt;
&lt;br /&gt;
The module is available. Go to configuration step.&lt;br /&gt;
&lt;br /&gt;
==With any Dolibarr version==&lt;br /&gt;
===Install from dolistore.com===&lt;br /&gt;
Go and download the archive zip of the einvocing free module from dolistore.com&lt;br /&gt;
&lt;br /&gt;
Go on menu Home - Setup - Install external module&lt;br /&gt;
Upload the zip, the module is available. Go to configuration step.&lt;br /&gt;
&lt;br /&gt;
===Install using git===&lt;br /&gt;
In the meantime, install the module in the &#039;&#039;&#039;/custom&#039;&#039;&#039; directory of your dolibarr. For this, go into the /custom directory:&lt;br /&gt;
 cd mydolibarrdir/htdocs/custom&lt;br /&gt;
Then download the module directory &#039;&#039;&#039;einvoicing&#039;&#039;&#039;&lt;br /&gt;
 git clone https://github.com/Dolibarr/dolibarr-community-modules; mkdir einvoicing; cp -pr dolibarr-community-modules/einvoicing/* einvoicing; rm -fr dolibarr-community-modules;&lt;br /&gt;
&lt;br /&gt;
=Setup=&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Using the french guide:&#039;&#039;&#039;&lt;br /&gt;
You can have a look at the french |https://www.dolicloud.com/fr/guide-facturation-electronique-dolibarr.php Guide de la facturation électronique pour Dolibarr].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Using english help:&#039;&#039;&#039;&lt;br /&gt;
Go onto the setup of the modulefrom menu &amp;quot;Home - Setup - Modules - Module EInvoice - Wheel configuration&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The first step is to choose, from the combo list, which Access Point you want to use to send your EInvoice. You can select between one in the following list:&lt;br /&gt;
&lt;br /&gt;
*SuperPDP&lt;br /&gt;
*EsaLink (hubtimize)&lt;br /&gt;
*More providers are coming (See chapter Development to know how to contibute to add your own Provider)&lt;br /&gt;
&lt;br /&gt;
All access point provided by the module are official Access Points (Plateforme Agréée).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Setup with SuperPDP Access Point==&lt;br /&gt;
If you choose [https://www.superpdp.tech SuperPDP] as your official Production Access Point (or as a Test Access Point), you must create an account by clicking on the link suggested by the setup page of the module (link should be https://www.superpdp.tech/app/users/create).&lt;br /&gt;
&lt;br /&gt;
Note that for a production usage, you may need to provide a scan of an identity card. The process of creating an account may last few minutes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Once your account is created, you must generate credentials to allow Dolibarr to connect to SuperPDP: For this, go into your SuperPDP dashboard, and from the left menu &amp;quot;&#039;&#039;&#039;Applications&#039;&#039;&#039;&amp;quot;, click on &amp;quot;&#039;&#039;&#039;New Application&#039;&#039;&#039;&amp;quot; to create a new setup for the application Dolibarr. Choose if you want a setup for Production (Real usage) or for Test (Sandbox). Then select the company and the type of application &amp;quot;&#039;&#039;&#039;Confidential&#039;&#039;&#039;&amp;quot; and click &amp;quot;&#039;&#039;&#039;Create&#039;&#039;&#039;&amp;quot; (you can keep the field &amp;quot;URLs of redirection&amp;quot; to empty or paste the value provided by Dolibarr setup page).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;The page to get credentials for an application&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:Einvoice superpdp setup.png|border]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Your credential (&#039;&#039;&#039;client_id&#039;&#039;&#039; and &#039;&#039;&#039;client_secret&#039;&#039;&#039;) are created and are shown on the next screen.&lt;br /&gt;
&lt;br /&gt;
Go into Dolibarr, into the page to setup the module EInvoice and enter these 2 values, click on Save to save the data and click on &amp;quot;Connect&amp;quot; to get the security key to exchange with SuperPDP. &lt;br /&gt;
&lt;br /&gt;
That&#039;s all, you are connected with SuperPDP (For Production usage or for Test depending on the choice you made). To be sure, you can try the link &amp;quot;Test of connection (healthcheck)&amp;quot; to verify the connection.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Example of setup for sandbox use with an account of SuperPDP&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:Einvoice setup example.png|border]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Warning.png]] By default, you can enter only one set of credentials for the Production mode and one set of credentials for the Test mode, so if your Dolibarr instance is a test instance, enter test credentials and set the switch to Test, and if your Dolibarr instance is a production instance, enter credentials of production and set the switch to Production. Even if you can switch from one environment to another one, it is seriously not recommended to save and use both Test and Production credentials in the same Dolibarr instance; Only the Access Point environment is different but your Dolibarr is the same. So if you mix two Access Point environments (Test and Prod) in the same Dolibarr, you may get or send tests invoices on your production instance (and the opposite), so the best thing to avoid this is to enter credentials only for one environment and never for the other. See chapter &amp;quot;Usage in sandbox for test&amp;quot; for more information on how to use the module in a sandbox context.&lt;br /&gt;
&lt;br /&gt;
==Setup VAT exemptions (VATEX), if applicable==&lt;br /&gt;
If your business is exempted of VAT, tell Dolibarr the default reason of exemption that will be exported in the EInvoice.&lt;br /&gt;
&lt;br /&gt;
Take note of the VATEX-xxxx code that matches your business and save it into Dolibarr:&lt;br /&gt;
&lt;br /&gt;
*In Dolibarr &amp;lt;= 23, go to &amp;quot;Configuration - Misc&amp;quot; and add a new variable &#039;&#039;&#039;MAIN_VAT_EXEMPTION_CODE_FOR_0&#039;&#039;&#039; with the VATEX-xx-xxxx matching your situation.&lt;br /&gt;
*In Dolibarr &amp;gt;24, save it to the VAT dictionary&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Example: French companies concerned with Art 293B of CGI will type &amp;lt;code&amp;gt;VATEX-FR-FRANCHISE&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Setup with Esalink/Hubtimize Access point==&lt;br /&gt;
 L&#039;utilisation de la Plateforme Agréée ESALINK ne se souscrit pas en direct&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: elle passe obligatoirement par un &#039;&#039;&#039;membre distributeur&#039;&#039;&#039; de l&#039;association PDP Libre, référencé sur la page [https://pdplibre.org/solutions/ Solutions].&lt;br /&gt;
 &lt;br /&gt;
=Usage for production=&lt;br /&gt;
==Send a customer invoice==&lt;br /&gt;
Once a Dolibarr invoice is generated (and validated), you can use a new button &amp;quot;&#039;&#039;&#039;Generate the Einvoice&#039;&#039;&#039;&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Note: you can have this action done automatically if you enable the option from menu Home - Setup - Modules - Module Einvoice - Configuration - Tab &amp;quot;other options&amp;quot; and switch &amp;quot;Generate automatically Einvoice&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Once an EInvoice has been generated, you can use the button to &amp;quot;&#039;&#039;&#039;Send the invoice&#039;&#039;&#039;&amp;quot; to the access point. Wait a minute while the access point answers and observe the returned status code:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Code 200&#039;&#039;&#039;: the access point has successfully sent the invoice to the client and is waiting for an answer from the customer&#039;s approval&lt;br /&gt;
*&#039;&#039;&#039;Code 213&#039;&#039;&#039;: rejected: the access point has detected an anomaly on the invoice. Review all invoice data and VAT fields. Download the &#039;&#039;FA-xxxxx_cii.xml&#039;&#039; file from Dolibarr and send it to [https://www.superpdp.tech/outils/validateur-facture-electronique/ a CII validator] to get more information about the anomaly. If you need help, ask [https://www.dolibarr.fr/forum/ on the forum].&lt;br /&gt;
*&#039;&#039;&#039;Code 210&#039;&#039;&#039;: the customer explicitly refused the invoice, get it touch with the customer to know why they did not accept the invoice.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note about invoices generated by the POS Module TakePOS&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
By default, any invoice generated by the POS has status &amp;quot;Do not manage Einvoice&amp;quot;. For such sales, it is not expected that you send an EInvoice. Instead you will have to send a &amp;quot;report&amp;quot; for all sales done by the point of sale (this will be supported by the module, later as this requirement is expected only for the 1st of september 2027).&lt;br /&gt;
&lt;br /&gt;
==Retrieve vendor invoices==&lt;br /&gt;
Go into menu Home - Invoice - EInvoice synchronization.&lt;br /&gt;
&lt;br /&gt;
Click on the button to launch synchronization.&lt;br /&gt;
&lt;br /&gt;
If you experience an error, follow the instruction. for example:&lt;br /&gt;
&lt;br /&gt;
*If you try to import a vendor invoice and the vendor can not be found in your Dolibarr database of suppliers, a link will be suggested to create it.&lt;br /&gt;
*If you try to import a vendor invoice and a product line can not be found in your Dolibarr database of products, a link will be suggested to create the product (You may also prefer to edit the vendor card to define a default Product Ref to use when doing an import of a product that is unknown, so each time a product is unknown for this vendor, Dolibarr will use the same default product instead of creating a new one each time).&lt;br /&gt;
&lt;br /&gt;
=Usage in the sandbox env for test=&lt;br /&gt;
Using the module in sandbox environment is the same than using it in production mode. Only the credentials to connect to your Access Point differ.&lt;br /&gt;
&lt;br /&gt;
If you are a developper, you can enable the option EINVOICING_ALLOW_DEV_TOOLS to 1 into menu &amp;quot;Home - Setup - Other&amp;quot;. This will add more features for developers into an additional tab &amp;quot;Dev tools&amp;quot;. &lt;br /&gt;
You can also switch the Test / Production mode from the main tab of the setup section of the module. WARNING: Using the switch is dangerous as it allows mixing invoices from different networks in the same Dolibarr instance.&lt;br /&gt;
&lt;br /&gt;
==Using the sandbox and Peppol test Network for tests using several Access Points==&lt;br /&gt;
If you are using credentials to use the sandbox mode of SuperPDP, you may need to modify the setup of your company (Menu Home - Setup - Company/Organization) to record the same SIREN than the one of the test company provided by SuperPDP sandbox (So &amp;quot;000000001&amp;quot; for Tricatel or &amp;quot;000000002&amp;quot; for Burger Queen).&lt;br /&gt;
&lt;br /&gt;
However the &#039;&#039;&#039;EInvoice address&#039;&#039;&#039; is NOT the same than the &#039;&#039;&#039;SIREN&#039;&#039;&#039; (it is the same in production mode only), so you must also force the Einvoice address of the company into the setup of the module Einvoice: To know your EInvoice address of your test company, go into the SuperPDP dashboard, in sandbox mode, and click on the label of the test company (for example Tricatel), you should see a list of the addresses of this test company in the annuary (the address to find you on the shared test Access Point network). The invoice address to use is the value after the &amp;quot;225:&amp;quot;, the one starting with 315143296_XXX with XXX that depends on your account.&lt;br /&gt;
Once both are saved, a warning may appear to say that SIREN and Einvoice address ID are not the same. You can ignore it in test environment.&lt;br /&gt;
&lt;br /&gt;
If your SIREN (menu Home - Setup - Company/Organisation) and your EInvoice address (menu Setup - Modules - Einvoice - Configuration) are correctly filled (Example: SIREN: 00000001 and EInvoice address 315143296_XXX), then you can send and retreive invoices from or to any other Access Points working on the Peppol Test network (The SuperPDP sandbox is automatically linked to the Peppol Test network when you use the sandbox credential).&lt;br /&gt;
&lt;br /&gt;
To send an invoice to a test customer available onto another Access Point, as the Peppol network are using addresses that are different from SIREN, you can force the customer EInvoice address from the thirdparty card by editing the field EInvoice address.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Example of the thirdparty card to send an einvoice from SuperPDP to the customer Test with SIREN 145678239 available at Esalink&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:Einvoice setup customer address.png|border]]&lt;br /&gt;
&lt;br /&gt;
=Options for integrators (mode proxy)=&lt;br /&gt;
If you are an integrator or web hosting provider (called P) and you want to provide a solution to allow your customers (Called C) to register and use the einvoicing system in one click, without having to pay (all payments will be done by yourself) the module provides a solution. This is possible with the mode &amp;quot;Proxy&amp;quot; of the einvoicing module and the platform SuperPDP:&lt;br /&gt;
&lt;br /&gt;
== On your own Dolibarr (the proxy) ==&lt;br /&gt;
*Install the module einvoicing on your own production Dolibarr of your company P.&lt;br /&gt;
*Go into Home - Setup - Other and add the constant EINVOICING_SUPERPDP_VIAPARTNER=&#039;proxy&#039;. So your Dolibarr will be able to act as a proxy between your customers C and SuperPDP. Only you need to setup the client_id and client_secret of your API account of SuperPDP (Your customer will register using a simple click, see later).&lt;br /&gt;
*Once you have set the option EINVOICING_SUPERPDP_VIAPARTNER to &#039;proxy&#039; on your own production Dolibarr, go into the setup of the module and choose &amp;quot;SuperPDP as proxy&amp;quot;.&lt;br /&gt;
*Switch to SuperPDP dashboard and create an application on your SuperPDP account. The URL to allow for OAuth is provied on the Dolibarr setup screen. You will get the client_id and client_secret. Goback  into the Dolibarr setup page of the module, and enter the keys. Remind the value of the EINVOICING_SUPERPDP_VIAPARTNER_OAUTH_URL shown, you will need it to the setup your customer instances.&lt;br /&gt;
*Once setup is done, you can switch back to the provider &amp;quot;SuperPDP direct access&amp;quot; for yourself (for your company P). The choice &amp;quot;SuperPDP Poxy&amp;quot; is here only to allow to enter some specific option. They are not lost if you go back to another Access Point provider and your Proxy is still active as long as its dedicated setup is ok.&lt;br /&gt;
&lt;br /&gt;
== On the Dolibarr of your customers ==&lt;br /&gt;
Now you can deploy the module on all instances of your customers. You must also set the followign constant on the instance of your customer: &lt;br /&gt;
* EINVOICING_SUPERPDP_VIAPARTNER_OAUTH_URL = the value provided at previous step (so one constant value for all your customers). &lt;br /&gt;
* You can also enter the constant EINVOICING_SUPERPDP_VIAPARTNER = &#039;YourCompanyName&#039;. &lt;br /&gt;
That&#039;s all. You customer will see, in the setup of the module a choice &amp;quot;Register to SuperPDP via YourCompanyName&amp;quot;. If they select this, they will see a link &amp;quot;Register to SuperPDP via YourCompanyName&amp;quot; and clicking on it will allow them to register without need to create account, no need to create an application, no need to generate and enter API key for each of your customer. The user has just to confirm the creation of its account, and a token to use its account will be recorded into its instance.&lt;br /&gt;
Also, you will see all your customer use of the API into the section &amp;quot;Sessions&amp;quot; of your SuperPDP dashboard.&lt;br /&gt;
&lt;br /&gt;
=External Tools=&lt;br /&gt;
==E-Invoicing directory==&lt;br /&gt;
&lt;br /&gt;
===Test directory===&lt;br /&gt;
To check or see companies/Einvoice ID in a directory, you can use one of these tools&lt;br /&gt;
&lt;br /&gt;
*[https://test-directory.peppol.eu/public/locale-en_US/ Test Peppol directory]&lt;br /&gt;
*[https://www.superpdp.tech/outils/info-annuaire/?query=493861496&amp;amp;mode=fr&amp;amp;env=sandbox SuperPDP tool]&lt;br /&gt;
&lt;br /&gt;
===Production directory===&lt;br /&gt;
You can use one of these tools to check if a company is in the production directory.&lt;br /&gt;
&lt;br /&gt;
*[https://directory.peppol.eu/public/locale-en_US/ Peppol directory]&lt;br /&gt;
*[https://facturation.chorus-pro.gouv.fr/annuaire/#/ French governement directory]&lt;br /&gt;
*[https://www.superpdp.tech/outils/info-annuaire/?query=493861496&amp;amp;mode=fr&amp;amp;env=production SuperPDP directory]&lt;br /&gt;
&lt;br /&gt;
==Validation of an EInvoice==&lt;br /&gt;
To validate an existing einvoice, you can use one of these tools:&lt;br /&gt;
&lt;br /&gt;
*[https://www.superpdp.tech/outils/validateur-facture-electronique From SuperPDP (CII or Factur-X einvoices)]&lt;br /&gt;
*[https://services.fnfe-mpe.org/account/home From FNFE (Factur-X only, need an account)]&lt;br /&gt;
*[https://www.itb.ec.europa.eu/invoice/upload From Europa.eu (CII or UBL)]&lt;br /&gt;
*[https://ecosio.com/en/peppol-e-invoice-xml-document-validator/ From Ecosi (CII choose CrossIndustryInvoice D16B)]&lt;br /&gt;
&lt;br /&gt;
=Troubleshooting=&lt;br /&gt;
&lt;br /&gt;
==Life cycle and error codes for French EInvoicing==&lt;br /&gt;
[[File:Le cycle de vie d’une facture électronique.png|border|1200x1200px|Lifecycle of an electronic invoice]]&lt;br /&gt;
&lt;br /&gt;
==Current error cases==&lt;br /&gt;
&lt;br /&gt;
[[File:Warning.png]] Error &amp;quot;The company fr_siren:123456789 is not subject to the e-invoicing reform&amp;quot;&lt;br /&gt;
&lt;br /&gt;
For France:&lt;br /&gt;
&lt;br /&gt;
*Check that your company can be found from this annuary: https://annuaire-entreprises.data.gouv.fr/&lt;br /&gt;
*Then check inside this one:  https://facturation.chorus-pro.gouv.fr/annuaire/#/&lt;br /&gt;
&lt;br /&gt;
If you have this error, it probably means you CAN be found in the first one but NOT in the second one. This is a problem known by the DGFIP. What to do? You can&#039;t do nothing on your own. You must wait that the french governement add your SIREN record in the second annuary too. You can try to contact import.gouv.fr asking them to &amp;quot;appear in the second annuary to activate the einvoicing&amp;quot; to make things faster, but this works only in few cases only. For all others cases you must wait you appear in the second annuary before retrying to register.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Warning.png]] Error: HTTP 400 - CREATE_ERROR - pre-check: receiver address does not accept this document.&lt;br /&gt;
&lt;br /&gt;
Check the SIREN and the Einvoice address of the customer. If you set only a SIREN with no specific Einvoice addess (the most common case), check that this SIREN exists that an Einvoice address in the network annuary exists with for this SIREN value. If you used a specific Einvoice address in addition to the SIREN, check that the couple SIREN/Einvoice address is a valid existing couple in the annuary.&lt;br /&gt;
&lt;br /&gt;
=Development=&lt;br /&gt;
&lt;br /&gt;
==Still to do==&lt;br /&gt;
&lt;br /&gt;
*The E-reporting (mandatory in France the 1st september 2027), to report sales done by the Point of Sale module for example. Planned for begin of 2027.&lt;br /&gt;
&lt;br /&gt;
==Sources==&lt;br /&gt;
{{TemplateModCommunityEn}}&lt;br /&gt;
&lt;br /&gt;
==Einvoice Specifications==&lt;br /&gt;
&lt;br /&gt;
Specification for France are available on https://www.boutique.afnor.org/en-gb/ and search on &amp;quot;XP Z12-012&amp;quot;, &amp;quot;XP Z12-013&amp;quot;, &amp;quot;XP Z12-014&amp;quot;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Field code (Business Term)&lt;br /&gt;
!Desc&lt;br /&gt;
!Field in Dolibarr&lt;br /&gt;
|-&lt;br /&gt;
|BT-1&lt;br /&gt;
|Numéro de facture&lt;br /&gt;
|ref&lt;br /&gt;
|-&lt;br /&gt;
|BT-2&lt;br /&gt;
|Date de facture&lt;br /&gt;
|date&lt;br /&gt;
|-&lt;br /&gt;
|BT-3&lt;br /&gt;
|Type de document&lt;br /&gt;
|type (380 facture, 381 avoir, 384 rectificative, 386 acompte)&lt;br /&gt;
|-&lt;br /&gt;
|BT-8&lt;br /&gt;
|Exigibilité de la TVA&lt;br /&gt;
|TAX_MODE (5 débits / 72 encaissements)&lt;br /&gt;
|-&lt;br /&gt;
|BT-9&lt;br /&gt;
|Date d&#039;échéance&lt;br /&gt;
|date_lim_reglement&lt;br /&gt;
|-&lt;br /&gt;
|BT-10&lt;br /&gt;
|Référence acheteur (code service)&lt;br /&gt;
|onglet Chorus Pro, sinon ref_client — Chorus Pro uniquement&lt;br /&gt;
|-&lt;br /&gt;
|BT-13&lt;br /&gt;
|Bon de commande du client&lt;br /&gt;
|ref_client de la facture, sinon ref_client de la commande liée&lt;br /&gt;
|-&lt;br /&gt;
|BT-14&lt;br /&gt;
|Notre numéro de commande&lt;br /&gt;
|ref de la commande liée&lt;br /&gt;
|-&lt;br /&gt;
|BT-23&lt;br /&gt;
|Cadre de facturation&lt;br /&gt;
|onglet Chorus Pro (facture ou fiche client)&lt;br /&gt;
|-&lt;br /&gt;
|BT-25&lt;br /&gt;
|Facture d&#039;origine (avoir, acompte)&lt;br /&gt;
|fk_facture_source&lt;br /&gt;
|-&lt;br /&gt;
|BT-29&lt;br /&gt;
|SIRET vendeur / acheteur&lt;br /&gt;
|Id. prof. 2 (societe / tiers)&lt;br /&gt;
|-&lt;br /&gt;
|BT-30&lt;br /&gt;
|SIREN vendeur&lt;br /&gt;
|Id. prof. 1 de votre société&lt;br /&gt;
|-&lt;br /&gt;
|BT-31&lt;br /&gt;
|N° TVA vendeur&lt;br /&gt;
|TVA intracom. de votre société&lt;br /&gt;
|-&lt;br /&gt;
|BT-34&lt;br /&gt;
|Adresse électronique vendeur&lt;br /&gt;
|SIREN de votre société, schéma 0225&lt;br /&gt;
|-&lt;br /&gt;
|BT-46&lt;br /&gt;
|SIRET acheteur&lt;br /&gt;
|Id. prof. 2 du tiers&lt;br /&gt;
|-&lt;br /&gt;
|BT-47&lt;br /&gt;
|SIREN acheteur&lt;br /&gt;
|Id. prof. 1 du tiers&lt;br /&gt;
|-&lt;br /&gt;
|BT-48&lt;br /&gt;
|N° TVA acheteur&lt;br /&gt;
|TVA intracom. du tiers&lt;br /&gt;
|-&lt;br /&gt;
|BT-49&lt;br /&gt;
|Adresse électronique acheteur&lt;br /&gt;
|Id. prof. 5 du tiers, sinon son SIREN&lt;br /&gt;
|-&lt;br /&gt;
|BT-72&lt;br /&gt;
|Date de livraison&lt;br /&gt;
|delivery_date&lt;br /&gt;
|-&lt;br /&gt;
|BT-73/74&lt;br /&gt;
|Période de service&lt;br /&gt;
|dates de service des lignes&lt;br /&gt;
|-&lt;br /&gt;
|BT-89/90/91&lt;br /&gt;
|Prélèvement SEPA (RUM, ICS)&lt;br /&gt;
|RIB par défaut du tiers, PRELEVEMENT_ICS&lt;br /&gt;
|-&lt;br /&gt;
|BT-113&lt;br /&gt;
|Acomptes déjà réglés&lt;br /&gt;
|acomptes imputés sur la facture&lt;br /&gt;
|-&lt;br /&gt;
|BT-121&lt;br /&gt;
|Motif d&#039;exonération de TVA&lt;br /&gt;
|calculé (franchise 293 B, intracom., autoliquidation, export)&lt;br /&gt;
|-&lt;br /&gt;
|BT-128&lt;br /&gt;
|Référence to other doc or object&lt;br /&gt;
|May be a reference to another invoice REF or a reference to something else (phone, ...)&lt;br /&gt;
|-&lt;br /&gt;
|BT-129&lt;br /&gt;
|Unité de la ligne&lt;br /&gt;
|unité du produit (fk_unit)&lt;br /&gt;
|-&lt;br /&gt;
|BT-146&lt;br /&gt;
|Prix unitaire&lt;br /&gt;
|total HT / quantité de la ligne&lt;br /&gt;
|-&lt;br /&gt;
|BT-151&lt;br /&gt;
|Catégorie de TVA&lt;br /&gt;
|calculée d&#039;après le taux et le contexte&lt;br /&gt;
|-&lt;br /&gt;
|BT-84&lt;br /&gt;
|IBAN / BIC&lt;br /&gt;
|compte bancaire choisi dans la configuration&amp;lt;br /&amp;gt;&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Eldy</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Module_EInvoicing_(Generic,_FR,_...)&amp;diff=67965</id>
		<title>Module EInvoicing (Generic, FR, ...)</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Module_EInvoicing_(Generic,_FR,_...)&amp;diff=67965"/>
		<updated>2026-10-08T10:42:32Z</updated>

		<summary type="html">&lt;p&gt;Eldy: /* On the Dolibarr of your customers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN origin interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- You can edit this section but do NOT remove these comments&lt;br /&gt;
     Links below will be automatically replicated on translated pages by PolyglotBot --&amp;gt;&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
[[Category:Complementary modules]]&lt;br /&gt;
{{TemplateDocDevEn}}&lt;br /&gt;
{{TemplateDocUser}}&lt;br /&gt;
=Information=&lt;br /&gt;
{{TemplateModuleInfo&lt;br /&gt;
|modulename=EInvoicing (Formerly PDPConnectFR)&lt;br /&gt;
|editor=Dolibarr community&lt;br /&gt;
|web=&lt;br /&gt;
|webbuy=From your Dolibarr v24+, menu Home - Setup - Modules - Find external modules, search on &amp;quot;einvoice&amp;quot;&lt;br /&gt;
|status=experimental&lt;br /&gt;
|prerequisites=&lt;br /&gt;
|minversion=&lt;br /&gt;
|maxversion=&lt;br /&gt;
|note=Recommended version: 24.0+&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Features=&lt;br /&gt;
This module adds support of EInvoice in Dolibarr for some countries. Generating, Sending and Receiving EInvoice is mandatory in some countries, this module deals initialy with the case of France (even if it was designed to support other countries).&lt;br /&gt;
&lt;br /&gt;
For a solution dedicated to other countries, take a look at the page [[Electronic Billing]]. &lt;br /&gt;
&lt;br /&gt;
The module allows your Dolibarr to generate EInvoice and to connect to some official Access Point (Plateforme Agréées) to send and retrieve your invoice documents. The supported EInvoice format are:&lt;br /&gt;
&lt;br /&gt;
*CII       (Dolibarr v18+, recommended Dolibarr v24+)&lt;br /&gt;
*Factur-X  (only Dolibarr v24+)&lt;br /&gt;
*More format like UBL could be added by contributing (see Development chapter)&lt;br /&gt;
&lt;br /&gt;
Warning: Using the Factur-X format is not recommended. It works with few Access Point only and even if accepted by your own AP, it may be refused by the AP of your customer due to hidden problems inside the format itself and library conflicts when using Dolibarr &amp;lt; 24.0. Also, it consumes a high amount of disk per invoice (an Einvoice may be 1 Mb if you have large images inside !) and make analysis very difficult when there is a trouble. It is highly recommended to use the CII format that is standard and supported by all Access Points, is easier to produce, analyse and process (an Einvoice is a text xml file of 10Kb only) and is not sentitive to PHP or Dolibarr versions.&lt;br /&gt;
&lt;br /&gt;
=Installation=&lt;br /&gt;
==With Dolibarr v24+==&lt;br /&gt;
Go into menu Home - Setup - Search external modules&lt;br /&gt;
Search on einvoicing and click on Install.&lt;br /&gt;
&lt;br /&gt;
The module is available. Go to configuration step.&lt;br /&gt;
&lt;br /&gt;
==With any Dolibarr version==&lt;br /&gt;
===Install from dolistore.com===&lt;br /&gt;
Go and download the archive zip of the einvocing free module from dolistore.com&lt;br /&gt;
&lt;br /&gt;
Go on menu Home - Setup - Install external module&lt;br /&gt;
Upload the zip, the module is available. Go to configuration step.&lt;br /&gt;
&lt;br /&gt;
===Install using git===&lt;br /&gt;
In the meantime, install the module in the &#039;&#039;&#039;/custom&#039;&#039;&#039; directory of your dolibarr. For this, go into the /custom directory:&lt;br /&gt;
 cd mydolibarrdir/htdocs/custom&lt;br /&gt;
Then download the module directory &#039;&#039;&#039;einvoicing&#039;&#039;&#039;&lt;br /&gt;
 git clone https://github.com/Dolibarr/dolibarr-community-modules; mkdir einvoicing; cp -pr dolibarr-community-modules/einvoicing/* einvoicing; rm -fr dolibarr-community-modules;&lt;br /&gt;
&lt;br /&gt;
=Setup=&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Using the french guide:&#039;&#039;&#039;&lt;br /&gt;
You can have a look at the french |https://www.dolicloud.com/fr/guide-facturation-electronique-dolibarr.php Guide de la facturation électronique pour Dolibarr].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Using english help:&#039;&#039;&#039;&lt;br /&gt;
Go onto the setup of the modulefrom menu &amp;quot;Home - Setup - Modules - Module EInvoice - Wheel configuration&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The first step is to choose, from the combo list, which Access Point you want to use to send your EInvoice. You can select between one in the following list:&lt;br /&gt;
&lt;br /&gt;
*SuperPDP&lt;br /&gt;
*EsaLink (hubtimize)&lt;br /&gt;
*More providers are coming (See chapter Development to know how to contibute to add your own Provider)&lt;br /&gt;
&lt;br /&gt;
All access point provided by the module are official Access Points (Plateforme Agréée).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Setup with SuperPDP Access Point==&lt;br /&gt;
If you choose [https://www.superpdp.tech SuperPDP] as your official Production Access Point (or as a Test Access Point), you must create an account by clicking on the link suggested by the setup page of the module (link should be https://www.superpdp.tech/app/users/create).&lt;br /&gt;
&lt;br /&gt;
Note that for a production usage, you may need to provide a scan of an identity card. The process of creating an account may last few minutes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Once your account is created, you must generate credentials to allow Dolibarr to connect to SuperPDP: For this, go into your SuperPDP dashboard, and from the left menu &amp;quot;&#039;&#039;&#039;Applications&#039;&#039;&#039;&amp;quot;, click on &amp;quot;&#039;&#039;&#039;New Application&#039;&#039;&#039;&amp;quot; to create a new setup for the application Dolibarr. Choose if you want a setup for Production (Real usage) or for Test (Sandbox). Then select the company and the type of application &amp;quot;&#039;&#039;&#039;Confidential&#039;&#039;&#039;&amp;quot; and click &amp;quot;&#039;&#039;&#039;Create&#039;&#039;&#039;&amp;quot; (you can keep the field &amp;quot;URLs of redirection&amp;quot; to empty or paste the value provided by Dolibarr setup page).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;The page to get credentials for an application&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:Einvoice superpdp setup.png|border]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Your credential (&#039;&#039;&#039;client_id&#039;&#039;&#039; and &#039;&#039;&#039;client_secret&#039;&#039;&#039;) are created and are shown on the next screen.&lt;br /&gt;
&lt;br /&gt;
Go into Dolibarr, into the page to setup the module EInvoice and enter these 2 values, click on Save to save the data and click on &amp;quot;Connect&amp;quot; to get the security key to exchange with SuperPDP. &lt;br /&gt;
&lt;br /&gt;
That&#039;s all, you are connected with SuperPDP (For Production usage or for Test depending on the choice you made). To be sure, you can try the link &amp;quot;Test of connection (healthcheck)&amp;quot; to verify the connection.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Example of setup for sandbox use with an account of SuperPDP&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:Einvoice setup example.png|border]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Warning.png]] By default, you can enter only one set of credentials for the Production mode and one set of credentials for the Test mode, so if your Dolibarr instance is a test instance, enter test credentials and set the switch to Test, and if your Dolibarr instance is a production instance, enter credentials of production and set the switch to Production. Even if you can switch from one environment to another one, it is seriously not recommended to save and use both Test and Production credentials in the same Dolibarr instance; Only the Access Point environment is different but your Dolibarr is the same. So if you mix two Access Point environments (Test and Prod) in the same Dolibarr, you may get or send tests invoices on your production instance (and the opposite), so the best thing to avoid this is to enter credentials only for one environment and never for the other. See chapter &amp;quot;Usage in sandbox for test&amp;quot; for more information on how to use the module in a sandbox context.&lt;br /&gt;
&lt;br /&gt;
==Setup VAT exemptions (VATEX), if applicable==&lt;br /&gt;
If your business is exempted of VAT, tell Dolibarr the default reason of exemption that will be exported in the EInvoice.&lt;br /&gt;
&lt;br /&gt;
Take note of the VATEX-xxxx code that matches your business and save it into Dolibarr:&lt;br /&gt;
&lt;br /&gt;
*In Dolibarr &amp;lt;= 23, go to &amp;quot;Configuration - Misc&amp;quot; and add a new variable &#039;&#039;&#039;MAIN_VAT_EXEMPTION_CODE_FOR_0&#039;&#039;&#039; with the VATEX-xx-xxxx matching your situation.&lt;br /&gt;
*In Dolibarr &amp;gt;24, save it to the VAT dictionary&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Example: French companies concerned with Art 293B of CGI will type &amp;lt;code&amp;gt;VATEX-FR-FRANCHISE&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Setup with Esalink/Hubtimize Access point==&lt;br /&gt;
 L&#039;utilisation de la Plateforme Agréée ESALINK ne se souscrit pas en direct&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: elle passe obligatoirement par un &#039;&#039;&#039;membre distributeur&#039;&#039;&#039; de l&#039;association PDP Libre, référencé sur la page [https://pdplibre.org/solutions/ Solutions].&lt;br /&gt;
 &lt;br /&gt;
=Usage for production=&lt;br /&gt;
==Send a customer invoice==&lt;br /&gt;
Once a Dolibarr invoice is generated (and validated), you can use a new button &amp;quot;&#039;&#039;&#039;Generate the Einvoice&#039;&#039;&#039;&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Note: you can have this action done automatically if you enable the option from menu Home - Setup - Modules - Module Einvoice - Configuration - Tab &amp;quot;other options&amp;quot; and switch &amp;quot;Generate automatically Einvoice&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Once an EInvoice has been generated, you can use the button to &amp;quot;&#039;&#039;&#039;Send the invoice&#039;&#039;&#039;&amp;quot; to the access point. Wait a minute while the access point answers and observe the returned status code:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Code 200&#039;&#039;&#039;: the access point has successfully sent the invoice to the client and is waiting for an answer from the customer&#039;s approval&lt;br /&gt;
*&#039;&#039;&#039;Code 213&#039;&#039;&#039;: rejected: the access point has detected an anomaly on the invoice. Review all invoice data and VAT fields. Download the &#039;&#039;FA-xxxxx_cii.xml&#039;&#039; file from Dolibarr and send it to [https://www.superpdp.tech/outils/validateur-facture-electronique/ a CII validator] to get more information about the anomaly. If you need help, ask [https://www.dolibarr.fr/forum/ on the forum].&lt;br /&gt;
*&#039;&#039;&#039;Code 210&#039;&#039;&#039;: the customer explicitly refused the invoice, get it touch with the customer to know why they did not accept the invoice.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note about invoices generated by the POS Module TakePOS&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
By default, any invoice generated by the POS has status &amp;quot;Do not manage Einvoice&amp;quot;. For such sales, it is not expected that you send an EInvoice. Instead you will have to send a &amp;quot;report&amp;quot; for all sales done by the point of sale (this will be supported by the module, later as this requirement is expected only for the 1st of september 2027).&lt;br /&gt;
&lt;br /&gt;
==Retrieve vendor invoices==&lt;br /&gt;
Go into menu Home - Invoice - EInvoice synchronization.&lt;br /&gt;
&lt;br /&gt;
Click on the button to launch synchronization.&lt;br /&gt;
&lt;br /&gt;
If you experience an error, follow the instruction. for example:&lt;br /&gt;
&lt;br /&gt;
*If you try to import a vendor invoice and the vendor can not be found in your Dolibarr database of suppliers, a link will be suggested to create it.&lt;br /&gt;
*If you try to import a vendor invoice and a product line can not be found in your Dolibarr database of products, a link will be suggested to create the product (You may also prefer to edit the vendor card to define a default Product Ref to use when doing an import of a product that is unknown, so each time a product is unknown for this vendor, Dolibarr will use the same default product instead of creating a new one each time).&lt;br /&gt;
&lt;br /&gt;
=Usage in the sandbox env for test=&lt;br /&gt;
Using the module in sandbox environment is the same than using it in production mode. Only the credentials to connect to your Access Point differ.&lt;br /&gt;
&lt;br /&gt;
If you are a developper, you can enable the option EINVOICING_ALLOW_DEV_TOOLS to 1 into menu &amp;quot;Home - Setup - Other&amp;quot;. This will add more features for developers into an additional tab &amp;quot;Dev tools&amp;quot;. &lt;br /&gt;
You can also switch the Test / Production mode from the main tab of the setup section of the module. WARNING: Using the switch is dangerous as it allows mixing invoices from different networks in the same Dolibarr instance.&lt;br /&gt;
&lt;br /&gt;
==Using the sandbox and Peppol test Network for tests using several Access Points==&lt;br /&gt;
If you are using credentials to use the sandbox mode of SuperPDP, you may need to modify the setup of your company (Menu Home - Setup - Company/Organization) to record the same SIREN than the one of the test company provided by SuperPDP sandbox (So &amp;quot;000000001&amp;quot; for Tricatel or &amp;quot;000000002&amp;quot; for Burger Queen).&lt;br /&gt;
&lt;br /&gt;
However the &#039;&#039;&#039;EInvoice address&#039;&#039;&#039; is NOT the same than the &#039;&#039;&#039;SIREN&#039;&#039;&#039; (it is the same in production mode only), so you must also force the Einvoice address of the company into the setup of the module Einvoice: To know your EInvoice address of your test company, go into the SuperPDP dashboard, in sandbox mode, and click on the label of the test company (for example Tricatel), you should see a list of the addresses of this test company in the annuary (the address to find you on the shared test Access Point network). The invoice address to use is the value after the &amp;quot;225:&amp;quot;, the one starting with 315143296_XXX with XXX that depends on your account.&lt;br /&gt;
Once both are saved, a warning may appear to say that SIREN and Einvoice address ID are not the same. You can ignore it in test environment.&lt;br /&gt;
&lt;br /&gt;
If your SIREN (menu Home - Setup - Company/Organisation) and your EInvoice address (menu Setup - Modules - Einvoice - Configuration) are correctly filled (Example: SIREN: 00000001 and EInvoice address 315143296_XXX), then you can send and retreive invoices from or to any other Access Points working on the Peppol Test network (The SuperPDP sandbox is automatically linked to the Peppol Test network when you use the sandbox credential).&lt;br /&gt;
&lt;br /&gt;
To send an invoice to a test customer available onto another Access Point, as the Peppol network are using addresses that are different from SIREN, you can force the customer EInvoice address from the thirdparty card by editing the field EInvoice address.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Example of the thirdparty card to send an einvoice from SuperPDP to the customer Test with SIREN 145678239 available at Esalink&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:Einvoice setup customer address.png|border]]&lt;br /&gt;
&lt;br /&gt;
=Options for integrators (mode proxy)=&lt;br /&gt;
If you are an integrator or web hosting provider (called P) and you want to provide a solution to allow your customers (Called C) to register and use the einvoicing system in one click, without having to pay (all payments will be done by yourself) the module provides a solution. This is possible with the mode &amp;quot;Proxy&amp;quot; of the einvoicing module and the platform SuperPDP:&lt;br /&gt;
&lt;br /&gt;
== On your own Dolibarr (the proxy) ==&lt;br /&gt;
*Install the module einvoicing on your own production Dolibarr of your company P.&lt;br /&gt;
*Go into Home - Setup - Other and add the constant EINVOICING_SUPERPDP_VIAPARTNER=&#039;proxy&#039;. So your Dolibarr will be able to act as a proxy between your customers C and SuperPDP. Only you need to setup the client_id and client_secret of your API account of SuperPDP (Your customer will register using a simple click, see later).&lt;br /&gt;
*Once you have set the option EINVOICING_SUPERPDP_VIAPARTNER to &#039;proxy&#039; on your own production Dolibarr, go into the setup of the module and choose &amp;quot;SuperPDP as proxy&amp;quot;.&lt;br /&gt;
*Switch to SuperPDP dashboard and create an application on your SuperPDP account. The URL to allow for OAuth is provied on the Dolibarr setup screen. You will get the client_id and client_secret. Goback  into the Dolibarr setup page of the module, and enter the keys. Remind the value of the EINVOICING_SUPERPDP_VIAPARTNER_OAUTH_URL shown, you will need it to the setup your customer instances.&lt;br /&gt;
*Once setup is done, you can switch back to the provider &amp;quot;SuperPDP direct access&amp;quot; for yourself (for your company P). The choice &amp;quot;SuperPDP Poxy&amp;quot; is here only to allow to enter some specific option. They are not lost if you go back to another Access Point provider and your Proxy is still active as long as its dedicated setup is ok.&lt;br /&gt;
&lt;br /&gt;
== On the Dolibarr of your customers ==&lt;br /&gt;
Now you can deploy the module on all instances of your customers. You must also set the followign constant on the instance of your customer: &lt;br /&gt;
* EINVOICING_SUPERPDP_VIAPARTNER_OAUTH_URL = the value provided at previous step (so one fixed value for all your customers). &lt;br /&gt;
* You can also enter the constant EINVOICING_SUPERPDP_VIAPARTNER = &#039;YourCompanyName&#039;. &lt;br /&gt;
That&#039;s all. You customer will see, in the setup of the module a choice &amp;quot;Register to SuperPDP via YourCompanyName&amp;quot;. If they select this, they will see a link &amp;quot;Register to SuperPDP via YourCompanyName&amp;quot; and clicking on it will allow them to register without need to create account, no need to create an application, no need to generate and enter API key for each of your customer. The user has just to confirm the creation of its account, and a token to use its account will be recorded into its instance.&lt;br /&gt;
Also, you will see all your customer use of the API into the section &amp;quot;Sessions&amp;quot; of your SuperPDP dashboard.&lt;br /&gt;
&lt;br /&gt;
=External Tools=&lt;br /&gt;
==E-Invoicing directory==&lt;br /&gt;
&lt;br /&gt;
===Test directory===&lt;br /&gt;
To check or see companies/Einvoice ID in a directory, you can use one of these tools&lt;br /&gt;
&lt;br /&gt;
*[https://test-directory.peppol.eu/public/locale-en_US/ Test Peppol directory]&lt;br /&gt;
*[https://www.superpdp.tech/outils/info-annuaire/?query=493861496&amp;amp;mode=fr&amp;amp;env=sandbox SuperPDP tool]&lt;br /&gt;
&lt;br /&gt;
===Production directory===&lt;br /&gt;
You can use one of these tools to check if a company is in the production directory.&lt;br /&gt;
&lt;br /&gt;
*[https://directory.peppol.eu/public/locale-en_US/ Peppol directory]&lt;br /&gt;
*[https://facturation.chorus-pro.gouv.fr/annuaire/#/ French governement directory]&lt;br /&gt;
*[https://www.superpdp.tech/outils/info-annuaire/?query=493861496&amp;amp;mode=fr&amp;amp;env=production SuperPDP directory]&lt;br /&gt;
&lt;br /&gt;
==Validation of an EInvoice==&lt;br /&gt;
To validate an existing einvoice, you can use one of these tools:&lt;br /&gt;
&lt;br /&gt;
*[https://www.superpdp.tech/outils/validateur-facture-electronique From SuperPDP (CII or Factur-X einvoices)]&lt;br /&gt;
*[https://services.fnfe-mpe.org/account/home From FNFE (Factur-X only, need an account)]&lt;br /&gt;
*[https://www.itb.ec.europa.eu/invoice/upload From Europa.eu (CII or UBL)]&lt;br /&gt;
*[https://ecosio.com/en/peppol-e-invoice-xml-document-validator/ From Ecosi (CII choose CrossIndustryInvoice D16B)]&lt;br /&gt;
&lt;br /&gt;
=Troubleshooting=&lt;br /&gt;
&lt;br /&gt;
==Life cycle and error codes for French EInvoicing==&lt;br /&gt;
[[File:Le cycle de vie d’une facture électronique.png|border|1200x1200px|Lifecycle of an electronic invoice]]&lt;br /&gt;
&lt;br /&gt;
==Current error cases==&lt;br /&gt;
&lt;br /&gt;
[[File:Warning.png]] Error &amp;quot;The company fr_siren:123456789 is not subject to the e-invoicing reform&amp;quot;&lt;br /&gt;
&lt;br /&gt;
For France:&lt;br /&gt;
&lt;br /&gt;
*Check that your company can be found from this annuary: https://annuaire-entreprises.data.gouv.fr/&lt;br /&gt;
*Then check inside this one:  https://facturation.chorus-pro.gouv.fr/annuaire/#/&lt;br /&gt;
&lt;br /&gt;
If you have this error, it probably means you CAN be found in the first one but NOT in the second one. This is a problem known by the DGFIP. What to do? You can&#039;t do nothing on your own. You must wait that the french governement add your SIREN record in the second annuary too. You can try to contact import.gouv.fr asking them to &amp;quot;appear in the second annuary to activate the einvoicing&amp;quot; to make things faster, but this works only in few cases only. For all others cases you must wait you appear in the second annuary before retrying to register.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Warning.png]] Error: HTTP 400 - CREATE_ERROR - pre-check: receiver address does not accept this document.&lt;br /&gt;
&lt;br /&gt;
Check the SIREN and the Einvoice address of the customer. If you set only a SIREN with no specific Einvoice addess (the most common case), check that this SIREN exists that an Einvoice address in the network annuary exists with for this SIREN value. If you used a specific Einvoice address in addition to the SIREN, check that the couple SIREN/Einvoice address is a valid existing couple in the annuary.&lt;br /&gt;
&lt;br /&gt;
=Development=&lt;br /&gt;
&lt;br /&gt;
==Still to do==&lt;br /&gt;
&lt;br /&gt;
*The E-reporting (mandatory in France the 1st september 2027), to report sales done by the Point of Sale module for example. Planned for begin of 2027.&lt;br /&gt;
&lt;br /&gt;
==Sources==&lt;br /&gt;
{{TemplateModCommunityEn}}&lt;br /&gt;
&lt;br /&gt;
==Einvoice Specifications==&lt;br /&gt;
&lt;br /&gt;
Specification for France are available on https://www.boutique.afnor.org/en-gb/ and search on &amp;quot;XP Z12-012&amp;quot;, &amp;quot;XP Z12-013&amp;quot;, &amp;quot;XP Z12-014&amp;quot;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Field code (Business Term)&lt;br /&gt;
!Desc&lt;br /&gt;
!Field in Dolibarr&lt;br /&gt;
|-&lt;br /&gt;
|BT-1&lt;br /&gt;
|Numéro de facture&lt;br /&gt;
|ref&lt;br /&gt;
|-&lt;br /&gt;
|BT-2&lt;br /&gt;
|Date de facture&lt;br /&gt;
|date&lt;br /&gt;
|-&lt;br /&gt;
|BT-3&lt;br /&gt;
|Type de document&lt;br /&gt;
|type (380 facture, 381 avoir, 384 rectificative, 386 acompte)&lt;br /&gt;
|-&lt;br /&gt;
|BT-8&lt;br /&gt;
|Exigibilité de la TVA&lt;br /&gt;
|TAX_MODE (5 débits / 72 encaissements)&lt;br /&gt;
|-&lt;br /&gt;
|BT-9&lt;br /&gt;
|Date d&#039;échéance&lt;br /&gt;
|date_lim_reglement&lt;br /&gt;
|-&lt;br /&gt;
|BT-10&lt;br /&gt;
|Référence acheteur (code service)&lt;br /&gt;
|onglet Chorus Pro, sinon ref_client — Chorus Pro uniquement&lt;br /&gt;
|-&lt;br /&gt;
|BT-13&lt;br /&gt;
|Bon de commande du client&lt;br /&gt;
|ref_client de la facture, sinon ref_client de la commande liée&lt;br /&gt;
|-&lt;br /&gt;
|BT-14&lt;br /&gt;
|Notre numéro de commande&lt;br /&gt;
|ref de la commande liée&lt;br /&gt;
|-&lt;br /&gt;
|BT-23&lt;br /&gt;
|Cadre de facturation&lt;br /&gt;
|onglet Chorus Pro (facture ou fiche client)&lt;br /&gt;
|-&lt;br /&gt;
|BT-25&lt;br /&gt;
|Facture d&#039;origine (avoir, acompte)&lt;br /&gt;
|fk_facture_source&lt;br /&gt;
|-&lt;br /&gt;
|BT-29&lt;br /&gt;
|SIRET vendeur / acheteur&lt;br /&gt;
|Id. prof. 2 (societe / tiers)&lt;br /&gt;
|-&lt;br /&gt;
|BT-30&lt;br /&gt;
|SIREN vendeur&lt;br /&gt;
|Id. prof. 1 de votre société&lt;br /&gt;
|-&lt;br /&gt;
|BT-31&lt;br /&gt;
|N° TVA vendeur&lt;br /&gt;
|TVA intracom. de votre société&lt;br /&gt;
|-&lt;br /&gt;
|BT-34&lt;br /&gt;
|Adresse électronique vendeur&lt;br /&gt;
|SIREN de votre société, schéma 0225&lt;br /&gt;
|-&lt;br /&gt;
|BT-46&lt;br /&gt;
|SIRET acheteur&lt;br /&gt;
|Id. prof. 2 du tiers&lt;br /&gt;
|-&lt;br /&gt;
|BT-47&lt;br /&gt;
|SIREN acheteur&lt;br /&gt;
|Id. prof. 1 du tiers&lt;br /&gt;
|-&lt;br /&gt;
|BT-48&lt;br /&gt;
|N° TVA acheteur&lt;br /&gt;
|TVA intracom. du tiers&lt;br /&gt;
|-&lt;br /&gt;
|BT-49&lt;br /&gt;
|Adresse électronique acheteur&lt;br /&gt;
|Id. prof. 5 du tiers, sinon son SIREN&lt;br /&gt;
|-&lt;br /&gt;
|BT-72&lt;br /&gt;
|Date de livraison&lt;br /&gt;
|delivery_date&lt;br /&gt;
|-&lt;br /&gt;
|BT-73/74&lt;br /&gt;
|Période de service&lt;br /&gt;
|dates de service des lignes&lt;br /&gt;
|-&lt;br /&gt;
|BT-89/90/91&lt;br /&gt;
|Prélèvement SEPA (RUM, ICS)&lt;br /&gt;
|RIB par défaut du tiers, PRELEVEMENT_ICS&lt;br /&gt;
|-&lt;br /&gt;
|BT-113&lt;br /&gt;
|Acomptes déjà réglés&lt;br /&gt;
|acomptes imputés sur la facture&lt;br /&gt;
|-&lt;br /&gt;
|BT-121&lt;br /&gt;
|Motif d&#039;exonération de TVA&lt;br /&gt;
|calculé (franchise 293 B, intracom., autoliquidation, export)&lt;br /&gt;
|-&lt;br /&gt;
|BT-128&lt;br /&gt;
|Référence to other doc or object&lt;br /&gt;
|May be a reference to another invoice REF or a reference to something else (phone, ...)&lt;br /&gt;
|-&lt;br /&gt;
|BT-129&lt;br /&gt;
|Unité de la ligne&lt;br /&gt;
|unité du produit (fk_unit)&lt;br /&gt;
|-&lt;br /&gt;
|BT-146&lt;br /&gt;
|Prix unitaire&lt;br /&gt;
|total HT / quantité de la ligne&lt;br /&gt;
|-&lt;br /&gt;
|BT-151&lt;br /&gt;
|Catégorie de TVA&lt;br /&gt;
|calculée d&#039;après le taux et le contexte&lt;br /&gt;
|-&lt;br /&gt;
|BT-84&lt;br /&gt;
|IBAN / BIC&lt;br /&gt;
|compte bancaire choisi dans la configuration&amp;lt;br /&amp;gt;&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Eldy</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Module_EInvoicing_(Generic,_FR,_...)&amp;diff=67964</id>
		<title>Module EInvoicing (Generic, FR, ...)</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Module_EInvoicing_(Generic,_FR,_...)&amp;diff=67964"/>
		<updated>2026-10-08T10:42:24Z</updated>

		<summary type="html">&lt;p&gt;Eldy: /* On the Dolibarr of your customers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN origin interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- You can edit this section but do NOT remove these comments&lt;br /&gt;
     Links below will be automatically replicated on translated pages by PolyglotBot --&amp;gt;&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
[[Category:Complementary modules]]&lt;br /&gt;
{{TemplateDocDevEn}}&lt;br /&gt;
{{TemplateDocUser}}&lt;br /&gt;
=Information=&lt;br /&gt;
{{TemplateModuleInfo&lt;br /&gt;
|modulename=EInvoicing (Formerly PDPConnectFR)&lt;br /&gt;
|editor=Dolibarr community&lt;br /&gt;
|web=&lt;br /&gt;
|webbuy=From your Dolibarr v24+, menu Home - Setup - Modules - Find external modules, search on &amp;quot;einvoice&amp;quot;&lt;br /&gt;
|status=experimental&lt;br /&gt;
|prerequisites=&lt;br /&gt;
|minversion=&lt;br /&gt;
|maxversion=&lt;br /&gt;
|note=Recommended version: 24.0+&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Features=&lt;br /&gt;
This module adds support of EInvoice in Dolibarr for some countries. Generating, Sending and Receiving EInvoice is mandatory in some countries, this module deals initialy with the case of France (even if it was designed to support other countries).&lt;br /&gt;
&lt;br /&gt;
For a solution dedicated to other countries, take a look at the page [[Electronic Billing]]. &lt;br /&gt;
&lt;br /&gt;
The module allows your Dolibarr to generate EInvoice and to connect to some official Access Point (Plateforme Agréées) to send and retrieve your invoice documents. The supported EInvoice format are:&lt;br /&gt;
&lt;br /&gt;
*CII       (Dolibarr v18+, recommended Dolibarr v24+)&lt;br /&gt;
*Factur-X  (only Dolibarr v24+)&lt;br /&gt;
*More format like UBL could be added by contributing (see Development chapter)&lt;br /&gt;
&lt;br /&gt;
Warning: Using the Factur-X format is not recommended. It works with few Access Point only and even if accepted by your own AP, it may be refused by the AP of your customer due to hidden problems inside the format itself and library conflicts when using Dolibarr &amp;lt; 24.0. Also, it consumes a high amount of disk per invoice (an Einvoice may be 1 Mb if you have large images inside !) and make analysis very difficult when there is a trouble. It is highly recommended to use the CII format that is standard and supported by all Access Points, is easier to produce, analyse and process (an Einvoice is a text xml file of 10Kb only) and is not sentitive to PHP or Dolibarr versions.&lt;br /&gt;
&lt;br /&gt;
=Installation=&lt;br /&gt;
==With Dolibarr v24+==&lt;br /&gt;
Go into menu Home - Setup - Search external modules&lt;br /&gt;
Search on einvoicing and click on Install.&lt;br /&gt;
&lt;br /&gt;
The module is available. Go to configuration step.&lt;br /&gt;
&lt;br /&gt;
==With any Dolibarr version==&lt;br /&gt;
===Install from dolistore.com===&lt;br /&gt;
Go and download the archive zip of the einvocing free module from dolistore.com&lt;br /&gt;
&lt;br /&gt;
Go on menu Home - Setup - Install external module&lt;br /&gt;
Upload the zip, the module is available. Go to configuration step.&lt;br /&gt;
&lt;br /&gt;
===Install using git===&lt;br /&gt;
In the meantime, install the module in the &#039;&#039;&#039;/custom&#039;&#039;&#039; directory of your dolibarr. For this, go into the /custom directory:&lt;br /&gt;
 cd mydolibarrdir/htdocs/custom&lt;br /&gt;
Then download the module directory &#039;&#039;&#039;einvoicing&#039;&#039;&#039;&lt;br /&gt;
 git clone https://github.com/Dolibarr/dolibarr-community-modules; mkdir einvoicing; cp -pr dolibarr-community-modules/einvoicing/* einvoicing; rm -fr dolibarr-community-modules;&lt;br /&gt;
&lt;br /&gt;
=Setup=&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Using the french guide:&#039;&#039;&#039;&lt;br /&gt;
You can have a look at the french |https://www.dolicloud.com/fr/guide-facturation-electronique-dolibarr.php Guide de la facturation électronique pour Dolibarr].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Using english help:&#039;&#039;&#039;&lt;br /&gt;
Go onto the setup of the modulefrom menu &amp;quot;Home - Setup - Modules - Module EInvoice - Wheel configuration&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The first step is to choose, from the combo list, which Access Point you want to use to send your EInvoice. You can select between one in the following list:&lt;br /&gt;
&lt;br /&gt;
*SuperPDP&lt;br /&gt;
*EsaLink (hubtimize)&lt;br /&gt;
*More providers are coming (See chapter Development to know how to contibute to add your own Provider)&lt;br /&gt;
&lt;br /&gt;
All access point provided by the module are official Access Points (Plateforme Agréée).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Setup with SuperPDP Access Point==&lt;br /&gt;
If you choose [https://www.superpdp.tech SuperPDP] as your official Production Access Point (or as a Test Access Point), you must create an account by clicking on the link suggested by the setup page of the module (link should be https://www.superpdp.tech/app/users/create).&lt;br /&gt;
&lt;br /&gt;
Note that for a production usage, you may need to provide a scan of an identity card. The process of creating an account may last few minutes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Once your account is created, you must generate credentials to allow Dolibarr to connect to SuperPDP: For this, go into your SuperPDP dashboard, and from the left menu &amp;quot;&#039;&#039;&#039;Applications&#039;&#039;&#039;&amp;quot;, click on &amp;quot;&#039;&#039;&#039;New Application&#039;&#039;&#039;&amp;quot; to create a new setup for the application Dolibarr. Choose if you want a setup for Production (Real usage) or for Test (Sandbox). Then select the company and the type of application &amp;quot;&#039;&#039;&#039;Confidential&#039;&#039;&#039;&amp;quot; and click &amp;quot;&#039;&#039;&#039;Create&#039;&#039;&#039;&amp;quot; (you can keep the field &amp;quot;URLs of redirection&amp;quot; to empty or paste the value provided by Dolibarr setup page).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;The page to get credentials for an application&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:Einvoice superpdp setup.png|border]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Your credential (&#039;&#039;&#039;client_id&#039;&#039;&#039; and &#039;&#039;&#039;client_secret&#039;&#039;&#039;) are created and are shown on the next screen.&lt;br /&gt;
&lt;br /&gt;
Go into Dolibarr, into the page to setup the module EInvoice and enter these 2 values, click on Save to save the data and click on &amp;quot;Connect&amp;quot; to get the security key to exchange with SuperPDP. &lt;br /&gt;
&lt;br /&gt;
That&#039;s all, you are connected with SuperPDP (For Production usage or for Test depending on the choice you made). To be sure, you can try the link &amp;quot;Test of connection (healthcheck)&amp;quot; to verify the connection.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Example of setup for sandbox use with an account of SuperPDP&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:Einvoice setup example.png|border]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Warning.png]] By default, you can enter only one set of credentials for the Production mode and one set of credentials for the Test mode, so if your Dolibarr instance is a test instance, enter test credentials and set the switch to Test, and if your Dolibarr instance is a production instance, enter credentials of production and set the switch to Production. Even if you can switch from one environment to another one, it is seriously not recommended to save and use both Test and Production credentials in the same Dolibarr instance; Only the Access Point environment is different but your Dolibarr is the same. So if you mix two Access Point environments (Test and Prod) in the same Dolibarr, you may get or send tests invoices on your production instance (and the opposite), so the best thing to avoid this is to enter credentials only for one environment and never for the other. See chapter &amp;quot;Usage in sandbox for test&amp;quot; for more information on how to use the module in a sandbox context.&lt;br /&gt;
&lt;br /&gt;
==Setup VAT exemptions (VATEX), if applicable==&lt;br /&gt;
If your business is exempted of VAT, tell Dolibarr the default reason of exemption that will be exported in the EInvoice.&lt;br /&gt;
&lt;br /&gt;
Take note of the VATEX-xxxx code that matches your business and save it into Dolibarr:&lt;br /&gt;
&lt;br /&gt;
*In Dolibarr &amp;lt;= 23, go to &amp;quot;Configuration - Misc&amp;quot; and add a new variable &#039;&#039;&#039;MAIN_VAT_EXEMPTION_CODE_FOR_0&#039;&#039;&#039; with the VATEX-xx-xxxx matching your situation.&lt;br /&gt;
*In Dolibarr &amp;gt;24, save it to the VAT dictionary&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Example: French companies concerned with Art 293B of CGI will type &amp;lt;code&amp;gt;VATEX-FR-FRANCHISE&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Setup with Esalink/Hubtimize Access point==&lt;br /&gt;
 L&#039;utilisation de la Plateforme Agréée ESALINK ne se souscrit pas en direct&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: elle passe obligatoirement par un &#039;&#039;&#039;membre distributeur&#039;&#039;&#039; de l&#039;association PDP Libre, référencé sur la page [https://pdplibre.org/solutions/ Solutions].&lt;br /&gt;
 &lt;br /&gt;
=Usage for production=&lt;br /&gt;
==Send a customer invoice==&lt;br /&gt;
Once a Dolibarr invoice is generated (and validated), you can use a new button &amp;quot;&#039;&#039;&#039;Generate the Einvoice&#039;&#039;&#039;&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Note: you can have this action done automatically if you enable the option from menu Home - Setup - Modules - Module Einvoice - Configuration - Tab &amp;quot;other options&amp;quot; and switch &amp;quot;Generate automatically Einvoice&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Once an EInvoice has been generated, you can use the button to &amp;quot;&#039;&#039;&#039;Send the invoice&#039;&#039;&#039;&amp;quot; to the access point. Wait a minute while the access point answers and observe the returned status code:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Code 200&#039;&#039;&#039;: the access point has successfully sent the invoice to the client and is waiting for an answer from the customer&#039;s approval&lt;br /&gt;
*&#039;&#039;&#039;Code 213&#039;&#039;&#039;: rejected: the access point has detected an anomaly on the invoice. Review all invoice data and VAT fields. Download the &#039;&#039;FA-xxxxx_cii.xml&#039;&#039; file from Dolibarr and send it to [https://www.superpdp.tech/outils/validateur-facture-electronique/ a CII validator] to get more information about the anomaly. If you need help, ask [https://www.dolibarr.fr/forum/ on the forum].&lt;br /&gt;
*&#039;&#039;&#039;Code 210&#039;&#039;&#039;: the customer explicitly refused the invoice, get it touch with the customer to know why they did not accept the invoice.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note about invoices generated by the POS Module TakePOS&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
By default, any invoice generated by the POS has status &amp;quot;Do not manage Einvoice&amp;quot;. For such sales, it is not expected that you send an EInvoice. Instead you will have to send a &amp;quot;report&amp;quot; for all sales done by the point of sale (this will be supported by the module, later as this requirement is expected only for the 1st of september 2027).&lt;br /&gt;
&lt;br /&gt;
==Retrieve vendor invoices==&lt;br /&gt;
Go into menu Home - Invoice - EInvoice synchronization.&lt;br /&gt;
&lt;br /&gt;
Click on the button to launch synchronization.&lt;br /&gt;
&lt;br /&gt;
If you experience an error, follow the instruction. for example:&lt;br /&gt;
&lt;br /&gt;
*If you try to import a vendor invoice and the vendor can not be found in your Dolibarr database of suppliers, a link will be suggested to create it.&lt;br /&gt;
*If you try to import a vendor invoice and a product line can not be found in your Dolibarr database of products, a link will be suggested to create the product (You may also prefer to edit the vendor card to define a default Product Ref to use when doing an import of a product that is unknown, so each time a product is unknown for this vendor, Dolibarr will use the same default product instead of creating a new one each time).&lt;br /&gt;
&lt;br /&gt;
=Usage in the sandbox env for test=&lt;br /&gt;
Using the module in sandbox environment is the same than using it in production mode. Only the credentials to connect to your Access Point differ.&lt;br /&gt;
&lt;br /&gt;
If you are a developper, you can enable the option EINVOICING_ALLOW_DEV_TOOLS to 1 into menu &amp;quot;Home - Setup - Other&amp;quot;. This will add more features for developers into an additional tab &amp;quot;Dev tools&amp;quot;. &lt;br /&gt;
You can also switch the Test / Production mode from the main tab of the setup section of the module. WARNING: Using the switch is dangerous as it allows mixing invoices from different networks in the same Dolibarr instance.&lt;br /&gt;
&lt;br /&gt;
==Using the sandbox and Peppol test Network for tests using several Access Points==&lt;br /&gt;
If you are using credentials to use the sandbox mode of SuperPDP, you may need to modify the setup of your company (Menu Home - Setup - Company/Organization) to record the same SIREN than the one of the test company provided by SuperPDP sandbox (So &amp;quot;000000001&amp;quot; for Tricatel or &amp;quot;000000002&amp;quot; for Burger Queen).&lt;br /&gt;
&lt;br /&gt;
However the &#039;&#039;&#039;EInvoice address&#039;&#039;&#039; is NOT the same than the &#039;&#039;&#039;SIREN&#039;&#039;&#039; (it is the same in production mode only), so you must also force the Einvoice address of the company into the setup of the module Einvoice: To know your EInvoice address of your test company, go into the SuperPDP dashboard, in sandbox mode, and click on the label of the test company (for example Tricatel), you should see a list of the addresses of this test company in the annuary (the address to find you on the shared test Access Point network). The invoice address to use is the value after the &amp;quot;225:&amp;quot;, the one starting with 315143296_XXX with XXX that depends on your account.&lt;br /&gt;
Once both are saved, a warning may appear to say that SIREN and Einvoice address ID are not the same. You can ignore it in test environment.&lt;br /&gt;
&lt;br /&gt;
If your SIREN (menu Home - Setup - Company/Organisation) and your EInvoice address (menu Setup - Modules - Einvoice - Configuration) are correctly filled (Example: SIREN: 00000001 and EInvoice address 315143296_XXX), then you can send and retreive invoices from or to any other Access Points working on the Peppol Test network (The SuperPDP sandbox is automatically linked to the Peppol Test network when you use the sandbox credential).&lt;br /&gt;
&lt;br /&gt;
To send an invoice to a test customer available onto another Access Point, as the Peppol network are using addresses that are different from SIREN, you can force the customer EInvoice address from the thirdparty card by editing the field EInvoice address.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Example of the thirdparty card to send an einvoice from SuperPDP to the customer Test with SIREN 145678239 available at Esalink&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:Einvoice setup customer address.png|border]]&lt;br /&gt;
&lt;br /&gt;
=Options for integrators (mode proxy)=&lt;br /&gt;
If you are an integrator or web hosting provider (called P) and you want to provide a solution to allow your customers (Called C) to register and use the einvoicing system in one click, without having to pay (all payments will be done by yourself) the module provides a solution. This is possible with the mode &amp;quot;Proxy&amp;quot; of the einvoicing module and the platform SuperPDP:&lt;br /&gt;
&lt;br /&gt;
== On your own Dolibarr (the proxy) ==&lt;br /&gt;
*Install the module einvoicing on your own production Dolibarr of your company P.&lt;br /&gt;
*Go into Home - Setup - Other and add the constant EINVOICING_SUPERPDP_VIAPARTNER=&#039;proxy&#039;. So your Dolibarr will be able to act as a proxy between your customers C and SuperPDP. Only you need to setup the client_id and client_secret of your API account of SuperPDP (Your customer will register using a simple click, see later).&lt;br /&gt;
*Once you have set the option EINVOICING_SUPERPDP_VIAPARTNER to &#039;proxy&#039; on your own production Dolibarr, go into the setup of the module and choose &amp;quot;SuperPDP as proxy&amp;quot;.&lt;br /&gt;
*Switch to SuperPDP dashboard and create an application on your SuperPDP account. The URL to allow for OAuth is provied on the Dolibarr setup screen. You will get the client_id and client_secret. Goback  into the Dolibarr setup page of the module, and enter the keys. Remind the value of the EINVOICING_SUPERPDP_VIAPARTNER_OAUTH_URL shown, you will need it to the setup your customer instances.&lt;br /&gt;
*Once setup is done, you can switch back to the provider &amp;quot;SuperPDP direct access&amp;quot; for yourself (for your company P). The choice &amp;quot;SuperPDP Poxy&amp;quot; is here only to allow to enter some specific option. They are not lost if you go back to another Access Point provider and your Proxy is still active as long as its dedicated setup is ok.&lt;br /&gt;
&lt;br /&gt;
== On the Dolibarr of your customers ==&lt;br /&gt;
Now you can deploy the module on all instances of your customers. You must also set the followign constant on the instance of your customer: &lt;br /&gt;
** EINVOICING_SUPERPDP_VIAPARTNER_OAUTH_URL = the value provided at previous step (so one fixed value for all your customers). &lt;br /&gt;
** You can also enter the constant EINVOICING_SUPERPDP_VIAPARTNER = &#039;YourCompanyName&#039;. &lt;br /&gt;
That&#039;s all. You customer will see, in the setup of the module a choice &amp;quot;Register to SuperPDP via YourCompanyName&amp;quot;. If they select this, they will see a link &amp;quot;Register to SuperPDP via YourCompanyName&amp;quot; and clicking on it will allow them to register without need to create account, no need to create an application, no need to generate and enter API key for each of your customer. The user has just to confirm the creation of its account, and a token to use its account will be recorded into its instance.&lt;br /&gt;
Also, you will see all your customer use of the API into the section &amp;quot;Sessions&amp;quot; of your SuperPDP dashboard.&lt;br /&gt;
&lt;br /&gt;
=External Tools=&lt;br /&gt;
==E-Invoicing directory==&lt;br /&gt;
&lt;br /&gt;
===Test directory===&lt;br /&gt;
To check or see companies/Einvoice ID in a directory, you can use one of these tools&lt;br /&gt;
&lt;br /&gt;
*[https://test-directory.peppol.eu/public/locale-en_US/ Test Peppol directory]&lt;br /&gt;
*[https://www.superpdp.tech/outils/info-annuaire/?query=493861496&amp;amp;mode=fr&amp;amp;env=sandbox SuperPDP tool]&lt;br /&gt;
&lt;br /&gt;
===Production directory===&lt;br /&gt;
You can use one of these tools to check if a company is in the production directory.&lt;br /&gt;
&lt;br /&gt;
*[https://directory.peppol.eu/public/locale-en_US/ Peppol directory]&lt;br /&gt;
*[https://facturation.chorus-pro.gouv.fr/annuaire/#/ French governement directory]&lt;br /&gt;
*[https://www.superpdp.tech/outils/info-annuaire/?query=493861496&amp;amp;mode=fr&amp;amp;env=production SuperPDP directory]&lt;br /&gt;
&lt;br /&gt;
==Validation of an EInvoice==&lt;br /&gt;
To validate an existing einvoice, you can use one of these tools:&lt;br /&gt;
&lt;br /&gt;
*[https://www.superpdp.tech/outils/validateur-facture-electronique From SuperPDP (CII or Factur-X einvoices)]&lt;br /&gt;
*[https://services.fnfe-mpe.org/account/home From FNFE (Factur-X only, need an account)]&lt;br /&gt;
*[https://www.itb.ec.europa.eu/invoice/upload From Europa.eu (CII or UBL)]&lt;br /&gt;
*[https://ecosio.com/en/peppol-e-invoice-xml-document-validator/ From Ecosi (CII choose CrossIndustryInvoice D16B)]&lt;br /&gt;
&lt;br /&gt;
=Troubleshooting=&lt;br /&gt;
&lt;br /&gt;
==Life cycle and error codes for French EInvoicing==&lt;br /&gt;
[[File:Le cycle de vie d’une facture électronique.png|border|1200x1200px|Lifecycle of an electronic invoice]]&lt;br /&gt;
&lt;br /&gt;
==Current error cases==&lt;br /&gt;
&lt;br /&gt;
[[File:Warning.png]] Error &amp;quot;The company fr_siren:123456789 is not subject to the e-invoicing reform&amp;quot;&lt;br /&gt;
&lt;br /&gt;
For France:&lt;br /&gt;
&lt;br /&gt;
*Check that your company can be found from this annuary: https://annuaire-entreprises.data.gouv.fr/&lt;br /&gt;
*Then check inside this one:  https://facturation.chorus-pro.gouv.fr/annuaire/#/&lt;br /&gt;
&lt;br /&gt;
If you have this error, it probably means you CAN be found in the first one but NOT in the second one. This is a problem known by the DGFIP. What to do? You can&#039;t do nothing on your own. You must wait that the french governement add your SIREN record in the second annuary too. You can try to contact import.gouv.fr asking them to &amp;quot;appear in the second annuary to activate the einvoicing&amp;quot; to make things faster, but this works only in few cases only. For all others cases you must wait you appear in the second annuary before retrying to register.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Warning.png]] Error: HTTP 400 - CREATE_ERROR - pre-check: receiver address does not accept this document.&lt;br /&gt;
&lt;br /&gt;
Check the SIREN and the Einvoice address of the customer. If you set only a SIREN with no specific Einvoice addess (the most common case), check that this SIREN exists that an Einvoice address in the network annuary exists with for this SIREN value. If you used a specific Einvoice address in addition to the SIREN, check that the couple SIREN/Einvoice address is a valid existing couple in the annuary.&lt;br /&gt;
&lt;br /&gt;
=Development=&lt;br /&gt;
&lt;br /&gt;
==Still to do==&lt;br /&gt;
&lt;br /&gt;
*The E-reporting (mandatory in France the 1st september 2027), to report sales done by the Point of Sale module for example. Planned for begin of 2027.&lt;br /&gt;
&lt;br /&gt;
==Sources==&lt;br /&gt;
{{TemplateModCommunityEn}}&lt;br /&gt;
&lt;br /&gt;
==Einvoice Specifications==&lt;br /&gt;
&lt;br /&gt;
Specification for France are available on https://www.boutique.afnor.org/en-gb/ and search on &amp;quot;XP Z12-012&amp;quot;, &amp;quot;XP Z12-013&amp;quot;, &amp;quot;XP Z12-014&amp;quot;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Field code (Business Term)&lt;br /&gt;
!Desc&lt;br /&gt;
!Field in Dolibarr&lt;br /&gt;
|-&lt;br /&gt;
|BT-1&lt;br /&gt;
|Numéro de facture&lt;br /&gt;
|ref&lt;br /&gt;
|-&lt;br /&gt;
|BT-2&lt;br /&gt;
|Date de facture&lt;br /&gt;
|date&lt;br /&gt;
|-&lt;br /&gt;
|BT-3&lt;br /&gt;
|Type de document&lt;br /&gt;
|type (380 facture, 381 avoir, 384 rectificative, 386 acompte)&lt;br /&gt;
|-&lt;br /&gt;
|BT-8&lt;br /&gt;
|Exigibilité de la TVA&lt;br /&gt;
|TAX_MODE (5 débits / 72 encaissements)&lt;br /&gt;
|-&lt;br /&gt;
|BT-9&lt;br /&gt;
|Date d&#039;échéance&lt;br /&gt;
|date_lim_reglement&lt;br /&gt;
|-&lt;br /&gt;
|BT-10&lt;br /&gt;
|Référence acheteur (code service)&lt;br /&gt;
|onglet Chorus Pro, sinon ref_client — Chorus Pro uniquement&lt;br /&gt;
|-&lt;br /&gt;
|BT-13&lt;br /&gt;
|Bon de commande du client&lt;br /&gt;
|ref_client de la facture, sinon ref_client de la commande liée&lt;br /&gt;
|-&lt;br /&gt;
|BT-14&lt;br /&gt;
|Notre numéro de commande&lt;br /&gt;
|ref de la commande liée&lt;br /&gt;
|-&lt;br /&gt;
|BT-23&lt;br /&gt;
|Cadre de facturation&lt;br /&gt;
|onglet Chorus Pro (facture ou fiche client)&lt;br /&gt;
|-&lt;br /&gt;
|BT-25&lt;br /&gt;
|Facture d&#039;origine (avoir, acompte)&lt;br /&gt;
|fk_facture_source&lt;br /&gt;
|-&lt;br /&gt;
|BT-29&lt;br /&gt;
|SIRET vendeur / acheteur&lt;br /&gt;
|Id. prof. 2 (societe / tiers)&lt;br /&gt;
|-&lt;br /&gt;
|BT-30&lt;br /&gt;
|SIREN vendeur&lt;br /&gt;
|Id. prof. 1 de votre société&lt;br /&gt;
|-&lt;br /&gt;
|BT-31&lt;br /&gt;
|N° TVA vendeur&lt;br /&gt;
|TVA intracom. de votre société&lt;br /&gt;
|-&lt;br /&gt;
|BT-34&lt;br /&gt;
|Adresse électronique vendeur&lt;br /&gt;
|SIREN de votre société, schéma 0225&lt;br /&gt;
|-&lt;br /&gt;
|BT-46&lt;br /&gt;
|SIRET acheteur&lt;br /&gt;
|Id. prof. 2 du tiers&lt;br /&gt;
|-&lt;br /&gt;
|BT-47&lt;br /&gt;
|SIREN acheteur&lt;br /&gt;
|Id. prof. 1 du tiers&lt;br /&gt;
|-&lt;br /&gt;
|BT-48&lt;br /&gt;
|N° TVA acheteur&lt;br /&gt;
|TVA intracom. du tiers&lt;br /&gt;
|-&lt;br /&gt;
|BT-49&lt;br /&gt;
|Adresse électronique acheteur&lt;br /&gt;
|Id. prof. 5 du tiers, sinon son SIREN&lt;br /&gt;
|-&lt;br /&gt;
|BT-72&lt;br /&gt;
|Date de livraison&lt;br /&gt;
|delivery_date&lt;br /&gt;
|-&lt;br /&gt;
|BT-73/74&lt;br /&gt;
|Période de service&lt;br /&gt;
|dates de service des lignes&lt;br /&gt;
|-&lt;br /&gt;
|BT-89/90/91&lt;br /&gt;
|Prélèvement SEPA (RUM, ICS)&lt;br /&gt;
|RIB par défaut du tiers, PRELEVEMENT_ICS&lt;br /&gt;
|-&lt;br /&gt;
|BT-113&lt;br /&gt;
|Acomptes déjà réglés&lt;br /&gt;
|acomptes imputés sur la facture&lt;br /&gt;
|-&lt;br /&gt;
|BT-121&lt;br /&gt;
|Motif d&#039;exonération de TVA&lt;br /&gt;
|calculé (franchise 293 B, intracom., autoliquidation, export)&lt;br /&gt;
|-&lt;br /&gt;
|BT-128&lt;br /&gt;
|Référence to other doc or object&lt;br /&gt;
|May be a reference to another invoice REF or a reference to something else (phone, ...)&lt;br /&gt;
|-&lt;br /&gt;
|BT-129&lt;br /&gt;
|Unité de la ligne&lt;br /&gt;
|unité du produit (fk_unit)&lt;br /&gt;
|-&lt;br /&gt;
|BT-146&lt;br /&gt;
|Prix unitaire&lt;br /&gt;
|total HT / quantité de la ligne&lt;br /&gt;
|-&lt;br /&gt;
|BT-151&lt;br /&gt;
|Catégorie de TVA&lt;br /&gt;
|calculée d&#039;après le taux et le contexte&lt;br /&gt;
|-&lt;br /&gt;
|BT-84&lt;br /&gt;
|IBAN / BIC&lt;br /&gt;
|compte bancaire choisi dans la configuration&amp;lt;br /&amp;gt;&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Eldy</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Module_EInvoicing_(Generic,_FR,_...)&amp;diff=67963</id>
		<title>Module EInvoicing (Generic, FR, ...)</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Module_EInvoicing_(Generic,_FR,_...)&amp;diff=67963"/>
		<updated>2026-10-08T10:42:10Z</updated>

		<summary type="html">&lt;p&gt;Eldy: /* Options for integrators (mode proxy) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN origin interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- You can edit this section but do NOT remove these comments&lt;br /&gt;
     Links below will be automatically replicated on translated pages by PolyglotBot --&amp;gt;&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
[[Category:Complementary modules]]&lt;br /&gt;
{{TemplateDocDevEn}}&lt;br /&gt;
{{TemplateDocUser}}&lt;br /&gt;
=Information=&lt;br /&gt;
{{TemplateModuleInfo&lt;br /&gt;
|modulename=EInvoicing (Formerly PDPConnectFR)&lt;br /&gt;
|editor=Dolibarr community&lt;br /&gt;
|web=&lt;br /&gt;
|webbuy=From your Dolibarr v24+, menu Home - Setup - Modules - Find external modules, search on &amp;quot;einvoice&amp;quot;&lt;br /&gt;
|status=experimental&lt;br /&gt;
|prerequisites=&lt;br /&gt;
|minversion=&lt;br /&gt;
|maxversion=&lt;br /&gt;
|note=Recommended version: 24.0+&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Features=&lt;br /&gt;
This module adds support of EInvoice in Dolibarr for some countries. Generating, Sending and Receiving EInvoice is mandatory in some countries, this module deals initialy with the case of France (even if it was designed to support other countries).&lt;br /&gt;
&lt;br /&gt;
For a solution dedicated to other countries, take a look at the page [[Electronic Billing]]. &lt;br /&gt;
&lt;br /&gt;
The module allows your Dolibarr to generate EInvoice and to connect to some official Access Point (Plateforme Agréées) to send and retrieve your invoice documents. The supported EInvoice format are:&lt;br /&gt;
&lt;br /&gt;
*CII       (Dolibarr v18+, recommended Dolibarr v24+)&lt;br /&gt;
*Factur-X  (only Dolibarr v24+)&lt;br /&gt;
*More format like UBL could be added by contributing (see Development chapter)&lt;br /&gt;
&lt;br /&gt;
Warning: Using the Factur-X format is not recommended. It works with few Access Point only and even if accepted by your own AP, it may be refused by the AP of your customer due to hidden problems inside the format itself and library conflicts when using Dolibarr &amp;lt; 24.0. Also, it consumes a high amount of disk per invoice (an Einvoice may be 1 Mb if you have large images inside !) and make analysis very difficult when there is a trouble. It is highly recommended to use the CII format that is standard and supported by all Access Points, is easier to produce, analyse and process (an Einvoice is a text xml file of 10Kb only) and is not sentitive to PHP or Dolibarr versions.&lt;br /&gt;
&lt;br /&gt;
=Installation=&lt;br /&gt;
==With Dolibarr v24+==&lt;br /&gt;
Go into menu Home - Setup - Search external modules&lt;br /&gt;
Search on einvoicing and click on Install.&lt;br /&gt;
&lt;br /&gt;
The module is available. Go to configuration step.&lt;br /&gt;
&lt;br /&gt;
==With any Dolibarr version==&lt;br /&gt;
===Install from dolistore.com===&lt;br /&gt;
Go and download the archive zip of the einvocing free module from dolistore.com&lt;br /&gt;
&lt;br /&gt;
Go on menu Home - Setup - Install external module&lt;br /&gt;
Upload the zip, the module is available. Go to configuration step.&lt;br /&gt;
&lt;br /&gt;
===Install using git===&lt;br /&gt;
In the meantime, install the module in the &#039;&#039;&#039;/custom&#039;&#039;&#039; directory of your dolibarr. For this, go into the /custom directory:&lt;br /&gt;
 cd mydolibarrdir/htdocs/custom&lt;br /&gt;
Then download the module directory &#039;&#039;&#039;einvoicing&#039;&#039;&#039;&lt;br /&gt;
 git clone https://github.com/Dolibarr/dolibarr-community-modules; mkdir einvoicing; cp -pr dolibarr-community-modules/einvoicing/* einvoicing; rm -fr dolibarr-community-modules;&lt;br /&gt;
&lt;br /&gt;
=Setup=&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Using the french guide:&#039;&#039;&#039;&lt;br /&gt;
You can have a look at the french |https://www.dolicloud.com/fr/guide-facturation-electronique-dolibarr.php Guide de la facturation électronique pour Dolibarr].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Using english help:&#039;&#039;&#039;&lt;br /&gt;
Go onto the setup of the modulefrom menu &amp;quot;Home - Setup - Modules - Module EInvoice - Wheel configuration&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The first step is to choose, from the combo list, which Access Point you want to use to send your EInvoice. You can select between one in the following list:&lt;br /&gt;
&lt;br /&gt;
*SuperPDP&lt;br /&gt;
*EsaLink (hubtimize)&lt;br /&gt;
*More providers are coming (See chapter Development to know how to contibute to add your own Provider)&lt;br /&gt;
&lt;br /&gt;
All access point provided by the module are official Access Points (Plateforme Agréée).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Setup with SuperPDP Access Point==&lt;br /&gt;
If you choose [https://www.superpdp.tech SuperPDP] as your official Production Access Point (or as a Test Access Point), you must create an account by clicking on the link suggested by the setup page of the module (link should be https://www.superpdp.tech/app/users/create).&lt;br /&gt;
&lt;br /&gt;
Note that for a production usage, you may need to provide a scan of an identity card. The process of creating an account may last few minutes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Once your account is created, you must generate credentials to allow Dolibarr to connect to SuperPDP: For this, go into your SuperPDP dashboard, and from the left menu &amp;quot;&#039;&#039;&#039;Applications&#039;&#039;&#039;&amp;quot;, click on &amp;quot;&#039;&#039;&#039;New Application&#039;&#039;&#039;&amp;quot; to create a new setup for the application Dolibarr. Choose if you want a setup for Production (Real usage) or for Test (Sandbox). Then select the company and the type of application &amp;quot;&#039;&#039;&#039;Confidential&#039;&#039;&#039;&amp;quot; and click &amp;quot;&#039;&#039;&#039;Create&#039;&#039;&#039;&amp;quot; (you can keep the field &amp;quot;URLs of redirection&amp;quot; to empty or paste the value provided by Dolibarr setup page).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;The page to get credentials for an application&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:Einvoice superpdp setup.png|border]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Your credential (&#039;&#039;&#039;client_id&#039;&#039;&#039; and &#039;&#039;&#039;client_secret&#039;&#039;&#039;) are created and are shown on the next screen.&lt;br /&gt;
&lt;br /&gt;
Go into Dolibarr, into the page to setup the module EInvoice and enter these 2 values, click on Save to save the data and click on &amp;quot;Connect&amp;quot; to get the security key to exchange with SuperPDP. &lt;br /&gt;
&lt;br /&gt;
That&#039;s all, you are connected with SuperPDP (For Production usage or for Test depending on the choice you made). To be sure, you can try the link &amp;quot;Test of connection (healthcheck)&amp;quot; to verify the connection.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Example of setup for sandbox use with an account of SuperPDP&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:Einvoice setup example.png|border]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Warning.png]] By default, you can enter only one set of credentials for the Production mode and one set of credentials for the Test mode, so if your Dolibarr instance is a test instance, enter test credentials and set the switch to Test, and if your Dolibarr instance is a production instance, enter credentials of production and set the switch to Production. Even if you can switch from one environment to another one, it is seriously not recommended to save and use both Test and Production credentials in the same Dolibarr instance; Only the Access Point environment is different but your Dolibarr is the same. So if you mix two Access Point environments (Test and Prod) in the same Dolibarr, you may get or send tests invoices on your production instance (and the opposite), so the best thing to avoid this is to enter credentials only for one environment and never for the other. See chapter &amp;quot;Usage in sandbox for test&amp;quot; for more information on how to use the module in a sandbox context.&lt;br /&gt;
&lt;br /&gt;
==Setup VAT exemptions (VATEX), if applicable==&lt;br /&gt;
If your business is exempted of VAT, tell Dolibarr the default reason of exemption that will be exported in the EInvoice.&lt;br /&gt;
&lt;br /&gt;
Take note of the VATEX-xxxx code that matches your business and save it into Dolibarr:&lt;br /&gt;
&lt;br /&gt;
*In Dolibarr &amp;lt;= 23, go to &amp;quot;Configuration - Misc&amp;quot; and add a new variable &#039;&#039;&#039;MAIN_VAT_EXEMPTION_CODE_FOR_0&#039;&#039;&#039; with the VATEX-xx-xxxx matching your situation.&lt;br /&gt;
*In Dolibarr &amp;gt;24, save it to the VAT dictionary&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Example: French companies concerned with Art 293B of CGI will type &amp;lt;code&amp;gt;VATEX-FR-FRANCHISE&amp;lt;/code&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Setup with Esalink/Hubtimize Access point==&lt;br /&gt;
 L&#039;utilisation de la Plateforme Agréée ESALINK ne se souscrit pas en direct&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: elle passe obligatoirement par un &#039;&#039;&#039;membre distributeur&#039;&#039;&#039; de l&#039;association PDP Libre, référencé sur la page [https://pdplibre.org/solutions/ Solutions].&lt;br /&gt;
 &lt;br /&gt;
=Usage for production=&lt;br /&gt;
==Send a customer invoice==&lt;br /&gt;
Once a Dolibarr invoice is generated (and validated), you can use a new button &amp;quot;&#039;&#039;&#039;Generate the Einvoice&#039;&#039;&#039;&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Note: you can have this action done automatically if you enable the option from menu Home - Setup - Modules - Module Einvoice - Configuration - Tab &amp;quot;other options&amp;quot; and switch &amp;quot;Generate automatically Einvoice&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Once an EInvoice has been generated, you can use the button to &amp;quot;&#039;&#039;&#039;Send the invoice&#039;&#039;&#039;&amp;quot; to the access point. Wait a minute while the access point answers and observe the returned status code:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Code 200&#039;&#039;&#039;: the access point has successfully sent the invoice to the client and is waiting for an answer from the customer&#039;s approval&lt;br /&gt;
*&#039;&#039;&#039;Code 213&#039;&#039;&#039;: rejected: the access point has detected an anomaly on the invoice. Review all invoice data and VAT fields. Download the &#039;&#039;FA-xxxxx_cii.xml&#039;&#039; file from Dolibarr and send it to [https://www.superpdp.tech/outils/validateur-facture-electronique/ a CII validator] to get more information about the anomaly. If you need help, ask [https://www.dolibarr.fr/forum/ on the forum].&lt;br /&gt;
*&#039;&#039;&#039;Code 210&#039;&#039;&#039;: the customer explicitly refused the invoice, get it touch with the customer to know why they did not accept the invoice.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note about invoices generated by the POS Module TakePOS&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
By default, any invoice generated by the POS has status &amp;quot;Do not manage Einvoice&amp;quot;. For such sales, it is not expected that you send an EInvoice. Instead you will have to send a &amp;quot;report&amp;quot; for all sales done by the point of sale (this will be supported by the module, later as this requirement is expected only for the 1st of september 2027).&lt;br /&gt;
&lt;br /&gt;
==Retrieve vendor invoices==&lt;br /&gt;
Go into menu Home - Invoice - EInvoice synchronization.&lt;br /&gt;
&lt;br /&gt;
Click on the button to launch synchronization.&lt;br /&gt;
&lt;br /&gt;
If you experience an error, follow the instruction. for example:&lt;br /&gt;
&lt;br /&gt;
*If you try to import a vendor invoice and the vendor can not be found in your Dolibarr database of suppliers, a link will be suggested to create it.&lt;br /&gt;
*If you try to import a vendor invoice and a product line can not be found in your Dolibarr database of products, a link will be suggested to create the product (You may also prefer to edit the vendor card to define a default Product Ref to use when doing an import of a product that is unknown, so each time a product is unknown for this vendor, Dolibarr will use the same default product instead of creating a new one each time).&lt;br /&gt;
&lt;br /&gt;
=Usage in the sandbox env for test=&lt;br /&gt;
Using the module in sandbox environment is the same than using it in production mode. Only the credentials to connect to your Access Point differ.&lt;br /&gt;
&lt;br /&gt;
If you are a developper, you can enable the option EINVOICING_ALLOW_DEV_TOOLS to 1 into menu &amp;quot;Home - Setup - Other&amp;quot;. This will add more features for developers into an additional tab &amp;quot;Dev tools&amp;quot;. &lt;br /&gt;
You can also switch the Test / Production mode from the main tab of the setup section of the module. WARNING: Using the switch is dangerous as it allows mixing invoices from different networks in the same Dolibarr instance.&lt;br /&gt;
&lt;br /&gt;
==Using the sandbox and Peppol test Network for tests using several Access Points==&lt;br /&gt;
If you are using credentials to use the sandbox mode of SuperPDP, you may need to modify the setup of your company (Menu Home - Setup - Company/Organization) to record the same SIREN than the one of the test company provided by SuperPDP sandbox (So &amp;quot;000000001&amp;quot; for Tricatel or &amp;quot;000000002&amp;quot; for Burger Queen).&lt;br /&gt;
&lt;br /&gt;
However the &#039;&#039;&#039;EInvoice address&#039;&#039;&#039; is NOT the same than the &#039;&#039;&#039;SIREN&#039;&#039;&#039; (it is the same in production mode only), so you must also force the Einvoice address of the company into the setup of the module Einvoice: To know your EInvoice address of your test company, go into the SuperPDP dashboard, in sandbox mode, and click on the label of the test company (for example Tricatel), you should see a list of the addresses of this test company in the annuary (the address to find you on the shared test Access Point network). The invoice address to use is the value after the &amp;quot;225:&amp;quot;, the one starting with 315143296_XXX with XXX that depends on your account.&lt;br /&gt;
Once both are saved, a warning may appear to say that SIREN and Einvoice address ID are not the same. You can ignore it in test environment.&lt;br /&gt;
&lt;br /&gt;
If your SIREN (menu Home - Setup - Company/Organisation) and your EInvoice address (menu Setup - Modules - Einvoice - Configuration) are correctly filled (Example: SIREN: 00000001 and EInvoice address 315143296_XXX), then you can send and retreive invoices from or to any other Access Points working on the Peppol Test network (The SuperPDP sandbox is automatically linked to the Peppol Test network when you use the sandbox credential).&lt;br /&gt;
&lt;br /&gt;
To send an invoice to a test customer available onto another Access Point, as the Peppol network are using addresses that are different from SIREN, you can force the customer EInvoice address from the thirdparty card by editing the field EInvoice address.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Example of the thirdparty card to send an einvoice from SuperPDP to the customer Test with SIREN 145678239 available at Esalink&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:Einvoice setup customer address.png|border]]&lt;br /&gt;
&lt;br /&gt;
=Options for integrators (mode proxy)=&lt;br /&gt;
If you are an integrator or web hosting provider (called P) and you want to provide a solution to allow your customers (Called C) to register and use the einvoicing system in one click, without having to pay (all payments will be done by yourself) the module provides a solution. This is possible with the mode &amp;quot;Proxy&amp;quot; of the einvoicing module and the platform SuperPDP:&lt;br /&gt;
&lt;br /&gt;
== On your own Dolibarr (the proxy) ==&lt;br /&gt;
*Install the module einvoicing on your own production Dolibarr of your company P.&lt;br /&gt;
*Go into Home - Setup - Other and add the constant EINVOICING_SUPERPDP_VIAPARTNER=&#039;proxy&#039;. So your Dolibarr will be able to act as a proxy between your customers C and SuperPDP. Only you need to setup the client_id and client_secret of your API account of SuperPDP (Your customer will register using a simple click, see later).&lt;br /&gt;
*Once you have set the option EINVOICING_SUPERPDP_VIAPARTNER to &#039;proxy&#039; on your own production Dolibarr, go into the setup of the module and choose &amp;quot;SuperPDP as proxy&amp;quot;.&lt;br /&gt;
*Switch to SuperPDP dashboard and create an application on your SuperPDP account. The URL to allow for OAuth is provied on the Dolibarr setup screen. You will get the client_id and client_secret. Goback  into the Dolibarr setup page of the module, and enter the keys. Remind the value of the EINVOICING_SUPERPDP_VIAPARTNER_OAUTH_URL shown, you will need it to the setup your customer instances.&lt;br /&gt;
*Once setup is done, you can switch back to the provider &amp;quot;SuperPDP direct access&amp;quot; for yourself (for your company P). The choice &amp;quot;SuperPDP Poxy&amp;quot; is here only to allow to enter some specific option. They are not lost if you go back to another Access Point provider and your Proxy is still active as long as its dedicated setup is ok.&lt;br /&gt;
&lt;br /&gt;
== On the Dolibarr of your customers ==&lt;br /&gt;
*Now you can deploy the module on all instances of your customers. You must also set the followign constant on the instance of your customer: &lt;br /&gt;
** EINVOICING_SUPERPDP_VIAPARTNER_OAUTH_URL = the value provided at previous step (so one fixed value for all your customers). &lt;br /&gt;
** You can also enter the constant EINVOICING_SUPERPDP_VIAPARTNER = &#039;YourCompanyName&#039;. &lt;br /&gt;
That&#039;s all. You customer will see, in the setup of the module a choice &amp;quot;Register to SuperPDP via YourCompanyName&amp;quot;. If they select this, they will see a link &amp;quot;Register to SuperPDP via YourCompanyName&amp;quot; and clicking on it will allow them to register without need to create account, no need to create an application, no need to generate and enter API key for each of your customer. The user has just to confirm the creation of its account, and a token to use its account will be recorded into its instance.&lt;br /&gt;
Also, you will see all your customer use of the API into the section &amp;quot;Sessions&amp;quot; of your SuperPDP dashboard.&lt;br /&gt;
&lt;br /&gt;
=External Tools=&lt;br /&gt;
==E-Invoicing directory==&lt;br /&gt;
&lt;br /&gt;
===Test directory===&lt;br /&gt;
To check or see companies/Einvoice ID in a directory, you can use one of these tools&lt;br /&gt;
&lt;br /&gt;
*[https://test-directory.peppol.eu/public/locale-en_US/ Test Peppol directory]&lt;br /&gt;
*[https://www.superpdp.tech/outils/info-annuaire/?query=493861496&amp;amp;mode=fr&amp;amp;env=sandbox SuperPDP tool]&lt;br /&gt;
&lt;br /&gt;
===Production directory===&lt;br /&gt;
You can use one of these tools to check if a company is in the production directory.&lt;br /&gt;
&lt;br /&gt;
*[https://directory.peppol.eu/public/locale-en_US/ Peppol directory]&lt;br /&gt;
*[https://facturation.chorus-pro.gouv.fr/annuaire/#/ French governement directory]&lt;br /&gt;
*[https://www.superpdp.tech/outils/info-annuaire/?query=493861496&amp;amp;mode=fr&amp;amp;env=production SuperPDP directory]&lt;br /&gt;
&lt;br /&gt;
==Validation of an EInvoice==&lt;br /&gt;
To validate an existing einvoice, you can use one of these tools:&lt;br /&gt;
&lt;br /&gt;
*[https://www.superpdp.tech/outils/validateur-facture-electronique From SuperPDP (CII or Factur-X einvoices)]&lt;br /&gt;
*[https://services.fnfe-mpe.org/account/home From FNFE (Factur-X only, need an account)]&lt;br /&gt;
*[https://www.itb.ec.europa.eu/invoice/upload From Europa.eu (CII or UBL)]&lt;br /&gt;
*[https://ecosio.com/en/peppol-e-invoice-xml-document-validator/ From Ecosi (CII choose CrossIndustryInvoice D16B)]&lt;br /&gt;
&lt;br /&gt;
=Troubleshooting=&lt;br /&gt;
&lt;br /&gt;
==Life cycle and error codes for French EInvoicing==&lt;br /&gt;
[[File:Le cycle de vie d’une facture électronique.png|border|1200x1200px|Lifecycle of an electronic invoice]]&lt;br /&gt;
&lt;br /&gt;
==Current error cases==&lt;br /&gt;
&lt;br /&gt;
[[File:Warning.png]] Error &amp;quot;The company fr_siren:123456789 is not subject to the e-invoicing reform&amp;quot;&lt;br /&gt;
&lt;br /&gt;
For France:&lt;br /&gt;
&lt;br /&gt;
*Check that your company can be found from this annuary: https://annuaire-entreprises.data.gouv.fr/&lt;br /&gt;
*Then check inside this one:  https://facturation.chorus-pro.gouv.fr/annuaire/#/&lt;br /&gt;
&lt;br /&gt;
If you have this error, it probably means you CAN be found in the first one but NOT in the second one. This is a problem known by the DGFIP. What to do? You can&#039;t do nothing on your own. You must wait that the french governement add your SIREN record in the second annuary too. You can try to contact import.gouv.fr asking them to &amp;quot;appear in the second annuary to activate the einvoicing&amp;quot; to make things faster, but this works only in few cases only. For all others cases you must wait you appear in the second annuary before retrying to register.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Warning.png]] Error: HTTP 400 - CREATE_ERROR - pre-check: receiver address does not accept this document.&lt;br /&gt;
&lt;br /&gt;
Check the SIREN and the Einvoice address of the customer. If you set only a SIREN with no specific Einvoice addess (the most common case), check that this SIREN exists that an Einvoice address in the network annuary exists with for this SIREN value. If you used a specific Einvoice address in addition to the SIREN, check that the couple SIREN/Einvoice address is a valid existing couple in the annuary.&lt;br /&gt;
&lt;br /&gt;
=Development=&lt;br /&gt;
&lt;br /&gt;
==Still to do==&lt;br /&gt;
&lt;br /&gt;
*The E-reporting (mandatory in France the 1st september 2027), to report sales done by the Point of Sale module for example. Planned for begin of 2027.&lt;br /&gt;
&lt;br /&gt;
==Sources==&lt;br /&gt;
{{TemplateModCommunityEn}}&lt;br /&gt;
&lt;br /&gt;
==Einvoice Specifications==&lt;br /&gt;
&lt;br /&gt;
Specification for France are available on https://www.boutique.afnor.org/en-gb/ and search on &amp;quot;XP Z12-012&amp;quot;, &amp;quot;XP Z12-013&amp;quot;, &amp;quot;XP Z12-014&amp;quot;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Field code (Business Term)&lt;br /&gt;
!Desc&lt;br /&gt;
!Field in Dolibarr&lt;br /&gt;
|-&lt;br /&gt;
|BT-1&lt;br /&gt;
|Numéro de facture&lt;br /&gt;
|ref&lt;br /&gt;
|-&lt;br /&gt;
|BT-2&lt;br /&gt;
|Date de facture&lt;br /&gt;
|date&lt;br /&gt;
|-&lt;br /&gt;
|BT-3&lt;br /&gt;
|Type de document&lt;br /&gt;
|type (380 facture, 381 avoir, 384 rectificative, 386 acompte)&lt;br /&gt;
|-&lt;br /&gt;
|BT-8&lt;br /&gt;
|Exigibilité de la TVA&lt;br /&gt;
|TAX_MODE (5 débits / 72 encaissements)&lt;br /&gt;
|-&lt;br /&gt;
|BT-9&lt;br /&gt;
|Date d&#039;échéance&lt;br /&gt;
|date_lim_reglement&lt;br /&gt;
|-&lt;br /&gt;
|BT-10&lt;br /&gt;
|Référence acheteur (code service)&lt;br /&gt;
|onglet Chorus Pro, sinon ref_client — Chorus Pro uniquement&lt;br /&gt;
|-&lt;br /&gt;
|BT-13&lt;br /&gt;
|Bon de commande du client&lt;br /&gt;
|ref_client de la facture, sinon ref_client de la commande liée&lt;br /&gt;
|-&lt;br /&gt;
|BT-14&lt;br /&gt;
|Notre numéro de commande&lt;br /&gt;
|ref de la commande liée&lt;br /&gt;
|-&lt;br /&gt;
|BT-23&lt;br /&gt;
|Cadre de facturation&lt;br /&gt;
|onglet Chorus Pro (facture ou fiche client)&lt;br /&gt;
|-&lt;br /&gt;
|BT-25&lt;br /&gt;
|Facture d&#039;origine (avoir, acompte)&lt;br /&gt;
|fk_facture_source&lt;br /&gt;
|-&lt;br /&gt;
|BT-29&lt;br /&gt;
|SIRET vendeur / acheteur&lt;br /&gt;
|Id. prof. 2 (societe / tiers)&lt;br /&gt;
|-&lt;br /&gt;
|BT-30&lt;br /&gt;
|SIREN vendeur&lt;br /&gt;
|Id. prof. 1 de votre société&lt;br /&gt;
|-&lt;br /&gt;
|BT-31&lt;br /&gt;
|N° TVA vendeur&lt;br /&gt;
|TVA intracom. de votre société&lt;br /&gt;
|-&lt;br /&gt;
|BT-34&lt;br /&gt;
|Adresse électronique vendeur&lt;br /&gt;
|SIREN de votre société, schéma 0225&lt;br /&gt;
|-&lt;br /&gt;
|BT-46&lt;br /&gt;
|SIRET acheteur&lt;br /&gt;
|Id. prof. 2 du tiers&lt;br /&gt;
|-&lt;br /&gt;
|BT-47&lt;br /&gt;
|SIREN acheteur&lt;br /&gt;
|Id. prof. 1 du tiers&lt;br /&gt;
|-&lt;br /&gt;
|BT-48&lt;br /&gt;
|N° TVA acheteur&lt;br /&gt;
|TVA intracom. du tiers&lt;br /&gt;
|-&lt;br /&gt;
|BT-49&lt;br /&gt;
|Adresse électronique acheteur&lt;br /&gt;
|Id. prof. 5 du tiers, sinon son SIREN&lt;br /&gt;
|-&lt;br /&gt;
|BT-72&lt;br /&gt;
|Date de livraison&lt;br /&gt;
|delivery_date&lt;br /&gt;
|-&lt;br /&gt;
|BT-73/74&lt;br /&gt;
|Période de service&lt;br /&gt;
|dates de service des lignes&lt;br /&gt;
|-&lt;br /&gt;
|BT-89/90/91&lt;br /&gt;
|Prélèvement SEPA (RUM, ICS)&lt;br /&gt;
|RIB par défaut du tiers, PRELEVEMENT_ICS&lt;br /&gt;
|-&lt;br /&gt;
|BT-113&lt;br /&gt;
|Acomptes déjà réglés&lt;br /&gt;
|acomptes imputés sur la facture&lt;br /&gt;
|-&lt;br /&gt;
|BT-121&lt;br /&gt;
|Motif d&#039;exonération de TVA&lt;br /&gt;
|calculé (franchise 293 B, intracom., autoliquidation, export)&lt;br /&gt;
|-&lt;br /&gt;
|BT-128&lt;br /&gt;
|Référence to other doc or object&lt;br /&gt;
|May be a reference to another invoice REF or a reference to something else (phone, ...)&lt;br /&gt;
|-&lt;br /&gt;
|BT-129&lt;br /&gt;
|Unité de la ligne&lt;br /&gt;
|unité du produit (fk_unit)&lt;br /&gt;
|-&lt;br /&gt;
|BT-146&lt;br /&gt;
|Prix unitaire&lt;br /&gt;
|total HT / quantité de la ligne&lt;br /&gt;
|-&lt;br /&gt;
|BT-151&lt;br /&gt;
|Catégorie de TVA&lt;br /&gt;
|calculée d&#039;après le taux et le contexte&lt;br /&gt;
|-&lt;br /&gt;
|BT-84&lt;br /&gt;
|IBAN / BIC&lt;br /&gt;
|compte bancaire choisi dans la configuration&amp;lt;br /&amp;gt;&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Eldy</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=FAQ_J%27ai_perdu_mon_mot_de_passe&amp;diff=67451</id>
		<title>FAQ J&#039;ai perdu mon mot de passe</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=FAQ_J%27ai_perdu_mon_mot_de_passe&amp;diff=67451"/>
		<updated>2026-09-25T13:34:13Z</updated>

		<summary type="html">&lt;p&gt;Eldy: /* Si le mot de passe perdu est celui du compte admin 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 : FAQ_I_Lost_my_password --&amp;gt;&lt;br /&gt;
[[en:FAQ_I_Lost_my_password]]&lt;br /&gt;
[[es:FAQ Tengo un problema en la contraseña]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ FR]]&lt;br /&gt;
Il peut arriver que vous oubliez votre mot de passe ou que pour une raison inconnue il ne fonctionne plus, voici la solution pour reprendre la main en fonction des 3 types de mots de passes concernés.&lt;br /&gt;
&lt;br /&gt;
= Reset du mot de passe root de la base de donnée MariaDB/MySQL =&lt;br /&gt;
Cette section traite d&#039;un problème du mot de passe d&#039;administration root de la base de donnée MariaDB/MySQL et non du mot de passe utilisé par Dolibarr pour accéder à la base de donnée, ni de compte utilisateur d&#039;accès à Dolibarr (voir chapitres suivant pour cela).&lt;br /&gt;
&lt;br /&gt;
== Pour Mariadb installé par DoliWamp (Microsoft Windows) ==&lt;br /&gt;
* Connectez vous avec un compte administrateur Windows sur votre machine,&amp;lt;br /&amp;gt;&lt;br /&gt;
* Allez dans le menu Windows:&lt;br /&gt;
     Démarrer -&amp;gt; paramétres -&amp;gt; Panneau de configuration -&amp;gt; Outils d&#039;administration -&amp;gt; Services.&lt;br /&gt;
* Trouvez le service MySQL &#039;&#039;&#039;doliwampmysql&#039;&#039;&#039; dans la liste, et arrêtez le.&lt;br /&gt;
* Lancer une console de ligne de commande en allant dans le menu &lt;br /&gt;
     Démarrer -&amp;gt; Executer CMD&lt;br /&gt;
* Tapez les lignes suivantes pour relancer MySQL dans un mode particulier.&lt;br /&gt;
    CD C:\dolibarr\bin\mysql\mysql5.0.45\bin &lt;br /&gt;
    C:\dolibarr\bin\mysql\mysql5.0.45\bin\mysqld-nt --skip-grant-tables&lt;br /&gt;
* Lancer à nouveau une console de ligne de commande en allant dans le menu &lt;br /&gt;
    Menu Demarrer -&amp;gt; Executer CMD (une deuxieme fois)&lt;br /&gt;
* Tapez &lt;br /&gt;
    CD C:\dolibarr\bin\mysql\mysql5.0.45\bin &lt;br /&gt;
    C:\dolibarr\bin\mysql\mysql5.0.45\bin\mysql -u root&lt;br /&gt;
* A l&#039;invite, tapez&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
mysql&amp;gt; UPDATE mysql.user SET Password = PASSWORD(&#039;anewpassword&#039;) WHERE User = &#039;root&#039;;&lt;br /&gt;
or on a more recent version&lt;br /&gt;
mysql&amp;gt; SET PASSWORD FOR &#039;root@localhost&#039; = PASSWORD(&#039;anewpassword&#039;);&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
Pour prendre en compte le changement&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
mysql&amp;gt; FLUSH PRIVILEGES;&lt;br /&gt;
mysql&amp;gt; QUIT;&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
* Tapez &lt;br /&gt;
    C:\dolibarr\bin\mysql\mysql5.0.45\bin\mysqladmin -u root -pmotdepasseroot shutdown&lt;br /&gt;
* Redémarrez Windows.&lt;br /&gt;
&lt;br /&gt;
Vous devez pouvoir accéder à votre Base Mysql ce qui vous permet de réaliser l&#039;étape d&#039;après pour modifier le mot de passe utilisé par Dolibarr pour accéder à sa base de donnée.&lt;br /&gt;
&lt;br /&gt;
== Pour Mysql ou Mariadb sous Linux ==&lt;br /&gt;
* Ouvrez une fenêtre terminal ligne de commande avec l&#039;utilisateur système root.&lt;br /&gt;
* Arrêtez Mysql:&lt;br /&gt;
    /usr/sbin/mysql stop&lt;br /&gt;
* Tapez la ligne suivante afin de relancer MySQL dans un mode particulier (sans utilisateurs).&lt;br /&gt;
    /usr/sbin --skip-grant-tables&lt;br /&gt;
* Ouvrez une autre fenêtre terminal ligne de commande.&lt;br /&gt;
* Lancez le client mysql&lt;br /&gt;
    /usr/bin/mysql -u root&lt;br /&gt;
* Au prompt de MySQL, tapez&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
mysql&amp;gt; UPDATE mysql.user SET Password = PASSWORD(&#039;anewpassword&#039;) WHERE User = &#039;root&#039;;&lt;br /&gt;
or on a more recent version&lt;br /&gt;
mysql&amp;gt; SET PASSWORD FOR &#039;root@localhost&#039; = PASSWORD(&#039;anewpassword&#039;);&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
Et pour prendre en compte&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
mysql&amp;gt; FLUSH PRIVILEGES;&lt;br /&gt;
mysql&amp;gt; QUIT;&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
* Arrêtez MySql par&lt;br /&gt;
    /usr/bin/mysqladmin -u root -panewpassword shutdown&lt;br /&gt;
* Relancer le serveur physique ou juste le serveur MySql.&lt;br /&gt;
&lt;br /&gt;
Vous devriez être capable de vous connecter à la base de donnée MySQL avec le user root et le mot de passe défini, vous pouvez maintenant dire à Dolibarr d&#039;utiliser le nouveau mot de passe.&lt;br /&gt;
&lt;br /&gt;
= Reset du mot de passe utilisé par Dolibarr pour accéder à la base =&lt;br /&gt;
* Allez dans&lt;br /&gt;
    htdocs\conf &lt;br /&gt;
* Editez le fichier conf.php pour changer la variable&lt;br /&gt;
    $dolibarr_main_db_pass&lt;br /&gt;
&lt;br /&gt;
et modifiez sa valeur avec un nouveau mot de passe. &lt;br /&gt;
&lt;br /&gt;
Le nom de l&#039;utilisateur pour accéder à la base de donnée est dans $dolibarr_main_db_user. Retenez le.&lt;br /&gt;
&lt;br /&gt;
* Sauvez le fichier et quittez.&lt;br /&gt;
&lt;br /&gt;
* Lancer le client mariadb/mysql avec l&#039;utilisateur root&lt;br /&gt;
     Sous Linux, depuis un terminal: /usr/bin/mysql -u root -ppassword&lt;br /&gt;
     Sous Windows: Lancer à une console de ligne de commande en allant dans le menu Menu Demarrer -&amp;gt; Executer CMD et Tapez &lt;br /&gt;
       CD C:\dolibarr\bin\mysql\mysqlx.y.z\bin &lt;br /&gt;
       C:\dolibarr\bin\mysql\mysqlx.y.z\bin\mysql -u root&lt;br /&gt;
* Au prompt de MariaDB/MySQL prompt, tapez&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
mysql&amp;gt; UPDATE mysql.user SET Password = PASSWORD(&#039;anothernewpassword&#039;) WHERE User = &#039;userusedbydolibarr&#039;;&lt;br /&gt;
ou avec une version plus récente&lt;br /&gt;
mysql&amp;gt; SET PASSWORD FOR &#039;userusedbydolibarr@localhost&#039; = PASSWORD(&#039;anothernewpassword&#039;);&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
Et pour prendre en compte&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
mysql&amp;gt; FLUSH PRIVILEGES;&lt;br /&gt;
mysql&amp;gt; QUIT;&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Reset du mot de passe d&#039;un compte utilisateur de l&#039;application Dolibarr =&lt;br /&gt;
== Si vous posséder un autre compte d&#039;accès à l&#039;application et que celui ci est admin ==&lt;br /&gt;
Connectez vous avec celui ci. Puis aller sur la fiche de l&#039;utilisateur dont il faut modifier le mot de passe. Modifier la fiche pour forcer un nouveau mot de passe.&lt;br /&gt;
&lt;br /&gt;
== Si le mot de passe perdu est celui du compte &amp;quot;admin&amp;quot; Dolibarr ==&lt;br /&gt;
Connectez-vous à la base de donnée Dolibarr mysql et modifier le champ &amp;quot;pass&amp;quot; du login avec lequel vous voulez vous connecter.&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
mysql&amp;gt; USE nomdelabasedolibarr;&lt;br /&gt;
mysql&amp;gt; UPDATE llx_user SET pass = &#039;atemporarypasswod&#039; WHERE login =&#039;loginuserbloque&#039;;&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Essayez de vous connecter puis modifiez votre mot de passe depuis votre fiche utilisateur. Cela effacera le mot de passe temporaire non crypté afin de stocker votre nouveau mot de passe crypté dans cette table.&lt;/div&gt;</summary>
		<author><name>Eldy</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=FAQ_J%27ai_perdu_mon_mot_de_passe&amp;diff=67450</id>
		<title>FAQ J&#039;ai perdu mon mot de passe</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=FAQ_J%27ai_perdu_mon_mot_de_passe&amp;diff=67450"/>
		<updated>2026-09-25T13:33:57Z</updated>

		<summary type="html">&lt;p&gt;Eldy: /* Pour mysql ou mariadb sous Linux */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Do NOT edit this section&lt;br /&gt;
     Links below are automatically managed by PolyglotBot&lt;br /&gt;
     You can edit links on the English source page : FAQ_I_Lost_my_password --&amp;gt;&lt;br /&gt;
[[en:FAQ_I_Lost_my_password]]&lt;br /&gt;
[[es:FAQ Tengo un problema en la contraseña]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ FR]]&lt;br /&gt;
Il peut arriver que vous oubliez votre mot de passe ou que pour une raison inconnue il ne fonctionne plus, voici la solution pour reprendre la main en fonction des 3 types de mots de passes concernés.&lt;br /&gt;
&lt;br /&gt;
= Reset du mot de passe root de la base de donnée MariaDB/MySQL =&lt;br /&gt;
Cette section traite d&#039;un problème du mot de passe d&#039;administration root de la base de donnée MariaDB/MySQL et non du mot de passe utilisé par Dolibarr pour accéder à la base de donnée, ni de compte utilisateur d&#039;accès à Dolibarr (voir chapitres suivant pour cela).&lt;br /&gt;
&lt;br /&gt;
== Pour Mariadb installé par DoliWamp (Microsoft Windows) ==&lt;br /&gt;
* Connectez vous avec un compte administrateur Windows sur votre machine,&amp;lt;br /&amp;gt;&lt;br /&gt;
* Allez dans le menu Windows:&lt;br /&gt;
     Démarrer -&amp;gt; paramétres -&amp;gt; Panneau de configuration -&amp;gt; Outils d&#039;administration -&amp;gt; Services.&lt;br /&gt;
* Trouvez le service MySQL &#039;&#039;&#039;doliwampmysql&#039;&#039;&#039; dans la liste, et arrêtez le.&lt;br /&gt;
* Lancer une console de ligne de commande en allant dans le menu &lt;br /&gt;
     Démarrer -&amp;gt; Executer CMD&lt;br /&gt;
* Tapez les lignes suivantes pour relancer MySQL dans un mode particulier.&lt;br /&gt;
    CD C:\dolibarr\bin\mysql\mysql5.0.45\bin &lt;br /&gt;
    C:\dolibarr\bin\mysql\mysql5.0.45\bin\mysqld-nt --skip-grant-tables&lt;br /&gt;
* Lancer à nouveau une console de ligne de commande en allant dans le menu &lt;br /&gt;
    Menu Demarrer -&amp;gt; Executer CMD (une deuxieme fois)&lt;br /&gt;
* Tapez &lt;br /&gt;
    CD C:\dolibarr\bin\mysql\mysql5.0.45\bin &lt;br /&gt;
    C:\dolibarr\bin\mysql\mysql5.0.45\bin\mysql -u root&lt;br /&gt;
* A l&#039;invite, tapez&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
mysql&amp;gt; UPDATE mysql.user SET Password = PASSWORD(&#039;anewpassword&#039;) WHERE User = &#039;root&#039;;&lt;br /&gt;
or on a more recent version&lt;br /&gt;
mysql&amp;gt; SET PASSWORD FOR &#039;root@localhost&#039; = PASSWORD(&#039;anewpassword&#039;);&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
Pour prendre en compte le changement&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
mysql&amp;gt; FLUSH PRIVILEGES;&lt;br /&gt;
mysql&amp;gt; QUIT;&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
* Tapez &lt;br /&gt;
    C:\dolibarr\bin\mysql\mysql5.0.45\bin\mysqladmin -u root -pmotdepasseroot shutdown&lt;br /&gt;
* Redémarrez Windows.&lt;br /&gt;
&lt;br /&gt;
Vous devez pouvoir accéder à votre Base Mysql ce qui vous permet de réaliser l&#039;étape d&#039;après pour modifier le mot de passe utilisé par Dolibarr pour accéder à sa base de donnée.&lt;br /&gt;
&lt;br /&gt;
== Pour Mysql ou Mariadb sous Linux ==&lt;br /&gt;
* Ouvrez une fenêtre terminal ligne de commande avec l&#039;utilisateur système root.&lt;br /&gt;
* Arrêtez Mysql:&lt;br /&gt;
    /usr/sbin/mysql stop&lt;br /&gt;
* Tapez la ligne suivante afin de relancer MySQL dans un mode particulier (sans utilisateurs).&lt;br /&gt;
    /usr/sbin --skip-grant-tables&lt;br /&gt;
* Ouvrez une autre fenêtre terminal ligne de commande.&lt;br /&gt;
* Lancez le client mysql&lt;br /&gt;
    /usr/bin/mysql -u root&lt;br /&gt;
* Au prompt de MySQL, tapez&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
mysql&amp;gt; UPDATE mysql.user SET Password = PASSWORD(&#039;anewpassword&#039;) WHERE User = &#039;root&#039;;&lt;br /&gt;
or on a more recent version&lt;br /&gt;
mysql&amp;gt; SET PASSWORD FOR &#039;root@localhost&#039; = PASSWORD(&#039;anewpassword&#039;);&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
Et pour prendre en compte&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
mysql&amp;gt; FLUSH PRIVILEGES;&lt;br /&gt;
mysql&amp;gt; QUIT;&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
* Arrêtez MySql par&lt;br /&gt;
    /usr/bin/mysqladmin -u root -panewpassword shutdown&lt;br /&gt;
* Relancer le serveur physique ou juste le serveur MySql.&lt;br /&gt;
&lt;br /&gt;
Vous devriez être capable de vous connecter à la base de donnée MySQL avec le user root et le mot de passe défini, vous pouvez maintenant dire à Dolibarr d&#039;utiliser le nouveau mot de passe.&lt;br /&gt;
&lt;br /&gt;
= Reset du mot de passe utilisé par Dolibarr pour accéder à la base =&lt;br /&gt;
* Allez dans&lt;br /&gt;
    htdocs\conf &lt;br /&gt;
* Editez le fichier conf.php pour changer la variable&lt;br /&gt;
    $dolibarr_main_db_pass&lt;br /&gt;
&lt;br /&gt;
et modifiez sa valeur avec un nouveau mot de passe. &lt;br /&gt;
&lt;br /&gt;
Le nom de l&#039;utilisateur pour accéder à la base de donnée est dans $dolibarr_main_db_user. Retenez le.&lt;br /&gt;
&lt;br /&gt;
* Sauvez le fichier et quittez.&lt;br /&gt;
&lt;br /&gt;
* Lancer le client mariadb/mysql avec l&#039;utilisateur root&lt;br /&gt;
     Sous Linux, depuis un terminal: /usr/bin/mysql -u root -ppassword&lt;br /&gt;
     Sous Windows: Lancer à une console de ligne de commande en allant dans le menu Menu Demarrer -&amp;gt; Executer CMD et Tapez &lt;br /&gt;
       CD C:\dolibarr\bin\mysql\mysqlx.y.z\bin &lt;br /&gt;
       C:\dolibarr\bin\mysql\mysqlx.y.z\bin\mysql -u root&lt;br /&gt;
* Au prompt de MariaDB/MySQL prompt, tapez&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
mysql&amp;gt; UPDATE mysql.user SET Password = PASSWORD(&#039;anothernewpassword&#039;) WHERE User = &#039;userusedbydolibarr&#039;;&lt;br /&gt;
ou avec une version plus récente&lt;br /&gt;
mysql&amp;gt; SET PASSWORD FOR &#039;userusedbydolibarr@localhost&#039; = PASSWORD(&#039;anothernewpassword&#039;);&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
Et pour prendre en compte&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
mysql&amp;gt; FLUSH PRIVILEGES;&lt;br /&gt;
mysql&amp;gt; QUIT;&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Reset du mot de passe d&#039;un compte utilisateur de l&#039;application Dolibarr =&lt;br /&gt;
== Si vous posséder un autre compte d&#039;accès à l&#039;application et que celui ci est admin ==&lt;br /&gt;
Connectez vous avec celui ci. Puis aller sur la fiche de l&#039;utilisateur dont il faut modifier le mot de passe. Modifier la fiche pour forcer un nouveau mot de passe.&lt;br /&gt;
&lt;br /&gt;
== Si le mot de passe perdu est celui du compte admin Dolibarr ==&lt;br /&gt;
Connectez-vous à la base de donnée Dolibarr mysql et modifier le champ &amp;quot;pass&amp;quot; du login avec lequel vous voulez vous connecter.&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
mysql&amp;gt; USE nomdelabasedolibarr;&lt;br /&gt;
mysql&amp;gt; UPDATE llx_user SET pass = &#039;atemporarypasswod&#039; WHERE login =&#039;loginuserbloque&#039;;&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Essayez de vous connecter puis modifiez votre mot de passe depuis votre fiche utilisateur. Cela effacera le mot de passe temporaire non crypté afin de stocker votre nouveau mot de passe crypté dans cette table.&lt;/div&gt;</summary>
		<author><name>Eldy</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=FAQ_J%27ai_perdu_mon_mot_de_passe&amp;diff=67449</id>
		<title>FAQ J&#039;ai perdu mon mot de passe</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=FAQ_J%27ai_perdu_mon_mot_de_passe&amp;diff=67449"/>
		<updated>2026-09-25T13:33:46Z</updated>

		<summary type="html">&lt;p&gt;Eldy: /* Sous Linux */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Do NOT edit this section&lt;br /&gt;
     Links below are automatically managed by PolyglotBot&lt;br /&gt;
     You can edit links on the English source page : FAQ_I_Lost_my_password --&amp;gt;&lt;br /&gt;
[[en:FAQ_I_Lost_my_password]]&lt;br /&gt;
[[es:FAQ Tengo un problema en la contraseña]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ FR]]&lt;br /&gt;
Il peut arriver que vous oubliez votre mot de passe ou que pour une raison inconnue il ne fonctionne plus, voici la solution pour reprendre la main en fonction des 3 types de mots de passes concernés.&lt;br /&gt;
&lt;br /&gt;
= Reset du mot de passe root de la base de donnée MariaDB/MySQL =&lt;br /&gt;
Cette section traite d&#039;un problème du mot de passe d&#039;administration root de la base de donnée MariaDB/MySQL et non du mot de passe utilisé par Dolibarr pour accéder à la base de donnée, ni de compte utilisateur d&#039;accès à Dolibarr (voir chapitres suivant pour cela).&lt;br /&gt;
&lt;br /&gt;
== Pour Mariadb installé par DoliWamp (Microsoft Windows) ==&lt;br /&gt;
* Connectez vous avec un compte administrateur Windows sur votre machine,&amp;lt;br /&amp;gt;&lt;br /&gt;
* Allez dans le menu Windows:&lt;br /&gt;
     Démarrer -&amp;gt; paramétres -&amp;gt; Panneau de configuration -&amp;gt; Outils d&#039;administration -&amp;gt; Services.&lt;br /&gt;
* Trouvez le service MySQL &#039;&#039;&#039;doliwampmysql&#039;&#039;&#039; dans la liste, et arrêtez le.&lt;br /&gt;
* Lancer une console de ligne de commande en allant dans le menu &lt;br /&gt;
     Démarrer -&amp;gt; Executer CMD&lt;br /&gt;
* Tapez les lignes suivantes pour relancer MySQL dans un mode particulier.&lt;br /&gt;
    CD C:\dolibarr\bin\mysql\mysql5.0.45\bin &lt;br /&gt;
    C:\dolibarr\bin\mysql\mysql5.0.45\bin\mysqld-nt --skip-grant-tables&lt;br /&gt;
* Lancer à nouveau une console de ligne de commande en allant dans le menu &lt;br /&gt;
    Menu Demarrer -&amp;gt; Executer CMD (une deuxieme fois)&lt;br /&gt;
* Tapez &lt;br /&gt;
    CD C:\dolibarr\bin\mysql\mysql5.0.45\bin &lt;br /&gt;
    C:\dolibarr\bin\mysql\mysql5.0.45\bin\mysql -u root&lt;br /&gt;
* A l&#039;invite, tapez&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
mysql&amp;gt; UPDATE mysql.user SET Password = PASSWORD(&#039;anewpassword&#039;) WHERE User = &#039;root&#039;;&lt;br /&gt;
or on a more recent version&lt;br /&gt;
mysql&amp;gt; SET PASSWORD FOR &#039;root@localhost&#039; = PASSWORD(&#039;anewpassword&#039;);&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
Pour prendre en compte le changement&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
mysql&amp;gt; FLUSH PRIVILEGES;&lt;br /&gt;
mysql&amp;gt; QUIT;&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
* Tapez &lt;br /&gt;
    C:\dolibarr\bin\mysql\mysql5.0.45\bin\mysqladmin -u root -pmotdepasseroot shutdown&lt;br /&gt;
* Redémarrez Windows.&lt;br /&gt;
&lt;br /&gt;
Vous devez pouvoir accéder à votre Base Mysql ce qui vous permet de réaliser l&#039;étape d&#039;après pour modifier le mot de passe utilisé par Dolibarr pour accéder à sa base de donnée.&lt;br /&gt;
&lt;br /&gt;
== Pour mysql ou mariadb sous Linux ==&lt;br /&gt;
* Ouvrez une fenêtre terminal ligne de commande avec l&#039;utilisateur système root.&lt;br /&gt;
* Arrêtez Mysql:&lt;br /&gt;
    /usr/sbin/mysql stop&lt;br /&gt;
* Tapez la ligne suivante afin de relancer MySQL dans un mode particulier (sans utilisateurs).&lt;br /&gt;
    /usr/sbin --skip-grant-tables&lt;br /&gt;
* Ouvrez une autre fenêtre terminal ligne de commande.&lt;br /&gt;
* Lancez le client mysql&lt;br /&gt;
    /usr/bin/mysql -u root&lt;br /&gt;
* Au prompt de MySQL, tapez&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
mysql&amp;gt; UPDATE mysql.user SET Password = PASSWORD(&#039;anewpassword&#039;) WHERE User = &#039;root&#039;;&lt;br /&gt;
or on a more recent version&lt;br /&gt;
mysql&amp;gt; SET PASSWORD FOR &#039;root@localhost&#039; = PASSWORD(&#039;anewpassword&#039;);&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
Et pour prendre en compte&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
mysql&amp;gt; FLUSH PRIVILEGES;&lt;br /&gt;
mysql&amp;gt; QUIT;&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
* Arrêtez MySql par&lt;br /&gt;
    /usr/bin/mysqladmin -u root -panewpassword shutdown&lt;br /&gt;
* Relancer le serveur physique ou juste le serveur MySql.&lt;br /&gt;
&lt;br /&gt;
Vous devriez être capable de vous connecter à la base de donnée MySQL avec le user root et le mot de passe défini, vous pouvez maintenant dire à Dolibarr d&#039;utiliser le nouveau mot de passe.&lt;br /&gt;
&lt;br /&gt;
= Reset du mot de passe utilisé par Dolibarr pour accéder à la base =&lt;br /&gt;
* Allez dans&lt;br /&gt;
    htdocs\conf &lt;br /&gt;
* Editez le fichier conf.php pour changer la variable&lt;br /&gt;
    $dolibarr_main_db_pass&lt;br /&gt;
&lt;br /&gt;
et modifiez sa valeur avec un nouveau mot de passe. &lt;br /&gt;
&lt;br /&gt;
Le nom de l&#039;utilisateur pour accéder à la base de donnée est dans $dolibarr_main_db_user. Retenez le.&lt;br /&gt;
&lt;br /&gt;
* Sauvez le fichier et quittez.&lt;br /&gt;
&lt;br /&gt;
* Lancer le client mariadb/mysql avec l&#039;utilisateur root&lt;br /&gt;
     Sous Linux, depuis un terminal: /usr/bin/mysql -u root -ppassword&lt;br /&gt;
     Sous Windows: Lancer à une console de ligne de commande en allant dans le menu Menu Demarrer -&amp;gt; Executer CMD et Tapez &lt;br /&gt;
       CD C:\dolibarr\bin\mysql\mysqlx.y.z\bin &lt;br /&gt;
       C:\dolibarr\bin\mysql\mysqlx.y.z\bin\mysql -u root&lt;br /&gt;
* Au prompt de MariaDB/MySQL prompt, tapez&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
mysql&amp;gt; UPDATE mysql.user SET Password = PASSWORD(&#039;anothernewpassword&#039;) WHERE User = &#039;userusedbydolibarr&#039;;&lt;br /&gt;
ou avec une version plus récente&lt;br /&gt;
mysql&amp;gt; SET PASSWORD FOR &#039;userusedbydolibarr@localhost&#039; = PASSWORD(&#039;anothernewpassword&#039;);&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
Et pour prendre en compte&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
mysql&amp;gt; FLUSH PRIVILEGES;&lt;br /&gt;
mysql&amp;gt; QUIT;&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Reset du mot de passe d&#039;un compte utilisateur de l&#039;application Dolibarr =&lt;br /&gt;
== Si vous posséder un autre compte d&#039;accès à l&#039;application et que celui ci est admin ==&lt;br /&gt;
Connectez vous avec celui ci. Puis aller sur la fiche de l&#039;utilisateur dont il faut modifier le mot de passe. Modifier la fiche pour forcer un nouveau mot de passe.&lt;br /&gt;
&lt;br /&gt;
== Si le mot de passe perdu est celui du compte admin Dolibarr ==&lt;br /&gt;
Connectez-vous à la base de donnée Dolibarr mysql et modifier le champ &amp;quot;pass&amp;quot; du login avec lequel vous voulez vous connecter.&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
mysql&amp;gt; USE nomdelabasedolibarr;&lt;br /&gt;
mysql&amp;gt; UPDATE llx_user SET pass = &#039;atemporarypasswod&#039; WHERE login =&#039;loginuserbloque&#039;;&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Essayez de vous connecter puis modifiez votre mot de passe depuis votre fiche utilisateur. Cela effacera le mot de passe temporaire non crypté afin de stocker votre nouveau mot de passe crypté dans cette table.&lt;/div&gt;</summary>
		<author><name>Eldy</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=FAQ_J%27ai_perdu_mon_mot_de_passe&amp;diff=67448</id>
		<title>FAQ J&#039;ai perdu mon mot de passe</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=FAQ_J%27ai_perdu_mon_mot_de_passe&amp;diff=67448"/>
		<updated>2026-09-25T13:33:22Z</updated>

		<summary type="html">&lt;p&gt;Eldy: /* Sous Microsoft Windows installé par DoliWamp */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Do NOT edit this section&lt;br /&gt;
     Links below are automatically managed by PolyglotBot&lt;br /&gt;
     You can edit links on the English source page : FAQ_I_Lost_my_password --&amp;gt;&lt;br /&gt;
[[en:FAQ_I_Lost_my_password]]&lt;br /&gt;
[[es:FAQ Tengo un problema en la contraseña]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ FR]]&lt;br /&gt;
Il peut arriver que vous oubliez votre mot de passe ou que pour une raison inconnue il ne fonctionne plus, voici la solution pour reprendre la main en fonction des 3 types de mots de passes concernés.&lt;br /&gt;
&lt;br /&gt;
= Reset du mot de passe root de la base de donnée MariaDB/MySQL =&lt;br /&gt;
Cette section traite d&#039;un problème du mot de passe d&#039;administration root de la base de donnée MariaDB/MySQL et non du mot de passe utilisé par Dolibarr pour accéder à la base de donnée, ni de compte utilisateur d&#039;accès à Dolibarr (voir chapitres suivant pour cela).&lt;br /&gt;
&lt;br /&gt;
== Pour Mariadb installé par DoliWamp (Microsoft Windows) ==&lt;br /&gt;
* Connectez vous avec un compte administrateur Windows sur votre machine,&amp;lt;br /&amp;gt;&lt;br /&gt;
* Allez dans le menu Windows:&lt;br /&gt;
     Démarrer -&amp;gt; paramétres -&amp;gt; Panneau de configuration -&amp;gt; Outils d&#039;administration -&amp;gt; Services.&lt;br /&gt;
* Trouvez le service MySQL &#039;&#039;&#039;doliwampmysql&#039;&#039;&#039; dans la liste, et arrêtez le.&lt;br /&gt;
* Lancer une console de ligne de commande en allant dans le menu &lt;br /&gt;
     Démarrer -&amp;gt; Executer CMD&lt;br /&gt;
* Tapez les lignes suivantes pour relancer MySQL dans un mode particulier.&lt;br /&gt;
    CD C:\dolibarr\bin\mysql\mysql5.0.45\bin &lt;br /&gt;
    C:\dolibarr\bin\mysql\mysql5.0.45\bin\mysqld-nt --skip-grant-tables&lt;br /&gt;
* Lancer à nouveau une console de ligne de commande en allant dans le menu &lt;br /&gt;
    Menu Demarrer -&amp;gt; Executer CMD (une deuxieme fois)&lt;br /&gt;
* Tapez &lt;br /&gt;
    CD C:\dolibarr\bin\mysql\mysql5.0.45\bin &lt;br /&gt;
    C:\dolibarr\bin\mysql\mysql5.0.45\bin\mysql -u root&lt;br /&gt;
* A l&#039;invite, tapez&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
mysql&amp;gt; UPDATE mysql.user SET Password = PASSWORD(&#039;anewpassword&#039;) WHERE User = &#039;root&#039;;&lt;br /&gt;
or on a more recent version&lt;br /&gt;
mysql&amp;gt; SET PASSWORD FOR &#039;root@localhost&#039; = PASSWORD(&#039;anewpassword&#039;);&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
Pour prendre en compte le changement&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
mysql&amp;gt; FLUSH PRIVILEGES;&lt;br /&gt;
mysql&amp;gt; QUIT;&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
* Tapez &lt;br /&gt;
    C:\dolibarr\bin\mysql\mysql5.0.45\bin\mysqladmin -u root -pmotdepasseroot shutdown&lt;br /&gt;
* Redémarrez Windows.&lt;br /&gt;
&lt;br /&gt;
Vous devez pouvoir accéder à votre Base Mysql ce qui vous permet de réaliser l&#039;étape d&#039;après pour modifier le mot de passe utilisé par Dolibarr pour accéder à sa base de donnée.&lt;br /&gt;
&lt;br /&gt;
== Sous Linux ==&lt;br /&gt;
* Ouvrez une fenêtre terminal ligne de commande avec l&#039;utilisateur système root.&lt;br /&gt;
* Arrêtez Mysql:&lt;br /&gt;
    /usr/sbin/mysql stop&lt;br /&gt;
* Tapez la ligne suivante afin de relancer MySQL dans un mode particulier (sans utilisateurs).&lt;br /&gt;
    /usr/sbin --skip-grant-tables&lt;br /&gt;
* Ouvrez une autre fenêtre terminal ligne de commande.&lt;br /&gt;
* Lancez le client mysql&lt;br /&gt;
    /usr/bin/mysql -u root&lt;br /&gt;
* Au prompt de MySQL, tapez&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
mysql&amp;gt; UPDATE mysql.user SET Password = PASSWORD(&#039;anewpassword&#039;) WHERE User = &#039;root&#039;;&lt;br /&gt;
or on a more recent version&lt;br /&gt;
mysql&amp;gt; SET PASSWORD FOR &#039;root@localhost&#039; = PASSWORD(&#039;anewpassword&#039;);&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
Et pour prendre en compte&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
mysql&amp;gt; FLUSH PRIVILEGES;&lt;br /&gt;
mysql&amp;gt; QUIT;&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
* Arrêtez MySql par&lt;br /&gt;
    /usr/bin/mysqladmin -u root -panewpassword shutdown&lt;br /&gt;
* Relancer le serveur physique ou juste le serveur MySql.&lt;br /&gt;
&lt;br /&gt;
Vous devriez être capable de vous connecter à la base de donnée MySQL avec le user root et le mot de passe défini, vous pouvez maintenant dire à Dolibarr d&#039;utiliser le nouveau mot de passe.&lt;br /&gt;
&lt;br /&gt;
= Reset du mot de passe utilisé par Dolibarr pour accéder à la base =&lt;br /&gt;
* Allez dans&lt;br /&gt;
    htdocs\conf &lt;br /&gt;
* Editez le fichier conf.php pour changer la variable&lt;br /&gt;
    $dolibarr_main_db_pass&lt;br /&gt;
&lt;br /&gt;
et modifiez sa valeur avec un nouveau mot de passe. &lt;br /&gt;
&lt;br /&gt;
Le nom de l&#039;utilisateur pour accéder à la base de donnée est dans $dolibarr_main_db_user. Retenez le.&lt;br /&gt;
&lt;br /&gt;
* Sauvez le fichier et quittez.&lt;br /&gt;
&lt;br /&gt;
* Lancer le client mariadb/mysql avec l&#039;utilisateur root&lt;br /&gt;
     Sous Linux, depuis un terminal: /usr/bin/mysql -u root -ppassword&lt;br /&gt;
     Sous Windows: Lancer à une console de ligne de commande en allant dans le menu Menu Demarrer -&amp;gt; Executer CMD et Tapez &lt;br /&gt;
       CD C:\dolibarr\bin\mysql\mysqlx.y.z\bin &lt;br /&gt;
       C:\dolibarr\bin\mysql\mysqlx.y.z\bin\mysql -u root&lt;br /&gt;
* Au prompt de MariaDB/MySQL prompt, tapez&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
mysql&amp;gt; UPDATE mysql.user SET Password = PASSWORD(&#039;anothernewpassword&#039;) WHERE User = &#039;userusedbydolibarr&#039;;&lt;br /&gt;
ou avec une version plus récente&lt;br /&gt;
mysql&amp;gt; SET PASSWORD FOR &#039;userusedbydolibarr@localhost&#039; = PASSWORD(&#039;anothernewpassword&#039;);&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
Et pour prendre en compte&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
mysql&amp;gt; FLUSH PRIVILEGES;&lt;br /&gt;
mysql&amp;gt; QUIT;&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Reset du mot de passe d&#039;un compte utilisateur de l&#039;application Dolibarr =&lt;br /&gt;
== Si vous posséder un autre compte d&#039;accès à l&#039;application et que celui ci est admin ==&lt;br /&gt;
Connectez vous avec celui ci. Puis aller sur la fiche de l&#039;utilisateur dont il faut modifier le mot de passe. Modifier la fiche pour forcer un nouveau mot de passe.&lt;br /&gt;
&lt;br /&gt;
== Si le mot de passe perdu est celui du compte admin Dolibarr ==&lt;br /&gt;
Connectez-vous à la base de donnée Dolibarr mysql et modifier le champ &amp;quot;pass&amp;quot; du login avec lequel vous voulez vous connecter.&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
mysql&amp;gt; USE nomdelabasedolibarr;&lt;br /&gt;
mysql&amp;gt; UPDATE llx_user SET pass = &#039;atemporarypasswod&#039; WHERE login =&#039;loginuserbloque&#039;;&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Essayez de vous connecter puis modifiez votre mot de passe depuis votre fiche utilisateur. Cela effacera le mot de passe temporaire non crypté afin de stocker votre nouveau mot de passe crypté dans cette table.&lt;/div&gt;</summary>
		<author><name>Eldy</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=FAQ_J%27ai_perdu_mon_mot_de_passe&amp;diff=67447</id>
		<title>FAQ J&#039;ai perdu mon mot de passe</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=FAQ_J%27ai_perdu_mon_mot_de_passe&amp;diff=67447"/>
		<updated>2026-09-25T13:30:32Z</updated>

		<summary type="html">&lt;p&gt;Eldy: /* Linux */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Do NOT edit this section&lt;br /&gt;
     Links below are automatically managed by PolyglotBot&lt;br /&gt;
     You can edit links on the English source page : FAQ_I_Lost_my_password --&amp;gt;&lt;br /&gt;
[[en:FAQ_I_Lost_my_password]]&lt;br /&gt;
[[es:FAQ Tengo un problema en la contraseña]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ FR]]&lt;br /&gt;
Il peut arriver que vous oubliez votre mot de passe ou que pour une raison inconnue il ne fonctionne plus, voici la solution pour reprendre la main en fonction des 3 types de mots de passes concernés.&lt;br /&gt;
&lt;br /&gt;
= Reset du mot de passe root de la base de donnée MariaDB/MySQL =&lt;br /&gt;
Cette section traite d&#039;un problème du mot de passe d&#039;administration root de la base de donnée MariaDB/MySQL et non du mot de passe utilisé par Dolibarr pour accéder à la base de donnée, ni de compte utilisateur d&#039;accès à Dolibarr (voir chapitres suivant pour cela).&lt;br /&gt;
&lt;br /&gt;
== Sous Microsoft Windows installé par DoliWamp ==&lt;br /&gt;
* Connectez vous avec un compte administrateur Windows sur votre machine,&amp;lt;br /&amp;gt;&lt;br /&gt;
* Allez dans le menu Windows:&lt;br /&gt;
     Démarrer -&amp;gt; paramétres -&amp;gt; Panneau de configuration -&amp;gt; Outils d&#039;administration -&amp;gt; Services.&lt;br /&gt;
* Trouvez le service MySQL &#039;&#039;&#039;doliwampmysql&#039;&#039;&#039; dans la liste, et arrêtez le.&lt;br /&gt;
* Lancer une console de ligne de commande en allant dans le menu &lt;br /&gt;
     Démarrer -&amp;gt; Executer CMD&lt;br /&gt;
* Tapez les lignes suivantes pour relancer MySQL dans un mode particulier.&lt;br /&gt;
    CD C:\dolibarr\bin\mysql\mysql5.0.45\bin &lt;br /&gt;
    C:\dolibarr\bin\mysql\mysql5.0.45\bin\mysqld-nt --skip-grant-tables&lt;br /&gt;
* Lancer à nouveau une console de ligne de commande en allant dans le menu &lt;br /&gt;
    Menu Demarrer -&amp;gt; Executer CMD (une deuxieme fois)&lt;br /&gt;
* Tapez &lt;br /&gt;
    CD C:\dolibarr\bin\mysql\mysql5.0.45\bin &lt;br /&gt;
    C:\dolibarr\bin\mysql\mysql5.0.45\bin\mysql -u root&lt;br /&gt;
* A l&#039;invite, tapez&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
mysql&amp;gt; UPDATE mysql.user SET Password = PASSWORD(&#039;anewpassword&#039;) WHERE User = &#039;root&#039;;&lt;br /&gt;
or on a more recent version&lt;br /&gt;
mysql&amp;gt; SET PASSWORD FOR &#039;root@localhost&#039; = PASSWORD(&#039;anewpassword&#039;);&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
Pour prendre en compte le changement&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
mysql&amp;gt; FLUSH PRIVILEGES;&lt;br /&gt;
mysql&amp;gt; QUIT;&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
* Tapez &lt;br /&gt;
    C:\dolibarr\bin\mysql\mysql5.0.45\bin\mysqladmin -u root -pmotdepasseroot shutdown&lt;br /&gt;
* Redémarrez Windows.&lt;br /&gt;
&lt;br /&gt;
Vous devez pouvoir accéder à votre Base Mysql ce qui vous permet de réaliser l&#039;étape d&#039;après pour modifier le mot de passe utilisé par Dolibarr pour accéder à sa base de donnée.&lt;br /&gt;
&lt;br /&gt;
== Sous Linux ==&lt;br /&gt;
* Ouvrez une fenêtre terminal ligne de commande avec l&#039;utilisateur système root.&lt;br /&gt;
* Arrêtez Mysql:&lt;br /&gt;
    /usr/sbin/mysql stop&lt;br /&gt;
* Tapez la ligne suivante afin de relancer MySQL dans un mode particulier (sans utilisateurs).&lt;br /&gt;
    /usr/sbin --skip-grant-tables&lt;br /&gt;
* Ouvrez une autre fenêtre terminal ligne de commande.&lt;br /&gt;
* Lancez le client mysql&lt;br /&gt;
    /usr/bin/mysql -u root&lt;br /&gt;
* Au prompt de MySQL, tapez&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
mysql&amp;gt; UPDATE mysql.user SET Password = PASSWORD(&#039;anewpassword&#039;) WHERE User = &#039;root&#039;;&lt;br /&gt;
or on a more recent version&lt;br /&gt;
mysql&amp;gt; SET PASSWORD FOR &#039;root@localhost&#039; = PASSWORD(&#039;anewpassword&#039;);&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
Et pour prendre en compte&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
mysql&amp;gt; FLUSH PRIVILEGES;&lt;br /&gt;
mysql&amp;gt; QUIT;&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
* Arrêtez MySql par&lt;br /&gt;
    /usr/bin/mysqladmin -u root -panewpassword shutdown&lt;br /&gt;
* Relancer le serveur physique ou juste le serveur MySql.&lt;br /&gt;
&lt;br /&gt;
Vous devriez être capable de vous connecter à la base de donnée MySQL avec le user root et le mot de passe défini, vous pouvez maintenant dire à Dolibarr d&#039;utiliser le nouveau mot de passe.&lt;br /&gt;
&lt;br /&gt;
= Reset du mot de passe utilisé par Dolibarr pour accéder à la base =&lt;br /&gt;
* Allez dans&lt;br /&gt;
    htdocs\conf &lt;br /&gt;
* Editez le fichier conf.php pour changer la variable&lt;br /&gt;
    $dolibarr_main_db_pass&lt;br /&gt;
&lt;br /&gt;
et modifiez sa valeur avec un nouveau mot de passe. &lt;br /&gt;
&lt;br /&gt;
Le nom de l&#039;utilisateur pour accéder à la base de donnée est dans $dolibarr_main_db_user. Retenez le.&lt;br /&gt;
&lt;br /&gt;
* Sauvez le fichier et quittez.&lt;br /&gt;
&lt;br /&gt;
* Lancer le client mariadb/mysql avec l&#039;utilisateur root&lt;br /&gt;
     Sous Linux, depuis un terminal: /usr/bin/mysql -u root -ppassword&lt;br /&gt;
     Sous Windows: Lancer à une console de ligne de commande en allant dans le menu Menu Demarrer -&amp;gt; Executer CMD et Tapez &lt;br /&gt;
       CD C:\dolibarr\bin\mysql\mysqlx.y.z\bin &lt;br /&gt;
       C:\dolibarr\bin\mysql\mysqlx.y.z\bin\mysql -u root&lt;br /&gt;
* Au prompt de MariaDB/MySQL prompt, tapez&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
mysql&amp;gt; UPDATE mysql.user SET Password = PASSWORD(&#039;anothernewpassword&#039;) WHERE User = &#039;userusedbydolibarr&#039;;&lt;br /&gt;
ou avec une version plus récente&lt;br /&gt;
mysql&amp;gt; SET PASSWORD FOR &#039;userusedbydolibarr@localhost&#039; = PASSWORD(&#039;anothernewpassword&#039;);&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
Et pour prendre en compte&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
mysql&amp;gt; FLUSH PRIVILEGES;&lt;br /&gt;
mysql&amp;gt; QUIT;&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Reset du mot de passe d&#039;un compte utilisateur de l&#039;application Dolibarr =&lt;br /&gt;
== Si vous posséder un autre compte d&#039;accès à l&#039;application et que celui ci est admin ==&lt;br /&gt;
Connectez vous avec celui ci. Puis aller sur la fiche de l&#039;utilisateur dont il faut modifier le mot de passe. Modifier la fiche pour forcer un nouveau mot de passe.&lt;br /&gt;
&lt;br /&gt;
== Si le mot de passe perdu est celui du compte admin Dolibarr ==&lt;br /&gt;
Connectez-vous à la base de donnée Dolibarr mysql et modifier le champ &amp;quot;pass&amp;quot; du login avec lequel vous voulez vous connecter.&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
mysql&amp;gt; USE nomdelabasedolibarr;&lt;br /&gt;
mysql&amp;gt; UPDATE llx_user SET pass = &#039;atemporarypasswod&#039; WHERE login =&#039;loginuserbloque&#039;;&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Essayez de vous connecter puis modifiez votre mot de passe depuis votre fiche utilisateur. Cela effacera le mot de passe temporaire non crypté afin de stocker votre nouveau mot de passe crypté dans cette table.&lt;/div&gt;</summary>
		<author><name>Eldy</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=FAQ_J%27ai_perdu_mon_mot_de_passe&amp;diff=67446</id>
		<title>FAQ J&#039;ai perdu mon mot de passe</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=FAQ_J%27ai_perdu_mon_mot_de_passe&amp;diff=67446"/>
		<updated>2026-09-25T13:30:13Z</updated>

		<summary type="html">&lt;p&gt;Eldy: /* Sous Microsoft Windows */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- BEGIN interlang links --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Do NOT edit this section&lt;br /&gt;
     Links below are automatically managed by PolyglotBot&lt;br /&gt;
     You can edit links on the English source page : FAQ_I_Lost_my_password --&amp;gt;&lt;br /&gt;
[[en:FAQ_I_Lost_my_password]]&lt;br /&gt;
[[es:FAQ Tengo un problema en la contraseña]]&lt;br /&gt;
&amp;lt;!-- END interlang links --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:FAQ FR]]&lt;br /&gt;
Il peut arriver que vous oubliez votre mot de passe ou que pour une raison inconnue il ne fonctionne plus, voici la solution pour reprendre la main en fonction des 3 types de mots de passes concernés.&lt;br /&gt;
&lt;br /&gt;
= Reset du mot de passe root de la base de donnée MariaDB/MySQL =&lt;br /&gt;
Cette section traite d&#039;un problème du mot de passe d&#039;administration root de la base de donnée MariaDB/MySQL et non du mot de passe utilisé par Dolibarr pour accéder à la base de donnée, ni de compte utilisateur d&#039;accès à Dolibarr (voir chapitres suivant pour cela).&lt;br /&gt;
&lt;br /&gt;
== Sous Microsoft Windows installé par DoliWamp ==&lt;br /&gt;
* Connectez vous avec un compte administrateur Windows sur votre machine,&amp;lt;br /&amp;gt;&lt;br /&gt;
* Allez dans le menu Windows:&lt;br /&gt;
     Démarrer -&amp;gt; paramétres -&amp;gt; Panneau de configuration -&amp;gt; Outils d&#039;administration -&amp;gt; Services.&lt;br /&gt;
* Trouvez le service MySQL &#039;&#039;&#039;doliwampmysql&#039;&#039;&#039; dans la liste, et arrêtez le.&lt;br /&gt;
* Lancer une console de ligne de commande en allant dans le menu &lt;br /&gt;
     Démarrer -&amp;gt; Executer CMD&lt;br /&gt;
* Tapez les lignes suivantes pour relancer MySQL dans un mode particulier.&lt;br /&gt;
    CD C:\dolibarr\bin\mysql\mysql5.0.45\bin &lt;br /&gt;
    C:\dolibarr\bin\mysql\mysql5.0.45\bin\mysqld-nt --skip-grant-tables&lt;br /&gt;
* Lancer à nouveau une console de ligne de commande en allant dans le menu &lt;br /&gt;
    Menu Demarrer -&amp;gt; Executer CMD (une deuxieme fois)&lt;br /&gt;
* Tapez &lt;br /&gt;
    CD C:\dolibarr\bin\mysql\mysql5.0.45\bin &lt;br /&gt;
    C:\dolibarr\bin\mysql\mysql5.0.45\bin\mysql -u root&lt;br /&gt;
* A l&#039;invite, tapez&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
mysql&amp;gt; UPDATE mysql.user SET Password = PASSWORD(&#039;anewpassword&#039;) WHERE User = &#039;root&#039;;&lt;br /&gt;
or on a more recent version&lt;br /&gt;
mysql&amp;gt; SET PASSWORD FOR &#039;root@localhost&#039; = PASSWORD(&#039;anewpassword&#039;);&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
Pour prendre en compte le changement&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
mysql&amp;gt; FLUSH PRIVILEGES;&lt;br /&gt;
mysql&amp;gt; QUIT;&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
* Tapez &lt;br /&gt;
    C:\dolibarr\bin\mysql\mysql5.0.45\bin\mysqladmin -u root -pmotdepasseroot shutdown&lt;br /&gt;
* Redémarrez Windows.&lt;br /&gt;
&lt;br /&gt;
Vous devez pouvoir accéder à votre Base Mysql ce qui vous permet de réaliser l&#039;étape d&#039;après pour modifier le mot de passe utilisé par Dolibarr pour accéder à sa base de donnée.&lt;br /&gt;
&lt;br /&gt;
== Linux ==&lt;br /&gt;
* Ouvrez une fenêtre terminal ligne de commande avec l&#039;utilisateur système root.&lt;br /&gt;
* Arrêtez Mysql:&lt;br /&gt;
    /usr/sbin/mysql stop&lt;br /&gt;
* Tapez la ligne suivante afin de relancer MySQL dans un mode particulier (sans utilisateurs).&lt;br /&gt;
    /usr/sbin --skip-grant-tables&lt;br /&gt;
* Ouvrez une autre fenêtre terminal ligne de commande.&lt;br /&gt;
* Lancez le client mysql&lt;br /&gt;
    /usr/bin/mysql -u root&lt;br /&gt;
* Au prompt de MySQL, tapez&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
mysql&amp;gt; UPDATE mysql.user SET Password = PASSWORD(&#039;anewpassword&#039;) WHERE User = &#039;root&#039;;&lt;br /&gt;
or on a more recent version&lt;br /&gt;
mysql&amp;gt; SET PASSWORD FOR &#039;root@localhost&#039; = PASSWORD(&#039;anewpassword&#039;);&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
Et pour prendre en compte&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
mysql&amp;gt; FLUSH PRIVILEGES;&lt;br /&gt;
mysql&amp;gt; QUIT;&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
* Arrêtez MySql par&lt;br /&gt;
    /usr/bin/mysqladmin -u root -panewpassword shutdown&lt;br /&gt;
* Relancer le serveur physique ou juste le serveur MySql.&lt;br /&gt;
&lt;br /&gt;
Vous devriez être capable de vous connecter à la base de donnée MySQL avec le user root et le mot de passe défini, vous pouvez maintenant dire à Dolibarr d&#039;utiliser le nouveau mot de passe.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Reset du mot de passe utilisé par Dolibarr pour accéder à la base =&lt;br /&gt;
* Allez dans&lt;br /&gt;
    htdocs\conf &lt;br /&gt;
* Editez le fichier conf.php pour changer la variable&lt;br /&gt;
    $dolibarr_main_db_pass&lt;br /&gt;
&lt;br /&gt;
et modifiez sa valeur avec un nouveau mot de passe. &lt;br /&gt;
&lt;br /&gt;
Le nom de l&#039;utilisateur pour accéder à la base de donnée est dans $dolibarr_main_db_user. Retenez le.&lt;br /&gt;
&lt;br /&gt;
* Sauvez le fichier et quittez.&lt;br /&gt;
&lt;br /&gt;
* Lancer le client mariadb/mysql avec l&#039;utilisateur root&lt;br /&gt;
     Sous Linux, depuis un terminal: /usr/bin/mysql -u root -ppassword&lt;br /&gt;
     Sous Windows: Lancer à une console de ligne de commande en allant dans le menu Menu Demarrer -&amp;gt; Executer CMD et Tapez &lt;br /&gt;
       CD C:\dolibarr\bin\mysql\mysqlx.y.z\bin &lt;br /&gt;
       C:\dolibarr\bin\mysql\mysqlx.y.z\bin\mysql -u root&lt;br /&gt;
* Au prompt de MariaDB/MySQL prompt, tapez&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
mysql&amp;gt; UPDATE mysql.user SET Password = PASSWORD(&#039;anothernewpassword&#039;) WHERE User = &#039;userusedbydolibarr&#039;;&lt;br /&gt;
ou avec une version plus récente&lt;br /&gt;
mysql&amp;gt; SET PASSWORD FOR &#039;userusedbydolibarr@localhost&#039; = PASSWORD(&#039;anothernewpassword&#039;);&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
Et pour prendre en compte&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
mysql&amp;gt; FLUSH PRIVILEGES;&lt;br /&gt;
mysql&amp;gt; QUIT;&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Reset du mot de passe d&#039;un compte utilisateur de l&#039;application Dolibarr =&lt;br /&gt;
== Si vous posséder un autre compte d&#039;accès à l&#039;application et que celui ci est admin ==&lt;br /&gt;
Connectez vous avec celui ci. Puis aller sur la fiche de l&#039;utilisateur dont il faut modifier le mot de passe. Modifier la fiche pour forcer un nouveau mot de passe.&lt;br /&gt;
&lt;br /&gt;
== Si le mot de passe perdu est celui du compte admin Dolibarr ==&lt;br /&gt;
Connectez-vous à la base de donnée Dolibarr mysql et modifier le champ &amp;quot;pass&amp;quot; du login avec lequel vous voulez vous connecter.&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
mysql&amp;gt; USE nomdelabasedolibarr;&lt;br /&gt;
mysql&amp;gt; UPDATE llx_user SET pass = &#039;atemporarypasswod&#039; WHERE login =&#039;loginuserbloque&#039;;&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Essayez de vous connecter puis modifiez votre mot de passe depuis votre fiche utilisateur. Cela effacera le mot de passe temporaire non crypté afin de stocker votre nouveau mot de passe crypté dans cette table.&lt;/div&gt;</summary>
		<author><name>Eldy</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Report_board_meeting_20260922_teleconf&amp;diff=67399</id>
		<title>Report board meeting 20260922 teleconf</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Report_board_meeting_20260922_teleconf&amp;diff=67399"/>
		<updated>2026-09-22T11:09:57Z</updated>

		<summary type="html">&lt;p&gt;Eldy: /* Attorney question */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{TemplateAssoEn}} {{TemplateAssoFr}}&lt;br /&gt;
&lt;br /&gt;
=Title/Date/Location=&lt;br /&gt;
&lt;br /&gt;
*Title: Foundation board meeting&lt;br /&gt;
*Date: 2026-09-22&lt;br /&gt;
*Location: Online with NextCloud&lt;br /&gt;
&lt;br /&gt;
=Presents=&lt;br /&gt;
Members of the board (subscription up to date) that are present (Name of organization and name of contact):&lt;br /&gt;
&lt;br /&gt;
*ATM (Maxime Kohlhaas)&lt;br /&gt;
*DoliCloud (Laurent DESTAILLEUR)&lt;br /&gt;
*Inovea Conseil (Alexandre SPANGARO + Nicolas Zabouri)&lt;br /&gt;
*SCOPEN (Florian HENRY)&lt;br /&gt;
*ATOO NEt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Topics=&lt;br /&gt;
&lt;br /&gt;
==French Certification of Dolibarr system for France by LNE==&lt;br /&gt;
&lt;br /&gt;
Control was done in july. Around 140 points are ok but there is still 1 non-conformity point reported (only for certification, software is ok for attestation). &lt;br /&gt;
Still waiting feedback of LNE about our answer done in end of june on this point. &lt;br /&gt;
&lt;br /&gt;
Note: Problem will not be solved quickly, so users are invited to obtain a &amp;quot;Conformity statement&amp;quot; that can be provided by their integrator or reseller instead of waiting for the public &amp;quot;Certification&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=&amp;gt; Remind sent the 25th of august.&lt;br /&gt;
=&amp;gt; The LNE has contacted us the 11th of september to say they will provide us an answer about our solution.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Action done by Laurent Destailleur (Dolibarr foundation requests)==&lt;br /&gt;
&lt;br /&gt;
*A tool to build a zip, tag the version, update the changelog and publish on dolistore as been developped.&lt;br /&gt;
&lt;br /&gt;
==New preferred partner==&lt;br /&gt;
No new preferred partner requested in July. &lt;br /&gt;
Remind: Prestalidaire was added in June.&lt;br /&gt;
Prestalidaire Switzerland has been accepted as a new Partner (2 entities with 2 different memberships done)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Foundation tools==&lt;br /&gt;
&lt;br /&gt;
*Quotation validation to upgrade our Nextcloud and split server that host the forum&lt;br /&gt;
&lt;br /&gt;
*A new metabase report has been created to better follow Preferred Partner program = &amp;gt; Need to migrate it on a server of the foundation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Replacement of Stripe with Stancer on Dolistore==&lt;br /&gt;
Development and test are finished and OK.&lt;br /&gt;
&lt;br /&gt;
Planned for december 2026.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Donation system==&lt;br /&gt;
Go to test and fix the donation module to accept donation (with vat 0%) and a receipt that must be send automatically by email.&lt;br /&gt;
&lt;br /&gt;
==Help to find founding==&lt;br /&gt;
&lt;br /&gt;
*Dolibarr foundation continue to describe all the tasks of Einvoicing module to obtain the fund of the NLNET organization (NLNET - European NGI organization)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Dolibarr forum==&lt;br /&gt;
Move of forum on another server.&lt;br /&gt;
Maxime has sent the quote signed to Jean Traullé.&lt;br /&gt;
Laurent has sent the credential of the new server.&lt;br /&gt;
&lt;br /&gt;
TODO: Jean: Intervention is planned.&lt;br /&gt;
&lt;br /&gt;
==Attorney question==&lt;br /&gt;
* Question on refunding or not sells for module with a very high amount need a lawyer advice (rules for Dolibarr).&lt;br /&gt;
** Our attorney has returned a quote to analyze solutions according to french law (around 3 000 euros).&lt;br /&gt;
** A meeting was done with the laywer the 7th of september. A document (answer by the lawyer) is expected between end of september and mi october.&lt;br /&gt;
** Waiting report for mid-october.&lt;br /&gt;
&lt;br /&gt;
* Some repetitive abuse has been detected by seller that does not respect the rules.&lt;br /&gt;
&lt;br /&gt;
==DevCamps organization==&lt;br /&gt;
===Winter DevCamp 2026===&lt;br /&gt;
&lt;br /&gt;
*Date is defined: 26-November-2026 14:00 to 29-November-2026 12:00&lt;br /&gt;
*Location: Hôtel Des Congrès, Place du Commandant Rivière, 69100 Villeurbanne&lt;br /&gt;
*Organized by: OpenDSI&lt;br /&gt;
*Quotation under review by Dolibarr board =&amp;gt; Budget validated without the line for coffe the sunday (the breakfast is enough).&lt;br /&gt;
*First Deposit was already payed&lt;br /&gt;
*Open subscription to all is launched on Forum and Dolibarr News&lt;br /&gt;
&lt;br /&gt;
===Summer DevCamp 2027===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*Lille - Nord ERP CRM is confirmed too.&lt;br /&gt;
&lt;br /&gt;
Date planned are 17th june to 19th of june 2027.&lt;br /&gt;
&lt;br /&gt;
TODO Maxime must sign the proposal. Due to higher prices of hostel, price could be rised to 220 euro HT per person.&lt;br /&gt;
&lt;br /&gt;
===Winter DevCamp 2027===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*Nancy: Inovea wish to be organizer&lt;br /&gt;
&lt;br /&gt;
===Summer DevCamp 2028===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*Nancy: SOLAUV wish to be organizer&lt;br /&gt;
&lt;br /&gt;
===Summer DevCamp 2028===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*BRIOUDE(43100): SOLAUV wish to be organizer&lt;br /&gt;
&lt;br /&gt;
===Winter DevCamp 2028===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*TBD&lt;br /&gt;
&lt;br /&gt;
===Summer DevCamp 2028===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*LACHAPELLE SOUS ROUGEMONT (90360): NSINFO SARL wish to organize&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Community modules==&lt;br /&gt;
The foundation confirm that any modules flagged as &amp;quot;Community module&amp;quot; (so with the guarantee of the foundation on CI rules, management of mainteners, management of common transifex translation account, management of github mainteners), must not be stored any more on external repository.&lt;br /&gt;
&lt;br /&gt;
Rules for management of the community repository has been initiated:&lt;br /&gt;
&lt;br /&gt;
https://wiki.dolibarr.org/index.php/Modules_-_Rules_for_community_modules&lt;br /&gt;
&lt;br /&gt;
===DoliSecu et Stancer===&lt;br /&gt;
The 2 new modules DoliSecu and Stancer validated during previous meeting have been included.&lt;br /&gt;
&lt;br /&gt;
===E-invoicing===&lt;br /&gt;
&lt;br /&gt;
*Actual repository: https://github.com/Dolibarr/dolibarr-community-modules/tree/main/einvoicing&lt;br /&gt;
*Work with Dolibarr Integrator/PDPLibre/Esalink&lt;br /&gt;
*Work with SuperPDP&lt;br /&gt;
&lt;br /&gt;
The release 1.2.0 is available.&lt;br /&gt;
&lt;br /&gt;
For the module einvoicing, the minimal version is confirmed to be v18.0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Next congress / meeting==&lt;br /&gt;
&lt;br /&gt;
===Salon Paris Open Source Experience 2026===&lt;br /&gt;
&lt;br /&gt;
*Location: Paris, Porte de Versailles&lt;br /&gt;
*Date: 9 &amp;amp; 10 December 2026&lt;br /&gt;
&lt;br /&gt;
Laurent has made a request to register the 14th of august. Request was confirmed as received. Waiting answer of the organization.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Salon Solution===&lt;br /&gt;
&lt;br /&gt;
*Location: Paris, Porte de Versailles&lt;br /&gt;
*Date: 14 &amp;amp; 15 Octobre 2026&lt;br /&gt;
**The foundation will participate for 5K€ + 1K€ remain from last year (gold sponsor) - Budget is around 30 000 € (only 6 k€ si provided by the foundation).&lt;br /&gt;
**10 companies will be present (silver sponsor) + 6 other sponsoring companies&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===FOSDEM===&lt;br /&gt;
&lt;br /&gt;
* 30 &amp;amp; 31 January 2027 - Brussels, Belgium&lt;br /&gt;
* Open for application.&lt;br /&gt;
* Laurent must apply for the foundation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Salon Swiss IT Forum===&lt;br /&gt;
&lt;br /&gt;
*https://www.swiss-it-forums.tech/fr/&lt;br /&gt;
*Date: 30 September 2026&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: 11h - 21h to 1er October 2026&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: 9h - 17h&lt;br /&gt;
*Location: Palexpo Genève&lt;br /&gt;
**Discuss between partners about this opportunities&lt;/div&gt;</summary>
		<author><name>Eldy</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Report_board_meeting_20260922_teleconf&amp;diff=67398</id>
		<title>Report board meeting 20260922 teleconf</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Report_board_meeting_20260922_teleconf&amp;diff=67398"/>
		<updated>2026-09-22T11:09:12Z</updated>

		<summary type="html">&lt;p&gt;Eldy: /* Attorney question */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{TemplateAssoEn}} {{TemplateAssoFr}}&lt;br /&gt;
&lt;br /&gt;
=Title/Date/Location=&lt;br /&gt;
&lt;br /&gt;
*Title: Foundation board meeting&lt;br /&gt;
*Date: 2026-09-22&lt;br /&gt;
*Location: Online with NextCloud&lt;br /&gt;
&lt;br /&gt;
=Presents=&lt;br /&gt;
Members of the board (subscription up to date) that are present (Name of organization and name of contact):&lt;br /&gt;
&lt;br /&gt;
*ATM (Maxime Kohlhaas)&lt;br /&gt;
*DoliCloud (Laurent DESTAILLEUR)&lt;br /&gt;
*Inovea Conseil (Alexandre SPANGARO + Nicolas Zabouri)&lt;br /&gt;
*SCOPEN (Florian HENRY)&lt;br /&gt;
*ATOO NEt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Topics=&lt;br /&gt;
&lt;br /&gt;
==French Certification of Dolibarr system for France by LNE==&lt;br /&gt;
&lt;br /&gt;
Control was done in july. Around 140 points are ok but there is still 1 non-conformity point reported (only for certification, software is ok for attestation). &lt;br /&gt;
Still waiting feedback of LNE about our answer done in end of june on this point. &lt;br /&gt;
&lt;br /&gt;
Note: Problem will not be solved quickly, so users are invited to obtain a &amp;quot;Conformity statement&amp;quot; that can be provided by their integrator or reseller instead of waiting for the public &amp;quot;Certification&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=&amp;gt; Remind sent the 25th of august.&lt;br /&gt;
=&amp;gt; The LNE has contacted us the 11th of september to say they will provide us an answer about our solution.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Action done by Laurent Destailleur (Dolibarr foundation requests)==&lt;br /&gt;
&lt;br /&gt;
*A tool to build a zip, tag the version, update the changelog and publish on dolistore as been developped.&lt;br /&gt;
&lt;br /&gt;
==New preferred partner==&lt;br /&gt;
No new preferred partner requested in July. &lt;br /&gt;
Remind: Prestalidaire was added in June.&lt;br /&gt;
Prestalidaire Switzerland has been accepted as a new Partner (2 entities with 2 different memberships done)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Foundation tools==&lt;br /&gt;
&lt;br /&gt;
*Quotation validation to upgrade our Nextcloud and split server that host the forum&lt;br /&gt;
&lt;br /&gt;
*A new metabase report has been created to better follow Preferred Partner program = &amp;gt; Need to migrate it on a server of the foundation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Replacement of Stripe with Stancer on Dolistore==&lt;br /&gt;
Development and test are finished and OK.&lt;br /&gt;
&lt;br /&gt;
Planned for december 2026.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Donation system==&lt;br /&gt;
Go to test and fix the donation module to accept donation (with vat 0%) and a receipt that must be send automatically by email.&lt;br /&gt;
&lt;br /&gt;
==Help to find founding==&lt;br /&gt;
&lt;br /&gt;
*Dolibarr foundation continue to describe all the tasks of Einvoicing module to obtain the fund of the NLNET organization (NLNET - European NGI organization)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Dolibarr forum==&lt;br /&gt;
Move of forum on another server.&lt;br /&gt;
Maxime has sent the quote signed to Jean Traullé.&lt;br /&gt;
Laurent has sent the credential of the new server.&lt;br /&gt;
&lt;br /&gt;
TODO: Jean: Intervention is planned.&lt;br /&gt;
&lt;br /&gt;
==Attorney question==&lt;br /&gt;
* Question on refunding or not sells for module with a very high amount need a lawyer advice (rules for Dolibarr).&lt;br /&gt;
** Our attorney has returned a quote to analyze solutions according to french law (around 3 000 euros).&lt;br /&gt;
** A meeting was done with the laywer the 7th of september. A document (answer by the lawyer) is expected between end of september and mi october.&lt;br /&gt;
** Waiting report for mid-october.&lt;br /&gt;
&lt;br /&gt;
* Some abuse has been detected by seller that does not respect the rules.&lt;br /&gt;
&lt;br /&gt;
==DevCamps organization==&lt;br /&gt;
===Winter DevCamp 2026===&lt;br /&gt;
&lt;br /&gt;
*Date is defined: 26-November-2026 14:00 to 29-November-2026 12:00&lt;br /&gt;
*Location: Hôtel Des Congrès, Place du Commandant Rivière, 69100 Villeurbanne&lt;br /&gt;
*Organized by: OpenDSI&lt;br /&gt;
*Quotation under review by Dolibarr board =&amp;gt; Budget validated without the line for coffe the sunday (the breakfast is enough).&lt;br /&gt;
*First Deposit was already payed&lt;br /&gt;
*Open subscription to all is launched on Forum and Dolibarr News&lt;br /&gt;
&lt;br /&gt;
===Summer DevCamp 2027===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*Lille - Nord ERP CRM is confirmed too.&lt;br /&gt;
&lt;br /&gt;
Date planned are 17th june to 19th of june 2027.&lt;br /&gt;
&lt;br /&gt;
TODO Maxime must sign the proposal. Due to higher prices of hostel, price could be rised to 220 euro HT per person.&lt;br /&gt;
&lt;br /&gt;
===Winter DevCamp 2027===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*Nancy: Inovea wish to be organizer&lt;br /&gt;
&lt;br /&gt;
===Summer DevCamp 2028===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*Nancy: SOLAUV wish to be organizer&lt;br /&gt;
&lt;br /&gt;
===Summer DevCamp 2028===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*BRIOUDE(43100): SOLAUV wish to be organizer&lt;br /&gt;
&lt;br /&gt;
===Winter DevCamp 2028===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*TBD&lt;br /&gt;
&lt;br /&gt;
===Summer DevCamp 2028===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*LACHAPELLE SOUS ROUGEMONT (90360): NSINFO SARL wish to organize&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Community modules==&lt;br /&gt;
The foundation confirm that any modules flagged as &amp;quot;Community module&amp;quot; (so with the guarantee of the foundation on CI rules, management of mainteners, management of common transifex translation account, management of github mainteners), must not be stored any more on external repository.&lt;br /&gt;
&lt;br /&gt;
Rules for management of the community repository has been initiated:&lt;br /&gt;
&lt;br /&gt;
https://wiki.dolibarr.org/index.php/Modules_-_Rules_for_community_modules&lt;br /&gt;
&lt;br /&gt;
===DoliSecu et Stancer===&lt;br /&gt;
The 2 new modules DoliSecu and Stancer validated during previous meeting have been included.&lt;br /&gt;
&lt;br /&gt;
===E-invoicing===&lt;br /&gt;
&lt;br /&gt;
*Actual repository: https://github.com/Dolibarr/dolibarr-community-modules/tree/main/einvoicing&lt;br /&gt;
*Work with Dolibarr Integrator/PDPLibre/Esalink&lt;br /&gt;
*Work with SuperPDP&lt;br /&gt;
&lt;br /&gt;
The release 1.2.0 is available.&lt;br /&gt;
&lt;br /&gt;
For the module einvoicing, the minimal version is confirmed to be v18.0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Next congress / meeting==&lt;br /&gt;
&lt;br /&gt;
===Salon Paris Open Source Experience 2026===&lt;br /&gt;
&lt;br /&gt;
*Location: Paris, Porte de Versailles&lt;br /&gt;
*Date: 9 &amp;amp; 10 December 2026&lt;br /&gt;
&lt;br /&gt;
Laurent has made a request to register the 14th of august. Request was confirmed as received. Waiting answer of the organization.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Salon Solution===&lt;br /&gt;
&lt;br /&gt;
*Location: Paris, Porte de Versailles&lt;br /&gt;
*Date: 14 &amp;amp; 15 Octobre 2026&lt;br /&gt;
**The foundation will participate for 5K€ + 1K€ remain from last year (gold sponsor) - Budget is around 30 000 € (only 6 k€ si provided by the foundation).&lt;br /&gt;
**10 companies will be present (silver sponsor) + 6 other sponsoring companies&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===FOSDEM===&lt;br /&gt;
&lt;br /&gt;
* 30 &amp;amp; 31 January 2027 - Brussels, Belgium&lt;br /&gt;
* Open for application.&lt;br /&gt;
* Laurent must apply for the foundation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Salon Swiss IT Forum===&lt;br /&gt;
&lt;br /&gt;
*https://www.swiss-it-forums.tech/fr/&lt;br /&gt;
*Date: 30 September 2026&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: 11h - 21h to 1er October 2026&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: 9h - 17h&lt;br /&gt;
*Location: Palexpo Genève&lt;br /&gt;
**Discuss between partners about this opportunities&lt;/div&gt;</summary>
		<author><name>Eldy</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Report_board_meeting_20260922_teleconf&amp;diff=67396</id>
		<title>Report board meeting 20260922 teleconf</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Report_board_meeting_20260922_teleconf&amp;diff=67396"/>
		<updated>2026-09-22T10:56:49Z</updated>

		<summary type="html">&lt;p&gt;Eldy: /* Dolibarr forum */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{TemplateAssoEn}} {{TemplateAssoFr}}&lt;br /&gt;
&lt;br /&gt;
=Title/Date/Location=&lt;br /&gt;
&lt;br /&gt;
*Title: Foundation board meeting&lt;br /&gt;
*Date: 2026-09-22&lt;br /&gt;
*Location: Online with NextCloud&lt;br /&gt;
&lt;br /&gt;
=Presents=&lt;br /&gt;
Members of the board (subscription up to date) that are present (Name of organization and name of contact):&lt;br /&gt;
&lt;br /&gt;
*ATM (Maxime Kohlhaas)&lt;br /&gt;
*DoliCloud (Laurent DESTAILLEUR)&lt;br /&gt;
*Inovea Conseil (Alexandre SPANGARO + Nicolas Zabouri)&lt;br /&gt;
*SCOPEN (Florian HENRY)&lt;br /&gt;
*ATOO NEt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Topics=&lt;br /&gt;
&lt;br /&gt;
==French Certification of Dolibarr system for France by LNE==&lt;br /&gt;
&lt;br /&gt;
Control was done in july. Around 140 points are ok but there is still 1 non-conformity point reported (only for certification, software is ok for attestation). &lt;br /&gt;
Still waiting feedback of LNE about our answer done in end of june on this point. &lt;br /&gt;
&lt;br /&gt;
Note: Problem will not be solved quickly, so users are invited to obtain a &amp;quot;Conformity statement&amp;quot; that can be provided by their integrator or reseller instead of waiting for the public &amp;quot;Certification&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=&amp;gt; Remind sent the 25th of august.&lt;br /&gt;
=&amp;gt; The LNE has contacted us the 11th of september to say they will provide us an answer about our solution.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Action done by Laurent Destailleur (Dolibarr foundation requests)==&lt;br /&gt;
&lt;br /&gt;
*A tool to build a zip, tag the version, update the changelog and publish on dolistore as been developped.&lt;br /&gt;
&lt;br /&gt;
==New preferred partner==&lt;br /&gt;
No new preferred partner requested in July. &lt;br /&gt;
Remind: Prestalidaire was added in June.&lt;br /&gt;
Prestalidaire Switzerland has been accepted as a new Partner (2 entities with 2 different memberships done)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Foundation tools==&lt;br /&gt;
&lt;br /&gt;
*Quotation validation to upgrade our Nextcloud and split server that host the forum&lt;br /&gt;
&lt;br /&gt;
*A new metabase report has been created to better follow Preferred Partner program = &amp;gt; Need to migrate it on a server of the foundation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Replacement of Stripe with Stancer on Dolistore==&lt;br /&gt;
Development and test are finished and OK.&lt;br /&gt;
&lt;br /&gt;
Planned for december 2026.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Donation system==&lt;br /&gt;
Go to test and fix the donation module to accept donation (with vat 0%) and a receipt that must be send automatically by email.&lt;br /&gt;
&lt;br /&gt;
==Help to find founding==&lt;br /&gt;
&lt;br /&gt;
*Dolibarr foundation continue to describe all the tasks of Einvoicing module to obtain the fund of the NLNET organization (NLNET - European NGI organization)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Dolibarr forum==&lt;br /&gt;
Move of forum on another server.&lt;br /&gt;
Maxime has sent the quote signed to Jean Traullé.&lt;br /&gt;
Laurent has sent the credential of the new server.&lt;br /&gt;
&lt;br /&gt;
TODO: Jean: Intervention is planned.&lt;br /&gt;
&lt;br /&gt;
==Attorney question==&lt;br /&gt;
Question on refunding or not sells for module with a very high amount need a lawyer advice (rules for dolibarr).&lt;br /&gt;
Our attorney has returned a quote to analyze solutions according to french law (around 3 000 euros).&lt;br /&gt;
&lt;br /&gt;
A meeting was done with the laywer the 7th of september. A document (answer by the lawyer) is expected between end of september and mi october.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==DevCamps organization==&lt;br /&gt;
===Winter DevCamp 2026===&lt;br /&gt;
&lt;br /&gt;
*Date is defined: 26-November-2026 14:00 to 29-November-2026 12:00&lt;br /&gt;
*Location: Hôtel Des Congrès, Place du Commandant Rivière, 69100 Villeurbanne&lt;br /&gt;
*Organized by: OpenDSI&lt;br /&gt;
*Quotation under review by Dolibarr board =&amp;gt; Budget validated without the line for coffe the sunday (the breakfast is enough).&lt;br /&gt;
*First Deposit was already payed&lt;br /&gt;
*TODO Maxime: Communication for subscribing Partner has been set. Subscription for Preferred Partner are open until the 15th of september (limited to 2 people per company). Then it will be open to everybody (no limit for end users).&lt;br /&gt;
&lt;br /&gt;
===Summer DevCamp 2027===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*Lille - Nord ERP CRM is confirmed too.&lt;br /&gt;
&lt;br /&gt;
Date planned are 17th june to 19th of june 2027.&lt;br /&gt;
&lt;br /&gt;
TODO Maxime must sign the proposal. Due to higher prices of hostel, price could be rised to 220 euro HT per person.&lt;br /&gt;
&lt;br /&gt;
===Winter DevCamp 2027===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*Nancy: Inovea wish to be organizer&lt;br /&gt;
&lt;br /&gt;
===Summer DevCamp 2028===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*Nancy: SOLAUV wish to be organizer&lt;br /&gt;
&lt;br /&gt;
===Summer DevCamp 2028===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*BRIOUDE(43100): SOLAUV wish to be organizer&lt;br /&gt;
&lt;br /&gt;
===Winter DevCamp 2028===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*TBD&lt;br /&gt;
&lt;br /&gt;
===Summer DevCamp 2028===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*LACHAPELLE SOUS ROUGEMONT (90360): NSINFO SARL wish to organize&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Community modules==&lt;br /&gt;
The foundation confirm that any modules flagged as &amp;quot;Community module&amp;quot; (so with the guarantee of the foundation on CI rules, management of mainteners, management of common transifex translation account, management of github mainteners), must not be stored any more on external repository.&lt;br /&gt;
&lt;br /&gt;
Rules for management of the community repository has been initiated:&lt;br /&gt;
&lt;br /&gt;
https://wiki.dolibarr.org/index.php/Modules_-_Rules_for_community_modules&lt;br /&gt;
&lt;br /&gt;
===DoliSecu et Stancer===&lt;br /&gt;
The 2 new modules DoliSecu and Stancer validated during previous meeting have been included.&lt;br /&gt;
&lt;br /&gt;
===E-invoicing===&lt;br /&gt;
&lt;br /&gt;
*Actual repository: https://github.com/Dolibarr/dolibarr-community-modules/tree/main/einvoicing&lt;br /&gt;
*Work with Dolibarr Integrator/PDPLibre/Esalink&lt;br /&gt;
*Work with SuperPDP&lt;br /&gt;
&lt;br /&gt;
The release 1.2.0 is available.&lt;br /&gt;
&lt;br /&gt;
For the module einvoicing, the minimal version is confirmed to be v18.0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Next congress / meeting==&lt;br /&gt;
&lt;br /&gt;
===Salon Paris Open Source Experience 2026===&lt;br /&gt;
&lt;br /&gt;
*Location: Paris, Porte de Versailles&lt;br /&gt;
*Date: 9 &amp;amp; 10 December 2026&lt;br /&gt;
&lt;br /&gt;
Laurent has made a request to register the 14th of august. Request was confirmed as received. Waiting answer of the organization.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Salon Solution===&lt;br /&gt;
&lt;br /&gt;
*Location: Paris, Porte de Versailles&lt;br /&gt;
*Date: 14 &amp;amp; 15 Octobre 2026&lt;br /&gt;
**The foundation will participate for 5K€ + 1K€ remain from last year (gold sponsor) - Budget is around 30 000 € (only 6 k€ si provided by the foundation).&lt;br /&gt;
**10 companies will be present (silver sponsor) + 6 other sponsoring companies&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===FOSDEM===&lt;br /&gt;
&lt;br /&gt;
* 30 &amp;amp; 31 January 2027 - Brussels, Belgium&lt;br /&gt;
* Open for application.&lt;br /&gt;
* Laurent must apply for the foundation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Salon Swiss IT Forum===&lt;br /&gt;
&lt;br /&gt;
*https://www.swiss-it-forums.tech/fr/&lt;br /&gt;
*Date: 30 September 2026&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: 11h - 21h to 1er October 2026&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: 9h - 17h&lt;br /&gt;
*Location: Palexpo Genève&lt;br /&gt;
**Discuss between partners about this opportunities&lt;/div&gt;</summary>
		<author><name>Eldy</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Report_board_meeting_20260922_teleconf&amp;diff=67395</id>
		<title>Report board meeting 20260922 teleconf</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Report_board_meeting_20260922_teleconf&amp;diff=67395"/>
		<updated>2026-09-22T10:56:06Z</updated>

		<summary type="html">&lt;p&gt;Eldy: /* Upgrade of nextcloud */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{TemplateAssoEn}} {{TemplateAssoFr}}&lt;br /&gt;
&lt;br /&gt;
=Title/Date/Location=&lt;br /&gt;
&lt;br /&gt;
*Title: Foundation board meeting&lt;br /&gt;
*Date: 2026-09-22&lt;br /&gt;
*Location: Online with NextCloud&lt;br /&gt;
&lt;br /&gt;
=Presents=&lt;br /&gt;
Members of the board (subscription up to date) that are present (Name of organization and name of contact):&lt;br /&gt;
&lt;br /&gt;
*ATM (Maxime Kohlhaas)&lt;br /&gt;
*DoliCloud (Laurent DESTAILLEUR)&lt;br /&gt;
*Inovea Conseil (Alexandre SPANGARO + Nicolas Zabouri)&lt;br /&gt;
*SCOPEN (Florian HENRY)&lt;br /&gt;
*ATOO NEt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Topics=&lt;br /&gt;
&lt;br /&gt;
==French Certification of Dolibarr system for France by LNE==&lt;br /&gt;
&lt;br /&gt;
Control was done in july. Around 140 points are ok but there is still 1 non-conformity point reported (only for certification, software is ok for attestation). &lt;br /&gt;
Still waiting feedback of LNE about our answer done in end of june on this point. &lt;br /&gt;
&lt;br /&gt;
Note: Problem will not be solved quickly, so users are invited to obtain a &amp;quot;Conformity statement&amp;quot; that can be provided by their integrator or reseller instead of waiting for the public &amp;quot;Certification&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=&amp;gt; Remind sent the 25th of august.&lt;br /&gt;
=&amp;gt; The LNE has contacted us the 11th of september to say they will provide us an answer about our solution.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Action done by Laurent Destailleur (Dolibarr foundation requests)==&lt;br /&gt;
&lt;br /&gt;
*A tool to build a zip, tag the version, update the changelog and publish on dolistore as been developped.&lt;br /&gt;
&lt;br /&gt;
==New preferred partner==&lt;br /&gt;
No new preferred partner requested in July. &lt;br /&gt;
Remind: Prestalidaire was added in June.&lt;br /&gt;
Prestalidaire Switzerland has been accepted as a new Partner (2 entities with 2 different memberships done)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Foundation tools==&lt;br /&gt;
&lt;br /&gt;
*Quotation validation to upgrade our Nextcloud and split server that host the forum&lt;br /&gt;
&lt;br /&gt;
*A new metabase report has been created to better follow Preferred Partner program = &amp;gt; Need to migrate it on a server of the foundation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Replacement of Stripe with Stancer on Dolistore==&lt;br /&gt;
Development and test are finished and OK.&lt;br /&gt;
&lt;br /&gt;
Planned for december 2026.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Donation system==&lt;br /&gt;
Go to test and fix the donation module to accept donation (with vat 0%) and a receipt that must be send automatically by email.&lt;br /&gt;
&lt;br /&gt;
==Help to find founding==&lt;br /&gt;
&lt;br /&gt;
*Dolibarr foundation continue to describe all the tasks of Einvoicing module to obtain the fund of the NLNET organization (NLNET - European NGI organization)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Dolibarr forum==&lt;br /&gt;
Move of forum on another server.&lt;br /&gt;
&lt;br /&gt;
Maxime has sent the quote signed to Jean Traullé&lt;br /&gt;
&lt;br /&gt;
TODO: Laurent + Jean: Plan the intervention.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Attorney question==&lt;br /&gt;
Question on refunding or not sells for module with a very high amount need a lawyer advice (rules for dolibarr).&lt;br /&gt;
Our attorney has returned a quote to analyze solutions according to french law (around 3 000 euros).&lt;br /&gt;
&lt;br /&gt;
A meeting was done with the laywer the 7th of september. A document (answer by the lawyer) is expected between end of september and mi october.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==DevCamps organization==&lt;br /&gt;
===Winter DevCamp 2026===&lt;br /&gt;
&lt;br /&gt;
*Date is defined: 26-November-2026 14:00 to 29-November-2026 12:00&lt;br /&gt;
*Location: Hôtel Des Congrès, Place du Commandant Rivière, 69100 Villeurbanne&lt;br /&gt;
*Organized by: OpenDSI&lt;br /&gt;
*Quotation under review by Dolibarr board =&amp;gt; Budget validated without the line for coffe the sunday (the breakfast is enough).&lt;br /&gt;
*First Deposit was already payed&lt;br /&gt;
*TODO Maxime: Communication for subscribing Partner has been set. Subscription for Preferred Partner are open until the 15th of september (limited to 2 people per company). Then it will be open to everybody (no limit for end users).&lt;br /&gt;
&lt;br /&gt;
===Summer DevCamp 2027===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*Lille - Nord ERP CRM is confirmed too.&lt;br /&gt;
&lt;br /&gt;
Date planned are 17th june to 19th of june 2027.&lt;br /&gt;
&lt;br /&gt;
TODO Maxime must sign the proposal. Due to higher prices of hostel, price could be rised to 220 euro HT per person.&lt;br /&gt;
&lt;br /&gt;
===Winter DevCamp 2027===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*Nancy: Inovea wish to be organizer&lt;br /&gt;
&lt;br /&gt;
===Summer DevCamp 2028===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*Nancy: SOLAUV wish to be organizer&lt;br /&gt;
&lt;br /&gt;
===Summer DevCamp 2028===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*BRIOUDE(43100): SOLAUV wish to be organizer&lt;br /&gt;
&lt;br /&gt;
===Winter DevCamp 2028===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*TBD&lt;br /&gt;
&lt;br /&gt;
===Summer DevCamp 2028===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*LACHAPELLE SOUS ROUGEMONT (90360): NSINFO SARL wish to organize&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Community modules==&lt;br /&gt;
The foundation confirm that any modules flagged as &amp;quot;Community module&amp;quot; (so with the guarantee of the foundation on CI rules, management of mainteners, management of common transifex translation account, management of github mainteners), must not be stored any more on external repository.&lt;br /&gt;
&lt;br /&gt;
Rules for management of the community repository has been initiated:&lt;br /&gt;
&lt;br /&gt;
https://wiki.dolibarr.org/index.php/Modules_-_Rules_for_community_modules&lt;br /&gt;
&lt;br /&gt;
===DoliSecu et Stancer===&lt;br /&gt;
The 2 new modules DoliSecu and Stancer validated during previous meeting have been included.&lt;br /&gt;
&lt;br /&gt;
===E-invoicing===&lt;br /&gt;
&lt;br /&gt;
*Actual repository: https://github.com/Dolibarr/dolibarr-community-modules/tree/main/einvoicing&lt;br /&gt;
*Work with Dolibarr Integrator/PDPLibre/Esalink&lt;br /&gt;
*Work with SuperPDP&lt;br /&gt;
&lt;br /&gt;
The release 1.2.0 is available.&lt;br /&gt;
&lt;br /&gt;
For the module einvoicing, the minimal version is confirmed to be v18.0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Next congress / meeting==&lt;br /&gt;
&lt;br /&gt;
===Salon Paris Open Source Experience 2026===&lt;br /&gt;
&lt;br /&gt;
*Location: Paris, Porte de Versailles&lt;br /&gt;
*Date: 9 &amp;amp; 10 December 2026&lt;br /&gt;
&lt;br /&gt;
Laurent has made a request to register the 14th of august. Request was confirmed as received. Waiting answer of the organization.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Salon Solution===&lt;br /&gt;
&lt;br /&gt;
*Location: Paris, Porte de Versailles&lt;br /&gt;
*Date: 14 &amp;amp; 15 Octobre 2026&lt;br /&gt;
**The foundation will participate for 5K€ + 1K€ remain from last year (gold sponsor) - Budget is around 30 000 € (only 6 k€ si provided by the foundation).&lt;br /&gt;
**10 companies will be present (silver sponsor) + 6 other sponsoring companies&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===FOSDEM===&lt;br /&gt;
&lt;br /&gt;
* 30 &amp;amp; 31 January 2027 - Brussels, Belgium&lt;br /&gt;
* Open for application.&lt;br /&gt;
* Laurent must apply for the foundation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Salon Swiss IT Forum===&lt;br /&gt;
&lt;br /&gt;
*https://www.swiss-it-forums.tech/fr/&lt;br /&gt;
*Date: 30 September 2026&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: 11h - 21h to 1er October 2026&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: 9h - 17h&lt;br /&gt;
*Location: Palexpo Genève&lt;br /&gt;
**Discuss between partners about this opportunities&lt;/div&gt;</summary>
		<author><name>Eldy</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Report_board_meeting_20260922_teleconf&amp;diff=67394</id>
		<title>Report board meeting 20260922 teleconf</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Report_board_meeting_20260922_teleconf&amp;diff=67394"/>
		<updated>2026-09-22T10:55:03Z</updated>

		<summary type="html">&lt;p&gt;Eldy: /* Next congress / meeting */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{TemplateAssoEn}} {{TemplateAssoFr}}&lt;br /&gt;
&lt;br /&gt;
=Title/Date/Location=&lt;br /&gt;
&lt;br /&gt;
*Title: Foundation board meeting&lt;br /&gt;
*Date: 2026-09-22&lt;br /&gt;
*Location: Online with NextCloud&lt;br /&gt;
&lt;br /&gt;
=Presents=&lt;br /&gt;
Members of the board (subscription up to date) that are present (Name of organization and name of contact):&lt;br /&gt;
&lt;br /&gt;
*ATM (Maxime Kohlhaas)&lt;br /&gt;
*DoliCloud (Laurent DESTAILLEUR)&lt;br /&gt;
*Inovea Conseil (Alexandre SPANGARO + Nicolas Zabouri)&lt;br /&gt;
*SCOPEN (Florian HENRY)&lt;br /&gt;
*ATOO NEt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Topics=&lt;br /&gt;
&lt;br /&gt;
==French Certification of Dolibarr system for France by LNE==&lt;br /&gt;
&lt;br /&gt;
Control was done in july. Around 140 points are ok but there is still 1 non-conformity point reported (only for certification, software is ok for attestation). &lt;br /&gt;
Still waiting feedback of LNE about our answer done in end of june on this point. &lt;br /&gt;
&lt;br /&gt;
Note: Problem will not be solved quickly, so users are invited to obtain a &amp;quot;Conformity statement&amp;quot; that can be provided by their integrator or reseller instead of waiting for the public &amp;quot;Certification&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=&amp;gt; Remind sent the 25th of august.&lt;br /&gt;
=&amp;gt; The LNE has contacted us the 11th of september to say they will provide us an answer about our solution.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Action done by Laurent Destailleur (Dolibarr foundation requests)==&lt;br /&gt;
&lt;br /&gt;
*A tool to build a zip, tag the version, update the changelog and publish on dolistore as been developped.&lt;br /&gt;
&lt;br /&gt;
==New preferred partner==&lt;br /&gt;
No new preferred partner requested in July. &lt;br /&gt;
Remind: Prestalidaire was added in June.&lt;br /&gt;
Prestalidaire Switzerland has been accepted as a new Partner (2 entities with 2 different memberships done)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Foundation tools==&lt;br /&gt;
&lt;br /&gt;
*Quotation validation to upgrade our Nextcloud and split server that host the forum&lt;br /&gt;
&lt;br /&gt;
*A new metabase report has been created to better follow Preferred Partner program = &amp;gt; Need to migrate it on a server of the foundation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Replacement of Stripe with Stancer on Dolistore==&lt;br /&gt;
Development and test are finished and OK.&lt;br /&gt;
&lt;br /&gt;
Planned for december 2026.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Donation system==&lt;br /&gt;
Go to test and fix the donation module to accept donation (with vat 0%) and a receipt that must be send automatically by email.&lt;br /&gt;
&lt;br /&gt;
==Help to find founding==&lt;br /&gt;
&lt;br /&gt;
*Dolibarr foundation continue to describe all the tasks of Einvoicing module to obtain the fund of the NLNET organization (NLNET - European NGI organization)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Upgrade of nextcloud==&lt;br /&gt;
Waiting for Florian Charlet intervention =&amp;gt; Done.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Dolibarr forum==&lt;br /&gt;
Move of forum on another server.&lt;br /&gt;
&lt;br /&gt;
Maxime has sent the quote signed to Jean Traullé&lt;br /&gt;
&lt;br /&gt;
TODO: Laurent + Jean: Plan the intervention.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Attorney question==&lt;br /&gt;
Question on refunding or not sells for module with a very high amount need a lawyer advice (rules for dolibarr).&lt;br /&gt;
Our attorney has returned a quote to analyze solutions according to french law (around 3 000 euros).&lt;br /&gt;
&lt;br /&gt;
A meeting was done with the laywer the 7th of september. A document (answer by the lawyer) is expected between end of september and mi october.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==DevCamps organization==&lt;br /&gt;
===Winter DevCamp 2026===&lt;br /&gt;
&lt;br /&gt;
*Date is defined: 26-November-2026 14:00 to 29-November-2026 12:00&lt;br /&gt;
*Location: Hôtel Des Congrès, Place du Commandant Rivière, 69100 Villeurbanne&lt;br /&gt;
*Organized by: OpenDSI&lt;br /&gt;
*Quotation under review by Dolibarr board =&amp;gt; Budget validated without the line for coffe the sunday (the breakfast is enough).&lt;br /&gt;
*First Deposit was already payed&lt;br /&gt;
*TODO Maxime: Communication for subscribing Partner has been set. Subscription for Preferred Partner are open until the 15th of september (limited to 2 people per company). Then it will be open to everybody (no limit for end users).&lt;br /&gt;
&lt;br /&gt;
===Summer DevCamp 2027===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*Lille - Nord ERP CRM is confirmed too.&lt;br /&gt;
&lt;br /&gt;
Date planned are 17th june to 19th of june 2027.&lt;br /&gt;
&lt;br /&gt;
TODO Maxime must sign the proposal. Due to higher prices of hostel, price could be rised to 220 euro HT per person.&lt;br /&gt;
&lt;br /&gt;
===Winter DevCamp 2027===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*Nancy: Inovea wish to be organizer&lt;br /&gt;
&lt;br /&gt;
===Summer DevCamp 2028===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*Nancy: SOLAUV wish to be organizer&lt;br /&gt;
&lt;br /&gt;
===Summer DevCamp 2028===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*BRIOUDE(43100): SOLAUV wish to be organizer&lt;br /&gt;
&lt;br /&gt;
===Winter DevCamp 2028===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*TBD&lt;br /&gt;
&lt;br /&gt;
===Summer DevCamp 2028===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*LACHAPELLE SOUS ROUGEMONT (90360): NSINFO SARL wish to organize&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Community modules==&lt;br /&gt;
The foundation confirm that any modules flagged as &amp;quot;Community module&amp;quot; (so with the guarantee of the foundation on CI rules, management of mainteners, management of common transifex translation account, management of github mainteners), must not be stored any more on external repository.&lt;br /&gt;
&lt;br /&gt;
Rules for management of the community repository has been initiated:&lt;br /&gt;
&lt;br /&gt;
https://wiki.dolibarr.org/index.php/Modules_-_Rules_for_community_modules&lt;br /&gt;
&lt;br /&gt;
===DoliSecu et Stancer===&lt;br /&gt;
The 2 new modules DoliSecu and Stancer validated during previous meeting have been included.&lt;br /&gt;
&lt;br /&gt;
===E-invoicing===&lt;br /&gt;
&lt;br /&gt;
*Actual repository: https://github.com/Dolibarr/dolibarr-community-modules/tree/main/einvoicing&lt;br /&gt;
*Work with Dolibarr Integrator/PDPLibre/Esalink&lt;br /&gt;
*Work with SuperPDP&lt;br /&gt;
&lt;br /&gt;
The release 1.2.0 is available.&lt;br /&gt;
&lt;br /&gt;
For the module einvoicing, the minimal version is confirmed to be v18.0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Next congress / meeting==&lt;br /&gt;
&lt;br /&gt;
===Salon Paris Open Source Experience 2026===&lt;br /&gt;
&lt;br /&gt;
*Location: Paris, Porte de Versailles&lt;br /&gt;
*Date: 9 &amp;amp; 10 December 2026&lt;br /&gt;
&lt;br /&gt;
Laurent has made a request to register the 14th of august. Request was confirmed as received. Waiting answer of the organization.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Salon Solution===&lt;br /&gt;
&lt;br /&gt;
*Location: Paris, Porte de Versailles&lt;br /&gt;
*Date: 14 &amp;amp; 15 Octobre 2026&lt;br /&gt;
**The foundation will participate for 5K€ + 1K€ remain from last year (gold sponsor) - Budget is around 30 000 € (only 6 k€ si provided by the foundation).&lt;br /&gt;
**10 companies will be present (silver sponsor) + 6 other sponsoring companies&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===FOSDEM===&lt;br /&gt;
&lt;br /&gt;
* 30 &amp;amp; 31 January 2027 - Brussels, Belgium&lt;br /&gt;
* Open for application.&lt;br /&gt;
* Laurent must apply for the foundation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Salon Swiss IT Forum===&lt;br /&gt;
&lt;br /&gt;
*https://www.swiss-it-forums.tech/fr/&lt;br /&gt;
*Date: 30 September 2026&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: 11h - 21h to 1er October 2026&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: 9h - 17h&lt;br /&gt;
*Location: Palexpo Genève&lt;br /&gt;
**Discuss between partners about this opportunities&lt;/div&gt;</summary>
		<author><name>Eldy</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Report_board_meeting_20260922_teleconf&amp;diff=67393</id>
		<title>Report board meeting 20260922 teleconf</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Report_board_meeting_20260922_teleconf&amp;diff=67393"/>
		<updated>2026-09-22T10:53:35Z</updated>

		<summary type="html">&lt;p&gt;Eldy: /* Replacement of Stripe with Stancer on Dolistore */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{TemplateAssoEn}} {{TemplateAssoFr}}&lt;br /&gt;
&lt;br /&gt;
=Title/Date/Location=&lt;br /&gt;
&lt;br /&gt;
*Title: Foundation board meeting&lt;br /&gt;
*Date: 2026-09-22&lt;br /&gt;
*Location: Online with NextCloud&lt;br /&gt;
&lt;br /&gt;
=Presents=&lt;br /&gt;
Members of the board (subscription up to date) that are present (Name of organization and name of contact):&lt;br /&gt;
&lt;br /&gt;
*ATM (Maxime Kohlhaas)&lt;br /&gt;
*DoliCloud (Laurent DESTAILLEUR)&lt;br /&gt;
*Inovea Conseil (Alexandre SPANGARO + Nicolas Zabouri)&lt;br /&gt;
*SCOPEN (Florian HENRY)&lt;br /&gt;
*ATOO NEt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Topics=&lt;br /&gt;
&lt;br /&gt;
==French Certification of Dolibarr system for France by LNE==&lt;br /&gt;
&lt;br /&gt;
Control was done in july. Around 140 points are ok but there is still 1 non-conformity point reported (only for certification, software is ok for attestation). &lt;br /&gt;
Still waiting feedback of LNE about our answer done in end of june on this point. &lt;br /&gt;
&lt;br /&gt;
Note: Problem will not be solved quickly, so users are invited to obtain a &amp;quot;Conformity statement&amp;quot; that can be provided by their integrator or reseller instead of waiting for the public &amp;quot;Certification&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=&amp;gt; Remind sent the 25th of august.&lt;br /&gt;
=&amp;gt; The LNE has contacted us the 11th of september to say they will provide us an answer about our solution.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Action done by Laurent Destailleur (Dolibarr foundation requests)==&lt;br /&gt;
&lt;br /&gt;
*A tool to build a zip, tag the version, update the changelog and publish on dolistore as been developped.&lt;br /&gt;
&lt;br /&gt;
==New preferred partner==&lt;br /&gt;
No new preferred partner requested in July. &lt;br /&gt;
Remind: Prestalidaire was added in June.&lt;br /&gt;
Prestalidaire Switzerland has been accepted as a new Partner (2 entities with 2 different memberships done)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Foundation tools==&lt;br /&gt;
&lt;br /&gt;
*Quotation validation to upgrade our Nextcloud and split server that host the forum&lt;br /&gt;
&lt;br /&gt;
*A new metabase report has been created to better follow Preferred Partner program = &amp;gt; Need to migrate it on a server of the foundation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Replacement of Stripe with Stancer on Dolistore==&lt;br /&gt;
Development and test are finished and OK.&lt;br /&gt;
&lt;br /&gt;
Planned for december 2026.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Donation system==&lt;br /&gt;
Go to test and fix the donation module to accept donation (with vat 0%) and a receipt that must be send automatically by email.&lt;br /&gt;
&lt;br /&gt;
==Help to find founding==&lt;br /&gt;
&lt;br /&gt;
*Dolibarr foundation continue to describe all the tasks of Einvoicing module to obtain the fund of the NLNET organization (NLNET - European NGI organization)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Upgrade of nextcloud==&lt;br /&gt;
Waiting for Florian Charlet intervention =&amp;gt; Done.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Dolibarr forum==&lt;br /&gt;
Move of forum on another server.&lt;br /&gt;
&lt;br /&gt;
Maxime has sent the quote signed to Jean Traullé&lt;br /&gt;
&lt;br /&gt;
TODO: Laurent + Jean: Plan the intervention.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Attorney question==&lt;br /&gt;
Question on refunding or not sells for module with a very high amount need a lawyer advice (rules for dolibarr).&lt;br /&gt;
Our attorney has returned a quote to analyze solutions according to french law (around 3 000 euros).&lt;br /&gt;
&lt;br /&gt;
A meeting was done with the laywer the 7th of september. A document (answer by the lawyer) is expected between end of september and mi october.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==DevCamps organization==&lt;br /&gt;
===Winter DevCamp 2026===&lt;br /&gt;
&lt;br /&gt;
*Date is defined: 26-November-2026 14:00 to 29-November-2026 12:00&lt;br /&gt;
*Location: Hôtel Des Congrès, Place du Commandant Rivière, 69100 Villeurbanne&lt;br /&gt;
*Organized by: OpenDSI&lt;br /&gt;
*Quotation under review by Dolibarr board =&amp;gt; Budget validated without the line for coffe the sunday (the breakfast is enough).&lt;br /&gt;
*First Deposit was already payed&lt;br /&gt;
*TODO Maxime: Communication for subscribing Partner has been set. Subscription for Preferred Partner are open until the 15th of september (limited to 2 people per company). Then it will be open to everybody (no limit for end users).&lt;br /&gt;
&lt;br /&gt;
===Summer DevCamp 2027===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*Lille - Nord ERP CRM is confirmed too.&lt;br /&gt;
&lt;br /&gt;
Date planned are 17th june to 19th of june 2027.&lt;br /&gt;
&lt;br /&gt;
TODO Maxime must sign the proposal. Due to higher prices of hostel, price could be rised to 220 euro HT per person.&lt;br /&gt;
&lt;br /&gt;
===Winter DevCamp 2027===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*Nancy: Inovea wish to be organizer&lt;br /&gt;
&lt;br /&gt;
===Summer DevCamp 2028===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*Nancy: SOLAUV wish to be organizer&lt;br /&gt;
&lt;br /&gt;
===Summer DevCamp 2028===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*BRIOUDE(43100): SOLAUV wish to be organizer&lt;br /&gt;
&lt;br /&gt;
===Winter DevCamp 2028===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*TBD&lt;br /&gt;
&lt;br /&gt;
===Summer DevCamp 2028===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*LACHAPELLE SOUS ROUGEMONT (90360): NSINFO SARL wish to organize&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Community modules==&lt;br /&gt;
The foundation confirm that any modules flagged as &amp;quot;Community module&amp;quot; (so with the guarantee of the foundation on CI rules, management of mainteners, management of common transifex translation account, management of github mainteners), must not be stored any more on external repository.&lt;br /&gt;
&lt;br /&gt;
Rules for management of the community repository has been initiated:&lt;br /&gt;
&lt;br /&gt;
https://wiki.dolibarr.org/index.php/Modules_-_Rules_for_community_modules&lt;br /&gt;
&lt;br /&gt;
===DoliSecu et Stancer===&lt;br /&gt;
The 2 new modules DoliSecu and Stancer validated during previous meeting have been included.&lt;br /&gt;
&lt;br /&gt;
===E-invoicing===&lt;br /&gt;
&lt;br /&gt;
*Actual repository: https://github.com/Dolibarr/dolibarr-community-modules/tree/main/einvoicing&lt;br /&gt;
*Work with Dolibarr Integrator/PDPLibre/Esalink&lt;br /&gt;
*Work with SuperPDP&lt;br /&gt;
&lt;br /&gt;
The release 1.2.0 is available.&lt;br /&gt;
&lt;br /&gt;
For the module einvoicing, the minimal version is confirmed to be v18.0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Next congress / meeting==&lt;br /&gt;
&lt;br /&gt;
===Salon Paris Open Source Experience 2026===&lt;br /&gt;
&lt;br /&gt;
*Location: Paris, Porte de Versailles&lt;br /&gt;
*Date: 9 &amp;amp; 10 December 2026&lt;br /&gt;
&lt;br /&gt;
Laurent has made a request to register the 14th of august. Request was confirmed as received. Waiting answer of the organization.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Salon Solution===&lt;br /&gt;
&lt;br /&gt;
*Location: Paris, Porte de Versailles&lt;br /&gt;
*Date: 14 &amp;amp; 15 Octobre 2026&lt;br /&gt;
**The foundation will participate for 5K€ + 1K€ remain from last year (gold sponsor) - Budget is around 30 000 € (only 6 k€ si provided by the foundation).&lt;br /&gt;
**10 companies will be present (silver sponsor) + 6 other sponsoring companies&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===FOSDEM===&lt;br /&gt;
&lt;br /&gt;
*Application is opened.&lt;br /&gt;
*Laurent must apply&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Salon Swiss IT Forum===&lt;br /&gt;
&lt;br /&gt;
*https://www.swiss-it-forums.tech/fr/&lt;br /&gt;
*Date: 30 September 2026&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: 11h - 21h to 1er October 2026&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: 9h - 17h&lt;br /&gt;
*Location: Palexpo Genève&lt;br /&gt;
**Discuss between partners about this opportunities&lt;/div&gt;</summary>
		<author><name>Eldy</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Report_board_meeting_20260922_teleconf&amp;diff=67392</id>
		<title>Report board meeting 20260922 teleconf</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Report_board_meeting_20260922_teleconf&amp;diff=67392"/>
		<updated>2026-09-22T10:41:06Z</updated>

		<summary type="html">&lt;p&gt;Eldy: /* Next congress / meeting */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{TemplateAssoEn}} {{TemplateAssoFr}}&lt;br /&gt;
&lt;br /&gt;
=Title/Date/Location=&lt;br /&gt;
&lt;br /&gt;
*Title: Foundation board meeting&lt;br /&gt;
*Date: 2026-09-22&lt;br /&gt;
*Location: Online with NextCloud&lt;br /&gt;
&lt;br /&gt;
=Presents=&lt;br /&gt;
Members of the board (subscription up to date) that are present (Name of organization and name of contact):&lt;br /&gt;
&lt;br /&gt;
*ATM (Maxime Kohlhaas)&lt;br /&gt;
*DoliCloud (Laurent DESTAILLEUR)&lt;br /&gt;
*Inovea Conseil (Alexandre SPANGARO + Nicolas Zabouri)&lt;br /&gt;
*SCOPEN (Florian HENRY)&lt;br /&gt;
*ATOO NEt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Topics=&lt;br /&gt;
&lt;br /&gt;
==French Certification of Dolibarr system for France by LNE==&lt;br /&gt;
&lt;br /&gt;
Control was done in july. Around 140 points are ok but there is still 1 non-conformity point reported (only for certification, software is ok for attestation). &lt;br /&gt;
Still waiting feedback of LNE about our answer done in end of june on this point. &lt;br /&gt;
&lt;br /&gt;
Note: Problem will not be solved quickly, so users are invited to obtain a &amp;quot;Conformity statement&amp;quot; that can be provided by their integrator or reseller instead of waiting for the public &amp;quot;Certification&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=&amp;gt; Remind sent the 25th of august.&lt;br /&gt;
=&amp;gt; The LNE has contacted us the 11th of september to say they will provide us an answer about our solution.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Action done by Laurent Destailleur (Dolibarr foundation requests)==&lt;br /&gt;
&lt;br /&gt;
*A tool to build a zip, tag the version, update the changelog and publish on dolistore as been developped.&lt;br /&gt;
&lt;br /&gt;
==New preferred partner==&lt;br /&gt;
No new preferred partner requested in July. &lt;br /&gt;
Remind: Prestalidaire was added in June.&lt;br /&gt;
Prestalidaire Switzerland has been accepted as a new Partner (2 entities with 2 different memberships done)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Foundation tools==&lt;br /&gt;
&lt;br /&gt;
*Quotation validation to upgrade our Nextcloud and split server that host the forum&lt;br /&gt;
&lt;br /&gt;
*A new metabase report has been created to better follow Preferred Partner program = &amp;gt; Need to migrate it on a server of the foundation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Replacement of Stripe with Stancer on Dolistore==&lt;br /&gt;
Development and test are finished and OK.&lt;br /&gt;
&lt;br /&gt;
Planned for december 2026.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Help to find founding==&lt;br /&gt;
&lt;br /&gt;
*Dolibarr foundation continue to describe all the tasks of Einvoicing module to obtain the fund of the NLNET organization (NLNET - European NGI organization)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Upgrade of nextcloud==&lt;br /&gt;
Waiting for Florian Charlet intervention =&amp;gt; Done.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Dolibarr forum==&lt;br /&gt;
Move of forum on another server.&lt;br /&gt;
&lt;br /&gt;
Maxime has sent the quote signed to Jean Traullé&lt;br /&gt;
&lt;br /&gt;
TODO: Laurent + Jean: Plan the intervention.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Attorney question==&lt;br /&gt;
Question on refunding or not sells for module with a very high amount need a lawyer advice (rules for dolibarr).&lt;br /&gt;
Our attorney has returned a quote to analyze solutions according to french law (around 3 000 euros).&lt;br /&gt;
&lt;br /&gt;
A meeting was done with the laywer the 7th of september. A document (answer by the lawyer) is expected between end of september and mi october.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==DevCamps organization==&lt;br /&gt;
===Winter DevCamp 2026===&lt;br /&gt;
&lt;br /&gt;
*Date is defined: 26-November-2026 14:00 to 29-November-2026 12:00&lt;br /&gt;
*Location: Hôtel Des Congrès, Place du Commandant Rivière, 69100 Villeurbanne&lt;br /&gt;
*Organized by: OpenDSI&lt;br /&gt;
*Quotation under review by Dolibarr board =&amp;gt; Budget validated without the line for coffe the sunday (the breakfast is enough).&lt;br /&gt;
*First Deposit was already payed&lt;br /&gt;
*TODO Maxime: Communication for subscribing Partner has been set. Subscription for Preferred Partner are open until the 15th of september (limited to 2 people per company). Then it will be open to everybody (no limit for end users).&lt;br /&gt;
&lt;br /&gt;
===Summer DevCamp 2027===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*Lille - Nord ERP CRM is confirmed too.&lt;br /&gt;
&lt;br /&gt;
Date planned are 17th june to 19th of june 2027.&lt;br /&gt;
&lt;br /&gt;
TODO Maxime must sign the proposal. Due to higher prices of hostel, price could be rised to 220 euro HT per person.&lt;br /&gt;
&lt;br /&gt;
===Winter DevCamp 2027===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*Nancy: Inovea wish to be organizer&lt;br /&gt;
&lt;br /&gt;
===Summer DevCamp 2028===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*Nancy: SOLAUV wish to be organizer&lt;br /&gt;
&lt;br /&gt;
===Summer DevCamp 2028===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*BRIOUDE(43100): SOLAUV wish to be organizer&lt;br /&gt;
&lt;br /&gt;
===Winter DevCamp 2028===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*TBD&lt;br /&gt;
&lt;br /&gt;
===Summer DevCamp 2028===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*LACHAPELLE SOUS ROUGEMONT (90360): NSINFO SARL wish to organize&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Community modules==&lt;br /&gt;
The foundation confirm that any modules flagged as &amp;quot;Community module&amp;quot; (so with the guarantee of the foundation on CI rules, management of mainteners, management of common transifex translation account, management of github mainteners), must not be stored any more on external repository.&lt;br /&gt;
&lt;br /&gt;
Rules for management of the community repository has been initiated:&lt;br /&gt;
&lt;br /&gt;
https://wiki.dolibarr.org/index.php/Modules_-_Rules_for_community_modules&lt;br /&gt;
&lt;br /&gt;
===DoliSecu et Stancer===&lt;br /&gt;
The 2 new modules DoliSecu and Stancer validated during previous meeting have been included.&lt;br /&gt;
&lt;br /&gt;
===E-invoicing===&lt;br /&gt;
&lt;br /&gt;
*Actual repository: https://github.com/Dolibarr/dolibarr-community-modules/tree/main/einvoicing&lt;br /&gt;
*Work with Dolibarr Integrator/PDPLibre/Esalink&lt;br /&gt;
*Work with SuperPDP&lt;br /&gt;
&lt;br /&gt;
The release 1.2.0 is available.&lt;br /&gt;
&lt;br /&gt;
For the module einvoicing, the minimal version is confirmed to be v18.0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Next congress / meeting==&lt;br /&gt;
&lt;br /&gt;
===Salon Paris Open Source Experience 2026===&lt;br /&gt;
&lt;br /&gt;
*Location: Paris, Porte de Versailles&lt;br /&gt;
*Date: 9 &amp;amp; 10 December 2026&lt;br /&gt;
&lt;br /&gt;
Laurent has made a request to register the 14th of august. Request was confirmed as received. Waiting answer of the organization.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Salon Solution===&lt;br /&gt;
&lt;br /&gt;
*Location: Paris, Porte de Versailles&lt;br /&gt;
*Date: 14 &amp;amp; 15 Octobre 2026&lt;br /&gt;
**The foundation will participate for 5K€ + 1K€ remain from last year (gold sponsor) - Budget is around 30 000 € (only 6 k€ si provided by the foundation).&lt;br /&gt;
**10 companies will be present (silver sponsor) + 6 other sponsoring companies&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===FOSDEM===&lt;br /&gt;
&lt;br /&gt;
*Application is opened.&lt;br /&gt;
*Laurent must apply&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Salon Swiss IT Forum===&lt;br /&gt;
&lt;br /&gt;
*https://www.swiss-it-forums.tech/fr/&lt;br /&gt;
*Date: 30 September 2026&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: 11h - 21h to 1er October 2026&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: 9h - 17h&lt;br /&gt;
*Location: Palexpo Genève&lt;br /&gt;
**Discuss between partners about this opportunities&lt;/div&gt;</summary>
		<author><name>Eldy</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Report_board_meeting_20260922_teleconf&amp;diff=67391</id>
		<title>Report board meeting 20260922 teleconf</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Report_board_meeting_20260922_teleconf&amp;diff=67391"/>
		<updated>2026-09-22T10:32:50Z</updated>

		<summary type="html">&lt;p&gt;Eldy: /* Salon Solution */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{TemplateAssoEn}} {{TemplateAssoFr}}&lt;br /&gt;
&lt;br /&gt;
=Title/Date/Location=&lt;br /&gt;
&lt;br /&gt;
*Title: Foundation board meeting&lt;br /&gt;
*Date: 2026-09-22&lt;br /&gt;
*Location: Online with NextCloud&lt;br /&gt;
&lt;br /&gt;
=Presents=&lt;br /&gt;
Members of the board (subscription up to date) that are present (Name of organization and name of contact):&lt;br /&gt;
&lt;br /&gt;
*ATM (Maxime Kohlhaas)&lt;br /&gt;
*DoliCloud (Laurent DESTAILLEUR)&lt;br /&gt;
*Inovea Conseil (Alexandre SPANGARO + Nicolas Zabouri)&lt;br /&gt;
*SCOPEN (Florian HENRY)&lt;br /&gt;
*ATOO NEt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Topics=&lt;br /&gt;
&lt;br /&gt;
==French Certification of Dolibarr system for France by LNE==&lt;br /&gt;
&lt;br /&gt;
Control was done in july. Around 140 points are ok but there is still 1 non-conformity point reported (only for certification, software is ok for attestation). &lt;br /&gt;
Still waiting feedback of LNE about our answer done in end of june on this point. &lt;br /&gt;
&lt;br /&gt;
Note: Problem will not be solved quickly, so users are invited to obtain a &amp;quot;Conformity statement&amp;quot; that can be provided by their integrator or reseller instead of waiting for the public &amp;quot;Certification&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=&amp;gt; Remind sent the 25th of august.&lt;br /&gt;
=&amp;gt; The LNE has contacted us the 11th of september to say they will provide us an answer about our solution.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Action done by Laurent Destailleur (Dolibarr foundation requests)==&lt;br /&gt;
&lt;br /&gt;
*A tool to build a zip, tag the version, update the changelog and publish on dolistore as been developped.&lt;br /&gt;
&lt;br /&gt;
==New preferred partner==&lt;br /&gt;
No new preferred partner requested in July. &lt;br /&gt;
Remind: Prestalidaire was added in June.&lt;br /&gt;
Prestalidaire Switzerland has been accepted as a new Partner (2 entities with 2 different memberships done)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Foundation tools==&lt;br /&gt;
&lt;br /&gt;
*Quotation validation to upgrade our Nextcloud and split server that host the forum&lt;br /&gt;
&lt;br /&gt;
*A new metabase report has been created to better follow Preferred Partner program = &amp;gt; Need to migrate it on a server of the foundation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Replacement of Stripe with Stancer on Dolistore==&lt;br /&gt;
Development and test are finished and OK.&lt;br /&gt;
&lt;br /&gt;
Planned for december 2026.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Help to find founding==&lt;br /&gt;
&lt;br /&gt;
*Dolibarr foundation continue to describe all the tasks of Einvoicing module to obtain the fund of the NLNET organization (NLNET - European NGI organization)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Upgrade of nextcloud==&lt;br /&gt;
Waiting for Florian Charlet intervention =&amp;gt; Done.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Dolibarr forum==&lt;br /&gt;
Move of forum on another server.&lt;br /&gt;
&lt;br /&gt;
Maxime has sent the quote signed to Jean Traullé&lt;br /&gt;
&lt;br /&gt;
TODO: Laurent + Jean: Plan the intervention.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Attorney question==&lt;br /&gt;
Question on refunding or not sells for module with a very high amount need a lawyer advice (rules for dolibarr).&lt;br /&gt;
Our attorney has returned a quote to analyze solutions according to french law (around 3 000 euros).&lt;br /&gt;
&lt;br /&gt;
A meeting was done with the laywer the 7th of september. A document (answer by the lawyer) is expected between end of september and mi october.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==DevCamps organization==&lt;br /&gt;
===Winter DevCamp 2026===&lt;br /&gt;
&lt;br /&gt;
*Date is defined: 26-November-2026 14:00 to 29-November-2026 12:00&lt;br /&gt;
*Location: Hôtel Des Congrès, Place du Commandant Rivière, 69100 Villeurbanne&lt;br /&gt;
*Organized by: OpenDSI&lt;br /&gt;
*Quotation under review by Dolibarr board =&amp;gt; Budget validated without the line for coffe the sunday (the breakfast is enough).&lt;br /&gt;
*First Deposit was already payed&lt;br /&gt;
*TODO Maxime: Communication for subscribing Partner has been set. Subscription for Preferred Partner are open until the 15th of september (limited to 2 people per company). Then it will be open to everybody (no limit for end users).&lt;br /&gt;
&lt;br /&gt;
===Summer DevCamp 2027===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*Lille - Nord ERP CRM is confirmed too.&lt;br /&gt;
&lt;br /&gt;
Date planned are 17th june to 19th of june 2027.&lt;br /&gt;
&lt;br /&gt;
TODO Maxime must sign the proposal. Due to higher prices of hostel, price could be rised to 220 euro HT per person.&lt;br /&gt;
&lt;br /&gt;
===Winter DevCamp 2027===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*Nancy: Inovea wish to be organizer&lt;br /&gt;
&lt;br /&gt;
===Summer DevCamp 2028===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*Nancy: SOLAUV wish to be organizer&lt;br /&gt;
&lt;br /&gt;
===Summer DevCamp 2028===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*BRIOUDE(43100): SOLAUV wish to be organizer&lt;br /&gt;
&lt;br /&gt;
===Winter DevCamp 2028===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*TBD&lt;br /&gt;
&lt;br /&gt;
===Summer DevCamp 2028===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*LACHAPELLE SOUS ROUGEMONT (90360): NSINFO SARL wish to organize&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Community modules==&lt;br /&gt;
The foundation confirm that any modules flagged as &amp;quot;Community module&amp;quot; (so with the guarantee of the foundation on CI rules, management of mainteners, management of common transifex translation account, management of github mainteners), must not be stored any more on external repository.&lt;br /&gt;
&lt;br /&gt;
Rules for management of the community repository has been initiated:&lt;br /&gt;
&lt;br /&gt;
https://wiki.dolibarr.org/index.php/Modules_-_Rules_for_community_modules&lt;br /&gt;
&lt;br /&gt;
===DoliSecu et Stancer===&lt;br /&gt;
The 2 new modules DoliSecu and Stancer validated during previous meeting have been included.&lt;br /&gt;
&lt;br /&gt;
===E-invoicing===&lt;br /&gt;
&lt;br /&gt;
*Actual repository: https://github.com/Dolibarr/dolibarr-community-modules/tree/main/einvoicing&lt;br /&gt;
*Work with Dolibarr Integrator/PDPLibre/Esalink&lt;br /&gt;
*Work with SuperPDP&lt;br /&gt;
&lt;br /&gt;
The release 1.2.0 is available.&lt;br /&gt;
&lt;br /&gt;
For the module einvoicing, the minimal version is confirmed to be v18.0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Next congress / meeting==&lt;br /&gt;
&lt;br /&gt;
===Salon Paris Open Source Experience 2026===&lt;br /&gt;
&lt;br /&gt;
*Location: Paris, Porte de Versailles&lt;br /&gt;
*Date: 9 &amp;amp; 10 December 2026&lt;br /&gt;
&lt;br /&gt;
Laurent has made a request to register the 14th of august. Request was confirmed as received. Waiting answer of the organization.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Salon Solution===&lt;br /&gt;
&lt;br /&gt;
*Location: Paris, Porte de Versailles&lt;br /&gt;
*Date: 14 &amp;amp; 15 Octobre 2026&lt;br /&gt;
**The foundation will participate for 5K€ + 1K€ remain from last year (gold sponsor) - Budget is around 30 000 € (only 6 k€ si provided by the foundation).&lt;br /&gt;
**10 companies will be present (silver sponsor) + 6 other sponsoring companies&lt;br /&gt;
&lt;br /&gt;
===FOSDEM===&lt;br /&gt;
&lt;br /&gt;
*mm&lt;br /&gt;
*kk&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Salon Swiss IT Forum===&lt;br /&gt;
&lt;br /&gt;
*https://www.swiss-it-forums.tech/fr/&lt;br /&gt;
*Date: 30 September 2026&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: 11h - 21h to 1er October 2026&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: 9h - 17h&lt;br /&gt;
*Location: Palexpo Genève&lt;br /&gt;
**Discuss between partners about this opportunities&lt;/div&gt;</summary>
		<author><name>Eldy</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Report_board_meeting_20260922_teleconf&amp;diff=67390</id>
		<title>Report board meeting 20260922 teleconf</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Report_board_meeting_20260922_teleconf&amp;diff=67390"/>
		<updated>2026-09-22T10:32:09Z</updated>

		<summary type="html">&lt;p&gt;Eldy: /* Next congress / meeting */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{TemplateAssoEn}} {{TemplateAssoFr}}&lt;br /&gt;
&lt;br /&gt;
=Title/Date/Location=&lt;br /&gt;
&lt;br /&gt;
*Title: Foundation board meeting&lt;br /&gt;
*Date: 2026-09-22&lt;br /&gt;
*Location: Online with NextCloud&lt;br /&gt;
&lt;br /&gt;
=Presents=&lt;br /&gt;
Members of the board (subscription up to date) that are present (Name of organization and name of contact):&lt;br /&gt;
&lt;br /&gt;
*ATM (Maxime Kohlhaas)&lt;br /&gt;
*DoliCloud (Laurent DESTAILLEUR)&lt;br /&gt;
*Inovea Conseil (Alexandre SPANGARO + Nicolas Zabouri)&lt;br /&gt;
*SCOPEN (Florian HENRY)&lt;br /&gt;
*ATOO NEt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Topics=&lt;br /&gt;
&lt;br /&gt;
==French Certification of Dolibarr system for France by LNE==&lt;br /&gt;
&lt;br /&gt;
Control was done in july. Around 140 points are ok but there is still 1 non-conformity point reported (only for certification, software is ok for attestation). &lt;br /&gt;
Still waiting feedback of LNE about our answer done in end of june on this point. &lt;br /&gt;
&lt;br /&gt;
Note: Problem will not be solved quickly, so users are invited to obtain a &amp;quot;Conformity statement&amp;quot; that can be provided by their integrator or reseller instead of waiting for the public &amp;quot;Certification&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=&amp;gt; Remind sent the 25th of august.&lt;br /&gt;
=&amp;gt; The LNE has contacted us the 11th of september to say they will provide us an answer about our solution.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Action done by Laurent Destailleur (Dolibarr foundation requests)==&lt;br /&gt;
&lt;br /&gt;
*A tool to build a zip, tag the version, update the changelog and publish on dolistore as been developped.&lt;br /&gt;
&lt;br /&gt;
==New preferred partner==&lt;br /&gt;
No new preferred partner requested in July. &lt;br /&gt;
Remind: Prestalidaire was added in June.&lt;br /&gt;
Prestalidaire Switzerland has been accepted as a new Partner (2 entities with 2 different memberships done)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Foundation tools==&lt;br /&gt;
&lt;br /&gt;
*Quotation validation to upgrade our Nextcloud and split server that host the forum&lt;br /&gt;
&lt;br /&gt;
*A new metabase report has been created to better follow Preferred Partner program = &amp;gt; Need to migrate it on a server of the foundation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Replacement of Stripe with Stancer on Dolistore==&lt;br /&gt;
Development and test are finished and OK.&lt;br /&gt;
&lt;br /&gt;
Planned for december 2026.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Help to find founding==&lt;br /&gt;
&lt;br /&gt;
*Dolibarr foundation continue to describe all the tasks of Einvoicing module to obtain the fund of the NLNET organization (NLNET - European NGI organization)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Upgrade of nextcloud==&lt;br /&gt;
Waiting for Florian Charlet intervention =&amp;gt; Done.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Dolibarr forum==&lt;br /&gt;
Move of forum on another server.&lt;br /&gt;
&lt;br /&gt;
Maxime has sent the quote signed to Jean Traullé&lt;br /&gt;
&lt;br /&gt;
TODO: Laurent + Jean: Plan the intervention.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Attorney question==&lt;br /&gt;
Question on refunding or not sells for module with a very high amount need a lawyer advice (rules for dolibarr).&lt;br /&gt;
Our attorney has returned a quote to analyze solutions according to french law (around 3 000 euros).&lt;br /&gt;
&lt;br /&gt;
A meeting was done with the laywer the 7th of september. A document (answer by the lawyer) is expected between end of september and mi october.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==DevCamps organization==&lt;br /&gt;
===Winter DevCamp 2026===&lt;br /&gt;
&lt;br /&gt;
*Date is defined: 26-November-2026 14:00 to 29-November-2026 12:00&lt;br /&gt;
*Location: Hôtel Des Congrès, Place du Commandant Rivière, 69100 Villeurbanne&lt;br /&gt;
*Organized by: OpenDSI&lt;br /&gt;
*Quotation under review by Dolibarr board =&amp;gt; Budget validated without the line for coffe the sunday (the breakfast is enough).&lt;br /&gt;
*First Deposit was already payed&lt;br /&gt;
*TODO Maxime: Communication for subscribing Partner has been set. Subscription for Preferred Partner are open until the 15th of september (limited to 2 people per company). Then it will be open to everybody (no limit for end users).&lt;br /&gt;
&lt;br /&gt;
===Summer DevCamp 2027===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*Lille - Nord ERP CRM is confirmed too.&lt;br /&gt;
&lt;br /&gt;
Date planned are 17th june to 19th of june 2027.&lt;br /&gt;
&lt;br /&gt;
TODO Maxime must sign the proposal. Due to higher prices of hostel, price could be rised to 220 euro HT per person.&lt;br /&gt;
&lt;br /&gt;
===Winter DevCamp 2027===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*Nancy: Inovea wish to be organizer&lt;br /&gt;
&lt;br /&gt;
===Summer DevCamp 2028===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*Nancy: SOLAUV wish to be organizer&lt;br /&gt;
&lt;br /&gt;
===Summer DevCamp 2028===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*BRIOUDE(43100): SOLAUV wish to be organizer&lt;br /&gt;
&lt;br /&gt;
===Winter DevCamp 2028===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*TBD&lt;br /&gt;
&lt;br /&gt;
===Summer DevCamp 2028===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*LACHAPELLE SOUS ROUGEMONT (90360): NSINFO SARL wish to organize&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Community modules==&lt;br /&gt;
The foundation confirm that any modules flagged as &amp;quot;Community module&amp;quot; (so with the guarantee of the foundation on CI rules, management of mainteners, management of common transifex translation account, management of github mainteners), must not be stored any more on external repository.&lt;br /&gt;
&lt;br /&gt;
Rules for management of the community repository has been initiated:&lt;br /&gt;
&lt;br /&gt;
https://wiki.dolibarr.org/index.php/Modules_-_Rules_for_community_modules&lt;br /&gt;
&lt;br /&gt;
===DoliSecu et Stancer===&lt;br /&gt;
The 2 new modules DoliSecu and Stancer validated during previous meeting have been included.&lt;br /&gt;
&lt;br /&gt;
===E-invoicing===&lt;br /&gt;
&lt;br /&gt;
*Actual repository: https://github.com/Dolibarr/dolibarr-community-modules/tree/main/einvoicing&lt;br /&gt;
*Work with Dolibarr Integrator/PDPLibre/Esalink&lt;br /&gt;
*Work with SuperPDP&lt;br /&gt;
&lt;br /&gt;
The release 1.2.0 is available.&lt;br /&gt;
&lt;br /&gt;
For the module einvoicing, the minimal version is confirmed to be v18.0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Next congress / meeting==&lt;br /&gt;
&lt;br /&gt;
===Salon Paris Open Source Experience 2026===&lt;br /&gt;
&lt;br /&gt;
*Location: Paris, Porte de Versailles&lt;br /&gt;
*Date: 9 &amp;amp; 10 December 2026&lt;br /&gt;
&lt;br /&gt;
Laurent has made a request to register the 14th of august. Request was confirmed as received. Waiting answer of the organization.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Salon Solution===&lt;br /&gt;
&lt;br /&gt;
*Location: Paris, Porte de Versailles&lt;br /&gt;
*Date: 14 &amp;amp; 15 Octobre 2026&lt;br /&gt;
**The foundation will participate for 5K€ + 1K€ remain from last year (gold sponsor)&lt;br /&gt;
**10 companies will be present (silver sponsor) + 6 other sponsoring companies&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===FOSDEM===&lt;br /&gt;
&lt;br /&gt;
*mm&lt;br /&gt;
*kk&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Salon Swiss IT Forum===&lt;br /&gt;
&lt;br /&gt;
*https://www.swiss-it-forums.tech/fr/&lt;br /&gt;
*Date: 30 September 2026&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: 11h - 21h to 1er October 2026&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: 9h - 17h&lt;br /&gt;
*Location: Palexpo Genève&lt;br /&gt;
**Discuss between partners about this opportunities&lt;/div&gt;</summary>
		<author><name>Eldy</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Report_board_meeting_20260922_teleconf&amp;diff=67389</id>
		<title>Report board meeting 20260922 teleconf</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Report_board_meeting_20260922_teleconf&amp;diff=67389"/>
		<updated>2026-09-22T10:21:35Z</updated>

		<summary type="html">&lt;p&gt;Eldy: /* Action done by Laurent Destailleur (Dolibarr foundation requests) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{TemplateAssoEn}} {{TemplateAssoFr}}&lt;br /&gt;
&lt;br /&gt;
=Title/Date/Location=&lt;br /&gt;
&lt;br /&gt;
*Title: Foundation board meeting&lt;br /&gt;
*Date: 2026-09-22&lt;br /&gt;
*Location: Online with NextCloud&lt;br /&gt;
&lt;br /&gt;
=Presents=&lt;br /&gt;
Members of the board (subscription up to date) that are present (Name of organization and name of contact):&lt;br /&gt;
&lt;br /&gt;
*ATM (Maxime Kohlhaas)&lt;br /&gt;
*DoliCloud (Laurent DESTAILLEUR)&lt;br /&gt;
*Inovea Conseil (Alexandre SPANGARO + Nicolas Zabouri)&lt;br /&gt;
*SCOPEN (Florian HENRY)&lt;br /&gt;
*ATOO NEt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Topics=&lt;br /&gt;
&lt;br /&gt;
==French Certification of Dolibarr system for France by LNE==&lt;br /&gt;
&lt;br /&gt;
Control was done in july. Around 140 points are ok but there is still 1 non-conformity point reported (only for certification, software is ok for attestation). &lt;br /&gt;
Still waiting feedback of LNE about our answer done in end of june on this point. &lt;br /&gt;
&lt;br /&gt;
Note: Problem will not be solved quickly, so users are invited to obtain a &amp;quot;Conformity statement&amp;quot; that can be provided by their integrator or reseller instead of waiting for the public &amp;quot;Certification&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=&amp;gt; Remind sent the 25th of august.&lt;br /&gt;
=&amp;gt; The LNE has contacted us the 11th of september to say they will provide us an answer about our solution.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Action done by Laurent Destailleur (Dolibarr foundation requests)==&lt;br /&gt;
&lt;br /&gt;
*A tool to build a zip, tag the version, update the changelog and publish on dolistore as been developped.&lt;br /&gt;
&lt;br /&gt;
==New preferred partner==&lt;br /&gt;
No new preferred partner requested in July. &lt;br /&gt;
Remind: Prestalidaire was added in June.&lt;br /&gt;
Prestalidaire Switzerland has been accepted as a new Partner (2 entities with 2 different memberships done)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Foundation tools==&lt;br /&gt;
&lt;br /&gt;
*Quotation validation to upgrade our Nextcloud and split server that host the forum&lt;br /&gt;
&lt;br /&gt;
*A new metabase report has been created to better follow Preferred Partner program = &amp;gt; Need to migrate it on a server of the foundation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Replacement of Stripe with Stancer on Dolistore==&lt;br /&gt;
Development and test are finished and OK.&lt;br /&gt;
&lt;br /&gt;
Planned for december 2026.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Help to find founding==&lt;br /&gt;
&lt;br /&gt;
*Dolibarr foundation continue to describe all the tasks of Einvoicing module to obtain the fund of the NLNET organization (NLNET - European NGI organization)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Upgrade of nextcloud==&lt;br /&gt;
Waiting for Florian Charlet intervention =&amp;gt; Done.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Dolibarr forum==&lt;br /&gt;
Move of forum on another server.&lt;br /&gt;
&lt;br /&gt;
Maxime has sent the quote signed to Jean Traullé&lt;br /&gt;
&lt;br /&gt;
TODO: Laurent + Jean: Plan the intervention.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Attorney question==&lt;br /&gt;
Question on refunding or not sells for module with a very high amount need a lawyer advice (rules for dolibarr).&lt;br /&gt;
Our attorney has returned a quote to analyze solutions according to french law (around 3 000 euros).&lt;br /&gt;
&lt;br /&gt;
A meeting was done with the laywer the 7th of september. A document (answer by the lawyer) is expected between end of september and mi october.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==DevCamps organization==&lt;br /&gt;
===Winter DevCamp 2026===&lt;br /&gt;
&lt;br /&gt;
*Date is defined: 26-November-2026 14:00 to 29-November-2026 12:00&lt;br /&gt;
*Location: Hôtel Des Congrès, Place du Commandant Rivière, 69100 Villeurbanne&lt;br /&gt;
*Organized by: OpenDSI&lt;br /&gt;
*Quotation under review by Dolibarr board =&amp;gt; Budget validated without the line for coffe the sunday (the breakfast is enough).&lt;br /&gt;
*First Deposit was already payed&lt;br /&gt;
*TODO Maxime: Communication for subscribing Partner has been set. Subscription for Preferred Partner are open until the 15th of september (limited to 2 people per company). Then it will be open to everybody (no limit for end users).&lt;br /&gt;
&lt;br /&gt;
===Summer DevCamp 2027===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*Lille - Nord ERP CRM is confirmed too.&lt;br /&gt;
&lt;br /&gt;
Date planned are 17th june to 19th of june 2027.&lt;br /&gt;
&lt;br /&gt;
TODO Maxime must sign the proposal. Due to higher prices of hostel, price could be rised to 220 euro HT per person.&lt;br /&gt;
&lt;br /&gt;
===Winter DevCamp 2027===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*Nancy: Inovea wish to be organizer&lt;br /&gt;
&lt;br /&gt;
===Summer DevCamp 2028===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*Nancy: SOLAUV wish to be organizer&lt;br /&gt;
&lt;br /&gt;
===Summer DevCamp 2028===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*BRIOUDE(43100): SOLAUV wish to be organizer&lt;br /&gt;
&lt;br /&gt;
===Winter DevCamp 2028===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*TBD&lt;br /&gt;
&lt;br /&gt;
===Summer DevCamp 2028===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*LACHAPELLE SOUS ROUGEMONT (90360): NSINFO SARL wish to organize&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Community modules==&lt;br /&gt;
The foundation confirm that any modules flagged as &amp;quot;Community module&amp;quot; (so with the guarantee of the foundation on CI rules, management of mainteners, management of common transifex translation account, management of github mainteners), must not be stored any more on external repository.&lt;br /&gt;
&lt;br /&gt;
Rules for management of the community repository has been initiated:&lt;br /&gt;
&lt;br /&gt;
https://wiki.dolibarr.org/index.php/Modules_-_Rules_for_community_modules&lt;br /&gt;
&lt;br /&gt;
===DoliSecu et Stancer===&lt;br /&gt;
The 2 new modules DoliSecu and Stancer validated during previous meeting have been included.&lt;br /&gt;
&lt;br /&gt;
===E-invoicing===&lt;br /&gt;
&lt;br /&gt;
*Actual repository: https://github.com/Dolibarr/dolibarr-community-modules/tree/main/einvoicing&lt;br /&gt;
*Work with Dolibarr Integrator/PDPLibre/Esalink&lt;br /&gt;
*Work with SuperPDP&lt;br /&gt;
&lt;br /&gt;
The release 1.2.0 is available.&lt;br /&gt;
&lt;br /&gt;
For the module einvoicing, the minimal version is confirmed to be v18.0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Next congress / meeting==&lt;br /&gt;
===Salon Solution===&lt;br /&gt;
&lt;br /&gt;
*Location: Paris, Porte de Versailles&lt;br /&gt;
*Date: 14 &amp;amp; 15 Octobre 2026&lt;br /&gt;
**Informal group will have a meeting the 13/03/2026 to discuss the budget required from the foundation (estimated target budget 5K€ + 1K€ remain from last year)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Salon Paris Open Source Experience 2026===&lt;br /&gt;
&lt;br /&gt;
*Location: Paris, Porte de Versailles&lt;br /&gt;
*Date: 9 &amp;amp; 10 December 2026&lt;br /&gt;
&lt;br /&gt;
Laurent has made a request to register the 14th of august. Request was confirmed as received. Waiting answer of the organization.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Salon Swiss IT Forum===&lt;br /&gt;
&lt;br /&gt;
*https://www.swiss-it-forums.tech/fr/&lt;br /&gt;
*Date: 30 September 2026&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: 11h - 21h to 1er October 2026&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: 9h - 17h&lt;br /&gt;
*Location: Palexpo Genève&lt;br /&gt;
**Discuss between partners about this opportunities&lt;/div&gt;</summary>
		<author><name>Eldy</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Report_board_meeting_20260922_teleconf&amp;diff=67388</id>
		<title>Report board meeting 20260922 teleconf</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Report_board_meeting_20260922_teleconf&amp;diff=67388"/>
		<updated>2026-09-22T10:21:16Z</updated>

		<summary type="html">&lt;p&gt;Eldy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{TemplateAssoEn}} {{TemplateAssoFr}}&lt;br /&gt;
&lt;br /&gt;
=Title/Date/Location=&lt;br /&gt;
&lt;br /&gt;
*Title: Foundation board meeting&lt;br /&gt;
*Date: 2026-09-22&lt;br /&gt;
*Location: Online with NextCloud&lt;br /&gt;
&lt;br /&gt;
=Presents=&lt;br /&gt;
Members of the board (subscription up to date) that are present (Name of organization and name of contact):&lt;br /&gt;
&lt;br /&gt;
*ATM (Maxime Kohlhaas)&lt;br /&gt;
*DoliCloud (Laurent DESTAILLEUR)&lt;br /&gt;
*Inovea Conseil (Alexandre SPANGARO + Nicolas Zabouri)&lt;br /&gt;
*SCOPEN (Florian HENRY)&lt;br /&gt;
*ATOO NEt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Topics=&lt;br /&gt;
&lt;br /&gt;
==French Certification of Dolibarr system for France by LNE==&lt;br /&gt;
&lt;br /&gt;
Control was done in july. Around 140 points are ok but there is still 1 non-conformity point reported (only for certification, software is ok for attestation). &lt;br /&gt;
Still waiting feedback of LNE about our answer done in end of june on this point. &lt;br /&gt;
&lt;br /&gt;
Note: Problem will not be solved quickly, so users are invited to obtain a &amp;quot;Conformity statement&amp;quot; that can be provided by their integrator or reseller instead of waiting for the public &amp;quot;Certification&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=&amp;gt; Remind sent the 25th of august.&lt;br /&gt;
=&amp;gt; The LNE has contacted us the 11th of september to say they will provide us an answer about our solution.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Action done by Laurent Destailleur (Dolibarr foundation requests)==&lt;br /&gt;
&lt;br /&gt;
*A tool to build a zip, tag the version, update the changelog and publish on dolistoreas been developped.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==New preferred partner==&lt;br /&gt;
No new preferred partner requested in July. &lt;br /&gt;
Remind: Prestalidaire was added in June.&lt;br /&gt;
Prestalidaire Switzerland has been accepted as a new Partner (2 entities with 2 different memberships done)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Foundation tools==&lt;br /&gt;
&lt;br /&gt;
*Quotation validation to upgrade our Nextcloud and split server that host the forum&lt;br /&gt;
&lt;br /&gt;
*A new metabase report has been created to better follow Preferred Partner program = &amp;gt; Need to migrate it on a server of the foundation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Replacement of Stripe with Stancer on Dolistore==&lt;br /&gt;
Development and test are finished and OK.&lt;br /&gt;
&lt;br /&gt;
Planned for december 2026.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Help to find founding==&lt;br /&gt;
&lt;br /&gt;
*Dolibarr foundation continue to describe all the tasks of Einvoicing module to obtain the fund of the NLNET organization (NLNET - European NGI organization)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Upgrade of nextcloud==&lt;br /&gt;
Waiting for Florian Charlet intervention =&amp;gt; Done.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Dolibarr forum==&lt;br /&gt;
Move of forum on another server.&lt;br /&gt;
&lt;br /&gt;
Maxime has sent the quote signed to Jean Traullé&lt;br /&gt;
&lt;br /&gt;
TODO: Laurent + Jean: Plan the intervention.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Attorney question==&lt;br /&gt;
Question on refunding or not sells for module with a very high amount need a lawyer advice (rules for dolibarr).&lt;br /&gt;
Our attorney has returned a quote to analyze solutions according to french law (around 3 000 euros).&lt;br /&gt;
&lt;br /&gt;
A meeting was done with the laywer the 7th of september. A document (answer by the lawyer) is expected between end of september and mi october.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==DevCamps organization==&lt;br /&gt;
===Winter DevCamp 2026===&lt;br /&gt;
&lt;br /&gt;
*Date is defined: 26-November-2026 14:00 to 29-November-2026 12:00&lt;br /&gt;
*Location: Hôtel Des Congrès, Place du Commandant Rivière, 69100 Villeurbanne&lt;br /&gt;
*Organized by: OpenDSI&lt;br /&gt;
*Quotation under review by Dolibarr board =&amp;gt; Budget validated without the line for coffe the sunday (the breakfast is enough).&lt;br /&gt;
*First Deposit was already payed&lt;br /&gt;
*TODO Maxime: Communication for subscribing Partner has been set. Subscription for Preferred Partner are open until the 15th of september (limited to 2 people per company). Then it will be open to everybody (no limit for end users).&lt;br /&gt;
&lt;br /&gt;
===Summer DevCamp 2027===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*Lille - Nord ERP CRM is confirmed too.&lt;br /&gt;
&lt;br /&gt;
Date planned are 17th june to 19th of june 2027.&lt;br /&gt;
&lt;br /&gt;
TODO Maxime must sign the proposal. Due to higher prices of hostel, price could be rised to 220 euro HT per person.&lt;br /&gt;
&lt;br /&gt;
===Winter DevCamp 2027===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*Nancy: Inovea wish to be organizer&lt;br /&gt;
&lt;br /&gt;
===Summer DevCamp 2028===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*Nancy: SOLAUV wish to be organizer&lt;br /&gt;
&lt;br /&gt;
===Summer DevCamp 2028===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*BRIOUDE(43100): SOLAUV wish to be organizer&lt;br /&gt;
&lt;br /&gt;
===Winter DevCamp 2028===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*TBD&lt;br /&gt;
&lt;br /&gt;
===Summer DevCamp 2028===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*LACHAPELLE SOUS ROUGEMONT (90360): NSINFO SARL wish to organize&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Community modules==&lt;br /&gt;
The foundation confirm that any modules flagged as &amp;quot;Community module&amp;quot; (so with the guarantee of the foundation on CI rules, management of mainteners, management of common transifex translation account, management of github mainteners), must not be stored any more on external repository.&lt;br /&gt;
&lt;br /&gt;
Rules for management of the community repository has been initiated:&lt;br /&gt;
&lt;br /&gt;
https://wiki.dolibarr.org/index.php/Modules_-_Rules_for_community_modules&lt;br /&gt;
&lt;br /&gt;
===DoliSecu et Stancer===&lt;br /&gt;
The 2 new modules DoliSecu and Stancer validated during previous meeting have been included.&lt;br /&gt;
&lt;br /&gt;
===E-invoicing===&lt;br /&gt;
&lt;br /&gt;
*Actual repository: https://github.com/Dolibarr/dolibarr-community-modules/tree/main/einvoicing&lt;br /&gt;
*Work with Dolibarr Integrator/PDPLibre/Esalink&lt;br /&gt;
*Work with SuperPDP&lt;br /&gt;
&lt;br /&gt;
The release 1.2.0 is available.&lt;br /&gt;
&lt;br /&gt;
For the module einvoicing, the minimal version is confirmed to be v18.0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Next congress / meeting==&lt;br /&gt;
===Salon Solution===&lt;br /&gt;
&lt;br /&gt;
*Location: Paris, Porte de Versailles&lt;br /&gt;
*Date: 14 &amp;amp; 15 Octobre 2026&lt;br /&gt;
**Informal group will have a meeting the 13/03/2026 to discuss the budget required from the foundation (estimated target budget 5K€ + 1K€ remain from last year)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Salon Paris Open Source Experience 2026===&lt;br /&gt;
&lt;br /&gt;
*Location: Paris, Porte de Versailles&lt;br /&gt;
*Date: 9 &amp;amp; 10 December 2026&lt;br /&gt;
&lt;br /&gt;
Laurent has made a request to register the 14th of august. Request was confirmed as received. Waiting answer of the organization.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Salon Swiss IT Forum===&lt;br /&gt;
&lt;br /&gt;
*https://www.swiss-it-forums.tech/fr/&lt;br /&gt;
*Date: 30 September 2026&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: 11h - 21h to 1er October 2026&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: 9h - 17h&lt;br /&gt;
*Location: Palexpo Genève&lt;br /&gt;
**Discuss between partners about this opportunities&lt;/div&gt;</summary>
		<author><name>Eldy</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Report_board_meeting_20260922_teleconf&amp;diff=67387</id>
		<title>Report board meeting 20260922 teleconf</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Report_board_meeting_20260922_teleconf&amp;diff=67387"/>
		<updated>2026-09-22T10:20:15Z</updated>

		<summary type="html">&lt;p&gt;Eldy: Created page with &amp;quot; {{TemplateAssoEn}} {{TemplateAssoFr}}  =Title/Date/Location=  *Title: Foundation board meeting *Date: 2026-09-22 *Location: Online with NextCloud  =Presents= Members of the b...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{TemplateAssoEn}} {{TemplateAssoFr}}&lt;br /&gt;
&lt;br /&gt;
=Title/Date/Location=&lt;br /&gt;
&lt;br /&gt;
*Title: Foundation board meeting&lt;br /&gt;
*Date: 2026-09-22&lt;br /&gt;
*Location: Online with NextCloud&lt;br /&gt;
&lt;br /&gt;
=Presents=&lt;br /&gt;
Members of the board (subscription up to date) that are present (Name of organization and name of contact):&lt;br /&gt;
&lt;br /&gt;
*ATM (Maxime Kohlhaas)&lt;br /&gt;
*DoliCloud (Laurent DESTAILLEUR)&lt;br /&gt;
*Inovea Conseil (Alexandre SPANGARO + Nicolas Zabouri)&lt;br /&gt;
*SCOPEN (Florian HENRY)&lt;br /&gt;
*ATOO NEt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Topics=&lt;br /&gt;
&lt;br /&gt;
==French Certification of Dolibarr system for France by LNE==&lt;br /&gt;
&lt;br /&gt;
Control was done in july. Around 140 points are ok but there is still 1 non-conformity point reported (only for certification, software is ok for attestation). &lt;br /&gt;
Still waiting feedback of LNE about our answer done in end of june on this point. &lt;br /&gt;
&lt;br /&gt;
Note: Problem will not be solved quickly, so users are invited to obtain a &amp;quot;Conformity statement&amp;quot; that can be provided by their integrator or reseller instead of waiting for the public &amp;quot;Certification&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=&amp;gt; Remind sent the 25th of august.&lt;br /&gt;
=&amp;gt; The LNE has contacted us the 11th of september to say they will provide us an answer about our solution.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Action done by Laurent Destailleur (Dolibarr foundation requests)==&lt;br /&gt;
&lt;br /&gt;
*A tool to build a zip, tag the version, update the changelog and publish on dolistoreas been developped.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==New preferred partner==&lt;br /&gt;
No new preferred partner requested in July. &lt;br /&gt;
Remind: Prestalidaire was added in June.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Foundation tools==&lt;br /&gt;
&lt;br /&gt;
*Quotation validation to upgrade our Nextcloud and split server that host the forum&lt;br /&gt;
&lt;br /&gt;
*A new metabase report has been created to better follow Preferred Partner program = &amp;gt; Need to migrate it on a server of the foundation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Replacement of Stripe with Stancer on Dolistore==&lt;br /&gt;
Development and test are finished and OK.&lt;br /&gt;
&lt;br /&gt;
Planned for december 2026.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Help to find founding==&lt;br /&gt;
&lt;br /&gt;
*Dolibarr foundation continue to describe all the tasks of Einvoicing module to obtain the fund of the NLNET organization (NLNET - European NGI organization)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Upgrade of nextcloud==&lt;br /&gt;
Waiting for Florian Charlet intervention =&amp;gt; Done.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Dolibarr forum==&lt;br /&gt;
Move of forum on another server.&lt;br /&gt;
&lt;br /&gt;
Maxime has sent the quote signed to Jean Traullé&lt;br /&gt;
&lt;br /&gt;
TODO: Laurent + Jean: Plan the intervention.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Attorney question==&lt;br /&gt;
Question on refunding or not sells for module with a very high amount need a lawyer advice (rules for dolibarr).&lt;br /&gt;
Our attorney has returned a quote to analyze solutions according to french law (around 3 000 euros).&lt;br /&gt;
&lt;br /&gt;
A meeting was done with the laywer the 7th of september. A document (answer by the lawyer) is expected between end of september and mi october.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==DevCamps organization==&lt;br /&gt;
===Winter DevCamp 2026===&lt;br /&gt;
&lt;br /&gt;
*Date is defined: 26-November-2026 14:00 to 29-November-2026 12:00&lt;br /&gt;
*Location: Hôtel Des Congrès, Place du Commandant Rivière, 69100 Villeurbanne&lt;br /&gt;
*Organized by: OpenDSI&lt;br /&gt;
*Quotation under review by Dolibarr board =&amp;gt; Budget validated without the line for coffe the sunday (the breakfast is enough).&lt;br /&gt;
*First Deposit was already payed&lt;br /&gt;
*TODO Maxime: Communication for subscribing Partner has been set. Subscription for Preferred Partner are open until the 15th of september (limited to 2 people per company). Then it will be open to everybody (no limit for end users).&lt;br /&gt;
&lt;br /&gt;
===Summer DevCamp 2027===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*Lille - Nord ERP CRM is confirmed too.&lt;br /&gt;
&lt;br /&gt;
Date planned are 17th june to 19th of june 2027.&lt;br /&gt;
&lt;br /&gt;
TODO Maxime must sign the proposal. Due to higher prices of hostel, price could be rised to 220 euro HT per person.&lt;br /&gt;
&lt;br /&gt;
===Winter DevCamp 2027===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*Nancy: Inovea wish to be organizer&lt;br /&gt;
&lt;br /&gt;
===Summer DevCamp 2028===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*Nancy: SOLAUV wish to be organizer&lt;br /&gt;
&lt;br /&gt;
===Summer DevCamp 2028===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*BRIOUDE(43100): SOLAUV wish to be organizer&lt;br /&gt;
&lt;br /&gt;
===Winter DevCamp 2028===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*TBD&lt;br /&gt;
&lt;br /&gt;
===Summer DevCamp 2028===&lt;br /&gt;
&lt;br /&gt;
*Date: TBD&lt;br /&gt;
*LACHAPELLE SOUS ROUGEMONT (90360): NSINFO SARL wish to organize&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Community modules==&lt;br /&gt;
The foundation confirm that any modules flagged as &amp;quot;Community module&amp;quot; (so with the guarantee of the foundation on CI rules, management of mainteners, management of common transifex translation account, management of github mainteners), must not be stored any more on external repository.&lt;br /&gt;
&lt;br /&gt;
Rules for management of the community repository has been initiated:&lt;br /&gt;
&lt;br /&gt;
https://wiki.dolibarr.org/index.php/Modules_-_Rules_for_community_modules&lt;br /&gt;
&lt;br /&gt;
===DoliSecu et Stancer===&lt;br /&gt;
The 2 new modules DoliSecu and Stancer validated during previous meeting have been included.&lt;br /&gt;
&lt;br /&gt;
===E-invoicing===&lt;br /&gt;
&lt;br /&gt;
*Actual repository: https://github.com/Dolibarr/dolibarr-community-modules/tree/main/einvoicing&lt;br /&gt;
*Work with Dolibarr Integrator/PDPLibre/Esalink&lt;br /&gt;
*Work with SuperPDP&lt;br /&gt;
&lt;br /&gt;
The release 1.2.0 is available.&lt;br /&gt;
&lt;br /&gt;
For the module einvoicing, the minimal version is confirmed to be v18.0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Next congress / meeting==&lt;br /&gt;
===Salon Solution===&lt;br /&gt;
&lt;br /&gt;
*Location: Paris, Porte de Versailles&lt;br /&gt;
*Date: 14 &amp;amp; 15 Octobre 2026&lt;br /&gt;
**Informal group will have a meeting the 13/03/2026 to discuss the budget required from the foundation (estimated target budget 5K€ + 1K€ remain from last year)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Salon Paris Open Source Experience 2026===&lt;br /&gt;
&lt;br /&gt;
*Location: Paris, Porte de Versailles&lt;br /&gt;
*Date: 9 &amp;amp; 10 December 2026&lt;br /&gt;
&lt;br /&gt;
Laurent has made a request to register the 14th of august. Request was confirmed as received. Waiting answer of the organization.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Salon Swiss IT Forum===&lt;br /&gt;
&lt;br /&gt;
*https://www.swiss-it-forums.tech/fr/&lt;br /&gt;
*Date: 30 September 2026&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: 11h - 21h to 1er October 2026&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;: 9h - 17h&lt;br /&gt;
*Location: Palexpo Genève&lt;br /&gt;
**Discuss between partners about this opportunities&lt;/div&gt;</summary>
		<author><name>Eldy</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Langages_et_normes&amp;diff=67372</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=67372"/>
		<updated>2026-09-20T16:34:20Z</updated>

		<summary type="html">&lt;p&gt;Eldy: /* Les dates et TimeZone */&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;
[[de:Sprachen_und_Programmierregeln]]&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;
{{TemplateDocDevFr}}&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). Voir la page [[Versions|Liste des versions, journal des modifications et compatibilités]] pour les prérequis des versions plus anciennes.&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;syntaxhighlight 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;/syntaxhighlight&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 $_COOKIE, $_SERVER, $_ENV. Mais pour récupérer les contenus de $_GET ou $_POST, il faut passer par les fonctions dolibarr  [[Fonctions utiles Dolibarr|GETPOST...()]] .&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;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$var1 = 1; $var2 = 1; $var3 = 1;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
plutôt que&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$var1 = $var2 = $var3 = 1;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
qui est moins performant.&lt;br /&gt;
&lt;br /&gt;
*Les chaines doivent avoir les variables sorties de la chaine.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
print &amp;quot;Mon texte affiche ma &amp;quot;.$variable.&amp;quot; !\n&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Les fonctions doivent retourner une valeur 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; ou &amp;quot;require_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-12 (https://www.php-fig.org/psr/psr-12/). Seules les règles &amp;quot;MUST&amp;quot; sont imposées. Notez aussi les points/exceptions suivants:&lt;br /&gt;
**La longueur des lignes: PSR-12 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 intéressante ou utile, 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 delà 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 copier-coller).&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/setup/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 pouvez utiliser le fichier &#039;&#039;&#039;dev/setup/eclipse/PSR-12 [built-in].xml&#039;&#039;&#039; comme fichier de règles de syntax pour configurer Eclipse.&lt;br /&gt;
**Note 4: 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 et nom 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      varchar(32)                 qui contiendra le code d&#039;import YYYYMMDDHHMMSS si vous faites des imports en masse dans la table.&lt;br /&gt;
 - status          smallint                    pour stocker le status d&#039;un object&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;être compatible avec toutes les précisions des pays, syntaxes des bases, on utilisera uniquement les types suivants:&lt;br /&gt;
 - integer pour tout nombre entier, id ou clé étrangère (bigint éventuellement accepté pour les id des très grosses tables)&lt;br /&gt;
 - smallint pour tout numérique entier de petite taille (comme pour stocker un code de status)&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 chaîne (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 et ces processus ne doivent pas dépendre de la présence d&#039;un module externe. Il vous faut donc assurer l&#039;intégrité de manière applicative si nécessaire.&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;syntaxhighlight 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;/syntaxhighlight&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;syntaxhighlight 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;/syntaxhighlight&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;syntaxhighlight 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;/syntaxhighlight&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;syntaxhighlight 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;/syntaxhighlight&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;syntaxhighlight 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;/syntaxhighlight&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 SQL de date NOW, SYSDATE, DATEDIFF, DATE 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 pour les raisons suivantes:&lt;br /&gt;
**afin d&#039;avoir une meilleure portabilité du code&lt;br /&gt;
**avoir une gestion correcte des TimeZone et ne pas dépendre du TimeZone de la base de donnée (le timezone de réference est le timezone de PHP et le timezone de la base de données peut être différent de celui-ci, aussi les conversions de date doivent se faire toute côté PHP).&lt;br /&gt;
**meilleurs performances (voir exemples et commentaire plus loin)&lt;br /&gt;
&lt;br /&gt;
Par exemple, on ne fera pas:&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
mais:&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Par exemple, on ne fera pas:&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
mais:&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&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;
*L&#039;instruction WITH ROLLUP est interdite :&lt;br /&gt;
&lt;br /&gt;
Cette instruction ne doit pas être utilisée : Elle n&#039;est pas gérée de la même manière par des bases de données différentes.&lt;br /&gt;
De plus, l&#039;utilisation de WITH ROLLUP brise la pureté des données retournées. L&#039;agrégation intermédiaire de génération de sous-totaux réalisée par cette instruction peut facilement être effectuée à l&#039;aide de PHP et permet de conserver le tableau de données retourné propre (non corrompu par des données insérées artificiellement).&lt;br /&gt;
Outres son côté pas bien standardisé, en insérant des résultats de calculs au sein des données, donnant un résultat qui est un mixe donnée et calculs métiers d&#039;aggrégation, la compréhension du code se trouve compliqué et même les évolutions du code sur ces agrégations plus possibles lorsque se complexifient.&lt;br /&gt;
&lt;br /&gt;
*Utilisez $db-&amp;gt;ifsql pour le IF SQL&lt;br /&gt;
&lt;br /&gt;
N&#039;incluez pas le IF dans votre requête SQL générée. Mais utilisez plutôt la méthode $db-&amp;gt;ifsql() pour créer un SQL IF compatible avec toutes les bases de données SQL.&lt;br /&gt;
&lt;br /&gt;
*Pas de DELETE CASCADE et ON UPDATE CASCADE&lt;br /&gt;
&lt;br /&gt;
De telles instructions SQL sont interdites car elles contournent les règles métiers de l&#039;application. Par exemple, s&#039;il existe une cascade de suppression entre la table A et B, lorsque l&#039;application exécutera le code pour supprimer un enregistrement dans A, les enfants de la table B seront également supprimés. S&#039;il y a eu un trigger Dolibarr PHP (par exemple apporté par un module externe) sur la suppression de l&#039;enregistrement de B (par exemple pour valider la suppression ou pour exécuter une action complémentaire), la DELETE CASCADE sera exécutée sans avoir le trigger Dolibarr PHP exécuté, manquant la validation ou les actions du déclencheur PHP du module. Donc toutes les règles métiers doivent être implémentées du même côté (côté serveur PHP), c&#039;est la raison pour laquelle les règles métier implémentées sur Database ne sont pas autorisées (même situation que le point suivant sur les triggers Database)&lt;br /&gt;
&lt;br /&gt;
==Utilisation des triggers de base de données / procédures stockées==&lt;br /&gt;
&lt;br /&gt;
L&#039;utilisation des triggers de base de données n&#039;est pas autorisée dans le code de Dolibarr. Vous ne devriez donc rencontrer aucun problème avec ces déclencheurs.&lt;br /&gt;
&lt;br /&gt;
*Les triggers de base de données ne sont pas portables. La compatibilité peut être compromise lors de la mise à jour de votre base de données.&lt;br /&gt;
&lt;br /&gt;
*Les triggers de base de données sont souvent oubliés dans les outils de sauvegarde.&lt;br /&gt;
&lt;br /&gt;
*Les triggers de base de données nécessitent des autorisations spéciales que vous ne possédez peut-être pas (et que vous ne devriez pas posséder) sur une base de données sécurisée classique.&lt;br /&gt;
&lt;br /&gt;
*L&#039;utilisation de triggers de base de données implique également l&#039;inclusion de certaines « règles métier » de votre application dans la base de données, alors que la plupart des autres règles sont gérées par le code lui-même (ce qui peut créer des conflits ou rendre le code impossible à déboguer pas à pas).&lt;br /&gt;
&lt;br /&gt;
*Les triggers de base de données exécutent le code en utilisant le fuseau horaire et la langue par défaut de la base de données, au lieu du fuseau horaire de référence de l&#039;application (qui peut être différent), ce qui génère un décalage dans la base de données. De plus, la langue par défaut de l&#039;application est également déconseillée.&lt;br /&gt;
&lt;br /&gt;
*Il existe de nombreuses autres raisons pour lesquelles nous déconseillons l&#039;utilisation des triggers de base de données dans vos développements.&lt;br /&gt;
&lt;br /&gt;
L&#039;utilisation de triggers de base de données peut certes vous faire gagner du temps lors du développement, mais constitue une très mauvaise pratique lorsque la qualité, la portabilité, la sécurité et la pérennité sont primordiales. C&#039;est pourquoi elle est interdite, car elle est incompatible avec le haut niveau de qualité de code exigé par l&#039;équipe Dolibarr. Les modules externes utilisant des déclencheurs de base de données peuvent également être refusés sur la plateforme, car ils ne fonctionneront pas pour plus de 50 % des utilisateurs.&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 (fortement recommandé en développement), ajouter la ligne suivante dans le fichier config du serveur Mysql (my.cnf ou my.ini)&lt;br /&gt;
{{MySqlStrictMode}}&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;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Syntax PgSQL:&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&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;syntaxhighlight 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;/syntaxhighlight&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() obtenir un chemin absolu depuis un chemin relatif au répertoire htdocs (pour les modules externes) ou en utilisant DOL_URL_ROOT pour le code core. 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;syntaxhighlight 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;
print &#039;&amp;lt;a href=&amp;quot;&#039;.DOL_URL_ROOT.&#039;/repducore/pageducore.php&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;/syntaxhighlight&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 quelle que 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;syntaxhighlight 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;/syntaxhighlight&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;htdocs/modulebuilder/templates&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Par exemple:&lt;br /&gt;
&lt;br /&gt;
*1 fichier qui sert d&#039;exemple de descripteur de module: &#039;&#039;&#039;core/modules/myModule.class.php&#039;&#039;&#039;&lt;br /&gt;
*1 fichier qui sert d&#039;exemple de code pour faire une nouvelle classe: &#039;&#039;&#039;class/skeleton_class.class.php&#039;&#039;&#039;&lt;br /&gt;
*1 fichier 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 fichier qui sert d&#039;exemple de code pour faire un script à exécuter en ligne de commande: &#039;&#039;&#039;scripts/skeleton_script.php&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
...&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 ([[Module ModuleBuilder]]) qui est décrit dans la chapitre de développement de module Dolibarr pour accélérer vos développements.&lt;br /&gt;
&lt;br /&gt;
==Variables globales==&lt;br /&gt;
Certaines informations ou objets sont communs et fixes pour toute l&#039;exécution d&#039;une page PHP et doivent être utilisés presque partout dans le code. Pour éviter de propager partout ces&lt;br /&gt;
informations ou objets, ils sont stockés dans des variables globales auxquelles vous pouvez accéder partout. Ces variables globales sont initialisées au début de chaque appel PHP (dans le master.inc.php ou master.inc.php ou en haut de la page). Ces objets ne sont normalement instanciés qu’une seule fois. La liste des variables globales disponibles est définie ici :&lt;br /&gt;
{{Template:TemplateGlobalVariables}}&lt;br /&gt;
&lt;br /&gt;
*$conf est l&#039;objet qui contient la configuration (enregistrée dans la base de données)&lt;br /&gt;
*$user est l&#039;objet de l&#039;utilisateur actuel&lt;br /&gt;
*$mysoc est l&#039;objet contenant toutes les informations sur l&#039;entreprise actuelle&lt;br /&gt;
*$langs est l&#039;objet avec la langue actuelle&lt;br /&gt;
*$db est le gestionnaire de base de données de la connexion actuelle à la base de données&lt;br /&gt;
*$hookmanager est une classe d&#039;usine pour gérer les hooks&lt;br /&gt;
*$extrafields est une classe d&#039;usine pour gérer les extrafields&lt;br /&gt;
&lt;br /&gt;
==Les dates et TimeZone==&lt;br /&gt;
Dolibarr est une application multi-utilisateur et multi-site. Il est donc nécessaire de stocker les dates dans le format approprié. Pour éviter les problèmes de conversion, les règles suivantes doivent être appliquées :&lt;br /&gt;
&lt;br /&gt;
*   En mémoire, une date doit toujours être stockée au format Timestamp GMT.&lt;br /&gt;
*   Une date stockée en base de données correspond au Timestamp GMT de la date soumise dans la requête, en utilisant le fuseau horaire du serveur PHP. Cela ne s&#039;applique pas aux dates mises à jour automatiquement par le moteur de base de données (champs `tms` en base de données).&lt;br /&gt;
&lt;br /&gt;
Par exemple, le 1er janvier 1970 à 3 heures à Paris (fuseau horaire +1) équivaut à 2 heures à Greenwich (fuseau horaire 0) ; la date sera stockée en mémoire sous la forme de l&#039;entier 7200 (2 * 3600 s) et transmise à la base de données via une requête SQL sous la chaîne &#039;19700101030000&#039; (PHP convertit l&#039;entier selon son fuseau horaire, et la base de données effectue la conversion inverse en utilisant également son propre fuseau horaire, identique à celui de PHP).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gestion des dates incluant les heures&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ainsi, toutes les méthodes d&#039;insertion ou de mise à jour doivent convertir, lors de la génération de la requête SQL, la date stockée en mémoire (sous forme d&#039;entier) en une chaîne de caractères compatible avec la base de données, en utilisant `db-&amp;gt;idate` (des exemples sont disponibles dans le squelette de code).&lt;br /&gt;
&lt;br /&gt;
De même, toutes les méthodes de sélection doivent convertir les champs de date provenant de la base de données (chaînes au format du fuseau horaire du serveur, par exemple &#039;19700101030000&#039;) en un champ timestamp (entier) en appelant la méthode `db-&amp;gt;jdate()`. Cela permet de stocker la date en mémoire sous forme d&#039;entier (Timestamp GMT).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gestion des dates sans heures (jour uniquement)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Pour les insertions et mises à jour, vous devez effectuer la conversion avec `db-&amp;gt;idate(valeur, &#039;gmt&#039;)` ; ainsi, pour la valeur 0, vous obtiendrez &#039;19700101000000&#039;.&lt;br /&gt;
&lt;br /&gt;
Toutes les méthodes de sélection doivent convertir les champs de date provenant de la base de données (chaînes au format du fuseau horaire du serveur, par exemple &#039;19700101000000&#039;) en utilisant `$db-&amp;gt;jdate(..., &#039;gmt&#039;)`. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autres cas&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Les dates mises à jour automatiquement (champ &#039;&#039;&#039;tms&#039;&#039;&#039; en base de données) contiennent un horodatage GMT correspondant au moment où la modification a été effectuée. La requête de sélection utilise également `db-&amp;gt;jdate` (qui s&#039;appuie sur le fuseau horaire du serveur PHP) pour convertir les données lues en un horodatage GMT en mémoire. Ainsi, si le fuseau horaire de la base de données diffère de celui du serveur PHP (par exemple, si l&#039;un d&#039;eux est mal configuré), vous pourriez constater des écarts entre la date de création et la date de mise à jour. Il est conseillé de ne pas se baser sur ce champ dans Dolibarr (ce champ à mise à jour automatique est principalement destiné au débogage).&lt;br /&gt;
&lt;br /&gt;
*La manipulation des dates en PHP doit s&#039;effectuer à l&#039;aide des fonctions de date 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 disponibles 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&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;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
print 239.2 - 229.3 - 9.9;&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;syntaxhighlight 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;/syntaxhighlight&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;syntaxhighlight 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;/syntaxhighlight&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;syntaxhighlight 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;/syntaxhighlight&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;syntaxhighlight 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;/syntaxhighlight&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;syntaxhighlight 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;/syntaxhighlight&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 conformes à 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;
&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. C&#039;est le modèle dit le plus &amp;quot;puriste&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Inconvénient : Motif plus 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 chapitre précédent Normes Dolibarr et squelettes de code), Dolibarr se base sur le principe du &#039;&#039;&#039;Table Module&#039;&#039;&#039;, car le plus pragmatique des 3.&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éduites 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, à condition que ces fonctions soient bien  propres à la table ou à la notion métier portée par l&#039;enregistrement. Jugé plus éloigné des standards scolaires de la programmation objet, c&#039;est toutefois 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éveloppement.&lt;br /&gt;
&lt;br /&gt;
La couche ORM de Dolibarr se limite à une couche d abstraction de la base (on développe une fois et le driver de base converti le code pour l&#039;accès base dans la syntaxe de la base de donnée: mysql vs postgresql vs ...)&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ée ne rejoignant pas les promesses de la théorie).&lt;br /&gt;
&lt;br /&gt;
Exemple: C&#039;est le choix si on utilise des Framework d&#039;ORM comme &#039;&#039;&#039;Propel&#039;&#039;&#039; (https://propelorm.org/). 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 (MVC)==&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 templates (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 &#039;&#039;&#039;MVC&#039;&#039;&#039; (Model - Vue - Contrôleur). 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 (Contrôleur) 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 jongler 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 (Contrôleur) 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 (les constats faits 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 pour être MVC, peu importe comment est matérialisée 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 qui relève du design pattern MVC avec la notion de séparation du code pour alimenter les données d&#039;une Vue et du code pour formater la Vue, cette deuxième notion étant un principe de séparation relevant du Design Pattern de Vue, autrement appelé notion de templates, sans lien avec le MVC donc, 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 de templates PHP (fichiers .php ou .tpl.php) qui restent, de tous les frameworks de présentation, le plus simple, plus universel, plus évolutif, plus performant et surtout plus résilient au temps. &lt;br /&gt;
&lt;br /&gt;
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 pour le rendering écran). Ce point est toutefois contrôlé par le mécanisme de validation du code des chefs de projets.&lt;br /&gt;
&lt;br /&gt;
La encore, c&#039;est l&#039;expérience et le constat &amp;quot;sur le terrain&amp;quot; d&#039;un meilleur rendement de productivité, d&#039;évolution applicative et de performance qui a motivé l&#039;abandon des frameworks de Présentation externes au profit du framework PHP.&lt;br /&gt;
&lt;br /&gt;
= Règles pour définir la branche cible d&#039;une contribution =&lt;br /&gt;
Les règles pour décider si une contribution (Pull Request) doit être poussée dans une ancienne branche de maintenance ou dans une branche de développement ne sont pas strictes et sont souvent définies par le bon sens (pragmatisme avant tout). &lt;br /&gt;
Nous pouvons nous aider du diagramme de décision disponible sur cette page [[:Category:RoadMap#Merging_PR_process_.28develop_or_maintenance_.3F.29]]&lt;/div&gt;</summary>
		<author><name>Eldy</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Langages_et_normes&amp;diff=67371</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=67371"/>
		<updated>2026-09-20T16:34:01Z</updated>

		<summary type="html">&lt;p&gt;Eldy: /* Les dates et TimeZone */&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;
[[de:Sprachen_und_Programmierregeln]]&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;
{{TemplateDocDevFr}}&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). Voir la page [[Versions|Liste des versions, journal des modifications et compatibilités]] pour les prérequis des versions plus anciennes.&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;syntaxhighlight 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;/syntaxhighlight&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 $_COOKIE, $_SERVER, $_ENV. Mais pour récupérer les contenus de $_GET ou $_POST, il faut passer par les fonctions dolibarr  [[Fonctions utiles Dolibarr|GETPOST...()]] .&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;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$var1 = 1; $var2 = 1; $var3 = 1;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
plutôt que&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
$var1 = $var2 = $var3 = 1;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
qui est moins performant.&lt;br /&gt;
&lt;br /&gt;
*Les chaines doivent avoir les variables sorties de la chaine.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
print &amp;quot;Mon texte affiche ma &amp;quot;.$variable.&amp;quot; !\n&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Les fonctions doivent retourner une valeur 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; ou &amp;quot;require_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-12 (https://www.php-fig.org/psr/psr-12/). Seules les règles &amp;quot;MUST&amp;quot; sont imposées. Notez aussi les points/exceptions suivants:&lt;br /&gt;
**La longueur des lignes: PSR-12 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 intéressante ou utile, 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 delà 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 copier-coller).&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/setup/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 pouvez utiliser le fichier &#039;&#039;&#039;dev/setup/eclipse/PSR-12 [built-in].xml&#039;&#039;&#039; comme fichier de règles de syntax pour configurer Eclipse.&lt;br /&gt;
**Note 4: 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 et nom 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      varchar(32)                 qui contiendra le code d&#039;import YYYYMMDDHHMMSS si vous faites des imports en masse dans la table.&lt;br /&gt;
 - status          smallint                    pour stocker le status d&#039;un object&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;être compatible avec toutes les précisions des pays, syntaxes des bases, on utilisera uniquement les types suivants:&lt;br /&gt;
 - integer pour tout nombre entier, id ou clé étrangère (bigint éventuellement accepté pour les id des très grosses tables)&lt;br /&gt;
 - smallint pour tout numérique entier de petite taille (comme pour stocker un code de status)&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 chaîne (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 et ces processus ne doivent pas dépendre de la présence d&#039;un module externe. Il vous faut donc assurer l&#039;intégrité de manière applicative si nécessaire.&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;syntaxhighlight 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;/syntaxhighlight&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;syntaxhighlight 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;/syntaxhighlight&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;syntaxhighlight 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;/syntaxhighlight&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;syntaxhighlight 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;/syntaxhighlight&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;syntaxhighlight 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;/syntaxhighlight&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 SQL de date NOW, SYSDATE, DATEDIFF, DATE 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 pour les raisons suivantes:&lt;br /&gt;
**afin d&#039;avoir une meilleure portabilité du code&lt;br /&gt;
**avoir une gestion correcte des TimeZone et ne pas dépendre du TimeZone de la base de donnée (le timezone de réference est le timezone de PHP et le timezone de la base de données peut être différent de celui-ci, aussi les conversions de date doivent se faire toute côté PHP).&lt;br /&gt;
**meilleurs performances (voir exemples et commentaire plus loin)&lt;br /&gt;
&lt;br /&gt;
Par exemple, on ne fera pas:&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
mais:&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Par exemple, on ne fera pas:&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
mais:&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&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;
*L&#039;instruction WITH ROLLUP est interdite :&lt;br /&gt;
&lt;br /&gt;
Cette instruction ne doit pas être utilisée : Elle n&#039;est pas gérée de la même manière par des bases de données différentes.&lt;br /&gt;
De plus, l&#039;utilisation de WITH ROLLUP brise la pureté des données retournées. L&#039;agrégation intermédiaire de génération de sous-totaux réalisée par cette instruction peut facilement être effectuée à l&#039;aide de PHP et permet de conserver le tableau de données retourné propre (non corrompu par des données insérées artificiellement).&lt;br /&gt;
Outres son côté pas bien standardisé, en insérant des résultats de calculs au sein des données, donnant un résultat qui est un mixe donnée et calculs métiers d&#039;aggrégation, la compréhension du code se trouve compliqué et même les évolutions du code sur ces agrégations plus possibles lorsque se complexifient.&lt;br /&gt;
&lt;br /&gt;
*Utilisez $db-&amp;gt;ifsql pour le IF SQL&lt;br /&gt;
&lt;br /&gt;
N&#039;incluez pas le IF dans votre requête SQL générée. Mais utilisez plutôt la méthode $db-&amp;gt;ifsql() pour créer un SQL IF compatible avec toutes les bases de données SQL.&lt;br /&gt;
&lt;br /&gt;
*Pas de DELETE CASCADE et ON UPDATE CASCADE&lt;br /&gt;
&lt;br /&gt;
De telles instructions SQL sont interdites car elles contournent les règles métiers de l&#039;application. Par exemple, s&#039;il existe une cascade de suppression entre la table A et B, lorsque l&#039;application exécutera le code pour supprimer un enregistrement dans A, les enfants de la table B seront également supprimés. S&#039;il y a eu un trigger Dolibarr PHP (par exemple apporté par un module externe) sur la suppression de l&#039;enregistrement de B (par exemple pour valider la suppression ou pour exécuter une action complémentaire), la DELETE CASCADE sera exécutée sans avoir le trigger Dolibarr PHP exécuté, manquant la validation ou les actions du déclencheur PHP du module. Donc toutes les règles métiers doivent être implémentées du même côté (côté serveur PHP), c&#039;est la raison pour laquelle les règles métier implémentées sur Database ne sont pas autorisées (même situation que le point suivant sur les triggers Database)&lt;br /&gt;
&lt;br /&gt;
==Utilisation des triggers de base de données / procédures stockées==&lt;br /&gt;
&lt;br /&gt;
L&#039;utilisation des triggers de base de données n&#039;est pas autorisée dans le code de Dolibarr. Vous ne devriez donc rencontrer aucun problème avec ces déclencheurs.&lt;br /&gt;
&lt;br /&gt;
*Les triggers de base de données ne sont pas portables. La compatibilité peut être compromise lors de la mise à jour de votre base de données.&lt;br /&gt;
&lt;br /&gt;
*Les triggers de base de données sont souvent oubliés dans les outils de sauvegarde.&lt;br /&gt;
&lt;br /&gt;
*Les triggers de base de données nécessitent des autorisations spéciales que vous ne possédez peut-être pas (et que vous ne devriez pas posséder) sur une base de données sécurisée classique.&lt;br /&gt;
&lt;br /&gt;
*L&#039;utilisation de triggers de base de données implique également l&#039;inclusion de certaines « règles métier » de votre application dans la base de données, alors que la plupart des autres règles sont gérées par le code lui-même (ce qui peut créer des conflits ou rendre le code impossible à déboguer pas à pas).&lt;br /&gt;
&lt;br /&gt;
*Les triggers de base de données exécutent le code en utilisant le fuseau horaire et la langue par défaut de la base de données, au lieu du fuseau horaire de référence de l&#039;application (qui peut être différent), ce qui génère un décalage dans la base de données. De plus, la langue par défaut de l&#039;application est également déconseillée.&lt;br /&gt;
&lt;br /&gt;
*Il existe de nombreuses autres raisons pour lesquelles nous déconseillons l&#039;utilisation des triggers de base de données dans vos développements.&lt;br /&gt;
&lt;br /&gt;
L&#039;utilisation de triggers de base de données peut certes vous faire gagner du temps lors du développement, mais constitue une très mauvaise pratique lorsque la qualité, la portabilité, la sécurité et la pérennité sont primordiales. C&#039;est pourquoi elle est interdite, car elle est incompatible avec le haut niveau de qualité de code exigé par l&#039;équipe Dolibarr. Les modules externes utilisant des déclencheurs de base de données peuvent également être refusés sur la plateforme, car ils ne fonctionneront pas pour plus de 50 % des utilisateurs.&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 (fortement recommandé en développement), ajouter la ligne suivante dans le fichier config du serveur Mysql (my.cnf ou my.ini)&lt;br /&gt;
{{MySqlStrictMode}}&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;syntaxhighlight 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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Syntax PgSQL:&lt;br /&gt;
&amp;lt;syntaxhighlight 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;/syntaxhighlight&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;syntaxhighlight 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;/syntaxhighlight&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() obtenir un chemin absolu depuis un chemin relatif au répertoire htdocs (pour les modules externes) ou en utilisant DOL_URL_ROOT pour le code core. 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;syntaxhighlight 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;
print &#039;&amp;lt;a href=&amp;quot;&#039;.DOL_URL_ROOT.&#039;/repducore/pageducore.php&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;/syntaxhighlight&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 quelle que 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;syntaxhighlight 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;/syntaxhighlight&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;htdocs/modulebuilder/templates&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Par exemple:&lt;br /&gt;
&lt;br /&gt;
*1 fichier qui sert d&#039;exemple de descripteur de module: &#039;&#039;&#039;core/modules/myModule.class.php&#039;&#039;&#039;&lt;br /&gt;
*1 fichier qui sert d&#039;exemple de code pour faire une nouvelle classe: &#039;&#039;&#039;class/skeleton_class.class.php&#039;&#039;&#039;&lt;br /&gt;
*1 fichier 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 fichier qui sert d&#039;exemple de code pour faire un script à exécuter en ligne de commande: &#039;&#039;&#039;scripts/skeleton_script.php&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
...&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 ([[Module ModuleBuilder]]) qui est décrit dans la chapitre de développement de module Dolibarr pour accélérer vos développements.&lt;br /&gt;
&lt;br /&gt;
==Variables globales==&lt;br /&gt;
Certaines informations ou objets sont communs et fixes pour toute l&#039;exécution d&#039;une page PHP et doivent être utilisés presque partout dans le code. Pour éviter de propager partout ces&lt;br /&gt;
informations ou objets, ils sont stockés dans des variables globales auxquelles vous pouvez accéder partout. Ces variables globales sont initialisées au début de chaque appel PHP (dans le master.inc.php ou master.inc.php ou en haut de la page). Ces objets ne sont normalement instanciés qu’une seule fois. La liste des variables globales disponibles est définie ici :&lt;br /&gt;
{{Template:TemplateGlobalVariables}}&lt;br /&gt;
&lt;br /&gt;
*$conf est l&#039;objet qui contient la configuration (enregistrée dans la base de données)&lt;br /&gt;
*$user est l&#039;objet de l&#039;utilisateur actuel&lt;br /&gt;
*$mysoc est l&#039;objet contenant toutes les informations sur l&#039;entreprise actuelle&lt;br /&gt;
*$langs est l&#039;objet avec la langue actuelle&lt;br /&gt;
*$db est le gestionnaire de base de données de la connexion actuelle à la base de données&lt;br /&gt;
*$hookmanager est une classe d&#039;usine pour gérer les hooks&lt;br /&gt;
*$extrafields est une classe d&#039;usine pour gérer les extrafields&lt;br /&gt;
&lt;br /&gt;
==Les dates et TimeZone==&lt;br /&gt;
Dolibarr est une application multi-utilisateur et multi-site. Il est donc nécessaire de stocker les dates dans le format approprié. Pour éviter les problèmes de conversion, les règles suivantes doivent être appliquées :&lt;br /&gt;
&lt;br /&gt;
*   En mémoire, une date doit toujours être stockée au format Timestamp GMT.&lt;br /&gt;
*   Une date stockée en base de données correspond au Timestamp GMT de la date soumise dans la requête, en utilisant le fuseau horaire du serveur PHP. Cela ne s&#039;applique pas aux dates mises à jour automatiquement par le moteur de base de données (champs `tms` en base de données).&lt;br /&gt;
&lt;br /&gt;
Par exemple, le 1er janvier 1970 à 3 heures à Paris (fuseau horaire +1) équivaut à 2 heures à Greenwich (fuseau horaire 0) ; la date sera stockée en mémoire sous la forme de l&#039;entier 7200 (2 * 3600 s) et transmise à la base de données via une requête SQL sous la chaîne &#039;19700101030000&#039; (PHP convertit l&#039;entier selon son fuseau horaire, et la base de données effectue la conversion inverse en utilisant également son propre fuseau horaire, identique à celui de PHP).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gestion des dates incluant les heures :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ainsi, toutes les méthodes d&#039;insertion ou de mise à jour doivent convertir, lors de la génération de la requête SQL, la date stockée en mémoire (sous forme d&#039;entier) en une chaîne de caractères compatible avec la base de données, en utilisant `db-&amp;gt;idate` (des exemples sont disponibles dans le squelette de code).&lt;br /&gt;
&lt;br /&gt;
De même, toutes les méthodes de sélection doivent convertir les champs de date provenant de la base de données (chaînes au format du fuseau horaire du serveur, par exemple &#039;19700101030000&#039;) en un champ timestamp (entier) en appelant la méthode `db-&amp;gt;jdate()`. Cela permet de stocker la date en mémoire sous forme d&#039;entier (Timestamp GMT).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gestion des dates sans heures (jour uniquement) :&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Pour les insertions et mises à jour, vous devez effectuer la conversion avec `db-&amp;gt;idate(valeur, &#039;gmt&#039;)` ; ainsi, pour la valeur 0, vous obtiendrez &#039;19700101000000&#039;.&lt;br /&gt;
&lt;br /&gt;
Toutes les méthodes de sélection doivent convertir les champs de date provenant de la base de données (chaînes au format du fuseau horaire du serveur, par exemple &#039;19700101000000&#039;) en utilisant `$db-&amp;gt;jdate(..., &#039;gmt&#039;)`. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Autres cas&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Les dates mises à jour automatiquement (champ &#039;&#039;&#039;tms&#039;&#039;&#039; en base de données) contiennent un horodatage GMT correspondant au moment où la modification a été effectuée. La requête de sélection utilise également `db-&amp;gt;jdate` (qui s&#039;appuie sur le fuseau horaire du serveur PHP) pour convertir les données lues en un horodatage GMT en mémoire. Ainsi, si le fuseau horaire de la base de données diffère de celui du serveur PHP (par exemple, si l&#039;un d&#039;eux est mal configuré), vous pourriez constater des écarts entre la date de création et la date de mise à jour. Il est conseillé de ne pas se baser sur ce champ dans Dolibarr (ce champ à mise à jour automatique est principalement destiné au débogage).&lt;br /&gt;
&lt;br /&gt;
*La manipulation des dates en PHP doit s&#039;effectuer à l&#039;aide des fonctions de date 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 disponibles 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&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;syntaxhighlight lang=&amp;quot;PHP&amp;quot;&amp;gt;&lt;br /&gt;
print 239.2 - 229.3 - 9.9;&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;syntaxhighlight 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;/syntaxhighlight&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;syntaxhighlight 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;/syntaxhighlight&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;syntaxhighlight 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;/syntaxhighlight&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;syntaxhighlight 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;/syntaxhighlight&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;syntaxhighlight 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;/syntaxhighlight&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 conformes à 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;
&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. C&#039;est le modèle dit le plus &amp;quot;puriste&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Inconvénient : Motif plus 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 chapitre précédent Normes Dolibarr et squelettes de code), Dolibarr se base sur le principe du &#039;&#039;&#039;Table Module&#039;&#039;&#039;, car le plus pragmatique des 3.&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éduites 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, à condition que ces fonctions soient bien  propres à la table ou à la notion métier portée par l&#039;enregistrement. Jugé plus éloigné des standards scolaires de la programmation objet, c&#039;est toutefois 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éveloppement.&lt;br /&gt;
&lt;br /&gt;
La couche ORM de Dolibarr se limite à une couche d abstraction de la base (on développe une fois et le driver de base converti le code pour l&#039;accès base dans la syntaxe de la base de donnée: mysql vs postgresql vs ...)&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ée ne rejoignant pas les promesses de la théorie).&lt;br /&gt;
&lt;br /&gt;
Exemple: C&#039;est le choix si on utilise des Framework d&#039;ORM comme &#039;&#039;&#039;Propel&#039;&#039;&#039; (https://propelorm.org/). 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 (MVC)==&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 templates (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 &#039;&#039;&#039;MVC&#039;&#039;&#039; (Model - Vue - Contrôleur). 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 (Contrôleur) 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 jongler 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 (Contrôleur) 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 (les constats faits 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 pour être MVC, peu importe comment est matérialisée 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 qui relève du design pattern MVC avec la notion de séparation du code pour alimenter les données d&#039;une Vue et du code pour formater la Vue, cette deuxième notion étant un principe de séparation relevant du Design Pattern de Vue, autrement appelé notion de templates, sans lien avec le MVC donc, 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 de templates PHP (fichiers .php ou .tpl.php) qui restent, de tous les frameworks de présentation, le plus simple, plus universel, plus évolutif, plus performant et surtout plus résilient au temps. &lt;br /&gt;
&lt;br /&gt;
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 pour le rendering écran). Ce point est toutefois contrôlé par le mécanisme de validation du code des chefs de projets.&lt;br /&gt;
&lt;br /&gt;
La encore, c&#039;est l&#039;expérience et le constat &amp;quot;sur le terrain&amp;quot; d&#039;un meilleur rendement de productivité, d&#039;évolution applicative et de performance qui a motivé l&#039;abandon des frameworks de Présentation externes au profit du framework PHP.&lt;br /&gt;
&lt;br /&gt;
= Règles pour définir la branche cible d&#039;une contribution =&lt;br /&gt;
Les règles pour décider si une contribution (Pull Request) doit être poussée dans une ancienne branche de maintenance ou dans une branche de développement ne sont pas strictes et sont souvent définies par le bon sens (pragmatisme avant tout). &lt;br /&gt;
Nous pouvons nous aider du diagramme de décision disponible sur cette page [[:Category:RoadMap#Merging_PR_process_.28develop_or_maintenance_.3F.29]]&lt;/div&gt;</summary>
		<author><name>Eldy</name></author>
	</entry>
</feed>