Passed
Push — master ( 8f7a8e...7e4a07 )
by Alxarafe
20:11
created
dolibarr/htdocs/core/class/commonobjectline.class.php 3 patches
Indentation   +47 added lines, -47 removed lines patch added patch discarded remove patch
@@ -29,25 +29,25 @@  discard block
 block discarded – undo
29 29
  */
30 30
 abstract class CommonObjectLine extends CommonObject
31 31
 {
32
-	/**
33
-	 * Id of the line
34
-	 * @var int
35
-	 */
36
-	public $id;
32
+    /**
33
+     * Id of the line
34
+     * @var int
35
+     */
36
+    public $id;
37 37
 
38
-	/**
39
-	 * Id of the line
40
-	 * @var int
41
-	 * @deprecated Try to use id property as possible (even if field into database is still rowid)
42
-	 * @see id
43
-	 */
44
-	public $rowid;
38
+    /**
39
+     * Id of the line
40
+     * @var int
41
+     * @deprecated Try to use id property as possible (even if field into database is still rowid)
42
+     * @see id
43
+     */
44
+    public $rowid;
45 45
 
46
-	/**
47
-	 * Product/service unit code ('km', 'm', 'p', ...)
48
-	 * @var string
49
-	 */
50
-	public $fk_unit;
46
+    /**
47
+     * Product/service unit code ('km', 'm', 'p', ...)
48
+     * @var string
49
+     */
50
+    public $fk_unit;
51 51
 
52 52
 
53 53
     /**
@@ -57,40 +57,40 @@  discard block
 block discarded – undo
57 57
      * 	@param	string $type Label type (long or short)
58 58
      *	@return	string|int <0 if ko, label if ok
59 59
      */
60
-	public function getLabelOfUnit($type='long')
61
-	{
62
-		global $langs;
60
+    public function getLabelOfUnit($type='long')
61
+    {
62
+        global $langs;
63 63
 
64
-		if (!$this->fk_unit) {
65
-			return '';
66
-		}
64
+        if (!$this->fk_unit) {
65
+            return '';
66
+        }
67 67
 
68
-		$langs->load('products');
68
+        $langs->load('products');
69 69
 
70
-		$label_type = 'label';
70
+        $label_type = 'label';
71 71
 
72
-		if ($type == 'short')
73
-		{
74
-			$label_type = 'short_label';
75
-		}
72
+        if ($type == 'short')
73
+        {
74
+            $label_type = 'short_label';
75
+        }
76 76
 
77
-		$sql = 'select '.$label_type.' from '.MAIN_DB_PREFIX.'c_units where rowid='.$this->fk_unit;
78
-		$resql = $this->db->query($sql);
79
-		if($resql && $this->db->num_rows($resql) > 0)
80
-		{
81
-			$res = $this->db->fetch_array($resql);
82
-			$label = $res[$label_type];
83
-			$this->db->free($resql);
84
-			return $label;
85
-		}
86
-		else
87
-		{
88
-			$this->error=$this->db->error().' sql='.$sql;
89
-			dol_syslog(get_class($this)."::getLabelOfUnit Error ".$this->error, LOG_ERR);
90
-			return -1;
91
-		}
92
-	}
93
-	// Currently we need function at end of file CommonObject for all object lines. Should find a way to avoid duplicate code.
77
+        $sql = 'select '.$label_type.' from '.MAIN_DB_PREFIX.'c_units where rowid='.$this->fk_unit;
78
+        $resql = $this->db->query($sql);
79
+        if($resql && $this->db->num_rows($resql) > 0)
80
+        {
81
+            $res = $this->db->fetch_array($resql);
82
+            $label = $res[$label_type];
83
+            $this->db->free($resql);
84
+            return $label;
85
+        }
86
+        else
87
+        {
88
+            $this->error=$this->db->error().' sql='.$sql;
89
+            dol_syslog(get_class($this)."::getLabelOfUnit Error ".$this->error, LOG_ERR);
90
+            return -1;
91
+        }
92
+    }
93
+    // Currently we need function at end of file CommonObject for all object lines. Should find a way to avoid duplicate code.
94 94
 
95
-	// For the moment we use the extends on CommonObject until PHP min is 5.4 so use Traits.
95
+    // For the moment we use the extends on CommonObject until PHP min is 5.4 so use Traits.
96 96
 }
Please login to merge, or discard this patch.
Spacing   +3 added lines, -3 removed lines patch added patch discarded remove patch
@@ -57,7 +57,7 @@  discard block
 block discarded – undo
57 57
      * 	@param	string $type Label type (long or short)
58 58
      *	@return	string|int <0 if ko, label if ok
59 59
      */
60
-	public function getLabelOfUnit($type='long')
60
+	public function getLabelOfUnit($type = 'long')
61 61
 	{
62 62
 		global $langs;
63 63
 
@@ -76,7 +76,7 @@  discard block
 block discarded – undo
76 76
 
77 77
 		$sql = 'select '.$label_type.' from '.MAIN_DB_PREFIX.'c_units where rowid='.$this->fk_unit;
78 78
 		$resql = $this->db->query($sql);
79
-		if($resql && $this->db->num_rows($resql) > 0)
79
+		if ($resql && $this->db->num_rows($resql) > 0)
80 80
 		{
81 81
 			$res = $this->db->fetch_array($resql);
82 82
 			$label = $res[$label_type];
@@ -85,7 +85,7 @@  discard block
 block discarded – undo
85 85
 		}
86 86
 		else
87 87
 		{
88
-			$this->error=$this->db->error().' sql='.$sql;
88
+			$this->error = $this->db->error().' sql='.$sql;
89 89
 			dol_syslog(get_class($this)."::getLabelOfUnit Error ".$this->error, LOG_ERR);
90 90
 			return -1;
91 91
 		}
Please login to merge, or discard this patch.
Braces   +1 added lines, -2 removed lines patch added patch discarded remove patch
@@ -82,8 +82,7 @@
 block discarded – undo
82 82
 			$label = $res[$label_type];
83 83
 			$this->db->free($resql);
84 84
 			return $label;
85
-		}
86
-		else
85
+		} else
87 86
 		{
88 87
 			$this->error=$this->db->error().' sql='.$sql;
89 88
 			dol_syslog(get_class($this)."::getLabelOfUnit Error ".$this->error, LOG_ERR);
Please login to merge, or discard this patch.
dolibarr/htdocs/core/class/fiscalyear.class.php 3 patches
Indentation   +380 added lines, -380 removed lines patch added patch discarded remove patch
@@ -28,384 +28,384 @@
 block discarded – undo
28 28
  */
29 29
 class Fiscalyear extends CommonObject
30 30
 {
31
-	/**
32
-	 * @var string ID to identify managed object
33
-	 */
34
-	public $element='fiscalyear';
35
-
36
-	/**
37
-	 * @var string Name of table without prefix where object is stored
38
-	 */
39
-	public $table_element='accounting_fiscalyear';
40
-
41
-	/**
42
-	 * @var int    Name of subtable line
43
-	 */
44
-	public $table_element_line = '';
45
-
46
-	/**
47
-	 * @var int Field with ID of parent key if this field has a parent
48
-	 */
49
-	public $fk_element = '';
50
-
51
-	/**
52
-	 * 0=No test on entity, 1=Test with field entity, 2=Test with link by societe
53
-	 * @var int
54
-	 */
55
-	public $ismultientitymanaged = 1;
56
-
57
-	/**
58
-	 * @var int ID
59
-	 */
60
-	public $rowid;
61
-
62
-	/**
63
-	 * @var string fiscal year label
64
-	 */
65
-	public $label;
66
-
67
-	public $date_start;
68
-	public $date_end;
69
-	public $datec;
70
-	public $statut;		// 0=open, 1=closed
71
-
72
-	/**
73
-	 * @var int Entity
74
-	 */
75
-	public $entity;
76
-
77
-	public $statuts=array();
78
-	public $statuts_short=array();
79
-
80
-	/**
81
-	 * Constructor
82
-	 *
83
-	 * @param	DoliDB		$db		Database handler
84
-	 */
85
-	function __construct(DoliDB $db)
86
-	{
87
-		global $langs;
88
-
89
-		$this->db = $db;
90
-
91
-		$this->statuts_short = array(0 => 'Opened', 1 => 'Closed');
92
-		$this->statuts = array(0 => 'Opened', 1 => 'Closed');
93
-	}
94
-
95
-	/**
96
-	 *	Create object in database
97
-	 *
98
-	 *	@param		User	$user   User making creation
99
-	 *	@return 	int				<0 if KO, >0 if OK
100
-	 */
101
-	function create($user)
102
-	{
103
-		global $conf;
104
-
105
-		$error = 0;
106
-
107
-		$now=dol_now();
108
-
109
-		$this->db->begin();
110
-
111
-		$sql = "INSERT INTO ".MAIN_DB_PREFIX."accounting_fiscalyear (";
112
-		$sql.= "label";
113
-		$sql.= ", date_start";
114
-		$sql.= ", date_end";
115
-		$sql.= ", statut";
116
-		$sql.= ", entity";
117
-		$sql.= ", datec";
118
-		$sql.= ", fk_user_author";
119
-		$sql.= ") VALUES (";
120
-		$sql.= " '".$this->db->escape($this->label)."'";
121
-		$sql.= ", '".$this->db->idate($this->date_start)."'";
122
-		$sql.= ", ".($this->date_end ? "'".$this->db->idate($this->date_end)."'":"null");
123
-		$sql.= ", 0";
124
-		$sql.= ", ".$conf->entity;
125
-		$sql.= ", '".$this->db->idate($now)."'";
126
-		$sql.= ", ". $user->id;
127
-		$sql.= ")";
128
-
129
-		dol_syslog(get_class($this)."::create", LOG_DEBUG);
130
-		$result = $this->db->query($sql);
131
-		if ($result)
132
-		{
133
-			$this->id = $this->db->last_insert_id(MAIN_DB_PREFIX."accounting_fiscalyear");
134
-
135
-			$result=$this->update($user);
136
-			if ($result > 0)
137
-			{
138
-				$this->db->commit();
139
-				return $this->id;
140
-			}
141
-			else
142
-			{
143
-				$this->error=$this->db->lasterror();
144
-				$this->db->rollback();
145
-				return $result;
146
-			}
147
-		}
148
-		else
149
-		{
150
-			$this->error=$this->db->lasterror()." sql=".$sql;
151
-			$this->db->rollback();
152
-			return -1;
153
-		}
154
-	}
155
-
156
-	/**
157
-	 *	Update record
158
-	 *
159
-	 *	@param	User	$user		User making update
160
-	 *	@return	int					<0 if KO, >0 if OK
161
-	 */
162
-	function update($user)
163
-	{
164
-		global $langs;
165
-
166
-		// Check parameters
167
-		if (empty($this->date_start) && empty($this->date_end))
168
-		{
169
-			$this->error='ErrorBadParameter';
170
-			return -1;
171
-		}
172
-
173
-		$this->db->begin();
174
-
175
-		$sql = "UPDATE ".MAIN_DB_PREFIX."accounting_fiscalyear";
176
-		$sql .= " SET label = '".$this->db->escape($this->label)."'";
177
-		$sql .= ", date_start = '".$this->db->idate($this->date_start)."'";
178
-		$sql .= ", date_end = ".($this->date_end ? "'".$this->db->idate($this->date_end)."'" : "null");
179
-		$sql .= ", statut = '".$this->db->escape($this->statut?$this->statut:0)."'";
180
-		$sql .= ", datec = " . ($this->datec != '' ? "'".$this->db->idate($this->datec)."'" : 'null');
181
-		$sql .= ", fk_user_modif = " . $user->id;
182
-		$sql .= " WHERE rowid = ".$this->id;
183
-
184
-		dol_syslog(get_class($this)."::update", LOG_DEBUG);
185
-		$result = $this->db->query($sql);
186
-		if ($result)
187
-		{
188
-			$this->db->commit();
189
-			return 1;
190
-		}
191
-		else
192
-		{
193
-			$this->error=$this->db->lasterror();
194
-			dol_syslog($this->error, LOG_ERR);
195
-			$this->db->rollback();
196
-			return -1;
197
-		}
198
-	}
199
-
200
-	/**
201
-	* Load an object from database
202
-	*
203
-	* @param	int		$id		Id of record to load
204
-	* @return	int				<0 if KO, >0 if OK
205
-	*/
206
-	function fetch($id)
207
-	{
208
-		$sql = "SELECT rowid, label, date_start, date_end, statut";
209
-		$sql.= " FROM ".MAIN_DB_PREFIX."accounting_fiscalyear";
210
-		$sql.= " WHERE rowid = ".$id;
211
-
212
-		dol_syslog(get_class($this)."::fetch", LOG_DEBUG);
213
-		$result = $this->db->query($sql);
214
-		if ( $result )
215
-		{
216
-			$obj = $this->db->fetch_object($result);
217
-
218
-			$this->id			= $obj->rowid;
219
-			$this->ref			= $obj->rowid;
220
-			$this->date_start	= $this->db->jdate($obj->date_start);
221
-			$this->date_end		= $this->db->jdate($obj->date_end);
222
-			$this->label		= $obj->label;
223
-			$this->statut	    = $obj->statut;
224
-
225
-			return 1;
226
-		}
227
-		else
228
-		{
229
-			$this->error=$this->db->lasterror();
230
-			return -1;
231
-		}
232
-	}
233
-
234
-   /**
235
-	*	Delete record
236
-	*
237
-	*	@param	int		$id		Id of record to delete
238
-	*	@return	int				<0 if KO, >0 if OK
239
-	*/
240
-	function delete($id)
241
-	{
242
-		$this->db->begin();
243
-
244
-		$sql = "DELETE FROM ".MAIN_DB_PREFIX."accounting_fiscalyear WHERE rowid = ".$id;
245
-
246
-		dol_syslog(get_class($this)."::delete", LOG_DEBUG);
247
-		$result = $this->db->query($sql);
248
-		if ($result)
249
-		{
250
-			$this->db->commit();
251
-			return 1;
252
-		}
253
-		else
254
-		{
255
-			$this->error=$this->db->lasterror();
256
-			$this->db->rollback();
257
-			return -1;
258
-		}
259
-	}
260
-
261
-	/**
262
-	 * Give a label from a status
263
-	 *
264
-	 * @param	int		$mode   	0=long label, 1=short label, 2=Picto + short label, 3=Picto, 4=Picto + long label, 5=Short label + Picto
265
-	 * @return  string   		   	Label
266
-	 */
267
-	function getLibStatut($mode=0)
268
-	{
269
-		return $this->LibStatut($this->statut,$mode);
270
-	}
271
-
272
-	// phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
273
-	/**
274
-	 *  Give a label from a status
275
-	 *
276
-	 *  @param	int		$statut     Id status
277
-	 *  @param  int		$mode       0=long label, 1=short label, 2=Picto + short label, 3=Picto, 4=Picto + long label, 5=Short label + Picto
278
-	 *  @return string      		Label
279
-	 */
280
-	function LibStatut($statut,$mode=0)
281
-	{
282
-		// phpcs:enable
283
-		global $langs;
284
-
285
-		if ($mode == 0)
286
-		{
287
-			return $langs->trans($this->statuts[$statut]);
288
-		}
289
-		elseif ($mode == 1)
290
-		{
291
-			return $langs->trans($this->statuts_short[$statut]);
292
-		}
293
-		elseif ($mode == 2)
294
-		{
295
-			if ($statut==0) return img_picto($langs->trans($this->statuts_short[$statut]),'statut4').' '.$langs->trans($this->statuts_short[$statut]);
296
-			elseif ($statut==1) return img_picto($langs->trans($this->statuts_short[$statut]),'statut8').' '.$langs->trans($this->statuts_short[$statut]);
297
-		}
298
-		elseif ($mode == 3)
299
-		{
300
-			if ($statut==0 && ! empty($this->statuts_short[$statut])) return img_picto($langs->trans($this->statuts_short[$statut]),'statut4');
301
-			elseif ($statut==1 && ! empty($this->statuts_short[$statut])) return img_picto($langs->trans($this->statuts_short[$statut]),'statut8');
302
-		}
303
-		elseif ($mode == 4)
304
-		{
305
-			if ($statut==0 && ! empty($this->statuts_short[$statut])) return img_picto($langs->trans($this->statuts_short[$statut]),'statut4').' '.$langs->trans($this->statuts[$statut]);
306
-			elseif ($statut==1 && ! empty($this->statuts_short[$statut])) return img_picto($langs->trans($this->statuts_short[$statut]),'statut8').' '.$langs->trans($this->statuts[$statut]);
307
-		}
308
-		elseif ($mode == 5)
309
-		{
310
-			if ($statut==0 && ! empty($this->statuts_short[$statut])) return $langs->trans($this->statuts_short[$statut]).' '.img_picto($langs->trans($this->statuts_short[$statut]),'statut4');
311
-			elseif ($statut==1 && ! empty($this->statuts_short[$statut])) return $langs->trans($this->statuts_short[$statut]).' '.img_picto($langs->trans($this->statuts_short[$statut]),'statut6');
312
-		}
313
-	}
314
-
315
-	/**
316
-	 * Information on record
317
-	 *
318
-	 * @param	int		$id      Id of record
319
-	 * @return	void
320
-	 */
321
-	function info($id)
322
-	{
323
-		$sql = 'SELECT fy.rowid, fy.datec, fy.fk_user_author, fy.fk_user_modif,';
324
-		$sql.= ' fy.tms';
325
-		$sql.= ' FROM '.MAIN_DB_PREFIX.'accounting_fiscalyear as fy';
326
-		$sql.= ' WHERE fy.rowid = '.$id;
327
-
328
-		dol_syslog(get_class($this)."::fetch info", LOG_DEBUG);
329
-		$result = $this->db->query($sql);
330
-
331
-		if ($result)
332
-		{
333
-			if ($this->db->num_rows($result))
334
-			{
335
-				$obj = $this->db->fetch_object($result);
336
-				$this->id = $obj->rowid;
337
-				if ($obj->fk_user_author)
338
-				{
339
-					$cuser = new User($this->db);
340
-					$cuser->fetch($obj->fk_user_author);
341
-					$this->user_creation = $cuser;
342
-				}
343
-				if ($obj->fk_user_modif)
344
-				{
345
-					$muser = new User($this->db);
346
-					$muser->fetch($obj->fk_user_modif);
347
-					$this->user_modification = $muser;
348
-				}
349
-				$this->date_creation     = $this->db->jdate($obj->datec);
350
-				$this->date_modification = $this->db->jdate($obj->tms);
351
-			}
352
-			$this->db->free($result);
353
-		}
354
-		else
355
-		{
356
-			dol_print_error($this->db);
357
-		}
358
-	}
359
-
360
-	/**
361
-	 *  Return the number of entries by fiscal year
362
-	 *
363
-	 *	@param	int		$datestart	Date start to scan
364
-	 *	@param	int		$dateend	Date end to scan
365
-	 *	@return	string				Number of entries
366
-	 */
367
-	function getAccountancyEntriesByFiscalYear($datestart, $dateend)
368
-	{
369
-		global $conf;
370
-
371
-		$sql = "SELECT count(DISTINCT piece_num) as nb";
372
-		$sql.= " FROM ".MAIN_DB_PREFIX."accounting_bookkeeping ";
373
-		$sql.= " WHERE doc_date >= '".$datestart."' and doc_date <= '".$dateend."'";
374
-
375
-		$resql=$this->db->query($sql);
376
-		if ($resql)
377
-		{
378
-			$obj = $this->db->fetch_object($resql);
379
-			$nb = $obj->nb;
380
-		}
381
-		else dol_print_error($this->db);
382
-
383
-		return $nb;
384
-	}
385
-
386
-	/**
387
-	 *  Return the number of movements by fiscal year
388
-	 *
389
-	 *	@param	int		$datestart	Date start to scan
390
-	 *	@param	int		$dateend	Date end to scan
391
-	 *	@return	string				Number of movements
392
-	 */
393
-	function getAccountancyMovementsByFiscalYear($datestart, $dateend)
394
-	{
395
-		global $conf;
396
-
397
-		$sql = "SELECT count(rowid) as nb";
398
-		$sql.= " FROM ".MAIN_DB_PREFIX."accounting_bookkeeping ";
399
-		$sql.= " WHERE doc_date >= '".$datestart."' AND doc_date <= '".$dateend."'";
400
-
401
-		$resql=$this->db->query($sql);
402
-		if ($resql)
403
-		{
404
-			$obj = $this->db->fetch_object($resql);
405
-			$nb = $obj->nb;
406
-		}
407
-		else dol_print_error($this->db);
408
-
409
-		return $nb;
410
-	}
31
+    /**
32
+     * @var string ID to identify managed object
33
+     */
34
+    public $element='fiscalyear';
35
+
36
+    /**
37
+     * @var string Name of table without prefix where object is stored
38
+     */
39
+    public $table_element='accounting_fiscalyear';
40
+
41
+    /**
42
+     * @var int    Name of subtable line
43
+     */
44
+    public $table_element_line = '';
45
+
46
+    /**
47
+     * @var int Field with ID of parent key if this field has a parent
48
+     */
49
+    public $fk_element = '';
50
+
51
+    /**
52
+     * 0=No test on entity, 1=Test with field entity, 2=Test with link by societe
53
+     * @var int
54
+     */
55
+    public $ismultientitymanaged = 1;
56
+
57
+    /**
58
+     * @var int ID
59
+     */
60
+    public $rowid;
61
+
62
+    /**
63
+     * @var string fiscal year label
64
+     */
65
+    public $label;
66
+
67
+    public $date_start;
68
+    public $date_end;
69
+    public $datec;
70
+    public $statut;		// 0=open, 1=closed
71
+
72
+    /**
73
+     * @var int Entity
74
+     */
75
+    public $entity;
76
+
77
+    public $statuts=array();
78
+    public $statuts_short=array();
79
+
80
+    /**
81
+     * Constructor
82
+     *
83
+     * @param	DoliDB		$db		Database handler
84
+     */
85
+    function __construct(DoliDB $db)
86
+    {
87
+        global $langs;
88
+
89
+        $this->db = $db;
90
+
91
+        $this->statuts_short = array(0 => 'Opened', 1 => 'Closed');
92
+        $this->statuts = array(0 => 'Opened', 1 => 'Closed');
93
+    }
94
+
95
+    /**
96
+     *	Create object in database
97
+     *
98
+     *	@param		User	$user   User making creation
99
+     *	@return 	int				<0 if KO, >0 if OK
100
+     */
101
+    function create($user)
102
+    {
103
+        global $conf;
104
+
105
+        $error = 0;
106
+
107
+        $now=dol_now();
108
+
109
+        $this->db->begin();
110
+
111
+        $sql = "INSERT INTO ".MAIN_DB_PREFIX."accounting_fiscalyear (";
112
+        $sql.= "label";
113
+        $sql.= ", date_start";
114
+        $sql.= ", date_end";
115
+        $sql.= ", statut";
116
+        $sql.= ", entity";
117
+        $sql.= ", datec";
118
+        $sql.= ", fk_user_author";
119
+        $sql.= ") VALUES (";
120
+        $sql.= " '".$this->db->escape($this->label)."'";
121
+        $sql.= ", '".$this->db->idate($this->date_start)."'";
122
+        $sql.= ", ".($this->date_end ? "'".$this->db->idate($this->date_end)."'":"null");
123
+        $sql.= ", 0";
124
+        $sql.= ", ".$conf->entity;
125
+        $sql.= ", '".$this->db->idate($now)."'";
126
+        $sql.= ", ". $user->id;
127
+        $sql.= ")";
128
+
129
+        dol_syslog(get_class($this)."::create", LOG_DEBUG);
130
+        $result = $this->db->query($sql);
131
+        if ($result)
132
+        {
133
+            $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX."accounting_fiscalyear");
134
+
135
+            $result=$this->update($user);
136
+            if ($result > 0)
137
+            {
138
+                $this->db->commit();
139
+                return $this->id;
140
+            }
141
+            else
142
+            {
143
+                $this->error=$this->db->lasterror();
144
+                $this->db->rollback();
145
+                return $result;
146
+            }
147
+        }
148
+        else
149
+        {
150
+            $this->error=$this->db->lasterror()." sql=".$sql;
151
+            $this->db->rollback();
152
+            return -1;
153
+        }
154
+    }
155
+
156
+    /**
157
+     *	Update record
158
+     *
159
+     *	@param	User	$user		User making update
160
+     *	@return	int					<0 if KO, >0 if OK
161
+     */
162
+    function update($user)
163
+    {
164
+        global $langs;
165
+
166
+        // Check parameters
167
+        if (empty($this->date_start) && empty($this->date_end))
168
+        {
169
+            $this->error='ErrorBadParameter';
170
+            return -1;
171
+        }
172
+
173
+        $this->db->begin();
174
+
175
+        $sql = "UPDATE ".MAIN_DB_PREFIX."accounting_fiscalyear";
176
+        $sql .= " SET label = '".$this->db->escape($this->label)."'";
177
+        $sql .= ", date_start = '".$this->db->idate($this->date_start)."'";
178
+        $sql .= ", date_end = ".($this->date_end ? "'".$this->db->idate($this->date_end)."'" : "null");
179
+        $sql .= ", statut = '".$this->db->escape($this->statut?$this->statut:0)."'";
180
+        $sql .= ", datec = " . ($this->datec != '' ? "'".$this->db->idate($this->datec)."'" : 'null');
181
+        $sql .= ", fk_user_modif = " . $user->id;
182
+        $sql .= " WHERE rowid = ".$this->id;
183
+
184
+        dol_syslog(get_class($this)."::update", LOG_DEBUG);
185
+        $result = $this->db->query($sql);
186
+        if ($result)
187
+        {
188
+            $this->db->commit();
189
+            return 1;
190
+        }
191
+        else
192
+        {
193
+            $this->error=$this->db->lasterror();
194
+            dol_syslog($this->error, LOG_ERR);
195
+            $this->db->rollback();
196
+            return -1;
197
+        }
198
+    }
199
+
200
+    /**
201
+     * Load an object from database
202
+     *
203
+     * @param	int		$id		Id of record to load
204
+     * @return	int				<0 if KO, >0 if OK
205
+     */
206
+    function fetch($id)
207
+    {
208
+        $sql = "SELECT rowid, label, date_start, date_end, statut";
209
+        $sql.= " FROM ".MAIN_DB_PREFIX."accounting_fiscalyear";
210
+        $sql.= " WHERE rowid = ".$id;
211
+
212
+        dol_syslog(get_class($this)."::fetch", LOG_DEBUG);
213
+        $result = $this->db->query($sql);
214
+        if ( $result )
215
+        {
216
+            $obj = $this->db->fetch_object($result);
217
+
218
+            $this->id			= $obj->rowid;
219
+            $this->ref			= $obj->rowid;
220
+            $this->date_start	= $this->db->jdate($obj->date_start);
221
+            $this->date_end		= $this->db->jdate($obj->date_end);
222
+            $this->label		= $obj->label;
223
+            $this->statut	    = $obj->statut;
224
+
225
+            return 1;
226
+        }
227
+        else
228
+        {
229
+            $this->error=$this->db->lasterror();
230
+            return -1;
231
+        }
232
+    }
233
+
234
+    /**
235
+     *	Delete record
236
+     *
237
+     *	@param	int		$id		Id of record to delete
238
+     *	@return	int				<0 if KO, >0 if OK
239
+     */
240
+    function delete($id)
241
+    {
242
+        $this->db->begin();
243
+
244
+        $sql = "DELETE FROM ".MAIN_DB_PREFIX."accounting_fiscalyear WHERE rowid = ".$id;
245
+
246
+        dol_syslog(get_class($this)."::delete", LOG_DEBUG);
247
+        $result = $this->db->query($sql);
248
+        if ($result)
249
+        {
250
+            $this->db->commit();
251
+            return 1;
252
+        }
253
+        else
254
+        {
255
+            $this->error=$this->db->lasterror();
256
+            $this->db->rollback();
257
+            return -1;
258
+        }
259
+    }
260
+
261
+    /**
262
+     * Give a label from a status
263
+     *
264
+     * @param	int		$mode   	0=long label, 1=short label, 2=Picto + short label, 3=Picto, 4=Picto + long label, 5=Short label + Picto
265
+     * @return  string   		   	Label
266
+     */
267
+    function getLibStatut($mode=0)
268
+    {
269
+        return $this->LibStatut($this->statut,$mode);
270
+    }
271
+
272
+    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
273
+    /**
274
+     *  Give a label from a status
275
+     *
276
+     *  @param	int		$statut     Id status
277
+     *  @param  int		$mode       0=long label, 1=short label, 2=Picto + short label, 3=Picto, 4=Picto + long label, 5=Short label + Picto
278
+     *  @return string      		Label
279
+     */
280
+    function LibStatut($statut,$mode=0)
281
+    {
282
+        // phpcs:enable
283
+        global $langs;
284
+
285
+        if ($mode == 0)
286
+        {
287
+            return $langs->trans($this->statuts[$statut]);
288
+        }
289
+        elseif ($mode == 1)
290
+        {
291
+            return $langs->trans($this->statuts_short[$statut]);
292
+        }
293
+        elseif ($mode == 2)
294
+        {
295
+            if ($statut==0) return img_picto($langs->trans($this->statuts_short[$statut]),'statut4').' '.$langs->trans($this->statuts_short[$statut]);
296
+            elseif ($statut==1) return img_picto($langs->trans($this->statuts_short[$statut]),'statut8').' '.$langs->trans($this->statuts_short[$statut]);
297
+        }
298
+        elseif ($mode == 3)
299
+        {
300
+            if ($statut==0 && ! empty($this->statuts_short[$statut])) return img_picto($langs->trans($this->statuts_short[$statut]),'statut4');
301
+            elseif ($statut==1 && ! empty($this->statuts_short[$statut])) return img_picto($langs->trans($this->statuts_short[$statut]),'statut8');
302
+        }
303
+        elseif ($mode == 4)
304
+        {
305
+            if ($statut==0 && ! empty($this->statuts_short[$statut])) return img_picto($langs->trans($this->statuts_short[$statut]),'statut4').' '.$langs->trans($this->statuts[$statut]);
306
+            elseif ($statut==1 && ! empty($this->statuts_short[$statut])) return img_picto($langs->trans($this->statuts_short[$statut]),'statut8').' '.$langs->trans($this->statuts[$statut]);
307
+        }
308
+        elseif ($mode == 5)
309
+        {
310
+            if ($statut==0 && ! empty($this->statuts_short[$statut])) return $langs->trans($this->statuts_short[$statut]).' '.img_picto($langs->trans($this->statuts_short[$statut]),'statut4');
311
+            elseif ($statut==1 && ! empty($this->statuts_short[$statut])) return $langs->trans($this->statuts_short[$statut]).' '.img_picto($langs->trans($this->statuts_short[$statut]),'statut6');
312
+        }
313
+    }
314
+
315
+    /**
316
+     * Information on record
317
+     *
318
+     * @param	int		$id      Id of record
319
+     * @return	void
320
+     */
321
+    function info($id)
322
+    {
323
+        $sql = 'SELECT fy.rowid, fy.datec, fy.fk_user_author, fy.fk_user_modif,';
324
+        $sql.= ' fy.tms';
325
+        $sql.= ' FROM '.MAIN_DB_PREFIX.'accounting_fiscalyear as fy';
326
+        $sql.= ' WHERE fy.rowid = '.$id;
327
+
328
+        dol_syslog(get_class($this)."::fetch info", LOG_DEBUG);
329
+        $result = $this->db->query($sql);
330
+
331
+        if ($result)
332
+        {
333
+            if ($this->db->num_rows($result))
334
+            {
335
+                $obj = $this->db->fetch_object($result);
336
+                $this->id = $obj->rowid;
337
+                if ($obj->fk_user_author)
338
+                {
339
+                    $cuser = new User($this->db);
340
+                    $cuser->fetch($obj->fk_user_author);
341
+                    $this->user_creation = $cuser;
342
+                }
343
+                if ($obj->fk_user_modif)
344
+                {
345
+                    $muser = new User($this->db);
346
+                    $muser->fetch($obj->fk_user_modif);
347
+                    $this->user_modification = $muser;
348
+                }
349
+                $this->date_creation     = $this->db->jdate($obj->datec);
350
+                $this->date_modification = $this->db->jdate($obj->tms);
351
+            }
352
+            $this->db->free($result);
353
+        }
354
+        else
355
+        {
356
+            dol_print_error($this->db);
357
+        }
358
+    }
359
+
360
+    /**
361
+     *  Return the number of entries by fiscal year
362
+     *
363
+     *	@param	int		$datestart	Date start to scan
364
+     *	@param	int		$dateend	Date end to scan
365
+     *	@return	string				Number of entries
366
+     */
367
+    function getAccountancyEntriesByFiscalYear($datestart, $dateend)
368
+    {
369
+        global $conf;
370
+
371
+        $sql = "SELECT count(DISTINCT piece_num) as nb";
372
+        $sql.= " FROM ".MAIN_DB_PREFIX."accounting_bookkeeping ";
373
+        $sql.= " WHERE doc_date >= '".$datestart."' and doc_date <= '".$dateend."'";
374
+
375
+        $resql=$this->db->query($sql);
376
+        if ($resql)
377
+        {
378
+            $obj = $this->db->fetch_object($resql);
379
+            $nb = $obj->nb;
380
+        }
381
+        else dol_print_error($this->db);
382
+
383
+        return $nb;
384
+    }
385
+
386
+    /**
387
+     *  Return the number of movements by fiscal year
388
+     *
389
+     *	@param	int		$datestart	Date start to scan
390
+     *	@param	int		$dateend	Date end to scan
391
+     *	@return	string				Number of movements
392
+     */
393
+    function getAccountancyMovementsByFiscalYear($datestart, $dateend)
394
+    {
395
+        global $conf;
396
+
397
+        $sql = "SELECT count(rowid) as nb";
398
+        $sql.= " FROM ".MAIN_DB_PREFIX."accounting_bookkeeping ";
399
+        $sql.= " WHERE doc_date >= '".$datestart."' AND doc_date <= '".$dateend."'";
400
+
401
+        $resql=$this->db->query($sql);
402
+        if ($resql)
403
+        {
404
+            $obj = $this->db->fetch_object($resql);
405
+            $nb = $obj->nb;
406
+        }
407
+        else dol_print_error($this->db);
408
+
409
+        return $nb;
410
+    }
411 411
 }
Please login to merge, or discard this patch.
Spacing   +60 added lines, -60 removed lines patch added patch discarded remove patch
@@ -21,7 +21,7 @@  discard block
 block discarded – undo
21 21
  *		\brief      File of class to manage fiscal years
22 22
  */
23 23
 
24
-require_once DOL_DOCUMENT_ROOT . '/core/class/commonobject.class.php';
24
+require_once DOL_DOCUMENT_ROOT.'/core/class/commonobject.class.php';
25 25
 
26 26
 /**
27 27
  * Class to manage fiscal year
@@ -31,12 +31,12 @@  discard block
 block discarded – undo
31 31
 	/**
32 32
 	 * @var string ID to identify managed object
33 33
 	 */
34
-	public $element='fiscalyear';
34
+	public $element = 'fiscalyear';
35 35
 
36 36
 	/**
37 37
 	 * @var string Name of table without prefix where object is stored
38 38
 	 */
39
-	public $table_element='accounting_fiscalyear';
39
+	public $table_element = 'accounting_fiscalyear';
40 40
 
41 41
 	/**
42 42
 	 * @var int    Name of subtable line
@@ -67,15 +67,15 @@  discard block
 block discarded – undo
67 67
 	public $date_start;
68 68
 	public $date_end;
69 69
 	public $datec;
70
-	public $statut;		// 0=open, 1=closed
70
+	public $statut; // 0=open, 1=closed
71 71
 
72 72
 	/**
73 73
 	 * @var int Entity
74 74
 	 */
75 75
 	public $entity;
76 76
 
77
-	public $statuts=array();
78
-	public $statuts_short=array();
77
+	public $statuts = array();
78
+	public $statuts_short = array();
79 79
 
80 80
 	/**
81 81
 	 * Constructor
@@ -104,27 +104,27 @@  discard block
 block discarded – undo
104 104
 
105 105
 		$error = 0;
106 106
 
107
-		$now=dol_now();
107
+		$now = dol_now();
108 108
 
109 109
 		$this->db->begin();
110 110
 
111 111
 		$sql = "INSERT INTO ".MAIN_DB_PREFIX."accounting_fiscalyear (";
112
-		$sql.= "label";
113
-		$sql.= ", date_start";
114
-		$sql.= ", date_end";
115
-		$sql.= ", statut";
116
-		$sql.= ", entity";
117
-		$sql.= ", datec";
118
-		$sql.= ", fk_user_author";
119
-		$sql.= ") VALUES (";
120
-		$sql.= " '".$this->db->escape($this->label)."'";
121
-		$sql.= ", '".$this->db->idate($this->date_start)."'";
122
-		$sql.= ", ".($this->date_end ? "'".$this->db->idate($this->date_end)."'":"null");
123
-		$sql.= ", 0";
124
-		$sql.= ", ".$conf->entity;
125
-		$sql.= ", '".$this->db->idate($now)."'";
126
-		$sql.= ", ". $user->id;
127
-		$sql.= ")";
112
+		$sql .= "label";
113
+		$sql .= ", date_start";
114
+		$sql .= ", date_end";
115
+		$sql .= ", statut";
116
+		$sql .= ", entity";
117
+		$sql .= ", datec";
118
+		$sql .= ", fk_user_author";
119
+		$sql .= ") VALUES (";
120
+		$sql .= " '".$this->db->escape($this->label)."'";
121
+		$sql .= ", '".$this->db->idate($this->date_start)."'";
122
+		$sql .= ", ".($this->date_end ? "'".$this->db->idate($this->date_end)."'" : "null");
123
+		$sql .= ", 0";
124
+		$sql .= ", ".$conf->entity;
125
+		$sql .= ", '".$this->db->idate($now)."'";
126
+		$sql .= ", ".$user->id;
127
+		$sql .= ")";
128 128
 
129 129
 		dol_syslog(get_class($this)."::create", LOG_DEBUG);
130 130
 		$result = $this->db->query($sql);
@@ -132,7 +132,7 @@  discard block
 block discarded – undo
132 132
 		{
133 133
 			$this->id = $this->db->last_insert_id(MAIN_DB_PREFIX."accounting_fiscalyear");
134 134
 
135
-			$result=$this->update($user);
135
+			$result = $this->update($user);
136 136
 			if ($result > 0)
137 137
 			{
138 138
 				$this->db->commit();
@@ -140,14 +140,14 @@  discard block
 block discarded – undo
140 140
 			}
141 141
 			else
142 142
 			{
143
-				$this->error=$this->db->lasterror();
143
+				$this->error = $this->db->lasterror();
144 144
 				$this->db->rollback();
145 145
 				return $result;
146 146
 			}
147 147
 		}
148 148
 		else
149 149
 		{
150
-			$this->error=$this->db->lasterror()." sql=".$sql;
150
+			$this->error = $this->db->lasterror()." sql=".$sql;
151 151
 			$this->db->rollback();
152 152
 			return -1;
153 153
 		}
@@ -166,7 +166,7 @@  discard block
 block discarded – undo
166 166
 		// Check parameters
167 167
 		if (empty($this->date_start) && empty($this->date_end))
168 168
 		{
169
-			$this->error='ErrorBadParameter';
169
+			$this->error = 'ErrorBadParameter';
170 170
 			return -1;
171 171
 		}
172 172
 
@@ -176,9 +176,9 @@  discard block
 block discarded – undo
176 176
 		$sql .= " SET label = '".$this->db->escape($this->label)."'";
177 177
 		$sql .= ", date_start = '".$this->db->idate($this->date_start)."'";
178 178
 		$sql .= ", date_end = ".($this->date_end ? "'".$this->db->idate($this->date_end)."'" : "null");
179
-		$sql .= ", statut = '".$this->db->escape($this->statut?$this->statut:0)."'";
180
-		$sql .= ", datec = " . ($this->datec != '' ? "'".$this->db->idate($this->datec)."'" : 'null');
181
-		$sql .= ", fk_user_modif = " . $user->id;
179
+		$sql .= ", statut = '".$this->db->escape($this->statut ? $this->statut : 0)."'";
180
+		$sql .= ", datec = ".($this->datec != '' ? "'".$this->db->idate($this->datec)."'" : 'null');
181
+		$sql .= ", fk_user_modif = ".$user->id;
182 182
 		$sql .= " WHERE rowid = ".$this->id;
183 183
 
184 184
 		dol_syslog(get_class($this)."::update", LOG_DEBUG);
@@ -190,7 +190,7 @@  discard block
 block discarded – undo
190 190
 		}
191 191
 		else
192 192
 		{
193
-			$this->error=$this->db->lasterror();
193
+			$this->error = $this->db->lasterror();
194 194
 			dol_syslog($this->error, LOG_ERR);
195 195
 			$this->db->rollback();
196 196
 			return -1;
@@ -206,27 +206,27 @@  discard block
 block discarded – undo
206 206
 	function fetch($id)
207 207
 	{
208 208
 		$sql = "SELECT rowid, label, date_start, date_end, statut";
209
-		$sql.= " FROM ".MAIN_DB_PREFIX."accounting_fiscalyear";
210
-		$sql.= " WHERE rowid = ".$id;
209
+		$sql .= " FROM ".MAIN_DB_PREFIX."accounting_fiscalyear";
210
+		$sql .= " WHERE rowid = ".$id;
211 211
 
212 212
 		dol_syslog(get_class($this)."::fetch", LOG_DEBUG);
213 213
 		$result = $this->db->query($sql);
214
-		if ( $result )
214
+		if ($result)
215 215
 		{
216 216
 			$obj = $this->db->fetch_object($result);
217 217
 
218
-			$this->id			= $obj->rowid;
219
-			$this->ref			= $obj->rowid;
218
+			$this->id = $obj->rowid;
219
+			$this->ref = $obj->rowid;
220 220
 			$this->date_start	= $this->db->jdate($obj->date_start);
221
-			$this->date_end		= $this->db->jdate($obj->date_end);
222
-			$this->label		= $obj->label;
221
+			$this->date_end = $this->db->jdate($obj->date_end);
222
+			$this->label = $obj->label;
223 223
 			$this->statut	    = $obj->statut;
224 224
 
225 225
 			return 1;
226 226
 		}
227 227
 		else
228 228
 		{
229
-			$this->error=$this->db->lasterror();
229
+			$this->error = $this->db->lasterror();
230 230
 			return -1;
231 231
 		}
232 232
 	}
@@ -252,7 +252,7 @@  discard block
 block discarded – undo
252 252
 		}
253 253
 		else
254 254
 		{
255
-			$this->error=$this->db->lasterror();
255
+			$this->error = $this->db->lasterror();
256 256
 			$this->db->rollback();
257 257
 			return -1;
258 258
 		}
@@ -264,9 +264,9 @@  discard block
 block discarded – undo
264 264
 	 * @param	int		$mode   	0=long label, 1=short label, 2=Picto + short label, 3=Picto, 4=Picto + long label, 5=Short label + Picto
265 265
 	 * @return  string   		   	Label
266 266
 	 */
267
-	function getLibStatut($mode=0)
267
+	function getLibStatut($mode = 0)
268 268
 	{
269
-		return $this->LibStatut($this->statut,$mode);
269
+		return $this->LibStatut($this->statut, $mode);
270 270
 	}
271 271
 
272 272
 	// phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
@@ -277,7 +277,7 @@  discard block
 block discarded – undo
277 277
 	 *  @param  int		$mode       0=long label, 1=short label, 2=Picto + short label, 3=Picto, 4=Picto + long label, 5=Short label + Picto
278 278
 	 *  @return string      		Label
279 279
 	 */
280
-	function LibStatut($statut,$mode=0)
280
+	function LibStatut($statut, $mode = 0)
281 281
 	{
282 282
 		// phpcs:enable
283 283
 		global $langs;
@@ -292,23 +292,23 @@  discard block
 block discarded – undo
292 292
 		}
293 293
 		elseif ($mode == 2)
294 294
 		{
295
-			if ($statut==0) return img_picto($langs->trans($this->statuts_short[$statut]),'statut4').' '.$langs->trans($this->statuts_short[$statut]);
296
-			elseif ($statut==1) return img_picto($langs->trans($this->statuts_short[$statut]),'statut8').' '.$langs->trans($this->statuts_short[$statut]);
295
+			if ($statut == 0) return img_picto($langs->trans($this->statuts_short[$statut]), 'statut4').' '.$langs->trans($this->statuts_short[$statut]);
296
+			elseif ($statut == 1) return img_picto($langs->trans($this->statuts_short[$statut]), 'statut8').' '.$langs->trans($this->statuts_short[$statut]);
297 297
 		}
298 298
 		elseif ($mode == 3)
299 299
 		{
300
-			if ($statut==0 && ! empty($this->statuts_short[$statut])) return img_picto($langs->trans($this->statuts_short[$statut]),'statut4');
301
-			elseif ($statut==1 && ! empty($this->statuts_short[$statut])) return img_picto($langs->trans($this->statuts_short[$statut]),'statut8');
300
+			if ($statut == 0 && !empty($this->statuts_short[$statut])) return img_picto($langs->trans($this->statuts_short[$statut]), 'statut4');
301
+			elseif ($statut == 1 && !empty($this->statuts_short[$statut])) return img_picto($langs->trans($this->statuts_short[$statut]), 'statut8');
302 302
 		}
303 303
 		elseif ($mode == 4)
304 304
 		{
305
-			if ($statut==0 && ! empty($this->statuts_short[$statut])) return img_picto($langs->trans($this->statuts_short[$statut]),'statut4').' '.$langs->trans($this->statuts[$statut]);
306
-			elseif ($statut==1 && ! empty($this->statuts_short[$statut])) return img_picto($langs->trans($this->statuts_short[$statut]),'statut8').' '.$langs->trans($this->statuts[$statut]);
305
+			if ($statut == 0 && !empty($this->statuts_short[$statut])) return img_picto($langs->trans($this->statuts_short[$statut]), 'statut4').' '.$langs->trans($this->statuts[$statut]);
306
+			elseif ($statut == 1 && !empty($this->statuts_short[$statut])) return img_picto($langs->trans($this->statuts_short[$statut]), 'statut8').' '.$langs->trans($this->statuts[$statut]);
307 307
 		}
308 308
 		elseif ($mode == 5)
309 309
 		{
310
-			if ($statut==0 && ! empty($this->statuts_short[$statut])) return $langs->trans($this->statuts_short[$statut]).' '.img_picto($langs->trans($this->statuts_short[$statut]),'statut4');
311
-			elseif ($statut==1 && ! empty($this->statuts_short[$statut])) return $langs->trans($this->statuts_short[$statut]).' '.img_picto($langs->trans($this->statuts_short[$statut]),'statut6');
310
+			if ($statut == 0 && !empty($this->statuts_short[$statut])) return $langs->trans($this->statuts_short[$statut]).' '.img_picto($langs->trans($this->statuts_short[$statut]), 'statut4');
311
+			elseif ($statut == 1 && !empty($this->statuts_short[$statut])) return $langs->trans($this->statuts_short[$statut]).' '.img_picto($langs->trans($this->statuts_short[$statut]), 'statut6');
312 312
 		}
313 313
 	}
314 314
 
@@ -321,9 +321,9 @@  discard block
 block discarded – undo
321 321
 	function info($id)
322 322
 	{
323 323
 		$sql = 'SELECT fy.rowid, fy.datec, fy.fk_user_author, fy.fk_user_modif,';
324
-		$sql.= ' fy.tms';
325
-		$sql.= ' FROM '.MAIN_DB_PREFIX.'accounting_fiscalyear as fy';
326
-		$sql.= ' WHERE fy.rowid = '.$id;
324
+		$sql .= ' fy.tms';
325
+		$sql .= ' FROM '.MAIN_DB_PREFIX.'accounting_fiscalyear as fy';
326
+		$sql .= ' WHERE fy.rowid = '.$id;
327 327
 
328 328
 		dol_syslog(get_class($this)."::fetch info", LOG_DEBUG);
329 329
 		$result = $this->db->query($sql);
@@ -369,10 +369,10 @@  discard block
 block discarded – undo
369 369
 		global $conf;
370 370
 
371 371
 		$sql = "SELECT count(DISTINCT piece_num) as nb";
372
-		$sql.= " FROM ".MAIN_DB_PREFIX."accounting_bookkeeping ";
373
-		$sql.= " WHERE doc_date >= '".$datestart."' and doc_date <= '".$dateend."'";
372
+		$sql .= " FROM ".MAIN_DB_PREFIX."accounting_bookkeeping ";
373
+		$sql .= " WHERE doc_date >= '".$datestart."' and doc_date <= '".$dateend."'";
374 374
 
375
-		$resql=$this->db->query($sql);
375
+		$resql = $this->db->query($sql);
376 376
 		if ($resql)
377 377
 		{
378 378
 			$obj = $this->db->fetch_object($resql);
@@ -395,10 +395,10 @@  discard block
 block discarded – undo
395 395
 		global $conf;
396 396
 
397 397
 		$sql = "SELECT count(rowid) as nb";
398
-		$sql.= " FROM ".MAIN_DB_PREFIX."accounting_bookkeeping ";
399
-		$sql.= " WHERE doc_date >= '".$datestart."' AND doc_date <= '".$dateend."'";
398
+		$sql .= " FROM ".MAIN_DB_PREFIX."accounting_bookkeeping ";
399
+		$sql .= " WHERE doc_date >= '".$datestart."' AND doc_date <= '".$dateend."'";
400 400
 
401
-		$resql=$this->db->query($sql);
401
+		$resql = $this->db->query($sql);
402 402
 		if ($resql)
403 403
 		{
404 404
 			$obj = $this->db->fetch_object($resql);
Please login to merge, or discard this patch.
Braces   +35 added lines, -32 removed lines patch added patch discarded remove patch
@@ -137,15 +137,13 @@  discard block
 block discarded – undo
137 137
 			{
138 138
 				$this->db->commit();
139 139
 				return $this->id;
140
-			}
141
-			else
140
+			} else
142 141
 			{
143 142
 				$this->error=$this->db->lasterror();
144 143
 				$this->db->rollback();
145 144
 				return $result;
146 145
 			}
147
-		}
148
-		else
146
+		} else
149 147
 		{
150 148
 			$this->error=$this->db->lasterror()." sql=".$sql;
151 149
 			$this->db->rollback();
@@ -187,8 +185,7 @@  discard block
 block discarded – undo
187 185
 		{
188 186
 			$this->db->commit();
189 187
 			return 1;
190
-		}
191
-		else
188
+		} else
192 189
 		{
193 190
 			$this->error=$this->db->lasterror();
194 191
 			dol_syslog($this->error, LOG_ERR);
@@ -223,8 +220,7 @@  discard block
 block discarded – undo
223 220
 			$this->statut	    = $obj->statut;
224 221
 
225 222
 			return 1;
226
-		}
227
-		else
223
+		} else
228 224
 		{
229 225
 			$this->error=$this->db->lasterror();
230 226
 			return -1;
@@ -249,8 +245,7 @@  discard block
 block discarded – undo
249 245
 		{
250 246
 			$this->db->commit();
251 247
 			return 1;
252
-		}
253
-		else
248
+		} else
254 249
 		{
255 250
 			$this->error=$this->db->lasterror();
256 251
 			$this->db->rollback();
@@ -285,30 +280,37 @@  discard block
 block discarded – undo
285 280
 		if ($mode == 0)
286 281
 		{
287 282
 			return $langs->trans($this->statuts[$statut]);
288
-		}
289
-		elseif ($mode == 1)
283
+		} elseif ($mode == 1)
290 284
 		{
291 285
 			return $langs->trans($this->statuts_short[$statut]);
292
-		}
293
-		elseif ($mode == 2)
286
+		} elseif ($mode == 2)
294 287
 		{
295
-			if ($statut==0) return img_picto($langs->trans($this->statuts_short[$statut]),'statut4').' '.$langs->trans($this->statuts_short[$statut]);
296
-			elseif ($statut==1) return img_picto($langs->trans($this->statuts_short[$statut]),'statut8').' '.$langs->trans($this->statuts_short[$statut]);
297
-		}
298
-		elseif ($mode == 3)
288
+			if ($statut==0) {
289
+			    return img_picto($langs->trans($this->statuts_short[$statut]),'statut4').' '.$langs->trans($this->statuts_short[$statut]);
290
+			} elseif ($statut==1) {
291
+			    return img_picto($langs->trans($this->statuts_short[$statut]),'statut8').' '.$langs->trans($this->statuts_short[$statut]);
292
+			}
293
+		} elseif ($mode == 3)
299 294
 		{
300
-			if ($statut==0 && ! empty($this->statuts_short[$statut])) return img_picto($langs->trans($this->statuts_short[$statut]),'statut4');
301
-			elseif ($statut==1 && ! empty($this->statuts_short[$statut])) return img_picto($langs->trans($this->statuts_short[$statut]),'statut8');
302
-		}
303
-		elseif ($mode == 4)
295
+			if ($statut==0 && ! empty($this->statuts_short[$statut])) {
296
+			    return img_picto($langs->trans($this->statuts_short[$statut]),'statut4');
297
+			} elseif ($statut==1 && ! empty($this->statuts_short[$statut])) {
298
+			    return img_picto($langs->trans($this->statuts_short[$statut]),'statut8');
299
+			}
300
+		} elseif ($mode == 4)
304 301
 		{
305
-			if ($statut==0 && ! empty($this->statuts_short[$statut])) return img_picto($langs->trans($this->statuts_short[$statut]),'statut4').' '.$langs->trans($this->statuts[$statut]);
306
-			elseif ($statut==1 && ! empty($this->statuts_short[$statut])) return img_picto($langs->trans($this->statuts_short[$statut]),'statut8').' '.$langs->trans($this->statuts[$statut]);
307
-		}
308
-		elseif ($mode == 5)
302
+			if ($statut==0 && ! empty($this->statuts_short[$statut])) {
303
+			    return img_picto($langs->trans($this->statuts_short[$statut]),'statut4').' '.$langs->trans($this->statuts[$statut]);
304
+			} elseif ($statut==1 && ! empty($this->statuts_short[$statut])) {
305
+			    return img_picto($langs->trans($this->statuts_short[$statut]),'statut8').' '.$langs->trans($this->statuts[$statut]);
306
+			}
307
+		} elseif ($mode == 5)
309 308
 		{
310
-			if ($statut==0 && ! empty($this->statuts_short[$statut])) return $langs->trans($this->statuts_short[$statut]).' '.img_picto($langs->trans($this->statuts_short[$statut]),'statut4');
311
-			elseif ($statut==1 && ! empty($this->statuts_short[$statut])) return $langs->trans($this->statuts_short[$statut]).' '.img_picto($langs->trans($this->statuts_short[$statut]),'statut6');
309
+			if ($statut==0 && ! empty($this->statuts_short[$statut])) {
310
+			    return $langs->trans($this->statuts_short[$statut]).' '.img_picto($langs->trans($this->statuts_short[$statut]),'statut4');
311
+			} elseif ($statut==1 && ! empty($this->statuts_short[$statut])) {
312
+			    return $langs->trans($this->statuts_short[$statut]).' '.img_picto($langs->trans($this->statuts_short[$statut]),'statut6');
313
+			}
312 314
 		}
313 315
 	}
314 316
 
@@ -350,8 +352,7 @@  discard block
 block discarded – undo
350 352
 				$this->date_modification = $this->db->jdate($obj->tms);
351 353
 			}
352 354
 			$this->db->free($result);
353
-		}
354
-		else
355
+		} else
355 356
 		{
356 357
 			dol_print_error($this->db);
357 358
 		}
@@ -377,8 +378,9 @@  discard block
 block discarded – undo
377 378
 		{
378 379
 			$obj = $this->db->fetch_object($resql);
379 380
 			$nb = $obj->nb;
381
+		} else {
382
+		    dol_print_error($this->db);
380 383
 		}
381
-		else dol_print_error($this->db);
382 384
 
383 385
 		return $nb;
384 386
 	}
@@ -403,8 +405,9 @@  discard block
 block discarded – undo
403 405
 		{
404 406
 			$obj = $this->db->fetch_object($resql);
405 407
 			$nb = $obj->nb;
408
+		} else {
409
+		    dol_print_error($this->db);
406 410
 		}
407
-		else dol_print_error($this->db);
408 411
 
409 412
 		return $nb;
410 413
 	}
Please login to merge, or discard this patch.
dolibarr/htdocs/core/class/ctypent.class.php 3 patches
Indentation   +181 added lines, -181 removed lines patch added patch discarded remove patch
@@ -27,33 +27,33 @@  discard block
 block discarded – undo
27 27
  */
28 28
 class Ctypent // extends CommonObject
29 29
 {
30
-	/**
30
+    /**
31 31
      * @var DoliDB Database handler.
32 32
      */
33 33
     public $db;
34 34
 
35
-	/**
36
-	 * @var string Error code (or message)
37
-	 */
38
-	public $error='';
35
+    /**
36
+     * @var string Error code (or message)
37
+     */
38
+    public $error='';
39 39
 
40
-	/**
41
-	 * @var string[] Error codes (or messages)
42
-	 */
43
-	public $errors = array();
40
+    /**
41
+     * @var string[] Error codes (or messages)
42
+     */
43
+    public $errors = array();
44 44
 
45
-	//var $element='ctypent';			//!< Id that identify managed objects
46
-	//var $table_element='ctypent';	//!< Name of table without prefix where object is stored
45
+    //var $element='ctypent';			//!< Id that identify managed objects
46
+    //var $table_element='ctypent';	//!< Name of table without prefix where object is stored
47 47
 
48 48
     /**
49
-	 * @var int ID
50
-	 */
51
-	public $id;
49
+     * @var int ID
50
+     */
51
+    public $id;
52 52
 
53
-	public $code;
54
-	public $libelle;
55
-	public $active;
56
-	public $module;
53
+    public $code;
54
+    public $libelle;
55
+    public $active;
56
+    public $module;
57 57
 
58 58
 
59 59
 
@@ -78,83 +78,83 @@  discard block
 block discarded – undo
78 78
      */
79 79
     function create($user, $notrigger=0)
80 80
     {
81
-    	global $conf, $langs;
82
-		$error=0;
81
+        global $conf, $langs;
82
+        $error=0;
83 83
 
84
-		// Clean parameters
84
+        // Clean parameters
85 85
 
86
-		if (isset($this->id)) $this->id=trim($this->id);
87
-		if (isset($this->code)) $this->code=trim($this->code);
88
-		if (isset($this->libelle)) $this->libelle=trim($this->libelle);
89
-		if (isset($this->active)) $this->active=trim($this->active);
90
-		if (isset($this->module)) $this->module=trim($this->module);
86
+        if (isset($this->id)) $this->id=trim($this->id);
87
+        if (isset($this->code)) $this->code=trim($this->code);
88
+        if (isset($this->libelle)) $this->libelle=trim($this->libelle);
89
+        if (isset($this->active)) $this->active=trim($this->active);
90
+        if (isset($this->module)) $this->module=trim($this->module);
91 91
 
92 92
 
93 93
 
94
-		// Check parameters
95
-		// Put here code to add control on parameters values
94
+        // Check parameters
95
+        // Put here code to add control on parameters values
96 96
 
97 97
         // Insert request
98
-		$sql = "INSERT INTO ".MAIN_DB_PREFIX."c_typent(";
98
+        $sql = "INSERT INTO ".MAIN_DB_PREFIX."c_typent(";
99 99
 
100
-		$sql.= "id,";
101
-		$sql.= "code,";
102
-		$sql.= "libelle,";
103
-		$sql.= "active,";
104
-		$sql.= "module";
100
+        $sql.= "id,";
101
+        $sql.= "code,";
102
+        $sql.= "libelle,";
103
+        $sql.= "active,";
104
+        $sql.= "module";
105 105
 
106 106
 
107 107
         $sql.= ") VALUES (";
108 108
 
109
-		$sql.= " ".(! isset($this->id)?'NULL':"'".$this->db->escape($this->id)."'").",";
110
-		$sql.= " ".(! isset($this->code)?'NULL':"'".$this->db->escape($this->code)."'").",";
111
-		$sql.= " ".(! isset($this->libelle)?'NULL':"'".$this->db->escape($this->libelle)."'").",";
112
-		$sql.= " ".(! isset($this->active)?'NULL':"'".$this->db->active($this->active)."'").",";
113
-		$sql.= " ".(! isset($this->module)?'NULL':"'".$this->db->escape($this->module)."'")."";
109
+        $sql.= " ".(! isset($this->id)?'NULL':"'".$this->db->escape($this->id)."'").",";
110
+        $sql.= " ".(! isset($this->code)?'NULL':"'".$this->db->escape($this->code)."'").",";
111
+        $sql.= " ".(! isset($this->libelle)?'NULL':"'".$this->db->escape($this->libelle)."'").",";
112
+        $sql.= " ".(! isset($this->active)?'NULL':"'".$this->db->active($this->active)."'").",";
113
+        $sql.= " ".(! isset($this->module)?'NULL':"'".$this->db->escape($this->module)."'")."";
114 114
 
115 115
 
116
-		$sql.= ")";
116
+        $sql.= ")";
117 117
 
118
-		$this->db->begin();
118
+        $this->db->begin();
119 119
 
120
-	   	dol_syslog(get_class($this)."::create", LOG_DEBUG);
120
+            dol_syslog(get_class($this)."::create", LOG_DEBUG);
121 121
         $resql=$this->db->query($sql);
122
-    	if (! $resql) { $error++; $this->errors[]="Error ".$this->db->lasterror(); }
122
+        if (! $resql) { $error++; $this->errors[]="Error ".$this->db->lasterror(); }
123 123
 
124
-		if (! $error)
124
+        if (! $error)
125 125
         {
126 126
             $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX."c_typent");
127 127
 
128
-			if (! $notrigger)
129
-			{
130
-	            // Uncomment this and change MYOBJECT to your own tag if you
131
-	            // want this action call a trigger.
132
-
133
-	            //// Call triggers
134
-	            //include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php';
135
-	            //$interface=new Interfaces($this->db);
136
-	            //$result=$interface->run_triggers('MYOBJECT_CREATE',$this,$user,$langs,$conf);
137
-	            //if ($result < 0) { $error++; $this->errors=$interface->errors; }
138
-	            //// End call triggers
139
-			}
128
+            if (! $notrigger)
129
+            {
130
+                // Uncomment this and change MYOBJECT to your own tag if you
131
+                // want this action call a trigger.
132
+
133
+                //// Call triggers
134
+                //include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php';
135
+                //$interface=new Interfaces($this->db);
136
+                //$result=$interface->run_triggers('MYOBJECT_CREATE',$this,$user,$langs,$conf);
137
+                //if ($result < 0) { $error++; $this->errors=$interface->errors; }
138
+                //// End call triggers
139
+            }
140 140
         }
141 141
 
142 142
         // Commit or rollback
143 143
         if ($error)
144
-		{
145
-			foreach($this->errors as $errmsg)
146
-			{
147
-	            dol_syslog(get_class($this)."::create ".$errmsg, LOG_ERR);
148
-	            $this->error.=($this->error?', '.$errmsg:$errmsg);
149
-			}
150
-			$this->db->rollback();
151
-			return -1*$error;
152
-		}
153
-		else
154
-		{
155
-			$this->db->commit();
144
+        {
145
+            foreach($this->errors as $errmsg)
146
+            {
147
+                dol_syslog(get_class($this)."::create ".$errmsg, LOG_ERR);
148
+                $this->error.=($this->error?', '.$errmsg:$errmsg);
149
+            }
150
+            $this->db->rollback();
151
+            return -1*$error;
152
+        }
153
+        else
154
+        {
155
+            $this->db->commit();
156 156
             return $this->id;
157
-		}
157
+        }
158 158
     }
159 159
 
160 160
 
@@ -168,14 +168,14 @@  discard block
 block discarded – undo
168 168
      */
169 169
     function fetch($id,$code='',$label='')
170 170
     {
171
-    	global $langs;
171
+        global $langs;
172 172
         $sql = "SELECT";
173
-		$sql.= " t.id,";
174
-		$sql.= " t.code,";
175
-		$sql.= " t.libelle as label,";
176
-		$sql.= " t.fk_country as country_id,";
177
-		$sql.= " t.active,";
178
-		$sql.= " t.module";
173
+        $sql.= " t.id,";
174
+        $sql.= " t.code,";
175
+        $sql.= " t.libelle as label,";
176
+        $sql.= " t.fk_country as country_id,";
177
+        $sql.= " t.active,";
178
+        $sql.= " t.module";
179 179
         $sql.= " FROM ".MAIN_DB_PREFIX."c_typent as t";
180 180
         if ($id)   $sql.= " WHERE t.id = ".$id;
181 181
         elseif ($code) $sql.= " WHERE t.code = '".$this->db->escape($code)."'";
@@ -189,11 +189,11 @@  discard block
 block discarded – undo
189 189
                 $obj = $this->db->fetch_object($resql);
190 190
 
191 191
                 $this->id    = $obj->id;
192
-				$this->code = $obj->code;
193
-				$this->libelle = $obj->label;
194
-				$this->country_id = $obj->country_id;
195
-				$this->active = $obj->active;
196
-				$this->module = $obj->module;
192
+                $this->code = $obj->code;
193
+                $this->libelle = $obj->label;
194
+                $this->country_id = $obj->country_id;
195
+                $this->active = $obj->active;
196
+                $this->module = $obj->module;
197 197
             }
198 198
             $this->db->free($resql);
199 199
 
@@ -201,7 +201,7 @@  discard block
 block discarded – undo
201 201
         }
202 202
         else
203 203
         {
204
-      	    $this->error="Error ".$this->db->lasterror();
204
+                $this->error="Error ".$this->db->lasterror();
205 205
             return -1;
206 206
         }
207 207
     }
@@ -216,120 +216,120 @@  discard block
 block discarded – undo
216 216
      */
217 217
     function update($user=null, $notrigger=0)
218 218
     {
219
-    	global $conf, $langs;
220
-		$error=0;
219
+        global $conf, $langs;
220
+        $error=0;
221 221
 
222
-		// Clean parameters
223
-		if (isset($this->code)) $this->code=trim($this->code);
224
-		if (isset($this->libelle)) $this->libelle=trim($this->libelle);
225
-		if (isset($this->active)) $this->active=trim($this->active);
226
-		if (isset($this->module)) $this->module=trim($this->module);
222
+        // Clean parameters
223
+        if (isset($this->code)) $this->code=trim($this->code);
224
+        if (isset($this->libelle)) $this->libelle=trim($this->libelle);
225
+        if (isset($this->active)) $this->active=trim($this->active);
226
+        if (isset($this->module)) $this->module=trim($this->module);
227 227
 
228 228
 
229
-		// Check parameters
230
-		// Put here code to add control on parameters values
229
+        // Check parameters
230
+        // Put here code to add control on parameters values
231 231
 
232 232
         // Update request
233 233
         $sql = "UPDATE ".MAIN_DB_PREFIX."c_typent SET";
234
-		$sql.= " code=".(isset($this->code)?"'".$this->db->escape($this->code)."'":"null").",";
235
-		$sql.= " libelle=".(isset($this->libelle)?"'".$this->db->escape($this->libelle)."'":"null").",";
236
-		$sql.= " active=".(isset($this->active)?$this->active:"null").",";
237
-		$sql.= " module=".(isset($this->module)?"'".$this->db->escape($this->module)."'":"null")."";
234
+        $sql.= " code=".(isset($this->code)?"'".$this->db->escape($this->code)."'":"null").",";
235
+        $sql.= " libelle=".(isset($this->libelle)?"'".$this->db->escape($this->libelle)."'":"null").",";
236
+        $sql.= " active=".(isset($this->active)?$this->active:"null").",";
237
+        $sql.= " module=".(isset($this->module)?"'".$this->db->escape($this->module)."'":"null")."";
238 238
         $sql.= " WHERE id=".$this->id;
239 239
 
240
-		$this->db->begin();
240
+        $this->db->begin();
241 241
 
242
-		dol_syslog(get_class($this)."::update", LOG_DEBUG);
242
+        dol_syslog(get_class($this)."::update", LOG_DEBUG);
243 243
         $resql = $this->db->query($sql);
244
-    	if (! $resql) { $error++; $this->errors[]="Error ".$this->db->lasterror(); }
245
-
246
-		if (! $error)
247
-		{
248
-			if (! $notrigger)
249
-			{
250
-	            // Uncomment this and change MYOBJECT to your own tag if you
251
-	            // want this action call a trigger.
252
-
253
-	            //// Call triggers
254
-	            //include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php';
255
-	            //$interface=new Interfaces($this->db);
256
-	            //$result=$interface->run_triggers('MYOBJECT_MODIFY',$this,$user,$langs,$conf);
257
-	            //if ($result < 0) { $error++; $this->errors=$interface->errors; }
258
-	            //// End call triggers
259
-	    	}
260
-		}
244
+        if (! $resql) { $error++; $this->errors[]="Error ".$this->db->lasterror(); }
245
+
246
+        if (! $error)
247
+        {
248
+            if (! $notrigger)
249
+            {
250
+                // Uncomment this and change MYOBJECT to your own tag if you
251
+                // want this action call a trigger.
252
+
253
+                //// Call triggers
254
+                //include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php';
255
+                //$interface=new Interfaces($this->db);
256
+                //$result=$interface->run_triggers('MYOBJECT_MODIFY',$this,$user,$langs,$conf);
257
+                //if ($result < 0) { $error++; $this->errors=$interface->errors; }
258
+                //// End call triggers
259
+            }
260
+        }
261 261
 
262 262
         // Commit or rollback
263
-		if ($error)
264
-		{
265
-			foreach($this->errors as $errmsg)
266
-			{
267
-	            dol_syslog(get_class($this)."::update ".$errmsg, LOG_ERR);
268
-	            $this->error.=($this->error?', '.$errmsg:$errmsg);
269
-			}
270
-			$this->db->rollback();
271
-			return -1*$error;
272
-		}
273
-		else
274
-		{
275
-			$this->db->commit();
276
-			return 1;
277
-		}
263
+        if ($error)
264
+        {
265
+            foreach($this->errors as $errmsg)
266
+            {
267
+                dol_syslog(get_class($this)."::update ".$errmsg, LOG_ERR);
268
+                $this->error.=($this->error?', '.$errmsg:$errmsg);
269
+            }
270
+            $this->db->rollback();
271
+            return -1*$error;
272
+        }
273
+        else
274
+        {
275
+            $this->db->commit();
276
+            return 1;
277
+        }
278 278
     }
279 279
 
280 280
 
281
- 	/**
282
-	 *  Delete object in database
283
-	 *
284
-     *	@param  User	$user        User that delete
285
-     *  @param  int		$notrigger	 0=launch triggers after, 1=disable triggers
286
-	 *  @return	int					 <0 if KO, >0 if OK
287
-	 */
288
-	function delete($user, $notrigger=0)
289
-	{
290
-		global $conf, $langs;
291
-		$error=0;
292
-
293
-		$sql = "DELETE FROM ".MAIN_DB_PREFIX."c_typent";
294
-		$sql.= " WHERE id=".$this->id;
295
-
296
-		$this->db->begin();
297
-
298
-		dol_syslog(get_class($this)."::delete", LOG_DEBUG);
299
-		$resql = $this->db->query($sql);
300
-    	if (! $resql) { $error++; $this->errors[]="Error ".$this->db->lasterror(); }
301
-
302
-		if (! $error)
303
-		{
304
-			if (! $notrigger)
305
-			{
306
-				// Uncomment this and change MYOBJECT to your own tag if you
307
-		        // want this action call a trigger.
308
-
309
-		        //// Call triggers
310
-		        //include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php';
311
-		        //$interface=new Interfaces($this->db);
312
-		        //$result=$interface->run_triggers('MYOBJECT_DELETE',$this,$user,$langs,$conf);
313
-		        //if ($result < 0) { $error++; $this->errors=$interface->errors; }
314
-		        //// End call triggers
315
-			}
316
-		}
281
+        /**
282
+         *  Delete object in database
283
+         *
284
+         *	@param  User	$user        User that delete
285
+         *  @param  int		$notrigger	 0=launch triggers after, 1=disable triggers
286
+         *  @return	int					 <0 if KO, >0 if OK
287
+         */
288
+    function delete($user, $notrigger=0)
289
+    {
290
+        global $conf, $langs;
291
+        $error=0;
292
+
293
+        $sql = "DELETE FROM ".MAIN_DB_PREFIX."c_typent";
294
+        $sql.= " WHERE id=".$this->id;
295
+
296
+        $this->db->begin();
297
+
298
+        dol_syslog(get_class($this)."::delete", LOG_DEBUG);
299
+        $resql = $this->db->query($sql);
300
+        if (! $resql) { $error++; $this->errors[]="Error ".$this->db->lasterror(); }
301
+
302
+        if (! $error)
303
+        {
304
+            if (! $notrigger)
305
+            {
306
+                // Uncomment this and change MYOBJECT to your own tag if you
307
+                // want this action call a trigger.
308
+
309
+                //// Call triggers
310
+                //include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php';
311
+                //$interface=new Interfaces($this->db);
312
+                //$result=$interface->run_triggers('MYOBJECT_DELETE',$this,$user,$langs,$conf);
313
+                //if ($result < 0) { $error++; $this->errors=$interface->errors; }
314
+                //// End call triggers
315
+            }
316
+        }
317 317
 
318 318
         // Commit or rollback
319
-		if ($error)
320
-		{
321
-			foreach($this->errors as $errmsg)
322
-			{
323
-	            dol_syslog(get_class($this)."::delete ".$errmsg, LOG_ERR);
324
-	            $this->error.=($this->error?', '.$errmsg:$errmsg);
325
-			}
326
-			$this->db->rollback();
327
-			return -1*$error;
328
-		}
329
-		else
330
-		{
331
-			$this->db->commit();
332
-			return 1;
333
-		}
334
-	}
319
+        if ($error)
320
+        {
321
+            foreach($this->errors as $errmsg)
322
+            {
323
+                dol_syslog(get_class($this)."::delete ".$errmsg, LOG_ERR);
324
+                $this->error.=($this->error?', '.$errmsg:$errmsg);
325
+            }
326
+            $this->db->rollback();
327
+            return -1*$error;
328
+        }
329
+        else
330
+        {
331
+            $this->db->commit();
332
+            return 1;
333
+        }
334
+    }
335 335
 }
Please login to merge, or discard this patch.
Spacing   +68 added lines, -68 removed lines patch added patch discarded remove patch
@@ -35,7 +35,7 @@  discard block
 block discarded – undo
35 35
 	/**
36 36
 	 * @var string Error code (or message)
37 37
 	 */
38
-	public $error='';
38
+	public $error = '';
39 39
 
40 40
 	/**
41 41
 	 * @var string[] Error codes (or messages)
@@ -76,18 +76,18 @@  discard block
 block discarded – undo
76 76
      *  @param      int		$notrigger   0=launch triggers after, 1=disable triggers
77 77
      *  @return     int      		   	 <0 if KO, Id of created object if OK
78 78
      */
79
-    function create($user, $notrigger=0)
79
+    function create($user, $notrigger = 0)
80 80
     {
81 81
     	global $conf, $langs;
82
-		$error=0;
82
+		$error = 0;
83 83
 
84 84
 		// Clean parameters
85 85
 
86
-		if (isset($this->id)) $this->id=trim($this->id);
87
-		if (isset($this->code)) $this->code=trim($this->code);
88
-		if (isset($this->libelle)) $this->libelle=trim($this->libelle);
89
-		if (isset($this->active)) $this->active=trim($this->active);
90
-		if (isset($this->module)) $this->module=trim($this->module);
86
+		if (isset($this->id)) $this->id = trim($this->id);
87
+		if (isset($this->code)) $this->code = trim($this->code);
88
+		if (isset($this->libelle)) $this->libelle = trim($this->libelle);
89
+		if (isset($this->active)) $this->active = trim($this->active);
90
+		if (isset($this->module)) $this->module = trim($this->module);
91 91
 
92 92
 
93 93
 
@@ -97,35 +97,35 @@  discard block
 block discarded – undo
97 97
         // Insert request
98 98
 		$sql = "INSERT INTO ".MAIN_DB_PREFIX."c_typent(";
99 99
 
100
-		$sql.= "id,";
101
-		$sql.= "code,";
102
-		$sql.= "libelle,";
103
-		$sql.= "active,";
104
-		$sql.= "module";
100
+		$sql .= "id,";
101
+		$sql .= "code,";
102
+		$sql .= "libelle,";
103
+		$sql .= "active,";
104
+		$sql .= "module";
105 105
 
106 106
 
107
-        $sql.= ") VALUES (";
107
+        $sql .= ") VALUES (";
108 108
 
109
-		$sql.= " ".(! isset($this->id)?'NULL':"'".$this->db->escape($this->id)."'").",";
110
-		$sql.= " ".(! isset($this->code)?'NULL':"'".$this->db->escape($this->code)."'").",";
111
-		$sql.= " ".(! isset($this->libelle)?'NULL':"'".$this->db->escape($this->libelle)."'").",";
112
-		$sql.= " ".(! isset($this->active)?'NULL':"'".$this->db->active($this->active)."'").",";
113
-		$sql.= " ".(! isset($this->module)?'NULL':"'".$this->db->escape($this->module)."'")."";
109
+		$sql .= " ".(!isset($this->id) ? 'NULL' : "'".$this->db->escape($this->id)."'").",";
110
+		$sql .= " ".(!isset($this->code) ? 'NULL' : "'".$this->db->escape($this->code)."'").",";
111
+		$sql .= " ".(!isset($this->libelle) ? 'NULL' : "'".$this->db->escape($this->libelle)."'").",";
112
+		$sql .= " ".(!isset($this->active) ? 'NULL' : "'".$this->db->active($this->active)."'").",";
113
+		$sql .= " ".(!isset($this->module) ? 'NULL' : "'".$this->db->escape($this->module)."'")."";
114 114
 
115 115
 
116
-		$sql.= ")";
116
+		$sql .= ")";
117 117
 
118 118
 		$this->db->begin();
119 119
 
120 120
 	   	dol_syslog(get_class($this)."::create", LOG_DEBUG);
121
-        $resql=$this->db->query($sql);
122
-    	if (! $resql) { $error++; $this->errors[]="Error ".$this->db->lasterror(); }
121
+        $resql = $this->db->query($sql);
122
+    	if (!$resql) { $error++; $this->errors[] = "Error ".$this->db->lasterror(); }
123 123
 
124
-		if (! $error)
124
+		if (!$error)
125 125
         {
126 126
             $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX."c_typent");
127 127
 
128
-			if (! $notrigger)
128
+			if (!$notrigger)
129 129
 			{
130 130
 	            // Uncomment this and change MYOBJECT to your own tag if you
131 131
 	            // want this action call a trigger.
@@ -142,13 +142,13 @@  discard block
 block discarded – undo
142 142
         // Commit or rollback
143 143
         if ($error)
144 144
 		{
145
-			foreach($this->errors as $errmsg)
145
+			foreach ($this->errors as $errmsg)
146 146
 			{
147 147
 	            dol_syslog(get_class($this)."::create ".$errmsg, LOG_ERR);
148
-	            $this->error.=($this->error?', '.$errmsg:$errmsg);
148
+	            $this->error .= ($this->error ? ', '.$errmsg : $errmsg);
149 149
 			}
150 150
 			$this->db->rollback();
151
-			return -1*$error;
151
+			return -1 * $error;
152 152
 		}
153 153
 		else
154 154
 		{
@@ -166,29 +166,29 @@  discard block
 block discarded – undo
166 166
      *  @param		string	$label	Label
167 167
      *  @return     int          	<0 if KO, >0 if OK
168 168
      */
169
-    function fetch($id,$code='',$label='')
169
+    function fetch($id, $code = '', $label = '')
170 170
     {
171 171
     	global $langs;
172 172
         $sql = "SELECT";
173
-		$sql.= " t.id,";
174
-		$sql.= " t.code,";
175
-		$sql.= " t.libelle as label,";
176
-		$sql.= " t.fk_country as country_id,";
177
-		$sql.= " t.active,";
178
-		$sql.= " t.module";
179
-        $sql.= " FROM ".MAIN_DB_PREFIX."c_typent as t";
180
-        if ($id)   $sql.= " WHERE t.id = ".$id;
181
-        elseif ($code) $sql.= " WHERE t.code = '".$this->db->escape($code)."'";
182
-        elseif ($label) $sql.= " WHERE t.libelle = '".$this->db->escape($label)."'";
183
-
184
-        $resql=$this->db->query($sql);
173
+		$sql .= " t.id,";
174
+		$sql .= " t.code,";
175
+		$sql .= " t.libelle as label,";
176
+		$sql .= " t.fk_country as country_id,";
177
+		$sql .= " t.active,";
178
+		$sql .= " t.module";
179
+        $sql .= " FROM ".MAIN_DB_PREFIX."c_typent as t";
180
+        if ($id)   $sql .= " WHERE t.id = ".$id;
181
+        elseif ($code) $sql .= " WHERE t.code = '".$this->db->escape($code)."'";
182
+        elseif ($label) $sql .= " WHERE t.libelle = '".$this->db->escape($label)."'";
183
+
184
+        $resql = $this->db->query($sql);
185 185
         if ($resql)
186 186
         {
187 187
             if ($this->db->num_rows($resql))
188 188
             {
189 189
                 $obj = $this->db->fetch_object($resql);
190 190
 
191
-                $this->id    = $obj->id;
191
+                $this->id = $obj->id;
192 192
 				$this->code = $obj->code;
193 193
 				$this->libelle = $obj->label;
194 194
 				$this->country_id = $obj->country_id;
@@ -201,7 +201,7 @@  discard block
 block discarded – undo
201 201
         }
202 202
         else
203 203
         {
204
-      	    $this->error="Error ".$this->db->lasterror();
204
+      	    $this->error = "Error ".$this->db->lasterror();
205 205
             return -1;
206 206
         }
207 207
     }
@@ -214,16 +214,16 @@  discard block
 block discarded – undo
214 214
      *  @param      int		$notrigger	 0=launch triggers after, 1=disable triggers
215 215
      *  @return     int     		   	 <0 if KO, >0 if OK
216 216
      */
217
-    function update($user=null, $notrigger=0)
217
+    function update($user = null, $notrigger = 0)
218 218
     {
219 219
     	global $conf, $langs;
220
-		$error=0;
220
+		$error = 0;
221 221
 
222 222
 		// Clean parameters
223
-		if (isset($this->code)) $this->code=trim($this->code);
224
-		if (isset($this->libelle)) $this->libelle=trim($this->libelle);
225
-		if (isset($this->active)) $this->active=trim($this->active);
226
-		if (isset($this->module)) $this->module=trim($this->module);
223
+		if (isset($this->code)) $this->code = trim($this->code);
224
+		if (isset($this->libelle)) $this->libelle = trim($this->libelle);
225
+		if (isset($this->active)) $this->active = trim($this->active);
226
+		if (isset($this->module)) $this->module = trim($this->module);
227 227
 
228 228
 
229 229
 		// Check parameters
@@ -231,21 +231,21 @@  discard block
 block discarded – undo
231 231
 
232 232
         // Update request
233 233
         $sql = "UPDATE ".MAIN_DB_PREFIX."c_typent SET";
234
-		$sql.= " code=".(isset($this->code)?"'".$this->db->escape($this->code)."'":"null").",";
235
-		$sql.= " libelle=".(isset($this->libelle)?"'".$this->db->escape($this->libelle)."'":"null").",";
236
-		$sql.= " active=".(isset($this->active)?$this->active:"null").",";
237
-		$sql.= " module=".(isset($this->module)?"'".$this->db->escape($this->module)."'":"null")."";
238
-        $sql.= " WHERE id=".$this->id;
234
+		$sql .= " code=".(isset($this->code) ? "'".$this->db->escape($this->code)."'" : "null").",";
235
+		$sql .= " libelle=".(isset($this->libelle) ? "'".$this->db->escape($this->libelle)."'" : "null").",";
236
+		$sql .= " active=".(isset($this->active) ? $this->active : "null").",";
237
+		$sql .= " module=".(isset($this->module) ? "'".$this->db->escape($this->module)."'" : "null")."";
238
+        $sql .= " WHERE id=".$this->id;
239 239
 
240 240
 		$this->db->begin();
241 241
 
242 242
 		dol_syslog(get_class($this)."::update", LOG_DEBUG);
243 243
         $resql = $this->db->query($sql);
244
-    	if (! $resql) { $error++; $this->errors[]="Error ".$this->db->lasterror(); }
244
+    	if (!$resql) { $error++; $this->errors[] = "Error ".$this->db->lasterror(); }
245 245
 
246
-		if (! $error)
246
+		if (!$error)
247 247
 		{
248
-			if (! $notrigger)
248
+			if (!$notrigger)
249 249
 			{
250 250
 	            // Uncomment this and change MYOBJECT to your own tag if you
251 251
 	            // want this action call a trigger.
@@ -262,13 +262,13 @@  discard block
 block discarded – undo
262 262
         // Commit or rollback
263 263
 		if ($error)
264 264
 		{
265
-			foreach($this->errors as $errmsg)
265
+			foreach ($this->errors as $errmsg)
266 266
 			{
267 267
 	            dol_syslog(get_class($this)."::update ".$errmsg, LOG_ERR);
268
-	            $this->error.=($this->error?', '.$errmsg:$errmsg);
268
+	            $this->error .= ($this->error ? ', '.$errmsg : $errmsg);
269 269
 			}
270 270
 			$this->db->rollback();
271
-			return -1*$error;
271
+			return -1 * $error;
272 272
 		}
273 273
 		else
274 274
 		{
@@ -285,23 +285,23 @@  discard block
 block discarded – undo
285 285
      *  @param  int		$notrigger	 0=launch triggers after, 1=disable triggers
286 286
 	 *  @return	int					 <0 if KO, >0 if OK
287 287
 	 */
288
-	function delete($user, $notrigger=0)
288
+	function delete($user, $notrigger = 0)
289 289
 	{
290 290
 		global $conf, $langs;
291
-		$error=0;
291
+		$error = 0;
292 292
 
293 293
 		$sql = "DELETE FROM ".MAIN_DB_PREFIX."c_typent";
294
-		$sql.= " WHERE id=".$this->id;
294
+		$sql .= " WHERE id=".$this->id;
295 295
 
296 296
 		$this->db->begin();
297 297
 
298 298
 		dol_syslog(get_class($this)."::delete", LOG_DEBUG);
299 299
 		$resql = $this->db->query($sql);
300
-    	if (! $resql) { $error++; $this->errors[]="Error ".$this->db->lasterror(); }
300
+    	if (!$resql) { $error++; $this->errors[] = "Error ".$this->db->lasterror(); }
301 301
 
302
-		if (! $error)
302
+		if (!$error)
303 303
 		{
304
-			if (! $notrigger)
304
+			if (!$notrigger)
305 305
 			{
306 306
 				// Uncomment this and change MYOBJECT to your own tag if you
307 307
 		        // want this action call a trigger.
@@ -318,13 +318,13 @@  discard block
 block discarded – undo
318 318
         // Commit or rollback
319 319
 		if ($error)
320 320
 		{
321
-			foreach($this->errors as $errmsg)
321
+			foreach ($this->errors as $errmsg)
322 322
 			{
323 323
 	            dol_syslog(get_class($this)."::delete ".$errmsg, LOG_ERR);
324
-	            $this->error.=($this->error?', '.$errmsg:$errmsg);
324
+	            $this->error .= ($this->error ? ', '.$errmsg : $errmsg);
325 325
 			}
326 326
 			$this->db->rollback();
327
-			return -1*$error;
327
+			return -1 * $error;
328 328
 		}
329 329
 		else
330 330
 		{
Please login to merge, or discard this patch.
Braces   +38 added lines, -20 removed lines patch added patch discarded remove patch
@@ -83,11 +83,21 @@  discard block
 block discarded – undo
83 83
 
84 84
 		// Clean parameters
85 85
 
86
-		if (isset($this->id)) $this->id=trim($this->id);
87
-		if (isset($this->code)) $this->code=trim($this->code);
88
-		if (isset($this->libelle)) $this->libelle=trim($this->libelle);
89
-		if (isset($this->active)) $this->active=trim($this->active);
90
-		if (isset($this->module)) $this->module=trim($this->module);
86
+		if (isset($this->id)) {
87
+		    $this->id=trim($this->id);
88
+		}
89
+		if (isset($this->code)) {
90
+		    $this->code=trim($this->code);
91
+		}
92
+		if (isset($this->libelle)) {
93
+		    $this->libelle=trim($this->libelle);
94
+		}
95
+		if (isset($this->active)) {
96
+		    $this->active=trim($this->active);
97
+		}
98
+		if (isset($this->module)) {
99
+		    $this->module=trim($this->module);
100
+		}
91 101
 
92 102
 
93 103
 
@@ -149,8 +159,7 @@  discard block
 block discarded – undo
149 159
 			}
150 160
 			$this->db->rollback();
151 161
 			return -1*$error;
152
-		}
153
-		else
162
+		} else
154 163
 		{
155 164
 			$this->db->commit();
156 165
             return $this->id;
@@ -177,9 +186,13 @@  discard block
 block discarded – undo
177 186
 		$sql.= " t.active,";
178 187
 		$sql.= " t.module";
179 188
         $sql.= " FROM ".MAIN_DB_PREFIX."c_typent as t";
180
-        if ($id)   $sql.= " WHERE t.id = ".$id;
181
-        elseif ($code) $sql.= " WHERE t.code = '".$this->db->escape($code)."'";
182
-        elseif ($label) $sql.= " WHERE t.libelle = '".$this->db->escape($label)."'";
189
+        if ($id) {
190
+            $sql.= " WHERE t.id = ".$id;
191
+        } elseif ($code) {
192
+            $sql.= " WHERE t.code = '".$this->db->escape($code)."'";
193
+        } elseif ($label) {
194
+            $sql.= " WHERE t.libelle = '".$this->db->escape($label)."'";
195
+        }
183 196
 
184 197
         $resql=$this->db->query($sql);
185 198
         if ($resql)
@@ -198,8 +211,7 @@  discard block
 block discarded – undo
198 211
             $this->db->free($resql);
199 212
 
200 213
             return 1;
201
-        }
202
-        else
214
+        } else
203 215
         {
204 216
       	    $this->error="Error ".$this->db->lasterror();
205 217
             return -1;
@@ -220,10 +232,18 @@  discard block
 block discarded – undo
220 232
 		$error=0;
221 233
 
222 234
 		// Clean parameters
223
-		if (isset($this->code)) $this->code=trim($this->code);
224
-		if (isset($this->libelle)) $this->libelle=trim($this->libelle);
225
-		if (isset($this->active)) $this->active=trim($this->active);
226
-		if (isset($this->module)) $this->module=trim($this->module);
235
+		if (isset($this->code)) {
236
+		    $this->code=trim($this->code);
237
+		}
238
+		if (isset($this->libelle)) {
239
+		    $this->libelle=trim($this->libelle);
240
+		}
241
+		if (isset($this->active)) {
242
+		    $this->active=trim($this->active);
243
+		}
244
+		if (isset($this->module)) {
245
+		    $this->module=trim($this->module);
246
+		}
227 247
 
228 248
 
229 249
 		// Check parameters
@@ -269,8 +289,7 @@  discard block
 block discarded – undo
269 289
 			}
270 290
 			$this->db->rollback();
271 291
 			return -1*$error;
272
-		}
273
-		else
292
+		} else
274 293
 		{
275 294
 			$this->db->commit();
276 295
 			return 1;
@@ -325,8 +344,7 @@  discard block
 block discarded – undo
325 344
 			}
326 345
 			$this->db->rollback();
327 346
 			return -1*$error;
328
-		}
329
-		else
347
+		} else
330 348
 		{
331 349
 			$this->db->commit();
332 350
 			return 1;
Please login to merge, or discard this patch.
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/ldap.class.php 3 patches
Indentation   +1474 added lines, -1474 removed lines patch added patch discarded remove patch
@@ -29,1491 +29,1491 @@
 block discarded – undo
29 29
  */
30 30
 class Ldap
31 31
 {
32
-	/**
33
-	 * @var string Error code (or message)
34
-	 */
35
-	public $error='';
36
-
37
-	/**
38
-	 * @var string[]	Array of error strings
39
-	 */
40
-	public $errors = array();
41
-
42
-	/**
43
-	 * Tableau des serveurs (IP addresses ou nom d'hotes)
44
-	 */
45
-	var $server=array();
46
-
47
-	/**
48
-	 * Base DN (e.g. "dc=foo,dc=com")
49
-	 */
50
-	var $dn;
51
-	/**
52
-	 * type de serveur, actuellement OpenLdap et Active Directory
53
-	 */
54
-	var $serverType;
55
-	/**
56
-	 * Version du protocole ldap
57
-	 */
58
-	var $domain;
59
-	/**
60
-	 * User administrateur Ldap
61
-	 * Active Directory ne supporte pas les connexions anonymes
62
-	 */
63
-	var $searchUser;
64
-	/**
65
-	 * Mot de passe de l'administrateur
66
-	 * Active Directory ne supporte pas les connexions anonymes
67
-	 */
68
-	var $searchPassword;
69
-	/**
70
-	 *  DN des utilisateurs
71
-	 */
72
-	var $people;
73
-	/**
74
-	 * DN des groupes
75
-	 */
76
-	var $groups;
77
-	/**
78
-	 * Code erreur retourne par le serveur Ldap
79
-	 */
80
-	var $ldapErrorCode;
81
-	/**
82
-	 * Message texte de l'erreur
83
-	 */
84
-	var $ldapErrorText;
85
-
86
-
87
-	//Fetch user
88
-	var $name;
89
-	var $firstname;
90
-	var $login;
91
-	var $phone;
92
-	var $skype;
93
-	var $fax;
94
-	var $mail;
95
-	var $mobile;
96
-
97
-	var $uacf;
98
-	var $pwdlastset;
99
-
100
-	var $ldapcharset='UTF-8';	// LDAP should be UTF-8 encoded
101
-
102
-
103
-	/**
104
-	 * The internal LDAP connection handle
105
-	 */
106
-	var $connection;
107
-	/**
108
-	 * Result of any connections etc.
109
-	 */
110
-	var $result;
111
-
112
-
113
-	/**
114
-	 *  Constructor
115
-	 */
116
-	function __construct()
117
-	{
118
-		global $conf;
119
-
120
-		// Server
121
-		if (! empty($conf->global->LDAP_SERVER_HOST))       $this->server[] = $conf->global->LDAP_SERVER_HOST;
122
-		if (! empty($conf->global->LDAP_SERVER_HOST_SLAVE)) $this->server[] = $conf->global->LDAP_SERVER_HOST_SLAVE;
123
-		$this->serverPort          = $conf->global->LDAP_SERVER_PORT;
124
-		$this->ldapProtocolVersion = $conf->global->LDAP_SERVER_PROTOCOLVERSION;
125
-		$this->dn                  = $conf->global->LDAP_SERVER_DN;
126
-		$this->serverType          = $conf->global->LDAP_SERVER_TYPE;
127
-		$this->domain              = $conf->global->LDAP_SERVER_DN;
128
-		$this->searchUser          = $conf->global->LDAP_ADMIN_DN;
129
-		$this->searchPassword      = $conf->global->LDAP_ADMIN_PASS;
130
-		$this->people              = $conf->global->LDAP_USER_DN;
131
-		$this->groups              = $conf->global->LDAP_GROUP_DN;
132
-
133
-		$this->filter              = $conf->global->LDAP_FILTER_CONNECTION;	// Filter on user
134
-		$this->filtermember        = $conf->global->LDAP_MEMBER_FILTER;		// Filter on member
135
-
136
-		// Users
137
-		$this->attr_login      = $conf->global->LDAP_FIELD_LOGIN; //unix
138
-		$this->attr_sambalogin = $conf->global->LDAP_FIELD_LOGIN_SAMBA; //samba, activedirectory
139
-		$this->attr_name       = $conf->global->LDAP_FIELD_NAME;
140
-		$this->attr_firstname  = $conf->global->LDAP_FIELD_FIRSTNAME;
141
-		$this->attr_mail       = $conf->global->LDAP_FIELD_MAIL;
142
-		$this->attr_phone      = $conf->global->LDAP_FIELD_PHONE;
143
-		$this->attr_skype      = $conf->global->LDAP_FIELD_SKYPE;
144
-		$this->attr_fax        = $conf->global->LDAP_FIELD_FAX;
145
-		$this->attr_mobile     = $conf->global->LDAP_FIELD_MOBILE;
146
-	}
147
-
148
-
149
-
150
-	// Connection handling methods -------------------------------------------
32
+    /**
33
+     * @var string Error code (or message)
34
+     */
35
+    public $error='';
36
+
37
+    /**
38
+     * @var string[]	Array of error strings
39
+     */
40
+    public $errors = array();
41
+
42
+    /**
43
+     * Tableau des serveurs (IP addresses ou nom d'hotes)
44
+     */
45
+    var $server=array();
46
+
47
+    /**
48
+     * Base DN (e.g. "dc=foo,dc=com")
49
+     */
50
+    var $dn;
51
+    /**
52
+     * type de serveur, actuellement OpenLdap et Active Directory
53
+     */
54
+    var $serverType;
55
+    /**
56
+     * Version du protocole ldap
57
+     */
58
+    var $domain;
59
+    /**
60
+     * User administrateur Ldap
61
+     * Active Directory ne supporte pas les connexions anonymes
62
+     */
63
+    var $searchUser;
64
+    /**
65
+     * Mot de passe de l'administrateur
66
+     * Active Directory ne supporte pas les connexions anonymes
67
+     */
68
+    var $searchPassword;
69
+    /**
70
+     *  DN des utilisateurs
71
+     */
72
+    var $people;
73
+    /**
74
+     * DN des groupes
75
+     */
76
+    var $groups;
77
+    /**
78
+     * Code erreur retourne par le serveur Ldap
79
+     */
80
+    var $ldapErrorCode;
81
+    /**
82
+     * Message texte de l'erreur
83
+     */
84
+    var $ldapErrorText;
85
+
86
+
87
+    //Fetch user
88
+    var $name;
89
+    var $firstname;
90
+    var $login;
91
+    var $phone;
92
+    var $skype;
93
+    var $fax;
94
+    var $mail;
95
+    var $mobile;
96
+
97
+    var $uacf;
98
+    var $pwdlastset;
99
+
100
+    var $ldapcharset='UTF-8';	// LDAP should be UTF-8 encoded
101
+
102
+
103
+    /**
104
+     * The internal LDAP connection handle
105
+     */
106
+    var $connection;
107
+    /**
108
+     * Result of any connections etc.
109
+     */
110
+    var $result;
111
+
112
+
113
+    /**
114
+     *  Constructor
115
+     */
116
+    function __construct()
117
+    {
118
+        global $conf;
119
+
120
+        // Server
121
+        if (! empty($conf->global->LDAP_SERVER_HOST))       $this->server[] = $conf->global->LDAP_SERVER_HOST;
122
+        if (! empty($conf->global->LDAP_SERVER_HOST_SLAVE)) $this->server[] = $conf->global->LDAP_SERVER_HOST_SLAVE;
123
+        $this->serverPort          = $conf->global->LDAP_SERVER_PORT;
124
+        $this->ldapProtocolVersion = $conf->global->LDAP_SERVER_PROTOCOLVERSION;
125
+        $this->dn                  = $conf->global->LDAP_SERVER_DN;
126
+        $this->serverType          = $conf->global->LDAP_SERVER_TYPE;
127
+        $this->domain              = $conf->global->LDAP_SERVER_DN;
128
+        $this->searchUser          = $conf->global->LDAP_ADMIN_DN;
129
+        $this->searchPassword      = $conf->global->LDAP_ADMIN_PASS;
130
+        $this->people              = $conf->global->LDAP_USER_DN;
131
+        $this->groups              = $conf->global->LDAP_GROUP_DN;
132
+
133
+        $this->filter              = $conf->global->LDAP_FILTER_CONNECTION;	// Filter on user
134
+        $this->filtermember        = $conf->global->LDAP_MEMBER_FILTER;		// Filter on member
135
+
136
+        // Users
137
+        $this->attr_login      = $conf->global->LDAP_FIELD_LOGIN; //unix
138
+        $this->attr_sambalogin = $conf->global->LDAP_FIELD_LOGIN_SAMBA; //samba, activedirectory
139
+        $this->attr_name       = $conf->global->LDAP_FIELD_NAME;
140
+        $this->attr_firstname  = $conf->global->LDAP_FIELD_FIRSTNAME;
141
+        $this->attr_mail       = $conf->global->LDAP_FIELD_MAIL;
142
+        $this->attr_phone      = $conf->global->LDAP_FIELD_PHONE;
143
+        $this->attr_skype      = $conf->global->LDAP_FIELD_SKYPE;
144
+        $this->attr_fax        = $conf->global->LDAP_FIELD_FAX;
145
+        $this->attr_mobile     = $conf->global->LDAP_FIELD_MOBILE;
146
+    }
147
+
148
+
149
+
150
+    // Connection handling methods -------------------------------------------
151 151
 
152 152
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
153
-	/**
154
-	 *	Connect and bind
155
-	 * 	Use this->server, this->serverPort, this->ldapProtocolVersion, this->serverType, this->searchUser, this->searchPassword
156
-	 * 	After return, this->connection and $this->bind are defined
157
-	 *
158
-	 *	@return		int		<0 if KO, 1 if bind anonymous, 2 if bind auth
159
-	 */
160
-	function connect_bind()
161
-	{
153
+    /**
154
+     *	Connect and bind
155
+     * 	Use this->server, this->serverPort, this->ldapProtocolVersion, this->serverType, this->searchUser, this->searchPassword
156
+     * 	After return, this->connection and $this->bind are defined
157
+     *
158
+     *	@return		int		<0 if KO, 1 if bind anonymous, 2 if bind auth
159
+     */
160
+    function connect_bind()
161
+    {
162 162
         // phpcs:enable
163
-		global $langs, $conf;
164
-
165
-		$connected=0;
166
-		$this->bind=0;
167
-
168
-		// Check parameters
169
-		if (count($this->server) == 0 || empty($this->server[0]))
170
-		{
171
-			$this->error='LDAP setup (file conf.php) is not complete';
172
-			dol_syslog(get_class($this)."::connect_bind ".$this->error, LOG_WARNING);
173
-			return -1;
174
-		}
175
-
176
-		if (! function_exists("ldap_connect"))
177
-		{
178
-			$this->error='LDAPFunctionsNotAvailableOnPHP';
179
-			dol_syslog(get_class($this)."::connect_bind ".$this->error, LOG_WARNING);
180
-			$return=-1;
181
-		}
182
-
183
-		if (empty($this->error))
184
-		{
185
-			// Loop on each ldap server
186
-			foreach ($this->server as $key => $host)
187
-			{
188
-				if ($connected) break;
189
-				if (empty($host)) continue;
190
-
191
-				if ($this->serverPing($host, $this->serverPort) === true) {
192
-					$this->connection = ldap_connect($host, $this->serverPort);
193
-				}
194
-				else continue;
195
-
196
-				if (is_resource($this->connection))
197
-				{
198
-					// Begin TLS if requested by the configuration
199
-					if (! empty($conf->global->LDAP_SERVER_USE_TLS))
200
-					{
201
-						if (! ldap_start_tls($this->connection))
202
-						{
203
-							dol_syslog(get_class($this)."::connect_bind failed to start tls", LOG_WARNING);
204
-							$connected = 0;
205
-							$this->close();
206
-						}
207
-					}
208
-
209
-					// Execute the ldap_set_option here (after connect and before bind)
210
-					$this->setVersion();
211
-					ldap_set_option($this->connection, LDAP_OPT_SIZELIMIT, 0); // no limit here. should return true.
212
-
213
-
214
-					if ($this->serverType == "activedirectory")
215
-					{
216
-						$result=$this->setReferrals();
217
-						dol_syslog(get_class($this)."::connect_bind try bindauth for activedirectory on ".$host." user=".$this->searchUser." password=".preg_replace('/./','*',$this->searchPassword),LOG_DEBUG);
218
-						$this->result=$this->bindauth($this->searchUser,$this->searchPassword);
219
-						if ($this->result)
220
-						{
221
-							$this->bind=$this->result;
222
-							$connected=2;
223
-							break;
224
-						}
225
-						else
226
-						{
227
-							$this->error=ldap_errno($this->connection).' '.ldap_error($this->connection);
228
-						}
229
-					}
230
-					else
231
-					{
232
-						// Try in auth mode
233
-						if ($this->searchUser && $this->searchPassword)
234
-						{
235
-							dol_syslog(get_class($this)."::connect_bind try bindauth on ".$host." user=".$this->searchUser." password=".preg_replace('/./','*',$this->searchPassword),LOG_DEBUG);
236
-							$this->result=$this->bindauth($this->searchUser,$this->searchPassword);
237
-							if ($this->result)
238
-							{
239
-								$this->bind=$this->result;
240
-								$connected=2;
241
-								break;
242
-							}
243
-							else
244
-							{
245
-								$this->error=ldap_errno($this->connection).' '.ldap_error($this->connection);
246
-							}
247
-						}
248
-						// Try in anonymous
249
-						if (! $this->bind)
250
-						{
251
-							dol_syslog(get_class($this)."::connect_bind try bind on ".$host,LOG_DEBUG);
252
-							$result=$this->bind();
253
-							if ($result)
254
-							{
255
-								$this->bind=$this->result;
256
-								$connected=1;
257
-								break;
258
-							}
259
-							else
260
-							{
261
-								$this->error=ldap_errno($this->connection).' '.ldap_error($this->connection);
262
-							}
263
-						}
264
-					}
265
-				}
266
-
267
-				if (! $connected) $this->close();
268
-			}
269
-		}
270
-
271
-		if ($connected)
272
-		{
273
-			$return=$connected;
274
-			dol_syslog(get_class($this)."::connect_bind return=".$return, LOG_DEBUG);
275
-		}
276
-		else
277
-		{
278
-			$this->error='Failed to connect to LDAP'.($this->error?': '.$this->error:'');
279
-			$return=-1;
280
-			dol_syslog(get_class($this)."::connect_bind return=".$return.' - '.$this->error, LOG_WARNING);
281
-		}
282
-		return $return;
283
-	}
284
-
285
-
286
-
287
-	/**
288
-	 * Simply closes the connection set up earlier.
289
-	 * Returns true if OK, false if there was an error.
290
-	 *
291
-	 * @return	boolean			true or false
292
-	 */
293
-	function close()
294
-	{
295
-		if ($this->connection && ! @ldap_close($this->connection))
296
-		{
297
-			return false;
298
-		}
299
-		else
300
-		{
301
-			return true;
302
-		}
303
-	}
304
-
305
-	/**
306
-	 * Anonymously binds to the connection. After this is done,
307
-	 * queries and searches can be done - but read-only.
308
-	 *
309
-	 * @return	boolean			true or false
310
-	 */
311
-	function bind()
312
-	{
313
-		if (! $this->result=@ldap_bind($this->connection))
314
-		{
315
-			$this->ldapErrorCode = ldap_errno($this->connection);
316
-			$this->ldapErrorText = ldap_error($this->connection);
317
-			$this->error=$this->ldapErrorCode." ".$this->ldapErrorText;
318
-			return false;
319
-		}
320
-		else
321
-		{
322
-			return true;
323
-		}
324
-	}
325
-
326
-	/**
327
-	 * Binds as an authenticated user, which usually allows for write
328
-	 * access. The FULL dn must be passed. For a directory manager, this is
329
-	 * "cn=Directory Manager" under iPlanet. For a user, it will be something
330
-	 * like "uid=jbloggs,ou=People,dc=foo,dc=com".
331
-	 *
332
-	 * @param	string	$bindDn			DN
333
-	 * @param	string	$pass			Password
334
-	 * @return	boolean					true or false
335
-	 */
336
-	function bindauth($bindDn,$pass)
337
-	{
338
-		if (! $this->result = @ldap_bind($this->connection, $bindDn, $pass))
339
-		{
340
-			$this->ldapErrorCode = ldap_errno($this->connection);
341
-			$this->ldapErrorText = ldap_error($this->connection);
342
-			$this->error=$this->ldapErrorCode." ".$this->ldapErrorText;
343
-			return false;
344
-		}
345
-		else
346
-		{
347
-			return true;
348
-		}
349
-	}
350
-
351
-	/**
352
-	 * Unbind du serveur ldap.
353
-	 *
354
-	 * @return	boolean					true or false
355
-	 */
356
-	function unbind()
357
-	{
358
-		if (!$this->result=@ldap_unbind($this->connection))
359
-		{
360
-			return false;
361
-		} else {
362
-			return true;
363
-		}
364
-	}
365
-
366
-
367
-	/**
368
-	 * Verification de la version du serveur ldap.
369
-	 *
370
-	 * @return	string					version
371
-	 */
372
-	function getVersion()
373
-	{
374
-		$version = 0;
375
-		$version = @ldap_get_option($this->connection, LDAP_OPT_PROTOCOL_VERSION, $version);
376
-		return $version;
377
-	}
378
-
379
-	/**
380
-	 * Change ldap protocol version to use.
381
-	 *
382
-	 * @return	boolean					version
383
-	 */
163
+        global $langs, $conf;
164
+
165
+        $connected=0;
166
+        $this->bind=0;
167
+
168
+        // Check parameters
169
+        if (count($this->server) == 0 || empty($this->server[0]))
170
+        {
171
+            $this->error='LDAP setup (file conf.php) is not complete';
172
+            dol_syslog(get_class($this)."::connect_bind ".$this->error, LOG_WARNING);
173
+            return -1;
174
+        }
175
+
176
+        if (! function_exists("ldap_connect"))
177
+        {
178
+            $this->error='LDAPFunctionsNotAvailableOnPHP';
179
+            dol_syslog(get_class($this)."::connect_bind ".$this->error, LOG_WARNING);
180
+            $return=-1;
181
+        }
182
+
183
+        if (empty($this->error))
184
+        {
185
+            // Loop on each ldap server
186
+            foreach ($this->server as $key => $host)
187
+            {
188
+                if ($connected) break;
189
+                if (empty($host)) continue;
190
+
191
+                if ($this->serverPing($host, $this->serverPort) === true) {
192
+                    $this->connection = ldap_connect($host, $this->serverPort);
193
+                }
194
+                else continue;
195
+
196
+                if (is_resource($this->connection))
197
+                {
198
+                    // Begin TLS if requested by the configuration
199
+                    if (! empty($conf->global->LDAP_SERVER_USE_TLS))
200
+                    {
201
+                        if (! ldap_start_tls($this->connection))
202
+                        {
203
+                            dol_syslog(get_class($this)."::connect_bind failed to start tls", LOG_WARNING);
204
+                            $connected = 0;
205
+                            $this->close();
206
+                        }
207
+                    }
208
+
209
+                    // Execute the ldap_set_option here (after connect and before bind)
210
+                    $this->setVersion();
211
+                    ldap_set_option($this->connection, LDAP_OPT_SIZELIMIT, 0); // no limit here. should return true.
212
+
213
+
214
+                    if ($this->serverType == "activedirectory")
215
+                    {
216
+                        $result=$this->setReferrals();
217
+                        dol_syslog(get_class($this)."::connect_bind try bindauth for activedirectory on ".$host." user=".$this->searchUser." password=".preg_replace('/./','*',$this->searchPassword),LOG_DEBUG);
218
+                        $this->result=$this->bindauth($this->searchUser,$this->searchPassword);
219
+                        if ($this->result)
220
+                        {
221
+                            $this->bind=$this->result;
222
+                            $connected=2;
223
+                            break;
224
+                        }
225
+                        else
226
+                        {
227
+                            $this->error=ldap_errno($this->connection).' '.ldap_error($this->connection);
228
+                        }
229
+                    }
230
+                    else
231
+                    {
232
+                        // Try in auth mode
233
+                        if ($this->searchUser && $this->searchPassword)
234
+                        {
235
+                            dol_syslog(get_class($this)."::connect_bind try bindauth on ".$host." user=".$this->searchUser." password=".preg_replace('/./','*',$this->searchPassword),LOG_DEBUG);
236
+                            $this->result=$this->bindauth($this->searchUser,$this->searchPassword);
237
+                            if ($this->result)
238
+                            {
239
+                                $this->bind=$this->result;
240
+                                $connected=2;
241
+                                break;
242
+                            }
243
+                            else
244
+                            {
245
+                                $this->error=ldap_errno($this->connection).' '.ldap_error($this->connection);
246
+                            }
247
+                        }
248
+                        // Try in anonymous
249
+                        if (! $this->bind)
250
+                        {
251
+                            dol_syslog(get_class($this)."::connect_bind try bind on ".$host,LOG_DEBUG);
252
+                            $result=$this->bind();
253
+                            if ($result)
254
+                            {
255
+                                $this->bind=$this->result;
256
+                                $connected=1;
257
+                                break;
258
+                            }
259
+                            else
260
+                            {
261
+                                $this->error=ldap_errno($this->connection).' '.ldap_error($this->connection);
262
+                            }
263
+                        }
264
+                    }
265
+                }
266
+
267
+                if (! $connected) $this->close();
268
+            }
269
+        }
270
+
271
+        if ($connected)
272
+        {
273
+            $return=$connected;
274
+            dol_syslog(get_class($this)."::connect_bind return=".$return, LOG_DEBUG);
275
+        }
276
+        else
277
+        {
278
+            $this->error='Failed to connect to LDAP'.($this->error?': '.$this->error:'');
279
+            $return=-1;
280
+            dol_syslog(get_class($this)."::connect_bind return=".$return.' - '.$this->error, LOG_WARNING);
281
+        }
282
+        return $return;
283
+    }
284
+
285
+
286
+
287
+    /**
288
+     * Simply closes the connection set up earlier.
289
+     * Returns true if OK, false if there was an error.
290
+     *
291
+     * @return	boolean			true or false
292
+     */
293
+    function close()
294
+    {
295
+        if ($this->connection && ! @ldap_close($this->connection))
296
+        {
297
+            return false;
298
+        }
299
+        else
300
+        {
301
+            return true;
302
+        }
303
+    }
304
+
305
+    /**
306
+     * Anonymously binds to the connection. After this is done,
307
+     * queries and searches can be done - but read-only.
308
+     *
309
+     * @return	boolean			true or false
310
+     */
311
+    function bind()
312
+    {
313
+        if (! $this->result=@ldap_bind($this->connection))
314
+        {
315
+            $this->ldapErrorCode = ldap_errno($this->connection);
316
+            $this->ldapErrorText = ldap_error($this->connection);
317
+            $this->error=$this->ldapErrorCode." ".$this->ldapErrorText;
318
+            return false;
319
+        }
320
+        else
321
+        {
322
+            return true;
323
+        }
324
+    }
325
+
326
+    /**
327
+     * Binds as an authenticated user, which usually allows for write
328
+     * access. The FULL dn must be passed. For a directory manager, this is
329
+     * "cn=Directory Manager" under iPlanet. For a user, it will be something
330
+     * like "uid=jbloggs,ou=People,dc=foo,dc=com".
331
+     *
332
+     * @param	string	$bindDn			DN
333
+     * @param	string	$pass			Password
334
+     * @return	boolean					true or false
335
+     */
336
+    function bindauth($bindDn,$pass)
337
+    {
338
+        if (! $this->result = @ldap_bind($this->connection, $bindDn, $pass))
339
+        {
340
+            $this->ldapErrorCode = ldap_errno($this->connection);
341
+            $this->ldapErrorText = ldap_error($this->connection);
342
+            $this->error=$this->ldapErrorCode." ".$this->ldapErrorText;
343
+            return false;
344
+        }
345
+        else
346
+        {
347
+            return true;
348
+        }
349
+    }
350
+
351
+    /**
352
+     * Unbind du serveur ldap.
353
+     *
354
+     * @return	boolean					true or false
355
+     */
356
+    function unbind()
357
+    {
358
+        if (!$this->result=@ldap_unbind($this->connection))
359
+        {
360
+            return false;
361
+        } else {
362
+            return true;
363
+        }
364
+    }
365
+
366
+
367
+    /**
368
+     * Verification de la version du serveur ldap.
369
+     *
370
+     * @return	string					version
371
+     */
372
+    function getVersion()
373
+    {
374
+        $version = 0;
375
+        $version = @ldap_get_option($this->connection, LDAP_OPT_PROTOCOL_VERSION, $version);
376
+        return $version;
377
+    }
378
+
379
+    /**
380
+     * Change ldap protocol version to use.
381
+     *
382
+     * @return	boolean					version
383
+     */
384 384
     function setVersion()
385 385
     {
386
-		// LDAP_OPT_PROTOCOL_VERSION est une constante qui vaut 17
387
-		$ldapsetversion = ldap_set_option($this->connection, LDAP_OPT_PROTOCOL_VERSION, $this->ldapProtocolVersion);
388
-		return $ldapsetversion;
389
-	}
390
-
391
-	/**
392
-	 * changement du referrals.
393
-	 *
394
-	 * @return	boolean					referrals
395
-	 */
386
+        // LDAP_OPT_PROTOCOL_VERSION est une constante qui vaut 17
387
+        $ldapsetversion = ldap_set_option($this->connection, LDAP_OPT_PROTOCOL_VERSION, $this->ldapProtocolVersion);
388
+        return $ldapsetversion;
389
+    }
390
+
391
+    /**
392
+     * changement du referrals.
393
+     *
394
+     * @return	boolean					referrals
395
+     */
396 396
     function setReferrals()
397 397
     {
398
-		// LDAP_OPT_REFERRALS est une constante qui vaut ?
399
-		$ldapreferrals = ldap_set_option($this->connection, LDAP_OPT_REFERRALS, 0);
400
-		return $ldapreferrals;
401
-	}
402
-
403
-
404
-	/**
405
-	 * 	Add a LDAP entry
406
-	 *	Ldap object connect and bind must have been done
407
-	 *
408
-	 *	@param	string	$dn			DN entry key
409
-	 *	@param	array	$info		Attributes array
410
-	 *	@param	User		$user		Objet user that create
411
-	 *	@return	int					<0 if KO, >0 if OK
412
-	 */
413
-	function add($dn, $info, $user)
414
-	{
415
-		global $conf;
416
-
417
-		dol_syslog(get_class($this)."::add dn=".$dn." info=".join(',',$info));
418
-
419
-		// Check parameters
420
-		if (! $this->connection)
421
-		{
422
-			$this->error="NotConnected";
423
-			return -2;
424
-		}
425
-		if (! $this->bind)
426
-		{
427
-			$this->error="NotConnected";
428
-			return -3;
429
-		}
430
-
431
-		// Encode to LDAP page code
432
-		$dn=$this->convFromOutputCharset($dn,$this->ldapcharset);
433
-		foreach($info as $key => $val)
434
-		{
435
-			if (! is_array($val)) $info[$key]=$this->convFromOutputCharset($val,$this->ldapcharset);
436
-		}
437
-
438
-		$this->dump($dn,$info);
439
-
440
-		//print_r($info);
441
-		$result=@ldap_add($this->connection, $dn, $info);
442
-
443
-		if ($result)
444
-		{
445
-			dol_syslog(get_class($this)."::add successfull", LOG_DEBUG);
446
-			return 1;
447
-		}
448
-		else
449
-		{
450
-			$this->ldapErrorCode = @ldap_errno($this->connection);
451
-			$this->ldapErrorText = @ldap_error($this->connection);
452
-			$this->error=$this->ldapErrorCode." ".$this->ldapErrorText;
453
-			dol_syslog(get_class($this)."::add failed: ".$this->error, LOG_ERR);
454
-			return -1;
455
-		}
456
-	}
457
-
458
-	/**
459
-	 * 	Modify a LDAP entry
460
-	 *	Ldap object connect and bind must have been done
461
-	 *
462
-	 *	@param	string		$dn			DN entry key
463
-	 *	@param	array		$info		Attributes array
464
-	 *	@param	User			$user		Objet user that modify
465
-	 *	@return	int						<0 if KO, >0 if OK
466
-	 */
467
-	function modify($dn, $info, $user)
468
-	{
469
-		global $conf;
470
-
471
-		dol_syslog(get_class($this)."::modify dn=".$dn." info=".join(',',$info));
472
-
473
-		// Check parameters
474
-		if (! $this->connection)
475
-		{
476
-			$this->error="NotConnected";
477
-			return -2;
478
-		}
479
-		if (! $this->bind)
480
-		{
481
-			$this->error="NotConnected";
482
-			return -3;
483
-		}
484
-
485
-		// Encode to LDAP page code
486
-		$dn=$this->convFromOutputCharset($dn,$this->ldapcharset);
487
-		foreach($info as $key => $val)
488
-		{
489
-			if (! is_array($val)) $info[$key]=$this->convFromOutputCharset($val,$this->ldapcharset);
490
-		}
491
-
492
-		$this->dump($dn,$info);
493
-
494
-		//print_r($info);
495
-		$result=@ldap_modify($this->connection, $dn, $info);
496
-
497
-		if ($result)
498
-		{
499
-			dol_syslog(get_class($this)."::modify successfull", LOG_DEBUG);
500
-			return 1;
501
-		}
502
-		else
503
-		{
504
-			$this->error=@ldap_error($this->connection);
505
-			dol_syslog(get_class($this)."::modify failed: ".$this->error, LOG_ERR);
506
-			return -1;
507
-		}
508
-	}
509
-
510
-	/**
511
-	 * 	Rename a LDAP entry
512
-	 *	Ldap object connect and bind must have been done
513
-	 *
514
-	 *	@param	string		$dn				Old DN entry key (uid=qqq,ou=xxx,dc=aaa,dc=bbb) (before update)
515
-	 *	@param	string		$newrdn			New RDN entry key (uid=qqq)
516
-	 *	@param	string		$newparent		New parent (ou=xxx,dc=aaa,dc=bbb)
517
-	 *	@param	User			$user			Objet user that modify
518
-	 *	@param	bool			$deleteoldrdn	If true the old RDN value(s) is removed, else the old RDN value(s) is retained as non-distinguished values of the entry.
519
-	 *	@return	int							<0 if KO, >0 if OK
520
-	 */
521
-	function rename($dn, $newrdn, $newparent, $user, $deleteoldrdn = true)
522
-	{
523
-		global $conf;
524
-
525
-		dol_syslog(get_class($this)."::modify dn=".$dn." newrdn=".$newrdn." newparent=".$newparent." deleteoldrdn=".($deleteoldrdn?1:0));
526
-
527
-		// Check parameters
528
-		if (! $this->connection)
529
-		{
530
-			$this->error="NotConnected";
531
-			return -2;
532
-		}
533
-		if (! $this->bind)
534
-		{
535
-			$this->error="NotConnected";
536
-			return -3;
537
-		}
538
-
539
-		// Encode to LDAP page code
540
-		$dn=$this->convFromOutputCharset($dn,$this->ldapcharset);
541
-		$newrdn=$this->convFromOutputCharset($newrdn,$this->ldapcharset);
542
-		$newparent=$this->convFromOutputCharset($newparent,$this->ldapcharset);
543
-
544
-		//print_r($info);
545
-		$result=@ldap_rename($this->connection, $dn, $newrdn, $newparent, $deleteoldrdn);
546
-
547
-		if ($result)
548
-		{
549
-			dol_syslog(get_class($this)."::rename successfull", LOG_DEBUG);
550
-			return 1;
551
-		}
552
-		else
553
-		{
554
-			$this->error=@ldap_error($this->connection);
555
-			dol_syslog(get_class($this)."::rename failed: ".$this->error, LOG_ERR);
556
-			return -1;
557
-		}
558
-	}
559
-
560
-	/**
561
-	 *  Modify a LDAP entry (to use if dn != olddn)
562
-	 *	Ldap object connect and bind must have been done
563
-	 *
564
-	 *  @param	string	$dn			DN entry key
565
-	 *  @param	array	$info		Attributes array
566
-	 *  @param	User		$user		Objet user that update
567
-	 * 	@param	string	$olddn		Old DN entry key (before update)
568
-	 * 	@param	string	$newrdn		New RDN entry key (uid=qqq) (for ldap_rename)
569
-	 *	@param	string	$newparent	New parent (ou=xxx,dc=aaa,dc=bbb) (for ldap_rename)
570
-	 *	@return	int					<0 if KO, >0 if OK
571
-	 */
572
-	function update($dn, $info, $user, $olddn, $newrdn=false, $newparent=false)
573
-	{
574
-		global $conf;
575
-
576
-		dol_syslog(get_class($this)."::update dn=".$dn." olddn=".$olddn);
577
-
578
-		// Check parameters
579
-		if (! $this->connection)
580
-		{
581
-			$this->error="NotConnected";
582
-			return -2;
583
-		}
584
-		if (! $this->bind)
585
-		{
586
-			$this->error="NotConnected";
587
-			return -3;
588
-		}
589
-
590
-		if (! $olddn || $olddn != $dn)
591
-		{
592
-			if (! empty($olddn) && ! empty($newrdn) && ! empty($newparent) && $conf->global->LDAP_SERVER_PROTOCOLVERSION === '3')
593
-			{
594
-				// This function currently only works with LDAPv3
595
-				$result = $this->rename($olddn, $newrdn, $newparent, $user, true);
596
-			}
597
-			else
598
-			{
599
-				// If change we make is rename the key of LDAP record, we create new one and if ok, we delete old one.
600
-				$result = $this->add($dn, $info, $user);
601
-				if ($result > 0 && $olddn && $olddn != $dn) $result = $this->delete($olddn);	// If add fails, we do not try to delete old one
602
-			}
603
-		}
604
-		else
605
-		{
606
-			//$result = $this->delete($olddn);
607
-			$result = $this->add($dn, $info, $user);	// If record has been deleted from LDAP, we recreate it. We ignore error if it already exists.
608
-			$result = $this->modify($dn, $info, $user);	// We use add/modify instead of delete/add when olddn is received
609
-		}
610
-		if ($result <= 0)
611
-		{
612
-			$this->error = ldap_errno($this->connection)." ".ldap_error($this->connection)." ".$this->error;
613
-			dol_syslog(get_class($this)."::update ".$this->error,LOG_ERR);
614
-			//print_r($info);
615
-			return -1;
616
-		}
617
-		else
618
-		{
619
-			dol_syslog(get_class($this)."::update done successfully");
620
-			return 1;
621
-		}
622
-	}
623
-
624
-
625
-	/**
626
-	 * 	Delete a LDAP entry
627
-	 *	Ldap object connect and bind must have been done
628
-	 *
629
-	 *	@param	string	$dn			DN entry key
630
-	 *	@return	int					<0 if KO, >0 if OK
631
-	 */
632
-	function delete($dn)
633
-	{
634
-		global $conf;
635
-
636
-		dol_syslog(get_class($this)."::delete Delete LDAP entry dn=".$dn);
637
-
638
-		// Check parameters
639
-		if (! $this->connection)
640
-		{
641
-			$this->error="NotConnected";
642
-			return -2;
643
-		}
644
-		if (! $this->bind)
645
-		{
646
-			$this->error="NotConnected";
647
-			return -3;
648
-		}
649
-
650
-		// Encode to LDAP page code
651
-		$dn=$this->convFromOutputCharset($dn,$this->ldapcharset);
652
-
653
-		$result=@ldap_delete($this->connection, $dn);
654
-
655
-		if ($result) return 1;
656
-		return -1;
657
-	}
398
+        // LDAP_OPT_REFERRALS est une constante qui vaut ?
399
+        $ldapreferrals = ldap_set_option($this->connection, LDAP_OPT_REFERRALS, 0);
400
+        return $ldapreferrals;
401
+    }
402
+
403
+
404
+    /**
405
+     * 	Add a LDAP entry
406
+     *	Ldap object connect and bind must have been done
407
+     *
408
+     *	@param	string	$dn			DN entry key
409
+     *	@param	array	$info		Attributes array
410
+     *	@param	User		$user		Objet user that create
411
+     *	@return	int					<0 if KO, >0 if OK
412
+     */
413
+    function add($dn, $info, $user)
414
+    {
415
+        global $conf;
416
+
417
+        dol_syslog(get_class($this)."::add dn=".$dn." info=".join(',',$info));
418
+
419
+        // Check parameters
420
+        if (! $this->connection)
421
+        {
422
+            $this->error="NotConnected";
423
+            return -2;
424
+        }
425
+        if (! $this->bind)
426
+        {
427
+            $this->error="NotConnected";
428
+            return -3;
429
+        }
430
+
431
+        // Encode to LDAP page code
432
+        $dn=$this->convFromOutputCharset($dn,$this->ldapcharset);
433
+        foreach($info as $key => $val)
434
+        {
435
+            if (! is_array($val)) $info[$key]=$this->convFromOutputCharset($val,$this->ldapcharset);
436
+        }
437
+
438
+        $this->dump($dn,$info);
439
+
440
+        //print_r($info);
441
+        $result=@ldap_add($this->connection, $dn, $info);
442
+
443
+        if ($result)
444
+        {
445
+            dol_syslog(get_class($this)."::add successfull", LOG_DEBUG);
446
+            return 1;
447
+        }
448
+        else
449
+        {
450
+            $this->ldapErrorCode = @ldap_errno($this->connection);
451
+            $this->ldapErrorText = @ldap_error($this->connection);
452
+            $this->error=$this->ldapErrorCode." ".$this->ldapErrorText;
453
+            dol_syslog(get_class($this)."::add failed: ".$this->error, LOG_ERR);
454
+            return -1;
455
+        }
456
+    }
457
+
458
+    /**
459
+     * 	Modify a LDAP entry
460
+     *	Ldap object connect and bind must have been done
461
+     *
462
+     *	@param	string		$dn			DN entry key
463
+     *	@param	array		$info		Attributes array
464
+     *	@param	User			$user		Objet user that modify
465
+     *	@return	int						<0 if KO, >0 if OK
466
+     */
467
+    function modify($dn, $info, $user)
468
+    {
469
+        global $conf;
470
+
471
+        dol_syslog(get_class($this)."::modify dn=".$dn." info=".join(',',$info));
472
+
473
+        // Check parameters
474
+        if (! $this->connection)
475
+        {
476
+            $this->error="NotConnected";
477
+            return -2;
478
+        }
479
+        if (! $this->bind)
480
+        {
481
+            $this->error="NotConnected";
482
+            return -3;
483
+        }
484
+
485
+        // Encode to LDAP page code
486
+        $dn=$this->convFromOutputCharset($dn,$this->ldapcharset);
487
+        foreach($info as $key => $val)
488
+        {
489
+            if (! is_array($val)) $info[$key]=$this->convFromOutputCharset($val,$this->ldapcharset);
490
+        }
491
+
492
+        $this->dump($dn,$info);
493
+
494
+        //print_r($info);
495
+        $result=@ldap_modify($this->connection, $dn, $info);
496
+
497
+        if ($result)
498
+        {
499
+            dol_syslog(get_class($this)."::modify successfull", LOG_DEBUG);
500
+            return 1;
501
+        }
502
+        else
503
+        {
504
+            $this->error=@ldap_error($this->connection);
505
+            dol_syslog(get_class($this)."::modify failed: ".$this->error, LOG_ERR);
506
+            return -1;
507
+        }
508
+    }
509
+
510
+    /**
511
+     * 	Rename a LDAP entry
512
+     *	Ldap object connect and bind must have been done
513
+     *
514
+     *	@param	string		$dn				Old DN entry key (uid=qqq,ou=xxx,dc=aaa,dc=bbb) (before update)
515
+     *	@param	string		$newrdn			New RDN entry key (uid=qqq)
516
+     *	@param	string		$newparent		New parent (ou=xxx,dc=aaa,dc=bbb)
517
+     *	@param	User			$user			Objet user that modify
518
+     *	@param	bool			$deleteoldrdn	If true the old RDN value(s) is removed, else the old RDN value(s) is retained as non-distinguished values of the entry.
519
+     *	@return	int							<0 if KO, >0 if OK
520
+     */
521
+    function rename($dn, $newrdn, $newparent, $user, $deleteoldrdn = true)
522
+    {
523
+        global $conf;
524
+
525
+        dol_syslog(get_class($this)."::modify dn=".$dn." newrdn=".$newrdn." newparent=".$newparent." deleteoldrdn=".($deleteoldrdn?1:0));
526
+
527
+        // Check parameters
528
+        if (! $this->connection)
529
+        {
530
+            $this->error="NotConnected";
531
+            return -2;
532
+        }
533
+        if (! $this->bind)
534
+        {
535
+            $this->error="NotConnected";
536
+            return -3;
537
+        }
538
+
539
+        // Encode to LDAP page code
540
+        $dn=$this->convFromOutputCharset($dn,$this->ldapcharset);
541
+        $newrdn=$this->convFromOutputCharset($newrdn,$this->ldapcharset);
542
+        $newparent=$this->convFromOutputCharset($newparent,$this->ldapcharset);
543
+
544
+        //print_r($info);
545
+        $result=@ldap_rename($this->connection, $dn, $newrdn, $newparent, $deleteoldrdn);
546
+
547
+        if ($result)
548
+        {
549
+            dol_syslog(get_class($this)."::rename successfull", LOG_DEBUG);
550
+            return 1;
551
+        }
552
+        else
553
+        {
554
+            $this->error=@ldap_error($this->connection);
555
+            dol_syslog(get_class($this)."::rename failed: ".$this->error, LOG_ERR);
556
+            return -1;
557
+        }
558
+    }
559
+
560
+    /**
561
+     *  Modify a LDAP entry (to use if dn != olddn)
562
+     *	Ldap object connect and bind must have been done
563
+     *
564
+     *  @param	string	$dn			DN entry key
565
+     *  @param	array	$info		Attributes array
566
+     *  @param	User		$user		Objet user that update
567
+     * 	@param	string	$olddn		Old DN entry key (before update)
568
+     * 	@param	string	$newrdn		New RDN entry key (uid=qqq) (for ldap_rename)
569
+     *	@param	string	$newparent	New parent (ou=xxx,dc=aaa,dc=bbb) (for ldap_rename)
570
+     *	@return	int					<0 if KO, >0 if OK
571
+     */
572
+    function update($dn, $info, $user, $olddn, $newrdn=false, $newparent=false)
573
+    {
574
+        global $conf;
575
+
576
+        dol_syslog(get_class($this)."::update dn=".$dn." olddn=".$olddn);
577
+
578
+        // Check parameters
579
+        if (! $this->connection)
580
+        {
581
+            $this->error="NotConnected";
582
+            return -2;
583
+        }
584
+        if (! $this->bind)
585
+        {
586
+            $this->error="NotConnected";
587
+            return -3;
588
+        }
589
+
590
+        if (! $olddn || $olddn != $dn)
591
+        {
592
+            if (! empty($olddn) && ! empty($newrdn) && ! empty($newparent) && $conf->global->LDAP_SERVER_PROTOCOLVERSION === '3')
593
+            {
594
+                // This function currently only works with LDAPv3
595
+                $result = $this->rename($olddn, $newrdn, $newparent, $user, true);
596
+            }
597
+            else
598
+            {
599
+                // If change we make is rename the key of LDAP record, we create new one and if ok, we delete old one.
600
+                $result = $this->add($dn, $info, $user);
601
+                if ($result > 0 && $olddn && $olddn != $dn) $result = $this->delete($olddn);	// If add fails, we do not try to delete old one
602
+            }
603
+        }
604
+        else
605
+        {
606
+            //$result = $this->delete($olddn);
607
+            $result = $this->add($dn, $info, $user);	// If record has been deleted from LDAP, we recreate it. We ignore error if it already exists.
608
+            $result = $this->modify($dn, $info, $user);	// We use add/modify instead of delete/add when olddn is received
609
+        }
610
+        if ($result <= 0)
611
+        {
612
+            $this->error = ldap_errno($this->connection)." ".ldap_error($this->connection)." ".$this->error;
613
+            dol_syslog(get_class($this)."::update ".$this->error,LOG_ERR);
614
+            //print_r($info);
615
+            return -1;
616
+        }
617
+        else
618
+        {
619
+            dol_syslog(get_class($this)."::update done successfully");
620
+            return 1;
621
+        }
622
+    }
623
+
624
+
625
+    /**
626
+     * 	Delete a LDAP entry
627
+     *	Ldap object connect and bind must have been done
628
+     *
629
+     *	@param	string	$dn			DN entry key
630
+     *	@return	int					<0 if KO, >0 if OK
631
+     */
632
+    function delete($dn)
633
+    {
634
+        global $conf;
635
+
636
+        dol_syslog(get_class($this)."::delete Delete LDAP entry dn=".$dn);
637
+
638
+        // Check parameters
639
+        if (! $this->connection)
640
+        {
641
+            $this->error="NotConnected";
642
+            return -2;
643
+        }
644
+        if (! $this->bind)
645
+        {
646
+            $this->error="NotConnected";
647
+            return -3;
648
+        }
649
+
650
+        // Encode to LDAP page code
651
+        $dn=$this->convFromOutputCharset($dn,$this->ldapcharset);
652
+
653
+        $result=@ldap_delete($this->connection, $dn);
654
+
655
+        if ($result) return 1;
656
+        return -1;
657
+    }
658 658
 
659 659
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
660
-	/**
661
-	 * 	Build a LDAP message
662
-	 *
663
-	 *	@param	string		$dn			DN entry key
664
-	 *	@param	array		$info		Attributes array
665
-	 *	@return	string					Content of file
666
-	 */
667
-	function dump_content($dn, $info)
668
-	{
660
+    /**
661
+     * 	Build a LDAP message
662
+     *
663
+     *	@param	string		$dn			DN entry key
664
+     *	@param	array		$info		Attributes array
665
+     *	@return	string					Content of file
666
+     */
667
+    function dump_content($dn, $info)
668
+    {
669 669
         // phpcs:enable
670
-		$content='';
671
-
672
-		// Create file content
673
-		if (preg_match('/^ldap/',$this->server[0]))
674
-		{
675
-			$target="-H ".join(',',$this->server);
676
-		}
677
-		else
678
-		{
679
-			$target="-h ".join(',',$this->server)." -p ".$this->serverPort;
680
-		}
681
-		$content.="# ldapadd $target -c -v -D ".$this->searchUser." -W -f ldapinput.in\n";
682
-		$content.="# ldapmodify $target -c -v -D ".$this->searchUser." -W -f ldapinput.in\n";
683
-		$content.="# ldapdelete $target -c -v -D ".$this->searchUser." -W -f ldapinput.in\n";
684
-		if (in_array('localhost',$this->server)) $content.="# If commands fails to connect, try without -h and -p\n";
685
-		$content.="dn: ".$dn."\n";
686
-		foreach($info as $key => $value)
687
-		{
688
-			if (! is_array($value))
689
-			{
690
-				$content.="$key: $value\n";
691
-			}
692
-			else
693
-			{
694
-				foreach($value as $valuekey => $valuevalue)
695
-				{
696
-					$content.="$key: $valuevalue\n";
697
-				}
698
-			}
699
-		}
700
-		return $content;
701
-	}
702
-
703
-	/**
704
-	 * 	Dump a LDAP message to ldapinput.in file
705
-	 *
706
-	 *	@param	string		$dn			DN entry key
707
-	 *	@param	array		$info		Attributes array
708
-	 *	@return	int						<0 if KO, >0 if OK
709
-	 */
710
-	function dump($dn, $info)
711
-	{
712
-		global $conf;
713
-
714
-		// Create content
715
-		$content=$this->dump_content($dn, $info);
716
-
717
-		//Create file
718
-		$result=dol_mkdir($conf->ldap->dir_temp);
719
-
720
-		$outputfile=$conf->ldap->dir_temp.'/ldapinput.in';
721
-		$fp=fopen($outputfile,"w");
722
-		if ($fp)
723
-		{
724
-			fputs($fp, $content);
725
-			fclose($fp);
726
-			if (! empty($conf->global->MAIN_UMASK))
727
-			@chmod($outputfile, octdec($conf->global->MAIN_UMASK));
728
-			return 1;
729
-		}
730
-		else
731
-		{
732
-			return -1;
733
-		}
734
-	}
735
-
736
-	/**
737
-	 * Ping a server before ldap_connect for avoid waiting
738
-	 *
739
-	 * @param string		$host		Server host or address
740
-	 * @param int		$port		Server port (default 389)
741
-	 * @param int		$timeout		Timeout in second (default 1s)
742
-	 * @return boolean				true or false
743
-	 */
744
-	function serverPing($host, $port=389, $timeout=1)
745
-	{
746
-		// Replace ldaps:// by ssl://
747
-		if (preg_match('/^ldaps:\/\/([^\/]+)\/?$/',$host, $regs)) {
748
-			$host = 'ssl://'.$regs[1];
749
-		}
750
-		// Remove ldap://
751
-		if (preg_match('/^ldap:\/\/([^\/]+)\/?$/',$host, $regs)) {
752
-			$host = $regs[1];
753
-		}
754
-		$op = @fsockopen($host, $port, $errno, $errstr, $timeout);
755
-		if (!$op) return false; //DC is N/A
756
-		else {
757
-			fclose($op); //explicitly close open socket connection
758
-			return true; //DC is up & running, we can safely connect with ldap_connect
759
-		}
760
-	}
761
-
762
-
763
-	// Attribute methods -----------------------------------------------------
764
-
765
-	/**
766
-	 * 	Add a LDAP attribute in entry
767
-	 *	Ldap object connect and bind must have been done
768
-	 *
769
-	 *	@param	string		$dn			DN entry key
770
-	 *	@param	array		$info		Attributes array
771
-	 *	@param	User		$user		Objet user that create
772
-	 *	@return	int						<0 if KO, >0 if OK
773
-	 */
774
-	function addAttribute($dn, $info, $user)
775
-	{
776
-		global $conf;
777
-
778
-		dol_syslog(get_class($this)."::addAttribute dn=".$dn." info=".join(',',$info));
779
-
780
-		// Check parameters
781
-		if (! $this->connection)
782
-		{
783
-			$this->error="NotConnected";
784
-			return -2;
785
-		}
786
-		if (! $this->bind)
787
-		{
788
-			$this->error="NotConnected";
789
-			return -3;
790
-		}
791
-
792
-		// Encode to LDAP page code
793
-		$dn=$this->convFromOutputCharset($dn,$this->ldapcharset);
794
-		foreach($info as $key => $val)
795
-		{
796
-			if (! is_array($val)) $info[$key]=$this->convFromOutputCharset($val,$this->ldapcharset);
797
-		}
798
-
799
-		$this->dump($dn,$info);
800
-
801
-		//print_r($info);
802
-		$result=@ldap_mod_add($this->connection, $dn, $info);
803
-
804
-		if ($result)
805
-		{
806
-			dol_syslog(get_class($this)."::add_attribute successfull", LOG_DEBUG);
807
-			return 1;
808
-		}
809
-		else
810
-		{
811
-			$this->error=@ldap_error($this->connection);
812
-			dol_syslog(get_class($this)."::add_attribute failed: ".$this->error, LOG_ERR);
813
-			return -1;
814
-		}
815
-	}
816
-
817
-	/**
818
-	 * 	Update a LDAP attribute in entry
819
-	 *	Ldap object connect and bind must have been done
820
-	 *
821
-	 *	@param	string		$dn			DN entry key
822
-	 *	@param	array		$info		Attributes array
823
-	 *	@param	User		$user		Objet user that create
824
-	 *	@return	int						<0 if KO, >0 if OK
825
-	 */
826
-	function updateAttribute($dn, $info, $user)
827
-	{
828
-		global $conf;
829
-
830
-		dol_syslog(get_class($this)."::updateAttribute dn=".$dn." info=".join(',',$info));
831
-
832
-		// Check parameters
833
-		if (! $this->connection)
834
-		{
835
-			$this->error="NotConnected";
836
-			return -2;
837
-		}
838
-		if (! $this->bind)
839
-		{
840
-			$this->error="NotConnected";
841
-			return -3;
842
-		}
843
-
844
-		// Encode to LDAP page code
845
-		$dn=$this->convFromOutputCharset($dn,$this->ldapcharset);
846
-		foreach($info as $key => $val)
847
-		{
848
-			if (! is_array($val)) $info[$key]=$this->convFromOutputCharset($val,$this->ldapcharset);
849
-		}
850
-
851
-		$this->dump($dn,$info);
852
-
853
-		//print_r($info);
854
-		$result=@ldap_mod_replace($this->connection, $dn, $info);
855
-
856
-		if ($result)
857
-		{
858
-			dol_syslog(get_class($this)."::updateAttribute successfull", LOG_DEBUG);
859
-			return 1;
860
-		}
861
-		else
862
-		{
863
-			$this->error=@ldap_error($this->connection);
864
-			dol_syslog(get_class($this)."::updateAttribute failed: ".$this->error, LOG_ERR);
865
-			return -1;
866
-		}
867
-	}
868
-
869
-	/**
870
-	 * 	Delete a LDAP attribute in entry
871
-	 *	Ldap object connect and bind must have been done
872
-	 *
873
-	 *	@param	string		$dn			DN entry key
874
-	 *	@param	array		$info		Attributes array
875
-	 *	@param	User		$user		Objet user that create
876
-	 *	@return	int						<0 if KO, >0 if OK
877
-	 */
878
-	function deleteAttribute($dn, $info, $user)
879
-	{
880
-		global $conf;
881
-
882
-		dol_syslog(get_class($this)."::deleteAttribute dn=".$dn." info=".join(',',$info));
883
-
884
-		// Check parameters
885
-		if (! $this->connection)
886
-		{
887
-			$this->error="NotConnected";
888
-			return -2;
889
-		}
890
-		if (! $this->bind)
891
-		{
892
-			$this->error="NotConnected";
893
-			return -3;
894
-		}
895
-
896
-		// Encode to LDAP page code
897
-		$dn=$this->convFromOutputCharset($dn,$this->ldapcharset);
898
-		foreach($info as $key => $val)
899
-		{
900
-			if (! is_array($val)) $info[$key]=$this->convFromOutputCharset($val,$this->ldapcharset);
901
-		}
902
-
903
-		$this->dump($dn,$info);
904
-
905
-		//print_r($info);
906
-		$result=@ldap_mod_del($this->connection, $dn, $info);
907
-
908
-		if ($result)
909
-		{
910
-			dol_syslog(get_class($this)."::deleteAttribute successfull", LOG_DEBUG);
911
-			return 1;
912
-		}
913
-		else
914
-		{
915
-			$this->error=@ldap_error($this->connection);
916
-			dol_syslog(get_class($this)."::deleteAttribute failed: ".$this->error, LOG_ERR);
917
-			return -1;
918
-		}
919
-	}
920
-
921
-	/**
922
-	 *  Returns an array containing attributes and values for first record
923
-	 *
924
-	 *	@param	string	$dn			DN entry key
925
-	 *	@param	string	$filter		Filter
926
-	 *	@return	int|array			<0 or false if KO, array if OK
927
-	 */
928
-	function getAttribute($dn,$filter)
929
-	{
930
-		// Check parameters
931
-		if (! $this->connection)
932
-		{
933
-			$this->error="NotConnected";
934
-			return -2;
935
-		}
936
-		if (! $this->bind)
937
-		{
938
-			$this->error="NotConnected";
939
-			return -3;
940
-		}
941
-
942
-		$search = ldap_search($this->connection,$dn,$filter);
943
-
944
-		// Only one entry should ever be returned
945
-		$entry = ldap_first_entry($this->connection, $search);
946
-
947
-		if (!$entry)
948
-		{
949
-			$this->ldapErrorCode = -1;
950
-			$this->ldapErrorText = "Couldn't find entry";
951
-			return 0;  // Couldn't find entry...
952
-		}
953
-
954
-		// Get values
955
-		if (! $values = ldap_get_attributes($this->connection, $entry))
956
-		{
957
-			$this->ldapErrorCode = ldap_errno($this->connection);
958
-			$this->ldapErrorText = ldap_error($this->connection);
959
-			return 0; // No matching attributes
960
-		}
961
-
962
-		// Return an array containing the attributes.
963
-		return $values;
964
-	}
965
-
966
-	/**
967
-	 *  Returns an array containing values for an attribute and for first record matching filterrecord
968
-	 *
969
-	 * 	@param	string	$filterrecord		Record
970
-	 * 	@param	string	$attribute			Attributes
971
-	 * 	@return void
972
-	 */
973
-	function getAttributeValues($filterrecord,$attribute)
974
-	{
975
-		$attributes=array();
976
-		$attributes[0] = $attribute;
977
-
978
-		// We need to search for this user in order to get their entry.
979
-		$this->result = @ldap_search($this->connection,$this->people,$filterrecord,$attributes);
980
-
981
-		// Pourquoi cette ligne ?
982
-		//$info = ldap_get_entries($this->connection, $this->result);
983
-
984
-		// Only one entry should ever be returned (no user will have the same uid)
985
-		$entry = ldap_first_entry($this->connection, $this->result);
986
-
987
-		if (!$entry)
988
-		{
989
-			$this->ldapErrorCode = -1;
990
-			$this->ldapErrorText = "Couldn't find user";
991
-			return false;  // Couldn't find the user...
992
-		}
993
-
994
-		// Get values
995
-		if (! $values = @ldap_get_values($this->connection, $entry, $attribute))
996
-		{
997
-			$this->ldapErrorCode = ldap_errno($this->connection);
998
-			$this->ldapErrorText = ldap_error($this->connection);
999
-			return false; // No matching attributes
1000
-		}
1001
-
1002
-		// Return an array containing the attributes.
1003
-		return $values;
1004
-	}
1005
-
1006
-	/**
1007
-	 * 	Returns an array containing a details or list of LDAP record(s)
1008
-	 * 	ldapsearch -LLLx -hlocalhost -Dcn=admin,dc=parinux,dc=org -w password -b "ou=adherents,ou=people,dc=parinux,dc=org" userPassword
1009
-	 *
1010
-	 *	@param	string	$search			 	Value of fiel to search, '*' for all. Not used if $activefilter is set.
1011
-	 *	@param	string	$userDn			 	DN (Ex: ou=adherents,ou=people,dc=parinux,dc=org)
1012
-	 *	@param	string	$useridentifier 	Name of key field (Ex: uid)
1013
-	 *	@param	array	$attributeArray 	Array of fields required. Note this array must also contains field $useridentifier (Ex: sn,userPassword)
1014
-	 *	@param	int		$activefilter		'1' or 'user'=use field this->filter as filter instead of parameter $search, 'member'=use field this->filtermember as filter
1015
-	 *	@param	array	$attributeAsArray 	Array of fields wanted as an array not a string
1016
-	 *	@return	array						Array of [id_record][ldap_field]=value
1017
-	 */
1018
-	function getRecords($search, $userDn, $useridentifier, $attributeArray, $activefilter=0, $attributeAsArray=array())
1019
-	{
1020
-		$fulllist=array();
1021
-
1022
-		dol_syslog(get_class($this)."::getRecords search=".$search." userDn=".$userDn." useridentifier=".$useridentifier." attributeArray=array(".join(',',$attributeArray).") activefilter=".$activefilter);
1023
-
1024
-		// if the directory is AD, then bind first with the search user first
1025
-		if ($this->serverType == "activedirectory")
1026
-		{
1027
-			$this->bindauth($this->searchUser, $this->searchPassword);
1028
-			dol_syslog(get_class($this)."::bindauth serverType=activedirectory searchUser=".$this->searchUser);
1029
-		}
1030
-
1031
-		// Define filter
1032
-		if (! empty($activefilter))
1033
-		{
1034
-			if (((string) $activefilter == '1' || (string) $activefilter == 'user') && $this->filter)
1035
-			{
1036
-				$filter = '('.$this->filter.')';
1037
-			}
1038
-			elseif (((string) $activefilter == 'member') && $this->filter)
1039
-			{
1040
-				$filter = '('.$this->filtermember.')';
1041
-			}
1042
-			else	// If this->filter is empty, make fiter on * (all)
1043
-			{
1044
-				$filter = '('.$useridentifier.'=*)';
1045
-			}
1046
-		}
1047
-		else
1048
-		{
1049
-			$filter = '('.$useridentifier.'='.$search.')';
1050
-		}
1051
-
1052
-		if (is_array($attributeArray))
1053
-		{
1054
-			// Return list with required fields
1055
-			$attributeArray=array_values($attributeArray);	// This is to force to have index reordered from 0 (not make ldap_search fails)
1056
-			dol_syslog(get_class($this)."::getRecords connection=".$this->connection." userDn=".$userDn." filter=".$filter. " attributeArray=(".join(',',$attributeArray).")");
1057
-			//var_dump($attributeArray);
1058
-			$this->result = @ldap_search($this->connection, $userDn, $filter, $attributeArray);
1059
-		}
1060
-		else
1061
-		{
1062
-			// Return list with fields selected by default
1063
-			dol_syslog(get_class($this)."::getRecords connection=".$this->connection." userDn=".$userDn." filter=".$filter);
1064
-			$this->result = @ldap_search($this->connection, $userDn, $filter);
1065
-		}
1066
-		if (!$this->result)
1067
-		{
1068
-			$this->error = 'LDAP search failed: '.ldap_errno($this->connection)." ".ldap_error($this->connection);
1069
-			return -1;
1070
-		}
1071
-
1072
-		$info = @ldap_get_entries($this->connection, $this->result);
1073
-
1074
-		// Warning: Dans info, les noms d'attributs sont en minuscule meme si passe
1075
-		// a ldap_search en majuscule !!!
1076
-		//print_r($info);
1077
-
1078
-		for ($i = 0; $i < $info["count"]; $i++)
1079
-		{
1080
-			$recordid=$this->convToOutputCharset($info[$i][$useridentifier][0],$this->ldapcharset);
1081
-			if ($recordid)
1082
-			{
1083
-				//print "Found record with key $useridentifier=".$recordid."<br>\n";
1084
-				$fulllist[$recordid][$useridentifier]=$recordid;
1085
-
1086
-				// Add to the array for each attribute in my list
1087
-				$num = count($attributeArray);
1088
-				for ($j = 0; $j < $num; $j++)
1089
-				{
1090
-					$keyattributelower=strtolower($attributeArray[$j]);
1091
-					//print " Param ".$attributeArray[$j]."=".$info[$i][$keyattributelower][0]."<br>\n";
1092
-
1093
-					//permet de recuperer le SID avec Active Directory
1094
-					if ($this->serverType == "activedirectory" && $keyattributelower == "objectsid")
1095
-					{
1096
-						$objectsid = $this->getObjectSid($recordid);
1097
-						$fulllist[$recordid][$attributeArray[$j]]    = $objectsid;
1098
-					}
1099
-					else
1100
-					{
1101
-						if(in_array($attributeArray[$j], $attributeAsArray) && is_array($info[$i][$keyattributelower])) {
1102
-							$valueTab = array();
1103
-							foreach($info[$i][$keyattributelower] as $key => $value) {
1104
-								$valueTab[$key] = $this->convToOutputCharset($value,$this->ldapcharset);
1105
-							}
1106
-							$fulllist[$recordid][$attributeArray[$j]] = $valueTab;
1107
-						} else {
1108
-							$fulllist[$recordid][$attributeArray[$j]] = $this->convToOutputCharset($info[$i][$keyattributelower][0],$this->ldapcharset);
1109
-						}
1110
-					}
1111
-				}
1112
-			}
1113
-		}
1114
-
1115
-		asort($fulllist);
1116
-		return $fulllist;
1117
-	}
1118
-
1119
-	/**
1120
-	 *  Converts a little-endian hex-number to one, that 'hexdec' can convert
1121
-	 *	Required by Active Directory
1122
-	 *
1123
-	 *	@param	string		$hex			Hex value
1124
-	 *	@return	string						Little endian
1125
-	 */
1126
-	function littleEndian($hex)
1127
-	{
1128
-		for ($x=dol_strlen($hex)-2; $x >= 0; $x=$x-2) {
1129
-			$result .= substr($hex,$x,2);
1130
-		}
1131
-		return $result;
1132
-	}
1133
-
1134
-
1135
-	/**
1136
-	 *  Recupere le SID de l'utilisateur
1137
-	 *	Required by Active Directory
1138
-	 *
1139
-	 * 	@param	string		$ldapUser		Login de l'utilisateur
1140
-	 * 	@return	string						Sid
1141
-	 */
1142
-	function getObjectSid($ldapUser)
1143
-	{
1144
-		$criteria =  '('.$this->getUserIdentifier().'='.$ldapUser.')';
1145
-		$justthese = array("objectsid");
1146
-
1147
-		// if the directory is AD, then bind first with the search user first
1148
-		if ($this->serverType == "activedirectory")
1149
-		{
1150
-			$this->bindauth($this->searchUser, $this->searchPassword);
1151
-		}
1152
-
1153
-		$i = 0;
1154
-		$searchDN = $this->people;
1155
-
1156
-		while ($i <= 2)
1157
-		{
1158
-			$ldapSearchResult = @ldap_search($this->connection, $searchDN, $criteria, $justthese);
1159
-
1160
-			if (!$ldapSearchResult)
1161
-			{
1162
-				$this->error = ldap_errno($this->connection)." ".ldap_error($this->connection);
1163
-				return -1;
1164
-			}
1165
-
1166
-			$entry = ldap_first_entry($this->connection, $ldapSearchResult);
1167
-
1168
-			if (!$entry)
1169
-			{
1170
-				// Si pas de resultat on cherche dans le domaine
1171
-				$searchDN = $this->domain;
1172
-				$i++;
1173
-			}
1174
-			else
1175
-			{
1176
-				$i++;
1177
-				$i++;
1178
-			}
1179
-		}
1180
-
1181
-		if ($entry)
1182
-		{
1183
-			$ldapBinary = ldap_get_values_len($this->connection, $entry, "objectsid");
1184
-			$SIDText = $this->binSIDtoText($ldapBinary[0]);
1185
-			return $SIDText;
1186
-		}
1187
-		else
1188
-		{
1189
-			$this->error = ldap_errno($this->connection)." ".ldap_error($this->connection);
1190
-			return '?';
1191
-		}
1192
-	}
1193
-
1194
-	/**
1195
-	 * Returns the textual SID
1196
-	 * Indispensable pour Active Directory
1197
-	 *
1198
-	 * @param	string	$binsid		Binary SID
1199
-	 * @return	string				Textual SID
1200
-	 */
1201
-	function binSIDtoText($binsid)
1202
-	{
1203
-		$hex_sid=bin2hex($binsid);
1204
-		$rev = hexdec(substr($hex_sid,0,2));          // Get revision-part of SID
1205
-		$subcount = hexdec(substr($hex_sid,2,2));    // Get count of sub-auth entries
1206
-		$auth = hexdec(substr($hex_sid,4,12));      // SECURITY_NT_AUTHORITY
1207
-		$result = "$rev-$auth";
1208
-		for ($x=0;$x < $subcount; $x++)
1209
-		{
1210
-			$result .= "-".hexdec($this->littleEndian(substr($hex_sid,16+($x*8),8)));  // get all SECURITY_NT_AUTHORITY
1211
-		}
1212
-		return $result;
1213
-	}
1214
-
1215
-
1216
-	/**
1217
-	 * 	Fonction de recherche avec filtre
1218
-	 *	this->connection doit etre defini donc la methode bind ou bindauth doit avoir deja ete appelee
1219
-	 *	Ne pas utiliser pour recherche d'une liste donnee de proprietes
1220
-	 *	car conflit majuscule-minuscule. A n'utiliser que pour les pages
1221
-	 *	'Fiche LDAP' qui affiche champ lisibles par defaut.
1222
-	 *
1223
-	 * 	@param	string		$checkDn		DN de recherche (Ex: ou=users,cn=my-domain,cn=com)
1224
-	 * 	@param 	string		$filter			Search filter (ex: (sn=nom_personne) )
1225
-	 *	@return	array|int					Array with answers (key lowercased - value)
1226
-	 */
1227
-	function search($checkDn, $filter)
1228
-	{
1229
-		dol_syslog(get_class($this)."::search checkDn=".$checkDn." filter=".$filter);
1230
-
1231
-		$checkDn=$this->convFromOutputCharset($checkDn,$this->ldapcharset);
1232
-		$filter=$this->convFromOutputCharset($filter,$this->ldapcharset);
1233
-
1234
-		// if the directory is AD, then bind first with the search user first
1235
-		if ($this->serverType == "activedirectory") {
1236
-			$this->bindauth($this->searchUser, $this->searchPassword);
1237
-		}
1238
-
1239
-		$this->result = @ldap_search($this->connection, $checkDn, $filter);
1240
-
1241
-		$result = @ldap_get_entries($this->connection, $this->result);
1242
-		if (! $result)
1243
-		{
1244
-			$this->error = ldap_errno($this->connection)." ".ldap_error($this->connection);
1245
-			return -1;
1246
-		}
1247
-		else
1248
-		{
1249
-			ldap_free_result($this->result);
1250
-			return $result;
1251
-		}
1252
-	}
1253
-
1254
-
1255
-	/**
1256
-	 * 		Load all attribute of a LDAP user
1257
-	 *
1258
-	 * 		@param	User	$user		User to search for. Not used if a filter is provided.
1259
-	 *      @param  string	$filter		Filter for search. Must start with &.
1260
-	 *                       	       	Examples: &(objectClass=inetOrgPerson) &(objectClass=user)(objectCategory=person) &(isMemberOf=cn=Sales,ou=Groups,dc=opencsi,dc=com)
1261
-	 *		@return	int					>0 if OK, <0 if KO
1262
-	 */
1263
-	function fetch($user,$filter)
1264
-	{
1265
-		// Perform the search and get the entry handles
1266
-
1267
-		// if the directory is AD, then bind first with the search user first
1268
-		if ($this->serverType == "activedirectory") {
1269
-			$this->bindauth($this->searchUser, $this->searchPassword);
1270
-		}
1271
-
1272
-		$searchDN = $this->people;    // TODO Why searching in people then domain ?
1273
-
1274
-		$result = '';
1275
-		$i=0;
1276
-		while ($i <= 2)
1277
-		{
1278
-			dol_syslog(get_class($this)."::fetch search with searchDN=".$searchDN." filter=".$filter);
1279
-			$this->result = @ldap_search($this->connection, $searchDN, $filter);
1280
-			if ($this->result)
1281
-			{
1282
-				$result = @ldap_get_entries($this->connection, $this->result);
1283
-				if ($result['count'] > 0) dol_syslog('Ldap::fetch search found '.$result['count'].' records');
1284
-				else dol_syslog('Ldap::fetch search returns but found no records');
1285
-				//var_dump($result);exit;
1286
-			}
1287
-			else
1288
-			{
1289
-				$this->error = ldap_errno($this->connection)." ".ldap_error($this->connection);
1290
-				dol_syslog(get_class($this)."::fetch search fails");
1291
-				return -1;
1292
-			}
1293
-
1294
-			if (! $result)
1295
-			{
1296
-				// Si pas de resultat on cherche dans le domaine
1297
-				$searchDN = $this->domain;
1298
-				$i++;
1299
-			}
1300
-			else
1301
-			{
1302
-				break;
1303
-			}
1304
-		}
1305
-
1306
-		if (! $result)
1307
-		{
1308
-			$this->error = ldap_errno($this->connection)." ".ldap_error($this->connection);
1309
-			return -1;
1310
-		}
1311
-		else
1312
-		{
1313
-			$this->name       = $this->convToOutputCharset($result[0][$this->attr_name][0],$this->ldapcharset);
1314
-			$this->firstname  = $this->convToOutputCharset($result[0][$this->attr_firstname][0],$this->ldapcharset);
1315
-			$this->login      = $this->convToOutputCharset($result[0][$this->attr_login][0],$this->ldapcharset);
1316
-			$this->phone      = $this->convToOutputCharset($result[0][$this->attr_phone][0],$this->ldapcharset);
1317
-			$this->skype      = $this->convToOutputCharset($result[0][$this->attr_skype][0],$this->ldapcharset);
1318
-			$this->fax        = $this->convToOutputCharset($result[0][$this->attr_fax][0],$this->ldapcharset);
1319
-			$this->mail       = $this->convToOutputCharset($result[0][$this->attr_mail][0],$this->ldapcharset);
1320
-			$this->mobile     = $this->convToOutputCharset($result[0][$this->attr_mobile][0],$this->ldapcharset);
1321
-
1322
-			$this->uacf       = $this->parseUACF($this->convToOutputCharset($result[0]["useraccountcontrol"][0],$this->ldapcharset));
1323
-			if (isset($result[0]["pwdlastset"][0]))	// If expiration on password exists
1324
-			{
1325
-				$this->pwdlastset = ($result[0]["pwdlastset"][0] != 0)?$this->convert_time($this->convToOutputCharset($result[0]["pwdlastset"][0],$this->ldapcharset)):0;
1326
-			}
1327
-			else
1328
-			{
1329
-				$this->pwdlastset = -1;
1330
-			}
1331
-			if (!$this->name && !$this->login) $this->pwdlastset = -1;
1332
-			$this->badpwdtime = $this->convert_time($this->convToOutputCharset($result[0]["badpasswordtime"][0],$this->ldapcharset));
1333
-
1334
-			// FQDN domain
1335
-			$domain = str_replace('dc=','',$this->domain);
1336
-			$domain = str_replace(',','.',$domain);
1337
-			$this->domainFQDN = $domain;
1338
-
1339
-			// Set ldapUserDn (each user can have a different dn)
1340
-			//var_dump($result[0]);exit;
1341
-			$this->ldapUserDN=$result[0]['dn'];
1342
-
1343
-			ldap_free_result($this->result);
1344
-			return 1;
1345
-		}
1346
-	}
1347
-
1348
-
1349
-	// helper methods
1350
-
1351
-	/**
1352
-	 * 	Returns the correct user identifier to use, based on the ldap server type
1353
-	 *
1354
-	 *	@return	string 				Login
1355
-	 */
1356
-	function getUserIdentifier()
1357
-	{
1358
-		if ($this->serverType == "activedirectory") {
1359
-			return $this->attr_sambalogin;
1360
-		} else {
1361
-			return $this->attr_login;
1362
-		}
1363
-	}
1364
-
1365
-   /**
1366
-    * 	UserAccountControl Flgs to more human understandable form...
1367
-    *
1368
-    *	@param	string		$uacf		UACF
1369
-    *	@return	void
1370
-    */
1371
-	function parseUACF($uacf)
1372
-	{
1373
-		//All flags array
1374
-		$flags = array(
1375
-			"TRUSTED_TO_AUTH_FOR_DELEGATION"  =>    16777216,
1376
-			"PASSWORD_EXPIRED"                =>    8388608,
1377
-			"DONT_REQ_PREAUTH"                =>    4194304,
1378
-			"USE_DES_KEY_ONLY"                =>    2097152,
1379
-			"NOT_DELEGATED"                   =>    1048576,
1380
-			"TRUSTED_FOR_DELEGATION"          =>    524288,
1381
-			"SMARTCARD_REQUIRED"              =>    262144,
1382
-			"MNS_LOGON_ACCOUNT"               =>    131072,
1383
-			"DONT_EXPIRE_PASSWORD"            =>    65536,
1384
-			"SERVER_TRUST_ACCOUNT"            =>    8192,
1385
-			"WORKSTATION_TRUST_ACCOUNT"       =>    4096,
1386
-			"INTERDOMAIN_TRUST_ACCOUNT"       =>    2048,
1387
-			"NORMAL_ACCOUNT"                  =>    512,
1388
-			"TEMP_DUPLICATE_ACCOUNT"          =>    256,
1389
-			"ENCRYPTED_TEXT_PWD_ALLOWED"      =>    128,
1390
-			"PASSWD_CANT_CHANGE"              =>    64,
1391
-			"PASSWD_NOTREQD"                  =>    32,
1392
-			"LOCKOUT"                         =>    16,
1393
-			"HOMEDIR_REQUIRED"                =>    8,
1394
-			"ACCOUNTDISABLE"                  =>    2,
1395
-			"SCRIPT"                          =>    1
1396
-		);
1397
-
1398
-		//Parse flags to text
1399
-		$retval = array();
1400
-		while (list($flag, $val) = each($flags)) {
1401
-			if ($uacf >= $val) {
1402
-				$uacf -= $val;
1403
-				$retval[$val] = $flag;
1404
-			}
1405
-		}
1406
-
1407
-		//Return human friendly flags
1408
-		return($retval);
1409
-	}
1410
-
1411
-   /**
1412
-    * 	SamAccountType value to text
1413
-    *
1414
-    *	@param	string	$samtype	SamType
1415
-    *	@return	string				Sam string
1416
-    */
1417
-	function parseSAT($samtype)
1418
-	{
1419
-		$stypes = array(
1420
-			805306368    =>    "NORMAL_ACCOUNT",
1421
-			805306369    =>    "WORKSTATION_TRUST",
1422
-			805306370    =>    "INTERDOMAIN_TRUST",
1423
-			268435456    =>    "SECURITY_GLOBAL_GROUP",
1424
-			268435457    =>    "DISTRIBUTION_GROUP",
1425
-			536870912    =>    "SECURITY_LOCAL_GROUP",
1426
-			536870913    =>    "DISTRIBUTION_LOCAL_GROUP"
1427
-		);
1428
-
1429
-		$retval = "";
1430
-		while (list($sat, $val) = each($stypes)) {
1431
-			if ($samtype == $sat) {
1432
-				$retval = $val;
1433
-				break;
1434
-			}
1435
-		}
1436
-		if (empty($retval)) $retval = "UNKNOWN_TYPE_" . $samtype;
1437
-
1438
-		return($retval);
1439
-	}
670
+        $content='';
671
+
672
+        // Create file content
673
+        if (preg_match('/^ldap/',$this->server[0]))
674
+        {
675
+            $target="-H ".join(',',$this->server);
676
+        }
677
+        else
678
+        {
679
+            $target="-h ".join(',',$this->server)." -p ".$this->serverPort;
680
+        }
681
+        $content.="# ldapadd $target -c -v -D ".$this->searchUser." -W -f ldapinput.in\n";
682
+        $content.="# ldapmodify $target -c -v -D ".$this->searchUser." -W -f ldapinput.in\n";
683
+        $content.="# ldapdelete $target -c -v -D ".$this->searchUser." -W -f ldapinput.in\n";
684
+        if (in_array('localhost',$this->server)) $content.="# If commands fails to connect, try without -h and -p\n";
685
+        $content.="dn: ".$dn."\n";
686
+        foreach($info as $key => $value)
687
+        {
688
+            if (! is_array($value))
689
+            {
690
+                $content.="$key: $value\n";
691
+            }
692
+            else
693
+            {
694
+                foreach($value as $valuekey => $valuevalue)
695
+                {
696
+                    $content.="$key: $valuevalue\n";
697
+                }
698
+            }
699
+        }
700
+        return $content;
701
+    }
702
+
703
+    /**
704
+     * 	Dump a LDAP message to ldapinput.in file
705
+     *
706
+     *	@param	string		$dn			DN entry key
707
+     *	@param	array		$info		Attributes array
708
+     *	@return	int						<0 if KO, >0 if OK
709
+     */
710
+    function dump($dn, $info)
711
+    {
712
+        global $conf;
713
+
714
+        // Create content
715
+        $content=$this->dump_content($dn, $info);
716
+
717
+        //Create file
718
+        $result=dol_mkdir($conf->ldap->dir_temp);
719
+
720
+        $outputfile=$conf->ldap->dir_temp.'/ldapinput.in';
721
+        $fp=fopen($outputfile,"w");
722
+        if ($fp)
723
+        {
724
+            fputs($fp, $content);
725
+            fclose($fp);
726
+            if (! empty($conf->global->MAIN_UMASK))
727
+            @chmod($outputfile, octdec($conf->global->MAIN_UMASK));
728
+            return 1;
729
+        }
730
+        else
731
+        {
732
+            return -1;
733
+        }
734
+    }
735
+
736
+    /**
737
+     * Ping a server before ldap_connect for avoid waiting
738
+     *
739
+     * @param string		$host		Server host or address
740
+     * @param int		$port		Server port (default 389)
741
+     * @param int		$timeout		Timeout in second (default 1s)
742
+     * @return boolean				true or false
743
+     */
744
+    function serverPing($host, $port=389, $timeout=1)
745
+    {
746
+        // Replace ldaps:// by ssl://
747
+        if (preg_match('/^ldaps:\/\/([^\/]+)\/?$/',$host, $regs)) {
748
+            $host = 'ssl://'.$regs[1];
749
+        }
750
+        // Remove ldap://
751
+        if (preg_match('/^ldap:\/\/([^\/]+)\/?$/',$host, $regs)) {
752
+            $host = $regs[1];
753
+        }
754
+        $op = @fsockopen($host, $port, $errno, $errstr, $timeout);
755
+        if (!$op) return false; //DC is N/A
756
+        else {
757
+            fclose($op); //explicitly close open socket connection
758
+            return true; //DC is up & running, we can safely connect with ldap_connect
759
+        }
760
+    }
761
+
762
+
763
+    // Attribute methods -----------------------------------------------------
764
+
765
+    /**
766
+     * 	Add a LDAP attribute in entry
767
+     *	Ldap object connect and bind must have been done
768
+     *
769
+     *	@param	string		$dn			DN entry key
770
+     *	@param	array		$info		Attributes array
771
+     *	@param	User		$user		Objet user that create
772
+     *	@return	int						<0 if KO, >0 if OK
773
+     */
774
+    function addAttribute($dn, $info, $user)
775
+    {
776
+        global $conf;
777
+
778
+        dol_syslog(get_class($this)."::addAttribute dn=".$dn." info=".join(',',$info));
779
+
780
+        // Check parameters
781
+        if (! $this->connection)
782
+        {
783
+            $this->error="NotConnected";
784
+            return -2;
785
+        }
786
+        if (! $this->bind)
787
+        {
788
+            $this->error="NotConnected";
789
+            return -3;
790
+        }
791
+
792
+        // Encode to LDAP page code
793
+        $dn=$this->convFromOutputCharset($dn,$this->ldapcharset);
794
+        foreach($info as $key => $val)
795
+        {
796
+            if (! is_array($val)) $info[$key]=$this->convFromOutputCharset($val,$this->ldapcharset);
797
+        }
798
+
799
+        $this->dump($dn,$info);
800
+
801
+        //print_r($info);
802
+        $result=@ldap_mod_add($this->connection, $dn, $info);
803
+
804
+        if ($result)
805
+        {
806
+            dol_syslog(get_class($this)."::add_attribute successfull", LOG_DEBUG);
807
+            return 1;
808
+        }
809
+        else
810
+        {
811
+            $this->error=@ldap_error($this->connection);
812
+            dol_syslog(get_class($this)."::add_attribute failed: ".$this->error, LOG_ERR);
813
+            return -1;
814
+        }
815
+    }
816
+
817
+    /**
818
+     * 	Update a LDAP attribute in entry
819
+     *	Ldap object connect and bind must have been done
820
+     *
821
+     *	@param	string		$dn			DN entry key
822
+     *	@param	array		$info		Attributes array
823
+     *	@param	User		$user		Objet user that create
824
+     *	@return	int						<0 if KO, >0 if OK
825
+     */
826
+    function updateAttribute($dn, $info, $user)
827
+    {
828
+        global $conf;
829
+
830
+        dol_syslog(get_class($this)."::updateAttribute dn=".$dn." info=".join(',',$info));
831
+
832
+        // Check parameters
833
+        if (! $this->connection)
834
+        {
835
+            $this->error="NotConnected";
836
+            return -2;
837
+        }
838
+        if (! $this->bind)
839
+        {
840
+            $this->error="NotConnected";
841
+            return -3;
842
+        }
843
+
844
+        // Encode to LDAP page code
845
+        $dn=$this->convFromOutputCharset($dn,$this->ldapcharset);
846
+        foreach($info as $key => $val)
847
+        {
848
+            if (! is_array($val)) $info[$key]=$this->convFromOutputCharset($val,$this->ldapcharset);
849
+        }
850
+
851
+        $this->dump($dn,$info);
852
+
853
+        //print_r($info);
854
+        $result=@ldap_mod_replace($this->connection, $dn, $info);
855
+
856
+        if ($result)
857
+        {
858
+            dol_syslog(get_class($this)."::updateAttribute successfull", LOG_DEBUG);
859
+            return 1;
860
+        }
861
+        else
862
+        {
863
+            $this->error=@ldap_error($this->connection);
864
+            dol_syslog(get_class($this)."::updateAttribute failed: ".$this->error, LOG_ERR);
865
+            return -1;
866
+        }
867
+    }
868
+
869
+    /**
870
+     * 	Delete a LDAP attribute in entry
871
+     *	Ldap object connect and bind must have been done
872
+     *
873
+     *	@param	string		$dn			DN entry key
874
+     *	@param	array		$info		Attributes array
875
+     *	@param	User		$user		Objet user that create
876
+     *	@return	int						<0 if KO, >0 if OK
877
+     */
878
+    function deleteAttribute($dn, $info, $user)
879
+    {
880
+        global $conf;
881
+
882
+        dol_syslog(get_class($this)."::deleteAttribute dn=".$dn." info=".join(',',$info));
883
+
884
+        // Check parameters
885
+        if (! $this->connection)
886
+        {
887
+            $this->error="NotConnected";
888
+            return -2;
889
+        }
890
+        if (! $this->bind)
891
+        {
892
+            $this->error="NotConnected";
893
+            return -3;
894
+        }
895
+
896
+        // Encode to LDAP page code
897
+        $dn=$this->convFromOutputCharset($dn,$this->ldapcharset);
898
+        foreach($info as $key => $val)
899
+        {
900
+            if (! is_array($val)) $info[$key]=$this->convFromOutputCharset($val,$this->ldapcharset);
901
+        }
902
+
903
+        $this->dump($dn,$info);
904
+
905
+        //print_r($info);
906
+        $result=@ldap_mod_del($this->connection, $dn, $info);
907
+
908
+        if ($result)
909
+        {
910
+            dol_syslog(get_class($this)."::deleteAttribute successfull", LOG_DEBUG);
911
+            return 1;
912
+        }
913
+        else
914
+        {
915
+            $this->error=@ldap_error($this->connection);
916
+            dol_syslog(get_class($this)."::deleteAttribute failed: ".$this->error, LOG_ERR);
917
+            return -1;
918
+        }
919
+    }
920
+
921
+    /**
922
+     *  Returns an array containing attributes and values for first record
923
+     *
924
+     *	@param	string	$dn			DN entry key
925
+     *	@param	string	$filter		Filter
926
+     *	@return	int|array			<0 or false if KO, array if OK
927
+     */
928
+    function getAttribute($dn,$filter)
929
+    {
930
+        // Check parameters
931
+        if (! $this->connection)
932
+        {
933
+            $this->error="NotConnected";
934
+            return -2;
935
+        }
936
+        if (! $this->bind)
937
+        {
938
+            $this->error="NotConnected";
939
+            return -3;
940
+        }
941
+
942
+        $search = ldap_search($this->connection,$dn,$filter);
943
+
944
+        // Only one entry should ever be returned
945
+        $entry = ldap_first_entry($this->connection, $search);
946
+
947
+        if (!$entry)
948
+        {
949
+            $this->ldapErrorCode = -1;
950
+            $this->ldapErrorText = "Couldn't find entry";
951
+            return 0;  // Couldn't find entry...
952
+        }
953
+
954
+        // Get values
955
+        if (! $values = ldap_get_attributes($this->connection, $entry))
956
+        {
957
+            $this->ldapErrorCode = ldap_errno($this->connection);
958
+            $this->ldapErrorText = ldap_error($this->connection);
959
+            return 0; // No matching attributes
960
+        }
961
+
962
+        // Return an array containing the attributes.
963
+        return $values;
964
+    }
965
+
966
+    /**
967
+     *  Returns an array containing values for an attribute and for first record matching filterrecord
968
+     *
969
+     * 	@param	string	$filterrecord		Record
970
+     * 	@param	string	$attribute			Attributes
971
+     * 	@return void
972
+     */
973
+    function getAttributeValues($filterrecord,$attribute)
974
+    {
975
+        $attributes=array();
976
+        $attributes[0] = $attribute;
977
+
978
+        // We need to search for this user in order to get their entry.
979
+        $this->result = @ldap_search($this->connection,$this->people,$filterrecord,$attributes);
980
+
981
+        // Pourquoi cette ligne ?
982
+        //$info = ldap_get_entries($this->connection, $this->result);
983
+
984
+        // Only one entry should ever be returned (no user will have the same uid)
985
+        $entry = ldap_first_entry($this->connection, $this->result);
986
+
987
+        if (!$entry)
988
+        {
989
+            $this->ldapErrorCode = -1;
990
+            $this->ldapErrorText = "Couldn't find user";
991
+            return false;  // Couldn't find the user...
992
+        }
993
+
994
+        // Get values
995
+        if (! $values = @ldap_get_values($this->connection, $entry, $attribute))
996
+        {
997
+            $this->ldapErrorCode = ldap_errno($this->connection);
998
+            $this->ldapErrorText = ldap_error($this->connection);
999
+            return false; // No matching attributes
1000
+        }
1001
+
1002
+        // Return an array containing the attributes.
1003
+        return $values;
1004
+    }
1005
+
1006
+    /**
1007
+     * 	Returns an array containing a details or list of LDAP record(s)
1008
+     * 	ldapsearch -LLLx -hlocalhost -Dcn=admin,dc=parinux,dc=org -w password -b "ou=adherents,ou=people,dc=parinux,dc=org" userPassword
1009
+     *
1010
+     *	@param	string	$search			 	Value of fiel to search, '*' for all. Not used if $activefilter is set.
1011
+     *	@param	string	$userDn			 	DN (Ex: ou=adherents,ou=people,dc=parinux,dc=org)
1012
+     *	@param	string	$useridentifier 	Name of key field (Ex: uid)
1013
+     *	@param	array	$attributeArray 	Array of fields required. Note this array must also contains field $useridentifier (Ex: sn,userPassword)
1014
+     *	@param	int		$activefilter		'1' or 'user'=use field this->filter as filter instead of parameter $search, 'member'=use field this->filtermember as filter
1015
+     *	@param	array	$attributeAsArray 	Array of fields wanted as an array not a string
1016
+     *	@return	array						Array of [id_record][ldap_field]=value
1017
+     */
1018
+    function getRecords($search, $userDn, $useridentifier, $attributeArray, $activefilter=0, $attributeAsArray=array())
1019
+    {
1020
+        $fulllist=array();
1021
+
1022
+        dol_syslog(get_class($this)."::getRecords search=".$search." userDn=".$userDn." useridentifier=".$useridentifier." attributeArray=array(".join(',',$attributeArray).") activefilter=".$activefilter);
1023
+
1024
+        // if the directory is AD, then bind first with the search user first
1025
+        if ($this->serverType == "activedirectory")
1026
+        {
1027
+            $this->bindauth($this->searchUser, $this->searchPassword);
1028
+            dol_syslog(get_class($this)."::bindauth serverType=activedirectory searchUser=".$this->searchUser);
1029
+        }
1030
+
1031
+        // Define filter
1032
+        if (! empty($activefilter))
1033
+        {
1034
+            if (((string) $activefilter == '1' || (string) $activefilter == 'user') && $this->filter)
1035
+            {
1036
+                $filter = '('.$this->filter.')';
1037
+            }
1038
+            elseif (((string) $activefilter == 'member') && $this->filter)
1039
+            {
1040
+                $filter = '('.$this->filtermember.')';
1041
+            }
1042
+            else	// If this->filter is empty, make fiter on * (all)
1043
+            {
1044
+                $filter = '('.$useridentifier.'=*)';
1045
+            }
1046
+        }
1047
+        else
1048
+        {
1049
+            $filter = '('.$useridentifier.'='.$search.')';
1050
+        }
1051
+
1052
+        if (is_array($attributeArray))
1053
+        {
1054
+            // Return list with required fields
1055
+            $attributeArray=array_values($attributeArray);	// This is to force to have index reordered from 0 (not make ldap_search fails)
1056
+            dol_syslog(get_class($this)."::getRecords connection=".$this->connection." userDn=".$userDn." filter=".$filter. " attributeArray=(".join(',',$attributeArray).")");
1057
+            //var_dump($attributeArray);
1058
+            $this->result = @ldap_search($this->connection, $userDn, $filter, $attributeArray);
1059
+        }
1060
+        else
1061
+        {
1062
+            // Return list with fields selected by default
1063
+            dol_syslog(get_class($this)."::getRecords connection=".$this->connection." userDn=".$userDn." filter=".$filter);
1064
+            $this->result = @ldap_search($this->connection, $userDn, $filter);
1065
+        }
1066
+        if (!$this->result)
1067
+        {
1068
+            $this->error = 'LDAP search failed: '.ldap_errno($this->connection)." ".ldap_error($this->connection);
1069
+            return -1;
1070
+        }
1071
+
1072
+        $info = @ldap_get_entries($this->connection, $this->result);
1073
+
1074
+        // Warning: Dans info, les noms d'attributs sont en minuscule meme si passe
1075
+        // a ldap_search en majuscule !!!
1076
+        //print_r($info);
1077
+
1078
+        for ($i = 0; $i < $info["count"]; $i++)
1079
+        {
1080
+            $recordid=$this->convToOutputCharset($info[$i][$useridentifier][0],$this->ldapcharset);
1081
+            if ($recordid)
1082
+            {
1083
+                //print "Found record with key $useridentifier=".$recordid."<br>\n";
1084
+                $fulllist[$recordid][$useridentifier]=$recordid;
1085
+
1086
+                // Add to the array for each attribute in my list
1087
+                $num = count($attributeArray);
1088
+                for ($j = 0; $j < $num; $j++)
1089
+                {
1090
+                    $keyattributelower=strtolower($attributeArray[$j]);
1091
+                    //print " Param ".$attributeArray[$j]."=".$info[$i][$keyattributelower][0]."<br>\n";
1092
+
1093
+                    //permet de recuperer le SID avec Active Directory
1094
+                    if ($this->serverType == "activedirectory" && $keyattributelower == "objectsid")
1095
+                    {
1096
+                        $objectsid = $this->getObjectSid($recordid);
1097
+                        $fulllist[$recordid][$attributeArray[$j]]    = $objectsid;
1098
+                    }
1099
+                    else
1100
+                    {
1101
+                        if(in_array($attributeArray[$j], $attributeAsArray) && is_array($info[$i][$keyattributelower])) {
1102
+                            $valueTab = array();
1103
+                            foreach($info[$i][$keyattributelower] as $key => $value) {
1104
+                                $valueTab[$key] = $this->convToOutputCharset($value,$this->ldapcharset);
1105
+                            }
1106
+                            $fulllist[$recordid][$attributeArray[$j]] = $valueTab;
1107
+                        } else {
1108
+                            $fulllist[$recordid][$attributeArray[$j]] = $this->convToOutputCharset($info[$i][$keyattributelower][0],$this->ldapcharset);
1109
+                        }
1110
+                    }
1111
+                }
1112
+            }
1113
+        }
1114
+
1115
+        asort($fulllist);
1116
+        return $fulllist;
1117
+    }
1118
+
1119
+    /**
1120
+     *  Converts a little-endian hex-number to one, that 'hexdec' can convert
1121
+     *	Required by Active Directory
1122
+     *
1123
+     *	@param	string		$hex			Hex value
1124
+     *	@return	string						Little endian
1125
+     */
1126
+    function littleEndian($hex)
1127
+    {
1128
+        for ($x=dol_strlen($hex)-2; $x >= 0; $x=$x-2) {
1129
+            $result .= substr($hex,$x,2);
1130
+        }
1131
+        return $result;
1132
+    }
1133
+
1134
+
1135
+    /**
1136
+     *  Recupere le SID de l'utilisateur
1137
+     *	Required by Active Directory
1138
+     *
1139
+     * 	@param	string		$ldapUser		Login de l'utilisateur
1140
+     * 	@return	string						Sid
1141
+     */
1142
+    function getObjectSid($ldapUser)
1143
+    {
1144
+        $criteria =  '('.$this->getUserIdentifier().'='.$ldapUser.')';
1145
+        $justthese = array("objectsid");
1146
+
1147
+        // if the directory is AD, then bind first with the search user first
1148
+        if ($this->serverType == "activedirectory")
1149
+        {
1150
+            $this->bindauth($this->searchUser, $this->searchPassword);
1151
+        }
1152
+
1153
+        $i = 0;
1154
+        $searchDN = $this->people;
1155
+
1156
+        while ($i <= 2)
1157
+        {
1158
+            $ldapSearchResult = @ldap_search($this->connection, $searchDN, $criteria, $justthese);
1159
+
1160
+            if (!$ldapSearchResult)
1161
+            {
1162
+                $this->error = ldap_errno($this->connection)." ".ldap_error($this->connection);
1163
+                return -1;
1164
+            }
1165
+
1166
+            $entry = ldap_first_entry($this->connection, $ldapSearchResult);
1167
+
1168
+            if (!$entry)
1169
+            {
1170
+                // Si pas de resultat on cherche dans le domaine
1171
+                $searchDN = $this->domain;
1172
+                $i++;
1173
+            }
1174
+            else
1175
+            {
1176
+                $i++;
1177
+                $i++;
1178
+            }
1179
+        }
1180
+
1181
+        if ($entry)
1182
+        {
1183
+            $ldapBinary = ldap_get_values_len($this->connection, $entry, "objectsid");
1184
+            $SIDText = $this->binSIDtoText($ldapBinary[0]);
1185
+            return $SIDText;
1186
+        }
1187
+        else
1188
+        {
1189
+            $this->error = ldap_errno($this->connection)." ".ldap_error($this->connection);
1190
+            return '?';
1191
+        }
1192
+    }
1193
+
1194
+    /**
1195
+     * Returns the textual SID
1196
+     * Indispensable pour Active Directory
1197
+     *
1198
+     * @param	string	$binsid		Binary SID
1199
+     * @return	string				Textual SID
1200
+     */
1201
+    function binSIDtoText($binsid)
1202
+    {
1203
+        $hex_sid=bin2hex($binsid);
1204
+        $rev = hexdec(substr($hex_sid,0,2));          // Get revision-part of SID
1205
+        $subcount = hexdec(substr($hex_sid,2,2));    // Get count of sub-auth entries
1206
+        $auth = hexdec(substr($hex_sid,4,12));      // SECURITY_NT_AUTHORITY
1207
+        $result = "$rev-$auth";
1208
+        for ($x=0;$x < $subcount; $x++)
1209
+        {
1210
+            $result .= "-".hexdec($this->littleEndian(substr($hex_sid,16+($x*8),8)));  // get all SECURITY_NT_AUTHORITY
1211
+        }
1212
+        return $result;
1213
+    }
1214
+
1215
+
1216
+    /**
1217
+     * 	Fonction de recherche avec filtre
1218
+     *	this->connection doit etre defini donc la methode bind ou bindauth doit avoir deja ete appelee
1219
+     *	Ne pas utiliser pour recherche d'une liste donnee de proprietes
1220
+     *	car conflit majuscule-minuscule. A n'utiliser que pour les pages
1221
+     *	'Fiche LDAP' qui affiche champ lisibles par defaut.
1222
+     *
1223
+     * 	@param	string		$checkDn		DN de recherche (Ex: ou=users,cn=my-domain,cn=com)
1224
+     * 	@param 	string		$filter			Search filter (ex: (sn=nom_personne) )
1225
+     *	@return	array|int					Array with answers (key lowercased - value)
1226
+     */
1227
+    function search($checkDn, $filter)
1228
+    {
1229
+        dol_syslog(get_class($this)."::search checkDn=".$checkDn." filter=".$filter);
1230
+
1231
+        $checkDn=$this->convFromOutputCharset($checkDn,$this->ldapcharset);
1232
+        $filter=$this->convFromOutputCharset($filter,$this->ldapcharset);
1233
+
1234
+        // if the directory is AD, then bind first with the search user first
1235
+        if ($this->serverType == "activedirectory") {
1236
+            $this->bindauth($this->searchUser, $this->searchPassword);
1237
+        }
1238
+
1239
+        $this->result = @ldap_search($this->connection, $checkDn, $filter);
1240
+
1241
+        $result = @ldap_get_entries($this->connection, $this->result);
1242
+        if (! $result)
1243
+        {
1244
+            $this->error = ldap_errno($this->connection)." ".ldap_error($this->connection);
1245
+            return -1;
1246
+        }
1247
+        else
1248
+        {
1249
+            ldap_free_result($this->result);
1250
+            return $result;
1251
+        }
1252
+    }
1253
+
1254
+
1255
+    /**
1256
+     * 		Load all attribute of a LDAP user
1257
+     *
1258
+     * 		@param	User	$user		User to search for. Not used if a filter is provided.
1259
+     *      @param  string	$filter		Filter for search. Must start with &.
1260
+     *                       	       	Examples: &(objectClass=inetOrgPerson) &(objectClass=user)(objectCategory=person) &(isMemberOf=cn=Sales,ou=Groups,dc=opencsi,dc=com)
1261
+     *		@return	int					>0 if OK, <0 if KO
1262
+     */
1263
+    function fetch($user,$filter)
1264
+    {
1265
+        // Perform the search and get the entry handles
1266
+
1267
+        // if the directory is AD, then bind first with the search user first
1268
+        if ($this->serverType == "activedirectory") {
1269
+            $this->bindauth($this->searchUser, $this->searchPassword);
1270
+        }
1271
+
1272
+        $searchDN = $this->people;    // TODO Why searching in people then domain ?
1273
+
1274
+        $result = '';
1275
+        $i=0;
1276
+        while ($i <= 2)
1277
+        {
1278
+            dol_syslog(get_class($this)."::fetch search with searchDN=".$searchDN." filter=".$filter);
1279
+            $this->result = @ldap_search($this->connection, $searchDN, $filter);
1280
+            if ($this->result)
1281
+            {
1282
+                $result = @ldap_get_entries($this->connection, $this->result);
1283
+                if ($result['count'] > 0) dol_syslog('Ldap::fetch search found '.$result['count'].' records');
1284
+                else dol_syslog('Ldap::fetch search returns but found no records');
1285
+                //var_dump($result);exit;
1286
+            }
1287
+            else
1288
+            {
1289
+                $this->error = ldap_errno($this->connection)." ".ldap_error($this->connection);
1290
+                dol_syslog(get_class($this)."::fetch search fails");
1291
+                return -1;
1292
+            }
1293
+
1294
+            if (! $result)
1295
+            {
1296
+                // Si pas de resultat on cherche dans le domaine
1297
+                $searchDN = $this->domain;
1298
+                $i++;
1299
+            }
1300
+            else
1301
+            {
1302
+                break;
1303
+            }
1304
+        }
1305
+
1306
+        if (! $result)
1307
+        {
1308
+            $this->error = ldap_errno($this->connection)." ".ldap_error($this->connection);
1309
+            return -1;
1310
+        }
1311
+        else
1312
+        {
1313
+            $this->name       = $this->convToOutputCharset($result[0][$this->attr_name][0],$this->ldapcharset);
1314
+            $this->firstname  = $this->convToOutputCharset($result[0][$this->attr_firstname][0],$this->ldapcharset);
1315
+            $this->login      = $this->convToOutputCharset($result[0][$this->attr_login][0],$this->ldapcharset);
1316
+            $this->phone      = $this->convToOutputCharset($result[0][$this->attr_phone][0],$this->ldapcharset);
1317
+            $this->skype      = $this->convToOutputCharset($result[0][$this->attr_skype][0],$this->ldapcharset);
1318
+            $this->fax        = $this->convToOutputCharset($result[0][$this->attr_fax][0],$this->ldapcharset);
1319
+            $this->mail       = $this->convToOutputCharset($result[0][$this->attr_mail][0],$this->ldapcharset);
1320
+            $this->mobile     = $this->convToOutputCharset($result[0][$this->attr_mobile][0],$this->ldapcharset);
1321
+
1322
+            $this->uacf       = $this->parseUACF($this->convToOutputCharset($result[0]["useraccountcontrol"][0],$this->ldapcharset));
1323
+            if (isset($result[0]["pwdlastset"][0]))	// If expiration on password exists
1324
+            {
1325
+                $this->pwdlastset = ($result[0]["pwdlastset"][0] != 0)?$this->convert_time($this->convToOutputCharset($result[0]["pwdlastset"][0],$this->ldapcharset)):0;
1326
+            }
1327
+            else
1328
+            {
1329
+                $this->pwdlastset = -1;
1330
+            }
1331
+            if (!$this->name && !$this->login) $this->pwdlastset = -1;
1332
+            $this->badpwdtime = $this->convert_time($this->convToOutputCharset($result[0]["badpasswordtime"][0],$this->ldapcharset));
1333
+
1334
+            // FQDN domain
1335
+            $domain = str_replace('dc=','',$this->domain);
1336
+            $domain = str_replace(',','.',$domain);
1337
+            $this->domainFQDN = $domain;
1338
+
1339
+            // Set ldapUserDn (each user can have a different dn)
1340
+            //var_dump($result[0]);exit;
1341
+            $this->ldapUserDN=$result[0]['dn'];
1342
+
1343
+            ldap_free_result($this->result);
1344
+            return 1;
1345
+        }
1346
+    }
1347
+
1348
+
1349
+    // helper methods
1350
+
1351
+    /**
1352
+     * 	Returns the correct user identifier to use, based on the ldap server type
1353
+     *
1354
+     *	@return	string 				Login
1355
+     */
1356
+    function getUserIdentifier()
1357
+    {
1358
+        if ($this->serverType == "activedirectory") {
1359
+            return $this->attr_sambalogin;
1360
+        } else {
1361
+            return $this->attr_login;
1362
+        }
1363
+    }
1364
+
1365
+    /**
1366
+     * 	UserAccountControl Flgs to more human understandable form...
1367
+     *
1368
+     *	@param	string		$uacf		UACF
1369
+     *	@return	void
1370
+     */
1371
+    function parseUACF($uacf)
1372
+    {
1373
+        //All flags array
1374
+        $flags = array(
1375
+            "TRUSTED_TO_AUTH_FOR_DELEGATION"  =>    16777216,
1376
+            "PASSWORD_EXPIRED"                =>    8388608,
1377
+            "DONT_REQ_PREAUTH"                =>    4194304,
1378
+            "USE_DES_KEY_ONLY"                =>    2097152,
1379
+            "NOT_DELEGATED"                   =>    1048576,
1380
+            "TRUSTED_FOR_DELEGATION"          =>    524288,
1381
+            "SMARTCARD_REQUIRED"              =>    262144,
1382
+            "MNS_LOGON_ACCOUNT"               =>    131072,
1383
+            "DONT_EXPIRE_PASSWORD"            =>    65536,
1384
+            "SERVER_TRUST_ACCOUNT"            =>    8192,
1385
+            "WORKSTATION_TRUST_ACCOUNT"       =>    4096,
1386
+            "INTERDOMAIN_TRUST_ACCOUNT"       =>    2048,
1387
+            "NORMAL_ACCOUNT"                  =>    512,
1388
+            "TEMP_DUPLICATE_ACCOUNT"          =>    256,
1389
+            "ENCRYPTED_TEXT_PWD_ALLOWED"      =>    128,
1390
+            "PASSWD_CANT_CHANGE"              =>    64,
1391
+            "PASSWD_NOTREQD"                  =>    32,
1392
+            "LOCKOUT"                         =>    16,
1393
+            "HOMEDIR_REQUIRED"                =>    8,
1394
+            "ACCOUNTDISABLE"                  =>    2,
1395
+            "SCRIPT"                          =>    1
1396
+        );
1397
+
1398
+        //Parse flags to text
1399
+        $retval = array();
1400
+        while (list($flag, $val) = each($flags)) {
1401
+            if ($uacf >= $val) {
1402
+                $uacf -= $val;
1403
+                $retval[$val] = $flag;
1404
+            }
1405
+        }
1406
+
1407
+        //Return human friendly flags
1408
+        return($retval);
1409
+    }
1410
+
1411
+    /**
1412
+     * 	SamAccountType value to text
1413
+     *
1414
+     *	@param	string	$samtype	SamType
1415
+     *	@return	string				Sam string
1416
+     */
1417
+    function parseSAT($samtype)
1418
+    {
1419
+        $stypes = array(
1420
+            805306368    =>    "NORMAL_ACCOUNT",
1421
+            805306369    =>    "WORKSTATION_TRUST",
1422
+            805306370    =>    "INTERDOMAIN_TRUST",
1423
+            268435456    =>    "SECURITY_GLOBAL_GROUP",
1424
+            268435457    =>    "DISTRIBUTION_GROUP",
1425
+            536870912    =>    "SECURITY_LOCAL_GROUP",
1426
+            536870913    =>    "DISTRIBUTION_LOCAL_GROUP"
1427
+        );
1428
+
1429
+        $retval = "";
1430
+        while (list($sat, $val) = each($stypes)) {
1431
+            if ($samtype == $sat) {
1432
+                $retval = $val;
1433
+                break;
1434
+            }
1435
+        }
1436
+        if (empty($retval)) $retval = "UNKNOWN_TYPE_" . $samtype;
1437
+
1438
+        return($retval);
1439
+    }
1440 1440
 
1441 1441
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
1442
-	/**
1443
-	 *	Convertit le temps ActiveDirectory en Unix timestamp
1444
-	 *
1445
-	 *	@param	string	$value		AD time to convert
1446
-	 *	@return	integer				Unix timestamp
1447
-	 */
1448
-	function convert_time($value)
1449
-	{
1442
+    /**
1443
+     *	Convertit le temps ActiveDirectory en Unix timestamp
1444
+     *
1445
+     *	@param	string	$value		AD time to convert
1446
+     *	@return	integer				Unix timestamp
1447
+     */
1448
+    function convert_time($value)
1449
+    {
1450 1450
         // phpcs:enable
1451
-		$dateLargeInt=$value; // nano secondes depuis 1601 !!!!
1452
-		$secsAfterADEpoch = $dateLargeInt / (10000000); // secondes depuis le 1 jan 1601
1453
-		$ADToUnixConvertor=((1970-1601) * 365.242190) * 86400; // UNIX start date - AD start date * jours * secondes
1454
-		$unixTimeStamp=intval($secsAfterADEpoch-$ADToUnixConvertor); // Unix time stamp
1455
-		return $unixTimeStamp;
1456
-	}
1457
-
1458
-
1459
-	/**
1460
-	 *  Convert a string into output/memory charset
1461
-	 *
1462
-	 *  @param	string	$str            String to convert
1463
-	 *  @param	string	$pagecodefrom	Page code of src string
1464
-	 *  @return string         			Converted string
1465
-	 */
1466
-	private function convToOutputCharset($str,$pagecodefrom='UTF-8')
1467
-	{
1468
-		global $conf;
1469
-		if ($pagecodefrom == 'ISO-8859-1' && $conf->file->character_set_client == 'UTF-8')  $str=utf8_encode($str);
1470
-		if ($pagecodefrom == 'UTF-8' && $conf->file->character_set_client == 'ISO-8859-1')  $str=utf8_decode($str);
1471
-		return $str;
1472
-	}
1473
-
1474
-	/**
1475
-	 *  Convert a string from output/memory charset
1476
-	 *
1477
-	 *  @param	string	$str            String to convert
1478
-	 *  @param	string	$pagecodeto		Page code for result string
1479
-	 *  @return string         			Converted string
1480
-	 */
1481
-	function convFromOutputCharset($str,$pagecodeto='UTF-8')
1482
-	{
1483
-		global $conf;
1484
-		if ($pagecodeto == 'ISO-8859-1' && $conf->file->character_set_client == 'UTF-8') $str=utf8_decode($str);
1485
-		if ($pagecodeto == 'UTF-8' && $conf->file->character_set_client == 'ISO-8859-1') $str=utf8_encode($str);
1486
-		return $str;
1487
-	}
1488
-
1489
-
1490
-	/**
1491
-	 *	Return available value of group GID
1492
-	 *
1493
-	 *	@param	string	$keygroup	Key of group
1494
-	 *	@return	int					gid number
1495
-	 */
1496
-	function getNextGroupGid($keygroup='LDAP_KEY_GROUPS')
1497
-	{
1498
-		global $conf;
1499
-
1500
-		if (empty($keygroup)) $keygroup='LDAP_KEY_GROUPS';
1501
-
1502
-		$search='('.$conf->global->$keygroup.'=*)';
1503
-		$result = $this->search($this->groups,$search);
1504
-		if ($result)
1505
-		{
1506
-			$c = $result['count'];
1507
-			$gids = array();
1508
-			for($i=0;$i<$c;$i++)
1509
-			{
1510
-				$gids[] = $result[$i]['gidnumber'][0];
1511
-			}
1512
-			rsort($gids);
1513
-
1514
-			return $gids[0]+1;
1515
-		}
1516
-
1517
-		return 0;
1518
-	}
1451
+        $dateLargeInt=$value; // nano secondes depuis 1601 !!!!
1452
+        $secsAfterADEpoch = $dateLargeInt / (10000000); // secondes depuis le 1 jan 1601
1453
+        $ADToUnixConvertor=((1970-1601) * 365.242190) * 86400; // UNIX start date - AD start date * jours * secondes
1454
+        $unixTimeStamp=intval($secsAfterADEpoch-$ADToUnixConvertor); // Unix time stamp
1455
+        return $unixTimeStamp;
1456
+    }
1457
+
1458
+
1459
+    /**
1460
+     *  Convert a string into output/memory charset
1461
+     *
1462
+     *  @param	string	$str            String to convert
1463
+     *  @param	string	$pagecodefrom	Page code of src string
1464
+     *  @return string         			Converted string
1465
+     */
1466
+    private function convToOutputCharset($str,$pagecodefrom='UTF-8')
1467
+    {
1468
+        global $conf;
1469
+        if ($pagecodefrom == 'ISO-8859-1' && $conf->file->character_set_client == 'UTF-8')  $str=utf8_encode($str);
1470
+        if ($pagecodefrom == 'UTF-8' && $conf->file->character_set_client == 'ISO-8859-1')  $str=utf8_decode($str);
1471
+        return $str;
1472
+    }
1473
+
1474
+    /**
1475
+     *  Convert a string from output/memory charset
1476
+     *
1477
+     *  @param	string	$str            String to convert
1478
+     *  @param	string	$pagecodeto		Page code for result string
1479
+     *  @return string         			Converted string
1480
+     */
1481
+    function convFromOutputCharset($str,$pagecodeto='UTF-8')
1482
+    {
1483
+        global $conf;
1484
+        if ($pagecodeto == 'ISO-8859-1' && $conf->file->character_set_client == 'UTF-8') $str=utf8_decode($str);
1485
+        if ($pagecodeto == 'UTF-8' && $conf->file->character_set_client == 'ISO-8859-1') $str=utf8_encode($str);
1486
+        return $str;
1487
+    }
1488
+
1489
+
1490
+    /**
1491
+     *	Return available value of group GID
1492
+     *
1493
+     *	@param	string	$keygroup	Key of group
1494
+     *	@return	int					gid number
1495
+     */
1496
+    function getNextGroupGid($keygroup='LDAP_KEY_GROUPS')
1497
+    {
1498
+        global $conf;
1499
+
1500
+        if (empty($keygroup)) $keygroup='LDAP_KEY_GROUPS';
1501
+
1502
+        $search='('.$conf->global->$keygroup.'=*)';
1503
+        $result = $this->search($this->groups,$search);
1504
+        if ($result)
1505
+        {
1506
+            $c = $result['count'];
1507
+            $gids = array();
1508
+            for($i=0;$i<$c;$i++)
1509
+            {
1510
+                $gids[] = $result[$i]['gidnumber'][0];
1511
+            }
1512
+            rsort($gids);
1513
+
1514
+            return $gids[0]+1;
1515
+        }
1516
+
1517
+        return 0;
1518
+    }
1519 1519
 }
Please login to merge, or discard this patch.
Spacing   +221 added lines, -221 removed lines patch added patch discarded remove patch
@@ -32,7 +32,7 @@  discard block
 block discarded – undo
32 32
 	/**
33 33
 	 * @var string Error code (or message)
34 34
 	 */
35
-	public $error='';
35
+	public $error = '';
36 36
 
37 37
 	/**
38 38
 	 * @var string[]	Array of error strings
@@ -42,7 +42,7 @@  discard block
 block discarded – undo
42 42
 	/**
43 43
 	 * Tableau des serveurs (IP addresses ou nom d'hotes)
44 44
 	 */
45
-	var $server=array();
45
+	var $server = array();
46 46
 
47 47
 	/**
48 48
 	 * Base DN (e.g. "dc=foo,dc=com")
@@ -97,7 +97,7 @@  discard block
 block discarded – undo
97 97
 	var $uacf;
98 98
 	var $pwdlastset;
99 99
 
100
-	var $ldapcharset='UTF-8';	// LDAP should be UTF-8 encoded
100
+	var $ldapcharset = 'UTF-8'; // LDAP should be UTF-8 encoded
101 101
 
102 102
 
103 103
 	/**
@@ -118,8 +118,8 @@  discard block
 block discarded – undo
118 118
 		global $conf;
119 119
 
120 120
 		// Server
121
-		if (! empty($conf->global->LDAP_SERVER_HOST))       $this->server[] = $conf->global->LDAP_SERVER_HOST;
122
-		if (! empty($conf->global->LDAP_SERVER_HOST_SLAVE)) $this->server[] = $conf->global->LDAP_SERVER_HOST_SLAVE;
121
+		if (!empty($conf->global->LDAP_SERVER_HOST))       $this->server[] = $conf->global->LDAP_SERVER_HOST;
122
+		if (!empty($conf->global->LDAP_SERVER_HOST_SLAVE)) $this->server[] = $conf->global->LDAP_SERVER_HOST_SLAVE;
123 123
 		$this->serverPort          = $conf->global->LDAP_SERVER_PORT;
124 124
 		$this->ldapProtocolVersion = $conf->global->LDAP_SERVER_PROTOCOLVERSION;
125 125
 		$this->dn                  = $conf->global->LDAP_SERVER_DN;
@@ -130,8 +130,8 @@  discard block
 block discarded – undo
130 130
 		$this->people              = $conf->global->LDAP_USER_DN;
131 131
 		$this->groups              = $conf->global->LDAP_GROUP_DN;
132 132
 
133
-		$this->filter              = $conf->global->LDAP_FILTER_CONNECTION;	// Filter on user
134
-		$this->filtermember        = $conf->global->LDAP_MEMBER_FILTER;		// Filter on member
133
+		$this->filter              = $conf->global->LDAP_FILTER_CONNECTION; // Filter on user
134
+		$this->filtermember        = $conf->global->LDAP_MEMBER_FILTER; // Filter on member
135 135
 
136 136
 		// Users
137 137
 		$this->attr_login      = $conf->global->LDAP_FIELD_LOGIN; //unix
@@ -162,22 +162,22 @@  discard block
 block discarded – undo
162 162
         // phpcs:enable
163 163
 		global $langs, $conf;
164 164
 
165
-		$connected=0;
166
-		$this->bind=0;
165
+		$connected = 0;
166
+		$this->bind = 0;
167 167
 
168 168
 		// Check parameters
169 169
 		if (count($this->server) == 0 || empty($this->server[0]))
170 170
 		{
171
-			$this->error='LDAP setup (file conf.php) is not complete';
171
+			$this->error = 'LDAP setup (file conf.php) is not complete';
172 172
 			dol_syslog(get_class($this)."::connect_bind ".$this->error, LOG_WARNING);
173 173
 			return -1;
174 174
 		}
175 175
 
176
-		if (! function_exists("ldap_connect"))
176
+		if (!function_exists("ldap_connect"))
177 177
 		{
178
-			$this->error='LDAPFunctionsNotAvailableOnPHP';
178
+			$this->error = 'LDAPFunctionsNotAvailableOnPHP';
179 179
 			dol_syslog(get_class($this)."::connect_bind ".$this->error, LOG_WARNING);
180
-			$return=-1;
180
+			$return = -1;
181 181
 		}
182 182
 
183 183
 		if (empty($this->error))
@@ -196,9 +196,9 @@  discard block
 block discarded – undo
196 196
 				if (is_resource($this->connection))
197 197
 				{
198 198
 					// Begin TLS if requested by the configuration
199
-					if (! empty($conf->global->LDAP_SERVER_USE_TLS))
199
+					if (!empty($conf->global->LDAP_SERVER_USE_TLS))
200 200
 					{
201
-						if (! ldap_start_tls($this->connection))
201
+						if (!ldap_start_tls($this->connection))
202 202
 						{
203 203
 							dol_syslog(get_class($this)."::connect_bind failed to start tls", LOG_WARNING);
204 204
 							$connected = 0;
@@ -213,18 +213,18 @@  discard block
 block discarded – undo
213 213
 
214 214
 					if ($this->serverType == "activedirectory")
215 215
 					{
216
-						$result=$this->setReferrals();
217
-						dol_syslog(get_class($this)."::connect_bind try bindauth for activedirectory on ".$host." user=".$this->searchUser." password=".preg_replace('/./','*',$this->searchPassword),LOG_DEBUG);
218
-						$this->result=$this->bindauth($this->searchUser,$this->searchPassword);
216
+						$result = $this->setReferrals();
217
+						dol_syslog(get_class($this)."::connect_bind try bindauth for activedirectory on ".$host." user=".$this->searchUser." password=".preg_replace('/./', '*', $this->searchPassword), LOG_DEBUG);
218
+						$this->result = $this->bindauth($this->searchUser, $this->searchPassword);
219 219
 						if ($this->result)
220 220
 						{
221
-							$this->bind=$this->result;
222
-							$connected=2;
221
+							$this->bind = $this->result;
222
+							$connected = 2;
223 223
 							break;
224 224
 						}
225 225
 						else
226 226
 						{
227
-							$this->error=ldap_errno($this->connection).' '.ldap_error($this->connection);
227
+							$this->error = ldap_errno($this->connection).' '.ldap_error($this->connection);
228 228
 						}
229 229
 					}
230 230
 					else
@@ -232,51 +232,51 @@  discard block
 block discarded – undo
232 232
 						// Try in auth mode
233 233
 						if ($this->searchUser && $this->searchPassword)
234 234
 						{
235
-							dol_syslog(get_class($this)."::connect_bind try bindauth on ".$host." user=".$this->searchUser." password=".preg_replace('/./','*',$this->searchPassword),LOG_DEBUG);
236
-							$this->result=$this->bindauth($this->searchUser,$this->searchPassword);
235
+							dol_syslog(get_class($this)."::connect_bind try bindauth on ".$host." user=".$this->searchUser." password=".preg_replace('/./', '*', $this->searchPassword), LOG_DEBUG);
236
+							$this->result = $this->bindauth($this->searchUser, $this->searchPassword);
237 237
 							if ($this->result)
238 238
 							{
239
-								$this->bind=$this->result;
240
-								$connected=2;
239
+								$this->bind = $this->result;
240
+								$connected = 2;
241 241
 								break;
242 242
 							}
243 243
 							else
244 244
 							{
245
-								$this->error=ldap_errno($this->connection).' '.ldap_error($this->connection);
245
+								$this->error = ldap_errno($this->connection).' '.ldap_error($this->connection);
246 246
 							}
247 247
 						}
248 248
 						// Try in anonymous
249
-						if (! $this->bind)
249
+						if (!$this->bind)
250 250
 						{
251
-							dol_syslog(get_class($this)."::connect_bind try bind on ".$host,LOG_DEBUG);
252
-							$result=$this->bind();
251
+							dol_syslog(get_class($this)."::connect_bind try bind on ".$host, LOG_DEBUG);
252
+							$result = $this->bind();
253 253
 							if ($result)
254 254
 							{
255
-								$this->bind=$this->result;
256
-								$connected=1;
255
+								$this->bind = $this->result;
256
+								$connected = 1;
257 257
 								break;
258 258
 							}
259 259
 							else
260 260
 							{
261
-								$this->error=ldap_errno($this->connection).' '.ldap_error($this->connection);
261
+								$this->error = ldap_errno($this->connection).' '.ldap_error($this->connection);
262 262
 							}
263 263
 						}
264 264
 					}
265 265
 				}
266 266
 
267
-				if (! $connected) $this->close();
267
+				if (!$connected) $this->close();
268 268
 			}
269 269
 		}
270 270
 
271 271
 		if ($connected)
272 272
 		{
273
-			$return=$connected;
273
+			$return = $connected;
274 274
 			dol_syslog(get_class($this)."::connect_bind return=".$return, LOG_DEBUG);
275 275
 		}
276 276
 		else
277 277
 		{
278
-			$this->error='Failed to connect to LDAP'.($this->error?': '.$this->error:'');
279
-			$return=-1;
278
+			$this->error = 'Failed to connect to LDAP'.($this->error ? ': '.$this->error : '');
279
+			$return = -1;
280 280
 			dol_syslog(get_class($this)."::connect_bind return=".$return.' - '.$this->error, LOG_WARNING);
281 281
 		}
282 282
 		return $return;
@@ -292,7 +292,7 @@  discard block
 block discarded – undo
292 292
 	 */
293 293
 	function close()
294 294
 	{
295
-		if ($this->connection && ! @ldap_close($this->connection))
295
+		if ($this->connection && !@ldap_close($this->connection))
296 296
 		{
297 297
 			return false;
298 298
 		}
@@ -310,11 +310,11 @@  discard block
 block discarded – undo
310 310
 	 */
311 311
 	function bind()
312 312
 	{
313
-		if (! $this->result=@ldap_bind($this->connection))
313
+		if (!$this->result = @ldap_bind($this->connection))
314 314
 		{
315 315
 			$this->ldapErrorCode = ldap_errno($this->connection);
316 316
 			$this->ldapErrorText = ldap_error($this->connection);
317
-			$this->error=$this->ldapErrorCode." ".$this->ldapErrorText;
317
+			$this->error = $this->ldapErrorCode." ".$this->ldapErrorText;
318 318
 			return false;
319 319
 		}
320 320
 		else
@@ -333,13 +333,13 @@  discard block
 block discarded – undo
333 333
 	 * @param	string	$pass			Password
334 334
 	 * @return	boolean					true or false
335 335
 	 */
336
-	function bindauth($bindDn,$pass)
336
+	function bindauth($bindDn, $pass)
337 337
 	{
338
-		if (! $this->result = @ldap_bind($this->connection, $bindDn, $pass))
338
+		if (!$this->result = @ldap_bind($this->connection, $bindDn, $pass))
339 339
 		{
340 340
 			$this->ldapErrorCode = ldap_errno($this->connection);
341 341
 			$this->ldapErrorText = ldap_error($this->connection);
342
-			$this->error=$this->ldapErrorCode." ".$this->ldapErrorText;
342
+			$this->error = $this->ldapErrorCode." ".$this->ldapErrorText;
343 343
 			return false;
344 344
 		}
345 345
 		else
@@ -355,7 +355,7 @@  discard block
 block discarded – undo
355 355
 	 */
356 356
 	function unbind()
357 357
 	{
358
-		if (!$this->result=@ldap_unbind($this->connection))
358
+		if (!$this->result = @ldap_unbind($this->connection))
359 359
 		{
360 360
 			return false;
361 361
 		} else {
@@ -414,31 +414,31 @@  discard block
 block discarded – undo
414 414
 	{
415 415
 		global $conf;
416 416
 
417
-		dol_syslog(get_class($this)."::add dn=".$dn." info=".join(',',$info));
417
+		dol_syslog(get_class($this)."::add dn=".$dn." info=".join(',', $info));
418 418
 
419 419
 		// Check parameters
420
-		if (! $this->connection)
420
+		if (!$this->connection)
421 421
 		{
422
-			$this->error="NotConnected";
422
+			$this->error = "NotConnected";
423 423
 			return -2;
424 424
 		}
425
-		if (! $this->bind)
425
+		if (!$this->bind)
426 426
 		{
427
-			$this->error="NotConnected";
427
+			$this->error = "NotConnected";
428 428
 			return -3;
429 429
 		}
430 430
 
431 431
 		// Encode to LDAP page code
432
-		$dn=$this->convFromOutputCharset($dn,$this->ldapcharset);
433
-		foreach($info as $key => $val)
432
+		$dn = $this->convFromOutputCharset($dn, $this->ldapcharset);
433
+		foreach ($info as $key => $val)
434 434
 		{
435
-			if (! is_array($val)) $info[$key]=$this->convFromOutputCharset($val,$this->ldapcharset);
435
+			if (!is_array($val)) $info[$key] = $this->convFromOutputCharset($val, $this->ldapcharset);
436 436
 		}
437 437
 
438
-		$this->dump($dn,$info);
438
+		$this->dump($dn, $info);
439 439
 
440 440
 		//print_r($info);
441
-		$result=@ldap_add($this->connection, $dn, $info);
441
+		$result = @ldap_add($this->connection, $dn, $info);
442 442
 
443 443
 		if ($result)
444 444
 		{
@@ -449,7 +449,7 @@  discard block
 block discarded – undo
449 449
 		{
450 450
 			$this->ldapErrorCode = @ldap_errno($this->connection);
451 451
 			$this->ldapErrorText = @ldap_error($this->connection);
452
-			$this->error=$this->ldapErrorCode." ".$this->ldapErrorText;
452
+			$this->error = $this->ldapErrorCode." ".$this->ldapErrorText;
453 453
 			dol_syslog(get_class($this)."::add failed: ".$this->error, LOG_ERR);
454 454
 			return -1;
455 455
 		}
@@ -468,31 +468,31 @@  discard block
 block discarded – undo
468 468
 	{
469 469
 		global $conf;
470 470
 
471
-		dol_syslog(get_class($this)."::modify dn=".$dn." info=".join(',',$info));
471
+		dol_syslog(get_class($this)."::modify dn=".$dn." info=".join(',', $info));
472 472
 
473 473
 		// Check parameters
474
-		if (! $this->connection)
474
+		if (!$this->connection)
475 475
 		{
476
-			$this->error="NotConnected";
476
+			$this->error = "NotConnected";
477 477
 			return -2;
478 478
 		}
479
-		if (! $this->bind)
479
+		if (!$this->bind)
480 480
 		{
481
-			$this->error="NotConnected";
481
+			$this->error = "NotConnected";
482 482
 			return -3;
483 483
 		}
484 484
 
485 485
 		// Encode to LDAP page code
486
-		$dn=$this->convFromOutputCharset($dn,$this->ldapcharset);
487
-		foreach($info as $key => $val)
486
+		$dn = $this->convFromOutputCharset($dn, $this->ldapcharset);
487
+		foreach ($info as $key => $val)
488 488
 		{
489
-			if (! is_array($val)) $info[$key]=$this->convFromOutputCharset($val,$this->ldapcharset);
489
+			if (!is_array($val)) $info[$key] = $this->convFromOutputCharset($val, $this->ldapcharset);
490 490
 		}
491 491
 
492
-		$this->dump($dn,$info);
492
+		$this->dump($dn, $info);
493 493
 
494 494
 		//print_r($info);
495
-		$result=@ldap_modify($this->connection, $dn, $info);
495
+		$result = @ldap_modify($this->connection, $dn, $info);
496 496
 
497 497
 		if ($result)
498 498
 		{
@@ -501,7 +501,7 @@  discard block
 block discarded – undo
501 501
 		}
502 502
 		else
503 503
 		{
504
-			$this->error=@ldap_error($this->connection);
504
+			$this->error = @ldap_error($this->connection);
505 505
 			dol_syslog(get_class($this)."::modify failed: ".$this->error, LOG_ERR);
506 506
 			return -1;
507 507
 		}
@@ -522,27 +522,27 @@  discard block
 block discarded – undo
522 522
 	{
523 523
 		global $conf;
524 524
 
525
-		dol_syslog(get_class($this)."::modify dn=".$dn." newrdn=".$newrdn." newparent=".$newparent." deleteoldrdn=".($deleteoldrdn?1:0));
525
+		dol_syslog(get_class($this)."::modify dn=".$dn." newrdn=".$newrdn." newparent=".$newparent." deleteoldrdn=".($deleteoldrdn ? 1 : 0));
526 526
 
527 527
 		// Check parameters
528
-		if (! $this->connection)
528
+		if (!$this->connection)
529 529
 		{
530
-			$this->error="NotConnected";
530
+			$this->error = "NotConnected";
531 531
 			return -2;
532 532
 		}
533
-		if (! $this->bind)
533
+		if (!$this->bind)
534 534
 		{
535
-			$this->error="NotConnected";
535
+			$this->error = "NotConnected";
536 536
 			return -3;
537 537
 		}
538 538
 
539 539
 		// Encode to LDAP page code
540
-		$dn=$this->convFromOutputCharset($dn,$this->ldapcharset);
541
-		$newrdn=$this->convFromOutputCharset($newrdn,$this->ldapcharset);
542
-		$newparent=$this->convFromOutputCharset($newparent,$this->ldapcharset);
540
+		$dn = $this->convFromOutputCharset($dn, $this->ldapcharset);
541
+		$newrdn = $this->convFromOutputCharset($newrdn, $this->ldapcharset);
542
+		$newparent = $this->convFromOutputCharset($newparent, $this->ldapcharset);
543 543
 
544 544
 		//print_r($info);
545
-		$result=@ldap_rename($this->connection, $dn, $newrdn, $newparent, $deleteoldrdn);
545
+		$result = @ldap_rename($this->connection, $dn, $newrdn, $newparent, $deleteoldrdn);
546 546
 
547 547
 		if ($result)
548 548
 		{
@@ -551,7 +551,7 @@  discard block
 block discarded – undo
551 551
 		}
552 552
 		else
553 553
 		{
554
-			$this->error=@ldap_error($this->connection);
554
+			$this->error = @ldap_error($this->connection);
555 555
 			dol_syslog(get_class($this)."::rename failed: ".$this->error, LOG_ERR);
556 556
 			return -1;
557 557
 		}
@@ -569,27 +569,27 @@  discard block
 block discarded – undo
569 569
 	 *	@param	string	$newparent	New parent (ou=xxx,dc=aaa,dc=bbb) (for ldap_rename)
570 570
 	 *	@return	int					<0 if KO, >0 if OK
571 571
 	 */
572
-	function update($dn, $info, $user, $olddn, $newrdn=false, $newparent=false)
572
+	function update($dn, $info, $user, $olddn, $newrdn = false, $newparent = false)
573 573
 	{
574 574
 		global $conf;
575 575
 
576 576
 		dol_syslog(get_class($this)."::update dn=".$dn." olddn=".$olddn);
577 577
 
578 578
 		// Check parameters
579
-		if (! $this->connection)
579
+		if (!$this->connection)
580 580
 		{
581
-			$this->error="NotConnected";
581
+			$this->error = "NotConnected";
582 582
 			return -2;
583 583
 		}
584
-		if (! $this->bind)
584
+		if (!$this->bind)
585 585
 		{
586
-			$this->error="NotConnected";
586
+			$this->error = "NotConnected";
587 587
 			return -3;
588 588
 		}
589 589
 
590
-		if (! $olddn || $olddn != $dn)
590
+		if (!$olddn || $olddn != $dn)
591 591
 		{
592
-			if (! empty($olddn) && ! empty($newrdn) && ! empty($newparent) && $conf->global->LDAP_SERVER_PROTOCOLVERSION === '3')
592
+			if (!empty($olddn) && !empty($newrdn) && !empty($newparent) && $conf->global->LDAP_SERVER_PROTOCOLVERSION === '3')
593 593
 			{
594 594
 				// This function currently only works with LDAPv3
595 595
 				$result = $this->rename($olddn, $newrdn, $newparent, $user, true);
@@ -598,19 +598,19 @@  discard block
 block discarded – undo
598 598
 			{
599 599
 				// If change we make is rename the key of LDAP record, we create new one and if ok, we delete old one.
600 600
 				$result = $this->add($dn, $info, $user);
601
-				if ($result > 0 && $olddn && $olddn != $dn) $result = $this->delete($olddn);	// If add fails, we do not try to delete old one
601
+				if ($result > 0 && $olddn && $olddn != $dn) $result = $this->delete($olddn); // If add fails, we do not try to delete old one
602 602
 			}
603 603
 		}
604 604
 		else
605 605
 		{
606 606
 			//$result = $this->delete($olddn);
607
-			$result = $this->add($dn, $info, $user);	// If record has been deleted from LDAP, we recreate it. We ignore error if it already exists.
608
-			$result = $this->modify($dn, $info, $user);	// We use add/modify instead of delete/add when olddn is received
607
+			$result = $this->add($dn, $info, $user); // If record has been deleted from LDAP, we recreate it. We ignore error if it already exists.
608
+			$result = $this->modify($dn, $info, $user); // We use add/modify instead of delete/add when olddn is received
609 609
 		}
610 610
 		if ($result <= 0)
611 611
 		{
612 612
 			$this->error = ldap_errno($this->connection)." ".ldap_error($this->connection)." ".$this->error;
613
-			dol_syslog(get_class($this)."::update ".$this->error,LOG_ERR);
613
+			dol_syslog(get_class($this)."::update ".$this->error, LOG_ERR);
614 614
 			//print_r($info);
615 615
 			return -1;
616 616
 		}
@@ -636,21 +636,21 @@  discard block
 block discarded – undo
636 636
 		dol_syslog(get_class($this)."::delete Delete LDAP entry dn=".$dn);
637 637
 
638 638
 		// Check parameters
639
-		if (! $this->connection)
639
+		if (!$this->connection)
640 640
 		{
641
-			$this->error="NotConnected";
641
+			$this->error = "NotConnected";
642 642
 			return -2;
643 643
 		}
644
-		if (! $this->bind)
644
+		if (!$this->bind)
645 645
 		{
646
-			$this->error="NotConnected";
646
+			$this->error = "NotConnected";
647 647
 			return -3;
648 648
 		}
649 649
 
650 650
 		// Encode to LDAP page code
651
-		$dn=$this->convFromOutputCharset($dn,$this->ldapcharset);
651
+		$dn = $this->convFromOutputCharset($dn, $this->ldapcharset);
652 652
 
653
-		$result=@ldap_delete($this->connection, $dn);
653
+		$result = @ldap_delete($this->connection, $dn);
654 654
 
655 655
 		if ($result) return 1;
656 656
 		return -1;
@@ -667,33 +667,33 @@  discard block
 block discarded – undo
667 667
 	function dump_content($dn, $info)
668 668
 	{
669 669
         // phpcs:enable
670
-		$content='';
670
+		$content = '';
671 671
 
672 672
 		// Create file content
673
-		if (preg_match('/^ldap/',$this->server[0]))
673
+		if (preg_match('/^ldap/', $this->server[0]))
674 674
 		{
675
-			$target="-H ".join(',',$this->server);
675
+			$target = "-H ".join(',', $this->server);
676 676
 		}
677 677
 		else
678 678
 		{
679
-			$target="-h ".join(',',$this->server)." -p ".$this->serverPort;
679
+			$target = "-h ".join(',', $this->server)." -p ".$this->serverPort;
680 680
 		}
681
-		$content.="# ldapadd $target -c -v -D ".$this->searchUser." -W -f ldapinput.in\n";
682
-		$content.="# ldapmodify $target -c -v -D ".$this->searchUser." -W -f ldapinput.in\n";
683
-		$content.="# ldapdelete $target -c -v -D ".$this->searchUser." -W -f ldapinput.in\n";
684
-		if (in_array('localhost',$this->server)) $content.="# If commands fails to connect, try without -h and -p\n";
685
-		$content.="dn: ".$dn."\n";
686
-		foreach($info as $key => $value)
681
+		$content .= "# ldapadd $target -c -v -D ".$this->searchUser." -W -f ldapinput.in\n";
682
+		$content .= "# ldapmodify $target -c -v -D ".$this->searchUser." -W -f ldapinput.in\n";
683
+		$content .= "# ldapdelete $target -c -v -D ".$this->searchUser." -W -f ldapinput.in\n";
684
+		if (in_array('localhost', $this->server)) $content .= "# If commands fails to connect, try without -h and -p\n";
685
+		$content .= "dn: ".$dn."\n";
686
+		foreach ($info as $key => $value)
687 687
 		{
688
-			if (! is_array($value))
688
+			if (!is_array($value))
689 689
 			{
690
-				$content.="$key: $value\n";
690
+				$content .= "$key: $value\n";
691 691
 			}
692 692
 			else
693 693
 			{
694
-				foreach($value as $valuekey => $valuevalue)
694
+				foreach ($value as $valuekey => $valuevalue)
695 695
 				{
696
-					$content.="$key: $valuevalue\n";
696
+					$content .= "$key: $valuevalue\n";
697 697
 				}
698 698
 			}
699 699
 		}
@@ -712,18 +712,18 @@  discard block
 block discarded – undo
712 712
 		global $conf;
713 713
 
714 714
 		// Create content
715
-		$content=$this->dump_content($dn, $info);
715
+		$content = $this->dump_content($dn, $info);
716 716
 
717 717
 		//Create file
718
-		$result=dol_mkdir($conf->ldap->dir_temp);
718
+		$result = dol_mkdir($conf->ldap->dir_temp);
719 719
 
720
-		$outputfile=$conf->ldap->dir_temp.'/ldapinput.in';
721
-		$fp=fopen($outputfile,"w");
720
+		$outputfile = $conf->ldap->dir_temp.'/ldapinput.in';
721
+		$fp = fopen($outputfile, "w");
722 722
 		if ($fp)
723 723
 		{
724 724
 			fputs($fp, $content);
725 725
 			fclose($fp);
726
-			if (! empty($conf->global->MAIN_UMASK))
726
+			if (!empty($conf->global->MAIN_UMASK))
727 727
 			@chmod($outputfile, octdec($conf->global->MAIN_UMASK));
728 728
 			return 1;
729 729
 		}
@@ -741,14 +741,14 @@  discard block
 block discarded – undo
741 741
 	 * @param int		$timeout		Timeout in second (default 1s)
742 742
 	 * @return boolean				true or false
743 743
 	 */
744
-	function serverPing($host, $port=389, $timeout=1)
744
+	function serverPing($host, $port = 389, $timeout = 1)
745 745
 	{
746 746
 		// Replace ldaps:// by ssl://
747
-		if (preg_match('/^ldaps:\/\/([^\/]+)\/?$/',$host, $regs)) {
747
+		if (preg_match('/^ldaps:\/\/([^\/]+)\/?$/', $host, $regs)) {
748 748
 			$host = 'ssl://'.$regs[1];
749 749
 		}
750 750
 		// Remove ldap://
751
-		if (preg_match('/^ldap:\/\/([^\/]+)\/?$/',$host, $regs)) {
751
+		if (preg_match('/^ldap:\/\/([^\/]+)\/?$/', $host, $regs)) {
752 752
 			$host = $regs[1];
753 753
 		}
754 754
 		$op = @fsockopen($host, $port, $errno, $errstr, $timeout);
@@ -775,31 +775,31 @@  discard block
 block discarded – undo
775 775
 	{
776 776
 		global $conf;
777 777
 
778
-		dol_syslog(get_class($this)."::addAttribute dn=".$dn." info=".join(',',$info));
778
+		dol_syslog(get_class($this)."::addAttribute dn=".$dn." info=".join(',', $info));
779 779
 
780 780
 		// Check parameters
781
-		if (! $this->connection)
781
+		if (!$this->connection)
782 782
 		{
783
-			$this->error="NotConnected";
783
+			$this->error = "NotConnected";
784 784
 			return -2;
785 785
 		}
786
-		if (! $this->bind)
786
+		if (!$this->bind)
787 787
 		{
788
-			$this->error="NotConnected";
788
+			$this->error = "NotConnected";
789 789
 			return -3;
790 790
 		}
791 791
 
792 792
 		// Encode to LDAP page code
793
-		$dn=$this->convFromOutputCharset($dn,$this->ldapcharset);
794
-		foreach($info as $key => $val)
793
+		$dn = $this->convFromOutputCharset($dn, $this->ldapcharset);
794
+		foreach ($info as $key => $val)
795 795
 		{
796
-			if (! is_array($val)) $info[$key]=$this->convFromOutputCharset($val,$this->ldapcharset);
796
+			if (!is_array($val)) $info[$key] = $this->convFromOutputCharset($val, $this->ldapcharset);
797 797
 		}
798 798
 
799
-		$this->dump($dn,$info);
799
+		$this->dump($dn, $info);
800 800
 
801 801
 		//print_r($info);
802
-		$result=@ldap_mod_add($this->connection, $dn, $info);
802
+		$result = @ldap_mod_add($this->connection, $dn, $info);
803 803
 
804 804
 		if ($result)
805 805
 		{
@@ -808,7 +808,7 @@  discard block
 block discarded – undo
808 808
 		}
809 809
 		else
810 810
 		{
811
-			$this->error=@ldap_error($this->connection);
811
+			$this->error = @ldap_error($this->connection);
812 812
 			dol_syslog(get_class($this)."::add_attribute failed: ".$this->error, LOG_ERR);
813 813
 			return -1;
814 814
 		}
@@ -827,31 +827,31 @@  discard block
 block discarded – undo
827 827
 	{
828 828
 		global $conf;
829 829
 
830
-		dol_syslog(get_class($this)."::updateAttribute dn=".$dn." info=".join(',',$info));
830
+		dol_syslog(get_class($this)."::updateAttribute dn=".$dn." info=".join(',', $info));
831 831
 
832 832
 		// Check parameters
833
-		if (! $this->connection)
833
+		if (!$this->connection)
834 834
 		{
835
-			$this->error="NotConnected";
835
+			$this->error = "NotConnected";
836 836
 			return -2;
837 837
 		}
838
-		if (! $this->bind)
838
+		if (!$this->bind)
839 839
 		{
840
-			$this->error="NotConnected";
840
+			$this->error = "NotConnected";
841 841
 			return -3;
842 842
 		}
843 843
 
844 844
 		// Encode to LDAP page code
845
-		$dn=$this->convFromOutputCharset($dn,$this->ldapcharset);
846
-		foreach($info as $key => $val)
845
+		$dn = $this->convFromOutputCharset($dn, $this->ldapcharset);
846
+		foreach ($info as $key => $val)
847 847
 		{
848
-			if (! is_array($val)) $info[$key]=$this->convFromOutputCharset($val,$this->ldapcharset);
848
+			if (!is_array($val)) $info[$key] = $this->convFromOutputCharset($val, $this->ldapcharset);
849 849
 		}
850 850
 
851
-		$this->dump($dn,$info);
851
+		$this->dump($dn, $info);
852 852
 
853 853
 		//print_r($info);
854
-		$result=@ldap_mod_replace($this->connection, $dn, $info);
854
+		$result = @ldap_mod_replace($this->connection, $dn, $info);
855 855
 
856 856
 		if ($result)
857 857
 		{
@@ -860,7 +860,7 @@  discard block
 block discarded – undo
860 860
 		}
861 861
 		else
862 862
 		{
863
-			$this->error=@ldap_error($this->connection);
863
+			$this->error = @ldap_error($this->connection);
864 864
 			dol_syslog(get_class($this)."::updateAttribute failed: ".$this->error, LOG_ERR);
865 865
 			return -1;
866 866
 		}
@@ -879,31 +879,31 @@  discard block
 block discarded – undo
879 879
 	{
880 880
 		global $conf;
881 881
 
882
-		dol_syslog(get_class($this)."::deleteAttribute dn=".$dn." info=".join(',',$info));
882
+		dol_syslog(get_class($this)."::deleteAttribute dn=".$dn." info=".join(',', $info));
883 883
 
884 884
 		// Check parameters
885
-		if (! $this->connection)
885
+		if (!$this->connection)
886 886
 		{
887
-			$this->error="NotConnected";
887
+			$this->error = "NotConnected";
888 888
 			return -2;
889 889
 		}
890
-		if (! $this->bind)
890
+		if (!$this->bind)
891 891
 		{
892
-			$this->error="NotConnected";
892
+			$this->error = "NotConnected";
893 893
 			return -3;
894 894
 		}
895 895
 
896 896
 		// Encode to LDAP page code
897
-		$dn=$this->convFromOutputCharset($dn,$this->ldapcharset);
898
-		foreach($info as $key => $val)
897
+		$dn = $this->convFromOutputCharset($dn, $this->ldapcharset);
898
+		foreach ($info as $key => $val)
899 899
 		{
900
-			if (! is_array($val)) $info[$key]=$this->convFromOutputCharset($val,$this->ldapcharset);
900
+			if (!is_array($val)) $info[$key] = $this->convFromOutputCharset($val, $this->ldapcharset);
901 901
 		}
902 902
 
903
-		$this->dump($dn,$info);
903
+		$this->dump($dn, $info);
904 904
 
905 905
 		//print_r($info);
906
-		$result=@ldap_mod_del($this->connection, $dn, $info);
906
+		$result = @ldap_mod_del($this->connection, $dn, $info);
907 907
 
908 908
 		if ($result)
909 909
 		{
@@ -912,7 +912,7 @@  discard block
 block discarded – undo
912 912
 		}
913 913
 		else
914 914
 		{
915
-			$this->error=@ldap_error($this->connection);
915
+			$this->error = @ldap_error($this->connection);
916 916
 			dol_syslog(get_class($this)."::deleteAttribute failed: ".$this->error, LOG_ERR);
917 917
 			return -1;
918 918
 		}
@@ -925,21 +925,21 @@  discard block
 block discarded – undo
925 925
 	 *	@param	string	$filter		Filter
926 926
 	 *	@return	int|array			<0 or false if KO, array if OK
927 927
 	 */
928
-	function getAttribute($dn,$filter)
928
+	function getAttribute($dn, $filter)
929 929
 	{
930 930
 		// Check parameters
931
-		if (! $this->connection)
931
+		if (!$this->connection)
932 932
 		{
933
-			$this->error="NotConnected";
933
+			$this->error = "NotConnected";
934 934
 			return -2;
935 935
 		}
936
-		if (! $this->bind)
936
+		if (!$this->bind)
937 937
 		{
938
-			$this->error="NotConnected";
938
+			$this->error = "NotConnected";
939 939
 			return -3;
940 940
 		}
941 941
 
942
-		$search = ldap_search($this->connection,$dn,$filter);
942
+		$search = ldap_search($this->connection, $dn, $filter);
943 943
 
944 944
 		// Only one entry should ever be returned
945 945
 		$entry = ldap_first_entry($this->connection, $search);
@@ -948,11 +948,11 @@  discard block
 block discarded – undo
948 948
 		{
949 949
 			$this->ldapErrorCode = -1;
950 950
 			$this->ldapErrorText = "Couldn't find entry";
951
-			return 0;  // Couldn't find entry...
951
+			return 0; // Couldn't find entry...
952 952
 		}
953 953
 
954 954
 		// Get values
955
-		if (! $values = ldap_get_attributes($this->connection, $entry))
955
+		if (!$values = ldap_get_attributes($this->connection, $entry))
956 956
 		{
957 957
 			$this->ldapErrorCode = ldap_errno($this->connection);
958 958
 			$this->ldapErrorText = ldap_error($this->connection);
@@ -970,13 +970,13 @@  discard block
 block discarded – undo
970 970
 	 * 	@param	string	$attribute			Attributes
971 971
 	 * 	@return void
972 972
 	 */
973
-	function getAttributeValues($filterrecord,$attribute)
973
+	function getAttributeValues($filterrecord, $attribute)
974 974
 	{
975
-		$attributes=array();
975
+		$attributes = array();
976 976
 		$attributes[0] = $attribute;
977 977
 
978 978
 		// We need to search for this user in order to get their entry.
979
-		$this->result = @ldap_search($this->connection,$this->people,$filterrecord,$attributes);
979
+		$this->result = @ldap_search($this->connection, $this->people, $filterrecord, $attributes);
980 980
 
981 981
 		// Pourquoi cette ligne ?
982 982
 		//$info = ldap_get_entries($this->connection, $this->result);
@@ -988,11 +988,11 @@  discard block
 block discarded – undo
988 988
 		{
989 989
 			$this->ldapErrorCode = -1;
990 990
 			$this->ldapErrorText = "Couldn't find user";
991
-			return false;  // Couldn't find the user...
991
+			return false; // Couldn't find the user...
992 992
 		}
993 993
 
994 994
 		// Get values
995
-		if (! $values = @ldap_get_values($this->connection, $entry, $attribute))
995
+		if (!$values = @ldap_get_values($this->connection, $entry, $attribute))
996 996
 		{
997 997
 			$this->ldapErrorCode = ldap_errno($this->connection);
998 998
 			$this->ldapErrorText = ldap_error($this->connection);
@@ -1015,11 +1015,11 @@  discard block
 block discarded – undo
1015 1015
 	 *	@param	array	$attributeAsArray 	Array of fields wanted as an array not a string
1016 1016
 	 *	@return	array						Array of [id_record][ldap_field]=value
1017 1017
 	 */
1018
-	function getRecords($search, $userDn, $useridentifier, $attributeArray, $activefilter=0, $attributeAsArray=array())
1018
+	function getRecords($search, $userDn, $useridentifier, $attributeArray, $activefilter = 0, $attributeAsArray = array())
1019 1019
 	{
1020
-		$fulllist=array();
1020
+		$fulllist = array();
1021 1021
 
1022
-		dol_syslog(get_class($this)."::getRecords search=".$search." userDn=".$userDn." useridentifier=".$useridentifier." attributeArray=array(".join(',',$attributeArray).") activefilter=".$activefilter);
1022
+		dol_syslog(get_class($this)."::getRecords search=".$search." userDn=".$userDn." useridentifier=".$useridentifier." attributeArray=array(".join(',', $attributeArray).") activefilter=".$activefilter);
1023 1023
 
1024 1024
 		// if the directory is AD, then bind first with the search user first
1025 1025
 		if ($this->serverType == "activedirectory")
@@ -1029,7 +1029,7 @@  discard block
 block discarded – undo
1029 1029
 		}
1030 1030
 
1031 1031
 		// Define filter
1032
-		if (! empty($activefilter))
1032
+		if (!empty($activefilter))
1033 1033
 		{
1034 1034
 			if (((string) $activefilter == '1' || (string) $activefilter == 'user') && $this->filter)
1035 1035
 			{
@@ -1052,8 +1052,8 @@  discard block
 block discarded – undo
1052 1052
 		if (is_array($attributeArray))
1053 1053
 		{
1054 1054
 			// Return list with required fields
1055
-			$attributeArray=array_values($attributeArray);	// This is to force to have index reordered from 0 (not make ldap_search fails)
1056
-			dol_syslog(get_class($this)."::getRecords connection=".$this->connection." userDn=".$userDn." filter=".$filter. " attributeArray=(".join(',',$attributeArray).")");
1055
+			$attributeArray = array_values($attributeArray); // This is to force to have index reordered from 0 (not make ldap_search fails)
1056
+			dol_syslog(get_class($this)."::getRecords connection=".$this->connection." userDn=".$userDn." filter=".$filter." attributeArray=(".join(',', $attributeArray).")");
1057 1057
 			//var_dump($attributeArray);
1058 1058
 			$this->result = @ldap_search($this->connection, $userDn, $filter, $attributeArray);
1059 1059
 		}
@@ -1077,35 +1077,35 @@  discard block
 block discarded – undo
1077 1077
 
1078 1078
 		for ($i = 0; $i < $info["count"]; $i++)
1079 1079
 		{
1080
-			$recordid=$this->convToOutputCharset($info[$i][$useridentifier][0],$this->ldapcharset);
1080
+			$recordid = $this->convToOutputCharset($info[$i][$useridentifier][0], $this->ldapcharset);
1081 1081
 			if ($recordid)
1082 1082
 			{
1083 1083
 				//print "Found record with key $useridentifier=".$recordid."<br>\n";
1084
-				$fulllist[$recordid][$useridentifier]=$recordid;
1084
+				$fulllist[$recordid][$useridentifier] = $recordid;
1085 1085
 
1086 1086
 				// Add to the array for each attribute in my list
1087 1087
 				$num = count($attributeArray);
1088 1088
 				for ($j = 0; $j < $num; $j++)
1089 1089
 				{
1090
-					$keyattributelower=strtolower($attributeArray[$j]);
1090
+					$keyattributelower = strtolower($attributeArray[$j]);
1091 1091
 					//print " Param ".$attributeArray[$j]."=".$info[$i][$keyattributelower][0]."<br>\n";
1092 1092
 
1093 1093
 					//permet de recuperer le SID avec Active Directory
1094 1094
 					if ($this->serverType == "activedirectory" && $keyattributelower == "objectsid")
1095 1095
 					{
1096 1096
 						$objectsid = $this->getObjectSid($recordid);
1097
-						$fulllist[$recordid][$attributeArray[$j]]    = $objectsid;
1097
+						$fulllist[$recordid][$attributeArray[$j]] = $objectsid;
1098 1098
 					}
1099 1099
 					else
1100 1100
 					{
1101
-						if(in_array($attributeArray[$j], $attributeAsArray) && is_array($info[$i][$keyattributelower])) {
1101
+						if (in_array($attributeArray[$j], $attributeAsArray) && is_array($info[$i][$keyattributelower])) {
1102 1102
 							$valueTab = array();
1103
-							foreach($info[$i][$keyattributelower] as $key => $value) {
1104
-								$valueTab[$key] = $this->convToOutputCharset($value,$this->ldapcharset);
1103
+							foreach ($info[$i][$keyattributelower] as $key => $value) {
1104
+								$valueTab[$key] = $this->convToOutputCharset($value, $this->ldapcharset);
1105 1105
 							}
1106 1106
 							$fulllist[$recordid][$attributeArray[$j]] = $valueTab;
1107 1107
 						} else {
1108
-							$fulllist[$recordid][$attributeArray[$j]] = $this->convToOutputCharset($info[$i][$keyattributelower][0],$this->ldapcharset);
1108
+							$fulllist[$recordid][$attributeArray[$j]] = $this->convToOutputCharset($info[$i][$keyattributelower][0], $this->ldapcharset);
1109 1109
 						}
1110 1110
 					}
1111 1111
 				}
@@ -1125,8 +1125,8 @@  discard block
 block discarded – undo
1125 1125
 	 */
1126 1126
 	function littleEndian($hex)
1127 1127
 	{
1128
-		for ($x=dol_strlen($hex)-2; $x >= 0; $x=$x-2) {
1129
-			$result .= substr($hex,$x,2);
1128
+		for ($x = dol_strlen($hex) - 2; $x >= 0; $x = $x - 2) {
1129
+			$result .= substr($hex, $x, 2);
1130 1130
 		}
1131 1131
 		return $result;
1132 1132
 	}
@@ -1141,7 +1141,7 @@  discard block
 block discarded – undo
1141 1141
 	 */
1142 1142
 	function getObjectSid($ldapUser)
1143 1143
 	{
1144
-		$criteria =  '('.$this->getUserIdentifier().'='.$ldapUser.')';
1144
+		$criteria = '('.$this->getUserIdentifier().'='.$ldapUser.')';
1145 1145
 		$justthese = array("objectsid");
1146 1146
 
1147 1147
 		// if the directory is AD, then bind first with the search user first
@@ -1200,14 +1200,14 @@  discard block
 block discarded – undo
1200 1200
 	 */
1201 1201
 	function binSIDtoText($binsid)
1202 1202
 	{
1203
-		$hex_sid=bin2hex($binsid);
1204
-		$rev = hexdec(substr($hex_sid,0,2));          // Get revision-part of SID
1205
-		$subcount = hexdec(substr($hex_sid,2,2));    // Get count of sub-auth entries
1206
-		$auth = hexdec(substr($hex_sid,4,12));      // SECURITY_NT_AUTHORITY
1203
+		$hex_sid = bin2hex($binsid);
1204
+		$rev = hexdec(substr($hex_sid, 0, 2)); // Get revision-part of SID
1205
+		$subcount = hexdec(substr($hex_sid, 2, 2)); // Get count of sub-auth entries
1206
+		$auth = hexdec(substr($hex_sid, 4, 12)); // SECURITY_NT_AUTHORITY
1207 1207
 		$result = "$rev-$auth";
1208
-		for ($x=0;$x < $subcount; $x++)
1208
+		for ($x = 0; $x < $subcount; $x++)
1209 1209
 		{
1210
-			$result .= "-".hexdec($this->littleEndian(substr($hex_sid,16+($x*8),8)));  // get all SECURITY_NT_AUTHORITY
1210
+			$result .= "-".hexdec($this->littleEndian(substr($hex_sid, 16 + ($x * 8), 8))); // get all SECURITY_NT_AUTHORITY
1211 1211
 		}
1212 1212
 		return $result;
1213 1213
 	}
@@ -1228,8 +1228,8 @@  discard block
 block discarded – undo
1228 1228
 	{
1229 1229
 		dol_syslog(get_class($this)."::search checkDn=".$checkDn." filter=".$filter);
1230 1230
 
1231
-		$checkDn=$this->convFromOutputCharset($checkDn,$this->ldapcharset);
1232
-		$filter=$this->convFromOutputCharset($filter,$this->ldapcharset);
1231
+		$checkDn = $this->convFromOutputCharset($checkDn, $this->ldapcharset);
1232
+		$filter = $this->convFromOutputCharset($filter, $this->ldapcharset);
1233 1233
 
1234 1234
 		// if the directory is AD, then bind first with the search user first
1235 1235
 		if ($this->serverType == "activedirectory") {
@@ -1239,7 +1239,7 @@  discard block
 block discarded – undo
1239 1239
 		$this->result = @ldap_search($this->connection, $checkDn, $filter);
1240 1240
 
1241 1241
 		$result = @ldap_get_entries($this->connection, $this->result);
1242
-		if (! $result)
1242
+		if (!$result)
1243 1243
 		{
1244 1244
 			$this->error = ldap_errno($this->connection)." ".ldap_error($this->connection);
1245 1245
 			return -1;
@@ -1260,7 +1260,7 @@  discard block
 block discarded – undo
1260 1260
 	 *                       	       	Examples: &(objectClass=inetOrgPerson) &(objectClass=user)(objectCategory=person) &(isMemberOf=cn=Sales,ou=Groups,dc=opencsi,dc=com)
1261 1261
 	 *		@return	int					>0 if OK, <0 if KO
1262 1262
 	 */
1263
-	function fetch($user,$filter)
1263
+	function fetch($user, $filter)
1264 1264
 	{
1265 1265
 		// Perform the search and get the entry handles
1266 1266
 
@@ -1269,10 +1269,10 @@  discard block
 block discarded – undo
1269 1269
 			$this->bindauth($this->searchUser, $this->searchPassword);
1270 1270
 		}
1271 1271
 
1272
-		$searchDN = $this->people;    // TODO Why searching in people then domain ?
1272
+		$searchDN = $this->people; // TODO Why searching in people then domain ?
1273 1273
 
1274 1274
 		$result = '';
1275
-		$i=0;
1275
+		$i = 0;
1276 1276
 		while ($i <= 2)
1277 1277
 		{
1278 1278
 			dol_syslog(get_class($this)."::fetch search with searchDN=".$searchDN." filter=".$filter);
@@ -1291,7 +1291,7 @@  discard block
 block discarded – undo
1291 1291
 				return -1;
1292 1292
 			}
1293 1293
 
1294
-			if (! $result)
1294
+			if (!$result)
1295 1295
 			{
1296 1296
 				// Si pas de resultat on cherche dans le domaine
1297 1297
 				$searchDN = $this->domain;
@@ -1303,42 +1303,42 @@  discard block
 block discarded – undo
1303 1303
 			}
1304 1304
 		}
1305 1305
 
1306
-		if (! $result)
1306
+		if (!$result)
1307 1307
 		{
1308 1308
 			$this->error = ldap_errno($this->connection)." ".ldap_error($this->connection);
1309 1309
 			return -1;
1310 1310
 		}
1311 1311
 		else
1312 1312
 		{
1313
-			$this->name       = $this->convToOutputCharset($result[0][$this->attr_name][0],$this->ldapcharset);
1314
-			$this->firstname  = $this->convToOutputCharset($result[0][$this->attr_firstname][0],$this->ldapcharset);
1315
-			$this->login      = $this->convToOutputCharset($result[0][$this->attr_login][0],$this->ldapcharset);
1316
-			$this->phone      = $this->convToOutputCharset($result[0][$this->attr_phone][0],$this->ldapcharset);
1317
-			$this->skype      = $this->convToOutputCharset($result[0][$this->attr_skype][0],$this->ldapcharset);
1318
-			$this->fax        = $this->convToOutputCharset($result[0][$this->attr_fax][0],$this->ldapcharset);
1319
-			$this->mail       = $this->convToOutputCharset($result[0][$this->attr_mail][0],$this->ldapcharset);
1320
-			$this->mobile     = $this->convToOutputCharset($result[0][$this->attr_mobile][0],$this->ldapcharset);
1313
+			$this->name       = $this->convToOutputCharset($result[0][$this->attr_name][0], $this->ldapcharset);
1314
+			$this->firstname  = $this->convToOutputCharset($result[0][$this->attr_firstname][0], $this->ldapcharset);
1315
+			$this->login      = $this->convToOutputCharset($result[0][$this->attr_login][0], $this->ldapcharset);
1316
+			$this->phone      = $this->convToOutputCharset($result[0][$this->attr_phone][0], $this->ldapcharset);
1317
+			$this->skype      = $this->convToOutputCharset($result[0][$this->attr_skype][0], $this->ldapcharset);
1318
+			$this->fax        = $this->convToOutputCharset($result[0][$this->attr_fax][0], $this->ldapcharset);
1319
+			$this->mail       = $this->convToOutputCharset($result[0][$this->attr_mail][0], $this->ldapcharset);
1320
+			$this->mobile     = $this->convToOutputCharset($result[0][$this->attr_mobile][0], $this->ldapcharset);
1321 1321
 
1322
-			$this->uacf       = $this->parseUACF($this->convToOutputCharset($result[0]["useraccountcontrol"][0],$this->ldapcharset));
1322
+			$this->uacf       = $this->parseUACF($this->convToOutputCharset($result[0]["useraccountcontrol"][0], $this->ldapcharset));
1323 1323
 			if (isset($result[0]["pwdlastset"][0]))	// If expiration on password exists
1324 1324
 			{
1325
-				$this->pwdlastset = ($result[0]["pwdlastset"][0] != 0)?$this->convert_time($this->convToOutputCharset($result[0]["pwdlastset"][0],$this->ldapcharset)):0;
1325
+				$this->pwdlastset = ($result[0]["pwdlastset"][0] != 0) ? $this->convert_time($this->convToOutputCharset($result[0]["pwdlastset"][0], $this->ldapcharset)) : 0;
1326 1326
 			}
1327 1327
 			else
1328 1328
 			{
1329 1329
 				$this->pwdlastset = -1;
1330 1330
 			}
1331 1331
 			if (!$this->name && !$this->login) $this->pwdlastset = -1;
1332
-			$this->badpwdtime = $this->convert_time($this->convToOutputCharset($result[0]["badpasswordtime"][0],$this->ldapcharset));
1332
+			$this->badpwdtime = $this->convert_time($this->convToOutputCharset($result[0]["badpasswordtime"][0], $this->ldapcharset));
1333 1333
 
1334 1334
 			// FQDN domain
1335
-			$domain = str_replace('dc=','',$this->domain);
1336
-			$domain = str_replace(',','.',$domain);
1335
+			$domain = str_replace('dc=', '', $this->domain);
1336
+			$domain = str_replace(',', '.', $domain);
1337 1337
 			$this->domainFQDN = $domain;
1338 1338
 
1339 1339
 			// Set ldapUserDn (each user can have a different dn)
1340 1340
 			//var_dump($result[0]);exit;
1341
-			$this->ldapUserDN=$result[0]['dn'];
1341
+			$this->ldapUserDN = $result[0]['dn'];
1342 1342
 
1343 1343
 			ldap_free_result($this->result);
1344 1344
 			return 1;
@@ -1433,7 +1433,7 @@  discard block
 block discarded – undo
1433 1433
 				break;
1434 1434
 			}
1435 1435
 		}
1436
-		if (empty($retval)) $retval = "UNKNOWN_TYPE_" . $samtype;
1436
+		if (empty($retval)) $retval = "UNKNOWN_TYPE_".$samtype;
1437 1437
 
1438 1438
 		return($retval);
1439 1439
 	}
@@ -1448,10 +1448,10 @@  discard block
 block discarded – undo
1448 1448
 	function convert_time($value)
1449 1449
 	{
1450 1450
         // phpcs:enable
1451
-		$dateLargeInt=$value; // nano secondes depuis 1601 !!!!
1451
+		$dateLargeInt = $value; // nano secondes depuis 1601 !!!!
1452 1452
 		$secsAfterADEpoch = $dateLargeInt / (10000000); // secondes depuis le 1 jan 1601
1453
-		$ADToUnixConvertor=((1970-1601) * 365.242190) * 86400; // UNIX start date - AD start date * jours * secondes
1454
-		$unixTimeStamp=intval($secsAfterADEpoch-$ADToUnixConvertor); // Unix time stamp
1453
+		$ADToUnixConvertor = ((1970 - 1601) * 365.242190) * 86400; // UNIX start date - AD start date * jours * secondes
1454
+		$unixTimeStamp = intval($secsAfterADEpoch - $ADToUnixConvertor); // Unix time stamp
1455 1455
 		return $unixTimeStamp;
1456 1456
 	}
1457 1457
 
@@ -1463,11 +1463,11 @@  discard block
 block discarded – undo
1463 1463
 	 *  @param	string	$pagecodefrom	Page code of src string
1464 1464
 	 *  @return string         			Converted string
1465 1465
 	 */
1466
-	private function convToOutputCharset($str,$pagecodefrom='UTF-8')
1466
+	private function convToOutputCharset($str, $pagecodefrom = 'UTF-8')
1467 1467
 	{
1468 1468
 		global $conf;
1469
-		if ($pagecodefrom == 'ISO-8859-1' && $conf->file->character_set_client == 'UTF-8')  $str=utf8_encode($str);
1470
-		if ($pagecodefrom == 'UTF-8' && $conf->file->character_set_client == 'ISO-8859-1')  $str=utf8_decode($str);
1469
+		if ($pagecodefrom == 'ISO-8859-1' && $conf->file->character_set_client == 'UTF-8')  $str = utf8_encode($str);
1470
+		if ($pagecodefrom == 'UTF-8' && $conf->file->character_set_client == 'ISO-8859-1')  $str = utf8_decode($str);
1471 1471
 		return $str;
1472 1472
 	}
1473 1473
 
@@ -1478,11 +1478,11 @@  discard block
 block discarded – undo
1478 1478
 	 *  @param	string	$pagecodeto		Page code for result string
1479 1479
 	 *  @return string         			Converted string
1480 1480
 	 */
1481
-	function convFromOutputCharset($str,$pagecodeto='UTF-8')
1481
+	function convFromOutputCharset($str, $pagecodeto = 'UTF-8')
1482 1482
 	{
1483 1483
 		global $conf;
1484
-		if ($pagecodeto == 'ISO-8859-1' && $conf->file->character_set_client == 'UTF-8') $str=utf8_decode($str);
1485
-		if ($pagecodeto == 'UTF-8' && $conf->file->character_set_client == 'ISO-8859-1') $str=utf8_encode($str);
1484
+		if ($pagecodeto == 'ISO-8859-1' && $conf->file->character_set_client == 'UTF-8') $str = utf8_decode($str);
1485
+		if ($pagecodeto == 'UTF-8' && $conf->file->character_set_client == 'ISO-8859-1') $str = utf8_encode($str);
1486 1486
 		return $str;
1487 1487
 	}
1488 1488
 
@@ -1493,25 +1493,25 @@  discard block
 block discarded – undo
1493 1493
 	 *	@param	string	$keygroup	Key of group
1494 1494
 	 *	@return	int					gid number
1495 1495
 	 */
1496
-	function getNextGroupGid($keygroup='LDAP_KEY_GROUPS')
1496
+	function getNextGroupGid($keygroup = 'LDAP_KEY_GROUPS')
1497 1497
 	{
1498 1498
 		global $conf;
1499 1499
 
1500
-		if (empty($keygroup)) $keygroup='LDAP_KEY_GROUPS';
1500
+		if (empty($keygroup)) $keygroup = 'LDAP_KEY_GROUPS';
1501 1501
 
1502
-		$search='('.$conf->global->$keygroup.'=*)';
1503
-		$result = $this->search($this->groups,$search);
1502
+		$search = '('.$conf->global->$keygroup.'=*)';
1503
+		$result = $this->search($this->groups, $search);
1504 1504
 		if ($result)
1505 1505
 		{
1506 1506
 			$c = $result['count'];
1507 1507
 			$gids = array();
1508
-			for($i=0;$i<$c;$i++)
1508
+			for ($i = 0; $i < $c; $i++)
1509 1509
 			{
1510 1510
 				$gids[] = $result[$i]['gidnumber'][0];
1511 1511
 			}
1512 1512
 			rsort($gids);
1513 1513
 
1514
-			return $gids[0]+1;
1514
+			return $gids[0] + 1;
1515 1515
 		}
1516 1516
 
1517 1517
 		return 0;
Please login to merge, or discard this patch.
Braces   +109 added lines, -90 removed lines patch added patch discarded remove patch
@@ -118,8 +118,12 @@  discard block
 block discarded – undo
118 118
 		global $conf;
119 119
 
120 120
 		// Server
121
-		if (! empty($conf->global->LDAP_SERVER_HOST))       $this->server[] = $conf->global->LDAP_SERVER_HOST;
122
-		if (! empty($conf->global->LDAP_SERVER_HOST_SLAVE)) $this->server[] = $conf->global->LDAP_SERVER_HOST_SLAVE;
121
+		if (! empty($conf->global->LDAP_SERVER_HOST)) {
122
+		    $this->server[] = $conf->global->LDAP_SERVER_HOST;
123
+		}
124
+		if (! empty($conf->global->LDAP_SERVER_HOST_SLAVE)) {
125
+		    $this->server[] = $conf->global->LDAP_SERVER_HOST_SLAVE;
126
+		}
123 127
 		$this->serverPort          = $conf->global->LDAP_SERVER_PORT;
124 128
 		$this->ldapProtocolVersion = $conf->global->LDAP_SERVER_PROTOCOLVERSION;
125 129
 		$this->dn                  = $conf->global->LDAP_SERVER_DN;
@@ -185,13 +189,18 @@  discard block
 block discarded – undo
185 189
 			// Loop on each ldap server
186 190
 			foreach ($this->server as $key => $host)
187 191
 			{
188
-				if ($connected) break;
189
-				if (empty($host)) continue;
192
+				if ($connected) {
193
+				    break;
194
+				}
195
+				if (empty($host)) {
196
+				    continue;
197
+				}
190 198
 
191 199
 				if ($this->serverPing($host, $this->serverPort) === true) {
192 200
 					$this->connection = ldap_connect($host, $this->serverPort);
201
+				} else {
202
+				    continue;
193 203
 				}
194
-				else continue;
195 204
 
196 205
 				if (is_resource($this->connection))
197 206
 				{
@@ -221,13 +230,11 @@  discard block
 block discarded – undo
221 230
 							$this->bind=$this->result;
222 231
 							$connected=2;
223 232
 							break;
224
-						}
225
-						else
233
+						} else
226 234
 						{
227 235
 							$this->error=ldap_errno($this->connection).' '.ldap_error($this->connection);
228 236
 						}
229
-					}
230
-					else
237
+					} else
231 238
 					{
232 239
 						// Try in auth mode
233 240
 						if ($this->searchUser && $this->searchPassword)
@@ -239,8 +246,7 @@  discard block
 block discarded – undo
239 246
 								$this->bind=$this->result;
240 247
 								$connected=2;
241 248
 								break;
242
-							}
243
-							else
249
+							} else
244 250
 							{
245 251
 								$this->error=ldap_errno($this->connection).' '.ldap_error($this->connection);
246 252
 							}
@@ -255,8 +261,7 @@  discard block
 block discarded – undo
255 261
 								$this->bind=$this->result;
256 262
 								$connected=1;
257 263
 								break;
258
-							}
259
-							else
264
+							} else
260 265
 							{
261 266
 								$this->error=ldap_errno($this->connection).' '.ldap_error($this->connection);
262 267
 							}
@@ -264,7 +269,9 @@  discard block
 block discarded – undo
264 269
 					}
265 270
 				}
266 271
 
267
-				if (! $connected) $this->close();
272
+				if (! $connected) {
273
+				    $this->close();
274
+				}
268 275
 			}
269 276
 		}
270 277
 
@@ -272,8 +279,7 @@  discard block
 block discarded – undo
272 279
 		{
273 280
 			$return=$connected;
274 281
 			dol_syslog(get_class($this)."::connect_bind return=".$return, LOG_DEBUG);
275
-		}
276
-		else
282
+		} else
277 283
 		{
278 284
 			$this->error='Failed to connect to LDAP'.($this->error?': '.$this->error:'');
279 285
 			$return=-1;
@@ -295,8 +301,7 @@  discard block
 block discarded – undo
295 301
 		if ($this->connection && ! @ldap_close($this->connection))
296 302
 		{
297 303
 			return false;
298
-		}
299
-		else
304
+		} else
300 305
 		{
301 306
 			return true;
302 307
 		}
@@ -316,8 +321,7 @@  discard block
 block discarded – undo
316 321
 			$this->ldapErrorText = ldap_error($this->connection);
317 322
 			$this->error=$this->ldapErrorCode." ".$this->ldapErrorText;
318 323
 			return false;
319
-		}
320
-		else
324
+		} else
321 325
 		{
322 326
 			return true;
323 327
 		}
@@ -341,8 +345,7 @@  discard block
 block discarded – undo
341 345
 			$this->ldapErrorText = ldap_error($this->connection);
342 346
 			$this->error=$this->ldapErrorCode." ".$this->ldapErrorText;
343 347
 			return false;
344
-		}
345
-		else
348
+		} else
346 349
 		{
347 350
 			return true;
348 351
 		}
@@ -432,7 +435,9 @@  discard block
 block discarded – undo
432 435
 		$dn=$this->convFromOutputCharset($dn,$this->ldapcharset);
433 436
 		foreach($info as $key => $val)
434 437
 		{
435
-			if (! is_array($val)) $info[$key]=$this->convFromOutputCharset($val,$this->ldapcharset);
438
+			if (! is_array($val)) {
439
+			    $info[$key]=$this->convFromOutputCharset($val,$this->ldapcharset);
440
+			}
436 441
 		}
437 442
 
438 443
 		$this->dump($dn,$info);
@@ -444,8 +449,7 @@  discard block
 block discarded – undo
444 449
 		{
445 450
 			dol_syslog(get_class($this)."::add successfull", LOG_DEBUG);
446 451
 			return 1;
447
-		}
448
-		else
452
+		} else
449 453
 		{
450 454
 			$this->ldapErrorCode = @ldap_errno($this->connection);
451 455
 			$this->ldapErrorText = @ldap_error($this->connection);
@@ -486,7 +490,9 @@  discard block
 block discarded – undo
486 490
 		$dn=$this->convFromOutputCharset($dn,$this->ldapcharset);
487 491
 		foreach($info as $key => $val)
488 492
 		{
489
-			if (! is_array($val)) $info[$key]=$this->convFromOutputCharset($val,$this->ldapcharset);
493
+			if (! is_array($val)) {
494
+			    $info[$key]=$this->convFromOutputCharset($val,$this->ldapcharset);
495
+			}
490 496
 		}
491 497
 
492 498
 		$this->dump($dn,$info);
@@ -498,8 +504,7 @@  discard block
 block discarded – undo
498 504
 		{
499 505
 			dol_syslog(get_class($this)."::modify successfull", LOG_DEBUG);
500 506
 			return 1;
501
-		}
502
-		else
507
+		} else
503 508
 		{
504 509
 			$this->error=@ldap_error($this->connection);
505 510
 			dol_syslog(get_class($this)."::modify failed: ".$this->error, LOG_ERR);
@@ -548,8 +553,7 @@  discard block
 block discarded – undo
548 553
 		{
549 554
 			dol_syslog(get_class($this)."::rename successfull", LOG_DEBUG);
550 555
 			return 1;
551
-		}
552
-		else
556
+		} else
553 557
 		{
554 558
 			$this->error=@ldap_error($this->connection);
555 559
 			dol_syslog(get_class($this)."::rename failed: ".$this->error, LOG_ERR);
@@ -593,15 +597,16 @@  discard block
 block discarded – undo
593 597
 			{
594 598
 				// This function currently only works with LDAPv3
595 599
 				$result = $this->rename($olddn, $newrdn, $newparent, $user, true);
596
-			}
597
-			else
600
+			} else
598 601
 			{
599 602
 				// If change we make is rename the key of LDAP record, we create new one and if ok, we delete old one.
600 603
 				$result = $this->add($dn, $info, $user);
601
-				if ($result > 0 && $olddn && $olddn != $dn) $result = $this->delete($olddn);	// If add fails, we do not try to delete old one
604
+				if ($result > 0 && $olddn && $olddn != $dn) {
605
+				    $result = $this->delete($olddn);
606
+				}
607
+				// If add fails, we do not try to delete old one
602 608
 			}
603
-		}
604
-		else
609
+		} else
605 610
 		{
606 611
 			//$result = $this->delete($olddn);
607 612
 			$result = $this->add($dn, $info, $user);	// If record has been deleted from LDAP, we recreate it. We ignore error if it already exists.
@@ -613,8 +618,7 @@  discard block
 block discarded – undo
613 618
 			dol_syslog(get_class($this)."::update ".$this->error,LOG_ERR);
614 619
 			//print_r($info);
615 620
 			return -1;
616
-		}
617
-		else
621
+		} else
618 622
 		{
619 623
 			dol_syslog(get_class($this)."::update done successfully");
620 624
 			return 1;
@@ -652,7 +656,9 @@  discard block
 block discarded – undo
652 656
 
653 657
 		$result=@ldap_delete($this->connection, $dn);
654 658
 
655
-		if ($result) return 1;
659
+		if ($result) {
660
+		    return 1;
661
+		}
656 662
 		return -1;
657 663
 	}
658 664
 
@@ -673,23 +679,23 @@  discard block
 block discarded – undo
673 679
 		if (preg_match('/^ldap/',$this->server[0]))
674 680
 		{
675 681
 			$target="-H ".join(',',$this->server);
676
-		}
677
-		else
682
+		} else
678 683
 		{
679 684
 			$target="-h ".join(',',$this->server)." -p ".$this->serverPort;
680 685
 		}
681 686
 		$content.="# ldapadd $target -c -v -D ".$this->searchUser." -W -f ldapinput.in\n";
682 687
 		$content.="# ldapmodify $target -c -v -D ".$this->searchUser." -W -f ldapinput.in\n";
683 688
 		$content.="# ldapdelete $target -c -v -D ".$this->searchUser." -W -f ldapinput.in\n";
684
-		if (in_array('localhost',$this->server)) $content.="# If commands fails to connect, try without -h and -p\n";
689
+		if (in_array('localhost',$this->server)) {
690
+		    $content.="# If commands fails to connect, try without -h and -p\n";
691
+		}
685 692
 		$content.="dn: ".$dn."\n";
686 693
 		foreach($info as $key => $value)
687 694
 		{
688 695
 			if (! is_array($value))
689 696
 			{
690 697
 				$content.="$key: $value\n";
691
-			}
692
-			else
698
+			} else
693 699
 			{
694 700
 				foreach($value as $valuekey => $valuevalue)
695 701
 				{
@@ -723,11 +729,11 @@  discard block
 block discarded – undo
723 729
 		{
724 730
 			fputs($fp, $content);
725 731
 			fclose($fp);
726
-			if (! empty($conf->global->MAIN_UMASK))
727
-			@chmod($outputfile, octdec($conf->global->MAIN_UMASK));
732
+			if (! empty($conf->global->MAIN_UMASK)) {
733
+						@chmod($outputfile, octdec($conf->global->MAIN_UMASK));
734
+			}
728 735
 			return 1;
729
-		}
730
-		else
736
+		} else
731 737
 		{
732 738
 			return -1;
733 739
 		}
@@ -752,7 +758,10 @@  discard block
 block discarded – undo
752 758
 			$host = $regs[1];
753 759
 		}
754 760
 		$op = @fsockopen($host, $port, $errno, $errstr, $timeout);
755
-		if (!$op) return false; //DC is N/A
761
+		if (!$op) {
762
+		    return false;
763
+		}
764
+		//DC is N/A
756 765
 		else {
757 766
 			fclose($op); //explicitly close open socket connection
758 767
 			return true; //DC is up & running, we can safely connect with ldap_connect
@@ -793,7 +802,9 @@  discard block
 block discarded – undo
793 802
 		$dn=$this->convFromOutputCharset($dn,$this->ldapcharset);
794 803
 		foreach($info as $key => $val)
795 804
 		{
796
-			if (! is_array($val)) $info[$key]=$this->convFromOutputCharset($val,$this->ldapcharset);
805
+			if (! is_array($val)) {
806
+			    $info[$key]=$this->convFromOutputCharset($val,$this->ldapcharset);
807
+			}
797 808
 		}
798 809
 
799 810
 		$this->dump($dn,$info);
@@ -805,8 +816,7 @@  discard block
 block discarded – undo
805 816
 		{
806 817
 			dol_syslog(get_class($this)."::add_attribute successfull", LOG_DEBUG);
807 818
 			return 1;
808
-		}
809
-		else
819
+		} else
810 820
 		{
811 821
 			$this->error=@ldap_error($this->connection);
812 822
 			dol_syslog(get_class($this)."::add_attribute failed: ".$this->error, LOG_ERR);
@@ -845,7 +855,9 @@  discard block
 block discarded – undo
845 855
 		$dn=$this->convFromOutputCharset($dn,$this->ldapcharset);
846 856
 		foreach($info as $key => $val)
847 857
 		{
848
-			if (! is_array($val)) $info[$key]=$this->convFromOutputCharset($val,$this->ldapcharset);
858
+			if (! is_array($val)) {
859
+			    $info[$key]=$this->convFromOutputCharset($val,$this->ldapcharset);
860
+			}
849 861
 		}
850 862
 
851 863
 		$this->dump($dn,$info);
@@ -857,8 +869,7 @@  discard block
 block discarded – undo
857 869
 		{
858 870
 			dol_syslog(get_class($this)."::updateAttribute successfull", LOG_DEBUG);
859 871
 			return 1;
860
-		}
861
-		else
872
+		} else
862 873
 		{
863 874
 			$this->error=@ldap_error($this->connection);
864 875
 			dol_syslog(get_class($this)."::updateAttribute failed: ".$this->error, LOG_ERR);
@@ -897,7 +908,9 @@  discard block
 block discarded – undo
897 908
 		$dn=$this->convFromOutputCharset($dn,$this->ldapcharset);
898 909
 		foreach($info as $key => $val)
899 910
 		{
900
-			if (! is_array($val)) $info[$key]=$this->convFromOutputCharset($val,$this->ldapcharset);
911
+			if (! is_array($val)) {
912
+			    $info[$key]=$this->convFromOutputCharset($val,$this->ldapcharset);
913
+			}
901 914
 		}
902 915
 
903 916
 		$this->dump($dn,$info);
@@ -909,8 +922,7 @@  discard block
 block discarded – undo
909 922
 		{
910 923
 			dol_syslog(get_class($this)."::deleteAttribute successfull", LOG_DEBUG);
911 924
 			return 1;
912
-		}
913
-		else
925
+		} else
914 926
 		{
915 927
 			$this->error=@ldap_error($this->connection);
916 928
 			dol_syslog(get_class($this)."::deleteAttribute failed: ".$this->error, LOG_ERR);
@@ -1034,17 +1046,14 @@  discard block
 block discarded – undo
1034 1046
 			if (((string) $activefilter == '1' || (string) $activefilter == 'user') && $this->filter)
1035 1047
 			{
1036 1048
 				$filter = '('.$this->filter.')';
1037
-			}
1038
-			elseif (((string) $activefilter == 'member') && $this->filter)
1049
+			} elseif (((string) $activefilter == 'member') && $this->filter)
1039 1050
 			{
1040 1051
 				$filter = '('.$this->filtermember.')';
1041
-			}
1042
-			else	// If this->filter is empty, make fiter on * (all)
1052
+			} else	// If this->filter is empty, make fiter on * (all)
1043 1053
 			{
1044 1054
 				$filter = '('.$useridentifier.'=*)';
1045 1055
 			}
1046
-		}
1047
-		else
1056
+		} else
1048 1057
 		{
1049 1058
 			$filter = '('.$useridentifier.'='.$search.')';
1050 1059
 		}
@@ -1056,8 +1065,7 @@  discard block
 block discarded – undo
1056 1065
 			dol_syslog(get_class($this)."::getRecords connection=".$this->connection." userDn=".$userDn." filter=".$filter. " attributeArray=(".join(',',$attributeArray).")");
1057 1066
 			//var_dump($attributeArray);
1058 1067
 			$this->result = @ldap_search($this->connection, $userDn, $filter, $attributeArray);
1059
-		}
1060
-		else
1068
+		} else
1061 1069
 		{
1062 1070
 			// Return list with fields selected by default
1063 1071
 			dol_syslog(get_class($this)."::getRecords connection=".$this->connection." userDn=".$userDn." filter=".$filter);
@@ -1095,8 +1103,7 @@  discard block
 block discarded – undo
1095 1103
 					{
1096 1104
 						$objectsid = $this->getObjectSid($recordid);
1097 1105
 						$fulllist[$recordid][$attributeArray[$j]]    = $objectsid;
1098
-					}
1099
-					else
1106
+					} else
1100 1107
 					{
1101 1108
 						if(in_array($attributeArray[$j], $attributeAsArray) && is_array($info[$i][$keyattributelower])) {
1102 1109
 							$valueTab = array();
@@ -1170,8 +1177,7 @@  discard block
 block discarded – undo
1170 1177
 				// Si pas de resultat on cherche dans le domaine
1171 1178
 				$searchDN = $this->domain;
1172 1179
 				$i++;
1173
-			}
1174
-			else
1180
+			} else
1175 1181
 			{
1176 1182
 				$i++;
1177 1183
 				$i++;
@@ -1183,8 +1189,7 @@  discard block
 block discarded – undo
1183 1189
 			$ldapBinary = ldap_get_values_len($this->connection, $entry, "objectsid");
1184 1190
 			$SIDText = $this->binSIDtoText($ldapBinary[0]);
1185 1191
 			return $SIDText;
1186
-		}
1187
-		else
1192
+		} else
1188 1193
 		{
1189 1194
 			$this->error = ldap_errno($this->connection)." ".ldap_error($this->connection);
1190 1195
 			return '?';
@@ -1243,8 +1248,7 @@  discard block
 block discarded – undo
1243 1248
 		{
1244 1249
 			$this->error = ldap_errno($this->connection)." ".ldap_error($this->connection);
1245 1250
 			return -1;
1246
-		}
1247
-		else
1251
+		} else
1248 1252
 		{
1249 1253
 			ldap_free_result($this->result);
1250 1254
 			return $result;
@@ -1280,11 +1284,13 @@  discard block
 block discarded – undo
1280 1284
 			if ($this->result)
1281 1285
 			{
1282 1286
 				$result = @ldap_get_entries($this->connection, $this->result);
1283
-				if ($result['count'] > 0) dol_syslog('Ldap::fetch search found '.$result['count'].' records');
1284
-				else dol_syslog('Ldap::fetch search returns but found no records');
1287
+				if ($result['count'] > 0) {
1288
+				    dol_syslog('Ldap::fetch search found '.$result['count'].' records');
1289
+				} else {
1290
+				    dol_syslog('Ldap::fetch search returns but found no records');
1291
+				}
1285 1292
 				//var_dump($result);exit;
1286
-			}
1287
-			else
1293
+			} else
1288 1294
 			{
1289 1295
 				$this->error = ldap_errno($this->connection)." ".ldap_error($this->connection);
1290 1296
 				dol_syslog(get_class($this)."::fetch search fails");
@@ -1296,8 +1302,7 @@  discard block
 block discarded – undo
1296 1302
 				// Si pas de resultat on cherche dans le domaine
1297 1303
 				$searchDN = $this->domain;
1298 1304
 				$i++;
1299
-			}
1300
-			else
1305
+			} else
1301 1306
 			{
1302 1307
 				break;
1303 1308
 			}
@@ -1307,8 +1312,7 @@  discard block
 block discarded – undo
1307 1312
 		{
1308 1313
 			$this->error = ldap_errno($this->connection)." ".ldap_error($this->connection);
1309 1314
 			return -1;
1310
-		}
1311
-		else
1315
+		} else
1312 1316
 		{
1313 1317
 			$this->name       = $this->convToOutputCharset($result[0][$this->attr_name][0],$this->ldapcharset);
1314 1318
 			$this->firstname  = $this->convToOutputCharset($result[0][$this->attr_firstname][0],$this->ldapcharset);
@@ -1320,15 +1324,18 @@  discard block
 block discarded – undo
1320 1324
 			$this->mobile     = $this->convToOutputCharset($result[0][$this->attr_mobile][0],$this->ldapcharset);
1321 1325
 
1322 1326
 			$this->uacf       = $this->parseUACF($this->convToOutputCharset($result[0]["useraccountcontrol"][0],$this->ldapcharset));
1323
-			if (isset($result[0]["pwdlastset"][0]))	// If expiration on password exists
1327
+			if (isset($result[0]["pwdlastset"][0])) {
1328
+			    // If expiration on password exists
1324 1329
 			{
1325 1330
 				$this->pwdlastset = ($result[0]["pwdlastset"][0] != 0)?$this->convert_time($this->convToOutputCharset($result[0]["pwdlastset"][0],$this->ldapcharset)):0;
1326 1331
 			}
1327
-			else
1332
+			} else
1328 1333
 			{
1329 1334
 				$this->pwdlastset = -1;
1330 1335
 			}
1331
-			if (!$this->name && !$this->login) $this->pwdlastset = -1;
1336
+			if (!$this->name && !$this->login) {
1337
+			    $this->pwdlastset = -1;
1338
+			}
1332 1339
 			$this->badpwdtime = $this->convert_time($this->convToOutputCharset($result[0]["badpasswordtime"][0],$this->ldapcharset));
1333 1340
 
1334 1341
 			// FQDN domain
@@ -1433,7 +1440,9 @@  discard block
 block discarded – undo
1433 1440
 				break;
1434 1441
 			}
1435 1442
 		}
1436
-		if (empty($retval)) $retval = "UNKNOWN_TYPE_" . $samtype;
1443
+		if (empty($retval)) {
1444
+		    $retval = "UNKNOWN_TYPE_" . $samtype;
1445
+		}
1437 1446
 
1438 1447
 		return($retval);
1439 1448
 	}
@@ -1466,8 +1475,12 @@  discard block
 block discarded – undo
1466 1475
 	private function convToOutputCharset($str,$pagecodefrom='UTF-8')
1467 1476
 	{
1468 1477
 		global $conf;
1469
-		if ($pagecodefrom == 'ISO-8859-1' && $conf->file->character_set_client == 'UTF-8')  $str=utf8_encode($str);
1470
-		if ($pagecodefrom == 'UTF-8' && $conf->file->character_set_client == 'ISO-8859-1')  $str=utf8_decode($str);
1478
+		if ($pagecodefrom == 'ISO-8859-1' && $conf->file->character_set_client == 'UTF-8') {
1479
+		    $str=utf8_encode($str);
1480
+		}
1481
+		if ($pagecodefrom == 'UTF-8' && $conf->file->character_set_client == 'ISO-8859-1') {
1482
+		    $str=utf8_decode($str);
1483
+		}
1471 1484
 		return $str;
1472 1485
 	}
1473 1486
 
@@ -1481,8 +1494,12 @@  discard block
 block discarded – undo
1481 1494
 	function convFromOutputCharset($str,$pagecodeto='UTF-8')
1482 1495
 	{
1483 1496
 		global $conf;
1484
-		if ($pagecodeto == 'ISO-8859-1' && $conf->file->character_set_client == 'UTF-8') $str=utf8_decode($str);
1485
-		if ($pagecodeto == 'UTF-8' && $conf->file->character_set_client == 'ISO-8859-1') $str=utf8_encode($str);
1497
+		if ($pagecodeto == 'ISO-8859-1' && $conf->file->character_set_client == 'UTF-8') {
1498
+		    $str=utf8_decode($str);
1499
+		}
1500
+		if ($pagecodeto == 'UTF-8' && $conf->file->character_set_client == 'ISO-8859-1') {
1501
+		    $str=utf8_encode($str);
1502
+		}
1486 1503
 		return $str;
1487 1504
 	}
1488 1505
 
@@ -1497,7 +1514,9 @@  discard block
 block discarded – undo
1497 1514
 	{
1498 1515
 		global $conf;
1499 1516
 
1500
-		if (empty($keygroup)) $keygroup='LDAP_KEY_GROUPS';
1517
+		if (empty($keygroup)) {
1518
+		    $keygroup='LDAP_KEY_GROUPS';
1519
+		}
1501 1520
 
1502 1521
 		$search='('.$conf->global->$keygroup.'=*)';
1503 1522
 		$result = $this->search($this->groups,$search);
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/workboardresponse.class.php 1 patch
Indentation   +40 added lines, -40 removed lines patch added patch discarded remove patch
@@ -25,51 +25,51 @@
 block discarded – undo
25 25
 class WorkboardResponse
26 26
 {
27 27
 
28
-	/**
29
-	 * Image URL to represent the board item
30
-	 * @var string
31
-	 */
32
-	public $img;
28
+    /**
29
+     * Image URL to represent the board item
30
+     * @var string
31
+     */
32
+    public $img;
33 33
 
34
-	/**
35
-	 * Label of the warning
36
-	 * @var string
37
-	 */
38
-	public $label;
34
+    /**
35
+     * Label of the warning
36
+     * @var string
37
+     */
38
+    public $label;
39 39
 
40
-	/**
41
-	 * URL to list to do items
42
-	 * @var string
43
-	 */
44
-	public $url;
40
+    /**
41
+     * URL to list to do items
42
+     * @var string
43
+     */
44
+    public $url;
45 45
 
46
-	/**
47
-	 * (optional) If set, to do late items will link to this url
48
-	 * @var string
49
-	 */
50
-	public $url_late;
46
+    /**
47
+     * (optional) If set, to do late items will link to this url
48
+     * @var string
49
+     */
50
+    public $url_late;
51 51
 
52
-	/**
53
-	 * Delay time to mark an item as late. In number of days.
54
-	 * @var double
55
-	 */
56
-	public $warning_delay;
52
+    /**
53
+     * Delay time to mark an item as late. In number of days.
54
+     * @var double
55
+     */
56
+    public $warning_delay;
57 57
 
58
-	/**
59
-	 * Number of items to do
60
-	 * @var int
61
-	 */
62
-	public $nbtodo = 0;
58
+    /**
59
+     * Number of items to do
60
+     * @var int
61
+     */
62
+    public $nbtodo = 0;
63 63
 
64
-	/**
65
-	 * Number of to do items which are late
66
-	 * @var int
67
-	 */
68
-	public $nbtodolate = 0;
64
+    /**
65
+     * Number of to do items which are late
66
+     * @var int
67
+     */
68
+    public $nbtodolate = 0;
69 69
 
70
-	/**
71
-	 * total price of items
72
-	 * @var int
73
-	 */
74
-	public $total = 0;
70
+    /**
71
+     * total price of items
72
+     * @var int
73
+     */
74
+    public $total = 0;
75 75
 }
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/dolgraph.class.php 3 patches
Indentation   +945 added lines, -945 removed lines patch added patch discarded remove patch
@@ -39,941 +39,941 @@  discard block
 block discarded – undo
39 39
  */
40 40
 class DolGraph
41 41
 {
42
-	public $type=array();			// Array with type of each series. Example: array('bars', 'lines', ...)
43
-	public $mode='side';		    // Mode bars graph: side, depth
44
-	private $_library='jflot';	// Graphic library to use (jflot, artichow)
45
-
46
-	//! Array of data
47
-	public $data;				// Data of graph: array(array('abs1',valA1,valB1), array('abs2',valA2,valB2), ...)
48
-	public $title;				// Title of graph
49
-	public $cssprefix='';		// To add into css styles
50
-	public $width=380;
51
-	public $height=200;
52
-	public $MaxValue=0;
53
-	public $MinValue=0;
54
-	public $SetShading=0;
55
-
56
-	public $PrecisionY=-1;
57
-
58
-	public $horizTickIncrement=-1;
59
-	public $SetNumXTicks=-1;
60
-	public $labelInterval=-1;
61
-
62
-	public $hideXGrid=false;
63
-	public $hideYGrid=false;
64
-
65
-	public $Legend=array();
66
-	public $LegendWidthMin=0;
67
-	public $showlegend=1;
68
-	public $showpointvalue=1;
69
-	public $showpercent=0;
70
-	public $combine=0;				// 0.05 if you want to combine records < 5% into "other"
71
-	public $graph;     			// Objet Graph (Artichow, Phplot...)
72
-
73
-	/**
74
-	 * @var string Error code (or message)
75
-	 */
76
-	public $error='';
77
-
78
-	public $bordercolor;			// array(R,G,B)
79
-	public $bgcolor;				// array(R,G,B)
80
-	public $bgcolorgrid=array(255,255,255);			// array(R,G,B)
81
-	public $datacolor;				// array(array(R,G,B),...)
82
-
83
-	private $stringtoshow;      // To store string to output graph into HTML page
84
-
85
-
86
-	/**
87
-	 * Constructor
88
-	 *
89
-	 * @param	string	$library		'jflot' (default) or 'artichow' (no more supported)
90
-	 */
91
-	function __construct($library='jflot')
92
-	{
93
-		global $conf;
94
-		global $theme_bordercolor, $theme_datacolor, $theme_bgcolor, $theme_bgcoloronglet;
95
-
96
-		// To use old feature
97
-		if ($library == 'artichow')
98
-		{
99
-			$this->_library='artichow';
100
-
101
-			// Test if module GD present
102
-			$modules_list = get_loaded_extensions();
103
-			$isgdinstalled=0;
104
-			foreach ($modules_list as $module)
105
-			{
106
-				if ($module == 'gd') $isgdinstalled=1;
107
-			}
108
-			if (! $isgdinstalled)
109
-			{
110
-				$this->error="Error: PHP GD module is not available. It is required to build graphics.";
111
-				return -1;
112
-			}
113
-		}
114
-
115
-		$this->bordercolor = array(235,235,224);
116
-		$this->datacolor = array(array(120,130,150), array(160,160,180), array(190,190,220));
117
-		$this->bgcolor = array(235,235,224);
118
-
119
-		$color_file = DOL_DOCUMENT_ROOT.'/theme/'.$conf->theme.'/graph-color.php';
120
-		if (is_readable($color_file))
121
-		{
122
-			include_once $color_file;
123
-			if (isset($theme_bordercolor)) $this->bordercolor = $theme_bordercolor;
124
-			if (isset($theme_datacolor))   $this->datacolor   = $theme_datacolor;
125
-			if (isset($theme_bgcolor))     $this->bgcolor     = $theme_bgcolor;
126
-		}
127
-		//print 'bgcolor: '.join(',',$this->bgcolor).'<br>';
128
-	}
42
+    public $type=array();			// Array with type of each series. Example: array('bars', 'lines', ...)
43
+    public $mode='side';		    // Mode bars graph: side, depth
44
+    private $_library='jflot';	// Graphic library to use (jflot, artichow)
45
+
46
+    //! Array of data
47
+    public $data;				// Data of graph: array(array('abs1',valA1,valB1), array('abs2',valA2,valB2), ...)
48
+    public $title;				// Title of graph
49
+    public $cssprefix='';		// To add into css styles
50
+    public $width=380;
51
+    public $height=200;
52
+    public $MaxValue=0;
53
+    public $MinValue=0;
54
+    public $SetShading=0;
55
+
56
+    public $PrecisionY=-1;
57
+
58
+    public $horizTickIncrement=-1;
59
+    public $SetNumXTicks=-1;
60
+    public $labelInterval=-1;
61
+
62
+    public $hideXGrid=false;
63
+    public $hideYGrid=false;
64
+
65
+    public $Legend=array();
66
+    public $LegendWidthMin=0;
67
+    public $showlegend=1;
68
+    public $showpointvalue=1;
69
+    public $showpercent=0;
70
+    public $combine=0;				// 0.05 if you want to combine records < 5% into "other"
71
+    public $graph;     			// Objet Graph (Artichow, Phplot...)
72
+
73
+    /**
74
+     * @var string Error code (or message)
75
+     */
76
+    public $error='';
77
+
78
+    public $bordercolor;			// array(R,G,B)
79
+    public $bgcolor;				// array(R,G,B)
80
+    public $bgcolorgrid=array(255,255,255);			// array(R,G,B)
81
+    public $datacolor;				// array(array(R,G,B),...)
82
+
83
+    private $stringtoshow;      // To store string to output graph into HTML page
84
+
85
+
86
+    /**
87
+     * Constructor
88
+     *
89
+     * @param	string	$library		'jflot' (default) or 'artichow' (no more supported)
90
+     */
91
+    function __construct($library='jflot')
92
+    {
93
+        global $conf;
94
+        global $theme_bordercolor, $theme_datacolor, $theme_bgcolor, $theme_bgcoloronglet;
95
+
96
+        // To use old feature
97
+        if ($library == 'artichow')
98
+        {
99
+            $this->_library='artichow';
100
+
101
+            // Test if module GD present
102
+            $modules_list = get_loaded_extensions();
103
+            $isgdinstalled=0;
104
+            foreach ($modules_list as $module)
105
+            {
106
+                if ($module == 'gd') $isgdinstalled=1;
107
+            }
108
+            if (! $isgdinstalled)
109
+            {
110
+                $this->error="Error: PHP GD module is not available. It is required to build graphics.";
111
+                return -1;
112
+            }
113
+        }
114
+
115
+        $this->bordercolor = array(235,235,224);
116
+        $this->datacolor = array(array(120,130,150), array(160,160,180), array(190,190,220));
117
+        $this->bgcolor = array(235,235,224);
118
+
119
+        $color_file = DOL_DOCUMENT_ROOT.'/theme/'.$conf->theme.'/graph-color.php';
120
+        if (is_readable($color_file))
121
+        {
122
+            include_once $color_file;
123
+            if (isset($theme_bordercolor)) $this->bordercolor = $theme_bordercolor;
124
+            if (isset($theme_datacolor))   $this->datacolor   = $theme_datacolor;
125
+            if (isset($theme_bgcolor))     $this->bgcolor     = $theme_bgcolor;
126
+        }
127
+        //print 'bgcolor: '.join(',',$this->bgcolor).'<br>';
128
+    }
129 129
 
130 130
 
131 131
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
132
-	/**
133
-	 * Set Y precision
134
-	 *
135
-	 * @param 	float	$which_prec		Precision
136
-	 * @return 	boolean
137
-	 */
138
-	function SetPrecisionY($which_prec)
139
-	{
132
+    /**
133
+     * Set Y precision
134
+     *
135
+     * @param 	float	$which_prec		Precision
136
+     * @return 	boolean
137
+     */
138
+    function SetPrecisionY($which_prec)
139
+    {
140 140
         // phpcs:enable
141
-		$this->PrecisionY = $which_prec;
142
-		return true;
143
-	}
141
+        $this->PrecisionY = $which_prec;
142
+        return true;
143
+    }
144 144
 
145 145
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
146
-	/**
147
-	 * Utiliser SetNumTicks ou SetHorizTickIncrement mais pas les 2
148
-	 *
149
-	 * @param 	float 		$xi		Xi
150
-	 * @return	boolean				True
151
-	 */
152
-	function SetHorizTickIncrement($xi)
153
-	{
146
+    /**
147
+     * Utiliser SetNumTicks ou SetHorizTickIncrement mais pas les 2
148
+     *
149
+     * @param 	float 		$xi		Xi
150
+     * @return	boolean				True
151
+     */
152
+    function SetHorizTickIncrement($xi)
153
+    {
154 154
         // phpcs:enable
155
-		$this->horizTickIncrement = $xi;
156
-		return true;
157
-	}
155
+        $this->horizTickIncrement = $xi;
156
+        return true;
157
+    }
158 158
 
159 159
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
160
-	/**
161
-	 * Utiliser SetNumTicks ou SetHorizTickIncrement mais pas les 2
162
-	 *
163
-	 * @param 	float 		$xt		Xt
164
-	 * @return	boolean				True
165
-	 */
166
-	function SetNumXTicks($xt)
167
-	{
160
+    /**
161
+     * Utiliser SetNumTicks ou SetHorizTickIncrement mais pas les 2
162
+     *
163
+     * @param 	float 		$xt		Xt
164
+     * @return	boolean				True
165
+     */
166
+    function SetNumXTicks($xt)
167
+    {
168 168
         // phpcs:enable
169
-		$this->SetNumXTicks = $xt;
170
-		return true;
171
-	}
169
+        $this->SetNumXTicks = $xt;
170
+        return true;
171
+    }
172 172
 
173 173
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
174
-	/**
175
-	 * Set label interval to reduce number of labels
176
-	 *
177
-	 * @param 	float 		$x		Label interval
178
-	 * @return	boolean				True
179
-	 */
180
-	function SetLabelInterval($x)
181
-	{
174
+    /**
175
+     * Set label interval to reduce number of labels
176
+     *
177
+     * @param 	float 		$x		Label interval
178
+     * @return	boolean				True
179
+     */
180
+    function SetLabelInterval($x)
181
+    {
182 182
         // phpcs:enable
183
-		$this->labelInterval = $x;
184
-		return true;
185
-	}
183
+        $this->labelInterval = $x;
184
+        return true;
185
+    }
186 186
 
187 187
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
188
-	/**
189
-	 * Hide X grid
190
-	 *
191
-	 * @param	boolean		$bool	XGrid or not
192
-	 * @return	boolean				true
193
-	 */
194
-	function SetHideXGrid($bool)
195
-	{
188
+    /**
189
+     * Hide X grid
190
+     *
191
+     * @param	boolean		$bool	XGrid or not
192
+     * @return	boolean				true
193
+     */
194
+    function SetHideXGrid($bool)
195
+    {
196 196
         // phpcs:enable
197
-		$this->hideXGrid = $bool;
198
-		return true;
199
-	}
197
+        $this->hideXGrid = $bool;
198
+        return true;
199
+    }
200 200
 
201 201
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
202
-	/**
203
-	 * Hide Y grid
204
-	 *
205
-	 * @param	boolean		$bool	YGrid or not
206
-	 * @return	boolean				true
207
-	 */
208
-	function SetHideYGrid($bool)
209
-	{
202
+    /**
203
+     * Hide Y grid
204
+     *
205
+     * @param	boolean		$bool	YGrid or not
206
+     * @return	boolean				true
207
+     */
208
+    function SetHideYGrid($bool)
209
+    {
210 210
         // phpcs:enable
211
-		$this->hideYGrid = $bool;
212
-		return true;
213
-	}
211
+        $this->hideYGrid = $bool;
212
+        return true;
213
+    }
214 214
 
215 215
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
216
-	/**
217
-	 * Set y label
218
-	 *
219
-	 * @param 	string	$label		Y label
220
-	 * @return	boolean|null				True
221
-	 */
222
-	function SetYLabel($label)
223
-	{
216
+    /**
217
+     * Set y label
218
+     *
219
+     * @param 	string	$label		Y label
220
+     * @return	boolean|null				True
221
+     */
222
+    function SetYLabel($label)
223
+    {
224 224
         // phpcs:enable
225
-		$this->YLabel = $label;
226
-	}
225
+        $this->YLabel = $label;
226
+    }
227 227
 
228 228
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
229
-	/**
230
-	 * Set width
231
-	 *
232
-	 * @param 	int		$w			Width
233
-	 * @return	boolean|null				True
234
-	 */
235
-	function SetWidth($w)
236
-	{
229
+    /**
230
+     * Set width
231
+     *
232
+     * @param 	int		$w			Width
233
+     * @return	boolean|null				True
234
+     */
235
+    function SetWidth($w)
236
+    {
237 237
         // phpcs:enable
238
-		$this->width = $w;
239
-	}
238
+        $this->width = $w;
239
+    }
240 240
 
241 241
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
242
-	/**
243
-	 * Set title
244
-	 *
245
-	 * @param 	string	$title		Title
246
-	 * @return	void
247
-	 */
248
-	function SetTitle($title)
249
-	{
242
+    /**
243
+     * Set title
244
+     *
245
+     * @param 	string	$title		Title
246
+     * @return	void
247
+     */
248
+    function SetTitle($title)
249
+    {
250 250
         // phpcs:enable
251
-		$this->title = $title;
252
-	}
251
+        $this->title = $title;
252
+    }
253 253
 
254 254
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
255
-	/**
256
-	 * Set data
257
-	 *
258
-	 * @param 	array	$data		Data
259
-	 * @return	void
260
-	 * @see draw_jflot for syntax of data array
261
-	 */
262
-	function SetData($data)
263
-	{
255
+    /**
256
+     * Set data
257
+     *
258
+     * @param 	array	$data		Data
259
+     * @return	void
260
+     * @see draw_jflot for syntax of data array
261
+     */
262
+    function SetData($data)
263
+    {
264 264
         // phpcs:enable
265
-		$this->data = $data;
266
-	}
265
+        $this->data = $data;
266
+    }
267 267
 
268 268
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
269
-	/**
270
-	 * Set data
271
-	 *
272
-	 * @param 	array	$datacolor		Data color array(array(R,G,B),array(R,G,B)...)
273
-	 * @return	void
274
-	 */
275
-	function SetDataColor($datacolor)
276
-	{
269
+    /**
270
+     * Set data
271
+     *
272
+     * @param 	array	$datacolor		Data color array(array(R,G,B),array(R,G,B)...)
273
+     * @return	void
274
+     */
275
+    function SetDataColor($datacolor)
276
+    {
277 277
         // phpcs:enable
278
-		$this->datacolor = $datacolor;
279
-	}
278
+        $this->datacolor = $datacolor;
279
+    }
280 280
 
281 281
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
282
-	/**
283
-	 * Set type
284
-	 *
285
-	 * @param 	array	$type		Array with type for each serie. Example: array('pie'), array('lines',...,'bars')
286
-	 * @return	void
287
-	 */
288
-	function SetType($type)
289
-	{
282
+    /**
283
+     * Set type
284
+     *
285
+     * @param 	array	$type		Array with type for each serie. Example: array('pie'), array('lines',...,'bars')
286
+     * @return	void
287
+     */
288
+    function SetType($type)
289
+    {
290 290
         // phpcs:enable
291
-		$this->type = $type;
292
-	}
291
+        $this->type = $type;
292
+    }
293 293
 
294 294
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
295
-	/**
296
-	 * Set legend
297
-	 *
298
-	 * @param 	array	$legend		Legend. Example: array('seriename1','seriname2',...)
299
-	 * @return	void
300
-	 */
301
-	function SetLegend($legend)
302
-	{
295
+    /**
296
+     * Set legend
297
+     *
298
+     * @param 	array	$legend		Legend. Example: array('seriename1','seriname2',...)
299
+     * @return	void
300
+     */
301
+    function SetLegend($legend)
302
+    {
303 303
         // phpcs:enable
304
-		$this->Legend = $legend;
305
-	}
304
+        $this->Legend = $legend;
305
+    }
306 306
 
307 307
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
308
-	/**
309
-	 * Set min width
310
-	 *
311
-	 * @param 	int		$legendwidthmin		Min width
312
-	 * @return	void
313
-	 */
314
-	function SetLegendWidthMin($legendwidthmin)
315
-	{
308
+    /**
309
+     * Set min width
310
+     *
311
+     * @param 	int		$legendwidthmin		Min width
312
+     * @return	void
313
+     */
314
+    function SetLegendWidthMin($legendwidthmin)
315
+    {
316 316
         // phpcs:enable
317
-		$this->LegendWidthMin = $legendwidthmin;
318
-	}
317
+        $this->LegendWidthMin = $legendwidthmin;
318
+    }
319 319
 
320 320
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
321
-	/**
322
-	 * Set max value
323
-	 *
324
-	 * @param 	int		$max			Max value
325
-	 * @return	void
326
-	 */
327
-	function SetMaxValue($max)
328
-	{
321
+    /**
322
+     * Set max value
323
+     *
324
+     * @param 	int		$max			Max value
325
+     * @return	void
326
+     */
327
+    function SetMaxValue($max)
328
+    {
329 329
         // phpcs:enable
330
-		$this->MaxValue = $max;
331
-	}
330
+        $this->MaxValue = $max;
331
+    }
332 332
 
333 333
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
334
-	/**
335
-	 * Get max value
336
-	 *
337
-	 * @return	int		Max value
338
-	 */
339
-	function GetMaxValue()
340
-	{
334
+    /**
335
+     * Get max value
336
+     *
337
+     * @return	int		Max value
338
+     */
339
+    function GetMaxValue()
340
+    {
341 341
         // phpcs:enable
342
-		return $this->MaxValue;
343
-	}
342
+        return $this->MaxValue;
343
+    }
344 344
 
345 345
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
346
-	/**
347
-	 * Set min value
348
-	 *
349
-	 * @param 	int		$min			Min value
350
-	 * @return	void
351
-	 */
352
-	function SetMinValue($min)
353
-	{
346
+    /**
347
+     * Set min value
348
+     *
349
+     * @param 	int		$min			Min value
350
+     * @return	void
351
+     */
352
+    function SetMinValue($min)
353
+    {
354 354
         // phpcs:enable
355
-		$this->MinValue = $min;
356
-	}
355
+        $this->MinValue = $min;
356
+    }
357 357
 
358 358
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
359
-	/**
360
-	 * Get min value
361
-	 *
362
-	 * @return	int		Max value
363
-	 */
364
-	function GetMinValue()
365
-	{
359
+    /**
360
+     * Get min value
361
+     *
362
+     * @return	int		Max value
363
+     */
364
+    function GetMinValue()
365
+    {
366 366
         // phpcs:enable
367
-		return $this->MinValue;
368
-	}
367
+        return $this->MinValue;
368
+    }
369 369
 
370 370
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
371
-	/**
372
-	 * Set height
373
-	 *
374
-	 * @param 	int		$h				Height
375
-	 * @return	void
376
-	 */
377
-	function SetHeight($h)
378
-	{
371
+    /**
372
+     * Set height
373
+     *
374
+     * @param 	int		$h				Height
375
+     * @return	void
376
+     */
377
+    function SetHeight($h)
378
+    {
379 379
         // phpcs:enable
380
-		$this->height = $h;
381
-	}
380
+        $this->height = $h;
381
+    }
382 382
 
383 383
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
384
-	/**
385
-	 * Set shading
386
-	 *
387
-	 * @param 	string	$s				Shading
388
-	 * @return	void
389
-	 */
390
-	function SetShading($s)
391
-	{
384
+    /**
385
+     * Set shading
386
+     *
387
+     * @param 	string	$s				Shading
388
+     * @return	void
389
+     */
390
+    function SetShading($s)
391
+    {
392 392
         // phpcs:enable
393
-		$this->SetShading = $s;
394
-	}
393
+        $this->SetShading = $s;
394
+    }
395 395
 
396 396
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
397
-	/**
398
-	 * Set shading
399
-	 *
400
-	 * @param 	string	$s				Shading
401
-	 * @return	void
402
-	 */
403
-	function SetCssPrefix($s)
404
-	{
397
+    /**
398
+     * Set shading
399
+     *
400
+     * @param 	string	$s				Shading
401
+     * @return	void
402
+     */
403
+    function SetCssPrefix($s)
404
+    {
405 405
         // phpcs:enable
406
-		$this->cssprefix = $s;
407
-	}
406
+        $this->cssprefix = $s;
407
+    }
408 408
 
409 409
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
410
-	/**
411
-	 * Reset bg color
412
-	 *
413
-	 * @return	void
414
-	 */
415
-	function ResetBgColor()
416
-	{
410
+    /**
411
+     * Reset bg color
412
+     *
413
+     * @return	void
414
+     */
415
+    function ResetBgColor()
416
+    {
417 417
         // phpcs:enable
418
-		unset($this->bgcolor);
419
-	}
418
+        unset($this->bgcolor);
419
+    }
420 420
 
421 421
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
422
-	/**
423
-	 * Reset bgcolorgrid
424
-	 *
425
-	 * @return	void
426
-	 */
427
-	function ResetBgColorGrid()
428
-	{
422
+    /**
423
+     * Reset bgcolorgrid
424
+     *
425
+     * @return	void
426
+     */
427
+    function ResetBgColorGrid()
428
+    {
429 429
         // phpcs:enable
430
-		unset($this->bgcolorgrid);
431
-	}
432
-
433
-	/**
434
-	 * Is graph ko
435
-	 *
436
-	 * @return	string		Error
437
-	 */
438
-	function isGraphKo()
439
-	{
440
-		return $this->error;
441
-	}
442
-
443
-	/**
444
-	 * Show legend or not
445
-	 *
446
-	 * @param	int		$showlegend		1=Show legend (default), 0=Hide legend
447
-	 * @return	void
448
-	 */
449
-	function setShowLegend($showlegend)
450
-	{
451
-		$this->showlegend=$showlegend;
452
-	}
453
-
454
-	/**
455
-	 * Show pointvalue or not
456
-	 *
457
-	 * @param	int		$showpointvalue		1=Show value for each point, as tooltip or inline (default), 0=Hide value
458
-	 * @return	void
459
-	 */
460
-	function setShowPointValue($showpointvalue)
461
-	{
462
-		$this->showpointvalue=$showpointvalue;
463
-	}
464
-
465
-	/**
466
-	 * Show percent or not
467
-	 *
468
-	 * @param	int		$showpercent		1=Show percent for each point, as tooltip or inline, 0=Hide percent (default)
469
-	 * @return	void
470
-	 */
471
-	function setShowPercent($showpercent)
472
-	{
473
-		$this->showpercent=$showpercent;
474
-	}
430
+        unset($this->bgcolorgrid);
431
+    }
432
+
433
+    /**
434
+     * Is graph ko
435
+     *
436
+     * @return	string		Error
437
+     */
438
+    function isGraphKo()
439
+    {
440
+        return $this->error;
441
+    }
442
+
443
+    /**
444
+     * Show legend or not
445
+     *
446
+     * @param	int		$showlegend		1=Show legend (default), 0=Hide legend
447
+     * @return	void
448
+     */
449
+    function setShowLegend($showlegend)
450
+    {
451
+        $this->showlegend=$showlegend;
452
+    }
453
+
454
+    /**
455
+     * Show pointvalue or not
456
+     *
457
+     * @param	int		$showpointvalue		1=Show value for each point, as tooltip or inline (default), 0=Hide value
458
+     * @return	void
459
+     */
460
+    function setShowPointValue($showpointvalue)
461
+    {
462
+        $this->showpointvalue=$showpointvalue;
463
+    }
464
+
465
+    /**
466
+     * Show percent or not
467
+     *
468
+     * @param	int		$showpercent		1=Show percent for each point, as tooltip or inline, 0=Hide percent (default)
469
+     * @return	void
470
+     */
471
+    function setShowPercent($showpercent)
472
+    {
473
+        $this->showpercent=$showpercent;
474
+    }
475 475
 
476 476
 
477 477
 
478 478
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
479
-	/**
480
-	 * Define background color of complete image
481
-	 *
482
-	 * @param	array	$bg_color		array(R,G,B) ou 'onglet' ou 'default'
483
-	 * @return	void
484
-	 */
485
-	function SetBgColor($bg_color = array(255,255,255))
486
-	{
479
+    /**
480
+     * Define background color of complete image
481
+     *
482
+     * @param	array	$bg_color		array(R,G,B) ou 'onglet' ou 'default'
483
+     * @return	void
484
+     */
485
+    function SetBgColor($bg_color = array(255,255,255))
486
+    {
487 487
         // phpcs:enable
488
-		global $theme_bgcolor,$theme_bgcoloronglet;
489
-
490
-		if (! is_array($bg_color))
491
-		{
492
-			if ($bg_color == 'onglet')
493
-			{
494
-				//print 'ee'.join(',',$theme_bgcoloronglet);
495
-				$this->bgcolor = $theme_bgcoloronglet;
496
-			}
497
-			else
498
-			{
499
-				$this->bgcolor = $theme_bgcolor;
500
-			}
501
-		}
502
-		else
503
-		{
504
-			$this->bgcolor = $bg_color;
505
-		}
506
-	}
488
+        global $theme_bgcolor,$theme_bgcoloronglet;
489
+
490
+        if (! is_array($bg_color))
491
+        {
492
+            if ($bg_color == 'onglet')
493
+            {
494
+                //print 'ee'.join(',',$theme_bgcoloronglet);
495
+                $this->bgcolor = $theme_bgcoloronglet;
496
+            }
497
+            else
498
+            {
499
+                $this->bgcolor = $theme_bgcolor;
500
+            }
501
+        }
502
+        else
503
+        {
504
+            $this->bgcolor = $bg_color;
505
+        }
506
+    }
507 507
 
508 508
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
509
-	/**
510
-	 * Define background color of grid
511
-	 *
512
-	 * @param	array	$bg_colorgrid		array(R,G,B) ou 'onglet' ou 'default'
513
-	 * @return	void
514
-	 */
515
-	function SetBgColorGrid($bg_colorgrid = array(255,255,255))
516
-	{
509
+    /**
510
+     * Define background color of grid
511
+     *
512
+     * @param	array	$bg_colorgrid		array(R,G,B) ou 'onglet' ou 'default'
513
+     * @return	void
514
+     */
515
+    function SetBgColorGrid($bg_colorgrid = array(255,255,255))
516
+    {
517 517
         // phpcs:enable
518
-		global $theme_bgcolor,$theme_bgcoloronglet;
519
-
520
-		if (! is_array($bg_colorgrid))
521
-		{
522
-			if ($bg_colorgrid == 'onglet')
523
-			{
524
-				//print 'ee'.join(',',$theme_bgcoloronglet);
525
-				$this->bgcolorgrid = $theme_bgcoloronglet;
526
-			}
527
-			else
528
-			{
529
-				$this->bgcolorgrid = $theme_bgcolor;
530
-			}
531
-		}
532
-		else
533
-		{
534
-			$this->bgcolorgrid = $bg_colorgrid;
535
-		}
536
-	}
518
+        global $theme_bgcolor,$theme_bgcoloronglet;
519
+
520
+        if (! is_array($bg_colorgrid))
521
+        {
522
+            if ($bg_colorgrid == 'onglet')
523
+            {
524
+                //print 'ee'.join(',',$theme_bgcoloronglet);
525
+                $this->bgcolorgrid = $theme_bgcoloronglet;
526
+            }
527
+            else
528
+            {
529
+                $this->bgcolorgrid = $theme_bgcolor;
530
+            }
531
+        }
532
+        else
533
+        {
534
+            $this->bgcolorgrid = $bg_colorgrid;
535
+        }
536
+    }
537 537
 
538 538
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
539
-	/**
540
-	 * Reset data color
541
-	 *
542
-	 * @return	void
543
-	 */
544
-	function ResetDataColor()
545
-	{
539
+    /**
540
+     * Reset data color
541
+     *
542
+     * @return	void
543
+     */
544
+    function ResetDataColor()
545
+    {
546 546
         // phpcs:enable
547
-		unset($this->datacolor);
548
-	}
547
+        unset($this->datacolor);
548
+    }
549 549
 
550 550
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
551
-	/**
552
-	 * Get max value
553
-	 *
554
-	 * @return	int		Max value
555
-	 */
556
-	function GetMaxValueInData()
557
-	{
551
+    /**
552
+     * Get max value
553
+     *
554
+     * @return	int		Max value
555
+     */
556
+    function GetMaxValueInData()
557
+    {
558 558
         // phpcs:enable
559
-		$k = 0;
560
-		$vals = array();
561
-
562
-		$nblines = count($this->data);
563
-		$nbvalues = count($this->data[0]) - 1;
564
-
565
-		for ($j = 0 ; $j < $nblines ; $j++)
566
-		{
567
-			for ($i = 0 ; $i < $nbvalues ; $i++)
568
-			{
569
-				$vals[$k] = $this->data[$j][$i+1];
570
-				$k++;
571
-			}
572
-		}
573
-		rsort($vals);
574
-		return $vals[0];
575
-	}
559
+        $k = 0;
560
+        $vals = array();
561
+
562
+        $nblines = count($this->data);
563
+        $nbvalues = count($this->data[0]) - 1;
564
+
565
+        for ($j = 0 ; $j < $nblines ; $j++)
566
+        {
567
+            for ($i = 0 ; $i < $nbvalues ; $i++)
568
+            {
569
+                $vals[$k] = $this->data[$j][$i+1];
570
+                $k++;
571
+            }
572
+        }
573
+        rsort($vals);
574
+        return $vals[0];
575
+    }
576 576
 
577 577
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
578
-	/**
579
-	 * Return min value of all data
580
-	 *
581
-	 * @return	int		Min value of all data
582
-	 */
583
-	function GetMinValueInData()
584
-	{
578
+    /**
579
+     * Return min value of all data
580
+     *
581
+     * @return	int		Min value of all data
582
+     */
583
+    function GetMinValueInData()
584
+    {
585 585
         // phpcs:enable
586
-		$k = 0;
587
-		$vals = array();
588
-
589
-		$nblines = count($this->data);
590
-		$nbvalues = count($this->data[0]) - 1;
591
-
592
-		for ($j = 0 ; $j < $nblines ; $j++)
593
-		{
594
-			for ($i = 0 ; $i < $nbvalues ; $i++)
595
-			{
596
-				$vals[$k] = $this->data[$j][$i+1];
597
-				$k++;
598
-			}
599
-		}
600
-		sort($vals);
601
-		return $vals[0];
602
-	}
586
+        $k = 0;
587
+        $vals = array();
588
+
589
+        $nblines = count($this->data);
590
+        $nbvalues = count($this->data[0]) - 1;
591
+
592
+        for ($j = 0 ; $j < $nblines ; $j++)
593
+        {
594
+            for ($i = 0 ; $i < $nbvalues ; $i++)
595
+            {
596
+                $vals[$k] = $this->data[$j][$i+1];
597
+                $k++;
598
+            }
599
+        }
600
+        sort($vals);
601
+        return $vals[0];
602
+    }
603 603
 
604 604
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
605
-	/**
606
-	 * Return max value of all data
607
-	 *
608
-	 * @return 	int		Max value of all data
609
-	 */
610
-	function GetCeilMaxValue()
611
-	{
605
+    /**
606
+     * Return max value of all data
607
+     *
608
+     * @return 	int		Max value of all data
609
+     */
610
+    function GetCeilMaxValue()
611
+    {
612 612
         // phpcs:enable
613
-		$max = $this->GetMaxValueInData();
614
-		if ($max != 0) $max++;
615
-		$size=dol_strlen(abs(ceil($max)));
616
-		$factor=1;
617
-		for ($i=0; $i < ($size-1); $i++)
618
-		{
619
-			$factor*=10;
620
-		}
621
-
622
-		$res=0;
623
-		if (is_numeric($max)) $res=ceil($max/$factor)*$factor;
624
-
625
-		//print "max=".$max." res=".$res;
626
-		return $res;
627
-	}
613
+        $max = $this->GetMaxValueInData();
614
+        if ($max != 0) $max++;
615
+        $size=dol_strlen(abs(ceil($max)));
616
+        $factor=1;
617
+        for ($i=0; $i < ($size-1); $i++)
618
+        {
619
+            $factor*=10;
620
+        }
621
+
622
+        $res=0;
623
+        if (is_numeric($max)) $res=ceil($max/$factor)*$factor;
624
+
625
+        //print "max=".$max." res=".$res;
626
+        return $res;
627
+    }
628 628
 
629 629
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
630
-	/**
631
-	 * Return min value of all data
632
-	 *
633
-	 * @return 	double		Max value of all data
634
-	 */
635
-	function GetFloorMinValue()
636
-	{
630
+    /**
631
+     * Return min value of all data
632
+     *
633
+     * @return 	double		Max value of all data
634
+     */
635
+    function GetFloorMinValue()
636
+    {
637 637
         // phpcs:enable
638
-		$min = $this->GetMinValueInData();
639
-		if ($min == '') $min=0;
640
-		if ($min != 0) $min--;
641
-		$size=dol_strlen(abs(floor($min)));
642
-		$factor=1;
643
-		for ($i=0; $i < ($size-1); $i++)
644
-		{
645
-			$factor*=10;
646
-		}
647
-
648
-		$res=floor($min/$factor)*$factor;
649
-
650
-		//print "min=".$min." res=".$res;
651
-		return $res;
652
-	}
653
-
654
-	/**
655
-	 * Build a graph into memory using correct library  (may also be wrote on disk, depending on library used)
656
-	 *
657
-	 * @param	string	$file    	Image file name to use to save onto disk (also used as javascript unique id)
658
-	 * @param	string	$fileurl	Url path to show image if saved onto disk
659
-	 * @return	integer|null
660
-	 */
661
-	function draw($file, $fileurl='')
662
-	{
663
-		if (empty($file))
664
-		{
665
-			$this->error="Call to draw method was made with empty value for parameter file.";
666
-			dol_syslog(get_class($this)."::draw ".$this->error, LOG_ERR);
667
-			return -2;
668
-		}
669
-		if (! is_array($this->data))
670
-		{
671
-			$this->error="Call to draw method was made but SetData was not called or called with an empty dataset for parameters";
672
-			dol_syslog(get_class($this)."::draw ".$this->error, LOG_ERR);
673
-			return -1;
674
-		}
675
-		if (count($this->data) < 1)
676
-		{
677
-			$this->error="Call to draw method was made but SetData was is an empty dataset";
678
-			dol_syslog(get_class($this)."::draw ".$this->error, LOG_WARNING);
679
-		}
680
-		$call = "draw_".$this->_library;
681
-		call_user_func_array(array($this,$call), array($file,$fileurl));
682
-	}
638
+        $min = $this->GetMinValueInData();
639
+        if ($min == '') $min=0;
640
+        if ($min != 0) $min--;
641
+        $size=dol_strlen(abs(floor($min)));
642
+        $factor=1;
643
+        for ($i=0; $i < ($size-1); $i++)
644
+        {
645
+            $factor*=10;
646
+        }
647
+
648
+        $res=floor($min/$factor)*$factor;
649
+
650
+        //print "min=".$min." res=".$res;
651
+        return $res;
652
+    }
653
+
654
+    /**
655
+     * Build a graph into memory using correct library  (may also be wrote on disk, depending on library used)
656
+     *
657
+     * @param	string	$file    	Image file name to use to save onto disk (also used as javascript unique id)
658
+     * @param	string	$fileurl	Url path to show image if saved onto disk
659
+     * @return	integer|null
660
+     */
661
+    function draw($file, $fileurl='')
662
+    {
663
+        if (empty($file))
664
+        {
665
+            $this->error="Call to draw method was made with empty value for parameter file.";
666
+            dol_syslog(get_class($this)."::draw ".$this->error, LOG_ERR);
667
+            return -2;
668
+        }
669
+        if (! is_array($this->data))
670
+        {
671
+            $this->error="Call to draw method was made but SetData was not called or called with an empty dataset for parameters";
672
+            dol_syslog(get_class($this)."::draw ".$this->error, LOG_ERR);
673
+            return -1;
674
+        }
675
+        if (count($this->data) < 1)
676
+        {
677
+            $this->error="Call to draw method was made but SetData was is an empty dataset";
678
+            dol_syslog(get_class($this)."::draw ".$this->error, LOG_WARNING);
679
+        }
680
+        $call = "draw_".$this->_library;
681
+        call_user_func_array(array($this,$call), array($file,$fileurl));
682
+    }
683 683
 
684 684
 
685 685
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
686
-	/**
687
-	 * Build a graph onto disk using Artichow library and return img string to it
688
-	 *
689
-	 * @param	string	$file    	Image file name to use if we save onto disk
690
-	 * @param	string	$fileurl	Url path to show image if saved onto disk
691
-	 * @return	void
692
-	 */
693
-	private function draw_artichow($file,$fileurl)
694
-	{
686
+    /**
687
+     * Build a graph onto disk using Artichow library and return img string to it
688
+     *
689
+     * @param	string	$file    	Image file name to use if we save onto disk
690
+     * @param	string	$fileurl	Url path to show image if saved onto disk
691
+     * @return	void
692
+     */
693
+    private function draw_artichow($file,$fileurl)
694
+    {
695 695
         // phpcs:enable
696
-		global $artichow_defaultfont;
697
-
698
-		dol_syslog(get_class($this)."::draw_artichow this->type=".join(',',$this->type));
699
-
700
-		if (! defined('SHADOW_RIGHT_TOP'))  define('SHADOW_RIGHT_TOP',3);
701
-		if (! defined('LEGEND_BACKGROUND')) define('LEGEND_BACKGROUND',2);
702
-		if (! defined('LEGEND_LINE'))       define('LEGEND_LINE',1);
703
-
704
-		// Create graph
705
-		$classname='';
706
-		if (! isset($this->type[0]) || $this->type[0] == 'bars')  $classname='BarPlot';    // Only one type (first one) is supported by artichow
707
-		else if ($this->type[0] == 'lines' || $this->type[0] == 'linesnopoint') $classname='LinePlot';
708
-		else $classname='TypeUnknown';
709
-		include_once ARTICHOW_PATH.$classname.'.class.php';
710
-
711
-		// Definition de couleurs
712
-		$bgcolor=new Color($this->bgcolor[0],$this->bgcolor[1],$this->bgcolor[2]);
713
-		$bgcolorgrid=new Color($this->bgcolorgrid[0],$this->bgcolorgrid[1],$this->bgcolorgrid[2]);
714
-		$colortrans=new Color(0,0,0,100);
715
-		$colorsemitrans=new Color(255,255,255,60);
716
-		$colorgradient= new LinearGradient(new Color(235, 235, 235),new Color(255, 255, 255),0);
717
-		$colorwhite=new Color(255,255,255);
718
-
719
-		// Graph
720
-		$graph = new Graph($this->width, $this->height);
721
-		$graph->border->hide();
722
-		$graph->setAntiAliasing(true);
723
-		if (isset($this->title))
724
-		{
725
-			$graph->title->set($this->title);
726
-			//print $artichow_defaultfont;exit;
727
-			$graph->title->setFont(new $artichow_defaultfont(10));
728
-		}
729
-
730
-		if (is_array($this->bgcolor)) $graph->setBackgroundColor($bgcolor);
731
-		else $graph->setBackgroundGradient($colorgradient);
732
-
733
-		$group = new PlotGroup;
734
-		//$group->setSpace(5, 5, 0, 0);
735
-
736
-		$paddleft=50;
737
-		$paddright=10;
738
-		$strl=dol_strlen(max(abs($this->MaxValue),abs($this->MinValue)));
739
-		if ($strl > 6) $paddleft += ($strl * 4);
740
-		$group->setPadding($paddleft, $paddright);		// Width on left and right for Y axis values
741
-		$group->legend->setSpace(0);
742
-		$group->legend->setPadding(2,2,2,2);
743
-		$group->legend->setPosition(null, 0.1);
744
-		$group->legend->setBackgroundColor($colorsemitrans);
745
-
746
-		if (is_array($this->bgcolorgrid)) $group->grid->setBackgroundColor($bgcolorgrid);
747
-		else $group->grid->setBackgroundColor($colortrans);
748
-
749
-		if ($this->hideXGrid)	$group->grid->hideVertical(true);
750
-		if ($this->hideYGrid)	$group->grid->hideHorizontal(true);
751
-
752
-		// On boucle sur chaque lot de donnees
753
-		$legends=array();
754
-		$i=0;
755
-		$nblot=count($this->data[0])-1;
756
-
757
-		while ($i < $nblot)
758
-		{
759
-			$x=0;
760
-			$values=array();
761
-			foreach($this->data as $key => $valarray)
762
-			{
763
-				$legends[$x] = $valarray[0];
764
-				$values[$x]  = $valarray[$i+1];
765
-				$x++;
766
-			}
767
-
768
-			// We fix unknown values to null
769
-			$newvalues=array();
770
-			foreach($values as $val)
771
-			{
772
-				$newvalues[]=(is_numeric($val) ? $val : null);
773
-			}
696
+        global $artichow_defaultfont;
697
+
698
+        dol_syslog(get_class($this)."::draw_artichow this->type=".join(',',$this->type));
699
+
700
+        if (! defined('SHADOW_RIGHT_TOP'))  define('SHADOW_RIGHT_TOP',3);
701
+        if (! defined('LEGEND_BACKGROUND')) define('LEGEND_BACKGROUND',2);
702
+        if (! defined('LEGEND_LINE'))       define('LEGEND_LINE',1);
703
+
704
+        // Create graph
705
+        $classname='';
706
+        if (! isset($this->type[0]) || $this->type[0] == 'bars')  $classname='BarPlot';    // Only one type (first one) is supported by artichow
707
+        else if ($this->type[0] == 'lines' || $this->type[0] == 'linesnopoint') $classname='LinePlot';
708
+        else $classname='TypeUnknown';
709
+        include_once ARTICHOW_PATH.$classname.'.class.php';
710
+
711
+        // Definition de couleurs
712
+        $bgcolor=new Color($this->bgcolor[0],$this->bgcolor[1],$this->bgcolor[2]);
713
+        $bgcolorgrid=new Color($this->bgcolorgrid[0],$this->bgcolorgrid[1],$this->bgcolorgrid[2]);
714
+        $colortrans=new Color(0,0,0,100);
715
+        $colorsemitrans=new Color(255,255,255,60);
716
+        $colorgradient= new LinearGradient(new Color(235, 235, 235),new Color(255, 255, 255),0);
717
+        $colorwhite=new Color(255,255,255);
718
+
719
+        // Graph
720
+        $graph = new Graph($this->width, $this->height);
721
+        $graph->border->hide();
722
+        $graph->setAntiAliasing(true);
723
+        if (isset($this->title))
724
+        {
725
+            $graph->title->set($this->title);
726
+            //print $artichow_defaultfont;exit;
727
+            $graph->title->setFont(new $artichow_defaultfont(10));
728
+        }
729
+
730
+        if (is_array($this->bgcolor)) $graph->setBackgroundColor($bgcolor);
731
+        else $graph->setBackgroundGradient($colorgradient);
732
+
733
+        $group = new PlotGroup;
734
+        //$group->setSpace(5, 5, 0, 0);
735
+
736
+        $paddleft=50;
737
+        $paddright=10;
738
+        $strl=dol_strlen(max(abs($this->MaxValue),abs($this->MinValue)));
739
+        if ($strl > 6) $paddleft += ($strl * 4);
740
+        $group->setPadding($paddleft, $paddright);		// Width on left and right for Y axis values
741
+        $group->legend->setSpace(0);
742
+        $group->legend->setPadding(2,2,2,2);
743
+        $group->legend->setPosition(null, 0.1);
744
+        $group->legend->setBackgroundColor($colorsemitrans);
745
+
746
+        if (is_array($this->bgcolorgrid)) $group->grid->setBackgroundColor($bgcolorgrid);
747
+        else $group->grid->setBackgroundColor($colortrans);
748
+
749
+        if ($this->hideXGrid)	$group->grid->hideVertical(true);
750
+        if ($this->hideYGrid)	$group->grid->hideHorizontal(true);
751
+
752
+        // On boucle sur chaque lot de donnees
753
+        $legends=array();
754
+        $i=0;
755
+        $nblot=count($this->data[0])-1;
756
+
757
+        while ($i < $nblot)
758
+        {
759
+            $x=0;
760
+            $values=array();
761
+            foreach($this->data as $key => $valarray)
762
+            {
763
+                $legends[$x] = $valarray[0];
764
+                $values[$x]  = $valarray[$i+1];
765
+                $x++;
766
+            }
767
+
768
+            // We fix unknown values to null
769
+            $newvalues=array();
770
+            foreach($values as $val)
771
+            {
772
+                $newvalues[]=(is_numeric($val) ? $val : null);
773
+            }
774
+
775
+
776
+            if ($this->type[0] == 'bars')
777
+            {
778
+                //print "Lot de donnees $i<br>";
779
+                //print_r($values);
780
+                //print '<br>';
781
+
782
+                $color=new Color($this->datacolor[$i][0],$this->datacolor[$i][1],$this->datacolor[$i][2],20);
783
+                $colorbis=new Color(min($this->datacolor[$i][0]+50,255),min($this->datacolor[$i][1]+50,255),min($this->datacolor[$i][2]+50,255),50);
784
+
785
+                $colorgrey=new Color(100,100,100);
786
+                $colorborder=new Color($this->datacolor[$i][0],$this->datacolor[$i][1],$this->datacolor[$i][2]);
787
+
788
+                if ($this->mode == 'side')  $plot = new BarPlot($newvalues, $i+1, $nblot);
789
+                if ($this->mode == 'depth') $plot = new BarPlot($newvalues, 1, 1, ($nblot-$i-1)*5);
790
+
791
+                $plot->barBorder->setColor($colorgrey);
792
+                //$plot->setBarColor($color);
793
+                $plot->setBarGradient(new LinearGradient($colorbis, $color, 90));
794
+
795
+                if ($this->mode == 'side')  $plot->setBarPadding(0.1, 0.1);
796
+                if ($this->mode == 'depth') $plot->setBarPadding(0.1, 0.4);
797
+                if ($this->mode == 'side')  $plot->setBarSpace(5);
798
+                if ($this->mode == 'depth') $plot->setBarSpace(2);
799
+
800
+                $plot->barShadow->setSize($this->SetShading);
801
+                $plot->barShadow->setPosition(SHADOW_RIGHT_TOP);
802
+                $plot->barShadow->setColor(new Color(160, 160, 160, 50));
803
+                $plot->barShadow->smooth(true);
804
+                //$plot->setSize(1, 0.96);
805
+                //$plot->setCenter(0.5, 0.52);
806
+
807
+                // Le mode automatique est plus efficace
808
+                $plot->SetYMax($this->MaxValue);
809
+                $plot->SetYMin($this->MinValue);
810
+            }
811
+
812
+            if ($this->type[0] == 'lines' || $this->type[0] == 'linesnopoint')
813
+            {
814
+                $color=new Color($this->datacolor[$i][0],$this->datacolor[$i][1],$this->datacolor[$i][2],20);
815
+                $colorbis=new Color(min($this->datacolor[$i][0]+20,255),min($this->datacolor[$i][1]+20,255),min($this->datacolor[$i][2]+20,255),60);
816
+                $colorter=new Color(min($this->datacolor[$i][0]+50,255),min($this->datacolor[$i][1]+50,255),min($this->datacolor[$i][2]+50,255),90);
817
+
818
+                $plot = new LinePlot($newvalues);
819
+                //$plot->setSize(1, 0.96);
820
+                //$plot->setCenter(0.5, 0.52);
821
+
822
+                $plot->setColor($color);
823
+                $plot->setThickness(1);
824
+
825
+                // Set line background gradient
826
+                $plot->setFillGradient(new LinearGradient($colorter, $colorbis, 90));
827
+
828
+                $plot->xAxis->setLabelText($legends);
829
+
830
+                // Le mode automatique est plus efficace
831
+                $plot->SetYMax($this->MaxValue);
832
+                $plot->SetYMin($this->MinValue);
833
+                //$plot->setYAxis(0);
834
+                //$plot->hideLine(true);
835
+            }
836
+
837
+            //$plot->reduce(80);		// Evite temps d'affichage trop long et nombre de ticks absisce satures
838
+
839
+            $group->legend->setTextFont(new $artichow_defaultfont(10)); // This is to force Artichow to use awFileFontDriver to
840
+            // solve a bug in Artichow with UTF8
841
+            if (count($this->Legend))
842
+            {
843
+                if ($this->type[0] == 'bars')  										$group->legend->add($plot, $this->Legend[$i], LEGEND_BACKGROUND);
844
+                if ($this->type[0] == 'lines' || $this->type[0] == 'linesnopoint')	$group->legend->add($plot, $this->Legend[$i], LEGEND_LINE);
845
+            }
846
+            $group->add($plot);
774 847
 
848
+            $i++;
849
+        }
850
+
851
+        $group->axis->bottom->setLabelText($legends);
852
+        $group->axis->bottom->label->setFont(new $artichow_defaultfont(7));
853
+
854
+        //print $group->axis->bottom->getLabelNumber();
855
+        if ($this->labelInterval > 0) $group->axis->bottom->setLabelInterval($this->labelInterval);
775 856
 
776
-			if ($this->type[0] == 'bars')
777
-			{
778
-				//print "Lot de donnees $i<br>";
779
-				//print_r($values);
780
-				//print '<br>';
781
-
782
-				$color=new Color($this->datacolor[$i][0],$this->datacolor[$i][1],$this->datacolor[$i][2],20);
783
-				$colorbis=new Color(min($this->datacolor[$i][0]+50,255),min($this->datacolor[$i][1]+50,255),min($this->datacolor[$i][2]+50,255),50);
784
-
785
-				$colorgrey=new Color(100,100,100);
786
-				$colorborder=new Color($this->datacolor[$i][0],$this->datacolor[$i][1],$this->datacolor[$i][2]);
787
-
788
-				if ($this->mode == 'side')  $plot = new BarPlot($newvalues, $i+1, $nblot);
789
-				if ($this->mode == 'depth') $plot = new BarPlot($newvalues, 1, 1, ($nblot-$i-1)*5);
790
-
791
-				$plot->barBorder->setColor($colorgrey);
792
-				//$plot->setBarColor($color);
793
-				$plot->setBarGradient(new LinearGradient($colorbis, $color, 90));
794
-
795
-				if ($this->mode == 'side')  $plot->setBarPadding(0.1, 0.1);
796
-				if ($this->mode == 'depth') $plot->setBarPadding(0.1, 0.4);
797
-				if ($this->mode == 'side')  $plot->setBarSpace(5);
798
-				if ($this->mode == 'depth') $plot->setBarSpace(2);
799
-
800
-				$plot->barShadow->setSize($this->SetShading);
801
-				$plot->barShadow->setPosition(SHADOW_RIGHT_TOP);
802
-				$plot->barShadow->setColor(new Color(160, 160, 160, 50));
803
-				$plot->barShadow->smooth(true);
804
-				//$plot->setSize(1, 0.96);
805
-				//$plot->setCenter(0.5, 0.52);
806
-
807
-				// Le mode automatique est plus efficace
808
-				$plot->SetYMax($this->MaxValue);
809
-				$plot->SetYMin($this->MinValue);
810
-			}
857
+        $graph->add($group);
858
+
859
+        // Generate file
860
+        $graph->draw($file);
811 861
 
812
-			if ($this->type[0] == 'lines' || $this->type[0] == 'linesnopoint')
813
-			{
814
-				$color=new Color($this->datacolor[$i][0],$this->datacolor[$i][1],$this->datacolor[$i][2],20);
815
-				$colorbis=new Color(min($this->datacolor[$i][0]+20,255),min($this->datacolor[$i][1]+20,255),min($this->datacolor[$i][2]+20,255),60);
816
-				$colorter=new Color(min($this->datacolor[$i][0]+50,255),min($this->datacolor[$i][1]+50,255),min($this->datacolor[$i][2]+50,255),90);
817
-
818
-				$plot = new LinePlot($newvalues);
819
-				//$plot->setSize(1, 0.96);
820
-				//$plot->setCenter(0.5, 0.52);
821
-
822
-				$plot->setColor($color);
823
-				$plot->setThickness(1);
824
-
825
-				// Set line background gradient
826
-				$plot->setFillGradient(new LinearGradient($colorter, $colorbis, 90));
827
-
828
-				$plot->xAxis->setLabelText($legends);
829
-
830
-				// Le mode automatique est plus efficace
831
-				$plot->SetYMax($this->MaxValue);
832
-				$plot->SetYMin($this->MinValue);
833
-				//$plot->setYAxis(0);
834
-				//$plot->hideLine(true);
835
-			}
836
-
837
-			//$plot->reduce(80);		// Evite temps d'affichage trop long et nombre de ticks absisce satures
838
-
839
-			$group->legend->setTextFont(new $artichow_defaultfont(10)); // This is to force Artichow to use awFileFontDriver to
840
-			// solve a bug in Artichow with UTF8
841
-			if (count($this->Legend))
842
-			{
843
-				if ($this->type[0] == 'bars')  										$group->legend->add($plot, $this->Legend[$i], LEGEND_BACKGROUND);
844
-				if ($this->type[0] == 'lines' || $this->type[0] == 'linesnopoint')	$group->legend->add($plot, $this->Legend[$i], LEGEND_LINE);
845
-			}
846
-			$group->add($plot);
847
-
848
-			$i++;
849
-		}
850
-
851
-		$group->axis->bottom->setLabelText($legends);
852
-		$group->axis->bottom->label->setFont(new $artichow_defaultfont(7));
853
-
854
-		//print $group->axis->bottom->getLabelNumber();
855
-		if ($this->labelInterval > 0) $group->axis->bottom->setLabelInterval($this->labelInterval);
856
-
857
-		$graph->add($group);
858
-
859
-		// Generate file
860
-		$graph->draw($file);
861
-
862
-		$this->stringtoshow='<!-- Build using '.$this->_library.' --><img src="'.$fileurl.'" title="'.dol_escape_htmltag($this->title?$this->title:$this->YLabel).'" alt="'.dol_escape_htmltag($this->title?$this->title:$this->YLabel).'">';
863
-	}
862
+        $this->stringtoshow='<!-- Build using '.$this->_library.' --><img src="'.$fileurl.'" title="'.dol_escape_htmltag($this->title?$this->title:$this->YLabel).'" alt="'.dol_escape_htmltag($this->title?$this->title:$this->YLabel).'">';
863
+    }
864 864
 
865 865
 
866 866
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
867
-	/**
868
-	 * Build a graph using JFlot library. Input when calling this method should be:
869
-	 *	$this->data  = array(array(0=>'labelxA',1=>yA),  array('labelxB',yB));
870
-	 *	$this->data  = array(array(0=>'labelxA',1=>yA1,...,n=>yAn), array('labelxB',yB1,...yBn));   // or when there is n series to show for each x
871
-	 *  $this->data  = array(array('label'=>'labelxA','data'=>yA),  array('labelxB',yB));			// Syntax deprecated
872
-	 *  $this->legend= array("Val1",...,"Valn");													// list of n series name
873
-	 *  $this->type  = array('bars',...'lines'); or array('pie')
874
-	 *  $this->mode = 'depth' ???
875
-	 *  $this->bgcolorgrid
876
-	 *  $this->datacolor
877
-	 *  $this->shownodatagraph
878
-	 *
879
-	 * @param	string	$file    	Image file name to use to save onto disk (also used as javascript unique id)
880
-	 * @param	string	$fileurl	Url path to show image if saved onto disk. Never used here.
881
-	 * @return	void
882
-	 */
883
-	private function draw_jflot($file, $fileurl)
884
-	{
867
+    /**
868
+     * Build a graph using JFlot library. Input when calling this method should be:
869
+     *	$this->data  = array(array(0=>'labelxA',1=>yA),  array('labelxB',yB));
870
+     *	$this->data  = array(array(0=>'labelxA',1=>yA1,...,n=>yAn), array('labelxB',yB1,...yBn));   // or when there is n series to show for each x
871
+     *  $this->data  = array(array('label'=>'labelxA','data'=>yA),  array('labelxB',yB));			// Syntax deprecated
872
+     *  $this->legend= array("Val1",...,"Valn");													// list of n series name
873
+     *  $this->type  = array('bars',...'lines'); or array('pie')
874
+     *  $this->mode = 'depth' ???
875
+     *  $this->bgcolorgrid
876
+     *  $this->datacolor
877
+     *  $this->shownodatagraph
878
+     *
879
+     * @param	string	$file    	Image file name to use to save onto disk (also used as javascript unique id)
880
+     * @param	string	$fileurl	Url path to show image if saved onto disk. Never used here.
881
+     * @return	void
882
+     */
883
+    private function draw_jflot($file, $fileurl)
884
+    {
885 885
         // phpcs:enable
886
-		global $artichow_defaultfont;
887
-
888
-		dol_syslog(get_class($this)."::draw_jflot this->type=".join(',',$this->type)." this->MaxValue=".$this->MaxValue);
889
-
890
-		if (empty($this->width) && empty($this->height))
891
-		{
892
-			print 'Error width or height not set';
893
-			return;
894
-		}
895
-
896
-		$legends=array();
897
-		$nblot=count($this->data[0])-1;    // -1 to remove legend
898
-		if ($nblot < 0) dol_syslog('Bad value for property ->data. Must be set by mydolgraph->SetData before calling mydolgrapgh->draw', LOG_WARNING);
899
-		$firstlot=0;
900
-		// Works with line but not with bars
901
-		//if ($nblot > 2) $firstlot = ($nblot - 2);        // We limit nblot to 2 because jflot can't manage more than 2 bars on same x
902
-
903
-		$i=$firstlot;
904
-		$serie=array();
905
-		while ($i < $nblot)	// Loop on each serie
906
-		{
907
-			$values=array();	// Array with horizontal y values (specific values of a serie) for each abscisse x
908
-			$serie[$i]="var d".$i." = [];\n";
909
-
910
-			// Fill array $values
911
-			$x=0;
912
-			foreach($this->data as $valarray)	// Loop on each x
913
-			{
914
-				$legends[$x] = $valarray[0];
915
-				$values[$x]  = (is_numeric($valarray[$i+1]) ? $valarray[$i+1] : null);
916
-				$x++;
917
-			}
918
-
919
-			// TODO Avoid push by adding generated long array...
920
-			if (isset($this->type[$firstlot]) && $this->type[$firstlot] == 'pie')
921
-			{
922
-				foreach($values as $x => $y) {
923
-					if (isset($y)) $serie[$i].='d'.$i.'.push({"label":"'.dol_escape_js($legends[$x]).'", "data":'.$y.'});'."\n";
924
-				}
925
-			}
926
-			else
927
-			{
928
-				foreach($values as $x => $y) {
929
-					if (isset($y)) $serie[$i].='d'.$i.'.push(['.$x.', '.$y.']);'."\n";
930
-				}
931
-			}
932
-
933
-			unset($values);
934
-			$i++;
935
-		}
936
-		$tag=dol_escape_htmltag(dol_string_unaccent(dol_string_nospecial(basename($file),'_',array('-','.'))));
937
-
938
-		$this->stringtoshow ='<!-- Build using '.$this->_library.' -->'."\n";
939
-		if (! empty($this->title)) $this->stringtoshow.='<div align="center" class="dolgraphtitle'.(empty($this->cssprefix)?'':' dolgraphtitle'.$this->cssprefix).'">'.$this->title.'</div>';
940
-		if (! empty($this->shownographyet))
941
-		{
942
-		  $this->stringtoshow.='<div style="width:'.$this->width.'px;height:'.$this->height.'px;" class="nographyet"></div>';
943
-		  $this->stringtoshow.='<div class="nographyettext">'.$langs->trans("NotEnoughDataYet").'</div>';
944
-		  return;
945
-		}
946
-		$this->stringtoshow.='<div id="placeholder_'.$tag.'" style="width:'.$this->width.'px;height:'.$this->height.'px;" class="dolgraph'.(empty($this->cssprefix)?'':' dolgraph'.$this->cssprefix).'"></div>'."\n";
947
-
948
-		$this->stringtoshow.='<script id="'.$tag.'">'."\n";
949
-		$this->stringtoshow.='$(function () {'."\n";
950
-		$i=$firstlot;
951
-		if ($nblot < 0)
952
-		{
953
-			$this->stringtoshow.='<!-- No series of data -->';
954
-		}
955
-		else
956
-		{
957
-			while ($i < $nblot)
958
-			{
959
-				$this->stringtoshow.=$serie[$i];
960
-				$i++;
961
-			}
962
-		}
963
-		$this->stringtoshow.="\n";
964
-
965
-		// Special case for Graph of type 'pie'
966
-		if (isset($this->type[$firstlot]) && $this->type[$firstlot] == 'pie')
967
-		{
968
-			$datacolor=array();
969
-			foreach($this->datacolor as $val) $datacolor[]="#".sprintf("%02x%02x%02x",$val[0],$val[1],$val[2]);
970
-
971
-			$urltemp='';	// TODO Add support for url link into labels
972
-			$showlegend=$this->showlegend;
973
-			$showpointvalue=$this->showpointvalue;
974
-			$showpercent=$this->showpercent;
975
-
976
-			$this->stringtoshow.= '
886
+        global $artichow_defaultfont;
887
+
888
+        dol_syslog(get_class($this)."::draw_jflot this->type=".join(',',$this->type)." this->MaxValue=".$this->MaxValue);
889
+
890
+        if (empty($this->width) && empty($this->height))
891
+        {
892
+            print 'Error width or height not set';
893
+            return;
894
+        }
895
+
896
+        $legends=array();
897
+        $nblot=count($this->data[0])-1;    // -1 to remove legend
898
+        if ($nblot < 0) dol_syslog('Bad value for property ->data. Must be set by mydolgraph->SetData before calling mydolgrapgh->draw', LOG_WARNING);
899
+        $firstlot=0;
900
+        // Works with line but not with bars
901
+        //if ($nblot > 2) $firstlot = ($nblot - 2);        // We limit nblot to 2 because jflot can't manage more than 2 bars on same x
902
+
903
+        $i=$firstlot;
904
+        $serie=array();
905
+        while ($i < $nblot)	// Loop on each serie
906
+        {
907
+            $values=array();	// Array with horizontal y values (specific values of a serie) for each abscisse x
908
+            $serie[$i]="var d".$i." = [];\n";
909
+
910
+            // Fill array $values
911
+            $x=0;
912
+            foreach($this->data as $valarray)	// Loop on each x
913
+            {
914
+                $legends[$x] = $valarray[0];
915
+                $values[$x]  = (is_numeric($valarray[$i+1]) ? $valarray[$i+1] : null);
916
+                $x++;
917
+            }
918
+
919
+            // TODO Avoid push by adding generated long array...
920
+            if (isset($this->type[$firstlot]) && $this->type[$firstlot] == 'pie')
921
+            {
922
+                foreach($values as $x => $y) {
923
+                    if (isset($y)) $serie[$i].='d'.$i.'.push({"label":"'.dol_escape_js($legends[$x]).'", "data":'.$y.'});'."\n";
924
+                }
925
+            }
926
+            else
927
+            {
928
+                foreach($values as $x => $y) {
929
+                    if (isset($y)) $serie[$i].='d'.$i.'.push(['.$x.', '.$y.']);'."\n";
930
+                }
931
+            }
932
+
933
+            unset($values);
934
+            $i++;
935
+        }
936
+        $tag=dol_escape_htmltag(dol_string_unaccent(dol_string_nospecial(basename($file),'_',array('-','.'))));
937
+
938
+        $this->stringtoshow ='<!-- Build using '.$this->_library.' -->'."\n";
939
+        if (! empty($this->title)) $this->stringtoshow.='<div align="center" class="dolgraphtitle'.(empty($this->cssprefix)?'':' dolgraphtitle'.$this->cssprefix).'">'.$this->title.'</div>';
940
+        if (! empty($this->shownographyet))
941
+        {
942
+            $this->stringtoshow.='<div style="width:'.$this->width.'px;height:'.$this->height.'px;" class="nographyet"></div>';
943
+            $this->stringtoshow.='<div class="nographyettext">'.$langs->trans("NotEnoughDataYet").'</div>';
944
+            return;
945
+        }
946
+        $this->stringtoshow.='<div id="placeholder_'.$tag.'" style="width:'.$this->width.'px;height:'.$this->height.'px;" class="dolgraph'.(empty($this->cssprefix)?'':' dolgraph'.$this->cssprefix).'"></div>'."\n";
947
+
948
+        $this->stringtoshow.='<script id="'.$tag.'">'."\n";
949
+        $this->stringtoshow.='$(function () {'."\n";
950
+        $i=$firstlot;
951
+        if ($nblot < 0)
952
+        {
953
+            $this->stringtoshow.='<!-- No series of data -->';
954
+        }
955
+        else
956
+        {
957
+            while ($i < $nblot)
958
+            {
959
+                $this->stringtoshow.=$serie[$i];
960
+                $i++;
961
+            }
962
+        }
963
+        $this->stringtoshow.="\n";
964
+
965
+        // Special case for Graph of type 'pie'
966
+        if (isset($this->type[$firstlot]) && $this->type[$firstlot] == 'pie')
967
+        {
968
+            $datacolor=array();
969
+            foreach($this->datacolor as $val) $datacolor[]="#".sprintf("%02x%02x%02x",$val[0],$val[1],$val[2]);
970
+
971
+            $urltemp='';	// TODO Add support for url link into labels
972
+            $showlegend=$this->showlegend;
973
+            $showpointvalue=$this->showpointvalue;
974
+            $showpercent=$this->showpercent;
975
+
976
+            $this->stringtoshow.= '
977 977
 			function plotWithOptions_'.$tag.'() {
978 978
 			$.plot($("#placeholder_'.$tag.'"), d0,
979 979
 			{
@@ -992,15 +992,15 @@  discard block
 block discarded – undo
992 992
 								var percent=Math.round(series.percent);
993 993
 								var number=series.data[0][1];
994 994
 								return \'';
995
-								$this->stringtoshow.='<span style="font-size:8pt;text-align:center;padding:2px;color:black;">';
996
-								if ($urltemp) $this->stringtoshow.='<a style="color: #FFFFFF;" border="0" href="'.$urltemp.'">';
997
-								$this->stringtoshow.='\'+';
998
-								$this->stringtoshow.=($showlegend?'':'label+\' \'+');	// Hide label if already shown in legend
999
-								$this->stringtoshow.=($showpointvalue?'number+':'');
1000
-								$this->stringtoshow.=($showpercent?'\'<br/>\'+percent+\'%\'+':'');
1001
-								$this->stringtoshow.='\'';
1002
-								if ($urltemp) $this->stringtoshow.='</a>';
1003
-								$this->stringtoshow.='</span>\';
995
+                                $this->stringtoshow.='<span style="font-size:8pt;text-align:center;padding:2px;color:black;">';
996
+                                if ($urltemp) $this->stringtoshow.='<a style="color: #FFFFFF;" border="0" href="'.$urltemp.'">';
997
+                                $this->stringtoshow.='\'+';
998
+                                $this->stringtoshow.=($showlegend?'':'label+\' \'+');	// Hide label if already shown in legend
999
+                                $this->stringtoshow.=($showpointvalue?'number+':'');
1000
+                                $this->stringtoshow.=($showpercent?'\'<br/>\'+percent+\'%\'+':'');
1001
+                                $this->stringtoshow.='\'';
1002
+                                if ($urltemp) $this->stringtoshow.='</a>';
1003
+                                $this->stringtoshow.='</span>\';
1004 1004
 							},
1005 1005
 							background: {
1006 1006
 							opacity: 0.0,
@@ -1015,20 +1015,20 @@  discard block
 block discarded – undo
1015 1015
 			pan: {
1016 1016
 				interactive: true
1017 1017
 			},';
1018
-			if (count($datacolor))
1019
-			{
1020
-				$this->stringtoshow.='colors: '.(! empty($data['seriescolor']) ? json_encode($data['seriescolor']) : json_encode($datacolor)).',';
1021
-			}
1022
-			$this->stringtoshow.='legend: {show: '.($showlegend?'true':'false').', position: \'ne\' }
1018
+            if (count($datacolor))
1019
+            {
1020
+                $this->stringtoshow.='colors: '.(! empty($data['seriescolor']) ? json_encode($data['seriescolor']) : json_encode($datacolor)).',';
1021
+            }
1022
+            $this->stringtoshow.='legend: {show: '.($showlegend?'true':'false').', position: \'ne\' }
1023 1023
 		});
1024 1024
 		}'."\n";
1025
-		}
1026
-		// Other cases, graph of type 'bars', 'lines'
1027
-		else
1028
-		{
1029
-			// Add code to support tooltips
1030
-		    // TODO: remove js css and use graph-tooltip-inner class instead by adding css in each themes
1031
-			$this->stringtoshow.='
1025
+        }
1026
+        // Other cases, graph of type 'bars', 'lines'
1027
+        else
1028
+        {
1029
+            // Add code to support tooltips
1030
+            // TODO: remove js css and use graph-tooltip-inner class instead by adding css in each themes
1031
+            $this->stringtoshow.='
1032 1032
 			function showTooltip_'.$tag.'(x, y, contents) {
1033 1033
 				$(\'<div class="graph-tooltip-inner" id="tooltip_'.$tag.'">\' + contents + \'</div>\').css({
1034 1034
 					position: \'absolute\',
@@ -1060,10 +1060,10 @@  discard block
 block discarded – undo
1060 1060
 						var y = item.datapoint[1].toFixed(2);
1061 1061
 						var z = item.series.xaxis.ticks[item.dataIndex].label;
1062 1062
 						';
1063
-						if ($this->showpointvalue > 0) $this->stringtoshow.='
1063
+                        if ($this->showpointvalue > 0) $this->stringtoshow.='
1064 1064
 							showTooltip_'.$tag.'(item.pageX, item.pageY, item.series.label + "<br>" + z + " => " + y);
1065 1065
 						';
1066
-						$this->stringtoshow.='
1066
+                        $this->stringtoshow.='
1067 1067
 					}
1068 1068
 				}
1069 1069
 				else {
@@ -1073,95 +1073,95 @@  discard block
 block discarded – undo
1073 1073
 			});
1074 1074
 			';
1075 1075
 
1076
-			$this->stringtoshow.='var stack = null, steps = false;'."\n";
1077
-
1078
-			$this->stringtoshow.='function plotWithOptions_'.$tag.'() {'."\n";
1079
-			$this->stringtoshow.='$.plot($("#placeholder_'.$tag.'"), [ '."\n";
1080
-			$i=$firstlot;
1081
-			while ($i < $nblot)
1082
-			{
1083
-				if ($i > $firstlot) $this->stringtoshow.=', '."\n";
1084
-				$color=sprintf("%02x%02x%02x",$this->datacolor[$i][0],$this->datacolor[$i][1],$this->datacolor[$i][2]);
1085
-				$this->stringtoshow.='{ ';
1086
-				if (! isset($this->type[$i]) || $this->type[$i] == 'bars') $this->stringtoshow.='bars: { lineWidth: 1, show: true, align: "'.($i==$firstlot?'center':'left').'", barWidth: 0.5 }, ';
1087
-				if (isset($this->type[$i]) && ($this->type[$i] == 'lines' || $this->type[$i] == 'linesnopoint')) $this->stringtoshow.='lines: { show: true, fill: false }, points: { show: '.($this->type[$i] == 'linesnopoint' ? 'false' : 'true').' }, ';
1088
-				$this->stringtoshow.='color: "#'.$color.'", label: "'.(isset($this->Legend[$i]) ? dol_escape_js($this->Legend[$i]) : '').'", data: d'.$i.' }';
1089
-				$i++;
1090
-			}
1091
-			// shadowSize: 0 -> Drawing is faster without shadows
1092
-			$this->stringtoshow.="\n".' ], { series: { shadowSize: 0, stack: stack, lines: { fill: false, steps: steps }, bars: { barWidth: 0.6 } }'."\n";
1093
-
1094
-			// Xaxis
1095
-			$this->stringtoshow.=', xaxis: { ticks: ['."\n";
1096
-			$x=0;
1097
-			foreach($this->data as $key => $valarray)
1098
-			{
1099
-				if ($x > 0) $this->stringtoshow.=', '."\n";
1100
-				$this->stringtoshow.= ' ['.$x.', "'.$valarray[0].'"]';
1101
-				$x++;
1102
-			}
1103
-			$this->stringtoshow.='] }'."\n";
1104
-
1105
-			// Yaxis
1106
-			$this->stringtoshow.=', yaxis: { min: '.$this->MinValue.', max: '.($this->MaxValue).' }'."\n";
1107
-
1108
-			// Background color
1109
-			$color1=sprintf("%02x%02x%02x",$this->bgcolorgrid[0],$this->bgcolorgrid[0],$this->bgcolorgrid[2]);
1110
-			$color2=sprintf("%02x%02x%02x",$this->bgcolorgrid[0],$this->bgcolorgrid[1],$this->bgcolorgrid[2]);
1111
-			$this->stringtoshow.=', grid: { hoverable: true, backgroundColor: { colors: ["#'.$color1.'", "#'.$color2.'"] }, borderWidth: 1, borderColor: \'#e6e6e6\', tickColor  : \'#e6e6e6\' }'."\n";
1112
-			//$this->stringtoshow.=', shadowSize: 20'."\n";    TODO Uncommet this
1113
-			$this->stringtoshow.='});'."\n";
1114
-			$this->stringtoshow.='}'."\n";
1115
-		}
1116
-
1117
-		$this->stringtoshow.='plotWithOptions_'.$tag.'();'."\n";
1118
-		$this->stringtoshow.='});'."\n";
1119
-		$this->stringtoshow.='</script>'."\n";
1120
-	}
1121
-
1122
-
1123
-
1124
-	/**
1125
-	 * Output HTML string to show graph
1126
-	 *
1127
-	 * @param	int			$shownographyet 	Show graph to say there is not enough data
1128
-	 * @return	string							HTML string to show graph
1129
-	 */
1130
-	function show($shownographyet=0)
1131
-	{
1132
-		global $langs;
1133
-
1134
-		if ($shownographyet)
1135
-		{
1136
-			$s= '<div class="nographyet" style="width:'.(preg_match('/%/',$this->width)?$this->width:$this->width.'px').'; height:'.(preg_match('/%/',$this->height)?$this->height:$this->height.'px').';"></div>';
1137
-			$s.='<div class="nographyettext">'.$langs->trans("NotEnoughDataYet").'</div>';
1138
-			return $s;
1139
-		}
1140
-
1141
-		return $this->stringtoshow;
1142
-	}
1143
-
1144
-
1145
-	/**
1146
-	 * getDefaultGraphSizeForStats
1147
-	 *
1148
-	 * @param	string	$direction		'width' or 'height'
1149
-	 * @param	string	$defaultsize	Value we want as default size
1150
-	 * @return	int						Value of width or height to use by default
1151
-	 */
1152
-	static function getDefaultGraphSizeForStats($direction,$defaultsize='')
1153
-	{
1154
-		global $conf;
1155
-
1156
-		if ($direction == 'width')
1157
-		{
1158
-			if (empty($conf->dol_optimize_smallscreen)) return ($defaultsize ? $defaultsize : '500');
1159
-			else return (empty($_SESSION['dol_screen_width']) ? '280' : ($_SESSION['dol_screen_width']-40));
1160
-		}
1161
-		if ($direction == 'height')
1162
-		{
1163
-			return (empty($conf->dol_optimize_smallscreen)?($defaultsize?$defaultsize:'200'):'160');
1164
-		}
1165
-		return 0;
1166
-	}
1076
+            $this->stringtoshow.='var stack = null, steps = false;'."\n";
1077
+
1078
+            $this->stringtoshow.='function plotWithOptions_'.$tag.'() {'."\n";
1079
+            $this->stringtoshow.='$.plot($("#placeholder_'.$tag.'"), [ '."\n";
1080
+            $i=$firstlot;
1081
+            while ($i < $nblot)
1082
+            {
1083
+                if ($i > $firstlot) $this->stringtoshow.=', '."\n";
1084
+                $color=sprintf("%02x%02x%02x",$this->datacolor[$i][0],$this->datacolor[$i][1],$this->datacolor[$i][2]);
1085
+                $this->stringtoshow.='{ ';
1086
+                if (! isset($this->type[$i]) || $this->type[$i] == 'bars') $this->stringtoshow.='bars: { lineWidth: 1, show: true, align: "'.($i==$firstlot?'center':'left').'", barWidth: 0.5 }, ';
1087
+                if (isset($this->type[$i]) && ($this->type[$i] == 'lines' || $this->type[$i] == 'linesnopoint')) $this->stringtoshow.='lines: { show: true, fill: false }, points: { show: '.($this->type[$i] == 'linesnopoint' ? 'false' : 'true').' }, ';
1088
+                $this->stringtoshow.='color: "#'.$color.'", label: "'.(isset($this->Legend[$i]) ? dol_escape_js($this->Legend[$i]) : '').'", data: d'.$i.' }';
1089
+                $i++;
1090
+            }
1091
+            // shadowSize: 0 -> Drawing is faster without shadows
1092
+            $this->stringtoshow.="\n".' ], { series: { shadowSize: 0, stack: stack, lines: { fill: false, steps: steps }, bars: { barWidth: 0.6 } }'."\n";
1093
+
1094
+            // Xaxis
1095
+            $this->stringtoshow.=', xaxis: { ticks: ['."\n";
1096
+            $x=0;
1097
+            foreach($this->data as $key => $valarray)
1098
+            {
1099
+                if ($x > 0) $this->stringtoshow.=', '."\n";
1100
+                $this->stringtoshow.= ' ['.$x.', "'.$valarray[0].'"]';
1101
+                $x++;
1102
+            }
1103
+            $this->stringtoshow.='] }'."\n";
1104
+
1105
+            // Yaxis
1106
+            $this->stringtoshow.=', yaxis: { min: '.$this->MinValue.', max: '.($this->MaxValue).' }'."\n";
1107
+
1108
+            // Background color
1109
+            $color1=sprintf("%02x%02x%02x",$this->bgcolorgrid[0],$this->bgcolorgrid[0],$this->bgcolorgrid[2]);
1110
+            $color2=sprintf("%02x%02x%02x",$this->bgcolorgrid[0],$this->bgcolorgrid[1],$this->bgcolorgrid[2]);
1111
+            $this->stringtoshow.=', grid: { hoverable: true, backgroundColor: { colors: ["#'.$color1.'", "#'.$color2.'"] }, borderWidth: 1, borderColor: \'#e6e6e6\', tickColor  : \'#e6e6e6\' }'."\n";
1112
+            //$this->stringtoshow.=', shadowSize: 20'."\n";    TODO Uncommet this
1113
+            $this->stringtoshow.='});'."\n";
1114
+            $this->stringtoshow.='}'."\n";
1115
+        }
1116
+
1117
+        $this->stringtoshow.='plotWithOptions_'.$tag.'();'."\n";
1118
+        $this->stringtoshow.='});'."\n";
1119
+        $this->stringtoshow.='</script>'."\n";
1120
+    }
1121
+
1122
+
1123
+
1124
+    /**
1125
+     * Output HTML string to show graph
1126
+     *
1127
+     * @param	int			$shownographyet 	Show graph to say there is not enough data
1128
+     * @return	string							HTML string to show graph
1129
+     */
1130
+    function show($shownographyet=0)
1131
+    {
1132
+        global $langs;
1133
+
1134
+        if ($shownographyet)
1135
+        {
1136
+            $s= '<div class="nographyet" style="width:'.(preg_match('/%/',$this->width)?$this->width:$this->width.'px').'; height:'.(preg_match('/%/',$this->height)?$this->height:$this->height.'px').';"></div>';
1137
+            $s.='<div class="nographyettext">'.$langs->trans("NotEnoughDataYet").'</div>';
1138
+            return $s;
1139
+        }
1140
+
1141
+        return $this->stringtoshow;
1142
+    }
1143
+
1144
+
1145
+    /**
1146
+     * getDefaultGraphSizeForStats
1147
+     *
1148
+     * @param	string	$direction		'width' or 'height'
1149
+     * @param	string	$defaultsize	Value we want as default size
1150
+     * @return	int						Value of width or height to use by default
1151
+     */
1152
+    static function getDefaultGraphSizeForStats($direction,$defaultsize='')
1153
+    {
1154
+        global $conf;
1155
+
1156
+        if ($direction == 'width')
1157
+        {
1158
+            if (empty($conf->dol_optimize_smallscreen)) return ($defaultsize ? $defaultsize : '500');
1159
+            else return (empty($_SESSION['dol_screen_width']) ? '280' : ($_SESSION['dol_screen_width']-40));
1160
+        }
1161
+        if ($direction == 'height')
1162
+        {
1163
+            return (empty($conf->dol_optimize_smallscreen)?($defaultsize?$defaultsize:'200'):'160');
1164
+        }
1165
+        return 0;
1166
+    }
1167 1167
 }
Please login to merge, or discard this patch.
Spacing   +198 added lines, -198 removed lines patch added patch discarded remove patch
@@ -39,48 +39,48 @@  discard block
 block discarded – undo
39 39
  */
40 40
 class DolGraph
41 41
 {
42
-	public $type=array();			// Array with type of each series. Example: array('bars', 'lines', ...)
43
-	public $mode='side';		    // Mode bars graph: side, depth
44
-	private $_library='jflot';	// Graphic library to use (jflot, artichow)
42
+	public $type = array(); // Array with type of each series. Example: array('bars', 'lines', ...)
43
+	public $mode = 'side'; // Mode bars graph: side, depth
44
+	private $_library = 'jflot'; // Graphic library to use (jflot, artichow)
45 45
 
46 46
 	//! Array of data
47
-	public $data;				// Data of graph: array(array('abs1',valA1,valB1), array('abs2',valA2,valB2), ...)
48
-	public $title;				// Title of graph
49
-	public $cssprefix='';		// To add into css styles
50
-	public $width=380;
51
-	public $height=200;
52
-	public $MaxValue=0;
53
-	public $MinValue=0;
54
-	public $SetShading=0;
55
-
56
-	public $PrecisionY=-1;
57
-
58
-	public $horizTickIncrement=-1;
59
-	public $SetNumXTicks=-1;
60
-	public $labelInterval=-1;
61
-
62
-	public $hideXGrid=false;
63
-	public $hideYGrid=false;
64
-
65
-	public $Legend=array();
66
-	public $LegendWidthMin=0;
67
-	public $showlegend=1;
68
-	public $showpointvalue=1;
69
-	public $showpercent=0;
70
-	public $combine=0;				// 0.05 if you want to combine records < 5% into "other"
71
-	public $graph;     			// Objet Graph (Artichow, Phplot...)
47
+	public $data; // Data of graph: array(array('abs1',valA1,valB1), array('abs2',valA2,valB2), ...)
48
+	public $title; // Title of graph
49
+	public $cssprefix = ''; // To add into css styles
50
+	public $width = 380;
51
+	public $height = 200;
52
+	public $MaxValue = 0;
53
+	public $MinValue = 0;
54
+	public $SetShading = 0;
55
+
56
+	public $PrecisionY = -1;
57
+
58
+	public $horizTickIncrement = -1;
59
+	public $SetNumXTicks = -1;
60
+	public $labelInterval = -1;
61
+
62
+	public $hideXGrid = false;
63
+	public $hideYGrid = false;
64
+
65
+	public $Legend = array();
66
+	public $LegendWidthMin = 0;
67
+	public $showlegend = 1;
68
+	public $showpointvalue = 1;
69
+	public $showpercent = 0;
70
+	public $combine = 0; // 0.05 if you want to combine records < 5% into "other"
71
+	public $graph; // Objet Graph (Artichow, Phplot...)
72 72
 
73 73
 	/**
74 74
 	 * @var string Error code (or message)
75 75
 	 */
76
-	public $error='';
76
+	public $error = '';
77 77
 
78
-	public $bordercolor;			// array(R,G,B)
79
-	public $bgcolor;				// array(R,G,B)
80
-	public $bgcolorgrid=array(255,255,255);			// array(R,G,B)
81
-	public $datacolor;				// array(array(R,G,B),...)
78
+	public $bordercolor; // array(R,G,B)
79
+	public $bgcolor; // array(R,G,B)
80
+	public $bgcolorgrid = array(255, 255, 255); // array(R,G,B)
81
+	public $datacolor; // array(array(R,G,B),...)
82 82
 
83
-	private $stringtoshow;      // To store string to output graph into HTML page
83
+	private $stringtoshow; // To store string to output graph into HTML page
84 84
 
85 85
 
86 86
 	/**
@@ -88,7 +88,7 @@  discard block
 block discarded – undo
88 88
 	 *
89 89
 	 * @param	string	$library		'jflot' (default) or 'artichow' (no more supported)
90 90
 	 */
91
-	function __construct($library='jflot')
91
+	function __construct($library = 'jflot')
92 92
 	{
93 93
 		global $conf;
94 94
 		global $theme_bordercolor, $theme_datacolor, $theme_bgcolor, $theme_bgcoloronglet;
@@ -96,25 +96,25 @@  discard block
 block discarded – undo
96 96
 		// To use old feature
97 97
 		if ($library == 'artichow')
98 98
 		{
99
-			$this->_library='artichow';
99
+			$this->_library = 'artichow';
100 100
 
101 101
 			// Test if module GD present
102 102
 			$modules_list = get_loaded_extensions();
103
-			$isgdinstalled=0;
103
+			$isgdinstalled = 0;
104 104
 			foreach ($modules_list as $module)
105 105
 			{
106
-				if ($module == 'gd') $isgdinstalled=1;
106
+				if ($module == 'gd') $isgdinstalled = 1;
107 107
 			}
108
-			if (! $isgdinstalled)
108
+			if (!$isgdinstalled)
109 109
 			{
110
-				$this->error="Error: PHP GD module is not available. It is required to build graphics.";
110
+				$this->error = "Error: PHP GD module is not available. It is required to build graphics.";
111 111
 				return -1;
112 112
 			}
113 113
 		}
114 114
 
115
-		$this->bordercolor = array(235,235,224);
116
-		$this->datacolor = array(array(120,130,150), array(160,160,180), array(190,190,220));
117
-		$this->bgcolor = array(235,235,224);
115
+		$this->bordercolor = array(235, 235, 224);
116
+		$this->datacolor = array(array(120, 130, 150), array(160, 160, 180), array(190, 190, 220));
117
+		$this->bgcolor = array(235, 235, 224);
118 118
 
119 119
 		$color_file = DOL_DOCUMENT_ROOT.'/theme/'.$conf->theme.'/graph-color.php';
120 120
 		if (is_readable($color_file))
@@ -448,7 +448,7 @@  discard block
 block discarded – undo
448 448
 	 */
449 449
 	function setShowLegend($showlegend)
450 450
 	{
451
-		$this->showlegend=$showlegend;
451
+		$this->showlegend = $showlegend;
452 452
 	}
453 453
 
454 454
 	/**
@@ -459,7 +459,7 @@  discard block
 block discarded – undo
459 459
 	 */
460 460
 	function setShowPointValue($showpointvalue)
461 461
 	{
462
-		$this->showpointvalue=$showpointvalue;
462
+		$this->showpointvalue = $showpointvalue;
463 463
 	}
464 464
 
465 465
 	/**
@@ -470,7 +470,7 @@  discard block
 block discarded – undo
470 470
 	 */
471 471
 	function setShowPercent($showpercent)
472 472
 	{
473
-		$this->showpercent=$showpercent;
473
+		$this->showpercent = $showpercent;
474 474
 	}
475 475
 
476 476
 
@@ -482,12 +482,12 @@  discard block
 block discarded – undo
482 482
 	 * @param	array	$bg_color		array(R,G,B) ou 'onglet' ou 'default'
483 483
 	 * @return	void
484 484
 	 */
485
-	function SetBgColor($bg_color = array(255,255,255))
485
+	function SetBgColor($bg_color = array(255, 255, 255))
486 486
 	{
487 487
         // phpcs:enable
488
-		global $theme_bgcolor,$theme_bgcoloronglet;
488
+		global $theme_bgcolor, $theme_bgcoloronglet;
489 489
 
490
-		if (! is_array($bg_color))
490
+		if (!is_array($bg_color))
491 491
 		{
492 492
 			if ($bg_color == 'onglet')
493 493
 			{
@@ -512,12 +512,12 @@  discard block
 block discarded – undo
512 512
 	 * @param	array	$bg_colorgrid		array(R,G,B) ou 'onglet' ou 'default'
513 513
 	 * @return	void
514 514
 	 */
515
-	function SetBgColorGrid($bg_colorgrid = array(255,255,255))
515
+	function SetBgColorGrid($bg_colorgrid = array(255, 255, 255))
516 516
 	{
517 517
         // phpcs:enable
518
-		global $theme_bgcolor,$theme_bgcoloronglet;
518
+		global $theme_bgcolor, $theme_bgcoloronglet;
519 519
 
520
-		if (! is_array($bg_colorgrid))
520
+		if (!is_array($bg_colorgrid))
521 521
 		{
522 522
 			if ($bg_colorgrid == 'onglet')
523 523
 			{
@@ -562,11 +562,11 @@  discard block
 block discarded – undo
562 562
 		$nblines = count($this->data);
563 563
 		$nbvalues = count($this->data[0]) - 1;
564 564
 
565
-		for ($j = 0 ; $j < $nblines ; $j++)
565
+		for ($j = 0; $j < $nblines; $j++)
566 566
 		{
567
-			for ($i = 0 ; $i < $nbvalues ; $i++)
567
+			for ($i = 0; $i < $nbvalues; $i++)
568 568
 			{
569
-				$vals[$k] = $this->data[$j][$i+1];
569
+				$vals[$k] = $this->data[$j][$i + 1];
570 570
 				$k++;
571 571
 			}
572 572
 		}
@@ -589,11 +589,11 @@  discard block
 block discarded – undo
589 589
 		$nblines = count($this->data);
590 590
 		$nbvalues = count($this->data[0]) - 1;
591 591
 
592
-		for ($j = 0 ; $j < $nblines ; $j++)
592
+		for ($j = 0; $j < $nblines; $j++)
593 593
 		{
594
-			for ($i = 0 ; $i < $nbvalues ; $i++)
594
+			for ($i = 0; $i < $nbvalues; $i++)
595 595
 			{
596
-				$vals[$k] = $this->data[$j][$i+1];
596
+				$vals[$k] = $this->data[$j][$i + 1];
597 597
 				$k++;
598 598
 			}
599 599
 		}
@@ -612,15 +612,15 @@  discard block
 block discarded – undo
612 612
         // phpcs:enable
613 613
 		$max = $this->GetMaxValueInData();
614 614
 		if ($max != 0) $max++;
615
-		$size=dol_strlen(abs(ceil($max)));
616
-		$factor=1;
617
-		for ($i=0; $i < ($size-1); $i++)
615
+		$size = dol_strlen(abs(ceil($max)));
616
+		$factor = 1;
617
+		for ($i = 0; $i < ($size - 1); $i++)
618 618
 		{
619
-			$factor*=10;
619
+			$factor *= 10;
620 620
 		}
621 621
 
622
-		$res=0;
623
-		if (is_numeric($max)) $res=ceil($max/$factor)*$factor;
622
+		$res = 0;
623
+		if (is_numeric($max)) $res = ceil($max / $factor) * $factor;
624 624
 
625 625
 		//print "max=".$max." res=".$res;
626 626
 		return $res;
@@ -636,16 +636,16 @@  discard block
 block discarded – undo
636 636
 	{
637 637
         // phpcs:enable
638 638
 		$min = $this->GetMinValueInData();
639
-		if ($min == '') $min=0;
639
+		if ($min == '') $min = 0;
640 640
 		if ($min != 0) $min--;
641
-		$size=dol_strlen(abs(floor($min)));
642
-		$factor=1;
643
-		for ($i=0; $i < ($size-1); $i++)
641
+		$size = dol_strlen(abs(floor($min)));
642
+		$factor = 1;
643
+		for ($i = 0; $i < ($size - 1); $i++)
644 644
 		{
645
-			$factor*=10;
645
+			$factor *= 10;
646 646
 		}
647 647
 
648
-		$res=floor($min/$factor)*$factor;
648
+		$res = floor($min / $factor) * $factor;
649 649
 
650 650
 		//print "min=".$min." res=".$res;
651 651
 		return $res;
@@ -658,27 +658,27 @@  discard block
 block discarded – undo
658 658
 	 * @param	string	$fileurl	Url path to show image if saved onto disk
659 659
 	 * @return	integer|null
660 660
 	 */
661
-	function draw($file, $fileurl='')
661
+	function draw($file, $fileurl = '')
662 662
 	{
663 663
 		if (empty($file))
664 664
 		{
665
-			$this->error="Call to draw method was made with empty value for parameter file.";
665
+			$this->error = "Call to draw method was made with empty value for parameter file.";
666 666
 			dol_syslog(get_class($this)."::draw ".$this->error, LOG_ERR);
667 667
 			return -2;
668 668
 		}
669
-		if (! is_array($this->data))
669
+		if (!is_array($this->data))
670 670
 		{
671
-			$this->error="Call to draw method was made but SetData was not called or called with an empty dataset for parameters";
671
+			$this->error = "Call to draw method was made but SetData was not called or called with an empty dataset for parameters";
672 672
 			dol_syslog(get_class($this)."::draw ".$this->error, LOG_ERR);
673 673
 			return -1;
674 674
 		}
675 675
 		if (count($this->data) < 1)
676 676
 		{
677
-			$this->error="Call to draw method was made but SetData was is an empty dataset";
677
+			$this->error = "Call to draw method was made but SetData was is an empty dataset";
678 678
 			dol_syslog(get_class($this)."::draw ".$this->error, LOG_WARNING);
679 679
 		}
680 680
 		$call = "draw_".$this->_library;
681
-		call_user_func_array(array($this,$call), array($file,$fileurl));
681
+		call_user_func_array(array($this, $call), array($file, $fileurl));
682 682
 	}
683 683
 
684 684
 
@@ -690,31 +690,31 @@  discard block
 block discarded – undo
690 690
 	 * @param	string	$fileurl	Url path to show image if saved onto disk
691 691
 	 * @return	void
692 692
 	 */
693
-	private function draw_artichow($file,$fileurl)
693
+	private function draw_artichow($file, $fileurl)
694 694
 	{
695 695
         // phpcs:enable
696 696
 		global $artichow_defaultfont;
697 697
 
698
-		dol_syslog(get_class($this)."::draw_artichow this->type=".join(',',$this->type));
698
+		dol_syslog(get_class($this)."::draw_artichow this->type=".join(',', $this->type));
699 699
 
700
-		if (! defined('SHADOW_RIGHT_TOP'))  define('SHADOW_RIGHT_TOP',3);
701
-		if (! defined('LEGEND_BACKGROUND')) define('LEGEND_BACKGROUND',2);
702
-		if (! defined('LEGEND_LINE'))       define('LEGEND_LINE',1);
700
+		if (!defined('SHADOW_RIGHT_TOP'))  define('SHADOW_RIGHT_TOP', 3);
701
+		if (!defined('LEGEND_BACKGROUND')) define('LEGEND_BACKGROUND', 2);
702
+		if (!defined('LEGEND_LINE'))       define('LEGEND_LINE', 1);
703 703
 
704 704
 		// Create graph
705
-		$classname='';
706
-		if (! isset($this->type[0]) || $this->type[0] == 'bars')  $classname='BarPlot';    // Only one type (first one) is supported by artichow
707
-		else if ($this->type[0] == 'lines' || $this->type[0] == 'linesnopoint') $classname='LinePlot';
708
-		else $classname='TypeUnknown';
705
+		$classname = '';
706
+		if (!isset($this->type[0]) || $this->type[0] == 'bars')  $classname = 'BarPlot'; // Only one type (first one) is supported by artichow
707
+		else if ($this->type[0] == 'lines' || $this->type[0] == 'linesnopoint') $classname = 'LinePlot';
708
+		else $classname = 'TypeUnknown';
709 709
 		include_once ARTICHOW_PATH.$classname.'.class.php';
710 710
 
711 711
 		// Definition de couleurs
712
-		$bgcolor=new Color($this->bgcolor[0],$this->bgcolor[1],$this->bgcolor[2]);
713
-		$bgcolorgrid=new Color($this->bgcolorgrid[0],$this->bgcolorgrid[1],$this->bgcolorgrid[2]);
714
-		$colortrans=new Color(0,0,0,100);
715
-		$colorsemitrans=new Color(255,255,255,60);
716
-		$colorgradient= new LinearGradient(new Color(235, 235, 235),new Color(255, 255, 255),0);
717
-		$colorwhite=new Color(255,255,255);
712
+		$bgcolor = new Color($this->bgcolor[0], $this->bgcolor[1], $this->bgcolor[2]);
713
+		$bgcolorgrid = new Color($this->bgcolorgrid[0], $this->bgcolorgrid[1], $this->bgcolorgrid[2]);
714
+		$colortrans = new Color(0, 0, 0, 100);
715
+		$colorsemitrans = new Color(255, 255, 255, 60);
716
+		$colorgradient = new LinearGradient(new Color(235, 235, 235), new Color(255, 255, 255), 0);
717
+		$colorwhite = new Color(255, 255, 255);
718 718
 
719 719
 		// Graph
720 720
 		$graph = new Graph($this->width, $this->height);
@@ -733,13 +733,13 @@  discard block
 block discarded – undo
733 733
 		$group = new PlotGroup;
734 734
 		//$group->setSpace(5, 5, 0, 0);
735 735
 
736
-		$paddleft=50;
737
-		$paddright=10;
738
-		$strl=dol_strlen(max(abs($this->MaxValue),abs($this->MinValue)));
736
+		$paddleft = 50;
737
+		$paddright = 10;
738
+		$strl = dol_strlen(max(abs($this->MaxValue), abs($this->MinValue)));
739 739
 		if ($strl > 6) $paddleft += ($strl * 4);
740
-		$group->setPadding($paddleft, $paddright);		// Width on left and right for Y axis values
740
+		$group->setPadding($paddleft, $paddright); // Width on left and right for Y axis values
741 741
 		$group->legend->setSpace(0);
742
-		$group->legend->setPadding(2,2,2,2);
742
+		$group->legend->setPadding(2, 2, 2, 2);
743 743
 		$group->legend->setPosition(null, 0.1);
744 744
 		$group->legend->setBackgroundColor($colorsemitrans);
745 745
 
@@ -750,26 +750,26 @@  discard block
 block discarded – undo
750 750
 		if ($this->hideYGrid)	$group->grid->hideHorizontal(true);
751 751
 
752 752
 		// On boucle sur chaque lot de donnees
753
-		$legends=array();
754
-		$i=0;
755
-		$nblot=count($this->data[0])-1;
753
+		$legends = array();
754
+		$i = 0;
755
+		$nblot = count($this->data[0]) - 1;
756 756
 
757 757
 		while ($i < $nblot)
758 758
 		{
759
-			$x=0;
760
-			$values=array();
761
-			foreach($this->data as $key => $valarray)
759
+			$x = 0;
760
+			$values = array();
761
+			foreach ($this->data as $key => $valarray)
762 762
 			{
763 763
 				$legends[$x] = $valarray[0];
764
-				$values[$x]  = $valarray[$i+1];
764
+				$values[$x]  = $valarray[$i + 1];
765 765
 				$x++;
766 766
 			}
767 767
 
768 768
 			// We fix unknown values to null
769
-			$newvalues=array();
770
-			foreach($values as $val)
769
+			$newvalues = array();
770
+			foreach ($values as $val)
771 771
 			{
772
-				$newvalues[]=(is_numeric($val) ? $val : null);
772
+				$newvalues[] = (is_numeric($val) ? $val : null);
773 773
 			}
774 774
 
775 775
 
@@ -779,14 +779,14 @@  discard block
 block discarded – undo
779 779
 				//print_r($values);
780 780
 				//print '<br>';
781 781
 
782
-				$color=new Color($this->datacolor[$i][0],$this->datacolor[$i][1],$this->datacolor[$i][2],20);
783
-				$colorbis=new Color(min($this->datacolor[$i][0]+50,255),min($this->datacolor[$i][1]+50,255),min($this->datacolor[$i][2]+50,255),50);
782
+				$color = new Color($this->datacolor[$i][0], $this->datacolor[$i][1], $this->datacolor[$i][2], 20);
783
+				$colorbis = new Color(min($this->datacolor[$i][0] + 50, 255), min($this->datacolor[$i][1] + 50, 255), min($this->datacolor[$i][2] + 50, 255), 50);
784 784
 
785
-				$colorgrey=new Color(100,100,100);
786
-				$colorborder=new Color($this->datacolor[$i][0],$this->datacolor[$i][1],$this->datacolor[$i][2]);
785
+				$colorgrey = new Color(100, 100, 100);
786
+				$colorborder = new Color($this->datacolor[$i][0], $this->datacolor[$i][1], $this->datacolor[$i][2]);
787 787
 
788
-				if ($this->mode == 'side')  $plot = new BarPlot($newvalues, $i+1, $nblot);
789
-				if ($this->mode == 'depth') $plot = new BarPlot($newvalues, 1, 1, ($nblot-$i-1)*5);
788
+				if ($this->mode == 'side')  $plot = new BarPlot($newvalues, $i + 1, $nblot);
789
+				if ($this->mode == 'depth') $plot = new BarPlot($newvalues, 1, 1, ($nblot - $i - 1) * 5);
790 790
 
791 791
 				$plot->barBorder->setColor($colorgrey);
792 792
 				//$plot->setBarColor($color);
@@ -811,9 +811,9 @@  discard block
 block discarded – undo
811 811
 
812 812
 			if ($this->type[0] == 'lines' || $this->type[0] == 'linesnopoint')
813 813
 			{
814
-				$color=new Color($this->datacolor[$i][0],$this->datacolor[$i][1],$this->datacolor[$i][2],20);
815
-				$colorbis=new Color(min($this->datacolor[$i][0]+20,255),min($this->datacolor[$i][1]+20,255),min($this->datacolor[$i][2]+20,255),60);
816
-				$colorter=new Color(min($this->datacolor[$i][0]+50,255),min($this->datacolor[$i][1]+50,255),min($this->datacolor[$i][2]+50,255),90);
814
+				$color = new Color($this->datacolor[$i][0], $this->datacolor[$i][1], $this->datacolor[$i][2], 20);
815
+				$colorbis = new Color(min($this->datacolor[$i][0] + 20, 255), min($this->datacolor[$i][1] + 20, 255), min($this->datacolor[$i][2] + 20, 255), 60);
816
+				$colorter = new Color(min($this->datacolor[$i][0] + 50, 255), min($this->datacolor[$i][1] + 50, 255), min($this->datacolor[$i][2] + 50, 255), 90);
817 817
 
818 818
 				$plot = new LinePlot($newvalues);
819 819
 				//$plot->setSize(1, 0.96);
@@ -859,7 +859,7 @@  discard block
 block discarded – undo
859 859
 		// Generate file
860 860
 		$graph->draw($file);
861 861
 
862
-		$this->stringtoshow='<!-- Build using '.$this->_library.' --><img src="'.$fileurl.'" title="'.dol_escape_htmltag($this->title?$this->title:$this->YLabel).'" alt="'.dol_escape_htmltag($this->title?$this->title:$this->YLabel).'">';
862
+		$this->stringtoshow = '<!-- Build using '.$this->_library.' --><img src="'.$fileurl.'" title="'.dol_escape_htmltag($this->title ? $this->title : $this->YLabel).'" alt="'.dol_escape_htmltag($this->title ? $this->title : $this->YLabel).'">';
863 863
 	}
864 864
 
865 865
 
@@ -885,7 +885,7 @@  discard block
 block discarded – undo
885 885
         // phpcs:enable
886 886
 		global $artichow_defaultfont;
887 887
 
888
-		dol_syslog(get_class($this)."::draw_jflot this->type=".join(',',$this->type)." this->MaxValue=".$this->MaxValue);
888
+		dol_syslog(get_class($this)."::draw_jflot this->type=".join(',', $this->type)." this->MaxValue=".$this->MaxValue);
889 889
 
890 890
 		if (empty($this->width) && empty($this->height))
891 891
 		{
@@ -893,87 +893,87 @@  discard block
 block discarded – undo
893 893
 			return;
894 894
 		}
895 895
 
896
-		$legends=array();
897
-		$nblot=count($this->data[0])-1;    // -1 to remove legend
896
+		$legends = array();
897
+		$nblot = count($this->data[0]) - 1; // -1 to remove legend
898 898
 		if ($nblot < 0) dol_syslog('Bad value for property ->data. Must be set by mydolgraph->SetData before calling mydolgrapgh->draw', LOG_WARNING);
899
-		$firstlot=0;
899
+		$firstlot = 0;
900 900
 		// Works with line but not with bars
901 901
 		//if ($nblot > 2) $firstlot = ($nblot - 2);        // We limit nblot to 2 because jflot can't manage more than 2 bars on same x
902 902
 
903
-		$i=$firstlot;
904
-		$serie=array();
903
+		$i = $firstlot;
904
+		$serie = array();
905 905
 		while ($i < $nblot)	// Loop on each serie
906 906
 		{
907
-			$values=array();	// Array with horizontal y values (specific values of a serie) for each abscisse x
908
-			$serie[$i]="var d".$i." = [];\n";
907
+			$values = array(); // Array with horizontal y values (specific values of a serie) for each abscisse x
908
+			$serie[$i] = "var d".$i." = [];\n";
909 909
 
910 910
 			// Fill array $values
911
-			$x=0;
912
-			foreach($this->data as $valarray)	// Loop on each x
911
+			$x = 0;
912
+			foreach ($this->data as $valarray)	// Loop on each x
913 913
 			{
914 914
 				$legends[$x] = $valarray[0];
915
-				$values[$x]  = (is_numeric($valarray[$i+1]) ? $valarray[$i+1] : null);
915
+				$values[$x]  = (is_numeric($valarray[$i + 1]) ? $valarray[$i + 1] : null);
916 916
 				$x++;
917 917
 			}
918 918
 
919 919
 			// TODO Avoid push by adding generated long array...
920 920
 			if (isset($this->type[$firstlot]) && $this->type[$firstlot] == 'pie')
921 921
 			{
922
-				foreach($values as $x => $y) {
923
-					if (isset($y)) $serie[$i].='d'.$i.'.push({"label":"'.dol_escape_js($legends[$x]).'", "data":'.$y.'});'."\n";
922
+				foreach ($values as $x => $y) {
923
+					if (isset($y)) $serie[$i] .= 'd'.$i.'.push({"label":"'.dol_escape_js($legends[$x]).'", "data":'.$y.'});'."\n";
924 924
 				}
925 925
 			}
926 926
 			else
927 927
 			{
928
-				foreach($values as $x => $y) {
929
-					if (isset($y)) $serie[$i].='d'.$i.'.push(['.$x.', '.$y.']);'."\n";
928
+				foreach ($values as $x => $y) {
929
+					if (isset($y)) $serie[$i] .= 'd'.$i.'.push(['.$x.', '.$y.']);'."\n";
930 930
 				}
931 931
 			}
932 932
 
933 933
 			unset($values);
934 934
 			$i++;
935 935
 		}
936
-		$tag=dol_escape_htmltag(dol_string_unaccent(dol_string_nospecial(basename($file),'_',array('-','.'))));
936
+		$tag = dol_escape_htmltag(dol_string_unaccent(dol_string_nospecial(basename($file), '_', array('-', '.'))));
937 937
 
938
-		$this->stringtoshow ='<!-- Build using '.$this->_library.' -->'."\n";
939
-		if (! empty($this->title)) $this->stringtoshow.='<div align="center" class="dolgraphtitle'.(empty($this->cssprefix)?'':' dolgraphtitle'.$this->cssprefix).'">'.$this->title.'</div>';
940
-		if (! empty($this->shownographyet))
938
+		$this->stringtoshow = '<!-- Build using '.$this->_library.' -->'."\n";
939
+		if (!empty($this->title)) $this->stringtoshow .= '<div align="center" class="dolgraphtitle'.(empty($this->cssprefix) ? '' : ' dolgraphtitle'.$this->cssprefix).'">'.$this->title.'</div>';
940
+		if (!empty($this->shownographyet))
941 941
 		{
942
-		  $this->stringtoshow.='<div style="width:'.$this->width.'px;height:'.$this->height.'px;" class="nographyet"></div>';
943
-		  $this->stringtoshow.='<div class="nographyettext">'.$langs->trans("NotEnoughDataYet").'</div>';
942
+		  $this->stringtoshow .= '<div style="width:'.$this->width.'px;height:'.$this->height.'px;" class="nographyet"></div>';
943
+		  $this->stringtoshow .= '<div class="nographyettext">'.$langs->trans("NotEnoughDataYet").'</div>';
944 944
 		  return;
945 945
 		}
946
-		$this->stringtoshow.='<div id="placeholder_'.$tag.'" style="width:'.$this->width.'px;height:'.$this->height.'px;" class="dolgraph'.(empty($this->cssprefix)?'':' dolgraph'.$this->cssprefix).'"></div>'."\n";
946
+		$this->stringtoshow .= '<div id="placeholder_'.$tag.'" style="width:'.$this->width.'px;height:'.$this->height.'px;" class="dolgraph'.(empty($this->cssprefix) ? '' : ' dolgraph'.$this->cssprefix).'"></div>'."\n";
947 947
 
948
-		$this->stringtoshow.='<script id="'.$tag.'">'."\n";
949
-		$this->stringtoshow.='$(function () {'."\n";
950
-		$i=$firstlot;
948
+		$this->stringtoshow .= '<script id="'.$tag.'">'."\n";
949
+		$this->stringtoshow .= '$(function () {'."\n";
950
+		$i = $firstlot;
951 951
 		if ($nblot < 0)
952 952
 		{
953
-			$this->stringtoshow.='<!-- No series of data -->';
953
+			$this->stringtoshow .= '<!-- No series of data -->';
954 954
 		}
955 955
 		else
956 956
 		{
957 957
 			while ($i < $nblot)
958 958
 			{
959
-				$this->stringtoshow.=$serie[$i];
959
+				$this->stringtoshow .= $serie[$i];
960 960
 				$i++;
961 961
 			}
962 962
 		}
963
-		$this->stringtoshow.="\n";
963
+		$this->stringtoshow .= "\n";
964 964
 
965 965
 		// Special case for Graph of type 'pie'
966 966
 		if (isset($this->type[$firstlot]) && $this->type[$firstlot] == 'pie')
967 967
 		{
968
-			$datacolor=array();
969
-			foreach($this->datacolor as $val) $datacolor[]="#".sprintf("%02x%02x%02x",$val[0],$val[1],$val[2]);
968
+			$datacolor = array();
969
+			foreach ($this->datacolor as $val) $datacolor[] = "#".sprintf("%02x%02x%02x", $val[0], $val[1], $val[2]);
970 970
 
971
-			$urltemp='';	// TODO Add support for url link into labels
972
-			$showlegend=$this->showlegend;
973
-			$showpointvalue=$this->showpointvalue;
974
-			$showpercent=$this->showpercent;
971
+			$urltemp = ''; // TODO Add support for url link into labels
972
+			$showlegend = $this->showlegend;
973
+			$showpointvalue = $this->showpointvalue;
974
+			$showpercent = $this->showpercent;
975 975
 
976
-			$this->stringtoshow.= '
976
+			$this->stringtoshow .= '
977 977
 			function plotWithOptions_'.$tag.'() {
978 978
 			$.plot($("#placeholder_'.$tag.'"), d0,
979 979
 			{
@@ -984,7 +984,7 @@  discard block
 block discarded – undo
984 984
 						'.($this->combine ? '
985 985
 						combine: {
986 986
 						 	threshold: '.$this->combine.'
987
-						},' : '') . '
987
+						},' : '').'
988 988
 						label: {
989 989
 							show: true,
990 990
 							radius: 0.9,
@@ -992,15 +992,15 @@  discard block
 block discarded – undo
992 992
 								var percent=Math.round(series.percent);
993 993
 								var number=series.data[0][1];
994 994
 								return \'';
995
-								$this->stringtoshow.='<span style="font-size:8pt;text-align:center;padding:2px;color:black;">';
996
-								if ($urltemp) $this->stringtoshow.='<a style="color: #FFFFFF;" border="0" href="'.$urltemp.'">';
997
-								$this->stringtoshow.='\'+';
998
-								$this->stringtoshow.=($showlegend?'':'label+\' \'+');	// Hide label if already shown in legend
999
-								$this->stringtoshow.=($showpointvalue?'number+':'');
1000
-								$this->stringtoshow.=($showpercent?'\'<br/>\'+percent+\'%\'+':'');
1001
-								$this->stringtoshow.='\'';
1002
-								if ($urltemp) $this->stringtoshow.='</a>';
1003
-								$this->stringtoshow.='</span>\';
995
+								$this->stringtoshow .= '<span style="font-size:8pt;text-align:center;padding:2px;color:black;">';
996
+								if ($urltemp) $this->stringtoshow .= '<a style="color: #FFFFFF;" border="0" href="'.$urltemp.'">';
997
+								$this->stringtoshow .= '\'+';
998
+								$this->stringtoshow .= ($showlegend ? '' : 'label+\' \'+'); // Hide label if already shown in legend
999
+								$this->stringtoshow .= ($showpointvalue ? 'number+' : '');
1000
+								$this->stringtoshow .= ($showpercent ? '\'<br/>\'+percent+\'%\'+' : '');
1001
+								$this->stringtoshow .= '\'';
1002
+								if ($urltemp) $this->stringtoshow .= '</a>';
1003
+								$this->stringtoshow .= '</span>\';
1004 1004
 							},
1005 1005
 							background: {
1006 1006
 							opacity: 0.0,
@@ -1017,9 +1017,9 @@  discard block
 block discarded – undo
1017 1017
 			},';
1018 1018
 			if (count($datacolor))
1019 1019
 			{
1020
-				$this->stringtoshow.='colors: '.(! empty($data['seriescolor']) ? json_encode($data['seriescolor']) : json_encode($datacolor)).',';
1020
+				$this->stringtoshow .= 'colors: '.(!empty($data['seriescolor']) ? json_encode($data['seriescolor']) : json_encode($datacolor)).',';
1021 1021
 			}
1022
-			$this->stringtoshow.='legend: {show: '.($showlegend?'true':'false').', position: \'ne\' }
1022
+			$this->stringtoshow .= 'legend: {show: '.($showlegend ? 'true' : 'false').', position: \'ne\' }
1023 1023
 		});
1024 1024
 		}'."\n";
1025 1025
 		}
@@ -1028,7 +1028,7 @@  discard block
 block discarded – undo
1028 1028
 		{
1029 1029
 			// Add code to support tooltips
1030 1030
 		    // TODO: remove js css and use graph-tooltip-inner class instead by adding css in each themes
1031
-			$this->stringtoshow.='
1031
+			$this->stringtoshow .= '
1032 1032
 			function showTooltip_'.$tag.'(x, y, contents) {
1033 1033
 				$(\'<div class="graph-tooltip-inner" id="tooltip_'.$tag.'">\' + contents + \'</div>\').css({
1034 1034
 					position: \'absolute\',
@@ -1060,10 +1060,10 @@  discard block
 block discarded – undo
1060 1060
 						var y = item.datapoint[1].toFixed(2);
1061 1061
 						var z = item.series.xaxis.ticks[item.dataIndex].label;
1062 1062
 						';
1063
-						if ($this->showpointvalue > 0) $this->stringtoshow.='
1063
+						if ($this->showpointvalue > 0) $this->stringtoshow .= '
1064 1064
 							showTooltip_'.$tag.'(item.pageX, item.pageY, item.series.label + "<br>" + z + " => " + y);
1065 1065
 						';
1066
-						$this->stringtoshow.='
1066
+						$this->stringtoshow .= '
1067 1067
 					}
1068 1068
 				}
1069 1069
 				else {
@@ -1073,50 +1073,50 @@  discard block
 block discarded – undo
1073 1073
 			});
1074 1074
 			';
1075 1075
 
1076
-			$this->stringtoshow.='var stack = null, steps = false;'."\n";
1076
+			$this->stringtoshow .= 'var stack = null, steps = false;'."\n";
1077 1077
 
1078
-			$this->stringtoshow.='function plotWithOptions_'.$tag.'() {'."\n";
1079
-			$this->stringtoshow.='$.plot($("#placeholder_'.$tag.'"), [ '."\n";
1080
-			$i=$firstlot;
1078
+			$this->stringtoshow .= 'function plotWithOptions_'.$tag.'() {'."\n";
1079
+			$this->stringtoshow .= '$.plot($("#placeholder_'.$tag.'"), [ '."\n";
1080
+			$i = $firstlot;
1081 1081
 			while ($i < $nblot)
1082 1082
 			{
1083
-				if ($i > $firstlot) $this->stringtoshow.=', '."\n";
1084
-				$color=sprintf("%02x%02x%02x",$this->datacolor[$i][0],$this->datacolor[$i][1],$this->datacolor[$i][2]);
1085
-				$this->stringtoshow.='{ ';
1086
-				if (! isset($this->type[$i]) || $this->type[$i] == 'bars') $this->stringtoshow.='bars: { lineWidth: 1, show: true, align: "'.($i==$firstlot?'center':'left').'", barWidth: 0.5 }, ';
1087
-				if (isset($this->type[$i]) && ($this->type[$i] == 'lines' || $this->type[$i] == 'linesnopoint')) $this->stringtoshow.='lines: { show: true, fill: false }, points: { show: '.($this->type[$i] == 'linesnopoint' ? 'false' : 'true').' }, ';
1088
-				$this->stringtoshow.='color: "#'.$color.'", label: "'.(isset($this->Legend[$i]) ? dol_escape_js($this->Legend[$i]) : '').'", data: d'.$i.' }';
1083
+				if ($i > $firstlot) $this->stringtoshow .= ', '."\n";
1084
+				$color = sprintf("%02x%02x%02x", $this->datacolor[$i][0], $this->datacolor[$i][1], $this->datacolor[$i][2]);
1085
+				$this->stringtoshow .= '{ ';
1086
+				if (!isset($this->type[$i]) || $this->type[$i] == 'bars') $this->stringtoshow .= 'bars: { lineWidth: 1, show: true, align: "'.($i == $firstlot ? 'center' : 'left').'", barWidth: 0.5 }, ';
1087
+				if (isset($this->type[$i]) && ($this->type[$i] == 'lines' || $this->type[$i] == 'linesnopoint')) $this->stringtoshow .= 'lines: { show: true, fill: false }, points: { show: '.($this->type[$i] == 'linesnopoint' ? 'false' : 'true').' }, ';
1088
+				$this->stringtoshow .= 'color: "#'.$color.'", label: "'.(isset($this->Legend[$i]) ? dol_escape_js($this->Legend[$i]) : '').'", data: d'.$i.' }';
1089 1089
 				$i++;
1090 1090
 			}
1091 1091
 			// shadowSize: 0 -> Drawing is faster without shadows
1092
-			$this->stringtoshow.="\n".' ], { series: { shadowSize: 0, stack: stack, lines: { fill: false, steps: steps }, bars: { barWidth: 0.6 } }'."\n";
1092
+			$this->stringtoshow .= "\n".' ], { series: { shadowSize: 0, stack: stack, lines: { fill: false, steps: steps }, bars: { barWidth: 0.6 } }'."\n";
1093 1093
 
1094 1094
 			// Xaxis
1095
-			$this->stringtoshow.=', xaxis: { ticks: ['."\n";
1096
-			$x=0;
1097
-			foreach($this->data as $key => $valarray)
1095
+			$this->stringtoshow .= ', xaxis: { ticks: ['."\n";
1096
+			$x = 0;
1097
+			foreach ($this->data as $key => $valarray)
1098 1098
 			{
1099
-				if ($x > 0) $this->stringtoshow.=', '."\n";
1100
-				$this->stringtoshow.= ' ['.$x.', "'.$valarray[0].'"]';
1099
+				if ($x > 0) $this->stringtoshow .= ', '."\n";
1100
+				$this->stringtoshow .= ' ['.$x.', "'.$valarray[0].'"]';
1101 1101
 				$x++;
1102 1102
 			}
1103
-			$this->stringtoshow.='] }'."\n";
1103
+			$this->stringtoshow .= '] }'."\n";
1104 1104
 
1105 1105
 			// Yaxis
1106
-			$this->stringtoshow.=', yaxis: { min: '.$this->MinValue.', max: '.($this->MaxValue).' }'."\n";
1106
+			$this->stringtoshow .= ', yaxis: { min: '.$this->MinValue.', max: '.($this->MaxValue).' }'."\n";
1107 1107
 
1108 1108
 			// Background color
1109
-			$color1=sprintf("%02x%02x%02x",$this->bgcolorgrid[0],$this->bgcolorgrid[0],$this->bgcolorgrid[2]);
1110
-			$color2=sprintf("%02x%02x%02x",$this->bgcolorgrid[0],$this->bgcolorgrid[1],$this->bgcolorgrid[2]);
1111
-			$this->stringtoshow.=', grid: { hoverable: true, backgroundColor: { colors: ["#'.$color1.'", "#'.$color2.'"] }, borderWidth: 1, borderColor: \'#e6e6e6\', tickColor  : \'#e6e6e6\' }'."\n";
1109
+			$color1 = sprintf("%02x%02x%02x", $this->bgcolorgrid[0], $this->bgcolorgrid[0], $this->bgcolorgrid[2]);
1110
+			$color2 = sprintf("%02x%02x%02x", $this->bgcolorgrid[0], $this->bgcolorgrid[1], $this->bgcolorgrid[2]);
1111
+			$this->stringtoshow .= ', grid: { hoverable: true, backgroundColor: { colors: ["#'.$color1.'", "#'.$color2.'"] }, borderWidth: 1, borderColor: \'#e6e6e6\', tickColor  : \'#e6e6e6\' }'."\n";
1112 1112
 			//$this->stringtoshow.=', shadowSize: 20'."\n";    TODO Uncommet this
1113
-			$this->stringtoshow.='});'."\n";
1114
-			$this->stringtoshow.='}'."\n";
1113
+			$this->stringtoshow .= '});'."\n";
1114
+			$this->stringtoshow .= '}'."\n";
1115 1115
 		}
1116 1116
 
1117
-		$this->stringtoshow.='plotWithOptions_'.$tag.'();'."\n";
1118
-		$this->stringtoshow.='});'."\n";
1119
-		$this->stringtoshow.='</script>'."\n";
1117
+		$this->stringtoshow .= 'plotWithOptions_'.$tag.'();'."\n";
1118
+		$this->stringtoshow .= '});'."\n";
1119
+		$this->stringtoshow .= '</script>'."\n";
1120 1120
 	}
1121 1121
 
1122 1122
 
@@ -1127,14 +1127,14 @@  discard block
 block discarded – undo
1127 1127
 	 * @param	int			$shownographyet 	Show graph to say there is not enough data
1128 1128
 	 * @return	string							HTML string to show graph
1129 1129
 	 */
1130
-	function show($shownographyet=0)
1130
+	function show($shownographyet = 0)
1131 1131
 	{
1132 1132
 		global $langs;
1133 1133
 
1134 1134
 		if ($shownographyet)
1135 1135
 		{
1136
-			$s= '<div class="nographyet" style="width:'.(preg_match('/%/',$this->width)?$this->width:$this->width.'px').'; height:'.(preg_match('/%/',$this->height)?$this->height:$this->height.'px').';"></div>';
1137
-			$s.='<div class="nographyettext">'.$langs->trans("NotEnoughDataYet").'</div>';
1136
+			$s = '<div class="nographyet" style="width:'.(preg_match('/%/', $this->width) ? $this->width : $this->width.'px').'; height:'.(preg_match('/%/', $this->height) ? $this->height : $this->height.'px').';"></div>';
1137
+			$s .= '<div class="nographyettext">'.$langs->trans("NotEnoughDataYet").'</div>';
1138 1138
 			return $s;
1139 1139
 		}
1140 1140
 
@@ -1149,18 +1149,18 @@  discard block
 block discarded – undo
1149 1149
 	 * @param	string	$defaultsize	Value we want as default size
1150 1150
 	 * @return	int						Value of width or height to use by default
1151 1151
 	 */
1152
-	static function getDefaultGraphSizeForStats($direction,$defaultsize='')
1152
+	static function getDefaultGraphSizeForStats($direction, $defaultsize = '')
1153 1153
 	{
1154 1154
 		global $conf;
1155 1155
 
1156 1156
 		if ($direction == 'width')
1157 1157
 		{
1158 1158
 			if (empty($conf->dol_optimize_smallscreen)) return ($defaultsize ? $defaultsize : '500');
1159
-			else return (empty($_SESSION['dol_screen_width']) ? '280' : ($_SESSION['dol_screen_width']-40));
1159
+			else return (empty($_SESSION['dol_screen_width']) ? '280' : ($_SESSION['dol_screen_width'] - 40));
1160 1160
 		}
1161 1161
 		if ($direction == 'height')
1162 1162
 		{
1163
-			return (empty($conf->dol_optimize_smallscreen)?($defaultsize?$defaultsize:'200'):'160');
1163
+			return (empty($conf->dol_optimize_smallscreen) ? ($defaultsize ? $defaultsize : '200') : '160');
1164 1164
 		}
1165 1165
 		return 0;
1166 1166
 	}
Please login to merge, or discard this patch.
Braces   +143 added lines, -59 removed lines patch added patch discarded remove patch
@@ -103,7 +103,9 @@  discard block
 block discarded – undo
103 103
 			$isgdinstalled=0;
104 104
 			foreach ($modules_list as $module)
105 105
 			{
106
-				if ($module == 'gd') $isgdinstalled=1;
106
+				if ($module == 'gd') {
107
+				    $isgdinstalled=1;
108
+				}
107 109
 			}
108 110
 			if (! $isgdinstalled)
109 111
 			{
@@ -120,9 +122,15 @@  discard block
 block discarded – undo
120 122
 		if (is_readable($color_file))
121 123
 		{
122 124
 			include_once $color_file;
123
-			if (isset($theme_bordercolor)) $this->bordercolor = $theme_bordercolor;
124
-			if (isset($theme_datacolor))   $this->datacolor   = $theme_datacolor;
125
-			if (isset($theme_bgcolor))     $this->bgcolor     = $theme_bgcolor;
125
+			if (isset($theme_bordercolor)) {
126
+			    $this->bordercolor = $theme_bordercolor;
127
+			}
128
+			if (isset($theme_datacolor)) {
129
+			    $this->datacolor   = $theme_datacolor;
130
+			}
131
+			if (isset($theme_bgcolor)) {
132
+			    $this->bgcolor     = $theme_bgcolor;
133
+			}
126 134
 		}
127 135
 		//print 'bgcolor: '.join(',',$this->bgcolor).'<br>';
128 136
 	}
@@ -493,13 +501,11 @@  discard block
 block discarded – undo
493 501
 			{
494 502
 				//print 'ee'.join(',',$theme_bgcoloronglet);
495 503
 				$this->bgcolor = $theme_bgcoloronglet;
496
-			}
497
-			else
504
+			} else
498 505
 			{
499 506
 				$this->bgcolor = $theme_bgcolor;
500 507
 			}
501
-		}
502
-		else
508
+		} else
503 509
 		{
504 510
 			$this->bgcolor = $bg_color;
505 511
 		}
@@ -523,13 +529,11 @@  discard block
 block discarded – undo
523 529
 			{
524 530
 				//print 'ee'.join(',',$theme_bgcoloronglet);
525 531
 				$this->bgcolorgrid = $theme_bgcoloronglet;
526
-			}
527
-			else
532
+			} else
528 533
 			{
529 534
 				$this->bgcolorgrid = $theme_bgcolor;
530 535
 			}
531
-		}
532
-		else
536
+		} else
533 537
 		{
534 538
 			$this->bgcolorgrid = $bg_colorgrid;
535 539
 		}
@@ -611,7 +615,9 @@  discard block
 block discarded – undo
611 615
 	{
612 616
         // phpcs:enable
613 617
 		$max = $this->GetMaxValueInData();
614
-		if ($max != 0) $max++;
618
+		if ($max != 0) {
619
+		    $max++;
620
+		}
615 621
 		$size=dol_strlen(abs(ceil($max)));
616 622
 		$factor=1;
617 623
 		for ($i=0; $i < ($size-1); $i++)
@@ -620,7 +626,9 @@  discard block
 block discarded – undo
620 626
 		}
621 627
 
622 628
 		$res=0;
623
-		if (is_numeric($max)) $res=ceil($max/$factor)*$factor;
629
+		if (is_numeric($max)) {
630
+		    $res=ceil($max/$factor)*$factor;
631
+		}
624 632
 
625 633
 		//print "max=".$max." res=".$res;
626 634
 		return $res;
@@ -636,8 +644,12 @@  discard block
 block discarded – undo
636 644
 	{
637 645
         // phpcs:enable
638 646
 		$min = $this->GetMinValueInData();
639
-		if ($min == '') $min=0;
640
-		if ($min != 0) $min--;
647
+		if ($min == '') {
648
+		    $min=0;
649
+		}
650
+		if ($min != 0) {
651
+		    $min--;
652
+		}
641 653
 		$size=dol_strlen(abs(floor($min)));
642 654
 		$factor=1;
643 655
 		for ($i=0; $i < ($size-1); $i++)
@@ -697,15 +709,27 @@  discard block
 block discarded – undo
697 709
 
698 710
 		dol_syslog(get_class($this)."::draw_artichow this->type=".join(',',$this->type));
699 711
 
700
-		if (! defined('SHADOW_RIGHT_TOP'))  define('SHADOW_RIGHT_TOP',3);
701
-		if (! defined('LEGEND_BACKGROUND')) define('LEGEND_BACKGROUND',2);
702
-		if (! defined('LEGEND_LINE'))       define('LEGEND_LINE',1);
712
+		if (! defined('SHADOW_RIGHT_TOP')) {
713
+		    define('SHADOW_RIGHT_TOP',3);
714
+		}
715
+		if (! defined('LEGEND_BACKGROUND')) {
716
+		    define('LEGEND_BACKGROUND',2);
717
+		}
718
+		if (! defined('LEGEND_LINE')) {
719
+		    define('LEGEND_LINE',1);
720
+		}
703 721
 
704 722
 		// Create graph
705 723
 		$classname='';
706
-		if (! isset($this->type[0]) || $this->type[0] == 'bars')  $classname='BarPlot';    // Only one type (first one) is supported by artichow
707
-		else if ($this->type[0] == 'lines' || $this->type[0] == 'linesnopoint') $classname='LinePlot';
708
-		else $classname='TypeUnknown';
724
+		if (! isset($this->type[0]) || $this->type[0] == 'bars') {
725
+		    $classname='BarPlot';
726
+		}
727
+		// Only one type (first one) is supported by artichow
728
+		else if ($this->type[0] == 'lines' || $this->type[0] == 'linesnopoint') {
729
+		    $classname='LinePlot';
730
+		} else {
731
+		    $classname='TypeUnknown';
732
+		}
709 733
 		include_once ARTICHOW_PATH.$classname.'.class.php';
710 734
 
711 735
 		// Definition de couleurs
@@ -727,8 +751,11 @@  discard block
 block discarded – undo
727 751
 			$graph->title->setFont(new $artichow_defaultfont(10));
728 752
 		}
729 753
 
730
-		if (is_array($this->bgcolor)) $graph->setBackgroundColor($bgcolor);
731
-		else $graph->setBackgroundGradient($colorgradient);
754
+		if (is_array($this->bgcolor)) {
755
+		    $graph->setBackgroundColor($bgcolor);
756
+		} else {
757
+		    $graph->setBackgroundGradient($colorgradient);
758
+		}
732 759
 
733 760
 		$group = new PlotGroup;
734 761
 		//$group->setSpace(5, 5, 0, 0);
@@ -736,18 +763,27 @@  discard block
 block discarded – undo
736 763
 		$paddleft=50;
737 764
 		$paddright=10;
738 765
 		$strl=dol_strlen(max(abs($this->MaxValue),abs($this->MinValue)));
739
-		if ($strl > 6) $paddleft += ($strl * 4);
766
+		if ($strl > 6) {
767
+		    $paddleft += ($strl * 4);
768
+		}
740 769
 		$group->setPadding($paddleft, $paddright);		// Width on left and right for Y axis values
741 770
 		$group->legend->setSpace(0);
742 771
 		$group->legend->setPadding(2,2,2,2);
743 772
 		$group->legend->setPosition(null, 0.1);
744 773
 		$group->legend->setBackgroundColor($colorsemitrans);
745 774
 
746
-		if (is_array($this->bgcolorgrid)) $group->grid->setBackgroundColor($bgcolorgrid);
747
-		else $group->grid->setBackgroundColor($colortrans);
775
+		if (is_array($this->bgcolorgrid)) {
776
+		    $group->grid->setBackgroundColor($bgcolorgrid);
777
+		} else {
778
+		    $group->grid->setBackgroundColor($colortrans);
779
+		}
748 780
 
749
-		if ($this->hideXGrid)	$group->grid->hideVertical(true);
750
-		if ($this->hideYGrid)	$group->grid->hideHorizontal(true);
781
+		if ($this->hideXGrid) {
782
+		    $group->grid->hideVertical(true);
783
+		}
784
+		if ($this->hideYGrid) {
785
+		    $group->grid->hideHorizontal(true);
786
+		}
751 787
 
752 788
 		// On boucle sur chaque lot de donnees
753 789
 		$legends=array();
@@ -785,17 +821,29 @@  discard block
 block discarded – undo
785 821
 				$colorgrey=new Color(100,100,100);
786 822
 				$colorborder=new Color($this->datacolor[$i][0],$this->datacolor[$i][1],$this->datacolor[$i][2]);
787 823
 
788
-				if ($this->mode == 'side')  $plot = new BarPlot($newvalues, $i+1, $nblot);
789
-				if ($this->mode == 'depth') $plot = new BarPlot($newvalues, 1, 1, ($nblot-$i-1)*5);
824
+				if ($this->mode == 'side') {
825
+				    $plot = new BarPlot($newvalues, $i+1, $nblot);
826
+				}
827
+				if ($this->mode == 'depth') {
828
+				    $plot = new BarPlot($newvalues, 1, 1, ($nblot-$i-1)*5);
829
+				}
790 830
 
791 831
 				$plot->barBorder->setColor($colorgrey);
792 832
 				//$plot->setBarColor($color);
793 833
 				$plot->setBarGradient(new LinearGradient($colorbis, $color, 90));
794 834
 
795
-				if ($this->mode == 'side')  $plot->setBarPadding(0.1, 0.1);
796
-				if ($this->mode == 'depth') $plot->setBarPadding(0.1, 0.4);
797
-				if ($this->mode == 'side')  $plot->setBarSpace(5);
798
-				if ($this->mode == 'depth') $plot->setBarSpace(2);
835
+				if ($this->mode == 'side') {
836
+				    $plot->setBarPadding(0.1, 0.1);
837
+				}
838
+				if ($this->mode == 'depth') {
839
+				    $plot->setBarPadding(0.1, 0.4);
840
+				}
841
+				if ($this->mode == 'side') {
842
+				    $plot->setBarSpace(5);
843
+				}
844
+				if ($this->mode == 'depth') {
845
+				    $plot->setBarSpace(2);
846
+				}
799 847
 
800 848
 				$plot->barShadow->setSize($this->SetShading);
801 849
 				$plot->barShadow->setPosition(SHADOW_RIGHT_TOP);
@@ -840,8 +888,12 @@  discard block
 block discarded – undo
840 888
 			// solve a bug in Artichow with UTF8
841 889
 			if (count($this->Legend))
842 890
 			{
843
-				if ($this->type[0] == 'bars')  										$group->legend->add($plot, $this->Legend[$i], LEGEND_BACKGROUND);
844
-				if ($this->type[0] == 'lines' || $this->type[0] == 'linesnopoint')	$group->legend->add($plot, $this->Legend[$i], LEGEND_LINE);
891
+				if ($this->type[0] == 'bars') {
892
+				    $group->legend->add($plot, $this->Legend[$i], LEGEND_BACKGROUND);
893
+				}
894
+				if ($this->type[0] == 'lines' || $this->type[0] == 'linesnopoint') {
895
+				    $group->legend->add($plot, $this->Legend[$i], LEGEND_LINE);
896
+				}
845 897
 			}
846 898
 			$group->add($plot);
847 899
 
@@ -852,7 +904,9 @@  discard block
 block discarded – undo
852 904
 		$group->axis->bottom->label->setFont(new $artichow_defaultfont(7));
853 905
 
854 906
 		//print $group->axis->bottom->getLabelNumber();
855
-		if ($this->labelInterval > 0) $group->axis->bottom->setLabelInterval($this->labelInterval);
907
+		if ($this->labelInterval > 0) {
908
+		    $group->axis->bottom->setLabelInterval($this->labelInterval);
909
+		}
856 910
 
857 911
 		$graph->add($group);
858 912
 
@@ -895,23 +949,30 @@  discard block
 block discarded – undo
895 949
 
896 950
 		$legends=array();
897 951
 		$nblot=count($this->data[0])-1;    // -1 to remove legend
898
-		if ($nblot < 0) dol_syslog('Bad value for property ->data. Must be set by mydolgraph->SetData before calling mydolgrapgh->draw', LOG_WARNING);
952
+		if ($nblot < 0) {
953
+		    dol_syslog('Bad value for property ->data. Must be set by mydolgraph->SetData before calling mydolgrapgh->draw', LOG_WARNING);
954
+		}
899 955
 		$firstlot=0;
900 956
 		// Works with line but not with bars
901 957
 		//if ($nblot > 2) $firstlot = ($nblot - 2);        // We limit nblot to 2 because jflot can't manage more than 2 bars on same x
902 958
 
903 959
 		$i=$firstlot;
904 960
 		$serie=array();
905
-		while ($i < $nblot)	// Loop on each serie
961
+		while ($i < $nblot) {
962
+		    // Loop on each serie
906 963
 		{
907
-			$values=array();	// Array with horizontal y values (specific values of a serie) for each abscisse x
964
+			$values=array();
965
+		}
966
+		// Array with horizontal y values (specific values of a serie) for each abscisse x
908 967
 			$serie[$i]="var d".$i." = [];\n";
909 968
 
910 969
 			// Fill array $values
911 970
 			$x=0;
912
-			foreach($this->data as $valarray)	// Loop on each x
971
+			foreach($this->data as $valarray) {
972
+			    // Loop on each x
913 973
 			{
914 974
 				$legends[$x] = $valarray[0];
975
+			}
915 976
 				$values[$x]  = (is_numeric($valarray[$i+1]) ? $valarray[$i+1] : null);
916 977
 				$x++;
917 978
 			}
@@ -920,13 +981,16 @@  discard block
 block discarded – undo
920 981
 			if (isset($this->type[$firstlot]) && $this->type[$firstlot] == 'pie')
921 982
 			{
922 983
 				foreach($values as $x => $y) {
923
-					if (isset($y)) $serie[$i].='d'.$i.'.push({"label":"'.dol_escape_js($legends[$x]).'", "data":'.$y.'});'."\n";
984
+					if (isset($y)) {
985
+					    $serie[$i].='d'.$i.'.push({"label":"'.dol_escape_js($legends[$x]).'", "data":'.$y.'});'."\n";
986
+					}
924 987
 				}
925
-			}
926
-			else
988
+			} else
927 989
 			{
928 990
 				foreach($values as $x => $y) {
929
-					if (isset($y)) $serie[$i].='d'.$i.'.push(['.$x.', '.$y.']);'."\n";
991
+					if (isset($y)) {
992
+					    $serie[$i].='d'.$i.'.push(['.$x.', '.$y.']);'."\n";
993
+					}
930 994
 				}
931 995
 			}
932 996
 
@@ -936,7 +1000,9 @@  discard block
 block discarded – undo
936 1000
 		$tag=dol_escape_htmltag(dol_string_unaccent(dol_string_nospecial(basename($file),'_',array('-','.'))));
937 1001
 
938 1002
 		$this->stringtoshow ='<!-- Build using '.$this->_library.' -->'."\n";
939
-		if (! empty($this->title)) $this->stringtoshow.='<div align="center" class="dolgraphtitle'.(empty($this->cssprefix)?'':' dolgraphtitle'.$this->cssprefix).'">'.$this->title.'</div>';
1003
+		if (! empty($this->title)) {
1004
+		    $this->stringtoshow.='<div align="center" class="dolgraphtitle'.(empty($this->cssprefix)?'':' dolgraphtitle'.$this->cssprefix).'">'.$this->title.'</div>';
1005
+		}
940 1006
 		if (! empty($this->shownographyet))
941 1007
 		{
942 1008
 		  $this->stringtoshow.='<div style="width:'.$this->width.'px;height:'.$this->height.'px;" class="nographyet"></div>';
@@ -951,8 +1017,7 @@  discard block
 block discarded – undo
951 1017
 		if ($nblot < 0)
952 1018
 		{
953 1019
 			$this->stringtoshow.='<!-- No series of data -->';
954
-		}
955
-		else
1020
+		} else
956 1021
 		{
957 1022
 			while ($i < $nblot)
958 1023
 			{
@@ -966,7 +1031,9 @@  discard block
 block discarded – undo
966 1031
 		if (isset($this->type[$firstlot]) && $this->type[$firstlot] == 'pie')
967 1032
 		{
968 1033
 			$datacolor=array();
969
-			foreach($this->datacolor as $val) $datacolor[]="#".sprintf("%02x%02x%02x",$val[0],$val[1],$val[2]);
1034
+			foreach($this->datacolor as $val) {
1035
+			    $datacolor[]="#".sprintf("%02x%02x%02x",$val[0],$val[1],$val[2]);
1036
+			}
970 1037
 
971 1038
 			$urltemp='';	// TODO Add support for url link into labels
972 1039
 			$showlegend=$this->showlegend;
@@ -993,13 +1060,17 @@  discard block
 block discarded – undo
993 1060
 								var number=series.data[0][1];
994 1061
 								return \'';
995 1062
 								$this->stringtoshow.='<span style="font-size:8pt;text-align:center;padding:2px;color:black;">';
996
-								if ($urltemp) $this->stringtoshow.='<a style="color: #FFFFFF;" border="0" href="'.$urltemp.'">';
1063
+								if ($urltemp) {
1064
+								    $this->stringtoshow.='<a style="color: #FFFFFF;" border="0" href="'.$urltemp.'">';
1065
+								}
997 1066
 								$this->stringtoshow.='\'+';
998 1067
 								$this->stringtoshow.=($showlegend?'':'label+\' \'+');	// Hide label if already shown in legend
999 1068
 								$this->stringtoshow.=($showpointvalue?'number+':'');
1000 1069
 								$this->stringtoshow.=($showpercent?'\'<br/>\'+percent+\'%\'+':'');
1001 1070
 								$this->stringtoshow.='\'';
1002
-								if ($urltemp) $this->stringtoshow.='</a>';
1071
+								if ($urltemp) {
1072
+								    $this->stringtoshow.='</a>';
1073
+								}
1003 1074
 								$this->stringtoshow.='</span>\';
1004 1075
 							},
1005 1076
 							background: {
@@ -1060,9 +1131,11 @@  discard block
 block discarded – undo
1060 1131
 						var y = item.datapoint[1].toFixed(2);
1061 1132
 						var z = item.series.xaxis.ticks[item.dataIndex].label;
1062 1133
 						';
1063
-						if ($this->showpointvalue > 0) $this->stringtoshow.='
1134
+						if ($this->showpointvalue > 0) {
1135
+						    $this->stringtoshow.='
1064 1136
 							showTooltip_'.$tag.'(item.pageX, item.pageY, item.series.label + "<br>" + z + " => " + y);
1065 1137
 						';
1138
+						}
1066 1139
 						$this->stringtoshow.='
1067 1140
 					}
1068 1141
 				}
@@ -1080,11 +1153,17 @@  discard block
 block discarded – undo
1080 1153
 			$i=$firstlot;
1081 1154
 			while ($i < $nblot)
1082 1155
 			{
1083
-				if ($i > $firstlot) $this->stringtoshow.=', '."\n";
1156
+				if ($i > $firstlot) {
1157
+				    $this->stringtoshow.=', '."\n";
1158
+				}
1084 1159
 				$color=sprintf("%02x%02x%02x",$this->datacolor[$i][0],$this->datacolor[$i][1],$this->datacolor[$i][2]);
1085 1160
 				$this->stringtoshow.='{ ';
1086
-				if (! isset($this->type[$i]) || $this->type[$i] == 'bars') $this->stringtoshow.='bars: { lineWidth: 1, show: true, align: "'.($i==$firstlot?'center':'left').'", barWidth: 0.5 }, ';
1087
-				if (isset($this->type[$i]) && ($this->type[$i] == 'lines' || $this->type[$i] == 'linesnopoint')) $this->stringtoshow.='lines: { show: true, fill: false }, points: { show: '.($this->type[$i] == 'linesnopoint' ? 'false' : 'true').' }, ';
1161
+				if (! isset($this->type[$i]) || $this->type[$i] == 'bars') {
1162
+				    $this->stringtoshow.='bars: { lineWidth: 1, show: true, align: "'.($i==$firstlot?'center':'left').'", barWidth: 0.5 }, ';
1163
+				}
1164
+				if (isset($this->type[$i]) && ($this->type[$i] == 'lines' || $this->type[$i] == 'linesnopoint')) {
1165
+				    $this->stringtoshow.='lines: { show: true, fill: false }, points: { show: '.($this->type[$i] == 'linesnopoint' ? 'false' : 'true').' }, ';
1166
+				}
1088 1167
 				$this->stringtoshow.='color: "#'.$color.'", label: "'.(isset($this->Legend[$i]) ? dol_escape_js($this->Legend[$i]) : '').'", data: d'.$i.' }';
1089 1168
 				$i++;
1090 1169
 			}
@@ -1096,7 +1175,9 @@  discard block
 block discarded – undo
1096 1175
 			$x=0;
1097 1176
 			foreach($this->data as $key => $valarray)
1098 1177
 			{
1099
-				if ($x > 0) $this->stringtoshow.=', '."\n";
1178
+				if ($x > 0) {
1179
+				    $this->stringtoshow.=', '."\n";
1180
+				}
1100 1181
 				$this->stringtoshow.= ' ['.$x.', "'.$valarray[0].'"]';
1101 1182
 				$x++;
1102 1183
 			}
@@ -1155,8 +1236,11 @@  discard block
 block discarded – undo
1155 1236
 
1156 1237
 		if ($direction == 'width')
1157 1238
 		{
1158
-			if (empty($conf->dol_optimize_smallscreen)) return ($defaultsize ? $defaultsize : '500');
1159
-			else return (empty($_SESSION['dol_screen_width']) ? '280' : ($_SESSION['dol_screen_width']-40));
1239
+			if (empty($conf->dol_optimize_smallscreen)) {
1240
+			    return ($defaultsize ? $defaultsize : '500');
1241
+			} else {
1242
+			    return (empty($_SESSION['dol_screen_width']) ? '280' : ($_SESSION['dol_screen_width']-40));
1243
+			}
1160 1244
 		}
1161 1245
 		if ($direction == 'height')
1162 1246
 		{
Please login to merge, or discard this patch.