Passed
Push — master ( 853f8f...c34860 )
by Alxarafe
25:12
created
dolibarr/htdocs/core/class/html.formbank.class.php 2 patches
Indentation   +16 added lines, -16 removed lines patch added patch discarded remove patch
@@ -35,9 +35,9 @@  discard block
 block discarded – undo
35 35
     public $db;
36 36
     
37 37
     /**
38
-	 * @var string Error code (or message)
39
-	 */
40
-	public $error='';
38
+     * @var string Error code (or message)
39
+     */
40
+    public $error='';
41 41
 
42 42
 
43 43
     /**
@@ -64,19 +64,19 @@  discard block
 block discarded – undo
64 64
         print Form::selectarray($htmlname, $account->type_lib, $selected);
65 65
     }
66 66
 
67
-	/**
68
-	 * Returns the name of the Iban label. India uses 'IFSC' and the rest of the world 'IBAN' name.
69
-	 *
70
-	 * @param Account $account Account object
71
-	 * @return string
72
-	 */
73
-	public static function getIBANLabel(Account $account)
74
-	{
75
-		if ($account->getCountryCode() == 'IN') {
76
-			return 'IFSC';
77
-		}
67
+    /**
68
+     * Returns the name of the Iban label. India uses 'IFSC' and the rest of the world 'IBAN' name.
69
+     *
70
+     * @param Account $account Account object
71
+     * @return string
72
+     */
73
+    public static function getIBANLabel(Account $account)
74
+    {
75
+        if ($account->getCountryCode() == 'IN') {
76
+            return 'IFSC';
77
+        }
78 78
 
79
-		return 'IBANNumber';
80
-	}
79
+        return 'IBANNumber';
80
+    }
81 81
 }
82 82
 
Please login to merge, or discard this patch.
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -37,7 +37,7 @@
 block discarded – undo
37 37
     /**
38 38
 	 * @var string Error code (or message)
39 39
 	 */
40
-	public $error='';
40
+	public $error = '';
41 41
 
42 42
 
43 43
     /**
Please login to merge, or discard this patch.
dolibarr/htdocs/core/class/antivir.class.php 3 patches
Indentation   +95 added lines, -95 removed lines patch added patch discarded remove patch
@@ -30,73 +30,73 @@  discard block
 block discarded – undo
30 30
  */
31 31
 class AntiVir
32 32
 {
33
-	/**
34
-	 * @var string Error code (or message)
35
-	 */
36
-	public $error='';
37
-
38
-	/**
39
-	 * @var string[] Error codes (or messages)
40
-	 */
41
-	public $errors = array();
42
-
43
-	/**
44
-	 * @var string Used to return message
45
-	 */
46
-	public $output;
47
-
48
-	/**
33
+    /**
34
+     * @var string Error code (or message)
35
+     */
36
+    public $error='';
37
+
38
+    /**
39
+     * @var string[] Error codes (or messages)
40
+     */
41
+    public $errors = array();
42
+
43
+    /**
44
+     * @var string Used to return message
45
+     */
46
+    public $output;
47
+
48
+    /**
49 49
      * @var DoliDB Database handler.
50 50
      */
51 51
     public $db;
52 52
 
53
-	/**
54
-	 *  Constructor
55
-	 *
56
-	 *  @param      DoliDB		$db      Database handler
57
-	 */
58
-	function __construct($db)
59
-	{
60
-		$this->db=$db;
61
-	}
53
+    /**
54
+     *  Constructor
55
+     *
56
+     *  @param      DoliDB		$db      Database handler
57
+     */
58
+    function __construct($db)
59
+    {
60
+        $this->db=$db;
61
+    }
62 62
 
63 63
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
64
-	/**
65
-	 *	Scan a file with antivirus.
66
-	 *  This function runs the command defined in setup. This antivirus command must return 0 if OK.
67
-	 *  Return also true (virus found) if file end with '.virus' (so we can make test safely).
68
-	 *
69
-	 *	@param	string	$file		File to scan
70
-	 *	@return	int					<0 if KO (-98 if error, -99 if virus), 0 if OK
71
-	 */
72
-	function dol_avscan_file($file)
73
-	{
64
+    /**
65
+     *	Scan a file with antivirus.
66
+     *  This function runs the command defined in setup. This antivirus command must return 0 if OK.
67
+     *  Return also true (virus found) if file end with '.virus' (so we can make test safely).
68
+     *
69
+     *	@param	string	$file		File to scan
70
+     *	@return	int					<0 if KO (-98 if error, -99 if virus), 0 if OK
71
+     */
72
+    function dol_avscan_file($file)
73
+    {
74 74
         // phpcs:enable
75
-		global $conf;
75
+        global $conf;
76 76
 
77
-		$return = 0;
77
+        $return = 0;
78 78
 
79
-		if (preg_match('/\.virus$/i', $file))
80
-		{
81
-		    $this->errors[] = 'File has an extension saying file is a virus';
82
-		    return -97;
83
-		}
79
+        if (preg_match('/\.virus$/i', $file))
80
+        {
81
+            $this->errors[] = 'File has an extension saying file is a virus';
82
+            return -97;
83
+        }
84 84
 
85
-		$fullcommand=$this->getCliCommand($file);
86
-		//$fullcommand='"c:\Program Files (x86)\ClamWin\bin\clamscan.exe" --database="C:\Program Files (x86)\ClamWin\lib" "c:\temp\aaa.txt"';
85
+        $fullcommand=$this->getCliCommand($file);
86
+        //$fullcommand='"c:\Program Files (x86)\ClamWin\bin\clamscan.exe" --database="C:\Program Files (x86)\ClamWin\lib" "c:\temp\aaa.txt"';
87 87
         $fullcommand.=' 2>&1';      // This is to get error output
88 88
 
89
-		$output=array();
90
-		$return_var=0;
89
+        $output=array();
90
+        $return_var=0;
91 91
         $safemode=ini_get("safe_mode");
92
-		// Create a clean fullcommand
93
-		dol_syslog("AntiVir::dol_avscan_file Run command=".$fullcommand." with safe_mode ".($safemode?"on":"off"));
94
-		// Run CLI command. If run of Windows, you can get return with echo %ERRORLEVEL%
95
-		$lastline=exec($fullcommand, $output, $return_var);
92
+        // Create a clean fullcommand
93
+        dol_syslog("AntiVir::dol_avscan_file Run command=".$fullcommand." with safe_mode ".($safemode?"on":"off"));
94
+        // Run CLI command. If run of Windows, you can get return with echo %ERRORLEVEL%
95
+        $lastline=exec($fullcommand, $output, $return_var);
96 96
 
97 97
         //print "x".$lastline." - ".join(',',$output)." - ".$return_var."y";exit;
98 98
 
99
-		/*
99
+        /*
100 100
         $outputfile=$conf->admin->dir_temp.'/dol_avscan_file.out.'.session_id();
101 101
 		$handle = fopen($outputfile, 'w');
102 102
 		if ($handle)
@@ -126,62 +126,62 @@  discard block
 block discarded – undo
126 126
 		}
127 127
 		*/
128 128
 
129
-		dol_syslog("AntiVir::dol_avscan_file Result return_var=".$return_var." output=".join(',',$output));
129
+        dol_syslog("AntiVir::dol_avscan_file Result return_var=".$return_var." output=".join(',',$output));
130 130
 
131
-		$returncodevirus=1;
132
-		if ($return_var == $returncodevirus)	// Virus found
133
-		{
134
-			$this->errors=$output;
135
-			return -99;
136
-		}
131
+        $returncodevirus=1;
132
+        if ($return_var == $returncodevirus)	// Virus found
133
+        {
134
+            $this->errors=$output;
135
+            return -99;
136
+        }
137 137
 
138
-		if ($return_var > 0)					// If other error
139
-		{
140
-			$this->errors=$output;
141
-			return -98;
142
-		}
138
+        if ($return_var > 0)					// If other error
139
+        {
140
+            $this->errors=$output;
141
+            return -98;
142
+        }
143 143
 
144
-		// If return code = 0
145
-		return 1;
146
-	}
144
+        // If return code = 0
145
+        return 1;
146
+    }
147 147
 
148 148
 
149 149
 
150
-	/**
151
-	 *	Get full Command Line to run
152
-	 *
153
-	 *	@param	string	$file		File to scan
154
-	 *	@return	string				Full command line to run
155
-	 */
156
-	function getCliCommand($file)
157
-	{
158
-		global $conf;
150
+    /**
151
+     *	Get full Command Line to run
152
+     *
153
+     *	@param	string	$file		File to scan
154
+     *	@return	string				Full command line to run
155
+     */
156
+    function getCliCommand($file)
157
+    {
158
+        global $conf;
159 159
 
160
-		$maxreclevel = 5 ; 			// maximal recursion level
161
-		$maxfiles = 1000; 			// maximal number of files to be scanned within archive
162
-		$maxratio = 200; 			// maximal compression ratio
163
-		$bz2archivememlim = 0; 		// limit memory usage for bzip2 (0/1)
164
-		$maxfilesize = 10485760; 	// archived files larger than this value (in bytes) will not be scanned
160
+        $maxreclevel = 5 ; 			// maximal recursion level
161
+        $maxfiles = 1000; 			// maximal number of files to be scanned within archive
162
+        $maxratio = 200; 			// maximal compression ratio
163
+        $bz2archivememlim = 0; 		// limit memory usage for bzip2 (0/1)
164
+        $maxfilesize = 10485760; 	// archived files larger than this value (in bytes) will not be scanned
165 165
 
166
-		$command=$conf->global->MAIN_ANTIVIRUS_COMMAND;
167
-		$param=$conf->global->MAIN_ANTIVIRUS_PARAM;
166
+        $command=$conf->global->MAIN_ANTIVIRUS_COMMAND;
167
+        $param=$conf->global->MAIN_ANTIVIRUS_PARAM;
168 168
 
169
-		$param=preg_replace('/%maxreclevel/',$maxreclevel,$param);
170
-		$param=preg_replace('/%maxfiles/',$maxfiles,$param);
171
-		$param=preg_replace('/%maxratio/',$maxratio,$param);
172
-		$param=preg_replace('/%bz2archivememlim/',$bz2archivememlim,$param);
173
-		$param=preg_replace('/%maxfilesize/',$maxfilesize,$param);
174
-		$param=preg_replace('/%file/',trim($file),$param);
169
+        $param=preg_replace('/%maxreclevel/',$maxreclevel,$param);
170
+        $param=preg_replace('/%maxfiles/',$maxfiles,$param);
171
+        $param=preg_replace('/%maxratio/',$maxratio,$param);
172
+        $param=preg_replace('/%bz2archivememlim/',$bz2archivememlim,$param);
173
+        $param=preg_replace('/%maxfilesize/',$maxfilesize,$param);
174
+        $param=preg_replace('/%file/',trim($file),$param);
175 175
 
176
-		if (! preg_match('/%file/',$conf->global->MAIN_ANTIVIRUS_PARAM))
177
-			$param=$param." ".escapeshellarg(trim($file));
176
+        if (! preg_match('/%file/',$conf->global->MAIN_ANTIVIRUS_PARAM))
177
+            $param=$param." ".escapeshellarg(trim($file));
178 178
 
179
-		if (preg_match("/\s/",$command)) $command=escapeshellarg($command);	// Use quotes on command. Using escapeshellcmd fails.
179
+        if (preg_match("/\s/",$command)) $command=escapeshellarg($command);	// Use quotes on command. Using escapeshellcmd fails.
180 180
 
181
-		$ret=$command.' '.$param;
182
-		//$ret=$command.' '.$param.' 2>&1';
181
+        $ret=$command.' '.$param;
182
+        //$ret=$command.' '.$param.' 2>&1';
183 183
         //print "xx".$ret."xx";exit;
184 184
 
185
-		return $ret;
186
-	}
185
+        return $ret;
186
+    }
187 187
 }
Please login to merge, or discard this patch.
Spacing   +30 added lines, -30 removed lines patch added patch discarded remove patch
@@ -33,7 +33,7 @@  discard block
 block discarded – undo
33 33
 	/**
34 34
 	 * @var string Error code (or message)
35 35
 	 */
36
-	public $error='';
36
+	public $error = '';
37 37
 
38 38
 	/**
39 39
 	 * @var string[] Error codes (or messages)
@@ -57,7 +57,7 @@  discard block
 block discarded – undo
57 57
 	 */
58 58
 	function __construct($db)
59 59
 	{
60
-		$this->db=$db;
60
+		$this->db = $db;
61 61
 	}
62 62
 
63 63
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
@@ -82,17 +82,17 @@  discard block
 block discarded – undo
82 82
 		    return -97;
83 83
 		}
84 84
 
85
-		$fullcommand=$this->getCliCommand($file);
85
+		$fullcommand = $this->getCliCommand($file);
86 86
 		//$fullcommand='"c:\Program Files (x86)\ClamWin\bin\clamscan.exe" --database="C:\Program Files (x86)\ClamWin\lib" "c:\temp\aaa.txt"';
87
-        $fullcommand.=' 2>&1';      // This is to get error output
87
+        $fullcommand .= ' 2>&1'; // This is to get error output
88 88
 
89
-		$output=array();
90
-		$return_var=0;
91
-        $safemode=ini_get("safe_mode");
89
+		$output = array();
90
+		$return_var = 0;
91
+        $safemode = ini_get("safe_mode");
92 92
 		// Create a clean fullcommand
93
-		dol_syslog("AntiVir::dol_avscan_file Run command=".$fullcommand." with safe_mode ".($safemode?"on":"off"));
93
+		dol_syslog("AntiVir::dol_avscan_file Run command=".$fullcommand." with safe_mode ".($safemode ? "on" : "off"));
94 94
 		// Run CLI command. If run of Windows, you can get return with echo %ERRORLEVEL%
95
-		$lastline=exec($fullcommand, $output, $return_var);
95
+		$lastline = exec($fullcommand, $output, $return_var);
96 96
 
97 97
         //print "x".$lastline." - ".join(',',$output)." - ".$return_var."y";exit;
98 98
 
@@ -126,18 +126,18 @@  discard block
 block discarded – undo
126 126
 		}
127 127
 		*/
128 128
 
129
-		dol_syslog("AntiVir::dol_avscan_file Result return_var=".$return_var." output=".join(',',$output));
129
+		dol_syslog("AntiVir::dol_avscan_file Result return_var=".$return_var." output=".join(',', $output));
130 130
 
131
-		$returncodevirus=1;
131
+		$returncodevirus = 1;
132 132
 		if ($return_var == $returncodevirus)	// Virus found
133 133
 		{
134
-			$this->errors=$output;
134
+			$this->errors = $output;
135 135
 			return -99;
136 136
 		}
137 137
 
138 138
 		if ($return_var > 0)					// If other error
139 139
 		{
140
-			$this->errors=$output;
140
+			$this->errors = $output;
141 141
 			return -98;
142 142
 		}
143 143
 
@@ -157,28 +157,28 @@  discard block
 block discarded – undo
157 157
 	{
158 158
 		global $conf;
159 159
 
160
-		$maxreclevel = 5 ; 			// maximal recursion level
161
-		$maxfiles = 1000; 			// maximal number of files to be scanned within archive
162
-		$maxratio = 200; 			// maximal compression ratio
163
-		$bz2archivememlim = 0; 		// limit memory usage for bzip2 (0/1)
164
-		$maxfilesize = 10485760; 	// archived files larger than this value (in bytes) will not be scanned
160
+		$maxreclevel = 5; // maximal recursion level
161
+		$maxfiles = 1000; // maximal number of files to be scanned within archive
162
+		$maxratio = 200; // maximal compression ratio
163
+		$bz2archivememlim = 0; // limit memory usage for bzip2 (0/1)
164
+		$maxfilesize = 10485760; // archived files larger than this value (in bytes) will not be scanned
165 165
 
166
-		$command=$conf->global->MAIN_ANTIVIRUS_COMMAND;
167
-		$param=$conf->global->MAIN_ANTIVIRUS_PARAM;
166
+		$command = $conf->global->MAIN_ANTIVIRUS_COMMAND;
167
+		$param = $conf->global->MAIN_ANTIVIRUS_PARAM;
168 168
 
169
-		$param=preg_replace('/%maxreclevel/',$maxreclevel,$param);
170
-		$param=preg_replace('/%maxfiles/',$maxfiles,$param);
171
-		$param=preg_replace('/%maxratio/',$maxratio,$param);
172
-		$param=preg_replace('/%bz2archivememlim/',$bz2archivememlim,$param);
173
-		$param=preg_replace('/%maxfilesize/',$maxfilesize,$param);
174
-		$param=preg_replace('/%file/',trim($file),$param);
169
+		$param = preg_replace('/%maxreclevel/', $maxreclevel, $param);
170
+		$param = preg_replace('/%maxfiles/', $maxfiles, $param);
171
+		$param = preg_replace('/%maxratio/', $maxratio, $param);
172
+		$param = preg_replace('/%bz2archivememlim/', $bz2archivememlim, $param);
173
+		$param = preg_replace('/%maxfilesize/', $maxfilesize, $param);
174
+		$param = preg_replace('/%file/', trim($file), $param);
175 175
 
176
-		if (! preg_match('/%file/',$conf->global->MAIN_ANTIVIRUS_PARAM))
177
-			$param=$param." ".escapeshellarg(trim($file));
176
+		if (!preg_match('/%file/', $conf->global->MAIN_ANTIVIRUS_PARAM))
177
+			$param = $param." ".escapeshellarg(trim($file));
178 178
 
179
-		if (preg_match("/\s/",$command)) $command=escapeshellarg($command);	// Use quotes on command. Using escapeshellcmd fails.
179
+		if (preg_match("/\s/", $command)) $command = escapeshellarg($command); // Use quotes on command. Using escapeshellcmd fails.
180 180
 
181
-		$ret=$command.' '.$param;
181
+		$ret = $command.' '.$param;
182 182
 		//$ret=$command.' '.$param.' 2>&1';
183 183
         //print "xx".$ret."xx";exit;
184 184
 
Please login to merge, or discard this patch.
Braces   +13 added lines, -5 removed lines patch added patch discarded remove patch
@@ -129,15 +129,19 @@  discard block
 block discarded – undo
129 129
 		dol_syslog("AntiVir::dol_avscan_file Result return_var=".$return_var." output=".join(',',$output));
130 130
 
131 131
 		$returncodevirus=1;
132
-		if ($return_var == $returncodevirus)	// Virus found
132
+		if ($return_var == $returncodevirus) {
133
+		    // Virus found
133 134
 		{
134 135
 			$this->errors=$output;
136
+		}
135 137
 			return -99;
136 138
 		}
137 139
 
138
-		if ($return_var > 0)					// If other error
140
+		if ($return_var > 0) {
141
+		    // If other error
139 142
 		{
140 143
 			$this->errors=$output;
144
+		}
141 145
 			return -98;
142 146
 		}
143 147
 
@@ -173,10 +177,14 @@  discard block
 block discarded – undo
173 177
 		$param=preg_replace('/%maxfilesize/',$maxfilesize,$param);
174 178
 		$param=preg_replace('/%file/',trim($file),$param);
175 179
 
176
-		if (! preg_match('/%file/',$conf->global->MAIN_ANTIVIRUS_PARAM))
177
-			$param=$param." ".escapeshellarg(trim($file));
180
+		if (! preg_match('/%file/',$conf->global->MAIN_ANTIVIRUS_PARAM)) {
181
+					$param=$param." ".escapeshellarg(trim($file));
182
+		}
178 183
 
179
-		if (preg_match("/\s/",$command)) $command=escapeshellarg($command);	// Use quotes on command. Using escapeshellcmd fails.
184
+		if (preg_match("/\s/",$command)) {
185
+		    $command=escapeshellarg($command);
186
+		}
187
+		// Use quotes on command. Using escapeshellcmd fails.
180 188
 
181 189
 		$ret=$command.' '.$param;
182 190
 		//$ret=$command.' '.$param.' 2>&1';
Please login to merge, or discard this patch.
dolibarr/htdocs/core/class/commonobject.class.php 3 patches
Indentation   +7091 added lines, -7091 removed lines patch added patch discarded remove patch
@@ -41,7387 +41,7387 @@
 block discarded – undo
41 41
  */
42 42
 abstract class CommonObject
43 43
 {
44
-	/**
45
-	 * @var DoliDb		Database handler (result of a new DoliDB)
46
-	 */
47
-	public $db;
48
-
49
-	/**
50
-	 * @var int The object identifier
51
-	 */
52
-	public $id;
53
-
54
-	/**
55
-	 * @var string 		Error string
56
-	 * @see             errors
57
-	 */
58
-	public $error;
59
-
60
-	/**
61
-	 * @var string[]	Array of error strings
62
-	 */
63
-	public $errors=array();
64
-
65
-	/**
66
-	 * @var string ID to identify managed object
67
-	 */
68
-	public $element;
69
-
70
-	/**
71
-	 * @var string Name of table without prefix where object is stored
72
-	 */
73
-	public $table_element;
74
-
75
-	/**
76
-	 * @var int    Name of subtable line
77
-	 */
78
-	public $table_element_line='';
79
-
80
-	/**
81
-	 * @var string		Key value used to track if data is coming from import wizard
82
-	 */
83
-	public $import_key;
84
-
85
-	/**
86
-	 * @var mixed		Contains data to manage extrafields
87
-	 */
88
-	public $array_options=array();
89
-
90
-	/**
91
-	 * @var int[][]		Array of linked objects ids. Loaded by ->fetchObjectLinked
92
-	 */
93
-	public $linkedObjectsIds;
94
-
95
-	/**
96
-	 * @var mixed		Array of linked objects. Loaded by ->fetchObjectLinked
97
-	 */
98
-	public $linkedObjects;
99
-
100
-	/**
101
-	 * @var Object      To store a cloned copy of object before to edit it and keep track of old properties
102
-	 */
103
-	public $oldcopy;
104
-
105
-	/**
106
-	 * @var string		Column name of the ref field.
107
-	 */
108
-	protected $table_ref_field = '';
109
-
110
-
111
-
112
-	// Following vars are used by some objects only. We keep this property here in CommonObject to be able to provide common method using them.
113
-
114
-	/**
115
-	 * @var array<string,mixed>		Can be used to pass information when only object is provided to method
116
-	 */
117
-	public $context=array();
118
-
119
-	/**
120
-	 * @var string		Contains canvas name if record is an alternative canvas record
121
-	 */
122
-	public $canvas;
123
-
124
-	/**
125
-	 * @var Project The related project
126
-	 * @see fetch_projet()
127
-	 */
128
-	public $project;
129
-
130
-	/**
131
-	 * @var int The related project ID
132
-	 * @see setProject(), project
133
-	 */
134
-	public $fk_project;
135
-
136
-	/**
137
-	 * @deprecated
138
-	 * @see project
139
-	 */
140
-	public $projet;
141
-
142
-	/**
143
-	 * @var Contact a related contact
144
-	 * @see fetch_contact()
145
-	 */
146
-	public $contact;
147
-
148
-	/**
149
-	 * @var int The related contact ID
150
-	 * @see fetch_contact()
151
-	 */
152
-	public $contact_id;
153
-
154
-	/**
155
-	 * @var Societe A related thirdparty
156
-	 * @see fetch_thirdparty()
157
-	 */
158
-	public $thirdparty;
159
-
160
-	/**
161
-	 * @var User A related user
162
-	 * @see fetch_user()
163
-	 */
164
-	public $user;
165
-
166
-	/**
167
-	 * @var string 	The type of originating object ('commande', 'facture', ...)
168
-	 * @see fetch_origin()
169
-	 */
170
-	public $origin;
171
-
172
-	/**
173
-	 * @var int 	The id of originating object
174
-	 * @see fetch_origin()
175
-	 */
176
-	public $origin_id;
177
-
178
-	/**
179
-	 * @var string The object's reference
180
-	 */
181
-	public $ref;
182
-
183
-	/**
184
-	 * @var string The object's previous reference
185
-	 */
186
-	public $ref_previous;
187
-
188
-	/**
189
-	 * @var string The object's next reference
190
-	 */
191
-	public $ref_next;
192
-
193
-	/**
194
-	 * @var string An external reference for the object
195
-	 */
196
-	public $ref_ext;
197
-
198
-	/**
199
-	 * @var int The object's status
200
-	 * @see setStatut()
201
-	 */
202
-	public $statut;
203
-
204
-	/**
205
-	 * @var string
206
-	 * @see getFullAddress()
207
-	 */
208
-	public $country;
209
-
210
-	/**
211
-	 * @var int
212
-	 * @see getFullAddress(), country
213
-	 */
214
-	public $country_id;
215
-
216
-	/**
217
-	 * @var string
218
-	 * @see getFullAddress(), isInEEC(), country
219
-	 */
220
-    public $country_code;
221
-
222 44
     /**
223
-	 * @var string
224
-	 * @see getFullAddress()
225
-	 */
226
-	public $state;
227
-
228
-	/**
229
-	 * @var int
230
-	 * @see getFullAddress(), state
231
-	 */
232
-	public $state_id;
45
+     * @var DoliDb		Database handler (result of a new DoliDB)
46
+     */
47
+    public $db;
233 48
 
234
-	/**
235
-	 * @var string
236
-	 * @see getFullAddress(), state
237
-	 */
238
-    public $state_code;
49
+    /**
50
+     * @var int The object identifier
51
+     */
52
+    public $id;
239 53
 
240 54
     /**
241
-	 * @var string
242
-	 * @see getFullAddress(), region
243
-	 */
244
-	public $region;
55
+     * @var string 		Error string
56
+     * @see             errors
57
+     */
58
+    public $error;
245 59
 
246
-	/**
247
-	 * @var string
248
-	 * @see getFullAddress(), region
249
-	 */
250
-    public $region_code;
60
+    /**
61
+     * @var string[]	Array of error strings
62
+     */
63
+    public $errors=array();
251 64
 
252
-	/**
253
-	 * @var int
254
-	 * @see fetch_barcode()
255
-	 */
256
-	public $barcode_type;
257
-
258
-	/**
259
-	 * @var string
260
-	 * @see fetch_barcode(), barcode_type
261
-	 */
262
-	public $barcode_type_code;
263
-
264
-	/**
265
-	 * @var string
266
-	 * @see fetch_barcode(), barcode_type
267
-	 */
268
-	public $barcode_type_label;
269
-
270
-	/**
271
-	 * @var string
272
-	 * @see fetch_barcode(), barcode_type
273
-	 */
274
-	public $barcode_type_coder;
275
-
276
-	/**
277
-	 * @var int Payment method ID (cheque, cash, ...)
278
-	 * @see setPaymentMethods()
279
-	 */
280
-	public $mode_reglement_id;
281
-
282
-	/**
283
-	 * @var int Payment terms ID
284
-	 * @see setPaymentTerms()
285
-	 */
286
-	public $cond_reglement_id;
287
-
288
-	/**
289
-	 * @var int Payment terms ID
290
-	 * @deprecated Kept for compatibility
291
-	 * @see cond_reglement_id;
292
-	 */
293
-	public $cond_reglement;
294
-
295
-	/**
296
-	 * @var int Delivery address ID
297
-	 * @deprecated
298
-	 * @see setDeliveryAddress()
299
-	 */
300
-	public $fk_delivery_address;
301
-
302
-	/**
303
-	 * @var int Shipping method ID
304
-	 * @see setShippingMethod()
305
-	 */
306
-	public $shipping_method_id;
307
-
308
-	/**
309
-	 * @var string
310
-	 * @see SetDocModel()
311
-	 */
312
-	public $modelpdf;
313
-
314
-	/**
315
-	 * @var int Bank account ID
316
-	 * @see SetBankAccount()
317
-	 */
318
-	public $fk_account;
319
-
320
-	/**
321
-	 * @var string Public note
322
-	 * @see update_note()
323
-	 */
324
-	public $note_public;
325
-
326
-	/**
327
-	 * @var string Private note
328
-	 * @see update_note()
329
-	 */
330
-	public $note_private;
331
-
332
-	/**
333
-	 * @deprecated
334
-	 * @see note_public
335
-	 */
336
-	public $note;
337
-
338
-	/**
339
-	 * @var float Total amount before taxes
340
-	 * @see update_price()
341
-	 */
342
-	public $total_ht;
343
-
344
-	/**
345
-	 * @var float Total VAT amount
346
-	 * @see update_price()
347
-	 */
348
-	public $total_tva;
349
-
350
-	/**
351
-	 * @var float Total local tax 1 amount
352
-	 * @see update_price()
353
-	 */
354
-	public $total_localtax1;
355
-
356
-	/**
357
-	 * @var float Total local tax 2 amount
358
-	 * @see update_price()
359
-	 */
360
-	public $total_localtax2;
361
-
362
-	/**
363
-	 * @var float Total amount with taxes
364
-	 * @see update_price()
365
-	 */
366
-	public $total_ttc;
367
-
368
-	/**
369
-	 * @var CommonObjectLine[]
370
-	 */
371
-	public $lines;
372
-
373
-	/**
374
-	 * @var mixed		Contains comments
375
-	 * @see fetchComments()
376
-	 */
377
-	public $comments=array();
378
-
379
-	/**
380
-	 * @var int
381
-	 * @see setIncoterms()
382
-	 */
383
-	public $fk_incoterms;
384
-
385
-	/**
386
-	 * @var string
387
-	 * @see SetIncoterms()
388
-	 */
389
-	public $libelle_incoterms;
390
-
391
-	/**
392
-	 * @var string
393
-	 * @see display_incoterms()
394
-	 */
395
-	public $location_incoterms;
396
-
397
-	public $name;
398
-	public $lastname;
399
-	public $firstname;
400
-	public $civility_id;
401
-
402
-	// Dates
403
-	public $date_creation;			// Date creation
404
-	public $date_validation;		// Date validation
405
-	public $date_modification;		// Date last change (tms field)
406
-
407
-
408
-
409
-	// No constructor as it is an abstract class
410
-
411
-	/**
412
-	 * Check an object id/ref exists
413
-	 * If you don't need/want to instantiate object and just need to know if object exists, use this method instead of fetch
414
-	 *
415
-	 *  @param	string	$element   	String of element ('product', 'facture', ...)
416
-	 *  @param	int		$id      	Id of object
417
-	 *  @param  string	$ref     	Ref of object to check
418
-	 *  @param	string	$ref_ext	Ref ext of object to check
419
-	 *  @return int     			<0 if KO, 0 if OK but not found, >0 if OK and exists
420
-	 */
421
-	static function isExistingObject($element, $id, $ref='', $ref_ext='')
422
-	{
423
-		global $db,$conf;
424
-
425
-		$sql = "SELECT rowid, ref, ref_ext";
426
-		$sql.= " FROM ".MAIN_DB_PREFIX.$element;
427
-		$sql.= " WHERE entity IN (".getEntity($element).")" ;
428
-
429
-		if ($id > 0) $sql.= " AND rowid = ".$db->escape($id);
430
-		else if ($ref) $sql.= " AND ref = '".$db->escape($ref)."'";
431
-		else if ($ref_ext) $sql.= " AND ref_ext = '".$db->escape($ref_ext)."'";
432
-		else {
433
-			$error='ErrorWrongParameters';
434
-			dol_print_error(get_class()."::isExistingObject ".$error, LOG_ERR);
435
-			return -1;
436
-		}
437
-		if ($ref || $ref_ext) $sql.= " AND entity = ".$conf->entity;
438
-
439
-		dol_syslog(get_class()."::isExistingObject", LOG_DEBUG);
440
-		$resql = $db->query($sql);
441
-		if ($resql)
442
-		{
443
-			$num=$db->num_rows($resql);
444
-			if ($num > 0) return 1;
445
-			else return 0;
446
-		}
447
-		return -1;
448
-	}
449
-
450
-	/**
451
-	 * Method to output saved errors
452
-	 *
453
-	 * @return	string		String with errors
454
-	 */
455
-	function errorsToString()
456
-	{
457
-		return $this->error.(is_array($this->errors)?(($this->error!=''?', ':'').join(', ',$this->errors)):'');
458
-	}
459
-
460
-	/**
461
-	 *	Return full name (civility+' '+name+' '+lastname)
462
-	 *
463
-	 *	@param	Translate	$langs			Language object for translation of civility (used only if option is 1)
464
-	 *	@param	int			$option			0=No option, 1=Add civility
465
-	 * 	@param	int			$nameorder		-1=Auto, 0=Lastname+Firstname, 1=Firstname+Lastname, 2=Firstname
466
-	 * 	@param	int			$maxlen			Maximum length
467
-	 * 	@return	string						String with full name
468
-	 */
469
-	function getFullName($langs,$option=0,$nameorder=-1,$maxlen=0)
470
-	{
471
-		//print "lastname=".$this->lastname." name=".$this->name." nom=".$this->nom."<br>\n";
472
-		$lastname=$this->lastname;
473
-		$firstname=$this->firstname;
474
-		if (empty($lastname))  $lastname=(isset($this->lastname)?$this->lastname:(isset($this->name)?$this->name:(isset($this->nom)?$this->nom:(isset($this->societe)?$this->societe:(isset($this->company)?$this->company:'')))));
475
-
476
-		$ret='';
477
-		if ($option && $this->civility_id)
478
-		{
479
-			if ($langs->transnoentitiesnoconv("Civility".$this->civility_id)!="Civility".$this->civility_id) $ret.=$langs->transnoentitiesnoconv("Civility".$this->civility_id).' ';
480
-			else $ret.=$this->civility_id.' ';
481
-		}
482
-
483
-		$ret.=dolGetFirstLastname($firstname, $lastname, $nameorder);
484
-
485
-		return dol_trunc($ret,$maxlen);
486
-	}
487
-
488
-	/**
489
-	 * 	Return full address of contact
490
-	 *
491
-	 * 	@param		int			$withcountry		1=Add country into address string
492
-	 *  @param		string		$sep				Separator to use to build string
493
-	 *  @param		int		    $withregion			1=Add region into address string
494
-	 *	@return		string							Full address string
495
-	 */
496
-	function getFullAddress($withcountry=0, $sep="\n", $withregion=0)
497
-	{
498
-		if ($withcountry && $this->country_id && (empty($this->country_code) || empty($this->country)))
499
-		{
500
-			require_once DOL_DOCUMENT_ROOT .'/core/lib/company.lib.php';
501
-			$tmparray=getCountry($this->country_id,'all');
502
-			$this->country_code=$tmparray['code'];
503
-			$this->country     =$tmparray['label'];
504
-		}
65
+    /**
66
+     * @var string ID to identify managed object
67
+     */
68
+    public $element;
505 69
 
506
-        if ($withregion && $this->state_id && (empty($this->state_code) || empty($this->state) || empty($this->region) || empty($this->region_cpde)))
507
-    	{
508
-    		require_once DOL_DOCUMENT_ROOT .'/core/lib/company.lib.php';
509
-    		$tmparray=getState($this->state_id,'all',0,1);
510
-			$this->state_code   =$tmparray['code'];
511
-			$this->state        =$tmparray['label'];
512
-			$this->region_code  =$tmparray['region_code'];
513
-			$this->region       =$tmparray['region'];
514
-        }
515
-
516
-		return dol_format_address($this, $withcountry, $sep);
517
-	}
518
-
519
-
520
-	/**
521
-	 * 	Return full address for banner
522
-	 *
523
-	 * 	@param		string		$htmlkey            HTML id to make banner content unique
524
-	 *  @param      Object      $object				Object (thirdparty, thirdparty of contact for contact, null for a member)
525
-	 *	@return		string							Full address string
526
-	 */
527
-	function getBannerAddress($htmlkey, $object)
528
-	{
529
-		global $conf, $langs;
530
-
531
-		$countriesusingstate=array('AU','US','IN','GB','ES','UK','TR');    // See also option MAIN_FORCE_STATE_INTO_ADDRESS
532
-
533
-		$contactid=0;
534
-		$thirdpartyid=0;
535
-		if ($this->element == 'societe')
536
-		{
537
-			$thirdpartyid=$this->id;
538
-		}
539
-		if ($this->element == 'contact')
540
-		{
541
-			$contactid=$this->id;
542
-			$thirdpartyid=$object->fk_soc;
543
-		}
544
-		if ($this->element == 'user')
545
-		{
546
-			$contactid=$this->contact_id;
547
-			$thirdpartyid=$object->fk_soc;
548
-		}
549
-
550
-		$out='<!-- BEGIN part to show address block -->';
551
-
552
-		$outdone=0;
553
-		$coords = $this->getFullAddress(1,', ',$conf->global->MAIN_SHOW_REGION_IN_STATE_SELECT);
554
-		if ($coords)
555
-		{
556
-			if (! empty($conf->use_javascript_ajax))
557
-			{
558
-				$namecoords = $this->getFullName($langs,1).'<br>'.$coords;
559
-				// hideonsmatphone because copyToClipboard call jquery dialog that does not work with jmobile
560
-				$out.='<a href="#" class="hideonsmartphone" onclick="return copyToClipboard(\''.dol_escape_js($namecoords).'\',\''.dol_escape_js($langs->trans("HelpCopyToClipboard")).'\');">';
561
-				$out.=img_picto($langs->trans("Address"), 'object_address.png');
562
-				$out.='</a> ';
563
-			}
564
-			$out.=dol_print_address($coords, 'address_'.$htmlkey.'_'.$this->id, $this->element, $this->id, 1, ', '); $outdone++;
565
-			$outdone++;
566
-		}
567
-
568
-		if (! in_array($this->country_code,$countriesusingstate) && empty($conf->global->MAIN_FORCE_STATE_INTO_ADDRESS)   // If MAIN_FORCE_STATE_INTO_ADDRESS is on, state is already returned previously with getFullAddress
569
-				&& empty($conf->global->SOCIETE_DISABLE_STATE) && $this->state)
570
-		{
571
-            if (!empty($conf->global->MAIN_SHOW_REGION_IN_STATE_SELECT) && $conf->global->MAIN_SHOW_REGION_IN_STATE_SELECT == 1 && $this->region) {
572
-                $out.=($outdone?' - ':'').$this->region.' - '.$this->state;
573
-            }
574
-            else {
575
-                $out.=($outdone?' - ':'').$this->state;
576
-            }
577
-			$outdone++;
578
-		}
579
-
580
-		if (! empty($this->phone) || ! empty($this->phone_pro) || ! empty($this->phone_mobile) || ! empty($this->phone_perso) || ! empty($this->fax) || ! empty($this->office_phone) || ! empty($this->user_mobile) || ! empty($this->office_fax)) $out.=($outdone?'<br>':'');
581
-		if (! empty($this->phone) && empty($this->phone_pro)) {		// For objects that store pro phone into ->phone
582
-			$out.=dol_print_phone($this->phone,$this->country_code,$contactid,$thirdpartyid,'AC_TEL','&nbsp;','phone',$langs->trans("PhonePro")); $outdone++;
583
-		}
584
-		if (! empty($this->phone_pro)) {
585
-			$out.=dol_print_phone($this->phone_pro,$this->country_code,$contactid,$thirdpartyid,'AC_TEL','&nbsp;','phone',$langs->trans("PhonePro")); $outdone++;
586
-		}
587
-		if (! empty($this->phone_mobile)) {
588
-			$out.=dol_print_phone($this->phone_mobile,$this->country_code,$contactid,$thirdpartyid,'AC_TEL','&nbsp;','mobile',$langs->trans("PhoneMobile")); $outdone++;
589
-		}
590
-		if (! empty($this->phone_perso)) {
591
-			$out.=dol_print_phone($this->phone_perso,$this->country_code,$contactid,$thirdpartyid,'AC_TEL','&nbsp;','phone',$langs->trans("PhonePerso")); $outdone++;
592
-		}
593
-		if (! empty($this->office_phone)) {
594
-			$out.=dol_print_phone($this->office_phone,$this->country_code,$contactid,$thirdpartyid,'AC_TEL','&nbsp;','phone',$langs->trans("PhonePro")); $outdone++;
595
-		}
596
-		if (! empty($this->user_mobile)) {
597
-			$out.=dol_print_phone($this->user_mobile,$this->country_code,$contactid,$thirdpartyid,'AC_TEL','&nbsp;','mobile',$langs->trans("PhoneMobile")); $outdone++;
598
-		}
599
-		if (! empty($this->fax)) {
600
-			$out.=dol_print_phone($this->fax,$this->country_code,$contactid,$thirdpartyid,'AC_FAX','&nbsp;','fax',$langs->trans("Fax")); $outdone++;
601
-		}
602
-		if (! empty($this->office_fax)) {
603
-			$out.=dol_print_phone($this->office_fax,$this->country_code,$contactid,$thirdpartyid,'AC_FAX','&nbsp;','fax',$langs->trans("Fax")); $outdone++;
604
-		}
605
-
606
-		$out.='<div style="clear: both;"></div>';
607
-		$outdone=0;
608
-		if (! empty($this->email))
609
-		{
610
-			$out.=dol_print_email($this->email,$this->id,$object->id,'AC_EMAIL',0,0,1);
611
-			$outdone++;
612
-		}
613
-		if (! empty($this->url))
614
-		{
615
-			$out.=dol_print_url($this->url,'_goout',0,1);
616
-			$outdone++;
617
-		}
618
-		$out.='<div style="clear: both;">';
619
-		if (! empty($conf->socialnetworks->enabled))
620
-		{
621
-			if ($this->skype) $out.=dol_print_socialnetworks($this->skype,$this->id,$object->id,'skype');
622
-			$outdone++;
623
-			if ($this->jabberid) $out.=dol_print_socialnetworks($this->jabberid,$this->id,$object->id,'jabber');
624
-			$outdone++;
625
-			if ($this->twitter) $out.=dol_print_socialnetworks($this->twitter,$this->id,$object->id,'twitter');
626
-			$outdone++;
627
-			if ($this->facebook) $out.=dol_print_socialnetworks($this->facebook,$this->id,$object->id,'facebook');
628
-			$outdone++;
629
-		}
630
-		$out.='</div>';
631
-
632
-		$out.='<!-- END Part to show address block -->';
633
-
634
-		return $out;
635
-	}
636
-
637
-	/**
638
-	 * Return the link of last main doc file for direct public download.
639
-	 *
640
-	 * @param	string	$modulepart			Module related to document
641
-	 * @param	int		$initsharekey		Init the share key if it was not yet defined
642
-	 * @param	int		$relativelink		0=Return full external link, 1=Return link relative to root of file
643
-	 * @return	string						Link or empty string if there is no download link
644
-	 */
645
-	function getLastMainDocLink($modulepart, $initsharekey=0, $relativelink=0)
646
-	{
647
-		global $user, $dolibarr_main_url_root;
648
-
649
-		if (empty($this->last_main_doc))
650
-		{
651
-			return '';		// No way to known which document name to use
652
-		}
653
-
654
-		include_once DOL_DOCUMENT_ROOT.'/ecm/class/ecmfiles.class.php';
655
-		$ecmfile=new EcmFiles($this->db);
656
-		$result = $ecmfile->fetch(0, '', $this->last_main_doc);
657
-		if ($result < 0)
658
-		{
659
-			$this->error = $ecmfile->error;
660
-			$this->errors = $ecmfile->errors;
661
-			return -1;
662
-		}
663
-
664
-		if (empty($ecmfile->id))
665
-		{
666
-			// Add entry into index
667
-			if ($initsharekey)
668
-			{
669
-				require_once DOL_DOCUMENT_ROOT.'/core/lib/security2.lib.php';
670
-				// TODO We can't, we dont' have full path of file, only last_main_doc adn ->element, so we must rebuild full path first
671
-				/*
672
-				$ecmfile->filepath = $rel_dir;
673
-				$ecmfile->filename = $filename;
674
-				$ecmfile->label = md5_file(dol_osencode($destfull));	// hash of file content
675
-				$ecmfile->fullpath_orig = '';
676
-				$ecmfile->gen_or_uploaded = 'generated';
677
-				$ecmfile->description = '';    // indexed content
678
-				$ecmfile->keyword = '';        // keyword content
679
-				$ecmfile->share = getRandomPassword(true);
680
-				$result = $ecmfile->create($user);
681
-				if ($result < 0)
682
-				{
683
-					$this->error = $ecmfile->error;
684
-					$this->errors = $ecmfile->errors;
685
-				}
686
-				*/
687
-			}
688
-			else return '';
689
-		}
690
-		elseif (empty($ecmfile->share))
691
-		{
692
-			// Add entry into index
693
-			if ($initsharekey)
694
-			{
695
-				require_once DOL_DOCUMENT_ROOT.'/core/lib/security2.lib.php';
696
-				$ecmfile->share = getRandomPassword(true);
697
-				$ecmfile->update($user);
698
-			}
699
-			else return '';
700
-		}
701
-
702
-		// Define $urlwithroot
703
-		$urlwithouturlroot=preg_replace('/'.preg_quote(DOL_URL_ROOT,'/').'$/i','',trim($dolibarr_main_url_root));
704
-		$urlwithroot=$urlwithouturlroot.DOL_URL_ROOT;		// This is to use external domain name found into config file
705
-		//$urlwithroot=DOL_MAIN_URL_ROOT;					// This is to use same domain name than current
706
-
707
-		$forcedownload=0;
708
-
709
-		$paramlink='';
710
-		//if (! empty($modulepart)) $paramlink.=($paramlink?'&':'').'modulepart='.$modulepart;		// For sharing with hash (so public files), modulepart is not required.
711
-		//if (! empty($ecmfile->entity)) $paramlink.='&entity='.$ecmfile->entity; 					// For sharing with hash (so public files), entity is not required.
712
-		//$paramlink.=($paramlink?'&':'').'file='.urlencode($filepath);								// No need of name of file for public link, we will use the hash
713
-		if (! empty($ecmfile->share)) $paramlink.=($paramlink?'&':'').'hashp='.$ecmfile->share;			// Hash for public share
714
-		if ($forcedownload) $paramlink.=($paramlink?'&':'').'attachment=1';
715
-
716
-		if ($relativelink)
717
-		{
718
-			$linktoreturn='document.php'.($paramlink?'?'.$paramlink:'');
719
-		}
720
-		else
721
-		{
722
-			$linktoreturn=$urlwithroot.'/document.php'.($paramlink?'?'.$paramlink:'');
723
-		}
724
-
725
-		// Here $ecmfile->share is defined
726
-		return $linktoreturn;
727
-	}
70
+    /**
71
+     * @var string Name of table without prefix where object is stored
72
+     */
73
+    public $table_element;
728 74
 
75
+    /**
76
+     * @var int    Name of subtable line
77
+     */
78
+    public $table_element_line='';
729 79
 
730
-    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
731
-	/**
732
-	 *  Add a link between element $this->element and a contact
733
-	 *
734
-	 *  @param	int		$fk_socpeople       Id of thirdparty contact (if source = 'external') or id of user (if souce = 'internal') to link
735
-	 *  @param 	int		$type_contact 		Type of contact (code or id). Must be id or code found into table llx_c_type_contact. For example: SALESREPFOLL
736
-	 *  @param  string	$source             external=Contact extern (llx_socpeople), internal=Contact intern (llx_user)
737
-	 *  @param  int		$notrigger			Disable all triggers
738
-	 *  @return int                 		<0 if KO, >0 if OK
739
-	 */
740
-	function add_contact($fk_socpeople, $type_contact, $source='external',$notrigger=0)
741
-	{
742
-        // phpcs:enable
743
-		global $user,$langs;
744
-
745
-
746
-		dol_syslog(get_class($this)."::add_contact $fk_socpeople, $type_contact, $source, $notrigger");
747
-
748
-		// Check parameters
749
-		if ($fk_socpeople <= 0)
750
-		{
751
-			$langs->load("errors");
752
-			$this->error=$langs->trans("ErrorWrongValueForParameterX","1");
753
-			dol_syslog(get_class($this)."::add_contact ".$this->error,LOG_ERR);
754
-			return -1;
755
-		}
756
-		if (! $type_contact)
757
-		{
758
-			$langs->load("errors");
759
-			$this->error=$langs->trans("ErrorWrongValueForParameterX","2");
760
-			dol_syslog(get_class($this)."::add_contact ".$this->error,LOG_ERR);
761
-			return -2;
762
-		}
763
-
764
-		$id_type_contact=0;
765
-		if (is_numeric($type_contact))
766
-		{
767
-			$id_type_contact=$type_contact;
768
-		}
769
-		else
770
-		{
771
-			// We look for id type_contact
772
-			$sql = "SELECT tc.rowid";
773
-			$sql.= " FROM ".MAIN_DB_PREFIX."c_type_contact as tc";
774
-			$sql.= " WHERE tc.element='".$this->db->escape($this->element)."'";
775
-			$sql.= " AND tc.source='".$this->db->escape($source)."'";
776
-			$sql.= " AND tc.code='".$this->db->escape($type_contact)."' AND tc.active=1";
777
-			//print $sql;
778
-			$resql=$this->db->query($sql);
779
-			if ($resql)
780
-			{
781
-				$obj = $this->db->fetch_object($resql);
782
-				if ($obj) $id_type_contact=$obj->rowid;
783
-			}
784
-		}
785
-
786
-		if ($id_type_contact == 0)
787
-		{
788
-			$this->error='CODE_NOT_VALID_FOR_THIS_ELEMENT';
789
-			dol_syslog("CODE_NOT_VALID_FOR_THIS_ELEMENT: Code type of contact '".$type_contact."' does not exists or is not active for element ".$this->element.", we can ignore it");
790
-			return -3;
791
-		}
792
-
793
-		$datecreate = dol_now();
794
-
795
-		// Socpeople must have already been added by some trigger, then we have to check it to avoid DB_ERROR_RECORD_ALREADY_EXISTS error
796
-		$TListeContacts=$this->liste_contact(-1, $source);
797
-		$already_added=false;
798
-		if(!empty($TListeContacts)) {
799
-			foreach($TListeContacts as $array_contact) {
800
-				if($array_contact['status'] == 4 && $array_contact['id'] == $fk_socpeople && $array_contact['fk_c_type_contact'] == $id_type_contact) {
801
-					$already_added=true;
802
-					break;
803
-				}
804
-			}
805
-		}
80
+    /**
81
+     * @var string		Key value used to track if data is coming from import wizard
82
+     */
83
+    public $import_key;
806 84
 
807
-		if(!$already_added) {
85
+    /**
86
+     * @var mixed		Contains data to manage extrafields
87
+     */
88
+    public $array_options=array();
808 89
 
809
-			$this->db->begin();
90
+    /**
91
+     * @var int[][]		Array of linked objects ids. Loaded by ->fetchObjectLinked
92
+     */
93
+    public $linkedObjectsIds;
810 94
 
811
-			// Insert into database
812
-			$sql = "INSERT INTO ".MAIN_DB_PREFIX."element_contact";
813
-			$sql.= " (element_id, fk_socpeople, datecreate, statut, fk_c_type_contact) ";
814
-			$sql.= " VALUES (".$this->id.", ".$fk_socpeople." , " ;
815
-			$sql.= "'".$this->db->idate($datecreate)."'";
816
-			$sql.= ", 4, ". $id_type_contact;
817
-			$sql.= ")";
95
+    /**
96
+     * @var mixed		Array of linked objects. Loaded by ->fetchObjectLinked
97
+     */
98
+    public $linkedObjects;
818 99
 
819
-			$resql=$this->db->query($sql);
820
-			if ($resql)
821
-			{
822
-				if (! $notrigger)
823
-				{
824
-					$result=$this->call_trigger(strtoupper($this->element).'_ADD_CONTACT', $user);
825
-					if ($result < 0)
826
-					{
827
-						$this->db->rollback();
828
-						return -1;
829
-					}
830
-				}
100
+    /**
101
+     * @var Object      To store a cloned copy of object before to edit it and keep track of old properties
102
+     */
103
+    public $oldcopy;
831 104
 
832
-				$this->db->commit();
833
-				return 1;
834
-			}
835
-			else
836
-			{
837
-				if ($this->db->errno() == 'DB_ERROR_RECORD_ALREADY_EXISTS')
838
-				{
839
-					$this->error=$this->db->errno();
840
-					$this->db->rollback();
841
-					echo 'err rollback';
842
-					return -2;
843
-				}
844
-				else
845
-				{
846
-					$this->error=$this->db->error();
847
-					$this->db->rollback();
848
-					return -1;
849
-				}
850
-			}
851
-		} else return 0;
852
-	}
105
+    /**
106
+     * @var string		Column name of the ref field.
107
+     */
108
+    protected $table_ref_field = '';
853 109
 
854
-    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
855
-	/**
856
-	 *    Copy contact from one element to current
857
-	 *
858
-	 *    @param    CommonObject    $objFrom    Source element
859
-	 *    @param    string          $source     Nature of contact ('internal' or 'external')
860
-	 *    @return   int                         >0 if OK, <0 if KO
861
-	 */
862
-	function copy_linked_contact($objFrom, $source='internal')
863
-	{
864
-        // phpcs:enable
865
-		$contacts = $objFrom->liste_contact(-1, $source);
866
-		foreach($contacts as $contact)
867
-		{
868
-			if ($this->add_contact($contact['id'], $contact['fk_c_type_contact'], $contact['source']) < 0)
869
-			{
870
-				$this->error=$this->db->lasterror();
871
-				return -1;
872
-			}
873
-		}
874
-		return 1;
875
-	}
876 110
 
877
-    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
878
-	/**
879
-	 *      Update a link to contact line
880
-	 *
881
-	 *      @param	int		$rowid              Id of line contact-element
882
-	 * 		@param	int		$statut	            New status of link
883
-	 *      @param  int		$type_contact_id    Id of contact type (not modified if 0)
884
-	 *      @param  int		$fk_socpeople	    Id of soc_people to update (not modified if 0)
885
-	 *      @return int                 		<0 if KO, >= 0 if OK
886
-	 */
887
-	function update_contact($rowid, $statut, $type_contact_id=0, $fk_socpeople=0)
888
-	{
889
-        // phpcs:enable
890
-		// Insert into database
891
-		$sql = "UPDATE ".MAIN_DB_PREFIX."element_contact set";
892
-		$sql.= " statut = ".$statut;
893
-		if ($type_contact_id) $sql.= ", fk_c_type_contact = '".$type_contact_id ."'";
894
-		if ($fk_socpeople) $sql.= ", fk_socpeople = '".$fk_socpeople ."'";
895
-		$sql.= " where rowid = ".$rowid;
896
-		$resql=$this->db->query($sql);
897
-		if ($resql)
898
-		{
899
-			return 0;
900
-		}
901
-		else
902
-		{
903
-			$this->error=$this->db->lasterror();
904
-			return -1;
905
-		}
906
-	}
907 111
 
908
-    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
909
-	/**
910
-	 *    Delete a link to contact line
911
-	 *
912
-	 *    @param	int		$rowid			Id of contact link line to delete
913
-	 *    @param	int		$notrigger		Disable all triggers
914
-	 *    @return   int						>0 if OK, <0 if KO
915
-	 */
916
-	function delete_contact($rowid, $notrigger=0)
917
-	{
918
-        // phpcs:enable
919
-		global $user;
112
+    // Following vars are used by some objects only. We keep this property here in CommonObject to be able to provide common method using them.
920 113
 
114
+    /**
115
+     * @var array<string,mixed>		Can be used to pass information when only object is provided to method
116
+     */
117
+    public $context=array();
921 118
 
922
-		$this->db->begin();
119
+    /**
120
+     * @var string		Contains canvas name if record is an alternative canvas record
121
+     */
122
+    public $canvas;
923 123
 
924
-		$sql = "DELETE FROM ".MAIN_DB_PREFIX."element_contact";
925
-		$sql.= " WHERE rowid =".$rowid;
124
+    /**
125
+     * @var Project The related project
126
+     * @see fetch_projet()
127
+     */
128
+    public $project;
926 129
 
927
-		dol_syslog(get_class($this)."::delete_contact", LOG_DEBUG);
928
-		if ($this->db->query($sql))
929
-		{
930
-			if (! $notrigger)
931
-			{
932
-				$result=$this->call_trigger(strtoupper($this->element).'_DELETE_CONTACT', $user);
933
-				if ($result < 0) { $this->db->rollback(); return -1; }
934
-			}
935
-
936
-			$this->db->commit();
937
-			return 1;
938
-		}
939
-		else
940
-		{
941
-			$this->error=$this->db->lasterror();
942
-			$this->db->rollback();
943
-			return -1;
944
-		}
945
-	}
130
+    /**
131
+     * @var int The related project ID
132
+     * @see setProject(), project
133
+     */
134
+    public $fk_project;
946 135
 
947
-    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
948
-	/**
949
-	 *    Delete all links between an object $this and all its contacts
950
-	 *
951
-	 *	  @param	string	$source		'' or 'internal' or 'external'
952
-	 *	  @param	string	$code		Type of contact (code or id)
953
-	 *    @return   int					>0 if OK, <0 if KO
954
-	 */
955
-	function delete_linked_contact($source='',$code='')
956
-	{
957
-        // phpcs:enable
958
-		$temp = array();
959
-		$typeContact = $this->liste_type_contact($source,'',0,0,$code);
960
-
961
-		foreach($typeContact as $key => $value)
962
-		{
963
-			array_push($temp,$key);
964
-		}
965
-		$listId = implode(",", $temp);
966
-
967
-		$sql = "DELETE FROM ".MAIN_DB_PREFIX."element_contact";
968
-		$sql.= " WHERE element_id = ".$this->id;
969
-		if ($listId)
970
-			$sql.= " AND fk_c_type_contact IN (".$listId.")";
971
-
972
-		dol_syslog(get_class($this)."::delete_linked_contact", LOG_DEBUG);
973
-		if ($this->db->query($sql))
974
-		{
975
-			return 1;
976
-		}
977
-		else
978
-		{
979
-			$this->error=$this->db->lasterror();
980
-			return -1;
981
-		}
982
-	}
136
+    /**
137
+     * @deprecated
138
+     * @see project
139
+     */
140
+    public $projet;
983 141
 
984
-    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
985
-	/**
986
-	 *    Get array of all contacts for an object
987
-	 *
988
-	 *    @param	int			$statut		Status of links to get (-1=all)
989
-	 *    @param	string		$source		Source of contact: external or thirdparty (llx_socpeople) or internal (llx_user)
990
-	 *    @param	int         $list       0:Return array contains all properties, 1:Return array contains just id
991
-	 *    @param    string      $code       Filter on this code of contact type ('SHIPPING', 'BILLING', ...)
992
-	 *    @return	array|int		        Array of contacts, -1 if error
993
-	 */
994
-	function liste_contact($statut=-1,$source='external',$list=0,$code='')
995
-	{
996
-        // phpcs:enable
997
-		global $langs;
998
-
999
-		$tab=array();
1000
-
1001
-		$sql = "SELECT ec.rowid, ec.statut as statuslink, ec.fk_socpeople as id, ec.fk_c_type_contact";    // This field contains id of llx_socpeople or id of llx_user
1002
-		if ($source == 'internal') $sql.=", '-1' as socid, t.statut as statuscontact, t.login, t.photo";
1003
-		if ($source == 'external' || $source == 'thirdparty') $sql.=", t.fk_soc as socid, t.statut as statuscontact";
1004
-		$sql.= ", t.civility as civility, t.lastname as lastname, t.firstname, t.email";
1005
-		$sql.= ", tc.source, tc.element, tc.code, tc.libelle";
1006
-		$sql.= " FROM ".MAIN_DB_PREFIX."c_type_contact tc";
1007
-		$sql.= ", ".MAIN_DB_PREFIX."element_contact ec";
1008
-		if ($source == 'internal') $sql.=" LEFT JOIN ".MAIN_DB_PREFIX."user t on ec.fk_socpeople = t.rowid";
1009
-		if ($source == 'external'|| $source == 'thirdparty') $sql.=" LEFT JOIN ".MAIN_DB_PREFIX."socpeople t on ec.fk_socpeople = t.rowid";
1010
-		$sql.= " WHERE ec.element_id =".$this->id;
1011
-		$sql.= " AND ec.fk_c_type_contact=tc.rowid";
1012
-		$sql.= " AND tc.element='".$this->db->escape($this->element)."'";
1013
-		if ($code) $sql.= " AND tc.code = '".$this->db->escape($code)."'";
1014
-		if ($source == 'internal') $sql.= " AND tc.source = 'internal'";
1015
-		if ($source == 'external' || $source == 'thirdparty') $sql.= " AND tc.source = 'external'";
1016
-		$sql.= " AND tc.active=1";
1017
-		if ($statut >= 0) $sql.= " AND ec.statut = '".$statut."'";
1018
-		$sql.=" ORDER BY t.lastname ASC";
1019
-
1020
-		dol_syslog(get_class($this)."::liste_contact", LOG_DEBUG);
1021
-		$resql=$this->db->query($sql);
1022
-		if ($resql)
1023
-		{
1024
-			$num=$this->db->num_rows($resql);
1025
-			$i=0;
1026
-			while ($i < $num)
1027
-			{
1028
-				$obj = $this->db->fetch_object($resql);
142
+    /**
143
+     * @var Contact a related contact
144
+     * @see fetch_contact()
145
+     */
146
+    public $contact;
1029 147
 
1030
-				if (! $list)
1031
-				{
1032
-					$transkey="TypeContact_".$obj->element."_".$obj->source."_".$obj->code;
1033
-					$libelle_type=($langs->trans($transkey)!=$transkey ? $langs->trans($transkey) : $obj->libelle);
1034
-					$tab[$i]=array('source'=>$obj->source,'socid'=>$obj->socid,'id'=>$obj->id,
1035
-								   'nom'=>$obj->lastname,      // For backward compatibility
1036
-								   'civility'=>$obj->civility, 'lastname'=>$obj->lastname, 'firstname'=>$obj->firstname, 'email'=>$obj->email, 'login'=>$obj->login, 'photo'=>$obj->photo, 'statuscontact'=>$obj->statuscontact,
1037
-								   'rowid'=>$obj->rowid, 'code'=>$obj->code, 'libelle'=>$libelle_type, 'status'=>$obj->statuslink, 'fk_c_type_contact'=>$obj->fk_c_type_contact);
1038
-				}
1039
-				else
1040
-				{
1041
-					$tab[$i]=$obj->id;
1042
-				}
148
+    /**
149
+     * @var int The related contact ID
150
+     * @see fetch_contact()
151
+     */
152
+    public $contact_id;
1043 153
 
1044
-				$i++;
1045
-			}
1046
-
1047
-			return $tab;
1048
-		}
1049
-		else
1050
-		{
1051
-			$this->error=$this->db->lasterror();
1052
-			dol_print_error($this->db);
1053
-			return -1;
1054
-		}
1055
-	}
1056
-
1057
-
1058
-	/**
1059
-	 * 		Update status of a contact linked to object
1060
-	 *
1061
-	 * 		@param	int		$rowid		Id of link between object and contact
1062
-	 * 		@return	int					<0 if KO, >=0 if OK
1063
-	 */
1064
-	function swapContactStatus($rowid)
1065
-	{
1066
-		$sql = "SELECT ec.datecreate, ec.statut, ec.fk_socpeople, ec.fk_c_type_contact,";
1067
-		$sql.= " tc.code, tc.libelle";
1068
-		//$sql.= ", s.fk_soc";
1069
-		$sql.= " FROM (".MAIN_DB_PREFIX."element_contact as ec, ".MAIN_DB_PREFIX."c_type_contact as tc)";
1070
-		//$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."socpeople as s ON ec.fk_socpeople=s.rowid";	// Si contact de type external, alors il est lie a une societe
1071
-		$sql.= " WHERE ec.rowid =".$rowid;
1072
-		$sql.= " AND ec.fk_c_type_contact=tc.rowid";
1073
-		$sql.= " AND tc.element = '".$this->db->escape($this->element)."'";
1074
-
1075
-		dol_syslog(get_class($this)."::swapContactStatus", LOG_DEBUG);
1076
-		$resql=$this->db->query($sql);
1077
-		if ($resql)
1078
-		{
1079
-			$obj = $this->db->fetch_object($resql);
1080
-			$newstatut = ($obj->statut == 4) ? 5 : 4;
1081
-			$result = $this->update_contact($rowid, $newstatut);
1082
-			$this->db->free($resql);
1083
-			return $result;
1084
-		}
1085
-		else
1086
-		{
1087
-			$this->error=$this->db->error();
1088
-			dol_print_error($this->db);
1089
-			return -1;
1090
-		}
1091
-	}
154
+    /**
155
+     * @var Societe A related thirdparty
156
+     * @see fetch_thirdparty()
157
+     */
158
+    public $thirdparty;
1092 159
 
1093
-    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
1094
-	/**
1095
-	 *      Return array with list of possible values for type of contacts
1096
-	 *
1097
-	 *      @param	string	$source     'internal', 'external' or 'all'
1098
-	 *      @param	string	$order		Sort order by : 'position', 'code', 'rowid'...
1099
-	 *      @param  int		$option     0=Return array id->label, 1=Return array code->label
1100
-	 *      @param  int		$activeonly 0=all status of contact, 1=only the active
1101
-	 *		@param	string	$code		Type of contact (Example: 'CUSTOMER', 'SERVICE')
1102
-	 *      @return array       		Array list of type of contacts (id->label if option=0, code->label if option=1)
1103
-	 */
1104
-	function liste_type_contact($source='internal', $order='position', $option=0, $activeonly=0, $code='')
1105
-	{
1106
-        // phpcs:enable
1107
-		global $langs;
1108
-
1109
-		if (empty($order)) $order='position';
1110
-		if ($order == 'position') $order.=',code';
1111
-
1112
-		$tab = array();
1113
-		$sql = "SELECT DISTINCT tc.rowid, tc.code, tc.libelle, tc.position";
1114
-		$sql.= " FROM ".MAIN_DB_PREFIX."c_type_contact as tc";
1115
-		$sql.= " WHERE tc.element='".$this->db->escape($this->element)."'";
1116
-		if ($activeonly == 1) $sql.= " AND tc.active=1"; // only the active types
1117
-		if (! empty($source) && $source != 'all') $sql.= " AND tc.source='".$this->db->escape($source)."'";
1118
-		if (! empty($code)) $sql.= " AND tc.code='".$this->db->escape($code)."'";
1119
-		$sql.= $this->db->order($order,'ASC');
1120
-
1121
-		//print "sql=".$sql;
1122
-		$resql=$this->db->query($sql);
1123
-		if ($resql)
1124
-		{
1125
-			$num=$this->db->num_rows($resql);
1126
-			$i=0;
1127
-			while ($i < $num)
1128
-			{
1129
-				$obj = $this->db->fetch_object($resql);
1130
-
1131
-				$transkey="TypeContact_".$this->element."_".$source."_".$obj->code;
1132
-				$libelle_type=($langs->trans($transkey)!=$transkey ? $langs->trans($transkey) : $obj->libelle);
1133
-				if (empty($option)) $tab[$obj->rowid]=$libelle_type;
1134
-				else $tab[$obj->code]=$libelle_type;
1135
-				$i++;
1136
-			}
1137
-			return $tab;
1138
-		}
1139
-		else
1140
-		{
1141
-			$this->error=$this->db->lasterror();
1142
-			//dol_print_error($this->db);
1143
-			return null;
1144
-		}
1145
-	}
1146
-
1147
-	/**
1148
-	 *      Return id of contacts for a source and a contact code.
1149
-	 *      Example: contact client de facturation ('external', 'BILLING')
1150
-	 *      Example: contact client de livraison ('external', 'SHIPPING')
1151
-	 *      Example: contact interne suivi paiement ('internal', 'SALESREPFOLL')
1152
-	 *
1153
-	 *		@param	string	$source		'external' or 'internal'
1154
-	 *		@param	string	$code		'BILLING', 'SHIPPING', 'SALESREPFOLL', ...
1155
-	 *		@param	int		$status		limited to a certain status
1156
-	 *      @return array       		List of id for such contacts
1157
-	 */
1158
-	function getIdContact($source,$code,$status=0)
1159
-	{
1160
-		global $conf;
1161
-
1162
-		$result=array();
1163
-		$i=0;
1164
-		//cas particulier pour les expeditions
1165
-		if($this->element=='shipping' && $this->origin_id != 0) {
1166
-			$id=$this->origin_id;
1167
-			$element='commande';
1168
-        } else if($this->element=='reception' && $this->origin_id != 0) {
1169
-            $id=$this->origin_id;
1170
-            $element='order_supplier';
1171
-		} else {
1172
-			$id=$this->id;
1173
-			$element=$this->element;
1174
-		}
1175
-
1176
-		$sql = "SELECT ec.fk_socpeople";
1177
-		$sql.= " FROM ".MAIN_DB_PREFIX."element_contact as ec,";
1178
-		if ($source == 'internal') $sql.= " ".MAIN_DB_PREFIX."user as c,";
1179
-		if ($source == 'external') $sql.= " ".MAIN_DB_PREFIX."socpeople as c,";
1180
-		$sql.= " ".MAIN_DB_PREFIX."c_type_contact as tc";
1181
-		$sql.= " WHERE ec.element_id = ".$id;
1182
-		$sql.= " AND ec.fk_socpeople = c.rowid";
1183
-		if ($source == 'internal') $sql.= " AND c.entity IN (".getEntity('user').")";
1184
-		if ($source == 'external') $sql.= " AND c.entity IN (".getEntity('societe').")";
1185
-		$sql.= " AND ec.fk_c_type_contact = tc.rowid";
1186
-		$sql.= " AND tc.element = '".$element."'";
1187
-		$sql.= " AND tc.source = '".$source."'";
1188
-		$sql.= " AND tc.code = '".$code."'";
1189
-		$sql.= " AND tc.active = 1";
1190
-		if ($status) $sql.= " AND ec.statut = ".$status;
1191
-
1192
-		dol_syslog(get_class($this)."::getIdContact", LOG_DEBUG);
1193
-		$resql=$this->db->query($sql);
1194
-		if ($resql)
1195
-		{
1196
-			while ($obj = $this->db->fetch_object($resql))
1197
-			{
1198
-				$result[$i]=$obj->fk_socpeople;
1199
-				$i++;
1200
-			}
1201
-		}
1202
-		else
1203
-		{
1204
-			$this->error=$this->db->error();
1205
-			return null;
1206
-		}
1207
-
1208
-		return $result;
1209
-	}
160
+    /**
161
+     * @var User A related user
162
+     * @see fetch_user()
163
+     */
164
+    public $user;
1210 165
 
1211
-    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
1212
-	/**
1213
-	 *		Load object contact with id=$this->contactid into $this->contact
1214
-	 *
1215
-	 *		@param	int		$contactid      Id du contact. Use this->contactid if empty.
1216
-	 *		@return	int						<0 if KO, >0 if OK
1217
-	 */
1218
-	function fetch_contact($contactid=null)
1219
-	{
1220
-        // phpcs:enable
1221
-		if (empty($contactid)) $contactid=$this->contactid;
166
+    /**
167
+     * @var string 	The type of originating object ('commande', 'facture', ...)
168
+     * @see fetch_origin()
169
+     */
170
+    public $origin;
1222 171
 
1223
-		if (empty($contactid)) return 0;
172
+    /**
173
+     * @var int 	The id of originating object
174
+     * @see fetch_origin()
175
+     */
176
+    public $origin_id;
1224 177
 
1225
-		require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php';
1226
-		$contact = new Contact($this->db);
1227
-		$result=$contact->fetch($contactid);
1228
-		$this->contact = $contact;
1229
-		return $result;
1230
-	}
178
+    /**
179
+     * @var string The object's reference
180
+     */
181
+    public $ref;
1231 182
 
1232
-    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
1233
-	/**
1234
-	 *    	Load the third party of object, from id $this->socid or $this->fk_soc, into this->thirdparty
1235
-	 *
1236
-	 *		@param		int		$force_thirdparty_id	Force thirdparty id
1237
-	 *		@return		int								<0 if KO, >0 if OK
1238
-	 */
1239
-	function fetch_thirdparty($force_thirdparty_id=0)
1240
-	{
1241
-        // phpcs:enable
1242
-		global $conf;
183
+    /**
184
+     * @var string The object's previous reference
185
+     */
186
+    public $ref_previous;
1243 187
 
1244
-		if (empty($this->socid) && empty($this->fk_soc) && empty($this->fk_thirdparty) && empty($force_thirdparty_id))
1245
-			return 0;
188
+    /**
189
+     * @var string The object's next reference
190
+     */
191
+    public $ref_next;
1246 192
 
1247
-		require_once DOL_DOCUMENT_ROOT . '/societe/class/societe.class.php';
193
+    /**
194
+     * @var string An external reference for the object
195
+     */
196
+    public $ref_ext;
1248 197
 
1249
-		$idtofetch = isset($this->socid) ? $this->socid : (isset($this->fk_soc) ? $this->fk_soc : $this->fk_thirdparty);
1250
-		if ($force_thirdparty_id)
1251
-			$idtofetch = $force_thirdparty_id;
198
+    /**
199
+     * @var int The object's status
200
+     * @see setStatut()
201
+     */
202
+    public $statut;
1252 203
 
1253
-		if ($idtofetch) {
1254
-			$thirdparty = new Societe($this->db);
1255
-			$result = $thirdparty->fetch($idtofetch);
1256
-			$this->thirdparty = $thirdparty;
204
+    /**
205
+     * @var string
206
+     * @see getFullAddress()
207
+     */
208
+    public $country;
1257 209
 
1258
-			// Use first price level if level not defined for third party
1259
-			if (!empty($conf->global->PRODUIT_MULTIPRICES) && empty($this->thirdparty->price_level)) {
1260
-				$this->thirdparty->price_level = 1;
1261
-			}
210
+    /**
211
+     * @var int
212
+     * @see getFullAddress(), country
213
+     */
214
+    public $country_id;
1262 215
 
1263
-			return $result;
1264
-		} else
1265
-			return -1;
1266
-	}
216
+    /**
217
+     * @var string
218
+     * @see getFullAddress(), isInEEC(), country
219
+     */
220
+    public $country_code;
1267 221
 
222
+    /**
223
+     * @var string
224
+     * @see getFullAddress()
225
+     */
226
+    public $state;
1268 227
 
1269
-	/**
1270
-	 * Looks for an object with ref matching the wildcard provided
1271
-	 * It does only work when $this->table_ref_field is set
1272
-	 *
1273
-	 * @param string $ref Wildcard
1274
-	 * @return int >1 = OK, 0 = Not found or table_ref_field not defined, <0 = KO
1275
-	 */
1276
-	public function fetchOneLike($ref)
1277
-	{
1278
-		if (!$this->table_ref_field) {
1279
-			return 0;
1280
-		}
228
+    /**
229
+     * @var int
230
+     * @see getFullAddress(), state
231
+     */
232
+    public $state_id;
1281 233
 
1282
-		$sql = 'SELECT rowid FROM '.MAIN_DB_PREFIX.$this->table_element.' WHERE '.$this->table_ref_field.' LIKE "'.$this->db->escape($ref).'" LIMIT 1';
234
+    /**
235
+     * @var string
236
+     * @see getFullAddress(), state
237
+     */
238
+    public $state_code;
1283 239
 
1284
-		$query = $this->db->query($sql);
240
+    /**
241
+     * @var string
242
+     * @see getFullAddress(), region
243
+     */
244
+    public $region;
1285 245
 
1286
-		if (!$this->db->num_rows($query)) {
1287
-			return 0;
1288
-		}
246
+    /**
247
+     * @var string
248
+     * @see getFullAddress(), region
249
+     */
250
+    public $region_code;
1289 251
 
1290
-		$result = $this->db->fetch_object($query);
252
+    /**
253
+     * @var int
254
+     * @see fetch_barcode()
255
+     */
256
+    public $barcode_type;
1291 257
 
1292
-		return $this->fetch($result->rowid);
1293
-	}
258
+    /**
259
+     * @var string
260
+     * @see fetch_barcode(), barcode_type
261
+     */
262
+    public $barcode_type_code;
1294 263
 
1295
-    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
1296
-	/**
1297
-	 *	Load data for barcode into properties ->barcode_type*
1298
-	 *	Properties ->barcode_type that is id of barcode. Type is used to find other properties, but
1299
-	 *  if it is not defined, ->element must be defined to know default barcode type.
1300
-	 *
1301
-	 *	@return		int			<0 if KO, 0 if can't guess type of barcode (ISBN, EAN13...), >0 if OK (all barcode properties loaded)
1302
-	 */
1303
-	function fetch_barcode()
1304
-	{
1305
-        // phpcs:enable
1306
-		global $conf;
264
+    /**
265
+     * @var string
266
+     * @see fetch_barcode(), barcode_type
267
+     */
268
+    public $barcode_type_label;
1307 269
 
1308
-		dol_syslog(get_class($this).'::fetch_barcode this->element='.$this->element.' this->barcode_type='.$this->barcode_type);
270
+    /**
271
+     * @var string
272
+     * @see fetch_barcode(), barcode_type
273
+     */
274
+    public $barcode_type_coder;
1309 275
 
1310
-		$idtype=$this->barcode_type;
1311
-		if (empty($idtype) && $idtype != '0')	// If type of barcode no set, we try to guess. If set to '0' it means we forced to have type remain not defined
1312
-		{
1313
-			if ($this->element == 'product')      $idtype = $conf->global->PRODUIT_DEFAULT_BARCODE_TYPE;
1314
-			else if ($this->element == 'societe') $idtype = $conf->global->GENBARCODE_BARCODETYPE_THIRDPARTY;
1315
-			else dol_syslog('Call fetch_barcode with barcode_type not defined and cant be guessed', LOG_WARNING);
1316
-		}
276
+    /**
277
+     * @var int Payment method ID (cheque, cash, ...)
278
+     * @see setPaymentMethods()
279
+     */
280
+    public $mode_reglement_id;
1317 281
 
1318
-		if ($idtype > 0)
1319
-		{
1320
-			if (empty($this->barcode_type) || empty($this->barcode_type_code) || empty($this->barcode_type_label) || empty($this->barcode_type_coder))    // If data not already loaded
1321
-			{
1322
-				$sql = "SELECT rowid, code, libelle as label, coder";
1323
-				$sql.= " FROM ".MAIN_DB_PREFIX."c_barcode_type";
1324
-				$sql.= " WHERE rowid = ".$idtype;
1325
-				dol_syslog(get_class($this).'::fetch_barcode', LOG_DEBUG);
1326
-				$resql = $this->db->query($sql);
1327
-				if ($resql)
1328
-				{
1329
-					$obj = $this->db->fetch_object($resql);
1330
-					$this->barcode_type       = $obj->rowid;
1331
-					$this->barcode_type_code  = $obj->code;
1332
-					$this->barcode_type_label = $obj->label;
1333
-					$this->barcode_type_coder = $obj->coder;
1334
-					return 1;
1335
-				}
1336
-				else
1337
-				{
1338
-					dol_print_error($this->db);
1339
-					return -1;
1340
-				}
1341
-			}
1342
-		}
1343
-		return 0;
1344
-	}
282
+    /**
283
+     * @var int Payment terms ID
284
+     * @see setPaymentTerms()
285
+     */
286
+    public $cond_reglement_id;
1345 287
 
1346
-    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
1347
-	/**
1348
-	 *		Load the project with id $this->fk_project into this->project
1349
-	 *
1350
-	 *		@return		int			<0 if KO, >=0 if OK
1351
-	 */
1352
-	function fetch_projet()
1353
-	{
1354
-        // phpcs:enable
1355
-		include_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
288
+    /**
289
+     * @var int Payment terms ID
290
+     * @deprecated Kept for compatibility
291
+     * @see cond_reglement_id;
292
+     */
293
+    public $cond_reglement;
1356 294
 
1357
-		if (empty($this->fk_project) && ! empty($this->fk_projet)) $this->fk_project = $this->fk_projet;	// For backward compatibility
1358
-		if (empty($this->fk_project)) return 0;
295
+    /**
296
+     * @var int Delivery address ID
297
+     * @deprecated
298
+     * @see setDeliveryAddress()
299
+     */
300
+    public $fk_delivery_address;
1359 301
 
1360
-		$project = new Project($this->db);
1361
-		$result = $project->fetch($this->fk_project);
302
+    /**
303
+     * @var int Shipping method ID
304
+     * @see setShippingMethod()
305
+     */
306
+    public $shipping_method_id;
1362 307
 
1363
-		$this->projet = $project;	// deprecated
1364
-		$this->project = $project;
1365
-		return $result;
1366
-	}
308
+    /**
309
+     * @var string
310
+     * @see SetDocModel()
311
+     */
312
+    public $modelpdf;
1367 313
 
1368
-    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
1369
-	/**
1370
-	 *		Load the product with id $this->fk_product into this->product
1371
-	 *
1372
-	 *		@return		int			<0 if KO, >=0 if OK
1373
-	 */
1374
-	function fetch_product()
1375
-	{
1376
-        // phpcs:enable
1377
-		include_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
314
+    /**
315
+     * @var int Bank account ID
316
+     * @see SetBankAccount()
317
+     */
318
+    public $fk_account;
1378 319
 
1379
-		if (empty($this->fk_product)) return 0;
320
+    /**
321
+     * @var string Public note
322
+     * @see update_note()
323
+     */
324
+    public $note_public;
1380 325
 
1381
-		$product = new Product($this->db);
1382
-		$result = $product->fetch($this->fk_product);
326
+    /**
327
+     * @var string Private note
328
+     * @see update_note()
329
+     */
330
+    public $note_private;
1383 331
 
1384
-		$this->product = $product;
1385
-		return $result;
1386
-	}
332
+    /**
333
+     * @deprecated
334
+     * @see note_public
335
+     */
336
+    public $note;
1387 337
 
1388
-    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
1389
-	/**
1390
-	 *		Load the user with id $userid into this->user
1391
-	 *
1392
-	 *		@param	int		$userid 		Id du contact
1393
-	 *		@return	int						<0 if KO, >0 if OK
1394
-	 */
1395
-	function fetch_user($userid)
1396
-	{
1397
-        // phpcs:enable
1398
-		$user = new User($this->db);
1399
-		$result=$user->fetch($userid);
1400
-		$this->user = $user;
1401
-		return $result;
1402
-	}
338
+    /**
339
+     * @var float Total amount before taxes
340
+     * @see update_price()
341
+     */
342
+    public $total_ht;
1403 343
 
1404
-    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
1405
-	/**
1406
-	 *	Read linked origin object
1407
-	 *
1408
-	 *	@return		void
1409
-	 */
1410
-	function fetch_origin()
1411
-	{
1412
-        // phpcs:enable
1413
-		if ($this->origin == 'shipping') $this->origin = 'expedition';
1414
-		if ($this->origin == 'delivery') $this->origin = 'livraison';
1415
-        if ($this->origin == 'order_supplier') $this->origin = 'commandeFournisseur';
344
+    /**
345
+     * @var float Total VAT amount
346
+     * @see update_price()
347
+     */
348
+    public $total_tva;
1416 349
 
1417
-		$origin = $this->origin;
350
+    /**
351
+     * @var float Total local tax 1 amount
352
+     * @see update_price()
353
+     */
354
+    public $total_localtax1;
1418 355
 
1419
-		$classname = ucfirst($origin);
1420
-		$this->$origin = new $classname($this->db);
1421
-		$this->$origin->fetch($this->origin_id);
1422
-	}
356
+    /**
357
+     * @var float Total local tax 2 amount
358
+     * @see update_price()
359
+     */
360
+    public $total_localtax2;
1423 361
 
1424
-	/**
1425
-     *  Load object from specific field
1426
-     *
1427
-     *  @param	string	$table		Table element or element line
1428
-     *  @param	string	$field		Field selected
1429
-     *  @param	string	$key		Import key
1430
-     *  @param	string	$element	Element name
1431
-     *	@return	int					<0 if KO, >0 if OK
362
+    /**
363
+     * @var float Total amount with taxes
364
+     * @see update_price()
1432 365
      */
1433
-	function fetchObjectFrom($table, $field, $key, $element = null)
1434
-	{
1435
-		global $conf;
1436
-
1437
-		$result=false;
1438
-
1439
-		$sql = "SELECT rowid FROM ".MAIN_DB_PREFIX.$table;
1440
-		$sql.= " WHERE ".$field." = '".$key."'";
1441
-		if (! empty($element)) {
1442
-			$sql.= " AND entity IN (".getEntity($element).")";
1443
-		} else {
1444
-			$sql.= " AND entity = ".$conf->entity;
1445
-		}
1446
-
1447
-		dol_syslog(get_class($this).'::fetchObjectFrom', LOG_DEBUG);
1448
-		$resql = $this->db->query($sql);
1449
-		if ($resql)
1450
-		{
1451
-			$row = $this->db->fetch_row($resql);
1452
-			// Test for avoid error -1
1453
-			if ($row[0] > 0) {
1454
-				$result = $this->fetch($row[0]);
1455
-			}
1456
-		}
1457
-
1458
-		return $result;
1459
-	}
1460
-
1461
-	/**
1462
-	 *	Getter generic. Load value from a specific field
1463
-	 *
1464
-	 *	@param	string	$table		Table of element or element line
1465
-	 *	@param	int		$id			Element id
1466
-	 *	@param	string	$field		Field selected
1467
-	 *	@return	int					<0 if KO, >0 if OK
1468
-	 */
1469
-	function getValueFrom($table, $id, $field)
1470
-	{
1471
-		$result=false;
1472
-		if (!empty($id) && !empty($field) && !empty($table)) {
1473
-			$sql = "SELECT ".$field." FROM ".MAIN_DB_PREFIX.$table;
1474
-			$sql.= " WHERE rowid = ".$id;
1475
-
1476
-			dol_syslog(get_class($this).'::getValueFrom', LOG_DEBUG);
1477
-			$resql = $this->db->query($sql);
1478
-			if ($resql)
1479
-			{
1480
-				$row = $this->db->fetch_row($resql);
1481
-				$result = $row[0];
1482
-			}
1483
-		}
1484
-		return $result;
1485
-	}
1486
-
1487
-	/**
1488
-	 *	Setter generic. Update a specific field into database.
1489
-	 *  Warning: Trigger is run only if param trigkey is provided.
1490
-	 *
1491
-	 *	@param	string		$field			Field to update
1492
-	 *	@param	mixed		$value			New value
1493
-	 *	@param	string		$table			To force other table element or element line (should not be used)
1494
-	 *	@param	int			$id				To force other object id (should not be used)
1495
-	 *	@param	string		$format			Data format ('text', 'date'). 'text' is used if not defined
1496
-	 *	@param	string		$id_field		To force rowid field name. 'rowid' is used if not defined
1497
-	 *	@param	User|string	$fuser			Update the user of last update field with this user. If not provided, current user is used except if value is 'none'
1498
-	 *  @param  string      $trigkey    	Trigger key to run (in most cases something like 'XXX_MODIFY')
1499
-	 *  @param	string		$fk_user_field	Name of field to save user id making change
1500
-	 *	@return	int							<0 if KO, >0 if OK
1501
-	 *  @see updateExtraField
1502
-	 */
1503
-	function setValueFrom($field, $value, $table='', $id=null, $format='', $id_field='', $fuser=null, $trigkey='', $fk_user_field='fk_user_modif')
1504
-	{
1505
-		global $user,$langs,$conf;
1506
-
1507
-		if (empty($table)) 	  $table=$this->table_element;
1508
-		if (empty($id))    	  $id=$this->id;
1509
-		if (empty($format))   $format='text';
1510
-		if (empty($id_field)) $id_field='rowid';
1511
-
1512
-		$error=0;
1513
-
1514
-		$this->db->begin();
1515
-
1516
-		// Special case
1517
-		if ($table == 'product' && $field == 'note_private') $field='note';
1518
-		if (in_array($table, array('actioncomm', 'adherent', 'advtargetemailing', 'cronjob', 'establishment'))) $fk_user_field = 'fk_user_mod';
1519
-
1520
-		$sql = "UPDATE ".MAIN_DB_PREFIX.$table." SET ";
1521
-
1522
-		if ($format == 'text') $sql.= $field." = '".$this->db->escape($value)."'";
1523
-		else if ($format == 'int') $sql.= $field." = ".$this->db->escape($value);
1524
-		else if ($format == 'date') $sql.= $field." = ".($value ? "'".$this->db->idate($value)."'" : "null");
1525
-
1526
-		if ($fk_user_field)
1527
-		{
1528
-			if (! empty($fuser) && is_object($fuser)) $sql.=", ".$fk_user_field." = ".$fuser->id;
1529
-			elseif (empty($fuser) || $fuser != 'none') $sql.=", ".$fk_user_field." = ".$user->id;
1530
-		}
1531
-
1532
-		$sql.= " WHERE ".$id_field." = ".$id;
1533
-
1534
-		dol_syslog(get_class($this)."::".__FUNCTION__."", LOG_DEBUG);
1535
-		$resql = $this->db->query($sql);
1536
-		if ($resql)
1537
-		{
1538
-			if ($trigkey)
1539
-			{
1540
-				// call trigger with updated object values
1541
-				if (empty($this->fields) && method_exists($this, 'fetch'))
1542
-				{
1543
-					$result = $this->fetch($id);
1544
-				}
1545
-				else
1546
-				{
1547
-					$result = $this->fetchCommon($id);
1548
-				}
1549
-				if ($result >= 0) $result=$this->call_trigger($trigkey, (! empty($fuser) && is_object($fuser)) ? $fuser : $user);   // This may set this->errors
1550
-				if ($result < 0) $error++;
1551
-			}
366
+    public $total_ttc;
1552 367
 
1553
-			if (! $error)
1554
-			{
1555
-				if (property_exists($this, $field)) $this->$field = $value;
1556
-				$this->db->commit();
1557
-				return 1;
1558
-			}
1559
-			else
1560
-			{
1561
-				$this->db->rollback();
1562
-				return -2;
1563
-			}
1564
-		}
1565
-		else
1566
-		{
1567
-			$this->error=$this->db->lasterror();
1568
-			$this->db->rollback();
1569
-			return -1;
1570
-		}
1571
-	}
368
+    /**
369
+     * @var CommonObjectLine[]
370
+     */
371
+    public $lines;
1572 372
 
1573
-    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
1574
-	/**
1575
-	 *      Load properties id_previous and id_next by comparing $fieldid with $this->ref
1576
-	 *
1577
-	 *      @param	string	$filter		Optional filter. Example: " AND (t.field1 = 'aa' OR t.field2 = 'bb')"
1578
-	 *	 	@param  string	$fieldid   	Name of field to use for the select MAX and MIN
1579
-	 *		@param	int		$nodbprefix	Do not include DB prefix to forge table name
1580
-	 *      @return int         		<0 if KO, >0 if OK
1581
-	 */
1582
-	function load_previous_next_ref($filter, $fieldid, $nodbprefix=0)
1583
-	{
1584
-        // phpcs:enable
1585
-		global $conf, $user;
1586
-
1587
-		if (! $this->table_element)
1588
-		{
1589
-			dol_print_error('',get_class($this)."::load_previous_next_ref was called on objet with property table_element not defined");
1590
-			return -1;
1591
-		}
1592
-		if ($fieldid == 'none') return 1;
1593
-
1594
-		// Security on socid
1595
-		$socid = 0;
1596
-		if ($user->societe_id > 0) $socid = $user->societe_id;
1597
-
1598
-		// this->ismultientitymanaged contains
1599
-		// 0=No test on entity, 1=Test with field entity, 2=Test with link by societe
1600
-		$alias = 's';
1601
-		if ($this->element == 'societe') $alias = 'te';
1602
-
1603
-		$sql = "SELECT MAX(te.".$fieldid.")";
1604
-		$sql.= " FROM ".(empty($nodbprefix)?MAIN_DB_PREFIX:'').$this->table_element." as te";
1605
-		if ($this->element == 'user' && ! empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE)) {
1606
-			$sql.= ",".MAIN_DB_PREFIX."usergroup_user as ug";
1607
-		}
1608
-		if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 2) $sql.= ", ".MAIN_DB_PREFIX."societe as s";	// If we need to link to societe to limit select to entity
1609
-		else if ($this->restrictiononfksoc == 1 && $this->element != 'societe' && !$user->rights->societe->client->voir && !$socid) $sql.= ", ".MAIN_DB_PREFIX."societe as s";	// If we need to link to societe to limit select to socid
1610
-		else if ($this->restrictiononfksoc == 2 && $this->element != 'societe' && !$user->rights->societe->client->voir && !$socid) $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON te.fk_soc = s.rowid";	// If we need to link to societe to limit select to socid
1611
-		if ($this->restrictiononfksoc && !$user->rights->societe->client->voir && !$socid)  $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."societe_commerciaux as sc ON ".$alias.".rowid = sc.fk_soc";
1612
-		$sql.= " WHERE te.".$fieldid." < '".$this->db->escape($this->ref)."'";  // ->ref must always be defined (set to id if field does not exists)
1613
-		if ($this->restrictiononfksoc == 1 && !$user->rights->societe->client->voir && !$socid) $sql.= " AND sc.fk_user = " .$user->id;
1614
-		if ($this->restrictiononfksoc == 2 && !$user->rights->societe->client->voir && !$socid) $sql.= " AND (sc.fk_user = " .$user->id.' OR te.fk_soc IS NULL)';
1615
-		if (! empty($filter))
1616
-		{
1617
-			if (! preg_match('/^\s*AND/i', $filter)) $sql.=" AND ";   // For backward compatibility
1618
-			$sql.=$filter;
1619
-		}
1620
-		if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 2) $sql.= ' AND te.fk_soc = s.rowid';			// If we need to link to societe to limit select to entity
1621
-		else if ($this->restrictiononfksoc == 1 && $this->element != 'societe' && !$user->rights->societe->client->voir && !$socid) $sql.= ' AND te.fk_soc = s.rowid';			// If we need to link to societe to limit select to socid
1622
-		if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) {
1623
-			if ($this->element == 'user' && ! empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE)) {
1624
-				if (! empty($user->admin) && empty($user->entity) && $conf->entity == 1) {
1625
-					$sql.= " AND te.entity IS NOT NULL"; // Show all users
1626
-				} else {
1627
-					$sql.= " AND ug.fk_user = te.rowid";
1628
-					$sql.= " AND ug.entity IN (".getEntity($this->element).")";
1629
-				}
1630
-			} else {
1631
-				$sql.= ' AND te.entity IN ('.getEntity($this->element).')';
1632
-			}
1633
-		}
1634
-		if ($this->restrictiononfksoc == 1 && $socid && $this->element != 'societe') $sql.= ' AND te.fk_soc = ' . $socid;
1635
-		if ($this->restrictiononfksoc == 2 && $socid && $this->element != 'societe') $sql.= ' AND (te.fk_soc = ' . $socid.' OR te.fk_soc IS NULL)';
1636
-		if ($this->restrictiononfksoc && $socid && $this->element == 'societe') $sql.= ' AND te.rowid = ' . $socid;
1637
-		//print 'socid='.$socid.' restrictiononfksoc='.$this->restrictiononfksoc.' ismultientitymanaged = '.$this->ismultientitymanaged.' filter = '.$filter.' -> '.$sql."<br>";
1638
-
1639
-		$result = $this->db->query($sql);
1640
-		if (! $result)
1641
-		{
1642
-			$this->error=$this->db->lasterror();
1643
-			return -1;
1644
-		}
1645
-		$row = $this->db->fetch_row($result);
1646
-		$this->ref_previous = $row[0];
1647
-
1648
-
1649
-		$sql = "SELECT MIN(te.".$fieldid.")";
1650
-		$sql.= " FROM ".(empty($nodbprefix)?MAIN_DB_PREFIX:'').$this->table_element." as te";
1651
-		if ($this->element == 'user' && ! empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE)) {
1652
-			$sql.= ",".MAIN_DB_PREFIX."usergroup_user as ug";
1653
-		}
1654
-		if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 2) $sql.= ", ".MAIN_DB_PREFIX."societe as s";	// If we need to link to societe to limit select to entity
1655
-		else if ($this->restrictiononfksoc == 1 && $this->element != 'societe' && !$user->rights->societe->client->voir && !$socid) $sql.= ", ".MAIN_DB_PREFIX."societe as s";	// If we need to link to societe to limit select to socid
1656
-		else if ($this->restrictiononfksoc == 2 && $this->element != 'societe' && !$user->rights->societe->client->voir && !$socid) $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON te.fk_soc = s.rowid";	// If we need to link to societe to limit select to socid
1657
-		if ($this->restrictiononfksoc && !$user->rights->societe->client->voir && !$socid) $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."societe_commerciaux as sc ON ".$alias.".rowid = sc.fk_soc";
1658
-		$sql.= " WHERE te.".$fieldid." > '".$this->db->escape($this->ref)."'";  // ->ref must always be defined (set to id if field does not exists)
1659
-		if ($this->restrictiononfksoc == 1 && !$user->rights->societe->client->voir && !$socid) $sql.= " AND sc.fk_user = " .$user->id;
1660
-		if ($this->restrictiononfksoc == 2 && !$user->rights->societe->client->voir && !$socid) $sql.= " AND (sc.fk_user = " .$user->id.' OR te.fk_soc IS NULL)';
1661
-		if (! empty($filter))
1662
-		{
1663
-			if (! preg_match('/^\s*AND/i', $filter)) $sql.=" AND ";   // For backward compatibility
1664
-			$sql.=$filter;
1665
-		}
1666
-		if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 2) $sql.= ' AND te.fk_soc = s.rowid';			// If we need to link to societe to limit select to entity
1667
-		else if ($this->restrictiononfksoc == 1 && $this->element != 'societe' && !$user->rights->societe->client->voir && !$socid) $sql.= ' AND te.fk_soc = s.rowid';			// If we need to link to societe to limit select to socid
1668
-		if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) {
1669
-			if ($this->element == 'user' && ! empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE)) {
1670
-				if (! empty($user->admin) && empty($user->entity) && $conf->entity == 1) {
1671
-					$sql.= " AND te.entity IS NOT NULL"; // Show all users
1672
-				} else {
1673
-					$sql.= " AND ug.fk_user = te.rowid";
1674
-					$sql.= " AND ug.entity IN (".getEntity($this->element).")";
1675
-				}
1676
-			} else {
1677
-				$sql.= ' AND te.entity IN ('.getEntity($this->element).')';
1678
-			}
1679
-		}
1680
-		if ($this->restrictiononfksoc == 1 && $socid && $this->element != 'societe') $sql.= ' AND te.fk_soc = ' . $socid;
1681
-		if ($this->restrictiononfksoc == 2 && $socid && $this->element != 'societe') $sql.= ' AND (te.fk_soc = ' . $socid.' OR te.fk_soc IS NULL)';
1682
-		if ($this->restrictiononfksoc && $socid && $this->element == 'societe') $sql.= ' AND te.rowid = ' . $socid;
1683
-		//print 'socid='.$socid.' restrictiononfksoc='.$this->restrictiononfksoc.' ismultientitymanaged = '.$this->ismultientitymanaged.' filter = '.$filter.' -> '.$sql."<br>";
1684
-		// Rem: Bug in some mysql version: SELECT MIN(rowid) FROM llx_socpeople WHERE rowid > 1 when one row in database with rowid=1, returns 1 instead of null
1685
-
1686
-		$result = $this->db->query($sql);
1687
-		if (! $result)
1688
-		{
1689
-			$this->error=$this->db->lasterror();
1690
-			return -2;
1691
-		}
1692
-		$row = $this->db->fetch_row($result);
1693
-		$this->ref_next = $row[0];
1694
-
1695
-		return 1;
1696
-	}
1697
-
1698
-
1699
-	/**
1700
-	 *      Return list of id of contacts of object
1701
-	 *
1702
-	 *      @param	string	$source     Source of contact: external (llx_socpeople) or internal (llx_user) or thirdparty (llx_societe)
1703
-	 *      @return array				Array of id of contacts (if source=external or internal)
1704
-	 * 									Array of id of third parties with at least one contact on object (if source=thirdparty)
1705
-	 */
1706
-	function getListContactId($source='external')
1707
-	{
1708
-		$contactAlreadySelected = array();
1709
-		$tab = $this->liste_contact(-1,$source);
1710
-		$num=count($tab);
1711
-		$i = 0;
1712
-		while ($i < $num)
1713
-		{
1714
-			if ($source == 'thirdparty') $contactAlreadySelected[$i] = $tab[$i]['socid'];
1715
-			else  $contactAlreadySelected[$i] = $tab[$i]['id'];
1716
-			$i++;
1717
-		}
1718
-		return $contactAlreadySelected;
1719
-	}
1720
-
1721
-
1722
-	/**
1723
-	 *	Link element with a project
1724
-	 *
1725
-	 *	@param     	int		$projectid		Project id to link element to
1726
-	 *	@return		int						<0 if KO, >0 if OK
1727
-	 */
1728
-	function setProject($projectid)
1729
-	{
1730
-		if (! $this->table_element)
1731
-		{
1732
-			dol_syslog(get_class($this)."::setProject was called on objet with property table_element not defined",LOG_ERR);
1733
-			return -1;
1734
-		}
1735
-
1736
-		$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
1737
-		if ($this->table_element == 'actioncomm')
1738
-		{
1739
-			if ($projectid) $sql.= ' SET fk_project = '.$projectid;
1740
-			else $sql.= ' SET fk_project = NULL';
1741
-			$sql.= ' WHERE id = '.$this->id;
1742
-		}
1743
-		else
1744
-		{
1745
-			if ($projectid) $sql.= ' SET fk_projet = '.$projectid;
1746
-			else $sql.= ' SET fk_projet = NULL';
1747
-			$sql.= ' WHERE rowid = '.$this->id;
1748
-		}
1749
-
1750
-		dol_syslog(get_class($this)."::setProject", LOG_DEBUG);
1751
-		if ($this->db->query($sql))
1752
-		{
1753
-			$this->fk_project = $projectid;
1754
-			return 1;
1755
-		}
1756
-		else
1757
-		{
1758
-			dol_print_error($this->db);
1759
-			return -1;
1760
-		}
1761
-	}
1762
-
1763
-	/**
1764
-	 *  Change the payments methods
1765
-	 *
1766
-	 *  @param		int		$id		Id of new payment method
1767
-	 *  @return		int				>0 if OK, <0 if KO
1768
-	 */
1769
-	function setPaymentMethods($id)
1770
-	{
1771
-		dol_syslog(get_class($this).'::setPaymentMethods('.$id.')');
1772
-		if ($this->statut >= 0 || $this->element == 'societe')
1773
-		{
1774
-			// TODO uniformize field name
1775
-			$fieldname = 'fk_mode_reglement';
1776
-			if ($this->element == 'societe') $fieldname = 'mode_reglement';
1777
-			if (get_class($this) == 'Fournisseur') $fieldname = 'mode_reglement_supplier';
1778
-
1779
-			$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
1780
-			$sql .= ' SET '.$fieldname.' = '.$id;
1781
-			$sql .= ' WHERE rowid='.$this->id;
1782
-
1783
-			if ($this->db->query($sql))
1784
-			{
1785
-				$this->mode_reglement_id = $id;
1786
-				// for supplier
1787
-				if (get_class($this) == 'Fournisseur') $this->mode_reglement_supplier_id = $id;
1788
-				return 1;
1789
-			}
1790
-			else
1791
-			{
1792
-				dol_syslog(get_class($this).'::setPaymentMethods Erreur '.$sql.' - '.$this->db->error());
1793
-				$this->error=$this->db->error();
1794
-				return -1;
1795
-			}
1796
-		}
1797
-		else
1798
-		{
1799
-			dol_syslog(get_class($this).'::setPaymentMethods, status of the object is incompatible');
1800
-			$this->error='Status of the object is incompatible '.$this->statut;
1801
-			return -2;
1802
-		}
1803
-	}
1804
-
1805
-	/**
1806
-	 *  Change the multicurrency code
1807
-	 *
1808
-	 *  @param		string	$code	multicurrency code
1809
-	 *  @return		int				>0 if OK, <0 if KO
1810
-	 */
1811
-	function setMulticurrencyCode($code)
1812
-	{
1813
-		dol_syslog(get_class($this).'::setMulticurrencyCode('.$id.')');
1814
-		if ($this->statut >= 0 || $this->element == 'societe')
1815
-		{
1816
-			$fieldname = 'multicurrency_code';
1817
-
1818
-			$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
1819
-			$sql .= ' SET '.$fieldname." = '".$this->db->escape($code)."'";
1820
-			$sql .= ' WHERE rowid='.$this->id;
1821
-
1822
-			if ($this->db->query($sql))
1823
-			{
1824
-				$this->multicurrency_code = $code;
373
+    /**
374
+     * @var mixed		Contains comments
375
+     * @see fetchComments()
376
+     */
377
+    public $comments=array();
1825 378
 
1826
-				list($fk_multicurrency, $rate) = MultiCurrency::getIdAndTxFromCode($this->db, $code);
1827
-				if ($rate) $this->setMulticurrencyRate($rate,2);
379
+    /**
380
+     * @var int
381
+     * @see setIncoterms()
382
+     */
383
+    public $fk_incoterms;
1828 384
 
1829
-				return 1;
1830
-			}
1831
-			else
1832
-			{
1833
-				dol_syslog(get_class($this).'::setMulticurrencyCode Erreur '.$sql.' - '.$this->db->error());
1834
-				$this->error=$this->db->error();
1835
-				return -1;
1836
-			}
1837
-		}
1838
-		else
1839
-		{
1840
-			dol_syslog(get_class($this).'::setMulticurrencyCode, status of the object is incompatible');
1841
-			$this->error='Status of the object is incompatible '.$this->statut;
1842
-			return -2;
1843
-		}
1844
-	}
1845
-
1846
-	/**
1847
-	 *  Change the multicurrency rate
1848
-	 *
1849
-	 *  @param		double	$rate	multicurrency rate
1850
-	 *  @param		int		$mode	mode 1 : amounts in company currency will be recalculated, mode 2 : amounts in foreign currency
1851
-	 *  @return		int				>0 if OK, <0 if KO
1852
-	 */
1853
-	function setMulticurrencyRate($rate, $mode=1)
1854
-	{
1855
-		dol_syslog(get_class($this).'::setMulticurrencyRate('.$id.')');
1856
-		if ($this->statut >= 0 || $this->element == 'societe')
1857
-		{
1858
-			$fieldname = 'multicurrency_tx';
1859
-
1860
-			$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
1861
-			$sql .= ' SET '.$fieldname.' = '.$rate;
1862
-			$sql .= ' WHERE rowid='.$this->id;
1863
-
1864
-			if ($this->db->query($sql))
1865
-			{
1866
-				$this->multicurrency_tx = $rate;
385
+    /**
386
+     * @var string
387
+     * @see SetIncoterms()
388
+     */
389
+    public $libelle_incoterms;
1867 390
 
1868
-				// Update line price
1869
-				if (!empty($this->lines))
1870
-				{
1871
-					foreach ($this->lines as &$line)
1872
-					{
1873
-						if($mode == 1) {
1874
-							$line->subprice = 0;
1875
-						}
391
+    /**
392
+     * @var string
393
+     * @see display_incoterms()
394
+     */
395
+    public $location_incoterms;
1876 396
 
1877
-						switch ($this->element) {
1878
-							case 'propal':
1879
-								$this->updateline(
1880
-									$line->id, $line->subprice, $line->qty, $line->remise_percent, $line->tva_tx, $line->localtax1_tx, $line->localtax2_tx,
1881
-									($line->description?$line->description:$line->desc), 'HT', $line->info_bits, $line->special_code, $line->fk_parent_line,
1882
-									$line->skip_update_total, $line->fk_fournprice, $line->pa_ht, $line->label, $line->product_type, $line->date_start,
1883
-									$line->date_end, $line->array_options, $line->fk_unit, $line->multicurrency_subprice
1884
-								);
1885
-								break;
1886
-							case 'commande':
1887
-								$this->updateline(
1888
-									$line->id, ($line->description?$line->description:$line->desc), $line->subprice, $line->qty, $line->remise_percent,
1889
-									$line->tva_tx, $line->localtax1_tx, $line->localtax2_tx, 'HT', $line->info_bits, $line->date_start, $line->date_end,
1890
-									$line->product_type, $line->fk_parent_line, $line->skip_update_total, $line->fk_fournprice, $line->pa_ht, $line->label,
1891
-									$line->special_code, $line->array_options, $line->fk_unit, $line->multicurrency_subprice
1892
-								);
1893
-								break;
1894
-							case 'facture':
1895
-								$this->updateline(
1896
-									$line->id, ($line->description?$line->description:$line->desc), $line->subprice, $line->qty, $line->remise_percent,
1897
-									$line->date_start, $line->date_end, $line->tva_tx, $line->localtax1_tx, $line->localtax2_tx, 'HT', $line->info_bits,
1898
-									$line->product_type, $line->fk_parent_line, $line->skip_update_total, $line->fk_fournprice, $line->pa_ht, $line->label,
1899
-									$line->special_code, $line->array_options, $line->situation_percent, $line->fk_unit, $line->multicurrency_subprice
1900
-								);
1901
-								break;
1902
-							case 'supplier_proposal':
1903
-								$this->updateline(
1904
-									$line->id, $line->subprice, $line->qty, $line->remise_percent, $line->tva_tx, $line->localtax1_tx, $line->localtax2_tx,
1905
-									($line->description?$line->description:$line->desc), 'HT', $line->info_bits, $line->special_code, $line->fk_parent_line,
1906
-									$line->skip_update_total, $line->fk_fournprice, $line->pa_ht, $line->label, $line->product_type, $line->array_options,
1907
-									$line->ref_fourn, $line->multicurrency_subprice
1908
-								);
1909
-								break;
1910
-							case 'order_supplier':
1911
-								$this->updateline(
1912
-									$line->id, ($line->description?$line->description:$line->desc), $line->subprice, $line->qty, $line->remise_percent,
1913
-									$line->tva_tx, $line->localtax1_tx, $line->localtax2_tx, 'HT', $line->info_bits, $line->product_type, false,
1914
-									$line->date_start, $line->date_end, $line->array_options, $line->fk_unit, $line->multicurrency_subprice
1915
-								);
1916
-								break;
1917
-							case 'invoice_supplier':
1918
-								$this->updateline(
1919
-									$line->id, ($line->description?$line->description:$line->desc), $line->subprice, $line->tva_tx, $line->localtax1_tx,
1920
-									$line->localtax2_tx, $line->qty, 0, 'HT', $line->info_bits, $line->product_type, $line->remise_percent, false,
1921
-									$line->date_start, $line->date_end, $line->array_options, $line->fk_unit, $line->multicurrency_subprice
1922
-								);
1923
-								break;
1924
-							default:
1925
-								dol_syslog(get_class($this).'::setMulticurrencyRate no updateline defined', LOG_DEBUG);
1926
-								break;
1927
-						}
1928
-					}
1929
-				}
397
+    public $name;
398
+    public $lastname;
399
+    public $firstname;
400
+    public $civility_id;
1930 401
 
1931
-				return 1;
1932
-			}
1933
-			else
1934
-			{
1935
-				dol_syslog(get_class($this).'::setMulticurrencyRate Erreur '.$sql.' - '.$this->db->error());
1936
-				$this->error=$this->db->error();
1937
-				return -1;
1938
-			}
1939
-		}
1940
-		else
1941
-		{
1942
-			dol_syslog(get_class($this).'::setMulticurrencyRate, status of the object is incompatible');
1943
-			$this->error='Status of the object is incompatible '.$this->statut;
1944
-			return -2;
1945
-		}
1946
-	}
1947
-
1948
-	/**
1949
-	 *  Change the payments terms
1950
-	 *
1951
-	 *  @param		int		$id		Id of new payment terms
1952
-	 *  @return		int				>0 if OK, <0 if KO
1953
-	 */
1954
-	function setPaymentTerms($id)
1955
-	{
1956
-		dol_syslog(get_class($this).'::setPaymentTerms('.$id.')');
1957
-		if ($this->statut >= 0 || $this->element == 'societe')
1958
-		{
1959
-			// TODO uniformize field name
1960
-			$fieldname = 'fk_cond_reglement';
1961
-			if ($this->element == 'societe') $fieldname = 'cond_reglement';
1962
-			if (get_class($this) == 'Fournisseur') $fieldname = 'cond_reglement_supplier';
1963
-
1964
-			$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
1965
-			$sql .= ' SET '.$fieldname.' = '.$id;
1966
-			$sql .= ' WHERE rowid='.$this->id;
1967
-
1968
-			if ($this->db->query($sql))
1969
-			{
1970
-				$this->cond_reglement_id = $id;
1971
-				// for supplier
1972
-				if (get_class($this) == 'Fournisseur') $this->cond_reglement_supplier_id = $id;
1973
-				$this->cond_reglement = $id;	// for compatibility
1974
-				return 1;
1975
-			}
1976
-			else
1977
-			{
1978
-				dol_syslog(get_class($this).'::setPaymentTerms Erreur '.$sql.' - '.$this->db->error());
1979
-				$this->error=$this->db->error();
1980
-				return -1;
1981
-			}
1982
-		}
1983
-		else
1984
-		{
1985
-			dol_syslog(get_class($this).'::setPaymentTerms, status of the object is incompatible');
1986
-			$this->error='Status of the object is incompatible '.$this->statut;
1987
-			return -2;
1988
-		}
1989
-	}
1990
-
1991
-	/**
1992
-	 *	Define delivery address
1993
-	 *  @deprecated
1994
-	 *
1995
-	 *	@param      int		$id		Address id
1996
-	 *	@return     int				<0 si ko, >0 si ok
1997
-	 */
1998
-	function setDeliveryAddress($id)
1999
-	{
2000
-		$fieldname = 'fk_delivery_address';
2001
-		if ($this->element == 'delivery' || $this->element == 'shipping') $fieldname = 'fk_address';
2002
-
2003
-		$sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element." SET ".$fieldname." = ".$id;
2004
-		$sql.= " WHERE rowid = ".$this->id." AND fk_statut = 0";
2005
-
2006
-		if ($this->db->query($sql))
2007
-		{
2008
-			$this->fk_delivery_address = $id;
2009
-			return 1;
2010
-		}
2011
-		else
2012
-		{
2013
-			$this->error=$this->db->error();
2014
-			dol_syslog(get_class($this).'::setDeliveryAddress Erreur '.$sql.' - '.$this->error);
2015
-			return -1;
2016
-		}
2017
-	}
2018
-
2019
-
2020
-	/**
2021
-	 *  Change the shipping method
2022
-	 *
2023
-	 *  @param      int     $shipping_method_id     Id of shipping method
2024
-     *  @param      bool    $notrigger              false=launch triggers after, true=disable triggers
2025
-     *  @param      User	$userused               Object user
2026
-	 *
2027
-	 *  @return     int              1 if OK, 0 if KO
2028
-	 */
2029
-	function setShippingMethod($shipping_method_id, $notrigger=false, $userused=null)
2030
-	{
2031
-        global $user;
402
+    // Dates
403
+    public $date_creation;			// Date creation
404
+    public $date_validation;		// Date validation
405
+    public $date_modification;		// Date last change (tms field)
2032 406
 
2033
-        if (empty($userused)) $userused=$user;
2034 407
 
2035
-        $error = 0;
2036 408
 
2037
-		if (! $this->table_element) {
2038
-			dol_syslog(get_class($this)."::setShippingMethod was called on objet with property table_element not defined",LOG_ERR);
2039
-			return -1;
2040
-		}
409
+    // No constructor as it is an abstract class
2041 410
 
2042
-        $this->db->begin();
411
+    /**
412
+     * Check an object id/ref exists
413
+     * If you don't need/want to instantiate object and just need to know if object exists, use this method instead of fetch
414
+     *
415
+     *  @param	string	$element   	String of element ('product', 'facture', ...)
416
+     *  @param	int		$id      	Id of object
417
+     *  @param  string	$ref     	Ref of object to check
418
+     *  @param	string	$ref_ext	Ref ext of object to check
419
+     *  @return int     			<0 if KO, 0 if OK but not found, >0 if OK and exists
420
+     */
421
+    static function isExistingObject($element, $id, $ref='', $ref_ext='')
422
+    {
423
+        global $db,$conf;
424
+
425
+        $sql = "SELECT rowid, ref, ref_ext";
426
+        $sql.= " FROM ".MAIN_DB_PREFIX.$element;
427
+        $sql.= " WHERE entity IN (".getEntity($element).")" ;
428
+
429
+        if ($id > 0) $sql.= " AND rowid = ".$db->escape($id);
430
+        else if ($ref) $sql.= " AND ref = '".$db->escape($ref)."'";
431
+        else if ($ref_ext) $sql.= " AND ref_ext = '".$db->escape($ref_ext)."'";
432
+        else {
433
+            $error='ErrorWrongParameters';
434
+            dol_print_error(get_class()."::isExistingObject ".$error, LOG_ERR);
435
+            return -1;
436
+        }
437
+        if ($ref || $ref_ext) $sql.= " AND entity = ".$conf->entity;
2043 438
 
2044
-		if ($shipping_method_id<0) $shipping_method_id='NULL';
2045
-		dol_syslog(get_class($this).'::setShippingMethod('.$shipping_method_id.')');
439
+        dol_syslog(get_class()."::isExistingObject", LOG_DEBUG);
440
+        $resql = $db->query($sql);
441
+        if ($resql)
442
+        {
443
+            $num=$db->num_rows($resql);
444
+            if ($num > 0) return 1;
445
+            else return 0;
446
+        }
447
+        return -1;
448
+    }
2046 449
 
2047
-		$sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
2048
-		$sql.= " SET fk_shipping_method = ".$shipping_method_id;
2049
-		$sql.= " WHERE rowid=".$this->id;
2050
-        $resql = $this->db->query($sql);
2051
-		if (! $resql) {
2052
-			dol_syslog(get_class($this).'::setShippingMethod Error ', LOG_DEBUG);
2053
-			$this->error = $this->db->lasterror();
2054
-			$error++;
2055
-        } else {
2056
-            if (!$notrigger)
2057
-            {
2058
-                // Call trigger
2059
-                $this->context=array('shippingmethodupdate'=>1);
2060
-                $result = $this->call_trigger(strtoupper(get_class($this)) . '_MODIFY', $userused);
2061
-                if ($result < 0) $error++;
2062
-                // End call trigger
2063
-            }
450
+    /**
451
+     * Method to output saved errors
452
+     *
453
+     * @return	string		String with errors
454
+     */
455
+    function errorsToString()
456
+    {
457
+        return $this->error.(is_array($this->errors)?(($this->error!=''?', ':'').join(', ',$this->errors)):'');
458
+    }
459
+
460
+    /**
461
+     *	Return full name (civility+' '+name+' '+lastname)
462
+     *
463
+     *	@param	Translate	$langs			Language object for translation of civility (used only if option is 1)
464
+     *	@param	int			$option			0=No option, 1=Add civility
465
+     * 	@param	int			$nameorder		-1=Auto, 0=Lastname+Firstname, 1=Firstname+Lastname, 2=Firstname
466
+     * 	@param	int			$maxlen			Maximum length
467
+     * 	@return	string						String with full name
468
+     */
469
+    function getFullName($langs,$option=0,$nameorder=-1,$maxlen=0)
470
+    {
471
+        //print "lastname=".$this->lastname." name=".$this->name." nom=".$this->nom."<br>\n";
472
+        $lastname=$this->lastname;
473
+        $firstname=$this->firstname;
474
+        if (empty($lastname))  $lastname=(isset($this->lastname)?$this->lastname:(isset($this->name)?$this->name:(isset($this->nom)?$this->nom:(isset($this->societe)?$this->societe:(isset($this->company)?$this->company:'')))));
475
+
476
+        $ret='';
477
+        if ($option && $this->civility_id)
478
+        {
479
+            if ($langs->transnoentitiesnoconv("Civility".$this->civility_id)!="Civility".$this->civility_id) $ret.=$langs->transnoentitiesnoconv("Civility".$this->civility_id).' ';
480
+            else $ret.=$this->civility_id.' ';
2064 481
         }
2065
-        if ($error)
482
+
483
+        $ret.=dolGetFirstLastname($firstname, $lastname, $nameorder);
484
+
485
+        return dol_trunc($ret,$maxlen);
486
+    }
487
+
488
+    /**
489
+     * 	Return full address of contact
490
+     *
491
+     * 	@param		int			$withcountry		1=Add country into address string
492
+     *  @param		string		$sep				Separator to use to build string
493
+     *  @param		int		    $withregion			1=Add region into address string
494
+     *	@return		string							Full address string
495
+     */
496
+    function getFullAddress($withcountry=0, $sep="\n", $withregion=0)
497
+    {
498
+        if ($withcountry && $this->country_id && (empty($this->country_code) || empty($this->country)))
2066 499
         {
2067
-            $this->db->rollback();
2068
-            return -1;
2069
-        } else {
2070
-            $this->shipping_method_id = ($shipping_method_id=='NULL')?null:$shipping_method_id;
2071
-            $this->db->commit();
2072
-            return 1;
500
+            require_once DOL_DOCUMENT_ROOT .'/core/lib/company.lib.php';
501
+            $tmparray=getCountry($this->country_id,'all');
502
+            $this->country_code=$tmparray['code'];
503
+            $this->country     =$tmparray['label'];
2073 504
         }
2074
-	}
2075
-
2076
-
2077
-	/**
2078
-	 *  Change the warehouse
2079
-	 *
2080
-	 *  @param      int     $warehouse_id     Id of warehouse
2081
-	 *  @return     int              1 if OK, 0 if KO
2082
-	 */
2083
-	function setWarehouse($warehouse_id)
2084
-	{
2085
-		if (! $this->table_element) {
2086
-			dol_syslog(get_class($this)."::setWarehouse was called on objet with property table_element not defined",LOG_ERR);
2087
-			return -1;
2088
-		}
2089
-		if ($warehouse_id<0) $warehouse_id='NULL';
2090
-		dol_syslog(get_class($this).'::setWarehouse('.$warehouse_id.')');
2091
-
2092
-		$sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
2093
-		$sql.= " SET fk_warehouse = ".$warehouse_id;
2094
-		$sql.= " WHERE rowid=".$this->id;
2095
-
2096
-		if ($this->db->query($sql)) {
2097
-			$this->warehouse_id = ($warehouse_id=='NULL')?null:$warehouse_id;
2098
-			return 1;
2099
-		} else {
2100
-			dol_syslog(get_class($this).'::setWarehouse Error ', LOG_DEBUG);
2101
-			$this->error=$this->db->error();
2102
-			return 0;
2103
-		}
2104
-	}
2105
-
2106
-
2107
-	/**
2108
-	 *		Set last model used by doc generator
2109
-	 *
2110
-	 *		@param		User	$user		User object that make change
2111
-	 *		@param		string	$modelpdf	Modele name
2112
-	 *		@return		int					<0 if KO, >0 if OK
2113
-	 */
2114
-	function setDocModel($user, $modelpdf)
2115
-	{
2116
-		if (! $this->table_element)
2117
-		{
2118
-			dol_syslog(get_class($this)."::setDocModel was called on objet with property table_element not defined",LOG_ERR);
2119
-			return -1;
2120
-		}
2121
-
2122
-		$newmodelpdf=dol_trunc($modelpdf,255);
2123
-
2124
-		$sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
2125
-		$sql.= " SET model_pdf = '".$this->db->escape($newmodelpdf)."'";
2126
-		$sql.= " WHERE rowid = ".$this->id;
2127
-		// if ($this->element == 'facture') $sql.= " AND fk_statut < 2";
2128
-		// if ($this->element == 'propal')  $sql.= " AND fk_statut = 0";
2129
-
2130
-		dol_syslog(get_class($this)."::setDocModel", LOG_DEBUG);
2131
-		$resql=$this->db->query($sql);
2132
-		if ($resql)
2133
-		{
2134
-			$this->modelpdf=$modelpdf;
2135
-			return 1;
2136
-		}
2137
-		else
2138
-		{
2139
-			dol_print_error($this->db);
2140
-			return 0;
2141
-		}
2142
-	}
2143
-
2144
-
2145
-	/**
2146
-	 *  Change the bank account
2147
-	 *
2148
-	 *  @param		int		$fk_account		Id of bank account
2149
-	 *  @param      bool    $notrigger      false=launch triggers after, true=disable triggers
2150
-	 *  @param      User	$userused		Object user
2151
-	 *  @return		int				1 if OK, 0 if KO
2152
-	 */
2153
-	function setBankAccount($fk_account, $notrigger=false, $userused=null)
2154
-	{
2155
-        global $user;
2156 505
 
2157
-        if (empty($userused)) $userused=$user;
506
+        if ($withregion && $this->state_id && (empty($this->state_code) || empty($this->state) || empty($this->region) || empty($this->region_cpde)))
507
+        {
508
+            require_once DOL_DOCUMENT_ROOT .'/core/lib/company.lib.php';
509
+            $tmparray=getState($this->state_id,'all',0,1);
510
+            $this->state_code   =$tmparray['code'];
511
+            $this->state        =$tmparray['label'];
512
+            $this->region_code  =$tmparray['region_code'];
513
+            $this->region       =$tmparray['region'];
514
+        }
2158 515
 
2159
-        $error = 0;
516
+        return dol_format_address($this, $withcountry, $sep);
517
+    }
2160 518
 
2161
-		if (! $this->table_element) {
2162
-			dol_syslog(get_class($this)."::setBankAccount was called on objet with property table_element not defined",LOG_ERR);
2163
-			return -1;
2164
-		}
2165
-        $this->db->begin();
2166 519
 
2167
-		if ($fk_account<0) $fk_account='NULL';
2168
-		dol_syslog(get_class($this).'::setBankAccount('.$fk_account.')');
520
+    /**
521
+     * 	Return full address for banner
522
+     *
523
+     * 	@param		string		$htmlkey            HTML id to make banner content unique
524
+     *  @param      Object      $object				Object (thirdparty, thirdparty of contact for contact, null for a member)
525
+     *	@return		string							Full address string
526
+     */
527
+    function getBannerAddress($htmlkey, $object)
528
+    {
529
+        global $conf, $langs;
2169 530
 
2170
-		$sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
2171
-		$sql.= " SET fk_account = ".$fk_account;
2172
-		$sql.= " WHERE rowid=".$this->id;
531
+        $countriesusingstate=array('AU','US','IN','GB','ES','UK','TR');    // See also option MAIN_FORCE_STATE_INTO_ADDRESS
2173 532
 
2174
-        $resql = $this->db->query($sql);
2175
-        if (! $resql)
533
+        $contactid=0;
534
+        $thirdpartyid=0;
535
+        if ($this->element == 'societe')
2176 536
         {
2177
-            dol_syslog(get_class($this).'::setBankAccount Error '.$sql.' - '.$this->db->error());
2178
-            $this->error = $this->db->lasterror();
2179
-            $error++;
537
+            $thirdpartyid=$this->id;
2180 538
         }
2181
-        else
539
+        if ($this->element == 'contact')
2182 540
         {
2183
-            if (!$notrigger)
541
+            $contactid=$this->id;
542
+            $thirdpartyid=$object->fk_soc;
543
+        }
544
+        if ($this->element == 'user')
545
+        {
546
+            $contactid=$this->contact_id;
547
+            $thirdpartyid=$object->fk_soc;
548
+        }
549
+
550
+        $out='<!-- BEGIN part to show address block -->';
551
+
552
+        $outdone=0;
553
+        $coords = $this->getFullAddress(1,', ',$conf->global->MAIN_SHOW_REGION_IN_STATE_SELECT);
554
+        if ($coords)
555
+        {
556
+            if (! empty($conf->use_javascript_ajax))
2184 557
             {
2185
-                // Call trigger
2186
-                $this->context=array('bankaccountupdate'=>1);
2187
-                $result = $this->call_trigger(strtoupper(get_class($this)) . '_MODIFY', $userused);
2188
-                if ($result < 0) $error++;
2189
-                // End call trigger
558
+                $namecoords = $this->getFullName($langs,1).'<br>'.$coords;
559
+                // hideonsmatphone because copyToClipboard call jquery dialog that does not work with jmobile
560
+                $out.='<a href="#" class="hideonsmartphone" onclick="return copyToClipboard(\''.dol_escape_js($namecoords).'\',\''.dol_escape_js($langs->trans("HelpCopyToClipboard")).'\');">';
561
+                $out.=img_picto($langs->trans("Address"), 'object_address.png');
562
+                $out.='</a> ';
2190 563
             }
564
+            $out.=dol_print_address($coords, 'address_'.$htmlkey.'_'.$this->id, $this->element, $this->id, 1, ', '); $outdone++;
565
+            $outdone++;
2191 566
         }
2192
-        if ($error)
567
+
568
+        if (! in_array($this->country_code,$countriesusingstate) && empty($conf->global->MAIN_FORCE_STATE_INTO_ADDRESS)   // If MAIN_FORCE_STATE_INTO_ADDRESS is on, state is already returned previously with getFullAddress
569
+                && empty($conf->global->SOCIETE_DISABLE_STATE) && $this->state)
2193 570
         {
2194
-            $this->db->rollback();
2195
-            return -1;
571
+            if (!empty($conf->global->MAIN_SHOW_REGION_IN_STATE_SELECT) && $conf->global->MAIN_SHOW_REGION_IN_STATE_SELECT == 1 && $this->region) {
572
+                $out.=($outdone?' - ':'').$this->region.' - '.$this->state;
573
+            }
574
+            else {
575
+                $out.=($outdone?' - ':'').$this->state;
576
+            }
577
+            $outdone++;
2196 578
         }
2197
-        else
579
+
580
+        if (! empty($this->phone) || ! empty($this->phone_pro) || ! empty($this->phone_mobile) || ! empty($this->phone_perso) || ! empty($this->fax) || ! empty($this->office_phone) || ! empty($this->user_mobile) || ! empty($this->office_fax)) $out.=($outdone?'<br>':'');
581
+        if (! empty($this->phone) && empty($this->phone_pro)) {		// For objects that store pro phone into ->phone
582
+            $out.=dol_print_phone($this->phone,$this->country_code,$contactid,$thirdpartyid,'AC_TEL','&nbsp;','phone',$langs->trans("PhonePro")); $outdone++;
583
+        }
584
+        if (! empty($this->phone_pro)) {
585
+            $out.=dol_print_phone($this->phone_pro,$this->country_code,$contactid,$thirdpartyid,'AC_TEL','&nbsp;','phone',$langs->trans("PhonePro")); $outdone++;
586
+        }
587
+        if (! empty($this->phone_mobile)) {
588
+            $out.=dol_print_phone($this->phone_mobile,$this->country_code,$contactid,$thirdpartyid,'AC_TEL','&nbsp;','mobile',$langs->trans("PhoneMobile")); $outdone++;
589
+        }
590
+        if (! empty($this->phone_perso)) {
591
+            $out.=dol_print_phone($this->phone_perso,$this->country_code,$contactid,$thirdpartyid,'AC_TEL','&nbsp;','phone',$langs->trans("PhonePerso")); $outdone++;
592
+        }
593
+        if (! empty($this->office_phone)) {
594
+            $out.=dol_print_phone($this->office_phone,$this->country_code,$contactid,$thirdpartyid,'AC_TEL','&nbsp;','phone',$langs->trans("PhonePro")); $outdone++;
595
+        }
596
+        if (! empty($this->user_mobile)) {
597
+            $out.=dol_print_phone($this->user_mobile,$this->country_code,$contactid,$thirdpartyid,'AC_TEL','&nbsp;','mobile',$langs->trans("PhoneMobile")); $outdone++;
598
+        }
599
+        if (! empty($this->fax)) {
600
+            $out.=dol_print_phone($this->fax,$this->country_code,$contactid,$thirdpartyid,'AC_FAX','&nbsp;','fax',$langs->trans("Fax")); $outdone++;
601
+        }
602
+        if (! empty($this->office_fax)) {
603
+            $out.=dol_print_phone($this->office_fax,$this->country_code,$contactid,$thirdpartyid,'AC_FAX','&nbsp;','fax',$langs->trans("Fax")); $outdone++;
604
+        }
605
+
606
+        $out.='<div style="clear: both;"></div>';
607
+        $outdone=0;
608
+        if (! empty($this->email))
2198 609
         {
2199
-            $this->fk_account = ($fk_account=='NULL')?null:$fk_account;
2200
-            $this->db->commit();
2201
-            return 1;
610
+            $out.=dol_print_email($this->email,$this->id,$object->id,'AC_EMAIL',0,0,1);
611
+            $outdone++;
612
+        }
613
+        if (! empty($this->url))
614
+        {
615
+            $out.=dol_print_url($this->url,'_goout',0,1);
616
+            $outdone++;
2202 617
         }
618
+        $out.='<div style="clear: both;">';
619
+        if (! empty($conf->socialnetworks->enabled))
620
+        {
621
+            if ($this->skype) $out.=dol_print_socialnetworks($this->skype,$this->id,$object->id,'skype');
622
+            $outdone++;
623
+            if ($this->jabberid) $out.=dol_print_socialnetworks($this->jabberid,$this->id,$object->id,'jabber');
624
+            $outdone++;
625
+            if ($this->twitter) $out.=dol_print_socialnetworks($this->twitter,$this->id,$object->id,'twitter');
626
+            $outdone++;
627
+            if ($this->facebook) $out.=dol_print_socialnetworks($this->facebook,$this->id,$object->id,'facebook');
628
+            $outdone++;
629
+        }
630
+        $out.='</div>';
631
+
632
+        $out.='<!-- END Part to show address block -->';
633
+
634
+        return $out;
2203 635
     }
2204 636
 
637
+    /**
638
+     * Return the link of last main doc file for direct public download.
639
+     *
640
+     * @param	string	$modulepart			Module related to document
641
+     * @param	int		$initsharekey		Init the share key if it was not yet defined
642
+     * @param	int		$relativelink		0=Return full external link, 1=Return link relative to root of file
643
+     * @return	string						Link or empty string if there is no download link
644
+     */
645
+    function getLastMainDocLink($modulepart, $initsharekey=0, $relativelink=0)
646
+    {
647
+        global $user, $dolibarr_main_url_root;
2205 648
 
2206
-	// TODO: Move line related operations to CommonObjectLine?
649
+        if (empty($this->last_main_doc))
650
+        {
651
+            return '';		// No way to known which document name to use
652
+        }
2207 653
 
2208
-    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
2209
-	/**
2210
-	 *  Save a new position (field rang) for details lines.
2211
-	 *  You can choose to set position for lines with already a position or lines without any position defined.
2212
-	 *
2213
-	 * 	@param		boolean		$renum			   True to renum all already ordered lines, false to renum only not already ordered lines.
2214
-	 * 	@param		string		$rowidorder		   ASC or DESC
2215
-	 * 	@param		boolean		$fk_parent_line    Table with fk_parent_line field or not
2216
-	 * 	@return		int                            <0 if KO, >0 if OK
2217
-	 */
2218
-	function line_order($renum=false, $rowidorder='ASC', $fk_parent_line=true)
2219
-	{
2220
-        // phpcs:enable
2221
-		if (! $this->table_element_line)
2222
-		{
2223
-			dol_syslog(get_class($this)."::line_order was called on objet with property table_element_line not defined",LOG_ERR);
2224
-			return -1;
2225
-		}
2226
-		if (! $this->fk_element)
2227
-		{
2228
-			dol_syslog(get_class($this)."::line_order was called on objet with property fk_element not defined",LOG_ERR);
2229
-			return -1;
2230
-		}
2231
-
2232
-		// Count number of lines to reorder (according to choice $renum)
2233
-		$nl=0;
2234
-		$sql = 'SELECT count(rowid) FROM '.MAIN_DB_PREFIX.$this->table_element_line;
2235
-		$sql.= ' WHERE '.$this->fk_element.'='.$this->id;
2236
-		if (! $renum) $sql.= ' AND rang = 0';
2237
-		if ($renum) $sql.= ' AND rang <> 0';
2238
-
2239
-		dol_syslog(get_class($this)."::line_order", LOG_DEBUG);
2240
-		$resql = $this->db->query($sql);
2241
-		if ($resql)
2242
-		{
2243
-			$row = $this->db->fetch_row($resql);
2244
-			$nl = $row[0];
2245
-		}
2246
-		else dol_print_error($this->db);
2247
-		if ($nl > 0)
2248
-		{
2249
-			// The goal of this part is to reorder all lines, with all children lines sharing the same
2250
-			// counter that parents.
2251
-			$rows=array();
2252
-
2253
-			// We first search all lines that are parent lines (for multilevel details lines)
2254
-			$sql = 'SELECT rowid FROM '.MAIN_DB_PREFIX.$this->table_element_line;
2255
-			$sql.= ' WHERE '.$this->fk_element.' = '.$this->id;
2256
-			if ($fk_parent_line) $sql.= ' AND fk_parent_line IS NULL';
2257
-			$sql.= ' ORDER BY rang ASC, rowid '.$rowidorder;
2258
-
2259
-			dol_syslog(get_class($this)."::line_order search all parent lines", LOG_DEBUG);
2260
-			$resql = $this->db->query($sql);
2261
-			if ($resql)
2262
-			{
2263
-				$i=0;
2264
-				$num = $this->db->num_rows($resql);
2265
-				while ($i < $num)
2266
-				{
2267
-					$row = $this->db->fetch_row($resql);
2268
-					$rows[] = $row[0];	// Add parent line into array rows
2269
-					$childrens = $this->getChildrenOfLine($row[0]);
2270
-					if (! empty($childrens))
2271
-					{
2272
-						foreach($childrens as $child)
2273
-						{
2274
-							array_push($rows, $child);
2275
-						}
2276
-					}
2277
-					$i++;
2278
-				}
654
+        include_once DOL_DOCUMENT_ROOT.'/ecm/class/ecmfiles.class.php';
655
+        $ecmfile=new EcmFiles($this->db);
656
+        $result = $ecmfile->fetch(0, '', $this->last_main_doc);
657
+        if ($result < 0)
658
+        {
659
+            $this->error = $ecmfile->error;
660
+            $this->errors = $ecmfile->errors;
661
+            return -1;
662
+        }
2279 663
 
2280
-				// Now we set a new number for each lines (parent and children with children included into parent tree)
2281
-				if (! empty($rows))
664
+        if (empty($ecmfile->id))
665
+        {
666
+            // Add entry into index
667
+            if ($initsharekey)
668
+            {
669
+                require_once DOL_DOCUMENT_ROOT.'/core/lib/security2.lib.php';
670
+                // TODO We can't, we dont' have full path of file, only last_main_doc adn ->element, so we must rebuild full path first
671
+                /*
672
+				$ecmfile->filepath = $rel_dir;
673
+				$ecmfile->filename = $filename;
674
+				$ecmfile->label = md5_file(dol_osencode($destfull));	// hash of file content
675
+				$ecmfile->fullpath_orig = '';
676
+				$ecmfile->gen_or_uploaded = 'generated';
677
+				$ecmfile->description = '';    // indexed content
678
+				$ecmfile->keyword = '';        // keyword content
679
+				$ecmfile->share = getRandomPassword(true);
680
+				$result = $ecmfile->create($user);
681
+				if ($result < 0)
2282 682
 				{
2283
-					foreach($rows as $key => $row)
2284
-					{
2285
-						$this->updateRangOfLine($row, ($key+1));
2286
-					}
683
+					$this->error = $ecmfile->error;
684
+					$this->errors = $ecmfile->errors;
2287 685
 				}
2288
-			}
2289
-			else
2290
-			{
2291
-				dol_print_error($this->db);
2292
-			}
2293
-		}
2294
-		return 1;
2295
-	}
2296
-
2297
-	/**
2298
-	 * 	Get children of line
2299
-	 *
2300
-	 * 	@param	int		$id		Id of parent line
2301
-	 * 	@return	array			Array with list of children lines id
2302
-	 */
2303
-	function getChildrenOfLine($id)
2304
-	{
2305
-		$rows=array();
2306
-
2307
-		$sql = 'SELECT rowid FROM '.MAIN_DB_PREFIX.$this->table_element_line;
2308
-		$sql.= ' WHERE '.$this->fk_element.' = '.$this->id;
2309
-		$sql.= ' AND fk_parent_line = '.$id;
2310
-		$sql.= ' ORDER BY rang ASC';
2311
-
2312
-		dol_syslog(get_class($this)."::getChildrenOfLine search children lines for line ".$id."", LOG_DEBUG);
2313
-		$resql = $this->db->query($sql);
2314
-		if ($resql)
2315
-		{
2316
-			$i=0;
2317
-			$num = $this->db->num_rows($resql);
2318
-			while ($i < $num)
2319
-			{
2320
-				$row = $this->db->fetch_row($resql);
2321
-				$rows[$i] = $row[0];
2322
-				$i++;
2323
-			}
2324
-		}
686
+				*/
687
+            }
688
+            else return '';
689
+        }
690
+        elseif (empty($ecmfile->share))
691
+        {
692
+            // Add entry into index
693
+            if ($initsharekey)
694
+            {
695
+                require_once DOL_DOCUMENT_ROOT.'/core/lib/security2.lib.php';
696
+                $ecmfile->share = getRandomPassword(true);
697
+                $ecmfile->update($user);
698
+            }
699
+            else return '';
700
+        }
2325 701
 
2326
-		return $rows;
2327
-	}
702
+        // Define $urlwithroot
703
+        $urlwithouturlroot=preg_replace('/'.preg_quote(DOL_URL_ROOT,'/').'$/i','',trim($dolibarr_main_url_root));
704
+        $urlwithroot=$urlwithouturlroot.DOL_URL_ROOT;		// This is to use external domain name found into config file
705
+        //$urlwithroot=DOL_MAIN_URL_ROOT;					// This is to use same domain name than current
2328 706
 
2329
-    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
2330
-	/**
2331
-	 * 	Update a line to have a lower rank
2332
-	 *
2333
-	 * 	@param 	int			$rowid				Id of line
2334
-	 * 	@param	boolean		$fk_parent_line		Table with fk_parent_line field or not
2335
-	 * 	@return	void
2336
-	 */
2337
-	function line_up($rowid, $fk_parent_line=true)
2338
-	{
2339
-        // phpcs:enable
2340
-		$this->line_order(false, 'ASC', $fk_parent_line);
707
+        $forcedownload=0;
2341 708
 
2342
-		// Get rang of line
2343
-		$rang = $this->getRangOfLine($rowid);
709
+        $paramlink='';
710
+        //if (! empty($modulepart)) $paramlink.=($paramlink?'&':'').'modulepart='.$modulepart;		// For sharing with hash (so public files), modulepart is not required.
711
+        //if (! empty($ecmfile->entity)) $paramlink.='&entity='.$ecmfile->entity; 					// For sharing with hash (so public files), entity is not required.
712
+        //$paramlink.=($paramlink?'&':'').'file='.urlencode($filepath);								// No need of name of file for public link, we will use the hash
713
+        if (! empty($ecmfile->share)) $paramlink.=($paramlink?'&':'').'hashp='.$ecmfile->share;			// Hash for public share
714
+        if ($forcedownload) $paramlink.=($paramlink?'&':'').'attachment=1';
2344 715
 
2345
-		// Update position of line
2346
-		$this->updateLineUp($rowid, $rang);
2347
-	}
716
+        if ($relativelink)
717
+        {
718
+            $linktoreturn='document.php'.($paramlink?'?'.$paramlink:'');
719
+        }
720
+        else
721
+        {
722
+            $linktoreturn=$urlwithroot.'/document.php'.($paramlink?'?'.$paramlink:'');
723
+        }
2348 724
 
2349
-    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
2350
-	/**
2351
-	 * 	Update a line to have a higher rank
2352
-	 *
2353
-	 * 	@param	int			$rowid				Id of line
2354
-	 * 	@param	boolean		$fk_parent_line		Table with fk_parent_line field or not
2355
-	 * 	@return	void
2356
-	 */
2357
-	function line_down($rowid, $fk_parent_line=true)
2358
-	{
2359
-        // phpcs:enable
2360
-		$this->line_order(false, 'ASC', $fk_parent_line);
2361
-
2362
-		// Get rang of line
2363
-		$rang = $this->getRangOfLine($rowid);
2364
-
2365
-		// Get max value for rang
2366
-		$max = $this->line_max();
2367
-
2368
-		// Update position of line
2369
-		$this->updateLineDown($rowid, $rang, $max);
2370
-	}
2371
-
2372
-	/**
2373
-	 * 	Update position of line (rang)
2374
-	 *
2375
-	 * 	@param	int		$rowid		Id of line
2376
-	 * 	@param	int		$rang		Position
2377
-	 * 	@return	void
2378
-	 */
2379
-	function updateRangOfLine($rowid,$rang)
2380
-	{
2381
-		$fieldposition = 'rang';
2382
-		if (in_array($this->table_element_line, array('ecm_files', 'emailcollector_emailcollectoraction'))) $fieldposition = 'position';
2383
-
2384
-		$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element_line.' SET '.$fieldposition.' = '.$rang;
2385
-		$sql.= ' WHERE rowid = '.$rowid;
2386
-
2387
-		dol_syslog(get_class($this)."::updateRangOfLine", LOG_DEBUG);
2388
-		if (! $this->db->query($sql))
2389
-		{
2390
-			dol_print_error($this->db);
2391
-		}
2392
-	}
725
+        // Here $ecmfile->share is defined
726
+        return $linktoreturn;
727
+    }
2393 728
 
2394
-    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
2395
-	/**
2396
-	 * 	Update position of line with ajax (rang)
2397
-	 *
2398
-	 * 	@param	array	$rows	Array of rows
2399
-	 * 	@return	void
2400
-	 */
2401
-	function line_ajaxorder($rows)
2402
-	{
2403
-        // phpcs:enable
2404
-		$num = count($rows);
2405
-		for ($i = 0 ; $i < $num ; $i++)
2406
-		{
2407
-			$this->updateRangOfLine($rows[$i], ($i+1));
2408
-		}
2409
-	}
2410
-
2411
-	/**
2412
-	 * 	Update position of line up (rang)
2413
-	 *
2414
-	 * 	@param	int		$rowid		Id of line
2415
-	 * 	@param	int		$rang		Position
2416
-	 * 	@return	void
2417
-	 */
2418
-	function updateLineUp($rowid,$rang)
2419
-	{
2420
-		if ($rang > 1)
2421
-		{
2422
-			$fieldposition = 'rang';
2423
-			if (in_array($this->table_element_line, array('ecm_files', 'emailcollector_emailcollectoraction'))) $fieldposition = 'position';
2424
-
2425
-			$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element_line.' SET '.$fieldposition.' = '.$rang ;
2426
-			$sql.= ' WHERE '.$this->fk_element.' = '.$this->id;
2427
-			$sql.= ' AND rang = '.($rang - 1);
2428
-			if ($this->db->query($sql) )
2429
-			{
2430
-				$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element_line.' SET '.$fieldposition.' = '.($rang - 1);
2431
-				$sql.= ' WHERE rowid = '.$rowid;
2432
-				if (! $this->db->query($sql) )
2433
-				{
2434
-					dol_print_error($this->db);
2435
-				}
2436
-			}
2437
-			else
2438
-			{
2439
-				dol_print_error($this->db);
2440
-			}
2441
-		}
2442
-	}
2443
-
2444
-	/**
2445
-	 * 	Update position of line down (rang)
2446
-	 *
2447
-	 * 	@param	int		$rowid		Id of line
2448
-	 * 	@param	int		$rang		Position
2449
-	 * 	@param	int		$max		Max
2450
-	 * 	@return	void
2451
-	 */
2452
-	function updateLineDown($rowid,$rang,$max)
2453
-	{
2454
-		if ($rang < $max)
2455
-		{
2456
-			$fieldposition = 'rang';
2457
-			if (in_array($this->table_element_line, array('ecm_files', 'emailcollector_emailcollectoraction'))) $fieldposition = 'position';
2458
-
2459
-			$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element_line.' SET '.$fieldposition.' = '.$rang;
2460
-			$sql.= ' WHERE '.$this->fk_element.' = '.$this->id;
2461
-			$sql.= ' AND rang = '.($rang+1);
2462
-			if ($this->db->query($sql) )
2463
-			{
2464
-				$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element_line.' SET '.$fieldposition.' = '.($rang+1);
2465
-				$sql.= ' WHERE rowid = '.$rowid;
2466
-				if (! $this->db->query($sql) )
2467
-				{
2468
-					dol_print_error($this->db);
2469
-				}
2470
-			}
2471
-			else
2472
-			{
2473
-				dol_print_error($this->db);
2474
-			}
2475
-		}
2476
-	}
2477
-
2478
-	/**
2479
-	 * 	Get position of line (rang)
2480
-	 *
2481
-	 * 	@param		int		$rowid		Id of line
2482
-	 *  @return		int     			Value of rang in table of lines
2483
-	 */
2484
-	function getRangOfLine($rowid)
2485
-	{
2486
-		$sql = 'SELECT rang FROM '.MAIN_DB_PREFIX.$this->table_element_line;
2487
-		$sql.= ' WHERE rowid ='.$rowid;
2488
-
2489
-		dol_syslog(get_class($this)."::getRangOfLine", LOG_DEBUG);
2490
-		$resql = $this->db->query($sql);
2491
-		if ($resql)
2492
-		{
2493
-			$row = $this->db->fetch_row($resql);
2494
-			return $row[0];
2495
-		}
2496
-	}
2497
-
2498
-	/**
2499
-	 * 	Get rowid of the line relative to its position
2500
-	 *
2501
-	 * 	@param		int		$rang		Rang value
2502
-	 *  @return     int     			Rowid of the line
2503
-	 */
2504
-	function getIdOfLine($rang)
2505
-	{
2506
-		$sql = 'SELECT rowid FROM '.MAIN_DB_PREFIX.$this->table_element_line;
2507
-		$sql.= ' WHERE '.$this->fk_element.' = '.$this->id;
2508
-		$sql.= ' AND rang = '.$rang;
2509
-		$resql = $this->db->query($sql);
2510
-		if ($resql)
2511
-		{
2512
-			$row = $this->db->fetch_row($resql);
2513
-			return $row[0];
2514
-		}
2515
-	}
2516 729
 
2517 730
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
2518
-	/**
2519
-	 * 	Get max value used for position of line (rang)
2520
-	 *
2521
-	 * 	@param		int		$fk_parent_line		Parent line id
2522
-	 *  @return     int  			   			Max value of rang in table of lines
2523
-	 */
2524
-	function line_max($fk_parent_line=0)
2525
-	{
731
+    /**
732
+     *  Add a link between element $this->element and a contact
733
+     *
734
+     *  @param	int		$fk_socpeople       Id of thirdparty contact (if source = 'external') or id of user (if souce = 'internal') to link
735
+     *  @param 	int		$type_contact 		Type of contact (code or id). Must be id or code found into table llx_c_type_contact. For example: SALESREPFOLL
736
+     *  @param  string	$source             external=Contact extern (llx_socpeople), internal=Contact intern (llx_user)
737
+     *  @param  int		$notrigger			Disable all triggers
738
+     *  @return int                 		<0 if KO, >0 if OK
739
+     */
740
+    function add_contact($fk_socpeople, $type_contact, $source='external',$notrigger=0)
741
+    {
2526 742
         // phpcs:enable
2527
-		// Search the last rang with fk_parent_line
2528
-		if ($fk_parent_line)
2529
-		{
2530
-			$sql = 'SELECT max(rang) FROM '.MAIN_DB_PREFIX.$this->table_element_line;
2531
-			$sql.= ' WHERE '.$this->fk_element.' = '.$this->id;
2532
-			$sql.= ' AND fk_parent_line = '.$fk_parent_line;
2533
-
2534
-			dol_syslog(get_class($this)."::line_max", LOG_DEBUG);
2535
-			$resql = $this->db->query($sql);
2536
-			if ($resql)
2537
-			{
2538
-				$row = $this->db->fetch_row($resql);
2539
-				if (! empty($row[0]))
2540
-				{
2541
-					return $row[0];
2542
-				}
2543
-				else
2544
-				{
2545
-					return $this->getRangOfLine($fk_parent_line);
2546
-				}
2547
-			}
2548
-		}
2549
-		// If not, search the last rang of element
2550
-		else
2551
-		{
2552
-			$sql = 'SELECT max(rang) FROM '.MAIN_DB_PREFIX.$this->table_element_line;
2553
-			$sql.= ' WHERE '.$this->fk_element.' = '.$this->id;
2554
-
2555
-			dol_syslog(get_class($this)."::line_max", LOG_DEBUG);
2556
-			$resql = $this->db->query($sql);
2557
-			if ($resql)
2558
-			{
2559
-				$row = $this->db->fetch_row($resql);
2560
-				return $row[0];
2561
-			}
2562
-		}
2563
-	}
743
+        global $user,$langs;
2564 744
 
2565
-    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
2566
-	/**
2567
-	 *  Update external ref of element
2568
-	 *
2569
-	 *  @param      string		$ref_ext	Update field ref_ext
2570
-	 *  @return     int      		   		<0 if KO, >0 if OK
2571
-	 */
2572
-	function update_ref_ext($ref_ext)
2573
-	{
2574
-        // phpcs:enable
2575
-		if (! $this->table_element)
2576
-		{
2577
-			dol_syslog(get_class($this)."::update_ref_ext was called on objet with property table_element not defined", LOG_ERR);
2578
-			return -1;
2579
-		}
2580
-
2581
-		$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
2582
-		$sql.= " SET ref_ext = '".$this->db->escape($ref_ext)."'";
2583
-		$sql.= " WHERE ".(isset($this->table_rowid)?$this->table_rowid:'rowid')." = ". $this->id;
2584
-
2585
-		dol_syslog(get_class($this)."::update_ref_ext", LOG_DEBUG);
2586
-		if ($this->db->query($sql))
2587
-		{
2588
-			$this->ref_ext = $ref_ext;
2589
-			return 1;
2590
-		}
2591
-		else
2592
-		{
2593
-			$this->error=$this->db->error();
2594
-			return -1;
2595
-		}
2596
-	}
745
+
746
+        dol_syslog(get_class($this)."::add_contact $fk_socpeople, $type_contact, $source, $notrigger");
747
+
748
+        // Check parameters
749
+        if ($fk_socpeople <= 0)
750
+        {
751
+            $langs->load("errors");
752
+            $this->error=$langs->trans("ErrorWrongValueForParameterX","1");
753
+            dol_syslog(get_class($this)."::add_contact ".$this->error,LOG_ERR);
754
+            return -1;
755
+        }
756
+        if (! $type_contact)
757
+        {
758
+            $langs->load("errors");
759
+            $this->error=$langs->trans("ErrorWrongValueForParameterX","2");
760
+            dol_syslog(get_class($this)."::add_contact ".$this->error,LOG_ERR);
761
+            return -2;
762
+        }
763
+
764
+        $id_type_contact=0;
765
+        if (is_numeric($type_contact))
766
+        {
767
+            $id_type_contact=$type_contact;
768
+        }
769
+        else
770
+        {
771
+            // We look for id type_contact
772
+            $sql = "SELECT tc.rowid";
773
+            $sql.= " FROM ".MAIN_DB_PREFIX."c_type_contact as tc";
774
+            $sql.= " WHERE tc.element='".$this->db->escape($this->element)."'";
775
+            $sql.= " AND tc.source='".$this->db->escape($source)."'";
776
+            $sql.= " AND tc.code='".$this->db->escape($type_contact)."' AND tc.active=1";
777
+            //print $sql;
778
+            $resql=$this->db->query($sql);
779
+            if ($resql)
780
+            {
781
+                $obj = $this->db->fetch_object($resql);
782
+                if ($obj) $id_type_contact=$obj->rowid;
783
+            }
784
+        }
785
+
786
+        if ($id_type_contact == 0)
787
+        {
788
+            $this->error='CODE_NOT_VALID_FOR_THIS_ELEMENT';
789
+            dol_syslog("CODE_NOT_VALID_FOR_THIS_ELEMENT: Code type of contact '".$type_contact."' does not exists or is not active for element ".$this->element.", we can ignore it");
790
+            return -3;
791
+        }
792
+
793
+        $datecreate = dol_now();
794
+
795
+        // Socpeople must have already been added by some trigger, then we have to check it to avoid DB_ERROR_RECORD_ALREADY_EXISTS error
796
+        $TListeContacts=$this->liste_contact(-1, $source);
797
+        $already_added=false;
798
+        if(!empty($TListeContacts)) {
799
+            foreach($TListeContacts as $array_contact) {
800
+                if($array_contact['status'] == 4 && $array_contact['id'] == $fk_socpeople && $array_contact['fk_c_type_contact'] == $id_type_contact) {
801
+                    $already_added=true;
802
+                    break;
803
+                }
804
+            }
805
+        }
806
+
807
+        if(!$already_added) {
808
+
809
+            $this->db->begin();
810
+
811
+            // Insert into database
812
+            $sql = "INSERT INTO ".MAIN_DB_PREFIX."element_contact";
813
+            $sql.= " (element_id, fk_socpeople, datecreate, statut, fk_c_type_contact) ";
814
+            $sql.= " VALUES (".$this->id.", ".$fk_socpeople." , " ;
815
+            $sql.= "'".$this->db->idate($datecreate)."'";
816
+            $sql.= ", 4, ". $id_type_contact;
817
+            $sql.= ")";
818
+
819
+            $resql=$this->db->query($sql);
820
+            if ($resql)
821
+            {
822
+                if (! $notrigger)
823
+                {
824
+                    $result=$this->call_trigger(strtoupper($this->element).'_ADD_CONTACT', $user);
825
+                    if ($result < 0)
826
+                    {
827
+                        $this->db->rollback();
828
+                        return -1;
829
+                    }
830
+                }
831
+
832
+                $this->db->commit();
833
+                return 1;
834
+            }
835
+            else
836
+            {
837
+                if ($this->db->errno() == 'DB_ERROR_RECORD_ALREADY_EXISTS')
838
+                {
839
+                    $this->error=$this->db->errno();
840
+                    $this->db->rollback();
841
+                    echo 'err rollback';
842
+                    return -2;
843
+                }
844
+                else
845
+                {
846
+                    $this->error=$this->db->error();
847
+                    $this->db->rollback();
848
+                    return -1;
849
+                }
850
+            }
851
+        } else return 0;
852
+    }
2597 853
 
2598 854
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
2599
-	/**
2600
-	 *  Update note of element
2601
-	 *
2602
-	 *  @param      string		$note		New value for note
2603
-	 *  @param		string		$suffix		'', '_public' or '_private'
2604
-	 *  @return     int      		   		<0 if KO, >0 if OK
2605
-	 */
2606
-	function update_note($note, $suffix='')
2607
-	{
855
+    /**
856
+     *    Copy contact from one element to current
857
+     *
858
+     *    @param    CommonObject    $objFrom    Source element
859
+     *    @param    string          $source     Nature of contact ('internal' or 'external')
860
+     *    @return   int                         >0 if OK, <0 if KO
861
+     */
862
+    function copy_linked_contact($objFrom, $source='internal')
863
+    {
2608 864
         // phpcs:enable
2609
-		global $user;
2610
-
2611
-		if (! $this->table_element)
2612
-		{
2613
-			$this->error='update_note was called on objet with property table_element not defined';
2614
-			dol_syslog(get_class($this)."::update_note was called on objet with property table_element not defined", LOG_ERR);
2615
-			return -1;
2616
-		}
2617
-		if (! in_array($suffix,array('','_public','_private')))
2618
-		{
2619
-			$this->error='update_note Parameter suffix must be empty, \'_private\' or \'_public\'';
2620
-			dol_syslog(get_class($this)."::update_note Parameter suffix must be empty, '_private' or '_public'", LOG_ERR);
2621
-			return -2;
2622
-		}
2623
-		// Special cas
2624
-		//var_dump($this->table_element);exit;
2625
-		if ($this->table_element == 'product') $suffix='';
2626
-
2627
-		$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
2628
-		$sql.= " SET note".$suffix." = ".(!empty($note)?("'".$this->db->escape($note)."'"):"NULL");
2629
-		$sql.= " ,".(in_array($this->table_element, array('actioncomm', 'adherent', 'advtargetemailing', 'cronjob', 'establishment'))?"fk_user_mod":"fk_user_modif")." = ".$user->id;
2630
-		$sql.= " WHERE rowid =". $this->id;
2631
-
2632
-		dol_syslog(get_class($this)."::update_note", LOG_DEBUG);
2633
-		if ($this->db->query($sql))
2634
-		{
2635
-			if ($suffix == '_public') $this->note_public = $note;
2636
-			else if ($suffix == '_private') $this->note_private = $note;
2637
-			else
2638
-			{
2639
-				$this->note = $note;      // deprecated
2640
-				$this->note_private = $note;
2641
-			}
2642
-			return 1;
2643
-		}
2644
-		else
2645
-		{
2646
-			$this->error=$this->db->lasterror();
2647
-			return -1;
2648
-		}
2649
-	}
865
+        $contacts = $objFrom->liste_contact(-1, $source);
866
+        foreach($contacts as $contact)
867
+        {
868
+            if ($this->add_contact($contact['id'], $contact['fk_c_type_contact'], $contact['source']) < 0)
869
+            {
870
+                $this->error=$this->db->lasterror();
871
+                return -1;
872
+            }
873
+        }
874
+        return 1;
875
+    }
2650 876
 
2651 877
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
2652
-	/**
2653
-	 * 	Update public note (kept for backward compatibility)
2654
-	 *
2655
-	 * @param      string		$note		New value for note
2656
-	 * @return     int      		   		<0 if KO, >0 if OK
2657
-	 * @deprecated
2658
-	 * @see update_note()
2659
-	 */
2660
-	function update_note_public($note)
2661
-	{
878
+    /**
879
+     *      Update a link to contact line
880
+     *
881
+     *      @param	int		$rowid              Id of line contact-element
882
+     * 		@param	int		$statut	            New status of link
883
+     *      @param  int		$type_contact_id    Id of contact type (not modified if 0)
884
+     *      @param  int		$fk_socpeople	    Id of soc_people to update (not modified if 0)
885
+     *      @return int                 		<0 if KO, >= 0 if OK
886
+     */
887
+    function update_contact($rowid, $statut, $type_contact_id=0, $fk_socpeople=0)
888
+    {
2662 889
         // phpcs:enable
2663
-		return $this->update_note($note,'_public');
2664
-	}
890
+        // Insert into database
891
+        $sql = "UPDATE ".MAIN_DB_PREFIX."element_contact set";
892
+        $sql.= " statut = ".$statut;
893
+        if ($type_contact_id) $sql.= ", fk_c_type_contact = '".$type_contact_id ."'";
894
+        if ($fk_socpeople) $sql.= ", fk_socpeople = '".$fk_socpeople ."'";
895
+        $sql.= " where rowid = ".$rowid;
896
+        $resql=$this->db->query($sql);
897
+        if ($resql)
898
+        {
899
+            return 0;
900
+        }
901
+        else
902
+        {
903
+            $this->error=$this->db->lasterror();
904
+            return -1;
905
+        }
906
+    }
2665 907
 
2666 908
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
2667
-	/**
2668
-	 *	Update total_ht, total_ttc, total_vat, total_localtax1, total_localtax2 for an object (sum of lines).
2669
-	 *  Must be called at end of methods addline or updateline.
2670
-	 *
2671
-	 *	@param	int		$exclspec          	>0 = Exclude special product (product_type=9)
2672
-	 *  @param  string	$roundingadjust    	'none'=Do nothing, 'auto'=Use default method (MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND if defined, or '0'), '0'=Force mode total of rounding, '1'=Force mode rounding of total
2673
-	 *  @param	int		$nodatabaseupdate	1=Do not update database. Update only properties of object.
2674
-	 *  @param	Societe	$seller				If roundingadjust is '0' or '1' or maybe 'auto', it means we recalculate total for lines before calculating total for object and for this, we need seller object.
2675
-	 *	@return	int    			           	<0 if KO, >0 if OK
2676
-	 */
2677
-	function update_price($exclspec=0,$roundingadjust='none',$nodatabaseupdate=0,$seller=null)
2678
-	{
909
+    /**
910
+     *    Delete a link to contact line
911
+     *
912
+     *    @param	int		$rowid			Id of contact link line to delete
913
+     *    @param	int		$notrigger		Disable all triggers
914
+     *    @return   int						>0 if OK, <0 if KO
915
+     */
916
+    function delete_contact($rowid, $notrigger=0)
917
+    {
2679 918
         // phpcs:enable
2680
-		global $conf, $hookmanager, $action;
2681
-
2682
-		// Some external module want no update price after a trigger because they have another method to calculate the total (ex: with an extrafield)
2683
-		$MODULE = "";
2684
-		if ($this->element == 'propal')
2685
-			$MODULE = "MODULE_DISALLOW_UPDATE_PRICE_PROPOSAL";
2686
-		elseif ($this->element == 'order')
2687
-			$MODULE = "MODULE_DISALLOW_UPDATE_PRICE_ORDER";
2688
-		elseif ($this->element == 'facture')
2689
-			$MODULE = "MODULE_DISALLOW_UPDATE_PRICE_INVOICE";
2690
-		elseif ($this->element == 'facture_fourn')
2691
-			$MODULE = "MODULE_DISALLOW_UPDATE_PRICE_SUPPLIER_INVOICE";
2692
-		elseif ($this->element == 'order_supplier')
2693
-			$MODULE = "MODULE_DISALLOW_UPDATE_PRICE_SUPPLIER_ORDER";
2694
-		elseif ($this->element == 'supplier_proposal')
2695
-			$MODULE = "MODULE_DISALLOW_UPDATE_PRICE_SUPPLIER_PROPOSAL";
2696
-
2697
-		if (! empty($MODULE)) {
2698
-			if (! empty($conf->global->$MODULE)) {
2699
-				$modsactivated = explode(',', $conf->global->$MODULE);
2700
-				foreach ($modsactivated as $mod) {
2701
-					if ($conf->$mod->enabled)
2702
-						return 1; // update was disabled by specific setup
2703
-				}
2704
-			}
2705
-		}
2706
-
2707
-		include_once DOL_DOCUMENT_ROOT.'/core/lib/price.lib.php';
2708
-
2709
-		if ($roundingadjust == '-1') $roundingadjust='auto';	// For backward compatibility
2710
-
2711
-		$forcedroundingmode=$roundingadjust;
2712
-		if ($forcedroundingmode == 'auto' && isset($conf->global->MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND)) $forcedroundingmode=$conf->global->MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND;
2713
-		elseif ($forcedroundingmode == 'auto') $forcedroundingmode='0';
2714
-
2715
-		$error=0;
2716
-
2717
-		$multicurrency_tx = !empty($this->multicurrency_tx) ? $this->multicurrency_tx : 1;
2718
-
2719
-		// Define constants to find lines to sum
2720
-		$fieldtva='total_tva';
2721
-		$fieldlocaltax1='total_localtax1';
2722
-		$fieldlocaltax2='total_localtax2';
2723
-		$fieldup='subprice';
2724
-		if ($this->element == 'facture_fourn' || $this->element == 'invoice_supplier')
2725
-		{
2726
-			$fieldtva='tva';
2727
-			$fieldup='pu_ht';
2728
-		}
2729
-		if ($this->element == 'expensereport')
2730
-		{
2731
-			$fieldup='value_unit';
2732
-		}
2733
-
2734
-		$sql = 'SELECT rowid, qty, '.$fieldup.' as up, remise_percent, total_ht, '.$fieldtva.' as total_tva, total_ttc, '.$fieldlocaltax1.' as total_localtax1, '.$fieldlocaltax2.' as total_localtax2,';
2735
-		$sql.= ' tva_tx as vatrate, localtax1_tx, localtax2_tx, localtax1_type, localtax2_type, info_bits, product_type';
2736
-			if ($this->table_element_line == 'facturedet') $sql.= ', situation_percent';
2737
-			$sql.= ', multicurrency_total_ht, multicurrency_total_tva, multicurrency_total_ttc';
2738
-		$sql.= ' FROM '.MAIN_DB_PREFIX.$this->table_element_line;
2739
-		$sql.= ' WHERE '.$this->fk_element.' = '.$this->id;
2740
-		if ($exclspec)
2741
-		{
2742
-			$product_field='product_type';
2743
-			if ($this->table_element_line == 'contratdet') $product_field='';    // contratdet table has no product_type field
2744
-			if ($product_field) $sql.= ' AND '.$product_field.' <> 9';
2745
-		}
2746
-		$sql.= ' ORDER by rowid';	// We want to be sure to always use same order of line to not change lines differently when option MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND is used
2747
-
2748
-		dol_syslog(get_class($this)."::update_price", LOG_DEBUG);
2749
-		$resql = $this->db->query($sql);
2750
-		if ($resql)
2751
-		{
2752
-			$this->total_ht  = 0;
2753
-			$this->total_tva = 0;
2754
-			$this->total_localtax1 = 0;
2755
-			$this->total_localtax2 = 0;
2756
-			$this->total_ttc = 0;
2757
-			$total_ht_by_vats  = array();
2758
-			$total_tva_by_vats = array();
2759
-			$total_ttc_by_vats = array();
2760
-			$this->multicurrency_total_ht	= 0;
2761
-			$this->multicurrency_total_tva	= 0;
2762
-			$this->multicurrency_total_ttc	= 0;
2763
-
2764
-			$num = $this->db->num_rows($resql);
2765
-			$i = 0;
2766
-			while ($i < $num)
2767
-			{
2768
-				$obj = $this->db->fetch_object($resql);
2769
-
2770
-				// Note: There is no check on detail line and no check on total, if $forcedroundingmode = 'none'
2771
-				$parameters=array('fk_element' => $obj->rowid);
2772
-				$reshook = $hookmanager->executeHooks('changeRoundingMode', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
2773
-
2774
-				if (empty($reshook) && $forcedroundingmode == '0')	// Check if data on line are consistent. This may solve lines that were not consistent because set with $forcedroundingmode='auto'
2775
-				{
2776
-					$localtax_array=array($obj->localtax1_type,$obj->localtax1_tx,$obj->localtax2_type,$obj->localtax2_tx);
2777
-					$tmpcal=calcul_price_total($obj->qty, $obj->up, $obj->remise_percent, $obj->vatrate, $obj->localtax1_tx, $obj->localtax2_tx, 0, 'HT', $obj->info_bits, $obj->product_type, $seller, $localtax_array, (isset($obj->situation_percent) ? $obj->situation_percent : 100), $multicurrency_tx);
2778
-					$diff=price2num($tmpcal[1] - $obj->total_tva, 'MT', 1);
2779
-					if ($diff)
2780
-					{
2781
-						$sqlfix="UPDATE ".MAIN_DB_PREFIX.$this->table_element_line." SET ".$fieldtva." = ".$tmpcal[1].", total_ttc = ".$tmpcal[2]." WHERE rowid = ".$obj->rowid;
2782
-						dol_syslog('We found unconsistent data into detailed line (difference of '.$diff.') for line rowid = '.$obj->rowid." (total vat of line calculated=".$tmpcal[1].", database=".$obj->total_tva."). We fix the total_vat and total_ttc of line by running sqlfix = ".$sqlfix);
2783
-								$resqlfix=$this->db->query($sqlfix);
2784
-								if (! $resqlfix) dol_print_error($this->db,'Failed to update line');
2785
-								$obj->total_tva = $tmpcal[1];
2786
-								$obj->total_ttc = $tmpcal[2];
2787
-						//
2788
-					}
2789
-				}
919
+        global $user;
2790 920
 
2791
-				$this->total_ht        += $obj->total_ht;		// The field visible at end of line detail
2792
-				$this->total_tva       += $obj->total_tva;
2793
-				$this->total_localtax1 += $obj->total_localtax1;
2794
-				$this->total_localtax2 += $obj->total_localtax2;
2795
-				$this->total_ttc       += $obj->total_ttc;
2796
-				$this->multicurrency_total_ht        += $obj->multicurrency_total_ht;		// The field visible at end of line detail
2797
-				$this->multicurrency_total_tva       += $obj->multicurrency_total_tva;
2798
-				$this->multicurrency_total_ttc       += $obj->multicurrency_total_ttc;
2799
-
2800
-				if (! isset($total_ht_by_vats[$obj->vatrate]))  $total_ht_by_vats[$obj->vatrate]=0;
2801
-				if (! isset($total_tva_by_vats[$obj->vatrate])) $total_tva_by_vats[$obj->vatrate]=0;
2802
-				if (! isset($total_ttc_by_vats[$obj->vatrate])) $total_ttc_by_vats[$obj->vatrate]=0;
2803
-				$total_ht_by_vats[$obj->vatrate]  += $obj->total_ht;
2804
-				$total_tva_by_vats[$obj->vatrate] += $obj->total_tva;
2805
-				$total_ttc_by_vats[$obj->vatrate] += $obj->total_ttc;
2806
-
2807
-				if ($forcedroundingmode == '1')	// Check if we need adjustement onto line for vat. TODO This works on the company currency but not on multicurrency
2808
-				{
2809
-					$tmpvat=price2num($total_ht_by_vats[$obj->vatrate] * $obj->vatrate / 100, 'MT', 1);
2810
-					$diff=price2num($total_tva_by_vats[$obj->vatrate]-$tmpvat, 'MT', 1);
2811
-					//print 'Line '.$i.' rowid='.$obj->rowid.' vat_rate='.$obj->vatrate.' total_ht='.$obj->total_ht.' total_tva='.$obj->total_tva.' total_ttc='.$obj->total_ttc.' total_ht_by_vats='.$total_ht_by_vats[$obj->vatrate].' total_tva_by_vats='.$total_tva_by_vats[$obj->vatrate].' (new calculation = '.$tmpvat.') total_ttc_by_vats='.$total_ttc_by_vats[$obj->vatrate].($diff?" => DIFF":"")."<br>\n";
2812
-					if ($diff)
2813
-					{
2814
-						if (abs($diff) > 0.1) { dol_syslog('A rounding difference was detected into TOTAL but is too high to be corrected', LOG_WARNING); exit; }
2815
-						$sqlfix="UPDATE ".MAIN_DB_PREFIX.$this->table_element_line." SET ".$fieldtva." = ".($obj->total_tva - $diff).", total_ttc = ".($obj->total_ttc - $diff)." WHERE rowid = ".$obj->rowid;
2816
-						dol_syslog('We found a difference of '.$diff.' for line rowid = '.$obj->rowid.". We fix the total_vat and total_ttc of line by running sqlfix = ".$sqlfix);
2817
-								$resqlfix=$this->db->query($sqlfix);
2818
-								if (! $resqlfix) dol_print_error($this->db,'Failed to update line');
2819
-								$this->total_tva -= $diff;
2820
-								$this->total_ttc -= $diff;
2821
-								$total_tva_by_vats[$obj->vatrate] -= $diff;
2822
-								$total_ttc_by_vats[$obj->vatrate] -= $diff;
2823
-					}
2824
-				}
2825 921
 
2826
-				$i++;
2827
-			}
922
+        $this->db->begin();
2828 923
 
2829
-			// Add revenue stamp to total
2830
-			$this->total_ttc       			+= isset($this->revenuestamp)?$this->revenuestamp:0;
2831
-			$this->multicurrency_total_ttc  += isset($this->revenuestamp)?($this->revenuestamp * $multicurrency_tx):0;
924
+        $sql = "DELETE FROM ".MAIN_DB_PREFIX."element_contact";
925
+        $sql.= " WHERE rowid =".$rowid;
2832 926
 
2833
-			// Situations totals
2834
-			if ($this->situation_cycle_ref && $this->situation_counter > 1 && method_exists($this, 'get_prev_sits') && $this->type != $this::TYPE_CREDIT_NOTE )
2835
-			{
2836
-				$prev_sits = $this->get_prev_sits();
2837
-
2838
-				foreach ($prev_sits as $sit) {				// $sit is an object Facture loaded with a fetch.
2839
-					$this->total_ht -= $sit->total_ht;
2840
-					$this->total_tva -= $sit->total_tva;
2841
-					$this->total_localtax1 -= $sit->total_localtax1;
2842
-					$this->total_localtax2 -= $sit->total_localtax2;
2843
-					$this->total_ttc -= $sit->total_ttc;
2844
-					$this->multicurrency_total_ht -= $sit->multicurrency_total_ht;
2845
-					$this->multicurrency_total_tva -= $sit->multicurrency_total_tva;
2846
-					$this->multicurrency_total_ttc -= $sit->multicurrency_total_ttc;
2847
-				}
2848
-			}
2849
-
2850
-			$this->db->free($resql);
2851
-
2852
-			// Now update global field total_ht, total_ttc and tva
2853
-			$fieldht='total_ht';
2854
-			$fieldtva='tva';
2855
-			$fieldlocaltax1='localtax1';
2856
-			$fieldlocaltax2='localtax2';
2857
-			$fieldttc='total_ttc';
2858
-			// Specific code for backward compatibility with old field names
2859
-			if ($this->element == 'facture' || $this->element == 'facturerec')             $fieldht='total';
2860
-			if ($this->element == 'facture_fourn' || $this->element == 'invoice_supplier') $fieldtva='total_tva';
2861
-			if ($this->element == 'propal')                                                $fieldttc='total';
2862
-			if ($this->element == 'expensereport')                                         $fieldtva='total_tva';
2863
-			if ($this->element == 'supplier_proposal')                                     $fieldttc='total';
2864
-
2865
-			if (empty($nodatabaseupdate))
2866
-			{
2867
-				$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element.' SET';
2868
-				$sql .= " ".$fieldht."='".price2num($this->total_ht)."',";
2869
-				$sql .= " ".$fieldtva."='".price2num($this->total_tva)."',";
2870
-				$sql .= " ".$fieldlocaltax1."='".price2num($this->total_localtax1)."',";
2871
-				$sql .= " ".$fieldlocaltax2."='".price2num($this->total_localtax2)."',";
2872
-				$sql .= " ".$fieldttc."='".price2num($this->total_ttc)."'";
2873
-						$sql .= ", multicurrency_total_ht='".price2num($this->multicurrency_total_ht, 'MT', 1)."'";
2874
-						$sql .= ", multicurrency_total_tva='".price2num($this->multicurrency_total_tva, 'MT', 1)."'";
2875
-						$sql .= ", multicurrency_total_ttc='".price2num($this->multicurrency_total_ttc, 'MT', 1)."'";
2876
-				$sql .= ' WHERE rowid = '.$this->id;
2877
-
2878
-
2879
-				dol_syslog(get_class($this)."::update_price", LOG_DEBUG);
2880
-				$resql=$this->db->query($sql);
2881
-				if (! $resql)
2882
-				{
2883
-					$error++;
2884
-					$this->error=$this->db->lasterror();
2885
-					$this->errors[]=$this->db->lasterror();
2886
-				}
2887
-			}
927
+        dol_syslog(get_class($this)."::delete_contact", LOG_DEBUG);
928
+        if ($this->db->query($sql))
929
+        {
930
+            if (! $notrigger)
931
+            {
932
+                $result=$this->call_trigger(strtoupper($this->element).'_DELETE_CONTACT', $user);
933
+                if ($result < 0) { $this->db->rollback(); return -1; }
934
+            }
2888 935
 
2889
-			if (! $error)
2890
-			{
2891
-				return 1;
2892
-			}
2893
-			else
2894
-			{
2895
-				return -1;
2896
-			}
2897
-		}
2898
-		else
2899
-		{
2900
-			dol_print_error($this->db,'Bad request in update_price');
2901
-			return -1;
2902
-		}
2903
-	}
936
+            $this->db->commit();
937
+            return 1;
938
+        }
939
+        else
940
+        {
941
+            $this->error=$this->db->lasterror();
942
+            $this->db->rollback();
943
+            return -1;
944
+        }
945
+    }
2904 946
 
2905 947
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
2906
-	/**
2907
-	 *	Add objects linked in llx_element_element.
2908
-	 *
2909
-	 *	@param		string	$origin		Linked element type
2910
-	 *	@param		int		$origin_id	Linked element id
2911
-	 *	@return		int					<=0 if KO, >0 if OK
2912
-	 *	@see		fetchObjectLinked, updateObjectLinked, deleteObjectLinked
2913
-	 */
2914
-	function add_object_linked($origin=null, $origin_id=null)
2915
-	{
948
+    /**
949
+     *    Delete all links between an object $this and all its contacts
950
+     *
951
+     *	  @param	string	$source		'' or 'internal' or 'external'
952
+     *	  @param	string	$code		Type of contact (code or id)
953
+     *    @return   int					>0 if OK, <0 if KO
954
+     */
955
+    function delete_linked_contact($source='',$code='')
956
+    {
2916 957
         // phpcs:enable
2917
-		$origin = (! empty($origin) ? $origin : $this->origin);
2918
-		$origin_id = (! empty($origin_id) ? $origin_id : $this->origin_id);
2919
-
2920
-		// Special case
2921
-		if ($origin == 'order') $origin='commande';
2922
-		if ($origin == 'invoice') $origin='facture';
2923
-		if ($origin == 'invoice_template') $origin='facturerec';
2924
-    	if ($origin == 'supplierorder') $origin='order_supplier';
2925
-		$this->db->begin();
2926
-
2927
-		$sql = "INSERT INTO ".MAIN_DB_PREFIX."element_element (";
2928
-		$sql.= "fk_source";
2929
-		$sql.= ", sourcetype";
2930
-		$sql.= ", fk_target";
2931
-		$sql.= ", targettype";
2932
-		$sql.= ") VALUES (";
2933
-		$sql.= $origin_id;
2934
-		$sql.= ", '".$this->db->escape($origin)."'";
2935
-		$sql.= ", ".$this->id;
2936
-		$sql.= ", '".$this->db->escape($this->element)."'";
2937
-		$sql.= ")";
2938
-
2939
-		dol_syslog(get_class($this)."::add_object_linked", LOG_DEBUG);
2940
-		if ($this->db->query($sql))
2941
-	  	{
2942
-	  		$this->db->commit();
2943
-	  		return 1;
2944
-	  	}
2945
-	  	else
2946
-	  	{
2947
-	  		$this->error=$this->db->lasterror();
2948
-	  		$this->db->rollback();
2949
-	  		return 0;
2950
-	  	}
2951
-	}
2952
-
2953
-	/**
2954
-	 *	Fetch array of objects linked to current object (object of enabled modules only). Links are loaded into
2955
-	 *		this->linkedObjectsIds array and
2956
-	 *		this->linkedObjects array if $loadalsoobjects = 1
2957
-	 *  Possible usage for parameters:
2958
-	 *  - all parameters empty -> we look all link to current object (current object can be source or target)
2959
-	 *  - source id+type -> will get target list linked to source
2960
-	 *  - target id+type -> will get source list linked to target
2961
-	 *  - source id+type + target type -> will get target list of the type
2962
-	 *  - target id+type + target source -> will get source list of the type
2963
-	 *
2964
-	 *	@param	int		$sourceid			Object source id (if not defined, id of object)
2965
-	 *	@param  string	$sourcetype			Object source type (if not defined, element name of object)
2966
-	 *	@param  int		$targetid			Object target id (if not defined, id of object)
2967
-	 *	@param  string	$targettype			Object target type (if not defined, elemennt name of object)
2968
-	 *	@param  string	$clause				'OR' or 'AND' clause used when both source id and target id are provided
2969
-	 *  @param  int		$alsosametype		0=Return only links to object that differs from source type. 1=Include also link to objects of same type.
2970
-	 *  @param  string	$orderby			SQL 'ORDER BY' clause
2971
-	 *  @param	int		$loadalsoobjects	Load also array this->linkedObjects (Use 0 to increase performances)
2972
-	 *	@return int							<0 if KO, >0 if OK
2973
-	 *  @see	add_object_linked, updateObjectLinked, deleteObjectLinked
2974
-	 */
2975
-	function fetchObjectLinked($sourceid=null,$sourcetype='',$targetid=null,$targettype='',$clause='OR',$alsosametype=1,$orderby='sourcetype',$loadalsoobjects=1)
2976
-	{
2977
-		global $conf;
2978
-
2979
-		$this->linkedObjectsIds=array();
2980
-		$this->linkedObjects=array();
2981
-
2982
-		$justsource=false;
2983
-		$justtarget=false;
2984
-		$withtargettype=false;
2985
-		$withsourcetype=false;
2986
-
2987
-		if (! empty($sourceid) && ! empty($sourcetype) && empty($targetid))
2988
-		{
2989
-			$justsource=true;  // the source (id and type) is a search criteria
2990
-			if (! empty($targettype)) $withtargettype=true;
2991
-		}
2992
-		if (! empty($targetid) && ! empty($targettype) && empty($sourceid))
2993
-		{
2994
-			$justtarget=true;  // the target (id and type) is a search criteria
2995
-			if (! empty($sourcetype)) $withsourcetype=true;
2996
-		}
2997
-
2998
-		$sourceid = (! empty($sourceid) ? $sourceid : $this->id);
2999
-		$targetid = (! empty($targetid) ? $targetid : $this->id);
3000
-		$sourcetype = (! empty($sourcetype) ? $sourcetype : $this->element);
3001
-		$targettype = (! empty($targettype) ? $targettype : $this->element);
3002
-
3003
-		/*if (empty($sourceid) && empty($targetid))
3004
-		 {
3005
-		 dol_syslog('Bad usage of function. No source nor target id defined (nor as parameter nor as object id)', LOG_ERR);
3006
-		 return -1;
3007
-		 }*/
958
+        $temp = array();
959
+        $typeContact = $this->liste_type_contact($source,'',0,0,$code);
3008 960
 
3009
-		// Links between objects are stored in table element_element
3010
-		$sql = 'SELECT rowid, fk_source, sourcetype, fk_target, targettype';
3011
-		$sql.= ' FROM '.MAIN_DB_PREFIX.'element_element';
3012
-		$sql.= " WHERE ";
3013
-		if ($justsource || $justtarget)
3014
-		{
3015
-			if ($justsource)
3016
-			{
3017
-				$sql.= "fk_source = ".$sourceid." AND sourcetype = '".$sourcetype."'";
3018
-				if ($withtargettype) $sql.= " AND targettype = '".$targettype."'";
3019
-			}
3020
-			else if ($justtarget)
3021
-			{
3022
-				$sql.= "fk_target = ".$targetid." AND targettype = '".$targettype."'";
3023
-				if ($withsourcetype) $sql.= " AND sourcetype = '".$sourcetype."'";
3024
-			}
3025
-		}
3026
-		else
3027
-		{
3028
-			$sql.= "(fk_source = ".$sourceid." AND sourcetype = '".$sourcetype."')";
3029
-			$sql.= " ".$clause." (fk_target = ".$targetid." AND targettype = '".$targettype."')";
3030
-		}
3031
-		$sql .= ' ORDER BY '.$orderby;
3032
-
3033
-		dol_syslog(get_class($this)."::fetchObjectLink", LOG_DEBUG);
3034
-		$resql = $this->db->query($sql);
3035
-		if ($resql)
3036
-		{
3037
-			$num = $this->db->num_rows($resql);
3038
-			$i = 0;
3039
-			while ($i < $num)
3040
-			{
3041
-				$obj = $this->db->fetch_object($resql);
3042
-				if ($justsource || $justtarget)
3043
-				{
3044
-					if ($justsource)
3045
-					{
3046
-						$this->linkedObjectsIds[$obj->targettype][$obj->rowid]=$obj->fk_target;
3047
-					}
3048
-					else if ($justtarget)
3049
-					{
3050
-						$this->linkedObjectsIds[$obj->sourcetype][$obj->rowid]=$obj->fk_source;
3051
-					}
3052
-				}
3053
-				else
3054
-				{
3055
-					if ($obj->fk_source == $sourceid && $obj->sourcetype == $sourcetype)
3056
-					{
3057
-						$this->linkedObjectsIds[$obj->targettype][$obj->rowid]=$obj->fk_target;
3058
-					}
3059
-					if ($obj->fk_target == $targetid && $obj->targettype == $targettype)
3060
-					{
3061
-						$this->linkedObjectsIds[$obj->sourcetype][$obj->rowid]=$obj->fk_source;
3062
-					}
3063
-				}
3064
-				$i++;
3065
-			}
961
+        foreach($typeContact as $key => $value)
962
+        {
963
+            array_push($temp,$key);
964
+        }
965
+        $listId = implode(",", $temp);
3066 966
 
3067
-			if (! empty($this->linkedObjectsIds))
3068
-			{
3069
-				$tmparray = $this->linkedObjectsIds;
3070
-				foreach($tmparray as $objecttype => $objectids)       // $objecttype is a module name ('facture', 'mymodule', ...) or a module name with a suffix ('project_task', 'mymodule_myobj', ...)
3071
-				{
3072
-					// Parse element/subelement (ex: project_task, cabinetmed_consultation, ...)
3073
-					$module = $element = $subelement = $objecttype;
3074
-					if ($objecttype != 'supplier_proposal' && $objecttype != 'order_supplier' && $objecttype != 'invoice_supplier'
3075
-						&& preg_match('/^([^_]+)_([^_]+)/i',$objecttype,$regs))
3076
-					{
3077
-						$module = $element = $regs[1];
3078
-						$subelement = $regs[2];
3079
-					}
3080
-
3081
-					$classpath = $element.'/class';
3082
-					// To work with non standard classpath or module name
3083
-					if ($objecttype == 'facture')			{
3084
-						$classpath = 'compta/facture/class';
3085
-					}
3086
-					else if ($objecttype == 'facturerec')			{
3087
-						$classpath = 'compta/facture/class'; $module = 'facture';
3088
-					}
3089
-					else if ($objecttype == 'propal')			{
3090
-						$classpath = 'comm/propal/class';
3091
-					}
3092
-					else if ($objecttype == 'supplier_proposal')			{
3093
-						$classpath = 'supplier_proposal/class';
3094
-					}
3095
-					else if ($objecttype == 'shipping')			{
3096
-						$classpath = 'expedition/class'; $subelement = 'expedition'; $module = 'expedition_bon';
3097
-					}
3098
-					else if ($objecttype == 'delivery')			{
3099
-						$classpath = 'livraison/class'; $subelement = 'livraison'; $module = 'livraison_bon';
3100
-					}
3101
-					else if ($objecttype == 'invoice_supplier' || $objecttype == 'order_supplier')	{
3102
-						$classpath = 'fourn/class'; $module = 'fournisseur';
3103
-					}
3104
-					else if ($objecttype == 'fichinter')			{
3105
-						$classpath = 'fichinter/class'; $subelement = 'fichinter'; $module = 'ficheinter';
3106
-					}
3107
-					else if ($objecttype == 'subscription')			{
3108
-						$classpath = 'adherents/class'; $module = 'adherent';
3109
-					}
3110
-
3111
-					// Set classfile
3112
-					$classfile = strtolower($subelement); $classname = ucfirst($subelement);
3113
-
3114
-					if ($objecttype == 'order') {
3115
-						$classfile = 'commande'; $classname = 'Commande';
3116
-					}
3117
-					else if ($objecttype == 'invoice_supplier') {
3118
-						$classfile = 'fournisseur.facture'; $classname = 'FactureFournisseur';
3119
-					}
3120
-					else if ($objecttype == 'order_supplier')   {
3121
-						$classfile = 'fournisseur.commande'; $classname = 'CommandeFournisseur';
3122
-					}
3123
-					else if ($objecttype == 'supplier_proposal')   {
3124
-						$classfile = 'supplier_proposal'; $classname = 'SupplierProposal';
3125
-					}
3126
-					else if ($objecttype == 'facturerec')   {
3127
-						$classfile = 'facture-rec'; $classname = 'FactureRec';
3128
-					}
3129
-					else if ($objecttype == 'subscription')   {
3130
-						$classfile = 'subscription'; $classname = 'Subscription';
3131
-					}
3132
-
3133
-					// Here $module, $classfile and $classname are set
3134
-					if ($conf->$module->enabled && (($element != $this->element) || $alsosametype))
3135
-					{
3136
-						if ($loadalsoobjects)
3137
-						{
3138
-							dol_include_once('/'.$classpath.'/'.$classfile.'.class.php');
3139
-							//print '/'.$classpath.'/'.$classfile.'.class.php '.class_exists($classname);
3140
-							if (class_exists($classname))
3141
-							{
3142
-								foreach($objectids as $i => $objectid)	// $i is rowid into llx_element_element
3143
-								{
3144
-									$object = new $classname($this->db);
3145
-									$ret = $object->fetch($objectid);
3146
-									if ($ret >= 0)
3147
-									{
3148
-										$this->linkedObjects[$objecttype][$i] = $object;
3149
-									}
3150
-								}
3151
-							}
3152
-						}
3153
-					}
3154
-					else
3155
-					{
3156
-						unset($this->linkedObjectsIds[$objecttype]);
3157
-					}
3158
-				}
3159
-			}
3160
-			return 1;
3161
-		}
3162
-		else
3163
-		{
3164
-			dol_print_error($this->db);
3165
-			return -1;
3166
-		}
3167
-	}
3168
-
3169
-	/**
3170
-	 *	Update object linked of a current object
3171
-	 *
3172
-	 *	@param	int		$sourceid		Object source id
3173
-	 *	@param  string	$sourcetype		Object source type
3174
-	 *	@param  int		$targetid		Object target id
3175
-	 *	@param  string	$targettype		Object target type
3176
-	 *	@return							int	>0 if OK, <0 if KO
3177
-	 *	@see	add_object_linked, fetObjectLinked, deleteObjectLinked
3178
-	 */
3179
-	function updateObjectLinked($sourceid=null, $sourcetype='', $targetid=null, $targettype='')
3180
-	{
3181
-		$updatesource=false;
3182
-		$updatetarget=false;
3183
-
3184
-		if (! empty($sourceid) && ! empty($sourcetype) && empty($targetid) && empty($targettype)) $updatesource=true;
3185
-		else if (empty($sourceid) && empty($sourcetype) && ! empty($targetid) && ! empty($targettype)) $updatetarget=true;
3186
-
3187
-		$sql = "UPDATE ".MAIN_DB_PREFIX."element_element SET ";
3188
-		if ($updatesource)
3189
-		{
3190
-			$sql.= "fk_source = ".$sourceid;
3191
-			$sql.= ", sourcetype = '".$this->db->escape($sourcetype)."'";
3192
-			$sql.= " WHERE fk_target = ".$this->id;
3193
-			$sql.= " AND targettype = '".$this->db->escape($this->element)."'";
3194
-		}
3195
-		else if ($updatetarget)
3196
-		{
3197
-			$sql.= "fk_target = ".$targetid;
3198
-			$sql.= ", targettype = '".$this->db->escape($targettype)."'";
3199
-			$sql.= " WHERE fk_source = ".$this->id;
3200
-			$sql.= " AND sourcetype = '".$this->db->escape($this->element)."'";
3201
-		}
3202
-
3203
-		dol_syslog(get_class($this)."::updateObjectLinked", LOG_DEBUG);
3204
-		if ($this->db->query($sql))
3205
-		{
3206
-			return 1;
3207
-		}
3208
-		else
3209
-		{
3210
-			$this->error=$this->db->lasterror();
3211
-			return -1;
3212
-		}
3213
-	}
3214
-
3215
-	/**
3216
-	 *	Delete all links between an object $this
3217
-	 *
3218
-	 *	@param	int		$sourceid		Object source id
3219
-	 *	@param  string	$sourcetype		Object source type
3220
-	 *	@param  int		$targetid		Object target id
3221
-	 *	@param  string	$targettype		Object target type
3222
-	 *  @param	int		$rowid			Row id of line to delete. If defined, other parameters are not used.
3223
-	 *	@return     					int	>0 if OK, <0 if KO
3224
-	 *	@see	add_object_linked, updateObjectLinked, fetchObjectLinked
3225
-	 */
3226
-	function deleteObjectLinked($sourceid=null, $sourcetype='', $targetid=null, $targettype='', $rowid='')
3227
-	{
3228
-		$deletesource=false;
3229
-		$deletetarget=false;
3230
-
3231
-		if (! empty($sourceid) && ! empty($sourcetype) && empty($targetid) && empty($targettype)) $deletesource=true;
3232
-		else if (empty($sourceid) && empty($sourcetype) && ! empty($targetid) && ! empty($targettype)) $deletetarget=true;
3233
-
3234
-		$sourceid = (! empty($sourceid) ? $sourceid : $this->id);
3235
-		$sourcetype = (! empty($sourcetype) ? $sourcetype : $this->element);
3236
-		$targetid = (! empty($targetid) ? $targetid : $this->id);
3237
-		$targettype = (! empty($targettype) ? $targettype : $this->element);
3238
-
3239
-		$sql = "DELETE FROM ".MAIN_DB_PREFIX."element_element";
3240
-		$sql.= " WHERE";
3241
-		if ($rowid > 0)
3242
-		{
3243
-			$sql.=" rowid = ".$rowid;
3244
-		}
3245
-		else
3246
-		{
3247
-			if ($deletesource)
3248
-			{
3249
-				$sql.= " fk_source = ".$sourceid." AND sourcetype = '".$this->db->escape($sourcetype)."'";
3250
-				$sql.= " AND fk_target = ".$this->id." AND targettype = '".$this->db->escape($this->element)."'";
3251
-			}
3252
-			else if ($deletetarget)
3253
-			{
3254
-				$sql.= " fk_target = ".$targetid." AND targettype = '".$this->db->escape($targettype)."'";
3255
-				$sql.= " AND fk_source = ".$this->id." AND sourcetype = '".$this->db->escape($this->element)."'";
3256
-			}
3257
-			else
3258
-			{
3259
-				$sql.= " (fk_source = ".$this->id." AND sourcetype = '".$this->db->escape($this->element)."')";
3260
-				$sql.= " OR";
3261
-				$sql.= " (fk_target = ".$this->id." AND targettype = '".$this->db->escape($this->element)."')";
3262
-			}
3263
-		}
3264
-
3265
-		dol_syslog(get_class($this)."::deleteObjectLinked", LOG_DEBUG);
3266
-		if ($this->db->query($sql))
3267
-		{
3268
-			return 1;
3269
-		}
3270
-		else
3271
-		{
3272
-			$this->error=$this->db->lasterror();
3273
-			$this->errors[]=$this->error;
3274
-			return -1;
3275
-		}
3276
-	}
3277
-
3278
-	/**
3279
-	 *      Set status of an object
3280
-	 *
3281
-	 *      @param	int		$status			Status to set
3282
-	 *      @param	int		$elementId		Id of element to force (use this->id by default)
3283
-	 *      @param	string	$elementType	Type of element to force (use this->table_element by default)
3284
-	 *      @param	string	$trigkey		Trigger key to use for trigger
3285
-	 *      @return int						<0 if KO, >0 if OK
3286
-	 */
3287
-	function setStatut($status, $elementId=null, $elementType='', $trigkey='')
3288
-	{
3289
-		global $user,$langs,$conf;
3290
-
3291
-		$savElementId=$elementId;  // To be used later to know if we were using the method using the id of this or not.
3292
-
3293
-		$elementId = (!empty($elementId)?$elementId:$this->id);
3294
-		$elementTable = (!empty($elementType)?$elementType:$this->table_element);
3295
-
3296
-		$this->db->begin();
3297
-
3298
-		$fieldstatus="fk_statut";
3299
-		if ($elementTable == 'facture_rec') $fieldstatus="suspended";
3300
-		if ($elementTable == 'mailing') $fieldstatus="statut";
3301
-		if ($elementTable == 'cronjob') $fieldstatus="status";
3302
-		if ($elementTable == 'user') $fieldstatus="statut";
3303
-		if ($elementTable == 'expensereport') $fieldstatus="fk_statut";
3304
-		if ($elementTable == 'commande_fournisseur_dispatch') $fieldstatus="status";
3305
-
3306
-		$sql = "UPDATE ".MAIN_DB_PREFIX.$elementTable;
3307
-		$sql.= " SET ".$fieldstatus." = ".$status;
3308
-		// If status = 1 = validated, update also fk_user_valid
3309
-		if ($status == 1 && $elementTable == 'expensereport') $sql.=", fk_user_valid = ".$user->id;
3310
-		$sql.= " WHERE rowid=".$elementId;
3311
-
3312
-		dol_syslog(get_class($this)."::setStatut", LOG_DEBUG);
3313
-		if ($this->db->query($sql))
3314
-		{
3315
-			$error = 0;
3316
-
3317
-			// Try autoset of trigkey
3318
-			if (empty($trigkey))
3319
-			{
3320
-				if ($this->element == 'supplier_proposal' && $status == 2) $trigkey='SUPPLIER_PROPOSAL_SIGN';   // 2 = SupplierProposal::STATUS_SIGNED. Can't use constant into this generic class
3321
-				if ($this->element == 'supplier_proposal' && $status == 3) $trigkey='SUPPLIER_PROPOSAL_REFUSE'; // 3 = SupplierProposal::STATUS_REFUSED. Can't use constant into this generic class
3322
-				if ($this->element == 'supplier_proposal' && $status == 4) $trigkey='SUPPLIER_PROPOSAL_CLOSE';  // 4 = SupplierProposal::STATUS_CLOSED. Can't use constant into this generic class
3323
-				if ($this->element == 'fichinter' && $status == 3) $trigkey='FICHINTER_CLASSIFY_DONE';
3324
-				if ($this->element == 'fichinter' && $status == 2) $trigkey='FICHINTER_CLASSIFY_BILLED';
3325
-				if ($this->element == 'fichinter' && $status == 1) $trigkey='FICHINTER_CLASSIFY_UNBILLED';
3326
-			}
3327
-
3328
-			if ($trigkey)
3329
-			{
3330
-				// Appel des triggers
3331
-				include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php';
3332
-				$interface=new Interfaces($this->db);
3333
-				$result=$interface->run_triggers($trigkey,$this,$user,$langs,$conf);
3334
-				if ($result < 0) {
3335
-					$error++; $this->errors=$interface->errors;
3336
-				}
3337
-				// Fin appel triggers
3338
-			}
967
+        $sql = "DELETE FROM ".MAIN_DB_PREFIX."element_contact";
968
+        $sql.= " WHERE element_id = ".$this->id;
969
+        if ($listId)
970
+            $sql.= " AND fk_c_type_contact IN (".$listId.")";
3339 971
 
3340
-			if (! $error)
3341
-			{
3342
-				$this->db->commit();
972
+        dol_syslog(get_class($this)."::delete_linked_contact", LOG_DEBUG);
973
+        if ($this->db->query($sql))
974
+        {
975
+            return 1;
976
+        }
977
+        else
978
+        {
979
+            $this->error=$this->db->lasterror();
980
+            return -1;
981
+        }
982
+    }
3343 983
 
3344
-				if (empty($savElementId))    // If the element we update was $this (so $elementId is null)
3345
-				{
3346
-					$this->statut = $status;
3347
-					$this->status = $status;
3348
-				}
984
+    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
985
+    /**
986
+     *    Get array of all contacts for an object
987
+     *
988
+     *    @param	int			$statut		Status of links to get (-1=all)
989
+     *    @param	string		$source		Source of contact: external or thirdparty (llx_socpeople) or internal (llx_user)
990
+     *    @param	int         $list       0:Return array contains all properties, 1:Return array contains just id
991
+     *    @param    string      $code       Filter on this code of contact type ('SHIPPING', 'BILLING', ...)
992
+     *    @return	array|int		        Array of contacts, -1 if error
993
+     */
994
+    function liste_contact($statut=-1,$source='external',$list=0,$code='')
995
+    {
996
+        // phpcs:enable
997
+        global $langs;
998
+
999
+        $tab=array();
1000
+
1001
+        $sql = "SELECT ec.rowid, ec.statut as statuslink, ec.fk_socpeople as id, ec.fk_c_type_contact";    // This field contains id of llx_socpeople or id of llx_user
1002
+        if ($source == 'internal') $sql.=", '-1' as socid, t.statut as statuscontact, t.login, t.photo";
1003
+        if ($source == 'external' || $source == 'thirdparty') $sql.=", t.fk_soc as socid, t.statut as statuscontact";
1004
+        $sql.= ", t.civility as civility, t.lastname as lastname, t.firstname, t.email";
1005
+        $sql.= ", tc.source, tc.element, tc.code, tc.libelle";
1006
+        $sql.= " FROM ".MAIN_DB_PREFIX."c_type_contact tc";
1007
+        $sql.= ", ".MAIN_DB_PREFIX."element_contact ec";
1008
+        if ($source == 'internal') $sql.=" LEFT JOIN ".MAIN_DB_PREFIX."user t on ec.fk_socpeople = t.rowid";
1009
+        if ($source == 'external'|| $source == 'thirdparty') $sql.=" LEFT JOIN ".MAIN_DB_PREFIX."socpeople t on ec.fk_socpeople = t.rowid";
1010
+        $sql.= " WHERE ec.element_id =".$this->id;
1011
+        $sql.= " AND ec.fk_c_type_contact=tc.rowid";
1012
+        $sql.= " AND tc.element='".$this->db->escape($this->element)."'";
1013
+        if ($code) $sql.= " AND tc.code = '".$this->db->escape($code)."'";
1014
+        if ($source == 'internal') $sql.= " AND tc.source = 'internal'";
1015
+        if ($source == 'external' || $source == 'thirdparty') $sql.= " AND tc.source = 'external'";
1016
+        $sql.= " AND tc.active=1";
1017
+        if ($statut >= 0) $sql.= " AND ec.statut = '".$statut."'";
1018
+        $sql.=" ORDER BY t.lastname ASC";
1019
+
1020
+        dol_syslog(get_class($this)."::liste_contact", LOG_DEBUG);
1021
+        $resql=$this->db->query($sql);
1022
+        if ($resql)
1023
+        {
1024
+            $num=$this->db->num_rows($resql);
1025
+            $i=0;
1026
+            while ($i < $num)
1027
+            {
1028
+                $obj = $this->db->fetch_object($resql);
1029
+
1030
+                if (! $list)
1031
+                {
1032
+                    $transkey="TypeContact_".$obj->element."_".$obj->source."_".$obj->code;
1033
+                    $libelle_type=($langs->trans($transkey)!=$transkey ? $langs->trans($transkey) : $obj->libelle);
1034
+                    $tab[$i]=array('source'=>$obj->source,'socid'=>$obj->socid,'id'=>$obj->id,
1035
+                                    'nom'=>$obj->lastname,      // For backward compatibility
1036
+                                    'civility'=>$obj->civility, 'lastname'=>$obj->lastname, 'firstname'=>$obj->firstname, 'email'=>$obj->email, 'login'=>$obj->login, 'photo'=>$obj->photo, 'statuscontact'=>$obj->statuscontact,
1037
+                                    'rowid'=>$obj->rowid, 'code'=>$obj->code, 'libelle'=>$libelle_type, 'status'=>$obj->statuslink, 'fk_c_type_contact'=>$obj->fk_c_type_contact);
1038
+                }
1039
+                else
1040
+                {
1041
+                    $tab[$i]=$obj->id;
1042
+                }
1043
+
1044
+                $i++;
1045
+            }
3349 1046
 
3350
-				return 1;
3351
-			}
3352
-			else
3353
-			{
3354
-				$this->db->rollback();
3355
-				dol_syslog(get_class($this)."::setStatus ".$this->error,LOG_ERR);
3356
-				return -1;
3357
-			}
3358
-		}
3359
-		else
3360
-		{
3361
-			$this->error=$this->db->lasterror();
3362
-			$this->db->rollback();
3363
-			return -1;
3364
-		}
3365
-	}
3366
-
3367
-
3368
-	/**
3369
-	 *  Load type of canvas of an object if it exists
3370
-	 *
3371
-	 *  @param      int		$id     Record id
3372
-	 *  @param      string	$ref    Record ref
3373
-	 *  @return		int				<0 if KO, 0 if nothing done, >0 if OK
3374
-	 */
3375
-	function getCanvas($id=0,$ref='')
3376
-	{
3377
-		global $conf;
3378
-
3379
-		if (empty($id) && empty($ref)) return 0;
3380
-		if (! empty($conf->global->MAIN_DISABLE_CANVAS)) return 0;    // To increase speed. Not enabled by default.
3381
-
3382
-		// Clean parameters
3383
-		$ref = trim($ref);
3384
-
3385
-		$sql = "SELECT rowid, canvas";
3386
-		$sql.= " FROM ".MAIN_DB_PREFIX.$this->table_element;
3387
-		$sql.= " WHERE entity IN (".getEntity($this->element).")";
3388
-		if (! empty($id))  $sql.= " AND rowid = ".$id;
3389
-		if (! empty($ref)) $sql.= " AND ref = '".$this->db->escape($ref)."'";
3390
-
3391
-		$resql = $this->db->query($sql);
3392
-		if ($resql)
3393
-		{
3394
-			$obj = $this->db->fetch_object($resql);
3395
-			if ($obj)
3396
-			{
3397
-				$this->canvas   = $obj->canvas;
3398
-				return 1;
3399
-			}
3400
-			else return 0;
3401
-		}
3402
-		else
3403
-		{
3404
-			dol_print_error($this->db);
3405
-			return -1;
3406
-		}
3407
-	}
3408
-
3409
-
3410
-	/**
3411
-	 * 	Get special code of a line
3412
-	 *
3413
-	 * 	@param	int		$lineid		Id of line
3414
-	 * 	@return	int					Special code
3415
-	 */
3416
-	function getSpecialCode($lineid)
3417
-	{
3418
-		$sql = 'SELECT special_code FROM '.MAIN_DB_PREFIX.$this->table_element_line;
3419
-		$sql.= ' WHERE rowid = '.$lineid;
3420
-		$resql = $this->db->query($sql);
3421
-		if ($resql)
3422
-		{
3423
-			$row = $this->db->fetch_row($resql);
3424
-			return $row[0];
3425
-		}
3426
-	}
3427
-
3428
-	/**
3429
-	 *  Function to check if an object is used by others.
3430
-	 *  Check is done into this->childtables. There is no check into llx_element_element.
3431
-	 *
3432
-	 *  @param	int		$id			Force id of object
3433
-	 *  @return	int					<0 if KO, 0 if not used, >0 if already used
3434
-	 */
3435
-	function isObjectUsed($id=0)
3436
-	{
3437
-		global $langs;
3438
-
3439
-		if (empty($id)) $id=$this->id;
3440
-
3441
-		// Check parameters
3442
-		if (! isset($this->childtables) || ! is_array($this->childtables) || count($this->childtables) == 0)
3443
-		{
3444
-			dol_print_error('Called isObjectUsed on a class with property this->childtables not defined');
3445
-			return -1;
3446
-		}
3447
-
3448
-		$arraytoscan = $this->childtables;
3449
-		// For backward compatibility, we check if array is old format array('table1', 'table2', ...)
3450
-		$tmparray=array_keys($this->childtables);
3451
-		if (is_numeric($tmparray[0]))
3452
-		{
3453
-			$arraytoscan = array_flip($this->childtables);
3454
-		}
3455
-
3456
-		// Test if child exists
3457
-		$haschild=0;
3458
-		foreach($arraytoscan as $table => $elementname)
3459
-		{
3460
-			//print $id.'-'.$table.'-'.$elementname.'<br>';
3461
-			// Check if third party can be deleted
3462
-			$sql = "SELECT COUNT(*) as nb from ".MAIN_DB_PREFIX.$table;
3463
-			$sql.= " WHERE ".$this->fk_element." = ".$id;
3464
-			$resql=$this->db->query($sql);
3465
-			if ($resql)
3466
-			{
3467
-				$obj=$this->db->fetch_object($resql);
3468
-				if ($obj->nb > 0)
3469
-				{
3470
-					$langs->load("errors");
3471
-					//print 'Found into table '.$table.', type '.$langs->transnoentitiesnoconv($elementname).', haschild='.$haschild;
3472
-					$haschild += $obj->nb;
3473
-					if (is_numeric($elementname))	// old usage
3474
-					{
3475
-						$this->errors[]=$langs->trans("ErrorRecordHasAtLeastOneChildOfType", $table);
3476
-					}
3477
-					else	// new usage: $elementname=Translation key
3478
-					{
3479
-						$this->errors[]=$langs->trans("ErrorRecordHasAtLeastOneChildOfType", $langs->transnoentitiesnoconv($elementname));
3480
-					}
3481
-					break;    // We found at least one, we stop here
3482
-				}
3483
-			}
3484
-			else
3485
-			{
3486
-				$this->errors[]=$this->db->lasterror();
3487
-				return -1;
3488
-			}
3489
-		}
3490
-		if ($haschild > 0)
3491
-		{
3492
-			$this->errors[]="ErrorRecordHasChildren";
3493
-			return $haschild;
3494
-		}
3495
-		else return 0;
3496
-	}
3497
-
3498
-	/**
3499
-	 *  Function to say how many lines object contains
3500
-	 *
3501
-	 *	@param	int		$predefined		-1=All, 0=Count free product/service only, 1=Count predefined product/service only, 2=Count predefined product, 3=Count predefined service
3502
-	 *  @return	int						<0 if KO, 0 if no predefined products, nb of lines with predefined products if found
3503
-	 */
3504
-	function hasProductsOrServices($predefined=-1)
3505
-	{
3506
-		$nb=0;
3507
-
3508
-		foreach($this->lines as $key => $val)
3509
-		{
3510
-			$qualified=0;
3511
-			if ($predefined == -1) $qualified=1;
3512
-			if ($predefined == 1 && $val->fk_product > 0) $qualified=1;
3513
-			if ($predefined == 0 && $val->fk_product <= 0) $qualified=1;
3514
-			if ($predefined == 2 && $val->fk_product > 0 && $val->product_type==0) $qualified=1;
3515
-			if ($predefined == 3 && $val->fk_product > 0 && $val->product_type==1) $qualified=1;
3516
-			if ($qualified) $nb++;
3517
-		}
3518
-		dol_syslog(get_class($this).'::hasProductsOrServices we found '.$nb.' qualified lines of products/servcies');
3519
-		return $nb;
3520
-	}
3521
-
3522
-	/**
3523
-	 * Function that returns the total amount HT of discounts applied for all lines.
3524
-	 *
3525
-	 * @return 	float
3526
-	 */
3527
-	function getTotalDiscount()
3528
-	{
3529
-		$total_discount=0.00;
3530
-
3531
-		$sql = "SELECT subprice as pu_ht, qty, remise_percent, total_ht";
3532
-		$sql.= " FROM ".MAIN_DB_PREFIX.$this->table_element."det";
3533
-		$sql.= " WHERE ".$this->fk_element." = ".$this->id;
3534
-
3535
-		dol_syslog(get_class($this).'::getTotalDiscount', LOG_DEBUG);
3536
-		$resql = $this->db->query($sql);
3537
-		if ($resql)
3538
-		{
3539
-			$num=$this->db->num_rows($resql);
3540
-			$i=0;
3541
-			while ($i < $num)
3542
-			{
3543
-				$obj = $this->db->fetch_object($resql);
3544
-
3545
-				$pu_ht = $obj->pu_ht;
3546
-				$qty= $obj->qty;
3547
-				$total_ht = $obj->total_ht;
3548
-
3549
-				$total_discount_line = floatval(price2num(($pu_ht * $qty) - $total_ht, 'MT'));
3550
-				$total_discount += $total_discount_line;
3551
-
3552
-				$i++;
3553
-			}
3554
-		}
3555
-
3556
-		//print $total_discount; exit;
3557
-		return price2num($total_discount);
3558
-	}
3559
-
3560
-
3561
-	/**
3562
-	 * Return into unit=0, the calculated total of weight and volume of all lines * qty
3563
-	 * Calculate by adding weight and volume of each product line, so properties ->volume/volume_units/weight/weight_units must be loaded on line.
3564
-	 *
3565
-	 * @return  array                           array('weight'=>...,'volume'=>...)
3566
-	 */
3567
-	function getTotalWeightVolume()
3568
-	{
3569
-		$totalWeight = 0;
3570
-		$totalVolume = 0;
3571
-		// defined for shipment only
3572
-		$totalOrdered = '';
3573
-		// defined for shipment only
3574
-		$totalToShip = '';
3575
-
3576
-		foreach ($this->lines as $line)
3577
-		{
3578
-			if (isset($line->qty_asked))
3579
-			{
3580
-				if (empty($totalOrdered)) $totalOrdered=0;  // Avoid warning because $totalOrdered is ''
3581
-				$totalOrdered+=$line->qty_asked;    // defined for shipment only
3582
-			}
3583
-			if (isset($line->qty_shipped))
3584
-			{
3585
-				if (empty($totalToShip)) $totalToShip=0;    // Avoid warning because $totalToShip is ''
3586
-				$totalToShip+=$line->qty_shipped;   // defined for shipment only
3587
-            }else if ($line->element == 'commandefournisseurdispatch' && isset($line->qty))
1047
+            return $tab;
1048
+        }
1049
+        else
1050
+        {
1051
+            $this->error=$this->db->lasterror();
1052
+            dol_print_error($this->db);
1053
+            return -1;
1054
+        }
1055
+    }
1056
+
1057
+
1058
+    /**
1059
+     * 		Update status of a contact linked to object
1060
+     *
1061
+     * 		@param	int		$rowid		Id of link between object and contact
1062
+     * 		@return	int					<0 if KO, >=0 if OK
1063
+     */
1064
+    function swapContactStatus($rowid)
1065
+    {
1066
+        $sql = "SELECT ec.datecreate, ec.statut, ec.fk_socpeople, ec.fk_c_type_contact,";
1067
+        $sql.= " tc.code, tc.libelle";
1068
+        //$sql.= ", s.fk_soc";
1069
+        $sql.= " FROM (".MAIN_DB_PREFIX."element_contact as ec, ".MAIN_DB_PREFIX."c_type_contact as tc)";
1070
+        //$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."socpeople as s ON ec.fk_socpeople=s.rowid";	// Si contact de type external, alors il est lie a une societe
1071
+        $sql.= " WHERE ec.rowid =".$rowid;
1072
+        $sql.= " AND ec.fk_c_type_contact=tc.rowid";
1073
+        $sql.= " AND tc.element = '".$this->db->escape($this->element)."'";
1074
+
1075
+        dol_syslog(get_class($this)."::swapContactStatus", LOG_DEBUG);
1076
+        $resql=$this->db->query($sql);
1077
+        if ($resql)
1078
+        {
1079
+            $obj = $this->db->fetch_object($resql);
1080
+            $newstatut = ($obj->statut == 4) ? 5 : 4;
1081
+            $result = $this->update_contact($rowid, $newstatut);
1082
+            $this->db->free($resql);
1083
+            return $result;
1084
+        }
1085
+        else
1086
+        {
1087
+            $this->error=$this->db->error();
1088
+            dol_print_error($this->db);
1089
+            return -1;
1090
+        }
1091
+    }
1092
+
1093
+    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
1094
+    /**
1095
+     *      Return array with list of possible values for type of contacts
1096
+     *
1097
+     *      @param	string	$source     'internal', 'external' or 'all'
1098
+     *      @param	string	$order		Sort order by : 'position', 'code', 'rowid'...
1099
+     *      @param  int		$option     0=Return array id->label, 1=Return array code->label
1100
+     *      @param  int		$activeonly 0=all status of contact, 1=only the active
1101
+     *		@param	string	$code		Type of contact (Example: 'CUSTOMER', 'SERVICE')
1102
+     *      @return array       		Array list of type of contacts (id->label if option=0, code->label if option=1)
1103
+     */
1104
+    function liste_type_contact($source='internal', $order='position', $option=0, $activeonly=0, $code='')
1105
+    {
1106
+        // phpcs:enable
1107
+        global $langs;
1108
+
1109
+        if (empty($order)) $order='position';
1110
+        if ($order == 'position') $order.=',code';
1111
+
1112
+        $tab = array();
1113
+        $sql = "SELECT DISTINCT tc.rowid, tc.code, tc.libelle, tc.position";
1114
+        $sql.= " FROM ".MAIN_DB_PREFIX."c_type_contact as tc";
1115
+        $sql.= " WHERE tc.element='".$this->db->escape($this->element)."'";
1116
+        if ($activeonly == 1) $sql.= " AND tc.active=1"; // only the active types
1117
+        if (! empty($source) && $source != 'all') $sql.= " AND tc.source='".$this->db->escape($source)."'";
1118
+        if (! empty($code)) $sql.= " AND tc.code='".$this->db->escape($code)."'";
1119
+        $sql.= $this->db->order($order,'ASC');
1120
+
1121
+        //print "sql=".$sql;
1122
+        $resql=$this->db->query($sql);
1123
+        if ($resql)
1124
+        {
1125
+            $num=$this->db->num_rows($resql);
1126
+            $i=0;
1127
+            while ($i < $num)
3588 1128
             {
3589
-                if (empty($totalToShip)) $totalToShip=0;
3590
-                $totalToShip+=$line->qty;   // defined for reception only
3591
-			}
3592
-
3593
-			// Define qty, weight, volume, weight_units, volume_units
3594
-			if ($this->element == 'shipping') {
3595
-				// for shipments
3596
-				$qty = $line->qty_shipped ? $line->qty_shipped : 0;
3597
-			}
3598
-			else {
3599
-				$qty = $line->qty ? $line->qty : 0;
3600
-			}
3601
-
3602
-			$weight = $line->weight ? $line->weight : 0;
3603
-            ($weight==0 && !empty($line->product->weight))? $weight=$line->product->weight: 0;
3604
-			$volume = $line->volume ? $line->volume : 0;
3605
-			($volume==0 && !empty($line->product->volume))? $volume=$line->product->volume: 0;
1129
+                $obj = $this->db->fetch_object($resql);
3606 1130
 
3607
-			$weight_units=$line->weight_units;
3608
-			($weight_units==0 && !empty($line->product->weight_units))? $weight_units=$line->product->weight_units: 0;
3609
-			$volume_units=$line->volume_units;
3610
-			($volume_units==0 && !empty($line->product->volume_units))? $volume_units=$line->product->volume_units: 0;
1131
+                $transkey="TypeContact_".$this->element."_".$source."_".$obj->code;
1132
+                $libelle_type=($langs->trans($transkey)!=$transkey ? $langs->trans($transkey) : $obj->libelle);
1133
+                if (empty($option)) $tab[$obj->rowid]=$libelle_type;
1134
+                else $tab[$obj->code]=$libelle_type;
1135
+                $i++;
1136
+            }
1137
+            return $tab;
1138
+        }
1139
+        else
1140
+        {
1141
+            $this->error=$this->db->lasterror();
1142
+            //dol_print_error($this->db);
1143
+            return null;
1144
+        }
1145
+    }
3611 1146
 
3612
-			$weightUnit=0;
3613
-			$volumeUnit=0;
3614
-			if (! empty($weight_units)) $weightUnit = $weight_units;
3615
-			if (! empty($volume_units)) $volumeUnit = $volume_units;
1147
+    /**
1148
+     *      Return id of contacts for a source and a contact code.
1149
+     *      Example: contact client de facturation ('external', 'BILLING')
1150
+     *      Example: contact client de livraison ('external', 'SHIPPING')
1151
+     *      Example: contact interne suivi paiement ('internal', 'SALESREPFOLL')
1152
+     *
1153
+     *		@param	string	$source		'external' or 'internal'
1154
+     *		@param	string	$code		'BILLING', 'SHIPPING', 'SALESREPFOLL', ...
1155
+     *		@param	int		$status		limited to a certain status
1156
+     *      @return array       		List of id for such contacts
1157
+     */
1158
+    function getIdContact($source,$code,$status=0)
1159
+    {
1160
+        global $conf;
3616 1161
 
3617
-			if (empty($totalWeight)) $totalWeight=0;  // Avoid warning because $totalWeight is ''
3618
-			if (empty($totalVolume)) $totalVolume=0;  // Avoid warning because $totalVolume is ''
1162
+        $result=array();
1163
+        $i=0;
1164
+        //cas particulier pour les expeditions
1165
+        if($this->element=='shipping' && $this->origin_id != 0) {
1166
+            $id=$this->origin_id;
1167
+            $element='commande';
1168
+        } else if($this->element=='reception' && $this->origin_id != 0) {
1169
+            $id=$this->origin_id;
1170
+            $element='order_supplier';
1171
+        } else {
1172
+            $id=$this->id;
1173
+            $element=$this->element;
1174
+        }
3619 1175
 
3620
-			//var_dump($line->volume_units);
3621
-			if ($weight_units < 50)   // >50 means a standard unit (power of 10 of official unit), > 50 means an exotic unit (like inch)
3622
-			{
3623
-				$trueWeightUnit=pow(10, $weightUnit);
3624
-				$totalWeight += $weight * $qty * $trueWeightUnit;
3625
-			}
3626
-			else {
3627
-		if ($weight_units == 99) {
3628
-			// conversion 1 Pound = 0.45359237 KG
3629
-			$trueWeightUnit = 0.45359237;
3630
-			$totalWeight += $weight * $qty * $trueWeightUnit;
3631
-		} elseif ($weight_units == 98) {
3632
-			// conversion 1 Ounce = 0.0283495 KG
3633
-			$trueWeightUnit = 0.0283495;
3634
-			$totalWeight += $weight * $qty * $trueWeightUnit;
3635
-		}
3636
-		else
3637
-					$totalWeight += $weight * $qty;   // This may be wrong if we mix different units
3638
-			}
3639
-			if ($volume_units < 50)   // >50 means a standard unit (power of 10 of official unit), > 50 means an exotic unit (like inch)
3640
-			{
3641
-				//print $line->volume."x".$line->volume_units."x".($line->volume_units < 50)."x".$volumeUnit;
3642
-				$trueVolumeUnit=pow(10, $volumeUnit);
3643
-				//print $line->volume;
3644
-				$totalVolume += $volume * $qty * $trueVolumeUnit;
3645
-			}
3646
-			else
3647
-			{
3648
-				$totalVolume += $volume * $qty;   // This may be wrong if we mix different units
3649
-			}
3650
-		}
3651
-
3652
-		return array('weight'=>$totalWeight, 'volume'=>$totalVolume, 'ordered'=>$totalOrdered, 'toship'=>$totalToShip);
3653
-	}
3654
-
3655
-
3656
-	/**
3657
-	 *	Set extra parameters
3658
-	 *
3659
-	 *	@return	int      <0 if KO, >0 if OK
3660
-	 */
3661
-	function setExtraParameters()
3662
-	{
3663
-		$this->db->begin();
3664
-
3665
-		$extraparams = (! empty($this->extraparams) ? json_encode($this->extraparams) : null);
3666
-
3667
-		$sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
3668
-		$sql.= " SET extraparams = ".(! empty($extraparams) ? "'".$this->db->escape($extraparams)."'" : "null");
3669
-		$sql.= " WHERE rowid = ".$this->id;
3670
-
3671
-		dol_syslog(get_class($this)."::setExtraParameters", LOG_DEBUG);
3672
-		$resql = $this->db->query($sql);
3673
-		if (! $resql)
3674
-		{
3675
-			$this->error=$this->db->lasterror();
3676
-			$this->db->rollback();
3677
-			return -1;
3678
-		}
3679
-		else
3680
-		{
3681
-			$this->db->commit();
3682
-			return 1;
3683
-		}
3684
-	}
1176
+        $sql = "SELECT ec.fk_socpeople";
1177
+        $sql.= " FROM ".MAIN_DB_PREFIX."element_contact as ec,";
1178
+        if ($source == 'internal') $sql.= " ".MAIN_DB_PREFIX."user as c,";
1179
+        if ($source == 'external') $sql.= " ".MAIN_DB_PREFIX."socpeople as c,";
1180
+        $sql.= " ".MAIN_DB_PREFIX."c_type_contact as tc";
1181
+        $sql.= " WHERE ec.element_id = ".$id;
1182
+        $sql.= " AND ec.fk_socpeople = c.rowid";
1183
+        if ($source == 'internal') $sql.= " AND c.entity IN (".getEntity('user').")";
1184
+        if ($source == 'external') $sql.= " AND c.entity IN (".getEntity('societe').")";
1185
+        $sql.= " AND ec.fk_c_type_contact = tc.rowid";
1186
+        $sql.= " AND tc.element = '".$element."'";
1187
+        $sql.= " AND tc.source = '".$source."'";
1188
+        $sql.= " AND tc.code = '".$code."'";
1189
+        $sql.= " AND tc.active = 1";
1190
+        if ($status) $sql.= " AND ec.statut = ".$status;
1191
+
1192
+        dol_syslog(get_class($this)."::getIdContact", LOG_DEBUG);
1193
+        $resql=$this->db->query($sql);
1194
+        if ($resql)
1195
+        {
1196
+            while ($obj = $this->db->fetch_object($resql))
1197
+            {
1198
+                $result[$i]=$obj->fk_socpeople;
1199
+                $i++;
1200
+            }
1201
+        }
1202
+        else
1203
+        {
1204
+            $this->error=$this->db->error();
1205
+            return null;
1206
+        }
3685 1207
 
1208
+        return $result;
1209
+    }
3686 1210
 
3687 1211
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
3688
-	/**
3689
-	 *    Return incoterms informations
3690
-	 *    TODO Use a cache for label get
3691
-	 *
3692
-	 *    @return	string	incoterms info
3693
-	 */
3694
-	function display_incoterms()
3695
-	{
1212
+    /**
1213
+     *		Load object contact with id=$this->contactid into $this->contact
1214
+     *
1215
+     *		@param	int		$contactid      Id du contact. Use this->contactid if empty.
1216
+     *		@return	int						<0 if KO, >0 if OK
1217
+     */
1218
+    function fetch_contact($contactid=null)
1219
+    {
3696 1220
         // phpcs:enable
3697
-		$out = '';
3698
-		$this->libelle_incoterms = '';
3699
-		if (!empty($this->fk_incoterms))
3700
-		{
3701
-			$sql = 'SELECT code FROM '.MAIN_DB_PREFIX.'c_incoterms WHERE rowid = '.(int) $this->fk_incoterms;
3702
-			$result = $this->db->query($sql);
3703
-			if ($result)
3704
-			{
3705
-				$res = $this->db->fetch_object($result);
3706
-				$out .= $res->code;
3707
-			}
3708
-		}
3709
-
3710
-		$out .= (($res->code && $this->location_incoterms)?' - ':'').$this->location_incoterms;
3711
-
3712
-		return $out;
3713
-	}
3714
-
3715
-	/**
3716
-	 *    Return incoterms informations for pdf display
3717
-	 *
3718
-	 *    @return	string		incoterms info
3719
-	 */
3720
-	function getIncotermsForPDF()
3721
-	{
3722
-		$sql = 'SELECT code FROM '.MAIN_DB_PREFIX.'c_incoterms WHERE rowid = '.(int) $this->fk_incoterms;
3723
-		$resql = $this->db->query($sql);
3724
-		if ($resql)
3725
-		{
3726
-			$num = $this->db->num_rows($resql);
3727
-			if ($num > 0)
3728
-			{
3729
-				$res = $this->db->fetch_object($resql);
3730
-				return 'Incoterm : '.$res->code.' - '.$this->location_incoterms;
3731
-			}
3732
-			else
3733
-			{
3734
-				return '';
3735
-			}
3736
-		}
3737
-		else
3738
-		{
3739
-			$this->errors[] = $this->db->lasterror();
3740
-			return false;
3741
-		}
3742
-	}
3743
-
3744
-	/**
3745
-	 *    Define incoterms values of current object
3746
-	 *
3747
-	 *    @param	int		$id_incoterm     Id of incoterm to set or '' to remove
3748
-	 * 	  @param 	string  $location		 location of incoterm
3749
-	 *    @return	int     		<0 if KO, >0 if OK
3750
-	 */
3751
-	function setIncoterms($id_incoterm, $location)
3752
-	{
3753
-		if ($this->id && $this->table_element)
3754
-		{
3755
-			$sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
3756
-			$sql.= " SET fk_incoterms = ".($id_incoterm > 0 ? $id_incoterm : "null");
3757
-			$sql.= ", location_incoterms = ".($id_incoterm > 0 ? "'".$this->db->escape($location)."'" : "null");
3758
-			$sql.= " WHERE rowid = " . $this->id;
3759
-			dol_syslog(get_class($this).'::setIncoterms', LOG_DEBUG);
3760
-			$resql=$this->db->query($sql);
3761
-			if ($resql)
3762
-			{
3763
-				$this->fk_incoterms = $id_incoterm;
3764
-				$this->location_incoterms = $location;
1221
+        if (empty($contactid)) $contactid=$this->contactid;
3765 1222
 
3766
-				$sql = 'SELECT libelle FROM '.MAIN_DB_PREFIX.'c_incoterms WHERE rowid = '.(int) $this->fk_incoterms;
3767
-				$res = $this->db->query($sql);
3768
-				if ($res)
3769
-				{
3770
-					$obj = $this->db->fetch_object($res);
3771
-					$this->libelle_incoterms = $obj->libelle;
3772
-				}
3773
-				return 1;
3774
-			}
3775
-			else
3776
-			{
3777
-				$this->errors[] = $this->db->lasterror();
3778
-				return -1;
3779
-			}
3780
-		}
3781
-		else return -1;
3782
-	}
3783
-
3784
-
3785
-	// --------------------
3786
-	// TODO: All functions here must be redesigned and moved as they are not business functions but output functions
3787
-	// --------------------
3788
-
3789
-	/* This is to show add lines */
3790
-
3791
-	/**
3792
-	 *	Show add free and predefined products/services form
3793
-	 *
3794
-	 *  @param	int		        $dateSelector       1=Show also date range input fields
3795
-	 *  @param	Societe			$seller				Object thirdparty who sell
3796
-	 *  @param	Societe			$buyer				Object thirdparty who buy
3797
-	 *	@return	void
3798
-	 */
3799
-	function formAddObjectLine($dateSelector, $seller, $buyer)
3800
-	{
3801
-		global $conf,$user,$langs,$object,$hookmanager;
3802
-		global $form,$bcnd,$var;
3803
-
3804
-		// Line extrafield
3805
-		require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
3806
-		$extrafieldsline = new ExtraFields($this->db);
3807
-		$extralabelslines=$extrafieldsline->fetch_name_optionals_label($this->table_element_line);
3808
-
3809
-		// Output template part (modules that overwrite templates must declare this into descriptor)
3810
-		// Use global variables + $dateSelector + $seller and $buyer
3811
-		$dirtpls=array_merge($conf->modules_parts['tpl'],array('/core/tpl'));
3812
-		foreach($dirtpls as $reldir)
3813
-		{
3814
-			$tpl = dol_buildpath($reldir.'/objectline_create.tpl.php');
3815
-			if (empty($conf->file->strict_mode)) {
3816
-				$res=@include $tpl;
3817
-			} else {
3818
-				$res=include $tpl; // for debug
3819
-			}
3820
-			if ($res) break;
3821
-		}
3822
-	}
3823
-
3824
-
3825
-
3826
-	/* This is to show array of line of details */
3827
-
3828
-
3829
-	/**
3830
-	 *	Return HTML table for object lines
3831
-	 *	TODO Move this into an output class file (htmlline.class.php)
3832
-	 *	If lines are into a template, title must also be into a template
3833
-	 *	But for the moment we don't know if it's possible as we keep a method available on overloaded objects.
3834
-	 *
3835
-	 *	@param	string		$action				Action code
3836
-	 *	@param  string		$seller            	Object of seller third party
3837
-	 *	@param  string  	$buyer             	Object of buyer third party
3838
-	 *	@param	int			$selected		   	Object line selected
3839
-	 *	@param  int	    	$dateSelector      	1=Show also date range input fields
3840
-	 *	@return	void
3841
-	 */
3842
-	function printObjectLines($action, $seller, $buyer, $selected=0, $dateSelector=0)
3843
-	{
3844
-		global $conf, $hookmanager, $langs, $user;
3845
-		// TODO We should not use global var for this !
3846
-		global $inputalsopricewithtax, $usemargins, $disableedit, $disablemove, $disableremove, $outputalsopricetotalwithtax;
3847
-
3848
-		// Define usemargins
3849
-		$usemargins=0;
3850
-		if (! empty($conf->margin->enabled) && ! empty($this->element) && in_array($this->element,array('facture','propal','commande'))) $usemargins=1;
3851
-
3852
-		$num = count($this->lines);
3853
-
3854
-		// Line extrafield
3855
-		require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
3856
-		$extrafieldsline = new ExtraFields($this->db);
3857
-		$extralabelslines=$extrafieldsline->fetch_name_optionals_label($this->table_element_line);
3858
-
3859
-		$parameters = array('num'=>$num,'i'=>$i,'dateSelector'=>$dateSelector,'seller'=>$seller,'buyer'=>$buyer,'selected'=>$selected, 'extrafieldsline'=>$extrafieldsline);
3860
-		$reshook = $hookmanager->executeHooks('printObjectLineTitle', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
3861
-		if (empty($reshook))
3862
-		{
3863
-			// Title line
3864
-		    print "<thead>\n";
3865
-
3866
-			print '<tr class="liste_titre nodrag nodrop">';
3867
-
3868
-			// Adds a line numbering column
3869
-			if (! empty($conf->global->MAIN_VIEW_LINE_NUMBER)) print '<td class="linecolnum" align="center" width="5">&nbsp;</td>';
3870
-
3871
-			// Description
3872
-			print '<td class="linecoldescription">'.$langs->trans('Description').'</td>';
3873
-
3874
-			if ($this->element == 'supplier_proposal' || $this->element == 'order_supplier' || $this->element == 'invoice_supplier')
3875
-			{
3876
-				print '<td class="linerefsupplier"><span id="title_fourn_ref">'.$langs->trans("SupplierRef").'</span></td>';
3877
-			}
1223
+        if (empty($contactid)) return 0;
3878 1224
 
3879
-			// VAT
3880
-			print '<td class="linecolvat" align="right" width="80">'.$langs->trans('VAT').'</td>';
1225
+        require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php';
1226
+        $contact = new Contact($this->db);
1227
+        $result=$contact->fetch($contactid);
1228
+        $this->contact = $contact;
1229
+        return $result;
1230
+    }
3881 1231
 
3882
-			// Price HT
3883
-			print '<td class="linecoluht" align="right" width="80">'.$langs->trans('PriceUHT').'</td>';
1232
+    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
1233
+    /**
1234
+     *    	Load the third party of object, from id $this->socid or $this->fk_soc, into this->thirdparty
1235
+     *
1236
+     *		@param		int		$force_thirdparty_id	Force thirdparty id
1237
+     *		@return		int								<0 if KO, >0 if OK
1238
+     */
1239
+    function fetch_thirdparty($force_thirdparty_id=0)
1240
+    {
1241
+        // phpcs:enable
1242
+        global $conf;
3884 1243
 
3885
-			// Multicurrency
3886
-			if (!empty($conf->multicurrency->enabled) && $this->multicurrency_code != $conf->currency) print '<td class="linecoluht_currency" align="right" width="80">'.$langs->trans('PriceUHTCurrency', $this->multicurrency_code).'</td>';
1244
+        if (empty($this->socid) && empty($this->fk_soc) && empty($this->fk_thirdparty) && empty($force_thirdparty_id))
1245
+            return 0;
3887 1246
 
3888
-			if ($inputalsopricewithtax) print '<td align="right" width="80">'.$langs->trans('PriceUTTC').'</td>';
1247
+        require_once DOL_DOCUMENT_ROOT . '/societe/class/societe.class.php';
3889 1248
 
3890
-			// Qty
3891
-			print '<td class="linecolqty" align="right">'.$langs->trans('Qty').'</td>';
1249
+        $idtofetch = isset($this->socid) ? $this->socid : (isset($this->fk_soc) ? $this->fk_soc : $this->fk_thirdparty);
1250
+        if ($force_thirdparty_id)
1251
+            $idtofetch = $force_thirdparty_id;
3892 1252
 
3893
-			if($conf->global->PRODUCT_USE_UNITS)
3894
-			{
3895
-				print '<td class="linecoluseunit" align="left">'.$langs->trans('Unit').'</td>';
3896
-			}
1253
+        if ($idtofetch) {
1254
+            $thirdparty = new Societe($this->db);
1255
+            $result = $thirdparty->fetch($idtofetch);
1256
+            $this->thirdparty = $thirdparty;
3897 1257
 
3898
-			// Reduction short
3899
-			print '<td class="linecoldiscount" align="right">'.$langs->trans('ReductionShort').'</td>';
1258
+            // Use first price level if level not defined for third party
1259
+            if (!empty($conf->global->PRODUIT_MULTIPRICES) && empty($this->thirdparty->price_level)) {
1260
+                $this->thirdparty->price_level = 1;
1261
+            }
3900 1262
 
3901
-			if ($this->situation_cycle_ref) {
3902
-				print '<td class="linecolcycleref" align="right">' . $langs->trans('Progress') . '</td>';
3903
-			}
1263
+            return $result;
1264
+        } else
1265
+            return -1;
1266
+    }
3904 1267
 
3905
-			if ($usemargins && ! empty($conf->margin->enabled) && empty($user->societe_id))
3906
-			{
3907
-				if (!empty($user->rights->margins->creer))
3908
-				{
3909
-					if ($conf->global->MARGIN_TYPE == "1")
3910
-						print '<td class="linecolmargin1 margininfos" align="right" width="80">'.$langs->trans('BuyingPrice').'</td>';
3911
-					else
3912
-						print '<td class="linecolmargin1 margininfos" align="right" width="80">'.$langs->trans('CostPrice').'</td>';
3913
-				}
3914 1268
 
3915
-				if (! empty($conf->global->DISPLAY_MARGIN_RATES) && $user->rights->margins->liretous)
3916
-					print '<td class="linecolmargin2 margininfos" align="right" width="50">'.$langs->trans('MarginRate').'</td>';
3917
-				if (! empty($conf->global->DISPLAY_MARK_RATES) && $user->rights->margins->liretous)
3918
-					print '<td class="linecolmargin2 margininfos" align="right" width="50">'.$langs->trans('MarkRate').'</td>';
3919
-			}
1269
+    /**
1270
+     * Looks for an object with ref matching the wildcard provided
1271
+     * It does only work when $this->table_ref_field is set
1272
+     *
1273
+     * @param string $ref Wildcard
1274
+     * @return int >1 = OK, 0 = Not found or table_ref_field not defined, <0 = KO
1275
+     */
1276
+    public function fetchOneLike($ref)
1277
+    {
1278
+        if (!$this->table_ref_field) {
1279
+            return 0;
1280
+        }
3920 1281
 
3921
-			// Total HT
3922
-			print '<td class="linecolht" align="right">'.$langs->trans('TotalHTShort').'</td>';
1282
+        $sql = 'SELECT rowid FROM '.MAIN_DB_PREFIX.$this->table_element.' WHERE '.$this->table_ref_field.' LIKE "'.$this->db->escape($ref).'" LIMIT 1';
3923 1283
 
3924
-			// Multicurrency
3925
-			if (!empty($conf->multicurrency->enabled) && $this->multicurrency_code != $conf->currency) print '<td class="linecoltotalht_currency" align="right">'.$langs->trans('TotalHTShortCurrency', $this->multicurrency_code).'</td>';
1284
+        $query = $this->db->query($sql);
3926 1285
 
3927
-			if ($outputalsopricetotalwithtax) print '<td align="right" width="80">'.$langs->trans('TotalTTCShort').'</td>';
1286
+        if (!$this->db->num_rows($query)) {
1287
+            return 0;
1288
+        }
3928 1289
 
3929
-			print '<td class="linecoledit"></td>';  // No width to allow autodim
1290
+        $result = $this->db->fetch_object($query);
3930 1291
 
3931
-			print '<td class="linecoldelete" width="10"></td>';
1292
+        return $this->fetch($result->rowid);
1293
+    }
3932 1294
 
3933
-			print '<td class="linecolmove" width="10"></td>';
1295
+    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
1296
+    /**
1297
+     *	Load data for barcode into properties ->barcode_type*
1298
+     *	Properties ->barcode_type that is id of barcode. Type is used to find other properties, but
1299
+     *  if it is not defined, ->element must be defined to know default barcode type.
1300
+     *
1301
+     *	@return		int			<0 if KO, 0 if can't guess type of barcode (ISBN, EAN13...), >0 if OK (all barcode properties loaded)
1302
+     */
1303
+    function fetch_barcode()
1304
+    {
1305
+        // phpcs:enable
1306
+        global $conf;
3934 1307
 
3935
-			if($action == 'selectlines')
3936
-			{
3937
-			    print '<td class="linecolcheckall" align="center">';
3938
-			    print '<input type="checkbox" class="linecheckboxtoggle" />';
3939
-			    print '<script type="text/javascript">$(document).ready(function() {$(".linecheckboxtoggle").click(function() {var checkBoxes = $(".linecheckbox");checkBoxes.prop("checked", this.checked);})});</script>';
3940
-			    print '</td>';
3941
-			}
3942
-
3943
-			print "</tr>\n";
3944
-			print "</thead>\n";
3945
-		}
3946
-
3947
-		$var = true;
3948
-		$i	 = 0;
3949
-
3950
-		print "<tbody>\n";
3951
-		foreach ($this->lines as $line)
3952
-		{
3953
-			//Line extrafield
3954
-			$line->fetch_optionals();
3955
-
3956
-			//if (is_object($hookmanager) && (($line->product_type == 9 && ! empty($line->special_code)) || ! empty($line->fk_parent_line)))
3957
-			if (is_object($hookmanager))   // Old code is commented on preceding line.
3958
-			{
3959
-				if (empty($line->fk_parent_line))
3960
-				{
3961
-					$parameters = array('line'=>$line,'var'=>$var,'num'=>$num,'i'=>$i,'dateSelector'=>$dateSelector,'seller'=>$seller,'buyer'=>$buyer,'selected'=>$selected, 'extrafieldsline'=>$extrafieldsline);
3962
-					$reshook = $hookmanager->executeHooks('printObjectLine', $parameters, $this, $action);    // Note that $action and $object may have been modified by some hooks
3963
-				}
3964
-				else
3965
-				{
3966
-					$parameters = array('line'=>$line,'var'=>$var,'num'=>$num,'i'=>$i,'dateSelector'=>$dateSelector,'seller'=>$seller,'buyer'=>$buyer,'selected'=>$selected, 'extrafieldsline'=>$extrafieldsline, 'fk_parent_line'=>$line->fk_parent_line);
3967
-					$reshook = $hookmanager->executeHooks('printObjectSubLine', $parameters, $this, $action);    // Note that $action and $object may have been modified by some hooks
3968
-				}
3969
-			}
3970
-			if (empty($reshook))
3971
-			{
3972
-				$this->printObjectLine($action,$line,$var,$num,$i,$dateSelector,$seller,$buyer,$selected,$extrafieldsline);
3973
-			}
3974
-
3975
-			$i++;
3976
-		}
3977
-		print "</tbody>\n";
3978
-	}
3979
-
3980
-	/**
3981
-	 *	Return HTML content of a detail line
3982
-	 *	TODO Move this into an output class file (htmlline.class.php)
3983
-	 *
3984
-	 *	@param	string		$action				GET/POST action
3985
-	 *	@param CommonObjectLine $line		       	Selected object line to output
3986
-	 *	@param  string	    $var               	Is it a an odd line (true)
3987
-	 *	@param  int		    $num               	Number of line (0)
3988
-	 *	@param  int		    $i					I
3989
-	 *	@param  int		    $dateSelector      	1=Show also date range input fields
3990
-	 *	@param  string	    $seller            	Object of seller third party
3991
-	 *	@param  string	    $buyer             	Object of buyer third party
3992
-	 *	@param	int			$selected		   	Object line selected
3993
-	 *  @param  int			$extrafieldsline	Object of extrafield line attribute
3994
-	 *	@return	void
3995
-	 */
3996
-	function printObjectLine($action,$line,$var,$num,$i,$dateSelector,$seller,$buyer,$selected=0,$extrafieldsline=0)
3997
-	{
3998
-		global $conf,$langs,$user,$object,$hookmanager;
3999
-		global $form,$bc,$bcdd;
4000
-		global $object_rights, $disableedit, $disablemove, $disableremove;   // TODO We should not use global var for this !
4001
-
4002
-		$object_rights = $this->getRights();
4003
-
4004
-		$element=$this->element;
4005
-
4006
-		$text=''; $description=''; $type=0;
4007
-
4008
-		// Show product and description
4009
-		$type=(! empty($line->product_type)?$line->product_type:$line->fk_product_type);
4010
-		// Try to enhance type detection using date_start and date_end for free lines where type was not saved.
4011
-		if (! empty($line->date_start)) $type=1; // deprecated
4012
-		if (! empty($line->date_end)) $type=1; // deprecated
4013
-
4014
-		// Ligne en mode visu
4015
-		if ($action != 'editline' || $selected != $line->id)
4016
-		{
4017
-			// Product
4018
-			if ($line->fk_product > 0)
4019
-			{
4020
-				$product_static = new Product($this->db);
4021
-				$product_static->fetch($line->fk_product);
1308
+        dol_syslog(get_class($this).'::fetch_barcode this->element='.$this->element.' this->barcode_type='.$this->barcode_type);
4022 1309
 
4023
-				$product_static->ref = $line->ref; //can change ref in hook
4024
-				$product_static->label = $line->label; //can change label in hook
4025
-				$text=$product_static->getNomUrl(1);
1310
+        $idtype=$this->barcode_type;
1311
+        if (empty($idtype) && $idtype != '0')	// If type of barcode no set, we try to guess. If set to '0' it means we forced to have type remain not defined
1312
+        {
1313
+            if ($this->element == 'product')      $idtype = $conf->global->PRODUIT_DEFAULT_BARCODE_TYPE;
1314
+            else if ($this->element == 'societe') $idtype = $conf->global->GENBARCODE_BARCODETYPE_THIRDPARTY;
1315
+            else dol_syslog('Call fetch_barcode with barcode_type not defined and cant be guessed', LOG_WARNING);
1316
+        }
4026 1317
 
4027
-				// Define output language and label
4028
-				if (! empty($conf->global->MAIN_MULTILANGS))
4029
-				{
4030
-					if (! is_object($this->thirdparty))
4031
-					{
4032
-						dol_print_error('','Error: Method printObjectLine was called on an object and object->fetch_thirdparty was not done before');
4033
-						return;
4034
-					}
4035
-
4036
-					$prod = new Product($this->db);
4037
-					$prod->fetch($line->fk_product);
4038
-
4039
-					$outputlangs = $langs;
4040
-					$newlang='';
4041
-					if (empty($newlang) && GETPOST('lang_id','aZ09')) $newlang=GETPOST('lang_id','aZ09');
4042
-					if (! empty($conf->global->PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE) && empty($newlang)) $newlang=$this->thirdparty->default_lang;		// For language to language of customer
4043
-					if (! empty($newlang))
4044
-					{
4045
-						$outputlangs = new Translate("",$conf);
4046
-						$outputlangs->setDefaultLang($newlang);
4047
-					}
4048
-
4049
-					$label = (! empty($prod->multilangs[$outputlangs->defaultlang]["label"])) ? $prod->multilangs[$outputlangs->defaultlang]["label"] : $line->product_label;
4050
-				}
4051
-				else
4052
-				{
4053
-					$label = $line->product_label;
4054
-				}
1318
+        if ($idtype > 0)
1319
+        {
1320
+            if (empty($this->barcode_type) || empty($this->barcode_type_code) || empty($this->barcode_type_label) || empty($this->barcode_type_coder))    // If data not already loaded
1321
+            {
1322
+                $sql = "SELECT rowid, code, libelle as label, coder";
1323
+                $sql.= " FROM ".MAIN_DB_PREFIX."c_barcode_type";
1324
+                $sql.= " WHERE rowid = ".$idtype;
1325
+                dol_syslog(get_class($this).'::fetch_barcode', LOG_DEBUG);
1326
+                $resql = $this->db->query($sql);
1327
+                if ($resql)
1328
+                {
1329
+                    $obj = $this->db->fetch_object($resql);
1330
+                    $this->barcode_type       = $obj->rowid;
1331
+                    $this->barcode_type_code  = $obj->code;
1332
+                    $this->barcode_type_label = $obj->label;
1333
+                    $this->barcode_type_coder = $obj->coder;
1334
+                    return 1;
1335
+                }
1336
+                else
1337
+                {
1338
+                    dol_print_error($this->db);
1339
+                    return -1;
1340
+                }
1341
+            }
1342
+        }
1343
+        return 0;
1344
+    }
4055 1345
 
4056
-				$text.= ' - '.(! empty($line->label)?$line->label:$label);
4057
-				$description.=(! empty($conf->global->PRODUIT_DESC_IN_FORM)?'':dol_htmlentitiesbr($line->description));	// Description is what to show on popup. We shown nothing if already into desc.
4058
-			}
1346
+    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
1347
+    /**
1348
+     *		Load the project with id $this->fk_project into this->project
1349
+     *
1350
+     *		@return		int			<0 if KO, >=0 if OK
1351
+     */
1352
+    function fetch_projet()
1353
+    {
1354
+        // phpcs:enable
1355
+        include_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
4059 1356
 
4060
-			$line->pu_ttc = price2num($line->subprice * (1 + ($line->tva_tx/100)), 'MU');
1357
+        if (empty($this->fk_project) && ! empty($this->fk_projet)) $this->fk_project = $this->fk_projet;	// For backward compatibility
1358
+        if (empty($this->fk_project)) return 0;
4061 1359
 
4062
-			// Output template part (modules that overwrite templates must declare this into descriptor)
4063
-			// Use global variables + $dateSelector + $seller and $buyer
4064
-			$dirtpls=array_merge($conf->modules_parts['tpl'],array('/core/tpl'));
4065
-			foreach($dirtpls as $reldir)
4066
-			{
4067
-				$tpl = dol_buildpath($reldir.'/objectline_view.tpl.php');
4068
-				if (empty($conf->file->strict_mode)) {
4069
-					$res=@include $tpl;
4070
-				} else {
4071
-					$res=include $tpl; // for debug
4072
-				}
4073
-				if ($res) break;
4074
-			}
4075
-		}
4076
-
4077
-		// Ligne en mode update
4078
-		if ($this->statut == 0 && $action == 'editline' && $selected == $line->id)
4079
-		{
4080
-			$label = (! empty($line->label) ? $line->label : (($line->fk_product > 0) ? $line->product_label : ''));
4081
-			$placeholder=' placeholder="'.$langs->trans("Label").'"';
4082
-
4083
-			$line->pu_ttc = price2num($line->subprice * (1 + ($line->tva_tx/100)), 'MU');
4084
-
4085
-			// Output template part (modules that overwrite templates must declare this into descriptor)
4086
-			// Use global variables + $dateSelector + $seller and $buyer
4087
-			$dirtpls=array_merge($conf->modules_parts['tpl'],array('/core/tpl'));
4088
-			foreach($dirtpls as $reldir)
4089
-			{
4090
-				$tpl = dol_buildpath($reldir.'/objectline_edit.tpl.php');
4091
-				if (empty($conf->file->strict_mode)) {
4092
-					$res=@include $tpl;
4093
-				} else {
4094
-					$res=include $tpl; // for debug
4095
-				}
4096
-				if ($res) break;
4097
-			}
4098
-		}
4099
-	}
4100
-
4101
-
4102
-	/* This is to show array of line of details of source object */
4103
-
4104
-
4105
-	/**
4106
-	 * 	Return HTML table table of source object lines
4107
-	 *  TODO Move this and previous function into output html class file (htmlline.class.php).
4108
-	 *  If lines are into a template, title must also be into a template
4109
-	 *  But for the moment we don't know if it's possible, so we keep the method available on overloaded objects.
4110
-	 *
4111
-	 *	@param	string		$restrictlist		''=All lines, 'services'=Restrict to services only
4112
-	 *  @return	void
4113
-	 */
4114
-	function printOriginLinesList($restrictlist='')
4115
-	{
4116
-		global $langs, $hookmanager, $conf;
4117
-
4118
-		print '<tr class="liste_titre">';
4119
-		print '<td>'.$langs->trans('Ref').'</td>';
4120
-		print '<td>'.$langs->trans('Description').'</td>';
4121
-		print '<td align="right">'.$langs->trans('VATRate').'</td>';
4122
-		print '<td align="right">'.$langs->trans('PriceUHT').'</td>';
4123
-		if (!empty($conf->multicurrency->enabled)) print '<td align="right">'.$langs->trans('PriceUHTCurrency').'</td>';
4124
-		print '<td align="right">'.$langs->trans('Qty').'</td>';
4125
-		if($conf->global->PRODUCT_USE_UNITS)
4126
-		{
4127
-			print '<td align="left">'.$langs->trans('Unit').'</td>';
4128
-		}
4129
-		print '<td align="right">'.$langs->trans('ReductionShort').'</td></tr>';
4130
-
4131
-		$var = true;
4132
-		$i	 = 0;
4133
-
4134
-		if (! empty($this->lines))
4135
-		{
4136
-			foreach ($this->lines as $line)
4137
-			{
4138
-				if (is_object($hookmanager) && (($line->product_type == 9 && ! empty($line->special_code)) || ! empty($line->fk_parent_line)))
4139
-				{
4140
-					if (empty($line->fk_parent_line))
4141
-					{
4142
-						$parameters=array('line'=>$line,'var'=>$var,'i'=>$i);
4143
-						$action='';
4144
-						$hookmanager->executeHooks('printOriginObjectLine',$parameters,$this,$action);    // Note that $action and $object may have been modified by some hooks
4145
-					}
4146
-				}
4147
-				else
4148
-				{
4149
-					$this->printOriginLine($line, $var, $restrictlist);
4150
-				}
1360
+        $project = new Project($this->db);
1361
+        $result = $project->fetch($this->fk_project);
4151 1362
 
4152
-				$i++;
4153
-			}
4154
-		}
4155
-	}
4156
-
4157
-	/**
4158
-	 * 	Return HTML with a line of table array of source object lines
4159
-	 *  TODO Move this and previous function into output html class file (htmlline.class.php).
4160
-	 *  If lines are into a template, title must also be into a template
4161
-	 *  But for the moment we don't know if it's possible as we keep a method available on overloaded objects.
4162
-	 *
4163
-	 * 	@param	CommonObjectLine	$line				Line
4164
-	 * 	@param	string				$var				Var
4165
-	 *	@param	string				$restrictlist		''=All lines, 'services'=Restrict to services only (strike line if not)
4166
-	 * 	@return	void
4167
-	 */
4168
-	function printOriginLine($line, $var, $restrictlist='')
4169
-	{
4170
-		global $langs, $conf;
4171
-
4172
-		//var_dump($line);
4173
-		if (!empty($line->date_start))
4174
-		{
4175
-			$date_start=$line->date_start;
4176
-		}
4177
-		else
4178
-		{
4179
-			$date_start=$line->date_debut_prevue;
4180
-			if ($line->date_debut_reel) $date_start=$line->date_debut_reel;
4181
-		}
4182
-		if (!empty($line->date_end))
4183
-		{
4184
-			$date_end=$line->date_end;
4185
-		}
4186
-		else
4187
-		{
4188
-			$date_end=$line->date_fin_prevue;
4189
-			if ($line->date_fin_reel) $date_end=$line->date_fin_reel;
4190
-		}
4191
-
4192
-		$this->tpl['label'] = '';
4193
-		if (! empty($line->fk_parent_line)) $this->tpl['label'].= img_picto('', 'rightarrow');
4194
-
4195
-		if (($line->info_bits & 2) == 2)  // TODO Not sure this is used for source object
4196
-		{
4197
-			$discount=new DiscountAbsolute($this->db);
4198
-			$discount->fk_soc = $this->socid;
4199
-			$this->tpl['label'].= $discount->getNomUrl(0,'discount');
4200
-		}
4201
-		else if (! empty($line->fk_product))
4202
-		{
4203
-			$productstatic = new Product($this->db);
4204
-			$productstatic->id = $line->fk_product;
4205
-			$productstatic->ref = $line->ref;
4206
-			$productstatic->type = $line->fk_product_type;
4207
-            if(empty($productstatic->ref)){
4208
-				$line->fetch_product();
4209
-				$productstatic = $line->product;
4210
-			}
4211
-			
4212
-			$this->tpl['label'].= $productstatic->getNomUrl(1);
4213
-			$this->tpl['label'].= ' - '.(! empty($line->label)?$line->label:$line->product_label);
4214
-			// Dates
4215
-			if ($line->product_type == 1 && ($date_start || $date_end))
4216
-			{
4217
-				$this->tpl['label'].= get_date_range($date_start,$date_end);
4218
-			}
4219
-		}
4220
-		else
4221
-		{
4222
-			$this->tpl['label'].= ($line->product_type == -1 ? '&nbsp;' : ($line->product_type == 1 ? img_object($langs->trans(''),'service') : img_object($langs->trans(''),'product')));
4223
-			if (!empty($line->desc)) {
4224
-				$this->tpl['label'].=$line->desc;
4225
-			}else {
4226
-				$this->tpl['label'].= ($line->label ? '&nbsp;'.$line->label : '');
4227
-			}
4228
-			
4229
-			// Dates
4230
-			if ($line->product_type == 1 && ($date_start || $date_end))
4231
-			{
4232
-				$this->tpl['label'].= get_date_range($date_start,$date_end);
4233
-			}
4234
-		}
1363
+        $this->projet = $project;	// deprecated
1364
+        $this->project = $project;
1365
+        return $result;
1366
+    }
4235 1367
 
4236
-		if (! empty($line->desc))
4237
-		{
4238
-			if ($line->desc == '(CREDIT_NOTE)')  // TODO Not sure this is used for source object
4239
-			{
4240
-				$discount=new DiscountAbsolute($this->db);
4241
-				$discount->fetch($line->fk_remise_except);
4242
-				$this->tpl['description'] = $langs->transnoentities("DiscountFromCreditNote",$discount->getNomUrl(0));
4243
-			}
4244
-			elseif ($line->desc == '(DEPOSIT)')  // TODO Not sure this is used for source object
4245
-			{
4246
-				$discount=new DiscountAbsolute($this->db);
4247
-				$discount->fetch($line->fk_remise_except);
4248
-				$this->tpl['description'] = $langs->transnoentities("DiscountFromDeposit",$discount->getNomUrl(0));
4249
-			}
4250
-			elseif ($line->desc == '(EXCESS RECEIVED)')
4251
-			{
4252
-				$discount=new DiscountAbsolute($this->db);
4253
-				$discount->fetch($line->fk_remise_except);
4254
-				$this->tpl['description'] = $langs->transnoentities("DiscountFromExcessReceived",$discount->getNomUrl(0));
4255
-			}
4256
-			elseif ($line->desc == '(EXCESS PAID)')
4257
-			{
4258
-				$discount=new DiscountAbsolute($this->db);
4259
-				$discount->fetch($line->fk_remise_except);
4260
-				$this->tpl['description'] = $langs->transnoentities("DiscountFromExcessPaid",$discount->getNomUrl(0));
4261
-			}
4262
-			else
4263
-			{
4264
-				$this->tpl['description'] = dol_trunc($line->desc,60);
4265
-			}
4266
-		}
4267
-		else
4268
-		{
4269
-			$this->tpl['description'] = '&nbsp;';
4270
-		}
1368
+    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
1369
+    /**
1370
+     *		Load the product with id $this->fk_product into this->product
1371
+     *
1372
+     *		@return		int			<0 if KO, >=0 if OK
1373
+     */
1374
+    function fetch_product()
1375
+    {
1376
+        // phpcs:enable
1377
+        include_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
4271 1378
 
4272
-        // VAT Rate
4273
-        $this->tpl['vat_rate'] = vatrate($line->tva_tx, true);
4274
-        $this->tpl['vat_rate'] .= (($line->info_bits & 1) == 1) ? '*' : '';
4275
-        if (! empty($line->vat_src_code) && ! preg_match('/\(/', $this->tpl['vat_rate'])) $this->tpl['vat_rate'].=' ('.$line->vat_src_code.')';
1379
+        if (empty($this->fk_product)) return 0;
4276 1380
 
4277
-		$this->tpl['price'] = price($line->subprice);
4278
-		$this->tpl['multicurrency_price'] = price($line->multicurrency_subprice);
4279
-		$this->tpl['qty'] = (($line->info_bits & 2) != 2) ? $line->qty : '&nbsp;';
4280
-		if ($conf->global->PRODUCT_USE_UNITS) $this->tpl['unit'] = $langs->transnoentities($line->getLabelOfUnit('long'));
4281
-		$this->tpl['remise_percent'] = (($line->info_bits & 2) != 2) ? vatrate($line->remise_percent, true) : '&nbsp;';
4282
-
4283
-		// Is the line strike or not
4284
-		$this->tpl['strike']=0;
4285
-		if ($restrictlist == 'services' && $line->product_type != Product::TYPE_SERVICE) $this->tpl['strike']=1;
4286
-
4287
-		// Output template part (modules that overwrite templates must declare this into descriptor)
4288
-		// Use global variables + $dateSelector + $seller and $buyer
4289
-		$dirtpls=array_merge($conf->modules_parts['tpl'],array('/core/tpl'));
4290
-		foreach($dirtpls as $reldir)
4291
-		{
4292
-			$tpl = dol_buildpath($reldir.'/originproductline.tpl.php');
4293
-			if (empty($conf->file->strict_mode)) {
4294
-				$res=@include $tpl;
4295
-			} else {
4296
-				$res=include $tpl; // for debug
4297
-			}
4298
-			if ($res) break;
4299
-		}
4300
-	}
1381
+        $product = new Product($this->db);
1382
+        $result = $product->fetch($this->fk_product);
4301 1383
 
1384
+        $this->product = $product;
1385
+        return $result;
1386
+    }
4302 1387
 
4303 1388
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
4304
-	/**
4305
-	 *	Add resources to the current object : add entry into llx_element_resources
4306
-	 *	Need $this->element & $this->id
4307
-	 *
4308
-	 *	@param		int		$resource_id		Resource id
4309
-	 *	@param		string	$resource_type		'resource'
4310
-	 *	@param		int		$busy				Busy or not
4311
-	 *	@param		int		$mandatory			Mandatory or not
4312
-	 *	@return		int							<=0 if KO, >0 if OK
4313
-	 */
4314
-	function add_element_resource($resource_id, $resource_type, $busy=0, $mandatory=0)
4315
-	{
1389
+    /**
1390
+     *		Load the user with id $userid into this->user
1391
+     *
1392
+     *		@param	int		$userid 		Id du contact
1393
+     *		@return	int						<0 if KO, >0 if OK
1394
+     */
1395
+    function fetch_user($userid)
1396
+    {
4316 1397
         // phpcs:enable
4317
-		$this->db->begin();
4318
-
4319
-		$sql = "INSERT INTO ".MAIN_DB_PREFIX."element_resources (";
4320
-		$sql.= "resource_id";
4321
-		$sql.= ", resource_type";
4322
-		$sql.= ", element_id";
4323
-		$sql.= ", element_type";
4324
-		$sql.= ", busy";
4325
-		$sql.= ", mandatory";
4326
-		$sql.= ") VALUES (";
4327
-		$sql.= $resource_id;
4328
-		$sql.= ", '".$this->db->escape($resource_type)."'";
4329
-		$sql.= ", '".$this->db->escape($this->id)."'";
4330
-		$sql.= ", '".$this->db->escape($this->element)."'";
4331
-		$sql.= ", '".$this->db->escape($busy)."'";
4332
-		$sql.= ", '".$this->db->escape($mandatory)."'";
4333
-		$sql.= ")";
4334
-
4335
-		dol_syslog(get_class($this)."::add_element_resource", LOG_DEBUG);
4336
-		if ($this->db->query($sql))
4337
-		{
4338
-			$this->db->commit();
4339
-			return 1;
4340
-		}
4341
-		else
4342
-		{
4343
-			$this->error=$this->db->lasterror();
4344
-			$this->db->rollback();
4345
-			return  0;
4346
-		}
4347
-	}
1398
+        $user = new User($this->db);
1399
+        $result=$user->fetch($userid);
1400
+        $this->user = $user;
1401
+        return $result;
1402
+    }
4348 1403
 
4349 1404
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
4350
-	/**
4351
-	 *    Delete a link to resource line
4352
-	 *
4353
-	 *    @param	int		$rowid			Id of resource line to delete
4354
-	 *    @param	int		$element		element name (for trigger) TODO: use $this->element into commonobject class
4355
-	 *    @param	int		$notrigger		Disable all triggers
4356
-	 *    @return   int						>0 if OK, <0 if KO
4357
-	 */
4358
-	function delete_resource($rowid, $element, $notrigger=0)
4359
-	{
1405
+    /**
1406
+     *	Read linked origin object
1407
+     *
1408
+     *	@return		void
1409
+     */
1410
+    function fetch_origin()
1411
+    {
4360 1412
         // phpcs:enable
4361
-		global $user;
1413
+        if ($this->origin == 'shipping') $this->origin = 'expedition';
1414
+        if ($this->origin == 'delivery') $this->origin = 'livraison';
1415
+        if ($this->origin == 'order_supplier') $this->origin = 'commandeFournisseur';
4362 1416
 
4363
-		$this->db->begin();
1417
+        $origin = $this->origin;
4364 1418
 
4365
-		$sql = "DELETE FROM ".MAIN_DB_PREFIX."element_resources";
4366
-		$sql.= " WHERE rowid=".$rowid;
1419
+        $classname = ucfirst($origin);
1420
+        $this->$origin = new $classname($this->db);
1421
+        $this->$origin->fetch($this->origin_id);
1422
+    }
4367 1423
 
4368
-		dol_syslog(get_class($this)."::delete_resource", LOG_DEBUG);
1424
+    /**
1425
+     *  Load object from specific field
1426
+     *
1427
+     *  @param	string	$table		Table element or element line
1428
+     *  @param	string	$field		Field selected
1429
+     *  @param	string	$key		Import key
1430
+     *  @param	string	$element	Element name
1431
+     *	@return	int					<0 if KO, >0 if OK
1432
+     */
1433
+    function fetchObjectFrom($table, $field, $key, $element = null)
1434
+    {
1435
+        global $conf;
4369 1436
 
4370
-		$resql=$this->db->query($sql);
4371
-		if (! $resql)
4372
-		{
4373
-			$this->error=$this->db->lasterror();
4374
-			$this->db->rollback();
4375
-			return -1;
4376
-		}
4377
-		else
4378
-		{
4379
-			if (! $notrigger)
4380
-			{
4381
-				$result=$this->call_trigger(strtoupper($element).'_DELETE_RESOURCE', $user);
4382
-				if ($result < 0) { $this->db->rollback(); return -1; }
4383
-			}
4384
-			$this->db->commit();
4385
-			return 1;
4386
-		}
4387
-	}
4388
-
4389
-
4390
-	/**
4391
-	 * Overwrite magic function to solve problem of cloning object that are kept as references
4392
-	 *
4393
-	 * @return void
4394
-	 */
4395
-	function __clone()
4396
-	{
4397
-		// Force a copy of this->lines, otherwise it will point to same object.
4398
-		if (isset($this->lines) && is_array($this->lines))
4399
-		{
4400
-			$nboflines=count($this->lines);
4401
-			for($i=0; $i < $nboflines; $i++)
4402
-			{
4403
-				$this->lines[$i] = clone $this->lines[$i];
4404
-			}
4405
-		}
4406
-	}
4407
-
4408
-	/**
4409
-	 * Common function for all objects extending CommonObject for generating documents
4410
-	 *
4411
-	 * @param 	string 		$modelspath 	Relative folder where generators are placed
4412
-	 * @param 	string 		$modele 		Generator to use. Caller must set it to obj->modelpdf or GETPOST('modelpdf') for example.
4413
-	 * @param 	Translate 	$outputlangs 	Output language to use
4414
-	 * @param 	int 		$hidedetails 	1 to hide details. 0 by default
4415
-	 * @param 	int 		$hidedesc 		1 to hide product description. 0 by default
4416
-	 * @param 	int 		$hideref 		1 to hide product reference. 0 by default
4417
-	 * @param   null|array  $moreparams     Array to provide more information
4418
-	 * @return 	int 						>0 if OK, <0 if KO
4419
-	 * @see	addFileIntoDatabaseIndex
4420
-	 */
4421
-	protected function commonGenerateDocument($modelspath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams=null)
4422
-	{
4423
-		global $conf, $langs, $user;
4424
-
4425
-		$srctemplatepath='';
4426
-
4427
-		// Increase limit for PDF build
4428
-		$err=error_reporting();
4429
-		error_reporting(0);
4430
-		@set_time_limit(120);
4431
-		error_reporting($err);
4432
-
4433
-		// If selected model is a filename template (then $modele="modelname" or "modelname:filename")
4434
-		$tmp=explode(':',$modele,2);
4435
-		if (! empty($tmp[1]))
4436
-		{
4437
-			$modele=$tmp[0];
4438
-			$srctemplatepath=$tmp[1];
4439
-		}
4440
-
4441
-		// Search template files
4442
-		$file=''; $classname=''; $filefound=0;
4443
-		$dirmodels=array('/');
4444
-		if (is_array($conf->modules_parts['models'])) $dirmodels=array_merge($dirmodels,$conf->modules_parts['models']);
4445
-		foreach($dirmodels as $reldir)
4446
-		{
4447
-			foreach(array('doc','pdf') as $prefix)
4448
-			{
4449
-				if (in_array(get_class($this), array('Adherent'))) $file = $prefix."_".$modele.".class.php";     // Member module use prefix_module.class.php
4450
-				else $file = $prefix."_".$modele.".modules.php";
1437
+        $result=false;
4451 1438
 
4452
-				// On verifie l'emplacement du modele
4453
-				$file=dol_buildpath($reldir.$modelspath.$file,0);
4454
-				if (file_exists($file))
4455
-				{
4456
-					$filefound=1;
4457
-					$classname=$prefix.'_'.$modele;
4458
-					break;
4459
-				}
4460
-			}
4461
-			if ($filefound) break;
4462
-		}
1439
+        $sql = "SELECT rowid FROM ".MAIN_DB_PREFIX.$table;
1440
+        $sql.= " WHERE ".$field." = '".$key."'";
1441
+        if (! empty($element)) {
1442
+            $sql.= " AND entity IN (".getEntity($element).")";
1443
+        } else {
1444
+            $sql.= " AND entity = ".$conf->entity;
1445
+        }
4463 1446
 
4464
-		// If generator was found
4465
-		if ($filefound)
4466
-		{
4467
-			global $db;  // Required to solve a conception default in commonstickergenerator.class.php making an include of code using $db
1447
+        dol_syslog(get_class($this).'::fetchObjectFrom', LOG_DEBUG);
1448
+        $resql = $this->db->query($sql);
1449
+        if ($resql)
1450
+        {
1451
+            $row = $this->db->fetch_row($resql);
1452
+            // Test for avoid error -1
1453
+            if ($row[0] > 0) {
1454
+                $result = $this->fetch($row[0]);
1455
+            }
1456
+        }
4468 1457
 
4469
-			require_once $file;
1458
+        return $result;
1459
+    }
4470 1460
 
4471
-			$obj = new $classname($this->db);
1461
+    /**
1462
+     *	Getter generic. Load value from a specific field
1463
+     *
1464
+     *	@param	string	$table		Table of element or element line
1465
+     *	@param	int		$id			Element id
1466
+     *	@param	string	$field		Field selected
1467
+     *	@return	int					<0 if KO, >0 if OK
1468
+     */
1469
+    function getValueFrom($table, $id, $field)
1470
+    {
1471
+        $result=false;
1472
+        if (!empty($id) && !empty($field) && !empty($table)) {
1473
+            $sql = "SELECT ".$field." FROM ".MAIN_DB_PREFIX.$table;
1474
+            $sql.= " WHERE rowid = ".$id;
1475
+
1476
+            dol_syslog(get_class($this).'::getValueFrom', LOG_DEBUG);
1477
+            $resql = $this->db->query($sql);
1478
+            if ($resql)
1479
+            {
1480
+                $row = $this->db->fetch_row($resql);
1481
+                $result = $row[0];
1482
+            }
1483
+        }
1484
+        return $result;
1485
+    }
4472 1486
 
4473
-			// If generator is ODT, we must have srctemplatepath defined, if not we set it.
4474
-			if ($obj->type == 'odt' && empty($srctemplatepath))
4475
-			{
4476
-				$varfortemplatedir=$obj->scandir;
4477
-				if ($varfortemplatedir && ! empty($conf->global->$varfortemplatedir))
4478
-				{
4479
-					$dirtoscan=$conf->global->$varfortemplatedir;
4480
-
4481
-					$listoffiles=array();
4482
-
4483
-					// Now we add first model found in directories scanned
4484
-					$listofdir=explode(',',$dirtoscan);
4485
-					foreach($listofdir as $key => $tmpdir)
4486
-					{
4487
-						$tmpdir=trim($tmpdir);
4488
-						$tmpdir=preg_replace('/DOL_DATA_ROOT/',DOL_DATA_ROOT,$tmpdir);
4489
-						if (! $tmpdir) { unset($listofdir[$key]); continue; }
4490
-						if (is_dir($tmpdir))
4491
-						{
4492
-							$tmpfiles=dol_dir_list($tmpdir,'files',0,'\.od(s|t)$','','name',SORT_ASC,0);
4493
-							if (count($tmpfiles)) $listoffiles=array_merge($listoffiles,$tmpfiles);
4494
-						}
4495
-					}
4496
-
4497
-					if (count($listoffiles))
4498
-					{
4499
-						foreach($listoffiles as $record)
4500
-						{
4501
-							$srctemplatepath=$record['fullname'];
4502
-							break;
4503
-						}
4504
-					}
4505
-				}
1487
+    /**
1488
+     *	Setter generic. Update a specific field into database.
1489
+     *  Warning: Trigger is run only if param trigkey is provided.
1490
+     *
1491
+     *	@param	string		$field			Field to update
1492
+     *	@param	mixed		$value			New value
1493
+     *	@param	string		$table			To force other table element or element line (should not be used)
1494
+     *	@param	int			$id				To force other object id (should not be used)
1495
+     *	@param	string		$format			Data format ('text', 'date'). 'text' is used if not defined
1496
+     *	@param	string		$id_field		To force rowid field name. 'rowid' is used if not defined
1497
+     *	@param	User|string	$fuser			Update the user of last update field with this user. If not provided, current user is used except if value is 'none'
1498
+     *  @param  string      $trigkey    	Trigger key to run (in most cases something like 'XXX_MODIFY')
1499
+     *  @param	string		$fk_user_field	Name of field to save user id making change
1500
+     *	@return	int							<0 if KO, >0 if OK
1501
+     *  @see updateExtraField
1502
+     */
1503
+    function setValueFrom($field, $value, $table='', $id=null, $format='', $id_field='', $fuser=null, $trigkey='', $fk_user_field='fk_user_modif')
1504
+    {
1505
+        global $user,$langs,$conf;
4506 1506
 
4507
-				if (empty($srctemplatepath))
4508
-				{
4509
-					$this->error='ErrorGenerationAskedForOdtTemplateWithSrcFileNotDefined';
4510
-					return -1;
4511
-				}
4512
-			}
4513
-
4514
-			if ($obj->type == 'odt' && ! empty($srctemplatepath))
4515
-			{
4516
-				if (! dol_is_file($srctemplatepath))
4517
-				{
4518
-					$this->error='ErrorGenerationAskedForOdtTemplateWithSrcFileNotFound';
4519
-					return -1;
4520
-				}
4521
-			}
4522
-
4523
-			// We save charset_output to restore it because write_file can change it if needed for
4524
-			// output format that does not support UTF8.
4525
-			$sav_charset_output=$outputlangs->charset_output;
1507
+        if (empty($table)) 	  $table=$this->table_element;
1508
+        if (empty($id))    	  $id=$this->id;
1509
+        if (empty($format))   $format='text';
1510
+        if (empty($id_field)) $id_field='rowid';
4526 1511
 
4527
-			if (in_array(get_class($this), array('Adherent')))
4528
-			{
4529
-				$arrayofrecords = array();   // The write_file of templates of adherent class need this var
4530
-				$resultwritefile = $obj->write_file($this, $outputlangs, $srctemplatepath, 'member', 1, $moreparams);
4531
-			}
4532
-			else
4533
-			{
4534
-				$resultwritefile = $obj->write_file($this, $outputlangs, $srctemplatepath, $hidedetails, $hidedesc, $hideref, $moreparams);
4535
-			}
4536
-			// After call of write_file $obj->result['fullpath'] is set with generated file. It will be used to update the ECM database index.
1512
+        $error=0;
4537 1513
 
4538
-			if ($resultwritefile > 0)
4539
-			{
4540
-				$outputlangs->charset_output=$sav_charset_output;
1514
+        $this->db->begin();
4541 1515
 
4542
-				// We delete old preview
4543
-				require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
4544
-				dol_delete_preview($this);
1516
+        // Special case
1517
+        if ($table == 'product' && $field == 'note_private') $field='note';
1518
+        if (in_array($table, array('actioncomm', 'adherent', 'advtargetemailing', 'cronjob', 'establishment'))) $fk_user_field = 'fk_user_mod';
4545 1519
 
4546
-				// Index file in database
4547
-				if (! empty($obj->result['fullpath']))
4548
-				{
4549
-					$destfull = $obj->result['fullpath'];
4550
-					$upload_dir = dirname($destfull);
4551
-					$destfile = basename($destfull);
4552
-					$rel_dir = preg_replace('/^'.preg_quote(DOL_DATA_ROOT,'/').'/', '', $upload_dir);
4553
-
4554
-					if (! preg_match('/[\\/]temp[\\/]|[\\/]thumbs|\.meta$/', $rel_dir))     // If not a tmp dir
4555
-					{
4556
-						$filename = basename($destfile);
4557
-						$rel_dir = preg_replace('/[\\/]$/', '', $rel_dir);
4558
-						$rel_dir = preg_replace('/^[\\/]/', '', $rel_dir);
4559
-
4560
-						include_once DOL_DOCUMENT_ROOT.'/ecm/class/ecmfiles.class.php';
4561
-						$ecmfile=new EcmFiles($this->db);
4562
-						$result = $ecmfile->fetch(0, '', ($rel_dir?$rel_dir.'/':'').$filename);
4563
-
4564
-						// Set the public "share" key
4565
-						$setsharekey = false;
4566
-						if ($this->element == 'propal')
4567
-						{
4568
-							$useonlinesignature = $conf->global->MAIN_FEATURES_LEVEL;	// Replace this with 1 when feature to make online signature is ok
4569
-							if ($useonlinesignature) $setsharekey=true;
4570
-							if (! empty($conf->global->PROPOSAL_ALLOW_EXTERNAL_DOWNLOAD)) $setsharekey=true;
4571
-						}
4572
-						if ($this->element == 'commande'     && ! empty($conf->global->ORDER_ALLOW_EXTERNAL_DOWNLOAD))        $setsharekey=true;
4573
-						if ($this->element == 'facture'      && ! empty($conf->global->INVOICE_ALLOW_EXTERNAL_DOWNLOAD))      $setsharekey=true;
4574
-						if ($this->element == 'bank_account' && ! empty($conf->global->BANK_ACCOUNT_ALLOW_EXTERNAL_DOWNLOAD)) $setsharekey=true;
4575
-
4576
-						if ($setsharekey)
4577
-						{
4578
-							if (empty($ecmfile->share))	// Because object not found or share not set yet
4579
-							{
4580
-								require_once DOL_DOCUMENT_ROOT.'/core/lib/security2.lib.php';
4581
-								$ecmfile->share = getRandomPassword(true);
4582
-							}
4583
-						}
1520
+        $sql = "UPDATE ".MAIN_DB_PREFIX.$table." SET ";
4584 1521
 
4585
-						if ($result > 0)
4586
-						{
4587
-							$ecmfile->label = md5_file(dol_osencode($destfull));	// hash of file content
4588
-							$ecmfile->fullpath_orig = '';
4589
-							$ecmfile->gen_or_uploaded = 'generated';
4590
-							$ecmfile->description = '';    // indexed content
4591
-							$ecmfile->keyword = '';        // keyword content
4592
-							$result = $ecmfile->update($user);
4593
-							if ($result < 0)
4594
-							{
4595
-								setEventMessages($ecmfile->error, $ecmfile->errors, 'warnings');
4596
-							}
4597
-						}
4598
-						else
4599
-						{
4600
-							$ecmfile->entity = $conf->entity;
4601
-							$ecmfile->filepath = $rel_dir;
4602
-							$ecmfile->filename = $filename;
4603
-							$ecmfile->label = md5_file(dol_osencode($destfull));	// hash of file content
4604
-							$ecmfile->fullpath_orig = '';
4605
-							$ecmfile->gen_or_uploaded = 'generated';
4606
-							$ecmfile->description = '';    // indexed content
4607
-							$ecmfile->keyword = '';        // keyword content
4608
-							$ecmfile->src_object_type = $this->table_element;
4609
-							$ecmfile->src_object_id   = $this->id;
4610
-
4611
-							$result = $ecmfile->create($user);
4612
-							if ($result < 0)
4613
-							{
4614
-								setEventMessages($ecmfile->error, $ecmfile->errors, 'warnings');
4615
-							}
4616
-						}
1522
+        if ($format == 'text') $sql.= $field." = '".$this->db->escape($value)."'";
1523
+        else if ($format == 'int') $sql.= $field." = ".$this->db->escape($value);
1524
+        else if ($format == 'date') $sql.= $field." = ".($value ? "'".$this->db->idate($value)."'" : "null");
4617 1525
 
4618
-						/*$this->result['fullname']=$destfull;
4619
-						$this->result['filepath']=$ecmfile->filepath;
4620
-						$this->result['filename']=$ecmfile->filename;*/
4621
-						//var_dump($obj->update_main_doc_field);exit;
4622
-
4623
-						// Update the last_main_doc field into main object (if documenent generator has property ->update_main_doc_field set)
4624
-						$update_main_doc_field=0;
4625
-						if (! empty($obj->update_main_doc_field)) $update_main_doc_field=1;
4626
-						if ($update_main_doc_field && ! empty($this->table_element))
4627
-						{
4628
-							$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element." SET last_main_doc = '".($ecmfile->filepath.'/'.$ecmfile->filename)."'";
4629
-							$sql.= ' WHERE rowid = '.$this->id;
4630
-							$resql = $this->db->query($sql);
4631
-							if (! $resql) dol_print_error($this->db);
4632
-						}
4633
-					}
4634
-				}
4635
-				else
4636
-				{
4637
-					dol_syslog('Method ->write_file was called on object '.get_class($obj).' and return a success but the return array ->result["fullpath"] was not set.', LOG_WARNING);
4638
-				}
1526
+        if ($fk_user_field)
1527
+        {
1528
+            if (! empty($fuser) && is_object($fuser)) $sql.=", ".$fk_user_field." = ".$fuser->id;
1529
+            elseif (empty($fuser) || $fuser != 'none') $sql.=", ".$fk_user_field." = ".$user->id;
1530
+        }
4639 1531
 
4640
-				// Success in building document. We build meta file.
4641
-				dol_meta_create($this);
1532
+        $sql.= " WHERE ".$id_field." = ".$id;
4642 1533
 
4643
-				return 1;
4644
-			}
4645
-			else
4646
-			{
4647
-				$outputlangs->charset_output=$sav_charset_output;
4648
-				dol_print_error($this->db, "Error generating document for ".__CLASS__.". Error: ".$obj->error, $obj->errors);
4649
-				return -1;
4650
-			}
4651
-		}
4652
-		else
4653
-		{
4654
-			$this->error=$langs->trans("Error")." ".$langs->trans("ErrorFileDoesNotExists",$file);
4655
-			dol_print_error('',$this->error);
4656
-			return -1;
4657
-		}
4658
-	}
4659
-
4660
-	/**
4661
-	 *  Build thumb
4662
-	 *  @TODO Move this into files.lib.php
4663
-	 *
4664
-	 *  @param      string	$file           Path file in UTF8 to original file to create thumbs from.
4665
-	 *	@return		void
4666
-	 */
4667
-	function addThumbs($file)
4668
-	{
4669
-		global $maxwidthsmall, $maxheightsmall, $maxwidthmini, $maxheightmini, $quality;
4670
-
4671
-		require_once DOL_DOCUMENT_ROOT .'/core/lib/images.lib.php';		// This define also $maxwidthsmall, $quality, ...
4672
-
4673
-		$file_osencoded=dol_osencode($file);
4674
-		if (file_exists($file_osencoded))
4675
-		{
4676
-			// Create small thumbs for company (Ratio is near 16/9)
4677
-			// Used on logon for example
4678
-			vignette($file_osencoded, $maxwidthsmall, $maxheightsmall, '_small', $quality);
4679
-
4680
-			// Create mini thumbs for company (Ratio is near 16/9)
4681
-			// Used on menu or for setup page for example
4682
-			vignette($file_osencoded, $maxwidthmini, $maxheightmini, '_mini', $quality);
4683
-		}
4684
-	}
4685
-
4686
-
4687
-	/* Functions common to commonobject and commonobjectline */
4688
-
4689
-	/* For default values */
4690
-
4691
-	/**
4692
-	 * Return the default value to use for a field when showing the create form of object.
4693
-	 * Return values in this order:
4694
-	 * 1) If parameter is available into POST, we return it first.
4695
-	 * 2) If not but an alternate value was provided as parameter of function, we return it.
4696
-	 * 3) If not but a constant $conf->global->OBJECTELEMENT_FIELDNAME is set, we return it (It is better to use the dedicated table).
4697
-	 * 4) Return value found into database (TODO No yet implemented)
4698
-	 *
4699
-	 * @param   string              $fieldname          Name of field
4700
-	 * @param   string              $alternatevalue     Alternate value to use
4701
-	 * @return  string|string[]                         Default value (can be an array if the GETPOST return an array)
4702
-	 **/
4703
-	function getDefaultCreateValueFor($fieldname, $alternatevalue=null)
4704
-	{
4705
-		global $conf, $_POST;
4706
-
4707
-		// If param here has been posted, we use this value first.
4708
-		if (isset($_POST[$fieldname])) return GETPOST($fieldname, 2);
4709
-
4710
-		if (isset($alternatevalue)) return $alternatevalue;
4711
-
4712
-		$newelement=$this->element;
4713
-		if ($newelement == 'facture') $newelement='invoice';
4714
-		if ($newelement == 'commande') $newelement='order';
4715
-		if (empty($newelement))
4716
-		{
4717
-			dol_syslog("Ask a default value using common method getDefaultCreateValueForField on an object with no property ->element defined. Return empty string.", LOG_WARNING);
4718
-			return '';
4719
-		}
4720
-
4721
-		$keyforfieldname=strtoupper($newelement.'_DEFAULT_'.$fieldname);
4722
-		//var_dump($keyforfieldname);
4723
-		if (isset($conf->global->$keyforfieldname)) return $conf->global->$keyforfieldname;
4724
-
4725
-		// TODO Ad here a scan into table llx_overwrite_default with a filter on $this->element and $fieldname
4726
-	}
4727
-
4728
-
4729
-	/* For triggers */
1534
+        dol_syslog(get_class($this)."::".__FUNCTION__."", LOG_DEBUG);
1535
+        $resql = $this->db->query($sql);
1536
+        if ($resql)
1537
+        {
1538
+            if ($trigkey)
1539
+            {
1540
+                // call trigger with updated object values
1541
+                if (empty($this->fields) && method_exists($this, 'fetch'))
1542
+                {
1543
+                    $result = $this->fetch($id);
1544
+                }
1545
+                else
1546
+                {
1547
+                    $result = $this->fetchCommon($id);
1548
+                }
1549
+                if ($result >= 0) $result=$this->call_trigger($trigkey, (! empty($fuser) && is_object($fuser)) ? $fuser : $user);   // This may set this->errors
1550
+                if ($result < 0) $error++;
1551
+            }
4730 1552
 
1553
+            if (! $error)
1554
+            {
1555
+                if (property_exists($this, $field)) $this->$field = $value;
1556
+                $this->db->commit();
1557
+                return 1;
1558
+            }
1559
+            else
1560
+            {
1561
+                $this->db->rollback();
1562
+                return -2;
1563
+            }
1564
+        }
1565
+        else
1566
+        {
1567
+            $this->error=$this->db->lasterror();
1568
+            $this->db->rollback();
1569
+            return -1;
1570
+        }
1571
+    }
4731 1572
 
4732 1573
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
4733
-	/**
4734
-	 * Call trigger based on this instance.
4735
-	 * Some context information may also be provided into array property this->context.
4736
-	 * NB:  Error from trigger are stacked in interface->errors
4737
-	 * NB2: If return code of triggers are < 0, action calling trigger should cancel all transaction.
4738
-	 *
4739
-	 * @param   string    $trigger_name   trigger's name to execute
4740
-	 * @param   User      $user           Object user
4741
-	 * @return  int                       Result of run_triggers
4742
-	 */
4743
-	function call_trigger($trigger_name, $user)
4744
-	{
1574
+    /**
1575
+     *      Load properties id_previous and id_next by comparing $fieldid with $this->ref
1576
+     *
1577
+     *      @param	string	$filter		Optional filter. Example: " AND (t.field1 = 'aa' OR t.field2 = 'bb')"
1578
+     *	 	@param  string	$fieldid   	Name of field to use for the select MAX and MIN
1579
+     *		@param	int		$nodbprefix	Do not include DB prefix to forge table name
1580
+     *      @return int         		<0 if KO, >0 if OK
1581
+     */
1582
+    function load_previous_next_ref($filter, $fieldid, $nodbprefix=0)
1583
+    {
4745 1584
         // phpcs:enable
4746
-		global $langs,$conf;
1585
+        global $conf, $user;
4747 1586
 
4748
-		include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php';
4749
-		$interface=new Interfaces($this->db);
4750
-		$result=$interface->run_triggers($trigger_name,$this,$user,$langs,$conf);
1587
+        if (! $this->table_element)
1588
+        {
1589
+            dol_print_error('',get_class($this)."::load_previous_next_ref was called on objet with property table_element not defined");
1590
+            return -1;
1591
+        }
1592
+        if ($fieldid == 'none') return 1;
4751 1593
 
4752
-		if ($result < 0)
4753
-		{
4754
-			if (!empty($this->errors))
4755
-			{
4756
-				$this->errors=array_unique(array_merge($this->errors,$interface->errors));   // We use array_unique because when a trigger call another trigger on same object, this->errors is added twice.
4757
-			}
4758
-			else
4759
-			{
4760
-				$this->errors=$interface->errors;
4761
-			}
4762
-		}
4763
-		return $result;
4764
-	}
1594
+        // Security on socid
1595
+        $socid = 0;
1596
+        if ($user->societe_id > 0) $socid = $user->societe_id;
4765 1597
 
1598
+        // this->ismultientitymanaged contains
1599
+        // 0=No test on entity, 1=Test with field entity, 2=Test with link by societe
1600
+        $alias = 's';
1601
+        if ($this->element == 'societe') $alias = 'te';
4766 1602
 
4767
-	/* Functions for extrafields */
1603
+        $sql = "SELECT MAX(te.".$fieldid.")";
1604
+        $sql.= " FROM ".(empty($nodbprefix)?MAIN_DB_PREFIX:'').$this->table_element." as te";
1605
+        if ($this->element == 'user' && ! empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE)) {
1606
+            $sql.= ",".MAIN_DB_PREFIX."usergroup_user as ug";
1607
+        }
1608
+        if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 2) $sql.= ", ".MAIN_DB_PREFIX."societe as s";	// If we need to link to societe to limit select to entity
1609
+        else if ($this->restrictiononfksoc == 1 && $this->element != 'societe' && !$user->rights->societe->client->voir && !$socid) $sql.= ", ".MAIN_DB_PREFIX."societe as s";	// If we need to link to societe to limit select to socid
1610
+        else if ($this->restrictiononfksoc == 2 && $this->element != 'societe' && !$user->rights->societe->client->voir && !$socid) $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON te.fk_soc = s.rowid";	// If we need to link to societe to limit select to socid
1611
+        if ($this->restrictiononfksoc && !$user->rights->societe->client->voir && !$socid)  $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."societe_commerciaux as sc ON ".$alias.".rowid = sc.fk_soc";
1612
+        $sql.= " WHERE te.".$fieldid." < '".$this->db->escape($this->ref)."'";  // ->ref must always be defined (set to id if field does not exists)
1613
+        if ($this->restrictiononfksoc == 1 && !$user->rights->societe->client->voir && !$socid) $sql.= " AND sc.fk_user = " .$user->id;
1614
+        if ($this->restrictiononfksoc == 2 && !$user->rights->societe->client->voir && !$socid) $sql.= " AND (sc.fk_user = " .$user->id.' OR te.fk_soc IS NULL)';
1615
+        if (! empty($filter))
1616
+        {
1617
+            if (! preg_match('/^\s*AND/i', $filter)) $sql.=" AND ";   // For backward compatibility
1618
+            $sql.=$filter;
1619
+        }
1620
+        if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 2) $sql.= ' AND te.fk_soc = s.rowid';			// If we need to link to societe to limit select to entity
1621
+        else if ($this->restrictiononfksoc == 1 && $this->element != 'societe' && !$user->rights->societe->client->voir && !$socid) $sql.= ' AND te.fk_soc = s.rowid';			// If we need to link to societe to limit select to socid
1622
+        if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) {
1623
+            if ($this->element == 'user' && ! empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE)) {
1624
+                if (! empty($user->admin) && empty($user->entity) && $conf->entity == 1) {
1625
+                    $sql.= " AND te.entity IS NOT NULL"; // Show all users
1626
+                } else {
1627
+                    $sql.= " AND ug.fk_user = te.rowid";
1628
+                    $sql.= " AND ug.entity IN (".getEntity($this->element).")";
1629
+                }
1630
+            } else {
1631
+                $sql.= ' AND te.entity IN ('.getEntity($this->element).')';
1632
+            }
1633
+        }
1634
+        if ($this->restrictiononfksoc == 1 && $socid && $this->element != 'societe') $sql.= ' AND te.fk_soc = ' . $socid;
1635
+        if ($this->restrictiononfksoc == 2 && $socid && $this->element != 'societe') $sql.= ' AND (te.fk_soc = ' . $socid.' OR te.fk_soc IS NULL)';
1636
+        if ($this->restrictiononfksoc && $socid && $this->element == 'societe') $sql.= ' AND te.rowid = ' . $socid;
1637
+        //print 'socid='.$socid.' restrictiononfksoc='.$this->restrictiononfksoc.' ismultientitymanaged = '.$this->ismultientitymanaged.' filter = '.$filter.' -> '.$sql."<br>";
4768 1638
 
1639
+        $result = $this->db->query($sql);
1640
+        if (! $result)
1641
+        {
1642
+            $this->error=$this->db->lasterror();
1643
+            return -1;
1644
+        }
1645
+        $row = $this->db->fetch_row($result);
1646
+        $this->ref_previous = $row[0];
4769 1647
 
4770
-    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
4771
-	/**
4772
-	 *  Function to get extra fields of an object into $this->array_options
4773
-	 *  This method is in most cases called by method fetch of objects but you can call it separately.
4774
-	 *
4775
-	 *  @param	int		$rowid			Id of line. Use the id of object if not defined. Deprecated. Function must be called without parameters.
4776
-	 *  @param  array	$optionsArray   Array resulting of call of extrafields->fetch_name_optionals_label(). Deprecated. Function must be called without parameters.
4777
-	 *  @return	int						<0 if error, 0 if no values of extrafield to find nor found, 1 if an attribute is found and value loaded
4778
-	 */
4779
-	function fetch_optionals($rowid=null, $optionsArray=null)
4780
-	{
4781
-        // phpcs:enable
4782
-		if (empty($rowid)) $rowid=$this->id;
4783
-
4784
-		// To avoid SQL errors. Probably not the better solution though
4785
-		if (!$this->table_element) {
4786
-			return 0;
4787
-		}
4788
-
4789
-		$this->array_options=array();
4790
-
4791
-		if (! is_array($optionsArray))
4792
-		{
4793
-			// If $extrafields is not a known object, we initialize it. Best practice is to have $extrafields defined into card.php or list.php page.
4794
-			// TODO Use of existing $extrafield is not yet ready (must mutualize code that use extrafields in form first)
4795
-			// global $extrafields;
4796
-			//if (! is_object($extrafields))
4797
-			//{
4798
-				require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
4799
-				$extrafields = new ExtraFields($this->db);
4800
-			//}
4801
-
4802
-			// Load array of extrafields for elementype = $this->table_element
4803
-			if (empty($extrafields->attributes[$this->table_element]['loaded']))
4804
-			{
4805
-				$extrafields->fetch_name_optionals_label($this->table_element);
4806
-			}
4807
-			$optionsArray = (! empty($extrafields->attributes[$this->table_element]['label'])?$extrafields->attributes[$this->table_element]['label']:null);
4808
-		}
4809
-		else
4810
-		{
4811
-			global $extrafields;
4812
-			dol_syslog("Warning: fetch_optionals was called with param optionsArray defined when you should pass null now", LOG_WARNING);
4813
-		}
4814
-
4815
-		$table_element = $this->table_element;
4816
-		if ($table_element == 'categorie') $table_element = 'categories'; // For compatibility
4817
-
4818
-		// Request to get complementary values
4819
-		if (is_array($optionsArray) && count($optionsArray) > 0)
4820
-		{
4821
-			$sql = "SELECT rowid";
4822
-			foreach ($optionsArray as $name => $label)
4823
-			{
4824
-				if (empty($extrafields->attributes[$this->table_element]['type'][$name]) || $extrafields->attributes[$this->table_element]['type'][$name] != 'separate')
4825
-				{
4826
-					$sql.= ", ".$name;
4827
-				}
4828
-			}
4829
-			$sql.= " FROM ".MAIN_DB_PREFIX.$table_element."_extrafields";
4830
-			$sql.= " WHERE fk_object = ".$rowid;
4831 1648
 
4832
-			//dol_syslog(get_class($this)."::fetch_optionals get extrafields data for ".$this->table_element, LOG_DEBUG);		// Too verbose
4833
-			$resql=$this->db->query($sql);
4834
-			if ($resql)
4835
-			{
4836
-				$this->array_options = array();
4837
-				$numrows=$this->db->num_rows($resql);
4838
-				if ($numrows)
4839
-				{
4840
-					$tab = $this->db->fetch_array($resql);
4841
-
4842
-					foreach ($tab as $key => $value)
4843
-					{
4844
-						// Test fetch_array ! is_int($key) because fetch_array result is a mix table with Key as alpha and Key as int (depend db engine)
4845
-						if ($key != 'rowid' && $key != 'tms' && $key != 'fk_member' && ! is_int($key))
4846
-						{
4847
-							// we can add this attribute to object
4848
-							if (! empty($extrafields) && in_array($extrafields->attributes[$this->table_element]['type'][$key], array('date','datetime')))
4849
-							{
4850
-								//var_dump($extrafields->attributes[$this->table_element]['type'][$key]);
4851
-								$this->array_options["options_".$key]=$this->db->jdate($value);
4852
-							}
4853
-							else
4854
-							{
4855
-								$this->array_options["options_".$key]=$value;
4856
-							}
1649
+        $sql = "SELECT MIN(te.".$fieldid.")";
1650
+        $sql.= " FROM ".(empty($nodbprefix)?MAIN_DB_PREFIX:'').$this->table_element." as te";
1651
+        if ($this->element == 'user' && ! empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE)) {
1652
+            $sql.= ",".MAIN_DB_PREFIX."usergroup_user as ug";
1653
+        }
1654
+        if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 2) $sql.= ", ".MAIN_DB_PREFIX."societe as s";	// If we need to link to societe to limit select to entity
1655
+        else if ($this->restrictiononfksoc == 1 && $this->element != 'societe' && !$user->rights->societe->client->voir && !$socid) $sql.= ", ".MAIN_DB_PREFIX."societe as s";	// If we need to link to societe to limit select to socid
1656
+        else if ($this->restrictiononfksoc == 2 && $this->element != 'societe' && !$user->rights->societe->client->voir && !$socid) $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON te.fk_soc = s.rowid";	// If we need to link to societe to limit select to socid
1657
+        if ($this->restrictiononfksoc && !$user->rights->societe->client->voir && !$socid) $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."societe_commerciaux as sc ON ".$alias.".rowid = sc.fk_soc";
1658
+        $sql.= " WHERE te.".$fieldid." > '".$this->db->escape($this->ref)."'";  // ->ref must always be defined (set to id if field does not exists)
1659
+        if ($this->restrictiononfksoc == 1 && !$user->rights->societe->client->voir && !$socid) $sql.= " AND sc.fk_user = " .$user->id;
1660
+        if ($this->restrictiononfksoc == 2 && !$user->rights->societe->client->voir && !$socid) $sql.= " AND (sc.fk_user = " .$user->id.' OR te.fk_soc IS NULL)';
1661
+        if (! empty($filter))
1662
+        {
1663
+            if (! preg_match('/^\s*AND/i', $filter)) $sql.=" AND ";   // For backward compatibility
1664
+            $sql.=$filter;
1665
+        }
1666
+        if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 2) $sql.= ' AND te.fk_soc = s.rowid';			// If we need to link to societe to limit select to entity
1667
+        else if ($this->restrictiononfksoc == 1 && $this->element != 'societe' && !$user->rights->societe->client->voir && !$socid) $sql.= ' AND te.fk_soc = s.rowid';			// If we need to link to societe to limit select to socid
1668
+        if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) {
1669
+            if ($this->element == 'user' && ! empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE)) {
1670
+                if (! empty($user->admin) && empty($user->entity) && $conf->entity == 1) {
1671
+                    $sql.= " AND te.entity IS NOT NULL"; // Show all users
1672
+                } else {
1673
+                    $sql.= " AND ug.fk_user = te.rowid";
1674
+                    $sql.= " AND ug.entity IN (".getEntity($this->element).")";
1675
+                }
1676
+            } else {
1677
+                $sql.= ' AND te.entity IN ('.getEntity($this->element).')';
1678
+            }
1679
+        }
1680
+        if ($this->restrictiononfksoc == 1 && $socid && $this->element != 'societe') $sql.= ' AND te.fk_soc = ' . $socid;
1681
+        if ($this->restrictiononfksoc == 2 && $socid && $this->element != 'societe') $sql.= ' AND (te.fk_soc = ' . $socid.' OR te.fk_soc IS NULL)';
1682
+        if ($this->restrictiononfksoc && $socid && $this->element == 'societe') $sql.= ' AND te.rowid = ' . $socid;
1683
+        //print 'socid='.$socid.' restrictiononfksoc='.$this->restrictiononfksoc.' ismultientitymanaged = '.$this->ismultientitymanaged.' filter = '.$filter.' -> '.$sql."<br>";
1684
+        // Rem: Bug in some mysql version: SELECT MIN(rowid) FROM llx_socpeople WHERE rowid > 1 when one row in database with rowid=1, returns 1 instead of null
1685
+
1686
+        $result = $this->db->query($sql);
1687
+        if (! $result)
1688
+        {
1689
+            $this->error=$this->db->lasterror();
1690
+            return -2;
1691
+        }
1692
+        $row = $this->db->fetch_row($result);
1693
+        $this->ref_next = $row[0];
4857 1694
 
4858
-							//var_dump('key '.$key.' '.$value.' type='.$extrafields->attributes[$this->table_element]['type'][$key].' '.$this->array_options["options_".$key]);
4859
-						}
4860
-					}
4861
-				}
1695
+        return 1;
1696
+    }
4862 1697
 
4863
-				$this->db->free($resql);
4864 1698
 
4865
-				if ($numrows) return $numrows;
4866
-				else return 0;
4867
-			}
4868
-			else
4869
-			{
4870
-				dol_print_error($this->db);
4871
-				return -1;
4872
-			}
4873
-		}
4874
-		return 0;
4875
-	}
4876
-
4877
-	/**
4878
-	 *	Delete all extra fields values for the current object.
4879
-	 *
4880
-	 *  @return	int		<0 if KO, >0 if OK
4881
-	 */
4882
-	function deleteExtraFields()
4883
-	{
4884
-		$this->db->begin();
4885
-
4886
-		$table_element = $this->table_element;
4887
-		if ($table_element == 'categorie') $table_element = 'categories'; // For compatibility
4888
-
4889
-		$sql_del = "DELETE FROM ".MAIN_DB_PREFIX.$table_element."_extrafields WHERE fk_object = ".$this->id;
4890
-		dol_syslog(get_class($this)."::deleteExtraFields delete", LOG_DEBUG);
4891
-		$resql=$this->db->query($sql_del);
4892
-		if (! $resql)
4893
-		{
4894
-			$this->error=$this->db->lasterror();
4895
-			$this->db->rollback();
4896
-			return -1;
4897
-		}
4898
-		else
4899
-		{
4900
-			$this->db->commit();
4901
-			return 1;
4902
-		}
4903
-	}
4904
-
4905
-	/**
4906
-	 *	Add/Update all extra fields values for the current object.
4907
-	 *  Data to describe values to insert/update are stored into $this->array_options=array('options_codeforfield1'=>'valueforfield1', 'options_codeforfield2'=>'valueforfield2', ...)
4908
-	 *  This function delete record with all extrafields and insert them again from the array $this->array_options.
4909
-	 *
4910
-	 *  @param	string		$trigger		If defined, call also the trigger (for example COMPANY_MODIFY)
4911
-	 *  @param	User		$userused		Object user
4912
-	 *  @return int 						-1=error, O=did nothing, 1=OK
4913
-	 *  @see updateExtraField, setValueFrom
4914
-	 */
4915
-	function insertExtraFields($trigger='', $userused=null)
4916
-	{
4917
-		global $conf,$langs,$user;
4918
-
4919
-		if (empty($userused)) $userused=$user;
4920
-
4921
-		$error=0;
4922
-
4923
-		if (! empty($conf->global->MAIN_EXTRAFIELDS_DISABLED)) return 0;	// For avoid conflicts if trigger used
4924
-
4925
-		if (! empty($this->array_options))
4926
-		{
4927
-			// Check parameters
4928
-			$langs->load('admin');
4929
-			require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
4930
-			$extrafields = new ExtraFields($this->db);
4931
-			$target_extrafields=$extrafields->fetch_name_optionals_label($this->table_element);
4932
-
4933
-			//Eliminate copied source object extra_fields that do not exist in target object
4934
-			$new_array_options=array();
4935
-			foreach ($this->array_options as $key => $value) {
4936
-				if (in_array(substr($key,8), array_keys($target_extrafields)))	// We remove the 'options_' from $key for test
4937
-					$new_array_options[$key] = $value;
4938
-				elseif (in_array($key, array_keys($target_extrafields)))		// We test on $key that does not contains the 'options_' prefix
4939
-					$new_array_options['options_'.$key] = $value;
4940
-			}
4941
-
4942
-			foreach($new_array_options as $key => $value)
4943
-			{
4944
-			   	$attributeKey      = substr($key,8);   // Remove 'options_' prefix
4945
-			   	$attributeType     = $extrafields->attributes[$this->table_element]['type'][$attributeKey];
4946
-			   	$attributeLabel    = $extrafields->attributes[$this->table_element]['label'][$attributeKey];
4947
-			   	$attributeParam    = $extrafields->attributes[$this->table_element]['param'][$attributeKey];
4948
-			   	$attributeRequired = $extrafields->attributes[$this->table_element]['required'][$attributeKey];
4949
-
4950
-			   	if ($attributeRequired)
4951
-			   	{
4952
-			   		$mandatorypb=false;
4953
-			   		if ($attributeType == 'link' && $this->array_options[$key] == '-1') $mandatorypb=true;
4954
-			   		if ($this->array_options[$key] === '') $mandatorypb=true;
4955
-			   		if ($mandatorypb)
4956
-			   		{
4957
-			   			dol_syslog($this->error);
4958
-			   			$this->errors[]=$langs->trans('ErrorFieldRequired', $attributeLabel);
4959
-			   			return -1;
4960
-			   		}
4961
-			   	}
4962
-
4963
-				//dol_syslog("attributeLabel=".$attributeLabel, LOG_DEBUG);
4964
-				//dol_syslog("attributeType=".$attributeType, LOG_DEBUG);
4965
-
4966
-			   	switch ($attributeType)
4967
-			   	{
4968
-			   		case 'int':
4969
-			  			if (!is_numeric($value) && $value!='')
4970
-			   			{
4971
-			   				$this->errors[]=$langs->trans("ExtraFieldHasWrongValue", $attributeLabel);
4972
-			   				return -1;
4973
-			  			}
4974
-			   			elseif ($value=='')
4975
-			   			{
4976
-			   				$new_array_options[$key] = null;
4977
-			   			}
4978
-			 			break;
4979
-					case 'double':
4980
-						$value = price2num($value);
4981
-						if (!is_numeric($value) && $value!='')
4982
-						{
4983
-							dol_syslog($langs->trans("ExtraFieldHasWrongValue")." sur ".$attributeLabel."(".$value."is not '".$attributeType."')", LOG_DEBUG);
4984
-							$this->errors[]=$langs->trans("ExtraFieldHasWrongValue", $attributeLabel);
4985
-							return -1;
4986
-						}
4987
-						elseif ($value=='')
4988
-						{
4989
-							$new_array_options[$key] = null;
4990
-						}
4991
-						//dol_syslog("double value"." sur ".$attributeLabel."(".$value." is '".$attributeType."')", LOG_DEBUG);
4992
-						$new_array_options[$key] = $value;
4993
-						break;
4994
-			 		/*case 'select':	// Not required, we chosed value='0' for undefined values
4995
-             			if ($value=='-1')
4996
-             			{
4997
-             				$this->array_options[$key] = null;
4998
-             			}
4999
-             			break;*/
5000
-			   		case 'password':
5001
-			   			$algo='';
5002
-			   			if ($this->array_options[$key] != '' && is_array($extrafields->attributes[$this->table_element]['param'][$attributeKey]['options']))
5003
-			   			{
5004
-			   				// If there is an encryption choice, we use it to crypt data before insert
5005
-			   				$tmparrays = array_keys($extrafields->attributes[$this->table_element]['param'][$attributeKey]['options']);
5006
-			   				$algo=reset($tmparrays);
5007
-			   				if ($algo != '')
5008
-			   				{
5009
-			   					//global $action;		// $action may be 'create', 'update', 'update_extras'...
5010
-			   					//var_dump($action);
5011
-			   					//var_dump($this->oldcopy);exit;
5012
-			   					if (is_object($this->oldcopy))		// If this->oldcopy is not defined, we can't know if we change attribute or not, so we must keep value
5013
-			   					{
5014
-			   						//var_dump($this->oldcopy->array_options[$key]); var_dump($this->array_options[$key]);
5015
-				   					if ($this->array_options[$key] == $this->oldcopy->array_options[$key])	// If old value crypted in database is same than submited new value, it means we don't change it, so we don't update.
5016
-				   					{
5017
-				   						$new_array_options[$key] = $this->array_options[$key];	// Value is kept
5018
-				   					}
5019
-									else
5020
-									{
5021
-										// var_dump($algo);
5022
-										$newvalue = dol_hash($this->array_options[$key], $algo);
5023
-										$new_array_options[$key] = $newvalue;
5024
-									}
5025
-			   					}
5026
-			   					else
5027
-			   					{
5028
-			   						$new_array_options[$key] = $this->array_options[$key];	// Value is kept
5029
-			   					}
5030
-			   				}
5031
-			   			}
5032
-			   			else	// Common usage
5033
-			   			{
5034
-			   				$new_array_options[$key] = $this->array_options[$key];
5035
-			   			}
5036
-			   			break;
5037
-			   		case 'price':
5038
-						$new_array_options[$key] = price2num($this->array_options[$key]);
5039
-						break;
5040
-					case 'date':
5041
-						$new_array_options[$key] = $this->db->idate($this->array_options[$key]);
5042
-						break;
5043
-					case 'datetime':
5044
-						// If data is a string instead of a timestamp, we convert it
5045
-						if (! is_int($this->array_options[$key])) {
5046
-							$this->array_options[$key] = strtotime($this->array_options[$key]);
5047
-						}
5048
-						$new_array_options[$key] = $this->db->idate($this->array_options[$key]);
5049
-						break;
5050
-		   			case 'link':
5051
-						$param_list=array_keys($attributeParam['options']);
5052
-						// 0 : ObjectName
5053
-						// 1 : classPath
5054
-						$InfoFieldList = explode(":", $param_list[0]);
5055
-						dol_include_once($InfoFieldList[1]);
5056
-						if ($InfoFieldList[0] && class_exists($InfoFieldList[0]))
5057
-						{
5058
-							if ($value == '-1')	// -1 is key for no defined in combo list of objects
5059
-							{
5060
-								$new_array_options[$key]='';
5061
-							}
5062
-							elseif ($value)
5063
-							{
5064
-								$object = new $InfoFieldList[0]($this->db);
5065
-								if (is_numeric($value)) $res=$object->fetch($value);
5066
-								else $res=$object->fetch('',$value);
5067
-
5068
-								if ($res > 0) $new_array_options[$key]=$object->id;
5069
-								else
5070
-								{
5071
-									$this->error="Id/Ref '".$value."' for object '".$object->element."' not found";
5072
-									$this->db->rollback();
5073
-									return -1;
5074
-								}
5075
-							}
5076
-						}
5077
-						else
5078
-						{
5079
-							dol_syslog('Error bad setup of extrafield', LOG_WARNING);
5080
-						}
5081
-						break;
5082
-			   	}
5083
-			}
1699
+    /**
1700
+     *      Return list of id of contacts of object
1701
+     *
1702
+     *      @param	string	$source     Source of contact: external (llx_socpeople) or internal (llx_user) or thirdparty (llx_societe)
1703
+     *      @return array				Array of id of contacts (if source=external or internal)
1704
+     * 									Array of id of third parties with at least one contact on object (if source=thirdparty)
1705
+     */
1706
+    function getListContactId($source='external')
1707
+    {
1708
+        $contactAlreadySelected = array();
1709
+        $tab = $this->liste_contact(-1,$source);
1710
+        $num=count($tab);
1711
+        $i = 0;
1712
+        while ($i < $num)
1713
+        {
1714
+            if ($source == 'thirdparty') $contactAlreadySelected[$i] = $tab[$i]['socid'];
1715
+            else  $contactAlreadySelected[$i] = $tab[$i]['id'];
1716
+            $i++;
1717
+        }
1718
+        return $contactAlreadySelected;
1719
+    }
5084 1720
 
5085
-			$this->db->begin();
5086 1721
 
5087
-			$table_element = $this->table_element;
5088
-			if ($table_element == 'categorie') $table_element = 'categories'; // For compatibility
1722
+    /**
1723
+     *	Link element with a project
1724
+     *
1725
+     *	@param     	int		$projectid		Project id to link element to
1726
+     *	@return		int						<0 if KO, >0 if OK
1727
+     */
1728
+    function setProject($projectid)
1729
+    {
1730
+        if (! $this->table_element)
1731
+        {
1732
+            dol_syslog(get_class($this)."::setProject was called on objet with property table_element not defined",LOG_ERR);
1733
+            return -1;
1734
+        }
5089 1735
 
5090
-			$sql_del = "DELETE FROM ".MAIN_DB_PREFIX.$table_element."_extrafields WHERE fk_object = ".$this->id;
5091
-			dol_syslog(get_class($this)."::insertExtraFields delete", LOG_DEBUG);
5092
-			$this->db->query($sql_del);
1736
+        $sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
1737
+        if ($this->table_element == 'actioncomm')
1738
+        {
1739
+            if ($projectid) $sql.= ' SET fk_project = '.$projectid;
1740
+            else $sql.= ' SET fk_project = NULL';
1741
+            $sql.= ' WHERE id = '.$this->id;
1742
+        }
1743
+        else
1744
+        {
1745
+            if ($projectid) $sql.= ' SET fk_projet = '.$projectid;
1746
+            else $sql.= ' SET fk_projet = NULL';
1747
+            $sql.= ' WHERE rowid = '.$this->id;
1748
+        }
5093 1749
 
5094
-			$sql = "INSERT INTO ".MAIN_DB_PREFIX.$table_element."_extrafields (fk_object";
5095
-			foreach($new_array_options as $key => $value)
5096
-			{
5097
-				$attributeKey = substr($key,8);   // Remove 'options_' prefix
5098
-				// Add field of attribut
5099
-				if ($extrafields->attributes[$this->table_element]['type'][$attributeKey] != 'separate') // Only for other type than separator
5100
-					$sql.=",".$attributeKey;
5101
-			}
5102
-			$sql .= ") VALUES (".$this->id;
5103
-
5104
-			foreach($new_array_options as $key => $value)
5105
-			{
5106
-				$attributeKey = substr($key,8);   // Remove 'options_' prefix
5107
-				// Add field of attribute
5108
-				if ($extrafields->attributes[$this->table_element]['type'][$attributeKey] != 'separate') // Only for other type than separator)
5109
-				{
5110
-					if ($new_array_options[$key] != '')
5111
-					{
5112
-						$sql.=",'".$this->db->escape($new_array_options[$key])."'";
5113
-					}
5114
-					else
5115
-					{
5116
-						$sql.=",null";
5117
-					}
5118
-				}
5119
-			}
5120
-			$sql.=")";
1750
+        dol_syslog(get_class($this)."::setProject", LOG_DEBUG);
1751
+        if ($this->db->query($sql))
1752
+        {
1753
+            $this->fk_project = $projectid;
1754
+            return 1;
1755
+        }
1756
+        else
1757
+        {
1758
+            dol_print_error($this->db);
1759
+            return -1;
1760
+        }
1761
+    }
5121 1762
 
5122
-			dol_syslog(get_class($this)."::insertExtraFields insert", LOG_DEBUG);
5123
-			$resql = $this->db->query($sql);
5124
-			if (! $resql)
5125
-			{
5126
-				$this->error=$this->db->lasterror();
5127
-				$error++;
5128
-			}
1763
+    /**
1764
+     *  Change the payments methods
1765
+     *
1766
+     *  @param		int		$id		Id of new payment method
1767
+     *  @return		int				>0 if OK, <0 if KO
1768
+     */
1769
+    function setPaymentMethods($id)
1770
+    {
1771
+        dol_syslog(get_class($this).'::setPaymentMethods('.$id.')');
1772
+        if ($this->statut >= 0 || $this->element == 'societe')
1773
+        {
1774
+            // TODO uniformize field name
1775
+            $fieldname = 'fk_mode_reglement';
1776
+            if ($this->element == 'societe') $fieldname = 'mode_reglement';
1777
+            if (get_class($this) == 'Fournisseur') $fieldname = 'mode_reglement_supplier';
5129 1778
 
5130
-			if (! $error && $trigger)
5131
-			{
5132
-				// Call trigger
5133
-				$this->context=array('extrafieldaddupdate'=>1);
5134
-				$result=$this->call_trigger($trigger, $userused);
5135
-				if ($result < 0) $error++;
5136
-				// End call trigger
5137
-			}
5138
-
5139
-			if ($error)
5140
-			{
5141
-				$this->db->rollback();
5142
-				return -1;
5143
-			}
5144
-			else
5145
-			{
5146
-				$this->db->commit();
5147
-				return 1;
5148
-			}
5149
-		}
5150
-		else return 0;
5151
-	}
5152
-
5153
-	/**
5154
-	 *	Update an extra field value for the current object.
5155
-	 *  Data to describe values to update are stored into $this->array_options=array('options_codeforfield1'=>'valueforfield1', 'options_codeforfield2'=>'valueforfield2', ...)
5156
-	 *
5157
-	 *  @param  string      $key    		Key of the extrafield (without starting 'options_')
5158
-	 *  @param	string		$trigger		If defined, call also the trigger (for example COMPANY_MODIFY)
5159
-	 *  @param	User		$userused		Object user
5160
-	 *  @return int                 		-1=error, O=did nothing, 1=OK
5161
-	 *  @see setValueFrom, insertExtraFields
5162
-	 */
5163
-	function updateExtraField($key, $trigger=null, $userused=null)
5164
-	{
5165
-		global $conf,$langs,$user;
5166
-
5167
-		if (empty($userused)) $userused=$user;
5168
-
5169
-		$error=0;
5170
-
5171
-		if (! empty($conf->global->MAIN_EXTRAFIELDS_DISABLED)) return 0;	// For avoid conflicts if trigger used
5172
-
5173
-		if (! empty($this->array_options) && isset($this->array_options["options_".$key]))
5174
-		{
5175
-			// Check parameters
5176
-			$langs->load('admin');
5177
-			require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
5178
-			$extrafields = new ExtraFields($this->db);
5179
-			$target_extrafields=$extrafields->fetch_name_optionals_label($this->table_element);
5180
-
5181
-			$value=$this->array_options["options_".$key];
5182
-
5183
-			$attributeType     = $extrafields->attributes[$this->table_element]['type'][$key];
5184
-			$attributeLabel    = $extrafields->attributes[$this->table_element]['label'][$key];
5185
-			$attributeParam    = $extrafields->attributes[$this->table_element]['param'][$key];
5186
-			$attributeRequired = $extrafields->attributes[$this->table_element]['required'][$key];
5187
-
5188
-			//dol_syslog("attributeLabel=".$attributeLabel, LOG_DEBUG);
5189
-			//dol_syslog("attributeType=".$attributeType, LOG_DEBUG);
5190
-
5191
-			switch ($attributeType)
5192
-			{
5193
-				case 'int':
5194
-					if (!is_numeric($value) && $value!='')
5195
-					{
5196
-						$this->errors[]=$langs->trans("ExtraFieldHasWrongValue",$attributeLabel);
5197
-						return -1;
5198
-					}
5199
-					elseif ($value=='')
5200
-					{
5201
-						$this->array_options["options_".$key] = null;
5202
-					}
5203
-					break;
5204
-				case 'double':
5205
-					$value = price2num($value);
5206
-					if (!is_numeric($value) && $value!='')
5207
-					{
5208
-						dol_syslog($langs->trans("ExtraFieldHasWrongValue")." sur ".$attributeLabel."(".$value."is not '".$attributeType."')", LOG_DEBUG);
5209
-						$this->errors[]=$langs->trans("ExtraFieldHasWrongValue", $attributeLabel);
5210
-						return -1;
5211
-					}
5212
-					elseif ($value=='')
5213
-					{
5214
-						$this->array_options["options_".$key] = null;
5215
-					}
5216
-					//dol_syslog("double value"." sur ".$attributeLabel."(".$value." is '".$attributeType."')", LOG_DEBUG);
5217
-					$this->array_options["options_".$key] = $value;
5218
-					break;
5219
-			 	/*case 'select':	// Not required, we chosed value='0' for undefined values
5220
-             		if ($value=='-1')
5221
-             		{
5222
-             			$this->array_options[$key] = null;
5223
-             		}
5224
-             		break;*/
5225
-				case 'price':
5226
-					$this->array_options["options_".$key] = price2num($this->array_options["options_".$key]);
5227
-					break;
5228
-				case 'date':
5229
-					$this->array_options["options_".$key]=$this->db->idate($this->array_options["options_".$key]);
5230
-					break;
5231
-				case 'datetime':
5232
-					$this->array_options["options_".$key]=$this->db->idate($this->array_options["options_".$key]);
5233
-					break;
5234
-				case 'link':
5235
-					$param_list=array_keys($attributeParam['options']);
5236
-					// 0 : ObjectName
5237
-					// 1 : classPath
5238
-					$InfoFieldList = explode(":", $param_list[0]);
5239
-					dol_include_once($InfoFieldList[1]);
5240
-					if ($value)
5241
-					{
5242
-						$object = new $InfoFieldList[0]($this->db);
5243
-						$object->fetch(0,$value);
5244
-						$this->array_options["options_".$key]=$object->id;
5245
-					}
5246
-					break;
5247
-			}
5248
-
5249
-			$this->db->begin();
5250
-			$sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element."_extrafields SET ".$key."='".$this->db->escape($this->array_options["options_".$key])."'";
5251
-			$sql .= " WHERE fk_object = ".$this->id;
5252
-			$resql = $this->db->query($sql);
5253
-			if (! $resql)
5254
-			{
5255
-				$error++;
5256
-				$this->error=$this->db->lasterror();
5257
-			}
1779
+            $sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
1780
+            $sql .= ' SET '.$fieldname.' = '.$id;
1781
+            $sql .= ' WHERE rowid='.$this->id;
5258 1782
 
5259
-			if (! $error && $trigger)
5260
-			{
5261
-				// Call trigger
5262
-				$this->context=array('extrafieldupdate'=>1);
5263
-				$result=$this->call_trigger($trigger, $userused);
5264
-				if ($result < 0) $error++;
5265
-				// End call trigger
5266
-			}
5267
-
5268
-			if ($error)
5269
-			{
5270
-				dol_syslog(get_class($this) . "::".__METHOD__ . $this->error, LOG_ERR);
5271
-				$this->db->rollback();
5272
-				return -1;
5273
-			}
5274
-			else
5275
-			{
5276
-				$this->db->commit();
5277
-				return 1;
5278
-			}
5279
-		}
5280
-		else return 0;
5281
-	}
5282
-
5283
-
5284
-	/**
5285
-	 * Return HTML string to put an input field into a page
5286
-	 * Code very similar with showInputField of extra fields
5287
-	 *
5288
-	 * @param  array   		$val	       Array of properties for field to show
5289
-	 * @param  string  		$key           Key of attribute
5290
-	 * @param  string  		$value         Preselected value to show (for date type it must be in timestamp format, for amount or price it must be a php numeric value)
5291
-	 * @param  string  		$moreparam     To add more parameters on html input tag
5292
-	 * @param  string  		$keysuffix     Prefix string to add into name and id of field (can be used to avoid duplicate names)
5293
-	 * @param  string  		$keyprefix     Suffix string to add into name and id of field (can be used to avoid duplicate names)
5294
-	 * @param  string|int		$morecss       Value for css to define style/length of field. May also be a numeric.
5295
-	 * @return string
5296
-	 */
5297
-	function showInputField($val, $key, $value, $moreparam='', $keysuffix='', $keyprefix='', $morecss=0)
5298
-	{
5299
-		global $conf,$langs,$form;
5300
-
5301
-		if (! is_object($form))
5302
-		{
5303
-			require_once DOL_DOCUMENT_ROOT.'/core/class/html.form.class.php';
5304
-			$form=new Form($this->db);
5305
-		}
5306
-
5307
-		$val=$this->fields[$key];
5308
-
5309
-		$out='';
5310
-        $type='';
5311
-        $param = array();
5312
-        $param['options']=array();
5313
-        $size =$this->fields[$key]['size'];
5314
-        // Because we work on extrafields
5315
-        if(preg_match('/^integer:(.*):(.*)/i', $val['type'], $reg)){
5316
-            $param['options']=array($reg[1].':'.$reg[2]=>'N');
5317
-            $type ='link';
5318
-        } elseif(preg_match('/^link:(.*):(.*)/i', $val['type'], $reg)) {
5319
-            $param['options']=array($reg[1].':'.$reg[2]=>'N');
5320
-            $type ='link';
5321
-        } elseif(preg_match('/^sellist:(.*):(.*):(.*):(.*)/i', $val['type'], $reg)) {
5322
-            $param['options']=array($reg[1].':'.$reg[2].':'.$reg[3].':'.$reg[4]=>'N');
5323
-            $type ='sellist';
5324
-        } elseif(preg_match('/varchar\((\d+)\)/', $val['type'],$reg)) {
5325
-            $param['options']=array();
5326
-            $type ='varchar';
5327
-            $size=$reg[1];
5328
-        } elseif(preg_match('/varchar/', $val['type'])) {
5329
-            $param['options']=array();
5330
-            $type ='varchar';
5331
-        } elseif(is_array($this->fields[$key]['arrayofkeyval'])) {
5332
-            $param['options']=$this->fields[$key]['arrayofkeyval'];
5333
-            $type ='select';
5334
-        } else {
5335
-            $param['options']=array();
5336
-            $type =$this->fields[$key]['type'];
1783
+            if ($this->db->query($sql))
1784
+            {
1785
+                $this->mode_reglement_id = $id;
1786
+                // for supplier
1787
+                if (get_class($this) == 'Fournisseur') $this->mode_reglement_supplier_id = $id;
1788
+                return 1;
1789
+            }
1790
+            else
1791
+            {
1792
+                dol_syslog(get_class($this).'::setPaymentMethods Erreur '.$sql.' - '.$this->db->error());
1793
+                $this->error=$this->db->error();
1794
+                return -1;
1795
+            }
5337 1796
         }
1797
+        else
1798
+        {
1799
+            dol_syslog(get_class($this).'::setPaymentMethods, status of the object is incompatible');
1800
+            $this->error='Status of the object is incompatible '.$this->statut;
1801
+            return -2;
1802
+        }
1803
+    }
5338 1804
 
5339
-		$label=$this->fields[$key]['label'];
5340
-		//$elementtype=$this->fields[$key]['elementtype'];	// Seems not used
5341
-		$default=$this->fields[$key]['default'];
5342
-		$computed=$this->fields[$key]['computed'];
5343
-		$unique=$this->fields[$key]['unique'];
5344
-		$required=$this->fields[$key]['required'];
5345
-
5346
-		$langfile=$this->fields[$key]['langfile'];
5347
-		$list=$this->fields[$key]['list'];
5348
-		$hidden=abs($this->fields[$key]['visible'])!=1?1:0;
5349
-
5350
-		$objectid = $this->id;
1805
+    /**
1806
+     *  Change the multicurrency code
1807
+     *
1808
+     *  @param		string	$code	multicurrency code
1809
+     *  @return		int				>0 if OK, <0 if KO
1810
+     */
1811
+    function setMulticurrencyCode($code)
1812
+    {
1813
+        dol_syslog(get_class($this).'::setMulticurrencyCode('.$id.')');
1814
+        if ($this->statut >= 0 || $this->element == 'societe')
1815
+        {
1816
+            $fieldname = 'multicurrency_code';
5351 1817
 
1818
+            $sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
1819
+            $sql .= ' SET '.$fieldname." = '".$this->db->escape($code)."'";
1820
+            $sql .= ' WHERE rowid='.$this->id;
5352 1821
 
5353
-		if ($computed)
5354
-		{
5355
-			if (! preg_match('/^search_/', $keyprefix)) return '<span class="opacitymedium">'.$langs->trans("AutomaticallyCalculated").'</span>';
5356
-			else return '';
5357
-		}
1822
+            if ($this->db->query($sql))
1823
+            {
1824
+                $this->multicurrency_code = $code;
5358 1825
 
1826
+                list($fk_multicurrency, $rate) = MultiCurrency::getIdAndTxFromCode($this->db, $code);
1827
+                if ($rate) $this->setMulticurrencyRate($rate,2);
5359 1828
 
5360
-		// Use in priority showsize from parameters, then $val['css'] then autodefine
5361
-		if (empty($morecss) && ! empty($val['css']))
5362
-		{
5363
-			$showsize = $val['css'];
5364
-		}
5365
-		if (empty($morecss))
5366
-		{
5367
-			if ($type == 'date')
5368
-			{
5369
-				$morecss = 'minwidth100imp';
5370
-			}
5371
-			elseif ($type == 'datetime')
5372
-			{
5373
-				$morecss = 'minwidth200imp';
5374
-			}
5375
-			elseif (in_array($type,array('int','integer','price')) || preg_match('/^double(\([0-9],[0-9]\)){0,1}/',$type))
5376
-			{
5377
-				$morecss = 'maxwidth75';
5378
-                        }elseif ($type == 'url')
5379
-			{
5380
-				$morecss='minwidth400';
5381
-			}
5382
-			elseif ($type == 'boolean')
5383
-			{
5384
-				$morecss='';
5385
-			}
5386
-			else
5387
-			{
5388
-				if (round($size) < 12)
5389
-				{
5390
-					$morecss = 'minwidth100';
5391
-				}
5392
-				else if (round($size) <= 48)
5393
-				{
5394
-					$morecss = 'minwidth200';
5395
-				}
5396
-				else
5397
-				{
5398
-					$morecss = 'minwidth400';
5399
-				}
5400
-			}
5401
-		}
5402
-
5403
-		if (in_array($type,array('date','datetime')))
5404
-		{
5405
-			$tmp=explode(',',$size);
5406
-			$newsize=$tmp[0];
5407
-
5408
-			$showtime = in_array($type,array('datetime')) ? 1 : 0;
5409
-
5410
-			// Do not show current date when field not required (see selectDate() method)
5411
-			if (!$required && $value == '') $value = '-1';
5412
-
5413
-			// TODO Must also support $moreparam
5414
-			$out = $form->selectDate($value, $keyprefix.$key.$keysuffix, $showtime, $showtime, $required, '', 1, (($keyprefix != 'search_' && $keyprefix != 'search_options_') ? 1 : 0), 0, 1);
5415
-		}
5416
-		elseif (in_array($type,array('int','integer')))
5417
-		{
5418
-			$tmp=explode(',',$size);
5419
-			$newsize=$tmp[0];
5420
-			$out='<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" maxlength="'.$newsize.'" value="'.dol_escape_htmltag($value).'"'.($moreparam?$moreparam:'').'>';
5421
-		}
5422
-		elseif (preg_match('/varchar/', $type))
5423
-		{
5424
-			$out='<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" maxlength="'.$size.'" value="'.dol_escape_htmltag($value).'"'.($moreparam?$moreparam:'').'>';
5425
-		}
5426
-		elseif (in_array($type, array('mail', 'phone', 'url')))
5427
-		{
5428
-			$out='<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" value="'.dol_escape_htmltag($value).'" '.($moreparam?$moreparam:'').'>';
5429
-		}
5430
-		elseif ($type == 'text')
5431
-		{
5432
-			if (! preg_match('/search_/', $keyprefix))		// If keyprefix is search_ or search_options_, we must just use a simple text field
5433
-			{
5434
-				require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
5435
-				$doleditor=new DolEditor($keyprefix.$key.$keysuffix,$value,'',200,'dolibarr_notes','In',false,false,false,ROWS_5,'90%');
5436
-				$out=$doleditor->Create(1);
5437
-			}
5438
-			else
5439
-			{
5440
-				$out='<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" value="'.dol_escape_htmltag($value).'" '.($moreparam?$moreparam:'').'>';
5441
-			}
5442
-		}
5443
-		elseif ($type == 'html')
5444
-		{
5445
-			if (! preg_match('/search_/', $keyprefix))		// If keyprefix is search_ or search_options_, we must just use a simple text field
5446
-			{
5447
-				require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
5448
-				$doleditor=new DolEditor($keyprefix.$key.$keysuffix,$value,'',200,'dolibarr_notes','In',false,false,! empty($conf->fckeditor->enabled) && $conf->global->FCKEDITOR_ENABLE_SOCIETE,ROWS_5,'90%');
5449
-				$out=$doleditor->Create(1);
5450
-			}
5451
-			else
5452
-			{
5453
-				$out='<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" value="'.dol_escape_htmltag($value).'" '.($moreparam?$moreparam:'').'>';
5454
-			}
5455
-		}
5456
-		elseif ($type == 'boolean')
5457
-		{
5458
-			$checked='';
5459
-			if (!empty($value)) {
5460
-				$checked=' checked value="1" ';
5461
-			} else {
5462
-				$checked=' value="1" ';
5463
-			}
5464
-			$out='<input type="checkbox" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" '.$checked.' '.($moreparam?$moreparam:'').'>';
5465
-		}
5466
-		elseif ($type == 'price')
5467
-		{
5468
-			if (!empty($value)) {		// $value in memory is a php numeric, we format it into user number format.
5469
-				$value=price($value);
5470
-			}
5471
-			$out='<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" value="'.$value.'" '.($moreparam?$moreparam:'').'> '.$langs->getCurrencySymbol($conf->currency);
5472
-		}
5473
-		elseif (preg_match('/^double(\([0-9],[0-9]\)){0,1}/',$type))
5474
-		{
5475
-			if (!empty($value)) {		// $value in memory is a php numeric, we format it into user number format.
5476
-				$value=price($value);
5477
-			}
5478
-			$out='<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" value="'.$value.'" '.($moreparam?$moreparam:'').'> ';
5479
-		}
5480
-		elseif ($type == 'select')
5481
-		{
5482
-			$out = '';
5483
-			if (! empty($conf->use_javascript_ajax) && ! empty($conf->global->MAIN_EXTRAFIELDS_USE_SELECT2))
5484
-			{
5485
-				include_once DOL_DOCUMENT_ROOT . '/core/lib/ajax.lib.php';
5486
-				$out.= ajax_combobox($keyprefix.$key.$keysuffix, array(), 0);
5487
-			}
1829
+                return 1;
1830
+            }
1831
+            else
1832
+            {
1833
+                dol_syslog(get_class($this).'::setMulticurrencyCode Erreur '.$sql.' - '.$this->db->error());
1834
+                $this->error=$this->db->error();
1835
+                return -1;
1836
+            }
1837
+        }
1838
+        else
1839
+        {
1840
+            dol_syslog(get_class($this).'::setMulticurrencyCode, status of the object is incompatible');
1841
+            $this->error='Status of the object is incompatible '.$this->statut;
1842
+            return -2;
1843
+        }
1844
+    }
5488 1845
 
5489
-			$out.='<select class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" '.($moreparam?$moreparam:'').'>';
5490
-                if((! isset($this->fields[$key]['default'])) ||($this->fields[$key]['notnull']!=1))$out.='<option value="0">&nbsp;</option>';
5491
-			foreach ($param['options'] as $key => $val)
5492
-			{
5493
-				if ((string) $key == '') continue;
5494
-				list($val, $parent) = explode('|', $val);
5495
-				$out.='<option value="'.$key.'"';
5496
-				$out.= (((string) $value == (string) $key)?' selected':'');
5497
-				$out.= (!empty($parent)?' parent="'.$parent.'"':'');
5498
-				$out.='>'.$val.'</option>';
5499
-			}
5500
-			$out.='</select>';
5501
-		}
5502
-		elseif ($type == 'sellist')
5503
-		{
5504
-			$out = '';
5505
-			if (! empty($conf->use_javascript_ajax) && ! empty($conf->global->MAIN_EXTRAFIELDS_USE_SELECT2))
5506
-			{
5507
-				include_once DOL_DOCUMENT_ROOT . '/core/lib/ajax.lib.php';
5508
-				$out.= ajax_combobox($keyprefix.$key.$keysuffix, array(), 0);
5509
-			}
1846
+    /**
1847
+     *  Change the multicurrency rate
1848
+     *
1849
+     *  @param		double	$rate	multicurrency rate
1850
+     *  @param		int		$mode	mode 1 : amounts in company currency will be recalculated, mode 2 : amounts in foreign currency
1851
+     *  @return		int				>0 if OK, <0 if KO
1852
+     */
1853
+    function setMulticurrencyRate($rate, $mode=1)
1854
+    {
1855
+        dol_syslog(get_class($this).'::setMulticurrencyRate('.$id.')');
1856
+        if ($this->statut >= 0 || $this->element == 'societe')
1857
+        {
1858
+            $fieldname = 'multicurrency_tx';
5510 1859
 
5511
-			$out.='<select class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" '.($moreparam?$moreparam:'').'>';
5512
-			if (is_array($param['options']))
5513
-			{
5514
-				$param_list=array_keys($param['options']);
5515
-				$InfoFieldList = explode(":", $param_list[0]);
5516
-				$parentName='';
5517
-				$parentField='';
5518
-				// 0 : tableName
5519
-				// 1 : label field name
5520
-				// 2 : key fields name (if differ of rowid)
5521
-				// 3 : key field parent (for dependent lists)
5522
-				// 4 : where clause filter on column or table extrafield, syntax field='value' or extra.field=value
5523
-				$keyList=(empty($InfoFieldList[2])?'rowid':$InfoFieldList[2].' as rowid');
5524
-
5525
-
5526
-				if (count($InfoFieldList) > 4 && ! empty($InfoFieldList[4]))
5527
-				{
5528
-					if (strpos($InfoFieldList[4], 'extra.') !== false)
5529
-					{
5530
-						$keyList='main.'.$InfoFieldList[2].' as rowid';
5531
-					} else {
5532
-						$keyList=$InfoFieldList[2].' as rowid';
5533
-					}
5534
-				}
5535
-				if (count($InfoFieldList) > 3 && ! empty($InfoFieldList[3]))
5536
-				{
5537
-					list($parentName, $parentField) = explode('|', $InfoFieldList[3]);
5538
-					$keyList.= ', '.$parentField;
5539
-				}
1860
+            $sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
1861
+            $sql .= ' SET '.$fieldname.' = '.$rate;
1862
+            $sql .= ' WHERE rowid='.$this->id;
5540 1863
 
5541
-				$fields_label = explode('|',$InfoFieldList[1]);
5542
-				if (is_array($fields_label))
5543
-				{
5544
-					$keyList .=', ';
5545
-					$keyList .= implode(', ', $fields_label);
5546
-				}
1864
+            if ($this->db->query($sql))
1865
+            {
1866
+                $this->multicurrency_tx = $rate;
1867
+
1868
+                // Update line price
1869
+                if (!empty($this->lines))
1870
+                {
1871
+                    foreach ($this->lines as &$line)
1872
+                    {
1873
+                        if($mode == 1) {
1874
+                            $line->subprice = 0;
1875
+                        }
1876
+
1877
+                        switch ($this->element) {
1878
+                            case 'propal':
1879
+                                $this->updateline(
1880
+                                    $line->id, $line->subprice, $line->qty, $line->remise_percent, $line->tva_tx, $line->localtax1_tx, $line->localtax2_tx,
1881
+                                    ($line->description?$line->description:$line->desc), 'HT', $line->info_bits, $line->special_code, $line->fk_parent_line,
1882
+                                    $line->skip_update_total, $line->fk_fournprice, $line->pa_ht, $line->label, $line->product_type, $line->date_start,
1883
+                                    $line->date_end, $line->array_options, $line->fk_unit, $line->multicurrency_subprice
1884
+                                );
1885
+                                break;
1886
+                            case 'commande':
1887
+                                $this->updateline(
1888
+                                    $line->id, ($line->description?$line->description:$line->desc), $line->subprice, $line->qty, $line->remise_percent,
1889
+                                    $line->tva_tx, $line->localtax1_tx, $line->localtax2_tx, 'HT', $line->info_bits, $line->date_start, $line->date_end,
1890
+                                    $line->product_type, $line->fk_parent_line, $line->skip_update_total, $line->fk_fournprice, $line->pa_ht, $line->label,
1891
+                                    $line->special_code, $line->array_options, $line->fk_unit, $line->multicurrency_subprice
1892
+                                );
1893
+                                break;
1894
+                            case 'facture':
1895
+                                $this->updateline(
1896
+                                    $line->id, ($line->description?$line->description:$line->desc), $line->subprice, $line->qty, $line->remise_percent,
1897
+                                    $line->date_start, $line->date_end, $line->tva_tx, $line->localtax1_tx, $line->localtax2_tx, 'HT', $line->info_bits,
1898
+                                    $line->product_type, $line->fk_parent_line, $line->skip_update_total, $line->fk_fournprice, $line->pa_ht, $line->label,
1899
+                                    $line->special_code, $line->array_options, $line->situation_percent, $line->fk_unit, $line->multicurrency_subprice
1900
+                                );
1901
+                                break;
1902
+                            case 'supplier_proposal':
1903
+                                $this->updateline(
1904
+                                    $line->id, $line->subprice, $line->qty, $line->remise_percent, $line->tva_tx, $line->localtax1_tx, $line->localtax2_tx,
1905
+                                    ($line->description?$line->description:$line->desc), 'HT', $line->info_bits, $line->special_code, $line->fk_parent_line,
1906
+                                    $line->skip_update_total, $line->fk_fournprice, $line->pa_ht, $line->label, $line->product_type, $line->array_options,
1907
+                                    $line->ref_fourn, $line->multicurrency_subprice
1908
+                                );
1909
+                                break;
1910
+                            case 'order_supplier':
1911
+                                $this->updateline(
1912
+                                    $line->id, ($line->description?$line->description:$line->desc), $line->subprice, $line->qty, $line->remise_percent,
1913
+                                    $line->tva_tx, $line->localtax1_tx, $line->localtax2_tx, 'HT', $line->info_bits, $line->product_type, false,
1914
+                                    $line->date_start, $line->date_end, $line->array_options, $line->fk_unit, $line->multicurrency_subprice
1915
+                                );
1916
+                                break;
1917
+                            case 'invoice_supplier':
1918
+                                $this->updateline(
1919
+                                    $line->id, ($line->description?$line->description:$line->desc), $line->subprice, $line->tva_tx, $line->localtax1_tx,
1920
+                                    $line->localtax2_tx, $line->qty, 0, 'HT', $line->info_bits, $line->product_type, $line->remise_percent, false,
1921
+                                    $line->date_start, $line->date_end, $line->array_options, $line->fk_unit, $line->multicurrency_subprice
1922
+                                );
1923
+                                break;
1924
+                            default:
1925
+                                dol_syslog(get_class($this).'::setMulticurrencyRate no updateline defined', LOG_DEBUG);
1926
+                                break;
1927
+                        }
1928
+                    }
1929
+                }
1930
+
1931
+                return 1;
1932
+            }
1933
+            else
1934
+            {
1935
+                dol_syslog(get_class($this).'::setMulticurrencyRate Erreur '.$sql.' - '.$this->db->error());
1936
+                $this->error=$this->db->error();
1937
+                return -1;
1938
+            }
1939
+        }
1940
+        else
1941
+        {
1942
+            dol_syslog(get_class($this).'::setMulticurrencyRate, status of the object is incompatible');
1943
+            $this->error='Status of the object is incompatible '.$this->statut;
1944
+            return -2;
1945
+        }
1946
+    }
5547 1947
 
5548
-				$sqlwhere='';
5549
-				$sql = 'SELECT '.$keyList;
5550
-				$sql.= ' FROM '.MAIN_DB_PREFIX .$InfoFieldList[0];
5551
-				if (!empty($InfoFieldList[4]))
5552
-				{
5553
-					// can use SELECT request
5554
-					if (strpos($InfoFieldList[4], '$SEL$')!==false) {
5555
-						$InfoFieldList[4]=str_replace('$SEL$','SELECT',$InfoFieldList[4]);
5556
-					}
5557
-
5558
-					// current object id can be use into filter
5559
-					if (strpos($InfoFieldList[4], '$ID$')!==false && !empty($objectid)) {
5560
-						$InfoFieldList[4]=str_replace('$ID$',$objectid,$InfoFieldList[4]);
5561
-					} else {
5562
-						$InfoFieldList[4]=str_replace('$ID$','0',$InfoFieldList[4]);
5563
-					}
5564
-					//We have to join on extrafield table
5565
-					if (strpos($InfoFieldList[4], 'extra')!==false)
5566
-					{
5567
-						$sql.= ' as main, '.MAIN_DB_PREFIX .$InfoFieldList[0].'_extrafields as extra';
5568
-						$sqlwhere.= ' WHERE extra.fk_object=main.'.$InfoFieldList[2]. ' AND '.$InfoFieldList[4];
5569
-					}
5570
-					else
5571
-					{
5572
-						$sqlwhere.= ' WHERE '.$InfoFieldList[4];
5573
-					}
5574
-				}
5575
-				else
5576
-				{
5577
-					$sqlwhere.= ' WHERE 1=1';
5578
-				}
5579
-				// Some tables may have field, some other not. For the moment we disable it.
5580
-				if (in_array($InfoFieldList[0],array('tablewithentity')))
5581
-				{
5582
-					$sqlwhere.= ' AND entity = '.$conf->entity;
5583
-				}
5584
-				$sql.=$sqlwhere;
5585
-				//print $sql;
1948
+    /**
1949
+     *  Change the payments terms
1950
+     *
1951
+     *  @param		int		$id		Id of new payment terms
1952
+     *  @return		int				>0 if OK, <0 if KO
1953
+     */
1954
+    function setPaymentTerms($id)
1955
+    {
1956
+        dol_syslog(get_class($this).'::setPaymentTerms('.$id.')');
1957
+        if ($this->statut >= 0 || $this->element == 'societe')
1958
+        {
1959
+            // TODO uniformize field name
1960
+            $fieldname = 'fk_cond_reglement';
1961
+            if ($this->element == 'societe') $fieldname = 'cond_reglement';
1962
+            if (get_class($this) == 'Fournisseur') $fieldname = 'cond_reglement_supplier';
5586 1963
 
5587
-				$sql .= ' ORDER BY ' . implode(', ', $fields_label);
1964
+            $sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
1965
+            $sql .= ' SET '.$fieldname.' = '.$id;
1966
+            $sql .= ' WHERE rowid='.$this->id;
5588 1967
 
5589
-				dol_syslog(get_class($this).'::showInputField type=sellist', LOG_DEBUG);
5590
-				$resql = $this->db->query($sql);
5591
-				if ($resql)
5592
-				{
5593
-					$out.='<option value="0">&nbsp;</option>';
5594
-					$num = $this->db->num_rows($resql);
5595
-					$i = 0;
5596
-					while ($i < $num)
5597
-					{
5598
-						$labeltoshow='';
5599
-						$obj = $this->db->fetch_object($resql);
5600
-
5601
-						// Several field into label (eq table:code|libelle:rowid)
5602
-						$notrans = false;
5603
-						$fields_label = explode('|',$InfoFieldList[1]);
5604
-						if (is_array($fields_label))
5605
-						{
5606
-							$notrans = true;
5607
-							foreach ($fields_label as $field_toshow)
5608
-							{
5609
-								$labeltoshow.= $obj->$field_toshow.' ';
5610
-							}
5611
-						}
5612
-						else
5613
-						{
5614
-							$labeltoshow=$obj->{$InfoFieldList[1]};
5615
-						}
5616
-						$labeltoshow=dol_trunc($labeltoshow,45);
5617
-
5618
-						if ($value == $obj->rowid)
5619
-						{
5620
-							foreach ($fields_label as $field_toshow)
5621
-							{
5622
-								$translabel=$langs->trans($obj->$field_toshow);
5623
-								if ($translabel!=$obj->$field_toshow) {
5624
-									$labeltoshow=dol_trunc($translabel,18).' ';
5625
-								}else {
5626
-									$labeltoshow=dol_trunc($obj->$field_toshow,18).' ';
5627
-								}
5628
-							}
5629
-							$out.='<option value="'.$obj->rowid.'" selected>'.$labeltoshow.'</option>';
5630
-						}
5631
-						else
5632
-						{
5633
-							if (! $notrans)
5634
-							{
5635
-								$translabel=$langs->trans($obj->{$InfoFieldList[1]});
5636
-								if ($translabel!=$obj->{$InfoFieldList[1]}) {
5637
-									$labeltoshow=dol_trunc($translabel,18);
5638
-								}
5639
-								else {
5640
-									$labeltoshow=dol_trunc($obj->{$InfoFieldList[1]},18);
5641
-								}
5642
-							}
5643
-							if (empty($labeltoshow)) $labeltoshow='(not defined)';
5644
-							if ($value==$obj->rowid)
5645
-							{
5646
-								$out.='<option value="'.$obj->rowid.'" selected>'.$labeltoshow.'</option>';
1968
+            if ($this->db->query($sql))
1969
+            {
1970
+                $this->cond_reglement_id = $id;
1971
+                // for supplier
1972
+                if (get_class($this) == 'Fournisseur') $this->cond_reglement_supplier_id = $id;
1973
+                $this->cond_reglement = $id;	// for compatibility
1974
+                return 1;
1975
+            }
1976
+            else
1977
+            {
1978
+                dol_syslog(get_class($this).'::setPaymentTerms Erreur '.$sql.' - '.$this->db->error());
1979
+                $this->error=$this->db->error();
1980
+                return -1;
1981
+            }
1982
+        }
1983
+        else
1984
+        {
1985
+            dol_syslog(get_class($this).'::setPaymentTerms, status of the object is incompatible');
1986
+            $this->error='Status of the object is incompatible '.$this->statut;
1987
+            return -2;
1988
+        }
1989
+    }
1990
+
1991
+    /**
1992
+     *	Define delivery address
1993
+     *  @deprecated
1994
+     *
1995
+     *	@param      int		$id		Address id
1996
+     *	@return     int				<0 si ko, >0 si ok
1997
+     */
1998
+    function setDeliveryAddress($id)
1999
+    {
2000
+        $fieldname = 'fk_delivery_address';
2001
+        if ($this->element == 'delivery' || $this->element == 'shipping') $fieldname = 'fk_address';
2002
+
2003
+        $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element." SET ".$fieldname." = ".$id;
2004
+        $sql.= " WHERE rowid = ".$this->id." AND fk_statut = 0";
2005
+
2006
+        if ($this->db->query($sql))
2007
+        {
2008
+            $this->fk_delivery_address = $id;
2009
+            return 1;
2010
+        }
2011
+        else
2012
+        {
2013
+            $this->error=$this->db->error();
2014
+            dol_syslog(get_class($this).'::setDeliveryAddress Erreur '.$sql.' - '.$this->error);
2015
+            return -1;
2016
+        }
2017
+    }
2018
+
2019
+
2020
+    /**
2021
+     *  Change the shipping method
2022
+     *
2023
+     *  @param      int     $shipping_method_id     Id of shipping method
2024
+     *  @param      bool    $notrigger              false=launch triggers after, true=disable triggers
2025
+     *  @param      User	$userused               Object user
2026
+     *
2027
+     *  @return     int              1 if OK, 0 if KO
2028
+     */
2029
+    function setShippingMethod($shipping_method_id, $notrigger=false, $userused=null)
2030
+    {
2031
+        global $user;
2032
+
2033
+        if (empty($userused)) $userused=$user;
2034
+
2035
+        $error = 0;
2036
+
2037
+        if (! $this->table_element) {
2038
+            dol_syslog(get_class($this)."::setShippingMethod was called on objet with property table_element not defined",LOG_ERR);
2039
+            return -1;
2040
+        }
2041
+
2042
+        $this->db->begin();
2043
+
2044
+        if ($shipping_method_id<0) $shipping_method_id='NULL';
2045
+        dol_syslog(get_class($this).'::setShippingMethod('.$shipping_method_id.')');
2046
+
2047
+        $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
2048
+        $sql.= " SET fk_shipping_method = ".$shipping_method_id;
2049
+        $sql.= " WHERE rowid=".$this->id;
2050
+        $resql = $this->db->query($sql);
2051
+        if (! $resql) {
2052
+            dol_syslog(get_class($this).'::setShippingMethod Error ', LOG_DEBUG);
2053
+            $this->error = $this->db->lasterror();
2054
+            $error++;
2055
+        } else {
2056
+            if (!$notrigger)
2057
+            {
2058
+                // Call trigger
2059
+                $this->context=array('shippingmethodupdate'=>1);
2060
+                $result = $this->call_trigger(strtoupper(get_class($this)) . '_MODIFY', $userused);
2061
+                if ($result < 0) $error++;
2062
+                // End call trigger
2063
+            }
2064
+        }
2065
+        if ($error)
2066
+        {
2067
+            $this->db->rollback();
2068
+            return -1;
2069
+        } else {
2070
+            $this->shipping_method_id = ($shipping_method_id=='NULL')?null:$shipping_method_id;
2071
+            $this->db->commit();
2072
+            return 1;
2073
+        }
2074
+    }
2075
+
2076
+
2077
+    /**
2078
+     *  Change the warehouse
2079
+     *
2080
+     *  @param      int     $warehouse_id     Id of warehouse
2081
+     *  @return     int              1 if OK, 0 if KO
2082
+     */
2083
+    function setWarehouse($warehouse_id)
2084
+    {
2085
+        if (! $this->table_element) {
2086
+            dol_syslog(get_class($this)."::setWarehouse was called on objet with property table_element not defined",LOG_ERR);
2087
+            return -1;
2088
+        }
2089
+        if ($warehouse_id<0) $warehouse_id='NULL';
2090
+        dol_syslog(get_class($this).'::setWarehouse('.$warehouse_id.')');
2091
+
2092
+        $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
2093
+        $sql.= " SET fk_warehouse = ".$warehouse_id;
2094
+        $sql.= " WHERE rowid=".$this->id;
2095
+
2096
+        if ($this->db->query($sql)) {
2097
+            $this->warehouse_id = ($warehouse_id=='NULL')?null:$warehouse_id;
2098
+            return 1;
2099
+        } else {
2100
+            dol_syslog(get_class($this).'::setWarehouse Error ', LOG_DEBUG);
2101
+            $this->error=$this->db->error();
2102
+            return 0;
2103
+        }
2104
+    }
2105
+
2106
+
2107
+    /**
2108
+     *		Set last model used by doc generator
2109
+     *
2110
+     *		@param		User	$user		User object that make change
2111
+     *		@param		string	$modelpdf	Modele name
2112
+     *		@return		int					<0 if KO, >0 if OK
2113
+     */
2114
+    function setDocModel($user, $modelpdf)
2115
+    {
2116
+        if (! $this->table_element)
2117
+        {
2118
+            dol_syslog(get_class($this)."::setDocModel was called on objet with property table_element not defined",LOG_ERR);
2119
+            return -1;
2120
+        }
2121
+
2122
+        $newmodelpdf=dol_trunc($modelpdf,255);
2123
+
2124
+        $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
2125
+        $sql.= " SET model_pdf = '".$this->db->escape($newmodelpdf)."'";
2126
+        $sql.= " WHERE rowid = ".$this->id;
2127
+        // if ($this->element == 'facture') $sql.= " AND fk_statut < 2";
2128
+        // if ($this->element == 'propal')  $sql.= " AND fk_statut = 0";
2129
+
2130
+        dol_syslog(get_class($this)."::setDocModel", LOG_DEBUG);
2131
+        $resql=$this->db->query($sql);
2132
+        if ($resql)
2133
+        {
2134
+            $this->modelpdf=$modelpdf;
2135
+            return 1;
2136
+        }
2137
+        else
2138
+        {
2139
+            dol_print_error($this->db);
2140
+            return 0;
2141
+        }
2142
+    }
2143
+
2144
+
2145
+    /**
2146
+     *  Change the bank account
2147
+     *
2148
+     *  @param		int		$fk_account		Id of bank account
2149
+     *  @param      bool    $notrigger      false=launch triggers after, true=disable triggers
2150
+     *  @param      User	$userused		Object user
2151
+     *  @return		int				1 if OK, 0 if KO
2152
+     */
2153
+    function setBankAccount($fk_account, $notrigger=false, $userused=null)
2154
+    {
2155
+        global $user;
2156
+
2157
+        if (empty($userused)) $userused=$user;
2158
+
2159
+        $error = 0;
2160
+
2161
+        if (! $this->table_element) {
2162
+            dol_syslog(get_class($this)."::setBankAccount was called on objet with property table_element not defined",LOG_ERR);
2163
+            return -1;
2164
+        }
2165
+        $this->db->begin();
2166
+
2167
+        if ($fk_account<0) $fk_account='NULL';
2168
+        dol_syslog(get_class($this).'::setBankAccount('.$fk_account.')');
2169
+
2170
+        $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
2171
+        $sql.= " SET fk_account = ".$fk_account;
2172
+        $sql.= " WHERE rowid=".$this->id;
2173
+
2174
+        $resql = $this->db->query($sql);
2175
+        if (! $resql)
2176
+        {
2177
+            dol_syslog(get_class($this).'::setBankAccount Error '.$sql.' - '.$this->db->error());
2178
+            $this->error = $this->db->lasterror();
2179
+            $error++;
2180
+        }
2181
+        else
2182
+        {
2183
+            if (!$notrigger)
2184
+            {
2185
+                // Call trigger
2186
+                $this->context=array('bankaccountupdate'=>1);
2187
+                $result = $this->call_trigger(strtoupper(get_class($this)) . '_MODIFY', $userused);
2188
+                if ($result < 0) $error++;
2189
+                // End call trigger
2190
+            }
2191
+        }
2192
+        if ($error)
2193
+        {
2194
+            $this->db->rollback();
2195
+            return -1;
2196
+        }
2197
+        else
2198
+        {
2199
+            $this->fk_account = ($fk_account=='NULL')?null:$fk_account;
2200
+            $this->db->commit();
2201
+            return 1;
2202
+        }
2203
+    }
2204
+
2205
+
2206
+    // TODO: Move line related operations to CommonObjectLine?
2207
+
2208
+    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
2209
+    /**
2210
+     *  Save a new position (field rang) for details lines.
2211
+     *  You can choose to set position for lines with already a position or lines without any position defined.
2212
+     *
2213
+     * 	@param		boolean		$renum			   True to renum all already ordered lines, false to renum only not already ordered lines.
2214
+     * 	@param		string		$rowidorder		   ASC or DESC
2215
+     * 	@param		boolean		$fk_parent_line    Table with fk_parent_line field or not
2216
+     * 	@return		int                            <0 if KO, >0 if OK
2217
+     */
2218
+    function line_order($renum=false, $rowidorder='ASC', $fk_parent_line=true)
2219
+    {
2220
+        // phpcs:enable
2221
+        if (! $this->table_element_line)
2222
+        {
2223
+            dol_syslog(get_class($this)."::line_order was called on objet with property table_element_line not defined",LOG_ERR);
2224
+            return -1;
2225
+        }
2226
+        if (! $this->fk_element)
2227
+        {
2228
+            dol_syslog(get_class($this)."::line_order was called on objet with property fk_element not defined",LOG_ERR);
2229
+            return -1;
2230
+        }
2231
+
2232
+        // Count number of lines to reorder (according to choice $renum)
2233
+        $nl=0;
2234
+        $sql = 'SELECT count(rowid) FROM '.MAIN_DB_PREFIX.$this->table_element_line;
2235
+        $sql.= ' WHERE '.$this->fk_element.'='.$this->id;
2236
+        if (! $renum) $sql.= ' AND rang = 0';
2237
+        if ($renum) $sql.= ' AND rang <> 0';
2238
+
2239
+        dol_syslog(get_class($this)."::line_order", LOG_DEBUG);
2240
+        $resql = $this->db->query($sql);
2241
+        if ($resql)
2242
+        {
2243
+            $row = $this->db->fetch_row($resql);
2244
+            $nl = $row[0];
2245
+        }
2246
+        else dol_print_error($this->db);
2247
+        if ($nl > 0)
2248
+        {
2249
+            // The goal of this part is to reorder all lines, with all children lines sharing the same
2250
+            // counter that parents.
2251
+            $rows=array();
2252
+
2253
+            // We first search all lines that are parent lines (for multilevel details lines)
2254
+            $sql = 'SELECT rowid FROM '.MAIN_DB_PREFIX.$this->table_element_line;
2255
+            $sql.= ' WHERE '.$this->fk_element.' = '.$this->id;
2256
+            if ($fk_parent_line) $sql.= ' AND fk_parent_line IS NULL';
2257
+            $sql.= ' ORDER BY rang ASC, rowid '.$rowidorder;
2258
+
2259
+            dol_syslog(get_class($this)."::line_order search all parent lines", LOG_DEBUG);
2260
+            $resql = $this->db->query($sql);
2261
+            if ($resql)
2262
+            {
2263
+                $i=0;
2264
+                $num = $this->db->num_rows($resql);
2265
+                while ($i < $num)
2266
+                {
2267
+                    $row = $this->db->fetch_row($resql);
2268
+                    $rows[] = $row[0];	// Add parent line into array rows
2269
+                    $childrens = $this->getChildrenOfLine($row[0]);
2270
+                    if (! empty($childrens))
2271
+                    {
2272
+                        foreach($childrens as $child)
2273
+                        {
2274
+                            array_push($rows, $child);
2275
+                        }
2276
+                    }
2277
+                    $i++;
2278
+                }
2279
+
2280
+                // Now we set a new number for each lines (parent and children with children included into parent tree)
2281
+                if (! empty($rows))
2282
+                {
2283
+                    foreach($rows as $key => $row)
2284
+                    {
2285
+                        $this->updateRangOfLine($row, ($key+1));
2286
+                    }
2287
+                }
2288
+            }
2289
+            else
2290
+            {
2291
+                dol_print_error($this->db);
2292
+            }
2293
+        }
2294
+        return 1;
2295
+    }
2296
+
2297
+    /**
2298
+     * 	Get children of line
2299
+     *
2300
+     * 	@param	int		$id		Id of parent line
2301
+     * 	@return	array			Array with list of children lines id
2302
+     */
2303
+    function getChildrenOfLine($id)
2304
+    {
2305
+        $rows=array();
2306
+
2307
+        $sql = 'SELECT rowid FROM '.MAIN_DB_PREFIX.$this->table_element_line;
2308
+        $sql.= ' WHERE '.$this->fk_element.' = '.$this->id;
2309
+        $sql.= ' AND fk_parent_line = '.$id;
2310
+        $sql.= ' ORDER BY rang ASC';
2311
+
2312
+        dol_syslog(get_class($this)."::getChildrenOfLine search children lines for line ".$id."", LOG_DEBUG);
2313
+        $resql = $this->db->query($sql);
2314
+        if ($resql)
2315
+        {
2316
+            $i=0;
2317
+            $num = $this->db->num_rows($resql);
2318
+            while ($i < $num)
2319
+            {
2320
+                $row = $this->db->fetch_row($resql);
2321
+                $rows[$i] = $row[0];
2322
+                $i++;
2323
+            }
2324
+        }
2325
+
2326
+        return $rows;
2327
+    }
2328
+
2329
+    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
2330
+    /**
2331
+     * 	Update a line to have a lower rank
2332
+     *
2333
+     * 	@param 	int			$rowid				Id of line
2334
+     * 	@param	boolean		$fk_parent_line		Table with fk_parent_line field or not
2335
+     * 	@return	void
2336
+     */
2337
+    function line_up($rowid, $fk_parent_line=true)
2338
+    {
2339
+        // phpcs:enable
2340
+        $this->line_order(false, 'ASC', $fk_parent_line);
2341
+
2342
+        // Get rang of line
2343
+        $rang = $this->getRangOfLine($rowid);
2344
+
2345
+        // Update position of line
2346
+        $this->updateLineUp($rowid, $rang);
2347
+    }
2348
+
2349
+    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
2350
+    /**
2351
+     * 	Update a line to have a higher rank
2352
+     *
2353
+     * 	@param	int			$rowid				Id of line
2354
+     * 	@param	boolean		$fk_parent_line		Table with fk_parent_line field or not
2355
+     * 	@return	void
2356
+     */
2357
+    function line_down($rowid, $fk_parent_line=true)
2358
+    {
2359
+        // phpcs:enable
2360
+        $this->line_order(false, 'ASC', $fk_parent_line);
2361
+
2362
+        // Get rang of line
2363
+        $rang = $this->getRangOfLine($rowid);
2364
+
2365
+        // Get max value for rang
2366
+        $max = $this->line_max();
2367
+
2368
+        // Update position of line
2369
+        $this->updateLineDown($rowid, $rang, $max);
2370
+    }
2371
+
2372
+    /**
2373
+     * 	Update position of line (rang)
2374
+     *
2375
+     * 	@param	int		$rowid		Id of line
2376
+     * 	@param	int		$rang		Position
2377
+     * 	@return	void
2378
+     */
2379
+    function updateRangOfLine($rowid,$rang)
2380
+    {
2381
+        $fieldposition = 'rang';
2382
+        if (in_array($this->table_element_line, array('ecm_files', 'emailcollector_emailcollectoraction'))) $fieldposition = 'position';
2383
+
2384
+        $sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element_line.' SET '.$fieldposition.' = '.$rang;
2385
+        $sql.= ' WHERE rowid = '.$rowid;
2386
+
2387
+        dol_syslog(get_class($this)."::updateRangOfLine", LOG_DEBUG);
2388
+        if (! $this->db->query($sql))
2389
+        {
2390
+            dol_print_error($this->db);
2391
+        }
2392
+    }
2393
+
2394
+    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
2395
+    /**
2396
+     * 	Update position of line with ajax (rang)
2397
+     *
2398
+     * 	@param	array	$rows	Array of rows
2399
+     * 	@return	void
2400
+     */
2401
+    function line_ajaxorder($rows)
2402
+    {
2403
+        // phpcs:enable
2404
+        $num = count($rows);
2405
+        for ($i = 0 ; $i < $num ; $i++)
2406
+        {
2407
+            $this->updateRangOfLine($rows[$i], ($i+1));
2408
+        }
2409
+    }
2410
+
2411
+    /**
2412
+     * 	Update position of line up (rang)
2413
+     *
2414
+     * 	@param	int		$rowid		Id of line
2415
+     * 	@param	int		$rang		Position
2416
+     * 	@return	void
2417
+     */
2418
+    function updateLineUp($rowid,$rang)
2419
+    {
2420
+        if ($rang > 1)
2421
+        {
2422
+            $fieldposition = 'rang';
2423
+            if (in_array($this->table_element_line, array('ecm_files', 'emailcollector_emailcollectoraction'))) $fieldposition = 'position';
2424
+
2425
+            $sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element_line.' SET '.$fieldposition.' = '.$rang ;
2426
+            $sql.= ' WHERE '.$this->fk_element.' = '.$this->id;
2427
+            $sql.= ' AND rang = '.($rang - 1);
2428
+            if ($this->db->query($sql) )
2429
+            {
2430
+                $sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element_line.' SET '.$fieldposition.' = '.($rang - 1);
2431
+                $sql.= ' WHERE rowid = '.$rowid;
2432
+                if (! $this->db->query($sql) )
2433
+                {
2434
+                    dol_print_error($this->db);
2435
+                }
2436
+            }
2437
+            else
2438
+            {
2439
+                dol_print_error($this->db);
2440
+            }
2441
+        }
2442
+    }
2443
+
2444
+    /**
2445
+     * 	Update position of line down (rang)
2446
+     *
2447
+     * 	@param	int		$rowid		Id of line
2448
+     * 	@param	int		$rang		Position
2449
+     * 	@param	int		$max		Max
2450
+     * 	@return	void
2451
+     */
2452
+    function updateLineDown($rowid,$rang,$max)
2453
+    {
2454
+        if ($rang < $max)
2455
+        {
2456
+            $fieldposition = 'rang';
2457
+            if (in_array($this->table_element_line, array('ecm_files', 'emailcollector_emailcollectoraction'))) $fieldposition = 'position';
2458
+
2459
+            $sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element_line.' SET '.$fieldposition.' = '.$rang;
2460
+            $sql.= ' WHERE '.$this->fk_element.' = '.$this->id;
2461
+            $sql.= ' AND rang = '.($rang+1);
2462
+            if ($this->db->query($sql) )
2463
+            {
2464
+                $sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element_line.' SET '.$fieldposition.' = '.($rang+1);
2465
+                $sql.= ' WHERE rowid = '.$rowid;
2466
+                if (! $this->db->query($sql) )
2467
+                {
2468
+                    dol_print_error($this->db);
2469
+                }
2470
+            }
2471
+            else
2472
+            {
2473
+                dol_print_error($this->db);
2474
+            }
2475
+        }
2476
+    }
2477
+
2478
+    /**
2479
+     * 	Get position of line (rang)
2480
+     *
2481
+     * 	@param		int		$rowid		Id of line
2482
+     *  @return		int     			Value of rang in table of lines
2483
+     */
2484
+    function getRangOfLine($rowid)
2485
+    {
2486
+        $sql = 'SELECT rang FROM '.MAIN_DB_PREFIX.$this->table_element_line;
2487
+        $sql.= ' WHERE rowid ='.$rowid;
2488
+
2489
+        dol_syslog(get_class($this)."::getRangOfLine", LOG_DEBUG);
2490
+        $resql = $this->db->query($sql);
2491
+        if ($resql)
2492
+        {
2493
+            $row = $this->db->fetch_row($resql);
2494
+            return $row[0];
2495
+        }
2496
+    }
2497
+
2498
+    /**
2499
+     * 	Get rowid of the line relative to its position
2500
+     *
2501
+     * 	@param		int		$rang		Rang value
2502
+     *  @return     int     			Rowid of the line
2503
+     */
2504
+    function getIdOfLine($rang)
2505
+    {
2506
+        $sql = 'SELECT rowid FROM '.MAIN_DB_PREFIX.$this->table_element_line;
2507
+        $sql.= ' WHERE '.$this->fk_element.' = '.$this->id;
2508
+        $sql.= ' AND rang = '.$rang;
2509
+        $resql = $this->db->query($sql);
2510
+        if ($resql)
2511
+        {
2512
+            $row = $this->db->fetch_row($resql);
2513
+            return $row[0];
2514
+        }
2515
+    }
2516
+
2517
+    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
2518
+    /**
2519
+     * 	Get max value used for position of line (rang)
2520
+     *
2521
+     * 	@param		int		$fk_parent_line		Parent line id
2522
+     *  @return     int  			   			Max value of rang in table of lines
2523
+     */
2524
+    function line_max($fk_parent_line=0)
2525
+    {
2526
+        // phpcs:enable
2527
+        // Search the last rang with fk_parent_line
2528
+        if ($fk_parent_line)
2529
+        {
2530
+            $sql = 'SELECT max(rang) FROM '.MAIN_DB_PREFIX.$this->table_element_line;
2531
+            $sql.= ' WHERE '.$this->fk_element.' = '.$this->id;
2532
+            $sql.= ' AND fk_parent_line = '.$fk_parent_line;
2533
+
2534
+            dol_syslog(get_class($this)."::line_max", LOG_DEBUG);
2535
+            $resql = $this->db->query($sql);
2536
+            if ($resql)
2537
+            {
2538
+                $row = $this->db->fetch_row($resql);
2539
+                if (! empty($row[0]))
2540
+                {
2541
+                    return $row[0];
2542
+                }
2543
+                else
2544
+                {
2545
+                    return $this->getRangOfLine($fk_parent_line);
2546
+                }
2547
+            }
2548
+        }
2549
+        // If not, search the last rang of element
2550
+        else
2551
+        {
2552
+            $sql = 'SELECT max(rang) FROM '.MAIN_DB_PREFIX.$this->table_element_line;
2553
+            $sql.= ' WHERE '.$this->fk_element.' = '.$this->id;
2554
+
2555
+            dol_syslog(get_class($this)."::line_max", LOG_DEBUG);
2556
+            $resql = $this->db->query($sql);
2557
+            if ($resql)
2558
+            {
2559
+                $row = $this->db->fetch_row($resql);
2560
+                return $row[0];
2561
+            }
2562
+        }
2563
+    }
2564
+
2565
+    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
2566
+    /**
2567
+     *  Update external ref of element
2568
+     *
2569
+     *  @param      string		$ref_ext	Update field ref_ext
2570
+     *  @return     int      		   		<0 if KO, >0 if OK
2571
+     */
2572
+    function update_ref_ext($ref_ext)
2573
+    {
2574
+        // phpcs:enable
2575
+        if (! $this->table_element)
2576
+        {
2577
+            dol_syslog(get_class($this)."::update_ref_ext was called on objet with property table_element not defined", LOG_ERR);
2578
+            return -1;
2579
+        }
2580
+
2581
+        $sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
2582
+        $sql.= " SET ref_ext = '".$this->db->escape($ref_ext)."'";
2583
+        $sql.= " WHERE ".(isset($this->table_rowid)?$this->table_rowid:'rowid')." = ". $this->id;
2584
+
2585
+        dol_syslog(get_class($this)."::update_ref_ext", LOG_DEBUG);
2586
+        if ($this->db->query($sql))
2587
+        {
2588
+            $this->ref_ext = $ref_ext;
2589
+            return 1;
2590
+        }
2591
+        else
2592
+        {
2593
+            $this->error=$this->db->error();
2594
+            return -1;
2595
+        }
2596
+    }
2597
+
2598
+    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
2599
+    /**
2600
+     *  Update note of element
2601
+     *
2602
+     *  @param      string		$note		New value for note
2603
+     *  @param		string		$suffix		'', '_public' or '_private'
2604
+     *  @return     int      		   		<0 if KO, >0 if OK
2605
+     */
2606
+    function update_note($note, $suffix='')
2607
+    {
2608
+        // phpcs:enable
2609
+        global $user;
2610
+
2611
+        if (! $this->table_element)
2612
+        {
2613
+            $this->error='update_note was called on objet with property table_element not defined';
2614
+            dol_syslog(get_class($this)."::update_note was called on objet with property table_element not defined", LOG_ERR);
2615
+            return -1;
2616
+        }
2617
+        if (! in_array($suffix,array('','_public','_private')))
2618
+        {
2619
+            $this->error='update_note Parameter suffix must be empty, \'_private\' or \'_public\'';
2620
+            dol_syslog(get_class($this)."::update_note Parameter suffix must be empty, '_private' or '_public'", LOG_ERR);
2621
+            return -2;
2622
+        }
2623
+        // Special cas
2624
+        //var_dump($this->table_element);exit;
2625
+        if ($this->table_element == 'product') $suffix='';
2626
+
2627
+        $sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
2628
+        $sql.= " SET note".$suffix." = ".(!empty($note)?("'".$this->db->escape($note)."'"):"NULL");
2629
+        $sql.= " ,".(in_array($this->table_element, array('actioncomm', 'adherent', 'advtargetemailing', 'cronjob', 'establishment'))?"fk_user_mod":"fk_user_modif")." = ".$user->id;
2630
+        $sql.= " WHERE rowid =". $this->id;
2631
+
2632
+        dol_syslog(get_class($this)."::update_note", LOG_DEBUG);
2633
+        if ($this->db->query($sql))
2634
+        {
2635
+            if ($suffix == '_public') $this->note_public = $note;
2636
+            else if ($suffix == '_private') $this->note_private = $note;
2637
+            else
2638
+            {
2639
+                $this->note = $note;      // deprecated
2640
+                $this->note_private = $note;
2641
+            }
2642
+            return 1;
2643
+        }
2644
+        else
2645
+        {
2646
+            $this->error=$this->db->lasterror();
2647
+            return -1;
2648
+        }
2649
+    }
2650
+
2651
+    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
2652
+    /**
2653
+     * 	Update public note (kept for backward compatibility)
2654
+     *
2655
+     * @param      string		$note		New value for note
2656
+     * @return     int      		   		<0 if KO, >0 if OK
2657
+     * @deprecated
2658
+     * @see update_note()
2659
+     */
2660
+    function update_note_public($note)
2661
+    {
2662
+        // phpcs:enable
2663
+        return $this->update_note($note,'_public');
2664
+    }
2665
+
2666
+    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
2667
+    /**
2668
+     *	Update total_ht, total_ttc, total_vat, total_localtax1, total_localtax2 for an object (sum of lines).
2669
+     *  Must be called at end of methods addline or updateline.
2670
+     *
2671
+     *	@param	int		$exclspec          	>0 = Exclude special product (product_type=9)
2672
+     *  @param  string	$roundingadjust    	'none'=Do nothing, 'auto'=Use default method (MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND if defined, or '0'), '0'=Force mode total of rounding, '1'=Force mode rounding of total
2673
+     *  @param	int		$nodatabaseupdate	1=Do not update database. Update only properties of object.
2674
+     *  @param	Societe	$seller				If roundingadjust is '0' or '1' or maybe 'auto', it means we recalculate total for lines before calculating total for object and for this, we need seller object.
2675
+     *	@return	int    			           	<0 if KO, >0 if OK
2676
+     */
2677
+    function update_price($exclspec=0,$roundingadjust='none',$nodatabaseupdate=0,$seller=null)
2678
+    {
2679
+        // phpcs:enable
2680
+        global $conf, $hookmanager, $action;
2681
+
2682
+        // Some external module want no update price after a trigger because they have another method to calculate the total (ex: with an extrafield)
2683
+        $MODULE = "";
2684
+        if ($this->element == 'propal')
2685
+            $MODULE = "MODULE_DISALLOW_UPDATE_PRICE_PROPOSAL";
2686
+        elseif ($this->element == 'order')
2687
+            $MODULE = "MODULE_DISALLOW_UPDATE_PRICE_ORDER";
2688
+        elseif ($this->element == 'facture')
2689
+            $MODULE = "MODULE_DISALLOW_UPDATE_PRICE_INVOICE";
2690
+        elseif ($this->element == 'facture_fourn')
2691
+            $MODULE = "MODULE_DISALLOW_UPDATE_PRICE_SUPPLIER_INVOICE";
2692
+        elseif ($this->element == 'order_supplier')
2693
+            $MODULE = "MODULE_DISALLOW_UPDATE_PRICE_SUPPLIER_ORDER";
2694
+        elseif ($this->element == 'supplier_proposal')
2695
+            $MODULE = "MODULE_DISALLOW_UPDATE_PRICE_SUPPLIER_PROPOSAL";
2696
+
2697
+        if (! empty($MODULE)) {
2698
+            if (! empty($conf->global->$MODULE)) {
2699
+                $modsactivated = explode(',', $conf->global->$MODULE);
2700
+                foreach ($modsactivated as $mod) {
2701
+                    if ($conf->$mod->enabled)
2702
+                        return 1; // update was disabled by specific setup
2703
+                }
2704
+            }
2705
+        }
2706
+
2707
+        include_once DOL_DOCUMENT_ROOT.'/core/lib/price.lib.php';
2708
+
2709
+        if ($roundingadjust == '-1') $roundingadjust='auto';	// For backward compatibility
2710
+
2711
+        $forcedroundingmode=$roundingadjust;
2712
+        if ($forcedroundingmode == 'auto' && isset($conf->global->MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND)) $forcedroundingmode=$conf->global->MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND;
2713
+        elseif ($forcedroundingmode == 'auto') $forcedroundingmode='0';
2714
+
2715
+        $error=0;
2716
+
2717
+        $multicurrency_tx = !empty($this->multicurrency_tx) ? $this->multicurrency_tx : 1;
2718
+
2719
+        // Define constants to find lines to sum
2720
+        $fieldtva='total_tva';
2721
+        $fieldlocaltax1='total_localtax1';
2722
+        $fieldlocaltax2='total_localtax2';
2723
+        $fieldup='subprice';
2724
+        if ($this->element == 'facture_fourn' || $this->element == 'invoice_supplier')
2725
+        {
2726
+            $fieldtva='tva';
2727
+            $fieldup='pu_ht';
2728
+        }
2729
+        if ($this->element == 'expensereport')
2730
+        {
2731
+            $fieldup='value_unit';
2732
+        }
2733
+
2734
+        $sql = 'SELECT rowid, qty, '.$fieldup.' as up, remise_percent, total_ht, '.$fieldtva.' as total_tva, total_ttc, '.$fieldlocaltax1.' as total_localtax1, '.$fieldlocaltax2.' as total_localtax2,';
2735
+        $sql.= ' tva_tx as vatrate, localtax1_tx, localtax2_tx, localtax1_type, localtax2_type, info_bits, product_type';
2736
+            if ($this->table_element_line == 'facturedet') $sql.= ', situation_percent';
2737
+            $sql.= ', multicurrency_total_ht, multicurrency_total_tva, multicurrency_total_ttc';
2738
+        $sql.= ' FROM '.MAIN_DB_PREFIX.$this->table_element_line;
2739
+        $sql.= ' WHERE '.$this->fk_element.' = '.$this->id;
2740
+        if ($exclspec)
2741
+        {
2742
+            $product_field='product_type';
2743
+            if ($this->table_element_line == 'contratdet') $product_field='';    // contratdet table has no product_type field
2744
+            if ($product_field) $sql.= ' AND '.$product_field.' <> 9';
2745
+        }
2746
+        $sql.= ' ORDER by rowid';	// We want to be sure to always use same order of line to not change lines differently when option MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND is used
2747
+
2748
+        dol_syslog(get_class($this)."::update_price", LOG_DEBUG);
2749
+        $resql = $this->db->query($sql);
2750
+        if ($resql)
2751
+        {
2752
+            $this->total_ht  = 0;
2753
+            $this->total_tva = 0;
2754
+            $this->total_localtax1 = 0;
2755
+            $this->total_localtax2 = 0;
2756
+            $this->total_ttc = 0;
2757
+            $total_ht_by_vats  = array();
2758
+            $total_tva_by_vats = array();
2759
+            $total_ttc_by_vats = array();
2760
+            $this->multicurrency_total_ht	= 0;
2761
+            $this->multicurrency_total_tva	= 0;
2762
+            $this->multicurrency_total_ttc	= 0;
2763
+
2764
+            $num = $this->db->num_rows($resql);
2765
+            $i = 0;
2766
+            while ($i < $num)
2767
+            {
2768
+                $obj = $this->db->fetch_object($resql);
2769
+
2770
+                // Note: There is no check on detail line and no check on total, if $forcedroundingmode = 'none'
2771
+                $parameters=array('fk_element' => $obj->rowid);
2772
+                $reshook = $hookmanager->executeHooks('changeRoundingMode', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
2773
+
2774
+                if (empty($reshook) && $forcedroundingmode == '0')	// Check if data on line are consistent. This may solve lines that were not consistent because set with $forcedroundingmode='auto'
2775
+                {
2776
+                    $localtax_array=array($obj->localtax1_type,$obj->localtax1_tx,$obj->localtax2_type,$obj->localtax2_tx);
2777
+                    $tmpcal=calcul_price_total($obj->qty, $obj->up, $obj->remise_percent, $obj->vatrate, $obj->localtax1_tx, $obj->localtax2_tx, 0, 'HT', $obj->info_bits, $obj->product_type, $seller, $localtax_array, (isset($obj->situation_percent) ? $obj->situation_percent : 100), $multicurrency_tx);
2778
+                    $diff=price2num($tmpcal[1] - $obj->total_tva, 'MT', 1);
2779
+                    if ($diff)
2780
+                    {
2781
+                        $sqlfix="UPDATE ".MAIN_DB_PREFIX.$this->table_element_line." SET ".$fieldtva." = ".$tmpcal[1].", total_ttc = ".$tmpcal[2]." WHERE rowid = ".$obj->rowid;
2782
+                        dol_syslog('We found unconsistent data into detailed line (difference of '.$diff.') for line rowid = '.$obj->rowid." (total vat of line calculated=".$tmpcal[1].", database=".$obj->total_tva."). We fix the total_vat and total_ttc of line by running sqlfix = ".$sqlfix);
2783
+                                $resqlfix=$this->db->query($sqlfix);
2784
+                                if (! $resqlfix) dol_print_error($this->db,'Failed to update line');
2785
+                                $obj->total_tva = $tmpcal[1];
2786
+                                $obj->total_ttc = $tmpcal[2];
2787
+                        //
2788
+                    }
2789
+                }
2790
+
2791
+                $this->total_ht        += $obj->total_ht;		// The field visible at end of line detail
2792
+                $this->total_tva       += $obj->total_tva;
2793
+                $this->total_localtax1 += $obj->total_localtax1;
2794
+                $this->total_localtax2 += $obj->total_localtax2;
2795
+                $this->total_ttc       += $obj->total_ttc;
2796
+                $this->multicurrency_total_ht        += $obj->multicurrency_total_ht;		// The field visible at end of line detail
2797
+                $this->multicurrency_total_tva       += $obj->multicurrency_total_tva;
2798
+                $this->multicurrency_total_ttc       += $obj->multicurrency_total_ttc;
2799
+
2800
+                if (! isset($total_ht_by_vats[$obj->vatrate]))  $total_ht_by_vats[$obj->vatrate]=0;
2801
+                if (! isset($total_tva_by_vats[$obj->vatrate])) $total_tva_by_vats[$obj->vatrate]=0;
2802
+                if (! isset($total_ttc_by_vats[$obj->vatrate])) $total_ttc_by_vats[$obj->vatrate]=0;
2803
+                $total_ht_by_vats[$obj->vatrate]  += $obj->total_ht;
2804
+                $total_tva_by_vats[$obj->vatrate] += $obj->total_tva;
2805
+                $total_ttc_by_vats[$obj->vatrate] += $obj->total_ttc;
2806
+
2807
+                if ($forcedroundingmode == '1')	// Check if we need adjustement onto line for vat. TODO This works on the company currency but not on multicurrency
2808
+                {
2809
+                    $tmpvat=price2num($total_ht_by_vats[$obj->vatrate] * $obj->vatrate / 100, 'MT', 1);
2810
+                    $diff=price2num($total_tva_by_vats[$obj->vatrate]-$tmpvat, 'MT', 1);
2811
+                    //print 'Line '.$i.' rowid='.$obj->rowid.' vat_rate='.$obj->vatrate.' total_ht='.$obj->total_ht.' total_tva='.$obj->total_tva.' total_ttc='.$obj->total_ttc.' total_ht_by_vats='.$total_ht_by_vats[$obj->vatrate].' total_tva_by_vats='.$total_tva_by_vats[$obj->vatrate].' (new calculation = '.$tmpvat.') total_ttc_by_vats='.$total_ttc_by_vats[$obj->vatrate].($diff?" => DIFF":"")."<br>\n";
2812
+                    if ($diff)
2813
+                    {
2814
+                        if (abs($diff) > 0.1) { dol_syslog('A rounding difference was detected into TOTAL but is too high to be corrected', LOG_WARNING); exit; }
2815
+                        $sqlfix="UPDATE ".MAIN_DB_PREFIX.$this->table_element_line." SET ".$fieldtva." = ".($obj->total_tva - $diff).", total_ttc = ".($obj->total_ttc - $diff)." WHERE rowid = ".$obj->rowid;
2816
+                        dol_syslog('We found a difference of '.$diff.' for line rowid = '.$obj->rowid.". We fix the total_vat and total_ttc of line by running sqlfix = ".$sqlfix);
2817
+                                $resqlfix=$this->db->query($sqlfix);
2818
+                                if (! $resqlfix) dol_print_error($this->db,'Failed to update line');
2819
+                                $this->total_tva -= $diff;
2820
+                                $this->total_ttc -= $diff;
2821
+                                $total_tva_by_vats[$obj->vatrate] -= $diff;
2822
+                                $total_ttc_by_vats[$obj->vatrate] -= $diff;
2823
+                    }
2824
+                }
2825
+
2826
+                $i++;
2827
+            }
2828
+
2829
+            // Add revenue stamp to total
2830
+            $this->total_ttc       			+= isset($this->revenuestamp)?$this->revenuestamp:0;
2831
+            $this->multicurrency_total_ttc  += isset($this->revenuestamp)?($this->revenuestamp * $multicurrency_tx):0;
2832
+
2833
+            // Situations totals
2834
+            if ($this->situation_cycle_ref && $this->situation_counter > 1 && method_exists($this, 'get_prev_sits') && $this->type != $this::TYPE_CREDIT_NOTE )
2835
+            {
2836
+                $prev_sits = $this->get_prev_sits();
2837
+
2838
+                foreach ($prev_sits as $sit) {				// $sit is an object Facture loaded with a fetch.
2839
+                    $this->total_ht -= $sit->total_ht;
2840
+                    $this->total_tva -= $sit->total_tva;
2841
+                    $this->total_localtax1 -= $sit->total_localtax1;
2842
+                    $this->total_localtax2 -= $sit->total_localtax2;
2843
+                    $this->total_ttc -= $sit->total_ttc;
2844
+                    $this->multicurrency_total_ht -= $sit->multicurrency_total_ht;
2845
+                    $this->multicurrency_total_tva -= $sit->multicurrency_total_tva;
2846
+                    $this->multicurrency_total_ttc -= $sit->multicurrency_total_ttc;
2847
+                }
2848
+            }
2849
+
2850
+            $this->db->free($resql);
2851
+
2852
+            // Now update global field total_ht, total_ttc and tva
2853
+            $fieldht='total_ht';
2854
+            $fieldtva='tva';
2855
+            $fieldlocaltax1='localtax1';
2856
+            $fieldlocaltax2='localtax2';
2857
+            $fieldttc='total_ttc';
2858
+            // Specific code for backward compatibility with old field names
2859
+            if ($this->element == 'facture' || $this->element == 'facturerec')             $fieldht='total';
2860
+            if ($this->element == 'facture_fourn' || $this->element == 'invoice_supplier') $fieldtva='total_tva';
2861
+            if ($this->element == 'propal')                                                $fieldttc='total';
2862
+            if ($this->element == 'expensereport')                                         $fieldtva='total_tva';
2863
+            if ($this->element == 'supplier_proposal')                                     $fieldttc='total';
2864
+
2865
+            if (empty($nodatabaseupdate))
2866
+            {
2867
+                $sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element.' SET';
2868
+                $sql .= " ".$fieldht."='".price2num($this->total_ht)."',";
2869
+                $sql .= " ".$fieldtva."='".price2num($this->total_tva)."',";
2870
+                $sql .= " ".$fieldlocaltax1."='".price2num($this->total_localtax1)."',";
2871
+                $sql .= " ".$fieldlocaltax2."='".price2num($this->total_localtax2)."',";
2872
+                $sql .= " ".$fieldttc."='".price2num($this->total_ttc)."'";
2873
+                        $sql .= ", multicurrency_total_ht='".price2num($this->multicurrency_total_ht, 'MT', 1)."'";
2874
+                        $sql .= ", multicurrency_total_tva='".price2num($this->multicurrency_total_tva, 'MT', 1)."'";
2875
+                        $sql .= ", multicurrency_total_ttc='".price2num($this->multicurrency_total_ttc, 'MT', 1)."'";
2876
+                $sql .= ' WHERE rowid = '.$this->id;
2877
+
2878
+
2879
+                dol_syslog(get_class($this)."::update_price", LOG_DEBUG);
2880
+                $resql=$this->db->query($sql);
2881
+                if (! $resql)
2882
+                {
2883
+                    $error++;
2884
+                    $this->error=$this->db->lasterror();
2885
+                    $this->errors[]=$this->db->lasterror();
2886
+                }
2887
+            }
2888
+
2889
+            if (! $error)
2890
+            {
2891
+                return 1;
2892
+            }
2893
+            else
2894
+            {
2895
+                return -1;
2896
+            }
2897
+        }
2898
+        else
2899
+        {
2900
+            dol_print_error($this->db,'Bad request in update_price');
2901
+            return -1;
2902
+        }
2903
+    }
2904
+
2905
+    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
2906
+    /**
2907
+     *	Add objects linked in llx_element_element.
2908
+     *
2909
+     *	@param		string	$origin		Linked element type
2910
+     *	@param		int		$origin_id	Linked element id
2911
+     *	@return		int					<=0 if KO, >0 if OK
2912
+     *	@see		fetchObjectLinked, updateObjectLinked, deleteObjectLinked
2913
+     */
2914
+    function add_object_linked($origin=null, $origin_id=null)
2915
+    {
2916
+        // phpcs:enable
2917
+        $origin = (! empty($origin) ? $origin : $this->origin);
2918
+        $origin_id = (! empty($origin_id) ? $origin_id : $this->origin_id);
2919
+
2920
+        // Special case
2921
+        if ($origin == 'order') $origin='commande';
2922
+        if ($origin == 'invoice') $origin='facture';
2923
+        if ($origin == 'invoice_template') $origin='facturerec';
2924
+        if ($origin == 'supplierorder') $origin='order_supplier';
2925
+        $this->db->begin();
2926
+
2927
+        $sql = "INSERT INTO ".MAIN_DB_PREFIX."element_element (";
2928
+        $sql.= "fk_source";
2929
+        $sql.= ", sourcetype";
2930
+        $sql.= ", fk_target";
2931
+        $sql.= ", targettype";
2932
+        $sql.= ") VALUES (";
2933
+        $sql.= $origin_id;
2934
+        $sql.= ", '".$this->db->escape($origin)."'";
2935
+        $sql.= ", ".$this->id;
2936
+        $sql.= ", '".$this->db->escape($this->element)."'";
2937
+        $sql.= ")";
2938
+
2939
+        dol_syslog(get_class($this)."::add_object_linked", LOG_DEBUG);
2940
+        if ($this->db->query($sql))
2941
+            {
2942
+                $this->db->commit();
2943
+                return 1;
2944
+            }
2945
+            else
2946
+            {
2947
+                $this->error=$this->db->lasterror();
2948
+                $this->db->rollback();
2949
+                return 0;
2950
+            }
2951
+    }
2952
+
2953
+    /**
2954
+     *	Fetch array of objects linked to current object (object of enabled modules only). Links are loaded into
2955
+     *		this->linkedObjectsIds array and
2956
+     *		this->linkedObjects array if $loadalsoobjects = 1
2957
+     *  Possible usage for parameters:
2958
+     *  - all parameters empty -> we look all link to current object (current object can be source or target)
2959
+     *  - source id+type -> will get target list linked to source
2960
+     *  - target id+type -> will get source list linked to target
2961
+     *  - source id+type + target type -> will get target list of the type
2962
+     *  - target id+type + target source -> will get source list of the type
2963
+     *
2964
+     *	@param	int		$sourceid			Object source id (if not defined, id of object)
2965
+     *	@param  string	$sourcetype			Object source type (if not defined, element name of object)
2966
+     *	@param  int		$targetid			Object target id (if not defined, id of object)
2967
+     *	@param  string	$targettype			Object target type (if not defined, elemennt name of object)
2968
+     *	@param  string	$clause				'OR' or 'AND' clause used when both source id and target id are provided
2969
+     *  @param  int		$alsosametype		0=Return only links to object that differs from source type. 1=Include also link to objects of same type.
2970
+     *  @param  string	$orderby			SQL 'ORDER BY' clause
2971
+     *  @param	int		$loadalsoobjects	Load also array this->linkedObjects (Use 0 to increase performances)
2972
+     *	@return int							<0 if KO, >0 if OK
2973
+     *  @see	add_object_linked, updateObjectLinked, deleteObjectLinked
2974
+     */
2975
+    function fetchObjectLinked($sourceid=null,$sourcetype='',$targetid=null,$targettype='',$clause='OR',$alsosametype=1,$orderby='sourcetype',$loadalsoobjects=1)
2976
+    {
2977
+        global $conf;
2978
+
2979
+        $this->linkedObjectsIds=array();
2980
+        $this->linkedObjects=array();
2981
+
2982
+        $justsource=false;
2983
+        $justtarget=false;
2984
+        $withtargettype=false;
2985
+        $withsourcetype=false;
2986
+
2987
+        if (! empty($sourceid) && ! empty($sourcetype) && empty($targetid))
2988
+        {
2989
+            $justsource=true;  // the source (id and type) is a search criteria
2990
+            if (! empty($targettype)) $withtargettype=true;
2991
+        }
2992
+        if (! empty($targetid) && ! empty($targettype) && empty($sourceid))
2993
+        {
2994
+            $justtarget=true;  // the target (id and type) is a search criteria
2995
+            if (! empty($sourcetype)) $withsourcetype=true;
2996
+        }
2997
+
2998
+        $sourceid = (! empty($sourceid) ? $sourceid : $this->id);
2999
+        $targetid = (! empty($targetid) ? $targetid : $this->id);
3000
+        $sourcetype = (! empty($sourcetype) ? $sourcetype : $this->element);
3001
+        $targettype = (! empty($targettype) ? $targettype : $this->element);
3002
+
3003
+        /*if (empty($sourceid) && empty($targetid))
3004
+		 {
3005
+		 dol_syslog('Bad usage of function. No source nor target id defined (nor as parameter nor as object id)', LOG_ERR);
3006
+		 return -1;
3007
+		 }*/
3008
+
3009
+        // Links between objects are stored in table element_element
3010
+        $sql = 'SELECT rowid, fk_source, sourcetype, fk_target, targettype';
3011
+        $sql.= ' FROM '.MAIN_DB_PREFIX.'element_element';
3012
+        $sql.= " WHERE ";
3013
+        if ($justsource || $justtarget)
3014
+        {
3015
+            if ($justsource)
3016
+            {
3017
+                $sql.= "fk_source = ".$sourceid." AND sourcetype = '".$sourcetype."'";
3018
+                if ($withtargettype) $sql.= " AND targettype = '".$targettype."'";
3019
+            }
3020
+            else if ($justtarget)
3021
+            {
3022
+                $sql.= "fk_target = ".$targetid." AND targettype = '".$targettype."'";
3023
+                if ($withsourcetype) $sql.= " AND sourcetype = '".$sourcetype."'";
3024
+            }
3025
+        }
3026
+        else
3027
+        {
3028
+            $sql.= "(fk_source = ".$sourceid." AND sourcetype = '".$sourcetype."')";
3029
+            $sql.= " ".$clause." (fk_target = ".$targetid." AND targettype = '".$targettype."')";
3030
+        }
3031
+        $sql .= ' ORDER BY '.$orderby;
3032
+
3033
+        dol_syslog(get_class($this)."::fetchObjectLink", LOG_DEBUG);
3034
+        $resql = $this->db->query($sql);
3035
+        if ($resql)
3036
+        {
3037
+            $num = $this->db->num_rows($resql);
3038
+            $i = 0;
3039
+            while ($i < $num)
3040
+            {
3041
+                $obj = $this->db->fetch_object($resql);
3042
+                if ($justsource || $justtarget)
3043
+                {
3044
+                    if ($justsource)
3045
+                    {
3046
+                        $this->linkedObjectsIds[$obj->targettype][$obj->rowid]=$obj->fk_target;
3047
+                    }
3048
+                    else if ($justtarget)
3049
+                    {
3050
+                        $this->linkedObjectsIds[$obj->sourcetype][$obj->rowid]=$obj->fk_source;
3051
+                    }
3052
+                }
3053
+                else
3054
+                {
3055
+                    if ($obj->fk_source == $sourceid && $obj->sourcetype == $sourcetype)
3056
+                    {
3057
+                        $this->linkedObjectsIds[$obj->targettype][$obj->rowid]=$obj->fk_target;
3058
+                    }
3059
+                    if ($obj->fk_target == $targetid && $obj->targettype == $targettype)
3060
+                    {
3061
+                        $this->linkedObjectsIds[$obj->sourcetype][$obj->rowid]=$obj->fk_source;
3062
+                    }
3063
+                }
3064
+                $i++;
3065
+            }
3066
+
3067
+            if (! empty($this->linkedObjectsIds))
3068
+            {
3069
+                $tmparray = $this->linkedObjectsIds;
3070
+                foreach($tmparray as $objecttype => $objectids)       // $objecttype is a module name ('facture', 'mymodule', ...) or a module name with a suffix ('project_task', 'mymodule_myobj', ...)
3071
+                {
3072
+                    // Parse element/subelement (ex: project_task, cabinetmed_consultation, ...)
3073
+                    $module = $element = $subelement = $objecttype;
3074
+                    if ($objecttype != 'supplier_proposal' && $objecttype != 'order_supplier' && $objecttype != 'invoice_supplier'
3075
+                        && preg_match('/^([^_]+)_([^_]+)/i',$objecttype,$regs))
3076
+                    {
3077
+                        $module = $element = $regs[1];
3078
+                        $subelement = $regs[2];
3079
+                    }
3080
+
3081
+                    $classpath = $element.'/class';
3082
+                    // To work with non standard classpath or module name
3083
+                    if ($objecttype == 'facture')			{
3084
+                        $classpath = 'compta/facture/class';
3085
+                    }
3086
+                    else if ($objecttype == 'facturerec')			{
3087
+                        $classpath = 'compta/facture/class'; $module = 'facture';
3088
+                    }
3089
+                    else if ($objecttype == 'propal')			{
3090
+                        $classpath = 'comm/propal/class';
3091
+                    }
3092
+                    else if ($objecttype == 'supplier_proposal')			{
3093
+                        $classpath = 'supplier_proposal/class';
3094
+                    }
3095
+                    else if ($objecttype == 'shipping')			{
3096
+                        $classpath = 'expedition/class'; $subelement = 'expedition'; $module = 'expedition_bon';
3097
+                    }
3098
+                    else if ($objecttype == 'delivery')			{
3099
+                        $classpath = 'livraison/class'; $subelement = 'livraison'; $module = 'livraison_bon';
3100
+                    }
3101
+                    else if ($objecttype == 'invoice_supplier' || $objecttype == 'order_supplier')	{
3102
+                        $classpath = 'fourn/class'; $module = 'fournisseur';
3103
+                    }
3104
+                    else if ($objecttype == 'fichinter')			{
3105
+                        $classpath = 'fichinter/class'; $subelement = 'fichinter'; $module = 'ficheinter';
3106
+                    }
3107
+                    else if ($objecttype == 'subscription')			{
3108
+                        $classpath = 'adherents/class'; $module = 'adherent';
3109
+                    }
3110
+
3111
+                    // Set classfile
3112
+                    $classfile = strtolower($subelement); $classname = ucfirst($subelement);
3113
+
3114
+                    if ($objecttype == 'order') {
3115
+                        $classfile = 'commande'; $classname = 'Commande';
3116
+                    }
3117
+                    else if ($objecttype == 'invoice_supplier') {
3118
+                        $classfile = 'fournisseur.facture'; $classname = 'FactureFournisseur';
3119
+                    }
3120
+                    else if ($objecttype == 'order_supplier')   {
3121
+                        $classfile = 'fournisseur.commande'; $classname = 'CommandeFournisseur';
3122
+                    }
3123
+                    else if ($objecttype == 'supplier_proposal')   {
3124
+                        $classfile = 'supplier_proposal'; $classname = 'SupplierProposal';
3125
+                    }
3126
+                    else if ($objecttype == 'facturerec')   {
3127
+                        $classfile = 'facture-rec'; $classname = 'FactureRec';
3128
+                    }
3129
+                    else if ($objecttype == 'subscription')   {
3130
+                        $classfile = 'subscription'; $classname = 'Subscription';
3131
+                    }
3132
+
3133
+                    // Here $module, $classfile and $classname are set
3134
+                    if ($conf->$module->enabled && (($element != $this->element) || $alsosametype))
3135
+                    {
3136
+                        if ($loadalsoobjects)
3137
+                        {
3138
+                            dol_include_once('/'.$classpath.'/'.$classfile.'.class.php');
3139
+                            //print '/'.$classpath.'/'.$classfile.'.class.php '.class_exists($classname);
3140
+                            if (class_exists($classname))
3141
+                            {
3142
+                                foreach($objectids as $i => $objectid)	// $i is rowid into llx_element_element
3143
+                                {
3144
+                                    $object = new $classname($this->db);
3145
+                                    $ret = $object->fetch($objectid);
3146
+                                    if ($ret >= 0)
3147
+                                    {
3148
+                                        $this->linkedObjects[$objecttype][$i] = $object;
3149
+                                    }
3150
+                                }
3151
+                            }
3152
+                        }
3153
+                    }
3154
+                    else
3155
+                    {
3156
+                        unset($this->linkedObjectsIds[$objecttype]);
3157
+                    }
3158
+                }
3159
+            }
3160
+            return 1;
3161
+        }
3162
+        else
3163
+        {
3164
+            dol_print_error($this->db);
3165
+            return -1;
3166
+        }
3167
+    }
3168
+
3169
+    /**
3170
+     *	Update object linked of a current object
3171
+     *
3172
+     *	@param	int		$sourceid		Object source id
3173
+     *	@param  string	$sourcetype		Object source type
3174
+     *	@param  int		$targetid		Object target id
3175
+     *	@param  string	$targettype		Object target type
3176
+     *	@return							int	>0 if OK, <0 if KO
3177
+     *	@see	add_object_linked, fetObjectLinked, deleteObjectLinked
3178
+     */
3179
+    function updateObjectLinked($sourceid=null, $sourcetype='', $targetid=null, $targettype='')
3180
+    {
3181
+        $updatesource=false;
3182
+        $updatetarget=false;
3183
+
3184
+        if (! empty($sourceid) && ! empty($sourcetype) && empty($targetid) && empty($targettype)) $updatesource=true;
3185
+        else if (empty($sourceid) && empty($sourcetype) && ! empty($targetid) && ! empty($targettype)) $updatetarget=true;
3186
+
3187
+        $sql = "UPDATE ".MAIN_DB_PREFIX."element_element SET ";
3188
+        if ($updatesource)
3189
+        {
3190
+            $sql.= "fk_source = ".$sourceid;
3191
+            $sql.= ", sourcetype = '".$this->db->escape($sourcetype)."'";
3192
+            $sql.= " WHERE fk_target = ".$this->id;
3193
+            $sql.= " AND targettype = '".$this->db->escape($this->element)."'";
3194
+        }
3195
+        else if ($updatetarget)
3196
+        {
3197
+            $sql.= "fk_target = ".$targetid;
3198
+            $sql.= ", targettype = '".$this->db->escape($targettype)."'";
3199
+            $sql.= " WHERE fk_source = ".$this->id;
3200
+            $sql.= " AND sourcetype = '".$this->db->escape($this->element)."'";
3201
+        }
3202
+
3203
+        dol_syslog(get_class($this)."::updateObjectLinked", LOG_DEBUG);
3204
+        if ($this->db->query($sql))
3205
+        {
3206
+            return 1;
3207
+        }
3208
+        else
3209
+        {
3210
+            $this->error=$this->db->lasterror();
3211
+            return -1;
3212
+        }
3213
+    }
3214
+
3215
+    /**
3216
+     *	Delete all links between an object $this
3217
+     *
3218
+     *	@param	int		$sourceid		Object source id
3219
+     *	@param  string	$sourcetype		Object source type
3220
+     *	@param  int		$targetid		Object target id
3221
+     *	@param  string	$targettype		Object target type
3222
+     *  @param	int		$rowid			Row id of line to delete. If defined, other parameters are not used.
3223
+     *	@return     					int	>0 if OK, <0 if KO
3224
+     *	@see	add_object_linked, updateObjectLinked, fetchObjectLinked
3225
+     */
3226
+    function deleteObjectLinked($sourceid=null, $sourcetype='', $targetid=null, $targettype='', $rowid='')
3227
+    {
3228
+        $deletesource=false;
3229
+        $deletetarget=false;
3230
+
3231
+        if (! empty($sourceid) && ! empty($sourcetype) && empty($targetid) && empty($targettype)) $deletesource=true;
3232
+        else if (empty($sourceid) && empty($sourcetype) && ! empty($targetid) && ! empty($targettype)) $deletetarget=true;
3233
+
3234
+        $sourceid = (! empty($sourceid) ? $sourceid : $this->id);
3235
+        $sourcetype = (! empty($sourcetype) ? $sourcetype : $this->element);
3236
+        $targetid = (! empty($targetid) ? $targetid : $this->id);
3237
+        $targettype = (! empty($targettype) ? $targettype : $this->element);
3238
+
3239
+        $sql = "DELETE FROM ".MAIN_DB_PREFIX."element_element";
3240
+        $sql.= " WHERE";
3241
+        if ($rowid > 0)
3242
+        {
3243
+            $sql.=" rowid = ".$rowid;
3244
+        }
3245
+        else
3246
+        {
3247
+            if ($deletesource)
3248
+            {
3249
+                $sql.= " fk_source = ".$sourceid." AND sourcetype = '".$this->db->escape($sourcetype)."'";
3250
+                $sql.= " AND fk_target = ".$this->id." AND targettype = '".$this->db->escape($this->element)."'";
3251
+            }
3252
+            else if ($deletetarget)
3253
+            {
3254
+                $sql.= " fk_target = ".$targetid." AND targettype = '".$this->db->escape($targettype)."'";
3255
+                $sql.= " AND fk_source = ".$this->id." AND sourcetype = '".$this->db->escape($this->element)."'";
3256
+            }
3257
+            else
3258
+            {
3259
+                $sql.= " (fk_source = ".$this->id." AND sourcetype = '".$this->db->escape($this->element)."')";
3260
+                $sql.= " OR";
3261
+                $sql.= " (fk_target = ".$this->id." AND targettype = '".$this->db->escape($this->element)."')";
3262
+            }
3263
+        }
3264
+
3265
+        dol_syslog(get_class($this)."::deleteObjectLinked", LOG_DEBUG);
3266
+        if ($this->db->query($sql))
3267
+        {
3268
+            return 1;
3269
+        }
3270
+        else
3271
+        {
3272
+            $this->error=$this->db->lasterror();
3273
+            $this->errors[]=$this->error;
3274
+            return -1;
3275
+        }
3276
+    }
3277
+
3278
+    /**
3279
+     *      Set status of an object
3280
+     *
3281
+     *      @param	int		$status			Status to set
3282
+     *      @param	int		$elementId		Id of element to force (use this->id by default)
3283
+     *      @param	string	$elementType	Type of element to force (use this->table_element by default)
3284
+     *      @param	string	$trigkey		Trigger key to use for trigger
3285
+     *      @return int						<0 if KO, >0 if OK
3286
+     */
3287
+    function setStatut($status, $elementId=null, $elementType='', $trigkey='')
3288
+    {
3289
+        global $user,$langs,$conf;
3290
+
3291
+        $savElementId=$elementId;  // To be used later to know if we were using the method using the id of this or not.
3292
+
3293
+        $elementId = (!empty($elementId)?$elementId:$this->id);
3294
+        $elementTable = (!empty($elementType)?$elementType:$this->table_element);
3295
+
3296
+        $this->db->begin();
3297
+
3298
+        $fieldstatus="fk_statut";
3299
+        if ($elementTable == 'facture_rec') $fieldstatus="suspended";
3300
+        if ($elementTable == 'mailing') $fieldstatus="statut";
3301
+        if ($elementTable == 'cronjob') $fieldstatus="status";
3302
+        if ($elementTable == 'user') $fieldstatus="statut";
3303
+        if ($elementTable == 'expensereport') $fieldstatus="fk_statut";
3304
+        if ($elementTable == 'commande_fournisseur_dispatch') $fieldstatus="status";
3305
+
3306
+        $sql = "UPDATE ".MAIN_DB_PREFIX.$elementTable;
3307
+        $sql.= " SET ".$fieldstatus." = ".$status;
3308
+        // If status = 1 = validated, update also fk_user_valid
3309
+        if ($status == 1 && $elementTable == 'expensereport') $sql.=", fk_user_valid = ".$user->id;
3310
+        $sql.= " WHERE rowid=".$elementId;
3311
+
3312
+        dol_syslog(get_class($this)."::setStatut", LOG_DEBUG);
3313
+        if ($this->db->query($sql))
3314
+        {
3315
+            $error = 0;
3316
+
3317
+            // Try autoset of trigkey
3318
+            if (empty($trigkey))
3319
+            {
3320
+                if ($this->element == 'supplier_proposal' && $status == 2) $trigkey='SUPPLIER_PROPOSAL_SIGN';   // 2 = SupplierProposal::STATUS_SIGNED. Can't use constant into this generic class
3321
+                if ($this->element == 'supplier_proposal' && $status == 3) $trigkey='SUPPLIER_PROPOSAL_REFUSE'; // 3 = SupplierProposal::STATUS_REFUSED. Can't use constant into this generic class
3322
+                if ($this->element == 'supplier_proposal' && $status == 4) $trigkey='SUPPLIER_PROPOSAL_CLOSE';  // 4 = SupplierProposal::STATUS_CLOSED. Can't use constant into this generic class
3323
+                if ($this->element == 'fichinter' && $status == 3) $trigkey='FICHINTER_CLASSIFY_DONE';
3324
+                if ($this->element == 'fichinter' && $status == 2) $trigkey='FICHINTER_CLASSIFY_BILLED';
3325
+                if ($this->element == 'fichinter' && $status == 1) $trigkey='FICHINTER_CLASSIFY_UNBILLED';
3326
+            }
3327
+
3328
+            if ($trigkey)
3329
+            {
3330
+                // Appel des triggers
3331
+                include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php';
3332
+                $interface=new Interfaces($this->db);
3333
+                $result=$interface->run_triggers($trigkey,$this,$user,$langs,$conf);
3334
+                if ($result < 0) {
3335
+                    $error++; $this->errors=$interface->errors;
3336
+                }
3337
+                // Fin appel triggers
3338
+            }
3339
+
3340
+            if (! $error)
3341
+            {
3342
+                $this->db->commit();
3343
+
3344
+                if (empty($savElementId))    // If the element we update was $this (so $elementId is null)
3345
+                {
3346
+                    $this->statut = $status;
3347
+                    $this->status = $status;
3348
+                }
3349
+
3350
+                return 1;
3351
+            }
3352
+            else
3353
+            {
3354
+                $this->db->rollback();
3355
+                dol_syslog(get_class($this)."::setStatus ".$this->error,LOG_ERR);
3356
+                return -1;
3357
+            }
3358
+        }
3359
+        else
3360
+        {
3361
+            $this->error=$this->db->lasterror();
3362
+            $this->db->rollback();
3363
+            return -1;
3364
+        }
3365
+    }
3366
+
3367
+
3368
+    /**
3369
+     *  Load type of canvas of an object if it exists
3370
+     *
3371
+     *  @param      int		$id     Record id
3372
+     *  @param      string	$ref    Record ref
3373
+     *  @return		int				<0 if KO, 0 if nothing done, >0 if OK
3374
+     */
3375
+    function getCanvas($id=0,$ref='')
3376
+    {
3377
+        global $conf;
3378
+
3379
+        if (empty($id) && empty($ref)) return 0;
3380
+        if (! empty($conf->global->MAIN_DISABLE_CANVAS)) return 0;    // To increase speed. Not enabled by default.
3381
+
3382
+        // Clean parameters
3383
+        $ref = trim($ref);
3384
+
3385
+        $sql = "SELECT rowid, canvas";
3386
+        $sql.= " FROM ".MAIN_DB_PREFIX.$this->table_element;
3387
+        $sql.= " WHERE entity IN (".getEntity($this->element).")";
3388
+        if (! empty($id))  $sql.= " AND rowid = ".$id;
3389
+        if (! empty($ref)) $sql.= " AND ref = '".$this->db->escape($ref)."'";
3390
+
3391
+        $resql = $this->db->query($sql);
3392
+        if ($resql)
3393
+        {
3394
+            $obj = $this->db->fetch_object($resql);
3395
+            if ($obj)
3396
+            {
3397
+                $this->canvas   = $obj->canvas;
3398
+                return 1;
3399
+            }
3400
+            else return 0;
3401
+        }
3402
+        else
3403
+        {
3404
+            dol_print_error($this->db);
3405
+            return -1;
3406
+        }
3407
+    }
3408
+
3409
+
3410
+    /**
3411
+     * 	Get special code of a line
3412
+     *
3413
+     * 	@param	int		$lineid		Id of line
3414
+     * 	@return	int					Special code
3415
+     */
3416
+    function getSpecialCode($lineid)
3417
+    {
3418
+        $sql = 'SELECT special_code FROM '.MAIN_DB_PREFIX.$this->table_element_line;
3419
+        $sql.= ' WHERE rowid = '.$lineid;
3420
+        $resql = $this->db->query($sql);
3421
+        if ($resql)
3422
+        {
3423
+            $row = $this->db->fetch_row($resql);
3424
+            return $row[0];
3425
+        }
3426
+    }
3427
+
3428
+    /**
3429
+     *  Function to check if an object is used by others.
3430
+     *  Check is done into this->childtables. There is no check into llx_element_element.
3431
+     *
3432
+     *  @param	int		$id			Force id of object
3433
+     *  @return	int					<0 if KO, 0 if not used, >0 if already used
3434
+     */
3435
+    function isObjectUsed($id=0)
3436
+    {
3437
+        global $langs;
3438
+
3439
+        if (empty($id)) $id=$this->id;
3440
+
3441
+        // Check parameters
3442
+        if (! isset($this->childtables) || ! is_array($this->childtables) || count($this->childtables) == 0)
3443
+        {
3444
+            dol_print_error('Called isObjectUsed on a class with property this->childtables not defined');
3445
+            return -1;
3446
+        }
3447
+
3448
+        $arraytoscan = $this->childtables;
3449
+        // For backward compatibility, we check if array is old format array('table1', 'table2', ...)
3450
+        $tmparray=array_keys($this->childtables);
3451
+        if (is_numeric($tmparray[0]))
3452
+        {
3453
+            $arraytoscan = array_flip($this->childtables);
3454
+        }
3455
+
3456
+        // Test if child exists
3457
+        $haschild=0;
3458
+        foreach($arraytoscan as $table => $elementname)
3459
+        {
3460
+            //print $id.'-'.$table.'-'.$elementname.'<br>';
3461
+            // Check if third party can be deleted
3462
+            $sql = "SELECT COUNT(*) as nb from ".MAIN_DB_PREFIX.$table;
3463
+            $sql.= " WHERE ".$this->fk_element." = ".$id;
3464
+            $resql=$this->db->query($sql);
3465
+            if ($resql)
3466
+            {
3467
+                $obj=$this->db->fetch_object($resql);
3468
+                if ($obj->nb > 0)
3469
+                {
3470
+                    $langs->load("errors");
3471
+                    //print 'Found into table '.$table.', type '.$langs->transnoentitiesnoconv($elementname).', haschild='.$haschild;
3472
+                    $haschild += $obj->nb;
3473
+                    if (is_numeric($elementname))	// old usage
3474
+                    {
3475
+                        $this->errors[]=$langs->trans("ErrorRecordHasAtLeastOneChildOfType", $table);
3476
+                    }
3477
+                    else	// new usage: $elementname=Translation key
3478
+                    {
3479
+                        $this->errors[]=$langs->trans("ErrorRecordHasAtLeastOneChildOfType", $langs->transnoentitiesnoconv($elementname));
3480
+                    }
3481
+                    break;    // We found at least one, we stop here
3482
+                }
3483
+            }
3484
+            else
3485
+            {
3486
+                $this->errors[]=$this->db->lasterror();
3487
+                return -1;
3488
+            }
3489
+        }
3490
+        if ($haschild > 0)
3491
+        {
3492
+            $this->errors[]="ErrorRecordHasChildren";
3493
+            return $haschild;
3494
+        }
3495
+        else return 0;
3496
+    }
3497
+
3498
+    /**
3499
+     *  Function to say how many lines object contains
3500
+     *
3501
+     *	@param	int		$predefined		-1=All, 0=Count free product/service only, 1=Count predefined product/service only, 2=Count predefined product, 3=Count predefined service
3502
+     *  @return	int						<0 if KO, 0 if no predefined products, nb of lines with predefined products if found
3503
+     */
3504
+    function hasProductsOrServices($predefined=-1)
3505
+    {
3506
+        $nb=0;
3507
+
3508
+        foreach($this->lines as $key => $val)
3509
+        {
3510
+            $qualified=0;
3511
+            if ($predefined == -1) $qualified=1;
3512
+            if ($predefined == 1 && $val->fk_product > 0) $qualified=1;
3513
+            if ($predefined == 0 && $val->fk_product <= 0) $qualified=1;
3514
+            if ($predefined == 2 && $val->fk_product > 0 && $val->product_type==0) $qualified=1;
3515
+            if ($predefined == 3 && $val->fk_product > 0 && $val->product_type==1) $qualified=1;
3516
+            if ($qualified) $nb++;
3517
+        }
3518
+        dol_syslog(get_class($this).'::hasProductsOrServices we found '.$nb.' qualified lines of products/servcies');
3519
+        return $nb;
3520
+    }
3521
+
3522
+    /**
3523
+     * Function that returns the total amount HT of discounts applied for all lines.
3524
+     *
3525
+     * @return 	float
3526
+     */
3527
+    function getTotalDiscount()
3528
+    {
3529
+        $total_discount=0.00;
3530
+
3531
+        $sql = "SELECT subprice as pu_ht, qty, remise_percent, total_ht";
3532
+        $sql.= " FROM ".MAIN_DB_PREFIX.$this->table_element."det";
3533
+        $sql.= " WHERE ".$this->fk_element." = ".$this->id;
3534
+
3535
+        dol_syslog(get_class($this).'::getTotalDiscount', LOG_DEBUG);
3536
+        $resql = $this->db->query($sql);
3537
+        if ($resql)
3538
+        {
3539
+            $num=$this->db->num_rows($resql);
3540
+            $i=0;
3541
+            while ($i < $num)
3542
+            {
3543
+                $obj = $this->db->fetch_object($resql);
3544
+
3545
+                $pu_ht = $obj->pu_ht;
3546
+                $qty= $obj->qty;
3547
+                $total_ht = $obj->total_ht;
3548
+
3549
+                $total_discount_line = floatval(price2num(($pu_ht * $qty) - $total_ht, 'MT'));
3550
+                $total_discount += $total_discount_line;
3551
+
3552
+                $i++;
3553
+            }
3554
+        }
3555
+
3556
+        //print $total_discount; exit;
3557
+        return price2num($total_discount);
3558
+    }
3559
+
3560
+
3561
+    /**
3562
+     * Return into unit=0, the calculated total of weight and volume of all lines * qty
3563
+     * Calculate by adding weight and volume of each product line, so properties ->volume/volume_units/weight/weight_units must be loaded on line.
3564
+     *
3565
+     * @return  array                           array('weight'=>...,'volume'=>...)
3566
+     */
3567
+    function getTotalWeightVolume()
3568
+    {
3569
+        $totalWeight = 0;
3570
+        $totalVolume = 0;
3571
+        // defined for shipment only
3572
+        $totalOrdered = '';
3573
+        // defined for shipment only
3574
+        $totalToShip = '';
3575
+
3576
+        foreach ($this->lines as $line)
3577
+        {
3578
+            if (isset($line->qty_asked))
3579
+            {
3580
+                if (empty($totalOrdered)) $totalOrdered=0;  // Avoid warning because $totalOrdered is ''
3581
+                $totalOrdered+=$line->qty_asked;    // defined for shipment only
3582
+            }
3583
+            if (isset($line->qty_shipped))
3584
+            {
3585
+                if (empty($totalToShip)) $totalToShip=0;    // Avoid warning because $totalToShip is ''
3586
+                $totalToShip+=$line->qty_shipped;   // defined for shipment only
3587
+            }else if ($line->element == 'commandefournisseurdispatch' && isset($line->qty))
3588
+            {
3589
+                if (empty($totalToShip)) $totalToShip=0;
3590
+                $totalToShip+=$line->qty;   // defined for reception only
3591
+            }
3592
+
3593
+            // Define qty, weight, volume, weight_units, volume_units
3594
+            if ($this->element == 'shipping') {
3595
+                // for shipments
3596
+                $qty = $line->qty_shipped ? $line->qty_shipped : 0;
3597
+            }
3598
+            else {
3599
+                $qty = $line->qty ? $line->qty : 0;
3600
+            }
3601
+
3602
+            $weight = $line->weight ? $line->weight : 0;
3603
+            ($weight==0 && !empty($line->product->weight))? $weight=$line->product->weight: 0;
3604
+            $volume = $line->volume ? $line->volume : 0;
3605
+            ($volume==0 && !empty($line->product->volume))? $volume=$line->product->volume: 0;
3606
+
3607
+            $weight_units=$line->weight_units;
3608
+            ($weight_units==0 && !empty($line->product->weight_units))? $weight_units=$line->product->weight_units: 0;
3609
+            $volume_units=$line->volume_units;
3610
+            ($volume_units==0 && !empty($line->product->volume_units))? $volume_units=$line->product->volume_units: 0;
3611
+
3612
+            $weightUnit=0;
3613
+            $volumeUnit=0;
3614
+            if (! empty($weight_units)) $weightUnit = $weight_units;
3615
+            if (! empty($volume_units)) $volumeUnit = $volume_units;
3616
+
3617
+            if (empty($totalWeight)) $totalWeight=0;  // Avoid warning because $totalWeight is ''
3618
+            if (empty($totalVolume)) $totalVolume=0;  // Avoid warning because $totalVolume is ''
3619
+
3620
+            //var_dump($line->volume_units);
3621
+            if ($weight_units < 50)   // >50 means a standard unit (power of 10 of official unit), > 50 means an exotic unit (like inch)
3622
+            {
3623
+                $trueWeightUnit=pow(10, $weightUnit);
3624
+                $totalWeight += $weight * $qty * $trueWeightUnit;
3625
+            }
3626
+            else {
3627
+        if ($weight_units == 99) {
3628
+            // conversion 1 Pound = 0.45359237 KG
3629
+            $trueWeightUnit = 0.45359237;
3630
+            $totalWeight += $weight * $qty * $trueWeightUnit;
3631
+        } elseif ($weight_units == 98) {
3632
+            // conversion 1 Ounce = 0.0283495 KG
3633
+            $trueWeightUnit = 0.0283495;
3634
+            $totalWeight += $weight * $qty * $trueWeightUnit;
3635
+        }
3636
+        else
3637
+                    $totalWeight += $weight * $qty;   // This may be wrong if we mix different units
3638
+            }
3639
+            if ($volume_units < 50)   // >50 means a standard unit (power of 10 of official unit), > 50 means an exotic unit (like inch)
3640
+            {
3641
+                //print $line->volume."x".$line->volume_units."x".($line->volume_units < 50)."x".$volumeUnit;
3642
+                $trueVolumeUnit=pow(10, $volumeUnit);
3643
+                //print $line->volume;
3644
+                $totalVolume += $volume * $qty * $trueVolumeUnit;
3645
+            }
3646
+            else
3647
+            {
3648
+                $totalVolume += $volume * $qty;   // This may be wrong if we mix different units
3649
+            }
3650
+        }
3651
+
3652
+        return array('weight'=>$totalWeight, 'volume'=>$totalVolume, 'ordered'=>$totalOrdered, 'toship'=>$totalToShip);
3653
+    }
3654
+
3655
+
3656
+    /**
3657
+     *	Set extra parameters
3658
+     *
3659
+     *	@return	int      <0 if KO, >0 if OK
3660
+     */
3661
+    function setExtraParameters()
3662
+    {
3663
+        $this->db->begin();
3664
+
3665
+        $extraparams = (! empty($this->extraparams) ? json_encode($this->extraparams) : null);
3666
+
3667
+        $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
3668
+        $sql.= " SET extraparams = ".(! empty($extraparams) ? "'".$this->db->escape($extraparams)."'" : "null");
3669
+        $sql.= " WHERE rowid = ".$this->id;
3670
+
3671
+        dol_syslog(get_class($this)."::setExtraParameters", LOG_DEBUG);
3672
+        $resql = $this->db->query($sql);
3673
+        if (! $resql)
3674
+        {
3675
+            $this->error=$this->db->lasterror();
3676
+            $this->db->rollback();
3677
+            return -1;
3678
+        }
3679
+        else
3680
+        {
3681
+            $this->db->commit();
3682
+            return 1;
3683
+        }
3684
+    }
3685
+
3686
+
3687
+    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
3688
+    /**
3689
+     *    Return incoterms informations
3690
+     *    TODO Use a cache for label get
3691
+     *
3692
+     *    @return	string	incoterms info
3693
+     */
3694
+    function display_incoterms()
3695
+    {
3696
+        // phpcs:enable
3697
+        $out = '';
3698
+        $this->libelle_incoterms = '';
3699
+        if (!empty($this->fk_incoterms))
3700
+        {
3701
+            $sql = 'SELECT code FROM '.MAIN_DB_PREFIX.'c_incoterms WHERE rowid = '.(int) $this->fk_incoterms;
3702
+            $result = $this->db->query($sql);
3703
+            if ($result)
3704
+            {
3705
+                $res = $this->db->fetch_object($result);
3706
+                $out .= $res->code;
3707
+            }
3708
+        }
3709
+
3710
+        $out .= (($res->code && $this->location_incoterms)?' - ':'').$this->location_incoterms;
3711
+
3712
+        return $out;
3713
+    }
3714
+
3715
+    /**
3716
+     *    Return incoterms informations for pdf display
3717
+     *
3718
+     *    @return	string		incoterms info
3719
+     */
3720
+    function getIncotermsForPDF()
3721
+    {
3722
+        $sql = 'SELECT code FROM '.MAIN_DB_PREFIX.'c_incoterms WHERE rowid = '.(int) $this->fk_incoterms;
3723
+        $resql = $this->db->query($sql);
3724
+        if ($resql)
3725
+        {
3726
+            $num = $this->db->num_rows($resql);
3727
+            if ($num > 0)
3728
+            {
3729
+                $res = $this->db->fetch_object($resql);
3730
+                return 'Incoterm : '.$res->code.' - '.$this->location_incoterms;
3731
+            }
3732
+            else
3733
+            {
3734
+                return '';
3735
+            }
3736
+        }
3737
+        else
3738
+        {
3739
+            $this->errors[] = $this->db->lasterror();
3740
+            return false;
3741
+        }
3742
+    }
3743
+
3744
+    /**
3745
+     *    Define incoterms values of current object
3746
+     *
3747
+     *    @param	int		$id_incoterm     Id of incoterm to set or '' to remove
3748
+     * 	  @param 	string  $location		 location of incoterm
3749
+     *    @return	int     		<0 if KO, >0 if OK
3750
+     */
3751
+    function setIncoterms($id_incoterm, $location)
3752
+    {
3753
+        if ($this->id && $this->table_element)
3754
+        {
3755
+            $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
3756
+            $sql.= " SET fk_incoterms = ".($id_incoterm > 0 ? $id_incoterm : "null");
3757
+            $sql.= ", location_incoterms = ".($id_incoterm > 0 ? "'".$this->db->escape($location)."'" : "null");
3758
+            $sql.= " WHERE rowid = " . $this->id;
3759
+            dol_syslog(get_class($this).'::setIncoterms', LOG_DEBUG);
3760
+            $resql=$this->db->query($sql);
3761
+            if ($resql)
3762
+            {
3763
+                $this->fk_incoterms = $id_incoterm;
3764
+                $this->location_incoterms = $location;
3765
+
3766
+                $sql = 'SELECT libelle FROM '.MAIN_DB_PREFIX.'c_incoterms WHERE rowid = '.(int) $this->fk_incoterms;
3767
+                $res = $this->db->query($sql);
3768
+                if ($res)
3769
+                {
3770
+                    $obj = $this->db->fetch_object($res);
3771
+                    $this->libelle_incoterms = $obj->libelle;
3772
+                }
3773
+                return 1;
3774
+            }
3775
+            else
3776
+            {
3777
+                $this->errors[] = $this->db->lasterror();
3778
+                return -1;
3779
+            }
3780
+        }
3781
+        else return -1;
3782
+    }
3783
+
3784
+
3785
+    // --------------------
3786
+    // TODO: All functions here must be redesigned and moved as they are not business functions but output functions
3787
+    // --------------------
3788
+
3789
+    /* This is to show add lines */
3790
+
3791
+    /**
3792
+     *	Show add free and predefined products/services form
3793
+     *
3794
+     *  @param	int		        $dateSelector       1=Show also date range input fields
3795
+     *  @param	Societe			$seller				Object thirdparty who sell
3796
+     *  @param	Societe			$buyer				Object thirdparty who buy
3797
+     *	@return	void
3798
+     */
3799
+    function formAddObjectLine($dateSelector, $seller, $buyer)
3800
+    {
3801
+        global $conf,$user,$langs,$object,$hookmanager;
3802
+        global $form,$bcnd,$var;
3803
+
3804
+        // Line extrafield
3805
+        require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
3806
+        $extrafieldsline = new ExtraFields($this->db);
3807
+        $extralabelslines=$extrafieldsline->fetch_name_optionals_label($this->table_element_line);
3808
+
3809
+        // Output template part (modules that overwrite templates must declare this into descriptor)
3810
+        // Use global variables + $dateSelector + $seller and $buyer
3811
+        $dirtpls=array_merge($conf->modules_parts['tpl'],array('/core/tpl'));
3812
+        foreach($dirtpls as $reldir)
3813
+        {
3814
+            $tpl = dol_buildpath($reldir.'/objectline_create.tpl.php');
3815
+            if (empty($conf->file->strict_mode)) {
3816
+                $res=@include $tpl;
3817
+            } else {
3818
+                $res=include $tpl; // for debug
3819
+            }
3820
+            if ($res) break;
3821
+        }
3822
+    }
3823
+
3824
+
3825
+
3826
+    /* This is to show array of line of details */
3827
+
3828
+
3829
+    /**
3830
+     *	Return HTML table for object lines
3831
+     *	TODO Move this into an output class file (htmlline.class.php)
3832
+     *	If lines are into a template, title must also be into a template
3833
+     *	But for the moment we don't know if it's possible as we keep a method available on overloaded objects.
3834
+     *
3835
+     *	@param	string		$action				Action code
3836
+     *	@param  string		$seller            	Object of seller third party
3837
+     *	@param  string  	$buyer             	Object of buyer third party
3838
+     *	@param	int			$selected		   	Object line selected
3839
+     *	@param  int	    	$dateSelector      	1=Show also date range input fields
3840
+     *	@return	void
3841
+     */
3842
+    function printObjectLines($action, $seller, $buyer, $selected=0, $dateSelector=0)
3843
+    {
3844
+        global $conf, $hookmanager, $langs, $user;
3845
+        // TODO We should not use global var for this !
3846
+        global $inputalsopricewithtax, $usemargins, $disableedit, $disablemove, $disableremove, $outputalsopricetotalwithtax;
3847
+
3848
+        // Define usemargins
3849
+        $usemargins=0;
3850
+        if (! empty($conf->margin->enabled) && ! empty($this->element) && in_array($this->element,array('facture','propal','commande'))) $usemargins=1;
3851
+
3852
+        $num = count($this->lines);
3853
+
3854
+        // Line extrafield
3855
+        require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
3856
+        $extrafieldsline = new ExtraFields($this->db);
3857
+        $extralabelslines=$extrafieldsline->fetch_name_optionals_label($this->table_element_line);
3858
+
3859
+        $parameters = array('num'=>$num,'i'=>$i,'dateSelector'=>$dateSelector,'seller'=>$seller,'buyer'=>$buyer,'selected'=>$selected, 'extrafieldsline'=>$extrafieldsline);
3860
+        $reshook = $hookmanager->executeHooks('printObjectLineTitle', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
3861
+        if (empty($reshook))
3862
+        {
3863
+            // Title line
3864
+            print "<thead>\n";
3865
+
3866
+            print '<tr class="liste_titre nodrag nodrop">';
3867
+
3868
+            // Adds a line numbering column
3869
+            if (! empty($conf->global->MAIN_VIEW_LINE_NUMBER)) print '<td class="linecolnum" align="center" width="5">&nbsp;</td>';
3870
+
3871
+            // Description
3872
+            print '<td class="linecoldescription">'.$langs->trans('Description').'</td>';
3873
+
3874
+            if ($this->element == 'supplier_proposal' || $this->element == 'order_supplier' || $this->element == 'invoice_supplier')
3875
+            {
3876
+                print '<td class="linerefsupplier"><span id="title_fourn_ref">'.$langs->trans("SupplierRef").'</span></td>';
3877
+            }
3878
+
3879
+            // VAT
3880
+            print '<td class="linecolvat" align="right" width="80">'.$langs->trans('VAT').'</td>';
3881
+
3882
+            // Price HT
3883
+            print '<td class="linecoluht" align="right" width="80">'.$langs->trans('PriceUHT').'</td>';
3884
+
3885
+            // Multicurrency
3886
+            if (!empty($conf->multicurrency->enabled) && $this->multicurrency_code != $conf->currency) print '<td class="linecoluht_currency" align="right" width="80">'.$langs->trans('PriceUHTCurrency', $this->multicurrency_code).'</td>';
3887
+
3888
+            if ($inputalsopricewithtax) print '<td align="right" width="80">'.$langs->trans('PriceUTTC').'</td>';
3889
+
3890
+            // Qty
3891
+            print '<td class="linecolqty" align="right">'.$langs->trans('Qty').'</td>';
3892
+
3893
+            if($conf->global->PRODUCT_USE_UNITS)
3894
+            {
3895
+                print '<td class="linecoluseunit" align="left">'.$langs->trans('Unit').'</td>';
3896
+            }
3897
+
3898
+            // Reduction short
3899
+            print '<td class="linecoldiscount" align="right">'.$langs->trans('ReductionShort').'</td>';
3900
+
3901
+            if ($this->situation_cycle_ref) {
3902
+                print '<td class="linecolcycleref" align="right">' . $langs->trans('Progress') . '</td>';
3903
+            }
3904
+
3905
+            if ($usemargins && ! empty($conf->margin->enabled) && empty($user->societe_id))
3906
+            {
3907
+                if (!empty($user->rights->margins->creer))
3908
+                {
3909
+                    if ($conf->global->MARGIN_TYPE == "1")
3910
+                        print '<td class="linecolmargin1 margininfos" align="right" width="80">'.$langs->trans('BuyingPrice').'</td>';
3911
+                    else
3912
+                        print '<td class="linecolmargin1 margininfos" align="right" width="80">'.$langs->trans('CostPrice').'</td>';
3913
+                }
3914
+
3915
+                if (! empty($conf->global->DISPLAY_MARGIN_RATES) && $user->rights->margins->liretous)
3916
+                    print '<td class="linecolmargin2 margininfos" align="right" width="50">'.$langs->trans('MarginRate').'</td>';
3917
+                if (! empty($conf->global->DISPLAY_MARK_RATES) && $user->rights->margins->liretous)
3918
+                    print '<td class="linecolmargin2 margininfos" align="right" width="50">'.$langs->trans('MarkRate').'</td>';
3919
+            }
3920
+
3921
+            // Total HT
3922
+            print '<td class="linecolht" align="right">'.$langs->trans('TotalHTShort').'</td>';
3923
+
3924
+            // Multicurrency
3925
+            if (!empty($conf->multicurrency->enabled) && $this->multicurrency_code != $conf->currency) print '<td class="linecoltotalht_currency" align="right">'.$langs->trans('TotalHTShortCurrency', $this->multicurrency_code).'</td>';
3926
+
3927
+            if ($outputalsopricetotalwithtax) print '<td align="right" width="80">'.$langs->trans('TotalTTCShort').'</td>';
3928
+
3929
+            print '<td class="linecoledit"></td>';  // No width to allow autodim
3930
+
3931
+            print '<td class="linecoldelete" width="10"></td>';
3932
+
3933
+            print '<td class="linecolmove" width="10"></td>';
3934
+
3935
+            if($action == 'selectlines')
3936
+            {
3937
+                print '<td class="linecolcheckall" align="center">';
3938
+                print '<input type="checkbox" class="linecheckboxtoggle" />';
3939
+                print '<script type="text/javascript">$(document).ready(function() {$(".linecheckboxtoggle").click(function() {var checkBoxes = $(".linecheckbox");checkBoxes.prop("checked", this.checked);})});</script>';
3940
+                print '</td>';
3941
+            }
3942
+
3943
+            print "</tr>\n";
3944
+            print "</thead>\n";
3945
+        }
3946
+
3947
+        $var = true;
3948
+        $i	 = 0;
3949
+
3950
+        print "<tbody>\n";
3951
+        foreach ($this->lines as $line)
3952
+        {
3953
+            //Line extrafield
3954
+            $line->fetch_optionals();
3955
+
3956
+            //if (is_object($hookmanager) && (($line->product_type == 9 && ! empty($line->special_code)) || ! empty($line->fk_parent_line)))
3957
+            if (is_object($hookmanager))   // Old code is commented on preceding line.
3958
+            {
3959
+                if (empty($line->fk_parent_line))
3960
+                {
3961
+                    $parameters = array('line'=>$line,'var'=>$var,'num'=>$num,'i'=>$i,'dateSelector'=>$dateSelector,'seller'=>$seller,'buyer'=>$buyer,'selected'=>$selected, 'extrafieldsline'=>$extrafieldsline);
3962
+                    $reshook = $hookmanager->executeHooks('printObjectLine', $parameters, $this, $action);    // Note that $action and $object may have been modified by some hooks
3963
+                }
3964
+                else
3965
+                {
3966
+                    $parameters = array('line'=>$line,'var'=>$var,'num'=>$num,'i'=>$i,'dateSelector'=>$dateSelector,'seller'=>$seller,'buyer'=>$buyer,'selected'=>$selected, 'extrafieldsline'=>$extrafieldsline, 'fk_parent_line'=>$line->fk_parent_line);
3967
+                    $reshook = $hookmanager->executeHooks('printObjectSubLine', $parameters, $this, $action);    // Note that $action and $object may have been modified by some hooks
3968
+                }
3969
+            }
3970
+            if (empty($reshook))
3971
+            {
3972
+                $this->printObjectLine($action,$line,$var,$num,$i,$dateSelector,$seller,$buyer,$selected,$extrafieldsline);
3973
+            }
3974
+
3975
+            $i++;
3976
+        }
3977
+        print "</tbody>\n";
3978
+    }
3979
+
3980
+    /**
3981
+     *	Return HTML content of a detail line
3982
+     *	TODO Move this into an output class file (htmlline.class.php)
3983
+     *
3984
+     *	@param	string		$action				GET/POST action
3985
+     *	@param CommonObjectLine $line		       	Selected object line to output
3986
+     *	@param  string	    $var               	Is it a an odd line (true)
3987
+     *	@param  int		    $num               	Number of line (0)
3988
+     *	@param  int		    $i					I
3989
+     *	@param  int		    $dateSelector      	1=Show also date range input fields
3990
+     *	@param  string	    $seller            	Object of seller third party
3991
+     *	@param  string	    $buyer             	Object of buyer third party
3992
+     *	@param	int			$selected		   	Object line selected
3993
+     *  @param  int			$extrafieldsline	Object of extrafield line attribute
3994
+     *	@return	void
3995
+     */
3996
+    function printObjectLine($action,$line,$var,$num,$i,$dateSelector,$seller,$buyer,$selected=0,$extrafieldsline=0)
3997
+    {
3998
+        global $conf,$langs,$user,$object,$hookmanager;
3999
+        global $form,$bc,$bcdd;
4000
+        global $object_rights, $disableedit, $disablemove, $disableremove;   // TODO We should not use global var for this !
4001
+
4002
+        $object_rights = $this->getRights();
4003
+
4004
+        $element=$this->element;
4005
+
4006
+        $text=''; $description=''; $type=0;
4007
+
4008
+        // Show product and description
4009
+        $type=(! empty($line->product_type)?$line->product_type:$line->fk_product_type);
4010
+        // Try to enhance type detection using date_start and date_end for free lines where type was not saved.
4011
+        if (! empty($line->date_start)) $type=1; // deprecated
4012
+        if (! empty($line->date_end)) $type=1; // deprecated
4013
+
4014
+        // Ligne en mode visu
4015
+        if ($action != 'editline' || $selected != $line->id)
4016
+        {
4017
+            // Product
4018
+            if ($line->fk_product > 0)
4019
+            {
4020
+                $product_static = new Product($this->db);
4021
+                $product_static->fetch($line->fk_product);
4022
+
4023
+                $product_static->ref = $line->ref; //can change ref in hook
4024
+                $product_static->label = $line->label; //can change label in hook
4025
+                $text=$product_static->getNomUrl(1);
4026
+
4027
+                // Define output language and label
4028
+                if (! empty($conf->global->MAIN_MULTILANGS))
4029
+                {
4030
+                    if (! is_object($this->thirdparty))
4031
+                    {
4032
+                        dol_print_error('','Error: Method printObjectLine was called on an object and object->fetch_thirdparty was not done before');
4033
+                        return;
4034
+                    }
4035
+
4036
+                    $prod = new Product($this->db);
4037
+                    $prod->fetch($line->fk_product);
4038
+
4039
+                    $outputlangs = $langs;
4040
+                    $newlang='';
4041
+                    if (empty($newlang) && GETPOST('lang_id','aZ09')) $newlang=GETPOST('lang_id','aZ09');
4042
+                    if (! empty($conf->global->PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE) && empty($newlang)) $newlang=$this->thirdparty->default_lang;		// For language to language of customer
4043
+                    if (! empty($newlang))
4044
+                    {
4045
+                        $outputlangs = new Translate("",$conf);
4046
+                        $outputlangs->setDefaultLang($newlang);
4047
+                    }
4048
+
4049
+                    $label = (! empty($prod->multilangs[$outputlangs->defaultlang]["label"])) ? $prod->multilangs[$outputlangs->defaultlang]["label"] : $line->product_label;
4050
+                }
4051
+                else
4052
+                {
4053
+                    $label = $line->product_label;
4054
+                }
4055
+
4056
+                $text.= ' - '.(! empty($line->label)?$line->label:$label);
4057
+                $description.=(! empty($conf->global->PRODUIT_DESC_IN_FORM)?'':dol_htmlentitiesbr($line->description));	// Description is what to show on popup. We shown nothing if already into desc.
4058
+            }
4059
+
4060
+            $line->pu_ttc = price2num($line->subprice * (1 + ($line->tva_tx/100)), 'MU');
4061
+
4062
+            // Output template part (modules that overwrite templates must declare this into descriptor)
4063
+            // Use global variables + $dateSelector + $seller and $buyer
4064
+            $dirtpls=array_merge($conf->modules_parts['tpl'],array('/core/tpl'));
4065
+            foreach($dirtpls as $reldir)
4066
+            {
4067
+                $tpl = dol_buildpath($reldir.'/objectline_view.tpl.php');
4068
+                if (empty($conf->file->strict_mode)) {
4069
+                    $res=@include $tpl;
4070
+                } else {
4071
+                    $res=include $tpl; // for debug
4072
+                }
4073
+                if ($res) break;
4074
+            }
4075
+        }
4076
+
4077
+        // Ligne en mode update
4078
+        if ($this->statut == 0 && $action == 'editline' && $selected == $line->id)
4079
+        {
4080
+            $label = (! empty($line->label) ? $line->label : (($line->fk_product > 0) ? $line->product_label : ''));
4081
+            $placeholder=' placeholder="'.$langs->trans("Label").'"';
4082
+
4083
+            $line->pu_ttc = price2num($line->subprice * (1 + ($line->tva_tx/100)), 'MU');
4084
+
4085
+            // Output template part (modules that overwrite templates must declare this into descriptor)
4086
+            // Use global variables + $dateSelector + $seller and $buyer
4087
+            $dirtpls=array_merge($conf->modules_parts['tpl'],array('/core/tpl'));
4088
+            foreach($dirtpls as $reldir)
4089
+            {
4090
+                $tpl = dol_buildpath($reldir.'/objectline_edit.tpl.php');
4091
+                if (empty($conf->file->strict_mode)) {
4092
+                    $res=@include $tpl;
4093
+                } else {
4094
+                    $res=include $tpl; // for debug
4095
+                }
4096
+                if ($res) break;
4097
+            }
4098
+        }
4099
+    }
4100
+
4101
+
4102
+    /* This is to show array of line of details of source object */
4103
+
4104
+
4105
+    /**
4106
+     * 	Return HTML table table of source object lines
4107
+     *  TODO Move this and previous function into output html class file (htmlline.class.php).
4108
+     *  If lines are into a template, title must also be into a template
4109
+     *  But for the moment we don't know if it's possible, so we keep the method available on overloaded objects.
4110
+     *
4111
+     *	@param	string		$restrictlist		''=All lines, 'services'=Restrict to services only
4112
+     *  @return	void
4113
+     */
4114
+    function printOriginLinesList($restrictlist='')
4115
+    {
4116
+        global $langs, $hookmanager, $conf;
4117
+
4118
+        print '<tr class="liste_titre">';
4119
+        print '<td>'.$langs->trans('Ref').'</td>';
4120
+        print '<td>'.$langs->trans('Description').'</td>';
4121
+        print '<td align="right">'.$langs->trans('VATRate').'</td>';
4122
+        print '<td align="right">'.$langs->trans('PriceUHT').'</td>';
4123
+        if (!empty($conf->multicurrency->enabled)) print '<td align="right">'.$langs->trans('PriceUHTCurrency').'</td>';
4124
+        print '<td align="right">'.$langs->trans('Qty').'</td>';
4125
+        if($conf->global->PRODUCT_USE_UNITS)
4126
+        {
4127
+            print '<td align="left">'.$langs->trans('Unit').'</td>';
4128
+        }
4129
+        print '<td align="right">'.$langs->trans('ReductionShort').'</td></tr>';
4130
+
4131
+        $var = true;
4132
+        $i	 = 0;
4133
+
4134
+        if (! empty($this->lines))
4135
+        {
4136
+            foreach ($this->lines as $line)
4137
+            {
4138
+                if (is_object($hookmanager) && (($line->product_type == 9 && ! empty($line->special_code)) || ! empty($line->fk_parent_line)))
4139
+                {
4140
+                    if (empty($line->fk_parent_line))
4141
+                    {
4142
+                        $parameters=array('line'=>$line,'var'=>$var,'i'=>$i);
4143
+                        $action='';
4144
+                        $hookmanager->executeHooks('printOriginObjectLine',$parameters,$this,$action);    // Note that $action and $object may have been modified by some hooks
4145
+                    }
4146
+                }
4147
+                else
4148
+                {
4149
+                    $this->printOriginLine($line, $var, $restrictlist);
4150
+                }
4151
+
4152
+                $i++;
4153
+            }
4154
+        }
4155
+    }
4156
+
4157
+    /**
4158
+     * 	Return HTML with a line of table array of source object lines
4159
+     *  TODO Move this and previous function into output html class file (htmlline.class.php).
4160
+     *  If lines are into a template, title must also be into a template
4161
+     *  But for the moment we don't know if it's possible as we keep a method available on overloaded objects.
4162
+     *
4163
+     * 	@param	CommonObjectLine	$line				Line
4164
+     * 	@param	string				$var				Var
4165
+     *	@param	string				$restrictlist		''=All lines, 'services'=Restrict to services only (strike line if not)
4166
+     * 	@return	void
4167
+     */
4168
+    function printOriginLine($line, $var, $restrictlist='')
4169
+    {
4170
+        global $langs, $conf;
4171
+
4172
+        //var_dump($line);
4173
+        if (!empty($line->date_start))
4174
+        {
4175
+            $date_start=$line->date_start;
4176
+        }
4177
+        else
4178
+        {
4179
+            $date_start=$line->date_debut_prevue;
4180
+            if ($line->date_debut_reel) $date_start=$line->date_debut_reel;
4181
+        }
4182
+        if (!empty($line->date_end))
4183
+        {
4184
+            $date_end=$line->date_end;
4185
+        }
4186
+        else
4187
+        {
4188
+            $date_end=$line->date_fin_prevue;
4189
+            if ($line->date_fin_reel) $date_end=$line->date_fin_reel;
4190
+        }
4191
+
4192
+        $this->tpl['label'] = '';
4193
+        if (! empty($line->fk_parent_line)) $this->tpl['label'].= img_picto('', 'rightarrow');
4194
+
4195
+        if (($line->info_bits & 2) == 2)  // TODO Not sure this is used for source object
4196
+        {
4197
+            $discount=new DiscountAbsolute($this->db);
4198
+            $discount->fk_soc = $this->socid;
4199
+            $this->tpl['label'].= $discount->getNomUrl(0,'discount');
4200
+        }
4201
+        else if (! empty($line->fk_product))
4202
+        {
4203
+            $productstatic = new Product($this->db);
4204
+            $productstatic->id = $line->fk_product;
4205
+            $productstatic->ref = $line->ref;
4206
+            $productstatic->type = $line->fk_product_type;
4207
+            if(empty($productstatic->ref)){
4208
+                $line->fetch_product();
4209
+                $productstatic = $line->product;
4210
+            }
4211
+			
4212
+            $this->tpl['label'].= $productstatic->getNomUrl(1);
4213
+            $this->tpl['label'].= ' - '.(! empty($line->label)?$line->label:$line->product_label);
4214
+            // Dates
4215
+            if ($line->product_type == 1 && ($date_start || $date_end))
4216
+            {
4217
+                $this->tpl['label'].= get_date_range($date_start,$date_end);
4218
+            }
4219
+        }
4220
+        else
4221
+        {
4222
+            $this->tpl['label'].= ($line->product_type == -1 ? '&nbsp;' : ($line->product_type == 1 ? img_object($langs->trans(''),'service') : img_object($langs->trans(''),'product')));
4223
+            if (!empty($line->desc)) {
4224
+                $this->tpl['label'].=$line->desc;
4225
+            }else {
4226
+                $this->tpl['label'].= ($line->label ? '&nbsp;'.$line->label : '');
4227
+            }
4228
+			
4229
+            // Dates
4230
+            if ($line->product_type == 1 && ($date_start || $date_end))
4231
+            {
4232
+                $this->tpl['label'].= get_date_range($date_start,$date_end);
4233
+            }
4234
+        }
4235
+
4236
+        if (! empty($line->desc))
4237
+        {
4238
+            if ($line->desc == '(CREDIT_NOTE)')  // TODO Not sure this is used for source object
4239
+            {
4240
+                $discount=new DiscountAbsolute($this->db);
4241
+                $discount->fetch($line->fk_remise_except);
4242
+                $this->tpl['description'] = $langs->transnoentities("DiscountFromCreditNote",$discount->getNomUrl(0));
4243
+            }
4244
+            elseif ($line->desc == '(DEPOSIT)')  // TODO Not sure this is used for source object
4245
+            {
4246
+                $discount=new DiscountAbsolute($this->db);
4247
+                $discount->fetch($line->fk_remise_except);
4248
+                $this->tpl['description'] = $langs->transnoentities("DiscountFromDeposit",$discount->getNomUrl(0));
4249
+            }
4250
+            elseif ($line->desc == '(EXCESS RECEIVED)')
4251
+            {
4252
+                $discount=new DiscountAbsolute($this->db);
4253
+                $discount->fetch($line->fk_remise_except);
4254
+                $this->tpl['description'] = $langs->transnoentities("DiscountFromExcessReceived",$discount->getNomUrl(0));
4255
+            }
4256
+            elseif ($line->desc == '(EXCESS PAID)')
4257
+            {
4258
+                $discount=new DiscountAbsolute($this->db);
4259
+                $discount->fetch($line->fk_remise_except);
4260
+                $this->tpl['description'] = $langs->transnoentities("DiscountFromExcessPaid",$discount->getNomUrl(0));
4261
+            }
4262
+            else
4263
+            {
4264
+                $this->tpl['description'] = dol_trunc($line->desc,60);
4265
+            }
4266
+        }
4267
+        else
4268
+        {
4269
+            $this->tpl['description'] = '&nbsp;';
4270
+        }
4271
+
4272
+        // VAT Rate
4273
+        $this->tpl['vat_rate'] = vatrate($line->tva_tx, true);
4274
+        $this->tpl['vat_rate'] .= (($line->info_bits & 1) == 1) ? '*' : '';
4275
+        if (! empty($line->vat_src_code) && ! preg_match('/\(/', $this->tpl['vat_rate'])) $this->tpl['vat_rate'].=' ('.$line->vat_src_code.')';
4276
+
4277
+        $this->tpl['price'] = price($line->subprice);
4278
+        $this->tpl['multicurrency_price'] = price($line->multicurrency_subprice);
4279
+        $this->tpl['qty'] = (($line->info_bits & 2) != 2) ? $line->qty : '&nbsp;';
4280
+        if ($conf->global->PRODUCT_USE_UNITS) $this->tpl['unit'] = $langs->transnoentities($line->getLabelOfUnit('long'));
4281
+        $this->tpl['remise_percent'] = (($line->info_bits & 2) != 2) ? vatrate($line->remise_percent, true) : '&nbsp;';
4282
+
4283
+        // Is the line strike or not
4284
+        $this->tpl['strike']=0;
4285
+        if ($restrictlist == 'services' && $line->product_type != Product::TYPE_SERVICE) $this->tpl['strike']=1;
4286
+
4287
+        // Output template part (modules that overwrite templates must declare this into descriptor)
4288
+        // Use global variables + $dateSelector + $seller and $buyer
4289
+        $dirtpls=array_merge($conf->modules_parts['tpl'],array('/core/tpl'));
4290
+        foreach($dirtpls as $reldir)
4291
+        {
4292
+            $tpl = dol_buildpath($reldir.'/originproductline.tpl.php');
4293
+            if (empty($conf->file->strict_mode)) {
4294
+                $res=@include $tpl;
4295
+            } else {
4296
+                $res=include $tpl; // for debug
4297
+            }
4298
+            if ($res) break;
4299
+        }
4300
+    }
4301
+
4302
+
4303
+    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
4304
+    /**
4305
+     *	Add resources to the current object : add entry into llx_element_resources
4306
+     *	Need $this->element & $this->id
4307
+     *
4308
+     *	@param		int		$resource_id		Resource id
4309
+     *	@param		string	$resource_type		'resource'
4310
+     *	@param		int		$busy				Busy or not
4311
+     *	@param		int		$mandatory			Mandatory or not
4312
+     *	@return		int							<=0 if KO, >0 if OK
4313
+     */
4314
+    function add_element_resource($resource_id, $resource_type, $busy=0, $mandatory=0)
4315
+    {
4316
+        // phpcs:enable
4317
+        $this->db->begin();
4318
+
4319
+        $sql = "INSERT INTO ".MAIN_DB_PREFIX."element_resources (";
4320
+        $sql.= "resource_id";
4321
+        $sql.= ", resource_type";
4322
+        $sql.= ", element_id";
4323
+        $sql.= ", element_type";
4324
+        $sql.= ", busy";
4325
+        $sql.= ", mandatory";
4326
+        $sql.= ") VALUES (";
4327
+        $sql.= $resource_id;
4328
+        $sql.= ", '".$this->db->escape($resource_type)."'";
4329
+        $sql.= ", '".$this->db->escape($this->id)."'";
4330
+        $sql.= ", '".$this->db->escape($this->element)."'";
4331
+        $sql.= ", '".$this->db->escape($busy)."'";
4332
+        $sql.= ", '".$this->db->escape($mandatory)."'";
4333
+        $sql.= ")";
4334
+
4335
+        dol_syslog(get_class($this)."::add_element_resource", LOG_DEBUG);
4336
+        if ($this->db->query($sql))
4337
+        {
4338
+            $this->db->commit();
4339
+            return 1;
4340
+        }
4341
+        else
4342
+        {
4343
+            $this->error=$this->db->lasterror();
4344
+            $this->db->rollback();
4345
+            return  0;
4346
+        }
4347
+    }
4348
+
4349
+    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
4350
+    /**
4351
+     *    Delete a link to resource line
4352
+     *
4353
+     *    @param	int		$rowid			Id of resource line to delete
4354
+     *    @param	int		$element		element name (for trigger) TODO: use $this->element into commonobject class
4355
+     *    @param	int		$notrigger		Disable all triggers
4356
+     *    @return   int						>0 if OK, <0 if KO
4357
+     */
4358
+    function delete_resource($rowid, $element, $notrigger=0)
4359
+    {
4360
+        // phpcs:enable
4361
+        global $user;
4362
+
4363
+        $this->db->begin();
4364
+
4365
+        $sql = "DELETE FROM ".MAIN_DB_PREFIX."element_resources";
4366
+        $sql.= " WHERE rowid=".$rowid;
4367
+
4368
+        dol_syslog(get_class($this)."::delete_resource", LOG_DEBUG);
4369
+
4370
+        $resql=$this->db->query($sql);
4371
+        if (! $resql)
4372
+        {
4373
+            $this->error=$this->db->lasterror();
4374
+            $this->db->rollback();
4375
+            return -1;
4376
+        }
4377
+        else
4378
+        {
4379
+            if (! $notrigger)
4380
+            {
4381
+                $result=$this->call_trigger(strtoupper($element).'_DELETE_RESOURCE', $user);
4382
+                if ($result < 0) { $this->db->rollback(); return -1; }
4383
+            }
4384
+            $this->db->commit();
4385
+            return 1;
4386
+        }
4387
+    }
4388
+
4389
+
4390
+    /**
4391
+     * Overwrite magic function to solve problem of cloning object that are kept as references
4392
+     *
4393
+     * @return void
4394
+     */
4395
+    function __clone()
4396
+    {
4397
+        // Force a copy of this->lines, otherwise it will point to same object.
4398
+        if (isset($this->lines) && is_array($this->lines))
4399
+        {
4400
+            $nboflines=count($this->lines);
4401
+            for($i=0; $i < $nboflines; $i++)
4402
+            {
4403
+                $this->lines[$i] = clone $this->lines[$i];
4404
+            }
4405
+        }
4406
+    }
4407
+
4408
+    /**
4409
+     * Common function for all objects extending CommonObject for generating documents
4410
+     *
4411
+     * @param 	string 		$modelspath 	Relative folder where generators are placed
4412
+     * @param 	string 		$modele 		Generator to use. Caller must set it to obj->modelpdf or GETPOST('modelpdf') for example.
4413
+     * @param 	Translate 	$outputlangs 	Output language to use
4414
+     * @param 	int 		$hidedetails 	1 to hide details. 0 by default
4415
+     * @param 	int 		$hidedesc 		1 to hide product description. 0 by default
4416
+     * @param 	int 		$hideref 		1 to hide product reference. 0 by default
4417
+     * @param   null|array  $moreparams     Array to provide more information
4418
+     * @return 	int 						>0 if OK, <0 if KO
4419
+     * @see	addFileIntoDatabaseIndex
4420
+     */
4421
+    protected function commonGenerateDocument($modelspath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams=null)
4422
+    {
4423
+        global $conf, $langs, $user;
4424
+
4425
+        $srctemplatepath='';
4426
+
4427
+        // Increase limit for PDF build
4428
+        $err=error_reporting();
4429
+        error_reporting(0);
4430
+        @set_time_limit(120);
4431
+        error_reporting($err);
4432
+
4433
+        // If selected model is a filename template (then $modele="modelname" or "modelname:filename")
4434
+        $tmp=explode(':',$modele,2);
4435
+        if (! empty($tmp[1]))
4436
+        {
4437
+            $modele=$tmp[0];
4438
+            $srctemplatepath=$tmp[1];
4439
+        }
4440
+
4441
+        // Search template files
4442
+        $file=''; $classname=''; $filefound=0;
4443
+        $dirmodels=array('/');
4444
+        if (is_array($conf->modules_parts['models'])) $dirmodels=array_merge($dirmodels,$conf->modules_parts['models']);
4445
+        foreach($dirmodels as $reldir)
4446
+        {
4447
+            foreach(array('doc','pdf') as $prefix)
4448
+            {
4449
+                if (in_array(get_class($this), array('Adherent'))) $file = $prefix."_".$modele.".class.php";     // Member module use prefix_module.class.php
4450
+                else $file = $prefix."_".$modele.".modules.php";
4451
+
4452
+                // On verifie l'emplacement du modele
4453
+                $file=dol_buildpath($reldir.$modelspath.$file,0);
4454
+                if (file_exists($file))
4455
+                {
4456
+                    $filefound=1;
4457
+                    $classname=$prefix.'_'.$modele;
4458
+                    break;
4459
+                }
4460
+            }
4461
+            if ($filefound) break;
4462
+        }
4463
+
4464
+        // If generator was found
4465
+        if ($filefound)
4466
+        {
4467
+            global $db;  // Required to solve a conception default in commonstickergenerator.class.php making an include of code using $db
4468
+
4469
+            require_once $file;
4470
+
4471
+            $obj = new $classname($this->db);
4472
+
4473
+            // If generator is ODT, we must have srctemplatepath defined, if not we set it.
4474
+            if ($obj->type == 'odt' && empty($srctemplatepath))
4475
+            {
4476
+                $varfortemplatedir=$obj->scandir;
4477
+                if ($varfortemplatedir && ! empty($conf->global->$varfortemplatedir))
4478
+                {
4479
+                    $dirtoscan=$conf->global->$varfortemplatedir;
4480
+
4481
+                    $listoffiles=array();
4482
+
4483
+                    // Now we add first model found in directories scanned
4484
+                    $listofdir=explode(',',$dirtoscan);
4485
+                    foreach($listofdir as $key => $tmpdir)
4486
+                    {
4487
+                        $tmpdir=trim($tmpdir);
4488
+                        $tmpdir=preg_replace('/DOL_DATA_ROOT/',DOL_DATA_ROOT,$tmpdir);
4489
+                        if (! $tmpdir) { unset($listofdir[$key]); continue; }
4490
+                        if (is_dir($tmpdir))
4491
+                        {
4492
+                            $tmpfiles=dol_dir_list($tmpdir,'files',0,'\.od(s|t)$','','name',SORT_ASC,0);
4493
+                            if (count($tmpfiles)) $listoffiles=array_merge($listoffiles,$tmpfiles);
4494
+                        }
4495
+                    }
4496
+
4497
+                    if (count($listoffiles))
4498
+                    {
4499
+                        foreach($listoffiles as $record)
4500
+                        {
4501
+                            $srctemplatepath=$record['fullname'];
4502
+                            break;
4503
+                        }
4504
+                    }
4505
+                }
4506
+
4507
+                if (empty($srctemplatepath))
4508
+                {
4509
+                    $this->error='ErrorGenerationAskedForOdtTemplateWithSrcFileNotDefined';
4510
+                    return -1;
4511
+                }
4512
+            }
4513
+
4514
+            if ($obj->type == 'odt' && ! empty($srctemplatepath))
4515
+            {
4516
+                if (! dol_is_file($srctemplatepath))
4517
+                {
4518
+                    $this->error='ErrorGenerationAskedForOdtTemplateWithSrcFileNotFound';
4519
+                    return -1;
4520
+                }
4521
+            }
4522
+
4523
+            // We save charset_output to restore it because write_file can change it if needed for
4524
+            // output format that does not support UTF8.
4525
+            $sav_charset_output=$outputlangs->charset_output;
4526
+
4527
+            if (in_array(get_class($this), array('Adherent')))
4528
+            {
4529
+                $arrayofrecords = array();   // The write_file of templates of adherent class need this var
4530
+                $resultwritefile = $obj->write_file($this, $outputlangs, $srctemplatepath, 'member', 1, $moreparams);
4531
+            }
4532
+            else
4533
+            {
4534
+                $resultwritefile = $obj->write_file($this, $outputlangs, $srctemplatepath, $hidedetails, $hidedesc, $hideref, $moreparams);
4535
+            }
4536
+            // After call of write_file $obj->result['fullpath'] is set with generated file. It will be used to update the ECM database index.
4537
+
4538
+            if ($resultwritefile > 0)
4539
+            {
4540
+                $outputlangs->charset_output=$sav_charset_output;
4541
+
4542
+                // We delete old preview
4543
+                require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
4544
+                dol_delete_preview($this);
4545
+
4546
+                // Index file in database
4547
+                if (! empty($obj->result['fullpath']))
4548
+                {
4549
+                    $destfull = $obj->result['fullpath'];
4550
+                    $upload_dir = dirname($destfull);
4551
+                    $destfile = basename($destfull);
4552
+                    $rel_dir = preg_replace('/^'.preg_quote(DOL_DATA_ROOT,'/').'/', '', $upload_dir);
4553
+
4554
+                    if (! preg_match('/[\\/]temp[\\/]|[\\/]thumbs|\.meta$/', $rel_dir))     // If not a tmp dir
4555
+                    {
4556
+                        $filename = basename($destfile);
4557
+                        $rel_dir = preg_replace('/[\\/]$/', '', $rel_dir);
4558
+                        $rel_dir = preg_replace('/^[\\/]/', '', $rel_dir);
4559
+
4560
+                        include_once DOL_DOCUMENT_ROOT.'/ecm/class/ecmfiles.class.php';
4561
+                        $ecmfile=new EcmFiles($this->db);
4562
+                        $result = $ecmfile->fetch(0, '', ($rel_dir?$rel_dir.'/':'').$filename);
4563
+
4564
+                        // Set the public "share" key
4565
+                        $setsharekey = false;
4566
+                        if ($this->element == 'propal')
4567
+                        {
4568
+                            $useonlinesignature = $conf->global->MAIN_FEATURES_LEVEL;	// Replace this with 1 when feature to make online signature is ok
4569
+                            if ($useonlinesignature) $setsharekey=true;
4570
+                            if (! empty($conf->global->PROPOSAL_ALLOW_EXTERNAL_DOWNLOAD)) $setsharekey=true;
4571
+                        }
4572
+                        if ($this->element == 'commande'     && ! empty($conf->global->ORDER_ALLOW_EXTERNAL_DOWNLOAD))        $setsharekey=true;
4573
+                        if ($this->element == 'facture'      && ! empty($conf->global->INVOICE_ALLOW_EXTERNAL_DOWNLOAD))      $setsharekey=true;
4574
+                        if ($this->element == 'bank_account' && ! empty($conf->global->BANK_ACCOUNT_ALLOW_EXTERNAL_DOWNLOAD)) $setsharekey=true;
4575
+
4576
+                        if ($setsharekey)
4577
+                        {
4578
+                            if (empty($ecmfile->share))	// Because object not found or share not set yet
4579
+                            {
4580
+                                require_once DOL_DOCUMENT_ROOT.'/core/lib/security2.lib.php';
4581
+                                $ecmfile->share = getRandomPassword(true);
4582
+                            }
4583
+                        }
4584
+
4585
+                        if ($result > 0)
4586
+                        {
4587
+                            $ecmfile->label = md5_file(dol_osencode($destfull));	// hash of file content
4588
+                            $ecmfile->fullpath_orig = '';
4589
+                            $ecmfile->gen_or_uploaded = 'generated';
4590
+                            $ecmfile->description = '';    // indexed content
4591
+                            $ecmfile->keyword = '';        // keyword content
4592
+                            $result = $ecmfile->update($user);
4593
+                            if ($result < 0)
4594
+                            {
4595
+                                setEventMessages($ecmfile->error, $ecmfile->errors, 'warnings');
4596
+                            }
4597
+                        }
4598
+                        else
4599
+                        {
4600
+                            $ecmfile->entity = $conf->entity;
4601
+                            $ecmfile->filepath = $rel_dir;
4602
+                            $ecmfile->filename = $filename;
4603
+                            $ecmfile->label = md5_file(dol_osencode($destfull));	// hash of file content
4604
+                            $ecmfile->fullpath_orig = '';
4605
+                            $ecmfile->gen_or_uploaded = 'generated';
4606
+                            $ecmfile->description = '';    // indexed content
4607
+                            $ecmfile->keyword = '';        // keyword content
4608
+                            $ecmfile->src_object_type = $this->table_element;
4609
+                            $ecmfile->src_object_id   = $this->id;
4610
+
4611
+                            $result = $ecmfile->create($user);
4612
+                            if ($result < 0)
4613
+                            {
4614
+                                setEventMessages($ecmfile->error, $ecmfile->errors, 'warnings');
4615
+                            }
4616
+                        }
4617
+
4618
+                        /*$this->result['fullname']=$destfull;
4619
+						$this->result['filepath']=$ecmfile->filepath;
4620
+						$this->result['filename']=$ecmfile->filename;*/
4621
+                        //var_dump($obj->update_main_doc_field);exit;
4622
+
4623
+                        // Update the last_main_doc field into main object (if documenent generator has property ->update_main_doc_field set)
4624
+                        $update_main_doc_field=0;
4625
+                        if (! empty($obj->update_main_doc_field)) $update_main_doc_field=1;
4626
+                        if ($update_main_doc_field && ! empty($this->table_element))
4627
+                        {
4628
+                            $sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element." SET last_main_doc = '".($ecmfile->filepath.'/'.$ecmfile->filename)."'";
4629
+                            $sql.= ' WHERE rowid = '.$this->id;
4630
+                            $resql = $this->db->query($sql);
4631
+                            if (! $resql) dol_print_error($this->db);
4632
+                        }
4633
+                    }
4634
+                }
4635
+                else
4636
+                {
4637
+                    dol_syslog('Method ->write_file was called on object '.get_class($obj).' and return a success but the return array ->result["fullpath"] was not set.', LOG_WARNING);
4638
+                }
4639
+
4640
+                // Success in building document. We build meta file.
4641
+                dol_meta_create($this);
4642
+
4643
+                return 1;
4644
+            }
4645
+            else
4646
+            {
4647
+                $outputlangs->charset_output=$sav_charset_output;
4648
+                dol_print_error($this->db, "Error generating document for ".__CLASS__.". Error: ".$obj->error, $obj->errors);
4649
+                return -1;
4650
+            }
4651
+        }
4652
+        else
4653
+        {
4654
+            $this->error=$langs->trans("Error")." ".$langs->trans("ErrorFileDoesNotExists",$file);
4655
+            dol_print_error('',$this->error);
4656
+            return -1;
4657
+        }
4658
+    }
4659
+
4660
+    /**
4661
+     *  Build thumb
4662
+     *  @TODO Move this into files.lib.php
4663
+     *
4664
+     *  @param      string	$file           Path file in UTF8 to original file to create thumbs from.
4665
+     *	@return		void
4666
+     */
4667
+    function addThumbs($file)
4668
+    {
4669
+        global $maxwidthsmall, $maxheightsmall, $maxwidthmini, $maxheightmini, $quality;
4670
+
4671
+        require_once DOL_DOCUMENT_ROOT .'/core/lib/images.lib.php';		// This define also $maxwidthsmall, $quality, ...
4672
+
4673
+        $file_osencoded=dol_osencode($file);
4674
+        if (file_exists($file_osencoded))
4675
+        {
4676
+            // Create small thumbs for company (Ratio is near 16/9)
4677
+            // Used on logon for example
4678
+            vignette($file_osencoded, $maxwidthsmall, $maxheightsmall, '_small', $quality);
4679
+
4680
+            // Create mini thumbs for company (Ratio is near 16/9)
4681
+            // Used on menu or for setup page for example
4682
+            vignette($file_osencoded, $maxwidthmini, $maxheightmini, '_mini', $quality);
4683
+        }
4684
+    }
4685
+
4686
+
4687
+    /* Functions common to commonobject and commonobjectline */
4688
+
4689
+    /* For default values */
4690
+
4691
+    /**
4692
+     * Return the default value to use for a field when showing the create form of object.
4693
+     * Return values in this order:
4694
+     * 1) If parameter is available into POST, we return it first.
4695
+     * 2) If not but an alternate value was provided as parameter of function, we return it.
4696
+     * 3) If not but a constant $conf->global->OBJECTELEMENT_FIELDNAME is set, we return it (It is better to use the dedicated table).
4697
+     * 4) Return value found into database (TODO No yet implemented)
4698
+     *
4699
+     * @param   string              $fieldname          Name of field
4700
+     * @param   string              $alternatevalue     Alternate value to use
4701
+     * @return  string|string[]                         Default value (can be an array if the GETPOST return an array)
4702
+     **/
4703
+    function getDefaultCreateValueFor($fieldname, $alternatevalue=null)
4704
+    {
4705
+        global $conf, $_POST;
4706
+
4707
+        // If param here has been posted, we use this value first.
4708
+        if (isset($_POST[$fieldname])) return GETPOST($fieldname, 2);
4709
+
4710
+        if (isset($alternatevalue)) return $alternatevalue;
4711
+
4712
+        $newelement=$this->element;
4713
+        if ($newelement == 'facture') $newelement='invoice';
4714
+        if ($newelement == 'commande') $newelement='order';
4715
+        if (empty($newelement))
4716
+        {
4717
+            dol_syslog("Ask a default value using common method getDefaultCreateValueForField on an object with no property ->element defined. Return empty string.", LOG_WARNING);
4718
+            return '';
4719
+        }
4720
+
4721
+        $keyforfieldname=strtoupper($newelement.'_DEFAULT_'.$fieldname);
4722
+        //var_dump($keyforfieldname);
4723
+        if (isset($conf->global->$keyforfieldname)) return $conf->global->$keyforfieldname;
4724
+
4725
+        // TODO Ad here a scan into table llx_overwrite_default with a filter on $this->element and $fieldname
4726
+    }
4727
+
4728
+
4729
+    /* For triggers */
4730
+
4731
+
4732
+    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
4733
+    /**
4734
+     * Call trigger based on this instance.
4735
+     * Some context information may also be provided into array property this->context.
4736
+     * NB:  Error from trigger are stacked in interface->errors
4737
+     * NB2: If return code of triggers are < 0, action calling trigger should cancel all transaction.
4738
+     *
4739
+     * @param   string    $trigger_name   trigger's name to execute
4740
+     * @param   User      $user           Object user
4741
+     * @return  int                       Result of run_triggers
4742
+     */
4743
+    function call_trigger($trigger_name, $user)
4744
+    {
4745
+        // phpcs:enable
4746
+        global $langs,$conf;
4747
+
4748
+        include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php';
4749
+        $interface=new Interfaces($this->db);
4750
+        $result=$interface->run_triggers($trigger_name,$this,$user,$langs,$conf);
4751
+
4752
+        if ($result < 0)
4753
+        {
4754
+            if (!empty($this->errors))
4755
+            {
4756
+                $this->errors=array_unique(array_merge($this->errors,$interface->errors));   // We use array_unique because when a trigger call another trigger on same object, this->errors is added twice.
4757
+            }
4758
+            else
4759
+            {
4760
+                $this->errors=$interface->errors;
4761
+            }
4762
+        }
4763
+        return $result;
4764
+    }
4765
+
4766
+
4767
+    /* Functions for extrafields */
4768
+
4769
+
4770
+    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
4771
+    /**
4772
+     *  Function to get extra fields of an object into $this->array_options
4773
+     *  This method is in most cases called by method fetch of objects but you can call it separately.
4774
+     *
4775
+     *  @param	int		$rowid			Id of line. Use the id of object if not defined. Deprecated. Function must be called without parameters.
4776
+     *  @param  array	$optionsArray   Array resulting of call of extrafields->fetch_name_optionals_label(). Deprecated. Function must be called without parameters.
4777
+     *  @return	int						<0 if error, 0 if no values of extrafield to find nor found, 1 if an attribute is found and value loaded
4778
+     */
4779
+    function fetch_optionals($rowid=null, $optionsArray=null)
4780
+    {
4781
+        // phpcs:enable
4782
+        if (empty($rowid)) $rowid=$this->id;
4783
+
4784
+        // To avoid SQL errors. Probably not the better solution though
4785
+        if (!$this->table_element) {
4786
+            return 0;
4787
+        }
4788
+
4789
+        $this->array_options=array();
4790
+
4791
+        if (! is_array($optionsArray))
4792
+        {
4793
+            // If $extrafields is not a known object, we initialize it. Best practice is to have $extrafields defined into card.php or list.php page.
4794
+            // TODO Use of existing $extrafield is not yet ready (must mutualize code that use extrafields in form first)
4795
+            // global $extrafields;
4796
+            //if (! is_object($extrafields))
4797
+            //{
4798
+                require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
4799
+                $extrafields = new ExtraFields($this->db);
4800
+            //}
4801
+
4802
+            // Load array of extrafields for elementype = $this->table_element
4803
+            if (empty($extrafields->attributes[$this->table_element]['loaded']))
4804
+            {
4805
+                $extrafields->fetch_name_optionals_label($this->table_element);
4806
+            }
4807
+            $optionsArray = (! empty($extrafields->attributes[$this->table_element]['label'])?$extrafields->attributes[$this->table_element]['label']:null);
4808
+        }
4809
+        else
4810
+        {
4811
+            global $extrafields;
4812
+            dol_syslog("Warning: fetch_optionals was called with param optionsArray defined when you should pass null now", LOG_WARNING);
4813
+        }
4814
+
4815
+        $table_element = $this->table_element;
4816
+        if ($table_element == 'categorie') $table_element = 'categories'; // For compatibility
4817
+
4818
+        // Request to get complementary values
4819
+        if (is_array($optionsArray) && count($optionsArray) > 0)
4820
+        {
4821
+            $sql = "SELECT rowid";
4822
+            foreach ($optionsArray as $name => $label)
4823
+            {
4824
+                if (empty($extrafields->attributes[$this->table_element]['type'][$name]) || $extrafields->attributes[$this->table_element]['type'][$name] != 'separate')
4825
+                {
4826
+                    $sql.= ", ".$name;
4827
+                }
4828
+            }
4829
+            $sql.= " FROM ".MAIN_DB_PREFIX.$table_element."_extrafields";
4830
+            $sql.= " WHERE fk_object = ".$rowid;
4831
+
4832
+            //dol_syslog(get_class($this)."::fetch_optionals get extrafields data for ".$this->table_element, LOG_DEBUG);		// Too verbose
4833
+            $resql=$this->db->query($sql);
4834
+            if ($resql)
4835
+            {
4836
+                $this->array_options = array();
4837
+                $numrows=$this->db->num_rows($resql);
4838
+                if ($numrows)
4839
+                {
4840
+                    $tab = $this->db->fetch_array($resql);
4841
+
4842
+                    foreach ($tab as $key => $value)
4843
+                    {
4844
+                        // Test fetch_array ! is_int($key) because fetch_array result is a mix table with Key as alpha and Key as int (depend db engine)
4845
+                        if ($key != 'rowid' && $key != 'tms' && $key != 'fk_member' && ! is_int($key))
4846
+                        {
4847
+                            // we can add this attribute to object
4848
+                            if (! empty($extrafields) && in_array($extrafields->attributes[$this->table_element]['type'][$key], array('date','datetime')))
4849
+                            {
4850
+                                //var_dump($extrafields->attributes[$this->table_element]['type'][$key]);
4851
+                                $this->array_options["options_".$key]=$this->db->jdate($value);
4852
+                            }
4853
+                            else
4854
+                            {
4855
+                                $this->array_options["options_".$key]=$value;
4856
+                            }
4857
+
4858
+                            //var_dump('key '.$key.' '.$value.' type='.$extrafields->attributes[$this->table_element]['type'][$key].' '.$this->array_options["options_".$key]);
4859
+                        }
4860
+                    }
4861
+                }
4862
+
4863
+                $this->db->free($resql);
4864
+
4865
+                if ($numrows) return $numrows;
4866
+                else return 0;
4867
+            }
4868
+            else
4869
+            {
4870
+                dol_print_error($this->db);
4871
+                return -1;
4872
+            }
4873
+        }
4874
+        return 0;
4875
+    }
4876
+
4877
+    /**
4878
+     *	Delete all extra fields values for the current object.
4879
+     *
4880
+     *  @return	int		<0 if KO, >0 if OK
4881
+     */
4882
+    function deleteExtraFields()
4883
+    {
4884
+        $this->db->begin();
4885
+
4886
+        $table_element = $this->table_element;
4887
+        if ($table_element == 'categorie') $table_element = 'categories'; // For compatibility
4888
+
4889
+        $sql_del = "DELETE FROM ".MAIN_DB_PREFIX.$table_element."_extrafields WHERE fk_object = ".$this->id;
4890
+        dol_syslog(get_class($this)."::deleteExtraFields delete", LOG_DEBUG);
4891
+        $resql=$this->db->query($sql_del);
4892
+        if (! $resql)
4893
+        {
4894
+            $this->error=$this->db->lasterror();
4895
+            $this->db->rollback();
4896
+            return -1;
4897
+        }
4898
+        else
4899
+        {
4900
+            $this->db->commit();
4901
+            return 1;
4902
+        }
4903
+    }
4904
+
4905
+    /**
4906
+     *	Add/Update all extra fields values for the current object.
4907
+     *  Data to describe values to insert/update are stored into $this->array_options=array('options_codeforfield1'=>'valueforfield1', 'options_codeforfield2'=>'valueforfield2', ...)
4908
+     *  This function delete record with all extrafields and insert them again from the array $this->array_options.
4909
+     *
4910
+     *  @param	string		$trigger		If defined, call also the trigger (for example COMPANY_MODIFY)
4911
+     *  @param	User		$userused		Object user
4912
+     *  @return int 						-1=error, O=did nothing, 1=OK
4913
+     *  @see updateExtraField, setValueFrom
4914
+     */
4915
+    function insertExtraFields($trigger='', $userused=null)
4916
+    {
4917
+        global $conf,$langs,$user;
4918
+
4919
+        if (empty($userused)) $userused=$user;
4920
+
4921
+        $error=0;
4922
+
4923
+        if (! empty($conf->global->MAIN_EXTRAFIELDS_DISABLED)) return 0;	// For avoid conflicts if trigger used
4924
+
4925
+        if (! empty($this->array_options))
4926
+        {
4927
+            // Check parameters
4928
+            $langs->load('admin');
4929
+            require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
4930
+            $extrafields = new ExtraFields($this->db);
4931
+            $target_extrafields=$extrafields->fetch_name_optionals_label($this->table_element);
4932
+
4933
+            //Eliminate copied source object extra_fields that do not exist in target object
4934
+            $new_array_options=array();
4935
+            foreach ($this->array_options as $key => $value) {
4936
+                if (in_array(substr($key,8), array_keys($target_extrafields)))	// We remove the 'options_' from $key for test
4937
+                    $new_array_options[$key] = $value;
4938
+                elseif (in_array($key, array_keys($target_extrafields)))		// We test on $key that does not contains the 'options_' prefix
4939
+                    $new_array_options['options_'.$key] = $value;
4940
+            }
4941
+
4942
+            foreach($new_array_options as $key => $value)
4943
+            {
4944
+                    $attributeKey      = substr($key,8);   // Remove 'options_' prefix
4945
+                    $attributeType     = $extrafields->attributes[$this->table_element]['type'][$attributeKey];
4946
+                    $attributeLabel    = $extrafields->attributes[$this->table_element]['label'][$attributeKey];
4947
+                    $attributeParam    = $extrafields->attributes[$this->table_element]['param'][$attributeKey];
4948
+                    $attributeRequired = $extrafields->attributes[$this->table_element]['required'][$attributeKey];
4949
+
4950
+                    if ($attributeRequired)
4951
+                    {
4952
+                        $mandatorypb=false;
4953
+                        if ($attributeType == 'link' && $this->array_options[$key] == '-1') $mandatorypb=true;
4954
+                        if ($this->array_options[$key] === '') $mandatorypb=true;
4955
+                        if ($mandatorypb)
4956
+                        {
4957
+                            dol_syslog($this->error);
4958
+                            $this->errors[]=$langs->trans('ErrorFieldRequired', $attributeLabel);
4959
+                            return -1;
4960
+                        }
4961
+                    }
4962
+
4963
+                //dol_syslog("attributeLabel=".$attributeLabel, LOG_DEBUG);
4964
+                //dol_syslog("attributeType=".$attributeType, LOG_DEBUG);
4965
+
4966
+                    switch ($attributeType)
4967
+                    {
4968
+                        case 'int':
4969
+                          if (!is_numeric($value) && $value!='')
4970
+                            {
4971
+                                $this->errors[]=$langs->trans("ExtraFieldHasWrongValue", $attributeLabel);
4972
+                                return -1;
4973
+                            }
4974
+                            elseif ($value=='')
4975
+                            {
4976
+                                $new_array_options[$key] = null;
4977
+                            }
4978
+                            break;
4979
+                    case 'double':
4980
+                        $value = price2num($value);
4981
+                        if (!is_numeric($value) && $value!='')
4982
+                        {
4983
+                            dol_syslog($langs->trans("ExtraFieldHasWrongValue")." sur ".$attributeLabel."(".$value."is not '".$attributeType."')", LOG_DEBUG);
4984
+                            $this->errors[]=$langs->trans("ExtraFieldHasWrongValue", $attributeLabel);
4985
+                            return -1;
4986
+                        }
4987
+                        elseif ($value=='')
4988
+                        {
4989
+                            $new_array_options[$key] = null;
4990
+                        }
4991
+                        //dol_syslog("double value"." sur ".$attributeLabel."(".$value." is '".$attributeType."')", LOG_DEBUG);
4992
+                        $new_array_options[$key] = $value;
4993
+                        break;
4994
+                        /*case 'select':	// Not required, we chosed value='0' for undefined values
4995
+             			if ($value=='-1')
4996
+             			{
4997
+             				$this->array_options[$key] = null;
4998
+             			}
4999
+             			break;*/
5000
+                        case 'password':
5001
+                           $algo='';
5002
+                            if ($this->array_options[$key] != '' && is_array($extrafields->attributes[$this->table_element]['param'][$attributeKey]['options']))
5003
+                            {
5004
+                                // If there is an encryption choice, we use it to crypt data before insert
5005
+                                $tmparrays = array_keys($extrafields->attributes[$this->table_element]['param'][$attributeKey]['options']);
5006
+                                $algo=reset($tmparrays);
5007
+                                if ($algo != '')
5008
+                                {
5009
+                                    //global $action;		// $action may be 'create', 'update', 'update_extras'...
5010
+                                    //var_dump($action);
5011
+                                    //var_dump($this->oldcopy);exit;
5012
+                                    if (is_object($this->oldcopy))		// If this->oldcopy is not defined, we can't know if we change attribute or not, so we must keep value
5013
+                                    {
5014
+                                        //var_dump($this->oldcopy->array_options[$key]); var_dump($this->array_options[$key]);
5015
+                                        if ($this->array_options[$key] == $this->oldcopy->array_options[$key])	// If old value crypted in database is same than submited new value, it means we don't change it, so we don't update.
5016
+                                        {
5017
+                                            $new_array_options[$key] = $this->array_options[$key];	// Value is kept
5018
+                                        }
5019
+                                    else
5020
+                                    {
5021
+                                        // var_dump($algo);
5022
+                                        $newvalue = dol_hash($this->array_options[$key], $algo);
5023
+                                        $new_array_options[$key] = $newvalue;
5024
+                                    }
5025
+                                    }
5026
+                                    else
5027
+                                    {
5028
+                                        $new_array_options[$key] = $this->array_options[$key];	// Value is kept
5029
+                                    }
5030
+                                }
5031
+                            }
5032
+                            else	// Common usage
5033
+                            {
5034
+                                $new_array_options[$key] = $this->array_options[$key];
5035
+                            }
5036
+                            break;
5037
+                        case 'price':
5038
+                        $new_array_options[$key] = price2num($this->array_options[$key]);
5039
+                        break;
5040
+                    case 'date':
5041
+                        $new_array_options[$key] = $this->db->idate($this->array_options[$key]);
5042
+                        break;
5043
+                    case 'datetime':
5044
+                        // If data is a string instead of a timestamp, we convert it
5045
+                        if (! is_int($this->array_options[$key])) {
5046
+                            $this->array_options[$key] = strtotime($this->array_options[$key]);
5047
+                        }
5048
+                        $new_array_options[$key] = $this->db->idate($this->array_options[$key]);
5049
+                        break;
5050
+                        case 'link':
5051
+                        $param_list=array_keys($attributeParam['options']);
5052
+                        // 0 : ObjectName
5053
+                        // 1 : classPath
5054
+                        $InfoFieldList = explode(":", $param_list[0]);
5055
+                        dol_include_once($InfoFieldList[1]);
5056
+                        if ($InfoFieldList[0] && class_exists($InfoFieldList[0]))
5057
+                        {
5058
+                            if ($value == '-1')	// -1 is key for no defined in combo list of objects
5059
+                            {
5060
+                                $new_array_options[$key]='';
5061
+                            }
5062
+                            elseif ($value)
5063
+                            {
5064
+                                $object = new $InfoFieldList[0]($this->db);
5065
+                                if (is_numeric($value)) $res=$object->fetch($value);
5066
+                                else $res=$object->fetch('',$value);
5067
+
5068
+                                if ($res > 0) $new_array_options[$key]=$object->id;
5069
+                                else
5070
+                                {
5071
+                                    $this->error="Id/Ref '".$value."' for object '".$object->element."' not found";
5072
+                                    $this->db->rollback();
5073
+                                    return -1;
5074
+                                }
5075
+                            }
5076
+                        }
5077
+                        else
5078
+                        {
5079
+                            dol_syslog('Error bad setup of extrafield', LOG_WARNING);
5080
+                        }
5081
+                        break;
5082
+                    }
5083
+            }
5084
+
5085
+            $this->db->begin();
5086
+
5087
+            $table_element = $this->table_element;
5088
+            if ($table_element == 'categorie') $table_element = 'categories'; // For compatibility
5089
+
5090
+            $sql_del = "DELETE FROM ".MAIN_DB_PREFIX.$table_element."_extrafields WHERE fk_object = ".$this->id;
5091
+            dol_syslog(get_class($this)."::insertExtraFields delete", LOG_DEBUG);
5092
+            $this->db->query($sql_del);
5093
+
5094
+            $sql = "INSERT INTO ".MAIN_DB_PREFIX.$table_element."_extrafields (fk_object";
5095
+            foreach($new_array_options as $key => $value)
5096
+            {
5097
+                $attributeKey = substr($key,8);   // Remove 'options_' prefix
5098
+                // Add field of attribut
5099
+                if ($extrafields->attributes[$this->table_element]['type'][$attributeKey] != 'separate') // Only for other type than separator
5100
+                    $sql.=",".$attributeKey;
5101
+            }
5102
+            $sql .= ") VALUES (".$this->id;
5103
+
5104
+            foreach($new_array_options as $key => $value)
5105
+            {
5106
+                $attributeKey = substr($key,8);   // Remove 'options_' prefix
5107
+                // Add field of attribute
5108
+                if ($extrafields->attributes[$this->table_element]['type'][$attributeKey] != 'separate') // Only for other type than separator)
5109
+                {
5110
+                    if ($new_array_options[$key] != '')
5111
+                    {
5112
+                        $sql.=",'".$this->db->escape($new_array_options[$key])."'";
5113
+                    }
5114
+                    else
5115
+                    {
5116
+                        $sql.=",null";
5117
+                    }
5118
+                }
5119
+            }
5120
+            $sql.=")";
5121
+
5122
+            dol_syslog(get_class($this)."::insertExtraFields insert", LOG_DEBUG);
5123
+            $resql = $this->db->query($sql);
5124
+            if (! $resql)
5125
+            {
5126
+                $this->error=$this->db->lasterror();
5127
+                $error++;
5128
+            }
5129
+
5130
+            if (! $error && $trigger)
5131
+            {
5132
+                // Call trigger
5133
+                $this->context=array('extrafieldaddupdate'=>1);
5134
+                $result=$this->call_trigger($trigger, $userused);
5135
+                if ($result < 0) $error++;
5136
+                // End call trigger
5137
+            }
5138
+
5139
+            if ($error)
5140
+            {
5141
+                $this->db->rollback();
5142
+                return -1;
5143
+            }
5144
+            else
5145
+            {
5146
+                $this->db->commit();
5147
+                return 1;
5148
+            }
5149
+        }
5150
+        else return 0;
5151
+    }
5152
+
5153
+    /**
5154
+     *	Update an extra field value for the current object.
5155
+     *  Data to describe values to update are stored into $this->array_options=array('options_codeforfield1'=>'valueforfield1', 'options_codeforfield2'=>'valueforfield2', ...)
5156
+     *
5157
+     *  @param  string      $key    		Key of the extrafield (without starting 'options_')
5158
+     *  @param	string		$trigger		If defined, call also the trigger (for example COMPANY_MODIFY)
5159
+     *  @param	User		$userused		Object user
5160
+     *  @return int                 		-1=error, O=did nothing, 1=OK
5161
+     *  @see setValueFrom, insertExtraFields
5162
+     */
5163
+    function updateExtraField($key, $trigger=null, $userused=null)
5164
+    {
5165
+        global $conf,$langs,$user;
5166
+
5167
+        if (empty($userused)) $userused=$user;
5168
+
5169
+        $error=0;
5170
+
5171
+        if (! empty($conf->global->MAIN_EXTRAFIELDS_DISABLED)) return 0;	// For avoid conflicts if trigger used
5172
+
5173
+        if (! empty($this->array_options) && isset($this->array_options["options_".$key]))
5174
+        {
5175
+            // Check parameters
5176
+            $langs->load('admin');
5177
+            require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
5178
+            $extrafields = new ExtraFields($this->db);
5179
+            $target_extrafields=$extrafields->fetch_name_optionals_label($this->table_element);
5180
+
5181
+            $value=$this->array_options["options_".$key];
5182
+
5183
+            $attributeType     = $extrafields->attributes[$this->table_element]['type'][$key];
5184
+            $attributeLabel    = $extrafields->attributes[$this->table_element]['label'][$key];
5185
+            $attributeParam    = $extrafields->attributes[$this->table_element]['param'][$key];
5186
+            $attributeRequired = $extrafields->attributes[$this->table_element]['required'][$key];
5187
+
5188
+            //dol_syslog("attributeLabel=".$attributeLabel, LOG_DEBUG);
5189
+            //dol_syslog("attributeType=".$attributeType, LOG_DEBUG);
5190
+
5191
+            switch ($attributeType)
5192
+            {
5193
+                case 'int':
5194
+                    if (!is_numeric($value) && $value!='')
5195
+                    {
5196
+                        $this->errors[]=$langs->trans("ExtraFieldHasWrongValue",$attributeLabel);
5197
+                        return -1;
5198
+                    }
5199
+                    elseif ($value=='')
5200
+                    {
5201
+                        $this->array_options["options_".$key] = null;
5202
+                    }
5203
+                    break;
5204
+                case 'double':
5205
+                    $value = price2num($value);
5206
+                    if (!is_numeric($value) && $value!='')
5207
+                    {
5208
+                        dol_syslog($langs->trans("ExtraFieldHasWrongValue")." sur ".$attributeLabel."(".$value."is not '".$attributeType."')", LOG_DEBUG);
5209
+                        $this->errors[]=$langs->trans("ExtraFieldHasWrongValue", $attributeLabel);
5210
+                        return -1;
5211
+                    }
5212
+                    elseif ($value=='')
5213
+                    {
5214
+                        $this->array_options["options_".$key] = null;
5215
+                    }
5216
+                    //dol_syslog("double value"." sur ".$attributeLabel."(".$value." is '".$attributeType."')", LOG_DEBUG);
5217
+                    $this->array_options["options_".$key] = $value;
5218
+                    break;
5219
+                    /*case 'select':	// Not required, we chosed value='0' for undefined values
5220
+             		if ($value=='-1')
5221
+             		{
5222
+             			$this->array_options[$key] = null;
5223
+             		}
5224
+             		break;*/
5225
+                case 'price':
5226
+                    $this->array_options["options_".$key] = price2num($this->array_options["options_".$key]);
5227
+                    break;
5228
+                case 'date':
5229
+                    $this->array_options["options_".$key]=$this->db->idate($this->array_options["options_".$key]);
5230
+                    break;
5231
+                case 'datetime':
5232
+                    $this->array_options["options_".$key]=$this->db->idate($this->array_options["options_".$key]);
5233
+                    break;
5234
+                case 'link':
5235
+                    $param_list=array_keys($attributeParam['options']);
5236
+                    // 0 : ObjectName
5237
+                    // 1 : classPath
5238
+                    $InfoFieldList = explode(":", $param_list[0]);
5239
+                    dol_include_once($InfoFieldList[1]);
5240
+                    if ($value)
5241
+                    {
5242
+                        $object = new $InfoFieldList[0]($this->db);
5243
+                        $object->fetch(0,$value);
5244
+                        $this->array_options["options_".$key]=$object->id;
5245
+                    }
5246
+                    break;
5247
+            }
5248
+
5249
+            $this->db->begin();
5250
+            $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element."_extrafields SET ".$key."='".$this->db->escape($this->array_options["options_".$key])."'";
5251
+            $sql .= " WHERE fk_object = ".$this->id;
5252
+            $resql = $this->db->query($sql);
5253
+            if (! $resql)
5254
+            {
5255
+                $error++;
5256
+                $this->error=$this->db->lasterror();
5257
+            }
5258
+
5259
+            if (! $error && $trigger)
5260
+            {
5261
+                // Call trigger
5262
+                $this->context=array('extrafieldupdate'=>1);
5263
+                $result=$this->call_trigger($trigger, $userused);
5264
+                if ($result < 0) $error++;
5265
+                // End call trigger
5266
+            }
5267
+
5268
+            if ($error)
5269
+            {
5270
+                dol_syslog(get_class($this) . "::".__METHOD__ . $this->error, LOG_ERR);
5271
+                $this->db->rollback();
5272
+                return -1;
5273
+            }
5274
+            else
5275
+            {
5276
+                $this->db->commit();
5277
+                return 1;
5278
+            }
5279
+        }
5280
+        else return 0;
5281
+    }
5282
+
5283
+
5284
+    /**
5285
+     * Return HTML string to put an input field into a page
5286
+     * Code very similar with showInputField of extra fields
5287
+     *
5288
+     * @param  array   		$val	       Array of properties for field to show
5289
+     * @param  string  		$key           Key of attribute
5290
+     * @param  string  		$value         Preselected value to show (for date type it must be in timestamp format, for amount or price it must be a php numeric value)
5291
+     * @param  string  		$moreparam     To add more parameters on html input tag
5292
+     * @param  string  		$keysuffix     Prefix string to add into name and id of field (can be used to avoid duplicate names)
5293
+     * @param  string  		$keyprefix     Suffix string to add into name and id of field (can be used to avoid duplicate names)
5294
+     * @param  string|int		$morecss       Value for css to define style/length of field. May also be a numeric.
5295
+     * @return string
5296
+     */
5297
+    function showInputField($val, $key, $value, $moreparam='', $keysuffix='', $keyprefix='', $morecss=0)
5298
+    {
5299
+        global $conf,$langs,$form;
5300
+
5301
+        if (! is_object($form))
5302
+        {
5303
+            require_once DOL_DOCUMENT_ROOT.'/core/class/html.form.class.php';
5304
+            $form=new Form($this->db);
5305
+        }
5306
+
5307
+        $val=$this->fields[$key];
5308
+
5309
+        $out='';
5310
+        $type='';
5311
+        $param = array();
5312
+        $param['options']=array();
5313
+        $size =$this->fields[$key]['size'];
5314
+        // Because we work on extrafields
5315
+        if(preg_match('/^integer:(.*):(.*)/i', $val['type'], $reg)){
5316
+            $param['options']=array($reg[1].':'.$reg[2]=>'N');
5317
+            $type ='link';
5318
+        } elseif(preg_match('/^link:(.*):(.*)/i', $val['type'], $reg)) {
5319
+            $param['options']=array($reg[1].':'.$reg[2]=>'N');
5320
+            $type ='link';
5321
+        } elseif(preg_match('/^sellist:(.*):(.*):(.*):(.*)/i', $val['type'], $reg)) {
5322
+            $param['options']=array($reg[1].':'.$reg[2].':'.$reg[3].':'.$reg[4]=>'N');
5323
+            $type ='sellist';
5324
+        } elseif(preg_match('/varchar\((\d+)\)/', $val['type'],$reg)) {
5325
+            $param['options']=array();
5326
+            $type ='varchar';
5327
+            $size=$reg[1];
5328
+        } elseif(preg_match('/varchar/', $val['type'])) {
5329
+            $param['options']=array();
5330
+            $type ='varchar';
5331
+        } elseif(is_array($this->fields[$key]['arrayofkeyval'])) {
5332
+            $param['options']=$this->fields[$key]['arrayofkeyval'];
5333
+            $type ='select';
5334
+        } else {
5335
+            $param['options']=array();
5336
+            $type =$this->fields[$key]['type'];
5337
+        }
5338
+
5339
+        $label=$this->fields[$key]['label'];
5340
+        //$elementtype=$this->fields[$key]['elementtype'];	// Seems not used
5341
+        $default=$this->fields[$key]['default'];
5342
+        $computed=$this->fields[$key]['computed'];
5343
+        $unique=$this->fields[$key]['unique'];
5344
+        $required=$this->fields[$key]['required'];
5345
+
5346
+        $langfile=$this->fields[$key]['langfile'];
5347
+        $list=$this->fields[$key]['list'];
5348
+        $hidden=abs($this->fields[$key]['visible'])!=1?1:0;
5349
+
5350
+        $objectid = $this->id;
5351
+
5352
+
5353
+        if ($computed)
5354
+        {
5355
+            if (! preg_match('/^search_/', $keyprefix)) return '<span class="opacitymedium">'.$langs->trans("AutomaticallyCalculated").'</span>';
5356
+            else return '';
5357
+        }
5358
+
5359
+
5360
+        // Use in priority showsize from parameters, then $val['css'] then autodefine
5361
+        if (empty($morecss) && ! empty($val['css']))
5362
+        {
5363
+            $showsize = $val['css'];
5364
+        }
5365
+        if (empty($morecss))
5366
+        {
5367
+            if ($type == 'date')
5368
+            {
5369
+                $morecss = 'minwidth100imp';
5370
+            }
5371
+            elseif ($type == 'datetime')
5372
+            {
5373
+                $morecss = 'minwidth200imp';
5374
+            }
5375
+            elseif (in_array($type,array('int','integer','price')) || preg_match('/^double(\([0-9],[0-9]\)){0,1}/',$type))
5376
+            {
5377
+                $morecss = 'maxwidth75';
5378
+                        }elseif ($type == 'url')
5379
+            {
5380
+                $morecss='minwidth400';
5381
+            }
5382
+            elseif ($type == 'boolean')
5383
+            {
5384
+                $morecss='';
5385
+            }
5386
+            else
5387
+            {
5388
+                if (round($size) < 12)
5389
+                {
5390
+                    $morecss = 'minwidth100';
5391
+                }
5392
+                else if (round($size) <= 48)
5393
+                {
5394
+                    $morecss = 'minwidth200';
5395
+                }
5396
+                else
5397
+                {
5398
+                    $morecss = 'minwidth400';
5399
+                }
5400
+            }
5401
+        }
5402
+
5403
+        if (in_array($type,array('date','datetime')))
5404
+        {
5405
+            $tmp=explode(',',$size);
5406
+            $newsize=$tmp[0];
5407
+
5408
+            $showtime = in_array($type,array('datetime')) ? 1 : 0;
5409
+
5410
+            // Do not show current date when field not required (see selectDate() method)
5411
+            if (!$required && $value == '') $value = '-1';
5412
+
5413
+            // TODO Must also support $moreparam
5414
+            $out = $form->selectDate($value, $keyprefix.$key.$keysuffix, $showtime, $showtime, $required, '', 1, (($keyprefix != 'search_' && $keyprefix != 'search_options_') ? 1 : 0), 0, 1);
5415
+        }
5416
+        elseif (in_array($type,array('int','integer')))
5417
+        {
5418
+            $tmp=explode(',',$size);
5419
+            $newsize=$tmp[0];
5420
+            $out='<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" maxlength="'.$newsize.'" value="'.dol_escape_htmltag($value).'"'.($moreparam?$moreparam:'').'>';
5421
+        }
5422
+        elseif (preg_match('/varchar/', $type))
5423
+        {
5424
+            $out='<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" maxlength="'.$size.'" value="'.dol_escape_htmltag($value).'"'.($moreparam?$moreparam:'').'>';
5425
+        }
5426
+        elseif (in_array($type, array('mail', 'phone', 'url')))
5427
+        {
5428
+            $out='<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" value="'.dol_escape_htmltag($value).'" '.($moreparam?$moreparam:'').'>';
5429
+        }
5430
+        elseif ($type == 'text')
5431
+        {
5432
+            if (! preg_match('/search_/', $keyprefix))		// If keyprefix is search_ or search_options_, we must just use a simple text field
5433
+            {
5434
+                require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
5435
+                $doleditor=new DolEditor($keyprefix.$key.$keysuffix,$value,'',200,'dolibarr_notes','In',false,false,false,ROWS_5,'90%');
5436
+                $out=$doleditor->Create(1);
5437
+            }
5438
+            else
5439
+            {
5440
+                $out='<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" value="'.dol_escape_htmltag($value).'" '.($moreparam?$moreparam:'').'>';
5441
+            }
5442
+        }
5443
+        elseif ($type == 'html')
5444
+        {
5445
+            if (! preg_match('/search_/', $keyprefix))		// If keyprefix is search_ or search_options_, we must just use a simple text field
5446
+            {
5447
+                require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
5448
+                $doleditor=new DolEditor($keyprefix.$key.$keysuffix,$value,'',200,'dolibarr_notes','In',false,false,! empty($conf->fckeditor->enabled) && $conf->global->FCKEDITOR_ENABLE_SOCIETE,ROWS_5,'90%');
5449
+                $out=$doleditor->Create(1);
5450
+            }
5451
+            else
5452
+            {
5453
+                $out='<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" value="'.dol_escape_htmltag($value).'" '.($moreparam?$moreparam:'').'>';
5454
+            }
5455
+        }
5456
+        elseif ($type == 'boolean')
5457
+        {
5458
+            $checked='';
5459
+            if (!empty($value)) {
5460
+                $checked=' checked value="1" ';
5461
+            } else {
5462
+                $checked=' value="1" ';
5463
+            }
5464
+            $out='<input type="checkbox" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" '.$checked.' '.($moreparam?$moreparam:'').'>';
5465
+        }
5466
+        elseif ($type == 'price')
5467
+        {
5468
+            if (!empty($value)) {		// $value in memory is a php numeric, we format it into user number format.
5469
+                $value=price($value);
5470
+            }
5471
+            $out='<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" value="'.$value.'" '.($moreparam?$moreparam:'').'> '.$langs->getCurrencySymbol($conf->currency);
5472
+        }
5473
+        elseif (preg_match('/^double(\([0-9],[0-9]\)){0,1}/',$type))
5474
+        {
5475
+            if (!empty($value)) {		// $value in memory is a php numeric, we format it into user number format.
5476
+                $value=price($value);
5477
+            }
5478
+            $out='<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" value="'.$value.'" '.($moreparam?$moreparam:'').'> ';
5479
+        }
5480
+        elseif ($type == 'select')
5481
+        {
5482
+            $out = '';
5483
+            if (! empty($conf->use_javascript_ajax) && ! empty($conf->global->MAIN_EXTRAFIELDS_USE_SELECT2))
5484
+            {
5485
+                include_once DOL_DOCUMENT_ROOT . '/core/lib/ajax.lib.php';
5486
+                $out.= ajax_combobox($keyprefix.$key.$keysuffix, array(), 0);
5487
+            }
5488
+
5489
+            $out.='<select class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" '.($moreparam?$moreparam:'').'>';
5490
+                if((! isset($this->fields[$key]['default'])) ||($this->fields[$key]['notnull']!=1))$out.='<option value="0">&nbsp;</option>';
5491
+            foreach ($param['options'] as $key => $val)
5492
+            {
5493
+                if ((string) $key == '') continue;
5494
+                list($val, $parent) = explode('|', $val);
5495
+                $out.='<option value="'.$key.'"';
5496
+                $out.= (((string) $value == (string) $key)?' selected':'');
5497
+                $out.= (!empty($parent)?' parent="'.$parent.'"':'');
5498
+                $out.='>'.$val.'</option>';
5499
+            }
5500
+            $out.='</select>';
5501
+        }
5502
+        elseif ($type == 'sellist')
5503
+        {
5504
+            $out = '';
5505
+            if (! empty($conf->use_javascript_ajax) && ! empty($conf->global->MAIN_EXTRAFIELDS_USE_SELECT2))
5506
+            {
5507
+                include_once DOL_DOCUMENT_ROOT . '/core/lib/ajax.lib.php';
5508
+                $out.= ajax_combobox($keyprefix.$key.$keysuffix, array(), 0);
5509
+            }
5510
+
5511
+            $out.='<select class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" '.($moreparam?$moreparam:'').'>';
5512
+            if (is_array($param['options']))
5513
+            {
5514
+                $param_list=array_keys($param['options']);
5515
+                $InfoFieldList = explode(":", $param_list[0]);
5516
+                $parentName='';
5517
+                $parentField='';
5518
+                // 0 : tableName
5519
+                // 1 : label field name
5520
+                // 2 : key fields name (if differ of rowid)
5521
+                // 3 : key field parent (for dependent lists)
5522
+                // 4 : where clause filter on column or table extrafield, syntax field='value' or extra.field=value
5523
+                $keyList=(empty($InfoFieldList[2])?'rowid':$InfoFieldList[2].' as rowid');
5524
+
5525
+
5526
+                if (count($InfoFieldList) > 4 && ! empty($InfoFieldList[4]))
5527
+                {
5528
+                    if (strpos($InfoFieldList[4], 'extra.') !== false)
5529
+                    {
5530
+                        $keyList='main.'.$InfoFieldList[2].' as rowid';
5531
+                    } else {
5532
+                        $keyList=$InfoFieldList[2].' as rowid';
5533
+                    }
5534
+                }
5535
+                if (count($InfoFieldList) > 3 && ! empty($InfoFieldList[3]))
5536
+                {
5537
+                    list($parentName, $parentField) = explode('|', $InfoFieldList[3]);
5538
+                    $keyList.= ', '.$parentField;
5539
+                }
5540
+
5541
+                $fields_label = explode('|',$InfoFieldList[1]);
5542
+                if (is_array($fields_label))
5543
+                {
5544
+                    $keyList .=', ';
5545
+                    $keyList .= implode(', ', $fields_label);
5546
+                }
5547
+
5548
+                $sqlwhere='';
5549
+                $sql = 'SELECT '.$keyList;
5550
+                $sql.= ' FROM '.MAIN_DB_PREFIX .$InfoFieldList[0];
5551
+                if (!empty($InfoFieldList[4]))
5552
+                {
5553
+                    // can use SELECT request
5554
+                    if (strpos($InfoFieldList[4], '$SEL$')!==false) {
5555
+                        $InfoFieldList[4]=str_replace('$SEL$','SELECT',$InfoFieldList[4]);
5556
+                    }
5557
+
5558
+                    // current object id can be use into filter
5559
+                    if (strpos($InfoFieldList[4], '$ID$')!==false && !empty($objectid)) {
5560
+                        $InfoFieldList[4]=str_replace('$ID$',$objectid,$InfoFieldList[4]);
5561
+                    } else {
5562
+                        $InfoFieldList[4]=str_replace('$ID$','0',$InfoFieldList[4]);
5563
+                    }
5564
+                    //We have to join on extrafield table
5565
+                    if (strpos($InfoFieldList[4], 'extra')!==false)
5566
+                    {
5567
+                        $sql.= ' as main, '.MAIN_DB_PREFIX .$InfoFieldList[0].'_extrafields as extra';
5568
+                        $sqlwhere.= ' WHERE extra.fk_object=main.'.$InfoFieldList[2]. ' AND '.$InfoFieldList[4];
5569
+                    }
5570
+                    else
5571
+                    {
5572
+                        $sqlwhere.= ' WHERE '.$InfoFieldList[4];
5573
+                    }
5574
+                }
5575
+                else
5576
+                {
5577
+                    $sqlwhere.= ' WHERE 1=1';
5578
+                }
5579
+                // Some tables may have field, some other not. For the moment we disable it.
5580
+                if (in_array($InfoFieldList[0],array('tablewithentity')))
5581
+                {
5582
+                    $sqlwhere.= ' AND entity = '.$conf->entity;
5583
+                }
5584
+                $sql.=$sqlwhere;
5585
+                //print $sql;
5586
+
5587
+                $sql .= ' ORDER BY ' . implode(', ', $fields_label);
5588
+
5589
+                dol_syslog(get_class($this).'::showInputField type=sellist', LOG_DEBUG);
5590
+                $resql = $this->db->query($sql);
5591
+                if ($resql)
5592
+                {
5593
+                    $out.='<option value="0">&nbsp;</option>';
5594
+                    $num = $this->db->num_rows($resql);
5595
+                    $i = 0;
5596
+                    while ($i < $num)
5597
+                    {
5598
+                        $labeltoshow='';
5599
+                        $obj = $this->db->fetch_object($resql);
5600
+
5601
+                        // Several field into label (eq table:code|libelle:rowid)
5602
+                        $notrans = false;
5603
+                        $fields_label = explode('|',$InfoFieldList[1]);
5604
+                        if (is_array($fields_label))
5605
+                        {
5606
+                            $notrans = true;
5607
+                            foreach ($fields_label as $field_toshow)
5608
+                            {
5609
+                                $labeltoshow.= $obj->$field_toshow.' ';
5610
+                            }
5611
+                        }
5612
+                        else
5613
+                        {
5614
+                            $labeltoshow=$obj->{$InfoFieldList[1]};
5615
+                        }
5616
+                        $labeltoshow=dol_trunc($labeltoshow,45);
5617
+
5618
+                        if ($value == $obj->rowid)
5619
+                        {
5620
+                            foreach ($fields_label as $field_toshow)
5621
+                            {
5622
+                                $translabel=$langs->trans($obj->$field_toshow);
5623
+                                if ($translabel!=$obj->$field_toshow) {
5624
+                                    $labeltoshow=dol_trunc($translabel,18).' ';
5625
+                                }else {
5626
+                                    $labeltoshow=dol_trunc($obj->$field_toshow,18).' ';
5627
+                                }
5628
+                            }
5629
+                            $out.='<option value="'.$obj->rowid.'" selected>'.$labeltoshow.'</option>';
5630
+                        }
5631
+                        else
5632
+                        {
5633
+                            if (! $notrans)
5634
+                            {
5635
+                                $translabel=$langs->trans($obj->{$InfoFieldList[1]});
5636
+                                if ($translabel!=$obj->{$InfoFieldList[1]}) {
5637
+                                    $labeltoshow=dol_trunc($translabel,18);
5638
+                                }
5639
+                                else {
5640
+                                    $labeltoshow=dol_trunc($obj->{$InfoFieldList[1]},18);
5641
+                                }
5642
+                            }
5643
+                            if (empty($labeltoshow)) $labeltoshow='(not defined)';
5644
+                            if ($value==$obj->rowid)
5645
+                            {
5646
+                                $out.='<option value="'.$obj->rowid.'" selected>'.$labeltoshow.'</option>';
5647
+                            }
5648
+
5649
+                            if (!empty($InfoFieldList[3]) && $parentField)
5650
+                            {
5651
+                                $parent = $parentName.':'.$obj->{$parentField};
5652
+                            }
5653
+
5654
+                            $out.='<option value="'.$obj->rowid.'"';
5655
+                            $out.= ($value==$obj->rowid?' selected':'');
5656
+                            $out.= (!empty($parent)?' parent="'.$parent.'"':'');
5657
+                            $out.='>'.$labeltoshow.'</option>';
5658
+                        }
5659
+
5660
+                        $i++;
5661
+                    }
5662
+                    $this->db->free($resql);
5663
+                }
5664
+                else {
5665
+                    print 'Error in request '.$sql.' '.$this->db->lasterror().'. Check setup of extra parameters.<br>';
5666
+                }
5667
+            }
5668
+            $out.='</select>';
5669
+        }
5670
+        elseif ($type == 'checkbox')
5671
+        {
5672
+            $value_arr=explode(',',$value);
5673
+            $out=$form->multiselectarray($keyprefix.$key.$keysuffix, (empty($param['options'])?null:$param['options']), $value_arr, '', 0, '', 0, '100%');
5674
+        }
5675
+        elseif ($type == 'radio')
5676
+        {
5677
+            $out='';
5678
+            foreach ($param['options'] as $keyopt => $val)
5679
+            {
5680
+                $out.='<input class="flat '.$morecss.'" type="radio" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" '.($moreparam?$moreparam:'');
5681
+                $out.=' value="'.$keyopt.'"';
5682
+                $out.=' id="'.$keyprefix.$key.$keysuffix.'_'.$keyopt.'"';
5683
+                $out.= ($value==$keyopt?'checked':'');
5684
+                $out.='/><label for="'.$keyprefix.$key.$keysuffix.'_'.$keyopt.'">'.$val.'</label><br>';
5685
+            }
5686
+        }
5687
+        elseif ($type == 'chkbxlst')
5688
+        {
5689
+            if (is_array($value)) {
5690
+                $value_arr = $value;
5691
+            }
5692
+            else {
5693
+                $value_arr = explode(',', $value);
5694
+            }
5695
+
5696
+            if (is_array($param['options'])) {
5697
+                $param_list = array_keys($param['options']);
5698
+                $InfoFieldList = explode(":", $param_list[0]);
5699
+                $parentName='';
5700
+                $parentField='';
5701
+                // 0 : tableName
5702
+                // 1 : label field name
5703
+                // 2 : key fields name (if differ of rowid)
5704
+                // 3 : key field parent (for dependent lists)
5705
+                // 4 : where clause filter on column or table extrafield, syntax field='value' or extra.field=value
5706
+                $keyList = (empty($InfoFieldList[2]) ? 'rowid' : $InfoFieldList[2] . ' as rowid');
5707
+
5708
+                if (count($InfoFieldList) > 3 && ! empty($InfoFieldList[3])) {
5709
+                    list ( $parentName, $parentField ) = explode('|', $InfoFieldList[3]);
5710
+                    $keyList .= ', ' . $parentField;
5711
+                }
5712
+                if (count($InfoFieldList) > 4 && ! empty($InfoFieldList[4])) {
5713
+                    if (strpos($InfoFieldList[4], 'extra.') !== false) {
5714
+                        $keyList = 'main.' . $InfoFieldList[2] . ' as rowid';
5715
+                    } else {
5716
+                        $keyList = $InfoFieldList[2] . ' as rowid';
5717
+                    }
5718
+                }
5719
+
5720
+                $fields_label = explode('|', $InfoFieldList[1]);
5721
+                if (is_array($fields_label)) {
5722
+                    $keyList .= ', ';
5723
+                    $keyList .= implode(', ', $fields_label);
5724
+                }
5725
+
5726
+                $sqlwhere = '';
5727
+                $sql = 'SELECT ' . $keyList;
5728
+                $sql .= ' FROM ' . MAIN_DB_PREFIX . $InfoFieldList[0];
5729
+                if (! empty($InfoFieldList[4])) {
5730
+
5731
+                    // can use SELECT request
5732
+                    if (strpos($InfoFieldList[4], '$SEL$')!==false) {
5733
+                        $InfoFieldList[4]=str_replace('$SEL$','SELECT',$InfoFieldList[4]);
5734
+                    }
5735
+
5736
+                    // current object id can be use into filter
5737
+                    if (strpos($InfoFieldList[4], '$ID$')!==false && !empty($objectid)) {
5738
+                        $InfoFieldList[4]=str_replace('$ID$',$objectid,$InfoFieldList[4]);
5739
+                    } else {
5740
+                        $InfoFieldList[4]=str_replace('$ID$','0',$InfoFieldList[4]);
5741
+                    }
5742
+
5743
+                    // We have to join on extrafield table
5744
+                    if (strpos($InfoFieldList[4], 'extra') !== false) {
5745
+                        $sql .= ' as main, ' . MAIN_DB_PREFIX . $InfoFieldList[0] . '_extrafields as extra';
5746
+                        $sqlwhere .= ' WHERE extra.fk_object=main.' . $InfoFieldList[2] . ' AND ' . $InfoFieldList[4];
5747
+                    } else {
5748
+                        $sqlwhere .= ' WHERE ' . $InfoFieldList[4];
5749
+                    }
5750
+                } else {
5751
+                    $sqlwhere .= ' WHERE 1=1';
5752
+                }
5753
+                // Some tables may have field, some other not. For the moment we disable it.
5754
+                if (in_array($InfoFieldList[0], array ('tablewithentity')))
5755
+                {
5756
+                    $sqlwhere .= ' AND entity = ' . $conf->entity;
5757
+                }
5758
+                // $sql.=preg_replace('/^ AND /','',$sqlwhere);
5759
+                // print $sql;
5760
+
5761
+                $sql .= $sqlwhere;
5762
+                dol_syslog(get_class($this) . '::showInputField type=chkbxlst',LOG_DEBUG);
5763
+                $resql = $this->db->query($sql);
5764
+                if ($resql) {
5765
+                    $num = $this->db->num_rows($resql);
5766
+                    $i = 0;
5767
+
5768
+                    $data=array();
5769
+
5770
+                    while ( $i < $num ) {
5771
+                        $labeltoshow = '';
5772
+                        $obj = $this->db->fetch_object($resql);
5773
+
5774
+                        $notrans = false;
5775
+                        // Several field into label (eq table:code|libelle:rowid)
5776
+                        $fields_label = explode('|', $InfoFieldList[1]);
5777
+                        if (is_array($fields_label)) {
5778
+                            $notrans = true;
5779
+                            foreach ( $fields_label as $field_toshow ) {
5780
+                                $labeltoshow .= $obj->$field_toshow . ' ';
5781
+                            }
5782
+                        } else {
5783
+                            $labeltoshow = $obj->{$InfoFieldList[1]};
5784
+                        }
5785
+                        $labeltoshow = dol_trunc($labeltoshow, 45);
5786
+
5787
+                        if (is_array($value_arr) && in_array($obj->rowid, $value_arr)) {
5788
+                            foreach ( $fields_label as $field_toshow ) {
5789
+                                $translabel = $langs->trans($obj->$field_toshow);
5790
+                                if ($translabel != $obj->$field_toshow) {
5791
+                                    $labeltoshow = dol_trunc($translabel, 18) . ' ';
5792
+                                } else {
5793
+                                    $labeltoshow = dol_trunc($obj->$field_toshow, 18) . ' ';
5794
+                                }
5795
+                            }
5796
+
5797
+                            $data[$obj->rowid]=$labeltoshow;
5798
+                        } else {
5799
+                            if (! $notrans) {
5800
+                                $translabel = $langs->trans($obj->{$InfoFieldList[1]});
5801
+                                if ($translabel != $obj->{$InfoFieldList[1]}) {
5802
+                                    $labeltoshow = dol_trunc($translabel, 18);
5803
+                                } else {
5804
+                                    $labeltoshow = dol_trunc($obj->{$InfoFieldList[1]}, 18);
5805
+                                }
5806
+                            }
5807
+                            if (empty($labeltoshow))
5808
+                                $labeltoshow = '(not defined)';
5809
+
5810
+                                if (is_array($value_arr) && in_array($obj->rowid, $value_arr)) {
5811
+                                    $data[$obj->rowid]=$labeltoshow;
5812
+                                }
5813
+
5814
+                                if (! empty($InfoFieldList[3]) && $parentField) {
5815
+                                    $parent = $parentName . ':' . $obj->{$parentField};
5816
+                                }
5817
+
5818
+                                $data[$obj->rowid]=$labeltoshow;
5819
+                        }
5820
+
5821
+                        $i ++;
5822
+                    }
5823
+                    $this->db->free($resql);
5824
+
5825
+                    $out=$form->multiselectarray($keyprefix.$key.$keysuffix, $data, $value_arr, '', 0, '', 0, '100%');
5826
+                } else {
5827
+                    print 'Error in request ' . $sql . ' ' . $this->db->lasterror() . '. Check setup of extra parameters.<br>';
5828
+                }
5829
+            }
5830
+        }
5831
+        elseif ($type == 'link')
5832
+        {
5833
+            $param_list=array_keys($param['options']);				// $param_list='ObjectName:classPath'
5834
+            $showempty=(($required && $default != '')?0:1);
5835
+            $out=$form->selectForForms($param_list[0], $keyprefix.$key.$keysuffix, $value, $showempty);
5836
+            if ($conf->global->MAIN_FEATURES_LEVEL >= 2)
5837
+            {
5838
+                        list($class,$classfile)=explode(':',$param_list[0]);
5839
+                        if (file_exists(dol_buildpath(dirname(dirname($classfile)).'/card.php'))) $url_path=dol_buildpath(dirname(dirname($classfile)).'/card.php',1);
5840
+                        else $url_path=dol_buildpath(dirname(dirname($classfile)).'/'.$class.'_card.php',1);
5841
+                        $out.='<a class="butActionNew" href="'.$url_path.'?action=create&backtopage='.$_SERVER['PHP_SELF'].'"><span class="fa fa-plus-circle valignmiddle"></span></a>';
5842
+                        // TODO Add Javascript code to add input fields contents to new elements urls
5843
+            }
5844
+        }
5845
+        elseif ($type == 'password')
5846
+        {
5847
+            // If prefix is 'search_', field is used as a filter, we use a common text field.
5848
+            $out='<input type="'.($keyprefix=='search_'?'text':'password').'" class="flat '.$morecss.'" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" value="'.$value.'" '.($moreparam?$moreparam:'').'>';
5849
+        }
5850
+        elseif ($type == 'array')
5851
+        {
5852
+            $newval = $val;
5853
+            $newval['type'] = 'varchar(256)';
5854
+
5855
+            $out='';
5856
+
5857
+            $inputs = array();
5858
+            if(! empty($value)) {
5859
+                foreach($value as $option) {
5860
+                    $out.= '<span><a class="'.dol_escape_htmltag($keyprefix.$key.$keysuffix).'_del" href="javascript:;"><span class="fa fa-minus-circle valignmiddle"></span></a> ';
5861
+                    $out.= $this->showInputField($newval, $keyprefix.$key.$keysuffix.'[]', $option, $moreparam, '', '', $showsize).'<br></span>';
5862
+                }
5863
+            }
5864
+
5865
+            $out.= '<a id="'.dol_escape_htmltag($keyprefix.$key.$keysuffix).'_add" href="javascript:;"><span class="fa fa-plus-circle valignmiddle"></span></a>';
5866
+
5867
+            $newInput = '<span><a class="'.dol_escape_htmltag($keyprefix.$key.$keysuffix).'_del" href="javascript:;"><span class="fa fa-minus-circle valignmiddle"></span></a> ';
5868
+            $newInput.= $this->showInputField($newval, $keyprefix.$key.$keysuffix.'[]', '', $moreparam, '', '', $showsize).'<br></span>';
5869
+
5870
+            if(! empty($conf->use_javascript_ajax)) {
5871
+                $out.= '
5872
+					<script type="text/javascript">
5873
+					$(document).ready(function() {
5874
+						$("a#'.dol_escape_js($keyprefix.$key.$keysuffix).'_add").click(function() {
5875
+							$("'.dol_escape_js($newInput).'").insertBefore(this);
5876
+						});
5877
+
5878
+						$(document).on("click", "a.'.dol_escape_js($keyprefix.$key.$keysuffix).'_del", function() {
5879
+							$(this).parent().remove();
5880
+						});
5881
+					});
5882
+					</script>';
5883
+            }
5884
+        }
5885
+        if (!empty($hidden)) {
5886
+            $out='<input type="hidden" value="'.$value.'" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'"/>';
5887
+        }
5888
+        /* Add comments
5889
+		 if ($type == 'date') $out.=' (YYYY-MM-DD)';
5890
+		 elseif ($type == 'datetime') $out.=' (YYYY-MM-DD HH:MM:SS)';
5891
+		 */
5892
+        return $out;
5893
+    }
5894
+
5895
+    /**
5896
+     * Return HTML string to show a field into a page
5897
+     * Code very similar with showOutputField of extra fields
5898
+     *
5899
+     * @param  array   $val		       Array of properties of field to show
5900
+     * @param  string  $key            Key of attribute
5901
+     * @param  string  $value          Preselected value to show (for date type it must be in timestamp format, for amount or price it must be a php numeric value)
5902
+     * @param  string  $moreparam      To add more parametes on html input tag
5903
+     * @param  string  $keysuffix      Prefix string to add into name and id of field (can be used to avoid duplicate names)
5904
+     * @param  string  $keyprefix      Suffix string to add into name and id of field (can be used to avoid duplicate names)
5905
+     * @param  mixed   $showsize       Value for css to define size. May also be a numeric.
5906
+     * @return string
5907
+     */
5908
+    function showOutputField($val, $key, $value, $moreparam='', $keysuffix='', $keyprefix='', $showsize=0)
5909
+    {
5910
+        global $conf,$langs,$form;
5911
+
5912
+        if (! is_object($form))
5913
+        {
5914
+            require_once DOL_DOCUMENT_ROOT.'/core/class/html.form.class.php';
5915
+            $form=new Form($this->db);
5916
+        }
5917
+
5918
+        $objectid = $this->id;
5919
+        $label = $val['label'];
5920
+        $type  = $val['type'];
5921
+        $size  = $val['css'];
5922
+
5923
+        // Convert var to be able to share same code than showOutputField of extrafields
5924
+        if (preg_match('/varchar\((\d+)\)/', $type, $reg))
5925
+        {
5926
+            $type = 'varchar';		// convert varchar(xx) int varchar
5927
+            $size = $reg[1];
5928
+        }
5929
+        elseif (preg_match('/varchar/', $type)) $type = 'varchar';		// convert varchar(xx) int varchar
5930
+        if (is_array($val['arrayofkeyval'])) $type='select';
5931
+        if (preg_match('/^integer:(.*):(.*)/i', $val['type'], $reg)) $type='link';
5932
+
5933
+        $default=$val['default'];
5934
+        $computed=$val['computed'];
5935
+        $unique=$val['unique'];
5936
+        $required=$val['required'];
5937
+        $param=$val['param'];
5938
+        if (is_array($val['arrayofkeyval'])) $param['options'] = $val['arrayofkeyval'];
5939
+        if (preg_match('/^integer:(.*):(.*)/i', $val['type'], $reg))
5940
+        {
5941
+            $type='link';
5942
+            $param['options']=array($reg[1].':'.$reg[2]=>$reg[1].':'.$reg[2]);
5943
+        }
5944
+        $langfile=$val['langfile'];
5945
+        $list=$val['list'];
5946
+        $help=$val['help'];
5947
+        $hidden=(($val['visible'] == 0) ? 1 : 0);			// If zero, we are sure it is hidden, otherwise we show. If it depends on mode (view/create/edit form or list, this must be filtered by caller)
5948
+
5949
+        if ($hidden) return '';
5950
+
5951
+        // If field is a computed field, value must become result of compute
5952
+        if ($computed)
5953
+        {
5954
+            // Make the eval of compute string
5955
+            //var_dump($computed);
5956
+            $value = dol_eval($computed, 1, 0);
5957
+        }
5958
+
5959
+        if (empty($showsize))
5960
+        {
5961
+            if ($type == 'date')
5962
+            {
5963
+                //$showsize=10;
5964
+                $showsize = 'minwidth100imp';
5965
+            }
5966
+            elseif ($type == 'datetime')
5967
+            {
5968
+                //$showsize=19;
5969
+                $showsize = 'minwidth200imp';
5970
+            }
5971
+            elseif (in_array($type,array('int','double','price')))
5972
+            {
5973
+                //$showsize=10;
5974
+                $showsize = 'maxwidth75';
5975
+            }
5976
+            elseif ($type == 'url')
5977
+            {
5978
+                $showsize='minwidth400';
5979
+            }
5980
+            elseif ($type == 'boolean')
5981
+            {
5982
+                $showsize='';
5983
+            }
5984
+            else
5985
+            {
5986
+                if (round($size) < 12)
5987
+                {
5988
+                    $showsize = 'minwidth100';
5989
+                }
5990
+                else if (round($size) <= 48)
5991
+                {
5992
+                    $showsize = 'minwidth200';
5993
+                }
5994
+                else
5995
+                {
5996
+                    //$showsize=48;
5997
+                    $showsize = 'minwidth400';
5998
+                }
5999
+            }
6000
+        }
6001
+
6002
+        // Format output value differently according to properties of field
6003
+        if ($key == 'ref' && method_exists($this, 'getNomUrl')) $value=$this->getNomUrl(1, '', 0, '', 1);
6004
+        elseif ($key == 'status' && method_exists($this, 'getLibStatut')) $value=$this->getLibStatut(3);
6005
+        elseif ($type == 'date')
6006
+        {
6007
+            if(! empty($value)) {
6008
+                $value=dol_print_date($value,'day');
6009
+            } else {
6010
+                $value='';
6011
+            }
6012
+        }
6013
+        elseif ($type == 'datetime')
6014
+        {
6015
+            if(! empty($value)) {
6016
+                $value=dol_print_date($value,'dayhour');
6017
+            } else {
6018
+                $value='';
6019
+            }
6020
+        }
6021
+        elseif ($type == 'double')
6022
+        {
6023
+            if (!empty($value)) {
6024
+                $value=price($value);
6025
+            }
6026
+        }
6027
+        elseif ($type == 'boolean')
6028
+        {
6029
+            $checked='';
6030
+            if (!empty($value)) {
6031
+                $checked=' checked ';
6032
+            }
6033
+            $value='<input type="checkbox" '.$checked.' '.($moreparam?$moreparam:'').' readonly disabled>';
6034
+        }
6035
+        elseif ($type == 'mail')
6036
+        {
6037
+            $value=dol_print_email($value,0,0,0,64,1,1);
6038
+        }
6039
+        elseif ($type == 'url')
6040
+        {
6041
+            $value=dol_print_url($value,'_blank',32,1);
6042
+        }
6043
+        elseif ($type == 'phone')
6044
+        {
6045
+            $value=dol_print_phone($value, '', 0, 0, '', '&nbsp;', 1);
6046
+        }
6047
+        elseif ($type == 'price')
6048
+        {
6049
+            $value=price($value,0,$langs,0,0,-1,$conf->currency);
6050
+        }
6051
+        elseif ($type == 'select')
6052
+        {
6053
+            $value=$param['options'][$value];
6054
+        }
6055
+        elseif ($type == 'sellist')
6056
+        {
6057
+            $param_list=array_keys($param['options']);
6058
+            $InfoFieldList = explode(":", $param_list[0]);
6059
+
6060
+            $selectkey="rowid";
6061
+            $keyList='rowid';
6062
+
6063
+            if (count($InfoFieldList)>=3)
6064
+            {
6065
+                $selectkey = $InfoFieldList[2];
6066
+                $keyList=$InfoFieldList[2].' as rowid';
6067
+            }
6068
+
6069
+            $fields_label = explode('|',$InfoFieldList[1]);
6070
+            if(is_array($fields_label)) {
6071
+                $keyList .=', ';
6072
+                $keyList .= implode(', ', $fields_label);
6073
+            }
6074
+
6075
+            $sql = 'SELECT '.$keyList;
6076
+            $sql.= ' FROM '.MAIN_DB_PREFIX .$InfoFieldList[0];
6077
+            if (strpos($InfoFieldList[4], 'extra')!==false)
6078
+            {
6079
+                $sql.= ' as main';
6080
+            }
6081
+            if ($selectkey=='rowid' && empty($value)) {
6082
+                $sql.= " WHERE ".$selectkey."=0";
6083
+            } elseif ($selectkey=='rowid') {
6084
+                $sql.= " WHERE ".$selectkey."=".$this->db->escape($value);
6085
+            }else {
6086
+                $sql.= " WHERE ".$selectkey."='".$this->db->escape($value)."'";
6087
+            }
6088
+
6089
+            //$sql.= ' AND entity = '.$conf->entity;
6090
+
6091
+            dol_syslog(get_class($this).':showOutputField:$type=sellist', LOG_DEBUG);
6092
+            $resql = $this->db->query($sql);
6093
+            if ($resql)
6094
+            {
6095
+                $value='';	// value was used, so now we reste it to use it to build final output
6096
+
6097
+                $obj = $this->db->fetch_object($resql);
6098
+
6099
+                // Several field into label (eq table:code|libelle:rowid)
6100
+                $fields_label = explode('|',$InfoFieldList[1]);
6101
+
6102
+                if(is_array($fields_label) && count($fields_label)>1)
6103
+                {
6104
+                    foreach ($fields_label as $field_toshow)
6105
+                    {
6106
+                        $translabel='';
6107
+                        if (!empty($obj->$field_toshow)) {
6108
+                            $translabel=$langs->trans($obj->$field_toshow);
6109
+                        }
6110
+                        if ($translabel!=$field_toshow) {
6111
+                            $value.=dol_trunc($translabel,18).' ';
6112
+                        }else {
6113
+                            $value.=$obj->$field_toshow.' ';
6114
+                        }
6115
+                    }
6116
+                }
6117
+                else
6118
+                {
6119
+                    $translabel='';
6120
+                    if (!empty($obj->{$InfoFieldList[1]})) {
6121
+                        $translabel=$langs->trans($obj->{$InfoFieldList[1]});
6122
+                    }
6123
+                    if ($translabel!=$obj->{$InfoFieldList[1]}) {
6124
+                        $value=dol_trunc($translabel,18);
6125
+                    }else {
6126
+                        $value=$obj->{$InfoFieldList[1]};
6127
+                    }
6128
+                }
6129
+            }
6130
+            else dol_syslog(get_class($this).'::showOutputField error '.$this->db->lasterror(), LOG_WARNING);
6131
+        }
6132
+        elseif ($type == 'radio')
6133
+        {
6134
+            $value=$param['options'][$value];
6135
+        }
6136
+        elseif ($type == 'checkbox')
6137
+        {
6138
+            $value_arr=explode(',',$value);
6139
+            $value='';
6140
+            if (is_array($value_arr) && count($value_arr)>0)
6141
+            {
6142
+                foreach ($value_arr as $keyval=>$valueval) {
6143
+                    $toprint[]='<li class="select2-search-choice-dolibarr noborderoncategories" style="background: #aaa">'.$param['options'][$valueval].'</li>';
6144
+                }
6145
+                $value='<div class="select2-container-multi-dolibarr" style="width: 90%;"><ul class="select2-choices-dolibarr">'.implode(' ', $toprint).'</ul></div>';
6146
+            }
6147
+        }
6148
+        elseif ($type == 'chkbxlst')
6149
+        {
6150
+            $value_arr = explode(',', $value);
6151
+
6152
+            $param_list = array_keys($param['options']);
6153
+            $InfoFieldList = explode(":", $param_list[0]);
6154
+
6155
+            $selectkey = "rowid";
6156
+            $keyList = 'rowid';
6157
+
6158
+            if (count($InfoFieldList) >= 3) {
6159
+                $selectkey = $InfoFieldList[2];
6160
+                $keyList = $InfoFieldList[2] . ' as rowid';
6161
+            }
6162
+
6163
+            $fields_label = explode('|', $InfoFieldList[1]);
6164
+            if (is_array($fields_label)) {
6165
+                $keyList .= ', ';
6166
+                $keyList .= implode(', ', $fields_label);
6167
+            }
6168
+
6169
+            $sql = 'SELECT ' . $keyList;
6170
+            $sql .= ' FROM ' . MAIN_DB_PREFIX . $InfoFieldList[0];
6171
+            if (strpos($InfoFieldList[4], 'extra') !== false) {
6172
+                $sql .= ' as main';
6173
+            }
6174
+            // $sql.= " WHERE ".$selectkey."='".$this->db->escape($value)."'";
6175
+            // $sql.= ' AND entity = '.$conf->entity;
6176
+
6177
+            dol_syslog(get_class($this) . ':showOutputField:$type=chkbxlst',LOG_DEBUG);
6178
+            $resql = $this->db->query($sql);
6179
+            if ($resql) {
6180
+                $value = ''; // value was used, so now we reste it to use it to build final output
6181
+                $toprint=array();
6182
+                while ( $obj = $this->db->fetch_object($resql) ) {
6183
+
6184
+                    // Several field into label (eq table:code|libelle:rowid)
6185
+                    $fields_label = explode('|', $InfoFieldList[1]);
6186
+                    if (is_array($value_arr) && in_array($obj->rowid, $value_arr)) {
6187
+                        if (is_array($fields_label) && count($fields_label) > 1) {
6188
+                            foreach ( $fields_label as $field_toshow ) {
6189
+                                $translabel = '';
6190
+                                if (! empty($obj->$field_toshow)) {
6191
+                                    $translabel = $langs->trans($obj->$field_toshow);
6192
+                                }
6193
+                                if ($translabel != $field_toshow) {
6194
+                                    $toprint[]='<li class="select2-search-choice-dolibarr noborderoncategories" style="background: #aaa">'.dol_trunc($translabel, 18).'</li>';
6195
+                                } else {
6196
+                                    $toprint[]='<li class="select2-search-choice-dolibarr noborderoncategories" style="background: #aaa">'.$obj->$field_toshow.'</li>';
6197
+                                }
6198
+                            }
6199
+                        } else {
6200
+                            $translabel = '';
6201
+                            if (! empty($obj->{$InfoFieldList[1]})) {
6202
+                                $translabel = $langs->trans($obj->{$InfoFieldList[1]});
6203
+                            }
6204
+                            if ($translabel != $obj->{$InfoFieldList[1]}) {
6205
+                                $toprint[]='<li class="select2-search-choice-dolibarr noborderoncategories" style="background: #aaa">'.dol_trunc($translabel, 18).'</li>';
6206
+                            } else {
6207
+                                $toprint[]='<li class="select2-search-choice-dolibarr noborderoncategories" style="background: #aaa">'.$obj->{$InfoFieldList[1]}.'</li>';
6208
+                            }
6209
+                        }
6210
+                    }
6211
+                }
6212
+                $value='<div class="select2-container-multi-dolibarr" style="width: 90%;"><ul class="select2-choices-dolibarr">'.implode(' ', $toprint).'</ul></div>';
6213
+            } else {
6214
+                dol_syslog(get_class($this) . '::showOutputField error ' . $this->db->lasterror(), LOG_WARNING);
6215
+            }
6216
+        }
6217
+        elseif ($type == 'link')
6218
+        {
6219
+            $out='';
6220
+
6221
+            // only if something to display (perf)
6222
+            if ($value)
6223
+            {
6224
+                $param_list=array_keys($param['options']);				// $param_list='ObjectName:classPath'
6225
+
6226
+                $InfoFieldList = explode(":", $param_list[0]);
6227
+                $classname=$InfoFieldList[0];
6228
+                $classpath=$InfoFieldList[1];
6229
+                $getnomurlparam=(empty($InfoFieldList[2]) ? 3 : $InfoFieldList[2]);
6230
+                if (! empty($classpath))
6231
+                {
6232
+                    dol_include_once($InfoFieldList[1]);
6233
+                    if ($classname && class_exists($classname))
6234
+                    {
6235
+                        $object = new $classname($this->db);
6236
+                        $object->fetch($value);
6237
+                        $value=$object->getNomUrl($getnomurlparam);
6238
+                    }
6239
+                }
6240
+                else
6241
+                {
6242
+                    dol_syslog('Error bad setup of extrafield', LOG_WARNING);
6243
+                    return 'Error bad setup of extrafield';
6244
+                }
6245
+            }
6246
+            else $value='';
6247
+        }
6248
+        elseif ($type == 'text' || $type == 'html')
6249
+        {
6250
+            $value=dol_htmlentitiesbr($value);
6251
+        }
6252
+        elseif ($type == 'password')
6253
+        {
6254
+            $value=preg_replace('/./i','*',$value);
6255
+        }
6256
+        elseif ($type == 'array')
6257
+        {
6258
+            $value = implode('<br>', $value);
6259
+        }
6260
+
6261
+        //print $type.'-'.$size;
6262
+        $out=$value;
6263
+
6264
+        return $out;
6265
+    }
6266
+
6267
+
6268
+    /**
6269
+     * Function to show lines of extrafields with output datas
6270
+     *
6271
+     * @param 	Extrafields $extrafields    Extrafield Object
6272
+     * @param 	string      $mode           Show output (view) or input (edit) for extrafield
6273
+     * @param 	array       $params         Optional parameters. Example: array('style'=>'class="oddeven"', 'colspan'=>$colspan)
6274
+     * @param 	string      $keysuffix      Suffix string to add after name and id of field (can be used to avoid duplicate names)
6275
+     * @param 	string      $keyprefix      Prefix string to add before name and id of field (can be used to avoid duplicate names)
6276
+     * @param	string		$onetrtd		All fields in same tr td
6277
+     * @return 	string
6278
+     */
6279
+    function showOptionals($extrafields, $mode='view', $params=null, $keysuffix='', $keyprefix='', $onetrtd=0)
6280
+    {
6281
+        global $db, $conf, $langs, $action, $form;
6282
+
6283
+        if (! is_object($form)) $form=new Form($db);
6284
+
6285
+        $out = '';
6286
+
6287
+        if (is_array($extrafields->attributes[$this->table_element]['label']) && count($extrafields->attributes[$this->table_element]['label']) > 0)
6288
+        {
6289
+            $out .= "\n";
6290
+            $out .= '<!-- showOptionalsInput --> ';
6291
+            $out .= "\n";
6292
+
6293
+            $e = 0;
6294
+            foreach($extrafields->attributes[$this->table_element]['label'] as $key=>$label)
6295
+            {
6296
+                // Show only the key field in params
6297
+                if (is_array($params) && array_key_exists('onlykey',$params) && $key != $params['onlykey']) continue;
6298
+
6299
+                $enabled = 1;
6300
+                if ($enabled && isset($extrafields->attributes[$this->table_element]['list'][$key]))
6301
+                {
6302
+                    $enabled = dol_eval($extrafields->attributes[$this->table_element]['list'][$key], 1);
6303
+                }
6304
+
6305
+                $perms = 1;
6306
+                if ($perms && isset($extrafields->attributes[$this->table_element]['perms'][$key]))
6307
+                {
6308
+                    $perms = dol_eval($extrafields->attributes[$this->table_element]['perms'][$key], 1);
6309
+                }
6310
+
6311
+                if (($mode == 'create' || $mode == 'edit') && abs($enabled) != 1 && abs($enabled) != 3) continue;	// <> -1 and <> 1 and <> 3 = not visible on forms, only on list
6312
+                if (empty($perms)) continue;
6313
+
6314
+                // Load language if required
6315
+                if (! empty($extrafields->attributes[$this->table_element]['langfile'][$key])) $langs->load($extrafields->attributes[$this->table_element]['langfile'][$key]);
6316
+
6317
+                $colspan='3';
6318
+                if (is_array($params) && count($params)>0) {
6319
+                    if (array_key_exists('colspan',$params)) {
6320
+                        $colspan=$params['colspan'];
6321
+                    }
6322
+                }
6323
+
6324
+                switch($mode) {
6325
+                    case "view":
6326
+                        $value=$this->array_options["options_".$key.$keysuffix];
6327
+                        break;
6328
+                    case "edit":
6329
+                        $getposttemp = GETPOST($keyprefix.'options_'.$key.$keysuffix, 'none');				// GETPOST can get value from GET, POST or setup of default values.
6330
+                        // GETPOST("options_" . $key) can be 'abc' or array(0=>'abc')
6331
+                        if (is_array($getposttemp) || $getposttemp != '' || GETPOSTISSET($keyprefix.'options_'.$key.$keysuffix))
6332
+                        {
6333
+                            if (is_array($getposttemp)) {
6334
+                                // $getposttemp is an array but following code expects a comma separated string
6335
+                                $value = implode(",", $getposttemp);
6336
+                            } else {
6337
+                                $value = $getposttemp;
6338
+                            }
6339
+                        } else {
6340
+                            $value = $this->array_options["options_" . $key];			// No GET, no POST, no default value, so we take value of object.
6341
+                        }
6342
+                        //var_dump($keyprefix.' - '.$key.' - '.$keysuffix.' - '.$keyprefix.'options_'.$key.$keysuffix.' - '.$this->array_options["options_".$key.$keysuffix].' - '.$getposttemp.' - '.$value);
6343
+                        break;
6344
+                }
6345
+
6346
+                if ($extrafields->attributes[$this->table_element]['type'][$key] == 'separate')
6347
+                {
6348
+                    $out .= $extrafields->showSeparator($key, $this);
6349
+                }
6350
+                else
6351
+                {
6352
+                    $csstyle='';
6353
+                    $class=(!empty($extrafields->attributes[$this->table_element]['hidden'][$key]) ? 'hideobject ' : '');
6354
+                    if (is_array($params) && count($params)>0) {
6355
+                        if (array_key_exists('style',$params)) {
6356
+                            $csstyle=$params['style'];
6357
+                        }
6358
+                    }
6359
+
6360
+                    // add html5 elements
6361
+                    $domData  = ' data-element="extrafield"';
6362
+                    $domData .= ' data-targetelement="'.$this->element.'"';
6363
+                    $domData .= ' data-targetid="'.$this->id.'"';
6364
+
6365
+                    $html_id = !empty($this->id) ? 'extrarow-'.$this->element.'_'.$key.'_'.$this->id : '';
6366
+
6367
+                    $out .= '<tr id="'.$html_id.'" '.$csstyle.' class="'.$class.$this->element.'_extras_'.$key.'" '.$domData.' >';
6368
+
6369
+                    if (! empty($conf->global->MAIN_EXTRAFIELDS_USE_TWO_COLUMS) && ($e % 2) == 0)
6370
+                    {
6371
+                        if (! empty($conf->global->MAIN_EXTRAFIELDS_USE_TWO_COLUMS) && ($e % 2) == 0) { $colspan='0'; }
6372
+                    }
6373
+
6374
+                    if ($action == 'selectlines') { $colspan++; }
6375
+
6376
+                    // Convert date into timestamp format (value in memory must be a timestamp)
6377
+                    if (in_array($extrafields->attributes[$this->table_element]['type'][$key],array('date','datetime')))
6378
+                    {
6379
+                        $datenotinstring = $this->array_options['options_' . $key];
6380
+                        if (! is_numeric($this->array_options['options_' . $key]))	// For backward compatibility
6381
+                        {
6382
+                            $datenotinstring = $this->db->jdate($datenotinstring);
6383
+                        }
6384
+                        $value = GETPOSTISSET($keyprefix.'options_'.$key.$keysuffix)?dol_mktime(GETPOST($keyprefix.'options_'.$key.$keysuffix."hour", 'int', 3), GETPOST($keyprefix.'options_'.$key.$keysuffix."min",'int',3), 0, GETPOST($keyprefix.'options_'.$key.$keysuffix."month",'int',3), GETPOST($keyprefix.'options_'.$key.$keysuffix."day",'int',3), GETPOST($keyprefix.'options_'.$key.$keysuffix."year",'int',3)):$datenotinstring;
6385
+                    }
6386
+                    // Convert float submited string into real php numeric (value in memory must be a php numeric)
6387
+                    if (in_array($extrafields->attributes[$this->table_element]['type'][$key],array('price','double')))
6388
+                    {
6389
+                        $value = GETPOSTISSET($keyprefix.'options_'.$key.$keysuffix)?price2num(GETPOST($keyprefix.'options_'.$key.$keysuffix, 'alpha', 3)):$this->array_options['options_'.$key];
6390
+                    }
6391
+
6392
+                    $labeltoshow = $langs->trans($label);
6393
+
6394
+                    $out .= '<td class="titlefield';
6395
+                    if (GETPOST('action','none') == 'create') $out.='create';
6396
+                    if ($mode != 'view' && ! empty($extrafields->attributes[$this->table_element]['required'][$key])) $out .= ' fieldrequired';
6397
+                    $out .= '">';
6398
+                    if (! empty($extrafields->attributes[$object->table_element]['help'][$key])) $out .= $form->textwithpicto($labeltoshow, $extrafields->attributes[$object->table_element]['help'][$key]);
6399
+                    else $out .= $labeltoshow;
6400
+                    $out .= '</td>';
6401
+
6402
+                    $html_id = !empty($this->id) ? $this->element.'_extras_'.$key.'_'.$this->id : '';
6403
+                    $out .='<td id="'.$html_id.'" class="'.$this->element.'_extras_'.$key.'" '.($colspan?' colspan="'.$colspan.'"':'').'>';
6404
+
6405
+                    switch($mode) {
6406
+                        case "view":
6407
+                            $out .= $extrafields->showOutputField($key, $value);
6408
+                            break;
6409
+                        case "edit":
6410
+                            $out .= $extrafields->showInputField($key, $value, '', $keysuffix, '', 0, $this->id);
6411
+                            break;
6412
+                    }
6413
+
6414
+                    $out .= '</td>';
6415
+
6416
+                    if (! empty($conf->global->MAIN_EXTRAFIELDS_USE_TWO_COLUMS) && (($e % 2) == 1)) $out .= '</tr>';
6417
+                    else $out .= '</tr>';
6418
+                    $e++;
6419
+                }
6420
+            }
6421
+            $out .= "\n";
6422
+            // Add code to manage list depending on others
6423
+            if (! empty($conf->use_javascript_ajax)) {
6424
+                $out .= '
6425
+				<script type="text/javascript">
6426
+				    jQuery(document).ready(function() {
6427
+				    	function showOptions(child_list, parent_list)
6428
+				    	{
6429
+				    		var val = $("select[name=\"options_"+parent_list+"\"]").val();
6430
+				    		var parentVal = parent_list + ":" + val;
6431
+							if(val > 0) {
6432
+					    		$("select[name=\""+child_list+"\"] option[parent]").hide();
6433
+					    		$("select[name=\""+child_list+"\"] option[parent=\""+parentVal+"\"]").show();
6434
+							} else {
6435
+								$("select[name=\""+child_list+"\"] option").show();
5647 6436
 							}
6437
+				    	}
6438
+						function setListDependencies() {
6439
+					    	jQuery("select option[parent]").parent().each(function() {
6440
+					    		var child_list = $(this).attr("name");
6441
+								var parent = $(this).find("option[parent]:first").attr("parent");
6442
+								var infos = parent.split(":");
6443
+								var parent_list = infos[0];
6444
+								$("select[name=\""+parent_list+"\"]").change(function() {
6445
+									showOptions(child_list, parent_list);
6446
+								});
6447
+					    	});
6448
+						}
5648 6449
 
5649
-							if (!empty($InfoFieldList[3]) && $parentField)
5650
-							{
5651
-								$parent = $parentName.':'.$obj->{$parentField};
5652
-							}
6450
+						setListDependencies();
6451
+				    });
6452
+				</script>'."\n";
6453
+                $out .= '<!-- /showOptionalsInput --> '."\n";
6454
+            }
6455
+        }
6456
+        return $out;
6457
+    }
5653 6458
 
5654
-							$out.='<option value="'.$obj->rowid.'"';
5655
-							$out.= ($value==$obj->rowid?' selected':'');
5656
-							$out.= (!empty($parent)?' parent="'.$parent.'"':'');
5657
-							$out.='>'.$labeltoshow.'</option>';
5658
-						}
5659 6459
 
5660
-						$i++;
5661
-					}
5662
-					$this->db->free($resql);
5663
-				}
5664
-				else {
5665
-					print 'Error in request '.$sql.' '.$this->db->lasterror().'. Check setup of extra parameters.<br>';
5666
-				}
5667
-			}
5668
-			$out.='</select>';
5669
-		}
5670
-		elseif ($type == 'checkbox')
5671
-		{
5672
-			$value_arr=explode(',',$value);
5673
-			$out=$form->multiselectarray($keyprefix.$key.$keysuffix, (empty($param['options'])?null:$param['options']), $value_arr, '', 0, '', 0, '100%');
5674
-		}
5675
-		elseif ($type == 'radio')
5676
-		{
5677
-			$out='';
5678
-			foreach ($param['options'] as $keyopt => $val)
5679
-			{
5680
-				$out.='<input class="flat '.$morecss.'" type="radio" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" '.($moreparam?$moreparam:'');
5681
-				$out.=' value="'.$keyopt.'"';
5682
-				$out.=' id="'.$keyprefix.$key.$keysuffix.'_'.$keyopt.'"';
5683
-				$out.= ($value==$keyopt?'checked':'');
5684
-				$out.='/><label for="'.$keyprefix.$key.$keysuffix.'_'.$keyopt.'">'.$val.'</label><br>';
5685
-			}
5686
-		}
5687
-		elseif ($type == 'chkbxlst')
5688
-		{
5689
-			if (is_array($value)) {
5690
-				$value_arr = $value;
5691
-			}
5692
-			else {
5693
-				$value_arr = explode(',', $value);
5694
-			}
5695
-
5696
-			if (is_array($param['options'])) {
5697
-				$param_list = array_keys($param['options']);
5698
-				$InfoFieldList = explode(":", $param_list[0]);
5699
-				$parentName='';
5700
-				$parentField='';
5701
-				// 0 : tableName
5702
-				// 1 : label field name
5703
-				// 2 : key fields name (if differ of rowid)
5704
-				// 3 : key field parent (for dependent lists)
5705
-				// 4 : where clause filter on column or table extrafield, syntax field='value' or extra.field=value
5706
-				$keyList = (empty($InfoFieldList[2]) ? 'rowid' : $InfoFieldList[2] . ' as rowid');
5707
-
5708
-				if (count($InfoFieldList) > 3 && ! empty($InfoFieldList[3])) {
5709
-					list ( $parentName, $parentField ) = explode('|', $InfoFieldList[3]);
5710
-					$keyList .= ', ' . $parentField;
5711
-				}
5712
-				if (count($InfoFieldList) > 4 && ! empty($InfoFieldList[4])) {
5713
-					if (strpos($InfoFieldList[4], 'extra.') !== false) {
5714
-						$keyList = 'main.' . $InfoFieldList[2] . ' as rowid';
5715
-					} else {
5716
-						$keyList = $InfoFieldList[2] . ' as rowid';
5717
-					}
5718
-				}
6460
+    /**
6461
+     * Returns the rights used for this class
6462
+     * @return stdClass
6463
+     */
6464
+    public function getRights()
6465
+    {
6466
+        global $user;
5719 6467
 
5720
-				$fields_label = explode('|', $InfoFieldList[1]);
5721
-				if (is_array($fields_label)) {
5722
-					$keyList .= ', ';
5723
-					$keyList .= implode(', ', $fields_label);
5724
-				}
6468
+        $element = $this->element;
6469
+        if ($element == 'facturerec') $element='facture';
5725 6470
 
5726
-				$sqlwhere = '';
5727
-				$sql = 'SELECT ' . $keyList;
5728
-				$sql .= ' FROM ' . MAIN_DB_PREFIX . $InfoFieldList[0];
5729
-				if (! empty($InfoFieldList[4])) {
5730
-
5731
-					// can use SELECT request
5732
-					if (strpos($InfoFieldList[4], '$SEL$')!==false) {
5733
-						$InfoFieldList[4]=str_replace('$SEL$','SELECT',$InfoFieldList[4]);
5734
-					}
5735
-
5736
-					// current object id can be use into filter
5737
-					if (strpos($InfoFieldList[4], '$ID$')!==false && !empty($objectid)) {
5738
-						$InfoFieldList[4]=str_replace('$ID$',$objectid,$InfoFieldList[4]);
5739
-					} else {
5740
-						$InfoFieldList[4]=str_replace('$ID$','0',$InfoFieldList[4]);
5741
-					}
5742
-
5743
-					// We have to join on extrafield table
5744
-					if (strpos($InfoFieldList[4], 'extra') !== false) {
5745
-						$sql .= ' as main, ' . MAIN_DB_PREFIX . $InfoFieldList[0] . '_extrafields as extra';
5746
-						$sqlwhere .= ' WHERE extra.fk_object=main.' . $InfoFieldList[2] . ' AND ' . $InfoFieldList[4];
5747
-					} else {
5748
-						$sqlwhere .= ' WHERE ' . $InfoFieldList[4];
5749
-					}
5750
-				} else {
5751
-					$sqlwhere .= ' WHERE 1=1';
5752
-				}
5753
-				// Some tables may have field, some other not. For the moment we disable it.
5754
-				if (in_array($InfoFieldList[0], array ('tablewithentity')))
5755
-				{
5756
-					$sqlwhere .= ' AND entity = ' . $conf->entity;
5757
-				}
5758
-				// $sql.=preg_replace('/^ AND /','',$sqlwhere);
5759
-				// print $sql;
5760
-
5761
-				$sql .= $sqlwhere;
5762
-				dol_syslog(get_class($this) . '::showInputField type=chkbxlst',LOG_DEBUG);
5763
-				$resql = $this->db->query($sql);
5764
-				if ($resql) {
5765
-					$num = $this->db->num_rows($resql);
5766
-					$i = 0;
5767
-
5768
-					$data=array();
5769
-
5770
-					while ( $i < $num ) {
5771
-						$labeltoshow = '';
5772
-						$obj = $this->db->fetch_object($resql);
5773
-
5774
-						$notrans = false;
5775
-						// Several field into label (eq table:code|libelle:rowid)
5776
-						$fields_label = explode('|', $InfoFieldList[1]);
5777
-						if (is_array($fields_label)) {
5778
-							$notrans = true;
5779
-							foreach ( $fields_label as $field_toshow ) {
5780
-								$labeltoshow .= $obj->$field_toshow . ' ';
5781
-							}
5782
-						} else {
5783
-							$labeltoshow = $obj->{$InfoFieldList[1]};
5784
-						}
5785
-						$labeltoshow = dol_trunc($labeltoshow, 45);
5786
-
5787
-						if (is_array($value_arr) && in_array($obj->rowid, $value_arr)) {
5788
-							foreach ( $fields_label as $field_toshow ) {
5789
-								$translabel = $langs->trans($obj->$field_toshow);
5790
-								if ($translabel != $obj->$field_toshow) {
5791
-									$labeltoshow = dol_trunc($translabel, 18) . ' ';
5792
-								} else {
5793
-									$labeltoshow = dol_trunc($obj->$field_toshow, 18) . ' ';
5794
-								}
5795
-							}
6471
+        return $user->rights->{$element};
6472
+    }
5796 6473
 
5797
-							$data[$obj->rowid]=$labeltoshow;
5798
-						} else {
5799
-							if (! $notrans) {
5800
-								$translabel = $langs->trans($obj->{$InfoFieldList[1]});
5801
-								if ($translabel != $obj->{$InfoFieldList[1]}) {
5802
-									$labeltoshow = dol_trunc($translabel, 18);
5803
-								} else {
5804
-									$labeltoshow = dol_trunc($obj->{$InfoFieldList[1]}, 18);
5805
-								}
5806
-							}
5807
-							if (empty($labeltoshow))
5808
-								$labeltoshow = '(not defined)';
6474
+    /**
6475
+     * Function used to replace a thirdparty id with another one.
6476
+     * This function is meant to be called from replaceThirdparty with the appropiate tables
6477
+     * Column name fk_soc MUST be used to identify thirdparties
6478
+     *
6479
+     * @param  DoliDB 	   $db 			  Database handler
6480
+     * @param  int 		   $origin_id     Old thirdparty id (the thirdparty to delete)
6481
+     * @param  int 		   $dest_id       New thirdparty id (the thirdparty that will received element of the other)
6482
+     * @param  string[]    $tables        Tables that need to be changed
6483
+     * @param  int         $ignoreerrors  Ignore errors. Return true even if errors. We need this when replacement can fails like for categories (categorie of old thirdparty may already exists on new one)
6484
+     * @return bool						  True if success, False if error
6485
+     */
6486
+    public static function commonReplaceThirdparty(DoliDB $db, $origin_id, $dest_id, array $tables, $ignoreerrors=0)
6487
+    {
6488
+        foreach ($tables as $table)
6489
+        {
6490
+            $sql = 'UPDATE '.MAIN_DB_PREFIX.$table.' SET fk_soc = '.$dest_id.' WHERE fk_soc = '.$origin_id;
5809 6491
 
5810
-								if (is_array($value_arr) && in_array($obj->rowid, $value_arr)) {
5811
-									$data[$obj->rowid]=$labeltoshow;
5812
-								}
6492
+            if (! $db->query($sql))
6493
+            {
6494
+                if ($ignoreerrors) return true;		// TODO Not enough. If there is A-B on kept thirdarty and B-C on old one, we must get A-B-C after merge. Not A-B.
6495
+                //$this->errors = $db->lasterror();
6496
+                return false;
6497
+            }
6498
+        }
5813 6499
 
5814
-								if (! empty($InfoFieldList[3]) && $parentField) {
5815
-									$parent = $parentName . ':' . $obj->{$parentField};
5816
-								}
6500
+        return true;
6501
+    }
5817 6502
 
5818
-								$data[$obj->rowid]=$labeltoshow;
5819
-						}
6503
+    /**
6504
+     * Get buy price to use for margin calculation. This function is called when buy price is unknown.
6505
+     *	 Set buy price = sell price if ForceBuyingPriceIfNull configured,
6506
+     *   else if calculation MARGIN_TYPE = 'costprice' and costprice is defined, use costprice as buyprice
6507
+     *	 else if calculation MARGIN_TYPE = 'pmp' and pmp is calculated, use pmp as buyprice
6508
+     *	 else set min buy price as buy price
6509
+     *
6510
+     * @param float		$unitPrice		 Product unit price
6511
+     * @param float		$discountPercent Line discount percent
6512
+     * @param int		$fk_product		 Product id
6513
+     * @return	float                    <0 if KO, buyprice if OK
6514
+     */
6515
+    public function defineBuyPrice($unitPrice = 0.0, $discountPercent = 0.0, $fk_product = 0)
6516
+    {
6517
+        global $conf;
5820 6518
 
5821
-						$i ++;
5822
-					}
5823
-					$this->db->free($resql);
6519
+        $buyPrice = 0;
5824 6520
 
5825
-					$out=$form->multiselectarray($keyprefix.$key.$keysuffix, $data, $value_arr, '', 0, '', 0, '100%');
5826
-				} else {
5827
-					print 'Error in request ' . $sql . ' ' . $this->db->lasterror() . '. Check setup of extra parameters.<br>';
5828
-				}
5829
-			}
5830
-		}
5831
-		elseif ($type == 'link')
5832
-		{
5833
-			$param_list=array_keys($param['options']);				// $param_list='ObjectName:classPath'
5834
-			$showempty=(($required && $default != '')?0:1);
5835
-			$out=$form->selectForForms($param_list[0], $keyprefix.$key.$keysuffix, $value, $showempty);
5836
-			if ($conf->global->MAIN_FEATURES_LEVEL >= 2)
5837
-			{
5838
-            			list($class,$classfile)=explode(':',$param_list[0]);
5839
-            			if (file_exists(dol_buildpath(dirname(dirname($classfile)).'/card.php'))) $url_path=dol_buildpath(dirname(dirname($classfile)).'/card.php',1);
5840
-            			else $url_path=dol_buildpath(dirname(dirname($classfile)).'/'.$class.'_card.php',1);
5841
-            			$out.='<a class="butActionNew" href="'.$url_path.'?action=create&backtopage='.$_SERVER['PHP_SELF'].'"><span class="fa fa-plus-circle valignmiddle"></span></a>';
5842
-            			// TODO Add Javascript code to add input fields contents to new elements urls
5843
-			}
5844
-		}
5845
-		elseif ($type == 'password')
5846
-		{
5847
-			// If prefix is 'search_', field is used as a filter, we use a common text field.
5848
-			$out='<input type="'.($keyprefix=='search_'?'text':'password').'" class="flat '.$morecss.'" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" value="'.$value.'" '.($moreparam?$moreparam:'').'>';
5849
-		}
5850
-		elseif ($type == 'array')
5851
-		{
5852
-			$newval = $val;
5853
-			$newval['type'] = 'varchar(256)';
5854
-
5855
-			$out='';
5856
-
5857
-			$inputs = array();
5858
-			if(! empty($value)) {
5859
-				foreach($value as $option) {
5860
-					$out.= '<span><a class="'.dol_escape_htmltag($keyprefix.$key.$keysuffix).'_del" href="javascript:;"><span class="fa fa-minus-circle valignmiddle"></span></a> ';
5861
-					$out.= $this->showInputField($newval, $keyprefix.$key.$keysuffix.'[]', $option, $moreparam, '', '', $showsize).'<br></span>';
5862
-				}
5863
-			}
6521
+        if (($unitPrice > 0) && (isset($conf->global->ForceBuyingPriceIfNull) && $conf->global->ForceBuyingPriceIfNull == 1)) // In most cases, test here is false
6522
+        {
6523
+            $buyPrice = $unitPrice * (1 - $discountPercent / 100);
6524
+        }
6525
+        else
6526
+        {
6527
+            // Get cost price for margin calculation
6528
+            if (! empty($fk_product))
6529
+            {
6530
+                if (isset($conf->global->MARGIN_TYPE) && $conf->global->MARGIN_TYPE == 'costprice')
6531
+                {
6532
+                    require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
6533
+                    $product = new Product($this->db);
6534
+                    $result = $product->fetch($fk_product);
6535
+                    if ($result <= 0)
6536
+                    {
6537
+                        $this->errors[] = 'ErrorProductIdDoesNotExists';
6538
+                        return -1;
6539
+                    }
6540
+                    if ($product->cost_price > 0)
6541
+                    {
6542
+                        $buyPrice = $product->cost_price;
6543
+                    }
6544
+                    else if ($product->pmp > 0)
6545
+                    {
6546
+                        $buyPrice = $product->pmp;
6547
+                    }
6548
+                }
6549
+                else if (isset($conf->global->MARGIN_TYPE) && $conf->global->MARGIN_TYPE == 'pmp')
6550
+                {
6551
+                    require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
6552
+                    $product = new Product($this->db);
6553
+                    $result = $product->fetch($fk_product);
6554
+                    if ($result <= 0)
6555
+                    {
6556
+                        $this->errors[] = 'ErrorProductIdDoesNotExists';
6557
+                        return -1;
6558
+                    }
6559
+                    if ($product->pmp > 0)
6560
+                    {
6561
+                        $buyPrice = $product->pmp;
6562
+                    }
6563
+                }
6564
+
6565
+                if (empty($buyPrice) && isset($conf->global->MARGIN_TYPE) && in_array($conf->global->MARGIN_TYPE, array('1','pmp','costprice')))
6566
+                {
6567
+                    require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.product.class.php';
6568
+                    $productFournisseur = new ProductFournisseur($this->db);
6569
+                    if (($result = $productFournisseur->find_min_price_product_fournisseur($fk_product)) > 0)
6570
+                    {
6571
+                        $buyPrice = $productFournisseur->fourn_unitprice;
6572
+                    }
6573
+                    else if ($result < 0)
6574
+                    {
6575
+                        $this->errors[] = $productFournisseur->error;
6576
+                        return -2;
6577
+                    }
6578
+                }
6579
+            }
6580
+        }
6581
+        return $buyPrice;
6582
+    }
5864 6583
 
5865
-			$out.= '<a id="'.dol_escape_htmltag($keyprefix.$key.$keysuffix).'_add" href="javascript:;"><span class="fa fa-plus-circle valignmiddle"></span></a>';
6584
+    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
6585
+    /**
6586
+     *  Show photos of an object (nbmax maximum), into several columns
6587
+     *
6588
+     *  @param		string	$modulepart		'product', 'ticket', ...
6589
+     *  @param      string	$sdir        	Directory to scan (full absolute path)
6590
+     *  @param      int		$size        	0=original size, 1='small' use thumbnail if possible
6591
+     *  @param      int		$nbmax       	Nombre maximum de photos (0=pas de max)
6592
+     *  @param      int		$nbbyrow     	Number of image per line or -1 to use div. Used only if size=1.
6593
+     * 	@param		int		$showfilename	1=Show filename
6594
+     * 	@param		int		$showaction		1=Show icon with action links (resize, delete)
6595
+     * 	@param		int		$maxHeight		Max height of original image when size='small' (so we can use original even if small requested). If 0, always use 'small' thumb image.
6596
+     * 	@param		int		$maxWidth		Max width of original image when size='small'
6597
+     *  @param      int     $nolink         Do not add a href link to view enlarged imaged into a new tab
6598
+     *  @param      int     $notitle        Do not add title tag on image
6599
+     *  @param		int		$usesharelink	Use the public shared link of image (if not available, the 'nophoto' image will be shown instead)
6600
+     *  @return     string					Html code to show photo. Number of photos shown is saved in this->nbphoto
6601
+     */
6602
+    function show_photos($modulepart, $sdir, $size=0, $nbmax=0, $nbbyrow=5, $showfilename=0, $showaction=0, $maxHeight=120, $maxWidth=160, $nolink=0, $notitle=0, $usesharelink=0)
6603
+    {
6604
+        // phpcs:enable
6605
+        global $conf,$user,$langs;
5866 6606
 
5867
-			$newInput = '<span><a class="'.dol_escape_htmltag($keyprefix.$key.$keysuffix).'_del" href="javascript:;"><span class="fa fa-minus-circle valignmiddle"></span></a> ';
5868
-			$newInput.= $this->showInputField($newval, $keyprefix.$key.$keysuffix.'[]', '', $moreparam, '', '', $showsize).'<br></span>';
6607
+        include_once DOL_DOCUMENT_ROOT .'/core/lib/files.lib.php';
6608
+        include_once DOL_DOCUMENT_ROOT .'/core/lib/images.lib.php';
5869 6609
 
5870
-			if(! empty($conf->use_javascript_ajax)) {
5871
-				$out.= '
5872
-					<script type="text/javascript">
5873
-					$(document).ready(function() {
5874
-						$("a#'.dol_escape_js($keyprefix.$key.$keysuffix).'_add").click(function() {
5875
-							$("'.dol_escape_js($newInput).'").insertBefore(this);
5876
-						});
6610
+        $sortfield='position_name';
6611
+        $sortorder='asc';
5877 6612
 
5878
-						$(document).on("click", "a.'.dol_escape_js($keyprefix.$key.$keysuffix).'_del", function() {
5879
-							$(this).parent().remove();
5880
-						});
5881
-					});
5882
-					</script>';
5883
-			}
5884
-		}
5885
-		if (!empty($hidden)) {
5886
-			$out='<input type="hidden" value="'.$value.'" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'"/>';
5887
-		}
5888
-		/* Add comments
5889
-		 if ($type == 'date') $out.=' (YYYY-MM-DD)';
5890
-		 elseif ($type == 'datetime') $out.=' (YYYY-MM-DD HH:MM:SS)';
5891
-		 */
5892
-		return $out;
5893
-	}
5894
-
5895
-	/**
5896
-	 * Return HTML string to show a field into a page
5897
-	 * Code very similar with showOutputField of extra fields
5898
-	 *
5899
-	 * @param  array   $val		       Array of properties of field to show
5900
-	 * @param  string  $key            Key of attribute
5901
-	 * @param  string  $value          Preselected value to show (for date type it must be in timestamp format, for amount or price it must be a php numeric value)
5902
-	 * @param  string  $moreparam      To add more parametes on html input tag
5903
-	 * @param  string  $keysuffix      Prefix string to add into name and id of field (can be used to avoid duplicate names)
5904
-	 * @param  string  $keyprefix      Suffix string to add into name and id of field (can be used to avoid duplicate names)
5905
-	 * @param  mixed   $showsize       Value for css to define size. May also be a numeric.
5906
-	 * @return string
5907
-	 */
5908
-	function showOutputField($val, $key, $value, $moreparam='', $keysuffix='', $keyprefix='', $showsize=0)
5909
-	{
5910
-		global $conf,$langs,$form;
5911
-
5912
-		if (! is_object($form))
5913
-		{
5914
-			require_once DOL_DOCUMENT_ROOT.'/core/class/html.form.class.php';
5915
-			$form=new Form($this->db);
5916
-		}
5917
-
5918
-		$objectid = $this->id;
5919
-		$label = $val['label'];
5920
-		$type  = $val['type'];
5921
-		$size  = $val['css'];
5922
-
5923
-		// Convert var to be able to share same code than showOutputField of extrafields
5924
-		if (preg_match('/varchar\((\d+)\)/', $type, $reg))
5925
-		{
5926
-			$type = 'varchar';		// convert varchar(xx) int varchar
5927
-			$size = $reg[1];
5928
-		}
5929
-		elseif (preg_match('/varchar/', $type)) $type = 'varchar';		// convert varchar(xx) int varchar
5930
-		if (is_array($val['arrayofkeyval'])) $type='select';
5931
-		if (preg_match('/^integer:(.*):(.*)/i', $val['type'], $reg)) $type='link';
5932
-
5933
-		$default=$val['default'];
5934
-		$computed=$val['computed'];
5935
-		$unique=$val['unique'];
5936
-		$required=$val['required'];
5937
-		$param=$val['param'];
5938
-		if (is_array($val['arrayofkeyval'])) $param['options'] = $val['arrayofkeyval'];
5939
-		if (preg_match('/^integer:(.*):(.*)/i', $val['type'], $reg))
5940
-		{
5941
-			$type='link';
5942
-			$param['options']=array($reg[1].':'.$reg[2]=>$reg[1].':'.$reg[2]);
5943
-		}
5944
-		$langfile=$val['langfile'];
5945
-		$list=$val['list'];
5946
-		$help=$val['help'];
5947
-		$hidden=(($val['visible'] == 0) ? 1 : 0);			// If zero, we are sure it is hidden, otherwise we show. If it depends on mode (view/create/edit form or list, this must be filtered by caller)
5948
-
5949
-		if ($hidden) return '';
5950
-
5951
-		// If field is a computed field, value must become result of compute
5952
-		if ($computed)
5953
-		{
5954
-			// Make the eval of compute string
5955
-			//var_dump($computed);
5956
-			$value = dol_eval($computed, 1, 0);
5957
-		}
5958
-
5959
-		if (empty($showsize))
5960
-		{
5961
-			if ($type == 'date')
5962
-			{
5963
-				//$showsize=10;
5964
-				$showsize = 'minwidth100imp';
5965
-			}
5966
-			elseif ($type == 'datetime')
5967
-			{
5968
-				//$showsize=19;
5969
-				$showsize = 'minwidth200imp';
5970
-			}
5971
-			elseif (in_array($type,array('int','double','price')))
5972
-			{
5973
-				//$showsize=10;
5974
-				$showsize = 'maxwidth75';
5975
-			}
5976
-			elseif ($type == 'url')
5977
-			{
5978
-				$showsize='minwidth400';
5979
-			}
5980
-			elseif ($type == 'boolean')
5981
-			{
5982
-				$showsize='';
5983
-			}
5984
-			else
5985
-			{
5986
-				if (round($size) < 12)
5987
-				{
5988
-					$showsize = 'minwidth100';
5989
-				}
5990
-				else if (round($size) <= 48)
5991
-				{
5992
-					$showsize = 'minwidth200';
5993
-				}
5994
-				else
5995
-				{
5996
-					//$showsize=48;
5997
-					$showsize = 'minwidth400';
5998
-				}
5999
-			}
6000
-		}
6001
-
6002
-		// Format output value differently according to properties of field
6003
-		if ($key == 'ref' && method_exists($this, 'getNomUrl')) $value=$this->getNomUrl(1, '', 0, '', 1);
6004
-		elseif ($key == 'status' && method_exists($this, 'getLibStatut')) $value=$this->getLibStatut(3);
6005
-		elseif ($type == 'date')
6006
-		{
6007
-			if(! empty($value)) {
6008
-				$value=dol_print_date($value,'day');
6009
-			} else {
6010
-				$value='';
6011
-			}
6012
-		}
6013
-		elseif ($type == 'datetime')
6014
-		{
6015
-			if(! empty($value)) {
6016
-				$value=dol_print_date($value,'dayhour');
6017
-			} else {
6018
-				$value='';
6019
-			}
6020
-		}
6021
-		elseif ($type == 'double')
6022
-		{
6023
-			if (!empty($value)) {
6024
-				$value=price($value);
6025
-			}
6026
-		}
6027
-		elseif ($type == 'boolean')
6028
-		{
6029
-			$checked='';
6030
-			if (!empty($value)) {
6031
-				$checked=' checked ';
6032
-			}
6033
-			$value='<input type="checkbox" '.$checked.' '.($moreparam?$moreparam:'').' readonly disabled>';
6034
-		}
6035
-		elseif ($type == 'mail')
6036
-		{
6037
-			$value=dol_print_email($value,0,0,0,64,1,1);
6038
-		}
6039
-		elseif ($type == 'url')
6040
-		{
6041
-			$value=dol_print_url($value,'_blank',32,1);
6042
-		}
6043
-		elseif ($type == 'phone')
6044
-		{
6045
-			$value=dol_print_phone($value, '', 0, 0, '', '&nbsp;', 1);
6046
-		}
6047
-		elseif ($type == 'price')
6048
-		{
6049
-			$value=price($value,0,$langs,0,0,-1,$conf->currency);
6050
-		}
6051
-		elseif ($type == 'select')
6052
-		{
6053
-			$value=$param['options'][$value];
6054
-		}
6055
-		elseif ($type == 'sellist')
6056
-		{
6057
-			$param_list=array_keys($param['options']);
6058
-			$InfoFieldList = explode(":", $param_list[0]);
6059
-
6060
-			$selectkey="rowid";
6061
-			$keyList='rowid';
6062
-
6063
-			if (count($InfoFieldList)>=3)
6064
-			{
6065
-				$selectkey = $InfoFieldList[2];
6066
-				$keyList=$InfoFieldList[2].' as rowid';
6067
-			}
6068
-
6069
-			$fields_label = explode('|',$InfoFieldList[1]);
6070
-			if(is_array($fields_label)) {
6071
-				$keyList .=', ';
6072
-				$keyList .= implode(', ', $fields_label);
6073
-			}
6074
-
6075
-			$sql = 'SELECT '.$keyList;
6076
-			$sql.= ' FROM '.MAIN_DB_PREFIX .$InfoFieldList[0];
6077
-			if (strpos($InfoFieldList[4], 'extra')!==false)
6078
-			{
6079
-				$sql.= ' as main';
6080
-			}
6081
-			if ($selectkey=='rowid' && empty($value)) {
6082
-				$sql.= " WHERE ".$selectkey."=0";
6083
-			} elseif ($selectkey=='rowid') {
6084
-				$sql.= " WHERE ".$selectkey."=".$this->db->escape($value);
6085
-			}else {
6086
-				$sql.= " WHERE ".$selectkey."='".$this->db->escape($value)."'";
6087
-			}
6088
-
6089
-			//$sql.= ' AND entity = '.$conf->entity;
6090
-
6091
-			dol_syslog(get_class($this).':showOutputField:$type=sellist', LOG_DEBUG);
6092
-			$resql = $this->db->query($sql);
6093
-			if ($resql)
6094
-			{
6095
-				$value='';	// value was used, so now we reste it to use it to build final output
6613
+        $dir = $sdir . '/';
6614
+        $pdir = '/';
6615
+        if ($modulepart == 'ticket')
6616
+        {
6617
+            $dir .= get_exdir(0, 0, 0, 0, $this, $modulepart).$this->track_id.'/';
6618
+            $pdir .= get_exdir(0, 0, 0, 0, $this, $modulepart).$this->track_id.'/';
6619
+        }
6620
+        else
6621
+        {
6622
+            $dir .= get_exdir(0, 0, 0, 0, $this, $modulepart).$this->ref.'/';
6623
+            $pdir .= get_exdir(0, 0, 0, 0, $this, $modulepart).$this->ref.'/';
6624
+        }
6625
+
6626
+        // For backward compatibility
6627
+        if ($modulepart == 'product' && ! empty($conf->global->PRODUCT_USE_OLD_PATH_FOR_PHOTO))
6628
+        {
6629
+            $dir = $sdir . '/'. get_exdir($this->id,2,0,0,$this,$modulepart) . $this->id ."/photos/";
6630
+            $pdir = '/' . get_exdir($this->id,2,0,0,$this,$modulepart) . $this->id ."/photos/";
6631
+        }
6632
+
6633
+        // Defined relative dir to DOL_DATA_ROOT
6634
+        $relativedir = '';
6635
+        if ($dir)
6636
+        {
6637
+            $relativedir = preg_replace('/^'.preg_quote(DOL_DATA_ROOT,'/').'/', '', $dir);
6638
+            $relativedir = preg_replace('/^[\\/]/','',$relativedir);
6639
+            $relativedir = preg_replace('/[\\/]$/','',$relativedir);
6640
+        }
6641
+
6642
+        $dirthumb = $dir.'thumbs/';
6643
+        $pdirthumb = $pdir.'thumbs/';
6644
+
6645
+        $return ='<!-- Photo -->'."\n";
6646
+        $nbphoto=0;
6647
+
6648
+        $filearray=dol_dir_list($dir,"files",0,'','(\.meta|_preview.*\.png)$',$sortfield,(strtolower($sortorder)=='desc'?SORT_DESC:SORT_ASC),1);
6649
+
6650
+        /*if (! empty($conf->global->PRODUCT_USE_OLD_PATH_FOR_PHOTO))    // For backward compatiblity, we scan also old dirs
6651
+		 {
6652
+		 $filearrayold=dol_dir_list($dirold,"files",0,'','(\.meta|_preview.*\.png)$',$sortfield,(strtolower($sortorder)=='desc'?SORT_DESC:SORT_ASC),1);
6653
+		 $filearray=array_merge($filearray, $filearrayold);
6654
+		 }*/
6655
+
6656
+        completeFileArrayWithDatabaseInfo($filearray, $relativedir);
6657
+
6658
+        if (count($filearray))
6659
+        {
6660
+            if ($sortfield && $sortorder)
6661
+            {
6662
+                $filearray=dol_sort_array($filearray, $sortfield, $sortorder);
6663
+            }
6664
+
6665
+            foreach($filearray as $key => $val)
6666
+            {
6667
+                $photo='';
6668
+                $file = $val['name'];
6669
+
6670
+                //if (! utf8_check($file)) $file=utf8_encode($file);	// To be sure file is stored in UTF8 in memory
6671
+
6672
+                //if (dol_is_file($dir.$file) && image_format_supported($file) >= 0)
6673
+                if (image_format_supported($file) >= 0)
6674
+                {
6675
+                    $nbphoto++;
6676
+                    $photo = $file;
6677
+                    $viewfilename = $file;
6678
+
6679
+                    if ($size == 1 || $size == 'small') {   // Format vignette
6680
+
6681
+                        // Find name of thumb file
6682
+                        $photo_vignette=basename(getImageFileNameForSize($dir.$file, '_small'));
6683
+                        if (! dol_is_file($dirthumb.$photo_vignette)) $photo_vignette='';
6684
+
6685
+                        // Get filesize of original file
6686
+                        $imgarray=dol_getImageSize($dir.$photo);
6687
+
6688
+                        if ($nbbyrow > 0)
6689
+                        {
6690
+                            if ($nbphoto == 1) $return.= '<table width="100%" valign="top" align="center" border="0" cellpadding="2" cellspacing="2">';
6691
+
6692
+                            if ($nbphoto % $nbbyrow == 1) $return.= '<tr align=center valign=middle border=1>';
6693
+                            $return.= '<td width="'.ceil(100/$nbbyrow).'%" class="photo">';
6694
+                        }
6695
+                        else if ($nbbyrow < 0) $return .= '<div class="inline-block">';
6696
+
6697
+                        $return.= "\n";
6698
+
6699
+                        $relativefile=preg_replace('/^\//', '', $pdir.$photo);
6700
+                        if (empty($nolink))
6701
+                        {
6702
+                            $urladvanced=getAdvancedPreviewUrl($modulepart, $relativefile, 0, 'entity='.$this->entity);
6703
+                            if ($urladvanced) $return.='<a href="'.$urladvanced.'">';
6704
+                            else $return.= '<a href="'.DOL_URL_ROOT.'/viewimage.php?modulepart='.$modulepart.'&entity='.$this->entity.'&file='.urlencode($pdir.$photo).'" class="aphoto" target="_blank">';
6705
+                        }
6706
+
6707
+                        // Show image (width height=$maxHeight)
6708
+                        // Si fichier vignette disponible et image source trop grande, on utilise la vignette, sinon on utilise photo origine
6709
+                        $alt=$langs->transnoentitiesnoconv('File').': '.$relativefile;
6710
+                        $alt.=' - '.$langs->transnoentitiesnoconv('Size').': '.$imgarray['width'].'x'.$imgarray['height'];
6711
+                        if ($notitle) $alt='';
6712
+
6713
+                        if ($usesharelink)
6714
+                        {
6715
+                            if ($val['share'])
6716
+                            {
6717
+                                if (empty($maxHeight) || $photo_vignette && $imgarray['height'] > $maxHeight)
6718
+                                {
6719
+                                    $return.= '<!-- Show original file (thumb not yet available with shared links) -->';
6720
+                                    $return.= '<img class="photo photowithmargin" border="0" height="'.$maxHeight.'" src="'.DOL_URL_ROOT.'/viewimage.php?hashp='.urlencode($val['share']).'" title="'.dol_escape_htmltag($alt).'">';
6721
+                                }
6722
+                                else {
6723
+                                    $return.= '<!-- Show original file -->';
6724
+                                    $return.= '<img class="photo photowithmargin" border="0" height="'.$maxHeight.'" src="'.DOL_URL_ROOT.'/viewimage.php?hashp='.urlencode($val['share']).'" title="'.dol_escape_htmltag($alt).'">';
6725
+                                }
6726
+                            }
6727
+                            else
6728
+                            {
6729
+                                $return.= '<!-- Show nophoto file (because file is not shared) -->';
6730
+                                $return.= '<img class="photo photowithmargin" border="0" height="'.$maxHeight.'" src="'.DOL_URL_ROOT.'/public/theme/common/nophoto.png" title="'.dol_escape_htmltag($alt).'">';
6731
+                            }
6732
+                        }
6733
+                        else
6734
+                        {
6735
+                            if (empty($maxHeight) || $photo_vignette && $imgarray['height'] > $maxHeight)
6736
+                            {
6737
+                                $return.= '<!-- Show thumb -->';
6738
+                                $return.= '<img class="photo photowithmargin" border="0" height="'.$maxHeight.'" src="'.DOL_URL_ROOT.'/viewimage.php?modulepart='.$modulepart.'&entity='.$this->entity.'&file='.urlencode($pdirthumb.$photo_vignette).'" title="'.dol_escape_htmltag($alt).'">';
6739
+                            }
6740
+                            else {
6741
+                                $return.= '<!-- Show original file -->';
6742
+                                $return.= '<img class="photo photowithmargin" border="0" height="'.$maxHeight.'" src="'.DOL_URL_ROOT.'/viewimage.php?modulepart='.$modulepart.'&entity='.$this->entity.'&file='.urlencode($pdir.$photo).'" title="'.dol_escape_htmltag($alt).'">';
6743
+                            }
6744
+                        }
6745
+
6746
+                        if (empty($nolink)) $return.= '</a>';
6747
+                        $return.="\n";
6748
+
6749
+                        if ($showfilename) $return.= '<br>'.$viewfilename;
6750
+                        if ($showaction)
6751
+                        {
6752
+                            $return.= '<br>';
6753
+                            // On propose la generation de la vignette si elle n'existe pas et si la taille est superieure aux limites
6754
+                            if ($photo_vignette && (image_format_supported($photo) > 0) && ($this->imgWidth > $maxWidth || $this->imgHeight > $maxHeight))
6755
+                            {
6756
+                                $return.= '<a href="'.$_SERVER["PHP_SELF"].'?id='.$this->id.'&amp;action=addthumb&amp;file='.urlencode($pdir.$viewfilename).'">'.img_picto($langs->trans('GenerateThumb'),'refresh').'&nbsp;&nbsp;</a>';
6757
+                            }
6758
+                            // Special cas for product
6759
+                            if ($modulepart == 'product' && ($user->rights->produit->creer || $user->rights->service->creer))
6760
+                            {
6761
+                                // Link to resize
6762
+                                $return.= '<a href="'.DOL_URL_ROOT.'/core/photos_resize.php?modulepart='.urlencode('produit|service').'&id='.$this->id.'&amp;file='.urlencode($pdir.$viewfilename).'" title="'.dol_escape_htmltag($langs->trans("Resize")).'">'.img_picto($langs->trans("Resize"), 'resize', '').'</a> &nbsp; ';
6763
+
6764
+                                // Link to delete
6765
+                                $return.= '<a href="'.$_SERVER["PHP_SELF"].'?id='.$this->id.'&amp;action=delete&amp;file='.urlencode($pdir.$viewfilename).'">';
6766
+                                $return.= img_delete().'</a>';
6767
+                            }
6768
+                        }
6769
+                        $return.= "\n";
6770
+
6771
+                        if ($nbbyrow > 0)
6772
+                        {
6773
+                            $return.= '</td>';
6774
+                            if (($nbphoto % $nbbyrow) == 0) $return.= '</tr>';
6775
+                        }
6776
+                        else if ($nbbyrow < 0) $return.='</div>';
6777
+                    }
6778
+
6779
+                    if (empty($size)) {     // Format origine
6780
+                        $return.= '<img class="photo photowithmargin" border="0" src="'.DOL_URL_ROOT.'/viewimage.php?modulepart='.$modulepart.'&entity='.$this->entity.'&file='.urlencode($pdir.$photo).'">';
6781
+
6782
+                        if ($showfilename) $return.= '<br>'.$viewfilename;
6783
+                        if ($showaction)
6784
+                        {
6785
+                            // Special case for product
6786
+                            if ($modulepart == 'product' && ($user->rights->produit->creer || $user->rights->service->creer))
6787
+                            {
6788
+                                // Link to resize
6789
+                                $return.= '<a href="'.DOL_URL_ROOT.'/core/photos_resize.php?modulepart='.urlencode('produit|service').'&id='.$this->id.'&amp;file='.urlencode($pdir.$viewfilename).'" title="'.dol_escape_htmltag($langs->trans("Resize")).'">'.img_picto($langs->trans("Resize"), 'resize', '').'</a> &nbsp; ';
6790
+
6791
+                                // Link to delete
6792
+                                $return.= '<a href="'.$_SERVER["PHP_SELF"].'?id='.$this->id.'&amp;action=delete&amp;file='.urlencode($pdir.$viewfilename).'">';
6793
+                                $return.= img_delete().'</a>';
6794
+                            }
6795
+                        }
6796
+                    }
6797
+
6798
+                    // On continue ou on arrete de boucler ?
6799
+                    if ($nbmax && $nbphoto >= $nbmax) break;
6800
+                }
6801
+            }
6802
+
6803
+            if ($size==1 || $size=='small')
6804
+            {
6805
+                if ($nbbyrow > 0)
6806
+                {
6807
+                    // Ferme tableau
6808
+                    while ($nbphoto % $nbbyrow)
6809
+                    {
6810
+                        $return.= '<td width="'.ceil(100/$nbbyrow).'%">&nbsp;</td>';
6811
+                        $nbphoto++;
6812
+                    }
6813
+
6814
+                    if ($nbphoto) $return.= '</table>';
6815
+                }
6816
+            }
6817
+        }
6818
+
6819
+        $this->nbphoto = $nbphoto;
6820
+
6821
+        return $return;
6822
+    }
6823
+
6824
+
6825
+    /**
6826
+     * Function test if type is array
6827
+     *
6828
+     * @param   array   $info   content informations of field
6829
+     * @return                  bool
6830
+     */
6831
+    protected function isArray($info)
6832
+    {
6833
+        if(is_array($info))
6834
+        {
6835
+            if(isset($info['type']) && $info['type']=='array') return true;
6836
+            else return false;
6837
+        }
6838
+        else return false;
6839
+    }
6840
+
6841
+    /**
6842
+     * Function test if type is null
6843
+     *
6844
+     * @param   array   $info   content informations of field
6845
+     * @return                  bool
6846
+     */
6847
+    protected function isNull($info)
6848
+    {
6849
+        if(is_array($info))
6850
+        {
6851
+            if(isset($info['type']) && $info['type']=='null') return true;
6852
+            else return false;
6853
+        }
6854
+        else return false;
6855
+    }
6856
+
6857
+    /**
6858
+     * Function test if type is date
6859
+     *
6860
+     * @param   array   $info   content informations of field
6861
+     * @return                  bool
6862
+     */
6863
+    public function isDate($info)
6864
+    {
6865
+        if(isset($info['type']) && ($info['type']=='date' || $info['type']=='datetime' || $info['type']=='timestamp')) return true;
6866
+        else return false;
6867
+    }
6868
+
6869
+    /**
6870
+     * Function test if type is integer
6871
+     *
6872
+     * @param   array   $info   content informations of field
6873
+     * @return                  bool
6874
+     */
6875
+    public function isInt($info)
6876
+    {
6877
+        if(is_array($info))
6878
+        {
6879
+            if(isset($info['type']) && ($info['type']=='int' || preg_match('/^integer/i',$info['type']) ) ) return true;
6880
+            else return false;
6881
+        }
6882
+        else return false;
6883
+    }
6884
+
6885
+    /**
6886
+     * Function test if type is float
6887
+     *
6888
+     * @param   array   $info   content informations of field
6889
+     * @return                  bool
6890
+     */
6891
+    public function isFloat($info)
6892
+    {
6893
+        if(is_array($info))
6894
+        {
6895
+            if (isset($info['type']) && (preg_match('/^(double|real)/i', $info['type']))) return true;
6896
+            else return false;
6897
+        }
6898
+        else return false;
6899
+    }
6900
+
6901
+    /**
6902
+     * Function test if type is text
6903
+     *
6904
+     * @param   array   $info   content informations of field
6905
+     * @return                  bool
6906
+     */
6907
+    public function isText($info)
6908
+    {
6909
+        if(is_array($info))
6910
+        {
6911
+            if(isset($info['type']) && $info['type']=='text') return true;
6912
+            else return false;
6913
+        }
6914
+        else return false;
6915
+    }
6916
+
6917
+    /**
6918
+     * Function test if is indexed
6919
+     *
6920
+     * @param   array   $info   content informations of field
6921
+     * @return                  bool
6922
+     */
6923
+    protected function isIndex($info)
6924
+    {
6925
+        if(is_array($info))
6926
+        {
6927
+            if(isset($info['index']) && $info['index']==true) return true;
6928
+            else return false;
6929
+        }
6930
+        else return false;
6931
+    }
6932
+
6933
+    /**
6934
+     * Function to prepare the values to insert.
6935
+     * Note $this->${field} are set by the page that make the createCommon or the updateCommon.
6936
+     *
6937
+     * @return array
6938
+     */
6939
+    protected function setSaveQuery()
6940
+    {
6941
+        global $conf;
6942
+
6943
+        $queryarray=array();
6944
+        foreach ($this->fields as $field=>$info)	// Loop on definition of fields
6945
+        {
6946
+            // Depending on field type ('datetime', ...)
6947
+            if($this->isDate($info))
6948
+            {
6949
+                if(empty($this->{$field}))
6950
+                {
6951
+                    $queryarray[$field] = null;
6952
+                }
6953
+                else
6954
+                {
6955
+                    $queryarray[$field] = $this->db->idate($this->{$field});
6956
+                }
6957
+            }
6958
+            else if($this->isArray($info))
6959
+            {
6960
+                if(! empty($this->{$field})) {
6961
+                    if(! is_array($this->{$field})) {
6962
+                        $this->{$field} = array($this->{$field});
6963
+                    }
6964
+                    $queryarray[$field] = serialize($this->{$field});
6965
+                } else {
6966
+                    $queryarray[$field] = null;
6967
+                }
6968
+            }
6969
+            else if($this->isInt($info))
6970
+            {
6971
+                if ($field == 'entity' && is_null($this->{$field})) $queryarray[$field]=$conf->entity;
6972
+                else
6973
+                {
6974
+                    $queryarray[$field] = (int) price2num($this->{$field});
6975
+                    if (empty($queryarray[$field])) $queryarray[$field]=0;		// May be reset to null later if property 'notnull' is -1 for this field.
6976
+                }
6977
+            }
6978
+            else if($this->isFloat($info))
6979
+            {
6980
+                $queryarray[$field] = (double) price2num($this->{$field});
6981
+                if (empty($queryarray[$field])) $queryarray[$field]=0;
6982
+            }
6983
+            else
6984
+            {
6985
+                $queryarray[$field] = $this->{$field};
6986
+            }
6987
+
6988
+            if ($info['type'] == 'timestamp' && empty($queryarray[$field])) unset($queryarray[$field]);
6989
+            if (! empty($info['notnull']) && $info['notnull'] == -1 && empty($queryarray[$field])) $queryarray[$field] = null;
6990
+        }
6991
+
6992
+        return $queryarray;
6993
+    }
6994
+
6995
+    /**
6996
+     * Function to load data from a SQL pointer into properties of current object $this
6997
+     *
6998
+     * @param   stdClass    $obj    Contain data of object from database
6999
+     * @return void
7000
+     */
7001
+    protected function setVarsFromFetchObj(&$obj)
7002
+    {
7003
+        foreach ($this->fields as $field => $info)
7004
+        {
7005
+            if($this->isDate($info))
7006
+            {
7007
+                if(empty($obj->{$field}) || $obj->{$field} === '0000-00-00 00:00:00' || $obj->{$field} === '1000-01-01 00:00:00') $this->{$field} = 0;
7008
+                else $this->{$field} = strtotime($obj->{$field});
7009
+            }
7010
+            elseif($this->isArray($info))
7011
+            {
7012
+                if(! empty($obj->{$field})) {
7013
+                    $this->{$field} = @unserialize($obj->{$field});
7014
+                    // Hack for data not in UTF8
7015
+                    if($this->{$field } === false) @unserialize(utf8_decode($obj->{$field}));
7016
+                } else {
7017
+                    $this->{$field} = array();
7018
+                }
7019
+            }
7020
+            elseif($this->isInt($info))
7021
+            {
7022
+                if ($field == 'rowid') $this->id = (int) $obj->{$field};
7023
+                else $this->{$field} = (int) $obj->{$field};
7024
+            }
7025
+            elseif($this->isFloat($info))
7026
+            {
7027
+                $this->{$field} = (double) $obj->{$field};
7028
+            }
7029
+            elseif($this->isNull($info))
7030
+            {
7031
+                $val = $obj->{$field};
7032
+                // zero is not null
7033
+                $this->{$field} = (is_null($val) || (empty($val) && $val!==0 && $val!=='0') ? null : $val);
7034
+            }
7035
+            else
7036
+            {
7037
+                $this->{$field} = $obj->{$field};
7038
+            }
7039
+        }
7040
+
7041
+        // If there is no 'ref' field, we force property ->ref to ->id for a better compatibility with common functions.
7042
+        if (! isset($this->fields['ref']) && isset($this->id)) $this->ref = $this->id;
7043
+    }
7044
+
7045
+    /**
7046
+     * Function to concat keys of fields
7047
+     *
7048
+     * @return string
7049
+     */
7050
+    protected function getFieldList()
7051
+    {
7052
+        $keys = array_keys($this->fields);
7053
+        return implode(',', $keys);
7054
+    }
7055
+
7056
+    /**
7057
+     * Add quote to field value if necessary
7058
+     *
7059
+     * @param 	string|int	$value			Value to protect
7060
+     * @param	array		$fieldsentry	Properties of field
7061
+     * @return 	string
7062
+     */
7063
+    protected function quote($value, $fieldsentry)
7064
+    {
7065
+        if (is_null($value)) return 'NULL';
7066
+        else if (preg_match('/^(int|double|real)/i', $fieldsentry['type'])) return $this->db->escape("$value");
7067
+        else return "'".$this->db->escape($value)."'";
7068
+    }
7069
+
7070
+
7071
+    /**
7072
+     * Create object into database
7073
+     *
7074
+     * @param  User $user      User that creates
7075
+     * @param  bool $notrigger false=launch triggers after, true=disable triggers
7076
+     * @return int             <0 if KO, Id of created object if OK
7077
+     */
7078
+    public function createCommon(User $user, $notrigger = false)
7079
+    {
7080
+        global $langs;
6096 7081
 
6097
-				$obj = $this->db->fetch_object($resql);
7082
+        $error = 0;
6098 7083
 
6099
-				// Several field into label (eq table:code|libelle:rowid)
6100
-				$fields_label = explode('|',$InfoFieldList[1]);
7084
+        $now=dol_now();
6101 7085
 
6102
-				if(is_array($fields_label) && count($fields_label)>1)
6103
-				{
6104
-					foreach ($fields_label as $field_toshow)
6105
-					{
6106
-						$translabel='';
6107
-						if (!empty($obj->$field_toshow)) {
6108
-							$translabel=$langs->trans($obj->$field_toshow);
6109
-						}
6110
-						if ($translabel!=$field_toshow) {
6111
-							$value.=dol_trunc($translabel,18).' ';
6112
-						}else {
6113
-							$value.=$obj->$field_toshow.' ';
6114
-						}
6115
-					}
6116
-				}
6117
-				else
6118
-				{
6119
-					$translabel='';
6120
-					if (!empty($obj->{$InfoFieldList[1]})) {
6121
-						$translabel=$langs->trans($obj->{$InfoFieldList[1]});
6122
-					}
6123
-					if ($translabel!=$obj->{$InfoFieldList[1]}) {
6124
-						$value=dol_trunc($translabel,18);
6125
-					}else {
6126
-						$value=$obj->{$InfoFieldList[1]};
6127
-					}
6128
-				}
6129
-			}
6130
-			else dol_syslog(get_class($this).'::showOutputField error '.$this->db->lasterror(), LOG_WARNING);
6131
-		}
6132
-		elseif ($type == 'radio')
6133
-		{
6134
-			$value=$param['options'][$value];
6135
-		}
6136
-		elseif ($type == 'checkbox')
6137
-		{
6138
-			$value_arr=explode(',',$value);
6139
-			$value='';
6140
-			if (is_array($value_arr) && count($value_arr)>0)
6141
-			{
6142
-				foreach ($value_arr as $keyval=>$valueval) {
6143
-					$toprint[]='<li class="select2-search-choice-dolibarr noborderoncategories" style="background: #aaa">'.$param['options'][$valueval].'</li>';
6144
-				}
6145
-				$value='<div class="select2-container-multi-dolibarr" style="width: 90%;"><ul class="select2-choices-dolibarr">'.implode(' ', $toprint).'</ul></div>';
6146
-			}
6147
-		}
6148
-		elseif ($type == 'chkbxlst')
6149
-		{
6150
-			$value_arr = explode(',', $value);
6151
-
6152
-			$param_list = array_keys($param['options']);
6153
-			$InfoFieldList = explode(":", $param_list[0]);
6154
-
6155
-			$selectkey = "rowid";
6156
-			$keyList = 'rowid';
6157
-
6158
-			if (count($InfoFieldList) >= 3) {
6159
-				$selectkey = $InfoFieldList[2];
6160
-				$keyList = $InfoFieldList[2] . ' as rowid';
6161
-			}
6162
-
6163
-			$fields_label = explode('|', $InfoFieldList[1]);
6164
-			if (is_array($fields_label)) {
6165
-				$keyList .= ', ';
6166
-				$keyList .= implode(', ', $fields_label);
6167
-			}
6168
-
6169
-			$sql = 'SELECT ' . $keyList;
6170
-			$sql .= ' FROM ' . MAIN_DB_PREFIX . $InfoFieldList[0];
6171
-			if (strpos($InfoFieldList[4], 'extra') !== false) {
6172
-				$sql .= ' as main';
6173
-			}
6174
-			// $sql.= " WHERE ".$selectkey."='".$this->db->escape($value)."'";
6175
-			// $sql.= ' AND entity = '.$conf->entity;
6176
-
6177
-			dol_syslog(get_class($this) . ':showOutputField:$type=chkbxlst',LOG_DEBUG);
6178
-			$resql = $this->db->query($sql);
6179
-			if ($resql) {
6180
-				$value = ''; // value was used, so now we reste it to use it to build final output
6181
-				$toprint=array();
6182
-				while ( $obj = $this->db->fetch_object($resql) ) {
6183
-
6184
-					// Several field into label (eq table:code|libelle:rowid)
6185
-					$fields_label = explode('|', $InfoFieldList[1]);
6186
-					if (is_array($value_arr) && in_array($obj->rowid, $value_arr)) {
6187
-						if (is_array($fields_label) && count($fields_label) > 1) {
6188
-							foreach ( $fields_label as $field_toshow ) {
6189
-								$translabel = '';
6190
-								if (! empty($obj->$field_toshow)) {
6191
-									$translabel = $langs->trans($obj->$field_toshow);
6192
-								}
6193
-								if ($translabel != $field_toshow) {
6194
-									$toprint[]='<li class="select2-search-choice-dolibarr noborderoncategories" style="background: #aaa">'.dol_trunc($translabel, 18).'</li>';
6195
-								} else {
6196
-									$toprint[]='<li class="select2-search-choice-dolibarr noborderoncategories" style="background: #aaa">'.$obj->$field_toshow.'</li>';
6197
-								}
6198
-							}
6199
-						} else {
6200
-							$translabel = '';
6201
-							if (! empty($obj->{$InfoFieldList[1]})) {
6202
-								$translabel = $langs->trans($obj->{$InfoFieldList[1]});
6203
-							}
6204
-							if ($translabel != $obj->{$InfoFieldList[1]}) {
6205
-								$toprint[]='<li class="select2-search-choice-dolibarr noborderoncategories" style="background: #aaa">'.dol_trunc($translabel, 18).'</li>';
6206
-							} else {
6207
-								$toprint[]='<li class="select2-search-choice-dolibarr noborderoncategories" style="background: #aaa">'.$obj->{$InfoFieldList[1]}.'</li>';
6208
-							}
6209
-						}
6210
-					}
6211
-				}
6212
-				$value='<div class="select2-container-multi-dolibarr" style="width: 90%;"><ul class="select2-choices-dolibarr">'.implode(' ', $toprint).'</ul></div>';
6213
-			} else {
6214
-				dol_syslog(get_class($this) . '::showOutputField error ' . $this->db->lasterror(), LOG_WARNING);
6215
-			}
6216
-		}
6217
-		elseif ($type == 'link')
6218
-		{
6219
-			$out='';
6220
-
6221
-			// only if something to display (perf)
6222
-			if ($value)
6223
-			{
6224
-				$param_list=array_keys($param['options']);				// $param_list='ObjectName:classPath'
7086
+        $fieldvalues = $this->setSaveQuery();
7087
+        if (array_key_exists('date_creation', $fieldvalues) && empty($fieldvalues['date_creation'])) $fieldvalues['date_creation']=$this->db->idate($now);
7088
+        if (array_key_exists('fk_user_creat', $fieldvalues) && ! ($fieldvalues['fk_user_creat'] > 0)) $fieldvalues['fk_user_creat']=$user->id;
7089
+        unset($fieldvalues['rowid']);	// The field 'rowid' is reserved field name for autoincrement field so we don't need it into insert.
6225 7090
 
6226
-				$InfoFieldList = explode(":", $param_list[0]);
6227
-				$classname=$InfoFieldList[0];
6228
-				$classpath=$InfoFieldList[1];
6229
-				$getnomurlparam=(empty($InfoFieldList[2]) ? 3 : $InfoFieldList[2]);
6230
-				if (! empty($classpath))
6231
-				{
6232
-					dol_include_once($InfoFieldList[1]);
6233
-					if ($classname && class_exists($classname))
6234
-					{
6235
-						$object = new $classname($this->db);
6236
-						$object->fetch($value);
6237
-						$value=$object->getNomUrl($getnomurlparam);
6238
-					}
6239
-				}
6240
-				else
6241
-				{
6242
-					dol_syslog('Error bad setup of extrafield', LOG_WARNING);
6243
-					return 'Error bad setup of extrafield';
6244
-				}
6245
-			}
6246
-			else $value='';
6247
-		}
6248
-		elseif ($type == 'text' || $type == 'html')
6249
-		{
6250
-			$value=dol_htmlentitiesbr($value);
6251
-		}
6252
-		elseif ($type == 'password')
6253
-		{
6254
-			$value=preg_replace('/./i','*',$value);
6255
-		}
6256
-		elseif ($type == 'array')
6257
-		{
6258
-			$value = implode('<br>', $value);
6259
-		}
6260
-
6261
-		//print $type.'-'.$size;
6262
-		$out=$value;
6263
-
6264
-		return $out;
6265
-	}
6266
-
6267
-
6268
-	/**
6269
-	 * Function to show lines of extrafields with output datas
6270
-	 *
6271
-	 * @param 	Extrafields $extrafields    Extrafield Object
6272
-	 * @param 	string      $mode           Show output (view) or input (edit) for extrafield
6273
-	 * @param 	array       $params         Optional parameters. Example: array('style'=>'class="oddeven"', 'colspan'=>$colspan)
6274
-	 * @param 	string      $keysuffix      Suffix string to add after name and id of field (can be used to avoid duplicate names)
6275
-	 * @param 	string      $keyprefix      Prefix string to add before name and id of field (can be used to avoid duplicate names)
6276
-	 * @param	string		$onetrtd		All fields in same tr td
6277
-	 * @return 	string
6278
-	 */
6279
-	function showOptionals($extrafields, $mode='view', $params=null, $keysuffix='', $keyprefix='', $onetrtd=0)
6280
-	{
6281
-		global $db, $conf, $langs, $action, $form;
6282
-
6283
-		if (! is_object($form)) $form=new Form($db);
6284
-
6285
-		$out = '';
6286
-
6287
-		if (is_array($extrafields->attributes[$this->table_element]['label']) && count($extrafields->attributes[$this->table_element]['label']) > 0)
6288
-		{
6289
-			$out .= "\n";
6290
-			$out .= '<!-- showOptionalsInput --> ';
6291
-			$out .= "\n";
6292
-
6293
-			$e = 0;
6294
-			foreach($extrafields->attributes[$this->table_element]['label'] as $key=>$label)
6295
-			{
6296
-				// Show only the key field in params
6297
-				if (is_array($params) && array_key_exists('onlykey',$params) && $key != $params['onlykey']) continue;
7091
+        $keys=array();
7092
+        $values = array();
7093
+        foreach ($fieldvalues as $k => $v) {
7094
+            $keys[$k] = $k;
7095
+            $value = $this->fields[$k];
7096
+            $values[$k] = $this->quote($v, $value);
7097
+        }
6298 7098
 
6299
-				$enabled = 1;
6300
-				if ($enabled && isset($extrafields->attributes[$this->table_element]['list'][$key]))
6301
-				{
6302
-					$enabled = dol_eval($extrafields->attributes[$this->table_element]['list'][$key], 1);
6303
-				}
7099
+        // Clean and check mandatory
7100
+        foreach($keys as $key)
7101
+        {
7102
+            // If field is an implicit foreign key field
7103
+            if (preg_match('/^integer:/i', $this->fields[$key]['type']) && $values[$key] == '-1') $values[$key]='';
7104
+            if (! empty($this->fields[$key]['foreignkey']) && $values[$key] == '-1') $values[$key]='';
6304 7105
 
6305
-				$perms = 1;
6306
-				if ($perms && isset($extrafields->attributes[$this->table_element]['perms'][$key]))
6307
-				{
6308
-					$perms = dol_eval($extrafields->attributes[$this->table_element]['perms'][$key], 1);
6309
-				}
7106
+            //var_dump($key.'-'.$values[$key].'-'.($this->fields[$key]['notnull'] == 1));
7107
+            if (isset($this->fields[$key]['notnull']) && $this->fields[$key]['notnull'] == 1 && ! isset($values[$key]) && is_null($val['default']))
7108
+            {
7109
+                $error++;
7110
+                $this->errors[]=$langs->trans("ErrorFieldRequired", $this->fields[$key]['label']);
7111
+            }
6310 7112
 
6311
-				if (($mode == 'create' || $mode == 'edit') && abs($enabled) != 1 && abs($enabled) != 3) continue;	// <> -1 and <> 1 and <> 3 = not visible on forms, only on list
6312
-				if (empty($perms)) continue;
7113
+            // If field is an implicit foreign key field
7114
+            if (preg_match('/^integer:/i', $this->fields[$key]['type']) && empty($values[$key])) $values[$key]='null';
7115
+            if (! empty($this->fields[$key]['foreignkey']) && empty($values[$key])) $values[$key]='null';
7116
+        }
6313 7117
 
6314
-				// Load language if required
6315
-				if (! empty($extrafields->attributes[$this->table_element]['langfile'][$key])) $langs->load($extrafields->attributes[$this->table_element]['langfile'][$key]);
7118
+        if ($error) return -1;
6316 7119
 
6317
-				$colspan='3';
6318
-				if (is_array($params) && count($params)>0) {
6319
-					if (array_key_exists('colspan',$params)) {
6320
-						$colspan=$params['colspan'];
6321
-					}
6322
-				}
7120
+        $this->db->begin();
6323 7121
 
6324
-				switch($mode) {
6325
-					case "view":
6326
-						$value=$this->array_options["options_".$key.$keysuffix];
6327
-						break;
6328
-					case "edit":
6329
-						$getposttemp = GETPOST($keyprefix.'options_'.$key.$keysuffix, 'none');				// GETPOST can get value from GET, POST or setup of default values.
6330
-						// GETPOST("options_" . $key) can be 'abc' or array(0=>'abc')
6331
-						if (is_array($getposttemp) || $getposttemp != '' || GETPOSTISSET($keyprefix.'options_'.$key.$keysuffix))
6332
-						{
6333
-							if (is_array($getposttemp)) {
6334
-								// $getposttemp is an array but following code expects a comma separated string
6335
-								$value = implode(",", $getposttemp);
6336
-							} else {
6337
-								$value = $getposttemp;
6338
-							}
6339
-						} else {
6340
-							$value = $this->array_options["options_" . $key];			// No GET, no POST, no default value, so we take value of object.
6341
-						}
6342
-						//var_dump($keyprefix.' - '.$key.' - '.$keysuffix.' - '.$keyprefix.'options_'.$key.$keysuffix.' - '.$this->array_options["options_".$key.$keysuffix].' - '.$getposttemp.' - '.$value);
6343
-						break;
6344
-				}
7122
+        if (! $error)
7123
+        {
7124
+            $sql = 'INSERT INTO '.MAIN_DB_PREFIX.$this->table_element;
7125
+            $sql.= ' ('.implode( ", ", $keys ).')';
7126
+            $sql.= ' VALUES ('.implode( ", ", $values ).')';
7127
+
7128
+            $res = $this->db->query($sql);
7129
+            if ($res===false) {
7130
+                $error++;
7131
+                $this->errors[] = $this->db->lasterror();
7132
+            }
7133
+        }
6345 7134
 
6346
-				if ($extrafields->attributes[$this->table_element]['type'][$key] == 'separate')
6347
-				{
6348
-					$out .= $extrafields->showSeparator($key, $this);
6349
-				}
6350
-				else
6351
-				{
6352
-					$csstyle='';
6353
-					$class=(!empty($extrafields->attributes[$this->table_element]['hidden'][$key]) ? 'hideobject ' : '');
6354
-					if (is_array($params) && count($params)>0) {
6355
-						if (array_key_exists('style',$params)) {
6356
-							$csstyle=$params['style'];
6357
-						}
6358
-					}
7135
+        if (! $error)
7136
+        {
7137
+            $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX . $this->table_element);
7138
+        }
6359 7139
 
6360
-					// add html5 elements
6361
-					$domData  = ' data-element="extrafield"';
6362
-					$domData .= ' data-targetelement="'.$this->element.'"';
6363
-					$domData .= ' data-targetid="'.$this->id.'"';
7140
+        // Create extrafields
7141
+        if (! $error)
7142
+        {
7143
+            $result=$this->insertExtraFields();
7144
+            if ($result < 0) $error++;
7145
+        }
6364 7146
 
6365
-					$html_id = !empty($this->id) ? 'extrarow-'.$this->element.'_'.$key.'_'.$this->id : '';
7147
+        // Triggers
7148
+        if (! $error && ! $notrigger)
7149
+        {
7150
+            // Call triggers
7151
+            $result=$this->call_trigger(strtoupper(get_class($this)).'_CREATE',$user);
7152
+            if ($result < 0) { $error++; }
7153
+            // End call triggers
7154
+        }
6366 7155
 
6367
-					$out .= '<tr id="'.$html_id.'" '.$csstyle.' class="'.$class.$this->element.'_extras_'.$key.'" '.$domData.' >';
7156
+        // Commit or rollback
7157
+        if ($error) {
7158
+            $this->db->rollback();
7159
+            return -1;
7160
+        } else {
7161
+            $this->db->commit();
7162
+            return $this->id;
7163
+        }
7164
+    }
6368 7165
 
6369
-					if (! empty($conf->global->MAIN_EXTRAFIELDS_USE_TWO_COLUMS) && ($e % 2) == 0)
6370
-					{
6371
-						if (! empty($conf->global->MAIN_EXTRAFIELDS_USE_TWO_COLUMS) && ($e % 2) == 0) { $colspan='0'; }
6372
-					}
6373 7166
 
6374
-					if ($action == 'selectlines') { $colspan++; }
7167
+    /**
7168
+     * Load object in memory from the database
7169
+     *
7170
+     * @param	int    $id				Id object
7171
+     * @param	string $ref				Ref
7172
+     * @param	string	$morewhere		More SQL filters (' AND ...')
7173
+     * @return 	int         			<0 if KO, 0 if not found, >0 if OK
7174
+     */
7175
+    public function fetchCommon($id, $ref = null, $morewhere = '')
7176
+    {
7177
+        if (empty($id) && empty($ref) && empty($morewhere)) return -1;
6375 7178
 
6376
-					// Convert date into timestamp format (value in memory must be a timestamp)
6377
-					if (in_array($extrafields->attributes[$this->table_element]['type'][$key],array('date','datetime')))
6378
-					{
6379
-						$datenotinstring = $this->array_options['options_' . $key];
6380
-						if (! is_numeric($this->array_options['options_' . $key]))	// For backward compatibility
6381
-						{
6382
-							$datenotinstring = $this->db->jdate($datenotinstring);
6383
-						}
6384
-						$value = GETPOSTISSET($keyprefix.'options_'.$key.$keysuffix)?dol_mktime(GETPOST($keyprefix.'options_'.$key.$keysuffix."hour", 'int', 3), GETPOST($keyprefix.'options_'.$key.$keysuffix."min",'int',3), 0, GETPOST($keyprefix.'options_'.$key.$keysuffix."month",'int',3), GETPOST($keyprefix.'options_'.$key.$keysuffix."day",'int',3), GETPOST($keyprefix.'options_'.$key.$keysuffix."year",'int',3)):$datenotinstring;
6385
-					}
6386
-					// Convert float submited string into real php numeric (value in memory must be a php numeric)
6387
-					if (in_array($extrafields->attributes[$this->table_element]['type'][$key],array('price','double')))
6388
-					{
6389
-						$value = GETPOSTISSET($keyprefix.'options_'.$key.$keysuffix)?price2num(GETPOST($keyprefix.'options_'.$key.$keysuffix, 'alpha', 3)):$this->array_options['options_'.$key];
6390
-					}
6391
-
6392
-					$labeltoshow = $langs->trans($label);
6393
-
6394
-					$out .= '<td class="titlefield';
6395
-					if (GETPOST('action','none') == 'create') $out.='create';
6396
-					if ($mode != 'view' && ! empty($extrafields->attributes[$this->table_element]['required'][$key])) $out .= ' fieldrequired';
6397
-					$out .= '">';
6398
-					if (! empty($extrafields->attributes[$object->table_element]['help'][$key])) $out .= $form->textwithpicto($labeltoshow, $extrafields->attributes[$object->table_element]['help'][$key]);
6399
-					else $out .= $labeltoshow;
6400
-					$out .= '</td>';
6401
-
6402
-					$html_id = !empty($this->id) ? $this->element.'_extras_'.$key.'_'.$this->id : '';
6403
-					$out .='<td id="'.$html_id.'" class="'.$this->element.'_extras_'.$key.'" '.($colspan?' colspan="'.$colspan.'"':'').'>';
6404
-
6405
-					switch($mode) {
6406
-						case "view":
6407
-							$out .= $extrafields->showOutputField($key, $value);
6408
-							break;
6409
-						case "edit":
6410
-							$out .= $extrafields->showInputField($key, $value, '', $keysuffix, '', 0, $this->id);
6411
-							break;
6412
-					}
6413
-
6414
-					$out .= '</td>';
6415
-
6416
-					if (! empty($conf->global->MAIN_EXTRAFIELDS_USE_TWO_COLUMS) && (($e % 2) == 1)) $out .= '</tr>';
6417
-					else $out .= '</tr>';
6418
-					$e++;
6419
-				}
6420
-			}
6421
-			$out .= "\n";
6422
-			// Add code to manage list depending on others
6423
-			if (! empty($conf->use_javascript_ajax)) {
6424
-				$out .= '
6425
-				<script type="text/javascript">
6426
-				    jQuery(document).ready(function() {
6427
-				    	function showOptions(child_list, parent_list)
6428
-				    	{
6429
-				    		var val = $("select[name=\"options_"+parent_list+"\"]").val();
6430
-				    		var parentVal = parent_list + ":" + val;
6431
-							if(val > 0) {
6432
-					    		$("select[name=\""+child_list+"\"] option[parent]").hide();
6433
-					    		$("select[name=\""+child_list+"\"] option[parent=\""+parentVal+"\"]").show();
6434
-							} else {
6435
-								$("select[name=\""+child_list+"\"] option").show();
6436
-							}
6437
-				    	}
6438
-						function setListDependencies() {
6439
-					    	jQuery("select option[parent]").parent().each(function() {
6440
-					    		var child_list = $(this).attr("name");
6441
-								var parent = $(this).find("option[parent]:first").attr("parent");
6442
-								var infos = parent.split(":");
6443
-								var parent_list = infos[0];
6444
-								$("select[name=\""+parent_list+"\"]").change(function() {
6445
-									showOptions(child_list, parent_list);
6446
-								});
6447
-					    	});
6448
-						}
7179
+        $sql = 'SELECT '.$this->getFieldList();
7180
+        $sql.= ' FROM '.MAIN_DB_PREFIX.$this->table_element;
6449 7181
 
6450
-						setListDependencies();
6451
-				    });
6452
-				</script>'."\n";
6453
-				$out .= '<!-- /showOptionalsInput --> '."\n";
6454
-			}
6455
-		}
6456
-		return $out;
6457
-	}
6458
-
6459
-
6460
-	/**
6461
-	 * Returns the rights used for this class
6462
-	 * @return stdClass
6463
-	 */
6464
-	public function getRights()
6465
-	{
6466
-		global $user;
6467
-
6468
-		$element = $this->element;
6469
-		if ($element == 'facturerec') $element='facture';
6470
-
6471
-		return $user->rights->{$element};
6472
-	}
6473
-
6474
-	/**
6475
-	 * Function used to replace a thirdparty id with another one.
6476
-	 * This function is meant to be called from replaceThirdparty with the appropiate tables
6477
-	 * Column name fk_soc MUST be used to identify thirdparties
6478
-	 *
6479
-	 * @param  DoliDB 	   $db 			  Database handler
6480
-	 * @param  int 		   $origin_id     Old thirdparty id (the thirdparty to delete)
6481
-	 * @param  int 		   $dest_id       New thirdparty id (the thirdparty that will received element of the other)
6482
-	 * @param  string[]    $tables        Tables that need to be changed
6483
-	 * @param  int         $ignoreerrors  Ignore errors. Return true even if errors. We need this when replacement can fails like for categories (categorie of old thirdparty may already exists on new one)
6484
-	 * @return bool						  True if success, False if error
6485
-	 */
6486
-	public static function commonReplaceThirdparty(DoliDB $db, $origin_id, $dest_id, array $tables, $ignoreerrors=0)
6487
-	{
6488
-		foreach ($tables as $table)
6489
-		{
6490
-			$sql = 'UPDATE '.MAIN_DB_PREFIX.$table.' SET fk_soc = '.$dest_id.' WHERE fk_soc = '.$origin_id;
6491
-
6492
-			if (! $db->query($sql))
6493
-			{
6494
-				if ($ignoreerrors) return true;		// TODO Not enough. If there is A-B on kept thirdarty and B-C on old one, we must get A-B-C after merge. Not A-B.
6495
-				//$this->errors = $db->lasterror();
6496
-				return false;
6497
-			}
6498
-		}
6499
-
6500
-		return true;
6501
-	}
6502
-
6503
-	/**
6504
-	 * Get buy price to use for margin calculation. This function is called when buy price is unknown.
6505
-	 *	 Set buy price = sell price if ForceBuyingPriceIfNull configured,
6506
-	 *   else if calculation MARGIN_TYPE = 'costprice' and costprice is defined, use costprice as buyprice
6507
-	 *	 else if calculation MARGIN_TYPE = 'pmp' and pmp is calculated, use pmp as buyprice
6508
-	 *	 else set min buy price as buy price
6509
-	 *
6510
-	 * @param float		$unitPrice		 Product unit price
6511
-	 * @param float		$discountPercent Line discount percent
6512
-	 * @param int		$fk_product		 Product id
6513
-	 * @return	float                    <0 if KO, buyprice if OK
6514
-	 */
6515
-	public function defineBuyPrice($unitPrice = 0.0, $discountPercent = 0.0, $fk_product = 0)
6516
-	{
6517
-		global $conf;
6518
-
6519
-		$buyPrice = 0;
6520
-
6521
-		if (($unitPrice > 0) && (isset($conf->global->ForceBuyingPriceIfNull) && $conf->global->ForceBuyingPriceIfNull == 1)) // In most cases, test here is false
6522
-		{
6523
-			$buyPrice = $unitPrice * (1 - $discountPercent / 100);
6524
-		}
6525
-		else
6526
-		{
6527
-			// Get cost price for margin calculation
6528
-			if (! empty($fk_product))
6529
-			{
6530
-				if (isset($conf->global->MARGIN_TYPE) && $conf->global->MARGIN_TYPE == 'costprice')
6531
-				{
6532
-					require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
6533
-					$product = new Product($this->db);
6534
-					$result = $product->fetch($fk_product);
6535
-					if ($result <= 0)
6536
-					{
6537
-						$this->errors[] = 'ErrorProductIdDoesNotExists';
6538
-						return -1;
6539
-					}
6540
-					if ($product->cost_price > 0)
6541
-					{
6542
-						$buyPrice = $product->cost_price;
6543
-					}
6544
-					else if ($product->pmp > 0)
6545
-					{
6546
-						$buyPrice = $product->pmp;
6547
-					}
6548
-				}
6549
-				else if (isset($conf->global->MARGIN_TYPE) && $conf->global->MARGIN_TYPE == 'pmp')
6550
-				{
6551
-					require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
6552
-					$product = new Product($this->db);
6553
-					$result = $product->fetch($fk_product);
6554
-					if ($result <= 0)
6555
-					{
6556
-						$this->errors[] = 'ErrorProductIdDoesNotExists';
6557
-						return -1;
6558
-					}
6559
-					if ($product->pmp > 0)
6560
-					{
6561
-						$buyPrice = $product->pmp;
6562
-					}
6563
-				}
7182
+        if (!empty($id))  $sql.= ' WHERE rowid = '.$id;
7183
+        elseif (!empty($ref)) $sql.= " WHERE ref = ".$this->quote($ref, $this->fields['ref']);
7184
+        else $sql.=' WHERE 1 = 1';	// usage with empty id and empty ref is very rare
7185
+        if ($morewhere)   $sql.= $morewhere;
7186
+        $sql.=' LIMIT 1';	// This is a fetch, to be sure to get only one record
6564 7187
 
6565
-				if (empty($buyPrice) && isset($conf->global->MARGIN_TYPE) && in_array($conf->global->MARGIN_TYPE, array('1','pmp','costprice')))
6566
-				{
6567
-					require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.product.class.php';
6568
-					$productFournisseur = new ProductFournisseur($this->db);
6569
-					if (($result = $productFournisseur->find_min_price_product_fournisseur($fk_product)) > 0)
6570
-					{
6571
-						$buyPrice = $productFournisseur->fourn_unitprice;
6572
-					}
6573
-					else if ($result < 0)
6574
-					{
6575
-						$this->errors[] = $productFournisseur->error;
6576
-						return -2;
6577
-					}
6578
-				}
6579
-			}
6580
-		}
6581
-		return $buyPrice;
6582
-	}
7188
+        $res = $this->db->query($sql);
7189
+        if ($res)
7190
+        {
7191
+            $obj = $this->db->fetch_object($res);
7192
+            if ($obj)
7193
+            {
7194
+                $this->setVarsFromFetchObj($obj);
7195
+                return $this->id;
7196
+            }
7197
+            else
7198
+            {
7199
+                return 0;
7200
+            }
7201
+        }
7202
+        else
7203
+        {
7204
+            $this->error = $this->db->lasterror();
7205
+            $this->errors[] = $this->error;
7206
+            return -1;
7207
+        }
7208
+    }
6583 7209
 
6584
-    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
6585
-	/**
6586
-	 *  Show photos of an object (nbmax maximum), into several columns
6587
-	 *
6588
-	 *  @param		string	$modulepart		'product', 'ticket', ...
6589
-	 *  @param      string	$sdir        	Directory to scan (full absolute path)
6590
-	 *  @param      int		$size        	0=original size, 1='small' use thumbnail if possible
6591
-	 *  @param      int		$nbmax       	Nombre maximum de photos (0=pas de max)
6592
-	 *  @param      int		$nbbyrow     	Number of image per line or -1 to use div. Used only if size=1.
6593
-	 * 	@param		int		$showfilename	1=Show filename
6594
-	 * 	@param		int		$showaction		1=Show icon with action links (resize, delete)
6595
-	 * 	@param		int		$maxHeight		Max height of original image when size='small' (so we can use original even if small requested). If 0, always use 'small' thumb image.
6596
-	 * 	@param		int		$maxWidth		Max width of original image when size='small'
6597
-	 *  @param      int     $nolink         Do not add a href link to view enlarged imaged into a new tab
6598
-	 *  @param      int     $notitle        Do not add title tag on image
6599
-	 *  @param		int		$usesharelink	Use the public shared link of image (if not available, the 'nophoto' image will be shown instead)
6600
-	 *  @return     string					Html code to show photo. Number of photos shown is saved in this->nbphoto
6601
-	 */
6602
-	function show_photos($modulepart, $sdir, $size=0, $nbmax=0, $nbbyrow=5, $showfilename=0, $showaction=0, $maxHeight=120, $maxWidth=160, $nolink=0, $notitle=0, $usesharelink=0)
6603
-	{
6604
-        // phpcs:enable
6605
-		global $conf,$user,$langs;
6606
-
6607
-		include_once DOL_DOCUMENT_ROOT .'/core/lib/files.lib.php';
6608
-		include_once DOL_DOCUMENT_ROOT .'/core/lib/images.lib.php';
6609
-
6610
-		$sortfield='position_name';
6611
-		$sortorder='asc';
6612
-
6613
-		$dir = $sdir . '/';
6614
-		$pdir = '/';
6615
-		if ($modulepart == 'ticket')
6616
-		{
6617
-			$dir .= get_exdir(0, 0, 0, 0, $this, $modulepart).$this->track_id.'/';
6618
-			$pdir .= get_exdir(0, 0, 0, 0, $this, $modulepart).$this->track_id.'/';
6619
-		}
6620
-		else
6621
-		{
6622
-			$dir .= get_exdir(0, 0, 0, 0, $this, $modulepart).$this->ref.'/';
6623
-			$pdir .= get_exdir(0, 0, 0, 0, $this, $modulepart).$this->ref.'/';
6624
-		}
6625
-
6626
-		// For backward compatibility
6627
-		if ($modulepart == 'product' && ! empty($conf->global->PRODUCT_USE_OLD_PATH_FOR_PHOTO))
6628
-		{
6629
-			$dir = $sdir . '/'. get_exdir($this->id,2,0,0,$this,$modulepart) . $this->id ."/photos/";
6630
-			$pdir = '/' . get_exdir($this->id,2,0,0,$this,$modulepart) . $this->id ."/photos/";
6631
-		}
6632
-
6633
-		// Defined relative dir to DOL_DATA_ROOT
6634
-		$relativedir = '';
6635
-		if ($dir)
6636
-		{
6637
-			$relativedir = preg_replace('/^'.preg_quote(DOL_DATA_ROOT,'/').'/', '', $dir);
6638
-			$relativedir = preg_replace('/^[\\/]/','',$relativedir);
6639
-			$relativedir = preg_replace('/[\\/]$/','',$relativedir);
6640
-		}
6641
-
6642
-		$dirthumb = $dir.'thumbs/';
6643
-		$pdirthumb = $pdir.'thumbs/';
6644
-
6645
-		$return ='<!-- Photo -->'."\n";
6646
-		$nbphoto=0;
6647
-
6648
-		$filearray=dol_dir_list($dir,"files",0,'','(\.meta|_preview.*\.png)$',$sortfield,(strtolower($sortorder)=='desc'?SORT_DESC:SORT_ASC),1);
6649
-
6650
-		/*if (! empty($conf->global->PRODUCT_USE_OLD_PATH_FOR_PHOTO))    // For backward compatiblity, we scan also old dirs
6651
-		 {
6652
-		 $filearrayold=dol_dir_list($dirold,"files",0,'','(\.meta|_preview.*\.png)$',$sortfield,(strtolower($sortorder)=='desc'?SORT_DESC:SORT_ASC),1);
6653
-		 $filearray=array_merge($filearray, $filearrayold);
6654
-		 }*/
7210
+    /**
7211
+     * Update object into database
7212
+     *
7213
+     * @param  User $user      	User that modifies
7214
+     * @param  bool $notrigger 	false=launch triggers after, true=disable triggers
7215
+     * @return int             	<0 if KO, >0 if OK
7216
+     */
7217
+    public function updateCommon(User $user, $notrigger = false)
7218
+    {
7219
+        global $conf, $langs;
6655 7220
 
6656
-		completeFileArrayWithDatabaseInfo($filearray, $relativedir);
7221
+        $error = 0;
6657 7222
 
6658
-		if (count($filearray))
6659
-		{
6660
-			if ($sortfield && $sortorder)
6661
-			{
6662
-				$filearray=dol_sort_array($filearray, $sortfield, $sortorder);
6663
-			}
7223
+        $now=dol_now();
6664 7224
 
6665
-			foreach($filearray as $key => $val)
6666
-			{
6667
-				$photo='';
6668
-				$file = $val['name'];
7225
+        $fieldvalues = $this->setSaveQuery();
7226
+        if (array_key_exists('date_modification', $fieldvalues) && empty($fieldvalues['date_modification'])) $fieldvalues['date_modification']=$this->db->idate($now);
7227
+        if (array_key_exists('fk_user_modif', $fieldvalues) && ! ($fieldvalues['fk_user_modif'] > 0)) $fieldvalues['fk_user_modif']=$user->id;
7228
+        unset($fieldvalues['rowid']);	// The field 'rowid' is reserved field name for autoincrement field so we don't need it into update.
6669 7229
 
6670
-				//if (! utf8_check($file)) $file=utf8_encode($file);	// To be sure file is stored in UTF8 in memory
7230
+        $keys=array();
7231
+        $values = array();
7232
+        foreach ($fieldvalues as $k => $v) {
7233
+            $keys[$k] = $k;
7234
+            $value = $this->fields[$k];
7235
+            $values[$k] = $this->quote($v, $value);
7236
+            $tmp[] = $k.'='.$this->quote($v, $this->fields[$k]);
7237
+        }
6671 7238
 
6672
-				//if (dol_is_file($dir.$file) && image_format_supported($file) >= 0)
6673
-				if (image_format_supported($file) >= 0)
6674
-				{
6675
-					$nbphoto++;
6676
-					$photo = $file;
6677
-					$viewfilename = $file;
7239
+        // Clean and check mandatory
7240
+        foreach($keys as $key)
7241
+        {
7242
+            if (preg_match('/^integer:/i', $this->fields[$key]['type']) && $values[$key] == '-1') $values[$key]='';		// This is an implicit foreign key field
7243
+            if (! empty($this->fields[$key]['foreignkey']) && $values[$key] == '-1') $values[$key]='';					// This is an explicit foreign key field
7244
+
7245
+            //var_dump($key.'-'.$values[$key].'-'.($this->fields[$key]['notnull'] == 1));
7246
+            /*
7247
+			if ($this->fields[$key]['notnull'] == 1 && empty($values[$key]))
7248
+			{
7249
+				$error++;
7250
+				$this->errors[]=$langs->trans("ErrorFieldRequired", $this->fields[$key]['label']);
7251
+			}*/
7252
+        }
6678 7253
 
6679
-					if ($size == 1 || $size == 'small') {   // Format vignette
7254
+        $sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element.' SET '.implode( ',', $tmp ).' WHERE rowid='.$this->id ;
6680 7255
 
6681
-						// Find name of thumb file
6682
-						$photo_vignette=basename(getImageFileNameForSize($dir.$file, '_small'));
6683
-						if (! dol_is_file($dirthumb.$photo_vignette)) $photo_vignette='';
7256
+        $this->db->begin();
7257
+        if (! $error)
7258
+        {
7259
+            $res = $this->db->query($sql);
7260
+            if ($res===false)
7261
+            {
7262
+                $error++;
7263
+                $this->errors[] = $this->db->lasterror();
7264
+            }
7265
+        }
6684 7266
 
6685
-						// Get filesize of original file
6686
-						$imgarray=dol_getImageSize($dir.$photo);
7267
+        // Update extrafield
7268
+        if (! $error && empty($conf->global->MAIN_EXTRAFIELDS_DISABLED) && is_array($this->array_options) && count($this->array_options)>0)
7269
+        {
7270
+            $result=$this->insertExtraFields();
7271
+            if ($result < 0)
7272
+            {
7273
+                $error++;
7274
+            }
7275
+        }
6687 7276
 
6688
-						if ($nbbyrow > 0)
6689
-						{
6690
-							if ($nbphoto == 1) $return.= '<table width="100%" valign="top" align="center" border="0" cellpadding="2" cellspacing="2">';
7277
+        // Triggers
7278
+        if (! $error && ! $notrigger)
7279
+        {
7280
+            // Call triggers
7281
+            $result=$this->call_trigger(strtoupper(get_class($this)).'_MODIFY',$user);
7282
+            if ($result < 0) { $error++; } //Do also here what you must do to rollback action if trigger fail
7283
+            // End call triggers
7284
+        }
6691 7285
 
6692
-							if ($nbphoto % $nbbyrow == 1) $return.= '<tr align=center valign=middle border=1>';
6693
-							$return.= '<td width="'.ceil(100/$nbbyrow).'%" class="photo">';
6694
-						}
6695
-						else if ($nbbyrow < 0) $return .= '<div class="inline-block">';
7286
+        // Commit or rollback
7287
+        if ($error) {
7288
+            $this->db->rollback();
7289
+            return -1;
7290
+        } else {
7291
+            $this->db->commit();
7292
+            return $this->id;
7293
+        }
7294
+    }
6696 7295
 
6697
-						$return.= "\n";
7296
+    /**
7297
+     * Delete object in database
7298
+     *
7299
+     * @param 	User 	$user       			User that deletes
7300
+     * @param 	bool 	$notrigger  			false=launch triggers after, true=disable triggers
7301
+     * @param	int		$forcechilddeletion		0=no, 1=Force deletion of children
7302
+     * @return 	int             				<=0 if KO, >0 if OK
7303
+     */
7304
+    public function deleteCommon(User $user, $notrigger=false, $forcechilddeletion=0)
7305
+    {
7306
+        $error=0;
6698 7307
 
6699
-						$relativefile=preg_replace('/^\//', '', $pdir.$photo);
6700
-						if (empty($nolink))
6701
-						{
6702
-							$urladvanced=getAdvancedPreviewUrl($modulepart, $relativefile, 0, 'entity='.$this->entity);
6703
-							if ($urladvanced) $return.='<a href="'.$urladvanced.'">';
6704
-							else $return.= '<a href="'.DOL_URL_ROOT.'/viewimage.php?modulepart='.$modulepart.'&entity='.$this->entity.'&file='.urlencode($pdir.$photo).'" class="aphoto" target="_blank">';
6705
-						}
7308
+        $this->db->begin();
6706 7309
 
6707
-						// Show image (width height=$maxHeight)
6708
-						// Si fichier vignette disponible et image source trop grande, on utilise la vignette, sinon on utilise photo origine
6709
-						$alt=$langs->transnoentitiesnoconv('File').': '.$relativefile;
6710
-						$alt.=' - '.$langs->transnoentitiesnoconv('Size').': '.$imgarray['width'].'x'.$imgarray['height'];
6711
-						if ($notitle) $alt='';
6712
-
6713
-						if ($usesharelink)
6714
-						{
6715
-							if ($val['share'])
6716
-							{
6717
-								if (empty($maxHeight) || $photo_vignette && $imgarray['height'] > $maxHeight)
6718
-								{
6719
-									$return.= '<!-- Show original file (thumb not yet available with shared links) -->';
6720
-									$return.= '<img class="photo photowithmargin" border="0" height="'.$maxHeight.'" src="'.DOL_URL_ROOT.'/viewimage.php?hashp='.urlencode($val['share']).'" title="'.dol_escape_htmltag($alt).'">';
6721
-								}
6722
-								else {
6723
-									$return.= '<!-- Show original file -->';
6724
-									$return.= '<img class="photo photowithmargin" border="0" height="'.$maxHeight.'" src="'.DOL_URL_ROOT.'/viewimage.php?hashp='.urlencode($val['share']).'" title="'.dol_escape_htmltag($alt).'">';
6725
-								}
6726
-							}
6727
-							else
6728
-							{
6729
-								$return.= '<!-- Show nophoto file (because file is not shared) -->';
6730
-								$return.= '<img class="photo photowithmargin" border="0" height="'.$maxHeight.'" src="'.DOL_URL_ROOT.'/public/theme/common/nophoto.png" title="'.dol_escape_htmltag($alt).'">';
6731
-							}
6732
-						}
6733
-						else
6734
-						{
6735
-							if (empty($maxHeight) || $photo_vignette && $imgarray['height'] > $maxHeight)
6736
-							{
6737
-								$return.= '<!-- Show thumb -->';
6738
-								$return.= '<img class="photo photowithmargin" border="0" height="'.$maxHeight.'" src="'.DOL_URL_ROOT.'/viewimage.php?modulepart='.$modulepart.'&entity='.$this->entity.'&file='.urlencode($pdirthumb.$photo_vignette).'" title="'.dol_escape_htmltag($alt).'">';
6739
-							}
6740
-							else {
6741
-								$return.= '<!-- Show original file -->';
6742
-								$return.= '<img class="photo photowithmargin" border="0" height="'.$maxHeight.'" src="'.DOL_URL_ROOT.'/viewimage.php?modulepart='.$modulepart.'&entity='.$this->entity.'&file='.urlencode($pdir.$photo).'" title="'.dol_escape_htmltag($alt).'">';
6743
-							}
6744
-						}
7310
+        if ($forcechilddeletion)
7311
+        {
7312
+            foreach($this->childtables as $table)
7313
+            {
7314
+                $sql = 'DELETE FROM '.MAIN_DB_PREFIX.$table.' WHERE '.$this->fk_element.' = '.$this->id;
7315
+                $resql = $this->db->query($sql);
7316
+                if (! $resql)
7317
+                {
7318
+                    $this->error=$this->db->lasterror();
7319
+                    $this->errors[]=$this->error;
7320
+                    $this->db->rollback();
7321
+                    return -1;
7322
+                }
7323
+            }
7324
+        }
7325
+        elseif (! empty($this->fk_element) && ! empty($this->childtables))	// If object has childs linked with a foreign key field, we check all child tables.
7326
+        {
7327
+            $objectisused = $this->isObjectUsed($this->id);
7328
+            if (! empty($objectisused))
7329
+            {
7330
+                dol_syslog(get_class($this)."::deleteCommon Can't delete record as it has some child", LOG_WARNING);
7331
+                $this->error='ErrorRecordHasChildren';
7332
+                $this->errors[]=$this->error;
7333
+                $this->db->rollback();
7334
+                return 0;
7335
+            }
7336
+        }
6745 7337
 
6746
-						if (empty($nolink)) $return.= '</a>';
6747
-						$return.="\n";
6748
-
6749
-						if ($showfilename) $return.= '<br>'.$viewfilename;
6750
-						if ($showaction)
6751
-						{
6752
-							$return.= '<br>';
6753
-							// On propose la generation de la vignette si elle n'existe pas et si la taille est superieure aux limites
6754
-							if ($photo_vignette && (image_format_supported($photo) > 0) && ($this->imgWidth > $maxWidth || $this->imgHeight > $maxHeight))
6755
-							{
6756
-								$return.= '<a href="'.$_SERVER["PHP_SELF"].'?id='.$this->id.'&amp;action=addthumb&amp;file='.urlencode($pdir.$viewfilename).'">'.img_picto($langs->trans('GenerateThumb'),'refresh').'&nbsp;&nbsp;</a>';
6757
-							}
6758
-							// Special cas for product
6759
-							if ($modulepart == 'product' && ($user->rights->produit->creer || $user->rights->service->creer))
6760
-							{
6761
-								// Link to resize
6762
-								$return.= '<a href="'.DOL_URL_ROOT.'/core/photos_resize.php?modulepart='.urlencode('produit|service').'&id='.$this->id.'&amp;file='.urlencode($pdir.$viewfilename).'" title="'.dol_escape_htmltag($langs->trans("Resize")).'">'.img_picto($langs->trans("Resize"), 'resize', '').'</a> &nbsp; ';
6763
-
6764
-								// Link to delete
6765
-								$return.= '<a href="'.$_SERVER["PHP_SELF"].'?id='.$this->id.'&amp;action=delete&amp;file='.urlencode($pdir.$viewfilename).'">';
6766
-								$return.= img_delete().'</a>';
6767
-							}
6768
-						}
6769
-						$return.= "\n";
7338
+        if (! $error) {
7339
+            if (! $notrigger) {
7340
+                // Call triggers
7341
+                $result=$this->call_trigger(strtoupper(get_class($this)).'_DELETE', $user);
7342
+                if ($result < 0) { $error++; } // Do also here what you must do to rollback action if trigger fail
7343
+                // End call triggers
7344
+            }
7345
+        }
6770 7346
 
6771
-						if ($nbbyrow > 0)
6772
-						{
6773
-							$return.= '</td>';
6774
-							if (($nbphoto % $nbbyrow) == 0) $return.= '</tr>';
6775
-						}
6776
-						else if ($nbbyrow < 0) $return.='</div>';
6777
-					}
6778
-
6779
-					if (empty($size)) {     // Format origine
6780
-						$return.= '<img class="photo photowithmargin" border="0" src="'.DOL_URL_ROOT.'/viewimage.php?modulepart='.$modulepart.'&entity='.$this->entity.'&file='.urlencode($pdir.$photo).'">';
6781
-
6782
-						if ($showfilename) $return.= '<br>'.$viewfilename;
6783
-						if ($showaction)
6784
-						{
6785
-							// Special case for product
6786
-							if ($modulepart == 'product' && ($user->rights->produit->creer || $user->rights->service->creer))
6787
-							{
6788
-								// Link to resize
6789
-								$return.= '<a href="'.DOL_URL_ROOT.'/core/photos_resize.php?modulepart='.urlencode('produit|service').'&id='.$this->id.'&amp;file='.urlencode($pdir.$viewfilename).'" title="'.dol_escape_htmltag($langs->trans("Resize")).'">'.img_picto($langs->trans("Resize"), 'resize', '').'</a> &nbsp; ';
6790
-
6791
-								// Link to delete
6792
-								$return.= '<a href="'.$_SERVER["PHP_SELF"].'?id='.$this->id.'&amp;action=delete&amp;file='.urlencode($pdir.$viewfilename).'">';
6793
-								$return.= img_delete().'</a>';
6794
-							}
6795
-						}
6796
-					}
7347
+        if (! $error && ! empty($this->isextrafieldmanaged))
7348
+        {
7349
+            $sql = "DELETE FROM " . MAIN_DB_PREFIX . $this->table_element."_extrafields";
7350
+            $sql.= " WHERE fk_object=" . $this->id;
6797 7351
 
6798
-					// On continue ou on arrete de boucler ?
6799
-					if ($nbmax && $nbphoto >= $nbmax) break;
6800
-				}
6801
-			}
7352
+            $resql = $this->db->query($sql);
7353
+            if (! $resql)
7354
+            {
7355
+                $this->errors[] = $this->db->lasterror();
7356
+                $error++;
7357
+            }
7358
+        }
6802 7359
 
6803
-			if ($size==1 || $size=='small')
6804
-			{
6805
-				if ($nbbyrow > 0)
6806
-				{
6807
-					// Ferme tableau
6808
-					while ($nbphoto % $nbbyrow)
6809
-					{
6810
-						$return.= '<td width="'.ceil(100/$nbbyrow).'%">&nbsp;</td>';
6811
-						$nbphoto++;
6812
-					}
6813
-
6814
-					if ($nbphoto) $return.= '</table>';
6815
-				}
6816
-			}
6817
-		}
6818
-
6819
-		$this->nbphoto = $nbphoto;
6820
-
6821
-		return $return;
6822
-	}
6823
-
6824
-
6825
-	/**
6826
-	 * Function test if type is array
6827
-	 *
6828
-	 * @param   array   $info   content informations of field
6829
-	 * @return                  bool
6830
-	 */
6831
-	protected function isArray($info)
6832
-	{
6833
-		if(is_array($info))
6834
-		{
6835
-			if(isset($info['type']) && $info['type']=='array') return true;
6836
-			else return false;
6837
-		}
6838
-		else return false;
6839
-	}
6840
-
6841
-	/**
6842
-	 * Function test if type is null
6843
-	 *
6844
-	 * @param   array   $info   content informations of field
6845
-	 * @return                  bool
6846
-	 */
6847
-	protected function isNull($info)
6848
-	{
6849
-		if(is_array($info))
6850
-		{
6851
-			if(isset($info['type']) && $info['type']=='null') return true;
6852
-			else return false;
6853
-		}
6854
-		else return false;
6855
-	}
6856
-
6857
-	/**
6858
-	 * Function test if type is date
6859
-	 *
6860
-	 * @param   array   $info   content informations of field
6861
-	 * @return                  bool
6862
-	 */
6863
-	public function isDate($info)
6864
-	{
6865
-		if(isset($info['type']) && ($info['type']=='date' || $info['type']=='datetime' || $info['type']=='timestamp')) return true;
6866
-		else return false;
6867
-	}
6868
-
6869
-	/**
6870
-	 * Function test if type is integer
6871
-	 *
6872
-	 * @param   array   $info   content informations of field
6873
-	 * @return                  bool
6874
-	 */
6875
-	public function isInt($info)
6876
-	{
6877
-		if(is_array($info))
6878
-		{
6879
-			if(isset($info['type']) && ($info['type']=='int' || preg_match('/^integer/i',$info['type']) ) ) return true;
6880
-			else return false;
6881
-		}
6882
-		else return false;
6883
-	}
6884
-
6885
-	/**
6886
-	 * Function test if type is float
6887
-	 *
6888
-	 * @param   array   $info   content informations of field
6889
-	 * @return                  bool
6890
-	 */
6891
-	public function isFloat($info)
6892
-	{
6893
-		if(is_array($info))
6894
-		{
6895
-			if (isset($info['type']) && (preg_match('/^(double|real)/i', $info['type']))) return true;
6896
-			else return false;
6897
-		}
6898
-		else return false;
6899
-	}
6900
-
6901
-	/**
6902
-	 * Function test if type is text
6903
-	 *
6904
-	 * @param   array   $info   content informations of field
6905
-	 * @return                  bool
6906
-	 */
6907
-	public function isText($info)
6908
-	{
6909
-		if(is_array($info))
6910
-		{
6911
-			if(isset($info['type']) && $info['type']=='text') return true;
6912
-			else return false;
6913
-		}
6914
-		else return false;
6915
-	}
6916
-
6917
-	/**
6918
-	 * Function test if is indexed
6919
-	 *
6920
-	 * @param   array   $info   content informations of field
6921
-	 * @return                  bool
6922
-	 */
6923
-	protected function isIndex($info)
6924
-	{
6925
-		if(is_array($info))
6926
-		{
6927
-			if(isset($info['index']) && $info['index']==true) return true;
6928
-			else return false;
6929
-		}
6930
-		else return false;
6931
-	}
6932
-
6933
-	/**
6934
-	 * Function to prepare the values to insert.
6935
-	 * Note $this->${field} are set by the page that make the createCommon or the updateCommon.
6936
-	 *
6937
-	 * @return array
6938
-	 */
6939
-	protected function setSaveQuery()
6940
-	{
6941
-		global $conf;
6942
-
6943
-		$queryarray=array();
6944
-		foreach ($this->fields as $field=>$info)	// Loop on definition of fields
6945
-		{
6946
-			// Depending on field type ('datetime', ...)
6947
-			if($this->isDate($info))
6948
-			{
6949
-				if(empty($this->{$field}))
6950
-				{
6951
-					$queryarray[$field] = null;
6952
-				}
6953
-				else
6954
-				{
6955
-					$queryarray[$field] = $this->db->idate($this->{$field});
6956
-				}
6957
-			}
6958
-			else if($this->isArray($info))
6959
-			{
6960
-				if(! empty($this->{$field})) {
6961
-					if(! is_array($this->{$field})) {
6962
-						$this->{$field} = array($this->{$field});
6963
-					}
6964
-					$queryarray[$field] = serialize($this->{$field});
6965
-				} else {
6966
-					$queryarray[$field] = null;
6967
-				}
6968
-			}
6969
-			else if($this->isInt($info))
6970
-			{
6971
-				if ($field == 'entity' && is_null($this->{$field})) $queryarray[$field]=$conf->entity;
6972
-				else
6973
-				{
6974
-					$queryarray[$field] = (int) price2num($this->{$field});
6975
-					if (empty($queryarray[$field])) $queryarray[$field]=0;		// May be reset to null later if property 'notnull' is -1 for this field.
6976
-				}
6977
-			}
6978
-			else if($this->isFloat($info))
6979
-			{
6980
-				$queryarray[$field] = (double) price2num($this->{$field});
6981
-				if (empty($queryarray[$field])) $queryarray[$field]=0;
6982
-			}
6983
-			else
6984
-			{
6985
-				$queryarray[$field] = $this->{$field};
6986
-			}
7360
+        if (! $error)
7361
+        {
7362
+            $sql = 'DELETE FROM '.MAIN_DB_PREFIX.$this->table_element.' WHERE rowid='.$this->id;
6987 7363
 
6988
-			if ($info['type'] == 'timestamp' && empty($queryarray[$field])) unset($queryarray[$field]);
6989
-			if (! empty($info['notnull']) && $info['notnull'] == -1 && empty($queryarray[$field])) $queryarray[$field] = null;
6990
-		}
7364
+            $res = $this->db->query($sql);
7365
+            if($res===false) {
7366
+                $error++;
7367
+                $this->errors[] = $this->db->lasterror();
7368
+            }
7369
+        }
6991 7370
 
6992
-		return $queryarray;
6993
-	}
7371
+        // Commit or rollback
7372
+        if ($error) {
7373
+            $this->db->rollback();
7374
+            return -1;
7375
+        } else {
7376
+            $this->db->commit();
7377
+            return 1;
7378
+        }
7379
+    }
6994 7380
 
6995
-	/**
6996
-	 * Function to load data from a SQL pointer into properties of current object $this
6997
-	 *
6998
-	 * @param   stdClass    $obj    Contain data of object from database
7381
+    /**
7382
+     * Initialise object with example values
7383
+     * Id must be 0 if object instance is a specimen
7384
+     *
6999 7385
      * @return void
7000
-	 */
7001
-	protected function setVarsFromFetchObj(&$obj)
7002
-	{
7003
-		foreach ($this->fields as $field => $info)
7004
-		{
7005
-			if($this->isDate($info))
7006
-			{
7007
-				if(empty($obj->{$field}) || $obj->{$field} === '0000-00-00 00:00:00' || $obj->{$field} === '1000-01-01 00:00:00') $this->{$field} = 0;
7008
-				else $this->{$field} = strtotime($obj->{$field});
7009
-			}
7010
-			elseif($this->isArray($info))
7011
-			{
7012
-				if(! empty($obj->{$field})) {
7013
-					$this->{$field} = @unserialize($obj->{$field});
7014
-					// Hack for data not in UTF8
7015
-					if($this->{$field } === false) @unserialize(utf8_decode($obj->{$field}));
7016
-				} else {
7017
-					$this->{$field} = array();
7018
-				}
7019
-			}
7020
-			elseif($this->isInt($info))
7021
-			{
7022
-				if ($field == 'rowid') $this->id = (int) $obj->{$field};
7023
-				else $this->{$field} = (int) $obj->{$field};
7024
-			}
7025
-			elseif($this->isFloat($info))
7026
-			{
7027
-				$this->{$field} = (double) $obj->{$field};
7028
-			}
7029
-			elseif($this->isNull($info))
7030
-			{
7031
-				$val = $obj->{$field};
7032
-				// zero is not null
7033
-				$this->{$field} = (is_null($val) || (empty($val) && $val!==0 && $val!=='0') ? null : $val);
7034
-			}
7035
-			else
7036
-			{
7037
-				$this->{$field} = $obj->{$field};
7038
-			}
7039
-		}
7040
-
7041
-		// If there is no 'ref' field, we force property ->ref to ->id for a better compatibility with common functions.
7042
-		if (! isset($this->fields['ref']) && isset($this->id)) $this->ref = $this->id;
7043
-	}
7044
-
7045
-	/**
7046
-	 * Function to concat keys of fields
7047
-	 *
7048
-	 * @return string
7049
-	 */
7050
-	protected function getFieldList()
7051
-	{
7052
-		$keys = array_keys($this->fields);
7053
-		return implode(',', $keys);
7054
-	}
7055
-
7056
-	/**
7057
-	 * Add quote to field value if necessary
7058
-	 *
7059
-	 * @param 	string|int	$value			Value to protect
7060
-	 * @param	array		$fieldsentry	Properties of field
7061
-	 * @return 	string
7062
-	 */
7063
-    protected function quote($value, $fieldsentry)
7386
+     */
7387
+    public function initAsSpecimenCommon()
7064 7388
     {
7065
-		if (is_null($value)) return 'NULL';
7066
-		else if (preg_match('/^(int|double|real)/i', $fieldsentry['type'])) return $this->db->escape("$value");
7067
-		else return "'".$this->db->escape($value)."'";
7068
-	}
7069
-
7070
-
7071
-	/**
7072
-	 * Create object into database
7073
-	 *
7074
-	 * @param  User $user      User that creates
7075
-	 * @param  bool $notrigger false=launch triggers after, true=disable triggers
7076
-	 * @return int             <0 if KO, Id of created object if OK
7077
-	 */
7078
-	public function createCommon(User $user, $notrigger = false)
7079
-	{
7080
-		global $langs;
7081
-
7082
-		$error = 0;
7083
-
7084
-		$now=dol_now();
7085
-
7086
-		$fieldvalues = $this->setSaveQuery();
7087
-		if (array_key_exists('date_creation', $fieldvalues) && empty($fieldvalues['date_creation'])) $fieldvalues['date_creation']=$this->db->idate($now);
7088
-		if (array_key_exists('fk_user_creat', $fieldvalues) && ! ($fieldvalues['fk_user_creat'] > 0)) $fieldvalues['fk_user_creat']=$user->id;
7089
-		unset($fieldvalues['rowid']);	// The field 'rowid' is reserved field name for autoincrement field so we don't need it into insert.
7090
-
7091
-		$keys=array();
7092
-		$values = array();
7093
-		foreach ($fieldvalues as $k => $v) {
7094
-			$keys[$k] = $k;
7095
-			$value = $this->fields[$k];
7096
-			$values[$k] = $this->quote($v, $value);
7097
-		}
7098
-
7099
-		// Clean and check mandatory
7100
-		foreach($keys as $key)
7101
-		{
7102
-			// If field is an implicit foreign key field
7103
-			if (preg_match('/^integer:/i', $this->fields[$key]['type']) && $values[$key] == '-1') $values[$key]='';
7104
-			if (! empty($this->fields[$key]['foreignkey']) && $values[$key] == '-1') $values[$key]='';
7105
-
7106
-			//var_dump($key.'-'.$values[$key].'-'.($this->fields[$key]['notnull'] == 1));
7107
-			if (isset($this->fields[$key]['notnull']) && $this->fields[$key]['notnull'] == 1 && ! isset($values[$key]) && is_null($val['default']))
7108
-			{
7109
-				$error++;
7110
-				$this->errors[]=$langs->trans("ErrorFieldRequired", $this->fields[$key]['label']);
7111
-			}
7112
-
7113
-			// If field is an implicit foreign key field
7114
-			if (preg_match('/^integer:/i', $this->fields[$key]['type']) && empty($values[$key])) $values[$key]='null';
7115
-			if (! empty($this->fields[$key]['foreignkey']) && empty($values[$key])) $values[$key]='null';
7116
-		}
7117
-
7118
-		if ($error) return -1;
7119
-
7120
-		$this->db->begin();
7389
+        $this->id = 0;
7121 7390
 
7122
-		if (! $error)
7123
-		{
7124
-			$sql = 'INSERT INTO '.MAIN_DB_PREFIX.$this->table_element;
7125
-			$sql.= ' ('.implode( ", ", $keys ).')';
7126
-			$sql.= ' VALUES ('.implode( ", ", $values ).')';
7391
+        // TODO...
7392
+    }
7127 7393
 
7128
-			$res = $this->db->query($sql);
7129
-			if ($res===false) {
7130
-				$error++;
7131
-				$this->errors[] = $this->db->lasterror();
7132
-			}
7133
-		}
7134
-
7135
-		if (! $error)
7136
-		{
7137
-			$this->id = $this->db->last_insert_id(MAIN_DB_PREFIX . $this->table_element);
7138
-		}
7139
-
7140
-		// Create extrafields
7141
-		if (! $error)
7142
-		{
7143
-			$result=$this->insertExtraFields();
7144
-			if ($result < 0) $error++;
7145
-		}
7146
-
7147
-		// Triggers
7148
-		if (! $error && ! $notrigger)
7149
-		{
7150
-			// Call triggers
7151
-			$result=$this->call_trigger(strtoupper(get_class($this)).'_CREATE',$user);
7152
-			if ($result < 0) { $error++; }
7153
-			// End call triggers
7154
-		}
7155
-
7156
-		// Commit or rollback
7157
-		if ($error) {
7158
-			$this->db->rollback();
7159
-			return -1;
7160
-		} else {
7161
-			$this->db->commit();
7162
-			return $this->id;
7163
-		}
7164
-	}
7165
-
7166
-
7167
-	/**
7168
-	 * Load object in memory from the database
7169
-	 *
7170
-	 * @param	int    $id				Id object
7171
-	 * @param	string $ref				Ref
7172
-	 * @param	string	$morewhere		More SQL filters (' AND ...')
7173
-	 * @return 	int         			<0 if KO, 0 if not found, >0 if OK
7174
-	 */
7175
-	public function fetchCommon($id, $ref = null, $morewhere = '')
7176
-	{
7177
-		if (empty($id) && empty($ref) && empty($morewhere)) return -1;
7178
-
7179
-		$sql = 'SELECT '.$this->getFieldList();
7180
-		$sql.= ' FROM '.MAIN_DB_PREFIX.$this->table_element;
7181
-
7182
-		if (!empty($id))  $sql.= ' WHERE rowid = '.$id;
7183
-		elseif (!empty($ref)) $sql.= " WHERE ref = ".$this->quote($ref, $this->fields['ref']);
7184
-		else $sql.=' WHERE 1 = 1';	// usage with empty id and empty ref is very rare
7185
-		if ($morewhere)   $sql.= $morewhere;
7186
-		$sql.=' LIMIT 1';	// This is a fetch, to be sure to get only one record
7187
-
7188
-		$res = $this->db->query($sql);
7189
-		if ($res)
7190
-		{
7191
-			$obj = $this->db->fetch_object($res);
7192
-			if ($obj)
7193
-			{
7194
-				$this->setVarsFromFetchObj($obj);
7195
-				return $this->id;
7196
-			}
7197
-			else
7198
-			{
7199
-				return 0;
7200
-			}
7201
-		}
7202
-		else
7203
-		{
7204
-			$this->error = $this->db->lasterror();
7205
-			$this->errors[] = $this->error;
7206
-			return -1;
7207
-		}
7208
-	}
7209
-
7210
-	/**
7211
-	 * Update object into database
7212
-	 *
7213
-	 * @param  User $user      	User that modifies
7214
-	 * @param  bool $notrigger 	false=launch triggers after, true=disable triggers
7215
-	 * @return int             	<0 if KO, >0 if OK
7216
-	 */
7217
-	public function updateCommon(User $user, $notrigger = false)
7218
-	{
7219
-		global $conf, $langs;
7220
-
7221
-		$error = 0;
7222
-
7223
-		$now=dol_now();
7224
-
7225
-		$fieldvalues = $this->setSaveQuery();
7226
-		if (array_key_exists('date_modification', $fieldvalues) && empty($fieldvalues['date_modification'])) $fieldvalues['date_modification']=$this->db->idate($now);
7227
-		if (array_key_exists('fk_user_modif', $fieldvalues) && ! ($fieldvalues['fk_user_modif'] > 0)) $fieldvalues['fk_user_modif']=$user->id;
7228
-		unset($fieldvalues['rowid']);	// The field 'rowid' is reserved field name for autoincrement field so we don't need it into update.
7229
-
7230
-		$keys=array();
7231
-		$values = array();
7232
-		foreach ($fieldvalues as $k => $v) {
7233
-			$keys[$k] = $k;
7234
-			$value = $this->fields[$k];
7235
-			$values[$k] = $this->quote($v, $value);
7236
-			$tmp[] = $k.'='.$this->quote($v, $this->fields[$k]);
7237
-		}
7238
-
7239
-		// Clean and check mandatory
7240
-		foreach($keys as $key)
7241
-		{
7242
-			if (preg_match('/^integer:/i', $this->fields[$key]['type']) && $values[$key] == '-1') $values[$key]='';		// This is an implicit foreign key field
7243
-			if (! empty($this->fields[$key]['foreignkey']) && $values[$key] == '-1') $values[$key]='';					// This is an explicit foreign key field
7244
-
7245
-			//var_dump($key.'-'.$values[$key].'-'.($this->fields[$key]['notnull'] == 1));
7246
-			/*
7247
-			if ($this->fields[$key]['notnull'] == 1 && empty($values[$key]))
7248
-			{
7249
-				$error++;
7250
-				$this->errors[]=$langs->trans("ErrorFieldRequired", $this->fields[$key]['label']);
7251
-			}*/
7252
-		}
7253 7394
 
7254
-		$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element.' SET '.implode( ',', $tmp ).' WHERE rowid='.$this->id ;
7395
+    /* Part for comments */
7255 7396
 
7256
-		$this->db->begin();
7257
-		if (! $error)
7258
-		{
7259
-			$res = $this->db->query($sql);
7260
-			if ($res===false)
7261
-			{
7262
-				$error++;
7263
-				$this->errors[] = $this->db->lasterror();
7264
-			}
7265
-		}
7266
-
7267
-		// Update extrafield
7268
-		if (! $error && empty($conf->global->MAIN_EXTRAFIELDS_DISABLED) && is_array($this->array_options) && count($this->array_options)>0)
7269
-		{
7270
-			$result=$this->insertExtraFields();
7271
-			if ($result < 0)
7272
-			{
7273
-				$error++;
7274
-			}
7275
-		}
7276
-
7277
-		// Triggers
7278
-		if (! $error && ! $notrigger)
7279
-		{
7280
-			// Call triggers
7281
-			$result=$this->call_trigger(strtoupper(get_class($this)).'_MODIFY',$user);
7282
-			if ($result < 0) { $error++; } //Do also here what you must do to rollback action if trigger fail
7283
-			// End call triggers
7284
-		}
7285
-
7286
-		// Commit or rollback
7287
-		if ($error) {
7288
-			$this->db->rollback();
7289
-			return -1;
7290
-		} else {
7291
-			$this->db->commit();
7292
-			return $this->id;
7293
-		}
7294
-	}
7295
-
7296
-	/**
7297
-	 * Delete object in database
7298
-	 *
7299
-	 * @param 	User 	$user       			User that deletes
7300
-	 * @param 	bool 	$notrigger  			false=launch triggers after, true=disable triggers
7301
-	 * @param	int		$forcechilddeletion		0=no, 1=Force deletion of children
7302
-	 * @return 	int             				<=0 if KO, >0 if OK
7303
-	 */
7304
-	public function deleteCommon(User $user, $notrigger=false, $forcechilddeletion=0)
7305
-	{
7306
-		$error=0;
7307
-
7308
-		$this->db->begin();
7309
-
7310
-		if ($forcechilddeletion)
7311
-		{
7312
-			foreach($this->childtables as $table)
7313
-			{
7314
-				$sql = 'DELETE FROM '.MAIN_DB_PREFIX.$table.' WHERE '.$this->fk_element.' = '.$this->id;
7315
-				$resql = $this->db->query($sql);
7316
-				if (! $resql)
7317
-				{
7318
-					$this->error=$this->db->lasterror();
7319
-					$this->errors[]=$this->error;
7320
-					$this->db->rollback();
7321
-					return -1;
7322
-				}
7323
-			}
7324
-		}
7325
-		elseif (! empty($this->fk_element) && ! empty($this->childtables))	// If object has childs linked with a foreign key field, we check all child tables.
7326
-		{
7327
-			$objectisused = $this->isObjectUsed($this->id);
7328
-			if (! empty($objectisused))
7329
-			{
7330
-				dol_syslog(get_class($this)."::deleteCommon Can't delete record as it has some child", LOG_WARNING);
7331
-				$this->error='ErrorRecordHasChildren';
7332
-				$this->errors[]=$this->error;
7333
-				$this->db->rollback();
7334
-				return 0;
7335
-			}
7336
-		}
7337
-
7338
-		if (! $error) {
7339
-			if (! $notrigger) {
7340
-				// Call triggers
7341
-				$result=$this->call_trigger(strtoupper(get_class($this)).'_DELETE', $user);
7342
-				if ($result < 0) { $error++; } // Do also here what you must do to rollback action if trigger fail
7343
-				// End call triggers
7344
-			}
7345
-		}
7346
-
7347
-		if (! $error && ! empty($this->isextrafieldmanaged))
7348
-		{
7349
-			$sql = "DELETE FROM " . MAIN_DB_PREFIX . $this->table_element."_extrafields";
7350
-			$sql.= " WHERE fk_object=" . $this->id;
7351
-
7352
-			$resql = $this->db->query($sql);
7353
-			if (! $resql)
7354
-			{
7355
-				$this->errors[] = $this->db->lasterror();
7356
-				$error++;
7357
-			}
7358
-		}
7397
+    /**
7398
+     * Load comments linked with current task
7399
+     *	@return boolean	1 if ok
7400
+     */
7401
+    public function fetchComments()
7402
+    {
7403
+        require_once DOL_DOCUMENT_ROOT.'/core/class/comment.class.php';
7359 7404
 
7360
-		if (! $error)
7361
-		{
7362
-			$sql = 'DELETE FROM '.MAIN_DB_PREFIX.$this->table_element.' WHERE rowid='.$this->id;
7405
+        $comment = new Comment($this->db);
7406
+        $result=$comment->fetchAllFor($this->element, $this->id);
7407
+        if ($result<0) {
7408
+            $this->errors=array_merge($this->errors, $comment->errors);
7409
+            return -1;
7410
+        } else {
7411
+            $this->comments = $comment->comments;
7412
+        }
7413
+        return count($this->comments);
7414
+    }
7363 7415
 
7364
-			$res = $this->db->query($sql);
7365
-			if($res===false) {
7366
-				$error++;
7367
-				$this->errors[] = $this->db->lasterror();
7368
-			}
7369
-		}
7370
-
7371
-		// Commit or rollback
7372
-		if ($error) {
7373
-			$this->db->rollback();
7374
-			return -1;
7375
-		} else {
7376
-			$this->db->commit();
7377
-			return 1;
7378
-		}
7379
-	}
7380
-
7381
-	/**
7382
-	 * Initialise object with example values
7383
-	 * Id must be 0 if object instance is a specimen
7384
-	 *
7385
-	 * @return void
7386
-	 */
7387
-	public function initAsSpecimenCommon()
7388
-	{
7389
-		$this->id = 0;
7390
-
7391
-		// TODO...
7392
-	}
7393
-
7394
-
7395
-	/* Part for comments */
7396
-
7397
-	/**
7398
-	 * Load comments linked with current task
7399
-	 *	@return boolean	1 if ok
7400
-	 */
7401
-	public function fetchComments()
7402
-	{
7403
-		require_once DOL_DOCUMENT_ROOT.'/core/class/comment.class.php';
7404
-
7405
-		$comment = new Comment($this->db);
7406
-		$result=$comment->fetchAllFor($this->element, $this->id);
7407
-		if ($result<0) {
7408
-			$this->errors=array_merge($this->errors, $comment->errors);
7409
-			return -1;
7410
-		} else {
7411
-			$this->comments = $comment->comments;
7412
-		}
7413
-		return count($this->comments);
7414
-	}
7415
-
7416
-	/**
7417
-	 * Return nb comments already posted
7418
-	 *
7419
-	 * @return int
7420
-	 */
7421
-	public function getNbComments()
7422
-	{
7423
-		return count($this->comments);
7424
-	}
7416
+    /**
7417
+     * Return nb comments already posted
7418
+     *
7419
+     * @return int
7420
+     */
7421
+    public function getNbComments()
7422
+    {
7423
+        return count($this->comments);
7424
+    }
7425 7425
 
7426 7426
     /**
7427 7427
      * Trim object parameters
Please login to merge, or discard this patch.
Spacing   +1526 added lines, -1526 removed lines patch added patch discarded remove patch
@@ -60,7 +60,7 @@  discard block
 block discarded – undo
60 60
 	/**
61 61
 	 * @var string[]	Array of error strings
62 62
 	 */
63
-	public $errors=array();
63
+	public $errors = array();
64 64
 
65 65
 	/**
66 66
 	 * @var string ID to identify managed object
@@ -75,7 +75,7 @@  discard block
 block discarded – undo
75 75
 	/**
76 76
 	 * @var int    Name of subtable line
77 77
 	 */
78
-	public $table_element_line='';
78
+	public $table_element_line = '';
79 79
 
80 80
 	/**
81 81
 	 * @var string		Key value used to track if data is coming from import wizard
@@ -85,7 +85,7 @@  discard block
 block discarded – undo
85 85
 	/**
86 86
 	 * @var mixed		Contains data to manage extrafields
87 87
 	 */
88
-	public $array_options=array();
88
+	public $array_options = array();
89 89
 
90 90
 	/**
91 91
 	 * @var int[][]		Array of linked objects ids. Loaded by ->fetchObjectLinked
@@ -114,7 +114,7 @@  discard block
 block discarded – undo
114 114
 	/**
115 115
 	 * @var array<string,mixed>		Can be used to pass information when only object is provided to method
116 116
 	 */
117
-	public $context=array();
117
+	public $context = array();
118 118
 
119 119
 	/**
120 120
 	 * @var string		Contains canvas name if record is an alternative canvas record
@@ -374,7 +374,7 @@  discard block
 block discarded – undo
374 374
 	 * @var mixed		Contains comments
375 375
 	 * @see fetchComments()
376 376
 	 */
377
-	public $comments=array();
377
+	public $comments = array();
378 378
 
379 379
 	/**
380 380
 	 * @var int
@@ -400,9 +400,9 @@  discard block
 block discarded – undo
400 400
 	public $civility_id;
401 401
 
402 402
 	// Dates
403
-	public $date_creation;			// Date creation
404
-	public $date_validation;		// Date validation
405
-	public $date_modification;		// Date last change (tms field)
403
+	public $date_creation; // Date creation
404
+	public $date_validation; // Date validation
405
+	public $date_modification; // Date last change (tms field)
406 406
 
407 407
 
408 408
 
@@ -418,29 +418,29 @@  discard block
 block discarded – undo
418 418
 	 *  @param	string	$ref_ext	Ref ext of object to check
419 419
 	 *  @return int     			<0 if KO, 0 if OK but not found, >0 if OK and exists
420 420
 	 */
421
-	static function isExistingObject($element, $id, $ref='', $ref_ext='')
421
+	static function isExistingObject($element, $id, $ref = '', $ref_ext = '')
422 422
 	{
423
-		global $db,$conf;
423
+		global $db, $conf;
424 424
 
425 425
 		$sql = "SELECT rowid, ref, ref_ext";
426
-		$sql.= " FROM ".MAIN_DB_PREFIX.$element;
427
-		$sql.= " WHERE entity IN (".getEntity($element).")" ;
426
+		$sql .= " FROM ".MAIN_DB_PREFIX.$element;
427
+		$sql .= " WHERE entity IN (".getEntity($element).")";
428 428
 
429
-		if ($id > 0) $sql.= " AND rowid = ".$db->escape($id);
430
-		else if ($ref) $sql.= " AND ref = '".$db->escape($ref)."'";
431
-		else if ($ref_ext) $sql.= " AND ref_ext = '".$db->escape($ref_ext)."'";
429
+		if ($id > 0) $sql .= " AND rowid = ".$db->escape($id);
430
+		else if ($ref) $sql .= " AND ref = '".$db->escape($ref)."'";
431
+		else if ($ref_ext) $sql .= " AND ref_ext = '".$db->escape($ref_ext)."'";
432 432
 		else {
433
-			$error='ErrorWrongParameters';
433
+			$error = 'ErrorWrongParameters';
434 434
 			dol_print_error(get_class()."::isExistingObject ".$error, LOG_ERR);
435 435
 			return -1;
436 436
 		}
437
-		if ($ref || $ref_ext) $sql.= " AND entity = ".$conf->entity;
437
+		if ($ref || $ref_ext) $sql .= " AND entity = ".$conf->entity;
438 438
 
439 439
 		dol_syslog(get_class()."::isExistingObject", LOG_DEBUG);
440 440
 		$resql = $db->query($sql);
441 441
 		if ($resql)
442 442
 		{
443
-			$num=$db->num_rows($resql);
443
+			$num = $db->num_rows($resql);
444 444
 			if ($num > 0) return 1;
445 445
 			else return 0;
446 446
 		}
@@ -454,7 +454,7 @@  discard block
 block discarded – undo
454 454
 	 */
455 455
 	function errorsToString()
456 456
 	{
457
-		return $this->error.(is_array($this->errors)?(($this->error!=''?', ':'').join(', ',$this->errors)):'');
457
+		return $this->error.(is_array($this->errors) ? (($this->error != '' ? ', ' : '').join(', ', $this->errors)) : '');
458 458
 	}
459 459
 
460 460
 	/**
@@ -466,23 +466,23 @@  discard block
 block discarded – undo
466 466
 	 * 	@param	int			$maxlen			Maximum length
467 467
 	 * 	@return	string						String with full name
468 468
 	 */
469
-	function getFullName($langs,$option=0,$nameorder=-1,$maxlen=0)
469
+	function getFullName($langs, $option = 0, $nameorder = -1, $maxlen = 0)
470 470
 	{
471 471
 		//print "lastname=".$this->lastname." name=".$this->name." nom=".$this->nom."<br>\n";
472
-		$lastname=$this->lastname;
473
-		$firstname=$this->firstname;
474
-		if (empty($lastname))  $lastname=(isset($this->lastname)?$this->lastname:(isset($this->name)?$this->name:(isset($this->nom)?$this->nom:(isset($this->societe)?$this->societe:(isset($this->company)?$this->company:'')))));
472
+		$lastname = $this->lastname;
473
+		$firstname = $this->firstname;
474
+		if (empty($lastname))  $lastname = (isset($this->lastname) ? $this->lastname : (isset($this->name) ? $this->name : (isset($this->nom) ? $this->nom : (isset($this->societe) ? $this->societe : (isset($this->company) ? $this->company : '')))));
475 475
 
476
-		$ret='';
476
+		$ret = '';
477 477
 		if ($option && $this->civility_id)
478 478
 		{
479
-			if ($langs->transnoentitiesnoconv("Civility".$this->civility_id)!="Civility".$this->civility_id) $ret.=$langs->transnoentitiesnoconv("Civility".$this->civility_id).' ';
480
-			else $ret.=$this->civility_id.' ';
479
+			if ($langs->transnoentitiesnoconv("Civility".$this->civility_id) != "Civility".$this->civility_id) $ret .= $langs->transnoentitiesnoconv("Civility".$this->civility_id).' ';
480
+			else $ret .= $this->civility_id.' ';
481 481
 		}
482 482
 
483
-		$ret.=dolGetFirstLastname($firstname, $lastname, $nameorder);
483
+		$ret .= dolGetFirstLastname($firstname, $lastname, $nameorder);
484 484
 
485
-		return dol_trunc($ret,$maxlen);
485
+		return dol_trunc($ret, $maxlen);
486 486
 	}
487 487
 
488 488
 	/**
@@ -493,24 +493,24 @@  discard block
 block discarded – undo
493 493
 	 *  @param		int		    $withregion			1=Add region into address string
494 494
 	 *	@return		string							Full address string
495 495
 	 */
496
-	function getFullAddress($withcountry=0, $sep="\n", $withregion=0)
496
+	function getFullAddress($withcountry = 0, $sep = "\n", $withregion = 0)
497 497
 	{
498 498
 		if ($withcountry && $this->country_id && (empty($this->country_code) || empty($this->country)))
499 499
 		{
500
-			require_once DOL_DOCUMENT_ROOT .'/core/lib/company.lib.php';
501
-			$tmparray=getCountry($this->country_id,'all');
502
-			$this->country_code=$tmparray['code'];
503
-			$this->country     =$tmparray['label'];
500
+			require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
501
+			$tmparray = getCountry($this->country_id, 'all');
502
+			$this->country_code = $tmparray['code'];
503
+			$this->country     = $tmparray['label'];
504 504
 		}
505 505
 
506 506
         if ($withregion && $this->state_id && (empty($this->state_code) || empty($this->state) || empty($this->region) || empty($this->region_cpde)))
507 507
     	{
508
-    		require_once DOL_DOCUMENT_ROOT .'/core/lib/company.lib.php';
509
-    		$tmparray=getState($this->state_id,'all',0,1);
510
-			$this->state_code   =$tmparray['code'];
511
-			$this->state        =$tmparray['label'];
512
-			$this->region_code  =$tmparray['region_code'];
513
-			$this->region       =$tmparray['region'];
508
+    		require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
509
+    		$tmparray = getState($this->state_id, 'all', 0, 1);
510
+			$this->state_code   = $tmparray['code'];
511
+			$this->state        = $tmparray['label'];
512
+			$this->region_code  = $tmparray['region_code'];
513
+			$this->region       = $tmparray['region'];
514 514
         }
515 515
 
516 516
 		return dol_format_address($this, $withcountry, $sep);
@@ -528,108 +528,108 @@  discard block
 block discarded – undo
528 528
 	{
529 529
 		global $conf, $langs;
530 530
 
531
-		$countriesusingstate=array('AU','US','IN','GB','ES','UK','TR');    // See also option MAIN_FORCE_STATE_INTO_ADDRESS
531
+		$countriesusingstate = array('AU', 'US', 'IN', 'GB', 'ES', 'UK', 'TR'); // See also option MAIN_FORCE_STATE_INTO_ADDRESS
532 532
 
533
-		$contactid=0;
534
-		$thirdpartyid=0;
533
+		$contactid = 0;
534
+		$thirdpartyid = 0;
535 535
 		if ($this->element == 'societe')
536 536
 		{
537
-			$thirdpartyid=$this->id;
537
+			$thirdpartyid = $this->id;
538 538
 		}
539 539
 		if ($this->element == 'contact')
540 540
 		{
541
-			$contactid=$this->id;
542
-			$thirdpartyid=$object->fk_soc;
541
+			$contactid = $this->id;
542
+			$thirdpartyid = $object->fk_soc;
543 543
 		}
544 544
 		if ($this->element == 'user')
545 545
 		{
546
-			$contactid=$this->contact_id;
547
-			$thirdpartyid=$object->fk_soc;
546
+			$contactid = $this->contact_id;
547
+			$thirdpartyid = $object->fk_soc;
548 548
 		}
549 549
 
550
-		$out='<!-- BEGIN part to show address block -->';
550
+		$out = '<!-- BEGIN part to show address block -->';
551 551
 
552
-		$outdone=0;
553
-		$coords = $this->getFullAddress(1,', ',$conf->global->MAIN_SHOW_REGION_IN_STATE_SELECT);
552
+		$outdone = 0;
553
+		$coords = $this->getFullAddress(1, ', ', $conf->global->MAIN_SHOW_REGION_IN_STATE_SELECT);
554 554
 		if ($coords)
555 555
 		{
556
-			if (! empty($conf->use_javascript_ajax))
556
+			if (!empty($conf->use_javascript_ajax))
557 557
 			{
558
-				$namecoords = $this->getFullName($langs,1).'<br>'.$coords;
558
+				$namecoords = $this->getFullName($langs, 1).'<br>'.$coords;
559 559
 				// hideonsmatphone because copyToClipboard call jquery dialog that does not work with jmobile
560
-				$out.='<a href="#" class="hideonsmartphone" onclick="return copyToClipboard(\''.dol_escape_js($namecoords).'\',\''.dol_escape_js($langs->trans("HelpCopyToClipboard")).'\');">';
561
-				$out.=img_picto($langs->trans("Address"), 'object_address.png');
562
-				$out.='</a> ';
560
+				$out .= '<a href="#" class="hideonsmartphone" onclick="return copyToClipboard(\''.dol_escape_js($namecoords).'\',\''.dol_escape_js($langs->trans("HelpCopyToClipboard")).'\');">';
561
+				$out .= img_picto($langs->trans("Address"), 'object_address.png');
562
+				$out .= '</a> ';
563 563
 			}
564
-			$out.=dol_print_address($coords, 'address_'.$htmlkey.'_'.$this->id, $this->element, $this->id, 1, ', '); $outdone++;
564
+			$out .= dol_print_address($coords, 'address_'.$htmlkey.'_'.$this->id, $this->element, $this->id, 1, ', '); $outdone++;
565 565
 			$outdone++;
566 566
 		}
567 567
 
568
-		if (! in_array($this->country_code,$countriesusingstate) && empty($conf->global->MAIN_FORCE_STATE_INTO_ADDRESS)   // If MAIN_FORCE_STATE_INTO_ADDRESS is on, state is already returned previously with getFullAddress
568
+		if (!in_array($this->country_code, $countriesusingstate) && empty($conf->global->MAIN_FORCE_STATE_INTO_ADDRESS)   // If MAIN_FORCE_STATE_INTO_ADDRESS is on, state is already returned previously with getFullAddress
569 569
 				&& empty($conf->global->SOCIETE_DISABLE_STATE) && $this->state)
570 570
 		{
571 571
             if (!empty($conf->global->MAIN_SHOW_REGION_IN_STATE_SELECT) && $conf->global->MAIN_SHOW_REGION_IN_STATE_SELECT == 1 && $this->region) {
572
-                $out.=($outdone?' - ':'').$this->region.' - '.$this->state;
572
+                $out .= ($outdone ? ' - ' : '').$this->region.' - '.$this->state;
573 573
             }
574 574
             else {
575
-                $out.=($outdone?' - ':'').$this->state;
575
+                $out .= ($outdone ? ' - ' : '').$this->state;
576 576
             }
577 577
 			$outdone++;
578 578
 		}
579 579
 
580
-		if (! empty($this->phone) || ! empty($this->phone_pro) || ! empty($this->phone_mobile) || ! empty($this->phone_perso) || ! empty($this->fax) || ! empty($this->office_phone) || ! empty($this->user_mobile) || ! empty($this->office_fax)) $out.=($outdone?'<br>':'');
581
-		if (! empty($this->phone) && empty($this->phone_pro)) {		// For objects that store pro phone into ->phone
582
-			$out.=dol_print_phone($this->phone,$this->country_code,$contactid,$thirdpartyid,'AC_TEL','&nbsp;','phone',$langs->trans("PhonePro")); $outdone++;
580
+		if (!empty($this->phone) || !empty($this->phone_pro) || !empty($this->phone_mobile) || !empty($this->phone_perso) || !empty($this->fax) || !empty($this->office_phone) || !empty($this->user_mobile) || !empty($this->office_fax)) $out .= ($outdone ? '<br>' : '');
581
+		if (!empty($this->phone) && empty($this->phone_pro)) {		// For objects that store pro phone into ->phone
582
+			$out .= dol_print_phone($this->phone, $this->country_code, $contactid, $thirdpartyid, 'AC_TEL', '&nbsp;', 'phone', $langs->trans("PhonePro")); $outdone++;
583 583
 		}
584
-		if (! empty($this->phone_pro)) {
585
-			$out.=dol_print_phone($this->phone_pro,$this->country_code,$contactid,$thirdpartyid,'AC_TEL','&nbsp;','phone',$langs->trans("PhonePro")); $outdone++;
584
+		if (!empty($this->phone_pro)) {
585
+			$out .= dol_print_phone($this->phone_pro, $this->country_code, $contactid, $thirdpartyid, 'AC_TEL', '&nbsp;', 'phone', $langs->trans("PhonePro")); $outdone++;
586 586
 		}
587
-		if (! empty($this->phone_mobile)) {
588
-			$out.=dol_print_phone($this->phone_mobile,$this->country_code,$contactid,$thirdpartyid,'AC_TEL','&nbsp;','mobile',$langs->trans("PhoneMobile")); $outdone++;
587
+		if (!empty($this->phone_mobile)) {
588
+			$out .= dol_print_phone($this->phone_mobile, $this->country_code, $contactid, $thirdpartyid, 'AC_TEL', '&nbsp;', 'mobile', $langs->trans("PhoneMobile")); $outdone++;
589 589
 		}
590
-		if (! empty($this->phone_perso)) {
591
-			$out.=dol_print_phone($this->phone_perso,$this->country_code,$contactid,$thirdpartyid,'AC_TEL','&nbsp;','phone',$langs->trans("PhonePerso")); $outdone++;
590
+		if (!empty($this->phone_perso)) {
591
+			$out .= dol_print_phone($this->phone_perso, $this->country_code, $contactid, $thirdpartyid, 'AC_TEL', '&nbsp;', 'phone', $langs->trans("PhonePerso")); $outdone++;
592 592
 		}
593
-		if (! empty($this->office_phone)) {
594
-			$out.=dol_print_phone($this->office_phone,$this->country_code,$contactid,$thirdpartyid,'AC_TEL','&nbsp;','phone',$langs->trans("PhonePro")); $outdone++;
593
+		if (!empty($this->office_phone)) {
594
+			$out .= dol_print_phone($this->office_phone, $this->country_code, $contactid, $thirdpartyid, 'AC_TEL', '&nbsp;', 'phone', $langs->trans("PhonePro")); $outdone++;
595 595
 		}
596
-		if (! empty($this->user_mobile)) {
597
-			$out.=dol_print_phone($this->user_mobile,$this->country_code,$contactid,$thirdpartyid,'AC_TEL','&nbsp;','mobile',$langs->trans("PhoneMobile")); $outdone++;
596
+		if (!empty($this->user_mobile)) {
597
+			$out .= dol_print_phone($this->user_mobile, $this->country_code, $contactid, $thirdpartyid, 'AC_TEL', '&nbsp;', 'mobile', $langs->trans("PhoneMobile")); $outdone++;
598 598
 		}
599
-		if (! empty($this->fax)) {
600
-			$out.=dol_print_phone($this->fax,$this->country_code,$contactid,$thirdpartyid,'AC_FAX','&nbsp;','fax',$langs->trans("Fax")); $outdone++;
599
+		if (!empty($this->fax)) {
600
+			$out .= dol_print_phone($this->fax, $this->country_code, $contactid, $thirdpartyid, 'AC_FAX', '&nbsp;', 'fax', $langs->trans("Fax")); $outdone++;
601 601
 		}
602
-		if (! empty($this->office_fax)) {
603
-			$out.=dol_print_phone($this->office_fax,$this->country_code,$contactid,$thirdpartyid,'AC_FAX','&nbsp;','fax',$langs->trans("Fax")); $outdone++;
602
+		if (!empty($this->office_fax)) {
603
+			$out .= dol_print_phone($this->office_fax, $this->country_code, $contactid, $thirdpartyid, 'AC_FAX', '&nbsp;', 'fax', $langs->trans("Fax")); $outdone++;
604 604
 		}
605 605
 
606
-		$out.='<div style="clear: both;"></div>';
607
-		$outdone=0;
608
-		if (! empty($this->email))
606
+		$out .= '<div style="clear: both;"></div>';
607
+		$outdone = 0;
608
+		if (!empty($this->email))
609 609
 		{
610
-			$out.=dol_print_email($this->email,$this->id,$object->id,'AC_EMAIL',0,0,1);
610
+			$out .= dol_print_email($this->email, $this->id, $object->id, 'AC_EMAIL', 0, 0, 1);
611 611
 			$outdone++;
612 612
 		}
613
-		if (! empty($this->url))
613
+		if (!empty($this->url))
614 614
 		{
615
-			$out.=dol_print_url($this->url,'_goout',0,1);
615
+			$out .= dol_print_url($this->url, '_goout', 0, 1);
616 616
 			$outdone++;
617 617
 		}
618
-		$out.='<div style="clear: both;">';
619
-		if (! empty($conf->socialnetworks->enabled))
618
+		$out .= '<div style="clear: both;">';
619
+		if (!empty($conf->socialnetworks->enabled))
620 620
 		{
621
-			if ($this->skype) $out.=dol_print_socialnetworks($this->skype,$this->id,$object->id,'skype');
621
+			if ($this->skype) $out .= dol_print_socialnetworks($this->skype, $this->id, $object->id, 'skype');
622 622
 			$outdone++;
623
-			if ($this->jabberid) $out.=dol_print_socialnetworks($this->jabberid,$this->id,$object->id,'jabber');
623
+			if ($this->jabberid) $out .= dol_print_socialnetworks($this->jabberid, $this->id, $object->id, 'jabber');
624 624
 			$outdone++;
625
-			if ($this->twitter) $out.=dol_print_socialnetworks($this->twitter,$this->id,$object->id,'twitter');
625
+			if ($this->twitter) $out .= dol_print_socialnetworks($this->twitter, $this->id, $object->id, 'twitter');
626 626
 			$outdone++;
627
-			if ($this->facebook) $out.=dol_print_socialnetworks($this->facebook,$this->id,$object->id,'facebook');
627
+			if ($this->facebook) $out .= dol_print_socialnetworks($this->facebook, $this->id, $object->id, 'facebook');
628 628
 			$outdone++;
629 629
 		}
630
-		$out.='</div>';
630
+		$out .= '</div>';
631 631
 
632
-		$out.='<!-- END Part to show address block -->';
632
+		$out .= '<!-- END Part to show address block -->';
633 633
 
634 634
 		return $out;
635 635
 	}
@@ -642,17 +642,17 @@  discard block
 block discarded – undo
642 642
 	 * @param	int		$relativelink		0=Return full external link, 1=Return link relative to root of file
643 643
 	 * @return	string						Link or empty string if there is no download link
644 644
 	 */
645
-	function getLastMainDocLink($modulepart, $initsharekey=0, $relativelink=0)
645
+	function getLastMainDocLink($modulepart, $initsharekey = 0, $relativelink = 0)
646 646
 	{
647 647
 		global $user, $dolibarr_main_url_root;
648 648
 
649 649
 		if (empty($this->last_main_doc))
650 650
 		{
651
-			return '';		// No way to known which document name to use
651
+			return ''; // No way to known which document name to use
652 652
 		}
653 653
 
654 654
 		include_once DOL_DOCUMENT_ROOT.'/ecm/class/ecmfiles.class.php';
655
-		$ecmfile=new EcmFiles($this->db);
655
+		$ecmfile = new EcmFiles($this->db);
656 656
 		$result = $ecmfile->fetch(0, '', $this->last_main_doc);
657 657
 		if ($result < 0)
658 658
 		{
@@ -700,26 +700,26 @@  discard block
 block discarded – undo
700 700
 		}
701 701
 
702 702
 		// Define $urlwithroot
703
-		$urlwithouturlroot=preg_replace('/'.preg_quote(DOL_URL_ROOT,'/').'$/i','',trim($dolibarr_main_url_root));
704
-		$urlwithroot=$urlwithouturlroot.DOL_URL_ROOT;		// This is to use external domain name found into config file
703
+		$urlwithouturlroot = preg_replace('/'.preg_quote(DOL_URL_ROOT, '/').'$/i', '', trim($dolibarr_main_url_root));
704
+		$urlwithroot = $urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain name found into config file
705 705
 		//$urlwithroot=DOL_MAIN_URL_ROOT;					// This is to use same domain name than current
706 706
 
707
-		$forcedownload=0;
707
+		$forcedownload = 0;
708 708
 
709
-		$paramlink='';
709
+		$paramlink = '';
710 710
 		//if (! empty($modulepart)) $paramlink.=($paramlink?'&':'').'modulepart='.$modulepart;		// For sharing with hash (so public files), modulepart is not required.
711 711
 		//if (! empty($ecmfile->entity)) $paramlink.='&entity='.$ecmfile->entity; 					// For sharing with hash (so public files), entity is not required.
712 712
 		//$paramlink.=($paramlink?'&':'').'file='.urlencode($filepath);								// No need of name of file for public link, we will use the hash
713
-		if (! empty($ecmfile->share)) $paramlink.=($paramlink?'&':'').'hashp='.$ecmfile->share;			// Hash for public share
714
-		if ($forcedownload) $paramlink.=($paramlink?'&':'').'attachment=1';
713
+		if (!empty($ecmfile->share)) $paramlink .= ($paramlink ? '&' : '').'hashp='.$ecmfile->share; // Hash for public share
714
+		if ($forcedownload) $paramlink .= ($paramlink ? '&' : '').'attachment=1';
715 715
 
716 716
 		if ($relativelink)
717 717
 		{
718
-			$linktoreturn='document.php'.($paramlink?'?'.$paramlink:'');
718
+			$linktoreturn = 'document.php'.($paramlink ? '?'.$paramlink : '');
719 719
 		}
720 720
 		else
721 721
 		{
722
-			$linktoreturn=$urlwithroot.'/document.php'.($paramlink?'?'.$paramlink:'');
722
+			$linktoreturn = $urlwithroot.'/document.php'.($paramlink ? '?'.$paramlink : '');
723 723
 		}
724 724
 
725 725
 		// Here $ecmfile->share is defined
@@ -737,10 +737,10 @@  discard block
 block discarded – undo
737 737
 	 *  @param  int		$notrigger			Disable all triggers
738 738
 	 *  @return int                 		<0 if KO, >0 if OK
739 739
 	 */
740
-	function add_contact($fk_socpeople, $type_contact, $source='external',$notrigger=0)
740
+	function add_contact($fk_socpeople, $type_contact, $source = 'external', $notrigger = 0)
741 741
 	{
742 742
         // phpcs:enable
743
-		global $user,$langs;
743
+		global $user, $langs;
744 744
 
745 745
 
746 746
 		dol_syslog(get_class($this)."::add_contact $fk_socpeople, $type_contact, $source, $notrigger");
@@ -749,43 +749,43 @@  discard block
 block discarded – undo
749 749
 		if ($fk_socpeople <= 0)
750 750
 		{
751 751
 			$langs->load("errors");
752
-			$this->error=$langs->trans("ErrorWrongValueForParameterX","1");
753
-			dol_syslog(get_class($this)."::add_contact ".$this->error,LOG_ERR);
752
+			$this->error = $langs->trans("ErrorWrongValueForParameterX", "1");
753
+			dol_syslog(get_class($this)."::add_contact ".$this->error, LOG_ERR);
754 754
 			return -1;
755 755
 		}
756
-		if (! $type_contact)
756
+		if (!$type_contact)
757 757
 		{
758 758
 			$langs->load("errors");
759
-			$this->error=$langs->trans("ErrorWrongValueForParameterX","2");
760
-			dol_syslog(get_class($this)."::add_contact ".$this->error,LOG_ERR);
759
+			$this->error = $langs->trans("ErrorWrongValueForParameterX", "2");
760
+			dol_syslog(get_class($this)."::add_contact ".$this->error, LOG_ERR);
761 761
 			return -2;
762 762
 		}
763 763
 
764
-		$id_type_contact=0;
764
+		$id_type_contact = 0;
765 765
 		if (is_numeric($type_contact))
766 766
 		{
767
-			$id_type_contact=$type_contact;
767
+			$id_type_contact = $type_contact;
768 768
 		}
769 769
 		else
770 770
 		{
771 771
 			// We look for id type_contact
772 772
 			$sql = "SELECT tc.rowid";
773
-			$sql.= " FROM ".MAIN_DB_PREFIX."c_type_contact as tc";
774
-			$sql.= " WHERE tc.element='".$this->db->escape($this->element)."'";
775
-			$sql.= " AND tc.source='".$this->db->escape($source)."'";
776
-			$sql.= " AND tc.code='".$this->db->escape($type_contact)."' AND tc.active=1";
773
+			$sql .= " FROM ".MAIN_DB_PREFIX."c_type_contact as tc";
774
+			$sql .= " WHERE tc.element='".$this->db->escape($this->element)."'";
775
+			$sql .= " AND tc.source='".$this->db->escape($source)."'";
776
+			$sql .= " AND tc.code='".$this->db->escape($type_contact)."' AND tc.active=1";
777 777
 			//print $sql;
778
-			$resql=$this->db->query($sql);
778
+			$resql = $this->db->query($sql);
779 779
 			if ($resql)
780 780
 			{
781 781
 				$obj = $this->db->fetch_object($resql);
782
-				if ($obj) $id_type_contact=$obj->rowid;
782
+				if ($obj) $id_type_contact = $obj->rowid;
783 783
 			}
784 784
 		}
785 785
 
786 786
 		if ($id_type_contact == 0)
787 787
 		{
788
-			$this->error='CODE_NOT_VALID_FOR_THIS_ELEMENT';
788
+			$this->error = 'CODE_NOT_VALID_FOR_THIS_ELEMENT';
789 789
 			dol_syslog("CODE_NOT_VALID_FOR_THIS_ELEMENT: Code type of contact '".$type_contact."' does not exists or is not active for element ".$this->element.", we can ignore it");
790 790
 			return -3;
791 791
 		}
@@ -793,35 +793,35 @@  discard block
 block discarded – undo
793 793
 		$datecreate = dol_now();
794 794
 
795 795
 		// Socpeople must have already been added by some trigger, then we have to check it to avoid DB_ERROR_RECORD_ALREADY_EXISTS error
796
-		$TListeContacts=$this->liste_contact(-1, $source);
797
-		$already_added=false;
798
-		if(!empty($TListeContacts)) {
799
-			foreach($TListeContacts as $array_contact) {
800
-				if($array_contact['status'] == 4 && $array_contact['id'] == $fk_socpeople && $array_contact['fk_c_type_contact'] == $id_type_contact) {
801
-					$already_added=true;
796
+		$TListeContacts = $this->liste_contact(-1, $source);
797
+		$already_added = false;
798
+		if (!empty($TListeContacts)) {
799
+			foreach ($TListeContacts as $array_contact) {
800
+				if ($array_contact['status'] == 4 && $array_contact['id'] == $fk_socpeople && $array_contact['fk_c_type_contact'] == $id_type_contact) {
801
+					$already_added = true;
802 802
 					break;
803 803
 				}
804 804
 			}
805 805
 		}
806 806
 
807
-		if(!$already_added) {
807
+		if (!$already_added) {
808 808
 
809 809
 			$this->db->begin();
810 810
 
811 811
 			// Insert into database
812 812
 			$sql = "INSERT INTO ".MAIN_DB_PREFIX."element_contact";
813
-			$sql.= " (element_id, fk_socpeople, datecreate, statut, fk_c_type_contact) ";
814
-			$sql.= " VALUES (".$this->id.", ".$fk_socpeople." , " ;
815
-			$sql.= "'".$this->db->idate($datecreate)."'";
816
-			$sql.= ", 4, ". $id_type_contact;
817
-			$sql.= ")";
813
+			$sql .= " (element_id, fk_socpeople, datecreate, statut, fk_c_type_contact) ";
814
+			$sql .= " VALUES (".$this->id.", ".$fk_socpeople." , ";
815
+			$sql .= "'".$this->db->idate($datecreate)."'";
816
+			$sql .= ", 4, ".$id_type_contact;
817
+			$sql .= ")";
818 818
 
819
-			$resql=$this->db->query($sql);
819
+			$resql = $this->db->query($sql);
820 820
 			if ($resql)
821 821
 			{
822
-				if (! $notrigger)
822
+				if (!$notrigger)
823 823
 				{
824
-					$result=$this->call_trigger(strtoupper($this->element).'_ADD_CONTACT', $user);
824
+					$result = $this->call_trigger(strtoupper($this->element).'_ADD_CONTACT', $user);
825 825
 					if ($result < 0)
826 826
 					{
827 827
 						$this->db->rollback();
@@ -836,14 +836,14 @@  discard block
 block discarded – undo
836 836
 			{
837 837
 				if ($this->db->errno() == 'DB_ERROR_RECORD_ALREADY_EXISTS')
838 838
 				{
839
-					$this->error=$this->db->errno();
839
+					$this->error = $this->db->errno();
840 840
 					$this->db->rollback();
841 841
 					echo 'err rollback';
842 842
 					return -2;
843 843
 				}
844 844
 				else
845 845
 				{
846
-					$this->error=$this->db->error();
846
+					$this->error = $this->db->error();
847 847
 					$this->db->rollback();
848 848
 					return -1;
849 849
 				}
@@ -859,15 +859,15 @@  discard block
 block discarded – undo
859 859
 	 *    @param    string          $source     Nature of contact ('internal' or 'external')
860 860
 	 *    @return   int                         >0 if OK, <0 if KO
861 861
 	 */
862
-	function copy_linked_contact($objFrom, $source='internal')
862
+	function copy_linked_contact($objFrom, $source = 'internal')
863 863
 	{
864 864
         // phpcs:enable
865 865
 		$contacts = $objFrom->liste_contact(-1, $source);
866
-		foreach($contacts as $contact)
866
+		foreach ($contacts as $contact)
867 867
 		{
868 868
 			if ($this->add_contact($contact['id'], $contact['fk_c_type_contact'], $contact['source']) < 0)
869 869
 			{
870
-				$this->error=$this->db->lasterror();
870
+				$this->error = $this->db->lasterror();
871 871
 				return -1;
872 872
 			}
873 873
 		}
@@ -884,23 +884,23 @@  discard block
 block discarded – undo
884 884
 	 *      @param  int		$fk_socpeople	    Id of soc_people to update (not modified if 0)
885 885
 	 *      @return int                 		<0 if KO, >= 0 if OK
886 886
 	 */
887
-	function update_contact($rowid, $statut, $type_contact_id=0, $fk_socpeople=0)
887
+	function update_contact($rowid, $statut, $type_contact_id = 0, $fk_socpeople = 0)
888 888
 	{
889 889
         // phpcs:enable
890 890
 		// Insert into database
891 891
 		$sql = "UPDATE ".MAIN_DB_PREFIX."element_contact set";
892
-		$sql.= " statut = ".$statut;
893
-		if ($type_contact_id) $sql.= ", fk_c_type_contact = '".$type_contact_id ."'";
894
-		if ($fk_socpeople) $sql.= ", fk_socpeople = '".$fk_socpeople ."'";
895
-		$sql.= " where rowid = ".$rowid;
896
-		$resql=$this->db->query($sql);
892
+		$sql .= " statut = ".$statut;
893
+		if ($type_contact_id) $sql .= ", fk_c_type_contact = '".$type_contact_id."'";
894
+		if ($fk_socpeople) $sql .= ", fk_socpeople = '".$fk_socpeople."'";
895
+		$sql .= " where rowid = ".$rowid;
896
+		$resql = $this->db->query($sql);
897 897
 		if ($resql)
898 898
 		{
899 899
 			return 0;
900 900
 		}
901 901
 		else
902 902
 		{
903
-			$this->error=$this->db->lasterror();
903
+			$this->error = $this->db->lasterror();
904 904
 			return -1;
905 905
 		}
906 906
 	}
@@ -913,7 +913,7 @@  discard block
 block discarded – undo
913 913
 	 *    @param	int		$notrigger		Disable all triggers
914 914
 	 *    @return   int						>0 if OK, <0 if KO
915 915
 	 */
916
-	function delete_contact($rowid, $notrigger=0)
916
+	function delete_contact($rowid, $notrigger = 0)
917 917
 	{
918 918
         // phpcs:enable
919 919
 		global $user;
@@ -922,14 +922,14 @@  discard block
 block discarded – undo
922 922
 		$this->db->begin();
923 923
 
924 924
 		$sql = "DELETE FROM ".MAIN_DB_PREFIX."element_contact";
925
-		$sql.= " WHERE rowid =".$rowid;
925
+		$sql .= " WHERE rowid =".$rowid;
926 926
 
927 927
 		dol_syslog(get_class($this)."::delete_contact", LOG_DEBUG);
928 928
 		if ($this->db->query($sql))
929 929
 		{
930
-			if (! $notrigger)
930
+			if (!$notrigger)
931 931
 			{
932
-				$result=$this->call_trigger(strtoupper($this->element).'_DELETE_CONTACT', $user);
932
+				$result = $this->call_trigger(strtoupper($this->element).'_DELETE_CONTACT', $user);
933 933
 				if ($result < 0) { $this->db->rollback(); return -1; }
934 934
 			}
935 935
 
@@ -938,7 +938,7 @@  discard block
 block discarded – undo
938 938
 		}
939 939
 		else
940 940
 		{
941
-			$this->error=$this->db->lasterror();
941
+			$this->error = $this->db->lasterror();
942 942
 			$this->db->rollback();
943 943
 			return -1;
944 944
 		}
@@ -952,22 +952,22 @@  discard block
 block discarded – undo
952 952
 	 *	  @param	string	$code		Type of contact (code or id)
953 953
 	 *    @return   int					>0 if OK, <0 if KO
954 954
 	 */
955
-	function delete_linked_contact($source='',$code='')
955
+	function delete_linked_contact($source = '', $code = '')
956 956
 	{
957 957
         // phpcs:enable
958 958
 		$temp = array();
959
-		$typeContact = $this->liste_type_contact($source,'',0,0,$code);
959
+		$typeContact = $this->liste_type_contact($source, '', 0, 0, $code);
960 960
 
961
-		foreach($typeContact as $key => $value)
961
+		foreach ($typeContact as $key => $value)
962 962
 		{
963
-			array_push($temp,$key);
963
+			array_push($temp, $key);
964 964
 		}
965 965
 		$listId = implode(",", $temp);
966 966
 
967 967
 		$sql = "DELETE FROM ".MAIN_DB_PREFIX."element_contact";
968
-		$sql.= " WHERE element_id = ".$this->id;
968
+		$sql .= " WHERE element_id = ".$this->id;
969 969
 		if ($listId)
970
-			$sql.= " AND fk_c_type_contact IN (".$listId.")";
970
+			$sql .= " AND fk_c_type_contact IN (".$listId.")";
971 971
 
972 972
 		dol_syslog(get_class($this)."::delete_linked_contact", LOG_DEBUG);
973 973
 		if ($this->db->query($sql))
@@ -976,7 +976,7 @@  discard block
 block discarded – undo
976 976
 		}
977 977
 		else
978 978
 		{
979
-			$this->error=$this->db->lasterror();
979
+			$this->error = $this->db->lasterror();
980 980
 			return -1;
981 981
 		}
982 982
 	}
@@ -991,54 +991,54 @@  discard block
 block discarded – undo
991 991
 	 *    @param    string      $code       Filter on this code of contact type ('SHIPPING', 'BILLING', ...)
992 992
 	 *    @return	array|int		        Array of contacts, -1 if error
993 993
 	 */
994
-	function liste_contact($statut=-1,$source='external',$list=0,$code='')
994
+	function liste_contact($statut = -1, $source = 'external', $list = 0, $code = '')
995 995
 	{
996 996
         // phpcs:enable
997 997
 		global $langs;
998 998
 
999
-		$tab=array();
1000
-
1001
-		$sql = "SELECT ec.rowid, ec.statut as statuslink, ec.fk_socpeople as id, ec.fk_c_type_contact";    // This field contains id of llx_socpeople or id of llx_user
1002
-		if ($source == 'internal') $sql.=", '-1' as socid, t.statut as statuscontact, t.login, t.photo";
1003
-		if ($source == 'external' || $source == 'thirdparty') $sql.=", t.fk_soc as socid, t.statut as statuscontact";
1004
-		$sql.= ", t.civility as civility, t.lastname as lastname, t.firstname, t.email";
1005
-		$sql.= ", tc.source, tc.element, tc.code, tc.libelle";
1006
-		$sql.= " FROM ".MAIN_DB_PREFIX."c_type_contact tc";
1007
-		$sql.= ", ".MAIN_DB_PREFIX."element_contact ec";
1008
-		if ($source == 'internal') $sql.=" LEFT JOIN ".MAIN_DB_PREFIX."user t on ec.fk_socpeople = t.rowid";
1009
-		if ($source == 'external'|| $source == 'thirdparty') $sql.=" LEFT JOIN ".MAIN_DB_PREFIX."socpeople t on ec.fk_socpeople = t.rowid";
1010
-		$sql.= " WHERE ec.element_id =".$this->id;
1011
-		$sql.= " AND ec.fk_c_type_contact=tc.rowid";
1012
-		$sql.= " AND tc.element='".$this->db->escape($this->element)."'";
1013
-		if ($code) $sql.= " AND tc.code = '".$this->db->escape($code)."'";
1014
-		if ($source == 'internal') $sql.= " AND tc.source = 'internal'";
1015
-		if ($source == 'external' || $source == 'thirdparty') $sql.= " AND tc.source = 'external'";
1016
-		$sql.= " AND tc.active=1";
1017
-		if ($statut >= 0) $sql.= " AND ec.statut = '".$statut."'";
1018
-		$sql.=" ORDER BY t.lastname ASC";
999
+		$tab = array();
1000
+
1001
+		$sql = "SELECT ec.rowid, ec.statut as statuslink, ec.fk_socpeople as id, ec.fk_c_type_contact"; // This field contains id of llx_socpeople or id of llx_user
1002
+		if ($source == 'internal') $sql .= ", '-1' as socid, t.statut as statuscontact, t.login, t.photo";
1003
+		if ($source == 'external' || $source == 'thirdparty') $sql .= ", t.fk_soc as socid, t.statut as statuscontact";
1004
+		$sql .= ", t.civility as civility, t.lastname as lastname, t.firstname, t.email";
1005
+		$sql .= ", tc.source, tc.element, tc.code, tc.libelle";
1006
+		$sql .= " FROM ".MAIN_DB_PREFIX."c_type_contact tc";
1007
+		$sql .= ", ".MAIN_DB_PREFIX."element_contact ec";
1008
+		if ($source == 'internal') $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."user t on ec.fk_socpeople = t.rowid";
1009
+		if ($source == 'external' || $source == 'thirdparty') $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."socpeople t on ec.fk_socpeople = t.rowid";
1010
+		$sql .= " WHERE ec.element_id =".$this->id;
1011
+		$sql .= " AND ec.fk_c_type_contact=tc.rowid";
1012
+		$sql .= " AND tc.element='".$this->db->escape($this->element)."'";
1013
+		if ($code) $sql .= " AND tc.code = '".$this->db->escape($code)."'";
1014
+		if ($source == 'internal') $sql .= " AND tc.source = 'internal'";
1015
+		if ($source == 'external' || $source == 'thirdparty') $sql .= " AND tc.source = 'external'";
1016
+		$sql .= " AND tc.active=1";
1017
+		if ($statut >= 0) $sql .= " AND ec.statut = '".$statut."'";
1018
+		$sql .= " ORDER BY t.lastname ASC";
1019 1019
 
1020 1020
 		dol_syslog(get_class($this)."::liste_contact", LOG_DEBUG);
1021
-		$resql=$this->db->query($sql);
1021
+		$resql = $this->db->query($sql);
1022 1022
 		if ($resql)
1023 1023
 		{
1024
-			$num=$this->db->num_rows($resql);
1025
-			$i=0;
1024
+			$num = $this->db->num_rows($resql);
1025
+			$i = 0;
1026 1026
 			while ($i < $num)
1027 1027
 			{
1028 1028
 				$obj = $this->db->fetch_object($resql);
1029 1029
 
1030
-				if (! $list)
1030
+				if (!$list)
1031 1031
 				{
1032
-					$transkey="TypeContact_".$obj->element."_".$obj->source."_".$obj->code;
1033
-					$libelle_type=($langs->trans($transkey)!=$transkey ? $langs->trans($transkey) : $obj->libelle);
1034
-					$tab[$i]=array('source'=>$obj->source,'socid'=>$obj->socid,'id'=>$obj->id,
1035
-								   'nom'=>$obj->lastname,      // For backward compatibility
1032
+					$transkey = "TypeContact_".$obj->element."_".$obj->source."_".$obj->code;
1033
+					$libelle_type = ($langs->trans($transkey) != $transkey ? $langs->trans($transkey) : $obj->libelle);
1034
+					$tab[$i] = array('source'=>$obj->source, 'socid'=>$obj->socid, 'id'=>$obj->id,
1035
+								   'nom'=>$obj->lastname, // For backward compatibility
1036 1036
 								   'civility'=>$obj->civility, 'lastname'=>$obj->lastname, 'firstname'=>$obj->firstname, 'email'=>$obj->email, 'login'=>$obj->login, 'photo'=>$obj->photo, 'statuscontact'=>$obj->statuscontact,
1037 1037
 								   'rowid'=>$obj->rowid, 'code'=>$obj->code, 'libelle'=>$libelle_type, 'status'=>$obj->statuslink, 'fk_c_type_contact'=>$obj->fk_c_type_contact);
1038 1038
 				}
1039 1039
 				else
1040 1040
 				{
1041
-					$tab[$i]=$obj->id;
1041
+					$tab[$i] = $obj->id;
1042 1042
 				}
1043 1043
 
1044 1044
 				$i++;
@@ -1048,7 +1048,7 @@  discard block
 block discarded – undo
1048 1048
 		}
1049 1049
 		else
1050 1050
 		{
1051
-			$this->error=$this->db->lasterror();
1051
+			$this->error = $this->db->lasterror();
1052 1052
 			dol_print_error($this->db);
1053 1053
 			return -1;
1054 1054
 		}
@@ -1064,16 +1064,16 @@  discard block
 block discarded – undo
1064 1064
 	function swapContactStatus($rowid)
1065 1065
 	{
1066 1066
 		$sql = "SELECT ec.datecreate, ec.statut, ec.fk_socpeople, ec.fk_c_type_contact,";
1067
-		$sql.= " tc.code, tc.libelle";
1067
+		$sql .= " tc.code, tc.libelle";
1068 1068
 		//$sql.= ", s.fk_soc";
1069
-		$sql.= " FROM (".MAIN_DB_PREFIX."element_contact as ec, ".MAIN_DB_PREFIX."c_type_contact as tc)";
1069
+		$sql .= " FROM (".MAIN_DB_PREFIX."element_contact as ec, ".MAIN_DB_PREFIX."c_type_contact as tc)";
1070 1070
 		//$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."socpeople as s ON ec.fk_socpeople=s.rowid";	// Si contact de type external, alors il est lie a une societe
1071
-		$sql.= " WHERE ec.rowid =".$rowid;
1072
-		$sql.= " AND ec.fk_c_type_contact=tc.rowid";
1073
-		$sql.= " AND tc.element = '".$this->db->escape($this->element)."'";
1071
+		$sql .= " WHERE ec.rowid =".$rowid;
1072
+		$sql .= " AND ec.fk_c_type_contact=tc.rowid";
1073
+		$sql .= " AND tc.element = '".$this->db->escape($this->element)."'";
1074 1074
 
1075 1075
 		dol_syslog(get_class($this)."::swapContactStatus", LOG_DEBUG);
1076
-		$resql=$this->db->query($sql);
1076
+		$resql = $this->db->query($sql);
1077 1077
 		if ($resql)
1078 1078
 		{
1079 1079
 			$obj = $this->db->fetch_object($resql);
@@ -1084,7 +1084,7 @@  discard block
 block discarded – undo
1084 1084
 		}
1085 1085
 		else
1086 1086
 		{
1087
-			$this->error=$this->db->error();
1087
+			$this->error = $this->db->error();
1088 1088
 			dol_print_error($this->db);
1089 1089
 			return -1;
1090 1090
 		}
@@ -1101,44 +1101,44 @@  discard block
 block discarded – undo
1101 1101
 	 *		@param	string	$code		Type of contact (Example: 'CUSTOMER', 'SERVICE')
1102 1102
 	 *      @return array       		Array list of type of contacts (id->label if option=0, code->label if option=1)
1103 1103
 	 */
1104
-	function liste_type_contact($source='internal', $order='position', $option=0, $activeonly=0, $code='')
1104
+	function liste_type_contact($source = 'internal', $order = 'position', $option = 0, $activeonly = 0, $code = '')
1105 1105
 	{
1106 1106
         // phpcs:enable
1107 1107
 		global $langs;
1108 1108
 
1109
-		if (empty($order)) $order='position';
1110
-		if ($order == 'position') $order.=',code';
1109
+		if (empty($order)) $order = 'position';
1110
+		if ($order == 'position') $order .= ',code';
1111 1111
 
1112 1112
 		$tab = array();
1113 1113
 		$sql = "SELECT DISTINCT tc.rowid, tc.code, tc.libelle, tc.position";
1114
-		$sql.= " FROM ".MAIN_DB_PREFIX."c_type_contact as tc";
1115
-		$sql.= " WHERE tc.element='".$this->db->escape($this->element)."'";
1116
-		if ($activeonly == 1) $sql.= " AND tc.active=1"; // only the active types
1117
-		if (! empty($source) && $source != 'all') $sql.= " AND tc.source='".$this->db->escape($source)."'";
1118
-		if (! empty($code)) $sql.= " AND tc.code='".$this->db->escape($code)."'";
1119
-		$sql.= $this->db->order($order,'ASC');
1114
+		$sql .= " FROM ".MAIN_DB_PREFIX."c_type_contact as tc";
1115
+		$sql .= " WHERE tc.element='".$this->db->escape($this->element)."'";
1116
+		if ($activeonly == 1) $sql .= " AND tc.active=1"; // only the active types
1117
+		if (!empty($source) && $source != 'all') $sql .= " AND tc.source='".$this->db->escape($source)."'";
1118
+		if (!empty($code)) $sql .= " AND tc.code='".$this->db->escape($code)."'";
1119
+		$sql .= $this->db->order($order, 'ASC');
1120 1120
 
1121 1121
 		//print "sql=".$sql;
1122
-		$resql=$this->db->query($sql);
1122
+		$resql = $this->db->query($sql);
1123 1123
 		if ($resql)
1124 1124
 		{
1125
-			$num=$this->db->num_rows($resql);
1126
-			$i=0;
1125
+			$num = $this->db->num_rows($resql);
1126
+			$i = 0;
1127 1127
 			while ($i < $num)
1128 1128
 			{
1129 1129
 				$obj = $this->db->fetch_object($resql);
1130 1130
 
1131
-				$transkey="TypeContact_".$this->element."_".$source."_".$obj->code;
1132
-				$libelle_type=($langs->trans($transkey)!=$transkey ? $langs->trans($transkey) : $obj->libelle);
1133
-				if (empty($option)) $tab[$obj->rowid]=$libelle_type;
1134
-				else $tab[$obj->code]=$libelle_type;
1131
+				$transkey = "TypeContact_".$this->element."_".$source."_".$obj->code;
1132
+				$libelle_type = ($langs->trans($transkey) != $transkey ? $langs->trans($transkey) : $obj->libelle);
1133
+				if (empty($option)) $tab[$obj->rowid] = $libelle_type;
1134
+				else $tab[$obj->code] = $libelle_type;
1135 1135
 				$i++;
1136 1136
 			}
1137 1137
 			return $tab;
1138 1138
 		}
1139 1139
 		else
1140 1140
 		{
1141
-			$this->error=$this->db->lasterror();
1141
+			$this->error = $this->db->lasterror();
1142 1142
 			//dol_print_error($this->db);
1143 1143
 			return null;
1144 1144
 		}
@@ -1155,53 +1155,53 @@  discard block
 block discarded – undo
1155 1155
 	 *		@param	int		$status		limited to a certain status
1156 1156
 	 *      @return array       		List of id for such contacts
1157 1157
 	 */
1158
-	function getIdContact($source,$code,$status=0)
1158
+	function getIdContact($source, $code, $status = 0)
1159 1159
 	{
1160 1160
 		global $conf;
1161 1161
 
1162
-		$result=array();
1163
-		$i=0;
1162
+		$result = array();
1163
+		$i = 0;
1164 1164
 		//cas particulier pour les expeditions
1165
-		if($this->element=='shipping' && $this->origin_id != 0) {
1166
-			$id=$this->origin_id;
1167
-			$element='commande';
1168
-        } else if($this->element=='reception' && $this->origin_id != 0) {
1169
-            $id=$this->origin_id;
1170
-            $element='order_supplier';
1165
+		if ($this->element == 'shipping' && $this->origin_id != 0) {
1166
+			$id = $this->origin_id;
1167
+			$element = 'commande';
1168
+        } else if ($this->element == 'reception' && $this->origin_id != 0) {
1169
+            $id = $this->origin_id;
1170
+            $element = 'order_supplier';
1171 1171
 		} else {
1172
-			$id=$this->id;
1173
-			$element=$this->element;
1172
+			$id = $this->id;
1173
+			$element = $this->element;
1174 1174
 		}
1175 1175
 
1176 1176
 		$sql = "SELECT ec.fk_socpeople";
1177
-		$sql.= " FROM ".MAIN_DB_PREFIX."element_contact as ec,";
1178
-		if ($source == 'internal') $sql.= " ".MAIN_DB_PREFIX."user as c,";
1179
-		if ($source == 'external') $sql.= " ".MAIN_DB_PREFIX."socpeople as c,";
1180
-		$sql.= " ".MAIN_DB_PREFIX."c_type_contact as tc";
1181
-		$sql.= " WHERE ec.element_id = ".$id;
1182
-		$sql.= " AND ec.fk_socpeople = c.rowid";
1183
-		if ($source == 'internal') $sql.= " AND c.entity IN (".getEntity('user').")";
1184
-		if ($source == 'external') $sql.= " AND c.entity IN (".getEntity('societe').")";
1185
-		$sql.= " AND ec.fk_c_type_contact = tc.rowid";
1186
-		$sql.= " AND tc.element = '".$element."'";
1187
-		$sql.= " AND tc.source = '".$source."'";
1188
-		$sql.= " AND tc.code = '".$code."'";
1189
-		$sql.= " AND tc.active = 1";
1190
-		if ($status) $sql.= " AND ec.statut = ".$status;
1177
+		$sql .= " FROM ".MAIN_DB_PREFIX."element_contact as ec,";
1178
+		if ($source == 'internal') $sql .= " ".MAIN_DB_PREFIX."user as c,";
1179
+		if ($source == 'external') $sql .= " ".MAIN_DB_PREFIX."socpeople as c,";
1180
+		$sql .= " ".MAIN_DB_PREFIX."c_type_contact as tc";
1181
+		$sql .= " WHERE ec.element_id = ".$id;
1182
+		$sql .= " AND ec.fk_socpeople = c.rowid";
1183
+		if ($source == 'internal') $sql .= " AND c.entity IN (".getEntity('user').")";
1184
+		if ($source == 'external') $sql .= " AND c.entity IN (".getEntity('societe').")";
1185
+		$sql .= " AND ec.fk_c_type_contact = tc.rowid";
1186
+		$sql .= " AND tc.element = '".$element."'";
1187
+		$sql .= " AND tc.source = '".$source."'";
1188
+		$sql .= " AND tc.code = '".$code."'";
1189
+		$sql .= " AND tc.active = 1";
1190
+		if ($status) $sql .= " AND ec.statut = ".$status;
1191 1191
 
1192 1192
 		dol_syslog(get_class($this)."::getIdContact", LOG_DEBUG);
1193
-		$resql=$this->db->query($sql);
1193
+		$resql = $this->db->query($sql);
1194 1194
 		if ($resql)
1195 1195
 		{
1196 1196
 			while ($obj = $this->db->fetch_object($resql))
1197 1197
 			{
1198
-				$result[$i]=$obj->fk_socpeople;
1198
+				$result[$i] = $obj->fk_socpeople;
1199 1199
 				$i++;
1200 1200
 			}
1201 1201
 		}
1202 1202
 		else
1203 1203
 		{
1204
-			$this->error=$this->db->error();
1204
+			$this->error = $this->db->error();
1205 1205
 			return null;
1206 1206
 		}
1207 1207
 
@@ -1215,16 +1215,16 @@  discard block
 block discarded – undo
1215 1215
 	 *		@param	int		$contactid      Id du contact. Use this->contactid if empty.
1216 1216
 	 *		@return	int						<0 if KO, >0 if OK
1217 1217
 	 */
1218
-	function fetch_contact($contactid=null)
1218
+	function fetch_contact($contactid = null)
1219 1219
 	{
1220 1220
         // phpcs:enable
1221
-		if (empty($contactid)) $contactid=$this->contactid;
1221
+		if (empty($contactid)) $contactid = $this->contactid;
1222 1222
 
1223 1223
 		if (empty($contactid)) return 0;
1224 1224
 
1225 1225
 		require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php';
1226 1226
 		$contact = new Contact($this->db);
1227
-		$result=$contact->fetch($contactid);
1227
+		$result = $contact->fetch($contactid);
1228 1228
 		$this->contact = $contact;
1229 1229
 		return $result;
1230 1230
 	}
@@ -1236,7 +1236,7 @@  discard block
 block discarded – undo
1236 1236
 	 *		@param		int		$force_thirdparty_id	Force thirdparty id
1237 1237
 	 *		@return		int								<0 if KO, >0 if OK
1238 1238
 	 */
1239
-	function fetch_thirdparty($force_thirdparty_id=0)
1239
+	function fetch_thirdparty($force_thirdparty_id = 0)
1240 1240
 	{
1241 1241
         // phpcs:enable
1242 1242
 		global $conf;
@@ -1244,7 +1244,7 @@  discard block
 block discarded – undo
1244 1244
 		if (empty($this->socid) && empty($this->fk_soc) && empty($this->fk_thirdparty) && empty($force_thirdparty_id))
1245 1245
 			return 0;
1246 1246
 
1247
-		require_once DOL_DOCUMENT_ROOT . '/societe/class/societe.class.php';
1247
+		require_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php';
1248 1248
 
1249 1249
 		$idtofetch = isset($this->socid) ? $this->socid : (isset($this->fk_soc) ? $this->fk_soc : $this->fk_thirdparty);
1250 1250
 		if ($force_thirdparty_id)
@@ -1307,7 +1307,7 @@  discard block
 block discarded – undo
1307 1307
 
1308 1308
 		dol_syslog(get_class($this).'::fetch_barcode this->element='.$this->element.' this->barcode_type='.$this->barcode_type);
1309 1309
 
1310
-		$idtype=$this->barcode_type;
1310
+		$idtype = $this->barcode_type;
1311 1311
 		if (empty($idtype) && $idtype != '0')	// If type of barcode no set, we try to guess. If set to '0' it means we forced to have type remain not defined
1312 1312
 		{
1313 1313
 			if ($this->element == 'product')      $idtype = $conf->global->PRODUIT_DEFAULT_BARCODE_TYPE;
@@ -1320,8 +1320,8 @@  discard block
 block discarded – undo
1320 1320
 			if (empty($this->barcode_type) || empty($this->barcode_type_code) || empty($this->barcode_type_label) || empty($this->barcode_type_coder))    // If data not already loaded
1321 1321
 			{
1322 1322
 				$sql = "SELECT rowid, code, libelle as label, coder";
1323
-				$sql.= " FROM ".MAIN_DB_PREFIX."c_barcode_type";
1324
-				$sql.= " WHERE rowid = ".$idtype;
1323
+				$sql .= " FROM ".MAIN_DB_PREFIX."c_barcode_type";
1324
+				$sql .= " WHERE rowid = ".$idtype;
1325 1325
 				dol_syslog(get_class($this).'::fetch_barcode', LOG_DEBUG);
1326 1326
 				$resql = $this->db->query($sql);
1327 1327
 				if ($resql)
@@ -1354,13 +1354,13 @@  discard block
 block discarded – undo
1354 1354
         // phpcs:enable
1355 1355
 		include_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
1356 1356
 
1357
-		if (empty($this->fk_project) && ! empty($this->fk_projet)) $this->fk_project = $this->fk_projet;	// For backward compatibility
1357
+		if (empty($this->fk_project) && !empty($this->fk_projet)) $this->fk_project = $this->fk_projet; // For backward compatibility
1358 1358
 		if (empty($this->fk_project)) return 0;
1359 1359
 
1360 1360
 		$project = new Project($this->db);
1361 1361
 		$result = $project->fetch($this->fk_project);
1362 1362
 
1363
-		$this->projet = $project;	// deprecated
1363
+		$this->projet = $project; // deprecated
1364 1364
 		$this->project = $project;
1365 1365
 		return $result;
1366 1366
 	}
@@ -1396,7 +1396,7 @@  discard block
 block discarded – undo
1396 1396
 	{
1397 1397
         // phpcs:enable
1398 1398
 		$user = new User($this->db);
1399
-		$result=$user->fetch($userid);
1399
+		$result = $user->fetch($userid);
1400 1400
 		$this->user = $user;
1401 1401
 		return $result;
1402 1402
 	}
@@ -1434,14 +1434,14 @@  discard block
 block discarded – undo
1434 1434
 	{
1435 1435
 		global $conf;
1436 1436
 
1437
-		$result=false;
1437
+		$result = false;
1438 1438
 
1439 1439
 		$sql = "SELECT rowid FROM ".MAIN_DB_PREFIX.$table;
1440
-		$sql.= " WHERE ".$field." = '".$key."'";
1441
-		if (! empty($element)) {
1442
-			$sql.= " AND entity IN (".getEntity($element).")";
1440
+		$sql .= " WHERE ".$field." = '".$key."'";
1441
+		if (!empty($element)) {
1442
+			$sql .= " AND entity IN (".getEntity($element).")";
1443 1443
 		} else {
1444
-			$sql.= " AND entity = ".$conf->entity;
1444
+			$sql .= " AND entity = ".$conf->entity;
1445 1445
 		}
1446 1446
 
1447 1447
 		dol_syslog(get_class($this).'::fetchObjectFrom', LOG_DEBUG);
@@ -1468,10 +1468,10 @@  discard block
 block discarded – undo
1468 1468
 	 */
1469 1469
 	function getValueFrom($table, $id, $field)
1470 1470
 	{
1471
-		$result=false;
1471
+		$result = false;
1472 1472
 		if (!empty($id) && !empty($field) && !empty($table)) {
1473 1473
 			$sql = "SELECT ".$field." FROM ".MAIN_DB_PREFIX.$table;
1474
-			$sql.= " WHERE rowid = ".$id;
1474
+			$sql .= " WHERE rowid = ".$id;
1475 1475
 
1476 1476
 			dol_syslog(get_class($this).'::getValueFrom', LOG_DEBUG);
1477 1477
 			$resql = $this->db->query($sql);
@@ -1500,36 +1500,36 @@  discard block
 block discarded – undo
1500 1500
 	 *	@return	int							<0 if KO, >0 if OK
1501 1501
 	 *  @see updateExtraField
1502 1502
 	 */
1503
-	function setValueFrom($field, $value, $table='', $id=null, $format='', $id_field='', $fuser=null, $trigkey='', $fk_user_field='fk_user_modif')
1503
+	function setValueFrom($field, $value, $table = '', $id = null, $format = '', $id_field = '', $fuser = null, $trigkey = '', $fk_user_field = 'fk_user_modif')
1504 1504
 	{
1505
-		global $user,$langs,$conf;
1505
+		global $user, $langs, $conf;
1506 1506
 
1507
-		if (empty($table)) 	  $table=$this->table_element;
1508
-		if (empty($id))    	  $id=$this->id;
1509
-		if (empty($format))   $format='text';
1510
-		if (empty($id_field)) $id_field='rowid';
1507
+		if (empty($table)) 	  $table = $this->table_element;
1508
+		if (empty($id))    	  $id = $this->id;
1509
+		if (empty($format))   $format = 'text';
1510
+		if (empty($id_field)) $id_field = 'rowid';
1511 1511
 
1512
-		$error=0;
1512
+		$error = 0;
1513 1513
 
1514 1514
 		$this->db->begin();
1515 1515
 
1516 1516
 		// Special case
1517
-		if ($table == 'product' && $field == 'note_private') $field='note';
1517
+		if ($table == 'product' && $field == 'note_private') $field = 'note';
1518 1518
 		if (in_array($table, array('actioncomm', 'adherent', 'advtargetemailing', 'cronjob', 'establishment'))) $fk_user_field = 'fk_user_mod';
1519 1519
 
1520 1520
 		$sql = "UPDATE ".MAIN_DB_PREFIX.$table." SET ";
1521 1521
 
1522
-		if ($format == 'text') $sql.= $field." = '".$this->db->escape($value)."'";
1523
-		else if ($format == 'int') $sql.= $field." = ".$this->db->escape($value);
1524
-		else if ($format == 'date') $sql.= $field." = ".($value ? "'".$this->db->idate($value)."'" : "null");
1522
+		if ($format == 'text') $sql .= $field." = '".$this->db->escape($value)."'";
1523
+		else if ($format == 'int') $sql .= $field." = ".$this->db->escape($value);
1524
+		else if ($format == 'date') $sql .= $field." = ".($value ? "'".$this->db->idate($value)."'" : "null");
1525 1525
 
1526 1526
 		if ($fk_user_field)
1527 1527
 		{
1528
-			if (! empty($fuser) && is_object($fuser)) $sql.=", ".$fk_user_field." = ".$fuser->id;
1529
-			elseif (empty($fuser) || $fuser != 'none') $sql.=", ".$fk_user_field." = ".$user->id;
1528
+			if (!empty($fuser) && is_object($fuser)) $sql .= ", ".$fk_user_field." = ".$fuser->id;
1529
+			elseif (empty($fuser) || $fuser != 'none') $sql .= ", ".$fk_user_field." = ".$user->id;
1530 1530
 		}
1531 1531
 
1532
-		$sql.= " WHERE ".$id_field." = ".$id;
1532
+		$sql .= " WHERE ".$id_field." = ".$id;
1533 1533
 
1534 1534
 		dol_syslog(get_class($this)."::".__FUNCTION__."", LOG_DEBUG);
1535 1535
 		$resql = $this->db->query($sql);
@@ -1546,11 +1546,11 @@  discard block
 block discarded – undo
1546 1546
 				{
1547 1547
 					$result = $this->fetchCommon($id);
1548 1548
 				}
1549
-				if ($result >= 0) $result=$this->call_trigger($trigkey, (! empty($fuser) && is_object($fuser)) ? $fuser : $user);   // This may set this->errors
1549
+				if ($result >= 0) $result = $this->call_trigger($trigkey, (!empty($fuser) && is_object($fuser)) ? $fuser : $user); // This may set this->errors
1550 1550
 				if ($result < 0) $error++;
1551 1551
 			}
1552 1552
 
1553
-			if (! $error)
1553
+			if (!$error)
1554 1554
 			{
1555 1555
 				if (property_exists($this, $field)) $this->$field = $value;
1556 1556
 				$this->db->commit();
@@ -1564,7 +1564,7 @@  discard block
 block discarded – undo
1564 1564
 		}
1565 1565
 		else
1566 1566
 		{
1567
-			$this->error=$this->db->lasterror();
1567
+			$this->error = $this->db->lasterror();
1568 1568
 			$this->db->rollback();
1569 1569
 			return -1;
1570 1570
 		}
@@ -1579,14 +1579,14 @@  discard block
 block discarded – undo
1579 1579
 	 *		@param	int		$nodbprefix	Do not include DB prefix to forge table name
1580 1580
 	 *      @return int         		<0 if KO, >0 if OK
1581 1581
 	 */
1582
-	function load_previous_next_ref($filter, $fieldid, $nodbprefix=0)
1582
+	function load_previous_next_ref($filter, $fieldid, $nodbprefix = 0)
1583 1583
 	{
1584 1584
         // phpcs:enable
1585 1585
 		global $conf, $user;
1586 1586
 
1587
-		if (! $this->table_element)
1587
+		if (!$this->table_element)
1588 1588
 		{
1589
-			dol_print_error('',get_class($this)."::load_previous_next_ref was called on objet with property table_element not defined");
1589
+			dol_print_error('', get_class($this)."::load_previous_next_ref was called on objet with property table_element not defined");
1590 1590
 			return -1;
1591 1591
 		}
1592 1592
 		if ($fieldid == 'none') return 1;
@@ -1601,45 +1601,45 @@  discard block
 block discarded – undo
1601 1601
 		if ($this->element == 'societe') $alias = 'te';
1602 1602
 
1603 1603
 		$sql = "SELECT MAX(te.".$fieldid.")";
1604
-		$sql.= " FROM ".(empty($nodbprefix)?MAIN_DB_PREFIX:'').$this->table_element." as te";
1605
-		if ($this->element == 'user' && ! empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE)) {
1606
-			$sql.= ",".MAIN_DB_PREFIX."usergroup_user as ug";
1607
-		}
1608
-		if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 2) $sql.= ", ".MAIN_DB_PREFIX."societe as s";	// If we need to link to societe to limit select to entity
1609
-		else if ($this->restrictiononfksoc == 1 && $this->element != 'societe' && !$user->rights->societe->client->voir && !$socid) $sql.= ", ".MAIN_DB_PREFIX."societe as s";	// If we need to link to societe to limit select to socid
1610
-		else if ($this->restrictiononfksoc == 2 && $this->element != 'societe' && !$user->rights->societe->client->voir && !$socid) $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON te.fk_soc = s.rowid";	// If we need to link to societe to limit select to socid
1611
-		if ($this->restrictiononfksoc && !$user->rights->societe->client->voir && !$socid)  $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."societe_commerciaux as sc ON ".$alias.".rowid = sc.fk_soc";
1612
-		$sql.= " WHERE te.".$fieldid." < '".$this->db->escape($this->ref)."'";  // ->ref must always be defined (set to id if field does not exists)
1613
-		if ($this->restrictiononfksoc == 1 && !$user->rights->societe->client->voir && !$socid) $sql.= " AND sc.fk_user = " .$user->id;
1614
-		if ($this->restrictiononfksoc == 2 && !$user->rights->societe->client->voir && !$socid) $sql.= " AND (sc.fk_user = " .$user->id.' OR te.fk_soc IS NULL)';
1615
-		if (! empty($filter))
1616
-		{
1617
-			if (! preg_match('/^\s*AND/i', $filter)) $sql.=" AND ";   // For backward compatibility
1618
-			$sql.=$filter;
1619
-		}
1620
-		if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 2) $sql.= ' AND te.fk_soc = s.rowid';			// If we need to link to societe to limit select to entity
1621
-		else if ($this->restrictiononfksoc == 1 && $this->element != 'societe' && !$user->rights->societe->client->voir && !$socid) $sql.= ' AND te.fk_soc = s.rowid';			// If we need to link to societe to limit select to socid
1604
+		$sql .= " FROM ".(empty($nodbprefix) ?MAIN_DB_PREFIX:'').$this->table_element." as te";
1605
+		if ($this->element == 'user' && !empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE)) {
1606
+			$sql .= ",".MAIN_DB_PREFIX."usergroup_user as ug";
1607
+		}
1608
+		if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 2) $sql .= ", ".MAIN_DB_PREFIX."societe as s"; // If we need to link to societe to limit select to entity
1609
+		else if ($this->restrictiononfksoc == 1 && $this->element != 'societe' && !$user->rights->societe->client->voir && !$socid) $sql .= ", ".MAIN_DB_PREFIX."societe as s"; // If we need to link to societe to limit select to socid
1610
+		else if ($this->restrictiononfksoc == 2 && $this->element != 'societe' && !$user->rights->societe->client->voir && !$socid) $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON te.fk_soc = s.rowid"; // If we need to link to societe to limit select to socid
1611
+		if ($this->restrictiononfksoc && !$user->rights->societe->client->voir && !$socid)  $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe_commerciaux as sc ON ".$alias.".rowid = sc.fk_soc";
1612
+		$sql .= " WHERE te.".$fieldid." < '".$this->db->escape($this->ref)."'"; // ->ref must always be defined (set to id if field does not exists)
1613
+		if ($this->restrictiononfksoc == 1 && !$user->rights->societe->client->voir && !$socid) $sql .= " AND sc.fk_user = ".$user->id;
1614
+		if ($this->restrictiononfksoc == 2 && !$user->rights->societe->client->voir && !$socid) $sql .= " AND (sc.fk_user = ".$user->id.' OR te.fk_soc IS NULL)';
1615
+		if (!empty($filter))
1616
+		{
1617
+			if (!preg_match('/^\s*AND/i', $filter)) $sql .= " AND "; // For backward compatibility
1618
+			$sql .= $filter;
1619
+		}
1620
+		if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 2) $sql .= ' AND te.fk_soc = s.rowid'; // If we need to link to societe to limit select to entity
1621
+		else if ($this->restrictiononfksoc == 1 && $this->element != 'societe' && !$user->rights->societe->client->voir && !$socid) $sql .= ' AND te.fk_soc = s.rowid'; // If we need to link to societe to limit select to socid
1622 1622
 		if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) {
1623
-			if ($this->element == 'user' && ! empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE)) {
1624
-				if (! empty($user->admin) && empty($user->entity) && $conf->entity == 1) {
1625
-					$sql.= " AND te.entity IS NOT NULL"; // Show all users
1623
+			if ($this->element == 'user' && !empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE)) {
1624
+				if (!empty($user->admin) && empty($user->entity) && $conf->entity == 1) {
1625
+					$sql .= " AND te.entity IS NOT NULL"; // Show all users
1626 1626
 				} else {
1627
-					$sql.= " AND ug.fk_user = te.rowid";
1628
-					$sql.= " AND ug.entity IN (".getEntity($this->element).")";
1627
+					$sql .= " AND ug.fk_user = te.rowid";
1628
+					$sql .= " AND ug.entity IN (".getEntity($this->element).")";
1629 1629
 				}
1630 1630
 			} else {
1631
-				$sql.= ' AND te.entity IN ('.getEntity($this->element).')';
1631
+				$sql .= ' AND te.entity IN ('.getEntity($this->element).')';
1632 1632
 			}
1633 1633
 		}
1634
-		if ($this->restrictiononfksoc == 1 && $socid && $this->element != 'societe') $sql.= ' AND te.fk_soc = ' . $socid;
1635
-		if ($this->restrictiononfksoc == 2 && $socid && $this->element != 'societe') $sql.= ' AND (te.fk_soc = ' . $socid.' OR te.fk_soc IS NULL)';
1636
-		if ($this->restrictiononfksoc && $socid && $this->element == 'societe') $sql.= ' AND te.rowid = ' . $socid;
1634
+		if ($this->restrictiononfksoc == 1 && $socid && $this->element != 'societe') $sql .= ' AND te.fk_soc = '.$socid;
1635
+		if ($this->restrictiononfksoc == 2 && $socid && $this->element != 'societe') $sql .= ' AND (te.fk_soc = '.$socid.' OR te.fk_soc IS NULL)';
1636
+		if ($this->restrictiononfksoc && $socid && $this->element == 'societe') $sql .= ' AND te.rowid = '.$socid;
1637 1637
 		//print 'socid='.$socid.' restrictiononfksoc='.$this->restrictiononfksoc.' ismultientitymanaged = '.$this->ismultientitymanaged.' filter = '.$filter.' -> '.$sql."<br>";
1638 1638
 
1639 1639
 		$result = $this->db->query($sql);
1640
-		if (! $result)
1640
+		if (!$result)
1641 1641
 		{
1642
-			$this->error=$this->db->lasterror();
1642
+			$this->error = $this->db->lasterror();
1643 1643
 			return -1;
1644 1644
 		}
1645 1645
 		$row = $this->db->fetch_row($result);
@@ -1647,46 +1647,46 @@  discard block
 block discarded – undo
1647 1647
 
1648 1648
 
1649 1649
 		$sql = "SELECT MIN(te.".$fieldid.")";
1650
-		$sql.= " FROM ".(empty($nodbprefix)?MAIN_DB_PREFIX:'').$this->table_element." as te";
1651
-		if ($this->element == 'user' && ! empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE)) {
1652
-			$sql.= ",".MAIN_DB_PREFIX."usergroup_user as ug";
1653
-		}
1654
-		if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 2) $sql.= ", ".MAIN_DB_PREFIX."societe as s";	// If we need to link to societe to limit select to entity
1655
-		else if ($this->restrictiononfksoc == 1 && $this->element != 'societe' && !$user->rights->societe->client->voir && !$socid) $sql.= ", ".MAIN_DB_PREFIX."societe as s";	// If we need to link to societe to limit select to socid
1656
-		else if ($this->restrictiononfksoc == 2 && $this->element != 'societe' && !$user->rights->societe->client->voir && !$socid) $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON te.fk_soc = s.rowid";	// If we need to link to societe to limit select to socid
1657
-		if ($this->restrictiononfksoc && !$user->rights->societe->client->voir && !$socid) $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."societe_commerciaux as sc ON ".$alias.".rowid = sc.fk_soc";
1658
-		$sql.= " WHERE te.".$fieldid." > '".$this->db->escape($this->ref)."'";  // ->ref must always be defined (set to id if field does not exists)
1659
-		if ($this->restrictiononfksoc == 1 && !$user->rights->societe->client->voir && !$socid) $sql.= " AND sc.fk_user = " .$user->id;
1660
-		if ($this->restrictiononfksoc == 2 && !$user->rights->societe->client->voir && !$socid) $sql.= " AND (sc.fk_user = " .$user->id.' OR te.fk_soc IS NULL)';
1661
-		if (! empty($filter))
1662
-		{
1663
-			if (! preg_match('/^\s*AND/i', $filter)) $sql.=" AND ";   // For backward compatibility
1664
-			$sql.=$filter;
1665
-		}
1666
-		if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 2) $sql.= ' AND te.fk_soc = s.rowid';			// If we need to link to societe to limit select to entity
1667
-		else if ($this->restrictiononfksoc == 1 && $this->element != 'societe' && !$user->rights->societe->client->voir && !$socid) $sql.= ' AND te.fk_soc = s.rowid';			// If we need to link to societe to limit select to socid
1650
+		$sql .= " FROM ".(empty($nodbprefix) ?MAIN_DB_PREFIX:'').$this->table_element." as te";
1651
+		if ($this->element == 'user' && !empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE)) {
1652
+			$sql .= ",".MAIN_DB_PREFIX."usergroup_user as ug";
1653
+		}
1654
+		if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 2) $sql .= ", ".MAIN_DB_PREFIX."societe as s"; // If we need to link to societe to limit select to entity
1655
+		else if ($this->restrictiononfksoc == 1 && $this->element != 'societe' && !$user->rights->societe->client->voir && !$socid) $sql .= ", ".MAIN_DB_PREFIX."societe as s"; // If we need to link to societe to limit select to socid
1656
+		else if ($this->restrictiononfksoc == 2 && $this->element != 'societe' && !$user->rights->societe->client->voir && !$socid) $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON te.fk_soc = s.rowid"; // If we need to link to societe to limit select to socid
1657
+		if ($this->restrictiononfksoc && !$user->rights->societe->client->voir && !$socid) $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe_commerciaux as sc ON ".$alias.".rowid = sc.fk_soc";
1658
+		$sql .= " WHERE te.".$fieldid." > '".$this->db->escape($this->ref)."'"; // ->ref must always be defined (set to id if field does not exists)
1659
+		if ($this->restrictiononfksoc == 1 && !$user->rights->societe->client->voir && !$socid) $sql .= " AND sc.fk_user = ".$user->id;
1660
+		if ($this->restrictiononfksoc == 2 && !$user->rights->societe->client->voir && !$socid) $sql .= " AND (sc.fk_user = ".$user->id.' OR te.fk_soc IS NULL)';
1661
+		if (!empty($filter))
1662
+		{
1663
+			if (!preg_match('/^\s*AND/i', $filter)) $sql .= " AND "; // For backward compatibility
1664
+			$sql .= $filter;
1665
+		}
1666
+		if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 2) $sql .= ' AND te.fk_soc = s.rowid'; // If we need to link to societe to limit select to entity
1667
+		else if ($this->restrictiononfksoc == 1 && $this->element != 'societe' && !$user->rights->societe->client->voir && !$socid) $sql .= ' AND te.fk_soc = s.rowid'; // If we need to link to societe to limit select to socid
1668 1668
 		if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) {
1669
-			if ($this->element == 'user' && ! empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE)) {
1670
-				if (! empty($user->admin) && empty($user->entity) && $conf->entity == 1) {
1671
-					$sql.= " AND te.entity IS NOT NULL"; // Show all users
1669
+			if ($this->element == 'user' && !empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE)) {
1670
+				if (!empty($user->admin) && empty($user->entity) && $conf->entity == 1) {
1671
+					$sql .= " AND te.entity IS NOT NULL"; // Show all users
1672 1672
 				} else {
1673
-					$sql.= " AND ug.fk_user = te.rowid";
1674
-					$sql.= " AND ug.entity IN (".getEntity($this->element).")";
1673
+					$sql .= " AND ug.fk_user = te.rowid";
1674
+					$sql .= " AND ug.entity IN (".getEntity($this->element).")";
1675 1675
 				}
1676 1676
 			} else {
1677
-				$sql.= ' AND te.entity IN ('.getEntity($this->element).')';
1677
+				$sql .= ' AND te.entity IN ('.getEntity($this->element).')';
1678 1678
 			}
1679 1679
 		}
1680
-		if ($this->restrictiononfksoc == 1 && $socid && $this->element != 'societe') $sql.= ' AND te.fk_soc = ' . $socid;
1681
-		if ($this->restrictiononfksoc == 2 && $socid && $this->element != 'societe') $sql.= ' AND (te.fk_soc = ' . $socid.' OR te.fk_soc IS NULL)';
1682
-		if ($this->restrictiononfksoc && $socid && $this->element == 'societe') $sql.= ' AND te.rowid = ' . $socid;
1680
+		if ($this->restrictiononfksoc == 1 && $socid && $this->element != 'societe') $sql .= ' AND te.fk_soc = '.$socid;
1681
+		if ($this->restrictiononfksoc == 2 && $socid && $this->element != 'societe') $sql .= ' AND (te.fk_soc = '.$socid.' OR te.fk_soc IS NULL)';
1682
+		if ($this->restrictiononfksoc && $socid && $this->element == 'societe') $sql .= ' AND te.rowid = '.$socid;
1683 1683
 		//print 'socid='.$socid.' restrictiononfksoc='.$this->restrictiononfksoc.' ismultientitymanaged = '.$this->ismultientitymanaged.' filter = '.$filter.' -> '.$sql."<br>";
1684 1684
 		// Rem: Bug in some mysql version: SELECT MIN(rowid) FROM llx_socpeople WHERE rowid > 1 when one row in database with rowid=1, returns 1 instead of null
1685 1685
 
1686 1686
 		$result = $this->db->query($sql);
1687
-		if (! $result)
1687
+		if (!$result)
1688 1688
 		{
1689
-			$this->error=$this->db->lasterror();
1689
+			$this->error = $this->db->lasterror();
1690 1690
 			return -2;
1691 1691
 		}
1692 1692
 		$row = $this->db->fetch_row($result);
@@ -1703,11 +1703,11 @@  discard block
 block discarded – undo
1703 1703
 	 *      @return array				Array of id of contacts (if source=external or internal)
1704 1704
 	 * 									Array of id of third parties with at least one contact on object (if source=thirdparty)
1705 1705
 	 */
1706
-	function getListContactId($source='external')
1706
+	function getListContactId($source = 'external')
1707 1707
 	{
1708 1708
 		$contactAlreadySelected = array();
1709
-		$tab = $this->liste_contact(-1,$source);
1710
-		$num=count($tab);
1709
+		$tab = $this->liste_contact(-1, $source);
1710
+		$num = count($tab);
1711 1711
 		$i = 0;
1712 1712
 		while ($i < $num)
1713 1713
 		{
@@ -1727,24 +1727,24 @@  discard block
 block discarded – undo
1727 1727
 	 */
1728 1728
 	function setProject($projectid)
1729 1729
 	{
1730
-		if (! $this->table_element)
1730
+		if (!$this->table_element)
1731 1731
 		{
1732
-			dol_syslog(get_class($this)."::setProject was called on objet with property table_element not defined",LOG_ERR);
1732
+			dol_syslog(get_class($this)."::setProject was called on objet with property table_element not defined", LOG_ERR);
1733 1733
 			return -1;
1734 1734
 		}
1735 1735
 
1736 1736
 		$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
1737 1737
 		if ($this->table_element == 'actioncomm')
1738 1738
 		{
1739
-			if ($projectid) $sql.= ' SET fk_project = '.$projectid;
1740
-			else $sql.= ' SET fk_project = NULL';
1741
-			$sql.= ' WHERE id = '.$this->id;
1739
+			if ($projectid) $sql .= ' SET fk_project = '.$projectid;
1740
+			else $sql .= ' SET fk_project = NULL';
1741
+			$sql .= ' WHERE id = '.$this->id;
1742 1742
 		}
1743 1743
 		else
1744 1744
 		{
1745
-			if ($projectid) $sql.= ' SET fk_projet = '.$projectid;
1746
-			else $sql.= ' SET fk_projet = NULL';
1747
-			$sql.= ' WHERE rowid = '.$this->id;
1745
+			if ($projectid) $sql .= ' SET fk_projet = '.$projectid;
1746
+			else $sql .= ' SET fk_projet = NULL';
1747
+			$sql .= ' WHERE rowid = '.$this->id;
1748 1748
 		}
1749 1749
 
1750 1750
 		dol_syslog(get_class($this)."::setProject", LOG_DEBUG);
@@ -1790,14 +1790,14 @@  discard block
 block discarded – undo
1790 1790
 			else
1791 1791
 			{
1792 1792
 				dol_syslog(get_class($this).'::setPaymentMethods Erreur '.$sql.' - '.$this->db->error());
1793
-				$this->error=$this->db->error();
1793
+				$this->error = $this->db->error();
1794 1794
 				return -1;
1795 1795
 			}
1796 1796
 		}
1797 1797
 		else
1798 1798
 		{
1799 1799
 			dol_syslog(get_class($this).'::setPaymentMethods, status of the object is incompatible');
1800
-			$this->error='Status of the object is incompatible '.$this->statut;
1800
+			$this->error = 'Status of the object is incompatible '.$this->statut;
1801 1801
 			return -2;
1802 1802
 		}
1803 1803
 	}
@@ -1824,21 +1824,21 @@  discard block
 block discarded – undo
1824 1824
 				$this->multicurrency_code = $code;
1825 1825
 
1826 1826
 				list($fk_multicurrency, $rate) = MultiCurrency::getIdAndTxFromCode($this->db, $code);
1827
-				if ($rate) $this->setMulticurrencyRate($rate,2);
1827
+				if ($rate) $this->setMulticurrencyRate($rate, 2);
1828 1828
 
1829 1829
 				return 1;
1830 1830
 			}
1831 1831
 			else
1832 1832
 			{
1833 1833
 				dol_syslog(get_class($this).'::setMulticurrencyCode Erreur '.$sql.' - '.$this->db->error());
1834
-				$this->error=$this->db->error();
1834
+				$this->error = $this->db->error();
1835 1835
 				return -1;
1836 1836
 			}
1837 1837
 		}
1838 1838
 		else
1839 1839
 		{
1840 1840
 			dol_syslog(get_class($this).'::setMulticurrencyCode, status of the object is incompatible');
1841
-			$this->error='Status of the object is incompatible '.$this->statut;
1841
+			$this->error = 'Status of the object is incompatible '.$this->statut;
1842 1842
 			return -2;
1843 1843
 		}
1844 1844
 	}
@@ -1850,7 +1850,7 @@  discard block
 block discarded – undo
1850 1850
 	 *  @param		int		$mode	mode 1 : amounts in company currency will be recalculated, mode 2 : amounts in foreign currency
1851 1851
 	 *  @return		int				>0 if OK, <0 if KO
1852 1852
 	 */
1853
-	function setMulticurrencyRate($rate, $mode=1)
1853
+	function setMulticurrencyRate($rate, $mode = 1)
1854 1854
 	{
1855 1855
 		dol_syslog(get_class($this).'::setMulticurrencyRate('.$id.')');
1856 1856
 		if ($this->statut >= 0 || $this->element == 'societe')
@@ -1870,7 +1870,7 @@  discard block
 block discarded – undo
1870 1870
 				{
1871 1871
 					foreach ($this->lines as &$line)
1872 1872
 					{
1873
-						if($mode == 1) {
1873
+						if ($mode == 1) {
1874 1874
 							$line->subprice = 0;
1875 1875
 						}
1876 1876
 
@@ -1878,14 +1878,14 @@  discard block
 block discarded – undo
1878 1878
 							case 'propal':
1879 1879
 								$this->updateline(
1880 1880
 									$line->id, $line->subprice, $line->qty, $line->remise_percent, $line->tva_tx, $line->localtax1_tx, $line->localtax2_tx,
1881
-									($line->description?$line->description:$line->desc), 'HT', $line->info_bits, $line->special_code, $line->fk_parent_line,
1881
+									($line->description ? $line->description : $line->desc), 'HT', $line->info_bits, $line->special_code, $line->fk_parent_line,
1882 1882
 									$line->skip_update_total, $line->fk_fournprice, $line->pa_ht, $line->label, $line->product_type, $line->date_start,
1883 1883
 									$line->date_end, $line->array_options, $line->fk_unit, $line->multicurrency_subprice
1884 1884
 								);
1885 1885
 								break;
1886 1886
 							case 'commande':
1887 1887
 								$this->updateline(
1888
-									$line->id, ($line->description?$line->description:$line->desc), $line->subprice, $line->qty, $line->remise_percent,
1888
+									$line->id, ($line->description ? $line->description : $line->desc), $line->subprice, $line->qty, $line->remise_percent,
1889 1889
 									$line->tva_tx, $line->localtax1_tx, $line->localtax2_tx, 'HT', $line->info_bits, $line->date_start, $line->date_end,
1890 1890
 									$line->product_type, $line->fk_parent_line, $line->skip_update_total, $line->fk_fournprice, $line->pa_ht, $line->label,
1891 1891
 									$line->special_code, $line->array_options, $line->fk_unit, $line->multicurrency_subprice
@@ -1893,7 +1893,7 @@  discard block
 block discarded – undo
1893 1893
 								break;
1894 1894
 							case 'facture':
1895 1895
 								$this->updateline(
1896
-									$line->id, ($line->description?$line->description:$line->desc), $line->subprice, $line->qty, $line->remise_percent,
1896
+									$line->id, ($line->description ? $line->description : $line->desc), $line->subprice, $line->qty, $line->remise_percent,
1897 1897
 									$line->date_start, $line->date_end, $line->tva_tx, $line->localtax1_tx, $line->localtax2_tx, 'HT', $line->info_bits,
1898 1898
 									$line->product_type, $line->fk_parent_line, $line->skip_update_total, $line->fk_fournprice, $line->pa_ht, $line->label,
1899 1899
 									$line->special_code, $line->array_options, $line->situation_percent, $line->fk_unit, $line->multicurrency_subprice
@@ -1902,21 +1902,21 @@  discard block
 block discarded – undo
1902 1902
 							case 'supplier_proposal':
1903 1903
 								$this->updateline(
1904 1904
 									$line->id, $line->subprice, $line->qty, $line->remise_percent, $line->tva_tx, $line->localtax1_tx, $line->localtax2_tx,
1905
-									($line->description?$line->description:$line->desc), 'HT', $line->info_bits, $line->special_code, $line->fk_parent_line,
1905
+									($line->description ? $line->description : $line->desc), 'HT', $line->info_bits, $line->special_code, $line->fk_parent_line,
1906 1906
 									$line->skip_update_total, $line->fk_fournprice, $line->pa_ht, $line->label, $line->product_type, $line->array_options,
1907 1907
 									$line->ref_fourn, $line->multicurrency_subprice
1908 1908
 								);
1909 1909
 								break;
1910 1910
 							case 'order_supplier':
1911 1911
 								$this->updateline(
1912
-									$line->id, ($line->description?$line->description:$line->desc), $line->subprice, $line->qty, $line->remise_percent,
1912
+									$line->id, ($line->description ? $line->description : $line->desc), $line->subprice, $line->qty, $line->remise_percent,
1913 1913
 									$line->tva_tx, $line->localtax1_tx, $line->localtax2_tx, 'HT', $line->info_bits, $line->product_type, false,
1914 1914
 									$line->date_start, $line->date_end, $line->array_options, $line->fk_unit, $line->multicurrency_subprice
1915 1915
 								);
1916 1916
 								break;
1917 1917
 							case 'invoice_supplier':
1918 1918
 								$this->updateline(
1919
-									$line->id, ($line->description?$line->description:$line->desc), $line->subprice, $line->tva_tx, $line->localtax1_tx,
1919
+									$line->id, ($line->description ? $line->description : $line->desc), $line->subprice, $line->tva_tx, $line->localtax1_tx,
1920 1920
 									$line->localtax2_tx, $line->qty, 0, 'HT', $line->info_bits, $line->product_type, $line->remise_percent, false,
1921 1921
 									$line->date_start, $line->date_end, $line->array_options, $line->fk_unit, $line->multicurrency_subprice
1922 1922
 								);
@@ -1933,14 +1933,14 @@  discard block
 block discarded – undo
1933 1933
 			else
1934 1934
 			{
1935 1935
 				dol_syslog(get_class($this).'::setMulticurrencyRate Erreur '.$sql.' - '.$this->db->error());
1936
-				$this->error=$this->db->error();
1936
+				$this->error = $this->db->error();
1937 1937
 				return -1;
1938 1938
 			}
1939 1939
 		}
1940 1940
 		else
1941 1941
 		{
1942 1942
 			dol_syslog(get_class($this).'::setMulticurrencyRate, status of the object is incompatible');
1943
-			$this->error='Status of the object is incompatible '.$this->statut;
1943
+			$this->error = 'Status of the object is incompatible '.$this->statut;
1944 1944
 			return -2;
1945 1945
 		}
1946 1946
 	}
@@ -1970,20 +1970,20 @@  discard block
 block discarded – undo
1970 1970
 				$this->cond_reglement_id = $id;
1971 1971
 				// for supplier
1972 1972
 				if (get_class($this) == 'Fournisseur') $this->cond_reglement_supplier_id = $id;
1973
-				$this->cond_reglement = $id;	// for compatibility
1973
+				$this->cond_reglement = $id; // for compatibility
1974 1974
 				return 1;
1975 1975
 			}
1976 1976
 			else
1977 1977
 			{
1978 1978
 				dol_syslog(get_class($this).'::setPaymentTerms Erreur '.$sql.' - '.$this->db->error());
1979
-				$this->error=$this->db->error();
1979
+				$this->error = $this->db->error();
1980 1980
 				return -1;
1981 1981
 			}
1982 1982
 		}
1983 1983
 		else
1984 1984
 		{
1985 1985
 			dol_syslog(get_class($this).'::setPaymentTerms, status of the object is incompatible');
1986
-			$this->error='Status of the object is incompatible '.$this->statut;
1986
+			$this->error = 'Status of the object is incompatible '.$this->statut;
1987 1987
 			return -2;
1988 1988
 		}
1989 1989
 	}
@@ -2001,7 +2001,7 @@  discard block
 block discarded – undo
2001 2001
 		if ($this->element == 'delivery' || $this->element == 'shipping') $fieldname = 'fk_address';
2002 2002
 
2003 2003
 		$sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element." SET ".$fieldname." = ".$id;
2004
-		$sql.= " WHERE rowid = ".$this->id." AND fk_statut = 0";
2004
+		$sql .= " WHERE rowid = ".$this->id." AND fk_statut = 0";
2005 2005
 
2006 2006
 		if ($this->db->query($sql))
2007 2007
 		{
@@ -2010,7 +2010,7 @@  discard block
 block discarded – undo
2010 2010
 		}
2011 2011
 		else
2012 2012
 		{
2013
-			$this->error=$this->db->error();
2013
+			$this->error = $this->db->error();
2014 2014
 			dol_syslog(get_class($this).'::setDeliveryAddress Erreur '.$sql.' - '.$this->error);
2015 2015
 			return -1;
2016 2016
 		}
@@ -2026,29 +2026,29 @@  discard block
 block discarded – undo
2026 2026
 	 *
2027 2027
 	 *  @return     int              1 if OK, 0 if KO
2028 2028
 	 */
2029
-	function setShippingMethod($shipping_method_id, $notrigger=false, $userused=null)
2029
+	function setShippingMethod($shipping_method_id, $notrigger = false, $userused = null)
2030 2030
 	{
2031 2031
         global $user;
2032 2032
 
2033
-        if (empty($userused)) $userused=$user;
2033
+        if (empty($userused)) $userused = $user;
2034 2034
 
2035 2035
         $error = 0;
2036 2036
 
2037
-		if (! $this->table_element) {
2038
-			dol_syslog(get_class($this)."::setShippingMethod was called on objet with property table_element not defined",LOG_ERR);
2037
+		if (!$this->table_element) {
2038
+			dol_syslog(get_class($this)."::setShippingMethod was called on objet with property table_element not defined", LOG_ERR);
2039 2039
 			return -1;
2040 2040
 		}
2041 2041
 
2042 2042
         $this->db->begin();
2043 2043
 
2044
-		if ($shipping_method_id<0) $shipping_method_id='NULL';
2044
+		if ($shipping_method_id < 0) $shipping_method_id = 'NULL';
2045 2045
 		dol_syslog(get_class($this).'::setShippingMethod('.$shipping_method_id.')');
2046 2046
 
2047 2047
 		$sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
2048
-		$sql.= " SET fk_shipping_method = ".$shipping_method_id;
2049
-		$sql.= " WHERE rowid=".$this->id;
2048
+		$sql .= " SET fk_shipping_method = ".$shipping_method_id;
2049
+		$sql .= " WHERE rowid=".$this->id;
2050 2050
         $resql = $this->db->query($sql);
2051
-		if (! $resql) {
2051
+		if (!$resql) {
2052 2052
 			dol_syslog(get_class($this).'::setShippingMethod Error ', LOG_DEBUG);
2053 2053
 			$this->error = $this->db->lasterror();
2054 2054
 			$error++;
@@ -2056,8 +2056,8 @@  discard block
 block discarded – undo
2056 2056
             if (!$notrigger)
2057 2057
             {
2058 2058
                 // Call trigger
2059
-                $this->context=array('shippingmethodupdate'=>1);
2060
-                $result = $this->call_trigger(strtoupper(get_class($this)) . '_MODIFY', $userused);
2059
+                $this->context = array('shippingmethodupdate'=>1);
2060
+                $result = $this->call_trigger(strtoupper(get_class($this)).'_MODIFY', $userused);
2061 2061
                 if ($result < 0) $error++;
2062 2062
                 // End call trigger
2063 2063
             }
@@ -2067,7 +2067,7 @@  discard block
 block discarded – undo
2067 2067
             $this->db->rollback();
2068 2068
             return -1;
2069 2069
         } else {
2070
-            $this->shipping_method_id = ($shipping_method_id=='NULL')?null:$shipping_method_id;
2070
+            $this->shipping_method_id = ($shipping_method_id == 'NULL') ?null:$shipping_method_id;
2071 2071
             $this->db->commit();
2072 2072
             return 1;
2073 2073
         }
@@ -2082,23 +2082,23 @@  discard block
 block discarded – undo
2082 2082
 	 */
2083 2083
 	function setWarehouse($warehouse_id)
2084 2084
 	{
2085
-		if (! $this->table_element) {
2086
-			dol_syslog(get_class($this)."::setWarehouse was called on objet with property table_element not defined",LOG_ERR);
2085
+		if (!$this->table_element) {
2086
+			dol_syslog(get_class($this)."::setWarehouse was called on objet with property table_element not defined", LOG_ERR);
2087 2087
 			return -1;
2088 2088
 		}
2089
-		if ($warehouse_id<0) $warehouse_id='NULL';
2089
+		if ($warehouse_id < 0) $warehouse_id = 'NULL';
2090 2090
 		dol_syslog(get_class($this).'::setWarehouse('.$warehouse_id.')');
2091 2091
 
2092 2092
 		$sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
2093
-		$sql.= " SET fk_warehouse = ".$warehouse_id;
2094
-		$sql.= " WHERE rowid=".$this->id;
2093
+		$sql .= " SET fk_warehouse = ".$warehouse_id;
2094
+		$sql .= " WHERE rowid=".$this->id;
2095 2095
 
2096 2096
 		if ($this->db->query($sql)) {
2097
-			$this->warehouse_id = ($warehouse_id=='NULL')?null:$warehouse_id;
2097
+			$this->warehouse_id = ($warehouse_id == 'NULL') ?null:$warehouse_id;
2098 2098
 			return 1;
2099 2099
 		} else {
2100 2100
 			dol_syslog(get_class($this).'::setWarehouse Error ', LOG_DEBUG);
2101
-			$this->error=$this->db->error();
2101
+			$this->error = $this->db->error();
2102 2102
 			return 0;
2103 2103
 		}
2104 2104
 	}
@@ -2113,25 +2113,25 @@  discard block
 block discarded – undo
2113 2113
 	 */
2114 2114
 	function setDocModel($user, $modelpdf)
2115 2115
 	{
2116
-		if (! $this->table_element)
2116
+		if (!$this->table_element)
2117 2117
 		{
2118
-			dol_syslog(get_class($this)."::setDocModel was called on objet with property table_element not defined",LOG_ERR);
2118
+			dol_syslog(get_class($this)."::setDocModel was called on objet with property table_element not defined", LOG_ERR);
2119 2119
 			return -1;
2120 2120
 		}
2121 2121
 
2122
-		$newmodelpdf=dol_trunc($modelpdf,255);
2122
+		$newmodelpdf = dol_trunc($modelpdf, 255);
2123 2123
 
2124 2124
 		$sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
2125
-		$sql.= " SET model_pdf = '".$this->db->escape($newmodelpdf)."'";
2126
-		$sql.= " WHERE rowid = ".$this->id;
2125
+		$sql .= " SET model_pdf = '".$this->db->escape($newmodelpdf)."'";
2126
+		$sql .= " WHERE rowid = ".$this->id;
2127 2127
 		// if ($this->element == 'facture') $sql.= " AND fk_statut < 2";
2128 2128
 		// if ($this->element == 'propal')  $sql.= " AND fk_statut = 0";
2129 2129
 
2130 2130
 		dol_syslog(get_class($this)."::setDocModel", LOG_DEBUG);
2131
-		$resql=$this->db->query($sql);
2131
+		$resql = $this->db->query($sql);
2132 2132
 		if ($resql)
2133 2133
 		{
2134
-			$this->modelpdf=$modelpdf;
2134
+			$this->modelpdf = $modelpdf;
2135 2135
 			return 1;
2136 2136
 		}
2137 2137
 		else
@@ -2150,29 +2150,29 @@  discard block
 block discarded – undo
2150 2150
 	 *  @param      User	$userused		Object user
2151 2151
 	 *  @return		int				1 if OK, 0 if KO
2152 2152
 	 */
2153
-	function setBankAccount($fk_account, $notrigger=false, $userused=null)
2153
+	function setBankAccount($fk_account, $notrigger = false, $userused = null)
2154 2154
 	{
2155 2155
         global $user;
2156 2156
 
2157
-        if (empty($userused)) $userused=$user;
2157
+        if (empty($userused)) $userused = $user;
2158 2158
 
2159 2159
         $error = 0;
2160 2160
 
2161
-		if (! $this->table_element) {
2162
-			dol_syslog(get_class($this)."::setBankAccount was called on objet with property table_element not defined",LOG_ERR);
2161
+		if (!$this->table_element) {
2162
+			dol_syslog(get_class($this)."::setBankAccount was called on objet with property table_element not defined", LOG_ERR);
2163 2163
 			return -1;
2164 2164
 		}
2165 2165
         $this->db->begin();
2166 2166
 
2167
-		if ($fk_account<0) $fk_account='NULL';
2167
+		if ($fk_account < 0) $fk_account = 'NULL';
2168 2168
 		dol_syslog(get_class($this).'::setBankAccount('.$fk_account.')');
2169 2169
 
2170 2170
 		$sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
2171
-		$sql.= " SET fk_account = ".$fk_account;
2172
-		$sql.= " WHERE rowid=".$this->id;
2171
+		$sql .= " SET fk_account = ".$fk_account;
2172
+		$sql .= " WHERE rowid=".$this->id;
2173 2173
 
2174 2174
         $resql = $this->db->query($sql);
2175
-        if (! $resql)
2175
+        if (!$resql)
2176 2176
         {
2177 2177
             dol_syslog(get_class($this).'::setBankAccount Error '.$sql.' - '.$this->db->error());
2178 2178
             $this->error = $this->db->lasterror();
@@ -2183,8 +2183,8 @@  discard block
 block discarded – undo
2183 2183
             if (!$notrigger)
2184 2184
             {
2185 2185
                 // Call trigger
2186
-                $this->context=array('bankaccountupdate'=>1);
2187
-                $result = $this->call_trigger(strtoupper(get_class($this)) . '_MODIFY', $userused);
2186
+                $this->context = array('bankaccountupdate'=>1);
2187
+                $result = $this->call_trigger(strtoupper(get_class($this)).'_MODIFY', $userused);
2188 2188
                 if ($result < 0) $error++;
2189 2189
                 // End call trigger
2190 2190
             }
@@ -2196,7 +2196,7 @@  discard block
 block discarded – undo
2196 2196
         }
2197 2197
         else
2198 2198
         {
2199
-            $this->fk_account = ($fk_account=='NULL')?null:$fk_account;
2199
+            $this->fk_account = ($fk_account == 'NULL') ?null:$fk_account;
2200 2200
             $this->db->commit();
2201 2201
             return 1;
2202 2202
         }
@@ -2215,26 +2215,26 @@  discard block
 block discarded – undo
2215 2215
 	 * 	@param		boolean		$fk_parent_line    Table with fk_parent_line field or not
2216 2216
 	 * 	@return		int                            <0 if KO, >0 if OK
2217 2217
 	 */
2218
-	function line_order($renum=false, $rowidorder='ASC', $fk_parent_line=true)
2218
+	function line_order($renum = false, $rowidorder = 'ASC', $fk_parent_line = true)
2219 2219
 	{
2220 2220
         // phpcs:enable
2221
-		if (! $this->table_element_line)
2221
+		if (!$this->table_element_line)
2222 2222
 		{
2223
-			dol_syslog(get_class($this)."::line_order was called on objet with property table_element_line not defined",LOG_ERR);
2223
+			dol_syslog(get_class($this)."::line_order was called on objet with property table_element_line not defined", LOG_ERR);
2224 2224
 			return -1;
2225 2225
 		}
2226
-		if (! $this->fk_element)
2226
+		if (!$this->fk_element)
2227 2227
 		{
2228
-			dol_syslog(get_class($this)."::line_order was called on objet with property fk_element not defined",LOG_ERR);
2228
+			dol_syslog(get_class($this)."::line_order was called on objet with property fk_element not defined", LOG_ERR);
2229 2229
 			return -1;
2230 2230
 		}
2231 2231
 
2232 2232
 		// Count number of lines to reorder (according to choice $renum)
2233
-		$nl=0;
2233
+		$nl = 0;
2234 2234
 		$sql = 'SELECT count(rowid) FROM '.MAIN_DB_PREFIX.$this->table_element_line;
2235
-		$sql.= ' WHERE '.$this->fk_element.'='.$this->id;
2236
-		if (! $renum) $sql.= ' AND rang = 0';
2237
-		if ($renum) $sql.= ' AND rang <> 0';
2235
+		$sql .= ' WHERE '.$this->fk_element.'='.$this->id;
2236
+		if (!$renum) $sql .= ' AND rang = 0';
2237
+		if ($renum) $sql .= ' AND rang <> 0';
2238 2238
 
2239 2239
 		dol_syslog(get_class($this)."::line_order", LOG_DEBUG);
2240 2240
 		$resql = $this->db->query($sql);
@@ -2248,28 +2248,28 @@  discard block
 block discarded – undo
2248 2248
 		{
2249 2249
 			// The goal of this part is to reorder all lines, with all children lines sharing the same
2250 2250
 			// counter that parents.
2251
-			$rows=array();
2251
+			$rows = array();
2252 2252
 
2253 2253
 			// We first search all lines that are parent lines (for multilevel details lines)
2254 2254
 			$sql = 'SELECT rowid FROM '.MAIN_DB_PREFIX.$this->table_element_line;
2255
-			$sql.= ' WHERE '.$this->fk_element.' = '.$this->id;
2256
-			if ($fk_parent_line) $sql.= ' AND fk_parent_line IS NULL';
2257
-			$sql.= ' ORDER BY rang ASC, rowid '.$rowidorder;
2255
+			$sql .= ' WHERE '.$this->fk_element.' = '.$this->id;
2256
+			if ($fk_parent_line) $sql .= ' AND fk_parent_line IS NULL';
2257
+			$sql .= ' ORDER BY rang ASC, rowid '.$rowidorder;
2258 2258
 
2259 2259
 			dol_syslog(get_class($this)."::line_order search all parent lines", LOG_DEBUG);
2260 2260
 			$resql = $this->db->query($sql);
2261 2261
 			if ($resql)
2262 2262
 			{
2263
-				$i=0;
2263
+				$i = 0;
2264 2264
 				$num = $this->db->num_rows($resql);
2265 2265
 				while ($i < $num)
2266 2266
 				{
2267 2267
 					$row = $this->db->fetch_row($resql);
2268
-					$rows[] = $row[0];	// Add parent line into array rows
2268
+					$rows[] = $row[0]; // Add parent line into array rows
2269 2269
 					$childrens = $this->getChildrenOfLine($row[0]);
2270
-					if (! empty($childrens))
2270
+					if (!empty($childrens))
2271 2271
 					{
2272
-						foreach($childrens as $child)
2272
+						foreach ($childrens as $child)
2273 2273
 						{
2274 2274
 							array_push($rows, $child);
2275 2275
 						}
@@ -2278,11 +2278,11 @@  discard block
 block discarded – undo
2278 2278
 				}
2279 2279
 
2280 2280
 				// Now we set a new number for each lines (parent and children with children included into parent tree)
2281
-				if (! empty($rows))
2281
+				if (!empty($rows))
2282 2282
 				{
2283
-					foreach($rows as $key => $row)
2283
+					foreach ($rows as $key => $row)
2284 2284
 					{
2285
-						$this->updateRangOfLine($row, ($key+1));
2285
+						$this->updateRangOfLine($row, ($key + 1));
2286 2286
 					}
2287 2287
 				}
2288 2288
 			}
@@ -2302,18 +2302,18 @@  discard block
 block discarded – undo
2302 2302
 	 */
2303 2303
 	function getChildrenOfLine($id)
2304 2304
 	{
2305
-		$rows=array();
2305
+		$rows = array();
2306 2306
 
2307 2307
 		$sql = 'SELECT rowid FROM '.MAIN_DB_PREFIX.$this->table_element_line;
2308
-		$sql.= ' WHERE '.$this->fk_element.' = '.$this->id;
2309
-		$sql.= ' AND fk_parent_line = '.$id;
2310
-		$sql.= ' ORDER BY rang ASC';
2308
+		$sql .= ' WHERE '.$this->fk_element.' = '.$this->id;
2309
+		$sql .= ' AND fk_parent_line = '.$id;
2310
+		$sql .= ' ORDER BY rang ASC';
2311 2311
 
2312 2312
 		dol_syslog(get_class($this)."::getChildrenOfLine search children lines for line ".$id."", LOG_DEBUG);
2313 2313
 		$resql = $this->db->query($sql);
2314 2314
 		if ($resql)
2315 2315
 		{
2316
-			$i=0;
2316
+			$i = 0;
2317 2317
 			$num = $this->db->num_rows($resql);
2318 2318
 			while ($i < $num)
2319 2319
 			{
@@ -2334,7 +2334,7 @@  discard block
 block discarded – undo
2334 2334
 	 * 	@param	boolean		$fk_parent_line		Table with fk_parent_line field or not
2335 2335
 	 * 	@return	void
2336 2336
 	 */
2337
-	function line_up($rowid, $fk_parent_line=true)
2337
+	function line_up($rowid, $fk_parent_line = true)
2338 2338
 	{
2339 2339
         // phpcs:enable
2340 2340
 		$this->line_order(false, 'ASC', $fk_parent_line);
@@ -2354,7 +2354,7 @@  discard block
 block discarded – undo
2354 2354
 	 * 	@param	boolean		$fk_parent_line		Table with fk_parent_line field or not
2355 2355
 	 * 	@return	void
2356 2356
 	 */
2357
-	function line_down($rowid, $fk_parent_line=true)
2357
+	function line_down($rowid, $fk_parent_line = true)
2358 2358
 	{
2359 2359
         // phpcs:enable
2360 2360
 		$this->line_order(false, 'ASC', $fk_parent_line);
@@ -2376,16 +2376,16 @@  discard block
 block discarded – undo
2376 2376
 	 * 	@param	int		$rang		Position
2377 2377
 	 * 	@return	void
2378 2378
 	 */
2379
-	function updateRangOfLine($rowid,$rang)
2379
+	function updateRangOfLine($rowid, $rang)
2380 2380
 	{
2381 2381
 		$fieldposition = 'rang';
2382 2382
 		if (in_array($this->table_element_line, array('ecm_files', 'emailcollector_emailcollectoraction'))) $fieldposition = 'position';
2383 2383
 
2384 2384
 		$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element_line.' SET '.$fieldposition.' = '.$rang;
2385
-		$sql.= ' WHERE rowid = '.$rowid;
2385
+		$sql .= ' WHERE rowid = '.$rowid;
2386 2386
 
2387 2387
 		dol_syslog(get_class($this)."::updateRangOfLine", LOG_DEBUG);
2388
-		if (! $this->db->query($sql))
2388
+		if (!$this->db->query($sql))
2389 2389
 		{
2390 2390
 			dol_print_error($this->db);
2391 2391
 		}
@@ -2402,9 +2402,9 @@  discard block
 block discarded – undo
2402 2402
 	{
2403 2403
         // phpcs:enable
2404 2404
 		$num = count($rows);
2405
-		for ($i = 0 ; $i < $num ; $i++)
2405
+		for ($i = 0; $i < $num; $i++)
2406 2406
 		{
2407
-			$this->updateRangOfLine($rows[$i], ($i+1));
2407
+			$this->updateRangOfLine($rows[$i], ($i + 1));
2408 2408
 		}
2409 2409
 	}
2410 2410
 
@@ -2415,21 +2415,21 @@  discard block
 block discarded – undo
2415 2415
 	 * 	@param	int		$rang		Position
2416 2416
 	 * 	@return	void
2417 2417
 	 */
2418
-	function updateLineUp($rowid,$rang)
2418
+	function updateLineUp($rowid, $rang)
2419 2419
 	{
2420 2420
 		if ($rang > 1)
2421 2421
 		{
2422 2422
 			$fieldposition = 'rang';
2423 2423
 			if (in_array($this->table_element_line, array('ecm_files', 'emailcollector_emailcollectoraction'))) $fieldposition = 'position';
2424 2424
 
2425
-			$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element_line.' SET '.$fieldposition.' = '.$rang ;
2426
-			$sql.= ' WHERE '.$this->fk_element.' = '.$this->id;
2427
-			$sql.= ' AND rang = '.($rang - 1);
2428
-			if ($this->db->query($sql) )
2425
+			$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element_line.' SET '.$fieldposition.' = '.$rang;
2426
+			$sql .= ' WHERE '.$this->fk_element.' = '.$this->id;
2427
+			$sql .= ' AND rang = '.($rang - 1);
2428
+			if ($this->db->query($sql))
2429 2429
 			{
2430 2430
 				$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element_line.' SET '.$fieldposition.' = '.($rang - 1);
2431
-				$sql.= ' WHERE rowid = '.$rowid;
2432
-				if (! $this->db->query($sql) )
2431
+				$sql .= ' WHERE rowid = '.$rowid;
2432
+				if (!$this->db->query($sql))
2433 2433
 				{
2434 2434
 					dol_print_error($this->db);
2435 2435
 				}
@@ -2449,7 +2449,7 @@  discard block
 block discarded – undo
2449 2449
 	 * 	@param	int		$max		Max
2450 2450
 	 * 	@return	void
2451 2451
 	 */
2452
-	function updateLineDown($rowid,$rang,$max)
2452
+	function updateLineDown($rowid, $rang, $max)
2453 2453
 	{
2454 2454
 		if ($rang < $max)
2455 2455
 		{
@@ -2457,13 +2457,13 @@  discard block
 block discarded – undo
2457 2457
 			if (in_array($this->table_element_line, array('ecm_files', 'emailcollector_emailcollectoraction'))) $fieldposition = 'position';
2458 2458
 
2459 2459
 			$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element_line.' SET '.$fieldposition.' = '.$rang;
2460
-			$sql.= ' WHERE '.$this->fk_element.' = '.$this->id;
2461
-			$sql.= ' AND rang = '.($rang+1);
2462
-			if ($this->db->query($sql) )
2460
+			$sql .= ' WHERE '.$this->fk_element.' = '.$this->id;
2461
+			$sql .= ' AND rang = '.($rang + 1);
2462
+			if ($this->db->query($sql))
2463 2463
 			{
2464
-				$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element_line.' SET '.$fieldposition.' = '.($rang+1);
2465
-				$sql.= ' WHERE rowid = '.$rowid;
2466
-				if (! $this->db->query($sql) )
2464
+				$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element_line.' SET '.$fieldposition.' = '.($rang + 1);
2465
+				$sql .= ' WHERE rowid = '.$rowid;
2466
+				if (!$this->db->query($sql))
2467 2467
 				{
2468 2468
 					dol_print_error($this->db);
2469 2469
 				}
@@ -2484,7 +2484,7 @@  discard block
 block discarded – undo
2484 2484
 	function getRangOfLine($rowid)
2485 2485
 	{
2486 2486
 		$sql = 'SELECT rang FROM '.MAIN_DB_PREFIX.$this->table_element_line;
2487
-		$sql.= ' WHERE rowid ='.$rowid;
2487
+		$sql .= ' WHERE rowid ='.$rowid;
2488 2488
 
2489 2489
 		dol_syslog(get_class($this)."::getRangOfLine", LOG_DEBUG);
2490 2490
 		$resql = $this->db->query($sql);
@@ -2504,8 +2504,8 @@  discard block
 block discarded – undo
2504 2504
 	function getIdOfLine($rang)
2505 2505
 	{
2506 2506
 		$sql = 'SELECT rowid FROM '.MAIN_DB_PREFIX.$this->table_element_line;
2507
-		$sql.= ' WHERE '.$this->fk_element.' = '.$this->id;
2508
-		$sql.= ' AND rang = '.$rang;
2507
+		$sql .= ' WHERE '.$this->fk_element.' = '.$this->id;
2508
+		$sql .= ' AND rang = '.$rang;
2509 2509
 		$resql = $this->db->query($sql);
2510 2510
 		if ($resql)
2511 2511
 		{
@@ -2521,22 +2521,22 @@  discard block
 block discarded – undo
2521 2521
 	 * 	@param		int		$fk_parent_line		Parent line id
2522 2522
 	 *  @return     int  			   			Max value of rang in table of lines
2523 2523
 	 */
2524
-	function line_max($fk_parent_line=0)
2524
+	function line_max($fk_parent_line = 0)
2525 2525
 	{
2526 2526
         // phpcs:enable
2527 2527
 		// Search the last rang with fk_parent_line
2528 2528
 		if ($fk_parent_line)
2529 2529
 		{
2530 2530
 			$sql = 'SELECT max(rang) FROM '.MAIN_DB_PREFIX.$this->table_element_line;
2531
-			$sql.= ' WHERE '.$this->fk_element.' = '.$this->id;
2532
-			$sql.= ' AND fk_parent_line = '.$fk_parent_line;
2531
+			$sql .= ' WHERE '.$this->fk_element.' = '.$this->id;
2532
+			$sql .= ' AND fk_parent_line = '.$fk_parent_line;
2533 2533
 
2534 2534
 			dol_syslog(get_class($this)."::line_max", LOG_DEBUG);
2535 2535
 			$resql = $this->db->query($sql);
2536 2536
 			if ($resql)
2537 2537
 			{
2538 2538
 				$row = $this->db->fetch_row($resql);
2539
-				if (! empty($row[0]))
2539
+				if (!empty($row[0]))
2540 2540
 				{
2541 2541
 					return $row[0];
2542 2542
 				}
@@ -2550,7 +2550,7 @@  discard block
 block discarded – undo
2550 2550
 		else
2551 2551
 		{
2552 2552
 			$sql = 'SELECT max(rang) FROM '.MAIN_DB_PREFIX.$this->table_element_line;
2553
-			$sql.= ' WHERE '.$this->fk_element.' = '.$this->id;
2553
+			$sql .= ' WHERE '.$this->fk_element.' = '.$this->id;
2554 2554
 
2555 2555
 			dol_syslog(get_class($this)."::line_max", LOG_DEBUG);
2556 2556
 			$resql = $this->db->query($sql);
@@ -2572,15 +2572,15 @@  discard block
 block discarded – undo
2572 2572
 	function update_ref_ext($ref_ext)
2573 2573
 	{
2574 2574
         // phpcs:enable
2575
-		if (! $this->table_element)
2575
+		if (!$this->table_element)
2576 2576
 		{
2577 2577
 			dol_syslog(get_class($this)."::update_ref_ext was called on objet with property table_element not defined", LOG_ERR);
2578 2578
 			return -1;
2579 2579
 		}
2580 2580
 
2581 2581
 		$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
2582
-		$sql.= " SET ref_ext = '".$this->db->escape($ref_ext)."'";
2583
-		$sql.= " WHERE ".(isset($this->table_rowid)?$this->table_rowid:'rowid')." = ". $this->id;
2582
+		$sql .= " SET ref_ext = '".$this->db->escape($ref_ext)."'";
2583
+		$sql .= " WHERE ".(isset($this->table_rowid) ? $this->table_rowid : 'rowid')." = ".$this->id;
2584 2584
 
2585 2585
 		dol_syslog(get_class($this)."::update_ref_ext", LOG_DEBUG);
2586 2586
 		if ($this->db->query($sql))
@@ -2590,7 +2590,7 @@  discard block
 block discarded – undo
2590 2590
 		}
2591 2591
 		else
2592 2592
 		{
2593
-			$this->error=$this->db->error();
2593
+			$this->error = $this->db->error();
2594 2594
 			return -1;
2595 2595
 		}
2596 2596
 	}
@@ -2603,31 +2603,31 @@  discard block
 block discarded – undo
2603 2603
 	 *  @param		string		$suffix		'', '_public' or '_private'
2604 2604
 	 *  @return     int      		   		<0 if KO, >0 if OK
2605 2605
 	 */
2606
-	function update_note($note, $suffix='')
2606
+	function update_note($note, $suffix = '')
2607 2607
 	{
2608 2608
         // phpcs:enable
2609 2609
 		global $user;
2610 2610
 
2611
-		if (! $this->table_element)
2611
+		if (!$this->table_element)
2612 2612
 		{
2613
-			$this->error='update_note was called on objet with property table_element not defined';
2613
+			$this->error = 'update_note was called on objet with property table_element not defined';
2614 2614
 			dol_syslog(get_class($this)."::update_note was called on objet with property table_element not defined", LOG_ERR);
2615 2615
 			return -1;
2616 2616
 		}
2617
-		if (! in_array($suffix,array('','_public','_private')))
2617
+		if (!in_array($suffix, array('', '_public', '_private')))
2618 2618
 		{
2619
-			$this->error='update_note Parameter suffix must be empty, \'_private\' or \'_public\'';
2619
+			$this->error = 'update_note Parameter suffix must be empty, \'_private\' or \'_public\'';
2620 2620
 			dol_syslog(get_class($this)."::update_note Parameter suffix must be empty, '_private' or '_public'", LOG_ERR);
2621 2621
 			return -2;
2622 2622
 		}
2623 2623
 		// Special cas
2624 2624
 		//var_dump($this->table_element);exit;
2625
-		if ($this->table_element == 'product') $suffix='';
2625
+		if ($this->table_element == 'product') $suffix = '';
2626 2626
 
2627 2627
 		$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
2628
-		$sql.= " SET note".$suffix." = ".(!empty($note)?("'".$this->db->escape($note)."'"):"NULL");
2629
-		$sql.= " ,".(in_array($this->table_element, array('actioncomm', 'adherent', 'advtargetemailing', 'cronjob', 'establishment'))?"fk_user_mod":"fk_user_modif")." = ".$user->id;
2630
-		$sql.= " WHERE rowid =". $this->id;
2628
+		$sql .= " SET note".$suffix." = ".(!empty($note) ? ("'".$this->db->escape($note)."'") : "NULL");
2629
+		$sql .= " ,".(in_array($this->table_element, array('actioncomm', 'adherent', 'advtargetemailing', 'cronjob', 'establishment')) ? "fk_user_mod" : "fk_user_modif")." = ".$user->id;
2630
+		$sql .= " WHERE rowid =".$this->id;
2631 2631
 
2632 2632
 		dol_syslog(get_class($this)."::update_note", LOG_DEBUG);
2633 2633
 		if ($this->db->query($sql))
@@ -2636,14 +2636,14 @@  discard block
 block discarded – undo
2636 2636
 			else if ($suffix == '_private') $this->note_private = $note;
2637 2637
 			else
2638 2638
 			{
2639
-				$this->note = $note;      // deprecated
2639
+				$this->note = $note; // deprecated
2640 2640
 				$this->note_private = $note;
2641 2641
 			}
2642 2642
 			return 1;
2643 2643
 		}
2644 2644
 		else
2645 2645
 		{
2646
-			$this->error=$this->db->lasterror();
2646
+			$this->error = $this->db->lasterror();
2647 2647
 			return -1;
2648 2648
 		}
2649 2649
 	}
@@ -2660,7 +2660,7 @@  discard block
 block discarded – undo
2660 2660
 	function update_note_public($note)
2661 2661
 	{
2662 2662
         // phpcs:enable
2663
-		return $this->update_note($note,'_public');
2663
+		return $this->update_note($note, '_public');
2664 2664
 	}
2665 2665
 
2666 2666
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
@@ -2674,7 +2674,7 @@  discard block
 block discarded – undo
2674 2674
 	 *  @param	Societe	$seller				If roundingadjust is '0' or '1' or maybe 'auto', it means we recalculate total for lines before calculating total for object and for this, we need seller object.
2675 2675
 	 *	@return	int    			           	<0 if KO, >0 if OK
2676 2676
 	 */
2677
-	function update_price($exclspec=0,$roundingadjust='none',$nodatabaseupdate=0,$seller=null)
2677
+	function update_price($exclspec = 0, $roundingadjust = 'none', $nodatabaseupdate = 0, $seller = null)
2678 2678
 	{
2679 2679
         // phpcs:enable
2680 2680
 		global $conf, $hookmanager, $action;
@@ -2694,8 +2694,8 @@  discard block
 block discarded – undo
2694 2694
 		elseif ($this->element == 'supplier_proposal')
2695 2695
 			$MODULE = "MODULE_DISALLOW_UPDATE_PRICE_SUPPLIER_PROPOSAL";
2696 2696
 
2697
-		if (! empty($MODULE)) {
2698
-			if (! empty($conf->global->$MODULE)) {
2697
+		if (!empty($MODULE)) {
2698
+			if (!empty($conf->global->$MODULE)) {
2699 2699
 				$modsactivated = explode(',', $conf->global->$MODULE);
2700 2700
 				foreach ($modsactivated as $mod) {
2701 2701
 					if ($conf->$mod->enabled)
@@ -2706,44 +2706,44 @@  discard block
 block discarded – undo
2706 2706
 
2707 2707
 		include_once DOL_DOCUMENT_ROOT.'/core/lib/price.lib.php';
2708 2708
 
2709
-		if ($roundingadjust == '-1') $roundingadjust='auto';	// For backward compatibility
2709
+		if ($roundingadjust == '-1') $roundingadjust = 'auto'; // For backward compatibility
2710 2710
 
2711
-		$forcedroundingmode=$roundingadjust;
2712
-		if ($forcedroundingmode == 'auto' && isset($conf->global->MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND)) $forcedroundingmode=$conf->global->MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND;
2713
-		elseif ($forcedroundingmode == 'auto') $forcedroundingmode='0';
2711
+		$forcedroundingmode = $roundingadjust;
2712
+		if ($forcedroundingmode == 'auto' && isset($conf->global->MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND)) $forcedroundingmode = $conf->global->MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND;
2713
+		elseif ($forcedroundingmode == 'auto') $forcedroundingmode = '0';
2714 2714
 
2715
-		$error=0;
2715
+		$error = 0;
2716 2716
 
2717 2717
 		$multicurrency_tx = !empty($this->multicurrency_tx) ? $this->multicurrency_tx : 1;
2718 2718
 
2719 2719
 		// Define constants to find lines to sum
2720
-		$fieldtva='total_tva';
2721
-		$fieldlocaltax1='total_localtax1';
2722
-		$fieldlocaltax2='total_localtax2';
2723
-		$fieldup='subprice';
2720
+		$fieldtva = 'total_tva';
2721
+		$fieldlocaltax1 = 'total_localtax1';
2722
+		$fieldlocaltax2 = 'total_localtax2';
2723
+		$fieldup = 'subprice';
2724 2724
 		if ($this->element == 'facture_fourn' || $this->element == 'invoice_supplier')
2725 2725
 		{
2726
-			$fieldtva='tva';
2727
-			$fieldup='pu_ht';
2726
+			$fieldtva = 'tva';
2727
+			$fieldup = 'pu_ht';
2728 2728
 		}
2729 2729
 		if ($this->element == 'expensereport')
2730 2730
 		{
2731
-			$fieldup='value_unit';
2731
+			$fieldup = 'value_unit';
2732 2732
 		}
2733 2733
 
2734 2734
 		$sql = 'SELECT rowid, qty, '.$fieldup.' as up, remise_percent, total_ht, '.$fieldtva.' as total_tva, total_ttc, '.$fieldlocaltax1.' as total_localtax1, '.$fieldlocaltax2.' as total_localtax2,';
2735
-		$sql.= ' tva_tx as vatrate, localtax1_tx, localtax2_tx, localtax1_type, localtax2_type, info_bits, product_type';
2736
-			if ($this->table_element_line == 'facturedet') $sql.= ', situation_percent';
2737
-			$sql.= ', multicurrency_total_ht, multicurrency_total_tva, multicurrency_total_ttc';
2738
-		$sql.= ' FROM '.MAIN_DB_PREFIX.$this->table_element_line;
2739
-		$sql.= ' WHERE '.$this->fk_element.' = '.$this->id;
2735
+		$sql .= ' tva_tx as vatrate, localtax1_tx, localtax2_tx, localtax1_type, localtax2_type, info_bits, product_type';
2736
+			if ($this->table_element_line == 'facturedet') $sql .= ', situation_percent';
2737
+			$sql .= ', multicurrency_total_ht, multicurrency_total_tva, multicurrency_total_ttc';
2738
+		$sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element_line;
2739
+		$sql .= ' WHERE '.$this->fk_element.' = '.$this->id;
2740 2740
 		if ($exclspec)
2741 2741
 		{
2742
-			$product_field='product_type';
2743
-			if ($this->table_element_line == 'contratdet') $product_field='';    // contratdet table has no product_type field
2744
-			if ($product_field) $sql.= ' AND '.$product_field.' <> 9';
2742
+			$product_field = 'product_type';
2743
+			if ($this->table_element_line == 'contratdet') $product_field = ''; // contratdet table has no product_type field
2744
+			if ($product_field) $sql .= ' AND '.$product_field.' <> 9';
2745 2745
 		}
2746
-		$sql.= ' ORDER by rowid';	// We want to be sure to always use same order of line to not change lines differently when option MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND is used
2746
+		$sql .= ' ORDER by rowid'; // We want to be sure to always use same order of line to not change lines differently when option MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND is used
2747 2747
 
2748 2748
 		dol_syslog(get_class($this)."::update_price", LOG_DEBUG);
2749 2749
 		$resql = $this->db->query($sql);
@@ -2757,7 +2757,7 @@  discard block
 block discarded – undo
2757 2757
 			$total_ht_by_vats  = array();
2758 2758
 			$total_tva_by_vats = array();
2759 2759
 			$total_ttc_by_vats = array();
2760
-			$this->multicurrency_total_ht	= 0;
2760
+			$this->multicurrency_total_ht = 0;
2761 2761
 			$this->multicurrency_total_tva	= 0;
2762 2762
 			$this->multicurrency_total_ttc	= 0;
2763 2763
 
@@ -2768,54 +2768,54 @@  discard block
 block discarded – undo
2768 2768
 				$obj = $this->db->fetch_object($resql);
2769 2769
 
2770 2770
 				// Note: There is no check on detail line and no check on total, if $forcedroundingmode = 'none'
2771
-				$parameters=array('fk_element' => $obj->rowid);
2771
+				$parameters = array('fk_element' => $obj->rowid);
2772 2772
 				$reshook = $hookmanager->executeHooks('changeRoundingMode', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
2773 2773
 
2774 2774
 				if (empty($reshook) && $forcedroundingmode == '0')	// Check if data on line are consistent. This may solve lines that were not consistent because set with $forcedroundingmode='auto'
2775 2775
 				{
2776
-					$localtax_array=array($obj->localtax1_type,$obj->localtax1_tx,$obj->localtax2_type,$obj->localtax2_tx);
2777
-					$tmpcal=calcul_price_total($obj->qty, $obj->up, $obj->remise_percent, $obj->vatrate, $obj->localtax1_tx, $obj->localtax2_tx, 0, 'HT', $obj->info_bits, $obj->product_type, $seller, $localtax_array, (isset($obj->situation_percent) ? $obj->situation_percent : 100), $multicurrency_tx);
2778
-					$diff=price2num($tmpcal[1] - $obj->total_tva, 'MT', 1);
2776
+					$localtax_array = array($obj->localtax1_type, $obj->localtax1_tx, $obj->localtax2_type, $obj->localtax2_tx);
2777
+					$tmpcal = calcul_price_total($obj->qty, $obj->up, $obj->remise_percent, $obj->vatrate, $obj->localtax1_tx, $obj->localtax2_tx, 0, 'HT', $obj->info_bits, $obj->product_type, $seller, $localtax_array, (isset($obj->situation_percent) ? $obj->situation_percent : 100), $multicurrency_tx);
2778
+					$diff = price2num($tmpcal[1] - $obj->total_tva, 'MT', 1);
2779 2779
 					if ($diff)
2780 2780
 					{
2781
-						$sqlfix="UPDATE ".MAIN_DB_PREFIX.$this->table_element_line." SET ".$fieldtva." = ".$tmpcal[1].", total_ttc = ".$tmpcal[2]." WHERE rowid = ".$obj->rowid;
2781
+						$sqlfix = "UPDATE ".MAIN_DB_PREFIX.$this->table_element_line." SET ".$fieldtva." = ".$tmpcal[1].", total_ttc = ".$tmpcal[2]." WHERE rowid = ".$obj->rowid;
2782 2782
 						dol_syslog('We found unconsistent data into detailed line (difference of '.$diff.') for line rowid = '.$obj->rowid." (total vat of line calculated=".$tmpcal[1].", database=".$obj->total_tva."). We fix the total_vat and total_ttc of line by running sqlfix = ".$sqlfix);
2783
-								$resqlfix=$this->db->query($sqlfix);
2784
-								if (! $resqlfix) dol_print_error($this->db,'Failed to update line');
2783
+								$resqlfix = $this->db->query($sqlfix);
2784
+								if (!$resqlfix) dol_print_error($this->db, 'Failed to update line');
2785 2785
 								$obj->total_tva = $tmpcal[1];
2786 2786
 								$obj->total_ttc = $tmpcal[2];
2787 2787
 						//
2788 2788
 					}
2789 2789
 				}
2790 2790
 
2791
-				$this->total_ht        += $obj->total_ht;		// The field visible at end of line detail
2791
+				$this->total_ht        += $obj->total_ht; // The field visible at end of line detail
2792 2792
 				$this->total_tva       += $obj->total_tva;
2793 2793
 				$this->total_localtax1 += $obj->total_localtax1;
2794 2794
 				$this->total_localtax2 += $obj->total_localtax2;
2795 2795
 				$this->total_ttc       += $obj->total_ttc;
2796
-				$this->multicurrency_total_ht        += $obj->multicurrency_total_ht;		// The field visible at end of line detail
2796
+				$this->multicurrency_total_ht        += $obj->multicurrency_total_ht; // The field visible at end of line detail
2797 2797
 				$this->multicurrency_total_tva       += $obj->multicurrency_total_tva;
2798 2798
 				$this->multicurrency_total_ttc       += $obj->multicurrency_total_ttc;
2799 2799
 
2800
-				if (! isset($total_ht_by_vats[$obj->vatrate]))  $total_ht_by_vats[$obj->vatrate]=0;
2801
-				if (! isset($total_tva_by_vats[$obj->vatrate])) $total_tva_by_vats[$obj->vatrate]=0;
2802
-				if (! isset($total_ttc_by_vats[$obj->vatrate])) $total_ttc_by_vats[$obj->vatrate]=0;
2800
+				if (!isset($total_ht_by_vats[$obj->vatrate]))  $total_ht_by_vats[$obj->vatrate] = 0;
2801
+				if (!isset($total_tva_by_vats[$obj->vatrate])) $total_tva_by_vats[$obj->vatrate] = 0;
2802
+				if (!isset($total_ttc_by_vats[$obj->vatrate])) $total_ttc_by_vats[$obj->vatrate] = 0;
2803 2803
 				$total_ht_by_vats[$obj->vatrate]  += $obj->total_ht;
2804 2804
 				$total_tva_by_vats[$obj->vatrate] += $obj->total_tva;
2805 2805
 				$total_ttc_by_vats[$obj->vatrate] += $obj->total_ttc;
2806 2806
 
2807 2807
 				if ($forcedroundingmode == '1')	// Check if we need adjustement onto line for vat. TODO This works on the company currency but not on multicurrency
2808 2808
 				{
2809
-					$tmpvat=price2num($total_ht_by_vats[$obj->vatrate] * $obj->vatrate / 100, 'MT', 1);
2810
-					$diff=price2num($total_tva_by_vats[$obj->vatrate]-$tmpvat, 'MT', 1);
2809
+					$tmpvat = price2num($total_ht_by_vats[$obj->vatrate] * $obj->vatrate / 100, 'MT', 1);
2810
+					$diff = price2num($total_tva_by_vats[$obj->vatrate] - $tmpvat, 'MT', 1);
2811 2811
 					//print 'Line '.$i.' rowid='.$obj->rowid.' vat_rate='.$obj->vatrate.' total_ht='.$obj->total_ht.' total_tva='.$obj->total_tva.' total_ttc='.$obj->total_ttc.' total_ht_by_vats='.$total_ht_by_vats[$obj->vatrate].' total_tva_by_vats='.$total_tva_by_vats[$obj->vatrate].' (new calculation = '.$tmpvat.') total_ttc_by_vats='.$total_ttc_by_vats[$obj->vatrate].($diff?" => DIFF":"")."<br>\n";
2812 2812
 					if ($diff)
2813 2813
 					{
2814 2814
 						if (abs($diff) > 0.1) { dol_syslog('A rounding difference was detected into TOTAL but is too high to be corrected', LOG_WARNING); exit; }
2815
-						$sqlfix="UPDATE ".MAIN_DB_PREFIX.$this->table_element_line." SET ".$fieldtva." = ".($obj->total_tva - $diff).", total_ttc = ".($obj->total_ttc - $diff)." WHERE rowid = ".$obj->rowid;
2815
+						$sqlfix = "UPDATE ".MAIN_DB_PREFIX.$this->table_element_line." SET ".$fieldtva." = ".($obj->total_tva - $diff).", total_ttc = ".($obj->total_ttc - $diff)." WHERE rowid = ".$obj->rowid;
2816 2816
 						dol_syslog('We found a difference of '.$diff.' for line rowid = '.$obj->rowid.". We fix the total_vat and total_ttc of line by running sqlfix = ".$sqlfix);
2817
-								$resqlfix=$this->db->query($sqlfix);
2818
-								if (! $resqlfix) dol_print_error($this->db,'Failed to update line');
2817
+								$resqlfix = $this->db->query($sqlfix);
2818
+								if (!$resqlfix) dol_print_error($this->db, 'Failed to update line');
2819 2819
 								$this->total_tva -= $diff;
2820 2820
 								$this->total_ttc -= $diff;
2821 2821
 								$total_tva_by_vats[$obj->vatrate] -= $diff;
@@ -2827,11 +2827,11 @@  discard block
 block discarded – undo
2827 2827
 			}
2828 2828
 
2829 2829
 			// Add revenue stamp to total
2830
-			$this->total_ttc       			+= isset($this->revenuestamp)?$this->revenuestamp:0;
2831
-			$this->multicurrency_total_ttc  += isset($this->revenuestamp)?($this->revenuestamp * $multicurrency_tx):0;
2830
+			$this->total_ttc += isset($this->revenuestamp) ? $this->revenuestamp : 0;
2831
+			$this->multicurrency_total_ttc += isset($this->revenuestamp) ? ($this->revenuestamp * $multicurrency_tx) : 0;
2832 2832
 
2833 2833
 			// Situations totals
2834
-			if ($this->situation_cycle_ref && $this->situation_counter > 1 && method_exists($this, 'get_prev_sits') && $this->type != $this::TYPE_CREDIT_NOTE )
2834
+			if ($this->situation_cycle_ref && $this->situation_counter > 1 && method_exists($this, 'get_prev_sits') && $this->type != $this::TYPE_CREDIT_NOTE)
2835 2835
 			{
2836 2836
 				$prev_sits = $this->get_prev_sits();
2837 2837
 
@@ -2850,17 +2850,17 @@  discard block
 block discarded – undo
2850 2850
 			$this->db->free($resql);
2851 2851
 
2852 2852
 			// Now update global field total_ht, total_ttc and tva
2853
-			$fieldht='total_ht';
2854
-			$fieldtva='tva';
2855
-			$fieldlocaltax1='localtax1';
2856
-			$fieldlocaltax2='localtax2';
2857
-			$fieldttc='total_ttc';
2853
+			$fieldht = 'total_ht';
2854
+			$fieldtva = 'tva';
2855
+			$fieldlocaltax1 = 'localtax1';
2856
+			$fieldlocaltax2 = 'localtax2';
2857
+			$fieldttc = 'total_ttc';
2858 2858
 			// Specific code for backward compatibility with old field names
2859
-			if ($this->element == 'facture' || $this->element == 'facturerec')             $fieldht='total';
2860
-			if ($this->element == 'facture_fourn' || $this->element == 'invoice_supplier') $fieldtva='total_tva';
2861
-			if ($this->element == 'propal')                                                $fieldttc='total';
2862
-			if ($this->element == 'expensereport')                                         $fieldtva='total_tva';
2863
-			if ($this->element == 'supplier_proposal')                                     $fieldttc='total';
2859
+			if ($this->element == 'facture' || $this->element == 'facturerec')             $fieldht = 'total';
2860
+			if ($this->element == 'facture_fourn' || $this->element == 'invoice_supplier') $fieldtva = 'total_tva';
2861
+			if ($this->element == 'propal')                                                $fieldttc = 'total';
2862
+			if ($this->element == 'expensereport')                                         $fieldtva = 'total_tva';
2863
+			if ($this->element == 'supplier_proposal')                                     $fieldttc = 'total';
2864 2864
 
2865 2865
 			if (empty($nodatabaseupdate))
2866 2866
 			{
@@ -2877,16 +2877,16 @@  discard block
 block discarded – undo
2877 2877
 
2878 2878
 
2879 2879
 				dol_syslog(get_class($this)."::update_price", LOG_DEBUG);
2880
-				$resql=$this->db->query($sql);
2881
-				if (! $resql)
2880
+				$resql = $this->db->query($sql);
2881
+				if (!$resql)
2882 2882
 				{
2883 2883
 					$error++;
2884
-					$this->error=$this->db->lasterror();
2885
-					$this->errors[]=$this->db->lasterror();
2884
+					$this->error = $this->db->lasterror();
2885
+					$this->errors[] = $this->db->lasterror();
2886 2886
 				}
2887 2887
 			}
2888 2888
 
2889
-			if (! $error)
2889
+			if (!$error)
2890 2890
 			{
2891 2891
 				return 1;
2892 2892
 			}
@@ -2897,7 +2897,7 @@  discard block
 block discarded – undo
2897 2897
 		}
2898 2898
 		else
2899 2899
 		{
2900
-			dol_print_error($this->db,'Bad request in update_price');
2900
+			dol_print_error($this->db, 'Bad request in update_price');
2901 2901
 			return -1;
2902 2902
 		}
2903 2903
 	}
@@ -2911,30 +2911,30 @@  discard block
 block discarded – undo
2911 2911
 	 *	@return		int					<=0 if KO, >0 if OK
2912 2912
 	 *	@see		fetchObjectLinked, updateObjectLinked, deleteObjectLinked
2913 2913
 	 */
2914
-	function add_object_linked($origin=null, $origin_id=null)
2914
+	function add_object_linked($origin = null, $origin_id = null)
2915 2915
 	{
2916 2916
         // phpcs:enable
2917
-		$origin = (! empty($origin) ? $origin : $this->origin);
2918
-		$origin_id = (! empty($origin_id) ? $origin_id : $this->origin_id);
2917
+		$origin = (!empty($origin) ? $origin : $this->origin);
2918
+		$origin_id = (!empty($origin_id) ? $origin_id : $this->origin_id);
2919 2919
 
2920 2920
 		// Special case
2921
-		if ($origin == 'order') $origin='commande';
2922
-		if ($origin == 'invoice') $origin='facture';
2923
-		if ($origin == 'invoice_template') $origin='facturerec';
2924
-    	if ($origin == 'supplierorder') $origin='order_supplier';
2921
+		if ($origin == 'order') $origin = 'commande';
2922
+		if ($origin == 'invoice') $origin = 'facture';
2923
+		if ($origin == 'invoice_template') $origin = 'facturerec';
2924
+    	if ($origin == 'supplierorder') $origin = 'order_supplier';
2925 2925
 		$this->db->begin();
2926 2926
 
2927 2927
 		$sql = "INSERT INTO ".MAIN_DB_PREFIX."element_element (";
2928
-		$sql.= "fk_source";
2929
-		$sql.= ", sourcetype";
2930
-		$sql.= ", fk_target";
2931
-		$sql.= ", targettype";
2932
-		$sql.= ") VALUES (";
2933
-		$sql.= $origin_id;
2934
-		$sql.= ", '".$this->db->escape($origin)."'";
2935
-		$sql.= ", ".$this->id;
2936
-		$sql.= ", '".$this->db->escape($this->element)."'";
2937
-		$sql.= ")";
2928
+		$sql .= "fk_source";
2929
+		$sql .= ", sourcetype";
2930
+		$sql .= ", fk_target";
2931
+		$sql .= ", targettype";
2932
+		$sql .= ") VALUES (";
2933
+		$sql .= $origin_id;
2934
+		$sql .= ", '".$this->db->escape($origin)."'";
2935
+		$sql .= ", ".$this->id;
2936
+		$sql .= ", '".$this->db->escape($this->element)."'";
2937
+		$sql .= ")";
2938 2938
 
2939 2939
 		dol_syslog(get_class($this)."::add_object_linked", LOG_DEBUG);
2940 2940
 		if ($this->db->query($sql))
@@ -2944,7 +2944,7 @@  discard block
 block discarded – undo
2944 2944
 	  	}
2945 2945
 	  	else
2946 2946
 	  	{
2947
-	  		$this->error=$this->db->lasterror();
2947
+	  		$this->error = $this->db->lasterror();
2948 2948
 	  		$this->db->rollback();
2949 2949
 	  		return 0;
2950 2950
 	  	}
@@ -2972,33 +2972,33 @@  discard block
 block discarded – undo
2972 2972
 	 *	@return int							<0 if KO, >0 if OK
2973 2973
 	 *  @see	add_object_linked, updateObjectLinked, deleteObjectLinked
2974 2974
 	 */
2975
-	function fetchObjectLinked($sourceid=null,$sourcetype='',$targetid=null,$targettype='',$clause='OR',$alsosametype=1,$orderby='sourcetype',$loadalsoobjects=1)
2975
+	function fetchObjectLinked($sourceid = null, $sourcetype = '', $targetid = null, $targettype = '', $clause = 'OR', $alsosametype = 1, $orderby = 'sourcetype', $loadalsoobjects = 1)
2976 2976
 	{
2977 2977
 		global $conf;
2978 2978
 
2979
-		$this->linkedObjectsIds=array();
2980
-		$this->linkedObjects=array();
2979
+		$this->linkedObjectsIds = array();
2980
+		$this->linkedObjects = array();
2981 2981
 
2982
-		$justsource=false;
2983
-		$justtarget=false;
2984
-		$withtargettype=false;
2985
-		$withsourcetype=false;
2982
+		$justsource = false;
2983
+		$justtarget = false;
2984
+		$withtargettype = false;
2985
+		$withsourcetype = false;
2986 2986
 
2987
-		if (! empty($sourceid) && ! empty($sourcetype) && empty($targetid))
2987
+		if (!empty($sourceid) && !empty($sourcetype) && empty($targetid))
2988 2988
 		{
2989
-			$justsource=true;  // the source (id and type) is a search criteria
2990
-			if (! empty($targettype)) $withtargettype=true;
2989
+			$justsource = true; // the source (id and type) is a search criteria
2990
+			if (!empty($targettype)) $withtargettype = true;
2991 2991
 		}
2992
-		if (! empty($targetid) && ! empty($targettype) && empty($sourceid))
2992
+		if (!empty($targetid) && !empty($targettype) && empty($sourceid))
2993 2993
 		{
2994
-			$justtarget=true;  // the target (id and type) is a search criteria
2995
-			if (! empty($sourcetype)) $withsourcetype=true;
2994
+			$justtarget = true; // the target (id and type) is a search criteria
2995
+			if (!empty($sourcetype)) $withsourcetype = true;
2996 2996
 		}
2997 2997
 
2998
-		$sourceid = (! empty($sourceid) ? $sourceid : $this->id);
2999
-		$targetid = (! empty($targetid) ? $targetid : $this->id);
3000
-		$sourcetype = (! empty($sourcetype) ? $sourcetype : $this->element);
3001
-		$targettype = (! empty($targettype) ? $targettype : $this->element);
2998
+		$sourceid = (!empty($sourceid) ? $sourceid : $this->id);
2999
+		$targetid = (!empty($targetid) ? $targetid : $this->id);
3000
+		$sourcetype = (!empty($sourcetype) ? $sourcetype : $this->element);
3001
+		$targettype = (!empty($targettype) ? $targettype : $this->element);
3002 3002
 
3003 3003
 		/*if (empty($sourceid) && empty($targetid))
3004 3004
 		 {
@@ -3008,25 +3008,25 @@  discard block
 block discarded – undo
3008 3008
 
3009 3009
 		// Links between objects are stored in table element_element
3010 3010
 		$sql = 'SELECT rowid, fk_source, sourcetype, fk_target, targettype';
3011
-		$sql.= ' FROM '.MAIN_DB_PREFIX.'element_element';
3012
-		$sql.= " WHERE ";
3011
+		$sql .= ' FROM '.MAIN_DB_PREFIX.'element_element';
3012
+		$sql .= " WHERE ";
3013 3013
 		if ($justsource || $justtarget)
3014 3014
 		{
3015 3015
 			if ($justsource)
3016 3016
 			{
3017
-				$sql.= "fk_source = ".$sourceid." AND sourcetype = '".$sourcetype."'";
3018
-				if ($withtargettype) $sql.= " AND targettype = '".$targettype."'";
3017
+				$sql .= "fk_source = ".$sourceid." AND sourcetype = '".$sourcetype."'";
3018
+				if ($withtargettype) $sql .= " AND targettype = '".$targettype."'";
3019 3019
 			}
3020 3020
 			else if ($justtarget)
3021 3021
 			{
3022
-				$sql.= "fk_target = ".$targetid." AND targettype = '".$targettype."'";
3023
-				if ($withsourcetype) $sql.= " AND sourcetype = '".$sourcetype."'";
3022
+				$sql .= "fk_target = ".$targetid." AND targettype = '".$targettype."'";
3023
+				if ($withsourcetype) $sql .= " AND sourcetype = '".$sourcetype."'";
3024 3024
 			}
3025 3025
 		}
3026 3026
 		else
3027 3027
 		{
3028
-			$sql.= "(fk_source = ".$sourceid." AND sourcetype = '".$sourcetype."')";
3029
-			$sql.= " ".$clause." (fk_target = ".$targetid." AND targettype = '".$targettype."')";
3028
+			$sql .= "(fk_source = ".$sourceid." AND sourcetype = '".$sourcetype."')";
3029
+			$sql .= " ".$clause." (fk_target = ".$targetid." AND targettype = '".$targettype."')";
3030 3030
 		}
3031 3031
 		$sql .= ' ORDER BY '.$orderby;
3032 3032
 
@@ -3043,36 +3043,36 @@  discard block
 block discarded – undo
3043 3043
 				{
3044 3044
 					if ($justsource)
3045 3045
 					{
3046
-						$this->linkedObjectsIds[$obj->targettype][$obj->rowid]=$obj->fk_target;
3046
+						$this->linkedObjectsIds[$obj->targettype][$obj->rowid] = $obj->fk_target;
3047 3047
 					}
3048 3048
 					else if ($justtarget)
3049 3049
 					{
3050
-						$this->linkedObjectsIds[$obj->sourcetype][$obj->rowid]=$obj->fk_source;
3050
+						$this->linkedObjectsIds[$obj->sourcetype][$obj->rowid] = $obj->fk_source;
3051 3051
 					}
3052 3052
 				}
3053 3053
 				else
3054 3054
 				{
3055 3055
 					if ($obj->fk_source == $sourceid && $obj->sourcetype == $sourcetype)
3056 3056
 					{
3057
-						$this->linkedObjectsIds[$obj->targettype][$obj->rowid]=$obj->fk_target;
3057
+						$this->linkedObjectsIds[$obj->targettype][$obj->rowid] = $obj->fk_target;
3058 3058
 					}
3059 3059
 					if ($obj->fk_target == $targetid && $obj->targettype == $targettype)
3060 3060
 					{
3061
-						$this->linkedObjectsIds[$obj->sourcetype][$obj->rowid]=$obj->fk_source;
3061
+						$this->linkedObjectsIds[$obj->sourcetype][$obj->rowid] = $obj->fk_source;
3062 3062
 					}
3063 3063
 				}
3064 3064
 				$i++;
3065 3065
 			}
3066 3066
 
3067
-			if (! empty($this->linkedObjectsIds))
3067
+			if (!empty($this->linkedObjectsIds))
3068 3068
 			{
3069 3069
 				$tmparray = $this->linkedObjectsIds;
3070
-				foreach($tmparray as $objecttype => $objectids)       // $objecttype is a module name ('facture', 'mymodule', ...) or a module name with a suffix ('project_task', 'mymodule_myobj', ...)
3070
+				foreach ($tmparray as $objecttype => $objectids)       // $objecttype is a module name ('facture', 'mymodule', ...) or a module name with a suffix ('project_task', 'mymodule_myobj', ...)
3071 3071
 				{
3072 3072
 					// Parse element/subelement (ex: project_task, cabinetmed_consultation, ...)
3073 3073
 					$module = $element = $subelement = $objecttype;
3074 3074
 					if ($objecttype != 'supplier_proposal' && $objecttype != 'order_supplier' && $objecttype != 'invoice_supplier'
3075
-						&& preg_match('/^([^_]+)_([^_]+)/i',$objecttype,$regs))
3075
+						&& preg_match('/^([^_]+)_([^_]+)/i', $objecttype, $regs))
3076 3076
 					{
3077 3077
 						$module = $element = $regs[1];
3078 3078
 						$subelement = $regs[2];
@@ -3080,31 +3080,31 @@  discard block
 block discarded – undo
3080 3080
 
3081 3081
 					$classpath = $element.'/class';
3082 3082
 					// To work with non standard classpath or module name
3083
-					if ($objecttype == 'facture')			{
3083
+					if ($objecttype == 'facture') {
3084 3084
 						$classpath = 'compta/facture/class';
3085 3085
 					}
3086
-					else if ($objecttype == 'facturerec')			{
3086
+					else if ($objecttype == 'facturerec') {
3087 3087
 						$classpath = 'compta/facture/class'; $module = 'facture';
3088 3088
 					}
3089
-					else if ($objecttype == 'propal')			{
3089
+					else if ($objecttype == 'propal') {
3090 3090
 						$classpath = 'comm/propal/class';
3091 3091
 					}
3092
-					else if ($objecttype == 'supplier_proposal')			{
3092
+					else if ($objecttype == 'supplier_proposal') {
3093 3093
 						$classpath = 'supplier_proposal/class';
3094 3094
 					}
3095
-					else if ($objecttype == 'shipping')			{
3095
+					else if ($objecttype == 'shipping') {
3096 3096
 						$classpath = 'expedition/class'; $subelement = 'expedition'; $module = 'expedition_bon';
3097 3097
 					}
3098
-					else if ($objecttype == 'delivery')			{
3098
+					else if ($objecttype == 'delivery') {
3099 3099
 						$classpath = 'livraison/class'; $subelement = 'livraison'; $module = 'livraison_bon';
3100 3100
 					}
3101
-					else if ($objecttype == 'invoice_supplier' || $objecttype == 'order_supplier')	{
3101
+					else if ($objecttype == 'invoice_supplier' || $objecttype == 'order_supplier') {
3102 3102
 						$classpath = 'fourn/class'; $module = 'fournisseur';
3103 3103
 					}
3104
-					else if ($objecttype == 'fichinter')			{
3104
+					else if ($objecttype == 'fichinter') {
3105 3105
 						$classpath = 'fichinter/class'; $subelement = 'fichinter'; $module = 'ficheinter';
3106 3106
 					}
3107
-					else if ($objecttype == 'subscription')			{
3107
+					else if ($objecttype == 'subscription') {
3108 3108
 						$classpath = 'adherents/class'; $module = 'adherent';
3109 3109
 					}
3110 3110
 
@@ -3117,16 +3117,16 @@  discard block
 block discarded – undo
3117 3117
 					else if ($objecttype == 'invoice_supplier') {
3118 3118
 						$classfile = 'fournisseur.facture'; $classname = 'FactureFournisseur';
3119 3119
 					}
3120
-					else if ($objecttype == 'order_supplier')   {
3120
+					else if ($objecttype == 'order_supplier') {
3121 3121
 						$classfile = 'fournisseur.commande'; $classname = 'CommandeFournisseur';
3122 3122
 					}
3123
-					else if ($objecttype == 'supplier_proposal')   {
3123
+					else if ($objecttype == 'supplier_proposal') {
3124 3124
 						$classfile = 'supplier_proposal'; $classname = 'SupplierProposal';
3125 3125
 					}
3126
-					else if ($objecttype == 'facturerec')   {
3126
+					else if ($objecttype == 'facturerec') {
3127 3127
 						$classfile = 'facture-rec'; $classname = 'FactureRec';
3128 3128
 					}
3129
-					else if ($objecttype == 'subscription')   {
3129
+					else if ($objecttype == 'subscription') {
3130 3130
 						$classfile = 'subscription'; $classname = 'Subscription';
3131 3131
 					}
3132 3132
 
@@ -3139,7 +3139,7 @@  discard block
 block discarded – undo
3139 3139
 							//print '/'.$classpath.'/'.$classfile.'.class.php '.class_exists($classname);
3140 3140
 							if (class_exists($classname))
3141 3141
 							{
3142
-								foreach($objectids as $i => $objectid)	// $i is rowid into llx_element_element
3142
+								foreach ($objectids as $i => $objectid)	// $i is rowid into llx_element_element
3143 3143
 								{
3144 3144
 									$object = new $classname($this->db);
3145 3145
 									$ret = $object->fetch($objectid);
@@ -3176,28 +3176,28 @@  discard block
 block discarded – undo
3176 3176
 	 *	@return							int	>0 if OK, <0 if KO
3177 3177
 	 *	@see	add_object_linked, fetObjectLinked, deleteObjectLinked
3178 3178
 	 */
3179
-	function updateObjectLinked($sourceid=null, $sourcetype='', $targetid=null, $targettype='')
3179
+	function updateObjectLinked($sourceid = null, $sourcetype = '', $targetid = null, $targettype = '')
3180 3180
 	{
3181
-		$updatesource=false;
3182
-		$updatetarget=false;
3181
+		$updatesource = false;
3182
+		$updatetarget = false;
3183 3183
 
3184
-		if (! empty($sourceid) && ! empty($sourcetype) && empty($targetid) && empty($targettype)) $updatesource=true;
3185
-		else if (empty($sourceid) && empty($sourcetype) && ! empty($targetid) && ! empty($targettype)) $updatetarget=true;
3184
+		if (!empty($sourceid) && !empty($sourcetype) && empty($targetid) && empty($targettype)) $updatesource = true;
3185
+		else if (empty($sourceid) && empty($sourcetype) && !empty($targetid) && !empty($targettype)) $updatetarget = true;
3186 3186
 
3187 3187
 		$sql = "UPDATE ".MAIN_DB_PREFIX."element_element SET ";
3188 3188
 		if ($updatesource)
3189 3189
 		{
3190
-			$sql.= "fk_source = ".$sourceid;
3191
-			$sql.= ", sourcetype = '".$this->db->escape($sourcetype)."'";
3192
-			$sql.= " WHERE fk_target = ".$this->id;
3193
-			$sql.= " AND targettype = '".$this->db->escape($this->element)."'";
3190
+			$sql .= "fk_source = ".$sourceid;
3191
+			$sql .= ", sourcetype = '".$this->db->escape($sourcetype)."'";
3192
+			$sql .= " WHERE fk_target = ".$this->id;
3193
+			$sql .= " AND targettype = '".$this->db->escape($this->element)."'";
3194 3194
 		}
3195 3195
 		else if ($updatetarget)
3196 3196
 		{
3197
-			$sql.= "fk_target = ".$targetid;
3198
-			$sql.= ", targettype = '".$this->db->escape($targettype)."'";
3199
-			$sql.= " WHERE fk_source = ".$this->id;
3200
-			$sql.= " AND sourcetype = '".$this->db->escape($this->element)."'";
3197
+			$sql .= "fk_target = ".$targetid;
3198
+			$sql .= ", targettype = '".$this->db->escape($targettype)."'";
3199
+			$sql .= " WHERE fk_source = ".$this->id;
3200
+			$sql .= " AND sourcetype = '".$this->db->escape($this->element)."'";
3201 3201
 		}
3202 3202
 
3203 3203
 		dol_syslog(get_class($this)."::updateObjectLinked", LOG_DEBUG);
@@ -3207,7 +3207,7 @@  discard block
 block discarded – undo
3207 3207
 		}
3208 3208
 		else
3209 3209
 		{
3210
-			$this->error=$this->db->lasterror();
3210
+			$this->error = $this->db->lasterror();
3211 3211
 			return -1;
3212 3212
 		}
3213 3213
 	}
@@ -3223,42 +3223,42 @@  discard block
 block discarded – undo
3223 3223
 	 *	@return     					int	>0 if OK, <0 if KO
3224 3224
 	 *	@see	add_object_linked, updateObjectLinked, fetchObjectLinked
3225 3225
 	 */
3226
-	function deleteObjectLinked($sourceid=null, $sourcetype='', $targetid=null, $targettype='', $rowid='')
3226
+	function deleteObjectLinked($sourceid = null, $sourcetype = '', $targetid = null, $targettype = '', $rowid = '')
3227 3227
 	{
3228
-		$deletesource=false;
3229
-		$deletetarget=false;
3228
+		$deletesource = false;
3229
+		$deletetarget = false;
3230 3230
 
3231
-		if (! empty($sourceid) && ! empty($sourcetype) && empty($targetid) && empty($targettype)) $deletesource=true;
3232
-		else if (empty($sourceid) && empty($sourcetype) && ! empty($targetid) && ! empty($targettype)) $deletetarget=true;
3231
+		if (!empty($sourceid) && !empty($sourcetype) && empty($targetid) && empty($targettype)) $deletesource = true;
3232
+		else if (empty($sourceid) && empty($sourcetype) && !empty($targetid) && !empty($targettype)) $deletetarget = true;
3233 3233
 
3234
-		$sourceid = (! empty($sourceid) ? $sourceid : $this->id);
3235
-		$sourcetype = (! empty($sourcetype) ? $sourcetype : $this->element);
3236
-		$targetid = (! empty($targetid) ? $targetid : $this->id);
3237
-		$targettype = (! empty($targettype) ? $targettype : $this->element);
3234
+		$sourceid = (!empty($sourceid) ? $sourceid : $this->id);
3235
+		$sourcetype = (!empty($sourcetype) ? $sourcetype : $this->element);
3236
+		$targetid = (!empty($targetid) ? $targetid : $this->id);
3237
+		$targettype = (!empty($targettype) ? $targettype : $this->element);
3238 3238
 
3239 3239
 		$sql = "DELETE FROM ".MAIN_DB_PREFIX."element_element";
3240
-		$sql.= " WHERE";
3240
+		$sql .= " WHERE";
3241 3241
 		if ($rowid > 0)
3242 3242
 		{
3243
-			$sql.=" rowid = ".$rowid;
3243
+			$sql .= " rowid = ".$rowid;
3244 3244
 		}
3245 3245
 		else
3246 3246
 		{
3247 3247
 			if ($deletesource)
3248 3248
 			{
3249
-				$sql.= " fk_source = ".$sourceid." AND sourcetype = '".$this->db->escape($sourcetype)."'";
3250
-				$sql.= " AND fk_target = ".$this->id." AND targettype = '".$this->db->escape($this->element)."'";
3249
+				$sql .= " fk_source = ".$sourceid." AND sourcetype = '".$this->db->escape($sourcetype)."'";
3250
+				$sql .= " AND fk_target = ".$this->id." AND targettype = '".$this->db->escape($this->element)."'";
3251 3251
 			}
3252 3252
 			else if ($deletetarget)
3253 3253
 			{
3254
-				$sql.= " fk_target = ".$targetid." AND targettype = '".$this->db->escape($targettype)."'";
3255
-				$sql.= " AND fk_source = ".$this->id." AND sourcetype = '".$this->db->escape($this->element)."'";
3254
+				$sql .= " fk_target = ".$targetid." AND targettype = '".$this->db->escape($targettype)."'";
3255
+				$sql .= " AND fk_source = ".$this->id." AND sourcetype = '".$this->db->escape($this->element)."'";
3256 3256
 			}
3257 3257
 			else
3258 3258
 			{
3259
-				$sql.= " (fk_source = ".$this->id." AND sourcetype = '".$this->db->escape($this->element)."')";
3260
-				$sql.= " OR";
3261
-				$sql.= " (fk_target = ".$this->id." AND targettype = '".$this->db->escape($this->element)."')";
3259
+				$sql .= " (fk_source = ".$this->id." AND sourcetype = '".$this->db->escape($this->element)."')";
3260
+				$sql .= " OR";
3261
+				$sql .= " (fk_target = ".$this->id." AND targettype = '".$this->db->escape($this->element)."')";
3262 3262
 			}
3263 3263
 		}
3264 3264
 
@@ -3269,8 +3269,8 @@  discard block
 block discarded – undo
3269 3269
 		}
3270 3270
 		else
3271 3271
 		{
3272
-			$this->error=$this->db->lasterror();
3273
-			$this->errors[]=$this->error;
3272
+			$this->error = $this->db->lasterror();
3273
+			$this->errors[] = $this->error;
3274 3274
 			return -1;
3275 3275
 		}
3276 3276
 	}
@@ -3284,30 +3284,30 @@  discard block
 block discarded – undo
3284 3284
 	 *      @param	string	$trigkey		Trigger key to use for trigger
3285 3285
 	 *      @return int						<0 if KO, >0 if OK
3286 3286
 	 */
3287
-	function setStatut($status, $elementId=null, $elementType='', $trigkey='')
3287
+	function setStatut($status, $elementId = null, $elementType = '', $trigkey = '')
3288 3288
 	{
3289
-		global $user,$langs,$conf;
3289
+		global $user, $langs, $conf;
3290 3290
 
3291
-		$savElementId=$elementId;  // To be used later to know if we were using the method using the id of this or not.
3291
+		$savElementId = $elementId; // To be used later to know if we were using the method using the id of this or not.
3292 3292
 
3293
-		$elementId = (!empty($elementId)?$elementId:$this->id);
3294
-		$elementTable = (!empty($elementType)?$elementType:$this->table_element);
3293
+		$elementId = (!empty($elementId) ? $elementId : $this->id);
3294
+		$elementTable = (!empty($elementType) ? $elementType : $this->table_element);
3295 3295
 
3296 3296
 		$this->db->begin();
3297 3297
 
3298
-		$fieldstatus="fk_statut";
3299
-		if ($elementTable == 'facture_rec') $fieldstatus="suspended";
3300
-		if ($elementTable == 'mailing') $fieldstatus="statut";
3301
-		if ($elementTable == 'cronjob') $fieldstatus="status";
3302
-		if ($elementTable == 'user') $fieldstatus="statut";
3303
-		if ($elementTable == 'expensereport') $fieldstatus="fk_statut";
3304
-		if ($elementTable == 'commande_fournisseur_dispatch') $fieldstatus="status";
3298
+		$fieldstatus = "fk_statut";
3299
+		if ($elementTable == 'facture_rec') $fieldstatus = "suspended";
3300
+		if ($elementTable == 'mailing') $fieldstatus = "statut";
3301
+		if ($elementTable == 'cronjob') $fieldstatus = "status";
3302
+		if ($elementTable == 'user') $fieldstatus = "statut";
3303
+		if ($elementTable == 'expensereport') $fieldstatus = "fk_statut";
3304
+		if ($elementTable == 'commande_fournisseur_dispatch') $fieldstatus = "status";
3305 3305
 
3306 3306
 		$sql = "UPDATE ".MAIN_DB_PREFIX.$elementTable;
3307
-		$sql.= " SET ".$fieldstatus." = ".$status;
3307
+		$sql .= " SET ".$fieldstatus." = ".$status;
3308 3308
 		// If status = 1 = validated, update also fk_user_valid
3309
-		if ($status == 1 && $elementTable == 'expensereport') $sql.=", fk_user_valid = ".$user->id;
3310
-		$sql.= " WHERE rowid=".$elementId;
3309
+		if ($status == 1 && $elementTable == 'expensereport') $sql .= ", fk_user_valid = ".$user->id;
3310
+		$sql .= " WHERE rowid=".$elementId;
3311 3311
 
3312 3312
 		dol_syslog(get_class($this)."::setStatut", LOG_DEBUG);
3313 3313
 		if ($this->db->query($sql))
@@ -3317,27 +3317,27 @@  discard block
 block discarded – undo
3317 3317
 			// Try autoset of trigkey
3318 3318
 			if (empty($trigkey))
3319 3319
 			{
3320
-				if ($this->element == 'supplier_proposal' && $status == 2) $trigkey='SUPPLIER_PROPOSAL_SIGN';   // 2 = SupplierProposal::STATUS_SIGNED. Can't use constant into this generic class
3321
-				if ($this->element == 'supplier_proposal' && $status == 3) $trigkey='SUPPLIER_PROPOSAL_REFUSE'; // 3 = SupplierProposal::STATUS_REFUSED. Can't use constant into this generic class
3322
-				if ($this->element == 'supplier_proposal' && $status == 4) $trigkey='SUPPLIER_PROPOSAL_CLOSE';  // 4 = SupplierProposal::STATUS_CLOSED. Can't use constant into this generic class
3323
-				if ($this->element == 'fichinter' && $status == 3) $trigkey='FICHINTER_CLASSIFY_DONE';
3324
-				if ($this->element == 'fichinter' && $status == 2) $trigkey='FICHINTER_CLASSIFY_BILLED';
3325
-				if ($this->element == 'fichinter' && $status == 1) $trigkey='FICHINTER_CLASSIFY_UNBILLED';
3320
+				if ($this->element == 'supplier_proposal' && $status == 2) $trigkey = 'SUPPLIER_PROPOSAL_SIGN'; // 2 = SupplierProposal::STATUS_SIGNED. Can't use constant into this generic class
3321
+				if ($this->element == 'supplier_proposal' && $status == 3) $trigkey = 'SUPPLIER_PROPOSAL_REFUSE'; // 3 = SupplierProposal::STATUS_REFUSED. Can't use constant into this generic class
3322
+				if ($this->element == 'supplier_proposal' && $status == 4) $trigkey = 'SUPPLIER_PROPOSAL_CLOSE'; // 4 = SupplierProposal::STATUS_CLOSED. Can't use constant into this generic class
3323
+				if ($this->element == 'fichinter' && $status == 3) $trigkey = 'FICHINTER_CLASSIFY_DONE';
3324
+				if ($this->element == 'fichinter' && $status == 2) $trigkey = 'FICHINTER_CLASSIFY_BILLED';
3325
+				if ($this->element == 'fichinter' && $status == 1) $trigkey = 'FICHINTER_CLASSIFY_UNBILLED';
3326 3326
 			}
3327 3327
 
3328 3328
 			if ($trigkey)
3329 3329
 			{
3330 3330
 				// Appel des triggers
3331
-				include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php';
3332
-				$interface=new Interfaces($this->db);
3333
-				$result=$interface->run_triggers($trigkey,$this,$user,$langs,$conf);
3331
+				include_once DOL_DOCUMENT_ROOT.'/core/class/interfaces.class.php';
3332
+				$interface = new Interfaces($this->db);
3333
+				$result = $interface->run_triggers($trigkey, $this, $user, $langs, $conf);
3334 3334
 				if ($result < 0) {
3335
-					$error++; $this->errors=$interface->errors;
3335
+					$error++; $this->errors = $interface->errors;
3336 3336
 				}
3337 3337
 				// Fin appel triggers
3338 3338
 			}
3339 3339
 
3340
-			if (! $error)
3340
+			if (!$error)
3341 3341
 			{
3342 3342
 				$this->db->commit();
3343 3343
 
@@ -3352,13 +3352,13 @@  discard block
 block discarded – undo
3352 3352
 			else
3353 3353
 			{
3354 3354
 				$this->db->rollback();
3355
-				dol_syslog(get_class($this)."::setStatus ".$this->error,LOG_ERR);
3355
+				dol_syslog(get_class($this)."::setStatus ".$this->error, LOG_ERR);
3356 3356
 				return -1;
3357 3357
 			}
3358 3358
 		}
3359 3359
 		else
3360 3360
 		{
3361
-			$this->error=$this->db->lasterror();
3361
+			$this->error = $this->db->lasterror();
3362 3362
 			$this->db->rollback();
3363 3363
 			return -1;
3364 3364
 		}
@@ -3372,21 +3372,21 @@  discard block
 block discarded – undo
3372 3372
 	 *  @param      string	$ref    Record ref
3373 3373
 	 *  @return		int				<0 if KO, 0 if nothing done, >0 if OK
3374 3374
 	 */
3375
-	function getCanvas($id=0,$ref='')
3375
+	function getCanvas($id = 0, $ref = '')
3376 3376
 	{
3377 3377
 		global $conf;
3378 3378
 
3379 3379
 		if (empty($id) && empty($ref)) return 0;
3380
-		if (! empty($conf->global->MAIN_DISABLE_CANVAS)) return 0;    // To increase speed. Not enabled by default.
3380
+		if (!empty($conf->global->MAIN_DISABLE_CANVAS)) return 0; // To increase speed. Not enabled by default.
3381 3381
 
3382 3382
 		// Clean parameters
3383 3383
 		$ref = trim($ref);
3384 3384
 
3385 3385
 		$sql = "SELECT rowid, canvas";
3386
-		$sql.= " FROM ".MAIN_DB_PREFIX.$this->table_element;
3387
-		$sql.= " WHERE entity IN (".getEntity($this->element).")";
3388
-		if (! empty($id))  $sql.= " AND rowid = ".$id;
3389
-		if (! empty($ref)) $sql.= " AND ref = '".$this->db->escape($ref)."'";
3386
+		$sql .= " FROM ".MAIN_DB_PREFIX.$this->table_element;
3387
+		$sql .= " WHERE entity IN (".getEntity($this->element).")";
3388
+		if (!empty($id))  $sql .= " AND rowid = ".$id;
3389
+		if (!empty($ref)) $sql .= " AND ref = '".$this->db->escape($ref)."'";
3390 3390
 
3391 3391
 		$resql = $this->db->query($sql);
3392 3392
 		if ($resql)
@@ -3394,7 +3394,7 @@  discard block
 block discarded – undo
3394 3394
 			$obj = $this->db->fetch_object($resql);
3395 3395
 			if ($obj)
3396 3396
 			{
3397
-				$this->canvas   = $obj->canvas;
3397
+				$this->canvas = $obj->canvas;
3398 3398
 				return 1;
3399 3399
 			}
3400 3400
 			else return 0;
@@ -3416,7 +3416,7 @@  discard block
 block discarded – undo
3416 3416
 	function getSpecialCode($lineid)
3417 3417
 	{
3418 3418
 		$sql = 'SELECT special_code FROM '.MAIN_DB_PREFIX.$this->table_element_line;
3419
-		$sql.= ' WHERE rowid = '.$lineid;
3419
+		$sql .= ' WHERE rowid = '.$lineid;
3420 3420
 		$resql = $this->db->query($sql);
3421 3421
 		if ($resql)
3422 3422
 		{
@@ -3432,14 +3432,14 @@  discard block
 block discarded – undo
3432 3432
 	 *  @param	int		$id			Force id of object
3433 3433
 	 *  @return	int					<0 if KO, 0 if not used, >0 if already used
3434 3434
 	 */
3435
-	function isObjectUsed($id=0)
3435
+	function isObjectUsed($id = 0)
3436 3436
 	{
3437 3437
 		global $langs;
3438 3438
 
3439
-		if (empty($id)) $id=$this->id;
3439
+		if (empty($id)) $id = $this->id;
3440 3440
 
3441 3441
 		// Check parameters
3442
-		if (! isset($this->childtables) || ! is_array($this->childtables) || count($this->childtables) == 0)
3442
+		if (!isset($this->childtables) || !is_array($this->childtables) || count($this->childtables) == 0)
3443 3443
 		{
3444 3444
 			dol_print_error('Called isObjectUsed on a class with property this->childtables not defined');
3445 3445
 			return -1;
@@ -3447,24 +3447,24 @@  discard block
 block discarded – undo
3447 3447
 
3448 3448
 		$arraytoscan = $this->childtables;
3449 3449
 		// For backward compatibility, we check if array is old format array('table1', 'table2', ...)
3450
-		$tmparray=array_keys($this->childtables);
3450
+		$tmparray = array_keys($this->childtables);
3451 3451
 		if (is_numeric($tmparray[0]))
3452 3452
 		{
3453 3453
 			$arraytoscan = array_flip($this->childtables);
3454 3454
 		}
3455 3455
 
3456 3456
 		// Test if child exists
3457
-		$haschild=0;
3458
-		foreach($arraytoscan as $table => $elementname)
3457
+		$haschild = 0;
3458
+		foreach ($arraytoscan as $table => $elementname)
3459 3459
 		{
3460 3460
 			//print $id.'-'.$table.'-'.$elementname.'<br>';
3461 3461
 			// Check if third party can be deleted
3462 3462
 			$sql = "SELECT COUNT(*) as nb from ".MAIN_DB_PREFIX.$table;
3463
-			$sql.= " WHERE ".$this->fk_element." = ".$id;
3464
-			$resql=$this->db->query($sql);
3463
+			$sql .= " WHERE ".$this->fk_element." = ".$id;
3464
+			$resql = $this->db->query($sql);
3465 3465
 			if ($resql)
3466 3466
 			{
3467
-				$obj=$this->db->fetch_object($resql);
3467
+				$obj = $this->db->fetch_object($resql);
3468 3468
 				if ($obj->nb > 0)
3469 3469
 				{
3470 3470
 					$langs->load("errors");
@@ -3472,24 +3472,24 @@  discard block
 block discarded – undo
3472 3472
 					$haschild += $obj->nb;
3473 3473
 					if (is_numeric($elementname))	// old usage
3474 3474
 					{
3475
-						$this->errors[]=$langs->trans("ErrorRecordHasAtLeastOneChildOfType", $table);
3475
+						$this->errors[] = $langs->trans("ErrorRecordHasAtLeastOneChildOfType", $table);
3476 3476
 					}
3477 3477
 					else	// new usage: $elementname=Translation key
3478 3478
 					{
3479
-						$this->errors[]=$langs->trans("ErrorRecordHasAtLeastOneChildOfType", $langs->transnoentitiesnoconv($elementname));
3479
+						$this->errors[] = $langs->trans("ErrorRecordHasAtLeastOneChildOfType", $langs->transnoentitiesnoconv($elementname));
3480 3480
 					}
3481
-					break;    // We found at least one, we stop here
3481
+					break; // We found at least one, we stop here
3482 3482
 				}
3483 3483
 			}
3484 3484
 			else
3485 3485
 			{
3486
-				$this->errors[]=$this->db->lasterror();
3486
+				$this->errors[] = $this->db->lasterror();
3487 3487
 				return -1;
3488 3488
 			}
3489 3489
 		}
3490 3490
 		if ($haschild > 0)
3491 3491
 		{
3492
-			$this->errors[]="ErrorRecordHasChildren";
3492
+			$this->errors[] = "ErrorRecordHasChildren";
3493 3493
 			return $haschild;
3494 3494
 		}
3495 3495
 		else return 0;
@@ -3501,18 +3501,18 @@  discard block
 block discarded – undo
3501 3501
 	 *	@param	int		$predefined		-1=All, 0=Count free product/service only, 1=Count predefined product/service only, 2=Count predefined product, 3=Count predefined service
3502 3502
 	 *  @return	int						<0 if KO, 0 if no predefined products, nb of lines with predefined products if found
3503 3503
 	 */
3504
-	function hasProductsOrServices($predefined=-1)
3504
+	function hasProductsOrServices($predefined = -1)
3505 3505
 	{
3506
-		$nb=0;
3506
+		$nb = 0;
3507 3507
 
3508
-		foreach($this->lines as $key => $val)
3508
+		foreach ($this->lines as $key => $val)
3509 3509
 		{
3510
-			$qualified=0;
3511
-			if ($predefined == -1) $qualified=1;
3512
-			if ($predefined == 1 && $val->fk_product > 0) $qualified=1;
3513
-			if ($predefined == 0 && $val->fk_product <= 0) $qualified=1;
3514
-			if ($predefined == 2 && $val->fk_product > 0 && $val->product_type==0) $qualified=1;
3515
-			if ($predefined == 3 && $val->fk_product > 0 && $val->product_type==1) $qualified=1;
3510
+			$qualified = 0;
3511
+			if ($predefined == -1) $qualified = 1;
3512
+			if ($predefined == 1 && $val->fk_product > 0) $qualified = 1;
3513
+			if ($predefined == 0 && $val->fk_product <= 0) $qualified = 1;
3514
+			if ($predefined == 2 && $val->fk_product > 0 && $val->product_type == 0) $qualified = 1;
3515
+			if ($predefined == 3 && $val->fk_product > 0 && $val->product_type == 1) $qualified = 1;
3516 3516
 			if ($qualified) $nb++;
3517 3517
 		}
3518 3518
 		dol_syslog(get_class($this).'::hasProductsOrServices we found '.$nb.' qualified lines of products/servcies');
@@ -3526,24 +3526,24 @@  discard block
 block discarded – undo
3526 3526
 	 */
3527 3527
 	function getTotalDiscount()
3528 3528
 	{
3529
-		$total_discount=0.00;
3529
+		$total_discount = 0.00;
3530 3530
 
3531 3531
 		$sql = "SELECT subprice as pu_ht, qty, remise_percent, total_ht";
3532
-		$sql.= " FROM ".MAIN_DB_PREFIX.$this->table_element."det";
3533
-		$sql.= " WHERE ".$this->fk_element." = ".$this->id;
3532
+		$sql .= " FROM ".MAIN_DB_PREFIX.$this->table_element."det";
3533
+		$sql .= " WHERE ".$this->fk_element." = ".$this->id;
3534 3534
 
3535 3535
 		dol_syslog(get_class($this).'::getTotalDiscount', LOG_DEBUG);
3536 3536
 		$resql = $this->db->query($sql);
3537 3537
 		if ($resql)
3538 3538
 		{
3539
-			$num=$this->db->num_rows($resql);
3540
-			$i=0;
3539
+			$num = $this->db->num_rows($resql);
3540
+			$i = 0;
3541 3541
 			while ($i < $num)
3542 3542
 			{
3543 3543
 				$obj = $this->db->fetch_object($resql);
3544 3544
 
3545 3545
 				$pu_ht = $obj->pu_ht;
3546
-				$qty= $obj->qty;
3546
+				$qty = $obj->qty;
3547 3547
 				$total_ht = $obj->total_ht;
3548 3548
 
3549 3549
 				$total_discount_line = floatval(price2num(($pu_ht * $qty) - $total_ht, 'MT'));
@@ -3577,17 +3577,17 @@  discard block
 block discarded – undo
3577 3577
 		{
3578 3578
 			if (isset($line->qty_asked))
3579 3579
 			{
3580
-				if (empty($totalOrdered)) $totalOrdered=0;  // Avoid warning because $totalOrdered is ''
3581
-				$totalOrdered+=$line->qty_asked;    // defined for shipment only
3580
+				if (empty($totalOrdered)) $totalOrdered = 0; // Avoid warning because $totalOrdered is ''
3581
+				$totalOrdered += $line->qty_asked; // defined for shipment only
3582 3582
 			}
3583 3583
 			if (isset($line->qty_shipped))
3584 3584
 			{
3585
-				if (empty($totalToShip)) $totalToShip=0;    // Avoid warning because $totalToShip is ''
3586
-				$totalToShip+=$line->qty_shipped;   // defined for shipment only
3587
-            }else if ($line->element == 'commandefournisseurdispatch' && isset($line->qty))
3585
+				if (empty($totalToShip)) $totalToShip = 0; // Avoid warning because $totalToShip is ''
3586
+				$totalToShip += $line->qty_shipped; // defined for shipment only
3587
+            } else if ($line->element == 'commandefournisseurdispatch' && isset($line->qty))
3588 3588
             {
3589
-                if (empty($totalToShip)) $totalToShip=0;
3590
-                $totalToShip+=$line->qty;   // defined for reception only
3589
+                if (empty($totalToShip)) $totalToShip = 0;
3590
+                $totalToShip += $line->qty; // defined for reception only
3591 3591
 			}
3592 3592
 
3593 3593
 			// Define qty, weight, volume, weight_units, volume_units
@@ -3600,27 +3600,27 @@  discard block
 block discarded – undo
3600 3600
 			}
3601 3601
 
3602 3602
 			$weight = $line->weight ? $line->weight : 0;
3603
-            ($weight==0 && !empty($line->product->weight))? $weight=$line->product->weight: 0;
3603
+            ($weight == 0 && !empty($line->product->weight)) ? $weight = $line->product->weight : 0;
3604 3604
 			$volume = $line->volume ? $line->volume : 0;
3605
-			($volume==0 && !empty($line->product->volume))? $volume=$line->product->volume: 0;
3605
+			($volume == 0 && !empty($line->product->volume)) ? $volume = $line->product->volume : 0;
3606 3606
 
3607
-			$weight_units=$line->weight_units;
3608
-			($weight_units==0 && !empty($line->product->weight_units))? $weight_units=$line->product->weight_units: 0;
3609
-			$volume_units=$line->volume_units;
3610
-			($volume_units==0 && !empty($line->product->volume_units))? $volume_units=$line->product->volume_units: 0;
3607
+			$weight_units = $line->weight_units;
3608
+			($weight_units == 0 && !empty($line->product->weight_units)) ? $weight_units = $line->product->weight_units : 0;
3609
+			$volume_units = $line->volume_units;
3610
+			($volume_units == 0 && !empty($line->product->volume_units)) ? $volume_units = $line->product->volume_units : 0;
3611 3611
 
3612
-			$weightUnit=0;
3613
-			$volumeUnit=0;
3614
-			if (! empty($weight_units)) $weightUnit = $weight_units;
3615
-			if (! empty($volume_units)) $volumeUnit = $volume_units;
3612
+			$weightUnit = 0;
3613
+			$volumeUnit = 0;
3614
+			if (!empty($weight_units)) $weightUnit = $weight_units;
3615
+			if (!empty($volume_units)) $volumeUnit = $volume_units;
3616 3616
 
3617
-			if (empty($totalWeight)) $totalWeight=0;  // Avoid warning because $totalWeight is ''
3618
-			if (empty($totalVolume)) $totalVolume=0;  // Avoid warning because $totalVolume is ''
3617
+			if (empty($totalWeight)) $totalWeight = 0; // Avoid warning because $totalWeight is ''
3618
+			if (empty($totalVolume)) $totalVolume = 0; // Avoid warning because $totalVolume is ''
3619 3619
 
3620 3620
 			//var_dump($line->volume_units);
3621 3621
 			if ($weight_units < 50)   // >50 means a standard unit (power of 10 of official unit), > 50 means an exotic unit (like inch)
3622 3622
 			{
3623
-				$trueWeightUnit=pow(10, $weightUnit);
3623
+				$trueWeightUnit = pow(10, $weightUnit);
3624 3624
 				$totalWeight += $weight * $qty * $trueWeightUnit;
3625 3625
 			}
3626 3626
 			else {
@@ -3634,18 +3634,18 @@  discard block
 block discarded – undo
3634 3634
 			$totalWeight += $weight * $qty * $trueWeightUnit;
3635 3635
 		}
3636 3636
 		else
3637
-					$totalWeight += $weight * $qty;   // This may be wrong if we mix different units
3637
+					$totalWeight += $weight * $qty; // This may be wrong if we mix different units
3638 3638
 			}
3639 3639
 			if ($volume_units < 50)   // >50 means a standard unit (power of 10 of official unit), > 50 means an exotic unit (like inch)
3640 3640
 			{
3641 3641
 				//print $line->volume."x".$line->volume_units."x".($line->volume_units < 50)."x".$volumeUnit;
3642
-				$trueVolumeUnit=pow(10, $volumeUnit);
3642
+				$trueVolumeUnit = pow(10, $volumeUnit);
3643 3643
 				//print $line->volume;
3644 3644
 				$totalVolume += $volume * $qty * $trueVolumeUnit;
3645 3645
 			}
3646 3646
 			else
3647 3647
 			{
3648
-				$totalVolume += $volume * $qty;   // This may be wrong if we mix different units
3648
+				$totalVolume += $volume * $qty; // This may be wrong if we mix different units
3649 3649
 			}
3650 3650
 		}
3651 3651
 
@@ -3662,17 +3662,17 @@  discard block
 block discarded – undo
3662 3662
 	{
3663 3663
 		$this->db->begin();
3664 3664
 
3665
-		$extraparams = (! empty($this->extraparams) ? json_encode($this->extraparams) : null);
3665
+		$extraparams = (!empty($this->extraparams) ? json_encode($this->extraparams) : null);
3666 3666
 
3667 3667
 		$sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
3668
-		$sql.= " SET extraparams = ".(! empty($extraparams) ? "'".$this->db->escape($extraparams)."'" : "null");
3669
-		$sql.= " WHERE rowid = ".$this->id;
3668
+		$sql .= " SET extraparams = ".(!empty($extraparams) ? "'".$this->db->escape($extraparams)."'" : "null");
3669
+		$sql .= " WHERE rowid = ".$this->id;
3670 3670
 
3671 3671
 		dol_syslog(get_class($this)."::setExtraParameters", LOG_DEBUG);
3672 3672
 		$resql = $this->db->query($sql);
3673
-		if (! $resql)
3673
+		if (!$resql)
3674 3674
 		{
3675
-			$this->error=$this->db->lasterror();
3675
+			$this->error = $this->db->lasterror();
3676 3676
 			$this->db->rollback();
3677 3677
 			return -1;
3678 3678
 		}
@@ -3707,7 +3707,7 @@  discard block
 block discarded – undo
3707 3707
 			}
3708 3708
 		}
3709 3709
 
3710
-		$out .= (($res->code && $this->location_incoterms)?' - ':'').$this->location_incoterms;
3710
+		$out .= (($res->code && $this->location_incoterms) ? ' - ' : '').$this->location_incoterms;
3711 3711
 
3712 3712
 		return $out;
3713 3713
 	}
@@ -3753,11 +3753,11 @@  discard block
 block discarded – undo
3753 3753
 		if ($this->id && $this->table_element)
3754 3754
 		{
3755 3755
 			$sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
3756
-			$sql.= " SET fk_incoterms = ".($id_incoterm > 0 ? $id_incoterm : "null");
3757
-			$sql.= ", location_incoterms = ".($id_incoterm > 0 ? "'".$this->db->escape($location)."'" : "null");
3758
-			$sql.= " WHERE rowid = " . $this->id;
3756
+			$sql .= " SET fk_incoterms = ".($id_incoterm > 0 ? $id_incoterm : "null");
3757
+			$sql .= ", location_incoterms = ".($id_incoterm > 0 ? "'".$this->db->escape($location)."'" : "null");
3758
+			$sql .= " WHERE rowid = ".$this->id;
3759 3759
 			dol_syslog(get_class($this).'::setIncoterms', LOG_DEBUG);
3760
-			$resql=$this->db->query($sql);
3760
+			$resql = $this->db->query($sql);
3761 3761
 			if ($resql)
3762 3762
 			{
3763 3763
 				$this->fk_incoterms = $id_incoterm;
@@ -3798,24 +3798,24 @@  discard block
 block discarded – undo
3798 3798
 	 */
3799 3799
 	function formAddObjectLine($dateSelector, $seller, $buyer)
3800 3800
 	{
3801
-		global $conf,$user,$langs,$object,$hookmanager;
3802
-		global $form,$bcnd,$var;
3801
+		global $conf, $user, $langs, $object, $hookmanager;
3802
+		global $form, $bcnd, $var;
3803 3803
 
3804 3804
 		// Line extrafield
3805 3805
 		require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
3806 3806
 		$extrafieldsline = new ExtraFields($this->db);
3807
-		$extralabelslines=$extrafieldsline->fetch_name_optionals_label($this->table_element_line);
3807
+		$extralabelslines = $extrafieldsline->fetch_name_optionals_label($this->table_element_line);
3808 3808
 
3809 3809
 		// Output template part (modules that overwrite templates must declare this into descriptor)
3810 3810
 		// Use global variables + $dateSelector + $seller and $buyer
3811
-		$dirtpls=array_merge($conf->modules_parts['tpl'],array('/core/tpl'));
3812
-		foreach($dirtpls as $reldir)
3811
+		$dirtpls = array_merge($conf->modules_parts['tpl'], array('/core/tpl'));
3812
+		foreach ($dirtpls as $reldir)
3813 3813
 		{
3814 3814
 			$tpl = dol_buildpath($reldir.'/objectline_create.tpl.php');
3815 3815
 			if (empty($conf->file->strict_mode)) {
3816
-				$res=@include $tpl;
3816
+				$res = @include $tpl;
3817 3817
 			} else {
3818
-				$res=include $tpl; // for debug
3818
+				$res = include $tpl; // for debug
3819 3819
 			}
3820 3820
 			if ($res) break;
3821 3821
 		}
@@ -3839,24 +3839,24 @@  discard block
 block discarded – undo
3839 3839
 	 *	@param  int	    	$dateSelector      	1=Show also date range input fields
3840 3840
 	 *	@return	void
3841 3841
 	 */
3842
-	function printObjectLines($action, $seller, $buyer, $selected=0, $dateSelector=0)
3842
+	function printObjectLines($action, $seller, $buyer, $selected = 0, $dateSelector = 0)
3843 3843
 	{
3844 3844
 		global $conf, $hookmanager, $langs, $user;
3845 3845
 		// TODO We should not use global var for this !
3846 3846
 		global $inputalsopricewithtax, $usemargins, $disableedit, $disablemove, $disableremove, $outputalsopricetotalwithtax;
3847 3847
 
3848 3848
 		// Define usemargins
3849
-		$usemargins=0;
3850
-		if (! empty($conf->margin->enabled) && ! empty($this->element) && in_array($this->element,array('facture','propal','commande'))) $usemargins=1;
3849
+		$usemargins = 0;
3850
+		if (!empty($conf->margin->enabled) && !empty($this->element) && in_array($this->element, array('facture', 'propal', 'commande'))) $usemargins = 1;
3851 3851
 
3852 3852
 		$num = count($this->lines);
3853 3853
 
3854 3854
 		// Line extrafield
3855 3855
 		require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
3856 3856
 		$extrafieldsline = new ExtraFields($this->db);
3857
-		$extralabelslines=$extrafieldsline->fetch_name_optionals_label($this->table_element_line);
3857
+		$extralabelslines = $extrafieldsline->fetch_name_optionals_label($this->table_element_line);
3858 3858
 
3859
-		$parameters = array('num'=>$num,'i'=>$i,'dateSelector'=>$dateSelector,'seller'=>$seller,'buyer'=>$buyer,'selected'=>$selected, 'extrafieldsline'=>$extrafieldsline);
3859
+		$parameters = array('num'=>$num, 'i'=>$i, 'dateSelector'=>$dateSelector, 'seller'=>$seller, 'buyer'=>$buyer, 'selected'=>$selected, 'extrafieldsline'=>$extrafieldsline);
3860 3860
 		$reshook = $hookmanager->executeHooks('printObjectLineTitle', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
3861 3861
 		if (empty($reshook))
3862 3862
 		{
@@ -3866,7 +3866,7 @@  discard block
 block discarded – undo
3866 3866
 			print '<tr class="liste_titre nodrag nodrop">';
3867 3867
 
3868 3868
 			// Adds a line numbering column
3869
-			if (! empty($conf->global->MAIN_VIEW_LINE_NUMBER)) print '<td class="linecolnum" align="center" width="5">&nbsp;</td>';
3869
+			if (!empty($conf->global->MAIN_VIEW_LINE_NUMBER)) print '<td class="linecolnum" align="center" width="5">&nbsp;</td>';
3870 3870
 
3871 3871
 			// Description
3872 3872
 			print '<td class="linecoldescription">'.$langs->trans('Description').'</td>';
@@ -3890,7 +3890,7 @@  discard block
 block discarded – undo
3890 3890
 			// Qty
3891 3891
 			print '<td class="linecolqty" align="right">'.$langs->trans('Qty').'</td>';
3892 3892
 
3893
-			if($conf->global->PRODUCT_USE_UNITS)
3893
+			if ($conf->global->PRODUCT_USE_UNITS)
3894 3894
 			{
3895 3895
 				print '<td class="linecoluseunit" align="left">'.$langs->trans('Unit').'</td>';
3896 3896
 			}
@@ -3899,10 +3899,10 @@  discard block
 block discarded – undo
3899 3899
 			print '<td class="linecoldiscount" align="right">'.$langs->trans('ReductionShort').'</td>';
3900 3900
 
3901 3901
 			if ($this->situation_cycle_ref) {
3902
-				print '<td class="linecolcycleref" align="right">' . $langs->trans('Progress') . '</td>';
3902
+				print '<td class="linecolcycleref" align="right">'.$langs->trans('Progress').'</td>';
3903 3903
 			}
3904 3904
 
3905
-			if ($usemargins && ! empty($conf->margin->enabled) && empty($user->societe_id))
3905
+			if ($usemargins && !empty($conf->margin->enabled) && empty($user->societe_id))
3906 3906
 			{
3907 3907
 				if (!empty($user->rights->margins->creer))
3908 3908
 				{
@@ -3912,9 +3912,9 @@  discard block
 block discarded – undo
3912 3912
 						print '<td class="linecolmargin1 margininfos" align="right" width="80">'.$langs->trans('CostPrice').'</td>';
3913 3913
 				}
3914 3914
 
3915
-				if (! empty($conf->global->DISPLAY_MARGIN_RATES) && $user->rights->margins->liretous)
3915
+				if (!empty($conf->global->DISPLAY_MARGIN_RATES) && $user->rights->margins->liretous)
3916 3916
 					print '<td class="linecolmargin2 margininfos" align="right" width="50">'.$langs->trans('MarginRate').'</td>';
3917
-				if (! empty($conf->global->DISPLAY_MARK_RATES) && $user->rights->margins->liretous)
3917
+				if (!empty($conf->global->DISPLAY_MARK_RATES) && $user->rights->margins->liretous)
3918 3918
 					print '<td class="linecolmargin2 margininfos" align="right" width="50">'.$langs->trans('MarkRate').'</td>';
3919 3919
 			}
3920 3920
 
@@ -3926,13 +3926,13 @@  discard block
 block discarded – undo
3926 3926
 
3927 3927
 			if ($outputalsopricetotalwithtax) print '<td align="right" width="80">'.$langs->trans('TotalTTCShort').'</td>';
3928 3928
 
3929
-			print '<td class="linecoledit"></td>';  // No width to allow autodim
3929
+			print '<td class="linecoledit"></td>'; // No width to allow autodim
3930 3930
 
3931 3931
 			print '<td class="linecoldelete" width="10"></td>';
3932 3932
 
3933 3933
 			print '<td class="linecolmove" width="10"></td>';
3934 3934
 
3935
-			if($action == 'selectlines')
3935
+			if ($action == 'selectlines')
3936 3936
 			{
3937 3937
 			    print '<td class="linecolcheckall" align="center">';
3938 3938
 			    print '<input type="checkbox" class="linecheckboxtoggle" />';
@@ -3945,7 +3945,7 @@  discard block
 block discarded – undo
3945 3945
 		}
3946 3946
 
3947 3947
 		$var = true;
3948
-		$i	 = 0;
3948
+		$i = 0;
3949 3949
 
3950 3950
 		print "<tbody>\n";
3951 3951
 		foreach ($this->lines as $line)
@@ -3958,18 +3958,18 @@  discard block
 block discarded – undo
3958 3958
 			{
3959 3959
 				if (empty($line->fk_parent_line))
3960 3960
 				{
3961
-					$parameters = array('line'=>$line,'var'=>$var,'num'=>$num,'i'=>$i,'dateSelector'=>$dateSelector,'seller'=>$seller,'buyer'=>$buyer,'selected'=>$selected, 'extrafieldsline'=>$extrafieldsline);
3962
-					$reshook = $hookmanager->executeHooks('printObjectLine', $parameters, $this, $action);    // Note that $action and $object may have been modified by some hooks
3961
+					$parameters = array('line'=>$line, 'var'=>$var, 'num'=>$num, 'i'=>$i, 'dateSelector'=>$dateSelector, 'seller'=>$seller, 'buyer'=>$buyer, 'selected'=>$selected, 'extrafieldsline'=>$extrafieldsline);
3962
+					$reshook = $hookmanager->executeHooks('printObjectLine', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
3963 3963
 				}
3964 3964
 				else
3965 3965
 				{
3966
-					$parameters = array('line'=>$line,'var'=>$var,'num'=>$num,'i'=>$i,'dateSelector'=>$dateSelector,'seller'=>$seller,'buyer'=>$buyer,'selected'=>$selected, 'extrafieldsline'=>$extrafieldsline, 'fk_parent_line'=>$line->fk_parent_line);
3967
-					$reshook = $hookmanager->executeHooks('printObjectSubLine', $parameters, $this, $action);    // Note that $action and $object may have been modified by some hooks
3966
+					$parameters = array('line'=>$line, 'var'=>$var, 'num'=>$num, 'i'=>$i, 'dateSelector'=>$dateSelector, 'seller'=>$seller, 'buyer'=>$buyer, 'selected'=>$selected, 'extrafieldsline'=>$extrafieldsline, 'fk_parent_line'=>$line->fk_parent_line);
3967
+					$reshook = $hookmanager->executeHooks('printObjectSubLine', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
3968 3968
 				}
3969 3969
 			}
3970 3970
 			if (empty($reshook))
3971 3971
 			{
3972
-				$this->printObjectLine($action,$line,$var,$num,$i,$dateSelector,$seller,$buyer,$selected,$extrafieldsline);
3972
+				$this->printObjectLine($action, $line, $var, $num, $i, $dateSelector, $seller, $buyer, $selected, $extrafieldsline);
3973 3973
 			}
3974 3974
 
3975 3975
 			$i++;
@@ -3993,23 +3993,23 @@  discard block
 block discarded – undo
3993 3993
 	 *  @param  int			$extrafieldsline	Object of extrafield line attribute
3994 3994
 	 *	@return	void
3995 3995
 	 */
3996
-	function printObjectLine($action,$line,$var,$num,$i,$dateSelector,$seller,$buyer,$selected=0,$extrafieldsline=0)
3996
+	function printObjectLine($action, $line, $var, $num, $i, $dateSelector, $seller, $buyer, $selected = 0, $extrafieldsline = 0)
3997 3997
 	{
3998
-		global $conf,$langs,$user,$object,$hookmanager;
3999
-		global $form,$bc,$bcdd;
4000
-		global $object_rights, $disableedit, $disablemove, $disableremove;   // TODO We should not use global var for this !
3998
+		global $conf, $langs, $user, $object, $hookmanager;
3999
+		global $form, $bc, $bcdd;
4000
+		global $object_rights, $disableedit, $disablemove, $disableremove; // TODO We should not use global var for this !
4001 4001
 
4002 4002
 		$object_rights = $this->getRights();
4003 4003
 
4004
-		$element=$this->element;
4004
+		$element = $this->element;
4005 4005
 
4006
-		$text=''; $description=''; $type=0;
4006
+		$text = ''; $description = ''; $type = 0;
4007 4007
 
4008 4008
 		// Show product and description
4009
-		$type=(! empty($line->product_type)?$line->product_type:$line->fk_product_type);
4009
+		$type = (!empty($line->product_type) ? $line->product_type : $line->fk_product_type);
4010 4010
 		// Try to enhance type detection using date_start and date_end for free lines where type was not saved.
4011
-		if (! empty($line->date_start)) $type=1; // deprecated
4012
-		if (! empty($line->date_end)) $type=1; // deprecated
4011
+		if (!empty($line->date_start)) $type = 1; // deprecated
4012
+		if (!empty($line->date_end)) $type = 1; // deprecated
4013 4013
 
4014 4014
 		// Ligne en mode visu
4015 4015
 		if ($action != 'editline' || $selected != $line->id)
@@ -4022,14 +4022,14 @@  discard block
 block discarded – undo
4022 4022
 
4023 4023
 				$product_static->ref = $line->ref; //can change ref in hook
4024 4024
 				$product_static->label = $line->label; //can change label in hook
4025
-				$text=$product_static->getNomUrl(1);
4025
+				$text = $product_static->getNomUrl(1);
4026 4026
 
4027 4027
 				// Define output language and label
4028
-				if (! empty($conf->global->MAIN_MULTILANGS))
4028
+				if (!empty($conf->global->MAIN_MULTILANGS))
4029 4029
 				{
4030
-					if (! is_object($this->thirdparty))
4030
+					if (!is_object($this->thirdparty))
4031 4031
 					{
4032
-						dol_print_error('','Error: Method printObjectLine was called on an object and object->fetch_thirdparty was not done before');
4032
+						dol_print_error('', 'Error: Method printObjectLine was called on an object and object->fetch_thirdparty was not done before');
4033 4033
 						return;
4034 4034
 					}
4035 4035
 
@@ -4037,38 +4037,38 @@  discard block
 block discarded – undo
4037 4037
 					$prod->fetch($line->fk_product);
4038 4038
 
4039 4039
 					$outputlangs = $langs;
4040
-					$newlang='';
4041
-					if (empty($newlang) && GETPOST('lang_id','aZ09')) $newlang=GETPOST('lang_id','aZ09');
4042
-					if (! empty($conf->global->PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE) && empty($newlang)) $newlang=$this->thirdparty->default_lang;		// For language to language of customer
4043
-					if (! empty($newlang))
4040
+					$newlang = '';
4041
+					if (empty($newlang) && GETPOST('lang_id', 'aZ09')) $newlang = GETPOST('lang_id', 'aZ09');
4042
+					if (!empty($conf->global->PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE) && empty($newlang)) $newlang = $this->thirdparty->default_lang; // For language to language of customer
4043
+					if (!empty($newlang))
4044 4044
 					{
4045
-						$outputlangs = new Translate("",$conf);
4045
+						$outputlangs = new Translate("", $conf);
4046 4046
 						$outputlangs->setDefaultLang($newlang);
4047 4047
 					}
4048 4048
 
4049
-					$label = (! empty($prod->multilangs[$outputlangs->defaultlang]["label"])) ? $prod->multilangs[$outputlangs->defaultlang]["label"] : $line->product_label;
4049
+					$label = (!empty($prod->multilangs[$outputlangs->defaultlang]["label"])) ? $prod->multilangs[$outputlangs->defaultlang]["label"] : $line->product_label;
4050 4050
 				}
4051 4051
 				else
4052 4052
 				{
4053 4053
 					$label = $line->product_label;
4054 4054
 				}
4055 4055
 
4056
-				$text.= ' - '.(! empty($line->label)?$line->label:$label);
4057
-				$description.=(! empty($conf->global->PRODUIT_DESC_IN_FORM)?'':dol_htmlentitiesbr($line->description));	// Description is what to show on popup. We shown nothing if already into desc.
4056
+				$text .= ' - '.(!empty($line->label) ? $line->label : $label);
4057
+				$description .= (!empty($conf->global->PRODUIT_DESC_IN_FORM) ? '' : dol_htmlentitiesbr($line->description)); // Description is what to show on popup. We shown nothing if already into desc.
4058 4058
 			}
4059 4059
 
4060
-			$line->pu_ttc = price2num($line->subprice * (1 + ($line->tva_tx/100)), 'MU');
4060
+			$line->pu_ttc = price2num($line->subprice * (1 + ($line->tva_tx / 100)), 'MU');
4061 4061
 
4062 4062
 			// Output template part (modules that overwrite templates must declare this into descriptor)
4063 4063
 			// Use global variables + $dateSelector + $seller and $buyer
4064
-			$dirtpls=array_merge($conf->modules_parts['tpl'],array('/core/tpl'));
4065
-			foreach($dirtpls as $reldir)
4064
+			$dirtpls = array_merge($conf->modules_parts['tpl'], array('/core/tpl'));
4065
+			foreach ($dirtpls as $reldir)
4066 4066
 			{
4067 4067
 				$tpl = dol_buildpath($reldir.'/objectline_view.tpl.php');
4068 4068
 				if (empty($conf->file->strict_mode)) {
4069
-					$res=@include $tpl;
4069
+					$res = @include $tpl;
4070 4070
 				} else {
4071
-					$res=include $tpl; // for debug
4071
+					$res = include $tpl; // for debug
4072 4072
 				}
4073 4073
 				if ($res) break;
4074 4074
 			}
@@ -4077,21 +4077,21 @@  discard block
 block discarded – undo
4077 4077
 		// Ligne en mode update
4078 4078
 		if ($this->statut == 0 && $action == 'editline' && $selected == $line->id)
4079 4079
 		{
4080
-			$label = (! empty($line->label) ? $line->label : (($line->fk_product > 0) ? $line->product_label : ''));
4081
-			$placeholder=' placeholder="'.$langs->trans("Label").'"';
4080
+			$label = (!empty($line->label) ? $line->label : (($line->fk_product > 0) ? $line->product_label : ''));
4081
+			$placeholder = ' placeholder="'.$langs->trans("Label").'"';
4082 4082
 
4083
-			$line->pu_ttc = price2num($line->subprice * (1 + ($line->tva_tx/100)), 'MU');
4083
+			$line->pu_ttc = price2num($line->subprice * (1 + ($line->tva_tx / 100)), 'MU');
4084 4084
 
4085 4085
 			// Output template part (modules that overwrite templates must declare this into descriptor)
4086 4086
 			// Use global variables + $dateSelector + $seller and $buyer
4087
-			$dirtpls=array_merge($conf->modules_parts['tpl'],array('/core/tpl'));
4088
-			foreach($dirtpls as $reldir)
4087
+			$dirtpls = array_merge($conf->modules_parts['tpl'], array('/core/tpl'));
4088
+			foreach ($dirtpls as $reldir)
4089 4089
 			{
4090 4090
 				$tpl = dol_buildpath($reldir.'/objectline_edit.tpl.php');
4091 4091
 				if (empty($conf->file->strict_mode)) {
4092
-					$res=@include $tpl;
4092
+					$res = @include $tpl;
4093 4093
 				} else {
4094
-					$res=include $tpl; // for debug
4094
+					$res = include $tpl; // for debug
4095 4095
 				}
4096 4096
 				if ($res) break;
4097 4097
 			}
@@ -4111,7 +4111,7 @@  discard block
 block discarded – undo
4111 4111
 	 *	@param	string		$restrictlist		''=All lines, 'services'=Restrict to services only
4112 4112
 	 *  @return	void
4113 4113
 	 */
4114
-	function printOriginLinesList($restrictlist='')
4114
+	function printOriginLinesList($restrictlist = '')
4115 4115
 	{
4116 4116
 		global $langs, $hookmanager, $conf;
4117 4117
 
@@ -4122,26 +4122,26 @@  discard block
 block discarded – undo
4122 4122
 		print '<td align="right">'.$langs->trans('PriceUHT').'</td>';
4123 4123
 		if (!empty($conf->multicurrency->enabled)) print '<td align="right">'.$langs->trans('PriceUHTCurrency').'</td>';
4124 4124
 		print '<td align="right">'.$langs->trans('Qty').'</td>';
4125
-		if($conf->global->PRODUCT_USE_UNITS)
4125
+		if ($conf->global->PRODUCT_USE_UNITS)
4126 4126
 		{
4127 4127
 			print '<td align="left">'.$langs->trans('Unit').'</td>';
4128 4128
 		}
4129 4129
 		print '<td align="right">'.$langs->trans('ReductionShort').'</td></tr>';
4130 4130
 
4131 4131
 		$var = true;
4132
-		$i	 = 0;
4132
+		$i = 0;
4133 4133
 
4134
-		if (! empty($this->lines))
4134
+		if (!empty($this->lines))
4135 4135
 		{
4136 4136
 			foreach ($this->lines as $line)
4137 4137
 			{
4138
-				if (is_object($hookmanager) && (($line->product_type == 9 && ! empty($line->special_code)) || ! empty($line->fk_parent_line)))
4138
+				if (is_object($hookmanager) && (($line->product_type == 9 && !empty($line->special_code)) || !empty($line->fk_parent_line)))
4139 4139
 				{
4140 4140
 					if (empty($line->fk_parent_line))
4141 4141
 					{
4142
-						$parameters=array('line'=>$line,'var'=>$var,'i'=>$i);
4143
-						$action='';
4144
-						$hookmanager->executeHooks('printOriginObjectLine',$parameters,$this,$action);    // Note that $action and $object may have been modified by some hooks
4142
+						$parameters = array('line'=>$line, 'var'=>$var, 'i'=>$i);
4143
+						$action = '';
4144
+						$hookmanager->executeHooks('printOriginObjectLine', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
4145 4145
 					}
4146 4146
 				}
4147 4147
 				else
@@ -4165,103 +4165,103 @@  discard block
 block discarded – undo
4165 4165
 	 *	@param	string				$restrictlist		''=All lines, 'services'=Restrict to services only (strike line if not)
4166 4166
 	 * 	@return	void
4167 4167
 	 */
4168
-	function printOriginLine($line, $var, $restrictlist='')
4168
+	function printOriginLine($line, $var, $restrictlist = '')
4169 4169
 	{
4170 4170
 		global $langs, $conf;
4171 4171
 
4172 4172
 		//var_dump($line);
4173 4173
 		if (!empty($line->date_start))
4174 4174
 		{
4175
-			$date_start=$line->date_start;
4175
+			$date_start = $line->date_start;
4176 4176
 		}
4177 4177
 		else
4178 4178
 		{
4179
-			$date_start=$line->date_debut_prevue;
4180
-			if ($line->date_debut_reel) $date_start=$line->date_debut_reel;
4179
+			$date_start = $line->date_debut_prevue;
4180
+			if ($line->date_debut_reel) $date_start = $line->date_debut_reel;
4181 4181
 		}
4182 4182
 		if (!empty($line->date_end))
4183 4183
 		{
4184
-			$date_end=$line->date_end;
4184
+			$date_end = $line->date_end;
4185 4185
 		}
4186 4186
 		else
4187 4187
 		{
4188
-			$date_end=$line->date_fin_prevue;
4189
-			if ($line->date_fin_reel) $date_end=$line->date_fin_reel;
4188
+			$date_end = $line->date_fin_prevue;
4189
+			if ($line->date_fin_reel) $date_end = $line->date_fin_reel;
4190 4190
 		}
4191 4191
 
4192 4192
 		$this->tpl['label'] = '';
4193
-		if (! empty($line->fk_parent_line)) $this->tpl['label'].= img_picto('', 'rightarrow');
4193
+		if (!empty($line->fk_parent_line)) $this->tpl['label'] .= img_picto('', 'rightarrow');
4194 4194
 
4195 4195
 		if (($line->info_bits & 2) == 2)  // TODO Not sure this is used for source object
4196 4196
 		{
4197
-			$discount=new DiscountAbsolute($this->db);
4197
+			$discount = new DiscountAbsolute($this->db);
4198 4198
 			$discount->fk_soc = $this->socid;
4199
-			$this->tpl['label'].= $discount->getNomUrl(0,'discount');
4199
+			$this->tpl['label'] .= $discount->getNomUrl(0, 'discount');
4200 4200
 		}
4201
-		else if (! empty($line->fk_product))
4201
+		else if (!empty($line->fk_product))
4202 4202
 		{
4203 4203
 			$productstatic = new Product($this->db);
4204 4204
 			$productstatic->id = $line->fk_product;
4205 4205
 			$productstatic->ref = $line->ref;
4206 4206
 			$productstatic->type = $line->fk_product_type;
4207
-            if(empty($productstatic->ref)){
4207
+            if (empty($productstatic->ref)) {
4208 4208
 				$line->fetch_product();
4209 4209
 				$productstatic = $line->product;
4210 4210
 			}
4211 4211
 			
4212
-			$this->tpl['label'].= $productstatic->getNomUrl(1);
4213
-			$this->tpl['label'].= ' - '.(! empty($line->label)?$line->label:$line->product_label);
4212
+			$this->tpl['label'] .= $productstatic->getNomUrl(1);
4213
+			$this->tpl['label'] .= ' - '.(!empty($line->label) ? $line->label : $line->product_label);
4214 4214
 			// Dates
4215 4215
 			if ($line->product_type == 1 && ($date_start || $date_end))
4216 4216
 			{
4217
-				$this->tpl['label'].= get_date_range($date_start,$date_end);
4217
+				$this->tpl['label'] .= get_date_range($date_start, $date_end);
4218 4218
 			}
4219 4219
 		}
4220 4220
 		else
4221 4221
 		{
4222
-			$this->tpl['label'].= ($line->product_type == -1 ? '&nbsp;' : ($line->product_type == 1 ? img_object($langs->trans(''),'service') : img_object($langs->trans(''),'product')));
4222
+			$this->tpl['label'] .= ($line->product_type == -1 ? '&nbsp;' : ($line->product_type == 1 ? img_object($langs->trans(''), 'service') : img_object($langs->trans(''), 'product')));
4223 4223
 			if (!empty($line->desc)) {
4224
-				$this->tpl['label'].=$line->desc;
4225
-			}else {
4226
-				$this->tpl['label'].= ($line->label ? '&nbsp;'.$line->label : '');
4224
+				$this->tpl['label'] .= $line->desc;
4225
+			} else {
4226
+				$this->tpl['label'] .= ($line->label ? '&nbsp;'.$line->label : '');
4227 4227
 			}
4228 4228
 			
4229 4229
 			// Dates
4230 4230
 			if ($line->product_type == 1 && ($date_start || $date_end))
4231 4231
 			{
4232
-				$this->tpl['label'].= get_date_range($date_start,$date_end);
4232
+				$this->tpl['label'] .= get_date_range($date_start, $date_end);
4233 4233
 			}
4234 4234
 		}
4235 4235
 
4236
-		if (! empty($line->desc))
4236
+		if (!empty($line->desc))
4237 4237
 		{
4238 4238
 			if ($line->desc == '(CREDIT_NOTE)')  // TODO Not sure this is used for source object
4239 4239
 			{
4240
-				$discount=new DiscountAbsolute($this->db);
4240
+				$discount = new DiscountAbsolute($this->db);
4241 4241
 				$discount->fetch($line->fk_remise_except);
4242
-				$this->tpl['description'] = $langs->transnoentities("DiscountFromCreditNote",$discount->getNomUrl(0));
4242
+				$this->tpl['description'] = $langs->transnoentities("DiscountFromCreditNote", $discount->getNomUrl(0));
4243 4243
 			}
4244 4244
 			elseif ($line->desc == '(DEPOSIT)')  // TODO Not sure this is used for source object
4245 4245
 			{
4246
-				$discount=new DiscountAbsolute($this->db);
4246
+				$discount = new DiscountAbsolute($this->db);
4247 4247
 				$discount->fetch($line->fk_remise_except);
4248
-				$this->tpl['description'] = $langs->transnoentities("DiscountFromDeposit",$discount->getNomUrl(0));
4248
+				$this->tpl['description'] = $langs->transnoentities("DiscountFromDeposit", $discount->getNomUrl(0));
4249 4249
 			}
4250 4250
 			elseif ($line->desc == '(EXCESS RECEIVED)')
4251 4251
 			{
4252
-				$discount=new DiscountAbsolute($this->db);
4252
+				$discount = new DiscountAbsolute($this->db);
4253 4253
 				$discount->fetch($line->fk_remise_except);
4254
-				$this->tpl['description'] = $langs->transnoentities("DiscountFromExcessReceived",$discount->getNomUrl(0));
4254
+				$this->tpl['description'] = $langs->transnoentities("DiscountFromExcessReceived", $discount->getNomUrl(0));
4255 4255
 			}
4256 4256
 			elseif ($line->desc == '(EXCESS PAID)')
4257 4257
 			{
4258
-				$discount=new DiscountAbsolute($this->db);
4258
+				$discount = new DiscountAbsolute($this->db);
4259 4259
 				$discount->fetch($line->fk_remise_except);
4260
-				$this->tpl['description'] = $langs->transnoentities("DiscountFromExcessPaid",$discount->getNomUrl(0));
4260
+				$this->tpl['description'] = $langs->transnoentities("DiscountFromExcessPaid", $discount->getNomUrl(0));
4261 4261
 			}
4262 4262
 			else
4263 4263
 			{
4264
-				$this->tpl['description'] = dol_trunc($line->desc,60);
4264
+				$this->tpl['description'] = dol_trunc($line->desc, 60);
4265 4265
 			}
4266 4266
 		}
4267 4267
 		else
@@ -4272,7 +4272,7 @@  discard block
 block discarded – undo
4272 4272
         // VAT Rate
4273 4273
         $this->tpl['vat_rate'] = vatrate($line->tva_tx, true);
4274 4274
         $this->tpl['vat_rate'] .= (($line->info_bits & 1) == 1) ? '*' : '';
4275
-        if (! empty($line->vat_src_code) && ! preg_match('/\(/', $this->tpl['vat_rate'])) $this->tpl['vat_rate'].=' ('.$line->vat_src_code.')';
4275
+        if (!empty($line->vat_src_code) && !preg_match('/\(/', $this->tpl['vat_rate'])) $this->tpl['vat_rate'] .= ' ('.$line->vat_src_code.')';
4276 4276
 
4277 4277
 		$this->tpl['price'] = price($line->subprice);
4278 4278
 		$this->tpl['multicurrency_price'] = price($line->multicurrency_subprice);
@@ -4281,19 +4281,19 @@  discard block
 block discarded – undo
4281 4281
 		$this->tpl['remise_percent'] = (($line->info_bits & 2) != 2) ? vatrate($line->remise_percent, true) : '&nbsp;';
4282 4282
 
4283 4283
 		// Is the line strike or not
4284
-		$this->tpl['strike']=0;
4285
-		if ($restrictlist == 'services' && $line->product_type != Product::TYPE_SERVICE) $this->tpl['strike']=1;
4284
+		$this->tpl['strike'] = 0;
4285
+		if ($restrictlist == 'services' && $line->product_type != Product::TYPE_SERVICE) $this->tpl['strike'] = 1;
4286 4286
 
4287 4287
 		// Output template part (modules that overwrite templates must declare this into descriptor)
4288 4288
 		// Use global variables + $dateSelector + $seller and $buyer
4289
-		$dirtpls=array_merge($conf->modules_parts['tpl'],array('/core/tpl'));
4290
-		foreach($dirtpls as $reldir)
4289
+		$dirtpls = array_merge($conf->modules_parts['tpl'], array('/core/tpl'));
4290
+		foreach ($dirtpls as $reldir)
4291 4291
 		{
4292 4292
 			$tpl = dol_buildpath($reldir.'/originproductline.tpl.php');
4293 4293
 			if (empty($conf->file->strict_mode)) {
4294
-				$res=@include $tpl;
4294
+				$res = @include $tpl;
4295 4295
 			} else {
4296
-				$res=include $tpl; // for debug
4296
+				$res = include $tpl; // for debug
4297 4297
 			}
4298 4298
 			if ($res) break;
4299 4299
 		}
@@ -4311,26 +4311,26 @@  discard block
 block discarded – undo
4311 4311
 	 *	@param		int		$mandatory			Mandatory or not
4312 4312
 	 *	@return		int							<=0 if KO, >0 if OK
4313 4313
 	 */
4314
-	function add_element_resource($resource_id, $resource_type, $busy=0, $mandatory=0)
4314
+	function add_element_resource($resource_id, $resource_type, $busy = 0, $mandatory = 0)
4315 4315
 	{
4316 4316
         // phpcs:enable
4317 4317
 		$this->db->begin();
4318 4318
 
4319 4319
 		$sql = "INSERT INTO ".MAIN_DB_PREFIX."element_resources (";
4320
-		$sql.= "resource_id";
4321
-		$sql.= ", resource_type";
4322
-		$sql.= ", element_id";
4323
-		$sql.= ", element_type";
4324
-		$sql.= ", busy";
4325
-		$sql.= ", mandatory";
4326
-		$sql.= ") VALUES (";
4327
-		$sql.= $resource_id;
4328
-		$sql.= ", '".$this->db->escape($resource_type)."'";
4329
-		$sql.= ", '".$this->db->escape($this->id)."'";
4330
-		$sql.= ", '".$this->db->escape($this->element)."'";
4331
-		$sql.= ", '".$this->db->escape($busy)."'";
4332
-		$sql.= ", '".$this->db->escape($mandatory)."'";
4333
-		$sql.= ")";
4320
+		$sql .= "resource_id";
4321
+		$sql .= ", resource_type";
4322
+		$sql .= ", element_id";
4323
+		$sql .= ", element_type";
4324
+		$sql .= ", busy";
4325
+		$sql .= ", mandatory";
4326
+		$sql .= ") VALUES (";
4327
+		$sql .= $resource_id;
4328
+		$sql .= ", '".$this->db->escape($resource_type)."'";
4329
+		$sql .= ", '".$this->db->escape($this->id)."'";
4330
+		$sql .= ", '".$this->db->escape($this->element)."'";
4331
+		$sql .= ", '".$this->db->escape($busy)."'";
4332
+		$sql .= ", '".$this->db->escape($mandatory)."'";
4333
+		$sql .= ")";
4334 4334
 
4335 4335
 		dol_syslog(get_class($this)."::add_element_resource", LOG_DEBUG);
4336 4336
 		if ($this->db->query($sql))
@@ -4340,7 +4340,7 @@  discard block
 block discarded – undo
4340 4340
 		}
4341 4341
 		else
4342 4342
 		{
4343
-			$this->error=$this->db->lasterror();
4343
+			$this->error = $this->db->lasterror();
4344 4344
 			$this->db->rollback();
4345 4345
 			return  0;
4346 4346
 		}
@@ -4355,7 +4355,7 @@  discard block
 block discarded – undo
4355 4355
 	 *    @param	int		$notrigger		Disable all triggers
4356 4356
 	 *    @return   int						>0 if OK, <0 if KO
4357 4357
 	 */
4358
-	function delete_resource($rowid, $element, $notrigger=0)
4358
+	function delete_resource($rowid, $element, $notrigger = 0)
4359 4359
 	{
4360 4360
         // phpcs:enable
4361 4361
 		global $user;
@@ -4363,22 +4363,22 @@  discard block
 block discarded – undo
4363 4363
 		$this->db->begin();
4364 4364
 
4365 4365
 		$sql = "DELETE FROM ".MAIN_DB_PREFIX."element_resources";
4366
-		$sql.= " WHERE rowid=".$rowid;
4366
+		$sql .= " WHERE rowid=".$rowid;
4367 4367
 
4368 4368
 		dol_syslog(get_class($this)."::delete_resource", LOG_DEBUG);
4369 4369
 
4370
-		$resql=$this->db->query($sql);
4371
-		if (! $resql)
4370
+		$resql = $this->db->query($sql);
4371
+		if (!$resql)
4372 4372
 		{
4373
-			$this->error=$this->db->lasterror();
4373
+			$this->error = $this->db->lasterror();
4374 4374
 			$this->db->rollback();
4375 4375
 			return -1;
4376 4376
 		}
4377 4377
 		else
4378 4378
 		{
4379
-			if (! $notrigger)
4379
+			if (!$notrigger)
4380 4380
 			{
4381
-				$result=$this->call_trigger(strtoupper($element).'_DELETE_RESOURCE', $user);
4381
+				$result = $this->call_trigger(strtoupper($element).'_DELETE_RESOURCE', $user);
4382 4382
 				if ($result < 0) { $this->db->rollback(); return -1; }
4383 4383
 			}
4384 4384
 			$this->db->commit();
@@ -4397,8 +4397,8 @@  discard block
 block discarded – undo
4397 4397
 		// Force a copy of this->lines, otherwise it will point to same object.
4398 4398
 		if (isset($this->lines) && is_array($this->lines))
4399 4399
 		{
4400
-			$nboflines=count($this->lines);
4401
-			for($i=0; $i < $nboflines; $i++)
4400
+			$nboflines = count($this->lines);
4401
+			for ($i = 0; $i < $nboflines; $i++)
4402 4402
 			{
4403 4403
 				$this->lines[$i] = clone $this->lines[$i];
4404 4404
 			}
@@ -4418,43 +4418,43 @@  discard block
 block discarded – undo
4418 4418
 	 * @return 	int 						>0 if OK, <0 if KO
4419 4419
 	 * @see	addFileIntoDatabaseIndex
4420 4420
 	 */
4421
-	protected function commonGenerateDocument($modelspath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams=null)
4421
+	protected function commonGenerateDocument($modelspath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams = null)
4422 4422
 	{
4423 4423
 		global $conf, $langs, $user;
4424 4424
 
4425
-		$srctemplatepath='';
4425
+		$srctemplatepath = '';
4426 4426
 
4427 4427
 		// Increase limit for PDF build
4428
-		$err=error_reporting();
4428
+		$err = error_reporting();
4429 4429
 		error_reporting(0);
4430 4430
 		@set_time_limit(120);
4431 4431
 		error_reporting($err);
4432 4432
 
4433 4433
 		// If selected model is a filename template (then $modele="modelname" or "modelname:filename")
4434
-		$tmp=explode(':',$modele,2);
4435
-		if (! empty($tmp[1]))
4434
+		$tmp = explode(':', $modele, 2);
4435
+		if (!empty($tmp[1]))
4436 4436
 		{
4437
-			$modele=$tmp[0];
4438
-			$srctemplatepath=$tmp[1];
4437
+			$modele = $tmp[0];
4438
+			$srctemplatepath = $tmp[1];
4439 4439
 		}
4440 4440
 
4441 4441
 		// Search template files
4442
-		$file=''; $classname=''; $filefound=0;
4443
-		$dirmodels=array('/');
4444
-		if (is_array($conf->modules_parts['models'])) $dirmodels=array_merge($dirmodels,$conf->modules_parts['models']);
4445
-		foreach($dirmodels as $reldir)
4442
+		$file = ''; $classname = ''; $filefound = 0;
4443
+		$dirmodels = array('/');
4444
+		if (is_array($conf->modules_parts['models'])) $dirmodels = array_merge($dirmodels, $conf->modules_parts['models']);
4445
+		foreach ($dirmodels as $reldir)
4446 4446
 		{
4447
-			foreach(array('doc','pdf') as $prefix)
4447
+			foreach (array('doc', 'pdf') as $prefix)
4448 4448
 			{
4449
-				if (in_array(get_class($this), array('Adherent'))) $file = $prefix."_".$modele.".class.php";     // Member module use prefix_module.class.php
4449
+				if (in_array(get_class($this), array('Adherent'))) $file = $prefix."_".$modele.".class.php"; // Member module use prefix_module.class.php
4450 4450
 				else $file = $prefix."_".$modele.".modules.php";
4451 4451
 
4452 4452
 				// On verifie l'emplacement du modele
4453
-				$file=dol_buildpath($reldir.$modelspath.$file,0);
4453
+				$file = dol_buildpath($reldir.$modelspath.$file, 0);
4454 4454
 				if (file_exists($file))
4455 4455
 				{
4456
-					$filefound=1;
4457
-					$classname=$prefix.'_'.$modele;
4456
+					$filefound = 1;
4457
+					$classname = $prefix.'_'.$modele;
4458 4458
 					break;
4459 4459
 				}
4460 4460
 			}
@@ -4464,7 +4464,7 @@  discard block
 block discarded – undo
4464 4464
 		// If generator was found
4465 4465
 		if ($filefound)
4466 4466
 		{
4467
-			global $db;  // Required to solve a conception default in commonstickergenerator.class.php making an include of code using $db
4467
+			global $db; // Required to solve a conception default in commonstickergenerator.class.php making an include of code using $db
4468 4468
 
4469 4469
 			require_once $file;
4470 4470
 
@@ -4473,32 +4473,32 @@  discard block
 block discarded – undo
4473 4473
 			// If generator is ODT, we must have srctemplatepath defined, if not we set it.
4474 4474
 			if ($obj->type == 'odt' && empty($srctemplatepath))
4475 4475
 			{
4476
-				$varfortemplatedir=$obj->scandir;
4477
-				if ($varfortemplatedir && ! empty($conf->global->$varfortemplatedir))
4476
+				$varfortemplatedir = $obj->scandir;
4477
+				if ($varfortemplatedir && !empty($conf->global->$varfortemplatedir))
4478 4478
 				{
4479
-					$dirtoscan=$conf->global->$varfortemplatedir;
4479
+					$dirtoscan = $conf->global->$varfortemplatedir;
4480 4480
 
4481
-					$listoffiles=array();
4481
+					$listoffiles = array();
4482 4482
 
4483 4483
 					// Now we add first model found in directories scanned
4484
-					$listofdir=explode(',',$dirtoscan);
4485
-					foreach($listofdir as $key => $tmpdir)
4484
+					$listofdir = explode(',', $dirtoscan);
4485
+					foreach ($listofdir as $key => $tmpdir)
4486 4486
 					{
4487
-						$tmpdir=trim($tmpdir);
4488
-						$tmpdir=preg_replace('/DOL_DATA_ROOT/',DOL_DATA_ROOT,$tmpdir);
4489
-						if (! $tmpdir) { unset($listofdir[$key]); continue; }
4487
+						$tmpdir = trim($tmpdir);
4488
+						$tmpdir = preg_replace('/DOL_DATA_ROOT/', DOL_DATA_ROOT, $tmpdir);
4489
+						if (!$tmpdir) { unset($listofdir[$key]); continue; }
4490 4490
 						if (is_dir($tmpdir))
4491 4491
 						{
4492
-							$tmpfiles=dol_dir_list($tmpdir,'files',0,'\.od(s|t)$','','name',SORT_ASC,0);
4493
-							if (count($tmpfiles)) $listoffiles=array_merge($listoffiles,$tmpfiles);
4492
+							$tmpfiles = dol_dir_list($tmpdir, 'files', 0, '\.od(s|t)$', '', 'name', SORT_ASC, 0);
4493
+							if (count($tmpfiles)) $listoffiles = array_merge($listoffiles, $tmpfiles);
4494 4494
 						}
4495 4495
 					}
4496 4496
 
4497 4497
 					if (count($listoffiles))
4498 4498
 					{
4499
-						foreach($listoffiles as $record)
4499
+						foreach ($listoffiles as $record)
4500 4500
 						{
4501
-							$srctemplatepath=$record['fullname'];
4501
+							$srctemplatepath = $record['fullname'];
4502 4502
 							break;
4503 4503
 						}
4504 4504
 					}
@@ -4506,27 +4506,27 @@  discard block
 block discarded – undo
4506 4506
 
4507 4507
 				if (empty($srctemplatepath))
4508 4508
 				{
4509
-					$this->error='ErrorGenerationAskedForOdtTemplateWithSrcFileNotDefined';
4509
+					$this->error = 'ErrorGenerationAskedForOdtTemplateWithSrcFileNotDefined';
4510 4510
 					return -1;
4511 4511
 				}
4512 4512
 			}
4513 4513
 
4514
-			if ($obj->type == 'odt' && ! empty($srctemplatepath))
4514
+			if ($obj->type == 'odt' && !empty($srctemplatepath))
4515 4515
 			{
4516
-				if (! dol_is_file($srctemplatepath))
4516
+				if (!dol_is_file($srctemplatepath))
4517 4517
 				{
4518
-					$this->error='ErrorGenerationAskedForOdtTemplateWithSrcFileNotFound';
4518
+					$this->error = 'ErrorGenerationAskedForOdtTemplateWithSrcFileNotFound';
4519 4519
 					return -1;
4520 4520
 				}
4521 4521
 			}
4522 4522
 
4523 4523
 			// We save charset_output to restore it because write_file can change it if needed for
4524 4524
 			// output format that does not support UTF8.
4525
-			$sav_charset_output=$outputlangs->charset_output;
4525
+			$sav_charset_output = $outputlangs->charset_output;
4526 4526
 
4527 4527
 			if (in_array(get_class($this), array('Adherent')))
4528 4528
 			{
4529
-				$arrayofrecords = array();   // The write_file of templates of adherent class need this var
4529
+				$arrayofrecords = array(); // The write_file of templates of adherent class need this var
4530 4530
 				$resultwritefile = $obj->write_file($this, $outputlangs, $srctemplatepath, 'member', 1, $moreparams);
4531 4531
 			}
4532 4532
 			else
@@ -4537,41 +4537,41 @@  discard block
 block discarded – undo
4537 4537
 
4538 4538
 			if ($resultwritefile > 0)
4539 4539
 			{
4540
-				$outputlangs->charset_output=$sav_charset_output;
4540
+				$outputlangs->charset_output = $sav_charset_output;
4541 4541
 
4542 4542
 				// We delete old preview
4543 4543
 				require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
4544 4544
 				dol_delete_preview($this);
4545 4545
 
4546 4546
 				// Index file in database
4547
-				if (! empty($obj->result['fullpath']))
4547
+				if (!empty($obj->result['fullpath']))
4548 4548
 				{
4549 4549
 					$destfull = $obj->result['fullpath'];
4550 4550
 					$upload_dir = dirname($destfull);
4551 4551
 					$destfile = basename($destfull);
4552
-					$rel_dir = preg_replace('/^'.preg_quote(DOL_DATA_ROOT,'/').'/', '', $upload_dir);
4552
+					$rel_dir = preg_replace('/^'.preg_quote(DOL_DATA_ROOT, '/').'/', '', $upload_dir);
4553 4553
 
4554
-					if (! preg_match('/[\\/]temp[\\/]|[\\/]thumbs|\.meta$/', $rel_dir))     // If not a tmp dir
4554
+					if (!preg_match('/[\\/]temp[\\/]|[\\/]thumbs|\.meta$/', $rel_dir))     // If not a tmp dir
4555 4555
 					{
4556 4556
 						$filename = basename($destfile);
4557 4557
 						$rel_dir = preg_replace('/[\\/]$/', '', $rel_dir);
4558 4558
 						$rel_dir = preg_replace('/^[\\/]/', '', $rel_dir);
4559 4559
 
4560 4560
 						include_once DOL_DOCUMENT_ROOT.'/ecm/class/ecmfiles.class.php';
4561
-						$ecmfile=new EcmFiles($this->db);
4562
-						$result = $ecmfile->fetch(0, '', ($rel_dir?$rel_dir.'/':'').$filename);
4561
+						$ecmfile = new EcmFiles($this->db);
4562
+						$result = $ecmfile->fetch(0, '', ($rel_dir ? $rel_dir.'/' : '').$filename);
4563 4563
 
4564 4564
 						// Set the public "share" key
4565 4565
 						$setsharekey = false;
4566 4566
 						if ($this->element == 'propal')
4567 4567
 						{
4568
-							$useonlinesignature = $conf->global->MAIN_FEATURES_LEVEL;	// Replace this with 1 when feature to make online signature is ok
4569
-							if ($useonlinesignature) $setsharekey=true;
4570
-							if (! empty($conf->global->PROPOSAL_ALLOW_EXTERNAL_DOWNLOAD)) $setsharekey=true;
4568
+							$useonlinesignature = $conf->global->MAIN_FEATURES_LEVEL; // Replace this with 1 when feature to make online signature is ok
4569
+							if ($useonlinesignature) $setsharekey = true;
4570
+							if (!empty($conf->global->PROPOSAL_ALLOW_EXTERNAL_DOWNLOAD)) $setsharekey = true;
4571 4571
 						}
4572
-						if ($this->element == 'commande'     && ! empty($conf->global->ORDER_ALLOW_EXTERNAL_DOWNLOAD))        $setsharekey=true;
4573
-						if ($this->element == 'facture'      && ! empty($conf->global->INVOICE_ALLOW_EXTERNAL_DOWNLOAD))      $setsharekey=true;
4574
-						if ($this->element == 'bank_account' && ! empty($conf->global->BANK_ACCOUNT_ALLOW_EXTERNAL_DOWNLOAD)) $setsharekey=true;
4572
+						if ($this->element == 'commande' && !empty($conf->global->ORDER_ALLOW_EXTERNAL_DOWNLOAD))        $setsharekey = true;
4573
+						if ($this->element == 'facture' && !empty($conf->global->INVOICE_ALLOW_EXTERNAL_DOWNLOAD))      $setsharekey = true;
4574
+						if ($this->element == 'bank_account' && !empty($conf->global->BANK_ACCOUNT_ALLOW_EXTERNAL_DOWNLOAD)) $setsharekey = true;
4575 4575
 
4576 4576
 						if ($setsharekey)
4577 4577
 						{
@@ -4584,11 +4584,11 @@  discard block
 block discarded – undo
4584 4584
 
4585 4585
 						if ($result > 0)
4586 4586
 						{
4587
-							$ecmfile->label = md5_file(dol_osencode($destfull));	// hash of file content
4587
+							$ecmfile->label = md5_file(dol_osencode($destfull)); // hash of file content
4588 4588
 							$ecmfile->fullpath_orig = '';
4589 4589
 							$ecmfile->gen_or_uploaded = 'generated';
4590
-							$ecmfile->description = '';    // indexed content
4591
-							$ecmfile->keyword = '';        // keyword content
4590
+							$ecmfile->description = ''; // indexed content
4591
+							$ecmfile->keyword = ''; // keyword content
4592 4592
 							$result = $ecmfile->update($user);
4593 4593
 							if ($result < 0)
4594 4594
 							{
@@ -4600,11 +4600,11 @@  discard block
 block discarded – undo
4600 4600
 							$ecmfile->entity = $conf->entity;
4601 4601
 							$ecmfile->filepath = $rel_dir;
4602 4602
 							$ecmfile->filename = $filename;
4603
-							$ecmfile->label = md5_file(dol_osencode($destfull));	// hash of file content
4603
+							$ecmfile->label = md5_file(dol_osencode($destfull)); // hash of file content
4604 4604
 							$ecmfile->fullpath_orig = '';
4605 4605
 							$ecmfile->gen_or_uploaded = 'generated';
4606
-							$ecmfile->description = '';    // indexed content
4607
-							$ecmfile->keyword = '';        // keyword content
4606
+							$ecmfile->description = ''; // indexed content
4607
+							$ecmfile->keyword = ''; // keyword content
4608 4608
 							$ecmfile->src_object_type = $this->table_element;
4609 4609
 							$ecmfile->src_object_id   = $this->id;
4610 4610
 
@@ -4621,14 +4621,14 @@  discard block
 block discarded – undo
4621 4621
 						//var_dump($obj->update_main_doc_field);exit;
4622 4622
 
4623 4623
 						// Update the last_main_doc field into main object (if documenent generator has property ->update_main_doc_field set)
4624
-						$update_main_doc_field=0;
4625
-						if (! empty($obj->update_main_doc_field)) $update_main_doc_field=1;
4626
-						if ($update_main_doc_field && ! empty($this->table_element))
4624
+						$update_main_doc_field = 0;
4625
+						if (!empty($obj->update_main_doc_field)) $update_main_doc_field = 1;
4626
+						if ($update_main_doc_field && !empty($this->table_element))
4627 4627
 						{
4628 4628
 							$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element." SET last_main_doc = '".($ecmfile->filepath.'/'.$ecmfile->filename)."'";
4629
-							$sql.= ' WHERE rowid = '.$this->id;
4629
+							$sql .= ' WHERE rowid = '.$this->id;
4630 4630
 							$resql = $this->db->query($sql);
4631
-							if (! $resql) dol_print_error($this->db);
4631
+							if (!$resql) dol_print_error($this->db);
4632 4632
 						}
4633 4633
 					}
4634 4634
 				}
@@ -4644,15 +4644,15 @@  discard block
 block discarded – undo
4644 4644
 			}
4645 4645
 			else
4646 4646
 			{
4647
-				$outputlangs->charset_output=$sav_charset_output;
4647
+				$outputlangs->charset_output = $sav_charset_output;
4648 4648
 				dol_print_error($this->db, "Error generating document for ".__CLASS__.". Error: ".$obj->error, $obj->errors);
4649 4649
 				return -1;
4650 4650
 			}
4651 4651
 		}
4652 4652
 		else
4653 4653
 		{
4654
-			$this->error=$langs->trans("Error")." ".$langs->trans("ErrorFileDoesNotExists",$file);
4655
-			dol_print_error('',$this->error);
4654
+			$this->error = $langs->trans("Error")." ".$langs->trans("ErrorFileDoesNotExists", $file);
4655
+			dol_print_error('', $this->error);
4656 4656
 			return -1;
4657 4657
 		}
4658 4658
 	}
@@ -4668,9 +4668,9 @@  discard block
 block discarded – undo
4668 4668
 	{
4669 4669
 		global $maxwidthsmall, $maxheightsmall, $maxwidthmini, $maxheightmini, $quality;
4670 4670
 
4671
-		require_once DOL_DOCUMENT_ROOT .'/core/lib/images.lib.php';		// This define also $maxwidthsmall, $quality, ...
4671
+		require_once DOL_DOCUMENT_ROOT.'/core/lib/images.lib.php'; // This define also $maxwidthsmall, $quality, ...
4672 4672
 
4673
-		$file_osencoded=dol_osencode($file);
4673
+		$file_osencoded = dol_osencode($file);
4674 4674
 		if (file_exists($file_osencoded))
4675 4675
 		{
4676 4676
 			// Create small thumbs for company (Ratio is near 16/9)
@@ -4700,7 +4700,7 @@  discard block
 block discarded – undo
4700 4700
 	 * @param   string              $alternatevalue     Alternate value to use
4701 4701
 	 * @return  string|string[]                         Default value (can be an array if the GETPOST return an array)
4702 4702
 	 **/
4703
-	function getDefaultCreateValueFor($fieldname, $alternatevalue=null)
4703
+	function getDefaultCreateValueFor($fieldname, $alternatevalue = null)
4704 4704
 	{
4705 4705
 		global $conf, $_POST;
4706 4706
 
@@ -4709,16 +4709,16 @@  discard block
 block discarded – undo
4709 4709
 
4710 4710
 		if (isset($alternatevalue)) return $alternatevalue;
4711 4711
 
4712
-		$newelement=$this->element;
4713
-		if ($newelement == 'facture') $newelement='invoice';
4714
-		if ($newelement == 'commande') $newelement='order';
4712
+		$newelement = $this->element;
4713
+		if ($newelement == 'facture') $newelement = 'invoice';
4714
+		if ($newelement == 'commande') $newelement = 'order';
4715 4715
 		if (empty($newelement))
4716 4716
 		{
4717 4717
 			dol_syslog("Ask a default value using common method getDefaultCreateValueForField on an object with no property ->element defined. Return empty string.", LOG_WARNING);
4718 4718
 			return '';
4719 4719
 		}
4720 4720
 
4721
-		$keyforfieldname=strtoupper($newelement.'_DEFAULT_'.$fieldname);
4721
+		$keyforfieldname = strtoupper($newelement.'_DEFAULT_'.$fieldname);
4722 4722
 		//var_dump($keyforfieldname);
4723 4723
 		if (isset($conf->global->$keyforfieldname)) return $conf->global->$keyforfieldname;
4724 4724
 
@@ -4743,21 +4743,21 @@  discard block
 block discarded – undo
4743 4743
 	function call_trigger($trigger_name, $user)
4744 4744
 	{
4745 4745
         // phpcs:enable
4746
-		global $langs,$conf;
4746
+		global $langs, $conf;
4747 4747
 
4748
-		include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php';
4749
-		$interface=new Interfaces($this->db);
4750
-		$result=$interface->run_triggers($trigger_name,$this,$user,$langs,$conf);
4748
+		include_once DOL_DOCUMENT_ROOT.'/core/class/interfaces.class.php';
4749
+		$interface = new Interfaces($this->db);
4750
+		$result = $interface->run_triggers($trigger_name, $this, $user, $langs, $conf);
4751 4751
 
4752 4752
 		if ($result < 0)
4753 4753
 		{
4754 4754
 			if (!empty($this->errors))
4755 4755
 			{
4756
-				$this->errors=array_unique(array_merge($this->errors,$interface->errors));   // We use array_unique because when a trigger call another trigger on same object, this->errors is added twice.
4756
+				$this->errors = array_unique(array_merge($this->errors, $interface->errors)); // We use array_unique because when a trigger call another trigger on same object, this->errors is added twice.
4757 4757
 			}
4758 4758
 			else
4759 4759
 			{
4760
-				$this->errors=$interface->errors;
4760
+				$this->errors = $interface->errors;
4761 4761
 			}
4762 4762
 		}
4763 4763
 		return $result;
@@ -4776,19 +4776,19 @@  discard block
 block discarded – undo
4776 4776
 	 *  @param  array	$optionsArray   Array resulting of call of extrafields->fetch_name_optionals_label(). Deprecated. Function must be called without parameters.
4777 4777
 	 *  @return	int						<0 if error, 0 if no values of extrafield to find nor found, 1 if an attribute is found and value loaded
4778 4778
 	 */
4779
-	function fetch_optionals($rowid=null, $optionsArray=null)
4779
+	function fetch_optionals($rowid = null, $optionsArray = null)
4780 4780
 	{
4781 4781
         // phpcs:enable
4782
-		if (empty($rowid)) $rowid=$this->id;
4782
+		if (empty($rowid)) $rowid = $this->id;
4783 4783
 
4784 4784
 		// To avoid SQL errors. Probably not the better solution though
4785 4785
 		if (!$this->table_element) {
4786 4786
 			return 0;
4787 4787
 		}
4788 4788
 
4789
-		$this->array_options=array();
4789
+		$this->array_options = array();
4790 4790
 
4791
-		if (! is_array($optionsArray))
4791
+		if (!is_array($optionsArray))
4792 4792
 		{
4793 4793
 			// If $extrafields is not a known object, we initialize it. Best practice is to have $extrafields defined into card.php or list.php page.
4794 4794
 			// TODO Use of existing $extrafield is not yet ready (must mutualize code that use extrafields in form first)
@@ -4804,7 +4804,7 @@  discard block
 block discarded – undo
4804 4804
 			{
4805 4805
 				$extrafields->fetch_name_optionals_label($this->table_element);
4806 4806
 			}
4807
-			$optionsArray = (! empty($extrafields->attributes[$this->table_element]['label'])?$extrafields->attributes[$this->table_element]['label']:null);
4807
+			$optionsArray = (!empty($extrafields->attributes[$this->table_element]['label']) ? $extrafields->attributes[$this->table_element]['label'] : null);
4808 4808
 		}
4809 4809
 		else
4810 4810
 		{
@@ -4823,18 +4823,18 @@  discard block
 block discarded – undo
4823 4823
 			{
4824 4824
 				if (empty($extrafields->attributes[$this->table_element]['type'][$name]) || $extrafields->attributes[$this->table_element]['type'][$name] != 'separate')
4825 4825
 				{
4826
-					$sql.= ", ".$name;
4826
+					$sql .= ", ".$name;
4827 4827
 				}
4828 4828
 			}
4829
-			$sql.= " FROM ".MAIN_DB_PREFIX.$table_element."_extrafields";
4830
-			$sql.= " WHERE fk_object = ".$rowid;
4829
+			$sql .= " FROM ".MAIN_DB_PREFIX.$table_element."_extrafields";
4830
+			$sql .= " WHERE fk_object = ".$rowid;
4831 4831
 
4832 4832
 			//dol_syslog(get_class($this)."::fetch_optionals get extrafields data for ".$this->table_element, LOG_DEBUG);		// Too verbose
4833
-			$resql=$this->db->query($sql);
4833
+			$resql = $this->db->query($sql);
4834 4834
 			if ($resql)
4835 4835
 			{
4836 4836
 				$this->array_options = array();
4837
-				$numrows=$this->db->num_rows($resql);
4837
+				$numrows = $this->db->num_rows($resql);
4838 4838
 				if ($numrows)
4839 4839
 				{
4840 4840
 					$tab = $this->db->fetch_array($resql);
@@ -4842,17 +4842,17 @@  discard block
 block discarded – undo
4842 4842
 					foreach ($tab as $key => $value)
4843 4843
 					{
4844 4844
 						// Test fetch_array ! is_int($key) because fetch_array result is a mix table with Key as alpha and Key as int (depend db engine)
4845
-						if ($key != 'rowid' && $key != 'tms' && $key != 'fk_member' && ! is_int($key))
4845
+						if ($key != 'rowid' && $key != 'tms' && $key != 'fk_member' && !is_int($key))
4846 4846
 						{
4847 4847
 							// we can add this attribute to object
4848
-							if (! empty($extrafields) && in_array($extrafields->attributes[$this->table_element]['type'][$key], array('date','datetime')))
4848
+							if (!empty($extrafields) && in_array($extrafields->attributes[$this->table_element]['type'][$key], array('date', 'datetime')))
4849 4849
 							{
4850 4850
 								//var_dump($extrafields->attributes[$this->table_element]['type'][$key]);
4851
-								$this->array_options["options_".$key]=$this->db->jdate($value);
4851
+								$this->array_options["options_".$key] = $this->db->jdate($value);
4852 4852
 							}
4853 4853
 							else
4854 4854
 							{
4855
-								$this->array_options["options_".$key]=$value;
4855
+								$this->array_options["options_".$key] = $value;
4856 4856
 							}
4857 4857
 
4858 4858
 							//var_dump('key '.$key.' '.$value.' type='.$extrafields->attributes[$this->table_element]['type'][$key].' '.$this->array_options["options_".$key]);
@@ -4888,10 +4888,10 @@  discard block
 block discarded – undo
4888 4888
 
4889 4889
 		$sql_del = "DELETE FROM ".MAIN_DB_PREFIX.$table_element."_extrafields WHERE fk_object = ".$this->id;
4890 4890
 		dol_syslog(get_class($this)."::deleteExtraFields delete", LOG_DEBUG);
4891
-		$resql=$this->db->query($sql_del);
4892
-		if (! $resql)
4891
+		$resql = $this->db->query($sql_del);
4892
+		if (!$resql)
4893 4893
 		{
4894
-			$this->error=$this->db->lasterror();
4894
+			$this->error = $this->db->lasterror();
4895 4895
 			$this->db->rollback();
4896 4896
 			return -1;
4897 4897
 		}
@@ -4912,36 +4912,36 @@  discard block
 block discarded – undo
4912 4912
 	 *  @return int 						-1=error, O=did nothing, 1=OK
4913 4913
 	 *  @see updateExtraField, setValueFrom
4914 4914
 	 */
4915
-	function insertExtraFields($trigger='', $userused=null)
4915
+	function insertExtraFields($trigger = '', $userused = null)
4916 4916
 	{
4917
-		global $conf,$langs,$user;
4917
+		global $conf, $langs, $user;
4918 4918
 
4919
-		if (empty($userused)) $userused=$user;
4919
+		if (empty($userused)) $userused = $user;
4920 4920
 
4921
-		$error=0;
4921
+		$error = 0;
4922 4922
 
4923
-		if (! empty($conf->global->MAIN_EXTRAFIELDS_DISABLED)) return 0;	// For avoid conflicts if trigger used
4923
+		if (!empty($conf->global->MAIN_EXTRAFIELDS_DISABLED)) return 0; // For avoid conflicts if trigger used
4924 4924
 
4925
-		if (! empty($this->array_options))
4925
+		if (!empty($this->array_options))
4926 4926
 		{
4927 4927
 			// Check parameters
4928 4928
 			$langs->load('admin');
4929 4929
 			require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
4930 4930
 			$extrafields = new ExtraFields($this->db);
4931
-			$target_extrafields=$extrafields->fetch_name_optionals_label($this->table_element);
4931
+			$target_extrafields = $extrafields->fetch_name_optionals_label($this->table_element);
4932 4932
 
4933 4933
 			//Eliminate copied source object extra_fields that do not exist in target object
4934
-			$new_array_options=array();
4934
+			$new_array_options = array();
4935 4935
 			foreach ($this->array_options as $key => $value) {
4936
-				if (in_array(substr($key,8), array_keys($target_extrafields)))	// We remove the 'options_' from $key for test
4936
+				if (in_array(substr($key, 8), array_keys($target_extrafields)))	// We remove the 'options_' from $key for test
4937 4937
 					$new_array_options[$key] = $value;
4938 4938
 				elseif (in_array($key, array_keys($target_extrafields)))		// We test on $key that does not contains the 'options_' prefix
4939 4939
 					$new_array_options['options_'.$key] = $value;
4940 4940
 			}
4941 4941
 
4942
-			foreach($new_array_options as $key => $value)
4942
+			foreach ($new_array_options as $key => $value)
4943 4943
 			{
4944
-			   	$attributeKey      = substr($key,8);   // Remove 'options_' prefix
4944
+			   	$attributeKey      = substr($key, 8); // Remove 'options_' prefix
4945 4945
 			   	$attributeType     = $extrafields->attributes[$this->table_element]['type'][$attributeKey];
4946 4946
 			   	$attributeLabel    = $extrafields->attributes[$this->table_element]['label'][$attributeKey];
4947 4947
 			   	$attributeParam    = $extrafields->attributes[$this->table_element]['param'][$attributeKey];
@@ -4949,13 +4949,13 @@  discard block
 block discarded – undo
4949 4949
 
4950 4950
 			   	if ($attributeRequired)
4951 4951
 			   	{
4952
-			   		$mandatorypb=false;
4953
-			   		if ($attributeType == 'link' && $this->array_options[$key] == '-1') $mandatorypb=true;
4954
-			   		if ($this->array_options[$key] === '') $mandatorypb=true;
4952
+			   		$mandatorypb = false;
4953
+			   		if ($attributeType == 'link' && $this->array_options[$key] == '-1') $mandatorypb = true;
4954
+			   		if ($this->array_options[$key] === '') $mandatorypb = true;
4955 4955
 			   		if ($mandatorypb)
4956 4956
 			   		{
4957 4957
 			   			dol_syslog($this->error);
4958
-			   			$this->errors[]=$langs->trans('ErrorFieldRequired', $attributeLabel);
4958
+			   			$this->errors[] = $langs->trans('ErrorFieldRequired', $attributeLabel);
4959 4959
 			   			return -1;
4960 4960
 			   		}
4961 4961
 			   	}
@@ -4966,25 +4966,25 @@  discard block
 block discarded – undo
4966 4966
 			   	switch ($attributeType)
4967 4967
 			   	{
4968 4968
 			   		case 'int':
4969
-			  			if (!is_numeric($value) && $value!='')
4969
+			  			if (!is_numeric($value) && $value != '')
4970 4970
 			   			{
4971
-			   				$this->errors[]=$langs->trans("ExtraFieldHasWrongValue", $attributeLabel);
4971
+			   				$this->errors[] = $langs->trans("ExtraFieldHasWrongValue", $attributeLabel);
4972 4972
 			   				return -1;
4973 4973
 			  			}
4974
-			   			elseif ($value=='')
4974
+			   			elseif ($value == '')
4975 4975
 			   			{
4976 4976
 			   				$new_array_options[$key] = null;
4977 4977
 			   			}
4978 4978
 			 			break;
4979 4979
 					case 'double':
4980 4980
 						$value = price2num($value);
4981
-						if (!is_numeric($value) && $value!='')
4981
+						if (!is_numeric($value) && $value != '')
4982 4982
 						{
4983 4983
 							dol_syslog($langs->trans("ExtraFieldHasWrongValue")." sur ".$attributeLabel."(".$value."is not '".$attributeType."')", LOG_DEBUG);
4984
-							$this->errors[]=$langs->trans("ExtraFieldHasWrongValue", $attributeLabel);
4984
+							$this->errors[] = $langs->trans("ExtraFieldHasWrongValue", $attributeLabel);
4985 4985
 							return -1;
4986 4986
 						}
4987
-						elseif ($value=='')
4987
+						elseif ($value == '')
4988 4988
 						{
4989 4989
 							$new_array_options[$key] = null;
4990 4990
 						}
@@ -4998,12 +4998,12 @@  discard block
 block discarded – undo
4998 4998
              			}
4999 4999
              			break;*/
5000 5000
 			   		case 'password':
5001
-			   			$algo='';
5001
+			   			$algo = '';
5002 5002
 			   			if ($this->array_options[$key] != '' && is_array($extrafields->attributes[$this->table_element]['param'][$attributeKey]['options']))
5003 5003
 			   			{
5004 5004
 			   				// If there is an encryption choice, we use it to crypt data before insert
5005 5005
 			   				$tmparrays = array_keys($extrafields->attributes[$this->table_element]['param'][$attributeKey]['options']);
5006
-			   				$algo=reset($tmparrays);
5006
+			   				$algo = reset($tmparrays);
5007 5007
 			   				if ($algo != '')
5008 5008
 			   				{
5009 5009
 			   					//global $action;		// $action may be 'create', 'update', 'update_extras'...
@@ -5014,7 +5014,7 @@  discard block
 block discarded – undo
5014 5014
 			   						//var_dump($this->oldcopy->array_options[$key]); var_dump($this->array_options[$key]);
5015 5015
 				   					if ($this->array_options[$key] == $this->oldcopy->array_options[$key])	// If old value crypted in database is same than submited new value, it means we don't change it, so we don't update.
5016 5016
 				   					{
5017
-				   						$new_array_options[$key] = $this->array_options[$key];	// Value is kept
5017
+				   						$new_array_options[$key] = $this->array_options[$key]; // Value is kept
5018 5018
 				   					}
5019 5019
 									else
5020 5020
 									{
@@ -5025,7 +5025,7 @@  discard block
 block discarded – undo
5025 5025
 			   					}
5026 5026
 			   					else
5027 5027
 			   					{
5028
-			   						$new_array_options[$key] = $this->array_options[$key];	// Value is kept
5028
+			   						$new_array_options[$key] = $this->array_options[$key]; // Value is kept
5029 5029
 			   					}
5030 5030
 			   				}
5031 5031
 			   			}
@@ -5042,13 +5042,13 @@  discard block
 block discarded – undo
5042 5042
 						break;
5043 5043
 					case 'datetime':
5044 5044
 						// If data is a string instead of a timestamp, we convert it
5045
-						if (! is_int($this->array_options[$key])) {
5045
+						if (!is_int($this->array_options[$key])) {
5046 5046
 							$this->array_options[$key] = strtotime($this->array_options[$key]);
5047 5047
 						}
5048 5048
 						$new_array_options[$key] = $this->db->idate($this->array_options[$key]);
5049 5049
 						break;
5050 5050
 		   			case 'link':
5051
-						$param_list=array_keys($attributeParam['options']);
5051
+						$param_list = array_keys($attributeParam['options']);
5052 5052
 						// 0 : ObjectName
5053 5053
 						// 1 : classPath
5054 5054
 						$InfoFieldList = explode(":", $param_list[0]);
@@ -5057,18 +5057,18 @@  discard block
 block discarded – undo
5057 5057
 						{
5058 5058
 							if ($value == '-1')	// -1 is key for no defined in combo list of objects
5059 5059
 							{
5060
-								$new_array_options[$key]='';
5060
+								$new_array_options[$key] = '';
5061 5061
 							}
5062 5062
 							elseif ($value)
5063 5063
 							{
5064 5064
 								$object = new $InfoFieldList[0]($this->db);
5065
-								if (is_numeric($value)) $res=$object->fetch($value);
5066
-								else $res=$object->fetch('',$value);
5065
+								if (is_numeric($value)) $res = $object->fetch($value);
5066
+								else $res = $object->fetch('', $value);
5067 5067
 
5068
-								if ($res > 0) $new_array_options[$key]=$object->id;
5068
+								if ($res > 0) $new_array_options[$key] = $object->id;
5069 5069
 								else
5070 5070
 								{
5071
-									$this->error="Id/Ref '".$value."' for object '".$object->element."' not found";
5071
+									$this->error = "Id/Ref '".$value."' for object '".$object->element."' not found";
5072 5072
 									$this->db->rollback();
5073 5073
 									return -1;
5074 5074
 								}
@@ -5092,46 +5092,46 @@  discard block
 block discarded – undo
5092 5092
 			$this->db->query($sql_del);
5093 5093
 
5094 5094
 			$sql = "INSERT INTO ".MAIN_DB_PREFIX.$table_element."_extrafields (fk_object";
5095
-			foreach($new_array_options as $key => $value)
5095
+			foreach ($new_array_options as $key => $value)
5096 5096
 			{
5097
-				$attributeKey = substr($key,8);   // Remove 'options_' prefix
5097
+				$attributeKey = substr($key, 8); // Remove 'options_' prefix
5098 5098
 				// Add field of attribut
5099 5099
 				if ($extrafields->attributes[$this->table_element]['type'][$attributeKey] != 'separate') // Only for other type than separator
5100
-					$sql.=",".$attributeKey;
5100
+					$sql .= ",".$attributeKey;
5101 5101
 			}
5102 5102
 			$sql .= ") VALUES (".$this->id;
5103 5103
 
5104
-			foreach($new_array_options as $key => $value)
5104
+			foreach ($new_array_options as $key => $value)
5105 5105
 			{
5106
-				$attributeKey = substr($key,8);   // Remove 'options_' prefix
5106
+				$attributeKey = substr($key, 8); // Remove 'options_' prefix
5107 5107
 				// Add field of attribute
5108 5108
 				if ($extrafields->attributes[$this->table_element]['type'][$attributeKey] != 'separate') // Only for other type than separator)
5109 5109
 				{
5110 5110
 					if ($new_array_options[$key] != '')
5111 5111
 					{
5112
-						$sql.=",'".$this->db->escape($new_array_options[$key])."'";
5112
+						$sql .= ",'".$this->db->escape($new_array_options[$key])."'";
5113 5113
 					}
5114 5114
 					else
5115 5115
 					{
5116
-						$sql.=",null";
5116
+						$sql .= ",null";
5117 5117
 					}
5118 5118
 				}
5119 5119
 			}
5120
-			$sql.=")";
5120
+			$sql .= ")";
5121 5121
 
5122 5122
 			dol_syslog(get_class($this)."::insertExtraFields insert", LOG_DEBUG);
5123 5123
 			$resql = $this->db->query($sql);
5124
-			if (! $resql)
5124
+			if (!$resql)
5125 5125
 			{
5126
-				$this->error=$this->db->lasterror();
5126
+				$this->error = $this->db->lasterror();
5127 5127
 				$error++;
5128 5128
 			}
5129 5129
 
5130
-			if (! $error && $trigger)
5130
+			if (!$error && $trigger)
5131 5131
 			{
5132 5132
 				// Call trigger
5133
-				$this->context=array('extrafieldaddupdate'=>1);
5134
-				$result=$this->call_trigger($trigger, $userused);
5133
+				$this->context = array('extrafieldaddupdate'=>1);
5134
+				$result = $this->call_trigger($trigger, $userused);
5135 5135
 				if ($result < 0) $error++;
5136 5136
 				// End call trigger
5137 5137
 			}
@@ -5160,25 +5160,25 @@  discard block
 block discarded – undo
5160 5160
 	 *  @return int                 		-1=error, O=did nothing, 1=OK
5161 5161
 	 *  @see setValueFrom, insertExtraFields
5162 5162
 	 */
5163
-	function updateExtraField($key, $trigger=null, $userused=null)
5163
+	function updateExtraField($key, $trigger = null, $userused = null)
5164 5164
 	{
5165
-		global $conf,$langs,$user;
5165
+		global $conf, $langs, $user;
5166 5166
 
5167
-		if (empty($userused)) $userused=$user;
5167
+		if (empty($userused)) $userused = $user;
5168 5168
 
5169
-		$error=0;
5169
+		$error = 0;
5170 5170
 
5171
-		if (! empty($conf->global->MAIN_EXTRAFIELDS_DISABLED)) return 0;	// For avoid conflicts if trigger used
5171
+		if (!empty($conf->global->MAIN_EXTRAFIELDS_DISABLED)) return 0; // For avoid conflicts if trigger used
5172 5172
 
5173
-		if (! empty($this->array_options) && isset($this->array_options["options_".$key]))
5173
+		if (!empty($this->array_options) && isset($this->array_options["options_".$key]))
5174 5174
 		{
5175 5175
 			// Check parameters
5176 5176
 			$langs->load('admin');
5177 5177
 			require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
5178 5178
 			$extrafields = new ExtraFields($this->db);
5179
-			$target_extrafields=$extrafields->fetch_name_optionals_label($this->table_element);
5179
+			$target_extrafields = $extrafields->fetch_name_optionals_label($this->table_element);
5180 5180
 
5181
-			$value=$this->array_options["options_".$key];
5181
+			$value = $this->array_options["options_".$key];
5182 5182
 
5183 5183
 			$attributeType     = $extrafields->attributes[$this->table_element]['type'][$key];
5184 5184
 			$attributeLabel    = $extrafields->attributes[$this->table_element]['label'][$key];
@@ -5191,25 +5191,25 @@  discard block
 block discarded – undo
5191 5191
 			switch ($attributeType)
5192 5192
 			{
5193 5193
 				case 'int':
5194
-					if (!is_numeric($value) && $value!='')
5194
+					if (!is_numeric($value) && $value != '')
5195 5195
 					{
5196
-						$this->errors[]=$langs->trans("ExtraFieldHasWrongValue",$attributeLabel);
5196
+						$this->errors[] = $langs->trans("ExtraFieldHasWrongValue", $attributeLabel);
5197 5197
 						return -1;
5198 5198
 					}
5199
-					elseif ($value=='')
5199
+					elseif ($value == '')
5200 5200
 					{
5201 5201
 						$this->array_options["options_".$key] = null;
5202 5202
 					}
5203 5203
 					break;
5204 5204
 				case 'double':
5205 5205
 					$value = price2num($value);
5206
-					if (!is_numeric($value) && $value!='')
5206
+					if (!is_numeric($value) && $value != '')
5207 5207
 					{
5208 5208
 						dol_syslog($langs->trans("ExtraFieldHasWrongValue")." sur ".$attributeLabel."(".$value."is not '".$attributeType."')", LOG_DEBUG);
5209
-						$this->errors[]=$langs->trans("ExtraFieldHasWrongValue", $attributeLabel);
5209
+						$this->errors[] = $langs->trans("ExtraFieldHasWrongValue", $attributeLabel);
5210 5210
 						return -1;
5211 5211
 					}
5212
-					elseif ($value=='')
5212
+					elseif ($value == '')
5213 5213
 					{
5214 5214
 						$this->array_options["options_".$key] = null;
5215 5215
 					}
@@ -5226,13 +5226,13 @@  discard block
 block discarded – undo
5226 5226
 					$this->array_options["options_".$key] = price2num($this->array_options["options_".$key]);
5227 5227
 					break;
5228 5228
 				case 'date':
5229
-					$this->array_options["options_".$key]=$this->db->idate($this->array_options["options_".$key]);
5229
+					$this->array_options["options_".$key] = $this->db->idate($this->array_options["options_".$key]);
5230 5230
 					break;
5231 5231
 				case 'datetime':
5232
-					$this->array_options["options_".$key]=$this->db->idate($this->array_options["options_".$key]);
5232
+					$this->array_options["options_".$key] = $this->db->idate($this->array_options["options_".$key]);
5233 5233
 					break;
5234 5234
 				case 'link':
5235
-					$param_list=array_keys($attributeParam['options']);
5235
+					$param_list = array_keys($attributeParam['options']);
5236 5236
 					// 0 : ObjectName
5237 5237
 					// 1 : classPath
5238 5238
 					$InfoFieldList = explode(":", $param_list[0]);
@@ -5240,8 +5240,8 @@  discard block
 block discarded – undo
5240 5240
 					if ($value)
5241 5241
 					{
5242 5242
 						$object = new $InfoFieldList[0]($this->db);
5243
-						$object->fetch(0,$value);
5244
-						$this->array_options["options_".$key]=$object->id;
5243
+						$object->fetch(0, $value);
5244
+						$this->array_options["options_".$key] = $object->id;
5245 5245
 					}
5246 5246
 					break;
5247 5247
 			}
@@ -5250,24 +5250,24 @@  discard block
 block discarded – undo
5250 5250
 			$sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element."_extrafields SET ".$key."='".$this->db->escape($this->array_options["options_".$key])."'";
5251 5251
 			$sql .= " WHERE fk_object = ".$this->id;
5252 5252
 			$resql = $this->db->query($sql);
5253
-			if (! $resql)
5253
+			if (!$resql)
5254 5254
 			{
5255 5255
 				$error++;
5256
-				$this->error=$this->db->lasterror();
5256
+				$this->error = $this->db->lasterror();
5257 5257
 			}
5258 5258
 
5259
-			if (! $error && $trigger)
5259
+			if (!$error && $trigger)
5260 5260
 			{
5261 5261
 				// Call trigger
5262
-				$this->context=array('extrafieldupdate'=>1);
5263
-				$result=$this->call_trigger($trigger, $userused);
5262
+				$this->context = array('extrafieldupdate'=>1);
5263
+				$result = $this->call_trigger($trigger, $userused);
5264 5264
 				if ($result < 0) $error++;
5265 5265
 				// End call trigger
5266 5266
 			}
5267 5267
 
5268 5268
 			if ($error)
5269 5269
 			{
5270
-				dol_syslog(get_class($this) . "::".__METHOD__ . $this->error, LOG_ERR);
5270
+				dol_syslog(get_class($this)."::".__METHOD__.$this->error, LOG_ERR);
5271 5271
 				$this->db->rollback();
5272 5272
 				return -1;
5273 5273
 			}
@@ -5294,71 +5294,71 @@  discard block
 block discarded – undo
5294 5294
 	 * @param  string|int		$morecss       Value for css to define style/length of field. May also be a numeric.
5295 5295
 	 * @return string
5296 5296
 	 */
5297
-	function showInputField($val, $key, $value, $moreparam='', $keysuffix='', $keyprefix='', $morecss=0)
5297
+	function showInputField($val, $key, $value, $moreparam = '', $keysuffix = '', $keyprefix = '', $morecss = 0)
5298 5298
 	{
5299
-		global $conf,$langs,$form;
5299
+		global $conf, $langs, $form;
5300 5300
 
5301
-		if (! is_object($form))
5301
+		if (!is_object($form))
5302 5302
 		{
5303 5303
 			require_once DOL_DOCUMENT_ROOT.'/core/class/html.form.class.php';
5304
-			$form=new Form($this->db);
5304
+			$form = new Form($this->db);
5305 5305
 		}
5306 5306
 
5307
-		$val=$this->fields[$key];
5307
+		$val = $this->fields[$key];
5308 5308
 
5309
-		$out='';
5310
-        $type='';
5309
+		$out = '';
5310
+        $type = '';
5311 5311
         $param = array();
5312
-        $param['options']=array();
5313
-        $size =$this->fields[$key]['size'];
5312
+        $param['options'] = array();
5313
+        $size = $this->fields[$key]['size'];
5314 5314
         // Because we work on extrafields
5315
-        if(preg_match('/^integer:(.*):(.*)/i', $val['type'], $reg)){
5316
-            $param['options']=array($reg[1].':'.$reg[2]=>'N');
5317
-            $type ='link';
5318
-        } elseif(preg_match('/^link:(.*):(.*)/i', $val['type'], $reg)) {
5319
-            $param['options']=array($reg[1].':'.$reg[2]=>'N');
5320
-            $type ='link';
5321
-        } elseif(preg_match('/^sellist:(.*):(.*):(.*):(.*)/i', $val['type'], $reg)) {
5322
-            $param['options']=array($reg[1].':'.$reg[2].':'.$reg[3].':'.$reg[4]=>'N');
5323
-            $type ='sellist';
5324
-        } elseif(preg_match('/varchar\((\d+)\)/', $val['type'],$reg)) {
5325
-            $param['options']=array();
5326
-            $type ='varchar';
5327
-            $size=$reg[1];
5328
-        } elseif(preg_match('/varchar/', $val['type'])) {
5329
-            $param['options']=array();
5330
-            $type ='varchar';
5331
-        } elseif(is_array($this->fields[$key]['arrayofkeyval'])) {
5332
-            $param['options']=$this->fields[$key]['arrayofkeyval'];
5333
-            $type ='select';
5315
+        if (preg_match('/^integer:(.*):(.*)/i', $val['type'], $reg)) {
5316
+            $param['options'] = array($reg[1].':'.$reg[2]=>'N');
5317
+            $type = 'link';
5318
+        } elseif (preg_match('/^link:(.*):(.*)/i', $val['type'], $reg)) {
5319
+            $param['options'] = array($reg[1].':'.$reg[2]=>'N');
5320
+            $type = 'link';
5321
+        } elseif (preg_match('/^sellist:(.*):(.*):(.*):(.*)/i', $val['type'], $reg)) {
5322
+            $param['options'] = array($reg[1].':'.$reg[2].':'.$reg[3].':'.$reg[4]=>'N');
5323
+            $type = 'sellist';
5324
+        } elseif (preg_match('/varchar\((\d+)\)/', $val['type'], $reg)) {
5325
+            $param['options'] = array();
5326
+            $type = 'varchar';
5327
+            $size = $reg[1];
5328
+        } elseif (preg_match('/varchar/', $val['type'])) {
5329
+            $param['options'] = array();
5330
+            $type = 'varchar';
5331
+        } elseif (is_array($this->fields[$key]['arrayofkeyval'])) {
5332
+            $param['options'] = $this->fields[$key]['arrayofkeyval'];
5333
+            $type = 'select';
5334 5334
         } else {
5335
-            $param['options']=array();
5336
-            $type =$this->fields[$key]['type'];
5335
+            $param['options'] = array();
5336
+            $type = $this->fields[$key]['type'];
5337 5337
         }
5338 5338
 
5339
-		$label=$this->fields[$key]['label'];
5339
+		$label = $this->fields[$key]['label'];
5340 5340
 		//$elementtype=$this->fields[$key]['elementtype'];	// Seems not used
5341
-		$default=$this->fields[$key]['default'];
5342
-		$computed=$this->fields[$key]['computed'];
5343
-		$unique=$this->fields[$key]['unique'];
5344
-		$required=$this->fields[$key]['required'];
5341
+		$default = $this->fields[$key]['default'];
5342
+		$computed = $this->fields[$key]['computed'];
5343
+		$unique = $this->fields[$key]['unique'];
5344
+		$required = $this->fields[$key]['required'];
5345 5345
 
5346
-		$langfile=$this->fields[$key]['langfile'];
5347
-		$list=$this->fields[$key]['list'];
5348
-		$hidden=abs($this->fields[$key]['visible'])!=1?1:0;
5346
+		$langfile = $this->fields[$key]['langfile'];
5347
+		$list = $this->fields[$key]['list'];
5348
+		$hidden = abs($this->fields[$key]['visible']) != 1 ? 1 : 0;
5349 5349
 
5350 5350
 		$objectid = $this->id;
5351 5351
 
5352 5352
 
5353 5353
 		if ($computed)
5354 5354
 		{
5355
-			if (! preg_match('/^search_/', $keyprefix)) return '<span class="opacitymedium">'.$langs->trans("AutomaticallyCalculated").'</span>';
5355
+			if (!preg_match('/^search_/', $keyprefix)) return '<span class="opacitymedium">'.$langs->trans("AutomaticallyCalculated").'</span>';
5356 5356
 			else return '';
5357 5357
 		}
5358 5358
 
5359 5359
 
5360 5360
 		// Use in priority showsize from parameters, then $val['css'] then autodefine
5361
-		if (empty($morecss) && ! empty($val['css']))
5361
+		if (empty($morecss) && !empty($val['css']))
5362 5362
 		{
5363 5363
 			$showsize = $val['css'];
5364 5364
 		}
@@ -5372,16 +5372,16 @@  discard block
 block discarded – undo
5372 5372
 			{
5373 5373
 				$morecss = 'minwidth200imp';
5374 5374
 			}
5375
-			elseif (in_array($type,array('int','integer','price')) || preg_match('/^double(\([0-9],[0-9]\)){0,1}/',$type))
5375
+			elseif (in_array($type, array('int', 'integer', 'price')) || preg_match('/^double(\([0-9],[0-9]\)){0,1}/', $type))
5376 5376
 			{
5377 5377
 				$morecss = 'maxwidth75';
5378 5378
                         }elseif ($type == 'url')
5379 5379
 			{
5380
-				$morecss='minwidth400';
5380
+				$morecss = 'minwidth400';
5381 5381
 			}
5382 5382
 			elseif ($type == 'boolean')
5383 5383
 			{
5384
-				$morecss='';
5384
+				$morecss = '';
5385 5385
 			}
5386 5386
 			else
5387 5387
 			{
@@ -5400,12 +5400,12 @@  discard block
 block discarded – undo
5400 5400
 			}
5401 5401
 		}
5402 5402
 
5403
-		if (in_array($type,array('date','datetime')))
5403
+		if (in_array($type, array('date', 'datetime')))
5404 5404
 		{
5405
-			$tmp=explode(',',$size);
5406
-			$newsize=$tmp[0];
5405
+			$tmp = explode(',', $size);
5406
+			$newsize = $tmp[0];
5407 5407
 
5408
-			$showtime = in_array($type,array('datetime')) ? 1 : 0;
5408
+			$showtime = in_array($type, array('datetime')) ? 1 : 0;
5409 5409
 
5410 5410
 			// Do not show current date when field not required (see selectDate() method)
5411 5411
 			if (!$required && $value == '') $value = '-1';
@@ -5413,237 +5413,237 @@  discard block
 block discarded – undo
5413 5413
 			// TODO Must also support $moreparam
5414 5414
 			$out = $form->selectDate($value, $keyprefix.$key.$keysuffix, $showtime, $showtime, $required, '', 1, (($keyprefix != 'search_' && $keyprefix != 'search_options_') ? 1 : 0), 0, 1);
5415 5415
 		}
5416
-		elseif (in_array($type,array('int','integer')))
5416
+		elseif (in_array($type, array('int', 'integer')))
5417 5417
 		{
5418
-			$tmp=explode(',',$size);
5419
-			$newsize=$tmp[0];
5420
-			$out='<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" maxlength="'.$newsize.'" value="'.dol_escape_htmltag($value).'"'.($moreparam?$moreparam:'').'>';
5418
+			$tmp = explode(',', $size);
5419
+			$newsize = $tmp[0];
5420
+			$out = '<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" maxlength="'.$newsize.'" value="'.dol_escape_htmltag($value).'"'.($moreparam ? $moreparam : '').'>';
5421 5421
 		}
5422 5422
 		elseif (preg_match('/varchar/', $type))
5423 5423
 		{
5424
-			$out='<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" maxlength="'.$size.'" value="'.dol_escape_htmltag($value).'"'.($moreparam?$moreparam:'').'>';
5424
+			$out = '<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" maxlength="'.$size.'" value="'.dol_escape_htmltag($value).'"'.($moreparam ? $moreparam : '').'>';
5425 5425
 		}
5426 5426
 		elseif (in_array($type, array('mail', 'phone', 'url')))
5427 5427
 		{
5428
-			$out='<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" value="'.dol_escape_htmltag($value).'" '.($moreparam?$moreparam:'').'>';
5428
+			$out = '<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" value="'.dol_escape_htmltag($value).'" '.($moreparam ? $moreparam : '').'>';
5429 5429
 		}
5430 5430
 		elseif ($type == 'text')
5431 5431
 		{
5432
-			if (! preg_match('/search_/', $keyprefix))		// If keyprefix is search_ or search_options_, we must just use a simple text field
5432
+			if (!preg_match('/search_/', $keyprefix))		// If keyprefix is search_ or search_options_, we must just use a simple text field
5433 5433
 			{
5434 5434
 				require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
5435
-				$doleditor=new DolEditor($keyprefix.$key.$keysuffix,$value,'',200,'dolibarr_notes','In',false,false,false,ROWS_5,'90%');
5436
-				$out=$doleditor->Create(1);
5435
+				$doleditor = new DolEditor($keyprefix.$key.$keysuffix, $value, '', 200, 'dolibarr_notes', 'In', false, false, false, ROWS_5, '90%');
5436
+				$out = $doleditor->Create(1);
5437 5437
 			}
5438 5438
 			else
5439 5439
 			{
5440
-				$out='<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" value="'.dol_escape_htmltag($value).'" '.($moreparam?$moreparam:'').'>';
5440
+				$out = '<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" value="'.dol_escape_htmltag($value).'" '.($moreparam ? $moreparam : '').'>';
5441 5441
 			}
5442 5442
 		}
5443 5443
 		elseif ($type == 'html')
5444 5444
 		{
5445
-			if (! preg_match('/search_/', $keyprefix))		// If keyprefix is search_ or search_options_, we must just use a simple text field
5445
+			if (!preg_match('/search_/', $keyprefix))		// If keyprefix is search_ or search_options_, we must just use a simple text field
5446 5446
 			{
5447 5447
 				require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
5448
-				$doleditor=new DolEditor($keyprefix.$key.$keysuffix,$value,'',200,'dolibarr_notes','In',false,false,! empty($conf->fckeditor->enabled) && $conf->global->FCKEDITOR_ENABLE_SOCIETE,ROWS_5,'90%');
5449
-				$out=$doleditor->Create(1);
5448
+				$doleditor = new DolEditor($keyprefix.$key.$keysuffix, $value, '', 200, 'dolibarr_notes', 'In', false, false, !empty($conf->fckeditor->enabled) && $conf->global->FCKEDITOR_ENABLE_SOCIETE, ROWS_5, '90%');
5449
+				$out = $doleditor->Create(1);
5450 5450
 			}
5451 5451
 			else
5452 5452
 			{
5453
-				$out='<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" value="'.dol_escape_htmltag($value).'" '.($moreparam?$moreparam:'').'>';
5453
+				$out = '<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" value="'.dol_escape_htmltag($value).'" '.($moreparam ? $moreparam : '').'>';
5454 5454
 			}
5455 5455
 		}
5456 5456
 		elseif ($type == 'boolean')
5457 5457
 		{
5458
-			$checked='';
5458
+			$checked = '';
5459 5459
 			if (!empty($value)) {
5460
-				$checked=' checked value="1" ';
5460
+				$checked = ' checked value="1" ';
5461 5461
 			} else {
5462
-				$checked=' value="1" ';
5462
+				$checked = ' value="1" ';
5463 5463
 			}
5464
-			$out='<input type="checkbox" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" '.$checked.' '.($moreparam?$moreparam:'').'>';
5464
+			$out = '<input type="checkbox" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" '.$checked.' '.($moreparam ? $moreparam : '').'>';
5465 5465
 		}
5466 5466
 		elseif ($type == 'price')
5467 5467
 		{
5468 5468
 			if (!empty($value)) {		// $value in memory is a php numeric, we format it into user number format.
5469
-				$value=price($value);
5469
+				$value = price($value);
5470 5470
 			}
5471
-			$out='<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" value="'.$value.'" '.($moreparam?$moreparam:'').'> '.$langs->getCurrencySymbol($conf->currency);
5471
+			$out = '<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" value="'.$value.'" '.($moreparam ? $moreparam : '').'> '.$langs->getCurrencySymbol($conf->currency);
5472 5472
 		}
5473
-		elseif (preg_match('/^double(\([0-9],[0-9]\)){0,1}/',$type))
5473
+		elseif (preg_match('/^double(\([0-9],[0-9]\)){0,1}/', $type))
5474 5474
 		{
5475 5475
 			if (!empty($value)) {		// $value in memory is a php numeric, we format it into user number format.
5476
-				$value=price($value);
5476
+				$value = price($value);
5477 5477
 			}
5478
-			$out='<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" value="'.$value.'" '.($moreparam?$moreparam:'').'> ';
5478
+			$out = '<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" value="'.$value.'" '.($moreparam ? $moreparam : '').'> ';
5479 5479
 		}
5480 5480
 		elseif ($type == 'select')
5481 5481
 		{
5482 5482
 			$out = '';
5483
-			if (! empty($conf->use_javascript_ajax) && ! empty($conf->global->MAIN_EXTRAFIELDS_USE_SELECT2))
5483
+			if (!empty($conf->use_javascript_ajax) && !empty($conf->global->MAIN_EXTRAFIELDS_USE_SELECT2))
5484 5484
 			{
5485
-				include_once DOL_DOCUMENT_ROOT . '/core/lib/ajax.lib.php';
5486
-				$out.= ajax_combobox($keyprefix.$key.$keysuffix, array(), 0);
5485
+				include_once DOL_DOCUMENT_ROOT.'/core/lib/ajax.lib.php';
5486
+				$out .= ajax_combobox($keyprefix.$key.$keysuffix, array(), 0);
5487 5487
 			}
5488 5488
 
5489
-			$out.='<select class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" '.($moreparam?$moreparam:'').'>';
5490
-                if((! isset($this->fields[$key]['default'])) ||($this->fields[$key]['notnull']!=1))$out.='<option value="0">&nbsp;</option>';
5489
+			$out .= '<select class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" '.($moreparam ? $moreparam : '').'>';
5490
+                if ((!isset($this->fields[$key]['default'])) || ($this->fields[$key]['notnull'] != 1))$out .= '<option value="0">&nbsp;</option>';
5491 5491
 			foreach ($param['options'] as $key => $val)
5492 5492
 			{
5493 5493
 				if ((string) $key == '') continue;
5494 5494
 				list($val, $parent) = explode('|', $val);
5495
-				$out.='<option value="'.$key.'"';
5496
-				$out.= (((string) $value == (string) $key)?' selected':'');
5497
-				$out.= (!empty($parent)?' parent="'.$parent.'"':'');
5498
-				$out.='>'.$val.'</option>';
5495
+				$out .= '<option value="'.$key.'"';
5496
+				$out .= (((string) $value == (string) $key) ? ' selected' : '');
5497
+				$out .= (!empty($parent) ? ' parent="'.$parent.'"' : '');
5498
+				$out .= '>'.$val.'</option>';
5499 5499
 			}
5500
-			$out.='</select>';
5500
+			$out .= '</select>';
5501 5501
 		}
5502 5502
 		elseif ($type == 'sellist')
5503 5503
 		{
5504 5504
 			$out = '';
5505
-			if (! empty($conf->use_javascript_ajax) && ! empty($conf->global->MAIN_EXTRAFIELDS_USE_SELECT2))
5505
+			if (!empty($conf->use_javascript_ajax) && !empty($conf->global->MAIN_EXTRAFIELDS_USE_SELECT2))
5506 5506
 			{
5507
-				include_once DOL_DOCUMENT_ROOT . '/core/lib/ajax.lib.php';
5508
-				$out.= ajax_combobox($keyprefix.$key.$keysuffix, array(), 0);
5507
+				include_once DOL_DOCUMENT_ROOT.'/core/lib/ajax.lib.php';
5508
+				$out .= ajax_combobox($keyprefix.$key.$keysuffix, array(), 0);
5509 5509
 			}
5510 5510
 
5511
-			$out.='<select class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" '.($moreparam?$moreparam:'').'>';
5511
+			$out .= '<select class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" '.($moreparam ? $moreparam : '').'>';
5512 5512
 			if (is_array($param['options']))
5513 5513
 			{
5514
-				$param_list=array_keys($param['options']);
5514
+				$param_list = array_keys($param['options']);
5515 5515
 				$InfoFieldList = explode(":", $param_list[0]);
5516
-				$parentName='';
5517
-				$parentField='';
5516
+				$parentName = '';
5517
+				$parentField = '';
5518 5518
 				// 0 : tableName
5519 5519
 				// 1 : label field name
5520 5520
 				// 2 : key fields name (if differ of rowid)
5521 5521
 				// 3 : key field parent (for dependent lists)
5522 5522
 				// 4 : where clause filter on column or table extrafield, syntax field='value' or extra.field=value
5523
-				$keyList=(empty($InfoFieldList[2])?'rowid':$InfoFieldList[2].' as rowid');
5523
+				$keyList = (empty($InfoFieldList[2]) ? 'rowid' : $InfoFieldList[2].' as rowid');
5524 5524
 
5525 5525
 
5526
-				if (count($InfoFieldList) > 4 && ! empty($InfoFieldList[4]))
5526
+				if (count($InfoFieldList) > 4 && !empty($InfoFieldList[4]))
5527 5527
 				{
5528 5528
 					if (strpos($InfoFieldList[4], 'extra.') !== false)
5529 5529
 					{
5530
-						$keyList='main.'.$InfoFieldList[2].' as rowid';
5530
+						$keyList = 'main.'.$InfoFieldList[2].' as rowid';
5531 5531
 					} else {
5532
-						$keyList=$InfoFieldList[2].' as rowid';
5532
+						$keyList = $InfoFieldList[2].' as rowid';
5533 5533
 					}
5534 5534
 				}
5535
-				if (count($InfoFieldList) > 3 && ! empty($InfoFieldList[3]))
5535
+				if (count($InfoFieldList) > 3 && !empty($InfoFieldList[3]))
5536 5536
 				{
5537 5537
 					list($parentName, $parentField) = explode('|', $InfoFieldList[3]);
5538
-					$keyList.= ', '.$parentField;
5538
+					$keyList .= ', '.$parentField;
5539 5539
 				}
5540 5540
 
5541
-				$fields_label = explode('|',$InfoFieldList[1]);
5541
+				$fields_label = explode('|', $InfoFieldList[1]);
5542 5542
 				if (is_array($fields_label))
5543 5543
 				{
5544
-					$keyList .=', ';
5544
+					$keyList .= ', ';
5545 5545
 					$keyList .= implode(', ', $fields_label);
5546 5546
 				}
5547 5547
 
5548
-				$sqlwhere='';
5548
+				$sqlwhere = '';
5549 5549
 				$sql = 'SELECT '.$keyList;
5550
-				$sql.= ' FROM '.MAIN_DB_PREFIX .$InfoFieldList[0];
5550
+				$sql .= ' FROM '.MAIN_DB_PREFIX.$InfoFieldList[0];
5551 5551
 				if (!empty($InfoFieldList[4]))
5552 5552
 				{
5553 5553
 					// can use SELECT request
5554
-					if (strpos($InfoFieldList[4], '$SEL$')!==false) {
5555
-						$InfoFieldList[4]=str_replace('$SEL$','SELECT',$InfoFieldList[4]);
5554
+					if (strpos($InfoFieldList[4], '$SEL$') !== false) {
5555
+						$InfoFieldList[4] = str_replace('$SEL$', 'SELECT', $InfoFieldList[4]);
5556 5556
 					}
5557 5557
 
5558 5558
 					// current object id can be use into filter
5559
-					if (strpos($InfoFieldList[4], '$ID$')!==false && !empty($objectid)) {
5560
-						$InfoFieldList[4]=str_replace('$ID$',$objectid,$InfoFieldList[4]);
5559
+					if (strpos($InfoFieldList[4], '$ID$') !== false && !empty($objectid)) {
5560
+						$InfoFieldList[4] = str_replace('$ID$', $objectid, $InfoFieldList[4]);
5561 5561
 					} else {
5562
-						$InfoFieldList[4]=str_replace('$ID$','0',$InfoFieldList[4]);
5562
+						$InfoFieldList[4] = str_replace('$ID$', '0', $InfoFieldList[4]);
5563 5563
 					}
5564 5564
 					//We have to join on extrafield table
5565
-					if (strpos($InfoFieldList[4], 'extra')!==false)
5565
+					if (strpos($InfoFieldList[4], 'extra') !== false)
5566 5566
 					{
5567
-						$sql.= ' as main, '.MAIN_DB_PREFIX .$InfoFieldList[0].'_extrafields as extra';
5568
-						$sqlwhere.= ' WHERE extra.fk_object=main.'.$InfoFieldList[2]. ' AND '.$InfoFieldList[4];
5567
+						$sql .= ' as main, '.MAIN_DB_PREFIX.$InfoFieldList[0].'_extrafields as extra';
5568
+						$sqlwhere .= ' WHERE extra.fk_object=main.'.$InfoFieldList[2].' AND '.$InfoFieldList[4];
5569 5569
 					}
5570 5570
 					else
5571 5571
 					{
5572
-						$sqlwhere.= ' WHERE '.$InfoFieldList[4];
5572
+						$sqlwhere .= ' WHERE '.$InfoFieldList[4];
5573 5573
 					}
5574 5574
 				}
5575 5575
 				else
5576 5576
 				{
5577
-					$sqlwhere.= ' WHERE 1=1';
5577
+					$sqlwhere .= ' WHERE 1=1';
5578 5578
 				}
5579 5579
 				// Some tables may have field, some other not. For the moment we disable it.
5580
-				if (in_array($InfoFieldList[0],array('tablewithentity')))
5580
+				if (in_array($InfoFieldList[0], array('tablewithentity')))
5581 5581
 				{
5582
-					$sqlwhere.= ' AND entity = '.$conf->entity;
5582
+					$sqlwhere .= ' AND entity = '.$conf->entity;
5583 5583
 				}
5584
-				$sql.=$sqlwhere;
5584
+				$sql .= $sqlwhere;
5585 5585
 				//print $sql;
5586 5586
 
5587
-				$sql .= ' ORDER BY ' . implode(', ', $fields_label);
5587
+				$sql .= ' ORDER BY '.implode(', ', $fields_label);
5588 5588
 
5589 5589
 				dol_syslog(get_class($this).'::showInputField type=sellist', LOG_DEBUG);
5590 5590
 				$resql = $this->db->query($sql);
5591 5591
 				if ($resql)
5592 5592
 				{
5593
-					$out.='<option value="0">&nbsp;</option>';
5593
+					$out .= '<option value="0">&nbsp;</option>';
5594 5594
 					$num = $this->db->num_rows($resql);
5595 5595
 					$i = 0;
5596 5596
 					while ($i < $num)
5597 5597
 					{
5598
-						$labeltoshow='';
5598
+						$labeltoshow = '';
5599 5599
 						$obj = $this->db->fetch_object($resql);
5600 5600
 
5601 5601
 						// Several field into label (eq table:code|libelle:rowid)
5602 5602
 						$notrans = false;
5603
-						$fields_label = explode('|',$InfoFieldList[1]);
5603
+						$fields_label = explode('|', $InfoFieldList[1]);
5604 5604
 						if (is_array($fields_label))
5605 5605
 						{
5606 5606
 							$notrans = true;
5607 5607
 							foreach ($fields_label as $field_toshow)
5608 5608
 							{
5609
-								$labeltoshow.= $obj->$field_toshow.' ';
5609
+								$labeltoshow .= $obj->$field_toshow.' ';
5610 5610
 							}
5611 5611
 						}
5612 5612
 						else
5613 5613
 						{
5614
-							$labeltoshow=$obj->{$InfoFieldList[1]};
5614
+							$labeltoshow = $obj->{$InfoFieldList[1]};
5615 5615
 						}
5616
-						$labeltoshow=dol_trunc($labeltoshow,45);
5616
+						$labeltoshow = dol_trunc($labeltoshow, 45);
5617 5617
 
5618 5618
 						if ($value == $obj->rowid)
5619 5619
 						{
5620 5620
 							foreach ($fields_label as $field_toshow)
5621 5621
 							{
5622
-								$translabel=$langs->trans($obj->$field_toshow);
5623
-								if ($translabel!=$obj->$field_toshow) {
5624
-									$labeltoshow=dol_trunc($translabel,18).' ';
5625
-								}else {
5626
-									$labeltoshow=dol_trunc($obj->$field_toshow,18).' ';
5622
+								$translabel = $langs->trans($obj->$field_toshow);
5623
+								if ($translabel != $obj->$field_toshow) {
5624
+									$labeltoshow = dol_trunc($translabel, 18).' ';
5625
+								} else {
5626
+									$labeltoshow = dol_trunc($obj->$field_toshow, 18).' ';
5627 5627
 								}
5628 5628
 							}
5629
-							$out.='<option value="'.$obj->rowid.'" selected>'.$labeltoshow.'</option>';
5629
+							$out .= '<option value="'.$obj->rowid.'" selected>'.$labeltoshow.'</option>';
5630 5630
 						}
5631 5631
 						else
5632 5632
 						{
5633
-							if (! $notrans)
5633
+							if (!$notrans)
5634 5634
 							{
5635
-								$translabel=$langs->trans($obj->{$InfoFieldList[1]});
5636
-								if ($translabel!=$obj->{$InfoFieldList[1]}) {
5637
-									$labeltoshow=dol_trunc($translabel,18);
5635
+								$translabel = $langs->trans($obj->{$InfoFieldList[1]});
5636
+								if ($translabel != $obj->{$InfoFieldList[1]}) {
5637
+									$labeltoshow = dol_trunc($translabel, 18);
5638 5638
 								}
5639 5639
 								else {
5640
-									$labeltoshow=dol_trunc($obj->{$InfoFieldList[1]},18);
5640
+									$labeltoshow = dol_trunc($obj->{$InfoFieldList[1]},18);
5641 5641
 								}
5642 5642
 							}
5643
-							if (empty($labeltoshow)) $labeltoshow='(not defined)';
5644
-							if ($value==$obj->rowid)
5643
+							if (empty($labeltoshow)) $labeltoshow = '(not defined)';
5644
+							if ($value == $obj->rowid)
5645 5645
 							{
5646
-								$out.='<option value="'.$obj->rowid.'" selected>'.$labeltoshow.'</option>';
5646
+								$out .= '<option value="'.$obj->rowid.'" selected>'.$labeltoshow.'</option>';
5647 5647
 							}
5648 5648
 
5649 5649
 							if (!empty($InfoFieldList[3]) && $parentField)
@@ -5651,10 +5651,10 @@  discard block
 block discarded – undo
5651 5651
 								$parent = $parentName.':'.$obj->{$parentField};
5652 5652
 							}
5653 5653
 
5654
-							$out.='<option value="'.$obj->rowid.'"';
5655
-							$out.= ($value==$obj->rowid?' selected':'');
5656
-							$out.= (!empty($parent)?' parent="'.$parent.'"':'');
5657
-							$out.='>'.$labeltoshow.'</option>';
5654
+							$out .= '<option value="'.$obj->rowid.'"';
5655
+							$out .= ($value == $obj->rowid ? ' selected' : '');
5656
+							$out .= (!empty($parent) ? ' parent="'.$parent.'"' : '');
5657
+							$out .= '>'.$labeltoshow.'</option>';
5658 5658
 						}
5659 5659
 
5660 5660
 						$i++;
@@ -5665,23 +5665,23 @@  discard block
 block discarded – undo
5665 5665
 					print 'Error in request '.$sql.' '.$this->db->lasterror().'. Check setup of extra parameters.<br>';
5666 5666
 				}
5667 5667
 			}
5668
-			$out.='</select>';
5668
+			$out .= '</select>';
5669 5669
 		}
5670 5670
 		elseif ($type == 'checkbox')
5671 5671
 		{
5672
-			$value_arr=explode(',',$value);
5673
-			$out=$form->multiselectarray($keyprefix.$key.$keysuffix, (empty($param['options'])?null:$param['options']), $value_arr, '', 0, '', 0, '100%');
5672
+			$value_arr = explode(',', $value);
5673
+			$out = $form->multiselectarray($keyprefix.$key.$keysuffix, (empty($param['options']) ?null:$param['options']), $value_arr, '', 0, '', 0, '100%');
5674 5674
 		}
5675 5675
 		elseif ($type == 'radio')
5676 5676
 		{
5677
-			$out='';
5677
+			$out = '';
5678 5678
 			foreach ($param['options'] as $keyopt => $val)
5679 5679
 			{
5680
-				$out.='<input class="flat '.$morecss.'" type="radio" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" '.($moreparam?$moreparam:'');
5681
-				$out.=' value="'.$keyopt.'"';
5682
-				$out.=' id="'.$keyprefix.$key.$keysuffix.'_'.$keyopt.'"';
5683
-				$out.= ($value==$keyopt?'checked':'');
5684
-				$out.='/><label for="'.$keyprefix.$key.$keysuffix.'_'.$keyopt.'">'.$val.'</label><br>';
5680
+				$out .= '<input class="flat '.$morecss.'" type="radio" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" '.($moreparam ? $moreparam : '');
5681
+				$out .= ' value="'.$keyopt.'"';
5682
+				$out .= ' id="'.$keyprefix.$key.$keysuffix.'_'.$keyopt.'"';
5683
+				$out .= ($value == $keyopt ? 'checked' : '');
5684
+				$out .= '/><label for="'.$keyprefix.$key.$keysuffix.'_'.$keyopt.'">'.$val.'</label><br>';
5685 5685
 			}
5686 5686
 		}
5687 5687
 		elseif ($type == 'chkbxlst')
@@ -5696,24 +5696,24 @@  discard block
 block discarded – undo
5696 5696
 			if (is_array($param['options'])) {
5697 5697
 				$param_list = array_keys($param['options']);
5698 5698
 				$InfoFieldList = explode(":", $param_list[0]);
5699
-				$parentName='';
5700
-				$parentField='';
5699
+				$parentName = '';
5700
+				$parentField = '';
5701 5701
 				// 0 : tableName
5702 5702
 				// 1 : label field name
5703 5703
 				// 2 : key fields name (if differ of rowid)
5704 5704
 				// 3 : key field parent (for dependent lists)
5705 5705
 				// 4 : where clause filter on column or table extrafield, syntax field='value' or extra.field=value
5706
-				$keyList = (empty($InfoFieldList[2]) ? 'rowid' : $InfoFieldList[2] . ' as rowid');
5706
+				$keyList = (empty($InfoFieldList[2]) ? 'rowid' : $InfoFieldList[2].' as rowid');
5707 5707
 
5708
-				if (count($InfoFieldList) > 3 && ! empty($InfoFieldList[3])) {
5709
-					list ( $parentName, $parentField ) = explode('|', $InfoFieldList[3]);
5710
-					$keyList .= ', ' . $parentField;
5708
+				if (count($InfoFieldList) > 3 && !empty($InfoFieldList[3])) {
5709
+					list ($parentName, $parentField) = explode('|', $InfoFieldList[3]);
5710
+					$keyList .= ', '.$parentField;
5711 5711
 				}
5712
-				if (count($InfoFieldList) > 4 && ! empty($InfoFieldList[4])) {
5712
+				if (count($InfoFieldList) > 4 && !empty($InfoFieldList[4])) {
5713 5713
 					if (strpos($InfoFieldList[4], 'extra.') !== false) {
5714
-						$keyList = 'main.' . $InfoFieldList[2] . ' as rowid';
5714
+						$keyList = 'main.'.$InfoFieldList[2].' as rowid';
5715 5715
 					} else {
5716
-						$keyList = $InfoFieldList[2] . ' as rowid';
5716
+						$keyList = $InfoFieldList[2].' as rowid';
5717 5717
 					}
5718 5718
 				}
5719 5719
 
@@ -5724,50 +5724,50 @@  discard block
 block discarded – undo
5724 5724
 				}
5725 5725
 
5726 5726
 				$sqlwhere = '';
5727
-				$sql = 'SELECT ' . $keyList;
5728
-				$sql .= ' FROM ' . MAIN_DB_PREFIX . $InfoFieldList[0];
5729
-				if (! empty($InfoFieldList[4])) {
5727
+				$sql = 'SELECT '.$keyList;
5728
+				$sql .= ' FROM '.MAIN_DB_PREFIX.$InfoFieldList[0];
5729
+				if (!empty($InfoFieldList[4])) {
5730 5730
 
5731 5731
 					// can use SELECT request
5732
-					if (strpos($InfoFieldList[4], '$SEL$')!==false) {
5733
-						$InfoFieldList[4]=str_replace('$SEL$','SELECT',$InfoFieldList[4]);
5732
+					if (strpos($InfoFieldList[4], '$SEL$') !== false) {
5733
+						$InfoFieldList[4] = str_replace('$SEL$', 'SELECT', $InfoFieldList[4]);
5734 5734
 					}
5735 5735
 
5736 5736
 					// current object id can be use into filter
5737
-					if (strpos($InfoFieldList[4], '$ID$')!==false && !empty($objectid)) {
5738
-						$InfoFieldList[4]=str_replace('$ID$',$objectid,$InfoFieldList[4]);
5737
+					if (strpos($InfoFieldList[4], '$ID$') !== false && !empty($objectid)) {
5738
+						$InfoFieldList[4] = str_replace('$ID$', $objectid, $InfoFieldList[4]);
5739 5739
 					} else {
5740
-						$InfoFieldList[4]=str_replace('$ID$','0',$InfoFieldList[4]);
5740
+						$InfoFieldList[4] = str_replace('$ID$', '0', $InfoFieldList[4]);
5741 5741
 					}
5742 5742
 
5743 5743
 					// We have to join on extrafield table
5744 5744
 					if (strpos($InfoFieldList[4], 'extra') !== false) {
5745
-						$sql .= ' as main, ' . MAIN_DB_PREFIX . $InfoFieldList[0] . '_extrafields as extra';
5746
-						$sqlwhere .= ' WHERE extra.fk_object=main.' . $InfoFieldList[2] . ' AND ' . $InfoFieldList[4];
5745
+						$sql .= ' as main, '.MAIN_DB_PREFIX.$InfoFieldList[0].'_extrafields as extra';
5746
+						$sqlwhere .= ' WHERE extra.fk_object=main.'.$InfoFieldList[2].' AND '.$InfoFieldList[4];
5747 5747
 					} else {
5748
-						$sqlwhere .= ' WHERE ' . $InfoFieldList[4];
5748
+						$sqlwhere .= ' WHERE '.$InfoFieldList[4];
5749 5749
 					}
5750 5750
 				} else {
5751 5751
 					$sqlwhere .= ' WHERE 1=1';
5752 5752
 				}
5753 5753
 				// Some tables may have field, some other not. For the moment we disable it.
5754
-				if (in_array($InfoFieldList[0], array ('tablewithentity')))
5754
+				if (in_array($InfoFieldList[0], array('tablewithentity')))
5755 5755
 				{
5756
-					$sqlwhere .= ' AND entity = ' . $conf->entity;
5756
+					$sqlwhere .= ' AND entity = '.$conf->entity;
5757 5757
 				}
5758 5758
 				// $sql.=preg_replace('/^ AND /','',$sqlwhere);
5759 5759
 				// print $sql;
5760 5760
 
5761 5761
 				$sql .= $sqlwhere;
5762
-				dol_syslog(get_class($this) . '::showInputField type=chkbxlst',LOG_DEBUG);
5762
+				dol_syslog(get_class($this).'::showInputField type=chkbxlst', LOG_DEBUG);
5763 5763
 				$resql = $this->db->query($sql);
5764 5764
 				if ($resql) {
5765 5765
 					$num = $this->db->num_rows($resql);
5766 5766
 					$i = 0;
5767 5767
 
5768
-					$data=array();
5768
+					$data = array();
5769 5769
 
5770
-					while ( $i < $num ) {
5770
+					while ($i < $num) {
5771 5771
 						$labeltoshow = '';
5772 5772
 						$obj = $this->db->fetch_object($resql);
5773 5773
 
@@ -5776,8 +5776,8 @@  discard block
 block discarded – undo
5776 5776
 						$fields_label = explode('|', $InfoFieldList[1]);
5777 5777
 						if (is_array($fields_label)) {
5778 5778
 							$notrans = true;
5779
-							foreach ( $fields_label as $field_toshow ) {
5780
-								$labeltoshow .= $obj->$field_toshow . ' ';
5779
+							foreach ($fields_label as $field_toshow) {
5780
+								$labeltoshow .= $obj->$field_toshow.' ';
5781 5781
 							}
5782 5782
 						} else {
5783 5783
 							$labeltoshow = $obj->{$InfoFieldList[1]};
@@ -5785,18 +5785,18 @@  discard block
 block discarded – undo
5785 5785
 						$labeltoshow = dol_trunc($labeltoshow, 45);
5786 5786
 
5787 5787
 						if (is_array($value_arr) && in_array($obj->rowid, $value_arr)) {
5788
-							foreach ( $fields_label as $field_toshow ) {
5788
+							foreach ($fields_label as $field_toshow) {
5789 5789
 								$translabel = $langs->trans($obj->$field_toshow);
5790 5790
 								if ($translabel != $obj->$field_toshow) {
5791
-									$labeltoshow = dol_trunc($translabel, 18) . ' ';
5791
+									$labeltoshow = dol_trunc($translabel, 18).' ';
5792 5792
 								} else {
5793
-									$labeltoshow = dol_trunc($obj->$field_toshow, 18) . ' ';
5793
+									$labeltoshow = dol_trunc($obj->$field_toshow, 18).' ';
5794 5794
 								}
5795 5795
 							}
5796 5796
 
5797
-							$data[$obj->rowid]=$labeltoshow;
5797
+							$data[$obj->rowid] = $labeltoshow;
5798 5798
 						} else {
5799
-							if (! $notrans) {
5799
+							if (!$notrans) {
5800 5800
 								$translabel = $langs->trans($obj->{$InfoFieldList[1]});
5801 5801
 								if ($translabel != $obj->{$InfoFieldList[1]}) {
5802 5802
 									$labeltoshow = dol_trunc($translabel, 18);
@@ -5808,67 +5808,67 @@  discard block
 block discarded – undo
5808 5808
 								$labeltoshow = '(not defined)';
5809 5809
 
5810 5810
 								if (is_array($value_arr) && in_array($obj->rowid, $value_arr)) {
5811
-									$data[$obj->rowid]=$labeltoshow;
5811
+									$data[$obj->rowid] = $labeltoshow;
5812 5812
 								}
5813 5813
 
5814
-								if (! empty($InfoFieldList[3]) && $parentField) {
5815
-									$parent = $parentName . ':' . $obj->{$parentField};
5814
+								if (!empty($InfoFieldList[3]) && $parentField) {
5815
+									$parent = $parentName.':'.$obj->{$parentField};
5816 5816
 								}
5817 5817
 
5818
-								$data[$obj->rowid]=$labeltoshow;
5818
+								$data[$obj->rowid] = $labeltoshow;
5819 5819
 						}
5820 5820
 
5821
-						$i ++;
5821
+						$i++;
5822 5822
 					}
5823 5823
 					$this->db->free($resql);
5824 5824
 
5825
-					$out=$form->multiselectarray($keyprefix.$key.$keysuffix, $data, $value_arr, '', 0, '', 0, '100%');
5825
+					$out = $form->multiselectarray($keyprefix.$key.$keysuffix, $data, $value_arr, '', 0, '', 0, '100%');
5826 5826
 				} else {
5827
-					print 'Error in request ' . $sql . ' ' . $this->db->lasterror() . '. Check setup of extra parameters.<br>';
5827
+					print 'Error in request '.$sql.' '.$this->db->lasterror().'. Check setup of extra parameters.<br>';
5828 5828
 				}
5829 5829
 			}
5830 5830
 		}
5831 5831
 		elseif ($type == 'link')
5832 5832
 		{
5833
-			$param_list=array_keys($param['options']);				// $param_list='ObjectName:classPath'
5834
-			$showempty=(($required && $default != '')?0:1);
5835
-			$out=$form->selectForForms($param_list[0], $keyprefix.$key.$keysuffix, $value, $showempty);
5833
+			$param_list = array_keys($param['options']); // $param_list='ObjectName:classPath'
5834
+			$showempty = (($required && $default != '') ? 0 : 1);
5835
+			$out = $form->selectForForms($param_list[0], $keyprefix.$key.$keysuffix, $value, $showempty);
5836 5836
 			if ($conf->global->MAIN_FEATURES_LEVEL >= 2)
5837 5837
 			{
5838
-            			list($class,$classfile)=explode(':',$param_list[0]);
5839
-            			if (file_exists(dol_buildpath(dirname(dirname($classfile)).'/card.php'))) $url_path=dol_buildpath(dirname(dirname($classfile)).'/card.php',1);
5840
-            			else $url_path=dol_buildpath(dirname(dirname($classfile)).'/'.$class.'_card.php',1);
5841
-            			$out.='<a class="butActionNew" href="'.$url_path.'?action=create&backtopage='.$_SERVER['PHP_SELF'].'"><span class="fa fa-plus-circle valignmiddle"></span></a>';
5838
+            			list($class, $classfile) = explode(':', $param_list[0]);
5839
+            			if (file_exists(dol_buildpath(dirname(dirname($classfile)).'/card.php'))) $url_path = dol_buildpath(dirname(dirname($classfile)).'/card.php', 1);
5840
+            			else $url_path = dol_buildpath(dirname(dirname($classfile)).'/'.$class.'_card.php', 1);
5841
+            			$out .= '<a class="butActionNew" href="'.$url_path.'?action=create&backtopage='.$_SERVER['PHP_SELF'].'"><span class="fa fa-plus-circle valignmiddle"></span></a>';
5842 5842
             			// TODO Add Javascript code to add input fields contents to new elements urls
5843 5843
 			}
5844 5844
 		}
5845 5845
 		elseif ($type == 'password')
5846 5846
 		{
5847 5847
 			// If prefix is 'search_', field is used as a filter, we use a common text field.
5848
-			$out='<input type="'.($keyprefix=='search_'?'text':'password').'" class="flat '.$morecss.'" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" value="'.$value.'" '.($moreparam?$moreparam:'').'>';
5848
+			$out = '<input type="'.($keyprefix == 'search_' ? 'text' : 'password').'" class="flat '.$morecss.'" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" value="'.$value.'" '.($moreparam ? $moreparam : '').'>';
5849 5849
 		}
5850 5850
 		elseif ($type == 'array')
5851 5851
 		{
5852 5852
 			$newval = $val;
5853 5853
 			$newval['type'] = 'varchar(256)';
5854 5854
 
5855
-			$out='';
5855
+			$out = '';
5856 5856
 
5857 5857
 			$inputs = array();
5858
-			if(! empty($value)) {
5859
-				foreach($value as $option) {
5860
-					$out.= '<span><a class="'.dol_escape_htmltag($keyprefix.$key.$keysuffix).'_del" href="javascript:;"><span class="fa fa-minus-circle valignmiddle"></span></a> ';
5861
-					$out.= $this->showInputField($newval, $keyprefix.$key.$keysuffix.'[]', $option, $moreparam, '', '', $showsize).'<br></span>';
5858
+			if (!empty($value)) {
5859
+				foreach ($value as $option) {
5860
+					$out .= '<span><a class="'.dol_escape_htmltag($keyprefix.$key.$keysuffix).'_del" href="javascript:;"><span class="fa fa-minus-circle valignmiddle"></span></a> ';
5861
+					$out .= $this->showInputField($newval, $keyprefix.$key.$keysuffix.'[]', $option, $moreparam, '', '', $showsize).'<br></span>';
5862 5862
 				}
5863 5863
 			}
5864 5864
 
5865
-			$out.= '<a id="'.dol_escape_htmltag($keyprefix.$key.$keysuffix).'_add" href="javascript:;"><span class="fa fa-plus-circle valignmiddle"></span></a>';
5865
+			$out .= '<a id="'.dol_escape_htmltag($keyprefix.$key.$keysuffix).'_add" href="javascript:;"><span class="fa fa-plus-circle valignmiddle"></span></a>';
5866 5866
 
5867 5867
 			$newInput = '<span><a class="'.dol_escape_htmltag($keyprefix.$key.$keysuffix).'_del" href="javascript:;"><span class="fa fa-minus-circle valignmiddle"></span></a> ';
5868
-			$newInput.= $this->showInputField($newval, $keyprefix.$key.$keysuffix.'[]', '', $moreparam, '', '', $showsize).'<br></span>';
5868
+			$newInput .= $this->showInputField($newval, $keyprefix.$key.$keysuffix.'[]', '', $moreparam, '', '', $showsize).'<br></span>';
5869 5869
 
5870
-			if(! empty($conf->use_javascript_ajax)) {
5871
-				$out.= '
5870
+			if (!empty($conf->use_javascript_ajax)) {
5871
+				$out .= '
5872 5872
 					<script type="text/javascript">
5873 5873
 					$(document).ready(function() {
5874 5874
 						$("a#'.dol_escape_js($keyprefix.$key.$keysuffix).'_add").click(function() {
@@ -5883,7 +5883,7 @@  discard block
 block discarded – undo
5883 5883
 			}
5884 5884
 		}
5885 5885
 		if (!empty($hidden)) {
5886
-			$out='<input type="hidden" value="'.$value.'" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'"/>';
5886
+			$out = '<input type="hidden" value="'.$value.'" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'"/>';
5887 5887
 		}
5888 5888
 		/* Add comments
5889 5889
 		 if ($type == 'date') $out.=' (YYYY-MM-DD)';
@@ -5905,14 +5905,14 @@  discard block
 block discarded – undo
5905 5905
 	 * @param  mixed   $showsize       Value for css to define size. May also be a numeric.
5906 5906
 	 * @return string
5907 5907
 	 */
5908
-	function showOutputField($val, $key, $value, $moreparam='', $keysuffix='', $keyprefix='', $showsize=0)
5908
+	function showOutputField($val, $key, $value, $moreparam = '', $keysuffix = '', $keyprefix = '', $showsize = 0)
5909 5909
 	{
5910
-		global $conf,$langs,$form;
5910
+		global $conf, $langs, $form;
5911 5911
 
5912
-		if (! is_object($form))
5912
+		if (!is_object($form))
5913 5913
 		{
5914 5914
 			require_once DOL_DOCUMENT_ROOT.'/core/class/html.form.class.php';
5915
-			$form=new Form($this->db);
5915
+			$form = new Form($this->db);
5916 5916
 		}
5917 5917
 
5918 5918
 		$objectid = $this->id;
@@ -5923,28 +5923,28 @@  discard block
 block discarded – undo
5923 5923
 		// Convert var to be able to share same code than showOutputField of extrafields
5924 5924
 		if (preg_match('/varchar\((\d+)\)/', $type, $reg))
5925 5925
 		{
5926
-			$type = 'varchar';		// convert varchar(xx) int varchar
5926
+			$type = 'varchar'; // convert varchar(xx) int varchar
5927 5927
 			$size = $reg[1];
5928 5928
 		}
5929
-		elseif (preg_match('/varchar/', $type)) $type = 'varchar';		// convert varchar(xx) int varchar
5930
-		if (is_array($val['arrayofkeyval'])) $type='select';
5931
-		if (preg_match('/^integer:(.*):(.*)/i', $val['type'], $reg)) $type='link';
5929
+		elseif (preg_match('/varchar/', $type)) $type = 'varchar'; // convert varchar(xx) int varchar
5930
+		if (is_array($val['arrayofkeyval'])) $type = 'select';
5931
+		if (preg_match('/^integer:(.*):(.*)/i', $val['type'], $reg)) $type = 'link';
5932 5932
 
5933
-		$default=$val['default'];
5934
-		$computed=$val['computed'];
5935
-		$unique=$val['unique'];
5936
-		$required=$val['required'];
5937
-		$param=$val['param'];
5933
+		$default = $val['default'];
5934
+		$computed = $val['computed'];
5935
+		$unique = $val['unique'];
5936
+		$required = $val['required'];
5937
+		$param = $val['param'];
5938 5938
 		if (is_array($val['arrayofkeyval'])) $param['options'] = $val['arrayofkeyval'];
5939 5939
 		if (preg_match('/^integer:(.*):(.*)/i', $val['type'], $reg))
5940 5940
 		{
5941
-			$type='link';
5942
-			$param['options']=array($reg[1].':'.$reg[2]=>$reg[1].':'.$reg[2]);
5941
+			$type = 'link';
5942
+			$param['options'] = array($reg[1].':'.$reg[2]=>$reg[1].':'.$reg[2]);
5943 5943
 		}
5944
-		$langfile=$val['langfile'];
5945
-		$list=$val['list'];
5946
-		$help=$val['help'];
5947
-		$hidden=(($val['visible'] == 0) ? 1 : 0);			// If zero, we are sure it is hidden, otherwise we show. If it depends on mode (view/create/edit form or list, this must be filtered by caller)
5944
+		$langfile = $val['langfile'];
5945
+		$list = $val['list'];
5946
+		$help = $val['help'];
5947
+		$hidden = (($val['visible'] == 0) ? 1 : 0); // If zero, we are sure it is hidden, otherwise we show. If it depends on mode (view/create/edit form or list, this must be filtered by caller)
5948 5948
 
5949 5949
 		if ($hidden) return '';
5950 5950
 
@@ -5968,18 +5968,18 @@  discard block
 block discarded – undo
5968 5968
 				//$showsize=19;
5969 5969
 				$showsize = 'minwidth200imp';
5970 5970
 			}
5971
-			elseif (in_array($type,array('int','double','price')))
5971
+			elseif (in_array($type, array('int', 'double', 'price')))
5972 5972
 			{
5973 5973
 				//$showsize=10;
5974 5974
 				$showsize = 'maxwidth75';
5975 5975
 			}
5976 5976
 			elseif ($type == 'url')
5977 5977
 			{
5978
-				$showsize='minwidth400';
5978
+				$showsize = 'minwidth400';
5979 5979
 			}
5980 5980
 			elseif ($type == 'boolean')
5981 5981
 			{
5982
-				$showsize='';
5982
+				$showsize = '';
5983 5983
 			}
5984 5984
 			else
5985 5985
 			{
@@ -6000,90 +6000,90 @@  discard block
 block discarded – undo
6000 6000
 		}
6001 6001
 
6002 6002
 		// Format output value differently according to properties of field
6003
-		if ($key == 'ref' && method_exists($this, 'getNomUrl')) $value=$this->getNomUrl(1, '', 0, '', 1);
6004
-		elseif ($key == 'status' && method_exists($this, 'getLibStatut')) $value=$this->getLibStatut(3);
6003
+		if ($key == 'ref' && method_exists($this, 'getNomUrl')) $value = $this->getNomUrl(1, '', 0, '', 1);
6004
+		elseif ($key == 'status' && method_exists($this, 'getLibStatut')) $value = $this->getLibStatut(3);
6005 6005
 		elseif ($type == 'date')
6006 6006
 		{
6007
-			if(! empty($value)) {
6008
-				$value=dol_print_date($value,'day');
6007
+			if (!empty($value)) {
6008
+				$value = dol_print_date($value, 'day');
6009 6009
 			} else {
6010
-				$value='';
6010
+				$value = '';
6011 6011
 			}
6012 6012
 		}
6013 6013
 		elseif ($type == 'datetime')
6014 6014
 		{
6015
-			if(! empty($value)) {
6016
-				$value=dol_print_date($value,'dayhour');
6015
+			if (!empty($value)) {
6016
+				$value = dol_print_date($value, 'dayhour');
6017 6017
 			} else {
6018
-				$value='';
6018
+				$value = '';
6019 6019
 			}
6020 6020
 		}
6021 6021
 		elseif ($type == 'double')
6022 6022
 		{
6023 6023
 			if (!empty($value)) {
6024
-				$value=price($value);
6024
+				$value = price($value);
6025 6025
 			}
6026 6026
 		}
6027 6027
 		elseif ($type == 'boolean')
6028 6028
 		{
6029
-			$checked='';
6029
+			$checked = '';
6030 6030
 			if (!empty($value)) {
6031
-				$checked=' checked ';
6031
+				$checked = ' checked ';
6032 6032
 			}
6033
-			$value='<input type="checkbox" '.$checked.' '.($moreparam?$moreparam:'').' readonly disabled>';
6033
+			$value = '<input type="checkbox" '.$checked.' '.($moreparam ? $moreparam : '').' readonly disabled>';
6034 6034
 		}
6035 6035
 		elseif ($type == 'mail')
6036 6036
 		{
6037
-			$value=dol_print_email($value,0,0,0,64,1,1);
6037
+			$value = dol_print_email($value, 0, 0, 0, 64, 1, 1);
6038 6038
 		}
6039 6039
 		elseif ($type == 'url')
6040 6040
 		{
6041
-			$value=dol_print_url($value,'_blank',32,1);
6041
+			$value = dol_print_url($value, '_blank', 32, 1);
6042 6042
 		}
6043 6043
 		elseif ($type == 'phone')
6044 6044
 		{
6045
-			$value=dol_print_phone($value, '', 0, 0, '', '&nbsp;', 1);
6045
+			$value = dol_print_phone($value, '', 0, 0, '', '&nbsp;', 1);
6046 6046
 		}
6047 6047
 		elseif ($type == 'price')
6048 6048
 		{
6049
-			$value=price($value,0,$langs,0,0,-1,$conf->currency);
6049
+			$value = price($value, 0, $langs, 0, 0, -1, $conf->currency);
6050 6050
 		}
6051 6051
 		elseif ($type == 'select')
6052 6052
 		{
6053
-			$value=$param['options'][$value];
6053
+			$value = $param['options'][$value];
6054 6054
 		}
6055 6055
 		elseif ($type == 'sellist')
6056 6056
 		{
6057
-			$param_list=array_keys($param['options']);
6057
+			$param_list = array_keys($param['options']);
6058 6058
 			$InfoFieldList = explode(":", $param_list[0]);
6059 6059
 
6060
-			$selectkey="rowid";
6061
-			$keyList='rowid';
6060
+			$selectkey = "rowid";
6061
+			$keyList = 'rowid';
6062 6062
 
6063
-			if (count($InfoFieldList)>=3)
6063
+			if (count($InfoFieldList) >= 3)
6064 6064
 			{
6065 6065
 				$selectkey = $InfoFieldList[2];
6066
-				$keyList=$InfoFieldList[2].' as rowid';
6066
+				$keyList = $InfoFieldList[2].' as rowid';
6067 6067
 			}
6068 6068
 
6069
-			$fields_label = explode('|',$InfoFieldList[1]);
6070
-			if(is_array($fields_label)) {
6071
-				$keyList .=', ';
6069
+			$fields_label = explode('|', $InfoFieldList[1]);
6070
+			if (is_array($fields_label)) {
6071
+				$keyList .= ', ';
6072 6072
 				$keyList .= implode(', ', $fields_label);
6073 6073
 			}
6074 6074
 
6075 6075
 			$sql = 'SELECT '.$keyList;
6076
-			$sql.= ' FROM '.MAIN_DB_PREFIX .$InfoFieldList[0];
6077
-			if (strpos($InfoFieldList[4], 'extra')!==false)
6076
+			$sql .= ' FROM '.MAIN_DB_PREFIX.$InfoFieldList[0];
6077
+			if (strpos($InfoFieldList[4], 'extra') !== false)
6078 6078
 			{
6079
-				$sql.= ' as main';
6079
+				$sql .= ' as main';
6080 6080
 			}
6081
-			if ($selectkey=='rowid' && empty($value)) {
6082
-				$sql.= " WHERE ".$selectkey."=0";
6083
-			} elseif ($selectkey=='rowid') {
6084
-				$sql.= " WHERE ".$selectkey."=".$this->db->escape($value);
6085
-			}else {
6086
-				$sql.= " WHERE ".$selectkey."='".$this->db->escape($value)."'";
6081
+			if ($selectkey == 'rowid' && empty($value)) {
6082
+				$sql .= " WHERE ".$selectkey."=0";
6083
+			} elseif ($selectkey == 'rowid') {
6084
+				$sql .= " WHERE ".$selectkey."=".$this->db->escape($value);
6085
+			} else {
6086
+				$sql .= " WHERE ".$selectkey."='".$this->db->escape($value)."'";
6087 6087
 			}
6088 6088
 
6089 6089
 			//$sql.= ' AND entity = '.$conf->entity;
@@ -6092,38 +6092,38 @@  discard block
 block discarded – undo
6092 6092
 			$resql = $this->db->query($sql);
6093 6093
 			if ($resql)
6094 6094
 			{
6095
-				$value='';	// value was used, so now we reste it to use it to build final output
6095
+				$value = ''; // value was used, so now we reste it to use it to build final output
6096 6096
 
6097 6097
 				$obj = $this->db->fetch_object($resql);
6098 6098
 
6099 6099
 				// Several field into label (eq table:code|libelle:rowid)
6100
-				$fields_label = explode('|',$InfoFieldList[1]);
6100
+				$fields_label = explode('|', $InfoFieldList[1]);
6101 6101
 
6102
-				if(is_array($fields_label) && count($fields_label)>1)
6102
+				if (is_array($fields_label) && count($fields_label) > 1)
6103 6103
 				{
6104 6104
 					foreach ($fields_label as $field_toshow)
6105 6105
 					{
6106
-						$translabel='';
6106
+						$translabel = '';
6107 6107
 						if (!empty($obj->$field_toshow)) {
6108
-							$translabel=$langs->trans($obj->$field_toshow);
6108
+							$translabel = $langs->trans($obj->$field_toshow);
6109 6109
 						}
6110
-						if ($translabel!=$field_toshow) {
6111
-							$value.=dol_trunc($translabel,18).' ';
6112
-						}else {
6113
-							$value.=$obj->$field_toshow.' ';
6110
+						if ($translabel != $field_toshow) {
6111
+							$value .= dol_trunc($translabel, 18).' ';
6112
+						} else {
6113
+							$value .= $obj->$field_toshow.' ';
6114 6114
 						}
6115 6115
 					}
6116 6116
 				}
6117 6117
 				else
6118 6118
 				{
6119
-					$translabel='';
6119
+					$translabel = '';
6120 6120
 					if (!empty($obj->{$InfoFieldList[1]})) {
6121
-						$translabel=$langs->trans($obj->{$InfoFieldList[1]});
6121
+						$translabel = $langs->trans($obj->{$InfoFieldList[1]});
6122 6122
 					}
6123
-					if ($translabel!=$obj->{$InfoFieldList[1]}) {
6124
-						$value=dol_trunc($translabel,18);
6125
-					}else {
6126
-						$value=$obj->{$InfoFieldList[1]};
6123
+					if ($translabel != $obj->{$InfoFieldList[1]}) {
6124
+						$value = dol_trunc($translabel, 18);
6125
+					} else {
6126
+						$value = $obj->{$InfoFieldList[1]};
6127 6127
 					}
6128 6128
 				}
6129 6129
 			}
@@ -6131,18 +6131,18 @@  discard block
 block discarded – undo
6131 6131
 		}
6132 6132
 		elseif ($type == 'radio')
6133 6133
 		{
6134
-			$value=$param['options'][$value];
6134
+			$value = $param['options'][$value];
6135 6135
 		}
6136 6136
 		elseif ($type == 'checkbox')
6137 6137
 		{
6138
-			$value_arr=explode(',',$value);
6139
-			$value='';
6140
-			if (is_array($value_arr) && count($value_arr)>0)
6138
+			$value_arr = explode(',', $value);
6139
+			$value = '';
6140
+			if (is_array($value_arr) && count($value_arr) > 0)
6141 6141
 			{
6142 6142
 				foreach ($value_arr as $keyval=>$valueval) {
6143
-					$toprint[]='<li class="select2-search-choice-dolibarr noborderoncategories" style="background: #aaa">'.$param['options'][$valueval].'</li>';
6143
+					$toprint[] = '<li class="select2-search-choice-dolibarr noborderoncategories" style="background: #aaa">'.$param['options'][$valueval].'</li>';
6144 6144
 				}
6145
-				$value='<div class="select2-container-multi-dolibarr" style="width: 90%;"><ul class="select2-choices-dolibarr">'.implode(' ', $toprint).'</ul></div>';
6145
+				$value = '<div class="select2-container-multi-dolibarr" style="width: 90%;"><ul class="select2-choices-dolibarr">'.implode(' ', $toprint).'</ul></div>';
6146 6146
 			}
6147 6147
 		}
6148 6148
 		elseif ($type == 'chkbxlst')
@@ -6157,7 +6157,7 @@  discard block
 block discarded – undo
6157 6157
 
6158 6158
 			if (count($InfoFieldList) >= 3) {
6159 6159
 				$selectkey = $InfoFieldList[2];
6160
-				$keyList = $InfoFieldList[2] . ' as rowid';
6160
+				$keyList = $InfoFieldList[2].' as rowid';
6161 6161
 			}
6162 6162
 
6163 6163
 			$fields_label = explode('|', $InfoFieldList[1]);
@@ -6166,75 +6166,75 @@  discard block
 block discarded – undo
6166 6166
 				$keyList .= implode(', ', $fields_label);
6167 6167
 			}
6168 6168
 
6169
-			$sql = 'SELECT ' . $keyList;
6170
-			$sql .= ' FROM ' . MAIN_DB_PREFIX . $InfoFieldList[0];
6169
+			$sql = 'SELECT '.$keyList;
6170
+			$sql .= ' FROM '.MAIN_DB_PREFIX.$InfoFieldList[0];
6171 6171
 			if (strpos($InfoFieldList[4], 'extra') !== false) {
6172 6172
 				$sql .= ' as main';
6173 6173
 			}
6174 6174
 			// $sql.= " WHERE ".$selectkey."='".$this->db->escape($value)."'";
6175 6175
 			// $sql.= ' AND entity = '.$conf->entity;
6176 6176
 
6177
-			dol_syslog(get_class($this) . ':showOutputField:$type=chkbxlst',LOG_DEBUG);
6177
+			dol_syslog(get_class($this).':showOutputField:$type=chkbxlst', LOG_DEBUG);
6178 6178
 			$resql = $this->db->query($sql);
6179 6179
 			if ($resql) {
6180 6180
 				$value = ''; // value was used, so now we reste it to use it to build final output
6181
-				$toprint=array();
6182
-				while ( $obj = $this->db->fetch_object($resql) ) {
6181
+				$toprint = array();
6182
+				while ($obj = $this->db->fetch_object($resql)) {
6183 6183
 
6184 6184
 					// Several field into label (eq table:code|libelle:rowid)
6185 6185
 					$fields_label = explode('|', $InfoFieldList[1]);
6186 6186
 					if (is_array($value_arr) && in_array($obj->rowid, $value_arr)) {
6187 6187
 						if (is_array($fields_label) && count($fields_label) > 1) {
6188
-							foreach ( $fields_label as $field_toshow ) {
6188
+							foreach ($fields_label as $field_toshow) {
6189 6189
 								$translabel = '';
6190
-								if (! empty($obj->$field_toshow)) {
6190
+								if (!empty($obj->$field_toshow)) {
6191 6191
 									$translabel = $langs->trans($obj->$field_toshow);
6192 6192
 								}
6193 6193
 								if ($translabel != $field_toshow) {
6194
-									$toprint[]='<li class="select2-search-choice-dolibarr noborderoncategories" style="background: #aaa">'.dol_trunc($translabel, 18).'</li>';
6194
+									$toprint[] = '<li class="select2-search-choice-dolibarr noborderoncategories" style="background: #aaa">'.dol_trunc($translabel, 18).'</li>';
6195 6195
 								} else {
6196
-									$toprint[]='<li class="select2-search-choice-dolibarr noborderoncategories" style="background: #aaa">'.$obj->$field_toshow.'</li>';
6196
+									$toprint[] = '<li class="select2-search-choice-dolibarr noborderoncategories" style="background: #aaa">'.$obj->$field_toshow.'</li>';
6197 6197
 								}
6198 6198
 							}
6199 6199
 						} else {
6200 6200
 							$translabel = '';
6201
-							if (! empty($obj->{$InfoFieldList[1]})) {
6201
+							if (!empty($obj->{$InfoFieldList[1]})) {
6202 6202
 								$translabel = $langs->trans($obj->{$InfoFieldList[1]});
6203 6203
 							}
6204 6204
 							if ($translabel != $obj->{$InfoFieldList[1]}) {
6205
-								$toprint[]='<li class="select2-search-choice-dolibarr noborderoncategories" style="background: #aaa">'.dol_trunc($translabel, 18).'</li>';
6205
+								$toprint[] = '<li class="select2-search-choice-dolibarr noborderoncategories" style="background: #aaa">'.dol_trunc($translabel, 18).'</li>';
6206 6206
 							} else {
6207
-								$toprint[]='<li class="select2-search-choice-dolibarr noborderoncategories" style="background: #aaa">'.$obj->{$InfoFieldList[1]}.'</li>';
6207
+								$toprint[] = '<li class="select2-search-choice-dolibarr noborderoncategories" style="background: #aaa">'.$obj->{$InfoFieldList[1]}.'</li>';
6208 6208
 							}
6209 6209
 						}
6210 6210
 					}
6211 6211
 				}
6212
-				$value='<div class="select2-container-multi-dolibarr" style="width: 90%;"><ul class="select2-choices-dolibarr">'.implode(' ', $toprint).'</ul></div>';
6212
+				$value = '<div class="select2-container-multi-dolibarr" style="width: 90%;"><ul class="select2-choices-dolibarr">'.implode(' ', $toprint).'</ul></div>';
6213 6213
 			} else {
6214
-				dol_syslog(get_class($this) . '::showOutputField error ' . $this->db->lasterror(), LOG_WARNING);
6214
+				dol_syslog(get_class($this).'::showOutputField error '.$this->db->lasterror(), LOG_WARNING);
6215 6215
 			}
6216 6216
 		}
6217 6217
 		elseif ($type == 'link')
6218 6218
 		{
6219
-			$out='';
6219
+			$out = '';
6220 6220
 
6221 6221
 			// only if something to display (perf)
6222 6222
 			if ($value)
6223 6223
 			{
6224
-				$param_list=array_keys($param['options']);				// $param_list='ObjectName:classPath'
6224
+				$param_list = array_keys($param['options']); // $param_list='ObjectName:classPath'
6225 6225
 
6226 6226
 				$InfoFieldList = explode(":", $param_list[0]);
6227
-				$classname=$InfoFieldList[0];
6228
-				$classpath=$InfoFieldList[1];
6229
-				$getnomurlparam=(empty($InfoFieldList[2]) ? 3 : $InfoFieldList[2]);
6230
-				if (! empty($classpath))
6227
+				$classname = $InfoFieldList[0];
6228
+				$classpath = $InfoFieldList[1];
6229
+				$getnomurlparam = (empty($InfoFieldList[2]) ? 3 : $InfoFieldList[2]);
6230
+				if (!empty($classpath))
6231 6231
 				{
6232 6232
 					dol_include_once($InfoFieldList[1]);
6233 6233
 					if ($classname && class_exists($classname))
6234 6234
 					{
6235 6235
 						$object = new $classname($this->db);
6236 6236
 						$object->fetch($value);
6237
-						$value=$object->getNomUrl($getnomurlparam);
6237
+						$value = $object->getNomUrl($getnomurlparam);
6238 6238
 					}
6239 6239
 				}
6240 6240
 				else
@@ -6243,15 +6243,15 @@  discard block
 block discarded – undo
6243 6243
 					return 'Error bad setup of extrafield';
6244 6244
 				}
6245 6245
 			}
6246
-			else $value='';
6246
+			else $value = '';
6247 6247
 		}
6248 6248
 		elseif ($type == 'text' || $type == 'html')
6249 6249
 		{
6250
-			$value=dol_htmlentitiesbr($value);
6250
+			$value = dol_htmlentitiesbr($value);
6251 6251
 		}
6252 6252
 		elseif ($type == 'password')
6253 6253
 		{
6254
-			$value=preg_replace('/./i','*',$value);
6254
+			$value = preg_replace('/./i', '*', $value);
6255 6255
 		}
6256 6256
 		elseif ($type == 'array')
6257 6257
 		{
@@ -6259,7 +6259,7 @@  discard block
 block discarded – undo
6259 6259
 		}
6260 6260
 
6261 6261
 		//print $type.'-'.$size;
6262
-		$out=$value;
6262
+		$out = $value;
6263 6263
 
6264 6264
 		return $out;
6265 6265
 	}
@@ -6276,11 +6276,11 @@  discard block
 block discarded – undo
6276 6276
 	 * @param	string		$onetrtd		All fields in same tr td
6277 6277
 	 * @return 	string
6278 6278
 	 */
6279
-	function showOptionals($extrafields, $mode='view', $params=null, $keysuffix='', $keyprefix='', $onetrtd=0)
6279
+	function showOptionals($extrafields, $mode = 'view', $params = null, $keysuffix = '', $keyprefix = '', $onetrtd = 0)
6280 6280
 	{
6281 6281
 		global $db, $conf, $langs, $action, $form;
6282 6282
 
6283
-		if (! is_object($form)) $form=new Form($db);
6283
+		if (!is_object($form)) $form = new Form($db);
6284 6284
 
6285 6285
 		$out = '';
6286 6286
 
@@ -6291,10 +6291,10 @@  discard block
 block discarded – undo
6291 6291
 			$out .= "\n";
6292 6292
 
6293 6293
 			$e = 0;
6294
-			foreach($extrafields->attributes[$this->table_element]['label'] as $key=>$label)
6294
+			foreach ($extrafields->attributes[$this->table_element]['label'] as $key=>$label)
6295 6295
 			{
6296 6296
 				// Show only the key field in params
6297
-				if (is_array($params) && array_key_exists('onlykey',$params) && $key != $params['onlykey']) continue;
6297
+				if (is_array($params) && array_key_exists('onlykey', $params) && $key != $params['onlykey']) continue;
6298 6298
 
6299 6299
 				$enabled = 1;
6300 6300
 				if ($enabled && isset($extrafields->attributes[$this->table_element]['list'][$key]))
@@ -6308,25 +6308,25 @@  discard block
 block discarded – undo
6308 6308
 					$perms = dol_eval($extrafields->attributes[$this->table_element]['perms'][$key], 1);
6309 6309
 				}
6310 6310
 
6311
-				if (($mode == 'create' || $mode == 'edit') && abs($enabled) != 1 && abs($enabled) != 3) continue;	// <> -1 and <> 1 and <> 3 = not visible on forms, only on list
6311
+				if (($mode == 'create' || $mode == 'edit') && abs($enabled) != 1 && abs($enabled) != 3) continue; // <> -1 and <> 1 and <> 3 = not visible on forms, only on list
6312 6312
 				if (empty($perms)) continue;
6313 6313
 
6314 6314
 				// Load language if required
6315
-				if (! empty($extrafields->attributes[$this->table_element]['langfile'][$key])) $langs->load($extrafields->attributes[$this->table_element]['langfile'][$key]);
6315
+				if (!empty($extrafields->attributes[$this->table_element]['langfile'][$key])) $langs->load($extrafields->attributes[$this->table_element]['langfile'][$key]);
6316 6316
 
6317
-				$colspan='3';
6318
-				if (is_array($params) && count($params)>0) {
6319
-					if (array_key_exists('colspan',$params)) {
6320
-						$colspan=$params['colspan'];
6317
+				$colspan = '3';
6318
+				if (is_array($params) && count($params) > 0) {
6319
+					if (array_key_exists('colspan', $params)) {
6320
+						$colspan = $params['colspan'];
6321 6321
 					}
6322 6322
 				}
6323 6323
 
6324
-				switch($mode) {
6324
+				switch ($mode) {
6325 6325
 					case "view":
6326
-						$value=$this->array_options["options_".$key.$keysuffix];
6326
+						$value = $this->array_options["options_".$key.$keysuffix];
6327 6327
 						break;
6328 6328
 					case "edit":
6329
-						$getposttemp = GETPOST($keyprefix.'options_'.$key.$keysuffix, 'none');				// GETPOST can get value from GET, POST or setup of default values.
6329
+						$getposttemp = GETPOST($keyprefix.'options_'.$key.$keysuffix, 'none'); // GETPOST can get value from GET, POST or setup of default values.
6330 6330
 						// GETPOST("options_" . $key) can be 'abc' or array(0=>'abc')
6331 6331
 						if (is_array($getposttemp) || $getposttemp != '' || GETPOSTISSET($keyprefix.'options_'.$key.$keysuffix))
6332 6332
 						{
@@ -6337,7 +6337,7 @@  discard block
 block discarded – undo
6337 6337
 								$value = $getposttemp;
6338 6338
 							}
6339 6339
 						} else {
6340
-							$value = $this->array_options["options_" . $key];			// No GET, no POST, no default value, so we take value of object.
6340
+							$value = $this->array_options["options_".$key]; // No GET, no POST, no default value, so we take value of object.
6341 6341
 						}
6342 6342
 						//var_dump($keyprefix.' - '.$key.' - '.$keysuffix.' - '.$keyprefix.'options_'.$key.$keysuffix.' - '.$this->array_options["options_".$key.$keysuffix].' - '.$getposttemp.' - '.$value);
6343 6343
 						break;
@@ -6349,11 +6349,11 @@  discard block
 block discarded – undo
6349 6349
 				}
6350 6350
 				else
6351 6351
 				{
6352
-					$csstyle='';
6353
-					$class=(!empty($extrafields->attributes[$this->table_element]['hidden'][$key]) ? 'hideobject ' : '');
6354
-					if (is_array($params) && count($params)>0) {
6355
-						if (array_key_exists('style',$params)) {
6356
-							$csstyle=$params['style'];
6352
+					$csstyle = '';
6353
+					$class = (!empty($extrafields->attributes[$this->table_element]['hidden'][$key]) ? 'hideobject ' : '');
6354
+					if (is_array($params) && count($params) > 0) {
6355
+						if (array_key_exists('style', $params)) {
6356
+							$csstyle = $params['style'];
6357 6357
 						}
6358 6358
 					}
6359 6359
 
@@ -6366,43 +6366,43 @@  discard block
 block discarded – undo
6366 6366
 
6367 6367
 					$out .= '<tr id="'.$html_id.'" '.$csstyle.' class="'.$class.$this->element.'_extras_'.$key.'" '.$domData.' >';
6368 6368
 
6369
-					if (! empty($conf->global->MAIN_EXTRAFIELDS_USE_TWO_COLUMS) && ($e % 2) == 0)
6369
+					if (!empty($conf->global->MAIN_EXTRAFIELDS_USE_TWO_COLUMS) && ($e % 2) == 0)
6370 6370
 					{
6371
-						if (! empty($conf->global->MAIN_EXTRAFIELDS_USE_TWO_COLUMS) && ($e % 2) == 0) { $colspan='0'; }
6371
+						if (!empty($conf->global->MAIN_EXTRAFIELDS_USE_TWO_COLUMS) && ($e % 2) == 0) { $colspan = '0'; }
6372 6372
 					}
6373 6373
 
6374 6374
 					if ($action == 'selectlines') { $colspan++; }
6375 6375
 
6376 6376
 					// Convert date into timestamp format (value in memory must be a timestamp)
6377
-					if (in_array($extrafields->attributes[$this->table_element]['type'][$key],array('date','datetime')))
6377
+					if (in_array($extrafields->attributes[$this->table_element]['type'][$key], array('date', 'datetime')))
6378 6378
 					{
6379
-						$datenotinstring = $this->array_options['options_' . $key];
6380
-						if (! is_numeric($this->array_options['options_' . $key]))	// For backward compatibility
6379
+						$datenotinstring = $this->array_options['options_'.$key];
6380
+						if (!is_numeric($this->array_options['options_'.$key]))	// For backward compatibility
6381 6381
 						{
6382 6382
 							$datenotinstring = $this->db->jdate($datenotinstring);
6383 6383
 						}
6384
-						$value = GETPOSTISSET($keyprefix.'options_'.$key.$keysuffix)?dol_mktime(GETPOST($keyprefix.'options_'.$key.$keysuffix."hour", 'int', 3), GETPOST($keyprefix.'options_'.$key.$keysuffix."min",'int',3), 0, GETPOST($keyprefix.'options_'.$key.$keysuffix."month",'int',3), GETPOST($keyprefix.'options_'.$key.$keysuffix."day",'int',3), GETPOST($keyprefix.'options_'.$key.$keysuffix."year",'int',3)):$datenotinstring;
6384
+						$value = GETPOSTISSET($keyprefix.'options_'.$key.$keysuffix) ?dol_mktime(GETPOST($keyprefix.'options_'.$key.$keysuffix."hour", 'int', 3), GETPOST($keyprefix.'options_'.$key.$keysuffix."min", 'int', 3), 0, GETPOST($keyprefix.'options_'.$key.$keysuffix."month", 'int', 3), GETPOST($keyprefix.'options_'.$key.$keysuffix."day", 'int', 3), GETPOST($keyprefix.'options_'.$key.$keysuffix."year", 'int', 3)) : $datenotinstring;
6385 6385
 					}
6386 6386
 					// Convert float submited string into real php numeric (value in memory must be a php numeric)
6387
-					if (in_array($extrafields->attributes[$this->table_element]['type'][$key],array('price','double')))
6387
+					if (in_array($extrafields->attributes[$this->table_element]['type'][$key], array('price', 'double')))
6388 6388
 					{
6389
-						$value = GETPOSTISSET($keyprefix.'options_'.$key.$keysuffix)?price2num(GETPOST($keyprefix.'options_'.$key.$keysuffix, 'alpha', 3)):$this->array_options['options_'.$key];
6389
+						$value = GETPOSTISSET($keyprefix.'options_'.$key.$keysuffix) ?price2num(GETPOST($keyprefix.'options_'.$key.$keysuffix, 'alpha', 3)) : $this->array_options['options_'.$key];
6390 6390
 					}
6391 6391
 
6392 6392
 					$labeltoshow = $langs->trans($label);
6393 6393
 
6394 6394
 					$out .= '<td class="titlefield';
6395
-					if (GETPOST('action','none') == 'create') $out.='create';
6396
-					if ($mode != 'view' && ! empty($extrafields->attributes[$this->table_element]['required'][$key])) $out .= ' fieldrequired';
6395
+					if (GETPOST('action', 'none') == 'create') $out .= 'create';
6396
+					if ($mode != 'view' && !empty($extrafields->attributes[$this->table_element]['required'][$key])) $out .= ' fieldrequired';
6397 6397
 					$out .= '">';
6398
-					if (! empty($extrafields->attributes[$object->table_element]['help'][$key])) $out .= $form->textwithpicto($labeltoshow, $extrafields->attributes[$object->table_element]['help'][$key]);
6398
+					if (!empty($extrafields->attributes[$object->table_element]['help'][$key])) $out .= $form->textwithpicto($labeltoshow, $extrafields->attributes[$object->table_element]['help'][$key]);
6399 6399
 					else $out .= $labeltoshow;
6400 6400
 					$out .= '</td>';
6401 6401
 
6402 6402
 					$html_id = !empty($this->id) ? $this->element.'_extras_'.$key.'_'.$this->id : '';
6403
-					$out .='<td id="'.$html_id.'" class="'.$this->element.'_extras_'.$key.'" '.($colspan?' colspan="'.$colspan.'"':'').'>';
6403
+					$out .= '<td id="'.$html_id.'" class="'.$this->element.'_extras_'.$key.'" '.($colspan ? ' colspan="'.$colspan.'"' : '').'>';
6404 6404
 
6405
-					switch($mode) {
6405
+					switch ($mode) {
6406 6406
 						case "view":
6407 6407
 							$out .= $extrafields->showOutputField($key, $value);
6408 6408
 							break;
@@ -6413,14 +6413,14 @@  discard block
 block discarded – undo
6413 6413
 
6414 6414
 					$out .= '</td>';
6415 6415
 
6416
-					if (! empty($conf->global->MAIN_EXTRAFIELDS_USE_TWO_COLUMS) && (($e % 2) == 1)) $out .= '</tr>';
6416
+					if (!empty($conf->global->MAIN_EXTRAFIELDS_USE_TWO_COLUMS) && (($e % 2) == 1)) $out .= '</tr>';
6417 6417
 					else $out .= '</tr>';
6418 6418
 					$e++;
6419 6419
 				}
6420 6420
 			}
6421 6421
 			$out .= "\n";
6422 6422
 			// Add code to manage list depending on others
6423
-			if (! empty($conf->use_javascript_ajax)) {
6423
+			if (!empty($conf->use_javascript_ajax)) {
6424 6424
 				$out .= '
6425 6425
 				<script type="text/javascript">
6426 6426
 				    jQuery(document).ready(function() {
@@ -6466,7 +6466,7 @@  discard block
 block discarded – undo
6466 6466
 		global $user;
6467 6467
 
6468 6468
 		$element = $this->element;
6469
-		if ($element == 'facturerec') $element='facture';
6469
+		if ($element == 'facturerec') $element = 'facture';
6470 6470
 
6471 6471
 		return $user->rights->{$element};
6472 6472
 	}
@@ -6483,15 +6483,15 @@  discard block
 block discarded – undo
6483 6483
 	 * @param  int         $ignoreerrors  Ignore errors. Return true even if errors. We need this when replacement can fails like for categories (categorie of old thirdparty may already exists on new one)
6484 6484
 	 * @return bool						  True if success, False if error
6485 6485
 	 */
6486
-	public static function commonReplaceThirdparty(DoliDB $db, $origin_id, $dest_id, array $tables, $ignoreerrors=0)
6486
+	public static function commonReplaceThirdparty(DoliDB $db, $origin_id, $dest_id, array $tables, $ignoreerrors = 0)
6487 6487
 	{
6488 6488
 		foreach ($tables as $table)
6489 6489
 		{
6490 6490
 			$sql = 'UPDATE '.MAIN_DB_PREFIX.$table.' SET fk_soc = '.$dest_id.' WHERE fk_soc = '.$origin_id;
6491 6491
 
6492
-			if (! $db->query($sql))
6492
+			if (!$db->query($sql))
6493 6493
 			{
6494
-				if ($ignoreerrors) return true;		// TODO Not enough. If there is A-B on kept thirdarty and B-C on old one, we must get A-B-C after merge. Not A-B.
6494
+				if ($ignoreerrors) return true; // TODO Not enough. If there is A-B on kept thirdarty and B-C on old one, we must get A-B-C after merge. Not A-B.
6495 6495
 				//$this->errors = $db->lasterror();
6496 6496
 				return false;
6497 6497
 			}
@@ -6525,7 +6525,7 @@  discard block
 block discarded – undo
6525 6525
 		else
6526 6526
 		{
6527 6527
 			// Get cost price for margin calculation
6528
-			if (! empty($fk_product))
6528
+			if (!empty($fk_product))
6529 6529
 			{
6530 6530
 				if (isset($conf->global->MARGIN_TYPE) && $conf->global->MARGIN_TYPE == 'costprice')
6531 6531
 				{
@@ -6562,7 +6562,7 @@  discard block
 block discarded – undo
6562 6562
 					}
6563 6563
 				}
6564 6564
 
6565
-				if (empty($buyPrice) && isset($conf->global->MARGIN_TYPE) && in_array($conf->global->MARGIN_TYPE, array('1','pmp','costprice')))
6565
+				if (empty($buyPrice) && isset($conf->global->MARGIN_TYPE) && in_array($conf->global->MARGIN_TYPE, array('1', 'pmp', 'costprice')))
6566 6566
 				{
6567 6567
 					require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.product.class.php';
6568 6568
 					$productFournisseur = new ProductFournisseur($this->db);
@@ -6599,18 +6599,18 @@  discard block
 block discarded – undo
6599 6599
 	 *  @param		int		$usesharelink	Use the public shared link of image (if not available, the 'nophoto' image will be shown instead)
6600 6600
 	 *  @return     string					Html code to show photo. Number of photos shown is saved in this->nbphoto
6601 6601
 	 */
6602
-	function show_photos($modulepart, $sdir, $size=0, $nbmax=0, $nbbyrow=5, $showfilename=0, $showaction=0, $maxHeight=120, $maxWidth=160, $nolink=0, $notitle=0, $usesharelink=0)
6602
+	function show_photos($modulepart, $sdir, $size = 0, $nbmax = 0, $nbbyrow = 5, $showfilename = 0, $showaction = 0, $maxHeight = 120, $maxWidth = 160, $nolink = 0, $notitle = 0, $usesharelink = 0)
6603 6603
 	{
6604 6604
         // phpcs:enable
6605
-		global $conf,$user,$langs;
6605
+		global $conf, $user, $langs;
6606 6606
 
6607
-		include_once DOL_DOCUMENT_ROOT .'/core/lib/files.lib.php';
6608
-		include_once DOL_DOCUMENT_ROOT .'/core/lib/images.lib.php';
6607
+		include_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
6608
+		include_once DOL_DOCUMENT_ROOT.'/core/lib/images.lib.php';
6609 6609
 
6610
-		$sortfield='position_name';
6611
-		$sortorder='asc';
6610
+		$sortfield = 'position_name';
6611
+		$sortorder = 'asc';
6612 6612
 
6613
-		$dir = $sdir . '/';
6613
+		$dir = $sdir.'/';
6614 6614
 		$pdir = '/';
6615 6615
 		if ($modulepart == 'ticket')
6616 6616
 		{
@@ -6624,28 +6624,28 @@  discard block
 block discarded – undo
6624 6624
 		}
6625 6625
 
6626 6626
 		// For backward compatibility
6627
-		if ($modulepart == 'product' && ! empty($conf->global->PRODUCT_USE_OLD_PATH_FOR_PHOTO))
6627
+		if ($modulepart == 'product' && !empty($conf->global->PRODUCT_USE_OLD_PATH_FOR_PHOTO))
6628 6628
 		{
6629
-			$dir = $sdir . '/'. get_exdir($this->id,2,0,0,$this,$modulepart) . $this->id ."/photos/";
6630
-			$pdir = '/' . get_exdir($this->id,2,0,0,$this,$modulepart) . $this->id ."/photos/";
6629
+			$dir = $sdir.'/'.get_exdir($this->id, 2, 0, 0, $this, $modulepart).$this->id."/photos/";
6630
+			$pdir = '/'.get_exdir($this->id, 2, 0, 0, $this, $modulepart).$this->id."/photos/";
6631 6631
 		}
6632 6632
 
6633 6633
 		// Defined relative dir to DOL_DATA_ROOT
6634 6634
 		$relativedir = '';
6635 6635
 		if ($dir)
6636 6636
 		{
6637
-			$relativedir = preg_replace('/^'.preg_quote(DOL_DATA_ROOT,'/').'/', '', $dir);
6638
-			$relativedir = preg_replace('/^[\\/]/','',$relativedir);
6639
-			$relativedir = preg_replace('/[\\/]$/','',$relativedir);
6637
+			$relativedir = preg_replace('/^'.preg_quote(DOL_DATA_ROOT, '/').'/', '', $dir);
6638
+			$relativedir = preg_replace('/^[\\/]/', '', $relativedir);
6639
+			$relativedir = preg_replace('/[\\/]$/', '', $relativedir);
6640 6640
 		}
6641 6641
 
6642 6642
 		$dirthumb = $dir.'thumbs/';
6643 6643
 		$pdirthumb = $pdir.'thumbs/';
6644 6644
 
6645
-		$return ='<!-- Photo -->'."\n";
6646
-		$nbphoto=0;
6645
+		$return = '<!-- Photo -->'."\n";
6646
+		$nbphoto = 0;
6647 6647
 
6648
-		$filearray=dol_dir_list($dir,"files",0,'','(\.meta|_preview.*\.png)$',$sortfield,(strtolower($sortorder)=='desc'?SORT_DESC:SORT_ASC),1);
6648
+		$filearray = dol_dir_list($dir, "files", 0, '', '(\.meta|_preview.*\.png)$', $sortfield, (strtolower($sortorder) == 'desc' ?SORT_DESC:SORT_ASC), 1);
6649 6649
 
6650 6650
 		/*if (! empty($conf->global->PRODUCT_USE_OLD_PATH_FOR_PHOTO))    // For backward compatiblity, we scan also old dirs
6651 6651
 		 {
@@ -6659,12 +6659,12 @@  discard block
 block discarded – undo
6659 6659
 		{
6660 6660
 			if ($sortfield && $sortorder)
6661 6661
 			{
6662
-				$filearray=dol_sort_array($filearray, $sortfield, $sortorder);
6662
+				$filearray = dol_sort_array($filearray, $sortfield, $sortorder);
6663 6663
 			}
6664 6664
 
6665
-			foreach($filearray as $key => $val)
6665
+			foreach ($filearray as $key => $val)
6666 6666
 			{
6667
-				$photo='';
6667
+				$photo = '';
6668 6668
 				$file = $val['name'];
6669 6669
 
6670 6670
 				//if (! utf8_check($file)) $file=utf8_encode($file);	// To be sure file is stored in UTF8 in memory
@@ -6679,36 +6679,36 @@  discard block
 block discarded – undo
6679 6679
 					if ($size == 1 || $size == 'small') {   // Format vignette
6680 6680
 
6681 6681
 						// Find name of thumb file
6682
-						$photo_vignette=basename(getImageFileNameForSize($dir.$file, '_small'));
6683
-						if (! dol_is_file($dirthumb.$photo_vignette)) $photo_vignette='';
6682
+						$photo_vignette = basename(getImageFileNameForSize($dir.$file, '_small'));
6683
+						if (!dol_is_file($dirthumb.$photo_vignette)) $photo_vignette = '';
6684 6684
 
6685 6685
 						// Get filesize of original file
6686
-						$imgarray=dol_getImageSize($dir.$photo);
6686
+						$imgarray = dol_getImageSize($dir.$photo);
6687 6687
 
6688 6688
 						if ($nbbyrow > 0)
6689 6689
 						{
6690
-							if ($nbphoto == 1) $return.= '<table width="100%" valign="top" align="center" border="0" cellpadding="2" cellspacing="2">';
6690
+							if ($nbphoto == 1) $return .= '<table width="100%" valign="top" align="center" border="0" cellpadding="2" cellspacing="2">';
6691 6691
 
6692
-							if ($nbphoto % $nbbyrow == 1) $return.= '<tr align=center valign=middle border=1>';
6693
-							$return.= '<td width="'.ceil(100/$nbbyrow).'%" class="photo">';
6692
+							if ($nbphoto % $nbbyrow == 1) $return .= '<tr align=center valign=middle border=1>';
6693
+							$return .= '<td width="'.ceil(100 / $nbbyrow).'%" class="photo">';
6694 6694
 						}
6695 6695
 						else if ($nbbyrow < 0) $return .= '<div class="inline-block">';
6696 6696
 
6697
-						$return.= "\n";
6697
+						$return .= "\n";
6698 6698
 
6699
-						$relativefile=preg_replace('/^\//', '', $pdir.$photo);
6699
+						$relativefile = preg_replace('/^\//', '', $pdir.$photo);
6700 6700
 						if (empty($nolink))
6701 6701
 						{
6702
-							$urladvanced=getAdvancedPreviewUrl($modulepart, $relativefile, 0, 'entity='.$this->entity);
6703
-							if ($urladvanced) $return.='<a href="'.$urladvanced.'">';
6704
-							else $return.= '<a href="'.DOL_URL_ROOT.'/viewimage.php?modulepart='.$modulepart.'&entity='.$this->entity.'&file='.urlencode($pdir.$photo).'" class="aphoto" target="_blank">';
6702
+							$urladvanced = getAdvancedPreviewUrl($modulepart, $relativefile, 0, 'entity='.$this->entity);
6703
+							if ($urladvanced) $return .= '<a href="'.$urladvanced.'">';
6704
+							else $return .= '<a href="'.DOL_URL_ROOT.'/viewimage.php?modulepart='.$modulepart.'&entity='.$this->entity.'&file='.urlencode($pdir.$photo).'" class="aphoto" target="_blank">';
6705 6705
 						}
6706 6706
 
6707 6707
 						// Show image (width height=$maxHeight)
6708 6708
 						// Si fichier vignette disponible et image source trop grande, on utilise la vignette, sinon on utilise photo origine
6709
-						$alt=$langs->transnoentitiesnoconv('File').': '.$relativefile;
6710
-						$alt.=' - '.$langs->transnoentitiesnoconv('Size').': '.$imgarray['width'].'x'.$imgarray['height'];
6711
-						if ($notitle) $alt='';
6709
+						$alt = $langs->transnoentitiesnoconv('File').': '.$relativefile;
6710
+						$alt .= ' - '.$langs->transnoentitiesnoconv('Size').': '.$imgarray['width'].'x'.$imgarray['height'];
6711
+						if ($notitle) $alt = '';
6712 6712
 
6713 6713
 						if ($usesharelink)
6714 6714
 						{
@@ -6716,81 +6716,81 @@  discard block
 block discarded – undo
6716 6716
 							{
6717 6717
 								if (empty($maxHeight) || $photo_vignette && $imgarray['height'] > $maxHeight)
6718 6718
 								{
6719
-									$return.= '<!-- Show original file (thumb not yet available with shared links) -->';
6720
-									$return.= '<img class="photo photowithmargin" border="0" height="'.$maxHeight.'" src="'.DOL_URL_ROOT.'/viewimage.php?hashp='.urlencode($val['share']).'" title="'.dol_escape_htmltag($alt).'">';
6719
+									$return .= '<!-- Show original file (thumb not yet available with shared links) -->';
6720
+									$return .= '<img class="photo photowithmargin" border="0" height="'.$maxHeight.'" src="'.DOL_URL_ROOT.'/viewimage.php?hashp='.urlencode($val['share']).'" title="'.dol_escape_htmltag($alt).'">';
6721 6721
 								}
6722 6722
 								else {
6723
-									$return.= '<!-- Show original file -->';
6724
-									$return.= '<img class="photo photowithmargin" border="0" height="'.$maxHeight.'" src="'.DOL_URL_ROOT.'/viewimage.php?hashp='.urlencode($val['share']).'" title="'.dol_escape_htmltag($alt).'">';
6723
+									$return .= '<!-- Show original file -->';
6724
+									$return .= '<img class="photo photowithmargin" border="0" height="'.$maxHeight.'" src="'.DOL_URL_ROOT.'/viewimage.php?hashp='.urlencode($val['share']).'" title="'.dol_escape_htmltag($alt).'">';
6725 6725
 								}
6726 6726
 							}
6727 6727
 							else
6728 6728
 							{
6729
-								$return.= '<!-- Show nophoto file (because file is not shared) -->';
6730
-								$return.= '<img class="photo photowithmargin" border="0" height="'.$maxHeight.'" src="'.DOL_URL_ROOT.'/public/theme/common/nophoto.png" title="'.dol_escape_htmltag($alt).'">';
6729
+								$return .= '<!-- Show nophoto file (because file is not shared) -->';
6730
+								$return .= '<img class="photo photowithmargin" border="0" height="'.$maxHeight.'" src="'.DOL_URL_ROOT.'/public/theme/common/nophoto.png" title="'.dol_escape_htmltag($alt).'">';
6731 6731
 							}
6732 6732
 						}
6733 6733
 						else
6734 6734
 						{
6735 6735
 							if (empty($maxHeight) || $photo_vignette && $imgarray['height'] > $maxHeight)
6736 6736
 							{
6737
-								$return.= '<!-- Show thumb -->';
6738
-								$return.= '<img class="photo photowithmargin" border="0" height="'.$maxHeight.'" src="'.DOL_URL_ROOT.'/viewimage.php?modulepart='.$modulepart.'&entity='.$this->entity.'&file='.urlencode($pdirthumb.$photo_vignette).'" title="'.dol_escape_htmltag($alt).'">';
6737
+								$return .= '<!-- Show thumb -->';
6738
+								$return .= '<img class="photo photowithmargin" border="0" height="'.$maxHeight.'" src="'.DOL_URL_ROOT.'/viewimage.php?modulepart='.$modulepart.'&entity='.$this->entity.'&file='.urlencode($pdirthumb.$photo_vignette).'" title="'.dol_escape_htmltag($alt).'">';
6739 6739
 							}
6740 6740
 							else {
6741
-								$return.= '<!-- Show original file -->';
6742
-								$return.= '<img class="photo photowithmargin" border="0" height="'.$maxHeight.'" src="'.DOL_URL_ROOT.'/viewimage.php?modulepart='.$modulepart.'&entity='.$this->entity.'&file='.urlencode($pdir.$photo).'" title="'.dol_escape_htmltag($alt).'">';
6741
+								$return .= '<!-- Show original file -->';
6742
+								$return .= '<img class="photo photowithmargin" border="0" height="'.$maxHeight.'" src="'.DOL_URL_ROOT.'/viewimage.php?modulepart='.$modulepart.'&entity='.$this->entity.'&file='.urlencode($pdir.$photo).'" title="'.dol_escape_htmltag($alt).'">';
6743 6743
 							}
6744 6744
 						}
6745 6745
 
6746
-						if (empty($nolink)) $return.= '</a>';
6747
-						$return.="\n";
6746
+						if (empty($nolink)) $return .= '</a>';
6747
+						$return .= "\n";
6748 6748
 
6749
-						if ($showfilename) $return.= '<br>'.$viewfilename;
6749
+						if ($showfilename) $return .= '<br>'.$viewfilename;
6750 6750
 						if ($showaction)
6751 6751
 						{
6752
-							$return.= '<br>';
6752
+							$return .= '<br>';
6753 6753
 							// On propose la generation de la vignette si elle n'existe pas et si la taille est superieure aux limites
6754 6754
 							if ($photo_vignette && (image_format_supported($photo) > 0) && ($this->imgWidth > $maxWidth || $this->imgHeight > $maxHeight))
6755 6755
 							{
6756
-								$return.= '<a href="'.$_SERVER["PHP_SELF"].'?id='.$this->id.'&amp;action=addthumb&amp;file='.urlencode($pdir.$viewfilename).'">'.img_picto($langs->trans('GenerateThumb'),'refresh').'&nbsp;&nbsp;</a>';
6756
+								$return .= '<a href="'.$_SERVER["PHP_SELF"].'?id='.$this->id.'&amp;action=addthumb&amp;file='.urlencode($pdir.$viewfilename).'">'.img_picto($langs->trans('GenerateThumb'), 'refresh').'&nbsp;&nbsp;</a>';
6757 6757
 							}
6758 6758
 							// Special cas for product
6759 6759
 							if ($modulepart == 'product' && ($user->rights->produit->creer || $user->rights->service->creer))
6760 6760
 							{
6761 6761
 								// Link to resize
6762
-								$return.= '<a href="'.DOL_URL_ROOT.'/core/photos_resize.php?modulepart='.urlencode('produit|service').'&id='.$this->id.'&amp;file='.urlencode($pdir.$viewfilename).'" title="'.dol_escape_htmltag($langs->trans("Resize")).'">'.img_picto($langs->trans("Resize"), 'resize', '').'</a> &nbsp; ';
6762
+								$return .= '<a href="'.DOL_URL_ROOT.'/core/photos_resize.php?modulepart='.urlencode('produit|service').'&id='.$this->id.'&amp;file='.urlencode($pdir.$viewfilename).'" title="'.dol_escape_htmltag($langs->trans("Resize")).'">'.img_picto($langs->trans("Resize"), 'resize', '').'</a> &nbsp; ';
6763 6763
 
6764 6764
 								// Link to delete
6765
-								$return.= '<a href="'.$_SERVER["PHP_SELF"].'?id='.$this->id.'&amp;action=delete&amp;file='.urlencode($pdir.$viewfilename).'">';
6766
-								$return.= img_delete().'</a>';
6765
+								$return .= '<a href="'.$_SERVER["PHP_SELF"].'?id='.$this->id.'&amp;action=delete&amp;file='.urlencode($pdir.$viewfilename).'">';
6766
+								$return .= img_delete().'</a>';
6767 6767
 							}
6768 6768
 						}
6769
-						$return.= "\n";
6769
+						$return .= "\n";
6770 6770
 
6771 6771
 						if ($nbbyrow > 0)
6772 6772
 						{
6773
-							$return.= '</td>';
6774
-							if (($nbphoto % $nbbyrow) == 0) $return.= '</tr>';
6773
+							$return .= '</td>';
6774
+							if (($nbphoto % $nbbyrow) == 0) $return .= '</tr>';
6775 6775
 						}
6776
-						else if ($nbbyrow < 0) $return.='</div>';
6776
+						else if ($nbbyrow < 0) $return .= '</div>';
6777 6777
 					}
6778 6778
 
6779 6779
 					if (empty($size)) {     // Format origine
6780
-						$return.= '<img class="photo photowithmargin" border="0" src="'.DOL_URL_ROOT.'/viewimage.php?modulepart='.$modulepart.'&entity='.$this->entity.'&file='.urlencode($pdir.$photo).'">';
6780
+						$return .= '<img class="photo photowithmargin" border="0" src="'.DOL_URL_ROOT.'/viewimage.php?modulepart='.$modulepart.'&entity='.$this->entity.'&file='.urlencode($pdir.$photo).'">';
6781 6781
 
6782
-						if ($showfilename) $return.= '<br>'.$viewfilename;
6782
+						if ($showfilename) $return .= '<br>'.$viewfilename;
6783 6783
 						if ($showaction)
6784 6784
 						{
6785 6785
 							// Special case for product
6786 6786
 							if ($modulepart == 'product' && ($user->rights->produit->creer || $user->rights->service->creer))
6787 6787
 							{
6788 6788
 								// Link to resize
6789
-								$return.= '<a href="'.DOL_URL_ROOT.'/core/photos_resize.php?modulepart='.urlencode('produit|service').'&id='.$this->id.'&amp;file='.urlencode($pdir.$viewfilename).'" title="'.dol_escape_htmltag($langs->trans("Resize")).'">'.img_picto($langs->trans("Resize"), 'resize', '').'</a> &nbsp; ';
6789
+								$return .= '<a href="'.DOL_URL_ROOT.'/core/photos_resize.php?modulepart='.urlencode('produit|service').'&id='.$this->id.'&amp;file='.urlencode($pdir.$viewfilename).'" title="'.dol_escape_htmltag($langs->trans("Resize")).'">'.img_picto($langs->trans("Resize"), 'resize', '').'</a> &nbsp; ';
6790 6790
 
6791 6791
 								// Link to delete
6792
-								$return.= '<a href="'.$_SERVER["PHP_SELF"].'?id='.$this->id.'&amp;action=delete&amp;file='.urlencode($pdir.$viewfilename).'">';
6793
-								$return.= img_delete().'</a>';
6792
+								$return .= '<a href="'.$_SERVER["PHP_SELF"].'?id='.$this->id.'&amp;action=delete&amp;file='.urlencode($pdir.$viewfilename).'">';
6793
+								$return .= img_delete().'</a>';
6794 6794
 							}
6795 6795
 						}
6796 6796
 					}
@@ -6800,18 +6800,18 @@  discard block
 block discarded – undo
6800 6800
 				}
6801 6801
 			}
6802 6802
 
6803
-			if ($size==1 || $size=='small')
6803
+			if ($size == 1 || $size == 'small')
6804 6804
 			{
6805 6805
 				if ($nbbyrow > 0)
6806 6806
 				{
6807 6807
 					// Ferme tableau
6808 6808
 					while ($nbphoto % $nbbyrow)
6809 6809
 					{
6810
-						$return.= '<td width="'.ceil(100/$nbbyrow).'%">&nbsp;</td>';
6810
+						$return .= '<td width="'.ceil(100 / $nbbyrow).'%">&nbsp;</td>';
6811 6811
 						$nbphoto++;
6812 6812
 					}
6813 6813
 
6814
-					if ($nbphoto) $return.= '</table>';
6814
+					if ($nbphoto) $return .= '</table>';
6815 6815
 				}
6816 6816
 			}
6817 6817
 		}
@@ -6830,9 +6830,9 @@  discard block
 block discarded – undo
6830 6830
 	 */
6831 6831
 	protected function isArray($info)
6832 6832
 	{
6833
-		if(is_array($info))
6833
+		if (is_array($info))
6834 6834
 		{
6835
-			if(isset($info['type']) && $info['type']=='array') return true;
6835
+			if (isset($info['type']) && $info['type'] == 'array') return true;
6836 6836
 			else return false;
6837 6837
 		}
6838 6838
 		else return false;
@@ -6846,9 +6846,9 @@  discard block
 block discarded – undo
6846 6846
 	 */
6847 6847
 	protected function isNull($info)
6848 6848
 	{
6849
-		if(is_array($info))
6849
+		if (is_array($info))
6850 6850
 		{
6851
-			if(isset($info['type']) && $info['type']=='null') return true;
6851
+			if (isset($info['type']) && $info['type'] == 'null') return true;
6852 6852
 			else return false;
6853 6853
 		}
6854 6854
 		else return false;
@@ -6862,7 +6862,7 @@  discard block
 block discarded – undo
6862 6862
 	 */
6863 6863
 	public function isDate($info)
6864 6864
 	{
6865
-		if(isset($info['type']) && ($info['type']=='date' || $info['type']=='datetime' || $info['type']=='timestamp')) return true;
6865
+		if (isset($info['type']) && ($info['type'] == 'date' || $info['type'] == 'datetime' || $info['type'] == 'timestamp')) return true;
6866 6866
 		else return false;
6867 6867
 	}
6868 6868
 
@@ -6874,9 +6874,9 @@  discard block
 block discarded – undo
6874 6874
 	 */
6875 6875
 	public function isInt($info)
6876 6876
 	{
6877
-		if(is_array($info))
6877
+		if (is_array($info))
6878 6878
 		{
6879
-			if(isset($info['type']) && ($info['type']=='int' || preg_match('/^integer/i',$info['type']) ) ) return true;
6879
+			if (isset($info['type']) && ($info['type'] == 'int' || preg_match('/^integer/i', $info['type']))) return true;
6880 6880
 			else return false;
6881 6881
 		}
6882 6882
 		else return false;
@@ -6890,7 +6890,7 @@  discard block
 block discarded – undo
6890 6890
 	 */
6891 6891
 	public function isFloat($info)
6892 6892
 	{
6893
-		if(is_array($info))
6893
+		if (is_array($info))
6894 6894
 		{
6895 6895
 			if (isset($info['type']) && (preg_match('/^(double|real)/i', $info['type']))) return true;
6896 6896
 			else return false;
@@ -6906,9 +6906,9 @@  discard block
 block discarded – undo
6906 6906
 	 */
6907 6907
 	public function isText($info)
6908 6908
 	{
6909
-		if(is_array($info))
6909
+		if (is_array($info))
6910 6910
 		{
6911
-			if(isset($info['type']) && $info['type']=='text') return true;
6911
+			if (isset($info['type']) && $info['type'] == 'text') return true;
6912 6912
 			else return false;
6913 6913
 		}
6914 6914
 		else return false;
@@ -6922,9 +6922,9 @@  discard block
 block discarded – undo
6922 6922
 	 */
6923 6923
 	protected function isIndex($info)
6924 6924
 	{
6925
-		if(is_array($info))
6925
+		if (is_array($info))
6926 6926
 		{
6927
-			if(isset($info['index']) && $info['index']==true) return true;
6927
+			if (isset($info['index']) && $info['index'] == true) return true;
6928 6928
 			else return false;
6929 6929
 		}
6930 6930
 		else return false;
@@ -6940,13 +6940,13 @@  discard block
 block discarded – undo
6940 6940
 	{
6941 6941
 		global $conf;
6942 6942
 
6943
-		$queryarray=array();
6943
+		$queryarray = array();
6944 6944
 		foreach ($this->fields as $field=>$info)	// Loop on definition of fields
6945 6945
 		{
6946 6946
 			// Depending on field type ('datetime', ...)
6947
-			if($this->isDate($info))
6947
+			if ($this->isDate($info))
6948 6948
 			{
6949
-				if(empty($this->{$field}))
6949
+				if (empty($this->{$field}))
6950 6950
 				{
6951 6951
 					$queryarray[$field] = null;
6952 6952
 				}
@@ -6955,10 +6955,10 @@  discard block
 block discarded – undo
6955 6955
 					$queryarray[$field] = $this->db->idate($this->{$field});
6956 6956
 				}
6957 6957
 			}
6958
-			else if($this->isArray($info))
6958
+			else if ($this->isArray($info))
6959 6959
 			{
6960
-				if(! empty($this->{$field})) {
6961
-					if(! is_array($this->{$field})) {
6960
+				if (!empty($this->{$field})) {
6961
+					if (!is_array($this->{$field})) {
6962 6962
 						$this->{$field} = array($this->{$field});
6963 6963
 					}
6964 6964
 					$queryarray[$field] = serialize($this->{$field});
@@ -6966,19 +6966,19 @@  discard block
 block discarded – undo
6966 6966
 					$queryarray[$field] = null;
6967 6967
 				}
6968 6968
 			}
6969
-			else if($this->isInt($info))
6969
+			else if ($this->isInt($info))
6970 6970
 			{
6971
-				if ($field == 'entity' && is_null($this->{$field})) $queryarray[$field]=$conf->entity;
6971
+				if ($field == 'entity' && is_null($this->{$field})) $queryarray[$field] = $conf->entity;
6972 6972
 				else
6973 6973
 				{
6974 6974
 					$queryarray[$field] = (int) price2num($this->{$field});
6975
-					if (empty($queryarray[$field])) $queryarray[$field]=0;		// May be reset to null later if property 'notnull' is -1 for this field.
6975
+					if (empty($queryarray[$field])) $queryarray[$field] = 0; // May be reset to null later if property 'notnull' is -1 for this field.
6976 6976
 				}
6977 6977
 			}
6978
-			else if($this->isFloat($info))
6978
+			else if ($this->isFloat($info))
6979 6979
 			{
6980 6980
 				$queryarray[$field] = (double) price2num($this->{$field});
6981
-				if (empty($queryarray[$field])) $queryarray[$field]=0;
6981
+				if (empty($queryarray[$field])) $queryarray[$field] = 0;
6982 6982
 			}
6983 6983
 			else
6984 6984
 			{
@@ -6986,7 +6986,7 @@  discard block
 block discarded – undo
6986 6986
 			}
6987 6987
 
6988 6988
 			if ($info['type'] == 'timestamp' && empty($queryarray[$field])) unset($queryarray[$field]);
6989
-			if (! empty($info['notnull']) && $info['notnull'] == -1 && empty($queryarray[$field])) $queryarray[$field] = null;
6989
+			if (!empty($info['notnull']) && $info['notnull'] == -1 && empty($queryarray[$field])) $queryarray[$field] = null;
6990 6990
 		}
6991 6991
 
6992 6992
 		return $queryarray;
@@ -7002,35 +7002,35 @@  discard block
 block discarded – undo
7002 7002
 	{
7003 7003
 		foreach ($this->fields as $field => $info)
7004 7004
 		{
7005
-			if($this->isDate($info))
7005
+			if ($this->isDate($info))
7006 7006
 			{
7007
-				if(empty($obj->{$field}) || $obj->{$field} === '0000-00-00 00:00:00' || $obj->{$field} === '1000-01-01 00:00:00') $this->{$field} = 0;
7007
+				if (empty($obj->{$field}) || $obj->{$field} === '0000-00-00 00:00:00' || $obj->{$field} === '1000-01-01 00:00:00') $this->{$field} = 0;
7008 7008
 				else $this->{$field} = strtotime($obj->{$field});
7009 7009
 			}
7010
-			elseif($this->isArray($info))
7010
+			elseif ($this->isArray($info))
7011 7011
 			{
7012
-				if(! empty($obj->{$field})) {
7012
+				if (!empty($obj->{$field})) {
7013 7013
 					$this->{$field} = @unserialize($obj->{$field});
7014 7014
 					// Hack for data not in UTF8
7015
-					if($this->{$field } === false) @unserialize(utf8_decode($obj->{$field}));
7015
+					if ($this->{$field } === false) @unserialize(utf8_decode($obj->{$field}));
7016 7016
 				} else {
7017 7017
 					$this->{$field} = array();
7018 7018
 				}
7019 7019
 			}
7020
-			elseif($this->isInt($info))
7020
+			elseif ($this->isInt($info))
7021 7021
 			{
7022 7022
 				if ($field == 'rowid') $this->id = (int) $obj->{$field};
7023 7023
 				else $this->{$field} = (int) $obj->{$field};
7024 7024
 			}
7025
-			elseif($this->isFloat($info))
7025
+			elseif ($this->isFloat($info))
7026 7026
 			{
7027 7027
 				$this->{$field} = (double) $obj->{$field};
7028 7028
 			}
7029
-			elseif($this->isNull($info))
7029
+			elseif ($this->isNull($info))
7030 7030
 			{
7031 7031
 				$val = $obj->{$field};
7032 7032
 				// zero is not null
7033
-				$this->{$field} = (is_null($val) || (empty($val) && $val!==0 && $val!=='0') ? null : $val);
7033
+				$this->{$field} = (is_null($val) || (empty($val) && $val !== 0 && $val !== '0') ? null : $val);
7034 7034
 			}
7035 7035
 			else
7036 7036
 			{
@@ -7039,7 +7039,7 @@  discard block
 block discarded – undo
7039 7039
 		}
7040 7040
 
7041 7041
 		// If there is no 'ref' field, we force property ->ref to ->id for a better compatibility with common functions.
7042
-		if (! isset($this->fields['ref']) && isset($this->id)) $this->ref = $this->id;
7042
+		if (!isset($this->fields['ref']) && isset($this->id)) $this->ref = $this->id;
7043 7043
 	}
7044 7044
 
7045 7045
 	/**
@@ -7081,14 +7081,14 @@  discard block
 block discarded – undo
7081 7081
 
7082 7082
 		$error = 0;
7083 7083
 
7084
-		$now=dol_now();
7084
+		$now = dol_now();
7085 7085
 
7086 7086
 		$fieldvalues = $this->setSaveQuery();
7087
-		if (array_key_exists('date_creation', $fieldvalues) && empty($fieldvalues['date_creation'])) $fieldvalues['date_creation']=$this->db->idate($now);
7088
-		if (array_key_exists('fk_user_creat', $fieldvalues) && ! ($fieldvalues['fk_user_creat'] > 0)) $fieldvalues['fk_user_creat']=$user->id;
7089
-		unset($fieldvalues['rowid']);	// The field 'rowid' is reserved field name for autoincrement field so we don't need it into insert.
7087
+		if (array_key_exists('date_creation', $fieldvalues) && empty($fieldvalues['date_creation'])) $fieldvalues['date_creation'] = $this->db->idate($now);
7088
+		if (array_key_exists('fk_user_creat', $fieldvalues) && !($fieldvalues['fk_user_creat'] > 0)) $fieldvalues['fk_user_creat'] = $user->id;
7089
+		unset($fieldvalues['rowid']); // The field 'rowid' is reserved field name for autoincrement field so we don't need it into insert.
7090 7090
 
7091
-		$keys=array();
7091
+		$keys = array();
7092 7092
 		$values = array();
7093 7093
 		foreach ($fieldvalues as $k => $v) {
7094 7094
 			$keys[$k] = $k;
@@ -7097,58 +7097,58 @@  discard block
 block discarded – undo
7097 7097
 		}
7098 7098
 
7099 7099
 		// Clean and check mandatory
7100
-		foreach($keys as $key)
7100
+		foreach ($keys as $key)
7101 7101
 		{
7102 7102
 			// If field is an implicit foreign key field
7103
-			if (preg_match('/^integer:/i', $this->fields[$key]['type']) && $values[$key] == '-1') $values[$key]='';
7104
-			if (! empty($this->fields[$key]['foreignkey']) && $values[$key] == '-1') $values[$key]='';
7103
+			if (preg_match('/^integer:/i', $this->fields[$key]['type']) && $values[$key] == '-1') $values[$key] = '';
7104
+			if (!empty($this->fields[$key]['foreignkey']) && $values[$key] == '-1') $values[$key] = '';
7105 7105
 
7106 7106
 			//var_dump($key.'-'.$values[$key].'-'.($this->fields[$key]['notnull'] == 1));
7107
-			if (isset($this->fields[$key]['notnull']) && $this->fields[$key]['notnull'] == 1 && ! isset($values[$key]) && is_null($val['default']))
7107
+			if (isset($this->fields[$key]['notnull']) && $this->fields[$key]['notnull'] == 1 && !isset($values[$key]) && is_null($val['default']))
7108 7108
 			{
7109 7109
 				$error++;
7110
-				$this->errors[]=$langs->trans("ErrorFieldRequired", $this->fields[$key]['label']);
7110
+				$this->errors[] = $langs->trans("ErrorFieldRequired", $this->fields[$key]['label']);
7111 7111
 			}
7112 7112
 
7113 7113
 			// If field is an implicit foreign key field
7114
-			if (preg_match('/^integer:/i', $this->fields[$key]['type']) && empty($values[$key])) $values[$key]='null';
7115
-			if (! empty($this->fields[$key]['foreignkey']) && empty($values[$key])) $values[$key]='null';
7114
+			if (preg_match('/^integer:/i', $this->fields[$key]['type']) && empty($values[$key])) $values[$key] = 'null';
7115
+			if (!empty($this->fields[$key]['foreignkey']) && empty($values[$key])) $values[$key] = 'null';
7116 7116
 		}
7117 7117
 
7118 7118
 		if ($error) return -1;
7119 7119
 
7120 7120
 		$this->db->begin();
7121 7121
 
7122
-		if (! $error)
7122
+		if (!$error)
7123 7123
 		{
7124 7124
 			$sql = 'INSERT INTO '.MAIN_DB_PREFIX.$this->table_element;
7125
-			$sql.= ' ('.implode( ", ", $keys ).')';
7126
-			$sql.= ' VALUES ('.implode( ", ", $values ).')';
7125
+			$sql .= ' ('.implode(", ", $keys).')';
7126
+			$sql .= ' VALUES ('.implode(", ", $values).')';
7127 7127
 
7128 7128
 			$res = $this->db->query($sql);
7129
-			if ($res===false) {
7129
+			if ($res === false) {
7130 7130
 				$error++;
7131 7131
 				$this->errors[] = $this->db->lasterror();
7132 7132
 			}
7133 7133
 		}
7134 7134
 
7135
-		if (! $error)
7135
+		if (!$error)
7136 7136
 		{
7137
-			$this->id = $this->db->last_insert_id(MAIN_DB_PREFIX . $this->table_element);
7137
+			$this->id = $this->db->last_insert_id(MAIN_DB_PREFIX.$this->table_element);
7138 7138
 		}
7139 7139
 
7140 7140
 		// Create extrafields
7141
-		if (! $error)
7141
+		if (!$error)
7142 7142
 		{
7143
-			$result=$this->insertExtraFields();
7143
+			$result = $this->insertExtraFields();
7144 7144
 			if ($result < 0) $error++;
7145 7145
 		}
7146 7146
 
7147 7147
 		// Triggers
7148
-		if (! $error && ! $notrigger)
7148
+		if (!$error && !$notrigger)
7149 7149
 		{
7150 7150
 			// Call triggers
7151
-			$result=$this->call_trigger(strtoupper(get_class($this)).'_CREATE',$user);
7151
+			$result = $this->call_trigger(strtoupper(get_class($this)).'_CREATE', $user);
7152 7152
 			if ($result < 0) { $error++; }
7153 7153
 			// End call triggers
7154 7154
 		}
@@ -7177,13 +7177,13 @@  discard block
 block discarded – undo
7177 7177
 		if (empty($id) && empty($ref) && empty($morewhere)) return -1;
7178 7178
 
7179 7179
 		$sql = 'SELECT '.$this->getFieldList();
7180
-		$sql.= ' FROM '.MAIN_DB_PREFIX.$this->table_element;
7180
+		$sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element;
7181 7181
 
7182
-		if (!empty($id))  $sql.= ' WHERE rowid = '.$id;
7183
-		elseif (!empty($ref)) $sql.= " WHERE ref = ".$this->quote($ref, $this->fields['ref']);
7184
-		else $sql.=' WHERE 1 = 1';	// usage with empty id and empty ref is very rare
7185
-		if ($morewhere)   $sql.= $morewhere;
7186
-		$sql.=' LIMIT 1';	// This is a fetch, to be sure to get only one record
7182
+		if (!empty($id))  $sql .= ' WHERE rowid = '.$id;
7183
+		elseif (!empty($ref)) $sql .= " WHERE ref = ".$this->quote($ref, $this->fields['ref']);
7184
+		else $sql .= ' WHERE 1 = 1'; // usage with empty id and empty ref is very rare
7185
+		if ($morewhere)   $sql .= $morewhere;
7186
+		$sql .= ' LIMIT 1'; // This is a fetch, to be sure to get only one record
7187 7187
 
7188 7188
 		$res = $this->db->query($sql);
7189 7189
 		if ($res)
@@ -7220,14 +7220,14 @@  discard block
 block discarded – undo
7220 7220
 
7221 7221
 		$error = 0;
7222 7222
 
7223
-		$now=dol_now();
7223
+		$now = dol_now();
7224 7224
 
7225 7225
 		$fieldvalues = $this->setSaveQuery();
7226
-		if (array_key_exists('date_modification', $fieldvalues) && empty($fieldvalues['date_modification'])) $fieldvalues['date_modification']=$this->db->idate($now);
7227
-		if (array_key_exists('fk_user_modif', $fieldvalues) && ! ($fieldvalues['fk_user_modif'] > 0)) $fieldvalues['fk_user_modif']=$user->id;
7228
-		unset($fieldvalues['rowid']);	// The field 'rowid' is reserved field name for autoincrement field so we don't need it into update.
7226
+		if (array_key_exists('date_modification', $fieldvalues) && empty($fieldvalues['date_modification'])) $fieldvalues['date_modification'] = $this->db->idate($now);
7227
+		if (array_key_exists('fk_user_modif', $fieldvalues) && !($fieldvalues['fk_user_modif'] > 0)) $fieldvalues['fk_user_modif'] = $user->id;
7228
+		unset($fieldvalues['rowid']); // The field 'rowid' is reserved field name for autoincrement field so we don't need it into update.
7229 7229
 
7230
-		$keys=array();
7230
+		$keys = array();
7231 7231
 		$values = array();
7232 7232
 		foreach ($fieldvalues as $k => $v) {
7233 7233
 			$keys[$k] = $k;
@@ -7237,10 +7237,10 @@  discard block
 block discarded – undo
7237 7237
 		}
7238 7238
 
7239 7239
 		// Clean and check mandatory
7240
-		foreach($keys as $key)
7240
+		foreach ($keys as $key)
7241 7241
 		{
7242
-			if (preg_match('/^integer:/i', $this->fields[$key]['type']) && $values[$key] == '-1') $values[$key]='';		// This is an implicit foreign key field
7243
-			if (! empty($this->fields[$key]['foreignkey']) && $values[$key] == '-1') $values[$key]='';					// This is an explicit foreign key field
7242
+			if (preg_match('/^integer:/i', $this->fields[$key]['type']) && $values[$key] == '-1') $values[$key] = ''; // This is an implicit foreign key field
7243
+			if (!empty($this->fields[$key]['foreignkey']) && $values[$key] == '-1') $values[$key] = ''; // This is an explicit foreign key field
7244 7244
 
7245 7245
 			//var_dump($key.'-'.$values[$key].'-'.($this->fields[$key]['notnull'] == 1));
7246 7246
 			/*
@@ -7251,13 +7251,13 @@  discard block
 block discarded – undo
7251 7251
 			}*/
7252 7252
 		}
7253 7253
 
7254
-		$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element.' SET '.implode( ',', $tmp ).' WHERE rowid='.$this->id ;
7254
+		$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element.' SET '.implode(',', $tmp).' WHERE rowid='.$this->id;
7255 7255
 
7256 7256
 		$this->db->begin();
7257
-		if (! $error)
7257
+		if (!$error)
7258 7258
 		{
7259 7259
 			$res = $this->db->query($sql);
7260
-			if ($res===false)
7260
+			if ($res === false)
7261 7261
 			{
7262 7262
 				$error++;
7263 7263
 				$this->errors[] = $this->db->lasterror();
@@ -7265,9 +7265,9 @@  discard block
 block discarded – undo
7265 7265
 		}
7266 7266
 
7267 7267
 		// Update extrafield
7268
-		if (! $error && empty($conf->global->MAIN_EXTRAFIELDS_DISABLED) && is_array($this->array_options) && count($this->array_options)>0)
7268
+		if (!$error && empty($conf->global->MAIN_EXTRAFIELDS_DISABLED) && is_array($this->array_options) && count($this->array_options) > 0)
7269 7269
 		{
7270
-			$result=$this->insertExtraFields();
7270
+			$result = $this->insertExtraFields();
7271 7271
 			if ($result < 0)
7272 7272
 			{
7273 7273
 				$error++;
@@ -7275,10 +7275,10 @@  discard block
 block discarded – undo
7275 7275
 		}
7276 7276
 
7277 7277
 		// Triggers
7278
-		if (! $error && ! $notrigger)
7278
+		if (!$error && !$notrigger)
7279 7279
 		{
7280 7280
 			// Call triggers
7281
-			$result=$this->call_trigger(strtoupper(get_class($this)).'_MODIFY',$user);
7281
+			$result = $this->call_trigger(strtoupper(get_class($this)).'_MODIFY', $user);
7282 7282
 			if ($result < 0) { $error++; } //Do also here what you must do to rollback action if trigger fail
7283 7283
 			// End call triggers
7284 7284
 		}
@@ -7301,68 +7301,68 @@  discard block
 block discarded – undo
7301 7301
 	 * @param	int		$forcechilddeletion		0=no, 1=Force deletion of children
7302 7302
 	 * @return 	int             				<=0 if KO, >0 if OK
7303 7303
 	 */
7304
-	public function deleteCommon(User $user, $notrigger=false, $forcechilddeletion=0)
7304
+	public function deleteCommon(User $user, $notrigger = false, $forcechilddeletion = 0)
7305 7305
 	{
7306
-		$error=0;
7306
+		$error = 0;
7307 7307
 
7308 7308
 		$this->db->begin();
7309 7309
 
7310 7310
 		if ($forcechilddeletion)
7311 7311
 		{
7312
-			foreach($this->childtables as $table)
7312
+			foreach ($this->childtables as $table)
7313 7313
 			{
7314 7314
 				$sql = 'DELETE FROM '.MAIN_DB_PREFIX.$table.' WHERE '.$this->fk_element.' = '.$this->id;
7315 7315
 				$resql = $this->db->query($sql);
7316
-				if (! $resql)
7316
+				if (!$resql)
7317 7317
 				{
7318
-					$this->error=$this->db->lasterror();
7319
-					$this->errors[]=$this->error;
7318
+					$this->error = $this->db->lasterror();
7319
+					$this->errors[] = $this->error;
7320 7320
 					$this->db->rollback();
7321 7321
 					return -1;
7322 7322
 				}
7323 7323
 			}
7324 7324
 		}
7325
-		elseif (! empty($this->fk_element) && ! empty($this->childtables))	// If object has childs linked with a foreign key field, we check all child tables.
7325
+		elseif (!empty($this->fk_element) && !empty($this->childtables))	// If object has childs linked with a foreign key field, we check all child tables.
7326 7326
 		{
7327 7327
 			$objectisused = $this->isObjectUsed($this->id);
7328
-			if (! empty($objectisused))
7328
+			if (!empty($objectisused))
7329 7329
 			{
7330 7330
 				dol_syslog(get_class($this)."::deleteCommon Can't delete record as it has some child", LOG_WARNING);
7331
-				$this->error='ErrorRecordHasChildren';
7332
-				$this->errors[]=$this->error;
7331
+				$this->error = 'ErrorRecordHasChildren';
7332
+				$this->errors[] = $this->error;
7333 7333
 				$this->db->rollback();
7334 7334
 				return 0;
7335 7335
 			}
7336 7336
 		}
7337 7337
 
7338
-		if (! $error) {
7339
-			if (! $notrigger) {
7338
+		if (!$error) {
7339
+			if (!$notrigger) {
7340 7340
 				// Call triggers
7341
-				$result=$this->call_trigger(strtoupper(get_class($this)).'_DELETE', $user);
7341
+				$result = $this->call_trigger(strtoupper(get_class($this)).'_DELETE', $user);
7342 7342
 				if ($result < 0) { $error++; } // Do also here what you must do to rollback action if trigger fail
7343 7343
 				// End call triggers
7344 7344
 			}
7345 7345
 		}
7346 7346
 
7347
-		if (! $error && ! empty($this->isextrafieldmanaged))
7347
+		if (!$error && !empty($this->isextrafieldmanaged))
7348 7348
 		{
7349
-			$sql = "DELETE FROM " . MAIN_DB_PREFIX . $this->table_element."_extrafields";
7350
-			$sql.= " WHERE fk_object=" . $this->id;
7349
+			$sql = "DELETE FROM ".MAIN_DB_PREFIX.$this->table_element."_extrafields";
7350
+			$sql .= " WHERE fk_object=".$this->id;
7351 7351
 
7352 7352
 			$resql = $this->db->query($sql);
7353
-			if (! $resql)
7353
+			if (!$resql)
7354 7354
 			{
7355 7355
 				$this->errors[] = $this->db->lasterror();
7356 7356
 				$error++;
7357 7357
 			}
7358 7358
 		}
7359 7359
 
7360
-		if (! $error)
7360
+		if (!$error)
7361 7361
 		{
7362 7362
 			$sql = 'DELETE FROM '.MAIN_DB_PREFIX.$this->table_element.' WHERE rowid='.$this->id;
7363 7363
 
7364 7364
 			$res = $this->db->query($sql);
7365
-			if($res===false) {
7365
+			if ($res === false) {
7366 7366
 				$error++;
7367 7367
 				$this->errors[] = $this->db->lasterror();
7368 7368
 			}
@@ -7403,9 +7403,9 @@  discard block
 block discarded – undo
7403 7403
 		require_once DOL_DOCUMENT_ROOT.'/core/class/comment.class.php';
7404 7404
 
7405 7405
 		$comment = new Comment($this->db);
7406
-		$result=$comment->fetchAllFor($this->element, $this->id);
7407
-		if ($result<0) {
7408
-			$this->errors=array_merge($this->errors, $comment->errors);
7406
+		$result = $comment->fetchAllFor($this->element, $this->id);
7407
+		if ($result < 0) {
7408
+			$this->errors = array_merge($this->errors, $comment->errors);
7409 7409
 			return -1;
7410 7410
 		} else {
7411 7411
 			$this->comments = $comment->comments;
Please login to merge, or discard this patch.
Braces   +1328 added lines, -795 removed lines patch added patch discarded remove patch
@@ -426,23 +426,31 @@  discard block
 block discarded – undo
426 426
 		$sql.= " FROM ".MAIN_DB_PREFIX.$element;
427 427
 		$sql.= " WHERE entity IN (".getEntity($element).")" ;
428 428
 
429
-		if ($id > 0) $sql.= " AND rowid = ".$db->escape($id);
430
-		else if ($ref) $sql.= " AND ref = '".$db->escape($ref)."'";
431
-		else if ($ref_ext) $sql.= " AND ref_ext = '".$db->escape($ref_ext)."'";
432
-		else {
429
+		if ($id > 0) {
430
+		    $sql.= " AND rowid = ".$db->escape($id);
431
+		} else if ($ref) {
432
+		    $sql.= " AND ref = '".$db->escape($ref)."'";
433
+		} else if ($ref_ext) {
434
+		    $sql.= " AND ref_ext = '".$db->escape($ref_ext)."'";
435
+		} else {
433 436
 			$error='ErrorWrongParameters';
434 437
 			dol_print_error(get_class()."::isExistingObject ".$error, LOG_ERR);
435 438
 			return -1;
436 439
 		}
437
-		if ($ref || $ref_ext) $sql.= " AND entity = ".$conf->entity;
440
+		if ($ref || $ref_ext) {
441
+		    $sql.= " AND entity = ".$conf->entity;
442
+		}
438 443
 
439 444
 		dol_syslog(get_class()."::isExistingObject", LOG_DEBUG);
440 445
 		$resql = $db->query($sql);
441 446
 		if ($resql)
442 447
 		{
443 448
 			$num=$db->num_rows($resql);
444
-			if ($num > 0) return 1;
445
-			else return 0;
449
+			if ($num > 0) {
450
+			    return 1;
451
+			} else {
452
+			    return 0;
453
+			}
446 454
 		}
447 455
 		return -1;
448 456
 	}
@@ -471,13 +479,18 @@  discard block
 block discarded – undo
471 479
 		//print "lastname=".$this->lastname." name=".$this->name." nom=".$this->nom."<br>\n";
472 480
 		$lastname=$this->lastname;
473 481
 		$firstname=$this->firstname;
474
-		if (empty($lastname))  $lastname=(isset($this->lastname)?$this->lastname:(isset($this->name)?$this->name:(isset($this->nom)?$this->nom:(isset($this->societe)?$this->societe:(isset($this->company)?$this->company:'')))));
482
+		if (empty($lastname)) {
483
+		    $lastname=(isset($this->lastname)?$this->lastname:(isset($this->name)?$this->name:(isset($this->nom)?$this->nom:(isset($this->societe)?$this->societe:(isset($this->company)?$this->company:'')))));
484
+		}
475 485
 
476 486
 		$ret='';
477 487
 		if ($option && $this->civility_id)
478 488
 		{
479
-			if ($langs->transnoentitiesnoconv("Civility".$this->civility_id)!="Civility".$this->civility_id) $ret.=$langs->transnoentitiesnoconv("Civility".$this->civility_id).' ';
480
-			else $ret.=$this->civility_id.' ';
489
+			if ($langs->transnoentitiesnoconv("Civility".$this->civility_id)!="Civility".$this->civility_id) {
490
+			    $ret.=$langs->transnoentitiesnoconv("Civility".$this->civility_id).' ';
491
+			} else {
492
+			    $ret.=$this->civility_id.' ';
493
+			}
481 494
 		}
482 495
 
483 496
 		$ret.=dolGetFirstLastname($firstname, $lastname, $nameorder);
@@ -570,14 +583,15 @@  discard block
 block discarded – undo
570 583
 		{
571 584
             if (!empty($conf->global->MAIN_SHOW_REGION_IN_STATE_SELECT) && $conf->global->MAIN_SHOW_REGION_IN_STATE_SELECT == 1 && $this->region) {
572 585
                 $out.=($outdone?' - ':'').$this->region.' - '.$this->state;
573
-            }
574
-            else {
586
+            } else {
575 587
                 $out.=($outdone?' - ':'').$this->state;
576 588
             }
577 589
 			$outdone++;
578 590
 		}
579 591
 
580
-		if (! empty($this->phone) || ! empty($this->phone_pro) || ! empty($this->phone_mobile) || ! empty($this->phone_perso) || ! empty($this->fax) || ! empty($this->office_phone) || ! empty($this->user_mobile) || ! empty($this->office_fax)) $out.=($outdone?'<br>':'');
592
+		if (! empty($this->phone) || ! empty($this->phone_pro) || ! empty($this->phone_mobile) || ! empty($this->phone_perso) || ! empty($this->fax) || ! empty($this->office_phone) || ! empty($this->user_mobile) || ! empty($this->office_fax)) {
593
+		    $out.=($outdone?'<br>':'');
594
+		}
581 595
 		if (! empty($this->phone) && empty($this->phone_pro)) {		// For objects that store pro phone into ->phone
582 596
 			$out.=dol_print_phone($this->phone,$this->country_code,$contactid,$thirdpartyid,'AC_TEL','&nbsp;','phone',$langs->trans("PhonePro")); $outdone++;
583 597
 		}
@@ -618,13 +632,21 @@  discard block
 block discarded – undo
618 632
 		$out.='<div style="clear: both;">';
619 633
 		if (! empty($conf->socialnetworks->enabled))
620 634
 		{
621
-			if ($this->skype) $out.=dol_print_socialnetworks($this->skype,$this->id,$object->id,'skype');
635
+			if ($this->skype) {
636
+			    $out.=dol_print_socialnetworks($this->skype,$this->id,$object->id,'skype');
637
+			}
622 638
 			$outdone++;
623
-			if ($this->jabberid) $out.=dol_print_socialnetworks($this->jabberid,$this->id,$object->id,'jabber');
639
+			if ($this->jabberid) {
640
+			    $out.=dol_print_socialnetworks($this->jabberid,$this->id,$object->id,'jabber');
641
+			}
624 642
 			$outdone++;
625
-			if ($this->twitter) $out.=dol_print_socialnetworks($this->twitter,$this->id,$object->id,'twitter');
643
+			if ($this->twitter) {
644
+			    $out.=dol_print_socialnetworks($this->twitter,$this->id,$object->id,'twitter');
645
+			}
626 646
 			$outdone++;
627
-			if ($this->facebook) $out.=dol_print_socialnetworks($this->facebook,$this->id,$object->id,'facebook');
647
+			if ($this->facebook) {
648
+			    $out.=dol_print_socialnetworks($this->facebook,$this->id,$object->id,'facebook');
649
+			}
628 650
 			$outdone++;
629 651
 		}
630 652
 		$out.='</div>';
@@ -684,10 +706,10 @@  discard block
 block discarded – undo
684 706
 					$this->errors = $ecmfile->errors;
685 707
 				}
686 708
 				*/
709
+			} else {
710
+			    return '';
687 711
 			}
688
-			else return '';
689
-		}
690
-		elseif (empty($ecmfile->share))
712
+		} elseif (empty($ecmfile->share))
691 713
 		{
692 714
 			// Add entry into index
693 715
 			if ($initsharekey)
@@ -695,8 +717,9 @@  discard block
 block discarded – undo
695 717
 				require_once DOL_DOCUMENT_ROOT.'/core/lib/security2.lib.php';
696 718
 				$ecmfile->share = getRandomPassword(true);
697 719
 				$ecmfile->update($user);
720
+			} else {
721
+			    return '';
698 722
 			}
699
-			else return '';
700 723
 		}
701 724
 
702 725
 		// Define $urlwithroot
@@ -710,14 +733,18 @@  discard block
 block discarded – undo
710 733
 		//if (! empty($modulepart)) $paramlink.=($paramlink?'&':'').'modulepart='.$modulepart;		// For sharing with hash (so public files), modulepart is not required.
711 734
 		//if (! empty($ecmfile->entity)) $paramlink.='&entity='.$ecmfile->entity; 					// For sharing with hash (so public files), entity is not required.
712 735
 		//$paramlink.=($paramlink?'&':'').'file='.urlencode($filepath);								// No need of name of file for public link, we will use the hash
713
-		if (! empty($ecmfile->share)) $paramlink.=($paramlink?'&':'').'hashp='.$ecmfile->share;			// Hash for public share
714
-		if ($forcedownload) $paramlink.=($paramlink?'&':'').'attachment=1';
736
+		if (! empty($ecmfile->share)) {
737
+		    $paramlink.=($paramlink?'&':'').'hashp='.$ecmfile->share;
738
+		}
739
+		// Hash for public share
740
+		if ($forcedownload) {
741
+		    $paramlink.=($paramlink?'&':'').'attachment=1';
742
+		}
715 743
 
716 744
 		if ($relativelink)
717 745
 		{
718 746
 			$linktoreturn='document.php'.($paramlink?'?'.$paramlink:'');
719
-		}
720
-		else
747
+		} else
721 748
 		{
722 749
 			$linktoreturn=$urlwithroot.'/document.php'.($paramlink?'?'.$paramlink:'');
723 750
 		}
@@ -765,8 +792,7 @@  discard block
 block discarded – undo
765 792
 		if (is_numeric($type_contact))
766 793
 		{
767 794
 			$id_type_contact=$type_contact;
768
-		}
769
-		else
795
+		} else
770 796
 		{
771 797
 			// We look for id type_contact
772 798
 			$sql = "SELECT tc.rowid";
@@ -779,7 +805,9 @@  discard block
 block discarded – undo
779 805
 			if ($resql)
780 806
 			{
781 807
 				$obj = $this->db->fetch_object($resql);
782
-				if ($obj) $id_type_contact=$obj->rowid;
808
+				if ($obj) {
809
+				    $id_type_contact=$obj->rowid;
810
+				}
783 811
 			}
784 812
 		}
785 813
 
@@ -831,8 +859,7 @@  discard block
 block discarded – undo
831 859
 
832 860
 				$this->db->commit();
833 861
 				return 1;
834
-			}
835
-			else
862
+			} else
836 863
 			{
837 864
 				if ($this->db->errno() == 'DB_ERROR_RECORD_ALREADY_EXISTS')
838 865
 				{
@@ -840,15 +867,16 @@  discard block
 block discarded – undo
840 867
 					$this->db->rollback();
841 868
 					echo 'err rollback';
842 869
 					return -2;
843
-				}
844
-				else
870
+				} else
845 871
 				{
846 872
 					$this->error=$this->db->error();
847 873
 					$this->db->rollback();
848 874
 					return -1;
849 875
 				}
850 876
 			}
851
-		} else return 0;
877
+		} else {
878
+		    return 0;
879
+		}
852 880
 	}
853 881
 
854 882
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
@@ -890,15 +918,18 @@  discard block
 block discarded – undo
890 918
 		// Insert into database
891 919
 		$sql = "UPDATE ".MAIN_DB_PREFIX."element_contact set";
892 920
 		$sql.= " statut = ".$statut;
893
-		if ($type_contact_id) $sql.= ", fk_c_type_contact = '".$type_contact_id ."'";
894
-		if ($fk_socpeople) $sql.= ", fk_socpeople = '".$fk_socpeople ."'";
921
+		if ($type_contact_id) {
922
+		    $sql.= ", fk_c_type_contact = '".$type_contact_id ."'";
923
+		}
924
+		if ($fk_socpeople) {
925
+		    $sql.= ", fk_socpeople = '".$fk_socpeople ."'";
926
+		}
895 927
 		$sql.= " where rowid = ".$rowid;
896 928
 		$resql=$this->db->query($sql);
897 929
 		if ($resql)
898 930
 		{
899 931
 			return 0;
900
-		}
901
-		else
932
+		} else
902 933
 		{
903 934
 			$this->error=$this->db->lasterror();
904 935
 			return -1;
@@ -935,8 +966,7 @@  discard block
 block discarded – undo
935 966
 
936 967
 			$this->db->commit();
937 968
 			return 1;
938
-		}
939
-		else
969
+		} else
940 970
 		{
941 971
 			$this->error=$this->db->lasterror();
942 972
 			$this->db->rollback();
@@ -966,15 +996,15 @@  discard block
 block discarded – undo
966 996
 
967 997
 		$sql = "DELETE FROM ".MAIN_DB_PREFIX."element_contact";
968 998
 		$sql.= " WHERE element_id = ".$this->id;
969
-		if ($listId)
970
-			$sql.= " AND fk_c_type_contact IN (".$listId.")";
999
+		if ($listId) {
1000
+					$sql.= " AND fk_c_type_contact IN (".$listId.")";
1001
+		}
971 1002
 
972 1003
 		dol_syslog(get_class($this)."::delete_linked_contact", LOG_DEBUG);
973 1004
 		if ($this->db->query($sql))
974 1005
 		{
975 1006
 			return 1;
976
-		}
977
-		else
1007
+		} else
978 1008
 		{
979 1009
 			$this->error=$this->db->lasterror();
980 1010
 			return -1;
@@ -999,22 +1029,38 @@  discard block
 block discarded – undo
999 1029
 		$tab=array();
1000 1030
 
1001 1031
 		$sql = "SELECT ec.rowid, ec.statut as statuslink, ec.fk_socpeople as id, ec.fk_c_type_contact";    // This field contains id of llx_socpeople or id of llx_user
1002
-		if ($source == 'internal') $sql.=", '-1' as socid, t.statut as statuscontact, t.login, t.photo";
1003
-		if ($source == 'external' || $source == 'thirdparty') $sql.=", t.fk_soc as socid, t.statut as statuscontact";
1032
+		if ($source == 'internal') {
1033
+		    $sql.=", '-1' as socid, t.statut as statuscontact, t.login, t.photo";
1034
+		}
1035
+		if ($source == 'external' || $source == 'thirdparty') {
1036
+		    $sql.=", t.fk_soc as socid, t.statut as statuscontact";
1037
+		}
1004 1038
 		$sql.= ", t.civility as civility, t.lastname as lastname, t.firstname, t.email";
1005 1039
 		$sql.= ", tc.source, tc.element, tc.code, tc.libelle";
1006 1040
 		$sql.= " FROM ".MAIN_DB_PREFIX."c_type_contact tc";
1007 1041
 		$sql.= ", ".MAIN_DB_PREFIX."element_contact ec";
1008
-		if ($source == 'internal') $sql.=" LEFT JOIN ".MAIN_DB_PREFIX."user t on ec.fk_socpeople = t.rowid";
1009
-		if ($source == 'external'|| $source == 'thirdparty') $sql.=" LEFT JOIN ".MAIN_DB_PREFIX."socpeople t on ec.fk_socpeople = t.rowid";
1042
+		if ($source == 'internal') {
1043
+		    $sql.=" LEFT JOIN ".MAIN_DB_PREFIX."user t on ec.fk_socpeople = t.rowid";
1044
+		}
1045
+		if ($source == 'external'|| $source == 'thirdparty') {
1046
+		    $sql.=" LEFT JOIN ".MAIN_DB_PREFIX."socpeople t on ec.fk_socpeople = t.rowid";
1047
+		}
1010 1048
 		$sql.= " WHERE ec.element_id =".$this->id;
1011 1049
 		$sql.= " AND ec.fk_c_type_contact=tc.rowid";
1012 1050
 		$sql.= " AND tc.element='".$this->db->escape($this->element)."'";
1013
-		if ($code) $sql.= " AND tc.code = '".$this->db->escape($code)."'";
1014
-		if ($source == 'internal') $sql.= " AND tc.source = 'internal'";
1015
-		if ($source == 'external' || $source == 'thirdparty') $sql.= " AND tc.source = 'external'";
1051
+		if ($code) {
1052
+		    $sql.= " AND tc.code = '".$this->db->escape($code)."'";
1053
+		}
1054
+		if ($source == 'internal') {
1055
+		    $sql.= " AND tc.source = 'internal'";
1056
+		}
1057
+		if ($source == 'external' || $source == 'thirdparty') {
1058
+		    $sql.= " AND tc.source = 'external'";
1059
+		}
1016 1060
 		$sql.= " AND tc.active=1";
1017
-		if ($statut >= 0) $sql.= " AND ec.statut = '".$statut."'";
1061
+		if ($statut >= 0) {
1062
+		    $sql.= " AND ec.statut = '".$statut."'";
1063
+		}
1018 1064
 		$sql.=" ORDER BY t.lastname ASC";
1019 1065
 
1020 1066
 		dol_syslog(get_class($this)."::liste_contact", LOG_DEBUG);
@@ -1035,8 +1081,7 @@  discard block
 block discarded – undo
1035 1081
 								   'nom'=>$obj->lastname,      // For backward compatibility
1036 1082
 								   'civility'=>$obj->civility, 'lastname'=>$obj->lastname, 'firstname'=>$obj->firstname, 'email'=>$obj->email, 'login'=>$obj->login, 'photo'=>$obj->photo, 'statuscontact'=>$obj->statuscontact,
1037 1083
 								   'rowid'=>$obj->rowid, 'code'=>$obj->code, 'libelle'=>$libelle_type, 'status'=>$obj->statuslink, 'fk_c_type_contact'=>$obj->fk_c_type_contact);
1038
-				}
1039
-				else
1084
+				} else
1040 1085
 				{
1041 1086
 					$tab[$i]=$obj->id;
1042 1087
 				}
@@ -1045,8 +1090,7 @@  discard block
 block discarded – undo
1045 1090
 			}
1046 1091
 
1047 1092
 			return $tab;
1048
-		}
1049
-		else
1093
+		} else
1050 1094
 		{
1051 1095
 			$this->error=$this->db->lasterror();
1052 1096
 			dol_print_error($this->db);
@@ -1081,8 +1125,7 @@  discard block
 block discarded – undo
1081 1125
 			$result = $this->update_contact($rowid, $newstatut);
1082 1126
 			$this->db->free($resql);
1083 1127
 			return $result;
1084
-		}
1085
-		else
1128
+		} else
1086 1129
 		{
1087 1130
 			$this->error=$this->db->error();
1088 1131
 			dol_print_error($this->db);
@@ -1106,16 +1149,27 @@  discard block
 block discarded – undo
1106 1149
         // phpcs:enable
1107 1150
 		global $langs;
1108 1151
 
1109
-		if (empty($order)) $order='position';
1110
-		if ($order == 'position') $order.=',code';
1152
+		if (empty($order)) {
1153
+		    $order='position';
1154
+		}
1155
+		if ($order == 'position') {
1156
+		    $order.=',code';
1157
+		}
1111 1158
 
1112 1159
 		$tab = array();
1113 1160
 		$sql = "SELECT DISTINCT tc.rowid, tc.code, tc.libelle, tc.position";
1114 1161
 		$sql.= " FROM ".MAIN_DB_PREFIX."c_type_contact as tc";
1115 1162
 		$sql.= " WHERE tc.element='".$this->db->escape($this->element)."'";
1116
-		if ($activeonly == 1) $sql.= " AND tc.active=1"; // only the active types
1117
-		if (! empty($source) && $source != 'all') $sql.= " AND tc.source='".$this->db->escape($source)."'";
1118
-		if (! empty($code)) $sql.= " AND tc.code='".$this->db->escape($code)."'";
1163
+		if ($activeonly == 1) {
1164
+		    $sql.= " AND tc.active=1";
1165
+		}
1166
+		// only the active types
1167
+		if (! empty($source) && $source != 'all') {
1168
+		    $sql.= " AND tc.source='".$this->db->escape($source)."'";
1169
+		}
1170
+		if (! empty($code)) {
1171
+		    $sql.= " AND tc.code='".$this->db->escape($code)."'";
1172
+		}
1119 1173
 		$sql.= $this->db->order($order,'ASC');
1120 1174
 
1121 1175
 		//print "sql=".$sql;
@@ -1130,13 +1184,15 @@  discard block
 block discarded – undo
1130 1184
 
1131 1185
 				$transkey="TypeContact_".$this->element."_".$source."_".$obj->code;
1132 1186
 				$libelle_type=($langs->trans($transkey)!=$transkey ? $langs->trans($transkey) : $obj->libelle);
1133
-				if (empty($option)) $tab[$obj->rowid]=$libelle_type;
1134
-				else $tab[$obj->code]=$libelle_type;
1187
+				if (empty($option)) {
1188
+				    $tab[$obj->rowid]=$libelle_type;
1189
+				} else {
1190
+				    $tab[$obj->code]=$libelle_type;
1191
+				}
1135 1192
 				$i++;
1136 1193
 			}
1137 1194
 			return $tab;
1138
-		}
1139
-		else
1195
+		} else
1140 1196
 		{
1141 1197
 			$this->error=$this->db->lasterror();
1142 1198
 			//dol_print_error($this->db);
@@ -1175,19 +1231,29 @@  discard block
 block discarded – undo
1175 1231
 
1176 1232
 		$sql = "SELECT ec.fk_socpeople";
1177 1233
 		$sql.= " FROM ".MAIN_DB_PREFIX."element_contact as ec,";
1178
-		if ($source == 'internal') $sql.= " ".MAIN_DB_PREFIX."user as c,";
1179
-		if ($source == 'external') $sql.= " ".MAIN_DB_PREFIX."socpeople as c,";
1234
+		if ($source == 'internal') {
1235
+		    $sql.= " ".MAIN_DB_PREFIX."user as c,";
1236
+		}
1237
+		if ($source == 'external') {
1238
+		    $sql.= " ".MAIN_DB_PREFIX."socpeople as c,";
1239
+		}
1180 1240
 		$sql.= " ".MAIN_DB_PREFIX."c_type_contact as tc";
1181 1241
 		$sql.= " WHERE ec.element_id = ".$id;
1182 1242
 		$sql.= " AND ec.fk_socpeople = c.rowid";
1183
-		if ($source == 'internal') $sql.= " AND c.entity IN (".getEntity('user').")";
1184
-		if ($source == 'external') $sql.= " AND c.entity IN (".getEntity('societe').")";
1243
+		if ($source == 'internal') {
1244
+		    $sql.= " AND c.entity IN (".getEntity('user').")";
1245
+		}
1246
+		if ($source == 'external') {
1247
+		    $sql.= " AND c.entity IN (".getEntity('societe').")";
1248
+		}
1185 1249
 		$sql.= " AND ec.fk_c_type_contact = tc.rowid";
1186 1250
 		$sql.= " AND tc.element = '".$element."'";
1187 1251
 		$sql.= " AND tc.source = '".$source."'";
1188 1252
 		$sql.= " AND tc.code = '".$code."'";
1189 1253
 		$sql.= " AND tc.active = 1";
1190
-		if ($status) $sql.= " AND ec.statut = ".$status;
1254
+		if ($status) {
1255
+		    $sql.= " AND ec.statut = ".$status;
1256
+		}
1191 1257
 
1192 1258
 		dol_syslog(get_class($this)."::getIdContact", LOG_DEBUG);
1193 1259
 		$resql=$this->db->query($sql);
@@ -1198,8 +1264,7 @@  discard block
 block discarded – undo
1198 1264
 				$result[$i]=$obj->fk_socpeople;
1199 1265
 				$i++;
1200 1266
 			}
1201
-		}
1202
-		else
1267
+		} else
1203 1268
 		{
1204 1269
 			$this->error=$this->db->error();
1205 1270
 			return null;
@@ -1218,9 +1283,13 @@  discard block
 block discarded – undo
1218 1283
 	function fetch_contact($contactid=null)
1219 1284
 	{
1220 1285
         // phpcs:enable
1221
-		if (empty($contactid)) $contactid=$this->contactid;
1286
+		if (empty($contactid)) {
1287
+		    $contactid=$this->contactid;
1288
+		}
1222 1289
 
1223
-		if (empty($contactid)) return 0;
1290
+		if (empty($contactid)) {
1291
+		    return 0;
1292
+		}
1224 1293
 
1225 1294
 		require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php';
1226 1295
 		$contact = new Contact($this->db);
@@ -1241,14 +1310,16 @@  discard block
 block discarded – undo
1241 1310
         // phpcs:enable
1242 1311
 		global $conf;
1243 1312
 
1244
-		if (empty($this->socid) && empty($this->fk_soc) && empty($this->fk_thirdparty) && empty($force_thirdparty_id))
1245
-			return 0;
1313
+		if (empty($this->socid) && empty($this->fk_soc) && empty($this->fk_thirdparty) && empty($force_thirdparty_id)) {
1314
+					return 0;
1315
+		}
1246 1316
 
1247 1317
 		require_once DOL_DOCUMENT_ROOT . '/societe/class/societe.class.php';
1248 1318
 
1249 1319
 		$idtofetch = isset($this->socid) ? $this->socid : (isset($this->fk_soc) ? $this->fk_soc : $this->fk_thirdparty);
1250
-		if ($force_thirdparty_id)
1251
-			$idtofetch = $force_thirdparty_id;
1320
+		if ($force_thirdparty_id) {
1321
+					$idtofetch = $force_thirdparty_id;
1322
+		}
1252 1323
 
1253 1324
 		if ($idtofetch) {
1254 1325
 			$thirdparty = new Societe($this->db);
@@ -1261,8 +1332,9 @@  discard block
 block discarded – undo
1261 1332
 			}
1262 1333
 
1263 1334
 			return $result;
1264
-		} else
1265
-			return -1;
1335
+		} else {
1336
+					return -1;
1337
+		}
1266 1338
 	}
1267 1339
 
1268 1340
 
@@ -1308,18 +1380,24 @@  discard block
 block discarded – undo
1308 1380
 		dol_syslog(get_class($this).'::fetch_barcode this->element='.$this->element.' this->barcode_type='.$this->barcode_type);
1309 1381
 
1310 1382
 		$idtype=$this->barcode_type;
1311
-		if (empty($idtype) && $idtype != '0')	// If type of barcode no set, we try to guess. If set to '0' it means we forced to have type remain not defined
1383
+		if (empty($idtype) && $idtype != '0') {
1384
+		    // If type of barcode no set, we try to guess. If set to '0' it means we forced to have type remain not defined
1312 1385
 		{
1313 1386
 			if ($this->element == 'product')      $idtype = $conf->global->PRODUIT_DEFAULT_BARCODE_TYPE;
1314
-			else if ($this->element == 'societe') $idtype = $conf->global->GENBARCODE_BARCODETYPE_THIRDPARTY;
1315
-			else dol_syslog('Call fetch_barcode with barcode_type not defined and cant be guessed', LOG_WARNING);
1387
+		} else if ($this->element == 'societe') {
1388
+			    $idtype = $conf->global->GENBARCODE_BARCODETYPE_THIRDPARTY;
1389
+			} else {
1390
+			    dol_syslog('Call fetch_barcode with barcode_type not defined and cant be guessed', LOG_WARNING);
1391
+			}
1316 1392
 		}
1317 1393
 
1318 1394
 		if ($idtype > 0)
1319 1395
 		{
1320
-			if (empty($this->barcode_type) || empty($this->barcode_type_code) || empty($this->barcode_type_label) || empty($this->barcode_type_coder))    // If data not already loaded
1396
+			if (empty($this->barcode_type) || empty($this->barcode_type_code) || empty($this->barcode_type_label) || empty($this->barcode_type_coder)) {
1397
+			    // If data not already loaded
1321 1398
 			{
1322 1399
 				$sql = "SELECT rowid, code, libelle as label, coder";
1400
+			}
1323 1401
 				$sql.= " FROM ".MAIN_DB_PREFIX."c_barcode_type";
1324 1402
 				$sql.= " WHERE rowid = ".$idtype;
1325 1403
 				dol_syslog(get_class($this).'::fetch_barcode', LOG_DEBUG);
@@ -1332,8 +1410,7 @@  discard block
 block discarded – undo
1332 1410
 					$this->barcode_type_label = $obj->label;
1333 1411
 					$this->barcode_type_coder = $obj->coder;
1334 1412
 					return 1;
1335
-				}
1336
-				else
1413
+				} else
1337 1414
 				{
1338 1415
 					dol_print_error($this->db);
1339 1416
 					return -1;
@@ -1354,8 +1431,13 @@  discard block
 block discarded – undo
1354 1431
         // phpcs:enable
1355 1432
 		include_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
1356 1433
 
1357
-		if (empty($this->fk_project) && ! empty($this->fk_projet)) $this->fk_project = $this->fk_projet;	// For backward compatibility
1358
-		if (empty($this->fk_project)) return 0;
1434
+		if (empty($this->fk_project) && ! empty($this->fk_projet)) {
1435
+		    $this->fk_project = $this->fk_projet;
1436
+		}
1437
+		// For backward compatibility
1438
+		if (empty($this->fk_project)) {
1439
+		    return 0;
1440
+		}
1359 1441
 
1360 1442
 		$project = new Project($this->db);
1361 1443
 		$result = $project->fetch($this->fk_project);
@@ -1376,7 +1458,9 @@  discard block
 block discarded – undo
1376 1458
         // phpcs:enable
1377 1459
 		include_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
1378 1460
 
1379
-		if (empty($this->fk_product)) return 0;
1461
+		if (empty($this->fk_product)) {
1462
+		    return 0;
1463
+		}
1380 1464
 
1381 1465
 		$product = new Product($this->db);
1382 1466
 		$result = $product->fetch($this->fk_product);
@@ -1410,9 +1494,15 @@  discard block
 block discarded – undo
1410 1494
 	function fetch_origin()
1411 1495
 	{
1412 1496
         // phpcs:enable
1413
-		if ($this->origin == 'shipping') $this->origin = 'expedition';
1414
-		if ($this->origin == 'delivery') $this->origin = 'livraison';
1415
-        if ($this->origin == 'order_supplier') $this->origin = 'commandeFournisseur';
1497
+		if ($this->origin == 'shipping') {
1498
+		    $this->origin = 'expedition';
1499
+		}
1500
+		if ($this->origin == 'delivery') {
1501
+		    $this->origin = 'livraison';
1502
+		}
1503
+        if ($this->origin == 'order_supplier') {
1504
+            $this->origin = 'commandeFournisseur';
1505
+        }
1416 1506
 
1417 1507
 		$origin = $this->origin;
1418 1508
 
@@ -1504,29 +1594,48 @@  discard block
 block discarded – undo
1504 1594
 	{
1505 1595
 		global $user,$langs,$conf;
1506 1596
 
1507
-		if (empty($table)) 	  $table=$this->table_element;
1508
-		if (empty($id))    	  $id=$this->id;
1509
-		if (empty($format))   $format='text';
1510
-		if (empty($id_field)) $id_field='rowid';
1597
+		if (empty($table)) {
1598
+		    $table=$this->table_element;
1599
+		}
1600
+		if (empty($id)) {
1601
+		    $id=$this->id;
1602
+		}
1603
+		if (empty($format)) {
1604
+		    $format='text';
1605
+		}
1606
+		if (empty($id_field)) {
1607
+		    $id_field='rowid';
1608
+		}
1511 1609
 
1512 1610
 		$error=0;
1513 1611
 
1514 1612
 		$this->db->begin();
1515 1613
 
1516 1614
 		// Special case
1517
-		if ($table == 'product' && $field == 'note_private') $field='note';
1518
-		if (in_array($table, array('actioncomm', 'adherent', 'advtargetemailing', 'cronjob', 'establishment'))) $fk_user_field = 'fk_user_mod';
1615
+		if ($table == 'product' && $field == 'note_private') {
1616
+		    $field='note';
1617
+		}
1618
+		if (in_array($table, array('actioncomm', 'adherent', 'advtargetemailing', 'cronjob', 'establishment'))) {
1619
+		    $fk_user_field = 'fk_user_mod';
1620
+		}
1519 1621
 
1520 1622
 		$sql = "UPDATE ".MAIN_DB_PREFIX.$table." SET ";
1521 1623
 
1522
-		if ($format == 'text') $sql.= $field." = '".$this->db->escape($value)."'";
1523
-		else if ($format == 'int') $sql.= $field." = ".$this->db->escape($value);
1524
-		else if ($format == 'date') $sql.= $field." = ".($value ? "'".$this->db->idate($value)."'" : "null");
1624
+		if ($format == 'text') {
1625
+		    $sql.= $field." = '".$this->db->escape($value)."'";
1626
+		} else if ($format == 'int') {
1627
+		    $sql.= $field." = ".$this->db->escape($value);
1628
+		} else if ($format == 'date') {
1629
+		    $sql.= $field." = ".($value ? "'".$this->db->idate($value)."'" : "null");
1630
+		}
1525 1631
 
1526 1632
 		if ($fk_user_field)
1527 1633
 		{
1528
-			if (! empty($fuser) && is_object($fuser)) $sql.=", ".$fk_user_field." = ".$fuser->id;
1529
-			elseif (empty($fuser) || $fuser != 'none') $sql.=", ".$fk_user_field." = ".$user->id;
1634
+			if (! empty($fuser) && is_object($fuser)) {
1635
+			    $sql.=", ".$fk_user_field." = ".$fuser->id;
1636
+			} elseif (empty($fuser) || $fuser != 'none') {
1637
+			    $sql.=", ".$fk_user_field." = ".$user->id;
1638
+			}
1530 1639
 		}
1531 1640
 
1532 1641
 		$sql.= " WHERE ".$id_field." = ".$id;
@@ -1541,28 +1650,32 @@  discard block
 block discarded – undo
1541 1650
 				if (empty($this->fields) && method_exists($this, 'fetch'))
1542 1651
 				{
1543 1652
 					$result = $this->fetch($id);
1544
-				}
1545
-				else
1653
+				} else
1546 1654
 				{
1547 1655
 					$result = $this->fetchCommon($id);
1548 1656
 				}
1549
-				if ($result >= 0) $result=$this->call_trigger($trigkey, (! empty($fuser) && is_object($fuser)) ? $fuser : $user);   // This may set this->errors
1550
-				if ($result < 0) $error++;
1657
+				if ($result >= 0) {
1658
+				    $result=$this->call_trigger($trigkey, (! empty($fuser) && is_object($fuser)) ? $fuser : $user);
1659
+				}
1660
+				// This may set this->errors
1661
+				if ($result < 0) {
1662
+				    $error++;
1663
+				}
1551 1664
 			}
1552 1665
 
1553 1666
 			if (! $error)
1554 1667
 			{
1555
-				if (property_exists($this, $field)) $this->$field = $value;
1668
+				if (property_exists($this, $field)) {
1669
+				    $this->$field = $value;
1670
+				}
1556 1671
 				$this->db->commit();
1557 1672
 				return 1;
1558
-			}
1559
-			else
1673
+			} else
1560 1674
 			{
1561 1675
 				$this->db->rollback();
1562 1676
 				return -2;
1563 1677
 			}
1564
-		}
1565
-		else
1678
+		} else
1566 1679
 		{
1567 1680
 			$this->error=$this->db->lasterror();
1568 1681
 			$this->db->rollback();
@@ -1589,36 +1702,66 @@  discard block
 block discarded – undo
1589 1702
 			dol_print_error('',get_class($this)."::load_previous_next_ref was called on objet with property table_element not defined");
1590 1703
 			return -1;
1591 1704
 		}
1592
-		if ($fieldid == 'none') return 1;
1705
+		if ($fieldid == 'none') {
1706
+		    return 1;
1707
+		}
1593 1708
 
1594 1709
 		// Security on socid
1595 1710
 		$socid = 0;
1596
-		if ($user->societe_id > 0) $socid = $user->societe_id;
1711
+		if ($user->societe_id > 0) {
1712
+		    $socid = $user->societe_id;
1713
+		}
1597 1714
 
1598 1715
 		// this->ismultientitymanaged contains
1599 1716
 		// 0=No test on entity, 1=Test with field entity, 2=Test with link by societe
1600 1717
 		$alias = 's';
1601
-		if ($this->element == 'societe') $alias = 'te';
1718
+		if ($this->element == 'societe') {
1719
+		    $alias = 'te';
1720
+		}
1602 1721
 
1603 1722
 		$sql = "SELECT MAX(te.".$fieldid.")";
1604 1723
 		$sql.= " FROM ".(empty($nodbprefix)?MAIN_DB_PREFIX:'').$this->table_element." as te";
1605 1724
 		if ($this->element == 'user' && ! empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE)) {
1606 1725
 			$sql.= ",".MAIN_DB_PREFIX."usergroup_user as ug";
1607 1726
 		}
1608
-		if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 2) $sql.= ", ".MAIN_DB_PREFIX."societe as s";	// If we need to link to societe to limit select to entity
1609
-		else if ($this->restrictiononfksoc == 1 && $this->element != 'societe' && !$user->rights->societe->client->voir && !$socid) $sql.= ", ".MAIN_DB_PREFIX."societe as s";	// If we need to link to societe to limit select to socid
1610
-		else if ($this->restrictiononfksoc == 2 && $this->element != 'societe' && !$user->rights->societe->client->voir && !$socid) $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON te.fk_soc = s.rowid";	// If we need to link to societe to limit select to socid
1611
-		if ($this->restrictiononfksoc && !$user->rights->societe->client->voir && !$socid)  $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."societe_commerciaux as sc ON ".$alias.".rowid = sc.fk_soc";
1727
+		if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 2) {
1728
+		    $sql.= ", ".MAIN_DB_PREFIX."societe as s";
1729
+		}
1730
+		// If we need to link to societe to limit select to entity
1731
+		else if ($this->restrictiononfksoc == 1 && $this->element != 'societe' && !$user->rights->societe->client->voir && !$socid) {
1732
+		    $sql.= ", ".MAIN_DB_PREFIX."societe as s";
1733
+		}
1734
+		// If we need to link to societe to limit select to socid
1735
+		else if ($this->restrictiononfksoc == 2 && $this->element != 'societe' && !$user->rights->societe->client->voir && !$socid) {
1736
+		    $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON te.fk_soc = s.rowid";
1737
+		}
1738
+		// If we need to link to societe to limit select to socid
1739
+		if ($this->restrictiononfksoc && !$user->rights->societe->client->voir && !$socid) {
1740
+		    $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."societe_commerciaux as sc ON ".$alias.".rowid = sc.fk_soc";
1741
+		}
1612 1742
 		$sql.= " WHERE te.".$fieldid." < '".$this->db->escape($this->ref)."'";  // ->ref must always be defined (set to id if field does not exists)
1613
-		if ($this->restrictiononfksoc == 1 && !$user->rights->societe->client->voir && !$socid) $sql.= " AND sc.fk_user = " .$user->id;
1614
-		if ($this->restrictiononfksoc == 2 && !$user->rights->societe->client->voir && !$socid) $sql.= " AND (sc.fk_user = " .$user->id.' OR te.fk_soc IS NULL)';
1743
+		if ($this->restrictiononfksoc == 1 && !$user->rights->societe->client->voir && !$socid) {
1744
+		    $sql.= " AND sc.fk_user = " .$user->id;
1745
+		}
1746
+		if ($this->restrictiononfksoc == 2 && !$user->rights->societe->client->voir && !$socid) {
1747
+		    $sql.= " AND (sc.fk_user = " .$user->id.' OR te.fk_soc IS NULL)';
1748
+		}
1615 1749
 		if (! empty($filter))
1616 1750
 		{
1617
-			if (! preg_match('/^\s*AND/i', $filter)) $sql.=" AND ";   // For backward compatibility
1751
+			if (! preg_match('/^\s*AND/i', $filter)) {
1752
+			    $sql.=" AND ";
1753
+			}
1754
+			// For backward compatibility
1618 1755
 			$sql.=$filter;
1619 1756
 		}
1620
-		if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 2) $sql.= ' AND te.fk_soc = s.rowid';			// If we need to link to societe to limit select to entity
1621
-		else if ($this->restrictiononfksoc == 1 && $this->element != 'societe' && !$user->rights->societe->client->voir && !$socid) $sql.= ' AND te.fk_soc = s.rowid';			// If we need to link to societe to limit select to socid
1757
+		if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 2) {
1758
+		    $sql.= ' AND te.fk_soc = s.rowid';
1759
+		}
1760
+		// If we need to link to societe to limit select to entity
1761
+		else if ($this->restrictiononfksoc == 1 && $this->element != 'societe' && !$user->rights->societe->client->voir && !$socid) {
1762
+		    $sql.= ' AND te.fk_soc = s.rowid';
1763
+		}
1764
+		// If we need to link to societe to limit select to socid
1622 1765
 		if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) {
1623 1766
 			if ($this->element == 'user' && ! empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE)) {
1624 1767
 				if (! empty($user->admin) && empty($user->entity) && $conf->entity == 1) {
@@ -1631,9 +1774,15 @@  discard block
 block discarded – undo
1631 1774
 				$sql.= ' AND te.entity IN ('.getEntity($this->element).')';
1632 1775
 			}
1633 1776
 		}
1634
-		if ($this->restrictiononfksoc == 1 && $socid && $this->element != 'societe') $sql.= ' AND te.fk_soc = ' . $socid;
1635
-		if ($this->restrictiononfksoc == 2 && $socid && $this->element != 'societe') $sql.= ' AND (te.fk_soc = ' . $socid.' OR te.fk_soc IS NULL)';
1636
-		if ($this->restrictiononfksoc && $socid && $this->element == 'societe') $sql.= ' AND te.rowid = ' . $socid;
1777
+		if ($this->restrictiononfksoc == 1 && $socid && $this->element != 'societe') {
1778
+		    $sql.= ' AND te.fk_soc = ' . $socid;
1779
+		}
1780
+		if ($this->restrictiononfksoc == 2 && $socid && $this->element != 'societe') {
1781
+		    $sql.= ' AND (te.fk_soc = ' . $socid.' OR te.fk_soc IS NULL)';
1782
+		}
1783
+		if ($this->restrictiononfksoc && $socid && $this->element == 'societe') {
1784
+		    $sql.= ' AND te.rowid = ' . $socid;
1785
+		}
1637 1786
 		//print 'socid='.$socid.' restrictiononfksoc='.$this->restrictiononfksoc.' ismultientitymanaged = '.$this->ismultientitymanaged.' filter = '.$filter.' -> '.$sql."<br>";
1638 1787
 
1639 1788
 		$result = $this->db->query($sql);
@@ -1651,20 +1800,44 @@  discard block
 block discarded – undo
1651 1800
 		if ($this->element == 'user' && ! empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE)) {
1652 1801
 			$sql.= ",".MAIN_DB_PREFIX."usergroup_user as ug";
1653 1802
 		}
1654
-		if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 2) $sql.= ", ".MAIN_DB_PREFIX."societe as s";	// If we need to link to societe to limit select to entity
1655
-		else if ($this->restrictiononfksoc == 1 && $this->element != 'societe' && !$user->rights->societe->client->voir && !$socid) $sql.= ", ".MAIN_DB_PREFIX."societe as s";	// If we need to link to societe to limit select to socid
1656
-		else if ($this->restrictiononfksoc == 2 && $this->element != 'societe' && !$user->rights->societe->client->voir && !$socid) $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON te.fk_soc = s.rowid";	// If we need to link to societe to limit select to socid
1657
-		if ($this->restrictiononfksoc && !$user->rights->societe->client->voir && !$socid) $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."societe_commerciaux as sc ON ".$alias.".rowid = sc.fk_soc";
1803
+		if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 2) {
1804
+		    $sql.= ", ".MAIN_DB_PREFIX."societe as s";
1805
+		}
1806
+		// If we need to link to societe to limit select to entity
1807
+		else if ($this->restrictiononfksoc == 1 && $this->element != 'societe' && !$user->rights->societe->client->voir && !$socid) {
1808
+		    $sql.= ", ".MAIN_DB_PREFIX."societe as s";
1809
+		}
1810
+		// If we need to link to societe to limit select to socid
1811
+		else if ($this->restrictiononfksoc == 2 && $this->element != 'societe' && !$user->rights->societe->client->voir && !$socid) {
1812
+		    $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON te.fk_soc = s.rowid";
1813
+		}
1814
+		// If we need to link to societe to limit select to socid
1815
+		if ($this->restrictiononfksoc && !$user->rights->societe->client->voir && !$socid) {
1816
+		    $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."societe_commerciaux as sc ON ".$alias.".rowid = sc.fk_soc";
1817
+		}
1658 1818
 		$sql.= " WHERE te.".$fieldid." > '".$this->db->escape($this->ref)."'";  // ->ref must always be defined (set to id if field does not exists)
1659
-		if ($this->restrictiononfksoc == 1 && !$user->rights->societe->client->voir && !$socid) $sql.= " AND sc.fk_user = " .$user->id;
1660
-		if ($this->restrictiononfksoc == 2 && !$user->rights->societe->client->voir && !$socid) $sql.= " AND (sc.fk_user = " .$user->id.' OR te.fk_soc IS NULL)';
1819
+		if ($this->restrictiononfksoc == 1 && !$user->rights->societe->client->voir && !$socid) {
1820
+		    $sql.= " AND sc.fk_user = " .$user->id;
1821
+		}
1822
+		if ($this->restrictiononfksoc == 2 && !$user->rights->societe->client->voir && !$socid) {
1823
+		    $sql.= " AND (sc.fk_user = " .$user->id.' OR te.fk_soc IS NULL)';
1824
+		}
1661 1825
 		if (! empty($filter))
1662 1826
 		{
1663
-			if (! preg_match('/^\s*AND/i', $filter)) $sql.=" AND ";   // For backward compatibility
1827
+			if (! preg_match('/^\s*AND/i', $filter)) {
1828
+			    $sql.=" AND ";
1829
+			}
1830
+			// For backward compatibility
1664 1831
 			$sql.=$filter;
1665 1832
 		}
1666
-		if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 2) $sql.= ' AND te.fk_soc = s.rowid';			// If we need to link to societe to limit select to entity
1667
-		else if ($this->restrictiononfksoc == 1 && $this->element != 'societe' && !$user->rights->societe->client->voir && !$socid) $sql.= ' AND te.fk_soc = s.rowid';			// If we need to link to societe to limit select to socid
1833
+		if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 2) {
1834
+		    $sql.= ' AND te.fk_soc = s.rowid';
1835
+		}
1836
+		// If we need to link to societe to limit select to entity
1837
+		else if ($this->restrictiononfksoc == 1 && $this->element != 'societe' && !$user->rights->societe->client->voir && !$socid) {
1838
+		    $sql.= ' AND te.fk_soc = s.rowid';
1839
+		}
1840
+		// If we need to link to societe to limit select to socid
1668 1841
 		if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) {
1669 1842
 			if ($this->element == 'user' && ! empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE)) {
1670 1843
 				if (! empty($user->admin) && empty($user->entity) && $conf->entity == 1) {
@@ -1677,9 +1850,15 @@  discard block
 block discarded – undo
1677 1850
 				$sql.= ' AND te.entity IN ('.getEntity($this->element).')';
1678 1851
 			}
1679 1852
 		}
1680
-		if ($this->restrictiononfksoc == 1 && $socid && $this->element != 'societe') $sql.= ' AND te.fk_soc = ' . $socid;
1681
-		if ($this->restrictiononfksoc == 2 && $socid && $this->element != 'societe') $sql.= ' AND (te.fk_soc = ' . $socid.' OR te.fk_soc IS NULL)';
1682
-		if ($this->restrictiononfksoc && $socid && $this->element == 'societe') $sql.= ' AND te.rowid = ' . $socid;
1853
+		if ($this->restrictiononfksoc == 1 && $socid && $this->element != 'societe') {
1854
+		    $sql.= ' AND te.fk_soc = ' . $socid;
1855
+		}
1856
+		if ($this->restrictiononfksoc == 2 && $socid && $this->element != 'societe') {
1857
+		    $sql.= ' AND (te.fk_soc = ' . $socid.' OR te.fk_soc IS NULL)';
1858
+		}
1859
+		if ($this->restrictiononfksoc && $socid && $this->element == 'societe') {
1860
+		    $sql.= ' AND te.rowid = ' . $socid;
1861
+		}
1683 1862
 		//print 'socid='.$socid.' restrictiononfksoc='.$this->restrictiononfksoc.' ismultientitymanaged = '.$this->ismultientitymanaged.' filter = '.$filter.' -> '.$sql."<br>";
1684 1863
 		// Rem: Bug in some mysql version: SELECT MIN(rowid) FROM llx_socpeople WHERE rowid > 1 when one row in database with rowid=1, returns 1 instead of null
1685 1864
 
@@ -1711,8 +1890,11 @@  discard block
 block discarded – undo
1711 1890
 		$i = 0;
1712 1891
 		while ($i < $num)
1713 1892
 		{
1714
-			if ($source == 'thirdparty') $contactAlreadySelected[$i] = $tab[$i]['socid'];
1715
-			else  $contactAlreadySelected[$i] = $tab[$i]['id'];
1893
+			if ($source == 'thirdparty') {
1894
+			    $contactAlreadySelected[$i] = $tab[$i]['socid'];
1895
+			} else {
1896
+			    $contactAlreadySelected[$i] = $tab[$i]['id'];
1897
+			}
1716 1898
 			$i++;
1717 1899
 		}
1718 1900
 		return $contactAlreadySelected;
@@ -1736,14 +1918,19 @@  discard block
 block discarded – undo
1736 1918
 		$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
1737 1919
 		if ($this->table_element == 'actioncomm')
1738 1920
 		{
1739
-			if ($projectid) $sql.= ' SET fk_project = '.$projectid;
1740
-			else $sql.= ' SET fk_project = NULL';
1921
+			if ($projectid) {
1922
+			    $sql.= ' SET fk_project = '.$projectid;
1923
+			} else {
1924
+			    $sql.= ' SET fk_project = NULL';
1925
+			}
1741 1926
 			$sql.= ' WHERE id = '.$this->id;
1742
-		}
1743
-		else
1927
+		} else
1744 1928
 		{
1745
-			if ($projectid) $sql.= ' SET fk_projet = '.$projectid;
1746
-			else $sql.= ' SET fk_projet = NULL';
1929
+			if ($projectid) {
1930
+			    $sql.= ' SET fk_projet = '.$projectid;
1931
+			} else {
1932
+			    $sql.= ' SET fk_projet = NULL';
1933
+			}
1747 1934
 			$sql.= ' WHERE rowid = '.$this->id;
1748 1935
 		}
1749 1936
 
@@ -1752,8 +1939,7 @@  discard block
 block discarded – undo
1752 1939
 		{
1753 1940
 			$this->fk_project = $projectid;
1754 1941
 			return 1;
1755
-		}
1756
-		else
1942
+		} else
1757 1943
 		{
1758 1944
 			dol_print_error($this->db);
1759 1945
 			return -1;
@@ -1773,8 +1959,12 @@  discard block
 block discarded – undo
1773 1959
 		{
1774 1960
 			// TODO uniformize field name
1775 1961
 			$fieldname = 'fk_mode_reglement';
1776
-			if ($this->element == 'societe') $fieldname = 'mode_reglement';
1777
-			if (get_class($this) == 'Fournisseur') $fieldname = 'mode_reglement_supplier';
1962
+			if ($this->element == 'societe') {
1963
+			    $fieldname = 'mode_reglement';
1964
+			}
1965
+			if (get_class($this) == 'Fournisseur') {
1966
+			    $fieldname = 'mode_reglement_supplier';
1967
+			}
1778 1968
 
1779 1969
 			$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
1780 1970
 			$sql .= ' SET '.$fieldname.' = '.$id;
@@ -1784,17 +1974,17 @@  discard block
 block discarded – undo
1784 1974
 			{
1785 1975
 				$this->mode_reglement_id = $id;
1786 1976
 				// for supplier
1787
-				if (get_class($this) == 'Fournisseur') $this->mode_reglement_supplier_id = $id;
1977
+				if (get_class($this) == 'Fournisseur') {
1978
+				    $this->mode_reglement_supplier_id = $id;
1979
+				}
1788 1980
 				return 1;
1789
-			}
1790
-			else
1981
+			} else
1791 1982
 			{
1792 1983
 				dol_syslog(get_class($this).'::setPaymentMethods Erreur '.$sql.' - '.$this->db->error());
1793 1984
 				$this->error=$this->db->error();
1794 1985
 				return -1;
1795 1986
 			}
1796
-		}
1797
-		else
1987
+		} else
1798 1988
 		{
1799 1989
 			dol_syslog(get_class($this).'::setPaymentMethods, status of the object is incompatible');
1800 1990
 			$this->error='Status of the object is incompatible '.$this->statut;
@@ -1824,18 +2014,18 @@  discard block
 block discarded – undo
1824 2014
 				$this->multicurrency_code = $code;
1825 2015
 
1826 2016
 				list($fk_multicurrency, $rate) = MultiCurrency::getIdAndTxFromCode($this->db, $code);
1827
-				if ($rate) $this->setMulticurrencyRate($rate,2);
2017
+				if ($rate) {
2018
+				    $this->setMulticurrencyRate($rate,2);
2019
+				}
1828 2020
 
1829 2021
 				return 1;
1830
-			}
1831
-			else
2022
+			} else
1832 2023
 			{
1833 2024
 				dol_syslog(get_class($this).'::setMulticurrencyCode Erreur '.$sql.' - '.$this->db->error());
1834 2025
 				$this->error=$this->db->error();
1835 2026
 				return -1;
1836 2027
 			}
1837
-		}
1838
-		else
2028
+		} else
1839 2029
 		{
1840 2030
 			dol_syslog(get_class($this).'::setMulticurrencyCode, status of the object is incompatible');
1841 2031
 			$this->error='Status of the object is incompatible '.$this->statut;
@@ -1929,15 +2119,13 @@  discard block
 block discarded – undo
1929 2119
 				}
1930 2120
 
1931 2121
 				return 1;
1932
-			}
1933
-			else
2122
+			} else
1934 2123
 			{
1935 2124
 				dol_syslog(get_class($this).'::setMulticurrencyRate Erreur '.$sql.' - '.$this->db->error());
1936 2125
 				$this->error=$this->db->error();
1937 2126
 				return -1;
1938 2127
 			}
1939
-		}
1940
-		else
2128
+		} else
1941 2129
 		{
1942 2130
 			dol_syslog(get_class($this).'::setMulticurrencyRate, status of the object is incompatible');
1943 2131
 			$this->error='Status of the object is incompatible '.$this->statut;
@@ -1958,8 +2146,12 @@  discard block
 block discarded – undo
1958 2146
 		{
1959 2147
 			// TODO uniformize field name
1960 2148
 			$fieldname = 'fk_cond_reglement';
1961
-			if ($this->element == 'societe') $fieldname = 'cond_reglement';
1962
-			if (get_class($this) == 'Fournisseur') $fieldname = 'cond_reglement_supplier';
2149
+			if ($this->element == 'societe') {
2150
+			    $fieldname = 'cond_reglement';
2151
+			}
2152
+			if (get_class($this) == 'Fournisseur') {
2153
+			    $fieldname = 'cond_reglement_supplier';
2154
+			}
1963 2155
 
1964 2156
 			$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
1965 2157
 			$sql .= ' SET '.$fieldname.' = '.$id;
@@ -1969,18 +2161,18 @@  discard block
 block discarded – undo
1969 2161
 			{
1970 2162
 				$this->cond_reglement_id = $id;
1971 2163
 				// for supplier
1972
-				if (get_class($this) == 'Fournisseur') $this->cond_reglement_supplier_id = $id;
2164
+				if (get_class($this) == 'Fournisseur') {
2165
+				    $this->cond_reglement_supplier_id = $id;
2166
+				}
1973 2167
 				$this->cond_reglement = $id;	// for compatibility
1974 2168
 				return 1;
1975
-			}
1976
-			else
2169
+			} else
1977 2170
 			{
1978 2171
 				dol_syslog(get_class($this).'::setPaymentTerms Erreur '.$sql.' - '.$this->db->error());
1979 2172
 				$this->error=$this->db->error();
1980 2173
 				return -1;
1981 2174
 			}
1982
-		}
1983
-		else
2175
+		} else
1984 2176
 		{
1985 2177
 			dol_syslog(get_class($this).'::setPaymentTerms, status of the object is incompatible');
1986 2178
 			$this->error='Status of the object is incompatible '.$this->statut;
@@ -1998,7 +2190,9 @@  discard block
 block discarded – undo
1998 2190
 	function setDeliveryAddress($id)
1999 2191
 	{
2000 2192
 		$fieldname = 'fk_delivery_address';
2001
-		if ($this->element == 'delivery' || $this->element == 'shipping') $fieldname = 'fk_address';
2193
+		if ($this->element == 'delivery' || $this->element == 'shipping') {
2194
+		    $fieldname = 'fk_address';
2195
+		}
2002 2196
 
2003 2197
 		$sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element." SET ".$fieldname." = ".$id;
2004 2198
 		$sql.= " WHERE rowid = ".$this->id." AND fk_statut = 0";
@@ -2007,8 +2201,7 @@  discard block
 block discarded – undo
2007 2201
 		{
2008 2202
 			$this->fk_delivery_address = $id;
2009 2203
 			return 1;
2010
-		}
2011
-		else
2204
+		} else
2012 2205
 		{
2013 2206
 			$this->error=$this->db->error();
2014 2207
 			dol_syslog(get_class($this).'::setDeliveryAddress Erreur '.$sql.' - '.$this->error);
@@ -2030,7 +2223,9 @@  discard block
 block discarded – undo
2030 2223
 	{
2031 2224
         global $user;
2032 2225
 
2033
-        if (empty($userused)) $userused=$user;
2226
+        if (empty($userused)) {
2227
+            $userused=$user;
2228
+        }
2034 2229
 
2035 2230
         $error = 0;
2036 2231
 
@@ -2041,7 +2236,9 @@  discard block
 block discarded – undo
2041 2236
 
2042 2237
         $this->db->begin();
2043 2238
 
2044
-		if ($shipping_method_id<0) $shipping_method_id='NULL';
2239
+		if ($shipping_method_id<0) {
2240
+		    $shipping_method_id='NULL';
2241
+		}
2045 2242
 		dol_syslog(get_class($this).'::setShippingMethod('.$shipping_method_id.')');
2046 2243
 
2047 2244
 		$sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
@@ -2058,7 +2255,9 @@  discard block
 block discarded – undo
2058 2255
                 // Call trigger
2059 2256
                 $this->context=array('shippingmethodupdate'=>1);
2060 2257
                 $result = $this->call_trigger(strtoupper(get_class($this)) . '_MODIFY', $userused);
2061
-                if ($result < 0) $error++;
2258
+                if ($result < 0) {
2259
+                    $error++;
2260
+                }
2062 2261
                 // End call trigger
2063 2262
             }
2064 2263
         }
@@ -2086,7 +2285,9 @@  discard block
 block discarded – undo
2086 2285
 			dol_syslog(get_class($this)."::setWarehouse was called on objet with property table_element not defined",LOG_ERR);
2087 2286
 			return -1;
2088 2287
 		}
2089
-		if ($warehouse_id<0) $warehouse_id='NULL';
2288
+		if ($warehouse_id<0) {
2289
+		    $warehouse_id='NULL';
2290
+		}
2090 2291
 		dol_syslog(get_class($this).'::setWarehouse('.$warehouse_id.')');
2091 2292
 
2092 2293
 		$sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
@@ -2133,8 +2334,7 @@  discard block
 block discarded – undo
2133 2334
 		{
2134 2335
 			$this->modelpdf=$modelpdf;
2135 2336
 			return 1;
2136
-		}
2137
-		else
2337
+		} else
2138 2338
 		{
2139 2339
 			dol_print_error($this->db);
2140 2340
 			return 0;
@@ -2154,7 +2354,9 @@  discard block
 block discarded – undo
2154 2354
 	{
2155 2355
         global $user;
2156 2356
 
2157
-        if (empty($userused)) $userused=$user;
2357
+        if (empty($userused)) {
2358
+            $userused=$user;
2359
+        }
2158 2360
 
2159 2361
         $error = 0;
2160 2362
 
@@ -2164,7 +2366,9 @@  discard block
 block discarded – undo
2164 2366
 		}
2165 2367
         $this->db->begin();
2166 2368
 
2167
-		if ($fk_account<0) $fk_account='NULL';
2369
+		if ($fk_account<0) {
2370
+		    $fk_account='NULL';
2371
+		}
2168 2372
 		dol_syslog(get_class($this).'::setBankAccount('.$fk_account.')');
2169 2373
 
2170 2374
 		$sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
@@ -2177,15 +2381,16 @@  discard block
 block discarded – undo
2177 2381
             dol_syslog(get_class($this).'::setBankAccount Error '.$sql.' - '.$this->db->error());
2178 2382
             $this->error = $this->db->lasterror();
2179 2383
             $error++;
2180
-        }
2181
-        else
2384
+        } else
2182 2385
         {
2183 2386
             if (!$notrigger)
2184 2387
             {
2185 2388
                 // Call trigger
2186 2389
                 $this->context=array('bankaccountupdate'=>1);
2187 2390
                 $result = $this->call_trigger(strtoupper(get_class($this)) . '_MODIFY', $userused);
2188
-                if ($result < 0) $error++;
2391
+                if ($result < 0) {
2392
+                    $error++;
2393
+                }
2189 2394
                 // End call trigger
2190 2395
             }
2191 2396
         }
@@ -2193,8 +2398,7 @@  discard block
 block discarded – undo
2193 2398
         {
2194 2399
             $this->db->rollback();
2195 2400
             return -1;
2196
-        }
2197
-        else
2401
+        } else
2198 2402
         {
2199 2403
             $this->fk_account = ($fk_account=='NULL')?null:$fk_account;
2200 2404
             $this->db->commit();
@@ -2233,8 +2437,12 @@  discard block
 block discarded – undo
2233 2437
 		$nl=0;
2234 2438
 		$sql = 'SELECT count(rowid) FROM '.MAIN_DB_PREFIX.$this->table_element_line;
2235 2439
 		$sql.= ' WHERE '.$this->fk_element.'='.$this->id;
2236
-		if (! $renum) $sql.= ' AND rang = 0';
2237
-		if ($renum) $sql.= ' AND rang <> 0';
2440
+		if (! $renum) {
2441
+		    $sql.= ' AND rang = 0';
2442
+		}
2443
+		if ($renum) {
2444
+		    $sql.= ' AND rang <> 0';
2445
+		}
2238 2446
 
2239 2447
 		dol_syslog(get_class($this)."::line_order", LOG_DEBUG);
2240 2448
 		$resql = $this->db->query($sql);
@@ -2242,8 +2450,9 @@  discard block
 block discarded – undo
2242 2450
 		{
2243 2451
 			$row = $this->db->fetch_row($resql);
2244 2452
 			$nl = $row[0];
2453
+		} else {
2454
+		    dol_print_error($this->db);
2245 2455
 		}
2246
-		else dol_print_error($this->db);
2247 2456
 		if ($nl > 0)
2248 2457
 		{
2249 2458
 			// The goal of this part is to reorder all lines, with all children lines sharing the same
@@ -2253,7 +2462,9 @@  discard block
 block discarded – undo
2253 2462
 			// We first search all lines that are parent lines (for multilevel details lines)
2254 2463
 			$sql = 'SELECT rowid FROM '.MAIN_DB_PREFIX.$this->table_element_line;
2255 2464
 			$sql.= ' WHERE '.$this->fk_element.' = '.$this->id;
2256
-			if ($fk_parent_line) $sql.= ' AND fk_parent_line IS NULL';
2465
+			if ($fk_parent_line) {
2466
+			    $sql.= ' AND fk_parent_line IS NULL';
2467
+			}
2257 2468
 			$sql.= ' ORDER BY rang ASC, rowid '.$rowidorder;
2258 2469
 
2259 2470
 			dol_syslog(get_class($this)."::line_order search all parent lines", LOG_DEBUG);
@@ -2285,8 +2496,7 @@  discard block
 block discarded – undo
2285 2496
 						$this->updateRangOfLine($row, ($key+1));
2286 2497
 					}
2287 2498
 				}
2288
-			}
2289
-			else
2499
+			} else
2290 2500
 			{
2291 2501
 				dol_print_error($this->db);
2292 2502
 			}
@@ -2379,7 +2589,9 @@  discard block
 block discarded – undo
2379 2589
 	function updateRangOfLine($rowid,$rang)
2380 2590
 	{
2381 2591
 		$fieldposition = 'rang';
2382
-		if (in_array($this->table_element_line, array('ecm_files', 'emailcollector_emailcollectoraction'))) $fieldposition = 'position';
2592
+		if (in_array($this->table_element_line, array('ecm_files', 'emailcollector_emailcollectoraction'))) {
2593
+		    $fieldposition = 'position';
2594
+		}
2383 2595
 
2384 2596
 		$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element_line.' SET '.$fieldposition.' = '.$rang;
2385 2597
 		$sql.= ' WHERE rowid = '.$rowid;
@@ -2420,7 +2632,9 @@  discard block
 block discarded – undo
2420 2632
 		if ($rang > 1)
2421 2633
 		{
2422 2634
 			$fieldposition = 'rang';
2423
-			if (in_array($this->table_element_line, array('ecm_files', 'emailcollector_emailcollectoraction'))) $fieldposition = 'position';
2635
+			if (in_array($this->table_element_line, array('ecm_files', 'emailcollector_emailcollectoraction'))) {
2636
+			    $fieldposition = 'position';
2637
+			}
2424 2638
 
2425 2639
 			$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element_line.' SET '.$fieldposition.' = '.$rang ;
2426 2640
 			$sql.= ' WHERE '.$this->fk_element.' = '.$this->id;
@@ -2433,8 +2647,7 @@  discard block
 block discarded – undo
2433 2647
 				{
2434 2648
 					dol_print_error($this->db);
2435 2649
 				}
2436
-			}
2437
-			else
2650
+			} else
2438 2651
 			{
2439 2652
 				dol_print_error($this->db);
2440 2653
 			}
@@ -2454,7 +2667,9 @@  discard block
 block discarded – undo
2454 2667
 		if ($rang < $max)
2455 2668
 		{
2456 2669
 			$fieldposition = 'rang';
2457
-			if (in_array($this->table_element_line, array('ecm_files', 'emailcollector_emailcollectoraction'))) $fieldposition = 'position';
2670
+			if (in_array($this->table_element_line, array('ecm_files', 'emailcollector_emailcollectoraction'))) {
2671
+			    $fieldposition = 'position';
2672
+			}
2458 2673
 
2459 2674
 			$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element_line.' SET '.$fieldposition.' = '.$rang;
2460 2675
 			$sql.= ' WHERE '.$this->fk_element.' = '.$this->id;
@@ -2467,8 +2682,7 @@  discard block
 block discarded – undo
2467 2682
 				{
2468 2683
 					dol_print_error($this->db);
2469 2684
 				}
2470
-			}
2471
-			else
2685
+			} else
2472 2686
 			{
2473 2687
 				dol_print_error($this->db);
2474 2688
 			}
@@ -2539,8 +2753,7 @@  discard block
 block discarded – undo
2539 2753
 				if (! empty($row[0]))
2540 2754
 				{
2541 2755
 					return $row[0];
2542
-				}
2543
-				else
2756
+				} else
2544 2757
 				{
2545 2758
 					return $this->getRangOfLine($fk_parent_line);
2546 2759
 				}
@@ -2587,8 +2800,7 @@  discard block
 block discarded – undo
2587 2800
 		{
2588 2801
 			$this->ref_ext = $ref_ext;
2589 2802
 			return 1;
2590
-		}
2591
-		else
2803
+		} else
2592 2804
 		{
2593 2805
 			$this->error=$this->db->error();
2594 2806
 			return -1;
@@ -2622,7 +2834,9 @@  discard block
 block discarded – undo
2622 2834
 		}
2623 2835
 		// Special cas
2624 2836
 		//var_dump($this->table_element);exit;
2625
-		if ($this->table_element == 'product') $suffix='';
2837
+		if ($this->table_element == 'product') {
2838
+		    $suffix='';
2839
+		}
2626 2840
 
2627 2841
 		$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
2628 2842
 		$sql.= " SET note".$suffix." = ".(!empty($note)?("'".$this->db->escape($note)."'"):"NULL");
@@ -2632,16 +2846,17 @@  discard block
 block discarded – undo
2632 2846
 		dol_syslog(get_class($this)."::update_note", LOG_DEBUG);
2633 2847
 		if ($this->db->query($sql))
2634 2848
 		{
2635
-			if ($suffix == '_public') $this->note_public = $note;
2636
-			else if ($suffix == '_private') $this->note_private = $note;
2637
-			else
2849
+			if ($suffix == '_public') {
2850
+			    $this->note_public = $note;
2851
+			} else if ($suffix == '_private') {
2852
+			    $this->note_private = $note;
2853
+			} else
2638 2854
 			{
2639 2855
 				$this->note = $note;      // deprecated
2640 2856
 				$this->note_private = $note;
2641 2857
 			}
2642 2858
 			return 1;
2643
-		}
2644
-		else
2859
+		} else
2645 2860
 		{
2646 2861
 			$this->error=$this->db->lasterror();
2647 2862
 			return -1;
@@ -2681,36 +2896,45 @@  discard block
 block discarded – undo
2681 2896
 
2682 2897
 		// Some external module want no update price after a trigger because they have another method to calculate the total (ex: with an extrafield)
2683 2898
 		$MODULE = "";
2684
-		if ($this->element == 'propal')
2685
-			$MODULE = "MODULE_DISALLOW_UPDATE_PRICE_PROPOSAL";
2686
-		elseif ($this->element == 'order')
2687
-			$MODULE = "MODULE_DISALLOW_UPDATE_PRICE_ORDER";
2688
-		elseif ($this->element == 'facture')
2689
-			$MODULE = "MODULE_DISALLOW_UPDATE_PRICE_INVOICE";
2690
-		elseif ($this->element == 'facture_fourn')
2691
-			$MODULE = "MODULE_DISALLOW_UPDATE_PRICE_SUPPLIER_INVOICE";
2692
-		elseif ($this->element == 'order_supplier')
2693
-			$MODULE = "MODULE_DISALLOW_UPDATE_PRICE_SUPPLIER_ORDER";
2694
-		elseif ($this->element == 'supplier_proposal')
2695
-			$MODULE = "MODULE_DISALLOW_UPDATE_PRICE_SUPPLIER_PROPOSAL";
2899
+		if ($this->element == 'propal') {
2900
+					$MODULE = "MODULE_DISALLOW_UPDATE_PRICE_PROPOSAL";
2901
+		} elseif ($this->element == 'order') {
2902
+					$MODULE = "MODULE_DISALLOW_UPDATE_PRICE_ORDER";
2903
+		} elseif ($this->element == 'facture') {
2904
+					$MODULE = "MODULE_DISALLOW_UPDATE_PRICE_INVOICE";
2905
+		} elseif ($this->element == 'facture_fourn') {
2906
+					$MODULE = "MODULE_DISALLOW_UPDATE_PRICE_SUPPLIER_INVOICE";
2907
+		} elseif ($this->element == 'order_supplier') {
2908
+					$MODULE = "MODULE_DISALLOW_UPDATE_PRICE_SUPPLIER_ORDER";
2909
+		} elseif ($this->element == 'supplier_proposal') {
2910
+					$MODULE = "MODULE_DISALLOW_UPDATE_PRICE_SUPPLIER_PROPOSAL";
2911
+		}
2696 2912
 
2697 2913
 		if (! empty($MODULE)) {
2698 2914
 			if (! empty($conf->global->$MODULE)) {
2699 2915
 				$modsactivated = explode(',', $conf->global->$MODULE);
2700 2916
 				foreach ($modsactivated as $mod) {
2701
-					if ($conf->$mod->enabled)
2702
-						return 1; // update was disabled by specific setup
2917
+					if ($conf->$mod->enabled) {
2918
+											return 1;
2919
+					}
2920
+					// update was disabled by specific setup
2703 2921
 				}
2704 2922
 			}
2705 2923
 		}
2706 2924
 
2707 2925
 		include_once DOL_DOCUMENT_ROOT.'/core/lib/price.lib.php';
2708 2926
 
2709
-		if ($roundingadjust == '-1') $roundingadjust='auto';	// For backward compatibility
2927
+		if ($roundingadjust == '-1') {
2928
+		    $roundingadjust='auto';
2929
+		}
2930
+		// For backward compatibility
2710 2931
 
2711 2932
 		$forcedroundingmode=$roundingadjust;
2712
-		if ($forcedroundingmode == 'auto' && isset($conf->global->MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND)) $forcedroundingmode=$conf->global->MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND;
2713
-		elseif ($forcedroundingmode == 'auto') $forcedroundingmode='0';
2933
+		if ($forcedroundingmode == 'auto' && isset($conf->global->MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND)) {
2934
+		    $forcedroundingmode=$conf->global->MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND;
2935
+		} elseif ($forcedroundingmode == 'auto') {
2936
+		    $forcedroundingmode='0';
2937
+		}
2714 2938
 
2715 2939
 		$error=0;
2716 2940
 
@@ -2733,15 +2957,22 @@  discard block
 block discarded – undo
2733 2957
 
2734 2958
 		$sql = 'SELECT rowid, qty, '.$fieldup.' as up, remise_percent, total_ht, '.$fieldtva.' as total_tva, total_ttc, '.$fieldlocaltax1.' as total_localtax1, '.$fieldlocaltax2.' as total_localtax2,';
2735 2959
 		$sql.= ' tva_tx as vatrate, localtax1_tx, localtax2_tx, localtax1_type, localtax2_type, info_bits, product_type';
2736
-			if ($this->table_element_line == 'facturedet') $sql.= ', situation_percent';
2960
+			if ($this->table_element_line == 'facturedet') {
2961
+			    $sql.= ', situation_percent';
2962
+			}
2737 2963
 			$sql.= ', multicurrency_total_ht, multicurrency_total_tva, multicurrency_total_ttc';
2738 2964
 		$sql.= ' FROM '.MAIN_DB_PREFIX.$this->table_element_line;
2739 2965
 		$sql.= ' WHERE '.$this->fk_element.' = '.$this->id;
2740 2966
 		if ($exclspec)
2741 2967
 		{
2742 2968
 			$product_field='product_type';
2743
-			if ($this->table_element_line == 'contratdet') $product_field='';    // contratdet table has no product_type field
2744
-			if ($product_field) $sql.= ' AND '.$product_field.' <> 9';
2969
+			if ($this->table_element_line == 'contratdet') {
2970
+			    $product_field='';
2971
+			}
2972
+			// contratdet table has no product_type field
2973
+			if ($product_field) {
2974
+			    $sql.= ' AND '.$product_field.' <> 9';
2975
+			}
2745 2976
 		}
2746 2977
 		$sql.= ' ORDER by rowid';	// We want to be sure to always use same order of line to not change lines differently when option MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND is used
2747 2978
 
@@ -2771,9 +3002,11 @@  discard block
 block discarded – undo
2771 3002
 				$parameters=array('fk_element' => $obj->rowid);
2772 3003
 				$reshook = $hookmanager->executeHooks('changeRoundingMode', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
2773 3004
 
2774
-				if (empty($reshook) && $forcedroundingmode == '0')	// Check if data on line are consistent. This may solve lines that were not consistent because set with $forcedroundingmode='auto'
3005
+				if (empty($reshook) && $forcedroundingmode == '0') {
3006
+				    // Check if data on line are consistent. This may solve lines that were not consistent because set with $forcedroundingmode='auto'
2775 3007
 				{
2776 3008
 					$localtax_array=array($obj->localtax1_type,$obj->localtax1_tx,$obj->localtax2_type,$obj->localtax2_tx);
3009
+				}
2777 3010
 					$tmpcal=calcul_price_total($obj->qty, $obj->up, $obj->remise_percent, $obj->vatrate, $obj->localtax1_tx, $obj->localtax2_tx, 0, 'HT', $obj->info_bits, $obj->product_type, $seller, $localtax_array, (isset($obj->situation_percent) ? $obj->situation_percent : 100), $multicurrency_tx);
2778 3011
 					$diff=price2num($tmpcal[1] - $obj->total_tva, 'MT', 1);
2779 3012
 					if ($diff)
@@ -2781,7 +3014,9 @@  discard block
 block discarded – undo
2781 3014
 						$sqlfix="UPDATE ".MAIN_DB_PREFIX.$this->table_element_line." SET ".$fieldtva." = ".$tmpcal[1].", total_ttc = ".$tmpcal[2]." WHERE rowid = ".$obj->rowid;
2782 3015
 						dol_syslog('We found unconsistent data into detailed line (difference of '.$diff.') for line rowid = '.$obj->rowid." (total vat of line calculated=".$tmpcal[1].", database=".$obj->total_tva."). We fix the total_vat and total_ttc of line by running sqlfix = ".$sqlfix);
2783 3016
 								$resqlfix=$this->db->query($sqlfix);
2784
-								if (! $resqlfix) dol_print_error($this->db,'Failed to update line');
3017
+								if (! $resqlfix) {
3018
+								    dol_print_error($this->db,'Failed to update line');
3019
+								}
2785 3020
 								$obj->total_tva = $tmpcal[1];
2786 3021
 								$obj->total_ttc = $tmpcal[2];
2787 3022
 						//
@@ -2797,16 +3032,24 @@  discard block
 block discarded – undo
2797 3032
 				$this->multicurrency_total_tva       += $obj->multicurrency_total_tva;
2798 3033
 				$this->multicurrency_total_ttc       += $obj->multicurrency_total_ttc;
2799 3034
 
2800
-				if (! isset($total_ht_by_vats[$obj->vatrate]))  $total_ht_by_vats[$obj->vatrate]=0;
2801
-				if (! isset($total_tva_by_vats[$obj->vatrate])) $total_tva_by_vats[$obj->vatrate]=0;
2802
-				if (! isset($total_ttc_by_vats[$obj->vatrate])) $total_ttc_by_vats[$obj->vatrate]=0;
3035
+				if (! isset($total_ht_by_vats[$obj->vatrate])) {
3036
+				    $total_ht_by_vats[$obj->vatrate]=0;
3037
+				}
3038
+				if (! isset($total_tva_by_vats[$obj->vatrate])) {
3039
+				    $total_tva_by_vats[$obj->vatrate]=0;
3040
+				}
3041
+				if (! isset($total_ttc_by_vats[$obj->vatrate])) {
3042
+				    $total_ttc_by_vats[$obj->vatrate]=0;
3043
+				}
2803 3044
 				$total_ht_by_vats[$obj->vatrate]  += $obj->total_ht;
2804 3045
 				$total_tva_by_vats[$obj->vatrate] += $obj->total_tva;
2805 3046
 				$total_ttc_by_vats[$obj->vatrate] += $obj->total_ttc;
2806 3047
 
2807
-				if ($forcedroundingmode == '1')	// Check if we need adjustement onto line for vat. TODO This works on the company currency but not on multicurrency
3048
+				if ($forcedroundingmode == '1') {
3049
+				    // Check if we need adjustement onto line for vat. TODO This works on the company currency but not on multicurrency
2808 3050
 				{
2809 3051
 					$tmpvat=price2num($total_ht_by_vats[$obj->vatrate] * $obj->vatrate / 100, 'MT', 1);
3052
+				}
2810 3053
 					$diff=price2num($total_tva_by_vats[$obj->vatrate]-$tmpvat, 'MT', 1);
2811 3054
 					//print 'Line '.$i.' rowid='.$obj->rowid.' vat_rate='.$obj->vatrate.' total_ht='.$obj->total_ht.' total_tva='.$obj->total_tva.' total_ttc='.$obj->total_ttc.' total_ht_by_vats='.$total_ht_by_vats[$obj->vatrate].' total_tva_by_vats='.$total_tva_by_vats[$obj->vatrate].' (new calculation = '.$tmpvat.') total_ttc_by_vats='.$total_ttc_by_vats[$obj->vatrate].($diff?" => DIFF":"")."<br>\n";
2812 3055
 					if ($diff)
@@ -2815,7 +3058,9 @@  discard block
 block discarded – undo
2815 3058
 						$sqlfix="UPDATE ".MAIN_DB_PREFIX.$this->table_element_line." SET ".$fieldtva." = ".($obj->total_tva - $diff).", total_ttc = ".($obj->total_ttc - $diff)." WHERE rowid = ".$obj->rowid;
2816 3059
 						dol_syslog('We found a difference of '.$diff.' for line rowid = '.$obj->rowid.". We fix the total_vat and total_ttc of line by running sqlfix = ".$sqlfix);
2817 3060
 								$resqlfix=$this->db->query($sqlfix);
2818
-								if (! $resqlfix) dol_print_error($this->db,'Failed to update line');
3061
+								if (! $resqlfix) {
3062
+								    dol_print_error($this->db,'Failed to update line');
3063
+								}
2819 3064
 								$this->total_tva -= $diff;
2820 3065
 								$this->total_ttc -= $diff;
2821 3066
 								$total_tva_by_vats[$obj->vatrate] -= $diff;
@@ -2856,11 +3101,21 @@  discard block
 block discarded – undo
2856 3101
 			$fieldlocaltax2='localtax2';
2857 3102
 			$fieldttc='total_ttc';
2858 3103
 			// Specific code for backward compatibility with old field names
2859
-			if ($this->element == 'facture' || $this->element == 'facturerec')             $fieldht='total';
2860
-			if ($this->element == 'facture_fourn' || $this->element == 'invoice_supplier') $fieldtva='total_tva';
2861
-			if ($this->element == 'propal')                                                $fieldttc='total';
2862
-			if ($this->element == 'expensereport')                                         $fieldtva='total_tva';
2863
-			if ($this->element == 'supplier_proposal')                                     $fieldttc='total';
3104
+			if ($this->element == 'facture' || $this->element == 'facturerec') {
3105
+			    $fieldht='total';
3106
+			}
3107
+			if ($this->element == 'facture_fourn' || $this->element == 'invoice_supplier') {
3108
+			    $fieldtva='total_tva';
3109
+			}
3110
+			if ($this->element == 'propal') {
3111
+			    $fieldttc='total';
3112
+			}
3113
+			if ($this->element == 'expensereport') {
3114
+			    $fieldtva='total_tva';
3115
+			}
3116
+			if ($this->element == 'supplier_proposal') {
3117
+			    $fieldttc='total';
3118
+			}
2864 3119
 
2865 3120
 			if (empty($nodatabaseupdate))
2866 3121
 			{
@@ -2889,13 +3144,11 @@  discard block
 block discarded – undo
2889 3144
 			if (! $error)
2890 3145
 			{
2891 3146
 				return 1;
2892
-			}
2893
-			else
3147
+			} else
2894 3148
 			{
2895 3149
 				return -1;
2896 3150
 			}
2897
-		}
2898
-		else
3151
+		} else
2899 3152
 		{
2900 3153
 			dol_print_error($this->db,'Bad request in update_price');
2901 3154
 			return -1;
@@ -2918,10 +3171,18 @@  discard block
 block discarded – undo
2918 3171
 		$origin_id = (! empty($origin_id) ? $origin_id : $this->origin_id);
2919 3172
 
2920 3173
 		// Special case
2921
-		if ($origin == 'order') $origin='commande';
2922
-		if ($origin == 'invoice') $origin='facture';
2923
-		if ($origin == 'invoice_template') $origin='facturerec';
2924
-    	if ($origin == 'supplierorder') $origin='order_supplier';
3174
+		if ($origin == 'order') {
3175
+		    $origin='commande';
3176
+		}
3177
+		if ($origin == 'invoice') {
3178
+		    $origin='facture';
3179
+		}
3180
+		if ($origin == 'invoice_template') {
3181
+		    $origin='facturerec';
3182
+		}
3183
+    	if ($origin == 'supplierorder') {
3184
+    	    $origin='order_supplier';
3185
+    	}
2925 3186
 		$this->db->begin();
2926 3187
 
2927 3188
 		$sql = "INSERT INTO ".MAIN_DB_PREFIX."element_element (";
@@ -2941,8 +3202,7 @@  discard block
 block discarded – undo
2941 3202
 	  	{
2942 3203
 	  		$this->db->commit();
2943 3204
 	  		return 1;
2944
-	  	}
2945
-	  	else
3205
+	  	} else
2946 3206
 	  	{
2947 3207
 	  		$this->error=$this->db->lasterror();
2948 3208
 	  		$this->db->rollback();
@@ -2987,12 +3247,16 @@  discard block
 block discarded – undo
2987 3247
 		if (! empty($sourceid) && ! empty($sourcetype) && empty($targetid))
2988 3248
 		{
2989 3249
 			$justsource=true;  // the source (id and type) is a search criteria
2990
-			if (! empty($targettype)) $withtargettype=true;
3250
+			if (! empty($targettype)) {
3251
+			    $withtargettype=true;
3252
+			}
2991 3253
 		}
2992 3254
 		if (! empty($targetid) && ! empty($targettype) && empty($sourceid))
2993 3255
 		{
2994 3256
 			$justtarget=true;  // the target (id and type) is a search criteria
2995
-			if (! empty($sourcetype)) $withsourcetype=true;
3257
+			if (! empty($sourcetype)) {
3258
+			    $withsourcetype=true;
3259
+			}
2996 3260
 		}
2997 3261
 
2998 3262
 		$sourceid = (! empty($sourceid) ? $sourceid : $this->id);
@@ -3015,15 +3279,17 @@  discard block
 block discarded – undo
3015 3279
 			if ($justsource)
3016 3280
 			{
3017 3281
 				$sql.= "fk_source = ".$sourceid." AND sourcetype = '".$sourcetype."'";
3018
-				if ($withtargettype) $sql.= " AND targettype = '".$targettype."'";
3019
-			}
3020
-			else if ($justtarget)
3282
+				if ($withtargettype) {
3283
+				    $sql.= " AND targettype = '".$targettype."'";
3284
+				}
3285
+			} else if ($justtarget)
3021 3286
 			{
3022 3287
 				$sql.= "fk_target = ".$targetid." AND targettype = '".$targettype."'";
3023
-				if ($withsourcetype) $sql.= " AND sourcetype = '".$sourcetype."'";
3288
+				if ($withsourcetype) {
3289
+				    $sql.= " AND sourcetype = '".$sourcetype."'";
3290
+				}
3024 3291
 			}
3025
-		}
3026
-		else
3292
+		} else
3027 3293
 		{
3028 3294
 			$sql.= "(fk_source = ".$sourceid." AND sourcetype = '".$sourcetype."')";
3029 3295
 			$sql.= " ".$clause." (fk_target = ".$targetid." AND targettype = '".$targettype."')";
@@ -3044,13 +3310,11 @@  discard block
 block discarded – undo
3044 3310
 					if ($justsource)
3045 3311
 					{
3046 3312
 						$this->linkedObjectsIds[$obj->targettype][$obj->rowid]=$obj->fk_target;
3047
-					}
3048
-					else if ($justtarget)
3313
+					} else if ($justtarget)
3049 3314
 					{
3050 3315
 						$this->linkedObjectsIds[$obj->sourcetype][$obj->rowid]=$obj->fk_source;
3051 3316
 					}
3052
-				}
3053
-				else
3317
+				} else
3054 3318
 				{
3055 3319
 					if ($obj->fk_source == $sourceid && $obj->sourcetype == $sourcetype)
3056 3320
 					{
@@ -3067,10 +3331,12 @@  discard block
 block discarded – undo
3067 3331
 			if (! empty($this->linkedObjectsIds))
3068 3332
 			{
3069 3333
 				$tmparray = $this->linkedObjectsIds;
3070
-				foreach($tmparray as $objecttype => $objectids)       // $objecttype is a module name ('facture', 'mymodule', ...) or a module name with a suffix ('project_task', 'mymodule_myobj', ...)
3334
+				foreach($tmparray as $objecttype => $objectids) {
3335
+				    // $objecttype is a module name ('facture', 'mymodule', ...) or a module name with a suffix ('project_task', 'mymodule_myobj', ...)
3071 3336
 				{
3072 3337
 					// Parse element/subelement (ex: project_task, cabinetmed_consultation, ...)
3073 3338
 					$module = $element = $subelement = $objecttype;
3339
+				}
3074 3340
 					if ($objecttype != 'supplier_proposal' && $objecttype != 'order_supplier' && $objecttype != 'invoice_supplier'
3075 3341
 						&& preg_match('/^([^_]+)_([^_]+)/i',$objecttype,$regs))
3076 3342
 					{
@@ -3082,29 +3348,21 @@  discard block
 block discarded – undo
3082 3348
 					// To work with non standard classpath or module name
3083 3349
 					if ($objecttype == 'facture')			{
3084 3350
 						$classpath = 'compta/facture/class';
3085
-					}
3086
-					else if ($objecttype == 'facturerec')			{
3351
+					} else if ($objecttype == 'facturerec')			{
3087 3352
 						$classpath = 'compta/facture/class'; $module = 'facture';
3088
-					}
3089
-					else if ($objecttype == 'propal')			{
3353
+					} else if ($objecttype == 'propal')			{
3090 3354
 						$classpath = 'comm/propal/class';
3091
-					}
3092
-					else if ($objecttype == 'supplier_proposal')			{
3355
+					} else if ($objecttype == 'supplier_proposal')			{
3093 3356
 						$classpath = 'supplier_proposal/class';
3094
-					}
3095
-					else if ($objecttype == 'shipping')			{
3357
+					} else if ($objecttype == 'shipping')			{
3096 3358
 						$classpath = 'expedition/class'; $subelement = 'expedition'; $module = 'expedition_bon';
3097
-					}
3098
-					else if ($objecttype == 'delivery')			{
3359
+					} else if ($objecttype == 'delivery')			{
3099 3360
 						$classpath = 'livraison/class'; $subelement = 'livraison'; $module = 'livraison_bon';
3100
-					}
3101
-					else if ($objecttype == 'invoice_supplier' || $objecttype == 'order_supplier')	{
3361
+					} else if ($objecttype == 'invoice_supplier' || $objecttype == 'order_supplier')	{
3102 3362
 						$classpath = 'fourn/class'; $module = 'fournisseur';
3103
-					}
3104
-					else if ($objecttype == 'fichinter')			{
3363
+					} else if ($objecttype == 'fichinter')			{
3105 3364
 						$classpath = 'fichinter/class'; $subelement = 'fichinter'; $module = 'ficheinter';
3106
-					}
3107
-					else if ($objecttype == 'subscription')			{
3365
+					} else if ($objecttype == 'subscription')			{
3108 3366
 						$classpath = 'adherents/class'; $module = 'adherent';
3109 3367
 					}
3110 3368
 
@@ -3113,20 +3371,15 @@  discard block
 block discarded – undo
3113 3371
 
3114 3372
 					if ($objecttype == 'order') {
3115 3373
 						$classfile = 'commande'; $classname = 'Commande';
3116
-					}
3117
-					else if ($objecttype == 'invoice_supplier') {
3374
+					} else if ($objecttype == 'invoice_supplier') {
3118 3375
 						$classfile = 'fournisseur.facture'; $classname = 'FactureFournisseur';
3119
-					}
3120
-					else if ($objecttype == 'order_supplier')   {
3376
+					} else if ($objecttype == 'order_supplier')   {
3121 3377
 						$classfile = 'fournisseur.commande'; $classname = 'CommandeFournisseur';
3122
-					}
3123
-					else if ($objecttype == 'supplier_proposal')   {
3378
+					} else if ($objecttype == 'supplier_proposal')   {
3124 3379
 						$classfile = 'supplier_proposal'; $classname = 'SupplierProposal';
3125
-					}
3126
-					else if ($objecttype == 'facturerec')   {
3380
+					} else if ($objecttype == 'facturerec')   {
3127 3381
 						$classfile = 'facture-rec'; $classname = 'FactureRec';
3128
-					}
3129
-					else if ($objecttype == 'subscription')   {
3382
+					} else if ($objecttype == 'subscription')   {
3130 3383
 						$classfile = 'subscription'; $classname = 'Subscription';
3131 3384
 					}
3132 3385
 
@@ -3139,9 +3392,11 @@  discard block
 block discarded – undo
3139 3392
 							//print '/'.$classpath.'/'.$classfile.'.class.php '.class_exists($classname);
3140 3393
 							if (class_exists($classname))
3141 3394
 							{
3142
-								foreach($objectids as $i => $objectid)	// $i is rowid into llx_element_element
3395
+								foreach($objectids as $i => $objectid) {
3396
+								    // $i is rowid into llx_element_element
3143 3397
 								{
3144 3398
 									$object = new $classname($this->db);
3399
+								}
3145 3400
 									$ret = $object->fetch($objectid);
3146 3401
 									if ($ret >= 0)
3147 3402
 									{
@@ -3150,16 +3405,14 @@  discard block
 block discarded – undo
3150 3405
 								}
3151 3406
 							}
3152 3407
 						}
3153
-					}
3154
-					else
3408
+					} else
3155 3409
 					{
3156 3410
 						unset($this->linkedObjectsIds[$objecttype]);
3157 3411
 					}
3158 3412
 				}
3159 3413
 			}
3160 3414
 			return 1;
3161
-		}
3162
-		else
3415
+		} else
3163 3416
 		{
3164 3417
 			dol_print_error($this->db);
3165 3418
 			return -1;
@@ -3181,8 +3434,11 @@  discard block
 block discarded – undo
3181 3434
 		$updatesource=false;
3182 3435
 		$updatetarget=false;
3183 3436
 
3184
-		if (! empty($sourceid) && ! empty($sourcetype) && empty($targetid) && empty($targettype)) $updatesource=true;
3185
-		else if (empty($sourceid) && empty($sourcetype) && ! empty($targetid) && ! empty($targettype)) $updatetarget=true;
3437
+		if (! empty($sourceid) && ! empty($sourcetype) && empty($targetid) && empty($targettype)) {
3438
+		    $updatesource=true;
3439
+		} else if (empty($sourceid) && empty($sourcetype) && ! empty($targetid) && ! empty($targettype)) {
3440
+		    $updatetarget=true;
3441
+		}
3186 3442
 
3187 3443
 		$sql = "UPDATE ".MAIN_DB_PREFIX."element_element SET ";
3188 3444
 		if ($updatesource)
@@ -3191,8 +3447,7 @@  discard block
 block discarded – undo
3191 3447
 			$sql.= ", sourcetype = '".$this->db->escape($sourcetype)."'";
3192 3448
 			$sql.= " WHERE fk_target = ".$this->id;
3193 3449
 			$sql.= " AND targettype = '".$this->db->escape($this->element)."'";
3194
-		}
3195
-		else if ($updatetarget)
3450
+		} else if ($updatetarget)
3196 3451
 		{
3197 3452
 			$sql.= "fk_target = ".$targetid;
3198 3453
 			$sql.= ", targettype = '".$this->db->escape($targettype)."'";
@@ -3204,8 +3459,7 @@  discard block
 block discarded – undo
3204 3459
 		if ($this->db->query($sql))
3205 3460
 		{
3206 3461
 			return 1;
3207
-		}
3208
-		else
3462
+		} else
3209 3463
 		{
3210 3464
 			$this->error=$this->db->lasterror();
3211 3465
 			return -1;
@@ -3228,8 +3482,11 @@  discard block
 block discarded – undo
3228 3482
 		$deletesource=false;
3229 3483
 		$deletetarget=false;
3230 3484
 
3231
-		if (! empty($sourceid) && ! empty($sourcetype) && empty($targetid) && empty($targettype)) $deletesource=true;
3232
-		else if (empty($sourceid) && empty($sourcetype) && ! empty($targetid) && ! empty($targettype)) $deletetarget=true;
3485
+		if (! empty($sourceid) && ! empty($sourcetype) && empty($targetid) && empty($targettype)) {
3486
+		    $deletesource=true;
3487
+		} else if (empty($sourceid) && empty($sourcetype) && ! empty($targetid) && ! empty($targettype)) {
3488
+		    $deletetarget=true;
3489
+		}
3233 3490
 
3234 3491
 		$sourceid = (! empty($sourceid) ? $sourceid : $this->id);
3235 3492
 		$sourcetype = (! empty($sourcetype) ? $sourcetype : $this->element);
@@ -3241,20 +3498,17 @@  discard block
 block discarded – undo
3241 3498
 		if ($rowid > 0)
3242 3499
 		{
3243 3500
 			$sql.=" rowid = ".$rowid;
3244
-		}
3245
-		else
3501
+		} else
3246 3502
 		{
3247 3503
 			if ($deletesource)
3248 3504
 			{
3249 3505
 				$sql.= " fk_source = ".$sourceid." AND sourcetype = '".$this->db->escape($sourcetype)."'";
3250 3506
 				$sql.= " AND fk_target = ".$this->id." AND targettype = '".$this->db->escape($this->element)."'";
3251
-			}
3252
-			else if ($deletetarget)
3507
+			} else if ($deletetarget)
3253 3508
 			{
3254 3509
 				$sql.= " fk_target = ".$targetid." AND targettype = '".$this->db->escape($targettype)."'";
3255 3510
 				$sql.= " AND fk_source = ".$this->id." AND sourcetype = '".$this->db->escape($this->element)."'";
3256
-			}
3257
-			else
3511
+			} else
3258 3512
 			{
3259 3513
 				$sql.= " (fk_source = ".$this->id." AND sourcetype = '".$this->db->escape($this->element)."')";
3260 3514
 				$sql.= " OR";
@@ -3266,8 +3520,7 @@  discard block
 block discarded – undo
3266 3520
 		if ($this->db->query($sql))
3267 3521
 		{
3268 3522
 			return 1;
3269
-		}
3270
-		else
3523
+		} else
3271 3524
 		{
3272 3525
 			$this->error=$this->db->lasterror();
3273 3526
 			$this->errors[]=$this->error;
@@ -3296,17 +3549,31 @@  discard block
 block discarded – undo
3296 3549
 		$this->db->begin();
3297 3550
 
3298 3551
 		$fieldstatus="fk_statut";
3299
-		if ($elementTable == 'facture_rec') $fieldstatus="suspended";
3300
-		if ($elementTable == 'mailing') $fieldstatus="statut";
3301
-		if ($elementTable == 'cronjob') $fieldstatus="status";
3302
-		if ($elementTable == 'user') $fieldstatus="statut";
3303
-		if ($elementTable == 'expensereport') $fieldstatus="fk_statut";
3304
-		if ($elementTable == 'commande_fournisseur_dispatch') $fieldstatus="status";
3552
+		if ($elementTable == 'facture_rec') {
3553
+		    $fieldstatus="suspended";
3554
+		}
3555
+		if ($elementTable == 'mailing') {
3556
+		    $fieldstatus="statut";
3557
+		}
3558
+		if ($elementTable == 'cronjob') {
3559
+		    $fieldstatus="status";
3560
+		}
3561
+		if ($elementTable == 'user') {
3562
+		    $fieldstatus="statut";
3563
+		}
3564
+		if ($elementTable == 'expensereport') {
3565
+		    $fieldstatus="fk_statut";
3566
+		}
3567
+		if ($elementTable == 'commande_fournisseur_dispatch') {
3568
+		    $fieldstatus="status";
3569
+		}
3305 3570
 
3306 3571
 		$sql = "UPDATE ".MAIN_DB_PREFIX.$elementTable;
3307 3572
 		$sql.= " SET ".$fieldstatus." = ".$status;
3308 3573
 		// If status = 1 = validated, update also fk_user_valid
3309
-		if ($status == 1 && $elementTable == 'expensereport') $sql.=", fk_user_valid = ".$user->id;
3574
+		if ($status == 1 && $elementTable == 'expensereport') {
3575
+		    $sql.=", fk_user_valid = ".$user->id;
3576
+		}
3310 3577
 		$sql.= " WHERE rowid=".$elementId;
3311 3578
 
3312 3579
 		dol_syslog(get_class($this)."::setStatut", LOG_DEBUG);
@@ -3317,12 +3584,27 @@  discard block
 block discarded – undo
3317 3584
 			// Try autoset of trigkey
3318 3585
 			if (empty($trigkey))
3319 3586
 			{
3320
-				if ($this->element == 'supplier_proposal' && $status == 2) $trigkey='SUPPLIER_PROPOSAL_SIGN';   // 2 = SupplierProposal::STATUS_SIGNED. Can't use constant into this generic class
3321
-				if ($this->element == 'supplier_proposal' && $status == 3) $trigkey='SUPPLIER_PROPOSAL_REFUSE'; // 3 = SupplierProposal::STATUS_REFUSED. Can't use constant into this generic class
3322
-				if ($this->element == 'supplier_proposal' && $status == 4) $trigkey='SUPPLIER_PROPOSAL_CLOSE';  // 4 = SupplierProposal::STATUS_CLOSED. Can't use constant into this generic class
3323
-				if ($this->element == 'fichinter' && $status == 3) $trigkey='FICHINTER_CLASSIFY_DONE';
3324
-				if ($this->element == 'fichinter' && $status == 2) $trigkey='FICHINTER_CLASSIFY_BILLED';
3325
-				if ($this->element == 'fichinter' && $status == 1) $trigkey='FICHINTER_CLASSIFY_UNBILLED';
3587
+				if ($this->element == 'supplier_proposal' && $status == 2) {
3588
+				    $trigkey='SUPPLIER_PROPOSAL_SIGN';
3589
+				}
3590
+				// 2 = SupplierProposal::STATUS_SIGNED. Can't use constant into this generic class
3591
+				if ($this->element == 'supplier_proposal' && $status == 3) {
3592
+				    $trigkey='SUPPLIER_PROPOSAL_REFUSE';
3593
+				}
3594
+				// 3 = SupplierProposal::STATUS_REFUSED. Can't use constant into this generic class
3595
+				if ($this->element == 'supplier_proposal' && $status == 4) {
3596
+				    $trigkey='SUPPLIER_PROPOSAL_CLOSE';
3597
+				}
3598
+				// 4 = SupplierProposal::STATUS_CLOSED. Can't use constant into this generic class
3599
+				if ($this->element == 'fichinter' && $status == 3) {
3600
+				    $trigkey='FICHINTER_CLASSIFY_DONE';
3601
+				}
3602
+				if ($this->element == 'fichinter' && $status == 2) {
3603
+				    $trigkey='FICHINTER_CLASSIFY_BILLED';
3604
+				}
3605
+				if ($this->element == 'fichinter' && $status == 1) {
3606
+				    $trigkey='FICHINTER_CLASSIFY_UNBILLED';
3607
+				}
3326 3608
 			}
3327 3609
 
3328 3610
 			if ($trigkey)
@@ -3341,22 +3623,22 @@  discard block
 block discarded – undo
3341 3623
 			{
3342 3624
 				$this->db->commit();
3343 3625
 
3344
-				if (empty($savElementId))    // If the element we update was $this (so $elementId is null)
3626
+				if (empty($savElementId)) {
3627
+				    // If the element we update was $this (so $elementId is null)
3345 3628
 				{
3346 3629
 					$this->statut = $status;
3630
+				}
3347 3631
 					$this->status = $status;
3348 3632
 				}
3349 3633
 
3350 3634
 				return 1;
3351
-			}
3352
-			else
3635
+			} else
3353 3636
 			{
3354 3637
 				$this->db->rollback();
3355 3638
 				dol_syslog(get_class($this)."::setStatus ".$this->error,LOG_ERR);
3356 3639
 				return -1;
3357 3640
 			}
3358
-		}
3359
-		else
3641
+		} else
3360 3642
 		{
3361 3643
 			$this->error=$this->db->lasterror();
3362 3644
 			$this->db->rollback();
@@ -3376,8 +3658,13 @@  discard block
 block discarded – undo
3376 3658
 	{
3377 3659
 		global $conf;
3378 3660
 
3379
-		if (empty($id) && empty($ref)) return 0;
3380
-		if (! empty($conf->global->MAIN_DISABLE_CANVAS)) return 0;    // To increase speed. Not enabled by default.
3661
+		if (empty($id) && empty($ref)) {
3662
+		    return 0;
3663
+		}
3664
+		if (! empty($conf->global->MAIN_DISABLE_CANVAS)) {
3665
+		    return 0;
3666
+		}
3667
+		// To increase speed. Not enabled by default.
3381 3668
 
3382 3669
 		// Clean parameters
3383 3670
 		$ref = trim($ref);
@@ -3385,8 +3672,12 @@  discard block
 block discarded – undo
3385 3672
 		$sql = "SELECT rowid, canvas";
3386 3673
 		$sql.= " FROM ".MAIN_DB_PREFIX.$this->table_element;
3387 3674
 		$sql.= " WHERE entity IN (".getEntity($this->element).")";
3388
-		if (! empty($id))  $sql.= " AND rowid = ".$id;
3389
-		if (! empty($ref)) $sql.= " AND ref = '".$this->db->escape($ref)."'";
3675
+		if (! empty($id)) {
3676
+		    $sql.= " AND rowid = ".$id;
3677
+		}
3678
+		if (! empty($ref)) {
3679
+		    $sql.= " AND ref = '".$this->db->escape($ref)."'";
3680
+		}
3390 3681
 
3391 3682
 		$resql = $this->db->query($sql);
3392 3683
 		if ($resql)
@@ -3396,10 +3687,10 @@  discard block
 block discarded – undo
3396 3687
 			{
3397 3688
 				$this->canvas   = $obj->canvas;
3398 3689
 				return 1;
3690
+			} else {
3691
+			    return 0;
3399 3692
 			}
3400
-			else return 0;
3401
-		}
3402
-		else
3693
+		} else
3403 3694
 		{
3404 3695
 			dol_print_error($this->db);
3405 3696
 			return -1;
@@ -3436,7 +3727,9 @@  discard block
 block discarded – undo
3436 3727
 	{
3437 3728
 		global $langs;
3438 3729
 
3439
-		if (empty($id)) $id=$this->id;
3730
+		if (empty($id)) {
3731
+		    $id=$this->id;
3732
+		}
3440 3733
 
3441 3734
 		// Check parameters
3442 3735
 		if (! isset($this->childtables) || ! is_array($this->childtables) || count($this->childtables) == 0)
@@ -3470,18 +3763,18 @@  discard block
 block discarded – undo
3470 3763
 					$langs->load("errors");
3471 3764
 					//print 'Found into table '.$table.', type '.$langs->transnoentitiesnoconv($elementname).', haschild='.$haschild;
3472 3765
 					$haschild += $obj->nb;
3473
-					if (is_numeric($elementname))	// old usage
3766
+					if (is_numeric($elementname)) {
3767
+					    // old usage
3474 3768
 					{
3475 3769
 						$this->errors[]=$langs->trans("ErrorRecordHasAtLeastOneChildOfType", $table);
3476 3770
 					}
3477
-					else	// new usage: $elementname=Translation key
3771
+					} else	// new usage: $elementname=Translation key
3478 3772
 					{
3479 3773
 						$this->errors[]=$langs->trans("ErrorRecordHasAtLeastOneChildOfType", $langs->transnoentitiesnoconv($elementname));
3480 3774
 					}
3481 3775
 					break;    // We found at least one, we stop here
3482 3776
 				}
3483
-			}
3484
-			else
3777
+			} else
3485 3778
 			{
3486 3779
 				$this->errors[]=$this->db->lasterror();
3487 3780
 				return -1;
@@ -3491,8 +3784,9 @@  discard block
 block discarded – undo
3491 3784
 		{
3492 3785
 			$this->errors[]="ErrorRecordHasChildren";
3493 3786
 			return $haschild;
3787
+		} else {
3788
+		    return 0;
3494 3789
 		}
3495
-		else return 0;
3496 3790
 	}
3497 3791
 
3498 3792
 	/**
@@ -3508,12 +3802,24 @@  discard block
 block discarded – undo
3508 3802
 		foreach($this->lines as $key => $val)
3509 3803
 		{
3510 3804
 			$qualified=0;
3511
-			if ($predefined == -1) $qualified=1;
3512
-			if ($predefined == 1 && $val->fk_product > 0) $qualified=1;
3513
-			if ($predefined == 0 && $val->fk_product <= 0) $qualified=1;
3514
-			if ($predefined == 2 && $val->fk_product > 0 && $val->product_type==0) $qualified=1;
3515
-			if ($predefined == 3 && $val->fk_product > 0 && $val->product_type==1) $qualified=1;
3516
-			if ($qualified) $nb++;
3805
+			if ($predefined == -1) {
3806
+			    $qualified=1;
3807
+			}
3808
+			if ($predefined == 1 && $val->fk_product > 0) {
3809
+			    $qualified=1;
3810
+			}
3811
+			if ($predefined == 0 && $val->fk_product <= 0) {
3812
+			    $qualified=1;
3813
+			}
3814
+			if ($predefined == 2 && $val->fk_product > 0 && $val->product_type==0) {
3815
+			    $qualified=1;
3816
+			}
3817
+			if ($predefined == 3 && $val->fk_product > 0 && $val->product_type==1) {
3818
+			    $qualified=1;
3819
+			}
3820
+			if ($qualified) {
3821
+			    $nb++;
3822
+			}
3517 3823
 		}
3518 3824
 		dol_syslog(get_class($this).'::hasProductsOrServices we found '.$nb.' qualified lines of products/servcies');
3519 3825
 		return $nb;
@@ -3577,16 +3883,24 @@  discard block
 block discarded – undo
3577 3883
 		{
3578 3884
 			if (isset($line->qty_asked))
3579 3885
 			{
3580
-				if (empty($totalOrdered)) $totalOrdered=0;  // Avoid warning because $totalOrdered is ''
3886
+				if (empty($totalOrdered)) {
3887
+				    $totalOrdered=0;
3888
+				}
3889
+				// Avoid warning because $totalOrdered is ''
3581 3890
 				$totalOrdered+=$line->qty_asked;    // defined for shipment only
3582 3891
 			}
3583 3892
 			if (isset($line->qty_shipped))
3584 3893
 			{
3585
-				if (empty($totalToShip)) $totalToShip=0;    // Avoid warning because $totalToShip is ''
3894
+				if (empty($totalToShip)) {
3895
+				    $totalToShip=0;
3896
+				}
3897
+				// Avoid warning because $totalToShip is ''
3586 3898
 				$totalToShip+=$line->qty_shipped;   // defined for shipment only
3587
-            }else if ($line->element == 'commandefournisseurdispatch' && isset($line->qty))
3899
+            } else if ($line->element == 'commandefournisseurdispatch' && isset($line->qty))
3588 3900
             {
3589
-                if (empty($totalToShip)) $totalToShip=0;
3901
+                if (empty($totalToShip)) {
3902
+                    $totalToShip=0;
3903
+                }
3590 3904
                 $totalToShip+=$line->qty;   // defined for reception only
3591 3905
 			}
3592 3906
 
@@ -3594,8 +3908,7 @@  discard block
 block discarded – undo
3594 3908
 			if ($this->element == 'shipping') {
3595 3909
 				// for shipments
3596 3910
 				$qty = $line->qty_shipped ? $line->qty_shipped : 0;
3597
-			}
3598
-			else {
3911
+			} else {
3599 3912
 				$qty = $line->qty ? $line->qty : 0;
3600 3913
 			}
3601 3914
 
@@ -3611,19 +3924,30 @@  discard block
 block discarded – undo
3611 3924
 
3612 3925
 			$weightUnit=0;
3613 3926
 			$volumeUnit=0;
3614
-			if (! empty($weight_units)) $weightUnit = $weight_units;
3615
-			if (! empty($volume_units)) $volumeUnit = $volume_units;
3927
+			if (! empty($weight_units)) {
3928
+			    $weightUnit = $weight_units;
3929
+			}
3930
+			if (! empty($volume_units)) {
3931
+			    $volumeUnit = $volume_units;
3932
+			}
3616 3933
 
3617
-			if (empty($totalWeight)) $totalWeight=0;  // Avoid warning because $totalWeight is ''
3618
-			if (empty($totalVolume)) $totalVolume=0;  // Avoid warning because $totalVolume is ''
3934
+			if (empty($totalWeight)) {
3935
+			    $totalWeight=0;
3936
+			}
3937
+			// Avoid warning because $totalWeight is ''
3938
+			if (empty($totalVolume)) {
3939
+			    $totalVolume=0;
3940
+			}
3941
+			// Avoid warning because $totalVolume is ''
3619 3942
 
3620 3943
 			//var_dump($line->volume_units);
3621
-			if ($weight_units < 50)   // >50 means a standard unit (power of 10 of official unit), > 50 means an exotic unit (like inch)
3944
+			if ($weight_units < 50) {
3945
+			    // >50 means a standard unit (power of 10 of official unit), > 50 means an exotic unit (like inch)
3622 3946
 			{
3623 3947
 				$trueWeightUnit=pow(10, $weightUnit);
3624
-				$totalWeight += $weight * $qty * $trueWeightUnit;
3625 3948
 			}
3626
-			else {
3949
+				$totalWeight += $weight * $qty * $trueWeightUnit;
3950
+			} else {
3627 3951
 		if ($weight_units == 99) {
3628 3952
 			// conversion 1 Pound = 0.45359237 KG
3629 3953
 			$trueWeightUnit = 0.45359237;
@@ -3632,18 +3956,20 @@  discard block
 block discarded – undo
3632 3956
 			// conversion 1 Ounce = 0.0283495 KG
3633 3957
 			$trueWeightUnit = 0.0283495;
3634 3958
 			$totalWeight += $weight * $qty * $trueWeightUnit;
3959
+		} else {
3960
+							$totalWeight += $weight * $qty;
3635 3961
 		}
3636
-		else
3637
-					$totalWeight += $weight * $qty;   // This may be wrong if we mix different units
3962
+		// This may be wrong if we mix different units
3638 3963
 			}
3639
-			if ($volume_units < 50)   // >50 means a standard unit (power of 10 of official unit), > 50 means an exotic unit (like inch)
3964
+			if ($volume_units < 50) {
3965
+			    // >50 means a standard unit (power of 10 of official unit), > 50 means an exotic unit (like inch)
3640 3966
 			{
3641 3967
 				//print $line->volume."x".$line->volume_units."x".($line->volume_units < 50)."x".$volumeUnit;
3642 3968
 				$trueVolumeUnit=pow(10, $volumeUnit);
3969
+			}
3643 3970
 				//print $line->volume;
3644 3971
 				$totalVolume += $volume * $qty * $trueVolumeUnit;
3645
-			}
3646
-			else
3972
+			} else
3647 3973
 			{
3648 3974
 				$totalVolume += $volume * $qty;   // This may be wrong if we mix different units
3649 3975
 			}
@@ -3675,8 +4001,7 @@  discard block
 block discarded – undo
3675 4001
 			$this->error=$this->db->lasterror();
3676 4002
 			$this->db->rollback();
3677 4003
 			return -1;
3678
-		}
3679
-		else
4004
+		} else
3680 4005
 		{
3681 4006
 			$this->db->commit();
3682 4007
 			return 1;
@@ -3728,13 +4053,11 @@  discard block
 block discarded – undo
3728 4053
 			{
3729 4054
 				$res = $this->db->fetch_object($resql);
3730 4055
 				return 'Incoterm : '.$res->code.' - '.$this->location_incoterms;
3731
-			}
3732
-			else
4056
+			} else
3733 4057
 			{
3734 4058
 				return '';
3735 4059
 			}
3736
-		}
3737
-		else
4060
+		} else
3738 4061
 		{
3739 4062
 			$this->errors[] = $this->db->lasterror();
3740 4063
 			return false;
@@ -3771,14 +4094,14 @@  discard block
 block discarded – undo
3771 4094
 					$this->libelle_incoterms = $obj->libelle;
3772 4095
 				}
3773 4096
 				return 1;
3774
-			}
3775
-			else
4097
+			} else
3776 4098
 			{
3777 4099
 				$this->errors[] = $this->db->lasterror();
3778 4100
 				return -1;
3779 4101
 			}
4102
+		} else {
4103
+		    return -1;
3780 4104
 		}
3781
-		else return -1;
3782 4105
 	}
3783 4106
 
3784 4107
 
@@ -3817,7 +4140,9 @@  discard block
 block discarded – undo
3817 4140
 			} else {
3818 4141
 				$res=include $tpl; // for debug
3819 4142
 			}
3820
-			if ($res) break;
4143
+			if ($res) {
4144
+			    break;
4145
+			}
3821 4146
 		}
3822 4147
 	}
3823 4148
 
@@ -3847,7 +4172,9 @@  discard block
 block discarded – undo
3847 4172
 
3848 4173
 		// Define usemargins
3849 4174
 		$usemargins=0;
3850
-		if (! empty($conf->margin->enabled) && ! empty($this->element) && in_array($this->element,array('facture','propal','commande'))) $usemargins=1;
4175
+		if (! empty($conf->margin->enabled) && ! empty($this->element) && in_array($this->element,array('facture','propal','commande'))) {
4176
+		    $usemargins=1;
4177
+		}
3851 4178
 
3852 4179
 		$num = count($this->lines);
3853 4180
 
@@ -3866,7 +4193,9 @@  discard block
 block discarded – undo
3866 4193
 			print '<tr class="liste_titre nodrag nodrop">';
3867 4194
 
3868 4195
 			// Adds a line numbering column
3869
-			if (! empty($conf->global->MAIN_VIEW_LINE_NUMBER)) print '<td class="linecolnum" align="center" width="5">&nbsp;</td>';
4196
+			if (! empty($conf->global->MAIN_VIEW_LINE_NUMBER)) {
4197
+			    print '<td class="linecolnum" align="center" width="5">&nbsp;</td>';
4198
+			}
3870 4199
 
3871 4200
 			// Description
3872 4201
 			print '<td class="linecoldescription">'.$langs->trans('Description').'</td>';
@@ -3883,9 +4212,13 @@  discard block
 block discarded – undo
3883 4212
 			print '<td class="linecoluht" align="right" width="80">'.$langs->trans('PriceUHT').'</td>';
3884 4213
 
3885 4214
 			// Multicurrency
3886
-			if (!empty($conf->multicurrency->enabled) && $this->multicurrency_code != $conf->currency) print '<td class="linecoluht_currency" align="right" width="80">'.$langs->trans('PriceUHTCurrency', $this->multicurrency_code).'</td>';
4215
+			if (!empty($conf->multicurrency->enabled) && $this->multicurrency_code != $conf->currency) {
4216
+			    print '<td class="linecoluht_currency" align="right" width="80">'.$langs->trans('PriceUHTCurrency', $this->multicurrency_code).'</td>';
4217
+			}
3887 4218
 
3888
-			if ($inputalsopricewithtax) print '<td align="right" width="80">'.$langs->trans('PriceUTTC').'</td>';
4219
+			if ($inputalsopricewithtax) {
4220
+			    print '<td align="right" width="80">'.$langs->trans('PriceUTTC').'</td>';
4221
+			}
3889 4222
 
3890 4223
 			// Qty
3891 4224
 			print '<td class="linecolqty" align="right">'.$langs->trans('Qty').'</td>';
@@ -3906,25 +4239,32 @@  discard block
 block discarded – undo
3906 4239
 			{
3907 4240
 				if (!empty($user->rights->margins->creer))
3908 4241
 				{
3909
-					if ($conf->global->MARGIN_TYPE == "1")
3910
-						print '<td class="linecolmargin1 margininfos" align="right" width="80">'.$langs->trans('BuyingPrice').'</td>';
3911
-					else
3912
-						print '<td class="linecolmargin1 margininfos" align="right" width="80">'.$langs->trans('CostPrice').'</td>';
4242
+					if ($conf->global->MARGIN_TYPE == "1") {
4243
+											print '<td class="linecolmargin1 margininfos" align="right" width="80">'.$langs->trans('BuyingPrice').'</td>';
4244
+					} else {
4245
+											print '<td class="linecolmargin1 margininfos" align="right" width="80">'.$langs->trans('CostPrice').'</td>';
4246
+					}
3913 4247
 				}
3914 4248
 
3915
-				if (! empty($conf->global->DISPLAY_MARGIN_RATES) && $user->rights->margins->liretous)
3916
-					print '<td class="linecolmargin2 margininfos" align="right" width="50">'.$langs->trans('MarginRate').'</td>';
3917
-				if (! empty($conf->global->DISPLAY_MARK_RATES) && $user->rights->margins->liretous)
3918
-					print '<td class="linecolmargin2 margininfos" align="right" width="50">'.$langs->trans('MarkRate').'</td>';
4249
+				if (! empty($conf->global->DISPLAY_MARGIN_RATES) && $user->rights->margins->liretous) {
4250
+									print '<td class="linecolmargin2 margininfos" align="right" width="50">'.$langs->trans('MarginRate').'</td>';
4251
+				}
4252
+				if (! empty($conf->global->DISPLAY_MARK_RATES) && $user->rights->margins->liretous) {
4253
+									print '<td class="linecolmargin2 margininfos" align="right" width="50">'.$langs->trans('MarkRate').'</td>';
4254
+				}
3919 4255
 			}
3920 4256
 
3921 4257
 			// Total HT
3922 4258
 			print '<td class="linecolht" align="right">'.$langs->trans('TotalHTShort').'</td>';
3923 4259
 
3924 4260
 			// Multicurrency
3925
-			if (!empty($conf->multicurrency->enabled) && $this->multicurrency_code != $conf->currency) print '<td class="linecoltotalht_currency" align="right">'.$langs->trans('TotalHTShortCurrency', $this->multicurrency_code).'</td>';
4261
+			if (!empty($conf->multicurrency->enabled) && $this->multicurrency_code != $conf->currency) {
4262
+			    print '<td class="linecoltotalht_currency" align="right">'.$langs->trans('TotalHTShortCurrency', $this->multicurrency_code).'</td>';
4263
+			}
3926 4264
 
3927
-			if ($outputalsopricetotalwithtax) print '<td align="right" width="80">'.$langs->trans('TotalTTCShort').'</td>';
4265
+			if ($outputalsopricetotalwithtax) {
4266
+			    print '<td align="right" width="80">'.$langs->trans('TotalTTCShort').'</td>';
4267
+			}
3928 4268
 
3929 4269
 			print '<td class="linecoledit"></td>';  // No width to allow autodim
3930 4270
 
@@ -3954,14 +4294,15 @@  discard block
 block discarded – undo
3954 4294
 			$line->fetch_optionals();
3955 4295
 
3956 4296
 			//if (is_object($hookmanager) && (($line->product_type == 9 && ! empty($line->special_code)) || ! empty($line->fk_parent_line)))
3957
-			if (is_object($hookmanager))   // Old code is commented on preceding line.
4297
+			if (is_object($hookmanager)) {
4298
+			    // Old code is commented on preceding line.
3958 4299
 			{
3959 4300
 				if (empty($line->fk_parent_line))
3960 4301
 				{
3961 4302
 					$parameters = array('line'=>$line,'var'=>$var,'num'=>$num,'i'=>$i,'dateSelector'=>$dateSelector,'seller'=>$seller,'buyer'=>$buyer,'selected'=>$selected, 'extrafieldsline'=>$extrafieldsline);
4303
+			}
3962 4304
 					$reshook = $hookmanager->executeHooks('printObjectLine', $parameters, $this, $action);    // Note that $action and $object may have been modified by some hooks
3963
-				}
3964
-				else
4305
+				} else
3965 4306
 				{
3966 4307
 					$parameters = array('line'=>$line,'var'=>$var,'num'=>$num,'i'=>$i,'dateSelector'=>$dateSelector,'seller'=>$seller,'buyer'=>$buyer,'selected'=>$selected, 'extrafieldsline'=>$extrafieldsline, 'fk_parent_line'=>$line->fk_parent_line);
3967 4308
 					$reshook = $hookmanager->executeHooks('printObjectSubLine', $parameters, $this, $action);    // Note that $action and $object may have been modified by some hooks
@@ -4008,8 +4349,14 @@  discard block
 block discarded – undo
4008 4349
 		// Show product and description
4009 4350
 		$type=(! empty($line->product_type)?$line->product_type:$line->fk_product_type);
4010 4351
 		// Try to enhance type detection using date_start and date_end for free lines where type was not saved.
4011
-		if (! empty($line->date_start)) $type=1; // deprecated
4012
-		if (! empty($line->date_end)) $type=1; // deprecated
4352
+		if (! empty($line->date_start)) {
4353
+		    $type=1;
4354
+		}
4355
+		// deprecated
4356
+		if (! empty($line->date_end)) {
4357
+		    $type=1;
4358
+		}
4359
+		// deprecated
4013 4360
 
4014 4361
 		// Ligne en mode visu
4015 4362
 		if ($action != 'editline' || $selected != $line->id)
@@ -4038,8 +4385,13 @@  discard block
 block discarded – undo
4038 4385
 
4039 4386
 					$outputlangs = $langs;
4040 4387
 					$newlang='';
4041
-					if (empty($newlang) && GETPOST('lang_id','aZ09')) $newlang=GETPOST('lang_id','aZ09');
4042
-					if (! empty($conf->global->PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE) && empty($newlang)) $newlang=$this->thirdparty->default_lang;		// For language to language of customer
4388
+					if (empty($newlang) && GETPOST('lang_id','aZ09')) {
4389
+					    $newlang=GETPOST('lang_id','aZ09');
4390
+					}
4391
+					if (! empty($conf->global->PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE) && empty($newlang)) {
4392
+					    $newlang=$this->thirdparty->default_lang;
4393
+					}
4394
+					// For language to language of customer
4043 4395
 					if (! empty($newlang))
4044 4396
 					{
4045 4397
 						$outputlangs = new Translate("",$conf);
@@ -4047,8 +4399,7 @@  discard block
 block discarded – undo
4047 4399
 					}
4048 4400
 
4049 4401
 					$label = (! empty($prod->multilangs[$outputlangs->defaultlang]["label"])) ? $prod->multilangs[$outputlangs->defaultlang]["label"] : $line->product_label;
4050
-				}
4051
-				else
4402
+				} else
4052 4403
 				{
4053 4404
 					$label = $line->product_label;
4054 4405
 				}
@@ -4070,7 +4421,9 @@  discard block
 block discarded – undo
4070 4421
 				} else {
4071 4422
 					$res=include $tpl; // for debug
4072 4423
 				}
4073
-				if ($res) break;
4424
+				if ($res) {
4425
+				    break;
4426
+				}
4074 4427
 			}
4075 4428
 		}
4076 4429
 
@@ -4093,7 +4446,9 @@  discard block
 block discarded – undo
4093 4446
 				} else {
4094 4447
 					$res=include $tpl; // for debug
4095 4448
 				}
4096
-				if ($res) break;
4449
+				if ($res) {
4450
+				    break;
4451
+				}
4097 4452
 			}
4098 4453
 		}
4099 4454
 	}
@@ -4120,7 +4475,9 @@  discard block
 block discarded – undo
4120 4475
 		print '<td>'.$langs->trans('Description').'</td>';
4121 4476
 		print '<td align="right">'.$langs->trans('VATRate').'</td>';
4122 4477
 		print '<td align="right">'.$langs->trans('PriceUHT').'</td>';
4123
-		if (!empty($conf->multicurrency->enabled)) print '<td align="right">'.$langs->trans('PriceUHTCurrency').'</td>';
4478
+		if (!empty($conf->multicurrency->enabled)) {
4479
+		    print '<td align="right">'.$langs->trans('PriceUHTCurrency').'</td>';
4480
+		}
4124 4481
 		print '<td align="right">'.$langs->trans('Qty').'</td>';
4125 4482
 		if($conf->global->PRODUCT_USE_UNITS)
4126 4483
 		{
@@ -4143,8 +4500,7 @@  discard block
 block discarded – undo
4143 4500
 						$action='';
4144 4501
 						$hookmanager->executeHooks('printOriginObjectLine',$parameters,$this,$action);    // Note that $action and $object may have been modified by some hooks
4145 4502
 					}
4146
-				}
4147
-				else
4503
+				} else
4148 4504
 				{
4149 4505
 					$this->printOriginLine($line, $var, $restrictlist);
4150 4506
 				}
@@ -4173,32 +4529,37 @@  discard block
 block discarded – undo
4173 4529
 		if (!empty($line->date_start))
4174 4530
 		{
4175 4531
 			$date_start=$line->date_start;
4176
-		}
4177
-		else
4532
+		} else
4178 4533
 		{
4179 4534
 			$date_start=$line->date_debut_prevue;
4180
-			if ($line->date_debut_reel) $date_start=$line->date_debut_reel;
4535
+			if ($line->date_debut_reel) {
4536
+			    $date_start=$line->date_debut_reel;
4537
+			}
4181 4538
 		}
4182 4539
 		if (!empty($line->date_end))
4183 4540
 		{
4184 4541
 			$date_end=$line->date_end;
4185
-		}
4186
-		else
4542
+		} else
4187 4543
 		{
4188 4544
 			$date_end=$line->date_fin_prevue;
4189
-			if ($line->date_fin_reel) $date_end=$line->date_fin_reel;
4545
+			if ($line->date_fin_reel) {
4546
+			    $date_end=$line->date_fin_reel;
4547
+			}
4190 4548
 		}
4191 4549
 
4192 4550
 		$this->tpl['label'] = '';
4193
-		if (! empty($line->fk_parent_line)) $this->tpl['label'].= img_picto('', 'rightarrow');
4551
+		if (! empty($line->fk_parent_line)) {
4552
+		    $this->tpl['label'].= img_picto('', 'rightarrow');
4553
+		}
4194 4554
 
4195
-		if (($line->info_bits & 2) == 2)  // TODO Not sure this is used for source object
4555
+		if (($line->info_bits & 2) == 2) {
4556
+		    // TODO Not sure this is used for source object
4196 4557
 		{
4197 4558
 			$discount=new DiscountAbsolute($this->db);
4559
+		}
4198 4560
 			$discount->fk_soc = $this->socid;
4199 4561
 			$this->tpl['label'].= $discount->getNomUrl(0,'discount');
4200
-		}
4201
-		else if (! empty($line->fk_product))
4562
+		} else if (! empty($line->fk_product))
4202 4563
 		{
4203 4564
 			$productstatic = new Product($this->db);
4204 4565
 			$productstatic->id = $line->fk_product;
@@ -4216,13 +4577,12 @@  discard block
 block discarded – undo
4216 4577
 			{
4217 4578
 				$this->tpl['label'].= get_date_range($date_start,$date_end);
4218 4579
 			}
4219
-		}
4220
-		else
4580
+		} else
4221 4581
 		{
4222 4582
 			$this->tpl['label'].= ($line->product_type == -1 ? '&nbsp;' : ($line->product_type == 1 ? img_object($langs->trans(''),'service') : img_object($langs->trans(''),'product')));
4223 4583
 			if (!empty($line->desc)) {
4224 4584
 				$this->tpl['label'].=$line->desc;
4225
-			}else {
4585
+			} else {
4226 4586
 				$this->tpl['label'].= ($line->label ? '&nbsp;'.$line->label : '');
4227 4587
 			}
4228 4588
 			
@@ -4235,36 +4595,35 @@  discard block
 block discarded – undo
4235 4595
 
4236 4596
 		if (! empty($line->desc))
4237 4597
 		{
4238
-			if ($line->desc == '(CREDIT_NOTE)')  // TODO Not sure this is used for source object
4598
+			if ($line->desc == '(CREDIT_NOTE)') {
4599
+			    // TODO Not sure this is used for source object
4239 4600
 			{
4240 4601
 				$discount=new DiscountAbsolute($this->db);
4602
+			}
4241 4603
 				$discount->fetch($line->fk_remise_except);
4242 4604
 				$this->tpl['description'] = $langs->transnoentities("DiscountFromCreditNote",$discount->getNomUrl(0));
4243
-			}
4244
-			elseif ($line->desc == '(DEPOSIT)')  // TODO Not sure this is used for source object
4605
+			} elseif ($line->desc == '(DEPOSIT)') {
4606
+			    // TODO Not sure this is used for source object
4245 4607
 			{
4246 4608
 				$discount=new DiscountAbsolute($this->db);
4609
+			}
4247 4610
 				$discount->fetch($line->fk_remise_except);
4248 4611
 				$this->tpl['description'] = $langs->transnoentities("DiscountFromDeposit",$discount->getNomUrl(0));
4249
-			}
4250
-			elseif ($line->desc == '(EXCESS RECEIVED)')
4612
+			} elseif ($line->desc == '(EXCESS RECEIVED)')
4251 4613
 			{
4252 4614
 				$discount=new DiscountAbsolute($this->db);
4253 4615
 				$discount->fetch($line->fk_remise_except);
4254 4616
 				$this->tpl['description'] = $langs->transnoentities("DiscountFromExcessReceived",$discount->getNomUrl(0));
4255
-			}
4256
-			elseif ($line->desc == '(EXCESS PAID)')
4617
+			} elseif ($line->desc == '(EXCESS PAID)')
4257 4618
 			{
4258 4619
 				$discount=new DiscountAbsolute($this->db);
4259 4620
 				$discount->fetch($line->fk_remise_except);
4260 4621
 				$this->tpl['description'] = $langs->transnoentities("DiscountFromExcessPaid",$discount->getNomUrl(0));
4261
-			}
4262
-			else
4622
+			} else
4263 4623
 			{
4264 4624
 				$this->tpl['description'] = dol_trunc($line->desc,60);
4265 4625
 			}
4266
-		}
4267
-		else
4626
+		} else
4268 4627
 		{
4269 4628
 			$this->tpl['description'] = '&nbsp;';
4270 4629
 		}
@@ -4272,17 +4631,23 @@  discard block
 block discarded – undo
4272 4631
         // VAT Rate
4273 4632
         $this->tpl['vat_rate'] = vatrate($line->tva_tx, true);
4274 4633
         $this->tpl['vat_rate'] .= (($line->info_bits & 1) == 1) ? '*' : '';
4275
-        if (! empty($line->vat_src_code) && ! preg_match('/\(/', $this->tpl['vat_rate'])) $this->tpl['vat_rate'].=' ('.$line->vat_src_code.')';
4634
+        if (! empty($line->vat_src_code) && ! preg_match('/\(/', $this->tpl['vat_rate'])) {
4635
+            $this->tpl['vat_rate'].=' ('.$line->vat_src_code.')';
4636
+        }
4276 4637
 
4277 4638
 		$this->tpl['price'] = price($line->subprice);
4278 4639
 		$this->tpl['multicurrency_price'] = price($line->multicurrency_subprice);
4279 4640
 		$this->tpl['qty'] = (($line->info_bits & 2) != 2) ? $line->qty : '&nbsp;';
4280
-		if ($conf->global->PRODUCT_USE_UNITS) $this->tpl['unit'] = $langs->transnoentities($line->getLabelOfUnit('long'));
4641
+		if ($conf->global->PRODUCT_USE_UNITS) {
4642
+		    $this->tpl['unit'] = $langs->transnoentities($line->getLabelOfUnit('long'));
4643
+		}
4281 4644
 		$this->tpl['remise_percent'] = (($line->info_bits & 2) != 2) ? vatrate($line->remise_percent, true) : '&nbsp;';
4282 4645
 
4283 4646
 		// Is the line strike or not
4284 4647
 		$this->tpl['strike']=0;
4285
-		if ($restrictlist == 'services' && $line->product_type != Product::TYPE_SERVICE) $this->tpl['strike']=1;
4648
+		if ($restrictlist == 'services' && $line->product_type != Product::TYPE_SERVICE) {
4649
+		    $this->tpl['strike']=1;
4650
+		}
4286 4651
 
4287 4652
 		// Output template part (modules that overwrite templates must declare this into descriptor)
4288 4653
 		// Use global variables + $dateSelector + $seller and $buyer
@@ -4295,7 +4660,9 @@  discard block
 block discarded – undo
4295 4660
 			} else {
4296 4661
 				$res=include $tpl; // for debug
4297 4662
 			}
4298
-			if ($res) break;
4663
+			if ($res) {
4664
+			    break;
4665
+			}
4299 4666
 		}
4300 4667
 	}
4301 4668
 
@@ -4337,8 +4704,7 @@  discard block
 block discarded – undo
4337 4704
 		{
4338 4705
 			$this->db->commit();
4339 4706
 			return 1;
4340
-		}
4341
-		else
4707
+		} else
4342 4708
 		{
4343 4709
 			$this->error=$this->db->lasterror();
4344 4710
 			$this->db->rollback();
@@ -4373,8 +4739,7 @@  discard block
 block discarded – undo
4373 4739
 			$this->error=$this->db->lasterror();
4374 4740
 			$this->db->rollback();
4375 4741
 			return -1;
4376
-		}
4377
-		else
4742
+		} else
4378 4743
 		{
4379 4744
 			if (! $notrigger)
4380 4745
 			{
@@ -4441,13 +4806,20 @@  discard block
 block discarded – undo
4441 4806
 		// Search template files
4442 4807
 		$file=''; $classname=''; $filefound=0;
4443 4808
 		$dirmodels=array('/');
4444
-		if (is_array($conf->modules_parts['models'])) $dirmodels=array_merge($dirmodels,$conf->modules_parts['models']);
4809
+		if (is_array($conf->modules_parts['models'])) {
4810
+		    $dirmodels=array_merge($dirmodels,$conf->modules_parts['models']);
4811
+		}
4445 4812
 		foreach($dirmodels as $reldir)
4446 4813
 		{
4447 4814
 			foreach(array('doc','pdf') as $prefix)
4448 4815
 			{
4449
-				if (in_array(get_class($this), array('Adherent'))) $file = $prefix."_".$modele.".class.php";     // Member module use prefix_module.class.php
4450
-				else $file = $prefix."_".$modele.".modules.php";
4816
+				if (in_array(get_class($this), array('Adherent'))) {
4817
+				    $file = $prefix."_".$modele.".class.php";
4818
+				}
4819
+				// Member module use prefix_module.class.php
4820
+				else {
4821
+				    $file = $prefix."_".$modele.".modules.php";
4822
+				}
4451 4823
 
4452 4824
 				// On verifie l'emplacement du modele
4453 4825
 				$file=dol_buildpath($reldir.$modelspath.$file,0);
@@ -4458,7 +4830,9 @@  discard block
 block discarded – undo
4458 4830
 					break;
4459 4831
 				}
4460 4832
 			}
4461
-			if ($filefound) break;
4833
+			if ($filefound) {
4834
+			    break;
4835
+			}
4462 4836
 		}
4463 4837
 
4464 4838
 		// If generator was found
@@ -4490,7 +4864,9 @@  discard block
 block discarded – undo
4490 4864
 						if (is_dir($tmpdir))
4491 4865
 						{
4492 4866
 							$tmpfiles=dol_dir_list($tmpdir,'files',0,'\.od(s|t)$','','name',SORT_ASC,0);
4493
-							if (count($tmpfiles)) $listoffiles=array_merge($listoffiles,$tmpfiles);
4867
+							if (count($tmpfiles)) {
4868
+							    $listoffiles=array_merge($listoffiles,$tmpfiles);
4869
+							}
4494 4870
 						}
4495 4871
 					}
4496 4872
 
@@ -4528,8 +4904,7 @@  discard block
 block discarded – undo
4528 4904
 			{
4529 4905
 				$arrayofrecords = array();   // The write_file of templates of adherent class need this var
4530 4906
 				$resultwritefile = $obj->write_file($this, $outputlangs, $srctemplatepath, 'member', 1, $moreparams);
4531
-			}
4532
-			else
4907
+			} else
4533 4908
 			{
4534 4909
 				$resultwritefile = $obj->write_file($this, $outputlangs, $srctemplatepath, $hidedetails, $hidedesc, $hideref, $moreparams);
4535 4910
 			}
@@ -4551,9 +4926,11 @@  discard block
 block discarded – undo
4551 4926
 					$destfile = basename($destfull);
4552 4927
 					$rel_dir = preg_replace('/^'.preg_quote(DOL_DATA_ROOT,'/').'/', '', $upload_dir);
4553 4928
 
4554
-					if (! preg_match('/[\\/]temp[\\/]|[\\/]thumbs|\.meta$/', $rel_dir))     // If not a tmp dir
4929
+					if (! preg_match('/[\\/]temp[\\/]|[\\/]thumbs|\.meta$/', $rel_dir)) {
4930
+					    // If not a tmp dir
4555 4931
 					{
4556 4932
 						$filename = basename($destfile);
4933
+					}
4557 4934
 						$rel_dir = preg_replace('/[\\/]$/', '', $rel_dir);
4558 4935
 						$rel_dir = preg_replace('/^[\\/]/', '', $rel_dir);
4559 4936
 
@@ -4566,18 +4943,30 @@  discard block
 block discarded – undo
4566 4943
 						if ($this->element == 'propal')
4567 4944
 						{
4568 4945
 							$useonlinesignature = $conf->global->MAIN_FEATURES_LEVEL;	// Replace this with 1 when feature to make online signature is ok
4569
-							if ($useonlinesignature) $setsharekey=true;
4570
-							if (! empty($conf->global->PROPOSAL_ALLOW_EXTERNAL_DOWNLOAD)) $setsharekey=true;
4946
+							if ($useonlinesignature) {
4947
+							    $setsharekey=true;
4948
+							}
4949
+							if (! empty($conf->global->PROPOSAL_ALLOW_EXTERNAL_DOWNLOAD)) {
4950
+							    $setsharekey=true;
4951
+							}
4952
+						}
4953
+						if ($this->element == 'commande'     && ! empty($conf->global->ORDER_ALLOW_EXTERNAL_DOWNLOAD)) {
4954
+						    $setsharekey=true;
4955
+						}
4956
+						if ($this->element == 'facture'      && ! empty($conf->global->INVOICE_ALLOW_EXTERNAL_DOWNLOAD)) {
4957
+						    $setsharekey=true;
4958
+						}
4959
+						if ($this->element == 'bank_account' && ! empty($conf->global->BANK_ACCOUNT_ALLOW_EXTERNAL_DOWNLOAD)) {
4960
+						    $setsharekey=true;
4571 4961
 						}
4572
-						if ($this->element == 'commande'     && ! empty($conf->global->ORDER_ALLOW_EXTERNAL_DOWNLOAD))        $setsharekey=true;
4573
-						if ($this->element == 'facture'      && ! empty($conf->global->INVOICE_ALLOW_EXTERNAL_DOWNLOAD))      $setsharekey=true;
4574
-						if ($this->element == 'bank_account' && ! empty($conf->global->BANK_ACCOUNT_ALLOW_EXTERNAL_DOWNLOAD)) $setsharekey=true;
4575 4962
 
4576 4963
 						if ($setsharekey)
4577 4964
 						{
4578
-							if (empty($ecmfile->share))	// Because object not found or share not set yet
4965
+							if (empty($ecmfile->share)) {
4966
+							    // Because object not found or share not set yet
4579 4967
 							{
4580 4968
 								require_once DOL_DOCUMENT_ROOT.'/core/lib/security2.lib.php';
4969
+							}
4581 4970
 								$ecmfile->share = getRandomPassword(true);
4582 4971
 							}
4583 4972
 						}
@@ -4594,8 +4983,7 @@  discard block
 block discarded – undo
4594 4983
 							{
4595 4984
 								setEventMessages($ecmfile->error, $ecmfile->errors, 'warnings');
4596 4985
 							}
4597
-						}
4598
-						else
4986
+						} else
4599 4987
 						{
4600 4988
 							$ecmfile->entity = $conf->entity;
4601 4989
 							$ecmfile->filepath = $rel_dir;
@@ -4622,17 +5010,20 @@  discard block
 block discarded – undo
4622 5010
 
4623 5011
 						// Update the last_main_doc field into main object (if documenent generator has property ->update_main_doc_field set)
4624 5012
 						$update_main_doc_field=0;
4625
-						if (! empty($obj->update_main_doc_field)) $update_main_doc_field=1;
5013
+						if (! empty($obj->update_main_doc_field)) {
5014
+						    $update_main_doc_field=1;
5015
+						}
4626 5016
 						if ($update_main_doc_field && ! empty($this->table_element))
4627 5017
 						{
4628 5018
 							$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element." SET last_main_doc = '".($ecmfile->filepath.'/'.$ecmfile->filename)."'";
4629 5019
 							$sql.= ' WHERE rowid = '.$this->id;
4630 5020
 							$resql = $this->db->query($sql);
4631
-							if (! $resql) dol_print_error($this->db);
5021
+							if (! $resql) {
5022
+							    dol_print_error($this->db);
5023
+							}
4632 5024
 						}
4633 5025
 					}
4634
-				}
4635
-				else
5026
+				} else
4636 5027
 				{
4637 5028
 					dol_syslog('Method ->write_file was called on object '.get_class($obj).' and return a success but the return array ->result["fullpath"] was not set.', LOG_WARNING);
4638 5029
 				}
@@ -4641,15 +5032,13 @@  discard block
 block discarded – undo
4641 5032
 				dol_meta_create($this);
4642 5033
 
4643 5034
 				return 1;
4644
-			}
4645
-			else
5035
+			} else
4646 5036
 			{
4647 5037
 				$outputlangs->charset_output=$sav_charset_output;
4648 5038
 				dol_print_error($this->db, "Error generating document for ".__CLASS__.". Error: ".$obj->error, $obj->errors);
4649 5039
 				return -1;
4650 5040
 			}
4651
-		}
4652
-		else
5041
+		} else
4653 5042
 		{
4654 5043
 			$this->error=$langs->trans("Error")." ".$langs->trans("ErrorFileDoesNotExists",$file);
4655 5044
 			dol_print_error('',$this->error);
@@ -4705,13 +5094,21 @@  discard block
 block discarded – undo
4705 5094
 		global $conf, $_POST;
4706 5095
 
4707 5096
 		// If param here has been posted, we use this value first.
4708
-		if (isset($_POST[$fieldname])) return GETPOST($fieldname, 2);
5097
+		if (isset($_POST[$fieldname])) {
5098
+		    return GETPOST($fieldname, 2);
5099
+		}
4709 5100
 
4710
-		if (isset($alternatevalue)) return $alternatevalue;
5101
+		if (isset($alternatevalue)) {
5102
+		    return $alternatevalue;
5103
+		}
4711 5104
 
4712 5105
 		$newelement=$this->element;
4713
-		if ($newelement == 'facture') $newelement='invoice';
4714
-		if ($newelement == 'commande') $newelement='order';
5106
+		if ($newelement == 'facture') {
5107
+		    $newelement='invoice';
5108
+		}
5109
+		if ($newelement == 'commande') {
5110
+		    $newelement='order';
5111
+		}
4715 5112
 		if (empty($newelement))
4716 5113
 		{
4717 5114
 			dol_syslog("Ask a default value using common method getDefaultCreateValueForField on an object with no property ->element defined. Return empty string.", LOG_WARNING);
@@ -4720,7 +5117,9 @@  discard block
 block discarded – undo
4720 5117
 
4721 5118
 		$keyforfieldname=strtoupper($newelement.'_DEFAULT_'.$fieldname);
4722 5119
 		//var_dump($keyforfieldname);
4723
-		if (isset($conf->global->$keyforfieldname)) return $conf->global->$keyforfieldname;
5120
+		if (isset($conf->global->$keyforfieldname)) {
5121
+		    return $conf->global->$keyforfieldname;
5122
+		}
4724 5123
 
4725 5124
 		// TODO Ad here a scan into table llx_overwrite_default with a filter on $this->element and $fieldname
4726 5125
 	}
@@ -4754,8 +5153,7 @@  discard block
 block discarded – undo
4754 5153
 			if (!empty($this->errors))
4755 5154
 			{
4756 5155
 				$this->errors=array_unique(array_merge($this->errors,$interface->errors));   // We use array_unique because when a trigger call another trigger on same object, this->errors is added twice.
4757
-			}
4758
-			else
5156
+			} else
4759 5157
 			{
4760 5158
 				$this->errors=$interface->errors;
4761 5159
 			}
@@ -4779,7 +5177,9 @@  discard block
 block discarded – undo
4779 5177
 	function fetch_optionals($rowid=null, $optionsArray=null)
4780 5178
 	{
4781 5179
         // phpcs:enable
4782
-		if (empty($rowid)) $rowid=$this->id;
5180
+		if (empty($rowid)) {
5181
+		    $rowid=$this->id;
5182
+		}
4783 5183
 
4784 5184
 		// To avoid SQL errors. Probably not the better solution though
4785 5185
 		if (!$this->table_element) {
@@ -4805,15 +5205,17 @@  discard block
 block discarded – undo
4805 5205
 				$extrafields->fetch_name_optionals_label($this->table_element);
4806 5206
 			}
4807 5207
 			$optionsArray = (! empty($extrafields->attributes[$this->table_element]['label'])?$extrafields->attributes[$this->table_element]['label']:null);
4808
-		}
4809
-		else
5208
+		} else
4810 5209
 		{
4811 5210
 			global $extrafields;
4812 5211
 			dol_syslog("Warning: fetch_optionals was called with param optionsArray defined when you should pass null now", LOG_WARNING);
4813 5212
 		}
4814 5213
 
4815 5214
 		$table_element = $this->table_element;
4816
-		if ($table_element == 'categorie') $table_element = 'categories'; // For compatibility
5215
+		if ($table_element == 'categorie') {
5216
+		    $table_element = 'categories';
5217
+		}
5218
+		// For compatibility
4817 5219
 
4818 5220
 		// Request to get complementary values
4819 5221
 		if (is_array($optionsArray) && count($optionsArray) > 0)
@@ -4849,8 +5251,7 @@  discard block
 block discarded – undo
4849 5251
 							{
4850 5252
 								//var_dump($extrafields->attributes[$this->table_element]['type'][$key]);
4851 5253
 								$this->array_options["options_".$key]=$this->db->jdate($value);
4852
-							}
4853
-							else
5254
+							} else
4854 5255
 							{
4855 5256
 								$this->array_options["options_".$key]=$value;
4856 5257
 							}
@@ -4862,10 +5263,12 @@  discard block
 block discarded – undo
4862 5263
 
4863 5264
 				$this->db->free($resql);
4864 5265
 
4865
-				if ($numrows) return $numrows;
4866
-				else return 0;
4867
-			}
4868
-			else
5266
+				if ($numrows) {
5267
+				    return $numrows;
5268
+				} else {
5269
+				    return 0;
5270
+				}
5271
+			} else
4869 5272
 			{
4870 5273
 				dol_print_error($this->db);
4871 5274
 				return -1;
@@ -4884,7 +5287,10 @@  discard block
 block discarded – undo
4884 5287
 		$this->db->begin();
4885 5288
 
4886 5289
 		$table_element = $this->table_element;
4887
-		if ($table_element == 'categorie') $table_element = 'categories'; // For compatibility
5290
+		if ($table_element == 'categorie') {
5291
+		    $table_element = 'categories';
5292
+		}
5293
+		// For compatibility
4888 5294
 
4889 5295
 		$sql_del = "DELETE FROM ".MAIN_DB_PREFIX.$table_element."_extrafields WHERE fk_object = ".$this->id;
4890 5296
 		dol_syslog(get_class($this)."::deleteExtraFields delete", LOG_DEBUG);
@@ -4894,8 +5300,7 @@  discard block
 block discarded – undo
4894 5300
 			$this->error=$this->db->lasterror();
4895 5301
 			$this->db->rollback();
4896 5302
 			return -1;
4897
-		}
4898
-		else
5303
+		} else
4899 5304
 		{
4900 5305
 			$this->db->commit();
4901 5306
 			return 1;
@@ -4916,11 +5321,16 @@  discard block
 block discarded – undo
4916 5321
 	{
4917 5322
 		global $conf,$langs,$user;
4918 5323
 
4919
-		if (empty($userused)) $userused=$user;
5324
+		if (empty($userused)) {
5325
+		    $userused=$user;
5326
+		}
4920 5327
 
4921 5328
 		$error=0;
4922 5329
 
4923
-		if (! empty($conf->global->MAIN_EXTRAFIELDS_DISABLED)) return 0;	// For avoid conflicts if trigger used
5330
+		if (! empty($conf->global->MAIN_EXTRAFIELDS_DISABLED)) {
5331
+		    return 0;
5332
+		}
5333
+		// For avoid conflicts if trigger used
4924 5334
 
4925 5335
 		if (! empty($this->array_options))
4926 5336
 		{
@@ -4933,10 +5343,13 @@  discard block
 block discarded – undo
4933 5343
 			//Eliminate copied source object extra_fields that do not exist in target object
4934 5344
 			$new_array_options=array();
4935 5345
 			foreach ($this->array_options as $key => $value) {
4936
-				if (in_array(substr($key,8), array_keys($target_extrafields)))	// We remove the 'options_' from $key for test
5346
+				if (in_array(substr($key,8), array_keys($target_extrafields))) {
5347
+				    // We remove the 'options_' from $key for test
4937 5348
 					$new_array_options[$key] = $value;
4938
-				elseif (in_array($key, array_keys($target_extrafields)))		// We test on $key that does not contains the 'options_' prefix
5349
+				} elseif (in_array($key, array_keys($target_extrafields))) {
5350
+				    // We test on $key that does not contains the 'options_' prefix
4939 5351
 					$new_array_options['options_'.$key] = $value;
5352
+				}
4940 5353
 			}
4941 5354
 
4942 5355
 			foreach($new_array_options as $key => $value)
@@ -4950,8 +5363,12 @@  discard block
 block discarded – undo
4950 5363
 			   	if ($attributeRequired)
4951 5364
 			   	{
4952 5365
 			   		$mandatorypb=false;
4953
-			   		if ($attributeType == 'link' && $this->array_options[$key] == '-1') $mandatorypb=true;
4954
-			   		if ($this->array_options[$key] === '') $mandatorypb=true;
5366
+			   		if ($attributeType == 'link' && $this->array_options[$key] == '-1') {
5367
+			   		    $mandatorypb=true;
5368
+			   		}
5369
+			   		if ($this->array_options[$key] === '') {
5370
+			   		    $mandatorypb=true;
5371
+			   		}
4955 5372
 			   		if ($mandatorypb)
4956 5373
 			   		{
4957 5374
 			   			dol_syslog($this->error);
@@ -4970,8 +5387,7 @@  discard block
 block discarded – undo
4970 5387
 			   			{
4971 5388
 			   				$this->errors[]=$langs->trans("ExtraFieldHasWrongValue", $attributeLabel);
4972 5389
 			   				return -1;
4973
-			  			}
4974
-			   			elseif ($value=='')
5390
+			  			} elseif ($value=='')
4975 5391
 			   			{
4976 5392
 			   				$new_array_options[$key] = null;
4977 5393
 			   			}
@@ -4983,8 +5399,7 @@  discard block
 block discarded – undo
4983 5399
 							dol_syslog($langs->trans("ExtraFieldHasWrongValue")." sur ".$attributeLabel."(".$value."is not '".$attributeType."')", LOG_DEBUG);
4984 5400
 							$this->errors[]=$langs->trans("ExtraFieldHasWrongValue", $attributeLabel);
4985 5401
 							return -1;
4986
-						}
4987
-						elseif ($value=='')
5402
+						} elseif ($value=='')
4988 5403
 						{
4989 5404
 							$new_array_options[$key] = null;
4990 5405
 						}
@@ -5009,27 +5424,27 @@  discard block
 block discarded – undo
5009 5424
 			   					//global $action;		// $action may be 'create', 'update', 'update_extras'...
5010 5425
 			   					//var_dump($action);
5011 5426
 			   					//var_dump($this->oldcopy);exit;
5012
-			   					if (is_object($this->oldcopy))		// If this->oldcopy is not defined, we can't know if we change attribute or not, so we must keep value
5427
+			   					if (is_object($this->oldcopy)) {
5428
+			   					    // If this->oldcopy is not defined, we can't know if we change attribute or not, so we must keep value
5013 5429
 			   					{
5014 5430
 			   						//var_dump($this->oldcopy->array_options[$key]); var_dump($this->array_options[$key]);
5015 5431
 				   					if ($this->array_options[$key] == $this->oldcopy->array_options[$key])	// If old value crypted in database is same than submited new value, it means we don't change it, so we don't update.
5016 5432
 				   					{
5017
-				   						$new_array_options[$key] = $this->array_options[$key];	// Value is kept
5018
-				   					}
5019
-									else
5433
+				   						$new_array_options[$key] = $this->array_options[$key];
5434
+			   					}
5435
+			   					// Value is kept
5436
+				   					} else
5020 5437
 									{
5021 5438
 										// var_dump($algo);
5022 5439
 										$newvalue = dol_hash($this->array_options[$key], $algo);
5023 5440
 										$new_array_options[$key] = $newvalue;
5024 5441
 									}
5025
-			   					}
5026
-			   					else
5442
+			   					} else
5027 5443
 			   					{
5028 5444
 			   						$new_array_options[$key] = $this->array_options[$key];	// Value is kept
5029 5445
 			   					}
5030 5446
 			   				}
5031
-			   			}
5032
-			   			else	// Common usage
5447
+			   			} else	// Common usage
5033 5448
 			   			{
5034 5449
 			   				$new_array_options[$key] = $this->array_options[$key];
5035 5450
 			   			}
@@ -5055,26 +5470,30 @@  discard block
 block discarded – undo
5055 5470
 						dol_include_once($InfoFieldList[1]);
5056 5471
 						if ($InfoFieldList[0] && class_exists($InfoFieldList[0]))
5057 5472
 						{
5058
-							if ($value == '-1')	// -1 is key for no defined in combo list of objects
5473
+							if ($value == '-1') {
5474
+							    // -1 is key for no defined in combo list of objects
5059 5475
 							{
5060 5476
 								$new_array_options[$key]='';
5061 5477
 							}
5062
-							elseif ($value)
5478
+							} elseif ($value)
5063 5479
 							{
5064 5480
 								$object = new $InfoFieldList[0]($this->db);
5065
-								if (is_numeric($value)) $res=$object->fetch($value);
5066
-								else $res=$object->fetch('',$value);
5481
+								if (is_numeric($value)) {
5482
+								    $res=$object->fetch($value);
5483
+								} else {
5484
+								    $res=$object->fetch('',$value);
5485
+								}
5067 5486
 
5068
-								if ($res > 0) $new_array_options[$key]=$object->id;
5069
-								else
5487
+								if ($res > 0) {
5488
+								    $new_array_options[$key]=$object->id;
5489
+								} else
5070 5490
 								{
5071 5491
 									$this->error="Id/Ref '".$value."' for object '".$object->element."' not found";
5072 5492
 									$this->db->rollback();
5073 5493
 									return -1;
5074 5494
 								}
5075 5495
 							}
5076
-						}
5077
-						else
5496
+						} else
5078 5497
 						{
5079 5498
 							dol_syslog('Error bad setup of extrafield', LOG_WARNING);
5080 5499
 						}
@@ -5085,7 +5504,10 @@  discard block
 block discarded – undo
5085 5504
 			$this->db->begin();
5086 5505
 
5087 5506
 			$table_element = $this->table_element;
5088
-			if ($table_element == 'categorie') $table_element = 'categories'; // For compatibility
5507
+			if ($table_element == 'categorie') {
5508
+			    $table_element = 'categories';
5509
+			}
5510
+			// For compatibility
5089 5511
 
5090 5512
 			$sql_del = "DELETE FROM ".MAIN_DB_PREFIX.$table_element."_extrafields WHERE fk_object = ".$this->id;
5091 5513
 			dol_syslog(get_class($this)."::insertExtraFields delete", LOG_DEBUG);
@@ -5096,8 +5518,10 @@  discard block
 block discarded – undo
5096 5518
 			{
5097 5519
 				$attributeKey = substr($key,8);   // Remove 'options_' prefix
5098 5520
 				// Add field of attribut
5099
-				if ($extrafields->attributes[$this->table_element]['type'][$attributeKey] != 'separate') // Only for other type than separator
5521
+				if ($extrafields->attributes[$this->table_element]['type'][$attributeKey] != 'separate') {
5522
+				    // Only for other type than separator
5100 5523
 					$sql.=",".$attributeKey;
5524
+				}
5101 5525
 			}
5102 5526
 			$sql .= ") VALUES (".$this->id;
5103 5527
 
@@ -5105,13 +5529,14 @@  discard block
 block discarded – undo
5105 5529
 			{
5106 5530
 				$attributeKey = substr($key,8);   // Remove 'options_' prefix
5107 5531
 				// Add field of attribute
5108
-				if ($extrafields->attributes[$this->table_element]['type'][$attributeKey] != 'separate') // Only for other type than separator)
5532
+				if ($extrafields->attributes[$this->table_element]['type'][$attributeKey] != 'separate') {
5533
+				    // Only for other type than separator)
5109 5534
 				{
5110 5535
 					if ($new_array_options[$key] != '')
5111 5536
 					{
5112 5537
 						$sql.=",'".$this->db->escape($new_array_options[$key])."'";
5113
-					}
5114
-					else
5538
+				}
5539
+					} else
5115 5540
 					{
5116 5541
 						$sql.=",null";
5117 5542
 					}
@@ -5132,7 +5557,9 @@  discard block
 block discarded – undo
5132 5557
 				// Call trigger
5133 5558
 				$this->context=array('extrafieldaddupdate'=>1);
5134 5559
 				$result=$this->call_trigger($trigger, $userused);
5135
-				if ($result < 0) $error++;
5560
+				if ($result < 0) {
5561
+				    $error++;
5562
+				}
5136 5563
 				// End call trigger
5137 5564
 			}
5138 5565
 
@@ -5140,14 +5567,14 @@  discard block
 block discarded – undo
5140 5567
 			{
5141 5568
 				$this->db->rollback();
5142 5569
 				return -1;
5143
-			}
5144
-			else
5570
+			} else
5145 5571
 			{
5146 5572
 				$this->db->commit();
5147 5573
 				return 1;
5148 5574
 			}
5575
+		} else {
5576
+		    return 0;
5149 5577
 		}
5150
-		else return 0;
5151 5578
 	}
5152 5579
 
5153 5580
 	/**
@@ -5164,11 +5591,16 @@  discard block
 block discarded – undo
5164 5591
 	{
5165 5592
 		global $conf,$langs,$user;
5166 5593
 
5167
-		if (empty($userused)) $userused=$user;
5594
+		if (empty($userused)) {
5595
+		    $userused=$user;
5596
+		}
5168 5597
 
5169 5598
 		$error=0;
5170 5599
 
5171
-		if (! empty($conf->global->MAIN_EXTRAFIELDS_DISABLED)) return 0;	// For avoid conflicts if trigger used
5600
+		if (! empty($conf->global->MAIN_EXTRAFIELDS_DISABLED)) {
5601
+		    return 0;
5602
+		}
5603
+		// For avoid conflicts if trigger used
5172 5604
 
5173 5605
 		if (! empty($this->array_options) && isset($this->array_options["options_".$key]))
5174 5606
 		{
@@ -5195,8 +5627,7 @@  discard block
 block discarded – undo
5195 5627
 					{
5196 5628
 						$this->errors[]=$langs->trans("ExtraFieldHasWrongValue",$attributeLabel);
5197 5629
 						return -1;
5198
-					}
5199
-					elseif ($value=='')
5630
+					} elseif ($value=='')
5200 5631
 					{
5201 5632
 						$this->array_options["options_".$key] = null;
5202 5633
 					}
@@ -5208,8 +5639,7 @@  discard block
 block discarded – undo
5208 5639
 						dol_syslog($langs->trans("ExtraFieldHasWrongValue")." sur ".$attributeLabel."(".$value."is not '".$attributeType."')", LOG_DEBUG);
5209 5640
 						$this->errors[]=$langs->trans("ExtraFieldHasWrongValue", $attributeLabel);
5210 5641
 						return -1;
5211
-					}
5212
-					elseif ($value=='')
5642
+					} elseif ($value=='')
5213 5643
 					{
5214 5644
 						$this->array_options["options_".$key] = null;
5215 5645
 					}
@@ -5261,7 +5691,9 @@  discard block
 block discarded – undo
5261 5691
 				// Call trigger
5262 5692
 				$this->context=array('extrafieldupdate'=>1);
5263 5693
 				$result=$this->call_trigger($trigger, $userused);
5264
-				if ($result < 0) $error++;
5694
+				if ($result < 0) {
5695
+				    $error++;
5696
+				}
5265 5697
 				// End call trigger
5266 5698
 			}
5267 5699
 
@@ -5270,14 +5702,14 @@  discard block
 block discarded – undo
5270 5702
 				dol_syslog(get_class($this) . "::".__METHOD__ . $this->error, LOG_ERR);
5271 5703
 				$this->db->rollback();
5272 5704
 				return -1;
5273
-			}
5274
-			else
5705
+			} else
5275 5706
 			{
5276 5707
 				$this->db->commit();
5277 5708
 				return 1;
5278 5709
 			}
5710
+		} else {
5711
+		    return 0;
5279 5712
 		}
5280
-		else return 0;
5281 5713
 	}
5282 5714
 
5283 5715
 
@@ -5352,8 +5784,11 @@  discard block
 block discarded – undo
5352 5784
 
5353 5785
 		if ($computed)
5354 5786
 		{
5355
-			if (! preg_match('/^search_/', $keyprefix)) return '<span class="opacitymedium">'.$langs->trans("AutomaticallyCalculated").'</span>';
5356
-			else return '';
5787
+			if (! preg_match('/^search_/', $keyprefix)) {
5788
+			    return '<span class="opacitymedium">'.$langs->trans("AutomaticallyCalculated").'</span>';
5789
+			} else {
5790
+			    return '';
5791
+			}
5357 5792
 		}
5358 5793
 
5359 5794
 
@@ -5367,33 +5802,27 @@  discard block
 block discarded – undo
5367 5802
 			if ($type == 'date')
5368 5803
 			{
5369 5804
 				$morecss = 'minwidth100imp';
5370
-			}
5371
-			elseif ($type == 'datetime')
5805
+			} elseif ($type == 'datetime')
5372 5806
 			{
5373 5807
 				$morecss = 'minwidth200imp';
5374
-			}
5375
-			elseif (in_array($type,array('int','integer','price')) || preg_match('/^double(\([0-9],[0-9]\)){0,1}/',$type))
5808
+			} elseif (in_array($type,array('int','integer','price')) || preg_match('/^double(\([0-9],[0-9]\)){0,1}/',$type))
5376 5809
 			{
5377 5810
 				$morecss = 'maxwidth75';
5378
-                        }elseif ($type == 'url')
5811
+                        } elseif ($type == 'url')
5379 5812
 			{
5380 5813
 				$morecss='minwidth400';
5381
-			}
5382
-			elseif ($type == 'boolean')
5814
+			} elseif ($type == 'boolean')
5383 5815
 			{
5384 5816
 				$morecss='';
5385
-			}
5386
-			else
5817
+			} else
5387 5818
 			{
5388 5819
 				if (round($size) < 12)
5389 5820
 				{
5390 5821
 					$morecss = 'minwidth100';
5391
-				}
5392
-				else if (round($size) <= 48)
5822
+				} else if (round($size) <= 48)
5393 5823
 				{
5394 5824
 					$morecss = 'minwidth200';
5395
-				}
5396
-				else
5825
+				} else
5397 5826
 				{
5398 5827
 					$morecss = 'minwidth400';
5399 5828
 				}
@@ -5408,52 +5837,50 @@  discard block
 block discarded – undo
5408 5837
 			$showtime = in_array($type,array('datetime')) ? 1 : 0;
5409 5838
 
5410 5839
 			// Do not show current date when field not required (see selectDate() method)
5411
-			if (!$required && $value == '') $value = '-1';
5840
+			if (!$required && $value == '') {
5841
+			    $value = '-1';
5842
+			}
5412 5843
 
5413 5844
 			// TODO Must also support $moreparam
5414 5845
 			$out = $form->selectDate($value, $keyprefix.$key.$keysuffix, $showtime, $showtime, $required, '', 1, (($keyprefix != 'search_' && $keyprefix != 'search_options_') ? 1 : 0), 0, 1);
5415
-		}
5416
-		elseif (in_array($type,array('int','integer')))
5846
+		} elseif (in_array($type,array('int','integer')))
5417 5847
 		{
5418 5848
 			$tmp=explode(',',$size);
5419 5849
 			$newsize=$tmp[0];
5420 5850
 			$out='<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" maxlength="'.$newsize.'" value="'.dol_escape_htmltag($value).'"'.($moreparam?$moreparam:'').'>';
5421
-		}
5422
-		elseif (preg_match('/varchar/', $type))
5851
+		} elseif (preg_match('/varchar/', $type))
5423 5852
 		{
5424 5853
 			$out='<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" maxlength="'.$size.'" value="'.dol_escape_htmltag($value).'"'.($moreparam?$moreparam:'').'>';
5425
-		}
5426
-		elseif (in_array($type, array('mail', 'phone', 'url')))
5854
+		} elseif (in_array($type, array('mail', 'phone', 'url')))
5427 5855
 		{
5428 5856
 			$out='<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" value="'.dol_escape_htmltag($value).'" '.($moreparam?$moreparam:'').'>';
5429
-		}
5430
-		elseif ($type == 'text')
5857
+		} elseif ($type == 'text')
5431 5858
 		{
5432
-			if (! preg_match('/search_/', $keyprefix))		// If keyprefix is search_ or search_options_, we must just use a simple text field
5859
+			if (! preg_match('/search_/', $keyprefix)) {
5860
+			    // If keyprefix is search_ or search_options_, we must just use a simple text field
5433 5861
 			{
5434 5862
 				require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
5863
+			}
5435 5864
 				$doleditor=new DolEditor($keyprefix.$key.$keysuffix,$value,'',200,'dolibarr_notes','In',false,false,false,ROWS_5,'90%');
5436 5865
 				$out=$doleditor->Create(1);
5437
-			}
5438
-			else
5866
+			} else
5439 5867
 			{
5440 5868
 				$out='<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" value="'.dol_escape_htmltag($value).'" '.($moreparam?$moreparam:'').'>';
5441 5869
 			}
5442
-		}
5443
-		elseif ($type == 'html')
5870
+		} elseif ($type == 'html')
5444 5871
 		{
5445
-			if (! preg_match('/search_/', $keyprefix))		// If keyprefix is search_ or search_options_, we must just use a simple text field
5872
+			if (! preg_match('/search_/', $keyprefix)) {
5873
+			    // If keyprefix is search_ or search_options_, we must just use a simple text field
5446 5874
 			{
5447 5875
 				require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
5876
+			}
5448 5877
 				$doleditor=new DolEditor($keyprefix.$key.$keysuffix,$value,'',200,'dolibarr_notes','In',false,false,! empty($conf->fckeditor->enabled) && $conf->global->FCKEDITOR_ENABLE_SOCIETE,ROWS_5,'90%');
5449 5878
 				$out=$doleditor->Create(1);
5450
-			}
5451
-			else
5879
+			} else
5452 5880
 			{
5453 5881
 				$out='<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" value="'.dol_escape_htmltag($value).'" '.($moreparam?$moreparam:'').'>';
5454 5882
 			}
5455
-		}
5456
-		elseif ($type == 'boolean')
5883
+		} elseif ($type == 'boolean')
5457 5884
 		{
5458 5885
 			$checked='';
5459 5886
 			if (!empty($value)) {
@@ -5462,22 +5889,19 @@  discard block
 block discarded – undo
5462 5889
 				$checked=' value="1" ';
5463 5890
 			}
5464 5891
 			$out='<input type="checkbox" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" '.$checked.' '.($moreparam?$moreparam:'').'>';
5465
-		}
5466
-		elseif ($type == 'price')
5892
+		} elseif ($type == 'price')
5467 5893
 		{
5468 5894
 			if (!empty($value)) {		// $value in memory is a php numeric, we format it into user number format.
5469 5895
 				$value=price($value);
5470 5896
 			}
5471 5897
 			$out='<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" value="'.$value.'" '.($moreparam?$moreparam:'').'> '.$langs->getCurrencySymbol($conf->currency);
5472
-		}
5473
-		elseif (preg_match('/^double(\([0-9],[0-9]\)){0,1}/',$type))
5898
+		} elseif (preg_match('/^double(\([0-9],[0-9]\)){0,1}/',$type))
5474 5899
 		{
5475 5900
 			if (!empty($value)) {		// $value in memory is a php numeric, we format it into user number format.
5476 5901
 				$value=price($value);
5477 5902
 			}
5478 5903
 			$out='<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" value="'.$value.'" '.($moreparam?$moreparam:'').'> ';
5479
-		}
5480
-		elseif ($type == 'select')
5904
+		} elseif ($type == 'select')
5481 5905
 		{
5482 5906
 			$out = '';
5483 5907
 			if (! empty($conf->use_javascript_ajax) && ! empty($conf->global->MAIN_EXTRAFIELDS_USE_SELECT2))
@@ -5487,10 +5911,14 @@  discard block
 block discarded – undo
5487 5911
 			}
5488 5912
 
5489 5913
 			$out.='<select class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" '.($moreparam?$moreparam:'').'>';
5490
-                if((! isset($this->fields[$key]['default'])) ||($this->fields[$key]['notnull']!=1))$out.='<option value="0">&nbsp;</option>';
5914
+                if((! isset($this->fields[$key]['default'])) ||($this->fields[$key]['notnull']!=1)) {
5915
+                    $out.='<option value="0">&nbsp;</option>';
5916
+                }
5491 5917
 			foreach ($param['options'] as $key => $val)
5492 5918
 			{
5493
-				if ((string) $key == '') continue;
5919
+				if ((string) $key == '') {
5920
+				    continue;
5921
+				}
5494 5922
 				list($val, $parent) = explode('|', $val);
5495 5923
 				$out.='<option value="'.$key.'"';
5496 5924
 				$out.= (((string) $value == (string) $key)?' selected':'');
@@ -5498,8 +5926,7 @@  discard block
 block discarded – undo
5498 5926
 				$out.='>'.$val.'</option>';
5499 5927
 			}
5500 5928
 			$out.='</select>';
5501
-		}
5502
-		elseif ($type == 'sellist')
5929
+		} elseif ($type == 'sellist')
5503 5930
 		{
5504 5931
 			$out = '';
5505 5932
 			if (! empty($conf->use_javascript_ajax) && ! empty($conf->global->MAIN_EXTRAFIELDS_USE_SELECT2))
@@ -5566,13 +5993,11 @@  discard block
 block discarded – undo
5566 5993
 					{
5567 5994
 						$sql.= ' as main, '.MAIN_DB_PREFIX .$InfoFieldList[0].'_extrafields as extra';
5568 5995
 						$sqlwhere.= ' WHERE extra.fk_object=main.'.$InfoFieldList[2]. ' AND '.$InfoFieldList[4];
5569
-					}
5570
-					else
5996
+					} else
5571 5997
 					{
5572 5998
 						$sqlwhere.= ' WHERE '.$InfoFieldList[4];
5573 5999
 					}
5574
-				}
5575
-				else
6000
+				} else
5576 6001
 				{
5577 6002
 					$sqlwhere.= ' WHERE 1=1';
5578 6003
 				}
@@ -5608,8 +6033,7 @@  discard block
 block discarded – undo
5608 6033
 							{
5609 6034
 								$labeltoshow.= $obj->$field_toshow.' ';
5610 6035
 							}
5611
-						}
5612
-						else
6036
+						} else
5613 6037
 						{
5614 6038
 							$labeltoshow=$obj->{$InfoFieldList[1]};
5615 6039
 						}
@@ -5622,25 +6046,25 @@  discard block
 block discarded – undo
5622 6046
 								$translabel=$langs->trans($obj->$field_toshow);
5623 6047
 								if ($translabel!=$obj->$field_toshow) {
5624 6048
 									$labeltoshow=dol_trunc($translabel,18).' ';
5625
-								}else {
6049
+								} else {
5626 6050
 									$labeltoshow=dol_trunc($obj->$field_toshow,18).' ';
5627 6051
 								}
5628 6052
 							}
5629 6053
 							$out.='<option value="'.$obj->rowid.'" selected>'.$labeltoshow.'</option>';
5630
-						}
5631
-						else
6054
+						} else
5632 6055
 						{
5633 6056
 							if (! $notrans)
5634 6057
 							{
5635 6058
 								$translabel=$langs->trans($obj->{$InfoFieldList[1]});
5636 6059
 								if ($translabel!=$obj->{$InfoFieldList[1]}) {
5637 6060
 									$labeltoshow=dol_trunc($translabel,18);
5638
-								}
5639
-								else {
6061
+								} else {
5640 6062
 									$labeltoshow=dol_trunc($obj->{$InfoFieldList[1]},18);
5641 6063
 								}
5642 6064
 							}
5643
-							if (empty($labeltoshow)) $labeltoshow='(not defined)';
6065
+							if (empty($labeltoshow)) {
6066
+							    $labeltoshow='(not defined)';
6067
+							}
5644 6068
 							if ($value==$obj->rowid)
5645 6069
 							{
5646 6070
 								$out.='<option value="'.$obj->rowid.'" selected>'.$labeltoshow.'</option>';
@@ -5660,19 +6084,16 @@  discard block
 block discarded – undo
5660 6084
 						$i++;
5661 6085
 					}
5662 6086
 					$this->db->free($resql);
5663
-				}
5664
-				else {
6087
+				} else {
5665 6088
 					print 'Error in request '.$sql.' '.$this->db->lasterror().'. Check setup of extra parameters.<br>';
5666 6089
 				}
5667 6090
 			}
5668 6091
 			$out.='</select>';
5669
-		}
5670
-		elseif ($type == 'checkbox')
6092
+		} elseif ($type == 'checkbox')
5671 6093
 		{
5672 6094
 			$value_arr=explode(',',$value);
5673 6095
 			$out=$form->multiselectarray($keyprefix.$key.$keysuffix, (empty($param['options'])?null:$param['options']), $value_arr, '', 0, '', 0, '100%');
5674
-		}
5675
-		elseif ($type == 'radio')
6096
+		} elseif ($type == 'radio')
5676 6097
 		{
5677 6098
 			$out='';
5678 6099
 			foreach ($param['options'] as $keyopt => $val)
@@ -5683,13 +6104,11 @@  discard block
 block discarded – undo
5683 6104
 				$out.= ($value==$keyopt?'checked':'');
5684 6105
 				$out.='/><label for="'.$keyprefix.$key.$keysuffix.'_'.$keyopt.'">'.$val.'</label><br>';
5685 6106
 			}
5686
-		}
5687
-		elseif ($type == 'chkbxlst')
6107
+		} elseif ($type == 'chkbxlst')
5688 6108
 		{
5689 6109
 			if (is_array($value)) {
5690 6110
 				$value_arr = $value;
5691
-			}
5692
-			else {
6111
+			} else {
5693 6112
 				$value_arr = explode(',', $value);
5694 6113
 			}
5695 6114
 
@@ -5804,8 +6223,9 @@  discard block
 block discarded – undo
5804 6223
 									$labeltoshow = dol_trunc($obj->{$InfoFieldList[1]}, 18);
5805 6224
 								}
5806 6225
 							}
5807
-							if (empty($labeltoshow))
5808
-								$labeltoshow = '(not defined)';
6226
+							if (empty($labeltoshow)) {
6227
+															$labeltoshow = '(not defined)';
6228
+							}
5809 6229
 
5810 6230
 								if (is_array($value_arr) && in_array($obj->rowid, $value_arr)) {
5811 6231
 									$data[$obj->rowid]=$labeltoshow;
@@ -5827,8 +6247,7 @@  discard block
 block discarded – undo
5827 6247
 					print 'Error in request ' . $sql . ' ' . $this->db->lasterror() . '. Check setup of extra parameters.<br>';
5828 6248
 				}
5829 6249
 			}
5830
-		}
5831
-		elseif ($type == 'link')
6250
+		} elseif ($type == 'link')
5832 6251
 		{
5833 6252
 			$param_list=array_keys($param['options']);				// $param_list='ObjectName:classPath'
5834 6253
 			$showempty=(($required && $default != '')?0:1);
@@ -5836,18 +6255,19 @@  discard block
 block discarded – undo
5836 6255
 			if ($conf->global->MAIN_FEATURES_LEVEL >= 2)
5837 6256
 			{
5838 6257
             			list($class,$classfile)=explode(':',$param_list[0]);
5839
-            			if (file_exists(dol_buildpath(dirname(dirname($classfile)).'/card.php'))) $url_path=dol_buildpath(dirname(dirname($classfile)).'/card.php',1);
5840
-            			else $url_path=dol_buildpath(dirname(dirname($classfile)).'/'.$class.'_card.php',1);
6258
+            			if (file_exists(dol_buildpath(dirname(dirname($classfile)).'/card.php'))) {
6259
+            			    $url_path=dol_buildpath(dirname(dirname($classfile)).'/card.php',1);
6260
+            			} else {
6261
+            			    $url_path=dol_buildpath(dirname(dirname($classfile)).'/'.$class.'_card.php',1);
6262
+            			}
5841 6263
             			$out.='<a class="butActionNew" href="'.$url_path.'?action=create&backtopage='.$_SERVER['PHP_SELF'].'"><span class="fa fa-plus-circle valignmiddle"></span></a>';
5842 6264
             			// TODO Add Javascript code to add input fields contents to new elements urls
5843 6265
 			}
5844
-		}
5845
-		elseif ($type == 'password')
6266
+		} elseif ($type == 'password')
5846 6267
 		{
5847 6268
 			// If prefix is 'search_', field is used as a filter, we use a common text field.
5848 6269
 			$out='<input type="'.($keyprefix=='search_'?'text':'password').'" class="flat '.$morecss.'" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" value="'.$value.'" '.($moreparam?$moreparam:'').'>';
5849
-		}
5850
-		elseif ($type == 'array')
6270
+		} elseif ($type == 'array')
5851 6271
 		{
5852 6272
 			$newval = $val;
5853 6273
 			$newval['type'] = 'varchar(256)';
@@ -5925,17 +6345,25 @@  discard block
 block discarded – undo
5925 6345
 		{
5926 6346
 			$type = 'varchar';		// convert varchar(xx) int varchar
5927 6347
 			$size = $reg[1];
6348
+		} elseif (preg_match('/varchar/', $type)) {
6349
+		    $type = 'varchar';
6350
+		}
6351
+		// convert varchar(xx) int varchar
6352
+		if (is_array($val['arrayofkeyval'])) {
6353
+		    $type='select';
6354
+		}
6355
+		if (preg_match('/^integer:(.*):(.*)/i', $val['type'], $reg)) {
6356
+		    $type='link';
5928 6357
 		}
5929
-		elseif (preg_match('/varchar/', $type)) $type = 'varchar';		// convert varchar(xx) int varchar
5930
-		if (is_array($val['arrayofkeyval'])) $type='select';
5931
-		if (preg_match('/^integer:(.*):(.*)/i', $val['type'], $reg)) $type='link';
5932 6358
 
5933 6359
 		$default=$val['default'];
5934 6360
 		$computed=$val['computed'];
5935 6361
 		$unique=$val['unique'];
5936 6362
 		$required=$val['required'];
5937 6363
 		$param=$val['param'];
5938
-		if (is_array($val['arrayofkeyval'])) $param['options'] = $val['arrayofkeyval'];
6364
+		if (is_array($val['arrayofkeyval'])) {
6365
+		    $param['options'] = $val['arrayofkeyval'];
6366
+		}
5939 6367
 		if (preg_match('/^integer:(.*):(.*)/i', $val['type'], $reg))
5940 6368
 		{
5941 6369
 			$type='link';
@@ -5946,7 +6374,9 @@  discard block
 block discarded – undo
5946 6374
 		$help=$val['help'];
5947 6375
 		$hidden=(($val['visible'] == 0) ? 1 : 0);			// If zero, we are sure it is hidden, otherwise we show. If it depends on mode (view/create/edit form or list, this must be filtered by caller)
5948 6376
 
5949
-		if ($hidden) return '';
6377
+		if ($hidden) {
6378
+		    return '';
6379
+		}
5950 6380
 
5951 6381
 		// If field is a computed field, value must become result of compute
5952 6382
 		if ($computed)
@@ -5962,36 +6392,29 @@  discard block
 block discarded – undo
5962 6392
 			{
5963 6393
 				//$showsize=10;
5964 6394
 				$showsize = 'minwidth100imp';
5965
-			}
5966
-			elseif ($type == 'datetime')
6395
+			} elseif ($type == 'datetime')
5967 6396
 			{
5968 6397
 				//$showsize=19;
5969 6398
 				$showsize = 'minwidth200imp';
5970
-			}
5971
-			elseif (in_array($type,array('int','double','price')))
6399
+			} elseif (in_array($type,array('int','double','price')))
5972 6400
 			{
5973 6401
 				//$showsize=10;
5974 6402
 				$showsize = 'maxwidth75';
5975
-			}
5976
-			elseif ($type == 'url')
6403
+			} elseif ($type == 'url')
5977 6404
 			{
5978 6405
 				$showsize='minwidth400';
5979
-			}
5980
-			elseif ($type == 'boolean')
6406
+			} elseif ($type == 'boolean')
5981 6407
 			{
5982 6408
 				$showsize='';
5983
-			}
5984
-			else
6409
+			} else
5985 6410
 			{
5986 6411
 				if (round($size) < 12)
5987 6412
 				{
5988 6413
 					$showsize = 'minwidth100';
5989
-				}
5990
-				else if (round($size) <= 48)
6414
+				} else if (round($size) <= 48)
5991 6415
 				{
5992 6416
 					$showsize = 'minwidth200';
5993
-				}
5994
-				else
6417
+				} else
5995 6418
 				{
5996 6419
 					//$showsize=48;
5997 6420
 					$showsize = 'minwidth400';
@@ -6000,59 +6423,52 @@  discard block
 block discarded – undo
6000 6423
 		}
6001 6424
 
6002 6425
 		// Format output value differently according to properties of field
6003
-		if ($key == 'ref' && method_exists($this, 'getNomUrl')) $value=$this->getNomUrl(1, '', 0, '', 1);
6004
-		elseif ($key == 'status' && method_exists($this, 'getLibStatut')) $value=$this->getLibStatut(3);
6005
-		elseif ($type == 'date')
6426
+		if ($key == 'ref' && method_exists($this, 'getNomUrl')) {
6427
+		    $value=$this->getNomUrl(1, '', 0, '', 1);
6428
+		} elseif ($key == 'status' && method_exists($this, 'getLibStatut')) {
6429
+		    $value=$this->getLibStatut(3);
6430
+		} elseif ($type == 'date')
6006 6431
 		{
6007 6432
 			if(! empty($value)) {
6008 6433
 				$value=dol_print_date($value,'day');
6009 6434
 			} else {
6010 6435
 				$value='';
6011 6436
 			}
6012
-		}
6013
-		elseif ($type == 'datetime')
6437
+		} elseif ($type == 'datetime')
6014 6438
 		{
6015 6439
 			if(! empty($value)) {
6016 6440
 				$value=dol_print_date($value,'dayhour');
6017 6441
 			} else {
6018 6442
 				$value='';
6019 6443
 			}
6020
-		}
6021
-		elseif ($type == 'double')
6444
+		} elseif ($type == 'double')
6022 6445
 		{
6023 6446
 			if (!empty($value)) {
6024 6447
 				$value=price($value);
6025 6448
 			}
6026
-		}
6027
-		elseif ($type == 'boolean')
6449
+		} elseif ($type == 'boolean')
6028 6450
 		{
6029 6451
 			$checked='';
6030 6452
 			if (!empty($value)) {
6031 6453
 				$checked=' checked ';
6032 6454
 			}
6033 6455
 			$value='<input type="checkbox" '.$checked.' '.($moreparam?$moreparam:'').' readonly disabled>';
6034
-		}
6035
-		elseif ($type == 'mail')
6456
+		} elseif ($type == 'mail')
6036 6457
 		{
6037 6458
 			$value=dol_print_email($value,0,0,0,64,1,1);
6038
-		}
6039
-		elseif ($type == 'url')
6459
+		} elseif ($type == 'url')
6040 6460
 		{
6041 6461
 			$value=dol_print_url($value,'_blank',32,1);
6042
-		}
6043
-		elseif ($type == 'phone')
6462
+		} elseif ($type == 'phone')
6044 6463
 		{
6045 6464
 			$value=dol_print_phone($value, '', 0, 0, '', '&nbsp;', 1);
6046
-		}
6047
-		elseif ($type == 'price')
6465
+		} elseif ($type == 'price')
6048 6466
 		{
6049 6467
 			$value=price($value,0,$langs,0,0,-1,$conf->currency);
6050
-		}
6051
-		elseif ($type == 'select')
6468
+		} elseif ($type == 'select')
6052 6469
 		{
6053 6470
 			$value=$param['options'][$value];
6054
-		}
6055
-		elseif ($type == 'sellist')
6471
+		} elseif ($type == 'sellist')
6056 6472
 		{
6057 6473
 			$param_list=array_keys($param['options']);
6058 6474
 			$InfoFieldList = explode(":", $param_list[0]);
@@ -6082,7 +6498,7 @@  discard block
 block discarded – undo
6082 6498
 				$sql.= " WHERE ".$selectkey."=0";
6083 6499
 			} elseif ($selectkey=='rowid') {
6084 6500
 				$sql.= " WHERE ".$selectkey."=".$this->db->escape($value);
6085
-			}else {
6501
+			} else {
6086 6502
 				$sql.= " WHERE ".$selectkey."='".$this->db->escape($value)."'";
6087 6503
 			}
6088 6504
 
@@ -6109,12 +6525,11 @@  discard block
 block discarded – undo
6109 6525
 						}
6110 6526
 						if ($translabel!=$field_toshow) {
6111 6527
 							$value.=dol_trunc($translabel,18).' ';
6112
-						}else {
6528
+						} else {
6113 6529
 							$value.=$obj->$field_toshow.' ';
6114 6530
 						}
6115 6531
 					}
6116
-				}
6117
-				else
6532
+				} else
6118 6533
 				{
6119 6534
 					$translabel='';
6120 6535
 					if (!empty($obj->{$InfoFieldList[1]})) {
@@ -6122,18 +6537,17 @@  discard block
 block discarded – undo
6122 6537
 					}
6123 6538
 					if ($translabel!=$obj->{$InfoFieldList[1]}) {
6124 6539
 						$value=dol_trunc($translabel,18);
6125
-					}else {
6540
+					} else {
6126 6541
 						$value=$obj->{$InfoFieldList[1]};
6127 6542
 					}
6128 6543
 				}
6544
+			} else {
6545
+			    dol_syslog(get_class($this).'::showOutputField error '.$this->db->lasterror(), LOG_WARNING);
6129 6546
 			}
6130
-			else dol_syslog(get_class($this).'::showOutputField error '.$this->db->lasterror(), LOG_WARNING);
6131
-		}
6132
-		elseif ($type == 'radio')
6547
+		} elseif ($type == 'radio')
6133 6548
 		{
6134 6549
 			$value=$param['options'][$value];
6135
-		}
6136
-		elseif ($type == 'checkbox')
6550
+		} elseif ($type == 'checkbox')
6137 6551
 		{
6138 6552
 			$value_arr=explode(',',$value);
6139 6553
 			$value='';
@@ -6144,8 +6558,7 @@  discard block
 block discarded – undo
6144 6558
 				}
6145 6559
 				$value='<div class="select2-container-multi-dolibarr" style="width: 90%;"><ul class="select2-choices-dolibarr">'.implode(' ', $toprint).'</ul></div>';
6146 6560
 			}
6147
-		}
6148
-		elseif ($type == 'chkbxlst')
6561
+		} elseif ($type == 'chkbxlst')
6149 6562
 		{
6150 6563
 			$value_arr = explode(',', $value);
6151 6564
 
@@ -6213,8 +6626,7 @@  discard block
 block discarded – undo
6213 6626
 			} else {
6214 6627
 				dol_syslog(get_class($this) . '::showOutputField error ' . $this->db->lasterror(), LOG_WARNING);
6215 6628
 			}
6216
-		}
6217
-		elseif ($type == 'link')
6629
+		} elseif ($type == 'link')
6218 6630
 		{
6219 6631
 			$out='';
6220 6632
 
@@ -6236,24 +6648,21 @@  discard block
 block discarded – undo
6236 6648
 						$object->fetch($value);
6237 6649
 						$value=$object->getNomUrl($getnomurlparam);
6238 6650
 					}
6239
-				}
6240
-				else
6651
+				} else
6241 6652
 				{
6242 6653
 					dol_syslog('Error bad setup of extrafield', LOG_WARNING);
6243 6654
 					return 'Error bad setup of extrafield';
6244 6655
 				}
6656
+			} else {
6657
+			    $value='';
6245 6658
 			}
6246
-			else $value='';
6247
-		}
6248
-		elseif ($type == 'text' || $type == 'html')
6659
+		} elseif ($type == 'text' || $type == 'html')
6249 6660
 		{
6250 6661
 			$value=dol_htmlentitiesbr($value);
6251
-		}
6252
-		elseif ($type == 'password')
6662
+		} elseif ($type == 'password')
6253 6663
 		{
6254 6664
 			$value=preg_replace('/./i','*',$value);
6255
-		}
6256
-		elseif ($type == 'array')
6665
+		} elseif ($type == 'array')
6257 6666
 		{
6258 6667
 			$value = implode('<br>', $value);
6259 6668
 		}
@@ -6280,7 +6689,9 @@  discard block
 block discarded – undo
6280 6689
 	{
6281 6690
 		global $db, $conf, $langs, $action, $form;
6282 6691
 
6283
-		if (! is_object($form)) $form=new Form($db);
6692
+		if (! is_object($form)) {
6693
+		    $form=new Form($db);
6694
+		}
6284 6695
 
6285 6696
 		$out = '';
6286 6697
 
@@ -6294,7 +6705,9 @@  discard block
 block discarded – undo
6294 6705
 			foreach($extrafields->attributes[$this->table_element]['label'] as $key=>$label)
6295 6706
 			{
6296 6707
 				// Show only the key field in params
6297
-				if (is_array($params) && array_key_exists('onlykey',$params) && $key != $params['onlykey']) continue;
6708
+				if (is_array($params) && array_key_exists('onlykey',$params) && $key != $params['onlykey']) {
6709
+				    continue;
6710
+				}
6298 6711
 
6299 6712
 				$enabled = 1;
6300 6713
 				if ($enabled && isset($extrafields->attributes[$this->table_element]['list'][$key]))
@@ -6308,11 +6721,18 @@  discard block
 block discarded – undo
6308 6721
 					$perms = dol_eval($extrafields->attributes[$this->table_element]['perms'][$key], 1);
6309 6722
 				}
6310 6723
 
6311
-				if (($mode == 'create' || $mode == 'edit') && abs($enabled) != 1 && abs($enabled) != 3) continue;	// <> -1 and <> 1 and <> 3 = not visible on forms, only on list
6312
-				if (empty($perms)) continue;
6724
+				if (($mode == 'create' || $mode == 'edit') && abs($enabled) != 1 && abs($enabled) != 3) {
6725
+				    continue;
6726
+				}
6727
+				// <> -1 and <> 1 and <> 3 = not visible on forms, only on list
6728
+				if (empty($perms)) {
6729
+				    continue;
6730
+				}
6313 6731
 
6314 6732
 				// Load language if required
6315
-				if (! empty($extrafields->attributes[$this->table_element]['langfile'][$key])) $langs->load($extrafields->attributes[$this->table_element]['langfile'][$key]);
6733
+				if (! empty($extrafields->attributes[$this->table_element]['langfile'][$key])) {
6734
+				    $langs->load($extrafields->attributes[$this->table_element]['langfile'][$key]);
6735
+				}
6316 6736
 
6317 6737
 				$colspan='3';
6318 6738
 				if (is_array($params) && count($params)>0) {
@@ -6346,8 +6766,7 @@  discard block
 block discarded – undo
6346 6766
 				if ($extrafields->attributes[$this->table_element]['type'][$key] == 'separate')
6347 6767
 				{
6348 6768
 					$out .= $extrafields->showSeparator($key, $this);
6349
-				}
6350
-				else
6769
+				} else
6351 6770
 				{
6352 6771
 					$csstyle='';
6353 6772
 					$class=(!empty($extrafields->attributes[$this->table_element]['hidden'][$key]) ? 'hideobject ' : '');
@@ -6377,10 +6796,12 @@  discard block
 block discarded – undo
6377 6796
 					if (in_array($extrafields->attributes[$this->table_element]['type'][$key],array('date','datetime')))
6378 6797
 					{
6379 6798
 						$datenotinstring = $this->array_options['options_' . $key];
6380
-						if (! is_numeric($this->array_options['options_' . $key]))	// For backward compatibility
6799
+						if (! is_numeric($this->array_options['options_' . $key])) {
6800
+						    // For backward compatibility
6381 6801
 						{
6382 6802
 							$datenotinstring = $this->db->jdate($datenotinstring);
6383 6803
 						}
6804
+						}
6384 6805
 						$value = GETPOSTISSET($keyprefix.'options_'.$key.$keysuffix)?dol_mktime(GETPOST($keyprefix.'options_'.$key.$keysuffix."hour", 'int', 3), GETPOST($keyprefix.'options_'.$key.$keysuffix."min",'int',3), 0, GETPOST($keyprefix.'options_'.$key.$keysuffix."month",'int',3), GETPOST($keyprefix.'options_'.$key.$keysuffix."day",'int',3), GETPOST($keyprefix.'options_'.$key.$keysuffix."year",'int',3)):$datenotinstring;
6385 6806
 					}
6386 6807
 					// Convert float submited string into real php numeric (value in memory must be a php numeric)
@@ -6392,11 +6813,18 @@  discard block
 block discarded – undo
6392 6813
 					$labeltoshow = $langs->trans($label);
6393 6814
 
6394 6815
 					$out .= '<td class="titlefield';
6395
-					if (GETPOST('action','none') == 'create') $out.='create';
6396
-					if ($mode != 'view' && ! empty($extrafields->attributes[$this->table_element]['required'][$key])) $out .= ' fieldrequired';
6816
+					if (GETPOST('action','none') == 'create') {
6817
+					    $out.='create';
6818
+					}
6819
+					if ($mode != 'view' && ! empty($extrafields->attributes[$this->table_element]['required'][$key])) {
6820
+					    $out .= ' fieldrequired';
6821
+					}
6397 6822
 					$out .= '">';
6398
-					if (! empty($extrafields->attributes[$object->table_element]['help'][$key])) $out .= $form->textwithpicto($labeltoshow, $extrafields->attributes[$object->table_element]['help'][$key]);
6399
-					else $out .= $labeltoshow;
6823
+					if (! empty($extrafields->attributes[$object->table_element]['help'][$key])) {
6824
+					    $out .= $form->textwithpicto($labeltoshow, $extrafields->attributes[$object->table_element]['help'][$key]);
6825
+					} else {
6826
+					    $out .= $labeltoshow;
6827
+					}
6400 6828
 					$out .= '</td>';
6401 6829
 
6402 6830
 					$html_id = !empty($this->id) ? $this->element.'_extras_'.$key.'_'.$this->id : '';
@@ -6413,8 +6841,11 @@  discard block
 block discarded – undo
6413 6841
 
6414 6842
 					$out .= '</td>';
6415 6843
 
6416
-					if (! empty($conf->global->MAIN_EXTRAFIELDS_USE_TWO_COLUMS) && (($e % 2) == 1)) $out .= '</tr>';
6417
-					else $out .= '</tr>';
6844
+					if (! empty($conf->global->MAIN_EXTRAFIELDS_USE_TWO_COLUMS) && (($e % 2) == 1)) {
6845
+					    $out .= '</tr>';
6846
+					} else {
6847
+					    $out .= '</tr>';
6848
+					}
6418 6849
 					$e++;
6419 6850
 				}
6420 6851
 			}
@@ -6466,7 +6897,9 @@  discard block
 block discarded – undo
6466 6897
 		global $user;
6467 6898
 
6468 6899
 		$element = $this->element;
6469
-		if ($element == 'facturerec') $element='facture';
6900
+		if ($element == 'facturerec') {
6901
+		    $element='facture';
6902
+		}
6470 6903
 
6471 6904
 		return $user->rights->{$element};
6472 6905
 	}
@@ -6491,7 +6924,10 @@  discard block
 block discarded – undo
6491 6924
 
6492 6925
 			if (! $db->query($sql))
6493 6926
 			{
6494
-				if ($ignoreerrors) return true;		// TODO Not enough. If there is A-B on kept thirdarty and B-C on old one, we must get A-B-C after merge. Not A-B.
6927
+				if ($ignoreerrors) {
6928
+				    return true;
6929
+				}
6930
+				// TODO Not enough. If there is A-B on kept thirdarty and B-C on old one, we must get A-B-C after merge. Not A-B.
6495 6931
 				//$this->errors = $db->lasterror();
6496 6932
 				return false;
6497 6933
 			}
@@ -6518,11 +6954,12 @@  discard block
 block discarded – undo
6518 6954
 
6519 6955
 		$buyPrice = 0;
6520 6956
 
6521
-		if (($unitPrice > 0) && (isset($conf->global->ForceBuyingPriceIfNull) && $conf->global->ForceBuyingPriceIfNull == 1)) // In most cases, test here is false
6957
+		if (($unitPrice > 0) && (isset($conf->global->ForceBuyingPriceIfNull) && $conf->global->ForceBuyingPriceIfNull == 1)) {
6958
+		    // In most cases, test here is false
6522 6959
 		{
6523 6960
 			$buyPrice = $unitPrice * (1 - $discountPercent / 100);
6524 6961
 		}
6525
-		else
6962
+		} else
6526 6963
 		{
6527 6964
 			// Get cost price for margin calculation
6528 6965
 			if (! empty($fk_product))
@@ -6540,13 +6977,11 @@  discard block
 block discarded – undo
6540 6977
 					if ($product->cost_price > 0)
6541 6978
 					{
6542 6979
 						$buyPrice = $product->cost_price;
6543
-					}
6544
-					else if ($product->pmp > 0)
6980
+					} else if ($product->pmp > 0)
6545 6981
 					{
6546 6982
 						$buyPrice = $product->pmp;
6547 6983
 					}
6548
-				}
6549
-				else if (isset($conf->global->MARGIN_TYPE) && $conf->global->MARGIN_TYPE == 'pmp')
6984
+				} else if (isset($conf->global->MARGIN_TYPE) && $conf->global->MARGIN_TYPE == 'pmp')
6550 6985
 				{
6551 6986
 					require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
6552 6987
 					$product = new Product($this->db);
@@ -6569,8 +7004,7 @@  discard block
 block discarded – undo
6569 7004
 					if (($result = $productFournisseur->find_min_price_product_fournisseur($fk_product)) > 0)
6570 7005
 					{
6571 7006
 						$buyPrice = $productFournisseur->fourn_unitprice;
6572
-					}
6573
-					else if ($result < 0)
7007
+					} else if ($result < 0)
6574 7008
 					{
6575 7009
 						$this->errors[] = $productFournisseur->error;
6576 7010
 						return -2;
@@ -6616,8 +7050,7 @@  discard block
 block discarded – undo
6616 7050
 		{
6617 7051
 			$dir .= get_exdir(0, 0, 0, 0, $this, $modulepart).$this->track_id.'/';
6618 7052
 			$pdir .= get_exdir(0, 0, 0, 0, $this, $modulepart).$this->track_id.'/';
6619
-		}
6620
-		else
7053
+		} else
6621 7054
 		{
6622 7055
 			$dir .= get_exdir(0, 0, 0, 0, $this, $modulepart).$this->ref.'/';
6623 7056
 			$pdir .= get_exdir(0, 0, 0, 0, $this, $modulepart).$this->ref.'/';
@@ -6680,19 +7113,26 @@  discard block
 block discarded – undo
6680 7113
 
6681 7114
 						// Find name of thumb file
6682 7115
 						$photo_vignette=basename(getImageFileNameForSize($dir.$file, '_small'));
6683
-						if (! dol_is_file($dirthumb.$photo_vignette)) $photo_vignette='';
7116
+						if (! dol_is_file($dirthumb.$photo_vignette)) {
7117
+						    $photo_vignette='';
7118
+						}
6684 7119
 
6685 7120
 						// Get filesize of original file
6686 7121
 						$imgarray=dol_getImageSize($dir.$photo);
6687 7122
 
6688 7123
 						if ($nbbyrow > 0)
6689 7124
 						{
6690
-							if ($nbphoto == 1) $return.= '<table width="100%" valign="top" align="center" border="0" cellpadding="2" cellspacing="2">';
7125
+							if ($nbphoto == 1) {
7126
+							    $return.= '<table width="100%" valign="top" align="center" border="0" cellpadding="2" cellspacing="2">';
7127
+							}
6691 7128
 
6692
-							if ($nbphoto % $nbbyrow == 1) $return.= '<tr align=center valign=middle border=1>';
7129
+							if ($nbphoto % $nbbyrow == 1) {
7130
+							    $return.= '<tr align=center valign=middle border=1>';
7131
+							}
6693 7132
 							$return.= '<td width="'.ceil(100/$nbbyrow).'%" class="photo">';
7133
+						} else if ($nbbyrow < 0) {
7134
+						    $return .= '<div class="inline-block">';
6694 7135
 						}
6695
-						else if ($nbbyrow < 0) $return .= '<div class="inline-block">';
6696 7136
 
6697 7137
 						$return.= "\n";
6698 7138
 
@@ -6700,15 +7140,20 @@  discard block
 block discarded – undo
6700 7140
 						if (empty($nolink))
6701 7141
 						{
6702 7142
 							$urladvanced=getAdvancedPreviewUrl($modulepart, $relativefile, 0, 'entity='.$this->entity);
6703
-							if ($urladvanced) $return.='<a href="'.$urladvanced.'">';
6704
-							else $return.= '<a href="'.DOL_URL_ROOT.'/viewimage.php?modulepart='.$modulepart.'&entity='.$this->entity.'&file='.urlencode($pdir.$photo).'" class="aphoto" target="_blank">';
7143
+							if ($urladvanced) {
7144
+							    $return.='<a href="'.$urladvanced.'">';
7145
+							} else {
7146
+							    $return.= '<a href="'.DOL_URL_ROOT.'/viewimage.php?modulepart='.$modulepart.'&entity='.$this->entity.'&file='.urlencode($pdir.$photo).'" class="aphoto" target="_blank">';
7147
+							}
6705 7148
 						}
6706 7149
 
6707 7150
 						// Show image (width height=$maxHeight)
6708 7151
 						// Si fichier vignette disponible et image source trop grande, on utilise la vignette, sinon on utilise photo origine
6709 7152
 						$alt=$langs->transnoentitiesnoconv('File').': '.$relativefile;
6710 7153
 						$alt.=' - '.$langs->transnoentitiesnoconv('Size').': '.$imgarray['width'].'x'.$imgarray['height'];
6711
-						if ($notitle) $alt='';
7154
+						if ($notitle) {
7155
+						    $alt='';
7156
+						}
6712 7157
 
6713 7158
 						if ($usesharelink)
6714 7159
 						{
@@ -6718,35 +7163,35 @@  discard block
 block discarded – undo
6718 7163
 								{
6719 7164
 									$return.= '<!-- Show original file (thumb not yet available with shared links) -->';
6720 7165
 									$return.= '<img class="photo photowithmargin" border="0" height="'.$maxHeight.'" src="'.DOL_URL_ROOT.'/viewimage.php?hashp='.urlencode($val['share']).'" title="'.dol_escape_htmltag($alt).'">';
6721
-								}
6722
-								else {
7166
+								} else {
6723 7167
 									$return.= '<!-- Show original file -->';
6724 7168
 									$return.= '<img class="photo photowithmargin" border="0" height="'.$maxHeight.'" src="'.DOL_URL_ROOT.'/viewimage.php?hashp='.urlencode($val['share']).'" title="'.dol_escape_htmltag($alt).'">';
6725 7169
 								}
6726
-							}
6727
-							else
7170
+							} else
6728 7171
 							{
6729 7172
 								$return.= '<!-- Show nophoto file (because file is not shared) -->';
6730 7173
 								$return.= '<img class="photo photowithmargin" border="0" height="'.$maxHeight.'" src="'.DOL_URL_ROOT.'/public/theme/common/nophoto.png" title="'.dol_escape_htmltag($alt).'">';
6731 7174
 							}
6732
-						}
6733
-						else
7175
+						} else
6734 7176
 						{
6735 7177
 							if (empty($maxHeight) || $photo_vignette && $imgarray['height'] > $maxHeight)
6736 7178
 							{
6737 7179
 								$return.= '<!-- Show thumb -->';
6738 7180
 								$return.= '<img class="photo photowithmargin" border="0" height="'.$maxHeight.'" src="'.DOL_URL_ROOT.'/viewimage.php?modulepart='.$modulepart.'&entity='.$this->entity.'&file='.urlencode($pdirthumb.$photo_vignette).'" title="'.dol_escape_htmltag($alt).'">';
6739
-							}
6740
-							else {
7181
+							} else {
6741 7182
 								$return.= '<!-- Show original file -->';
6742 7183
 								$return.= '<img class="photo photowithmargin" border="0" height="'.$maxHeight.'" src="'.DOL_URL_ROOT.'/viewimage.php?modulepart='.$modulepart.'&entity='.$this->entity.'&file='.urlencode($pdir.$photo).'" title="'.dol_escape_htmltag($alt).'">';
6743 7184
 							}
6744 7185
 						}
6745 7186
 
6746
-						if (empty($nolink)) $return.= '</a>';
7187
+						if (empty($nolink)) {
7188
+						    $return.= '</a>';
7189
+						}
6747 7190
 						$return.="\n";
6748 7191
 
6749
-						if ($showfilename) $return.= '<br>'.$viewfilename;
7192
+						if ($showfilename) {
7193
+						    $return.= '<br>'.$viewfilename;
7194
+						}
6750 7195
 						if ($showaction)
6751 7196
 						{
6752 7197
 							$return.= '<br>';
@@ -6771,15 +7216,20 @@  discard block
 block discarded – undo
6771 7216
 						if ($nbbyrow > 0)
6772 7217
 						{
6773 7218
 							$return.= '</td>';
6774
-							if (($nbphoto % $nbbyrow) == 0) $return.= '</tr>';
7219
+							if (($nbphoto % $nbbyrow) == 0) {
7220
+							    $return.= '</tr>';
7221
+							}
7222
+						} else if ($nbbyrow < 0) {
7223
+						    $return.='</div>';
6775 7224
 						}
6776
-						else if ($nbbyrow < 0) $return.='</div>';
6777 7225
 					}
6778 7226
 
6779 7227
 					if (empty($size)) {     // Format origine
6780 7228
 						$return.= '<img class="photo photowithmargin" border="0" src="'.DOL_URL_ROOT.'/viewimage.php?modulepart='.$modulepart.'&entity='.$this->entity.'&file='.urlencode($pdir.$photo).'">';
6781 7229
 
6782
-						if ($showfilename) $return.= '<br>'.$viewfilename;
7230
+						if ($showfilename) {
7231
+						    $return.= '<br>'.$viewfilename;
7232
+						}
6783 7233
 						if ($showaction)
6784 7234
 						{
6785 7235
 							// Special case for product
@@ -6796,7 +7246,9 @@  discard block
 block discarded – undo
6796 7246
 					}
6797 7247
 
6798 7248
 					// On continue ou on arrete de boucler ?
6799
-					if ($nbmax && $nbphoto >= $nbmax) break;
7249
+					if ($nbmax && $nbphoto >= $nbmax) {
7250
+					    break;
7251
+					}
6800 7252
 				}
6801 7253
 			}
6802 7254
 
@@ -6811,7 +7263,9 @@  discard block
 block discarded – undo
6811 7263
 						$nbphoto++;
6812 7264
 					}
6813 7265
 
6814
-					if ($nbphoto) $return.= '</table>';
7266
+					if ($nbphoto) {
7267
+					    $return.= '</table>';
7268
+					}
6815 7269
 				}
6816 7270
 			}
6817 7271
 		}
@@ -6832,10 +7286,14 @@  discard block
 block discarded – undo
6832 7286
 	{
6833 7287
 		if(is_array($info))
6834 7288
 		{
6835
-			if(isset($info['type']) && $info['type']=='array') return true;
6836
-			else return false;
7289
+			if(isset($info['type']) && $info['type']=='array') {
7290
+			    return true;
7291
+			} else {
7292
+			    return false;
7293
+			}
7294
+		} else {
7295
+		    return false;
6837 7296
 		}
6838
-		else return false;
6839 7297
 	}
6840 7298
 
6841 7299
 	/**
@@ -6848,10 +7306,14 @@  discard block
 block discarded – undo
6848 7306
 	{
6849 7307
 		if(is_array($info))
6850 7308
 		{
6851
-			if(isset($info['type']) && $info['type']=='null') return true;
6852
-			else return false;
7309
+			if(isset($info['type']) && $info['type']=='null') {
7310
+			    return true;
7311
+			} else {
7312
+			    return false;
7313
+			}
7314
+		} else {
7315
+		    return false;
6853 7316
 		}
6854
-		else return false;
6855 7317
 	}
6856 7318
 
6857 7319
 	/**
@@ -6862,8 +7324,11 @@  discard block
 block discarded – undo
6862 7324
 	 */
6863 7325
 	public function isDate($info)
6864 7326
 	{
6865
-		if(isset($info['type']) && ($info['type']=='date' || $info['type']=='datetime' || $info['type']=='timestamp')) return true;
6866
-		else return false;
7327
+		if(isset($info['type']) && ($info['type']=='date' || $info['type']=='datetime' || $info['type']=='timestamp')) {
7328
+		    return true;
7329
+		} else {
7330
+		    return false;
7331
+		}
6867 7332
 	}
6868 7333
 
6869 7334
 	/**
@@ -6876,10 +7341,14 @@  discard block
 block discarded – undo
6876 7341
 	{
6877 7342
 		if(is_array($info))
6878 7343
 		{
6879
-			if(isset($info['type']) && ($info['type']=='int' || preg_match('/^integer/i',$info['type']) ) ) return true;
6880
-			else return false;
7344
+			if(isset($info['type']) && ($info['type']=='int' || preg_match('/^integer/i',$info['type']) ) ) {
7345
+			    return true;
7346
+			} else {
7347
+			    return false;
7348
+			}
7349
+		} else {
7350
+		    return false;
6881 7351
 		}
6882
-		else return false;
6883 7352
 	}
6884 7353
 
6885 7354
 	/**
@@ -6892,10 +7361,14 @@  discard block
 block discarded – undo
6892 7361
 	{
6893 7362
 		if(is_array($info))
6894 7363
 		{
6895
-			if (isset($info['type']) && (preg_match('/^(double|real)/i', $info['type']))) return true;
6896
-			else return false;
7364
+			if (isset($info['type']) && (preg_match('/^(double|real)/i', $info['type']))) {
7365
+			    return true;
7366
+			} else {
7367
+			    return false;
7368
+			}
7369
+		} else {
7370
+		    return false;
6897 7371
 		}
6898
-		else return false;
6899 7372
 	}
6900 7373
 
6901 7374
 	/**
@@ -6908,10 +7381,14 @@  discard block
 block discarded – undo
6908 7381
 	{
6909 7382
 		if(is_array($info))
6910 7383
 		{
6911
-			if(isset($info['type']) && $info['type']=='text') return true;
6912
-			else return false;
7384
+			if(isset($info['type']) && $info['type']=='text') {
7385
+			    return true;
7386
+			} else {
7387
+			    return false;
7388
+			}
7389
+		} else {
7390
+		    return false;
6913 7391
 		}
6914
-		else return false;
6915 7392
 	}
6916 7393
 
6917 7394
 	/**
@@ -6924,10 +7401,14 @@  discard block
 block discarded – undo
6924 7401
 	{
6925 7402
 		if(is_array($info))
6926 7403
 		{
6927
-			if(isset($info['index']) && $info['index']==true) return true;
6928
-			else return false;
7404
+			if(isset($info['index']) && $info['index']==true) {
7405
+			    return true;
7406
+			} else {
7407
+			    return false;
7408
+			}
7409
+		} else {
7410
+		    return false;
6929 7411
 		}
6930
-		else return false;
6931 7412
 	}
6932 7413
 
6933 7414
 	/**
@@ -6941,7 +7422,8 @@  discard block
 block discarded – undo
6941 7422
 		global $conf;
6942 7423
 
6943 7424
 		$queryarray=array();
6944
-		foreach ($this->fields as $field=>$info)	// Loop on definition of fields
7425
+		foreach ($this->fields as $field=>$info) {
7426
+		    // Loop on definition of fields
6945 7427
 		{
6946 7428
 			// Depending on field type ('datetime', ...)
6947 7429
 			if($this->isDate($info))
@@ -6949,13 +7431,12 @@  discard block
 block discarded – undo
6949 7431
 				if(empty($this->{$field}))
6950 7432
 				{
6951 7433
 					$queryarray[$field] = null;
6952
-				}
6953
-				else
7434
+		}
7435
+				} else
6954 7436
 				{
6955 7437
 					$queryarray[$field] = $this->db->idate($this->{$field});
6956 7438
 				}
6957
-			}
6958
-			else if($this->isArray($info))
7439
+			} else if($this->isArray($info))
6959 7440
 			{
6960 7441
 				if(! empty($this->{$field})) {
6961 7442
 					if(! is_array($this->{$field})) {
@@ -6965,28 +7446,35 @@  discard block
 block discarded – undo
6965 7446
 				} else {
6966 7447
 					$queryarray[$field] = null;
6967 7448
 				}
6968
-			}
6969
-			else if($this->isInt($info))
7449
+			} else if($this->isInt($info))
6970 7450
 			{
6971
-				if ($field == 'entity' && is_null($this->{$field})) $queryarray[$field]=$conf->entity;
6972
-				else
7451
+				if ($field == 'entity' && is_null($this->{$field})) {
7452
+				    $queryarray[$field]=$conf->entity;
7453
+				} else
6973 7454
 				{
6974 7455
 					$queryarray[$field] = (int) price2num($this->{$field});
6975
-					if (empty($queryarray[$field])) $queryarray[$field]=0;		// May be reset to null later if property 'notnull' is -1 for this field.
7456
+					if (empty($queryarray[$field])) {
7457
+					    $queryarray[$field]=0;
7458
+					}
7459
+					// May be reset to null later if property 'notnull' is -1 for this field.
6976 7460
 				}
6977
-			}
6978
-			else if($this->isFloat($info))
7461
+			} else if($this->isFloat($info))
6979 7462
 			{
6980 7463
 				$queryarray[$field] = (double) price2num($this->{$field});
6981
-				if (empty($queryarray[$field])) $queryarray[$field]=0;
6982
-			}
6983
-			else
7464
+				if (empty($queryarray[$field])) {
7465
+				    $queryarray[$field]=0;
7466
+				}
7467
+			} else
6984 7468
 			{
6985 7469
 				$queryarray[$field] = $this->{$field};
6986 7470
 			}
6987 7471
 
6988
-			if ($info['type'] == 'timestamp' && empty($queryarray[$field])) unset($queryarray[$field]);
6989
-			if (! empty($info['notnull']) && $info['notnull'] == -1 && empty($queryarray[$field])) $queryarray[$field] = null;
7472
+			if ($info['type'] == 'timestamp' && empty($queryarray[$field])) {
7473
+			    unset($queryarray[$field]);
7474
+			}
7475
+			if (! empty($info['notnull']) && $info['notnull'] == -1 && empty($queryarray[$field])) {
7476
+			    $queryarray[$field] = null;
7477
+			}
6990 7478
 		}
6991 7479
 
6992 7480
 		return $queryarray;
@@ -7004,42 +7492,47 @@  discard block
 block discarded – undo
7004 7492
 		{
7005 7493
 			if($this->isDate($info))
7006 7494
 			{
7007
-				if(empty($obj->{$field}) || $obj->{$field} === '0000-00-00 00:00:00' || $obj->{$field} === '1000-01-01 00:00:00') $this->{$field} = 0;
7008
-				else $this->{$field} = strtotime($obj->{$field});
7009
-			}
7010
-			elseif($this->isArray($info))
7495
+				if(empty($obj->{$field}) || $obj->{$field} === '0000-00-00 00:00:00' || $obj->{$field} === '1000-01-01 00:00:00') {
7496
+				    $this->{$field} = 0;
7497
+				} else {
7498
+				    $this->{$field} = strtotime($obj->{$field});
7499
+				}
7500
+			} elseif($this->isArray($info))
7011 7501
 			{
7012 7502
 				if(! empty($obj->{$field})) {
7013 7503
 					$this->{$field} = @unserialize($obj->{$field});
7014 7504
 					// Hack for data not in UTF8
7015
-					if($this->{$field } === false) @unserialize(utf8_decode($obj->{$field}));
7505
+					if($this->{$field } === false) {
7506
+					    @unserialize(utf8_decode($obj->{$field}));
7507
+					}
7016 7508
 				} else {
7017 7509
 					$this->{$field} = array();
7018 7510
 				}
7019
-			}
7020
-			elseif($this->isInt($info))
7511
+			} elseif($this->isInt($info))
7021 7512
 			{
7022
-				if ($field == 'rowid') $this->id = (int) $obj->{$field};
7023
-				else $this->{$field} = (int) $obj->{$field};
7024
-			}
7025
-			elseif($this->isFloat($info))
7513
+				if ($field == 'rowid') {
7514
+				    $this->id = (int) $obj->{$field};
7515
+				} else {
7516
+				    $this->{$field} = (int) $obj->{$field};
7517
+				}
7518
+			} elseif($this->isFloat($info))
7026 7519
 			{
7027 7520
 				$this->{$field} = (double) $obj->{$field};
7028
-			}
7029
-			elseif($this->isNull($info))
7521
+			} elseif($this->isNull($info))
7030 7522
 			{
7031 7523
 				$val = $obj->{$field};
7032 7524
 				// zero is not null
7033 7525
 				$this->{$field} = (is_null($val) || (empty($val) && $val!==0 && $val!=='0') ? null : $val);
7034
-			}
7035
-			else
7526
+			} else
7036 7527
 			{
7037 7528
 				$this->{$field} = $obj->{$field};
7038 7529
 			}
7039 7530
 		}
7040 7531
 
7041 7532
 		// If there is no 'ref' field, we force property ->ref to ->id for a better compatibility with common functions.
7042
-		if (! isset($this->fields['ref']) && isset($this->id)) $this->ref = $this->id;
7533
+		if (! isset($this->fields['ref']) && isset($this->id)) {
7534
+		    $this->ref = $this->id;
7535
+		}
7043 7536
 	}
7044 7537
 
7045 7538
 	/**
@@ -7062,9 +7555,13 @@  discard block
 block discarded – undo
7062 7555
 	 */
7063 7556
     protected function quote($value, $fieldsentry)
7064 7557
     {
7065
-		if (is_null($value)) return 'NULL';
7066
-		else if (preg_match('/^(int|double|real)/i', $fieldsentry['type'])) return $this->db->escape("$value");
7067
-		else return "'".$this->db->escape($value)."'";
7558
+		if (is_null($value)) {
7559
+		    return 'NULL';
7560
+		} else if (preg_match('/^(int|double|real)/i', $fieldsentry['type'])) {
7561
+		    return $this->db->escape("$value");
7562
+		} else {
7563
+		    return "'".$this->db->escape($value)."'";
7564
+		}
7068 7565
 	}
7069 7566
 
7070 7567
 
@@ -7084,8 +7581,12 @@  discard block
 block discarded – undo
7084 7581
 		$now=dol_now();
7085 7582
 
7086 7583
 		$fieldvalues = $this->setSaveQuery();
7087
-		if (array_key_exists('date_creation', $fieldvalues) && empty($fieldvalues['date_creation'])) $fieldvalues['date_creation']=$this->db->idate($now);
7088
-		if (array_key_exists('fk_user_creat', $fieldvalues) && ! ($fieldvalues['fk_user_creat'] > 0)) $fieldvalues['fk_user_creat']=$user->id;
7584
+		if (array_key_exists('date_creation', $fieldvalues) && empty($fieldvalues['date_creation'])) {
7585
+		    $fieldvalues['date_creation']=$this->db->idate($now);
7586
+		}
7587
+		if (array_key_exists('fk_user_creat', $fieldvalues) && ! ($fieldvalues['fk_user_creat'] > 0)) {
7588
+		    $fieldvalues['fk_user_creat']=$user->id;
7589
+		}
7089 7590
 		unset($fieldvalues['rowid']);	// The field 'rowid' is reserved field name for autoincrement field so we don't need it into insert.
7090 7591
 
7091 7592
 		$keys=array();
@@ -7100,8 +7601,12 @@  discard block
 block discarded – undo
7100 7601
 		foreach($keys as $key)
7101 7602
 		{
7102 7603
 			// If field is an implicit foreign key field
7103
-			if (preg_match('/^integer:/i', $this->fields[$key]['type']) && $values[$key] == '-1') $values[$key]='';
7104
-			if (! empty($this->fields[$key]['foreignkey']) && $values[$key] == '-1') $values[$key]='';
7604
+			if (preg_match('/^integer:/i', $this->fields[$key]['type']) && $values[$key] == '-1') {
7605
+			    $values[$key]='';
7606
+			}
7607
+			if (! empty($this->fields[$key]['foreignkey']) && $values[$key] == '-1') {
7608
+			    $values[$key]='';
7609
+			}
7105 7610
 
7106 7611
 			//var_dump($key.'-'.$values[$key].'-'.($this->fields[$key]['notnull'] == 1));
7107 7612
 			if (isset($this->fields[$key]['notnull']) && $this->fields[$key]['notnull'] == 1 && ! isset($values[$key]) && is_null($val['default']))
@@ -7111,11 +7616,17 @@  discard block
 block discarded – undo
7111 7616
 			}
7112 7617
 
7113 7618
 			// If field is an implicit foreign key field
7114
-			if (preg_match('/^integer:/i', $this->fields[$key]['type']) && empty($values[$key])) $values[$key]='null';
7115
-			if (! empty($this->fields[$key]['foreignkey']) && empty($values[$key])) $values[$key]='null';
7619
+			if (preg_match('/^integer:/i', $this->fields[$key]['type']) && empty($values[$key])) {
7620
+			    $values[$key]='null';
7621
+			}
7622
+			if (! empty($this->fields[$key]['foreignkey']) && empty($values[$key])) {
7623
+			    $values[$key]='null';
7624
+			}
7116 7625
 		}
7117 7626
 
7118
-		if ($error) return -1;
7627
+		if ($error) {
7628
+		    return -1;
7629
+		}
7119 7630
 
7120 7631
 		$this->db->begin();
7121 7632
 
@@ -7141,7 +7652,9 @@  discard block
 block discarded – undo
7141 7652
 		if (! $error)
7142 7653
 		{
7143 7654
 			$result=$this->insertExtraFields();
7144
-			if ($result < 0) $error++;
7655
+			if ($result < 0) {
7656
+			    $error++;
7657
+			}
7145 7658
 		}
7146 7659
 
7147 7660
 		// Triggers
@@ -7174,15 +7687,24 @@  discard block
 block discarded – undo
7174 7687
 	 */
7175 7688
 	public function fetchCommon($id, $ref = null, $morewhere = '')
7176 7689
 	{
7177
-		if (empty($id) && empty($ref) && empty($morewhere)) return -1;
7690
+		if (empty($id) && empty($ref) && empty($morewhere)) {
7691
+		    return -1;
7692
+		}
7178 7693
 
7179 7694
 		$sql = 'SELECT '.$this->getFieldList();
7180 7695
 		$sql.= ' FROM '.MAIN_DB_PREFIX.$this->table_element;
7181 7696
 
7182
-		if (!empty($id))  $sql.= ' WHERE rowid = '.$id;
7183
-		elseif (!empty($ref)) $sql.= " WHERE ref = ".$this->quote($ref, $this->fields['ref']);
7184
-		else $sql.=' WHERE 1 = 1';	// usage with empty id and empty ref is very rare
7185
-		if ($morewhere)   $sql.= $morewhere;
7697
+		if (!empty($id)) {
7698
+		    $sql.= ' WHERE rowid = '.$id;
7699
+		} elseif (!empty($ref)) {
7700
+		    $sql.= " WHERE ref = ".$this->quote($ref, $this->fields['ref']);
7701
+		} else {
7702
+		    $sql.=' WHERE 1 = 1';
7703
+		}
7704
+		// usage with empty id and empty ref is very rare
7705
+		if ($morewhere) {
7706
+		    $sql.= $morewhere;
7707
+		}
7186 7708
 		$sql.=' LIMIT 1';	// This is a fetch, to be sure to get only one record
7187 7709
 
7188 7710
 		$res = $this->db->query($sql);
@@ -7193,13 +7715,11 @@  discard block
 block discarded – undo
7193 7715
 			{
7194 7716
 				$this->setVarsFromFetchObj($obj);
7195 7717
 				return $this->id;
7196
-			}
7197
-			else
7718
+			} else
7198 7719
 			{
7199 7720
 				return 0;
7200 7721
 			}
7201
-		}
7202
-		else
7722
+		} else
7203 7723
 		{
7204 7724
 			$this->error = $this->db->lasterror();
7205 7725
 			$this->errors[] = $this->error;
@@ -7223,8 +7743,12 @@  discard block
 block discarded – undo
7223 7743
 		$now=dol_now();
7224 7744
 
7225 7745
 		$fieldvalues = $this->setSaveQuery();
7226
-		if (array_key_exists('date_modification', $fieldvalues) && empty($fieldvalues['date_modification'])) $fieldvalues['date_modification']=$this->db->idate($now);
7227
-		if (array_key_exists('fk_user_modif', $fieldvalues) && ! ($fieldvalues['fk_user_modif'] > 0)) $fieldvalues['fk_user_modif']=$user->id;
7746
+		if (array_key_exists('date_modification', $fieldvalues) && empty($fieldvalues['date_modification'])) {
7747
+		    $fieldvalues['date_modification']=$this->db->idate($now);
7748
+		}
7749
+		if (array_key_exists('fk_user_modif', $fieldvalues) && ! ($fieldvalues['fk_user_modif'] > 0)) {
7750
+		    $fieldvalues['fk_user_modif']=$user->id;
7751
+		}
7228 7752
 		unset($fieldvalues['rowid']);	// The field 'rowid' is reserved field name for autoincrement field so we don't need it into update.
7229 7753
 
7230 7754
 		$keys=array();
@@ -7239,8 +7763,14 @@  discard block
 block discarded – undo
7239 7763
 		// Clean and check mandatory
7240 7764
 		foreach($keys as $key)
7241 7765
 		{
7242
-			if (preg_match('/^integer:/i', $this->fields[$key]['type']) && $values[$key] == '-1') $values[$key]='';		// This is an implicit foreign key field
7243
-			if (! empty($this->fields[$key]['foreignkey']) && $values[$key] == '-1') $values[$key]='';					// This is an explicit foreign key field
7766
+			if (preg_match('/^integer:/i', $this->fields[$key]['type']) && $values[$key] == '-1') {
7767
+			    $values[$key]='';
7768
+			}
7769
+			// This is an implicit foreign key field
7770
+			if (! empty($this->fields[$key]['foreignkey']) && $values[$key] == '-1') {
7771
+			    $values[$key]='';
7772
+			}
7773
+			// This is an explicit foreign key field
7244 7774
 
7245 7775
 			//var_dump($key.'-'.$values[$key].'-'.($this->fields[$key]['notnull'] == 1));
7246 7776
 			/*
@@ -7321,10 +7851,11 @@  discard block
 block discarded – undo
7321 7851
 					return -1;
7322 7852
 				}
7323 7853
 			}
7324
-		}
7325
-		elseif (! empty($this->fk_element) && ! empty($this->childtables))	// If object has childs linked with a foreign key field, we check all child tables.
7854
+		} elseif (! empty($this->fk_element) && ! empty($this->childtables)) {
7855
+		    // If object has childs linked with a foreign key field, we check all child tables.
7326 7856
 		{
7327 7857
 			$objectisused = $this->isObjectUsed($this->id);
7858
+		}
7328 7859
 			if (! empty($objectisused))
7329 7860
 			{
7330 7861
 				dol_syslog(get_class($this)."::deleteCommon Can't delete record as it has some child", LOG_WARNING);
@@ -7431,7 +7962,9 @@  discard block
 block discarded – undo
7431 7962
      */
7432 7963
     public function trimParameters($parameters)
7433 7964
     {
7434
-        if (!is_array($parameters)) return;
7965
+        if (!is_array($parameters)) {
7966
+            return;
7967
+        }
7435 7968
         foreach ($parameters as $parameter) {
7436 7969
             if (isset($this->$parameter)) {
7437 7970
                 $this->$parameter = trim($this->$parameter);
Please login to merge, or discard this patch.
dolibarr/htdocs/core/class/ctyperesource.class.php 3 patches
Indentation   +418 added lines, -418 removed lines patch added patch discarded remove patch
@@ -32,436 +32,436 @@  discard block
 block discarded – undo
32 32
  */
33 33
 class Ctyperesource
34 34
 {
35
-	/**
36
-	 * @var string Id to identify managed objects
37
-	 */
38
-	public $element = 'ctyperesource';
35
+    /**
36
+     * @var string Id to identify managed objects
37
+     */
38
+    public $element = 'ctyperesource';
39 39
 
40
-	/**
41
-	 * @var string Name of table without prefix where object is stored
42
-	 */
43
-	public $table_element = 'c_type_resource';
40
+    /**
41
+     * @var string Name of table without prefix where object is stored
42
+     */
43
+    public $table_element = 'c_type_resource';
44 44
 
45
-	/**
46
-	 * @var CtyperesourceLine[] Lines
47
-	 */
48
-	public $lines = array();
45
+    /**
46
+     * @var CtyperesourceLine[] Lines
47
+     */
48
+    public $lines = array();
49 49
 
50
-	public $code;
50
+    public $code;
51 51
 
52
-	/**
52
+    /**
53 53
      * @var string Type resource label
54 54
      */
55 55
     public $label;
56 56
 
57
-	public $active;
57
+    public $active;
58
+
59
+
60
+    /**
61
+     * Constructor
62
+     *
63
+     * @param DoliDb $db Database handler
64
+     */
65
+    public function __construct(DoliDB $db)
66
+    {
67
+        $this->db = $db;
68
+    }
69
+
70
+    /**
71
+     * Create object into database
72
+     *
73
+     * @param  User $user      User that creates
74
+     * @param  bool $notrigger false=launch triggers after, true=disable triggers
75
+     *
76
+     * @return int <0 if KO, Id of created object if OK
77
+     */
78
+    public function create(User $user, $notrigger = false)
79
+    {
80
+        dol_syslog(__METHOD__, LOG_DEBUG);
81
+
82
+        $error = 0;
83
+
84
+        // Clean parameters
85
+
86
+        if (isset($this->code)) {
87
+                $this->code = trim($this->code);
88
+        }
89
+        if (isset($this->label)) {
90
+                $this->label = trim($this->label);
91
+        }
92
+        if (isset($this->active)) {
93
+                $this->active = trim($this->active);
94
+        }
95
+
58 96
 
59 97
 
60
-	/**
61
-	 * Constructor
62
-	 *
63
-	 * @param DoliDb $db Database handler
64
-	 */
65
-	public function __construct(DoliDB $db)
66
-	{
67
-		$this->db = $db;
68
-	}
98
+        // Check parameters
99
+        // Put here code to add control on parameters values
69 100
 
70
-	/**
71
-	 * Create object into database
72
-	 *
73
-	 * @param  User $user      User that creates
74
-	 * @param  bool $notrigger false=launch triggers after, true=disable triggers
75
-	 *
76
-	 * @return int <0 if KO, Id of created object if OK
77
-	 */
78
-	public function create(User $user, $notrigger = false)
79
-	{
80
-		dol_syslog(__METHOD__, LOG_DEBUG);
101
+        // Insert request
102
+        $sql = 'INSERT INTO ' . MAIN_DB_PREFIX . $this->table_element . '(';
81 103
 
82
-		$error = 0;
104
+        $sql.= 'code,';
105
+        $sql.= 'label';
106
+        $sql.= 'active';
83 107
 
84
-		// Clean parameters
85 108
 
86
-		if (isset($this->code)) {
87
-			 $this->code = trim($this->code);
88
-		}
89
-		if (isset($this->label)) {
90
-			 $this->label = trim($this->label);
91
-		}
92
-		if (isset($this->active)) {
93
-			 $this->active = trim($this->active);
94
-		}
109
+        $sql .= ') VALUES (';
95 110
 
111
+        $sql .= ' '.(! isset($this->code)?'NULL':"'".$this->db->escape($this->code)."'").',';
112
+        $sql .= ' '.(! isset($this->label)?'NULL':"'".$this->db->escape($this->label)."'").',';
113
+        $sql .= ' '.(! isset($this->active)?'NULL':$this->active);
96 114
 
97 115
 
98
-		// Check parameters
99
-		// Put here code to add control on parameters values
116
+        $sql .= ')';
100 117
 
101
-		// Insert request
102
-		$sql = 'INSERT INTO ' . MAIN_DB_PREFIX . $this->table_element . '(';
118
+        $this->db->begin();
103 119
 
104
-		$sql.= 'code,';
105
-		$sql.= 'label';
106
-		$sql.= 'active';
120
+        $resql = $this->db->query($sql);
121
+        if (!$resql) {
122
+            $error ++;
123
+            $this->errors[] = 'Error ' . $this->db->lasterror();
124
+            dol_syslog(__METHOD__ . ' ' . implode(',', $this->errors), LOG_ERR);
125
+        }
107 126
 
127
+        if (!$error) {
128
+            $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX . $this->table_element);
108 129
 
109
-		$sql .= ') VALUES (';
130
+            // Uncomment this and change MYOBJECT to your own tag if you
131
+            // want this action to call a trigger.
132
+            //if (!$notrigger) {
110 133
 
111
-		$sql .= ' '.(! isset($this->code)?'NULL':"'".$this->db->escape($this->code)."'").',';
112
-		$sql .= ' '.(! isset($this->label)?'NULL':"'".$this->db->escape($this->label)."'").',';
113
-		$sql .= ' '.(! isset($this->active)?'NULL':$this->active);
134
+            //  // Call triggers
135
+            //  $result=$this->call_trigger('MYOBJECT_CREATE',$user);
136
+            //  if ($result < 0) $error++;
137
+            //  // End call triggers
138
+            //}
139
+        }
114 140
 
141
+        // Commit or rollback
142
+        if ($error) {
143
+            $this->db->rollback();
115 144
 
116
-		$sql .= ')';
145
+            return - 1 * $error;
146
+        } else {
147
+            $this->db->commit();
117 148
 
118
-		$this->db->begin();
119
-
120
-		$resql = $this->db->query($sql);
121
-		if (!$resql) {
122
-			$error ++;
123
-			$this->errors[] = 'Error ' . $this->db->lasterror();
124
-			dol_syslog(__METHOD__ . ' ' . implode(',', $this->errors), LOG_ERR);
125
-		}
126
-
127
-		if (!$error) {
128
-			$this->id = $this->db->last_insert_id(MAIN_DB_PREFIX . $this->table_element);
129
-
130
-			// Uncomment this and change MYOBJECT to your own tag if you
131
-			// want this action to call a trigger.
132
-			//if (!$notrigger) {
133
-
134
-			//  // Call triggers
135
-			//  $result=$this->call_trigger('MYOBJECT_CREATE',$user);
136
-			//  if ($result < 0) $error++;
137
-			//  // End call triggers
138
-			//}
139
-		}
140
-
141
-		// Commit or rollback
142
-		if ($error) {
143
-			$this->db->rollback();
144
-
145
-			return - 1 * $error;
146
-		} else {
147
-			$this->db->commit();
148
-
149
-			return $this->id;
150
-		}
151
-	}
152
-
153
-	/**
154
-	 * Load object in memory from the database
155
-	 *
156
-	 * @param int    $id  Id object
157
-	 * @param string $code code
158
-	 * @param string $label Label
159
-	 *
160
-	 * @return int <0 if KO, 0 if not found, >0 if OK
161
-	 */
162
-	public function fetch($id,$code='',$label='')
163
-	{
164
-		dol_syslog(__METHOD__, LOG_DEBUG);
165
-
166
-		$sql = 'SELECT';
167
-		$sql .= ' t.rowid,';
168
-
169
-		$sql .= " t.code,";
170
-		$sql .= " t.label,";
171
-		$sql .= " t.active";
172
-
173
-
174
-		$sql .= ' FROM ' . MAIN_DB_PREFIX . $this->table_element . ' as t';
175
-		if ($id)   $sql.= " WHERE t.id = ".$id;
176
-		elseif ($code) $sql.= " WHERE t.code = '".$this->db->escape($code)."'";
177
-		elseif ($label) $sql.= " WHERE t.label = '".$this->db->escape($label)."'";
178
-
179
-
180
-		$resql = $this->db->query($sql);
181
-		if ($resql) {
182
-			$numrows = $this->db->num_rows($resql);
183
-			if ($numrows) {
184
-				$obj = $this->db->fetch_object($resql);
185
-
186
-				$this->id = $obj->rowid;
187
-
188
-				$this->code = $obj->code;
189
-				$this->label = $obj->label;
190
-				$this->active = $obj->active;
191
-			}
192
-
193
-			// Retrieve all extrafields for invoice
194
-			// fetch optionals attributes and labels
195
-			// $this->fetch_optionals();
196
-
197
-			// $this->fetch_lines();
198
-
199
-			$this->db->free($resql);
200
-
201
-			if ($numrows) {
202
-				return 1;
203
-			} else {
204
-				return 0;
205
-			}
206
-		} else {
207
-			$this->errors[] = 'Error ' . $this->db->lasterror();
208
-			dol_syslog(__METHOD__ . ' ' . implode(',', $this->errors), LOG_ERR);
209
-
210
-			return - 1;
211
-		}
212
-	}
213
-
214
-	/**
215
-	 * Load object in memory from the database
216
-	 *
217
-	 * @param string $sortorder Sort Order
218
-	 * @param string $sortfield Sort field
219
-	 * @param int    $limit     offset limit
220
-	 * @param int    $offset    offset limit
221
-	 * @param array  $filter    filter array
222
-	 * @param string $filtermode filter mode (AND or OR)
223
-	 *
224
-	 * @return int <0 if KO, >0 if OK
225
-	 */
226
-	public function fetchAll($sortorder='', $sortfield='', $limit=0, $offset=0, array $filter = array(), $filtermode='AND')
227
-	{
228
-		dol_syslog(__METHOD__, LOG_DEBUG);
229
-
230
-		$sql = 'SELECT';
231
-		$sql .= ' t.rowid,';
232
-
233
-		$sql .= " t.code,";
234
-		$sql .= " t.label,";
235
-		$sql .= " t.active";
236
-
237
-
238
-		$sql .= ' FROM ' . MAIN_DB_PREFIX . $this->table_element. ' as t';
239
-
240
-		// Manage filter
241
-		$sqlwhere = array();
242
-		if (count($filter) > 0) {
243
-			foreach ($filter as $key => $value) {
244
-				$sqlwhere [] = $key . ' LIKE \'%' . $this->db->escape($value) . '%\'';
245
-			}
246
-		}
247
-
248
-		if (count($sqlwhere) > 0) {
249
-			$sql .= ' WHERE ' . implode(' '.$filtermode.' ', $sqlwhere);
250
-		}
251
-		if (!empty($sortfield)) {
252
-			$sql .= $this->db->order($sortfield,$sortorder);
253
-		}
254
-		if (!empty($limit)) {
255
-		 $sql .=  ' ' . $this->db->plimit($limit, $offset);
256
-		}
257
-
258
-		$resql = $this->db->query($sql);
259
-		if ($resql) {
260
-			$num = $this->db->num_rows($resql);
261
-
262
-			while ($obj = $this->db->fetch_object($resql)) {
263
-				$line = new self($this->db);
264
-
265
-				$line->id = $obj->rowid;
266
-
267
-				$line->code = $obj->code;
268
-				$line->label = $obj->label;
269
-				$line->active = $obj->active;
270
-			}
271
-			$this->db->free($resql);
272
-
273
-			return $num;
274
-		} else {
275
-			$this->errors[] = 'Error ' . $this->db->lasterror();
276
-			dol_syslog(__METHOD__ . ' ' . implode(',', $this->errors), LOG_ERR);
277
-
278
-			return - 1;
279
-		}
280
-	}
281
-
282
-	/**
283
-	 * Update object into database
284
-	 *
285
-	 * @param  User $user      User that modifies
286
-	 * @param  bool $notrigger false=launch triggers after, true=disable triggers
287
-	 *
288
-	 * @return int <0 if KO, >0 if OK
289
-	 */
290
-	public function update(User $user, $notrigger = false)
291
-	{
292
-		$error = 0;
293
-
294
-		dol_syslog(__METHOD__, LOG_DEBUG);
295
-
296
-		// Clean parameters
297
-
298
-		if (isset($this->code)) {
299
-			 $this->code = trim($this->code);
300
-		}
301
-		if (isset($this->label)) {
302
-			 $this->label = trim($this->label);
303
-		}
304
-		if (isset($this->active)) {
305
-			 $this->active = trim($this->active);
306
-		}
307
-
308
-		// Check parameters
309
-		// Put here code to add a control on parameters values
310
-
311
-		// Update request
312
-		$sql = 'UPDATE ' . MAIN_DB_PREFIX . $this->table_element . ' SET';
313
-
314
-		$sql .= ' code = '.(isset($this->code)?"'".$this->db->escape($this->code)."'":"null").',';
315
-		$sql .= ' label = '.(isset($this->label)?"'".$this->db->escape($this->label)."'":"null").',';
316
-		$sql .= ' active = '.(isset($this->active)?$this->active:"null");
317
-
318
-
319
-		$sql .= ' WHERE rowid=' . $this->id;
320
-
321
-		$this->db->begin();
322
-
323
-		$resql = $this->db->query($sql);
324
-		if (!$resql) {
325
-			$error ++;
326
-			$this->errors[] = 'Error ' . $this->db->lasterror();
327
-			dol_syslog(__METHOD__ . ' ' . implode(',', $this->errors), LOG_ERR);
328
-		}
329
-
330
-		// Uncomment this and change MYOBJECT to your own tag if you
331
-		// want this action calls a trigger.
332
-		//if (!$error && !$notrigger) {
333
-
334
-		//  // Call triggers
335
-		//  $result=$this->call_trigger('MYOBJECT_MODIFY',$user);
336
-		//  if ($result < 0) { $error++; //Do also what you must do to rollback action if trigger fail}
337
-		//  // End call triggers
338
-		//}
339
-
340
-		// Commit or rollback
341
-		if ($error) {
342
-			$this->db->rollback();
343
-
344
-			return - 1 * $error;
345
-		} else {
346
-			$this->db->commit();
347
-
348
-			return 1;
349
-		}
350
-	}
351
-
352
-	/**
353
-	 * Delete object in database
354
-	 *
355
-	 * @param User $user      User that deletes
356
-	 * @param bool $notrigger false=launch triggers after, true=disable triggers
357
-	 *
358
-	 * @return int <0 if KO, >0 if OK
359
-	 */
360
-	public function delete(User $user, $notrigger = false)
361
-	{
362
-		dol_syslog(__METHOD__, LOG_DEBUG);
363
-
364
-		$error = 0;
365
-
366
-		$this->db->begin();
367
-
368
-		// Uncomment this and change MYOBJECT to your own tag if you
369
-		// want this action calls a trigger.
370
-		//if (!$error && !$notrigger) {
371
-
372
-		//  // Call triggers
373
-		//  $result=$this->call_trigger('MYOBJECT_DELETE',$user);
374
-		//  if ($result < 0) { $error++; //Do also what you must do to rollback action if trigger fail}
375
-		//  // End call triggers
376
-		//}
377
-
378
-		// If you need to delete child tables to, you can insert them here
379
-
380
-		if (!$error) {
381
-			$sql = 'DELETE FROM ' . MAIN_DB_PREFIX . $this->table_element;
382
-			$sql .= ' WHERE rowid=' . $this->id;
383
-
384
-			$resql = $this->db->query($sql);
385
-			if (!$resql) {
386
-				$error ++;
387
-				$this->errors[] = 'Error ' . $this->db->lasterror();
388
-				dol_syslog(__METHOD__ . ' ' . implode(',', $this->errors), LOG_ERR);
389
-			}
390
-		}
391
-
392
-		// Commit or rollback
393
-		if ($error) {
394
-			$this->db->rollback();
395
-
396
-			return - 1 * $error;
397
-		} else {
398
-			$this->db->commit();
399
-
400
-			return 1;
401
-		}
402
-	}
403
-
404
-	/**
405
-	 * Load an object from its id and create a new one in database
406
-	 *
407
-	 * @param int $fromid Id of object to clone
408
-	 *
409
-	 * @return int New id of clone
410
-	 */
411
-	public function createFromClone($fromid)
412
-	{
413
-		dol_syslog(__METHOD__, LOG_DEBUG);
414
-
415
-		global $user;
416
-		$error = 0;
417
-		$object = new Ctyperesource($this->db);
418
-
419
-		$this->db->begin();
420
-
421
-		// Load source object
422
-		$object->fetch($fromid);
423
-		// Reset object
424
-		$object->id = 0;
425
-
426
-		// Clear fields
427
-		// ...
428
-
429
-		// Create clone
430
-		$result = $object->create($user);
431
-
432
-		// Other options
433
-		if ($result < 0) {
434
-			$error ++;
435
-			$this->errors = $object->errors;
436
-			dol_syslog(__METHOD__ . ' ' . implode(',', $this->errors), LOG_ERR);
437
-		}
438
-
439
-		// End
440
-		if (!$error) {
441
-			$this->db->commit();
442
-
443
-			return $object->id;
444
-		} else {
445
-			$this->db->rollback();
446
-
447
-			return - 1;
448
-		}
449
-	}
450
-
451
-	/**
452
-	 * Initialise object with example values
453
-	 * Id must be 0 if object instance is a specimen
454
-	 *
455
-	 * @return void
456
-	 */
457
-	public function initAsSpecimen()
458
-	{
459
-		$this->id = 0;
460
-
461
-		$this->code = '';
462
-		$this->label = '';
463
-		$this->active = '';
464
-	}
149
+            return $this->id;
150
+        }
151
+    }
152
+
153
+    /**
154
+     * Load object in memory from the database
155
+     *
156
+     * @param int    $id  Id object
157
+     * @param string $code code
158
+     * @param string $label Label
159
+     *
160
+     * @return int <0 if KO, 0 if not found, >0 if OK
161
+     */
162
+    public function fetch($id,$code='',$label='')
163
+    {
164
+        dol_syslog(__METHOD__, LOG_DEBUG);
165
+
166
+        $sql = 'SELECT';
167
+        $sql .= ' t.rowid,';
168
+
169
+        $sql .= " t.code,";
170
+        $sql .= " t.label,";
171
+        $sql .= " t.active";
172
+
173
+
174
+        $sql .= ' FROM ' . MAIN_DB_PREFIX . $this->table_element . ' as t';
175
+        if ($id)   $sql.= " WHERE t.id = ".$id;
176
+        elseif ($code) $sql.= " WHERE t.code = '".$this->db->escape($code)."'";
177
+        elseif ($label) $sql.= " WHERE t.label = '".$this->db->escape($label)."'";
178
+
179
+
180
+        $resql = $this->db->query($sql);
181
+        if ($resql) {
182
+            $numrows = $this->db->num_rows($resql);
183
+            if ($numrows) {
184
+                $obj = $this->db->fetch_object($resql);
185
+
186
+                $this->id = $obj->rowid;
187
+
188
+                $this->code = $obj->code;
189
+                $this->label = $obj->label;
190
+                $this->active = $obj->active;
191
+            }
192
+
193
+            // Retrieve all extrafields for invoice
194
+            // fetch optionals attributes and labels
195
+            // $this->fetch_optionals();
196
+
197
+            // $this->fetch_lines();
198
+
199
+            $this->db->free($resql);
200
+
201
+            if ($numrows) {
202
+                return 1;
203
+            } else {
204
+                return 0;
205
+            }
206
+        } else {
207
+            $this->errors[] = 'Error ' . $this->db->lasterror();
208
+            dol_syslog(__METHOD__ . ' ' . implode(',', $this->errors), LOG_ERR);
209
+
210
+            return - 1;
211
+        }
212
+    }
213
+
214
+    /**
215
+     * Load object in memory from the database
216
+     *
217
+     * @param string $sortorder Sort Order
218
+     * @param string $sortfield Sort field
219
+     * @param int    $limit     offset limit
220
+     * @param int    $offset    offset limit
221
+     * @param array  $filter    filter array
222
+     * @param string $filtermode filter mode (AND or OR)
223
+     *
224
+     * @return int <0 if KO, >0 if OK
225
+     */
226
+    public function fetchAll($sortorder='', $sortfield='', $limit=0, $offset=0, array $filter = array(), $filtermode='AND')
227
+    {
228
+        dol_syslog(__METHOD__, LOG_DEBUG);
229
+
230
+        $sql = 'SELECT';
231
+        $sql .= ' t.rowid,';
232
+
233
+        $sql .= " t.code,";
234
+        $sql .= " t.label,";
235
+        $sql .= " t.active";
236
+
237
+
238
+        $sql .= ' FROM ' . MAIN_DB_PREFIX . $this->table_element. ' as t';
239
+
240
+        // Manage filter
241
+        $sqlwhere = array();
242
+        if (count($filter) > 0) {
243
+            foreach ($filter as $key => $value) {
244
+                $sqlwhere [] = $key . ' LIKE \'%' . $this->db->escape($value) . '%\'';
245
+            }
246
+        }
247
+
248
+        if (count($sqlwhere) > 0) {
249
+            $sql .= ' WHERE ' . implode(' '.$filtermode.' ', $sqlwhere);
250
+        }
251
+        if (!empty($sortfield)) {
252
+            $sql .= $this->db->order($sortfield,$sortorder);
253
+        }
254
+        if (!empty($limit)) {
255
+            $sql .=  ' ' . $this->db->plimit($limit, $offset);
256
+        }
257
+
258
+        $resql = $this->db->query($sql);
259
+        if ($resql) {
260
+            $num = $this->db->num_rows($resql);
261
+
262
+            while ($obj = $this->db->fetch_object($resql)) {
263
+                $line = new self($this->db);
264
+
265
+                $line->id = $obj->rowid;
266
+
267
+                $line->code = $obj->code;
268
+                $line->label = $obj->label;
269
+                $line->active = $obj->active;
270
+            }
271
+            $this->db->free($resql);
272
+
273
+            return $num;
274
+        } else {
275
+            $this->errors[] = 'Error ' . $this->db->lasterror();
276
+            dol_syslog(__METHOD__ . ' ' . implode(',', $this->errors), LOG_ERR);
277
+
278
+            return - 1;
279
+        }
280
+    }
281
+
282
+    /**
283
+     * Update object into database
284
+     *
285
+     * @param  User $user      User that modifies
286
+     * @param  bool $notrigger false=launch triggers after, true=disable triggers
287
+     *
288
+     * @return int <0 if KO, >0 if OK
289
+     */
290
+    public function update(User $user, $notrigger = false)
291
+    {
292
+        $error = 0;
293
+
294
+        dol_syslog(__METHOD__, LOG_DEBUG);
295
+
296
+        // Clean parameters
297
+
298
+        if (isset($this->code)) {
299
+                $this->code = trim($this->code);
300
+        }
301
+        if (isset($this->label)) {
302
+                $this->label = trim($this->label);
303
+        }
304
+        if (isset($this->active)) {
305
+                $this->active = trim($this->active);
306
+        }
307
+
308
+        // Check parameters
309
+        // Put here code to add a control on parameters values
310
+
311
+        // Update request
312
+        $sql = 'UPDATE ' . MAIN_DB_PREFIX . $this->table_element . ' SET';
313
+
314
+        $sql .= ' code = '.(isset($this->code)?"'".$this->db->escape($this->code)."'":"null").',';
315
+        $sql .= ' label = '.(isset($this->label)?"'".$this->db->escape($this->label)."'":"null").',';
316
+        $sql .= ' active = '.(isset($this->active)?$this->active:"null");
317
+
318
+
319
+        $sql .= ' WHERE rowid=' . $this->id;
320
+
321
+        $this->db->begin();
322
+
323
+        $resql = $this->db->query($sql);
324
+        if (!$resql) {
325
+            $error ++;
326
+            $this->errors[] = 'Error ' . $this->db->lasterror();
327
+            dol_syslog(__METHOD__ . ' ' . implode(',', $this->errors), LOG_ERR);
328
+        }
329
+
330
+        // Uncomment this and change MYOBJECT to your own tag if you
331
+        // want this action calls a trigger.
332
+        //if (!$error && !$notrigger) {
333
+
334
+        //  // Call triggers
335
+        //  $result=$this->call_trigger('MYOBJECT_MODIFY',$user);
336
+        //  if ($result < 0) { $error++; //Do also what you must do to rollback action if trigger fail}
337
+        //  // End call triggers
338
+        //}
339
+
340
+        // Commit or rollback
341
+        if ($error) {
342
+            $this->db->rollback();
343
+
344
+            return - 1 * $error;
345
+        } else {
346
+            $this->db->commit();
347
+
348
+            return 1;
349
+        }
350
+    }
351
+
352
+    /**
353
+     * Delete object in database
354
+     *
355
+     * @param User $user      User that deletes
356
+     * @param bool $notrigger false=launch triggers after, true=disable triggers
357
+     *
358
+     * @return int <0 if KO, >0 if OK
359
+     */
360
+    public function delete(User $user, $notrigger = false)
361
+    {
362
+        dol_syslog(__METHOD__, LOG_DEBUG);
363
+
364
+        $error = 0;
365
+
366
+        $this->db->begin();
367
+
368
+        // Uncomment this and change MYOBJECT to your own tag if you
369
+        // want this action calls a trigger.
370
+        //if (!$error && !$notrigger) {
371
+
372
+        //  // Call triggers
373
+        //  $result=$this->call_trigger('MYOBJECT_DELETE',$user);
374
+        //  if ($result < 0) { $error++; //Do also what you must do to rollback action if trigger fail}
375
+        //  // End call triggers
376
+        //}
377
+
378
+        // If you need to delete child tables to, you can insert them here
379
+
380
+        if (!$error) {
381
+            $sql = 'DELETE FROM ' . MAIN_DB_PREFIX . $this->table_element;
382
+            $sql .= ' WHERE rowid=' . $this->id;
383
+
384
+            $resql = $this->db->query($sql);
385
+            if (!$resql) {
386
+                $error ++;
387
+                $this->errors[] = 'Error ' . $this->db->lasterror();
388
+                dol_syslog(__METHOD__ . ' ' . implode(',', $this->errors), LOG_ERR);
389
+            }
390
+        }
391
+
392
+        // Commit or rollback
393
+        if ($error) {
394
+            $this->db->rollback();
395
+
396
+            return - 1 * $error;
397
+        } else {
398
+            $this->db->commit();
399
+
400
+            return 1;
401
+        }
402
+    }
403
+
404
+    /**
405
+     * Load an object from its id and create a new one in database
406
+     *
407
+     * @param int $fromid Id of object to clone
408
+     *
409
+     * @return int New id of clone
410
+     */
411
+    public function createFromClone($fromid)
412
+    {
413
+        dol_syslog(__METHOD__, LOG_DEBUG);
414
+
415
+        global $user;
416
+        $error = 0;
417
+        $object = new Ctyperesource($this->db);
418
+
419
+        $this->db->begin();
420
+
421
+        // Load source object
422
+        $object->fetch($fromid);
423
+        // Reset object
424
+        $object->id = 0;
425
+
426
+        // Clear fields
427
+        // ...
428
+
429
+        // Create clone
430
+        $result = $object->create($user);
431
+
432
+        // Other options
433
+        if ($result < 0) {
434
+            $error ++;
435
+            $this->errors = $object->errors;
436
+            dol_syslog(__METHOD__ . ' ' . implode(',', $this->errors), LOG_ERR);
437
+        }
438
+
439
+        // End
440
+        if (!$error) {
441
+            $this->db->commit();
442
+
443
+            return $object->id;
444
+        } else {
445
+            $this->db->rollback();
446
+
447
+            return - 1;
448
+        }
449
+    }
450
+
451
+    /**
452
+     * Initialise object with example values
453
+     * Id must be 0 if object instance is a specimen
454
+     *
455
+     * @return void
456
+     */
457
+    public function initAsSpecimen()
458
+    {
459
+        $this->id = 0;
460
+
461
+        $this->code = '';
462
+        $this->label = '';
463
+        $this->active = '';
464
+    }
465 465
 }
466 466
 
467 467
 /**
@@ -469,24 +469,24 @@  discard block
 block discarded – undo
469 469
  */
470 470
 class CtyperesourceLine
471 471
 {
472
-	/**
473
-	 * @var int ID
474
-	 */
475
-	public $id;
472
+    /**
473
+     * @var int ID
474
+     */
475
+    public $id;
476 476
 
477
-	/**
478
-	 * @var mixed Sample line property 1
479
-	 */
480
-	public $code;
477
+    /**
478
+     * @var mixed Sample line property 1
479
+     */
480
+    public $code;
481 481
 
482
-	/**
482
+    /**
483 483
      * @var string Type resource line label
484 484
      */
485 485
     public $label;
486 486
 
487
-	public $active;
487
+    public $active;
488 488
 
489
-	/**
490
-	 * @var mixed Sample line property 2
491
-	 */
489
+    /**
490
+     * @var mixed Sample line property 2
491
+     */
492 492
 }
Please login to merge, or discard this patch.
Spacing   +47 added lines, -47 removed lines patch added patch discarded remove patch
@@ -99,18 +99,18 @@  discard block
 block discarded – undo
99 99
 		// Put here code to add control on parameters values
100 100
 
101 101
 		// Insert request
102
-		$sql = 'INSERT INTO ' . MAIN_DB_PREFIX . $this->table_element . '(';
102
+		$sql = 'INSERT INTO '.MAIN_DB_PREFIX.$this->table_element.'(';
103 103
 
104
-		$sql.= 'code,';
105
-		$sql.= 'label';
106
-		$sql.= 'active';
104
+		$sql .= 'code,';
105
+		$sql .= 'label';
106
+		$sql .= 'active';
107 107
 
108 108
 
109 109
 		$sql .= ') VALUES (';
110 110
 
111
-		$sql .= ' '.(! isset($this->code)?'NULL':"'".$this->db->escape($this->code)."'").',';
112
-		$sql .= ' '.(! isset($this->label)?'NULL':"'".$this->db->escape($this->label)."'").',';
113
-		$sql .= ' '.(! isset($this->active)?'NULL':$this->active);
111
+		$sql .= ' '.(!isset($this->code) ? 'NULL' : "'".$this->db->escape($this->code)."'").',';
112
+		$sql .= ' '.(!isset($this->label) ? 'NULL' : "'".$this->db->escape($this->label)."'").',';
113
+		$sql .= ' '.(!isset($this->active) ? 'NULL' : $this->active);
114 114
 
115 115
 
116 116
 		$sql .= ')';
@@ -119,13 +119,13 @@  discard block
 block discarded – undo
119 119
 
120 120
 		$resql = $this->db->query($sql);
121 121
 		if (!$resql) {
122
-			$error ++;
123
-			$this->errors[] = 'Error ' . $this->db->lasterror();
124
-			dol_syslog(__METHOD__ . ' ' . implode(',', $this->errors), LOG_ERR);
122
+			$error++;
123
+			$this->errors[] = 'Error '.$this->db->lasterror();
124
+			dol_syslog(__METHOD__.' '.implode(',', $this->errors), LOG_ERR);
125 125
 		}
126 126
 
127 127
 		if (!$error) {
128
-			$this->id = $this->db->last_insert_id(MAIN_DB_PREFIX . $this->table_element);
128
+			$this->id = $this->db->last_insert_id(MAIN_DB_PREFIX.$this->table_element);
129 129
 
130 130
 			// Uncomment this and change MYOBJECT to your own tag if you
131 131
 			// want this action to call a trigger.
@@ -142,7 +142,7 @@  discard block
 block discarded – undo
142 142
 		if ($error) {
143 143
 			$this->db->rollback();
144 144
 
145
-			return - 1 * $error;
145
+			return -1 * $error;
146 146
 		} else {
147 147
 			$this->db->commit();
148 148
 
@@ -159,7 +159,7 @@  discard block
 block discarded – undo
159 159
 	 *
160 160
 	 * @return int <0 if KO, 0 if not found, >0 if OK
161 161
 	 */
162
-	public function fetch($id,$code='',$label='')
162
+	public function fetch($id, $code = '', $label = '')
163 163
 	{
164 164
 		dol_syslog(__METHOD__, LOG_DEBUG);
165 165
 
@@ -171,10 +171,10 @@  discard block
 block discarded – undo
171 171
 		$sql .= " t.active";
172 172
 
173 173
 
174
-		$sql .= ' FROM ' . MAIN_DB_PREFIX . $this->table_element . ' as t';
175
-		if ($id)   $sql.= " WHERE t.id = ".$id;
176
-		elseif ($code) $sql.= " WHERE t.code = '".$this->db->escape($code)."'";
177
-		elseif ($label) $sql.= " WHERE t.label = '".$this->db->escape($label)."'";
174
+		$sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' as t';
175
+		if ($id)   $sql .= " WHERE t.id = ".$id;
176
+		elseif ($code) $sql .= " WHERE t.code = '".$this->db->escape($code)."'";
177
+		elseif ($label) $sql .= " WHERE t.label = '".$this->db->escape($label)."'";
178 178
 
179 179
 
180 180
 		$resql = $this->db->query($sql);
@@ -204,10 +204,10 @@  discard block
 block discarded – undo
204 204
 				return 0;
205 205
 			}
206 206
 		} else {
207
-			$this->errors[] = 'Error ' . $this->db->lasterror();
208
-			dol_syslog(__METHOD__ . ' ' . implode(',', $this->errors), LOG_ERR);
207
+			$this->errors[] = 'Error '.$this->db->lasterror();
208
+			dol_syslog(__METHOD__.' '.implode(',', $this->errors), LOG_ERR);
209 209
 
210
-			return - 1;
210
+			return -1;
211 211
 		}
212 212
 	}
213 213
 
@@ -223,7 +223,7 @@  discard block
 block discarded – undo
223 223
 	 *
224 224
 	 * @return int <0 if KO, >0 if OK
225 225
 	 */
226
-	public function fetchAll($sortorder='', $sortfield='', $limit=0, $offset=0, array $filter = array(), $filtermode='AND')
226
+	public function fetchAll($sortorder = '', $sortfield = '', $limit = 0, $offset = 0, array $filter = array(), $filtermode = 'AND')
227 227
 	{
228 228
 		dol_syslog(__METHOD__, LOG_DEBUG);
229 229
 
@@ -235,24 +235,24 @@  discard block
 block discarded – undo
235 235
 		$sql .= " t.active";
236 236
 
237 237
 
238
-		$sql .= ' FROM ' . MAIN_DB_PREFIX . $this->table_element. ' as t';
238
+		$sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' as t';
239 239
 
240 240
 		// Manage filter
241 241
 		$sqlwhere = array();
242 242
 		if (count($filter) > 0) {
243 243
 			foreach ($filter as $key => $value) {
244
-				$sqlwhere [] = $key . ' LIKE \'%' . $this->db->escape($value) . '%\'';
244
+				$sqlwhere [] = $key.' LIKE \'%'.$this->db->escape($value).'%\'';
245 245
 			}
246 246
 		}
247 247
 
248 248
 		if (count($sqlwhere) > 0) {
249
-			$sql .= ' WHERE ' . implode(' '.$filtermode.' ', $sqlwhere);
249
+			$sql .= ' WHERE '.implode(' '.$filtermode.' ', $sqlwhere);
250 250
 		}
251 251
 		if (!empty($sortfield)) {
252
-			$sql .= $this->db->order($sortfield,$sortorder);
252
+			$sql .= $this->db->order($sortfield, $sortorder);
253 253
 		}
254 254
 		if (!empty($limit)) {
255
-		 $sql .=  ' ' . $this->db->plimit($limit, $offset);
255
+		 $sql .= ' '.$this->db->plimit($limit, $offset);
256 256
 		}
257 257
 
258 258
 		$resql = $this->db->query($sql);
@@ -272,10 +272,10 @@  discard block
 block discarded – undo
272 272
 
273 273
 			return $num;
274 274
 		} else {
275
-			$this->errors[] = 'Error ' . $this->db->lasterror();
276
-			dol_syslog(__METHOD__ . ' ' . implode(',', $this->errors), LOG_ERR);
275
+			$this->errors[] = 'Error '.$this->db->lasterror();
276
+			dol_syslog(__METHOD__.' '.implode(',', $this->errors), LOG_ERR);
277 277
 
278
-			return - 1;
278
+			return -1;
279 279
 		}
280 280
 	}
281 281
 
@@ -309,22 +309,22 @@  discard block
 block discarded – undo
309 309
 		// Put here code to add a control on parameters values
310 310
 
311 311
 		// Update request
312
-		$sql = 'UPDATE ' . MAIN_DB_PREFIX . $this->table_element . ' SET';
312
+		$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element.' SET';
313 313
 
314
-		$sql .= ' code = '.(isset($this->code)?"'".$this->db->escape($this->code)."'":"null").',';
315
-		$sql .= ' label = '.(isset($this->label)?"'".$this->db->escape($this->label)."'":"null").',';
316
-		$sql .= ' active = '.(isset($this->active)?$this->active:"null");
314
+		$sql .= ' code = '.(isset($this->code) ? "'".$this->db->escape($this->code)."'" : "null").',';
315
+		$sql .= ' label = '.(isset($this->label) ? "'".$this->db->escape($this->label)."'" : "null").',';
316
+		$sql .= ' active = '.(isset($this->active) ? $this->active : "null");
317 317
 
318 318
 
319
-		$sql .= ' WHERE rowid=' . $this->id;
319
+		$sql .= ' WHERE rowid='.$this->id;
320 320
 
321 321
 		$this->db->begin();
322 322
 
323 323
 		$resql = $this->db->query($sql);
324 324
 		if (!$resql) {
325
-			$error ++;
326
-			$this->errors[] = 'Error ' . $this->db->lasterror();
327
-			dol_syslog(__METHOD__ . ' ' . implode(',', $this->errors), LOG_ERR);
325
+			$error++;
326
+			$this->errors[] = 'Error '.$this->db->lasterror();
327
+			dol_syslog(__METHOD__.' '.implode(',', $this->errors), LOG_ERR);
328 328
 		}
329 329
 
330 330
 		// Uncomment this and change MYOBJECT to your own tag if you
@@ -341,7 +341,7 @@  discard block
 block discarded – undo
341 341
 		if ($error) {
342 342
 			$this->db->rollback();
343 343
 
344
-			return - 1 * $error;
344
+			return -1 * $error;
345 345
 		} else {
346 346
 			$this->db->commit();
347 347
 
@@ -378,14 +378,14 @@  discard block
 block discarded – undo
378 378
 		// If you need to delete child tables to, you can insert them here
379 379
 
380 380
 		if (!$error) {
381
-			$sql = 'DELETE FROM ' . MAIN_DB_PREFIX . $this->table_element;
382
-			$sql .= ' WHERE rowid=' . $this->id;
381
+			$sql = 'DELETE FROM '.MAIN_DB_PREFIX.$this->table_element;
382
+			$sql .= ' WHERE rowid='.$this->id;
383 383
 
384 384
 			$resql = $this->db->query($sql);
385 385
 			if (!$resql) {
386
-				$error ++;
387
-				$this->errors[] = 'Error ' . $this->db->lasterror();
388
-				dol_syslog(__METHOD__ . ' ' . implode(',', $this->errors), LOG_ERR);
386
+				$error++;
387
+				$this->errors[] = 'Error '.$this->db->lasterror();
388
+				dol_syslog(__METHOD__.' '.implode(',', $this->errors), LOG_ERR);
389 389
 			}
390 390
 		}
391 391
 
@@ -393,7 +393,7 @@  discard block
 block discarded – undo
393 393
 		if ($error) {
394 394
 			$this->db->rollback();
395 395
 
396
-			return - 1 * $error;
396
+			return -1 * $error;
397 397
 		} else {
398 398
 			$this->db->commit();
399 399
 
@@ -431,9 +431,9 @@  discard block
 block discarded – undo
431 431
 
432 432
 		// Other options
433 433
 		if ($result < 0) {
434
-			$error ++;
434
+			$error++;
435 435
 			$this->errors = $object->errors;
436
-			dol_syslog(__METHOD__ . ' ' . implode(',', $this->errors), LOG_ERR);
436
+			dol_syslog(__METHOD__.' '.implode(',', $this->errors), LOG_ERR);
437 437
 		}
438 438
 
439 439
 		// End
@@ -444,7 +444,7 @@  discard block
 block discarded – undo
444 444
 		} else {
445 445
 			$this->db->rollback();
446 446
 
447
-			return - 1;
447
+			return -1;
448 448
 		}
449 449
 	}
450 450
 
Please login to merge, or discard this patch.
Braces   +7 added lines, -3 removed lines patch added patch discarded remove patch
@@ -172,9 +172,13 @@
 block discarded – undo
172 172
 
173 173
 
174 174
 		$sql .= ' FROM ' . MAIN_DB_PREFIX . $this->table_element . ' as t';
175
-		if ($id)   $sql.= " WHERE t.id = ".$id;
176
-		elseif ($code) $sql.= " WHERE t.code = '".$this->db->escape($code)."'";
177
-		elseif ($label) $sql.= " WHERE t.label = '".$this->db->escape($label)."'";
175
+		if ($id) {
176
+		    $sql.= " WHERE t.id = ".$id;
177
+		} elseif ($code) {
178
+		    $sql.= " WHERE t.code = '".$this->db->escape($code)."'";
179
+		} elseif ($label) {
180
+		    $sql.= " WHERE t.label = '".$this->db->escape($label)."'";
181
+		}
178 182
 
179 183
 
180 184
 		$resql = $this->db->query($sql);
Please login to merge, or discard this patch.
dolibarr/htdocs/core/class/html.formsms.class.php 3 patches
Indentation   +6 added lines, -6 removed lines patch added patch discarded remove patch
@@ -102,7 +102,7 @@  discard block
 block discarded – undo
102 102
      */
103 103
     function show_form($morecss='titlefield', $showform=1)
104 104
     {
105
-     // phpcs:enable
105
+        // phpcs:enable
106 106
         global $conf, $langs, $user, $form;
107 107
 
108 108
         if (! is_object($form)) $form=new Form($this->db);
@@ -218,13 +218,13 @@  discard block
 block discarded – undo
218 218
                         $classname=ucfirst($classfile);
219 219
                         if (class_exists($classname))
220 220
                         {
221
-                        	$sms = new $classname($this->db);
222
-                        	$resultsender = $sms->SmsSenderList();
221
+                            $sms = new $classname($this->db);
222
+                            $resultsender = $sms->SmsSenderList();
223 223
                         }
224 224
                         else
225 225
                         {
226
-                        	$sms = new stdClass();
227
-                        	$sms->error='The SMS manager "'.$classfile.'" defined into SMS setup MAIN_SMS_SENDMODE is not found';
226
+                            $sms = new stdClass();
227
+                            $sms->error='The SMS manager "'.$classfile.'" defined into SMS setup MAIN_SMS_SENDMODE is not found';
228 228
                         }
229 229
                     }
230 230
                     catch(Exception $e)
@@ -236,7 +236,7 @@  discard block
 block discarded – undo
236 236
                 else
237 237
                 {
238 238
                     dol_syslog("Warning: The SMS sending method has not been defined into MAIN_SMS_SENDMODE", LOG_WARNING);
239
-	                $resultsender=array();
239
+                    $resultsender=array();
240 240
                     $resultsender[0]->number=$this->fromsms;
241 241
                 }
242 242
 
Please login to merge, or discard this patch.
Spacing   +50 added lines, -50 removed lines patch added patch discarded remove patch
@@ -22,7 +22,7 @@  discard block
 block discarded – undo
22 22
  *       \ingroup    core
23 23
  *       \brief      Fichier de la classe permettant la generation du formulaire html d'envoi de mail unitaire
24 24
  */
25
-require_once DOL_DOCUMENT_ROOT .'/core/class/html.form.class.php';
25
+require_once DOL_DOCUMENT_ROOT.'/core/class/html.form.class.php';
26 26
 
27 27
 
28 28
 /**
@@ -45,7 +45,7 @@  discard block
 block discarded – undo
45 45
     public $toname;
46 46
     public $tomail;
47 47
 
48
-    public $withsubstit;			// Show substitution array
48
+    public $withsubstit; // Show substitution array
49 49
     public $withfrom;
50 50
     public $withto;
51 51
     public $withtopic;
@@ -57,18 +57,18 @@  discard block
 block discarded – undo
57 57
     public $withtopicreadonly;
58 58
     public $withcancel;
59 59
 
60
-    public $substit=array();
61
-    public $param=array();
60
+    public $substit = array();
61
+    public $param = array();
62 62
 
63 63
     /**
64 64
      * @var string Error code (or message)
65 65
      */
66
-    public $error='';
66
+    public $error = '';
67 67
 
68 68
     /**
69 69
      * @var string[]	Array of error strings
70 70
      */
71
-    public $errors=array();
71
+    public $errors = array();
72 72
 
73 73
 
74 74
     /**
@@ -80,16 +80,16 @@  discard block
 block discarded – undo
80 80
     {
81 81
         $this->db = $db;
82 82
 
83
-        $this->withfrom=1;
84
-        $this->withto=1;
85
-        $this->withtopic=1;
86
-        $this->withbody=1;
83
+        $this->withfrom = 1;
84
+        $this->withto = 1;
85
+        $this->withtopic = 1;
86
+        $this->withbody = 1;
87 87
 
88
-        $this->withfromreadonly=1;
89
-        $this->withreplytoreadonly=1;
90
-        $this->withtoreadonly=0;
91
-        $this->withtopicreadonly=0;
92
-        $this->withbodyreadonly=0;
88
+        $this->withfromreadonly = 1;
89
+        $this->withreplytoreadonly = 1;
90
+        $this->withtoreadonly = 0;
91
+        $this->withtopicreadonly = 0;
92
+        $this->withbodyreadonly = 0;
93 93
     }
94 94
 
95 95
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
@@ -100,17 +100,17 @@  discard block
 block discarded – undo
100 100
      *  @param int $showform Show form tags and submit button (recommanded is to use with value 0)
101 101
      *	@return	void
102 102
      */
103
-    function show_form($morecss='titlefield', $showform=1)
103
+    function show_form($morecss = 'titlefield', $showform = 1)
104 104
     {
105 105
      // phpcs:enable
106 106
         global $conf, $langs, $user, $form;
107 107
 
108
-        if (! is_object($form)) $form=new Form($this->db);
108
+        if (!is_object($form)) $form = new Form($this->db);
109 109
 
110 110
         // Load translation files required by the page
111 111
         $langs->loadLangs(array('other', 'mails', 'sms'));
112 112
 
113
-        $soc=new Societe($this->db);
113
+        $soc = new Societe($this->db);
114 114
         if (!empty($this->withtosocid) && $this->withtosocid > 0)
115 115
         {
116 116
             $soc->fetch($this->withtosocid);
@@ -141,15 +141,15 @@  discard block
 block discarded – undo
141 141
         print "<table class=\"border centpercent\">\n";
142 142
 
143 143
         // Substitution array
144
-        if (! empty($this->withsubstit))		// Unset or set ->withsubstit=0 to disable this.
144
+        if (!empty($this->withsubstit))		// Unset or set ->withsubstit=0 to disable this.
145 145
         {
146 146
             print "<tr><td colspan=\"2\">";
147
-            $help="";
148
-            foreach($this->substit as $key => $val)
147
+            $help = "";
148
+            foreach ($this->substit as $key => $val)
149 149
             {
150
-                $help.=$key.' -> '.$langs->trans($val).'<br>';
150
+                $help .= $key.' -> '.$langs->trans($val).'<br>';
151 151
             }
152
-            print $form->textwithpicto($langs->trans("SmsTestSubstitutionReplacedByGenericValues"),$help);
152
+            print $form->textwithpicto($langs->trans("SmsTestSubstitutionReplacedByGenericValues"), $help);
153 153
             print "</td></tr>\n";
154 154
         }
155 155
 
@@ -164,7 +164,7 @@  discard block
 block discarded – undo
164 164
                 if ($this->fromtype == 'user')
165 165
                 {
166 166
                     $langs->load("users");
167
-                    $fuser=new User($this->db);
167
+                    $fuser = new User($this->db);
168 168
                     $fuser->fetch($this->fromid);
169 169
                     print $fuser->getNomUrl(1);
170 170
                     print ' &nbsp; ';
@@ -203,19 +203,19 @@  discard block
 block discarded – undo
203 203
                             $resultsender = $sms->SmsSenderList();
204 204
                         }
205 205
                     }
206
-                    catch(Exception $e)
206
+                    catch (Exception $e)
207 207
                     {
208
-                        dol_print_error('','Error to get list of senders: '.$e->getMessage());
208
+                        dol_print_error('', 'Error to get list of senders: '.$e->getMessage());
209 209
                     }
210 210
                 }
211 211
                 else if (!empty($conf->global->MAIN_SMS_SENDMODE))    // $conf->global->MAIN_SMS_SENDMODE looks like a value 'class@module'
212 212
                 {
213
-                    $tmp=explode('@',$conf->global->MAIN_SMS_SENDMODE);
214
-                    $classfile=$tmp[0]; $module=(empty($tmp[1])?$tmp[0]:$tmp[1]);
213
+                    $tmp = explode('@', $conf->global->MAIN_SMS_SENDMODE);
214
+                    $classfile = $tmp[0]; $module = (empty($tmp[1]) ? $tmp[0] : $tmp[1]);
215 215
                     dol_include_once('/'.$module.'/class/'.$classfile.'.class.php');
216 216
                     try
217 217
                     {
218
-                        $classname=ucfirst($classfile);
218
+                        $classname = ucfirst($classfile);
219 219
                         if (class_exists($classname))
220 220
                         {
221 221
                         	$sms = new $classname($this->db);
@@ -224,26 +224,26 @@  discard block
 block discarded – undo
224 224
                         else
225 225
                         {
226 226
                         	$sms = new stdClass();
227
-                        	$sms->error='The SMS manager "'.$classfile.'" defined into SMS setup MAIN_SMS_SENDMODE is not found';
227
+                        	$sms->error = 'The SMS manager "'.$classfile.'" defined into SMS setup MAIN_SMS_SENDMODE is not found';
228 228
                         }
229 229
                     }
230
-                    catch(Exception $e)
230
+                    catch (Exception $e)
231 231
                     {
232
-                        dol_print_error('','Error to get list of senders: '.$e->getMessage());
232
+                        dol_print_error('', 'Error to get list of senders: '.$e->getMessage());
233 233
                         exit;
234 234
                     }
235 235
                 }
236 236
                 else
237 237
                 {
238 238
                     dol_syslog("Warning: The SMS sending method has not been defined into MAIN_SMS_SENDMODE", LOG_WARNING);
239
-	                $resultsender=array();
240
-                    $resultsender[0]->number=$this->fromsms;
239
+	                $resultsender = array();
240
+                    $resultsender[0]->number = $this->fromsms;
241 241
                 }
242 242
 
243 243
                 if (is_array($resultsender) && count($resultsender) > 0)
244 244
                 {
245 245
                     print '<select name="fromsms" id="fromsms" class="flat">';
246
-                    foreach($resultsender as $obj)
246
+                    foreach ($resultsender as $obj)
247 247
                     {
248 248
                         print '<option value="'.$obj->number.'">'.$obj->number.'</option>';
249 249
                     }
@@ -252,7 +252,7 @@  discard block
 block discarded – undo
252 252
                 else
253 253
                 {
254 254
                     print '<span class="error">'.$langs->trans("SmsNoPossibleSenderFound");
255
-                    if (is_object($sms) && ! empty($sms->error)) print ' '.$sms->error;
255
+                    if (is_object($sms) && !empty($sms->error)) print ' '.$sms->error;
256 256
                     print '</span>';
257 257
                 }
258 258
                 print '</td>';
@@ -265,22 +265,22 @@  discard block
 block discarded – undo
265 265
         {
266 266
             print '<tr><td>';
267 267
             //$moretext=$langs->trans("YouCanUseCommaSeparatorForSeveralRecipients");
268
-            $moretext='';
269
-            print $form->textwithpicto($langs->trans("SmsTo"),$moretext);
268
+            $moretext = '';
269
+            print $form->textwithpicto($langs->trans("SmsTo"), $moretext);
270 270
             print '</td><td>';
271 271
             if ($this->withtoreadonly)
272 272
             {
273
-                print (! is_array($this->withto) && ! is_numeric($this->withto))?$this->withto:"";
273
+                print (!is_array($this->withto) && !is_numeric($this->withto)) ? $this->withto : "";
274 274
             }
275 275
             else
276 276
             {
277
-                print "<input size=\"16\" id=\"sendto\" name=\"sendto\" value=\"".dol_escape_htmltag(! is_array($this->withto) && $this->withto != '1'? (isset($_REQUEST["sendto"])?GETPOST("sendto"):$this->withto):"+")."\">";
278
-                if (! empty($this->withtosocid) && $this->withtosocid > 0)
277
+                print "<input size=\"16\" id=\"sendto\" name=\"sendto\" value=\"".dol_escape_htmltag(!is_array($this->withto) && $this->withto != '1' ? (isset($_REQUEST["sendto"]) ?GETPOST("sendto") : $this->withto) : "+")."\">";
278
+                if (!empty($this->withtosocid) && $this->withtosocid > 0)
279 279
                 {
280
-                    $liste=array();
280
+                    $liste = array();
281 281
                     foreach ($soc->thirdparty_and_contact_phone_array() as $key => $value)
282 282
                     {
283
-                        $liste[$key]=$value;
283
+                        $liste[$key] = $value;
284 284
                     }
285 285
                     print " ".$langs->trans("or")." ";
286 286
                     //var_dump($_REQUEST);exit;
@@ -294,14 +294,14 @@  discard block
 block discarded – undo
294 294
         // Message
295 295
         if ($this->withbody)
296 296
         {
297
-            $defaultmessage='';
298
-            if ($this->param["models"]=='body')
297
+            $defaultmessage = '';
298
+            if ($this->param["models"] == 'body')
299 299
             {
300
-                $defaultmessage=$this->withbody;
300
+                $defaultmessage = $this->withbody;
301 301
             }
302
-            $defaultmessage=make_substitutions($defaultmessage,$this->substit);
303
-            if (isset($_POST["message"])) $defaultmessage=$_POST["message"];
304
-            $defaultmessage=str_replace('\n',"\n",$defaultmessage);
302
+            $defaultmessage = make_substitutions($defaultmessage, $this->substit);
303
+            if (isset($_POST["message"])) $defaultmessage = $_POST["message"];
304
+            $defaultmessage = str_replace('\n', "\n", $defaultmessage);
305 305
 
306 306
             print "<tr>";
307 307
             print '<td class="tdtop">'.$langs->trans("SmsText")."</td>";
@@ -314,7 +314,7 @@  discard block
 block discarded – undo
314 314
             else
315 315
             {
316 316
                 print '<textarea class="quatrevingtpercent" name="message" id="message" rows="'.ROWS_4.'" onkeyup="limitChars(this, 160, \'charlimitinfospan\')">'.$defaultmessage.'</textarea>';
317
-                print '<div id="charlimitinfo">'.$langs->trans("SmsInfoCharRemain").': <span id="charlimitinfospan">'.(160-dol_strlen($defaultmessage)).'</span></div></td>';
317
+                print '<div id="charlimitinfo">'.$langs->trans("SmsInfoCharRemain").': <span id="charlimitinfospan">'.(160 - dol_strlen($defaultmessage)).'</span></div></td>';
318 318
             }
319 319
             print "</td></tr>\n";
320 320
         }
Please login to merge, or discard this patch.
Braces   +31 added lines, -28 removed lines patch added patch discarded remove patch
@@ -105,7 +105,9 @@  discard block
 block discarded – undo
105 105
      // phpcs:enable
106 106
         global $conf, $langs, $user, $form;
107 107
 
108
-        if (! is_object($form)) $form=new Form($this->db);
108
+        if (! is_object($form)) {
109
+            $form=new Form($this->db);
110
+        }
109 111
 
110 112
         // Load translation files required by the page
111 113
         $langs->loadLangs(array('other', 'mails', 'sms'));
@@ -131,7 +133,9 @@  discard block
 block discarded – undo
131 133
 }
132 134
 </script>';
133 135
 
134
-        if ($showform) print "<form method=\"POST\" name=\"smsform\" enctype=\"multipart/form-data\" action=\"".$this->param["returnurl"]."\">\n";
136
+        if ($showform) {
137
+            print "<form method=\"POST\" name=\"smsform\" enctype=\"multipart/form-data\" action=\"".$this->param["returnurl"]."\">\n";
138
+        }
135 139
 
136 140
         print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
137 141
         foreach ($this->param as $key=>$value)
@@ -141,9 +145,11 @@  discard block
 block discarded – undo
141 145
         print "<table class=\"border centpercent\">\n";
142 146
 
143 147
         // Substitution array
144
-        if (! empty($this->withsubstit))		// Unset or set ->withsubstit=0 to disable this.
148
+        if (! empty($this->withsubstit)) {
149
+            // Unset or set ->withsubstit=0 to disable this.
145 150
         {
146 151
             print "<tr><td colspan=\"2\">";
152
+        }
147 153
             $help="";
148 154
             foreach($this->substit as $key => $val)
149 155
             {
@@ -172,8 +178,7 @@  discard block
 block discarded – undo
172 178
                 if ($this->fromsms)
173 179
                 {
174 180
                     print $this->fromsms;
175
-                }
176
-                else
181
+                } else
177 182
                 {
178 183
                     if ($this->fromtype)
179 184
                     {
@@ -183,34 +188,34 @@  discard block
 block discarded – undo
183 188
                 }
184 189
                 print "</td></tr>\n";
185 190
                 print "</td></tr>\n";
186
-            }
187
-            else
191
+            } else
188 192
             {
189 193
                 print '<tr><td class="'.$morecss.'">'.$langs->trans("SmsFrom")."</td><td>";
190 194
                 //print '<input type="text" name="fromname" size="30" value="'.$this->fromsms.'">';
191
-                if ($conf->global->MAIN_SMS_SENDMODE == 'ovh')        // For backward compatibility        @deprecated
195
+                if ($conf->global->MAIN_SMS_SENDMODE == 'ovh') {
196
+                    // For backward compatibility        @deprecated
192 197
                 {
193 198
                     dol_include_once('/ovh/class/ovhsms.class.php');
199
+                }
194 200
                     try
195 201
                     {
196 202
                         $sms = new OvhSms($this->db);
197 203
                         if (empty($conf->global->OVHSMS_ACCOUNT))
198 204
                         {
199 205
                             $resultsender = 'ErrorOVHSMS_ACCOUNT not defined';
200
-                        }
201
-                        else
206
+                        } else
202 207
                         {
203 208
                             $resultsender = $sms->SmsSenderList();
204 209
                         }
205
-                    }
206
-                    catch(Exception $e)
210
+                    } catch(Exception $e)
207 211
                     {
208 212
                         dol_print_error('','Error to get list of senders: '.$e->getMessage());
209 213
                     }
210
-                }
211
-                else if (!empty($conf->global->MAIN_SMS_SENDMODE))    // $conf->global->MAIN_SMS_SENDMODE looks like a value 'class@module'
214
+                } else if (!empty($conf->global->MAIN_SMS_SENDMODE)) {
215
+                    // $conf->global->MAIN_SMS_SENDMODE looks like a value 'class@module'
212 216
                 {
213 217
                     $tmp=explode('@',$conf->global->MAIN_SMS_SENDMODE);
218
+                }
214 219
                     $classfile=$tmp[0]; $module=(empty($tmp[1])?$tmp[0]:$tmp[1]);
215 220
                     dol_include_once('/'.$module.'/class/'.$classfile.'.class.php');
216 221
                     try
@@ -220,20 +225,17 @@  discard block
 block discarded – undo
220 225
                         {
221 226
                         	$sms = new $classname($this->db);
222 227
                         	$resultsender = $sms->SmsSenderList();
223
-                        }
224
-                        else
228
+                        } else
225 229
                         {
226 230
                         	$sms = new stdClass();
227 231
                         	$sms->error='The SMS manager "'.$classfile.'" defined into SMS setup MAIN_SMS_SENDMODE is not found';
228 232
                         }
229
-                    }
230
-                    catch(Exception $e)
233
+                    } catch(Exception $e)
231 234
                     {
232 235
                         dol_print_error('','Error to get list of senders: '.$e->getMessage());
233 236
                         exit;
234 237
                     }
235
-                }
236
-                else
238
+                } else
237 239
                 {
238 240
                     dol_syslog("Warning: The SMS sending method has not been defined into MAIN_SMS_SENDMODE", LOG_WARNING);
239 241
 	                $resultsender=array();
@@ -248,11 +250,12 @@  discard block
 block discarded – undo
248 250
                         print '<option value="'.$obj->number.'">'.$obj->number.'</option>';
249 251
                     }
250 252
                     print '</select>';
251
-                }
252
-                else
253
+                } else
253 254
                 {
254 255
                     print '<span class="error">'.$langs->trans("SmsNoPossibleSenderFound");
255
-                    if (is_object($sms) && ! empty($sms->error)) print ' '.$sms->error;
256
+                    if (is_object($sms) && ! empty($sms->error)) {
257
+                        print ' '.$sms->error;
258
+                    }
256 259
                     print '</span>';
257 260
                 }
258 261
                 print '</td>';
@@ -271,8 +274,7 @@  discard block
 block discarded – undo
271 274
             if ($this->withtoreadonly)
272 275
             {
273 276
                 print (! is_array($this->withto) && ! is_numeric($this->withto))?$this->withto:"";
274
-            }
275
-            else
277
+            } else
276 278
             {
277 279
                 print "<input size=\"16\" id=\"sendto\" name=\"sendto\" value=\"".dol_escape_htmltag(! is_array($this->withto) && $this->withto != '1'? (isset($_REQUEST["sendto"])?GETPOST("sendto"):$this->withto):"+")."\">";
278 280
                 if (! empty($this->withtosocid) && $this->withtosocid > 0)
@@ -300,7 +302,9 @@  discard block
 block discarded – undo
300 302
                 $defaultmessage=$this->withbody;
301 303
             }
302 304
             $defaultmessage=make_substitutions($defaultmessage,$this->substit);
303
-            if (isset($_POST["message"])) $defaultmessage=$_POST["message"];
305
+            if (isset($_POST["message"])) {
306
+                $defaultmessage=$_POST["message"];
307
+            }
304 308
             $defaultmessage=str_replace('\n',"\n",$defaultmessage);
305 309
 
306 310
             print "<tr>";
@@ -310,8 +314,7 @@  discard block
 block discarded – undo
310 314
             {
311 315
                 print nl2br($defaultmessage);
312 316
                 print '<input type="hidden" name="message" value="'.dol_escape_htmltag($defaultmessage).'">';
313
-            }
314
-            else
317
+            } else
315 318
             {
316 319
                 print '<textarea class="quatrevingtpercent" name="message" id="message" rows="'.ROWS_4.'" onkeyup="limitChars(this, 160, \'charlimitinfospan\')">'.$defaultmessage.'</textarea>';
317 320
                 print '<div id="charlimitinfo">'.$langs->trans("SmsInfoCharRemain").': <span id="charlimitinfospan">'.(160-dol_strlen($defaultmessage)).'</span></div></td>';
Please login to merge, or discard this patch.
dolibarr/htdocs/core/class/genericobject.class.php 1 patch
Spacing   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -20,7 +20,7 @@  discard block
 block discarded – undo
20 20
  *	\ingroup    core
21 21
  *	\brief      File of class of generic business class
22 22
  */
23
-require_once DOL_DOCUMENT_ROOT .'/core/class/commonobject.class.php';
23
+require_once DOL_DOCUMENT_ROOT.'/core/class/commonobject.class.php';
24 24
 
25 25
 
26 26
 /**
@@ -36,6 +36,6 @@  discard block
 block discarded – undo
36 36
      */
37 37
     function __construct($db)
38 38
     {
39
-        $this->db=$db;
39
+        $this->db = $db;
40 40
     }
41 41
 }
Please login to merge, or discard this patch.
dolibarr/htdocs/core/class/CMailFile.class.php 3 patches
Indentation   +1425 added lines, -1425 removed lines patch added patch discarded remove patch
@@ -36,323 +36,323 @@  discard block
 block discarded – undo
36 36
  */
37 37
 class CMailFile
38 38
 {
39
-	public $sendcontext;
40
-	public $sendmode;
41
-	public $sendsetup;
42
-
43
-	var $subject;      	// Topic:       Subject of email
44
-	var $addr_from;    	// From:		Label and EMail of sender (must include '<>'). For example '<[email protected]>' or 'John Doe <[email protected]>' or '<[email protected]>'). Note that with gmail smtps, value here is forced by google to account (but not the reply-to).
45
-	// Sender:      Who send the email ("Sender" has sent emails on behalf of "From").
46
-	//              Use it when the "From" is an email of a domain that is a SPF protected domain, and sending smtp server is not this domain. In such case, add Sender field with an email of the protected domain.
47
-	// Return-Path: Email where to send bounds.
48
-	var $reply_to;		// Reply-To:	Email where to send replies from mailer software (mailer use From if reply-to not defined, Gmail use gmail account if reply-to not defined)
49
-	var $errors_to;		// Errors-To:	Email where to send errors.
50
-	var $addr_to;
51
-	var $addr_cc;
52
-	var $addr_bcc;
53
-	var $trackid;
54
-
55
-	var $mixed_boundary;
56
-	var $related_boundary;
57
-	var $alternative_boundary;
58
-	var $deliveryreceipt;
59
-
60
-	var $eol;
61
-	var $eol2;
62
-
63
-	/**
64
-	 * @var string Error code (or message)
65
-	 */
66
-	public $error='';
67
-
68
-	var $smtps;			// Contains SMTPs object (if this method is used)
69
-	var $phpmailer;		// Contains PHPMailer object (if this method is used)
70
-
71
-	/**
72
-	 * @var string CSS
73
-	 */
74
-	public $css;
75
-	//! Defined css style for body background
76
-	var $styleCSS;
77
-	//! Defined background directly in body tag
78
-	var $bodyCSS;
79
-
80
-	var $headers;
81
-	var $message;
82
-
83
-	// Image
84
-	var $html;
85
-	var $image_boundary;
86
-	var $atleastoneimage=0;    // at least one image file with file=xxx.ext into content (TODO Debug this. How can this case be tested. Remove if not used).
87
-	var $html_images=array();
88
-	var $images_encoded=array();
89
-	var $image_types = array(
39
+    public $sendcontext;
40
+    public $sendmode;
41
+    public $sendsetup;
42
+
43
+    var $subject;      	// Topic:       Subject of email
44
+    var $addr_from;    	// From:		Label and EMail of sender (must include '<>'). For example '<[email protected]>' or 'John Doe <[email protected]>' or '<[email protected]>'). Note that with gmail smtps, value here is forced by google to account (but not the reply-to).
45
+    // Sender:      Who send the email ("Sender" has sent emails on behalf of "From").
46
+    //              Use it when the "From" is an email of a domain that is a SPF protected domain, and sending smtp server is not this domain. In such case, add Sender field with an email of the protected domain.
47
+    // Return-Path: Email where to send bounds.
48
+    var $reply_to;		// Reply-To:	Email where to send replies from mailer software (mailer use From if reply-to not defined, Gmail use gmail account if reply-to not defined)
49
+    var $errors_to;		// Errors-To:	Email where to send errors.
50
+    var $addr_to;
51
+    var $addr_cc;
52
+    var $addr_bcc;
53
+    var $trackid;
54
+
55
+    var $mixed_boundary;
56
+    var $related_boundary;
57
+    var $alternative_boundary;
58
+    var $deliveryreceipt;
59
+
60
+    var $eol;
61
+    var $eol2;
62
+
63
+    /**
64
+     * @var string Error code (or message)
65
+     */
66
+    public $error='';
67
+
68
+    var $smtps;			// Contains SMTPs object (if this method is used)
69
+    var $phpmailer;		// Contains PHPMailer object (if this method is used)
70
+
71
+    /**
72
+     * @var string CSS
73
+     */
74
+    public $css;
75
+    //! Defined css style for body background
76
+    var $styleCSS;
77
+    //! Defined background directly in body tag
78
+    var $bodyCSS;
79
+
80
+    var $headers;
81
+    var $message;
82
+
83
+    // Image
84
+    var $html;
85
+    var $image_boundary;
86
+    var $atleastoneimage=0;    // at least one image file with file=xxx.ext into content (TODO Debug this. How can this case be tested. Remove if not used).
87
+    var $html_images=array();
88
+    var $images_encoded=array();
89
+    var $image_types = array(
90 90
         'gif'  => 'image/gif',
91
-		'jpg'  => 'image/jpeg',
92
-		'jpeg' => 'image/jpeg',
93
-		'jpe'  => 'image/jpeg',
94
-		'bmp'  => 'image/bmp',
95
-		'png'  => 'image/png',
96
-		'tif'  => 'image/tiff',
91
+        'jpg'  => 'image/jpeg',
92
+        'jpeg' => 'image/jpeg',
93
+        'jpe'  => 'image/jpeg',
94
+        'bmp'  => 'image/bmp',
95
+        'png'  => 'image/png',
96
+        'tif'  => 'image/tiff',
97 97
         'tiff' => 'image/tiff',
98 98
     );
99 99
 
100 100
 
101
-	/**
102
-	 *	CMailFile
103
-	 *
104
-	 *	@param 	string	$subject             Topic/Subject of mail
105
-	 *	@param 	string	$to                  Recipients emails (RFC 2822: "Name firstname <email>[, ...]" or "email[, ...]" or "<email>[, ...]"). Note: the keyword '__SUPERVISOREMAIL__' is not allowed here and must be replaced by caller.
106
-	 *	@param 	string	$from                Sender email      (RFC 2822: "Name firstname <email>[, ...]" or "email[, ...]" or "<email>[, ...]")
107
-	 *	@param 	string	$msg                 Message
108
-	 *	@param 	array	$filename_list       List of files to attach (full path of filename on file system)
109
-	 *	@param 	array	$mimetype_list       List of MIME type of attached files
110
-	 *	@param 	array	$mimefilename_list   List of attached file name in message
111
-	 *	@param 	string	$addr_cc             Email cc
112
-	 *	@param 	string	$addr_bcc            Email bcc (Note: This is autocompleted with MAIN_MAIL_AUTOCOPY_TO if defined)
113
-	 *	@param 	int		$deliveryreceipt     Ask a delivery receipt
114
-	 *	@param 	int		$msgishtml           1=String IS already html, 0=String IS NOT html, -1=Unknown make autodetection (with fast mode, not reliable)
115
-	 *	@param 	string	$errors_to      	 Email for errors-to
116
-	 *	@param	string	$css                 Css option
117
-	 *	@param	string	$trackid             Tracking string (contains type and id of related element)
118
-	 *  @param  string  $moreinheader        More in header. $moreinheader must contains the "\r\n" (TODO not supported for other MAIL_SEND_MODE different than 'phpmail' and 'smtps' for the moment)
119
-	 *  @param  string  $sendcontext      	 'standard', 'emailing', ... (used to define with sending mode and parameters to use)
120
-	 *  @param	string	$replyto			 Reply-to email (will be set to same value than From by default if not provided)
121
-	 */
122
-	function __construct($subject, $to, $from, $msg, $filename_list=array(), $mimetype_list=array(), $mimefilename_list=array(), $addr_cc="", $addr_bcc="", $deliveryreceipt=0, $msgishtml=0, $errors_to='', $css='', $trackid='', $moreinheader='', $sendcontext='standard', $replyto='')
123
-	{
124
-		global $conf, $dolibarr_main_data_root;
125
-
126
-		$this->sendcontext = $sendcontext;
127
-
128
-		if (empty($replyto)) $replyto=$from;
129
-
130
-		// Define this->sendmode
131
-		$this->sendmode = '';
132
-		if ($this->sendcontext == 'emailing' && !empty($conf->global->MAIN_MAIL_SENDMODE_EMAILING) && $conf->global->MAIN_MAIL_SENDMODE_EMAILING != 'default')
133
-		{
134
-			$this->sendmode = $conf->global->MAIN_MAIL_SENDMODE_EMAILING;
135
-		}
136
-		if (empty($this->sendmode)) $this->sendmode=$conf->global->MAIN_MAIL_SENDMODE;
137
-		if (empty($this->sendmode)) $this->sendmode='mail';
138
-
139
-		// We define end of line (RFC 821).
140
-		$this->eol="\r\n";
141
-		// We define end of line for header fields (RFC 822bis section 2.3 says header must contains \r\n).
142
-		$this->eol2="\r\n";
143
-		if (! empty($conf->global->MAIN_FIX_FOR_BUGGED_MTA))
144
-		{
145
-			$this->eol="\n";
146
-			$this->eol2="\n";
147
-			$moreinheader = str_replace("\r\n","\n",$moreinheader);
148
-		}
149
-
150
-		// On defini mixed_boundary
151
-		$this->mixed_boundary = "multipart_x." . time() . ".x_boundary";
152
-
153
-		// On defini related_boundary
154
-		$this->related_boundary = 'mul_'.dol_hash(uniqid("dolibarr2"), 3);	// Force md5 hash (does not contains special chars)
155
-
156
-		// On defini alternative_boundary
157
-		$this->alternative_boundary = 'mul_'.dol_hash(uniqid("dolibarr3"), 3);	// Force md5 hash (does not contains special chars)
158
-
159
-		dol_syslog("CMailFile::CMailfile: sendmode=".$this->sendmode." charset=".$conf->file->character_set_client." from=$from, to=$to, addr_cc=$addr_cc, addr_bcc=$addr_bcc, errors_to=$errors_to, trackid=$trackid sendcontext=$sendcontext", LOG_DEBUG);
160
-		dol_syslog("CMailFile::CMailfile: subject=".$subject.", deliveryreceipt=".$deliveryreceipt.", msgishtml=".$msgishtml, LOG_DEBUG);
161
-
162
-		if (empty($subject))
163
-		{
164
-			dol_syslog("CMailFile::CMailfile: Try to send an email with empty subject");
165
-			$this->error='ErrorSubjectIsRequired';
166
-			return;
167
-		}
168
-		if (empty($msg))
169
-		{
170
-		    dol_syslog("CMailFile::CMailfile: Try to send an email with empty body");
171
-		    $msg='.';     // Avoid empty message (with empty message conten show a multipart structure)
172
-		}
173
-
174
-		// Detect if message is HTML (use fast method)
175
-		if ($msgishtml == -1)
176
-		{
177
-			$this->msgishtml = 0;
178
-			if (dol_textishtml($msg)) $this->msgishtml = 1;
179
-		}
180
-		else
181
-		{
182
-			$this->msgishtml = $msgishtml;
183
-		}
184
-
185
-		global $dolibarr_main_url_root;
186
-
187
-		// Define $urlwithroot
188
-		$urlwithouturlroot=preg_replace('/'.preg_quote(DOL_URL_ROOT,'/').'$/i','',trim($dolibarr_main_url_root));
189
-		$urlwithroot=$urlwithouturlroot.DOL_URL_ROOT;		// This is to use external domain name found into config file
190
-		//$urlwithroot=DOL_MAIN_URL_ROOT;					// This is to use same domain name than current
191
-
192
-		// Replace relative /viewimage to absolute path
193
-		$msg = preg_replace('/src="'.preg_quote(DOL_URL_ROOT,'/').'\/viewimage\.php/ims', 'src="'.$urlwithroot.'/viewimage.php', $msg, -1, $nbrep);
194
-
195
-		if (! empty($conf->global->MAIN_MAIL_FORCE_CONTENT_TYPE_TO_HTML)) $this->msgishtml=1; // To force to send everything with content type html.
196
-
197
-		// Detect images
198
-		if ($this->msgishtml)
199
-		{
200
-			$this->html = $msg;
201
-
202
-			if (! empty($conf->global->MAIN_MAIL_ADD_INLINE_IMAGES_IF_IN_MEDIAS))
203
-			{
204
-				$findimg = $this->findHtmlImages($dolibarr_main_data_root.'/medias');
205
-			}
206
-
207
-			// Define if there is at least one file
208
-			if ($findimg)
209
-			{
210
-				foreach ($this->html_images as $i => $val)
211
-				{
212
-					if ($this->html_images[$i])
213
-					{
214
-						$this->atleastoneimage=1;
215
-						dol_syslog("CMailFile::CMailfile: html_images[$i]['name']=".$this->html_images[$i]['name'], LOG_DEBUG);
216
-					}
217
-				}
218
-			}
219
-		}
220
-
221
-		// Define if there is at least one file
222
-		if (is_array($filename_list))
223
-		{
224
-			foreach ($filename_list as $i => $val)
225
-			{
226
-				if ($filename_list[$i])
227
-				{
228
-					$this->atleastonefile=1;
229
-					dol_syslog("CMailFile::CMailfile: filename_list[$i]=".$filename_list[$i].", mimetype_list[$i]=".$mimetype_list[$i]." mimefilename_list[$i]=".$mimefilename_list[$i], LOG_DEBUG);
230
-				}
231
-			}
232
-		}
233
-
234
-		// Add autocopy to (Note: Adding bcc for specific modules are also done from pages)
235
-		if (! empty($conf->global->MAIN_MAIL_AUTOCOPY_TO)) $addr_bcc.=($addr_bcc?', ':'').$conf->global->MAIN_MAIL_AUTOCOPY_TO;
236
-
237
-		// Action according to choosed sending method
238
-		if ($this->sendmode == 'mail')
239
-		{
240
-			// Use mail php function (default PHP method)
241
-			// ------------------------------------------
242
-
243
-			$smtp_headers = "";
244
-			$mime_headers = "";
245
-			$text_body = "";
246
-			$files_encoded = "";
247
-
248
-			// Define smtp_headers
249
-			$this->subject = $subject;
250
-			$this->addr_from = $from;
251
-			$this->reply_to = $replyto;
252
-			$this->errors_to = $errors_to;
253
-			$this->addr_to = $to;
254
-			$this->addr_cc = $addr_cc;
255
-			$this->addr_bcc = $addr_bcc;
256
-			$this->deliveryreceipt = $deliveryreceipt;
257
-			$this->trackid = $trackid;
258
-
259
-			$smtp_headers = $this->write_smtpheaders();
260
-			if (! empty($moreinheader)) $smtp_headers.=$moreinheader;   // $moreinheader contains the \r\n
261
-
262
-			// Define mime_headers
263
-			$mime_headers = $this->write_mimeheaders($filename_list, $mimefilename_list);
264
-
265
-			if (! empty($this->html))
266
-			{
267
-				if (!empty($css))
268
-				{
269
-					$this->css = $css;
270
-					$this->buildCSS();    // Build a css style (mode = all) into this->styleCSS and this->bodyCSS
271
-				}
272
-
273
-				$msg = $this->html;
274
-			}
275
-
276
-			// Define body in text_body
277
-			$text_body = $this->write_body($msg);
278
-
279
-			// Add attachments to text_encoded
280
-			if ($this->atleastonefile)
281
-			{
282
-				$files_encoded = $this->write_files($filename_list,$mimetype_list,$mimefilename_list);
283
-			}
284
-
285
-			// We now define $this->headers and $this->message
286
-			$this->headers = $smtp_headers . $mime_headers;
287
-			// On nettoie le header pour qu'il ne se termine pas par un retour chariot.
288
-			// Ceci evite aussi les lignes vides en fin qui peuvent etre interpretees
289
-			// comme des injections mail par les serveurs de messagerie.
290
-			$this->headers = preg_replace("/([\r\n]+)$/i","",$this->headers);
291
-
292
-			//$this->message = $this->eol.'This is a message with multiple parts in MIME format.'.$this->eol;
293
-			$this->message = 'This is a message with multiple parts in MIME format.'.$this->eol;
294
-			$this->message.= $text_body . $files_encoded;
295
-			$this->message.= "--" . $this->mixed_boundary . "--" . $this->eol;
296
-		}
297
-		else if ($this->sendmode == 'smtps')
298
-		{
299
-			// Use SMTPS library
300
-			// ------------------------------------------
301
-
302
-			require_once DOL_DOCUMENT_ROOT.'/core/class/smtps.class.php';
303
-			$smtps = new SMTPs();
304
-			$smtps->setCharSet($conf->file->character_set_client);
305
-
306
-			$smtps->setSubject($this->encodetorfc2822($subject));
307
-			$smtps->setTO($this->getValidAddress($to,0,1));
308
-			$smtps->setFrom($this->getValidAddress($from,0,1));
309
-			$smtps->setTrackId($trackid);
310
-			$smtps->setReplyTo($this->getValidAddress($replyto,0,1));
311
-
312
-			if (! empty($moreinheader)) $smtps->setMoreInHeader($moreinheader);
313
-
314
-			if (! empty($this->html))
315
-			{
316
-				if (!empty($css))
317
-				{
318
-					$this->css = $css;
319
-					$this->buildCSS();
320
-				}
321
-				$msg = $this->html;
322
-				$msg = $this->checkIfHTML($msg);
323
-			}
324
-
325
-			if ($this->msgishtml) $smtps->setBodyContent($msg,'html');
326
-			else $smtps->setBodyContent($msg,'plain');
327
-
328
-			if ($this->atleastoneimage)
329
-			{
330
-				foreach ($this->images_encoded as $img)
331
-				{
332
-					$smtps->setImageInline($img['image_encoded'],$img['name'],$img['content_type'],$img['cid']);
333
-				}
334
-			}
335
-
336
-			if ($this->atleastonefile)
337
-			{
338
-				foreach ($filename_list as $i => $val)
339
-				{
340
-					$content=file_get_contents($filename_list[$i]);
341
-					$smtps->setAttachment($content,$mimefilename_list[$i],$mimetype_list[$i]);
342
-				}
343
-			}
344
-
345
-			$smtps->setCC($addr_cc);
346
-			$smtps->setBCC($addr_bcc);
347
-			$smtps->setErrorsTo($errors_to);
348
-			$smtps->setDeliveryReceipt($deliveryreceipt);
349
-
350
-			$this->smtps=$smtps;
351
-		}
352
-		else if ($this->sendmode == 'swiftmailer')
353
-		{
354
-			// Use Swift Mailer library
355
-			// ------------------------------------------
101
+    /**
102
+     *	CMailFile
103
+     *
104
+     *	@param 	string	$subject             Topic/Subject of mail
105
+     *	@param 	string	$to                  Recipients emails (RFC 2822: "Name firstname <email>[, ...]" or "email[, ...]" or "<email>[, ...]"). Note: the keyword '__SUPERVISOREMAIL__' is not allowed here and must be replaced by caller.
106
+     *	@param 	string	$from                Sender email      (RFC 2822: "Name firstname <email>[, ...]" or "email[, ...]" or "<email>[, ...]")
107
+     *	@param 	string	$msg                 Message
108
+     *	@param 	array	$filename_list       List of files to attach (full path of filename on file system)
109
+     *	@param 	array	$mimetype_list       List of MIME type of attached files
110
+     *	@param 	array	$mimefilename_list   List of attached file name in message
111
+     *	@param 	string	$addr_cc             Email cc
112
+     *	@param 	string	$addr_bcc            Email bcc (Note: This is autocompleted with MAIN_MAIL_AUTOCOPY_TO if defined)
113
+     *	@param 	int		$deliveryreceipt     Ask a delivery receipt
114
+     *	@param 	int		$msgishtml           1=String IS already html, 0=String IS NOT html, -1=Unknown make autodetection (with fast mode, not reliable)
115
+     *	@param 	string	$errors_to      	 Email for errors-to
116
+     *	@param	string	$css                 Css option
117
+     *	@param	string	$trackid             Tracking string (contains type and id of related element)
118
+     *  @param  string  $moreinheader        More in header. $moreinheader must contains the "\r\n" (TODO not supported for other MAIL_SEND_MODE different than 'phpmail' and 'smtps' for the moment)
119
+     *  @param  string  $sendcontext      	 'standard', 'emailing', ... (used to define with sending mode and parameters to use)
120
+     *  @param	string	$replyto			 Reply-to email (will be set to same value than From by default if not provided)
121
+     */
122
+    function __construct($subject, $to, $from, $msg, $filename_list=array(), $mimetype_list=array(), $mimefilename_list=array(), $addr_cc="", $addr_bcc="", $deliveryreceipt=0, $msgishtml=0, $errors_to='', $css='', $trackid='', $moreinheader='', $sendcontext='standard', $replyto='')
123
+    {
124
+        global $conf, $dolibarr_main_data_root;
125
+
126
+        $this->sendcontext = $sendcontext;
127
+
128
+        if (empty($replyto)) $replyto=$from;
129
+
130
+        // Define this->sendmode
131
+        $this->sendmode = '';
132
+        if ($this->sendcontext == 'emailing' && !empty($conf->global->MAIN_MAIL_SENDMODE_EMAILING) && $conf->global->MAIN_MAIL_SENDMODE_EMAILING != 'default')
133
+        {
134
+            $this->sendmode = $conf->global->MAIN_MAIL_SENDMODE_EMAILING;
135
+        }
136
+        if (empty($this->sendmode)) $this->sendmode=$conf->global->MAIN_MAIL_SENDMODE;
137
+        if (empty($this->sendmode)) $this->sendmode='mail';
138
+
139
+        // We define end of line (RFC 821).
140
+        $this->eol="\r\n";
141
+        // We define end of line for header fields (RFC 822bis section 2.3 says header must contains \r\n).
142
+        $this->eol2="\r\n";
143
+        if (! empty($conf->global->MAIN_FIX_FOR_BUGGED_MTA))
144
+        {
145
+            $this->eol="\n";
146
+            $this->eol2="\n";
147
+            $moreinheader = str_replace("\r\n","\n",$moreinheader);
148
+        }
149
+
150
+        // On defini mixed_boundary
151
+        $this->mixed_boundary = "multipart_x." . time() . ".x_boundary";
152
+
153
+        // On defini related_boundary
154
+        $this->related_boundary = 'mul_'.dol_hash(uniqid("dolibarr2"), 3);	// Force md5 hash (does not contains special chars)
155
+
156
+        // On defini alternative_boundary
157
+        $this->alternative_boundary = 'mul_'.dol_hash(uniqid("dolibarr3"), 3);	// Force md5 hash (does not contains special chars)
158
+
159
+        dol_syslog("CMailFile::CMailfile: sendmode=".$this->sendmode." charset=".$conf->file->character_set_client." from=$from, to=$to, addr_cc=$addr_cc, addr_bcc=$addr_bcc, errors_to=$errors_to, trackid=$trackid sendcontext=$sendcontext", LOG_DEBUG);
160
+        dol_syslog("CMailFile::CMailfile: subject=".$subject.", deliveryreceipt=".$deliveryreceipt.", msgishtml=".$msgishtml, LOG_DEBUG);
161
+
162
+        if (empty($subject))
163
+        {
164
+            dol_syslog("CMailFile::CMailfile: Try to send an email with empty subject");
165
+            $this->error='ErrorSubjectIsRequired';
166
+            return;
167
+        }
168
+        if (empty($msg))
169
+        {
170
+            dol_syslog("CMailFile::CMailfile: Try to send an email with empty body");
171
+            $msg='.';     // Avoid empty message (with empty message conten show a multipart structure)
172
+        }
173
+
174
+        // Detect if message is HTML (use fast method)
175
+        if ($msgishtml == -1)
176
+        {
177
+            $this->msgishtml = 0;
178
+            if (dol_textishtml($msg)) $this->msgishtml = 1;
179
+        }
180
+        else
181
+        {
182
+            $this->msgishtml = $msgishtml;
183
+        }
184
+
185
+        global $dolibarr_main_url_root;
186
+
187
+        // Define $urlwithroot
188
+        $urlwithouturlroot=preg_replace('/'.preg_quote(DOL_URL_ROOT,'/').'$/i','',trim($dolibarr_main_url_root));
189
+        $urlwithroot=$urlwithouturlroot.DOL_URL_ROOT;		// This is to use external domain name found into config file
190
+        //$urlwithroot=DOL_MAIN_URL_ROOT;					// This is to use same domain name than current
191
+
192
+        // Replace relative /viewimage to absolute path
193
+        $msg = preg_replace('/src="'.preg_quote(DOL_URL_ROOT,'/').'\/viewimage\.php/ims', 'src="'.$urlwithroot.'/viewimage.php', $msg, -1, $nbrep);
194
+
195
+        if (! empty($conf->global->MAIN_MAIL_FORCE_CONTENT_TYPE_TO_HTML)) $this->msgishtml=1; // To force to send everything with content type html.
196
+
197
+        // Detect images
198
+        if ($this->msgishtml)
199
+        {
200
+            $this->html = $msg;
201
+
202
+            if (! empty($conf->global->MAIN_MAIL_ADD_INLINE_IMAGES_IF_IN_MEDIAS))
203
+            {
204
+                $findimg = $this->findHtmlImages($dolibarr_main_data_root.'/medias');
205
+            }
206
+
207
+            // Define if there is at least one file
208
+            if ($findimg)
209
+            {
210
+                foreach ($this->html_images as $i => $val)
211
+                {
212
+                    if ($this->html_images[$i])
213
+                    {
214
+                        $this->atleastoneimage=1;
215
+                        dol_syslog("CMailFile::CMailfile: html_images[$i]['name']=".$this->html_images[$i]['name'], LOG_DEBUG);
216
+                    }
217
+                }
218
+            }
219
+        }
220
+
221
+        // Define if there is at least one file
222
+        if (is_array($filename_list))
223
+        {
224
+            foreach ($filename_list as $i => $val)
225
+            {
226
+                if ($filename_list[$i])
227
+                {
228
+                    $this->atleastonefile=1;
229
+                    dol_syslog("CMailFile::CMailfile: filename_list[$i]=".$filename_list[$i].", mimetype_list[$i]=".$mimetype_list[$i]." mimefilename_list[$i]=".$mimefilename_list[$i], LOG_DEBUG);
230
+                }
231
+            }
232
+        }
233
+
234
+        // Add autocopy to (Note: Adding bcc for specific modules are also done from pages)
235
+        if (! empty($conf->global->MAIN_MAIL_AUTOCOPY_TO)) $addr_bcc.=($addr_bcc?', ':'').$conf->global->MAIN_MAIL_AUTOCOPY_TO;
236
+
237
+        // Action according to choosed sending method
238
+        if ($this->sendmode == 'mail')
239
+        {
240
+            // Use mail php function (default PHP method)
241
+            // ------------------------------------------
242
+
243
+            $smtp_headers = "";
244
+            $mime_headers = "";
245
+            $text_body = "";
246
+            $files_encoded = "";
247
+
248
+            // Define smtp_headers
249
+            $this->subject = $subject;
250
+            $this->addr_from = $from;
251
+            $this->reply_to = $replyto;
252
+            $this->errors_to = $errors_to;
253
+            $this->addr_to = $to;
254
+            $this->addr_cc = $addr_cc;
255
+            $this->addr_bcc = $addr_bcc;
256
+            $this->deliveryreceipt = $deliveryreceipt;
257
+            $this->trackid = $trackid;
258
+
259
+            $smtp_headers = $this->write_smtpheaders();
260
+            if (! empty($moreinheader)) $smtp_headers.=$moreinheader;   // $moreinheader contains the \r\n
261
+
262
+            // Define mime_headers
263
+            $mime_headers = $this->write_mimeheaders($filename_list, $mimefilename_list);
264
+
265
+            if (! empty($this->html))
266
+            {
267
+                if (!empty($css))
268
+                {
269
+                    $this->css = $css;
270
+                    $this->buildCSS();    // Build a css style (mode = all) into this->styleCSS and this->bodyCSS
271
+                }
272
+
273
+                $msg = $this->html;
274
+            }
275
+
276
+            // Define body in text_body
277
+            $text_body = $this->write_body($msg);
278
+
279
+            // Add attachments to text_encoded
280
+            if ($this->atleastonefile)
281
+            {
282
+                $files_encoded = $this->write_files($filename_list,$mimetype_list,$mimefilename_list);
283
+            }
284
+
285
+            // We now define $this->headers and $this->message
286
+            $this->headers = $smtp_headers . $mime_headers;
287
+            // On nettoie le header pour qu'il ne se termine pas par un retour chariot.
288
+            // Ceci evite aussi les lignes vides en fin qui peuvent etre interpretees
289
+            // comme des injections mail par les serveurs de messagerie.
290
+            $this->headers = preg_replace("/([\r\n]+)$/i","",$this->headers);
291
+
292
+            //$this->message = $this->eol.'This is a message with multiple parts in MIME format.'.$this->eol;
293
+            $this->message = 'This is a message with multiple parts in MIME format.'.$this->eol;
294
+            $this->message.= $text_body . $files_encoded;
295
+            $this->message.= "--" . $this->mixed_boundary . "--" . $this->eol;
296
+        }
297
+        else if ($this->sendmode == 'smtps')
298
+        {
299
+            // Use SMTPS library
300
+            // ------------------------------------------
301
+
302
+            require_once DOL_DOCUMENT_ROOT.'/core/class/smtps.class.php';
303
+            $smtps = new SMTPs();
304
+            $smtps->setCharSet($conf->file->character_set_client);
305
+
306
+            $smtps->setSubject($this->encodetorfc2822($subject));
307
+            $smtps->setTO($this->getValidAddress($to,0,1));
308
+            $smtps->setFrom($this->getValidAddress($from,0,1));
309
+            $smtps->setTrackId($trackid);
310
+            $smtps->setReplyTo($this->getValidAddress($replyto,0,1));
311
+
312
+            if (! empty($moreinheader)) $smtps->setMoreInHeader($moreinheader);
313
+
314
+            if (! empty($this->html))
315
+            {
316
+                if (!empty($css))
317
+                {
318
+                    $this->css = $css;
319
+                    $this->buildCSS();
320
+                }
321
+                $msg = $this->html;
322
+                $msg = $this->checkIfHTML($msg);
323
+            }
324
+
325
+            if ($this->msgishtml) $smtps->setBodyContent($msg,'html');
326
+            else $smtps->setBodyContent($msg,'plain');
327
+
328
+            if ($this->atleastoneimage)
329
+            {
330
+                foreach ($this->images_encoded as $img)
331
+                {
332
+                    $smtps->setImageInline($img['image_encoded'],$img['name'],$img['content_type'],$img['cid']);
333
+                }
334
+            }
335
+
336
+            if ($this->atleastonefile)
337
+            {
338
+                foreach ($filename_list as $i => $val)
339
+                {
340
+                    $content=file_get_contents($filename_list[$i]);
341
+                    $smtps->setAttachment($content,$mimefilename_list[$i],$mimetype_list[$i]);
342
+                }
343
+            }
344
+
345
+            $smtps->setCC($addr_cc);
346
+            $smtps->setBCC($addr_bcc);
347
+            $smtps->setErrorsTo($errors_to);
348
+            $smtps->setDeliveryReceipt($deliveryreceipt);
349
+
350
+            $this->smtps=$smtps;
351
+        }
352
+        else if ($this->sendmode == 'swiftmailer')
353
+        {
354
+            // Use Swift Mailer library
355
+            // ------------------------------------------
356 356
 
357 357
             $host = dol_getprefix('email');
358 358
 
@@ -361,419 +361,419 @@  discard block
 block discarded – undo
361 361
             require_once DOL_DOCUMENT_ROOT.'/includes/swiftmailer/egulias/email-validator/EmailValidator/Exception/InvalidEmail.php';
362 362
             require_once DOL_DOCUMENT_ROOT.'/includes/swiftmailer/egulias/email-validator/EmailValidator/Exception/NoDomainPart.php';
363 363
             require_once DOL_DOCUMENT_ROOT.'/includes/swiftmailer/egulias/email-validator/EmailValidator/EmailParser.php';
364
-			require_once DOL_DOCUMENT_ROOT.'/includes/swiftmailer/egulias/email-validator/EmailValidator/EmailLexer.php';
365
-			require_once DOL_DOCUMENT_ROOT.'/includes/swiftmailer/egulias/email-validator/EmailValidator/EmailValidator.php';
366
-			require_once DOL_DOCUMENT_ROOT.'/includes/swiftmailer/egulias/email-validator/EmailValidator/Warning/Warning.php';
367
-			require_once DOL_DOCUMENT_ROOT.'/includes/swiftmailer/egulias/email-validator/EmailValidator/Warning/LocalTooLong.php';
368
-			require_once DOL_DOCUMENT_ROOT.'/includes/swiftmailer/egulias/email-validator/EmailValidator/Parser/Parser.php';
369
-			require_once DOL_DOCUMENT_ROOT.'/includes/swiftmailer/egulias/email-validator/EmailValidator/Parser/DomainPart.php';
370
-			require_once DOL_DOCUMENT_ROOT.'/includes/swiftmailer/egulias/email-validator/EmailValidator/Parser/LocalPart.php';
371
-			require_once DOL_DOCUMENT_ROOT.'/includes/swiftmailer/egulias/email-validator/EmailValidator/Validation/EmailValidation.php';
372
-			require_once DOL_DOCUMENT_ROOT.'/includes/swiftmailer/egulias/email-validator/EmailValidator/Validation/RFCValidation.php';
364
+            require_once DOL_DOCUMENT_ROOT.'/includes/swiftmailer/egulias/email-validator/EmailValidator/EmailLexer.php';
365
+            require_once DOL_DOCUMENT_ROOT.'/includes/swiftmailer/egulias/email-validator/EmailValidator/EmailValidator.php';
366
+            require_once DOL_DOCUMENT_ROOT.'/includes/swiftmailer/egulias/email-validator/EmailValidator/Warning/Warning.php';
367
+            require_once DOL_DOCUMENT_ROOT.'/includes/swiftmailer/egulias/email-validator/EmailValidator/Warning/LocalTooLong.php';
368
+            require_once DOL_DOCUMENT_ROOT.'/includes/swiftmailer/egulias/email-validator/EmailValidator/Parser/Parser.php';
369
+            require_once DOL_DOCUMENT_ROOT.'/includes/swiftmailer/egulias/email-validator/EmailValidator/Parser/DomainPart.php';
370
+            require_once DOL_DOCUMENT_ROOT.'/includes/swiftmailer/egulias/email-validator/EmailValidator/Parser/LocalPart.php';
371
+            require_once DOL_DOCUMENT_ROOT.'/includes/swiftmailer/egulias/email-validator/EmailValidator/Validation/EmailValidation.php';
372
+            require_once DOL_DOCUMENT_ROOT.'/includes/swiftmailer/egulias/email-validator/EmailValidator/Validation/RFCValidation.php';
373 373
 
374 374
             require_once DOL_DOCUMENT_ROOT.'/includes/swiftmailer/lib/classes/Swift/InputByteStream.php';
375
-			require_once DOL_DOCUMENT_ROOT.'/includes/swiftmailer/lib/classes/Swift/Signer.php';
376
-			require_once DOL_DOCUMENT_ROOT.'/includes/swiftmailer/lib/classes/Swift/Signers/HeaderSigner.php';
377
-			require_once DOL_DOCUMENT_ROOT.'/includes/swiftmailer/lib/classes/Swift/Signers/DKIMSigner.php';
378
-			//require_once DOL_DOCUMENT_ROOT.'/includes/swiftmailer/lib/classes/Swift/SignedMessage.php';
379
-			require_once DOL_DOCUMENT_ROOT.'/includes/swiftmailer/lib/swift_required.php';
380
-			// Create the message
381
-			//$this->message = Swift_Message::newInstance();
382
-			$this->message = new Swift_Message();
375
+            require_once DOL_DOCUMENT_ROOT.'/includes/swiftmailer/lib/classes/Swift/Signer.php';
376
+            require_once DOL_DOCUMENT_ROOT.'/includes/swiftmailer/lib/classes/Swift/Signers/HeaderSigner.php';
377
+            require_once DOL_DOCUMENT_ROOT.'/includes/swiftmailer/lib/classes/Swift/Signers/DKIMSigner.php';
378
+            //require_once DOL_DOCUMENT_ROOT.'/includes/swiftmailer/lib/classes/Swift/SignedMessage.php';
379
+            require_once DOL_DOCUMENT_ROOT.'/includes/swiftmailer/lib/swift_required.php';
380
+            // Create the message
381
+            //$this->message = Swift_Message::newInstance();
382
+            $this->message = new Swift_Message();
383 383
             //$this->message = new Swift_SignedMessage();
384 384
             // Adding a trackid header to a message
385
-			$headers = $this->message->getHeaders();
386
-			$headers->addTextHeader('X-Dolibarr-TRACKID', $trackid . '@' . $host);
387
-			$headerID = time() . '.swiftmailer-dolibarr-' . $trackid . '@' . $host;
388
-			$msgid = $headers->get('Message-ID');
389
-			$msgid->setId($headerID);
390
-			$headers->addIdHeader('References', $headerID);
391
-			// TODO if (! empty($moreinheader)) ...
392
-
393
-			// Give the message a subject
394
-			try {
395
-				$result = $this->message->setSubject($subject);
396
-			} catch (Exception $e) {
397
-				$this->errors[] =  $e->getMessage();
398
-			}
399
-
400
-			// Set the From address with an associative array
401
-			//$this->message->setFrom(array('[email protected]' => 'John Doe'));
402
-			if (! empty($from)) {
385
+            $headers = $this->message->getHeaders();
386
+            $headers->addTextHeader('X-Dolibarr-TRACKID', $trackid . '@' . $host);
387
+            $headerID = time() . '.swiftmailer-dolibarr-' . $trackid . '@' . $host;
388
+            $msgid = $headers->get('Message-ID');
389
+            $msgid->setId($headerID);
390
+            $headers->addIdHeader('References', $headerID);
391
+            // TODO if (! empty($moreinheader)) ...
392
+
393
+            // Give the message a subject
394
+            try {
395
+                $result = $this->message->setSubject($subject);
396
+            } catch (Exception $e) {
397
+                $this->errors[] =  $e->getMessage();
398
+            }
399
+
400
+            // Set the From address with an associative array
401
+            //$this->message->setFrom(array('[email protected]' => 'John Doe'));
402
+            if (! empty($from)) {
403 403
                 try {
404
-                	$result = $this->message->setFrom($this->getArrayAddress($from));
404
+                    $result = $this->message->setFrom($this->getArrayAddress($from));
405 405
                 } catch (Exception $e) {
406 406
                     $this->errors[] = $e->getMessage();
407 407
                 }
408 408
             }
409 409
 
410
-			// Set the To addresses with an associative array
411
-			if (! empty($to)) {
410
+            // Set the To addresses with an associative array
411
+            if (! empty($to)) {
412 412
                 try {
413
-                	$result = $this->message->setTo($this->getArrayAddress($to));
413
+                    $result = $this->message->setTo($this->getArrayAddress($to));
414 414
                 } catch (Exception $e) {
415 415
                     $this->errors[] = $e->getMessage();
416 416
                 }
417 417
             }
418 418
 
419
-			if (! empty($replyto)) {
419
+            if (! empty($replyto)) {
420 420
                 try {
421
-                	$result = $this->message->SetReplyTo($this->getArrayAddress($replyto));
421
+                    $result = $this->message->SetReplyTo($this->getArrayAddress($replyto));
422 422
                 } catch (Exception $e) {
423 423
                     $this->errors[] = $e->getMessage();
424 424
                 }
425 425
             }
426 426
 
427
-			try {
428
-				$result = $this->message->setCharSet($conf->file->character_set_client);
429
-			} catch (Exception $e) {
430
-				$this->errors[] =  $e->getMessage();
431
-			}
432
-
433
-			if (! empty($this->html))
434
-			{
435
-				if (!empty($css))
436
-				{
437
-					$this->css = $css;
438
-					$this->buildCSS();
439
-				}
440
-				$msg = $this->html;
441
-				$msg = $this->checkIfHTML($msg);
442
-			}
443
-
444
-			if ($this->atleastoneimage)
445
-			{
446
-				foreach ($this->images_encoded as $img)
447
-				{
448
-					//$img['fullpath'],$img['image_encoded'],$img['name'],$img['content_type'],$img['cid']
449
-					$attachment = Swift_Image::fromPath($img['fullpath'], $img['content_type']);
450
-					// embed image
451
-					$imgcid = $this->message->embed($attachment);
452
-					// replace cid by the one created by swiftmail in html message
453
-					$msg = str_replace("cid:".$img['cid'], $imgcid, $msg);
454
-				}
455
-			}
456
-
457
-			if ($this->msgishtml) {
458
-				$this->message->setBody($msg,'text/html');
459
-				// And optionally an alternative body
460
-				$this->message->addPart(html_entity_decode(strip_tags($msg)), 'text/plain');
461
-			} else {
462
-				$this->message->setBody($msg,'text/plain');
463
-				// And optionally an alternative body
464
-				$this->message->addPart($msg, 'text/html');
465
-			}
466
-
467
-			if ($this->atleastonefile)
468
-			{
469
-				foreach ($filename_list as $i => $val)
470
-				{
471
-					//$this->message->attach(Swift_Attachment::fromPath($filename_list[$i],$mimetype_list[$i]));
472
-					$attachment = Swift_Attachment::fromPath($filename_list[$i],$mimetype_list[$i]);
473
-					$this->message->attach($attachment);
474
-				}
475
-			}
476
-
477
-			if (! empty($addr_cc)) $this->message->setCc($this->getArrayAddress($addr_cc));
478
-			if (! empty($addr_bcc)) $this->message->setBcc($this->getArrayAddress($addr_bcc));
479
-			//if (! empty($errors_to)) $this->message->setErrorsTo($this->getArrayAddress($errors_to);
480
-			if (isset($deliveryreceipt) && $deliveryreceipt == 1) $this->message->setReadReceiptTo($this->getArrayAddress($from));
481
-		}
482
-		else
483
-		{
484
-			// Send mail method not correctly defined
485
-			// --------------------------------------
486
-			$this->error = 'Bad value for sendmode';
487
-		}
488
-	}
489
-
490
-
491
-	/**
492
-	 * Send mail that was prepared by constructor.
493
-	 *
494
-	 * @return    boolean     True if mail sent, false otherwise
495
-	 */
496
-	function sendfile()
497
-	{
498
-		global $conf,$db,$langs;
499
-
500
-		$errorlevel=error_reporting();
501
-		//error_reporting($errorlevel ^ E_WARNING);   // Desactive warnings
502
-
503
-		$res=false;
504
-
505
-		if (empty($conf->global->MAIN_DISABLE_ALL_MAILS) || !empty($conf->global->MAIN_MAIL_FORCE_SENDTO))
506
-		{
507
-			require_once DOL_DOCUMENT_ROOT . '/core/class/hookmanager.class.php';
508
-			$hookmanager = new HookManager($db);
509
-			$hookmanager->initHooks(array('mail'));
510
-
511
-			$parameters=array(); $action='';
512
-			$reshook = $hookmanager->executeHooks('sendMail', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
513
-			if ($reshook < 0)
514
-			{
515
-				$this->error = "Error in hook maildao sendMail " . $reshook;
516
-				dol_syslog("CMailFile::sendfile: mail end error=" . $this->error, LOG_ERR);
517
-
518
-				return $reshook;
519
-			}
520
-			if ($reshook == 1)	// Hook replace standard code
521
-			{
522
-				return true;
523
-			}
524
-
525
-			// Check number of recipient is lower or equal than MAIL_MAX_NB_OF_RECIPIENTS_IN_SAME_EMAIL
526
-			if (empty($conf->global->MAIL_MAX_NB_OF_RECIPIENTS_TO_IN_SAME_EMAIL)) $conf->global->MAIL_MAX_NB_OF_RECIPIENTS_TO_IN_SAME_EMAIL=10;
527
-			$tmparray1 = explode(',', $this->addr_to);
528
-			if (count($tmparray1) > $conf->global->MAIL_MAX_NB_OF_RECIPIENTS_TO_IN_SAME_EMAIL)
529
-			{
530
-				$this->error = 'Too much recipients in to:';
531
-				dol_syslog("CMailFile::sendfile: mail end error=" . $this->error, LOG_WARNING);
532
-				return false;
533
-			}
534
-			if (empty($conf->global->MAIL_MAX_NB_OF_RECIPIENTS_CC_IN_SAME_EMAIL)) $conf->global->MAIL_MAX_NB_OF_RECIPIENTS_CC_IN_SAME_EMAIL=10;
535
-			$tmparray2 = explode(',', $this->addr_cc);
536
-			if (count($tmparray2) > $conf->global->MAIL_MAX_NB_OF_RECIPIENTS_CC_IN_SAME_EMAIL)
537
-			{
538
-				$this->error = 'Too much recipients in cc:';
539
-				dol_syslog("CMailFile::sendfile: mail end error=" . $this->error, LOG_WARNING);
540
-				return false;
541
-			}
542
-			if (empty($conf->global->MAIL_MAX_NB_OF_RECIPIENTS_BCC_IN_SAME_EMAIL)) $conf->global->MAIL_MAX_NB_OF_RECIPIENTS_BCC_IN_SAME_EMAIL=10;
543
-			$tmparray3 = explode(',', $this->addr_bcc);
544
-			if (count($tmparray3) > $conf->global->MAIL_MAX_NB_OF_RECIPIENTS_BCC_IN_SAME_EMAIL)
545
-			{
546
-				$this->error = 'Too much recipients in bcc:';
547
-				dol_syslog("CMailFile::sendfile: mail end error=" . $this->error, LOG_WARNING);
548
-				return false;
549
-			}
550
-			if (empty($conf->global->MAIL_MAX_NB_OF_RECIPIENTS_IN_SAME_EMAIL)) $conf->global->MAIL_MAX_NB_OF_RECIPIENTS_IN_SAME_EMAIL=10;
551
-			if ((count($tmparray1)+count($tmparray2)+count($tmparray3)) > $conf->global->MAIL_MAX_NB_OF_RECIPIENTS_IN_SAME_EMAIL)
552
-			{
553
-				$this->error = 'Too much recipients in to:, cc:, bcc:';
554
-				dol_syslog("CMailFile::sendfile: mail end error=" . $this->error, LOG_WARNING);
555
-				return false;
556
-			}
557
-
558
-			$keyforsmtpserver='MAIN_MAIL_SMTP_SERVER';
559
-			$keyforsmtpport  ='MAIN_MAIL_SMTP_PORT';
560
-			$keyforsmtpid    ='MAIN_MAIL_SMTPS_ID';
561
-			$keyforsmtppw    ='MAIN_MAIL_SMTPS_PW';
562
-			$keyfortls       ='MAIN_MAIL_EMAIL_TLS';
563
-			$keyforstarttls  ='MAIN_MAIL_EMAIL_STARTTLS';
564
-			if ($this->sendcontext == 'emailing' && !empty($conf->global->MAIN_MAIL_SENDMODE_EMAILING) && $conf->global->MAIN_MAIL_SENDMODE_EMAILING != 'default')
565
-			{
566
-				$keyforsmtpserver='MAIN_MAIL_SMTP_SERVER_EMAILING';
567
-				$keyforsmtpport  ='MAIN_MAIL_SMTP_PORT_EMAILING';
568
-				$keyforsmtpid    ='MAIN_MAIL_SMTPS_ID_EMAILING';
569
-				$keyforsmtppw    ='MAIN_MAIL_SMTPS_PW_EMAILING';
570
-				$keyfortls       ='MAIN_MAIL_EMAIL_TLS_EMAILING';
571
-				$keyforstarttls  ='MAIN_MAIL_EMAIL_STARTTLS_EMAILING';
572
-			}
573
-
574
-			if (!empty($conf->global->MAIN_MAIL_FORCE_SENDTO))
575
-			{
576
-				$this->addr_to = $conf->global->MAIN_MAIL_FORCE_SENDTO;
577
-				$this->addr_cc = '';
578
-				$this->addr_bcc = '';
579
-			}
580
-
581
-			// Action according to choosed sending method
582
-			if ($this->sendmode == 'mail')
583
-			{
584
-				// Use mail php function (default PHP method)
585
-				// ------------------------------------------
586
-				dol_syslog("CMailFile::sendfile addr_to=".$this->addr_to.", subject=".$this->subject, LOG_DEBUG);
587
-				dol_syslog("CMailFile::sendfile header=\n".$this->headers, LOG_DEBUG);
588
-				//dol_syslog("CMailFile::sendfile message=\n".$message);
589
-
590
-				// If Windows, sendmail_from must be defined
591
-				if (isset($_SERVER["WINDIR"]))
592
-				{
593
-					if (empty($this->addr_from)) $this->addr_from = '[email protected]';
594
-					@ini_set('sendmail_from',$this->getValidAddress($this->addr_from,2));
595
-				}
596
-
597
-				// Force parameters
598
-				if (! empty($conf->global->$keyforsmtpserver)) ini_set('SMTP',$conf->global->$keyforsmtpserver);
599
-				if (! empty($conf->global->$keyforsmtpport))   ini_set('smtp_port',$conf->global->$keyforsmtpport);
600
-
601
-				$res=true;
602
-				if ($res && ! $this->subject)
603
-				{
604
-					$this->error="Failed to send mail with php mail to HOST=".ini_get('SMTP').", PORT=".ini_get('smtp_port')."<br>Subject is empty";
605
-					dol_syslog("CMailFile::sendfile: mail end error=".$this->error, LOG_ERR);
606
-					$res=false;
607
-				}
608
-				$dest=$this->getValidAddress($this->addr_to,2);
609
-				if ($res && ! $dest)
610
-				{
611
-					$this->error="Failed to send mail with php mail to HOST=".ini_get('SMTP').", PORT=".ini_get('smtp_port')."<br>Recipient address '$dest' invalid";
612
-					dol_syslog("CMailFile::sendfile: mail end error=".$this->error, LOG_ERR);
613
-					$res=false;
614
-				}
615
-
616
-				if ($res)
617
-				{
618
-					$additionnalparam = '';	// By default
619
-					if (! empty($conf->global->MAIN_MAIL_ALLOW_SENDMAIL_F))
620
-					{
621
-						// le "Return-Path" (retour des messages bounced) dans les header ne fonctionne pas avec tous les MTA
622
-						// Le forcage de la valeur grace à l'option -f de sendmail est donc possible si la constante MAIN_MAIL_ALLOW_SENDMAIL_F est definie.
623
-						// Having this variable defined may create problems with some sendmail (option -f refused)
624
-						// Having this variable not defined may create problems with some other sendmail (option -f required)
625
-						$additionnalparam .= ($additionnalparam?' ':'').(! empty($conf->global->MAIN_MAIL_ERRORS_TO) ? '-f' . $this->getValidAddress($conf->global->MAIN_MAIL_ERRORS_TO,2) : ($this->addr_from != '' ? '-f' . $this->getValidAddress($this->addr_from,2) : '') );
626
-					}
627
-					if (! empty($conf->global->MAIN_MAIL_SENDMAIL_FORCE_BA))    // To force usage of -ba option. This option tells sendmail to read From: or Sender: to setup sender
628
-					{
629
-						$additionnalparam .= ($additionnalparam?' ':'').'-ba';
630
-					}
631
-
632
-					if (! empty($conf->global->MAIN_MAIL_SENDMAIL_FORCE_ADDPARAM)) $additionnalparam .= ($additionnalparam?' ':'').'-U '.$additionnalparam; // Use -U to add additionnal params
633
-
634
-					dol_syslog("CMailFile::sendfile: mail start HOST=".ini_get('SMTP').", PORT=".ini_get('smtp_port').", additionnal_parameters=".$additionnalparam, LOG_DEBUG);
635
-
636
-					$this->message=stripslashes($this->message);
637
-
638
-					if (! empty($conf->global->MAIN_MAIL_DEBUG)) $this->dump_mail();
639
-
640
-					if (! empty($additionnalparam)) $res = mail($dest, $this->encodetorfc2822($this->subject), $this->message, $this->headers, $additionnalparam);
641
-					else $res = mail($dest, $this->encodetorfc2822($this->subject), $this->message, $this->headers);
642
-
643
-					if (! $res)
644
-					{
645
-						$langs->load("errors");
646
-						$this->error="Failed to send mail with php mail";
647
-						$linuxlike=1;
648
-						if (preg_match('/^win/i',PHP_OS)) $linuxlike=0;
649
-						if (preg_match('/^mac/i',PHP_OS)) $linuxlike=0;
650
-						if (! $linuxlike)
651
-						{
652
-							$this->error.=" to HOST=".ini_get('SMTP').", PORT=".ini_get('smtp_port');	// This values are value used only for non linuxlike systems
653
-						}
654
-						$this->error.=".<br>";
655
-						$this->error.=$langs->trans("ErrorPhpMailDelivery");
656
-						dol_syslog("CMailFile::sendfile: mail end error=".$this->error, LOG_ERR);
657
-					}
658
-					else
659
-					{
660
-						dol_syslog("CMailFile::sendfile: mail end success", LOG_DEBUG);
661
-					}
662
-				}
663
-
664
-				if (isset($_SERVER["WINDIR"]))
665
-				{
666
-					@ini_restore('sendmail_from');
667
-				}
668
-
669
-				// Restore parameters
670
-				if (! empty($conf->global->$keyforsmtpserver))	ini_restore('SMTP');
671
-				if (! empty($conf->global->$keyforsmtpport)) 	ini_restore('smtp_port');
672
-			}
673
-			else if ($this->sendmode == 'smtps')
674
-			{
675
-				if (! is_object($this->smtps))
676
-				{
677
-					$this->error="Failed to send mail with smtps lib to HOST=".$server.", PORT=".$conf->global->$keyforsmtpport."<br>Constructor of object CMailFile was not initialized without errors.";
678
-					dol_syslog("CMailFile::sendfile: mail end error=".$this->error, LOG_ERR);
679
-					return false;
680
-				}
681
-
682
-				// Use SMTPS library
683
-				// ------------------------------------------
684
-				$this->smtps->setTransportType(0);	// Only this method is coded in SMTPs library
685
-
686
-				// Clean parameters
687
-				if (empty($conf->global->$keyforsmtpserver)) $conf->global->$keyforsmtpserver=ini_get('SMTP');
688
-				if (empty($conf->global->$keyforsmtpport))   $conf->global->$keyforsmtpport=ini_get('smtp_port');
689
-
690
-				// If we use SSL/TLS
691
-				$server=$conf->global->$keyforsmtpserver;
692
-				$secure='';
693
-				if (! empty($conf->global->$keyfortls) && function_exists('openssl_open')) $secure='ssl';
694
-				if (! empty($conf->global->$keyforstarttls) && function_exists('openssl_open')) $secure='tls';
695
-				$server=($secure?$secure.'://':'').$server;
696
-
697
-				$port=$conf->global->$keyforsmtpport;
698
-
699
-				$this->smtps->setHost($server);
700
-				$this->smtps->setPort($port); // 25, 465...;
701
-
702
-				$loginid=''; $loginpass='';
703
-				if (! empty($conf->global->$keyforsmtpid))
704
-				{
705
-					$loginid = $conf->global->$keyforsmtpid;
706
-					$this->smtps->setID($loginid);
707
-				}
708
-				if (! empty($conf->global->$keyforsmtppw))
709
-				{
710
-					$loginpass = $conf->global->$keyforsmtppw;
711
-					$this->smtps->setPW($loginpass);
712
-				}
713
-
714
-				$res=true;
715
-				$from=$this->smtps->getFrom('org');
716
-				if ($res && ! $from)
717
-				{
718
-					$this->error="Failed to send mail with smtps lib to HOST=".$server.", PORT=".$conf->global->$keyforsmtpport."<br>Sender address '$from' invalid";
719
-					dol_syslog("CMailFile::sendfile: mail end error=".$this->error, LOG_ERR);
720
-					$res=false;
721
-				}
722
-				$dest=$this->smtps->getTo();
723
-				if ($res && ! $dest)
724
-				{
725
-					$this->error="Failed to send mail with smtps lib to HOST=".$server.", PORT=".$conf->global->$keyforsmtpport."<br>Recipient address '$dest' invalid";
726
-					dol_syslog("CMailFile::sendfile: mail end error=".$this->error, LOG_ERR);
727
-					$res=false;
728
-				}
729
-
730
-				if ($res)
731
-				{
732
-					if (! empty($conf->global->MAIN_MAIL_DEBUG)) $this->smtps->setDebug(true);
733
-
734
-					$result=$this->smtps->sendMsg();
735
-					//print $result;
736
-
737
-					if (! empty($conf->global->MAIN_MAIL_DEBUG)) $this->dump_mail();
738
-
739
-					$result=$this->smtps->getErrors();
740
-					if (empty($this->error) && empty($result))
741
-					{
742
-						dol_syslog("CMailFile::sendfile: mail end success", LOG_DEBUG);
743
-						$res=true;
744
-					}
745
-					else
746
-					{
747
-						if (empty($this->error)) $this->error=$result;
748
-						dol_syslog("CMailFile::sendfile: mail end error=".$this->error, LOG_ERR);
749
-						$res=false;
750
-					}
751
-				}
752
-			}
753
-			else if ($this->sendmode == 'swiftmailer')
754
-			{
755
-				// Use Swift Mailer library
756
-				// ------------------------------------------
757
-				require_once DOL_DOCUMENT_ROOT.'/includes/swiftmailer/lib/swift_required.php';
758
-
759
-				// Clean parameters
760
-				if (empty($conf->global->$keyforsmtpserver)) $conf->global->$keyforsmtpserver=ini_get('SMTP');
761
-				if (empty($conf->global->$keyforsmtpport))   $conf->global->$keyforsmtpport=ini_get('smtp_port');
762
-
763
-				// If we use SSL/TLS
764
-				$server = $conf->global->$keyforsmtpserver;
765
-				$secure = '';
766
-				if (! empty($conf->global->$keyfortls) && function_exists('openssl_open')) $secure='ssl';
767
-				if (! empty($conf->global->$keyforstarttls) && function_exists('openssl_open')) $secure='tls';
768
-
769
-				$this->transport = new Swift_SmtpTransport($server, $conf->global->$keyforsmtpport, $secure);
770
-
771
-				if (! empty($conf->global->$keyforsmtpid)) $this->transport->setUsername($conf->global->$keyforsmtpid);
772
-				if (! empty($conf->global->$keyforsmtppw)) $this->transport->setPassword($conf->global->$keyforsmtppw);
773
-				//$smtps->_msgReplyTo  = '[email protected]';
774
-
775
-				// Create the Mailer using your created Transport
776
-				$this->mailer = new Swift_Mailer($this->transport);
427
+            try {
428
+                $result = $this->message->setCharSet($conf->file->character_set_client);
429
+            } catch (Exception $e) {
430
+                $this->errors[] =  $e->getMessage();
431
+            }
432
+
433
+            if (! empty($this->html))
434
+            {
435
+                if (!empty($css))
436
+                {
437
+                    $this->css = $css;
438
+                    $this->buildCSS();
439
+                }
440
+                $msg = $this->html;
441
+                $msg = $this->checkIfHTML($msg);
442
+            }
443
+
444
+            if ($this->atleastoneimage)
445
+            {
446
+                foreach ($this->images_encoded as $img)
447
+                {
448
+                    //$img['fullpath'],$img['image_encoded'],$img['name'],$img['content_type'],$img['cid']
449
+                    $attachment = Swift_Image::fromPath($img['fullpath'], $img['content_type']);
450
+                    // embed image
451
+                    $imgcid = $this->message->embed($attachment);
452
+                    // replace cid by the one created by swiftmail in html message
453
+                    $msg = str_replace("cid:".$img['cid'], $imgcid, $msg);
454
+                }
455
+            }
456
+
457
+            if ($this->msgishtml) {
458
+                $this->message->setBody($msg,'text/html');
459
+                // And optionally an alternative body
460
+                $this->message->addPart(html_entity_decode(strip_tags($msg)), 'text/plain');
461
+            } else {
462
+                $this->message->setBody($msg,'text/plain');
463
+                // And optionally an alternative body
464
+                $this->message->addPart($msg, 'text/html');
465
+            }
466
+
467
+            if ($this->atleastonefile)
468
+            {
469
+                foreach ($filename_list as $i => $val)
470
+                {
471
+                    //$this->message->attach(Swift_Attachment::fromPath($filename_list[$i],$mimetype_list[$i]));
472
+                    $attachment = Swift_Attachment::fromPath($filename_list[$i],$mimetype_list[$i]);
473
+                    $this->message->attach($attachment);
474
+                }
475
+            }
476
+
477
+            if (! empty($addr_cc)) $this->message->setCc($this->getArrayAddress($addr_cc));
478
+            if (! empty($addr_bcc)) $this->message->setBcc($this->getArrayAddress($addr_bcc));
479
+            //if (! empty($errors_to)) $this->message->setErrorsTo($this->getArrayAddress($errors_to);
480
+            if (isset($deliveryreceipt) && $deliveryreceipt == 1) $this->message->setReadReceiptTo($this->getArrayAddress($from));
481
+        }
482
+        else
483
+        {
484
+            // Send mail method not correctly defined
485
+            // --------------------------------------
486
+            $this->error = 'Bad value for sendmode';
487
+        }
488
+    }
489
+
490
+
491
+    /**
492
+     * Send mail that was prepared by constructor.
493
+     *
494
+     * @return    boolean     True if mail sent, false otherwise
495
+     */
496
+    function sendfile()
497
+    {
498
+        global $conf,$db,$langs;
499
+
500
+        $errorlevel=error_reporting();
501
+        //error_reporting($errorlevel ^ E_WARNING);   // Desactive warnings
502
+
503
+        $res=false;
504
+
505
+        if (empty($conf->global->MAIN_DISABLE_ALL_MAILS) || !empty($conf->global->MAIN_MAIL_FORCE_SENDTO))
506
+        {
507
+            require_once DOL_DOCUMENT_ROOT . '/core/class/hookmanager.class.php';
508
+            $hookmanager = new HookManager($db);
509
+            $hookmanager->initHooks(array('mail'));
510
+
511
+            $parameters=array(); $action='';
512
+            $reshook = $hookmanager->executeHooks('sendMail', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
513
+            if ($reshook < 0)
514
+            {
515
+                $this->error = "Error in hook maildao sendMail " . $reshook;
516
+                dol_syslog("CMailFile::sendfile: mail end error=" . $this->error, LOG_ERR);
517
+
518
+                return $reshook;
519
+            }
520
+            if ($reshook == 1)	// Hook replace standard code
521
+            {
522
+                return true;
523
+            }
524
+
525
+            // Check number of recipient is lower or equal than MAIL_MAX_NB_OF_RECIPIENTS_IN_SAME_EMAIL
526
+            if (empty($conf->global->MAIL_MAX_NB_OF_RECIPIENTS_TO_IN_SAME_EMAIL)) $conf->global->MAIL_MAX_NB_OF_RECIPIENTS_TO_IN_SAME_EMAIL=10;
527
+            $tmparray1 = explode(',', $this->addr_to);
528
+            if (count($tmparray1) > $conf->global->MAIL_MAX_NB_OF_RECIPIENTS_TO_IN_SAME_EMAIL)
529
+            {
530
+                $this->error = 'Too much recipients in to:';
531
+                dol_syslog("CMailFile::sendfile: mail end error=" . $this->error, LOG_WARNING);
532
+                return false;
533
+            }
534
+            if (empty($conf->global->MAIL_MAX_NB_OF_RECIPIENTS_CC_IN_SAME_EMAIL)) $conf->global->MAIL_MAX_NB_OF_RECIPIENTS_CC_IN_SAME_EMAIL=10;
535
+            $tmparray2 = explode(',', $this->addr_cc);
536
+            if (count($tmparray2) > $conf->global->MAIL_MAX_NB_OF_RECIPIENTS_CC_IN_SAME_EMAIL)
537
+            {
538
+                $this->error = 'Too much recipients in cc:';
539
+                dol_syslog("CMailFile::sendfile: mail end error=" . $this->error, LOG_WARNING);
540
+                return false;
541
+            }
542
+            if (empty($conf->global->MAIL_MAX_NB_OF_RECIPIENTS_BCC_IN_SAME_EMAIL)) $conf->global->MAIL_MAX_NB_OF_RECIPIENTS_BCC_IN_SAME_EMAIL=10;
543
+            $tmparray3 = explode(',', $this->addr_bcc);
544
+            if (count($tmparray3) > $conf->global->MAIL_MAX_NB_OF_RECIPIENTS_BCC_IN_SAME_EMAIL)
545
+            {
546
+                $this->error = 'Too much recipients in bcc:';
547
+                dol_syslog("CMailFile::sendfile: mail end error=" . $this->error, LOG_WARNING);
548
+                return false;
549
+            }
550
+            if (empty($conf->global->MAIL_MAX_NB_OF_RECIPIENTS_IN_SAME_EMAIL)) $conf->global->MAIL_MAX_NB_OF_RECIPIENTS_IN_SAME_EMAIL=10;
551
+            if ((count($tmparray1)+count($tmparray2)+count($tmparray3)) > $conf->global->MAIL_MAX_NB_OF_RECIPIENTS_IN_SAME_EMAIL)
552
+            {
553
+                $this->error = 'Too much recipients in to:, cc:, bcc:';
554
+                dol_syslog("CMailFile::sendfile: mail end error=" . $this->error, LOG_WARNING);
555
+                return false;
556
+            }
557
+
558
+            $keyforsmtpserver='MAIN_MAIL_SMTP_SERVER';
559
+            $keyforsmtpport  ='MAIN_MAIL_SMTP_PORT';
560
+            $keyforsmtpid    ='MAIN_MAIL_SMTPS_ID';
561
+            $keyforsmtppw    ='MAIN_MAIL_SMTPS_PW';
562
+            $keyfortls       ='MAIN_MAIL_EMAIL_TLS';
563
+            $keyforstarttls  ='MAIN_MAIL_EMAIL_STARTTLS';
564
+            if ($this->sendcontext == 'emailing' && !empty($conf->global->MAIN_MAIL_SENDMODE_EMAILING) && $conf->global->MAIN_MAIL_SENDMODE_EMAILING != 'default')
565
+            {
566
+                $keyforsmtpserver='MAIN_MAIL_SMTP_SERVER_EMAILING';
567
+                $keyforsmtpport  ='MAIN_MAIL_SMTP_PORT_EMAILING';
568
+                $keyforsmtpid    ='MAIN_MAIL_SMTPS_ID_EMAILING';
569
+                $keyforsmtppw    ='MAIN_MAIL_SMTPS_PW_EMAILING';
570
+                $keyfortls       ='MAIN_MAIL_EMAIL_TLS_EMAILING';
571
+                $keyforstarttls  ='MAIN_MAIL_EMAIL_STARTTLS_EMAILING';
572
+            }
573
+
574
+            if (!empty($conf->global->MAIN_MAIL_FORCE_SENDTO))
575
+            {
576
+                $this->addr_to = $conf->global->MAIN_MAIL_FORCE_SENDTO;
577
+                $this->addr_cc = '';
578
+                $this->addr_bcc = '';
579
+            }
580
+
581
+            // Action according to choosed sending method
582
+            if ($this->sendmode == 'mail')
583
+            {
584
+                // Use mail php function (default PHP method)
585
+                // ------------------------------------------
586
+                dol_syslog("CMailFile::sendfile addr_to=".$this->addr_to.", subject=".$this->subject, LOG_DEBUG);
587
+                dol_syslog("CMailFile::sendfile header=\n".$this->headers, LOG_DEBUG);
588
+                //dol_syslog("CMailFile::sendfile message=\n".$message);
589
+
590
+                // If Windows, sendmail_from must be defined
591
+                if (isset($_SERVER["WINDIR"]))
592
+                {
593
+                    if (empty($this->addr_from)) $this->addr_from = '[email protected]';
594
+                    @ini_set('sendmail_from',$this->getValidAddress($this->addr_from,2));
595
+                }
596
+
597
+                // Force parameters
598
+                if (! empty($conf->global->$keyforsmtpserver)) ini_set('SMTP',$conf->global->$keyforsmtpserver);
599
+                if (! empty($conf->global->$keyforsmtpport))   ini_set('smtp_port',$conf->global->$keyforsmtpport);
600
+
601
+                $res=true;
602
+                if ($res && ! $this->subject)
603
+                {
604
+                    $this->error="Failed to send mail with php mail to HOST=".ini_get('SMTP').", PORT=".ini_get('smtp_port')."<br>Subject is empty";
605
+                    dol_syslog("CMailFile::sendfile: mail end error=".$this->error, LOG_ERR);
606
+                    $res=false;
607
+                }
608
+                $dest=$this->getValidAddress($this->addr_to,2);
609
+                if ($res && ! $dest)
610
+                {
611
+                    $this->error="Failed to send mail with php mail to HOST=".ini_get('SMTP').", PORT=".ini_get('smtp_port')."<br>Recipient address '$dest' invalid";
612
+                    dol_syslog("CMailFile::sendfile: mail end error=".$this->error, LOG_ERR);
613
+                    $res=false;
614
+                }
615
+
616
+                if ($res)
617
+                {
618
+                    $additionnalparam = '';	// By default
619
+                    if (! empty($conf->global->MAIN_MAIL_ALLOW_SENDMAIL_F))
620
+                    {
621
+                        // le "Return-Path" (retour des messages bounced) dans les header ne fonctionne pas avec tous les MTA
622
+                        // Le forcage de la valeur grace à l'option -f de sendmail est donc possible si la constante MAIN_MAIL_ALLOW_SENDMAIL_F est definie.
623
+                        // Having this variable defined may create problems with some sendmail (option -f refused)
624
+                        // Having this variable not defined may create problems with some other sendmail (option -f required)
625
+                        $additionnalparam .= ($additionnalparam?' ':'').(! empty($conf->global->MAIN_MAIL_ERRORS_TO) ? '-f' . $this->getValidAddress($conf->global->MAIN_MAIL_ERRORS_TO,2) : ($this->addr_from != '' ? '-f' . $this->getValidAddress($this->addr_from,2) : '') );
626
+                    }
627
+                    if (! empty($conf->global->MAIN_MAIL_SENDMAIL_FORCE_BA))    // To force usage of -ba option. This option tells sendmail to read From: or Sender: to setup sender
628
+                    {
629
+                        $additionnalparam .= ($additionnalparam?' ':'').'-ba';
630
+                    }
631
+
632
+                    if (! empty($conf->global->MAIN_MAIL_SENDMAIL_FORCE_ADDPARAM)) $additionnalparam .= ($additionnalparam?' ':'').'-U '.$additionnalparam; // Use -U to add additionnal params
633
+
634
+                    dol_syslog("CMailFile::sendfile: mail start HOST=".ini_get('SMTP').", PORT=".ini_get('smtp_port').", additionnal_parameters=".$additionnalparam, LOG_DEBUG);
635
+
636
+                    $this->message=stripslashes($this->message);
637
+
638
+                    if (! empty($conf->global->MAIN_MAIL_DEBUG)) $this->dump_mail();
639
+
640
+                    if (! empty($additionnalparam)) $res = mail($dest, $this->encodetorfc2822($this->subject), $this->message, $this->headers, $additionnalparam);
641
+                    else $res = mail($dest, $this->encodetorfc2822($this->subject), $this->message, $this->headers);
642
+
643
+                    if (! $res)
644
+                    {
645
+                        $langs->load("errors");
646
+                        $this->error="Failed to send mail with php mail";
647
+                        $linuxlike=1;
648
+                        if (preg_match('/^win/i',PHP_OS)) $linuxlike=0;
649
+                        if (preg_match('/^mac/i',PHP_OS)) $linuxlike=0;
650
+                        if (! $linuxlike)
651
+                        {
652
+                            $this->error.=" to HOST=".ini_get('SMTP').", PORT=".ini_get('smtp_port');	// This values are value used only for non linuxlike systems
653
+                        }
654
+                        $this->error.=".<br>";
655
+                        $this->error.=$langs->trans("ErrorPhpMailDelivery");
656
+                        dol_syslog("CMailFile::sendfile: mail end error=".$this->error, LOG_ERR);
657
+                    }
658
+                    else
659
+                    {
660
+                        dol_syslog("CMailFile::sendfile: mail end success", LOG_DEBUG);
661
+                    }
662
+                }
663
+
664
+                if (isset($_SERVER["WINDIR"]))
665
+                {
666
+                    @ini_restore('sendmail_from');
667
+                }
668
+
669
+                // Restore parameters
670
+                if (! empty($conf->global->$keyforsmtpserver))	ini_restore('SMTP');
671
+                if (! empty($conf->global->$keyforsmtpport)) 	ini_restore('smtp_port');
672
+            }
673
+            else if ($this->sendmode == 'smtps')
674
+            {
675
+                if (! is_object($this->smtps))
676
+                {
677
+                    $this->error="Failed to send mail with smtps lib to HOST=".$server.", PORT=".$conf->global->$keyforsmtpport."<br>Constructor of object CMailFile was not initialized without errors.";
678
+                    dol_syslog("CMailFile::sendfile: mail end error=".$this->error, LOG_ERR);
679
+                    return false;
680
+                }
681
+
682
+                // Use SMTPS library
683
+                // ------------------------------------------
684
+                $this->smtps->setTransportType(0);	// Only this method is coded in SMTPs library
685
+
686
+                // Clean parameters
687
+                if (empty($conf->global->$keyforsmtpserver)) $conf->global->$keyforsmtpserver=ini_get('SMTP');
688
+                if (empty($conf->global->$keyforsmtpport))   $conf->global->$keyforsmtpport=ini_get('smtp_port');
689
+
690
+                // If we use SSL/TLS
691
+                $server=$conf->global->$keyforsmtpserver;
692
+                $secure='';
693
+                if (! empty($conf->global->$keyfortls) && function_exists('openssl_open')) $secure='ssl';
694
+                if (! empty($conf->global->$keyforstarttls) && function_exists('openssl_open')) $secure='tls';
695
+                $server=($secure?$secure.'://':'').$server;
696
+
697
+                $port=$conf->global->$keyforsmtpport;
698
+
699
+                $this->smtps->setHost($server);
700
+                $this->smtps->setPort($port); // 25, 465...;
701
+
702
+                $loginid=''; $loginpass='';
703
+                if (! empty($conf->global->$keyforsmtpid))
704
+                {
705
+                    $loginid = $conf->global->$keyforsmtpid;
706
+                    $this->smtps->setID($loginid);
707
+                }
708
+                if (! empty($conf->global->$keyforsmtppw))
709
+                {
710
+                    $loginpass = $conf->global->$keyforsmtppw;
711
+                    $this->smtps->setPW($loginpass);
712
+                }
713
+
714
+                $res=true;
715
+                $from=$this->smtps->getFrom('org');
716
+                if ($res && ! $from)
717
+                {
718
+                    $this->error="Failed to send mail with smtps lib to HOST=".$server.", PORT=".$conf->global->$keyforsmtpport."<br>Sender address '$from' invalid";
719
+                    dol_syslog("CMailFile::sendfile: mail end error=".$this->error, LOG_ERR);
720
+                    $res=false;
721
+                }
722
+                $dest=$this->smtps->getTo();
723
+                if ($res && ! $dest)
724
+                {
725
+                    $this->error="Failed to send mail with smtps lib to HOST=".$server.", PORT=".$conf->global->$keyforsmtpport."<br>Recipient address '$dest' invalid";
726
+                    dol_syslog("CMailFile::sendfile: mail end error=".$this->error, LOG_ERR);
727
+                    $res=false;
728
+                }
729
+
730
+                if ($res)
731
+                {
732
+                    if (! empty($conf->global->MAIN_MAIL_DEBUG)) $this->smtps->setDebug(true);
733
+
734
+                    $result=$this->smtps->sendMsg();
735
+                    //print $result;
736
+
737
+                    if (! empty($conf->global->MAIN_MAIL_DEBUG)) $this->dump_mail();
738
+
739
+                    $result=$this->smtps->getErrors();
740
+                    if (empty($this->error) && empty($result))
741
+                    {
742
+                        dol_syslog("CMailFile::sendfile: mail end success", LOG_DEBUG);
743
+                        $res=true;
744
+                    }
745
+                    else
746
+                    {
747
+                        if (empty($this->error)) $this->error=$result;
748
+                        dol_syslog("CMailFile::sendfile: mail end error=".$this->error, LOG_ERR);
749
+                        $res=false;
750
+                    }
751
+                }
752
+            }
753
+            else if ($this->sendmode == 'swiftmailer')
754
+            {
755
+                // Use Swift Mailer library
756
+                // ------------------------------------------
757
+                require_once DOL_DOCUMENT_ROOT.'/includes/swiftmailer/lib/swift_required.php';
758
+
759
+                // Clean parameters
760
+                if (empty($conf->global->$keyforsmtpserver)) $conf->global->$keyforsmtpserver=ini_get('SMTP');
761
+                if (empty($conf->global->$keyforsmtpport))   $conf->global->$keyforsmtpport=ini_get('smtp_port');
762
+
763
+                // If we use SSL/TLS
764
+                $server = $conf->global->$keyforsmtpserver;
765
+                $secure = '';
766
+                if (! empty($conf->global->$keyfortls) && function_exists('openssl_open')) $secure='ssl';
767
+                if (! empty($conf->global->$keyforstarttls) && function_exists('openssl_open')) $secure='tls';
768
+
769
+                $this->transport = new Swift_SmtpTransport($server, $conf->global->$keyforsmtpport, $secure);
770
+
771
+                if (! empty($conf->global->$keyforsmtpid)) $this->transport->setUsername($conf->global->$keyforsmtpid);
772
+                if (! empty($conf->global->$keyforsmtppw)) $this->transport->setPassword($conf->global->$keyforsmtppw);
773
+                //$smtps->_msgReplyTo  = '[email protected]';
774
+
775
+                // Create the Mailer using your created Transport
776
+                $this->mailer = new Swift_Mailer($this->transport);
777 777
 
778 778
                 // DKIM SIGN
779 779
                 if ($conf->global->MAIN_MAIL_EMAIL_DKIM_ENABLED) {
@@ -785,770 +785,770 @@  discard block
 block discarded – undo
785 785
                 }
786 786
 
787 787
                 if (! empty($conf->global->MAIN_MAIL_DEBUG)) {
788
-					// To use the ArrayLogger
789
-					$this->logger = new Swift_Plugins_Loggers_ArrayLogger();
790
-					// Or to use the Echo Logger
791
-					//$this->logger = new Swift_Plugins_Loggers_EchoLogger();
792
-					$this->mailer->registerPlugin(new Swift_Plugins_LoggerPlugin($this->logger));
793
-				}
794
-				// send mail
795
-				try {
796
-					$result = $this->mailer->send($this->message);
797
-				} catch (Exception $e) {
798
-					$this->error =  $e->getMessage();
799
-				}
800
-				if (! empty($conf->global->MAIN_MAIL_DEBUG)) $this->dump_mail();
801
-
802
-				$res = true;
803
-				if (! empty($this->error) || ! $result) {
804
-					dol_syslog("CMailFile::sendfile: mail end error=".$this->error, LOG_ERR);
805
-					$res=false;
806
-				}
807
-				else
808
-				{
809
-					dol_syslog("CMailFile::sendfile: mail end success", LOG_DEBUG);
810
-				}
811
-			}
812
-			else
813
-			{
814
-				// Send mail method not correctly defined
815
-				// --------------------------------------
816
-
817
-				return 'Bad value for sendmode';
818
-			}
819
-
820
-			$parameters=array(); $action='';
821
-			$reshook = $hookmanager->executeHooks('sendMailAfter', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
822
-			if ($reshook < 0)
823
-			{
824
-				$this->error = "Error in hook maildao sendMailAfter " . $reshook;
825
-				dol_syslog("CMailFile::sendfile: mail end error=" . $this->error, LOG_ERR);
826
-
827
-				return $reshook;
828
-			}
829
-		}
830
-		else
831
-		{
832
-			$this->error='No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS';
833
-			dol_syslog("CMailFile::sendfile: ".$this->error, LOG_WARNING);
834
-		}
835
-
836
-		error_reporting($errorlevel);              // Reactive niveau erreur origine
837
-
838
-		return $res;
839
-	}
840
-
841
-	/**
842
-	 * Encode subject according to RFC 2822 - http://en.wikipedia.org/wiki/MIME#Encoded-Word
843
-	 *
844
-	 * @param string $stringtoencode String to encode
845
-	 * @return string                string encoded
846
-	 */
847
-	static function encodetorfc2822($stringtoencode)
848
-	{
849
-		global $conf;
850
-		return '=?'.$conf->file->character_set_client.'?B?'.base64_encode($stringtoencode).'?=';
851
-	}
788
+                    // To use the ArrayLogger
789
+                    $this->logger = new Swift_Plugins_Loggers_ArrayLogger();
790
+                    // Or to use the Echo Logger
791
+                    //$this->logger = new Swift_Plugins_Loggers_EchoLogger();
792
+                    $this->mailer->registerPlugin(new Swift_Plugins_LoggerPlugin($this->logger));
793
+                }
794
+                // send mail
795
+                try {
796
+                    $result = $this->mailer->send($this->message);
797
+                } catch (Exception $e) {
798
+                    $this->error =  $e->getMessage();
799
+                }
800
+                if (! empty($conf->global->MAIN_MAIL_DEBUG)) $this->dump_mail();
801
+
802
+                $res = true;
803
+                if (! empty($this->error) || ! $result) {
804
+                    dol_syslog("CMailFile::sendfile: mail end error=".$this->error, LOG_ERR);
805
+                    $res=false;
806
+                }
807
+                else
808
+                {
809
+                    dol_syslog("CMailFile::sendfile: mail end success", LOG_DEBUG);
810
+                }
811
+            }
812
+            else
813
+            {
814
+                // Send mail method not correctly defined
815
+                // --------------------------------------
816
+
817
+                return 'Bad value for sendmode';
818
+            }
819
+
820
+            $parameters=array(); $action='';
821
+            $reshook = $hookmanager->executeHooks('sendMailAfter', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
822
+            if ($reshook < 0)
823
+            {
824
+                $this->error = "Error in hook maildao sendMailAfter " . $reshook;
825
+                dol_syslog("CMailFile::sendfile: mail end error=" . $this->error, LOG_ERR);
826
+
827
+                return $reshook;
828
+            }
829
+        }
830
+        else
831
+        {
832
+            $this->error='No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS';
833
+            dol_syslog("CMailFile::sendfile: ".$this->error, LOG_WARNING);
834
+        }
835
+
836
+        error_reporting($errorlevel);              // Reactive niveau erreur origine
837
+
838
+        return $res;
839
+    }
840
+
841
+    /**
842
+     * Encode subject according to RFC 2822 - http://en.wikipedia.org/wiki/MIME#Encoded-Word
843
+     *
844
+     * @param string $stringtoencode String to encode
845
+     * @return string                string encoded
846
+     */
847
+    static function encodetorfc2822($stringtoencode)
848
+    {
849
+        global $conf;
850
+        return '=?'.$conf->file->character_set_client.'?B?'.base64_encode($stringtoencode).'?=';
851
+    }
852 852
 
853 853
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
854
-	/**
855
-	 * Read a file on disk and return encoded content for emails (mode = 'mail')
856
-	 *
857
-	 * @param	string	$sourcefile		Path to file to encode
858
-	 * @return 	int					    <0 if KO, encoded string if OK
859
-	 */
860
-	function _encode_file($sourcefile)
861
-	{
854
+    /**
855
+     * Read a file on disk and return encoded content for emails (mode = 'mail')
856
+     *
857
+     * @param	string	$sourcefile		Path to file to encode
858
+     * @return 	int					    <0 if KO, encoded string if OK
859
+     */
860
+    function _encode_file($sourcefile)
861
+    {
862 862
         // phpcs:enable
863
-		$newsourcefile=dol_osencode($sourcefile);
864
-
865
-		if (is_readable($newsourcefile))
866
-		{
867
-			$contents = file_get_contents($newsourcefile);	// Need PHP 4.3
868
-			$encoded = chunk_split(base64_encode($contents), 76, $this->eol);    // 76 max is defined into http://tools.ietf.org/html/rfc2047
869
-			return $encoded;
870
-		}
871
-		else
872
-		{
873
-			$this->error="Error: Can't read file '".$sourcefile."' into _encode_file";
874
-			dol_syslog("CMailFile::encode_file: ".$this->error, LOG_ERR);
875
-			return -1;
876
-		}
877
-	}
863
+        $newsourcefile=dol_osencode($sourcefile);
864
+
865
+        if (is_readable($newsourcefile))
866
+        {
867
+            $contents = file_get_contents($newsourcefile);	// Need PHP 4.3
868
+            $encoded = chunk_split(base64_encode($contents), 76, $this->eol);    // 76 max is defined into http://tools.ietf.org/html/rfc2047
869
+            return $encoded;
870
+        }
871
+        else
872
+        {
873
+            $this->error="Error: Can't read file '".$sourcefile."' into _encode_file";
874
+            dol_syslog("CMailFile::encode_file: ".$this->error, LOG_ERR);
875
+            return -1;
876
+        }
877
+    }
878 878
 
879 879
 
880 880
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
881
-	/**
882
-	 *  Write content of a SMTP request into a dump file (mode = all)
883
-	 *  Used for debugging.
884
-	 *  Note that to see full SMTP protocol, you can use tcpdump -w /tmp/smtp -s 2000 port 25"
885
-	 *
886
-	 *  @return	void
887
-	 */
888
-	function dump_mail()
889
-	{
881
+    /**
882
+     *  Write content of a SMTP request into a dump file (mode = all)
883
+     *  Used for debugging.
884
+     *  Note that to see full SMTP protocol, you can use tcpdump -w /tmp/smtp -s 2000 port 25"
885
+     *
886
+     *  @return	void
887
+     */
888
+    function dump_mail()
889
+    {
890 890
         // phpcs:enable
891
-		global $conf,$dolibarr_main_data_root;
892
-
893
-		if (@is_writeable($dolibarr_main_data_root))	// Avoid fatal error on fopen with open_basedir
894
-		{
895
-			$outputfile=$dolibarr_main_data_root."/dolibarr_mail.log";
896
-			$fp = fopen($outputfile,"w");
897
-
898
-			if ($this->sendmode == 'mail')
899
-			{
900
-				fputs($fp, $this->headers);
901
-				fputs($fp, $this->eol);			// This eol is added by the mail function, so we add it in log
902
-				fputs($fp, $this->message);
903
-			}
904
-			elseif ($this->sendmode == 'smtps')
905
-			{
906
-				fputs($fp, $this->smtps->log);	// this->smtps->log is filled only if MAIN_MAIL_DEBUG was set to on
907
-			}
908
-			elseif ($this->sendmode == 'swiftmailer')
909
-			{
910
-				fputs($fp, $this->logger->dump());	// this->logger is filled only if MAIN_MAIL_DEBUG was set to on
911
-			}
912
-
913
-			fclose($fp);
914
-			if (! empty($conf->global->MAIN_UMASK))
915
-				@chmod($outputfile, octdec($conf->global->MAIN_UMASK));
916
-		}
917
-	}
918
-
919
-
920
-	/**
921
-	 * Correct an uncomplete html string
922
-	 *
923
-	 * @param	string	$msg	String
924
-	 * @return	string			Completed string
925
-	 */
926
-	function checkIfHTML($msg)
927
-	{
928
-		if (!preg_match('/^[\s\t]*<html/i',$msg))
929
-		{
930
-			$out = "<html><head><title></title>";
931
-			if (!empty($this->styleCSS)) $out.= $this->styleCSS;
932
-			$out.= "</head><body";
933
-			if (!empty($this->bodyCSS)) $out.= $this->bodyCSS;
934
-			$out.= ">";
935
-			$out.= $msg;
936
-			$out.= "</body></html>";
937
-		}
938
-		else
939
-		{
940
-			$out = $msg;
941
-		}
942
-
943
-		return $out;
944
-	}
945
-
946
-	/**
947
-	 * Build a css style (mode = all) into this->styleCSS and this->bodyCSS
948
-	 *
949
-	 * @return string
950
-	 */
951
-	function buildCSS()
952
-	{
953
-		if (! empty($this->css))
954
-		{
955
-			// Style CSS
956
-			$this->styleCSS = '<style type="text/css">';
957
-			$this->styleCSS.= 'body {';
958
-
959
-			if ($this->css['bgcolor'])
960
-			{
961
-				$this->styleCSS.= '  background-color: '.$this->css['bgcolor'].';';
962
-				$this->bodyCSS.= ' bgcolor="'.$this->css['bgcolor'].'"';
963
-			}
964
-			if ($this->css['bgimage'])
965
-			{
966
-				// TODO recuperer cid
967
-				$this->styleCSS.= ' background-image: url("cid:'.$this->css['bgimage_cid'].'");';
968
-			}
969
-			$this->styleCSS.= '}';
970
-			$this->styleCSS.= '</style>';
971
-		}
972
-	}
891
+        global $conf,$dolibarr_main_data_root;
892
+
893
+        if (@is_writeable($dolibarr_main_data_root))	// Avoid fatal error on fopen with open_basedir
894
+        {
895
+            $outputfile=$dolibarr_main_data_root."/dolibarr_mail.log";
896
+            $fp = fopen($outputfile,"w");
897
+
898
+            if ($this->sendmode == 'mail')
899
+            {
900
+                fputs($fp, $this->headers);
901
+                fputs($fp, $this->eol);			// This eol is added by the mail function, so we add it in log
902
+                fputs($fp, $this->message);
903
+            }
904
+            elseif ($this->sendmode == 'smtps')
905
+            {
906
+                fputs($fp, $this->smtps->log);	// this->smtps->log is filled only if MAIN_MAIL_DEBUG was set to on
907
+            }
908
+            elseif ($this->sendmode == 'swiftmailer')
909
+            {
910
+                fputs($fp, $this->logger->dump());	// this->logger is filled only if MAIN_MAIL_DEBUG was set to on
911
+            }
912
+
913
+            fclose($fp);
914
+            if (! empty($conf->global->MAIN_UMASK))
915
+                @chmod($outputfile, octdec($conf->global->MAIN_UMASK));
916
+        }
917
+    }
918
+
919
+
920
+    /**
921
+     * Correct an uncomplete html string
922
+     *
923
+     * @param	string	$msg	String
924
+     * @return	string			Completed string
925
+     */
926
+    function checkIfHTML($msg)
927
+    {
928
+        if (!preg_match('/^[\s\t]*<html/i',$msg))
929
+        {
930
+            $out = "<html><head><title></title>";
931
+            if (!empty($this->styleCSS)) $out.= $this->styleCSS;
932
+            $out.= "</head><body";
933
+            if (!empty($this->bodyCSS)) $out.= $this->bodyCSS;
934
+            $out.= ">";
935
+            $out.= $msg;
936
+            $out.= "</body></html>";
937
+        }
938
+        else
939
+        {
940
+            $out = $msg;
941
+        }
942
+
943
+        return $out;
944
+    }
945
+
946
+    /**
947
+     * Build a css style (mode = all) into this->styleCSS and this->bodyCSS
948
+     *
949
+     * @return string
950
+     */
951
+    function buildCSS()
952
+    {
953
+        if (! empty($this->css))
954
+        {
955
+            // Style CSS
956
+            $this->styleCSS = '<style type="text/css">';
957
+            $this->styleCSS.= 'body {';
958
+
959
+            if ($this->css['bgcolor'])
960
+            {
961
+                $this->styleCSS.= '  background-color: '.$this->css['bgcolor'].';';
962
+                $this->bodyCSS.= ' bgcolor="'.$this->css['bgcolor'].'"';
963
+            }
964
+            if ($this->css['bgimage'])
965
+            {
966
+                // TODO recuperer cid
967
+                $this->styleCSS.= ' background-image: url("cid:'.$this->css['bgimage_cid'].'");';
968
+            }
969
+            $this->styleCSS.= '}';
970
+            $this->styleCSS.= '</style>';
971
+        }
972
+    }
973 973
 
974 974
 
975 975
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
976
-	/**
977
-	 * Create SMTP headers (mode = 'mail')
978
-	 *
979
-	 * @return	string headers
980
-	 */
981
-	function write_smtpheaders()
982
-	{
976
+    /**
977
+     * Create SMTP headers (mode = 'mail')
978
+     *
979
+     * @return	string headers
980
+     */
981
+    function write_smtpheaders()
982
+    {
983 983
         // phpcs:enable
984
-		global $conf;
985
-		$out = "";
984
+        global $conf;
985
+        $out = "";
986 986
 
987
-		$host = dol_getprefix('email');
987
+        $host = dol_getprefix('email');
988 988
 
989
-		// Sender
990
-		//$out.= "Sender: ".getValidAddress($this->addr_from,2)).$this->eol2;
991
-		$out.= "From: ".$this->getValidAddress($this->addr_from,3,1).$this->eol2;
992
-		if (! empty($conf->global->MAIN_MAIL_SENDMAIL_FORCE_BA))
993
-		{
994
-			$out.= "To: ".$this->getValidAddress($this->addr_to,0,1).$this->eol2;
995
-		}
996
-		// Return-Path is important because it is used by SPF. Some MTA does not read Return-Path from header but from command line. See option MAIN_MAIL_ALLOW_SENDMAIL_F for that.
997
-		$out.= "Return-Path: ".$this->getValidAddress($this->addr_from,0,1).$this->eol2;
998
-		if (isset($this->reply_to)  && $this->reply_to)  $out.= "Reply-To: ".$this->getValidAddress($this->reply_to,2).$this->eol2;
999
-		if (isset($this->errors_to) && $this->errors_to) $out.= "Errors-To: ".$this->getValidAddress($this->errors_to,2).$this->eol2;
989
+        // Sender
990
+        //$out.= "Sender: ".getValidAddress($this->addr_from,2)).$this->eol2;
991
+        $out.= "From: ".$this->getValidAddress($this->addr_from,3,1).$this->eol2;
992
+        if (! empty($conf->global->MAIN_MAIL_SENDMAIL_FORCE_BA))
993
+        {
994
+            $out.= "To: ".$this->getValidAddress($this->addr_to,0,1).$this->eol2;
995
+        }
996
+        // Return-Path is important because it is used by SPF. Some MTA does not read Return-Path from header but from command line. See option MAIN_MAIL_ALLOW_SENDMAIL_F for that.
997
+        $out.= "Return-Path: ".$this->getValidAddress($this->addr_from,0,1).$this->eol2;
998
+        if (isset($this->reply_to)  && $this->reply_to)  $out.= "Reply-To: ".$this->getValidAddress($this->reply_to,2).$this->eol2;
999
+        if (isset($this->errors_to) && $this->errors_to) $out.= "Errors-To: ".$this->getValidAddress($this->errors_to,2).$this->eol2;
1000 1000
 
1001
-		// Receiver
1002
-		if (isset($this->addr_cc)   && $this->addr_cc)   $out.= "Cc: ".$this->getValidAddress($this->addr_cc,2).$this->eol2;
1003
-		if (isset($this->addr_bcc)  && $this->addr_bcc)  $out.= "Bcc: ".$this->getValidAddress($this->addr_bcc,2).$this->eol2;    // TODO Question: bcc must not be into header, only into SMTP command "RCPT TO". Does php mail support this ?
1001
+        // Receiver
1002
+        if (isset($this->addr_cc)   && $this->addr_cc)   $out.= "Cc: ".$this->getValidAddress($this->addr_cc,2).$this->eol2;
1003
+        if (isset($this->addr_bcc)  && $this->addr_bcc)  $out.= "Bcc: ".$this->getValidAddress($this->addr_bcc,2).$this->eol2;    // TODO Question: bcc must not be into header, only into SMTP command "RCPT TO". Does php mail support this ?
1004 1004
 
1005
-		// Delivery receipt
1006
-		if (isset($this->deliveryreceipt) && $this->deliveryreceipt == 1) $out.= "Disposition-Notification-To: ".$this->getValidAddress($this->addr_from,2).$this->eol2;
1005
+        // Delivery receipt
1006
+        if (isset($this->deliveryreceipt) && $this->deliveryreceipt == 1) $out.= "Disposition-Notification-To: ".$this->getValidAddress($this->addr_from,2).$this->eol2;
1007 1007
 
1008
-		//$out.= "X-Priority: 3".$this->eol2;
1008
+        //$out.= "X-Priority: 3".$this->eol2;
1009 1009
 
1010
-		$out.= 'Date: ' . date("r") . $this->eol2;
1010
+        $out.= 'Date: ' . date("r") . $this->eol2;
1011 1011
 
1012
-		$trackid = $this->trackid;
1013
-		if ($trackid)
1014
-		{
1015
-			// References is kept in response and Message-ID is returned into In-Reply-To:
1016
-			$out.= 'Message-ID: <' . time() . '.phpmail-dolibarr-'. $trackid . '@' . $host . ">" . $this->eol2;	// Uppercase seems replaced by phpmail
1017
-			$out.= 'References: <' . time() . '.phpmail-dolibarr-'. $trackid . '@' . $host . ">" . $this->eol2;
1018
-			$out.= 'X-Dolibarr-TRACKID: ' . $trackid . '@' . $host. $this->eol2;
1019
-		}
1020
-		else
1021
-		{
1022
-			$out.= 'Message-ID: <' . time() . '.phpmail@' . $host . ">" . $this->eol2;
1023
-		}
1012
+        $trackid = $this->trackid;
1013
+        if ($trackid)
1014
+        {
1015
+            // References is kept in response and Message-ID is returned into In-Reply-To:
1016
+            $out.= 'Message-ID: <' . time() . '.phpmail-dolibarr-'. $trackid . '@' . $host . ">" . $this->eol2;	// Uppercase seems replaced by phpmail
1017
+            $out.= 'References: <' . time() . '.phpmail-dolibarr-'. $trackid . '@' . $host . ">" . $this->eol2;
1018
+            $out.= 'X-Dolibarr-TRACKID: ' . $trackid . '@' . $host. $this->eol2;
1019
+        }
1020
+        else
1021
+        {
1022
+            $out.= 'Message-ID: <' . time() . '.phpmail@' . $host . ">" . $this->eol2;
1023
+        }
1024 1024
 
1025
-		if (! empty($_SERVER['REMOTE_ADDR'])) $out.= "X-RemoteAddr: " . $_SERVER['REMOTE_ADDR']. $this->eol2;
1026
-		$out.= "X-Mailer: Dolibarr version " . DOL_VERSION ." (using php mail)".$this->eol2;
1027
-		$out.= "Mime-Version: 1.0".$this->eol2;
1025
+        if (! empty($_SERVER['REMOTE_ADDR'])) $out.= "X-RemoteAddr: " . $_SERVER['REMOTE_ADDR']. $this->eol2;
1026
+        $out.= "X-Mailer: Dolibarr version " . DOL_VERSION ." (using php mail)".$this->eol2;
1027
+        $out.= "Mime-Version: 1.0".$this->eol2;
1028 1028
 
1029
-		//$out.= "From: ".$this->getValidAddress($this->addr_from,3,1).$this->eol;
1029
+        //$out.= "From: ".$this->getValidAddress($this->addr_from,3,1).$this->eol;
1030 1030
 
1031
-		$out.= "Content-Type: multipart/mixed;".$this->eol2." boundary=\"".$this->mixed_boundary."\"".$this->eol2;
1032
-		$out.= "Content-Transfer-Encoding: 8bit".$this->eol2;		// TODO Seems to be ignored. Header is 7bit once received.
1031
+        $out.= "Content-Type: multipart/mixed;".$this->eol2." boundary=\"".$this->mixed_boundary."\"".$this->eol2;
1032
+        $out.= "Content-Transfer-Encoding: 8bit".$this->eol2;		// TODO Seems to be ignored. Header is 7bit once received.
1033 1033
 
1034
-		dol_syslog("CMailFile::write_smtpheaders smtp_header=\n".$out);
1035
-		return $out;
1036
-	}
1034
+        dol_syslog("CMailFile::write_smtpheaders smtp_header=\n".$out);
1035
+        return $out;
1036
+    }
1037 1037
 
1038 1038
 
1039 1039
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
1040
-	/**
1041
-	 * Create header MIME (mode = 'mail')
1042
-	 *
1043
-	 * @param	array	$filename_list			Array of filenames
1044
-	 * @param 	array	$mimefilename_list		Array of mime types
1045
-	 * @return	string							mime headers
1046
-	 */
1047
-	function write_mimeheaders($filename_list, $mimefilename_list)
1048
-	{
1040
+    /**
1041
+     * Create header MIME (mode = 'mail')
1042
+     *
1043
+     * @param	array	$filename_list			Array of filenames
1044
+     * @param 	array	$mimefilename_list		Array of mime types
1045
+     * @return	string							mime headers
1046
+     */
1047
+    function write_mimeheaders($filename_list, $mimefilename_list)
1048
+    {
1049 1049
         // phpcs:enable
1050
-		$mimedone=0;
1051
-		$out = "";
1052
-
1053
-		if (is_array($filename_list))
1054
-		{
1055
-			$filename_list_size=count($filename_list);
1056
-			for($i=0;$i < $filename_list_size;$i++)
1057
-			{
1058
-				if ($filename_list[$i])
1059
-				{
1060
-					if ($mimefilename_list[$i]) $filename_list[$i] = $mimefilename_list[$i];
1061
-					$out.= "X-attachments: $filename_list[$i]".$this->eol2;
1062
-				}
1063
-			}
1064
-		}
1065
-
1066
-		dol_syslog("CMailFile::write_mimeheaders mime_header=\n".$out, LOG_DEBUG);
1067
-		return $out;
1068
-	}
1050
+        $mimedone=0;
1051
+        $out = "";
1052
+
1053
+        if (is_array($filename_list))
1054
+        {
1055
+            $filename_list_size=count($filename_list);
1056
+            for($i=0;$i < $filename_list_size;$i++)
1057
+            {
1058
+                if ($filename_list[$i])
1059
+                {
1060
+                    if ($mimefilename_list[$i]) $filename_list[$i] = $mimefilename_list[$i];
1061
+                    $out.= "X-attachments: $filename_list[$i]".$this->eol2;
1062
+                }
1063
+            }
1064
+        }
1069 1065
 
1070
-    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
1071
-	/**
1072
-	 * Return email content (mode = 'mail')
1073
-	 *
1074
-	 * @param	string		$msgtext		Message string
1075
-	 * @return	string						String content
1076
-	 */
1077
-	function write_body($msgtext)
1078
-	{
1079
-        // phpcs:enable
1080
-		global $conf;
1081
-
1082
-		$out='';
1083
-
1084
-		$out.= "--" . $this->mixed_boundary . $this->eol;
1085
-
1086
-		if ($this->atleastoneimage)
1087
-		{
1088
-			$out.= "Content-Type: multipart/alternative;".$this->eol." boundary=\"".$this->alternative_boundary."\"".$this->eol;
1089
-			$out.= $this->eol;
1090
-			$out.= "--" . $this->alternative_boundary . $this->eol;
1091
-		}
1092
-
1093
-		// Make RFC821 Compliant, replace bare linefeeds
1094
-		$strContent = preg_replace("/(?<!\r)\n/si", "\r\n", $msgtext);	// PCRE modifier /s means new lines are common chars
1095
-		if (! empty($conf->global->MAIN_FIX_FOR_BUGGED_MTA))
1096
-		{
1097
-			$strContent = preg_replace("/\r\n/si", "\n", $strContent);	// PCRE modifier /s means new lines are common chars
1098
-		}
1099
-
1100
-		$strContentAltText = '';
1101
-		if ($this->msgishtml)
1102
-		{
1103
-			// Similar code to forge a text from html is also in CMailFile.class.php
1104
-			$strContentAltText = preg_replace("/<br\s*[^>]*>/"," ", $strContent);
1105
-			$strContentAltText = html_entity_decode(strip_tags($strContentAltText));
1106
-			$strContentAltText = rtrim(wordwrap($strContentAltText, 75, empty($conf->global->MAIN_FIX_FOR_BUGGED_MTA)?"\r\n":"\n"));
1107
-
1108
-			// Check if html header already in message, if not complete the message
1109
-			$strContent = $this->checkIfHTML($strContent);
1110
-		}
1111
-
1112
-		// Make RFC2045 Compliant, split lines
1113
-		//$strContent = rtrim(chunk_split($strContent));    // Function chunck_split seems ko if not used on a base64 content
1114
-		// TODO Encode main content into base64 and use the chunk_split, or quoted-printable
1115
-		$strContent = rtrim(wordwrap($strContent, 75, empty($conf->global->MAIN_FIX_FOR_BUGGED_MTA)?"\r\n":"\n"));   // TODO Using this method creates unexpected line break on text/plain content.
1116
-
1117
-		if ($this->msgishtml)
1118
-		{
1119
-			if ($this->atleastoneimage)
1120
-			{
1121
-				$out.= "Content-Type: text/plain; charset=".$conf->file->character_set_client.$this->eol;
1122
-				//$out.= "Content-Transfer-Encoding: 7bit".$this->eol;
1123
-				$out.= $this->eol.($strContentAltText?$strContentAltText:strip_tags($strContent)).$this->eol; // Add plain text message
1124
-				$out.= "--" . $this->alternative_boundary . $this->eol;
1125
-				$out.= "Content-Type: multipart/related;".$this->eol." boundary=\"".$this->related_boundary."\"".$this->eol;
1126
-				$out.= $this->eol;
1127
-				$out.= "--" . $this->related_boundary . $this->eol;
1128
-			}
1129
-
1130
-			if (! $this->atleastoneimage && $strContentAltText && ! empty($conf->global->MAIN_MAIL_USE_MULTI_PART))    // Add plain text message part before html part
1131
-			{
1132
-				$out.= "Content-Type: multipart/alternative;".$this->eol." boundary=\"".$this->alternative_boundary."\"".$this->eol;
1133
-				$out.= $this->eol;
1134
-				$out.= "--" . $this->alternative_boundary . $this->eol;
1135
-				$out.= "Content-Type: text/plain; charset=".$conf->file->character_set_client.$this->eol;
1136
-				//$out.= "Content-Transfer-Encoding: 7bit".$this->eol;
1137
-				$out.= $this->eol.$strContentAltText.$this->eol;
1138
-				$out.= "--" . $this->alternative_boundary . $this->eol;
1139
-			}
1140
-
1141
-			$out.= "Content-Type: text/html; charset=".$conf->file->character_set_client.$this->eol;
1142
-			//$out.= "Content-Transfer-Encoding: 7bit".$this->eol;	// TODO Use base64
1143
-			$out.= $this->eol.$strContent.$this->eol;
1144
-
1145
-			if (! $this->atleastoneimage && $strContentAltText && ! empty($conf->global->MAIN_MAIL_USE_MULTI_PART))    // Add plain text message part after html part
1146
-			{
1147
-				$out.= "--" . $this->alternative_boundary . "--". $this->eol;
1148
-			}
1149
-		}
1150
-		else
1151
-		{
1152
-			$out.= "Content-Type: text/plain; charset=".$conf->file->character_set_client.$this->eol;
1153
-			//$out.= "Content-Transfer-Encoding: 7bit".$this->eol;
1154
-			$out.= $this->eol.$strContent.$this->eol;
1155
-		}
1156
-
1157
-		$out.= $this->eol;
1158
-
1159
-		// Encode images
1160
-		if ($this->atleastoneimage)
1161
-		{
1162
-			$out .= $this->write_images($this->images_encoded);
1163
-			// always end related and end alternative after inline images
1164
-			$out .= "--" . $this->related_boundary . "--" . $this->eol;
1165
-			$out .= $this->eol . "--" . $this->alternative_boundary . "--" . $this->eol;
1166
-			$out .= $this->eol;
1167
-		}
1168
-
1169
-		return $out;
1170
-	}
1066
+        dol_syslog("CMailFile::write_mimeheaders mime_header=\n".$out, LOG_DEBUG);
1067
+        return $out;
1068
+    }
1171 1069
 
1172 1070
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
1173
-	/**
1174
-	 * Attach file to email (mode = 'mail')
1175
-	 *
1176
-	 * @param	array	$filename_list		Tableau
1177
-	 * @param	array	$mimetype_list		Tableau
1178
-	 * @param 	array	$mimefilename_list	Tableau
1179
-	 * @return	string						Chaine fichiers encodes
1180
-	 */
1181
-	function write_files($filename_list,$mimetype_list,$mimefilename_list)
1182
-	{
1071
+    /**
1072
+     * Return email content (mode = 'mail')
1073
+     *
1074
+     * @param	string		$msgtext		Message string
1075
+     * @return	string						String content
1076
+     */
1077
+    function write_body($msgtext)
1078
+    {
1183 1079
         // phpcs:enable
1184
-		$out = '';
1185
-
1186
-		$filename_list_size=count($filename_list);
1187
-		for($i=0;$i < $filename_list_size;$i++)
1188
-		{
1189
-			if ($filename_list[$i])
1190
-			{
1191
-				dol_syslog("CMailFile::write_files: i=$i");
1192
-				$encoded = $this->_encode_file($filename_list[$i]);
1193
-				if ($encoded >= 0)
1194
-				{
1195
-					if ($mimefilename_list[$i]) $filename_list[$i] = $mimefilename_list[$i];
1196
-					if (! $mimetype_list[$i]) {
1197
-						$mimetype_list[$i] = "application/octet-stream";
1198
-					}
1199
-
1200
-					$out.= "--" . $this->mixed_boundary . $this->eol;
1201
-					$out.= "Content-Disposition: attachment; filename=\"".$filename_list[$i]."\"".$this->eol;
1202
-					$out.= "Content-Type: " . $mimetype_list[$i] . "; name=\"".$filename_list[$i]."\"".$this->eol;
1203
-					$out.= "Content-Transfer-Encoding: base64".$this->eol;
1204
-					$out.= "Content-Description: ".$filename_list[$i].$this->eol;
1205
-					$out.= $this->eol;
1206
-					$out.= $encoded;
1207
-					$out.= $this->eol;
1208
-					//$out.= $this->eol;
1209
-				}
1210
-				else
1211
-				{
1212
-					return $encoded;
1213
-				}
1214
-			}
1215
-		}
1216
-
1217
-		return $out;
1218
-	}
1080
+        global $conf;
1081
+
1082
+        $out='';
1083
+
1084
+        $out.= "--" . $this->mixed_boundary . $this->eol;
1085
+
1086
+        if ($this->atleastoneimage)
1087
+        {
1088
+            $out.= "Content-Type: multipart/alternative;".$this->eol." boundary=\"".$this->alternative_boundary."\"".$this->eol;
1089
+            $out.= $this->eol;
1090
+            $out.= "--" . $this->alternative_boundary . $this->eol;
1091
+        }
1092
+
1093
+        // Make RFC821 Compliant, replace bare linefeeds
1094
+        $strContent = preg_replace("/(?<!\r)\n/si", "\r\n", $msgtext);	// PCRE modifier /s means new lines are common chars
1095
+        if (! empty($conf->global->MAIN_FIX_FOR_BUGGED_MTA))
1096
+        {
1097
+            $strContent = preg_replace("/\r\n/si", "\n", $strContent);	// PCRE modifier /s means new lines are common chars
1098
+        }
1099
+
1100
+        $strContentAltText = '';
1101
+        if ($this->msgishtml)
1102
+        {
1103
+            // Similar code to forge a text from html is also in CMailFile.class.php
1104
+            $strContentAltText = preg_replace("/<br\s*[^>]*>/"," ", $strContent);
1105
+            $strContentAltText = html_entity_decode(strip_tags($strContentAltText));
1106
+            $strContentAltText = rtrim(wordwrap($strContentAltText, 75, empty($conf->global->MAIN_FIX_FOR_BUGGED_MTA)?"\r\n":"\n"));
1107
+
1108
+            // Check if html header already in message, if not complete the message
1109
+            $strContent = $this->checkIfHTML($strContent);
1110
+        }
1111
+
1112
+        // Make RFC2045 Compliant, split lines
1113
+        //$strContent = rtrim(chunk_split($strContent));    // Function chunck_split seems ko if not used on a base64 content
1114
+        // TODO Encode main content into base64 and use the chunk_split, or quoted-printable
1115
+        $strContent = rtrim(wordwrap($strContent, 75, empty($conf->global->MAIN_FIX_FOR_BUGGED_MTA)?"\r\n":"\n"));   // TODO Using this method creates unexpected line break on text/plain content.
1116
+
1117
+        if ($this->msgishtml)
1118
+        {
1119
+            if ($this->atleastoneimage)
1120
+            {
1121
+                $out.= "Content-Type: text/plain; charset=".$conf->file->character_set_client.$this->eol;
1122
+                //$out.= "Content-Transfer-Encoding: 7bit".$this->eol;
1123
+                $out.= $this->eol.($strContentAltText?$strContentAltText:strip_tags($strContent)).$this->eol; // Add plain text message
1124
+                $out.= "--" . $this->alternative_boundary . $this->eol;
1125
+                $out.= "Content-Type: multipart/related;".$this->eol." boundary=\"".$this->related_boundary."\"".$this->eol;
1126
+                $out.= $this->eol;
1127
+                $out.= "--" . $this->related_boundary . $this->eol;
1128
+            }
1129
+
1130
+            if (! $this->atleastoneimage && $strContentAltText && ! empty($conf->global->MAIN_MAIL_USE_MULTI_PART))    // Add plain text message part before html part
1131
+            {
1132
+                $out.= "Content-Type: multipart/alternative;".$this->eol." boundary=\"".$this->alternative_boundary."\"".$this->eol;
1133
+                $out.= $this->eol;
1134
+                $out.= "--" . $this->alternative_boundary . $this->eol;
1135
+                $out.= "Content-Type: text/plain; charset=".$conf->file->character_set_client.$this->eol;
1136
+                //$out.= "Content-Transfer-Encoding: 7bit".$this->eol;
1137
+                $out.= $this->eol.$strContentAltText.$this->eol;
1138
+                $out.= "--" . $this->alternative_boundary . $this->eol;
1139
+            }
1140
+
1141
+            $out.= "Content-Type: text/html; charset=".$conf->file->character_set_client.$this->eol;
1142
+            //$out.= "Content-Transfer-Encoding: 7bit".$this->eol;	// TODO Use base64
1143
+            $out.= $this->eol.$strContent.$this->eol;
1219 1144
 
1145
+            if (! $this->atleastoneimage && $strContentAltText && ! empty($conf->global->MAIN_MAIL_USE_MULTI_PART))    // Add plain text message part after html part
1146
+            {
1147
+                $out.= "--" . $this->alternative_boundary . "--". $this->eol;
1148
+            }
1149
+        }
1150
+        else
1151
+        {
1152
+            $out.= "Content-Type: text/plain; charset=".$conf->file->character_set_client.$this->eol;
1153
+            //$out.= "Content-Transfer-Encoding: 7bit".$this->eol;
1154
+            $out.= $this->eol.$strContent.$this->eol;
1155
+        }
1156
+
1157
+        $out.= $this->eol;
1158
+
1159
+        // Encode images
1160
+        if ($this->atleastoneimage)
1161
+        {
1162
+            $out .= $this->write_images($this->images_encoded);
1163
+            // always end related and end alternative after inline images
1164
+            $out .= "--" . $this->related_boundary . "--" . $this->eol;
1165
+            $out .= $this->eol . "--" . $this->alternative_boundary . "--" . $this->eol;
1166
+            $out .= $this->eol;
1167
+        }
1168
+
1169
+        return $out;
1170
+    }
1220 1171
 
1221 1172
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
1222
-	/**
1223
-	 * Attach an image to email (mode = 'mail')
1224
-	 *
1225
-	 * @param	array	$images_list	Array of array image
1226
-	 * @return	string					Chaine images encodees
1227
-	 */
1228
-	function write_images($images_list)
1229
-	{
1173
+    /**
1174
+     * Attach file to email (mode = 'mail')
1175
+     *
1176
+     * @param	array	$filename_list		Tableau
1177
+     * @param	array	$mimetype_list		Tableau
1178
+     * @param 	array	$mimefilename_list	Tableau
1179
+     * @return	string						Chaine fichiers encodes
1180
+     */
1181
+    function write_files($filename_list,$mimetype_list,$mimefilename_list)
1182
+    {
1230 1183
         // phpcs:enable
1231
-		$out = '';
1184
+        $out = '';
1185
+
1186
+        $filename_list_size=count($filename_list);
1187
+        for($i=0;$i < $filename_list_size;$i++)
1188
+        {
1189
+            if ($filename_list[$i])
1190
+            {
1191
+                dol_syslog("CMailFile::write_files: i=$i");
1192
+                $encoded = $this->_encode_file($filename_list[$i]);
1193
+                if ($encoded >= 0)
1194
+                {
1195
+                    if ($mimefilename_list[$i]) $filename_list[$i] = $mimefilename_list[$i];
1196
+                    if (! $mimetype_list[$i]) {
1197
+                        $mimetype_list[$i] = "application/octet-stream";
1198
+                    }
1199
+
1200
+                    $out.= "--" . $this->mixed_boundary . $this->eol;
1201
+                    $out.= "Content-Disposition: attachment; filename=\"".$filename_list[$i]."\"".$this->eol;
1202
+                    $out.= "Content-Type: " . $mimetype_list[$i] . "; name=\"".$filename_list[$i]."\"".$this->eol;
1203
+                    $out.= "Content-Transfer-Encoding: base64".$this->eol;
1204
+                    $out.= "Content-Description: ".$filename_list[$i].$this->eol;
1205
+                    $out.= $this->eol;
1206
+                    $out.= $encoded;
1207
+                    $out.= $this->eol;
1208
+                    //$out.= $this->eol;
1209
+                }
1210
+                else
1211
+                {
1212
+                    return $encoded;
1213
+                }
1214
+            }
1215
+        }
1232 1216
 
1233
-		if (is_array($images_list))
1234
-		{
1235
-			foreach ($images_list as $img)
1236
-			{
1237
-				dol_syslog("CMailFile::write_images: ".$img["name"]);
1217
+        return $out;
1218
+    }
1238 1219
 
1239
-				$out.= "--" . $this->related_boundary . $this->eol; // always related for an inline image
1240
-				$out.= "Content-Type: " . $img["content_type"] . "; name=\"".$img["name"]."\"".$this->eol;
1241
-				$out.= "Content-Transfer-Encoding: base64".$this->eol;
1242
-				$out.= "Content-Disposition: inline; filename=\"".$img["name"]."\"".$this->eol;
1243
-				$out.= "Content-ID: <".$img["cid"].">".$this->eol;
1244
-				$out.= $this->eol;
1245
-				$out.= $img["image_encoded"];
1246
-				$out.= $this->eol;
1247
-			}
1248
-		}
1249 1220
 
1250
-		return $out;
1251
-	}
1221
+    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
1222
+    /**
1223
+     * Attach an image to email (mode = 'mail')
1224
+     *
1225
+     * @param	array	$images_list	Array of array image
1226
+     * @return	string					Chaine images encodees
1227
+     */
1228
+    function write_images($images_list)
1229
+    {
1230
+        // phpcs:enable
1231
+        $out = '';
1232
+
1233
+        if (is_array($images_list))
1234
+        {
1235
+            foreach ($images_list as $img)
1236
+            {
1237
+                dol_syslog("CMailFile::write_images: ".$img["name"]);
1238
+
1239
+                $out.= "--" . $this->related_boundary . $this->eol; // always related for an inline image
1240
+                $out.= "Content-Type: " . $img["content_type"] . "; name=\"".$img["name"]."\"".$this->eol;
1241
+                $out.= "Content-Transfer-Encoding: base64".$this->eol;
1242
+                $out.= "Content-Disposition: inline; filename=\"".$img["name"]."\"".$this->eol;
1243
+                $out.= "Content-ID: <".$img["cid"].">".$this->eol;
1244
+                $out.= $this->eol;
1245
+                $out.= $img["image_encoded"];
1246
+                $out.= $this->eol;
1247
+            }
1248
+        }
1249
+
1250
+        return $out;
1251
+    }
1252 1252
 
1253 1253
 
1254 1254
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
1255
-	/**
1256
-	 * Try to create a socket connection
1257
-	 *
1258
-	 * @param 	string		$host		Add ssl:// for SSL/TLS.
1259
-	 * @param 	int			$port		Example: 25, 465
1260
-	 * @return	int						Socket id if ok, 0 if KO
1261
-	 */
1262
-	function check_server_port($host,$port)
1263
-	{
1255
+    /**
1256
+     * Try to create a socket connection
1257
+     *
1258
+     * @param 	string		$host		Add ssl:// for SSL/TLS.
1259
+     * @param 	int			$port		Example: 25, 465
1260
+     * @return	int						Socket id if ok, 0 if KO
1261
+     */
1262
+    function check_server_port($host,$port)
1263
+    {
1264 1264
         // phpcs:enable
1265
-		global $conf;
1266
-
1267
-		$_retVal=0;
1268
-		$timeout=5;	// Timeout in seconds
1269
-
1270
-		if (function_exists('fsockopen'))
1271
-		{
1272
-			$keyforsmtpserver='MAIN_MAIL_SMTP_SERVER';
1273
-			$keyforsmtpport  ='MAIN_MAIL_SMTP_PORT';
1274
-			$keyforsmtpid    ='MAIN_MAIL_SMTPS_ID';
1275
-			$keyforsmtppw    ='MAIN_MAIL_SMTPS_PW';
1276
-			$keyfortls       ='MAIN_MAIL_EMAIL_TLS';
1277
-			$keyforstarttls  ='MAIN_MAIL_EMAIL_STARTTLS';
1278
-			if ($this->sendcontext == 'emailing' && !empty($conf->global->MAIN_MAIL_SENDMODE_EMAILING) && $conf->global->MAIN_MAIL_SENDMODE_EMAILING != 'default')
1279
-			{
1280
-				$keyforsmtpserver='MAIN_MAIL_SMTP_SERVER_EMAILING';
1281
-				$keyforsmtpport  ='MAIN_MAIL_SMTP_PORT_EMAILING';
1282
-				$keyforsmtpid    ='MAIN_MAIL_SMTPS_ID_EMAILING';
1283
-				$keyforsmtppw    ='MAIN_MAIL_SMTPS_PW_EMAILING';
1284
-				$keyfortls       ='MAIN_MAIL_EMAIL_TLS_EMAILING';
1285
-				$keyforstarttls  ='MAIN_MAIL_EMAIL_STARTTLS_EMAILING';
1286
-			}
1287
-
1288
-			// If we use SSL/TLS
1289
-			if (! empty($conf->global->$keyfortls) && function_exists('openssl_open')) $host='ssl://'.$host;
1290
-			// tls smtp start with no encryption
1291
-			//if (! empty($conf->global->MAIN_MAIL_EMAIL_STARTTLS) && function_exists('openssl_open')) $host='tls://'.$host;
1292
-
1293
-			dol_syslog("Try socket connection to host=".$host." port=".$port);
1294
-			//See if we can connect to the SMTP server
1295
-			if ($socket = @fsockopen(
1296
-					$host,       // Host to test, IP or domain. Add ssl:// for SSL/TLS.
1297
-					$port,       // which Port number to use
1298
-					$errno,      // actual system level error
1299
-					$errstr,     // and any text that goes with the error
1300
-					$timeout
1301
-			))  // timeout for reading/writing data over the socket
1302
-			{
1303
-				// Windows still does not have support for this timeout function
1304
-				if (function_exists('stream_set_timeout')) stream_set_timeout($socket, $timeout, 0);
1305
-
1306
-				dol_syslog("Now we wait for answer 220");
1307
-
1308
-				// Check response from Server
1309
-				if ( $_retVal = $this->server_parse($socket, "220") ) $_retVal = $socket;
1310
-			}
1311
-			else
1312
-			{
1313
-				$this->error = utf8_check('Error '.$errno.' - '.$errstr)?'Error '.$errno.' - '.$errstr:utf8_encode('Error '.$errno.' - '.$errstr);
1314
-			}
1315
-		}
1316
-		return $_retVal;
1317
-	}
1265
+        global $conf;
1266
+
1267
+        $_retVal=0;
1268
+        $timeout=5;	// Timeout in seconds
1269
+
1270
+        if (function_exists('fsockopen'))
1271
+        {
1272
+            $keyforsmtpserver='MAIN_MAIL_SMTP_SERVER';
1273
+            $keyforsmtpport  ='MAIN_MAIL_SMTP_PORT';
1274
+            $keyforsmtpid    ='MAIN_MAIL_SMTPS_ID';
1275
+            $keyforsmtppw    ='MAIN_MAIL_SMTPS_PW';
1276
+            $keyfortls       ='MAIN_MAIL_EMAIL_TLS';
1277
+            $keyforstarttls  ='MAIN_MAIL_EMAIL_STARTTLS';
1278
+            if ($this->sendcontext == 'emailing' && !empty($conf->global->MAIN_MAIL_SENDMODE_EMAILING) && $conf->global->MAIN_MAIL_SENDMODE_EMAILING != 'default')
1279
+            {
1280
+                $keyforsmtpserver='MAIN_MAIL_SMTP_SERVER_EMAILING';
1281
+                $keyforsmtpport  ='MAIN_MAIL_SMTP_PORT_EMAILING';
1282
+                $keyforsmtpid    ='MAIN_MAIL_SMTPS_ID_EMAILING';
1283
+                $keyforsmtppw    ='MAIN_MAIL_SMTPS_PW_EMAILING';
1284
+                $keyfortls       ='MAIN_MAIL_EMAIL_TLS_EMAILING';
1285
+                $keyforstarttls  ='MAIN_MAIL_EMAIL_STARTTLS_EMAILING';
1286
+            }
1287
+
1288
+            // If we use SSL/TLS
1289
+            if (! empty($conf->global->$keyfortls) && function_exists('openssl_open')) $host='ssl://'.$host;
1290
+            // tls smtp start with no encryption
1291
+            //if (! empty($conf->global->MAIN_MAIL_EMAIL_STARTTLS) && function_exists('openssl_open')) $host='tls://'.$host;
1292
+
1293
+            dol_syslog("Try socket connection to host=".$host." port=".$port);
1294
+            //See if we can connect to the SMTP server
1295
+            if ($socket = @fsockopen(
1296
+                    $host,       // Host to test, IP or domain. Add ssl:// for SSL/TLS.
1297
+                    $port,       // which Port number to use
1298
+                    $errno,      // actual system level error
1299
+                    $errstr,     // and any text that goes with the error
1300
+                    $timeout
1301
+            ))  // timeout for reading/writing data over the socket
1302
+            {
1303
+                // Windows still does not have support for this timeout function
1304
+                if (function_exists('stream_set_timeout')) stream_set_timeout($socket, $timeout, 0);
1305
+
1306
+                dol_syslog("Now we wait for answer 220");
1307
+
1308
+                // Check response from Server
1309
+                if ( $_retVal = $this->server_parse($socket, "220") ) $_retVal = $socket;
1310
+            }
1311
+            else
1312
+            {
1313
+                $this->error = utf8_check('Error '.$errno.' - '.$errstr)?'Error '.$errno.' - '.$errstr:utf8_encode('Error '.$errno.' - '.$errstr);
1314
+            }
1315
+        }
1316
+        return $_retVal;
1317
+    }
1318 1318
 
1319 1319
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
1320
-	/**
1321
-	 * This function has been modified as provided by SirSir to allow multiline responses when
1322
-	 * using SMTP Extensions.
1323
-	 *
1324
-	 * @param	Socket	$socket			Socket
1325
-	 * @param   string	$response		Response string
1326
-	 * @return  boolean					true if success
1327
-	 */
1328
-	function server_parse($socket, $response)
1329
-	{
1320
+    /**
1321
+     * This function has been modified as provided by SirSir to allow multiline responses when
1322
+     * using SMTP Extensions.
1323
+     *
1324
+     * @param	Socket	$socket			Socket
1325
+     * @param   string	$response		Response string
1326
+     * @return  boolean					true if success
1327
+     */
1328
+    function server_parse($socket, $response)
1329
+    {
1330 1330
         // phpcs:enable
1331
-		$_retVal = true;	// Indicates if Object was created or not
1332
-		$server_response = '';
1333
-
1334
-		while (substr($server_response,3,1) != ' ')
1335
-		{
1336
-			if (! ($server_response = fgets($socket, 256)) )
1337
-			{
1338
-				$this->error="Couldn't get mail server response codes";
1339
-				return false;
1340
-			}
1341
-		}
1342
-
1343
-		if( !( substr($server_response, 0, 3) == $response ) )
1344
-		{
1345
-			$this->error="Ran into problems sending Mail.\r\nResponse: $server_response";
1346
-			$_retVal = false;
1347
-		}
1348
-
1349
-		return $_retVal;
1350
-	}
1351
-
1352
-	/**
1353
-	 * Seearch images into html message and init array this->images_encoded if found
1354
-	 *
1355
-	 * @param	string	$images_dir		Location of physical images files
1356
-	 * @return	int 		        	>0 if OK, <0 if KO
1357
-	 */
1358
-	function findHtmlImages($images_dir)
1359
-	{
1360
-		// Build the list of image extensions
1361
-		$extensions = array_keys($this->image_types);
1362
-
1363
-		$matches = array();
1364
-		preg_match_all('/(?:"|\')([^"\']+\.('.implode('|', $extensions).'))(?:"|\')/Ui', $this->html, $matches);  // If "xxx.ext" or 'xxx.ext' found
1365
-
1366
-		if (! empty($matches))
1367
-		{
1368
-			$i=0;
1369
-			foreach ($matches[1] as $full)
1370
-			{
1371
-
1372
-				if (preg_match('/file=([A-Za-z0-9_\-\/]+[\.]?[A-Za-z0-9]+)?$/i',$full,$regs))   // If xxx is 'file=aaa'
1373
-				{
1374
-					$img = $regs[1];
1375
-
1376
-					if (file_exists($images_dir.'/'.$img))
1377
-					{
1378
-						// Image path in src
1379
-						$src = preg_quote($full,'/');
1380
-
1381
-						// Image full path
1382
-						$this->html_images[$i]["fullpath"] = $images_dir.'/'.$img;
1383
-
1384
-						// Image name
1385
-						$this->html_images[$i]["name"] = $img;
1386
-
1387
-						// Content type
1388
-						if (preg_match('/^.+\.(\w{3,4})$/', $img, $reg))
1389
-						{
1390
-							$ext=strtolower($reg[1]);
1391
-							$this->html_images[$i]["content_type"] = $this->image_types[$ext];
1392
-						}
1393
-
1394
-						// cid
1395
-						$this->html_images[$i]["cid"] = dol_hash(uniqid(time()), 3);	// Force md5 hash (does not contains special chars)
1396
-						$this->html = preg_replace("/src=\"$src\"|src='$src'/i", "src=\"cid:".$this->html_images[$i]["cid"]."\"", $this->html);
1397
-					}
1398
-					$i++;
1399
-				}
1400
-			}
1401
-
1402
-			if (!empty($this->html_images))
1403
-			{
1404
-				$inline = array();
1405
-
1406
-				$i=0;
1407
-
1408
-				foreach ($this->html_images as $img)
1409
-				{
1410
-					$fullpath = $images_dir.'/'.$img["name"];
1411
-
1412
-					// If duplicate images are embedded, they may show up as attachments, so remove them.
1413
-					if (!in_array($fullpath,$inline))
1414
-					{
1415
-						// Read image file
1416
-						if ($image = file_get_contents($fullpath))
1417
-						{
1418
-							// On garde que le nom de l'image
1419
-							preg_match('/([A-Za-z0-9_-]+[\.]?[A-Za-z0-9]+)?$/i',$img["name"],$regs);
1420
-							$imgName = $regs[1];
1421
-
1422
-							$this->images_encoded[$i]['name'] = $imgName;
1423
-							$this->images_encoded[$i]['fullpath'] = $fullpath;
1424
-							$this->images_encoded[$i]['content_type'] = $img["content_type"];
1425
-							$this->images_encoded[$i]['cid'] = $img["cid"];
1426
-							// Encodage de l'image
1427
-							$this->images_encoded[$i]["image_encoded"] = chunk_split(base64_encode($image), 68, $this->eol);
1428
-							$inline[] = $fullpath;
1429
-						}
1430
-					}
1431
-					$i++;
1432
-				}
1433
-			}
1434
-			else
1435
-			{
1436
-				return -1;
1437
-			}
1438
-
1439
-			return 1;
1440
-		}
1441
-		else
1442
-		{
1443
-			return 0;
1444
-		}
1445
-	}
1446
-
1447
-	/**
1448
-	 * Return a formatted address string for SMTP protocol
1449
-	 *
1450
-	 * @param	string		$address		     Example: 'John Doe <[email protected]>, Alan Smith <[email protected]>' or '[email protected], [email protected]'
1451
-	 * @param	int			$format			     0=auto, 1=emails with <>, 2=emails without <>, 3=auto + label between "
1452
-	 * @param	int			$encode			     0=No encode name, 1=Encode name to RFC2822
1453
-	 * @param   int         $maxnumberofemail    0=No limit. Otherwise, maximum number of emails returned ($address may contains several email separated with ','). Add '...' if there is more.
1454
-	 * @return	string						     If format 0: '<[email protected]>' or 'John Doe <[email protected]>' or '=?UTF-8?B?Sm9obiBEb2U=?= <[email protected]>'
1455
-	 * 										     If format 1: '<[email protected]>'
1456
-	 *										     If format 2: '[email protected]'
1457
-	 *										     If format 3: '<[email protected]>' or '"John Doe" <[email protected]>' or '"=?UTF-8?B?Sm9obiBEb2U=?=" <[email protected]>'
1458
-	 *                                           If format 4: 'John Doe' or '[email protected]' if no label exists
1459
-	 */
1460
-	static function getValidAddress($address,$format,$encode=0,$maxnumberofemail=0)
1461
-	{
1462
-		global $conf;
1463
-
1464
-		$ret='';
1465
-
1466
-		$arrayaddress=explode(',',$address);
1467
-
1468
-		// Boucle sur chaque composant de l'adresse
1469
-		$i=0;
1470
-		foreach($arrayaddress as $val)
1471
-		{
1472
-			if (preg_match('/^(.*)<(.*)>$/i',trim($val),$regs))
1473
-			{
1474
-				$name  = trim($regs[1]);
1475
-				$email = trim($regs[2]);
1476
-			}
1477
-			else
1478
-			{
1479
-				$name  = '';
1480
-				$email = trim($val);
1481
-			}
1482
-
1483
-			if ($email)
1484
-			{
1485
-				$i++;
1486
-
1487
-				$newemail='';
1488
-				if ($format == 4)
1489
-				{
1490
-					$newemail = $name?$name:$email;
1491
-				}
1492
-				if ($format == 2)
1493
-				{
1494
-					$newemail=$email;
1495
-				}
1496
-				if ($format == 1 || $format == 3)
1497
-				{
1498
-					$newemail='<'.$email.'>';
1499
-				}
1500
-				if ($format == 0 || $format == 3)
1501
-				{
1502
-					if (! empty($conf->global->MAIN_MAIL_NO_FULL_EMAIL)) $newemail='<'.$email.'>';
1503
-					elseif (! $name) $newemail='<'.$email.'>';
1504
-					else $newemail=($format==3?'"':'').($encode?self::encodetorfc2822($name):$name).($format==3?'"':'').' <'.$email.'>';
1505
-				}
1506
-
1507
-				$ret=($ret ? $ret.',' : '').$newemail;
1508
-
1509
-				// Stop if we have too much records
1510
-				if ($maxnumberofemail && $i >= $maxnumberofemail)
1511
-				{
1512
-					if (count($arrayaddress) > $maxnumberofemail) $ret.='...';
1513
-					break;
1514
-				}
1515
-			}
1516
-		}
1517
-
1518
-		return $ret;
1519
-	}
1520
-
1521
-	/**
1522
-	 * Return a formatted array of address string for SMTP protocol
1523
-	 *
1524
-	 * @param   string      $address        Example: 'John Doe <[email protected]>, Alan Smith <[email protected]>' or '[email protected], [email protected]'
1525
-	 * @return  array                       array of email => name
1526
-	 */
1527
-	function getArrayAddress($address)
1528
-	{
1529
-		global $conf;
1530
-
1531
-		$ret=array();
1532
-
1533
-		$arrayaddress=explode(',',$address);
1534
-
1535
-		// Boucle sur chaque composant de l'adresse
1536
-		foreach($arrayaddress as $val)
1537
-		{
1538
-			if (preg_match('/^(.*)<(.*)>$/i',trim($val),$regs))
1539
-			{
1540
-				$name  = trim($regs[1]);
1541
-				$email = trim($regs[2]);
1542
-			}
1543
-			else
1544
-			{
1545
-				$name  = null;
1546
-				$email = trim($val);
1547
-			}
1548
-
1549
-			$ret[$email]=empty($conf->global->MAIN_MAIL_NO_FULL_EMAIL)?$name:null;
1550
-		}
1551
-
1552
-		return $ret;
1553
-	}
1331
+        $_retVal = true;	// Indicates if Object was created or not
1332
+        $server_response = '';
1333
+
1334
+        while (substr($server_response,3,1) != ' ')
1335
+        {
1336
+            if (! ($server_response = fgets($socket, 256)) )
1337
+            {
1338
+                $this->error="Couldn't get mail server response codes";
1339
+                return false;
1340
+            }
1341
+        }
1342
+
1343
+        if( !( substr($server_response, 0, 3) == $response ) )
1344
+        {
1345
+            $this->error="Ran into problems sending Mail.\r\nResponse: $server_response";
1346
+            $_retVal = false;
1347
+        }
1348
+
1349
+        return $_retVal;
1350
+    }
1351
+
1352
+    /**
1353
+     * Seearch images into html message and init array this->images_encoded if found
1354
+     *
1355
+     * @param	string	$images_dir		Location of physical images files
1356
+     * @return	int 		        	>0 if OK, <0 if KO
1357
+     */
1358
+    function findHtmlImages($images_dir)
1359
+    {
1360
+        // Build the list of image extensions
1361
+        $extensions = array_keys($this->image_types);
1362
+
1363
+        $matches = array();
1364
+        preg_match_all('/(?:"|\')([^"\']+\.('.implode('|', $extensions).'))(?:"|\')/Ui', $this->html, $matches);  // If "xxx.ext" or 'xxx.ext' found
1365
+
1366
+        if (! empty($matches))
1367
+        {
1368
+            $i=0;
1369
+            foreach ($matches[1] as $full)
1370
+            {
1371
+
1372
+                if (preg_match('/file=([A-Za-z0-9_\-\/]+[\.]?[A-Za-z0-9]+)?$/i',$full,$regs))   // If xxx is 'file=aaa'
1373
+                {
1374
+                    $img = $regs[1];
1375
+
1376
+                    if (file_exists($images_dir.'/'.$img))
1377
+                    {
1378
+                        // Image path in src
1379
+                        $src = preg_quote($full,'/');
1380
+
1381
+                        // Image full path
1382
+                        $this->html_images[$i]["fullpath"] = $images_dir.'/'.$img;
1383
+
1384
+                        // Image name
1385
+                        $this->html_images[$i]["name"] = $img;
1386
+
1387
+                        // Content type
1388
+                        if (preg_match('/^.+\.(\w{3,4})$/', $img, $reg))
1389
+                        {
1390
+                            $ext=strtolower($reg[1]);
1391
+                            $this->html_images[$i]["content_type"] = $this->image_types[$ext];
1392
+                        }
1393
+
1394
+                        // cid
1395
+                        $this->html_images[$i]["cid"] = dol_hash(uniqid(time()), 3);	// Force md5 hash (does not contains special chars)
1396
+                        $this->html = preg_replace("/src=\"$src\"|src='$src'/i", "src=\"cid:".$this->html_images[$i]["cid"]."\"", $this->html);
1397
+                    }
1398
+                    $i++;
1399
+                }
1400
+            }
1401
+
1402
+            if (!empty($this->html_images))
1403
+            {
1404
+                $inline = array();
1405
+
1406
+                $i=0;
1407
+
1408
+                foreach ($this->html_images as $img)
1409
+                {
1410
+                    $fullpath = $images_dir.'/'.$img["name"];
1411
+
1412
+                    // If duplicate images are embedded, they may show up as attachments, so remove them.
1413
+                    if (!in_array($fullpath,$inline))
1414
+                    {
1415
+                        // Read image file
1416
+                        if ($image = file_get_contents($fullpath))
1417
+                        {
1418
+                            // On garde que le nom de l'image
1419
+                            preg_match('/([A-Za-z0-9_-]+[\.]?[A-Za-z0-9]+)?$/i',$img["name"],$regs);
1420
+                            $imgName = $regs[1];
1421
+
1422
+                            $this->images_encoded[$i]['name'] = $imgName;
1423
+                            $this->images_encoded[$i]['fullpath'] = $fullpath;
1424
+                            $this->images_encoded[$i]['content_type'] = $img["content_type"];
1425
+                            $this->images_encoded[$i]['cid'] = $img["cid"];
1426
+                            // Encodage de l'image
1427
+                            $this->images_encoded[$i]["image_encoded"] = chunk_split(base64_encode($image), 68, $this->eol);
1428
+                            $inline[] = $fullpath;
1429
+                        }
1430
+                    }
1431
+                    $i++;
1432
+                }
1433
+            }
1434
+            else
1435
+            {
1436
+                return -1;
1437
+            }
1438
+
1439
+            return 1;
1440
+        }
1441
+        else
1442
+        {
1443
+            return 0;
1444
+        }
1445
+    }
1446
+
1447
+    /**
1448
+     * Return a formatted address string for SMTP protocol
1449
+     *
1450
+     * @param	string		$address		     Example: 'John Doe <[email protected]>, Alan Smith <[email protected]>' or '[email protected], [email protected]'
1451
+     * @param	int			$format			     0=auto, 1=emails with <>, 2=emails without <>, 3=auto + label between "
1452
+     * @param	int			$encode			     0=No encode name, 1=Encode name to RFC2822
1453
+     * @param   int         $maxnumberofemail    0=No limit. Otherwise, maximum number of emails returned ($address may contains several email separated with ','). Add '...' if there is more.
1454
+     * @return	string						     If format 0: '<[email protected]>' or 'John Doe <[email protected]>' or '=?UTF-8?B?Sm9obiBEb2U=?= <[email protected]>'
1455
+     * 										     If format 1: '<[email protected]>'
1456
+     *										     If format 2: '[email protected]'
1457
+     *										     If format 3: '<[email protected]>' or '"John Doe" <[email protected]>' or '"=?UTF-8?B?Sm9obiBEb2U=?=" <[email protected]>'
1458
+     *                                           If format 4: 'John Doe' or '[email protected]' if no label exists
1459
+     */
1460
+    static function getValidAddress($address,$format,$encode=0,$maxnumberofemail=0)
1461
+    {
1462
+        global $conf;
1463
+
1464
+        $ret='';
1465
+
1466
+        $arrayaddress=explode(',',$address);
1467
+
1468
+        // Boucle sur chaque composant de l'adresse
1469
+        $i=0;
1470
+        foreach($arrayaddress as $val)
1471
+        {
1472
+            if (preg_match('/^(.*)<(.*)>$/i',trim($val),$regs))
1473
+            {
1474
+                $name  = trim($regs[1]);
1475
+                $email = trim($regs[2]);
1476
+            }
1477
+            else
1478
+            {
1479
+                $name  = '';
1480
+                $email = trim($val);
1481
+            }
1482
+
1483
+            if ($email)
1484
+            {
1485
+                $i++;
1486
+
1487
+                $newemail='';
1488
+                if ($format == 4)
1489
+                {
1490
+                    $newemail = $name?$name:$email;
1491
+                }
1492
+                if ($format == 2)
1493
+                {
1494
+                    $newemail=$email;
1495
+                }
1496
+                if ($format == 1 || $format == 3)
1497
+                {
1498
+                    $newemail='<'.$email.'>';
1499
+                }
1500
+                if ($format == 0 || $format == 3)
1501
+                {
1502
+                    if (! empty($conf->global->MAIN_MAIL_NO_FULL_EMAIL)) $newemail='<'.$email.'>';
1503
+                    elseif (! $name) $newemail='<'.$email.'>';
1504
+                    else $newemail=($format==3?'"':'').($encode?self::encodetorfc2822($name):$name).($format==3?'"':'').' <'.$email.'>';
1505
+                }
1506
+
1507
+                $ret=($ret ? $ret.',' : '').$newemail;
1508
+
1509
+                // Stop if we have too much records
1510
+                if ($maxnumberofemail && $i >= $maxnumberofemail)
1511
+                {
1512
+                    if (count($arrayaddress) > $maxnumberofemail) $ret.='...';
1513
+                    break;
1514
+                }
1515
+            }
1516
+        }
1517
+
1518
+        return $ret;
1519
+    }
1520
+
1521
+    /**
1522
+     * Return a formatted array of address string for SMTP protocol
1523
+     *
1524
+     * @param   string      $address        Example: 'John Doe <[email protected]>, Alan Smith <[email protected]>' or '[email protected], [email protected]'
1525
+     * @return  array                       array of email => name
1526
+     */
1527
+    function getArrayAddress($address)
1528
+    {
1529
+        global $conf;
1530
+
1531
+        $ret=array();
1532
+
1533
+        $arrayaddress=explode(',',$address);
1534
+
1535
+        // Boucle sur chaque composant de l'adresse
1536
+        foreach($arrayaddress as $val)
1537
+        {
1538
+            if (preg_match('/^(.*)<(.*)>$/i',trim($val),$regs))
1539
+            {
1540
+                $name  = trim($regs[1]);
1541
+                $email = trim($regs[2]);
1542
+            }
1543
+            else
1544
+            {
1545
+                $name  = null;
1546
+                $email = trim($val);
1547
+            }
1548
+
1549
+            $ret[$email]=empty($conf->global->MAIN_MAIL_NO_FULL_EMAIL)?$name:null;
1550
+        }
1551
+
1552
+        return $ret;
1553
+    }
1554 1554
 }
Please login to merge, or discard this patch.
Spacing   +329 added lines, -329 removed lines patch added patch discarded remove patch
@@ -40,13 +40,13 @@  discard block
 block discarded – undo
40 40
 	public $sendmode;
41 41
 	public $sendsetup;
42 42
 
43
-	var $subject;      	// Topic:       Subject of email
44
-	var $addr_from;    	// From:		Label and EMail of sender (must include '<>'). For example '<[email protected]>' or 'John Doe <[email protected]>' or '<[email protected]>'). Note that with gmail smtps, value here is forced by google to account (but not the reply-to).
43
+	var $subject; // Topic:       Subject of email
44
+	var $addr_from; // From:		Label and EMail of sender (must include '<>'). For example '<[email protected]>' or 'John Doe <[email protected]>' or '<[email protected]>'). Note that with gmail smtps, value here is forced by google to account (but not the reply-to).
45 45
 	// Sender:      Who send the email ("Sender" has sent emails on behalf of "From").
46 46
 	//              Use it when the "From" is an email of a domain that is a SPF protected domain, and sending smtp server is not this domain. In such case, add Sender field with an email of the protected domain.
47 47
 	// Return-Path: Email where to send bounds.
48
-	var $reply_to;		// Reply-To:	Email where to send replies from mailer software (mailer use From if reply-to not defined, Gmail use gmail account if reply-to not defined)
49
-	var $errors_to;		// Errors-To:	Email where to send errors.
48
+	var $reply_to; // Reply-To:	Email where to send replies from mailer software (mailer use From if reply-to not defined, Gmail use gmail account if reply-to not defined)
49
+	var $errors_to; // Errors-To:	Email where to send errors.
50 50
 	var $addr_to;
51 51
 	var $addr_cc;
52 52
 	var $addr_bcc;
@@ -63,10 +63,10 @@  discard block
 block discarded – undo
63 63
 	/**
64 64
 	 * @var string Error code (or message)
65 65
 	 */
66
-	public $error='';
66
+	public $error = '';
67 67
 
68
-	var $smtps;			// Contains SMTPs object (if this method is used)
69
-	var $phpmailer;		// Contains PHPMailer object (if this method is used)
68
+	var $smtps; // Contains SMTPs object (if this method is used)
69
+	var $phpmailer; // Contains PHPMailer object (if this method is used)
70 70
 
71 71
 	/**
72 72
 	 * @var string CSS
@@ -83,9 +83,9 @@  discard block
 block discarded – undo
83 83
 	// Image
84 84
 	var $html;
85 85
 	var $image_boundary;
86
-	var $atleastoneimage=0;    // at least one image file with file=xxx.ext into content (TODO Debug this. How can this case be tested. Remove if not used).
87
-	var $html_images=array();
88
-	var $images_encoded=array();
86
+	var $atleastoneimage = 0; // at least one image file with file=xxx.ext into content (TODO Debug this. How can this case be tested. Remove if not used).
87
+	var $html_images = array();
88
+	var $images_encoded = array();
89 89
 	var $image_types = array(
90 90
         'gif'  => 'image/gif',
91 91
 		'jpg'  => 'image/jpeg',
@@ -119,13 +119,13 @@  discard block
 block discarded – undo
119 119
 	 *  @param  string  $sendcontext      	 'standard', 'emailing', ... (used to define with sending mode and parameters to use)
120 120
 	 *  @param	string	$replyto			 Reply-to email (will be set to same value than From by default if not provided)
121 121
 	 */
122
-	function __construct($subject, $to, $from, $msg, $filename_list=array(), $mimetype_list=array(), $mimefilename_list=array(), $addr_cc="", $addr_bcc="", $deliveryreceipt=0, $msgishtml=0, $errors_to='', $css='', $trackid='', $moreinheader='', $sendcontext='standard', $replyto='')
122
+	function __construct($subject, $to, $from, $msg, $filename_list = array(), $mimetype_list = array(), $mimefilename_list = array(), $addr_cc = "", $addr_bcc = "", $deliveryreceipt = 0, $msgishtml = 0, $errors_to = '', $css = '', $trackid = '', $moreinheader = '', $sendcontext = 'standard', $replyto = '')
123 123
 	{
124 124
 		global $conf, $dolibarr_main_data_root;
125 125
 
126 126
 		$this->sendcontext = $sendcontext;
127 127
 
128
-		if (empty($replyto)) $replyto=$from;
128
+		if (empty($replyto)) $replyto = $from;
129 129
 
130 130
 		// Define this->sendmode
131 131
 		$this->sendmode = '';
@@ -133,28 +133,28 @@  discard block
 block discarded – undo
133 133
 		{
134 134
 			$this->sendmode = $conf->global->MAIN_MAIL_SENDMODE_EMAILING;
135 135
 		}
136
-		if (empty($this->sendmode)) $this->sendmode=$conf->global->MAIN_MAIL_SENDMODE;
137
-		if (empty($this->sendmode)) $this->sendmode='mail';
136
+		if (empty($this->sendmode)) $this->sendmode = $conf->global->MAIN_MAIL_SENDMODE;
137
+		if (empty($this->sendmode)) $this->sendmode = 'mail';
138 138
 
139 139
 		// We define end of line (RFC 821).
140
-		$this->eol="\r\n";
140
+		$this->eol = "\r\n";
141 141
 		// We define end of line for header fields (RFC 822bis section 2.3 says header must contains \r\n).
142
-		$this->eol2="\r\n";
143
-		if (! empty($conf->global->MAIN_FIX_FOR_BUGGED_MTA))
142
+		$this->eol2 = "\r\n";
143
+		if (!empty($conf->global->MAIN_FIX_FOR_BUGGED_MTA))
144 144
 		{
145
-			$this->eol="\n";
146
-			$this->eol2="\n";
147
-			$moreinheader = str_replace("\r\n","\n",$moreinheader);
145
+			$this->eol = "\n";
146
+			$this->eol2 = "\n";
147
+			$moreinheader = str_replace("\r\n", "\n", $moreinheader);
148 148
 		}
149 149
 
150 150
 		// On defini mixed_boundary
151
-		$this->mixed_boundary = "multipart_x." . time() . ".x_boundary";
151
+		$this->mixed_boundary = "multipart_x.".time().".x_boundary";
152 152
 
153 153
 		// On defini related_boundary
154
-		$this->related_boundary = 'mul_'.dol_hash(uniqid("dolibarr2"), 3);	// Force md5 hash (does not contains special chars)
154
+		$this->related_boundary = 'mul_'.dol_hash(uniqid("dolibarr2"), 3); // Force md5 hash (does not contains special chars)
155 155
 
156 156
 		// On defini alternative_boundary
157
-		$this->alternative_boundary = 'mul_'.dol_hash(uniqid("dolibarr3"), 3);	// Force md5 hash (does not contains special chars)
157
+		$this->alternative_boundary = 'mul_'.dol_hash(uniqid("dolibarr3"), 3); // Force md5 hash (does not contains special chars)
158 158
 
159 159
 		dol_syslog("CMailFile::CMailfile: sendmode=".$this->sendmode." charset=".$conf->file->character_set_client." from=$from, to=$to, addr_cc=$addr_cc, addr_bcc=$addr_bcc, errors_to=$errors_to, trackid=$trackid sendcontext=$sendcontext", LOG_DEBUG);
160 160
 		dol_syslog("CMailFile::CMailfile: subject=".$subject.", deliveryreceipt=".$deliveryreceipt.", msgishtml=".$msgishtml, LOG_DEBUG);
@@ -162,13 +162,13 @@  discard block
 block discarded – undo
162 162
 		if (empty($subject))
163 163
 		{
164 164
 			dol_syslog("CMailFile::CMailfile: Try to send an email with empty subject");
165
-			$this->error='ErrorSubjectIsRequired';
165
+			$this->error = 'ErrorSubjectIsRequired';
166 166
 			return;
167 167
 		}
168 168
 		if (empty($msg))
169 169
 		{
170 170
 		    dol_syslog("CMailFile::CMailfile: Try to send an email with empty body");
171
-		    $msg='.';     // Avoid empty message (with empty message conten show a multipart structure)
171
+		    $msg = '.'; // Avoid empty message (with empty message conten show a multipart structure)
172 172
 		}
173 173
 
174 174
 		// Detect if message is HTML (use fast method)
@@ -185,21 +185,21 @@  discard block
 block discarded – undo
185 185
 		global $dolibarr_main_url_root;
186 186
 
187 187
 		// Define $urlwithroot
188
-		$urlwithouturlroot=preg_replace('/'.preg_quote(DOL_URL_ROOT,'/').'$/i','',trim($dolibarr_main_url_root));
189
-		$urlwithroot=$urlwithouturlroot.DOL_URL_ROOT;		// This is to use external domain name found into config file
188
+		$urlwithouturlroot = preg_replace('/'.preg_quote(DOL_URL_ROOT, '/').'$/i', '', trim($dolibarr_main_url_root));
189
+		$urlwithroot = $urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain name found into config file
190 190
 		//$urlwithroot=DOL_MAIN_URL_ROOT;					// This is to use same domain name than current
191 191
 
192 192
 		// Replace relative /viewimage to absolute path
193
-		$msg = preg_replace('/src="'.preg_quote(DOL_URL_ROOT,'/').'\/viewimage\.php/ims', 'src="'.$urlwithroot.'/viewimage.php', $msg, -1, $nbrep);
193
+		$msg = preg_replace('/src="'.preg_quote(DOL_URL_ROOT, '/').'\/viewimage\.php/ims', 'src="'.$urlwithroot.'/viewimage.php', $msg, -1, $nbrep);
194 194
 
195
-		if (! empty($conf->global->MAIN_MAIL_FORCE_CONTENT_TYPE_TO_HTML)) $this->msgishtml=1; // To force to send everything with content type html.
195
+		if (!empty($conf->global->MAIN_MAIL_FORCE_CONTENT_TYPE_TO_HTML)) $this->msgishtml = 1; // To force to send everything with content type html.
196 196
 
197 197
 		// Detect images
198 198
 		if ($this->msgishtml)
199 199
 		{
200 200
 			$this->html = $msg;
201 201
 
202
-			if (! empty($conf->global->MAIN_MAIL_ADD_INLINE_IMAGES_IF_IN_MEDIAS))
202
+			if (!empty($conf->global->MAIN_MAIL_ADD_INLINE_IMAGES_IF_IN_MEDIAS))
203 203
 			{
204 204
 				$findimg = $this->findHtmlImages($dolibarr_main_data_root.'/medias');
205 205
 			}
@@ -211,7 +211,7 @@  discard block
 block discarded – undo
211 211
 				{
212 212
 					if ($this->html_images[$i])
213 213
 					{
214
-						$this->atleastoneimage=1;
214
+						$this->atleastoneimage = 1;
215 215
 						dol_syslog("CMailFile::CMailfile: html_images[$i]['name']=".$this->html_images[$i]['name'], LOG_DEBUG);
216 216
 					}
217 217
 				}
@@ -225,14 +225,14 @@  discard block
 block discarded – undo
225 225
 			{
226 226
 				if ($filename_list[$i])
227 227
 				{
228
-					$this->atleastonefile=1;
228
+					$this->atleastonefile = 1;
229 229
 					dol_syslog("CMailFile::CMailfile: filename_list[$i]=".$filename_list[$i].", mimetype_list[$i]=".$mimetype_list[$i]." mimefilename_list[$i]=".$mimefilename_list[$i], LOG_DEBUG);
230 230
 				}
231 231
 			}
232 232
 		}
233 233
 
234 234
 		// Add autocopy to (Note: Adding bcc for specific modules are also done from pages)
235
-		if (! empty($conf->global->MAIN_MAIL_AUTOCOPY_TO)) $addr_bcc.=($addr_bcc?', ':'').$conf->global->MAIN_MAIL_AUTOCOPY_TO;
235
+		if (!empty($conf->global->MAIN_MAIL_AUTOCOPY_TO)) $addr_bcc .= ($addr_bcc ? ', ' : '').$conf->global->MAIN_MAIL_AUTOCOPY_TO;
236 236
 
237 237
 		// Action according to choosed sending method
238 238
 		if ($this->sendmode == 'mail')
@@ -257,17 +257,17 @@  discard block
 block discarded – undo
257 257
 			$this->trackid = $trackid;
258 258
 
259 259
 			$smtp_headers = $this->write_smtpheaders();
260
-			if (! empty($moreinheader)) $smtp_headers.=$moreinheader;   // $moreinheader contains the \r\n
260
+			if (!empty($moreinheader)) $smtp_headers .= $moreinheader; // $moreinheader contains the \r\n
261 261
 
262 262
 			// Define mime_headers
263 263
 			$mime_headers = $this->write_mimeheaders($filename_list, $mimefilename_list);
264 264
 
265
-			if (! empty($this->html))
265
+			if (!empty($this->html))
266 266
 			{
267 267
 				if (!empty($css))
268 268
 				{
269 269
 					$this->css = $css;
270
-					$this->buildCSS();    // Build a css style (mode = all) into this->styleCSS and this->bodyCSS
270
+					$this->buildCSS(); // Build a css style (mode = all) into this->styleCSS and this->bodyCSS
271 271
 				}
272 272
 
273 273
 				$msg = $this->html;
@@ -279,20 +279,20 @@  discard block
 block discarded – undo
279 279
 			// Add attachments to text_encoded
280 280
 			if ($this->atleastonefile)
281 281
 			{
282
-				$files_encoded = $this->write_files($filename_list,$mimetype_list,$mimefilename_list);
282
+				$files_encoded = $this->write_files($filename_list, $mimetype_list, $mimefilename_list);
283 283
 			}
284 284
 
285 285
 			// We now define $this->headers and $this->message
286
-			$this->headers = $smtp_headers . $mime_headers;
286
+			$this->headers = $smtp_headers.$mime_headers;
287 287
 			// On nettoie le header pour qu'il ne se termine pas par un retour chariot.
288 288
 			// Ceci evite aussi les lignes vides en fin qui peuvent etre interpretees
289 289
 			// comme des injections mail par les serveurs de messagerie.
290
-			$this->headers = preg_replace("/([\r\n]+)$/i","",$this->headers);
290
+			$this->headers = preg_replace("/([\r\n]+)$/i", "", $this->headers);
291 291
 
292 292
 			//$this->message = $this->eol.'This is a message with multiple parts in MIME format.'.$this->eol;
293 293
 			$this->message = 'This is a message with multiple parts in MIME format.'.$this->eol;
294
-			$this->message.= $text_body . $files_encoded;
295
-			$this->message.= "--" . $this->mixed_boundary . "--" . $this->eol;
294
+			$this->message .= $text_body.$files_encoded;
295
+			$this->message .= "--".$this->mixed_boundary."--".$this->eol;
296 296
 		}
297 297
 		else if ($this->sendmode == 'smtps')
298 298
 		{
@@ -304,14 +304,14 @@  discard block
 block discarded – undo
304 304
 			$smtps->setCharSet($conf->file->character_set_client);
305 305
 
306 306
 			$smtps->setSubject($this->encodetorfc2822($subject));
307
-			$smtps->setTO($this->getValidAddress($to,0,1));
308
-			$smtps->setFrom($this->getValidAddress($from,0,1));
307
+			$smtps->setTO($this->getValidAddress($to, 0, 1));
308
+			$smtps->setFrom($this->getValidAddress($from, 0, 1));
309 309
 			$smtps->setTrackId($trackid);
310
-			$smtps->setReplyTo($this->getValidAddress($replyto,0,1));
310
+			$smtps->setReplyTo($this->getValidAddress($replyto, 0, 1));
311 311
 
312
-			if (! empty($moreinheader)) $smtps->setMoreInHeader($moreinheader);
312
+			if (!empty($moreinheader)) $smtps->setMoreInHeader($moreinheader);
313 313
 
314
-			if (! empty($this->html))
314
+			if (!empty($this->html))
315 315
 			{
316 316
 				if (!empty($css))
317 317
 				{
@@ -322,14 +322,14 @@  discard block
 block discarded – undo
322 322
 				$msg = $this->checkIfHTML($msg);
323 323
 			}
324 324
 
325
-			if ($this->msgishtml) $smtps->setBodyContent($msg,'html');
326
-			else $smtps->setBodyContent($msg,'plain');
325
+			if ($this->msgishtml) $smtps->setBodyContent($msg, 'html');
326
+			else $smtps->setBodyContent($msg, 'plain');
327 327
 
328 328
 			if ($this->atleastoneimage)
329 329
 			{
330 330
 				foreach ($this->images_encoded as $img)
331 331
 				{
332
-					$smtps->setImageInline($img['image_encoded'],$img['name'],$img['content_type'],$img['cid']);
332
+					$smtps->setImageInline($img['image_encoded'], $img['name'], $img['content_type'], $img['cid']);
333 333
 				}
334 334
 			}
335 335
 
@@ -337,8 +337,8 @@  discard block
 block discarded – undo
337 337
 			{
338 338
 				foreach ($filename_list as $i => $val)
339 339
 				{
340
-					$content=file_get_contents($filename_list[$i]);
341
-					$smtps->setAttachment($content,$mimefilename_list[$i],$mimetype_list[$i]);
340
+					$content = file_get_contents($filename_list[$i]);
341
+					$smtps->setAttachment($content, $mimefilename_list[$i], $mimetype_list[$i]);
342 342
 				}
343 343
 			}
344 344
 
@@ -347,7 +347,7 @@  discard block
 block discarded – undo
347 347
 			$smtps->setErrorsTo($errors_to);
348 348
 			$smtps->setDeliveryReceipt($deliveryreceipt);
349 349
 
350
-			$this->smtps=$smtps;
350
+			$this->smtps = $smtps;
351 351
 		}
352 352
 		else if ($this->sendmode == 'swiftmailer')
353 353
 		{
@@ -383,8 +383,8 @@  discard block
 block discarded – undo
383 383
             //$this->message = new Swift_SignedMessage();
384 384
             // Adding a trackid header to a message
385 385
 			$headers = $this->message->getHeaders();
386
-			$headers->addTextHeader('X-Dolibarr-TRACKID', $trackid . '@' . $host);
387
-			$headerID = time() . '.swiftmailer-dolibarr-' . $trackid . '@' . $host;
386
+			$headers->addTextHeader('X-Dolibarr-TRACKID', $trackid.'@'.$host);
387
+			$headerID = time().'.swiftmailer-dolibarr-'.$trackid.'@'.$host;
388 388
 			$msgid = $headers->get('Message-ID');
389 389
 			$msgid->setId($headerID);
390 390
 			$headers->addIdHeader('References', $headerID);
@@ -394,12 +394,12 @@  discard block
 block discarded – undo
394 394
 			try {
395 395
 				$result = $this->message->setSubject($subject);
396 396
 			} catch (Exception $e) {
397
-				$this->errors[] =  $e->getMessage();
397
+				$this->errors[] = $e->getMessage();
398 398
 			}
399 399
 
400 400
 			// Set the From address with an associative array
401 401
 			//$this->message->setFrom(array('[email protected]' => 'John Doe'));
402
-			if (! empty($from)) {
402
+			if (!empty($from)) {
403 403
                 try {
404 404
                 	$result = $this->message->setFrom($this->getArrayAddress($from));
405 405
                 } catch (Exception $e) {
@@ -408,7 +408,7 @@  discard block
 block discarded – undo
408 408
             }
409 409
 
410 410
 			// Set the To addresses with an associative array
411
-			if (! empty($to)) {
411
+			if (!empty($to)) {
412 412
                 try {
413 413
                 	$result = $this->message->setTo($this->getArrayAddress($to));
414 414
                 } catch (Exception $e) {
@@ -416,7 +416,7 @@  discard block
 block discarded – undo
416 416
                 }
417 417
             }
418 418
 
419
-			if (! empty($replyto)) {
419
+			if (!empty($replyto)) {
420 420
                 try {
421 421
                 	$result = $this->message->SetReplyTo($this->getArrayAddress($replyto));
422 422
                 } catch (Exception $e) {
@@ -427,10 +427,10 @@  discard block
 block discarded – undo
427 427
 			try {
428 428
 				$result = $this->message->setCharSet($conf->file->character_set_client);
429 429
 			} catch (Exception $e) {
430
-				$this->errors[] =  $e->getMessage();
430
+				$this->errors[] = $e->getMessage();
431 431
 			}
432 432
 
433
-			if (! empty($this->html))
433
+			if (!empty($this->html))
434 434
 			{
435 435
 				if (!empty($css))
436 436
 				{
@@ -455,11 +455,11 @@  discard block
 block discarded – undo
455 455
 			}
456 456
 
457 457
 			if ($this->msgishtml) {
458
-				$this->message->setBody($msg,'text/html');
458
+				$this->message->setBody($msg, 'text/html');
459 459
 				// And optionally an alternative body
460 460
 				$this->message->addPart(html_entity_decode(strip_tags($msg)), 'text/plain');
461 461
 			} else {
462
-				$this->message->setBody($msg,'text/plain');
462
+				$this->message->setBody($msg, 'text/plain');
463 463
 				// And optionally an alternative body
464 464
 				$this->message->addPart($msg, 'text/html');
465 465
 			}
@@ -469,13 +469,13 @@  discard block
 block discarded – undo
469 469
 				foreach ($filename_list as $i => $val)
470 470
 				{
471 471
 					//$this->message->attach(Swift_Attachment::fromPath($filename_list[$i],$mimetype_list[$i]));
472
-					$attachment = Swift_Attachment::fromPath($filename_list[$i],$mimetype_list[$i]);
472
+					$attachment = Swift_Attachment::fromPath($filename_list[$i], $mimetype_list[$i]);
473 473
 					$this->message->attach($attachment);
474 474
 				}
475 475
 			}
476 476
 
477
-			if (! empty($addr_cc)) $this->message->setCc($this->getArrayAddress($addr_cc));
478
-			if (! empty($addr_bcc)) $this->message->setBcc($this->getArrayAddress($addr_bcc));
477
+			if (!empty($addr_cc)) $this->message->setCc($this->getArrayAddress($addr_cc));
478
+			if (!empty($addr_bcc)) $this->message->setBcc($this->getArrayAddress($addr_bcc));
479 479
 			//if (! empty($errors_to)) $this->message->setErrorsTo($this->getArrayAddress($errors_to);
480 480
 			if (isset($deliveryreceipt) && $deliveryreceipt == 1) $this->message->setReadReceiptTo($this->getArrayAddress($from));
481 481
 		}
@@ -495,25 +495,25 @@  discard block
 block discarded – undo
495 495
 	 */
496 496
 	function sendfile()
497 497
 	{
498
-		global $conf,$db,$langs;
498
+		global $conf, $db, $langs;
499 499
 
500
-		$errorlevel=error_reporting();
500
+		$errorlevel = error_reporting();
501 501
 		//error_reporting($errorlevel ^ E_WARNING);   // Desactive warnings
502 502
 
503
-		$res=false;
503
+		$res = false;
504 504
 
505 505
 		if (empty($conf->global->MAIN_DISABLE_ALL_MAILS) || !empty($conf->global->MAIN_MAIL_FORCE_SENDTO))
506 506
 		{
507
-			require_once DOL_DOCUMENT_ROOT . '/core/class/hookmanager.class.php';
507
+			require_once DOL_DOCUMENT_ROOT.'/core/class/hookmanager.class.php';
508 508
 			$hookmanager = new HookManager($db);
509 509
 			$hookmanager->initHooks(array('mail'));
510 510
 
511
-			$parameters=array(); $action='';
511
+			$parameters = array(); $action = '';
512 512
 			$reshook = $hookmanager->executeHooks('sendMail', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
513 513
 			if ($reshook < 0)
514 514
 			{
515
-				$this->error = "Error in hook maildao sendMail " . $reshook;
516
-				dol_syslog("CMailFile::sendfile: mail end error=" . $this->error, LOG_ERR);
515
+				$this->error = "Error in hook maildao sendMail ".$reshook;
516
+				dol_syslog("CMailFile::sendfile: mail end error=".$this->error, LOG_ERR);
517 517
 
518 518
 				return $reshook;
519 519
 			}
@@ -523,52 +523,52 @@  discard block
 block discarded – undo
523 523
 			}
524 524
 
525 525
 			// Check number of recipient is lower or equal than MAIL_MAX_NB_OF_RECIPIENTS_IN_SAME_EMAIL
526
-			if (empty($conf->global->MAIL_MAX_NB_OF_RECIPIENTS_TO_IN_SAME_EMAIL)) $conf->global->MAIL_MAX_NB_OF_RECIPIENTS_TO_IN_SAME_EMAIL=10;
526
+			if (empty($conf->global->MAIL_MAX_NB_OF_RECIPIENTS_TO_IN_SAME_EMAIL)) $conf->global->MAIL_MAX_NB_OF_RECIPIENTS_TO_IN_SAME_EMAIL = 10;
527 527
 			$tmparray1 = explode(',', $this->addr_to);
528 528
 			if (count($tmparray1) > $conf->global->MAIL_MAX_NB_OF_RECIPIENTS_TO_IN_SAME_EMAIL)
529 529
 			{
530 530
 				$this->error = 'Too much recipients in to:';
531
-				dol_syslog("CMailFile::sendfile: mail end error=" . $this->error, LOG_WARNING);
531
+				dol_syslog("CMailFile::sendfile: mail end error=".$this->error, LOG_WARNING);
532 532
 				return false;
533 533
 			}
534
-			if (empty($conf->global->MAIL_MAX_NB_OF_RECIPIENTS_CC_IN_SAME_EMAIL)) $conf->global->MAIL_MAX_NB_OF_RECIPIENTS_CC_IN_SAME_EMAIL=10;
534
+			if (empty($conf->global->MAIL_MAX_NB_OF_RECIPIENTS_CC_IN_SAME_EMAIL)) $conf->global->MAIL_MAX_NB_OF_RECIPIENTS_CC_IN_SAME_EMAIL = 10;
535 535
 			$tmparray2 = explode(',', $this->addr_cc);
536 536
 			if (count($tmparray2) > $conf->global->MAIL_MAX_NB_OF_RECIPIENTS_CC_IN_SAME_EMAIL)
537 537
 			{
538 538
 				$this->error = 'Too much recipients in cc:';
539
-				dol_syslog("CMailFile::sendfile: mail end error=" . $this->error, LOG_WARNING);
539
+				dol_syslog("CMailFile::sendfile: mail end error=".$this->error, LOG_WARNING);
540 540
 				return false;
541 541
 			}
542
-			if (empty($conf->global->MAIL_MAX_NB_OF_RECIPIENTS_BCC_IN_SAME_EMAIL)) $conf->global->MAIL_MAX_NB_OF_RECIPIENTS_BCC_IN_SAME_EMAIL=10;
542
+			if (empty($conf->global->MAIL_MAX_NB_OF_RECIPIENTS_BCC_IN_SAME_EMAIL)) $conf->global->MAIL_MAX_NB_OF_RECIPIENTS_BCC_IN_SAME_EMAIL = 10;
543 543
 			$tmparray3 = explode(',', $this->addr_bcc);
544 544
 			if (count($tmparray3) > $conf->global->MAIL_MAX_NB_OF_RECIPIENTS_BCC_IN_SAME_EMAIL)
545 545
 			{
546 546
 				$this->error = 'Too much recipients in bcc:';
547
-				dol_syslog("CMailFile::sendfile: mail end error=" . $this->error, LOG_WARNING);
547
+				dol_syslog("CMailFile::sendfile: mail end error=".$this->error, LOG_WARNING);
548 548
 				return false;
549 549
 			}
550
-			if (empty($conf->global->MAIL_MAX_NB_OF_RECIPIENTS_IN_SAME_EMAIL)) $conf->global->MAIL_MAX_NB_OF_RECIPIENTS_IN_SAME_EMAIL=10;
551
-			if ((count($tmparray1)+count($tmparray2)+count($tmparray3)) > $conf->global->MAIL_MAX_NB_OF_RECIPIENTS_IN_SAME_EMAIL)
550
+			if (empty($conf->global->MAIL_MAX_NB_OF_RECIPIENTS_IN_SAME_EMAIL)) $conf->global->MAIL_MAX_NB_OF_RECIPIENTS_IN_SAME_EMAIL = 10;
551
+			if ((count($tmparray1) + count($tmparray2) + count($tmparray3)) > $conf->global->MAIL_MAX_NB_OF_RECIPIENTS_IN_SAME_EMAIL)
552 552
 			{
553 553
 				$this->error = 'Too much recipients in to:, cc:, bcc:';
554
-				dol_syslog("CMailFile::sendfile: mail end error=" . $this->error, LOG_WARNING);
554
+				dol_syslog("CMailFile::sendfile: mail end error=".$this->error, LOG_WARNING);
555 555
 				return false;
556 556
 			}
557 557
 
558
-			$keyforsmtpserver='MAIN_MAIL_SMTP_SERVER';
559
-			$keyforsmtpport  ='MAIN_MAIL_SMTP_PORT';
560
-			$keyforsmtpid    ='MAIN_MAIL_SMTPS_ID';
561
-			$keyforsmtppw    ='MAIN_MAIL_SMTPS_PW';
562
-			$keyfortls       ='MAIN_MAIL_EMAIL_TLS';
563
-			$keyforstarttls  ='MAIN_MAIL_EMAIL_STARTTLS';
558
+			$keyforsmtpserver = 'MAIN_MAIL_SMTP_SERVER';
559
+			$keyforsmtpport  = 'MAIN_MAIL_SMTP_PORT';
560
+			$keyforsmtpid    = 'MAIN_MAIL_SMTPS_ID';
561
+			$keyforsmtppw    = 'MAIN_MAIL_SMTPS_PW';
562
+			$keyfortls       = 'MAIN_MAIL_EMAIL_TLS';
563
+			$keyforstarttls  = 'MAIN_MAIL_EMAIL_STARTTLS';
564 564
 			if ($this->sendcontext == 'emailing' && !empty($conf->global->MAIN_MAIL_SENDMODE_EMAILING) && $conf->global->MAIN_MAIL_SENDMODE_EMAILING != 'default')
565 565
 			{
566
-				$keyforsmtpserver='MAIN_MAIL_SMTP_SERVER_EMAILING';
567
-				$keyforsmtpport  ='MAIN_MAIL_SMTP_PORT_EMAILING';
568
-				$keyforsmtpid    ='MAIN_MAIL_SMTPS_ID_EMAILING';
569
-				$keyforsmtppw    ='MAIN_MAIL_SMTPS_PW_EMAILING';
570
-				$keyfortls       ='MAIN_MAIL_EMAIL_TLS_EMAILING';
571
-				$keyforstarttls  ='MAIN_MAIL_EMAIL_STARTTLS_EMAILING';
566
+				$keyforsmtpserver = 'MAIN_MAIL_SMTP_SERVER_EMAILING';
567
+				$keyforsmtpport  = 'MAIN_MAIL_SMTP_PORT_EMAILING';
568
+				$keyforsmtpid    = 'MAIN_MAIL_SMTPS_ID_EMAILING';
569
+				$keyforsmtppw    = 'MAIN_MAIL_SMTPS_PW_EMAILING';
570
+				$keyfortls       = 'MAIN_MAIL_EMAIL_TLS_EMAILING';
571
+				$keyforstarttls  = 'MAIN_MAIL_EMAIL_STARTTLS_EMAILING';
572 572
 			}
573 573
 
574 574
 			if (!empty($conf->global->MAIN_MAIL_FORCE_SENDTO))
@@ -591,68 +591,68 @@  discard block
 block discarded – undo
591 591
 				if (isset($_SERVER["WINDIR"]))
592 592
 				{
593 593
 					if (empty($this->addr_from)) $this->addr_from = '[email protected]';
594
-					@ini_set('sendmail_from',$this->getValidAddress($this->addr_from,2));
594
+					@ini_set('sendmail_from', $this->getValidAddress($this->addr_from, 2));
595 595
 				}
596 596
 
597 597
 				// Force parameters
598
-				if (! empty($conf->global->$keyforsmtpserver)) ini_set('SMTP',$conf->global->$keyforsmtpserver);
599
-				if (! empty($conf->global->$keyforsmtpport))   ini_set('smtp_port',$conf->global->$keyforsmtpport);
598
+				if (!empty($conf->global->$keyforsmtpserver)) ini_set('SMTP', $conf->global->$keyforsmtpserver);
599
+				if (!empty($conf->global->$keyforsmtpport))   ini_set('smtp_port', $conf->global->$keyforsmtpport);
600 600
 
601
-				$res=true;
602
-				if ($res && ! $this->subject)
601
+				$res = true;
602
+				if ($res && !$this->subject)
603 603
 				{
604
-					$this->error="Failed to send mail with php mail to HOST=".ini_get('SMTP').", PORT=".ini_get('smtp_port')."<br>Subject is empty";
604
+					$this->error = "Failed to send mail with php mail to HOST=".ini_get('SMTP').", PORT=".ini_get('smtp_port')."<br>Subject is empty";
605 605
 					dol_syslog("CMailFile::sendfile: mail end error=".$this->error, LOG_ERR);
606
-					$res=false;
606
+					$res = false;
607 607
 				}
608
-				$dest=$this->getValidAddress($this->addr_to,2);
609
-				if ($res && ! $dest)
608
+				$dest = $this->getValidAddress($this->addr_to, 2);
609
+				if ($res && !$dest)
610 610
 				{
611
-					$this->error="Failed to send mail with php mail to HOST=".ini_get('SMTP').", PORT=".ini_get('smtp_port')."<br>Recipient address '$dest' invalid";
611
+					$this->error = "Failed to send mail with php mail to HOST=".ini_get('SMTP').", PORT=".ini_get('smtp_port')."<br>Recipient address '$dest' invalid";
612 612
 					dol_syslog("CMailFile::sendfile: mail end error=".$this->error, LOG_ERR);
613
-					$res=false;
613
+					$res = false;
614 614
 				}
615 615
 
616 616
 				if ($res)
617 617
 				{
618
-					$additionnalparam = '';	// By default
619
-					if (! empty($conf->global->MAIN_MAIL_ALLOW_SENDMAIL_F))
618
+					$additionnalparam = ''; // By default
619
+					if (!empty($conf->global->MAIN_MAIL_ALLOW_SENDMAIL_F))
620 620
 					{
621 621
 						// le "Return-Path" (retour des messages bounced) dans les header ne fonctionne pas avec tous les MTA
622 622
 						// Le forcage de la valeur grace à l'option -f de sendmail est donc possible si la constante MAIN_MAIL_ALLOW_SENDMAIL_F est definie.
623 623
 						// Having this variable defined may create problems with some sendmail (option -f refused)
624 624
 						// Having this variable not defined may create problems with some other sendmail (option -f required)
625
-						$additionnalparam .= ($additionnalparam?' ':'').(! empty($conf->global->MAIN_MAIL_ERRORS_TO) ? '-f' . $this->getValidAddress($conf->global->MAIN_MAIL_ERRORS_TO,2) : ($this->addr_from != '' ? '-f' . $this->getValidAddress($this->addr_from,2) : '') );
625
+						$additionnalparam .= ($additionnalparam ? ' ' : '').(!empty($conf->global->MAIN_MAIL_ERRORS_TO) ? '-f'.$this->getValidAddress($conf->global->MAIN_MAIL_ERRORS_TO, 2) : ($this->addr_from != '' ? '-f'.$this->getValidAddress($this->addr_from, 2) : ''));
626 626
 					}
627
-					if (! empty($conf->global->MAIN_MAIL_SENDMAIL_FORCE_BA))    // To force usage of -ba option. This option tells sendmail to read From: or Sender: to setup sender
627
+					if (!empty($conf->global->MAIN_MAIL_SENDMAIL_FORCE_BA))    // To force usage of -ba option. This option tells sendmail to read From: or Sender: to setup sender
628 628
 					{
629
-						$additionnalparam .= ($additionnalparam?' ':'').'-ba';
629
+						$additionnalparam .= ($additionnalparam ? ' ' : '').'-ba';
630 630
 					}
631 631
 
632
-					if (! empty($conf->global->MAIN_MAIL_SENDMAIL_FORCE_ADDPARAM)) $additionnalparam .= ($additionnalparam?' ':'').'-U '.$additionnalparam; // Use -U to add additionnal params
632
+					if (!empty($conf->global->MAIN_MAIL_SENDMAIL_FORCE_ADDPARAM)) $additionnalparam .= ($additionnalparam ? ' ' : '').'-U '.$additionnalparam; // Use -U to add additionnal params
633 633
 
634 634
 					dol_syslog("CMailFile::sendfile: mail start HOST=".ini_get('SMTP').", PORT=".ini_get('smtp_port').", additionnal_parameters=".$additionnalparam, LOG_DEBUG);
635 635
 
636
-					$this->message=stripslashes($this->message);
636
+					$this->message = stripslashes($this->message);
637 637
 
638
-					if (! empty($conf->global->MAIN_MAIL_DEBUG)) $this->dump_mail();
638
+					if (!empty($conf->global->MAIN_MAIL_DEBUG)) $this->dump_mail();
639 639
 
640
-					if (! empty($additionnalparam)) $res = mail($dest, $this->encodetorfc2822($this->subject), $this->message, $this->headers, $additionnalparam);
640
+					if (!empty($additionnalparam)) $res = mail($dest, $this->encodetorfc2822($this->subject), $this->message, $this->headers, $additionnalparam);
641 641
 					else $res = mail($dest, $this->encodetorfc2822($this->subject), $this->message, $this->headers);
642 642
 
643
-					if (! $res)
643
+					if (!$res)
644 644
 					{
645 645
 						$langs->load("errors");
646
-						$this->error="Failed to send mail with php mail";
647
-						$linuxlike=1;
648
-						if (preg_match('/^win/i',PHP_OS)) $linuxlike=0;
649
-						if (preg_match('/^mac/i',PHP_OS)) $linuxlike=0;
650
-						if (! $linuxlike)
646
+						$this->error = "Failed to send mail with php mail";
647
+						$linuxlike = 1;
648
+						if (preg_match('/^win/i', PHP_OS)) $linuxlike = 0;
649
+						if (preg_match('/^mac/i', PHP_OS)) $linuxlike = 0;
650
+						if (!$linuxlike)
651 651
 						{
652
-							$this->error.=" to HOST=".ini_get('SMTP').", PORT=".ini_get('smtp_port');	// This values are value used only for non linuxlike systems
652
+							$this->error .= " to HOST=".ini_get('SMTP').", PORT=".ini_get('smtp_port'); // This values are value used only for non linuxlike systems
653 653
 						}
654
-						$this->error.=".<br>";
655
-						$this->error.=$langs->trans("ErrorPhpMailDelivery");
654
+						$this->error .= ".<br>";
655
+						$this->error .= $langs->trans("ErrorPhpMailDelivery");
656 656
 						dol_syslog("CMailFile::sendfile: mail end error=".$this->error, LOG_ERR);
657 657
 					}
658 658
 					else
@@ -667,86 +667,86 @@  discard block
 block discarded – undo
667 667
 				}
668 668
 
669 669
 				// Restore parameters
670
-				if (! empty($conf->global->$keyforsmtpserver))	ini_restore('SMTP');
671
-				if (! empty($conf->global->$keyforsmtpport)) 	ini_restore('smtp_port');
670
+				if (!empty($conf->global->$keyforsmtpserver))	ini_restore('SMTP');
671
+				if (!empty($conf->global->$keyforsmtpport)) 	ini_restore('smtp_port');
672 672
 			}
673 673
 			else if ($this->sendmode == 'smtps')
674 674
 			{
675
-				if (! is_object($this->smtps))
675
+				if (!is_object($this->smtps))
676 676
 				{
677
-					$this->error="Failed to send mail with smtps lib to HOST=".$server.", PORT=".$conf->global->$keyforsmtpport."<br>Constructor of object CMailFile was not initialized without errors.";
677
+					$this->error = "Failed to send mail with smtps lib to HOST=".$server.", PORT=".$conf->global->$keyforsmtpport."<br>Constructor of object CMailFile was not initialized without errors.";
678 678
 					dol_syslog("CMailFile::sendfile: mail end error=".$this->error, LOG_ERR);
679 679
 					return false;
680 680
 				}
681 681
 
682 682
 				// Use SMTPS library
683 683
 				// ------------------------------------------
684
-				$this->smtps->setTransportType(0);	// Only this method is coded in SMTPs library
684
+				$this->smtps->setTransportType(0); // Only this method is coded in SMTPs library
685 685
 
686 686
 				// Clean parameters
687
-				if (empty($conf->global->$keyforsmtpserver)) $conf->global->$keyforsmtpserver=ini_get('SMTP');
688
-				if (empty($conf->global->$keyforsmtpport))   $conf->global->$keyforsmtpport=ini_get('smtp_port');
687
+				if (empty($conf->global->$keyforsmtpserver)) $conf->global->$keyforsmtpserver = ini_get('SMTP');
688
+				if (empty($conf->global->$keyforsmtpport))   $conf->global->$keyforsmtpport = ini_get('smtp_port');
689 689
 
690 690
 				// If we use SSL/TLS
691
-				$server=$conf->global->$keyforsmtpserver;
692
-				$secure='';
693
-				if (! empty($conf->global->$keyfortls) && function_exists('openssl_open')) $secure='ssl';
694
-				if (! empty($conf->global->$keyforstarttls) && function_exists('openssl_open')) $secure='tls';
695
-				$server=($secure?$secure.'://':'').$server;
691
+				$server = $conf->global->$keyforsmtpserver;
692
+				$secure = '';
693
+				if (!empty($conf->global->$keyfortls) && function_exists('openssl_open')) $secure = 'ssl';
694
+				if (!empty($conf->global->$keyforstarttls) && function_exists('openssl_open')) $secure = 'tls';
695
+				$server = ($secure ? $secure.'://' : '').$server;
696 696
 
697
-				$port=$conf->global->$keyforsmtpport;
697
+				$port = $conf->global->$keyforsmtpport;
698 698
 
699 699
 				$this->smtps->setHost($server);
700 700
 				$this->smtps->setPort($port); // 25, 465...;
701 701
 
702
-				$loginid=''; $loginpass='';
703
-				if (! empty($conf->global->$keyforsmtpid))
702
+				$loginid = ''; $loginpass = '';
703
+				if (!empty($conf->global->$keyforsmtpid))
704 704
 				{
705 705
 					$loginid = $conf->global->$keyforsmtpid;
706 706
 					$this->smtps->setID($loginid);
707 707
 				}
708
-				if (! empty($conf->global->$keyforsmtppw))
708
+				if (!empty($conf->global->$keyforsmtppw))
709 709
 				{
710 710
 					$loginpass = $conf->global->$keyforsmtppw;
711 711
 					$this->smtps->setPW($loginpass);
712 712
 				}
713 713
 
714
-				$res=true;
715
-				$from=$this->smtps->getFrom('org');
716
-				if ($res && ! $from)
714
+				$res = true;
715
+				$from = $this->smtps->getFrom('org');
716
+				if ($res && !$from)
717 717
 				{
718
-					$this->error="Failed to send mail with smtps lib to HOST=".$server.", PORT=".$conf->global->$keyforsmtpport."<br>Sender address '$from' invalid";
718
+					$this->error = "Failed to send mail with smtps lib to HOST=".$server.", PORT=".$conf->global->$keyforsmtpport."<br>Sender address '$from' invalid";
719 719
 					dol_syslog("CMailFile::sendfile: mail end error=".$this->error, LOG_ERR);
720
-					$res=false;
720
+					$res = false;
721 721
 				}
722
-				$dest=$this->smtps->getTo();
723
-				if ($res && ! $dest)
722
+				$dest = $this->smtps->getTo();
723
+				if ($res && !$dest)
724 724
 				{
725
-					$this->error="Failed to send mail with smtps lib to HOST=".$server.", PORT=".$conf->global->$keyforsmtpport."<br>Recipient address '$dest' invalid";
725
+					$this->error = "Failed to send mail with smtps lib to HOST=".$server.", PORT=".$conf->global->$keyforsmtpport."<br>Recipient address '$dest' invalid";
726 726
 					dol_syslog("CMailFile::sendfile: mail end error=".$this->error, LOG_ERR);
727
-					$res=false;
727
+					$res = false;
728 728
 				}
729 729
 
730 730
 				if ($res)
731 731
 				{
732
-					if (! empty($conf->global->MAIN_MAIL_DEBUG)) $this->smtps->setDebug(true);
732
+					if (!empty($conf->global->MAIN_MAIL_DEBUG)) $this->smtps->setDebug(true);
733 733
 
734
-					$result=$this->smtps->sendMsg();
734
+					$result = $this->smtps->sendMsg();
735 735
 					//print $result;
736 736
 
737
-					if (! empty($conf->global->MAIN_MAIL_DEBUG)) $this->dump_mail();
737
+					if (!empty($conf->global->MAIN_MAIL_DEBUG)) $this->dump_mail();
738 738
 
739
-					$result=$this->smtps->getErrors();
739
+					$result = $this->smtps->getErrors();
740 740
 					if (empty($this->error) && empty($result))
741 741
 					{
742 742
 						dol_syslog("CMailFile::sendfile: mail end success", LOG_DEBUG);
743
-						$res=true;
743
+						$res = true;
744 744
 					}
745 745
 					else
746 746
 					{
747
-						if (empty($this->error)) $this->error=$result;
747
+						if (empty($this->error)) $this->error = $result;
748 748
 						dol_syslog("CMailFile::sendfile: mail end error=".$this->error, LOG_ERR);
749
-						$res=false;
749
+						$res = false;
750 750
 					}
751 751
 				}
752 752
 			}
@@ -757,19 +757,19 @@  discard block
 block discarded – undo
757 757
 				require_once DOL_DOCUMENT_ROOT.'/includes/swiftmailer/lib/swift_required.php';
758 758
 
759 759
 				// Clean parameters
760
-				if (empty($conf->global->$keyforsmtpserver)) $conf->global->$keyforsmtpserver=ini_get('SMTP');
761
-				if (empty($conf->global->$keyforsmtpport))   $conf->global->$keyforsmtpport=ini_get('smtp_port');
760
+				if (empty($conf->global->$keyforsmtpserver)) $conf->global->$keyforsmtpserver = ini_get('SMTP');
761
+				if (empty($conf->global->$keyforsmtpport))   $conf->global->$keyforsmtpport = ini_get('smtp_port');
762 762
 
763 763
 				// If we use SSL/TLS
764 764
 				$server = $conf->global->$keyforsmtpserver;
765 765
 				$secure = '';
766
-				if (! empty($conf->global->$keyfortls) && function_exists('openssl_open')) $secure='ssl';
767
-				if (! empty($conf->global->$keyforstarttls) && function_exists('openssl_open')) $secure='tls';
766
+				if (!empty($conf->global->$keyfortls) && function_exists('openssl_open')) $secure = 'ssl';
767
+				if (!empty($conf->global->$keyforstarttls) && function_exists('openssl_open')) $secure = 'tls';
768 768
 
769 769
 				$this->transport = new Swift_SmtpTransport($server, $conf->global->$keyforsmtpport, $secure);
770 770
 
771
-				if (! empty($conf->global->$keyforsmtpid)) $this->transport->setUsername($conf->global->$keyforsmtpid);
772
-				if (! empty($conf->global->$keyforsmtppw)) $this->transport->setPassword($conf->global->$keyforsmtppw);
771
+				if (!empty($conf->global->$keyforsmtpid)) $this->transport->setUsername($conf->global->$keyforsmtpid);
772
+				if (!empty($conf->global->$keyforsmtppw)) $this->transport->setPassword($conf->global->$keyforsmtppw);
773 773
 				//$smtps->_msgReplyTo  = '[email protected]';
774 774
 
775 775
 				// Create the Mailer using your created Transport
@@ -784,7 +784,7 @@  discard block
 block discarded – undo
784 784
                     $this->message->attachSigner($signer->ignoreHeader('Return-Path'));
785 785
                 }
786 786
 
787
-                if (! empty($conf->global->MAIN_MAIL_DEBUG)) {
787
+                if (!empty($conf->global->MAIN_MAIL_DEBUG)) {
788 788
 					// To use the ArrayLogger
789 789
 					$this->logger = new Swift_Plugins_Loggers_ArrayLogger();
790 790
 					// Or to use the Echo Logger
@@ -795,14 +795,14 @@  discard block
 block discarded – undo
795 795
 				try {
796 796
 					$result = $this->mailer->send($this->message);
797 797
 				} catch (Exception $e) {
798
-					$this->error =  $e->getMessage();
798
+					$this->error = $e->getMessage();
799 799
 				}
800
-				if (! empty($conf->global->MAIN_MAIL_DEBUG)) $this->dump_mail();
800
+				if (!empty($conf->global->MAIN_MAIL_DEBUG)) $this->dump_mail();
801 801
 
802 802
 				$res = true;
803
-				if (! empty($this->error) || ! $result) {
803
+				if (!empty($this->error) || !$result) {
804 804
 					dol_syslog("CMailFile::sendfile: mail end error=".$this->error, LOG_ERR);
805
-					$res=false;
805
+					$res = false;
806 806
 				}
807 807
 				else
808 808
 				{
@@ -817,23 +817,23 @@  discard block
 block discarded – undo
817 817
 				return 'Bad value for sendmode';
818 818
 			}
819 819
 
820
-			$parameters=array(); $action='';
820
+			$parameters = array(); $action = '';
821 821
 			$reshook = $hookmanager->executeHooks('sendMailAfter', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
822 822
 			if ($reshook < 0)
823 823
 			{
824
-				$this->error = "Error in hook maildao sendMailAfter " . $reshook;
825
-				dol_syslog("CMailFile::sendfile: mail end error=" . $this->error, LOG_ERR);
824
+				$this->error = "Error in hook maildao sendMailAfter ".$reshook;
825
+				dol_syslog("CMailFile::sendfile: mail end error=".$this->error, LOG_ERR);
826 826
 
827 827
 				return $reshook;
828 828
 			}
829 829
 		}
830 830
 		else
831 831
 		{
832
-			$this->error='No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS';
832
+			$this->error = 'No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS';
833 833
 			dol_syslog("CMailFile::sendfile: ".$this->error, LOG_WARNING);
834 834
 		}
835 835
 
836
-		error_reporting($errorlevel);              // Reactive niveau erreur origine
836
+		error_reporting($errorlevel); // Reactive niveau erreur origine
837 837
 
838 838
 		return $res;
839 839
 	}
@@ -860,17 +860,17 @@  discard block
 block discarded – undo
860 860
 	function _encode_file($sourcefile)
861 861
 	{
862 862
         // phpcs:enable
863
-		$newsourcefile=dol_osencode($sourcefile);
863
+		$newsourcefile = dol_osencode($sourcefile);
864 864
 
865 865
 		if (is_readable($newsourcefile))
866 866
 		{
867
-			$contents = file_get_contents($newsourcefile);	// Need PHP 4.3
868
-			$encoded = chunk_split(base64_encode($contents), 76, $this->eol);    // 76 max is defined into http://tools.ietf.org/html/rfc2047
867
+			$contents = file_get_contents($newsourcefile); // Need PHP 4.3
868
+			$encoded = chunk_split(base64_encode($contents), 76, $this->eol); // 76 max is defined into http://tools.ietf.org/html/rfc2047
869 869
 			return $encoded;
870 870
 		}
871 871
 		else
872 872
 		{
873
-			$this->error="Error: Can't read file '".$sourcefile."' into _encode_file";
873
+			$this->error = "Error: Can't read file '".$sourcefile."' into _encode_file";
874 874
 			dol_syslog("CMailFile::encode_file: ".$this->error, LOG_ERR);
875 875
 			return -1;
876 876
 		}
@@ -888,30 +888,30 @@  discard block
 block discarded – undo
888 888
 	function dump_mail()
889 889
 	{
890 890
         // phpcs:enable
891
-		global $conf,$dolibarr_main_data_root;
891
+		global $conf, $dolibarr_main_data_root;
892 892
 
893 893
 		if (@is_writeable($dolibarr_main_data_root))	// Avoid fatal error on fopen with open_basedir
894 894
 		{
895
-			$outputfile=$dolibarr_main_data_root."/dolibarr_mail.log";
896
-			$fp = fopen($outputfile,"w");
895
+			$outputfile = $dolibarr_main_data_root."/dolibarr_mail.log";
896
+			$fp = fopen($outputfile, "w");
897 897
 
898 898
 			if ($this->sendmode == 'mail')
899 899
 			{
900 900
 				fputs($fp, $this->headers);
901
-				fputs($fp, $this->eol);			// This eol is added by the mail function, so we add it in log
901
+				fputs($fp, $this->eol); // This eol is added by the mail function, so we add it in log
902 902
 				fputs($fp, $this->message);
903 903
 			}
904 904
 			elseif ($this->sendmode == 'smtps')
905 905
 			{
906
-				fputs($fp, $this->smtps->log);	// this->smtps->log is filled only if MAIN_MAIL_DEBUG was set to on
906
+				fputs($fp, $this->smtps->log); // this->smtps->log is filled only if MAIN_MAIL_DEBUG was set to on
907 907
 			}
908 908
 			elseif ($this->sendmode == 'swiftmailer')
909 909
 			{
910
-				fputs($fp, $this->logger->dump());	// this->logger is filled only if MAIN_MAIL_DEBUG was set to on
910
+				fputs($fp, $this->logger->dump()); // this->logger is filled only if MAIN_MAIL_DEBUG was set to on
911 911
 			}
912 912
 
913 913
 			fclose($fp);
914
-			if (! empty($conf->global->MAIN_UMASK))
914
+			if (!empty($conf->global->MAIN_UMASK))
915 915
 				@chmod($outputfile, octdec($conf->global->MAIN_UMASK));
916 916
 		}
917 917
 	}
@@ -925,15 +925,15 @@  discard block
 block discarded – undo
925 925
 	 */
926 926
 	function checkIfHTML($msg)
927 927
 	{
928
-		if (!preg_match('/^[\s\t]*<html/i',$msg))
928
+		if (!preg_match('/^[\s\t]*<html/i', $msg))
929 929
 		{
930 930
 			$out = "<html><head><title></title>";
931
-			if (!empty($this->styleCSS)) $out.= $this->styleCSS;
932
-			$out.= "</head><body";
933
-			if (!empty($this->bodyCSS)) $out.= $this->bodyCSS;
934
-			$out.= ">";
935
-			$out.= $msg;
936
-			$out.= "</body></html>";
931
+			if (!empty($this->styleCSS)) $out .= $this->styleCSS;
932
+			$out .= "</head><body";
933
+			if (!empty($this->bodyCSS)) $out .= $this->bodyCSS;
934
+			$out .= ">";
935
+			$out .= $msg;
936
+			$out .= "</body></html>";
937 937
 		}
938 938
 		else
939 939
 		{
@@ -950,24 +950,24 @@  discard block
 block discarded – undo
950 950
 	 */
951 951
 	function buildCSS()
952 952
 	{
953
-		if (! empty($this->css))
953
+		if (!empty($this->css))
954 954
 		{
955 955
 			// Style CSS
956 956
 			$this->styleCSS = '<style type="text/css">';
957
-			$this->styleCSS.= 'body {';
957
+			$this->styleCSS .= 'body {';
958 958
 
959 959
 			if ($this->css['bgcolor'])
960 960
 			{
961
-				$this->styleCSS.= '  background-color: '.$this->css['bgcolor'].';';
962
-				$this->bodyCSS.= ' bgcolor="'.$this->css['bgcolor'].'"';
961
+				$this->styleCSS .= '  background-color: '.$this->css['bgcolor'].';';
962
+				$this->bodyCSS .= ' bgcolor="'.$this->css['bgcolor'].'"';
963 963
 			}
964 964
 			if ($this->css['bgimage'])
965 965
 			{
966 966
 				// TODO recuperer cid
967
-				$this->styleCSS.= ' background-image: url("cid:'.$this->css['bgimage_cid'].'");';
967
+				$this->styleCSS .= ' background-image: url("cid:'.$this->css['bgimage_cid'].'");';
968 968
 			}
969
-			$this->styleCSS.= '}';
970
-			$this->styleCSS.= '</style>';
969
+			$this->styleCSS .= '}';
970
+			$this->styleCSS .= '</style>';
971 971
 		}
972 972
 	}
973 973
 
@@ -988,48 +988,48 @@  discard block
 block discarded – undo
988 988
 
989 989
 		// Sender
990 990
 		//$out.= "Sender: ".getValidAddress($this->addr_from,2)).$this->eol2;
991
-		$out.= "From: ".$this->getValidAddress($this->addr_from,3,1).$this->eol2;
992
-		if (! empty($conf->global->MAIN_MAIL_SENDMAIL_FORCE_BA))
991
+		$out .= "From: ".$this->getValidAddress($this->addr_from, 3, 1).$this->eol2;
992
+		if (!empty($conf->global->MAIN_MAIL_SENDMAIL_FORCE_BA))
993 993
 		{
994
-			$out.= "To: ".$this->getValidAddress($this->addr_to,0,1).$this->eol2;
994
+			$out .= "To: ".$this->getValidAddress($this->addr_to, 0, 1).$this->eol2;
995 995
 		}
996 996
 		// Return-Path is important because it is used by SPF. Some MTA does not read Return-Path from header but from command line. See option MAIN_MAIL_ALLOW_SENDMAIL_F for that.
997
-		$out.= "Return-Path: ".$this->getValidAddress($this->addr_from,0,1).$this->eol2;
998
-		if (isset($this->reply_to)  && $this->reply_to)  $out.= "Reply-To: ".$this->getValidAddress($this->reply_to,2).$this->eol2;
999
-		if (isset($this->errors_to) && $this->errors_to) $out.= "Errors-To: ".$this->getValidAddress($this->errors_to,2).$this->eol2;
997
+		$out .= "Return-Path: ".$this->getValidAddress($this->addr_from, 0, 1).$this->eol2;
998
+		if (isset($this->reply_to) && $this->reply_to)  $out .= "Reply-To: ".$this->getValidAddress($this->reply_to, 2).$this->eol2;
999
+		if (isset($this->errors_to) && $this->errors_to) $out .= "Errors-To: ".$this->getValidAddress($this->errors_to, 2).$this->eol2;
1000 1000
 
1001 1001
 		// Receiver
1002
-		if (isset($this->addr_cc)   && $this->addr_cc)   $out.= "Cc: ".$this->getValidAddress($this->addr_cc,2).$this->eol2;
1003
-		if (isset($this->addr_bcc)  && $this->addr_bcc)  $out.= "Bcc: ".$this->getValidAddress($this->addr_bcc,2).$this->eol2;    // TODO Question: bcc must not be into header, only into SMTP command "RCPT TO". Does php mail support this ?
1002
+		if (isset($this->addr_cc) && $this->addr_cc)   $out .= "Cc: ".$this->getValidAddress($this->addr_cc, 2).$this->eol2;
1003
+		if (isset($this->addr_bcc) && $this->addr_bcc)  $out .= "Bcc: ".$this->getValidAddress($this->addr_bcc, 2).$this->eol2; // TODO Question: bcc must not be into header, only into SMTP command "RCPT TO". Does php mail support this ?
1004 1004
 
1005 1005
 		// Delivery receipt
1006
-		if (isset($this->deliveryreceipt) && $this->deliveryreceipt == 1) $out.= "Disposition-Notification-To: ".$this->getValidAddress($this->addr_from,2).$this->eol2;
1006
+		if (isset($this->deliveryreceipt) && $this->deliveryreceipt == 1) $out .= "Disposition-Notification-To: ".$this->getValidAddress($this->addr_from, 2).$this->eol2;
1007 1007
 
1008 1008
 		//$out.= "X-Priority: 3".$this->eol2;
1009 1009
 
1010
-		$out.= 'Date: ' . date("r") . $this->eol2;
1010
+		$out .= 'Date: '.date("r").$this->eol2;
1011 1011
 
1012 1012
 		$trackid = $this->trackid;
1013 1013
 		if ($trackid)
1014 1014
 		{
1015 1015
 			// References is kept in response and Message-ID is returned into In-Reply-To:
1016
-			$out.= 'Message-ID: <' . time() . '.phpmail-dolibarr-'. $trackid . '@' . $host . ">" . $this->eol2;	// Uppercase seems replaced by phpmail
1017
-			$out.= 'References: <' . time() . '.phpmail-dolibarr-'. $trackid . '@' . $host . ">" . $this->eol2;
1018
-			$out.= 'X-Dolibarr-TRACKID: ' . $trackid . '@' . $host. $this->eol2;
1016
+			$out .= 'Message-ID: <'.time().'.phpmail-dolibarr-'.$trackid.'@'.$host.">".$this->eol2; // Uppercase seems replaced by phpmail
1017
+			$out .= 'References: <'.time().'.phpmail-dolibarr-'.$trackid.'@'.$host.">".$this->eol2;
1018
+			$out .= 'X-Dolibarr-TRACKID: '.$trackid.'@'.$host.$this->eol2;
1019 1019
 		}
1020 1020
 		else
1021 1021
 		{
1022
-			$out.= 'Message-ID: <' . time() . '.phpmail@' . $host . ">" . $this->eol2;
1022
+			$out .= 'Message-ID: <'.time().'.phpmail@'.$host.">".$this->eol2;
1023 1023
 		}
1024 1024
 
1025
-		if (! empty($_SERVER['REMOTE_ADDR'])) $out.= "X-RemoteAddr: " . $_SERVER['REMOTE_ADDR']. $this->eol2;
1026
-		$out.= "X-Mailer: Dolibarr version " . DOL_VERSION ." (using php mail)".$this->eol2;
1027
-		$out.= "Mime-Version: 1.0".$this->eol2;
1025
+		if (!empty($_SERVER['REMOTE_ADDR'])) $out .= "X-RemoteAddr: ".$_SERVER['REMOTE_ADDR'].$this->eol2;
1026
+		$out .= "X-Mailer: Dolibarr version ".DOL_VERSION." (using php mail)".$this->eol2;
1027
+		$out .= "Mime-Version: 1.0".$this->eol2;
1028 1028
 
1029 1029
 		//$out.= "From: ".$this->getValidAddress($this->addr_from,3,1).$this->eol;
1030 1030
 
1031
-		$out.= "Content-Type: multipart/mixed;".$this->eol2." boundary=\"".$this->mixed_boundary."\"".$this->eol2;
1032
-		$out.= "Content-Transfer-Encoding: 8bit".$this->eol2;		// TODO Seems to be ignored. Header is 7bit once received.
1031
+		$out .= "Content-Type: multipart/mixed;".$this->eol2." boundary=\"".$this->mixed_boundary."\"".$this->eol2;
1032
+		$out .= "Content-Transfer-Encoding: 8bit".$this->eol2; // TODO Seems to be ignored. Header is 7bit once received.
1033 1033
 
1034 1034
 		dol_syslog("CMailFile::write_smtpheaders smtp_header=\n".$out);
1035 1035
 		return $out;
@@ -1047,18 +1047,18 @@  discard block
 block discarded – undo
1047 1047
 	function write_mimeheaders($filename_list, $mimefilename_list)
1048 1048
 	{
1049 1049
         // phpcs:enable
1050
-		$mimedone=0;
1050
+		$mimedone = 0;
1051 1051
 		$out = "";
1052 1052
 
1053 1053
 		if (is_array($filename_list))
1054 1054
 		{
1055
-			$filename_list_size=count($filename_list);
1056
-			for($i=0;$i < $filename_list_size;$i++)
1055
+			$filename_list_size = count($filename_list);
1056
+			for ($i = 0; $i < $filename_list_size; $i++)
1057 1057
 			{
1058 1058
 				if ($filename_list[$i])
1059 1059
 				{
1060 1060
 					if ($mimefilename_list[$i]) $filename_list[$i] = $mimefilename_list[$i];
1061
-					$out.= "X-attachments: $filename_list[$i]".$this->eol2;
1061
+					$out .= "X-attachments: $filename_list[$i]".$this->eol2;
1062 1062
 				}
1063 1063
 			}
1064 1064
 		}
@@ -1079,31 +1079,31 @@  discard block
 block discarded – undo
1079 1079
         // phpcs:enable
1080 1080
 		global $conf;
1081 1081
 
1082
-		$out='';
1082
+		$out = '';
1083 1083
 
1084
-		$out.= "--" . $this->mixed_boundary . $this->eol;
1084
+		$out .= "--".$this->mixed_boundary.$this->eol;
1085 1085
 
1086 1086
 		if ($this->atleastoneimage)
1087 1087
 		{
1088
-			$out.= "Content-Type: multipart/alternative;".$this->eol." boundary=\"".$this->alternative_boundary."\"".$this->eol;
1089
-			$out.= $this->eol;
1090
-			$out.= "--" . $this->alternative_boundary . $this->eol;
1088
+			$out .= "Content-Type: multipart/alternative;".$this->eol." boundary=\"".$this->alternative_boundary."\"".$this->eol;
1089
+			$out .= $this->eol;
1090
+			$out .= "--".$this->alternative_boundary.$this->eol;
1091 1091
 		}
1092 1092
 
1093 1093
 		// Make RFC821 Compliant, replace bare linefeeds
1094
-		$strContent = preg_replace("/(?<!\r)\n/si", "\r\n", $msgtext);	// PCRE modifier /s means new lines are common chars
1095
-		if (! empty($conf->global->MAIN_FIX_FOR_BUGGED_MTA))
1094
+		$strContent = preg_replace("/(?<!\r)\n/si", "\r\n", $msgtext); // PCRE modifier /s means new lines are common chars
1095
+		if (!empty($conf->global->MAIN_FIX_FOR_BUGGED_MTA))
1096 1096
 		{
1097
-			$strContent = preg_replace("/\r\n/si", "\n", $strContent);	// PCRE modifier /s means new lines are common chars
1097
+			$strContent = preg_replace("/\r\n/si", "\n", $strContent); // PCRE modifier /s means new lines are common chars
1098 1098
 		}
1099 1099
 
1100 1100
 		$strContentAltText = '';
1101 1101
 		if ($this->msgishtml)
1102 1102
 		{
1103 1103
 			// Similar code to forge a text from html is also in CMailFile.class.php
1104
-			$strContentAltText = preg_replace("/<br\s*[^>]*>/"," ", $strContent);
1104
+			$strContentAltText = preg_replace("/<br\s*[^>]*>/", " ", $strContent);
1105 1105
 			$strContentAltText = html_entity_decode(strip_tags($strContentAltText));
1106
-			$strContentAltText = rtrim(wordwrap($strContentAltText, 75, empty($conf->global->MAIN_FIX_FOR_BUGGED_MTA)?"\r\n":"\n"));
1106
+			$strContentAltText = rtrim(wordwrap($strContentAltText, 75, empty($conf->global->MAIN_FIX_FOR_BUGGED_MTA) ? "\r\n" : "\n"));
1107 1107
 
1108 1108
 			// Check if html header already in message, if not complete the message
1109 1109
 			$strContent = $this->checkIfHTML($strContent);
@@ -1112,57 +1112,57 @@  discard block
 block discarded – undo
1112 1112
 		// Make RFC2045 Compliant, split lines
1113 1113
 		//$strContent = rtrim(chunk_split($strContent));    // Function chunck_split seems ko if not used on a base64 content
1114 1114
 		// TODO Encode main content into base64 and use the chunk_split, or quoted-printable
1115
-		$strContent = rtrim(wordwrap($strContent, 75, empty($conf->global->MAIN_FIX_FOR_BUGGED_MTA)?"\r\n":"\n"));   // TODO Using this method creates unexpected line break on text/plain content.
1115
+		$strContent = rtrim(wordwrap($strContent, 75, empty($conf->global->MAIN_FIX_FOR_BUGGED_MTA) ? "\r\n" : "\n")); // TODO Using this method creates unexpected line break on text/plain content.
1116 1116
 
1117 1117
 		if ($this->msgishtml)
1118 1118
 		{
1119 1119
 			if ($this->atleastoneimage)
1120 1120
 			{
1121
-				$out.= "Content-Type: text/plain; charset=".$conf->file->character_set_client.$this->eol;
1121
+				$out .= "Content-Type: text/plain; charset=".$conf->file->character_set_client.$this->eol;
1122 1122
 				//$out.= "Content-Transfer-Encoding: 7bit".$this->eol;
1123
-				$out.= $this->eol.($strContentAltText?$strContentAltText:strip_tags($strContent)).$this->eol; // Add plain text message
1124
-				$out.= "--" . $this->alternative_boundary . $this->eol;
1125
-				$out.= "Content-Type: multipart/related;".$this->eol." boundary=\"".$this->related_boundary."\"".$this->eol;
1126
-				$out.= $this->eol;
1127
-				$out.= "--" . $this->related_boundary . $this->eol;
1123
+				$out .= $this->eol.($strContentAltText ? $strContentAltText : strip_tags($strContent)).$this->eol; // Add plain text message
1124
+				$out .= "--".$this->alternative_boundary.$this->eol;
1125
+				$out .= "Content-Type: multipart/related;".$this->eol." boundary=\"".$this->related_boundary."\"".$this->eol;
1126
+				$out .= $this->eol;
1127
+				$out .= "--".$this->related_boundary.$this->eol;
1128 1128
 			}
1129 1129
 
1130
-			if (! $this->atleastoneimage && $strContentAltText && ! empty($conf->global->MAIN_MAIL_USE_MULTI_PART))    // Add plain text message part before html part
1130
+			if (!$this->atleastoneimage && $strContentAltText && !empty($conf->global->MAIN_MAIL_USE_MULTI_PART))    // Add plain text message part before html part
1131 1131
 			{
1132
-				$out.= "Content-Type: multipart/alternative;".$this->eol." boundary=\"".$this->alternative_boundary."\"".$this->eol;
1133
-				$out.= $this->eol;
1134
-				$out.= "--" . $this->alternative_boundary . $this->eol;
1135
-				$out.= "Content-Type: text/plain; charset=".$conf->file->character_set_client.$this->eol;
1132
+				$out .= "Content-Type: multipart/alternative;".$this->eol." boundary=\"".$this->alternative_boundary."\"".$this->eol;
1133
+				$out .= $this->eol;
1134
+				$out .= "--".$this->alternative_boundary.$this->eol;
1135
+				$out .= "Content-Type: text/plain; charset=".$conf->file->character_set_client.$this->eol;
1136 1136
 				//$out.= "Content-Transfer-Encoding: 7bit".$this->eol;
1137
-				$out.= $this->eol.$strContentAltText.$this->eol;
1138
-				$out.= "--" . $this->alternative_boundary . $this->eol;
1137
+				$out .= $this->eol.$strContentAltText.$this->eol;
1138
+				$out .= "--".$this->alternative_boundary.$this->eol;
1139 1139
 			}
1140 1140
 
1141
-			$out.= "Content-Type: text/html; charset=".$conf->file->character_set_client.$this->eol;
1141
+			$out .= "Content-Type: text/html; charset=".$conf->file->character_set_client.$this->eol;
1142 1142
 			//$out.= "Content-Transfer-Encoding: 7bit".$this->eol;	// TODO Use base64
1143
-			$out.= $this->eol.$strContent.$this->eol;
1143
+			$out .= $this->eol.$strContent.$this->eol;
1144 1144
 
1145
-			if (! $this->atleastoneimage && $strContentAltText && ! empty($conf->global->MAIN_MAIL_USE_MULTI_PART))    // Add plain text message part after html part
1145
+			if (!$this->atleastoneimage && $strContentAltText && !empty($conf->global->MAIN_MAIL_USE_MULTI_PART))    // Add plain text message part after html part
1146 1146
 			{
1147
-				$out.= "--" . $this->alternative_boundary . "--". $this->eol;
1147
+				$out .= "--".$this->alternative_boundary."--".$this->eol;
1148 1148
 			}
1149 1149
 		}
1150 1150
 		else
1151 1151
 		{
1152
-			$out.= "Content-Type: text/plain; charset=".$conf->file->character_set_client.$this->eol;
1152
+			$out .= "Content-Type: text/plain; charset=".$conf->file->character_set_client.$this->eol;
1153 1153
 			//$out.= "Content-Transfer-Encoding: 7bit".$this->eol;
1154
-			$out.= $this->eol.$strContent.$this->eol;
1154
+			$out .= $this->eol.$strContent.$this->eol;
1155 1155
 		}
1156 1156
 
1157
-		$out.= $this->eol;
1157
+		$out .= $this->eol;
1158 1158
 
1159 1159
 		// Encode images
1160 1160
 		if ($this->atleastoneimage)
1161 1161
 		{
1162 1162
 			$out .= $this->write_images($this->images_encoded);
1163 1163
 			// always end related and end alternative after inline images
1164
-			$out .= "--" . $this->related_boundary . "--" . $this->eol;
1165
-			$out .= $this->eol . "--" . $this->alternative_boundary . "--" . $this->eol;
1164
+			$out .= "--".$this->related_boundary."--".$this->eol;
1165
+			$out .= $this->eol."--".$this->alternative_boundary."--".$this->eol;
1166 1166
 			$out .= $this->eol;
1167 1167
 		}
1168 1168
 
@@ -1178,13 +1178,13 @@  discard block
 block discarded – undo
1178 1178
 	 * @param 	array	$mimefilename_list	Tableau
1179 1179
 	 * @return	string						Chaine fichiers encodes
1180 1180
 	 */
1181
-	function write_files($filename_list,$mimetype_list,$mimefilename_list)
1181
+	function write_files($filename_list, $mimetype_list, $mimefilename_list)
1182 1182
 	{
1183 1183
         // phpcs:enable
1184 1184
 		$out = '';
1185 1185
 
1186
-		$filename_list_size=count($filename_list);
1187
-		for($i=0;$i < $filename_list_size;$i++)
1186
+		$filename_list_size = count($filename_list);
1187
+		for ($i = 0; $i < $filename_list_size; $i++)
1188 1188
 		{
1189 1189
 			if ($filename_list[$i])
1190 1190
 			{
@@ -1193,18 +1193,18 @@  discard block
 block discarded – undo
1193 1193
 				if ($encoded >= 0)
1194 1194
 				{
1195 1195
 					if ($mimefilename_list[$i]) $filename_list[$i] = $mimefilename_list[$i];
1196
-					if (! $mimetype_list[$i]) {
1196
+					if (!$mimetype_list[$i]) {
1197 1197
 						$mimetype_list[$i] = "application/octet-stream";
1198 1198
 					}
1199 1199
 
1200
-					$out.= "--" . $this->mixed_boundary . $this->eol;
1201
-					$out.= "Content-Disposition: attachment; filename=\"".$filename_list[$i]."\"".$this->eol;
1202
-					$out.= "Content-Type: " . $mimetype_list[$i] . "; name=\"".$filename_list[$i]."\"".$this->eol;
1203
-					$out.= "Content-Transfer-Encoding: base64".$this->eol;
1204
-					$out.= "Content-Description: ".$filename_list[$i].$this->eol;
1205
-					$out.= $this->eol;
1206
-					$out.= $encoded;
1207
-					$out.= $this->eol;
1200
+					$out .= "--".$this->mixed_boundary.$this->eol;
1201
+					$out .= "Content-Disposition: attachment; filename=\"".$filename_list[$i]."\"".$this->eol;
1202
+					$out .= "Content-Type: ".$mimetype_list[$i]."; name=\"".$filename_list[$i]."\"".$this->eol;
1203
+					$out .= "Content-Transfer-Encoding: base64".$this->eol;
1204
+					$out .= "Content-Description: ".$filename_list[$i].$this->eol;
1205
+					$out .= $this->eol;
1206
+					$out .= $encoded;
1207
+					$out .= $this->eol;
1208 1208
 					//$out.= $this->eol;
1209 1209
 				}
1210 1210
 				else
@@ -1236,14 +1236,14 @@  discard block
 block discarded – undo
1236 1236
 			{
1237 1237
 				dol_syslog("CMailFile::write_images: ".$img["name"]);
1238 1238
 
1239
-				$out.= "--" . $this->related_boundary . $this->eol; // always related for an inline image
1240
-				$out.= "Content-Type: " . $img["content_type"] . "; name=\"".$img["name"]."\"".$this->eol;
1241
-				$out.= "Content-Transfer-Encoding: base64".$this->eol;
1242
-				$out.= "Content-Disposition: inline; filename=\"".$img["name"]."\"".$this->eol;
1243
-				$out.= "Content-ID: <".$img["cid"].">".$this->eol;
1244
-				$out.= $this->eol;
1245
-				$out.= $img["image_encoded"];
1246
-				$out.= $this->eol;
1239
+				$out .= "--".$this->related_boundary.$this->eol; // always related for an inline image
1240
+				$out .= "Content-Type: ".$img["content_type"]."; name=\"".$img["name"]."\"".$this->eol;
1241
+				$out .= "Content-Transfer-Encoding: base64".$this->eol;
1242
+				$out .= "Content-Disposition: inline; filename=\"".$img["name"]."\"".$this->eol;
1243
+				$out .= "Content-ID: <".$img["cid"].">".$this->eol;
1244
+				$out .= $this->eol;
1245
+				$out .= $img["image_encoded"];
1246
+				$out .= $this->eol;
1247 1247
 			}
1248 1248
 		}
1249 1249
 
@@ -1259,44 +1259,44 @@  discard block
 block discarded – undo
1259 1259
 	 * @param 	int			$port		Example: 25, 465
1260 1260
 	 * @return	int						Socket id if ok, 0 if KO
1261 1261
 	 */
1262
-	function check_server_port($host,$port)
1262
+	function check_server_port($host, $port)
1263 1263
 	{
1264 1264
         // phpcs:enable
1265 1265
 		global $conf;
1266 1266
 
1267
-		$_retVal=0;
1268
-		$timeout=5;	// Timeout in seconds
1267
+		$_retVal = 0;
1268
+		$timeout = 5; // Timeout in seconds
1269 1269
 
1270 1270
 		if (function_exists('fsockopen'))
1271 1271
 		{
1272
-			$keyforsmtpserver='MAIN_MAIL_SMTP_SERVER';
1273
-			$keyforsmtpport  ='MAIN_MAIL_SMTP_PORT';
1274
-			$keyforsmtpid    ='MAIN_MAIL_SMTPS_ID';
1275
-			$keyforsmtppw    ='MAIN_MAIL_SMTPS_PW';
1276
-			$keyfortls       ='MAIN_MAIL_EMAIL_TLS';
1277
-			$keyforstarttls  ='MAIN_MAIL_EMAIL_STARTTLS';
1272
+			$keyforsmtpserver = 'MAIN_MAIL_SMTP_SERVER';
1273
+			$keyforsmtpport  = 'MAIN_MAIL_SMTP_PORT';
1274
+			$keyforsmtpid    = 'MAIN_MAIL_SMTPS_ID';
1275
+			$keyforsmtppw    = 'MAIN_MAIL_SMTPS_PW';
1276
+			$keyfortls       = 'MAIN_MAIL_EMAIL_TLS';
1277
+			$keyforstarttls  = 'MAIN_MAIL_EMAIL_STARTTLS';
1278 1278
 			if ($this->sendcontext == 'emailing' && !empty($conf->global->MAIN_MAIL_SENDMODE_EMAILING) && $conf->global->MAIN_MAIL_SENDMODE_EMAILING != 'default')
1279 1279
 			{
1280
-				$keyforsmtpserver='MAIN_MAIL_SMTP_SERVER_EMAILING';
1281
-				$keyforsmtpport  ='MAIN_MAIL_SMTP_PORT_EMAILING';
1282
-				$keyforsmtpid    ='MAIN_MAIL_SMTPS_ID_EMAILING';
1283
-				$keyforsmtppw    ='MAIN_MAIL_SMTPS_PW_EMAILING';
1284
-				$keyfortls       ='MAIN_MAIL_EMAIL_TLS_EMAILING';
1285
-				$keyforstarttls  ='MAIN_MAIL_EMAIL_STARTTLS_EMAILING';
1280
+				$keyforsmtpserver = 'MAIN_MAIL_SMTP_SERVER_EMAILING';
1281
+				$keyforsmtpport  = 'MAIN_MAIL_SMTP_PORT_EMAILING';
1282
+				$keyforsmtpid    = 'MAIN_MAIL_SMTPS_ID_EMAILING';
1283
+				$keyforsmtppw    = 'MAIN_MAIL_SMTPS_PW_EMAILING';
1284
+				$keyfortls       = 'MAIN_MAIL_EMAIL_TLS_EMAILING';
1285
+				$keyforstarttls  = 'MAIN_MAIL_EMAIL_STARTTLS_EMAILING';
1286 1286
 			}
1287 1287
 
1288 1288
 			// If we use SSL/TLS
1289
-			if (! empty($conf->global->$keyfortls) && function_exists('openssl_open')) $host='ssl://'.$host;
1289
+			if (!empty($conf->global->$keyfortls) && function_exists('openssl_open')) $host = 'ssl://'.$host;
1290 1290
 			// tls smtp start with no encryption
1291 1291
 			//if (! empty($conf->global->MAIN_MAIL_EMAIL_STARTTLS) && function_exists('openssl_open')) $host='tls://'.$host;
1292 1292
 
1293 1293
 			dol_syslog("Try socket connection to host=".$host." port=".$port);
1294 1294
 			//See if we can connect to the SMTP server
1295 1295
 			if ($socket = @fsockopen(
1296
-					$host,       // Host to test, IP or domain. Add ssl:// for SSL/TLS.
1297
-					$port,       // which Port number to use
1298
-					$errno,      // actual system level error
1299
-					$errstr,     // and any text that goes with the error
1296
+					$host, // Host to test, IP or domain. Add ssl:// for SSL/TLS.
1297
+					$port, // which Port number to use
1298
+					$errno, // actual system level error
1299
+					$errstr, // and any text that goes with the error
1300 1300
 					$timeout
1301 1301
 			))  // timeout for reading/writing data over the socket
1302 1302
 			{
@@ -1306,11 +1306,11 @@  discard block
 block discarded – undo
1306 1306
 				dol_syslog("Now we wait for answer 220");
1307 1307
 
1308 1308
 				// Check response from Server
1309
-				if ( $_retVal = $this->server_parse($socket, "220") ) $_retVal = $socket;
1309
+				if ($_retVal = $this->server_parse($socket, "220")) $_retVal = $socket;
1310 1310
 			}
1311 1311
 			else
1312 1312
 			{
1313
-				$this->error = utf8_check('Error '.$errno.' - '.$errstr)?'Error '.$errno.' - '.$errstr:utf8_encode('Error '.$errno.' - '.$errstr);
1313
+				$this->error = utf8_check('Error '.$errno.' - '.$errstr) ? 'Error '.$errno.' - '.$errstr : utf8_encode('Error '.$errno.' - '.$errstr);
1314 1314
 			}
1315 1315
 		}
1316 1316
 		return $_retVal;
@@ -1328,21 +1328,21 @@  discard block
 block discarded – undo
1328 1328
 	function server_parse($socket, $response)
1329 1329
 	{
1330 1330
         // phpcs:enable
1331
-		$_retVal = true;	// Indicates if Object was created or not
1331
+		$_retVal = true; // Indicates if Object was created or not
1332 1332
 		$server_response = '';
1333 1333
 
1334
-		while (substr($server_response,3,1) != ' ')
1334
+		while (substr($server_response, 3, 1) != ' ')
1335 1335
 		{
1336
-			if (! ($server_response = fgets($socket, 256)) )
1336
+			if (!($server_response = fgets($socket, 256)))
1337 1337
 			{
1338
-				$this->error="Couldn't get mail server response codes";
1338
+				$this->error = "Couldn't get mail server response codes";
1339 1339
 				return false;
1340 1340
 			}
1341 1341
 		}
1342 1342
 
1343
-		if( !( substr($server_response, 0, 3) == $response ) )
1343
+		if (!(substr($server_response, 0, 3) == $response))
1344 1344
 		{
1345
-			$this->error="Ran into problems sending Mail.\r\nResponse: $server_response";
1345
+			$this->error = "Ran into problems sending Mail.\r\nResponse: $server_response";
1346 1346
 			$_retVal = false;
1347 1347
 		}
1348 1348
 
@@ -1361,22 +1361,22 @@  discard block
 block discarded – undo
1361 1361
 		$extensions = array_keys($this->image_types);
1362 1362
 
1363 1363
 		$matches = array();
1364
-		preg_match_all('/(?:"|\')([^"\']+\.('.implode('|', $extensions).'))(?:"|\')/Ui', $this->html, $matches);  // If "xxx.ext" or 'xxx.ext' found
1364
+		preg_match_all('/(?:"|\')([^"\']+\.('.implode('|', $extensions).'))(?:"|\')/Ui', $this->html, $matches); // If "xxx.ext" or 'xxx.ext' found
1365 1365
 
1366
-		if (! empty($matches))
1366
+		if (!empty($matches))
1367 1367
 		{
1368
-			$i=0;
1368
+			$i = 0;
1369 1369
 			foreach ($matches[1] as $full)
1370 1370
 			{
1371 1371
 
1372
-				if (preg_match('/file=([A-Za-z0-9_\-\/]+[\.]?[A-Za-z0-9]+)?$/i',$full,$regs))   // If xxx is 'file=aaa'
1372
+				if (preg_match('/file=([A-Za-z0-9_\-\/]+[\.]?[A-Za-z0-9]+)?$/i', $full, $regs))   // If xxx is 'file=aaa'
1373 1373
 				{
1374 1374
 					$img = $regs[1];
1375 1375
 
1376 1376
 					if (file_exists($images_dir.'/'.$img))
1377 1377
 					{
1378 1378
 						// Image path in src
1379
-						$src = preg_quote($full,'/');
1379
+						$src = preg_quote($full, '/');
1380 1380
 
1381 1381
 						// Image full path
1382 1382
 						$this->html_images[$i]["fullpath"] = $images_dir.'/'.$img;
@@ -1387,12 +1387,12 @@  discard block
 block discarded – undo
1387 1387
 						// Content type
1388 1388
 						if (preg_match('/^.+\.(\w{3,4})$/', $img, $reg))
1389 1389
 						{
1390
-							$ext=strtolower($reg[1]);
1390
+							$ext = strtolower($reg[1]);
1391 1391
 							$this->html_images[$i]["content_type"] = $this->image_types[$ext];
1392 1392
 						}
1393 1393
 
1394 1394
 						// cid
1395
-						$this->html_images[$i]["cid"] = dol_hash(uniqid(time()), 3);	// Force md5 hash (does not contains special chars)
1395
+						$this->html_images[$i]["cid"] = dol_hash(uniqid(time()), 3); // Force md5 hash (does not contains special chars)
1396 1396
 						$this->html = preg_replace("/src=\"$src\"|src='$src'/i", "src=\"cid:".$this->html_images[$i]["cid"]."\"", $this->html);
1397 1397
 					}
1398 1398
 					$i++;
@@ -1403,20 +1403,20 @@  discard block
 block discarded – undo
1403 1403
 			{
1404 1404
 				$inline = array();
1405 1405
 
1406
-				$i=0;
1406
+				$i = 0;
1407 1407
 
1408 1408
 				foreach ($this->html_images as $img)
1409 1409
 				{
1410 1410
 					$fullpath = $images_dir.'/'.$img["name"];
1411 1411
 
1412 1412
 					// If duplicate images are embedded, they may show up as attachments, so remove them.
1413
-					if (!in_array($fullpath,$inline))
1413
+					if (!in_array($fullpath, $inline))
1414 1414
 					{
1415 1415
 						// Read image file
1416 1416
 						if ($image = file_get_contents($fullpath))
1417 1417
 						{
1418 1418
 							// On garde que le nom de l'image
1419
-							preg_match('/([A-Za-z0-9_-]+[\.]?[A-Za-z0-9]+)?$/i',$img["name"],$regs);
1419
+							preg_match('/([A-Za-z0-9_-]+[\.]?[A-Za-z0-9]+)?$/i', $img["name"], $regs);
1420 1420
 							$imgName = $regs[1];
1421 1421
 
1422 1422
 							$this->images_encoded[$i]['name'] = $imgName;
@@ -1457,19 +1457,19 @@  discard block
 block discarded – undo
1457 1457
 	 *										     If format 3: '<[email protected]>' or '"John Doe" <[email protected]>' or '"=?UTF-8?B?Sm9obiBEb2U=?=" <[email protected]>'
1458 1458
 	 *                                           If format 4: 'John Doe' or '[email protected]' if no label exists
1459 1459
 	 */
1460
-	static function getValidAddress($address,$format,$encode=0,$maxnumberofemail=0)
1460
+	static function getValidAddress($address, $format, $encode = 0, $maxnumberofemail = 0)
1461 1461
 	{
1462 1462
 		global $conf;
1463 1463
 
1464
-		$ret='';
1464
+		$ret = '';
1465 1465
 
1466
-		$arrayaddress=explode(',',$address);
1466
+		$arrayaddress = explode(',', $address);
1467 1467
 
1468 1468
 		// Boucle sur chaque composant de l'adresse
1469
-		$i=0;
1470
-		foreach($arrayaddress as $val)
1469
+		$i = 0;
1470
+		foreach ($arrayaddress as $val)
1471 1471
 		{
1472
-			if (preg_match('/^(.*)<(.*)>$/i',trim($val),$regs))
1472
+			if (preg_match('/^(.*)<(.*)>$/i', trim($val), $regs))
1473 1473
 			{
1474 1474
 				$name  = trim($regs[1]);
1475 1475
 				$email = trim($regs[2]);
@@ -1484,32 +1484,32 @@  discard block
 block discarded – undo
1484 1484
 			{
1485 1485
 				$i++;
1486 1486
 
1487
-				$newemail='';
1487
+				$newemail = '';
1488 1488
 				if ($format == 4)
1489 1489
 				{
1490
-					$newemail = $name?$name:$email;
1490
+					$newemail = $name ? $name : $email;
1491 1491
 				}
1492 1492
 				if ($format == 2)
1493 1493
 				{
1494
-					$newemail=$email;
1494
+					$newemail = $email;
1495 1495
 				}
1496 1496
 				if ($format == 1 || $format == 3)
1497 1497
 				{
1498
-					$newemail='<'.$email.'>';
1498
+					$newemail = '<'.$email.'>';
1499 1499
 				}
1500 1500
 				if ($format == 0 || $format == 3)
1501 1501
 				{
1502
-					if (! empty($conf->global->MAIN_MAIL_NO_FULL_EMAIL)) $newemail='<'.$email.'>';
1503
-					elseif (! $name) $newemail='<'.$email.'>';
1504
-					else $newemail=($format==3?'"':'').($encode?self::encodetorfc2822($name):$name).($format==3?'"':'').' <'.$email.'>';
1502
+					if (!empty($conf->global->MAIN_MAIL_NO_FULL_EMAIL)) $newemail = '<'.$email.'>';
1503
+					elseif (!$name) $newemail = '<'.$email.'>';
1504
+					else $newemail = ($format == 3 ? '"' : '').($encode ?self::encodetorfc2822($name) : $name).($format == 3 ? '"' : '').' <'.$email.'>';
1505 1505
 				}
1506 1506
 
1507
-				$ret=($ret ? $ret.',' : '').$newemail;
1507
+				$ret = ($ret ? $ret.',' : '').$newemail;
1508 1508
 
1509 1509
 				// Stop if we have too much records
1510 1510
 				if ($maxnumberofemail && $i >= $maxnumberofemail)
1511 1511
 				{
1512
-					if (count($arrayaddress) > $maxnumberofemail) $ret.='...';
1512
+					if (count($arrayaddress) > $maxnumberofemail) $ret .= '...';
1513 1513
 					break;
1514 1514
 				}
1515 1515
 			}
@@ -1528,14 +1528,14 @@  discard block
 block discarded – undo
1528 1528
 	{
1529 1529
 		global $conf;
1530 1530
 
1531
-		$ret=array();
1531
+		$ret = array();
1532 1532
 
1533
-		$arrayaddress=explode(',',$address);
1533
+		$arrayaddress = explode(',', $address);
1534 1534
 
1535 1535
 		// Boucle sur chaque composant de l'adresse
1536
-		foreach($arrayaddress as $val)
1536
+		foreach ($arrayaddress as $val)
1537 1537
 		{
1538
-			if (preg_match('/^(.*)<(.*)>$/i',trim($val),$regs))
1538
+			if (preg_match('/^(.*)<(.*)>$/i', trim($val), $regs))
1539 1539
 			{
1540 1540
 				$name  = trim($regs[1]);
1541 1541
 				$email = trim($regs[2]);
@@ -1546,7 +1546,7 @@  discard block
 block discarded – undo
1546 1546
 				$email = trim($val);
1547 1547
 			}
1548 1548
 
1549
-			$ret[$email]=empty($conf->global->MAIN_MAIL_NO_FULL_EMAIL)?$name:null;
1549
+			$ret[$email] = empty($conf->global->MAIN_MAIL_NO_FULL_EMAIL) ? $name : null;
1550 1550
 		}
1551 1551
 
1552 1552
 		return $ret;
Please login to merge, or discard this patch.
Braces   +221 added lines, -113 removed lines patch added patch discarded remove patch
@@ -125,7 +125,9 @@  discard block
 block discarded – undo
125 125
 
126 126
 		$this->sendcontext = $sendcontext;
127 127
 
128
-		if (empty($replyto)) $replyto=$from;
128
+		if (empty($replyto)) {
129
+		    $replyto=$from;
130
+		}
129 131
 
130 132
 		// Define this->sendmode
131 133
 		$this->sendmode = '';
@@ -133,8 +135,12 @@  discard block
 block discarded – undo
133 135
 		{
134 136
 			$this->sendmode = $conf->global->MAIN_MAIL_SENDMODE_EMAILING;
135 137
 		}
136
-		if (empty($this->sendmode)) $this->sendmode=$conf->global->MAIN_MAIL_SENDMODE;
137
-		if (empty($this->sendmode)) $this->sendmode='mail';
138
+		if (empty($this->sendmode)) {
139
+		    $this->sendmode=$conf->global->MAIN_MAIL_SENDMODE;
140
+		}
141
+		if (empty($this->sendmode)) {
142
+		    $this->sendmode='mail';
143
+		}
138 144
 
139 145
 		// We define end of line (RFC 821).
140 146
 		$this->eol="\r\n";
@@ -175,9 +181,10 @@  discard block
 block discarded – undo
175 181
 		if ($msgishtml == -1)
176 182
 		{
177 183
 			$this->msgishtml = 0;
178
-			if (dol_textishtml($msg)) $this->msgishtml = 1;
179
-		}
180
-		else
184
+			if (dol_textishtml($msg)) {
185
+			    $this->msgishtml = 1;
186
+			}
187
+		} else
181 188
 		{
182 189
 			$this->msgishtml = $msgishtml;
183 190
 		}
@@ -192,7 +199,10 @@  discard block
 block discarded – undo
192 199
 		// Replace relative /viewimage to absolute path
193 200
 		$msg = preg_replace('/src="'.preg_quote(DOL_URL_ROOT,'/').'\/viewimage\.php/ims', 'src="'.$urlwithroot.'/viewimage.php', $msg, -1, $nbrep);
194 201
 
195
-		if (! empty($conf->global->MAIN_MAIL_FORCE_CONTENT_TYPE_TO_HTML)) $this->msgishtml=1; // To force to send everything with content type html.
202
+		if (! empty($conf->global->MAIN_MAIL_FORCE_CONTENT_TYPE_TO_HTML)) {
203
+		    $this->msgishtml=1;
204
+		}
205
+		// To force to send everything with content type html.
196 206
 
197 207
 		// Detect images
198 208
 		if ($this->msgishtml)
@@ -232,7 +242,9 @@  discard block
 block discarded – undo
232 242
 		}
233 243
 
234 244
 		// Add autocopy to (Note: Adding bcc for specific modules are also done from pages)
235
-		if (! empty($conf->global->MAIN_MAIL_AUTOCOPY_TO)) $addr_bcc.=($addr_bcc?', ':'').$conf->global->MAIN_MAIL_AUTOCOPY_TO;
245
+		if (! empty($conf->global->MAIN_MAIL_AUTOCOPY_TO)) {
246
+		    $addr_bcc.=($addr_bcc?', ':'').$conf->global->MAIN_MAIL_AUTOCOPY_TO;
247
+		}
236 248
 
237 249
 		// Action according to choosed sending method
238 250
 		if ($this->sendmode == 'mail')
@@ -257,7 +269,10 @@  discard block
 block discarded – undo
257 269
 			$this->trackid = $trackid;
258 270
 
259 271
 			$smtp_headers = $this->write_smtpheaders();
260
-			if (! empty($moreinheader)) $smtp_headers.=$moreinheader;   // $moreinheader contains the \r\n
272
+			if (! empty($moreinheader)) {
273
+			    $smtp_headers.=$moreinheader;
274
+			}
275
+			// $moreinheader contains the \r\n
261 276
 
262 277
 			// Define mime_headers
263 278
 			$mime_headers = $this->write_mimeheaders($filename_list, $mimefilename_list);
@@ -293,8 +308,7 @@  discard block
 block discarded – undo
293 308
 			$this->message = 'This is a message with multiple parts in MIME format.'.$this->eol;
294 309
 			$this->message.= $text_body . $files_encoded;
295 310
 			$this->message.= "--" . $this->mixed_boundary . "--" . $this->eol;
296
-		}
297
-		else if ($this->sendmode == 'smtps')
311
+		} else if ($this->sendmode == 'smtps')
298 312
 		{
299 313
 			// Use SMTPS library
300 314
 			// ------------------------------------------
@@ -309,7 +323,9 @@  discard block
 block discarded – undo
309 323
 			$smtps->setTrackId($trackid);
310 324
 			$smtps->setReplyTo($this->getValidAddress($replyto,0,1));
311 325
 
312
-			if (! empty($moreinheader)) $smtps->setMoreInHeader($moreinheader);
326
+			if (! empty($moreinheader)) {
327
+			    $smtps->setMoreInHeader($moreinheader);
328
+			}
313 329
 
314 330
 			if (! empty($this->html))
315 331
 			{
@@ -322,8 +338,11 @@  discard block
 block discarded – undo
322 338
 				$msg = $this->checkIfHTML($msg);
323 339
 			}
324 340
 
325
-			if ($this->msgishtml) $smtps->setBodyContent($msg,'html');
326
-			else $smtps->setBodyContent($msg,'plain');
341
+			if ($this->msgishtml) {
342
+			    $smtps->setBodyContent($msg,'html');
343
+			} else {
344
+			    $smtps->setBodyContent($msg,'plain');
345
+			}
327 346
 
328 347
 			if ($this->atleastoneimage)
329 348
 			{
@@ -348,8 +367,7 @@  discard block
 block discarded – undo
348 367
 			$smtps->setDeliveryReceipt($deliveryreceipt);
349 368
 
350 369
 			$this->smtps=$smtps;
351
-		}
352
-		else if ($this->sendmode == 'swiftmailer')
370
+		} else if ($this->sendmode == 'swiftmailer')
353 371
 		{
354 372
 			// Use Swift Mailer library
355 373
 			// ------------------------------------------
@@ -474,12 +492,17 @@  discard block
 block discarded – undo
474 492
 				}
475 493
 			}
476 494
 
477
-			if (! empty($addr_cc)) $this->message->setCc($this->getArrayAddress($addr_cc));
478
-			if (! empty($addr_bcc)) $this->message->setBcc($this->getArrayAddress($addr_bcc));
495
+			if (! empty($addr_cc)) {
496
+			    $this->message->setCc($this->getArrayAddress($addr_cc));
497
+			}
498
+			if (! empty($addr_bcc)) {
499
+			    $this->message->setBcc($this->getArrayAddress($addr_bcc));
500
+			}
479 501
 			//if (! empty($errors_to)) $this->message->setErrorsTo($this->getArrayAddress($errors_to);
480
-			if (isset($deliveryreceipt) && $deliveryreceipt == 1) $this->message->setReadReceiptTo($this->getArrayAddress($from));
481
-		}
482
-		else
502
+			if (isset($deliveryreceipt) && $deliveryreceipt == 1) {
503
+			    $this->message->setReadReceiptTo($this->getArrayAddress($from));
504
+			}
505
+		} else
483 506
 		{
484 507
 			// Send mail method not correctly defined
485 508
 			// --------------------------------------
@@ -517,13 +540,17 @@  discard block
 block discarded – undo
517 540
 
518 541
 				return $reshook;
519 542
 			}
520
-			if ($reshook == 1)	// Hook replace standard code
543
+			if ($reshook == 1) {
544
+			    // Hook replace standard code
521 545
 			{
522 546
 				return true;
523 547
 			}
548
+			}
524 549
 
525 550
 			// Check number of recipient is lower or equal than MAIL_MAX_NB_OF_RECIPIENTS_IN_SAME_EMAIL
526
-			if (empty($conf->global->MAIL_MAX_NB_OF_RECIPIENTS_TO_IN_SAME_EMAIL)) $conf->global->MAIL_MAX_NB_OF_RECIPIENTS_TO_IN_SAME_EMAIL=10;
551
+			if (empty($conf->global->MAIL_MAX_NB_OF_RECIPIENTS_TO_IN_SAME_EMAIL)) {
552
+			    $conf->global->MAIL_MAX_NB_OF_RECIPIENTS_TO_IN_SAME_EMAIL=10;
553
+			}
527 554
 			$tmparray1 = explode(',', $this->addr_to);
528 555
 			if (count($tmparray1) > $conf->global->MAIL_MAX_NB_OF_RECIPIENTS_TO_IN_SAME_EMAIL)
529 556
 			{
@@ -531,7 +558,9 @@  discard block
 block discarded – undo
531 558
 				dol_syslog("CMailFile::sendfile: mail end error=" . $this->error, LOG_WARNING);
532 559
 				return false;
533 560
 			}
534
-			if (empty($conf->global->MAIL_MAX_NB_OF_RECIPIENTS_CC_IN_SAME_EMAIL)) $conf->global->MAIL_MAX_NB_OF_RECIPIENTS_CC_IN_SAME_EMAIL=10;
561
+			if (empty($conf->global->MAIL_MAX_NB_OF_RECIPIENTS_CC_IN_SAME_EMAIL)) {
562
+			    $conf->global->MAIL_MAX_NB_OF_RECIPIENTS_CC_IN_SAME_EMAIL=10;
563
+			}
535 564
 			$tmparray2 = explode(',', $this->addr_cc);
536 565
 			if (count($tmparray2) > $conf->global->MAIL_MAX_NB_OF_RECIPIENTS_CC_IN_SAME_EMAIL)
537 566
 			{
@@ -539,7 +568,9 @@  discard block
 block discarded – undo
539 568
 				dol_syslog("CMailFile::sendfile: mail end error=" . $this->error, LOG_WARNING);
540 569
 				return false;
541 570
 			}
542
-			if (empty($conf->global->MAIL_MAX_NB_OF_RECIPIENTS_BCC_IN_SAME_EMAIL)) $conf->global->MAIL_MAX_NB_OF_RECIPIENTS_BCC_IN_SAME_EMAIL=10;
571
+			if (empty($conf->global->MAIL_MAX_NB_OF_RECIPIENTS_BCC_IN_SAME_EMAIL)) {
572
+			    $conf->global->MAIL_MAX_NB_OF_RECIPIENTS_BCC_IN_SAME_EMAIL=10;
573
+			}
543 574
 			$tmparray3 = explode(',', $this->addr_bcc);
544 575
 			if (count($tmparray3) > $conf->global->MAIL_MAX_NB_OF_RECIPIENTS_BCC_IN_SAME_EMAIL)
545 576
 			{
@@ -547,7 +578,9 @@  discard block
 block discarded – undo
547 578
 				dol_syslog("CMailFile::sendfile: mail end error=" . $this->error, LOG_WARNING);
548 579
 				return false;
549 580
 			}
550
-			if (empty($conf->global->MAIL_MAX_NB_OF_RECIPIENTS_IN_SAME_EMAIL)) $conf->global->MAIL_MAX_NB_OF_RECIPIENTS_IN_SAME_EMAIL=10;
581
+			if (empty($conf->global->MAIL_MAX_NB_OF_RECIPIENTS_IN_SAME_EMAIL)) {
582
+			    $conf->global->MAIL_MAX_NB_OF_RECIPIENTS_IN_SAME_EMAIL=10;
583
+			}
551 584
 			if ((count($tmparray1)+count($tmparray2)+count($tmparray3)) > $conf->global->MAIL_MAX_NB_OF_RECIPIENTS_IN_SAME_EMAIL)
552 585
 			{
553 586
 				$this->error = 'Too much recipients in to:, cc:, bcc:';
@@ -590,13 +623,19 @@  discard block
 block discarded – undo
590 623
 				// If Windows, sendmail_from must be defined
591 624
 				if (isset($_SERVER["WINDIR"]))
592 625
 				{
593
-					if (empty($this->addr_from)) $this->addr_from = '[email protected]';
626
+					if (empty($this->addr_from)) {
627
+					    $this->addr_from = '[email protected]';
628
+					}
594 629
 					@ini_set('sendmail_from',$this->getValidAddress($this->addr_from,2));
595 630
 				}
596 631
 
597 632
 				// Force parameters
598
-				if (! empty($conf->global->$keyforsmtpserver)) ini_set('SMTP',$conf->global->$keyforsmtpserver);
599
-				if (! empty($conf->global->$keyforsmtpport))   ini_set('smtp_port',$conf->global->$keyforsmtpport);
633
+				if (! empty($conf->global->$keyforsmtpserver)) {
634
+				    ini_set('SMTP',$conf->global->$keyforsmtpserver);
635
+				}
636
+				if (! empty($conf->global->$keyforsmtpport)) {
637
+				    ini_set('smtp_port',$conf->global->$keyforsmtpport);
638
+				}
600 639
 
601 640
 				$res=true;
602 641
 				if ($res && ! $this->subject)
@@ -624,29 +663,43 @@  discard block
 block discarded – undo
624 663
 						// Having this variable not defined may create problems with some other sendmail (option -f required)
625 664
 						$additionnalparam .= ($additionnalparam?' ':'').(! empty($conf->global->MAIN_MAIL_ERRORS_TO) ? '-f' . $this->getValidAddress($conf->global->MAIN_MAIL_ERRORS_TO,2) : ($this->addr_from != '' ? '-f' . $this->getValidAddress($this->addr_from,2) : '') );
626 665
 					}
627
-					if (! empty($conf->global->MAIN_MAIL_SENDMAIL_FORCE_BA))    // To force usage of -ba option. This option tells sendmail to read From: or Sender: to setup sender
666
+					if (! empty($conf->global->MAIN_MAIL_SENDMAIL_FORCE_BA)) {
667
+					    // To force usage of -ba option. This option tells sendmail to read From: or Sender: to setup sender
628 668
 					{
629 669
 						$additionnalparam .= ($additionnalparam?' ':'').'-ba';
630 670
 					}
671
+					}
631 672
 
632
-					if (! empty($conf->global->MAIN_MAIL_SENDMAIL_FORCE_ADDPARAM)) $additionnalparam .= ($additionnalparam?' ':'').'-U '.$additionnalparam; // Use -U to add additionnal params
673
+					if (! empty($conf->global->MAIN_MAIL_SENDMAIL_FORCE_ADDPARAM)) {
674
+					    $additionnalparam .= ($additionnalparam?' ':'').'-U '.$additionnalparam;
675
+					}
676
+					// Use -U to add additionnal params
633 677
 
634 678
 					dol_syslog("CMailFile::sendfile: mail start HOST=".ini_get('SMTP').", PORT=".ini_get('smtp_port').", additionnal_parameters=".$additionnalparam, LOG_DEBUG);
635 679
 
636 680
 					$this->message=stripslashes($this->message);
637 681
 
638
-					if (! empty($conf->global->MAIN_MAIL_DEBUG)) $this->dump_mail();
682
+					if (! empty($conf->global->MAIN_MAIL_DEBUG)) {
683
+					    $this->dump_mail();
684
+					}
639 685
 
640
-					if (! empty($additionnalparam)) $res = mail($dest, $this->encodetorfc2822($this->subject), $this->message, $this->headers, $additionnalparam);
641
-					else $res = mail($dest, $this->encodetorfc2822($this->subject), $this->message, $this->headers);
686
+					if (! empty($additionnalparam)) {
687
+					    $res = mail($dest, $this->encodetorfc2822($this->subject), $this->message, $this->headers, $additionnalparam);
688
+					} else {
689
+					    $res = mail($dest, $this->encodetorfc2822($this->subject), $this->message, $this->headers);
690
+					}
642 691
 
643 692
 					if (! $res)
644 693
 					{
645 694
 						$langs->load("errors");
646 695
 						$this->error="Failed to send mail with php mail";
647 696
 						$linuxlike=1;
648
-						if (preg_match('/^win/i',PHP_OS)) $linuxlike=0;
649
-						if (preg_match('/^mac/i',PHP_OS)) $linuxlike=0;
697
+						if (preg_match('/^win/i',PHP_OS)) {
698
+						    $linuxlike=0;
699
+						}
700
+						if (preg_match('/^mac/i',PHP_OS)) {
701
+						    $linuxlike=0;
702
+						}
650 703
 						if (! $linuxlike)
651 704
 						{
652 705
 							$this->error.=" to HOST=".ini_get('SMTP').", PORT=".ini_get('smtp_port');	// This values are value used only for non linuxlike systems
@@ -654,8 +707,7 @@  discard block
 block discarded – undo
654 707
 						$this->error.=".<br>";
655 708
 						$this->error.=$langs->trans("ErrorPhpMailDelivery");
656 709
 						dol_syslog("CMailFile::sendfile: mail end error=".$this->error, LOG_ERR);
657
-					}
658
-					else
710
+					} else
659 711
 					{
660 712
 						dol_syslog("CMailFile::sendfile: mail end success", LOG_DEBUG);
661 713
 					}
@@ -667,10 +719,13 @@  discard block
 block discarded – undo
667 719
 				}
668 720
 
669 721
 				// Restore parameters
670
-				if (! empty($conf->global->$keyforsmtpserver))	ini_restore('SMTP');
671
-				if (! empty($conf->global->$keyforsmtpport)) 	ini_restore('smtp_port');
672
-			}
673
-			else if ($this->sendmode == 'smtps')
722
+				if (! empty($conf->global->$keyforsmtpserver)) {
723
+				    ini_restore('SMTP');
724
+				}
725
+				if (! empty($conf->global->$keyforsmtpport)) {
726
+				    ini_restore('smtp_port');
727
+				}
728
+			} else if ($this->sendmode == 'smtps')
674 729
 			{
675 730
 				if (! is_object($this->smtps))
676 731
 				{
@@ -684,14 +739,22 @@  discard block
 block discarded – undo
684 739
 				$this->smtps->setTransportType(0);	// Only this method is coded in SMTPs library
685 740
 
686 741
 				// Clean parameters
687
-				if (empty($conf->global->$keyforsmtpserver)) $conf->global->$keyforsmtpserver=ini_get('SMTP');
688
-				if (empty($conf->global->$keyforsmtpport))   $conf->global->$keyforsmtpport=ini_get('smtp_port');
742
+				if (empty($conf->global->$keyforsmtpserver)) {
743
+				    $conf->global->$keyforsmtpserver=ini_get('SMTP');
744
+				}
745
+				if (empty($conf->global->$keyforsmtpport)) {
746
+				    $conf->global->$keyforsmtpport=ini_get('smtp_port');
747
+				}
689 748
 
690 749
 				// If we use SSL/TLS
691 750
 				$server=$conf->global->$keyforsmtpserver;
692 751
 				$secure='';
693
-				if (! empty($conf->global->$keyfortls) && function_exists('openssl_open')) $secure='ssl';
694
-				if (! empty($conf->global->$keyforstarttls) && function_exists('openssl_open')) $secure='tls';
752
+				if (! empty($conf->global->$keyfortls) && function_exists('openssl_open')) {
753
+				    $secure='ssl';
754
+				}
755
+				if (! empty($conf->global->$keyforstarttls) && function_exists('openssl_open')) {
756
+				    $secure='tls';
757
+				}
695 758
 				$server=($secure?$secure.'://':'').$server;
696 759
 
697 760
 				$port=$conf->global->$keyforsmtpport;
@@ -729,47 +792,63 @@  discard block
 block discarded – undo
729 792
 
730 793
 				if ($res)
731 794
 				{
732
-					if (! empty($conf->global->MAIN_MAIL_DEBUG)) $this->smtps->setDebug(true);
795
+					if (! empty($conf->global->MAIN_MAIL_DEBUG)) {
796
+					    $this->smtps->setDebug(true);
797
+					}
733 798
 
734 799
 					$result=$this->smtps->sendMsg();
735 800
 					//print $result;
736 801
 
737
-					if (! empty($conf->global->MAIN_MAIL_DEBUG)) $this->dump_mail();
802
+					if (! empty($conf->global->MAIN_MAIL_DEBUG)) {
803
+					    $this->dump_mail();
804
+					}
738 805
 
739 806
 					$result=$this->smtps->getErrors();
740 807
 					if (empty($this->error) && empty($result))
741 808
 					{
742 809
 						dol_syslog("CMailFile::sendfile: mail end success", LOG_DEBUG);
743 810
 						$res=true;
744
-					}
745
-					else
811
+					} else
746 812
 					{
747
-						if (empty($this->error)) $this->error=$result;
813
+						if (empty($this->error)) {
814
+						    $this->error=$result;
815
+						}
748 816
 						dol_syslog("CMailFile::sendfile: mail end error=".$this->error, LOG_ERR);
749 817
 						$res=false;
750 818
 					}
751 819
 				}
752
-			}
753
-			else if ($this->sendmode == 'swiftmailer')
820
+			} else if ($this->sendmode == 'swiftmailer')
754 821
 			{
755 822
 				// Use Swift Mailer library
756 823
 				// ------------------------------------------
757 824
 				require_once DOL_DOCUMENT_ROOT.'/includes/swiftmailer/lib/swift_required.php';
758 825
 
759 826
 				// Clean parameters
760
-				if (empty($conf->global->$keyforsmtpserver)) $conf->global->$keyforsmtpserver=ini_get('SMTP');
761
-				if (empty($conf->global->$keyforsmtpport))   $conf->global->$keyforsmtpport=ini_get('smtp_port');
827
+				if (empty($conf->global->$keyforsmtpserver)) {
828
+				    $conf->global->$keyforsmtpserver=ini_get('SMTP');
829
+				}
830
+				if (empty($conf->global->$keyforsmtpport)) {
831
+				    $conf->global->$keyforsmtpport=ini_get('smtp_port');
832
+				}
762 833
 
763 834
 				// If we use SSL/TLS
764 835
 				$server = $conf->global->$keyforsmtpserver;
765 836
 				$secure = '';
766
-				if (! empty($conf->global->$keyfortls) && function_exists('openssl_open')) $secure='ssl';
767
-				if (! empty($conf->global->$keyforstarttls) && function_exists('openssl_open')) $secure='tls';
837
+				if (! empty($conf->global->$keyfortls) && function_exists('openssl_open')) {
838
+				    $secure='ssl';
839
+				}
840
+				if (! empty($conf->global->$keyforstarttls) && function_exists('openssl_open')) {
841
+				    $secure='tls';
842
+				}
768 843
 
769 844
 				$this->transport = new Swift_SmtpTransport($server, $conf->global->$keyforsmtpport, $secure);
770 845
 
771
-				if (! empty($conf->global->$keyforsmtpid)) $this->transport->setUsername($conf->global->$keyforsmtpid);
772
-				if (! empty($conf->global->$keyforsmtppw)) $this->transport->setPassword($conf->global->$keyforsmtppw);
846
+				if (! empty($conf->global->$keyforsmtpid)) {
847
+				    $this->transport->setUsername($conf->global->$keyforsmtpid);
848
+				}
849
+				if (! empty($conf->global->$keyforsmtppw)) {
850
+				    $this->transport->setPassword($conf->global->$keyforsmtppw);
851
+				}
773 852
 				//$smtps->_msgReplyTo  = '[email protected]';
774 853
 
775 854
 				// Create the Mailer using your created Transport
@@ -797,19 +876,19 @@  discard block
 block discarded – undo
797 876
 				} catch (Exception $e) {
798 877
 					$this->error =  $e->getMessage();
799 878
 				}
800
-				if (! empty($conf->global->MAIN_MAIL_DEBUG)) $this->dump_mail();
879
+				if (! empty($conf->global->MAIN_MAIL_DEBUG)) {
880
+				    $this->dump_mail();
881
+				}
801 882
 
802 883
 				$res = true;
803 884
 				if (! empty($this->error) || ! $result) {
804 885
 					dol_syslog("CMailFile::sendfile: mail end error=".$this->error, LOG_ERR);
805 886
 					$res=false;
806
-				}
807
-				else
887
+				} else
808 888
 				{
809 889
 					dol_syslog("CMailFile::sendfile: mail end success", LOG_DEBUG);
810 890
 				}
811
-			}
812
-			else
891
+			} else
813 892
 			{
814 893
 				// Send mail method not correctly defined
815 894
 				// --------------------------------------
@@ -826,8 +905,7 @@  discard block
 block discarded – undo
826 905
 
827 906
 				return $reshook;
828 907
 			}
829
-		}
830
-		else
908
+		} else
831 909
 		{
832 910
 			$this->error='No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_MAILS';
833 911
 			dol_syslog("CMailFile::sendfile: ".$this->error, LOG_WARNING);
@@ -867,8 +945,7 @@  discard block
 block discarded – undo
867 945
 			$contents = file_get_contents($newsourcefile);	// Need PHP 4.3
868 946
 			$encoded = chunk_split(base64_encode($contents), 76, $this->eol);    // 76 max is defined into http://tools.ietf.org/html/rfc2047
869 947
 			return $encoded;
870
-		}
871
-		else
948
+		} else
872 949
 		{
873 950
 			$this->error="Error: Can't read file '".$sourcefile."' into _encode_file";
874 951
 			dol_syslog("CMailFile::encode_file: ".$this->error, LOG_ERR);
@@ -890,9 +967,11 @@  discard block
 block discarded – undo
890 967
         // phpcs:enable
891 968
 		global $conf,$dolibarr_main_data_root;
892 969
 
893
-		if (@is_writeable($dolibarr_main_data_root))	// Avoid fatal error on fopen with open_basedir
970
+		if (@is_writeable($dolibarr_main_data_root)) {
971
+		    // Avoid fatal error on fopen with open_basedir
894 972
 		{
895 973
 			$outputfile=$dolibarr_main_data_root."/dolibarr_mail.log";
974
+		}
896 975
 			$fp = fopen($outputfile,"w");
897 976
 
898 977
 			if ($this->sendmode == 'mail')
@@ -900,19 +979,18 @@  discard block
 block discarded – undo
900 979
 				fputs($fp, $this->headers);
901 980
 				fputs($fp, $this->eol);			// This eol is added by the mail function, so we add it in log
902 981
 				fputs($fp, $this->message);
903
-			}
904
-			elseif ($this->sendmode == 'smtps')
982
+			} elseif ($this->sendmode == 'smtps')
905 983
 			{
906 984
 				fputs($fp, $this->smtps->log);	// this->smtps->log is filled only if MAIN_MAIL_DEBUG was set to on
907
-			}
908
-			elseif ($this->sendmode == 'swiftmailer')
985
+			} elseif ($this->sendmode == 'swiftmailer')
909 986
 			{
910 987
 				fputs($fp, $this->logger->dump());	// this->logger is filled only if MAIN_MAIL_DEBUG was set to on
911 988
 			}
912 989
 
913 990
 			fclose($fp);
914
-			if (! empty($conf->global->MAIN_UMASK))
915
-				@chmod($outputfile, octdec($conf->global->MAIN_UMASK));
991
+			if (! empty($conf->global->MAIN_UMASK)) {
992
+							@chmod($outputfile, octdec($conf->global->MAIN_UMASK));
993
+			}
916 994
 		}
917 995
 	}
918 996
 
@@ -928,14 +1006,17 @@  discard block
 block discarded – undo
928 1006
 		if (!preg_match('/^[\s\t]*<html/i',$msg))
929 1007
 		{
930 1008
 			$out = "<html><head><title></title>";
931
-			if (!empty($this->styleCSS)) $out.= $this->styleCSS;
1009
+			if (!empty($this->styleCSS)) {
1010
+			    $out.= $this->styleCSS;
1011
+			}
932 1012
 			$out.= "</head><body";
933
-			if (!empty($this->bodyCSS)) $out.= $this->bodyCSS;
1013
+			if (!empty($this->bodyCSS)) {
1014
+			    $out.= $this->bodyCSS;
1015
+			}
934 1016
 			$out.= ">";
935 1017
 			$out.= $msg;
936 1018
 			$out.= "</body></html>";
937
-		}
938
-		else
1019
+		} else
939 1020
 		{
940 1021
 			$out = $msg;
941 1022
 		}
@@ -995,15 +1076,26 @@  discard block
 block discarded – undo
995 1076
 		}
996 1077
 		// Return-Path is important because it is used by SPF. Some MTA does not read Return-Path from header but from command line. See option MAIN_MAIL_ALLOW_SENDMAIL_F for that.
997 1078
 		$out.= "Return-Path: ".$this->getValidAddress($this->addr_from,0,1).$this->eol2;
998
-		if (isset($this->reply_to)  && $this->reply_to)  $out.= "Reply-To: ".$this->getValidAddress($this->reply_to,2).$this->eol2;
999
-		if (isset($this->errors_to) && $this->errors_to) $out.= "Errors-To: ".$this->getValidAddress($this->errors_to,2).$this->eol2;
1079
+		if (isset($this->reply_to)  && $this->reply_to) {
1080
+		    $out.= "Reply-To: ".$this->getValidAddress($this->reply_to,2).$this->eol2;
1081
+		}
1082
+		if (isset($this->errors_to) && $this->errors_to) {
1083
+		    $out.= "Errors-To: ".$this->getValidAddress($this->errors_to,2).$this->eol2;
1084
+		}
1000 1085
 
1001 1086
 		// Receiver
1002
-		if (isset($this->addr_cc)   && $this->addr_cc)   $out.= "Cc: ".$this->getValidAddress($this->addr_cc,2).$this->eol2;
1003
-		if (isset($this->addr_bcc)  && $this->addr_bcc)  $out.= "Bcc: ".$this->getValidAddress($this->addr_bcc,2).$this->eol2;    // TODO Question: bcc must not be into header, only into SMTP command "RCPT TO". Does php mail support this ?
1087
+		if (isset($this->addr_cc)   && $this->addr_cc) {
1088
+		    $out.= "Cc: ".$this->getValidAddress($this->addr_cc,2).$this->eol2;
1089
+		}
1090
+		if (isset($this->addr_bcc)  && $this->addr_bcc) {
1091
+		    $out.= "Bcc: ".$this->getValidAddress($this->addr_bcc,2).$this->eol2;
1092
+		}
1093
+		// TODO Question: bcc must not be into header, only into SMTP command "RCPT TO". Does php mail support this ?
1004 1094
 
1005 1095
 		// Delivery receipt
1006
-		if (isset($this->deliveryreceipt) && $this->deliveryreceipt == 1) $out.= "Disposition-Notification-To: ".$this->getValidAddress($this->addr_from,2).$this->eol2;
1096
+		if (isset($this->deliveryreceipt) && $this->deliveryreceipt == 1) {
1097
+		    $out.= "Disposition-Notification-To: ".$this->getValidAddress($this->addr_from,2).$this->eol2;
1098
+		}
1007 1099
 
1008 1100
 		//$out.= "X-Priority: 3".$this->eol2;
1009 1101
 
@@ -1016,13 +1108,14 @@  discard block
 block discarded – undo
1016 1108
 			$out.= 'Message-ID: <' . time() . '.phpmail-dolibarr-'. $trackid . '@' . $host . ">" . $this->eol2;	// Uppercase seems replaced by phpmail
1017 1109
 			$out.= 'References: <' . time() . '.phpmail-dolibarr-'. $trackid . '@' . $host . ">" . $this->eol2;
1018 1110
 			$out.= 'X-Dolibarr-TRACKID: ' . $trackid . '@' . $host. $this->eol2;
1019
-		}
1020
-		else
1111
+		} else
1021 1112
 		{
1022 1113
 			$out.= 'Message-ID: <' . time() . '.phpmail@' . $host . ">" . $this->eol2;
1023 1114
 		}
1024 1115
 
1025
-		if (! empty($_SERVER['REMOTE_ADDR'])) $out.= "X-RemoteAddr: " . $_SERVER['REMOTE_ADDR']. $this->eol2;
1116
+		if (! empty($_SERVER['REMOTE_ADDR'])) {
1117
+		    $out.= "X-RemoteAddr: " . $_SERVER['REMOTE_ADDR']. $this->eol2;
1118
+		}
1026 1119
 		$out.= "X-Mailer: Dolibarr version " . DOL_VERSION ." (using php mail)".$this->eol2;
1027 1120
 		$out.= "Mime-Version: 1.0".$this->eol2;
1028 1121
 
@@ -1057,7 +1150,9 @@  discard block
 block discarded – undo
1057 1150
 			{
1058 1151
 				if ($filename_list[$i])
1059 1152
 				{
1060
-					if ($mimefilename_list[$i]) $filename_list[$i] = $mimefilename_list[$i];
1153
+					if ($mimefilename_list[$i]) {
1154
+					    $filename_list[$i] = $mimefilename_list[$i];
1155
+					}
1061 1156
 					$out.= "X-attachments: $filename_list[$i]".$this->eol2;
1062 1157
 				}
1063 1158
 			}
@@ -1127,9 +1222,11 @@  discard block
 block discarded – undo
1127 1222
 				$out.= "--" . $this->related_boundary . $this->eol;
1128 1223
 			}
1129 1224
 
1130
-			if (! $this->atleastoneimage && $strContentAltText && ! empty($conf->global->MAIN_MAIL_USE_MULTI_PART))    // Add plain text message part before html part
1225
+			if (! $this->atleastoneimage && $strContentAltText && ! empty($conf->global->MAIN_MAIL_USE_MULTI_PART)) {
1226
+			    // Add plain text message part before html part
1131 1227
 			{
1132 1228
 				$out.= "Content-Type: multipart/alternative;".$this->eol." boundary=\"".$this->alternative_boundary."\"".$this->eol;
1229
+			}
1133 1230
 				$out.= $this->eol;
1134 1231
 				$out.= "--" . $this->alternative_boundary . $this->eol;
1135 1232
 				$out.= "Content-Type: text/plain; charset=".$conf->file->character_set_client.$this->eol;
@@ -1142,12 +1239,13 @@  discard block
 block discarded – undo
1142 1239
 			//$out.= "Content-Transfer-Encoding: 7bit".$this->eol;	// TODO Use base64
1143 1240
 			$out.= $this->eol.$strContent.$this->eol;
1144 1241
 
1145
-			if (! $this->atleastoneimage && $strContentAltText && ! empty($conf->global->MAIN_MAIL_USE_MULTI_PART))    // Add plain text message part after html part
1242
+			if (! $this->atleastoneimage && $strContentAltText && ! empty($conf->global->MAIN_MAIL_USE_MULTI_PART)) {
1243
+			    // Add plain text message part after html part
1146 1244
 			{
1147 1245
 				$out.= "--" . $this->alternative_boundary . "--". $this->eol;
1148 1246
 			}
1149
-		}
1150
-		else
1247
+			}
1248
+		} else
1151 1249
 		{
1152 1250
 			$out.= "Content-Type: text/plain; charset=".$conf->file->character_set_client.$this->eol;
1153 1251
 			//$out.= "Content-Transfer-Encoding: 7bit".$this->eol;
@@ -1192,7 +1290,9 @@  discard block
 block discarded – undo
1192 1290
 				$encoded = $this->_encode_file($filename_list[$i]);
1193 1291
 				if ($encoded >= 0)
1194 1292
 				{
1195
-					if ($mimefilename_list[$i]) $filename_list[$i] = $mimefilename_list[$i];
1293
+					if ($mimefilename_list[$i]) {
1294
+					    $filename_list[$i] = $mimefilename_list[$i];
1295
+					}
1196 1296
 					if (! $mimetype_list[$i]) {
1197 1297
 						$mimetype_list[$i] = "application/octet-stream";
1198 1298
 					}
@@ -1206,8 +1306,7 @@  discard block
 block discarded – undo
1206 1306
 					$out.= $encoded;
1207 1307
 					$out.= $this->eol;
1208 1308
 					//$out.= $this->eol;
1209
-				}
1210
-				else
1309
+				} else
1211 1310
 				{
1212 1311
 					return $encoded;
1213 1312
 				}
@@ -1286,7 +1385,9 @@  discard block
 block discarded – undo
1286 1385
 			}
1287 1386
 
1288 1387
 			// If we use SSL/TLS
1289
-			if (! empty($conf->global->$keyfortls) && function_exists('openssl_open')) $host='ssl://'.$host;
1388
+			if (! empty($conf->global->$keyfortls) && function_exists('openssl_open')) {
1389
+			    $host='ssl://'.$host;
1390
+			}
1290 1391
 			// tls smtp start with no encryption
1291 1392
 			//if (! empty($conf->global->MAIN_MAIL_EMAIL_STARTTLS) && function_exists('openssl_open')) $host='tls://'.$host;
1292 1393
 
@@ -1298,17 +1399,20 @@  discard block
 block discarded – undo
1298 1399
 					$errno,      // actual system level error
1299 1400
 					$errstr,     // and any text that goes with the error
1300 1401
 					$timeout
1301
-			))  // timeout for reading/writing data over the socket
1402
+			)) {
1403
+			    // timeout for reading/writing data over the socket
1302 1404
 			{
1303 1405
 				// Windows still does not have support for this timeout function
1304 1406
 				if (function_exists('stream_set_timeout')) stream_set_timeout($socket, $timeout, 0);
1407
+			}
1305 1408
 
1306 1409
 				dol_syslog("Now we wait for answer 220");
1307 1410
 
1308 1411
 				// Check response from Server
1309
-				if ( $_retVal = $this->server_parse($socket, "220") ) $_retVal = $socket;
1310
-			}
1311
-			else
1412
+				if ( $_retVal = $this->server_parse($socket, "220") ) {
1413
+				    $_retVal = $socket;
1414
+				}
1415
+			} else
1312 1416
 			{
1313 1417
 				$this->error = utf8_check('Error '.$errno.' - '.$errstr)?'Error '.$errno.' - '.$errstr:utf8_encode('Error '.$errno.' - '.$errstr);
1314 1418
 			}
@@ -1369,9 +1473,11 @@  discard block
 block discarded – undo
1369 1473
 			foreach ($matches[1] as $full)
1370 1474
 			{
1371 1475
 
1372
-				if (preg_match('/file=([A-Za-z0-9_\-\/]+[\.]?[A-Za-z0-9]+)?$/i',$full,$regs))   // If xxx is 'file=aaa'
1476
+				if (preg_match('/file=([A-Za-z0-9_\-\/]+[\.]?[A-Za-z0-9]+)?$/i',$full,$regs)) {
1477
+				    // If xxx is 'file=aaa'
1373 1478
 				{
1374 1479
 					$img = $regs[1];
1480
+				}
1375 1481
 
1376 1482
 					if (file_exists($images_dir.'/'.$img))
1377 1483
 					{
@@ -1430,15 +1536,13 @@  discard block
 block discarded – undo
1430 1536
 					}
1431 1537
 					$i++;
1432 1538
 				}
1433
-			}
1434
-			else
1539
+			} else
1435 1540
 			{
1436 1541
 				return -1;
1437 1542
 			}
1438 1543
 
1439 1544
 			return 1;
1440
-		}
1441
-		else
1545
+		} else
1442 1546
 		{
1443 1547
 			return 0;
1444 1548
 		}
@@ -1473,8 +1577,7 @@  discard block
 block discarded – undo
1473 1577
 			{
1474 1578
 				$name  = trim($regs[1]);
1475 1579
 				$email = trim($regs[2]);
1476
-			}
1477
-			else
1580
+			} else
1478 1581
 			{
1479 1582
 				$name  = '';
1480 1583
 				$email = trim($val);
@@ -1499,9 +1602,13 @@  discard block
 block discarded – undo
1499 1602
 				}
1500 1603
 				if ($format == 0 || $format == 3)
1501 1604
 				{
1502
-					if (! empty($conf->global->MAIN_MAIL_NO_FULL_EMAIL)) $newemail='<'.$email.'>';
1503
-					elseif (! $name) $newemail='<'.$email.'>';
1504
-					else $newemail=($format==3?'"':'').($encode?self::encodetorfc2822($name):$name).($format==3?'"':'').' <'.$email.'>';
1605
+					if (! empty($conf->global->MAIN_MAIL_NO_FULL_EMAIL)) {
1606
+					    $newemail='<'.$email.'>';
1607
+					} elseif (! $name) {
1608
+					    $newemail='<'.$email.'>';
1609
+					} else {
1610
+					    $newemail=($format==3?'"':'').($encode?self::encodetorfc2822($name):$name).($format==3?'"':'').' <'.$email.'>';
1611
+					}
1505 1612
 				}
1506 1613
 
1507 1614
 				$ret=($ret ? $ret.',' : '').$newemail;
@@ -1509,7 +1616,9 @@  discard block
 block discarded – undo
1509 1616
 				// Stop if we have too much records
1510 1617
 				if ($maxnumberofemail && $i >= $maxnumberofemail)
1511 1618
 				{
1512
-					if (count($arrayaddress) > $maxnumberofemail) $ret.='...';
1619
+					if (count($arrayaddress) > $maxnumberofemail) {
1620
+					    $ret.='...';
1621
+					}
1513 1622
 					break;
1514 1623
 				}
1515 1624
 			}
@@ -1539,8 +1648,7 @@  discard block
 block discarded – undo
1539 1648
 			{
1540 1649
 				$name  = trim($regs[1]);
1541 1650
 				$email = trim($regs[2]);
1542
-			}
1543
-			else
1651
+			} else
1544 1652
 			{
1545 1653
 				$name  = null;
1546 1654
 				$email = trim($val);
Please login to merge, or discard this patch.
dolibarr/htdocs/core/class/html.formbarcode.class.php 2 patches
Spacing   +31 added lines, -31 removed lines patch added patch discarded remove patch
@@ -37,7 +37,7 @@  discard block
 block discarded – undo
37 37
     /**
38 38
      * @var string Error code (or message)
39 39
      */
40
-    public $error='';
40
+    public $error = '';
41 41
 
42 42
 
43 43
     /**
@@ -60,7 +60,7 @@  discard block
 block discarded – undo
60 60
      *  @param  int		$idForm			Id du formulaire
61 61
      * 	@return	string					HTML select string
62 62
      */
63
-    function setBarcodeEncoder($selected,$barcodelist,$code_id,$idForm='formbarcode')
63
+    function setBarcodeEncoder($selected, $barcodelist, $code_id, $idForm = 'formbarcode')
64 64
     {
65 65
         global $conf, $langs;
66 66
 
@@ -81,8 +81,8 @@  discard block
 block discarded – undo
81 81
         }
82 82
 
83 83
         // We check if barcode is already selected by default
84
-        if (((! empty($conf->product->enabled) || ! empty($conf->service->enabled)) && $conf->global->PRODUIT_DEFAULT_BARCODE_TYPE == $code_id) ||
85
-        (! empty($conf->societe->enabled) && $conf->global->GENBARCODE_BARCODETYPE_THIRDPARTY == $code_id))
84
+        if (((!empty($conf->product->enabled) || !empty($conf->service->enabled)) && $conf->global->PRODUIT_DEFAULT_BARCODE_TYPE == $code_id) ||
85
+        (!empty($conf->societe->enabled) && $conf->global->GENBARCODE_BARCODETYPE_THIRDPARTY == $code_id))
86 86
         {
87 87
             $disable = 'disabled';
88 88
         }
@@ -90,24 +90,24 @@  discard block
 block discarded – undo
90 90
         if (!empty($conf->use_javascript_ajax))
91 91
         {
92 92
             $select_encoder = '<form action="'.DOL_URL_ROOT.'/admin/barcode.php" method="POST" id="form'.$idForm.'">';
93
-            $select_encoder.= '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
94
-            $select_encoder.= '<input type="hidden" name="action" value="update">';
95
-            $select_encoder.= '<input type="hidden" name="code_id" value="'.$code_id.'">';
93
+            $select_encoder .= '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
94
+            $select_encoder .= '<input type="hidden" name="action" value="update">';
95
+            $select_encoder .= '<input type="hidden" name="code_id" value="'.$code_id.'">';
96 96
         }
97 97
         
98
-        $selectname=(!empty($conf->use_javascript_ajax)?'coder':'coder'.$code_id);
99
-        $select_encoder.= '<select id="select'.$idForm.'" class="flat" name="'.$selectname.'">';
100
-        $select_encoder.= '<option value="0"'.($selected==0?' selected':'').' '.$disable.'>'.$langs->trans('Disable').'</option>';
101
-        $select_encoder.= '<option value="-1" disabled>--------------------</option>';
102
-        foreach($barcodelist as $key => $value)
98
+        $selectname = (!empty($conf->use_javascript_ajax) ? 'coder' : 'coder'.$code_id);
99
+        $select_encoder .= '<select id="select'.$idForm.'" class="flat" name="'.$selectname.'">';
100
+        $select_encoder .= '<option value="0"'.($selected == 0 ? ' selected' : '').' '.$disable.'>'.$langs->trans('Disable').'</option>';
101
+        $select_encoder .= '<option value="-1" disabled>--------------------</option>';
102
+        foreach ($barcodelist as $key => $value)
103 103
         {
104
-            $select_encoder.= '<option value="'.$key.'"'.($selected==$key?' selected':'').'>'.$value.'</option>';
104
+            $select_encoder .= '<option value="'.$key.'"'.($selected == $key ? ' selected' : '').'>'.$value.'</option>';
105 105
         }
106
-        $select_encoder.= '</select>';
106
+        $select_encoder .= '</select>';
107 107
         
108 108
         if (!empty($conf->use_javascript_ajax))
109 109
         {
110
-            $select_encoder.= '</form>';
110
+            $select_encoder .= '</form>';
111 111
         }
112 112
 
113 113
         return $select_encoder;
@@ -123,7 +123,7 @@  discard block
 block discarded – undo
123 123
      *  @return void
124 124
      *  @deprecated
125 125
      */
126
-    function select_barcode_type($selected='', $htmlname='barcodetype_id', $useempty=0)
126
+    function select_barcode_type($selected = '', $htmlname = 'barcodetype_id', $useempty = 0)
127 127
     {
128 128
         // phpcs:enable
129 129
         print $this->selectBarcodeType($selected, $htmlname, $useempty);
@@ -137,17 +137,17 @@  discard block
 block discarded – undo
137 137
      *  @param  int     $useempty          Display empty value in select
138 138
      *  @return string
139 139
      */
140
-    function selectBarcodeType($selected='', $htmlname='barcodetype_id', $useempty=0)
140
+    function selectBarcodeType($selected = '', $htmlname = 'barcodetype_id', $useempty = 0)
141 141
     {
142 142
         global $langs, $conf;
143 143
 
144 144
         $out = '';
145 145
 
146 146
         $sql = "SELECT rowid, code, libelle";
147
-        $sql.= " FROM ".MAIN_DB_PREFIX."c_barcode_type";
148
-        $sql.= " WHERE coder <> '0'";
149
-        $sql.= " AND entity = ".$conf->entity;
150
-        $sql.= " ORDER BY code";
147
+        $sql .= " FROM ".MAIN_DB_PREFIX."c_barcode_type";
148
+        $sql .= " WHERE coder <> '0'";
149
+        $sql .= " AND entity = ".$conf->entity;
150
+        $sql .= " ORDER BY code";
151 151
 
152 152
         $result = $this->db->query($sql);
153 153
         if ($result) {
@@ -155,20 +155,20 @@  discard block
 block discarded – undo
155 155
             $i = 0;
156 156
 
157 157
             if ($useempty && $num > 0) {
158
-                $out .= '<select class="flat minwidth75imp" name="' . $htmlname . '" id="select_' . $htmlname . '">';
158
+                $out .= '<select class="flat minwidth75imp" name="'.$htmlname.'" id="select_'.$htmlname.'">';
159 159
                 $out .= '<option value="0">&nbsp;</option>';
160 160
             } else {
161 161
                 $langs->load("errors");
162
-                $out .= '<select disabled class="flat minwidth75imp" name="' . $htmlname . '" id="select_' . $htmlname . '">';
163
-                $out .= '<option value="0" selected>' . $langs->trans('ErrorNoActivatedBarcode') . '</option>';
162
+                $out .= '<select disabled class="flat minwidth75imp" name="'.$htmlname.'" id="select_'.$htmlname.'">';
163
+                $out .= '<option value="0" selected>'.$langs->trans('ErrorNoActivatedBarcode').'</option>';
164 164
             }
165 165
 
166 166
             while ($i < $num) {
167 167
                 $obj = $this->db->fetch_object($result);
168 168
                 if ($selected == $obj->rowid) {
169
-                    $out .= '<option value="' . $obj->rowid . '" selected>';
169
+                    $out .= '<option value="'.$obj->rowid.'" selected>';
170 170
                 } else {
171
-                    $out .= '<option value="' . $obj->rowid . '">';
171
+                    $out .= '<option value="'.$obj->rowid.'">';
172 172
                 }
173 173
                 $out .= $obj->libelle;
174 174
                 $out .= '</option>';
@@ -193,7 +193,7 @@  discard block
 block discarded – undo
193 193
      *  @return	void
194 194
      *  @deprecated
195 195
      */
196
-    function form_barcode_type($page, $selected='', $htmlname='barcodetype_id')
196
+    function form_barcode_type($page, $selected = '', $htmlname = 'barcodetype_id')
197 197
     {
198 198
         // phpcs:enable
199 199
         print $this->formBarcodeType($page, $selected, $htmlname);
@@ -207,19 +207,19 @@  discard block
 block discarded – undo
207 207
      *  @param  string      $htmlname       Nom du formulaire select
208 208
      *  @return string
209 209
      */
210
-    function formBarcodeType($page, $selected='', $htmlname='barcodetype_id')
210
+    function formBarcodeType($page, $selected = '', $htmlname = 'barcodetype_id')
211 211
     {
212 212
         global $langs, $conf;
213 213
         $out = '';
214 214
         if ($htmlname != "none") {
215
-            $out .= '<form method="post" action="' . $page . '">';
216
-            $out .= '<input type="hidden" name="token" value="' . $_SESSION['newtoken'] . '">';
215
+            $out .= '<form method="post" action="'.$page.'">';
216
+            $out .= '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
217 217
             $out .= '<input type="hidden" name="action" value="set'.$htmlname.'">';
218 218
             $out .= '<table class="nobordernopadding" cellpadding="0" cellspacing="0">';
219 219
             $out .= '<tr><td>';
220 220
             $out .= $this->selectBarcodeType($selected, $htmlname, 1);
221 221
             $out .= '</td>';
222
-            $out .= '<td align="left"><input type="submit" class="button" value="' . $langs->trans("Modify") . '">';
222
+            $out .= '<td align="left"><input type="submit" class="button" value="'.$langs->trans("Modify").'">';
223 223
             $out .= '</td></tr></table></form>';
224 224
         }
225 225
         return $out;
Please login to merge, or discard this patch.
Braces   +1 added lines, -2 removed lines patch added patch discarded remove patch
@@ -176,8 +176,7 @@
 block discarded – undo
176 176
             }
177 177
             $out .= "</select>";
178 178
             $out .= ajax_combobox("select_".$htmlname);
179
-        }
180
-        else {
179
+        } else {
181 180
             dol_print_error($this->db);
182 181
         }
183 182
         return $out;
Please login to merge, or discard this patch.
dolibarr/htdocs/core/class/CSMSFile.class.php 3 patches
Indentation   +162 added lines, -162 removed lines patch added patch discarded remove patch
@@ -35,73 +35,73 @@  discard block
 block discarded – undo
35 35
 class CSMSFile
36 36
 {
37 37
     /**
38
-	 * @var string Error code (or message)
39
-	 */
40
-	public $error='';
41
-
42
-	public $addr_from;
43
-	public $addr_to;
44
-	public $deferred;
45
-	public $priority;
46
-	public $class;
47
-	public $message;
48
-	public $nostop;
49
-
50
-
51
-	/**
52
-	 *	CSMSFile
53
-	 *
54
-	 *	@param	string	$to                 Recipients SMS
55
-	 *	@param 	string	$from               Sender SMS
56
-	 *	@param 	string	$msg                Message
57
-	 *	@param 	int		$deliveryreceipt	Not used
58
-	 *	@param 	int		$deferred			Deferred or not
59
-	 *	@param 	int		$priority			Priority
60
-	 *	@param 	int		$class				Class
61
-	 */
62
-	function __construct($to,$from,$msg,$deliveryreceipt=0,$deferred=0,$priority=3,$class=1)
63
-	{
64
-		global $conf;
65
-
66
-		// On definit fin de ligne
67
-		$this->eol="\n";
68
-		if (preg_match('/^win/i',PHP_OS)) $this->eol="\r\n";
69
-		if (preg_match('/^mac/i',PHP_OS)) $this->eol="\r";
70
-
71
-		// If ending method not defined
72
-		if (empty($conf->global->MAIN_SMS_SENDMODE))
73
-		{
74
-		    $this->error='No SMS Engine defined';
75
-		    return -1;
76
-		}
77
-
78
-		dol_syslog("CSMSFile::CSMSFile: MAIN_SMS_SENDMODE=".$conf->global->MAIN_SMS_SENDMODE." charset=".$conf->file->character_set_client." from=".$from.", to=".$to.", msg length=".count($msg), LOG_DEBUG);
79
-		dol_syslog("CSMSFile::CSMSFile: deferred=".$deferred." priority=".$priority." class=".$class, LOG_DEBUG);
80
-
81
-		// Action according to choosed sending method
82
-	    $this->addr_from=$from;
83
-	    $this->addr_to=$to;
38
+     * @var string Error code (or message)
39
+     */
40
+    public $error='';
41
+
42
+    public $addr_from;
43
+    public $addr_to;
44
+    public $deferred;
45
+    public $priority;
46
+    public $class;
47
+    public $message;
48
+    public $nostop;
49
+
50
+
51
+    /**
52
+     *	CSMSFile
53
+     *
54
+     *	@param	string	$to                 Recipients SMS
55
+     *	@param 	string	$from               Sender SMS
56
+     *	@param 	string	$msg                Message
57
+     *	@param 	int		$deliveryreceipt	Not used
58
+     *	@param 	int		$deferred			Deferred or not
59
+     *	@param 	int		$priority			Priority
60
+     *	@param 	int		$class				Class
61
+     */
62
+    function __construct($to,$from,$msg,$deliveryreceipt=0,$deferred=0,$priority=3,$class=1)
63
+    {
64
+        global $conf;
65
+
66
+        // On definit fin de ligne
67
+        $this->eol="\n";
68
+        if (preg_match('/^win/i',PHP_OS)) $this->eol="\r\n";
69
+        if (preg_match('/^mac/i',PHP_OS)) $this->eol="\r";
70
+
71
+        // If ending method not defined
72
+        if (empty($conf->global->MAIN_SMS_SENDMODE))
73
+        {
74
+            $this->error='No SMS Engine defined';
75
+            return -1;
76
+        }
77
+
78
+        dol_syslog("CSMSFile::CSMSFile: MAIN_SMS_SENDMODE=".$conf->global->MAIN_SMS_SENDMODE." charset=".$conf->file->character_set_client." from=".$from.", to=".$to.", msg length=".count($msg), LOG_DEBUG);
79
+        dol_syslog("CSMSFile::CSMSFile: deferred=".$deferred." priority=".$priority." class=".$class, LOG_DEBUG);
80
+
81
+        // Action according to choosed sending method
82
+        $this->addr_from=$from;
83
+        $this->addr_to=$to;
84 84
         $this->deferred=$deferred;
85 85
         $this->priority=$priority;
86 86
         $this->class=$class;
87 87
         $this->message=$msg;
88 88
         $this->nostop=false;
89
-	}
89
+    }
90 90
 
91 91
 
92
-	/**
93
-	 * Send sms that was prepared by constructor
94
-	 *
95
-	 * @return    boolean     True if sms sent, false otherwise
96
-	 */
97
-	function sendfile()
98
-	{
99
-		global $conf;
92
+    /**
93
+     * Send sms that was prepared by constructor
94
+     *
95
+     * @return    boolean     True if sms sent, false otherwise
96
+     */
97
+    function sendfile()
98
+    {
99
+        global $conf;
100 100
 
101
-		$errorlevel=error_reporting();
102
-		error_reporting($errorlevel ^ E_WARNING);   // Desactive warnings
101
+        $errorlevel=error_reporting();
102
+        error_reporting($errorlevel ^ E_WARNING);   // Desactive warnings
103 103
 
104
-		$res=false;
104
+        $res=false;
105 105
 
106 106
         dol_syslog("CSMSFile::sendfile addr_to=".$this->addr_to, LOG_DEBUG);
107 107
         dol_syslog("CSMSFile::sendfile message=\n".$this->message);
@@ -110,121 +110,121 @@  discard block
 block discarded – undo
110 110
 
111 111
         if (! empty($conf->global->MAIN_SMS_DEBUG)) $this->dump_sms();
112 112
 
113
-		if (empty($conf->global->MAIN_DISABLE_ALL_SMS))
114
-		{
115
-
116
-		    // Action according to choosed sending method
117
-		    if ($conf->global->MAIN_SMS_SENDMODE == 'ovh')    // Backward compatibility    @deprecated
118
-			{
119
-				dol_include_once('/ovh/class/ovhsms.class.php');
120
-				$sms=new OvhSms($this->db);
121
-				$sms->expe=$this->addr_from;
122
-				$sms->dest=$this->addr_to;
123
-				$sms->message=$this->message;
124
-				$sms->deferred=$this->deferred;
125
-				$sms->priority=$this->priority;
113
+        if (empty($conf->global->MAIN_DISABLE_ALL_SMS))
114
+        {
115
+
116
+            // Action according to choosed sending method
117
+            if ($conf->global->MAIN_SMS_SENDMODE == 'ovh')    // Backward compatibility    @deprecated
118
+            {
119
+                dol_include_once('/ovh/class/ovhsms.class.php');
120
+                $sms=new OvhSms($this->db);
121
+                $sms->expe=$this->addr_from;
122
+                $sms->dest=$this->addr_to;
123
+                $sms->message=$this->message;
124
+                $sms->deferred=$this->deferred;
125
+                $sms->priority=$this->priority;
126 126
                 $sms->class=$this->class;
127 127
                 $sms->nostop=$this->nostop;
128 128
 
129 129
                 $res=$sms->SmsSend();
130
-				if ($res <= 0)
131
-				{
132
-					$this->error=$sms->error;
133
-					dol_syslog("CSMSFile::sendfile: sms send error=".$this->error, LOG_ERR);
134
-				}
135
-				else
136
-				{
137
-					dol_syslog("CSMSFile::sendfile: sms send success with id=".$res, LOG_DEBUG);
138
-					//var_dump($res);        // 1973128
139
-					if (! empty($conf->global->MAIN_SMS_DEBUG)) $this->dump_sms_result($res);
140
-				}
141
-			}
142
-		    else if (! empty($conf->global->MAIN_SMS_SENDMODE))    // $conf->global->MAIN_SMS_SENDMODE looks like a value 'class@module'
143
-		    {
144
-		        $tmp=explode('@',$conf->global->MAIN_SMS_SENDMODE);
145
-		        $classfile=$tmp[0]; $module=(empty($tmp[1])?$tmp[0]:$tmp[1]);
146
-		        dol_include_once('/'.$module.'/class/'.$classfile.'.class.php');
147
-		        try
148
-		        {
149
-		            $classname=ucfirst($classfile);
150
-		            $sms = new $classname($this->db);
151
-		            $sms->expe=$this->addr_from;
152
-		            $sms->dest=$this->addr_to;
153
-		            $sms->deferred=$this->deferred;
154
-		            $sms->priority=$this->priority;
155
-		            $sms->class=$this->class;
156
-		            $sms->message=$this->message;
157
-		            $sms->nostop=$this->nostop;
130
+                if ($res <= 0)
131
+                {
132
+                    $this->error=$sms->error;
133
+                    dol_syslog("CSMSFile::sendfile: sms send error=".$this->error, LOG_ERR);
134
+                }
135
+                else
136
+                {
137
+                    dol_syslog("CSMSFile::sendfile: sms send success with id=".$res, LOG_DEBUG);
138
+                    //var_dump($res);        // 1973128
139
+                    if (! empty($conf->global->MAIN_SMS_DEBUG)) $this->dump_sms_result($res);
140
+                }
141
+            }
142
+            else if (! empty($conf->global->MAIN_SMS_SENDMODE))    // $conf->global->MAIN_SMS_SENDMODE looks like a value 'class@module'
143
+            {
144
+                $tmp=explode('@',$conf->global->MAIN_SMS_SENDMODE);
145
+                $classfile=$tmp[0]; $module=(empty($tmp[1])?$tmp[0]:$tmp[1]);
146
+                dol_include_once('/'.$module.'/class/'.$classfile.'.class.php');
147
+                try
148
+                {
149
+                    $classname=ucfirst($classfile);
150
+                    $sms = new $classname($this->db);
151
+                    $sms->expe=$this->addr_from;
152
+                    $sms->dest=$this->addr_to;
153
+                    $sms->deferred=$this->deferred;
154
+                    $sms->priority=$this->priority;
155
+                    $sms->class=$this->class;
156
+                    $sms->message=$this->message;
157
+                    $sms->nostop=$this->nostop;
158 158
 
159 159
                     $res=$sms->SmsSend();
160 160
                     $this->error = $sms->error;
161 161
                     $this->errors = $sms->errors;
162
-    				if ($res <= 0)
163
-    				{
164
-    					dol_syslog("CSMSFile::sendfile: sms send error=".$this->error, LOG_ERR);
165
-    				}
166
-    				else
167
-    				{
168
-    					dol_syslog("CSMSFile::sendfile: sms send success with id=".$res, LOG_DEBUG);
169
-    					//var_dump($res);        // 1973128
170
-    					if (! empty($conf->global->MAIN_SMS_DEBUG)) $this->dump_sms_result($res);
171
-    				}
172
-		        }
173
-		        catch(Exception $e)
174
-		        {
175
-		            dol_print_error('','Error to get list of senders: '.$e->getMessage());
176
-		        }
177
-		    }
178
-			else
179
-			{
180
-				// Send sms method not correctly defined
181
-				// --------------------------------------
182
-
183
-				return 'Bad value for MAIN_SMS_SENDMODE constant';
184
-			}
185
-		}
186
-		else
187
-		{
188
-			$this->error='No sms sent. Feature is disabled by option MAIN_DISABLE_ALL_SMS';
189
-			dol_syslog("CSMSFile::sendfile: ".$this->error, LOG_WARNING);
190
-		}
191
-
192
-		error_reporting($errorlevel);              // Reactive niveau erreur origine
193
-
194
-		return $res;
195
-	}
162
+                    if ($res <= 0)
163
+                    {
164
+                        dol_syslog("CSMSFile::sendfile: sms send error=".$this->error, LOG_ERR);
165
+                    }
166
+                    else
167
+                    {
168
+                        dol_syslog("CSMSFile::sendfile: sms send success with id=".$res, LOG_DEBUG);
169
+                        //var_dump($res);        // 1973128
170
+                        if (! empty($conf->global->MAIN_SMS_DEBUG)) $this->dump_sms_result($res);
171
+                    }
172
+                }
173
+                catch(Exception $e)
174
+                {
175
+                    dol_print_error('','Error to get list of senders: '.$e->getMessage());
176
+                }
177
+            }
178
+            else
179
+            {
180
+                // Send sms method not correctly defined
181
+                // --------------------------------------
182
+
183
+                return 'Bad value for MAIN_SMS_SENDMODE constant';
184
+            }
185
+        }
186
+        else
187
+        {
188
+            $this->error='No sms sent. Feature is disabled by option MAIN_DISABLE_ALL_SMS';
189
+            dol_syslog("CSMSFile::sendfile: ".$this->error, LOG_WARNING);
190
+        }
191
+
192
+        error_reporting($errorlevel);              // Reactive niveau erreur origine
193
+
194
+        return $res;
195
+    }
196 196
 
197 197
 
198 198
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
199
-	/**
200
-	 *  Write content of a SendSms request into a dump file (mode = all)
201
-	 *  Used for debugging.
202
-	 *
203
-	 *  @return	void
204
-	 */
205
-	function dump_sms()
206
-	{
199
+    /**
200
+     *  Write content of a SendSms request into a dump file (mode = all)
201
+     *  Used for debugging.
202
+     *
203
+     *  @return	void
204
+     */
205
+    function dump_sms()
206
+    {
207 207
         // phpcs:enable
208
-		global $conf,$dolibarr_main_data_root;
209
-
210
-		if (@is_writeable($dolibarr_main_data_root))	// Avoid fatal error on fopen with open_basedir
211
-		{
212
-			$outputfile=$dolibarr_main_data_root."/dolibarr_sms.log";
213
-			$fp = fopen($outputfile,"w");
214
-
215
-			fputs($fp, "From: ".$this->addr_from."\n");
216
-			fputs($fp, "To: ".$this->addr_to."\n");
217
-			fputs($fp, "Priority: ".$this->priority."\n");
218
-			fputs($fp, "Class: ".$this->class."\n");
219
-			fputs($fp, "Deferred: ".$this->deferred."\n");
220
-			fputs($fp, "DisableStop: ".$this->nostop."\n");
221
-			fputs($fp, "Message:\n".$this->message);
222
-
223
-			fclose($fp);
224
-			if (! empty($conf->global->MAIN_UMASK))
225
-			@chmod($outputfile, octdec($conf->global->MAIN_UMASK));
226
-		}
227
-	}
208
+        global $conf,$dolibarr_main_data_root;
209
+
210
+        if (@is_writeable($dolibarr_main_data_root))	// Avoid fatal error on fopen with open_basedir
211
+        {
212
+            $outputfile=$dolibarr_main_data_root."/dolibarr_sms.log";
213
+            $fp = fopen($outputfile,"w");
214
+
215
+            fputs($fp, "From: ".$this->addr_from."\n");
216
+            fputs($fp, "To: ".$this->addr_to."\n");
217
+            fputs($fp, "Priority: ".$this->priority."\n");
218
+            fputs($fp, "Class: ".$this->class."\n");
219
+            fputs($fp, "Deferred: ".$this->deferred."\n");
220
+            fputs($fp, "DisableStop: ".$this->nostop."\n");
221
+            fputs($fp, "Message:\n".$this->message);
222
+
223
+            fclose($fp);
224
+            if (! empty($conf->global->MAIN_UMASK))
225
+            @chmod($outputfile, octdec($conf->global->MAIN_UMASK));
226
+        }
227
+    }
228 228
 
229 229
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
230 230
     /**
@@ -241,7 +241,7 @@  discard block
 block discarded – undo
241 241
 
242 242
         if (@is_writeable($dolibarr_main_data_root))    // Avoid fatal error on fopen with open_basedir
243 243
         {
244
-        	$outputfile=$dolibarr_main_data_root."/dolibarr_sms.log";
244
+            $outputfile=$dolibarr_main_data_root."/dolibarr_sms.log";
245 245
             $fp = fopen($outputfile,"a+");
246 246
 
247 247
             fputs($fp, "\nResult id=".$result);
Please login to merge, or discard this patch.
Spacing   +56 added lines, -56 removed lines patch added patch discarded remove patch
@@ -37,7 +37,7 @@  discard block
 block discarded – undo
37 37
     /**
38 38
 	 * @var string Error code (or message)
39 39
 	 */
40
-	public $error='';
40
+	public $error = '';
41 41
 
42 42
 	public $addr_from;
43 43
 	public $addr_to;
@@ -59,19 +59,19 @@  discard block
 block discarded – undo
59 59
 	 *	@param 	int		$priority			Priority
60 60
 	 *	@param 	int		$class				Class
61 61
 	 */
62
-	function __construct($to,$from,$msg,$deliveryreceipt=0,$deferred=0,$priority=3,$class=1)
62
+	function __construct($to, $from, $msg, $deliveryreceipt = 0, $deferred = 0, $priority = 3, $class = 1)
63 63
 	{
64 64
 		global $conf;
65 65
 
66 66
 		// On definit fin de ligne
67
-		$this->eol="\n";
68
-		if (preg_match('/^win/i',PHP_OS)) $this->eol="\r\n";
69
-		if (preg_match('/^mac/i',PHP_OS)) $this->eol="\r";
67
+		$this->eol = "\n";
68
+		if (preg_match('/^win/i', PHP_OS)) $this->eol = "\r\n";
69
+		if (preg_match('/^mac/i', PHP_OS)) $this->eol = "\r";
70 70
 
71 71
 		// If ending method not defined
72 72
 		if (empty($conf->global->MAIN_SMS_SENDMODE))
73 73
 		{
74
-		    $this->error='No SMS Engine defined';
74
+		    $this->error = 'No SMS Engine defined';
75 75
 		    return -1;
76 76
 		}
77 77
 
@@ -79,13 +79,13 @@  discard block
 block discarded – undo
79 79
 		dol_syslog("CSMSFile::CSMSFile: deferred=".$deferred." priority=".$priority." class=".$class, LOG_DEBUG);
80 80
 
81 81
 		// Action according to choosed sending method
82
-	    $this->addr_from=$from;
83
-	    $this->addr_to=$to;
84
-        $this->deferred=$deferred;
85
-        $this->priority=$priority;
86
-        $this->class=$class;
87
-        $this->message=$msg;
88
-        $this->nostop=false;
82
+	    $this->addr_from = $from;
83
+	    $this->addr_to = $to;
84
+        $this->deferred = $deferred;
85
+        $this->priority = $priority;
86
+        $this->class = $class;
87
+        $this->message = $msg;
88
+        $this->nostop = false;
89 89
 	}
90 90
 
91 91
 
@@ -98,17 +98,17 @@  discard block
 block discarded – undo
98 98
 	{
99 99
 		global $conf;
100 100
 
101
-		$errorlevel=error_reporting();
102
-		error_reporting($errorlevel ^ E_WARNING);   // Desactive warnings
101
+		$errorlevel = error_reporting();
102
+		error_reporting($errorlevel ^ E_WARNING); // Desactive warnings
103 103
 
104
-		$res=false;
104
+		$res = false;
105 105
 
106 106
         dol_syslog("CSMSFile::sendfile addr_to=".$this->addr_to, LOG_DEBUG);
107 107
         dol_syslog("CSMSFile::sendfile message=\n".$this->message);
108 108
 
109
-        $this->message=stripslashes($this->message);
109
+        $this->message = stripslashes($this->message);
110 110
 
111
-        if (! empty($conf->global->MAIN_SMS_DEBUG)) $this->dump_sms();
111
+        if (!empty($conf->global->MAIN_SMS_DEBUG)) $this->dump_sms();
112 112
 
113 113
 		if (empty($conf->global->MAIN_DISABLE_ALL_SMS))
114 114
 		{
@@ -117,46 +117,46 @@  discard block
 block discarded – undo
117 117
 		    if ($conf->global->MAIN_SMS_SENDMODE == 'ovh')    // Backward compatibility    @deprecated
118 118
 			{
119 119
 				dol_include_once('/ovh/class/ovhsms.class.php');
120
-				$sms=new OvhSms($this->db);
121
-				$sms->expe=$this->addr_from;
122
-				$sms->dest=$this->addr_to;
123
-				$sms->message=$this->message;
124
-				$sms->deferred=$this->deferred;
125
-				$sms->priority=$this->priority;
126
-                $sms->class=$this->class;
127
-                $sms->nostop=$this->nostop;
128
-
129
-                $res=$sms->SmsSend();
120
+				$sms = new OvhSms($this->db);
121
+				$sms->expe = $this->addr_from;
122
+				$sms->dest = $this->addr_to;
123
+				$sms->message = $this->message;
124
+				$sms->deferred = $this->deferred;
125
+				$sms->priority = $this->priority;
126
+                $sms->class = $this->class;
127
+                $sms->nostop = $this->nostop;
128
+
129
+                $res = $sms->SmsSend();
130 130
 				if ($res <= 0)
131 131
 				{
132
-					$this->error=$sms->error;
132
+					$this->error = $sms->error;
133 133
 					dol_syslog("CSMSFile::sendfile: sms send error=".$this->error, LOG_ERR);
134 134
 				}
135 135
 				else
136 136
 				{
137 137
 					dol_syslog("CSMSFile::sendfile: sms send success with id=".$res, LOG_DEBUG);
138 138
 					//var_dump($res);        // 1973128
139
-					if (! empty($conf->global->MAIN_SMS_DEBUG)) $this->dump_sms_result($res);
139
+					if (!empty($conf->global->MAIN_SMS_DEBUG)) $this->dump_sms_result($res);
140 140
 				}
141 141
 			}
142
-		    else if (! empty($conf->global->MAIN_SMS_SENDMODE))    // $conf->global->MAIN_SMS_SENDMODE looks like a value 'class@module'
142
+		    else if (!empty($conf->global->MAIN_SMS_SENDMODE))    // $conf->global->MAIN_SMS_SENDMODE looks like a value 'class@module'
143 143
 		    {
144
-		        $tmp=explode('@',$conf->global->MAIN_SMS_SENDMODE);
145
-		        $classfile=$tmp[0]; $module=(empty($tmp[1])?$tmp[0]:$tmp[1]);
144
+		        $tmp = explode('@', $conf->global->MAIN_SMS_SENDMODE);
145
+		        $classfile = $tmp[0]; $module = (empty($tmp[1]) ? $tmp[0] : $tmp[1]);
146 146
 		        dol_include_once('/'.$module.'/class/'.$classfile.'.class.php');
147 147
 		        try
148 148
 		        {
149
-		            $classname=ucfirst($classfile);
149
+		            $classname = ucfirst($classfile);
150 150
 		            $sms = new $classname($this->db);
151
-		            $sms->expe=$this->addr_from;
152
-		            $sms->dest=$this->addr_to;
153
-		            $sms->deferred=$this->deferred;
154
-		            $sms->priority=$this->priority;
155
-		            $sms->class=$this->class;
156
-		            $sms->message=$this->message;
157
-		            $sms->nostop=$this->nostop;
158
-
159
-                    $res=$sms->SmsSend();
151
+		            $sms->expe = $this->addr_from;
152
+		            $sms->dest = $this->addr_to;
153
+		            $sms->deferred = $this->deferred;
154
+		            $sms->priority = $this->priority;
155
+		            $sms->class = $this->class;
156
+		            $sms->message = $this->message;
157
+		            $sms->nostop = $this->nostop;
158
+
159
+                    $res = $sms->SmsSend();
160 160
                     $this->error = $sms->error;
161 161
                     $this->errors = $sms->errors;
162 162
     				if ($res <= 0)
@@ -167,12 +167,12 @@  discard block
 block discarded – undo
167 167
     				{
168 168
     					dol_syslog("CSMSFile::sendfile: sms send success with id=".$res, LOG_DEBUG);
169 169
     					//var_dump($res);        // 1973128
170
-    					if (! empty($conf->global->MAIN_SMS_DEBUG)) $this->dump_sms_result($res);
170
+    					if (!empty($conf->global->MAIN_SMS_DEBUG)) $this->dump_sms_result($res);
171 171
     				}
172 172
 		        }
173
-		        catch(Exception $e)
173
+		        catch (Exception $e)
174 174
 		        {
175
-		            dol_print_error('','Error to get list of senders: '.$e->getMessage());
175
+		            dol_print_error('', 'Error to get list of senders: '.$e->getMessage());
176 176
 		        }
177 177
 		    }
178 178
 			else
@@ -185,11 +185,11 @@  discard block
 block discarded – undo
185 185
 		}
186 186
 		else
187 187
 		{
188
-			$this->error='No sms sent. Feature is disabled by option MAIN_DISABLE_ALL_SMS';
188
+			$this->error = 'No sms sent. Feature is disabled by option MAIN_DISABLE_ALL_SMS';
189 189
 			dol_syslog("CSMSFile::sendfile: ".$this->error, LOG_WARNING);
190 190
 		}
191 191
 
192
-		error_reporting($errorlevel);              // Reactive niveau erreur origine
192
+		error_reporting($errorlevel); // Reactive niveau erreur origine
193 193
 
194 194
 		return $res;
195 195
 	}
@@ -205,12 +205,12 @@  discard block
 block discarded – undo
205 205
 	function dump_sms()
206 206
 	{
207 207
         // phpcs:enable
208
-		global $conf,$dolibarr_main_data_root;
208
+		global $conf, $dolibarr_main_data_root;
209 209
 
210 210
 		if (@is_writeable($dolibarr_main_data_root))	// Avoid fatal error on fopen with open_basedir
211 211
 		{
212
-			$outputfile=$dolibarr_main_data_root."/dolibarr_sms.log";
213
-			$fp = fopen($outputfile,"w");
212
+			$outputfile = $dolibarr_main_data_root."/dolibarr_sms.log";
213
+			$fp = fopen($outputfile, "w");
214 214
 
215 215
 			fputs($fp, "From: ".$this->addr_from."\n");
216 216
 			fputs($fp, "To: ".$this->addr_to."\n");
@@ -221,7 +221,7 @@  discard block
 block discarded – undo
221 221
 			fputs($fp, "Message:\n".$this->message);
222 222
 
223 223
 			fclose($fp);
224
-			if (! empty($conf->global->MAIN_UMASK))
224
+			if (!empty($conf->global->MAIN_UMASK))
225 225
 			@chmod($outputfile, octdec($conf->global->MAIN_UMASK));
226 226
 		}
227 227
 	}
@@ -237,17 +237,17 @@  discard block
 block discarded – undo
237 237
     function dump_sms_result($result)
238 238
     {
239 239
         // phpcs:enable
240
-        global $conf,$dolibarr_main_data_root;
240
+        global $conf, $dolibarr_main_data_root;
241 241
 
242 242
         if (@is_writeable($dolibarr_main_data_root))    // Avoid fatal error on fopen with open_basedir
243 243
         {
244
-        	$outputfile=$dolibarr_main_data_root."/dolibarr_sms.log";
245
-            $fp = fopen($outputfile,"a+");
244
+        	$outputfile = $dolibarr_main_data_root."/dolibarr_sms.log";
245
+            $fp = fopen($outputfile, "a+");
246 246
 
247 247
             fputs($fp, "\nResult id=".$result);
248 248
 
249 249
             fclose($fp);
250
-            if (! empty($conf->global->MAIN_UMASK))
250
+            if (!empty($conf->global->MAIN_UMASK))
251 251
             @chmod($outputfile, octdec($conf->global->MAIN_UMASK));
252 252
         }
253 253
     }
Please login to merge, or discard this patch.
Braces   +38 added lines, -24 removed lines patch added patch discarded remove patch
@@ -65,8 +65,12 @@  discard block
 block discarded – undo
65 65
 
66 66
 		// On definit fin de ligne
67 67
 		$this->eol="\n";
68
-		if (preg_match('/^win/i',PHP_OS)) $this->eol="\r\n";
69
-		if (preg_match('/^mac/i',PHP_OS)) $this->eol="\r";
68
+		if (preg_match('/^win/i',PHP_OS)) {
69
+		    $this->eol="\r\n";
70
+		}
71
+		if (preg_match('/^mac/i',PHP_OS)) {
72
+		    $this->eol="\r";
73
+		}
70 74
 
71 75
 		// If ending method not defined
72 76
 		if (empty($conf->global->MAIN_SMS_SENDMODE))
@@ -108,15 +112,19 @@  discard block
 block discarded – undo
108 112
 
109 113
         $this->message=stripslashes($this->message);
110 114
 
111
-        if (! empty($conf->global->MAIN_SMS_DEBUG)) $this->dump_sms();
115
+        if (! empty($conf->global->MAIN_SMS_DEBUG)) {
116
+            $this->dump_sms();
117
+        }
112 118
 
113 119
 		if (empty($conf->global->MAIN_DISABLE_ALL_SMS))
114 120
 		{
115 121
 
116 122
 		    // Action according to choosed sending method
117
-		    if ($conf->global->MAIN_SMS_SENDMODE == 'ovh')    // Backward compatibility    @deprecated
123
+		    if ($conf->global->MAIN_SMS_SENDMODE == 'ovh') {
124
+		        // Backward compatibility    @deprecated
118 125
 			{
119 126
 				dol_include_once('/ovh/class/ovhsms.class.php');
127
+		    }
120 128
 				$sms=new OvhSms($this->db);
121 129
 				$sms->expe=$this->addr_from;
122 130
 				$sms->dest=$this->addr_to;
@@ -131,17 +139,19 @@  discard block
 block discarded – undo
131 139
 				{
132 140
 					$this->error=$sms->error;
133 141
 					dol_syslog("CSMSFile::sendfile: sms send error=".$this->error, LOG_ERR);
134
-				}
135
-				else
142
+				} else
136 143
 				{
137 144
 					dol_syslog("CSMSFile::sendfile: sms send success with id=".$res, LOG_DEBUG);
138 145
 					//var_dump($res);        // 1973128
139
-					if (! empty($conf->global->MAIN_SMS_DEBUG)) $this->dump_sms_result($res);
146
+					if (! empty($conf->global->MAIN_SMS_DEBUG)) {
147
+					    $this->dump_sms_result($res);
148
+					}
140 149
 				}
141
-			}
142
-		    else if (! empty($conf->global->MAIN_SMS_SENDMODE))    // $conf->global->MAIN_SMS_SENDMODE looks like a value 'class@module'
150
+			} else if (! empty($conf->global->MAIN_SMS_SENDMODE)) {
151
+		        // $conf->global->MAIN_SMS_SENDMODE looks like a value 'class@module'
143 152
 		    {
144 153
 		        $tmp=explode('@',$conf->global->MAIN_SMS_SENDMODE);
154
+		    }
145 155
 		        $classfile=$tmp[0]; $module=(empty($tmp[1])?$tmp[0]:$tmp[1]);
146 156
 		        dol_include_once('/'.$module.'/class/'.$classfile.'.class.php');
147 157
 		        try
@@ -162,28 +172,26 @@  discard block
 block discarded – undo
162 172
     				if ($res <= 0)
163 173
     				{
164 174
     					dol_syslog("CSMSFile::sendfile: sms send error=".$this->error, LOG_ERR);
165
-    				}
166
-    				else
175
+    				} else
167 176
     				{
168 177
     					dol_syslog("CSMSFile::sendfile: sms send success with id=".$res, LOG_DEBUG);
169 178
     					//var_dump($res);        // 1973128
170
-    					if (! empty($conf->global->MAIN_SMS_DEBUG)) $this->dump_sms_result($res);
179
+    					if (! empty($conf->global->MAIN_SMS_DEBUG)) {
180
+    					    $this->dump_sms_result($res);
181
+    					}
171 182
     				}
172
-		        }
173
-		        catch(Exception $e)
183
+		        } catch(Exception $e)
174 184
 		        {
175 185
 		            dol_print_error('','Error to get list of senders: '.$e->getMessage());
176 186
 		        }
177
-		    }
178
-			else
187
+		    } else
179 188
 			{
180 189
 				// Send sms method not correctly defined
181 190
 				// --------------------------------------
182 191
 
183 192
 				return 'Bad value for MAIN_SMS_SENDMODE constant';
184 193
 			}
185
-		}
186
-		else
194
+		} else
187 195
 		{
188 196
 			$this->error='No sms sent. Feature is disabled by option MAIN_DISABLE_ALL_SMS';
189 197
 			dol_syslog("CSMSFile::sendfile: ".$this->error, LOG_WARNING);
@@ -207,9 +215,11 @@  discard block
 block discarded – undo
207 215
         // phpcs:enable
208 216
 		global $conf,$dolibarr_main_data_root;
209 217
 
210
-		if (@is_writeable($dolibarr_main_data_root))	// Avoid fatal error on fopen with open_basedir
218
+		if (@is_writeable($dolibarr_main_data_root)) {
219
+		    // Avoid fatal error on fopen with open_basedir
211 220
 		{
212 221
 			$outputfile=$dolibarr_main_data_root."/dolibarr_sms.log";
222
+		}
213 223
 			$fp = fopen($outputfile,"w");
214 224
 
215 225
 			fputs($fp, "From: ".$this->addr_from."\n");
@@ -221,8 +231,9 @@  discard block
 block discarded – undo
221 231
 			fputs($fp, "Message:\n".$this->message);
222 232
 
223 233
 			fclose($fp);
224
-			if (! empty($conf->global->MAIN_UMASK))
225
-			@chmod($outputfile, octdec($conf->global->MAIN_UMASK));
234
+			if (! empty($conf->global->MAIN_UMASK)) {
235
+						@chmod($outputfile, octdec($conf->global->MAIN_UMASK));
236
+			}
226 237
 		}
227 238
 	}
228 239
 
@@ -239,16 +250,19 @@  discard block
 block discarded – undo
239 250
         // phpcs:enable
240 251
         global $conf,$dolibarr_main_data_root;
241 252
 
242
-        if (@is_writeable($dolibarr_main_data_root))    // Avoid fatal error on fopen with open_basedir
253
+        if (@is_writeable($dolibarr_main_data_root)) {
254
+            // Avoid fatal error on fopen with open_basedir
243 255
         {
244 256
         	$outputfile=$dolibarr_main_data_root."/dolibarr_sms.log";
257
+        }
245 258
             $fp = fopen($outputfile,"a+");
246 259
 
247 260
             fputs($fp, "\nResult id=".$result);
248 261
 
249 262
             fclose($fp);
250
-            if (! empty($conf->global->MAIN_UMASK))
251
-            @chmod($outputfile, octdec($conf->global->MAIN_UMASK));
263
+            if (! empty($conf->global->MAIN_UMASK)) {
264
+                        @chmod($outputfile, octdec($conf->global->MAIN_UMASK));
265
+            }
252 266
         }
253 267
     }
254 268
 }
Please login to merge, or discard this patch.