<?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=Gnovaro</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=Gnovaro"/>
	<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php/Special:Contributions/Gnovaro"/>
	<updated>2026-10-22T10:14:39Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.17</generator>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Lenguaje_y_Normas_de_Desarrollo&amp;diff=22134</id>
		<title>Lenguaje y Normas de Desarrollo</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Lenguaje_y_Normas_de_Desarrollo&amp;diff=22134"/>
		<updated>2011-06-08T21:13:34Z</updated>

		<summary type="html">&lt;p&gt;Gnovaro: /* Design patterns y programación con objetos */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TemplateDocDesarrollo}}&lt;br /&gt;
&lt;br /&gt;
He aquí algunas normas sobre el lenguaje, la sintaxis y las norma de desarrollo en vigor para el proyecto Dolibarr:&lt;br /&gt;
&lt;br /&gt;
= Versiones =&lt;br /&gt;
&lt;br /&gt;
* Dolibarr debe funcionar con:&lt;br /&gt;
# Todos los SO (Windows, Linux, MACOS...)&lt;br /&gt;
# PHP 4.3 ó + (Debe funcionar sin ningún módulo PHP complementario, exceptuando los módulos de acceso a la base de datos).&lt;br /&gt;
# Mysql 3.1 ó +&lt;br /&gt;
&lt;br /&gt;
= Normas Archivos =&lt;br /&gt;
* Saltos de linea UNIX&lt;br /&gt;
* Espacios y tabs tabs (4 espacios)&lt;br /&gt;
&lt;br /&gt;
= Normas PHP =&lt;br /&gt;
&lt;br /&gt;
* Dolibarr está escrito en PHP y soporta todas las versiones de PHP superiores a la 4.1. Todos los archivos deben de contener la extensión .php&lt;br /&gt;
&lt;br /&gt;
* La llamada a las variables superglobales PHP deben pasar a través de los operadores dedicados $_GET, $_POST, $_COOKIES, $_SERVER, $_ENV.&lt;br /&gt;
Los otros operadores ($HTTP_SERVER_GET, ...) están siendo depreciados en el seno de PHP, no deben de ser ya utilizados. Por lo tanto, el código debe funcionar incluso cuando la opción &#039;&#039;&#039;register_long_arrays&#039;&#039;&#039; esté en off.&lt;br /&gt;
Además de que el código debe funcionar cuando la opción de PHP &#039;&#039;&#039;register_globals&#039;&#039;&#039; esté en off (recomendado por PHP), también lo deberá hacer cuando la opción &#039;&#039;&#039;register_globals&#039;&#039;&#039; esté en on (por defecto en muchas instalaciones).&lt;br /&gt;
&lt;br /&gt;
* Los smart tags PHP no són utilizados. Las secciones de código deben de empezar por &#039;&#039;&#039;&amp;lt;?php&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* No se permite el uso de la variable &#039;&#039;&#039;PHP_SELF&#039;&#039;&#039;. Utilice en su lugar $_SERVER[&amp;quot;PHP_SELF&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
* Cuando varias variables deben ser inicializadas con el mismo valor, utilize múltiples líneas&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$var1=1;$var2=1;$var3=1;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
en lugar de&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$var1=$var2=$var3=1;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
que es menos eficiente.&lt;br /&gt;
&lt;br /&gt;
* las cadenas deben de ser encuadradas con comillas simples y las variables sacadas de la cadena.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
print &#039;Mi texo muestra mi &#039;.$variable.&#039; !&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Los comentarios deben seguir la sintaxis de C, es decir, una doble barra invertida para una línea de comentario y el uso de una barra con arterisco para abrir un bloque de varias líneas&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/* Bloque de comentarios&lt;br /&gt;
 *&lt;br /&gt;
 * Fin el bloque&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;
  // comentario de una línea&lt;br /&gt;
  print $i;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Los ficheros deben ser guardados en formato Unix (LF) y no en formato Windows (CR/LF). El formato Unix es compatible con los SO Unix, Windows, Mac, mientras que el formato de archivo de texto de Windows es problemático en algunos PHP en Unix.&lt;br /&gt;
&lt;br /&gt;
Las funciones deben devolver &amp;gt;0 en caso de éxito, y un número &amp;lt;0 en caso de error.&lt;br /&gt;
A día de hoy, muy pocas funciones cumplen este standard, pero es necesario.&lt;br /&gt;
&lt;br /&gt;
= Normas SQL =&lt;br /&gt;
&lt;br /&gt;
* ¡Los SELECT * están prohibidos! Cada Select deberá especificar la lista completa de los campos para recuperar. Esto permitirá evitar confusiones. Ejemplo:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT field_a, field_b, field_c FROM table_1 WHERE field_d = &#039;$id&#039;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* En las consultas SQL, entrecomillaremos los campos, pero no los numéricos que contengan cantidades que se almacenen en los campos de tipo double o real. Los entrecomillados en los numéricos de tipo float se almacenan con un valor diferente. Por ejemplo 412.62 dentro del insert se guardara con el valor 412.61999512 en base si el campo es de tipo double(24,8). Y PHP sólo ve 412.61999512. Otras herramientas verán 412.62 dando la impresión de que no hay problemas. Y PHP tiene razón, hay un problema en base. Mediante la eliminación de las comillas en los numéricos, esto irá  mejor.&lt;br /&gt;
&lt;br /&gt;
Ejemplo:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
Bien:INSERT INTO table_1 (field_txt, field_num) VALUES (&#039;txt&#039;, 412.62)&lt;br /&gt;
Mal: INSERT INTO table_1 (field_txt, field_num) VALUES (&#039;txt&#039;, &#039;412.62&#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nota, el problema de los float es general y no sólamete en el acceso a la base de datos, está presente en todos los lenguajes cuando trabajamos sobre números reales, por lo que deberán ser limpiados por la función price2num con el segundo parámetro rellenado con:&lt;br /&gt;
&#039;MU&#039;, &#039;MT&#039; ó &#039;MS&#039; según sea necesario. Consulte el capítulo &amp;quot;Los números reales, importes y cálculos&amp;quot; más abajo.&lt;br /&gt;
&lt;br /&gt;
En la práctica, con la finalidad de set compatible con todas las precisiones de los paises, utilizaremos los siguientes tipos:&lt;br /&gt;
 - double(24,8) para cualquier importe&lt;br /&gt;
 - double(6,3) para las tasas de IVA&lt;br /&gt;
 - real para una cantidad&lt;br /&gt;
&lt;br /&gt;
* Dolibarr debe trabajar incluso con la opción &#039;&#039;&#039;strict&#039;&#039;&#039; de Mysql activa.&lt;br /&gt;
Para activarla, añada la siguiente línea en su archivo config del servidor MySql (my.cnf)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
sql-mode=&amp;quot;STRICT_ALL_TABLES&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* las funciones NOW ó SYSDATE están prohibidas en las órdenes de SQL. Si se necesita indicar la fecha del momento en un campo, el valor debe provenir de PHP y no del motor de la base de datos. Esto además de ofrecer una mejor portabilidad del código, también permite una gestión correcta de la zona horaria.&lt;br /&gt;
&lt;br /&gt;
= Normas HTML =&lt;br /&gt;
&lt;br /&gt;
* Todos los atributos de las etiquetas HTML deben de estar *en minúscula* y entrecomillados con *doble comilla*.&lt;br /&gt;
&lt;br /&gt;
* Los enlaces href deben de ser absolutos. para las páginas, basarse en la function dol_buildpath(). Para las imágenes basarse en la llamada de la función img_picto.&lt;br /&gt;
Por ejemplo:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
print &#039;&amp;lt;a href=&amp;quot;&#039;.dol_buildpath(&#039;/monrep/mapage.php&#039;).&#039;&amp;quot;&amp;gt;&#039;.img_picto(&#039;Texte alt&#039;,&#039;nompictopng&#039;,&#039;&#039;).&#039;&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Javascript y la llamada a scripts java en las páginas php está fuera de las normas. Si de todas maneras se incluye código javascript, debe estar condicionado mediante el test &amp;quot;$conf-&amp;gt;use_javascript&amp;quot;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
if ($conf-&amp;gt;use_javascript)&lt;br /&gt;
{&lt;br /&gt;
...  // El código PHP que genera el javascript va aquí&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Las ventanas emergentes  no deben de ser utilizadas, exceptuando los tooltips (y quedan condicionados por el punto anterior).&lt;br /&gt;
&lt;br /&gt;
* Los scripts externos son escritos en Perl si no pueden serlo en php, la utilización de otro lenguaje no está prohibido, pero debe de ser discutido priero en la lista de correo de desarrollo. El lenguaje debe de ser dominado al menos por 2 desarrolladores para asegurar el mantenimiento&lt;br /&gt;
&lt;br /&gt;
= Normas Dolibarr y plantillas de código =&lt;br /&gt;
&lt;br /&gt;
== Plantillas de código ==&lt;br /&gt;
Para estandarizar el código y acelerar el desarrollo de nuevos componentes en Dolibarr, en la carpeta &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039; encontraremos 4 plantillas de código preparadas.&lt;br /&gt;
&lt;br /&gt;
* 1 que sirve de ejemplo de descriptor de módulo: &#039;&#039;&#039;myModule.class.php&#039;&#039;&#039;&lt;br /&gt;
* 1 que sirve de ejemplo de código para crear una nueva clase: &#039;&#039;&#039;skeleton_class.class.php&#039;&#039;&#039;&lt;br /&gt;
* 1 que sirve de ejemplo de código para crear una nueva página: &#039;&#039;&#039;skeleton_page.php&#039;&#039;&#039;&lt;br /&gt;
* 1 que sirve de ejemplo de código para crear una nuevo script a ejecutar en línea de comandos: &#039;&#039;&#039;skeleton_script.php&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Úsenlas como ejemplo.&lt;br /&gt;
Tenga en cuenta que estas plantillas también son utilizadas por el generador de código PHP que se describe en el capítulo de Desarrollo de módulos Dolibarr módulo para acelerar su desarrollo.&lt;br /&gt;
&lt;br /&gt;
== Las fechas y la Zona Horaria ==&lt;br /&gt;
Dolibarr es una aplicación multi-usuario y multi-ubicación. Por lo tanto, es necesario almacenar las fechas en el formato correcto. Para evitar problemas de conversión, deben aplicarse las siguientes reglas:&lt;br /&gt;
* Una fecha en memoria debe de estar en formato Timestamp GMT.&lt;br /&gt;
* Una fecha guardada en la base de datos contiene el Timestamp GMT en relación con la fecha que figura en la consulta en hora local &amp;lt;b&amp;gt;del servidor PHP&amp;lt;/b&amp;gt;. No se trata de las fechas de actualización de la base de datos (campo &#039;&#039;&#039;tms&#039;&#039;&#039; en la base de datos).&lt;br /&gt;
Por lo tanto, el 1 de enero de 1970, a las 3 en París (TZ=+1) = las 2 en Greenwitch (TZ=0)  será almacenado en memora 7200 y será enviado a la base de datos con la cadena &#039;19700101030000&#039; (PHP convierte en hora de su TZ y la base de datos la deconvierte con su TZ que es la misma que la de PHP).&lt;br /&gt;
&lt;br /&gt;
Los métodos select deben traducir los campos fecha al formato de cadenta TZ de la base (&#039;19700101030000&#039;) mediante la llamada del método db-&amp;gt;jdate para recuperar la información en memoria en formato Timestamp GMT. Y los métodos insert deben deben generar la petición convirtiendo la fecha en memoria conocida en variable, mediante el método db-&amp;gt;idate (Ver ejemplos generados por la plantilla).&lt;br /&gt;
&lt;br /&gt;
* Las actualizaciones automáticas de la base de datos (campo &#039;&#039;&#039;tms&#039;&#039;&#039; en la base) contienen el Timestamp GMT del momento en que se ha realizado la modificación. Los métodos select recuperan directamente este dato en memoria en formato Timestamp GMT.&lt;br /&gt;
&lt;br /&gt;
== Codificación UTF8/ISO ==&lt;br /&gt;
Dolibarr guarda la información de la manera siguiente:&lt;br /&gt;
&lt;br /&gt;
* En la base de datos, los datos en UTF8 ó ISO. Esto depende del pagecode de la base de datos, y por lo tanto, de las opciones en la creación de esta base de datos. En todos los casos, el controlador de base de datos Dolibarr (dentro de /lib/database) lee e inserta por conversión desde y hacia UTF8.&lt;br /&gt;
* Los datos en memoria se guardan en UTF8 (instancias de objetos PHP).&lt;br /&gt;
* las páginas web mostradas en pantalla se encuentran en formato UTF8 (con versiones &amp;lt; 2.5.1, es el antiguo parámetro $character_set del fichero conf.php quien define el formato de salida).&lt;br /&gt;
&lt;br /&gt;
== Los números reales, importes y cálculos ==&lt;br /&gt;
Tanto en PHP como en otros lenguajes (Java, por ejemplo), los datos no enteros (float, real, double) no son fialbes.&lt;br /&gt;
Pruebe a realizar por ejemplo&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
print 239.2 - 229.3 - 9.9;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
No obtendrá 0, sino un número muy pequeño en potencia 10 negativo . Si obtiene cero, puede encontrar otros ejemplos que no funcionan.&lt;br /&gt;
El problema de los float es general, una variable resultante del cálculo de números reales debe SISTEMATICAMENTE ser limpiada mediante la función price2num con el segundo parámetro rellenado con: &#039;MU&#039;, &#039;MT&#039; ó &#039;MS&#039; según el caso (ver doc de la función).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
print price2num(239.2 - 229.3 - 9.9, &#039;MT&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;	&lt;br /&gt;
Si no es un precio que se ajuste a los parámetros de MU, MT, MS debe utilizar la función &#039;&#039;&#039;round()&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Creación de tablas ==&lt;br /&gt;
No crear una tabla a utilizar, es decir, al &#039;&#039;&#039;primer uso&#039;&#039;&#039; del módulo.&lt;br /&gt;
Si crea un módulo que usa tablas que no se incluyen como estándar en el código de Dolibarr, asegúrese de seguir el tutorial Creación de un módulo que explica cómo incluir las tablas que se crean en la activación del módulo y no en su uso (ver más arriba).&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
Añada traces dentro de su código mediante la función dolibarr_syslog($yourmessage, LOG_INFO|LOG_DEBUG|LOG_WARNING|LOG_ERR);&lt;br /&gt;
&lt;br /&gt;
== Carpetas de trabajo ==&lt;br /&gt;
Si tiene que crear una carpeta de trabajo, en el código, haga referencia a esta carpeta de la siguiente forma&lt;br /&gt;
DOL_DATA_ROOT.&#039;/mimodulo&#039;.&lt;br /&gt;
La carpeta puede crearse en desde su código mediante el código siguiente:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$mymoduledir=DOL_DATA_ROOT.&#039;/mimodulo&#039;;&lt;br /&gt;
if (! is_dir($mymoduledir)) create_exdir($mymoduledir);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si necesita una carpeta de datos temporales, esta carpeta deberá ser DOL_DATA_ROOT.&#039;/minmodulo/temp&#039;&lt;br /&gt;
&lt;br /&gt;
= Patrones de Diseño y programación con objetos =&lt;br /&gt;
== Patrones de Diseño Creacionales (GoF) ==&lt;br /&gt;
Design patterns definidos por el le Gang Of Four (ver la wikipedia sobre los [http://es.wikipedia.org/wiki/Patr%C3%B3n_de_dise%C3%B1o Design patterns]).&lt;br /&gt;
No hay design patterns creacionales particulares.&lt;br /&gt;
Hay objetos cercanos a los Singleton y creados conforme al 100% en el espíritu, pero no en la sintaxis, a fin de ser compatible con PHP 4 que no es un lenguaje orientado a objetos completo.&lt;br /&gt;
&lt;br /&gt;
== Design patterns Estructurales (GoF) ==&lt;br /&gt;
(ver la wikipedia sobre los [http://es.wikipedia.org/wiki/Patr%C3%B3n_de_dise%C3%B1o Design patterns]).&lt;br /&gt;
No hay design patterns estructurales particulares.&lt;br /&gt;
&lt;br /&gt;
== Design patterns de Comportamiento (GoF) ==&lt;br /&gt;
(ver la wikipedia sobre los [http://es.wikipedia.org/wiki/Patr%C3%B3n_de_dise%C3%B1o Design patterns]).&lt;br /&gt;
No hay design patterns de Comportamiento particulares.&lt;br /&gt;
&lt;br /&gt;
== Design patterns enterprise (Martin Fowler) ==&lt;br /&gt;
&lt;br /&gt;
=== Motivos de organización del código ===&lt;br /&gt;
&lt;br /&gt;
[[wikipedia:Martin Fowler|Martin Fowler]] ha identificado 3 métodos de organización de código llamados &#039;&#039;&#039;principios&#039;&#039;&#039;:&lt;br /&gt;
* El &#039;&#039;&#039;Transaction Script&#039;&#039;&#039; (El código es lineal en función de una acción del usuario).&lt;br /&gt;
Es el antiguo principio utilizado en los lenguajes de procedimiento.&lt;br /&gt;
Inconveniente: Redundancia de código. Necesidad de conocer el modelo físico a desarrollar.&lt;br /&gt;
* El &#039;&#039;&#039;Domain Model&#039;&#039;&#039;&lt;br /&gt;
Es un modelo posible desde los lenguajes orientados a objeto. Son procedimentos funcionales (que deben de ser indentificados antes) que sirven de base para las clases objeto.&lt;br /&gt;
Inconveniente: Motivo de mantenimiento complejo.&lt;br /&gt;
* El &#039;&#039;&#039;Table Module&#039;&#039;&#039;&lt;br /&gt;
Un intermedio entre los 2 anteriores donde se tiene una sola clase por tabla de la base de datos.&lt;br /&gt;
&lt;br /&gt;
-&amp;gt; Como se muestra en el código de la plantilla (ver sección anterior) Dolibarr se basa en el principio de &#039;&#039;&#039;Table Module&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Comunicación lógica de negociado - datos (ORM) ===&lt;br /&gt;
&lt;br /&gt;
Existen 3 tipos de conexiones:&lt;br /&gt;
* &#039;&#039;&#039;Data Gateway a tablas y filas&#039;&#039;&#039; &lt;br /&gt;
Es el más simple. Creamos una tabla por clase y cada clase es un puente con la tabla correspondiente, ver una clase por línea tabla. Una instancia de la clase será pues un registro de la tabla. La clase contiene sólo el código de acceso a líneas o columnas de tablas.&lt;br /&gt;
&lt;br /&gt;
Ejemplo: Es el método utilizado al utilizar ciertos Frameworks de ORM como &#039;&#039;&#039;iBatis&#039;&#039;&#039; (http://ibatis.apache.org/).&lt;br /&gt;
&lt;br /&gt;
* El &#039;&#039;&#039;Active Record&#039;&#039;&#039; &lt;br /&gt;
Idéntico al anterior, pero podemos añadir algunas funciones de negociado en la clase, siempre que estas funciones sean exclusivas de la tabla o la grabación.&lt;br /&gt;
&lt;br /&gt;
Ejemplo: Es el método utilizado por los desarrollos de Dolibarr y por otras muchas aplicaciones en PHP que disponen de su propio propio framework y prácticas de desarrollo.&lt;br /&gt;
&lt;br /&gt;
* El &#039;&#039;&#039;Data Mapper&#039;&#039;&#039;&lt;br /&gt;
Las clases representan las entidades del problema y no los datos. Por lo tanto hay que doblar, triplicar... estas clases con clases de mapeo para acceder a los datos.&lt;br /&gt;
Más &amp;quot;purista&amp;quot; en el papel ya que el negociado está más cercano, este método también tiene la desventaja de ser más complejo en la práctica.&lt;br /&gt;
Ejemplo: Es el utilizadao si utilizamos el Framework de ORM &#039;&#039;&#039;Propel&#039;&#039;&#039; (http://propel.phpdb.org/trac/). Lo encontraremos pues en aplicacciones más pesadas basadas en este ORM.&lt;br /&gt;
&lt;br /&gt;
-&amp;gt; Para los desarrollos de Dolibarr, es recomendado utilizar el modo &#039;&#039;&#039;Active Record &#039;&#039;&#039; que ofrece las ventajas de un modelo cercano de negociado sin la complejidad y sin dificultar mucho la técnica. Es en este modo mediante el cual el desarrollo, la comprensión del código y el mantenimiento técnico y/o funcional parece ser la más productivo (Sin embargo, se trata de un eterno debate entre los puristas y los pragmáticos, el debate en el que nadie puede realmente estar en lo cierto, porque todo depende de los objetivos a atender).&lt;/div&gt;</summary>
		<author><name>Gnovaro</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Language_and_development_rules&amp;diff=22133</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=22133"/>
		<updated>2011-06-08T20:51:00Z</updated>

		<summary type="html">&lt;p&gt;Gnovaro: Files Norms&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TemplateDocDevEn}}&lt;br /&gt;
&lt;br /&gt;
This is some rules on language, syntax and norm we use into Dolibarr project:&lt;br /&gt;
&lt;br /&gt;
= Versions =&lt;br /&gt;
&lt;br /&gt;
* Dolibarr must works on:&lt;br /&gt;
# All OS (Windows, Linux, MACOS...)&lt;br /&gt;
# PHP 4.3 or + (Must works with no need of complementary PHP module, except module to PHP module to access database).&lt;br /&gt;
# Mysql 3.1 or +&lt;br /&gt;
&lt;br /&gt;
= File Norms =&lt;br /&gt;
* Line Breaks, use UNIX&lt;br /&gt;
* Spaces vs tabs, use TAB (4 spaces)&lt;br /&gt;
&lt;br /&gt;
= PHP Norms =&lt;br /&gt;
* Dolibarr is written with PHP and supports all PHP version higher than 4.1. All files must end with extension .php&lt;br /&gt;
&lt;br /&gt;
* Usage of superglobals PHP variables must use dedicated operators $_GET, $_POST, $_COOKIES, $_SERVER, $_ENV.&lt;br /&gt;
Other operators ($HTTP_SERVER_GET, ...) are now deprecated inside PHP, so they must no more be used. Like that code will works alos if option &#039;&#039;&#039;register_long_arrays&#039;&#039;&#039; is to off.&lt;br /&gt;
Moreover, the code must works when PHP option &#039;&#039;&#039;register_globals&#039;&#039;&#039; is off (recommanded by PHP). It must works the same way that when option &#039;&#039;&#039;register_globals&#039;&#039;&#039; is on (by default on a lot of installations).&lt;br /&gt;
&lt;br /&gt;
* Smart tags PHP are not used. PHP code section must start with &#039;&#039;&#039;&amp;lt;?php&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Do not use &#039;&#039;&#039;PHP_SELF&#039;&#039;&#039;. Use instead $_SERVER[&amp;quot;PHP_SELF&amp;quot;].&lt;br /&gt;
&lt;br /&gt;
* When several variables must be initialized with same value, you must use several lines&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$var1=1;$var2=1;$var3=1;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
instead of&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$var1=$var2=$var3=1;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
that is slower.&lt;br /&gt;
&lt;br /&gt;
* String must be rounded by simple quote and vairable inside string must be out of the quote.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
print &#039;My text show my &#039;.$variable.&#039; !&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Comments must use the C syntax, ie a double antislash for a comment on one line and a slash-star to open a bloc for several lines&lt;br /&gt;
&amp;lt;source 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;
{&lt;br /&gt;
  // comment on one line&lt;br /&gt;
  print $i;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Files must be saved with Unix format (LF) and not Windows (CR/LF). Unif format is compatible on all OS like Unix like, Windows, Mac, but the Windows text file format is no working on some PHP under Unix.&lt;br /&gt;
&lt;br /&gt;
Functions must return a value strictly higher than 0 if successfull and strictly lower than 0 if error.&lt;br /&gt;
&lt;br /&gt;
= SQL rules =&lt;br /&gt;
&lt;br /&gt;
* All SELECT * are forbidden ! Any SELECT must define complete list of fields to get. This avoid confusion. Example:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT field_a, field_b, field_c FROM table_1 WHERE field_d = &#039;$id&#039;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Into SQL requests, you must quote fields except fields that contains amounts that must be stored as double or real type. Quotes on numbers may results in saving a different value. For example 412.62 in an insert will be saved with value 412.61999512 into database fi target field has type double(24,8). Only PHP see value 412.61999512. Other tools will see 412.62 giving sensation that there is no problem. But it&#039;s PHP that hase 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;source 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;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note, problem of float numbers is same problem on all langauges 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, cleaned with function price2num with second parameter defined to :&lt;br /&gt;
&#039;MU&#039;, &#039;MT&#039; or &#039;MS&#039; depending on usage of number. (see function documentation)&lt;br /&gt;
&lt;br /&gt;
Well, to be compatible with any accurency required by any country on amounts, we will use the following type into database:&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;
&lt;br /&gt;
* Dolibarr must works even if Mysql option &#039;&#039;&#039;strict&#039;&#039;&#039; is active.&lt;br /&gt;
To activate it (recommanded when developping on Dolibarr), add the following line into the config file of your Mysql server (my.cnf)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
sql-mode=&amp;quot;STRICT_ALL_TABLES&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Functions NOW or SYSDATE are forbidden inside SQL requests. If you must use the current date into a field, value must come from the PHP and not from the database engine. This is to avoid a better portability of code and a correct management of TimeZone.&lt;br /&gt;
&lt;br /&gt;
= HTML norms =&lt;br /&gt;
* 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;
For example:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
print &#039;&amp;lt;a href=&amp;quot;&#039;.dol_buildpath(&#039;/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;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{ToTranslate}}&lt;br /&gt;
* Le javascript 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&amp;quot;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
if ($conf-&amp;gt;use_javascript)&lt;br /&gt;
{&lt;br /&gt;
...  // Le code php qui génère du javascript est ici&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Les popups windows ne doivent pas être utilisées, sauf pour des tooltips (et restent condtionné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. Le langage devra être maitrisé par au moins 2 développeurs pour en assurer la maintenance.&lt;br /&gt;
&lt;br /&gt;
= Normes Dolibarr et squelettes de code =&lt;br /&gt;
&lt;br /&gt;
== Squelettes de code ==&lt;br /&gt;
Afin d&#039;uniformiser le code et d&#039;accélérer le développement de nouveaux composants dans Dolibarr, se trouvent dans le répertoire &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039;, 4 squelettes de code tout préparés.&lt;br /&gt;
&lt;br /&gt;
* 1 qui sert d&#039;exemple de descripteur de module: &#039;&#039;&#039;myModule.class.php&#039;&#039;&#039;&lt;br /&gt;
* 1 qui sert d&#039;exemple de code pour faire une nouvelle classe: &#039;&#039;&#039;skeleton_class.class.php&#039;&#039;&#039;&lt;br /&gt;
* 1 qui sert d&#039;exemple de code pour faire une nouvelle page: &#039;&#039;&#039;skeleton_page.php&#039;&#039;&#039;&lt;br /&gt;
* 1 qui sert d&#039;exemple de code pour faire un script à exécuter en ligne de commande: &#039;&#039;&#039;skeleton_script.php&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Servez-vous en comme exemple.&lt;br /&gt;
Notons que ces squelettes sont aussi utilisés par le générateur de code PHP qui est décrit dans la chapitre de développement de module Dolibarr pour accélérer vos développement.&lt;br /&gt;
&lt;br /&gt;
== Les dates et TimeZone ==&lt;br /&gt;
Dolibarr se veut une application mutli-utilisateur et multi-localisation. Il convient donc de stocker les dates dans le bon format. Pour éviter les problèmes de conversion, les règles suivantes doivent être appliquées:&lt;br /&gt;
* Une date en mémoire doit être au format Timestamp GMT.&lt;br /&gt;
* Une date stockée en base de données contient le Timestamp GMT en rapport avec la date soumise dans la requête en heure locale &amp;lt;b&amp;gt;du serveur PHP&amp;lt;/b&amp;gt;. Cela ne concerne pas les dates mises à jour automatiquement par la base (champ &#039;&#039;&#039;tms&#039;&#039;&#039; en base).&lt;br /&gt;
Ainsi le 1er janvier 1970, 3 heures à Paris (TZ=+1) = 2 heures à Greenwitch (TZ=0) sera stocké en mémoire 7200 et sera soumis à la base de données avec la chaine &#039;19700101030000&#039; (PHP convertit en heure de son TZ et la base déconvertit avec son TZ qui est le même que celui de PHP).&lt;br /&gt;
&lt;br /&gt;
Les méthodes select doivent donc traduire les champs dates lus qui sont au format chaine TZ de la base (&#039;19700101030000&#039;) par appel de la méthode db-&amp;gt;jdate afin de récupérer une information en mémoire au format Timestamp GMT. Et les méthodes insert doivent lors de la génération de la requête convertir la date mémoire connue en variable, par la méthode db-&amp;gt;idate (Voir exemples générés par le squelette).&lt;br /&gt;
&lt;br /&gt;
* Les dates mises à jour automatiquement par la base (champ &#039;&#039;&#039;tms&#039;&#039;&#039; en base) contiennent le Timestamp GMT au moment où la modification est faite. Les méthodes select récupèrent directement cette donnée en mémoire au format Timestamp GMT.&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;
* En base de donnée, les données sont en UTF8 ou ISO. Cela dépend du pagecode de la base, donc des options à la création de cette base. Dans tous les cas le driver d&#039;accès base Dolibarr (dans /lib/database) s&#039;arrange à la lecture et insertion pour convertir vers et depuis de l&#039;UTF8.&lt;br /&gt;
* Les données en mémoires sont donc stockées en UTF8 (instances d&#039;objets PHP).&lt;br /&gt;
* Les pages web affichées à l&#039;écran sont au format UTF8 (avec les versions &amp;lt; 2.5.1, c&#039;est le vieux paramètre $character_set du fichier conf.php qui définissait le format de sortie).&lt;br /&gt;
&lt;br /&gt;
== Les nombres réels, montants et calculs ==&lt;br /&gt;
En PHP comme dans d&#039;autres langages (Java par exemple), les données non entières (float, real, double) ne sont pas fiables.&lt;br /&gt;
Essayer de faire par exemple &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
print 239.2 - 229.3 - 9.9;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Vous n&#039;obtiendrez pas zéro mais un nombre très petit en puissance de 10 négative. Si vous obtenez zéro, vous pourrez trouvez d&#039;autres exemples qui ne fonctionnent pas.&lt;br /&gt;
Le problème des float est général, une variable résultante de calcul de nombre réels doit SYSTEMATIQUEMENT être nettoyée par la fonction price2num avec le 2eme paramètre renseigné à: &#039;MU&#039;, &#039;MT&#039; ou &#039;MS&#039; selon le besoin (voir doc fonction).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
print price2num(239.2 - 229.3 - 9.9, &#039;MT&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
S&#039;il ne s&#039;agit pas d&#039;un prix sur lequel s&#039;adapte les paramètres MU, MT ou MS, il faut utiliser la fonction &#039;&#039;&#039;round()&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Création de tables ==&lt;br /&gt;
Ne pas créer de table à l&#039;utilisation, c&#039;est-à-dire à la &#039;&#039;&#039;première utilisation&#039;&#039;&#039; du module.&lt;br /&gt;
Si vous créez un module qui utilise des tables qui ne sont pas intégrées en standard dans le code de Dolibarr, veillez à suivre le didacticiel Créer un 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;
== Logs ==&lt;br /&gt;
Ajouter des traces dans votre code avec la fonction&lt;br /&gt;
dolibarr_syslog($yourmessage, LOG_INFO|LOG_DEBUG|LOG_WARNING|LOG_ERR);&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;
DOL_DATA_ROOT.&#039;/monmodule&#039;.&lt;br /&gt;
Le répertoire peut être créé dans votre code à l&#039;exécution par le code suivant:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$mymoduledir=DOL_DATA_ROOT.&#039;/monmodule&#039;;&lt;br /&gt;
if (! is_dir($mymoduledir)) create_exdir($mymoduledir);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si vous avez besoin d&#039;un répertoire qui contiendra des données temporaires, ce répertoire doit être DOL_DATA_ROOT.&#039;/monmodule/temp&#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 [[wikipedia:Design pattern|Design patters]]).&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 [[wikipedia:Design pattern|Design patters]]). &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 [[wikipedia:Design pattern|Design patters]]). &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;
[[wikipedia:Martin Fowler|Martin Fowler]] has identified 3 way to organize:&lt;br /&gt;
* The &#039;&#039;&#039;Transaction Script&#039;&#039;&#039; (The source code is linear for each user action).&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;
* The &#039;&#039;&#039;Domain Model&#039;&#039;&#039;&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;
* The &#039;&#039;&#039;Table Module&#039;&#039;&#039;&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 use 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;
{{ToTranslate}}&lt;br /&gt;
&lt;br /&gt;
Il existe 3 modes de liaisons:&lt;br /&gt;
* Le &#039;&#039;&#039;Table And Row Data Gateway&#039;&#039;&#039;&lt;br /&gt;
C&#039;est le plus simple. On crée une table par classe et chaque classe est un pont avec la table correspondante, voir une classe par ligne de table. 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.&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;
Identique au précédent, mais on se permet d&#039;ajouter quelques fonctions métiers sur la classe, à conditions que ces fonctions soient propres à la table ou à l&#039;enregistrement.&lt;br /&gt;
&lt;br /&gt;
Exemple: C&#039;est le mode choisi pour les développements Dolibarr et de nombreuses autres applications PHP qui ont leur propre framework et pratiques de développements.&lt;br /&gt;
&lt;br /&gt;
* Le &#039;&#039;&#039;Data Mapper&#039;&#039;&#039;&lt;br /&gt;
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 plus complexe sur le plan pratique.&lt;br /&gt;
Exemple: C&#039;est le choix si on utilise le Framework d&#039;ORM &#039;&#039;&#039;Propel&#039;&#039;&#039; (http://propel.phpdb.org/trac/). On le trouve donc sur des applications plus lourdes basées sur cet ORM entre autres.&lt;br /&gt;
&lt;br /&gt;
-&amp;gt; Pour les développements Dolibarr, il est recommandé d&#039;utiliser le mode de liaison &#039;&#039;&#039;Active Record&#039;&#039;&#039; qui offre les avantages d&#039;un modèle proche du métier sans en avoir la complexité et sans trop masquer non plus la technique. C&#039;est dans ce mode que le développement, la compréhension du code et la maintenance technique et/ou fonctionnelle semble la plus productive (ceci est toutefois un éternel débat entre les puristes et les pragmatiques, débat dans lequel personne ne peut vraiment avoir raison, car tout dépend des objectifs à atteindre).&lt;/div&gt;</summary>
		<author><name>Gnovaro</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Langages_et_normes&amp;diff=22132</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=22132"/>
		<updated>2011-06-08T20:49:02Z</updated>

		<summary type="html">&lt;p&gt;Gnovaro: /* Normes Fichiers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TemplateDocDev}}&lt;br /&gt;
&lt;br /&gt;
Voici les quelques règles sur le langage, la syntaxe et normes de développement en vigueur pour le projet Dolibarr:&lt;br /&gt;
&lt;br /&gt;
= Versions =&lt;br /&gt;
&lt;br /&gt;
* Dolibarr doit fonctionner sur:&lt;br /&gt;
# Tous OS (Windows, Linux, MACOS...)&lt;br /&gt;
# PHP 4.3 ou + (Doit fonctionner sans aucun module PHP complémentaire hors les modules d&#039;accès base de donnée).&lt;br /&gt;
# Mysql 3.1 ou +&lt;br /&gt;
&lt;br /&gt;
= Normes Fichiers =&lt;br /&gt;
* Retours à la ligne UNIX&lt;br /&gt;
* Les espaces et les onglets (4 spaces)&lt;br /&gt;
&lt;br /&gt;
= Normes PHP =&lt;br /&gt;
&lt;br /&gt;
* Dolibarr est écrit en PHP et supporte toutes versions PHP supérieures à la 4.1. 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 $_GET, $_POST, $_COOKIES, $_SERVER, $_ENV.&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 quand l&#039;option PHP &#039;&#039;&#039;register_globals&#039;&#039;&#039; est à off (recommandé par PHP) aussi bien que quand l&#039;option &#039;&#039;&#039;register_globals&#039;&#039;&#039; à on (par défaut sur de nombreuses installations).&lt;br /&gt;
&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;
&lt;br /&gt;
* Pas d&#039;utilisation de la variable &#039;&#039;&#039;PHP_SELF&#039;&#039;&#039;. Utiliser a la place $_SERVER[&amp;quot;PHP_SELF&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
* Quand plusieurs variables doivent être initialisées avec la même valeur, il faut utiliser plusieurs lignes&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$var1=1;$var2=1;$var3=1;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
plutôt que&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$var1=$var2=$var3=1;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
qui est moins performant.&lt;br /&gt;
&lt;br /&gt;
* Les chaines doivent être encadrées de simple quote et les variables sorties de la chaine.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
print &#039;Mon texte affiche ma &#039;.$variable.&#039; !&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Les commentaires doivent suivre la syntaxe C, ie un double antislash pour un commentaire d&#039;une ligne et utilisation slash-étoile pour ouvrir un bloc de plusieurs lignes&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/* Bloc de commentaire&lt;br /&gt;
 *&lt;br /&gt;
 * Fin du bloc&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
$monobjet = new MonObjet($db);&lt;br /&gt;
$result=$monobjet-&amp;gt;fetch($idobject);&lt;br /&gt;
&lt;br /&gt;
for ($i = 1 , $i &amp;lt; 2 ; $i++)&lt;br /&gt;
{&lt;br /&gt;
  // commentaire sur une ligne&lt;br /&gt;
  print $i;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Les 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;
&lt;br /&gt;
Les fonctions doivent retourner une valeure strictement &amp;gt; à 0 en cas de succès, et un nombre &amp;lt; à 0 en cas d&#039;erreur.&lt;br /&gt;
&lt;br /&gt;
= Normes SQL =&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;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT field_a, field_b, field_c FROM table_1 WHERE field_d = &#039;$id&#039;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Dans les requêtes SQL, on quote les champs mais pas les numériques qui contiennent des montants destinés à être stockés dans des champs de type double ou real. Les quotes sur les numériques de type float provoquent parfois un stockage d&#039;une valeur différente. Par exemple 412.62 dans le insert sera en fait stocké avec la valeur 412.61999512 en base si le champ est de type double(24,8). Et seul le PHP voit 412.61999512. Les autres outils verront 412.62 donnant l&#039;impression qu&#039;il n&#039;y a pas de problème. Et c&#039;est le PHP qui a raison, il y a problème en base. En supprimant les quotes sur les numériques, cela va mieux.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
Bon:     INSERT INTO table_1 (field_txt, field_num) VALUES (&#039;txt&#039;, 412.62)&lt;br /&gt;
Mauvais: INSERT INTO table_1 (field_txt, field_num) VALUES (&#039;txt&#039;, &#039;412.62&#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remarque, le pb 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;, &#039;MT&#039; ou &#039;MS&#039; 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;
Dans la pratique, afin d&#039;etre compatible avec toutes les précisions des pays, on utilisera les types suivants:&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;
&lt;br /&gt;
* Dolibarr doit fonctionner même avec l&#039;option &#039;&#039;&#039;strict&#039;&#039;&#039; de Mysql active.&lt;br /&gt;
Pour l&#039;activer, ajouter la ligne suivante dans le fichier config du serveur Mysql (my.cnf)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
sql-mode=&amp;quot;STRICT_ALL_TABLES&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Les fonctions NOW ou SYSDATE 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 et non du moteur de base de données. Ceci afin d&#039;avoir une meilleure portabilité du code mais surtout d&#039;avoir une gestion correcte des TimeZone.&lt;br /&gt;
&lt;br /&gt;
= Normes HTML =&lt;br /&gt;
&lt;br /&gt;
* Tous les attributs dans les balises HTML doivent être *en minuscule* et quotés avec des *doubles quote*.&lt;br /&gt;
&lt;br /&gt;
* Les liens href doivent être absolus en se basant sur la fonction dol_buildpath() pour obtenir un chemin absolu depuis un chemin relatif au répertoire htdocs. Pour les tags img, il faut faire appel à la fonction img_picto().&lt;br /&gt;
Par example:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
print &#039;&amp;lt;a href=&amp;quot;&#039;.dol_buildpath(&#039;/monrep/mapage.php&#039;).&#039;&amp;quot;&amp;gt;&#039;.img_picto(&#039;Texte alt&#039;,&#039;nompictopng&#039;,&#039;&#039;).&#039;&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Le javascript 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&amp;quot;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
if ($conf-&amp;gt;use_javascript)&lt;br /&gt;
{&lt;br /&gt;
...  // Le code php qui génère du javascript est ici&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Les popups windows ne doivent pas être utilisées, sauf pour des tooltips (et restent conditionnées par le point ci-dessus).&lt;br /&gt;
&lt;br /&gt;
* Les scripts externes sont écrits en Perl s&#039;ils ne peuvent l&#039;être en php, l&#039;utilisation d&#039;un autre langage n&#039;est pas interdit mais doit être discuté au préalable dans la mailing list des développeurs. Le langage devra être maitrisé par au moins 2 développeurs pour en assurer la maintenance.&lt;br /&gt;
&lt;br /&gt;
= Normes Dolibarr et squelettes de code =&lt;br /&gt;
&lt;br /&gt;
== Squelettes de code ==&lt;br /&gt;
Afin d&#039;uniformiser le code et d&#039;accélérer le développement de nouveaux composants dans Dolibarr, se trouvent dans le répertoire &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039;, 4 squelettes de code tout préparés.&lt;br /&gt;
&lt;br /&gt;
* 1 qui sert d&#039;exemple de descripteur de module: &#039;&#039;&#039;myModule.class.php&#039;&#039;&#039;&lt;br /&gt;
* 1 qui sert d&#039;exemple de code pour faire une nouvelle classe: &#039;&#039;&#039;skeleton_class.class.php&#039;&#039;&#039;&lt;br /&gt;
* 1 qui sert d&#039;exemple de code pour faire une nouvelle page: &#039;&#039;&#039;skeleton_page.php&#039;&#039;&#039;&lt;br /&gt;
* 1 qui sert d&#039;exemple de code pour faire un script à exécuter en ligne de commande: &#039;&#039;&#039;skeleton_script.php&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Servez-vous en comme exemple.&lt;br /&gt;
Notons que ces squelettes sont aussi utilisés par le générateur de code PHP qui est décrit dans la chapitre de développement de module Dolibarr pour accélérer vos développement.&lt;br /&gt;
&lt;br /&gt;
== Les dates et TimeZone ==&lt;br /&gt;
Dolibarr se veut une application multi-utilisateur et multi-localisation. Il convient donc de stocker les dates dans le bon format. Pour éviter les problèmes de conversion, les règles suivantes doivent être appliquées:&lt;br /&gt;
* Une date en mémoire doit être au format Timestamp GMT.&lt;br /&gt;
* Une date stockée en base de données contient le Timestamp issue de la date soumise dans la requête en heure &amp;lt;b&amp;gt;locale du serveur PHP&amp;lt;/b&amp;gt;. Cela ne concerne pas les dates mises à jour automatiquement par la base (champ &#039;&#039;&#039;tms&#039;&#039;&#039; en base).&lt;br /&gt;
Ainsi le 1er janvier 1970, 3 heures à Paris (TZ=+1) = 1er janvier 1970, 2 heures à Greenwich (TZ=0) sera stocké en mémoire par 7200 et sera soumis à la base de données avec la chaine &#039;19700101030000&#039; (PHP convertit en heure de son TZ et la base déconvertit avec son TZ qui est le même que celui de PHP).&lt;br /&gt;
&lt;br /&gt;
Les méthodes select doivent donc traduire les champs dates lus qui sont au format chaine TZ de la base (&#039;19700101030000&#039;) par appel de la méthode db-&amp;gt;jdate afin de récupérer une information en mémoire au format Timestamp GMT. Et les méthodes insert doivent lors de la génération de la requête convertir la date mémoire connue en variable, par la méthode db-&amp;gt;idate (Voir exemples générés par le squelette).&lt;br /&gt;
&lt;br /&gt;
* Les dates mises à jour automatiquement par la base (champ &#039;&#039;&#039;tms&#039;&#039;&#039; en base) contiennent le Timestamp où la modification est faite selon le timezone de la base de donnée. Les méthodes select récupèrent directement cette donnée en mémoire au format Timestamp GMT. Si le timezone de la base de donnée diffère de celui du PHP (un des 2 est mal réglé), il peut donc y avoir des écarts entre date de création et modification.&lt;br /&gt;
&lt;br /&gt;
== L&#039;encodage UTF8/ISO ==&lt;br /&gt;
Dolibarr stocke les informations de manière suivante:&lt;br /&gt;
* En base de donnée, les données sont en UTF8 ou ISO. Cela dépend du pagecode de la base, donc des options à la création de cette base. Dans tous les cas le driver d&#039;accès base Dolibarr (dans /lib/database) s&#039;arrange à la lecture et insertion pour convertir vers et depuis de l&#039;UTF8.&lt;br /&gt;
* Les données en mémoires sont donc stockées en UTF8 (instances d&#039;objets PHP).&lt;br /&gt;
* Les pages web affichées à l&#039;écran sont au format UTF8 (avec les versions &amp;lt; 2.5.1, c&#039;est le vieux paramètre $character_set du fichier conf.php qui définissait le format de sortie).&lt;br /&gt;
&lt;br /&gt;
== Les nombres réels, montants et calculs ==&lt;br /&gt;
En PHP comme dans d&#039;autres langages (Java par exemple), les données non entières (float, real, double) ne sont pas fiables.&lt;br /&gt;
Essayer de faire par exemple &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
print 239.2 - 229.3 - 9.9;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Vous n&#039;obtiendrez pas zéro mais un nombre très petit en puissance de 10 négative. Si vous obtenez zéro, vous pourrez trouvez d&#039;autres exemples qui ne fonctionnent pas.&lt;br /&gt;
Le problème des float est général, une variable résultante de calcul de nombre réels doit SYSTEMATIQUEMENT être nettoyée par la fonction price2num avec le 2eme paramètre renseigné à: &#039;MU&#039;, &#039;MT&#039; ou &#039;MS&#039; selon le besoin (voir doc fonction).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
print price2num(239.2 - 229.3 - 9.9, &#039;MT&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
S&#039;il ne s&#039;agit pas d&#039;un prix sur lequel s&#039;adapte les paramètres MU, MT ou MS, il faut utiliser la fonction &#039;&#039;&#039;round()&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Création de tables ==&lt;br /&gt;
Ne pas créer de table à l&#039;utilisation, c&#039;est-à-dire à la &#039;&#039;&#039;première utilisation&#039;&#039;&#039; du module.&lt;br /&gt;
Si vous créez un module qui utilise des tables qui ne sont pas intégrées en standard dans le code de Dolibarr, veillez à suivre le didacticiel Créer un 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;
== Logs ==&lt;br /&gt;
Ajouter des traces dans votre code avec la fonction&lt;br /&gt;
dolibarr_syslog($yourmessage, LOG_INFO|LOG_DEBUG|LOG_WARNING|LOG_ERR);&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;
DOL_DATA_ROOT.&#039;/monmodule&#039;.&lt;br /&gt;
Le répertoire peut être créé dans votre code à l&#039;exécution par le code suivant:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$mymoduledir=DOL_DATA_ROOT.&#039;/monmodule&#039;;&lt;br /&gt;
if (! is_dir($mymoduledir)) create_exdir($mymoduledir);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si vous avez besoin d&#039;un répertoire qui contiendra des données temporaires, ce répertoire doit être DOL_DATA_ROOT.&#039;/monmodule/temp&#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éfini par le Gang Of Four (voir la wikipédia sur les [[wikipedia:Patron de conception|Design patterns]]).&lt;br /&gt;
Pas de mise en oeuvre de design patterns de création particulier.&lt;br /&gt;
On trouve des objets proches des Singletons et Fabriques conforme à 100% dans l&#039;esprit mais pas dans la syntaxe, ceci afin d&#039;etre compatible avec le PHP 4 qui n&#039;est pas un langage objet complet.&lt;br /&gt;
&lt;br /&gt;
== Design patterns de Structure (GoF) ==&lt;br /&gt;
Design patterns défini par le Gang Of Four (voir la wikipédia sur les [[wikipedia:Patron de conception|Design patterns]]).&lt;br /&gt;
Pas de mise en oeuvre de design patterns de structure particulier.&lt;br /&gt;
&lt;br /&gt;
== Design patterns de Comportement (GoF) ==&lt;br /&gt;
Design patterns défini par le Gang Of Four (voir la wikipédia sur les [[wikipedia:Patron de conception|Design patterns]]).&lt;br /&gt;
Pas de mise en oeuvre de design patterns de comportement particulier.&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;
* Le &#039;&#039;&#039;Transaction Script&#039;&#039;&#039; (Le code est linéraire en fonction d&#039;une action utilisateur).&lt;br /&gt;
C&#039;est le motif à l&#039;ancienne utilisé dans les langages procéduraux.&lt;br /&gt;
Inconvénient: Redondance du code. Nécessité de connaitre le modèle physique pour développer les parties métiers.&lt;br /&gt;
* Le &#039;&#039;&#039;Domain Model&#039;&#039;&#039;&lt;br /&gt;
C&#039;est un concept possible depuis les langages objets. Ce sont les procédures métiers (qui doivent être identifiés avant) qui servent de bases pour les classes objets.&lt;br /&gt;
Inconvénient: Motif complexe à maintenir.&lt;br /&gt;
* Le &#039;&#039;&#039;Table Module&#039;&#039;&#039;&lt;br /&gt;
Un intermédiaire entre les 2 précédents où l&#039;on a une instance unique de classe par table de la base de données.&lt;br /&gt;
&lt;br /&gt;
-&amp;gt; Comme le montre les squelettes de code (voir point précédent), Dolibarr se base sur le principe du &#039;&#039;&#039;Table Module&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Communication Logique métier - Données (ORM) ===&lt;br /&gt;
Il existe 3 modes de liaisons:&lt;br /&gt;
* Le &#039;&#039;&#039;Table And Row Data Gateway&#039;&#039;&#039;&lt;br /&gt;
C&#039;est le plus simple. On crée une table par classe et chaque classe est un pont avec la table correspondante, voir une classe par ligne de table. Une instance de classe étant alors un enregistrement de la table. La classe ne contient que du code d&#039;accès aux lignes ou colonnes de tables. Le code métier doit alors être ajouté dans d&#039;autres classes. Les liens entre ces classes tables et les classes métiers devant être connues ou déduite de la connaissance du développeur.&lt;br /&gt;
&lt;br /&gt;
Exemple: C&#039;est le mode mis en oeuvre quand on utilise certains Frameworks d&#039;ORM comme &#039;&#039;&#039;iBatis&#039;&#039;&#039; (http://ibatis.apache.org/).&lt;br /&gt;
&lt;br /&gt;
* Le &#039;&#039;&#039;Active Record&#039;&#039;&#039;&lt;br /&gt;
Identique au précédent, mais on se permet d&#039;ajouter quelques fonctions métiers sur la classe, à conditions que ces fonctions soient propres à la table ou à l&#039;enregistrement. C&#039;est le pattern qui offre le meilleur rapport fonctionnalité/complexité.&lt;br /&gt;
&lt;br /&gt;
Exemple: C&#039;est le mode choisi pour les développements Dolibarr et de nombreuses autres applications PHP qui ont leur propre framework et pratiques de développements.&lt;br /&gt;
&lt;br /&gt;
* Le &#039;&#039;&#039;Data Mapper&#039;&#039;&#039;&lt;br /&gt;
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 plus complexe sur le plan pratique.&lt;br /&gt;
Exemple: C&#039;est le choix si on utilise le Framework d&#039;ORM &#039;&#039;&#039;Propel&#039;&#039;&#039; (http://propel.phpdb.org/trac/). On le trouve donc sur des applications plus lourdes basées sur cet ORM entre autres.&lt;br /&gt;
&lt;br /&gt;
-&amp;gt; Pour les développements Dolibarr, il est recommandé d&#039;utiliser le mode de liaison &#039;&#039;&#039;Active Record&#039;&#039;&#039; qui offre les avantages d&#039;un modèle proche du métier sans en avoir la complexité et sans trop masquer non plus la technique. C&#039;est dans ce mode que le développement, la compréhension du code et la maintenance technique et/ou fonctionnelle semble la plus productive (ceci est toutefois un éternel débat entre les puristes et les pragmatiques, débat dans lequel personne ne peut vraiment avoir raison, car tout dépend des objectifs à atteindre).&lt;/div&gt;</summary>
		<author><name>Gnovaro</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Lenguaje_y_Normas_de_Desarrollo&amp;diff=22131</id>
		<title>Lenguaje y Normas de Desarrollo</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Lenguaje_y_Normas_de_Desarrollo&amp;diff=22131"/>
		<updated>2011-06-08T20:48:32Z</updated>

		<summary type="html">&lt;p&gt;Gnovaro: /* Normas Archivos */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TemplateDocDesarrollo}}&lt;br /&gt;
&lt;br /&gt;
He aquí algunas normas sobre el lenguaje, la sintaxis y las norma de desarrollo en vigor para el proyecto Dolibarr:&lt;br /&gt;
&lt;br /&gt;
= Versiones =&lt;br /&gt;
&lt;br /&gt;
* Dolibarr debe funcionar con:&lt;br /&gt;
# Todos los SO (Windows, Linux, MACOS...)&lt;br /&gt;
# PHP 4.3 ó + (Debe funcionar sin ningún módulo PHP complementario, exceptuando los módulos de acceso a la base de datos).&lt;br /&gt;
# Mysql 3.1 ó +&lt;br /&gt;
&lt;br /&gt;
= Normas Archivos =&lt;br /&gt;
* Saltos de linea UNIX&lt;br /&gt;
* Espacios y tabs tabs (4 espacios)&lt;br /&gt;
&lt;br /&gt;
= Normas PHP =&lt;br /&gt;
&lt;br /&gt;
* Dolibarr está escrito en PHP y soporta todas las versiones de PHP superiores a la 4.1. Todos los archivos deben de contener la extensión .php&lt;br /&gt;
&lt;br /&gt;
* La llamada a las variables superglobales PHP deben pasar a través de los operadores dedicados $_GET, $_POST, $_COOKIES, $_SERVER, $_ENV.&lt;br /&gt;
Los otros operadores ($HTTP_SERVER_GET, ...) están siendo depreciados en el seno de PHP, no deben de ser ya utilizados. Por lo tanto, el código debe funcionar incluso cuando la opción &#039;&#039;&#039;register_long_arrays&#039;&#039;&#039; esté en off.&lt;br /&gt;
Además de que el código debe funcionar cuando la opción de PHP &#039;&#039;&#039;register_globals&#039;&#039;&#039; esté en off (recomendado por PHP), también lo deberá hacer cuando la opción &#039;&#039;&#039;register_globals&#039;&#039;&#039; esté en on (por defecto en muchas instalaciones).&lt;br /&gt;
&lt;br /&gt;
* Los smart tags PHP no són utilizados. Las secciones de código deben de empezar por &#039;&#039;&#039;&amp;lt;?php&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* No se permite el uso de la variable &#039;&#039;&#039;PHP_SELF&#039;&#039;&#039;. Utilice en su lugar $_SERVER[&amp;quot;PHP_SELF&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
* Cuando varias variables deben ser inicializadas con el mismo valor, utilize múltiples líneas&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$var1=1;$var2=1;$var3=1;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
en lugar de&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$var1=$var2=$var3=1;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
que es menos eficiente.&lt;br /&gt;
&lt;br /&gt;
* las cadenas deben de ser encuadradas con comillas simples y las variables sacadas de la cadena.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
print &#039;Mi texo muestra mi &#039;.$variable.&#039; !&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Los comentarios deben seguir la sintaxis de C, es decir, una doble barra invertida para una línea de comentario y el uso de una barra con arterisco para abrir un bloque de varias líneas&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/* Bloque de comentarios&lt;br /&gt;
 *&lt;br /&gt;
 * Fin el bloque&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;
  // comentario de una línea&lt;br /&gt;
  print $i;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Los ficheros deben ser guardados en formato Unix (LF) y no en formato Windows (CR/LF). El formato Unix es compatible con los SO Unix, Windows, Mac, mientras que el formato de archivo de texto de Windows es problemático en algunos PHP en Unix.&lt;br /&gt;
&lt;br /&gt;
Las funciones deben devolver &amp;gt;0 en caso de éxito, y un número &amp;lt;0 en caso de error.&lt;br /&gt;
A día de hoy, muy pocas funciones cumplen este standard, pero es necesario.&lt;br /&gt;
&lt;br /&gt;
= Normas SQL =&lt;br /&gt;
&lt;br /&gt;
* ¡Los SELECT * están prohibidos! Cada Select deberá especificar la lista completa de los campos para recuperar. Esto permitirá evitar confusiones. Ejemplo:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT field_a, field_b, field_c FROM table_1 WHERE field_d = &#039;$id&#039;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* En las consultas SQL, entrecomillaremos los campos, pero no los numéricos que contengan cantidades que se almacenen en los campos de tipo double o real. Los entrecomillados en los numéricos de tipo float se almacenan con un valor diferente. Por ejemplo 412.62 dentro del insert se guardara con el valor 412.61999512 en base si el campo es de tipo double(24,8). Y PHP sólo ve 412.61999512. Otras herramientas verán 412.62 dando la impresión de que no hay problemas. Y PHP tiene razón, hay un problema en base. Mediante la eliminación de las comillas en los numéricos, esto irá  mejor.&lt;br /&gt;
&lt;br /&gt;
Ejemplo:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
Bien:INSERT INTO table_1 (field_txt, field_num) VALUES (&#039;txt&#039;, 412.62)&lt;br /&gt;
Mal: INSERT INTO table_1 (field_txt, field_num) VALUES (&#039;txt&#039;, &#039;412.62&#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nota, el problema de los float es general y no sólamete en el acceso a la base de datos, está presente en todos los lenguajes cuando trabajamos sobre números reales, por lo que deberán ser limpiados por la función price2num con el segundo parámetro rellenado con:&lt;br /&gt;
&#039;MU&#039;, &#039;MT&#039; ó &#039;MS&#039; según sea necesario. Consulte el capítulo &amp;quot;Los números reales, importes y cálculos&amp;quot; más abajo.&lt;br /&gt;
&lt;br /&gt;
En la práctica, con la finalidad de set compatible con todas las precisiones de los paises, utilizaremos los siguientes tipos:&lt;br /&gt;
 - double(24,8) para cualquier importe&lt;br /&gt;
 - double(6,3) para las tasas de IVA&lt;br /&gt;
 - real para una cantidad&lt;br /&gt;
&lt;br /&gt;
* Dolibarr debe trabajar incluso con la opción &#039;&#039;&#039;strict&#039;&#039;&#039; de Mysql activa.&lt;br /&gt;
Para activarla, añada la siguiente línea en su archivo config del servidor MySql (my.cnf)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
sql-mode=&amp;quot;STRICT_ALL_TABLES&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* las funciones NOW ó SYSDATE están prohibidas en las órdenes de SQL. Si se necesita indicar la fecha del momento en un campo, el valor debe provenir de PHP y no del motor de la base de datos. Esto además de ofrecer una mejor portabilidad del código, también permite una gestión correcta de la zona horaria.&lt;br /&gt;
&lt;br /&gt;
= Normas HTML =&lt;br /&gt;
&lt;br /&gt;
* Todos los atributos de las etiquetas HTML deben de estar *en minúscula* y entrecomillados con *doble comilla*.&lt;br /&gt;
&lt;br /&gt;
* Los enlaces href deben de ser absolutos. para las páginas, basarse en la function dol_buildpath(). Para las imágenes basarse en la llamada de la función img_picto.&lt;br /&gt;
Por ejemplo:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
print &#039;&amp;lt;a href=&amp;quot;&#039;.dol_buildpath(&#039;/monrep/mapage.php&#039;).&#039;&amp;quot;&amp;gt;&#039;.img_picto(&#039;Texte alt&#039;,&#039;nompictopng&#039;,&#039;&#039;).&#039;&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Javascript y la llamada a scripts java en las páginas php está fuera de las normas. Si de todas maneras se incluye código javascript, debe estar condicionado mediante el test &amp;quot;$conf-&amp;gt;use_javascript&amp;quot;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
if ($conf-&amp;gt;use_javascript)&lt;br /&gt;
{&lt;br /&gt;
...  // El código PHP que genera el javascript va aquí&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Las ventanas emergentes  no deben de ser utilizadas, exceptuando los tooltips (y quedan condicionados por el punto anterior).&lt;br /&gt;
&lt;br /&gt;
* Los scripts externos son escritos en Perl si no pueden serlo en php, la utilización de otro lenguaje no está prohibido, pero debe de ser discutido priero en la lista de correo de desarrollo. El lenguaje debe de ser dominado al menos por 2 desarrolladores para asegurar el mantenimiento&lt;br /&gt;
&lt;br /&gt;
= Normas Dolibarr y plantillas de código =&lt;br /&gt;
&lt;br /&gt;
== Plantillas de código ==&lt;br /&gt;
Para estandarizar el código y acelerar el desarrollo de nuevos componentes en Dolibarr, en la carpeta &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039; encontraremos 4 plantillas de código preparadas.&lt;br /&gt;
&lt;br /&gt;
* 1 que sirve de ejemplo de descriptor de módulo: &#039;&#039;&#039;myModule.class.php&#039;&#039;&#039;&lt;br /&gt;
* 1 que sirve de ejemplo de código para crear una nueva clase: &#039;&#039;&#039;skeleton_class.class.php&#039;&#039;&#039;&lt;br /&gt;
* 1 que sirve de ejemplo de código para crear una nueva página: &#039;&#039;&#039;skeleton_page.php&#039;&#039;&#039;&lt;br /&gt;
* 1 que sirve de ejemplo de código para crear una nuevo script a ejecutar en línea de comandos: &#039;&#039;&#039;skeleton_script.php&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Úsenlas como ejemplo.&lt;br /&gt;
Tenga en cuenta que estas plantillas también son utilizadas por el generador de código PHP que se describe en el capítulo de Desarrollo de módulos Dolibarr módulo para acelerar su desarrollo.&lt;br /&gt;
&lt;br /&gt;
== Las fechas y la Zona Horaria ==&lt;br /&gt;
Dolibarr es una aplicación multi-usuario y multi-ubicación. Por lo tanto, es necesario almacenar las fechas en el formato correcto. Para evitar problemas de conversión, deben aplicarse las siguientes reglas:&lt;br /&gt;
* Una fecha en memoria debe de estar en formato Timestamp GMT.&lt;br /&gt;
* Una fecha guardada en la base de datos contiene el Timestamp GMT en relación con la fecha que figura en la consulta en hora local &amp;lt;b&amp;gt;del servidor PHP&amp;lt;/b&amp;gt;. No se trata de las fechas de actualización de la base de datos (campo &#039;&#039;&#039;tms&#039;&#039;&#039; en la base de datos).&lt;br /&gt;
Por lo tanto, el 1 de enero de 1970, a las 3 en París (TZ=+1) = las 2 en Greenwitch (TZ=0)  será almacenado en memora 7200 y será enviado a la base de datos con la cadena &#039;19700101030000&#039; (PHP convierte en hora de su TZ y la base de datos la deconvierte con su TZ que es la misma que la de PHP).&lt;br /&gt;
&lt;br /&gt;
Los métodos select deben traducir los campos fecha al formato de cadenta TZ de la base (&#039;19700101030000&#039;) mediante la llamada del método db-&amp;gt;jdate para recuperar la información en memoria en formato Timestamp GMT. Y los métodos insert deben deben generar la petición convirtiendo la fecha en memoria conocida en variable, mediante el método db-&amp;gt;idate (Ver ejemplos generados por la plantilla).&lt;br /&gt;
&lt;br /&gt;
* Las actualizaciones automáticas de la base de datos (campo &#039;&#039;&#039;tms&#039;&#039;&#039; en la base) contienen el Timestamp GMT del momento en que se ha realizado la modificación. Los métodos select recuperan directamente este dato en memoria en formato Timestamp GMT.&lt;br /&gt;
&lt;br /&gt;
== Codificación UTF8/ISO ==&lt;br /&gt;
Dolibarr guarda la información de la manera siguiente:&lt;br /&gt;
&lt;br /&gt;
* En la base de datos, los datos en UTF8 ó ISO. Esto depende del pagecode de la base de datos, y por lo tanto, de las opciones en la creación de esta base de datos. En todos los casos, el controlador de base de datos Dolibarr (dentro de /lib/database) lee e inserta por conversión desde y hacia UTF8.&lt;br /&gt;
* Los datos en memoria se guardan en UTF8 (instancias de objetos PHP).&lt;br /&gt;
* las páginas web mostradas en pantalla se encuentran en formato UTF8 (con versiones &amp;lt; 2.5.1, es el antiguo parámetro $character_set del fichero conf.php quien define el formato de salida).&lt;br /&gt;
&lt;br /&gt;
== Los números reales, importes y cálculos ==&lt;br /&gt;
Tanto en PHP como en otros lenguajes (Java, por ejemplo), los datos no enteros (float, real, double) no son fialbes.&lt;br /&gt;
Pruebe a realizar por ejemplo&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
print 239.2 - 229.3 - 9.9;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
No obtendrá 0, sino un número muy pequeño en potencia 10 negativo . Si obtiene cero, puede encontrar otros ejemplos que no funcionan.&lt;br /&gt;
El problema de los float es general, una variable resultante del cálculo de números reales debe SISTEMATICAMENTE ser limpiada mediante la función price2num con el segundo parámetro rellenado con: &#039;MU&#039;, &#039;MT&#039; ó &#039;MS&#039; según el caso (ver doc de la función).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
print price2num(239.2 - 229.3 - 9.9, &#039;MT&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;	&lt;br /&gt;
Si no es un precio que se ajuste a los parámetros de MU, MT, MS debe utilizar la función &#039;&#039;&#039;round()&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Creación de tablas ==&lt;br /&gt;
No crear una tabla a utilizar, es decir, al &#039;&#039;&#039;primer uso&#039;&#039;&#039; del módulo.&lt;br /&gt;
Si crea un módulo que usa tablas que no se incluyen como estándar en el código de Dolibarr, asegúrese de seguir el tutorial Creación de un módulo que explica cómo incluir las tablas que se crean en la activación del módulo y no en su uso (ver más arriba).&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
Añada traces dentro de su código mediante la función dolibarr_syslog($yourmessage, LOG_INFO|LOG_DEBUG|LOG_WARNING|LOG_ERR);&lt;br /&gt;
&lt;br /&gt;
== Carpetas de trabajo ==&lt;br /&gt;
Si tiene que crear una carpeta de trabajo, en el código, haga referencia a esta carpeta de la siguiente forma&lt;br /&gt;
DOL_DATA_ROOT.&#039;/mimodulo&#039;.&lt;br /&gt;
La carpeta puede crearse en desde su código mediante el código siguiente:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$mymoduledir=DOL_DATA_ROOT.&#039;/mimodulo&#039;;&lt;br /&gt;
if (! is_dir($mymoduledir)) create_exdir($mymoduledir);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si necesita una carpeta de datos temporales, esta carpeta deberá ser DOL_DATA_ROOT.&#039;/minmodulo/temp&#039;&lt;br /&gt;
&lt;br /&gt;
= Design patterns y programación con objetos =&lt;br /&gt;
== Design patterns Creacionales (GoF) ==&lt;br /&gt;
Design patterns definidos por el le Gang Of Four (ver la wikipedia sobre los [http://es.wikipedia.org/wiki/Patr%C3%B3n_de_dise%C3%B1o Design patterns]).&lt;br /&gt;
No hay design patterns creacionales particulares.&lt;br /&gt;
Hay objetos cercanos a los Singleton y creados conforme al 100% en el espíritu, pero no en la sintaxis, a fin de ser compatible con PHP 4 que no es un lenguaje orientado a objetos completo.&lt;br /&gt;
&lt;br /&gt;
== Design patterns Estructurales (GoF) ==&lt;br /&gt;
(ver la wikipedia sobre los [http://es.wikipedia.org/wiki/Patr%C3%B3n_de_dise%C3%B1o Design patterns]).&lt;br /&gt;
No hay design patterns estructurales particulares.&lt;br /&gt;
&lt;br /&gt;
== Design patterns de Comportamiento (GoF) ==&lt;br /&gt;
(ver la wikipedia sobre los [http://es.wikipedia.org/wiki/Patr%C3%B3n_de_dise%C3%B1o Design patterns]).&lt;br /&gt;
No hay design patterns de Comportamiento particulares.&lt;br /&gt;
&lt;br /&gt;
== Design patterns enterprise (Martin Fowler) ==&lt;br /&gt;
&lt;br /&gt;
=== Motivos de organización del código ===&lt;br /&gt;
&lt;br /&gt;
[[wikipedia:Martin Fowler|Martin Fowler]] ha identificado 3 métodos de organización de código llamados &#039;&#039;&#039;principios&#039;&#039;&#039;:&lt;br /&gt;
* El &#039;&#039;&#039;Transaction Script&#039;&#039;&#039; (El código es lineal en función de una acción del usuario).&lt;br /&gt;
Es el antiguo principio utilizado en los lenguajes de procedimiento.&lt;br /&gt;
Inconveniente: Redundancia de código. Necesidad de conocer el modelo físico a desarrollar.&lt;br /&gt;
* El &#039;&#039;&#039;Domain Model&#039;&#039;&#039;&lt;br /&gt;
Es un modelo posible desde los lenguajes orientados a objeto. Son procedimentos funcionales (que deben de ser indentificados antes) que sirven de base para las clases objeto.&lt;br /&gt;
Inconveniente: Motivo de mantenimiento complejo.&lt;br /&gt;
* El &#039;&#039;&#039;Table Module&#039;&#039;&#039;&lt;br /&gt;
Un intermedio entre los 2 anteriores donde se tiene una sola clase por tabla de la base de datos.&lt;br /&gt;
&lt;br /&gt;
-&amp;gt; Como se muestra en el código de la plantilla (ver sección anterior) Dolibarr se basa en el principio de &#039;&#039;&#039;Table Module&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Comunicación lógica de negociado - datos (ORM) ===&lt;br /&gt;
&lt;br /&gt;
Existen 3 tipos de conexiones:&lt;br /&gt;
* &#039;&#039;&#039;Data Gateway a tablas y filas&#039;&#039;&#039; &lt;br /&gt;
Es el más simple. Creamos una tabla por clase y cada clase es un puente con la tabla correspondiente, ver una clase por línea tabla. Una instancia de la clase será pues un registro de la tabla. La clase contiene sólo el código de acceso a líneas o columnas de tablas.&lt;br /&gt;
&lt;br /&gt;
Ejemplo: Es el método utilizado al utilizar ciertos Frameworks de ORM como &#039;&#039;&#039;iBatis&#039;&#039;&#039; (http://ibatis.apache.org/).&lt;br /&gt;
&lt;br /&gt;
* El &#039;&#039;&#039;Active Record&#039;&#039;&#039; &lt;br /&gt;
Idéntico al anterior, pero podemos añadir algunas funciones de negociado en la clase, siempre que estas funciones sean exclusivas de la tabla o la grabación.&lt;br /&gt;
&lt;br /&gt;
Ejemplo: Es el método utilizado por los desarrollos de Dolibarr y por otras muchas aplicaciones en PHP que disponen de su propio propio framework y prácticas de desarrollo.&lt;br /&gt;
&lt;br /&gt;
* El &#039;&#039;&#039;Data Mapper&#039;&#039;&#039;&lt;br /&gt;
Las clases representan las entidades del problema y no los datos. Por lo tanto hay que doblar, triplicar... estas clases con clases de mapeo para acceder a los datos.&lt;br /&gt;
Más &amp;quot;purista&amp;quot; en el papel ya que el negociado está más cercano, este método también tiene la desventaja de ser más complejo en la práctica.&lt;br /&gt;
Ejemplo: Es el utilizadao si utilizamos el Framework de ORM &#039;&#039;&#039;Propel&#039;&#039;&#039; (http://propel.phpdb.org/trac/). Lo encontraremos pues en aplicacciones más pesadas basadas en este ORM.&lt;br /&gt;
&lt;br /&gt;
-&amp;gt; Para los desarrollos de Dolibarr, es recomendado utilizar el modo &#039;&#039;&#039;Active Record &#039;&#039;&#039; que ofrece las ventajas de un modelo cercano de negociado sin la complejidad y sin dificultar mucho la técnica. Es en este modo mediante el cual el desarrollo, la comprensión del código y el mantenimiento técnico y/o funcional parece ser la más productivo (Sin embargo, se trata de un eterno debate entre los puristas y los pragmáticos, el debate en el que nadie puede realmente estar en lo cierto, porque todo depende de los objetivos a atender).&lt;/div&gt;</summary>
		<author><name>Gnovaro</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Lenguaje_y_Normas_de_Desarrollo&amp;diff=22130</id>
		<title>Lenguaje y Normas de Desarrollo</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Lenguaje_y_Normas_de_Desarrollo&amp;diff=22130"/>
		<updated>2011-06-08T20:47:35Z</updated>

		<summary type="html">&lt;p&gt;Gnovaro: Normas archivos&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TemplateDocDesarrollo}}&lt;br /&gt;
&lt;br /&gt;
He aquí algunas normas sobre el lenguaje, la sintaxis y las norma de desarrollo en vigor para el proyecto Dolibarr:&lt;br /&gt;
&lt;br /&gt;
= Versiones =&lt;br /&gt;
&lt;br /&gt;
* Dolibarr debe funcionar con:&lt;br /&gt;
# Todos los SO (Windows, Linux, MACOS...)&lt;br /&gt;
# PHP 4.3 ó + (Debe funcionar sin ningún módulo PHP complementario, exceptuando los módulos de acceso a la base de datos).&lt;br /&gt;
# Mysql 3.1 ó +&lt;br /&gt;
&lt;br /&gt;
= Normas Archivos =&lt;br /&gt;
* Saltos de linea&lt;br /&gt;
* Espacios y tabs&lt;br /&gt;
&lt;br /&gt;
= Normas PHP =&lt;br /&gt;
&lt;br /&gt;
* Dolibarr está escrito en PHP y soporta todas las versiones de PHP superiores a la 4.1. Todos los archivos deben de contener la extensión .php&lt;br /&gt;
&lt;br /&gt;
* La llamada a las variables superglobales PHP deben pasar a través de los operadores dedicados $_GET, $_POST, $_COOKIES, $_SERVER, $_ENV.&lt;br /&gt;
Los otros operadores ($HTTP_SERVER_GET, ...) están siendo depreciados en el seno de PHP, no deben de ser ya utilizados. Por lo tanto, el código debe funcionar incluso cuando la opción &#039;&#039;&#039;register_long_arrays&#039;&#039;&#039; esté en off.&lt;br /&gt;
Además de que el código debe funcionar cuando la opción de PHP &#039;&#039;&#039;register_globals&#039;&#039;&#039; esté en off (recomendado por PHP), también lo deberá hacer cuando la opción &#039;&#039;&#039;register_globals&#039;&#039;&#039; esté en on (por defecto en muchas instalaciones).&lt;br /&gt;
&lt;br /&gt;
* Los smart tags PHP no són utilizados. Las secciones de código deben de empezar por &#039;&#039;&#039;&amp;lt;?php&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* No se permite el uso de la variable &#039;&#039;&#039;PHP_SELF&#039;&#039;&#039;. Utilice en su lugar $_SERVER[&amp;quot;PHP_SELF&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
* Cuando varias variables deben ser inicializadas con el mismo valor, utilize múltiples líneas&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$var1=1;$var2=1;$var3=1;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
en lugar de&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$var1=$var2=$var3=1;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
que es menos eficiente.&lt;br /&gt;
&lt;br /&gt;
* las cadenas deben de ser encuadradas con comillas simples y las variables sacadas de la cadena.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
print &#039;Mi texo muestra mi &#039;.$variable.&#039; !&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Los comentarios deben seguir la sintaxis de C, es decir, una doble barra invertida para una línea de comentario y el uso de una barra con arterisco para abrir un bloque de varias líneas&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/* Bloque de comentarios&lt;br /&gt;
 *&lt;br /&gt;
 * Fin el bloque&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;
  // comentario de una línea&lt;br /&gt;
  print $i;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Los ficheros deben ser guardados en formato Unix (LF) y no en formato Windows (CR/LF). El formato Unix es compatible con los SO Unix, Windows, Mac, mientras que el formato de archivo de texto de Windows es problemático en algunos PHP en Unix.&lt;br /&gt;
&lt;br /&gt;
Las funciones deben devolver &amp;gt;0 en caso de éxito, y un número &amp;lt;0 en caso de error.&lt;br /&gt;
A día de hoy, muy pocas funciones cumplen este standard, pero es necesario.&lt;br /&gt;
&lt;br /&gt;
= Normas SQL =&lt;br /&gt;
&lt;br /&gt;
* ¡Los SELECT * están prohibidos! Cada Select deberá especificar la lista completa de los campos para recuperar. Esto permitirá evitar confusiones. Ejemplo:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT field_a, field_b, field_c FROM table_1 WHERE field_d = &#039;$id&#039;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* En las consultas SQL, entrecomillaremos los campos, pero no los numéricos que contengan cantidades que se almacenen en los campos de tipo double o real. Los entrecomillados en los numéricos de tipo float se almacenan con un valor diferente. Por ejemplo 412.62 dentro del insert se guardara con el valor 412.61999512 en base si el campo es de tipo double(24,8). Y PHP sólo ve 412.61999512. Otras herramientas verán 412.62 dando la impresión de que no hay problemas. Y PHP tiene razón, hay un problema en base. Mediante la eliminación de las comillas en los numéricos, esto irá  mejor.&lt;br /&gt;
&lt;br /&gt;
Ejemplo:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
Bien:INSERT INTO table_1 (field_txt, field_num) VALUES (&#039;txt&#039;, 412.62)&lt;br /&gt;
Mal: INSERT INTO table_1 (field_txt, field_num) VALUES (&#039;txt&#039;, &#039;412.62&#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nota, el problema de los float es general y no sólamete en el acceso a la base de datos, está presente en todos los lenguajes cuando trabajamos sobre números reales, por lo que deberán ser limpiados por la función price2num con el segundo parámetro rellenado con:&lt;br /&gt;
&#039;MU&#039;, &#039;MT&#039; ó &#039;MS&#039; según sea necesario. Consulte el capítulo &amp;quot;Los números reales, importes y cálculos&amp;quot; más abajo.&lt;br /&gt;
&lt;br /&gt;
En la práctica, con la finalidad de set compatible con todas las precisiones de los paises, utilizaremos los siguientes tipos:&lt;br /&gt;
 - double(24,8) para cualquier importe&lt;br /&gt;
 - double(6,3) para las tasas de IVA&lt;br /&gt;
 - real para una cantidad&lt;br /&gt;
&lt;br /&gt;
* Dolibarr debe trabajar incluso con la opción &#039;&#039;&#039;strict&#039;&#039;&#039; de Mysql activa.&lt;br /&gt;
Para activarla, añada la siguiente línea en su archivo config del servidor MySql (my.cnf)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
sql-mode=&amp;quot;STRICT_ALL_TABLES&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* las funciones NOW ó SYSDATE están prohibidas en las órdenes de SQL. Si se necesita indicar la fecha del momento en un campo, el valor debe provenir de PHP y no del motor de la base de datos. Esto además de ofrecer una mejor portabilidad del código, también permite una gestión correcta de la zona horaria.&lt;br /&gt;
&lt;br /&gt;
= Normas HTML =&lt;br /&gt;
&lt;br /&gt;
* Todos los atributos de las etiquetas HTML deben de estar *en minúscula* y entrecomillados con *doble comilla*.&lt;br /&gt;
&lt;br /&gt;
* Los enlaces href deben de ser absolutos. para las páginas, basarse en la function dol_buildpath(). Para las imágenes basarse en la llamada de la función img_picto.&lt;br /&gt;
Por ejemplo:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
print &#039;&amp;lt;a href=&amp;quot;&#039;.dol_buildpath(&#039;/monrep/mapage.php&#039;).&#039;&amp;quot;&amp;gt;&#039;.img_picto(&#039;Texte alt&#039;,&#039;nompictopng&#039;,&#039;&#039;).&#039;&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Javascript y la llamada a scripts java en las páginas php está fuera de las normas. Si de todas maneras se incluye código javascript, debe estar condicionado mediante el test &amp;quot;$conf-&amp;gt;use_javascript&amp;quot;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
if ($conf-&amp;gt;use_javascript)&lt;br /&gt;
{&lt;br /&gt;
...  // El código PHP que genera el javascript va aquí&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Las ventanas emergentes  no deben de ser utilizadas, exceptuando los tooltips (y quedan condicionados por el punto anterior).&lt;br /&gt;
&lt;br /&gt;
* Los scripts externos son escritos en Perl si no pueden serlo en php, la utilización de otro lenguaje no está prohibido, pero debe de ser discutido priero en la lista de correo de desarrollo. El lenguaje debe de ser dominado al menos por 2 desarrolladores para asegurar el mantenimiento&lt;br /&gt;
&lt;br /&gt;
= Normas Dolibarr y plantillas de código =&lt;br /&gt;
&lt;br /&gt;
== Plantillas de código ==&lt;br /&gt;
Para estandarizar el código y acelerar el desarrollo de nuevos componentes en Dolibarr, en la carpeta &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039; encontraremos 4 plantillas de código preparadas.&lt;br /&gt;
&lt;br /&gt;
* 1 que sirve de ejemplo de descriptor de módulo: &#039;&#039;&#039;myModule.class.php&#039;&#039;&#039;&lt;br /&gt;
* 1 que sirve de ejemplo de código para crear una nueva clase: &#039;&#039;&#039;skeleton_class.class.php&#039;&#039;&#039;&lt;br /&gt;
* 1 que sirve de ejemplo de código para crear una nueva página: &#039;&#039;&#039;skeleton_page.php&#039;&#039;&#039;&lt;br /&gt;
* 1 que sirve de ejemplo de código para crear una nuevo script a ejecutar en línea de comandos: &#039;&#039;&#039;skeleton_script.php&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Úsenlas como ejemplo.&lt;br /&gt;
Tenga en cuenta que estas plantillas también son utilizadas por el generador de código PHP que se describe en el capítulo de Desarrollo de módulos Dolibarr módulo para acelerar su desarrollo.&lt;br /&gt;
&lt;br /&gt;
== Las fechas y la Zona Horaria ==&lt;br /&gt;
Dolibarr es una aplicación multi-usuario y multi-ubicación. Por lo tanto, es necesario almacenar las fechas en el formato correcto. Para evitar problemas de conversión, deben aplicarse las siguientes reglas:&lt;br /&gt;
* Una fecha en memoria debe de estar en formato Timestamp GMT.&lt;br /&gt;
* Una fecha guardada en la base de datos contiene el Timestamp GMT en relación con la fecha que figura en la consulta en hora local &amp;lt;b&amp;gt;del servidor PHP&amp;lt;/b&amp;gt;. No se trata de las fechas de actualización de la base de datos (campo &#039;&#039;&#039;tms&#039;&#039;&#039; en la base de datos).&lt;br /&gt;
Por lo tanto, el 1 de enero de 1970, a las 3 en París (TZ=+1) = las 2 en Greenwitch (TZ=0)  será almacenado en memora 7200 y será enviado a la base de datos con la cadena &#039;19700101030000&#039; (PHP convierte en hora de su TZ y la base de datos la deconvierte con su TZ que es la misma que la de PHP).&lt;br /&gt;
&lt;br /&gt;
Los métodos select deben traducir los campos fecha al formato de cadenta TZ de la base (&#039;19700101030000&#039;) mediante la llamada del método db-&amp;gt;jdate para recuperar la información en memoria en formato Timestamp GMT. Y los métodos insert deben deben generar la petición convirtiendo la fecha en memoria conocida en variable, mediante el método db-&amp;gt;idate (Ver ejemplos generados por la plantilla).&lt;br /&gt;
&lt;br /&gt;
* Las actualizaciones automáticas de la base de datos (campo &#039;&#039;&#039;tms&#039;&#039;&#039; en la base) contienen el Timestamp GMT del momento en que se ha realizado la modificación. Los métodos select recuperan directamente este dato en memoria en formato Timestamp GMT.&lt;br /&gt;
&lt;br /&gt;
== Codificación UTF8/ISO ==&lt;br /&gt;
Dolibarr guarda la información de la manera siguiente:&lt;br /&gt;
&lt;br /&gt;
* En la base de datos, los datos en UTF8 ó ISO. Esto depende del pagecode de la base de datos, y por lo tanto, de las opciones en la creación de esta base de datos. En todos los casos, el controlador de base de datos Dolibarr (dentro de /lib/database) lee e inserta por conversión desde y hacia UTF8.&lt;br /&gt;
* Los datos en memoria se guardan en UTF8 (instancias de objetos PHP).&lt;br /&gt;
* las páginas web mostradas en pantalla se encuentran en formato UTF8 (con versiones &amp;lt; 2.5.1, es el antiguo parámetro $character_set del fichero conf.php quien define el formato de salida).&lt;br /&gt;
&lt;br /&gt;
== Los números reales, importes y cálculos ==&lt;br /&gt;
Tanto en PHP como en otros lenguajes (Java, por ejemplo), los datos no enteros (float, real, double) no son fialbes.&lt;br /&gt;
Pruebe a realizar por ejemplo&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
print 239.2 - 229.3 - 9.9;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
No obtendrá 0, sino un número muy pequeño en potencia 10 negativo . Si obtiene cero, puede encontrar otros ejemplos que no funcionan.&lt;br /&gt;
El problema de los float es general, una variable resultante del cálculo de números reales debe SISTEMATICAMENTE ser limpiada mediante la función price2num con el segundo parámetro rellenado con: &#039;MU&#039;, &#039;MT&#039; ó &#039;MS&#039; según el caso (ver doc de la función).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
print price2num(239.2 - 229.3 - 9.9, &#039;MT&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;	&lt;br /&gt;
Si no es un precio que se ajuste a los parámetros de MU, MT, MS debe utilizar la función &#039;&#039;&#039;round()&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Creación de tablas ==&lt;br /&gt;
No crear una tabla a utilizar, es decir, al &#039;&#039;&#039;primer uso&#039;&#039;&#039; del módulo.&lt;br /&gt;
Si crea un módulo que usa tablas que no se incluyen como estándar en el código de Dolibarr, asegúrese de seguir el tutorial Creación de un módulo que explica cómo incluir las tablas que se crean en la activación del módulo y no en su uso (ver más arriba).&lt;br /&gt;
&lt;br /&gt;
== Logs ==&lt;br /&gt;
Añada traces dentro de su código mediante la función dolibarr_syslog($yourmessage, LOG_INFO|LOG_DEBUG|LOG_WARNING|LOG_ERR);&lt;br /&gt;
&lt;br /&gt;
== Carpetas de trabajo ==&lt;br /&gt;
Si tiene que crear una carpeta de trabajo, en el código, haga referencia a esta carpeta de la siguiente forma&lt;br /&gt;
DOL_DATA_ROOT.&#039;/mimodulo&#039;.&lt;br /&gt;
La carpeta puede crearse en desde su código mediante el código siguiente:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$mymoduledir=DOL_DATA_ROOT.&#039;/mimodulo&#039;;&lt;br /&gt;
if (! is_dir($mymoduledir)) create_exdir($mymoduledir);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si necesita una carpeta de datos temporales, esta carpeta deberá ser DOL_DATA_ROOT.&#039;/minmodulo/temp&#039;&lt;br /&gt;
&lt;br /&gt;
= Design patterns y programación con objetos =&lt;br /&gt;
== Design patterns Creacionales (GoF) ==&lt;br /&gt;
Design patterns definidos por el le Gang Of Four (ver la wikipedia sobre los [http://es.wikipedia.org/wiki/Patr%C3%B3n_de_dise%C3%B1o Design patterns]).&lt;br /&gt;
No hay design patterns creacionales particulares.&lt;br /&gt;
Hay objetos cercanos a los Singleton y creados conforme al 100% en el espíritu, pero no en la sintaxis, a fin de ser compatible con PHP 4 que no es un lenguaje orientado a objetos completo.&lt;br /&gt;
&lt;br /&gt;
== Design patterns Estructurales (GoF) ==&lt;br /&gt;
(ver la wikipedia sobre los [http://es.wikipedia.org/wiki/Patr%C3%B3n_de_dise%C3%B1o Design patterns]).&lt;br /&gt;
No hay design patterns estructurales particulares.&lt;br /&gt;
&lt;br /&gt;
== Design patterns de Comportamiento (GoF) ==&lt;br /&gt;
(ver la wikipedia sobre los [http://es.wikipedia.org/wiki/Patr%C3%B3n_de_dise%C3%B1o Design patterns]).&lt;br /&gt;
No hay design patterns de Comportamiento particulares.&lt;br /&gt;
&lt;br /&gt;
== Design patterns enterprise (Martin Fowler) ==&lt;br /&gt;
&lt;br /&gt;
=== Motivos de organización del código ===&lt;br /&gt;
&lt;br /&gt;
[[wikipedia:Martin Fowler|Martin Fowler]] ha identificado 3 métodos de organización de código llamados &#039;&#039;&#039;principios&#039;&#039;&#039;:&lt;br /&gt;
* El &#039;&#039;&#039;Transaction Script&#039;&#039;&#039; (El código es lineal en función de una acción del usuario).&lt;br /&gt;
Es el antiguo principio utilizado en los lenguajes de procedimiento.&lt;br /&gt;
Inconveniente: Redundancia de código. Necesidad de conocer el modelo físico a desarrollar.&lt;br /&gt;
* El &#039;&#039;&#039;Domain Model&#039;&#039;&#039;&lt;br /&gt;
Es un modelo posible desde los lenguajes orientados a objeto. Son procedimentos funcionales (que deben de ser indentificados antes) que sirven de base para las clases objeto.&lt;br /&gt;
Inconveniente: Motivo de mantenimiento complejo.&lt;br /&gt;
* El &#039;&#039;&#039;Table Module&#039;&#039;&#039;&lt;br /&gt;
Un intermedio entre los 2 anteriores donde se tiene una sola clase por tabla de la base de datos.&lt;br /&gt;
&lt;br /&gt;
-&amp;gt; Como se muestra en el código de la plantilla (ver sección anterior) Dolibarr se basa en el principio de &#039;&#039;&#039;Table Module&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Comunicación lógica de negociado - datos (ORM) ===&lt;br /&gt;
&lt;br /&gt;
Existen 3 tipos de conexiones:&lt;br /&gt;
* &#039;&#039;&#039;Data Gateway a tablas y filas&#039;&#039;&#039; &lt;br /&gt;
Es el más simple. Creamos una tabla por clase y cada clase es un puente con la tabla correspondiente, ver una clase por línea tabla. Una instancia de la clase será pues un registro de la tabla. La clase contiene sólo el código de acceso a líneas o columnas de tablas.&lt;br /&gt;
&lt;br /&gt;
Ejemplo: Es el método utilizado al utilizar ciertos Frameworks de ORM como &#039;&#039;&#039;iBatis&#039;&#039;&#039; (http://ibatis.apache.org/).&lt;br /&gt;
&lt;br /&gt;
* El &#039;&#039;&#039;Active Record&#039;&#039;&#039; &lt;br /&gt;
Idéntico al anterior, pero podemos añadir algunas funciones de negociado en la clase, siempre que estas funciones sean exclusivas de la tabla o la grabación.&lt;br /&gt;
&lt;br /&gt;
Ejemplo: Es el método utilizado por los desarrollos de Dolibarr y por otras muchas aplicaciones en PHP que disponen de su propio propio framework y prácticas de desarrollo.&lt;br /&gt;
&lt;br /&gt;
* El &#039;&#039;&#039;Data Mapper&#039;&#039;&#039;&lt;br /&gt;
Las clases representan las entidades del problema y no los datos. Por lo tanto hay que doblar, triplicar... estas clases con clases de mapeo para acceder a los datos.&lt;br /&gt;
Más &amp;quot;purista&amp;quot; en el papel ya que el negociado está más cercano, este método también tiene la desventaja de ser más complejo en la práctica.&lt;br /&gt;
Ejemplo: Es el utilizadao si utilizamos el Framework de ORM &#039;&#039;&#039;Propel&#039;&#039;&#039; (http://propel.phpdb.org/trac/). Lo encontraremos pues en aplicacciones más pesadas basadas en este ORM.&lt;br /&gt;
&lt;br /&gt;
-&amp;gt; Para los desarrollos de Dolibarr, es recomendado utilizar el modo &#039;&#039;&#039;Active Record &#039;&#039;&#039; que ofrece las ventajas de un modelo cercano de negociado sin la complejidad y sin dificultar mucho la técnica. Es en este modo mediante el cual el desarrollo, la comprensión del código y el mantenimiento técnico y/o funcional parece ser la más productivo (Sin embargo, se trata de un eterno debate entre los puristas y los pragmáticos, el debate en el que nadie puede realmente estar en lo cierto, porque todo depende de los objetivos a atender).&lt;/div&gt;</summary>
		<author><name>Gnovaro</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Langages_et_normes&amp;diff=22129</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=22129"/>
		<updated>2011-06-08T20:46:13Z</updated>

		<summary type="html">&lt;p&gt;Gnovaro: add Normes Fichiers&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TemplateDocDev}}&lt;br /&gt;
&lt;br /&gt;
Voici les quelques règles sur le langage, la syntaxe et normes de développement en vigueur pour le projet Dolibarr:&lt;br /&gt;
&lt;br /&gt;
= Versions =&lt;br /&gt;
&lt;br /&gt;
* Dolibarr doit fonctionner sur:&lt;br /&gt;
# Tous OS (Windows, Linux, MACOS...)&lt;br /&gt;
# PHP 4.3 ou + (Doit fonctionner sans aucun module PHP complémentaire hors les modules d&#039;accès base de donnée).&lt;br /&gt;
# Mysql 3.1 ou +&lt;br /&gt;
&lt;br /&gt;
= Normes Fichiers =&lt;br /&gt;
* Retours à la ligne&lt;br /&gt;
* Les espaces et les onglets&lt;br /&gt;
&lt;br /&gt;
= Normes PHP =&lt;br /&gt;
&lt;br /&gt;
* Dolibarr est écrit en PHP et supporte toutes versions PHP supérieures à la 4.1. 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 $_GET, $_POST, $_COOKIES, $_SERVER, $_ENV.&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 quand l&#039;option PHP &#039;&#039;&#039;register_globals&#039;&#039;&#039; est à off (recommandé par PHP) aussi bien que quand l&#039;option &#039;&#039;&#039;register_globals&#039;&#039;&#039; à on (par défaut sur de nombreuses installations).&lt;br /&gt;
&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;
&lt;br /&gt;
* Pas d&#039;utilisation de la variable &#039;&#039;&#039;PHP_SELF&#039;&#039;&#039;. Utiliser a la place $_SERVER[&amp;quot;PHP_SELF&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
* Quand plusieurs variables doivent être initialisées avec la même valeur, il faut utiliser plusieurs lignes&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$var1=1;$var2=1;$var3=1;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
plutôt que&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$var1=$var2=$var3=1;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
qui est moins performant.&lt;br /&gt;
&lt;br /&gt;
* Les chaines doivent être encadrées de simple quote et les variables sorties de la chaine.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
print &#039;Mon texte affiche ma &#039;.$variable.&#039; !&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Les commentaires doivent suivre la syntaxe C, ie un double antislash pour un commentaire d&#039;une ligne et utilisation slash-étoile pour ouvrir un bloc de plusieurs lignes&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
/* Bloc de commentaire&lt;br /&gt;
 *&lt;br /&gt;
 * Fin du bloc&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
$monobjet = new MonObjet($db);&lt;br /&gt;
$result=$monobjet-&amp;gt;fetch($idobject);&lt;br /&gt;
&lt;br /&gt;
for ($i = 1 , $i &amp;lt; 2 ; $i++)&lt;br /&gt;
{&lt;br /&gt;
  // commentaire sur une ligne&lt;br /&gt;
  print $i;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Les 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;
&lt;br /&gt;
Les fonctions doivent retourner une valeure strictement &amp;gt; à 0 en cas de succès, et un nombre &amp;lt; à 0 en cas d&#039;erreur.&lt;br /&gt;
&lt;br /&gt;
= Normes SQL =&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;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT field_a, field_b, field_c FROM table_1 WHERE field_d = &#039;$id&#039;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Dans les requêtes SQL, on quote les champs mais pas les numériques qui contiennent des montants destinés à être stockés dans des champs de type double ou real. Les quotes sur les numériques de type float provoquent parfois un stockage d&#039;une valeur différente. Par exemple 412.62 dans le insert sera en fait stocké avec la valeur 412.61999512 en base si le champ est de type double(24,8). Et seul le PHP voit 412.61999512. Les autres outils verront 412.62 donnant l&#039;impression qu&#039;il n&#039;y a pas de problème. Et c&#039;est le PHP qui a raison, il y a problème en base. En supprimant les quotes sur les numériques, cela va mieux.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
Bon:     INSERT INTO table_1 (field_txt, field_num) VALUES (&#039;txt&#039;, 412.62)&lt;br /&gt;
Mauvais: INSERT INTO table_1 (field_txt, field_num) VALUES (&#039;txt&#039;, &#039;412.62&#039;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remarque, le pb 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;, &#039;MT&#039; ou &#039;MS&#039; 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;
Dans la pratique, afin d&#039;etre compatible avec toutes les précisions des pays, on utilisera les types suivants:&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;
&lt;br /&gt;
* Dolibarr doit fonctionner même avec l&#039;option &#039;&#039;&#039;strict&#039;&#039;&#039; de Mysql active.&lt;br /&gt;
Pour l&#039;activer, ajouter la ligne suivante dans le fichier config du serveur Mysql (my.cnf)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
sql-mode=&amp;quot;STRICT_ALL_TABLES&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Les fonctions NOW ou SYSDATE 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 et non du moteur de base de données. Ceci afin d&#039;avoir une meilleure portabilité du code mais surtout d&#039;avoir une gestion correcte des TimeZone.&lt;br /&gt;
&lt;br /&gt;
= Normes HTML =&lt;br /&gt;
&lt;br /&gt;
* Tous les attributs dans les balises HTML doivent être *en minuscule* et quotés avec des *doubles quote*.&lt;br /&gt;
&lt;br /&gt;
* Les liens href doivent être absolus en se basant sur la fonction dol_buildpath() pour obtenir un chemin absolu depuis un chemin relatif au répertoire htdocs. Pour les tags img, il faut faire appel à la fonction img_picto().&lt;br /&gt;
Par example:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
print &#039;&amp;lt;a href=&amp;quot;&#039;.dol_buildpath(&#039;/monrep/mapage.php&#039;).&#039;&amp;quot;&amp;gt;&#039;.img_picto(&#039;Texte alt&#039;,&#039;nompictopng&#039;,&#039;&#039;).&#039;&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Le javascript 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&amp;quot;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
if ($conf-&amp;gt;use_javascript)&lt;br /&gt;
{&lt;br /&gt;
...  // Le code php qui génère du javascript est ici&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Les popups windows ne doivent pas être utilisées, sauf pour des tooltips (et restent conditionnées par le point ci-dessus).&lt;br /&gt;
&lt;br /&gt;
* Les scripts externes sont écrits en Perl s&#039;ils ne peuvent l&#039;être en php, l&#039;utilisation d&#039;un autre langage n&#039;est pas interdit mais doit être discuté au préalable dans la mailing list des développeurs. Le langage devra être maitrisé par au moins 2 développeurs pour en assurer la maintenance.&lt;br /&gt;
&lt;br /&gt;
= Normes Dolibarr et squelettes de code =&lt;br /&gt;
&lt;br /&gt;
== Squelettes de code ==&lt;br /&gt;
Afin d&#039;uniformiser le code et d&#039;accélérer le développement de nouveaux composants dans Dolibarr, se trouvent dans le répertoire &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039;, 4 squelettes de code tout préparés.&lt;br /&gt;
&lt;br /&gt;
* 1 qui sert d&#039;exemple de descripteur de module: &#039;&#039;&#039;myModule.class.php&#039;&#039;&#039;&lt;br /&gt;
* 1 qui sert d&#039;exemple de code pour faire une nouvelle classe: &#039;&#039;&#039;skeleton_class.class.php&#039;&#039;&#039;&lt;br /&gt;
* 1 qui sert d&#039;exemple de code pour faire une nouvelle page: &#039;&#039;&#039;skeleton_page.php&#039;&#039;&#039;&lt;br /&gt;
* 1 qui sert d&#039;exemple de code pour faire un script à exécuter en ligne de commande: &#039;&#039;&#039;skeleton_script.php&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Servez-vous en comme exemple.&lt;br /&gt;
Notons que ces squelettes sont aussi utilisés par le générateur de code PHP qui est décrit dans la chapitre de développement de module Dolibarr pour accélérer vos développement.&lt;br /&gt;
&lt;br /&gt;
== Les dates et TimeZone ==&lt;br /&gt;
Dolibarr se veut une application multi-utilisateur et multi-localisation. Il convient donc de stocker les dates dans le bon format. Pour éviter les problèmes de conversion, les règles suivantes doivent être appliquées:&lt;br /&gt;
* Une date en mémoire doit être au format Timestamp GMT.&lt;br /&gt;
* Une date stockée en base de données contient le Timestamp issue de la date soumise dans la requête en heure &amp;lt;b&amp;gt;locale du serveur PHP&amp;lt;/b&amp;gt;. Cela ne concerne pas les dates mises à jour automatiquement par la base (champ &#039;&#039;&#039;tms&#039;&#039;&#039; en base).&lt;br /&gt;
Ainsi le 1er janvier 1970, 3 heures à Paris (TZ=+1) = 1er janvier 1970, 2 heures à Greenwich (TZ=0) sera stocké en mémoire par 7200 et sera soumis à la base de données avec la chaine &#039;19700101030000&#039; (PHP convertit en heure de son TZ et la base déconvertit avec son TZ qui est le même que celui de PHP).&lt;br /&gt;
&lt;br /&gt;
Les méthodes select doivent donc traduire les champs dates lus qui sont au format chaine TZ de la base (&#039;19700101030000&#039;) par appel de la méthode db-&amp;gt;jdate afin de récupérer une information en mémoire au format Timestamp GMT. Et les méthodes insert doivent lors de la génération de la requête convertir la date mémoire connue en variable, par la méthode db-&amp;gt;idate (Voir exemples générés par le squelette).&lt;br /&gt;
&lt;br /&gt;
* Les dates mises à jour automatiquement par la base (champ &#039;&#039;&#039;tms&#039;&#039;&#039; en base) contiennent le Timestamp où la modification est faite selon le timezone de la base de donnée. Les méthodes select récupèrent directement cette donnée en mémoire au format Timestamp GMT. Si le timezone de la base de donnée diffère de celui du PHP (un des 2 est mal réglé), il peut donc y avoir des écarts entre date de création et modification.&lt;br /&gt;
&lt;br /&gt;
== L&#039;encodage UTF8/ISO ==&lt;br /&gt;
Dolibarr stocke les informations de manière suivante:&lt;br /&gt;
* En base de donnée, les données sont en UTF8 ou ISO. Cela dépend du pagecode de la base, donc des options à la création de cette base. Dans tous les cas le driver d&#039;accès base Dolibarr (dans /lib/database) s&#039;arrange à la lecture et insertion pour convertir vers et depuis de l&#039;UTF8.&lt;br /&gt;
* Les données en mémoires sont donc stockées en UTF8 (instances d&#039;objets PHP).&lt;br /&gt;
* Les pages web affichées à l&#039;écran sont au format UTF8 (avec les versions &amp;lt; 2.5.1, c&#039;est le vieux paramètre $character_set du fichier conf.php qui définissait le format de sortie).&lt;br /&gt;
&lt;br /&gt;
== Les nombres réels, montants et calculs ==&lt;br /&gt;
En PHP comme dans d&#039;autres langages (Java par exemple), les données non entières (float, real, double) ne sont pas fiables.&lt;br /&gt;
Essayer de faire par exemple &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
print 239.2 - 229.3 - 9.9;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Vous n&#039;obtiendrez pas zéro mais un nombre très petit en puissance de 10 négative. Si vous obtenez zéro, vous pourrez trouvez d&#039;autres exemples qui ne fonctionnent pas.&lt;br /&gt;
Le problème des float est général, une variable résultante de calcul de nombre réels doit SYSTEMATIQUEMENT être nettoyée par la fonction price2num avec le 2eme paramètre renseigné à: &#039;MU&#039;, &#039;MT&#039; ou &#039;MS&#039; selon le besoin (voir doc fonction).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
print price2num(239.2 - 229.3 - 9.9, &#039;MT&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
S&#039;il ne s&#039;agit pas d&#039;un prix sur lequel s&#039;adapte les paramètres MU, MT ou MS, il faut utiliser la fonction &#039;&#039;&#039;round()&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Création de tables ==&lt;br /&gt;
Ne pas créer de table à l&#039;utilisation, c&#039;est-à-dire à la &#039;&#039;&#039;première utilisation&#039;&#039;&#039; du module.&lt;br /&gt;
Si vous créez un module qui utilise des tables qui ne sont pas intégrées en standard dans le code de Dolibarr, veillez à suivre le didacticiel Créer un 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;
== Logs ==&lt;br /&gt;
Ajouter des traces dans votre code avec la fonction&lt;br /&gt;
dolibarr_syslog($yourmessage, LOG_INFO|LOG_DEBUG|LOG_WARNING|LOG_ERR);&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;
DOL_DATA_ROOT.&#039;/monmodule&#039;.&lt;br /&gt;
Le répertoire peut être créé dans votre code à l&#039;exécution par le code suivant:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$mymoduledir=DOL_DATA_ROOT.&#039;/monmodule&#039;;&lt;br /&gt;
if (! is_dir($mymoduledir)) create_exdir($mymoduledir);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si vous avez besoin d&#039;un répertoire qui contiendra des données temporaires, ce répertoire doit être DOL_DATA_ROOT.&#039;/monmodule/temp&#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éfini par le Gang Of Four (voir la wikipédia sur les [[wikipedia:Patron de conception|Design patterns]]).&lt;br /&gt;
Pas de mise en oeuvre de design patterns de création particulier.&lt;br /&gt;
On trouve des objets proches des Singletons et Fabriques conforme à 100% dans l&#039;esprit mais pas dans la syntaxe, ceci afin d&#039;etre compatible avec le PHP 4 qui n&#039;est pas un langage objet complet.&lt;br /&gt;
&lt;br /&gt;
== Design patterns de Structure (GoF) ==&lt;br /&gt;
Design patterns défini par le Gang Of Four (voir la wikipédia sur les [[wikipedia:Patron de conception|Design patterns]]).&lt;br /&gt;
Pas de mise en oeuvre de design patterns de structure particulier.&lt;br /&gt;
&lt;br /&gt;
== Design patterns de Comportement (GoF) ==&lt;br /&gt;
Design patterns défini par le Gang Of Four (voir la wikipédia sur les [[wikipedia:Patron de conception|Design patterns]]).&lt;br /&gt;
Pas de mise en oeuvre de design patterns de comportement particulier.&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;
* Le &#039;&#039;&#039;Transaction Script&#039;&#039;&#039; (Le code est linéraire en fonction d&#039;une action utilisateur).&lt;br /&gt;
C&#039;est le motif à l&#039;ancienne utilisé dans les langages procéduraux.&lt;br /&gt;
Inconvénient: Redondance du code. Nécessité de connaitre le modèle physique pour développer les parties métiers.&lt;br /&gt;
* Le &#039;&#039;&#039;Domain Model&#039;&#039;&#039;&lt;br /&gt;
C&#039;est un concept possible depuis les langages objets. Ce sont les procédures métiers (qui doivent être identifiés avant) qui servent de bases pour les classes objets.&lt;br /&gt;
Inconvénient: Motif complexe à maintenir.&lt;br /&gt;
* Le &#039;&#039;&#039;Table Module&#039;&#039;&#039;&lt;br /&gt;
Un intermédiaire entre les 2 précédents où l&#039;on a une instance unique de classe par table de la base de données.&lt;br /&gt;
&lt;br /&gt;
-&amp;gt; Comme le montre les squelettes de code (voir point précédent), Dolibarr se base sur le principe du &#039;&#039;&#039;Table Module&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Communication Logique métier - Données (ORM) ===&lt;br /&gt;
Il existe 3 modes de liaisons:&lt;br /&gt;
* Le &#039;&#039;&#039;Table And Row Data Gateway&#039;&#039;&#039;&lt;br /&gt;
C&#039;est le plus simple. On crée une table par classe et chaque classe est un pont avec la table correspondante, voir une classe par ligne de table. Une instance de classe étant alors un enregistrement de la table. La classe ne contient que du code d&#039;accès aux lignes ou colonnes de tables. Le code métier doit alors être ajouté dans d&#039;autres classes. Les liens entre ces classes tables et les classes métiers devant être connues ou déduite de la connaissance du développeur.&lt;br /&gt;
&lt;br /&gt;
Exemple: C&#039;est le mode mis en oeuvre quand on utilise certains Frameworks d&#039;ORM comme &#039;&#039;&#039;iBatis&#039;&#039;&#039; (http://ibatis.apache.org/).&lt;br /&gt;
&lt;br /&gt;
* Le &#039;&#039;&#039;Active Record&#039;&#039;&#039;&lt;br /&gt;
Identique au précédent, mais on se permet d&#039;ajouter quelques fonctions métiers sur la classe, à conditions que ces fonctions soient propres à la table ou à l&#039;enregistrement. C&#039;est le pattern qui offre le meilleur rapport fonctionnalité/complexité.&lt;br /&gt;
&lt;br /&gt;
Exemple: C&#039;est le mode choisi pour les développements Dolibarr et de nombreuses autres applications PHP qui ont leur propre framework et pratiques de développements.&lt;br /&gt;
&lt;br /&gt;
* Le &#039;&#039;&#039;Data Mapper&#039;&#039;&#039;&lt;br /&gt;
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 plus complexe sur le plan pratique.&lt;br /&gt;
Exemple: C&#039;est le choix si on utilise le Framework d&#039;ORM &#039;&#039;&#039;Propel&#039;&#039;&#039; (http://propel.phpdb.org/trac/). On le trouve donc sur des applications plus lourdes basées sur cet ORM entre autres.&lt;br /&gt;
&lt;br /&gt;
-&amp;gt; Pour les développements Dolibarr, il est recommandé d&#039;utiliser le mode de liaison &#039;&#039;&#039;Active Record&#039;&#039;&#039; qui offre les avantages d&#039;un modèle proche du métier sans en avoir la complexité et sans trop masquer non plus la technique. C&#039;est dans ce mode que le développement, la compréhension du code et la maintenance technique et/ou fonctionnelle semble la plus productive (ceci est toutefois un éternel débat entre les puristes et les pragmatiques, débat dans lequel personne ne peut vraiment avoir raison, car tout dépend des objectifs à atteindre).&lt;/div&gt;</summary>
		<author><name>Gnovaro</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Configuration_par_statut&amp;diff=21810</id>
		<title>Configuration par statut</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Configuration_par_statut&amp;diff=21810"/>
		<updated>2011-05-02T19:59:53Z</updated>

		<summary type="html">&lt;p&gt;Gnovaro: Se agrega informacion de las socieades de argentina&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Administrative]]&lt;br /&gt;
&lt;br /&gt;
{{Flag en}} This page describes main status for organizations or companies, by country, and the Dolibarr setup you should use.&lt;br /&gt;
&lt;br /&gt;
{{Flag fr}} Cette page décrit les principaux statuts d&#039;institutions/sociétés par pays ainsi que le paramétrage à suivre dans Dolibarr.&lt;br /&gt;
&lt;br /&gt;
{{flag sp}} Esta página describe los principales estatutos de empresas/instituciones por país, así como la configuración a seguir en Dolibarr.&lt;br /&gt;
&lt;br /&gt;
= {{Flag fr}} France =&lt;br /&gt;
&lt;br /&gt;
En italique, les informations à vérifier (non confirmées).&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center; width:80%;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=col | Statut juridique&lt;br /&gt;
! scope=col | Création&lt;br /&gt;
! scope=col | Conditions&lt;br /&gt;
! scope=col | Choix BNC&lt;br /&gt;
! scope=col | Choix TVA&lt;br /&gt;
! scope=col | Impots Sociétés &lt;br /&gt;
ou Impots revenus (BIC/BNC)&lt;br /&gt;
! scope=col | Charges TVA&lt;br /&gt;
! scope=col | Taxes pro&lt;br /&gt;
! scope=col | Bilan compta&lt;br /&gt;
! scope=col | Rem&lt;br /&gt;
! scope=col | Param Dolibarr&lt;br /&gt;
|-&lt;br /&gt;
! scope=row | Indépendant/Libéral en micro entreprise&lt;br /&gt;
|Formulaire URSSAF sur http://www.cfe.urssaf.fr&lt;br /&gt;
|CA &amp;lt; 32K EUR pour services&lt;br /&gt;
&amp;lt; 80K EUR pour produits&lt;br /&gt;
|Régime déclaratif spécial&lt;br /&gt;
|TVA en franchise&lt;br /&gt;
|Revenu à mettre sur décla 2042P en zone BNC avec &lt;br /&gt;
décla impot 2042.&lt;br /&gt;
Montant impots = (CA - 25% de forfait de charges) sur barème&lt;br /&gt;
impôt revenu (en plus autres revenus perso).&lt;br /&gt;
|Pas de décla et pas de paiement TVA&lt;br /&gt;
|Taxe pro&lt;br /&gt;
&#039;&#039;Déclaration ?&#039;&#039;&lt;br /&gt;
|?&lt;br /&gt;
|Mention sur factures&lt;br /&gt;
&amp;quot;TVA non applicable, article 293 B du CGI&amp;quot;&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
! scope=row | Indépentant/Libéral&lt;br /&gt;
|Formulaire URSSAF sur http://www.cfe.urssaf.fr&lt;br /&gt;
|CA &amp;gt; 32K et &amp;lt; 230K EUR pour services&lt;br /&gt;
&lt;br /&gt;
CA &amp;gt; 80K et &amp;lt; 763K EUR pour produits&lt;br /&gt;
|Régime déclaratif contrôlé&lt;br /&gt;
|TVA simplifié &lt;br /&gt;
|Déclaration revenus pro http://www.net-entreprises.fr (&amp;lt; 1er mai)&lt;br /&gt;
|???&lt;br /&gt;
|Taxe pro&lt;br /&gt;
&#039;&#039;Déclaration ?&#039;&#039;&lt;br /&gt;
|?&lt;br /&gt;
|Obligation d&#039;accepter les chèques si membre d&#039;une AGA&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
! scope=row |Autoentrepreneur&lt;br /&gt;
|En ligne sur http://www.lautoentrepreneur.fr&lt;br /&gt;
|?&lt;br /&gt;
|Régime déclaratif spécial&lt;br /&gt;
|TVA en franchise&lt;br /&gt;
|Déclaration trimestrielle ou mensuelle revenus pro&lt;br /&gt;
sur http://www.lautoentrepreneur.fr&lt;br /&gt;
|Pas de décla et pas de paiement TVA&lt;br /&gt;
|?&lt;br /&gt;
|?&lt;br /&gt;
|Mention sur factures&lt;br /&gt;
&amp;quot;TVA non applicable, article 293 B du CGI&amp;quot;&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
! scope=row |Profession libérale médicale (médecin)&lt;br /&gt;
|Formulaire Cerfa dépendant de profession à la DDASS pour numéro ADELI&lt;br /&gt;
&lt;br /&gt;
Formulaire URSSAF pour chomage&lt;br /&gt;
&lt;br /&gt;
CPAM pour maladie+Carte CPS&lt;br /&gt;
&lt;br /&gt;
CARMF pour retraite&lt;br /&gt;
&lt;br /&gt;
Centre impot pour taxe pro&lt;br /&gt;
|CA &amp;gt;32K et &amp;lt;230K EUR&lt;br /&gt;
|Régime déclaratif contrôlé&lt;br /&gt;
|Non assujeti&lt;br /&gt;
|Revenu pro mis sur formulaire 2035 dans zone BNC,&lt;br /&gt;
envoyé aux impôts ou à son AGA si membre d&#039;une AGA&lt;br /&gt;
(&amp;lt;1er mai)&lt;br /&gt;
&lt;br /&gt;
Report sur décla impot 2042C (Case D5QC=rev comm prof) des recettes (gain-dépenses) dans zone BNC.&lt;br /&gt;
|Non assujeti&lt;br /&gt;
|Taxe pro, c&#039;est la 2035 qui fait office de décla&lt;br /&gt;
(exempt sous certaines conditions, rares)&lt;br /&gt;
|?&lt;br /&gt;
|Obligation d&#039;accepter les chèques si membre d&#039;une AGA&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
! scope=row | SARL&lt;br /&gt;
|CFE du Greffe ou http://www.cfenet.cci.fr/&lt;br /&gt;
|CA &amp;gt;32K et &amp;lt;230K EUR&lt;br /&gt;
|Régime déclaratif contrôlé&lt;br /&gt;
|TVA réel simplifié&lt;br /&gt;
|Formulaire 2065 pour déclarer l&#039;année d&#039;avant (&amp;lt; 1er mai)&lt;br /&gt;
Formulaire 2572 (Cerfa 12404) pour payer (&amp;lt; 1er mai)&lt;br /&gt;
|Formulaire 3517-CA12 (Cerfa 11417) / an + paiement&lt;br /&gt;
Décla/paiements par&lt;br /&gt;
*TéléTVA-EFI&lt;br /&gt;
*TéléTVA-EDI si CA &amp;gt; 760K EUR,&lt;br /&gt;
*TDFC si CA &amp;gt; 15M EUR&lt;br /&gt;
Fait par expert-comptable ou soi-même (&amp;lt; 1er mai).&lt;br /&gt;
|Taxe pro&lt;br /&gt;
&#039;&#039;Formulaire 1003 (CERFA 11067*10) pour déclarer annuellement (&amp;lt; 1er mai)&#039;&#039;&lt;br /&gt;
|&#039;&#039;Formulaire 2052 ?&#039;&#039;&lt;br /&gt;
Formulaire 2065 (+ tableaux 2033A à 2033G)&lt;br /&gt;
|Et Formulaire DAS2-T (&amp;lt; 1er mai)&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
! scope=row | SARL&lt;br /&gt;
|CFE du Greffe ou http://www.cfenet.cci.fr/&lt;br /&gt;
|CA &amp;gt; 230K EUR&lt;br /&gt;
|Régime déclaratif contrôlé&lt;br /&gt;
|TVA réel normal&lt;br /&gt;
|Formulaire 2065 pour déclarer l&#039;année d&#039;avant (&amp;lt; 1er mai)&lt;br /&gt;
Formulaire 2572 (Cerfa 12404) pour payer (&amp;lt; 1er mai)&lt;br /&gt;
|Formulaire 3310-CA3 (Cerfa 10963) / mois ou trimestre + paiement&lt;br /&gt;
Décla/paiements par&lt;br /&gt;
*TéléTVA-EFI&lt;br /&gt;
*TéléTVA-EDI si CA &amp;gt; 760K EUR&lt;br /&gt;
*TDFC si CA &amp;gt; 15M EUR&lt;br /&gt;
Fait par expert-comptable ou soi-même.&lt;br /&gt;
|Taxe pro&lt;br /&gt;
&#039;&#039;Formulaire 1003 (CERFA 11067*10) pour déclarer annuellement (&amp;lt; 1er mai)&#039;&#039;&lt;br /&gt;
|&#039;&#039;Formulaire 2052 ?&#039;&#039;&lt;br /&gt;
Formulaire 2065 (+ tableaux 2050 à 2059G)&lt;br /&gt;
|Et Formulaire DAS2-T (&amp;lt; 1er mai)&lt;br /&gt;
|?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{cite web|url=http://www.rhonealpes.experts-comptables.fr/backoffice/fichiers_upload/actualites/4%20G-1-09.pdf|accessdate=2009-03-28 }}&lt;br /&gt;
&lt;br /&gt;
= {{Flag sp}} Spain/Espagne =&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center; width:80%;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=col | Forma jurídica&lt;br /&gt;
! scope=col | Creación&lt;br /&gt;
! scope=col | Condiciones&lt;br /&gt;
! scope=col | Acogido IRPF&lt;br /&gt;
! scope=col | Acogido IVA&lt;br /&gt;
! scope=col | Impuesto sociedades&lt;br /&gt;
! scope=col | Dec. Trimestrales&lt;br /&gt;
! scope=col | Dec. Anuales&lt;br /&gt;
! scope=col | Notas&lt;br /&gt;
! scope=col | Param Dolibarr&lt;br /&gt;
|-&lt;br /&gt;
! scope=row | Autónomo&lt;br /&gt;
| 1.- Alta en la Declaración Censal (modelo 036) &lt;br /&gt;
2.- Alta en el IAE (mismo modelo 036 si no tributa, modelos 840/848 si tributa), &lt;br /&gt;
3.- Alta en el Régimen de Autónomos de la Seg. Social&lt;br /&gt;
| 1 socio. Sin límite de capital. Responsabilidad ilimitada&lt;br /&gt;
| Sí&lt;br /&gt;
| Sí&lt;br /&gt;
| No&lt;br /&gt;
| -Declaración IVA (modelo 303)&lt;br /&gt;
-Pagos fraccionados a cuenta IRPF (modelos 130 y 131)&lt;br /&gt;
-Pagos sometidos a retención (modelos 110 y 190)&lt;br /&gt;
| -Declaración IRPF (modelo D-100)&lt;br /&gt;
-Declaración operaciones con terceros (modelo 347)&lt;br /&gt;
|&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
! scope=row | Sociedad Civil&lt;br /&gt;
| 1.- Redacción de contrato privado entre las partes  &lt;br /&gt;
2.- Pago del Impuesto de Transmisiones Patrimoniales (modelo 600)&lt;br /&gt;
3.- Solicitud CIF, Declaración Censal e IAE&lt;br /&gt;
4.- Alta en el Régimen de Autónomos y/o General de socios y trabajadores &lt;br /&gt;
| 2 o más socios. Sin límite de capital. Responsabilidad ilimitada&lt;br /&gt;
| Sí&lt;br /&gt;
| Sí&lt;br /&gt;
| No&lt;br /&gt;
| -Declaración IVA (modelo 303)&lt;br /&gt;
-Pagos fraccionados a cuenta IRPF (modelos 130 y 131)&lt;br /&gt;
-Pagos sometidos a retención (modelos 110 y 190)&lt;br /&gt;
| -Declaración IRPF (modelo D-100)&lt;br /&gt;
-Declaración operaciones con terceros (modelo 347)&lt;br /&gt;
|&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
! scope=row | Comunidad de Bienes&lt;br /&gt;
| 1.- Redacción de contrato privado entre las partes  &lt;br /&gt;
2.- Pago del Impuesto de Transmisiones Patrimoniales (modelo 600)  &lt;br /&gt;
3.- Solicitud CIF, Declaración Censal e IAE&lt;br /&gt;
4.- Alta en el Régimen de Autónomos y/o General de socios y trabajadores &lt;br /&gt;
| 2 o más socios. Sin límite de capital. Responsabilidad ilimitada&lt;br /&gt;
| Sí&lt;br /&gt;
| Sí&lt;br /&gt;
| No&lt;br /&gt;
| -Declaración IVA (modelo 303)&lt;br /&gt;
-Pagos fraccionados a cuenta IRPF (modelos 130 y 131)&lt;br /&gt;
-Pagos sometidos a retención (modelos 110 y 190)&lt;br /&gt;
| -Declaración IRPF (modelo D-100)&lt;br /&gt;
-Declaración operaciones con terceros (modelo 347)&lt;br /&gt;
|&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
! scope=row | Sociedad Limitada&lt;br /&gt;
| 1.- Solicitud del Certificado de Denominación Social &lt;br /&gt;
2.- Apertura de Cuenta Bancaria  &lt;br /&gt;
3.- Redacción de Estatutos y firma de Escritura de Constitución &lt;br /&gt;
4.- Pago Impuesto de Transmisiones Patrimoniales &lt;br /&gt;
5.- Inscripción en el Registro Mercantil &lt;br /&gt;
6.-Solicitud CIF, Declaración Censal e IAE&lt;br /&gt;
7.-Alta en el Régimen de Autónomos y/o General de socios y trabajadores&lt;br /&gt;
| 2 o más socios. Capital mínimo 3006 €. Responsabilidad limitada al capital&lt;br /&gt;
| No&lt;br /&gt;
| Sí&lt;br /&gt;
| Sí&lt;br /&gt;
| -Declaración IVA (modelo 303)&lt;br /&gt;
-pagos fraccionados a cuenta (modelo 202)&lt;br /&gt;
-Pagos sometidos a retención (modelos 110 y 190)&lt;br /&gt;
| -Declaración del Impuesto de Sociedades.&lt;br /&gt;
-Declaración operaciones con terceros (modelo 347)&lt;br /&gt;
|&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
! scope=row | Sociedad Anónima&lt;br /&gt;
| 1.- Solicitud del Certificado de Denominación Social &lt;br /&gt;
2.- Apertura de Cuenta Bancaria  &lt;br /&gt;
3.- Redacción de Estatutos y firma de Escritura de Constitución &lt;br /&gt;
4.- Pago Impuesto de Transmisiones Patrimoniales &lt;br /&gt;
5.- Inscripción en el Registro Mercantil &lt;br /&gt;
6.-Solicitud CIF, Declaración Censal e IAE&lt;br /&gt;
7.-Alta en el Régimen de Autónomos y/o General de socios y trabajadores&lt;br /&gt;
| 2 o más socios. Capital mínimo 60101 €. Responsabilidad limitada al capital&lt;br /&gt;
| No&lt;br /&gt;
| Sí&lt;br /&gt;
| Sí&lt;br /&gt;
| -Declaración IVA (modelo 303)&lt;br /&gt;
-pagos fraccionados a cuenta (modelo 202)&lt;br /&gt;
-Pagos sometidos a retención (modelos 110 y 190)&lt;br /&gt;
| -Declaración del Impuesto de Sociedades.&lt;br /&gt;
-Declaración operaciones con terceros (modelo 347)&lt;br /&gt;
|&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
! scope=row | Sociedad Limitada Laboral&lt;br /&gt;
| 1.- Solicitud del Certificado de Denominación Social &lt;br /&gt;
2.- Apertura de Cuenta Bancaria  &lt;br /&gt;
3.- Redacción de Estatutos y firma de Escritura de Constitución &lt;br /&gt;
4.- Pago Impuesto de Transmisiones Patrimoniales &lt;br /&gt;
5.- Inscripción en el Registro Mercantil y de Sociedades Laborales&lt;br /&gt;
6.-Solicitud CIF, Declaración Censal e IAE&lt;br /&gt;
7.-Alta en el Régimen de Autónomos y/o General de socios y trabajadores&lt;br /&gt;
| 3 o más socios. Capital mínimo 3006 €. Responsabilidad limitada al capital&lt;br /&gt;
| No&lt;br /&gt;
| Sí&lt;br /&gt;
| Sí&lt;br /&gt;
| -Declaración IVA (modelo 303)&lt;br /&gt;
-pagos fraccionados a cuenta (modelo 202)&lt;br /&gt;
-Pagos sometidos a retención (modelos 110 y 190)&lt;br /&gt;
| -Declaración del Impuesto de Sociedades.&lt;br /&gt;
-Declaración operaciones con terceros (modelo 347)&lt;br /&gt;
|&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
! scope=row | Sociedad Anónima Laboral&lt;br /&gt;
| 1.- Solicitud del Certificado de Denominación Social &lt;br /&gt;
2.- Apertura de Cuenta Bancaria  &lt;br /&gt;
3.- Redacción de Estatutos y firma de Escritura de Constitución &lt;br /&gt;
4.- Pago Impuesto de Transmisiones Patrimoniales &lt;br /&gt;
5.- Inscripción en el Registro Mercantil y de Sociedades Laborales&lt;br /&gt;
6.-Solicitud CIF, Declaración Censal e IAE&lt;br /&gt;
7.-Alta en el Régimen de Autónomos y/o General de socios y trabajadores&lt;br /&gt;
| 3 o más socios. Capital mínimo 60101 €. Responsabilidad limitada al capital&lt;br /&gt;
| No&lt;br /&gt;
| Sí&lt;br /&gt;
| Sí&lt;br /&gt;
| -Declaración IVA (modelo 303)&lt;br /&gt;
-pagos fraccionados a cuenta (modelo 202)&lt;br /&gt;
-Pagos sometidos a retención (modelos 110 y 190)&lt;br /&gt;
| -Declaración del Impuesto de Sociedades.&lt;br /&gt;
-Declaración operaciones con terceros (modelo 347)&lt;br /&gt;
|&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
! scope=row | Cooperativa&lt;br /&gt;
| 1.- Solicitud del Certificado de Denominación Social &lt;br /&gt;
2.- Apertura de Cuenta Bancaria  &lt;br /&gt;
3.- Redacción de Estatutos y firma de Escritura de Constitución &lt;br /&gt;
4.- Pago Impuesto de Transmisiones Patrimoniales &lt;br /&gt;
5.- Inscripción en el Registro de Cooperativas&lt;br /&gt;
6.-Solicitud CIF, Declaración Censal e IAE&lt;br /&gt;
7.-Alta en el Régimen de Autónomos y/o General de socios y trabajadores&lt;br /&gt;
| 3 o más socios. Capital mínimo 1803 €. Responsabilidad limitada al capital&lt;br /&gt;
| No&lt;br /&gt;
| Sí&lt;br /&gt;
| Sí&lt;br /&gt;
| -Declaración IVA (modelo 303)&lt;br /&gt;
-pagos fraccionados a cuenta (modelo 202)&lt;br /&gt;
-Pagos sometidos a retención (modelos 110 y 190)&lt;br /&gt;
| -Declaración del Impuesto de Sociedades.&lt;br /&gt;
-Declaración operaciones con terceros (modelo 347)&lt;br /&gt;
|&lt;br /&gt;
|?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{cite web|url=http://www.crear-empresas.com}}&lt;br /&gt;
&lt;br /&gt;
= {{Flag ar}} Argentine/Argentine/Argentina =&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center; width:80%;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=col | Forma jurídica&lt;br /&gt;
! scope=col | Creación&lt;br /&gt;
! scope=col | Condiciones&lt;br /&gt;
! scope=col | IVA&lt;br /&gt;
! scope=col | Impuesto sociedades&lt;br /&gt;
! scope=col | Dec. Trimestrales&lt;br /&gt;
! scope=col | Dec. Anuales&lt;br /&gt;
! scope=col | Notas&lt;br /&gt;
! scope=col | Param Dolibarr&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| Responsable inscripto&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| Responsable NO inscripto&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| Exento&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Gnovaro</name></author>
	</entry>
</feed>