Passed
Push — master ( a56e33...222e44 )
by Alxarafe
36:56
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
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.
Indentation   +6971 added lines, -6971 removed lines patch added patch discarded remove patch
@@ -169,7258 +169,7258 @@
 block discarded – undo
169 169
     public $user;
170 170
 
171 171
     /**
172
-	 * @var int 	The id of originating object
173
-	 * @see fetch_origin()
174
-	 */
175
-	public $origin_id;
176
-
177
-	/**
178
-	 * @var string The object's reference
179
-	 */
180
-	public $ref;
181
-
182
-	/**
183
-	 * @var string The object's previous reference
184
-	 */
185
-	public $ref_previous;
186
-
187
-	/**
188
-	 * @var string The object's next reference
189
-	 */
190
-	public $ref_next;
191
-
192
-	/**
193
-	 * @var string An external reference for the object
194
-	 */
195
-	public $ref_ext;
196
-
197
-	/**
198
-	 * @var int The object's status
199
-	 * @see setStatut()
200
-	 */
201
-	public $statut;
202
-
203
-	/**
204
-	 * @var string
205
-	 * @see getFullAddress()
206
-	 */
207
-	public $country;
208
-
209
-	/**
210
-	 * @var int
211
-	 * @see getFullAddress(), country
212
-	 */
213
-	public $country_id;
214
-
215
-	/**
216
-	 * @var string
217
-	 * @see getFullAddress(), isInEEC(), country
218
-	 */
219
-    public $country_code;
172
+     * @var int 	The id of originating object
173
+     * @see fetch_origin()
174
+     */
175
+    public $origin_id;
220 176
 
221 177
     /**
222
-	 * @var string
223
-	 * @see getFullAddress()
224
-	 */
225
-	public $state;
178
+     * @var string The object's reference
179
+     */
180
+    public $ref;
226 181
 
227
-	/**
228
-	 * @var int
229
-	 * @see getFullAddress(), state
230
-	 */
231
-	public $state_id;
182
+    /**
183
+     * @var string The object's previous reference
184
+     */
185
+    public $ref_previous;
232 186
 
233
-	/**
234
-	 * @var string
235
-	 * @see getFullAddress(), state
236
-	 */
237
-    public $state_code;
187
+    /**
188
+     * @var string The object's next reference
189
+     */
190
+    public $ref_next;
238 191
 
239 192
     /**
240
-	 * @var string
241
-	 * @see getFullAddress(), region
242
-	 */
243
-	public $region;
193
+     * @var string An external reference for the object
194
+     */
195
+    public $ref_ext;
244 196
 
245
-	/**
246
-	 * @var string
247
-	 * @see getFullAddress(), region
248
-	 */
249
-    public $region_code;
197
+    /**
198
+     * @var int The object's status
199
+     * @see setStatut()
200
+     */
201
+    public $statut;
250 202
 
251
-	/**
252
-	 * @var int
253
-	 * @see fetch_barcode()
254
-	 */
255
-	public $barcode_type;
256
-
257
-	/**
258
-	 * @var string
259
-	 * @see fetch_barcode(), barcode_type
260
-	 */
261
-	public $barcode_type_code;
262
-
263
-	/**
264
-	 * @var string
265
-	 * @see fetch_barcode(), barcode_type
266
-	 */
267
-	public $barcode_type_label;
268
-
269
-	/**
270
-	 * @var string
271
-	 * @see fetch_barcode(), barcode_type
272
-	 */
273
-	public $barcode_type_coder;
274
-
275
-	/**
276
-	 * @var int Payment method ID (cheque, cash, ...)
277
-	 * @see setPaymentMethods()
278
-	 */
279
-	public $mode_reglement_id;
280
-
281
-	/**
282
-	 * @var int Payment terms ID
283
-	 * @see setPaymentTerms()
284
-	 */
285
-	public $cond_reglement_id;
286
-
287
-	/**
288
-	 * @var int Payment terms ID
289
-	 * @deprecated Kept for compatibility
290
-	 * @see cond_reglement_id;
291
-	 */
292
-	public $cond_reglement;
293
-
294
-	/**
295
-	 * @var int Delivery address ID
296
-	 * @deprecated
297
-	 * @see setDeliveryAddress()
298
-	 */
299
-	public $fk_delivery_address;
300
-
301
-	/**
302
-	 * @var int Shipping method ID
303
-	 * @see setShippingMethod()
304
-	 */
305
-	public $shipping_method_id;
306
-
307
-	/**
308
-	 * @var string
309
-	 * @see SetDocModel()
310
-	 */
311
-	public $modelpdf;
312
-
313
-	/**
314
-	 * @var int Bank account ID
315
-	 * @see SetBankAccount()
316
-	 */
317
-	public $fk_account;
318
-
319
-	/**
320
-	 * @var string Public note
321
-	 * @see update_note()
322
-	 */
323
-	public $note_public;
324
-
325
-	/**
326
-	 * @var string Private note
327
-	 * @see update_note()
328
-	 */
329
-	public $note_private;
330
-
331
-	/**
332
-	 * @deprecated
333
-	 * @see note_public
334
-	 */
335
-	public $note;
336
-
337
-	/**
338
-	 * @var float Total amount before taxes
339
-	 * @see update_price()
340
-	 */
341
-	public $total_ht;
342
-
343
-	/**
344
-	 * @var float Total VAT amount
345
-	 * @see update_price()
346
-	 */
347
-	public $total_tva;
348
-
349
-	/**
350
-	 * @var float Total local tax 1 amount
351
-	 * @see update_price()
352
-	 */
353
-	public $total_localtax1;
354
-
355
-	/**
356
-	 * @var float Total local tax 2 amount
357
-	 * @see update_price()
358
-	 */
359
-	public $total_localtax2;
360
-
361
-	/**
362
-	 * @var float Total amount with taxes
363
-	 * @see update_price()
364
-	 */
365
-	public $total_ttc;
366
-
367
-	/**
368
-	 * @var CommonObjectLine[]
369
-	 */
370
-	public $lines;
371
-
372
-	/**
373
-	 * @var mixed		Contains comments
374
-	 * @see fetchComments()
375
-	 */
376
-	public $comments=array();
377
-
378
-	/**
379
-	 * @var int
380
-	 * @see setIncoterms()
381
-	 */
382
-	public $fk_incoterms;
383
-
384
-	/**
385
-	 * @var string
386
-	 * @see SetIncoterms()
387
-	 */
388
-	public $libelle_incoterms;
389
-
390
-	/**
391
-	 * @var string
392
-	 * @see display_incoterms()
393
-	 */
394
-	public $location_incoterms;
395
-
396
-	public $name;
397
-	public $lastname;
398
-	public $firstname;
399
-	public $civility_id;
400
-
401
-	// Dates
402
-	public $date_creation;			// Date creation
403
-	public $date_validation;		// Date validation
404
-	public $date_modification;		// Date last change (tms field)
405
-
406
-
407
-
408
-	// No constructor as it is an abstract class
409
-
410
-	/**
411
-	 * Check an object id/ref exists
412
-	 * If you don't need/want to instantiate object and just need to know if object exists, use this method instead of fetch
413
-	 *
414
-	 *  @param	string	$element   	String of element ('product', 'facture', ...)
415
-	 *  @param	int		$id      	Id of object
416
-	 *  @param  string	$ref     	Ref of object to check
417
-	 *  @param	string	$ref_ext	Ref ext of object to check
418
-	 *  @return int     			<0 if KO, 0 if OK but not found, >0 if OK and exists
419
-	 */
420
-	static function isExistingObject($element, $id, $ref='', $ref_ext='')
421
-	{
422
-		global $db,$conf;
423
-
424
-		$sql = "SELECT rowid, ref, ref_ext";
425
-		$sql.= " FROM ".MAIN_DB_PREFIX.$element;
426
-		$sql.= " WHERE entity IN (".getEntity($element).")" ;
427
-
428
-		if ($id > 0) $sql.= " AND rowid = ".$db->escape($id);
429
-		else if ($ref) $sql.= " AND ref = '".$db->escape($ref)."'";
430
-		else if ($ref_ext) $sql.= " AND ref_ext = '".$db->escape($ref_ext)."'";
431
-		else {
432
-			$error='ErrorWrongParameters';
433
-			dol_print_error(get_class()."::isExistingObject ".$error, LOG_ERR);
434
-			return -1;
435
-		}
436
-		if ($ref || $ref_ext) $sql.= " AND entity = ".$conf->entity;
437
-
438
-		dol_syslog(get_class()."::isExistingObject", LOG_DEBUG);
439
-		$resql = $db->query($sql);
440
-		if ($resql)
441
-		{
442
-			$num=$db->num_rows($resql);
443
-			if ($num > 0) return 1;
444
-			else return 0;
445
-		}
446
-		return -1;
447
-	}
448
-
449
-	/**
450
-	 * Method to output saved errors
451
-	 *
452
-	 * @return	string		String with errors
453
-	 */
454
-	function errorsToString()
455
-	{
456
-		return $this->error.(is_array($this->errors)?(($this->error!=''?', ':'').join(', ',$this->errors)):'');
457
-	}
458
-
459
-	/**
460
-	 *	Return full name (civility+' '+name+' '+lastname)
461
-	 *
462
-	 *	@param	Translate	$langs			Language object for translation of civility (used only if option is 1)
463
-	 *	@param	int			$option			0=No option, 1=Add civility
464
-	 * 	@param	int			$nameorder		-1=Auto, 0=Lastname+Firstname, 1=Firstname+Lastname, 2=Firstname
465
-	 * 	@param	int			$maxlen			Maximum length
466
-	 * 	@return	string						String with full name
467
-	 */
468
-	function getFullName($langs,$option=0,$nameorder=-1,$maxlen=0)
469
-	{
470
-		//print "lastname=".$this->lastname." name=".$this->name." nom=".$this->nom."<br>\n";
471
-		$lastname=$this->lastname;
472
-		$firstname=$this->firstname;
473
-		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:'')))));
474
-
475
-		$ret='';
476
-		if ($option && $this->civility_id)
477
-		{
478
-			if ($langs->transnoentitiesnoconv("Civility".$this->civility_id)!="Civility".$this->civility_id) $ret.=$langs->transnoentitiesnoconv("Civility".$this->civility_id).' ';
479
-			else $ret.=$this->civility_id.' ';
480
-		}
481
-
482
-		$ret.=dolGetFirstLastname($firstname, $lastname, $nameorder);
483
-
484
-		return dol_trunc($ret,$maxlen);
485
-	}
486
-
487
-	/**
488
-	 * 	Return full address of contact
489
-	 *
490
-	 * 	@param		int			$withcountry		1=Add country into address string
491
-	 *  @param		string		$sep				Separator to use to build string
492
-	 *  @param		int		    $withregion			1=Add region into address string
493
-	 *	@return		string							Full address string
494
-	 */
495
-	function getFullAddress($withcountry=0, $sep="\n", $withregion=0)
496
-	{
497
-		if ($withcountry && $this->country_id && (empty($this->country_code) || empty($this->country)))
498
-		{
499
-			require_once DOL_DOCUMENT_ROOT .'/core/lib/company.lib.php';
500
-			$tmparray=getCountry($this->country_id,'all');
501
-			$this->country_code=$tmparray['code'];
502
-			$this->country     =$tmparray['label'];
503
-		}
203
+    /**
204
+     * @var string
205
+     * @see getFullAddress()
206
+     */
207
+    public $country;
504 208
 
505
-        if ($withregion && $this->state_id && (empty($this->state_code) || empty($this->state) || empty($this->region) || empty($this->region_cpde)))
506
-    	{
507
-    		require_once DOL_DOCUMENT_ROOT .'/core/lib/company.lib.php';
508
-    		$tmparray=getState($this->state_id,'all',0,1);
509
-			$this->state_code   =$tmparray['code'];
510
-			$this->state        =$tmparray['label'];
511
-			$this->region_code  =$tmparray['region_code'];
512
-			$this->region       =$tmparray['region'];
513
-        }
514
-
515
-		return dol_format_address($this, $withcountry, $sep);
516
-	}
517
-
518
-
519
-	/**
520
-	 * 	Return full address for banner
521
-	 *
522
-	 * 	@param		string		$htmlkey            HTML id to make banner content unique
523
-	 *  @param      Object      $object				Object (thirdparty, thirdparty of contact for contact, null for a member)
524
-	 *	@return		string							Full address string
525
-	 */
526
-	function getBannerAddress($htmlkey, $object)
527
-	{
528
-		global $conf, $langs;
529
-
530
-		$countriesusingstate=array('AU','US','IN','GB','ES','UK','TR');    // See also option MAIN_FORCE_STATE_INTO_ADDRESS
531
-
532
-		$contactid=0;
533
-		$thirdpartyid=0;
534
-		if ($this->element == 'societe')
535
-		{
536
-			$thirdpartyid=$this->id;
537
-		}
538
-		if ($this->element == 'contact')
539
-		{
540
-			$contactid=$this->id;
541
-			$thirdpartyid=$object->fk_soc;
542
-		}
543
-		if ($this->element == 'user')
544
-		{
545
-			$contactid=$this->contact_id;
546
-			$thirdpartyid=$object->fk_soc;
547
-		}
548
-
549
-		$out='<!-- BEGIN part to show address block -->';
550
-
551
-		$outdone=0;
552
-		$coords = $this->getFullAddress(1,', ',$conf->global->MAIN_SHOW_REGION_IN_STATE_SELECT);
553
-		if ($coords)
554
-		{
555
-			if (! empty($conf->use_javascript_ajax))
556
-			{
557
-				$namecoords = $this->getFullName($langs,1).'<br>'.$coords;
558
-				// hideonsmatphone because copyToClipboard call jquery dialog that does not work with jmobile
559
-				$out.='<a href="#" class="hideonsmartphone" onclick="return copyToClipboard(\''.dol_escape_js($namecoords).'\',\''.dol_escape_js($langs->trans("HelpCopyToClipboard")).'\');">';
560
-				$out.=img_picto($langs->trans("Address"), 'object_address.png');
561
-				$out.='</a> ';
562
-			}
563
-			$out.=dol_print_address($coords, 'address_'.$htmlkey.'_'.$this->id, $this->element, $this->id, 1, ', '); $outdone++;
564
-			$outdone++;
565
-		}
566
-
567
-		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
-				&& empty($conf->global->SOCIETE_DISABLE_STATE) && $this->state)
569
-		{
570
-            if (!empty($conf->global->MAIN_SHOW_REGION_IN_STATE_SELECT) && $conf->global->MAIN_SHOW_REGION_IN_STATE_SELECT == 1 && $this->region) {
571
-                $out.=($outdone?' - ':'').$this->region.' - '.$this->state;
572
-            }
573
-            else {
574
-                $out.=($outdone?' - ':'').$this->state;
575
-            }
576
-			$outdone++;
577
-		}
578
-
579
-		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>':'');
580
-		if (! empty($this->phone) && empty($this->phone_pro)) {		// For objects that store pro phone into ->phone
581
-			$out.=dol_print_phone($this->phone,$this->country_code,$contactid,$thirdpartyid,'AC_TEL','&nbsp;','phone',$langs->trans("PhonePro")); $outdone++;
582
-		}
583
-		if (! empty($this->phone_pro)) {
584
-			$out.=dol_print_phone($this->phone_pro,$this->country_code,$contactid,$thirdpartyid,'AC_TEL','&nbsp;','phone',$langs->trans("PhonePro")); $outdone++;
585
-		}
586
-		if (! empty($this->phone_mobile)) {
587
-			$out.=dol_print_phone($this->phone_mobile,$this->country_code,$contactid,$thirdpartyid,'AC_TEL','&nbsp;','mobile',$langs->trans("PhoneMobile")); $outdone++;
588
-		}
589
-		if (! empty($this->phone_perso)) {
590
-			$out.=dol_print_phone($this->phone_perso,$this->country_code,$contactid,$thirdpartyid,'AC_TEL','&nbsp;','phone',$langs->trans("PhonePerso")); $outdone++;
591
-		}
592
-		if (! empty($this->office_phone)) {
593
-			$out.=dol_print_phone($this->office_phone,$this->country_code,$contactid,$thirdpartyid,'AC_TEL','&nbsp;','phone',$langs->trans("PhonePro")); $outdone++;
594
-		}
595
-		if (! empty($this->user_mobile)) {
596
-			$out.=dol_print_phone($this->user_mobile,$this->country_code,$contactid,$thirdpartyid,'AC_TEL','&nbsp;','mobile',$langs->trans("PhoneMobile")); $outdone++;
597
-		}
598
-		if (! empty($this->fax)) {
599
-			$out.=dol_print_phone($this->fax,$this->country_code,$contactid,$thirdpartyid,'AC_FAX','&nbsp;','fax',$langs->trans("Fax")); $outdone++;
600
-		}
601
-		if (! empty($this->office_fax)) {
602
-			$out.=dol_print_phone($this->office_fax,$this->country_code,$contactid,$thirdpartyid,'AC_FAX','&nbsp;','fax',$langs->trans("Fax")); $outdone++;
603
-		}
604
-
605
-		$out.='<div style="clear: both;"></div>';
606
-		$outdone=0;
607
-		if (! empty($this->email))
608
-		{
609
-			$out.=dol_print_email($this->email,$this->id,$object->id,'AC_EMAIL',0,0,1);
610
-			$outdone++;
611
-		}
612
-		if (! empty($this->url))
613
-		{
614
-			$out.=dol_print_url($this->url,'_goout',0,1);
615
-			$outdone++;
616
-		}
617
-		$out.='<div style="clear: both;">';
618
-		if (! empty($conf->socialnetworks->enabled))
619
-		{
620
-			if ($this->skype) $out.=dol_print_socialnetworks($this->skype,$this->id,$object->id,'skype');
621
-			$outdone++;
622
-			if ($this->jabberid) $out.=dol_print_socialnetworks($this->jabberid,$this->id,$object->id,'jabber');
623
-			$outdone++;
624
-			if ($this->twitter) $out.=dol_print_socialnetworks($this->twitter,$this->id,$object->id,'twitter');
625
-			$outdone++;
626
-			if ($this->facebook) $out.=dol_print_socialnetworks($this->facebook,$this->id,$object->id,'facebook');
627
-			$outdone++;
628
-		}
629
-		$out.='</div>';
630
-
631
-		$out.='<!-- END Part to show address block -->';
632
-
633
-		return $out;
634
-	}
635
-
636
-	/**
637
-	 * Return the link of last main doc file for direct public download.
638
-	 *
639
-	 * @param	string	$modulepart			Module related to document
640
-	 * @param	int		$initsharekey		Init the share key if it was not yet defined
641
-	 * @param	int		$relativelink		0=Return full external link, 1=Return link relative to root of file
642
-	 * @return	string						Link or empty string if there is no download link
643
-	 */
644
-	function getLastMainDocLink($modulepart, $initsharekey=0, $relativelink=0)
645
-	{
646
-		global $user, $dolibarr_main_url_root;
647
-
648
-		if (empty($this->last_main_doc))
649
-		{
650
-			return '';		// No way to known which document name to use
651
-		}
652
-
653
-		include_once DOL_DOCUMENT_ROOT.'/ecm/class/ecmfiles.class.php';
654
-		$ecmfile=new EcmFiles($this->db);
655
-		$result = $ecmfile->fetch(0, '', $this->last_main_doc);
656
-		if ($result < 0)
657
-		{
658
-			$this->error = $ecmfile->error;
659
-			$this->errors = $ecmfile->errors;
660
-			return -1;
661
-		}
662
-
663
-		if (empty($ecmfile->id))
664
-		{
665
-			// Add entry into index
666
-			if ($initsharekey)
667
-			{
668
-				require_once DOL_DOCUMENT_ROOT.'/core/lib/security2.lib.php';
669
-				// TODO We can't, we dont' have full path of file, only last_main_doc adn ->element, so we must rebuild full path first
670
-				/*
671
-				$ecmfile->filepath = $rel_dir;
672
-				$ecmfile->filename = $filename;
673
-				$ecmfile->label = md5_file(dol_osencode($destfull));	// hash of file content
674
-				$ecmfile->fullpath_orig = '';
675
-				$ecmfile->gen_or_uploaded = 'generated';
676
-				$ecmfile->description = '';    // indexed content
677
-				$ecmfile->keyword = '';        // keyword content
678
-				$ecmfile->share = getRandomPassword(true);
679
-				$result = $ecmfile->create($user);
680
-				if ($result < 0)
681
-				{
682
-					$this->error = $ecmfile->error;
683
-					$this->errors = $ecmfile->errors;
684
-				}
685
-				*/
686
-			}
687
-			else return '';
688
-		}
689
-		elseif (empty($ecmfile->share))
690
-		{
691
-			// Add entry into index
692
-			if ($initsharekey)
693
-			{
694
-				require_once DOL_DOCUMENT_ROOT.'/core/lib/security2.lib.php';
695
-				$ecmfile->share = getRandomPassword(true);
696
-				$ecmfile->update($user);
697
-			}
698
-			else return '';
699
-		}
700
-
701
-		// Define $urlwithroot
702
-		$urlwithouturlroot=preg_replace('/'.preg_quote(DOL_URL_ROOT,'/').'$/i','',trim($dolibarr_main_url_root));
703
-		$urlwithroot=$urlwithouturlroot.DOL_URL_ROOT;		// This is to use external domain name found into config file
704
-		//$urlwithroot=DOL_MAIN_URL_ROOT;					// This is to use same domain name than current
705
-
706
-		$forcedownload=0;
707
-
708
-		$paramlink='';
709
-		//if (! empty($modulepart)) $paramlink.=($paramlink?'&':'').'modulepart='.$modulepart;		// For sharing with hash (so public files), modulepart is not required.
710
-		//if (! empty($ecmfile->entity)) $paramlink.='&entity='.$ecmfile->entity; 					// For sharing with hash (so public files), entity is not required.
711
-		//$paramlink.=($paramlink?'&':'').'file='.urlencode($filepath);								// No need of name of file for public link, we will use the hash
712
-		if (! empty($ecmfile->share)) $paramlink.=($paramlink?'&':'').'hashp='.$ecmfile->share;			// Hash for public share
713
-		if ($forcedownload) $paramlink.=($paramlink?'&':'').'attachment=1';
714
-
715
-		if ($relativelink)
716
-		{
717
-			$linktoreturn='document.php'.($paramlink?'?'.$paramlink:'');
718
-		}
719
-		else
720
-		{
721
-			$linktoreturn=$urlwithroot.'/document.php'.($paramlink?'?'.$paramlink:'');
722
-		}
723
-
724
-		// Here $ecmfile->share is defined
725
-		return $linktoreturn;
726
-	}
209
+    /**
210
+     * @var int
211
+     * @see getFullAddress(), country
212
+     */
213
+    public $country_id;
727 214
 
215
+    /**
216
+     * @var string
217
+     * @see getFullAddress(), isInEEC(), country
218
+     */
219
+    public $country_code;
728 220
 
729
-    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
730
-	/**
731
-	 *  Add a link between element $this->element and a contact
732
-	 *
733
-	 *  @param	int		$fk_socpeople       Id of thirdparty contact (if source = 'external') or id of user (if souce = 'internal') to link
734
-	 *  @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
735
-	 *  @param  string	$source             external=Contact extern (llx_socpeople), internal=Contact intern (llx_user)
736
-	 *  @param  int		$notrigger			Disable all triggers
737
-	 *  @return int                 		<0 if KO, >0 if OK
738
-	 */
739
-	function add_contact($fk_socpeople, $type_contact, $source='external',$notrigger=0)
740
-	{
741
-        // phpcs:enable
742
-		global $user,$langs;
743
-
744
-
745
-		dol_syslog(get_class($this)."::add_contact $fk_socpeople, $type_contact, $source, $notrigger");
746
-
747
-		// Check parameters
748
-		if ($fk_socpeople <= 0)
749
-		{
750
-			$langs->load("errors");
751
-			$this->error=$langs->trans("ErrorWrongValueForParameterX","1");
752
-			dol_syslog(get_class($this)."::add_contact ".$this->error,LOG_ERR);
753
-			return -1;
754
-		}
755
-		if (! $type_contact)
756
-		{
757
-			$langs->load("errors");
758
-			$this->error=$langs->trans("ErrorWrongValueForParameterX","2");
759
-			dol_syslog(get_class($this)."::add_contact ".$this->error,LOG_ERR);
760
-			return -2;
761
-		}
762
-
763
-		$id_type_contact=0;
764
-		if (is_numeric($type_contact))
765
-		{
766
-			$id_type_contact=$type_contact;
767
-		}
768
-		else
769
-		{
770
-			// We look for id type_contact
771
-			$sql = "SELECT tc.rowid";
772
-			$sql.= " FROM ".MAIN_DB_PREFIX."c_type_contact as tc";
773
-			$sql.= " WHERE tc.element='".$this->db->escape($this->element)."'";
774
-			$sql.= " AND tc.source='".$this->db->escape($source)."'";
775
-			$sql.= " AND tc.code='".$this->db->escape($type_contact)."' AND tc.active=1";
776
-			//print $sql;
777
-			$resql=$this->db->query($sql);
778
-			if ($resql)
779
-			{
780
-				$obj = $this->db->fetch_object($resql);
781
-				if ($obj) $id_type_contact=$obj->rowid;
782
-			}
783
-		}
784
-
785
-		if ($id_type_contact == 0)
786
-		{
787
-			$this->error='CODE_NOT_VALID_FOR_THIS_ELEMENT';
788
-			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");
789
-			return -3;
790
-		}
791
-
792
-		$datecreate = dol_now();
793
-
794
-		// Socpeople must have already been added by some trigger, then we have to check it to avoid DB_ERROR_RECORD_ALREADY_EXISTS error
795
-		$TListeContacts=$this->liste_contact(-1, $source);
796
-		$already_added=false;
797
-		if(!empty($TListeContacts)) {
798
-			foreach($TListeContacts as $array_contact) {
799
-				if($array_contact['status'] == 4 && $array_contact['id'] == $fk_socpeople && $array_contact['fk_c_type_contact'] == $id_type_contact) {
800
-					$already_added=true;
801
-					break;
802
-				}
803
-			}
804
-		}
221
+    /**
222
+     * @var string
223
+     * @see getFullAddress()
224
+     */
225
+    public $state;
805 226
 
806
-		if(!$already_added) {
227
+    /**
228
+     * @var int
229
+     * @see getFullAddress(), state
230
+     */
231
+    public $state_id;
807 232
 
808
-			$this->db->begin();
233
+    /**
234
+     * @var string
235
+     * @see getFullAddress(), state
236
+     */
237
+    public $state_code;
809 238
 
810
-			// Insert into database
811
-			$sql = "INSERT INTO ".MAIN_DB_PREFIX."element_contact";
812
-			$sql.= " (element_id, fk_socpeople, datecreate, statut, fk_c_type_contact) ";
813
-			$sql.= " VALUES (".$this->id.", ".$fk_socpeople." , " ;
814
-			$sql.= "'".$this->db->idate($datecreate)."'";
815
-			$sql.= ", 4, ". $id_type_contact;
816
-			$sql.= ")";
239
+    /**
240
+     * @var string
241
+     * @see getFullAddress(), region
242
+     */
243
+    public $region;
817 244
 
818
-			$resql=$this->db->query($sql);
819
-			if ($resql)
820
-			{
821
-				if (! $notrigger)
822
-				{
823
-					$result=$this->call_trigger(strtoupper($this->element).'_ADD_CONTACT', $user);
824
-					if ($result < 0)
825
-					{
826
-						$this->db->rollback();
827
-						return -1;
828
-					}
829
-				}
245
+    /**
246
+     * @var string
247
+     * @see getFullAddress(), region
248
+     */
249
+    public $region_code;
830 250
 
831
-				$this->db->commit();
832
-				return 1;
833
-			}
834
-			else
835
-			{
836
-				if ($this->db->errno() == 'DB_ERROR_RECORD_ALREADY_EXISTS')
837
-				{
838
-					$this->error=$this->db->errno();
839
-					$this->db->rollback();
840
-					echo 'err rollback';
841
-					return -2;
842
-				}
843
-				else
844
-				{
845
-					$this->error=$this->db->error();
846
-					$this->db->rollback();
847
-					return -1;
848
-				}
849
-			}
850
-		} else return 0;
851
-	}
251
+    /**
252
+     * @var int
253
+     * @see fetch_barcode()
254
+     */
255
+    public $barcode_type;
852 256
 
853
-    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
854
-	/**
855
-	 *    Copy contact from one element to current
856
-	 *
857
-	 *    @param    CommonObject    $objFrom    Source element
858
-	 *    @param    string          $source     Nature of contact ('internal' or 'external')
859
-	 *    @return   int                         >0 if OK, <0 if KO
860
-	 */
861
-	function copy_linked_contact($objFrom, $source='internal')
862
-	{
863
-        // phpcs:enable
864
-		$contacts = $objFrom->liste_contact(-1, $source);
865
-		foreach($contacts as $contact)
866
-		{
867
-			if ($this->add_contact($contact['id'], $contact['fk_c_type_contact'], $contact['source']) < 0)
868
-			{
869
-				$this->error=$this->db->lasterror();
870
-				return -1;
871
-			}
872
-		}
873
-		return 1;
874
-	}
257
+    /**
258
+     * @var string
259
+     * @see fetch_barcode(), barcode_type
260
+     */
261
+    public $barcode_type_code;
875 262
 
876
-    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
877
-	/**
878
-	 *      Update a link to contact line
879
-	 *
880
-	 *      @param	int		$rowid              Id of line contact-element
881
-	 * 		@param	int		$statut	            New status of link
882
-	 *      @param  int		$type_contact_id    Id of contact type (not modified if 0)
883
-	 *      @param  int		$fk_socpeople	    Id of soc_people to update (not modified if 0)
884
-	 *      @return int                 		<0 if KO, >= 0 if OK
885
-	 */
886
-	function update_contact($rowid, $statut, $type_contact_id=0, $fk_socpeople=0)
887
-	{
888
-        // phpcs:enable
889
-		// Insert into database
890
-		$sql = "UPDATE ".MAIN_DB_PREFIX."element_contact set";
891
-		$sql.= " statut = ".$statut;
892
-		if ($type_contact_id) $sql.= ", fk_c_type_contact = '".$type_contact_id ."'";
893
-		if ($fk_socpeople) $sql.= ", fk_socpeople = '".$fk_socpeople ."'";
894
-		$sql.= " where rowid = ".$rowid;
895
-		$resql=$this->db->query($sql);
896
-		if ($resql)
897
-		{
898
-			return 0;
899
-		}
900
-		else
901
-		{
902
-			$this->error=$this->db->lasterror();
903
-			return -1;
904
-		}
905
-	}
263
+    /**
264
+     * @var string
265
+     * @see fetch_barcode(), barcode_type
266
+     */
267
+    public $barcode_type_label;
906 268
 
907
-    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
908
-	/**
909
-	 *    Delete a link to contact line
910
-	 *
911
-	 *    @param	int		$rowid			Id of contact link line to delete
912
-	 *    @param	int		$notrigger		Disable all triggers
913
-	 *    @return   int						>0 if OK, <0 if KO
914
-	 */
915
-	function delete_contact($rowid, $notrigger=0)
916
-	{
917
-        // phpcs:enable
918
-		global $user;
269
+    /**
270
+     * @var string
271
+     * @see fetch_barcode(), barcode_type
272
+     */
273
+    public $barcode_type_coder;
919 274
 
275
+    /**
276
+     * @var int Payment method ID (cheque, cash, ...)
277
+     * @see setPaymentMethods()
278
+     */
279
+    public $mode_reglement_id;
920 280
 
921
-		$this->db->begin();
281
+    /**
282
+     * @var int Payment terms ID
283
+     * @see setPaymentTerms()
284
+     */
285
+    public $cond_reglement_id;
922 286
 
923
-		$sql = "DELETE FROM ".MAIN_DB_PREFIX."element_contact";
924
-		$sql.= " WHERE rowid =".$rowid;
287
+    /**
288
+     * @var int Payment terms ID
289
+     * @deprecated Kept for compatibility
290
+     * @see cond_reglement_id;
291
+     */
292
+    public $cond_reglement;
925 293
 
926
-		dol_syslog(get_class($this)."::delete_contact", LOG_DEBUG);
927
-		if ($this->db->query($sql))
928
-		{
929
-			if (! $notrigger)
930
-			{
931
-				$result=$this->call_trigger(strtoupper($this->element).'_DELETE_CONTACT', $user);
932
-				if ($result < 0) { $this->db->rollback(); return -1; }
933
-			}
934
-
935
-			$this->db->commit();
936
-			return 1;
937
-		}
938
-		else
939
-		{
940
-			$this->error=$this->db->lasterror();
941
-			$this->db->rollback();
942
-			return -1;
943
-		}
944
-	}
294
+    /**
295
+     * @var int Delivery address ID
296
+     * @deprecated
297
+     * @see setDeliveryAddress()
298
+     */
299
+    public $fk_delivery_address;
945 300
 
946
-    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
947
-	/**
948
-	 *    Delete all links between an object $this and all its contacts
949
-	 *
950
-	 *	  @param	string	$source		'' or 'internal' or 'external'
951
-	 *	  @param	string	$code		Type of contact (code or id)
952
-	 *    @return   int					>0 if OK, <0 if KO
953
-	 */
954
-	function delete_linked_contact($source='',$code='')
955
-	{
956
-        // phpcs:enable
957
-		$temp = array();
958
-		$typeContact = $this->liste_type_contact($source,'',0,0,$code);
959
-
960
-		foreach($typeContact as $key => $value)
961
-		{
962
-			array_push($temp,$key);
963
-		}
964
-		$listId = implode(",", $temp);
965
-
966
-		$sql = "DELETE FROM ".MAIN_DB_PREFIX."element_contact";
967
-		$sql.= " WHERE element_id = ".$this->id;
968
-		if ($listId)
969
-			$sql.= " AND fk_c_type_contact IN (".$listId.")";
970
-
971
-		dol_syslog(get_class($this)."::delete_linked_contact", LOG_DEBUG);
972
-		if ($this->db->query($sql))
973
-		{
974
-			return 1;
975
-		}
976
-		else
977
-		{
978
-			$this->error=$this->db->lasterror();
979
-			return -1;
980
-		}
981
-	}
301
+    /**
302
+     * @var int Shipping method ID
303
+     * @see setShippingMethod()
304
+     */
305
+    public $shipping_method_id;
982 306
 
983
-    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
984
-	/**
985
-	 *    Get array of all contacts for an object
986
-	 *
987
-	 *    @param	int			$statut		Status of links to get (-1=all)
988
-	 *    @param	string		$source		Source of contact: external or thirdparty (llx_socpeople) or internal (llx_user)
989
-	 *    @param	int         $list       0:Return array contains all properties, 1:Return array contains just id
990
-	 *    @param    string      $code       Filter on this code of contact type ('SHIPPING', 'BILLING', ...)
991
-	 *    @return	array|int		        Array of contacts, -1 if error
992
-	 */
993
-	function liste_contact($statut=-1,$source='external',$list=0,$code='')
994
-	{
995
-        // phpcs:enable
996
-		global $langs;
997
-
998
-		$tab=array();
999
-
1000
-		$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
1001
-		if ($source == 'internal') $sql.=", '-1' as socid, t.statut as statuscontact, t.login, t.photo";
1002
-		if ($source == 'external' || $source == 'thirdparty') $sql.=", t.fk_soc as socid, t.statut as statuscontact";
1003
-		$sql.= ", t.civility as civility, t.lastname as lastname, t.firstname, t.email";
1004
-		$sql.= ", tc.source, tc.element, tc.code, tc.libelle";
1005
-		$sql.= " FROM ".MAIN_DB_PREFIX."c_type_contact tc";
1006
-		$sql.= ", ".MAIN_DB_PREFIX."element_contact ec";
1007
-		if ($source == 'internal') $sql.=" LEFT JOIN ".MAIN_DB_PREFIX."user t on ec.fk_socpeople = t.rowid";
1008
-		if ($source == 'external'|| $source == 'thirdparty') $sql.=" LEFT JOIN ".MAIN_DB_PREFIX."socpeople t on ec.fk_socpeople = t.rowid";
1009
-		$sql.= " WHERE ec.element_id =".$this->id;
1010
-		$sql.= " AND ec.fk_c_type_contact=tc.rowid";
1011
-		$sql.= " AND tc.element='".$this->db->escape($this->element)."'";
1012
-		if ($code) $sql.= " AND tc.code = '".$this->db->escape($code)."'";
1013
-		if ($source == 'internal') $sql.= " AND tc.source = 'internal'";
1014
-		if ($source == 'external' || $source == 'thirdparty') $sql.= " AND tc.source = 'external'";
1015
-		$sql.= " AND tc.active=1";
1016
-		if ($statut >= 0) $sql.= " AND ec.statut = '".$statut."'";
1017
-		$sql.=" ORDER BY t.lastname ASC";
1018
-
1019
-		dol_syslog(get_class($this)."::liste_contact", LOG_DEBUG);
1020
-		$resql=$this->db->query($sql);
1021
-		if ($resql)
1022
-		{
1023
-			$num=$this->db->num_rows($resql);
1024
-			$i=0;
1025
-			while ($i < $num)
1026
-			{
1027
-				$obj = $this->db->fetch_object($resql);
307
+    /**
308
+     * @var string
309
+     * @see SetDocModel()
310
+     */
311
+    public $modelpdf;
1028 312
 
1029
-				if (! $list)
1030
-				{
1031
-					$transkey="TypeContact_".$obj->element."_".$obj->source."_".$obj->code;
1032
-					$libelle_type=($langs->trans($transkey)!=$transkey ? $langs->trans($transkey) : $obj->libelle);
1033
-					$tab[$i]=array('source'=>$obj->source,'socid'=>$obj->socid,'id'=>$obj->id,
1034
-								   'nom'=>$obj->lastname,      // For backward compatibility
1035
-								   'civility'=>$obj->civility, 'lastname'=>$obj->lastname, 'firstname'=>$obj->firstname, 'email'=>$obj->email, 'login'=>$obj->login, 'photo'=>$obj->photo, 'statuscontact'=>$obj->statuscontact,
1036
-								   'rowid'=>$obj->rowid, 'code'=>$obj->code, 'libelle'=>$libelle_type, 'status'=>$obj->statuslink, 'fk_c_type_contact'=>$obj->fk_c_type_contact);
1037
-				}
1038
-				else
1039
-				{
1040
-					$tab[$i]=$obj->id;
1041
-				}
313
+    /**
314
+     * @var int Bank account ID
315
+     * @see SetBankAccount()
316
+     */
317
+    public $fk_account;
1042 318
 
1043
-				$i++;
1044
-			}
1045
-
1046
-			return $tab;
1047
-		}
1048
-		else
1049
-		{
1050
-			$this->error=$this->db->lasterror();
1051
-			dol_print_error($this->db);
1052
-			return -1;
1053
-		}
1054
-	}
1055
-
1056
-
1057
-	/**
1058
-	 * 		Update status of a contact linked to object
1059
-	 *
1060
-	 * 		@param	int		$rowid		Id of link between object and contact
1061
-	 * 		@return	int					<0 if KO, >=0 if OK
1062
-	 */
1063
-	function swapContactStatus($rowid)
1064
-	{
1065
-		$sql = "SELECT ec.datecreate, ec.statut, ec.fk_socpeople, ec.fk_c_type_contact,";
1066
-		$sql.= " tc.code, tc.libelle";
1067
-		//$sql.= ", s.fk_soc";
1068
-		$sql.= " FROM (".MAIN_DB_PREFIX."element_contact as ec, ".MAIN_DB_PREFIX."c_type_contact as tc)";
1069
-		//$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
1070
-		$sql.= " WHERE ec.rowid =".$rowid;
1071
-		$sql.= " AND ec.fk_c_type_contact=tc.rowid";
1072
-		$sql.= " AND tc.element = '".$this->db->escape($this->element)."'";
1073
-
1074
-		dol_syslog(get_class($this)."::swapContactStatus", LOG_DEBUG);
1075
-		$resql=$this->db->query($sql);
1076
-		if ($resql)
1077
-		{
1078
-			$obj = $this->db->fetch_object($resql);
1079
-			$newstatut = ($obj->statut == 4) ? 5 : 4;
1080
-			$result = $this->update_contact($rowid, $newstatut);
1081
-			$this->db->free($resql);
1082
-			return $result;
1083
-		}
1084
-		else
1085
-		{
1086
-			$this->error=$this->db->error();
1087
-			dol_print_error($this->db);
1088
-			return -1;
1089
-		}
1090
-	}
319
+    /**
320
+     * @var string Public note
321
+     * @see update_note()
322
+     */
323
+    public $note_public;
1091 324
 
1092
-    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
1093
-	/**
1094
-	 *      Return array with list of possible values for type of contacts
1095
-	 *
1096
-	 *      @param	string	$source     'internal', 'external' or 'all'
1097
-	 *      @param	string	$order		Sort order by : 'position', 'code', 'rowid'...
1098
-	 *      @param  int		$option     0=Return array id->label, 1=Return array code->label
1099
-	 *      @param  int		$activeonly 0=all status of contact, 1=only the active
1100
-	 *		@param	string	$code		Type of contact (Example: 'CUSTOMER', 'SERVICE')
1101
-	 *      @return array       		Array list of type of contacts (id->label if option=0, code->label if option=1)
1102
-	 */
1103
-	function liste_type_contact($source='internal', $order='position', $option=0, $activeonly=0, $code='')
1104
-	{
1105
-        // phpcs:enable
1106
-		global $langs;
1107
-
1108
-		if (empty($order)) $order='position';
1109
-		if ($order == 'position') $order.=',code';
1110
-
1111
-		$tab = array();
1112
-		$sql = "SELECT DISTINCT tc.rowid, tc.code, tc.libelle, tc.position";
1113
-		$sql.= " FROM ".MAIN_DB_PREFIX."c_type_contact as tc";
1114
-		$sql.= " WHERE tc.element='".$this->db->escape($this->element)."'";
1115
-		if ($activeonly == 1) $sql.= " AND tc.active=1"; // only the active types
1116
-		if (! empty($source) && $source != 'all') $sql.= " AND tc.source='".$this->db->escape($source)."'";
1117
-		if (! empty($code)) $sql.= " AND tc.code='".$this->db->escape($code)."'";
1118
-		$sql.= $this->db->order($order,'ASC');
1119
-
1120
-		//print "sql=".$sql;
1121
-		$resql=$this->db->query($sql);
1122
-		if ($resql)
1123
-		{
1124
-			$num=$this->db->num_rows($resql);
1125
-			$i=0;
1126
-			while ($i < $num)
1127
-			{
1128
-				$obj = $this->db->fetch_object($resql);
1129
-
1130
-				$transkey="TypeContact_".$this->element."_".$source."_".$obj->code;
1131
-				$libelle_type=($langs->trans($transkey)!=$transkey ? $langs->trans($transkey) : $obj->libelle);
1132
-				if (empty($option)) $tab[$obj->rowid]=$libelle_type;
1133
-				else $tab[$obj->code]=$libelle_type;
1134
-				$i++;
1135
-			}
1136
-			return $tab;
1137
-		}
1138
-		else
1139
-		{
1140
-			$this->error=$this->db->lasterror();
1141
-			//dol_print_error($this->db);
1142
-			return null;
1143
-		}
1144
-	}
1145
-
1146
-	/**
1147
-	 *      Return id of contacts for a source and a contact code.
1148
-	 *      Example: contact client de facturation ('external', 'BILLING')
1149
-	 *      Example: contact client de livraison ('external', 'SHIPPING')
1150
-	 *      Example: contact interne suivi paiement ('internal', 'SALESREPFOLL')
1151
-	 *
1152
-	 *		@param	string	$source		'external' or 'internal'
1153
-	 *		@param	string	$code		'BILLING', 'SHIPPING', 'SALESREPFOLL', ...
1154
-	 *		@param	int		$status		limited to a certain status
1155
-	 *      @return array       		List of id for such contacts
1156
-	 */
1157
-	function getIdContact($source,$code,$status=0)
1158
-	{
1159
-		global $conf;
1160
-
1161
-		$result=array();
1162
-		$i=0;
1163
-		//cas particulier pour les expeditions
1164
-		if($this->element=='shipping' && $this->origin_id != 0) {
1165
-			$id=$this->origin_id;
1166
-			$element='commande';
1167
-        } else if($this->element=='reception' && $this->origin_id != 0) {
1168
-            $id=$this->origin_id;
1169
-            $element='order_supplier';
1170
-		} else {
1171
-			$id=$this->id;
1172
-			$element=$this->element;
1173
-		}
1174
-
1175
-		$sql = "SELECT ec.fk_socpeople";
1176
-		$sql.= " FROM ".MAIN_DB_PREFIX."element_contact as ec,";
1177
-		if ($source == 'internal') $sql.= " ".MAIN_DB_PREFIX."user as c,";
1178
-		if ($source == 'external') $sql.= " ".MAIN_DB_PREFIX."socpeople as c,";
1179
-		$sql.= " ".MAIN_DB_PREFIX."c_type_contact as tc";
1180
-		$sql.= " WHERE ec.element_id = ".$id;
1181
-		$sql.= " AND ec.fk_socpeople = c.rowid";
1182
-		if ($source == 'internal') $sql.= " AND c.entity IN (".getEntity('user').")";
1183
-		if ($source == 'external') $sql.= " AND c.entity IN (".getEntity('societe').")";
1184
-		$sql.= " AND ec.fk_c_type_contact = tc.rowid";
1185
-		$sql.= " AND tc.element = '".$element."'";
1186
-		$sql.= " AND tc.source = '".$source."'";
1187
-		$sql.= " AND tc.code = '".$code."'";
1188
-		$sql.= " AND tc.active = 1";
1189
-		if ($status) $sql.= " AND ec.statut = ".$status;
1190
-
1191
-		dol_syslog(get_class($this)."::getIdContact", LOG_DEBUG);
1192
-		$resql=$this->db->query($sql);
1193
-		if ($resql)
1194
-		{
1195
-			while ($obj = $this->db->fetch_object($resql))
1196
-			{
1197
-				$result[$i]=$obj->fk_socpeople;
1198
-				$i++;
1199
-			}
1200
-		}
1201
-		else
1202
-		{
1203
-			$this->error=$this->db->error();
1204
-			return null;
1205
-		}
1206
-
1207
-		return $result;
1208
-	}
325
+    /**
326
+     * @var string Private note
327
+     * @see update_note()
328
+     */
329
+    public $note_private;
1209 330
 
1210
-    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
1211
-	/**
1212
-	 *		Load object contact with id=$this->contactid into $this->contact
1213
-	 *
1214
-	 *		@param	int		$contactid      Id du contact. Use this->contactid if empty.
1215
-	 *		@return	int						<0 if KO, >0 if OK
1216
-	 */
1217
-	function fetch_contact($contactid=null)
1218
-	{
1219
-        // phpcs:enable
1220
-		if (empty($contactid)) $contactid=$this->contactid;
331
+    /**
332
+     * @deprecated
333
+     * @see note_public
334
+     */
335
+    public $note;
1221 336
 
1222
-		if (empty($contactid)) return 0;
337
+    /**
338
+     * @var float Total amount before taxes
339
+     * @see update_price()
340
+     */
341
+    public $total_ht;
1223 342
 
1224
-		require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php';
1225
-		$contact = new Contact($this->db);
1226
-		$result=$contact->fetch($contactid);
1227
-		$this->contact = $contact;
1228
-		return $result;
1229
-	}
343
+    /**
344
+     * @var float Total VAT amount
345
+     * @see update_price()
346
+     */
347
+    public $total_tva;
1230 348
 
1231
-    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
1232
-	/**
1233
-	 *    	Load the third party of object, from id $this->socid or $this->fk_soc, into this->thirdparty
1234
-	 *
1235
-	 *		@param		int		$force_thirdparty_id	Force thirdparty id
1236
-	 *		@return		int								<0 if KO, >0 if OK
1237
-	 */
1238
-	function fetch_thirdparty($force_thirdparty_id=0)
1239
-	{
1240
-        // phpcs:enable
1241
-		global $conf;
349
+    /**
350
+     * @var float Total local tax 1 amount
351
+     * @see update_price()
352
+     */
353
+    public $total_localtax1;
1242 354
 
1243
-		if (empty($this->socid) && empty($this->fk_soc) && empty($this->fk_thirdparty) && empty($force_thirdparty_id))
1244
-			return 0;
355
+    /**
356
+     * @var float Total local tax 2 amount
357
+     * @see update_price()
358
+     */
359
+    public $total_localtax2;
1245 360
 
1246
-		require_once DOL_DOCUMENT_ROOT . '/societe/class/societe.class.php';
361
+    /**
362
+     * @var float Total amount with taxes
363
+     * @see update_price()
364
+     */
365
+    public $total_ttc;
1247 366
 
1248
-		$idtofetch = isset($this->socid) ? $this->socid : (isset($this->fk_soc) ? $this->fk_soc : $this->fk_thirdparty);
1249
-		if ($force_thirdparty_id)
1250
-			$idtofetch = $force_thirdparty_id;
367
+    /**
368
+     * @var CommonObjectLine[]
369
+     */
370
+    public $lines;
1251 371
 
1252
-		if ($idtofetch) {
1253
-			$thirdparty = new Societe($this->db);
1254
-			$result = $thirdparty->fetch($idtofetch);
1255
-			$this->thirdparty = $thirdparty;
372
+    /**
373
+     * @var mixed		Contains comments
374
+     * @see fetchComments()
375
+     */
376
+    public $comments=array();
1256 377
 
1257
-			// Use first price level if level not defined for third party
1258
-			if (!empty($conf->global->PRODUIT_MULTIPRICES) && empty($this->thirdparty->price_level)) {
1259
-				$this->thirdparty->price_level = 1;
1260
-			}
378
+    /**
379
+     * @var int
380
+     * @see setIncoterms()
381
+     */
382
+    public $fk_incoterms;
1261 383
 
1262
-			return $result;
1263
-		} else
1264
-			return -1;
1265
-	}
384
+    /**
385
+     * @var string
386
+     * @see SetIncoterms()
387
+     */
388
+    public $libelle_incoterms;
1266 389
 
390
+    /**
391
+     * @var string
392
+     * @see display_incoterms()
393
+     */
394
+    public $location_incoterms;
1267 395
 
1268
-	/**
1269
-	 * Looks for an object with ref matching the wildcard provided
1270
-	 * It does only work when $this->table_ref_field is set
1271
-	 *
1272
-	 * @param string $ref Wildcard
1273
-	 * @return int >1 = OK, 0 = Not found or table_ref_field not defined, <0 = KO
1274
-	 */
1275
-	public function fetchOneLike($ref)
1276
-	{
1277
-		if (!$this->table_ref_field) {
1278
-			return 0;
1279
-		}
396
+    public $name;
397
+    public $lastname;
398
+    public $firstname;
399
+    public $civility_id;
1280 400
 
1281
-		$sql = 'SELECT rowid FROM '.MAIN_DB_PREFIX.$this->table_element.' WHERE '.$this->table_ref_field.' LIKE "'.$this->db->escape($ref).'" LIMIT 1';
401
+    // Dates
402
+    public $date_creation;			// Date creation
403
+    public $date_validation;		// Date validation
404
+    public $date_modification;		// Date last change (tms field)
1282 405
 
1283
-		$query = $this->db->query($sql);
1284 406
 
1285
-		if (!$this->db->num_rows($query)) {
1286
-			return 0;
1287
-		}
1288 407
 
1289
-		$result = $this->db->fetch_object($query);
408
+    // No constructor as it is an abstract class
1290 409
 
1291
-		return $this->fetch($result->rowid);
1292
-	}
410
+    /**
411
+     * Check an object id/ref exists
412
+     * If you don't need/want to instantiate object and just need to know if object exists, use this method instead of fetch
413
+     *
414
+     *  @param	string	$element   	String of element ('product', 'facture', ...)
415
+     *  @param	int		$id      	Id of object
416
+     *  @param  string	$ref     	Ref of object to check
417
+     *  @param	string	$ref_ext	Ref ext of object to check
418
+     *  @return int     			<0 if KO, 0 if OK but not found, >0 if OK and exists
419
+     */
420
+    static function isExistingObject($element, $id, $ref='', $ref_ext='')
421
+    {
422
+        global $db,$conf;
423
+
424
+        $sql = "SELECT rowid, ref, ref_ext";
425
+        $sql.= " FROM ".MAIN_DB_PREFIX.$element;
426
+        $sql.= " WHERE entity IN (".getEntity($element).")" ;
427
+
428
+        if ($id > 0) $sql.= " AND rowid = ".$db->escape($id);
429
+        else if ($ref) $sql.= " AND ref = '".$db->escape($ref)."'";
430
+        else if ($ref_ext) $sql.= " AND ref_ext = '".$db->escape($ref_ext)."'";
431
+        else {
432
+            $error='ErrorWrongParameters';
433
+            dol_print_error(get_class()."::isExistingObject ".$error, LOG_ERR);
434
+            return -1;
435
+        }
436
+        if ($ref || $ref_ext) $sql.= " AND entity = ".$conf->entity;
1293 437
 
1294
-    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
1295
-	/**
1296
-	 *	Load data for barcode into properties ->barcode_type*
1297
-	 *	Properties ->barcode_type that is id of barcode. Type is used to find other properties, but
1298
-	 *  if it is not defined, ->element must be defined to know default barcode type.
1299
-	 *
1300
-	 *	@return		int			<0 if KO, 0 if can't guess type of barcode (ISBN, EAN13...), >0 if OK (all barcode properties loaded)
1301
-	 */
1302
-	function fetch_barcode()
1303
-	{
1304
-        // phpcs:enable
1305
-		global $conf;
438
+        dol_syslog(get_class()."::isExistingObject", LOG_DEBUG);
439
+        $resql = $db->query($sql);
440
+        if ($resql)
441
+        {
442
+            $num=$db->num_rows($resql);
443
+            if ($num > 0) return 1;
444
+            else return 0;
445
+        }
446
+        return -1;
447
+    }
1306 448
 
1307
-		dol_syslog(get_class($this).'::fetch_barcode this->element='.$this->element.' this->barcode_type='.$this->barcode_type);
449
+    /**
450
+     * Method to output saved errors
451
+     *
452
+     * @return	string		String with errors
453
+     */
454
+    function errorsToString()
455
+    {
456
+        return $this->error.(is_array($this->errors)?(($this->error!=''?', ':'').join(', ',$this->errors)):'');
457
+    }
1308 458
 
1309
-		$idtype=$this->barcode_type;
1310
-		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
1311
-		{
1312
-			if ($this->element == 'product')      $idtype = $conf->global->PRODUIT_DEFAULT_BARCODE_TYPE;
1313
-			else if ($this->element == 'societe') $idtype = $conf->global->GENBARCODE_BARCODETYPE_THIRDPARTY;
1314
-			else dol_syslog('Call fetch_barcode with barcode_type not defined and cant be guessed', LOG_WARNING);
1315
-		}
459
+    /**
460
+     *	Return full name (civility+' '+name+' '+lastname)
461
+     *
462
+     *	@param	Translate	$langs			Language object for translation of civility (used only if option is 1)
463
+     *	@param	int			$option			0=No option, 1=Add civility
464
+     * 	@param	int			$nameorder		-1=Auto, 0=Lastname+Firstname, 1=Firstname+Lastname, 2=Firstname
465
+     * 	@param	int			$maxlen			Maximum length
466
+     * 	@return	string						String with full name
467
+     */
468
+    function getFullName($langs,$option=0,$nameorder=-1,$maxlen=0)
469
+    {
470
+        //print "lastname=".$this->lastname." name=".$this->name." nom=".$this->nom."<br>\n";
471
+        $lastname=$this->lastname;
472
+        $firstname=$this->firstname;
473
+        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:'')))));
1316 474
 
1317
-		if ($idtype > 0)
1318
-		{
1319
-			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
1320
-			{
1321
-				$sql = "SELECT rowid, code, libelle as label, coder";
1322
-				$sql.= " FROM ".MAIN_DB_PREFIX."c_barcode_type";
1323
-				$sql.= " WHERE rowid = ".$idtype;
1324
-				dol_syslog(get_class($this).'::fetch_barcode', LOG_DEBUG);
1325
-				$resql = $this->db->query($sql);
1326
-				if ($resql)
1327
-				{
1328
-					$obj = $this->db->fetch_object($resql);
1329
-					$this->barcode_type       = $obj->rowid;
1330
-					$this->barcode_type_code  = $obj->code;
1331
-					$this->barcode_type_label = $obj->label;
1332
-					$this->barcode_type_coder = $obj->coder;
1333
-					return 1;
1334
-				}
1335
-				else
1336
-				{
1337
-					dol_print_error($this->db);
1338
-					return -1;
1339
-				}
1340
-			}
1341
-		}
1342
-		return 0;
1343
-	}
475
+        $ret='';
476
+        if ($option && $this->civility_id)
477
+        {
478
+            if ($langs->transnoentitiesnoconv("Civility".$this->civility_id)!="Civility".$this->civility_id) $ret.=$langs->transnoentitiesnoconv("Civility".$this->civility_id).' ';
479
+            else $ret.=$this->civility_id.' ';
480
+        }
1344 481
 
1345
-    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
1346
-	/**
1347
-	 *		Load the project with id $this->fk_project into this->project
1348
-	 *
1349
-	 *		@return		int			<0 if KO, >=0 if OK
1350
-	 */
1351
-	function fetch_projet()
1352
-	{
1353
-        // phpcs:enable
1354
-		include_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
482
+        $ret.=dolGetFirstLastname($firstname, $lastname, $nameorder);
1355 483
 
1356
-		if (empty($this->fk_project) && ! empty($this->fk_projet)) $this->fk_project = $this->fk_projet;	// For backward compatibility
1357
-		if (empty($this->fk_project)) return 0;
484
+        return dol_trunc($ret,$maxlen);
485
+    }
1358 486
 
1359
-		$project = new Project($this->db);
1360
-		$result = $project->fetch($this->fk_project);
487
+    /**
488
+     * 	Return full address of contact
489
+     *
490
+     * 	@param		int			$withcountry		1=Add country into address string
491
+     *  @param		string		$sep				Separator to use to build string
492
+     *  @param		int		    $withregion			1=Add region into address string
493
+     *	@return		string							Full address string
494
+     */
495
+    function getFullAddress($withcountry=0, $sep="\n", $withregion=0)
496
+    {
497
+        if ($withcountry && $this->country_id && (empty($this->country_code) || empty($this->country)))
498
+        {
499
+            require_once DOL_DOCUMENT_ROOT .'/core/lib/company.lib.php';
500
+            $tmparray=getCountry($this->country_id,'all');
501
+            $this->country_code=$tmparray['code'];
502
+            $this->country     =$tmparray['label'];
503
+        }
1361 504
 
1362
-		$this->projet = $project;	// deprecated
1363
-		$this->project = $project;
1364
-		return $result;
1365
-	}
505
+        if ($withregion && $this->state_id && (empty($this->state_code) || empty($this->state) || empty($this->region) || empty($this->region_cpde)))
506
+        {
507
+            require_once DOL_DOCUMENT_ROOT .'/core/lib/company.lib.php';
508
+            $tmparray=getState($this->state_id,'all',0,1);
509
+            $this->state_code   =$tmparray['code'];
510
+            $this->state        =$tmparray['label'];
511
+            $this->region_code  =$tmparray['region_code'];
512
+            $this->region       =$tmparray['region'];
513
+        }
1366 514
 
1367
-    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
1368
-	/**
1369
-	 *		Load the product with id $this->fk_product into this->product
1370
-	 *
1371
-	 *		@return		int			<0 if KO, >=0 if OK
1372
-	 */
1373
-	function fetch_product()
1374
-	{
1375
-        // phpcs:enable
1376
-		include_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
515
+        return dol_format_address($this, $withcountry, $sep);
516
+    }
1377 517
 
1378
-		if (empty($this->fk_product)) return 0;
1379 518
 
1380
-		$product = new Product($this->db);
1381
-		$result = $product->fetch($this->fk_product);
519
+    /**
520
+     * 	Return full address for banner
521
+     *
522
+     * 	@param		string		$htmlkey            HTML id to make banner content unique
523
+     *  @param      Object      $object				Object (thirdparty, thirdparty of contact for contact, null for a member)
524
+     *	@return		string							Full address string
525
+     */
526
+    function getBannerAddress($htmlkey, $object)
527
+    {
528
+        global $conf, $langs;
1382 529
 
1383
-		$this->product = $product;
1384
-		return $result;
1385
-	}
530
+        $countriesusingstate=array('AU','US','IN','GB','ES','UK','TR');    // See also option MAIN_FORCE_STATE_INTO_ADDRESS
1386 531
 
1387
-    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
1388
-	/**
1389
-	 *		Load the user with id $userid into this->user
1390
-	 *
1391
-	 *		@param	int		$userid 		Id du contact
1392
-	 *		@return	int						<0 if KO, >0 if OK
1393
-	 */
1394
-	function fetch_user($userid)
1395
-	{
1396
-        // phpcs:enable
1397
-		$user = new User($this->db);
1398
-		$result=$user->fetch($userid);
1399
-		$this->user = $user;
1400
-		return $result;
1401
-	}
532
+        $contactid=0;
533
+        $thirdpartyid=0;
534
+        if ($this->element == 'societe')
535
+        {
536
+            $thirdpartyid=$this->id;
537
+        }
538
+        if ($this->element == 'contact')
539
+        {
540
+            $contactid=$this->id;
541
+            $thirdpartyid=$object->fk_soc;
542
+        }
543
+        if ($this->element == 'user')
544
+        {
545
+            $contactid=$this->contact_id;
546
+            $thirdpartyid=$object->fk_soc;
547
+        }
1402 548
 
1403
-    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
1404
-	/**
1405
-	 *	Read linked origin object
1406
-	 *
1407
-	 *	@return		void
1408
-	 */
1409
-	function fetch_origin()
1410
-	{
1411
-        // phpcs:enable
1412
-		if ($this->origin == 'shipping') $this->origin = 'expedition';
1413
-		if ($this->origin == 'delivery') $this->origin = 'livraison';
1414
-        if ($this->origin == 'order_supplier') $this->origin = 'commandeFournisseur';
549
+        $out='<!-- BEGIN part to show address block -->';
1415 550
 
1416
-		$origin = $this->origin;
551
+        $outdone=0;
552
+        $coords = $this->getFullAddress(1,', ',$conf->global->MAIN_SHOW_REGION_IN_STATE_SELECT);
553
+        if ($coords)
554
+        {
555
+            if (! empty($conf->use_javascript_ajax))
556
+            {
557
+                $namecoords = $this->getFullName($langs,1).'<br>'.$coords;
558
+                // hideonsmatphone because copyToClipboard call jquery dialog that does not work with jmobile
559
+                $out.='<a href="#" class="hideonsmartphone" onclick="return copyToClipboard(\''.dol_escape_js($namecoords).'\',\''.dol_escape_js($langs->trans("HelpCopyToClipboard")).'\');">';
560
+                $out.=img_picto($langs->trans("Address"), 'object_address.png');
561
+                $out.='</a> ';
562
+            }
563
+            $out.=dol_print_address($coords, 'address_'.$htmlkey.'_'.$this->id, $this->element, $this->id, 1, ', '); $outdone++;
564
+            $outdone++;
565
+        }
1417 566
 
1418
-		$classname = ucfirst($origin);
1419
-		$this->$origin = new $classname($this->db);
1420
-		$this->$origin->fetch($this->origin_id);
1421
-	}
567
+        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
+                && empty($conf->global->SOCIETE_DISABLE_STATE) && $this->state)
569
+        {
570
+            if (!empty($conf->global->MAIN_SHOW_REGION_IN_STATE_SELECT) && $conf->global->MAIN_SHOW_REGION_IN_STATE_SELECT == 1 && $this->region) {
571
+                $out.=($outdone?' - ':'').$this->region.' - '.$this->state;
572
+            }
573
+            else {
574
+                $out.=($outdone?' - ':'').$this->state;
575
+            }
576
+            $outdone++;
577
+        }
1422 578
 
1423
-	/**
1424
-     *  Load object from specific field
1425
-     *
1426
-     *  @param	string	$table		Table element or element line
1427
-     *  @param	string	$field		Field selected
1428
-     *  @param	string	$key		Import key
1429
-     *  @param	string	$element	Element name
1430
-     *	@return	int					<0 if KO, >0 if OK
1431
-     */
1432
-	function fetchObjectFrom($table, $field, $key, $element = null)
1433
-	{
1434
-		global $conf;
1435
-
1436
-		$result=false;
1437
-
1438
-		$sql = "SELECT rowid FROM ".MAIN_DB_PREFIX.$table;
1439
-		$sql.= " WHERE ".$field." = '".$key."'";
1440
-		if (! empty($element)) {
1441
-			$sql.= " AND entity IN (".getEntity($element).")";
1442
-		} else {
1443
-			$sql.= " AND entity = ".$conf->entity;
1444
-		}
1445
-
1446
-		dol_syslog(get_class($this).'::fetchObjectFrom', LOG_DEBUG);
1447
-		$resql = $this->db->query($sql);
1448
-		if ($resql)
1449
-		{
1450
-			$row = $this->db->fetch_row($resql);
1451
-			// Test for avoid error -1
1452
-			if ($row[0] > 0) {
1453
-				$result = $this->fetch($row[0]);
1454
-			}
1455
-		}
1456
-
1457
-		return $result;
1458
-	}
1459
-
1460
-	/**
1461
-	 *	Getter generic. Load value from a specific field
1462
-	 *
1463
-	 *	@param	string	$table		Table of element or element line
1464
-	 *	@param	int		$id			Element id
1465
-	 *	@param	string	$field		Field selected
1466
-	 *	@return	int					<0 if KO, >0 if OK
1467
-	 */
1468
-	function getValueFrom($table, $id, $field)
1469
-	{
1470
-		$result=false;
1471
-		if (!empty($id) && !empty($field) && !empty($table)) {
1472
-			$sql = "SELECT ".$field." FROM ".MAIN_DB_PREFIX.$table;
1473
-			$sql.= " WHERE rowid = ".$id;
1474
-
1475
-			dol_syslog(get_class($this).'::getValueFrom', LOG_DEBUG);
1476
-			$resql = $this->db->query($sql);
1477
-			if ($resql)
1478
-			{
1479
-				$row = $this->db->fetch_row($resql);
1480
-				$result = $row[0];
1481
-			}
1482
-		}
1483
-		return $result;
1484
-	}
1485
-
1486
-	/**
1487
-	 *	Setter generic. Update a specific field into database.
1488
-	 *  Warning: Trigger is run only if param trigkey is provided.
1489
-	 *
1490
-	 *	@param	string		$field			Field to update
1491
-	 *	@param	mixed		$value			New value
1492
-	 *	@param	string		$table			To force other table element or element line (should not be used)
1493
-	 *	@param	int			$id				To force other object id (should not be used)
1494
-	 *	@param	string		$format			Data format ('text', 'date'). 'text' is used if not defined
1495
-	 *	@param	string		$id_field		To force rowid field name. 'rowid' is used if not defined
1496
-	 *	@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'
1497
-	 *  @param  string      $trigkey    	Trigger key to run (in most cases something like 'XXX_MODIFY')
1498
-	 *  @param	string		$fk_user_field	Name of field to save user id making change
1499
-	 *	@return	int							<0 if KO, >0 if OK
1500
-	 *  @see updateExtraField
1501
-	 */
1502
-	function setValueFrom($field, $value, $table='', $id=null, $format='', $id_field='', $fuser=null, $trigkey='', $fk_user_field='fk_user_modif')
1503
-	{
1504
-		global $user,$langs,$conf;
1505
-
1506
-		if (empty($table)) 	  $table=$this->table_element;
1507
-		if (empty($id))    	  $id=$this->id;
1508
-		if (empty($format))   $format='text';
1509
-		if (empty($id_field)) $id_field='rowid';
1510
-
1511
-		$error=0;
1512
-
1513
-		$this->db->begin();
1514
-
1515
-		// Special case
1516
-		if ($table == 'product' && $field == 'note_private') $field='note';
1517
-		if (in_array($table, array('actioncomm', 'adherent', 'advtargetemailing', 'cronjob', 'establishment'))) $fk_user_field = 'fk_user_mod';
1518
-
1519
-		$sql = "UPDATE ".MAIN_DB_PREFIX.$table." SET ";
1520
-
1521
-		if ($format == 'text') $sql.= $field." = '".$this->db->escape($value)."'";
1522
-		else if ($format == 'int') $sql.= $field." = ".$this->db->escape($value);
1523
-		else if ($format == 'date') $sql.= $field." = ".($value ? "'".$this->db->idate($value)."'" : "null");
1524
-
1525
-		if ($fk_user_field)
1526
-		{
1527
-			if (! empty($fuser) && is_object($fuser)) $sql.=", ".$fk_user_field." = ".$fuser->id;
1528
-			elseif (empty($fuser) || $fuser != 'none') $sql.=", ".$fk_user_field." = ".$user->id;
1529
-		}
1530
-
1531
-		$sql.= " WHERE ".$id_field." = ".$id;
1532
-
1533
-		dol_syslog(get_class($this)."::".__FUNCTION__."", LOG_DEBUG);
1534
-		$resql = $this->db->query($sql);
1535
-		if ($resql)
1536
-		{
1537
-			if ($trigkey)
1538
-			{
1539
-				// call trigger with updated object values
1540
-				if (empty($this->fields) && method_exists($this, 'fetch'))
1541
-				{
1542
-					$result = $this->fetch($id);
1543
-				}
1544
-				else
1545
-				{
1546
-					$result = $this->fetchCommon($id);
1547
-				}
1548
-				if ($result >= 0) $result=$this->call_trigger($trigkey, (! empty($fuser) && is_object($fuser)) ? $fuser : $user);   // This may set this->errors
1549
-				if ($result < 0) $error++;
1550
-			}
579
+        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>':'');
580
+        if (! empty($this->phone) && empty($this->phone_pro)) {		// For objects that store pro phone into ->phone
581
+            $out.=dol_print_phone($this->phone,$this->country_code,$contactid,$thirdpartyid,'AC_TEL','&nbsp;','phone',$langs->trans("PhonePro")); $outdone++;
582
+        }
583
+        if (! empty($this->phone_pro)) {
584
+            $out.=dol_print_phone($this->phone_pro,$this->country_code,$contactid,$thirdpartyid,'AC_TEL','&nbsp;','phone',$langs->trans("PhonePro")); $outdone++;
585
+        }
586
+        if (! empty($this->phone_mobile)) {
587
+            $out.=dol_print_phone($this->phone_mobile,$this->country_code,$contactid,$thirdpartyid,'AC_TEL','&nbsp;','mobile',$langs->trans("PhoneMobile")); $outdone++;
588
+        }
589
+        if (! empty($this->phone_perso)) {
590
+            $out.=dol_print_phone($this->phone_perso,$this->country_code,$contactid,$thirdpartyid,'AC_TEL','&nbsp;','phone',$langs->trans("PhonePerso")); $outdone++;
591
+        }
592
+        if (! empty($this->office_phone)) {
593
+            $out.=dol_print_phone($this->office_phone,$this->country_code,$contactid,$thirdpartyid,'AC_TEL','&nbsp;','phone',$langs->trans("PhonePro")); $outdone++;
594
+        }
595
+        if (! empty($this->user_mobile)) {
596
+            $out.=dol_print_phone($this->user_mobile,$this->country_code,$contactid,$thirdpartyid,'AC_TEL','&nbsp;','mobile',$langs->trans("PhoneMobile")); $outdone++;
597
+        }
598
+        if (! empty($this->fax)) {
599
+            $out.=dol_print_phone($this->fax,$this->country_code,$contactid,$thirdpartyid,'AC_FAX','&nbsp;','fax',$langs->trans("Fax")); $outdone++;
600
+        }
601
+        if (! empty($this->office_fax)) {
602
+            $out.=dol_print_phone($this->office_fax,$this->country_code,$contactid,$thirdpartyid,'AC_FAX','&nbsp;','fax',$langs->trans("Fax")); $outdone++;
603
+        }
1551 604
 
1552
-			if (! $error)
1553
-			{
1554
-				if (property_exists($this, $field)) $this->$field = $value;
1555
-				$this->db->commit();
1556
-				return 1;
1557
-			}
1558
-			else
1559
-			{
1560
-				$this->db->rollback();
1561
-				return -2;
1562
-			}
1563
-		}
1564
-		else
1565
-		{
1566
-			$this->error=$this->db->lasterror();
1567
-			$this->db->rollback();
1568
-			return -1;
1569
-		}
1570
-	}
605
+        $out.='<div style="clear: both;"></div>';
606
+        $outdone=0;
607
+        if (! empty($this->email))
608
+        {
609
+            $out.=dol_print_email($this->email,$this->id,$object->id,'AC_EMAIL',0,0,1);
610
+            $outdone++;
611
+        }
612
+        if (! empty($this->url))
613
+        {
614
+            $out.=dol_print_url($this->url,'_goout',0,1);
615
+            $outdone++;
616
+        }
617
+        $out.='<div style="clear: both;">';
618
+        if (! empty($conf->socialnetworks->enabled))
619
+        {
620
+            if ($this->skype) $out.=dol_print_socialnetworks($this->skype,$this->id,$object->id,'skype');
621
+            $outdone++;
622
+            if ($this->jabberid) $out.=dol_print_socialnetworks($this->jabberid,$this->id,$object->id,'jabber');
623
+            $outdone++;
624
+            if ($this->twitter) $out.=dol_print_socialnetworks($this->twitter,$this->id,$object->id,'twitter');
625
+            $outdone++;
626
+            if ($this->facebook) $out.=dol_print_socialnetworks($this->facebook,$this->id,$object->id,'facebook');
627
+            $outdone++;
628
+        }
629
+        $out.='</div>';
1571 630
 
1572
-    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
1573
-	/**
1574
-	 *      Load properties id_previous and id_next by comparing $fieldid with $this->ref
1575
-	 *
1576
-	 *      @param	string	$filter		Optional filter. Example: " AND (t.field1 = 'aa' OR t.field2 = 'bb')"
1577
-	 *	 	@param  string	$fieldid   	Name of field to use for the select MAX and MIN
1578
-	 *		@param	int		$nodbprefix	Do not include DB prefix to forge table name
1579
-	 *      @return int         		<0 if KO, >0 if OK
1580
-	 */
1581
-	function load_previous_next_ref($filter, $fieldid, $nodbprefix=0)
1582
-	{
1583
-        // phpcs:enable
1584
-		global $conf, $user;
1585
-
1586
-		if (! $this->table_element)
1587
-		{
1588
-			dol_print_error('',get_class($this)."::load_previous_next_ref was called on objet with property table_element not defined");
1589
-			return -1;
1590
-		}
1591
-		if ($fieldid == 'none') return 1;
1592
-
1593
-		// Security on socid
1594
-		$socid = 0;
1595
-		if ($user->societe_id > 0) $socid = $user->societe_id;
1596
-
1597
-		// this->ismultientitymanaged contains
1598
-		// 0=No test on entity, 1=Test with field entity, 2=Test with link by societe
1599
-		$alias = 's';
1600
-		if ($this->element == 'societe') $alias = 'te';
1601
-
1602
-		$sql = "SELECT MAX(te.".$fieldid.")";
1603
-		$sql.= " FROM ".(empty($nodbprefix)?MAIN_DB_PREFIX:'').$this->table_element." as te";
1604
-		if ($this->element == 'user' && ! empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE)) {
1605
-			$sql.= ",".MAIN_DB_PREFIX."usergroup_user as ug";
1606
-		}
1607
-		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
1608
-		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
1609
-		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
1610
-		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";
1611
-		$sql.= " WHERE te.".$fieldid." < '".$this->db->escape($this->ref)."'";  // ->ref must always be defined (set to id if field does not exists)
1612
-		if ($this->restrictiononfksoc == 1 && !$user->rights->societe->client->voir && !$socid) $sql.= " AND sc.fk_user = " .$user->id;
1613
-		if ($this->restrictiononfksoc == 2 && !$user->rights->societe->client->voir && !$socid) $sql.= " AND (sc.fk_user = " .$user->id.' OR te.fk_soc IS NULL)';
1614
-		if (! empty($filter))
1615
-		{
1616
-			if (! preg_match('/^\s*AND/i', $filter)) $sql.=" AND ";   // For backward compatibility
1617
-			$sql.=$filter;
1618
-		}
1619
-		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
1620
-		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
1621
-		if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) {
1622
-			if ($this->element == 'user' && ! empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE)) {
1623
-				if (! empty($user->admin) && empty($user->entity) && $conf->entity == 1) {
1624
-					$sql.= " AND te.entity IS NOT NULL"; // Show all users
1625
-				} else {
1626
-					$sql.= " AND ug.fk_user = te.rowid";
1627
-					$sql.= " AND ug.entity IN (".getEntity($this->element).")";
1628
-				}
1629
-			} else {
1630
-				$sql.= ' AND te.entity IN ('.getEntity($this->element).')';
1631
-			}
1632
-		}
1633
-		if ($this->restrictiononfksoc == 1 && $socid && $this->element != 'societe') $sql.= ' AND te.fk_soc = ' . $socid;
1634
-		if ($this->restrictiononfksoc == 2 && $socid && $this->element != 'societe') $sql.= ' AND (te.fk_soc = ' . $socid.' OR te.fk_soc IS NULL)';
1635
-		if ($this->restrictiononfksoc && $socid && $this->element == 'societe') $sql.= ' AND te.rowid = ' . $socid;
1636
-		//print 'socid='.$socid.' restrictiononfksoc='.$this->restrictiononfksoc.' ismultientitymanaged = '.$this->ismultientitymanaged.' filter = '.$filter.' -> '.$sql."<br>";
1637
-
1638
-		$result = $this->db->query($sql);
1639
-		if (! $result)
1640
-		{
1641
-			$this->error=$this->db->lasterror();
1642
-			return -1;
1643
-		}
1644
-		$row = $this->db->fetch_row($result);
1645
-		$this->ref_previous = $row[0];
1646
-
1647
-
1648
-		$sql = "SELECT MIN(te.".$fieldid.")";
1649
-		$sql.= " FROM ".(empty($nodbprefix)?MAIN_DB_PREFIX:'').$this->table_element." as te";
1650
-		if ($this->element == 'user' && ! empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE)) {
1651
-			$sql.= ",".MAIN_DB_PREFIX."usergroup_user as ug";
1652
-		}
1653
-		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
1654
-		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
1655
-		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
1656
-		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";
1657
-		$sql.= " WHERE te.".$fieldid." > '".$this->db->escape($this->ref)."'";  // ->ref must always be defined (set to id if field does not exists)
1658
-		if ($this->restrictiononfksoc == 1 && !$user->rights->societe->client->voir && !$socid) $sql.= " AND sc.fk_user = " .$user->id;
1659
-		if ($this->restrictiononfksoc == 2 && !$user->rights->societe->client->voir && !$socid) $sql.= " AND (sc.fk_user = " .$user->id.' OR te.fk_soc IS NULL)';
1660
-		if (! empty($filter))
1661
-		{
1662
-			if (! preg_match('/^\s*AND/i', $filter)) $sql.=" AND ";   // For backward compatibility
1663
-			$sql.=$filter;
1664
-		}
1665
-		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
1666
-		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
1667
-		if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) {
1668
-			if ($this->element == 'user' && ! empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE)) {
1669
-				if (! empty($user->admin) && empty($user->entity) && $conf->entity == 1) {
1670
-					$sql.= " AND te.entity IS NOT NULL"; // Show all users
1671
-				} else {
1672
-					$sql.= " AND ug.fk_user = te.rowid";
1673
-					$sql.= " AND ug.entity IN (".getEntity($this->element).")";
1674
-				}
1675
-			} else {
1676
-				$sql.= ' AND te.entity IN ('.getEntity($this->element).')';
1677
-			}
1678
-		}
1679
-		if ($this->restrictiononfksoc == 1 && $socid && $this->element != 'societe') $sql.= ' AND te.fk_soc = ' . $socid;
1680
-		if ($this->restrictiononfksoc == 2 && $socid && $this->element != 'societe') $sql.= ' AND (te.fk_soc = ' . $socid.' OR te.fk_soc IS NULL)';
1681
-		if ($this->restrictiononfksoc && $socid && $this->element == 'societe') $sql.= ' AND te.rowid = ' . $socid;
1682
-		//print 'socid='.$socid.' restrictiononfksoc='.$this->restrictiononfksoc.' ismultientitymanaged = '.$this->ismultientitymanaged.' filter = '.$filter.' -> '.$sql."<br>";
1683
-		// 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
1684
-
1685
-		$result = $this->db->query($sql);
1686
-		if (! $result)
1687
-		{
1688
-			$this->error=$this->db->lasterror();
1689
-			return -2;
1690
-		}
1691
-		$row = $this->db->fetch_row($result);
1692
-		$this->ref_next = $row[0];
1693
-
1694
-		return 1;
1695
-	}
1696
-
1697
-
1698
-	/**
1699
-	 *      Return list of id of contacts of object
1700
-	 *
1701
-	 *      @param	string	$source     Source of contact: external (llx_socpeople) or internal (llx_user) or thirdparty (llx_societe)
1702
-	 *      @return array				Array of id of contacts (if source=external or internal)
1703
-	 * 									Array of id of third parties with at least one contact on object (if source=thirdparty)
1704
-	 */
1705
-	function getListContactId($source='external')
1706
-	{
1707
-		$contactAlreadySelected = array();
1708
-		$tab = $this->liste_contact(-1,$source);
1709
-		$num=count($tab);
1710
-		$i = 0;
1711
-		while ($i < $num)
1712
-		{
1713
-			if ($source == 'thirdparty') $contactAlreadySelected[$i] = $tab[$i]['socid'];
1714
-			else  $contactAlreadySelected[$i] = $tab[$i]['id'];
1715
-			$i++;
1716
-		}
1717
-		return $contactAlreadySelected;
1718
-	}
1719
-
1720
-
1721
-	/**
1722
-	 *	Link element with a project
1723
-	 *
1724
-	 *	@param     	int		$projectid		Project id to link element to
1725
-	 *	@return		int						<0 if KO, >0 if OK
1726
-	 */
1727
-	function setProject($projectid)
1728
-	{
1729
-		if (! $this->table_element)
1730
-		{
1731
-			dol_syslog(get_class($this)."::setProject was called on objet with property table_element not defined",LOG_ERR);
1732
-			return -1;
1733
-		}
1734
-
1735
-		$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
1736
-		if ($this->table_element == 'actioncomm')
1737
-		{
1738
-			if ($projectid) $sql.= ' SET fk_project = '.$projectid;
1739
-			else $sql.= ' SET fk_project = NULL';
1740
-			$sql.= ' WHERE id = '.$this->id;
1741
-		}
1742
-		else
1743
-		{
1744
-			if ($projectid) $sql.= ' SET fk_projet = '.$projectid;
1745
-			else $sql.= ' SET fk_projet = NULL';
1746
-			$sql.= ' WHERE rowid = '.$this->id;
1747
-		}
1748
-
1749
-		dol_syslog(get_class($this)."::setProject", LOG_DEBUG);
1750
-		if ($this->db->query($sql))
1751
-		{
1752
-			$this->fk_project = $projectid;
1753
-			return 1;
1754
-		}
1755
-		else
1756
-		{
1757
-			dol_print_error($this->db);
1758
-			return -1;
1759
-		}
1760
-	}
1761
-
1762
-	/**
1763
-	 *  Change the payments methods
1764
-	 *
1765
-	 *  @param		int		$id		Id of new payment method
1766
-	 *  @return		int				>0 if OK, <0 if KO
1767
-	 */
1768
-	function setPaymentMethods($id)
1769
-	{
1770
-		dol_syslog(get_class($this).'::setPaymentMethods('.$id.')');
1771
-		if ($this->statut >= 0 || $this->element == 'societe')
1772
-		{
1773
-			// TODO uniformize field name
1774
-			$fieldname = 'fk_mode_reglement';
1775
-			if ($this->element == 'societe') $fieldname = 'mode_reglement';
1776
-			if (get_class($this) == 'Fournisseur') $fieldname = 'mode_reglement_supplier';
1777
-
1778
-			$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
1779
-			$sql .= ' SET '.$fieldname.' = '.$id;
1780
-			$sql .= ' WHERE rowid='.$this->id;
1781
-
1782
-			if ($this->db->query($sql))
1783
-			{
1784
-				$this->mode_reglement_id = $id;
1785
-				// for supplier
1786
-				if (get_class($this) == 'Fournisseur') $this->mode_reglement_supplier_id = $id;
1787
-				return 1;
1788
-			}
1789
-			else
1790
-			{
1791
-				dol_syslog(get_class($this).'::setPaymentMethods Erreur '.$sql.' - '.$this->db->error());
1792
-				$this->error=$this->db->error();
1793
-				return -1;
1794
-			}
1795
-		}
1796
-		else
1797
-		{
1798
-			dol_syslog(get_class($this).'::setPaymentMethods, status of the object is incompatible');
1799
-			$this->error='Status of the object is incompatible '.$this->statut;
1800
-			return -2;
1801
-		}
1802
-	}
1803
-
1804
-	/**
1805
-	 *  Change the multicurrency code
1806
-	 *
1807
-	 *  @param		string	$code	multicurrency code
1808
-	 *  @return		int				>0 if OK, <0 if KO
1809
-	 */
1810
-	function setMulticurrencyCode($code)
1811
-	{
1812
-		dol_syslog(get_class($this).'::setMulticurrencyCode('.$id.')');
1813
-		if ($this->statut >= 0 || $this->element == 'societe')
1814
-		{
1815
-			$fieldname = 'multicurrency_code';
1816
-
1817
-			$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
1818
-			$sql .= ' SET '.$fieldname." = '".$this->db->escape($code)."'";
1819
-			$sql .= ' WHERE rowid='.$this->id;
1820
-
1821
-			if ($this->db->query($sql))
1822
-			{
1823
-				$this->multicurrency_code = $code;
631
+        $out.='<!-- END Part to show address block -->';
1824 632
 
1825
-				list($fk_multicurrency, $rate) = MultiCurrency::getIdAndTxFromCode($this->db, $code);
1826
-				if ($rate) $this->setMulticurrencyRate($rate,2);
633
+        return $out;
634
+    }
1827 635
 
1828
-				return 1;
1829
-			}
1830
-			else
1831
-			{
1832
-				dol_syslog(get_class($this).'::setMulticurrencyCode Erreur '.$sql.' - '.$this->db->error());
1833
-				$this->error=$this->db->error();
1834
-				return -1;
1835
-			}
1836
-		}
1837
-		else
1838
-		{
1839
-			dol_syslog(get_class($this).'::setMulticurrencyCode, status of the object is incompatible');
1840
-			$this->error='Status of the object is incompatible '.$this->statut;
1841
-			return -2;
1842
-		}
1843
-	}
1844
-
1845
-	/**
1846
-	 *  Change the multicurrency rate
1847
-	 *
1848
-	 *  @param		double	$rate	multicurrency rate
1849
-	 *  @param		int		$mode	mode 1 : amounts in company currency will be recalculated, mode 2 : amounts in foreign currency
1850
-	 *  @return		int				>0 if OK, <0 if KO
1851
-	 */
1852
-	function setMulticurrencyRate($rate, $mode=1)
1853
-	{
1854
-		dol_syslog(get_class($this).'::setMulticurrencyRate('.$id.')');
1855
-		if ($this->statut >= 0 || $this->element == 'societe')
1856
-		{
1857
-			$fieldname = 'multicurrency_tx';
1858
-
1859
-			$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
1860
-			$sql .= ' SET '.$fieldname.' = '.$rate;
1861
-			$sql .= ' WHERE rowid='.$this->id;
1862
-
1863
-			if ($this->db->query($sql))
1864
-			{
1865
-				$this->multicurrency_tx = $rate;
1866
-
1867
-				// Update line price
1868
-				if (!empty($this->lines))
1869
-				{
1870
-					foreach ($this->lines as &$line)
1871
-					{
1872
-						if($mode == 1) {
1873
-							$line->subprice = 0;
1874
-						}
1875
-
1876
-						switch ($this->element) {
1877
-							case 'propal':
1878
-								$this->updateline(
1879
-									$line->id, $line->subprice, $line->qty, $line->remise_percent, $line->tva_tx, $line->localtax1_tx, $line->localtax2_tx,
1880
-									($line->description?$line->description:$line->desc), 'HT', $line->info_bits, $line->special_code, $line->fk_parent_line,
1881
-									$line->skip_update_total, $line->fk_fournprice, $line->pa_ht, $line->label, $line->product_type, $line->date_start,
1882
-									$line->date_end, $line->array_options, $line->fk_unit, $line->multicurrency_subprice
1883
-								);
1884
-								break;
1885
-							case 'commande':
1886
-								$this->updateline(
1887
-									$line->id, ($line->description?$line->description:$line->desc), $line->subprice, $line->qty, $line->remise_percent,
1888
-									$line->tva_tx, $line->localtax1_tx, $line->localtax2_tx, 'HT', $line->info_bits, $line->date_start, $line->date_end,
1889
-									$line->product_type, $line->fk_parent_line, $line->skip_update_total, $line->fk_fournprice, $line->pa_ht, $line->label,
1890
-									$line->special_code, $line->array_options, $line->fk_unit, $line->multicurrency_subprice
1891
-								);
1892
-								break;
1893
-							case 'facture':
1894
-								$this->updateline(
1895
-									$line->id, ($line->description?$line->description:$line->desc), $line->subprice, $line->qty, $line->remise_percent,
1896
-									$line->date_start, $line->date_end, $line->tva_tx, $line->localtax1_tx, $line->localtax2_tx, 'HT', $line->info_bits,
1897
-									$line->product_type, $line->fk_parent_line, $line->skip_update_total, $line->fk_fournprice, $line->pa_ht, $line->label,
1898
-									$line->special_code, $line->array_options, $line->situation_percent, $line->fk_unit, $line->multicurrency_subprice
1899
-								);
1900
-								break;
1901
-							case 'supplier_proposal':
1902
-								$this->updateline(
1903
-									$line->id, $line->subprice, $line->qty, $line->remise_percent, $line->tva_tx, $line->localtax1_tx, $line->localtax2_tx,
1904
-									($line->description?$line->description:$line->desc), 'HT', $line->info_bits, $line->special_code, $line->fk_parent_line,
1905
-									$line->skip_update_total, $line->fk_fournprice, $line->pa_ht, $line->label, $line->product_type, $line->array_options,
1906
-									$line->ref_fourn, $line->multicurrency_subprice
1907
-								);
1908
-								break;
1909
-							case 'order_supplier':
1910
-								$this->updateline(
1911
-									$line->id, ($line->description?$line->description:$line->desc), $line->subprice, $line->qty, $line->remise_percent,
1912
-									$line->tva_tx, $line->localtax1_tx, $line->localtax2_tx, 'HT', $line->info_bits, $line->product_type, false,
1913
-									$line->date_start, $line->date_end, $line->array_options, $line->fk_unit, $line->multicurrency_subprice
1914
-								);
1915
-								break;
1916
-							case 'invoice_supplier':
1917
-								$this->updateline(
1918
-									$line->id, ($line->description?$line->description:$line->desc), $line->subprice, $line->tva_tx, $line->localtax1_tx,
1919
-									$line->localtax2_tx, $line->qty, 0, 'HT', $line->info_bits, $line->product_type, $line->remise_percent, false,
1920
-									$line->date_start, $line->date_end, $line->array_options, $line->fk_unit, $line->multicurrency_subprice
1921
-								);
1922
-								break;
1923
-							default:
1924
-								dol_syslog(get_class($this).'::setMulticurrencyRate no updateline defined', LOG_DEBUG);
1925
-								break;
1926
-						}
1927
-					}
1928
-				}
636
+    /**
637
+     * Return the link of last main doc file for direct public download.
638
+     *
639
+     * @param	string	$modulepart			Module related to document
640
+     * @param	int		$initsharekey		Init the share key if it was not yet defined
641
+     * @param	int		$relativelink		0=Return full external link, 1=Return link relative to root of file
642
+     * @return	string						Link or empty string if there is no download link
643
+     */
644
+    function getLastMainDocLink($modulepart, $initsharekey=0, $relativelink=0)
645
+    {
646
+        global $user, $dolibarr_main_url_root;
1929 647
 
1930
-				return 1;
1931
-			}
1932
-			else
1933
-			{
1934
-				dol_syslog(get_class($this).'::setMulticurrencyRate Erreur '.$sql.' - '.$this->db->error());
1935
-				$this->error=$this->db->error();
1936
-				return -1;
1937
-			}
1938
-		}
1939
-		else
1940
-		{
1941
-			dol_syslog(get_class($this).'::setMulticurrencyRate, status of the object is incompatible');
1942
-			$this->error='Status of the object is incompatible '.$this->statut;
1943
-			return -2;
1944
-		}
1945
-	}
1946
-
1947
-	/**
1948
-	 *  Change the payments terms
1949
-	 *
1950
-	 *  @param		int		$id		Id of new payment terms
1951
-	 *  @return		int				>0 if OK, <0 if KO
1952
-	 */
1953
-	function setPaymentTerms($id)
1954
-	{
1955
-		dol_syslog(get_class($this).'::setPaymentTerms('.$id.')');
1956
-		if ($this->statut >= 0 || $this->element == 'societe')
1957
-		{
1958
-			// TODO uniformize field name
1959
-			$fieldname = 'fk_cond_reglement';
1960
-			if ($this->element == 'societe') $fieldname = 'cond_reglement';
1961
-			if (get_class($this) == 'Fournisseur') $fieldname = 'cond_reglement_supplier';
1962
-
1963
-			$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
1964
-			$sql .= ' SET '.$fieldname.' = '.$id;
1965
-			$sql .= ' WHERE rowid='.$this->id;
1966
-
1967
-			if ($this->db->query($sql))
1968
-			{
1969
-				$this->cond_reglement_id = $id;
1970
-				// for supplier
1971
-				if (get_class($this) == 'Fournisseur') $this->cond_reglement_supplier_id = $id;
1972
-				$this->cond_reglement = $id;	// for compatibility
1973
-				return 1;
1974
-			}
1975
-			else
1976
-			{
1977
-				dol_syslog(get_class($this).'::setPaymentTerms Erreur '.$sql.' - '.$this->db->error());
1978
-				$this->error=$this->db->error();
1979
-				return -1;
1980
-			}
1981
-		}
1982
-		else
1983
-		{
1984
-			dol_syslog(get_class($this).'::setPaymentTerms, status of the object is incompatible');
1985
-			$this->error='Status of the object is incompatible '.$this->statut;
1986
-			return -2;
1987
-		}
1988
-	}
1989
-
1990
-	/**
1991
-	 *	Define delivery address
1992
-	 *  @deprecated
1993
-	 *
1994
-	 *	@param      int		$id		Address id
1995
-	 *	@return     int				<0 si ko, >0 si ok
1996
-	 */
1997
-	function setDeliveryAddress($id)
1998
-	{
1999
-		$fieldname = 'fk_delivery_address';
2000
-		if ($this->element == 'delivery' || $this->element == 'shipping') $fieldname = 'fk_address';
2001
-
2002
-		$sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element." SET ".$fieldname." = ".$id;
2003
-		$sql.= " WHERE rowid = ".$this->id." AND fk_statut = 0";
2004
-
2005
-		if ($this->db->query($sql))
2006
-		{
2007
-			$this->fk_delivery_address = $id;
2008
-			return 1;
2009
-		}
2010
-		else
2011
-		{
2012
-			$this->error=$this->db->error();
2013
-			dol_syslog(get_class($this).'::setDeliveryAddress Erreur '.$sql.' - '.$this->error);
2014
-			return -1;
2015
-		}
2016
-	}
2017
-
2018
-
2019
-	/**
2020
-	 *  Change the shipping method
2021
-	 *
2022
-	 *  @param      int     $shipping_method_id     Id of shipping method
2023
-     *  @param      bool    $notrigger              false=launch triggers after, true=disable triggers
2024
-     *  @param      User	$userused               Object user
2025
-	 *
2026
-	 *  @return     int              1 if OK, 0 if KO
2027
-	 */
2028
-	function setShippingMethod($shipping_method_id, $notrigger=false, $userused=null)
2029
-	{
2030
-        global $user;
648
+        if (empty($this->last_main_doc))
649
+        {
650
+            return '';		// No way to known which document name to use
651
+        }
2031 652
 
2032
-        if (empty($userused)) $userused=$user;
653
+        include_once DOL_DOCUMENT_ROOT.'/ecm/class/ecmfiles.class.php';
654
+        $ecmfile=new EcmFiles($this->db);
655
+        $result = $ecmfile->fetch(0, '', $this->last_main_doc);
656
+        if ($result < 0)
657
+        {
658
+            $this->error = $ecmfile->error;
659
+            $this->errors = $ecmfile->errors;
660
+            return -1;
661
+        }
2033 662
 
2034
-        $error = 0;
663
+        if (empty($ecmfile->id))
664
+        {
665
+            // Add entry into index
666
+            if ($initsharekey)
667
+            {
668
+                require_once DOL_DOCUMENT_ROOT.'/core/lib/security2.lib.php';
669
+                // TODO We can't, we dont' have full path of file, only last_main_doc adn ->element, so we must rebuild full path first
670
+                /*
671
+				$ecmfile->filepath = $rel_dir;
672
+				$ecmfile->filename = $filename;
673
+				$ecmfile->label = md5_file(dol_osencode($destfull));	// hash of file content
674
+				$ecmfile->fullpath_orig = '';
675
+				$ecmfile->gen_or_uploaded = 'generated';
676
+				$ecmfile->description = '';    // indexed content
677
+				$ecmfile->keyword = '';        // keyword content
678
+				$ecmfile->share = getRandomPassword(true);
679
+				$result = $ecmfile->create($user);
680
+				if ($result < 0)
681
+				{
682
+					$this->error = $ecmfile->error;
683
+					$this->errors = $ecmfile->errors;
684
+				}
685
+				*/
686
+            }
687
+            else return '';
688
+        }
689
+        elseif (empty($ecmfile->share))
690
+        {
691
+            // Add entry into index
692
+            if ($initsharekey)
693
+            {
694
+                require_once DOL_DOCUMENT_ROOT.'/core/lib/security2.lib.php';
695
+                $ecmfile->share = getRandomPassword(true);
696
+                $ecmfile->update($user);
697
+            }
698
+            else return '';
699
+        }
2035 700
 
2036
-		if (! $this->table_element) {
2037
-			dol_syslog(get_class($this)."::setShippingMethod was called on objet with property table_element not defined",LOG_ERR);
2038
-			return -1;
2039
-		}
701
+        // Define $urlwithroot
702
+        $urlwithouturlroot=preg_replace('/'.preg_quote(DOL_URL_ROOT,'/').'$/i','',trim($dolibarr_main_url_root));
703
+        $urlwithroot=$urlwithouturlroot.DOL_URL_ROOT;		// This is to use external domain name found into config file
704
+        //$urlwithroot=DOL_MAIN_URL_ROOT;					// This is to use same domain name than current
2040 705
 
2041
-        $this->db->begin();
706
+        $forcedownload=0;
2042 707
 
2043
-		if ($shipping_method_id<0) $shipping_method_id='NULL';
2044
-		dol_syslog(get_class($this).'::setShippingMethod('.$shipping_method_id.')');
708
+        $paramlink='';
709
+        //if (! empty($modulepart)) $paramlink.=($paramlink?'&':'').'modulepart='.$modulepart;		// For sharing with hash (so public files), modulepart is not required.
710
+        //if (! empty($ecmfile->entity)) $paramlink.='&entity='.$ecmfile->entity; 					// For sharing with hash (so public files), entity is not required.
711
+        //$paramlink.=($paramlink?'&':'').'file='.urlencode($filepath);								// No need of name of file for public link, we will use the hash
712
+        if (! empty($ecmfile->share)) $paramlink.=($paramlink?'&':'').'hashp='.$ecmfile->share;			// Hash for public share
713
+        if ($forcedownload) $paramlink.=($paramlink?'&':'').'attachment=1';
2045 714
 
2046
-		$sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
2047
-		$sql.= " SET fk_shipping_method = ".$shipping_method_id;
2048
-		$sql.= " WHERE rowid=".$this->id;
2049
-        $resql = $this->db->query($sql);
2050
-		if (! $resql) {
2051
-			dol_syslog(get_class($this).'::setShippingMethod Error ', LOG_DEBUG);
2052
-			$this->error = $this->db->lasterror();
2053
-			$error++;
2054
-        } else {
2055
-            if (!$notrigger)
2056
-            {
2057
-                // Call trigger
2058
-                $this->context=array('shippingmethodupdate'=>1);
2059
-                $result = $this->call_trigger(strtoupper(get_class($this)) . '_MODIFY', $userused);
2060
-                if ($result < 0) $error++;
2061
-                // End call trigger
2062
-            }
715
+        if ($relativelink)
716
+        {
717
+            $linktoreturn='document.php'.($paramlink?'?'.$paramlink:'');
2063 718
         }
2064
-        if ($error)
719
+        else
2065 720
         {
2066
-            $this->db->rollback();
2067
-            return -1;
2068
-        } else {
2069
-            $this->shipping_method_id = ($shipping_method_id=='NULL')?null:$shipping_method_id;
2070
-            $this->db->commit();
2071
-            return 1;
721
+            $linktoreturn=$urlwithroot.'/document.php'.($paramlink?'?'.$paramlink:'');
2072 722
         }
2073
-	}
2074
-
2075
-
2076
-	/**
2077
-	 *  Change the warehouse
2078
-	 *
2079
-	 *  @param      int     $warehouse_id     Id of warehouse
2080
-	 *  @return     int              1 if OK, 0 if KO
2081
-	 */
2082
-	function setWarehouse($warehouse_id)
2083
-	{
2084
-		if (! $this->table_element) {
2085
-			dol_syslog(get_class($this)."::setWarehouse was called on objet with property table_element not defined",LOG_ERR);
2086
-			return -1;
2087
-		}
2088
-		if ($warehouse_id<0) $warehouse_id='NULL';
2089
-		dol_syslog(get_class($this).'::setWarehouse('.$warehouse_id.')');
2090
-
2091
-		$sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
2092
-		$sql.= " SET fk_warehouse = ".$warehouse_id;
2093
-		$sql.= " WHERE rowid=".$this->id;
2094
-
2095
-		if ($this->db->query($sql)) {
2096
-			$this->warehouse_id = ($warehouse_id=='NULL')?null:$warehouse_id;
2097
-			return 1;
2098
-		} else {
2099
-			dol_syslog(get_class($this).'::setWarehouse Error ', LOG_DEBUG);
2100
-			$this->error=$this->db->error();
2101
-			return 0;
2102
-		}
2103
-	}
2104
-
2105
-
2106
-	/**
2107
-	 *		Set last model used by doc generator
2108
-	 *
2109
-	 *		@param		User	$user		User object that make change
2110
-	 *		@param		string	$modelpdf	Modele name
2111
-	 *		@return		int					<0 if KO, >0 if OK
2112
-	 */
2113
-	function setDocModel($user, $modelpdf)
2114
-	{
2115
-		if (! $this->table_element)
2116
-		{
2117
-			dol_syslog(get_class($this)."::setDocModel was called on objet with property table_element not defined",LOG_ERR);
2118
-			return -1;
2119
-		}
2120
-
2121
-		$newmodelpdf=dol_trunc($modelpdf,255);
2122
-
2123
-		$sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
2124
-		$sql.= " SET model_pdf = '".$this->db->escape($newmodelpdf)."'";
2125
-		$sql.= " WHERE rowid = ".$this->id;
2126
-		// if ($this->element == 'facture') $sql.= " AND fk_statut < 2";
2127
-		// if ($this->element == 'propal')  $sql.= " AND fk_statut = 0";
2128
-
2129
-		dol_syslog(get_class($this)."::setDocModel", LOG_DEBUG);
2130
-		$resql=$this->db->query($sql);
2131
-		if ($resql)
2132
-		{
2133
-			$this->modelpdf=$modelpdf;
2134
-			return 1;
2135
-		}
2136
-		else
2137
-		{
2138
-			dol_print_error($this->db);
2139
-			return 0;
2140
-		}
2141
-	}
2142
-
2143
-
2144
-	/**
2145
-	 *  Change the bank account
2146
-	 *
2147
-	 *  @param		int		$fk_account		Id of bank account
2148
-	 *  @param      bool    $notrigger      false=launch triggers after, true=disable triggers
2149
-	 *  @param      User	$userused		Object user
2150
-	 *  @return		int				1 if OK, 0 if KO
2151
-	 */
2152
-	function setBankAccount($fk_account, $notrigger=false, $userused=null)
2153
-	{
2154
-        global $user;
2155 723
 
2156
-        if (empty($userused)) $userused=$user;
724
+        // Here $ecmfile->share is defined
725
+        return $linktoreturn;
726
+    }
2157 727
 
2158
-        $error = 0;
2159 728
 
2160
-		if (! $this->table_element) {
2161
-			dol_syslog(get_class($this)."::setBankAccount was called on objet with property table_element not defined",LOG_ERR);
2162
-			return -1;
2163
-		}
2164
-        $this->db->begin();
729
+    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
730
+    /**
731
+     *  Add a link between element $this->element and a contact
732
+     *
733
+     *  @param	int		$fk_socpeople       Id of thirdparty contact (if source = 'external') or id of user (if souce = 'internal') to link
734
+     *  @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
735
+     *  @param  string	$source             external=Contact extern (llx_socpeople), internal=Contact intern (llx_user)
736
+     *  @param  int		$notrigger			Disable all triggers
737
+     *  @return int                 		<0 if KO, >0 if OK
738
+     */
739
+    function add_contact($fk_socpeople, $type_contact, $source='external',$notrigger=0)
740
+    {
741
+        // phpcs:enable
742
+        global $user,$langs;
2165 743
 
2166
-		if ($fk_account<0) $fk_account='NULL';
2167
-		dol_syslog(get_class($this).'::setBankAccount('.$fk_account.')');
2168 744
 
2169
-		$sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
2170
-		$sql.= " SET fk_account = ".$fk_account;
2171
-		$sql.= " WHERE rowid=".$this->id;
745
+        dol_syslog(get_class($this)."::add_contact $fk_socpeople, $type_contact, $source, $notrigger");
2172 746
 
2173
-        $resql = $this->db->query($sql);
2174
-        if (! $resql)
747
+        // Check parameters
748
+        if ($fk_socpeople <= 0)
2175 749
         {
2176
-            dol_syslog(get_class($this).'::setBankAccount Error '.$sql.' - '.$this->db->error());
2177
-            $this->error = $this->db->lasterror();
2178
-            $error++;
750
+            $langs->load("errors");
751
+            $this->error=$langs->trans("ErrorWrongValueForParameterX","1");
752
+            dol_syslog(get_class($this)."::add_contact ".$this->error,LOG_ERR);
753
+            return -1;
2179 754
         }
2180
-        else
755
+        if (! $type_contact)
2181 756
         {
2182
-            if (!$notrigger)
2183
-            {
2184
-                // Call trigger
2185
-                $this->context=array('bankaccountupdate'=>1);
2186
-                $result = $this->call_trigger(strtoupper(get_class($this)) . '_MODIFY', $userused);
2187
-                if ($result < 0) $error++;
2188
-                // End call trigger
2189
-            }
757
+            $langs->load("errors");
758
+            $this->error=$langs->trans("ErrorWrongValueForParameterX","2");
759
+            dol_syslog(get_class($this)."::add_contact ".$this->error,LOG_ERR);
760
+            return -2;
2190 761
         }
2191
-        if ($error)
762
+
763
+        $id_type_contact=0;
764
+        if (is_numeric($type_contact))
2192 765
         {
2193
-            $this->db->rollback();
2194
-            return -1;
766
+            $id_type_contact=$type_contact;
2195 767
         }
2196 768
         else
2197 769
         {
2198
-            $this->fk_account = ($fk_account=='NULL')?null:$fk_account;
2199
-            $this->db->commit();
2200
-            return 1;
770
+            // We look for id type_contact
771
+            $sql = "SELECT tc.rowid";
772
+            $sql.= " FROM ".MAIN_DB_PREFIX."c_type_contact as tc";
773
+            $sql.= " WHERE tc.element='".$this->db->escape($this->element)."'";
774
+            $sql.= " AND tc.source='".$this->db->escape($source)."'";
775
+            $sql.= " AND tc.code='".$this->db->escape($type_contact)."' AND tc.active=1";
776
+            //print $sql;
777
+            $resql=$this->db->query($sql);
778
+            if ($resql)
779
+            {
780
+                $obj = $this->db->fetch_object($resql);
781
+                if ($obj) $id_type_contact=$obj->rowid;
782
+            }
2201 783
         }
2202
-    }
2203
-
2204 784
 
2205
-	// TODO: Move line related operations to CommonObjectLine?
2206
-
2207
-    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
2208
-	/**
2209
-	 *  Save a new position (field rang) for details lines.
2210
-	 *  You can choose to set position for lines with already a position or lines without any position defined.
2211
-	 *
2212
-	 * 	@param		boolean		$renum			   True to renum all already ordered lines, false to renum only not already ordered lines.
2213
-	 * 	@param		string		$rowidorder		   ASC or DESC
2214
-	 * 	@param		boolean		$fk_parent_line    Table with fk_parent_line field or not
2215
-	 * 	@return		int                            <0 if KO, >0 if OK
2216
-	 */
2217
-	function line_order($renum=false, $rowidorder='ASC', $fk_parent_line=true)
2218
-	{
2219
-        // phpcs:enable
2220
-		if (! $this->table_element_line)
2221
-		{
2222
-			dol_syslog(get_class($this)."::line_order was called on objet with property table_element_line not defined",LOG_ERR);
2223
-			return -1;
2224
-		}
2225
-		if (! $this->fk_element)
2226
-		{
2227
-			dol_syslog(get_class($this)."::line_order was called on objet with property fk_element not defined",LOG_ERR);
2228
-			return -1;
2229
-		}
2230
-
2231
-		// Count number of lines to reorder (according to choice $renum)
2232
-		$nl=0;
2233
-		$sql = 'SELECT count(rowid) FROM '.MAIN_DB_PREFIX.$this->table_element_line;
2234
-		$sql.= ' WHERE '.$this->fk_element.'='.$this->id;
2235
-		if (! $renum) $sql.= ' AND rang = 0';
2236
-		if ($renum) $sql.= ' AND rang <> 0';
2237
-
2238
-		dol_syslog(get_class($this)."::line_order", LOG_DEBUG);
2239
-		$resql = $this->db->query($sql);
2240
-		if ($resql)
2241
-		{
2242
-			$row = $this->db->fetch_row($resql);
2243
-			$nl = $row[0];
2244
-		}
2245
-		else dol_print_error($this->db);
2246
-		if ($nl > 0)
2247
-		{
2248
-			// The goal of this part is to reorder all lines, with all children lines sharing the same
2249
-			// counter that parents.
2250
-			$rows=array();
2251
-
2252
-			// We first search all lines that are parent lines (for multilevel details lines)
2253
-			$sql = 'SELECT rowid FROM '.MAIN_DB_PREFIX.$this->table_element_line;
2254
-			$sql.= ' WHERE '.$this->fk_element.' = '.$this->id;
2255
-			if ($fk_parent_line) $sql.= ' AND fk_parent_line IS NULL';
2256
-			$sql.= ' ORDER BY rang ASC, rowid '.$rowidorder;
2257
-
2258
-			dol_syslog(get_class($this)."::line_order search all parent lines", LOG_DEBUG);
2259
-			$resql = $this->db->query($sql);
2260
-			if ($resql)
2261
-			{
2262
-				$i=0;
2263
-				$num = $this->db->num_rows($resql);
2264
-				while ($i < $num)
2265
-				{
2266
-					$row = $this->db->fetch_row($resql);
2267
-					$rows[] = $row[0];	// Add parent line into array rows
2268
-					$childrens = $this->getChildrenOfLine($row[0]);
2269
-					if (! empty($childrens))
2270
-					{
2271
-						foreach($childrens as $child)
2272
-						{
2273
-							array_push($rows, $child);
2274
-						}
2275
-					}
2276
-					$i++;
2277
-				}
785
+        if ($id_type_contact == 0)
786
+        {
787
+            $this->error='CODE_NOT_VALID_FOR_THIS_ELEMENT';
788
+            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");
789
+            return -3;
790
+        }
2278 791
 
2279
-				// Now we set a new number for each lines (parent and children with children included into parent tree)
2280
-				if (! empty($rows))
2281
-				{
2282
-					foreach($rows as $key => $row)
2283
-					{
2284
-						$this->updateRangOfLine($row, ($key+1));
2285
-					}
2286
-				}
2287
-			}
2288
-			else
2289
-			{
2290
-				dol_print_error($this->db);
2291
-			}
2292
-		}
2293
-		return 1;
2294
-	}
2295
-
2296
-	/**
2297
-	 * 	Get children of line
2298
-	 *
2299
-	 * 	@param	int		$id		Id of parent line
2300
-	 * 	@return	array			Array with list of children lines id
2301
-	 */
2302
-	function getChildrenOfLine($id)
2303
-	{
2304
-		$rows=array();
2305
-
2306
-		$sql = 'SELECT rowid FROM '.MAIN_DB_PREFIX.$this->table_element_line;
2307
-		$sql.= ' WHERE '.$this->fk_element.' = '.$this->id;
2308
-		$sql.= ' AND fk_parent_line = '.$id;
2309
-		$sql.= ' ORDER BY rang ASC';
2310
-
2311
-		dol_syslog(get_class($this)."::getChildrenOfLine search children lines for line ".$id."", LOG_DEBUG);
2312
-		$resql = $this->db->query($sql);
2313
-		if ($resql)
2314
-		{
2315
-			$i=0;
2316
-			$num = $this->db->num_rows($resql);
2317
-			while ($i < $num)
2318
-			{
2319
-				$row = $this->db->fetch_row($resql);
2320
-				$rows[$i] = $row[0];
2321
-				$i++;
2322
-			}
2323
-		}
792
+        $datecreate = dol_now();
793
+
794
+        // Socpeople must have already been added by some trigger, then we have to check it to avoid DB_ERROR_RECORD_ALREADY_EXISTS error
795
+        $TListeContacts=$this->liste_contact(-1, $source);
796
+        $already_added=false;
797
+        if(!empty($TListeContacts)) {
798
+            foreach($TListeContacts as $array_contact) {
799
+                if($array_contact['status'] == 4 && $array_contact['id'] == $fk_socpeople && $array_contact['fk_c_type_contact'] == $id_type_contact) {
800
+                    $already_added=true;
801
+                    break;
802
+                }
803
+            }
804
+        }
2324 805
 
2325
-		return $rows;
2326
-	}
806
+        if(!$already_added) {
2327 807
 
2328
-    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
2329
-	/**
2330
-	 * 	Update a line to have a lower rank
2331
-	 *
2332
-	 * 	@param 	int			$rowid				Id of line
2333
-	 * 	@param	boolean		$fk_parent_line		Table with fk_parent_line field or not
2334
-	 * 	@return	void
2335
-	 */
2336
-	function line_up($rowid, $fk_parent_line=true)
2337
-	{
2338
-        // phpcs:enable
2339
-		$this->line_order(false, 'ASC', $fk_parent_line);
808
+            $this->db->begin();
2340 809
 
2341
-		// Get rang of line
2342
-		$rang = $this->getRangOfLine($rowid);
810
+            // Insert into database
811
+            $sql = "INSERT INTO ".MAIN_DB_PREFIX."element_contact";
812
+            $sql.= " (element_id, fk_socpeople, datecreate, statut, fk_c_type_contact) ";
813
+            $sql.= " VALUES (".$this->id.", ".$fk_socpeople." , " ;
814
+            $sql.= "'".$this->db->idate($datecreate)."'";
815
+            $sql.= ", 4, ". $id_type_contact;
816
+            $sql.= ")";
2343 817
 
2344
-		// Update position of line
2345
-		$this->updateLineUp($rowid, $rang);
2346
-	}
818
+            $resql=$this->db->query($sql);
819
+            if ($resql)
820
+            {
821
+                if (! $notrigger)
822
+                {
823
+                    $result=$this->call_trigger(strtoupper($this->element).'_ADD_CONTACT', $user);
824
+                    if ($result < 0)
825
+                    {
826
+                        $this->db->rollback();
827
+                        return -1;
828
+                    }
829
+                }
830
+
831
+                $this->db->commit();
832
+                return 1;
833
+            }
834
+            else
835
+            {
836
+                if ($this->db->errno() == 'DB_ERROR_RECORD_ALREADY_EXISTS')
837
+                {
838
+                    $this->error=$this->db->errno();
839
+                    $this->db->rollback();
840
+                    echo 'err rollback';
841
+                    return -2;
842
+                }
843
+                else
844
+                {
845
+                    $this->error=$this->db->error();
846
+                    $this->db->rollback();
847
+                    return -1;
848
+                }
849
+            }
850
+        } else return 0;
851
+    }
2347 852
 
2348 853
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
2349
-	/**
2350
-	 * 	Update a line to have a higher rank
2351
-	 *
2352
-	 * 	@param	int			$rowid				Id of line
2353
-	 * 	@param	boolean		$fk_parent_line		Table with fk_parent_line field or not
2354
-	 * 	@return	void
2355
-	 */
2356
-	function line_down($rowid, $fk_parent_line=true)
2357
-	{
854
+    /**
855
+     *    Copy contact from one element to current
856
+     *
857
+     *    @param    CommonObject    $objFrom    Source element
858
+     *    @param    string          $source     Nature of contact ('internal' or 'external')
859
+     *    @return   int                         >0 if OK, <0 if KO
860
+     */
861
+    function copy_linked_contact($objFrom, $source='internal')
862
+    {
2358 863
         // phpcs:enable
2359
-		$this->line_order(false, 'ASC', $fk_parent_line);
2360
-
2361
-		// Get rang of line
2362
-		$rang = $this->getRangOfLine($rowid);
2363
-
2364
-		// Get max value for rang
2365
-		$max = $this->line_max();
2366
-
2367
-		// Update position of line
2368
-		$this->updateLineDown($rowid, $rang, $max);
2369
-	}
2370
-
2371
-	/**
2372
-	 * 	Update position of line (rang)
2373
-	 *
2374
-	 * 	@param	int		$rowid		Id of line
2375
-	 * 	@param	int		$rang		Position
2376
-	 * 	@return	void
2377
-	 */
2378
-	function updateRangOfLine($rowid,$rang)
2379
-	{
2380
-		$fieldposition = 'rang';
2381
-		if (in_array($this->table_element_line, array('ecm_files', 'emailcollector_emailcollectoraction'))) $fieldposition = 'position';
2382
-
2383
-		$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element_line.' SET '.$fieldposition.' = '.$rang;
2384
-		$sql.= ' WHERE rowid = '.$rowid;
2385
-
2386
-		dol_syslog(get_class($this)."::updateRangOfLine", LOG_DEBUG);
2387
-		if (! $this->db->query($sql))
2388
-		{
2389
-			dol_print_error($this->db);
2390
-		}
2391
-	}
864
+        $contacts = $objFrom->liste_contact(-1, $source);
865
+        foreach($contacts as $contact)
866
+        {
867
+            if ($this->add_contact($contact['id'], $contact['fk_c_type_contact'], $contact['source']) < 0)
868
+            {
869
+                $this->error=$this->db->lasterror();
870
+                return -1;
871
+            }
872
+        }
873
+        return 1;
874
+    }
2392 875
 
2393 876
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
2394
-	/**
2395
-	 * 	Update position of line with ajax (rang)
2396
-	 *
2397
-	 * 	@param	array	$rows	Array of rows
2398
-	 * 	@return	void
2399
-	 */
2400
-	function line_ajaxorder($rows)
2401
-	{
877
+    /**
878
+     *      Update a link to contact line
879
+     *
880
+     *      @param	int		$rowid              Id of line contact-element
881
+     * 		@param	int		$statut	            New status of link
882
+     *      @param  int		$type_contact_id    Id of contact type (not modified if 0)
883
+     *      @param  int		$fk_socpeople	    Id of soc_people to update (not modified if 0)
884
+     *      @return int                 		<0 if KO, >= 0 if OK
885
+     */
886
+    function update_contact($rowid, $statut, $type_contact_id=0, $fk_socpeople=0)
887
+    {
2402 888
         // phpcs:enable
2403
-		$num = count($rows);
2404
-		for ($i = 0 ; $i < $num ; $i++)
2405
-		{
2406
-			$this->updateRangOfLine($rows[$i], ($i+1));
2407
-		}
2408
-	}
2409
-
2410
-	/**
2411
-	 * 	Update position of line up (rang)
2412
-	 *
2413
-	 * 	@param	int		$rowid		Id of line
2414
-	 * 	@param	int		$rang		Position
2415
-	 * 	@return	void
2416
-	 */
2417
-	function updateLineUp($rowid,$rang)
2418
-	{
2419
-		if ($rang > 1)
2420
-		{
2421
-			$fieldposition = 'rang';
2422
-			if (in_array($this->table_element_line, array('ecm_files', 'emailcollector_emailcollectoraction'))) $fieldposition = 'position';
2423
-
2424
-			$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element_line.' SET '.$fieldposition.' = '.$rang ;
2425
-			$sql.= ' WHERE '.$this->fk_element.' = '.$this->id;
2426
-			$sql.= ' AND rang = '.($rang - 1);
2427
-			if ($this->db->query($sql) )
2428
-			{
2429
-				$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element_line.' SET '.$fieldposition.' = '.($rang - 1);
2430
-				$sql.= ' WHERE rowid = '.$rowid;
2431
-				if (! $this->db->query($sql) )
2432
-				{
2433
-					dol_print_error($this->db);
2434
-				}
2435
-			}
2436
-			else
2437
-			{
2438
-				dol_print_error($this->db);
2439
-			}
2440
-		}
2441
-	}
2442
-
2443
-	/**
2444
-	 * 	Update position of line down (rang)
2445
-	 *
2446
-	 * 	@param	int		$rowid		Id of line
2447
-	 * 	@param	int		$rang		Position
2448
-	 * 	@param	int		$max		Max
2449
-	 * 	@return	void
2450
-	 */
2451
-	function updateLineDown($rowid,$rang,$max)
2452
-	{
2453
-		if ($rang < $max)
2454
-		{
2455
-			$fieldposition = 'rang';
2456
-			if (in_array($this->table_element_line, array('ecm_files', 'emailcollector_emailcollectoraction'))) $fieldposition = 'position';
2457
-
2458
-			$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element_line.' SET '.$fieldposition.' = '.$rang;
2459
-			$sql.= ' WHERE '.$this->fk_element.' = '.$this->id;
2460
-			$sql.= ' AND rang = '.($rang+1);
2461
-			if ($this->db->query($sql) )
2462
-			{
2463
-				$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element_line.' SET '.$fieldposition.' = '.($rang+1);
2464
-				$sql.= ' WHERE rowid = '.$rowid;
2465
-				if (! $this->db->query($sql) )
2466
-				{
2467
-					dol_print_error($this->db);
2468
-				}
2469
-			}
2470
-			else
2471
-			{
2472
-				dol_print_error($this->db);
2473
-			}
2474
-		}
2475
-	}
2476
-
2477
-	/**
2478
-	 * 	Get position of line (rang)
2479
-	 *
2480
-	 * 	@param		int		$rowid		Id of line
2481
-	 *  @return		int     			Value of rang in table of lines
2482
-	 */
2483
-	function getRangOfLine($rowid)
2484
-	{
2485
-		$sql = 'SELECT rang FROM '.MAIN_DB_PREFIX.$this->table_element_line;
2486
-		$sql.= ' WHERE rowid ='.$rowid;
2487
-
2488
-		dol_syslog(get_class($this)."::getRangOfLine", LOG_DEBUG);
2489
-		$resql = $this->db->query($sql);
2490
-		if ($resql)
2491
-		{
2492
-			$row = $this->db->fetch_row($resql);
2493
-			return $row[0];
2494
-		}
2495
-	}
2496
-
2497
-	/**
2498
-	 * 	Get rowid of the line relative to its position
2499
-	 *
2500
-	 * 	@param		int		$rang		Rang value
2501
-	 *  @return     int     			Rowid of the line
2502
-	 */
2503
-	function getIdOfLine($rang)
2504
-	{
2505
-		$sql = 'SELECT rowid FROM '.MAIN_DB_PREFIX.$this->table_element_line;
2506
-		$sql.= ' WHERE '.$this->fk_element.' = '.$this->id;
2507
-		$sql.= ' AND rang = '.$rang;
2508
-		$resql = $this->db->query($sql);
2509
-		if ($resql)
2510
-		{
2511
-			$row = $this->db->fetch_row($resql);
2512
-			return $row[0];
2513
-		}
2514
-	}
889
+        // Insert into database
890
+        $sql = "UPDATE ".MAIN_DB_PREFIX."element_contact set";
891
+        $sql.= " statut = ".$statut;
892
+        if ($type_contact_id) $sql.= ", fk_c_type_contact = '".$type_contact_id ."'";
893
+        if ($fk_socpeople) $sql.= ", fk_socpeople = '".$fk_socpeople ."'";
894
+        $sql.= " where rowid = ".$rowid;
895
+        $resql=$this->db->query($sql);
896
+        if ($resql)
897
+        {
898
+            return 0;
899
+        }
900
+        else
901
+        {
902
+            $this->error=$this->db->lasterror();
903
+            return -1;
904
+        }
905
+    }
2515 906
 
2516 907
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
2517
-	/**
2518
-	 * 	Get max value used for position of line (rang)
2519
-	 *
2520
-	 * 	@param		int		$fk_parent_line		Parent line id
2521
-	 *  @return     int  			   			Max value of rang in table of lines
2522
-	 */
2523
-	function line_max($fk_parent_line=0)
2524
-	{
908
+    /**
909
+     *    Delete a link to contact line
910
+     *
911
+     *    @param	int		$rowid			Id of contact link line to delete
912
+     *    @param	int		$notrigger		Disable all triggers
913
+     *    @return   int						>0 if OK, <0 if KO
914
+     */
915
+    function delete_contact($rowid, $notrigger=0)
916
+    {
2525 917
         // phpcs:enable
2526
-		// Search the last rang with fk_parent_line
2527
-		if ($fk_parent_line)
2528
-		{
2529
-			$sql = 'SELECT max(rang) FROM '.MAIN_DB_PREFIX.$this->table_element_line;
2530
-			$sql.= ' WHERE '.$this->fk_element.' = '.$this->id;
2531
-			$sql.= ' AND fk_parent_line = '.$fk_parent_line;
2532
-
2533
-			dol_syslog(get_class($this)."::line_max", LOG_DEBUG);
2534
-			$resql = $this->db->query($sql);
2535
-			if ($resql)
2536
-			{
2537
-				$row = $this->db->fetch_row($resql);
2538
-				if (! empty($row[0]))
2539
-				{
2540
-					return $row[0];
2541
-				}
2542
-				else
2543
-				{
2544
-					return $this->getRangOfLine($fk_parent_line);
2545
-				}
2546
-			}
2547
-		}
2548
-		// If not, search the last rang of element
2549
-		else
2550
-		{
2551
-			$sql = 'SELECT max(rang) FROM '.MAIN_DB_PREFIX.$this->table_element_line;
2552
-			$sql.= ' WHERE '.$this->fk_element.' = '.$this->id;
2553
-
2554
-			dol_syslog(get_class($this)."::line_max", LOG_DEBUG);
2555
-			$resql = $this->db->query($sql);
2556
-			if ($resql)
2557
-			{
2558
-				$row = $this->db->fetch_row($resql);
2559
-				return $row[0];
2560
-			}
2561
-		}
2562
-	}
918
+        global $user;
2563 919
 
2564
-    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
2565
-	/**
2566
-	 *  Update external ref of element
2567
-	 *
2568
-	 *  @param      string		$ref_ext	Update field ref_ext
2569
-	 *  @return     int      		   		<0 if KO, >0 if OK
2570
-	 */
2571
-	function update_ref_ext($ref_ext)
2572
-	{
2573
-        // phpcs:enable
2574
-		if (! $this->table_element)
2575
-		{
2576
-			dol_syslog(get_class($this)."::update_ref_ext was called on objet with property table_element not defined", LOG_ERR);
2577
-			return -1;
2578
-		}
2579
-
2580
-		$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
2581
-		$sql.= " SET ref_ext = '".$this->db->escape($ref_ext)."'";
2582
-		$sql.= " WHERE ".(isset($this->table_rowid)?$this->table_rowid:'rowid')." = ". $this->id;
2583
-
2584
-		dol_syslog(get_class($this)."::update_ref_ext", LOG_DEBUG);
2585
-		if ($this->db->query($sql))
2586
-		{
2587
-			$this->ref_ext = $ref_ext;
2588
-			return 1;
2589
-		}
2590
-		else
2591
-		{
2592
-			$this->error=$this->db->error();
2593
-			return -1;
2594
-		}
2595
-	}
2596 920
 
2597
-    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
2598
-	/**
2599
-	 *  Update note of element
2600
-	 *
2601
-	 *  @param      string		$note		New value for note
2602
-	 *  @param		string		$suffix		'', '_public' or '_private'
2603
-	 *  @return     int      		   		<0 if KO, >0 if OK
2604
-	 */
2605
-	function update_note($note, $suffix='')
2606
-	{
2607
-        // phpcs:enable
2608
-		global $user;
2609
-
2610
-		if (! $this->table_element)
2611
-		{
2612
-			$this->error='update_note was called on objet with property table_element not defined';
2613
-			dol_syslog(get_class($this)."::update_note was called on objet with property table_element not defined", LOG_ERR);
2614
-			return -1;
2615
-		}
2616
-		if (! in_array($suffix,array('','_public','_private')))
2617
-		{
2618
-			$this->error='update_note Parameter suffix must be empty, \'_private\' or \'_public\'';
2619
-			dol_syslog(get_class($this)."::update_note Parameter suffix must be empty, '_private' or '_public'", LOG_ERR);
2620
-			return -2;
2621
-		}
2622
-		// Special cas
2623
-		//var_dump($this->table_element);exit;
2624
-		if ($this->table_element == 'product') $suffix='';
2625
-
2626
-		$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
2627
-		$sql.= " SET note".$suffix." = ".(!empty($note)?("'".$this->db->escape($note)."'"):"NULL");
2628
-		$sql.= " ,".(in_array($this->table_element, array('actioncomm', 'adherent', 'advtargetemailing', 'cronjob', 'establishment'))?"fk_user_mod":"fk_user_modif")." = ".$user->id;
2629
-		$sql.= " WHERE rowid =". $this->id;
2630
-
2631
-		dol_syslog(get_class($this)."::update_note", LOG_DEBUG);
2632
-		if ($this->db->query($sql))
2633
-		{
2634
-			if ($suffix == '_public') $this->note_public = $note;
2635
-			else if ($suffix == '_private') $this->note_private = $note;
2636
-			else
2637
-			{
2638
-				$this->note = $note;      // deprecated
2639
-				$this->note_private = $note;
2640
-			}
2641
-			return 1;
2642
-		}
2643
-		else
2644
-		{
2645
-			$this->error=$this->db->lasterror();
2646
-			return -1;
2647
-		}
2648
-	}
921
+        $this->db->begin();
2649 922
 
2650
-    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
2651
-	/**
2652
-	 * 	Update public note (kept for backward compatibility)
2653
-	 *
2654
-	 * @param      string		$note		New value for note
2655
-	 * @return     int      		   		<0 if KO, >0 if OK
2656
-	 * @deprecated
2657
-	 * @see update_note()
2658
-	 */
2659
-	function update_note_public($note)
2660
-	{
2661
-        // phpcs:enable
2662
-		return $this->update_note($note,'_public');
2663
-	}
923
+        $sql = "DELETE FROM ".MAIN_DB_PREFIX."element_contact";
924
+        $sql.= " WHERE rowid =".$rowid;
925
+
926
+        dol_syslog(get_class($this)."::delete_contact", LOG_DEBUG);
927
+        if ($this->db->query($sql))
928
+        {
929
+            if (! $notrigger)
930
+            {
931
+                $result=$this->call_trigger(strtoupper($this->element).'_DELETE_CONTACT', $user);
932
+                if ($result < 0) { $this->db->rollback(); return -1; }
933
+            }
934
+
935
+            $this->db->commit();
936
+            return 1;
937
+        }
938
+        else
939
+        {
940
+            $this->error=$this->db->lasterror();
941
+            $this->db->rollback();
942
+            return -1;
943
+        }
944
+    }
2664 945
 
2665 946
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
2666
-	/**
2667
-	 *	Update total_ht, total_ttc, total_vat, total_localtax1, total_localtax2 for an object (sum of lines).
2668
-	 *  Must be called at end of methods addline or updateline.
2669
-	 *
2670
-	 *	@param	int		$exclspec          	>0 = Exclude special product (product_type=9)
2671
-	 *  @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
2672
-	 *  @param	int		$nodatabaseupdate	1=Do not update database. Update only properties of object.
2673
-	 *  @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.
2674
-	 *	@return	int    			           	<0 if KO, >0 if OK
2675
-	 */
2676
-	function update_price($exclspec=0,$roundingadjust='none',$nodatabaseupdate=0,$seller=null)
2677
-	{
947
+    /**
948
+     *    Delete all links between an object $this and all its contacts
949
+     *
950
+     *	  @param	string	$source		'' or 'internal' or 'external'
951
+     *	  @param	string	$code		Type of contact (code or id)
952
+     *    @return   int					>0 if OK, <0 if KO
953
+     */
954
+    function delete_linked_contact($source='',$code='')
955
+    {
2678 956
         // phpcs:enable
2679
-		global $conf, $hookmanager, $action;
2680
-
2681
-		// Some external module want no update price after a trigger because they have another method to calculate the total (ex: with an extrafield)
2682
-		$MODULE = "";
2683
-		if ($this->element == 'propal')
2684
-			$MODULE = "MODULE_DISALLOW_UPDATE_PRICE_PROPOSAL";
2685
-		elseif ($this->element == 'order')
2686
-			$MODULE = "MODULE_DISALLOW_UPDATE_PRICE_ORDER";
2687
-		elseif ($this->element == 'facture')
2688
-			$MODULE = "MODULE_DISALLOW_UPDATE_PRICE_INVOICE";
2689
-		elseif ($this->element == 'facture_fourn')
2690
-			$MODULE = "MODULE_DISALLOW_UPDATE_PRICE_SUPPLIER_INVOICE";
2691
-		elseif ($this->element == 'order_supplier')
2692
-			$MODULE = "MODULE_DISALLOW_UPDATE_PRICE_SUPPLIER_ORDER";
2693
-		elseif ($this->element == 'supplier_proposal')
2694
-			$MODULE = "MODULE_DISALLOW_UPDATE_PRICE_SUPPLIER_PROPOSAL";
2695
-
2696
-		if (! empty($MODULE)) {
2697
-			if (! empty($conf->global->$MODULE)) {
2698
-				$modsactivated = explode(',', $conf->global->$MODULE);
2699
-				foreach ($modsactivated as $mod) {
2700
-					if ($conf->$mod->enabled)
2701
-						return 1; // update was disabled by specific setup
2702
-				}
2703
-			}
2704
-		}
2705
-
2706
-		include_once DOL_DOCUMENT_ROOT.'/core/lib/price.lib.php';
2707
-
2708
-		if ($roundingadjust == '-1') $roundingadjust='auto';	// For backward compatibility
2709
-
2710
-		$forcedroundingmode=$roundingadjust;
2711
-		if ($forcedroundingmode == 'auto' && isset($conf->global->MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND)) $forcedroundingmode=$conf->global->MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND;
2712
-		elseif ($forcedroundingmode == 'auto') $forcedroundingmode='0';
2713
-
2714
-		$error=0;
2715
-
2716
-		$multicurrency_tx = !empty($this->multicurrency_tx) ? $this->multicurrency_tx : 1;
2717
-
2718
-		// Define constants to find lines to sum
2719
-		$fieldtva='total_tva';
2720
-		$fieldlocaltax1='total_localtax1';
2721
-		$fieldlocaltax2='total_localtax2';
2722
-		$fieldup='subprice';
2723
-		if ($this->element == 'facture_fourn' || $this->element == 'invoice_supplier')
2724
-		{
2725
-			$fieldtva='tva';
2726
-			$fieldup='pu_ht';
2727
-		}
2728
-		if ($this->element == 'expensereport')
2729
-		{
2730
-			$fieldup='value_unit';
2731
-		}
2732
-
2733
-		$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,';
2734
-		$sql.= ' tva_tx as vatrate, localtax1_tx, localtax2_tx, localtax1_type, localtax2_type, info_bits, product_type';
2735
-			if ($this->table_element_line == 'facturedet') $sql.= ', situation_percent';
2736
-			$sql.= ', multicurrency_total_ht, multicurrency_total_tva, multicurrency_total_ttc';
2737
-		$sql.= ' FROM '.MAIN_DB_PREFIX.$this->table_element_line;
2738
-		$sql.= ' WHERE '.$this->fk_element.' = '.$this->id;
2739
-		if ($exclspec)
2740
-		{
2741
-			$product_field='product_type';
2742
-			if ($this->table_element_line == 'contratdet') $product_field='';    // contratdet table has no product_type field
2743
-			if ($product_field) $sql.= ' AND '.$product_field.' <> 9';
2744
-		}
2745
-		$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
-
2747
-		dol_syslog(get_class($this)."::update_price", LOG_DEBUG);
2748
-		$resql = $this->db->query($sql);
2749
-		if ($resql)
2750
-		{
2751
-			$this->total_ht  = 0;
2752
-			$this->total_tva = 0;
2753
-			$this->total_localtax1 = 0;
2754
-			$this->total_localtax2 = 0;
2755
-			$this->total_ttc = 0;
2756
-			$total_ht_by_vats  = array();
2757
-			$total_tva_by_vats = array();
2758
-			$total_ttc_by_vats = array();
2759
-			$this->multicurrency_total_ht	= 0;
2760
-			$this->multicurrency_total_tva	= 0;
2761
-			$this->multicurrency_total_ttc	= 0;
2762
-
2763
-			$num = $this->db->num_rows($resql);
2764
-			$i = 0;
2765
-			while ($i < $num)
2766
-			{
2767
-				$obj = $this->db->fetch_object($resql);
957
+        $temp = array();
958
+        $typeContact = $this->liste_type_contact($source,'',0,0,$code);
2768 959
 
2769
-				// Note: There is no check on detail line and no check on total, if $forcedroundingmode = 'none'
2770
-				$parameters=array('fk_element' => $obj->rowid);
2771
-				$reshook = $hookmanager->executeHooks('changeRoundingMode', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
960
+        foreach($typeContact as $key => $value)
961
+        {
962
+            array_push($temp,$key);
963
+        }
964
+        $listId = implode(",", $temp);
2772 965
 
2773
-				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'
2774
-				{
2775
-					$localtax_array=array($obj->localtax1_type,$obj->localtax1_tx,$obj->localtax2_type,$obj->localtax2_tx);
2776
-					$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);
2777
-					$diff=price2num($tmpcal[1] - $obj->total_tva, 'MT', 1);
2778
-					if ($diff)
2779
-					{
2780
-						$sqlfix="UPDATE ".MAIN_DB_PREFIX.$this->table_element_line." SET ".$fieldtva." = ".$tmpcal[1].", total_ttc = ".$tmpcal[2]." WHERE rowid = ".$obj->rowid;
2781
-						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);
2782
-								$resqlfix=$this->db->query($sqlfix);
2783
-								if (! $resqlfix) dol_print_error($this->db,'Failed to update line');
2784
-								$obj->total_tva = $tmpcal[1];
2785
-								$obj->total_ttc = $tmpcal[2];
2786
-						//
2787
-					}
2788
-				}
966
+        $sql = "DELETE FROM ".MAIN_DB_PREFIX."element_contact";
967
+        $sql.= " WHERE element_id = ".$this->id;
968
+        if ($listId)
969
+            $sql.= " AND fk_c_type_contact IN (".$listId.")";
2789 970
 
2790
-				$this->total_ht        += $obj->total_ht;		// The field visible at end of line detail
2791
-				$this->total_tva       += $obj->total_tva;
2792
-				$this->total_localtax1 += $obj->total_localtax1;
2793
-				$this->total_localtax2 += $obj->total_localtax2;
2794
-				$this->total_ttc       += $obj->total_ttc;
2795
-				$this->multicurrency_total_ht        += $obj->multicurrency_total_ht;		// The field visible at end of line detail
2796
-				$this->multicurrency_total_tva       += $obj->multicurrency_total_tva;
2797
-				$this->multicurrency_total_ttc       += $obj->multicurrency_total_ttc;
2798
-
2799
-				if (! isset($total_ht_by_vats[$obj->vatrate]))  $total_ht_by_vats[$obj->vatrate]=0;
2800
-				if (! isset($total_tva_by_vats[$obj->vatrate])) $total_tva_by_vats[$obj->vatrate]=0;
2801
-				if (! isset($total_ttc_by_vats[$obj->vatrate])) $total_ttc_by_vats[$obj->vatrate]=0;
2802
-				$total_ht_by_vats[$obj->vatrate]  += $obj->total_ht;
2803
-				$total_tva_by_vats[$obj->vatrate] += $obj->total_tva;
2804
-				$total_ttc_by_vats[$obj->vatrate] += $obj->total_ttc;
2805
-
2806
-				if ($forcedroundingmode == '1')	// Check if we need adjustement onto line for vat. TODO This works on the company currency but not on multicurrency
2807
-				{
2808
-					$tmpvat=price2num($total_ht_by_vats[$obj->vatrate] * $obj->vatrate / 100, 'MT', 1);
2809
-					$diff=price2num($total_tva_by_vats[$obj->vatrate]-$tmpvat, 'MT', 1);
2810
-					//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";
2811
-					if ($diff)
2812
-					{
2813
-						if (abs($diff) > 0.1) { dol_syslog('A rounding difference was detected into TOTAL but is too high to be corrected', LOG_WARNING); exit; }
2814
-						$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
-						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);
2816
-								$resqlfix=$this->db->query($sqlfix);
2817
-								if (! $resqlfix) dol_print_error($this->db,'Failed to update line');
2818
-								$this->total_tva -= $diff;
2819
-								$this->total_ttc -= $diff;
2820
-								$total_tva_by_vats[$obj->vatrate] -= $diff;
2821
-								$total_ttc_by_vats[$obj->vatrate] -= $diff;
2822
-					}
2823
-				}
971
+        dol_syslog(get_class($this)."::delete_linked_contact", LOG_DEBUG);
972
+        if ($this->db->query($sql))
973
+        {
974
+            return 1;
975
+        }
976
+        else
977
+        {
978
+            $this->error=$this->db->lasterror();
979
+            return -1;
980
+        }
981
+    }
2824 982
 
2825
-				$i++;
2826
-			}
983
+    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
984
+    /**
985
+     *    Get array of all contacts for an object
986
+     *
987
+     *    @param	int			$statut		Status of links to get (-1=all)
988
+     *    @param	string		$source		Source of contact: external or thirdparty (llx_socpeople) or internal (llx_user)
989
+     *    @param	int         $list       0:Return array contains all properties, 1:Return array contains just id
990
+     *    @param    string      $code       Filter on this code of contact type ('SHIPPING', 'BILLING', ...)
991
+     *    @return	array|int		        Array of contacts, -1 if error
992
+     */
993
+    function liste_contact($statut=-1,$source='external',$list=0,$code='')
994
+    {
995
+        // phpcs:enable
996
+        global $langs;
997
+
998
+        $tab=array();
999
+
1000
+        $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
1001
+        if ($source == 'internal') $sql.=", '-1' as socid, t.statut as statuscontact, t.login, t.photo";
1002
+        if ($source == 'external' || $source == 'thirdparty') $sql.=", t.fk_soc as socid, t.statut as statuscontact";
1003
+        $sql.= ", t.civility as civility, t.lastname as lastname, t.firstname, t.email";
1004
+        $sql.= ", tc.source, tc.element, tc.code, tc.libelle";
1005
+        $sql.= " FROM ".MAIN_DB_PREFIX."c_type_contact tc";
1006
+        $sql.= ", ".MAIN_DB_PREFIX."element_contact ec";
1007
+        if ($source == 'internal') $sql.=" LEFT JOIN ".MAIN_DB_PREFIX."user t on ec.fk_socpeople = t.rowid";
1008
+        if ($source == 'external'|| $source == 'thirdparty') $sql.=" LEFT JOIN ".MAIN_DB_PREFIX."socpeople t on ec.fk_socpeople = t.rowid";
1009
+        $sql.= " WHERE ec.element_id =".$this->id;
1010
+        $sql.= " AND ec.fk_c_type_contact=tc.rowid";
1011
+        $sql.= " AND tc.element='".$this->db->escape($this->element)."'";
1012
+        if ($code) $sql.= " AND tc.code = '".$this->db->escape($code)."'";
1013
+        if ($source == 'internal') $sql.= " AND tc.source = 'internal'";
1014
+        if ($source == 'external' || $source == 'thirdparty') $sql.= " AND tc.source = 'external'";
1015
+        $sql.= " AND tc.active=1";
1016
+        if ($statut >= 0) $sql.= " AND ec.statut = '".$statut."'";
1017
+        $sql.=" ORDER BY t.lastname ASC";
1018
+
1019
+        dol_syslog(get_class($this)."::liste_contact", LOG_DEBUG);
1020
+        $resql=$this->db->query($sql);
1021
+        if ($resql)
1022
+        {
1023
+            $num=$this->db->num_rows($resql);
1024
+            $i=0;
1025
+            while ($i < $num)
1026
+            {
1027
+                $obj = $this->db->fetch_object($resql);
1028
+
1029
+                if (! $list)
1030
+                {
1031
+                    $transkey="TypeContact_".$obj->element."_".$obj->source."_".$obj->code;
1032
+                    $libelle_type=($langs->trans($transkey)!=$transkey ? $langs->trans($transkey) : $obj->libelle);
1033
+                    $tab[$i]=array('source'=>$obj->source,'socid'=>$obj->socid,'id'=>$obj->id,
1034
+                                    'nom'=>$obj->lastname,      // For backward compatibility
1035
+                                    'civility'=>$obj->civility, 'lastname'=>$obj->lastname, 'firstname'=>$obj->firstname, 'email'=>$obj->email, 'login'=>$obj->login, 'photo'=>$obj->photo, 'statuscontact'=>$obj->statuscontact,
1036
+                                    'rowid'=>$obj->rowid, 'code'=>$obj->code, 'libelle'=>$libelle_type, 'status'=>$obj->statuslink, 'fk_c_type_contact'=>$obj->fk_c_type_contact);
1037
+                }
1038
+                else
1039
+                {
1040
+                    $tab[$i]=$obj->id;
1041
+                }
1042
+
1043
+                $i++;
1044
+            }
2827 1045
 
2828
-			// Add revenue stamp to total
2829
-			$this->total_ttc       			+= isset($this->revenuestamp)?$this->revenuestamp:0;
2830
-			$this->multicurrency_total_ttc  += isset($this->revenuestamp)?($this->revenuestamp * $multicurrency_tx):0;
1046
+            return $tab;
1047
+        }
1048
+        else
1049
+        {
1050
+            $this->error=$this->db->lasterror();
1051
+            dol_print_error($this->db);
1052
+            return -1;
1053
+        }
1054
+    }
2831 1055
 
2832
-			// Situations totals
2833
-			if ($this->situation_cycle_ref && $this->situation_counter > 1 && method_exists($this, 'get_prev_sits') && $this->type != $this::TYPE_CREDIT_NOTE )
2834
-			{
2835
-				$prev_sits = $this->get_prev_sits();
2836
-
2837
-				foreach ($prev_sits as $sit) {				// $sit is an object Facture loaded with a fetch.
2838
-					$this->total_ht -= $sit->total_ht;
2839
-					$this->total_tva -= $sit->total_tva;
2840
-					$this->total_localtax1 -= $sit->total_localtax1;
2841
-					$this->total_localtax2 -= $sit->total_localtax2;
2842
-					$this->total_ttc -= $sit->total_ttc;
2843
-					$this->multicurrency_total_ht -= $sit->multicurrency_total_ht;
2844
-					$this->multicurrency_total_tva -= $sit->multicurrency_total_tva;
2845
-					$this->multicurrency_total_ttc -= $sit->multicurrency_total_ttc;
2846
-				}
2847
-			}
2848
-
2849
-			$this->db->free($resql);
2850
-
2851
-			// Now update global field total_ht, total_ttc and tva
2852
-			$fieldht='total_ht';
2853
-			$fieldtva='tva';
2854
-			$fieldlocaltax1='localtax1';
2855
-			$fieldlocaltax2='localtax2';
2856
-			$fieldttc='total_ttc';
2857
-			// Specific code for backward compatibility with old field names
2858
-			if ($this->element == 'facture' || $this->element == 'facturerec')             $fieldht='total';
2859
-			if ($this->element == 'facture_fourn' || $this->element == 'invoice_supplier') $fieldtva='total_tva';
2860
-			if ($this->element == 'propal')                                                $fieldttc='total';
2861
-			if ($this->element == 'expensereport')                                         $fieldtva='total_tva';
2862
-			if ($this->element == 'supplier_proposal')                                     $fieldttc='total';
2863
-
2864
-			if (empty($nodatabaseupdate))
2865
-			{
2866
-				$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element.' SET';
2867
-				$sql .= " ".$fieldht."='".price2num($this->total_ht)."',";
2868
-				$sql .= " ".$fieldtva."='".price2num($this->total_tva)."',";
2869
-				$sql .= " ".$fieldlocaltax1."='".price2num($this->total_localtax1)."',";
2870
-				$sql .= " ".$fieldlocaltax2."='".price2num($this->total_localtax2)."',";
2871
-				$sql .= " ".$fieldttc."='".price2num($this->total_ttc)."'";
2872
-						$sql .= ", multicurrency_total_ht='".price2num($this->multicurrency_total_ht, 'MT', 1)."'";
2873
-						$sql .= ", multicurrency_total_tva='".price2num($this->multicurrency_total_tva, 'MT', 1)."'";
2874
-						$sql .= ", multicurrency_total_ttc='".price2num($this->multicurrency_total_ttc, 'MT', 1)."'";
2875
-				$sql .= ' WHERE rowid = '.$this->id;
2876
-
2877
-
2878
-				dol_syslog(get_class($this)."::update_price", LOG_DEBUG);
2879
-				$resql=$this->db->query($sql);
2880
-				if (! $resql)
2881
-				{
2882
-					$error++;
2883
-					$this->error=$this->db->lasterror();
2884
-					$this->errors[]=$this->db->lasterror();
2885
-				}
2886
-			}
2887 1056
 
2888
-			if (! $error)
2889
-			{
2890
-				return 1;
2891
-			}
2892
-			else
2893
-			{
2894
-				return -1;
2895
-			}
2896
-		}
2897
-		else
2898
-		{
2899
-			dol_print_error($this->db,'Bad request in update_price');
2900
-			return -1;
2901
-		}
2902
-	}
1057
+    /**
1058
+     * 		Update status of a contact linked to object
1059
+     *
1060
+     * 		@param	int		$rowid		Id of link between object and contact
1061
+     * 		@return	int					<0 if KO, >=0 if OK
1062
+     */
1063
+    function swapContactStatus($rowid)
1064
+    {
1065
+        $sql = "SELECT ec.datecreate, ec.statut, ec.fk_socpeople, ec.fk_c_type_contact,";
1066
+        $sql.= " tc.code, tc.libelle";
1067
+        //$sql.= ", s.fk_soc";
1068
+        $sql.= " FROM (".MAIN_DB_PREFIX."element_contact as ec, ".MAIN_DB_PREFIX."c_type_contact as tc)";
1069
+        //$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
1070
+        $sql.= " WHERE ec.rowid =".$rowid;
1071
+        $sql.= " AND ec.fk_c_type_contact=tc.rowid";
1072
+        $sql.= " AND tc.element = '".$this->db->escape($this->element)."'";
1073
+
1074
+        dol_syslog(get_class($this)."::swapContactStatus", LOG_DEBUG);
1075
+        $resql=$this->db->query($sql);
1076
+        if ($resql)
1077
+        {
1078
+            $obj = $this->db->fetch_object($resql);
1079
+            $newstatut = ($obj->statut == 4) ? 5 : 4;
1080
+            $result = $this->update_contact($rowid, $newstatut);
1081
+            $this->db->free($resql);
1082
+            return $result;
1083
+        }
1084
+        else
1085
+        {
1086
+            $this->error=$this->db->error();
1087
+            dol_print_error($this->db);
1088
+            return -1;
1089
+        }
1090
+    }
2903 1091
 
2904 1092
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
2905
-	/**
2906
-	 *	Add objects linked in llx_element_element.
2907
-	 *
2908
-	 *	@param		string	$origin		Linked element type
2909
-	 *	@param		int		$origin_id	Linked element id
2910
-	 *	@return		int					<=0 if KO, >0 if OK
2911
-	 *	@see		fetchObjectLinked, updateObjectLinked, deleteObjectLinked
2912
-	 */
2913
-	function add_object_linked($origin=null, $origin_id=null)
2914
-	{
1093
+    /**
1094
+     *      Return array with list of possible values for type of contacts
1095
+     *
1096
+     *      @param	string	$source     'internal', 'external' or 'all'
1097
+     *      @param	string	$order		Sort order by : 'position', 'code', 'rowid'...
1098
+     *      @param  int		$option     0=Return array id->label, 1=Return array code->label
1099
+     *      @param  int		$activeonly 0=all status of contact, 1=only the active
1100
+     *		@param	string	$code		Type of contact (Example: 'CUSTOMER', 'SERVICE')
1101
+     *      @return array       		Array list of type of contacts (id->label if option=0, code->label if option=1)
1102
+     */
1103
+    function liste_type_contact($source='internal', $order='position', $option=0, $activeonly=0, $code='')
1104
+    {
2915 1105
         // phpcs:enable
2916
-		$origin = (! empty($origin) ? $origin : $this->origin);
2917
-		$origin_id = (! empty($origin_id) ? $origin_id : $this->origin_id);
2918
-
2919
-		// Special case
2920
-		if ($origin == 'order') $origin='commande';
2921
-		if ($origin == 'invoice') $origin='facture';
2922
-		if ($origin == 'invoice_template') $origin='facturerec';
2923
-    	if ($origin == 'supplierorder') $origin='order_supplier';
2924
-		$this->db->begin();
2925
-
2926
-		$sql = "INSERT INTO ".MAIN_DB_PREFIX."element_element (";
2927
-		$sql.= "fk_source";
2928
-		$sql.= ", sourcetype";
2929
-		$sql.= ", fk_target";
2930
-		$sql.= ", targettype";
2931
-		$sql.= ") VALUES (";
2932
-		$sql.= $origin_id;
2933
-		$sql.= ", '".$this->db->escape($origin)."'";
2934
-		$sql.= ", ".$this->id;
2935
-		$sql.= ", '".$this->db->escape($this->element)."'";
2936
-		$sql.= ")";
2937
-
2938
-		dol_syslog(get_class($this)."::add_object_linked", LOG_DEBUG);
2939
-		if ($this->db->query($sql))
2940
-	  	{
2941
-	  		$this->db->commit();
2942
-	  		return 1;
2943
-	  	}
2944
-	  	else
2945
-	  	{
2946
-	  		$this->error=$this->db->lasterror();
2947
-	  		$this->db->rollback();
2948
-	  		return 0;
2949
-	  	}
2950
-	}
2951
-
2952
-	/**
2953
-	 *	Fetch array of objects linked to current object (object of enabled modules only). Links are loaded into
2954
-	 *		this->linkedObjectsIds array and
2955
-	 *		this->linkedObjects array if $loadalsoobjects = 1
2956
-	 *  Possible usage for parameters:
2957
-	 *  - all parameters empty -> we look all link to current object (current object can be source or target)
2958
-	 *  - source id+type -> will get target list linked to source
2959
-	 *  - target id+type -> will get source list linked to target
2960
-	 *  - source id+type + target type -> will get target list of the type
2961
-	 *  - target id+type + target source -> will get source list of the type
2962
-	 *
2963
-	 *	@param	int		$sourceid			Object source id (if not defined, id of object)
2964
-	 *	@param  string	$sourcetype			Object source type (if not defined, element name of object)
2965
-	 *	@param  int		$targetid			Object target id (if not defined, id of object)
2966
-	 *	@param  string	$targettype			Object target type (if not defined, elemennt name of object)
2967
-	 *	@param  string	$clause				'OR' or 'AND' clause used when both source id and target id are provided
2968
-	 *  @param  int		$alsosametype		0=Return only links to object that differs from source type. 1=Include also link to objects of same type.
2969
-	 *  @param  string	$orderby			SQL 'ORDER BY' clause
2970
-	 *  @param	int		$loadalsoobjects	Load also array this->linkedObjects (Use 0 to increase performances)
2971
-	 *	@return int							<0 if KO, >0 if OK
2972
-	 *  @see	add_object_linked, updateObjectLinked, deleteObjectLinked
2973
-	 */
2974
-	function fetchObjectLinked($sourceid=null,$sourcetype='',$targetid=null,$targettype='',$clause='OR',$alsosametype=1,$orderby='sourcetype',$loadalsoobjects=1)
2975
-	{
2976
-		global $conf;
2977
-
2978
-		$this->linkedObjectsIds=array();
2979
-		$this->linkedObjects=array();
2980
-
2981
-		$justsource=false;
2982
-		$justtarget=false;
2983
-		$withtargettype=false;
2984
-		$withsourcetype=false;
2985
-
2986
-		if (! empty($sourceid) && ! empty($sourcetype) && empty($targetid))
2987
-		{
2988
-			$justsource=true;  // the source (id and type) is a search criteria
2989
-			if (! empty($targettype)) $withtargettype=true;
2990
-		}
2991
-		if (! empty($targetid) && ! empty($targettype) && empty($sourceid))
2992
-		{
2993
-			$justtarget=true;  // the target (id and type) is a search criteria
2994
-			if (! empty($sourcetype)) $withsourcetype=true;
2995
-		}
2996
-
2997
-		$sourceid = (! empty($sourceid) ? $sourceid : $this->id);
2998
-		$targetid = (! empty($targetid) ? $targetid : $this->id);
2999
-		$sourcetype = (! empty($sourcetype) ? $sourcetype : $this->element);
3000
-		$targettype = (! empty($targettype) ? $targettype : $this->element);
3001
-
3002
-		/*if (empty($sourceid) && empty($targetid))
3003
-		 {
3004
-		 dol_syslog('Bad usage of function. No source nor target id defined (nor as parameter nor as object id)', LOG_ERR);
3005
-		 return -1;
3006
-		 }*/
1106
+        global $langs;
1107
+
1108
+        if (empty($order)) $order='position';
1109
+        if ($order == 'position') $order.=',code';
1110
+
1111
+        $tab = array();
1112
+        $sql = "SELECT DISTINCT tc.rowid, tc.code, tc.libelle, tc.position";
1113
+        $sql.= " FROM ".MAIN_DB_PREFIX."c_type_contact as tc";
1114
+        $sql.= " WHERE tc.element='".$this->db->escape($this->element)."'";
1115
+        if ($activeonly == 1) $sql.= " AND tc.active=1"; // only the active types
1116
+        if (! empty($source) && $source != 'all') $sql.= " AND tc.source='".$this->db->escape($source)."'";
1117
+        if (! empty($code)) $sql.= " AND tc.code='".$this->db->escape($code)."'";
1118
+        $sql.= $this->db->order($order,'ASC');
1119
+
1120
+        //print "sql=".$sql;
1121
+        $resql=$this->db->query($sql);
1122
+        if ($resql)
1123
+        {
1124
+            $num=$this->db->num_rows($resql);
1125
+            $i=0;
1126
+            while ($i < $num)
1127
+            {
1128
+                $obj = $this->db->fetch_object($resql);
3007 1129
 
3008
-		// Links between objects are stored in table element_element
3009
-		$sql = 'SELECT rowid, fk_source, sourcetype, fk_target, targettype';
3010
-		$sql.= ' FROM '.MAIN_DB_PREFIX.'element_element';
3011
-		$sql.= " WHERE ";
3012
-		if ($justsource || $justtarget)
3013
-		{
3014
-			if ($justsource)
3015
-			{
3016
-				$sql.= "fk_source = ".$sourceid." AND sourcetype = '".$sourcetype."'";
3017
-				if ($withtargettype) $sql.= " AND targettype = '".$targettype."'";
3018
-			}
3019
-			else if ($justtarget)
3020
-			{
3021
-				$sql.= "fk_target = ".$targetid." AND targettype = '".$targettype."'";
3022
-				if ($withsourcetype) $sql.= " AND sourcetype = '".$sourcetype."'";
3023
-			}
3024
-		}
3025
-		else
3026
-		{
3027
-			$sql.= "(fk_source = ".$sourceid." AND sourcetype = '".$sourcetype."')";
3028
-			$sql.= " ".$clause." (fk_target = ".$targetid." AND targettype = '".$targettype."')";
3029
-		}
3030
-		$sql .= ' ORDER BY '.$orderby;
3031
-
3032
-		dol_syslog(get_class($this)."::fetchObjectLink", LOG_DEBUG);
3033
-		$resql = $this->db->query($sql);
3034
-		if ($resql)
3035
-		{
3036
-			$num = $this->db->num_rows($resql);
3037
-			$i = 0;
3038
-			while ($i < $num)
3039
-			{
3040
-				$obj = $this->db->fetch_object($resql);
3041
-				if ($justsource || $justtarget)
3042
-				{
3043
-					if ($justsource)
3044
-					{
3045
-						$this->linkedObjectsIds[$obj->targettype][$obj->rowid]=$obj->fk_target;
3046
-					}
3047
-					else if ($justtarget)
3048
-					{
3049
-						$this->linkedObjectsIds[$obj->sourcetype][$obj->rowid]=$obj->fk_source;
3050
-					}
3051
-				}
3052
-				else
3053
-				{
3054
-					if ($obj->fk_source == $sourceid && $obj->sourcetype == $sourcetype)
3055
-					{
3056
-						$this->linkedObjectsIds[$obj->targettype][$obj->rowid]=$obj->fk_target;
3057
-					}
3058
-					if ($obj->fk_target == $targetid && $obj->targettype == $targettype)
3059
-					{
3060
-						$this->linkedObjectsIds[$obj->sourcetype][$obj->rowid]=$obj->fk_source;
3061
-					}
3062
-				}
3063
-				$i++;
3064
-			}
3065
-
3066
-			if (! empty($this->linkedObjectsIds))
3067
-			{
3068
-				$tmparray = $this->linkedObjectsIds;
3069
-				foreach($tmparray as $objecttype => $objectids)       // $objecttype is a module name ('facture', 'mymodule', ...) or a module name with a suffix ('project_task', 'mymodule_myobj', ...)
3070
-				{
3071
-					// Parse element/subelement (ex: project_task, cabinetmed_consultation, ...)
3072
-					$module = $element = $subelement = $objecttype;
3073
-					if ($objecttype != 'supplier_proposal' && $objecttype != 'order_supplier' && $objecttype != 'invoice_supplier'
3074
-						&& preg_match('/^([^_]+)_([^_]+)/i',$objecttype,$regs))
3075
-					{
3076
-						$module = $element = $regs[1];
3077
-						$subelement = $regs[2];
3078
-					}
3079
-
3080
-					$classpath = $element.'/class';
3081
-					// To work with non standard classpath or module name
3082
-					if ($objecttype == 'facture')			{
3083
-						$classpath = 'compta/facture/class';
3084
-					}
3085
-					else if ($objecttype == 'facturerec')			{
3086
-						$classpath = 'compta/facture/class'; $module = 'facture';
3087
-					}
3088
-					else if ($objecttype == 'propal')			{
3089
-						$classpath = 'comm/propal/class';
3090
-					}
3091
-					else if ($objecttype == 'supplier_proposal')			{
3092
-						$classpath = 'supplier_proposal/class';
3093
-					}
3094
-					else if ($objecttype == 'shipping')			{
3095
-						$classpath = 'expedition/class'; $subelement = 'expedition'; $module = 'expedition_bon';
3096
-					}
3097
-					else if ($objecttype == 'delivery')			{
3098
-						$classpath = 'livraison/class'; $subelement = 'livraison'; $module = 'livraison_bon';
3099
-					}
3100
-					else if ($objecttype == 'invoice_supplier' || $objecttype == 'order_supplier')	{
3101
-						$classpath = 'fourn/class'; $module = 'fournisseur';
3102
-					}
3103
-					else if ($objecttype == 'fichinter')			{
3104
-						$classpath = 'fichinter/class'; $subelement = 'fichinter'; $module = 'ficheinter';
3105
-					}
3106
-					else if ($objecttype == 'subscription')			{
3107
-						$classpath = 'adherents/class'; $module = 'adherent';
3108
-					}
3109
-
3110
-					// Set classfile
3111
-					$classfile = strtolower($subelement); $classname = ucfirst($subelement);
3112
-
3113
-					if ($objecttype == 'order') {
3114
-						$classfile = 'commande'; $classname = 'Commande';
3115
-					}
3116
-					else if ($objecttype == 'invoice_supplier') {
3117
-						$classfile = 'fournisseur.facture'; $classname = 'FactureFournisseur';
3118
-					}
3119
-					else if ($objecttype == 'order_supplier')   {
3120
-						$classfile = 'fournisseur.commande'; $classname = 'CommandeFournisseur';
3121
-					}
3122
-					else if ($objecttype == 'supplier_proposal')   {
3123
-						$classfile = 'supplier_proposal'; $classname = 'SupplierProposal';
3124
-					}
3125
-					else if ($objecttype == 'facturerec')   {
3126
-						$classfile = 'facture-rec'; $classname = 'FactureRec';
3127
-					}
3128
-					else if ($objecttype == 'subscription')   {
3129
-						$classfile = 'subscription'; $classname = 'Subscription';
3130
-					}
3131
-
3132
-					// Here $module, $classfile and $classname are set
3133
-					if ($conf->$module->enabled && (($element != $this->element) || $alsosametype))
3134
-					{
3135
-						if ($loadalsoobjects)
3136
-						{
3137
-							dol_include_once('/'.$classpath.'/'.$classfile.'.class.php');
3138
-							//print '/'.$classpath.'/'.$classfile.'.class.php '.class_exists($classname);
3139
-							if (class_exists($classname))
3140
-							{
3141
-								foreach($objectids as $i => $objectid)	// $i is rowid into llx_element_element
3142
-								{
3143
-									$object = new $classname($this->db);
3144
-									$ret = $object->fetch($objectid);
3145
-									if ($ret >= 0)
3146
-									{
3147
-										$this->linkedObjects[$objecttype][$i] = $object;
3148
-									}
3149
-								}
3150
-							}
3151
-						}
3152
-					}
3153
-					else
3154
-					{
3155
-						unset($this->linkedObjectsIds[$objecttype]);
3156
-					}
3157
-				}
3158
-			}
3159
-			return 1;
3160
-		}
3161
-		else
3162
-		{
3163
-			dol_print_error($this->db);
3164
-			return -1;
3165
-		}
3166
-	}
3167
-
3168
-	/**
3169
-	 *	Update object linked of a current object
3170
-	 *
3171
-	 *	@param	int		$sourceid		Object source id
3172
-	 *	@param  string	$sourcetype		Object source type
3173
-	 *	@param  int		$targetid		Object target id
3174
-	 *	@param  string	$targettype		Object target type
3175
-	 *	@return							int	>0 if OK, <0 if KO
3176
-	 *	@see	add_object_linked, fetObjectLinked, deleteObjectLinked
3177
-	 */
3178
-	function updateObjectLinked($sourceid=null, $sourcetype='', $targetid=null, $targettype='')
3179
-	{
3180
-		$updatesource=false;
3181
-		$updatetarget=false;
3182
-
3183
-		if (! empty($sourceid) && ! empty($sourcetype) && empty($targetid) && empty($targettype)) $updatesource=true;
3184
-		else if (empty($sourceid) && empty($sourcetype) && ! empty($targetid) && ! empty($targettype)) $updatetarget=true;
3185
-
3186
-		$sql = "UPDATE ".MAIN_DB_PREFIX."element_element SET ";
3187
-		if ($updatesource)
3188
-		{
3189
-			$sql.= "fk_source = ".$sourceid;
3190
-			$sql.= ", sourcetype = '".$this->db->escape($sourcetype)."'";
3191
-			$sql.= " WHERE fk_target = ".$this->id;
3192
-			$sql.= " AND targettype = '".$this->db->escape($this->element)."'";
3193
-		}
3194
-		else if ($updatetarget)
3195
-		{
3196
-			$sql.= "fk_target = ".$targetid;
3197
-			$sql.= ", targettype = '".$this->db->escape($targettype)."'";
3198
-			$sql.= " WHERE fk_source = ".$this->id;
3199
-			$sql.= " AND sourcetype = '".$this->db->escape($this->element)."'";
3200
-		}
3201
-
3202
-		dol_syslog(get_class($this)."::updateObjectLinked", LOG_DEBUG);
3203
-		if ($this->db->query($sql))
3204
-		{
3205
-			return 1;
3206
-		}
3207
-		else
3208
-		{
3209
-			$this->error=$this->db->lasterror();
3210
-			return -1;
3211
-		}
3212
-	}
3213
-
3214
-	/**
3215
-	 *	Delete all links between an object $this
3216
-	 *
3217
-	 *	@param	int		$sourceid		Object source id
3218
-	 *	@param  string	$sourcetype		Object source type
3219
-	 *	@param  int		$targetid		Object target id
3220
-	 *	@param  string	$targettype		Object target type
3221
-	 *  @param	int		$rowid			Row id of line to delete. If defined, other parameters are not used.
3222
-	 *	@return     					int	>0 if OK, <0 if KO
3223
-	 *	@see	add_object_linked, updateObjectLinked, fetchObjectLinked
3224
-	 */
3225
-	function deleteObjectLinked($sourceid=null, $sourcetype='', $targetid=null, $targettype='', $rowid='')
3226
-	{
3227
-		$deletesource=false;
3228
-		$deletetarget=false;
3229
-
3230
-		if (! empty($sourceid) && ! empty($sourcetype) && empty($targetid) && empty($targettype)) $deletesource=true;
3231
-		else if (empty($sourceid) && empty($sourcetype) && ! empty($targetid) && ! empty($targettype)) $deletetarget=true;
3232
-
3233
-		$sourceid = (! empty($sourceid) ? $sourceid : $this->id);
3234
-		$sourcetype = (! empty($sourcetype) ? $sourcetype : $this->element);
3235
-		$targetid = (! empty($targetid) ? $targetid : $this->id);
3236
-		$targettype = (! empty($targettype) ? $targettype : $this->element);
3237
-
3238
-		$sql = "DELETE FROM ".MAIN_DB_PREFIX."element_element";
3239
-		$sql.= " WHERE";
3240
-		if ($rowid > 0)
3241
-		{
3242
-			$sql.=" rowid = ".$rowid;
3243
-		}
3244
-		else
3245
-		{
3246
-			if ($deletesource)
3247
-			{
3248
-				$sql.= " fk_source = ".$sourceid." AND sourcetype = '".$this->db->escape($sourcetype)."'";
3249
-				$sql.= " AND fk_target = ".$this->id." AND targettype = '".$this->db->escape($this->element)."'";
3250
-			}
3251
-			else if ($deletetarget)
3252
-			{
3253
-				$sql.= " fk_target = ".$targetid." AND targettype = '".$this->db->escape($targettype)."'";
3254
-				$sql.= " AND fk_source = ".$this->id." AND sourcetype = '".$this->db->escape($this->element)."'";
3255
-			}
3256
-			else
3257
-			{
3258
-				$sql.= " (fk_source = ".$this->id." AND sourcetype = '".$this->db->escape($this->element)."')";
3259
-				$sql.= " OR";
3260
-				$sql.= " (fk_target = ".$this->id." AND targettype = '".$this->db->escape($this->element)."')";
3261
-			}
3262
-		}
3263
-
3264
-		dol_syslog(get_class($this)."::deleteObjectLinked", LOG_DEBUG);
3265
-		if ($this->db->query($sql))
3266
-		{
3267
-			return 1;
3268
-		}
3269
-		else
3270
-		{
3271
-			$this->error=$this->db->lasterror();
3272
-			$this->errors[]=$this->error;
3273
-			return -1;
3274
-		}
3275
-	}
3276
-
3277
-	/**
3278
-	 *      Set status of an object
3279
-	 *
3280
-	 *      @param	int		$status			Status to set
3281
-	 *      @param	int		$elementId		Id of element to force (use this->id by default)
3282
-	 *      @param	string	$elementType	Type of element to force (use this->table_element by default)
3283
-	 *      @param	string	$trigkey		Trigger key to use for trigger
3284
-	 *      @return int						<0 if KO, >0 if OK
3285
-	 */
3286
-	function setStatut($status, $elementId=null, $elementType='', $trigkey='')
3287
-	{
3288
-		global $user,$langs,$conf;
3289
-
3290
-		$savElementId=$elementId;  // To be used later to know if we were using the method using the id of this or not.
3291
-
3292
-		$elementId = (!empty($elementId)?$elementId:$this->id);
3293
-		$elementTable = (!empty($elementType)?$elementType:$this->table_element);
3294
-
3295
-		$this->db->begin();
3296
-
3297
-		$fieldstatus="fk_statut";
3298
-		if ($elementTable == 'facture_rec') $fieldstatus="suspended";
3299
-		if ($elementTable == 'mailing') $fieldstatus="statut";
3300
-		if ($elementTable == 'cronjob') $fieldstatus="status";
3301
-		if ($elementTable == 'user') $fieldstatus="statut";
3302
-		if ($elementTable == 'expensereport') $fieldstatus="fk_statut";
3303
-		if ($elementTable == 'commande_fournisseur_dispatch') $fieldstatus="status";
3304
-
3305
-		$sql = "UPDATE ".MAIN_DB_PREFIX.$elementTable;
3306
-		$sql.= " SET ".$fieldstatus." = ".$status;
3307
-		// If status = 1 = validated, update also fk_user_valid
3308
-		if ($status == 1 && $elementTable == 'expensereport') $sql.=", fk_user_valid = ".$user->id;
3309
-		$sql.= " WHERE rowid=".$elementId;
3310
-
3311
-		dol_syslog(get_class($this)."::setStatut", LOG_DEBUG);
3312
-		if ($this->db->query($sql))
3313
-		{
3314
-			$error = 0;
3315
-
3316
-			// Try autoset of trigkey
3317
-			if (empty($trigkey))
3318
-			{
3319
-				if ($this->element == 'supplier_proposal' && $status == 2) $trigkey='SUPPLIER_PROPOSAL_SIGN';   // 2 = SupplierProposal::STATUS_SIGNED. Can't use constant into this generic class
3320
-				if ($this->element == 'supplier_proposal' && $status == 3) $trigkey='SUPPLIER_PROPOSAL_REFUSE'; // 3 = SupplierProposal::STATUS_REFUSED. Can't use constant into this generic class
3321
-				if ($this->element == 'supplier_proposal' && $status == 4) $trigkey='SUPPLIER_PROPOSAL_CLOSE';  // 4 = SupplierProposal::STATUS_CLOSED. Can't use constant into this generic class
3322
-				if ($this->element == 'fichinter' && $status == 3) $trigkey='FICHINTER_CLASSIFY_DONE';
3323
-				if ($this->element == 'fichinter' && $status == 2) $trigkey='FICHINTER_CLASSIFY_BILLED';
3324
-				if ($this->element == 'fichinter' && $status == 1) $trigkey='FICHINTER_CLASSIFY_UNBILLED';
3325
-			}
3326
-
3327
-			if ($trigkey)
3328
-			{
3329
-				// Appel des triggers
3330
-				include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php';
3331
-				$interface=new Interfaces($this->db);
3332
-				$result=$interface->run_triggers($trigkey,$this,$user,$langs,$conf);
3333
-				if ($result < 0) {
3334
-					$error++; $this->errors=$interface->errors;
3335
-				}
3336
-				// Fin appel triggers
3337
-			}
1130
+                $transkey="TypeContact_".$this->element."_".$source."_".$obj->code;
1131
+                $libelle_type=($langs->trans($transkey)!=$transkey ? $langs->trans($transkey) : $obj->libelle);
1132
+                if (empty($option)) $tab[$obj->rowid]=$libelle_type;
1133
+                else $tab[$obj->code]=$libelle_type;
1134
+                $i++;
1135
+            }
1136
+            return $tab;
1137
+        }
1138
+        else
1139
+        {
1140
+            $this->error=$this->db->lasterror();
1141
+            //dol_print_error($this->db);
1142
+            return null;
1143
+        }
1144
+    }
3338 1145
 
3339
-			if (! $error)
3340
-			{
3341
-				$this->db->commit();
1146
+    /**
1147
+     *      Return id of contacts for a source and a contact code.
1148
+     *      Example: contact client de facturation ('external', 'BILLING')
1149
+     *      Example: contact client de livraison ('external', 'SHIPPING')
1150
+     *      Example: contact interne suivi paiement ('internal', 'SALESREPFOLL')
1151
+     *
1152
+     *		@param	string	$source		'external' or 'internal'
1153
+     *		@param	string	$code		'BILLING', 'SHIPPING', 'SALESREPFOLL', ...
1154
+     *		@param	int		$status		limited to a certain status
1155
+     *      @return array       		List of id for such contacts
1156
+     */
1157
+    function getIdContact($source,$code,$status=0)
1158
+    {
1159
+        global $conf;
3342 1160
 
3343
-				if (empty($savElementId))    // If the element we update was $this (so $elementId is null)
3344
-				{
3345
-					$this->statut = $status;
3346
-					$this->status = $status;
3347
-				}
1161
+        $result=array();
1162
+        $i=0;
1163
+        //cas particulier pour les expeditions
1164
+        if($this->element=='shipping' && $this->origin_id != 0) {
1165
+            $id=$this->origin_id;
1166
+            $element='commande';
1167
+        } else if($this->element=='reception' && $this->origin_id != 0) {
1168
+            $id=$this->origin_id;
1169
+            $element='order_supplier';
1170
+        } else {
1171
+            $id=$this->id;
1172
+            $element=$this->element;
1173
+        }
3348 1174
 
3349
-				return 1;
3350
-			}
3351
-			else
3352
-			{
3353
-				$this->db->rollback();
3354
-				dol_syslog(get_class($this)."::setStatus ".$this->error,LOG_ERR);
3355
-				return -1;
3356
-			}
3357
-		}
3358
-		else
3359
-		{
3360
-			$this->error=$this->db->lasterror();
3361
-			$this->db->rollback();
3362
-			return -1;
3363
-		}
3364
-	}
3365
-
3366
-
3367
-	/**
3368
-	 *  Load type of canvas of an object if it exists
3369
-	 *
3370
-	 *  @param      int		$id     Record id
3371
-	 *  @param      string	$ref    Record ref
3372
-	 *  @return		int				<0 if KO, 0 if nothing done, >0 if OK
3373
-	 */
3374
-	function getCanvas($id=0,$ref='')
3375
-	{
3376
-		global $conf;
3377
-
3378
-		if (empty($id) && empty($ref)) return 0;
3379
-		if (! empty($conf->global->MAIN_DISABLE_CANVAS)) return 0;    // To increase speed. Not enabled by default.
3380
-
3381
-		// Clean parameters
3382
-		$ref = trim($ref);
3383
-
3384
-		$sql = "SELECT rowid, canvas";
3385
-		$sql.= " FROM ".MAIN_DB_PREFIX.$this->table_element;
3386
-		$sql.= " WHERE entity IN (".getEntity($this->element).")";
3387
-		if (! empty($id))  $sql.= " AND rowid = ".$id;
3388
-		if (! empty($ref)) $sql.= " AND ref = '".$this->db->escape($ref)."'";
3389
-
3390
-		$resql = $this->db->query($sql);
3391
-		if ($resql)
3392
-		{
3393
-			$obj = $this->db->fetch_object($resql);
3394
-			if ($obj)
3395
-			{
3396
-				$this->canvas   = $obj->canvas;
3397
-				return 1;
3398
-			}
3399
-			else return 0;
3400
-		}
3401
-		else
3402
-		{
3403
-			dol_print_error($this->db);
3404
-			return -1;
3405
-		}
3406
-	}
3407
-
3408
-
3409
-	/**
3410
-	 * 	Get special code of a line
3411
-	 *
3412
-	 * 	@param	int		$lineid		Id of line
3413
-	 * 	@return	int					Special code
3414
-	 */
3415
-	function getSpecialCode($lineid)
3416
-	{
3417
-		$sql = 'SELECT special_code FROM '.MAIN_DB_PREFIX.$this->table_element_line;
3418
-		$sql.= ' WHERE rowid = '.$lineid;
3419
-		$resql = $this->db->query($sql);
3420
-		if ($resql)
3421
-		{
3422
-			$row = $this->db->fetch_row($resql);
3423
-			return $row[0];
3424
-		}
3425
-	}
3426
-
3427
-	/**
3428
-	 *  Function to check if an object is used by others.
3429
-	 *  Check is done into this->childtables. There is no check into llx_element_element.
3430
-	 *
3431
-	 *  @param	int		$id			Force id of object
3432
-	 *  @return	int					<0 if KO, 0 if not used, >0 if already used
3433
-	 */
3434
-	function isObjectUsed($id=0)
3435
-	{
3436
-		global $langs;
3437
-
3438
-		if (empty($id)) $id=$this->id;
3439
-
3440
-		// Check parameters
3441
-		if (! isset($this->childtables) || ! is_array($this->childtables) || count($this->childtables) == 0)
3442
-		{
3443
-			dol_print_error('Called isObjectUsed on a class with property this->childtables not defined');
3444
-			return -1;
3445
-		}
3446
-
3447
-		$arraytoscan = $this->childtables;
3448
-		// For backward compatibility, we check if array is old format array('table1', 'table2', ...)
3449
-		$tmparray=array_keys($this->childtables);
3450
-		if (is_numeric($tmparray[0]))
3451
-		{
3452
-			$arraytoscan = array_flip($this->childtables);
3453
-		}
3454
-
3455
-		// Test if child exists
3456
-		$haschild=0;
3457
-		foreach($arraytoscan as $table => $elementname)
3458
-		{
3459
-			//print $id.'-'.$table.'-'.$elementname.'<br>';
3460
-			// Check if third party can be deleted
3461
-			$sql = "SELECT COUNT(*) as nb from ".MAIN_DB_PREFIX.$table;
3462
-			$sql.= " WHERE ".$this->fk_element." = ".$id;
3463
-			$resql=$this->db->query($sql);
3464
-			if ($resql)
3465
-			{
3466
-				$obj=$this->db->fetch_object($resql);
3467
-				if ($obj->nb > 0)
3468
-				{
3469
-					$langs->load("errors");
3470
-					//print 'Found into table '.$table.', type '.$langs->transnoentitiesnoconv($elementname).', haschild='.$haschild;
3471
-					$haschild += $obj->nb;
3472
-					if (is_numeric($elementname))	// old usage
3473
-					{
3474
-						$this->errors[]=$langs->trans("ErrorRecordHasAtLeastOneChildOfType", $table);
3475
-					}
3476
-					else	// new usage: $elementname=Translation key
3477
-					{
3478
-						$this->errors[]=$langs->trans("ErrorRecordHasAtLeastOneChildOfType", $langs->transnoentitiesnoconv($elementname));
3479
-					}
3480
-					break;    // We found at least one, we stop here
3481
-				}
3482
-			}
3483
-			else
3484
-			{
3485
-				$this->errors[]=$this->db->lasterror();
3486
-				return -1;
3487
-			}
3488
-		}
3489
-		if ($haschild > 0)
3490
-		{
3491
-			$this->errors[]="ErrorRecordHasChildren";
3492
-			return $haschild;
3493
-		}
3494
-		else return 0;
3495
-	}
3496
-
3497
-	/**
3498
-	 *  Function to say how many lines object contains
3499
-	 *
3500
-	 *	@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
3501
-	 *  @return	int						<0 if KO, 0 if no predefined products, nb of lines with predefined products if found
3502
-	 */
3503
-	function hasProductsOrServices($predefined=-1)
3504
-	{
3505
-		$nb=0;
3506
-
3507
-		foreach($this->lines as $key => $val)
3508
-		{
3509
-			$qualified=0;
3510
-			if ($predefined == -1) $qualified=1;
3511
-			if ($predefined == 1 && $val->fk_product > 0) $qualified=1;
3512
-			if ($predefined == 0 && $val->fk_product <= 0) $qualified=1;
3513
-			if ($predefined == 2 && $val->fk_product > 0 && $val->product_type==0) $qualified=1;
3514
-			if ($predefined == 3 && $val->fk_product > 0 && $val->product_type==1) $qualified=1;
3515
-			if ($qualified) $nb++;
3516
-		}
3517
-		dol_syslog(get_class($this).'::hasProductsOrServices we found '.$nb.' qualified lines of products/servcies');
3518
-		return $nb;
3519
-	}
3520
-
3521
-	/**
3522
-	 * Function that returns the total amount HT of discounts applied for all lines.
3523
-	 *
3524
-	 * @return 	float
3525
-	 */
3526
-	function getTotalDiscount()
3527
-	{
3528
-		$total_discount=0.00;
3529
-
3530
-		$sql = "SELECT subprice as pu_ht, qty, remise_percent, total_ht";
3531
-		$sql.= " FROM ".MAIN_DB_PREFIX.$this->table_element."det";
3532
-		$sql.= " WHERE ".$this->fk_element." = ".$this->id;
3533
-
3534
-		dol_syslog(get_class($this).'::getTotalDiscount', LOG_DEBUG);
3535
-		$resql = $this->db->query($sql);
3536
-		if ($resql)
3537
-		{
3538
-			$num=$this->db->num_rows($resql);
3539
-			$i=0;
3540
-			while ($i < $num)
3541
-			{
3542
-				$obj = $this->db->fetch_object($resql);
3543
-
3544
-				$pu_ht = $obj->pu_ht;
3545
-				$qty= $obj->qty;
3546
-				$total_ht = $obj->total_ht;
3547
-
3548
-				$total_discount_line = floatval(price2num(($pu_ht * $qty) - $total_ht, 'MT'));
3549
-				$total_discount += $total_discount_line;
3550
-
3551
-				$i++;
3552
-			}
3553
-		}
3554
-
3555
-		//print $total_discount; exit;
3556
-		return price2num($total_discount);
3557
-	}
3558
-
3559
-
3560
-	/**
3561
-	 * Return into unit=0, the calculated total of weight and volume of all lines * qty
3562
-	 * Calculate by adding weight and volume of each product line, so properties ->volume/volume_units/weight/weight_units must be loaded on line.
3563
-	 *
3564
-	 * @return  array                           array('weight'=>...,'volume'=>...)
3565
-	 */
3566
-	function getTotalWeightVolume()
3567
-	{
3568
-		$totalWeight = 0;
3569
-		$totalVolume = 0;
3570
-		// defined for shipment only
3571
-		$totalOrdered = '';
3572
-		// defined for shipment only
3573
-		$totalToShip = '';
3574
-
3575
-		foreach ($this->lines as $line)
3576
-		{
3577
-			if (isset($line->qty_asked))
3578
-			{
3579
-				if (empty($totalOrdered)) $totalOrdered=0;  // Avoid warning because $totalOrdered is ''
3580
-				$totalOrdered+=$line->qty_asked;    // defined for shipment only
3581
-			}
3582
-			if (isset($line->qty_shipped))
3583
-			{
3584
-				if (empty($totalToShip)) $totalToShip=0;    // Avoid warning because $totalToShip is ''
3585
-				$totalToShip+=$line->qty_shipped;   // defined for shipment only
3586
-            }else if ($line->element == 'commandefournisseurdispatch' && isset($line->qty))
1175
+        $sql = "SELECT ec.fk_socpeople";
1176
+        $sql.= " FROM ".MAIN_DB_PREFIX."element_contact as ec,";
1177
+        if ($source == 'internal') $sql.= " ".MAIN_DB_PREFIX."user as c,";
1178
+        if ($source == 'external') $sql.= " ".MAIN_DB_PREFIX."socpeople as c,";
1179
+        $sql.= " ".MAIN_DB_PREFIX."c_type_contact as tc";
1180
+        $sql.= " WHERE ec.element_id = ".$id;
1181
+        $sql.= " AND ec.fk_socpeople = c.rowid";
1182
+        if ($source == 'internal') $sql.= " AND c.entity IN (".getEntity('user').")";
1183
+        if ($source == 'external') $sql.= " AND c.entity IN (".getEntity('societe').")";
1184
+        $sql.= " AND ec.fk_c_type_contact = tc.rowid";
1185
+        $sql.= " AND tc.element = '".$element."'";
1186
+        $sql.= " AND tc.source = '".$source."'";
1187
+        $sql.= " AND tc.code = '".$code."'";
1188
+        $sql.= " AND tc.active = 1";
1189
+        if ($status) $sql.= " AND ec.statut = ".$status;
1190
+
1191
+        dol_syslog(get_class($this)."::getIdContact", LOG_DEBUG);
1192
+        $resql=$this->db->query($sql);
1193
+        if ($resql)
1194
+        {
1195
+            while ($obj = $this->db->fetch_object($resql))
3587 1196
             {
3588
-                if (empty($totalToShip)) $totalToShip=0;
3589
-                $totalToShip+=$line->qty;   // defined for reception only
3590
-			}
3591
-
3592
-			// Define qty, weight, volume, weight_units, volume_units
3593
-			if ($this->element == 'shipping') {
3594
-				// for shipments
3595
-				$qty = $line->qty_shipped ? $line->qty_shipped : 0;
3596
-			}
3597
-			else {
3598
-				$qty = $line->qty ? $line->qty : 0;
3599
-			}
3600
-
3601
-			$weight = $line->weight ? $line->weight : 0;
3602
-            ($weight==0 && !empty($line->product->weight))? $weight=$line->product->weight: 0;
3603
-			$volume = $line->volume ? $line->volume : 0;
3604
-			($volume==0 && !empty($line->product->volume))? $volume=$line->product->volume: 0;
3605
-
3606
-			$weight_units=$line->weight_units;
3607
-			($weight_units==0 && !empty($line->product->weight_units))? $weight_units=$line->product->weight_units: 0;
3608
-			$volume_units=$line->volume_units;
3609
-			($volume_units==0 && !empty($line->product->volume_units))? $volume_units=$line->product->volume_units: 0;
3610
-
3611
-			$weightUnit=0;
3612
-			$volumeUnit=0;
3613
-			if (! empty($weight_units)) $weightUnit = $weight_units;
3614
-			if (! empty($volume_units)) $volumeUnit = $volume_units;
3615
-
3616
-			if (empty($totalWeight)) $totalWeight=0;  // Avoid warning because $totalWeight is ''
3617
-			if (empty($totalVolume)) $totalVolume=0;  // Avoid warning because $totalVolume is ''
3618
-
3619
-			//var_dump($line->volume_units);
3620
-			if ($weight_units < 50)   // >50 means a standard unit (power of 10 of official unit), > 50 means an exotic unit (like inch)
3621
-			{
3622
-				$trueWeightUnit=pow(10, $weightUnit);
3623
-				$totalWeight += $weight * $qty * $trueWeightUnit;
3624
-			}
3625
-			else {
3626
-		if ($weight_units == 99) {
3627
-			// conversion 1 Pound = 0.45359237 KG
3628
-			$trueWeightUnit = 0.45359237;
3629
-			$totalWeight += $weight * $qty * $trueWeightUnit;
3630
-		} elseif ($weight_units == 98) {
3631
-			// conversion 1 Ounce = 0.0283495 KG
3632
-			$trueWeightUnit = 0.0283495;
3633
-			$totalWeight += $weight * $qty * $trueWeightUnit;
3634
-		}
3635
-		else
3636
-					$totalWeight += $weight * $qty;   // This may be wrong if we mix different units
3637
-			}
3638
-			if ($volume_units < 50)   // >50 means a standard unit (power of 10 of official unit), > 50 means an exotic unit (like inch)
3639
-			{
3640
-				//print $line->volume."x".$line->volume_units."x".($line->volume_units < 50)."x".$volumeUnit;
3641
-				$trueVolumeUnit=pow(10, $volumeUnit);
3642
-				//print $line->volume;
3643
-				$totalVolume += $volume * $qty * $trueVolumeUnit;
3644
-			}
3645
-			else
3646
-			{
3647
-				$totalVolume += $volume * $qty;   // This may be wrong if we mix different units
3648
-			}
3649
-		}
3650
-
3651
-		return array('weight'=>$totalWeight, 'volume'=>$totalVolume, 'ordered'=>$totalOrdered, 'toship'=>$totalToShip);
3652
-	}
3653
-
3654
-
3655
-	/**
3656
-	 *	Set extra parameters
3657
-	 *
3658
-	 *	@return	int      <0 if KO, >0 if OK
3659
-	 */
3660
-	function setExtraParameters()
3661
-	{
3662
-		$this->db->begin();
3663
-
3664
-		$extraparams = (! empty($this->extraparams) ? json_encode($this->extraparams) : null);
3665
-
3666
-		$sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
3667
-		$sql.= " SET extraparams = ".(! empty($extraparams) ? "'".$this->db->escape($extraparams)."'" : "null");
3668
-		$sql.= " WHERE rowid = ".$this->id;
3669
-
3670
-		dol_syslog(get_class($this)."::setExtraParameters", LOG_DEBUG);
3671
-		$resql = $this->db->query($sql);
3672
-		if (! $resql)
3673
-		{
3674
-			$this->error=$this->db->lasterror();
3675
-			$this->db->rollback();
3676
-			return -1;
3677
-		}
3678
-		else
3679
-		{
3680
-			$this->db->commit();
3681
-			return 1;
3682
-		}
3683
-	}
1197
+                $result[$i]=$obj->fk_socpeople;
1198
+                $i++;
1199
+            }
1200
+        }
1201
+        else
1202
+        {
1203
+            $this->error=$this->db->error();
1204
+            return null;
1205
+        }
3684 1206
 
1207
+        return $result;
1208
+    }
3685 1209
 
3686 1210
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
3687
-	/**
3688
-	 *    Return incoterms informations
3689
-	 *    TODO Use a cache for label get
3690
-	 *
3691
-	 *    @return	string	incoterms info
3692
-	 */
3693
-	function display_incoterms()
3694
-	{
1211
+    /**
1212
+     *		Load object contact with id=$this->contactid into $this->contact
1213
+     *
1214
+     *		@param	int		$contactid      Id du contact. Use this->contactid if empty.
1215
+     *		@return	int						<0 if KO, >0 if OK
1216
+     */
1217
+    function fetch_contact($contactid=null)
1218
+    {
3695 1219
         // phpcs:enable
3696
-		$out = '';
3697
-		$this->libelle_incoterms = '';
3698
-		if (!empty($this->fk_incoterms))
3699
-		{
3700
-			$sql = 'SELECT code FROM '.MAIN_DB_PREFIX.'c_incoterms WHERE rowid = '.(int) $this->fk_incoterms;
3701
-			$result = $this->db->query($sql);
3702
-			if ($result)
3703
-			{
3704
-				$res = $this->db->fetch_object($result);
3705
-				$out .= $res->code;
3706
-			}
3707
-		}
3708
-
3709
-		$out .= (($res->code && $this->location_incoterms)?' - ':'').$this->location_incoterms;
3710
-
3711
-		return $out;
3712
-	}
3713
-
3714
-	/**
3715
-	 *    Return incoterms informations for pdf display
3716
-	 *
3717
-	 *    @return	string		incoterms info
3718
-	 */
3719
-	function getIncotermsForPDF()
3720
-	{
3721
-		$sql = 'SELECT code FROM '.MAIN_DB_PREFIX.'c_incoterms WHERE rowid = '.(int) $this->fk_incoterms;
3722
-		$resql = $this->db->query($sql);
3723
-		if ($resql)
3724
-		{
3725
-			$num = $this->db->num_rows($resql);
3726
-			if ($num > 0)
3727
-			{
3728
-				$res = $this->db->fetch_object($resql);
3729
-				return 'Incoterm : '.$res->code.' - '.$this->location_incoterms;
3730
-			}
3731
-			else
3732
-			{
3733
-				return '';
3734
-			}
3735
-		}
3736
-		else
3737
-		{
3738
-			$this->errors[] = $this->db->lasterror();
3739
-			return false;
3740
-		}
3741
-	}
3742
-
3743
-	/**
3744
-	 *    Define incoterms values of current object
3745
-	 *
3746
-	 *    @param	int		$id_incoterm     Id of incoterm to set or '' to remove
3747
-	 * 	  @param 	string  $location		 location of incoterm
3748
-	 *    @return	int     		<0 if KO, >0 if OK
3749
-	 */
3750
-	function setIncoterms($id_incoterm, $location)
3751
-	{
3752
-		if ($this->id && $this->table_element)
3753
-		{
3754
-			$sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
3755
-			$sql.= " SET fk_incoterms = ".($id_incoterm > 0 ? $id_incoterm : "null");
3756
-			$sql.= ", location_incoterms = ".($id_incoterm > 0 ? "'".$this->db->escape($location)."'" : "null");
3757
-			$sql.= " WHERE rowid = " . $this->id;
3758
-			dol_syslog(get_class($this).'::setIncoterms', LOG_DEBUG);
3759
-			$resql=$this->db->query($sql);
3760
-			if ($resql)
3761
-			{
3762
-				$this->fk_incoterms = $id_incoterm;
3763
-				$this->location_incoterms = $location;
1220
+        if (empty($contactid)) $contactid=$this->contactid;
3764 1221
 
3765
-				$sql = 'SELECT libelle FROM '.MAIN_DB_PREFIX.'c_incoterms WHERE rowid = '.(int) $this->fk_incoterms;
3766
-				$res = $this->db->query($sql);
3767
-				if ($res)
3768
-				{
3769
-					$obj = $this->db->fetch_object($res);
3770
-					$this->libelle_incoterms = $obj->libelle;
3771
-				}
3772
-				return 1;
3773
-			}
3774
-			else
3775
-			{
3776
-				$this->errors[] = $this->db->lasterror();
3777
-				return -1;
3778
-			}
3779
-		}
3780
-		else return -1;
3781
-	}
3782
-
3783
-
3784
-	// --------------------
3785
-	// TODO: All functions here must be redesigned and moved as they are not business functions but output functions
3786
-	// --------------------
3787
-
3788
-	/* This is to show add lines */
3789
-
3790
-	/**
3791
-	 *	Show add free and predefined products/services form
3792
-	 *
3793
-	 *  @param	int		        $dateSelector       1=Show also date range input fields
3794
-	 *  @param	Societe			$seller				Object thirdparty who sell
3795
-	 *  @param	Societe			$buyer				Object thirdparty who buy
3796
-	 *	@return	void
3797
-	 */
3798
-	function formAddObjectLine($dateSelector, $seller, $buyer)
3799
-	{
3800
-		global $conf,$user,$langs,$object,$hookmanager;
3801
-		global $form,$bcnd,$var;
3802
-
3803
-		// Line extrafield
3804
-		require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
3805
-		$extrafieldsline = new ExtraFields($this->db);
3806
-		$extralabelslines=$extrafieldsline->fetch_name_optionals_label($this->table_element_line);
3807
-
3808
-		// Output template part (modules that overwrite templates must declare this into descriptor)
3809
-		// Use global variables + $dateSelector + $seller and $buyer
3810
-		$dirtpls=array_merge($conf->modules_parts['tpl'],array('/core/tpl'));
3811
-		foreach($dirtpls as $reldir)
3812
-		{
3813
-			$tpl = dol_buildpath($reldir.'/objectline_create.tpl.php');
3814
-			if (empty($conf->file->strict_mode)) {
3815
-				$res=@include $tpl;
3816
-			} else {
3817
-				$res=include $tpl; // for debug
3818
-			}
3819
-			if ($res) break;
3820
-		}
3821
-	}
3822
-
3823
-
3824
-
3825
-	/* This is to show array of line of details */
3826
-
3827
-
3828
-	/**
3829
-	 *	Return HTML table for object lines
3830
-	 *	TODO Move this into an output class file (htmlline.class.php)
3831
-	 *	If lines are into a template, title must also be into a template
3832
-	 *	But for the moment we don't know if it's possible as we keep a method available on overloaded objects.
3833
-	 *
3834
-	 *	@param	string		$action				Action code
3835
-	 *	@param  string		$seller            	Object of seller third party
3836
-	 *	@param  string  	$buyer             	Object of buyer third party
3837
-	 *	@param	int			$selected		   	Object line selected
3838
-	 *	@param  int	    	$dateSelector      	1=Show also date range input fields
3839
-	 *	@return	void
3840
-	 */
3841
-	function printObjectLines($action, $seller, $buyer, $selected=0, $dateSelector=0)
3842
-	{
3843
-		global $conf, $hookmanager, $langs, $user;
3844
-		// TODO We should not use global var for this !
3845
-		global $inputalsopricewithtax, $usemargins, $disableedit, $disablemove, $disableremove, $outputalsopricetotalwithtax;
3846
-
3847
-		// Define usemargins
3848
-		$usemargins=0;
3849
-		if (! empty($conf->margin->enabled) && ! empty($this->element) && in_array($this->element,array('facture','propal','commande'))) $usemargins=1;
3850
-
3851
-		$num = count($this->lines);
3852
-
3853
-		// Line extrafield
3854
-		require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
3855
-		$extrafieldsline = new ExtraFields($this->db);
3856
-		$extralabelslines=$extrafieldsline->fetch_name_optionals_label($this->table_element_line);
3857
-
3858
-		$parameters = array('num'=>$num,'i'=>$i,'dateSelector'=>$dateSelector,'seller'=>$seller,'buyer'=>$buyer,'selected'=>$selected, 'extrafieldsline'=>$extrafieldsline);
3859
-		$reshook = $hookmanager->executeHooks('printObjectLineTitle', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
3860
-		if (empty($reshook))
3861
-		{
3862
-			// Title line
3863
-		    print "<thead>\n";
3864
-
3865
-			print '<tr class="liste_titre nodrag nodrop">';
3866
-
3867
-			// Adds a line numbering column
3868
-			if (! empty($conf->global->MAIN_VIEW_LINE_NUMBER)) print '<td class="linecolnum" align="center" width="5">&nbsp;</td>';
3869
-
3870
-			// Description
3871
-			print '<td class="linecoldescription">'.$langs->trans('Description').'</td>';
3872
-
3873
-			if ($this->element == 'supplier_proposal' || $this->element == 'order_supplier' || $this->element == 'invoice_supplier')
3874
-			{
3875
-				print '<td class="linerefsupplier"><span id="title_fourn_ref">'.$langs->trans("SupplierRef").'</span></td>';
3876
-			}
1222
+        if (empty($contactid)) return 0;
3877 1223
 
3878
-			// VAT
3879
-			print '<td class="linecolvat" align="right" width="80">'.$langs->trans('VAT').'</td>';
1224
+        require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php';
1225
+        $contact = new Contact($this->db);
1226
+        $result=$contact->fetch($contactid);
1227
+        $this->contact = $contact;
1228
+        return $result;
1229
+    }
3880 1230
 
3881
-			// Price HT
3882
-			print '<td class="linecoluht" align="right" width="80">'.$langs->trans('PriceUHT').'</td>';
1231
+    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
1232
+    /**
1233
+     *    	Load the third party of object, from id $this->socid or $this->fk_soc, into this->thirdparty
1234
+     *
1235
+     *		@param		int		$force_thirdparty_id	Force thirdparty id
1236
+     *		@return		int								<0 if KO, >0 if OK
1237
+     */
1238
+    function fetch_thirdparty($force_thirdparty_id=0)
1239
+    {
1240
+        // phpcs:enable
1241
+        global $conf;
3883 1242
 
3884
-			// Multicurrency
3885
-			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>';
1243
+        if (empty($this->socid) && empty($this->fk_soc) && empty($this->fk_thirdparty) && empty($force_thirdparty_id))
1244
+            return 0;
3886 1245
 
3887
-			if ($inputalsopricewithtax) print '<td align="right" width="80">'.$langs->trans('PriceUTTC').'</td>';
1246
+        require_once DOL_DOCUMENT_ROOT . '/societe/class/societe.class.php';
3888 1247
 
3889
-			// Qty
3890
-			print '<td class="linecolqty" align="right">'.$langs->trans('Qty').'</td>';
1248
+        $idtofetch = isset($this->socid) ? $this->socid : (isset($this->fk_soc) ? $this->fk_soc : $this->fk_thirdparty);
1249
+        if ($force_thirdparty_id)
1250
+            $idtofetch = $force_thirdparty_id;
3891 1251
 
3892
-			if($conf->global->PRODUCT_USE_UNITS)
3893
-			{
3894
-				print '<td class="linecoluseunit" align="left">'.$langs->trans('Unit').'</td>';
3895
-			}
1252
+        if ($idtofetch) {
1253
+            $thirdparty = new Societe($this->db);
1254
+            $result = $thirdparty->fetch($idtofetch);
1255
+            $this->thirdparty = $thirdparty;
3896 1256
 
3897
-			// Reduction short
3898
-			print '<td class="linecoldiscount" align="right">'.$langs->trans('ReductionShort').'</td>';
1257
+            // Use first price level if level not defined for third party
1258
+            if (!empty($conf->global->PRODUIT_MULTIPRICES) && empty($this->thirdparty->price_level)) {
1259
+                $this->thirdparty->price_level = 1;
1260
+            }
3899 1261
 
3900
-			if ($this->situation_cycle_ref) {
3901
-				print '<td class="linecolcycleref" align="right">' . $langs->trans('Progress') . '</td>';
3902
-			}
1262
+            return $result;
1263
+        } else
1264
+            return -1;
1265
+    }
3903 1266
 
3904
-			if ($usemargins && ! empty($conf->margin->enabled) && empty($user->societe_id))
3905
-			{
3906
-				if (!empty($user->rights->margins->creer))
3907
-				{
3908
-					if ($conf->global->MARGIN_TYPE == "1")
3909
-						print '<td class="linecolmargin1 margininfos" align="right" width="80">'.$langs->trans('BuyingPrice').'</td>';
3910
-					else
3911
-						print '<td class="linecolmargin1 margininfos" align="right" width="80">'.$langs->trans('CostPrice').'</td>';
3912
-				}
3913 1267
 
3914
-				if (! empty($conf->global->DISPLAY_MARGIN_RATES) && $user->rights->margins->liretous)
3915
-					print '<td class="linecolmargin2 margininfos" align="right" width="50">'.$langs->trans('MarginRate').'</td>';
3916
-				if (! empty($conf->global->DISPLAY_MARK_RATES) && $user->rights->margins->liretous)
3917
-					print '<td class="linecolmargin2 margininfos" align="right" width="50">'.$langs->trans('MarkRate').'</td>';
3918
-			}
1268
+    /**
1269
+     * Looks for an object with ref matching the wildcard provided
1270
+     * It does only work when $this->table_ref_field is set
1271
+     *
1272
+     * @param string $ref Wildcard
1273
+     * @return int >1 = OK, 0 = Not found or table_ref_field not defined, <0 = KO
1274
+     */
1275
+    public function fetchOneLike($ref)
1276
+    {
1277
+        if (!$this->table_ref_field) {
1278
+            return 0;
1279
+        }
3919 1280
 
3920
-			// Total HT
3921
-			print '<td class="linecolht" align="right">'.$langs->trans('TotalHTShort').'</td>';
1281
+        $sql = 'SELECT rowid FROM '.MAIN_DB_PREFIX.$this->table_element.' WHERE '.$this->table_ref_field.' LIKE "'.$this->db->escape($ref).'" LIMIT 1';
3922 1282
 
3923
-			// Multicurrency
3924
-			if (!empty($conf->multicurrency->enabled) && $this->multicurrency_code != $conf->currency) print '<td class="linecoltotalht_currency" align="right">'.$langs->trans('TotalHTShortCurrency', $this->multicurrency_code).'</td>';
1283
+        $query = $this->db->query($sql);
3925 1284
 
3926
-			if ($outputalsopricetotalwithtax) print '<td align="right" width="80">'.$langs->trans('TotalTTCShort').'</td>';
1285
+        if (!$this->db->num_rows($query)) {
1286
+            return 0;
1287
+        }
3927 1288
 
3928
-			print '<td class="linecoledit"></td>';  // No width to allow autodim
1289
+        $result = $this->db->fetch_object($query);
3929 1290
 
3930
-			print '<td class="linecoldelete" width="10"></td>';
1291
+        return $this->fetch($result->rowid);
1292
+    }
3931 1293
 
3932
-			print '<td class="linecolmove" width="10"></td>';
1294
+    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
1295
+    /**
1296
+     *	Load data for barcode into properties ->barcode_type*
1297
+     *	Properties ->barcode_type that is id of barcode. Type is used to find other properties, but
1298
+     *  if it is not defined, ->element must be defined to know default barcode type.
1299
+     *
1300
+     *	@return		int			<0 if KO, 0 if can't guess type of barcode (ISBN, EAN13...), >0 if OK (all barcode properties loaded)
1301
+     */
1302
+    function fetch_barcode()
1303
+    {
1304
+        // phpcs:enable
1305
+        global $conf;
3933 1306
 
3934
-			if($action == 'selectlines')
3935
-			{
3936
-			    print '<td class="linecolcheckall" align="center">';
3937
-			    print '<input type="checkbox" class="linecheckboxtoggle" />';
3938
-			    print '<script type="text/javascript">$(document).ready(function() {$(".linecheckboxtoggle").click(function() {var checkBoxes = $(".linecheckbox");checkBoxes.prop("checked", this.checked);})});</script>';
3939
-			    print '</td>';
3940
-			}
3941
-
3942
-			print "</tr>\n";
3943
-			print "</thead>\n";
3944
-		}
3945
-
3946
-		$var = true;
3947
-		$i	 = 0;
3948
-
3949
-		print "<tbody>\n";
3950
-		foreach ($this->lines as $line)
3951
-		{
3952
-			//Line extrafield
3953
-			$line->fetch_optionals();
3954
-
3955
-			//if (is_object($hookmanager) && (($line->product_type == 9 && ! empty($line->special_code)) || ! empty($line->fk_parent_line)))
3956
-			if (is_object($hookmanager))   // Old code is commented on preceding line.
3957
-			{
3958
-				if (empty($line->fk_parent_line))
3959
-				{
3960
-					$parameters = array('line'=>$line,'var'=>$var,'num'=>$num,'i'=>$i,'dateSelector'=>$dateSelector,'seller'=>$seller,'buyer'=>$buyer,'selected'=>$selected, 'extrafieldsline'=>$extrafieldsline);
3961
-					$reshook = $hookmanager->executeHooks('printObjectLine', $parameters, $this, $action);    // Note that $action and $object may have been modified by some hooks
3962
-				}
3963
-				else
3964
-				{
3965
-					$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);
3966
-					$reshook = $hookmanager->executeHooks('printObjectSubLine', $parameters, $this, $action);    // Note that $action and $object may have been modified by some hooks
3967
-				}
3968
-			}
3969
-			if (empty($reshook))
3970
-			{
3971
-				$this->printObjectLine($action,$line,$var,$num,$i,$dateSelector,$seller,$buyer,$selected,$extrafieldsline);
3972
-			}
3973
-
3974
-			$i++;
3975
-		}
3976
-		print "</tbody>\n";
3977
-	}
3978
-
3979
-	/**
3980
-	 *	Return HTML content of a detail line
3981
-	 *	TODO Move this into an output class file (htmlline.class.php)
3982
-	 *
3983
-	 *	@param	string		$action				GET/POST action
3984
-	 *	@param CommonObjectLine $line		       	Selected object line to output
3985
-	 *	@param  string	    $var               	Is it a an odd line (true)
3986
-	 *	@param  int		    $num               	Number of line (0)
3987
-	 *	@param  int		    $i					I
3988
-	 *	@param  int		    $dateSelector      	1=Show also date range input fields
3989
-	 *	@param  string	    $seller            	Object of seller third party
3990
-	 *	@param  string	    $buyer             	Object of buyer third party
3991
-	 *	@param	int			$selected		   	Object line selected
3992
-	 *  @param  int			$extrafieldsline	Object of extrafield line attribute
3993
-	 *	@return	void
3994
-	 */
3995
-	function printObjectLine($action,$line,$var,$num,$i,$dateSelector,$seller,$buyer,$selected=0,$extrafieldsline=0)
3996
-	{
3997
-		global $conf,$langs,$user,$object,$hookmanager;
3998
-		global $form,$bc,$bcdd;
3999
-		global $object_rights, $disableedit, $disablemove, $disableremove;   // TODO We should not use global var for this !
4000
-
4001
-		$object_rights = $this->getRights();
4002
-
4003
-		$element=$this->element;
4004
-
4005
-		$text=''; $description=''; $type=0;
4006
-
4007
-		// Show product and description
4008
-		$type=(! empty($line->product_type)?$line->product_type:$line->fk_product_type);
4009
-		// Try to enhance type detection using date_start and date_end for free lines where type was not saved.
4010
-		if (! empty($line->date_start)) $type=1; // deprecated
4011
-		if (! empty($line->date_end)) $type=1; // deprecated
4012
-
4013
-		// Ligne en mode visu
4014
-		if ($action != 'editline' || $selected != $line->id)
4015
-		{
4016
-			// Product
4017
-			if ($line->fk_product > 0)
4018
-			{
4019
-				$product_static = new Product($this->db);
4020
-				$product_static->fetch($line->fk_product);
1307
+        dol_syslog(get_class($this).'::fetch_barcode this->element='.$this->element.' this->barcode_type='.$this->barcode_type);
4021 1308
 
4022
-				$product_static->ref = $line->ref; //can change ref in hook
4023
-				$product_static->label = $line->label; //can change label in hook
4024
-				$text=$product_static->getNomUrl(1);
1309
+        $idtype=$this->barcode_type;
1310
+        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
1311
+        {
1312
+            if ($this->element == 'product')      $idtype = $conf->global->PRODUIT_DEFAULT_BARCODE_TYPE;
1313
+            else if ($this->element == 'societe') $idtype = $conf->global->GENBARCODE_BARCODETYPE_THIRDPARTY;
1314
+            else dol_syslog('Call fetch_barcode with barcode_type not defined and cant be guessed', LOG_WARNING);
1315
+        }
4025 1316
 
4026
-				// Define output language and label
4027
-				if (! empty($conf->global->MAIN_MULTILANGS))
4028
-				{
4029
-					if (! is_object($this->thirdparty))
4030
-					{
4031
-						dol_print_error('','Error: Method printObjectLine was called on an object and object->fetch_thirdparty was not done before');
4032
-						return;
4033
-					}
4034
-
4035
-					$prod = new Product($this->db);
4036
-					$prod->fetch($line->fk_product);
4037
-
4038
-					$outputlangs = $langs;
4039
-					$newlang='';
4040
-					if (empty($newlang) && GETPOST('lang_id','aZ09')) $newlang=GETPOST('lang_id','aZ09');
4041
-					if (! empty($conf->global->PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE) && empty($newlang)) $newlang=$this->thirdparty->default_lang;		// For language to language of customer
4042
-					if (! empty($newlang))
4043
-					{
4044
-						$outputlangs = new Translate("",$conf);
4045
-						$outputlangs->setDefaultLang($newlang);
4046
-					}
4047
-
4048
-					$label = (! empty($prod->multilangs[$outputlangs->defaultlang]["label"])) ? $prod->multilangs[$outputlangs->defaultlang]["label"] : $line->product_label;
4049
-				}
4050
-				else
4051
-				{
4052
-					$label = $line->product_label;
4053
-				}
1317
+        if ($idtype > 0)
1318
+        {
1319
+            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
1320
+            {
1321
+                $sql = "SELECT rowid, code, libelle as label, coder";
1322
+                $sql.= " FROM ".MAIN_DB_PREFIX."c_barcode_type";
1323
+                $sql.= " WHERE rowid = ".$idtype;
1324
+                dol_syslog(get_class($this).'::fetch_barcode', LOG_DEBUG);
1325
+                $resql = $this->db->query($sql);
1326
+                if ($resql)
1327
+                {
1328
+                    $obj = $this->db->fetch_object($resql);
1329
+                    $this->barcode_type       = $obj->rowid;
1330
+                    $this->barcode_type_code  = $obj->code;
1331
+                    $this->barcode_type_label = $obj->label;
1332
+                    $this->barcode_type_coder = $obj->coder;
1333
+                    return 1;
1334
+                }
1335
+                else
1336
+                {
1337
+                    dol_print_error($this->db);
1338
+                    return -1;
1339
+                }
1340
+            }
1341
+        }
1342
+        return 0;
1343
+    }
4054 1344
 
4055
-				$text.= ' - '.(! empty($line->label)?$line->label:$label);
4056
-				$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.
4057
-			}
1345
+    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
1346
+    /**
1347
+     *		Load the project with id $this->fk_project into this->project
1348
+     *
1349
+     *		@return		int			<0 if KO, >=0 if OK
1350
+     */
1351
+    function fetch_projet()
1352
+    {
1353
+        // phpcs:enable
1354
+        include_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
4058 1355
 
4059
-			$line->pu_ttc = price2num($line->subprice * (1 + ($line->tva_tx/100)), 'MU');
1356
+        if (empty($this->fk_project) && ! empty($this->fk_projet)) $this->fk_project = $this->fk_projet;	// For backward compatibility
1357
+        if (empty($this->fk_project)) return 0;
4060 1358
 
4061
-			// Output template part (modules that overwrite templates must declare this into descriptor)
4062
-			// Use global variables + $dateSelector + $seller and $buyer
4063
-			$dirtpls=array_merge($conf->modules_parts['tpl'],array('/core/tpl'));
4064
-			foreach($dirtpls as $reldir)
4065
-			{
4066
-				$tpl = dol_buildpath($reldir.'/objectline_view.tpl.php');
4067
-				if (empty($conf->file->strict_mode)) {
4068
-					$res=@include $tpl;
4069
-				} else {
4070
-					$res=include $tpl; // for debug
4071
-				}
4072
-				if ($res) break;
4073
-			}
4074
-		}
4075
-
4076
-		// Ligne en mode update
4077
-		if ($this->statut == 0 && $action == 'editline' && $selected == $line->id)
4078
-		{
4079
-			$label = (! empty($line->label) ? $line->label : (($line->fk_product > 0) ? $line->product_label : ''));
4080
-			$placeholder=' placeholder="'.$langs->trans("Label").'"';
4081
-
4082
-			$line->pu_ttc = price2num($line->subprice * (1 + ($line->tva_tx/100)), 'MU');
4083
-
4084
-			// Output template part (modules that overwrite templates must declare this into descriptor)
4085
-			// Use global variables + $dateSelector + $seller and $buyer
4086
-			$dirtpls=array_merge($conf->modules_parts['tpl'],array('/core/tpl'));
4087
-			foreach($dirtpls as $reldir)
4088
-			{
4089
-				$tpl = dol_buildpath($reldir.'/objectline_edit.tpl.php');
4090
-				if (empty($conf->file->strict_mode)) {
4091
-					$res=@include $tpl;
4092
-				} else {
4093
-					$res=include $tpl; // for debug
4094
-				}
4095
-				if ($res) break;
4096
-			}
4097
-		}
4098
-	}
4099
-
4100
-
4101
-	/* This is to show array of line of details of source object */
4102
-
4103
-
4104
-	/**
4105
-	 * 	Return HTML table table of source object lines
4106
-	 *  TODO Move this and previous function into output html class file (htmlline.class.php).
4107
-	 *  If lines are into a template, title must also be into a template
4108
-	 *  But for the moment we don't know if it's possible, so we keep the method available on overloaded objects.
4109
-	 *
4110
-	 *	@param	string		$restrictlist		''=All lines, 'services'=Restrict to services only
4111
-	 *  @return	void
4112
-	 */
4113
-	function printOriginLinesList($restrictlist='')
4114
-	{
4115
-		global $langs, $hookmanager, $conf;
4116
-
4117
-		print '<tr class="liste_titre">';
4118
-		print '<td>'.$langs->trans('Ref').'</td>';
4119
-		print '<td>'.$langs->trans('Description').'</td>';
4120
-		print '<td align="right">'.$langs->trans('VATRate').'</td>';
4121
-		print '<td align="right">'.$langs->trans('PriceUHT').'</td>';
4122
-		if (!empty($conf->multicurrency->enabled)) print '<td align="right">'.$langs->trans('PriceUHTCurrency').'</td>';
4123
-		print '<td align="right">'.$langs->trans('Qty').'</td>';
4124
-		if($conf->global->PRODUCT_USE_UNITS)
4125
-		{
4126
-			print '<td align="left">'.$langs->trans('Unit').'</td>';
4127
-		}
4128
-		print '<td align="right">'.$langs->trans('ReductionShort').'</td></tr>';
4129
-
4130
-		$var = true;
4131
-		$i	 = 0;
4132
-
4133
-		if (! empty($this->lines))
4134
-		{
4135
-			foreach ($this->lines as $line)
4136
-			{
4137
-				if (is_object($hookmanager) && (($line->product_type == 9 && ! empty($line->special_code)) || ! empty($line->fk_parent_line)))
4138
-				{
4139
-					if (empty($line->fk_parent_line))
4140
-					{
4141
-						$parameters=array('line'=>$line,'var'=>$var,'i'=>$i);
4142
-						$action='';
4143
-						$hookmanager->executeHooks('printOriginObjectLine',$parameters,$this,$action);    // Note that $action and $object may have been modified by some hooks
4144
-					}
4145
-				}
4146
-				else
4147
-				{
4148
-					$this->printOriginLine($line, $var, $restrictlist);
4149
-				}
1359
+        $project = new Project($this->db);
1360
+        $result = $project->fetch($this->fk_project);
4150 1361
 
4151
-				$i++;
4152
-			}
4153
-		}
4154
-	}
4155
-
4156
-	/**
4157
-	 * 	Return HTML with a line of table array of source object lines
4158
-	 *  TODO Move this and previous function into output html class file (htmlline.class.php).
4159
-	 *  If lines are into a template, title must also be into a template
4160
-	 *  But for the moment we don't know if it's possible as we keep a method available on overloaded objects.
4161
-	 *
4162
-	 * 	@param	CommonObjectLine	$line				Line
4163
-	 * 	@param	string				$var				Var
4164
-	 *	@param	string				$restrictlist		''=All lines, 'services'=Restrict to services only (strike line if not)
4165
-	 * 	@return	void
4166
-	 */
4167
-	function printOriginLine($line, $var, $restrictlist='')
4168
-	{
4169
-		global $langs, $conf;
4170
-
4171
-		//var_dump($line);
4172
-		if (!empty($line->date_start))
4173
-		{
4174
-			$date_start=$line->date_start;
4175
-		}
4176
-		else
4177
-		{
4178
-			$date_start=$line->date_debut_prevue;
4179
-			if ($line->date_debut_reel) $date_start=$line->date_debut_reel;
4180
-		}
4181
-		if (!empty($line->date_end))
4182
-		{
4183
-			$date_end=$line->date_end;
4184
-		}
4185
-		else
4186
-		{
4187
-			$date_end=$line->date_fin_prevue;
4188
-			if ($line->date_fin_reel) $date_end=$line->date_fin_reel;
4189
-		}
4190
-
4191
-		$this->tpl['label'] = '';
4192
-		if (! empty($line->fk_parent_line)) $this->tpl['label'].= img_picto('', 'rightarrow');
4193
-
4194
-		if (($line->info_bits & 2) == 2)  // TODO Not sure this is used for source object
4195
-		{
4196
-			$discount=new DiscountAbsolute($this->db);
4197
-			$discount->fk_soc = $this->socid;
4198
-			$this->tpl['label'].= $discount->getNomUrl(0,'discount');
4199
-		}
4200
-		else if (! empty($line->fk_product))
4201
-		{
4202
-			$productstatic = new Product($this->db);
4203
-			$productstatic->id = $line->fk_product;
4204
-			$productstatic->ref = $line->ref;
4205
-			$productstatic->type = $line->fk_product_type;
4206
-            if(empty($productstatic->ref)){
4207
-				$line->fetch_product();
4208
-				$productstatic = $line->product;
4209
-			}
4210
-			
4211
-			$this->tpl['label'].= $productstatic->getNomUrl(1);
4212
-			$this->tpl['label'].= ' - '.(! empty($line->label)?$line->label:$line->product_label);
4213
-			// Dates
4214
-			if ($line->product_type == 1 && ($date_start || $date_end))
4215
-			{
4216
-				$this->tpl['label'].= get_date_range($date_start,$date_end);
4217
-			}
4218
-		}
4219
-		else
4220
-		{
4221
-			$this->tpl['label'].= ($line->product_type == -1 ? '&nbsp;' : ($line->product_type == 1 ? img_object($langs->trans(''),'service') : img_object($langs->trans(''),'product')));
4222
-			if (!empty($line->desc)) {
4223
-				$this->tpl['label'].=$line->desc;
4224
-			}else {
4225
-				$this->tpl['label'].= ($line->label ? '&nbsp;'.$line->label : '');
4226
-			}
4227
-			
4228
-			// Dates
4229
-			if ($line->product_type == 1 && ($date_start || $date_end))
4230
-			{
4231
-				$this->tpl['label'].= get_date_range($date_start,$date_end);
4232
-			}
4233
-		}
1362
+        $this->projet = $project;	// deprecated
1363
+        $this->project = $project;
1364
+        return $result;
1365
+    }
4234 1366
 
4235
-		if (! empty($line->desc))
4236
-		{
4237
-			if ($line->desc == '(CREDIT_NOTE)')  // TODO Not sure this is used for source object
4238
-			{
4239
-				$discount=new DiscountAbsolute($this->db);
4240
-				$discount->fetch($line->fk_remise_except);
4241
-				$this->tpl['description'] = $langs->transnoentities("DiscountFromCreditNote",$discount->getNomUrl(0));
4242
-			}
4243
-			elseif ($line->desc == '(DEPOSIT)')  // TODO Not sure this is used for source object
4244
-			{
4245
-				$discount=new DiscountAbsolute($this->db);
4246
-				$discount->fetch($line->fk_remise_except);
4247
-				$this->tpl['description'] = $langs->transnoentities("DiscountFromDeposit",$discount->getNomUrl(0));
4248
-			}
4249
-			elseif ($line->desc == '(EXCESS RECEIVED)')
4250
-			{
4251
-				$discount=new DiscountAbsolute($this->db);
4252
-				$discount->fetch($line->fk_remise_except);
4253
-				$this->tpl['description'] = $langs->transnoentities("DiscountFromExcessReceived",$discount->getNomUrl(0));
4254
-			}
4255
-			elseif ($line->desc == '(EXCESS PAID)')
4256
-			{
4257
-				$discount=new DiscountAbsolute($this->db);
4258
-				$discount->fetch($line->fk_remise_except);
4259
-				$this->tpl['description'] = $langs->transnoentities("DiscountFromExcessPaid",$discount->getNomUrl(0));
4260
-			}
4261
-			else
4262
-			{
4263
-				$this->tpl['description'] = dol_trunc($line->desc,60);
4264
-			}
4265
-		}
4266
-		else
4267
-		{
4268
-			$this->tpl['description'] = '&nbsp;';
4269
-		}
1367
+    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
1368
+    /**
1369
+     *		Load the product with id $this->fk_product into this->product
1370
+     *
1371
+     *		@return		int			<0 if KO, >=0 if OK
1372
+     */
1373
+    function fetch_product()
1374
+    {
1375
+        // phpcs:enable
1376
+        include_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
4270 1377
 
4271
-        // VAT Rate
4272
-        $this->tpl['vat_rate'] = vatrate($line->tva_tx, true);
4273
-        $this->tpl['vat_rate'] .= (($line->info_bits & 1) == 1) ? '*' : '';
4274
-        if (! empty($line->vat_src_code) && ! preg_match('/\(/', $this->tpl['vat_rate'])) $this->tpl['vat_rate'].=' ('.$line->vat_src_code.')';
1378
+        if (empty($this->fk_product)) return 0;
4275 1379
 
4276
-		$this->tpl['price'] = price($line->subprice);
4277
-		$this->tpl['multicurrency_price'] = price($line->multicurrency_subprice);
4278
-		$this->tpl['qty'] = (($line->info_bits & 2) != 2) ? $line->qty : '&nbsp;';
4279
-		if ($conf->global->PRODUCT_USE_UNITS) $this->tpl['unit'] = $langs->transnoentities($line->getLabelOfUnit('long'));
4280
-		$this->tpl['remise_percent'] = (($line->info_bits & 2) != 2) ? vatrate($line->remise_percent, true) : '&nbsp;';
4281
-
4282
-		// Is the line strike or not
4283
-		$this->tpl['strike']=0;
4284
-		if ($restrictlist == 'services' && $line->product_type != Product::TYPE_SERVICE) $this->tpl['strike']=1;
4285
-
4286
-		// Output template part (modules that overwrite templates must declare this into descriptor)
4287
-		// Use global variables + $dateSelector + $seller and $buyer
4288
-		$dirtpls=array_merge($conf->modules_parts['tpl'],array('/core/tpl'));
4289
-		foreach($dirtpls as $reldir)
4290
-		{
4291
-			$tpl = dol_buildpath($reldir.'/originproductline.tpl.php');
4292
-			if (empty($conf->file->strict_mode)) {
4293
-				$res=@include $tpl;
4294
-			} else {
4295
-				$res=include $tpl; // for debug
4296
-			}
4297
-			if ($res) break;
4298
-		}
4299
-	}
1380
+        $product = new Product($this->db);
1381
+        $result = $product->fetch($this->fk_product);
4300 1382
 
1383
+        $this->product = $product;
1384
+        return $result;
1385
+    }
4301 1386
 
4302 1387
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
4303
-	/**
4304
-	 *	Add resources to the current object : add entry into llx_element_resources
4305
-	 *	Need $this->element & $this->id
4306
-	 *
4307
-	 *	@param		int		$resource_id		Resource id
4308
-	 *	@param		string	$resource_type		'resource'
4309
-	 *	@param		int		$busy				Busy or not
4310
-	 *	@param		int		$mandatory			Mandatory or not
4311
-	 *	@return		int							<=0 if KO, >0 if OK
4312
-	 */
4313
-	function add_element_resource($resource_id, $resource_type, $busy=0, $mandatory=0)
4314
-	{
1388
+    /**
1389
+     *		Load the user with id $userid into this->user
1390
+     *
1391
+     *		@param	int		$userid 		Id du contact
1392
+     *		@return	int						<0 if KO, >0 if OK
1393
+     */
1394
+    function fetch_user($userid)
1395
+    {
4315 1396
         // phpcs:enable
4316
-		$this->db->begin();
4317
-
4318
-		$sql = "INSERT INTO ".MAIN_DB_PREFIX."element_resources (";
4319
-		$sql.= "resource_id";
4320
-		$sql.= ", resource_type";
4321
-		$sql.= ", element_id";
4322
-		$sql.= ", element_type";
4323
-		$sql.= ", busy";
4324
-		$sql.= ", mandatory";
4325
-		$sql.= ") VALUES (";
4326
-		$sql.= $resource_id;
4327
-		$sql.= ", '".$this->db->escape($resource_type)."'";
4328
-		$sql.= ", '".$this->db->escape($this->id)."'";
4329
-		$sql.= ", '".$this->db->escape($this->element)."'";
4330
-		$sql.= ", '".$this->db->escape($busy)."'";
4331
-		$sql.= ", '".$this->db->escape($mandatory)."'";
4332
-		$sql.= ")";
4333
-
4334
-		dol_syslog(get_class($this)."::add_element_resource", LOG_DEBUG);
4335
-		if ($this->db->query($sql))
4336
-		{
4337
-			$this->db->commit();
4338
-			return 1;
4339
-		}
4340
-		else
4341
-		{
4342
-			$this->error=$this->db->lasterror();
4343
-			$this->db->rollback();
4344
-			return  0;
4345
-		}
4346
-	}
1397
+        $user = new User($this->db);
1398
+        $result=$user->fetch($userid);
1399
+        $this->user = $user;
1400
+        return $result;
1401
+    }
4347 1402
 
4348 1403
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
4349
-	/**
4350
-	 *    Delete a link to resource line
4351
-	 *
4352
-	 *    @param	int		$rowid			Id of resource line to delete
4353
-	 *    @param	int		$element		element name (for trigger) TODO: use $this->element into commonobject class
4354
-	 *    @param	int		$notrigger		Disable all triggers
4355
-	 *    @return   int						>0 if OK, <0 if KO
4356
-	 */
4357
-	function delete_resource($rowid, $element, $notrigger=0)
4358
-	{
1404
+    /**
1405
+     *	Read linked origin object
1406
+     *
1407
+     *	@return		void
1408
+     */
1409
+    function fetch_origin()
1410
+    {
4359 1411
         // phpcs:enable
4360
-		global $user;
4361
-
4362
-		$this->db->begin();
4363
-
4364
-		$sql = "DELETE FROM ".MAIN_DB_PREFIX."element_resources";
4365
-		$sql.= " WHERE rowid=".$rowid;
1412
+        if ($this->origin == 'shipping') $this->origin = 'expedition';
1413
+        if ($this->origin == 'delivery') $this->origin = 'livraison';
1414
+        if ($this->origin == 'order_supplier') $this->origin = 'commandeFournisseur';
4366 1415
 
4367
-		dol_syslog(get_class($this)."::delete_resource", LOG_DEBUG);
1416
+        $origin = $this->origin;
4368 1417
 
4369
-		$resql=$this->db->query($sql);
4370
-		if (! $resql)
4371
-		{
4372
-			$this->error=$this->db->lasterror();
4373
-			$this->db->rollback();
4374
-			return -1;
4375
-		}
4376
-		else
4377
-		{
4378
-			if (! $notrigger)
4379
-			{
4380
-				$result=$this->call_trigger(strtoupper($element).'_DELETE_RESOURCE', $user);
4381
-				if ($result < 0) { $this->db->rollback(); return -1; }
4382
-			}
4383
-			$this->db->commit();
4384
-			return 1;
4385
-		}
4386
-	}
4387
-
4388
-
4389
-	/**
4390
-	 * Overwrite magic function to solve problem of cloning object that are kept as references
4391
-	 *
4392
-	 * @return void
4393
-	 */
4394
-	function __clone()
4395
-	{
4396
-		// Force a copy of this->lines, otherwise it will point to same object.
4397
-		if (isset($this->lines) && is_array($this->lines))
4398
-		{
4399
-			$nboflines=count($this->lines);
4400
-			for($i=0; $i < $nboflines; $i++)
4401
-			{
4402
-				$this->lines[$i] = clone $this->lines[$i];
4403
-			}
4404
-		}
4405
-	}
4406
-
4407
-	/**
4408
-	 * Common function for all objects extending CommonObject for generating documents
4409
-	 *
4410
-	 * @param 	string 		$modelspath 	Relative folder where generators are placed
4411
-	 * @param 	string 		$modele 		Generator to use. Caller must set it to obj->modelpdf or GETPOST('modelpdf') for example.
4412
-	 * @param 	Translate 	$outputlangs 	Output language to use
4413
-	 * @param 	int 		$hidedetails 	1 to hide details. 0 by default
4414
-	 * @param 	int 		$hidedesc 		1 to hide product description. 0 by default
4415
-	 * @param 	int 		$hideref 		1 to hide product reference. 0 by default
4416
-	 * @param   null|array  $moreparams     Array to provide more information
4417
-	 * @return 	int 						>0 if OK, <0 if KO
4418
-	 * @see	addFileIntoDatabaseIndex
4419
-	 */
4420
-	protected function commonGenerateDocument($modelspath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams=null)
4421
-	{
4422
-		global $conf, $langs, $user;
4423
-
4424
-		$srctemplatepath='';
4425
-
4426
-		// Increase limit for PDF build
4427
-		$err=error_reporting();
4428
-		error_reporting(0);
4429
-		@set_time_limit(120);
4430
-		error_reporting($err);
4431
-
4432
-		// If selected model is a filename template (then $modele="modelname" or "modelname:filename")
4433
-		$tmp=explode(':',$modele,2);
4434
-		if (! empty($tmp[1]))
4435
-		{
4436
-			$modele=$tmp[0];
4437
-			$srctemplatepath=$tmp[1];
4438
-		}
4439
-
4440
-		// Search template files
4441
-		$file=''; $classname=''; $filefound=0;
4442
-		$dirmodels=array('/');
4443
-		if (is_array($conf->modules_parts['models'])) $dirmodels=array_merge($dirmodels,$conf->modules_parts['models']);
4444
-		foreach($dirmodels as $reldir)
4445
-		{
4446
-			foreach(array('doc','pdf') as $prefix)
4447
-			{
4448
-				if (in_array(get_class($this), array('Adherent'))) $file = $prefix."_".$modele.".class.php";     // Member module use prefix_module.class.php
4449
-				else $file = $prefix."_".$modele.".modules.php";
1418
+        $classname = ucfirst($origin);
1419
+        $this->$origin = new $classname($this->db);
1420
+        $this->$origin->fetch($this->origin_id);
1421
+    }
4450 1422
 
4451
-				// On verifie l'emplacement du modele
4452
-				$file=dol_buildpath($reldir.$modelspath.$file,0);
4453
-				if (file_exists($file))
4454
-				{
4455
-					$filefound=1;
4456
-					$classname=$prefix.'_'.$modele;
4457
-					break;
4458
-				}
4459
-			}
4460
-			if ($filefound) break;
4461
-		}
1423
+    /**
1424
+     *  Load object from specific field
1425
+     *
1426
+     *  @param	string	$table		Table element or element line
1427
+     *  @param	string	$field		Field selected
1428
+     *  @param	string	$key		Import key
1429
+     *  @param	string	$element	Element name
1430
+     *	@return	int					<0 if KO, >0 if OK
1431
+     */
1432
+    function fetchObjectFrom($table, $field, $key, $element = null)
1433
+    {
1434
+        global $conf;
4462 1435
 
4463
-		// If generator was found
4464
-		if ($filefound)
4465
-		{
4466
-			global $db;  // Required to solve a conception default in commonstickergenerator.class.php making an include of code using $db
1436
+        $result=false;
4467 1437
 
4468
-			require_once $file;
1438
+        $sql = "SELECT rowid FROM ".MAIN_DB_PREFIX.$table;
1439
+        $sql.= " WHERE ".$field." = '".$key."'";
1440
+        if (! empty($element)) {
1441
+            $sql.= " AND entity IN (".getEntity($element).")";
1442
+        } else {
1443
+            $sql.= " AND entity = ".$conf->entity;
1444
+        }
4469 1445
 
4470
-			$obj = new $classname($this->db);
1446
+        dol_syslog(get_class($this).'::fetchObjectFrom', LOG_DEBUG);
1447
+        $resql = $this->db->query($sql);
1448
+        if ($resql)
1449
+        {
1450
+            $row = $this->db->fetch_row($resql);
1451
+            // Test for avoid error -1
1452
+            if ($row[0] > 0) {
1453
+                $result = $this->fetch($row[0]);
1454
+            }
1455
+        }
4471 1456
 
4472
-			// If generator is ODT, we must have srctemplatepath defined, if not we set it.
4473
-			if ($obj->type == 'odt' && empty($srctemplatepath))
4474
-			{
4475
-				$varfortemplatedir=$obj->scandir;
4476
-				if ($varfortemplatedir && ! empty($conf->global->$varfortemplatedir))
4477
-				{
4478
-					$dirtoscan=$conf->global->$varfortemplatedir;
4479
-
4480
-					$listoffiles=array();
4481
-
4482
-					// Now we add first model found in directories scanned
4483
-					$listofdir=explode(',',$dirtoscan);
4484
-					foreach($listofdir as $key => $tmpdir)
4485
-					{
4486
-						$tmpdir=trim($tmpdir);
4487
-						$tmpdir=preg_replace('/DOL_DATA_ROOT/',DOL_DATA_ROOT,$tmpdir);
4488
-						if (! $tmpdir) { unset($listofdir[$key]); continue; }
4489
-						if (is_dir($tmpdir))
4490
-						{
4491
-							$tmpfiles=dol_dir_list($tmpdir,'files',0,'\.od(s|t)$','','name',SORT_ASC,0);
4492
-							if (count($tmpfiles)) $listoffiles=array_merge($listoffiles,$tmpfiles);
4493
-						}
4494
-					}
4495
-
4496
-					if (count($listoffiles))
4497
-					{
4498
-						foreach($listoffiles as $record)
4499
-						{
4500
-							$srctemplatepath=$record['fullname'];
4501
-							break;
4502
-						}
4503
-					}
4504
-				}
1457
+        return $result;
1458
+    }
4505 1459
 
4506
-				if (empty($srctemplatepath))
4507
-				{
4508
-					$this->error='ErrorGenerationAskedForOdtTemplateWithSrcFileNotDefined';
4509
-					return -1;
4510
-				}
4511
-			}
1460
+    /**
1461
+     *	Getter generic. Load value from a specific field
1462
+     *
1463
+     *	@param	string	$table		Table of element or element line
1464
+     *	@param	int		$id			Element id
1465
+     *	@param	string	$field		Field selected
1466
+     *	@return	int					<0 if KO, >0 if OK
1467
+     */
1468
+    function getValueFrom($table, $id, $field)
1469
+    {
1470
+        $result=false;
1471
+        if (!empty($id) && !empty($field) && !empty($table)) {
1472
+            $sql = "SELECT ".$field." FROM ".MAIN_DB_PREFIX.$table;
1473
+            $sql.= " WHERE rowid = ".$id;
1474
+
1475
+            dol_syslog(get_class($this).'::getValueFrom', LOG_DEBUG);
1476
+            $resql = $this->db->query($sql);
1477
+            if ($resql)
1478
+            {
1479
+                $row = $this->db->fetch_row($resql);
1480
+                $result = $row[0];
1481
+            }
1482
+        }
1483
+        return $result;
1484
+    }
4512 1485
 
4513
-			if ($obj->type == 'odt' && ! empty($srctemplatepath))
4514
-			{
4515
-				if (! dol_is_file($srctemplatepath))
4516
-				{
4517
-					$this->error='ErrorGenerationAskedForOdtTemplateWithSrcFileNotFound';
4518
-					return -1;
4519
-				}
4520
-			}
1486
+    /**
1487
+     *	Setter generic. Update a specific field into database.
1488
+     *  Warning: Trigger is run only if param trigkey is provided.
1489
+     *
1490
+     *	@param	string		$field			Field to update
1491
+     *	@param	mixed		$value			New value
1492
+     *	@param	string		$table			To force other table element or element line (should not be used)
1493
+     *	@param	int			$id				To force other object id (should not be used)
1494
+     *	@param	string		$format			Data format ('text', 'date'). 'text' is used if not defined
1495
+     *	@param	string		$id_field		To force rowid field name. 'rowid' is used if not defined
1496
+     *	@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'
1497
+     *  @param  string      $trigkey    	Trigger key to run (in most cases something like 'XXX_MODIFY')
1498
+     *  @param	string		$fk_user_field	Name of field to save user id making change
1499
+     *	@return	int							<0 if KO, >0 if OK
1500
+     *  @see updateExtraField
1501
+     */
1502
+    function setValueFrom($field, $value, $table='', $id=null, $format='', $id_field='', $fuser=null, $trigkey='', $fk_user_field='fk_user_modif')
1503
+    {
1504
+        global $user,$langs,$conf;
4521 1505
 
4522
-			// We save charset_output to restore it because write_file can change it if needed for
4523
-			// output format that does not support UTF8.
4524
-			$sav_charset_output=$outputlangs->charset_output;
1506
+        if (empty($table)) 	  $table=$this->table_element;
1507
+        if (empty($id))    	  $id=$this->id;
1508
+        if (empty($format))   $format='text';
1509
+        if (empty($id_field)) $id_field='rowid';
4525 1510
 
4526
-			if (in_array(get_class($this), array('Adherent')))
4527
-			{
4528
-				$arrayofrecords = array();   // The write_file of templates of adherent class need this var
4529
-				$resultwritefile = $obj->write_file($this, $outputlangs, $srctemplatepath, 'member', 1, $moreparams);
4530
-			}
4531
-			else
4532
-			{
4533
-				$resultwritefile = $obj->write_file($this, $outputlangs, $srctemplatepath, $hidedetails, $hidedesc, $hideref, $moreparams);
4534
-			}
4535
-			// After call of write_file $obj->result['fullpath'] is set with generated file. It will be used to update the ECM database index.
1511
+        $error=0;
4536 1512
 
4537
-			if ($resultwritefile > 0)
4538
-			{
4539
-				$outputlangs->charset_output=$sav_charset_output;
1513
+        $this->db->begin();
4540 1514
 
4541
-				// We delete old preview
4542
-				require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
4543
-				dol_delete_preview($this);
1515
+        // Special case
1516
+        if ($table == 'product' && $field == 'note_private') $field='note';
1517
+        if (in_array($table, array('actioncomm', 'adherent', 'advtargetemailing', 'cronjob', 'establishment'))) $fk_user_field = 'fk_user_mod';
4544 1518
 
4545
-				// Index file in database
4546
-				if (! empty($obj->result['fullpath']))
4547
-				{
4548
-					$destfull = $obj->result['fullpath'];
4549
-					$upload_dir = dirname($destfull);
4550
-					$destfile = basename($destfull);
4551
-					$rel_dir = preg_replace('/^'.preg_quote(DOL_DATA_ROOT,'/').'/', '', $upload_dir);
4552
-
4553
-					if (! preg_match('/[\\/]temp[\\/]|[\\/]thumbs|\.meta$/', $rel_dir))     // If not a tmp dir
4554
-					{
4555
-						$filename = basename($destfile);
4556
-						$rel_dir = preg_replace('/[\\/]$/', '', $rel_dir);
4557
-						$rel_dir = preg_replace('/^[\\/]/', '', $rel_dir);
4558
-
4559
-						include_once DOL_DOCUMENT_ROOT.'/ecm/class/ecmfiles.class.php';
4560
-						$ecmfile=new EcmFiles($this->db);
4561
-						$result = $ecmfile->fetch(0, '', ($rel_dir?$rel_dir.'/':'').$filename);
4562
-
4563
-						// Set the public "share" key
4564
-						$setsharekey = false;
4565
-						if ($this->element == 'propal')
4566
-						{
4567
-							$useonlinesignature = $conf->global->MAIN_FEATURES_LEVEL;	// Replace this with 1 when feature to make online signature is ok
4568
-							if ($useonlinesignature) $setsharekey=true;
4569
-							if (! empty($conf->global->PROPOSAL_ALLOW_EXTERNAL_DOWNLOAD)) $setsharekey=true;
4570
-						}
4571
-						if ($this->element == 'commande'     && ! empty($conf->global->ORDER_ALLOW_EXTERNAL_DOWNLOAD))        $setsharekey=true;
4572
-						if ($this->element == 'facture'      && ! empty($conf->global->INVOICE_ALLOW_EXTERNAL_DOWNLOAD))      $setsharekey=true;
4573
-						if ($this->element == 'bank_account' && ! empty($conf->global->BANK_ACCOUNT_ALLOW_EXTERNAL_DOWNLOAD)) $setsharekey=true;
4574
-
4575
-						if ($setsharekey)
4576
-						{
4577
-							if (empty($ecmfile->share))	// Because object not found or share not set yet
4578
-							{
4579
-								require_once DOL_DOCUMENT_ROOT.'/core/lib/security2.lib.php';
4580
-								$ecmfile->share = getRandomPassword(true);
4581
-							}
4582
-						}
1519
+        $sql = "UPDATE ".MAIN_DB_PREFIX.$table." SET ";
4583 1520
 
4584
-						if ($result > 0)
4585
-						{
4586
-							$ecmfile->label = md5_file(dol_osencode($destfull));	// hash of file content
4587
-							$ecmfile->fullpath_orig = '';
4588
-							$ecmfile->gen_or_uploaded = 'generated';
4589
-							$ecmfile->description = '';    // indexed content
4590
-							$ecmfile->keyword = '';        // keyword content
4591
-							$result = $ecmfile->update($user);
4592
-							if ($result < 0)
4593
-							{
4594
-								setEventMessages($ecmfile->error, $ecmfile->errors, 'warnings');
4595
-							}
4596
-						}
4597
-						else
4598
-						{
4599
-							$ecmfile->entity = $conf->entity;
4600
-							$ecmfile->filepath = $rel_dir;
4601
-							$ecmfile->filename = $filename;
4602
-							$ecmfile->label = md5_file(dol_osencode($destfull));	// hash of file content
4603
-							$ecmfile->fullpath_orig = '';
4604
-							$ecmfile->gen_or_uploaded = 'generated';
4605
-							$ecmfile->description = '';    // indexed content
4606
-							$ecmfile->keyword = '';        // keyword content
4607
-							$ecmfile->src_object_type = $this->table_element;
4608
-							$ecmfile->src_object_id   = $this->id;
4609
-
4610
-							$result = $ecmfile->create($user);
4611
-							if ($result < 0)
4612
-							{
4613
-								setEventMessages($ecmfile->error, $ecmfile->errors, 'warnings');
4614
-							}
4615
-						}
1521
+        if ($format == 'text') $sql.= $field." = '".$this->db->escape($value)."'";
1522
+        else if ($format == 'int') $sql.= $field." = ".$this->db->escape($value);
1523
+        else if ($format == 'date') $sql.= $field." = ".($value ? "'".$this->db->idate($value)."'" : "null");
4616 1524
 
4617
-						/*$this->result['fullname']=$destfull;
4618
-						$this->result['filepath']=$ecmfile->filepath;
4619
-						$this->result['filename']=$ecmfile->filename;*/
4620
-						//var_dump($obj->update_main_doc_field);exit;
4621
-
4622
-						// Update the last_main_doc field into main object (if documenent generator has property ->update_main_doc_field set)
4623
-						$update_main_doc_field=0;
4624
-						if (! empty($obj->update_main_doc_field)) $update_main_doc_field=1;
4625
-						if ($update_main_doc_field && ! empty($this->table_element))
4626
-						{
4627
-							$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element." SET last_main_doc = '".($ecmfile->filepath.'/'.$ecmfile->filename)."'";
4628
-							$sql.= ' WHERE rowid = '.$this->id;
4629
-							$resql = $this->db->query($sql);
4630
-							if (! $resql) dol_print_error($this->db);
4631
-						}
4632
-					}
4633
-				}
4634
-				else
4635
-				{
4636
-					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);
4637
-				}
1525
+        if ($fk_user_field)
1526
+        {
1527
+            if (! empty($fuser) && is_object($fuser)) $sql.=", ".$fk_user_field." = ".$fuser->id;
1528
+            elseif (empty($fuser) || $fuser != 'none') $sql.=", ".$fk_user_field." = ".$user->id;
1529
+        }
4638 1530
 
4639
-				// Success in building document. We build meta file.
4640
-				dol_meta_create($this);
1531
+        $sql.= " WHERE ".$id_field." = ".$id;
4641 1532
 
4642
-				return 1;
4643
-			}
4644
-			else
4645
-			{
4646
-				$outputlangs->charset_output=$sav_charset_output;
4647
-				dol_print_error($this->db, "Error generating document for ".__CLASS__.". Error: ".$obj->error, $obj->errors);
4648
-				return -1;
4649
-			}
4650
-		}
4651
-		else
4652
-		{
4653
-			$this->error=$langs->trans("Error")." ".$langs->trans("ErrorFileDoesNotExists",$file);
4654
-			dol_print_error('',$this->error);
4655
-			return -1;
4656
-		}
4657
-	}
4658
-
4659
-	/**
4660
-	 *  Build thumb
4661
-	 *  @TODO Move this into files.lib.php
4662
-	 *
4663
-	 *  @param      string	$file           Path file in UTF8 to original file to create thumbs from.
4664
-	 *	@return		void
4665
-	 */
4666
-	function addThumbs($file)
4667
-	{
4668
-		global $maxwidthsmall, $maxheightsmall, $maxwidthmini, $maxheightmini, $quality;
4669
-
4670
-		require_once DOL_DOCUMENT_ROOT .'/core/lib/images.lib.php';		// This define also $maxwidthsmall, $quality, ...
4671
-
4672
-		$file_osencoded=dol_osencode($file);
4673
-		if (file_exists($file_osencoded))
4674
-		{
4675
-			// Create small thumbs for company (Ratio is near 16/9)
4676
-			// Used on logon for example
4677
-			vignette($file_osencoded, $maxwidthsmall, $maxheightsmall, '_small', $quality);
4678
-
4679
-			// Create mini thumbs for company (Ratio is near 16/9)
4680
-			// Used on menu or for setup page for example
4681
-			vignette($file_osencoded, $maxwidthmini, $maxheightmini, '_mini', $quality);
4682
-		}
4683
-	}
4684
-
4685
-
4686
-	/* Functions common to commonobject and commonobjectline */
4687
-
4688
-	/* For default values */
4689
-
4690
-	/**
4691
-	 * Return the default value to use for a field when showing the create form of object.
4692
-	 * Return values in this order:
4693
-	 * 1) If parameter is available into POST, we return it first.
4694
-	 * 2) If not but an alternate value was provided as parameter of function, we return it.
4695
-	 * 3) If not but a constant $conf->global->OBJECTELEMENT_FIELDNAME is set, we return it (It is better to use the dedicated table).
4696
-	 * 4) Return value found into database (TODO No yet implemented)
4697
-	 *
4698
-	 * @param   string              $fieldname          Name of field
4699
-	 * @param   string              $alternatevalue     Alternate value to use
4700
-	 * @return  string|string[]                         Default value (can be an array if the GETPOST return an array)
4701
-	 **/
4702
-	function getDefaultCreateValueFor($fieldname, $alternatevalue=null)
4703
-	{
4704
-		global $conf, $_POST;
4705
-
4706
-		// If param here has been posted, we use this value first.
4707
-		if (isset($_POST[$fieldname])) return GETPOST($fieldname, 2);
4708
-
4709
-		if (isset($alternatevalue)) return $alternatevalue;
4710
-
4711
-		$newelement=$this->element;
4712
-		if ($newelement == 'facture') $newelement='invoice';
4713
-		if ($newelement == 'commande') $newelement='order';
4714
-		if (empty($newelement))
4715
-		{
4716
-			dol_syslog("Ask a default value using common method getDefaultCreateValueForField on an object with no property ->element defined. Return empty string.", LOG_WARNING);
4717
-			return '';
4718
-		}
4719
-
4720
-		$keyforfieldname=strtoupper($newelement.'_DEFAULT_'.$fieldname);
4721
-		//var_dump($keyforfieldname);
4722
-		if (isset($conf->global->$keyforfieldname)) return $conf->global->$keyforfieldname;
4723
-
4724
-		// TODO Ad here a scan into table llx_overwrite_default with a filter on $this->element and $fieldname
4725
-	}
4726
-
4727
-
4728
-	/* For triggers */
1533
+        dol_syslog(get_class($this)."::".__FUNCTION__."", LOG_DEBUG);
1534
+        $resql = $this->db->query($sql);
1535
+        if ($resql)
1536
+        {
1537
+            if ($trigkey)
1538
+            {
1539
+                // call trigger with updated object values
1540
+                if (empty($this->fields) && method_exists($this, 'fetch'))
1541
+                {
1542
+                    $result = $this->fetch($id);
1543
+                }
1544
+                else
1545
+                {
1546
+                    $result = $this->fetchCommon($id);
1547
+                }
1548
+                if ($result >= 0) $result=$this->call_trigger($trigkey, (! empty($fuser) && is_object($fuser)) ? $fuser : $user);   // This may set this->errors
1549
+                if ($result < 0) $error++;
1550
+            }
4729 1551
 
1552
+            if (! $error)
1553
+            {
1554
+                if (property_exists($this, $field)) $this->$field = $value;
1555
+                $this->db->commit();
1556
+                return 1;
1557
+            }
1558
+            else
1559
+            {
1560
+                $this->db->rollback();
1561
+                return -2;
1562
+            }
1563
+        }
1564
+        else
1565
+        {
1566
+            $this->error=$this->db->lasterror();
1567
+            $this->db->rollback();
1568
+            return -1;
1569
+        }
1570
+    }
4730 1571
 
4731 1572
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
4732
-	/**
4733
-	 * Call trigger based on this instance.
4734
-	 * Some context information may also be provided into array property this->context.
4735
-	 * NB:  Error from trigger are stacked in interface->errors
4736
-	 * NB2: If return code of triggers are < 0, action calling trigger should cancel all transaction.
4737
-	 *
4738
-	 * @param   string    $trigger_name   trigger's name to execute
4739
-	 * @param   User      $user           Object user
4740
-	 * @return  int                       Result of run_triggers
4741
-	 */
4742
-	function call_trigger($trigger_name, $user)
4743
-	{
1573
+    /**
1574
+     *      Load properties id_previous and id_next by comparing $fieldid with $this->ref
1575
+     *
1576
+     *      @param	string	$filter		Optional filter. Example: " AND (t.field1 = 'aa' OR t.field2 = 'bb')"
1577
+     *	 	@param  string	$fieldid   	Name of field to use for the select MAX and MIN
1578
+     *		@param	int		$nodbprefix	Do not include DB prefix to forge table name
1579
+     *      @return int         		<0 if KO, >0 if OK
1580
+     */
1581
+    function load_previous_next_ref($filter, $fieldid, $nodbprefix=0)
1582
+    {
4744 1583
         // phpcs:enable
4745
-		global $langs,$conf;
1584
+        global $conf, $user;
4746 1585
 
4747
-		include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php';
4748
-		$interface=new Interfaces($this->db);
4749
-		$result=$interface->run_triggers($trigger_name,$this,$user,$langs,$conf);
1586
+        if (! $this->table_element)
1587
+        {
1588
+            dol_print_error('',get_class($this)."::load_previous_next_ref was called on objet with property table_element not defined");
1589
+            return -1;
1590
+        }
1591
+        if ($fieldid == 'none') return 1;
4750 1592
 
4751
-		if ($result < 0)
4752
-		{
4753
-			if (!empty($this->errors))
4754
-			{
4755
-				$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
-			}
4757
-			else
4758
-			{
4759
-				$this->errors=$interface->errors;
4760
-			}
4761
-		}
4762
-		return $result;
4763
-	}
1593
+        // Security on socid
1594
+        $socid = 0;
1595
+        if ($user->societe_id > 0) $socid = $user->societe_id;
4764 1596
 
1597
+        // this->ismultientitymanaged contains
1598
+        // 0=No test on entity, 1=Test with field entity, 2=Test with link by societe
1599
+        $alias = 's';
1600
+        if ($this->element == 'societe') $alias = 'te';
4765 1601
 
4766
-	/* Functions for extrafields */
1602
+        $sql = "SELECT MAX(te.".$fieldid.")";
1603
+        $sql.= " FROM ".(empty($nodbprefix)?MAIN_DB_PREFIX:'').$this->table_element." as te";
1604
+        if ($this->element == 'user' && ! empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE)) {
1605
+            $sql.= ",".MAIN_DB_PREFIX."usergroup_user as ug";
1606
+        }
1607
+        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
1608
+        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
1609
+        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
1610
+        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";
1611
+        $sql.= " WHERE te.".$fieldid." < '".$this->db->escape($this->ref)."'";  // ->ref must always be defined (set to id if field does not exists)
1612
+        if ($this->restrictiononfksoc == 1 && !$user->rights->societe->client->voir && !$socid) $sql.= " AND sc.fk_user = " .$user->id;
1613
+        if ($this->restrictiononfksoc == 2 && !$user->rights->societe->client->voir && !$socid) $sql.= " AND (sc.fk_user = " .$user->id.' OR te.fk_soc IS NULL)';
1614
+        if (! empty($filter))
1615
+        {
1616
+            if (! preg_match('/^\s*AND/i', $filter)) $sql.=" AND ";   // For backward compatibility
1617
+            $sql.=$filter;
1618
+        }
1619
+        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
1620
+        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
1621
+        if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) {
1622
+            if ($this->element == 'user' && ! empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE)) {
1623
+                if (! empty($user->admin) && empty($user->entity) && $conf->entity == 1) {
1624
+                    $sql.= " AND te.entity IS NOT NULL"; // Show all users
1625
+                } else {
1626
+                    $sql.= " AND ug.fk_user = te.rowid";
1627
+                    $sql.= " AND ug.entity IN (".getEntity($this->element).")";
1628
+                }
1629
+            } else {
1630
+                $sql.= ' AND te.entity IN ('.getEntity($this->element).')';
1631
+            }
1632
+        }
1633
+        if ($this->restrictiononfksoc == 1 && $socid && $this->element != 'societe') $sql.= ' AND te.fk_soc = ' . $socid;
1634
+        if ($this->restrictiononfksoc == 2 && $socid && $this->element != 'societe') $sql.= ' AND (te.fk_soc = ' . $socid.' OR te.fk_soc IS NULL)';
1635
+        if ($this->restrictiononfksoc && $socid && $this->element == 'societe') $sql.= ' AND te.rowid = ' . $socid;
1636
+        //print 'socid='.$socid.' restrictiononfksoc='.$this->restrictiononfksoc.' ismultientitymanaged = '.$this->ismultientitymanaged.' filter = '.$filter.' -> '.$sql."<br>";
4767 1637
 
1638
+        $result = $this->db->query($sql);
1639
+        if (! $result)
1640
+        {
1641
+            $this->error=$this->db->lasterror();
1642
+            return -1;
1643
+        }
1644
+        $row = $this->db->fetch_row($result);
1645
+        $this->ref_previous = $row[0];
4768 1646
 
4769
-    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
4770
-	/**
4771
-	 *  Function to get extra fields of an object into $this->array_options
4772
-	 *  This method is in most cases called by method fetch of objects but you can call it separately.
4773
-	 *
4774
-	 *  @param	int		$rowid			Id of line. Use the id of object if not defined. Deprecated. Function must be called without parameters.
4775
-	 *  @param  array	$optionsArray   Array resulting of call of extrafields->fetch_name_optionals_label(). Deprecated. Function must be called without parameters.
4776
-	 *  @return	int						<0 if error, 0 if no values of extrafield to find nor found, 1 if an attribute is found and value loaded
4777
-	 */
4778
-	function fetch_optionals($rowid=null, $optionsArray=null)
4779
-	{
4780
-        // phpcs:enable
4781
-		if (empty($rowid)) $rowid=$this->id;
4782
-
4783
-		// To avoid SQL errors. Probably not the better solution though
4784
-		if (!$this->table_element) {
4785
-			return 0;
4786
-		}
4787
-
4788
-		$this->array_options=array();
4789
-
4790
-		if (! is_array($optionsArray))
4791
-		{
4792
-			// If $extrafields is not a known object, we initialize it. Best practice is to have $extrafields defined into card.php or list.php page.
4793
-			// TODO Use of existing $extrafield is not yet ready (must mutualize code that use extrafields in form first)
4794
-			// global $extrafields;
4795
-			//if (! is_object($extrafields))
4796
-			//{
4797
-				require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
4798
-				$extrafields = new ExtraFields($this->db);
4799
-			//}
4800
-
4801
-			// Load array of extrafields for elementype = $this->table_element
4802
-			if (empty($extrafields->attributes[$this->table_element]['loaded']))
4803
-			{
4804
-				$extrafields->fetch_name_optionals_label($this->table_element);
4805
-			}
4806
-			$optionsArray = (! empty($extrafields->attributes[$this->table_element]['label'])?$extrafields->attributes[$this->table_element]['label']:null);
4807
-		}
4808
-		else
4809
-		{
4810
-			global $extrafields;
4811
-			dol_syslog("Warning: fetch_optionals was called with param optionsArray defined when you should pass null now", LOG_WARNING);
4812
-		}
4813
-
4814
-		$table_element = $this->table_element;
4815
-		if ($table_element == 'categorie') $table_element = 'categories'; // For compatibility
4816
-
4817
-		// Request to get complementary values
4818
-		if (is_array($optionsArray) && count($optionsArray) > 0)
4819
-		{
4820
-			$sql = "SELECT rowid";
4821
-			foreach ($optionsArray as $name => $label)
4822
-			{
4823
-				if (empty($extrafields->attributes[$this->table_element]['type'][$name]) || $extrafields->attributes[$this->table_element]['type'][$name] != 'separate')
4824
-				{
4825
-					$sql.= ", ".$name;
4826
-				}
4827
-			}
4828
-			$sql.= " FROM ".MAIN_DB_PREFIX.$table_element."_extrafields";
4829
-			$sql.= " WHERE fk_object = ".$rowid;
4830 1647
 
4831
-			//dol_syslog(get_class($this)."::fetch_optionals get extrafields data for ".$this->table_element, LOG_DEBUG);		// Too verbose
4832
-			$resql=$this->db->query($sql);
4833
-			if ($resql)
4834
-			{
4835
-				$this->array_options = array();
4836
-				$numrows=$this->db->num_rows($resql);
4837
-				if ($numrows)
4838
-				{
4839
-					$tab = $this->db->fetch_array($resql);
4840
-
4841
-					foreach ($tab as $key => $value)
4842
-					{
4843
-						// 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)
4844
-						if ($key != 'rowid' && $key != 'tms' && $key != 'fk_member' && ! is_int($key))
4845
-						{
4846
-							// we can add this attribute to object
4847
-							if (! empty($extrafields) && in_array($extrafields->attributes[$this->table_element]['type'][$key], array('date','datetime')))
4848
-							{
4849
-								//var_dump($extrafields->attributes[$this->table_element]['type'][$key]);
4850
-								$this->array_options["options_".$key]=$this->db->jdate($value);
4851
-							}
4852
-							else
4853
-							{
4854
-								$this->array_options["options_".$key]=$value;
4855
-							}
1648
+        $sql = "SELECT MIN(te.".$fieldid.")";
1649
+        $sql.= " FROM ".(empty($nodbprefix)?MAIN_DB_PREFIX:'').$this->table_element." as te";
1650
+        if ($this->element == 'user' && ! empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE)) {
1651
+            $sql.= ",".MAIN_DB_PREFIX."usergroup_user as ug";
1652
+        }
1653
+        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
1654
+        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
1655
+        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
1656
+        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";
1657
+        $sql.= " WHERE te.".$fieldid." > '".$this->db->escape($this->ref)."'";  // ->ref must always be defined (set to id if field does not exists)
1658
+        if ($this->restrictiononfksoc == 1 && !$user->rights->societe->client->voir && !$socid) $sql.= " AND sc.fk_user = " .$user->id;
1659
+        if ($this->restrictiononfksoc == 2 && !$user->rights->societe->client->voir && !$socid) $sql.= " AND (sc.fk_user = " .$user->id.' OR te.fk_soc IS NULL)';
1660
+        if (! empty($filter))
1661
+        {
1662
+            if (! preg_match('/^\s*AND/i', $filter)) $sql.=" AND ";   // For backward compatibility
1663
+            $sql.=$filter;
1664
+        }
1665
+        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
1666
+        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
1667
+        if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) {
1668
+            if ($this->element == 'user' && ! empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE)) {
1669
+                if (! empty($user->admin) && empty($user->entity) && $conf->entity == 1) {
1670
+                    $sql.= " AND te.entity IS NOT NULL"; // Show all users
1671
+                } else {
1672
+                    $sql.= " AND ug.fk_user = te.rowid";
1673
+                    $sql.= " AND ug.entity IN (".getEntity($this->element).")";
1674
+                }
1675
+            } else {
1676
+                $sql.= ' AND te.entity IN ('.getEntity($this->element).')';
1677
+            }
1678
+        }
1679
+        if ($this->restrictiononfksoc == 1 && $socid && $this->element != 'societe') $sql.= ' AND te.fk_soc = ' . $socid;
1680
+        if ($this->restrictiononfksoc == 2 && $socid && $this->element != 'societe') $sql.= ' AND (te.fk_soc = ' . $socid.' OR te.fk_soc IS NULL)';
1681
+        if ($this->restrictiononfksoc && $socid && $this->element == 'societe') $sql.= ' AND te.rowid = ' . $socid;
1682
+        //print 'socid='.$socid.' restrictiononfksoc='.$this->restrictiononfksoc.' ismultientitymanaged = '.$this->ismultientitymanaged.' filter = '.$filter.' -> '.$sql."<br>";
1683
+        // 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
1684
+
1685
+        $result = $this->db->query($sql);
1686
+        if (! $result)
1687
+        {
1688
+            $this->error=$this->db->lasterror();
1689
+            return -2;
1690
+        }
1691
+        $row = $this->db->fetch_row($result);
1692
+        $this->ref_next = $row[0];
4856 1693
 
4857
-							//var_dump('key '.$key.' '.$value.' type='.$extrafields->attributes[$this->table_element]['type'][$key].' '.$this->array_options["options_".$key]);
4858
-						}
4859
-					}
4860
-				}
1694
+        return 1;
1695
+    }
4861 1696
 
4862
-				$this->db->free($resql);
4863 1697
 
4864
-				if ($numrows) return $numrows;
4865
-				else return 0;
4866
-			}
4867
-			else
4868
-			{
4869
-				dol_print_error($this->db);
4870
-				return -1;
4871
-			}
4872
-		}
4873
-		return 0;
4874
-	}
4875
-
4876
-	/**
4877
-	 *	Delete all extra fields values for the current object.
4878
-	 *
4879
-	 *  @return	int		<0 if KO, >0 if OK
4880
-	 */
4881
-	function deleteExtraFields()
4882
-	{
4883
-		$this->db->begin();
4884
-
4885
-		$table_element = $this->table_element;
4886
-		if ($table_element == 'categorie') $table_element = 'categories'; // For compatibility
4887
-
4888
-		$sql_del = "DELETE FROM ".MAIN_DB_PREFIX.$table_element."_extrafields WHERE fk_object = ".$this->id;
4889
-		dol_syslog(get_class($this)."::deleteExtraFields delete", LOG_DEBUG);
4890
-		$resql=$this->db->query($sql_del);
4891
-		if (! $resql)
4892
-		{
4893
-			$this->error=$this->db->lasterror();
4894
-			$this->db->rollback();
4895
-			return -1;
4896
-		}
4897
-		else
4898
-		{
4899
-			$this->db->commit();
4900
-			return 1;
4901
-		}
4902
-	}
4903
-
4904
-	/**
4905
-	 *	Add/Update all extra fields values for the current object.
4906
-	 *  Data to describe values to insert/update are stored into $this->array_options=array('options_codeforfield1'=>'valueforfield1', 'options_codeforfield2'=>'valueforfield2', ...)
4907
-	 *  This function delete record with all extrafields and insert them again from the array $this->array_options.
4908
-	 *
4909
-	 *  @param	string		$trigger		If defined, call also the trigger (for example COMPANY_MODIFY)
4910
-	 *  @param	User		$userused		Object user
4911
-	 *  @return int 						-1=error, O=did nothing, 1=OK
4912
-	 *  @see updateExtraField, setValueFrom
4913
-	 */
4914
-	function insertExtraFields($trigger='', $userused=null)
4915
-	{
4916
-		global $conf,$langs,$user;
4917
-
4918
-		if (empty($userused)) $userused=$user;
4919
-
4920
-		$error=0;
4921
-
4922
-		if (! empty($conf->global->MAIN_EXTRAFIELDS_DISABLED)) return 0;	// For avoid conflicts if trigger used
4923
-
4924
-		if (! empty($this->array_options))
4925
-		{
4926
-			// Check parameters
4927
-			$langs->load('admin');
4928
-			require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
4929
-			$extrafields = new ExtraFields($this->db);
4930
-			$target_extrafields=$extrafields->fetch_name_optionals_label($this->table_element);
4931
-
4932
-			//Eliminate copied source object extra_fields that do not exist in target object
4933
-			$new_array_options=array();
4934
-			foreach ($this->array_options as $key => $value) {
4935
-				if (in_array(substr($key,8), array_keys($target_extrafields)))	// We remove the 'options_' from $key for test
4936
-					$new_array_options[$key] = $value;
4937
-				elseif (in_array($key, array_keys($target_extrafields)))		// We test on $key that does not contains the 'options_' prefix
4938
-					$new_array_options['options_'.$key] = $value;
4939
-			}
4940
-
4941
-			foreach($new_array_options as $key => $value)
4942
-			{
4943
-			   	$attributeKey      = substr($key,8);   // Remove 'options_' prefix
4944
-			   	$attributeType     = $extrafields->attributes[$this->table_element]['type'][$attributeKey];
4945
-			   	$attributeLabel    = $extrafields->attributes[$this->table_element]['label'][$attributeKey];
4946
-			   	$attributeParam    = $extrafields->attributes[$this->table_element]['param'][$attributeKey];
4947
-			   	$attributeRequired = $extrafields->attributes[$this->table_element]['required'][$attributeKey];
4948
-
4949
-			   	if ($attributeRequired)
4950
-			   	{
4951
-			   		$mandatorypb=false;
4952
-			   		if ($attributeType == 'link' && $this->array_options[$key] == '-1') $mandatorypb=true;
4953
-			   		if ($this->array_options[$key] === '') $mandatorypb=true;
4954
-			   		if ($mandatorypb)
4955
-			   		{
4956
-			   			dol_syslog($this->error);
4957
-			   			$this->errors[]=$langs->trans('ErrorFieldRequired', $attributeLabel);
4958
-			   			return -1;
4959
-			   		}
4960
-			   	}
4961
-
4962
-				//dol_syslog("attributeLabel=".$attributeLabel, LOG_DEBUG);
4963
-				//dol_syslog("attributeType=".$attributeType, LOG_DEBUG);
4964
-
4965
-			   	switch ($attributeType)
4966
-			   	{
4967
-			   		case 'int':
4968
-			  			if (!is_numeric($value) && $value!='')
4969
-			   			{
4970
-			   				$this->errors[]=$langs->trans("ExtraFieldHasWrongValue", $attributeLabel);
4971
-			   				return -1;
4972
-			  			}
4973
-			   			elseif ($value=='')
4974
-			   			{
4975
-			   				$new_array_options[$key] = null;
4976
-			   			}
4977
-			 			break;
4978
-					case 'double':
4979
-						$value = price2num($value);
4980
-						if (!is_numeric($value) && $value!='')
4981
-						{
4982
-							dol_syslog($langs->trans("ExtraFieldHasWrongValue")." sur ".$attributeLabel."(".$value."is not '".$attributeType."')", LOG_DEBUG);
4983
-							$this->errors[]=$langs->trans("ExtraFieldHasWrongValue", $attributeLabel);
4984
-							return -1;
4985
-						}
4986
-						elseif ($value=='')
4987
-						{
4988
-							$new_array_options[$key] = null;
4989
-						}
4990
-						//dol_syslog("double value"." sur ".$attributeLabel."(".$value." is '".$attributeType."')", LOG_DEBUG);
4991
-						$new_array_options[$key] = $value;
4992
-						break;
4993
-			 		/*case 'select':	// Not required, we chosed value='0' for undefined values
4994
-             			if ($value=='-1')
4995
-             			{
4996
-             				$this->array_options[$key] = null;
4997
-             			}
4998
-             			break;*/
4999
-			   		case 'password':
5000
-			   			$algo='';
5001
-			   			if ($this->array_options[$key] != '' && is_array($extrafields->attributes[$this->table_element]['param'][$attributeKey]['options']))
5002
-			   			{
5003
-			   				// If there is an encryption choice, we use it to crypt data before insert
5004
-			   				$tmparrays = array_keys($extrafields->attributes[$this->table_element]['param'][$attributeKey]['options']);
5005
-			   				$algo=reset($tmparrays);
5006
-			   				if ($algo != '')
5007
-			   				{
5008
-			   					//global $action;		// $action may be 'create', 'update', 'update_extras'...
5009
-			   					//var_dump($action);
5010
-			   					//var_dump($this->oldcopy);exit;
5011
-			   					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
5012
-			   					{
5013
-			   						//var_dump($this->oldcopy->array_options[$key]); var_dump($this->array_options[$key]);
5014
-				   					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.
5015
-				   					{
5016
-				   						$new_array_options[$key] = $this->array_options[$key];	// Value is kept
5017
-				   					}
5018
-									else
5019
-									{
5020
-										// var_dump($algo);
5021
-										$newvalue = dol_hash($this->array_options[$key], $algo);
5022
-										$new_array_options[$key] = $newvalue;
5023
-									}
5024
-			   					}
5025
-			   					else
5026
-			   					{
5027
-			   						$new_array_options[$key] = $this->array_options[$key];	// Value is kept
5028
-			   					}
5029
-			   				}
5030
-			   			}
5031
-			   			else	// Common usage
5032
-			   			{
5033
-			   				$new_array_options[$key] = $this->array_options[$key];
5034
-			   			}
5035
-			   			break;
5036
-			   		case 'price':
5037
-						$new_array_options[$key] = price2num($this->array_options[$key]);
5038
-						break;
5039
-					case 'date':
5040
-						$new_array_options[$key] = $this->db->idate($this->array_options[$key]);
5041
-						break;
5042
-					case 'datetime':
5043
-						// If data is a string instead of a timestamp, we convert it
5044
-						if (! is_int($this->array_options[$key])) {
5045
-							$this->array_options[$key] = strtotime($this->array_options[$key]);
5046
-						}
5047
-						$new_array_options[$key] = $this->db->idate($this->array_options[$key]);
5048
-						break;
5049
-		   			case 'link':
5050
-						$param_list=array_keys($attributeParam['options']);
5051
-						// 0 : ObjectName
5052
-						// 1 : classPath
5053
-						$InfoFieldList = explode(":", $param_list[0]);
5054
-						dol_include_once($InfoFieldList[1]);
5055
-						if ($InfoFieldList[0] && class_exists($InfoFieldList[0]))
5056
-						{
5057
-							if ($value == '-1')	// -1 is key for no defined in combo list of objects
5058
-							{
5059
-								$new_array_options[$key]='';
5060
-							}
5061
-							elseif ($value)
5062
-							{
5063
-								$object = new $InfoFieldList[0]($this->db);
5064
-								if (is_numeric($value)) $res=$object->fetch($value);
5065
-								else $res=$object->fetch('',$value);
5066
-
5067
-								if ($res > 0) $new_array_options[$key]=$object->id;
5068
-								else
5069
-								{
5070
-									$this->error="Id/Ref '".$value."' for object '".$object->element."' not found";
5071
-									$this->db->rollback();
5072
-									return -1;
5073
-								}
5074
-							}
5075
-						}
5076
-						else
5077
-						{
5078
-							dol_syslog('Error bad setup of extrafield', LOG_WARNING);
5079
-						}
5080
-						break;
5081
-			   	}
5082
-			}
1698
+    /**
1699
+     *      Return list of id of contacts of object
1700
+     *
1701
+     *      @param	string	$source     Source of contact: external (llx_socpeople) or internal (llx_user) or thirdparty (llx_societe)
1702
+     *      @return array				Array of id of contacts (if source=external or internal)
1703
+     * 									Array of id of third parties with at least one contact on object (if source=thirdparty)
1704
+     */
1705
+    function getListContactId($source='external')
1706
+    {
1707
+        $contactAlreadySelected = array();
1708
+        $tab = $this->liste_contact(-1,$source);
1709
+        $num=count($tab);
1710
+        $i = 0;
1711
+        while ($i < $num)
1712
+        {
1713
+            if ($source == 'thirdparty') $contactAlreadySelected[$i] = $tab[$i]['socid'];
1714
+            else  $contactAlreadySelected[$i] = $tab[$i]['id'];
1715
+            $i++;
1716
+        }
1717
+        return $contactAlreadySelected;
1718
+    }
5083 1719
 
5084
-			$this->db->begin();
5085 1720
 
5086
-			$table_element = $this->table_element;
5087
-			if ($table_element == 'categorie') $table_element = 'categories'; // For compatibility
1721
+    /**
1722
+     *	Link element with a project
1723
+     *
1724
+     *	@param     	int		$projectid		Project id to link element to
1725
+     *	@return		int						<0 if KO, >0 if OK
1726
+     */
1727
+    function setProject($projectid)
1728
+    {
1729
+        if (! $this->table_element)
1730
+        {
1731
+            dol_syslog(get_class($this)."::setProject was called on objet with property table_element not defined",LOG_ERR);
1732
+            return -1;
1733
+        }
5088 1734
 
5089
-			$sql_del = "DELETE FROM ".MAIN_DB_PREFIX.$table_element."_extrafields WHERE fk_object = ".$this->id;
5090
-			dol_syslog(get_class($this)."::insertExtraFields delete", LOG_DEBUG);
5091
-			$this->db->query($sql_del);
1735
+        $sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
1736
+        if ($this->table_element == 'actioncomm')
1737
+        {
1738
+            if ($projectid) $sql.= ' SET fk_project = '.$projectid;
1739
+            else $sql.= ' SET fk_project = NULL';
1740
+            $sql.= ' WHERE id = '.$this->id;
1741
+        }
1742
+        else
1743
+        {
1744
+            if ($projectid) $sql.= ' SET fk_projet = '.$projectid;
1745
+            else $sql.= ' SET fk_projet = NULL';
1746
+            $sql.= ' WHERE rowid = '.$this->id;
1747
+        }
5092 1748
 
5093
-			$sql = "INSERT INTO ".MAIN_DB_PREFIX.$table_element."_extrafields (fk_object";
5094
-			foreach($new_array_options as $key => $value)
5095
-			{
5096
-				$attributeKey = substr($key,8);   // Remove 'options_' prefix
5097
-				// Add field of attribut
5098
-				if ($extrafields->attributes[$this->table_element]['type'][$attributeKey] != 'separate') // Only for other type than separator
5099
-					$sql.=",".$attributeKey;
5100
-			}
5101
-			$sql .= ") VALUES (".$this->id;
5102
-
5103
-			foreach($new_array_options as $key => $value)
5104
-			{
5105
-				$attributeKey = substr($key,8);   // Remove 'options_' prefix
5106
-				// Add field of attribute
5107
-				if ($extrafields->attributes[$this->table_element]['type'][$attributeKey] != 'separate') // Only for other type than separator)
5108
-				{
5109
-					if ($new_array_options[$key] != '')
5110
-					{
5111
-						$sql.=",'".$this->db->escape($new_array_options[$key])."'";
5112
-					}
5113
-					else
5114
-					{
5115
-						$sql.=",null";
5116
-					}
5117
-				}
5118
-			}
5119
-			$sql.=")";
1749
+        dol_syslog(get_class($this)."::setProject", LOG_DEBUG);
1750
+        if ($this->db->query($sql))
1751
+        {
1752
+            $this->fk_project = $projectid;
1753
+            return 1;
1754
+        }
1755
+        else
1756
+        {
1757
+            dol_print_error($this->db);
1758
+            return -1;
1759
+        }
1760
+    }
5120 1761
 
5121
-			dol_syslog(get_class($this)."::insertExtraFields insert", LOG_DEBUG);
5122
-			$resql = $this->db->query($sql);
5123
-			if (! $resql)
5124
-			{
5125
-				$this->error=$this->db->lasterror();
5126
-				$error++;
5127
-			}
1762
+    /**
1763
+     *  Change the payments methods
1764
+     *
1765
+     *  @param		int		$id		Id of new payment method
1766
+     *  @return		int				>0 if OK, <0 if KO
1767
+     */
1768
+    function setPaymentMethods($id)
1769
+    {
1770
+        dol_syslog(get_class($this).'::setPaymentMethods('.$id.')');
1771
+        if ($this->statut >= 0 || $this->element == 'societe')
1772
+        {
1773
+            // TODO uniformize field name
1774
+            $fieldname = 'fk_mode_reglement';
1775
+            if ($this->element == 'societe') $fieldname = 'mode_reglement';
1776
+            if (get_class($this) == 'Fournisseur') $fieldname = 'mode_reglement_supplier';
5128 1777
 
5129
-			if (! $error && $trigger)
5130
-			{
5131
-				// Call trigger
5132
-				$this->context=array('extrafieldaddupdate'=>1);
5133
-				$result=$this->call_trigger($trigger, $userused);
5134
-				if ($result < 0) $error++;
5135
-				// End call trigger
5136
-			}
5137
-
5138
-			if ($error)
5139
-			{
5140
-				$this->db->rollback();
5141
-				return -1;
5142
-			}
5143
-			else
5144
-			{
5145
-				$this->db->commit();
5146
-				return 1;
5147
-			}
5148
-		}
5149
-		else return 0;
5150
-	}
5151
-
5152
-	/**
5153
-	 *	Update an extra field value for the current object.
5154
-	 *  Data to describe values to update are stored into $this->array_options=array('options_codeforfield1'=>'valueforfield1', 'options_codeforfield2'=>'valueforfield2', ...)
5155
-	 *
5156
-	 *  @param  string      $key    		Key of the extrafield (without starting 'options_')
5157
-	 *  @param	string		$trigger		If defined, call also the trigger (for example COMPANY_MODIFY)
5158
-	 *  @param	User		$userused		Object user
5159
-	 *  @return int                 		-1=error, O=did nothing, 1=OK
5160
-	 *  @see setValueFrom, insertExtraFields
5161
-	 */
5162
-	function updateExtraField($key, $trigger=null, $userused=null)
5163
-	{
5164
-		global $conf,$langs,$user;
5165
-
5166
-		if (empty($userused)) $userused=$user;
5167
-
5168
-		$error=0;
5169
-
5170
-		if (! empty($conf->global->MAIN_EXTRAFIELDS_DISABLED)) return 0;	// For avoid conflicts if trigger used
5171
-
5172
-		if (! empty($this->array_options) && isset($this->array_options["options_".$key]))
5173
-		{
5174
-			// Check parameters
5175
-			$langs->load('admin');
5176
-			require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
5177
-			$extrafields = new ExtraFields($this->db);
5178
-			$target_extrafields=$extrafields->fetch_name_optionals_label($this->table_element);
5179
-
5180
-			$value=$this->array_options["options_".$key];
5181
-
5182
-			$attributeType     = $extrafields->attributes[$this->table_element]['type'][$key];
5183
-			$attributeLabel    = $extrafields->attributes[$this->table_element]['label'][$key];
5184
-			$attributeParam    = $extrafields->attributes[$this->table_element]['param'][$key];
5185
-			$attributeRequired = $extrafields->attributes[$this->table_element]['required'][$key];
5186
-
5187
-			//dol_syslog("attributeLabel=".$attributeLabel, LOG_DEBUG);
5188
-			//dol_syslog("attributeType=".$attributeType, LOG_DEBUG);
5189
-
5190
-			switch ($attributeType)
5191
-			{
5192
-				case 'int':
5193
-					if (!is_numeric($value) && $value!='')
5194
-					{
5195
-						$this->errors[]=$langs->trans("ExtraFieldHasWrongValue",$attributeLabel);
5196
-						return -1;
5197
-					}
5198
-					elseif ($value=='')
5199
-					{
5200
-						$this->array_options["options_".$key] = null;
5201
-					}
5202
-					break;
5203
-				case 'double':
5204
-					$value = price2num($value);
5205
-					if (!is_numeric($value) && $value!='')
5206
-					{
5207
-						dol_syslog($langs->trans("ExtraFieldHasWrongValue")." sur ".$attributeLabel."(".$value."is not '".$attributeType."')", LOG_DEBUG);
5208
-						$this->errors[]=$langs->trans("ExtraFieldHasWrongValue", $attributeLabel);
5209
-						return -1;
5210
-					}
5211
-					elseif ($value=='')
5212
-					{
5213
-						$this->array_options["options_".$key] = null;
5214
-					}
5215
-					//dol_syslog("double value"." sur ".$attributeLabel."(".$value." is '".$attributeType."')", LOG_DEBUG);
5216
-					$this->array_options["options_".$key] = $value;
5217
-					break;
5218
-			 	/*case 'select':	// Not required, we chosed value='0' for undefined values
5219
-             		if ($value=='-1')
5220
-             		{
5221
-             			$this->array_options[$key] = null;
5222
-             		}
5223
-             		break;*/
5224
-				case 'price':
5225
-					$this->array_options["options_".$key] = price2num($this->array_options["options_".$key]);
5226
-					break;
5227
-				case 'date':
5228
-					$this->array_options["options_".$key]=$this->db->idate($this->array_options["options_".$key]);
5229
-					break;
5230
-				case 'datetime':
5231
-					$this->array_options["options_".$key]=$this->db->idate($this->array_options["options_".$key]);
5232
-					break;
5233
-				case 'link':
5234
-					$param_list=array_keys($attributeParam['options']);
5235
-					// 0 : ObjectName
5236
-					// 1 : classPath
5237
-					$InfoFieldList = explode(":", $param_list[0]);
5238
-					dol_include_once($InfoFieldList[1]);
5239
-					if ($value)
5240
-					{
5241
-						$object = new $InfoFieldList[0]($this->db);
5242
-						$object->fetch(0,$value);
5243
-						$this->array_options["options_".$key]=$object->id;
5244
-					}
5245
-					break;
5246
-			}
5247
-
5248
-			$this->db->begin();
5249
-			$sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element."_extrafields SET ".$key."='".$this->db->escape($this->array_options["options_".$key])."'";
5250
-			$sql .= " WHERE fk_object = ".$this->id;
5251
-			$resql = $this->db->query($sql);
5252
-			if (! $resql)
5253
-			{
5254
-				$error++;
5255
-				$this->error=$this->db->lasterror();
5256
-			}
1778
+            $sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
1779
+            $sql .= ' SET '.$fieldname.' = '.$id;
1780
+            $sql .= ' WHERE rowid='.$this->id;
5257 1781
 
5258
-			if (! $error && $trigger)
5259
-			{
5260
-				// Call trigger
5261
-				$this->context=array('extrafieldupdate'=>1);
5262
-				$result=$this->call_trigger($trigger, $userused);
5263
-				if ($result < 0) $error++;
5264
-				// End call trigger
5265
-			}
5266
-
5267
-			if ($error)
5268
-			{
5269
-				dol_syslog(get_class($this) . "::".__METHOD__ . $this->error, LOG_ERR);
5270
-				$this->db->rollback();
5271
-				return -1;
5272
-			}
5273
-			else
5274
-			{
5275
-				$this->db->commit();
5276
-				return 1;
5277
-			}
5278
-		}
5279
-		else return 0;
5280
-	}
5281
-
5282
-
5283
-	/**
5284
-	 * Return HTML string to put an input field into a page
5285
-	 * Code very similar with showInputField of extra fields
5286
-	 *
5287
-	 * @param  array   		$val	       Array of properties for field to show
5288
-	 * @param  string  		$key           Key of attribute
5289
-	 * @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)
5290
-	 * @param  string  		$moreparam     To add more parameters on html input tag
5291
-	 * @param  string  		$keysuffix     Prefix string to add into name and id of field (can be used to avoid duplicate names)
5292
-	 * @param  string  		$keyprefix     Suffix string to add into name and id of field (can be used to avoid duplicate names)
5293
-	 * @param  string|int		$morecss       Value for css to define style/length of field. May also be a numeric.
5294
-	 * @return string
5295
-	 */
5296
-	function showInputField($val, $key, $value, $moreparam='', $keysuffix='', $keyprefix='', $morecss=0)
5297
-	{
5298
-		global $conf,$langs,$form;
5299
-
5300
-		if (! is_object($form))
5301
-		{
5302
-			require_once DOL_DOCUMENT_ROOT.'/core/class/html.form.class.php';
5303
-			$form=new Form($this->db);
5304
-		}
5305
-
5306
-		$val=$this->fields[$key];
5307
-
5308
-		$out='';
5309
-        $type='';
5310
-        $param = array();
5311
-        $param['options']=array();
5312
-        $size =$this->fields[$key]['size'];
5313
-        // Because we work on extrafields
5314
-        if(preg_match('/^integer:(.*):(.*)/i', $val['type'], $reg)){
5315
-            $param['options']=array($reg[1].':'.$reg[2]=>'N');
5316
-            $type ='link';
5317
-        } elseif(preg_match('/^link:(.*):(.*)/i', $val['type'], $reg)) {
5318
-            $param['options']=array($reg[1].':'.$reg[2]=>'N');
5319
-            $type ='link';
5320
-        } elseif(preg_match('/^sellist:(.*):(.*):(.*):(.*)/i', $val['type'], $reg)) {
5321
-            $param['options']=array($reg[1].':'.$reg[2].':'.$reg[3].':'.$reg[4]=>'N');
5322
-            $type ='sellist';
5323
-        } elseif(preg_match('/varchar\((\d+)\)/', $val['type'],$reg)) {
5324
-            $param['options']=array();
5325
-            $type ='varchar';
5326
-            $size=$reg[1];
5327
-        } elseif(preg_match('/varchar/', $val['type'])) {
5328
-            $param['options']=array();
5329
-            $type ='varchar';
5330
-        } elseif(is_array($this->fields[$key]['arrayofkeyval'])) {
5331
-            $param['options']=$this->fields[$key]['arrayofkeyval'];
5332
-            $type ='select';
5333
-        } else {
5334
-            $param['options']=array();
5335
-            $type =$this->fields[$key]['type'];
1782
+            if ($this->db->query($sql))
1783
+            {
1784
+                $this->mode_reglement_id = $id;
1785
+                // for supplier
1786
+                if (get_class($this) == 'Fournisseur') $this->mode_reglement_supplier_id = $id;
1787
+                return 1;
1788
+            }
1789
+            else
1790
+            {
1791
+                dol_syslog(get_class($this).'::setPaymentMethods Erreur '.$sql.' - '.$this->db->error());
1792
+                $this->error=$this->db->error();
1793
+                return -1;
1794
+            }
1795
+        }
1796
+        else
1797
+        {
1798
+            dol_syslog(get_class($this).'::setPaymentMethods, status of the object is incompatible');
1799
+            $this->error='Status of the object is incompatible '.$this->statut;
1800
+            return -2;
5336 1801
         }
1802
+    }
5337 1803
 
5338
-		$label=$this->fields[$key]['label'];
5339
-		//$elementtype=$this->fields[$key]['elementtype'];	// Seems not used
5340
-		$default=$this->fields[$key]['default'];
5341
-		$computed=$this->fields[$key]['computed'];
5342
-		$unique=$this->fields[$key]['unique'];
5343
-		$required=$this->fields[$key]['required'];
1804
+    /**
1805
+     *  Change the multicurrency code
1806
+     *
1807
+     *  @param		string	$code	multicurrency code
1808
+     *  @return		int				>0 if OK, <0 if KO
1809
+     */
1810
+    function setMulticurrencyCode($code)
1811
+    {
1812
+        dol_syslog(get_class($this).'::setMulticurrencyCode('.$id.')');
1813
+        if ($this->statut >= 0 || $this->element == 'societe')
1814
+        {
1815
+            $fieldname = 'multicurrency_code';
5344 1816
 
5345
-		$langfile=$this->fields[$key]['langfile'];
5346
-		$list=$this->fields[$key]['list'];
5347
-		$hidden=abs($this->fields[$key]['visible'])!=1?1:0;
1817
+            $sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
1818
+            $sql .= ' SET '.$fieldname." = '".$this->db->escape($code)."'";
1819
+            $sql .= ' WHERE rowid='.$this->id;
5348 1820
 
5349
-		$objectid = $this->id;
1821
+            if ($this->db->query($sql))
1822
+            {
1823
+                $this->multicurrency_code = $code;
5350 1824
 
1825
+                list($fk_multicurrency, $rate) = MultiCurrency::getIdAndTxFromCode($this->db, $code);
1826
+                if ($rate) $this->setMulticurrencyRate($rate,2);
5351 1827
 
5352
-		if ($computed)
5353
-		{
5354
-			if (! preg_match('/^search_/', $keyprefix)) return '<span class="opacitymedium">'.$langs->trans("AutomaticallyCalculated").'</span>';
5355
-			else return '';
5356
-		}
1828
+                return 1;
1829
+            }
1830
+            else
1831
+            {
1832
+                dol_syslog(get_class($this).'::setMulticurrencyCode Erreur '.$sql.' - '.$this->db->error());
1833
+                $this->error=$this->db->error();
1834
+                return -1;
1835
+            }
1836
+        }
1837
+        else
1838
+        {
1839
+            dol_syslog(get_class($this).'::setMulticurrencyCode, status of the object is incompatible');
1840
+            $this->error='Status of the object is incompatible '.$this->statut;
1841
+            return -2;
1842
+        }
1843
+    }
5357 1844
 
1845
+    /**
1846
+     *  Change the multicurrency rate
1847
+     *
1848
+     *  @param		double	$rate	multicurrency rate
1849
+     *  @param		int		$mode	mode 1 : amounts in company currency will be recalculated, mode 2 : amounts in foreign currency
1850
+     *  @return		int				>0 if OK, <0 if KO
1851
+     */
1852
+    function setMulticurrencyRate($rate, $mode=1)
1853
+    {
1854
+        dol_syslog(get_class($this).'::setMulticurrencyRate('.$id.')');
1855
+        if ($this->statut >= 0 || $this->element == 'societe')
1856
+        {
1857
+            $fieldname = 'multicurrency_tx';
5358 1858
 
5359
-		// Use in priority showsize from parameters, then $val['css'] then autodefine
5360
-		if (empty($morecss) && ! empty($val['css']))
5361
-		{
5362
-			$showsize = $val['css'];
5363
-		}
5364
-		if (empty($morecss))
5365
-		{
5366
-			if ($type == 'date')
5367
-			{
5368
-				$morecss = 'minwidth100imp';
5369
-			}
5370
-			elseif ($type == 'datetime')
5371
-			{
5372
-				$morecss = 'minwidth200imp';
5373
-			}
5374
-			elseif (in_array($type,array('int','integer','price')) || preg_match('/^double(\([0-9],[0-9]\)){0,1}/',$type))
5375
-			{
5376
-				$morecss = 'maxwidth75';
5377
-                        }elseif ($type == 'url')
5378
-			{
5379
-				$morecss='minwidth400';
5380
-			}
5381
-			elseif ($type == 'boolean')
5382
-			{
5383
-				$morecss='';
5384
-			}
5385
-			else
5386
-			{
5387
-				if (round($size) < 12)
5388
-				{
5389
-					$morecss = 'minwidth100';
5390
-				}
5391
-				else if (round($size) <= 48)
5392
-				{
5393
-					$morecss = 'minwidth200';
5394
-				}
5395
-				else
5396
-				{
5397
-					$morecss = 'minwidth400';
5398
-				}
5399
-			}
5400
-		}
5401
-
5402
-		if (in_array($type,array('date','datetime')))
5403
-		{
5404
-			$tmp=explode(',',$size);
5405
-			$newsize=$tmp[0];
5406
-
5407
-			$showtime = in_array($type,array('datetime')) ? 1 : 0;
5408
-
5409
-			// Do not show current date when field not required (see selectDate() method)
5410
-			if (!$required && $value == '') $value = '-1';
5411
-
5412
-			// TODO Must also support $moreparam
5413
-			$out = $form->selectDate($value, $keyprefix.$key.$keysuffix, $showtime, $showtime, $required, '', 1, (($keyprefix != 'search_' && $keyprefix != 'search_options_') ? 1 : 0), 0, 1);
5414
-		}
5415
-		elseif (in_array($type,array('int','integer')))
5416
-		{
5417
-			$tmp=explode(',',$size);
5418
-			$newsize=$tmp[0];
5419
-			$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:'').'>';
5420
-		}
5421
-		elseif (preg_match('/varchar/', $type))
5422
-		{
5423
-			$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
-		}
5425
-		elseif (in_array($type, array('mail', 'phone', 'url')))
5426
-		{
5427
-			$out='<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" value="'.dol_escape_htmltag($value).'" '.($moreparam?$moreparam:'').'>';
5428
-		}
5429
-		elseif ($type == 'text')
5430
-		{
5431
-			if (! preg_match('/search_/', $keyprefix))		// If keyprefix is search_ or search_options_, we must just use a simple text field
5432
-			{
5433
-				require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
5434
-				$doleditor=new DolEditor($keyprefix.$key.$keysuffix,$value,'',200,'dolibarr_notes','In',false,false,false,ROWS_5,'90%');
5435
-				$out=$doleditor->Create(1);
5436
-			}
5437
-			else
5438
-			{
5439
-				$out='<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" value="'.dol_escape_htmltag($value).'" '.($moreparam?$moreparam:'').'>';
5440
-			}
5441
-		}
5442
-		elseif ($type == 'html')
5443
-		{
5444
-			if (! preg_match('/search_/', $keyprefix))		// If keyprefix is search_ or search_options_, we must just use a simple text field
5445
-			{
5446
-				require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
5447
-				$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%');
5448
-				$out=$doleditor->Create(1);
5449
-			}
5450
-			else
5451
-			{
5452
-				$out='<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" value="'.dol_escape_htmltag($value).'" '.($moreparam?$moreparam:'').'>';
5453
-			}
5454
-		}
5455
-		elseif ($type == 'boolean')
5456
-		{
5457
-			$checked='';
5458
-			if (!empty($value)) {
5459
-				$checked=' checked value="1" ';
5460
-			} else {
5461
-				$checked=' value="1" ';
5462
-			}
5463
-			$out='<input type="checkbox" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" '.$checked.' '.($moreparam?$moreparam:'').'>';
5464
-		}
5465
-		elseif ($type == 'price')
5466
-		{
5467
-			if (!empty($value)) {		// $value in memory is a php numeric, we format it into user number format.
5468
-				$value=price($value);
5469
-			}
5470
-			$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
-		}
5472
-		elseif (preg_match('/^double(\([0-9],[0-9]\)){0,1}/',$type))
5473
-		{
5474
-			if (!empty($value)) {		// $value in memory is a php numeric, we format it into user number format.
5475
-				$value=price($value);
5476
-			}
5477
-			$out='<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" value="'.$value.'" '.($moreparam?$moreparam:'').'> ';
5478
-		}
5479
-		elseif ($type == 'select')
5480
-		{
5481
-			$out = '';
5482
-			if (! empty($conf->use_javascript_ajax) && ! empty($conf->global->MAIN_EXTRAFIELDS_USE_SELECT2))
5483
-			{
5484
-				include_once DOL_DOCUMENT_ROOT . '/core/lib/ajax.lib.php';
5485
-				$out.= ajax_combobox($keyprefix.$key.$keysuffix, array(), 0);
5486
-			}
1859
+            $sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
1860
+            $sql .= ' SET '.$fieldname.' = '.$rate;
1861
+            $sql .= ' WHERE rowid='.$this->id;
5487 1862
 
5488
-			$out.='<select class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" '.($moreparam?$moreparam:'').'>';
5489
-                if((! isset($this->fields[$key]['default'])) ||($this->fields[$key]['notnull']!=1))$out.='<option value="0">&nbsp;</option>';
5490
-			foreach ($param['options'] as $key => $val)
5491
-			{
5492
-				if ((string) $key == '') continue;
5493
-				list($val, $parent) = explode('|', $val);
5494
-				$out.='<option value="'.$key.'"';
5495
-				$out.= (((string) $value == (string) $key)?' selected':'');
5496
-				$out.= (!empty($parent)?' parent="'.$parent.'"':'');
5497
-				$out.='>'.$val.'</option>';
5498
-			}
5499
-			$out.='</select>';
5500
-		}
5501
-		elseif ($type == 'sellist')
5502
-		{
5503
-			$out = '';
5504
-			if (! empty($conf->use_javascript_ajax) && ! empty($conf->global->MAIN_EXTRAFIELDS_USE_SELECT2))
5505
-			{
5506
-				include_once DOL_DOCUMENT_ROOT . '/core/lib/ajax.lib.php';
5507
-				$out.= ajax_combobox($keyprefix.$key.$keysuffix, array(), 0);
5508
-			}
1863
+            if ($this->db->query($sql))
1864
+            {
1865
+                $this->multicurrency_tx = $rate;
1866
+
1867
+                // Update line price
1868
+                if (!empty($this->lines))
1869
+                {
1870
+                    foreach ($this->lines as &$line)
1871
+                    {
1872
+                        if($mode == 1) {
1873
+                            $line->subprice = 0;
1874
+                        }
1875
+
1876
+                        switch ($this->element) {
1877
+                            case 'propal':
1878
+                                $this->updateline(
1879
+                                    $line->id, $line->subprice, $line->qty, $line->remise_percent, $line->tva_tx, $line->localtax1_tx, $line->localtax2_tx,
1880
+                                    ($line->description?$line->description:$line->desc), 'HT', $line->info_bits, $line->special_code, $line->fk_parent_line,
1881
+                                    $line->skip_update_total, $line->fk_fournprice, $line->pa_ht, $line->label, $line->product_type, $line->date_start,
1882
+                                    $line->date_end, $line->array_options, $line->fk_unit, $line->multicurrency_subprice
1883
+                                );
1884
+                                break;
1885
+                            case 'commande':
1886
+                                $this->updateline(
1887
+                                    $line->id, ($line->description?$line->description:$line->desc), $line->subprice, $line->qty, $line->remise_percent,
1888
+                                    $line->tva_tx, $line->localtax1_tx, $line->localtax2_tx, 'HT', $line->info_bits, $line->date_start, $line->date_end,
1889
+                                    $line->product_type, $line->fk_parent_line, $line->skip_update_total, $line->fk_fournprice, $line->pa_ht, $line->label,
1890
+                                    $line->special_code, $line->array_options, $line->fk_unit, $line->multicurrency_subprice
1891
+                                );
1892
+                                break;
1893
+                            case 'facture':
1894
+                                $this->updateline(
1895
+                                    $line->id, ($line->description?$line->description:$line->desc), $line->subprice, $line->qty, $line->remise_percent,
1896
+                                    $line->date_start, $line->date_end, $line->tva_tx, $line->localtax1_tx, $line->localtax2_tx, 'HT', $line->info_bits,
1897
+                                    $line->product_type, $line->fk_parent_line, $line->skip_update_total, $line->fk_fournprice, $line->pa_ht, $line->label,
1898
+                                    $line->special_code, $line->array_options, $line->situation_percent, $line->fk_unit, $line->multicurrency_subprice
1899
+                                );
1900
+                                break;
1901
+                            case 'supplier_proposal':
1902
+                                $this->updateline(
1903
+                                    $line->id, $line->subprice, $line->qty, $line->remise_percent, $line->tva_tx, $line->localtax1_tx, $line->localtax2_tx,
1904
+                                    ($line->description?$line->description:$line->desc), 'HT', $line->info_bits, $line->special_code, $line->fk_parent_line,
1905
+                                    $line->skip_update_total, $line->fk_fournprice, $line->pa_ht, $line->label, $line->product_type, $line->array_options,
1906
+                                    $line->ref_fourn, $line->multicurrency_subprice
1907
+                                );
1908
+                                break;
1909
+                            case 'order_supplier':
1910
+                                $this->updateline(
1911
+                                    $line->id, ($line->description?$line->description:$line->desc), $line->subprice, $line->qty, $line->remise_percent,
1912
+                                    $line->tva_tx, $line->localtax1_tx, $line->localtax2_tx, 'HT', $line->info_bits, $line->product_type, false,
1913
+                                    $line->date_start, $line->date_end, $line->array_options, $line->fk_unit, $line->multicurrency_subprice
1914
+                                );
1915
+                                break;
1916
+                            case 'invoice_supplier':
1917
+                                $this->updateline(
1918
+                                    $line->id, ($line->description?$line->description:$line->desc), $line->subprice, $line->tva_tx, $line->localtax1_tx,
1919
+                                    $line->localtax2_tx, $line->qty, 0, 'HT', $line->info_bits, $line->product_type, $line->remise_percent, false,
1920
+                                    $line->date_start, $line->date_end, $line->array_options, $line->fk_unit, $line->multicurrency_subprice
1921
+                                );
1922
+                                break;
1923
+                            default:
1924
+                                dol_syslog(get_class($this).'::setMulticurrencyRate no updateline defined', LOG_DEBUG);
1925
+                                break;
1926
+                        }
1927
+                    }
1928
+                }
1929
+
1930
+                return 1;
1931
+            }
1932
+            else
1933
+            {
1934
+                dol_syslog(get_class($this).'::setMulticurrencyRate Erreur '.$sql.' - '.$this->db->error());
1935
+                $this->error=$this->db->error();
1936
+                return -1;
1937
+            }
1938
+        }
1939
+        else
1940
+        {
1941
+            dol_syslog(get_class($this).'::setMulticurrencyRate, status of the object is incompatible');
1942
+            $this->error='Status of the object is incompatible '.$this->statut;
1943
+            return -2;
1944
+        }
1945
+    }
5509 1946
 
5510
-			$out.='<select class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" '.($moreparam?$moreparam:'').'>';
5511
-			if (is_array($param['options']))
5512
-			{
5513
-				$param_list=array_keys($param['options']);
5514
-				$InfoFieldList = explode(":", $param_list[0]);
5515
-				$parentName='';
5516
-				$parentField='';
5517
-				// 0 : tableName
5518
-				// 1 : label field name
5519
-				// 2 : key fields name (if differ of rowid)
5520
-				// 3 : key field parent (for dependent lists)
5521
-				// 4 : where clause filter on column or table extrafield, syntax field='value' or extra.field=value
5522
-				$keyList=(empty($InfoFieldList[2])?'rowid':$InfoFieldList[2].' as rowid');
5523
-
5524
-
5525
-				if (count($InfoFieldList) > 4 && ! empty($InfoFieldList[4]))
5526
-				{
5527
-					if (strpos($InfoFieldList[4], 'extra.') !== false)
5528
-					{
5529
-						$keyList='main.'.$InfoFieldList[2].' as rowid';
5530
-					} else {
5531
-						$keyList=$InfoFieldList[2].' as rowid';
5532
-					}
5533
-				}
5534
-				if (count($InfoFieldList) > 3 && ! empty($InfoFieldList[3]))
5535
-				{
5536
-					list($parentName, $parentField) = explode('|', $InfoFieldList[3]);
5537
-					$keyList.= ', '.$parentField;
5538
-				}
1947
+    /**
1948
+     *  Change the payments terms
1949
+     *
1950
+     *  @param		int		$id		Id of new payment terms
1951
+     *  @return		int				>0 if OK, <0 if KO
1952
+     */
1953
+    function setPaymentTerms($id)
1954
+    {
1955
+        dol_syslog(get_class($this).'::setPaymentTerms('.$id.')');
1956
+        if ($this->statut >= 0 || $this->element == 'societe')
1957
+        {
1958
+            // TODO uniformize field name
1959
+            $fieldname = 'fk_cond_reglement';
1960
+            if ($this->element == 'societe') $fieldname = 'cond_reglement';
1961
+            if (get_class($this) == 'Fournisseur') $fieldname = 'cond_reglement_supplier';
5539 1962
 
5540
-				$fields_label = explode('|',$InfoFieldList[1]);
5541
-				if (is_array($fields_label))
5542
-				{
5543
-					$keyList .=', ';
5544
-					$keyList .= implode(', ', $fields_label);
5545
-				}
1963
+            $sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
1964
+            $sql .= ' SET '.$fieldname.' = '.$id;
1965
+            $sql .= ' WHERE rowid='.$this->id;
5546 1966
 
5547
-				$sqlwhere='';
5548
-				$sql = 'SELECT '.$keyList;
5549
-				$sql.= ' FROM '.MAIN_DB_PREFIX .$InfoFieldList[0];
5550
-				if (!empty($InfoFieldList[4]))
5551
-				{
5552
-					// can use SELECT request
5553
-					if (strpos($InfoFieldList[4], '$SEL$')!==false) {
5554
-						$InfoFieldList[4]=str_replace('$SEL$','SELECT',$InfoFieldList[4]);
5555
-					}
5556
-
5557
-					// current object id can be use into filter
5558
-					if (strpos($InfoFieldList[4], '$ID$')!==false && !empty($objectid)) {
5559
-						$InfoFieldList[4]=str_replace('$ID$',$objectid,$InfoFieldList[4]);
5560
-					} else {
5561
-						$InfoFieldList[4]=str_replace('$ID$','0',$InfoFieldList[4]);
5562
-					}
5563
-					//We have to join on extrafield table
5564
-					if (strpos($InfoFieldList[4], 'extra')!==false)
5565
-					{
5566
-						$sql.= ' as main, '.MAIN_DB_PREFIX .$InfoFieldList[0].'_extrafields as extra';
5567
-						$sqlwhere.= ' WHERE extra.fk_object=main.'.$InfoFieldList[2]. ' AND '.$InfoFieldList[4];
5568
-					}
5569
-					else
5570
-					{
5571
-						$sqlwhere.= ' WHERE '.$InfoFieldList[4];
5572
-					}
5573
-				}
5574
-				else
5575
-				{
5576
-					$sqlwhere.= ' WHERE 1=1';
5577
-				}
5578
-				// Some tables may have field, some other not. For the moment we disable it.
5579
-				if (in_array($InfoFieldList[0],array('tablewithentity')))
5580
-				{
5581
-					$sqlwhere.= ' AND entity = '.$conf->entity;
5582
-				}
5583
-				$sql.=$sqlwhere;
5584
-				//print $sql;
1967
+            if ($this->db->query($sql))
1968
+            {
1969
+                $this->cond_reglement_id = $id;
1970
+                // for supplier
1971
+                if (get_class($this) == 'Fournisseur') $this->cond_reglement_supplier_id = $id;
1972
+                $this->cond_reglement = $id;	// for compatibility
1973
+                return 1;
1974
+            }
1975
+            else
1976
+            {
1977
+                dol_syslog(get_class($this).'::setPaymentTerms Erreur '.$sql.' - '.$this->db->error());
1978
+                $this->error=$this->db->error();
1979
+                return -1;
1980
+            }
1981
+        }
1982
+        else
1983
+        {
1984
+            dol_syslog(get_class($this).'::setPaymentTerms, status of the object is incompatible');
1985
+            $this->error='Status of the object is incompatible '.$this->statut;
1986
+            return -2;
1987
+        }
1988
+    }
5585 1989
 
5586
-				$sql .= ' ORDER BY ' . implode(', ', $fields_label);
1990
+    /**
1991
+     *	Define delivery address
1992
+     *  @deprecated
1993
+     *
1994
+     *	@param      int		$id		Address id
1995
+     *	@return     int				<0 si ko, >0 si ok
1996
+     */
1997
+    function setDeliveryAddress($id)
1998
+    {
1999
+        $fieldname = 'fk_delivery_address';
2000
+        if ($this->element == 'delivery' || $this->element == 'shipping') $fieldname = 'fk_address';
5587 2001
 
5588
-				dol_syslog(get_class($this).'::showInputField type=sellist', LOG_DEBUG);
5589
-				$resql = $this->db->query($sql);
5590
-				if ($resql)
5591
-				{
5592
-					$out.='<option value="0">&nbsp;</option>';
5593
-					$num = $this->db->num_rows($resql);
5594
-					$i = 0;
5595
-					while ($i < $num)
5596
-					{
5597
-						$labeltoshow='';
5598
-						$obj = $this->db->fetch_object($resql);
5599
-
5600
-						// Several field into label (eq table:code|libelle:rowid)
5601
-						$notrans = false;
5602
-						$fields_label = explode('|',$InfoFieldList[1]);
5603
-						if (is_array($fields_label))
5604
-						{
5605
-							$notrans = true;
5606
-							foreach ($fields_label as $field_toshow)
5607
-							{
5608
-								$labeltoshow.= $obj->$field_toshow.' ';
5609
-							}
5610
-						}
5611
-						else
5612
-						{
5613
-							$labeltoshow=$obj->{$InfoFieldList[1]};
5614
-						}
5615
-						$labeltoshow=dol_trunc($labeltoshow,45);
5616
-
5617
-						if ($value == $obj->rowid)
5618
-						{
5619
-							foreach ($fields_label as $field_toshow)
5620
-							{
5621
-								$translabel=$langs->trans($obj->$field_toshow);
5622
-								if ($translabel!=$obj->$field_toshow) {
5623
-									$labeltoshow=dol_trunc($translabel,18).' ';
5624
-								}else {
5625
-									$labeltoshow=dol_trunc($obj->$field_toshow,18).' ';
5626
-								}
5627
-							}
5628
-							$out.='<option value="'.$obj->rowid.'" selected>'.$labeltoshow.'</option>';
5629
-						}
5630
-						else
5631
-						{
5632
-							if (! $notrans)
5633
-							{
5634
-								$translabel=$langs->trans($obj->{$InfoFieldList[1]});
5635
-								if ($translabel!=$obj->{$InfoFieldList[1]}) {
5636
-									$labeltoshow=dol_trunc($translabel,18);
5637
-								}
5638
-								else {
5639
-									$labeltoshow=dol_trunc($obj->{$InfoFieldList[1]},18);
5640
-								}
5641
-							}
5642
-							if (empty($labeltoshow)) $labeltoshow='(not defined)';
5643
-							if ($value==$obj->rowid)
5644
-							{
5645
-								$out.='<option value="'.$obj->rowid.'" selected>'.$labeltoshow.'</option>';
5646
-							}
2002
+        $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element." SET ".$fieldname." = ".$id;
2003
+        $sql.= " WHERE rowid = ".$this->id." AND fk_statut = 0";
5647 2004
 
5648
-							if (!empty($InfoFieldList[3]) && $parentField)
5649
-							{
5650
-								$parent = $parentName.':'.$obj->{$parentField};
5651
-							}
2005
+        if ($this->db->query($sql))
2006
+        {
2007
+            $this->fk_delivery_address = $id;
2008
+            return 1;
2009
+        }
2010
+        else
2011
+        {
2012
+            $this->error=$this->db->error();
2013
+            dol_syslog(get_class($this).'::setDeliveryAddress Erreur '.$sql.' - '.$this->error);
2014
+            return -1;
2015
+        }
2016
+    }
5652 2017
 
5653
-							$out.='<option value="'.$obj->rowid.'"';
5654
-							$out.= ($value==$obj->rowid?' selected':'');
5655
-							$out.= (!empty($parent)?' parent="'.$parent.'"':'');
5656
-							$out.='>'.$labeltoshow.'</option>';
5657
-						}
5658 2018
 
5659
-						$i++;
5660
-					}
5661
-					$this->db->free($resql);
5662
-				}
5663
-				else {
5664
-					print 'Error in request '.$sql.' '.$this->db->lasterror().'. Check setup of extra parameters.<br>';
5665
-				}
5666
-			}
5667
-			$out.='</select>';
5668
-		}
5669
-		elseif ($type == 'checkbox')
5670
-		{
5671
-			$value_arr=explode(',',$value);
5672
-			$out=$form->multiselectarray($keyprefix.$key.$keysuffix, (empty($param['options'])?null:$param['options']), $value_arr, '', 0, '', 0, '100%');
5673
-		}
5674
-		elseif ($type == 'radio')
5675
-		{
5676
-			$out='';
5677
-			foreach ($param['options'] as $keyopt => $val)
5678
-			{
5679
-				$out.='<input class="flat '.$morecss.'" type="radio" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" '.($moreparam?$moreparam:'');
5680
-				$out.=' value="'.$keyopt.'"';
5681
-				$out.=' id="'.$keyprefix.$key.$keysuffix.'_'.$keyopt.'"';
5682
-				$out.= ($value==$keyopt?'checked':'');
5683
-				$out.='/><label for="'.$keyprefix.$key.$keysuffix.'_'.$keyopt.'">'.$val.'</label><br>';
5684
-			}
5685
-		}
5686
-		elseif ($type == 'chkbxlst')
5687
-		{
5688
-			if (is_array($value)) {
5689
-				$value_arr = $value;
5690
-			}
5691
-			else {
5692
-				$value_arr = explode(',', $value);
5693
-			}
5694
-
5695
-			if (is_array($param['options'])) {
5696
-				$param_list = array_keys($param['options']);
5697
-				$InfoFieldList = explode(":", $param_list[0]);
5698
-				$parentName='';
5699
-				$parentField='';
5700
-				// 0 : tableName
5701
-				// 1 : label field name
5702
-				// 2 : key fields name (if differ of rowid)
5703
-				// 3 : key field parent (for dependent lists)
5704
-				// 4 : where clause filter on column or table extrafield, syntax field='value' or extra.field=value
5705
-				$keyList = (empty($InfoFieldList[2]) ? 'rowid' : $InfoFieldList[2] . ' as rowid');
5706
-
5707
-				if (count($InfoFieldList) > 3 && ! empty($InfoFieldList[3])) {
5708
-					list ( $parentName, $parentField ) = explode('|', $InfoFieldList[3]);
5709
-					$keyList .= ', ' . $parentField;
5710
-				}
5711
-				if (count($InfoFieldList) > 4 && ! empty($InfoFieldList[4])) {
5712
-					if (strpos($InfoFieldList[4], 'extra.') !== false) {
5713
-						$keyList = 'main.' . $InfoFieldList[2] . ' as rowid';
5714
-					} else {
5715
-						$keyList = $InfoFieldList[2] . ' as rowid';
5716
-					}
5717
-				}
2019
+    /**
2020
+     *  Change the shipping method
2021
+     *
2022
+     *  @param      int     $shipping_method_id     Id of shipping method
2023
+     *  @param      bool    $notrigger              false=launch triggers after, true=disable triggers
2024
+     *  @param      User	$userused               Object user
2025
+     *
2026
+     *  @return     int              1 if OK, 0 if KO
2027
+     */
2028
+    function setShippingMethod($shipping_method_id, $notrigger=false, $userused=null)
2029
+    {
2030
+        global $user;
5718 2031
 
5719
-				$fields_label = explode('|', $InfoFieldList[1]);
5720
-				if (is_array($fields_label)) {
5721
-					$keyList .= ', ';
5722
-					$keyList .= implode(', ', $fields_label);
5723
-				}
2032
+        if (empty($userused)) $userused=$user;
5724 2033
 
5725
-				$sqlwhere = '';
5726
-				$sql = 'SELECT ' . $keyList;
5727
-				$sql .= ' FROM ' . MAIN_DB_PREFIX . $InfoFieldList[0];
5728
-				if (! empty($InfoFieldList[4])) {
5729
-
5730
-					// can use SELECT request
5731
-					if (strpos($InfoFieldList[4], '$SEL$')!==false) {
5732
-						$InfoFieldList[4]=str_replace('$SEL$','SELECT',$InfoFieldList[4]);
5733
-					}
5734
-
5735
-					// current object id can be use into filter
5736
-					if (strpos($InfoFieldList[4], '$ID$')!==false && !empty($objectid)) {
5737
-						$InfoFieldList[4]=str_replace('$ID$',$objectid,$InfoFieldList[4]);
5738
-					} else {
5739
-						$InfoFieldList[4]=str_replace('$ID$','0',$InfoFieldList[4]);
5740
-					}
5741
-
5742
-					// We have to join on extrafield table
5743
-					if (strpos($InfoFieldList[4], 'extra') !== false) {
5744
-						$sql .= ' as main, ' . MAIN_DB_PREFIX . $InfoFieldList[0] . '_extrafields as extra';
5745
-						$sqlwhere .= ' WHERE extra.fk_object=main.' . $InfoFieldList[2] . ' AND ' . $InfoFieldList[4];
5746
-					} else {
5747
-						$sqlwhere .= ' WHERE ' . $InfoFieldList[4];
5748
-					}
5749
-				} else {
5750
-					$sqlwhere .= ' WHERE 1=1';
5751
-				}
5752
-				// Some tables may have field, some other not. For the moment we disable it.
5753
-				if (in_array($InfoFieldList[0], array ('tablewithentity')))
5754
-				{
5755
-					$sqlwhere .= ' AND entity = ' . $conf->entity;
5756
-				}
5757
-				// $sql.=preg_replace('/^ AND /','',$sqlwhere);
5758
-				// print $sql;
5759
-
5760
-				$sql .= $sqlwhere;
5761
-				dol_syslog(get_class($this) . '::showInputField type=chkbxlst',LOG_DEBUG);
5762
-				$resql = $this->db->query($sql);
5763
-				if ($resql) {
5764
-					$num = $this->db->num_rows($resql);
5765
-					$i = 0;
5766
-
5767
-					$data=array();
5768
-
5769
-					while ( $i < $num ) {
5770
-						$labeltoshow = '';
5771
-						$obj = $this->db->fetch_object($resql);
5772
-
5773
-						$notrans = false;
5774
-						// Several field into label (eq table:code|libelle:rowid)
5775
-						$fields_label = explode('|', $InfoFieldList[1]);
5776
-						if (is_array($fields_label)) {
5777
-							$notrans = true;
5778
-							foreach ( $fields_label as $field_toshow ) {
5779
-								$labeltoshow .= $obj->$field_toshow . ' ';
5780
-							}
5781
-						} else {
5782
-							$labeltoshow = $obj->{$InfoFieldList[1]};
5783
-						}
5784
-						$labeltoshow = dol_trunc($labeltoshow, 45);
5785
-
5786
-						if (is_array($value_arr) && in_array($obj->rowid, $value_arr)) {
5787
-							foreach ( $fields_label as $field_toshow ) {
5788
-								$translabel = $langs->trans($obj->$field_toshow);
5789
-								if ($translabel != $obj->$field_toshow) {
5790
-									$labeltoshow = dol_trunc($translabel, 18) . ' ';
5791
-								} else {
5792
-									$labeltoshow = dol_trunc($obj->$field_toshow, 18) . ' ';
5793
-								}
5794
-							}
2034
+        $error = 0;
5795 2035
 
5796
-							$data[$obj->rowid]=$labeltoshow;
5797
-						} else {
5798
-							if (! $notrans) {
5799
-								$translabel = $langs->trans($obj->{$InfoFieldList[1]});
5800
-								if ($translabel != $obj->{$InfoFieldList[1]}) {
5801
-									$labeltoshow = dol_trunc($translabel, 18);
5802
-								} else {
5803
-									$labeltoshow = dol_trunc($obj->{$InfoFieldList[1]}, 18);
5804
-								}
5805
-							}
5806
-							if (empty($labeltoshow))
5807
-								$labeltoshow = '(not defined)';
2036
+        if (! $this->table_element) {
2037
+            dol_syslog(get_class($this)."::setShippingMethod was called on objet with property table_element not defined",LOG_ERR);
2038
+            return -1;
2039
+        }
5808 2040
 
5809
-								if (is_array($value_arr) && in_array($obj->rowid, $value_arr)) {
5810
-									$data[$obj->rowid]=$labeltoshow;
5811
-								}
2041
+        $this->db->begin();
5812 2042
 
5813
-								if (! empty($InfoFieldList[3]) && $parentField) {
5814
-									$parent = $parentName . ':' . $obj->{$parentField};
5815
-								}
2043
+        if ($shipping_method_id<0) $shipping_method_id='NULL';
2044
+        dol_syslog(get_class($this).'::setShippingMethod('.$shipping_method_id.')');
5816 2045
 
5817
-								$data[$obj->rowid]=$labeltoshow;
5818
-						}
2046
+        $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
2047
+        $sql.= " SET fk_shipping_method = ".$shipping_method_id;
2048
+        $sql.= " WHERE rowid=".$this->id;
2049
+        $resql = $this->db->query($sql);
2050
+        if (! $resql) {
2051
+            dol_syslog(get_class($this).'::setShippingMethod Error ', LOG_DEBUG);
2052
+            $this->error = $this->db->lasterror();
2053
+            $error++;
2054
+        } else {
2055
+            if (!$notrigger)
2056
+            {
2057
+                // Call trigger
2058
+                $this->context=array('shippingmethodupdate'=>1);
2059
+                $result = $this->call_trigger(strtoupper(get_class($this)) . '_MODIFY', $userused);
2060
+                if ($result < 0) $error++;
2061
+                // End call trigger
2062
+            }
2063
+        }
2064
+        if ($error)
2065
+        {
2066
+            $this->db->rollback();
2067
+            return -1;
2068
+        } else {
2069
+            $this->shipping_method_id = ($shipping_method_id=='NULL')?null:$shipping_method_id;
2070
+            $this->db->commit();
2071
+            return 1;
2072
+        }
2073
+    }
2074
+
2075
+
2076
+    /**
2077
+     *  Change the warehouse
2078
+     *
2079
+     *  @param      int     $warehouse_id     Id of warehouse
2080
+     *  @return     int              1 if OK, 0 if KO
2081
+     */
2082
+    function setWarehouse($warehouse_id)
2083
+    {
2084
+        if (! $this->table_element) {
2085
+            dol_syslog(get_class($this)."::setWarehouse was called on objet with property table_element not defined",LOG_ERR);
2086
+            return -1;
2087
+        }
2088
+        if ($warehouse_id<0) $warehouse_id='NULL';
2089
+        dol_syslog(get_class($this).'::setWarehouse('.$warehouse_id.')');
2090
+
2091
+        $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
2092
+        $sql.= " SET fk_warehouse = ".$warehouse_id;
2093
+        $sql.= " WHERE rowid=".$this->id;
2094
+
2095
+        if ($this->db->query($sql)) {
2096
+            $this->warehouse_id = ($warehouse_id=='NULL')?null:$warehouse_id;
2097
+            return 1;
2098
+        } else {
2099
+            dol_syslog(get_class($this).'::setWarehouse Error ', LOG_DEBUG);
2100
+            $this->error=$this->db->error();
2101
+            return 0;
2102
+        }
2103
+    }
2104
+
2105
+
2106
+    /**
2107
+     *		Set last model used by doc generator
2108
+     *
2109
+     *		@param		User	$user		User object that make change
2110
+     *		@param		string	$modelpdf	Modele name
2111
+     *		@return		int					<0 if KO, >0 if OK
2112
+     */
2113
+    function setDocModel($user, $modelpdf)
2114
+    {
2115
+        if (! $this->table_element)
2116
+        {
2117
+            dol_syslog(get_class($this)."::setDocModel was called on objet with property table_element not defined",LOG_ERR);
2118
+            return -1;
2119
+        }
2120
+
2121
+        $newmodelpdf=dol_trunc($modelpdf,255);
2122
+
2123
+        $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
2124
+        $sql.= " SET model_pdf = '".$this->db->escape($newmodelpdf)."'";
2125
+        $sql.= " WHERE rowid = ".$this->id;
2126
+        // if ($this->element == 'facture') $sql.= " AND fk_statut < 2";
2127
+        // if ($this->element == 'propal')  $sql.= " AND fk_statut = 0";
2128
+
2129
+        dol_syslog(get_class($this)."::setDocModel", LOG_DEBUG);
2130
+        $resql=$this->db->query($sql);
2131
+        if ($resql)
2132
+        {
2133
+            $this->modelpdf=$modelpdf;
2134
+            return 1;
2135
+        }
2136
+        else
2137
+        {
2138
+            dol_print_error($this->db);
2139
+            return 0;
2140
+        }
2141
+    }
2142
+
2143
+
2144
+    /**
2145
+     *  Change the bank account
2146
+     *
2147
+     *  @param		int		$fk_account		Id of bank account
2148
+     *  @param      bool    $notrigger      false=launch triggers after, true=disable triggers
2149
+     *  @param      User	$userused		Object user
2150
+     *  @return		int				1 if OK, 0 if KO
2151
+     */
2152
+    function setBankAccount($fk_account, $notrigger=false, $userused=null)
2153
+    {
2154
+        global $user;
2155
+
2156
+        if (empty($userused)) $userused=$user;
2157
+
2158
+        $error = 0;
2159
+
2160
+        if (! $this->table_element) {
2161
+            dol_syslog(get_class($this)."::setBankAccount was called on objet with property table_element not defined",LOG_ERR);
2162
+            return -1;
2163
+        }
2164
+        $this->db->begin();
2165
+
2166
+        if ($fk_account<0) $fk_account='NULL';
2167
+        dol_syslog(get_class($this).'::setBankAccount('.$fk_account.')');
2168
+
2169
+        $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
2170
+        $sql.= " SET fk_account = ".$fk_account;
2171
+        $sql.= " WHERE rowid=".$this->id;
2172
+
2173
+        $resql = $this->db->query($sql);
2174
+        if (! $resql)
2175
+        {
2176
+            dol_syslog(get_class($this).'::setBankAccount Error '.$sql.' - '.$this->db->error());
2177
+            $this->error = $this->db->lasterror();
2178
+            $error++;
2179
+        }
2180
+        else
2181
+        {
2182
+            if (!$notrigger)
2183
+            {
2184
+                // Call trigger
2185
+                $this->context=array('bankaccountupdate'=>1);
2186
+                $result = $this->call_trigger(strtoupper(get_class($this)) . '_MODIFY', $userused);
2187
+                if ($result < 0) $error++;
2188
+                // End call trigger
2189
+            }
2190
+        }
2191
+        if ($error)
2192
+        {
2193
+            $this->db->rollback();
2194
+            return -1;
2195
+        }
2196
+        else
2197
+        {
2198
+            $this->fk_account = ($fk_account=='NULL')?null:$fk_account;
2199
+            $this->db->commit();
2200
+            return 1;
2201
+        }
2202
+    }
2203
+
2204
+
2205
+    // TODO: Move line related operations to CommonObjectLine?
2206
+
2207
+    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
2208
+    /**
2209
+     *  Save a new position (field rang) for details lines.
2210
+     *  You can choose to set position for lines with already a position or lines without any position defined.
2211
+     *
2212
+     * 	@param		boolean		$renum			   True to renum all already ordered lines, false to renum only not already ordered lines.
2213
+     * 	@param		string		$rowidorder		   ASC or DESC
2214
+     * 	@param		boolean		$fk_parent_line    Table with fk_parent_line field or not
2215
+     * 	@return		int                            <0 if KO, >0 if OK
2216
+     */
2217
+    function line_order($renum=false, $rowidorder='ASC', $fk_parent_line=true)
2218
+    {
2219
+        // phpcs:enable
2220
+        if (! $this->table_element_line)
2221
+        {
2222
+            dol_syslog(get_class($this)."::line_order was called on objet with property table_element_line not defined",LOG_ERR);
2223
+            return -1;
2224
+        }
2225
+        if (! $this->fk_element)
2226
+        {
2227
+            dol_syslog(get_class($this)."::line_order was called on objet with property fk_element not defined",LOG_ERR);
2228
+            return -1;
2229
+        }
2230
+
2231
+        // Count number of lines to reorder (according to choice $renum)
2232
+        $nl=0;
2233
+        $sql = 'SELECT count(rowid) FROM '.MAIN_DB_PREFIX.$this->table_element_line;
2234
+        $sql.= ' WHERE '.$this->fk_element.'='.$this->id;
2235
+        if (! $renum) $sql.= ' AND rang = 0';
2236
+        if ($renum) $sql.= ' AND rang <> 0';
2237
+
2238
+        dol_syslog(get_class($this)."::line_order", LOG_DEBUG);
2239
+        $resql = $this->db->query($sql);
2240
+        if ($resql)
2241
+        {
2242
+            $row = $this->db->fetch_row($resql);
2243
+            $nl = $row[0];
2244
+        }
2245
+        else dol_print_error($this->db);
2246
+        if ($nl > 0)
2247
+        {
2248
+            // The goal of this part is to reorder all lines, with all children lines sharing the same
2249
+            // counter that parents.
2250
+            $rows=array();
2251
+
2252
+            // We first search all lines that are parent lines (for multilevel details lines)
2253
+            $sql = 'SELECT rowid FROM '.MAIN_DB_PREFIX.$this->table_element_line;
2254
+            $sql.= ' WHERE '.$this->fk_element.' = '.$this->id;
2255
+            if ($fk_parent_line) $sql.= ' AND fk_parent_line IS NULL';
2256
+            $sql.= ' ORDER BY rang ASC, rowid '.$rowidorder;
2257
+
2258
+            dol_syslog(get_class($this)."::line_order search all parent lines", LOG_DEBUG);
2259
+            $resql = $this->db->query($sql);
2260
+            if ($resql)
2261
+            {
2262
+                $i=0;
2263
+                $num = $this->db->num_rows($resql);
2264
+                while ($i < $num)
2265
+                {
2266
+                    $row = $this->db->fetch_row($resql);
2267
+                    $rows[] = $row[0];	// Add parent line into array rows
2268
+                    $childrens = $this->getChildrenOfLine($row[0]);
2269
+                    if (! empty($childrens))
2270
+                    {
2271
+                        foreach($childrens as $child)
2272
+                        {
2273
+                            array_push($rows, $child);
2274
+                        }
2275
+                    }
2276
+                    $i++;
2277
+                }
2278
+
2279
+                // Now we set a new number for each lines (parent and children with children included into parent tree)
2280
+                if (! empty($rows))
2281
+                {
2282
+                    foreach($rows as $key => $row)
2283
+                    {
2284
+                        $this->updateRangOfLine($row, ($key+1));
2285
+                    }
2286
+                }
2287
+            }
2288
+            else
2289
+            {
2290
+                dol_print_error($this->db);
2291
+            }
2292
+        }
2293
+        return 1;
2294
+    }
2295
+
2296
+    /**
2297
+     * 	Get children of line
2298
+     *
2299
+     * 	@param	int		$id		Id of parent line
2300
+     * 	@return	array			Array with list of children lines id
2301
+     */
2302
+    function getChildrenOfLine($id)
2303
+    {
2304
+        $rows=array();
2305
+
2306
+        $sql = 'SELECT rowid FROM '.MAIN_DB_PREFIX.$this->table_element_line;
2307
+        $sql.= ' WHERE '.$this->fk_element.' = '.$this->id;
2308
+        $sql.= ' AND fk_parent_line = '.$id;
2309
+        $sql.= ' ORDER BY rang ASC';
2310
+
2311
+        dol_syslog(get_class($this)."::getChildrenOfLine search children lines for line ".$id."", LOG_DEBUG);
2312
+        $resql = $this->db->query($sql);
2313
+        if ($resql)
2314
+        {
2315
+            $i=0;
2316
+            $num = $this->db->num_rows($resql);
2317
+            while ($i < $num)
2318
+            {
2319
+                $row = $this->db->fetch_row($resql);
2320
+                $rows[$i] = $row[0];
2321
+                $i++;
2322
+            }
2323
+        }
2324
+
2325
+        return $rows;
2326
+    }
2327
+
2328
+    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
2329
+    /**
2330
+     * 	Update a line to have a lower rank
2331
+     *
2332
+     * 	@param 	int			$rowid				Id of line
2333
+     * 	@param	boolean		$fk_parent_line		Table with fk_parent_line field or not
2334
+     * 	@return	void
2335
+     */
2336
+    function line_up($rowid, $fk_parent_line=true)
2337
+    {
2338
+        // phpcs:enable
2339
+        $this->line_order(false, 'ASC', $fk_parent_line);
2340
+
2341
+        // Get rang of line
2342
+        $rang = $this->getRangOfLine($rowid);
2343
+
2344
+        // Update position of line
2345
+        $this->updateLineUp($rowid, $rang);
2346
+    }
2347
+
2348
+    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
2349
+    /**
2350
+     * 	Update a line to have a higher rank
2351
+     *
2352
+     * 	@param	int			$rowid				Id of line
2353
+     * 	@param	boolean		$fk_parent_line		Table with fk_parent_line field or not
2354
+     * 	@return	void
2355
+     */
2356
+    function line_down($rowid, $fk_parent_line=true)
2357
+    {
2358
+        // phpcs:enable
2359
+        $this->line_order(false, 'ASC', $fk_parent_line);
2360
+
2361
+        // Get rang of line
2362
+        $rang = $this->getRangOfLine($rowid);
2363
+
2364
+        // Get max value for rang
2365
+        $max = $this->line_max();
2366
+
2367
+        // Update position of line
2368
+        $this->updateLineDown($rowid, $rang, $max);
2369
+    }
2370
+
2371
+    /**
2372
+     * 	Update position of line (rang)
2373
+     *
2374
+     * 	@param	int		$rowid		Id of line
2375
+     * 	@param	int		$rang		Position
2376
+     * 	@return	void
2377
+     */
2378
+    function updateRangOfLine($rowid,$rang)
2379
+    {
2380
+        $fieldposition = 'rang';
2381
+        if (in_array($this->table_element_line, array('ecm_files', 'emailcollector_emailcollectoraction'))) $fieldposition = 'position';
2382
+
2383
+        $sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element_line.' SET '.$fieldposition.' = '.$rang;
2384
+        $sql.= ' WHERE rowid = '.$rowid;
2385
+
2386
+        dol_syslog(get_class($this)."::updateRangOfLine", LOG_DEBUG);
2387
+        if (! $this->db->query($sql))
2388
+        {
2389
+            dol_print_error($this->db);
2390
+        }
2391
+    }
2392
+
2393
+    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
2394
+    /**
2395
+     * 	Update position of line with ajax (rang)
2396
+     *
2397
+     * 	@param	array	$rows	Array of rows
2398
+     * 	@return	void
2399
+     */
2400
+    function line_ajaxorder($rows)
2401
+    {
2402
+        // phpcs:enable
2403
+        $num = count($rows);
2404
+        for ($i = 0 ; $i < $num ; $i++)
2405
+        {
2406
+            $this->updateRangOfLine($rows[$i], ($i+1));
2407
+        }
2408
+    }
2409
+
2410
+    /**
2411
+     * 	Update position of line up (rang)
2412
+     *
2413
+     * 	@param	int		$rowid		Id of line
2414
+     * 	@param	int		$rang		Position
2415
+     * 	@return	void
2416
+     */
2417
+    function updateLineUp($rowid,$rang)
2418
+    {
2419
+        if ($rang > 1)
2420
+        {
2421
+            $fieldposition = 'rang';
2422
+            if (in_array($this->table_element_line, array('ecm_files', 'emailcollector_emailcollectoraction'))) $fieldposition = 'position';
2423
+
2424
+            $sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element_line.' SET '.$fieldposition.' = '.$rang ;
2425
+            $sql.= ' WHERE '.$this->fk_element.' = '.$this->id;
2426
+            $sql.= ' AND rang = '.($rang - 1);
2427
+            if ($this->db->query($sql) )
2428
+            {
2429
+                $sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element_line.' SET '.$fieldposition.' = '.($rang - 1);
2430
+                $sql.= ' WHERE rowid = '.$rowid;
2431
+                if (! $this->db->query($sql) )
2432
+                {
2433
+                    dol_print_error($this->db);
2434
+                }
2435
+            }
2436
+            else
2437
+            {
2438
+                dol_print_error($this->db);
2439
+            }
2440
+        }
2441
+    }
2442
+
2443
+    /**
2444
+     * 	Update position of line down (rang)
2445
+     *
2446
+     * 	@param	int		$rowid		Id of line
2447
+     * 	@param	int		$rang		Position
2448
+     * 	@param	int		$max		Max
2449
+     * 	@return	void
2450
+     */
2451
+    function updateLineDown($rowid,$rang,$max)
2452
+    {
2453
+        if ($rang < $max)
2454
+        {
2455
+            $fieldposition = 'rang';
2456
+            if (in_array($this->table_element_line, array('ecm_files', 'emailcollector_emailcollectoraction'))) $fieldposition = 'position';
2457
+
2458
+            $sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element_line.' SET '.$fieldposition.' = '.$rang;
2459
+            $sql.= ' WHERE '.$this->fk_element.' = '.$this->id;
2460
+            $sql.= ' AND rang = '.($rang+1);
2461
+            if ($this->db->query($sql) )
2462
+            {
2463
+                $sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element_line.' SET '.$fieldposition.' = '.($rang+1);
2464
+                $sql.= ' WHERE rowid = '.$rowid;
2465
+                if (! $this->db->query($sql) )
2466
+                {
2467
+                    dol_print_error($this->db);
2468
+                }
2469
+            }
2470
+            else
2471
+            {
2472
+                dol_print_error($this->db);
2473
+            }
2474
+        }
2475
+    }
2476
+
2477
+    /**
2478
+     * 	Get position of line (rang)
2479
+     *
2480
+     * 	@param		int		$rowid		Id of line
2481
+     *  @return		int     			Value of rang in table of lines
2482
+     */
2483
+    function getRangOfLine($rowid)
2484
+    {
2485
+        $sql = 'SELECT rang FROM '.MAIN_DB_PREFIX.$this->table_element_line;
2486
+        $sql.= ' WHERE rowid ='.$rowid;
2487
+
2488
+        dol_syslog(get_class($this)."::getRangOfLine", LOG_DEBUG);
2489
+        $resql = $this->db->query($sql);
2490
+        if ($resql)
2491
+        {
2492
+            $row = $this->db->fetch_row($resql);
2493
+            return $row[0];
2494
+        }
2495
+    }
2496
+
2497
+    /**
2498
+     * 	Get rowid of the line relative to its position
2499
+     *
2500
+     * 	@param		int		$rang		Rang value
2501
+     *  @return     int     			Rowid of the line
2502
+     */
2503
+    function getIdOfLine($rang)
2504
+    {
2505
+        $sql = 'SELECT rowid FROM '.MAIN_DB_PREFIX.$this->table_element_line;
2506
+        $sql.= ' WHERE '.$this->fk_element.' = '.$this->id;
2507
+        $sql.= ' AND rang = '.$rang;
2508
+        $resql = $this->db->query($sql);
2509
+        if ($resql)
2510
+        {
2511
+            $row = $this->db->fetch_row($resql);
2512
+            return $row[0];
2513
+        }
2514
+    }
2515
+
2516
+    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
2517
+    /**
2518
+     * 	Get max value used for position of line (rang)
2519
+     *
2520
+     * 	@param		int		$fk_parent_line		Parent line id
2521
+     *  @return     int  			   			Max value of rang in table of lines
2522
+     */
2523
+    function line_max($fk_parent_line=0)
2524
+    {
2525
+        // phpcs:enable
2526
+        // Search the last rang with fk_parent_line
2527
+        if ($fk_parent_line)
2528
+        {
2529
+            $sql = 'SELECT max(rang) FROM '.MAIN_DB_PREFIX.$this->table_element_line;
2530
+            $sql.= ' WHERE '.$this->fk_element.' = '.$this->id;
2531
+            $sql.= ' AND fk_parent_line = '.$fk_parent_line;
2532
+
2533
+            dol_syslog(get_class($this)."::line_max", LOG_DEBUG);
2534
+            $resql = $this->db->query($sql);
2535
+            if ($resql)
2536
+            {
2537
+                $row = $this->db->fetch_row($resql);
2538
+                if (! empty($row[0]))
2539
+                {
2540
+                    return $row[0];
2541
+                }
2542
+                else
2543
+                {
2544
+                    return $this->getRangOfLine($fk_parent_line);
2545
+                }
2546
+            }
2547
+        }
2548
+        // If not, search the last rang of element
2549
+        else
2550
+        {
2551
+            $sql = 'SELECT max(rang) FROM '.MAIN_DB_PREFIX.$this->table_element_line;
2552
+            $sql.= ' WHERE '.$this->fk_element.' = '.$this->id;
2553
+
2554
+            dol_syslog(get_class($this)."::line_max", LOG_DEBUG);
2555
+            $resql = $this->db->query($sql);
2556
+            if ($resql)
2557
+            {
2558
+                $row = $this->db->fetch_row($resql);
2559
+                return $row[0];
2560
+            }
2561
+        }
2562
+    }
2563
+
2564
+    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
2565
+    /**
2566
+     *  Update external ref of element
2567
+     *
2568
+     *  @param      string		$ref_ext	Update field ref_ext
2569
+     *  @return     int      		   		<0 if KO, >0 if OK
2570
+     */
2571
+    function update_ref_ext($ref_ext)
2572
+    {
2573
+        // phpcs:enable
2574
+        if (! $this->table_element)
2575
+        {
2576
+            dol_syslog(get_class($this)."::update_ref_ext was called on objet with property table_element not defined", LOG_ERR);
2577
+            return -1;
2578
+        }
2579
+
2580
+        $sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
2581
+        $sql.= " SET ref_ext = '".$this->db->escape($ref_ext)."'";
2582
+        $sql.= " WHERE ".(isset($this->table_rowid)?$this->table_rowid:'rowid')." = ". $this->id;
2583
+
2584
+        dol_syslog(get_class($this)."::update_ref_ext", LOG_DEBUG);
2585
+        if ($this->db->query($sql))
2586
+        {
2587
+            $this->ref_ext = $ref_ext;
2588
+            return 1;
2589
+        }
2590
+        else
2591
+        {
2592
+            $this->error=$this->db->error();
2593
+            return -1;
2594
+        }
2595
+    }
2596
+
2597
+    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
2598
+    /**
2599
+     *  Update note of element
2600
+     *
2601
+     *  @param      string		$note		New value for note
2602
+     *  @param		string		$suffix		'', '_public' or '_private'
2603
+     *  @return     int      		   		<0 if KO, >0 if OK
2604
+     */
2605
+    function update_note($note, $suffix='')
2606
+    {
2607
+        // phpcs:enable
2608
+        global $user;
2609
+
2610
+        if (! $this->table_element)
2611
+        {
2612
+            $this->error='update_note was called on objet with property table_element not defined';
2613
+            dol_syslog(get_class($this)."::update_note was called on objet with property table_element not defined", LOG_ERR);
2614
+            return -1;
2615
+        }
2616
+        if (! in_array($suffix,array('','_public','_private')))
2617
+        {
2618
+            $this->error='update_note Parameter suffix must be empty, \'_private\' or \'_public\'';
2619
+            dol_syslog(get_class($this)."::update_note Parameter suffix must be empty, '_private' or '_public'", LOG_ERR);
2620
+            return -2;
2621
+        }
2622
+        // Special cas
2623
+        //var_dump($this->table_element);exit;
2624
+        if ($this->table_element == 'product') $suffix='';
2625
+
2626
+        $sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
2627
+        $sql.= " SET note".$suffix." = ".(!empty($note)?("'".$this->db->escape($note)."'"):"NULL");
2628
+        $sql.= " ,".(in_array($this->table_element, array('actioncomm', 'adherent', 'advtargetemailing', 'cronjob', 'establishment'))?"fk_user_mod":"fk_user_modif")." = ".$user->id;
2629
+        $sql.= " WHERE rowid =". $this->id;
2630
+
2631
+        dol_syslog(get_class($this)."::update_note", LOG_DEBUG);
2632
+        if ($this->db->query($sql))
2633
+        {
2634
+            if ($suffix == '_public') $this->note_public = $note;
2635
+            else if ($suffix == '_private') $this->note_private = $note;
2636
+            else
2637
+            {
2638
+                $this->note = $note;      // deprecated
2639
+                $this->note_private = $note;
2640
+            }
2641
+            return 1;
2642
+        }
2643
+        else
2644
+        {
2645
+            $this->error=$this->db->lasterror();
2646
+            return -1;
2647
+        }
2648
+    }
2649
+
2650
+    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
2651
+    /**
2652
+     * 	Update public note (kept for backward compatibility)
2653
+     *
2654
+     * @param      string		$note		New value for note
2655
+     * @return     int      		   		<0 if KO, >0 if OK
2656
+     * @deprecated
2657
+     * @see update_note()
2658
+     */
2659
+    function update_note_public($note)
2660
+    {
2661
+        // phpcs:enable
2662
+        return $this->update_note($note,'_public');
2663
+    }
2664
+
2665
+    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
2666
+    /**
2667
+     *	Update total_ht, total_ttc, total_vat, total_localtax1, total_localtax2 for an object (sum of lines).
2668
+     *  Must be called at end of methods addline or updateline.
2669
+     *
2670
+     *	@param	int		$exclspec          	>0 = Exclude special product (product_type=9)
2671
+     *  @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
2672
+     *  @param	int		$nodatabaseupdate	1=Do not update database. Update only properties of object.
2673
+     *  @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.
2674
+     *	@return	int    			           	<0 if KO, >0 if OK
2675
+     */
2676
+    function update_price($exclspec=0,$roundingadjust='none',$nodatabaseupdate=0,$seller=null)
2677
+    {
2678
+        // phpcs:enable
2679
+        global $conf, $hookmanager, $action;
2680
+
2681
+        // Some external module want no update price after a trigger because they have another method to calculate the total (ex: with an extrafield)
2682
+        $MODULE = "";
2683
+        if ($this->element == 'propal')
2684
+            $MODULE = "MODULE_DISALLOW_UPDATE_PRICE_PROPOSAL";
2685
+        elseif ($this->element == 'order')
2686
+            $MODULE = "MODULE_DISALLOW_UPDATE_PRICE_ORDER";
2687
+        elseif ($this->element == 'facture')
2688
+            $MODULE = "MODULE_DISALLOW_UPDATE_PRICE_INVOICE";
2689
+        elseif ($this->element == 'facture_fourn')
2690
+            $MODULE = "MODULE_DISALLOW_UPDATE_PRICE_SUPPLIER_INVOICE";
2691
+        elseif ($this->element == 'order_supplier')
2692
+            $MODULE = "MODULE_DISALLOW_UPDATE_PRICE_SUPPLIER_ORDER";
2693
+        elseif ($this->element == 'supplier_proposal')
2694
+            $MODULE = "MODULE_DISALLOW_UPDATE_PRICE_SUPPLIER_PROPOSAL";
2695
+
2696
+        if (! empty($MODULE)) {
2697
+            if (! empty($conf->global->$MODULE)) {
2698
+                $modsactivated = explode(',', $conf->global->$MODULE);
2699
+                foreach ($modsactivated as $mod) {
2700
+                    if ($conf->$mod->enabled)
2701
+                        return 1; // update was disabled by specific setup
2702
+                }
2703
+            }
2704
+        }
2705
+
2706
+        include_once DOL_DOCUMENT_ROOT.'/core/lib/price.lib.php';
2707
+
2708
+        if ($roundingadjust == '-1') $roundingadjust='auto';	// For backward compatibility
2709
+
2710
+        $forcedroundingmode=$roundingadjust;
2711
+        if ($forcedroundingmode == 'auto' && isset($conf->global->MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND)) $forcedroundingmode=$conf->global->MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND;
2712
+        elseif ($forcedroundingmode == 'auto') $forcedroundingmode='0';
2713
+
2714
+        $error=0;
2715
+
2716
+        $multicurrency_tx = !empty($this->multicurrency_tx) ? $this->multicurrency_tx : 1;
2717
+
2718
+        // Define constants to find lines to sum
2719
+        $fieldtva='total_tva';
2720
+        $fieldlocaltax1='total_localtax1';
2721
+        $fieldlocaltax2='total_localtax2';
2722
+        $fieldup='subprice';
2723
+        if ($this->element == 'facture_fourn' || $this->element == 'invoice_supplier')
2724
+        {
2725
+            $fieldtva='tva';
2726
+            $fieldup='pu_ht';
2727
+        }
2728
+        if ($this->element == 'expensereport')
2729
+        {
2730
+            $fieldup='value_unit';
2731
+        }
2732
+
2733
+        $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,';
2734
+        $sql.= ' tva_tx as vatrate, localtax1_tx, localtax2_tx, localtax1_type, localtax2_type, info_bits, product_type';
2735
+            if ($this->table_element_line == 'facturedet') $sql.= ', situation_percent';
2736
+            $sql.= ', multicurrency_total_ht, multicurrency_total_tva, multicurrency_total_ttc';
2737
+        $sql.= ' FROM '.MAIN_DB_PREFIX.$this->table_element_line;
2738
+        $sql.= ' WHERE '.$this->fk_element.' = '.$this->id;
2739
+        if ($exclspec)
2740
+        {
2741
+            $product_field='product_type';
2742
+            if ($this->table_element_line == 'contratdet') $product_field='';    // contratdet table has no product_type field
2743
+            if ($product_field) $sql.= ' AND '.$product_field.' <> 9';
2744
+        }
2745
+        $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
+
2747
+        dol_syslog(get_class($this)."::update_price", LOG_DEBUG);
2748
+        $resql = $this->db->query($sql);
2749
+        if ($resql)
2750
+        {
2751
+            $this->total_ht  = 0;
2752
+            $this->total_tva = 0;
2753
+            $this->total_localtax1 = 0;
2754
+            $this->total_localtax2 = 0;
2755
+            $this->total_ttc = 0;
2756
+            $total_ht_by_vats  = array();
2757
+            $total_tva_by_vats = array();
2758
+            $total_ttc_by_vats = array();
2759
+            $this->multicurrency_total_ht	= 0;
2760
+            $this->multicurrency_total_tva	= 0;
2761
+            $this->multicurrency_total_ttc	= 0;
2762
+
2763
+            $num = $this->db->num_rows($resql);
2764
+            $i = 0;
2765
+            while ($i < $num)
2766
+            {
2767
+                $obj = $this->db->fetch_object($resql);
2768
+
2769
+                // Note: There is no check on detail line and no check on total, if $forcedroundingmode = 'none'
2770
+                $parameters=array('fk_element' => $obj->rowid);
2771
+                $reshook = $hookmanager->executeHooks('changeRoundingMode', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
2772
+
2773
+                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'
2774
+                {
2775
+                    $localtax_array=array($obj->localtax1_type,$obj->localtax1_tx,$obj->localtax2_type,$obj->localtax2_tx);
2776
+                    $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);
2777
+                    $diff=price2num($tmpcal[1] - $obj->total_tva, 'MT', 1);
2778
+                    if ($diff)
2779
+                    {
2780
+                        $sqlfix="UPDATE ".MAIN_DB_PREFIX.$this->table_element_line." SET ".$fieldtva." = ".$tmpcal[1].", total_ttc = ".$tmpcal[2]." WHERE rowid = ".$obj->rowid;
2781
+                        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);
2782
+                                $resqlfix=$this->db->query($sqlfix);
2783
+                                if (! $resqlfix) dol_print_error($this->db,'Failed to update line');
2784
+                                $obj->total_tva = $tmpcal[1];
2785
+                                $obj->total_ttc = $tmpcal[2];
2786
+                        //
2787
+                    }
2788
+                }
2789
+
2790
+                $this->total_ht        += $obj->total_ht;		// The field visible at end of line detail
2791
+                $this->total_tva       += $obj->total_tva;
2792
+                $this->total_localtax1 += $obj->total_localtax1;
2793
+                $this->total_localtax2 += $obj->total_localtax2;
2794
+                $this->total_ttc       += $obj->total_ttc;
2795
+                $this->multicurrency_total_ht        += $obj->multicurrency_total_ht;		// The field visible at end of line detail
2796
+                $this->multicurrency_total_tva       += $obj->multicurrency_total_tva;
2797
+                $this->multicurrency_total_ttc       += $obj->multicurrency_total_ttc;
2798
+
2799
+                if (! isset($total_ht_by_vats[$obj->vatrate]))  $total_ht_by_vats[$obj->vatrate]=0;
2800
+                if (! isset($total_tva_by_vats[$obj->vatrate])) $total_tva_by_vats[$obj->vatrate]=0;
2801
+                if (! isset($total_ttc_by_vats[$obj->vatrate])) $total_ttc_by_vats[$obj->vatrate]=0;
2802
+                $total_ht_by_vats[$obj->vatrate]  += $obj->total_ht;
2803
+                $total_tva_by_vats[$obj->vatrate] += $obj->total_tva;
2804
+                $total_ttc_by_vats[$obj->vatrate] += $obj->total_ttc;
2805
+
2806
+                if ($forcedroundingmode == '1')	// Check if we need adjustement onto line for vat. TODO This works on the company currency but not on multicurrency
2807
+                {
2808
+                    $tmpvat=price2num($total_ht_by_vats[$obj->vatrate] * $obj->vatrate / 100, 'MT', 1);
2809
+                    $diff=price2num($total_tva_by_vats[$obj->vatrate]-$tmpvat, 'MT', 1);
2810
+                    //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";
2811
+                    if ($diff)
2812
+                    {
2813
+                        if (abs($diff) > 0.1) { dol_syslog('A rounding difference was detected into TOTAL but is too high to be corrected', LOG_WARNING); exit; }
2814
+                        $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
+                        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);
2816
+                                $resqlfix=$this->db->query($sqlfix);
2817
+                                if (! $resqlfix) dol_print_error($this->db,'Failed to update line');
2818
+                                $this->total_tva -= $diff;
2819
+                                $this->total_ttc -= $diff;
2820
+                                $total_tva_by_vats[$obj->vatrate] -= $diff;
2821
+                                $total_ttc_by_vats[$obj->vatrate] -= $diff;
2822
+                    }
2823
+                }
2824
+
2825
+                $i++;
2826
+            }
2827
+
2828
+            // Add revenue stamp to total
2829
+            $this->total_ttc       			+= isset($this->revenuestamp)?$this->revenuestamp:0;
2830
+            $this->multicurrency_total_ttc  += isset($this->revenuestamp)?($this->revenuestamp * $multicurrency_tx):0;
2831
+
2832
+            // Situations totals
2833
+            if ($this->situation_cycle_ref && $this->situation_counter > 1 && method_exists($this, 'get_prev_sits') && $this->type != $this::TYPE_CREDIT_NOTE )
2834
+            {
2835
+                $prev_sits = $this->get_prev_sits();
2836
+
2837
+                foreach ($prev_sits as $sit) {				// $sit is an object Facture loaded with a fetch.
2838
+                    $this->total_ht -= $sit->total_ht;
2839
+                    $this->total_tva -= $sit->total_tva;
2840
+                    $this->total_localtax1 -= $sit->total_localtax1;
2841
+                    $this->total_localtax2 -= $sit->total_localtax2;
2842
+                    $this->total_ttc -= $sit->total_ttc;
2843
+                    $this->multicurrency_total_ht -= $sit->multicurrency_total_ht;
2844
+                    $this->multicurrency_total_tva -= $sit->multicurrency_total_tva;
2845
+                    $this->multicurrency_total_ttc -= $sit->multicurrency_total_ttc;
2846
+                }
2847
+            }
2848
+
2849
+            $this->db->free($resql);
2850
+
2851
+            // Now update global field total_ht, total_ttc and tva
2852
+            $fieldht='total_ht';
2853
+            $fieldtva='tva';
2854
+            $fieldlocaltax1='localtax1';
2855
+            $fieldlocaltax2='localtax2';
2856
+            $fieldttc='total_ttc';
2857
+            // Specific code for backward compatibility with old field names
2858
+            if ($this->element == 'facture' || $this->element == 'facturerec')             $fieldht='total';
2859
+            if ($this->element == 'facture_fourn' || $this->element == 'invoice_supplier') $fieldtva='total_tva';
2860
+            if ($this->element == 'propal')                                                $fieldttc='total';
2861
+            if ($this->element == 'expensereport')                                         $fieldtva='total_tva';
2862
+            if ($this->element == 'supplier_proposal')                                     $fieldttc='total';
2863
+
2864
+            if (empty($nodatabaseupdate))
2865
+            {
2866
+                $sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element.' SET';
2867
+                $sql .= " ".$fieldht."='".price2num($this->total_ht)."',";
2868
+                $sql .= " ".$fieldtva."='".price2num($this->total_tva)."',";
2869
+                $sql .= " ".$fieldlocaltax1."='".price2num($this->total_localtax1)."',";
2870
+                $sql .= " ".$fieldlocaltax2."='".price2num($this->total_localtax2)."',";
2871
+                $sql .= " ".$fieldttc."='".price2num($this->total_ttc)."'";
2872
+                        $sql .= ", multicurrency_total_ht='".price2num($this->multicurrency_total_ht, 'MT', 1)."'";
2873
+                        $sql .= ", multicurrency_total_tva='".price2num($this->multicurrency_total_tva, 'MT', 1)."'";
2874
+                        $sql .= ", multicurrency_total_ttc='".price2num($this->multicurrency_total_ttc, 'MT', 1)."'";
2875
+                $sql .= ' WHERE rowid = '.$this->id;
2876
+
2877
+
2878
+                dol_syslog(get_class($this)."::update_price", LOG_DEBUG);
2879
+                $resql=$this->db->query($sql);
2880
+                if (! $resql)
2881
+                {
2882
+                    $error++;
2883
+                    $this->error=$this->db->lasterror();
2884
+                    $this->errors[]=$this->db->lasterror();
2885
+                }
2886
+            }
2887
+
2888
+            if (! $error)
2889
+            {
2890
+                return 1;
2891
+            }
2892
+            else
2893
+            {
2894
+                return -1;
2895
+            }
2896
+        }
2897
+        else
2898
+        {
2899
+            dol_print_error($this->db,'Bad request in update_price');
2900
+            return -1;
2901
+        }
2902
+    }
2903
+
2904
+    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
2905
+    /**
2906
+     *	Add objects linked in llx_element_element.
2907
+     *
2908
+     *	@param		string	$origin		Linked element type
2909
+     *	@param		int		$origin_id	Linked element id
2910
+     *	@return		int					<=0 if KO, >0 if OK
2911
+     *	@see		fetchObjectLinked, updateObjectLinked, deleteObjectLinked
2912
+     */
2913
+    function add_object_linked($origin=null, $origin_id=null)
2914
+    {
2915
+        // phpcs:enable
2916
+        $origin = (! empty($origin) ? $origin : $this->origin);
2917
+        $origin_id = (! empty($origin_id) ? $origin_id : $this->origin_id);
2918
+
2919
+        // Special case
2920
+        if ($origin == 'order') $origin='commande';
2921
+        if ($origin == 'invoice') $origin='facture';
2922
+        if ($origin == 'invoice_template') $origin='facturerec';
2923
+        if ($origin == 'supplierorder') $origin='order_supplier';
2924
+        $this->db->begin();
2925
+
2926
+        $sql = "INSERT INTO ".MAIN_DB_PREFIX."element_element (";
2927
+        $sql.= "fk_source";
2928
+        $sql.= ", sourcetype";
2929
+        $sql.= ", fk_target";
2930
+        $sql.= ", targettype";
2931
+        $sql.= ") VALUES (";
2932
+        $sql.= $origin_id;
2933
+        $sql.= ", '".$this->db->escape($origin)."'";
2934
+        $sql.= ", ".$this->id;
2935
+        $sql.= ", '".$this->db->escape($this->element)."'";
2936
+        $sql.= ")";
2937
+
2938
+        dol_syslog(get_class($this)."::add_object_linked", LOG_DEBUG);
2939
+        if ($this->db->query($sql))
2940
+            {
2941
+                $this->db->commit();
2942
+                return 1;
2943
+            }
2944
+            else
2945
+            {
2946
+                $this->error=$this->db->lasterror();
2947
+                $this->db->rollback();
2948
+                return 0;
2949
+            }
2950
+    }
2951
+
2952
+    /**
2953
+     *	Fetch array of objects linked to current object (object of enabled modules only). Links are loaded into
2954
+     *		this->linkedObjectsIds array and
2955
+     *		this->linkedObjects array if $loadalsoobjects = 1
2956
+     *  Possible usage for parameters:
2957
+     *  - all parameters empty -> we look all link to current object (current object can be source or target)
2958
+     *  - source id+type -> will get target list linked to source
2959
+     *  - target id+type -> will get source list linked to target
2960
+     *  - source id+type + target type -> will get target list of the type
2961
+     *  - target id+type + target source -> will get source list of the type
2962
+     *
2963
+     *	@param	int		$sourceid			Object source id (if not defined, id of object)
2964
+     *	@param  string	$sourcetype			Object source type (if not defined, element name of object)
2965
+     *	@param  int		$targetid			Object target id (if not defined, id of object)
2966
+     *	@param  string	$targettype			Object target type (if not defined, elemennt name of object)
2967
+     *	@param  string	$clause				'OR' or 'AND' clause used when both source id and target id are provided
2968
+     *  @param  int		$alsosametype		0=Return only links to object that differs from source type. 1=Include also link to objects of same type.
2969
+     *  @param  string	$orderby			SQL 'ORDER BY' clause
2970
+     *  @param	int		$loadalsoobjects	Load also array this->linkedObjects (Use 0 to increase performances)
2971
+     *	@return int							<0 if KO, >0 if OK
2972
+     *  @see	add_object_linked, updateObjectLinked, deleteObjectLinked
2973
+     */
2974
+    function fetchObjectLinked($sourceid=null,$sourcetype='',$targetid=null,$targettype='',$clause='OR',$alsosametype=1,$orderby='sourcetype',$loadalsoobjects=1)
2975
+    {
2976
+        global $conf;
2977
+
2978
+        $this->linkedObjectsIds=array();
2979
+        $this->linkedObjects=array();
2980
+
2981
+        $justsource=false;
2982
+        $justtarget=false;
2983
+        $withtargettype=false;
2984
+        $withsourcetype=false;
2985
+
2986
+        if (! empty($sourceid) && ! empty($sourcetype) && empty($targetid))
2987
+        {
2988
+            $justsource=true;  // the source (id and type) is a search criteria
2989
+            if (! empty($targettype)) $withtargettype=true;
2990
+        }
2991
+        if (! empty($targetid) && ! empty($targettype) && empty($sourceid))
2992
+        {
2993
+            $justtarget=true;  // the target (id and type) is a search criteria
2994
+            if (! empty($sourcetype)) $withsourcetype=true;
2995
+        }
2996
+
2997
+        $sourceid = (! empty($sourceid) ? $sourceid : $this->id);
2998
+        $targetid = (! empty($targetid) ? $targetid : $this->id);
2999
+        $sourcetype = (! empty($sourcetype) ? $sourcetype : $this->element);
3000
+        $targettype = (! empty($targettype) ? $targettype : $this->element);
3001
+
3002
+        /*if (empty($sourceid) && empty($targetid))
3003
+		 {
3004
+		 dol_syslog('Bad usage of function. No source nor target id defined (nor as parameter nor as object id)', LOG_ERR);
3005
+		 return -1;
3006
+		 }*/
3007
+
3008
+        // Links between objects are stored in table element_element
3009
+        $sql = 'SELECT rowid, fk_source, sourcetype, fk_target, targettype';
3010
+        $sql.= ' FROM '.MAIN_DB_PREFIX.'element_element';
3011
+        $sql.= " WHERE ";
3012
+        if ($justsource || $justtarget)
3013
+        {
3014
+            if ($justsource)
3015
+            {
3016
+                $sql.= "fk_source = ".$sourceid." AND sourcetype = '".$sourcetype."'";
3017
+                if ($withtargettype) $sql.= " AND targettype = '".$targettype."'";
3018
+            }
3019
+            else if ($justtarget)
3020
+            {
3021
+                $sql.= "fk_target = ".$targetid." AND targettype = '".$targettype."'";
3022
+                if ($withsourcetype) $sql.= " AND sourcetype = '".$sourcetype."'";
3023
+            }
3024
+        }
3025
+        else
3026
+        {
3027
+            $sql.= "(fk_source = ".$sourceid." AND sourcetype = '".$sourcetype."')";
3028
+            $sql.= " ".$clause." (fk_target = ".$targetid." AND targettype = '".$targettype."')";
3029
+        }
3030
+        $sql .= ' ORDER BY '.$orderby;
3031
+
3032
+        dol_syslog(get_class($this)."::fetchObjectLink", LOG_DEBUG);
3033
+        $resql = $this->db->query($sql);
3034
+        if ($resql)
3035
+        {
3036
+            $num = $this->db->num_rows($resql);
3037
+            $i = 0;
3038
+            while ($i < $num)
3039
+            {
3040
+                $obj = $this->db->fetch_object($resql);
3041
+                if ($justsource || $justtarget)
3042
+                {
3043
+                    if ($justsource)
3044
+                    {
3045
+                        $this->linkedObjectsIds[$obj->targettype][$obj->rowid]=$obj->fk_target;
3046
+                    }
3047
+                    else if ($justtarget)
3048
+                    {
3049
+                        $this->linkedObjectsIds[$obj->sourcetype][$obj->rowid]=$obj->fk_source;
3050
+                    }
3051
+                }
3052
+                else
3053
+                {
3054
+                    if ($obj->fk_source == $sourceid && $obj->sourcetype == $sourcetype)
3055
+                    {
3056
+                        $this->linkedObjectsIds[$obj->targettype][$obj->rowid]=$obj->fk_target;
3057
+                    }
3058
+                    if ($obj->fk_target == $targetid && $obj->targettype == $targettype)
3059
+                    {
3060
+                        $this->linkedObjectsIds[$obj->sourcetype][$obj->rowid]=$obj->fk_source;
3061
+                    }
3062
+                }
3063
+                $i++;
3064
+            }
3065
+
3066
+            if (! empty($this->linkedObjectsIds))
3067
+            {
3068
+                $tmparray = $this->linkedObjectsIds;
3069
+                foreach($tmparray as $objecttype => $objectids)       // $objecttype is a module name ('facture', 'mymodule', ...) or a module name with a suffix ('project_task', 'mymodule_myobj', ...)
3070
+                {
3071
+                    // Parse element/subelement (ex: project_task, cabinetmed_consultation, ...)
3072
+                    $module = $element = $subelement = $objecttype;
3073
+                    if ($objecttype != 'supplier_proposal' && $objecttype != 'order_supplier' && $objecttype != 'invoice_supplier'
3074
+                        && preg_match('/^([^_]+)_([^_]+)/i',$objecttype,$regs))
3075
+                    {
3076
+                        $module = $element = $regs[1];
3077
+                        $subelement = $regs[2];
3078
+                    }
3079
+
3080
+                    $classpath = $element.'/class';
3081
+                    // To work with non standard classpath or module name
3082
+                    if ($objecttype == 'facture')			{
3083
+                        $classpath = 'compta/facture/class';
3084
+                    }
3085
+                    else if ($objecttype == 'facturerec')			{
3086
+                        $classpath = 'compta/facture/class'; $module = 'facture';
3087
+                    }
3088
+                    else if ($objecttype == 'propal')			{
3089
+                        $classpath = 'comm/propal/class';
3090
+                    }
3091
+                    else if ($objecttype == 'supplier_proposal')			{
3092
+                        $classpath = 'supplier_proposal/class';
3093
+                    }
3094
+                    else if ($objecttype == 'shipping')			{
3095
+                        $classpath = 'expedition/class'; $subelement = 'expedition'; $module = 'expedition_bon';
3096
+                    }
3097
+                    else if ($objecttype == 'delivery')			{
3098
+                        $classpath = 'livraison/class'; $subelement = 'livraison'; $module = 'livraison_bon';
3099
+                    }
3100
+                    else if ($objecttype == 'invoice_supplier' || $objecttype == 'order_supplier')	{
3101
+                        $classpath = 'fourn/class'; $module = 'fournisseur';
3102
+                    }
3103
+                    else if ($objecttype == 'fichinter')			{
3104
+                        $classpath = 'fichinter/class'; $subelement = 'fichinter'; $module = 'ficheinter';
3105
+                    }
3106
+                    else if ($objecttype == 'subscription')			{
3107
+                        $classpath = 'adherents/class'; $module = 'adherent';
3108
+                    }
3109
+
3110
+                    // Set classfile
3111
+                    $classfile = strtolower($subelement); $classname = ucfirst($subelement);
3112
+
3113
+                    if ($objecttype == 'order') {
3114
+                        $classfile = 'commande'; $classname = 'Commande';
3115
+                    }
3116
+                    else if ($objecttype == 'invoice_supplier') {
3117
+                        $classfile = 'fournisseur.facture'; $classname = 'FactureFournisseur';
3118
+                    }
3119
+                    else if ($objecttype == 'order_supplier')   {
3120
+                        $classfile = 'fournisseur.commande'; $classname = 'CommandeFournisseur';
3121
+                    }
3122
+                    else if ($objecttype == 'supplier_proposal')   {
3123
+                        $classfile = 'supplier_proposal'; $classname = 'SupplierProposal';
3124
+                    }
3125
+                    else if ($objecttype == 'facturerec')   {
3126
+                        $classfile = 'facture-rec'; $classname = 'FactureRec';
3127
+                    }
3128
+                    else if ($objecttype == 'subscription')   {
3129
+                        $classfile = 'subscription'; $classname = 'Subscription';
3130
+                    }
3131
+
3132
+                    // Here $module, $classfile and $classname are set
3133
+                    if ($conf->$module->enabled && (($element != $this->element) || $alsosametype))
3134
+                    {
3135
+                        if ($loadalsoobjects)
3136
+                        {
3137
+                            dol_include_once('/'.$classpath.'/'.$classfile.'.class.php');
3138
+                            //print '/'.$classpath.'/'.$classfile.'.class.php '.class_exists($classname);
3139
+                            if (class_exists($classname))
3140
+                            {
3141
+                                foreach($objectids as $i => $objectid)	// $i is rowid into llx_element_element
3142
+                                {
3143
+                                    $object = new $classname($this->db);
3144
+                                    $ret = $object->fetch($objectid);
3145
+                                    if ($ret >= 0)
3146
+                                    {
3147
+                                        $this->linkedObjects[$objecttype][$i] = $object;
3148
+                                    }
3149
+                                }
3150
+                            }
3151
+                        }
3152
+                    }
3153
+                    else
3154
+                    {
3155
+                        unset($this->linkedObjectsIds[$objecttype]);
3156
+                    }
3157
+                }
3158
+            }
3159
+            return 1;
3160
+        }
3161
+        else
3162
+        {
3163
+            dol_print_error($this->db);
3164
+            return -1;
3165
+        }
3166
+    }
3167
+
3168
+    /**
3169
+     *	Update object linked of a current object
3170
+     *
3171
+     *	@param	int		$sourceid		Object source id
3172
+     *	@param  string	$sourcetype		Object source type
3173
+     *	@param  int		$targetid		Object target id
3174
+     *	@param  string	$targettype		Object target type
3175
+     *	@return							int	>0 if OK, <0 if KO
3176
+     *	@see	add_object_linked, fetObjectLinked, deleteObjectLinked
3177
+     */
3178
+    function updateObjectLinked($sourceid=null, $sourcetype='', $targetid=null, $targettype='')
3179
+    {
3180
+        $updatesource=false;
3181
+        $updatetarget=false;
3182
+
3183
+        if (! empty($sourceid) && ! empty($sourcetype) && empty($targetid) && empty($targettype)) $updatesource=true;
3184
+        else if (empty($sourceid) && empty($sourcetype) && ! empty($targetid) && ! empty($targettype)) $updatetarget=true;
3185
+
3186
+        $sql = "UPDATE ".MAIN_DB_PREFIX."element_element SET ";
3187
+        if ($updatesource)
3188
+        {
3189
+            $sql.= "fk_source = ".$sourceid;
3190
+            $sql.= ", sourcetype = '".$this->db->escape($sourcetype)."'";
3191
+            $sql.= " WHERE fk_target = ".$this->id;
3192
+            $sql.= " AND targettype = '".$this->db->escape($this->element)."'";
3193
+        }
3194
+        else if ($updatetarget)
3195
+        {
3196
+            $sql.= "fk_target = ".$targetid;
3197
+            $sql.= ", targettype = '".$this->db->escape($targettype)."'";
3198
+            $sql.= " WHERE fk_source = ".$this->id;
3199
+            $sql.= " AND sourcetype = '".$this->db->escape($this->element)."'";
3200
+        }
3201
+
3202
+        dol_syslog(get_class($this)."::updateObjectLinked", LOG_DEBUG);
3203
+        if ($this->db->query($sql))
3204
+        {
3205
+            return 1;
3206
+        }
3207
+        else
3208
+        {
3209
+            $this->error=$this->db->lasterror();
3210
+            return -1;
3211
+        }
3212
+    }
3213
+
3214
+    /**
3215
+     *	Delete all links between an object $this
3216
+     *
3217
+     *	@param	int		$sourceid		Object source id
3218
+     *	@param  string	$sourcetype		Object source type
3219
+     *	@param  int		$targetid		Object target id
3220
+     *	@param  string	$targettype		Object target type
3221
+     *  @param	int		$rowid			Row id of line to delete. If defined, other parameters are not used.
3222
+     *	@return     					int	>0 if OK, <0 if KO
3223
+     *	@see	add_object_linked, updateObjectLinked, fetchObjectLinked
3224
+     */
3225
+    function deleteObjectLinked($sourceid=null, $sourcetype='', $targetid=null, $targettype='', $rowid='')
3226
+    {
3227
+        $deletesource=false;
3228
+        $deletetarget=false;
3229
+
3230
+        if (! empty($sourceid) && ! empty($sourcetype) && empty($targetid) && empty($targettype)) $deletesource=true;
3231
+        else if (empty($sourceid) && empty($sourcetype) && ! empty($targetid) && ! empty($targettype)) $deletetarget=true;
3232
+
3233
+        $sourceid = (! empty($sourceid) ? $sourceid : $this->id);
3234
+        $sourcetype = (! empty($sourcetype) ? $sourcetype : $this->element);
3235
+        $targetid = (! empty($targetid) ? $targetid : $this->id);
3236
+        $targettype = (! empty($targettype) ? $targettype : $this->element);
3237
+
3238
+        $sql = "DELETE FROM ".MAIN_DB_PREFIX."element_element";
3239
+        $sql.= " WHERE";
3240
+        if ($rowid > 0)
3241
+        {
3242
+            $sql.=" rowid = ".$rowid;
3243
+        }
3244
+        else
3245
+        {
3246
+            if ($deletesource)
3247
+            {
3248
+                $sql.= " fk_source = ".$sourceid." AND sourcetype = '".$this->db->escape($sourcetype)."'";
3249
+                $sql.= " AND fk_target = ".$this->id." AND targettype = '".$this->db->escape($this->element)."'";
3250
+            }
3251
+            else if ($deletetarget)
3252
+            {
3253
+                $sql.= " fk_target = ".$targetid." AND targettype = '".$this->db->escape($targettype)."'";
3254
+                $sql.= " AND fk_source = ".$this->id." AND sourcetype = '".$this->db->escape($this->element)."'";
3255
+            }
3256
+            else
3257
+            {
3258
+                $sql.= " (fk_source = ".$this->id." AND sourcetype = '".$this->db->escape($this->element)."')";
3259
+                $sql.= " OR";
3260
+                $sql.= " (fk_target = ".$this->id." AND targettype = '".$this->db->escape($this->element)."')";
3261
+            }
3262
+        }
3263
+
3264
+        dol_syslog(get_class($this)."::deleteObjectLinked", LOG_DEBUG);
3265
+        if ($this->db->query($sql))
3266
+        {
3267
+            return 1;
3268
+        }
3269
+        else
3270
+        {
3271
+            $this->error=$this->db->lasterror();
3272
+            $this->errors[]=$this->error;
3273
+            return -1;
3274
+        }
3275
+    }
3276
+
3277
+    /**
3278
+     *      Set status of an object
3279
+     *
3280
+     *      @param	int		$status			Status to set
3281
+     *      @param	int		$elementId		Id of element to force (use this->id by default)
3282
+     *      @param	string	$elementType	Type of element to force (use this->table_element by default)
3283
+     *      @param	string	$trigkey		Trigger key to use for trigger
3284
+     *      @return int						<0 if KO, >0 if OK
3285
+     */
3286
+    function setStatut($status, $elementId=null, $elementType='', $trigkey='')
3287
+    {
3288
+        global $user,$langs,$conf;
3289
+
3290
+        $savElementId=$elementId;  // To be used later to know if we were using the method using the id of this or not.
3291
+
3292
+        $elementId = (!empty($elementId)?$elementId:$this->id);
3293
+        $elementTable = (!empty($elementType)?$elementType:$this->table_element);
3294
+
3295
+        $this->db->begin();
3296
+
3297
+        $fieldstatus="fk_statut";
3298
+        if ($elementTable == 'facture_rec') $fieldstatus="suspended";
3299
+        if ($elementTable == 'mailing') $fieldstatus="statut";
3300
+        if ($elementTable == 'cronjob') $fieldstatus="status";
3301
+        if ($elementTable == 'user') $fieldstatus="statut";
3302
+        if ($elementTable == 'expensereport') $fieldstatus="fk_statut";
3303
+        if ($elementTable == 'commande_fournisseur_dispatch') $fieldstatus="status";
3304
+
3305
+        $sql = "UPDATE ".MAIN_DB_PREFIX.$elementTable;
3306
+        $sql.= " SET ".$fieldstatus." = ".$status;
3307
+        // If status = 1 = validated, update also fk_user_valid
3308
+        if ($status == 1 && $elementTable == 'expensereport') $sql.=", fk_user_valid = ".$user->id;
3309
+        $sql.= " WHERE rowid=".$elementId;
3310
+
3311
+        dol_syslog(get_class($this)."::setStatut", LOG_DEBUG);
3312
+        if ($this->db->query($sql))
3313
+        {
3314
+            $error = 0;
3315
+
3316
+            // Try autoset of trigkey
3317
+            if (empty($trigkey))
3318
+            {
3319
+                if ($this->element == 'supplier_proposal' && $status == 2) $trigkey='SUPPLIER_PROPOSAL_SIGN';   // 2 = SupplierProposal::STATUS_SIGNED. Can't use constant into this generic class
3320
+                if ($this->element == 'supplier_proposal' && $status == 3) $trigkey='SUPPLIER_PROPOSAL_REFUSE'; // 3 = SupplierProposal::STATUS_REFUSED. Can't use constant into this generic class
3321
+                if ($this->element == 'supplier_proposal' && $status == 4) $trigkey='SUPPLIER_PROPOSAL_CLOSE';  // 4 = SupplierProposal::STATUS_CLOSED. Can't use constant into this generic class
3322
+                if ($this->element == 'fichinter' && $status == 3) $trigkey='FICHINTER_CLASSIFY_DONE';
3323
+                if ($this->element == 'fichinter' && $status == 2) $trigkey='FICHINTER_CLASSIFY_BILLED';
3324
+                if ($this->element == 'fichinter' && $status == 1) $trigkey='FICHINTER_CLASSIFY_UNBILLED';
3325
+            }
3326
+
3327
+            if ($trigkey)
3328
+            {
3329
+                // Appel des triggers
3330
+                include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php';
3331
+                $interface=new Interfaces($this->db);
3332
+                $result=$interface->run_triggers($trigkey,$this,$user,$langs,$conf);
3333
+                if ($result < 0) {
3334
+                    $error++; $this->errors=$interface->errors;
3335
+                }
3336
+                // Fin appel triggers
3337
+            }
3338
+
3339
+            if (! $error)
3340
+            {
3341
+                $this->db->commit();
3342
+
3343
+                if (empty($savElementId))    // If the element we update was $this (so $elementId is null)
3344
+                {
3345
+                    $this->statut = $status;
3346
+                    $this->status = $status;
3347
+                }
3348
+
3349
+                return 1;
3350
+            }
3351
+            else
3352
+            {
3353
+                $this->db->rollback();
3354
+                dol_syslog(get_class($this)."::setStatus ".$this->error,LOG_ERR);
3355
+                return -1;
3356
+            }
3357
+        }
3358
+        else
3359
+        {
3360
+            $this->error=$this->db->lasterror();
3361
+            $this->db->rollback();
3362
+            return -1;
3363
+        }
3364
+    }
3365
+
3366
+
3367
+    /**
3368
+     *  Load type of canvas of an object if it exists
3369
+     *
3370
+     *  @param      int		$id     Record id
3371
+     *  @param      string	$ref    Record ref
3372
+     *  @return		int				<0 if KO, 0 if nothing done, >0 if OK
3373
+     */
3374
+    function getCanvas($id=0,$ref='')
3375
+    {
3376
+        global $conf;
3377
+
3378
+        if (empty($id) && empty($ref)) return 0;
3379
+        if (! empty($conf->global->MAIN_DISABLE_CANVAS)) return 0;    // To increase speed. Not enabled by default.
3380
+
3381
+        // Clean parameters
3382
+        $ref = trim($ref);
3383
+
3384
+        $sql = "SELECT rowid, canvas";
3385
+        $sql.= " FROM ".MAIN_DB_PREFIX.$this->table_element;
3386
+        $sql.= " WHERE entity IN (".getEntity($this->element).")";
3387
+        if (! empty($id))  $sql.= " AND rowid = ".$id;
3388
+        if (! empty($ref)) $sql.= " AND ref = '".$this->db->escape($ref)."'";
3389
+
3390
+        $resql = $this->db->query($sql);
3391
+        if ($resql)
3392
+        {
3393
+            $obj = $this->db->fetch_object($resql);
3394
+            if ($obj)
3395
+            {
3396
+                $this->canvas   = $obj->canvas;
3397
+                return 1;
3398
+            }
3399
+            else return 0;
3400
+        }
3401
+        else
3402
+        {
3403
+            dol_print_error($this->db);
3404
+            return -1;
3405
+        }
3406
+    }
3407
+
3408
+
3409
+    /**
3410
+     * 	Get special code of a line
3411
+     *
3412
+     * 	@param	int		$lineid		Id of line
3413
+     * 	@return	int					Special code
3414
+     */
3415
+    function getSpecialCode($lineid)
3416
+    {
3417
+        $sql = 'SELECT special_code FROM '.MAIN_DB_PREFIX.$this->table_element_line;
3418
+        $sql.= ' WHERE rowid = '.$lineid;
3419
+        $resql = $this->db->query($sql);
3420
+        if ($resql)
3421
+        {
3422
+            $row = $this->db->fetch_row($resql);
3423
+            return $row[0];
3424
+        }
3425
+    }
3426
+
3427
+    /**
3428
+     *  Function to check if an object is used by others.
3429
+     *  Check is done into this->childtables. There is no check into llx_element_element.
3430
+     *
3431
+     *  @param	int		$id			Force id of object
3432
+     *  @return	int					<0 if KO, 0 if not used, >0 if already used
3433
+     */
3434
+    function isObjectUsed($id=0)
3435
+    {
3436
+        global $langs;
3437
+
3438
+        if (empty($id)) $id=$this->id;
3439
+
3440
+        // Check parameters
3441
+        if (! isset($this->childtables) || ! is_array($this->childtables) || count($this->childtables) == 0)
3442
+        {
3443
+            dol_print_error('Called isObjectUsed on a class with property this->childtables not defined');
3444
+            return -1;
3445
+        }
3446
+
3447
+        $arraytoscan = $this->childtables;
3448
+        // For backward compatibility, we check if array is old format array('table1', 'table2', ...)
3449
+        $tmparray=array_keys($this->childtables);
3450
+        if (is_numeric($tmparray[0]))
3451
+        {
3452
+            $arraytoscan = array_flip($this->childtables);
3453
+        }
3454
+
3455
+        // Test if child exists
3456
+        $haschild=0;
3457
+        foreach($arraytoscan as $table => $elementname)
3458
+        {
3459
+            //print $id.'-'.$table.'-'.$elementname.'<br>';
3460
+            // Check if third party can be deleted
3461
+            $sql = "SELECT COUNT(*) as nb from ".MAIN_DB_PREFIX.$table;
3462
+            $sql.= " WHERE ".$this->fk_element." = ".$id;
3463
+            $resql=$this->db->query($sql);
3464
+            if ($resql)
3465
+            {
3466
+                $obj=$this->db->fetch_object($resql);
3467
+                if ($obj->nb > 0)
3468
+                {
3469
+                    $langs->load("errors");
3470
+                    //print 'Found into table '.$table.', type '.$langs->transnoentitiesnoconv($elementname).', haschild='.$haschild;
3471
+                    $haschild += $obj->nb;
3472
+                    if (is_numeric($elementname))	// old usage
3473
+                    {
3474
+                        $this->errors[]=$langs->trans("ErrorRecordHasAtLeastOneChildOfType", $table);
3475
+                    }
3476
+                    else	// new usage: $elementname=Translation key
3477
+                    {
3478
+                        $this->errors[]=$langs->trans("ErrorRecordHasAtLeastOneChildOfType", $langs->transnoentitiesnoconv($elementname));
3479
+                    }
3480
+                    break;    // We found at least one, we stop here
3481
+                }
3482
+            }
3483
+            else
3484
+            {
3485
+                $this->errors[]=$this->db->lasterror();
3486
+                return -1;
3487
+            }
3488
+        }
3489
+        if ($haschild > 0)
3490
+        {
3491
+            $this->errors[]="ErrorRecordHasChildren";
3492
+            return $haschild;
3493
+        }
3494
+        else return 0;
3495
+    }
3496
+
3497
+    /**
3498
+     *  Function to say how many lines object contains
3499
+     *
3500
+     *	@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
3501
+     *  @return	int						<0 if KO, 0 if no predefined products, nb of lines with predefined products if found
3502
+     */
3503
+    function hasProductsOrServices($predefined=-1)
3504
+    {
3505
+        $nb=0;
3506
+
3507
+        foreach($this->lines as $key => $val)
3508
+        {
3509
+            $qualified=0;
3510
+            if ($predefined == -1) $qualified=1;
3511
+            if ($predefined == 1 && $val->fk_product > 0) $qualified=1;
3512
+            if ($predefined == 0 && $val->fk_product <= 0) $qualified=1;
3513
+            if ($predefined == 2 && $val->fk_product > 0 && $val->product_type==0) $qualified=1;
3514
+            if ($predefined == 3 && $val->fk_product > 0 && $val->product_type==1) $qualified=1;
3515
+            if ($qualified) $nb++;
3516
+        }
3517
+        dol_syslog(get_class($this).'::hasProductsOrServices we found '.$nb.' qualified lines of products/servcies');
3518
+        return $nb;
3519
+    }
3520
+
3521
+    /**
3522
+     * Function that returns the total amount HT of discounts applied for all lines.
3523
+     *
3524
+     * @return 	float
3525
+     */
3526
+    function getTotalDiscount()
3527
+    {
3528
+        $total_discount=0.00;
3529
+
3530
+        $sql = "SELECT subprice as pu_ht, qty, remise_percent, total_ht";
3531
+        $sql.= " FROM ".MAIN_DB_PREFIX.$this->table_element."det";
3532
+        $sql.= " WHERE ".$this->fk_element." = ".$this->id;
3533
+
3534
+        dol_syslog(get_class($this).'::getTotalDiscount', LOG_DEBUG);
3535
+        $resql = $this->db->query($sql);
3536
+        if ($resql)
3537
+        {
3538
+            $num=$this->db->num_rows($resql);
3539
+            $i=0;
3540
+            while ($i < $num)
3541
+            {
3542
+                $obj = $this->db->fetch_object($resql);
3543
+
3544
+                $pu_ht = $obj->pu_ht;
3545
+                $qty= $obj->qty;
3546
+                $total_ht = $obj->total_ht;
3547
+
3548
+                $total_discount_line = floatval(price2num(($pu_ht * $qty) - $total_ht, 'MT'));
3549
+                $total_discount += $total_discount_line;
3550
+
3551
+                $i++;
3552
+            }
3553
+        }
3554
+
3555
+        //print $total_discount; exit;
3556
+        return price2num($total_discount);
3557
+    }
3558
+
3559
+
3560
+    /**
3561
+     * Return into unit=0, the calculated total of weight and volume of all lines * qty
3562
+     * Calculate by adding weight and volume of each product line, so properties ->volume/volume_units/weight/weight_units must be loaded on line.
3563
+     *
3564
+     * @return  array                           array('weight'=>...,'volume'=>...)
3565
+     */
3566
+    function getTotalWeightVolume()
3567
+    {
3568
+        $totalWeight = 0;
3569
+        $totalVolume = 0;
3570
+        // defined for shipment only
3571
+        $totalOrdered = '';
3572
+        // defined for shipment only
3573
+        $totalToShip = '';
3574
+
3575
+        foreach ($this->lines as $line)
3576
+        {
3577
+            if (isset($line->qty_asked))
3578
+            {
3579
+                if (empty($totalOrdered)) $totalOrdered=0;  // Avoid warning because $totalOrdered is ''
3580
+                $totalOrdered+=$line->qty_asked;    // defined for shipment only
3581
+            }
3582
+            if (isset($line->qty_shipped))
3583
+            {
3584
+                if (empty($totalToShip)) $totalToShip=0;    // Avoid warning because $totalToShip is ''
3585
+                $totalToShip+=$line->qty_shipped;   // defined for shipment only
3586
+            }else if ($line->element == 'commandefournisseurdispatch' && isset($line->qty))
3587
+            {
3588
+                if (empty($totalToShip)) $totalToShip=0;
3589
+                $totalToShip+=$line->qty;   // defined for reception only
3590
+            }
3591
+
3592
+            // Define qty, weight, volume, weight_units, volume_units
3593
+            if ($this->element == 'shipping') {
3594
+                // for shipments
3595
+                $qty = $line->qty_shipped ? $line->qty_shipped : 0;
3596
+            }
3597
+            else {
3598
+                $qty = $line->qty ? $line->qty : 0;
3599
+            }
3600
+
3601
+            $weight = $line->weight ? $line->weight : 0;
3602
+            ($weight==0 && !empty($line->product->weight))? $weight=$line->product->weight: 0;
3603
+            $volume = $line->volume ? $line->volume : 0;
3604
+            ($volume==0 && !empty($line->product->volume))? $volume=$line->product->volume: 0;
3605
+
3606
+            $weight_units=$line->weight_units;
3607
+            ($weight_units==0 && !empty($line->product->weight_units))? $weight_units=$line->product->weight_units: 0;
3608
+            $volume_units=$line->volume_units;
3609
+            ($volume_units==0 && !empty($line->product->volume_units))? $volume_units=$line->product->volume_units: 0;
3610
+
3611
+            $weightUnit=0;
3612
+            $volumeUnit=0;
3613
+            if (! empty($weight_units)) $weightUnit = $weight_units;
3614
+            if (! empty($volume_units)) $volumeUnit = $volume_units;
3615
+
3616
+            if (empty($totalWeight)) $totalWeight=0;  // Avoid warning because $totalWeight is ''
3617
+            if (empty($totalVolume)) $totalVolume=0;  // Avoid warning because $totalVolume is ''
3618
+
3619
+            //var_dump($line->volume_units);
3620
+            if ($weight_units < 50)   // >50 means a standard unit (power of 10 of official unit), > 50 means an exotic unit (like inch)
3621
+            {
3622
+                $trueWeightUnit=pow(10, $weightUnit);
3623
+                $totalWeight += $weight * $qty * $trueWeightUnit;
3624
+            }
3625
+            else {
3626
+        if ($weight_units == 99) {
3627
+            // conversion 1 Pound = 0.45359237 KG
3628
+            $trueWeightUnit = 0.45359237;
3629
+            $totalWeight += $weight * $qty * $trueWeightUnit;
3630
+        } elseif ($weight_units == 98) {
3631
+            // conversion 1 Ounce = 0.0283495 KG
3632
+            $trueWeightUnit = 0.0283495;
3633
+            $totalWeight += $weight * $qty * $trueWeightUnit;
3634
+        }
3635
+        else
3636
+                    $totalWeight += $weight * $qty;   // This may be wrong if we mix different units
3637
+            }
3638
+            if ($volume_units < 50)   // >50 means a standard unit (power of 10 of official unit), > 50 means an exotic unit (like inch)
3639
+            {
3640
+                //print $line->volume."x".$line->volume_units."x".($line->volume_units < 50)."x".$volumeUnit;
3641
+                $trueVolumeUnit=pow(10, $volumeUnit);
3642
+                //print $line->volume;
3643
+                $totalVolume += $volume * $qty * $trueVolumeUnit;
3644
+            }
3645
+            else
3646
+            {
3647
+                $totalVolume += $volume * $qty;   // This may be wrong if we mix different units
3648
+            }
3649
+        }
3650
+
3651
+        return array('weight'=>$totalWeight, 'volume'=>$totalVolume, 'ordered'=>$totalOrdered, 'toship'=>$totalToShip);
3652
+    }
3653
+
3654
+
3655
+    /**
3656
+     *	Set extra parameters
3657
+     *
3658
+     *	@return	int      <0 if KO, >0 if OK
3659
+     */
3660
+    function setExtraParameters()
3661
+    {
3662
+        $this->db->begin();
3663
+
3664
+        $extraparams = (! empty($this->extraparams) ? json_encode($this->extraparams) : null);
3665
+
3666
+        $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
3667
+        $sql.= " SET extraparams = ".(! empty($extraparams) ? "'".$this->db->escape($extraparams)."'" : "null");
3668
+        $sql.= " WHERE rowid = ".$this->id;
3669
+
3670
+        dol_syslog(get_class($this)."::setExtraParameters", LOG_DEBUG);
3671
+        $resql = $this->db->query($sql);
3672
+        if (! $resql)
3673
+        {
3674
+            $this->error=$this->db->lasterror();
3675
+            $this->db->rollback();
3676
+            return -1;
3677
+        }
3678
+        else
3679
+        {
3680
+            $this->db->commit();
3681
+            return 1;
3682
+        }
3683
+    }
3684
+
3685
+
3686
+    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
3687
+    /**
3688
+     *    Return incoterms informations
3689
+     *    TODO Use a cache for label get
3690
+     *
3691
+     *    @return	string	incoterms info
3692
+     */
3693
+    function display_incoterms()
3694
+    {
3695
+        // phpcs:enable
3696
+        $out = '';
3697
+        $this->libelle_incoterms = '';
3698
+        if (!empty($this->fk_incoterms))
3699
+        {
3700
+            $sql = 'SELECT code FROM '.MAIN_DB_PREFIX.'c_incoterms WHERE rowid = '.(int) $this->fk_incoterms;
3701
+            $result = $this->db->query($sql);
3702
+            if ($result)
3703
+            {
3704
+                $res = $this->db->fetch_object($result);
3705
+                $out .= $res->code;
3706
+            }
3707
+        }
3708
+
3709
+        $out .= (($res->code && $this->location_incoterms)?' - ':'').$this->location_incoterms;
3710
+
3711
+        return $out;
3712
+    }
3713
+
3714
+    /**
3715
+     *    Return incoterms informations for pdf display
3716
+     *
3717
+     *    @return	string		incoterms info
3718
+     */
3719
+    function getIncotermsForPDF()
3720
+    {
3721
+        $sql = 'SELECT code FROM '.MAIN_DB_PREFIX.'c_incoterms WHERE rowid = '.(int) $this->fk_incoterms;
3722
+        $resql = $this->db->query($sql);
3723
+        if ($resql)
3724
+        {
3725
+            $num = $this->db->num_rows($resql);
3726
+            if ($num > 0)
3727
+            {
3728
+                $res = $this->db->fetch_object($resql);
3729
+                return 'Incoterm : '.$res->code.' - '.$this->location_incoterms;
3730
+            }
3731
+            else
3732
+            {
3733
+                return '';
3734
+            }
3735
+        }
3736
+        else
3737
+        {
3738
+            $this->errors[] = $this->db->lasterror();
3739
+            return false;
3740
+        }
3741
+    }
3742
+
3743
+    /**
3744
+     *    Define incoterms values of current object
3745
+     *
3746
+     *    @param	int		$id_incoterm     Id of incoterm to set or '' to remove
3747
+     * 	  @param 	string  $location		 location of incoterm
3748
+     *    @return	int     		<0 if KO, >0 if OK
3749
+     */
3750
+    function setIncoterms($id_incoterm, $location)
3751
+    {
3752
+        if ($this->id && $this->table_element)
3753
+        {
3754
+            $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
3755
+            $sql.= " SET fk_incoterms = ".($id_incoterm > 0 ? $id_incoterm : "null");
3756
+            $sql.= ", location_incoterms = ".($id_incoterm > 0 ? "'".$this->db->escape($location)."'" : "null");
3757
+            $sql.= " WHERE rowid = " . $this->id;
3758
+            dol_syslog(get_class($this).'::setIncoterms', LOG_DEBUG);
3759
+            $resql=$this->db->query($sql);
3760
+            if ($resql)
3761
+            {
3762
+                $this->fk_incoterms = $id_incoterm;
3763
+                $this->location_incoterms = $location;
3764
+
3765
+                $sql = 'SELECT libelle FROM '.MAIN_DB_PREFIX.'c_incoterms WHERE rowid = '.(int) $this->fk_incoterms;
3766
+                $res = $this->db->query($sql);
3767
+                if ($res)
3768
+                {
3769
+                    $obj = $this->db->fetch_object($res);
3770
+                    $this->libelle_incoterms = $obj->libelle;
3771
+                }
3772
+                return 1;
3773
+            }
3774
+            else
3775
+            {
3776
+                $this->errors[] = $this->db->lasterror();
3777
+                return -1;
3778
+            }
3779
+        }
3780
+        else return -1;
3781
+    }
3782
+
3783
+
3784
+    // --------------------
3785
+    // TODO: All functions here must be redesigned and moved as they are not business functions but output functions
3786
+    // --------------------
3787
+
3788
+    /* This is to show add lines */
3789
+
3790
+    /**
3791
+     *	Show add free and predefined products/services form
3792
+     *
3793
+     *  @param	int		        $dateSelector       1=Show also date range input fields
3794
+     *  @param	Societe			$seller				Object thirdparty who sell
3795
+     *  @param	Societe			$buyer				Object thirdparty who buy
3796
+     *	@return	void
3797
+     */
3798
+    function formAddObjectLine($dateSelector, $seller, $buyer)
3799
+    {
3800
+        global $conf,$user,$langs,$object,$hookmanager;
3801
+        global $form,$bcnd,$var;
3802
+
3803
+        // Line extrafield
3804
+        require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
3805
+        $extrafieldsline = new ExtraFields($this->db);
3806
+        $extralabelslines=$extrafieldsline->fetch_name_optionals_label($this->table_element_line);
3807
+
3808
+        // Output template part (modules that overwrite templates must declare this into descriptor)
3809
+        // Use global variables + $dateSelector + $seller and $buyer
3810
+        $dirtpls=array_merge($conf->modules_parts['tpl'],array('/core/tpl'));
3811
+        foreach($dirtpls as $reldir)
3812
+        {
3813
+            $tpl = dol_buildpath($reldir.'/objectline_create.tpl.php');
3814
+            if (empty($conf->file->strict_mode)) {
3815
+                $res=@include $tpl;
3816
+            } else {
3817
+                $res=include $tpl; // for debug
3818
+            }
3819
+            if ($res) break;
3820
+        }
3821
+    }
3822
+
3823
+
3824
+
3825
+    /* This is to show array of line of details */
3826
+
3827
+
3828
+    /**
3829
+     *	Return HTML table for object lines
3830
+     *	TODO Move this into an output class file (htmlline.class.php)
3831
+     *	If lines are into a template, title must also be into a template
3832
+     *	But for the moment we don't know if it's possible as we keep a method available on overloaded objects.
3833
+     *
3834
+     *	@param	string		$action				Action code
3835
+     *	@param  string		$seller            	Object of seller third party
3836
+     *	@param  string  	$buyer             	Object of buyer third party
3837
+     *	@param	int			$selected		   	Object line selected
3838
+     *	@param  int	    	$dateSelector      	1=Show also date range input fields
3839
+     *	@return	void
3840
+     */
3841
+    function printObjectLines($action, $seller, $buyer, $selected=0, $dateSelector=0)
3842
+    {
3843
+        global $conf, $hookmanager, $langs, $user;
3844
+        // TODO We should not use global var for this !
3845
+        global $inputalsopricewithtax, $usemargins, $disableedit, $disablemove, $disableremove, $outputalsopricetotalwithtax;
3846
+
3847
+        // Define usemargins
3848
+        $usemargins=0;
3849
+        if (! empty($conf->margin->enabled) && ! empty($this->element) && in_array($this->element,array('facture','propal','commande'))) $usemargins=1;
3850
+
3851
+        $num = count($this->lines);
3852
+
3853
+        // Line extrafield
3854
+        require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
3855
+        $extrafieldsline = new ExtraFields($this->db);
3856
+        $extralabelslines=$extrafieldsline->fetch_name_optionals_label($this->table_element_line);
3857
+
3858
+        $parameters = array('num'=>$num,'i'=>$i,'dateSelector'=>$dateSelector,'seller'=>$seller,'buyer'=>$buyer,'selected'=>$selected, 'extrafieldsline'=>$extrafieldsline);
3859
+        $reshook = $hookmanager->executeHooks('printObjectLineTitle', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
3860
+        if (empty($reshook))
3861
+        {
3862
+            // Title line
3863
+            print "<thead>\n";
3864
+
3865
+            print '<tr class="liste_titre nodrag nodrop">';
3866
+
3867
+            // Adds a line numbering column
3868
+            if (! empty($conf->global->MAIN_VIEW_LINE_NUMBER)) print '<td class="linecolnum" align="center" width="5">&nbsp;</td>';
3869
+
3870
+            // Description
3871
+            print '<td class="linecoldescription">'.$langs->trans('Description').'</td>';
3872
+
3873
+            if ($this->element == 'supplier_proposal' || $this->element == 'order_supplier' || $this->element == 'invoice_supplier')
3874
+            {
3875
+                print '<td class="linerefsupplier"><span id="title_fourn_ref">'.$langs->trans("SupplierRef").'</span></td>';
3876
+            }
3877
+
3878
+            // VAT
3879
+            print '<td class="linecolvat" align="right" width="80">'.$langs->trans('VAT').'</td>';
3880
+
3881
+            // Price HT
3882
+            print '<td class="linecoluht" align="right" width="80">'.$langs->trans('PriceUHT').'</td>';
3883
+
3884
+            // Multicurrency
3885
+            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>';
3886
+
3887
+            if ($inputalsopricewithtax) print '<td align="right" width="80">'.$langs->trans('PriceUTTC').'</td>';
3888
+
3889
+            // Qty
3890
+            print '<td class="linecolqty" align="right">'.$langs->trans('Qty').'</td>';
3891
+
3892
+            if($conf->global->PRODUCT_USE_UNITS)
3893
+            {
3894
+                print '<td class="linecoluseunit" align="left">'.$langs->trans('Unit').'</td>';
3895
+            }
3896
+
3897
+            // Reduction short
3898
+            print '<td class="linecoldiscount" align="right">'.$langs->trans('ReductionShort').'</td>';
3899
+
3900
+            if ($this->situation_cycle_ref) {
3901
+                print '<td class="linecolcycleref" align="right">' . $langs->trans('Progress') . '</td>';
3902
+            }
3903
+
3904
+            if ($usemargins && ! empty($conf->margin->enabled) && empty($user->societe_id))
3905
+            {
3906
+                if (!empty($user->rights->margins->creer))
3907
+                {
3908
+                    if ($conf->global->MARGIN_TYPE == "1")
3909
+                        print '<td class="linecolmargin1 margininfos" align="right" width="80">'.$langs->trans('BuyingPrice').'</td>';
3910
+                    else
3911
+                        print '<td class="linecolmargin1 margininfos" align="right" width="80">'.$langs->trans('CostPrice').'</td>';
3912
+                }
3913
+
3914
+                if (! empty($conf->global->DISPLAY_MARGIN_RATES) && $user->rights->margins->liretous)
3915
+                    print '<td class="linecolmargin2 margininfos" align="right" width="50">'.$langs->trans('MarginRate').'</td>';
3916
+                if (! empty($conf->global->DISPLAY_MARK_RATES) && $user->rights->margins->liretous)
3917
+                    print '<td class="linecolmargin2 margininfos" align="right" width="50">'.$langs->trans('MarkRate').'</td>';
3918
+            }
3919
+
3920
+            // Total HT
3921
+            print '<td class="linecolht" align="right">'.$langs->trans('TotalHTShort').'</td>';
3922
+
3923
+            // Multicurrency
3924
+            if (!empty($conf->multicurrency->enabled) && $this->multicurrency_code != $conf->currency) print '<td class="linecoltotalht_currency" align="right">'.$langs->trans('TotalHTShortCurrency', $this->multicurrency_code).'</td>';
3925
+
3926
+            if ($outputalsopricetotalwithtax) print '<td align="right" width="80">'.$langs->trans('TotalTTCShort').'</td>';
3927
+
3928
+            print '<td class="linecoledit"></td>';  // No width to allow autodim
3929
+
3930
+            print '<td class="linecoldelete" width="10"></td>';
3931
+
3932
+            print '<td class="linecolmove" width="10"></td>';
3933
+
3934
+            if($action == 'selectlines')
3935
+            {
3936
+                print '<td class="linecolcheckall" align="center">';
3937
+                print '<input type="checkbox" class="linecheckboxtoggle" />';
3938
+                print '<script type="text/javascript">$(document).ready(function() {$(".linecheckboxtoggle").click(function() {var checkBoxes = $(".linecheckbox");checkBoxes.prop("checked", this.checked);})});</script>';
3939
+                print '</td>';
3940
+            }
3941
+
3942
+            print "</tr>\n";
3943
+            print "</thead>\n";
3944
+        }
3945
+
3946
+        $var = true;
3947
+        $i	 = 0;
3948
+
3949
+        print "<tbody>\n";
3950
+        foreach ($this->lines as $line)
3951
+        {
3952
+            //Line extrafield
3953
+            $line->fetch_optionals();
3954
+
3955
+            //if (is_object($hookmanager) && (($line->product_type == 9 && ! empty($line->special_code)) || ! empty($line->fk_parent_line)))
3956
+            if (is_object($hookmanager))   // Old code is commented on preceding line.
3957
+            {
3958
+                if (empty($line->fk_parent_line))
3959
+                {
3960
+                    $parameters = array('line'=>$line,'var'=>$var,'num'=>$num,'i'=>$i,'dateSelector'=>$dateSelector,'seller'=>$seller,'buyer'=>$buyer,'selected'=>$selected, 'extrafieldsline'=>$extrafieldsline);
3961
+                    $reshook = $hookmanager->executeHooks('printObjectLine', $parameters, $this, $action);    // Note that $action and $object may have been modified by some hooks
3962
+                }
3963
+                else
3964
+                {
3965
+                    $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);
3966
+                    $reshook = $hookmanager->executeHooks('printObjectSubLine', $parameters, $this, $action);    // Note that $action and $object may have been modified by some hooks
3967
+                }
3968
+            }
3969
+            if (empty($reshook))
3970
+            {
3971
+                $this->printObjectLine($action,$line,$var,$num,$i,$dateSelector,$seller,$buyer,$selected,$extrafieldsline);
3972
+            }
3973
+
3974
+            $i++;
3975
+        }
3976
+        print "</tbody>\n";
3977
+    }
3978
+
3979
+    /**
3980
+     *	Return HTML content of a detail line
3981
+     *	TODO Move this into an output class file (htmlline.class.php)
3982
+     *
3983
+     *	@param	string		$action				GET/POST action
3984
+     *	@param CommonObjectLine $line		       	Selected object line to output
3985
+     *	@param  string	    $var               	Is it a an odd line (true)
3986
+     *	@param  int		    $num               	Number of line (0)
3987
+     *	@param  int		    $i					I
3988
+     *	@param  int		    $dateSelector      	1=Show also date range input fields
3989
+     *	@param  string	    $seller            	Object of seller third party
3990
+     *	@param  string	    $buyer             	Object of buyer third party
3991
+     *	@param	int			$selected		   	Object line selected
3992
+     *  @param  int			$extrafieldsline	Object of extrafield line attribute
3993
+     *	@return	void
3994
+     */
3995
+    function printObjectLine($action,$line,$var,$num,$i,$dateSelector,$seller,$buyer,$selected=0,$extrafieldsline=0)
3996
+    {
3997
+        global $conf,$langs,$user,$object,$hookmanager;
3998
+        global $form,$bc,$bcdd;
3999
+        global $object_rights, $disableedit, $disablemove, $disableremove;   // TODO We should not use global var for this !
4000
+
4001
+        $object_rights = $this->getRights();
4002
+
4003
+        $element=$this->element;
4004
+
4005
+        $text=''; $description=''; $type=0;
4006
+
4007
+        // Show product and description
4008
+        $type=(! empty($line->product_type)?$line->product_type:$line->fk_product_type);
4009
+        // Try to enhance type detection using date_start and date_end for free lines where type was not saved.
4010
+        if (! empty($line->date_start)) $type=1; // deprecated
4011
+        if (! empty($line->date_end)) $type=1; // deprecated
4012
+
4013
+        // Ligne en mode visu
4014
+        if ($action != 'editline' || $selected != $line->id)
4015
+        {
4016
+            // Product
4017
+            if ($line->fk_product > 0)
4018
+            {
4019
+                $product_static = new Product($this->db);
4020
+                $product_static->fetch($line->fk_product);
4021
+
4022
+                $product_static->ref = $line->ref; //can change ref in hook
4023
+                $product_static->label = $line->label; //can change label in hook
4024
+                $text=$product_static->getNomUrl(1);
4025
+
4026
+                // Define output language and label
4027
+                if (! empty($conf->global->MAIN_MULTILANGS))
4028
+                {
4029
+                    if (! is_object($this->thirdparty))
4030
+                    {
4031
+                        dol_print_error('','Error: Method printObjectLine was called on an object and object->fetch_thirdparty was not done before');
4032
+                        return;
4033
+                    }
4034
+
4035
+                    $prod = new Product($this->db);
4036
+                    $prod->fetch($line->fk_product);
4037
+
4038
+                    $outputlangs = $langs;
4039
+                    $newlang='';
4040
+                    if (empty($newlang) && GETPOST('lang_id','aZ09')) $newlang=GETPOST('lang_id','aZ09');
4041
+                    if (! empty($conf->global->PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE) && empty($newlang)) $newlang=$this->thirdparty->default_lang;		// For language to language of customer
4042
+                    if (! empty($newlang))
4043
+                    {
4044
+                        $outputlangs = new Translate("",$conf);
4045
+                        $outputlangs->setDefaultLang($newlang);
4046
+                    }
4047
+
4048
+                    $label = (! empty($prod->multilangs[$outputlangs->defaultlang]["label"])) ? $prod->multilangs[$outputlangs->defaultlang]["label"] : $line->product_label;
4049
+                }
4050
+                else
4051
+                {
4052
+                    $label = $line->product_label;
4053
+                }
4054
+
4055
+                $text.= ' - '.(! empty($line->label)?$line->label:$label);
4056
+                $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.
4057
+            }
4058
+
4059
+            $line->pu_ttc = price2num($line->subprice * (1 + ($line->tva_tx/100)), 'MU');
4060
+
4061
+            // Output template part (modules that overwrite templates must declare this into descriptor)
4062
+            // Use global variables + $dateSelector + $seller and $buyer
4063
+            $dirtpls=array_merge($conf->modules_parts['tpl'],array('/core/tpl'));
4064
+            foreach($dirtpls as $reldir)
4065
+            {
4066
+                $tpl = dol_buildpath($reldir.'/objectline_view.tpl.php');
4067
+                if (empty($conf->file->strict_mode)) {
4068
+                    $res=@include $tpl;
4069
+                } else {
4070
+                    $res=include $tpl; // for debug
4071
+                }
4072
+                if ($res) break;
4073
+            }
4074
+        }
4075
+
4076
+        // Ligne en mode update
4077
+        if ($this->statut == 0 && $action == 'editline' && $selected == $line->id)
4078
+        {
4079
+            $label = (! empty($line->label) ? $line->label : (($line->fk_product > 0) ? $line->product_label : ''));
4080
+            $placeholder=' placeholder="'.$langs->trans("Label").'"';
4081
+
4082
+            $line->pu_ttc = price2num($line->subprice * (1 + ($line->tva_tx/100)), 'MU');
4083
+
4084
+            // Output template part (modules that overwrite templates must declare this into descriptor)
4085
+            // Use global variables + $dateSelector + $seller and $buyer
4086
+            $dirtpls=array_merge($conf->modules_parts['tpl'],array('/core/tpl'));
4087
+            foreach($dirtpls as $reldir)
4088
+            {
4089
+                $tpl = dol_buildpath($reldir.'/objectline_edit.tpl.php');
4090
+                if (empty($conf->file->strict_mode)) {
4091
+                    $res=@include $tpl;
4092
+                } else {
4093
+                    $res=include $tpl; // for debug
4094
+                }
4095
+                if ($res) break;
4096
+            }
4097
+        }
4098
+    }
4099
+
4100
+
4101
+    /* This is to show array of line of details of source object */
4102
+
4103
+
4104
+    /**
4105
+     * 	Return HTML table table of source object lines
4106
+     *  TODO Move this and previous function into output html class file (htmlline.class.php).
4107
+     *  If lines are into a template, title must also be into a template
4108
+     *  But for the moment we don't know if it's possible, so we keep the method available on overloaded objects.
4109
+     *
4110
+     *	@param	string		$restrictlist		''=All lines, 'services'=Restrict to services only
4111
+     *  @return	void
4112
+     */
4113
+    function printOriginLinesList($restrictlist='')
4114
+    {
4115
+        global $langs, $hookmanager, $conf;
4116
+
4117
+        print '<tr class="liste_titre">';
4118
+        print '<td>'.$langs->trans('Ref').'</td>';
4119
+        print '<td>'.$langs->trans('Description').'</td>';
4120
+        print '<td align="right">'.$langs->trans('VATRate').'</td>';
4121
+        print '<td align="right">'.$langs->trans('PriceUHT').'</td>';
4122
+        if (!empty($conf->multicurrency->enabled)) print '<td align="right">'.$langs->trans('PriceUHTCurrency').'</td>';
4123
+        print '<td align="right">'.$langs->trans('Qty').'</td>';
4124
+        if($conf->global->PRODUCT_USE_UNITS)
4125
+        {
4126
+            print '<td align="left">'.$langs->trans('Unit').'</td>';
4127
+        }
4128
+        print '<td align="right">'.$langs->trans('ReductionShort').'</td></tr>';
4129
+
4130
+        $var = true;
4131
+        $i	 = 0;
4132
+
4133
+        if (! empty($this->lines))
4134
+        {
4135
+            foreach ($this->lines as $line)
4136
+            {
4137
+                if (is_object($hookmanager) && (($line->product_type == 9 && ! empty($line->special_code)) || ! empty($line->fk_parent_line)))
4138
+                {
4139
+                    if (empty($line->fk_parent_line))
4140
+                    {
4141
+                        $parameters=array('line'=>$line,'var'=>$var,'i'=>$i);
4142
+                        $action='';
4143
+                        $hookmanager->executeHooks('printOriginObjectLine',$parameters,$this,$action);    // Note that $action and $object may have been modified by some hooks
4144
+                    }
4145
+                }
4146
+                else
4147
+                {
4148
+                    $this->printOriginLine($line, $var, $restrictlist);
4149
+                }
4150
+
4151
+                $i++;
4152
+            }
4153
+        }
4154
+    }
4155
+
4156
+    /**
4157
+     * 	Return HTML with a line of table array of source object lines
4158
+     *  TODO Move this and previous function into output html class file (htmlline.class.php).
4159
+     *  If lines are into a template, title must also be into a template
4160
+     *  But for the moment we don't know if it's possible as we keep a method available on overloaded objects.
4161
+     *
4162
+     * 	@param	CommonObjectLine	$line				Line
4163
+     * 	@param	string				$var				Var
4164
+     *	@param	string				$restrictlist		''=All lines, 'services'=Restrict to services only (strike line if not)
4165
+     * 	@return	void
4166
+     */
4167
+    function printOriginLine($line, $var, $restrictlist='')
4168
+    {
4169
+        global $langs, $conf;
4170
+
4171
+        //var_dump($line);
4172
+        if (!empty($line->date_start))
4173
+        {
4174
+            $date_start=$line->date_start;
4175
+        }
4176
+        else
4177
+        {
4178
+            $date_start=$line->date_debut_prevue;
4179
+            if ($line->date_debut_reel) $date_start=$line->date_debut_reel;
4180
+        }
4181
+        if (!empty($line->date_end))
4182
+        {
4183
+            $date_end=$line->date_end;
4184
+        }
4185
+        else
4186
+        {
4187
+            $date_end=$line->date_fin_prevue;
4188
+            if ($line->date_fin_reel) $date_end=$line->date_fin_reel;
4189
+        }
4190
+
4191
+        $this->tpl['label'] = '';
4192
+        if (! empty($line->fk_parent_line)) $this->tpl['label'].= img_picto('', 'rightarrow');
4193
+
4194
+        if (($line->info_bits & 2) == 2)  // TODO Not sure this is used for source object
4195
+        {
4196
+            $discount=new DiscountAbsolute($this->db);
4197
+            $discount->fk_soc = $this->socid;
4198
+            $this->tpl['label'].= $discount->getNomUrl(0,'discount');
4199
+        }
4200
+        else if (! empty($line->fk_product))
4201
+        {
4202
+            $productstatic = new Product($this->db);
4203
+            $productstatic->id = $line->fk_product;
4204
+            $productstatic->ref = $line->ref;
4205
+            $productstatic->type = $line->fk_product_type;
4206
+            if(empty($productstatic->ref)){
4207
+                $line->fetch_product();
4208
+                $productstatic = $line->product;
4209
+            }
4210
+			
4211
+            $this->tpl['label'].= $productstatic->getNomUrl(1);
4212
+            $this->tpl['label'].= ' - '.(! empty($line->label)?$line->label:$line->product_label);
4213
+            // Dates
4214
+            if ($line->product_type == 1 && ($date_start || $date_end))
4215
+            {
4216
+                $this->tpl['label'].= get_date_range($date_start,$date_end);
4217
+            }
4218
+        }
4219
+        else
4220
+        {
4221
+            $this->tpl['label'].= ($line->product_type == -1 ? '&nbsp;' : ($line->product_type == 1 ? img_object($langs->trans(''),'service') : img_object($langs->trans(''),'product')));
4222
+            if (!empty($line->desc)) {
4223
+                $this->tpl['label'].=$line->desc;
4224
+            }else {
4225
+                $this->tpl['label'].= ($line->label ? '&nbsp;'.$line->label : '');
4226
+            }
4227
+			
4228
+            // Dates
4229
+            if ($line->product_type == 1 && ($date_start || $date_end))
4230
+            {
4231
+                $this->tpl['label'].= get_date_range($date_start,$date_end);
4232
+            }
4233
+        }
4234
+
4235
+        if (! empty($line->desc))
4236
+        {
4237
+            if ($line->desc == '(CREDIT_NOTE)')  // TODO Not sure this is used for source object
4238
+            {
4239
+                $discount=new DiscountAbsolute($this->db);
4240
+                $discount->fetch($line->fk_remise_except);
4241
+                $this->tpl['description'] = $langs->transnoentities("DiscountFromCreditNote",$discount->getNomUrl(0));
4242
+            }
4243
+            elseif ($line->desc == '(DEPOSIT)')  // TODO Not sure this is used for source object
4244
+            {
4245
+                $discount=new DiscountAbsolute($this->db);
4246
+                $discount->fetch($line->fk_remise_except);
4247
+                $this->tpl['description'] = $langs->transnoentities("DiscountFromDeposit",$discount->getNomUrl(0));
4248
+            }
4249
+            elseif ($line->desc == '(EXCESS RECEIVED)')
4250
+            {
4251
+                $discount=new DiscountAbsolute($this->db);
4252
+                $discount->fetch($line->fk_remise_except);
4253
+                $this->tpl['description'] = $langs->transnoentities("DiscountFromExcessReceived",$discount->getNomUrl(0));
4254
+            }
4255
+            elseif ($line->desc == '(EXCESS PAID)')
4256
+            {
4257
+                $discount=new DiscountAbsolute($this->db);
4258
+                $discount->fetch($line->fk_remise_except);
4259
+                $this->tpl['description'] = $langs->transnoentities("DiscountFromExcessPaid",$discount->getNomUrl(0));
4260
+            }
4261
+            else
4262
+            {
4263
+                $this->tpl['description'] = dol_trunc($line->desc,60);
4264
+            }
4265
+        }
4266
+        else
4267
+        {
4268
+            $this->tpl['description'] = '&nbsp;';
4269
+        }
4270
+
4271
+        // VAT Rate
4272
+        $this->tpl['vat_rate'] = vatrate($line->tva_tx, true);
4273
+        $this->tpl['vat_rate'] .= (($line->info_bits & 1) == 1) ? '*' : '';
4274
+        if (! empty($line->vat_src_code) && ! preg_match('/\(/', $this->tpl['vat_rate'])) $this->tpl['vat_rate'].=' ('.$line->vat_src_code.')';
4275
+
4276
+        $this->tpl['price'] = price($line->subprice);
4277
+        $this->tpl['multicurrency_price'] = price($line->multicurrency_subprice);
4278
+        $this->tpl['qty'] = (($line->info_bits & 2) != 2) ? $line->qty : '&nbsp;';
4279
+        if ($conf->global->PRODUCT_USE_UNITS) $this->tpl['unit'] = $langs->transnoentities($line->getLabelOfUnit('long'));
4280
+        $this->tpl['remise_percent'] = (($line->info_bits & 2) != 2) ? vatrate($line->remise_percent, true) : '&nbsp;';
4281
+
4282
+        // Is the line strike or not
4283
+        $this->tpl['strike']=0;
4284
+        if ($restrictlist == 'services' && $line->product_type != Product::TYPE_SERVICE) $this->tpl['strike']=1;
4285
+
4286
+        // Output template part (modules that overwrite templates must declare this into descriptor)
4287
+        // Use global variables + $dateSelector + $seller and $buyer
4288
+        $dirtpls=array_merge($conf->modules_parts['tpl'],array('/core/tpl'));
4289
+        foreach($dirtpls as $reldir)
4290
+        {
4291
+            $tpl = dol_buildpath($reldir.'/originproductline.tpl.php');
4292
+            if (empty($conf->file->strict_mode)) {
4293
+                $res=@include $tpl;
4294
+            } else {
4295
+                $res=include $tpl; // for debug
4296
+            }
4297
+            if ($res) break;
4298
+        }
4299
+    }
4300
+
4301
+
4302
+    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
4303
+    /**
4304
+     *	Add resources to the current object : add entry into llx_element_resources
4305
+     *	Need $this->element & $this->id
4306
+     *
4307
+     *	@param		int		$resource_id		Resource id
4308
+     *	@param		string	$resource_type		'resource'
4309
+     *	@param		int		$busy				Busy or not
4310
+     *	@param		int		$mandatory			Mandatory or not
4311
+     *	@return		int							<=0 if KO, >0 if OK
4312
+     */
4313
+    function add_element_resource($resource_id, $resource_type, $busy=0, $mandatory=0)
4314
+    {
4315
+        // phpcs:enable
4316
+        $this->db->begin();
4317
+
4318
+        $sql = "INSERT INTO ".MAIN_DB_PREFIX."element_resources (";
4319
+        $sql.= "resource_id";
4320
+        $sql.= ", resource_type";
4321
+        $sql.= ", element_id";
4322
+        $sql.= ", element_type";
4323
+        $sql.= ", busy";
4324
+        $sql.= ", mandatory";
4325
+        $sql.= ") VALUES (";
4326
+        $sql.= $resource_id;
4327
+        $sql.= ", '".$this->db->escape($resource_type)."'";
4328
+        $sql.= ", '".$this->db->escape($this->id)."'";
4329
+        $sql.= ", '".$this->db->escape($this->element)."'";
4330
+        $sql.= ", '".$this->db->escape($busy)."'";
4331
+        $sql.= ", '".$this->db->escape($mandatory)."'";
4332
+        $sql.= ")";
4333
+
4334
+        dol_syslog(get_class($this)."::add_element_resource", LOG_DEBUG);
4335
+        if ($this->db->query($sql))
4336
+        {
4337
+            $this->db->commit();
4338
+            return 1;
4339
+        }
4340
+        else
4341
+        {
4342
+            $this->error=$this->db->lasterror();
4343
+            $this->db->rollback();
4344
+            return  0;
4345
+        }
4346
+    }
4347
+
4348
+    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
4349
+    /**
4350
+     *    Delete a link to resource line
4351
+     *
4352
+     *    @param	int		$rowid			Id of resource line to delete
4353
+     *    @param	int		$element		element name (for trigger) TODO: use $this->element into commonobject class
4354
+     *    @param	int		$notrigger		Disable all triggers
4355
+     *    @return   int						>0 if OK, <0 if KO
4356
+     */
4357
+    function delete_resource($rowid, $element, $notrigger=0)
4358
+    {
4359
+        // phpcs:enable
4360
+        global $user;
4361
+
4362
+        $this->db->begin();
4363
+
4364
+        $sql = "DELETE FROM ".MAIN_DB_PREFIX."element_resources";
4365
+        $sql.= " WHERE rowid=".$rowid;
4366
+
4367
+        dol_syslog(get_class($this)."::delete_resource", LOG_DEBUG);
4368
+
4369
+        $resql=$this->db->query($sql);
4370
+        if (! $resql)
4371
+        {
4372
+            $this->error=$this->db->lasterror();
4373
+            $this->db->rollback();
4374
+            return -1;
4375
+        }
4376
+        else
4377
+        {
4378
+            if (! $notrigger)
4379
+            {
4380
+                $result=$this->call_trigger(strtoupper($element).'_DELETE_RESOURCE', $user);
4381
+                if ($result < 0) { $this->db->rollback(); return -1; }
4382
+            }
4383
+            $this->db->commit();
4384
+            return 1;
4385
+        }
4386
+    }
4387
+
4388
+
4389
+    /**
4390
+     * Overwrite magic function to solve problem of cloning object that are kept as references
4391
+     *
4392
+     * @return void
4393
+     */
4394
+    function __clone()
4395
+    {
4396
+        // Force a copy of this->lines, otherwise it will point to same object.
4397
+        if (isset($this->lines) && is_array($this->lines))
4398
+        {
4399
+            $nboflines=count($this->lines);
4400
+            for($i=0; $i < $nboflines; $i++)
4401
+            {
4402
+                $this->lines[$i] = clone $this->lines[$i];
4403
+            }
4404
+        }
4405
+    }
4406
+
4407
+    /**
4408
+     * Common function for all objects extending CommonObject for generating documents
4409
+     *
4410
+     * @param 	string 		$modelspath 	Relative folder where generators are placed
4411
+     * @param 	string 		$modele 		Generator to use. Caller must set it to obj->modelpdf or GETPOST('modelpdf') for example.
4412
+     * @param 	Translate 	$outputlangs 	Output language to use
4413
+     * @param 	int 		$hidedetails 	1 to hide details. 0 by default
4414
+     * @param 	int 		$hidedesc 		1 to hide product description. 0 by default
4415
+     * @param 	int 		$hideref 		1 to hide product reference. 0 by default
4416
+     * @param   null|array  $moreparams     Array to provide more information
4417
+     * @return 	int 						>0 if OK, <0 if KO
4418
+     * @see	addFileIntoDatabaseIndex
4419
+     */
4420
+    protected function commonGenerateDocument($modelspath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams=null)
4421
+    {
4422
+        global $conf, $langs, $user;
4423
+
4424
+        $srctemplatepath='';
4425
+
4426
+        // Increase limit for PDF build
4427
+        $err=error_reporting();
4428
+        error_reporting(0);
4429
+        @set_time_limit(120);
4430
+        error_reporting($err);
4431
+
4432
+        // If selected model is a filename template (then $modele="modelname" or "modelname:filename")
4433
+        $tmp=explode(':',$modele,2);
4434
+        if (! empty($tmp[1]))
4435
+        {
4436
+            $modele=$tmp[0];
4437
+            $srctemplatepath=$tmp[1];
4438
+        }
4439
+
4440
+        // Search template files
4441
+        $file=''; $classname=''; $filefound=0;
4442
+        $dirmodels=array('/');
4443
+        if (is_array($conf->modules_parts['models'])) $dirmodels=array_merge($dirmodels,$conf->modules_parts['models']);
4444
+        foreach($dirmodels as $reldir)
4445
+        {
4446
+            foreach(array('doc','pdf') as $prefix)
4447
+            {
4448
+                if (in_array(get_class($this), array('Adherent'))) $file = $prefix."_".$modele.".class.php";     // Member module use prefix_module.class.php
4449
+                else $file = $prefix."_".$modele.".modules.php";
4450
+
4451
+                // On verifie l'emplacement du modele
4452
+                $file=dol_buildpath($reldir.$modelspath.$file,0);
4453
+                if (file_exists($file))
4454
+                {
4455
+                    $filefound=1;
4456
+                    $classname=$prefix.'_'.$modele;
4457
+                    break;
4458
+                }
4459
+            }
4460
+            if ($filefound) break;
4461
+        }
4462
+
4463
+        // If generator was found
4464
+        if ($filefound)
4465
+        {
4466
+            global $db;  // Required to solve a conception default in commonstickergenerator.class.php making an include of code using $db
4467
+
4468
+            require_once $file;
4469
+
4470
+            $obj = new $classname($this->db);
4471
+
4472
+            // If generator is ODT, we must have srctemplatepath defined, if not we set it.
4473
+            if ($obj->type == 'odt' && empty($srctemplatepath))
4474
+            {
4475
+                $varfortemplatedir=$obj->scandir;
4476
+                if ($varfortemplatedir && ! empty($conf->global->$varfortemplatedir))
4477
+                {
4478
+                    $dirtoscan=$conf->global->$varfortemplatedir;
4479
+
4480
+                    $listoffiles=array();
4481
+
4482
+                    // Now we add first model found in directories scanned
4483
+                    $listofdir=explode(',',$dirtoscan);
4484
+                    foreach($listofdir as $key => $tmpdir)
4485
+                    {
4486
+                        $tmpdir=trim($tmpdir);
4487
+                        $tmpdir=preg_replace('/DOL_DATA_ROOT/',DOL_DATA_ROOT,$tmpdir);
4488
+                        if (! $tmpdir) { unset($listofdir[$key]); continue; }
4489
+                        if (is_dir($tmpdir))
4490
+                        {
4491
+                            $tmpfiles=dol_dir_list($tmpdir,'files',0,'\.od(s|t)$','','name',SORT_ASC,0);
4492
+                            if (count($tmpfiles)) $listoffiles=array_merge($listoffiles,$tmpfiles);
4493
+                        }
4494
+                    }
4495
+
4496
+                    if (count($listoffiles))
4497
+                    {
4498
+                        foreach($listoffiles as $record)
4499
+                        {
4500
+                            $srctemplatepath=$record['fullname'];
4501
+                            break;
4502
+                        }
4503
+                    }
4504
+                }
4505
+
4506
+                if (empty($srctemplatepath))
4507
+                {
4508
+                    $this->error='ErrorGenerationAskedForOdtTemplateWithSrcFileNotDefined';
4509
+                    return -1;
4510
+                }
4511
+            }
4512
+
4513
+            if ($obj->type == 'odt' && ! empty($srctemplatepath))
4514
+            {
4515
+                if (! dol_is_file($srctemplatepath))
4516
+                {
4517
+                    $this->error='ErrorGenerationAskedForOdtTemplateWithSrcFileNotFound';
4518
+                    return -1;
4519
+                }
4520
+            }
4521
+
4522
+            // We save charset_output to restore it because write_file can change it if needed for
4523
+            // output format that does not support UTF8.
4524
+            $sav_charset_output=$outputlangs->charset_output;
4525
+
4526
+            if (in_array(get_class($this), array('Adherent')))
4527
+            {
4528
+                $arrayofrecords = array();   // The write_file of templates of adherent class need this var
4529
+                $resultwritefile = $obj->write_file($this, $outputlangs, $srctemplatepath, 'member', 1, $moreparams);
4530
+            }
4531
+            else
4532
+            {
4533
+                $resultwritefile = $obj->write_file($this, $outputlangs, $srctemplatepath, $hidedetails, $hidedesc, $hideref, $moreparams);
4534
+            }
4535
+            // After call of write_file $obj->result['fullpath'] is set with generated file. It will be used to update the ECM database index.
4536
+
4537
+            if ($resultwritefile > 0)
4538
+            {
4539
+                $outputlangs->charset_output=$sav_charset_output;
4540
+
4541
+                // We delete old preview
4542
+                require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
4543
+                dol_delete_preview($this);
4544
+
4545
+                // Index file in database
4546
+                if (! empty($obj->result['fullpath']))
4547
+                {
4548
+                    $destfull = $obj->result['fullpath'];
4549
+                    $upload_dir = dirname($destfull);
4550
+                    $destfile = basename($destfull);
4551
+                    $rel_dir = preg_replace('/^'.preg_quote(DOL_DATA_ROOT,'/').'/', '', $upload_dir);
4552
+
4553
+                    if (! preg_match('/[\\/]temp[\\/]|[\\/]thumbs|\.meta$/', $rel_dir))     // If not a tmp dir
4554
+                    {
4555
+                        $filename = basename($destfile);
4556
+                        $rel_dir = preg_replace('/[\\/]$/', '', $rel_dir);
4557
+                        $rel_dir = preg_replace('/^[\\/]/', '', $rel_dir);
4558
+
4559
+                        include_once DOL_DOCUMENT_ROOT.'/ecm/class/ecmfiles.class.php';
4560
+                        $ecmfile=new EcmFiles($this->db);
4561
+                        $result = $ecmfile->fetch(0, '', ($rel_dir?$rel_dir.'/':'').$filename);
4562
+
4563
+                        // Set the public "share" key
4564
+                        $setsharekey = false;
4565
+                        if ($this->element == 'propal')
4566
+                        {
4567
+                            $useonlinesignature = $conf->global->MAIN_FEATURES_LEVEL;	// Replace this with 1 when feature to make online signature is ok
4568
+                            if ($useonlinesignature) $setsharekey=true;
4569
+                            if (! empty($conf->global->PROPOSAL_ALLOW_EXTERNAL_DOWNLOAD)) $setsharekey=true;
4570
+                        }
4571
+                        if ($this->element == 'commande'     && ! empty($conf->global->ORDER_ALLOW_EXTERNAL_DOWNLOAD))        $setsharekey=true;
4572
+                        if ($this->element == 'facture'      && ! empty($conf->global->INVOICE_ALLOW_EXTERNAL_DOWNLOAD))      $setsharekey=true;
4573
+                        if ($this->element == 'bank_account' && ! empty($conf->global->BANK_ACCOUNT_ALLOW_EXTERNAL_DOWNLOAD)) $setsharekey=true;
4574
+
4575
+                        if ($setsharekey)
4576
+                        {
4577
+                            if (empty($ecmfile->share))	// Because object not found or share not set yet
4578
+                            {
4579
+                                require_once DOL_DOCUMENT_ROOT.'/core/lib/security2.lib.php';
4580
+                                $ecmfile->share = getRandomPassword(true);
4581
+                            }
4582
+                        }
4583
+
4584
+                        if ($result > 0)
4585
+                        {
4586
+                            $ecmfile->label = md5_file(dol_osencode($destfull));	// hash of file content
4587
+                            $ecmfile->fullpath_orig = '';
4588
+                            $ecmfile->gen_or_uploaded = 'generated';
4589
+                            $ecmfile->description = '';    // indexed content
4590
+                            $ecmfile->keyword = '';        // keyword content
4591
+                            $result = $ecmfile->update($user);
4592
+                            if ($result < 0)
4593
+                            {
4594
+                                setEventMessages($ecmfile->error, $ecmfile->errors, 'warnings');
4595
+                            }
4596
+                        }
4597
+                        else
4598
+                        {
4599
+                            $ecmfile->entity = $conf->entity;
4600
+                            $ecmfile->filepath = $rel_dir;
4601
+                            $ecmfile->filename = $filename;
4602
+                            $ecmfile->label = md5_file(dol_osencode($destfull));	// hash of file content
4603
+                            $ecmfile->fullpath_orig = '';
4604
+                            $ecmfile->gen_or_uploaded = 'generated';
4605
+                            $ecmfile->description = '';    // indexed content
4606
+                            $ecmfile->keyword = '';        // keyword content
4607
+                            $ecmfile->src_object_type = $this->table_element;
4608
+                            $ecmfile->src_object_id   = $this->id;
4609
+
4610
+                            $result = $ecmfile->create($user);
4611
+                            if ($result < 0)
4612
+                            {
4613
+                                setEventMessages($ecmfile->error, $ecmfile->errors, 'warnings');
4614
+                            }
4615
+                        }
4616
+
4617
+                        /*$this->result['fullname']=$destfull;
4618
+						$this->result['filepath']=$ecmfile->filepath;
4619
+						$this->result['filename']=$ecmfile->filename;*/
4620
+                        //var_dump($obj->update_main_doc_field);exit;
4621
+
4622
+                        // Update the last_main_doc field into main object (if documenent generator has property ->update_main_doc_field set)
4623
+                        $update_main_doc_field=0;
4624
+                        if (! empty($obj->update_main_doc_field)) $update_main_doc_field=1;
4625
+                        if ($update_main_doc_field && ! empty($this->table_element))
4626
+                        {
4627
+                            $sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element." SET last_main_doc = '".($ecmfile->filepath.'/'.$ecmfile->filename)."'";
4628
+                            $sql.= ' WHERE rowid = '.$this->id;
4629
+                            $resql = $this->db->query($sql);
4630
+                            if (! $resql) dol_print_error($this->db);
4631
+                        }
4632
+                    }
4633
+                }
4634
+                else
4635
+                {
4636
+                    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);
4637
+                }
4638
+
4639
+                // Success in building document. We build meta file.
4640
+                dol_meta_create($this);
4641
+
4642
+                return 1;
4643
+            }
4644
+            else
4645
+            {
4646
+                $outputlangs->charset_output=$sav_charset_output;
4647
+                dol_print_error($this->db, "Error generating document for ".__CLASS__.". Error: ".$obj->error, $obj->errors);
4648
+                return -1;
4649
+            }
4650
+        }
4651
+        else
4652
+        {
4653
+            $this->error=$langs->trans("Error")." ".$langs->trans("ErrorFileDoesNotExists",$file);
4654
+            dol_print_error('',$this->error);
4655
+            return -1;
4656
+        }
4657
+    }
4658
+
4659
+    /**
4660
+     *  Build thumb
4661
+     *  @TODO Move this into files.lib.php
4662
+     *
4663
+     *  @param      string	$file           Path file in UTF8 to original file to create thumbs from.
4664
+     *	@return		void
4665
+     */
4666
+    function addThumbs($file)
4667
+    {
4668
+        global $maxwidthsmall, $maxheightsmall, $maxwidthmini, $maxheightmini, $quality;
4669
+
4670
+        require_once DOL_DOCUMENT_ROOT .'/core/lib/images.lib.php';		// This define also $maxwidthsmall, $quality, ...
4671
+
4672
+        $file_osencoded=dol_osencode($file);
4673
+        if (file_exists($file_osencoded))
4674
+        {
4675
+            // Create small thumbs for company (Ratio is near 16/9)
4676
+            // Used on logon for example
4677
+            vignette($file_osencoded, $maxwidthsmall, $maxheightsmall, '_small', $quality);
4678
+
4679
+            // Create mini thumbs for company (Ratio is near 16/9)
4680
+            // Used on menu or for setup page for example
4681
+            vignette($file_osencoded, $maxwidthmini, $maxheightmini, '_mini', $quality);
4682
+        }
4683
+    }
4684
+
4685
+
4686
+    /* Functions common to commonobject and commonobjectline */
4687
+
4688
+    /* For default values */
4689
+
4690
+    /**
4691
+     * Return the default value to use for a field when showing the create form of object.
4692
+     * Return values in this order:
4693
+     * 1) If parameter is available into POST, we return it first.
4694
+     * 2) If not but an alternate value was provided as parameter of function, we return it.
4695
+     * 3) If not but a constant $conf->global->OBJECTELEMENT_FIELDNAME is set, we return it (It is better to use the dedicated table).
4696
+     * 4) Return value found into database (TODO No yet implemented)
4697
+     *
4698
+     * @param   string              $fieldname          Name of field
4699
+     * @param   string              $alternatevalue     Alternate value to use
4700
+     * @return  string|string[]                         Default value (can be an array if the GETPOST return an array)
4701
+     **/
4702
+    function getDefaultCreateValueFor($fieldname, $alternatevalue=null)
4703
+    {
4704
+        global $conf, $_POST;
4705
+
4706
+        // If param here has been posted, we use this value first.
4707
+        if (isset($_POST[$fieldname])) return GETPOST($fieldname, 2);
4708
+
4709
+        if (isset($alternatevalue)) return $alternatevalue;
4710
+
4711
+        $newelement=$this->element;
4712
+        if ($newelement == 'facture') $newelement='invoice';
4713
+        if ($newelement == 'commande') $newelement='order';
4714
+        if (empty($newelement))
4715
+        {
4716
+            dol_syslog("Ask a default value using common method getDefaultCreateValueForField on an object with no property ->element defined. Return empty string.", LOG_WARNING);
4717
+            return '';
4718
+        }
4719
+
4720
+        $keyforfieldname=strtoupper($newelement.'_DEFAULT_'.$fieldname);
4721
+        //var_dump($keyforfieldname);
4722
+        if (isset($conf->global->$keyforfieldname)) return $conf->global->$keyforfieldname;
4723
+
4724
+        // TODO Ad here a scan into table llx_overwrite_default with a filter on $this->element and $fieldname
4725
+    }
4726
+
4727
+
4728
+    /* For triggers */
4729
+
4730
+
4731
+    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
4732
+    /**
4733
+     * Call trigger based on this instance.
4734
+     * Some context information may also be provided into array property this->context.
4735
+     * NB:  Error from trigger are stacked in interface->errors
4736
+     * NB2: If return code of triggers are < 0, action calling trigger should cancel all transaction.
4737
+     *
4738
+     * @param   string    $trigger_name   trigger's name to execute
4739
+     * @param   User      $user           Object user
4740
+     * @return  int                       Result of run_triggers
4741
+     */
4742
+    function call_trigger($trigger_name, $user)
4743
+    {
4744
+        // phpcs:enable
4745
+        global $langs,$conf;
4746
+
4747
+        include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php';
4748
+        $interface=new Interfaces($this->db);
4749
+        $result=$interface->run_triggers($trigger_name,$this,$user,$langs,$conf);
4750
+
4751
+        if ($result < 0)
4752
+        {
4753
+            if (!empty($this->errors))
4754
+            {
4755
+                $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
+            }
4757
+            else
4758
+            {
4759
+                $this->errors=$interface->errors;
4760
+            }
4761
+        }
4762
+        return $result;
4763
+    }
4764
+
4765
+
4766
+    /* Functions for extrafields */
4767
+
4768
+
4769
+    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
4770
+    /**
4771
+     *  Function to get extra fields of an object into $this->array_options
4772
+     *  This method is in most cases called by method fetch of objects but you can call it separately.
4773
+     *
4774
+     *  @param	int		$rowid			Id of line. Use the id of object if not defined. Deprecated. Function must be called without parameters.
4775
+     *  @param  array	$optionsArray   Array resulting of call of extrafields->fetch_name_optionals_label(). Deprecated. Function must be called without parameters.
4776
+     *  @return	int						<0 if error, 0 if no values of extrafield to find nor found, 1 if an attribute is found and value loaded
4777
+     */
4778
+    function fetch_optionals($rowid=null, $optionsArray=null)
4779
+    {
4780
+        // phpcs:enable
4781
+        if (empty($rowid)) $rowid=$this->id;
4782
+
4783
+        // To avoid SQL errors. Probably not the better solution though
4784
+        if (!$this->table_element) {
4785
+            return 0;
4786
+        }
4787
+
4788
+        $this->array_options=array();
4789
+
4790
+        if (! is_array($optionsArray))
4791
+        {
4792
+            // If $extrafields is not a known object, we initialize it. Best practice is to have $extrafields defined into card.php or list.php page.
4793
+            // TODO Use of existing $extrafield is not yet ready (must mutualize code that use extrafields in form first)
4794
+            // global $extrafields;
4795
+            //if (! is_object($extrafields))
4796
+            //{
4797
+                require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
4798
+                $extrafields = new ExtraFields($this->db);
4799
+            //}
4800
+
4801
+            // Load array of extrafields for elementype = $this->table_element
4802
+            if (empty($extrafields->attributes[$this->table_element]['loaded']))
4803
+            {
4804
+                $extrafields->fetch_name_optionals_label($this->table_element);
4805
+            }
4806
+            $optionsArray = (! empty($extrafields->attributes[$this->table_element]['label'])?$extrafields->attributes[$this->table_element]['label']:null);
4807
+        }
4808
+        else
4809
+        {
4810
+            global $extrafields;
4811
+            dol_syslog("Warning: fetch_optionals was called with param optionsArray defined when you should pass null now", LOG_WARNING);
4812
+        }
4813
+
4814
+        $table_element = $this->table_element;
4815
+        if ($table_element == 'categorie') $table_element = 'categories'; // For compatibility
4816
+
4817
+        // Request to get complementary values
4818
+        if (is_array($optionsArray) && count($optionsArray) > 0)
4819
+        {
4820
+            $sql = "SELECT rowid";
4821
+            foreach ($optionsArray as $name => $label)
4822
+            {
4823
+                if (empty($extrafields->attributes[$this->table_element]['type'][$name]) || $extrafields->attributes[$this->table_element]['type'][$name] != 'separate')
4824
+                {
4825
+                    $sql.= ", ".$name;
4826
+                }
4827
+            }
4828
+            $sql.= " FROM ".MAIN_DB_PREFIX.$table_element."_extrafields";
4829
+            $sql.= " WHERE fk_object = ".$rowid;
4830
+
4831
+            //dol_syslog(get_class($this)."::fetch_optionals get extrafields data for ".$this->table_element, LOG_DEBUG);		// Too verbose
4832
+            $resql=$this->db->query($sql);
4833
+            if ($resql)
4834
+            {
4835
+                $this->array_options = array();
4836
+                $numrows=$this->db->num_rows($resql);
4837
+                if ($numrows)
4838
+                {
4839
+                    $tab = $this->db->fetch_array($resql);
4840
+
4841
+                    foreach ($tab as $key => $value)
4842
+                    {
4843
+                        // 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)
4844
+                        if ($key != 'rowid' && $key != 'tms' && $key != 'fk_member' && ! is_int($key))
4845
+                        {
4846
+                            // we can add this attribute to object
4847
+                            if (! empty($extrafields) && in_array($extrafields->attributes[$this->table_element]['type'][$key], array('date','datetime')))
4848
+                            {
4849
+                                //var_dump($extrafields->attributes[$this->table_element]['type'][$key]);
4850
+                                $this->array_options["options_".$key]=$this->db->jdate($value);
4851
+                            }
4852
+                            else
4853
+                            {
4854
+                                $this->array_options["options_".$key]=$value;
4855
+                            }
4856
+
4857
+                            //var_dump('key '.$key.' '.$value.' type='.$extrafields->attributes[$this->table_element]['type'][$key].' '.$this->array_options["options_".$key]);
4858
+                        }
4859
+                    }
4860
+                }
4861
+
4862
+                $this->db->free($resql);
4863
+
4864
+                if ($numrows) return $numrows;
4865
+                else return 0;
4866
+            }
4867
+            else
4868
+            {
4869
+                dol_print_error($this->db);
4870
+                return -1;
4871
+            }
4872
+        }
4873
+        return 0;
4874
+    }
4875
+
4876
+    /**
4877
+     *	Delete all extra fields values for the current object.
4878
+     *
4879
+     *  @return	int		<0 if KO, >0 if OK
4880
+     */
4881
+    function deleteExtraFields()
4882
+    {
4883
+        $this->db->begin();
4884
+
4885
+        $table_element = $this->table_element;
4886
+        if ($table_element == 'categorie') $table_element = 'categories'; // For compatibility
4887
+
4888
+        $sql_del = "DELETE FROM ".MAIN_DB_PREFIX.$table_element."_extrafields WHERE fk_object = ".$this->id;
4889
+        dol_syslog(get_class($this)."::deleteExtraFields delete", LOG_DEBUG);
4890
+        $resql=$this->db->query($sql_del);
4891
+        if (! $resql)
4892
+        {
4893
+            $this->error=$this->db->lasterror();
4894
+            $this->db->rollback();
4895
+            return -1;
4896
+        }
4897
+        else
4898
+        {
4899
+            $this->db->commit();
4900
+            return 1;
4901
+        }
4902
+    }
4903
+
4904
+    /**
4905
+     *	Add/Update all extra fields values for the current object.
4906
+     *  Data to describe values to insert/update are stored into $this->array_options=array('options_codeforfield1'=>'valueforfield1', 'options_codeforfield2'=>'valueforfield2', ...)
4907
+     *  This function delete record with all extrafields and insert them again from the array $this->array_options.
4908
+     *
4909
+     *  @param	string		$trigger		If defined, call also the trigger (for example COMPANY_MODIFY)
4910
+     *  @param	User		$userused		Object user
4911
+     *  @return int 						-1=error, O=did nothing, 1=OK
4912
+     *  @see updateExtraField, setValueFrom
4913
+     */
4914
+    function insertExtraFields($trigger='', $userused=null)
4915
+    {
4916
+        global $conf,$langs,$user;
4917
+
4918
+        if (empty($userused)) $userused=$user;
4919
+
4920
+        $error=0;
4921
+
4922
+        if (! empty($conf->global->MAIN_EXTRAFIELDS_DISABLED)) return 0;	// For avoid conflicts if trigger used
4923
+
4924
+        if (! empty($this->array_options))
4925
+        {
4926
+            // Check parameters
4927
+            $langs->load('admin');
4928
+            require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
4929
+            $extrafields = new ExtraFields($this->db);
4930
+            $target_extrafields=$extrafields->fetch_name_optionals_label($this->table_element);
4931
+
4932
+            //Eliminate copied source object extra_fields that do not exist in target object
4933
+            $new_array_options=array();
4934
+            foreach ($this->array_options as $key => $value) {
4935
+                if (in_array(substr($key,8), array_keys($target_extrafields)))	// We remove the 'options_' from $key for test
4936
+                    $new_array_options[$key] = $value;
4937
+                elseif (in_array($key, array_keys($target_extrafields)))		// We test on $key that does not contains the 'options_' prefix
4938
+                    $new_array_options['options_'.$key] = $value;
4939
+            }
4940
+
4941
+            foreach($new_array_options as $key => $value)
4942
+            {
4943
+                    $attributeKey      = substr($key,8);   // Remove 'options_' prefix
4944
+                    $attributeType     = $extrafields->attributes[$this->table_element]['type'][$attributeKey];
4945
+                    $attributeLabel    = $extrafields->attributes[$this->table_element]['label'][$attributeKey];
4946
+                    $attributeParam    = $extrafields->attributes[$this->table_element]['param'][$attributeKey];
4947
+                    $attributeRequired = $extrafields->attributes[$this->table_element]['required'][$attributeKey];
4948
+
4949
+                    if ($attributeRequired)
4950
+                    {
4951
+                        $mandatorypb=false;
4952
+                        if ($attributeType == 'link' && $this->array_options[$key] == '-1') $mandatorypb=true;
4953
+                        if ($this->array_options[$key] === '') $mandatorypb=true;
4954
+                        if ($mandatorypb)
4955
+                        {
4956
+                            dol_syslog($this->error);
4957
+                            $this->errors[]=$langs->trans('ErrorFieldRequired', $attributeLabel);
4958
+                            return -1;
4959
+                        }
4960
+                    }
4961
+
4962
+                //dol_syslog("attributeLabel=".$attributeLabel, LOG_DEBUG);
4963
+                //dol_syslog("attributeType=".$attributeType, LOG_DEBUG);
4964
+
4965
+                    switch ($attributeType)
4966
+                    {
4967
+                        case 'int':
4968
+                          if (!is_numeric($value) && $value!='')
4969
+                            {
4970
+                                $this->errors[]=$langs->trans("ExtraFieldHasWrongValue", $attributeLabel);
4971
+                                return -1;
4972
+                            }
4973
+                            elseif ($value=='')
4974
+                            {
4975
+                                $new_array_options[$key] = null;
4976
+                            }
4977
+                            break;
4978
+                    case 'double':
4979
+                        $value = price2num($value);
4980
+                        if (!is_numeric($value) && $value!='')
4981
+                        {
4982
+                            dol_syslog($langs->trans("ExtraFieldHasWrongValue")." sur ".$attributeLabel."(".$value."is not '".$attributeType."')", LOG_DEBUG);
4983
+                            $this->errors[]=$langs->trans("ExtraFieldHasWrongValue", $attributeLabel);
4984
+                            return -1;
4985
+                        }
4986
+                        elseif ($value=='')
4987
+                        {
4988
+                            $new_array_options[$key] = null;
4989
+                        }
4990
+                        //dol_syslog("double value"." sur ".$attributeLabel."(".$value." is '".$attributeType."')", LOG_DEBUG);
4991
+                        $new_array_options[$key] = $value;
4992
+                        break;
4993
+                        /*case 'select':	// Not required, we chosed value='0' for undefined values
4994
+             			if ($value=='-1')
4995
+             			{
4996
+             				$this->array_options[$key] = null;
4997
+             			}
4998
+             			break;*/
4999
+                        case 'password':
5000
+                           $algo='';
5001
+                            if ($this->array_options[$key] != '' && is_array($extrafields->attributes[$this->table_element]['param'][$attributeKey]['options']))
5002
+                            {
5003
+                                // If there is an encryption choice, we use it to crypt data before insert
5004
+                                $tmparrays = array_keys($extrafields->attributes[$this->table_element]['param'][$attributeKey]['options']);
5005
+                                $algo=reset($tmparrays);
5006
+                                if ($algo != '')
5007
+                                {
5008
+                                    //global $action;		// $action may be 'create', 'update', 'update_extras'...
5009
+                                    //var_dump($action);
5010
+                                    //var_dump($this->oldcopy);exit;
5011
+                                    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
5012
+                                    {
5013
+                                        //var_dump($this->oldcopy->array_options[$key]); var_dump($this->array_options[$key]);
5014
+                                        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.
5015
+                                        {
5016
+                                            $new_array_options[$key] = $this->array_options[$key];	// Value is kept
5017
+                                        }
5018
+                                    else
5019
+                                    {
5020
+                                        // var_dump($algo);
5021
+                                        $newvalue = dol_hash($this->array_options[$key], $algo);
5022
+                                        $new_array_options[$key] = $newvalue;
5023
+                                    }
5024
+                                    }
5025
+                                    else
5026
+                                    {
5027
+                                        $new_array_options[$key] = $this->array_options[$key];	// Value is kept
5028
+                                    }
5029
+                                }
5030
+                            }
5031
+                            else	// Common usage
5032
+                            {
5033
+                                $new_array_options[$key] = $this->array_options[$key];
5034
+                            }
5035
+                            break;
5036
+                        case 'price':
5037
+                        $new_array_options[$key] = price2num($this->array_options[$key]);
5038
+                        break;
5039
+                    case 'date':
5040
+                        $new_array_options[$key] = $this->db->idate($this->array_options[$key]);
5041
+                        break;
5042
+                    case 'datetime':
5043
+                        // If data is a string instead of a timestamp, we convert it
5044
+                        if (! is_int($this->array_options[$key])) {
5045
+                            $this->array_options[$key] = strtotime($this->array_options[$key]);
5046
+                        }
5047
+                        $new_array_options[$key] = $this->db->idate($this->array_options[$key]);
5048
+                        break;
5049
+                        case 'link':
5050
+                        $param_list=array_keys($attributeParam['options']);
5051
+                        // 0 : ObjectName
5052
+                        // 1 : classPath
5053
+                        $InfoFieldList = explode(":", $param_list[0]);
5054
+                        dol_include_once($InfoFieldList[1]);
5055
+                        if ($InfoFieldList[0] && class_exists($InfoFieldList[0]))
5056
+                        {
5057
+                            if ($value == '-1')	// -1 is key for no defined in combo list of objects
5058
+                            {
5059
+                                $new_array_options[$key]='';
5060
+                            }
5061
+                            elseif ($value)
5062
+                            {
5063
+                                $object = new $InfoFieldList[0]($this->db);
5064
+                                if (is_numeric($value)) $res=$object->fetch($value);
5065
+                                else $res=$object->fetch('',$value);
5066
+
5067
+                                if ($res > 0) $new_array_options[$key]=$object->id;
5068
+                                else
5069
+                                {
5070
+                                    $this->error="Id/Ref '".$value."' for object '".$object->element."' not found";
5071
+                                    $this->db->rollback();
5072
+                                    return -1;
5073
+                                }
5074
+                            }
5075
+                        }
5076
+                        else
5077
+                        {
5078
+                            dol_syslog('Error bad setup of extrafield', LOG_WARNING);
5079
+                        }
5080
+                        break;
5081
+                    }
5082
+            }
5083
+
5084
+            $this->db->begin();
5085
+
5086
+            $table_element = $this->table_element;
5087
+            if ($table_element == 'categorie') $table_element = 'categories'; // For compatibility
5088
+
5089
+            $sql_del = "DELETE FROM ".MAIN_DB_PREFIX.$table_element."_extrafields WHERE fk_object = ".$this->id;
5090
+            dol_syslog(get_class($this)."::insertExtraFields delete", LOG_DEBUG);
5091
+            $this->db->query($sql_del);
5092
+
5093
+            $sql = "INSERT INTO ".MAIN_DB_PREFIX.$table_element."_extrafields (fk_object";
5094
+            foreach($new_array_options as $key => $value)
5095
+            {
5096
+                $attributeKey = substr($key,8);   // Remove 'options_' prefix
5097
+                // Add field of attribut
5098
+                if ($extrafields->attributes[$this->table_element]['type'][$attributeKey] != 'separate') // Only for other type than separator
5099
+                    $sql.=",".$attributeKey;
5100
+            }
5101
+            $sql .= ") VALUES (".$this->id;
5102
+
5103
+            foreach($new_array_options as $key => $value)
5104
+            {
5105
+                $attributeKey = substr($key,8);   // Remove 'options_' prefix
5106
+                // Add field of attribute
5107
+                if ($extrafields->attributes[$this->table_element]['type'][$attributeKey] != 'separate') // Only for other type than separator)
5108
+                {
5109
+                    if ($new_array_options[$key] != '')
5110
+                    {
5111
+                        $sql.=",'".$this->db->escape($new_array_options[$key])."'";
5112
+                    }
5113
+                    else
5114
+                    {
5115
+                        $sql.=",null";
5116
+                    }
5117
+                }
5118
+            }
5119
+            $sql.=")";
5120
+
5121
+            dol_syslog(get_class($this)."::insertExtraFields insert", LOG_DEBUG);
5122
+            $resql = $this->db->query($sql);
5123
+            if (! $resql)
5124
+            {
5125
+                $this->error=$this->db->lasterror();
5126
+                $error++;
5127
+            }
5128
+
5129
+            if (! $error && $trigger)
5130
+            {
5131
+                // Call trigger
5132
+                $this->context=array('extrafieldaddupdate'=>1);
5133
+                $result=$this->call_trigger($trigger, $userused);
5134
+                if ($result < 0) $error++;
5135
+                // End call trigger
5136
+            }
5137
+
5138
+            if ($error)
5139
+            {
5140
+                $this->db->rollback();
5141
+                return -1;
5142
+            }
5143
+            else
5144
+            {
5145
+                $this->db->commit();
5146
+                return 1;
5147
+            }
5148
+        }
5149
+        else return 0;
5150
+    }
5151
+
5152
+    /**
5153
+     *	Update an extra field value for the current object.
5154
+     *  Data to describe values to update are stored into $this->array_options=array('options_codeforfield1'=>'valueforfield1', 'options_codeforfield2'=>'valueforfield2', ...)
5155
+     *
5156
+     *  @param  string      $key    		Key of the extrafield (without starting 'options_')
5157
+     *  @param	string		$trigger		If defined, call also the trigger (for example COMPANY_MODIFY)
5158
+     *  @param	User		$userused		Object user
5159
+     *  @return int                 		-1=error, O=did nothing, 1=OK
5160
+     *  @see setValueFrom, insertExtraFields
5161
+     */
5162
+    function updateExtraField($key, $trigger=null, $userused=null)
5163
+    {
5164
+        global $conf,$langs,$user;
5165
+
5166
+        if (empty($userused)) $userused=$user;
5167
+
5168
+        $error=0;
5169
+
5170
+        if (! empty($conf->global->MAIN_EXTRAFIELDS_DISABLED)) return 0;	// For avoid conflicts if trigger used
5171
+
5172
+        if (! empty($this->array_options) && isset($this->array_options["options_".$key]))
5173
+        {
5174
+            // Check parameters
5175
+            $langs->load('admin');
5176
+            require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
5177
+            $extrafields = new ExtraFields($this->db);
5178
+            $target_extrafields=$extrafields->fetch_name_optionals_label($this->table_element);
5179
+
5180
+            $value=$this->array_options["options_".$key];
5181
+
5182
+            $attributeType     = $extrafields->attributes[$this->table_element]['type'][$key];
5183
+            $attributeLabel    = $extrafields->attributes[$this->table_element]['label'][$key];
5184
+            $attributeParam    = $extrafields->attributes[$this->table_element]['param'][$key];
5185
+            $attributeRequired = $extrafields->attributes[$this->table_element]['required'][$key];
5186
+
5187
+            //dol_syslog("attributeLabel=".$attributeLabel, LOG_DEBUG);
5188
+            //dol_syslog("attributeType=".$attributeType, LOG_DEBUG);
5189
+
5190
+            switch ($attributeType)
5191
+            {
5192
+                case 'int':
5193
+                    if (!is_numeric($value) && $value!='')
5194
+                    {
5195
+                        $this->errors[]=$langs->trans("ExtraFieldHasWrongValue",$attributeLabel);
5196
+                        return -1;
5197
+                    }
5198
+                    elseif ($value=='')
5199
+                    {
5200
+                        $this->array_options["options_".$key] = null;
5201
+                    }
5202
+                    break;
5203
+                case 'double':
5204
+                    $value = price2num($value);
5205
+                    if (!is_numeric($value) && $value!='')
5206
+                    {
5207
+                        dol_syslog($langs->trans("ExtraFieldHasWrongValue")." sur ".$attributeLabel."(".$value."is not '".$attributeType."')", LOG_DEBUG);
5208
+                        $this->errors[]=$langs->trans("ExtraFieldHasWrongValue", $attributeLabel);
5209
+                        return -1;
5210
+                    }
5211
+                    elseif ($value=='')
5212
+                    {
5213
+                        $this->array_options["options_".$key] = null;
5214
+                    }
5215
+                    //dol_syslog("double value"." sur ".$attributeLabel."(".$value." is '".$attributeType."')", LOG_DEBUG);
5216
+                    $this->array_options["options_".$key] = $value;
5217
+                    break;
5218
+                    /*case 'select':	// Not required, we chosed value='0' for undefined values
5219
+             		if ($value=='-1')
5220
+             		{
5221
+             			$this->array_options[$key] = null;
5222
+             		}
5223
+             		break;*/
5224
+                case 'price':
5225
+                    $this->array_options["options_".$key] = price2num($this->array_options["options_".$key]);
5226
+                    break;
5227
+                case 'date':
5228
+                    $this->array_options["options_".$key]=$this->db->idate($this->array_options["options_".$key]);
5229
+                    break;
5230
+                case 'datetime':
5231
+                    $this->array_options["options_".$key]=$this->db->idate($this->array_options["options_".$key]);
5232
+                    break;
5233
+                case 'link':
5234
+                    $param_list=array_keys($attributeParam['options']);
5235
+                    // 0 : ObjectName
5236
+                    // 1 : classPath
5237
+                    $InfoFieldList = explode(":", $param_list[0]);
5238
+                    dol_include_once($InfoFieldList[1]);
5239
+                    if ($value)
5240
+                    {
5241
+                        $object = new $InfoFieldList[0]($this->db);
5242
+                        $object->fetch(0,$value);
5243
+                        $this->array_options["options_".$key]=$object->id;
5244
+                    }
5245
+                    break;
5246
+            }
5247
+
5248
+            $this->db->begin();
5249
+            $sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element."_extrafields SET ".$key."='".$this->db->escape($this->array_options["options_".$key])."'";
5250
+            $sql .= " WHERE fk_object = ".$this->id;
5251
+            $resql = $this->db->query($sql);
5252
+            if (! $resql)
5253
+            {
5254
+                $error++;
5255
+                $this->error=$this->db->lasterror();
5256
+            }
5257
+
5258
+            if (! $error && $trigger)
5259
+            {
5260
+                // Call trigger
5261
+                $this->context=array('extrafieldupdate'=>1);
5262
+                $result=$this->call_trigger($trigger, $userused);
5263
+                if ($result < 0) $error++;
5264
+                // End call trigger
5265
+            }
5266
+
5267
+            if ($error)
5268
+            {
5269
+                dol_syslog(get_class($this) . "::".__METHOD__ . $this->error, LOG_ERR);
5270
+                $this->db->rollback();
5271
+                return -1;
5272
+            }
5273
+            else
5274
+            {
5275
+                $this->db->commit();
5276
+                return 1;
5277
+            }
5278
+        }
5279
+        else return 0;
5280
+    }
5281
+
5282
+
5283
+    /**
5284
+     * Return HTML string to put an input field into a page
5285
+     * Code very similar with showInputField of extra fields
5286
+     *
5287
+     * @param  array   		$val	       Array of properties for field to show
5288
+     * @param  string  		$key           Key of attribute
5289
+     * @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)
5290
+     * @param  string  		$moreparam     To add more parameters on html input tag
5291
+     * @param  string  		$keysuffix     Prefix string to add into name and id of field (can be used to avoid duplicate names)
5292
+     * @param  string  		$keyprefix     Suffix string to add into name and id of field (can be used to avoid duplicate names)
5293
+     * @param  string|int		$morecss       Value for css to define style/length of field. May also be a numeric.
5294
+     * @return string
5295
+     */
5296
+    function showInputField($val, $key, $value, $moreparam='', $keysuffix='', $keyprefix='', $morecss=0)
5297
+    {
5298
+        global $conf,$langs,$form;
5299
+
5300
+        if (! is_object($form))
5301
+        {
5302
+            require_once DOL_DOCUMENT_ROOT.'/core/class/html.form.class.php';
5303
+            $form=new Form($this->db);
5304
+        }
5305
+
5306
+        $val=$this->fields[$key];
5307
+
5308
+        $out='';
5309
+        $type='';
5310
+        $param = array();
5311
+        $param['options']=array();
5312
+        $size =$this->fields[$key]['size'];
5313
+        // Because we work on extrafields
5314
+        if(preg_match('/^integer:(.*):(.*)/i', $val['type'], $reg)){
5315
+            $param['options']=array($reg[1].':'.$reg[2]=>'N');
5316
+            $type ='link';
5317
+        } elseif(preg_match('/^link:(.*):(.*)/i', $val['type'], $reg)) {
5318
+            $param['options']=array($reg[1].':'.$reg[2]=>'N');
5319
+            $type ='link';
5320
+        } elseif(preg_match('/^sellist:(.*):(.*):(.*):(.*)/i', $val['type'], $reg)) {
5321
+            $param['options']=array($reg[1].':'.$reg[2].':'.$reg[3].':'.$reg[4]=>'N');
5322
+            $type ='sellist';
5323
+        } elseif(preg_match('/varchar\((\d+)\)/', $val['type'],$reg)) {
5324
+            $param['options']=array();
5325
+            $type ='varchar';
5326
+            $size=$reg[1];
5327
+        } elseif(preg_match('/varchar/', $val['type'])) {
5328
+            $param['options']=array();
5329
+            $type ='varchar';
5330
+        } elseif(is_array($this->fields[$key]['arrayofkeyval'])) {
5331
+            $param['options']=$this->fields[$key]['arrayofkeyval'];
5332
+            $type ='select';
5333
+        } else {
5334
+            $param['options']=array();
5335
+            $type =$this->fields[$key]['type'];
5336
+        }
5337
+
5338
+        $label=$this->fields[$key]['label'];
5339
+        //$elementtype=$this->fields[$key]['elementtype'];	// Seems not used
5340
+        $default=$this->fields[$key]['default'];
5341
+        $computed=$this->fields[$key]['computed'];
5342
+        $unique=$this->fields[$key]['unique'];
5343
+        $required=$this->fields[$key]['required'];
5344
+
5345
+        $langfile=$this->fields[$key]['langfile'];
5346
+        $list=$this->fields[$key]['list'];
5347
+        $hidden=abs($this->fields[$key]['visible'])!=1?1:0;
5348
+
5349
+        $objectid = $this->id;
5350
+
5351
+
5352
+        if ($computed)
5353
+        {
5354
+            if (! preg_match('/^search_/', $keyprefix)) return '<span class="opacitymedium">'.$langs->trans("AutomaticallyCalculated").'</span>';
5355
+            else return '';
5356
+        }
5357
+
5358
+
5359
+        // Use in priority showsize from parameters, then $val['css'] then autodefine
5360
+        if (empty($morecss) && ! empty($val['css']))
5361
+        {
5362
+            $showsize = $val['css'];
5363
+        }
5364
+        if (empty($morecss))
5365
+        {
5366
+            if ($type == 'date')
5367
+            {
5368
+                $morecss = 'minwidth100imp';
5369
+            }
5370
+            elseif ($type == 'datetime')
5371
+            {
5372
+                $morecss = 'minwidth200imp';
5373
+            }
5374
+            elseif (in_array($type,array('int','integer','price')) || preg_match('/^double(\([0-9],[0-9]\)){0,1}/',$type))
5375
+            {
5376
+                $morecss = 'maxwidth75';
5377
+                        }elseif ($type == 'url')
5378
+            {
5379
+                $morecss='minwidth400';
5380
+            }
5381
+            elseif ($type == 'boolean')
5382
+            {
5383
+                $morecss='';
5384
+            }
5385
+            else
5386
+            {
5387
+                if (round($size) < 12)
5388
+                {
5389
+                    $morecss = 'minwidth100';
5390
+                }
5391
+                else if (round($size) <= 48)
5392
+                {
5393
+                    $morecss = 'minwidth200';
5394
+                }
5395
+                else
5396
+                {
5397
+                    $morecss = 'minwidth400';
5398
+                }
5399
+            }
5400
+        }
5401
+
5402
+        if (in_array($type,array('date','datetime')))
5403
+        {
5404
+            $tmp=explode(',',$size);
5405
+            $newsize=$tmp[0];
5406
+
5407
+            $showtime = in_array($type,array('datetime')) ? 1 : 0;
5408
+
5409
+            // Do not show current date when field not required (see selectDate() method)
5410
+            if (!$required && $value == '') $value = '-1';
5411
+
5412
+            // TODO Must also support $moreparam
5413
+            $out = $form->selectDate($value, $keyprefix.$key.$keysuffix, $showtime, $showtime, $required, '', 1, (($keyprefix != 'search_' && $keyprefix != 'search_options_') ? 1 : 0), 0, 1);
5414
+        }
5415
+        elseif (in_array($type,array('int','integer')))
5416
+        {
5417
+            $tmp=explode(',',$size);
5418
+            $newsize=$tmp[0];
5419
+            $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:'').'>';
5420
+        }
5421
+        elseif (preg_match('/varchar/', $type))
5422
+        {
5423
+            $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
+        }
5425
+        elseif (in_array($type, array('mail', 'phone', 'url')))
5426
+        {
5427
+            $out='<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" value="'.dol_escape_htmltag($value).'" '.($moreparam?$moreparam:'').'>';
5428
+        }
5429
+        elseif ($type == 'text')
5430
+        {
5431
+            if (! preg_match('/search_/', $keyprefix))		// If keyprefix is search_ or search_options_, we must just use a simple text field
5432
+            {
5433
+                require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
5434
+                $doleditor=new DolEditor($keyprefix.$key.$keysuffix,$value,'',200,'dolibarr_notes','In',false,false,false,ROWS_5,'90%');
5435
+                $out=$doleditor->Create(1);
5436
+            }
5437
+            else
5438
+            {
5439
+                $out='<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" value="'.dol_escape_htmltag($value).'" '.($moreparam?$moreparam:'').'>';
5440
+            }
5441
+        }
5442
+        elseif ($type == 'html')
5443
+        {
5444
+            if (! preg_match('/search_/', $keyprefix))		// If keyprefix is search_ or search_options_, we must just use a simple text field
5445
+            {
5446
+                require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
5447
+                $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%');
5448
+                $out=$doleditor->Create(1);
5449
+            }
5450
+            else
5451
+            {
5452
+                $out='<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" value="'.dol_escape_htmltag($value).'" '.($moreparam?$moreparam:'').'>';
5453
+            }
5454
+        }
5455
+        elseif ($type == 'boolean')
5456
+        {
5457
+            $checked='';
5458
+            if (!empty($value)) {
5459
+                $checked=' checked value="1" ';
5460
+            } else {
5461
+                $checked=' value="1" ';
5462
+            }
5463
+            $out='<input type="checkbox" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" '.$checked.' '.($moreparam?$moreparam:'').'>';
5464
+        }
5465
+        elseif ($type == 'price')
5466
+        {
5467
+            if (!empty($value)) {		// $value in memory is a php numeric, we format it into user number format.
5468
+                $value=price($value);
5469
+            }
5470
+            $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
+        }
5472
+        elseif (preg_match('/^double(\([0-9],[0-9]\)){0,1}/',$type))
5473
+        {
5474
+            if (!empty($value)) {		// $value in memory is a php numeric, we format it into user number format.
5475
+                $value=price($value);
5476
+            }
5477
+            $out='<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" value="'.$value.'" '.($moreparam?$moreparam:'').'> ';
5478
+        }
5479
+        elseif ($type == 'select')
5480
+        {
5481
+            $out = '';
5482
+            if (! empty($conf->use_javascript_ajax) && ! empty($conf->global->MAIN_EXTRAFIELDS_USE_SELECT2))
5483
+            {
5484
+                include_once DOL_DOCUMENT_ROOT . '/core/lib/ajax.lib.php';
5485
+                $out.= ajax_combobox($keyprefix.$key.$keysuffix, array(), 0);
5486
+            }
5487
+
5488
+            $out.='<select class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" '.($moreparam?$moreparam:'').'>';
5489
+                if((! isset($this->fields[$key]['default'])) ||($this->fields[$key]['notnull']!=1))$out.='<option value="0">&nbsp;</option>';
5490
+            foreach ($param['options'] as $key => $val)
5491
+            {
5492
+                if ((string) $key == '') continue;
5493
+                list($val, $parent) = explode('|', $val);
5494
+                $out.='<option value="'.$key.'"';
5495
+                $out.= (((string) $value == (string) $key)?' selected':'');
5496
+                $out.= (!empty($parent)?' parent="'.$parent.'"':'');
5497
+                $out.='>'.$val.'</option>';
5498
+            }
5499
+            $out.='</select>';
5500
+        }
5501
+        elseif ($type == 'sellist')
5502
+        {
5503
+            $out = '';
5504
+            if (! empty($conf->use_javascript_ajax) && ! empty($conf->global->MAIN_EXTRAFIELDS_USE_SELECT2))
5505
+            {
5506
+                include_once DOL_DOCUMENT_ROOT . '/core/lib/ajax.lib.php';
5507
+                $out.= ajax_combobox($keyprefix.$key.$keysuffix, array(), 0);
5508
+            }
5509
+
5510
+            $out.='<select class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" '.($moreparam?$moreparam:'').'>';
5511
+            if (is_array($param['options']))
5512
+            {
5513
+                $param_list=array_keys($param['options']);
5514
+                $InfoFieldList = explode(":", $param_list[0]);
5515
+                $parentName='';
5516
+                $parentField='';
5517
+                // 0 : tableName
5518
+                // 1 : label field name
5519
+                // 2 : key fields name (if differ of rowid)
5520
+                // 3 : key field parent (for dependent lists)
5521
+                // 4 : where clause filter on column or table extrafield, syntax field='value' or extra.field=value
5522
+                $keyList=(empty($InfoFieldList[2])?'rowid':$InfoFieldList[2].' as rowid');
5523
+
5524
+
5525
+                if (count($InfoFieldList) > 4 && ! empty($InfoFieldList[4]))
5526
+                {
5527
+                    if (strpos($InfoFieldList[4], 'extra.') !== false)
5528
+                    {
5529
+                        $keyList='main.'.$InfoFieldList[2].' as rowid';
5530
+                    } else {
5531
+                        $keyList=$InfoFieldList[2].' as rowid';
5532
+                    }
5533
+                }
5534
+                if (count($InfoFieldList) > 3 && ! empty($InfoFieldList[3]))
5535
+                {
5536
+                    list($parentName, $parentField) = explode('|', $InfoFieldList[3]);
5537
+                    $keyList.= ', '.$parentField;
5538
+                }
5539
+
5540
+                $fields_label = explode('|',$InfoFieldList[1]);
5541
+                if (is_array($fields_label))
5542
+                {
5543
+                    $keyList .=', ';
5544
+                    $keyList .= implode(', ', $fields_label);
5545
+                }
5546
+
5547
+                $sqlwhere='';
5548
+                $sql = 'SELECT '.$keyList;
5549
+                $sql.= ' FROM '.MAIN_DB_PREFIX .$InfoFieldList[0];
5550
+                if (!empty($InfoFieldList[4]))
5551
+                {
5552
+                    // can use SELECT request
5553
+                    if (strpos($InfoFieldList[4], '$SEL$')!==false) {
5554
+                        $InfoFieldList[4]=str_replace('$SEL$','SELECT',$InfoFieldList[4]);
5555
+                    }
5556
+
5557
+                    // current object id can be use into filter
5558
+                    if (strpos($InfoFieldList[4], '$ID$')!==false && !empty($objectid)) {
5559
+                        $InfoFieldList[4]=str_replace('$ID$',$objectid,$InfoFieldList[4]);
5560
+                    } else {
5561
+                        $InfoFieldList[4]=str_replace('$ID$','0',$InfoFieldList[4]);
5562
+                    }
5563
+                    //We have to join on extrafield table
5564
+                    if (strpos($InfoFieldList[4], 'extra')!==false)
5565
+                    {
5566
+                        $sql.= ' as main, '.MAIN_DB_PREFIX .$InfoFieldList[0].'_extrafields as extra';
5567
+                        $sqlwhere.= ' WHERE extra.fk_object=main.'.$InfoFieldList[2]. ' AND '.$InfoFieldList[4];
5568
+                    }
5569
+                    else
5570
+                    {
5571
+                        $sqlwhere.= ' WHERE '.$InfoFieldList[4];
5572
+                    }
5573
+                }
5574
+                else
5575
+                {
5576
+                    $sqlwhere.= ' WHERE 1=1';
5577
+                }
5578
+                // Some tables may have field, some other not. For the moment we disable it.
5579
+                if (in_array($InfoFieldList[0],array('tablewithentity')))
5580
+                {
5581
+                    $sqlwhere.= ' AND entity = '.$conf->entity;
5582
+                }
5583
+                $sql.=$sqlwhere;
5584
+                //print $sql;
5585
+
5586
+                $sql .= ' ORDER BY ' . implode(', ', $fields_label);
5587
+
5588
+                dol_syslog(get_class($this).'::showInputField type=sellist', LOG_DEBUG);
5589
+                $resql = $this->db->query($sql);
5590
+                if ($resql)
5591
+                {
5592
+                    $out.='<option value="0">&nbsp;</option>';
5593
+                    $num = $this->db->num_rows($resql);
5594
+                    $i = 0;
5595
+                    while ($i < $num)
5596
+                    {
5597
+                        $labeltoshow='';
5598
+                        $obj = $this->db->fetch_object($resql);
5599
+
5600
+                        // Several field into label (eq table:code|libelle:rowid)
5601
+                        $notrans = false;
5602
+                        $fields_label = explode('|',$InfoFieldList[1]);
5603
+                        if (is_array($fields_label))
5604
+                        {
5605
+                            $notrans = true;
5606
+                            foreach ($fields_label as $field_toshow)
5607
+                            {
5608
+                                $labeltoshow.= $obj->$field_toshow.' ';
5609
+                            }
5610
+                        }
5611
+                        else
5612
+                        {
5613
+                            $labeltoshow=$obj->{$InfoFieldList[1]};
5614
+                        }
5615
+                        $labeltoshow=dol_trunc($labeltoshow,45);
5616
+
5617
+                        if ($value == $obj->rowid)
5618
+                        {
5619
+                            foreach ($fields_label as $field_toshow)
5620
+                            {
5621
+                                $translabel=$langs->trans($obj->$field_toshow);
5622
+                                if ($translabel!=$obj->$field_toshow) {
5623
+                                    $labeltoshow=dol_trunc($translabel,18).' ';
5624
+                                }else {
5625
+                                    $labeltoshow=dol_trunc($obj->$field_toshow,18).' ';
5626
+                                }
5627
+                            }
5628
+                            $out.='<option value="'.$obj->rowid.'" selected>'.$labeltoshow.'</option>';
5629
+                        }
5630
+                        else
5631
+                        {
5632
+                            if (! $notrans)
5633
+                            {
5634
+                                $translabel=$langs->trans($obj->{$InfoFieldList[1]});
5635
+                                if ($translabel!=$obj->{$InfoFieldList[1]}) {
5636
+                                    $labeltoshow=dol_trunc($translabel,18);
5637
+                                }
5638
+                                else {
5639
+                                    $labeltoshow=dol_trunc($obj->{$InfoFieldList[1]},18);
5640
+                                }
5641
+                            }
5642
+                            if (empty($labeltoshow)) $labeltoshow='(not defined)';
5643
+                            if ($value==$obj->rowid)
5644
+                            {
5645
+                                $out.='<option value="'.$obj->rowid.'" selected>'.$labeltoshow.'</option>';
5646
+                            }
5647
+
5648
+                            if (!empty($InfoFieldList[3]) && $parentField)
5649
+                            {
5650
+                                $parent = $parentName.':'.$obj->{$parentField};
5651
+                            }
5652
+
5653
+                            $out.='<option value="'.$obj->rowid.'"';
5654
+                            $out.= ($value==$obj->rowid?' selected':'');
5655
+                            $out.= (!empty($parent)?' parent="'.$parent.'"':'');
5656
+                            $out.='>'.$labeltoshow.'</option>';
5657
+                        }
5658
+
5659
+                        $i++;
5660
+                    }
5661
+                    $this->db->free($resql);
5662
+                }
5663
+                else {
5664
+                    print 'Error in request '.$sql.' '.$this->db->lasterror().'. Check setup of extra parameters.<br>';
5665
+                }
5666
+            }
5667
+            $out.='</select>';
5668
+        }
5669
+        elseif ($type == 'checkbox')
5670
+        {
5671
+            $value_arr=explode(',',$value);
5672
+            $out=$form->multiselectarray($keyprefix.$key.$keysuffix, (empty($param['options'])?null:$param['options']), $value_arr, '', 0, '', 0, '100%');
5673
+        }
5674
+        elseif ($type == 'radio')
5675
+        {
5676
+            $out='';
5677
+            foreach ($param['options'] as $keyopt => $val)
5678
+            {
5679
+                $out.='<input class="flat '.$morecss.'" type="radio" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" '.($moreparam?$moreparam:'');
5680
+                $out.=' value="'.$keyopt.'"';
5681
+                $out.=' id="'.$keyprefix.$key.$keysuffix.'_'.$keyopt.'"';
5682
+                $out.= ($value==$keyopt?'checked':'');
5683
+                $out.='/><label for="'.$keyprefix.$key.$keysuffix.'_'.$keyopt.'">'.$val.'</label><br>';
5684
+            }
5685
+        }
5686
+        elseif ($type == 'chkbxlst')
5687
+        {
5688
+            if (is_array($value)) {
5689
+                $value_arr = $value;
5690
+            }
5691
+            else {
5692
+                $value_arr = explode(',', $value);
5693
+            }
5694
+
5695
+            if (is_array($param['options'])) {
5696
+                $param_list = array_keys($param['options']);
5697
+                $InfoFieldList = explode(":", $param_list[0]);
5698
+                $parentName='';
5699
+                $parentField='';
5700
+                // 0 : tableName
5701
+                // 1 : label field name
5702
+                // 2 : key fields name (if differ of rowid)
5703
+                // 3 : key field parent (for dependent lists)
5704
+                // 4 : where clause filter on column or table extrafield, syntax field='value' or extra.field=value
5705
+                $keyList = (empty($InfoFieldList[2]) ? 'rowid' : $InfoFieldList[2] . ' as rowid');
5706
+
5707
+                if (count($InfoFieldList) > 3 && ! empty($InfoFieldList[3])) {
5708
+                    list ( $parentName, $parentField ) = explode('|', $InfoFieldList[3]);
5709
+                    $keyList .= ', ' . $parentField;
5710
+                }
5711
+                if (count($InfoFieldList) > 4 && ! empty($InfoFieldList[4])) {
5712
+                    if (strpos($InfoFieldList[4], 'extra.') !== false) {
5713
+                        $keyList = 'main.' . $InfoFieldList[2] . ' as rowid';
5714
+                    } else {
5715
+                        $keyList = $InfoFieldList[2] . ' as rowid';
5716
+                    }
5717
+                }
5718
+
5719
+                $fields_label = explode('|', $InfoFieldList[1]);
5720
+                if (is_array($fields_label)) {
5721
+                    $keyList .= ', ';
5722
+                    $keyList .= implode(', ', $fields_label);
5723
+                }
5724
+
5725
+                $sqlwhere = '';
5726
+                $sql = 'SELECT ' . $keyList;
5727
+                $sql .= ' FROM ' . MAIN_DB_PREFIX . $InfoFieldList[0];
5728
+                if (! empty($InfoFieldList[4])) {
5729
+
5730
+                    // can use SELECT request
5731
+                    if (strpos($InfoFieldList[4], '$SEL$')!==false) {
5732
+                        $InfoFieldList[4]=str_replace('$SEL$','SELECT',$InfoFieldList[4]);
5733
+                    }
5734
+
5735
+                    // current object id can be use into filter
5736
+                    if (strpos($InfoFieldList[4], '$ID$')!==false && !empty($objectid)) {
5737
+                        $InfoFieldList[4]=str_replace('$ID$',$objectid,$InfoFieldList[4]);
5738
+                    } else {
5739
+                        $InfoFieldList[4]=str_replace('$ID$','0',$InfoFieldList[4]);
5740
+                    }
5741
+
5742
+                    // We have to join on extrafield table
5743
+                    if (strpos($InfoFieldList[4], 'extra') !== false) {
5744
+                        $sql .= ' as main, ' . MAIN_DB_PREFIX . $InfoFieldList[0] . '_extrafields as extra';
5745
+                        $sqlwhere .= ' WHERE extra.fk_object=main.' . $InfoFieldList[2] . ' AND ' . $InfoFieldList[4];
5746
+                    } else {
5747
+                        $sqlwhere .= ' WHERE ' . $InfoFieldList[4];
5748
+                    }
5749
+                } else {
5750
+                    $sqlwhere .= ' WHERE 1=1';
5751
+                }
5752
+                // Some tables may have field, some other not. For the moment we disable it.
5753
+                if (in_array($InfoFieldList[0], array ('tablewithentity')))
5754
+                {
5755
+                    $sqlwhere .= ' AND entity = ' . $conf->entity;
5756
+                }
5757
+                // $sql.=preg_replace('/^ AND /','',$sqlwhere);
5758
+                // print $sql;
5759
+
5760
+                $sql .= $sqlwhere;
5761
+                dol_syslog(get_class($this) . '::showInputField type=chkbxlst',LOG_DEBUG);
5762
+                $resql = $this->db->query($sql);
5763
+                if ($resql) {
5764
+                    $num = $this->db->num_rows($resql);
5765
+                    $i = 0;
5766
+
5767
+                    $data=array();
5768
+
5769
+                    while ( $i < $num ) {
5770
+                        $labeltoshow = '';
5771
+                        $obj = $this->db->fetch_object($resql);
5772
+
5773
+                        $notrans = false;
5774
+                        // Several field into label (eq table:code|libelle:rowid)
5775
+                        $fields_label = explode('|', $InfoFieldList[1]);
5776
+                        if (is_array($fields_label)) {
5777
+                            $notrans = true;
5778
+                            foreach ( $fields_label as $field_toshow ) {
5779
+                                $labeltoshow .= $obj->$field_toshow . ' ';
5780
+                            }
5781
+                        } else {
5782
+                            $labeltoshow = $obj->{$InfoFieldList[1]};
5783
+                        }
5784
+                        $labeltoshow = dol_trunc($labeltoshow, 45);
5785
+
5786
+                        if (is_array($value_arr) && in_array($obj->rowid, $value_arr)) {
5787
+                            foreach ( $fields_label as $field_toshow ) {
5788
+                                $translabel = $langs->trans($obj->$field_toshow);
5789
+                                if ($translabel != $obj->$field_toshow) {
5790
+                                    $labeltoshow = dol_trunc($translabel, 18) . ' ';
5791
+                                } else {
5792
+                                    $labeltoshow = dol_trunc($obj->$field_toshow, 18) . ' ';
5793
+                                }
5794
+                            }
5795
+
5796
+                            $data[$obj->rowid]=$labeltoshow;
5797
+                        } else {
5798
+                            if (! $notrans) {
5799
+                                $translabel = $langs->trans($obj->{$InfoFieldList[1]});
5800
+                                if ($translabel != $obj->{$InfoFieldList[1]}) {
5801
+                                    $labeltoshow = dol_trunc($translabel, 18);
5802
+                                } else {
5803
+                                    $labeltoshow = dol_trunc($obj->{$InfoFieldList[1]}, 18);
5804
+                                }
5805
+                            }
5806
+                            if (empty($labeltoshow))
5807
+                                $labeltoshow = '(not defined)';
5808
+
5809
+                                if (is_array($value_arr) && in_array($obj->rowid, $value_arr)) {
5810
+                                    $data[$obj->rowid]=$labeltoshow;
5811
+                                }
5812
+
5813
+                                if (! empty($InfoFieldList[3]) && $parentField) {
5814
+                                    $parent = $parentName . ':' . $obj->{$parentField};
5815
+                                }
5816
+
5817
+                                $data[$obj->rowid]=$labeltoshow;
5818
+                        }
5819
+
5820
+                        $i ++;
5821
+                    }
5822
+                    $this->db->free($resql);
5823
+
5824
+                    $out=$form->multiselectarray($keyprefix.$key.$keysuffix, $data, $value_arr, '', 0, '', 0, '100%');
5825
+                } else {
5826
+                    print 'Error in request ' . $sql . ' ' . $this->db->lasterror() . '. Check setup of extra parameters.<br>';
5827
+                }
5828
+            }
5829
+        }
5830
+        elseif ($type == 'link')
5831
+        {
5832
+            $param_list=array_keys($param['options']);				// $param_list='ObjectName:classPath'
5833
+            $showempty=(($required && $default != '')?0:1);
5834
+            $out=$form->selectForForms($param_list[0], $keyprefix.$key.$keysuffix, $value, $showempty);
5835
+            if ($conf->global->MAIN_FEATURES_LEVEL >= 2)
5836
+            {
5837
+                        list($class,$classfile)=explode(':',$param_list[0]);
5838
+                        if (file_exists(dol_buildpath(dirname(dirname($classfile)).'/card.php'))) $url_path=dol_buildpath(dirname(dirname($classfile)).'/card.php',1);
5839
+                        else $url_path=dol_buildpath(dirname(dirname($classfile)).'/'.$class.'_card.php',1);
5840
+                        $out.='<a class="butActionNew" href="'.$url_path.'?action=create&backtopage='.$_SERVER['PHP_SELF'].'"><span class="fa fa-plus-circle valignmiddle"></span></a>';
5841
+                        // TODO Add Javascript code to add input fields contents to new elements urls
5842
+            }
5843
+        }
5844
+        elseif ($type == 'password')
5845
+        {
5846
+            // If prefix is 'search_', field is used as a filter, we use a common text field.
5847
+            $out='<input type="'.($keyprefix=='search_'?'text':'password').'" class="flat '.$morecss.'" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" value="'.$value.'" '.($moreparam?$moreparam:'').'>';
5848
+        }
5849
+        elseif ($type == 'array')
5850
+        {
5851
+            $newval = $val;
5852
+            $newval['type'] = 'varchar(256)';
5853
+
5854
+            $out='';
5855
+
5856
+            $inputs = array();
5857
+            if(! empty($value)) {
5858
+                foreach($value as $option) {
5859
+                    $out.= '<span><a class="'.dol_escape_htmltag($keyprefix.$key.$keysuffix).'_del" href="javascript:;"><span class="fa fa-minus-circle valignmiddle"></span></a> ';
5860
+                    $out.= $this->showInputField($newval, $keyprefix.$key.$keysuffix.'[]', $option, $moreparam, '', '', $showsize).'<br></span>';
5861
+                }
5862
+            }
5863
+
5864
+            $out.= '<a id="'.dol_escape_htmltag($keyprefix.$key.$keysuffix).'_add" href="javascript:;"><span class="fa fa-plus-circle valignmiddle"></span></a>';
5865
+
5866
+            $newInput = '<span><a class="'.dol_escape_htmltag($keyprefix.$key.$keysuffix).'_del" href="javascript:;"><span class="fa fa-minus-circle valignmiddle"></span></a> ';
5867
+            $newInput.= $this->showInputField($newval, $keyprefix.$key.$keysuffix.'[]', '', $moreparam, '', '', $showsize).'<br></span>';
5868
+
5869
+            if(! empty($conf->use_javascript_ajax)) {
5870
+                $out.= '
5871
+					<script type="text/javascript">
5872
+					$(document).ready(function() {
5873
+						$("a#'.dol_escape_js($keyprefix.$key.$keysuffix).'_add").click(function() {
5874
+							$("'.dol_escape_js($newInput).'").insertBefore(this);
5875
+						});
5876
+
5877
+						$(document).on("click", "a.'.dol_escape_js($keyprefix.$key.$keysuffix).'_del", function() {
5878
+							$(this).parent().remove();
5879
+						});
5880
+					});
5881
+					</script>';
5882
+            }
5883
+        }
5884
+        if (!empty($hidden)) {
5885
+            $out='<input type="hidden" value="'.$value.'" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'"/>';
5886
+        }
5887
+        /* Add comments
5888
+		 if ($type == 'date') $out.=' (YYYY-MM-DD)';
5889
+		 elseif ($type == 'datetime') $out.=' (YYYY-MM-DD HH:MM:SS)';
5890
+		 */
5891
+        return $out;
5892
+    }
5893
+
5894
+    /**
5895
+     * Return HTML string to show a field into a page
5896
+     * Code very similar with showOutputField of extra fields
5897
+     *
5898
+     * @param  array   $val		       Array of properties of field to show
5899
+     * @param  string  $key            Key of attribute
5900
+     * @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)
5901
+     * @param  string  $moreparam      To add more parametes on html input tag
5902
+     * @param  string  $keysuffix      Prefix string to add into name and id of field (can be used to avoid duplicate names)
5903
+     * @param  string  $keyprefix      Suffix string to add into name and id of field (can be used to avoid duplicate names)
5904
+     * @param  mixed   $showsize       Value for css to define size. May also be a numeric.
5905
+     * @return string
5906
+     */
5907
+    function showOutputField($val, $key, $value, $moreparam='', $keysuffix='', $keyprefix='', $showsize=0)
5908
+    {
5909
+        global $conf,$langs,$form;
5910
+
5911
+        if (! is_object($form))
5912
+        {
5913
+            require_once DOL_DOCUMENT_ROOT.'/core/class/html.form.class.php';
5914
+            $form=new Form($this->db);
5915
+        }
5916
+
5917
+        $objectid = $this->id;
5918
+        $label = $val['label'];
5919
+        $type  = $val['type'];
5920
+        $size  = $val['css'];
5921
+
5922
+        // Convert var to be able to share same code than showOutputField of extrafields
5923
+        if (preg_match('/varchar\((\d+)\)/', $type, $reg))
5924
+        {
5925
+            $type = 'varchar';		// convert varchar(xx) int varchar
5926
+            $size = $reg[1];
5927
+        }
5928
+        elseif (preg_match('/varchar/', $type)) $type = 'varchar';		// convert varchar(xx) int varchar
5929
+        if (is_array($val['arrayofkeyval'])) $type='select';
5930
+        if (preg_match('/^integer:(.*):(.*)/i', $val['type'], $reg)) $type='link';
5931
+
5932
+        $default=$val['default'];
5933
+        $computed=$val['computed'];
5934
+        $unique=$val['unique'];
5935
+        $required=$val['required'];
5936
+        $param=$val['param'];
5937
+        if (is_array($val['arrayofkeyval'])) $param['options'] = $val['arrayofkeyval'];
5938
+        if (preg_match('/^integer:(.*):(.*)/i', $val['type'], $reg))
5939
+        {
5940
+            $type='link';
5941
+            $param['options']=array($reg[1].':'.$reg[2]=>$reg[1].':'.$reg[2]);
5942
+        }
5943
+        $langfile=$val['langfile'];
5944
+        $list=$val['list'];
5945
+        $help=$val['help'];
5946
+        $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)
5947
+
5948
+        if ($hidden) return '';
5949
+
5950
+        // If field is a computed field, value must become result of compute
5951
+        if ($computed)
5952
+        {
5953
+            // Make the eval of compute string
5954
+            //var_dump($computed);
5955
+            $value = dol_eval($computed, 1, 0);
5956
+        }
5957
+
5958
+        if (empty($showsize))
5959
+        {
5960
+            if ($type == 'date')
5961
+            {
5962
+                //$showsize=10;
5963
+                $showsize = 'minwidth100imp';
5964
+            }
5965
+            elseif ($type == 'datetime')
5966
+            {
5967
+                //$showsize=19;
5968
+                $showsize = 'minwidth200imp';
5969
+            }
5970
+            elseif (in_array($type,array('int','double','price')))
5971
+            {
5972
+                //$showsize=10;
5973
+                $showsize = 'maxwidth75';
5974
+            }
5975
+            elseif ($type == 'url')
5976
+            {
5977
+                $showsize='minwidth400';
5978
+            }
5979
+            elseif ($type == 'boolean')
5980
+            {
5981
+                $showsize='';
5982
+            }
5983
+            else
5984
+            {
5985
+                if (round($size) < 12)
5986
+                {
5987
+                    $showsize = 'minwidth100';
5988
+                }
5989
+                else if (round($size) <= 48)
5990
+                {
5991
+                    $showsize = 'minwidth200';
5992
+                }
5993
+                else
5994
+                {
5995
+                    //$showsize=48;
5996
+                    $showsize = 'minwidth400';
5997
+                }
5998
+            }
5999
+        }
6000
+
6001
+        // Format output value differently according to properties of field
6002
+        if ($key == 'ref' && method_exists($this, 'getNomUrl')) $value=$this->getNomUrl(1, '', 0, '', 1);
6003
+        elseif ($key == 'status' && method_exists($this, 'getLibStatut')) $value=$this->getLibStatut(3);
6004
+        elseif ($type == 'date')
6005
+        {
6006
+            if(! empty($value)) {
6007
+                $value=dol_print_date($value,'day');
6008
+            } else {
6009
+                $value='';
6010
+            }
6011
+        }
6012
+        elseif ($type == 'datetime')
6013
+        {
6014
+            if(! empty($value)) {
6015
+                $value=dol_print_date($value,'dayhour');
6016
+            } else {
6017
+                $value='';
6018
+            }
6019
+        }
6020
+        elseif ($type == 'double')
6021
+        {
6022
+            if (!empty($value)) {
6023
+                $value=price($value);
6024
+            }
6025
+        }
6026
+        elseif ($type == 'boolean')
6027
+        {
6028
+            $checked='';
6029
+            if (!empty($value)) {
6030
+                $checked=' checked ';
6031
+            }
6032
+            $value='<input type="checkbox" '.$checked.' '.($moreparam?$moreparam:'').' readonly disabled>';
6033
+        }
6034
+        elseif ($type == 'mail')
6035
+        {
6036
+            $value=dol_print_email($value,0,0,0,64,1,1);
6037
+        }
6038
+        elseif ($type == 'url')
6039
+        {
6040
+            $value=dol_print_url($value,'_blank',32,1);
6041
+        }
6042
+        elseif ($type == 'phone')
6043
+        {
6044
+            $value=dol_print_phone($value, '', 0, 0, '', '&nbsp;', 1);
6045
+        }
6046
+        elseif ($type == 'price')
6047
+        {
6048
+            $value=price($value,0,$langs,0,0,-1,$conf->currency);
6049
+        }
6050
+        elseif ($type == 'select')
6051
+        {
6052
+            $value=$param['options'][$value];
6053
+        }
6054
+        elseif ($type == 'sellist')
6055
+        {
6056
+            $param_list=array_keys($param['options']);
6057
+            $InfoFieldList = explode(":", $param_list[0]);
6058
+
6059
+            $selectkey="rowid";
6060
+            $keyList='rowid';
6061
+
6062
+            if (count($InfoFieldList)>=3)
6063
+            {
6064
+                $selectkey = $InfoFieldList[2];
6065
+                $keyList=$InfoFieldList[2].' as rowid';
6066
+            }
6067
+
6068
+            $fields_label = explode('|',$InfoFieldList[1]);
6069
+            if(is_array($fields_label)) {
6070
+                $keyList .=', ';
6071
+                $keyList .= implode(', ', $fields_label);
6072
+            }
6073
+
6074
+            $sql = 'SELECT '.$keyList;
6075
+            $sql.= ' FROM '.MAIN_DB_PREFIX .$InfoFieldList[0];
6076
+            if (strpos($InfoFieldList[4], 'extra')!==false)
6077
+            {
6078
+                $sql.= ' as main';
6079
+            }
6080
+            if ($selectkey=='rowid' && empty($value)) {
6081
+                $sql.= " WHERE ".$selectkey."=0";
6082
+            } elseif ($selectkey=='rowid') {
6083
+                $sql.= " WHERE ".$selectkey."=".$this->db->escape($value);
6084
+            }else {
6085
+                $sql.= " WHERE ".$selectkey."='".$this->db->escape($value)."'";
6086
+            }
6087
+
6088
+            //$sql.= ' AND entity = '.$conf->entity;
6089
+
6090
+            dol_syslog(get_class($this).':showOutputField:$type=sellist', LOG_DEBUG);
6091
+            $resql = $this->db->query($sql);
6092
+            if ($resql)
6093
+            {
6094
+                $value='';	// value was used, so now we reste it to use it to build final output
6095
+
6096
+                $obj = $this->db->fetch_object($resql);
6097
+
6098
+                // Several field into label (eq table:code|libelle:rowid)
6099
+                $fields_label = explode('|',$InfoFieldList[1]);
6100
+
6101
+                if(is_array($fields_label) && count($fields_label)>1)
6102
+                {
6103
+                    foreach ($fields_label as $field_toshow)
6104
+                    {
6105
+                        $translabel='';
6106
+                        if (!empty($obj->$field_toshow)) {
6107
+                            $translabel=$langs->trans($obj->$field_toshow);
6108
+                        }
6109
+                        if ($translabel!=$field_toshow) {
6110
+                            $value.=dol_trunc($translabel,18).' ';
6111
+                        }else {
6112
+                            $value.=$obj->$field_toshow.' ';
6113
+                        }
6114
+                    }
6115
+                }
6116
+                else
6117
+                {
6118
+                    $translabel='';
6119
+                    if (!empty($obj->{$InfoFieldList[1]})) {
6120
+                        $translabel=$langs->trans($obj->{$InfoFieldList[1]});
6121
+                    }
6122
+                    if ($translabel!=$obj->{$InfoFieldList[1]}) {
6123
+                        $value=dol_trunc($translabel,18);
6124
+                    }else {
6125
+                        $value=$obj->{$InfoFieldList[1]};
6126
+                    }
6127
+                }
6128
+            }
6129
+            else dol_syslog(get_class($this).'::showOutputField error '.$this->db->lasterror(), LOG_WARNING);
6130
+        }
6131
+        elseif ($type == 'radio')
6132
+        {
6133
+            $value=$param['options'][$value];
6134
+        }
6135
+        elseif ($type == 'checkbox')
6136
+        {
6137
+            $value_arr=explode(',',$value);
6138
+            $value='';
6139
+            if (is_array($value_arr) && count($value_arr)>0)
6140
+            {
6141
+                foreach ($value_arr as $keyval=>$valueval) {
6142
+                    $toprint[]='<li class="select2-search-choice-dolibarr noborderoncategories" style="background: #aaa">'.$param['options'][$valueval].'</li>';
6143
+                }
6144
+                $value='<div class="select2-container-multi-dolibarr" style="width: 90%;"><ul class="select2-choices-dolibarr">'.implode(' ', $toprint).'</ul></div>';
6145
+            }
6146
+        }
6147
+        elseif ($type == 'chkbxlst')
6148
+        {
6149
+            $value_arr = explode(',', $value);
6150
+
6151
+            $param_list = array_keys($param['options']);
6152
+            $InfoFieldList = explode(":", $param_list[0]);
6153
+
6154
+            $selectkey = "rowid";
6155
+            $keyList = 'rowid';
6156
+
6157
+            if (count($InfoFieldList) >= 3) {
6158
+                $selectkey = $InfoFieldList[2];
6159
+                $keyList = $InfoFieldList[2] . ' as rowid';
6160
+            }
6161
+
6162
+            $fields_label = explode('|', $InfoFieldList[1]);
6163
+            if (is_array($fields_label)) {
6164
+                $keyList .= ', ';
6165
+                $keyList .= implode(', ', $fields_label);
6166
+            }
6167
+
6168
+            $sql = 'SELECT ' . $keyList;
6169
+            $sql .= ' FROM ' . MAIN_DB_PREFIX . $InfoFieldList[0];
6170
+            if (strpos($InfoFieldList[4], 'extra') !== false) {
6171
+                $sql .= ' as main';
6172
+            }
6173
+            // $sql.= " WHERE ".$selectkey."='".$this->db->escape($value)."'";
6174
+            // $sql.= ' AND entity = '.$conf->entity;
6175
+
6176
+            dol_syslog(get_class($this) . ':showOutputField:$type=chkbxlst',LOG_DEBUG);
6177
+            $resql = $this->db->query($sql);
6178
+            if ($resql) {
6179
+                $value = ''; // value was used, so now we reste it to use it to build final output
6180
+                $toprint=array();
6181
+                while ( $obj = $this->db->fetch_object($resql) ) {
6182
+
6183
+                    // Several field into label (eq table:code|libelle:rowid)
6184
+                    $fields_label = explode('|', $InfoFieldList[1]);
6185
+                    if (is_array($value_arr) && in_array($obj->rowid, $value_arr)) {
6186
+                        if (is_array($fields_label) && count($fields_label) > 1) {
6187
+                            foreach ( $fields_label as $field_toshow ) {
6188
+                                $translabel = '';
6189
+                                if (! empty($obj->$field_toshow)) {
6190
+                                    $translabel = $langs->trans($obj->$field_toshow);
6191
+                                }
6192
+                                if ($translabel != $field_toshow) {
6193
+                                    $toprint[]='<li class="select2-search-choice-dolibarr noborderoncategories" style="background: #aaa">'.dol_trunc($translabel, 18).'</li>';
6194
+                                } else {
6195
+                                    $toprint[]='<li class="select2-search-choice-dolibarr noborderoncategories" style="background: #aaa">'.$obj->$field_toshow.'</li>';
6196
+                                }
6197
+                            }
6198
+                        } else {
6199
+                            $translabel = '';
6200
+                            if (! empty($obj->{$InfoFieldList[1]})) {
6201
+                                $translabel = $langs->trans($obj->{$InfoFieldList[1]});
6202
+                            }
6203
+                            if ($translabel != $obj->{$InfoFieldList[1]}) {
6204
+                                $toprint[]='<li class="select2-search-choice-dolibarr noborderoncategories" style="background: #aaa">'.dol_trunc($translabel, 18).'</li>';
6205
+                            } else {
6206
+                                $toprint[]='<li class="select2-search-choice-dolibarr noborderoncategories" style="background: #aaa">'.$obj->{$InfoFieldList[1]}.'</li>';
6207
+                            }
6208
+                        }
6209
+                    }
6210
+                }
6211
+                $value='<div class="select2-container-multi-dolibarr" style="width: 90%;"><ul class="select2-choices-dolibarr">'.implode(' ', $toprint).'</ul></div>';
6212
+            } else {
6213
+                dol_syslog(get_class($this) . '::showOutputField error ' . $this->db->lasterror(), LOG_WARNING);
6214
+            }
6215
+        }
6216
+        elseif ($type == 'link')
6217
+        {
6218
+            $out='';
6219
+
6220
+            // only if something to display (perf)
6221
+            if ($value)
6222
+            {
6223
+                $param_list=array_keys($param['options']);				// $param_list='ObjectName:classPath'
6224
+
6225
+                $InfoFieldList = explode(":", $param_list[0]);
6226
+                $classname=$InfoFieldList[0];
6227
+                $classpath=$InfoFieldList[1];
6228
+                $getnomurlparam=(empty($InfoFieldList[2]) ? 3 : $InfoFieldList[2]);
6229
+                if (! empty($classpath))
6230
+                {
6231
+                    dol_include_once($InfoFieldList[1]);
6232
+                    if ($classname && class_exists($classname))
6233
+                    {
6234
+                        $object = new $classname($this->db);
6235
+                        $object->fetch($value);
6236
+                        $value=$object->getNomUrl($getnomurlparam);
6237
+                    }
6238
+                }
6239
+                else
6240
+                {
6241
+                    dol_syslog('Error bad setup of extrafield', LOG_WARNING);
6242
+                    return 'Error bad setup of extrafield';
6243
+                }
6244
+            }
6245
+            else $value='';
6246
+        }
6247
+        elseif ($type == 'text' || $type == 'html')
6248
+        {
6249
+            $value=dol_htmlentitiesbr($value);
6250
+        }
6251
+        elseif ($type == 'password')
6252
+        {
6253
+            $value=preg_replace('/./i','*',$value);
6254
+        }
6255
+        elseif ($type == 'array')
6256
+        {
6257
+            $value = implode('<br>', $value);
6258
+        }
6259
+
6260
+        //print $type.'-'.$size;
6261
+        $out=$value;
6262
+
6263
+        return $out;
6264
+    }
6265
+
6266
+
6267
+    /**
6268
+     * Function to show lines of extrafields with output datas
6269
+     *
6270
+     * @param 	Extrafields $extrafields    Extrafield Object
6271
+     * @param 	string      $mode           Show output (view) or input (edit) for extrafield
6272
+     * @param 	array       $params         Optional parameters. Example: array('style'=>'class="oddeven"', 'colspan'=>$colspan)
6273
+     * @param 	string      $keysuffix      Suffix string to add after name and id of field (can be used to avoid duplicate names)
6274
+     * @param 	string      $keyprefix      Prefix string to add before name and id of field (can be used to avoid duplicate names)
6275
+     * @param	string		$onetrtd		All fields in same tr td
6276
+     * @return 	string
6277
+     */
6278
+    function showOptionals($extrafields, $mode='view', $params=null, $keysuffix='', $keyprefix='', $onetrtd=0)
6279
+    {
6280
+        global $db, $conf, $langs, $action, $form;
6281
+
6282
+        if (! is_object($form)) $form=new Form($db);
6283
+
6284
+        $out = '';
6285
+
6286
+        if (is_array($extrafields->attributes[$this->table_element]['label']) && count($extrafields->attributes[$this->table_element]['label']) > 0)
6287
+        {
6288
+            $out .= "\n";
6289
+            $out .= '<!-- showOptionalsInput --> ';
6290
+            $out .= "\n";
5819 6291
 
5820
-						$i ++;
5821
-					}
5822
-					$this->db->free($resql);
6292
+            $e = 0;
6293
+            foreach($extrafields->attributes[$this->table_element]['label'] as $key=>$label)
6294
+            {
6295
+                // Show only the key field in params
6296
+                if (is_array($params) && array_key_exists('onlykey',$params) && $key != $params['onlykey']) continue;
6297
+
6298
+                $enabled = 1;
6299
+                if ($enabled && isset($extrafields->attributes[$this->table_element]['list'][$key]))
6300
+                {
6301
+                    $enabled = dol_eval($extrafields->attributes[$this->table_element]['list'][$key], 1);
6302
+                }
6303
+
6304
+                $perms = 1;
6305
+                if ($perms && isset($extrafields->attributes[$this->table_element]['perms'][$key]))
6306
+                {
6307
+                    $perms = dol_eval($extrafields->attributes[$this->table_element]['perms'][$key], 1);
6308
+                }
6309
+
6310
+                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 (empty($perms)) continue;
6312
+
6313
+                // Load language if required
6314
+                if (! empty($extrafields->attributes[$this->table_element]['langfile'][$key])) $langs->load($extrafields->attributes[$this->table_element]['langfile'][$key]);
6315
+
6316
+                $colspan='3';
6317
+                if (is_array($params) && count($params)>0) {
6318
+                    if (array_key_exists('colspan',$params)) {
6319
+                        $colspan=$params['colspan'];
6320
+                    }
6321
+                }
6322
+
6323
+                switch($mode) {
6324
+                    case "view":
6325
+                        $value=$this->array_options["options_".$key.$keysuffix];
6326
+                        break;
6327
+                    case "edit":
6328
+                        $getposttemp = GETPOST($keyprefix.'options_'.$key.$keysuffix, 'none');				// GETPOST can get value from GET, POST or setup of default values.
6329
+                        // GETPOST("options_" . $key) can be 'abc' or array(0=>'abc')
6330
+                        if (is_array($getposttemp) || $getposttemp != '' || GETPOSTISSET($keyprefix.'options_'.$key.$keysuffix))
6331
+                        {
6332
+                            if (is_array($getposttemp)) {
6333
+                                // $getposttemp is an array but following code expects a comma separated string
6334
+                                $value = implode(",", $getposttemp);
6335
+                            } else {
6336
+                                $value = $getposttemp;
6337
+                            }
6338
+                        } else {
6339
+                            $value = $this->array_options["options_" . $key];			// No GET, no POST, no default value, so we take value of object.
6340
+                        }
6341
+                        //var_dump($keyprefix.' - '.$key.' - '.$keysuffix.' - '.$keyprefix.'options_'.$key.$keysuffix.' - '.$this->array_options["options_".$key.$keysuffix].' - '.$getposttemp.' - '.$value);
6342
+                        break;
6343
+                }
6344
+
6345
+                if ($extrafields->attributes[$this->table_element]['type'][$key] == 'separate')
6346
+                {
6347
+                    $out .= $extrafields->showSeparator($key, $this);
6348
+                }
6349
+                else
6350
+                {
6351
+                    $csstyle='';
6352
+                    $class=(!empty($extrafields->attributes[$this->table_element]['hidden'][$key]) ? 'hideobject ' : '');
6353
+                    if (is_array($params) && count($params)>0) {
6354
+                        if (array_key_exists('style',$params)) {
6355
+                            $csstyle=$params['style'];
6356
+                        }
6357
+                    }
6358
+
6359
+                    // add html5 elements
6360
+                    $domData  = ' data-element="extrafield"';
6361
+                    $domData .= ' data-targetelement="'.$this->element.'"';
6362
+                    $domData .= ' data-targetid="'.$this->id.'"';
6363
+
6364
+                    $html_id = !empty($this->id) ? 'extrarow-'.$this->element.'_'.$key.'_'.$this->id : '';
6365
+
6366
+                    $out .= '<tr id="'.$html_id.'" '.$csstyle.' class="'.$class.$this->element.'_extras_'.$key.'" '.$domData.' >';
6367
+
6368
+                    if (! empty($conf->global->MAIN_EXTRAFIELDS_USE_TWO_COLUMS) && ($e % 2) == 0)
6369
+                    {
6370
+                        if (! empty($conf->global->MAIN_EXTRAFIELDS_USE_TWO_COLUMS) && ($e % 2) == 0) { $colspan='0'; }
6371
+                    }
6372
+
6373
+                    if ($action == 'selectlines') { $colspan++; }
6374
+
6375
+                    // Convert date into timestamp format (value in memory must be a timestamp)
6376
+                    if (in_array($extrafields->attributes[$this->table_element]['type'][$key],array('date','datetime')))
6377
+                    {
6378
+                        $datenotinstring = $this->array_options['options_' . $key];
6379
+                        if (! is_numeric($this->array_options['options_' . $key]))	// For backward compatibility
6380
+                        {
6381
+                            $datenotinstring = $this->db->jdate($datenotinstring);
6382
+                        }
6383
+                        $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
+                    }
6385
+                    // Convert float submited string into real php numeric (value in memory must be a php numeric)
6386
+                    if (in_array($extrafields->attributes[$this->table_element]['type'][$key],array('price','double')))
6387
+                    {
6388
+                        $value = GETPOSTISSET($keyprefix.'options_'.$key.$keysuffix)?price2num(GETPOST($keyprefix.'options_'.$key.$keysuffix, 'alpha', 3)):$this->array_options['options_'.$key];
6389
+                    }
6390
+
6391
+                    $labeltoshow = $langs->trans($label);
6392
+
6393
+                    $out .= '<td class="titlefield';
6394
+                    if (GETPOST('action','none') == 'create') $out.='create';
6395
+                    if ($mode != 'view' && ! empty($extrafields->attributes[$this->table_element]['required'][$key])) $out .= ' fieldrequired';
6396
+                    $out .= '">';
6397
+                    if (! empty($extrafields->attributes[$object->table_element]['help'][$key])) $out .= $form->textwithpicto($labeltoshow, $extrafields->attributes[$object->table_element]['help'][$key]);
6398
+                    else $out .= $labeltoshow;
6399
+                    $out .= '</td>';
6400
+
6401
+                    $html_id = !empty($this->id) ? $this->element.'_extras_'.$key.'_'.$this->id : '';
6402
+                    $out .='<td id="'.$html_id.'" class="'.$this->element.'_extras_'.$key.'" '.($colspan?' colspan="'.$colspan.'"':'').'>';
6403
+
6404
+                    switch($mode) {
6405
+                        case "view":
6406
+                            $out .= $extrafields->showOutputField($key, $value);
6407
+                            break;
6408
+                        case "edit":
6409
+                            $out .= $extrafields->showInputField($key, $value, '', $keysuffix, '', 0, $this->id);
6410
+                            break;
6411
+                    }
6412
+
6413
+                    $out .= '</td>';
6414
+
6415
+                    if (! empty($conf->global->MAIN_EXTRAFIELDS_USE_TWO_COLUMS) && (($e % 2) == 1)) $out .= '</tr>';
6416
+                    else $out .= '</tr>';
6417
+                    $e++;
6418
+                }
6419
+            }
6420
+            $out .= "\n";
6421
+            // Add code to manage list depending on others
6422
+            if (! empty($conf->use_javascript_ajax)) {
6423
+                $out .= '
6424
+				<script type="text/javascript">
6425
+				    jQuery(document).ready(function() {
6426
+				    	function showOptions(child_list, parent_list)
6427
+				    	{
6428
+				    		var val = $("select[name=\"options_"+parent_list+"\"]").val();
6429
+				    		var parentVal = parent_list + ":" + val;
6430
+							if(val > 0) {
6431
+					    		$("select[name=\""+child_list+"\"] option[parent]").hide();
6432
+					    		$("select[name=\""+child_list+"\"] option[parent=\""+parentVal+"\"]").show();
6433
+							} else {
6434
+								$("select[name=\""+child_list+"\"] option").show();
6435
+							}
6436
+				    	}
6437
+						function setListDependencies() {
6438
+					    	jQuery("select option[parent]").parent().each(function() {
6439
+					    		var child_list = $(this).attr("name");
6440
+								var parent = $(this).find("option[parent]:first").attr("parent");
6441
+								var infos = parent.split(":");
6442
+								var parent_list = infos[0];
6443
+								$("select[name=\""+parent_list+"\"]").change(function() {
6444
+									showOptions(child_list, parent_list);
6445
+								});
6446
+					    	});
6447
+						}
5823 6448
 
5824
-					$out=$form->multiselectarray($keyprefix.$key.$keysuffix, $data, $value_arr, '', 0, '', 0, '100%');
5825
-				} else {
5826
-					print 'Error in request ' . $sql . ' ' . $this->db->lasterror() . '. Check setup of extra parameters.<br>';
5827
-				}
5828
-			}
5829
-		}
5830
-		elseif ($type == 'link')
5831
-		{
5832
-			$param_list=array_keys($param['options']);				// $param_list='ObjectName:classPath'
5833
-			$showempty=(($required && $default != '')?0:1);
5834
-			$out=$form->selectForForms($param_list[0], $keyprefix.$key.$keysuffix, $value, $showempty);
5835
-			if ($conf->global->MAIN_FEATURES_LEVEL >= 2)
5836
-			{
5837
-            			list($class,$classfile)=explode(':',$param_list[0]);
5838
-            			if (file_exists(dol_buildpath(dirname(dirname($classfile)).'/card.php'))) $url_path=dol_buildpath(dirname(dirname($classfile)).'/card.php',1);
5839
-            			else $url_path=dol_buildpath(dirname(dirname($classfile)).'/'.$class.'_card.php',1);
5840
-            			$out.='<a class="butActionNew" href="'.$url_path.'?action=create&backtopage='.$_SERVER['PHP_SELF'].'"><span class="fa fa-plus-circle valignmiddle"></span></a>';
5841
-            			// TODO Add Javascript code to add input fields contents to new elements urls
5842
-			}
5843
-		}
5844
-		elseif ($type == 'password')
5845
-		{
5846
-			// If prefix is 'search_', field is used as a filter, we use a common text field.
5847
-			$out='<input type="'.($keyprefix=='search_'?'text':'password').'" class="flat '.$morecss.'" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" value="'.$value.'" '.($moreparam?$moreparam:'').'>';
5848
-		}
5849
-		elseif ($type == 'array')
5850
-		{
5851
-			$newval = $val;
5852
-			$newval['type'] = 'varchar(256)';
5853
-
5854
-			$out='';
5855
-
5856
-			$inputs = array();
5857
-			if(! empty($value)) {
5858
-				foreach($value as $option) {
5859
-					$out.= '<span><a class="'.dol_escape_htmltag($keyprefix.$key.$keysuffix).'_del" href="javascript:;"><span class="fa fa-minus-circle valignmiddle"></span></a> ';
5860
-					$out.= $this->showInputField($newval, $keyprefix.$key.$keysuffix.'[]', $option, $moreparam, '', '', $showsize).'<br></span>';
5861
-				}
5862
-			}
6449
+						setListDependencies();
6450
+				    });
6451
+				</script>'."\n";
6452
+                $out .= '<!-- /showOptionalsInput --> '."\n";
6453
+            }
6454
+        }
6455
+        return $out;
6456
+    }
5863 6457
 
5864
-			$out.= '<a id="'.dol_escape_htmltag($keyprefix.$key.$keysuffix).'_add" href="javascript:;"><span class="fa fa-plus-circle valignmiddle"></span></a>';
5865 6458
 
5866
-			$newInput = '<span><a class="'.dol_escape_htmltag($keyprefix.$key.$keysuffix).'_del" href="javascript:;"><span class="fa fa-minus-circle valignmiddle"></span></a> ';
5867
-			$newInput.= $this->showInputField($newval, $keyprefix.$key.$keysuffix.'[]', '', $moreparam, '', '', $showsize).'<br></span>';
6459
+    /**
6460
+     * Returns the rights used for this class
6461
+     * @return stdClass
6462
+     */
6463
+    public function getRights()
6464
+    {
6465
+        global $user;
5868 6466
 
5869
-			if(! empty($conf->use_javascript_ajax)) {
5870
-				$out.= '
5871
-					<script type="text/javascript">
5872
-					$(document).ready(function() {
5873
-						$("a#'.dol_escape_js($keyprefix.$key.$keysuffix).'_add").click(function() {
5874
-							$("'.dol_escape_js($newInput).'").insertBefore(this);
5875
-						});
6467
+        $element = $this->element;
6468
+        if ($element == 'facturerec') $element='facture';
5876 6469
 
5877
-						$(document).on("click", "a.'.dol_escape_js($keyprefix.$key.$keysuffix).'_del", function() {
5878
-							$(this).parent().remove();
5879
-						});
5880
-					});
5881
-					</script>';
5882
-			}
5883
-		}
5884
-		if (!empty($hidden)) {
5885
-			$out='<input type="hidden" value="'.$value.'" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'"/>';
5886
-		}
5887
-		/* Add comments
5888
-		 if ($type == 'date') $out.=' (YYYY-MM-DD)';
5889
-		 elseif ($type == 'datetime') $out.=' (YYYY-MM-DD HH:MM:SS)';
5890
-		 */
5891
-		return $out;
5892
-	}
5893
-
5894
-	/**
5895
-	 * Return HTML string to show a field into a page
5896
-	 * Code very similar with showOutputField of extra fields
5897
-	 *
5898
-	 * @param  array   $val		       Array of properties of field to show
5899
-	 * @param  string  $key            Key of attribute
5900
-	 * @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)
5901
-	 * @param  string  $moreparam      To add more parametes on html input tag
5902
-	 * @param  string  $keysuffix      Prefix string to add into name and id of field (can be used to avoid duplicate names)
5903
-	 * @param  string  $keyprefix      Suffix string to add into name and id of field (can be used to avoid duplicate names)
5904
-	 * @param  mixed   $showsize       Value for css to define size. May also be a numeric.
5905
-	 * @return string
5906
-	 */
5907
-	function showOutputField($val, $key, $value, $moreparam='', $keysuffix='', $keyprefix='', $showsize=0)
5908
-	{
5909
-		global $conf,$langs,$form;
5910
-
5911
-		if (! is_object($form))
5912
-		{
5913
-			require_once DOL_DOCUMENT_ROOT.'/core/class/html.form.class.php';
5914
-			$form=new Form($this->db);
5915
-		}
5916
-
5917
-		$objectid = $this->id;
5918
-		$label = $val['label'];
5919
-		$type  = $val['type'];
5920
-		$size  = $val['css'];
5921
-
5922
-		// Convert var to be able to share same code than showOutputField of extrafields
5923
-		if (preg_match('/varchar\((\d+)\)/', $type, $reg))
5924
-		{
5925
-			$type = 'varchar';		// convert varchar(xx) int varchar
5926
-			$size = $reg[1];
5927
-		}
5928
-		elseif (preg_match('/varchar/', $type)) $type = 'varchar';		// convert varchar(xx) int varchar
5929
-		if (is_array($val['arrayofkeyval'])) $type='select';
5930
-		if (preg_match('/^integer:(.*):(.*)/i', $val['type'], $reg)) $type='link';
5931
-
5932
-		$default=$val['default'];
5933
-		$computed=$val['computed'];
5934
-		$unique=$val['unique'];
5935
-		$required=$val['required'];
5936
-		$param=$val['param'];
5937
-		if (is_array($val['arrayofkeyval'])) $param['options'] = $val['arrayofkeyval'];
5938
-		if (preg_match('/^integer:(.*):(.*)/i', $val['type'], $reg))
5939
-		{
5940
-			$type='link';
5941
-			$param['options']=array($reg[1].':'.$reg[2]=>$reg[1].':'.$reg[2]);
5942
-		}
5943
-		$langfile=$val['langfile'];
5944
-		$list=$val['list'];
5945
-		$help=$val['help'];
5946
-		$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)
5947
-
5948
-		if ($hidden) return '';
5949
-
5950
-		// If field is a computed field, value must become result of compute
5951
-		if ($computed)
5952
-		{
5953
-			// Make the eval of compute string
5954
-			//var_dump($computed);
5955
-			$value = dol_eval($computed, 1, 0);
5956
-		}
5957
-
5958
-		if (empty($showsize))
5959
-		{
5960
-			if ($type == 'date')
5961
-			{
5962
-				//$showsize=10;
5963
-				$showsize = 'minwidth100imp';
5964
-			}
5965
-			elseif ($type == 'datetime')
5966
-			{
5967
-				//$showsize=19;
5968
-				$showsize = 'minwidth200imp';
5969
-			}
5970
-			elseif (in_array($type,array('int','double','price')))
5971
-			{
5972
-				//$showsize=10;
5973
-				$showsize = 'maxwidth75';
5974
-			}
5975
-			elseif ($type == 'url')
5976
-			{
5977
-				$showsize='minwidth400';
5978
-			}
5979
-			elseif ($type == 'boolean')
5980
-			{
5981
-				$showsize='';
5982
-			}
5983
-			else
5984
-			{
5985
-				if (round($size) < 12)
5986
-				{
5987
-					$showsize = 'minwidth100';
5988
-				}
5989
-				else if (round($size) <= 48)
5990
-				{
5991
-					$showsize = 'minwidth200';
5992
-				}
5993
-				else
5994
-				{
5995
-					//$showsize=48;
5996
-					$showsize = 'minwidth400';
5997
-				}
5998
-			}
5999
-		}
6000
-
6001
-		// Format output value differently according to properties of field
6002
-		if ($key == 'ref' && method_exists($this, 'getNomUrl')) $value=$this->getNomUrl(1, '', 0, '', 1);
6003
-		elseif ($key == 'status' && method_exists($this, 'getLibStatut')) $value=$this->getLibStatut(3);
6004
-		elseif ($type == 'date')
6005
-		{
6006
-			if(! empty($value)) {
6007
-				$value=dol_print_date($value,'day');
6008
-			} else {
6009
-				$value='';
6010
-			}
6011
-		}
6012
-		elseif ($type == 'datetime')
6013
-		{
6014
-			if(! empty($value)) {
6015
-				$value=dol_print_date($value,'dayhour');
6016
-			} else {
6017
-				$value='';
6018
-			}
6019
-		}
6020
-		elseif ($type == 'double')
6021
-		{
6022
-			if (!empty($value)) {
6023
-				$value=price($value);
6024
-			}
6025
-		}
6026
-		elseif ($type == 'boolean')
6027
-		{
6028
-			$checked='';
6029
-			if (!empty($value)) {
6030
-				$checked=' checked ';
6031
-			}
6032
-			$value='<input type="checkbox" '.$checked.' '.($moreparam?$moreparam:'').' readonly disabled>';
6033
-		}
6034
-		elseif ($type == 'mail')
6035
-		{
6036
-			$value=dol_print_email($value,0,0,0,64,1,1);
6037
-		}
6038
-		elseif ($type == 'url')
6039
-		{
6040
-			$value=dol_print_url($value,'_blank',32,1);
6041
-		}
6042
-		elseif ($type == 'phone')
6043
-		{
6044
-			$value=dol_print_phone($value, '', 0, 0, '', '&nbsp;', 1);
6045
-		}
6046
-		elseif ($type == 'price')
6047
-		{
6048
-			$value=price($value,0,$langs,0,0,-1,$conf->currency);
6049
-		}
6050
-		elseif ($type == 'select')
6051
-		{
6052
-			$value=$param['options'][$value];
6053
-		}
6054
-		elseif ($type == 'sellist')
6055
-		{
6056
-			$param_list=array_keys($param['options']);
6057
-			$InfoFieldList = explode(":", $param_list[0]);
6058
-
6059
-			$selectkey="rowid";
6060
-			$keyList='rowid';
6061
-
6062
-			if (count($InfoFieldList)>=3)
6063
-			{
6064
-				$selectkey = $InfoFieldList[2];
6065
-				$keyList=$InfoFieldList[2].' as rowid';
6066
-			}
6067
-
6068
-			$fields_label = explode('|',$InfoFieldList[1]);
6069
-			if(is_array($fields_label)) {
6070
-				$keyList .=', ';
6071
-				$keyList .= implode(', ', $fields_label);
6072
-			}
6073
-
6074
-			$sql = 'SELECT '.$keyList;
6075
-			$sql.= ' FROM '.MAIN_DB_PREFIX .$InfoFieldList[0];
6076
-			if (strpos($InfoFieldList[4], 'extra')!==false)
6077
-			{
6078
-				$sql.= ' as main';
6079
-			}
6080
-			if ($selectkey=='rowid' && empty($value)) {
6081
-				$sql.= " WHERE ".$selectkey."=0";
6082
-			} elseif ($selectkey=='rowid') {
6083
-				$sql.= " WHERE ".$selectkey."=".$this->db->escape($value);
6084
-			}else {
6085
-				$sql.= " WHERE ".$selectkey."='".$this->db->escape($value)."'";
6086
-			}
6087
-
6088
-			//$sql.= ' AND entity = '.$conf->entity;
6089
-
6090
-			dol_syslog(get_class($this).':showOutputField:$type=sellist', LOG_DEBUG);
6091
-			$resql = $this->db->query($sql);
6092
-			if ($resql)
6093
-			{
6094
-				$value='';	// value was used, so now we reste it to use it to build final output
6470
+        return $user->rights->{$element};
6471
+    }
6472
+
6473
+    /**
6474
+     * Function used to replace a thirdparty id with another one.
6475
+     * This function is meant to be called from replaceThirdparty with the appropiate tables
6476
+     * Column name fk_soc MUST be used to identify thirdparties
6477
+     *
6478
+     * @param  DoliDB 	   $db 			  Database handler
6479
+     * @param  int 		   $origin_id     Old thirdparty id (the thirdparty to delete)
6480
+     * @param  int 		   $dest_id       New thirdparty id (the thirdparty that will received element of the other)
6481
+     * @param  string[]    $tables        Tables that need to be changed
6482
+     * @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)
6483
+     * @return bool						  True if success, False if error
6484
+     */
6485
+    public static function commonReplaceThirdparty(DoliDB $db, $origin_id, $dest_id, array $tables, $ignoreerrors=0)
6486
+    {
6487
+        foreach ($tables as $table)
6488
+        {
6489
+            $sql = 'UPDATE '.MAIN_DB_PREFIX.$table.' SET fk_soc = '.$dest_id.' WHERE fk_soc = '.$origin_id;
6490
+
6491
+            if (! $db->query($sql))
6492
+            {
6493
+                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
+                //$this->errors = $db->lasterror();
6495
+                return false;
6496
+            }
6497
+        }
6498
+
6499
+        return true;
6500
+    }
6501
+
6502
+    /**
6503
+     * Get buy price to use for margin calculation. This function is called when buy price is unknown.
6504
+     *	 Set buy price = sell price if ForceBuyingPriceIfNull configured,
6505
+     *   else if calculation MARGIN_TYPE = 'costprice' and costprice is defined, use costprice as buyprice
6506
+     *	 else if calculation MARGIN_TYPE = 'pmp' and pmp is calculated, use pmp as buyprice
6507
+     *	 else set min buy price as buy price
6508
+     *
6509
+     * @param float		$unitPrice		 Product unit price
6510
+     * @param float		$discountPercent Line discount percent
6511
+     * @param int		$fk_product		 Product id
6512
+     * @return	float                    <0 if KO, buyprice if OK
6513
+     */
6514
+    public function defineBuyPrice($unitPrice = 0.0, $discountPercent = 0.0, $fk_product = 0)
6515
+    {
6516
+        global $conf;
6517
+
6518
+        $buyPrice = 0;
6519
+
6520
+        if (($unitPrice > 0) && (isset($conf->global->ForceBuyingPriceIfNull) && $conf->global->ForceBuyingPriceIfNull == 1)) // In most cases, test here is false
6521
+        {
6522
+            $buyPrice = $unitPrice * (1 - $discountPercent / 100);
6523
+        }
6524
+        else
6525
+        {
6526
+            // Get cost price for margin calculation
6527
+            if (! empty($fk_product))
6528
+            {
6529
+                if (isset($conf->global->MARGIN_TYPE) && $conf->global->MARGIN_TYPE == 'costprice')
6530
+                {
6531
+                    require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
6532
+                    $product = new Product($this->db);
6533
+                    $result = $product->fetch($fk_product);
6534
+                    if ($result <= 0)
6535
+                    {
6536
+                        $this->errors[] = 'ErrorProductIdDoesNotExists';
6537
+                        return -1;
6538
+                    }
6539
+                    if ($product->cost_price > 0)
6540
+                    {
6541
+                        $buyPrice = $product->cost_price;
6542
+                    }
6543
+                    else if ($product->pmp > 0)
6544
+                    {
6545
+                        $buyPrice = $product->pmp;
6546
+                    }
6547
+                }
6548
+                else if (isset($conf->global->MARGIN_TYPE) && $conf->global->MARGIN_TYPE == 'pmp')
6549
+                {
6550
+                    require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
6551
+                    $product = new Product($this->db);
6552
+                    $result = $product->fetch($fk_product);
6553
+                    if ($result <= 0)
6554
+                    {
6555
+                        $this->errors[] = 'ErrorProductIdDoesNotExists';
6556
+                        return -1;
6557
+                    }
6558
+                    if ($product->pmp > 0)
6559
+                    {
6560
+                        $buyPrice = $product->pmp;
6561
+                    }
6562
+                }
6563
+
6564
+                if (empty($buyPrice) && isset($conf->global->MARGIN_TYPE) && in_array($conf->global->MARGIN_TYPE, array('1','pmp','costprice')))
6565
+                {
6566
+                    require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.product.class.php';
6567
+                    $productFournisseur = new ProductFournisseur($this->db);
6568
+                    if (($result = $productFournisseur->find_min_price_product_fournisseur($fk_product)) > 0)
6569
+                    {
6570
+                        $buyPrice = $productFournisseur->fourn_unitprice;
6571
+                    }
6572
+                    else if ($result < 0)
6573
+                    {
6574
+                        $this->errors[] = $productFournisseur->error;
6575
+                        return -2;
6576
+                    }
6577
+                }
6578
+            }
6579
+        }
6580
+        return $buyPrice;
6581
+    }
6582
+
6583
+    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
6584
+    /**
6585
+     *  Show photos of an object (nbmax maximum), into several columns
6586
+     *
6587
+     *  @param		string	$modulepart		'product', 'ticket', ...
6588
+     *  @param      string	$sdir        	Directory to scan (full absolute path)
6589
+     *  @param      int		$size        	0=original size, 1='small' use thumbnail if possible
6590
+     *  @param      int		$nbmax       	Nombre maximum de photos (0=pas de max)
6591
+     *  @param      int		$nbbyrow     	Number of image per line or -1 to use div. Used only if size=1.
6592
+     * 	@param		int		$showfilename	1=Show filename
6593
+     * 	@param		int		$showaction		1=Show icon with action links (resize, delete)
6594
+     * 	@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.
6595
+     * 	@param		int		$maxWidth		Max width of original image when size='small'
6596
+     *  @param      int     $nolink         Do not add a href link to view enlarged imaged into a new tab
6597
+     *  @param      int     $notitle        Do not add title tag on image
6598
+     *  @param		int		$usesharelink	Use the public shared link of image (if not available, the 'nophoto' image will be shown instead)
6599
+     *  @return     string					Html code to show photo. Number of photos shown is saved in this->nbphoto
6600
+     */
6601
+    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
+    {
6603
+        // phpcs:enable
6604
+        global $conf,$user,$langs;
6605
+
6606
+        include_once DOL_DOCUMENT_ROOT .'/core/lib/files.lib.php';
6607
+        include_once DOL_DOCUMENT_ROOT .'/core/lib/images.lib.php';
6608
+
6609
+        $sortfield='position_name';
6610
+        $sortorder='asc';
6611
+
6612
+        $dir = $sdir . '/';
6613
+        $pdir = '/';
6614
+        if ($modulepart == 'ticket')
6615
+        {
6616
+            $dir .= get_exdir(0, 0, 0, 0, $this, $modulepart).$this->track_id.'/';
6617
+            $pdir .= get_exdir(0, 0, 0, 0, $this, $modulepart).$this->track_id.'/';
6618
+        }
6619
+        else
6620
+        {
6621
+            $dir .= get_exdir(0, 0, 0, 0, $this, $modulepart).$this->ref.'/';
6622
+            $pdir .= get_exdir(0, 0, 0, 0, $this, $modulepart).$this->ref.'/';
6623
+        }
6624
+
6625
+        // For backward compatibility
6626
+        if ($modulepart == 'product' && ! empty($conf->global->PRODUCT_USE_OLD_PATH_FOR_PHOTO))
6627
+        {
6628
+            $dir = $sdir . '/'. get_exdir($this->id,2,0,0,$this,$modulepart) . $this->id ."/photos/";
6629
+            $pdir = '/' . get_exdir($this->id,2,0,0,$this,$modulepart) . $this->id ."/photos/";
6630
+        }
6631
+
6632
+        // Defined relative dir to DOL_DATA_ROOT
6633
+        $relativedir = '';
6634
+        if ($dir)
6635
+        {
6636
+            $relativedir = preg_replace('/^'.preg_quote(DOL_DATA_ROOT,'/').'/', '', $dir);
6637
+            $relativedir = preg_replace('/^[\\/]/','',$relativedir);
6638
+            $relativedir = preg_replace('/[\\/]$/','',$relativedir);
6639
+        }
6640
+
6641
+        $dirthumb = $dir.'thumbs/';
6642
+        $pdirthumb = $pdir.'thumbs/';
6643
+
6644
+        $return ='<!-- Photo -->'."\n";
6645
+        $nbphoto=0;
6646
+
6647
+        $filearray=dol_dir_list($dir,"files",0,'','(\.meta|_preview.*\.png)$',$sortfield,(strtolower($sortorder)=='desc'?SORT_DESC:SORT_ASC),1);
6648
+
6649
+        /*if (! empty($conf->global->PRODUCT_USE_OLD_PATH_FOR_PHOTO))    // For backward compatiblity, we scan also old dirs
6650
+		 {
6651
+		 $filearrayold=dol_dir_list($dirold,"files",0,'','(\.meta|_preview.*\.png)$',$sortfield,(strtolower($sortorder)=='desc'?SORT_DESC:SORT_ASC),1);
6652
+		 $filearray=array_merge($filearray, $filearrayold);
6653
+		 }*/
6654
+
6655
+        completeFileArrayWithDatabaseInfo($filearray, $relativedir);
6656
+
6657
+        if (count($filearray))
6658
+        {
6659
+            if ($sortfield && $sortorder)
6660
+            {
6661
+                $filearray=dol_sort_array($filearray, $sortfield, $sortorder);
6662
+            }
6663
+
6664
+            foreach($filearray as $key => $val)
6665
+            {
6666
+                $photo='';
6667
+                $file = $val['name'];
6668
+
6669
+                //if (! utf8_check($file)) $file=utf8_encode($file);	// To be sure file is stored in UTF8 in memory
6670
+
6671
+                //if (dol_is_file($dir.$file) && image_format_supported($file) >= 0)
6672
+                if (image_format_supported($file) >= 0)
6673
+                {
6674
+                    $nbphoto++;
6675
+                    $photo = $file;
6676
+                    $viewfilename = $file;
6677
+
6678
+                    if ($size == 1 || $size == 'small') {   // Format vignette
6679
+
6680
+                        // Find name of thumb file
6681
+                        $photo_vignette=basename(getImageFileNameForSize($dir.$file, '_small'));
6682
+                        if (! dol_is_file($dirthumb.$photo_vignette)) $photo_vignette='';
6683
+
6684
+                        // Get filesize of original file
6685
+                        $imgarray=dol_getImageSize($dir.$photo);
6686
+
6687
+                        if ($nbbyrow > 0)
6688
+                        {
6689
+                            if ($nbphoto == 1) $return.= '<table width="100%" valign="top" align="center" border="0" cellpadding="2" cellspacing="2">';
6690
+
6691
+                            if ($nbphoto % $nbbyrow == 1) $return.= '<tr align=center valign=middle border=1>';
6692
+                            $return.= '<td width="'.ceil(100/$nbbyrow).'%" class="photo">';
6693
+                        }
6694
+                        else if ($nbbyrow < 0) $return .= '<div class="inline-block">';
6695
+
6696
+                        $return.= "\n";
6697
+
6698
+                        $relativefile=preg_replace('/^\//', '', $pdir.$photo);
6699
+                        if (empty($nolink))
6700
+                        {
6701
+                            $urladvanced=getAdvancedPreviewUrl($modulepart, $relativefile, 0, 'entity='.$this->entity);
6702
+                            if ($urladvanced) $return.='<a href="'.$urladvanced.'">';
6703
+                            else $return.= '<a href="'.DOL_URL_ROOT.'/viewimage.php?modulepart='.$modulepart.'&entity='.$this->entity.'&file='.urlencode($pdir.$photo).'" class="aphoto" target="_blank">';
6704
+                        }
6705
+
6706
+                        // Show image (width height=$maxHeight)
6707
+                        // Si fichier vignette disponible et image source trop grande, on utilise la vignette, sinon on utilise photo origine
6708
+                        $alt=$langs->transnoentitiesnoconv('File').': '.$relativefile;
6709
+                        $alt.=' - '.$langs->transnoentitiesnoconv('Size').': '.$imgarray['width'].'x'.$imgarray['height'];
6710
+                        if ($notitle) $alt='';
6711
+
6712
+                        if ($usesharelink)
6713
+                        {
6714
+                            if ($val['share'])
6715
+                            {
6716
+                                if (empty($maxHeight) || $photo_vignette && $imgarray['height'] > $maxHeight)
6717
+                                {
6718
+                                    $return.= '<!-- Show original file (thumb not yet available with shared links) -->';
6719
+                                    $return.= '<img class="photo photowithmargin" border="0" height="'.$maxHeight.'" src="'.DOL_URL_ROOT.'/viewimage.php?hashp='.urlencode($val['share']).'" title="'.dol_escape_htmltag($alt).'">';
6720
+                                }
6721
+                                else {
6722
+                                    $return.= '<!-- Show original file -->';
6723
+                                    $return.= '<img class="photo photowithmargin" border="0" height="'.$maxHeight.'" src="'.DOL_URL_ROOT.'/viewimage.php?hashp='.urlencode($val['share']).'" title="'.dol_escape_htmltag($alt).'">';
6724
+                                }
6725
+                            }
6726
+                            else
6727
+                            {
6728
+                                $return.= '<!-- Show nophoto file (because file is not shared) -->';
6729
+                                $return.= '<img class="photo photowithmargin" border="0" height="'.$maxHeight.'" src="'.DOL_URL_ROOT.'/public/theme/common/nophoto.png" title="'.dol_escape_htmltag($alt).'">';
6730
+                            }
6731
+                        }
6732
+                        else
6733
+                        {
6734
+                            if (empty($maxHeight) || $photo_vignette && $imgarray['height'] > $maxHeight)
6735
+                            {
6736
+                                $return.= '<!-- Show thumb -->';
6737
+                                $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).'">';
6738
+                            }
6739
+                            else {
6740
+                                $return.= '<!-- Show original file -->';
6741
+                                $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).'">';
6742
+                            }
6743
+                        }
6744
+
6745
+                        if (empty($nolink)) $return.= '</a>';
6746
+                        $return.="\n";
6747
+
6748
+                        if ($showfilename) $return.= '<br>'.$viewfilename;
6749
+                        if ($showaction)
6750
+                        {
6751
+                            $return.= '<br>';
6752
+                            // On propose la generation de la vignette si elle n'existe pas et si la taille est superieure aux limites
6753
+                            if ($photo_vignette && (image_format_supported($photo) > 0) && ($this->imgWidth > $maxWidth || $this->imgHeight > $maxHeight))
6754
+                            {
6755
+                                $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
+                            }
6757
+                            // Special cas for product
6758
+                            if ($modulepart == 'product' && ($user->rights->produit->creer || $user->rights->service->creer))
6759
+                            {
6760
+                                // Link to resize
6761
+                                $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
+
6763
+                                // Link to delete
6764
+                                $return.= '<a href="'.$_SERVER["PHP_SELF"].'?id='.$this->id.'&amp;action=delete&amp;file='.urlencode($pdir.$viewfilename).'">';
6765
+                                $return.= img_delete().'</a>';
6766
+                            }
6767
+                        }
6768
+                        $return.= "\n";
6769
+
6770
+                        if ($nbbyrow > 0)
6771
+                        {
6772
+                            $return.= '</td>';
6773
+                            if (($nbphoto % $nbbyrow) == 0) $return.= '</tr>';
6774
+                        }
6775
+                        else if ($nbbyrow < 0) $return.='</div>';
6776
+                    }
6777
+
6778
+                    if (empty($size)) {     // Format origine
6779
+                        $return.= '<img class="photo photowithmargin" border="0" src="'.DOL_URL_ROOT.'/viewimage.php?modulepart='.$modulepart.'&entity='.$this->entity.'&file='.urlencode($pdir.$photo).'">';
6780
+
6781
+                        if ($showfilename) $return.= '<br>'.$viewfilename;
6782
+                        if ($showaction)
6783
+                        {
6784
+                            // Special case for product
6785
+                            if ($modulepart == 'product' && ($user->rights->produit->creer || $user->rights->service->creer))
6786
+                            {
6787
+                                // Link to resize
6788
+                                $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
+
6790
+                                // Link to delete
6791
+                                $return.= '<a href="'.$_SERVER["PHP_SELF"].'?id='.$this->id.'&amp;action=delete&amp;file='.urlencode($pdir.$viewfilename).'">';
6792
+                                $return.= img_delete().'</a>';
6793
+                            }
6794
+                        }
6795
+                    }
6796
+
6797
+                    // On continue ou on arrete de boucler ?
6798
+                    if ($nbmax && $nbphoto >= $nbmax) break;
6799
+                }
6800
+            }
6801
+
6802
+            if ($size==1 || $size=='small')
6803
+            {
6804
+                if ($nbbyrow > 0)
6805
+                {
6806
+                    // Ferme tableau
6807
+                    while ($nbphoto % $nbbyrow)
6808
+                    {
6809
+                        $return.= '<td width="'.ceil(100/$nbbyrow).'%">&nbsp;</td>';
6810
+                        $nbphoto++;
6811
+                    }
6812
+
6813
+                    if ($nbphoto) $return.= '</table>';
6814
+                }
6815
+            }
6816
+        }
6817
+
6818
+        $this->nbphoto = $nbphoto;
6819
+
6820
+        return $return;
6821
+    }
6822
+
6823
+
6824
+    /**
6825
+     * Function test if type is array
6826
+     *
6827
+     * @param   array   $info   content informations of field
6828
+     * @return                  bool
6829
+     */
6830
+    protected function isArray($info)
6831
+    {
6832
+        if(is_array($info))
6833
+        {
6834
+            if(isset($info['type']) && $info['type']=='array') return true;
6835
+            else return false;
6836
+        }
6837
+        else return false;
6838
+    }
6839
+
6840
+    /**
6841
+     * Function test if type is null
6842
+     *
6843
+     * @param   array   $info   content informations of field
6844
+     * @return                  bool
6845
+     */
6846
+    protected function isNull($info)
6847
+    {
6848
+        if(is_array($info))
6849
+        {
6850
+            if(isset($info['type']) && $info['type']=='null') return true;
6851
+            else return false;
6852
+        }
6853
+        else return false;
6854
+    }
6855
+
6856
+    /**
6857
+     * Function test if type is date
6858
+     *
6859
+     * @param   array   $info   content informations of field
6860
+     * @return                  bool
6861
+     */
6862
+    public function isDate($info)
6863
+    {
6864
+        if(isset($info['type']) && ($info['type']=='date' || $info['type']=='datetime' || $info['type']=='timestamp')) return true;
6865
+        else return false;
6866
+    }
6867
+
6868
+    /**
6869
+     * Function test if type is integer
6870
+     *
6871
+     * @param   array   $info   content informations of field
6872
+     * @return                  bool
6873
+     */
6874
+    public function isInt($info)
6875
+    {
6876
+        if(is_array($info))
6877
+        {
6878
+            if(isset($info['type']) && ($info['type']=='int' || preg_match('/^integer/i',$info['type']) ) ) return true;
6879
+            else return false;
6880
+        }
6881
+        else return false;
6882
+    }
6883
+
6884
+    /**
6885
+     * Function test if type is float
6886
+     *
6887
+     * @param   array   $info   content informations of field
6888
+     * @return                  bool
6889
+     */
6890
+    public function isFloat($info)
6891
+    {
6892
+        if(is_array($info))
6893
+        {
6894
+            if (isset($info['type']) && (preg_match('/^(double|real)/i', $info['type']))) return true;
6895
+            else return false;
6896
+        }
6897
+        else return false;
6898
+    }
6899
+
6900
+    /**
6901
+     * Function test if type is text
6902
+     *
6903
+     * @param   array   $info   content informations of field
6904
+     * @return                  bool
6905
+     */
6906
+    public function isText($info)
6907
+    {
6908
+        if(is_array($info))
6909
+        {
6910
+            if(isset($info['type']) && $info['type']=='text') return true;
6911
+            else return false;
6912
+        }
6913
+        else return false;
6914
+    }
6915
+
6916
+    /**
6917
+     * Function test if is indexed
6918
+     *
6919
+     * @param   array   $info   content informations of field
6920
+     * @return                  bool
6921
+     */
6922
+    protected function isIndex($info)
6923
+    {
6924
+        if(is_array($info))
6925
+        {
6926
+            if(isset($info['index']) && $info['index']==true) return true;
6927
+            else return false;
6928
+        }
6929
+        else return false;
6930
+    }
6931
+
6932
+    /**
6933
+     * Function to prepare the values to insert.
6934
+     * Note $this->${field} are set by the page that make the createCommon or the updateCommon.
6935
+     *
6936
+     * @return array
6937
+     */
6938
+    protected function setSaveQuery()
6939
+    {
6940
+        global $conf;
6941
+
6942
+        $queryarray=array();
6943
+        foreach ($this->fields as $field=>$info)	// Loop on definition of fields
6944
+        {
6945
+            // Depending on field type ('datetime', ...)
6946
+            if($this->isDate($info))
6947
+            {
6948
+                if(empty($this->{$field}))
6949
+                {
6950
+                    $queryarray[$field] = null;
6951
+                }
6952
+                else
6953
+                {
6954
+                    $queryarray[$field] = $this->db->idate($this->{$field});
6955
+                }
6956
+            }
6957
+            else if($this->isArray($info))
6958
+            {
6959
+                if(! empty($this->{$field})) {
6960
+                    if(! is_array($this->{$field})) {
6961
+                        $this->{$field} = array($this->{$field});
6962
+                    }
6963
+                    $queryarray[$field] = serialize($this->{$field});
6964
+                } else {
6965
+                    $queryarray[$field] = null;
6966
+                }
6967
+            }
6968
+            else if($this->isInt($info))
6969
+            {
6970
+                if ($field == 'entity' && is_null($this->{$field})) $queryarray[$field]=$conf->entity;
6971
+                else
6972
+                {
6973
+                    $queryarray[$field] = (int) price2num($this->{$field});
6974
+                    if (empty($queryarray[$field])) $queryarray[$field]=0;		// May be reset to null later if property 'notnull' is -1 for this field.
6975
+                }
6976
+            }
6977
+            else if($this->isFloat($info))
6978
+            {
6979
+                $queryarray[$field] = (double) price2num($this->{$field});
6980
+                if (empty($queryarray[$field])) $queryarray[$field]=0;
6981
+            }
6982
+            else
6983
+            {
6984
+                $queryarray[$field] = $this->{$field};
6985
+            }
6986
+
6987
+            if ($info['type'] == 'timestamp' && empty($queryarray[$field])) unset($queryarray[$field]);
6988
+            if (! empty($info['notnull']) && $info['notnull'] == -1 && empty($queryarray[$field])) $queryarray[$field] = null;
6989
+        }
6990
+
6991
+        return $queryarray;
6992
+    }
6993
+
6994
+    /**
6995
+     * Function to load data from a SQL pointer into properties of current object $this
6996
+     *
6997
+     * @param   stdClass    $obj    Contain data of object from database
6998
+     * @return void
6999
+     */
7000
+    protected function setVarsFromFetchObj(&$obj)
7001
+    {
7002
+        foreach ($this->fields as $field => $info)
7003
+        {
7004
+            if($this->isDate($info))
7005
+            {
7006
+                if(empty($obj->{$field}) || $obj->{$field} === '0000-00-00 00:00:00' || $obj->{$field} === '1000-01-01 00:00:00') $this->{$field} = 0;
7007
+                else $this->{$field} = strtotime($obj->{$field});
7008
+            }
7009
+            elseif($this->isArray($info))
7010
+            {
7011
+                if(! empty($obj->{$field})) {
7012
+                    $this->{$field} = @unserialize($obj->{$field});
7013
+                    // Hack for data not in UTF8
7014
+                    if($this->{$field } === false) @unserialize(utf8_decode($obj->{$field}));
7015
+                } else {
7016
+                    $this->{$field} = array();
7017
+                }
7018
+            }
7019
+            elseif($this->isInt($info))
7020
+            {
7021
+                if ($field == 'rowid') $this->id = (int) $obj->{$field};
7022
+                else $this->{$field} = (int) $obj->{$field};
7023
+            }
7024
+            elseif($this->isFloat($info))
7025
+            {
7026
+                $this->{$field} = (double) $obj->{$field};
7027
+            }
7028
+            elseif($this->isNull($info))
7029
+            {
7030
+                $val = $obj->{$field};
7031
+                // zero is not null
7032
+                $this->{$field} = (is_null($val) || (empty($val) && $val!==0 && $val!=='0') ? null : $val);
7033
+            }
7034
+            else
7035
+            {
7036
+                $this->{$field} = $obj->{$field};
7037
+            }
7038
+        }
7039
+
7040
+        // If there is no 'ref' field, we force property ->ref to ->id for a better compatibility with common functions.
7041
+        if (! isset($this->fields['ref']) && isset($this->id)) $this->ref = $this->id;
7042
+    }
7043
+
7044
+    /**
7045
+     * Function to concat keys of fields
7046
+     *
7047
+     * @return string
7048
+     */
7049
+    protected function getFieldList()
7050
+    {
7051
+        $keys = array_keys($this->fields);
7052
+        return implode(',', $keys);
7053
+    }
7054
+
7055
+    /**
7056
+     * Add quote to field value if necessary
7057
+     *
7058
+     * @param 	string|int	$value			Value to protect
7059
+     * @param	array		$fieldsentry	Properties of field
7060
+     * @return 	string
7061
+     */
7062
+    protected function quote($value, $fieldsentry)
7063
+    {
7064
+        if (is_null($value)) return 'NULL';
7065
+        else if (preg_match('/^(int|double|real)/i', $fieldsentry['type'])) return $this->db->escape("$value");
7066
+        else return "'".$this->db->escape($value)."'";
7067
+    }
7068
+
7069
+
7070
+    /**
7071
+     * Create object into database
7072
+     *
7073
+     * @param  User $user      User that creates
7074
+     * @param  bool $notrigger false=launch triggers after, true=disable triggers
7075
+     * @return int             <0 if KO, Id of created object if OK
7076
+     */
7077
+    public function createCommon(User $user, $notrigger = false)
7078
+    {
7079
+        global $langs;
6095 7080
 
6096
-				$obj = $this->db->fetch_object($resql);
7081
+        $error = 0;
6097 7082
 
6098
-				// Several field into label (eq table:code|libelle:rowid)
6099
-				$fields_label = explode('|',$InfoFieldList[1]);
7083
+        $now=dol_now();
6100 7084
 
6101
-				if(is_array($fields_label) && count($fields_label)>1)
6102
-				{
6103
-					foreach ($fields_label as $field_toshow)
6104
-					{
6105
-						$translabel='';
6106
-						if (!empty($obj->$field_toshow)) {
6107
-							$translabel=$langs->trans($obj->$field_toshow);
6108
-						}
6109
-						if ($translabel!=$field_toshow) {
6110
-							$value.=dol_trunc($translabel,18).' ';
6111
-						}else {
6112
-							$value.=$obj->$field_toshow.' ';
6113
-						}
6114
-					}
6115
-				}
6116
-				else
6117
-				{
6118
-					$translabel='';
6119
-					if (!empty($obj->{$InfoFieldList[1]})) {
6120
-						$translabel=$langs->trans($obj->{$InfoFieldList[1]});
6121
-					}
6122
-					if ($translabel!=$obj->{$InfoFieldList[1]}) {
6123
-						$value=dol_trunc($translabel,18);
6124
-					}else {
6125
-						$value=$obj->{$InfoFieldList[1]};
6126
-					}
6127
-				}
6128
-			}
6129
-			else dol_syslog(get_class($this).'::showOutputField error '.$this->db->lasterror(), LOG_WARNING);
6130
-		}
6131
-		elseif ($type == 'radio')
6132
-		{
6133
-			$value=$param['options'][$value];
6134
-		}
6135
-		elseif ($type == 'checkbox')
6136
-		{
6137
-			$value_arr=explode(',',$value);
6138
-			$value='';
6139
-			if (is_array($value_arr) && count($value_arr)>0)
6140
-			{
6141
-				foreach ($value_arr as $keyval=>$valueval) {
6142
-					$toprint[]='<li class="select2-search-choice-dolibarr noborderoncategories" style="background: #aaa">'.$param['options'][$valueval].'</li>';
6143
-				}
6144
-				$value='<div class="select2-container-multi-dolibarr" style="width: 90%;"><ul class="select2-choices-dolibarr">'.implode(' ', $toprint).'</ul></div>';
6145
-			}
6146
-		}
6147
-		elseif ($type == 'chkbxlst')
6148
-		{
6149
-			$value_arr = explode(',', $value);
6150
-
6151
-			$param_list = array_keys($param['options']);
6152
-			$InfoFieldList = explode(":", $param_list[0]);
6153
-
6154
-			$selectkey = "rowid";
6155
-			$keyList = 'rowid';
6156
-
6157
-			if (count($InfoFieldList) >= 3) {
6158
-				$selectkey = $InfoFieldList[2];
6159
-				$keyList = $InfoFieldList[2] . ' as rowid';
6160
-			}
6161
-
6162
-			$fields_label = explode('|', $InfoFieldList[1]);
6163
-			if (is_array($fields_label)) {
6164
-				$keyList .= ', ';
6165
-				$keyList .= implode(', ', $fields_label);
6166
-			}
6167
-
6168
-			$sql = 'SELECT ' . $keyList;
6169
-			$sql .= ' FROM ' . MAIN_DB_PREFIX . $InfoFieldList[0];
6170
-			if (strpos($InfoFieldList[4], 'extra') !== false) {
6171
-				$sql .= ' as main';
6172
-			}
6173
-			// $sql.= " WHERE ".$selectkey."='".$this->db->escape($value)."'";
6174
-			// $sql.= ' AND entity = '.$conf->entity;
6175
-
6176
-			dol_syslog(get_class($this) . ':showOutputField:$type=chkbxlst',LOG_DEBUG);
6177
-			$resql = $this->db->query($sql);
6178
-			if ($resql) {
6179
-				$value = ''; // value was used, so now we reste it to use it to build final output
6180
-				$toprint=array();
6181
-				while ( $obj = $this->db->fetch_object($resql) ) {
6182
-
6183
-					// Several field into label (eq table:code|libelle:rowid)
6184
-					$fields_label = explode('|', $InfoFieldList[1]);
6185
-					if (is_array($value_arr) && in_array($obj->rowid, $value_arr)) {
6186
-						if (is_array($fields_label) && count($fields_label) > 1) {
6187
-							foreach ( $fields_label as $field_toshow ) {
6188
-								$translabel = '';
6189
-								if (! empty($obj->$field_toshow)) {
6190
-									$translabel = $langs->trans($obj->$field_toshow);
6191
-								}
6192
-								if ($translabel != $field_toshow) {
6193
-									$toprint[]='<li class="select2-search-choice-dolibarr noborderoncategories" style="background: #aaa">'.dol_trunc($translabel, 18).'</li>';
6194
-								} else {
6195
-									$toprint[]='<li class="select2-search-choice-dolibarr noborderoncategories" style="background: #aaa">'.$obj->$field_toshow.'</li>';
6196
-								}
6197
-							}
6198
-						} else {
6199
-							$translabel = '';
6200
-							if (! empty($obj->{$InfoFieldList[1]})) {
6201
-								$translabel = $langs->trans($obj->{$InfoFieldList[1]});
6202
-							}
6203
-							if ($translabel != $obj->{$InfoFieldList[1]}) {
6204
-								$toprint[]='<li class="select2-search-choice-dolibarr noborderoncategories" style="background: #aaa">'.dol_trunc($translabel, 18).'</li>';
6205
-							} else {
6206
-								$toprint[]='<li class="select2-search-choice-dolibarr noborderoncategories" style="background: #aaa">'.$obj->{$InfoFieldList[1]}.'</li>';
6207
-							}
6208
-						}
6209
-					}
6210
-				}
6211
-				$value='<div class="select2-container-multi-dolibarr" style="width: 90%;"><ul class="select2-choices-dolibarr">'.implode(' ', $toprint).'</ul></div>';
6212
-			} else {
6213
-				dol_syslog(get_class($this) . '::showOutputField error ' . $this->db->lasterror(), LOG_WARNING);
6214
-			}
6215
-		}
6216
-		elseif ($type == 'link')
6217
-		{
6218
-			$out='';
6219
-
6220
-			// only if something to display (perf)
6221
-			if ($value)
6222
-			{
6223
-				$param_list=array_keys($param['options']);				// $param_list='ObjectName:classPath'
7085
+        $fieldvalues = $this->setSaveQuery();
7086
+        if (array_key_exists('date_creation', $fieldvalues) && empty($fieldvalues['date_creation'])) $fieldvalues['date_creation']=$this->db->idate($now);
7087
+        if (array_key_exists('fk_user_creat', $fieldvalues) && ! ($fieldvalues['fk_user_creat'] > 0)) $fieldvalues['fk_user_creat']=$user->id;
7088
+        unset($fieldvalues['rowid']);	// The field 'rowid' is reserved field name for autoincrement field so we don't need it into insert.
6224 7089
 
6225
-				$InfoFieldList = explode(":", $param_list[0]);
6226
-				$classname=$InfoFieldList[0];
6227
-				$classpath=$InfoFieldList[1];
6228
-				$getnomurlparam=(empty($InfoFieldList[2]) ? 3 : $InfoFieldList[2]);
6229
-				if (! empty($classpath))
6230
-				{
6231
-					dol_include_once($InfoFieldList[1]);
6232
-					if ($classname && class_exists($classname))
6233
-					{
6234
-						$object = new $classname($this->db);
6235
-						$object->fetch($value);
6236
-						$value=$object->getNomUrl($getnomurlparam);
6237
-					}
6238
-				}
6239
-				else
6240
-				{
6241
-					dol_syslog('Error bad setup of extrafield', LOG_WARNING);
6242
-					return 'Error bad setup of extrafield';
6243
-				}
6244
-			}
6245
-			else $value='';
6246
-		}
6247
-		elseif ($type == 'text' || $type == 'html')
6248
-		{
6249
-			$value=dol_htmlentitiesbr($value);
6250
-		}
6251
-		elseif ($type == 'password')
6252
-		{
6253
-			$value=preg_replace('/./i','*',$value);
6254
-		}
6255
-		elseif ($type == 'array')
6256
-		{
6257
-			$value = implode('<br>', $value);
6258
-		}
6259
-
6260
-		//print $type.'-'.$size;
6261
-		$out=$value;
6262
-
6263
-		return $out;
6264
-	}
6265
-
6266
-
6267
-	/**
6268
-	 * Function to show lines of extrafields with output datas
6269
-	 *
6270
-	 * @param 	Extrafields $extrafields    Extrafield Object
6271
-	 * @param 	string      $mode           Show output (view) or input (edit) for extrafield
6272
-	 * @param 	array       $params         Optional parameters. Example: array('style'=>'class="oddeven"', 'colspan'=>$colspan)
6273
-	 * @param 	string      $keysuffix      Suffix string to add after name and id of field (can be used to avoid duplicate names)
6274
-	 * @param 	string      $keyprefix      Prefix string to add before name and id of field (can be used to avoid duplicate names)
6275
-	 * @param	string		$onetrtd		All fields in same tr td
6276
-	 * @return 	string
6277
-	 */
6278
-	function showOptionals($extrafields, $mode='view', $params=null, $keysuffix='', $keyprefix='', $onetrtd=0)
6279
-	{
6280
-		global $db, $conf, $langs, $action, $form;
6281
-
6282
-		if (! is_object($form)) $form=new Form($db);
6283
-
6284
-		$out = '';
6285
-
6286
-		if (is_array($extrafields->attributes[$this->table_element]['label']) && count($extrafields->attributes[$this->table_element]['label']) > 0)
6287
-		{
6288
-			$out .= "\n";
6289
-			$out .= '<!-- showOptionalsInput --> ';
6290
-			$out .= "\n";
6291
-
6292
-			$e = 0;
6293
-			foreach($extrafields->attributes[$this->table_element]['label'] as $key=>$label)
6294
-			{
6295
-				// Show only the key field in params
6296
-				if (is_array($params) && array_key_exists('onlykey',$params) && $key != $params['onlykey']) continue;
7090
+        $keys=array();
7091
+        $values = array();
7092
+        foreach ($fieldvalues as $k => $v) {
7093
+            $keys[$k] = $k;
7094
+            $value = $this->fields[$k];
7095
+            $values[$k] = $this->quote($v, $value);
7096
+        }
6297 7097
 
6298
-				$enabled = 1;
6299
-				if ($enabled && isset($extrafields->attributes[$this->table_element]['list'][$key]))
6300
-				{
6301
-					$enabled = dol_eval($extrafields->attributes[$this->table_element]['list'][$key], 1);
6302
-				}
7098
+        // Clean and check mandatory
7099
+        foreach($keys as $key)
7100
+        {
7101
+            // If field is an implicit foreign key field
7102
+            if (preg_match('/^integer:/i', $this->fields[$key]['type']) && $values[$key] == '-1') $values[$key]='';
7103
+            if (! empty($this->fields[$key]['foreignkey']) && $values[$key] == '-1') $values[$key]='';
6303 7104
 
6304
-				$perms = 1;
6305
-				if ($perms && isset($extrafields->attributes[$this->table_element]['perms'][$key]))
6306
-				{
6307
-					$perms = dol_eval($extrafields->attributes[$this->table_element]['perms'][$key], 1);
6308
-				}
7105
+            //var_dump($key.'-'.$values[$key].'-'.($this->fields[$key]['notnull'] == 1));
7106
+            if (isset($this->fields[$key]['notnull']) && $this->fields[$key]['notnull'] == 1 && ! isset($values[$key]) && is_null($val['default']))
7107
+            {
7108
+                $error++;
7109
+                $this->errors[]=$langs->trans("ErrorFieldRequired", $this->fields[$key]['label']);
7110
+            }
6309 7111
 
6310
-				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 (empty($perms)) continue;
7112
+            // If field is an implicit foreign key field
7113
+            if (preg_match('/^integer:/i', $this->fields[$key]['type']) && empty($values[$key])) $values[$key]='null';
7114
+            if (! empty($this->fields[$key]['foreignkey']) && empty($values[$key])) $values[$key]='null';
7115
+        }
6312 7116
 
6313
-				// Load language if required
6314
-				if (! empty($extrafields->attributes[$this->table_element]['langfile'][$key])) $langs->load($extrafields->attributes[$this->table_element]['langfile'][$key]);
7117
+        if ($error) return -1;
6315 7118
 
6316
-				$colspan='3';
6317
-				if (is_array($params) && count($params)>0) {
6318
-					if (array_key_exists('colspan',$params)) {
6319
-						$colspan=$params['colspan'];
6320
-					}
6321
-				}
7119
+        $this->db->begin();
6322 7120
 
6323
-				switch($mode) {
6324
-					case "view":
6325
-						$value=$this->array_options["options_".$key.$keysuffix];
6326
-						break;
6327
-					case "edit":
6328
-						$getposttemp = GETPOST($keyprefix.'options_'.$key.$keysuffix, 'none');				// GETPOST can get value from GET, POST or setup of default values.
6329
-						// GETPOST("options_" . $key) can be 'abc' or array(0=>'abc')
6330
-						if (is_array($getposttemp) || $getposttemp != '' || GETPOSTISSET($keyprefix.'options_'.$key.$keysuffix))
6331
-						{
6332
-							if (is_array($getposttemp)) {
6333
-								// $getposttemp is an array but following code expects a comma separated string
6334
-								$value = implode(",", $getposttemp);
6335
-							} else {
6336
-								$value = $getposttemp;
6337
-							}
6338
-						} else {
6339
-							$value = $this->array_options["options_" . $key];			// No GET, no POST, no default value, so we take value of object.
6340
-						}
6341
-						//var_dump($keyprefix.' - '.$key.' - '.$keysuffix.' - '.$keyprefix.'options_'.$key.$keysuffix.' - '.$this->array_options["options_".$key.$keysuffix].' - '.$getposttemp.' - '.$value);
6342
-						break;
6343
-				}
7121
+        if (! $error)
7122
+        {
7123
+            $sql = 'INSERT INTO '.MAIN_DB_PREFIX.$this->table_element;
7124
+            $sql.= ' ('.implode( ", ", $keys ).')';
7125
+            $sql.= ' VALUES ('.implode( ", ", $values ).')';
7126
+
7127
+            $res = $this->db->query($sql);
7128
+            if ($res===false) {
7129
+                $error++;
7130
+                $this->errors[] = $this->db->lasterror();
7131
+            }
7132
+        }
6344 7133
 
6345
-				if ($extrafields->attributes[$this->table_element]['type'][$key] == 'separate')
6346
-				{
6347
-					$out .= $extrafields->showSeparator($key, $this);
6348
-				}
6349
-				else
6350
-				{
6351
-					$csstyle='';
6352
-					$class=(!empty($extrafields->attributes[$this->table_element]['hidden'][$key]) ? 'hideobject ' : '');
6353
-					if (is_array($params) && count($params)>0) {
6354
-						if (array_key_exists('style',$params)) {
6355
-							$csstyle=$params['style'];
6356
-						}
6357
-					}
7134
+        if (! $error)
7135
+        {
7136
+            $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX . $this->table_element);
7137
+        }
6358 7138
 
6359
-					// add html5 elements
6360
-					$domData  = ' data-element="extrafield"';
6361
-					$domData .= ' data-targetelement="'.$this->element.'"';
6362
-					$domData .= ' data-targetid="'.$this->id.'"';
7139
+        // Create extrafields
7140
+        if (! $error)
7141
+        {
7142
+            $result=$this->insertExtraFields();
7143
+            if ($result < 0) $error++;
7144
+        }
6363 7145
 
6364
-					$html_id = !empty($this->id) ? 'extrarow-'.$this->element.'_'.$key.'_'.$this->id : '';
7146
+        // Triggers
7147
+        if (! $error && ! $notrigger)
7148
+        {
7149
+            // Call triggers
7150
+            $result=$this->call_trigger(strtoupper(get_class($this)).'_CREATE',$user);
7151
+            if ($result < 0) { $error++; }
7152
+            // End call triggers
7153
+        }
6365 7154
 
6366
-					$out .= '<tr id="'.$html_id.'" '.$csstyle.' class="'.$class.$this->element.'_extras_'.$key.'" '.$domData.' >';
7155
+        // Commit or rollback
7156
+        if ($error) {
7157
+            $this->db->rollback();
7158
+            return -1;
7159
+        } else {
7160
+            $this->db->commit();
7161
+            return $this->id;
7162
+        }
7163
+    }
6367 7164
 
6368
-					if (! empty($conf->global->MAIN_EXTRAFIELDS_USE_TWO_COLUMS) && ($e % 2) == 0)
6369
-					{
6370
-						if (! empty($conf->global->MAIN_EXTRAFIELDS_USE_TWO_COLUMS) && ($e % 2) == 0) { $colspan='0'; }
6371
-					}
6372 7165
 
6373
-					if ($action == 'selectlines') { $colspan++; }
7166
+    /**
7167
+     * Load object in memory from the database
7168
+     *
7169
+     * @param	int    $id				Id object
7170
+     * @param	string $ref				Ref
7171
+     * @param	string	$morewhere		More SQL filters (' AND ...')
7172
+     * @return 	int         			<0 if KO, 0 if not found, >0 if OK
7173
+     */
7174
+    public function fetchCommon($id, $ref = null, $morewhere = '')
7175
+    {
7176
+        if (empty($id) && empty($ref) && empty($morewhere)) return -1;
6374 7177
 
6375
-					// Convert date into timestamp format (value in memory must be a timestamp)
6376
-					if (in_array($extrafields->attributes[$this->table_element]['type'][$key],array('date','datetime')))
6377
-					{
6378
-						$datenotinstring = $this->array_options['options_' . $key];
6379
-						if (! is_numeric($this->array_options['options_' . $key]))	// For backward compatibility
6380
-						{
6381
-							$datenotinstring = $this->db->jdate($datenotinstring);
6382
-						}
6383
-						$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
-					}
6385
-					// Convert float submited string into real php numeric (value in memory must be a php numeric)
6386
-					if (in_array($extrafields->attributes[$this->table_element]['type'][$key],array('price','double')))
6387
-					{
6388
-						$value = GETPOSTISSET($keyprefix.'options_'.$key.$keysuffix)?price2num(GETPOST($keyprefix.'options_'.$key.$keysuffix, 'alpha', 3)):$this->array_options['options_'.$key];
6389
-					}
6390
-
6391
-					$labeltoshow = $langs->trans($label);
6392
-
6393
-					$out .= '<td class="titlefield';
6394
-					if (GETPOST('action','none') == 'create') $out.='create';
6395
-					if ($mode != 'view' && ! empty($extrafields->attributes[$this->table_element]['required'][$key])) $out .= ' fieldrequired';
6396
-					$out .= '">';
6397
-					if (! empty($extrafields->attributes[$object->table_element]['help'][$key])) $out .= $form->textwithpicto($labeltoshow, $extrafields->attributes[$object->table_element]['help'][$key]);
6398
-					else $out .= $labeltoshow;
6399
-					$out .= '</td>';
6400
-
6401
-					$html_id = !empty($this->id) ? $this->element.'_extras_'.$key.'_'.$this->id : '';
6402
-					$out .='<td id="'.$html_id.'" class="'.$this->element.'_extras_'.$key.'" '.($colspan?' colspan="'.$colspan.'"':'').'>';
6403
-
6404
-					switch($mode) {
6405
-						case "view":
6406
-							$out .= $extrafields->showOutputField($key, $value);
6407
-							break;
6408
-						case "edit":
6409
-							$out .= $extrafields->showInputField($key, $value, '', $keysuffix, '', 0, $this->id);
6410
-							break;
6411
-					}
6412
-
6413
-					$out .= '</td>';
6414
-
6415
-					if (! empty($conf->global->MAIN_EXTRAFIELDS_USE_TWO_COLUMS) && (($e % 2) == 1)) $out .= '</tr>';
6416
-					else $out .= '</tr>';
6417
-					$e++;
6418
-				}
6419
-			}
6420
-			$out .= "\n";
6421
-			// Add code to manage list depending on others
6422
-			if (! empty($conf->use_javascript_ajax)) {
6423
-				$out .= '
6424
-				<script type="text/javascript">
6425
-				    jQuery(document).ready(function() {
6426
-				    	function showOptions(child_list, parent_list)
6427
-				    	{
6428
-				    		var val = $("select[name=\"options_"+parent_list+"\"]").val();
6429
-				    		var parentVal = parent_list + ":" + val;
6430
-							if(val > 0) {
6431
-					    		$("select[name=\""+child_list+"\"] option[parent]").hide();
6432
-					    		$("select[name=\""+child_list+"\"] option[parent=\""+parentVal+"\"]").show();
6433
-							} else {
6434
-								$("select[name=\""+child_list+"\"] option").show();
6435
-							}
6436
-				    	}
6437
-						function setListDependencies() {
6438
-					    	jQuery("select option[parent]").parent().each(function() {
6439
-					    		var child_list = $(this).attr("name");
6440
-								var parent = $(this).find("option[parent]:first").attr("parent");
6441
-								var infos = parent.split(":");
6442
-								var parent_list = infos[0];
6443
-								$("select[name=\""+parent_list+"\"]").change(function() {
6444
-									showOptions(child_list, parent_list);
6445
-								});
6446
-					    	});
6447
-						}
7178
+        $sql = 'SELECT '.$this->getFieldList();
7179
+        $sql.= ' FROM '.MAIN_DB_PREFIX.$this->table_element;
6448 7180
 
6449
-						setListDependencies();
6450
-				    });
6451
-				</script>'."\n";
6452
-				$out .= '<!-- /showOptionalsInput --> '."\n";
6453
-			}
6454
-		}
6455
-		return $out;
6456
-	}
6457
-
6458
-
6459
-	/**
6460
-	 * Returns the rights used for this class
6461
-	 * @return stdClass
6462
-	 */
6463
-	public function getRights()
6464
-	{
6465
-		global $user;
6466
-
6467
-		$element = $this->element;
6468
-		if ($element == 'facturerec') $element='facture';
6469
-
6470
-		return $user->rights->{$element};
6471
-	}
6472
-
6473
-	/**
6474
-	 * Function used to replace a thirdparty id with another one.
6475
-	 * This function is meant to be called from replaceThirdparty with the appropiate tables
6476
-	 * Column name fk_soc MUST be used to identify thirdparties
6477
-	 *
6478
-	 * @param  DoliDB 	   $db 			  Database handler
6479
-	 * @param  int 		   $origin_id     Old thirdparty id (the thirdparty to delete)
6480
-	 * @param  int 		   $dest_id       New thirdparty id (the thirdparty that will received element of the other)
6481
-	 * @param  string[]    $tables        Tables that need to be changed
6482
-	 * @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)
6483
-	 * @return bool						  True if success, False if error
6484
-	 */
6485
-	public static function commonReplaceThirdparty(DoliDB $db, $origin_id, $dest_id, array $tables, $ignoreerrors=0)
6486
-	{
6487
-		foreach ($tables as $table)
6488
-		{
6489
-			$sql = 'UPDATE '.MAIN_DB_PREFIX.$table.' SET fk_soc = '.$dest_id.' WHERE fk_soc = '.$origin_id;
6490
-
6491
-			if (! $db->query($sql))
6492
-			{
6493
-				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
-				//$this->errors = $db->lasterror();
6495
-				return false;
6496
-			}
6497
-		}
6498
-
6499
-		return true;
6500
-	}
6501
-
6502
-	/**
6503
-	 * Get buy price to use for margin calculation. This function is called when buy price is unknown.
6504
-	 *	 Set buy price = sell price if ForceBuyingPriceIfNull configured,
6505
-	 *   else if calculation MARGIN_TYPE = 'costprice' and costprice is defined, use costprice as buyprice
6506
-	 *	 else if calculation MARGIN_TYPE = 'pmp' and pmp is calculated, use pmp as buyprice
6507
-	 *	 else set min buy price as buy price
6508
-	 *
6509
-	 * @param float		$unitPrice		 Product unit price
6510
-	 * @param float		$discountPercent Line discount percent
6511
-	 * @param int		$fk_product		 Product id
6512
-	 * @return	float                    <0 if KO, buyprice if OK
6513
-	 */
6514
-	public function defineBuyPrice($unitPrice = 0.0, $discountPercent = 0.0, $fk_product = 0)
6515
-	{
6516
-		global $conf;
6517
-
6518
-		$buyPrice = 0;
6519
-
6520
-		if (($unitPrice > 0) && (isset($conf->global->ForceBuyingPriceIfNull) && $conf->global->ForceBuyingPriceIfNull == 1)) // In most cases, test here is false
6521
-		{
6522
-			$buyPrice = $unitPrice * (1 - $discountPercent / 100);
6523
-		}
6524
-		else
6525
-		{
6526
-			// Get cost price for margin calculation
6527
-			if (! empty($fk_product))
6528
-			{
6529
-				if (isset($conf->global->MARGIN_TYPE) && $conf->global->MARGIN_TYPE == 'costprice')
6530
-				{
6531
-					require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
6532
-					$product = new Product($this->db);
6533
-					$result = $product->fetch($fk_product);
6534
-					if ($result <= 0)
6535
-					{
6536
-						$this->errors[] = 'ErrorProductIdDoesNotExists';
6537
-						return -1;
6538
-					}
6539
-					if ($product->cost_price > 0)
6540
-					{
6541
-						$buyPrice = $product->cost_price;
6542
-					}
6543
-					else if ($product->pmp > 0)
6544
-					{
6545
-						$buyPrice = $product->pmp;
6546
-					}
6547
-				}
6548
-				else if (isset($conf->global->MARGIN_TYPE) && $conf->global->MARGIN_TYPE == 'pmp')
6549
-				{
6550
-					require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
6551
-					$product = new Product($this->db);
6552
-					$result = $product->fetch($fk_product);
6553
-					if ($result <= 0)
6554
-					{
6555
-						$this->errors[] = 'ErrorProductIdDoesNotExists';
6556
-						return -1;
6557
-					}
6558
-					if ($product->pmp > 0)
6559
-					{
6560
-						$buyPrice = $product->pmp;
6561
-					}
6562
-				}
7181
+        if (!empty($id))  $sql.= ' WHERE rowid = '.$id;
7182
+        elseif (!empty($ref)) $sql.= " WHERE ref = ".$this->quote($ref, $this->fields['ref']);
7183
+        else $sql.=' WHERE 1 = 1';	// usage with empty id and empty ref is very rare
7184
+        if ($morewhere)   $sql.= $morewhere;
7185
+        $sql.=' LIMIT 1';	// This is a fetch, to be sure to get only one record
6563 7186
 
6564
-				if (empty($buyPrice) && isset($conf->global->MARGIN_TYPE) && in_array($conf->global->MARGIN_TYPE, array('1','pmp','costprice')))
6565
-				{
6566
-					require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.product.class.php';
6567
-					$productFournisseur = new ProductFournisseur($this->db);
6568
-					if (($result = $productFournisseur->find_min_price_product_fournisseur($fk_product)) > 0)
6569
-					{
6570
-						$buyPrice = $productFournisseur->fourn_unitprice;
6571
-					}
6572
-					else if ($result < 0)
6573
-					{
6574
-						$this->errors[] = $productFournisseur->error;
6575
-						return -2;
6576
-					}
6577
-				}
6578
-			}
6579
-		}
6580
-		return $buyPrice;
6581
-	}
7187
+        $res = $this->db->query($sql);
7188
+        if ($res)
7189
+        {
7190
+            $obj = $this->db->fetch_object($res);
7191
+            if ($obj)
7192
+            {
7193
+                $this->setVarsFromFetchObj($obj);
7194
+                return $this->id;
7195
+            }
7196
+            else
7197
+            {
7198
+                return 0;
7199
+            }
7200
+        }
7201
+        else
7202
+        {
7203
+            $this->error = $this->db->lasterror();
7204
+            $this->errors[] = $this->error;
7205
+            return -1;
7206
+        }
7207
+    }
6582 7208
 
6583
-    // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
6584
-	/**
6585
-	 *  Show photos of an object (nbmax maximum), into several columns
6586
-	 *
6587
-	 *  @param		string	$modulepart		'product', 'ticket', ...
6588
-	 *  @param      string	$sdir        	Directory to scan (full absolute path)
6589
-	 *  @param      int		$size        	0=original size, 1='small' use thumbnail if possible
6590
-	 *  @param      int		$nbmax       	Nombre maximum de photos (0=pas de max)
6591
-	 *  @param      int		$nbbyrow     	Number of image per line or -1 to use div. Used only if size=1.
6592
-	 * 	@param		int		$showfilename	1=Show filename
6593
-	 * 	@param		int		$showaction		1=Show icon with action links (resize, delete)
6594
-	 * 	@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.
6595
-	 * 	@param		int		$maxWidth		Max width of original image when size='small'
6596
-	 *  @param      int     $nolink         Do not add a href link to view enlarged imaged into a new tab
6597
-	 *  @param      int     $notitle        Do not add title tag on image
6598
-	 *  @param		int		$usesharelink	Use the public shared link of image (if not available, the 'nophoto' image will be shown instead)
6599
-	 *  @return     string					Html code to show photo. Number of photos shown is saved in this->nbphoto
6600
-	 */
6601
-	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
-	{
6603
-        // phpcs:enable
6604
-		global $conf,$user,$langs;
6605
-
6606
-		include_once DOL_DOCUMENT_ROOT .'/core/lib/files.lib.php';
6607
-		include_once DOL_DOCUMENT_ROOT .'/core/lib/images.lib.php';
6608
-
6609
-		$sortfield='position_name';
6610
-		$sortorder='asc';
6611
-
6612
-		$dir = $sdir . '/';
6613
-		$pdir = '/';
6614
-		if ($modulepart == 'ticket')
6615
-		{
6616
-			$dir .= get_exdir(0, 0, 0, 0, $this, $modulepart).$this->track_id.'/';
6617
-			$pdir .= get_exdir(0, 0, 0, 0, $this, $modulepart).$this->track_id.'/';
6618
-		}
6619
-		else
6620
-		{
6621
-			$dir .= get_exdir(0, 0, 0, 0, $this, $modulepart).$this->ref.'/';
6622
-			$pdir .= get_exdir(0, 0, 0, 0, $this, $modulepart).$this->ref.'/';
6623
-		}
6624
-
6625
-		// For backward compatibility
6626
-		if ($modulepart == 'product' && ! empty($conf->global->PRODUCT_USE_OLD_PATH_FOR_PHOTO))
6627
-		{
6628
-			$dir = $sdir . '/'. get_exdir($this->id,2,0,0,$this,$modulepart) . $this->id ."/photos/";
6629
-			$pdir = '/' . get_exdir($this->id,2,0,0,$this,$modulepart) . $this->id ."/photos/";
6630
-		}
6631
-
6632
-		// Defined relative dir to DOL_DATA_ROOT
6633
-		$relativedir = '';
6634
-		if ($dir)
6635
-		{
6636
-			$relativedir = preg_replace('/^'.preg_quote(DOL_DATA_ROOT,'/').'/', '', $dir);
6637
-			$relativedir = preg_replace('/^[\\/]/','',$relativedir);
6638
-			$relativedir = preg_replace('/[\\/]$/','',$relativedir);
6639
-		}
6640
-
6641
-		$dirthumb = $dir.'thumbs/';
6642
-		$pdirthumb = $pdir.'thumbs/';
6643
-
6644
-		$return ='<!-- Photo -->'."\n";
6645
-		$nbphoto=0;
6646
-
6647
-		$filearray=dol_dir_list($dir,"files",0,'','(\.meta|_preview.*\.png)$',$sortfield,(strtolower($sortorder)=='desc'?SORT_DESC:SORT_ASC),1);
6648
-
6649
-		/*if (! empty($conf->global->PRODUCT_USE_OLD_PATH_FOR_PHOTO))    // For backward compatiblity, we scan also old dirs
6650
-		 {
6651
-		 $filearrayold=dol_dir_list($dirold,"files",0,'','(\.meta|_preview.*\.png)$',$sortfield,(strtolower($sortorder)=='desc'?SORT_DESC:SORT_ASC),1);
6652
-		 $filearray=array_merge($filearray, $filearrayold);
6653
-		 }*/
7209
+    /**
7210
+     * Update object into database
7211
+     *
7212
+     * @param  User $user      	User that modifies
7213
+     * @param  bool $notrigger 	false=launch triggers after, true=disable triggers
7214
+     * @return int             	<0 if KO, >0 if OK
7215
+     */
7216
+    public function updateCommon(User $user, $notrigger = false)
7217
+    {
7218
+        global $conf, $langs;
6654 7219
 
6655
-		completeFileArrayWithDatabaseInfo($filearray, $relativedir);
7220
+        $error = 0;
6656 7221
 
6657
-		if (count($filearray))
6658
-		{
6659
-			if ($sortfield && $sortorder)
6660
-			{
6661
-				$filearray=dol_sort_array($filearray, $sortfield, $sortorder);
6662
-			}
7222
+        $now=dol_now();
6663 7223
 
6664
-			foreach($filearray as $key => $val)
6665
-			{
6666
-				$photo='';
6667
-				$file = $val['name'];
7224
+        $fieldvalues = $this->setSaveQuery();
7225
+        if (array_key_exists('date_modification', $fieldvalues) && empty($fieldvalues['date_modification'])) $fieldvalues['date_modification']=$this->db->idate($now);
7226
+        if (array_key_exists('fk_user_modif', $fieldvalues) && ! ($fieldvalues['fk_user_modif'] > 0)) $fieldvalues['fk_user_modif']=$user->id;
7227
+        unset($fieldvalues['rowid']);	// The field 'rowid' is reserved field name for autoincrement field so we don't need it into update.
6668 7228
 
6669
-				//if (! utf8_check($file)) $file=utf8_encode($file);	// To be sure file is stored in UTF8 in memory
7229
+        $keys=array();
7230
+        $values = array();
7231
+        foreach ($fieldvalues as $k => $v) {
7232
+            $keys[$k] = $k;
7233
+            $value = $this->fields[$k];
7234
+            $values[$k] = $this->quote($v, $value);
7235
+            $tmp[] = $k.'='.$this->quote($v, $this->fields[$k]);
7236
+        }
6670 7237
 
6671
-				//if (dol_is_file($dir.$file) && image_format_supported($file) >= 0)
6672
-				if (image_format_supported($file) >= 0)
6673
-				{
6674
-					$nbphoto++;
6675
-					$photo = $file;
6676
-					$viewfilename = $file;
7238
+        // Clean and check mandatory
7239
+        foreach($keys as $key)
7240
+        {
7241
+            if (preg_match('/^integer:/i', $this->fields[$key]['type']) && $values[$key] == '-1') $values[$key]='';		// This is an implicit foreign key field
7242
+            if (! empty($this->fields[$key]['foreignkey']) && $values[$key] == '-1') $values[$key]='';					// This is an explicit foreign key field
7243
+
7244
+            //var_dump($key.'-'.$values[$key].'-'.($this->fields[$key]['notnull'] == 1));
7245
+            /*
7246
+			if ($this->fields[$key]['notnull'] == 1 && empty($values[$key]))
7247
+			{
7248
+				$error++;
7249
+				$this->errors[]=$langs->trans("ErrorFieldRequired", $this->fields[$key]['label']);
7250
+			}*/
7251
+        }
6677 7252
 
6678
-					if ($size == 1 || $size == 'small') {   // Format vignette
7253
+        $sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element.' SET '.implode( ',', $tmp ).' WHERE rowid='.$this->id ;
6679 7254
 
6680
-						// Find name of thumb file
6681
-						$photo_vignette=basename(getImageFileNameForSize($dir.$file, '_small'));
6682
-						if (! dol_is_file($dirthumb.$photo_vignette)) $photo_vignette='';
7255
+        $this->db->begin();
7256
+        if (! $error)
7257
+        {
7258
+            $res = $this->db->query($sql);
7259
+            if ($res===false)
7260
+            {
7261
+                $error++;
7262
+                $this->errors[] = $this->db->lasterror();
7263
+            }
7264
+        }
6683 7265
 
6684
-						// Get filesize of original file
6685
-						$imgarray=dol_getImageSize($dir.$photo);
7266
+        // Update extrafield
7267
+        if (! $error && empty($conf->global->MAIN_EXTRAFIELDS_DISABLED) && is_array($this->array_options) && count($this->array_options)>0)
7268
+        {
7269
+            $result=$this->insertExtraFields();
7270
+            if ($result < 0)
7271
+            {
7272
+                $error++;
7273
+            }
7274
+        }
6686 7275
 
6687
-						if ($nbbyrow > 0)
6688
-						{
6689
-							if ($nbphoto == 1) $return.= '<table width="100%" valign="top" align="center" border="0" cellpadding="2" cellspacing="2">';
7276
+        // Triggers
7277
+        if (! $error && ! $notrigger)
7278
+        {
7279
+            // Call triggers
7280
+            $result=$this->call_trigger(strtoupper(get_class($this)).'_MODIFY',$user);
7281
+            if ($result < 0) { $error++; } //Do also here what you must do to rollback action if trigger fail
7282
+            // End call triggers
7283
+        }
6690 7284
 
6691
-							if ($nbphoto % $nbbyrow == 1) $return.= '<tr align=center valign=middle border=1>';
6692
-							$return.= '<td width="'.ceil(100/$nbbyrow).'%" class="photo">';
6693
-						}
6694
-						else if ($nbbyrow < 0) $return .= '<div class="inline-block">';
7285
+        // Commit or rollback
7286
+        if ($error) {
7287
+            $this->db->rollback();
7288
+            return -1;
7289
+        } else {
7290
+            $this->db->commit();
7291
+            return $this->id;
7292
+        }
7293
+    }
6695 7294
 
6696
-						$return.= "\n";
7295
+    /**
7296
+     * Delete object in database
7297
+     *
7298
+     * @param 	User 	$user       			User that deletes
7299
+     * @param 	bool 	$notrigger  			false=launch triggers after, true=disable triggers
7300
+     * @param	int		$forcechilddeletion		0=no, 1=Force deletion of children
7301
+     * @return 	int             				<=0 if KO, >0 if OK
7302
+     */
7303
+    public function deleteCommon(User $user, $notrigger=false, $forcechilddeletion=0)
7304
+    {
7305
+        $error=0;
6697 7306
 
6698
-						$relativefile=preg_replace('/^\//', '', $pdir.$photo);
6699
-						if (empty($nolink))
6700
-						{
6701
-							$urladvanced=getAdvancedPreviewUrl($modulepart, $relativefile, 0, 'entity='.$this->entity);
6702
-							if ($urladvanced) $return.='<a href="'.$urladvanced.'">';
6703
-							else $return.= '<a href="'.DOL_URL_ROOT.'/viewimage.php?modulepart='.$modulepart.'&entity='.$this->entity.'&file='.urlencode($pdir.$photo).'" class="aphoto" target="_blank">';
6704
-						}
7307
+        $this->db->begin();
6705 7308
 
6706
-						// Show image (width height=$maxHeight)
6707
-						// Si fichier vignette disponible et image source trop grande, on utilise la vignette, sinon on utilise photo origine
6708
-						$alt=$langs->transnoentitiesnoconv('File').': '.$relativefile;
6709
-						$alt.=' - '.$langs->transnoentitiesnoconv('Size').': '.$imgarray['width'].'x'.$imgarray['height'];
6710
-						if ($notitle) $alt='';
6711
-
6712
-						if ($usesharelink)
6713
-						{
6714
-							if ($val['share'])
6715
-							{
6716
-								if (empty($maxHeight) || $photo_vignette && $imgarray['height'] > $maxHeight)
6717
-								{
6718
-									$return.= '<!-- Show original file (thumb not yet available with shared links) -->';
6719
-									$return.= '<img class="photo photowithmargin" border="0" height="'.$maxHeight.'" src="'.DOL_URL_ROOT.'/viewimage.php?hashp='.urlencode($val['share']).'" title="'.dol_escape_htmltag($alt).'">';
6720
-								}
6721
-								else {
6722
-									$return.= '<!-- Show original file -->';
6723
-									$return.= '<img class="photo photowithmargin" border="0" height="'.$maxHeight.'" src="'.DOL_URL_ROOT.'/viewimage.php?hashp='.urlencode($val['share']).'" title="'.dol_escape_htmltag($alt).'">';
6724
-								}
6725
-							}
6726
-							else
6727
-							{
6728
-								$return.= '<!-- Show nophoto file (because file is not shared) -->';
6729
-								$return.= '<img class="photo photowithmargin" border="0" height="'.$maxHeight.'" src="'.DOL_URL_ROOT.'/public/theme/common/nophoto.png" title="'.dol_escape_htmltag($alt).'">';
6730
-							}
6731
-						}
6732
-						else
6733
-						{
6734
-							if (empty($maxHeight) || $photo_vignette && $imgarray['height'] > $maxHeight)
6735
-							{
6736
-								$return.= '<!-- Show thumb -->';
6737
-								$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).'">';
6738
-							}
6739
-							else {
6740
-								$return.= '<!-- Show original file -->';
6741
-								$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).'">';
6742
-							}
6743
-						}
7309
+        if ($forcechilddeletion)
7310
+        {
7311
+            foreach($this->childtables as $table)
7312
+            {
7313
+                $sql = 'DELETE FROM '.MAIN_DB_PREFIX.$table.' WHERE '.$this->fk_element.' = '.$this->id;
7314
+                $resql = $this->db->query($sql);
7315
+                if (! $resql)
7316
+                {
7317
+                    $this->error=$this->db->lasterror();
7318
+                    $this->errors[]=$this->error;
7319
+                    $this->db->rollback();
7320
+                    return -1;
7321
+                }
7322
+            }
7323
+        }
7324
+        elseif (! empty($this->fk_element) && ! empty($this->childtables))	// If object has childs linked with a foreign key field, we check all child tables.
7325
+        {
7326
+            $objectisused = $this->isObjectUsed($this->id);
7327
+            if (! empty($objectisused))
7328
+            {
7329
+                dol_syslog(get_class($this)."::deleteCommon Can't delete record as it has some child", LOG_WARNING);
7330
+                $this->error='ErrorRecordHasChildren';
7331
+                $this->errors[]=$this->error;
7332
+                $this->db->rollback();
7333
+                return 0;
7334
+            }
7335
+        }
6744 7336
 
6745
-						if (empty($nolink)) $return.= '</a>';
6746
-						$return.="\n";
6747
-
6748
-						if ($showfilename) $return.= '<br>'.$viewfilename;
6749
-						if ($showaction)
6750
-						{
6751
-							$return.= '<br>';
6752
-							// On propose la generation de la vignette si elle n'existe pas et si la taille est superieure aux limites
6753
-							if ($photo_vignette && (image_format_supported($photo) > 0) && ($this->imgWidth > $maxWidth || $this->imgHeight > $maxHeight))
6754
-							{
6755
-								$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
-							}
6757
-							// Special cas for product
6758
-							if ($modulepart == 'product' && ($user->rights->produit->creer || $user->rights->service->creer))
6759
-							{
6760
-								// Link to resize
6761
-								$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
-
6763
-								// Link to delete
6764
-								$return.= '<a href="'.$_SERVER["PHP_SELF"].'?id='.$this->id.'&amp;action=delete&amp;file='.urlencode($pdir.$viewfilename).'">';
6765
-								$return.= img_delete().'</a>';
6766
-							}
6767
-						}
6768
-						$return.= "\n";
7337
+        if (! $error) {
7338
+            if (! $notrigger) {
7339
+                // Call triggers
7340
+                $result=$this->call_trigger(strtoupper(get_class($this)).'_DELETE', $user);
7341
+                if ($result < 0) { $error++; } // Do also here what you must do to rollback action if trigger fail
7342
+                // End call triggers
7343
+            }
7344
+        }
6769 7345
 
6770
-						if ($nbbyrow > 0)
6771
-						{
6772
-							$return.= '</td>';
6773
-							if (($nbphoto % $nbbyrow) == 0) $return.= '</tr>';
6774
-						}
6775
-						else if ($nbbyrow < 0) $return.='</div>';
6776
-					}
6777
-
6778
-					if (empty($size)) {     // Format origine
6779
-						$return.= '<img class="photo photowithmargin" border="0" src="'.DOL_URL_ROOT.'/viewimage.php?modulepart='.$modulepart.'&entity='.$this->entity.'&file='.urlencode($pdir.$photo).'">';
6780
-
6781
-						if ($showfilename) $return.= '<br>'.$viewfilename;
6782
-						if ($showaction)
6783
-						{
6784
-							// Special case for product
6785
-							if ($modulepart == 'product' && ($user->rights->produit->creer || $user->rights->service->creer))
6786
-							{
6787
-								// Link to resize
6788
-								$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
-
6790
-								// Link to delete
6791
-								$return.= '<a href="'.$_SERVER["PHP_SELF"].'?id='.$this->id.'&amp;action=delete&amp;file='.urlencode($pdir.$viewfilename).'">';
6792
-								$return.= img_delete().'</a>';
6793
-							}
6794
-						}
6795
-					}
7346
+        if (! $error && ! empty($this->isextrafieldmanaged))
7347
+        {
7348
+            $sql = "DELETE FROM " . MAIN_DB_PREFIX . $this->table_element."_extrafields";
7349
+            $sql.= " WHERE fk_object=" . $this->id;
6796 7350
 
6797
-					// On continue ou on arrete de boucler ?
6798
-					if ($nbmax && $nbphoto >= $nbmax) break;
6799
-				}
6800
-			}
7351
+            $resql = $this->db->query($sql);
7352
+            if (! $resql)
7353
+            {
7354
+                $this->errors[] = $this->db->lasterror();
7355
+                $error++;
7356
+            }
7357
+        }
6801 7358
 
6802
-			if ($size==1 || $size=='small')
6803
-			{
6804
-				if ($nbbyrow > 0)
6805
-				{
6806
-					// Ferme tableau
6807
-					while ($nbphoto % $nbbyrow)
6808
-					{
6809
-						$return.= '<td width="'.ceil(100/$nbbyrow).'%">&nbsp;</td>';
6810
-						$nbphoto++;
6811
-					}
6812
-
6813
-					if ($nbphoto) $return.= '</table>';
6814
-				}
6815
-			}
6816
-		}
6817
-
6818
-		$this->nbphoto = $nbphoto;
6819
-
6820
-		return $return;
6821
-	}
6822
-
6823
-
6824
-	/**
6825
-	 * Function test if type is array
6826
-	 *
6827
-	 * @param   array   $info   content informations of field
6828
-	 * @return                  bool
6829
-	 */
6830
-	protected function isArray($info)
6831
-	{
6832
-		if(is_array($info))
6833
-		{
6834
-			if(isset($info['type']) && $info['type']=='array') return true;
6835
-			else return false;
6836
-		}
6837
-		else return false;
6838
-	}
6839
-
6840
-	/**
6841
-	 * Function test if type is null
6842
-	 *
6843
-	 * @param   array   $info   content informations of field
6844
-	 * @return                  bool
6845
-	 */
6846
-	protected function isNull($info)
6847
-	{
6848
-		if(is_array($info))
6849
-		{
6850
-			if(isset($info['type']) && $info['type']=='null') return true;
6851
-			else return false;
6852
-		}
6853
-		else return false;
6854
-	}
6855
-
6856
-	/**
6857
-	 * Function test if type is date
6858
-	 *
6859
-	 * @param   array   $info   content informations of field
6860
-	 * @return                  bool
6861
-	 */
6862
-	public function isDate($info)
6863
-	{
6864
-		if(isset($info['type']) && ($info['type']=='date' || $info['type']=='datetime' || $info['type']=='timestamp')) return true;
6865
-		else return false;
6866
-	}
6867
-
6868
-	/**
6869
-	 * Function test if type is integer
6870
-	 *
6871
-	 * @param   array   $info   content informations of field
6872
-	 * @return                  bool
6873
-	 */
6874
-	public function isInt($info)
6875
-	{
6876
-		if(is_array($info))
6877
-		{
6878
-			if(isset($info['type']) && ($info['type']=='int' || preg_match('/^integer/i',$info['type']) ) ) return true;
6879
-			else return false;
6880
-		}
6881
-		else return false;
6882
-	}
6883
-
6884
-	/**
6885
-	 * Function test if type is float
6886
-	 *
6887
-	 * @param   array   $info   content informations of field
6888
-	 * @return                  bool
6889
-	 */
6890
-	public function isFloat($info)
6891
-	{
6892
-		if(is_array($info))
6893
-		{
6894
-			if (isset($info['type']) && (preg_match('/^(double|real)/i', $info['type']))) return true;
6895
-			else return false;
6896
-		}
6897
-		else return false;
6898
-	}
6899
-
6900
-	/**
6901
-	 * Function test if type is text
6902
-	 *
6903
-	 * @param   array   $info   content informations of field
6904
-	 * @return                  bool
6905
-	 */
6906
-	public function isText($info)
6907
-	{
6908
-		if(is_array($info))
6909
-		{
6910
-			if(isset($info['type']) && $info['type']=='text') return true;
6911
-			else return false;
6912
-		}
6913
-		else return false;
6914
-	}
6915
-
6916
-	/**
6917
-	 * Function test if is indexed
6918
-	 *
6919
-	 * @param   array   $info   content informations of field
6920
-	 * @return                  bool
6921
-	 */
6922
-	protected function isIndex($info)
6923
-	{
6924
-		if(is_array($info))
6925
-		{
6926
-			if(isset($info['index']) && $info['index']==true) return true;
6927
-			else return false;
6928
-		}
6929
-		else return false;
6930
-	}
6931
-
6932
-	/**
6933
-	 * Function to prepare the values to insert.
6934
-	 * Note $this->${field} are set by the page that make the createCommon or the updateCommon.
6935
-	 *
6936
-	 * @return array
6937
-	 */
6938
-	protected function setSaveQuery()
6939
-	{
6940
-		global $conf;
6941
-
6942
-		$queryarray=array();
6943
-		foreach ($this->fields as $field=>$info)	// Loop on definition of fields
6944
-		{
6945
-			// Depending on field type ('datetime', ...)
6946
-			if($this->isDate($info))
6947
-			{
6948
-				if(empty($this->{$field}))
6949
-				{
6950
-					$queryarray[$field] = null;
6951
-				}
6952
-				else
6953
-				{
6954
-					$queryarray[$field] = $this->db->idate($this->{$field});
6955
-				}
6956
-			}
6957
-			else if($this->isArray($info))
6958
-			{
6959
-				if(! empty($this->{$field})) {
6960
-					if(! is_array($this->{$field})) {
6961
-						$this->{$field} = array($this->{$field});
6962
-					}
6963
-					$queryarray[$field] = serialize($this->{$field});
6964
-				} else {
6965
-					$queryarray[$field] = null;
6966
-				}
6967
-			}
6968
-			else if($this->isInt($info))
6969
-			{
6970
-				if ($field == 'entity' && is_null($this->{$field})) $queryarray[$field]=$conf->entity;
6971
-				else
6972
-				{
6973
-					$queryarray[$field] = (int) price2num($this->{$field});
6974
-					if (empty($queryarray[$field])) $queryarray[$field]=0;		// May be reset to null later if property 'notnull' is -1 for this field.
6975
-				}
6976
-			}
6977
-			else if($this->isFloat($info))
6978
-			{
6979
-				$queryarray[$field] = (double) price2num($this->{$field});
6980
-				if (empty($queryarray[$field])) $queryarray[$field]=0;
6981
-			}
6982
-			else
6983
-			{
6984
-				$queryarray[$field] = $this->{$field};
6985
-			}
7359
+        if (! $error)
7360
+        {
7361
+            $sql = 'DELETE FROM '.MAIN_DB_PREFIX.$this->table_element.' WHERE rowid='.$this->id;
6986 7362
 
6987
-			if ($info['type'] == 'timestamp' && empty($queryarray[$field])) unset($queryarray[$field]);
6988
-			if (! empty($info['notnull']) && $info['notnull'] == -1 && empty($queryarray[$field])) $queryarray[$field] = null;
6989
-		}
7363
+            $res = $this->db->query($sql);
7364
+            if($res===false) {
7365
+                $error++;
7366
+                $this->errors[] = $this->db->lasterror();
7367
+            }
7368
+        }
6990 7369
 
6991
-		return $queryarray;
6992
-	}
7370
+        // Commit or rollback
7371
+        if ($error) {
7372
+            $this->db->rollback();
7373
+            return -1;
7374
+        } else {
7375
+            $this->db->commit();
7376
+            return 1;
7377
+        }
7378
+    }
6993 7379
 
6994
-	/**
6995
-	 * Function to load data from a SQL pointer into properties of current object $this
6996
-	 *
6997
-	 * @param   stdClass    $obj    Contain data of object from database
7380
+    /**
7381
+     * Initialise object with example values
7382
+     * Id must be 0 if object instance is a specimen
7383
+     *
6998 7384
      * @return void
6999
-	 */
7000
-	protected function setVarsFromFetchObj(&$obj)
7001
-	{
7002
-		foreach ($this->fields as $field => $info)
7003
-		{
7004
-			if($this->isDate($info))
7005
-			{
7006
-				if(empty($obj->{$field}) || $obj->{$field} === '0000-00-00 00:00:00' || $obj->{$field} === '1000-01-01 00:00:00') $this->{$field} = 0;
7007
-				else $this->{$field} = strtotime($obj->{$field});
7008
-			}
7009
-			elseif($this->isArray($info))
7010
-			{
7011
-				if(! empty($obj->{$field})) {
7012
-					$this->{$field} = @unserialize($obj->{$field});
7013
-					// Hack for data not in UTF8
7014
-					if($this->{$field } === false) @unserialize(utf8_decode($obj->{$field}));
7015
-				} else {
7016
-					$this->{$field} = array();
7017
-				}
7018
-			}
7019
-			elseif($this->isInt($info))
7020
-			{
7021
-				if ($field == 'rowid') $this->id = (int) $obj->{$field};
7022
-				else $this->{$field} = (int) $obj->{$field};
7023
-			}
7024
-			elseif($this->isFloat($info))
7025
-			{
7026
-				$this->{$field} = (double) $obj->{$field};
7027
-			}
7028
-			elseif($this->isNull($info))
7029
-			{
7030
-				$val = $obj->{$field};
7031
-				// zero is not null
7032
-				$this->{$field} = (is_null($val) || (empty($val) && $val!==0 && $val!=='0') ? null : $val);
7033
-			}
7034
-			else
7035
-			{
7036
-				$this->{$field} = $obj->{$field};
7037
-			}
7038
-		}
7039
-
7040
-		// If there is no 'ref' field, we force property ->ref to ->id for a better compatibility with common functions.
7041
-		if (! isset($this->fields['ref']) && isset($this->id)) $this->ref = $this->id;
7042
-	}
7043
-
7044
-	/**
7045
-	 * Function to concat keys of fields
7046
-	 *
7047
-	 * @return string
7048
-	 */
7049
-	protected function getFieldList()
7050
-	{
7051
-		$keys = array_keys($this->fields);
7052
-		return implode(',', $keys);
7053
-	}
7054
-
7055
-	/**
7056
-	 * Add quote to field value if necessary
7057
-	 *
7058
-	 * @param 	string|int	$value			Value to protect
7059
-	 * @param	array		$fieldsentry	Properties of field
7060
-	 * @return 	string
7061
-	 */
7062
-    protected function quote($value, $fieldsentry)
7385
+     */
7386
+    public function initAsSpecimenCommon()
7063 7387
     {
7064
-		if (is_null($value)) return 'NULL';
7065
-		else if (preg_match('/^(int|double|real)/i', $fieldsentry['type'])) return $this->db->escape("$value");
7066
-		else return "'".$this->db->escape($value)."'";
7067
-	}
7068
-
7069
-
7070
-	/**
7071
-	 * Create object into database
7072
-	 *
7073
-	 * @param  User $user      User that creates
7074
-	 * @param  bool $notrigger false=launch triggers after, true=disable triggers
7075
-	 * @return int             <0 if KO, Id of created object if OK
7076
-	 */
7077
-	public function createCommon(User $user, $notrigger = false)
7078
-	{
7079
-		global $langs;
7080
-
7081
-		$error = 0;
7082
-
7083
-		$now=dol_now();
7084
-
7085
-		$fieldvalues = $this->setSaveQuery();
7086
-		if (array_key_exists('date_creation', $fieldvalues) && empty($fieldvalues['date_creation'])) $fieldvalues['date_creation']=$this->db->idate($now);
7087
-		if (array_key_exists('fk_user_creat', $fieldvalues) && ! ($fieldvalues['fk_user_creat'] > 0)) $fieldvalues['fk_user_creat']=$user->id;
7088
-		unset($fieldvalues['rowid']);	// The field 'rowid' is reserved field name for autoincrement field so we don't need it into insert.
7089
-
7090
-		$keys=array();
7091
-		$values = array();
7092
-		foreach ($fieldvalues as $k => $v) {
7093
-			$keys[$k] = $k;
7094
-			$value = $this->fields[$k];
7095
-			$values[$k] = $this->quote($v, $value);
7096
-		}
7097
-
7098
-		// Clean and check mandatory
7099
-		foreach($keys as $key)
7100
-		{
7101
-			// If field is an implicit foreign key field
7102
-			if (preg_match('/^integer:/i', $this->fields[$key]['type']) && $values[$key] == '-1') $values[$key]='';
7103
-			if (! empty($this->fields[$key]['foreignkey']) && $values[$key] == '-1') $values[$key]='';
7104
-
7105
-			//var_dump($key.'-'.$values[$key].'-'.($this->fields[$key]['notnull'] == 1));
7106
-			if (isset($this->fields[$key]['notnull']) && $this->fields[$key]['notnull'] == 1 && ! isset($values[$key]) && is_null($val['default']))
7107
-			{
7108
-				$error++;
7109
-				$this->errors[]=$langs->trans("ErrorFieldRequired", $this->fields[$key]['label']);
7110
-			}
7111
-
7112
-			// If field is an implicit foreign key field
7113
-			if (preg_match('/^integer:/i', $this->fields[$key]['type']) && empty($values[$key])) $values[$key]='null';
7114
-			if (! empty($this->fields[$key]['foreignkey']) && empty($values[$key])) $values[$key]='null';
7115
-		}
7116
-
7117
-		if ($error) return -1;
7118
-
7119
-		$this->db->begin();
7388
+        $this->id = 0;
7120 7389
 
7121
-		if (! $error)
7122
-		{
7123
-			$sql = 'INSERT INTO '.MAIN_DB_PREFIX.$this->table_element;
7124
-			$sql.= ' ('.implode( ", ", $keys ).')';
7125
-			$sql.= ' VALUES ('.implode( ", ", $values ).')';
7390
+        // TODO...
7391
+    }
7126 7392
 
7127
-			$res = $this->db->query($sql);
7128
-			if ($res===false) {
7129
-				$error++;
7130
-				$this->errors[] = $this->db->lasterror();
7131
-			}
7132
-		}
7133
-
7134
-		if (! $error)
7135
-		{
7136
-			$this->id = $this->db->last_insert_id(MAIN_DB_PREFIX . $this->table_element);
7137
-		}
7138
-
7139
-		// Create extrafields
7140
-		if (! $error)
7141
-		{
7142
-			$result=$this->insertExtraFields();
7143
-			if ($result < 0) $error++;
7144
-		}
7145
-
7146
-		// Triggers
7147
-		if (! $error && ! $notrigger)
7148
-		{
7149
-			// Call triggers
7150
-			$result=$this->call_trigger(strtoupper(get_class($this)).'_CREATE',$user);
7151
-			if ($result < 0) { $error++; }
7152
-			// End call triggers
7153
-		}
7154
-
7155
-		// Commit or rollback
7156
-		if ($error) {
7157
-			$this->db->rollback();
7158
-			return -1;
7159
-		} else {
7160
-			$this->db->commit();
7161
-			return $this->id;
7162
-		}
7163
-	}
7164
-
7165
-
7166
-	/**
7167
-	 * Load object in memory from the database
7168
-	 *
7169
-	 * @param	int    $id				Id object
7170
-	 * @param	string $ref				Ref
7171
-	 * @param	string	$morewhere		More SQL filters (' AND ...')
7172
-	 * @return 	int         			<0 if KO, 0 if not found, >0 if OK
7173
-	 */
7174
-	public function fetchCommon($id, $ref = null, $morewhere = '')
7175
-	{
7176
-		if (empty($id) && empty($ref) && empty($morewhere)) return -1;
7177
-
7178
-		$sql = 'SELECT '.$this->getFieldList();
7179
-		$sql.= ' FROM '.MAIN_DB_PREFIX.$this->table_element;
7180
-
7181
-		if (!empty($id))  $sql.= ' WHERE rowid = '.$id;
7182
-		elseif (!empty($ref)) $sql.= " WHERE ref = ".$this->quote($ref, $this->fields['ref']);
7183
-		else $sql.=' WHERE 1 = 1';	// usage with empty id and empty ref is very rare
7184
-		if ($morewhere)   $sql.= $morewhere;
7185
-		$sql.=' LIMIT 1';	// This is a fetch, to be sure to get only one record
7186
-
7187
-		$res = $this->db->query($sql);
7188
-		if ($res)
7189
-		{
7190
-			$obj = $this->db->fetch_object($res);
7191
-			if ($obj)
7192
-			{
7193
-				$this->setVarsFromFetchObj($obj);
7194
-				return $this->id;
7195
-			}
7196
-			else
7197
-			{
7198
-				return 0;
7199
-			}
7200
-		}
7201
-		else
7202
-		{
7203
-			$this->error = $this->db->lasterror();
7204
-			$this->errors[] = $this->error;
7205
-			return -1;
7206
-		}
7207
-	}
7208
-
7209
-	/**
7210
-	 * Update object into database
7211
-	 *
7212
-	 * @param  User $user      	User that modifies
7213
-	 * @param  bool $notrigger 	false=launch triggers after, true=disable triggers
7214
-	 * @return int             	<0 if KO, >0 if OK
7215
-	 */
7216
-	public function updateCommon(User $user, $notrigger = false)
7217
-	{
7218
-		global $conf, $langs;
7219
-
7220
-		$error = 0;
7221
-
7222
-		$now=dol_now();
7223
-
7224
-		$fieldvalues = $this->setSaveQuery();
7225
-		if (array_key_exists('date_modification', $fieldvalues) && empty($fieldvalues['date_modification'])) $fieldvalues['date_modification']=$this->db->idate($now);
7226
-		if (array_key_exists('fk_user_modif', $fieldvalues) && ! ($fieldvalues['fk_user_modif'] > 0)) $fieldvalues['fk_user_modif']=$user->id;
7227
-		unset($fieldvalues['rowid']);	// The field 'rowid' is reserved field name for autoincrement field so we don't need it into update.
7228
-
7229
-		$keys=array();
7230
-		$values = array();
7231
-		foreach ($fieldvalues as $k => $v) {
7232
-			$keys[$k] = $k;
7233
-			$value = $this->fields[$k];
7234
-			$values[$k] = $this->quote($v, $value);
7235
-			$tmp[] = $k.'='.$this->quote($v, $this->fields[$k]);
7236
-		}
7237
-
7238
-		// Clean and check mandatory
7239
-		foreach($keys as $key)
7240
-		{
7241
-			if (preg_match('/^integer:/i', $this->fields[$key]['type']) && $values[$key] == '-1') $values[$key]='';		// This is an implicit foreign key field
7242
-			if (! empty($this->fields[$key]['foreignkey']) && $values[$key] == '-1') $values[$key]='';					// This is an explicit foreign key field
7243
-
7244
-			//var_dump($key.'-'.$values[$key].'-'.($this->fields[$key]['notnull'] == 1));
7245
-			/*
7246
-			if ($this->fields[$key]['notnull'] == 1 && empty($values[$key]))
7247
-			{
7248
-				$error++;
7249
-				$this->errors[]=$langs->trans("ErrorFieldRequired", $this->fields[$key]['label']);
7250
-			}*/
7251
-		}
7252 7393
 
7253
-		$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element.' SET '.implode( ',', $tmp ).' WHERE rowid='.$this->id ;
7394
+    /* Part for comments */
7254 7395
 
7255
-		$this->db->begin();
7256
-		if (! $error)
7257
-		{
7258
-			$res = $this->db->query($sql);
7259
-			if ($res===false)
7260
-			{
7261
-				$error++;
7262
-				$this->errors[] = $this->db->lasterror();
7263
-			}
7264
-		}
7265
-
7266
-		// Update extrafield
7267
-		if (! $error && empty($conf->global->MAIN_EXTRAFIELDS_DISABLED) && is_array($this->array_options) && count($this->array_options)>0)
7268
-		{
7269
-			$result=$this->insertExtraFields();
7270
-			if ($result < 0)
7271
-			{
7272
-				$error++;
7273
-			}
7274
-		}
7275
-
7276
-		// Triggers
7277
-		if (! $error && ! $notrigger)
7278
-		{
7279
-			// Call triggers
7280
-			$result=$this->call_trigger(strtoupper(get_class($this)).'_MODIFY',$user);
7281
-			if ($result < 0) { $error++; } //Do also here what you must do to rollback action if trigger fail
7282
-			// End call triggers
7283
-		}
7284
-
7285
-		// Commit or rollback
7286
-		if ($error) {
7287
-			$this->db->rollback();
7288
-			return -1;
7289
-		} else {
7290
-			$this->db->commit();
7291
-			return $this->id;
7292
-		}
7293
-	}
7294
-
7295
-	/**
7296
-	 * Delete object in database
7297
-	 *
7298
-	 * @param 	User 	$user       			User that deletes
7299
-	 * @param 	bool 	$notrigger  			false=launch triggers after, true=disable triggers
7300
-	 * @param	int		$forcechilddeletion		0=no, 1=Force deletion of children
7301
-	 * @return 	int             				<=0 if KO, >0 if OK
7302
-	 */
7303
-	public function deleteCommon(User $user, $notrigger=false, $forcechilddeletion=0)
7304
-	{
7305
-		$error=0;
7306
-
7307
-		$this->db->begin();
7308
-
7309
-		if ($forcechilddeletion)
7310
-		{
7311
-			foreach($this->childtables as $table)
7312
-			{
7313
-				$sql = 'DELETE FROM '.MAIN_DB_PREFIX.$table.' WHERE '.$this->fk_element.' = '.$this->id;
7314
-				$resql = $this->db->query($sql);
7315
-				if (! $resql)
7316
-				{
7317
-					$this->error=$this->db->lasterror();
7318
-					$this->errors[]=$this->error;
7319
-					$this->db->rollback();
7320
-					return -1;
7321
-				}
7322
-			}
7323
-		}
7324
-		elseif (! empty($this->fk_element) && ! empty($this->childtables))	// If object has childs linked with a foreign key field, we check all child tables.
7325
-		{
7326
-			$objectisused = $this->isObjectUsed($this->id);
7327
-			if (! empty($objectisused))
7328
-			{
7329
-				dol_syslog(get_class($this)."::deleteCommon Can't delete record as it has some child", LOG_WARNING);
7330
-				$this->error='ErrorRecordHasChildren';
7331
-				$this->errors[]=$this->error;
7332
-				$this->db->rollback();
7333
-				return 0;
7334
-			}
7335
-		}
7336
-
7337
-		if (! $error) {
7338
-			if (! $notrigger) {
7339
-				// Call triggers
7340
-				$result=$this->call_trigger(strtoupper(get_class($this)).'_DELETE', $user);
7341
-				if ($result < 0) { $error++; } // Do also here what you must do to rollback action if trigger fail
7342
-				// End call triggers
7343
-			}
7344
-		}
7345
-
7346
-		if (! $error && ! empty($this->isextrafieldmanaged))
7347
-		{
7348
-			$sql = "DELETE FROM " . MAIN_DB_PREFIX . $this->table_element."_extrafields";
7349
-			$sql.= " WHERE fk_object=" . $this->id;
7350
-
7351
-			$resql = $this->db->query($sql);
7352
-			if (! $resql)
7353
-			{
7354
-				$this->errors[] = $this->db->lasterror();
7355
-				$error++;
7356
-			}
7357
-		}
7396
+    /**
7397
+     * Load comments linked with current task
7398
+     *	@return boolean	1 if ok
7399
+     */
7400
+    public function fetchComments()
7401
+    {
7402
+        require_once DOL_DOCUMENT_ROOT.'/core/class/comment.class.php';
7358 7403
 
7359
-		if (! $error)
7360
-		{
7361
-			$sql = 'DELETE FROM '.MAIN_DB_PREFIX.$this->table_element.' WHERE rowid='.$this->id;
7404
+        $comment = new Comment($this->db);
7405
+        $result=$comment->fetchAllFor($this->element, $this->id);
7406
+        if ($result<0) {
7407
+            $this->errors=array_merge($this->errors, $comment->errors);
7408
+            return -1;
7409
+        } else {
7410
+            $this->comments = $comment->comments;
7411
+        }
7412
+        return count($this->comments);
7413
+    }
7362 7414
 
7363
-			$res = $this->db->query($sql);
7364
-			if($res===false) {
7365
-				$error++;
7366
-				$this->errors[] = $this->db->lasterror();
7367
-			}
7368
-		}
7369
-
7370
-		// Commit or rollback
7371
-		if ($error) {
7372
-			$this->db->rollback();
7373
-			return -1;
7374
-		} else {
7375
-			$this->db->commit();
7376
-			return 1;
7377
-		}
7378
-	}
7379
-
7380
-	/**
7381
-	 * Initialise object with example values
7382
-	 * Id must be 0 if object instance is a specimen
7383
-	 *
7384
-	 * @return void
7385
-	 */
7386
-	public function initAsSpecimenCommon()
7387
-	{
7388
-		$this->id = 0;
7389
-
7390
-		// TODO...
7391
-	}
7392
-
7393
-
7394
-	/* Part for comments */
7395
-
7396
-	/**
7397
-	 * Load comments linked with current task
7398
-	 *	@return boolean	1 if ok
7399
-	 */
7400
-	public function fetchComments()
7401
-	{
7402
-		require_once DOL_DOCUMENT_ROOT.'/core/class/comment.class.php';
7403
-
7404
-		$comment = new Comment($this->db);
7405
-		$result=$comment->fetchAllFor($this->element, $this->id);
7406
-		if ($result<0) {
7407
-			$this->errors=array_merge($this->errors, $comment->errors);
7408
-			return -1;
7409
-		} else {
7410
-			$this->comments = $comment->comments;
7411
-		}
7412
-		return count($this->comments);
7413
-	}
7414
-
7415
-	/**
7416
-	 * Return nb comments already posted
7417
-	 *
7418
-	 * @return int
7419
-	 */
7420
-	public function getNbComments()
7421
-	{
7422
-		return count($this->comments);
7423
-	}
7415
+    /**
7416
+     * Return nb comments already posted
7417
+     *
7418
+     * @return int
7419
+     */
7420
+    public function getNbComments()
7421
+    {
7422
+        return count($this->comments);
7423
+    }
7424 7424
 
7425 7425
     /**
7426 7426
      * Trim object parameters
Please login to merge, or discard this patch.
Spacing   +1522 added lines, -1522 removed lines patch added patch discarded remove patch
@@ -373,7 +373,7 @@  discard block
 block discarded – undo
373 373
 	 * @var mixed		Contains comments
374 374
 	 * @see fetchComments()
375 375
 	 */
376
-	public $comments=array();
376
+	public $comments = array();
377 377
 
378 378
 	/**
379 379
 	 * @var int
@@ -399,9 +399,9 @@  discard block
 block discarded – undo
399 399
 	public $civility_id;
400 400
 
401 401
 	// Dates
402
-	public $date_creation;			// Date creation
403
-	public $date_validation;		// Date validation
404
-	public $date_modification;		// Date last change (tms field)
402
+	public $date_creation; // Date creation
403
+	public $date_validation; // Date validation
404
+	public $date_modification; // Date last change (tms field)
405 405
 
406 406
 
407 407
 
@@ -417,29 +417,29 @@  discard block
 block discarded – undo
417 417
 	 *  @param	string	$ref_ext	Ref ext of object to check
418 418
 	 *  @return int     			<0 if KO, 0 if OK but not found, >0 if OK and exists
419 419
 	 */
420
-	static function isExistingObject($element, $id, $ref='', $ref_ext='')
420
+	static function isExistingObject($element, $id, $ref = '', $ref_ext = '')
421 421
 	{
422
-		global $db,$conf;
422
+		global $db, $conf;
423 423
 
424 424
 		$sql = "SELECT rowid, ref, ref_ext";
425
-		$sql.= " FROM ".MAIN_DB_PREFIX.$element;
426
-		$sql.= " WHERE entity IN (".getEntity($element).")" ;
425
+		$sql .= " FROM ".MAIN_DB_PREFIX.$element;
426
+		$sql .= " WHERE entity IN (".getEntity($element).")";
427 427
 
428
-		if ($id > 0) $sql.= " AND rowid = ".$db->escape($id);
429
-		else if ($ref) $sql.= " AND ref = '".$db->escape($ref)."'";
430
-		else if ($ref_ext) $sql.= " AND ref_ext = '".$db->escape($ref_ext)."'";
428
+		if ($id > 0) $sql .= " AND rowid = ".$db->escape($id);
429
+		else if ($ref) $sql .= " AND ref = '".$db->escape($ref)."'";
430
+		else if ($ref_ext) $sql .= " AND ref_ext = '".$db->escape($ref_ext)."'";
431 431
 		else {
432
-			$error='ErrorWrongParameters';
432
+			$error = 'ErrorWrongParameters';
433 433
 			dol_print_error(get_class()."::isExistingObject ".$error, LOG_ERR);
434 434
 			return -1;
435 435
 		}
436
-		if ($ref || $ref_ext) $sql.= " AND entity = ".$conf->entity;
436
+		if ($ref || $ref_ext) $sql .= " AND entity = ".$conf->entity;
437 437
 
438 438
 		dol_syslog(get_class()."::isExistingObject", LOG_DEBUG);
439 439
 		$resql = $db->query($sql);
440 440
 		if ($resql)
441 441
 		{
442
-			$num=$db->num_rows($resql);
442
+			$num = $db->num_rows($resql);
443 443
 			if ($num > 0) return 1;
444 444
 			else return 0;
445 445
 		}
@@ -453,7 +453,7 @@  discard block
 block discarded – undo
453 453
 	 */
454 454
 	function errorsToString()
455 455
 	{
456
-		return $this->error.(is_array($this->errors)?(($this->error!=''?', ':'').join(', ',$this->errors)):'');
456
+		return $this->error.(is_array($this->errors) ? (($this->error != '' ? ', ' : '').join(', ', $this->errors)) : '');
457 457
 	}
458 458
 
459 459
 	/**
@@ -465,23 +465,23 @@  discard block
 block discarded – undo
465 465
 	 * 	@param	int			$maxlen			Maximum length
466 466
 	 * 	@return	string						String with full name
467 467
 	 */
468
-	function getFullName($langs,$option=0,$nameorder=-1,$maxlen=0)
468
+	function getFullName($langs, $option = 0, $nameorder = -1, $maxlen = 0)
469 469
 	{
470 470
 		//print "lastname=".$this->lastname." name=".$this->name." nom=".$this->nom."<br>\n";
471
-		$lastname=$this->lastname;
472
-		$firstname=$this->firstname;
473
-		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:'')))));
471
+		$lastname = $this->lastname;
472
+		$firstname = $this->firstname;
473
+		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 : '')))));
474 474
 
475
-		$ret='';
475
+		$ret = '';
476 476
 		if ($option && $this->civility_id)
477 477
 		{
478
-			if ($langs->transnoentitiesnoconv("Civility".$this->civility_id)!="Civility".$this->civility_id) $ret.=$langs->transnoentitiesnoconv("Civility".$this->civility_id).' ';
479
-			else $ret.=$this->civility_id.' ';
478
+			if ($langs->transnoentitiesnoconv("Civility".$this->civility_id) != "Civility".$this->civility_id) $ret .= $langs->transnoentitiesnoconv("Civility".$this->civility_id).' ';
479
+			else $ret .= $this->civility_id.' ';
480 480
 		}
481 481
 
482
-		$ret.=dolGetFirstLastname($firstname, $lastname, $nameorder);
482
+		$ret .= dolGetFirstLastname($firstname, $lastname, $nameorder);
483 483
 
484
-		return dol_trunc($ret,$maxlen);
484
+		return dol_trunc($ret, $maxlen);
485 485
 	}
486 486
 
487 487
 	/**
@@ -492,24 +492,24 @@  discard block
 block discarded – undo
492 492
 	 *  @param		int		    $withregion			1=Add region into address string
493 493
 	 *	@return		string							Full address string
494 494
 	 */
495
-	function getFullAddress($withcountry=0, $sep="\n", $withregion=0)
495
+	function getFullAddress($withcountry = 0, $sep = "\n", $withregion = 0)
496 496
 	{
497 497
 		if ($withcountry && $this->country_id && (empty($this->country_code) || empty($this->country)))
498 498
 		{
499
-			require_once DOL_DOCUMENT_ROOT .'/core/lib/company.lib.php';
500
-			$tmparray=getCountry($this->country_id,'all');
501
-			$this->country_code=$tmparray['code'];
502
-			$this->country     =$tmparray['label'];
499
+			require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
500
+			$tmparray = getCountry($this->country_id, 'all');
501
+			$this->country_code = $tmparray['code'];
502
+			$this->country     = $tmparray['label'];
503 503
 		}
504 504
 
505 505
         if ($withregion && $this->state_id && (empty($this->state_code) || empty($this->state) || empty($this->region) || empty($this->region_cpde)))
506 506
     	{
507
-    		require_once DOL_DOCUMENT_ROOT .'/core/lib/company.lib.php';
508
-    		$tmparray=getState($this->state_id,'all',0,1);
509
-			$this->state_code   =$tmparray['code'];
510
-			$this->state        =$tmparray['label'];
511
-			$this->region_code  =$tmparray['region_code'];
512
-			$this->region       =$tmparray['region'];
507
+    		require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php';
508
+    		$tmparray = getState($this->state_id, 'all', 0, 1);
509
+			$this->state_code   = $tmparray['code'];
510
+			$this->state        = $tmparray['label'];
511
+			$this->region_code  = $tmparray['region_code'];
512
+			$this->region       = $tmparray['region'];
513 513
         }
514 514
 
515 515
 		return dol_format_address($this, $withcountry, $sep);
@@ -527,108 +527,108 @@  discard block
 block discarded – undo
527 527
 	{
528 528
 		global $conf, $langs;
529 529
 
530
-		$countriesusingstate=array('AU','US','IN','GB','ES','UK','TR');    // See also option MAIN_FORCE_STATE_INTO_ADDRESS
530
+		$countriesusingstate = array('AU', 'US', 'IN', 'GB', 'ES', 'UK', 'TR'); // See also option MAIN_FORCE_STATE_INTO_ADDRESS
531 531
 
532
-		$contactid=0;
533
-		$thirdpartyid=0;
532
+		$contactid = 0;
533
+		$thirdpartyid = 0;
534 534
 		if ($this->element == 'societe')
535 535
 		{
536
-			$thirdpartyid=$this->id;
536
+			$thirdpartyid = $this->id;
537 537
 		}
538 538
 		if ($this->element == 'contact')
539 539
 		{
540
-			$contactid=$this->id;
541
-			$thirdpartyid=$object->fk_soc;
540
+			$contactid = $this->id;
541
+			$thirdpartyid = $object->fk_soc;
542 542
 		}
543 543
 		if ($this->element == 'user')
544 544
 		{
545
-			$contactid=$this->contact_id;
546
-			$thirdpartyid=$object->fk_soc;
545
+			$contactid = $this->contact_id;
546
+			$thirdpartyid = $object->fk_soc;
547 547
 		}
548 548
 
549
-		$out='<!-- BEGIN part to show address block -->';
549
+		$out = '<!-- BEGIN part to show address block -->';
550 550
 
551
-		$outdone=0;
552
-		$coords = $this->getFullAddress(1,', ',$conf->global->MAIN_SHOW_REGION_IN_STATE_SELECT);
551
+		$outdone = 0;
552
+		$coords = $this->getFullAddress(1, ', ', $conf->global->MAIN_SHOW_REGION_IN_STATE_SELECT);
553 553
 		if ($coords)
554 554
 		{
555
-			if (! empty($conf->use_javascript_ajax))
555
+			if (!empty($conf->use_javascript_ajax))
556 556
 			{
557
-				$namecoords = $this->getFullName($langs,1).'<br>'.$coords;
557
+				$namecoords = $this->getFullName($langs, 1).'<br>'.$coords;
558 558
 				// hideonsmatphone because copyToClipboard call jquery dialog that does not work with jmobile
559
-				$out.='<a href="#" class="hideonsmartphone" onclick="return copyToClipboard(\''.dol_escape_js($namecoords).'\',\''.dol_escape_js($langs->trans("HelpCopyToClipboard")).'\');">';
560
-				$out.=img_picto($langs->trans("Address"), 'object_address.png');
561
-				$out.='</a> ';
559
+				$out .= '<a href="#" class="hideonsmartphone" onclick="return copyToClipboard(\''.dol_escape_js($namecoords).'\',\''.dol_escape_js($langs->trans("HelpCopyToClipboard")).'\');">';
560
+				$out .= img_picto($langs->trans("Address"), 'object_address.png');
561
+				$out .= '</a> ';
562 562
 			}
563
-			$out.=dol_print_address($coords, 'address_'.$htmlkey.'_'.$this->id, $this->element, $this->id, 1, ', '); $outdone++;
563
+			$out .= dol_print_address($coords, 'address_'.$htmlkey.'_'.$this->id, $this->element, $this->id, 1, ', '); $outdone++;
564 564
 			$outdone++;
565 565
 		}
566 566
 
567
-		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
567
+		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 568
 				&& empty($conf->global->SOCIETE_DISABLE_STATE) && $this->state)
569 569
 		{
570 570
             if (!empty($conf->global->MAIN_SHOW_REGION_IN_STATE_SELECT) && $conf->global->MAIN_SHOW_REGION_IN_STATE_SELECT == 1 && $this->region) {
571
-                $out.=($outdone?' - ':'').$this->region.' - '.$this->state;
571
+                $out .= ($outdone ? ' - ' : '').$this->region.' - '.$this->state;
572 572
             }
573 573
             else {
574
-                $out.=($outdone?' - ':'').$this->state;
574
+                $out .= ($outdone ? ' - ' : '').$this->state;
575 575
             }
576 576
 			$outdone++;
577 577
 		}
578 578
 
579
-		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>':'');
580
-		if (! empty($this->phone) && empty($this->phone_pro)) {		// For objects that store pro phone into ->phone
581
-			$out.=dol_print_phone($this->phone,$this->country_code,$contactid,$thirdpartyid,'AC_TEL','&nbsp;','phone',$langs->trans("PhonePro")); $outdone++;
579
+		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>' : '');
580
+		if (!empty($this->phone) && empty($this->phone_pro)) {		// For objects that store pro phone into ->phone
581
+			$out .= dol_print_phone($this->phone, $this->country_code, $contactid, $thirdpartyid, 'AC_TEL', '&nbsp;', 'phone', $langs->trans("PhonePro")); $outdone++;
582 582
 		}
583
-		if (! empty($this->phone_pro)) {
584
-			$out.=dol_print_phone($this->phone_pro,$this->country_code,$contactid,$thirdpartyid,'AC_TEL','&nbsp;','phone',$langs->trans("PhonePro")); $outdone++;
583
+		if (!empty($this->phone_pro)) {
584
+			$out .= dol_print_phone($this->phone_pro, $this->country_code, $contactid, $thirdpartyid, 'AC_TEL', '&nbsp;', 'phone', $langs->trans("PhonePro")); $outdone++;
585 585
 		}
586
-		if (! empty($this->phone_mobile)) {
587
-			$out.=dol_print_phone($this->phone_mobile,$this->country_code,$contactid,$thirdpartyid,'AC_TEL','&nbsp;','mobile',$langs->trans("PhoneMobile")); $outdone++;
586
+		if (!empty($this->phone_mobile)) {
587
+			$out .= dol_print_phone($this->phone_mobile, $this->country_code, $contactid, $thirdpartyid, 'AC_TEL', '&nbsp;', 'mobile', $langs->trans("PhoneMobile")); $outdone++;
588 588
 		}
589
-		if (! empty($this->phone_perso)) {
590
-			$out.=dol_print_phone($this->phone_perso,$this->country_code,$contactid,$thirdpartyid,'AC_TEL','&nbsp;','phone',$langs->trans("PhonePerso")); $outdone++;
589
+		if (!empty($this->phone_perso)) {
590
+			$out .= dol_print_phone($this->phone_perso, $this->country_code, $contactid, $thirdpartyid, 'AC_TEL', '&nbsp;', 'phone', $langs->trans("PhonePerso")); $outdone++;
591 591
 		}
592
-		if (! empty($this->office_phone)) {
593
-			$out.=dol_print_phone($this->office_phone,$this->country_code,$contactid,$thirdpartyid,'AC_TEL','&nbsp;','phone',$langs->trans("PhonePro")); $outdone++;
592
+		if (!empty($this->office_phone)) {
593
+			$out .= dol_print_phone($this->office_phone, $this->country_code, $contactid, $thirdpartyid, 'AC_TEL', '&nbsp;', 'phone', $langs->trans("PhonePro")); $outdone++;
594 594
 		}
595
-		if (! empty($this->user_mobile)) {
596
-			$out.=dol_print_phone($this->user_mobile,$this->country_code,$contactid,$thirdpartyid,'AC_TEL','&nbsp;','mobile',$langs->trans("PhoneMobile")); $outdone++;
595
+		if (!empty($this->user_mobile)) {
596
+			$out .= dol_print_phone($this->user_mobile, $this->country_code, $contactid, $thirdpartyid, 'AC_TEL', '&nbsp;', 'mobile', $langs->trans("PhoneMobile")); $outdone++;
597 597
 		}
598
-		if (! empty($this->fax)) {
599
-			$out.=dol_print_phone($this->fax,$this->country_code,$contactid,$thirdpartyid,'AC_FAX','&nbsp;','fax',$langs->trans("Fax")); $outdone++;
598
+		if (!empty($this->fax)) {
599
+			$out .= dol_print_phone($this->fax, $this->country_code, $contactid, $thirdpartyid, 'AC_FAX', '&nbsp;', 'fax', $langs->trans("Fax")); $outdone++;
600 600
 		}
601
-		if (! empty($this->office_fax)) {
602
-			$out.=dol_print_phone($this->office_fax,$this->country_code,$contactid,$thirdpartyid,'AC_FAX','&nbsp;','fax',$langs->trans("Fax")); $outdone++;
601
+		if (!empty($this->office_fax)) {
602
+			$out .= dol_print_phone($this->office_fax, $this->country_code, $contactid, $thirdpartyid, 'AC_FAX', '&nbsp;', 'fax', $langs->trans("Fax")); $outdone++;
603 603
 		}
604 604
 
605
-		$out.='<div style="clear: both;"></div>';
606
-		$outdone=0;
607
-		if (! empty($this->email))
605
+		$out .= '<div style="clear: both;"></div>';
606
+		$outdone = 0;
607
+		if (!empty($this->email))
608 608
 		{
609
-			$out.=dol_print_email($this->email,$this->id,$object->id,'AC_EMAIL',0,0,1);
609
+			$out .= dol_print_email($this->email, $this->id, $object->id, 'AC_EMAIL', 0, 0, 1);
610 610
 			$outdone++;
611 611
 		}
612
-		if (! empty($this->url))
612
+		if (!empty($this->url))
613 613
 		{
614
-			$out.=dol_print_url($this->url,'_goout',0,1);
614
+			$out .= dol_print_url($this->url, '_goout', 0, 1);
615 615
 			$outdone++;
616 616
 		}
617
-		$out.='<div style="clear: both;">';
618
-		if (! empty($conf->socialnetworks->enabled))
617
+		$out .= '<div style="clear: both;">';
618
+		if (!empty($conf->socialnetworks->enabled))
619 619
 		{
620
-			if ($this->skype) $out.=dol_print_socialnetworks($this->skype,$this->id,$object->id,'skype');
620
+			if ($this->skype) $out .= dol_print_socialnetworks($this->skype, $this->id, $object->id, 'skype');
621 621
 			$outdone++;
622
-			if ($this->jabberid) $out.=dol_print_socialnetworks($this->jabberid,$this->id,$object->id,'jabber');
622
+			if ($this->jabberid) $out .= dol_print_socialnetworks($this->jabberid, $this->id, $object->id, 'jabber');
623 623
 			$outdone++;
624
-			if ($this->twitter) $out.=dol_print_socialnetworks($this->twitter,$this->id,$object->id,'twitter');
624
+			if ($this->twitter) $out .= dol_print_socialnetworks($this->twitter, $this->id, $object->id, 'twitter');
625 625
 			$outdone++;
626
-			if ($this->facebook) $out.=dol_print_socialnetworks($this->facebook,$this->id,$object->id,'facebook');
626
+			if ($this->facebook) $out .= dol_print_socialnetworks($this->facebook, $this->id, $object->id, 'facebook');
627 627
 			$outdone++;
628 628
 		}
629
-		$out.='</div>';
629
+		$out .= '</div>';
630 630
 
631
-		$out.='<!-- END Part to show address block -->';
631
+		$out .= '<!-- END Part to show address block -->';
632 632
 
633 633
 		return $out;
634 634
 	}
@@ -641,17 +641,17 @@  discard block
 block discarded – undo
641 641
 	 * @param	int		$relativelink		0=Return full external link, 1=Return link relative to root of file
642 642
 	 * @return	string						Link or empty string if there is no download link
643 643
 	 */
644
-	function getLastMainDocLink($modulepart, $initsharekey=0, $relativelink=0)
644
+	function getLastMainDocLink($modulepart, $initsharekey = 0, $relativelink = 0)
645 645
 	{
646 646
 		global $user, $dolibarr_main_url_root;
647 647
 
648 648
 		if (empty($this->last_main_doc))
649 649
 		{
650
-			return '';		// No way to known which document name to use
650
+			return ''; // No way to known which document name to use
651 651
 		}
652 652
 
653 653
 		include_once DOL_DOCUMENT_ROOT.'/ecm/class/ecmfiles.class.php';
654
-		$ecmfile=new EcmFiles($this->db);
654
+		$ecmfile = new EcmFiles($this->db);
655 655
 		$result = $ecmfile->fetch(0, '', $this->last_main_doc);
656 656
 		if ($result < 0)
657 657
 		{
@@ -699,26 +699,26 @@  discard block
 block discarded – undo
699 699
 		}
700 700
 
701 701
 		// Define $urlwithroot
702
-		$urlwithouturlroot=preg_replace('/'.preg_quote(DOL_URL_ROOT,'/').'$/i','',trim($dolibarr_main_url_root));
703
-		$urlwithroot=$urlwithouturlroot.DOL_URL_ROOT;		// This is to use external domain name found into config file
702
+		$urlwithouturlroot = preg_replace('/'.preg_quote(DOL_URL_ROOT, '/').'$/i', '', trim($dolibarr_main_url_root));
703
+		$urlwithroot = $urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain name found into config file
704 704
 		//$urlwithroot=DOL_MAIN_URL_ROOT;					// This is to use same domain name than current
705 705
 
706
-		$forcedownload=0;
706
+		$forcedownload = 0;
707 707
 
708
-		$paramlink='';
708
+		$paramlink = '';
709 709
 		//if (! empty($modulepart)) $paramlink.=($paramlink?'&':'').'modulepart='.$modulepart;		// For sharing with hash (so public files), modulepart is not required.
710 710
 		//if (! empty($ecmfile->entity)) $paramlink.='&entity='.$ecmfile->entity; 					// For sharing with hash (so public files), entity is not required.
711 711
 		//$paramlink.=($paramlink?'&':'').'file='.urlencode($filepath);								// No need of name of file for public link, we will use the hash
712
-		if (! empty($ecmfile->share)) $paramlink.=($paramlink?'&':'').'hashp='.$ecmfile->share;			// Hash for public share
713
-		if ($forcedownload) $paramlink.=($paramlink?'&':'').'attachment=1';
712
+		if (!empty($ecmfile->share)) $paramlink .= ($paramlink ? '&' : '').'hashp='.$ecmfile->share; // Hash for public share
713
+		if ($forcedownload) $paramlink .= ($paramlink ? '&' : '').'attachment=1';
714 714
 
715 715
 		if ($relativelink)
716 716
 		{
717
-			$linktoreturn='document.php'.($paramlink?'?'.$paramlink:'');
717
+			$linktoreturn = 'document.php'.($paramlink ? '?'.$paramlink : '');
718 718
 		}
719 719
 		else
720 720
 		{
721
-			$linktoreturn=$urlwithroot.'/document.php'.($paramlink?'?'.$paramlink:'');
721
+			$linktoreturn = $urlwithroot.'/document.php'.($paramlink ? '?'.$paramlink : '');
722 722
 		}
723 723
 
724 724
 		// Here $ecmfile->share is defined
@@ -736,10 +736,10 @@  discard block
 block discarded – undo
736 736
 	 *  @param  int		$notrigger			Disable all triggers
737 737
 	 *  @return int                 		<0 if KO, >0 if OK
738 738
 	 */
739
-	function add_contact($fk_socpeople, $type_contact, $source='external',$notrigger=0)
739
+	function add_contact($fk_socpeople, $type_contact, $source = 'external', $notrigger = 0)
740 740
 	{
741 741
         // phpcs:enable
742
-		global $user,$langs;
742
+		global $user, $langs;
743 743
 
744 744
 
745 745
 		dol_syslog(get_class($this)."::add_contact $fk_socpeople, $type_contact, $source, $notrigger");
@@ -748,43 +748,43 @@  discard block
 block discarded – undo
748 748
 		if ($fk_socpeople <= 0)
749 749
 		{
750 750
 			$langs->load("errors");
751
-			$this->error=$langs->trans("ErrorWrongValueForParameterX","1");
752
-			dol_syslog(get_class($this)."::add_contact ".$this->error,LOG_ERR);
751
+			$this->error = $langs->trans("ErrorWrongValueForParameterX", "1");
752
+			dol_syslog(get_class($this)."::add_contact ".$this->error, LOG_ERR);
753 753
 			return -1;
754 754
 		}
755
-		if (! $type_contact)
755
+		if (!$type_contact)
756 756
 		{
757 757
 			$langs->load("errors");
758
-			$this->error=$langs->trans("ErrorWrongValueForParameterX","2");
759
-			dol_syslog(get_class($this)."::add_contact ".$this->error,LOG_ERR);
758
+			$this->error = $langs->trans("ErrorWrongValueForParameterX", "2");
759
+			dol_syslog(get_class($this)."::add_contact ".$this->error, LOG_ERR);
760 760
 			return -2;
761 761
 		}
762 762
 
763
-		$id_type_contact=0;
763
+		$id_type_contact = 0;
764 764
 		if (is_numeric($type_contact))
765 765
 		{
766
-			$id_type_contact=$type_contact;
766
+			$id_type_contact = $type_contact;
767 767
 		}
768 768
 		else
769 769
 		{
770 770
 			// We look for id type_contact
771 771
 			$sql = "SELECT tc.rowid";
772
-			$sql.= " FROM ".MAIN_DB_PREFIX."c_type_contact as tc";
773
-			$sql.= " WHERE tc.element='".$this->db->escape($this->element)."'";
774
-			$sql.= " AND tc.source='".$this->db->escape($source)."'";
775
-			$sql.= " AND tc.code='".$this->db->escape($type_contact)."' AND tc.active=1";
772
+			$sql .= " FROM ".MAIN_DB_PREFIX."c_type_contact as tc";
773
+			$sql .= " WHERE tc.element='".$this->db->escape($this->element)."'";
774
+			$sql .= " AND tc.source='".$this->db->escape($source)."'";
775
+			$sql .= " AND tc.code='".$this->db->escape($type_contact)."' AND tc.active=1";
776 776
 			//print $sql;
777
-			$resql=$this->db->query($sql);
777
+			$resql = $this->db->query($sql);
778 778
 			if ($resql)
779 779
 			{
780 780
 				$obj = $this->db->fetch_object($resql);
781
-				if ($obj) $id_type_contact=$obj->rowid;
781
+				if ($obj) $id_type_contact = $obj->rowid;
782 782
 			}
783 783
 		}
784 784
 
785 785
 		if ($id_type_contact == 0)
786 786
 		{
787
-			$this->error='CODE_NOT_VALID_FOR_THIS_ELEMENT';
787
+			$this->error = 'CODE_NOT_VALID_FOR_THIS_ELEMENT';
788 788
 			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");
789 789
 			return -3;
790 790
 		}
@@ -792,35 +792,35 @@  discard block
 block discarded – undo
792 792
 		$datecreate = dol_now();
793 793
 
794 794
 		// Socpeople must have already been added by some trigger, then we have to check it to avoid DB_ERROR_RECORD_ALREADY_EXISTS error
795
-		$TListeContacts=$this->liste_contact(-1, $source);
796
-		$already_added=false;
797
-		if(!empty($TListeContacts)) {
798
-			foreach($TListeContacts as $array_contact) {
799
-				if($array_contact['status'] == 4 && $array_contact['id'] == $fk_socpeople && $array_contact['fk_c_type_contact'] == $id_type_contact) {
800
-					$already_added=true;
795
+		$TListeContacts = $this->liste_contact(-1, $source);
796
+		$already_added = false;
797
+		if (!empty($TListeContacts)) {
798
+			foreach ($TListeContacts as $array_contact) {
799
+				if ($array_contact['status'] == 4 && $array_contact['id'] == $fk_socpeople && $array_contact['fk_c_type_contact'] == $id_type_contact) {
800
+					$already_added = true;
801 801
 					break;
802 802
 				}
803 803
 			}
804 804
 		}
805 805
 
806
-		if(!$already_added) {
806
+		if (!$already_added) {
807 807
 
808 808
 			$this->db->begin();
809 809
 
810 810
 			// Insert into database
811 811
 			$sql = "INSERT INTO ".MAIN_DB_PREFIX."element_contact";
812
-			$sql.= " (element_id, fk_socpeople, datecreate, statut, fk_c_type_contact) ";
813
-			$sql.= " VALUES (".$this->id.", ".$fk_socpeople." , " ;
814
-			$sql.= "'".$this->db->idate($datecreate)."'";
815
-			$sql.= ", 4, ". $id_type_contact;
816
-			$sql.= ")";
812
+			$sql .= " (element_id, fk_socpeople, datecreate, statut, fk_c_type_contact) ";
813
+			$sql .= " VALUES (".$this->id.", ".$fk_socpeople." , ";
814
+			$sql .= "'".$this->db->idate($datecreate)."'";
815
+			$sql .= ", 4, ".$id_type_contact;
816
+			$sql .= ")";
817 817
 
818
-			$resql=$this->db->query($sql);
818
+			$resql = $this->db->query($sql);
819 819
 			if ($resql)
820 820
 			{
821
-				if (! $notrigger)
821
+				if (!$notrigger)
822 822
 				{
823
-					$result=$this->call_trigger(strtoupper($this->element).'_ADD_CONTACT', $user);
823
+					$result = $this->call_trigger(strtoupper($this->element).'_ADD_CONTACT', $user);
824 824
 					if ($result < 0)
825 825
 					{
826 826
 						$this->db->rollback();
@@ -835,14 +835,14 @@  discard block
 block discarded – undo
835 835
 			{
836 836
 				if ($this->db->errno() == 'DB_ERROR_RECORD_ALREADY_EXISTS')
837 837
 				{
838
-					$this->error=$this->db->errno();
838
+					$this->error = $this->db->errno();
839 839
 					$this->db->rollback();
840 840
 					echo 'err rollback';
841 841
 					return -2;
842 842
 				}
843 843
 				else
844 844
 				{
845
-					$this->error=$this->db->error();
845
+					$this->error = $this->db->error();
846 846
 					$this->db->rollback();
847 847
 					return -1;
848 848
 				}
@@ -858,15 +858,15 @@  discard block
 block discarded – undo
858 858
 	 *    @param    string          $source     Nature of contact ('internal' or 'external')
859 859
 	 *    @return   int                         >0 if OK, <0 if KO
860 860
 	 */
861
-	function copy_linked_contact($objFrom, $source='internal')
861
+	function copy_linked_contact($objFrom, $source = 'internal')
862 862
 	{
863 863
         // phpcs:enable
864 864
 		$contacts = $objFrom->liste_contact(-1, $source);
865
-		foreach($contacts as $contact)
865
+		foreach ($contacts as $contact)
866 866
 		{
867 867
 			if ($this->add_contact($contact['id'], $contact['fk_c_type_contact'], $contact['source']) < 0)
868 868
 			{
869
-				$this->error=$this->db->lasterror();
869
+				$this->error = $this->db->lasterror();
870 870
 				return -1;
871 871
 			}
872 872
 		}
@@ -883,23 +883,23 @@  discard block
 block discarded – undo
883 883
 	 *      @param  int		$fk_socpeople	    Id of soc_people to update (not modified if 0)
884 884
 	 *      @return int                 		<0 if KO, >= 0 if OK
885 885
 	 */
886
-	function update_contact($rowid, $statut, $type_contact_id=0, $fk_socpeople=0)
886
+	function update_contact($rowid, $statut, $type_contact_id = 0, $fk_socpeople = 0)
887 887
 	{
888 888
         // phpcs:enable
889 889
 		// Insert into database
890 890
 		$sql = "UPDATE ".MAIN_DB_PREFIX."element_contact set";
891
-		$sql.= " statut = ".$statut;
892
-		if ($type_contact_id) $sql.= ", fk_c_type_contact = '".$type_contact_id ."'";
893
-		if ($fk_socpeople) $sql.= ", fk_socpeople = '".$fk_socpeople ."'";
894
-		$sql.= " where rowid = ".$rowid;
895
-		$resql=$this->db->query($sql);
891
+		$sql .= " statut = ".$statut;
892
+		if ($type_contact_id) $sql .= ", fk_c_type_contact = '".$type_contact_id."'";
893
+		if ($fk_socpeople) $sql .= ", fk_socpeople = '".$fk_socpeople."'";
894
+		$sql .= " where rowid = ".$rowid;
895
+		$resql = $this->db->query($sql);
896 896
 		if ($resql)
897 897
 		{
898 898
 			return 0;
899 899
 		}
900 900
 		else
901 901
 		{
902
-			$this->error=$this->db->lasterror();
902
+			$this->error = $this->db->lasterror();
903 903
 			return -1;
904 904
 		}
905 905
 	}
@@ -912,7 +912,7 @@  discard block
 block discarded – undo
912 912
 	 *    @param	int		$notrigger		Disable all triggers
913 913
 	 *    @return   int						>0 if OK, <0 if KO
914 914
 	 */
915
-	function delete_contact($rowid, $notrigger=0)
915
+	function delete_contact($rowid, $notrigger = 0)
916 916
 	{
917 917
         // phpcs:enable
918 918
 		global $user;
@@ -921,14 +921,14 @@  discard block
 block discarded – undo
921 921
 		$this->db->begin();
922 922
 
923 923
 		$sql = "DELETE FROM ".MAIN_DB_PREFIX."element_contact";
924
-		$sql.= " WHERE rowid =".$rowid;
924
+		$sql .= " WHERE rowid =".$rowid;
925 925
 
926 926
 		dol_syslog(get_class($this)."::delete_contact", LOG_DEBUG);
927 927
 		if ($this->db->query($sql))
928 928
 		{
929
-			if (! $notrigger)
929
+			if (!$notrigger)
930 930
 			{
931
-				$result=$this->call_trigger(strtoupper($this->element).'_DELETE_CONTACT', $user);
931
+				$result = $this->call_trigger(strtoupper($this->element).'_DELETE_CONTACT', $user);
932 932
 				if ($result < 0) { $this->db->rollback(); return -1; }
933 933
 			}
934 934
 
@@ -937,7 +937,7 @@  discard block
 block discarded – undo
937 937
 		}
938 938
 		else
939 939
 		{
940
-			$this->error=$this->db->lasterror();
940
+			$this->error = $this->db->lasterror();
941 941
 			$this->db->rollback();
942 942
 			return -1;
943 943
 		}
@@ -951,22 +951,22 @@  discard block
 block discarded – undo
951 951
 	 *	  @param	string	$code		Type of contact (code or id)
952 952
 	 *    @return   int					>0 if OK, <0 if KO
953 953
 	 */
954
-	function delete_linked_contact($source='',$code='')
954
+	function delete_linked_contact($source = '', $code = '')
955 955
 	{
956 956
         // phpcs:enable
957 957
 		$temp = array();
958
-		$typeContact = $this->liste_type_contact($source,'',0,0,$code);
958
+		$typeContact = $this->liste_type_contact($source, '', 0, 0, $code);
959 959
 
960
-		foreach($typeContact as $key => $value)
960
+		foreach ($typeContact as $key => $value)
961 961
 		{
962
-			array_push($temp,$key);
962
+			array_push($temp, $key);
963 963
 		}
964 964
 		$listId = implode(",", $temp);
965 965
 
966 966
 		$sql = "DELETE FROM ".MAIN_DB_PREFIX."element_contact";
967
-		$sql.= " WHERE element_id = ".$this->id;
967
+		$sql .= " WHERE element_id = ".$this->id;
968 968
 		if ($listId)
969
-			$sql.= " AND fk_c_type_contact IN (".$listId.")";
969
+			$sql .= " AND fk_c_type_contact IN (".$listId.")";
970 970
 
971 971
 		dol_syslog(get_class($this)."::delete_linked_contact", LOG_DEBUG);
972 972
 		if ($this->db->query($sql))
@@ -975,7 +975,7 @@  discard block
 block discarded – undo
975 975
 		}
976 976
 		else
977 977
 		{
978
-			$this->error=$this->db->lasterror();
978
+			$this->error = $this->db->lasterror();
979 979
 			return -1;
980 980
 		}
981 981
 	}
@@ -990,54 +990,54 @@  discard block
 block discarded – undo
990 990
 	 *    @param    string      $code       Filter on this code of contact type ('SHIPPING', 'BILLING', ...)
991 991
 	 *    @return	array|int		        Array of contacts, -1 if error
992 992
 	 */
993
-	function liste_contact($statut=-1,$source='external',$list=0,$code='')
993
+	function liste_contact($statut = -1, $source = 'external', $list = 0, $code = '')
994 994
 	{
995 995
         // phpcs:enable
996 996
 		global $langs;
997 997
 
998
-		$tab=array();
999
-
1000
-		$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
1001
-		if ($source == 'internal') $sql.=", '-1' as socid, t.statut as statuscontact, t.login, t.photo";
1002
-		if ($source == 'external' || $source == 'thirdparty') $sql.=", t.fk_soc as socid, t.statut as statuscontact";
1003
-		$sql.= ", t.civility as civility, t.lastname as lastname, t.firstname, t.email";
1004
-		$sql.= ", tc.source, tc.element, tc.code, tc.libelle";
1005
-		$sql.= " FROM ".MAIN_DB_PREFIX."c_type_contact tc";
1006
-		$sql.= ", ".MAIN_DB_PREFIX."element_contact ec";
1007
-		if ($source == 'internal') $sql.=" LEFT JOIN ".MAIN_DB_PREFIX."user t on ec.fk_socpeople = t.rowid";
1008
-		if ($source == 'external'|| $source == 'thirdparty') $sql.=" LEFT JOIN ".MAIN_DB_PREFIX."socpeople t on ec.fk_socpeople = t.rowid";
1009
-		$sql.= " WHERE ec.element_id =".$this->id;
1010
-		$sql.= " AND ec.fk_c_type_contact=tc.rowid";
1011
-		$sql.= " AND tc.element='".$this->db->escape($this->element)."'";
1012
-		if ($code) $sql.= " AND tc.code = '".$this->db->escape($code)."'";
1013
-		if ($source == 'internal') $sql.= " AND tc.source = 'internal'";
1014
-		if ($source == 'external' || $source == 'thirdparty') $sql.= " AND tc.source = 'external'";
1015
-		$sql.= " AND tc.active=1";
1016
-		if ($statut >= 0) $sql.= " AND ec.statut = '".$statut."'";
1017
-		$sql.=" ORDER BY t.lastname ASC";
998
+		$tab = array();
999
+
1000
+		$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
1001
+		if ($source == 'internal') $sql .= ", '-1' as socid, t.statut as statuscontact, t.login, t.photo";
1002
+		if ($source == 'external' || $source == 'thirdparty') $sql .= ", t.fk_soc as socid, t.statut as statuscontact";
1003
+		$sql .= ", t.civility as civility, t.lastname as lastname, t.firstname, t.email";
1004
+		$sql .= ", tc.source, tc.element, tc.code, tc.libelle";
1005
+		$sql .= " FROM ".MAIN_DB_PREFIX."c_type_contact tc";
1006
+		$sql .= ", ".MAIN_DB_PREFIX."element_contact ec";
1007
+		if ($source == 'internal') $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."user t on ec.fk_socpeople = t.rowid";
1008
+		if ($source == 'external' || $source == 'thirdparty') $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."socpeople t on ec.fk_socpeople = t.rowid";
1009
+		$sql .= " WHERE ec.element_id =".$this->id;
1010
+		$sql .= " AND ec.fk_c_type_contact=tc.rowid";
1011
+		$sql .= " AND tc.element='".$this->db->escape($this->element)."'";
1012
+		if ($code) $sql .= " AND tc.code = '".$this->db->escape($code)."'";
1013
+		if ($source == 'internal') $sql .= " AND tc.source = 'internal'";
1014
+		if ($source == 'external' || $source == 'thirdparty') $sql .= " AND tc.source = 'external'";
1015
+		$sql .= " AND tc.active=1";
1016
+		if ($statut >= 0) $sql .= " AND ec.statut = '".$statut."'";
1017
+		$sql .= " ORDER BY t.lastname ASC";
1018 1018
 
1019 1019
 		dol_syslog(get_class($this)."::liste_contact", LOG_DEBUG);
1020
-		$resql=$this->db->query($sql);
1020
+		$resql = $this->db->query($sql);
1021 1021
 		if ($resql)
1022 1022
 		{
1023
-			$num=$this->db->num_rows($resql);
1024
-			$i=0;
1023
+			$num = $this->db->num_rows($resql);
1024
+			$i = 0;
1025 1025
 			while ($i < $num)
1026 1026
 			{
1027 1027
 				$obj = $this->db->fetch_object($resql);
1028 1028
 
1029
-				if (! $list)
1029
+				if (!$list)
1030 1030
 				{
1031
-					$transkey="TypeContact_".$obj->element."_".$obj->source."_".$obj->code;
1032
-					$libelle_type=($langs->trans($transkey)!=$transkey ? $langs->trans($transkey) : $obj->libelle);
1033
-					$tab[$i]=array('source'=>$obj->source,'socid'=>$obj->socid,'id'=>$obj->id,
1034
-								   'nom'=>$obj->lastname,      // For backward compatibility
1031
+					$transkey = "TypeContact_".$obj->element."_".$obj->source."_".$obj->code;
1032
+					$libelle_type = ($langs->trans($transkey) != $transkey ? $langs->trans($transkey) : $obj->libelle);
1033
+					$tab[$i] = array('source'=>$obj->source, 'socid'=>$obj->socid, 'id'=>$obj->id,
1034
+								   'nom'=>$obj->lastname, // For backward compatibility
1035 1035
 								   'civility'=>$obj->civility, 'lastname'=>$obj->lastname, 'firstname'=>$obj->firstname, 'email'=>$obj->email, 'login'=>$obj->login, 'photo'=>$obj->photo, 'statuscontact'=>$obj->statuscontact,
1036 1036
 								   'rowid'=>$obj->rowid, 'code'=>$obj->code, 'libelle'=>$libelle_type, 'status'=>$obj->statuslink, 'fk_c_type_contact'=>$obj->fk_c_type_contact);
1037 1037
 				}
1038 1038
 				else
1039 1039
 				{
1040
-					$tab[$i]=$obj->id;
1040
+					$tab[$i] = $obj->id;
1041 1041
 				}
1042 1042
 
1043 1043
 				$i++;
@@ -1047,7 +1047,7 @@  discard block
 block discarded – undo
1047 1047
 		}
1048 1048
 		else
1049 1049
 		{
1050
-			$this->error=$this->db->lasterror();
1050
+			$this->error = $this->db->lasterror();
1051 1051
 			dol_print_error($this->db);
1052 1052
 			return -1;
1053 1053
 		}
@@ -1063,16 +1063,16 @@  discard block
 block discarded – undo
1063 1063
 	function swapContactStatus($rowid)
1064 1064
 	{
1065 1065
 		$sql = "SELECT ec.datecreate, ec.statut, ec.fk_socpeople, ec.fk_c_type_contact,";
1066
-		$sql.= " tc.code, tc.libelle";
1066
+		$sql .= " tc.code, tc.libelle";
1067 1067
 		//$sql.= ", s.fk_soc";
1068
-		$sql.= " FROM (".MAIN_DB_PREFIX."element_contact as ec, ".MAIN_DB_PREFIX."c_type_contact as tc)";
1068
+		$sql .= " FROM (".MAIN_DB_PREFIX."element_contact as ec, ".MAIN_DB_PREFIX."c_type_contact as tc)";
1069 1069
 		//$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
1070
-		$sql.= " WHERE ec.rowid =".$rowid;
1071
-		$sql.= " AND ec.fk_c_type_contact=tc.rowid";
1072
-		$sql.= " AND tc.element = '".$this->db->escape($this->element)."'";
1070
+		$sql .= " WHERE ec.rowid =".$rowid;
1071
+		$sql .= " AND ec.fk_c_type_contact=tc.rowid";
1072
+		$sql .= " AND tc.element = '".$this->db->escape($this->element)."'";
1073 1073
 
1074 1074
 		dol_syslog(get_class($this)."::swapContactStatus", LOG_DEBUG);
1075
-		$resql=$this->db->query($sql);
1075
+		$resql = $this->db->query($sql);
1076 1076
 		if ($resql)
1077 1077
 		{
1078 1078
 			$obj = $this->db->fetch_object($resql);
@@ -1083,7 +1083,7 @@  discard block
 block discarded – undo
1083 1083
 		}
1084 1084
 		else
1085 1085
 		{
1086
-			$this->error=$this->db->error();
1086
+			$this->error = $this->db->error();
1087 1087
 			dol_print_error($this->db);
1088 1088
 			return -1;
1089 1089
 		}
@@ -1100,44 +1100,44 @@  discard block
 block discarded – undo
1100 1100
 	 *		@param	string	$code		Type of contact (Example: 'CUSTOMER', 'SERVICE')
1101 1101
 	 *      @return array       		Array list of type of contacts (id->label if option=0, code->label if option=1)
1102 1102
 	 */
1103
-	function liste_type_contact($source='internal', $order='position', $option=0, $activeonly=0, $code='')
1103
+	function liste_type_contact($source = 'internal', $order = 'position', $option = 0, $activeonly = 0, $code = '')
1104 1104
 	{
1105 1105
         // phpcs:enable
1106 1106
 		global $langs;
1107 1107
 
1108
-		if (empty($order)) $order='position';
1109
-		if ($order == 'position') $order.=',code';
1108
+		if (empty($order)) $order = 'position';
1109
+		if ($order == 'position') $order .= ',code';
1110 1110
 
1111 1111
 		$tab = array();
1112 1112
 		$sql = "SELECT DISTINCT tc.rowid, tc.code, tc.libelle, tc.position";
1113
-		$sql.= " FROM ".MAIN_DB_PREFIX."c_type_contact as tc";
1114
-		$sql.= " WHERE tc.element='".$this->db->escape($this->element)."'";
1115
-		if ($activeonly == 1) $sql.= " AND tc.active=1"; // only the active types
1116
-		if (! empty($source) && $source != 'all') $sql.= " AND tc.source='".$this->db->escape($source)."'";
1117
-		if (! empty($code)) $sql.= " AND tc.code='".$this->db->escape($code)."'";
1118
-		$sql.= $this->db->order($order,'ASC');
1113
+		$sql .= " FROM ".MAIN_DB_PREFIX."c_type_contact as tc";
1114
+		$sql .= " WHERE tc.element='".$this->db->escape($this->element)."'";
1115
+		if ($activeonly == 1) $sql .= " AND tc.active=1"; // only the active types
1116
+		if (!empty($source) && $source != 'all') $sql .= " AND tc.source='".$this->db->escape($source)."'";
1117
+		if (!empty($code)) $sql .= " AND tc.code='".$this->db->escape($code)."'";
1118
+		$sql .= $this->db->order($order, 'ASC');
1119 1119
 
1120 1120
 		//print "sql=".$sql;
1121
-		$resql=$this->db->query($sql);
1121
+		$resql = $this->db->query($sql);
1122 1122
 		if ($resql)
1123 1123
 		{
1124
-			$num=$this->db->num_rows($resql);
1125
-			$i=0;
1124
+			$num = $this->db->num_rows($resql);
1125
+			$i = 0;
1126 1126
 			while ($i < $num)
1127 1127
 			{
1128 1128
 				$obj = $this->db->fetch_object($resql);
1129 1129
 
1130
-				$transkey="TypeContact_".$this->element."_".$source."_".$obj->code;
1131
-				$libelle_type=($langs->trans($transkey)!=$transkey ? $langs->trans($transkey) : $obj->libelle);
1132
-				if (empty($option)) $tab[$obj->rowid]=$libelle_type;
1133
-				else $tab[$obj->code]=$libelle_type;
1130
+				$transkey = "TypeContact_".$this->element."_".$source."_".$obj->code;
1131
+				$libelle_type = ($langs->trans($transkey) != $transkey ? $langs->trans($transkey) : $obj->libelle);
1132
+				if (empty($option)) $tab[$obj->rowid] = $libelle_type;
1133
+				else $tab[$obj->code] = $libelle_type;
1134 1134
 				$i++;
1135 1135
 			}
1136 1136
 			return $tab;
1137 1137
 		}
1138 1138
 		else
1139 1139
 		{
1140
-			$this->error=$this->db->lasterror();
1140
+			$this->error = $this->db->lasterror();
1141 1141
 			//dol_print_error($this->db);
1142 1142
 			return null;
1143 1143
 		}
@@ -1154,53 +1154,53 @@  discard block
 block discarded – undo
1154 1154
 	 *		@param	int		$status		limited to a certain status
1155 1155
 	 *      @return array       		List of id for such contacts
1156 1156
 	 */
1157
-	function getIdContact($source,$code,$status=0)
1157
+	function getIdContact($source, $code, $status = 0)
1158 1158
 	{
1159 1159
 		global $conf;
1160 1160
 
1161
-		$result=array();
1162
-		$i=0;
1161
+		$result = array();
1162
+		$i = 0;
1163 1163
 		//cas particulier pour les expeditions
1164
-		if($this->element=='shipping' && $this->origin_id != 0) {
1165
-			$id=$this->origin_id;
1166
-			$element='commande';
1167
-        } else if($this->element=='reception' && $this->origin_id != 0) {
1168
-            $id=$this->origin_id;
1169
-            $element='order_supplier';
1164
+		if ($this->element == 'shipping' && $this->origin_id != 0) {
1165
+			$id = $this->origin_id;
1166
+			$element = 'commande';
1167
+        } else if ($this->element == 'reception' && $this->origin_id != 0) {
1168
+            $id = $this->origin_id;
1169
+            $element = 'order_supplier';
1170 1170
 		} else {
1171
-			$id=$this->id;
1172
-			$element=$this->element;
1171
+			$id = $this->id;
1172
+			$element = $this->element;
1173 1173
 		}
1174 1174
 
1175 1175
 		$sql = "SELECT ec.fk_socpeople";
1176
-		$sql.= " FROM ".MAIN_DB_PREFIX."element_contact as ec,";
1177
-		if ($source == 'internal') $sql.= " ".MAIN_DB_PREFIX."user as c,";
1178
-		if ($source == 'external') $sql.= " ".MAIN_DB_PREFIX."socpeople as c,";
1179
-		$sql.= " ".MAIN_DB_PREFIX."c_type_contact as tc";
1180
-		$sql.= " WHERE ec.element_id = ".$id;
1181
-		$sql.= " AND ec.fk_socpeople = c.rowid";
1182
-		if ($source == 'internal') $sql.= " AND c.entity IN (".getEntity('user').")";
1183
-		if ($source == 'external') $sql.= " AND c.entity IN (".getEntity('societe').")";
1184
-		$sql.= " AND ec.fk_c_type_contact = tc.rowid";
1185
-		$sql.= " AND tc.element = '".$element."'";
1186
-		$sql.= " AND tc.source = '".$source."'";
1187
-		$sql.= " AND tc.code = '".$code."'";
1188
-		$sql.= " AND tc.active = 1";
1189
-		if ($status) $sql.= " AND ec.statut = ".$status;
1176
+		$sql .= " FROM ".MAIN_DB_PREFIX."element_contact as ec,";
1177
+		if ($source == 'internal') $sql .= " ".MAIN_DB_PREFIX."user as c,";
1178
+		if ($source == 'external') $sql .= " ".MAIN_DB_PREFIX."socpeople as c,";
1179
+		$sql .= " ".MAIN_DB_PREFIX."c_type_contact as tc";
1180
+		$sql .= " WHERE ec.element_id = ".$id;
1181
+		$sql .= " AND ec.fk_socpeople = c.rowid";
1182
+		if ($source == 'internal') $sql .= " AND c.entity IN (".getEntity('user').")";
1183
+		if ($source == 'external') $sql .= " AND c.entity IN (".getEntity('societe').")";
1184
+		$sql .= " AND ec.fk_c_type_contact = tc.rowid";
1185
+		$sql .= " AND tc.element = '".$element."'";
1186
+		$sql .= " AND tc.source = '".$source."'";
1187
+		$sql .= " AND tc.code = '".$code."'";
1188
+		$sql .= " AND tc.active = 1";
1189
+		if ($status) $sql .= " AND ec.statut = ".$status;
1190 1190
 
1191 1191
 		dol_syslog(get_class($this)."::getIdContact", LOG_DEBUG);
1192
-		$resql=$this->db->query($sql);
1192
+		$resql = $this->db->query($sql);
1193 1193
 		if ($resql)
1194 1194
 		{
1195 1195
 			while ($obj = $this->db->fetch_object($resql))
1196 1196
 			{
1197
-				$result[$i]=$obj->fk_socpeople;
1197
+				$result[$i] = $obj->fk_socpeople;
1198 1198
 				$i++;
1199 1199
 			}
1200 1200
 		}
1201 1201
 		else
1202 1202
 		{
1203
-			$this->error=$this->db->error();
1203
+			$this->error = $this->db->error();
1204 1204
 			return null;
1205 1205
 		}
1206 1206
 
@@ -1214,16 +1214,16 @@  discard block
 block discarded – undo
1214 1214
 	 *		@param	int		$contactid      Id du contact. Use this->contactid if empty.
1215 1215
 	 *		@return	int						<0 if KO, >0 if OK
1216 1216
 	 */
1217
-	function fetch_contact($contactid=null)
1217
+	function fetch_contact($contactid = null)
1218 1218
 	{
1219 1219
         // phpcs:enable
1220
-		if (empty($contactid)) $contactid=$this->contactid;
1220
+		if (empty($contactid)) $contactid = $this->contactid;
1221 1221
 
1222 1222
 		if (empty($contactid)) return 0;
1223 1223
 
1224 1224
 		require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php';
1225 1225
 		$contact = new Contact($this->db);
1226
-		$result=$contact->fetch($contactid);
1226
+		$result = $contact->fetch($contactid);
1227 1227
 		$this->contact = $contact;
1228 1228
 		return $result;
1229 1229
 	}
@@ -1235,7 +1235,7 @@  discard block
 block discarded – undo
1235 1235
 	 *		@param		int		$force_thirdparty_id	Force thirdparty id
1236 1236
 	 *		@return		int								<0 if KO, >0 if OK
1237 1237
 	 */
1238
-	function fetch_thirdparty($force_thirdparty_id=0)
1238
+	function fetch_thirdparty($force_thirdparty_id = 0)
1239 1239
 	{
1240 1240
         // phpcs:enable
1241 1241
 		global $conf;
@@ -1243,7 +1243,7 @@  discard block
 block discarded – undo
1243 1243
 		if (empty($this->socid) && empty($this->fk_soc) && empty($this->fk_thirdparty) && empty($force_thirdparty_id))
1244 1244
 			return 0;
1245 1245
 
1246
-		require_once DOL_DOCUMENT_ROOT . '/societe/class/societe.class.php';
1246
+		require_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php';
1247 1247
 
1248 1248
 		$idtofetch = isset($this->socid) ? $this->socid : (isset($this->fk_soc) ? $this->fk_soc : $this->fk_thirdparty);
1249 1249
 		if ($force_thirdparty_id)
@@ -1306,7 +1306,7 @@  discard block
 block discarded – undo
1306 1306
 
1307 1307
 		dol_syslog(get_class($this).'::fetch_barcode this->element='.$this->element.' this->barcode_type='.$this->barcode_type);
1308 1308
 
1309
-		$idtype=$this->barcode_type;
1309
+		$idtype = $this->barcode_type;
1310 1310
 		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
1311 1311
 		{
1312 1312
 			if ($this->element == 'product')      $idtype = $conf->global->PRODUIT_DEFAULT_BARCODE_TYPE;
@@ -1319,8 +1319,8 @@  discard block
 block discarded – undo
1319 1319
 			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
1320 1320
 			{
1321 1321
 				$sql = "SELECT rowid, code, libelle as label, coder";
1322
-				$sql.= " FROM ".MAIN_DB_PREFIX."c_barcode_type";
1323
-				$sql.= " WHERE rowid = ".$idtype;
1322
+				$sql .= " FROM ".MAIN_DB_PREFIX."c_barcode_type";
1323
+				$sql .= " WHERE rowid = ".$idtype;
1324 1324
 				dol_syslog(get_class($this).'::fetch_barcode', LOG_DEBUG);
1325 1325
 				$resql = $this->db->query($sql);
1326 1326
 				if ($resql)
@@ -1353,13 +1353,13 @@  discard block
 block discarded – undo
1353 1353
         // phpcs:enable
1354 1354
 		include_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
1355 1355
 
1356
-		if (empty($this->fk_project) && ! empty($this->fk_projet)) $this->fk_project = $this->fk_projet;	// For backward compatibility
1356
+		if (empty($this->fk_project) && !empty($this->fk_projet)) $this->fk_project = $this->fk_projet; // For backward compatibility
1357 1357
 		if (empty($this->fk_project)) return 0;
1358 1358
 
1359 1359
 		$project = new Project($this->db);
1360 1360
 		$result = $project->fetch($this->fk_project);
1361 1361
 
1362
-		$this->projet = $project;	// deprecated
1362
+		$this->projet = $project; // deprecated
1363 1363
 		$this->project = $project;
1364 1364
 		return $result;
1365 1365
 	}
@@ -1395,7 +1395,7 @@  discard block
 block discarded – undo
1395 1395
 	{
1396 1396
         // phpcs:enable
1397 1397
 		$user = new User($this->db);
1398
-		$result=$user->fetch($userid);
1398
+		$result = $user->fetch($userid);
1399 1399
 		$this->user = $user;
1400 1400
 		return $result;
1401 1401
 	}
@@ -1433,14 +1433,14 @@  discard block
 block discarded – undo
1433 1433
 	{
1434 1434
 		global $conf;
1435 1435
 
1436
-		$result=false;
1436
+		$result = false;
1437 1437
 
1438 1438
 		$sql = "SELECT rowid FROM ".MAIN_DB_PREFIX.$table;
1439
-		$sql.= " WHERE ".$field." = '".$key."'";
1440
-		if (! empty($element)) {
1441
-			$sql.= " AND entity IN (".getEntity($element).")";
1439
+		$sql .= " WHERE ".$field." = '".$key."'";
1440
+		if (!empty($element)) {
1441
+			$sql .= " AND entity IN (".getEntity($element).")";
1442 1442
 		} else {
1443
-			$sql.= " AND entity = ".$conf->entity;
1443
+			$sql .= " AND entity = ".$conf->entity;
1444 1444
 		}
1445 1445
 
1446 1446
 		dol_syslog(get_class($this).'::fetchObjectFrom', LOG_DEBUG);
@@ -1467,10 +1467,10 @@  discard block
 block discarded – undo
1467 1467
 	 */
1468 1468
 	function getValueFrom($table, $id, $field)
1469 1469
 	{
1470
-		$result=false;
1470
+		$result = false;
1471 1471
 		if (!empty($id) && !empty($field) && !empty($table)) {
1472 1472
 			$sql = "SELECT ".$field." FROM ".MAIN_DB_PREFIX.$table;
1473
-			$sql.= " WHERE rowid = ".$id;
1473
+			$sql .= " WHERE rowid = ".$id;
1474 1474
 
1475 1475
 			dol_syslog(get_class($this).'::getValueFrom', LOG_DEBUG);
1476 1476
 			$resql = $this->db->query($sql);
@@ -1499,36 +1499,36 @@  discard block
 block discarded – undo
1499 1499
 	 *	@return	int							<0 if KO, >0 if OK
1500 1500
 	 *  @see updateExtraField
1501 1501
 	 */
1502
-	function setValueFrom($field, $value, $table='', $id=null, $format='', $id_field='', $fuser=null, $trigkey='', $fk_user_field='fk_user_modif')
1502
+	function setValueFrom($field, $value, $table = '', $id = null, $format = '', $id_field = '', $fuser = null, $trigkey = '', $fk_user_field = 'fk_user_modif')
1503 1503
 	{
1504
-		global $user,$langs,$conf;
1504
+		global $user, $langs, $conf;
1505 1505
 
1506
-		if (empty($table)) 	  $table=$this->table_element;
1507
-		if (empty($id))    	  $id=$this->id;
1508
-		if (empty($format))   $format='text';
1509
-		if (empty($id_field)) $id_field='rowid';
1506
+		if (empty($table)) 	  $table = $this->table_element;
1507
+		if (empty($id))    	  $id = $this->id;
1508
+		if (empty($format))   $format = 'text';
1509
+		if (empty($id_field)) $id_field = 'rowid';
1510 1510
 
1511
-		$error=0;
1511
+		$error = 0;
1512 1512
 
1513 1513
 		$this->db->begin();
1514 1514
 
1515 1515
 		// Special case
1516
-		if ($table == 'product' && $field == 'note_private') $field='note';
1516
+		if ($table == 'product' && $field == 'note_private') $field = 'note';
1517 1517
 		if (in_array($table, array('actioncomm', 'adherent', 'advtargetemailing', 'cronjob', 'establishment'))) $fk_user_field = 'fk_user_mod';
1518 1518
 
1519 1519
 		$sql = "UPDATE ".MAIN_DB_PREFIX.$table." SET ";
1520 1520
 
1521
-		if ($format == 'text') $sql.= $field." = '".$this->db->escape($value)."'";
1522
-		else if ($format == 'int') $sql.= $field." = ".$this->db->escape($value);
1523
-		else if ($format == 'date') $sql.= $field." = ".($value ? "'".$this->db->idate($value)."'" : "null");
1521
+		if ($format == 'text') $sql .= $field." = '".$this->db->escape($value)."'";
1522
+		else if ($format == 'int') $sql .= $field." = ".$this->db->escape($value);
1523
+		else if ($format == 'date') $sql .= $field." = ".($value ? "'".$this->db->idate($value)."'" : "null");
1524 1524
 
1525 1525
 		if ($fk_user_field)
1526 1526
 		{
1527
-			if (! empty($fuser) && is_object($fuser)) $sql.=", ".$fk_user_field." = ".$fuser->id;
1528
-			elseif (empty($fuser) || $fuser != 'none') $sql.=", ".$fk_user_field." = ".$user->id;
1527
+			if (!empty($fuser) && is_object($fuser)) $sql .= ", ".$fk_user_field." = ".$fuser->id;
1528
+			elseif (empty($fuser) || $fuser != 'none') $sql .= ", ".$fk_user_field." = ".$user->id;
1529 1529
 		}
1530 1530
 
1531
-		$sql.= " WHERE ".$id_field." = ".$id;
1531
+		$sql .= " WHERE ".$id_field." = ".$id;
1532 1532
 
1533 1533
 		dol_syslog(get_class($this)."::".__FUNCTION__."", LOG_DEBUG);
1534 1534
 		$resql = $this->db->query($sql);
@@ -1545,11 +1545,11 @@  discard block
 block discarded – undo
1545 1545
 				{
1546 1546
 					$result = $this->fetchCommon($id);
1547 1547
 				}
1548
-				if ($result >= 0) $result=$this->call_trigger($trigkey, (! empty($fuser) && is_object($fuser)) ? $fuser : $user);   // This may set this->errors
1548
+				if ($result >= 0) $result = $this->call_trigger($trigkey, (!empty($fuser) && is_object($fuser)) ? $fuser : $user); // This may set this->errors
1549 1549
 				if ($result < 0) $error++;
1550 1550
 			}
1551 1551
 
1552
-			if (! $error)
1552
+			if (!$error)
1553 1553
 			{
1554 1554
 				if (property_exists($this, $field)) $this->$field = $value;
1555 1555
 				$this->db->commit();
@@ -1563,7 +1563,7 @@  discard block
 block discarded – undo
1563 1563
 		}
1564 1564
 		else
1565 1565
 		{
1566
-			$this->error=$this->db->lasterror();
1566
+			$this->error = $this->db->lasterror();
1567 1567
 			$this->db->rollback();
1568 1568
 			return -1;
1569 1569
 		}
@@ -1578,14 +1578,14 @@  discard block
 block discarded – undo
1578 1578
 	 *		@param	int		$nodbprefix	Do not include DB prefix to forge table name
1579 1579
 	 *      @return int         		<0 if KO, >0 if OK
1580 1580
 	 */
1581
-	function load_previous_next_ref($filter, $fieldid, $nodbprefix=0)
1581
+	function load_previous_next_ref($filter, $fieldid, $nodbprefix = 0)
1582 1582
 	{
1583 1583
         // phpcs:enable
1584 1584
 		global $conf, $user;
1585 1585
 
1586
-		if (! $this->table_element)
1586
+		if (!$this->table_element)
1587 1587
 		{
1588
-			dol_print_error('',get_class($this)."::load_previous_next_ref was called on objet with property table_element not defined");
1588
+			dol_print_error('', get_class($this)."::load_previous_next_ref was called on objet with property table_element not defined");
1589 1589
 			return -1;
1590 1590
 		}
1591 1591
 		if ($fieldid == 'none') return 1;
@@ -1600,45 +1600,45 @@  discard block
 block discarded – undo
1600 1600
 		if ($this->element == 'societe') $alias = 'te';
1601 1601
 
1602 1602
 		$sql = "SELECT MAX(te.".$fieldid.")";
1603
-		$sql.= " FROM ".(empty($nodbprefix)?MAIN_DB_PREFIX:'').$this->table_element." as te";
1604
-		if ($this->element == 'user' && ! empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE)) {
1605
-			$sql.= ",".MAIN_DB_PREFIX."usergroup_user as ug";
1606
-		}
1607
-		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
1608
-		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
1609
-		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
1610
-		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";
1611
-		$sql.= " WHERE te.".$fieldid." < '".$this->db->escape($this->ref)."'";  // ->ref must always be defined (set to id if field does not exists)
1612
-		if ($this->restrictiononfksoc == 1 && !$user->rights->societe->client->voir && !$socid) $sql.= " AND sc.fk_user = " .$user->id;
1613
-		if ($this->restrictiononfksoc == 2 && !$user->rights->societe->client->voir && !$socid) $sql.= " AND (sc.fk_user = " .$user->id.' OR te.fk_soc IS NULL)';
1614
-		if (! empty($filter))
1615
-		{
1616
-			if (! preg_match('/^\s*AND/i', $filter)) $sql.=" AND ";   // For backward compatibility
1617
-			$sql.=$filter;
1618
-		}
1619
-		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
1620
-		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
1603
+		$sql .= " FROM ".(empty($nodbprefix) ?MAIN_DB_PREFIX:'').$this->table_element." as te";
1604
+		if ($this->element == 'user' && !empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE)) {
1605
+			$sql .= ",".MAIN_DB_PREFIX."usergroup_user as ug";
1606
+		}
1607
+		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
1608
+		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
1609
+		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
1610
+		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";
1611
+		$sql .= " WHERE te.".$fieldid." < '".$this->db->escape($this->ref)."'"; // ->ref must always be defined (set to id if field does not exists)
1612
+		if ($this->restrictiononfksoc == 1 && !$user->rights->societe->client->voir && !$socid) $sql .= " AND sc.fk_user = ".$user->id;
1613
+		if ($this->restrictiononfksoc == 2 && !$user->rights->societe->client->voir && !$socid) $sql .= " AND (sc.fk_user = ".$user->id.' OR te.fk_soc IS NULL)';
1614
+		if (!empty($filter))
1615
+		{
1616
+			if (!preg_match('/^\s*AND/i', $filter)) $sql .= " AND "; // For backward compatibility
1617
+			$sql .= $filter;
1618
+		}
1619
+		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
1620
+		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
1621 1621
 		if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) {
1622
-			if ($this->element == 'user' && ! empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE)) {
1623
-				if (! empty($user->admin) && empty($user->entity) && $conf->entity == 1) {
1624
-					$sql.= " AND te.entity IS NOT NULL"; // Show all users
1622
+			if ($this->element == 'user' && !empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE)) {
1623
+				if (!empty($user->admin) && empty($user->entity) && $conf->entity == 1) {
1624
+					$sql .= " AND te.entity IS NOT NULL"; // Show all users
1625 1625
 				} else {
1626
-					$sql.= " AND ug.fk_user = te.rowid";
1627
-					$sql.= " AND ug.entity IN (".getEntity($this->element).")";
1626
+					$sql .= " AND ug.fk_user = te.rowid";
1627
+					$sql .= " AND ug.entity IN (".getEntity($this->element).")";
1628 1628
 				}
1629 1629
 			} else {
1630
-				$sql.= ' AND te.entity IN ('.getEntity($this->element).')';
1630
+				$sql .= ' AND te.entity IN ('.getEntity($this->element).')';
1631 1631
 			}
1632 1632
 		}
1633
-		if ($this->restrictiononfksoc == 1 && $socid && $this->element != 'societe') $sql.= ' AND te.fk_soc = ' . $socid;
1634
-		if ($this->restrictiononfksoc == 2 && $socid && $this->element != 'societe') $sql.= ' AND (te.fk_soc = ' . $socid.' OR te.fk_soc IS NULL)';
1635
-		if ($this->restrictiononfksoc && $socid && $this->element == 'societe') $sql.= ' AND te.rowid = ' . $socid;
1633
+		if ($this->restrictiononfksoc == 1 && $socid && $this->element != 'societe') $sql .= ' AND te.fk_soc = '.$socid;
1634
+		if ($this->restrictiononfksoc == 2 && $socid && $this->element != 'societe') $sql .= ' AND (te.fk_soc = '.$socid.' OR te.fk_soc IS NULL)';
1635
+		if ($this->restrictiononfksoc && $socid && $this->element == 'societe') $sql .= ' AND te.rowid = '.$socid;
1636 1636
 		//print 'socid='.$socid.' restrictiononfksoc='.$this->restrictiononfksoc.' ismultientitymanaged = '.$this->ismultientitymanaged.' filter = '.$filter.' -> '.$sql."<br>";
1637 1637
 
1638 1638
 		$result = $this->db->query($sql);
1639
-		if (! $result)
1639
+		if (!$result)
1640 1640
 		{
1641
-			$this->error=$this->db->lasterror();
1641
+			$this->error = $this->db->lasterror();
1642 1642
 			return -1;
1643 1643
 		}
1644 1644
 		$row = $this->db->fetch_row($result);
@@ -1646,46 +1646,46 @@  discard block
 block discarded – undo
1646 1646
 
1647 1647
 
1648 1648
 		$sql = "SELECT MIN(te.".$fieldid.")";
1649
-		$sql.= " FROM ".(empty($nodbprefix)?MAIN_DB_PREFIX:'').$this->table_element." as te";
1650
-		if ($this->element == 'user' && ! empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE)) {
1651
-			$sql.= ",".MAIN_DB_PREFIX."usergroup_user as ug";
1652
-		}
1653
-		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
1654
-		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
1655
-		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
1656
-		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";
1657
-		$sql.= " WHERE te.".$fieldid." > '".$this->db->escape($this->ref)."'";  // ->ref must always be defined (set to id if field does not exists)
1658
-		if ($this->restrictiononfksoc == 1 && !$user->rights->societe->client->voir && !$socid) $sql.= " AND sc.fk_user = " .$user->id;
1659
-		if ($this->restrictiononfksoc == 2 && !$user->rights->societe->client->voir && !$socid) $sql.= " AND (sc.fk_user = " .$user->id.' OR te.fk_soc IS NULL)';
1660
-		if (! empty($filter))
1661
-		{
1662
-			if (! preg_match('/^\s*AND/i', $filter)) $sql.=" AND ";   // For backward compatibility
1663
-			$sql.=$filter;
1664
-		}
1665
-		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
1666
-		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
1649
+		$sql .= " FROM ".(empty($nodbprefix) ?MAIN_DB_PREFIX:'').$this->table_element." as te";
1650
+		if ($this->element == 'user' && !empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE)) {
1651
+			$sql .= ",".MAIN_DB_PREFIX."usergroup_user as ug";
1652
+		}
1653
+		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
1654
+		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
1655
+		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
1656
+		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";
1657
+		$sql .= " WHERE te.".$fieldid." > '".$this->db->escape($this->ref)."'"; // ->ref must always be defined (set to id if field does not exists)
1658
+		if ($this->restrictiononfksoc == 1 && !$user->rights->societe->client->voir && !$socid) $sql .= " AND sc.fk_user = ".$user->id;
1659
+		if ($this->restrictiononfksoc == 2 && !$user->rights->societe->client->voir && !$socid) $sql .= " AND (sc.fk_user = ".$user->id.' OR te.fk_soc IS NULL)';
1660
+		if (!empty($filter))
1661
+		{
1662
+			if (!preg_match('/^\s*AND/i', $filter)) $sql .= " AND "; // For backward compatibility
1663
+			$sql .= $filter;
1664
+		}
1665
+		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
1666
+		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
1667 1667
 		if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) {
1668
-			if ($this->element == 'user' && ! empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE)) {
1669
-				if (! empty($user->admin) && empty($user->entity) && $conf->entity == 1) {
1670
-					$sql.= " AND te.entity IS NOT NULL"; // Show all users
1668
+			if ($this->element == 'user' && !empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE)) {
1669
+				if (!empty($user->admin) && empty($user->entity) && $conf->entity == 1) {
1670
+					$sql .= " AND te.entity IS NOT NULL"; // Show all users
1671 1671
 				} else {
1672
-					$sql.= " AND ug.fk_user = te.rowid";
1673
-					$sql.= " AND ug.entity IN (".getEntity($this->element).")";
1672
+					$sql .= " AND ug.fk_user = te.rowid";
1673
+					$sql .= " AND ug.entity IN (".getEntity($this->element).")";
1674 1674
 				}
1675 1675
 			} else {
1676
-				$sql.= ' AND te.entity IN ('.getEntity($this->element).')';
1676
+				$sql .= ' AND te.entity IN ('.getEntity($this->element).')';
1677 1677
 			}
1678 1678
 		}
1679
-		if ($this->restrictiononfksoc == 1 && $socid && $this->element != 'societe') $sql.= ' AND te.fk_soc = ' . $socid;
1680
-		if ($this->restrictiononfksoc == 2 && $socid && $this->element != 'societe') $sql.= ' AND (te.fk_soc = ' . $socid.' OR te.fk_soc IS NULL)';
1681
-		if ($this->restrictiononfksoc && $socid && $this->element == 'societe') $sql.= ' AND te.rowid = ' . $socid;
1679
+		if ($this->restrictiononfksoc == 1 && $socid && $this->element != 'societe') $sql .= ' AND te.fk_soc = '.$socid;
1680
+		if ($this->restrictiononfksoc == 2 && $socid && $this->element != 'societe') $sql .= ' AND (te.fk_soc = '.$socid.' OR te.fk_soc IS NULL)';
1681
+		if ($this->restrictiononfksoc && $socid && $this->element == 'societe') $sql .= ' AND te.rowid = '.$socid;
1682 1682
 		//print 'socid='.$socid.' restrictiononfksoc='.$this->restrictiononfksoc.' ismultientitymanaged = '.$this->ismultientitymanaged.' filter = '.$filter.' -> '.$sql."<br>";
1683 1683
 		// 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
1684 1684
 
1685 1685
 		$result = $this->db->query($sql);
1686
-		if (! $result)
1686
+		if (!$result)
1687 1687
 		{
1688
-			$this->error=$this->db->lasterror();
1688
+			$this->error = $this->db->lasterror();
1689 1689
 			return -2;
1690 1690
 		}
1691 1691
 		$row = $this->db->fetch_row($result);
@@ -1702,11 +1702,11 @@  discard block
 block discarded – undo
1702 1702
 	 *      @return array				Array of id of contacts (if source=external or internal)
1703 1703
 	 * 									Array of id of third parties with at least one contact on object (if source=thirdparty)
1704 1704
 	 */
1705
-	function getListContactId($source='external')
1705
+	function getListContactId($source = 'external')
1706 1706
 	{
1707 1707
 		$contactAlreadySelected = array();
1708
-		$tab = $this->liste_contact(-1,$source);
1709
-		$num=count($tab);
1708
+		$tab = $this->liste_contact(-1, $source);
1709
+		$num = count($tab);
1710 1710
 		$i = 0;
1711 1711
 		while ($i < $num)
1712 1712
 		{
@@ -1726,24 +1726,24 @@  discard block
 block discarded – undo
1726 1726
 	 */
1727 1727
 	function setProject($projectid)
1728 1728
 	{
1729
-		if (! $this->table_element)
1729
+		if (!$this->table_element)
1730 1730
 		{
1731
-			dol_syslog(get_class($this)."::setProject was called on objet with property table_element not defined",LOG_ERR);
1731
+			dol_syslog(get_class($this)."::setProject was called on objet with property table_element not defined", LOG_ERR);
1732 1732
 			return -1;
1733 1733
 		}
1734 1734
 
1735 1735
 		$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
1736 1736
 		if ($this->table_element == 'actioncomm')
1737 1737
 		{
1738
-			if ($projectid) $sql.= ' SET fk_project = '.$projectid;
1739
-			else $sql.= ' SET fk_project = NULL';
1740
-			$sql.= ' WHERE id = '.$this->id;
1738
+			if ($projectid) $sql .= ' SET fk_project = '.$projectid;
1739
+			else $sql .= ' SET fk_project = NULL';
1740
+			$sql .= ' WHERE id = '.$this->id;
1741 1741
 		}
1742 1742
 		else
1743 1743
 		{
1744
-			if ($projectid) $sql.= ' SET fk_projet = '.$projectid;
1745
-			else $sql.= ' SET fk_projet = NULL';
1746
-			$sql.= ' WHERE rowid = '.$this->id;
1744
+			if ($projectid) $sql .= ' SET fk_projet = '.$projectid;
1745
+			else $sql .= ' SET fk_projet = NULL';
1746
+			$sql .= ' WHERE rowid = '.$this->id;
1747 1747
 		}
1748 1748
 
1749 1749
 		dol_syslog(get_class($this)."::setProject", LOG_DEBUG);
@@ -1789,14 +1789,14 @@  discard block
 block discarded – undo
1789 1789
 			else
1790 1790
 			{
1791 1791
 				dol_syslog(get_class($this).'::setPaymentMethods Erreur '.$sql.' - '.$this->db->error());
1792
-				$this->error=$this->db->error();
1792
+				$this->error = $this->db->error();
1793 1793
 				return -1;
1794 1794
 			}
1795 1795
 		}
1796 1796
 		else
1797 1797
 		{
1798 1798
 			dol_syslog(get_class($this).'::setPaymentMethods, status of the object is incompatible');
1799
-			$this->error='Status of the object is incompatible '.$this->statut;
1799
+			$this->error = 'Status of the object is incompatible '.$this->statut;
1800 1800
 			return -2;
1801 1801
 		}
1802 1802
 	}
@@ -1823,21 +1823,21 @@  discard block
 block discarded – undo
1823 1823
 				$this->multicurrency_code = $code;
1824 1824
 
1825 1825
 				list($fk_multicurrency, $rate) = MultiCurrency::getIdAndTxFromCode($this->db, $code);
1826
-				if ($rate) $this->setMulticurrencyRate($rate,2);
1826
+				if ($rate) $this->setMulticurrencyRate($rate, 2);
1827 1827
 
1828 1828
 				return 1;
1829 1829
 			}
1830 1830
 			else
1831 1831
 			{
1832 1832
 				dol_syslog(get_class($this).'::setMulticurrencyCode Erreur '.$sql.' - '.$this->db->error());
1833
-				$this->error=$this->db->error();
1833
+				$this->error = $this->db->error();
1834 1834
 				return -1;
1835 1835
 			}
1836 1836
 		}
1837 1837
 		else
1838 1838
 		{
1839 1839
 			dol_syslog(get_class($this).'::setMulticurrencyCode, status of the object is incompatible');
1840
-			$this->error='Status of the object is incompatible '.$this->statut;
1840
+			$this->error = 'Status of the object is incompatible '.$this->statut;
1841 1841
 			return -2;
1842 1842
 		}
1843 1843
 	}
@@ -1849,7 +1849,7 @@  discard block
 block discarded – undo
1849 1849
 	 *  @param		int		$mode	mode 1 : amounts in company currency will be recalculated, mode 2 : amounts in foreign currency
1850 1850
 	 *  @return		int				>0 if OK, <0 if KO
1851 1851
 	 */
1852
-	function setMulticurrencyRate($rate, $mode=1)
1852
+	function setMulticurrencyRate($rate, $mode = 1)
1853 1853
 	{
1854 1854
 		dol_syslog(get_class($this).'::setMulticurrencyRate('.$id.')');
1855 1855
 		if ($this->statut >= 0 || $this->element == 'societe')
@@ -1869,7 +1869,7 @@  discard block
 block discarded – undo
1869 1869
 				{
1870 1870
 					foreach ($this->lines as &$line)
1871 1871
 					{
1872
-						if($mode == 1) {
1872
+						if ($mode == 1) {
1873 1873
 							$line->subprice = 0;
1874 1874
 						}
1875 1875
 
@@ -1877,14 +1877,14 @@  discard block
 block discarded – undo
1877 1877
 							case 'propal':
1878 1878
 								$this->updateline(
1879 1879
 									$line->id, $line->subprice, $line->qty, $line->remise_percent, $line->tva_tx, $line->localtax1_tx, $line->localtax2_tx,
1880
-									($line->description?$line->description:$line->desc), 'HT', $line->info_bits, $line->special_code, $line->fk_parent_line,
1880
+									($line->description ? $line->description : $line->desc), 'HT', $line->info_bits, $line->special_code, $line->fk_parent_line,
1881 1881
 									$line->skip_update_total, $line->fk_fournprice, $line->pa_ht, $line->label, $line->product_type, $line->date_start,
1882 1882
 									$line->date_end, $line->array_options, $line->fk_unit, $line->multicurrency_subprice
1883 1883
 								);
1884 1884
 								break;
1885 1885
 							case 'commande':
1886 1886
 								$this->updateline(
1887
-									$line->id, ($line->description?$line->description:$line->desc), $line->subprice, $line->qty, $line->remise_percent,
1887
+									$line->id, ($line->description ? $line->description : $line->desc), $line->subprice, $line->qty, $line->remise_percent,
1888 1888
 									$line->tva_tx, $line->localtax1_tx, $line->localtax2_tx, 'HT', $line->info_bits, $line->date_start, $line->date_end,
1889 1889
 									$line->product_type, $line->fk_parent_line, $line->skip_update_total, $line->fk_fournprice, $line->pa_ht, $line->label,
1890 1890
 									$line->special_code, $line->array_options, $line->fk_unit, $line->multicurrency_subprice
@@ -1892,7 +1892,7 @@  discard block
 block discarded – undo
1892 1892
 								break;
1893 1893
 							case 'facture':
1894 1894
 								$this->updateline(
1895
-									$line->id, ($line->description?$line->description:$line->desc), $line->subprice, $line->qty, $line->remise_percent,
1895
+									$line->id, ($line->description ? $line->description : $line->desc), $line->subprice, $line->qty, $line->remise_percent,
1896 1896
 									$line->date_start, $line->date_end, $line->tva_tx, $line->localtax1_tx, $line->localtax2_tx, 'HT', $line->info_bits,
1897 1897
 									$line->product_type, $line->fk_parent_line, $line->skip_update_total, $line->fk_fournprice, $line->pa_ht, $line->label,
1898 1898
 									$line->special_code, $line->array_options, $line->situation_percent, $line->fk_unit, $line->multicurrency_subprice
@@ -1901,21 +1901,21 @@  discard block
 block discarded – undo
1901 1901
 							case 'supplier_proposal':
1902 1902
 								$this->updateline(
1903 1903
 									$line->id, $line->subprice, $line->qty, $line->remise_percent, $line->tva_tx, $line->localtax1_tx, $line->localtax2_tx,
1904
-									($line->description?$line->description:$line->desc), 'HT', $line->info_bits, $line->special_code, $line->fk_parent_line,
1904
+									($line->description ? $line->description : $line->desc), 'HT', $line->info_bits, $line->special_code, $line->fk_parent_line,
1905 1905
 									$line->skip_update_total, $line->fk_fournprice, $line->pa_ht, $line->label, $line->product_type, $line->array_options,
1906 1906
 									$line->ref_fourn, $line->multicurrency_subprice
1907 1907
 								);
1908 1908
 								break;
1909 1909
 							case 'order_supplier':
1910 1910
 								$this->updateline(
1911
-									$line->id, ($line->description?$line->description:$line->desc), $line->subprice, $line->qty, $line->remise_percent,
1911
+									$line->id, ($line->description ? $line->description : $line->desc), $line->subprice, $line->qty, $line->remise_percent,
1912 1912
 									$line->tva_tx, $line->localtax1_tx, $line->localtax2_tx, 'HT', $line->info_bits, $line->product_type, false,
1913 1913
 									$line->date_start, $line->date_end, $line->array_options, $line->fk_unit, $line->multicurrency_subprice
1914 1914
 								);
1915 1915
 								break;
1916 1916
 							case 'invoice_supplier':
1917 1917
 								$this->updateline(
1918
-									$line->id, ($line->description?$line->description:$line->desc), $line->subprice, $line->tva_tx, $line->localtax1_tx,
1918
+									$line->id, ($line->description ? $line->description : $line->desc), $line->subprice, $line->tva_tx, $line->localtax1_tx,
1919 1919
 									$line->localtax2_tx, $line->qty, 0, 'HT', $line->info_bits, $line->product_type, $line->remise_percent, false,
1920 1920
 									$line->date_start, $line->date_end, $line->array_options, $line->fk_unit, $line->multicurrency_subprice
1921 1921
 								);
@@ -1932,14 +1932,14 @@  discard block
 block discarded – undo
1932 1932
 			else
1933 1933
 			{
1934 1934
 				dol_syslog(get_class($this).'::setMulticurrencyRate Erreur '.$sql.' - '.$this->db->error());
1935
-				$this->error=$this->db->error();
1935
+				$this->error = $this->db->error();
1936 1936
 				return -1;
1937 1937
 			}
1938 1938
 		}
1939 1939
 		else
1940 1940
 		{
1941 1941
 			dol_syslog(get_class($this).'::setMulticurrencyRate, status of the object is incompatible');
1942
-			$this->error='Status of the object is incompatible '.$this->statut;
1942
+			$this->error = 'Status of the object is incompatible '.$this->statut;
1943 1943
 			return -2;
1944 1944
 		}
1945 1945
 	}
@@ -1969,20 +1969,20 @@  discard block
 block discarded – undo
1969 1969
 				$this->cond_reglement_id = $id;
1970 1970
 				// for supplier
1971 1971
 				if (get_class($this) == 'Fournisseur') $this->cond_reglement_supplier_id = $id;
1972
-				$this->cond_reglement = $id;	// for compatibility
1972
+				$this->cond_reglement = $id; // for compatibility
1973 1973
 				return 1;
1974 1974
 			}
1975 1975
 			else
1976 1976
 			{
1977 1977
 				dol_syslog(get_class($this).'::setPaymentTerms Erreur '.$sql.' - '.$this->db->error());
1978
-				$this->error=$this->db->error();
1978
+				$this->error = $this->db->error();
1979 1979
 				return -1;
1980 1980
 			}
1981 1981
 		}
1982 1982
 		else
1983 1983
 		{
1984 1984
 			dol_syslog(get_class($this).'::setPaymentTerms, status of the object is incompatible');
1985
-			$this->error='Status of the object is incompatible '.$this->statut;
1985
+			$this->error = 'Status of the object is incompatible '.$this->statut;
1986 1986
 			return -2;
1987 1987
 		}
1988 1988
 	}
@@ -2000,7 +2000,7 @@  discard block
 block discarded – undo
2000 2000
 		if ($this->element == 'delivery' || $this->element == 'shipping') $fieldname = 'fk_address';
2001 2001
 
2002 2002
 		$sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element." SET ".$fieldname." = ".$id;
2003
-		$sql.= " WHERE rowid = ".$this->id." AND fk_statut = 0";
2003
+		$sql .= " WHERE rowid = ".$this->id." AND fk_statut = 0";
2004 2004
 
2005 2005
 		if ($this->db->query($sql))
2006 2006
 		{
@@ -2009,7 +2009,7 @@  discard block
 block discarded – undo
2009 2009
 		}
2010 2010
 		else
2011 2011
 		{
2012
-			$this->error=$this->db->error();
2012
+			$this->error = $this->db->error();
2013 2013
 			dol_syslog(get_class($this).'::setDeliveryAddress Erreur '.$sql.' - '.$this->error);
2014 2014
 			return -1;
2015 2015
 		}
@@ -2025,29 +2025,29 @@  discard block
 block discarded – undo
2025 2025
 	 *
2026 2026
 	 *  @return     int              1 if OK, 0 if KO
2027 2027
 	 */
2028
-	function setShippingMethod($shipping_method_id, $notrigger=false, $userused=null)
2028
+	function setShippingMethod($shipping_method_id, $notrigger = false, $userused = null)
2029 2029
 	{
2030 2030
         global $user;
2031 2031
 
2032
-        if (empty($userused)) $userused=$user;
2032
+        if (empty($userused)) $userused = $user;
2033 2033
 
2034 2034
         $error = 0;
2035 2035
 
2036
-		if (! $this->table_element) {
2037
-			dol_syslog(get_class($this)."::setShippingMethod was called on objet with property table_element not defined",LOG_ERR);
2036
+		if (!$this->table_element) {
2037
+			dol_syslog(get_class($this)."::setShippingMethod was called on objet with property table_element not defined", LOG_ERR);
2038 2038
 			return -1;
2039 2039
 		}
2040 2040
 
2041 2041
         $this->db->begin();
2042 2042
 
2043
-		if ($shipping_method_id<0) $shipping_method_id='NULL';
2043
+		if ($shipping_method_id < 0) $shipping_method_id = 'NULL';
2044 2044
 		dol_syslog(get_class($this).'::setShippingMethod('.$shipping_method_id.')');
2045 2045
 
2046 2046
 		$sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
2047
-		$sql.= " SET fk_shipping_method = ".$shipping_method_id;
2048
-		$sql.= " WHERE rowid=".$this->id;
2047
+		$sql .= " SET fk_shipping_method = ".$shipping_method_id;
2048
+		$sql .= " WHERE rowid=".$this->id;
2049 2049
         $resql = $this->db->query($sql);
2050
-		if (! $resql) {
2050
+		if (!$resql) {
2051 2051
 			dol_syslog(get_class($this).'::setShippingMethod Error ', LOG_DEBUG);
2052 2052
 			$this->error = $this->db->lasterror();
2053 2053
 			$error++;
@@ -2055,8 +2055,8 @@  discard block
 block discarded – undo
2055 2055
             if (!$notrigger)
2056 2056
             {
2057 2057
                 // Call trigger
2058
-                $this->context=array('shippingmethodupdate'=>1);
2059
-                $result = $this->call_trigger(strtoupper(get_class($this)) . '_MODIFY', $userused);
2058
+                $this->context = array('shippingmethodupdate'=>1);
2059
+                $result = $this->call_trigger(strtoupper(get_class($this)).'_MODIFY', $userused);
2060 2060
                 if ($result < 0) $error++;
2061 2061
                 // End call trigger
2062 2062
             }
@@ -2066,7 +2066,7 @@  discard block
 block discarded – undo
2066 2066
             $this->db->rollback();
2067 2067
             return -1;
2068 2068
         } else {
2069
-            $this->shipping_method_id = ($shipping_method_id=='NULL')?null:$shipping_method_id;
2069
+            $this->shipping_method_id = ($shipping_method_id == 'NULL') ?null:$shipping_method_id;
2070 2070
             $this->db->commit();
2071 2071
             return 1;
2072 2072
         }
@@ -2081,23 +2081,23 @@  discard block
 block discarded – undo
2081 2081
 	 */
2082 2082
 	function setWarehouse($warehouse_id)
2083 2083
 	{
2084
-		if (! $this->table_element) {
2085
-			dol_syslog(get_class($this)."::setWarehouse was called on objet with property table_element not defined",LOG_ERR);
2084
+		if (!$this->table_element) {
2085
+			dol_syslog(get_class($this)."::setWarehouse was called on objet with property table_element not defined", LOG_ERR);
2086 2086
 			return -1;
2087 2087
 		}
2088
-		if ($warehouse_id<0) $warehouse_id='NULL';
2088
+		if ($warehouse_id < 0) $warehouse_id = 'NULL';
2089 2089
 		dol_syslog(get_class($this).'::setWarehouse('.$warehouse_id.')');
2090 2090
 
2091 2091
 		$sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
2092
-		$sql.= " SET fk_warehouse = ".$warehouse_id;
2093
-		$sql.= " WHERE rowid=".$this->id;
2092
+		$sql .= " SET fk_warehouse = ".$warehouse_id;
2093
+		$sql .= " WHERE rowid=".$this->id;
2094 2094
 
2095 2095
 		if ($this->db->query($sql)) {
2096
-			$this->warehouse_id = ($warehouse_id=='NULL')?null:$warehouse_id;
2096
+			$this->warehouse_id = ($warehouse_id == 'NULL') ?null:$warehouse_id;
2097 2097
 			return 1;
2098 2098
 		} else {
2099 2099
 			dol_syslog(get_class($this).'::setWarehouse Error ', LOG_DEBUG);
2100
-			$this->error=$this->db->error();
2100
+			$this->error = $this->db->error();
2101 2101
 			return 0;
2102 2102
 		}
2103 2103
 	}
@@ -2112,25 +2112,25 @@  discard block
 block discarded – undo
2112 2112
 	 */
2113 2113
 	function setDocModel($user, $modelpdf)
2114 2114
 	{
2115
-		if (! $this->table_element)
2115
+		if (!$this->table_element)
2116 2116
 		{
2117
-			dol_syslog(get_class($this)."::setDocModel was called on objet with property table_element not defined",LOG_ERR);
2117
+			dol_syslog(get_class($this)."::setDocModel was called on objet with property table_element not defined", LOG_ERR);
2118 2118
 			return -1;
2119 2119
 		}
2120 2120
 
2121
-		$newmodelpdf=dol_trunc($modelpdf,255);
2121
+		$newmodelpdf = dol_trunc($modelpdf, 255);
2122 2122
 
2123 2123
 		$sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
2124
-		$sql.= " SET model_pdf = '".$this->db->escape($newmodelpdf)."'";
2125
-		$sql.= " WHERE rowid = ".$this->id;
2124
+		$sql .= " SET model_pdf = '".$this->db->escape($newmodelpdf)."'";
2125
+		$sql .= " WHERE rowid = ".$this->id;
2126 2126
 		// if ($this->element == 'facture') $sql.= " AND fk_statut < 2";
2127 2127
 		// if ($this->element == 'propal')  $sql.= " AND fk_statut = 0";
2128 2128
 
2129 2129
 		dol_syslog(get_class($this)."::setDocModel", LOG_DEBUG);
2130
-		$resql=$this->db->query($sql);
2130
+		$resql = $this->db->query($sql);
2131 2131
 		if ($resql)
2132 2132
 		{
2133
-			$this->modelpdf=$modelpdf;
2133
+			$this->modelpdf = $modelpdf;
2134 2134
 			return 1;
2135 2135
 		}
2136 2136
 		else
@@ -2149,29 +2149,29 @@  discard block
 block discarded – undo
2149 2149
 	 *  @param      User	$userused		Object user
2150 2150
 	 *  @return		int				1 if OK, 0 if KO
2151 2151
 	 */
2152
-	function setBankAccount($fk_account, $notrigger=false, $userused=null)
2152
+	function setBankAccount($fk_account, $notrigger = false, $userused = null)
2153 2153
 	{
2154 2154
         global $user;
2155 2155
 
2156
-        if (empty($userused)) $userused=$user;
2156
+        if (empty($userused)) $userused = $user;
2157 2157
 
2158 2158
         $error = 0;
2159 2159
 
2160
-		if (! $this->table_element) {
2161
-			dol_syslog(get_class($this)."::setBankAccount was called on objet with property table_element not defined",LOG_ERR);
2160
+		if (!$this->table_element) {
2161
+			dol_syslog(get_class($this)."::setBankAccount was called on objet with property table_element not defined", LOG_ERR);
2162 2162
 			return -1;
2163 2163
 		}
2164 2164
         $this->db->begin();
2165 2165
 
2166
-		if ($fk_account<0) $fk_account='NULL';
2166
+		if ($fk_account < 0) $fk_account = 'NULL';
2167 2167
 		dol_syslog(get_class($this).'::setBankAccount('.$fk_account.')');
2168 2168
 
2169 2169
 		$sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
2170
-		$sql.= " SET fk_account = ".$fk_account;
2171
-		$sql.= " WHERE rowid=".$this->id;
2170
+		$sql .= " SET fk_account = ".$fk_account;
2171
+		$sql .= " WHERE rowid=".$this->id;
2172 2172
 
2173 2173
         $resql = $this->db->query($sql);
2174
-        if (! $resql)
2174
+        if (!$resql)
2175 2175
         {
2176 2176
             dol_syslog(get_class($this).'::setBankAccount Error '.$sql.' - '.$this->db->error());
2177 2177
             $this->error = $this->db->lasterror();
@@ -2182,8 +2182,8 @@  discard block
 block discarded – undo
2182 2182
             if (!$notrigger)
2183 2183
             {
2184 2184
                 // Call trigger
2185
-                $this->context=array('bankaccountupdate'=>1);
2186
-                $result = $this->call_trigger(strtoupper(get_class($this)) . '_MODIFY', $userused);
2185
+                $this->context = array('bankaccountupdate'=>1);
2186
+                $result = $this->call_trigger(strtoupper(get_class($this)).'_MODIFY', $userused);
2187 2187
                 if ($result < 0) $error++;
2188 2188
                 // End call trigger
2189 2189
             }
@@ -2195,7 +2195,7 @@  discard block
 block discarded – undo
2195 2195
         }
2196 2196
         else
2197 2197
         {
2198
-            $this->fk_account = ($fk_account=='NULL')?null:$fk_account;
2198
+            $this->fk_account = ($fk_account == 'NULL') ?null:$fk_account;
2199 2199
             $this->db->commit();
2200 2200
             return 1;
2201 2201
         }
@@ -2214,26 +2214,26 @@  discard block
 block discarded – undo
2214 2214
 	 * 	@param		boolean		$fk_parent_line    Table with fk_parent_line field or not
2215 2215
 	 * 	@return		int                            <0 if KO, >0 if OK
2216 2216
 	 */
2217
-	function line_order($renum=false, $rowidorder='ASC', $fk_parent_line=true)
2217
+	function line_order($renum = false, $rowidorder = 'ASC', $fk_parent_line = true)
2218 2218
 	{
2219 2219
         // phpcs:enable
2220
-		if (! $this->table_element_line)
2220
+		if (!$this->table_element_line)
2221 2221
 		{
2222
-			dol_syslog(get_class($this)."::line_order was called on objet with property table_element_line not defined",LOG_ERR);
2222
+			dol_syslog(get_class($this)."::line_order was called on objet with property table_element_line not defined", LOG_ERR);
2223 2223
 			return -1;
2224 2224
 		}
2225
-		if (! $this->fk_element)
2225
+		if (!$this->fk_element)
2226 2226
 		{
2227
-			dol_syslog(get_class($this)."::line_order was called on objet with property fk_element not defined",LOG_ERR);
2227
+			dol_syslog(get_class($this)."::line_order was called on objet with property fk_element not defined", LOG_ERR);
2228 2228
 			return -1;
2229 2229
 		}
2230 2230
 
2231 2231
 		// Count number of lines to reorder (according to choice $renum)
2232
-		$nl=0;
2232
+		$nl = 0;
2233 2233
 		$sql = 'SELECT count(rowid) FROM '.MAIN_DB_PREFIX.$this->table_element_line;
2234
-		$sql.= ' WHERE '.$this->fk_element.'='.$this->id;
2235
-		if (! $renum) $sql.= ' AND rang = 0';
2236
-		if ($renum) $sql.= ' AND rang <> 0';
2234
+		$sql .= ' WHERE '.$this->fk_element.'='.$this->id;
2235
+		if (!$renum) $sql .= ' AND rang = 0';
2236
+		if ($renum) $sql .= ' AND rang <> 0';
2237 2237
 
2238 2238
 		dol_syslog(get_class($this)."::line_order", LOG_DEBUG);
2239 2239
 		$resql = $this->db->query($sql);
@@ -2247,28 +2247,28 @@  discard block
 block discarded – undo
2247 2247
 		{
2248 2248
 			// The goal of this part is to reorder all lines, with all children lines sharing the same
2249 2249
 			// counter that parents.
2250
-			$rows=array();
2250
+			$rows = array();
2251 2251
 
2252 2252
 			// We first search all lines that are parent lines (for multilevel details lines)
2253 2253
 			$sql = 'SELECT rowid FROM '.MAIN_DB_PREFIX.$this->table_element_line;
2254
-			$sql.= ' WHERE '.$this->fk_element.' = '.$this->id;
2255
-			if ($fk_parent_line) $sql.= ' AND fk_parent_line IS NULL';
2256
-			$sql.= ' ORDER BY rang ASC, rowid '.$rowidorder;
2254
+			$sql .= ' WHERE '.$this->fk_element.' = '.$this->id;
2255
+			if ($fk_parent_line) $sql .= ' AND fk_parent_line IS NULL';
2256
+			$sql .= ' ORDER BY rang ASC, rowid '.$rowidorder;
2257 2257
 
2258 2258
 			dol_syslog(get_class($this)."::line_order search all parent lines", LOG_DEBUG);
2259 2259
 			$resql = $this->db->query($sql);
2260 2260
 			if ($resql)
2261 2261
 			{
2262
-				$i=0;
2262
+				$i = 0;
2263 2263
 				$num = $this->db->num_rows($resql);
2264 2264
 				while ($i < $num)
2265 2265
 				{
2266 2266
 					$row = $this->db->fetch_row($resql);
2267
-					$rows[] = $row[0];	// Add parent line into array rows
2267
+					$rows[] = $row[0]; // Add parent line into array rows
2268 2268
 					$childrens = $this->getChildrenOfLine($row[0]);
2269
-					if (! empty($childrens))
2269
+					if (!empty($childrens))
2270 2270
 					{
2271
-						foreach($childrens as $child)
2271
+						foreach ($childrens as $child)
2272 2272
 						{
2273 2273
 							array_push($rows, $child);
2274 2274
 						}
@@ -2277,11 +2277,11 @@  discard block
 block discarded – undo
2277 2277
 				}
2278 2278
 
2279 2279
 				// Now we set a new number for each lines (parent and children with children included into parent tree)
2280
-				if (! empty($rows))
2280
+				if (!empty($rows))
2281 2281
 				{
2282
-					foreach($rows as $key => $row)
2282
+					foreach ($rows as $key => $row)
2283 2283
 					{
2284
-						$this->updateRangOfLine($row, ($key+1));
2284
+						$this->updateRangOfLine($row, ($key + 1));
2285 2285
 					}
2286 2286
 				}
2287 2287
 			}
@@ -2301,18 +2301,18 @@  discard block
 block discarded – undo
2301 2301
 	 */
2302 2302
 	function getChildrenOfLine($id)
2303 2303
 	{
2304
-		$rows=array();
2304
+		$rows = array();
2305 2305
 
2306 2306
 		$sql = 'SELECT rowid FROM '.MAIN_DB_PREFIX.$this->table_element_line;
2307
-		$sql.= ' WHERE '.$this->fk_element.' = '.$this->id;
2308
-		$sql.= ' AND fk_parent_line = '.$id;
2309
-		$sql.= ' ORDER BY rang ASC';
2307
+		$sql .= ' WHERE '.$this->fk_element.' = '.$this->id;
2308
+		$sql .= ' AND fk_parent_line = '.$id;
2309
+		$sql .= ' ORDER BY rang ASC';
2310 2310
 
2311 2311
 		dol_syslog(get_class($this)."::getChildrenOfLine search children lines for line ".$id."", LOG_DEBUG);
2312 2312
 		$resql = $this->db->query($sql);
2313 2313
 		if ($resql)
2314 2314
 		{
2315
-			$i=0;
2315
+			$i = 0;
2316 2316
 			$num = $this->db->num_rows($resql);
2317 2317
 			while ($i < $num)
2318 2318
 			{
@@ -2333,7 +2333,7 @@  discard block
 block discarded – undo
2333 2333
 	 * 	@param	boolean		$fk_parent_line		Table with fk_parent_line field or not
2334 2334
 	 * 	@return	void
2335 2335
 	 */
2336
-	function line_up($rowid, $fk_parent_line=true)
2336
+	function line_up($rowid, $fk_parent_line = true)
2337 2337
 	{
2338 2338
         // phpcs:enable
2339 2339
 		$this->line_order(false, 'ASC', $fk_parent_line);
@@ -2353,7 +2353,7 @@  discard block
 block discarded – undo
2353 2353
 	 * 	@param	boolean		$fk_parent_line		Table with fk_parent_line field or not
2354 2354
 	 * 	@return	void
2355 2355
 	 */
2356
-	function line_down($rowid, $fk_parent_line=true)
2356
+	function line_down($rowid, $fk_parent_line = true)
2357 2357
 	{
2358 2358
         // phpcs:enable
2359 2359
 		$this->line_order(false, 'ASC', $fk_parent_line);
@@ -2375,16 +2375,16 @@  discard block
 block discarded – undo
2375 2375
 	 * 	@param	int		$rang		Position
2376 2376
 	 * 	@return	void
2377 2377
 	 */
2378
-	function updateRangOfLine($rowid,$rang)
2378
+	function updateRangOfLine($rowid, $rang)
2379 2379
 	{
2380 2380
 		$fieldposition = 'rang';
2381 2381
 		if (in_array($this->table_element_line, array('ecm_files', 'emailcollector_emailcollectoraction'))) $fieldposition = 'position';
2382 2382
 
2383 2383
 		$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element_line.' SET '.$fieldposition.' = '.$rang;
2384
-		$sql.= ' WHERE rowid = '.$rowid;
2384
+		$sql .= ' WHERE rowid = '.$rowid;
2385 2385
 
2386 2386
 		dol_syslog(get_class($this)."::updateRangOfLine", LOG_DEBUG);
2387
-		if (! $this->db->query($sql))
2387
+		if (!$this->db->query($sql))
2388 2388
 		{
2389 2389
 			dol_print_error($this->db);
2390 2390
 		}
@@ -2401,9 +2401,9 @@  discard block
 block discarded – undo
2401 2401
 	{
2402 2402
         // phpcs:enable
2403 2403
 		$num = count($rows);
2404
-		for ($i = 0 ; $i < $num ; $i++)
2404
+		for ($i = 0; $i < $num; $i++)
2405 2405
 		{
2406
-			$this->updateRangOfLine($rows[$i], ($i+1));
2406
+			$this->updateRangOfLine($rows[$i], ($i + 1));
2407 2407
 		}
2408 2408
 	}
2409 2409
 
@@ -2414,21 +2414,21 @@  discard block
 block discarded – undo
2414 2414
 	 * 	@param	int		$rang		Position
2415 2415
 	 * 	@return	void
2416 2416
 	 */
2417
-	function updateLineUp($rowid,$rang)
2417
+	function updateLineUp($rowid, $rang)
2418 2418
 	{
2419 2419
 		if ($rang > 1)
2420 2420
 		{
2421 2421
 			$fieldposition = 'rang';
2422 2422
 			if (in_array($this->table_element_line, array('ecm_files', 'emailcollector_emailcollectoraction'))) $fieldposition = 'position';
2423 2423
 
2424
-			$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element_line.' SET '.$fieldposition.' = '.$rang ;
2425
-			$sql.= ' WHERE '.$this->fk_element.' = '.$this->id;
2426
-			$sql.= ' AND rang = '.($rang - 1);
2427
-			if ($this->db->query($sql) )
2424
+			$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element_line.' SET '.$fieldposition.' = '.$rang;
2425
+			$sql .= ' WHERE '.$this->fk_element.' = '.$this->id;
2426
+			$sql .= ' AND rang = '.($rang - 1);
2427
+			if ($this->db->query($sql))
2428 2428
 			{
2429 2429
 				$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element_line.' SET '.$fieldposition.' = '.($rang - 1);
2430
-				$sql.= ' WHERE rowid = '.$rowid;
2431
-				if (! $this->db->query($sql) )
2430
+				$sql .= ' WHERE rowid = '.$rowid;
2431
+				if (!$this->db->query($sql))
2432 2432
 				{
2433 2433
 					dol_print_error($this->db);
2434 2434
 				}
@@ -2448,7 +2448,7 @@  discard block
 block discarded – undo
2448 2448
 	 * 	@param	int		$max		Max
2449 2449
 	 * 	@return	void
2450 2450
 	 */
2451
-	function updateLineDown($rowid,$rang,$max)
2451
+	function updateLineDown($rowid, $rang, $max)
2452 2452
 	{
2453 2453
 		if ($rang < $max)
2454 2454
 		{
@@ -2456,13 +2456,13 @@  discard block
 block discarded – undo
2456 2456
 			if (in_array($this->table_element_line, array('ecm_files', 'emailcollector_emailcollectoraction'))) $fieldposition = 'position';
2457 2457
 
2458 2458
 			$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element_line.' SET '.$fieldposition.' = '.$rang;
2459
-			$sql.= ' WHERE '.$this->fk_element.' = '.$this->id;
2460
-			$sql.= ' AND rang = '.($rang+1);
2461
-			if ($this->db->query($sql) )
2459
+			$sql .= ' WHERE '.$this->fk_element.' = '.$this->id;
2460
+			$sql .= ' AND rang = '.($rang + 1);
2461
+			if ($this->db->query($sql))
2462 2462
 			{
2463
-				$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element_line.' SET '.$fieldposition.' = '.($rang+1);
2464
-				$sql.= ' WHERE rowid = '.$rowid;
2465
-				if (! $this->db->query($sql) )
2463
+				$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element_line.' SET '.$fieldposition.' = '.($rang + 1);
2464
+				$sql .= ' WHERE rowid = '.$rowid;
2465
+				if (!$this->db->query($sql))
2466 2466
 				{
2467 2467
 					dol_print_error($this->db);
2468 2468
 				}
@@ -2483,7 +2483,7 @@  discard block
 block discarded – undo
2483 2483
 	function getRangOfLine($rowid)
2484 2484
 	{
2485 2485
 		$sql = 'SELECT rang FROM '.MAIN_DB_PREFIX.$this->table_element_line;
2486
-		$sql.= ' WHERE rowid ='.$rowid;
2486
+		$sql .= ' WHERE rowid ='.$rowid;
2487 2487
 
2488 2488
 		dol_syslog(get_class($this)."::getRangOfLine", LOG_DEBUG);
2489 2489
 		$resql = $this->db->query($sql);
@@ -2503,8 +2503,8 @@  discard block
 block discarded – undo
2503 2503
 	function getIdOfLine($rang)
2504 2504
 	{
2505 2505
 		$sql = 'SELECT rowid FROM '.MAIN_DB_PREFIX.$this->table_element_line;
2506
-		$sql.= ' WHERE '.$this->fk_element.' = '.$this->id;
2507
-		$sql.= ' AND rang = '.$rang;
2506
+		$sql .= ' WHERE '.$this->fk_element.' = '.$this->id;
2507
+		$sql .= ' AND rang = '.$rang;
2508 2508
 		$resql = $this->db->query($sql);
2509 2509
 		if ($resql)
2510 2510
 		{
@@ -2520,22 +2520,22 @@  discard block
 block discarded – undo
2520 2520
 	 * 	@param		int		$fk_parent_line		Parent line id
2521 2521
 	 *  @return     int  			   			Max value of rang in table of lines
2522 2522
 	 */
2523
-	function line_max($fk_parent_line=0)
2523
+	function line_max($fk_parent_line = 0)
2524 2524
 	{
2525 2525
         // phpcs:enable
2526 2526
 		// Search the last rang with fk_parent_line
2527 2527
 		if ($fk_parent_line)
2528 2528
 		{
2529 2529
 			$sql = 'SELECT max(rang) FROM '.MAIN_DB_PREFIX.$this->table_element_line;
2530
-			$sql.= ' WHERE '.$this->fk_element.' = '.$this->id;
2531
-			$sql.= ' AND fk_parent_line = '.$fk_parent_line;
2530
+			$sql .= ' WHERE '.$this->fk_element.' = '.$this->id;
2531
+			$sql .= ' AND fk_parent_line = '.$fk_parent_line;
2532 2532
 
2533 2533
 			dol_syslog(get_class($this)."::line_max", LOG_DEBUG);
2534 2534
 			$resql = $this->db->query($sql);
2535 2535
 			if ($resql)
2536 2536
 			{
2537 2537
 				$row = $this->db->fetch_row($resql);
2538
-				if (! empty($row[0]))
2538
+				if (!empty($row[0]))
2539 2539
 				{
2540 2540
 					return $row[0];
2541 2541
 				}
@@ -2549,7 +2549,7 @@  discard block
 block discarded – undo
2549 2549
 		else
2550 2550
 		{
2551 2551
 			$sql = 'SELECT max(rang) FROM '.MAIN_DB_PREFIX.$this->table_element_line;
2552
-			$sql.= ' WHERE '.$this->fk_element.' = '.$this->id;
2552
+			$sql .= ' WHERE '.$this->fk_element.' = '.$this->id;
2553 2553
 
2554 2554
 			dol_syslog(get_class($this)."::line_max", LOG_DEBUG);
2555 2555
 			$resql = $this->db->query($sql);
@@ -2571,15 +2571,15 @@  discard block
 block discarded – undo
2571 2571
 	function update_ref_ext($ref_ext)
2572 2572
 	{
2573 2573
         // phpcs:enable
2574
-		if (! $this->table_element)
2574
+		if (!$this->table_element)
2575 2575
 		{
2576 2576
 			dol_syslog(get_class($this)."::update_ref_ext was called on objet with property table_element not defined", LOG_ERR);
2577 2577
 			return -1;
2578 2578
 		}
2579 2579
 
2580 2580
 		$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
2581
-		$sql.= " SET ref_ext = '".$this->db->escape($ref_ext)."'";
2582
-		$sql.= " WHERE ".(isset($this->table_rowid)?$this->table_rowid:'rowid')." = ". $this->id;
2581
+		$sql .= " SET ref_ext = '".$this->db->escape($ref_ext)."'";
2582
+		$sql .= " WHERE ".(isset($this->table_rowid) ? $this->table_rowid : 'rowid')." = ".$this->id;
2583 2583
 
2584 2584
 		dol_syslog(get_class($this)."::update_ref_ext", LOG_DEBUG);
2585 2585
 		if ($this->db->query($sql))
@@ -2589,7 +2589,7 @@  discard block
 block discarded – undo
2589 2589
 		}
2590 2590
 		else
2591 2591
 		{
2592
-			$this->error=$this->db->error();
2592
+			$this->error = $this->db->error();
2593 2593
 			return -1;
2594 2594
 		}
2595 2595
 	}
@@ -2602,31 +2602,31 @@  discard block
 block discarded – undo
2602 2602
 	 *  @param		string		$suffix		'', '_public' or '_private'
2603 2603
 	 *  @return     int      		   		<0 if KO, >0 if OK
2604 2604
 	 */
2605
-	function update_note($note, $suffix='')
2605
+	function update_note($note, $suffix = '')
2606 2606
 	{
2607 2607
         // phpcs:enable
2608 2608
 		global $user;
2609 2609
 
2610
-		if (! $this->table_element)
2610
+		if (!$this->table_element)
2611 2611
 		{
2612
-			$this->error='update_note was called on objet with property table_element not defined';
2612
+			$this->error = 'update_note was called on objet with property table_element not defined';
2613 2613
 			dol_syslog(get_class($this)."::update_note was called on objet with property table_element not defined", LOG_ERR);
2614 2614
 			return -1;
2615 2615
 		}
2616
-		if (! in_array($suffix,array('','_public','_private')))
2616
+		if (!in_array($suffix, array('', '_public', '_private')))
2617 2617
 		{
2618
-			$this->error='update_note Parameter suffix must be empty, \'_private\' or \'_public\'';
2618
+			$this->error = 'update_note Parameter suffix must be empty, \'_private\' or \'_public\'';
2619 2619
 			dol_syslog(get_class($this)."::update_note Parameter suffix must be empty, '_private' or '_public'", LOG_ERR);
2620 2620
 			return -2;
2621 2621
 		}
2622 2622
 		// Special cas
2623 2623
 		//var_dump($this->table_element);exit;
2624
-		if ($this->table_element == 'product') $suffix='';
2624
+		if ($this->table_element == 'product') $suffix = '';
2625 2625
 
2626 2626
 		$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
2627
-		$sql.= " SET note".$suffix." = ".(!empty($note)?("'".$this->db->escape($note)."'"):"NULL");
2628
-		$sql.= " ,".(in_array($this->table_element, array('actioncomm', 'adherent', 'advtargetemailing', 'cronjob', 'establishment'))?"fk_user_mod":"fk_user_modif")." = ".$user->id;
2629
-		$sql.= " WHERE rowid =". $this->id;
2627
+		$sql .= " SET note".$suffix." = ".(!empty($note) ? ("'".$this->db->escape($note)."'") : "NULL");
2628
+		$sql .= " ,".(in_array($this->table_element, array('actioncomm', 'adherent', 'advtargetemailing', 'cronjob', 'establishment')) ? "fk_user_mod" : "fk_user_modif")." = ".$user->id;
2629
+		$sql .= " WHERE rowid =".$this->id;
2630 2630
 
2631 2631
 		dol_syslog(get_class($this)."::update_note", LOG_DEBUG);
2632 2632
 		if ($this->db->query($sql))
@@ -2635,14 +2635,14 @@  discard block
 block discarded – undo
2635 2635
 			else if ($suffix == '_private') $this->note_private = $note;
2636 2636
 			else
2637 2637
 			{
2638
-				$this->note = $note;      // deprecated
2638
+				$this->note = $note; // deprecated
2639 2639
 				$this->note_private = $note;
2640 2640
 			}
2641 2641
 			return 1;
2642 2642
 		}
2643 2643
 		else
2644 2644
 		{
2645
-			$this->error=$this->db->lasterror();
2645
+			$this->error = $this->db->lasterror();
2646 2646
 			return -1;
2647 2647
 		}
2648 2648
 	}
@@ -2659,7 +2659,7 @@  discard block
 block discarded – undo
2659 2659
 	function update_note_public($note)
2660 2660
 	{
2661 2661
         // phpcs:enable
2662
-		return $this->update_note($note,'_public');
2662
+		return $this->update_note($note, '_public');
2663 2663
 	}
2664 2664
 
2665 2665
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
@@ -2673,7 +2673,7 @@  discard block
 block discarded – undo
2673 2673
 	 *  @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.
2674 2674
 	 *	@return	int    			           	<0 if KO, >0 if OK
2675 2675
 	 */
2676
-	function update_price($exclspec=0,$roundingadjust='none',$nodatabaseupdate=0,$seller=null)
2676
+	function update_price($exclspec = 0, $roundingadjust = 'none', $nodatabaseupdate = 0, $seller = null)
2677 2677
 	{
2678 2678
         // phpcs:enable
2679 2679
 		global $conf, $hookmanager, $action;
@@ -2693,8 +2693,8 @@  discard block
 block discarded – undo
2693 2693
 		elseif ($this->element == 'supplier_proposal')
2694 2694
 			$MODULE = "MODULE_DISALLOW_UPDATE_PRICE_SUPPLIER_PROPOSAL";
2695 2695
 
2696
-		if (! empty($MODULE)) {
2697
-			if (! empty($conf->global->$MODULE)) {
2696
+		if (!empty($MODULE)) {
2697
+			if (!empty($conf->global->$MODULE)) {
2698 2698
 				$modsactivated = explode(',', $conf->global->$MODULE);
2699 2699
 				foreach ($modsactivated as $mod) {
2700 2700
 					if ($conf->$mod->enabled)
@@ -2705,44 +2705,44 @@  discard block
 block discarded – undo
2705 2705
 
2706 2706
 		include_once DOL_DOCUMENT_ROOT.'/core/lib/price.lib.php';
2707 2707
 
2708
-		if ($roundingadjust == '-1') $roundingadjust='auto';	// For backward compatibility
2708
+		if ($roundingadjust == '-1') $roundingadjust = 'auto'; // For backward compatibility
2709 2709
 
2710
-		$forcedroundingmode=$roundingadjust;
2711
-		if ($forcedroundingmode == 'auto' && isset($conf->global->MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND)) $forcedroundingmode=$conf->global->MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND;
2712
-		elseif ($forcedroundingmode == 'auto') $forcedroundingmode='0';
2710
+		$forcedroundingmode = $roundingadjust;
2711
+		if ($forcedroundingmode == 'auto' && isset($conf->global->MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND)) $forcedroundingmode = $conf->global->MAIN_ROUNDOFTOTAL_NOT_TOTALOFROUND;
2712
+		elseif ($forcedroundingmode == 'auto') $forcedroundingmode = '0';
2713 2713
 
2714
-		$error=0;
2714
+		$error = 0;
2715 2715
 
2716 2716
 		$multicurrency_tx = !empty($this->multicurrency_tx) ? $this->multicurrency_tx : 1;
2717 2717
 
2718 2718
 		// Define constants to find lines to sum
2719
-		$fieldtva='total_tva';
2720
-		$fieldlocaltax1='total_localtax1';
2721
-		$fieldlocaltax2='total_localtax2';
2722
-		$fieldup='subprice';
2719
+		$fieldtva = 'total_tva';
2720
+		$fieldlocaltax1 = 'total_localtax1';
2721
+		$fieldlocaltax2 = 'total_localtax2';
2722
+		$fieldup = 'subprice';
2723 2723
 		if ($this->element == 'facture_fourn' || $this->element == 'invoice_supplier')
2724 2724
 		{
2725
-			$fieldtva='tva';
2726
-			$fieldup='pu_ht';
2725
+			$fieldtva = 'tva';
2726
+			$fieldup = 'pu_ht';
2727 2727
 		}
2728 2728
 		if ($this->element == 'expensereport')
2729 2729
 		{
2730
-			$fieldup='value_unit';
2730
+			$fieldup = 'value_unit';
2731 2731
 		}
2732 2732
 
2733 2733
 		$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,';
2734
-		$sql.= ' tva_tx as vatrate, localtax1_tx, localtax2_tx, localtax1_type, localtax2_type, info_bits, product_type';
2735
-			if ($this->table_element_line == 'facturedet') $sql.= ', situation_percent';
2736
-			$sql.= ', multicurrency_total_ht, multicurrency_total_tva, multicurrency_total_ttc';
2737
-		$sql.= ' FROM '.MAIN_DB_PREFIX.$this->table_element_line;
2738
-		$sql.= ' WHERE '.$this->fk_element.' = '.$this->id;
2734
+		$sql .= ' tva_tx as vatrate, localtax1_tx, localtax2_tx, localtax1_type, localtax2_type, info_bits, product_type';
2735
+			if ($this->table_element_line == 'facturedet') $sql .= ', situation_percent';
2736
+			$sql .= ', multicurrency_total_ht, multicurrency_total_tva, multicurrency_total_ttc';
2737
+		$sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element_line;
2738
+		$sql .= ' WHERE '.$this->fk_element.' = '.$this->id;
2739 2739
 		if ($exclspec)
2740 2740
 		{
2741
-			$product_field='product_type';
2742
-			if ($this->table_element_line == 'contratdet') $product_field='';    // contratdet table has no product_type field
2743
-			if ($product_field) $sql.= ' AND '.$product_field.' <> 9';
2741
+			$product_field = 'product_type';
2742
+			if ($this->table_element_line == 'contratdet') $product_field = ''; // contratdet table has no product_type field
2743
+			if ($product_field) $sql .= ' AND '.$product_field.' <> 9';
2744 2744
 		}
2745
-		$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
2745
+		$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 2746
 
2747 2747
 		dol_syslog(get_class($this)."::update_price", LOG_DEBUG);
2748 2748
 		$resql = $this->db->query($sql);
@@ -2756,7 +2756,7 @@  discard block
 block discarded – undo
2756 2756
 			$total_ht_by_vats  = array();
2757 2757
 			$total_tva_by_vats = array();
2758 2758
 			$total_ttc_by_vats = array();
2759
-			$this->multicurrency_total_ht	= 0;
2759
+			$this->multicurrency_total_ht = 0;
2760 2760
 			$this->multicurrency_total_tva	= 0;
2761 2761
 			$this->multicurrency_total_ttc	= 0;
2762 2762
 
@@ -2767,54 +2767,54 @@  discard block
 block discarded – undo
2767 2767
 				$obj = $this->db->fetch_object($resql);
2768 2768
 
2769 2769
 				// Note: There is no check on detail line and no check on total, if $forcedroundingmode = 'none'
2770
-				$parameters=array('fk_element' => $obj->rowid);
2770
+				$parameters = array('fk_element' => $obj->rowid);
2771 2771
 				$reshook = $hookmanager->executeHooks('changeRoundingMode', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
2772 2772
 
2773 2773
 				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'
2774 2774
 				{
2775
-					$localtax_array=array($obj->localtax1_type,$obj->localtax1_tx,$obj->localtax2_type,$obj->localtax2_tx);
2776
-					$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);
2777
-					$diff=price2num($tmpcal[1] - $obj->total_tva, 'MT', 1);
2775
+					$localtax_array = array($obj->localtax1_type, $obj->localtax1_tx, $obj->localtax2_type, $obj->localtax2_tx);
2776
+					$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);
2777
+					$diff = price2num($tmpcal[1] - $obj->total_tva, 'MT', 1);
2778 2778
 					if ($diff)
2779 2779
 					{
2780
-						$sqlfix="UPDATE ".MAIN_DB_PREFIX.$this->table_element_line." SET ".$fieldtva." = ".$tmpcal[1].", total_ttc = ".$tmpcal[2]." WHERE rowid = ".$obj->rowid;
2780
+						$sqlfix = "UPDATE ".MAIN_DB_PREFIX.$this->table_element_line." SET ".$fieldtva." = ".$tmpcal[1].", total_ttc = ".$tmpcal[2]." WHERE rowid = ".$obj->rowid;
2781 2781
 						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);
2782
-								$resqlfix=$this->db->query($sqlfix);
2783
-								if (! $resqlfix) dol_print_error($this->db,'Failed to update line');
2782
+								$resqlfix = $this->db->query($sqlfix);
2783
+								if (!$resqlfix) dol_print_error($this->db, 'Failed to update line');
2784 2784
 								$obj->total_tva = $tmpcal[1];
2785 2785
 								$obj->total_ttc = $tmpcal[2];
2786 2786
 						//
2787 2787
 					}
2788 2788
 				}
2789 2789
 
2790
-				$this->total_ht        += $obj->total_ht;		// The field visible at end of line detail
2790
+				$this->total_ht        += $obj->total_ht; // The field visible at end of line detail
2791 2791
 				$this->total_tva       += $obj->total_tva;
2792 2792
 				$this->total_localtax1 += $obj->total_localtax1;
2793 2793
 				$this->total_localtax2 += $obj->total_localtax2;
2794 2794
 				$this->total_ttc       += $obj->total_ttc;
2795
-				$this->multicurrency_total_ht        += $obj->multicurrency_total_ht;		// The field visible at end of line detail
2795
+				$this->multicurrency_total_ht        += $obj->multicurrency_total_ht; // The field visible at end of line detail
2796 2796
 				$this->multicurrency_total_tva       += $obj->multicurrency_total_tva;
2797 2797
 				$this->multicurrency_total_ttc       += $obj->multicurrency_total_ttc;
2798 2798
 
2799
-				if (! isset($total_ht_by_vats[$obj->vatrate]))  $total_ht_by_vats[$obj->vatrate]=0;
2800
-				if (! isset($total_tva_by_vats[$obj->vatrate])) $total_tva_by_vats[$obj->vatrate]=0;
2801
-				if (! isset($total_ttc_by_vats[$obj->vatrate])) $total_ttc_by_vats[$obj->vatrate]=0;
2799
+				if (!isset($total_ht_by_vats[$obj->vatrate]))  $total_ht_by_vats[$obj->vatrate] = 0;
2800
+				if (!isset($total_tva_by_vats[$obj->vatrate])) $total_tva_by_vats[$obj->vatrate] = 0;
2801
+				if (!isset($total_ttc_by_vats[$obj->vatrate])) $total_ttc_by_vats[$obj->vatrate] = 0;
2802 2802
 				$total_ht_by_vats[$obj->vatrate]  += $obj->total_ht;
2803 2803
 				$total_tva_by_vats[$obj->vatrate] += $obj->total_tva;
2804 2804
 				$total_ttc_by_vats[$obj->vatrate] += $obj->total_ttc;
2805 2805
 
2806 2806
 				if ($forcedroundingmode == '1')	// Check if we need adjustement onto line for vat. TODO This works on the company currency but not on multicurrency
2807 2807
 				{
2808
-					$tmpvat=price2num($total_ht_by_vats[$obj->vatrate] * $obj->vatrate / 100, 'MT', 1);
2809
-					$diff=price2num($total_tva_by_vats[$obj->vatrate]-$tmpvat, 'MT', 1);
2808
+					$tmpvat = price2num($total_ht_by_vats[$obj->vatrate] * $obj->vatrate / 100, 'MT', 1);
2809
+					$diff = price2num($total_tva_by_vats[$obj->vatrate] - $tmpvat, 'MT', 1);
2810 2810
 					//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";
2811 2811
 					if ($diff)
2812 2812
 					{
2813 2813
 						if (abs($diff) > 0.1) { dol_syslog('A rounding difference was detected into TOTAL but is too high to be corrected', LOG_WARNING); exit; }
2814
-						$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;
2814
+						$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 2815
 						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);
2816
-								$resqlfix=$this->db->query($sqlfix);
2817
-								if (! $resqlfix) dol_print_error($this->db,'Failed to update line');
2816
+								$resqlfix = $this->db->query($sqlfix);
2817
+								if (!$resqlfix) dol_print_error($this->db, 'Failed to update line');
2818 2818
 								$this->total_tva -= $diff;
2819 2819
 								$this->total_ttc -= $diff;
2820 2820
 								$total_tva_by_vats[$obj->vatrate] -= $diff;
@@ -2826,11 +2826,11 @@  discard block
 block discarded – undo
2826 2826
 			}
2827 2827
 
2828 2828
 			// Add revenue stamp to total
2829
-			$this->total_ttc       			+= isset($this->revenuestamp)?$this->revenuestamp:0;
2830
-			$this->multicurrency_total_ttc  += isset($this->revenuestamp)?($this->revenuestamp * $multicurrency_tx):0;
2829
+			$this->total_ttc += isset($this->revenuestamp) ? $this->revenuestamp : 0;
2830
+			$this->multicurrency_total_ttc += isset($this->revenuestamp) ? ($this->revenuestamp * $multicurrency_tx) : 0;
2831 2831
 
2832 2832
 			// Situations totals
2833
-			if ($this->situation_cycle_ref && $this->situation_counter > 1 && method_exists($this, 'get_prev_sits') && $this->type != $this::TYPE_CREDIT_NOTE )
2833
+			if ($this->situation_cycle_ref && $this->situation_counter > 1 && method_exists($this, 'get_prev_sits') && $this->type != $this::TYPE_CREDIT_NOTE)
2834 2834
 			{
2835 2835
 				$prev_sits = $this->get_prev_sits();
2836 2836
 
@@ -2849,17 +2849,17 @@  discard block
 block discarded – undo
2849 2849
 			$this->db->free($resql);
2850 2850
 
2851 2851
 			// Now update global field total_ht, total_ttc and tva
2852
-			$fieldht='total_ht';
2853
-			$fieldtva='tva';
2854
-			$fieldlocaltax1='localtax1';
2855
-			$fieldlocaltax2='localtax2';
2856
-			$fieldttc='total_ttc';
2852
+			$fieldht = 'total_ht';
2853
+			$fieldtva = 'tva';
2854
+			$fieldlocaltax1 = 'localtax1';
2855
+			$fieldlocaltax2 = 'localtax2';
2856
+			$fieldttc = 'total_ttc';
2857 2857
 			// Specific code for backward compatibility with old field names
2858
-			if ($this->element == 'facture' || $this->element == 'facturerec')             $fieldht='total';
2859
-			if ($this->element == 'facture_fourn' || $this->element == 'invoice_supplier') $fieldtva='total_tva';
2860
-			if ($this->element == 'propal')                                                $fieldttc='total';
2861
-			if ($this->element == 'expensereport')                                         $fieldtva='total_tva';
2862
-			if ($this->element == 'supplier_proposal')                                     $fieldttc='total';
2858
+			if ($this->element == 'facture' || $this->element == 'facturerec')             $fieldht = 'total';
2859
+			if ($this->element == 'facture_fourn' || $this->element == 'invoice_supplier') $fieldtva = 'total_tva';
2860
+			if ($this->element == 'propal')                                                $fieldttc = 'total';
2861
+			if ($this->element == 'expensereport')                                         $fieldtva = 'total_tva';
2862
+			if ($this->element == 'supplier_proposal')                                     $fieldttc = 'total';
2863 2863
 
2864 2864
 			if (empty($nodatabaseupdate))
2865 2865
 			{
@@ -2876,16 +2876,16 @@  discard block
 block discarded – undo
2876 2876
 
2877 2877
 
2878 2878
 				dol_syslog(get_class($this)."::update_price", LOG_DEBUG);
2879
-				$resql=$this->db->query($sql);
2880
-				if (! $resql)
2879
+				$resql = $this->db->query($sql);
2880
+				if (!$resql)
2881 2881
 				{
2882 2882
 					$error++;
2883
-					$this->error=$this->db->lasterror();
2884
-					$this->errors[]=$this->db->lasterror();
2883
+					$this->error = $this->db->lasterror();
2884
+					$this->errors[] = $this->db->lasterror();
2885 2885
 				}
2886 2886
 			}
2887 2887
 
2888
-			if (! $error)
2888
+			if (!$error)
2889 2889
 			{
2890 2890
 				return 1;
2891 2891
 			}
@@ -2896,7 +2896,7 @@  discard block
 block discarded – undo
2896 2896
 		}
2897 2897
 		else
2898 2898
 		{
2899
-			dol_print_error($this->db,'Bad request in update_price');
2899
+			dol_print_error($this->db, 'Bad request in update_price');
2900 2900
 			return -1;
2901 2901
 		}
2902 2902
 	}
@@ -2910,30 +2910,30 @@  discard block
 block discarded – undo
2910 2910
 	 *	@return		int					<=0 if KO, >0 if OK
2911 2911
 	 *	@see		fetchObjectLinked, updateObjectLinked, deleteObjectLinked
2912 2912
 	 */
2913
-	function add_object_linked($origin=null, $origin_id=null)
2913
+	function add_object_linked($origin = null, $origin_id = null)
2914 2914
 	{
2915 2915
         // phpcs:enable
2916
-		$origin = (! empty($origin) ? $origin : $this->origin);
2917
-		$origin_id = (! empty($origin_id) ? $origin_id : $this->origin_id);
2916
+		$origin = (!empty($origin) ? $origin : $this->origin);
2917
+		$origin_id = (!empty($origin_id) ? $origin_id : $this->origin_id);
2918 2918
 
2919 2919
 		// Special case
2920
-		if ($origin == 'order') $origin='commande';
2921
-		if ($origin == 'invoice') $origin='facture';
2922
-		if ($origin == 'invoice_template') $origin='facturerec';
2923
-    	if ($origin == 'supplierorder') $origin='order_supplier';
2920
+		if ($origin == 'order') $origin = 'commande';
2921
+		if ($origin == 'invoice') $origin = 'facture';
2922
+		if ($origin == 'invoice_template') $origin = 'facturerec';
2923
+    	if ($origin == 'supplierorder') $origin = 'order_supplier';
2924 2924
 		$this->db->begin();
2925 2925
 
2926 2926
 		$sql = "INSERT INTO ".MAIN_DB_PREFIX."element_element (";
2927
-		$sql.= "fk_source";
2928
-		$sql.= ", sourcetype";
2929
-		$sql.= ", fk_target";
2930
-		$sql.= ", targettype";
2931
-		$sql.= ") VALUES (";
2932
-		$sql.= $origin_id;
2933
-		$sql.= ", '".$this->db->escape($origin)."'";
2934
-		$sql.= ", ".$this->id;
2935
-		$sql.= ", '".$this->db->escape($this->element)."'";
2936
-		$sql.= ")";
2927
+		$sql .= "fk_source";
2928
+		$sql .= ", sourcetype";
2929
+		$sql .= ", fk_target";
2930
+		$sql .= ", targettype";
2931
+		$sql .= ") VALUES (";
2932
+		$sql .= $origin_id;
2933
+		$sql .= ", '".$this->db->escape($origin)."'";
2934
+		$sql .= ", ".$this->id;
2935
+		$sql .= ", '".$this->db->escape($this->element)."'";
2936
+		$sql .= ")";
2937 2937
 
2938 2938
 		dol_syslog(get_class($this)."::add_object_linked", LOG_DEBUG);
2939 2939
 		if ($this->db->query($sql))
@@ -2943,7 +2943,7 @@  discard block
 block discarded – undo
2943 2943
 	  	}
2944 2944
 	  	else
2945 2945
 	  	{
2946
-	  		$this->error=$this->db->lasterror();
2946
+	  		$this->error = $this->db->lasterror();
2947 2947
 	  		$this->db->rollback();
2948 2948
 	  		return 0;
2949 2949
 	  	}
@@ -2971,33 +2971,33 @@  discard block
 block discarded – undo
2971 2971
 	 *	@return int							<0 if KO, >0 if OK
2972 2972
 	 *  @see	add_object_linked, updateObjectLinked, deleteObjectLinked
2973 2973
 	 */
2974
-	function fetchObjectLinked($sourceid=null,$sourcetype='',$targetid=null,$targettype='',$clause='OR',$alsosametype=1,$orderby='sourcetype',$loadalsoobjects=1)
2974
+	function fetchObjectLinked($sourceid = null, $sourcetype = '', $targetid = null, $targettype = '', $clause = 'OR', $alsosametype = 1, $orderby = 'sourcetype', $loadalsoobjects = 1)
2975 2975
 	{
2976 2976
 		global $conf;
2977 2977
 
2978
-		$this->linkedObjectsIds=array();
2979
-		$this->linkedObjects=array();
2978
+		$this->linkedObjectsIds = array();
2979
+		$this->linkedObjects = array();
2980 2980
 
2981
-		$justsource=false;
2982
-		$justtarget=false;
2983
-		$withtargettype=false;
2984
-		$withsourcetype=false;
2981
+		$justsource = false;
2982
+		$justtarget = false;
2983
+		$withtargettype = false;
2984
+		$withsourcetype = false;
2985 2985
 
2986
-		if (! empty($sourceid) && ! empty($sourcetype) && empty($targetid))
2986
+		if (!empty($sourceid) && !empty($sourcetype) && empty($targetid))
2987 2987
 		{
2988
-			$justsource=true;  // the source (id and type) is a search criteria
2989
-			if (! empty($targettype)) $withtargettype=true;
2988
+			$justsource = true; // the source (id and type) is a search criteria
2989
+			if (!empty($targettype)) $withtargettype = true;
2990 2990
 		}
2991
-		if (! empty($targetid) && ! empty($targettype) && empty($sourceid))
2991
+		if (!empty($targetid) && !empty($targettype) && empty($sourceid))
2992 2992
 		{
2993
-			$justtarget=true;  // the target (id and type) is a search criteria
2994
-			if (! empty($sourcetype)) $withsourcetype=true;
2993
+			$justtarget = true; // the target (id and type) is a search criteria
2994
+			if (!empty($sourcetype)) $withsourcetype = true;
2995 2995
 		}
2996 2996
 
2997
-		$sourceid = (! empty($sourceid) ? $sourceid : $this->id);
2998
-		$targetid = (! empty($targetid) ? $targetid : $this->id);
2999
-		$sourcetype = (! empty($sourcetype) ? $sourcetype : $this->element);
3000
-		$targettype = (! empty($targettype) ? $targettype : $this->element);
2997
+		$sourceid = (!empty($sourceid) ? $sourceid : $this->id);
2998
+		$targetid = (!empty($targetid) ? $targetid : $this->id);
2999
+		$sourcetype = (!empty($sourcetype) ? $sourcetype : $this->element);
3000
+		$targettype = (!empty($targettype) ? $targettype : $this->element);
3001 3001
 
3002 3002
 		/*if (empty($sourceid) && empty($targetid))
3003 3003
 		 {
@@ -3007,25 +3007,25 @@  discard block
 block discarded – undo
3007 3007
 
3008 3008
 		// Links between objects are stored in table element_element
3009 3009
 		$sql = 'SELECT rowid, fk_source, sourcetype, fk_target, targettype';
3010
-		$sql.= ' FROM '.MAIN_DB_PREFIX.'element_element';
3011
-		$sql.= " WHERE ";
3010
+		$sql .= ' FROM '.MAIN_DB_PREFIX.'element_element';
3011
+		$sql .= " WHERE ";
3012 3012
 		if ($justsource || $justtarget)
3013 3013
 		{
3014 3014
 			if ($justsource)
3015 3015
 			{
3016
-				$sql.= "fk_source = ".$sourceid." AND sourcetype = '".$sourcetype."'";
3017
-				if ($withtargettype) $sql.= " AND targettype = '".$targettype."'";
3016
+				$sql .= "fk_source = ".$sourceid." AND sourcetype = '".$sourcetype."'";
3017
+				if ($withtargettype) $sql .= " AND targettype = '".$targettype."'";
3018 3018
 			}
3019 3019
 			else if ($justtarget)
3020 3020
 			{
3021
-				$sql.= "fk_target = ".$targetid." AND targettype = '".$targettype."'";
3022
-				if ($withsourcetype) $sql.= " AND sourcetype = '".$sourcetype."'";
3021
+				$sql .= "fk_target = ".$targetid." AND targettype = '".$targettype."'";
3022
+				if ($withsourcetype) $sql .= " AND sourcetype = '".$sourcetype."'";
3023 3023
 			}
3024 3024
 		}
3025 3025
 		else
3026 3026
 		{
3027
-			$sql.= "(fk_source = ".$sourceid." AND sourcetype = '".$sourcetype."')";
3028
-			$sql.= " ".$clause." (fk_target = ".$targetid." AND targettype = '".$targettype."')";
3027
+			$sql .= "(fk_source = ".$sourceid." AND sourcetype = '".$sourcetype."')";
3028
+			$sql .= " ".$clause." (fk_target = ".$targetid." AND targettype = '".$targettype."')";
3029 3029
 		}
3030 3030
 		$sql .= ' ORDER BY '.$orderby;
3031 3031
 
@@ -3042,36 +3042,36 @@  discard block
 block discarded – undo
3042 3042
 				{
3043 3043
 					if ($justsource)
3044 3044
 					{
3045
-						$this->linkedObjectsIds[$obj->targettype][$obj->rowid]=$obj->fk_target;
3045
+						$this->linkedObjectsIds[$obj->targettype][$obj->rowid] = $obj->fk_target;
3046 3046
 					}
3047 3047
 					else if ($justtarget)
3048 3048
 					{
3049
-						$this->linkedObjectsIds[$obj->sourcetype][$obj->rowid]=$obj->fk_source;
3049
+						$this->linkedObjectsIds[$obj->sourcetype][$obj->rowid] = $obj->fk_source;
3050 3050
 					}
3051 3051
 				}
3052 3052
 				else
3053 3053
 				{
3054 3054
 					if ($obj->fk_source == $sourceid && $obj->sourcetype == $sourcetype)
3055 3055
 					{
3056
-						$this->linkedObjectsIds[$obj->targettype][$obj->rowid]=$obj->fk_target;
3056
+						$this->linkedObjectsIds[$obj->targettype][$obj->rowid] = $obj->fk_target;
3057 3057
 					}
3058 3058
 					if ($obj->fk_target == $targetid && $obj->targettype == $targettype)
3059 3059
 					{
3060
-						$this->linkedObjectsIds[$obj->sourcetype][$obj->rowid]=$obj->fk_source;
3060
+						$this->linkedObjectsIds[$obj->sourcetype][$obj->rowid] = $obj->fk_source;
3061 3061
 					}
3062 3062
 				}
3063 3063
 				$i++;
3064 3064
 			}
3065 3065
 
3066
-			if (! empty($this->linkedObjectsIds))
3066
+			if (!empty($this->linkedObjectsIds))
3067 3067
 			{
3068 3068
 				$tmparray = $this->linkedObjectsIds;
3069
-				foreach($tmparray as $objecttype => $objectids)       // $objecttype is a module name ('facture', 'mymodule', ...) or a module name with a suffix ('project_task', 'mymodule_myobj', ...)
3069
+				foreach ($tmparray as $objecttype => $objectids)       // $objecttype is a module name ('facture', 'mymodule', ...) or a module name with a suffix ('project_task', 'mymodule_myobj', ...)
3070 3070
 				{
3071 3071
 					// Parse element/subelement (ex: project_task, cabinetmed_consultation, ...)
3072 3072
 					$module = $element = $subelement = $objecttype;
3073 3073
 					if ($objecttype != 'supplier_proposal' && $objecttype != 'order_supplier' && $objecttype != 'invoice_supplier'
3074
-						&& preg_match('/^([^_]+)_([^_]+)/i',$objecttype,$regs))
3074
+						&& preg_match('/^([^_]+)_([^_]+)/i', $objecttype, $regs))
3075 3075
 					{
3076 3076
 						$module = $element = $regs[1];
3077 3077
 						$subelement = $regs[2];
@@ -3079,31 +3079,31 @@  discard block
 block discarded – undo
3079 3079
 
3080 3080
 					$classpath = $element.'/class';
3081 3081
 					// To work with non standard classpath or module name
3082
-					if ($objecttype == 'facture')			{
3082
+					if ($objecttype == 'facture') {
3083 3083
 						$classpath = 'compta/facture/class';
3084 3084
 					}
3085
-					else if ($objecttype == 'facturerec')			{
3085
+					else if ($objecttype == 'facturerec') {
3086 3086
 						$classpath = 'compta/facture/class'; $module = 'facture';
3087 3087
 					}
3088
-					else if ($objecttype == 'propal')			{
3088
+					else if ($objecttype == 'propal') {
3089 3089
 						$classpath = 'comm/propal/class';
3090 3090
 					}
3091
-					else if ($objecttype == 'supplier_proposal')			{
3091
+					else if ($objecttype == 'supplier_proposal') {
3092 3092
 						$classpath = 'supplier_proposal/class';
3093 3093
 					}
3094
-					else if ($objecttype == 'shipping')			{
3094
+					else if ($objecttype == 'shipping') {
3095 3095
 						$classpath = 'expedition/class'; $subelement = 'expedition'; $module = 'expedition_bon';
3096 3096
 					}
3097
-					else if ($objecttype == 'delivery')			{
3097
+					else if ($objecttype == 'delivery') {
3098 3098
 						$classpath = 'livraison/class'; $subelement = 'livraison'; $module = 'livraison_bon';
3099 3099
 					}
3100
-					else if ($objecttype == 'invoice_supplier' || $objecttype == 'order_supplier')	{
3100
+					else if ($objecttype == 'invoice_supplier' || $objecttype == 'order_supplier') {
3101 3101
 						$classpath = 'fourn/class'; $module = 'fournisseur';
3102 3102
 					}
3103
-					else if ($objecttype == 'fichinter')			{
3103
+					else if ($objecttype == 'fichinter') {
3104 3104
 						$classpath = 'fichinter/class'; $subelement = 'fichinter'; $module = 'ficheinter';
3105 3105
 					}
3106
-					else if ($objecttype == 'subscription')			{
3106
+					else if ($objecttype == 'subscription') {
3107 3107
 						$classpath = 'adherents/class'; $module = 'adherent';
3108 3108
 					}
3109 3109
 
@@ -3116,16 +3116,16 @@  discard block
 block discarded – undo
3116 3116
 					else if ($objecttype == 'invoice_supplier') {
3117 3117
 						$classfile = 'fournisseur.facture'; $classname = 'FactureFournisseur';
3118 3118
 					}
3119
-					else if ($objecttype == 'order_supplier')   {
3119
+					else if ($objecttype == 'order_supplier') {
3120 3120
 						$classfile = 'fournisseur.commande'; $classname = 'CommandeFournisseur';
3121 3121
 					}
3122
-					else if ($objecttype == 'supplier_proposal')   {
3122
+					else if ($objecttype == 'supplier_proposal') {
3123 3123
 						$classfile = 'supplier_proposal'; $classname = 'SupplierProposal';
3124 3124
 					}
3125
-					else if ($objecttype == 'facturerec')   {
3125
+					else if ($objecttype == 'facturerec') {
3126 3126
 						$classfile = 'facture-rec'; $classname = 'FactureRec';
3127 3127
 					}
3128
-					else if ($objecttype == 'subscription')   {
3128
+					else if ($objecttype == 'subscription') {
3129 3129
 						$classfile = 'subscription'; $classname = 'Subscription';
3130 3130
 					}
3131 3131
 
@@ -3138,7 +3138,7 @@  discard block
 block discarded – undo
3138 3138
 							//print '/'.$classpath.'/'.$classfile.'.class.php '.class_exists($classname);
3139 3139
 							if (class_exists($classname))
3140 3140
 							{
3141
-								foreach($objectids as $i => $objectid)	// $i is rowid into llx_element_element
3141
+								foreach ($objectids as $i => $objectid)	// $i is rowid into llx_element_element
3142 3142
 								{
3143 3143
 									$object = new $classname($this->db);
3144 3144
 									$ret = $object->fetch($objectid);
@@ -3175,28 +3175,28 @@  discard block
 block discarded – undo
3175 3175
 	 *	@return							int	>0 if OK, <0 if KO
3176 3176
 	 *	@see	add_object_linked, fetObjectLinked, deleteObjectLinked
3177 3177
 	 */
3178
-	function updateObjectLinked($sourceid=null, $sourcetype='', $targetid=null, $targettype='')
3178
+	function updateObjectLinked($sourceid = null, $sourcetype = '', $targetid = null, $targettype = '')
3179 3179
 	{
3180
-		$updatesource=false;
3181
-		$updatetarget=false;
3180
+		$updatesource = false;
3181
+		$updatetarget = false;
3182 3182
 
3183
-		if (! empty($sourceid) && ! empty($sourcetype) && empty($targetid) && empty($targettype)) $updatesource=true;
3184
-		else if (empty($sourceid) && empty($sourcetype) && ! empty($targetid) && ! empty($targettype)) $updatetarget=true;
3183
+		if (!empty($sourceid) && !empty($sourcetype) && empty($targetid) && empty($targettype)) $updatesource = true;
3184
+		else if (empty($sourceid) && empty($sourcetype) && !empty($targetid) && !empty($targettype)) $updatetarget = true;
3185 3185
 
3186 3186
 		$sql = "UPDATE ".MAIN_DB_PREFIX."element_element SET ";
3187 3187
 		if ($updatesource)
3188 3188
 		{
3189
-			$sql.= "fk_source = ".$sourceid;
3190
-			$sql.= ", sourcetype = '".$this->db->escape($sourcetype)."'";
3191
-			$sql.= " WHERE fk_target = ".$this->id;
3192
-			$sql.= " AND targettype = '".$this->db->escape($this->element)."'";
3189
+			$sql .= "fk_source = ".$sourceid;
3190
+			$sql .= ", sourcetype = '".$this->db->escape($sourcetype)."'";
3191
+			$sql .= " WHERE fk_target = ".$this->id;
3192
+			$sql .= " AND targettype = '".$this->db->escape($this->element)."'";
3193 3193
 		}
3194 3194
 		else if ($updatetarget)
3195 3195
 		{
3196
-			$sql.= "fk_target = ".$targetid;
3197
-			$sql.= ", targettype = '".$this->db->escape($targettype)."'";
3198
-			$sql.= " WHERE fk_source = ".$this->id;
3199
-			$sql.= " AND sourcetype = '".$this->db->escape($this->element)."'";
3196
+			$sql .= "fk_target = ".$targetid;
3197
+			$sql .= ", targettype = '".$this->db->escape($targettype)."'";
3198
+			$sql .= " WHERE fk_source = ".$this->id;
3199
+			$sql .= " AND sourcetype = '".$this->db->escape($this->element)."'";
3200 3200
 		}
3201 3201
 
3202 3202
 		dol_syslog(get_class($this)."::updateObjectLinked", LOG_DEBUG);
@@ -3206,7 +3206,7 @@  discard block
 block discarded – undo
3206 3206
 		}
3207 3207
 		else
3208 3208
 		{
3209
-			$this->error=$this->db->lasterror();
3209
+			$this->error = $this->db->lasterror();
3210 3210
 			return -1;
3211 3211
 		}
3212 3212
 	}
@@ -3222,42 +3222,42 @@  discard block
 block discarded – undo
3222 3222
 	 *	@return     					int	>0 if OK, <0 if KO
3223 3223
 	 *	@see	add_object_linked, updateObjectLinked, fetchObjectLinked
3224 3224
 	 */
3225
-	function deleteObjectLinked($sourceid=null, $sourcetype='', $targetid=null, $targettype='', $rowid='')
3225
+	function deleteObjectLinked($sourceid = null, $sourcetype = '', $targetid = null, $targettype = '', $rowid = '')
3226 3226
 	{
3227
-		$deletesource=false;
3228
-		$deletetarget=false;
3227
+		$deletesource = false;
3228
+		$deletetarget = false;
3229 3229
 
3230
-		if (! empty($sourceid) && ! empty($sourcetype) && empty($targetid) && empty($targettype)) $deletesource=true;
3231
-		else if (empty($sourceid) && empty($sourcetype) && ! empty($targetid) && ! empty($targettype)) $deletetarget=true;
3230
+		if (!empty($sourceid) && !empty($sourcetype) && empty($targetid) && empty($targettype)) $deletesource = true;
3231
+		else if (empty($sourceid) && empty($sourcetype) && !empty($targetid) && !empty($targettype)) $deletetarget = true;
3232 3232
 
3233
-		$sourceid = (! empty($sourceid) ? $sourceid : $this->id);
3234
-		$sourcetype = (! empty($sourcetype) ? $sourcetype : $this->element);
3235
-		$targetid = (! empty($targetid) ? $targetid : $this->id);
3236
-		$targettype = (! empty($targettype) ? $targettype : $this->element);
3233
+		$sourceid = (!empty($sourceid) ? $sourceid : $this->id);
3234
+		$sourcetype = (!empty($sourcetype) ? $sourcetype : $this->element);
3235
+		$targetid = (!empty($targetid) ? $targetid : $this->id);
3236
+		$targettype = (!empty($targettype) ? $targettype : $this->element);
3237 3237
 
3238 3238
 		$sql = "DELETE FROM ".MAIN_DB_PREFIX."element_element";
3239
-		$sql.= " WHERE";
3239
+		$sql .= " WHERE";
3240 3240
 		if ($rowid > 0)
3241 3241
 		{
3242
-			$sql.=" rowid = ".$rowid;
3242
+			$sql .= " rowid = ".$rowid;
3243 3243
 		}
3244 3244
 		else
3245 3245
 		{
3246 3246
 			if ($deletesource)
3247 3247
 			{
3248
-				$sql.= " fk_source = ".$sourceid." AND sourcetype = '".$this->db->escape($sourcetype)."'";
3249
-				$sql.= " AND fk_target = ".$this->id." AND targettype = '".$this->db->escape($this->element)."'";
3248
+				$sql .= " fk_source = ".$sourceid." AND sourcetype = '".$this->db->escape($sourcetype)."'";
3249
+				$sql .= " AND fk_target = ".$this->id." AND targettype = '".$this->db->escape($this->element)."'";
3250 3250
 			}
3251 3251
 			else if ($deletetarget)
3252 3252
 			{
3253
-				$sql.= " fk_target = ".$targetid." AND targettype = '".$this->db->escape($targettype)."'";
3254
-				$sql.= " AND fk_source = ".$this->id." AND sourcetype = '".$this->db->escape($this->element)."'";
3253
+				$sql .= " fk_target = ".$targetid." AND targettype = '".$this->db->escape($targettype)."'";
3254
+				$sql .= " AND fk_source = ".$this->id." AND sourcetype = '".$this->db->escape($this->element)."'";
3255 3255
 			}
3256 3256
 			else
3257 3257
 			{
3258
-				$sql.= " (fk_source = ".$this->id." AND sourcetype = '".$this->db->escape($this->element)."')";
3259
-				$sql.= " OR";
3260
-				$sql.= " (fk_target = ".$this->id." AND targettype = '".$this->db->escape($this->element)."')";
3258
+				$sql .= " (fk_source = ".$this->id." AND sourcetype = '".$this->db->escape($this->element)."')";
3259
+				$sql .= " OR";
3260
+				$sql .= " (fk_target = ".$this->id." AND targettype = '".$this->db->escape($this->element)."')";
3261 3261
 			}
3262 3262
 		}
3263 3263
 
@@ -3268,8 +3268,8 @@  discard block
 block discarded – undo
3268 3268
 		}
3269 3269
 		else
3270 3270
 		{
3271
-			$this->error=$this->db->lasterror();
3272
-			$this->errors[]=$this->error;
3271
+			$this->error = $this->db->lasterror();
3272
+			$this->errors[] = $this->error;
3273 3273
 			return -1;
3274 3274
 		}
3275 3275
 	}
@@ -3283,30 +3283,30 @@  discard block
 block discarded – undo
3283 3283
 	 *      @param	string	$trigkey		Trigger key to use for trigger
3284 3284
 	 *      @return int						<0 if KO, >0 if OK
3285 3285
 	 */
3286
-	function setStatut($status, $elementId=null, $elementType='', $trigkey='')
3286
+	function setStatut($status, $elementId = null, $elementType = '', $trigkey = '')
3287 3287
 	{
3288
-		global $user,$langs,$conf;
3288
+		global $user, $langs, $conf;
3289 3289
 
3290
-		$savElementId=$elementId;  // To be used later to know if we were using the method using the id of this or not.
3290
+		$savElementId = $elementId; // To be used later to know if we were using the method using the id of this or not.
3291 3291
 
3292
-		$elementId = (!empty($elementId)?$elementId:$this->id);
3293
-		$elementTable = (!empty($elementType)?$elementType:$this->table_element);
3292
+		$elementId = (!empty($elementId) ? $elementId : $this->id);
3293
+		$elementTable = (!empty($elementType) ? $elementType : $this->table_element);
3294 3294
 
3295 3295
 		$this->db->begin();
3296 3296
 
3297
-		$fieldstatus="fk_statut";
3298
-		if ($elementTable == 'facture_rec') $fieldstatus="suspended";
3299
-		if ($elementTable == 'mailing') $fieldstatus="statut";
3300
-		if ($elementTable == 'cronjob') $fieldstatus="status";
3301
-		if ($elementTable == 'user') $fieldstatus="statut";
3302
-		if ($elementTable == 'expensereport') $fieldstatus="fk_statut";
3303
-		if ($elementTable == 'commande_fournisseur_dispatch') $fieldstatus="status";
3297
+		$fieldstatus = "fk_statut";
3298
+		if ($elementTable == 'facture_rec') $fieldstatus = "suspended";
3299
+		if ($elementTable == 'mailing') $fieldstatus = "statut";
3300
+		if ($elementTable == 'cronjob') $fieldstatus = "status";
3301
+		if ($elementTable == 'user') $fieldstatus = "statut";
3302
+		if ($elementTable == 'expensereport') $fieldstatus = "fk_statut";
3303
+		if ($elementTable == 'commande_fournisseur_dispatch') $fieldstatus = "status";
3304 3304
 
3305 3305
 		$sql = "UPDATE ".MAIN_DB_PREFIX.$elementTable;
3306
-		$sql.= " SET ".$fieldstatus." = ".$status;
3306
+		$sql .= " SET ".$fieldstatus." = ".$status;
3307 3307
 		// If status = 1 = validated, update also fk_user_valid
3308
-		if ($status == 1 && $elementTable == 'expensereport') $sql.=", fk_user_valid = ".$user->id;
3309
-		$sql.= " WHERE rowid=".$elementId;
3308
+		if ($status == 1 && $elementTable == 'expensereport') $sql .= ", fk_user_valid = ".$user->id;
3309
+		$sql .= " WHERE rowid=".$elementId;
3310 3310
 
3311 3311
 		dol_syslog(get_class($this)."::setStatut", LOG_DEBUG);
3312 3312
 		if ($this->db->query($sql))
@@ -3316,27 +3316,27 @@  discard block
 block discarded – undo
3316 3316
 			// Try autoset of trigkey
3317 3317
 			if (empty($trigkey))
3318 3318
 			{
3319
-				if ($this->element == 'supplier_proposal' && $status == 2) $trigkey='SUPPLIER_PROPOSAL_SIGN';   // 2 = SupplierProposal::STATUS_SIGNED. Can't use constant into this generic class
3320
-				if ($this->element == 'supplier_proposal' && $status == 3) $trigkey='SUPPLIER_PROPOSAL_REFUSE'; // 3 = SupplierProposal::STATUS_REFUSED. Can't use constant into this generic class
3321
-				if ($this->element == 'supplier_proposal' && $status == 4) $trigkey='SUPPLIER_PROPOSAL_CLOSE';  // 4 = SupplierProposal::STATUS_CLOSED. Can't use constant into this generic class
3322
-				if ($this->element == 'fichinter' && $status == 3) $trigkey='FICHINTER_CLASSIFY_DONE';
3323
-				if ($this->element == 'fichinter' && $status == 2) $trigkey='FICHINTER_CLASSIFY_BILLED';
3324
-				if ($this->element == 'fichinter' && $status == 1) $trigkey='FICHINTER_CLASSIFY_UNBILLED';
3319
+				if ($this->element == 'supplier_proposal' && $status == 2) $trigkey = 'SUPPLIER_PROPOSAL_SIGN'; // 2 = SupplierProposal::STATUS_SIGNED. Can't use constant into this generic class
3320
+				if ($this->element == 'supplier_proposal' && $status == 3) $trigkey = 'SUPPLIER_PROPOSAL_REFUSE'; // 3 = SupplierProposal::STATUS_REFUSED. Can't use constant into this generic class
3321
+				if ($this->element == 'supplier_proposal' && $status == 4) $trigkey = 'SUPPLIER_PROPOSAL_CLOSE'; // 4 = SupplierProposal::STATUS_CLOSED. Can't use constant into this generic class
3322
+				if ($this->element == 'fichinter' && $status == 3) $trigkey = 'FICHINTER_CLASSIFY_DONE';
3323
+				if ($this->element == 'fichinter' && $status == 2) $trigkey = 'FICHINTER_CLASSIFY_BILLED';
3324
+				if ($this->element == 'fichinter' && $status == 1) $trigkey = 'FICHINTER_CLASSIFY_UNBILLED';
3325 3325
 			}
3326 3326
 
3327 3327
 			if ($trigkey)
3328 3328
 			{
3329 3329
 				// Appel des triggers
3330
-				include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php';
3331
-				$interface=new Interfaces($this->db);
3332
-				$result=$interface->run_triggers($trigkey,$this,$user,$langs,$conf);
3330
+				include_once DOL_DOCUMENT_ROOT.'/core/class/interfaces.class.php';
3331
+				$interface = new Interfaces($this->db);
3332
+				$result = $interface->run_triggers($trigkey, $this, $user, $langs, $conf);
3333 3333
 				if ($result < 0) {
3334
-					$error++; $this->errors=$interface->errors;
3334
+					$error++; $this->errors = $interface->errors;
3335 3335
 				}
3336 3336
 				// Fin appel triggers
3337 3337
 			}
3338 3338
 
3339
-			if (! $error)
3339
+			if (!$error)
3340 3340
 			{
3341 3341
 				$this->db->commit();
3342 3342
 
@@ -3351,13 +3351,13 @@  discard block
 block discarded – undo
3351 3351
 			else
3352 3352
 			{
3353 3353
 				$this->db->rollback();
3354
-				dol_syslog(get_class($this)."::setStatus ".$this->error,LOG_ERR);
3354
+				dol_syslog(get_class($this)."::setStatus ".$this->error, LOG_ERR);
3355 3355
 				return -1;
3356 3356
 			}
3357 3357
 		}
3358 3358
 		else
3359 3359
 		{
3360
-			$this->error=$this->db->lasterror();
3360
+			$this->error = $this->db->lasterror();
3361 3361
 			$this->db->rollback();
3362 3362
 			return -1;
3363 3363
 		}
@@ -3371,21 +3371,21 @@  discard block
 block discarded – undo
3371 3371
 	 *  @param      string	$ref    Record ref
3372 3372
 	 *  @return		int				<0 if KO, 0 if nothing done, >0 if OK
3373 3373
 	 */
3374
-	function getCanvas($id=0,$ref='')
3374
+	function getCanvas($id = 0, $ref = '')
3375 3375
 	{
3376 3376
 		global $conf;
3377 3377
 
3378 3378
 		if (empty($id) && empty($ref)) return 0;
3379
-		if (! empty($conf->global->MAIN_DISABLE_CANVAS)) return 0;    // To increase speed. Not enabled by default.
3379
+		if (!empty($conf->global->MAIN_DISABLE_CANVAS)) return 0; // To increase speed. Not enabled by default.
3380 3380
 
3381 3381
 		// Clean parameters
3382 3382
 		$ref = trim($ref);
3383 3383
 
3384 3384
 		$sql = "SELECT rowid, canvas";
3385
-		$sql.= " FROM ".MAIN_DB_PREFIX.$this->table_element;
3386
-		$sql.= " WHERE entity IN (".getEntity($this->element).")";
3387
-		if (! empty($id))  $sql.= " AND rowid = ".$id;
3388
-		if (! empty($ref)) $sql.= " AND ref = '".$this->db->escape($ref)."'";
3385
+		$sql .= " FROM ".MAIN_DB_PREFIX.$this->table_element;
3386
+		$sql .= " WHERE entity IN (".getEntity($this->element).")";
3387
+		if (!empty($id))  $sql .= " AND rowid = ".$id;
3388
+		if (!empty($ref)) $sql .= " AND ref = '".$this->db->escape($ref)."'";
3389 3389
 
3390 3390
 		$resql = $this->db->query($sql);
3391 3391
 		if ($resql)
@@ -3393,7 +3393,7 @@  discard block
 block discarded – undo
3393 3393
 			$obj = $this->db->fetch_object($resql);
3394 3394
 			if ($obj)
3395 3395
 			{
3396
-				$this->canvas   = $obj->canvas;
3396
+				$this->canvas = $obj->canvas;
3397 3397
 				return 1;
3398 3398
 			}
3399 3399
 			else return 0;
@@ -3415,7 +3415,7 @@  discard block
 block discarded – undo
3415 3415
 	function getSpecialCode($lineid)
3416 3416
 	{
3417 3417
 		$sql = 'SELECT special_code FROM '.MAIN_DB_PREFIX.$this->table_element_line;
3418
-		$sql.= ' WHERE rowid = '.$lineid;
3418
+		$sql .= ' WHERE rowid = '.$lineid;
3419 3419
 		$resql = $this->db->query($sql);
3420 3420
 		if ($resql)
3421 3421
 		{
@@ -3431,14 +3431,14 @@  discard block
 block discarded – undo
3431 3431
 	 *  @param	int		$id			Force id of object
3432 3432
 	 *  @return	int					<0 if KO, 0 if not used, >0 if already used
3433 3433
 	 */
3434
-	function isObjectUsed($id=0)
3434
+	function isObjectUsed($id = 0)
3435 3435
 	{
3436 3436
 		global $langs;
3437 3437
 
3438
-		if (empty($id)) $id=$this->id;
3438
+		if (empty($id)) $id = $this->id;
3439 3439
 
3440 3440
 		// Check parameters
3441
-		if (! isset($this->childtables) || ! is_array($this->childtables) || count($this->childtables) == 0)
3441
+		if (!isset($this->childtables) || !is_array($this->childtables) || count($this->childtables) == 0)
3442 3442
 		{
3443 3443
 			dol_print_error('Called isObjectUsed on a class with property this->childtables not defined');
3444 3444
 			return -1;
@@ -3446,24 +3446,24 @@  discard block
 block discarded – undo
3446 3446
 
3447 3447
 		$arraytoscan = $this->childtables;
3448 3448
 		// For backward compatibility, we check if array is old format array('table1', 'table2', ...)
3449
-		$tmparray=array_keys($this->childtables);
3449
+		$tmparray = array_keys($this->childtables);
3450 3450
 		if (is_numeric($tmparray[0]))
3451 3451
 		{
3452 3452
 			$arraytoscan = array_flip($this->childtables);
3453 3453
 		}
3454 3454
 
3455 3455
 		// Test if child exists
3456
-		$haschild=0;
3457
-		foreach($arraytoscan as $table => $elementname)
3456
+		$haschild = 0;
3457
+		foreach ($arraytoscan as $table => $elementname)
3458 3458
 		{
3459 3459
 			//print $id.'-'.$table.'-'.$elementname.'<br>';
3460 3460
 			// Check if third party can be deleted
3461 3461
 			$sql = "SELECT COUNT(*) as nb from ".MAIN_DB_PREFIX.$table;
3462
-			$sql.= " WHERE ".$this->fk_element." = ".$id;
3463
-			$resql=$this->db->query($sql);
3462
+			$sql .= " WHERE ".$this->fk_element." = ".$id;
3463
+			$resql = $this->db->query($sql);
3464 3464
 			if ($resql)
3465 3465
 			{
3466
-				$obj=$this->db->fetch_object($resql);
3466
+				$obj = $this->db->fetch_object($resql);
3467 3467
 				if ($obj->nb > 0)
3468 3468
 				{
3469 3469
 					$langs->load("errors");
@@ -3471,24 +3471,24 @@  discard block
 block discarded – undo
3471 3471
 					$haschild += $obj->nb;
3472 3472
 					if (is_numeric($elementname))	// old usage
3473 3473
 					{
3474
-						$this->errors[]=$langs->trans("ErrorRecordHasAtLeastOneChildOfType", $table);
3474
+						$this->errors[] = $langs->trans("ErrorRecordHasAtLeastOneChildOfType", $table);
3475 3475
 					}
3476 3476
 					else	// new usage: $elementname=Translation key
3477 3477
 					{
3478
-						$this->errors[]=$langs->trans("ErrorRecordHasAtLeastOneChildOfType", $langs->transnoentitiesnoconv($elementname));
3478
+						$this->errors[] = $langs->trans("ErrorRecordHasAtLeastOneChildOfType", $langs->transnoentitiesnoconv($elementname));
3479 3479
 					}
3480
-					break;    // We found at least one, we stop here
3480
+					break; // We found at least one, we stop here
3481 3481
 				}
3482 3482
 			}
3483 3483
 			else
3484 3484
 			{
3485
-				$this->errors[]=$this->db->lasterror();
3485
+				$this->errors[] = $this->db->lasterror();
3486 3486
 				return -1;
3487 3487
 			}
3488 3488
 		}
3489 3489
 		if ($haschild > 0)
3490 3490
 		{
3491
-			$this->errors[]="ErrorRecordHasChildren";
3491
+			$this->errors[] = "ErrorRecordHasChildren";
3492 3492
 			return $haschild;
3493 3493
 		}
3494 3494
 		else return 0;
@@ -3500,18 +3500,18 @@  discard block
 block discarded – undo
3500 3500
 	 *	@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
3501 3501
 	 *  @return	int						<0 if KO, 0 if no predefined products, nb of lines with predefined products if found
3502 3502
 	 */
3503
-	function hasProductsOrServices($predefined=-1)
3503
+	function hasProductsOrServices($predefined = -1)
3504 3504
 	{
3505
-		$nb=0;
3505
+		$nb = 0;
3506 3506
 
3507
-		foreach($this->lines as $key => $val)
3507
+		foreach ($this->lines as $key => $val)
3508 3508
 		{
3509
-			$qualified=0;
3510
-			if ($predefined == -1) $qualified=1;
3511
-			if ($predefined == 1 && $val->fk_product > 0) $qualified=1;
3512
-			if ($predefined == 0 && $val->fk_product <= 0) $qualified=1;
3513
-			if ($predefined == 2 && $val->fk_product > 0 && $val->product_type==0) $qualified=1;
3514
-			if ($predefined == 3 && $val->fk_product > 0 && $val->product_type==1) $qualified=1;
3509
+			$qualified = 0;
3510
+			if ($predefined == -1) $qualified = 1;
3511
+			if ($predefined == 1 && $val->fk_product > 0) $qualified = 1;
3512
+			if ($predefined == 0 && $val->fk_product <= 0) $qualified = 1;
3513
+			if ($predefined == 2 && $val->fk_product > 0 && $val->product_type == 0) $qualified = 1;
3514
+			if ($predefined == 3 && $val->fk_product > 0 && $val->product_type == 1) $qualified = 1;
3515 3515
 			if ($qualified) $nb++;
3516 3516
 		}
3517 3517
 		dol_syslog(get_class($this).'::hasProductsOrServices we found '.$nb.' qualified lines of products/servcies');
@@ -3525,24 +3525,24 @@  discard block
 block discarded – undo
3525 3525
 	 */
3526 3526
 	function getTotalDiscount()
3527 3527
 	{
3528
-		$total_discount=0.00;
3528
+		$total_discount = 0.00;
3529 3529
 
3530 3530
 		$sql = "SELECT subprice as pu_ht, qty, remise_percent, total_ht";
3531
-		$sql.= " FROM ".MAIN_DB_PREFIX.$this->table_element."det";
3532
-		$sql.= " WHERE ".$this->fk_element." = ".$this->id;
3531
+		$sql .= " FROM ".MAIN_DB_PREFIX.$this->table_element."det";
3532
+		$sql .= " WHERE ".$this->fk_element." = ".$this->id;
3533 3533
 
3534 3534
 		dol_syslog(get_class($this).'::getTotalDiscount', LOG_DEBUG);
3535 3535
 		$resql = $this->db->query($sql);
3536 3536
 		if ($resql)
3537 3537
 		{
3538
-			$num=$this->db->num_rows($resql);
3539
-			$i=0;
3538
+			$num = $this->db->num_rows($resql);
3539
+			$i = 0;
3540 3540
 			while ($i < $num)
3541 3541
 			{
3542 3542
 				$obj = $this->db->fetch_object($resql);
3543 3543
 
3544 3544
 				$pu_ht = $obj->pu_ht;
3545
-				$qty= $obj->qty;
3545
+				$qty = $obj->qty;
3546 3546
 				$total_ht = $obj->total_ht;
3547 3547
 
3548 3548
 				$total_discount_line = floatval(price2num(($pu_ht * $qty) - $total_ht, 'MT'));
@@ -3576,17 +3576,17 @@  discard block
 block discarded – undo
3576 3576
 		{
3577 3577
 			if (isset($line->qty_asked))
3578 3578
 			{
3579
-				if (empty($totalOrdered)) $totalOrdered=0;  // Avoid warning because $totalOrdered is ''
3580
-				$totalOrdered+=$line->qty_asked;    // defined for shipment only
3579
+				if (empty($totalOrdered)) $totalOrdered = 0; // Avoid warning because $totalOrdered is ''
3580
+				$totalOrdered += $line->qty_asked; // defined for shipment only
3581 3581
 			}
3582 3582
 			if (isset($line->qty_shipped))
3583 3583
 			{
3584
-				if (empty($totalToShip)) $totalToShip=0;    // Avoid warning because $totalToShip is ''
3585
-				$totalToShip+=$line->qty_shipped;   // defined for shipment only
3586
-            }else if ($line->element == 'commandefournisseurdispatch' && isset($line->qty))
3584
+				if (empty($totalToShip)) $totalToShip = 0; // Avoid warning because $totalToShip is ''
3585
+				$totalToShip += $line->qty_shipped; // defined for shipment only
3586
+            } else if ($line->element == 'commandefournisseurdispatch' && isset($line->qty))
3587 3587
             {
3588
-                if (empty($totalToShip)) $totalToShip=0;
3589
-                $totalToShip+=$line->qty;   // defined for reception only
3588
+                if (empty($totalToShip)) $totalToShip = 0;
3589
+                $totalToShip += $line->qty; // defined for reception only
3590 3590
 			}
3591 3591
 
3592 3592
 			// Define qty, weight, volume, weight_units, volume_units
@@ -3599,27 +3599,27 @@  discard block
 block discarded – undo
3599 3599
 			}
3600 3600
 
3601 3601
 			$weight = $line->weight ? $line->weight : 0;
3602
-            ($weight==0 && !empty($line->product->weight))? $weight=$line->product->weight: 0;
3602
+            ($weight == 0 && !empty($line->product->weight)) ? $weight = $line->product->weight : 0;
3603 3603
 			$volume = $line->volume ? $line->volume : 0;
3604
-			($volume==0 && !empty($line->product->volume))? $volume=$line->product->volume: 0;
3604
+			($volume == 0 && !empty($line->product->volume)) ? $volume = $line->product->volume : 0;
3605 3605
 
3606
-			$weight_units=$line->weight_units;
3607
-			($weight_units==0 && !empty($line->product->weight_units))? $weight_units=$line->product->weight_units: 0;
3608
-			$volume_units=$line->volume_units;
3609
-			($volume_units==0 && !empty($line->product->volume_units))? $volume_units=$line->product->volume_units: 0;
3606
+			$weight_units = $line->weight_units;
3607
+			($weight_units == 0 && !empty($line->product->weight_units)) ? $weight_units = $line->product->weight_units : 0;
3608
+			$volume_units = $line->volume_units;
3609
+			($volume_units == 0 && !empty($line->product->volume_units)) ? $volume_units = $line->product->volume_units : 0;
3610 3610
 
3611
-			$weightUnit=0;
3612
-			$volumeUnit=0;
3613
-			if (! empty($weight_units)) $weightUnit = $weight_units;
3614
-			if (! empty($volume_units)) $volumeUnit = $volume_units;
3611
+			$weightUnit = 0;
3612
+			$volumeUnit = 0;
3613
+			if (!empty($weight_units)) $weightUnit = $weight_units;
3614
+			if (!empty($volume_units)) $volumeUnit = $volume_units;
3615 3615
 
3616
-			if (empty($totalWeight)) $totalWeight=0;  // Avoid warning because $totalWeight is ''
3617
-			if (empty($totalVolume)) $totalVolume=0;  // Avoid warning because $totalVolume is ''
3616
+			if (empty($totalWeight)) $totalWeight = 0; // Avoid warning because $totalWeight is ''
3617
+			if (empty($totalVolume)) $totalVolume = 0; // Avoid warning because $totalVolume is ''
3618 3618
 
3619 3619
 			//var_dump($line->volume_units);
3620 3620
 			if ($weight_units < 50)   // >50 means a standard unit (power of 10 of official unit), > 50 means an exotic unit (like inch)
3621 3621
 			{
3622
-				$trueWeightUnit=pow(10, $weightUnit);
3622
+				$trueWeightUnit = pow(10, $weightUnit);
3623 3623
 				$totalWeight += $weight * $qty * $trueWeightUnit;
3624 3624
 			}
3625 3625
 			else {
@@ -3633,18 +3633,18 @@  discard block
 block discarded – undo
3633 3633
 			$totalWeight += $weight * $qty * $trueWeightUnit;
3634 3634
 		}
3635 3635
 		else
3636
-					$totalWeight += $weight * $qty;   // This may be wrong if we mix different units
3636
+					$totalWeight += $weight * $qty; // This may be wrong if we mix different units
3637 3637
 			}
3638 3638
 			if ($volume_units < 50)   // >50 means a standard unit (power of 10 of official unit), > 50 means an exotic unit (like inch)
3639 3639
 			{
3640 3640
 				//print $line->volume."x".$line->volume_units."x".($line->volume_units < 50)."x".$volumeUnit;
3641
-				$trueVolumeUnit=pow(10, $volumeUnit);
3641
+				$trueVolumeUnit = pow(10, $volumeUnit);
3642 3642
 				//print $line->volume;
3643 3643
 				$totalVolume += $volume * $qty * $trueVolumeUnit;
3644 3644
 			}
3645 3645
 			else
3646 3646
 			{
3647
-				$totalVolume += $volume * $qty;   // This may be wrong if we mix different units
3647
+				$totalVolume += $volume * $qty; // This may be wrong if we mix different units
3648 3648
 			}
3649 3649
 		}
3650 3650
 
@@ -3661,17 +3661,17 @@  discard block
 block discarded – undo
3661 3661
 	{
3662 3662
 		$this->db->begin();
3663 3663
 
3664
-		$extraparams = (! empty($this->extraparams) ? json_encode($this->extraparams) : null);
3664
+		$extraparams = (!empty($this->extraparams) ? json_encode($this->extraparams) : null);
3665 3665
 
3666 3666
 		$sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
3667
-		$sql.= " SET extraparams = ".(! empty($extraparams) ? "'".$this->db->escape($extraparams)."'" : "null");
3668
-		$sql.= " WHERE rowid = ".$this->id;
3667
+		$sql .= " SET extraparams = ".(!empty($extraparams) ? "'".$this->db->escape($extraparams)."'" : "null");
3668
+		$sql .= " WHERE rowid = ".$this->id;
3669 3669
 
3670 3670
 		dol_syslog(get_class($this)."::setExtraParameters", LOG_DEBUG);
3671 3671
 		$resql = $this->db->query($sql);
3672
-		if (! $resql)
3672
+		if (!$resql)
3673 3673
 		{
3674
-			$this->error=$this->db->lasterror();
3674
+			$this->error = $this->db->lasterror();
3675 3675
 			$this->db->rollback();
3676 3676
 			return -1;
3677 3677
 		}
@@ -3706,7 +3706,7 @@  discard block
 block discarded – undo
3706 3706
 			}
3707 3707
 		}
3708 3708
 
3709
-		$out .= (($res->code && $this->location_incoterms)?' - ':'').$this->location_incoterms;
3709
+		$out .= (($res->code && $this->location_incoterms) ? ' - ' : '').$this->location_incoterms;
3710 3710
 
3711 3711
 		return $out;
3712 3712
 	}
@@ -3752,11 +3752,11 @@  discard block
 block discarded – undo
3752 3752
 		if ($this->id && $this->table_element)
3753 3753
 		{
3754 3754
 			$sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element;
3755
-			$sql.= " SET fk_incoterms = ".($id_incoterm > 0 ? $id_incoterm : "null");
3756
-			$sql.= ", location_incoterms = ".($id_incoterm > 0 ? "'".$this->db->escape($location)."'" : "null");
3757
-			$sql.= " WHERE rowid = " . $this->id;
3755
+			$sql .= " SET fk_incoterms = ".($id_incoterm > 0 ? $id_incoterm : "null");
3756
+			$sql .= ", location_incoterms = ".($id_incoterm > 0 ? "'".$this->db->escape($location)."'" : "null");
3757
+			$sql .= " WHERE rowid = ".$this->id;
3758 3758
 			dol_syslog(get_class($this).'::setIncoterms', LOG_DEBUG);
3759
-			$resql=$this->db->query($sql);
3759
+			$resql = $this->db->query($sql);
3760 3760
 			if ($resql)
3761 3761
 			{
3762 3762
 				$this->fk_incoterms = $id_incoterm;
@@ -3797,24 +3797,24 @@  discard block
 block discarded – undo
3797 3797
 	 */
3798 3798
 	function formAddObjectLine($dateSelector, $seller, $buyer)
3799 3799
 	{
3800
-		global $conf,$user,$langs,$object,$hookmanager;
3801
-		global $form,$bcnd,$var;
3800
+		global $conf, $user, $langs, $object, $hookmanager;
3801
+		global $form, $bcnd, $var;
3802 3802
 
3803 3803
 		// Line extrafield
3804 3804
 		require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
3805 3805
 		$extrafieldsline = new ExtraFields($this->db);
3806
-		$extralabelslines=$extrafieldsline->fetch_name_optionals_label($this->table_element_line);
3806
+		$extralabelslines = $extrafieldsline->fetch_name_optionals_label($this->table_element_line);
3807 3807
 
3808 3808
 		// Output template part (modules that overwrite templates must declare this into descriptor)
3809 3809
 		// Use global variables + $dateSelector + $seller and $buyer
3810
-		$dirtpls=array_merge($conf->modules_parts['tpl'],array('/core/tpl'));
3811
-		foreach($dirtpls as $reldir)
3810
+		$dirtpls = array_merge($conf->modules_parts['tpl'], array('/core/tpl'));
3811
+		foreach ($dirtpls as $reldir)
3812 3812
 		{
3813 3813
 			$tpl = dol_buildpath($reldir.'/objectline_create.tpl.php');
3814 3814
 			if (empty($conf->file->strict_mode)) {
3815
-				$res=@include $tpl;
3815
+				$res = @include $tpl;
3816 3816
 			} else {
3817
-				$res=include $tpl; // for debug
3817
+				$res = include $tpl; // for debug
3818 3818
 			}
3819 3819
 			if ($res) break;
3820 3820
 		}
@@ -3838,24 +3838,24 @@  discard block
 block discarded – undo
3838 3838
 	 *	@param  int	    	$dateSelector      	1=Show also date range input fields
3839 3839
 	 *	@return	void
3840 3840
 	 */
3841
-	function printObjectLines($action, $seller, $buyer, $selected=0, $dateSelector=0)
3841
+	function printObjectLines($action, $seller, $buyer, $selected = 0, $dateSelector = 0)
3842 3842
 	{
3843 3843
 		global $conf, $hookmanager, $langs, $user;
3844 3844
 		// TODO We should not use global var for this !
3845 3845
 		global $inputalsopricewithtax, $usemargins, $disableedit, $disablemove, $disableremove, $outputalsopricetotalwithtax;
3846 3846
 
3847 3847
 		// Define usemargins
3848
-		$usemargins=0;
3849
-		if (! empty($conf->margin->enabled) && ! empty($this->element) && in_array($this->element,array('facture','propal','commande'))) $usemargins=1;
3848
+		$usemargins = 0;
3849
+		if (!empty($conf->margin->enabled) && !empty($this->element) && in_array($this->element, array('facture', 'propal', 'commande'))) $usemargins = 1;
3850 3850
 
3851 3851
 		$num = count($this->lines);
3852 3852
 
3853 3853
 		// Line extrafield
3854 3854
 		require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
3855 3855
 		$extrafieldsline = new ExtraFields($this->db);
3856
-		$extralabelslines=$extrafieldsline->fetch_name_optionals_label($this->table_element_line);
3856
+		$extralabelslines = $extrafieldsline->fetch_name_optionals_label($this->table_element_line);
3857 3857
 
3858
-		$parameters = array('num'=>$num,'i'=>$i,'dateSelector'=>$dateSelector,'seller'=>$seller,'buyer'=>$buyer,'selected'=>$selected, 'extrafieldsline'=>$extrafieldsline);
3858
+		$parameters = array('num'=>$num, 'i'=>$i, 'dateSelector'=>$dateSelector, 'seller'=>$seller, 'buyer'=>$buyer, 'selected'=>$selected, 'extrafieldsline'=>$extrafieldsline);
3859 3859
 		$reshook = $hookmanager->executeHooks('printObjectLineTitle', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
3860 3860
 		if (empty($reshook))
3861 3861
 		{
@@ -3865,7 +3865,7 @@  discard block
 block discarded – undo
3865 3865
 			print '<tr class="liste_titre nodrag nodrop">';
3866 3866
 
3867 3867
 			// Adds a line numbering column
3868
-			if (! empty($conf->global->MAIN_VIEW_LINE_NUMBER)) print '<td class="linecolnum" align="center" width="5">&nbsp;</td>';
3868
+			if (!empty($conf->global->MAIN_VIEW_LINE_NUMBER)) print '<td class="linecolnum" align="center" width="5">&nbsp;</td>';
3869 3869
 
3870 3870
 			// Description
3871 3871
 			print '<td class="linecoldescription">'.$langs->trans('Description').'</td>';
@@ -3889,7 +3889,7 @@  discard block
 block discarded – undo
3889 3889
 			// Qty
3890 3890
 			print '<td class="linecolqty" align="right">'.$langs->trans('Qty').'</td>';
3891 3891
 
3892
-			if($conf->global->PRODUCT_USE_UNITS)
3892
+			if ($conf->global->PRODUCT_USE_UNITS)
3893 3893
 			{
3894 3894
 				print '<td class="linecoluseunit" align="left">'.$langs->trans('Unit').'</td>';
3895 3895
 			}
@@ -3898,10 +3898,10 @@  discard block
 block discarded – undo
3898 3898
 			print '<td class="linecoldiscount" align="right">'.$langs->trans('ReductionShort').'</td>';
3899 3899
 
3900 3900
 			if ($this->situation_cycle_ref) {
3901
-				print '<td class="linecolcycleref" align="right">' . $langs->trans('Progress') . '</td>';
3901
+				print '<td class="linecolcycleref" align="right">'.$langs->trans('Progress').'</td>';
3902 3902
 			}
3903 3903
 
3904
-			if ($usemargins && ! empty($conf->margin->enabled) && empty($user->societe_id))
3904
+			if ($usemargins && !empty($conf->margin->enabled) && empty($user->societe_id))
3905 3905
 			{
3906 3906
 				if (!empty($user->rights->margins->creer))
3907 3907
 				{
@@ -3911,9 +3911,9 @@  discard block
 block discarded – undo
3911 3911
 						print '<td class="linecolmargin1 margininfos" align="right" width="80">'.$langs->trans('CostPrice').'</td>';
3912 3912
 				}
3913 3913
 
3914
-				if (! empty($conf->global->DISPLAY_MARGIN_RATES) && $user->rights->margins->liretous)
3914
+				if (!empty($conf->global->DISPLAY_MARGIN_RATES) && $user->rights->margins->liretous)
3915 3915
 					print '<td class="linecolmargin2 margininfos" align="right" width="50">'.$langs->trans('MarginRate').'</td>';
3916
-				if (! empty($conf->global->DISPLAY_MARK_RATES) && $user->rights->margins->liretous)
3916
+				if (!empty($conf->global->DISPLAY_MARK_RATES) && $user->rights->margins->liretous)
3917 3917
 					print '<td class="linecolmargin2 margininfos" align="right" width="50">'.$langs->trans('MarkRate').'</td>';
3918 3918
 			}
3919 3919
 
@@ -3925,13 +3925,13 @@  discard block
 block discarded – undo
3925 3925
 
3926 3926
 			if ($outputalsopricetotalwithtax) print '<td align="right" width="80">'.$langs->trans('TotalTTCShort').'</td>';
3927 3927
 
3928
-			print '<td class="linecoledit"></td>';  // No width to allow autodim
3928
+			print '<td class="linecoledit"></td>'; // No width to allow autodim
3929 3929
 
3930 3930
 			print '<td class="linecoldelete" width="10"></td>';
3931 3931
 
3932 3932
 			print '<td class="linecolmove" width="10"></td>';
3933 3933
 
3934
-			if($action == 'selectlines')
3934
+			if ($action == 'selectlines')
3935 3935
 			{
3936 3936
 			    print '<td class="linecolcheckall" align="center">';
3937 3937
 			    print '<input type="checkbox" class="linecheckboxtoggle" />';
@@ -3944,7 +3944,7 @@  discard block
 block discarded – undo
3944 3944
 		}
3945 3945
 
3946 3946
 		$var = true;
3947
-		$i	 = 0;
3947
+		$i = 0;
3948 3948
 
3949 3949
 		print "<tbody>\n";
3950 3950
 		foreach ($this->lines as $line)
@@ -3957,18 +3957,18 @@  discard block
 block discarded – undo
3957 3957
 			{
3958 3958
 				if (empty($line->fk_parent_line))
3959 3959
 				{
3960
-					$parameters = array('line'=>$line,'var'=>$var,'num'=>$num,'i'=>$i,'dateSelector'=>$dateSelector,'seller'=>$seller,'buyer'=>$buyer,'selected'=>$selected, 'extrafieldsline'=>$extrafieldsline);
3961
-					$reshook = $hookmanager->executeHooks('printObjectLine', $parameters, $this, $action);    // Note that $action and $object may have been modified by some hooks
3960
+					$parameters = array('line'=>$line, 'var'=>$var, 'num'=>$num, 'i'=>$i, 'dateSelector'=>$dateSelector, 'seller'=>$seller, 'buyer'=>$buyer, 'selected'=>$selected, 'extrafieldsline'=>$extrafieldsline);
3961
+					$reshook = $hookmanager->executeHooks('printObjectLine', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
3962 3962
 				}
3963 3963
 				else
3964 3964
 				{
3965
-					$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);
3966
-					$reshook = $hookmanager->executeHooks('printObjectSubLine', $parameters, $this, $action);    // Note that $action and $object may have been modified by some hooks
3965
+					$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);
3966
+					$reshook = $hookmanager->executeHooks('printObjectSubLine', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
3967 3967
 				}
3968 3968
 			}
3969 3969
 			if (empty($reshook))
3970 3970
 			{
3971
-				$this->printObjectLine($action,$line,$var,$num,$i,$dateSelector,$seller,$buyer,$selected,$extrafieldsline);
3971
+				$this->printObjectLine($action, $line, $var, $num, $i, $dateSelector, $seller, $buyer, $selected, $extrafieldsline);
3972 3972
 			}
3973 3973
 
3974 3974
 			$i++;
@@ -3992,23 +3992,23 @@  discard block
 block discarded – undo
3992 3992
 	 *  @param  int			$extrafieldsline	Object of extrafield line attribute
3993 3993
 	 *	@return	void
3994 3994
 	 */
3995
-	function printObjectLine($action,$line,$var,$num,$i,$dateSelector,$seller,$buyer,$selected=0,$extrafieldsline=0)
3995
+	function printObjectLine($action, $line, $var, $num, $i, $dateSelector, $seller, $buyer, $selected = 0, $extrafieldsline = 0)
3996 3996
 	{
3997
-		global $conf,$langs,$user,$object,$hookmanager;
3998
-		global $form,$bc,$bcdd;
3999
-		global $object_rights, $disableedit, $disablemove, $disableremove;   // TODO We should not use global var for this !
3997
+		global $conf, $langs, $user, $object, $hookmanager;
3998
+		global $form, $bc, $bcdd;
3999
+		global $object_rights, $disableedit, $disablemove, $disableremove; // TODO We should not use global var for this !
4000 4000
 
4001 4001
 		$object_rights = $this->getRights();
4002 4002
 
4003
-		$element=$this->element;
4003
+		$element = $this->element;
4004 4004
 
4005
-		$text=''; $description=''; $type=0;
4005
+		$text = ''; $description = ''; $type = 0;
4006 4006
 
4007 4007
 		// Show product and description
4008
-		$type=(! empty($line->product_type)?$line->product_type:$line->fk_product_type);
4008
+		$type = (!empty($line->product_type) ? $line->product_type : $line->fk_product_type);
4009 4009
 		// Try to enhance type detection using date_start and date_end for free lines where type was not saved.
4010
-		if (! empty($line->date_start)) $type=1; // deprecated
4011
-		if (! empty($line->date_end)) $type=1; // deprecated
4010
+		if (!empty($line->date_start)) $type = 1; // deprecated
4011
+		if (!empty($line->date_end)) $type = 1; // deprecated
4012 4012
 
4013 4013
 		// Ligne en mode visu
4014 4014
 		if ($action != 'editline' || $selected != $line->id)
@@ -4021,14 +4021,14 @@  discard block
 block discarded – undo
4021 4021
 
4022 4022
 				$product_static->ref = $line->ref; //can change ref in hook
4023 4023
 				$product_static->label = $line->label; //can change label in hook
4024
-				$text=$product_static->getNomUrl(1);
4024
+				$text = $product_static->getNomUrl(1);
4025 4025
 
4026 4026
 				// Define output language and label
4027
-				if (! empty($conf->global->MAIN_MULTILANGS))
4027
+				if (!empty($conf->global->MAIN_MULTILANGS))
4028 4028
 				{
4029
-					if (! is_object($this->thirdparty))
4029
+					if (!is_object($this->thirdparty))
4030 4030
 					{
4031
-						dol_print_error('','Error: Method printObjectLine was called on an object and object->fetch_thirdparty was not done before');
4031
+						dol_print_error('', 'Error: Method printObjectLine was called on an object and object->fetch_thirdparty was not done before');
4032 4032
 						return;
4033 4033
 					}
4034 4034
 
@@ -4036,38 +4036,38 @@  discard block
 block discarded – undo
4036 4036
 					$prod->fetch($line->fk_product);
4037 4037
 
4038 4038
 					$outputlangs = $langs;
4039
-					$newlang='';
4040
-					if (empty($newlang) && GETPOST('lang_id','aZ09')) $newlang=GETPOST('lang_id','aZ09');
4041
-					if (! empty($conf->global->PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE) && empty($newlang)) $newlang=$this->thirdparty->default_lang;		// For language to language of customer
4042
-					if (! empty($newlang))
4039
+					$newlang = '';
4040
+					if (empty($newlang) && GETPOST('lang_id', 'aZ09')) $newlang = GETPOST('lang_id', 'aZ09');
4041
+					if (!empty($conf->global->PRODUIT_TEXTS_IN_THIRDPARTY_LANGUAGE) && empty($newlang)) $newlang = $this->thirdparty->default_lang; // For language to language of customer
4042
+					if (!empty($newlang))
4043 4043
 					{
4044
-						$outputlangs = new Translate("",$conf);
4044
+						$outputlangs = new Translate("", $conf);
4045 4045
 						$outputlangs->setDefaultLang($newlang);
4046 4046
 					}
4047 4047
 
4048
-					$label = (! empty($prod->multilangs[$outputlangs->defaultlang]["label"])) ? $prod->multilangs[$outputlangs->defaultlang]["label"] : $line->product_label;
4048
+					$label = (!empty($prod->multilangs[$outputlangs->defaultlang]["label"])) ? $prod->multilangs[$outputlangs->defaultlang]["label"] : $line->product_label;
4049 4049
 				}
4050 4050
 				else
4051 4051
 				{
4052 4052
 					$label = $line->product_label;
4053 4053
 				}
4054 4054
 
4055
-				$text.= ' - '.(! empty($line->label)?$line->label:$label);
4056
-				$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.
4055
+				$text .= ' - '.(!empty($line->label) ? $line->label : $label);
4056
+				$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.
4057 4057
 			}
4058 4058
 
4059
-			$line->pu_ttc = price2num($line->subprice * (1 + ($line->tva_tx/100)), 'MU');
4059
+			$line->pu_ttc = price2num($line->subprice * (1 + ($line->tva_tx / 100)), 'MU');
4060 4060
 
4061 4061
 			// Output template part (modules that overwrite templates must declare this into descriptor)
4062 4062
 			// Use global variables + $dateSelector + $seller and $buyer
4063
-			$dirtpls=array_merge($conf->modules_parts['tpl'],array('/core/tpl'));
4064
-			foreach($dirtpls as $reldir)
4063
+			$dirtpls = array_merge($conf->modules_parts['tpl'], array('/core/tpl'));
4064
+			foreach ($dirtpls as $reldir)
4065 4065
 			{
4066 4066
 				$tpl = dol_buildpath($reldir.'/objectline_view.tpl.php');
4067 4067
 				if (empty($conf->file->strict_mode)) {
4068
-					$res=@include $tpl;
4068
+					$res = @include $tpl;
4069 4069
 				} else {
4070
-					$res=include $tpl; // for debug
4070
+					$res = include $tpl; // for debug
4071 4071
 				}
4072 4072
 				if ($res) break;
4073 4073
 			}
@@ -4076,21 +4076,21 @@  discard block
 block discarded – undo
4076 4076
 		// Ligne en mode update
4077 4077
 		if ($this->statut == 0 && $action == 'editline' && $selected == $line->id)
4078 4078
 		{
4079
-			$label = (! empty($line->label) ? $line->label : (($line->fk_product > 0) ? $line->product_label : ''));
4080
-			$placeholder=' placeholder="'.$langs->trans("Label").'"';
4079
+			$label = (!empty($line->label) ? $line->label : (($line->fk_product > 0) ? $line->product_label : ''));
4080
+			$placeholder = ' placeholder="'.$langs->trans("Label").'"';
4081 4081
 
4082
-			$line->pu_ttc = price2num($line->subprice * (1 + ($line->tva_tx/100)), 'MU');
4082
+			$line->pu_ttc = price2num($line->subprice * (1 + ($line->tva_tx / 100)), 'MU');
4083 4083
 
4084 4084
 			// Output template part (modules that overwrite templates must declare this into descriptor)
4085 4085
 			// Use global variables + $dateSelector + $seller and $buyer
4086
-			$dirtpls=array_merge($conf->modules_parts['tpl'],array('/core/tpl'));
4087
-			foreach($dirtpls as $reldir)
4086
+			$dirtpls = array_merge($conf->modules_parts['tpl'], array('/core/tpl'));
4087
+			foreach ($dirtpls as $reldir)
4088 4088
 			{
4089 4089
 				$tpl = dol_buildpath($reldir.'/objectline_edit.tpl.php');
4090 4090
 				if (empty($conf->file->strict_mode)) {
4091
-					$res=@include $tpl;
4091
+					$res = @include $tpl;
4092 4092
 				} else {
4093
-					$res=include $tpl; // for debug
4093
+					$res = include $tpl; // for debug
4094 4094
 				}
4095 4095
 				if ($res) break;
4096 4096
 			}
@@ -4110,7 +4110,7 @@  discard block
 block discarded – undo
4110 4110
 	 *	@param	string		$restrictlist		''=All lines, 'services'=Restrict to services only
4111 4111
 	 *  @return	void
4112 4112
 	 */
4113
-	function printOriginLinesList($restrictlist='')
4113
+	function printOriginLinesList($restrictlist = '')
4114 4114
 	{
4115 4115
 		global $langs, $hookmanager, $conf;
4116 4116
 
@@ -4121,26 +4121,26 @@  discard block
 block discarded – undo
4121 4121
 		print '<td align="right">'.$langs->trans('PriceUHT').'</td>';
4122 4122
 		if (!empty($conf->multicurrency->enabled)) print '<td align="right">'.$langs->trans('PriceUHTCurrency').'</td>';
4123 4123
 		print '<td align="right">'.$langs->trans('Qty').'</td>';
4124
-		if($conf->global->PRODUCT_USE_UNITS)
4124
+		if ($conf->global->PRODUCT_USE_UNITS)
4125 4125
 		{
4126 4126
 			print '<td align="left">'.$langs->trans('Unit').'</td>';
4127 4127
 		}
4128 4128
 		print '<td align="right">'.$langs->trans('ReductionShort').'</td></tr>';
4129 4129
 
4130 4130
 		$var = true;
4131
-		$i	 = 0;
4131
+		$i = 0;
4132 4132
 
4133
-		if (! empty($this->lines))
4133
+		if (!empty($this->lines))
4134 4134
 		{
4135 4135
 			foreach ($this->lines as $line)
4136 4136
 			{
4137
-				if (is_object($hookmanager) && (($line->product_type == 9 && ! empty($line->special_code)) || ! empty($line->fk_parent_line)))
4137
+				if (is_object($hookmanager) && (($line->product_type == 9 && !empty($line->special_code)) || !empty($line->fk_parent_line)))
4138 4138
 				{
4139 4139
 					if (empty($line->fk_parent_line))
4140 4140
 					{
4141
-						$parameters=array('line'=>$line,'var'=>$var,'i'=>$i);
4142
-						$action='';
4143
-						$hookmanager->executeHooks('printOriginObjectLine',$parameters,$this,$action);    // Note that $action and $object may have been modified by some hooks
4141
+						$parameters = array('line'=>$line, 'var'=>$var, 'i'=>$i);
4142
+						$action = '';
4143
+						$hookmanager->executeHooks('printOriginObjectLine', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks
4144 4144
 					}
4145 4145
 				}
4146 4146
 				else
@@ -4164,103 +4164,103 @@  discard block
 block discarded – undo
4164 4164
 	 *	@param	string				$restrictlist		''=All lines, 'services'=Restrict to services only (strike line if not)
4165 4165
 	 * 	@return	void
4166 4166
 	 */
4167
-	function printOriginLine($line, $var, $restrictlist='')
4167
+	function printOriginLine($line, $var, $restrictlist = '')
4168 4168
 	{
4169 4169
 		global $langs, $conf;
4170 4170
 
4171 4171
 		//var_dump($line);
4172 4172
 		if (!empty($line->date_start))
4173 4173
 		{
4174
-			$date_start=$line->date_start;
4174
+			$date_start = $line->date_start;
4175 4175
 		}
4176 4176
 		else
4177 4177
 		{
4178
-			$date_start=$line->date_debut_prevue;
4179
-			if ($line->date_debut_reel) $date_start=$line->date_debut_reel;
4178
+			$date_start = $line->date_debut_prevue;
4179
+			if ($line->date_debut_reel) $date_start = $line->date_debut_reel;
4180 4180
 		}
4181 4181
 		if (!empty($line->date_end))
4182 4182
 		{
4183
-			$date_end=$line->date_end;
4183
+			$date_end = $line->date_end;
4184 4184
 		}
4185 4185
 		else
4186 4186
 		{
4187
-			$date_end=$line->date_fin_prevue;
4188
-			if ($line->date_fin_reel) $date_end=$line->date_fin_reel;
4187
+			$date_end = $line->date_fin_prevue;
4188
+			if ($line->date_fin_reel) $date_end = $line->date_fin_reel;
4189 4189
 		}
4190 4190
 
4191 4191
 		$this->tpl['label'] = '';
4192
-		if (! empty($line->fk_parent_line)) $this->tpl['label'].= img_picto('', 'rightarrow');
4192
+		if (!empty($line->fk_parent_line)) $this->tpl['label'] .= img_picto('', 'rightarrow');
4193 4193
 
4194 4194
 		if (($line->info_bits & 2) == 2)  // TODO Not sure this is used for source object
4195 4195
 		{
4196
-			$discount=new DiscountAbsolute($this->db);
4196
+			$discount = new DiscountAbsolute($this->db);
4197 4197
 			$discount->fk_soc = $this->socid;
4198
-			$this->tpl['label'].= $discount->getNomUrl(0,'discount');
4198
+			$this->tpl['label'] .= $discount->getNomUrl(0, 'discount');
4199 4199
 		}
4200
-		else if (! empty($line->fk_product))
4200
+		else if (!empty($line->fk_product))
4201 4201
 		{
4202 4202
 			$productstatic = new Product($this->db);
4203 4203
 			$productstatic->id = $line->fk_product;
4204 4204
 			$productstatic->ref = $line->ref;
4205 4205
 			$productstatic->type = $line->fk_product_type;
4206
-            if(empty($productstatic->ref)){
4206
+            if (empty($productstatic->ref)) {
4207 4207
 				$line->fetch_product();
4208 4208
 				$productstatic = $line->product;
4209 4209
 			}
4210 4210
 			
4211
-			$this->tpl['label'].= $productstatic->getNomUrl(1);
4212
-			$this->tpl['label'].= ' - '.(! empty($line->label)?$line->label:$line->product_label);
4211
+			$this->tpl['label'] .= $productstatic->getNomUrl(1);
4212
+			$this->tpl['label'] .= ' - '.(!empty($line->label) ? $line->label : $line->product_label);
4213 4213
 			// Dates
4214 4214
 			if ($line->product_type == 1 && ($date_start || $date_end))
4215 4215
 			{
4216
-				$this->tpl['label'].= get_date_range($date_start,$date_end);
4216
+				$this->tpl['label'] .= get_date_range($date_start, $date_end);
4217 4217
 			}
4218 4218
 		}
4219 4219
 		else
4220 4220
 		{
4221
-			$this->tpl['label'].= ($line->product_type == -1 ? '&nbsp;' : ($line->product_type == 1 ? img_object($langs->trans(''),'service') : img_object($langs->trans(''),'product')));
4221
+			$this->tpl['label'] .= ($line->product_type == -1 ? '&nbsp;' : ($line->product_type == 1 ? img_object($langs->trans(''), 'service') : img_object($langs->trans(''), 'product')));
4222 4222
 			if (!empty($line->desc)) {
4223
-				$this->tpl['label'].=$line->desc;
4224
-			}else {
4225
-				$this->tpl['label'].= ($line->label ? '&nbsp;'.$line->label : '');
4223
+				$this->tpl['label'] .= $line->desc;
4224
+			} else {
4225
+				$this->tpl['label'] .= ($line->label ? '&nbsp;'.$line->label : '');
4226 4226
 			}
4227 4227
 			
4228 4228
 			// Dates
4229 4229
 			if ($line->product_type == 1 && ($date_start || $date_end))
4230 4230
 			{
4231
-				$this->tpl['label'].= get_date_range($date_start,$date_end);
4231
+				$this->tpl['label'] .= get_date_range($date_start, $date_end);
4232 4232
 			}
4233 4233
 		}
4234 4234
 
4235
-		if (! empty($line->desc))
4235
+		if (!empty($line->desc))
4236 4236
 		{
4237 4237
 			if ($line->desc == '(CREDIT_NOTE)')  // TODO Not sure this is used for source object
4238 4238
 			{
4239
-				$discount=new DiscountAbsolute($this->db);
4239
+				$discount = new DiscountAbsolute($this->db);
4240 4240
 				$discount->fetch($line->fk_remise_except);
4241
-				$this->tpl['description'] = $langs->transnoentities("DiscountFromCreditNote",$discount->getNomUrl(0));
4241
+				$this->tpl['description'] = $langs->transnoentities("DiscountFromCreditNote", $discount->getNomUrl(0));
4242 4242
 			}
4243 4243
 			elseif ($line->desc == '(DEPOSIT)')  // TODO Not sure this is used for source object
4244 4244
 			{
4245
-				$discount=new DiscountAbsolute($this->db);
4245
+				$discount = new DiscountAbsolute($this->db);
4246 4246
 				$discount->fetch($line->fk_remise_except);
4247
-				$this->tpl['description'] = $langs->transnoentities("DiscountFromDeposit",$discount->getNomUrl(0));
4247
+				$this->tpl['description'] = $langs->transnoentities("DiscountFromDeposit", $discount->getNomUrl(0));
4248 4248
 			}
4249 4249
 			elseif ($line->desc == '(EXCESS RECEIVED)')
4250 4250
 			{
4251
-				$discount=new DiscountAbsolute($this->db);
4251
+				$discount = new DiscountAbsolute($this->db);
4252 4252
 				$discount->fetch($line->fk_remise_except);
4253
-				$this->tpl['description'] = $langs->transnoentities("DiscountFromExcessReceived",$discount->getNomUrl(0));
4253
+				$this->tpl['description'] = $langs->transnoentities("DiscountFromExcessReceived", $discount->getNomUrl(0));
4254 4254
 			}
4255 4255
 			elseif ($line->desc == '(EXCESS PAID)')
4256 4256
 			{
4257
-				$discount=new DiscountAbsolute($this->db);
4257
+				$discount = new DiscountAbsolute($this->db);
4258 4258
 				$discount->fetch($line->fk_remise_except);
4259
-				$this->tpl['description'] = $langs->transnoentities("DiscountFromExcessPaid",$discount->getNomUrl(0));
4259
+				$this->tpl['description'] = $langs->transnoentities("DiscountFromExcessPaid", $discount->getNomUrl(0));
4260 4260
 			}
4261 4261
 			else
4262 4262
 			{
4263
-				$this->tpl['description'] = dol_trunc($line->desc,60);
4263
+				$this->tpl['description'] = dol_trunc($line->desc, 60);
4264 4264
 			}
4265 4265
 		}
4266 4266
 		else
@@ -4271,7 +4271,7 @@  discard block
 block discarded – undo
4271 4271
         // VAT Rate
4272 4272
         $this->tpl['vat_rate'] = vatrate($line->tva_tx, true);
4273 4273
         $this->tpl['vat_rate'] .= (($line->info_bits & 1) == 1) ? '*' : '';
4274
-        if (! empty($line->vat_src_code) && ! preg_match('/\(/', $this->tpl['vat_rate'])) $this->tpl['vat_rate'].=' ('.$line->vat_src_code.')';
4274
+        if (!empty($line->vat_src_code) && !preg_match('/\(/', $this->tpl['vat_rate'])) $this->tpl['vat_rate'] .= ' ('.$line->vat_src_code.')';
4275 4275
 
4276 4276
 		$this->tpl['price'] = price($line->subprice);
4277 4277
 		$this->tpl['multicurrency_price'] = price($line->multicurrency_subprice);
@@ -4280,19 +4280,19 @@  discard block
 block discarded – undo
4280 4280
 		$this->tpl['remise_percent'] = (($line->info_bits & 2) != 2) ? vatrate($line->remise_percent, true) : '&nbsp;';
4281 4281
 
4282 4282
 		// Is the line strike or not
4283
-		$this->tpl['strike']=0;
4284
-		if ($restrictlist == 'services' && $line->product_type != Product::TYPE_SERVICE) $this->tpl['strike']=1;
4283
+		$this->tpl['strike'] = 0;
4284
+		if ($restrictlist == 'services' && $line->product_type != Product::TYPE_SERVICE) $this->tpl['strike'] = 1;
4285 4285
 
4286 4286
 		// Output template part (modules that overwrite templates must declare this into descriptor)
4287 4287
 		// Use global variables + $dateSelector + $seller and $buyer
4288
-		$dirtpls=array_merge($conf->modules_parts['tpl'],array('/core/tpl'));
4289
-		foreach($dirtpls as $reldir)
4288
+		$dirtpls = array_merge($conf->modules_parts['tpl'], array('/core/tpl'));
4289
+		foreach ($dirtpls as $reldir)
4290 4290
 		{
4291 4291
 			$tpl = dol_buildpath($reldir.'/originproductline.tpl.php');
4292 4292
 			if (empty($conf->file->strict_mode)) {
4293
-				$res=@include $tpl;
4293
+				$res = @include $tpl;
4294 4294
 			} else {
4295
-				$res=include $tpl; // for debug
4295
+				$res = include $tpl; // for debug
4296 4296
 			}
4297 4297
 			if ($res) break;
4298 4298
 		}
@@ -4310,26 +4310,26 @@  discard block
 block discarded – undo
4310 4310
 	 *	@param		int		$mandatory			Mandatory or not
4311 4311
 	 *	@return		int							<=0 if KO, >0 if OK
4312 4312
 	 */
4313
-	function add_element_resource($resource_id, $resource_type, $busy=0, $mandatory=0)
4313
+	function add_element_resource($resource_id, $resource_type, $busy = 0, $mandatory = 0)
4314 4314
 	{
4315 4315
         // phpcs:enable
4316 4316
 		$this->db->begin();
4317 4317
 
4318 4318
 		$sql = "INSERT INTO ".MAIN_DB_PREFIX."element_resources (";
4319
-		$sql.= "resource_id";
4320
-		$sql.= ", resource_type";
4321
-		$sql.= ", element_id";
4322
-		$sql.= ", element_type";
4323
-		$sql.= ", busy";
4324
-		$sql.= ", mandatory";
4325
-		$sql.= ") VALUES (";
4326
-		$sql.= $resource_id;
4327
-		$sql.= ", '".$this->db->escape($resource_type)."'";
4328
-		$sql.= ", '".$this->db->escape($this->id)."'";
4329
-		$sql.= ", '".$this->db->escape($this->element)."'";
4330
-		$sql.= ", '".$this->db->escape($busy)."'";
4331
-		$sql.= ", '".$this->db->escape($mandatory)."'";
4332
-		$sql.= ")";
4319
+		$sql .= "resource_id";
4320
+		$sql .= ", resource_type";
4321
+		$sql .= ", element_id";
4322
+		$sql .= ", element_type";
4323
+		$sql .= ", busy";
4324
+		$sql .= ", mandatory";
4325
+		$sql .= ") VALUES (";
4326
+		$sql .= $resource_id;
4327
+		$sql .= ", '".$this->db->escape($resource_type)."'";
4328
+		$sql .= ", '".$this->db->escape($this->id)."'";
4329
+		$sql .= ", '".$this->db->escape($this->element)."'";
4330
+		$sql .= ", '".$this->db->escape($busy)."'";
4331
+		$sql .= ", '".$this->db->escape($mandatory)."'";
4332
+		$sql .= ")";
4333 4333
 
4334 4334
 		dol_syslog(get_class($this)."::add_element_resource", LOG_DEBUG);
4335 4335
 		if ($this->db->query($sql))
@@ -4339,7 +4339,7 @@  discard block
 block discarded – undo
4339 4339
 		}
4340 4340
 		else
4341 4341
 		{
4342
-			$this->error=$this->db->lasterror();
4342
+			$this->error = $this->db->lasterror();
4343 4343
 			$this->db->rollback();
4344 4344
 			return  0;
4345 4345
 		}
@@ -4354,7 +4354,7 @@  discard block
 block discarded – undo
4354 4354
 	 *    @param	int		$notrigger		Disable all triggers
4355 4355
 	 *    @return   int						>0 if OK, <0 if KO
4356 4356
 	 */
4357
-	function delete_resource($rowid, $element, $notrigger=0)
4357
+	function delete_resource($rowid, $element, $notrigger = 0)
4358 4358
 	{
4359 4359
         // phpcs:enable
4360 4360
 		global $user;
@@ -4362,22 +4362,22 @@  discard block
 block discarded – undo
4362 4362
 		$this->db->begin();
4363 4363
 
4364 4364
 		$sql = "DELETE FROM ".MAIN_DB_PREFIX."element_resources";
4365
-		$sql.= " WHERE rowid=".$rowid;
4365
+		$sql .= " WHERE rowid=".$rowid;
4366 4366
 
4367 4367
 		dol_syslog(get_class($this)."::delete_resource", LOG_DEBUG);
4368 4368
 
4369
-		$resql=$this->db->query($sql);
4370
-		if (! $resql)
4369
+		$resql = $this->db->query($sql);
4370
+		if (!$resql)
4371 4371
 		{
4372
-			$this->error=$this->db->lasterror();
4372
+			$this->error = $this->db->lasterror();
4373 4373
 			$this->db->rollback();
4374 4374
 			return -1;
4375 4375
 		}
4376 4376
 		else
4377 4377
 		{
4378
-			if (! $notrigger)
4378
+			if (!$notrigger)
4379 4379
 			{
4380
-				$result=$this->call_trigger(strtoupper($element).'_DELETE_RESOURCE', $user);
4380
+				$result = $this->call_trigger(strtoupper($element).'_DELETE_RESOURCE', $user);
4381 4381
 				if ($result < 0) { $this->db->rollback(); return -1; }
4382 4382
 			}
4383 4383
 			$this->db->commit();
@@ -4396,8 +4396,8 @@  discard block
 block discarded – undo
4396 4396
 		// Force a copy of this->lines, otherwise it will point to same object.
4397 4397
 		if (isset($this->lines) && is_array($this->lines))
4398 4398
 		{
4399
-			$nboflines=count($this->lines);
4400
-			for($i=0; $i < $nboflines; $i++)
4399
+			$nboflines = count($this->lines);
4400
+			for ($i = 0; $i < $nboflines; $i++)
4401 4401
 			{
4402 4402
 				$this->lines[$i] = clone $this->lines[$i];
4403 4403
 			}
@@ -4417,43 +4417,43 @@  discard block
 block discarded – undo
4417 4417
 	 * @return 	int 						>0 if OK, <0 if KO
4418 4418
 	 * @see	addFileIntoDatabaseIndex
4419 4419
 	 */
4420
-	protected function commonGenerateDocument($modelspath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams=null)
4420
+	protected function commonGenerateDocument($modelspath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams = null)
4421 4421
 	{
4422 4422
 		global $conf, $langs, $user;
4423 4423
 
4424
-		$srctemplatepath='';
4424
+		$srctemplatepath = '';
4425 4425
 
4426 4426
 		// Increase limit for PDF build
4427
-		$err=error_reporting();
4427
+		$err = error_reporting();
4428 4428
 		error_reporting(0);
4429 4429
 		@set_time_limit(120);
4430 4430
 		error_reporting($err);
4431 4431
 
4432 4432
 		// If selected model is a filename template (then $modele="modelname" or "modelname:filename")
4433
-		$tmp=explode(':',$modele,2);
4434
-		if (! empty($tmp[1]))
4433
+		$tmp = explode(':', $modele, 2);
4434
+		if (!empty($tmp[1]))
4435 4435
 		{
4436
-			$modele=$tmp[0];
4437
-			$srctemplatepath=$tmp[1];
4436
+			$modele = $tmp[0];
4437
+			$srctemplatepath = $tmp[1];
4438 4438
 		}
4439 4439
 
4440 4440
 		// Search template files
4441
-		$file=''; $classname=''; $filefound=0;
4442
-		$dirmodels=array('/');
4443
-		if (is_array($conf->modules_parts['models'])) $dirmodels=array_merge($dirmodels,$conf->modules_parts['models']);
4444
-		foreach($dirmodels as $reldir)
4441
+		$file = ''; $classname = ''; $filefound = 0;
4442
+		$dirmodels = array('/');
4443
+		if (is_array($conf->modules_parts['models'])) $dirmodels = array_merge($dirmodels, $conf->modules_parts['models']);
4444
+		foreach ($dirmodels as $reldir)
4445 4445
 		{
4446
-			foreach(array('doc','pdf') as $prefix)
4446
+			foreach (array('doc', 'pdf') as $prefix)
4447 4447
 			{
4448
-				if (in_array(get_class($this), array('Adherent'))) $file = $prefix."_".$modele.".class.php";     // Member module use prefix_module.class.php
4448
+				if (in_array(get_class($this), array('Adherent'))) $file = $prefix."_".$modele.".class.php"; // Member module use prefix_module.class.php
4449 4449
 				else $file = $prefix."_".$modele.".modules.php";
4450 4450
 
4451 4451
 				// On verifie l'emplacement du modele
4452
-				$file=dol_buildpath($reldir.$modelspath.$file,0);
4452
+				$file = dol_buildpath($reldir.$modelspath.$file, 0);
4453 4453
 				if (file_exists($file))
4454 4454
 				{
4455
-					$filefound=1;
4456
-					$classname=$prefix.'_'.$modele;
4455
+					$filefound = 1;
4456
+					$classname = $prefix.'_'.$modele;
4457 4457
 					break;
4458 4458
 				}
4459 4459
 			}
@@ -4463,7 +4463,7 @@  discard block
 block discarded – undo
4463 4463
 		// If generator was found
4464 4464
 		if ($filefound)
4465 4465
 		{
4466
-			global $db;  // Required to solve a conception default in commonstickergenerator.class.php making an include of code using $db
4466
+			global $db; // Required to solve a conception default in commonstickergenerator.class.php making an include of code using $db
4467 4467
 
4468 4468
 			require_once $file;
4469 4469
 
@@ -4472,32 +4472,32 @@  discard block
 block discarded – undo
4472 4472
 			// If generator is ODT, we must have srctemplatepath defined, if not we set it.
4473 4473
 			if ($obj->type == 'odt' && empty($srctemplatepath))
4474 4474
 			{
4475
-				$varfortemplatedir=$obj->scandir;
4476
-				if ($varfortemplatedir && ! empty($conf->global->$varfortemplatedir))
4475
+				$varfortemplatedir = $obj->scandir;
4476
+				if ($varfortemplatedir && !empty($conf->global->$varfortemplatedir))
4477 4477
 				{
4478
-					$dirtoscan=$conf->global->$varfortemplatedir;
4478
+					$dirtoscan = $conf->global->$varfortemplatedir;
4479 4479
 
4480
-					$listoffiles=array();
4480
+					$listoffiles = array();
4481 4481
 
4482 4482
 					// Now we add first model found in directories scanned
4483
-					$listofdir=explode(',',$dirtoscan);
4484
-					foreach($listofdir as $key => $tmpdir)
4483
+					$listofdir = explode(',', $dirtoscan);
4484
+					foreach ($listofdir as $key => $tmpdir)
4485 4485
 					{
4486
-						$tmpdir=trim($tmpdir);
4487
-						$tmpdir=preg_replace('/DOL_DATA_ROOT/',DOL_DATA_ROOT,$tmpdir);
4488
-						if (! $tmpdir) { unset($listofdir[$key]); continue; }
4486
+						$tmpdir = trim($tmpdir);
4487
+						$tmpdir = preg_replace('/DOL_DATA_ROOT/', DOL_DATA_ROOT, $tmpdir);
4488
+						if (!$tmpdir) { unset($listofdir[$key]); continue; }
4489 4489
 						if (is_dir($tmpdir))
4490 4490
 						{
4491
-							$tmpfiles=dol_dir_list($tmpdir,'files',0,'\.od(s|t)$','','name',SORT_ASC,0);
4492
-							if (count($tmpfiles)) $listoffiles=array_merge($listoffiles,$tmpfiles);
4491
+							$tmpfiles = dol_dir_list($tmpdir, 'files', 0, '\.od(s|t)$', '', 'name', SORT_ASC, 0);
4492
+							if (count($tmpfiles)) $listoffiles = array_merge($listoffiles, $tmpfiles);
4493 4493
 						}
4494 4494
 					}
4495 4495
 
4496 4496
 					if (count($listoffiles))
4497 4497
 					{
4498
-						foreach($listoffiles as $record)
4498
+						foreach ($listoffiles as $record)
4499 4499
 						{
4500
-							$srctemplatepath=$record['fullname'];
4500
+							$srctemplatepath = $record['fullname'];
4501 4501
 							break;
4502 4502
 						}
4503 4503
 					}
@@ -4505,27 +4505,27 @@  discard block
 block discarded – undo
4505 4505
 
4506 4506
 				if (empty($srctemplatepath))
4507 4507
 				{
4508
-					$this->error='ErrorGenerationAskedForOdtTemplateWithSrcFileNotDefined';
4508
+					$this->error = 'ErrorGenerationAskedForOdtTemplateWithSrcFileNotDefined';
4509 4509
 					return -1;
4510 4510
 				}
4511 4511
 			}
4512 4512
 
4513
-			if ($obj->type == 'odt' && ! empty($srctemplatepath))
4513
+			if ($obj->type == 'odt' && !empty($srctemplatepath))
4514 4514
 			{
4515
-				if (! dol_is_file($srctemplatepath))
4515
+				if (!dol_is_file($srctemplatepath))
4516 4516
 				{
4517
-					$this->error='ErrorGenerationAskedForOdtTemplateWithSrcFileNotFound';
4517
+					$this->error = 'ErrorGenerationAskedForOdtTemplateWithSrcFileNotFound';
4518 4518
 					return -1;
4519 4519
 				}
4520 4520
 			}
4521 4521
 
4522 4522
 			// We save charset_output to restore it because write_file can change it if needed for
4523 4523
 			// output format that does not support UTF8.
4524
-			$sav_charset_output=$outputlangs->charset_output;
4524
+			$sav_charset_output = $outputlangs->charset_output;
4525 4525
 
4526 4526
 			if (in_array(get_class($this), array('Adherent')))
4527 4527
 			{
4528
-				$arrayofrecords = array();   // The write_file of templates of adherent class need this var
4528
+				$arrayofrecords = array(); // The write_file of templates of adherent class need this var
4529 4529
 				$resultwritefile = $obj->write_file($this, $outputlangs, $srctemplatepath, 'member', 1, $moreparams);
4530 4530
 			}
4531 4531
 			else
@@ -4536,41 +4536,41 @@  discard block
 block discarded – undo
4536 4536
 
4537 4537
 			if ($resultwritefile > 0)
4538 4538
 			{
4539
-				$outputlangs->charset_output=$sav_charset_output;
4539
+				$outputlangs->charset_output = $sav_charset_output;
4540 4540
 
4541 4541
 				// We delete old preview
4542 4542
 				require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
4543 4543
 				dol_delete_preview($this);
4544 4544
 
4545 4545
 				// Index file in database
4546
-				if (! empty($obj->result['fullpath']))
4546
+				if (!empty($obj->result['fullpath']))
4547 4547
 				{
4548 4548
 					$destfull = $obj->result['fullpath'];
4549 4549
 					$upload_dir = dirname($destfull);
4550 4550
 					$destfile = basename($destfull);
4551
-					$rel_dir = preg_replace('/^'.preg_quote(DOL_DATA_ROOT,'/').'/', '', $upload_dir);
4551
+					$rel_dir = preg_replace('/^'.preg_quote(DOL_DATA_ROOT, '/').'/', '', $upload_dir);
4552 4552
 
4553
-					if (! preg_match('/[\\/]temp[\\/]|[\\/]thumbs|\.meta$/', $rel_dir))     // If not a tmp dir
4553
+					if (!preg_match('/[\\/]temp[\\/]|[\\/]thumbs|\.meta$/', $rel_dir))     // If not a tmp dir
4554 4554
 					{
4555 4555
 						$filename = basename($destfile);
4556 4556
 						$rel_dir = preg_replace('/[\\/]$/', '', $rel_dir);
4557 4557
 						$rel_dir = preg_replace('/^[\\/]/', '', $rel_dir);
4558 4558
 
4559 4559
 						include_once DOL_DOCUMENT_ROOT.'/ecm/class/ecmfiles.class.php';
4560
-						$ecmfile=new EcmFiles($this->db);
4561
-						$result = $ecmfile->fetch(0, '', ($rel_dir?$rel_dir.'/':'').$filename);
4560
+						$ecmfile = new EcmFiles($this->db);
4561
+						$result = $ecmfile->fetch(0, '', ($rel_dir ? $rel_dir.'/' : '').$filename);
4562 4562
 
4563 4563
 						// Set the public "share" key
4564 4564
 						$setsharekey = false;
4565 4565
 						if ($this->element == 'propal')
4566 4566
 						{
4567
-							$useonlinesignature = $conf->global->MAIN_FEATURES_LEVEL;	// Replace this with 1 when feature to make online signature is ok
4568
-							if ($useonlinesignature) $setsharekey=true;
4569
-							if (! empty($conf->global->PROPOSAL_ALLOW_EXTERNAL_DOWNLOAD)) $setsharekey=true;
4567
+							$useonlinesignature = $conf->global->MAIN_FEATURES_LEVEL; // Replace this with 1 when feature to make online signature is ok
4568
+							if ($useonlinesignature) $setsharekey = true;
4569
+							if (!empty($conf->global->PROPOSAL_ALLOW_EXTERNAL_DOWNLOAD)) $setsharekey = true;
4570 4570
 						}
4571
-						if ($this->element == 'commande'     && ! empty($conf->global->ORDER_ALLOW_EXTERNAL_DOWNLOAD))        $setsharekey=true;
4572
-						if ($this->element == 'facture'      && ! empty($conf->global->INVOICE_ALLOW_EXTERNAL_DOWNLOAD))      $setsharekey=true;
4573
-						if ($this->element == 'bank_account' && ! empty($conf->global->BANK_ACCOUNT_ALLOW_EXTERNAL_DOWNLOAD)) $setsharekey=true;
4571
+						if ($this->element == 'commande' && !empty($conf->global->ORDER_ALLOW_EXTERNAL_DOWNLOAD))        $setsharekey = true;
4572
+						if ($this->element == 'facture' && !empty($conf->global->INVOICE_ALLOW_EXTERNAL_DOWNLOAD))      $setsharekey = true;
4573
+						if ($this->element == 'bank_account' && !empty($conf->global->BANK_ACCOUNT_ALLOW_EXTERNAL_DOWNLOAD)) $setsharekey = true;
4574 4574
 
4575 4575
 						if ($setsharekey)
4576 4576
 						{
@@ -4583,11 +4583,11 @@  discard block
 block discarded – undo
4583 4583
 
4584 4584
 						if ($result > 0)
4585 4585
 						{
4586
-							$ecmfile->label = md5_file(dol_osencode($destfull));	// hash of file content
4586
+							$ecmfile->label = md5_file(dol_osencode($destfull)); // hash of file content
4587 4587
 							$ecmfile->fullpath_orig = '';
4588 4588
 							$ecmfile->gen_or_uploaded = 'generated';
4589
-							$ecmfile->description = '';    // indexed content
4590
-							$ecmfile->keyword = '';        // keyword content
4589
+							$ecmfile->description = ''; // indexed content
4590
+							$ecmfile->keyword = ''; // keyword content
4591 4591
 							$result = $ecmfile->update($user);
4592 4592
 							if ($result < 0)
4593 4593
 							{
@@ -4599,11 +4599,11 @@  discard block
 block discarded – undo
4599 4599
 							$ecmfile->entity = $conf->entity;
4600 4600
 							$ecmfile->filepath = $rel_dir;
4601 4601
 							$ecmfile->filename = $filename;
4602
-							$ecmfile->label = md5_file(dol_osencode($destfull));	// hash of file content
4602
+							$ecmfile->label = md5_file(dol_osencode($destfull)); // hash of file content
4603 4603
 							$ecmfile->fullpath_orig = '';
4604 4604
 							$ecmfile->gen_or_uploaded = 'generated';
4605
-							$ecmfile->description = '';    // indexed content
4606
-							$ecmfile->keyword = '';        // keyword content
4605
+							$ecmfile->description = ''; // indexed content
4606
+							$ecmfile->keyword = ''; // keyword content
4607 4607
 							$ecmfile->src_object_type = $this->table_element;
4608 4608
 							$ecmfile->src_object_id   = $this->id;
4609 4609
 
@@ -4620,14 +4620,14 @@  discard block
 block discarded – undo
4620 4620
 						//var_dump($obj->update_main_doc_field);exit;
4621 4621
 
4622 4622
 						// Update the last_main_doc field into main object (if documenent generator has property ->update_main_doc_field set)
4623
-						$update_main_doc_field=0;
4624
-						if (! empty($obj->update_main_doc_field)) $update_main_doc_field=1;
4625
-						if ($update_main_doc_field && ! empty($this->table_element))
4623
+						$update_main_doc_field = 0;
4624
+						if (!empty($obj->update_main_doc_field)) $update_main_doc_field = 1;
4625
+						if ($update_main_doc_field && !empty($this->table_element))
4626 4626
 						{
4627 4627
 							$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element." SET last_main_doc = '".($ecmfile->filepath.'/'.$ecmfile->filename)."'";
4628
-							$sql.= ' WHERE rowid = '.$this->id;
4628
+							$sql .= ' WHERE rowid = '.$this->id;
4629 4629
 							$resql = $this->db->query($sql);
4630
-							if (! $resql) dol_print_error($this->db);
4630
+							if (!$resql) dol_print_error($this->db);
4631 4631
 						}
4632 4632
 					}
4633 4633
 				}
@@ -4643,15 +4643,15 @@  discard block
 block discarded – undo
4643 4643
 			}
4644 4644
 			else
4645 4645
 			{
4646
-				$outputlangs->charset_output=$sav_charset_output;
4646
+				$outputlangs->charset_output = $sav_charset_output;
4647 4647
 				dol_print_error($this->db, "Error generating document for ".__CLASS__.". Error: ".$obj->error, $obj->errors);
4648 4648
 				return -1;
4649 4649
 			}
4650 4650
 		}
4651 4651
 		else
4652 4652
 		{
4653
-			$this->error=$langs->trans("Error")." ".$langs->trans("ErrorFileDoesNotExists",$file);
4654
-			dol_print_error('',$this->error);
4653
+			$this->error = $langs->trans("Error")." ".$langs->trans("ErrorFileDoesNotExists", $file);
4654
+			dol_print_error('', $this->error);
4655 4655
 			return -1;
4656 4656
 		}
4657 4657
 	}
@@ -4667,9 +4667,9 @@  discard block
 block discarded – undo
4667 4667
 	{
4668 4668
 		global $maxwidthsmall, $maxheightsmall, $maxwidthmini, $maxheightmini, $quality;
4669 4669
 
4670
-		require_once DOL_DOCUMENT_ROOT .'/core/lib/images.lib.php';		// This define also $maxwidthsmall, $quality, ...
4670
+		require_once DOL_DOCUMENT_ROOT.'/core/lib/images.lib.php'; // This define also $maxwidthsmall, $quality, ...
4671 4671
 
4672
-		$file_osencoded=dol_osencode($file);
4672
+		$file_osencoded = dol_osencode($file);
4673 4673
 		if (file_exists($file_osencoded))
4674 4674
 		{
4675 4675
 			// Create small thumbs for company (Ratio is near 16/9)
@@ -4699,7 +4699,7 @@  discard block
 block discarded – undo
4699 4699
 	 * @param   string              $alternatevalue     Alternate value to use
4700 4700
 	 * @return  string|string[]                         Default value (can be an array if the GETPOST return an array)
4701 4701
 	 **/
4702
-	function getDefaultCreateValueFor($fieldname, $alternatevalue=null)
4702
+	function getDefaultCreateValueFor($fieldname, $alternatevalue = null)
4703 4703
 	{
4704 4704
 		global $conf, $_POST;
4705 4705
 
@@ -4708,16 +4708,16 @@  discard block
 block discarded – undo
4708 4708
 
4709 4709
 		if (isset($alternatevalue)) return $alternatevalue;
4710 4710
 
4711
-		$newelement=$this->element;
4712
-		if ($newelement == 'facture') $newelement='invoice';
4713
-		if ($newelement == 'commande') $newelement='order';
4711
+		$newelement = $this->element;
4712
+		if ($newelement == 'facture') $newelement = 'invoice';
4713
+		if ($newelement == 'commande') $newelement = 'order';
4714 4714
 		if (empty($newelement))
4715 4715
 		{
4716 4716
 			dol_syslog("Ask a default value using common method getDefaultCreateValueForField on an object with no property ->element defined. Return empty string.", LOG_WARNING);
4717 4717
 			return '';
4718 4718
 		}
4719 4719
 
4720
-		$keyforfieldname=strtoupper($newelement.'_DEFAULT_'.$fieldname);
4720
+		$keyforfieldname = strtoupper($newelement.'_DEFAULT_'.$fieldname);
4721 4721
 		//var_dump($keyforfieldname);
4722 4722
 		if (isset($conf->global->$keyforfieldname)) return $conf->global->$keyforfieldname;
4723 4723
 
@@ -4742,21 +4742,21 @@  discard block
 block discarded – undo
4742 4742
 	function call_trigger($trigger_name, $user)
4743 4743
 	{
4744 4744
         // phpcs:enable
4745
-		global $langs,$conf;
4745
+		global $langs, $conf;
4746 4746
 
4747
-		include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php';
4748
-		$interface=new Interfaces($this->db);
4749
-		$result=$interface->run_triggers($trigger_name,$this,$user,$langs,$conf);
4747
+		include_once DOL_DOCUMENT_ROOT.'/core/class/interfaces.class.php';
4748
+		$interface = new Interfaces($this->db);
4749
+		$result = $interface->run_triggers($trigger_name, $this, $user, $langs, $conf);
4750 4750
 
4751 4751
 		if ($result < 0)
4752 4752
 		{
4753 4753
 			if (!empty($this->errors))
4754 4754
 			{
4755
-				$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.
4755
+				$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 4756
 			}
4757 4757
 			else
4758 4758
 			{
4759
-				$this->errors=$interface->errors;
4759
+				$this->errors = $interface->errors;
4760 4760
 			}
4761 4761
 		}
4762 4762
 		return $result;
@@ -4775,19 +4775,19 @@  discard block
 block discarded – undo
4775 4775
 	 *  @param  array	$optionsArray   Array resulting of call of extrafields->fetch_name_optionals_label(). Deprecated. Function must be called without parameters.
4776 4776
 	 *  @return	int						<0 if error, 0 if no values of extrafield to find nor found, 1 if an attribute is found and value loaded
4777 4777
 	 */
4778
-	function fetch_optionals($rowid=null, $optionsArray=null)
4778
+	function fetch_optionals($rowid = null, $optionsArray = null)
4779 4779
 	{
4780 4780
         // phpcs:enable
4781
-		if (empty($rowid)) $rowid=$this->id;
4781
+		if (empty($rowid)) $rowid = $this->id;
4782 4782
 
4783 4783
 		// To avoid SQL errors. Probably not the better solution though
4784 4784
 		if (!$this->table_element) {
4785 4785
 			return 0;
4786 4786
 		}
4787 4787
 
4788
-		$this->array_options=array();
4788
+		$this->array_options = array();
4789 4789
 
4790
-		if (! is_array($optionsArray))
4790
+		if (!is_array($optionsArray))
4791 4791
 		{
4792 4792
 			// If $extrafields is not a known object, we initialize it. Best practice is to have $extrafields defined into card.php or list.php page.
4793 4793
 			// TODO Use of existing $extrafield is not yet ready (must mutualize code that use extrafields in form first)
@@ -4803,7 +4803,7 @@  discard block
 block discarded – undo
4803 4803
 			{
4804 4804
 				$extrafields->fetch_name_optionals_label($this->table_element);
4805 4805
 			}
4806
-			$optionsArray = (! empty($extrafields->attributes[$this->table_element]['label'])?$extrafields->attributes[$this->table_element]['label']:null);
4806
+			$optionsArray = (!empty($extrafields->attributes[$this->table_element]['label']) ? $extrafields->attributes[$this->table_element]['label'] : null);
4807 4807
 		}
4808 4808
 		else
4809 4809
 		{
@@ -4822,18 +4822,18 @@  discard block
 block discarded – undo
4822 4822
 			{
4823 4823
 				if (empty($extrafields->attributes[$this->table_element]['type'][$name]) || $extrafields->attributes[$this->table_element]['type'][$name] != 'separate')
4824 4824
 				{
4825
-					$sql.= ", ".$name;
4825
+					$sql .= ", ".$name;
4826 4826
 				}
4827 4827
 			}
4828
-			$sql.= " FROM ".MAIN_DB_PREFIX.$table_element."_extrafields";
4829
-			$sql.= " WHERE fk_object = ".$rowid;
4828
+			$sql .= " FROM ".MAIN_DB_PREFIX.$table_element."_extrafields";
4829
+			$sql .= " WHERE fk_object = ".$rowid;
4830 4830
 
4831 4831
 			//dol_syslog(get_class($this)."::fetch_optionals get extrafields data for ".$this->table_element, LOG_DEBUG);		// Too verbose
4832
-			$resql=$this->db->query($sql);
4832
+			$resql = $this->db->query($sql);
4833 4833
 			if ($resql)
4834 4834
 			{
4835 4835
 				$this->array_options = array();
4836
-				$numrows=$this->db->num_rows($resql);
4836
+				$numrows = $this->db->num_rows($resql);
4837 4837
 				if ($numrows)
4838 4838
 				{
4839 4839
 					$tab = $this->db->fetch_array($resql);
@@ -4841,17 +4841,17 @@  discard block
 block discarded – undo
4841 4841
 					foreach ($tab as $key => $value)
4842 4842
 					{
4843 4843
 						// 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)
4844
-						if ($key != 'rowid' && $key != 'tms' && $key != 'fk_member' && ! is_int($key))
4844
+						if ($key != 'rowid' && $key != 'tms' && $key != 'fk_member' && !is_int($key))
4845 4845
 						{
4846 4846
 							// we can add this attribute to object
4847
-							if (! empty($extrafields) && in_array($extrafields->attributes[$this->table_element]['type'][$key], array('date','datetime')))
4847
+							if (!empty($extrafields) && in_array($extrafields->attributes[$this->table_element]['type'][$key], array('date', 'datetime')))
4848 4848
 							{
4849 4849
 								//var_dump($extrafields->attributes[$this->table_element]['type'][$key]);
4850
-								$this->array_options["options_".$key]=$this->db->jdate($value);
4850
+								$this->array_options["options_".$key] = $this->db->jdate($value);
4851 4851
 							}
4852 4852
 							else
4853 4853
 							{
4854
-								$this->array_options["options_".$key]=$value;
4854
+								$this->array_options["options_".$key] = $value;
4855 4855
 							}
4856 4856
 
4857 4857
 							//var_dump('key '.$key.' '.$value.' type='.$extrafields->attributes[$this->table_element]['type'][$key].' '.$this->array_options["options_".$key]);
@@ -4887,10 +4887,10 @@  discard block
 block discarded – undo
4887 4887
 
4888 4888
 		$sql_del = "DELETE FROM ".MAIN_DB_PREFIX.$table_element."_extrafields WHERE fk_object = ".$this->id;
4889 4889
 		dol_syslog(get_class($this)."::deleteExtraFields delete", LOG_DEBUG);
4890
-		$resql=$this->db->query($sql_del);
4891
-		if (! $resql)
4890
+		$resql = $this->db->query($sql_del);
4891
+		if (!$resql)
4892 4892
 		{
4893
-			$this->error=$this->db->lasterror();
4893
+			$this->error = $this->db->lasterror();
4894 4894
 			$this->db->rollback();
4895 4895
 			return -1;
4896 4896
 		}
@@ -4911,36 +4911,36 @@  discard block
 block discarded – undo
4911 4911
 	 *  @return int 						-1=error, O=did nothing, 1=OK
4912 4912
 	 *  @see updateExtraField, setValueFrom
4913 4913
 	 */
4914
-	function insertExtraFields($trigger='', $userused=null)
4914
+	function insertExtraFields($trigger = '', $userused = null)
4915 4915
 	{
4916
-		global $conf,$langs,$user;
4916
+		global $conf, $langs, $user;
4917 4917
 
4918
-		if (empty($userused)) $userused=$user;
4918
+		if (empty($userused)) $userused = $user;
4919 4919
 
4920
-		$error=0;
4920
+		$error = 0;
4921 4921
 
4922
-		if (! empty($conf->global->MAIN_EXTRAFIELDS_DISABLED)) return 0;	// For avoid conflicts if trigger used
4922
+		if (!empty($conf->global->MAIN_EXTRAFIELDS_DISABLED)) return 0; // For avoid conflicts if trigger used
4923 4923
 
4924
-		if (! empty($this->array_options))
4924
+		if (!empty($this->array_options))
4925 4925
 		{
4926 4926
 			// Check parameters
4927 4927
 			$langs->load('admin');
4928 4928
 			require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
4929 4929
 			$extrafields = new ExtraFields($this->db);
4930
-			$target_extrafields=$extrafields->fetch_name_optionals_label($this->table_element);
4930
+			$target_extrafields = $extrafields->fetch_name_optionals_label($this->table_element);
4931 4931
 
4932 4932
 			//Eliminate copied source object extra_fields that do not exist in target object
4933
-			$new_array_options=array();
4933
+			$new_array_options = array();
4934 4934
 			foreach ($this->array_options as $key => $value) {
4935
-				if (in_array(substr($key,8), array_keys($target_extrafields)))	// We remove the 'options_' from $key for test
4935
+				if (in_array(substr($key, 8), array_keys($target_extrafields)))	// We remove the 'options_' from $key for test
4936 4936
 					$new_array_options[$key] = $value;
4937 4937
 				elseif (in_array($key, array_keys($target_extrafields)))		// We test on $key that does not contains the 'options_' prefix
4938 4938
 					$new_array_options['options_'.$key] = $value;
4939 4939
 			}
4940 4940
 
4941
-			foreach($new_array_options as $key => $value)
4941
+			foreach ($new_array_options as $key => $value)
4942 4942
 			{
4943
-			   	$attributeKey      = substr($key,8);   // Remove 'options_' prefix
4943
+			   	$attributeKey      = substr($key, 8); // Remove 'options_' prefix
4944 4944
 			   	$attributeType     = $extrafields->attributes[$this->table_element]['type'][$attributeKey];
4945 4945
 			   	$attributeLabel    = $extrafields->attributes[$this->table_element]['label'][$attributeKey];
4946 4946
 			   	$attributeParam    = $extrafields->attributes[$this->table_element]['param'][$attributeKey];
@@ -4948,13 +4948,13 @@  discard block
 block discarded – undo
4948 4948
 
4949 4949
 			   	if ($attributeRequired)
4950 4950
 			   	{
4951
-			   		$mandatorypb=false;
4952
-			   		if ($attributeType == 'link' && $this->array_options[$key] == '-1') $mandatorypb=true;
4953
-			   		if ($this->array_options[$key] === '') $mandatorypb=true;
4951
+			   		$mandatorypb = false;
4952
+			   		if ($attributeType == 'link' && $this->array_options[$key] == '-1') $mandatorypb = true;
4953
+			   		if ($this->array_options[$key] === '') $mandatorypb = true;
4954 4954
 			   		if ($mandatorypb)
4955 4955
 			   		{
4956 4956
 			   			dol_syslog($this->error);
4957
-			   			$this->errors[]=$langs->trans('ErrorFieldRequired', $attributeLabel);
4957
+			   			$this->errors[] = $langs->trans('ErrorFieldRequired', $attributeLabel);
4958 4958
 			   			return -1;
4959 4959
 			   		}
4960 4960
 			   	}
@@ -4965,25 +4965,25 @@  discard block
 block discarded – undo
4965 4965
 			   	switch ($attributeType)
4966 4966
 			   	{
4967 4967
 			   		case 'int':
4968
-			  			if (!is_numeric($value) && $value!='')
4968
+			  			if (!is_numeric($value) && $value != '')
4969 4969
 			   			{
4970
-			   				$this->errors[]=$langs->trans("ExtraFieldHasWrongValue", $attributeLabel);
4970
+			   				$this->errors[] = $langs->trans("ExtraFieldHasWrongValue", $attributeLabel);
4971 4971
 			   				return -1;
4972 4972
 			  			}
4973
-			   			elseif ($value=='')
4973
+			   			elseif ($value == '')
4974 4974
 			   			{
4975 4975
 			   				$new_array_options[$key] = null;
4976 4976
 			   			}
4977 4977
 			 			break;
4978 4978
 					case 'double':
4979 4979
 						$value = price2num($value);
4980
-						if (!is_numeric($value) && $value!='')
4980
+						if (!is_numeric($value) && $value != '')
4981 4981
 						{
4982 4982
 							dol_syslog($langs->trans("ExtraFieldHasWrongValue")." sur ".$attributeLabel."(".$value."is not '".$attributeType."')", LOG_DEBUG);
4983
-							$this->errors[]=$langs->trans("ExtraFieldHasWrongValue", $attributeLabel);
4983
+							$this->errors[] = $langs->trans("ExtraFieldHasWrongValue", $attributeLabel);
4984 4984
 							return -1;
4985 4985
 						}
4986
-						elseif ($value=='')
4986
+						elseif ($value == '')
4987 4987
 						{
4988 4988
 							$new_array_options[$key] = null;
4989 4989
 						}
@@ -4997,12 +4997,12 @@  discard block
 block discarded – undo
4997 4997
              			}
4998 4998
              			break;*/
4999 4999
 			   		case 'password':
5000
-			   			$algo='';
5000
+			   			$algo = '';
5001 5001
 			   			if ($this->array_options[$key] != '' && is_array($extrafields->attributes[$this->table_element]['param'][$attributeKey]['options']))
5002 5002
 			   			{
5003 5003
 			   				// If there is an encryption choice, we use it to crypt data before insert
5004 5004
 			   				$tmparrays = array_keys($extrafields->attributes[$this->table_element]['param'][$attributeKey]['options']);
5005
-			   				$algo=reset($tmparrays);
5005
+			   				$algo = reset($tmparrays);
5006 5006
 			   				if ($algo != '')
5007 5007
 			   				{
5008 5008
 			   					//global $action;		// $action may be 'create', 'update', 'update_extras'...
@@ -5013,7 +5013,7 @@  discard block
 block discarded – undo
5013 5013
 			   						//var_dump($this->oldcopy->array_options[$key]); var_dump($this->array_options[$key]);
5014 5014
 				   					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.
5015 5015
 				   					{
5016
-				   						$new_array_options[$key] = $this->array_options[$key];	// Value is kept
5016
+				   						$new_array_options[$key] = $this->array_options[$key]; // Value is kept
5017 5017
 				   					}
5018 5018
 									else
5019 5019
 									{
@@ -5024,7 +5024,7 @@  discard block
 block discarded – undo
5024 5024
 			   					}
5025 5025
 			   					else
5026 5026
 			   					{
5027
-			   						$new_array_options[$key] = $this->array_options[$key];	// Value is kept
5027
+			   						$new_array_options[$key] = $this->array_options[$key]; // Value is kept
5028 5028
 			   					}
5029 5029
 			   				}
5030 5030
 			   			}
@@ -5041,13 +5041,13 @@  discard block
 block discarded – undo
5041 5041
 						break;
5042 5042
 					case 'datetime':
5043 5043
 						// If data is a string instead of a timestamp, we convert it
5044
-						if (! is_int($this->array_options[$key])) {
5044
+						if (!is_int($this->array_options[$key])) {
5045 5045
 							$this->array_options[$key] = strtotime($this->array_options[$key]);
5046 5046
 						}
5047 5047
 						$new_array_options[$key] = $this->db->idate($this->array_options[$key]);
5048 5048
 						break;
5049 5049
 		   			case 'link':
5050
-						$param_list=array_keys($attributeParam['options']);
5050
+						$param_list = array_keys($attributeParam['options']);
5051 5051
 						// 0 : ObjectName
5052 5052
 						// 1 : classPath
5053 5053
 						$InfoFieldList = explode(":", $param_list[0]);
@@ -5056,18 +5056,18 @@  discard block
 block discarded – undo
5056 5056
 						{
5057 5057
 							if ($value == '-1')	// -1 is key for no defined in combo list of objects
5058 5058
 							{
5059
-								$new_array_options[$key]='';
5059
+								$new_array_options[$key] = '';
5060 5060
 							}
5061 5061
 							elseif ($value)
5062 5062
 							{
5063 5063
 								$object = new $InfoFieldList[0]($this->db);
5064
-								if (is_numeric($value)) $res=$object->fetch($value);
5065
-								else $res=$object->fetch('',$value);
5064
+								if (is_numeric($value)) $res = $object->fetch($value);
5065
+								else $res = $object->fetch('', $value);
5066 5066
 
5067
-								if ($res > 0) $new_array_options[$key]=$object->id;
5067
+								if ($res > 0) $new_array_options[$key] = $object->id;
5068 5068
 								else
5069 5069
 								{
5070
-									$this->error="Id/Ref '".$value."' for object '".$object->element."' not found";
5070
+									$this->error = "Id/Ref '".$value."' for object '".$object->element."' not found";
5071 5071
 									$this->db->rollback();
5072 5072
 									return -1;
5073 5073
 								}
@@ -5091,46 +5091,46 @@  discard block
 block discarded – undo
5091 5091
 			$this->db->query($sql_del);
5092 5092
 
5093 5093
 			$sql = "INSERT INTO ".MAIN_DB_PREFIX.$table_element."_extrafields (fk_object";
5094
-			foreach($new_array_options as $key => $value)
5094
+			foreach ($new_array_options as $key => $value)
5095 5095
 			{
5096
-				$attributeKey = substr($key,8);   // Remove 'options_' prefix
5096
+				$attributeKey = substr($key, 8); // Remove 'options_' prefix
5097 5097
 				// Add field of attribut
5098 5098
 				if ($extrafields->attributes[$this->table_element]['type'][$attributeKey] != 'separate') // Only for other type than separator
5099
-					$sql.=",".$attributeKey;
5099
+					$sql .= ",".$attributeKey;
5100 5100
 			}
5101 5101
 			$sql .= ") VALUES (".$this->id;
5102 5102
 
5103
-			foreach($new_array_options as $key => $value)
5103
+			foreach ($new_array_options as $key => $value)
5104 5104
 			{
5105
-				$attributeKey = substr($key,8);   // Remove 'options_' prefix
5105
+				$attributeKey = substr($key, 8); // Remove 'options_' prefix
5106 5106
 				// Add field of attribute
5107 5107
 				if ($extrafields->attributes[$this->table_element]['type'][$attributeKey] != 'separate') // Only for other type than separator)
5108 5108
 				{
5109 5109
 					if ($new_array_options[$key] != '')
5110 5110
 					{
5111
-						$sql.=",'".$this->db->escape($new_array_options[$key])."'";
5111
+						$sql .= ",'".$this->db->escape($new_array_options[$key])."'";
5112 5112
 					}
5113 5113
 					else
5114 5114
 					{
5115
-						$sql.=",null";
5115
+						$sql .= ",null";
5116 5116
 					}
5117 5117
 				}
5118 5118
 			}
5119
-			$sql.=")";
5119
+			$sql .= ")";
5120 5120
 
5121 5121
 			dol_syslog(get_class($this)."::insertExtraFields insert", LOG_DEBUG);
5122 5122
 			$resql = $this->db->query($sql);
5123
-			if (! $resql)
5123
+			if (!$resql)
5124 5124
 			{
5125
-				$this->error=$this->db->lasterror();
5125
+				$this->error = $this->db->lasterror();
5126 5126
 				$error++;
5127 5127
 			}
5128 5128
 
5129
-			if (! $error && $trigger)
5129
+			if (!$error && $trigger)
5130 5130
 			{
5131 5131
 				// Call trigger
5132
-				$this->context=array('extrafieldaddupdate'=>1);
5133
-				$result=$this->call_trigger($trigger, $userused);
5132
+				$this->context = array('extrafieldaddupdate'=>1);
5133
+				$result = $this->call_trigger($trigger, $userused);
5134 5134
 				if ($result < 0) $error++;
5135 5135
 				// End call trigger
5136 5136
 			}
@@ -5159,25 +5159,25 @@  discard block
 block discarded – undo
5159 5159
 	 *  @return int                 		-1=error, O=did nothing, 1=OK
5160 5160
 	 *  @see setValueFrom, insertExtraFields
5161 5161
 	 */
5162
-	function updateExtraField($key, $trigger=null, $userused=null)
5162
+	function updateExtraField($key, $trigger = null, $userused = null)
5163 5163
 	{
5164
-		global $conf,$langs,$user;
5164
+		global $conf, $langs, $user;
5165 5165
 
5166
-		if (empty($userused)) $userused=$user;
5166
+		if (empty($userused)) $userused = $user;
5167 5167
 
5168
-		$error=0;
5168
+		$error = 0;
5169 5169
 
5170
-		if (! empty($conf->global->MAIN_EXTRAFIELDS_DISABLED)) return 0;	// For avoid conflicts if trigger used
5170
+		if (!empty($conf->global->MAIN_EXTRAFIELDS_DISABLED)) return 0; // For avoid conflicts if trigger used
5171 5171
 
5172
-		if (! empty($this->array_options) && isset($this->array_options["options_".$key]))
5172
+		if (!empty($this->array_options) && isset($this->array_options["options_".$key]))
5173 5173
 		{
5174 5174
 			// Check parameters
5175 5175
 			$langs->load('admin');
5176 5176
 			require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
5177 5177
 			$extrafields = new ExtraFields($this->db);
5178
-			$target_extrafields=$extrafields->fetch_name_optionals_label($this->table_element);
5178
+			$target_extrafields = $extrafields->fetch_name_optionals_label($this->table_element);
5179 5179
 
5180
-			$value=$this->array_options["options_".$key];
5180
+			$value = $this->array_options["options_".$key];
5181 5181
 
5182 5182
 			$attributeType     = $extrafields->attributes[$this->table_element]['type'][$key];
5183 5183
 			$attributeLabel    = $extrafields->attributes[$this->table_element]['label'][$key];
@@ -5190,25 +5190,25 @@  discard block
 block discarded – undo
5190 5190
 			switch ($attributeType)
5191 5191
 			{
5192 5192
 				case 'int':
5193
-					if (!is_numeric($value) && $value!='')
5193
+					if (!is_numeric($value) && $value != '')
5194 5194
 					{
5195
-						$this->errors[]=$langs->trans("ExtraFieldHasWrongValue",$attributeLabel);
5195
+						$this->errors[] = $langs->trans("ExtraFieldHasWrongValue", $attributeLabel);
5196 5196
 						return -1;
5197 5197
 					}
5198
-					elseif ($value=='')
5198
+					elseif ($value == '')
5199 5199
 					{
5200 5200
 						$this->array_options["options_".$key] = null;
5201 5201
 					}
5202 5202
 					break;
5203 5203
 				case 'double':
5204 5204
 					$value = price2num($value);
5205
-					if (!is_numeric($value) && $value!='')
5205
+					if (!is_numeric($value) && $value != '')
5206 5206
 					{
5207 5207
 						dol_syslog($langs->trans("ExtraFieldHasWrongValue")." sur ".$attributeLabel."(".$value."is not '".$attributeType."')", LOG_DEBUG);
5208
-						$this->errors[]=$langs->trans("ExtraFieldHasWrongValue", $attributeLabel);
5208
+						$this->errors[] = $langs->trans("ExtraFieldHasWrongValue", $attributeLabel);
5209 5209
 						return -1;
5210 5210
 					}
5211
-					elseif ($value=='')
5211
+					elseif ($value == '')
5212 5212
 					{
5213 5213
 						$this->array_options["options_".$key] = null;
5214 5214
 					}
@@ -5225,13 +5225,13 @@  discard block
 block discarded – undo
5225 5225
 					$this->array_options["options_".$key] = price2num($this->array_options["options_".$key]);
5226 5226
 					break;
5227 5227
 				case 'date':
5228
-					$this->array_options["options_".$key]=$this->db->idate($this->array_options["options_".$key]);
5228
+					$this->array_options["options_".$key] = $this->db->idate($this->array_options["options_".$key]);
5229 5229
 					break;
5230 5230
 				case 'datetime':
5231
-					$this->array_options["options_".$key]=$this->db->idate($this->array_options["options_".$key]);
5231
+					$this->array_options["options_".$key] = $this->db->idate($this->array_options["options_".$key]);
5232 5232
 					break;
5233 5233
 				case 'link':
5234
-					$param_list=array_keys($attributeParam['options']);
5234
+					$param_list = array_keys($attributeParam['options']);
5235 5235
 					// 0 : ObjectName
5236 5236
 					// 1 : classPath
5237 5237
 					$InfoFieldList = explode(":", $param_list[0]);
@@ -5239,8 +5239,8 @@  discard block
 block discarded – undo
5239 5239
 					if ($value)
5240 5240
 					{
5241 5241
 						$object = new $InfoFieldList[0]($this->db);
5242
-						$object->fetch(0,$value);
5243
-						$this->array_options["options_".$key]=$object->id;
5242
+						$object->fetch(0, $value);
5243
+						$this->array_options["options_".$key] = $object->id;
5244 5244
 					}
5245 5245
 					break;
5246 5246
 			}
@@ -5249,24 +5249,24 @@  discard block
 block discarded – undo
5249 5249
 			$sql = "UPDATE ".MAIN_DB_PREFIX.$this->table_element."_extrafields SET ".$key."='".$this->db->escape($this->array_options["options_".$key])."'";
5250 5250
 			$sql .= " WHERE fk_object = ".$this->id;
5251 5251
 			$resql = $this->db->query($sql);
5252
-			if (! $resql)
5252
+			if (!$resql)
5253 5253
 			{
5254 5254
 				$error++;
5255
-				$this->error=$this->db->lasterror();
5255
+				$this->error = $this->db->lasterror();
5256 5256
 			}
5257 5257
 
5258
-			if (! $error && $trigger)
5258
+			if (!$error && $trigger)
5259 5259
 			{
5260 5260
 				// Call trigger
5261
-				$this->context=array('extrafieldupdate'=>1);
5262
-				$result=$this->call_trigger($trigger, $userused);
5261
+				$this->context = array('extrafieldupdate'=>1);
5262
+				$result = $this->call_trigger($trigger, $userused);
5263 5263
 				if ($result < 0) $error++;
5264 5264
 				// End call trigger
5265 5265
 			}
5266 5266
 
5267 5267
 			if ($error)
5268 5268
 			{
5269
-				dol_syslog(get_class($this) . "::".__METHOD__ . $this->error, LOG_ERR);
5269
+				dol_syslog(get_class($this)."::".__METHOD__.$this->error, LOG_ERR);
5270 5270
 				$this->db->rollback();
5271 5271
 				return -1;
5272 5272
 			}
@@ -5293,71 +5293,71 @@  discard block
 block discarded – undo
5293 5293
 	 * @param  string|int		$morecss       Value for css to define style/length of field. May also be a numeric.
5294 5294
 	 * @return string
5295 5295
 	 */
5296
-	function showInputField($val, $key, $value, $moreparam='', $keysuffix='', $keyprefix='', $morecss=0)
5296
+	function showInputField($val, $key, $value, $moreparam = '', $keysuffix = '', $keyprefix = '', $morecss = 0)
5297 5297
 	{
5298
-		global $conf,$langs,$form;
5298
+		global $conf, $langs, $form;
5299 5299
 
5300
-		if (! is_object($form))
5300
+		if (!is_object($form))
5301 5301
 		{
5302 5302
 			require_once DOL_DOCUMENT_ROOT.'/core/class/html.form.class.php';
5303
-			$form=new Form($this->db);
5303
+			$form = new Form($this->db);
5304 5304
 		}
5305 5305
 
5306
-		$val=$this->fields[$key];
5306
+		$val = $this->fields[$key];
5307 5307
 
5308
-		$out='';
5309
-        $type='';
5308
+		$out = '';
5309
+        $type = '';
5310 5310
         $param = array();
5311
-        $param['options']=array();
5312
-        $size =$this->fields[$key]['size'];
5311
+        $param['options'] = array();
5312
+        $size = $this->fields[$key]['size'];
5313 5313
         // Because we work on extrafields
5314
-        if(preg_match('/^integer:(.*):(.*)/i', $val['type'], $reg)){
5315
-            $param['options']=array($reg[1].':'.$reg[2]=>'N');
5316
-            $type ='link';
5317
-        } elseif(preg_match('/^link:(.*):(.*)/i', $val['type'], $reg)) {
5318
-            $param['options']=array($reg[1].':'.$reg[2]=>'N');
5319
-            $type ='link';
5320
-        } elseif(preg_match('/^sellist:(.*):(.*):(.*):(.*)/i', $val['type'], $reg)) {
5321
-            $param['options']=array($reg[1].':'.$reg[2].':'.$reg[3].':'.$reg[4]=>'N');
5322
-            $type ='sellist';
5323
-        } elseif(preg_match('/varchar\((\d+)\)/', $val['type'],$reg)) {
5324
-            $param['options']=array();
5325
-            $type ='varchar';
5326
-            $size=$reg[1];
5327
-        } elseif(preg_match('/varchar/', $val['type'])) {
5328
-            $param['options']=array();
5329
-            $type ='varchar';
5330
-        } elseif(is_array($this->fields[$key]['arrayofkeyval'])) {
5331
-            $param['options']=$this->fields[$key]['arrayofkeyval'];
5332
-            $type ='select';
5314
+        if (preg_match('/^integer:(.*):(.*)/i', $val['type'], $reg)) {
5315
+            $param['options'] = array($reg[1].':'.$reg[2]=>'N');
5316
+            $type = 'link';
5317
+        } elseif (preg_match('/^link:(.*):(.*)/i', $val['type'], $reg)) {
5318
+            $param['options'] = array($reg[1].':'.$reg[2]=>'N');
5319
+            $type = 'link';
5320
+        } elseif (preg_match('/^sellist:(.*):(.*):(.*):(.*)/i', $val['type'], $reg)) {
5321
+            $param['options'] = array($reg[1].':'.$reg[2].':'.$reg[3].':'.$reg[4]=>'N');
5322
+            $type = 'sellist';
5323
+        } elseif (preg_match('/varchar\((\d+)\)/', $val['type'], $reg)) {
5324
+            $param['options'] = array();
5325
+            $type = 'varchar';
5326
+            $size = $reg[1];
5327
+        } elseif (preg_match('/varchar/', $val['type'])) {
5328
+            $param['options'] = array();
5329
+            $type = 'varchar';
5330
+        } elseif (is_array($this->fields[$key]['arrayofkeyval'])) {
5331
+            $param['options'] = $this->fields[$key]['arrayofkeyval'];
5332
+            $type = 'select';
5333 5333
         } else {
5334
-            $param['options']=array();
5335
-            $type =$this->fields[$key]['type'];
5334
+            $param['options'] = array();
5335
+            $type = $this->fields[$key]['type'];
5336 5336
         }
5337 5337
 
5338
-		$label=$this->fields[$key]['label'];
5338
+		$label = $this->fields[$key]['label'];
5339 5339
 		//$elementtype=$this->fields[$key]['elementtype'];	// Seems not used
5340
-		$default=$this->fields[$key]['default'];
5341
-		$computed=$this->fields[$key]['computed'];
5342
-		$unique=$this->fields[$key]['unique'];
5343
-		$required=$this->fields[$key]['required'];
5340
+		$default = $this->fields[$key]['default'];
5341
+		$computed = $this->fields[$key]['computed'];
5342
+		$unique = $this->fields[$key]['unique'];
5343
+		$required = $this->fields[$key]['required'];
5344 5344
 
5345
-		$langfile=$this->fields[$key]['langfile'];
5346
-		$list=$this->fields[$key]['list'];
5347
-		$hidden=abs($this->fields[$key]['visible'])!=1?1:0;
5345
+		$langfile = $this->fields[$key]['langfile'];
5346
+		$list = $this->fields[$key]['list'];
5347
+		$hidden = abs($this->fields[$key]['visible']) != 1 ? 1 : 0;
5348 5348
 
5349 5349
 		$objectid = $this->id;
5350 5350
 
5351 5351
 
5352 5352
 		if ($computed)
5353 5353
 		{
5354
-			if (! preg_match('/^search_/', $keyprefix)) return '<span class="opacitymedium">'.$langs->trans("AutomaticallyCalculated").'</span>';
5354
+			if (!preg_match('/^search_/', $keyprefix)) return '<span class="opacitymedium">'.$langs->trans("AutomaticallyCalculated").'</span>';
5355 5355
 			else return '';
5356 5356
 		}
5357 5357
 
5358 5358
 
5359 5359
 		// Use in priority showsize from parameters, then $val['css'] then autodefine
5360
-		if (empty($morecss) && ! empty($val['css']))
5360
+		if (empty($morecss) && !empty($val['css']))
5361 5361
 		{
5362 5362
 			$showsize = $val['css'];
5363 5363
 		}
@@ -5371,16 +5371,16 @@  discard block
 block discarded – undo
5371 5371
 			{
5372 5372
 				$morecss = 'minwidth200imp';
5373 5373
 			}
5374
-			elseif (in_array($type,array('int','integer','price')) || preg_match('/^double(\([0-9],[0-9]\)){0,1}/',$type))
5374
+			elseif (in_array($type, array('int', 'integer', 'price')) || preg_match('/^double(\([0-9],[0-9]\)){0,1}/', $type))
5375 5375
 			{
5376 5376
 				$morecss = 'maxwidth75';
5377 5377
                         }elseif ($type == 'url')
5378 5378
 			{
5379
-				$morecss='minwidth400';
5379
+				$morecss = 'minwidth400';
5380 5380
 			}
5381 5381
 			elseif ($type == 'boolean')
5382 5382
 			{
5383
-				$morecss='';
5383
+				$morecss = '';
5384 5384
 			}
5385 5385
 			else
5386 5386
 			{
@@ -5399,12 +5399,12 @@  discard block
 block discarded – undo
5399 5399
 			}
5400 5400
 		}
5401 5401
 
5402
-		if (in_array($type,array('date','datetime')))
5402
+		if (in_array($type, array('date', 'datetime')))
5403 5403
 		{
5404
-			$tmp=explode(',',$size);
5405
-			$newsize=$tmp[0];
5404
+			$tmp = explode(',', $size);
5405
+			$newsize = $tmp[0];
5406 5406
 
5407
-			$showtime = in_array($type,array('datetime')) ? 1 : 0;
5407
+			$showtime = in_array($type, array('datetime')) ? 1 : 0;
5408 5408
 
5409 5409
 			// Do not show current date when field not required (see selectDate() method)
5410 5410
 			if (!$required && $value == '') $value = '-1';
@@ -5412,237 +5412,237 @@  discard block
 block discarded – undo
5412 5412
 			// TODO Must also support $moreparam
5413 5413
 			$out = $form->selectDate($value, $keyprefix.$key.$keysuffix, $showtime, $showtime, $required, '', 1, (($keyprefix != 'search_' && $keyprefix != 'search_options_') ? 1 : 0), 0, 1);
5414 5414
 		}
5415
-		elseif (in_array($type,array('int','integer')))
5415
+		elseif (in_array($type, array('int', 'integer')))
5416 5416
 		{
5417
-			$tmp=explode(',',$size);
5418
-			$newsize=$tmp[0];
5419
-			$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:'').'>';
5417
+			$tmp = explode(',', $size);
5418
+			$newsize = $tmp[0];
5419
+			$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 : '').'>';
5420 5420
 		}
5421 5421
 		elseif (preg_match('/varchar/', $type))
5422 5422
 		{
5423
-			$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:'').'>';
5423
+			$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 5424
 		}
5425 5425
 		elseif (in_array($type, array('mail', 'phone', 'url')))
5426 5426
 		{
5427
-			$out='<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" value="'.dol_escape_htmltag($value).'" '.($moreparam?$moreparam:'').'>';
5427
+			$out = '<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" value="'.dol_escape_htmltag($value).'" '.($moreparam ? $moreparam : '').'>';
5428 5428
 		}
5429 5429
 		elseif ($type == 'text')
5430 5430
 		{
5431
-			if (! preg_match('/search_/', $keyprefix))		// If keyprefix is search_ or search_options_, we must just use a simple text field
5431
+			if (!preg_match('/search_/', $keyprefix))		// If keyprefix is search_ or search_options_, we must just use a simple text field
5432 5432
 			{
5433 5433
 				require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
5434
-				$doleditor=new DolEditor($keyprefix.$key.$keysuffix,$value,'',200,'dolibarr_notes','In',false,false,false,ROWS_5,'90%');
5435
-				$out=$doleditor->Create(1);
5434
+				$doleditor = new DolEditor($keyprefix.$key.$keysuffix, $value, '', 200, 'dolibarr_notes', 'In', false, false, false, ROWS_5, '90%');
5435
+				$out = $doleditor->Create(1);
5436 5436
 			}
5437 5437
 			else
5438 5438
 			{
5439
-				$out='<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" value="'.dol_escape_htmltag($value).'" '.($moreparam?$moreparam:'').'>';
5439
+				$out = '<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" value="'.dol_escape_htmltag($value).'" '.($moreparam ? $moreparam : '').'>';
5440 5440
 			}
5441 5441
 		}
5442 5442
 		elseif ($type == 'html')
5443 5443
 		{
5444
-			if (! preg_match('/search_/', $keyprefix))		// If keyprefix is search_ or search_options_, we must just use a simple text field
5444
+			if (!preg_match('/search_/', $keyprefix))		// If keyprefix is search_ or search_options_, we must just use a simple text field
5445 5445
 			{
5446 5446
 				require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
5447
-				$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%');
5448
-				$out=$doleditor->Create(1);
5447
+				$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%');
5448
+				$out = $doleditor->Create(1);
5449 5449
 			}
5450 5450
 			else
5451 5451
 			{
5452
-				$out='<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" value="'.dol_escape_htmltag($value).'" '.($moreparam?$moreparam:'').'>';
5452
+				$out = '<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" value="'.dol_escape_htmltag($value).'" '.($moreparam ? $moreparam : '').'>';
5453 5453
 			}
5454 5454
 		}
5455 5455
 		elseif ($type == 'boolean')
5456 5456
 		{
5457
-			$checked='';
5457
+			$checked = '';
5458 5458
 			if (!empty($value)) {
5459
-				$checked=' checked value="1" ';
5459
+				$checked = ' checked value="1" ';
5460 5460
 			} else {
5461
-				$checked=' value="1" ';
5461
+				$checked = ' value="1" ';
5462 5462
 			}
5463
-			$out='<input type="checkbox" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" '.$checked.' '.($moreparam?$moreparam:'').'>';
5463
+			$out = '<input type="checkbox" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" '.$checked.' '.($moreparam ? $moreparam : '').'>';
5464 5464
 		}
5465 5465
 		elseif ($type == 'price')
5466 5466
 		{
5467 5467
 			if (!empty($value)) {		// $value in memory is a php numeric, we format it into user number format.
5468
-				$value=price($value);
5468
+				$value = price($value);
5469 5469
 			}
5470
-			$out='<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" value="'.$value.'" '.($moreparam?$moreparam:'').'> '.$langs->getCurrencySymbol($conf->currency);
5470
+			$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 5471
 		}
5472
-		elseif (preg_match('/^double(\([0-9],[0-9]\)){0,1}/',$type))
5472
+		elseif (preg_match('/^double(\([0-9],[0-9]\)){0,1}/', $type))
5473 5473
 		{
5474 5474
 			if (!empty($value)) {		// $value in memory is a php numeric, we format it into user number format.
5475
-				$value=price($value);
5475
+				$value = price($value);
5476 5476
 			}
5477
-			$out='<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" value="'.$value.'" '.($moreparam?$moreparam:'').'> ';
5477
+			$out = '<input type="text" class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" value="'.$value.'" '.($moreparam ? $moreparam : '').'> ';
5478 5478
 		}
5479 5479
 		elseif ($type == 'select')
5480 5480
 		{
5481 5481
 			$out = '';
5482
-			if (! empty($conf->use_javascript_ajax) && ! empty($conf->global->MAIN_EXTRAFIELDS_USE_SELECT2))
5482
+			if (!empty($conf->use_javascript_ajax) && !empty($conf->global->MAIN_EXTRAFIELDS_USE_SELECT2))
5483 5483
 			{
5484
-				include_once DOL_DOCUMENT_ROOT . '/core/lib/ajax.lib.php';
5485
-				$out.= ajax_combobox($keyprefix.$key.$keysuffix, array(), 0);
5484
+				include_once DOL_DOCUMENT_ROOT.'/core/lib/ajax.lib.php';
5485
+				$out .= ajax_combobox($keyprefix.$key.$keysuffix, array(), 0);
5486 5486
 			}
5487 5487
 
5488
-			$out.='<select class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" '.($moreparam?$moreparam:'').'>';
5489
-                if((! isset($this->fields[$key]['default'])) ||($this->fields[$key]['notnull']!=1))$out.='<option value="0">&nbsp;</option>';
5488
+			$out .= '<select class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" '.($moreparam ? $moreparam : '').'>';
5489
+                if ((!isset($this->fields[$key]['default'])) || ($this->fields[$key]['notnull'] != 1))$out .= '<option value="0">&nbsp;</option>';
5490 5490
 			foreach ($param['options'] as $key => $val)
5491 5491
 			{
5492 5492
 				if ((string) $key == '') continue;
5493 5493
 				list($val, $parent) = explode('|', $val);
5494
-				$out.='<option value="'.$key.'"';
5495
-				$out.= (((string) $value == (string) $key)?' selected':'');
5496
-				$out.= (!empty($parent)?' parent="'.$parent.'"':'');
5497
-				$out.='>'.$val.'</option>';
5494
+				$out .= '<option value="'.$key.'"';
5495
+				$out .= (((string) $value == (string) $key) ? ' selected' : '');
5496
+				$out .= (!empty($parent) ? ' parent="'.$parent.'"' : '');
5497
+				$out .= '>'.$val.'</option>';
5498 5498
 			}
5499
-			$out.='</select>';
5499
+			$out .= '</select>';
5500 5500
 		}
5501 5501
 		elseif ($type == 'sellist')
5502 5502
 		{
5503 5503
 			$out = '';
5504
-			if (! empty($conf->use_javascript_ajax) && ! empty($conf->global->MAIN_EXTRAFIELDS_USE_SELECT2))
5504
+			if (!empty($conf->use_javascript_ajax) && !empty($conf->global->MAIN_EXTRAFIELDS_USE_SELECT2))
5505 5505
 			{
5506
-				include_once DOL_DOCUMENT_ROOT . '/core/lib/ajax.lib.php';
5507
-				$out.= ajax_combobox($keyprefix.$key.$keysuffix, array(), 0);
5506
+				include_once DOL_DOCUMENT_ROOT.'/core/lib/ajax.lib.php';
5507
+				$out .= ajax_combobox($keyprefix.$key.$keysuffix, array(), 0);
5508 5508
 			}
5509 5509
 
5510
-			$out.='<select class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" '.($moreparam?$moreparam:'').'>';
5510
+			$out .= '<select class="flat '.$morecss.' maxwidthonsmartphone" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" '.($moreparam ? $moreparam : '').'>';
5511 5511
 			if (is_array($param['options']))
5512 5512
 			{
5513
-				$param_list=array_keys($param['options']);
5513
+				$param_list = array_keys($param['options']);
5514 5514
 				$InfoFieldList = explode(":", $param_list[0]);
5515
-				$parentName='';
5516
-				$parentField='';
5515
+				$parentName = '';
5516
+				$parentField = '';
5517 5517
 				// 0 : tableName
5518 5518
 				// 1 : label field name
5519 5519
 				// 2 : key fields name (if differ of rowid)
5520 5520
 				// 3 : key field parent (for dependent lists)
5521 5521
 				// 4 : where clause filter on column or table extrafield, syntax field='value' or extra.field=value
5522
-				$keyList=(empty($InfoFieldList[2])?'rowid':$InfoFieldList[2].' as rowid');
5522
+				$keyList = (empty($InfoFieldList[2]) ? 'rowid' : $InfoFieldList[2].' as rowid');
5523 5523
 
5524 5524
 
5525
-				if (count($InfoFieldList) > 4 && ! empty($InfoFieldList[4]))
5525
+				if (count($InfoFieldList) > 4 && !empty($InfoFieldList[4]))
5526 5526
 				{
5527 5527
 					if (strpos($InfoFieldList[4], 'extra.') !== false)
5528 5528
 					{
5529
-						$keyList='main.'.$InfoFieldList[2].' as rowid';
5529
+						$keyList = 'main.'.$InfoFieldList[2].' as rowid';
5530 5530
 					} else {
5531
-						$keyList=$InfoFieldList[2].' as rowid';
5531
+						$keyList = $InfoFieldList[2].' as rowid';
5532 5532
 					}
5533 5533
 				}
5534
-				if (count($InfoFieldList) > 3 && ! empty($InfoFieldList[3]))
5534
+				if (count($InfoFieldList) > 3 && !empty($InfoFieldList[3]))
5535 5535
 				{
5536 5536
 					list($parentName, $parentField) = explode('|', $InfoFieldList[3]);
5537
-					$keyList.= ', '.$parentField;
5537
+					$keyList .= ', '.$parentField;
5538 5538
 				}
5539 5539
 
5540
-				$fields_label = explode('|',$InfoFieldList[1]);
5540
+				$fields_label = explode('|', $InfoFieldList[1]);
5541 5541
 				if (is_array($fields_label))
5542 5542
 				{
5543
-					$keyList .=', ';
5543
+					$keyList .= ', ';
5544 5544
 					$keyList .= implode(', ', $fields_label);
5545 5545
 				}
5546 5546
 
5547
-				$sqlwhere='';
5547
+				$sqlwhere = '';
5548 5548
 				$sql = 'SELECT '.$keyList;
5549
-				$sql.= ' FROM '.MAIN_DB_PREFIX .$InfoFieldList[0];
5549
+				$sql .= ' FROM '.MAIN_DB_PREFIX.$InfoFieldList[0];
5550 5550
 				if (!empty($InfoFieldList[4]))
5551 5551
 				{
5552 5552
 					// can use SELECT request
5553
-					if (strpos($InfoFieldList[4], '$SEL$')!==false) {
5554
-						$InfoFieldList[4]=str_replace('$SEL$','SELECT',$InfoFieldList[4]);
5553
+					if (strpos($InfoFieldList[4], '$SEL$') !== false) {
5554
+						$InfoFieldList[4] = str_replace('$SEL$', 'SELECT', $InfoFieldList[4]);
5555 5555
 					}
5556 5556
 
5557 5557
 					// current object id can be use into filter
5558
-					if (strpos($InfoFieldList[4], '$ID$')!==false && !empty($objectid)) {
5559
-						$InfoFieldList[4]=str_replace('$ID$',$objectid,$InfoFieldList[4]);
5558
+					if (strpos($InfoFieldList[4], '$ID$') !== false && !empty($objectid)) {
5559
+						$InfoFieldList[4] = str_replace('$ID$', $objectid, $InfoFieldList[4]);
5560 5560
 					} else {
5561
-						$InfoFieldList[4]=str_replace('$ID$','0',$InfoFieldList[4]);
5561
+						$InfoFieldList[4] = str_replace('$ID$', '0', $InfoFieldList[4]);
5562 5562
 					}
5563 5563
 					//We have to join on extrafield table
5564
-					if (strpos($InfoFieldList[4], 'extra')!==false)
5564
+					if (strpos($InfoFieldList[4], 'extra') !== false)
5565 5565
 					{
5566
-						$sql.= ' as main, '.MAIN_DB_PREFIX .$InfoFieldList[0].'_extrafields as extra';
5567
-						$sqlwhere.= ' WHERE extra.fk_object=main.'.$InfoFieldList[2]. ' AND '.$InfoFieldList[4];
5566
+						$sql .= ' as main, '.MAIN_DB_PREFIX.$InfoFieldList[0].'_extrafields as extra';
5567
+						$sqlwhere .= ' WHERE extra.fk_object=main.'.$InfoFieldList[2].' AND '.$InfoFieldList[4];
5568 5568
 					}
5569 5569
 					else
5570 5570
 					{
5571
-						$sqlwhere.= ' WHERE '.$InfoFieldList[4];
5571
+						$sqlwhere .= ' WHERE '.$InfoFieldList[4];
5572 5572
 					}
5573 5573
 				}
5574 5574
 				else
5575 5575
 				{
5576
-					$sqlwhere.= ' WHERE 1=1';
5576
+					$sqlwhere .= ' WHERE 1=1';
5577 5577
 				}
5578 5578
 				// Some tables may have field, some other not. For the moment we disable it.
5579
-				if (in_array($InfoFieldList[0],array('tablewithentity')))
5579
+				if (in_array($InfoFieldList[0], array('tablewithentity')))
5580 5580
 				{
5581
-					$sqlwhere.= ' AND entity = '.$conf->entity;
5581
+					$sqlwhere .= ' AND entity = '.$conf->entity;
5582 5582
 				}
5583
-				$sql.=$sqlwhere;
5583
+				$sql .= $sqlwhere;
5584 5584
 				//print $sql;
5585 5585
 
5586
-				$sql .= ' ORDER BY ' . implode(', ', $fields_label);
5586
+				$sql .= ' ORDER BY '.implode(', ', $fields_label);
5587 5587
 
5588 5588
 				dol_syslog(get_class($this).'::showInputField type=sellist', LOG_DEBUG);
5589 5589
 				$resql = $this->db->query($sql);
5590 5590
 				if ($resql)
5591 5591
 				{
5592
-					$out.='<option value="0">&nbsp;</option>';
5592
+					$out .= '<option value="0">&nbsp;</option>';
5593 5593
 					$num = $this->db->num_rows($resql);
5594 5594
 					$i = 0;
5595 5595
 					while ($i < $num)
5596 5596
 					{
5597
-						$labeltoshow='';
5597
+						$labeltoshow = '';
5598 5598
 						$obj = $this->db->fetch_object($resql);
5599 5599
 
5600 5600
 						// Several field into label (eq table:code|libelle:rowid)
5601 5601
 						$notrans = false;
5602
-						$fields_label = explode('|',$InfoFieldList[1]);
5602
+						$fields_label = explode('|', $InfoFieldList[1]);
5603 5603
 						if (is_array($fields_label))
5604 5604
 						{
5605 5605
 							$notrans = true;
5606 5606
 							foreach ($fields_label as $field_toshow)
5607 5607
 							{
5608
-								$labeltoshow.= $obj->$field_toshow.' ';
5608
+								$labeltoshow .= $obj->$field_toshow.' ';
5609 5609
 							}
5610 5610
 						}
5611 5611
 						else
5612 5612
 						{
5613
-							$labeltoshow=$obj->{$InfoFieldList[1]};
5613
+							$labeltoshow = $obj->{$InfoFieldList[1]};
5614 5614
 						}
5615
-						$labeltoshow=dol_trunc($labeltoshow,45);
5615
+						$labeltoshow = dol_trunc($labeltoshow, 45);
5616 5616
 
5617 5617
 						if ($value == $obj->rowid)
5618 5618
 						{
5619 5619
 							foreach ($fields_label as $field_toshow)
5620 5620
 							{
5621
-								$translabel=$langs->trans($obj->$field_toshow);
5622
-								if ($translabel!=$obj->$field_toshow) {
5623
-									$labeltoshow=dol_trunc($translabel,18).' ';
5624
-								}else {
5625
-									$labeltoshow=dol_trunc($obj->$field_toshow,18).' ';
5621
+								$translabel = $langs->trans($obj->$field_toshow);
5622
+								if ($translabel != $obj->$field_toshow) {
5623
+									$labeltoshow = dol_trunc($translabel, 18).' ';
5624
+								} else {
5625
+									$labeltoshow = dol_trunc($obj->$field_toshow, 18).' ';
5626 5626
 								}
5627 5627
 							}
5628
-							$out.='<option value="'.$obj->rowid.'" selected>'.$labeltoshow.'</option>';
5628
+							$out .= '<option value="'.$obj->rowid.'" selected>'.$labeltoshow.'</option>';
5629 5629
 						}
5630 5630
 						else
5631 5631
 						{
5632
-							if (! $notrans)
5632
+							if (!$notrans)
5633 5633
 							{
5634
-								$translabel=$langs->trans($obj->{$InfoFieldList[1]});
5635
-								if ($translabel!=$obj->{$InfoFieldList[1]}) {
5636
-									$labeltoshow=dol_trunc($translabel,18);
5634
+								$translabel = $langs->trans($obj->{$InfoFieldList[1]});
5635
+								if ($translabel != $obj->{$InfoFieldList[1]}) {
5636
+									$labeltoshow = dol_trunc($translabel, 18);
5637 5637
 								}
5638 5638
 								else {
5639
-									$labeltoshow=dol_trunc($obj->{$InfoFieldList[1]},18);
5639
+									$labeltoshow = dol_trunc($obj->{$InfoFieldList[1]},18);
5640 5640
 								}
5641 5641
 							}
5642
-							if (empty($labeltoshow)) $labeltoshow='(not defined)';
5643
-							if ($value==$obj->rowid)
5642
+							if (empty($labeltoshow)) $labeltoshow = '(not defined)';
5643
+							if ($value == $obj->rowid)
5644 5644
 							{
5645
-								$out.='<option value="'.$obj->rowid.'" selected>'.$labeltoshow.'</option>';
5645
+								$out .= '<option value="'.$obj->rowid.'" selected>'.$labeltoshow.'</option>';
5646 5646
 							}
5647 5647
 
5648 5648
 							if (!empty($InfoFieldList[3]) && $parentField)
@@ -5650,10 +5650,10 @@  discard block
 block discarded – undo
5650 5650
 								$parent = $parentName.':'.$obj->{$parentField};
5651 5651
 							}
5652 5652
 
5653
-							$out.='<option value="'.$obj->rowid.'"';
5654
-							$out.= ($value==$obj->rowid?' selected':'');
5655
-							$out.= (!empty($parent)?' parent="'.$parent.'"':'');
5656
-							$out.='>'.$labeltoshow.'</option>';
5653
+							$out .= '<option value="'.$obj->rowid.'"';
5654
+							$out .= ($value == $obj->rowid ? ' selected' : '');
5655
+							$out .= (!empty($parent) ? ' parent="'.$parent.'"' : '');
5656
+							$out .= '>'.$labeltoshow.'</option>';
5657 5657
 						}
5658 5658
 
5659 5659
 						$i++;
@@ -5664,23 +5664,23 @@  discard block
 block discarded – undo
5664 5664
 					print 'Error in request '.$sql.' '.$this->db->lasterror().'. Check setup of extra parameters.<br>';
5665 5665
 				}
5666 5666
 			}
5667
-			$out.='</select>';
5667
+			$out .= '</select>';
5668 5668
 		}
5669 5669
 		elseif ($type == 'checkbox')
5670 5670
 		{
5671
-			$value_arr=explode(',',$value);
5672
-			$out=$form->multiselectarray($keyprefix.$key.$keysuffix, (empty($param['options'])?null:$param['options']), $value_arr, '', 0, '', 0, '100%');
5671
+			$value_arr = explode(',', $value);
5672
+			$out = $form->multiselectarray($keyprefix.$key.$keysuffix, (empty($param['options']) ?null:$param['options']), $value_arr, '', 0, '', 0, '100%');
5673 5673
 		}
5674 5674
 		elseif ($type == 'radio')
5675 5675
 		{
5676
-			$out='';
5676
+			$out = '';
5677 5677
 			foreach ($param['options'] as $keyopt => $val)
5678 5678
 			{
5679
-				$out.='<input class="flat '.$morecss.'" type="radio" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" '.($moreparam?$moreparam:'');
5680
-				$out.=' value="'.$keyopt.'"';
5681
-				$out.=' id="'.$keyprefix.$key.$keysuffix.'_'.$keyopt.'"';
5682
-				$out.= ($value==$keyopt?'checked':'');
5683
-				$out.='/><label for="'.$keyprefix.$key.$keysuffix.'_'.$keyopt.'">'.$val.'</label><br>';
5679
+				$out .= '<input class="flat '.$morecss.'" type="radio" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" '.($moreparam ? $moreparam : '');
5680
+				$out .= ' value="'.$keyopt.'"';
5681
+				$out .= ' id="'.$keyprefix.$key.$keysuffix.'_'.$keyopt.'"';
5682
+				$out .= ($value == $keyopt ? 'checked' : '');
5683
+				$out .= '/><label for="'.$keyprefix.$key.$keysuffix.'_'.$keyopt.'">'.$val.'</label><br>';
5684 5684
 			}
5685 5685
 		}
5686 5686
 		elseif ($type == 'chkbxlst')
@@ -5695,24 +5695,24 @@  discard block
 block discarded – undo
5695 5695
 			if (is_array($param['options'])) {
5696 5696
 				$param_list = array_keys($param['options']);
5697 5697
 				$InfoFieldList = explode(":", $param_list[0]);
5698
-				$parentName='';
5699
-				$parentField='';
5698
+				$parentName = '';
5699
+				$parentField = '';
5700 5700
 				// 0 : tableName
5701 5701
 				// 1 : label field name
5702 5702
 				// 2 : key fields name (if differ of rowid)
5703 5703
 				// 3 : key field parent (for dependent lists)
5704 5704
 				// 4 : where clause filter on column or table extrafield, syntax field='value' or extra.field=value
5705
-				$keyList = (empty($InfoFieldList[2]) ? 'rowid' : $InfoFieldList[2] . ' as rowid');
5705
+				$keyList = (empty($InfoFieldList[2]) ? 'rowid' : $InfoFieldList[2].' as rowid');
5706 5706
 
5707
-				if (count($InfoFieldList) > 3 && ! empty($InfoFieldList[3])) {
5708
-					list ( $parentName, $parentField ) = explode('|', $InfoFieldList[3]);
5709
-					$keyList .= ', ' . $parentField;
5707
+				if (count($InfoFieldList) > 3 && !empty($InfoFieldList[3])) {
5708
+					list ($parentName, $parentField) = explode('|', $InfoFieldList[3]);
5709
+					$keyList .= ', '.$parentField;
5710 5710
 				}
5711
-				if (count($InfoFieldList) > 4 && ! empty($InfoFieldList[4])) {
5711
+				if (count($InfoFieldList) > 4 && !empty($InfoFieldList[4])) {
5712 5712
 					if (strpos($InfoFieldList[4], 'extra.') !== false) {
5713
-						$keyList = 'main.' . $InfoFieldList[2] . ' as rowid';
5713
+						$keyList = 'main.'.$InfoFieldList[2].' as rowid';
5714 5714
 					} else {
5715
-						$keyList = $InfoFieldList[2] . ' as rowid';
5715
+						$keyList = $InfoFieldList[2].' as rowid';
5716 5716
 					}
5717 5717
 				}
5718 5718
 
@@ -5723,50 +5723,50 @@  discard block
 block discarded – undo
5723 5723
 				}
5724 5724
 
5725 5725
 				$sqlwhere = '';
5726
-				$sql = 'SELECT ' . $keyList;
5727
-				$sql .= ' FROM ' . MAIN_DB_PREFIX . $InfoFieldList[0];
5728
-				if (! empty($InfoFieldList[4])) {
5726
+				$sql = 'SELECT '.$keyList;
5727
+				$sql .= ' FROM '.MAIN_DB_PREFIX.$InfoFieldList[0];
5728
+				if (!empty($InfoFieldList[4])) {
5729 5729
 
5730 5730
 					// can use SELECT request
5731
-					if (strpos($InfoFieldList[4], '$SEL$')!==false) {
5732
-						$InfoFieldList[4]=str_replace('$SEL$','SELECT',$InfoFieldList[4]);
5731
+					if (strpos($InfoFieldList[4], '$SEL$') !== false) {
5732
+						$InfoFieldList[4] = str_replace('$SEL$', 'SELECT', $InfoFieldList[4]);
5733 5733
 					}
5734 5734
 
5735 5735
 					// current object id can be use into filter
5736
-					if (strpos($InfoFieldList[4], '$ID$')!==false && !empty($objectid)) {
5737
-						$InfoFieldList[4]=str_replace('$ID$',$objectid,$InfoFieldList[4]);
5736
+					if (strpos($InfoFieldList[4], '$ID$') !== false && !empty($objectid)) {
5737
+						$InfoFieldList[4] = str_replace('$ID$', $objectid, $InfoFieldList[4]);
5738 5738
 					} else {
5739
-						$InfoFieldList[4]=str_replace('$ID$','0',$InfoFieldList[4]);
5739
+						$InfoFieldList[4] = str_replace('$ID$', '0', $InfoFieldList[4]);
5740 5740
 					}
5741 5741
 
5742 5742
 					// We have to join on extrafield table
5743 5743
 					if (strpos($InfoFieldList[4], 'extra') !== false) {
5744
-						$sql .= ' as main, ' . MAIN_DB_PREFIX . $InfoFieldList[0] . '_extrafields as extra';
5745
-						$sqlwhere .= ' WHERE extra.fk_object=main.' . $InfoFieldList[2] . ' AND ' . $InfoFieldList[4];
5744
+						$sql .= ' as main, '.MAIN_DB_PREFIX.$InfoFieldList[0].'_extrafields as extra';
5745
+						$sqlwhere .= ' WHERE extra.fk_object=main.'.$InfoFieldList[2].' AND '.$InfoFieldList[4];
5746 5746
 					} else {
5747
-						$sqlwhere .= ' WHERE ' . $InfoFieldList[4];
5747
+						$sqlwhere .= ' WHERE '.$InfoFieldList[4];
5748 5748
 					}
5749 5749
 				} else {
5750 5750
 					$sqlwhere .= ' WHERE 1=1';
5751 5751
 				}
5752 5752
 				// Some tables may have field, some other not. For the moment we disable it.
5753
-				if (in_array($InfoFieldList[0], array ('tablewithentity')))
5753
+				if (in_array($InfoFieldList[0], array('tablewithentity')))
5754 5754
 				{
5755
-					$sqlwhere .= ' AND entity = ' . $conf->entity;
5755
+					$sqlwhere .= ' AND entity = '.$conf->entity;
5756 5756
 				}
5757 5757
 				// $sql.=preg_replace('/^ AND /','',$sqlwhere);
5758 5758
 				// print $sql;
5759 5759
 
5760 5760
 				$sql .= $sqlwhere;
5761
-				dol_syslog(get_class($this) . '::showInputField type=chkbxlst',LOG_DEBUG);
5761
+				dol_syslog(get_class($this).'::showInputField type=chkbxlst', LOG_DEBUG);
5762 5762
 				$resql = $this->db->query($sql);
5763 5763
 				if ($resql) {
5764 5764
 					$num = $this->db->num_rows($resql);
5765 5765
 					$i = 0;
5766 5766
 
5767
-					$data=array();
5767
+					$data = array();
5768 5768
 
5769
-					while ( $i < $num ) {
5769
+					while ($i < $num) {
5770 5770
 						$labeltoshow = '';
5771 5771
 						$obj = $this->db->fetch_object($resql);
5772 5772
 
@@ -5775,8 +5775,8 @@  discard block
 block discarded – undo
5775 5775
 						$fields_label = explode('|', $InfoFieldList[1]);
5776 5776
 						if (is_array($fields_label)) {
5777 5777
 							$notrans = true;
5778
-							foreach ( $fields_label as $field_toshow ) {
5779
-								$labeltoshow .= $obj->$field_toshow . ' ';
5778
+							foreach ($fields_label as $field_toshow) {
5779
+								$labeltoshow .= $obj->$field_toshow.' ';
5780 5780
 							}
5781 5781
 						} else {
5782 5782
 							$labeltoshow = $obj->{$InfoFieldList[1]};
@@ -5784,18 +5784,18 @@  discard block
 block discarded – undo
5784 5784
 						$labeltoshow = dol_trunc($labeltoshow, 45);
5785 5785
 
5786 5786
 						if (is_array($value_arr) && in_array($obj->rowid, $value_arr)) {
5787
-							foreach ( $fields_label as $field_toshow ) {
5787
+							foreach ($fields_label as $field_toshow) {
5788 5788
 								$translabel = $langs->trans($obj->$field_toshow);
5789 5789
 								if ($translabel != $obj->$field_toshow) {
5790
-									$labeltoshow = dol_trunc($translabel, 18) . ' ';
5790
+									$labeltoshow = dol_trunc($translabel, 18).' ';
5791 5791
 								} else {
5792
-									$labeltoshow = dol_trunc($obj->$field_toshow, 18) . ' ';
5792
+									$labeltoshow = dol_trunc($obj->$field_toshow, 18).' ';
5793 5793
 								}
5794 5794
 							}
5795 5795
 
5796
-							$data[$obj->rowid]=$labeltoshow;
5796
+							$data[$obj->rowid] = $labeltoshow;
5797 5797
 						} else {
5798
-							if (! $notrans) {
5798
+							if (!$notrans) {
5799 5799
 								$translabel = $langs->trans($obj->{$InfoFieldList[1]});
5800 5800
 								if ($translabel != $obj->{$InfoFieldList[1]}) {
5801 5801
 									$labeltoshow = dol_trunc($translabel, 18);
@@ -5807,67 +5807,67 @@  discard block
 block discarded – undo
5807 5807
 								$labeltoshow = '(not defined)';
5808 5808
 
5809 5809
 								if (is_array($value_arr) && in_array($obj->rowid, $value_arr)) {
5810
-									$data[$obj->rowid]=$labeltoshow;
5810
+									$data[$obj->rowid] = $labeltoshow;
5811 5811
 								}
5812 5812
 
5813
-								if (! empty($InfoFieldList[3]) && $parentField) {
5814
-									$parent = $parentName . ':' . $obj->{$parentField};
5813
+								if (!empty($InfoFieldList[3]) && $parentField) {
5814
+									$parent = $parentName.':'.$obj->{$parentField};
5815 5815
 								}
5816 5816
 
5817
-								$data[$obj->rowid]=$labeltoshow;
5817
+								$data[$obj->rowid] = $labeltoshow;
5818 5818
 						}
5819 5819
 
5820
-						$i ++;
5820
+						$i++;
5821 5821
 					}
5822 5822
 					$this->db->free($resql);
5823 5823
 
5824
-					$out=$form->multiselectarray($keyprefix.$key.$keysuffix, $data, $value_arr, '', 0, '', 0, '100%');
5824
+					$out = $form->multiselectarray($keyprefix.$key.$keysuffix, $data, $value_arr, '', 0, '', 0, '100%');
5825 5825
 				} else {
5826
-					print 'Error in request ' . $sql . ' ' . $this->db->lasterror() . '. Check setup of extra parameters.<br>';
5826
+					print 'Error in request '.$sql.' '.$this->db->lasterror().'. Check setup of extra parameters.<br>';
5827 5827
 				}
5828 5828
 			}
5829 5829
 		}
5830 5830
 		elseif ($type == 'link')
5831 5831
 		{
5832
-			$param_list=array_keys($param['options']);				// $param_list='ObjectName:classPath'
5833
-			$showempty=(($required && $default != '')?0:1);
5834
-			$out=$form->selectForForms($param_list[0], $keyprefix.$key.$keysuffix, $value, $showempty);
5832
+			$param_list = array_keys($param['options']); // $param_list='ObjectName:classPath'
5833
+			$showempty = (($required && $default != '') ? 0 : 1);
5834
+			$out = $form->selectForForms($param_list[0], $keyprefix.$key.$keysuffix, $value, $showempty);
5835 5835
 			if ($conf->global->MAIN_FEATURES_LEVEL >= 2)
5836 5836
 			{
5837
-            			list($class,$classfile)=explode(':',$param_list[0]);
5838
-            			if (file_exists(dol_buildpath(dirname(dirname($classfile)).'/card.php'))) $url_path=dol_buildpath(dirname(dirname($classfile)).'/card.php',1);
5839
-            			else $url_path=dol_buildpath(dirname(dirname($classfile)).'/'.$class.'_card.php',1);
5840
-            			$out.='<a class="butActionNew" href="'.$url_path.'?action=create&backtopage='.$_SERVER['PHP_SELF'].'"><span class="fa fa-plus-circle valignmiddle"></span></a>';
5837
+            			list($class, $classfile) = explode(':', $param_list[0]);
5838
+            			if (file_exists(dol_buildpath(dirname(dirname($classfile)).'/card.php'))) $url_path = dol_buildpath(dirname(dirname($classfile)).'/card.php', 1);
5839
+            			else $url_path = dol_buildpath(dirname(dirname($classfile)).'/'.$class.'_card.php', 1);
5840
+            			$out .= '<a class="butActionNew" href="'.$url_path.'?action=create&backtopage='.$_SERVER['PHP_SELF'].'"><span class="fa fa-plus-circle valignmiddle"></span></a>';
5841 5841
             			// TODO Add Javascript code to add input fields contents to new elements urls
5842 5842
 			}
5843 5843
 		}
5844 5844
 		elseif ($type == 'password')
5845 5845
 		{
5846 5846
 			// If prefix is 'search_', field is used as a filter, we use a common text field.
5847
-			$out='<input type="'.($keyprefix=='search_'?'text':'password').'" class="flat '.$morecss.'" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" value="'.$value.'" '.($moreparam?$moreparam:'').'>';
5847
+			$out = '<input type="'.($keyprefix == 'search_' ? 'text' : 'password').'" class="flat '.$morecss.'" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'" value="'.$value.'" '.($moreparam ? $moreparam : '').'>';
5848 5848
 		}
5849 5849
 		elseif ($type == 'array')
5850 5850
 		{
5851 5851
 			$newval = $val;
5852 5852
 			$newval['type'] = 'varchar(256)';
5853 5853
 
5854
-			$out='';
5854
+			$out = '';
5855 5855
 
5856 5856
 			$inputs = array();
5857
-			if(! empty($value)) {
5858
-				foreach($value as $option) {
5859
-					$out.= '<span><a class="'.dol_escape_htmltag($keyprefix.$key.$keysuffix).'_del" href="javascript:;"><span class="fa fa-minus-circle valignmiddle"></span></a> ';
5860
-					$out.= $this->showInputField($newval, $keyprefix.$key.$keysuffix.'[]', $option, $moreparam, '', '', $showsize).'<br></span>';
5857
+			if (!empty($value)) {
5858
+				foreach ($value as $option) {
5859
+					$out .= '<span><a class="'.dol_escape_htmltag($keyprefix.$key.$keysuffix).'_del" href="javascript:;"><span class="fa fa-minus-circle valignmiddle"></span></a> ';
5860
+					$out .= $this->showInputField($newval, $keyprefix.$key.$keysuffix.'[]', $option, $moreparam, '', '', $showsize).'<br></span>';
5861 5861
 				}
5862 5862
 			}
5863 5863
 
5864
-			$out.= '<a id="'.dol_escape_htmltag($keyprefix.$key.$keysuffix).'_add" href="javascript:;"><span class="fa fa-plus-circle valignmiddle"></span></a>';
5864
+			$out .= '<a id="'.dol_escape_htmltag($keyprefix.$key.$keysuffix).'_add" href="javascript:;"><span class="fa fa-plus-circle valignmiddle"></span></a>';
5865 5865
 
5866 5866
 			$newInput = '<span><a class="'.dol_escape_htmltag($keyprefix.$key.$keysuffix).'_del" href="javascript:;"><span class="fa fa-minus-circle valignmiddle"></span></a> ';
5867
-			$newInput.= $this->showInputField($newval, $keyprefix.$key.$keysuffix.'[]', '', $moreparam, '', '', $showsize).'<br></span>';
5867
+			$newInput .= $this->showInputField($newval, $keyprefix.$key.$keysuffix.'[]', '', $moreparam, '', '', $showsize).'<br></span>';
5868 5868
 
5869
-			if(! empty($conf->use_javascript_ajax)) {
5870
-				$out.= '
5869
+			if (!empty($conf->use_javascript_ajax)) {
5870
+				$out .= '
5871 5871
 					<script type="text/javascript">
5872 5872
 					$(document).ready(function() {
5873 5873
 						$("a#'.dol_escape_js($keyprefix.$key.$keysuffix).'_add").click(function() {
@@ -5882,7 +5882,7 @@  discard block
 block discarded – undo
5882 5882
 			}
5883 5883
 		}
5884 5884
 		if (!empty($hidden)) {
5885
-			$out='<input type="hidden" value="'.$value.'" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'"/>';
5885
+			$out = '<input type="hidden" value="'.$value.'" name="'.$keyprefix.$key.$keysuffix.'" id="'.$keyprefix.$key.$keysuffix.'"/>';
5886 5886
 		}
5887 5887
 		/* Add comments
5888 5888
 		 if ($type == 'date') $out.=' (YYYY-MM-DD)';
@@ -5904,14 +5904,14 @@  discard block
 block discarded – undo
5904 5904
 	 * @param  mixed   $showsize       Value for css to define size. May also be a numeric.
5905 5905
 	 * @return string
5906 5906
 	 */
5907
-	function showOutputField($val, $key, $value, $moreparam='', $keysuffix='', $keyprefix='', $showsize=0)
5907
+	function showOutputField($val, $key, $value, $moreparam = '', $keysuffix = '', $keyprefix = '', $showsize = 0)
5908 5908
 	{
5909
-		global $conf,$langs,$form;
5909
+		global $conf, $langs, $form;
5910 5910
 
5911
-		if (! is_object($form))
5911
+		if (!is_object($form))
5912 5912
 		{
5913 5913
 			require_once DOL_DOCUMENT_ROOT.'/core/class/html.form.class.php';
5914
-			$form=new Form($this->db);
5914
+			$form = new Form($this->db);
5915 5915
 		}
5916 5916
 
5917 5917
 		$objectid = $this->id;
@@ -5922,28 +5922,28 @@  discard block
 block discarded – undo
5922 5922
 		// Convert var to be able to share same code than showOutputField of extrafields
5923 5923
 		if (preg_match('/varchar\((\d+)\)/', $type, $reg))
5924 5924
 		{
5925
-			$type = 'varchar';		// convert varchar(xx) int varchar
5925
+			$type = 'varchar'; // convert varchar(xx) int varchar
5926 5926
 			$size = $reg[1];
5927 5927
 		}
5928
-		elseif (preg_match('/varchar/', $type)) $type = 'varchar';		// convert varchar(xx) int varchar
5929
-		if (is_array($val['arrayofkeyval'])) $type='select';
5930
-		if (preg_match('/^integer:(.*):(.*)/i', $val['type'], $reg)) $type='link';
5928
+		elseif (preg_match('/varchar/', $type)) $type = 'varchar'; // convert varchar(xx) int varchar
5929
+		if (is_array($val['arrayofkeyval'])) $type = 'select';
5930
+		if (preg_match('/^integer:(.*):(.*)/i', $val['type'], $reg)) $type = 'link';
5931 5931
 
5932
-		$default=$val['default'];
5933
-		$computed=$val['computed'];
5934
-		$unique=$val['unique'];
5935
-		$required=$val['required'];
5936
-		$param=$val['param'];
5932
+		$default = $val['default'];
5933
+		$computed = $val['computed'];
5934
+		$unique = $val['unique'];
5935
+		$required = $val['required'];
5936
+		$param = $val['param'];
5937 5937
 		if (is_array($val['arrayofkeyval'])) $param['options'] = $val['arrayofkeyval'];
5938 5938
 		if (preg_match('/^integer:(.*):(.*)/i', $val['type'], $reg))
5939 5939
 		{
5940
-			$type='link';
5941
-			$param['options']=array($reg[1].':'.$reg[2]=>$reg[1].':'.$reg[2]);
5940
+			$type = 'link';
5941
+			$param['options'] = array($reg[1].':'.$reg[2]=>$reg[1].':'.$reg[2]);
5942 5942
 		}
5943
-		$langfile=$val['langfile'];
5944
-		$list=$val['list'];
5945
-		$help=$val['help'];
5946
-		$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)
5943
+		$langfile = $val['langfile'];
5944
+		$list = $val['list'];
5945
+		$help = $val['help'];
5946
+		$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)
5947 5947
 
5948 5948
 		if ($hidden) return '';
5949 5949
 
@@ -5967,18 +5967,18 @@  discard block
 block discarded – undo
5967 5967
 				//$showsize=19;
5968 5968
 				$showsize = 'minwidth200imp';
5969 5969
 			}
5970
-			elseif (in_array($type,array('int','double','price')))
5970
+			elseif (in_array($type, array('int', 'double', 'price')))
5971 5971
 			{
5972 5972
 				//$showsize=10;
5973 5973
 				$showsize = 'maxwidth75';
5974 5974
 			}
5975 5975
 			elseif ($type == 'url')
5976 5976
 			{
5977
-				$showsize='minwidth400';
5977
+				$showsize = 'minwidth400';
5978 5978
 			}
5979 5979
 			elseif ($type == 'boolean')
5980 5980
 			{
5981
-				$showsize='';
5981
+				$showsize = '';
5982 5982
 			}
5983 5983
 			else
5984 5984
 			{
@@ -5999,90 +5999,90 @@  discard block
 block discarded – undo
5999 5999
 		}
6000 6000
 
6001 6001
 		// Format output value differently according to properties of field
6002
-		if ($key == 'ref' && method_exists($this, 'getNomUrl')) $value=$this->getNomUrl(1, '', 0, '', 1);
6003
-		elseif ($key == 'status' && method_exists($this, 'getLibStatut')) $value=$this->getLibStatut(3);
6002
+		if ($key == 'ref' && method_exists($this, 'getNomUrl')) $value = $this->getNomUrl(1, '', 0, '', 1);
6003
+		elseif ($key == 'status' && method_exists($this, 'getLibStatut')) $value = $this->getLibStatut(3);
6004 6004
 		elseif ($type == 'date')
6005 6005
 		{
6006
-			if(! empty($value)) {
6007
-				$value=dol_print_date($value,'day');
6006
+			if (!empty($value)) {
6007
+				$value = dol_print_date($value, 'day');
6008 6008
 			} else {
6009
-				$value='';
6009
+				$value = '';
6010 6010
 			}
6011 6011
 		}
6012 6012
 		elseif ($type == 'datetime')
6013 6013
 		{
6014
-			if(! empty($value)) {
6015
-				$value=dol_print_date($value,'dayhour');
6014
+			if (!empty($value)) {
6015
+				$value = dol_print_date($value, 'dayhour');
6016 6016
 			} else {
6017
-				$value='';
6017
+				$value = '';
6018 6018
 			}
6019 6019
 		}
6020 6020
 		elseif ($type == 'double')
6021 6021
 		{
6022 6022
 			if (!empty($value)) {
6023
-				$value=price($value);
6023
+				$value = price($value);
6024 6024
 			}
6025 6025
 		}
6026 6026
 		elseif ($type == 'boolean')
6027 6027
 		{
6028
-			$checked='';
6028
+			$checked = '';
6029 6029
 			if (!empty($value)) {
6030
-				$checked=' checked ';
6030
+				$checked = ' checked ';
6031 6031
 			}
6032
-			$value='<input type="checkbox" '.$checked.' '.($moreparam?$moreparam:'').' readonly disabled>';
6032
+			$value = '<input type="checkbox" '.$checked.' '.($moreparam ? $moreparam : '').' readonly disabled>';
6033 6033
 		}
6034 6034
 		elseif ($type == 'mail')
6035 6035
 		{
6036
-			$value=dol_print_email($value,0,0,0,64,1,1);
6036
+			$value = dol_print_email($value, 0, 0, 0, 64, 1, 1);
6037 6037
 		}
6038 6038
 		elseif ($type == 'url')
6039 6039
 		{
6040
-			$value=dol_print_url($value,'_blank',32,1);
6040
+			$value = dol_print_url($value, '_blank', 32, 1);
6041 6041
 		}
6042 6042
 		elseif ($type == 'phone')
6043 6043
 		{
6044
-			$value=dol_print_phone($value, '', 0, 0, '', '&nbsp;', 1);
6044
+			$value = dol_print_phone($value, '', 0, 0, '', '&nbsp;', 1);
6045 6045
 		}
6046 6046
 		elseif ($type == 'price')
6047 6047
 		{
6048
-			$value=price($value,0,$langs,0,0,-1,$conf->currency);
6048
+			$value = price($value, 0, $langs, 0, 0, -1, $conf->currency);
6049 6049
 		}
6050 6050
 		elseif ($type == 'select')
6051 6051
 		{
6052
-			$value=$param['options'][$value];
6052
+			$value = $param['options'][$value];
6053 6053
 		}
6054 6054
 		elseif ($type == 'sellist')
6055 6055
 		{
6056
-			$param_list=array_keys($param['options']);
6056
+			$param_list = array_keys($param['options']);
6057 6057
 			$InfoFieldList = explode(":", $param_list[0]);
6058 6058
 
6059
-			$selectkey="rowid";
6060
-			$keyList='rowid';
6059
+			$selectkey = "rowid";
6060
+			$keyList = 'rowid';
6061 6061
 
6062
-			if (count($InfoFieldList)>=3)
6062
+			if (count($InfoFieldList) >= 3)
6063 6063
 			{
6064 6064
 				$selectkey = $InfoFieldList[2];
6065
-				$keyList=$InfoFieldList[2].' as rowid';
6065
+				$keyList = $InfoFieldList[2].' as rowid';
6066 6066
 			}
6067 6067
 
6068
-			$fields_label = explode('|',$InfoFieldList[1]);
6069
-			if(is_array($fields_label)) {
6070
-				$keyList .=', ';
6068
+			$fields_label = explode('|', $InfoFieldList[1]);
6069
+			if (is_array($fields_label)) {
6070
+				$keyList .= ', ';
6071 6071
 				$keyList .= implode(', ', $fields_label);
6072 6072
 			}
6073 6073
 
6074 6074
 			$sql = 'SELECT '.$keyList;
6075
-			$sql.= ' FROM '.MAIN_DB_PREFIX .$InfoFieldList[0];
6076
-			if (strpos($InfoFieldList[4], 'extra')!==false)
6075
+			$sql .= ' FROM '.MAIN_DB_PREFIX.$InfoFieldList[0];
6076
+			if (strpos($InfoFieldList[4], 'extra') !== false)
6077 6077
 			{
6078
-				$sql.= ' as main';
6078
+				$sql .= ' as main';
6079 6079
 			}
6080
-			if ($selectkey=='rowid' && empty($value)) {
6081
-				$sql.= " WHERE ".$selectkey."=0";
6082
-			} elseif ($selectkey=='rowid') {
6083
-				$sql.= " WHERE ".$selectkey."=".$this->db->escape($value);
6084
-			}else {
6085
-				$sql.= " WHERE ".$selectkey."='".$this->db->escape($value)."'";
6080
+			if ($selectkey == 'rowid' && empty($value)) {
6081
+				$sql .= " WHERE ".$selectkey."=0";
6082
+			} elseif ($selectkey == 'rowid') {
6083
+				$sql .= " WHERE ".$selectkey."=".$this->db->escape($value);
6084
+			} else {
6085
+				$sql .= " WHERE ".$selectkey."='".$this->db->escape($value)."'";
6086 6086
 			}
6087 6087
 
6088 6088
 			//$sql.= ' AND entity = '.$conf->entity;
@@ -6091,38 +6091,38 @@  discard block
 block discarded – undo
6091 6091
 			$resql = $this->db->query($sql);
6092 6092
 			if ($resql)
6093 6093
 			{
6094
-				$value='';	// value was used, so now we reste it to use it to build final output
6094
+				$value = ''; // value was used, so now we reste it to use it to build final output
6095 6095
 
6096 6096
 				$obj = $this->db->fetch_object($resql);
6097 6097
 
6098 6098
 				// Several field into label (eq table:code|libelle:rowid)
6099
-				$fields_label = explode('|',$InfoFieldList[1]);
6099
+				$fields_label = explode('|', $InfoFieldList[1]);
6100 6100
 
6101
-				if(is_array($fields_label) && count($fields_label)>1)
6101
+				if (is_array($fields_label) && count($fields_label) > 1)
6102 6102
 				{
6103 6103
 					foreach ($fields_label as $field_toshow)
6104 6104
 					{
6105
-						$translabel='';
6105
+						$translabel = '';
6106 6106
 						if (!empty($obj->$field_toshow)) {
6107
-							$translabel=$langs->trans($obj->$field_toshow);
6107
+							$translabel = $langs->trans($obj->$field_toshow);
6108 6108
 						}
6109
-						if ($translabel!=$field_toshow) {
6110
-							$value.=dol_trunc($translabel,18).' ';
6111
-						}else {
6112
-							$value.=$obj->$field_toshow.' ';
6109
+						if ($translabel != $field_toshow) {
6110
+							$value .= dol_trunc($translabel, 18).' ';
6111
+						} else {
6112
+							$value .= $obj->$field_toshow.' ';
6113 6113
 						}
6114 6114
 					}
6115 6115
 				}
6116 6116
 				else
6117 6117
 				{
6118
-					$translabel='';
6118
+					$translabel = '';
6119 6119
 					if (!empty($obj->{$InfoFieldList[1]})) {
6120
-						$translabel=$langs->trans($obj->{$InfoFieldList[1]});
6120
+						$translabel = $langs->trans($obj->{$InfoFieldList[1]});
6121 6121
 					}
6122
-					if ($translabel!=$obj->{$InfoFieldList[1]}) {
6123
-						$value=dol_trunc($translabel,18);
6124
-					}else {
6125
-						$value=$obj->{$InfoFieldList[1]};
6122
+					if ($translabel != $obj->{$InfoFieldList[1]}) {
6123
+						$value = dol_trunc($translabel, 18);
6124
+					} else {
6125
+						$value = $obj->{$InfoFieldList[1]};
6126 6126
 					}
6127 6127
 				}
6128 6128
 			}
@@ -6130,18 +6130,18 @@  discard block
 block discarded – undo
6130 6130
 		}
6131 6131
 		elseif ($type == 'radio')
6132 6132
 		{
6133
-			$value=$param['options'][$value];
6133
+			$value = $param['options'][$value];
6134 6134
 		}
6135 6135
 		elseif ($type == 'checkbox')
6136 6136
 		{
6137
-			$value_arr=explode(',',$value);
6138
-			$value='';
6139
-			if (is_array($value_arr) && count($value_arr)>0)
6137
+			$value_arr = explode(',', $value);
6138
+			$value = '';
6139
+			if (is_array($value_arr) && count($value_arr) > 0)
6140 6140
 			{
6141 6141
 				foreach ($value_arr as $keyval=>$valueval) {
6142
-					$toprint[]='<li class="select2-search-choice-dolibarr noborderoncategories" style="background: #aaa">'.$param['options'][$valueval].'</li>';
6142
+					$toprint[] = '<li class="select2-search-choice-dolibarr noborderoncategories" style="background: #aaa">'.$param['options'][$valueval].'</li>';
6143 6143
 				}
6144
-				$value='<div class="select2-container-multi-dolibarr" style="width: 90%;"><ul class="select2-choices-dolibarr">'.implode(' ', $toprint).'</ul></div>';
6144
+				$value = '<div class="select2-container-multi-dolibarr" style="width: 90%;"><ul class="select2-choices-dolibarr">'.implode(' ', $toprint).'</ul></div>';
6145 6145
 			}
6146 6146
 		}
6147 6147
 		elseif ($type == 'chkbxlst')
@@ -6156,7 +6156,7 @@  discard block
 block discarded – undo
6156 6156
 
6157 6157
 			if (count($InfoFieldList) >= 3) {
6158 6158
 				$selectkey = $InfoFieldList[2];
6159
-				$keyList = $InfoFieldList[2] . ' as rowid';
6159
+				$keyList = $InfoFieldList[2].' as rowid';
6160 6160
 			}
6161 6161
 
6162 6162
 			$fields_label = explode('|', $InfoFieldList[1]);
@@ -6165,75 +6165,75 @@  discard block
 block discarded – undo
6165 6165
 				$keyList .= implode(', ', $fields_label);
6166 6166
 			}
6167 6167
 
6168
-			$sql = 'SELECT ' . $keyList;
6169
-			$sql .= ' FROM ' . MAIN_DB_PREFIX . $InfoFieldList[0];
6168
+			$sql = 'SELECT '.$keyList;
6169
+			$sql .= ' FROM '.MAIN_DB_PREFIX.$InfoFieldList[0];
6170 6170
 			if (strpos($InfoFieldList[4], 'extra') !== false) {
6171 6171
 				$sql .= ' as main';
6172 6172
 			}
6173 6173
 			// $sql.= " WHERE ".$selectkey."='".$this->db->escape($value)."'";
6174 6174
 			// $sql.= ' AND entity = '.$conf->entity;
6175 6175
 
6176
-			dol_syslog(get_class($this) . ':showOutputField:$type=chkbxlst',LOG_DEBUG);
6176
+			dol_syslog(get_class($this).':showOutputField:$type=chkbxlst', LOG_DEBUG);
6177 6177
 			$resql = $this->db->query($sql);
6178 6178
 			if ($resql) {
6179 6179
 				$value = ''; // value was used, so now we reste it to use it to build final output
6180
-				$toprint=array();
6181
-				while ( $obj = $this->db->fetch_object($resql) ) {
6180
+				$toprint = array();
6181
+				while ($obj = $this->db->fetch_object($resql)) {
6182 6182
 
6183 6183
 					// Several field into label (eq table:code|libelle:rowid)
6184 6184
 					$fields_label = explode('|', $InfoFieldList[1]);
6185 6185
 					if (is_array($value_arr) && in_array($obj->rowid, $value_arr)) {
6186 6186
 						if (is_array($fields_label) && count($fields_label) > 1) {
6187
-							foreach ( $fields_label as $field_toshow ) {
6187
+							foreach ($fields_label as $field_toshow) {
6188 6188
 								$translabel = '';
6189
-								if (! empty($obj->$field_toshow)) {
6189
+								if (!empty($obj->$field_toshow)) {
6190 6190
 									$translabel = $langs->trans($obj->$field_toshow);
6191 6191
 								}
6192 6192
 								if ($translabel != $field_toshow) {
6193
-									$toprint[]='<li class="select2-search-choice-dolibarr noborderoncategories" style="background: #aaa">'.dol_trunc($translabel, 18).'</li>';
6193
+									$toprint[] = '<li class="select2-search-choice-dolibarr noborderoncategories" style="background: #aaa">'.dol_trunc($translabel, 18).'</li>';
6194 6194
 								} else {
6195
-									$toprint[]='<li class="select2-search-choice-dolibarr noborderoncategories" style="background: #aaa">'.$obj->$field_toshow.'</li>';
6195
+									$toprint[] = '<li class="select2-search-choice-dolibarr noborderoncategories" style="background: #aaa">'.$obj->$field_toshow.'</li>';
6196 6196
 								}
6197 6197
 							}
6198 6198
 						} else {
6199 6199
 							$translabel = '';
6200
-							if (! empty($obj->{$InfoFieldList[1]})) {
6200
+							if (!empty($obj->{$InfoFieldList[1]})) {
6201 6201
 								$translabel = $langs->trans($obj->{$InfoFieldList[1]});
6202 6202
 							}
6203 6203
 							if ($translabel != $obj->{$InfoFieldList[1]}) {
6204
-								$toprint[]='<li class="select2-search-choice-dolibarr noborderoncategories" style="background: #aaa">'.dol_trunc($translabel, 18).'</li>';
6204
+								$toprint[] = '<li class="select2-search-choice-dolibarr noborderoncategories" style="background: #aaa">'.dol_trunc($translabel, 18).'</li>';
6205 6205
 							} else {
6206
-								$toprint[]='<li class="select2-search-choice-dolibarr noborderoncategories" style="background: #aaa">'.$obj->{$InfoFieldList[1]}.'</li>';
6206
+								$toprint[] = '<li class="select2-search-choice-dolibarr noborderoncategories" style="background: #aaa">'.$obj->{$InfoFieldList[1]}.'</li>';
6207 6207
 							}
6208 6208
 						}
6209 6209
 					}
6210 6210
 				}
6211
-				$value='<div class="select2-container-multi-dolibarr" style="width: 90%;"><ul class="select2-choices-dolibarr">'.implode(' ', $toprint).'</ul></div>';
6211
+				$value = '<div class="select2-container-multi-dolibarr" style="width: 90%;"><ul class="select2-choices-dolibarr">'.implode(' ', $toprint).'</ul></div>';
6212 6212
 			} else {
6213
-				dol_syslog(get_class($this) . '::showOutputField error ' . $this->db->lasterror(), LOG_WARNING);
6213
+				dol_syslog(get_class($this).'::showOutputField error '.$this->db->lasterror(), LOG_WARNING);
6214 6214
 			}
6215 6215
 		}
6216 6216
 		elseif ($type == 'link')
6217 6217
 		{
6218
-			$out='';
6218
+			$out = '';
6219 6219
 
6220 6220
 			// only if something to display (perf)
6221 6221
 			if ($value)
6222 6222
 			{
6223
-				$param_list=array_keys($param['options']);				// $param_list='ObjectName:classPath'
6223
+				$param_list = array_keys($param['options']); // $param_list='ObjectName:classPath'
6224 6224
 
6225 6225
 				$InfoFieldList = explode(":", $param_list[0]);
6226
-				$classname=$InfoFieldList[0];
6227
-				$classpath=$InfoFieldList[1];
6228
-				$getnomurlparam=(empty($InfoFieldList[2]) ? 3 : $InfoFieldList[2]);
6229
-				if (! empty($classpath))
6226
+				$classname = $InfoFieldList[0];
6227
+				$classpath = $InfoFieldList[1];
6228
+				$getnomurlparam = (empty($InfoFieldList[2]) ? 3 : $InfoFieldList[2]);
6229
+				if (!empty($classpath))
6230 6230
 				{
6231 6231
 					dol_include_once($InfoFieldList[1]);
6232 6232
 					if ($classname && class_exists($classname))
6233 6233
 					{
6234 6234
 						$object = new $classname($this->db);
6235 6235
 						$object->fetch($value);
6236
-						$value=$object->getNomUrl($getnomurlparam);
6236
+						$value = $object->getNomUrl($getnomurlparam);
6237 6237
 					}
6238 6238
 				}
6239 6239
 				else
@@ -6242,15 +6242,15 @@  discard block
 block discarded – undo
6242 6242
 					return 'Error bad setup of extrafield';
6243 6243
 				}
6244 6244
 			}
6245
-			else $value='';
6245
+			else $value = '';
6246 6246
 		}
6247 6247
 		elseif ($type == 'text' || $type == 'html')
6248 6248
 		{
6249
-			$value=dol_htmlentitiesbr($value);
6249
+			$value = dol_htmlentitiesbr($value);
6250 6250
 		}
6251 6251
 		elseif ($type == 'password')
6252 6252
 		{
6253
-			$value=preg_replace('/./i','*',$value);
6253
+			$value = preg_replace('/./i', '*', $value);
6254 6254
 		}
6255 6255
 		elseif ($type == 'array')
6256 6256
 		{
@@ -6258,7 +6258,7 @@  discard block
 block discarded – undo
6258 6258
 		}
6259 6259
 
6260 6260
 		//print $type.'-'.$size;
6261
-		$out=$value;
6261
+		$out = $value;
6262 6262
 
6263 6263
 		return $out;
6264 6264
 	}
@@ -6275,11 +6275,11 @@  discard block
 block discarded – undo
6275 6275
 	 * @param	string		$onetrtd		All fields in same tr td
6276 6276
 	 * @return 	string
6277 6277
 	 */
6278
-	function showOptionals($extrafields, $mode='view', $params=null, $keysuffix='', $keyprefix='', $onetrtd=0)
6278
+	function showOptionals($extrafields, $mode = 'view', $params = null, $keysuffix = '', $keyprefix = '', $onetrtd = 0)
6279 6279
 	{
6280 6280
 		global $db, $conf, $langs, $action, $form;
6281 6281
 
6282
-		if (! is_object($form)) $form=new Form($db);
6282
+		if (!is_object($form)) $form = new Form($db);
6283 6283
 
6284 6284
 		$out = '';
6285 6285
 
@@ -6290,10 +6290,10 @@  discard block
 block discarded – undo
6290 6290
 			$out .= "\n";
6291 6291
 
6292 6292
 			$e = 0;
6293
-			foreach($extrafields->attributes[$this->table_element]['label'] as $key=>$label)
6293
+			foreach ($extrafields->attributes[$this->table_element]['label'] as $key=>$label)
6294 6294
 			{
6295 6295
 				// Show only the key field in params
6296
-				if (is_array($params) && array_key_exists('onlykey',$params) && $key != $params['onlykey']) continue;
6296
+				if (is_array($params) && array_key_exists('onlykey', $params) && $key != $params['onlykey']) continue;
6297 6297
 
6298 6298
 				$enabled = 1;
6299 6299
 				if ($enabled && isset($extrafields->attributes[$this->table_element]['list'][$key]))
@@ -6307,25 +6307,25 @@  discard block
 block discarded – undo
6307 6307
 					$perms = dol_eval($extrafields->attributes[$this->table_element]['perms'][$key], 1);
6308 6308
 				}
6309 6309
 
6310
-				if (($mode == 'create' || $mode == 'edit') && abs($enabled) != 1 && abs($enabled) != 3) continue;	// <> -1 and <> 1 and <> 3 = not visible on forms, only on list
6310
+				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 6311
 				if (empty($perms)) continue;
6312 6312
 
6313 6313
 				// Load language if required
6314
-				if (! empty($extrafields->attributes[$this->table_element]['langfile'][$key])) $langs->load($extrafields->attributes[$this->table_element]['langfile'][$key]);
6314
+				if (!empty($extrafields->attributes[$this->table_element]['langfile'][$key])) $langs->load($extrafields->attributes[$this->table_element]['langfile'][$key]);
6315 6315
 
6316
-				$colspan='3';
6317
-				if (is_array($params) && count($params)>0) {
6318
-					if (array_key_exists('colspan',$params)) {
6319
-						$colspan=$params['colspan'];
6316
+				$colspan = '3';
6317
+				if (is_array($params) && count($params) > 0) {
6318
+					if (array_key_exists('colspan', $params)) {
6319
+						$colspan = $params['colspan'];
6320 6320
 					}
6321 6321
 				}
6322 6322
 
6323
-				switch($mode) {
6323
+				switch ($mode) {
6324 6324
 					case "view":
6325
-						$value=$this->array_options["options_".$key.$keysuffix];
6325
+						$value = $this->array_options["options_".$key.$keysuffix];
6326 6326
 						break;
6327 6327
 					case "edit":
6328
-						$getposttemp = GETPOST($keyprefix.'options_'.$key.$keysuffix, 'none');				// GETPOST can get value from GET, POST or setup of default values.
6328
+						$getposttemp = GETPOST($keyprefix.'options_'.$key.$keysuffix, 'none'); // GETPOST can get value from GET, POST or setup of default values.
6329 6329
 						// GETPOST("options_" . $key) can be 'abc' or array(0=>'abc')
6330 6330
 						if (is_array($getposttemp) || $getposttemp != '' || GETPOSTISSET($keyprefix.'options_'.$key.$keysuffix))
6331 6331
 						{
@@ -6336,7 +6336,7 @@  discard block
 block discarded – undo
6336 6336
 								$value = $getposttemp;
6337 6337
 							}
6338 6338
 						} else {
6339
-							$value = $this->array_options["options_" . $key];			// No GET, no POST, no default value, so we take value of object.
6339
+							$value = $this->array_options["options_".$key]; // No GET, no POST, no default value, so we take value of object.
6340 6340
 						}
6341 6341
 						//var_dump($keyprefix.' - '.$key.' - '.$keysuffix.' - '.$keyprefix.'options_'.$key.$keysuffix.' - '.$this->array_options["options_".$key.$keysuffix].' - '.$getposttemp.' - '.$value);
6342 6342
 						break;
@@ -6348,11 +6348,11 @@  discard block
 block discarded – undo
6348 6348
 				}
6349 6349
 				else
6350 6350
 				{
6351
-					$csstyle='';
6352
-					$class=(!empty($extrafields->attributes[$this->table_element]['hidden'][$key]) ? 'hideobject ' : '');
6353
-					if (is_array($params) && count($params)>0) {
6354
-						if (array_key_exists('style',$params)) {
6355
-							$csstyle=$params['style'];
6351
+					$csstyle = '';
6352
+					$class = (!empty($extrafields->attributes[$this->table_element]['hidden'][$key]) ? 'hideobject ' : '');
6353
+					if (is_array($params) && count($params) > 0) {
6354
+						if (array_key_exists('style', $params)) {
6355
+							$csstyle = $params['style'];
6356 6356
 						}
6357 6357
 					}
6358 6358
 
@@ -6365,43 +6365,43 @@  discard block
 block discarded – undo
6365 6365
 
6366 6366
 					$out .= '<tr id="'.$html_id.'" '.$csstyle.' class="'.$class.$this->element.'_extras_'.$key.'" '.$domData.' >';
6367 6367
 
6368
-					if (! empty($conf->global->MAIN_EXTRAFIELDS_USE_TWO_COLUMS) && ($e % 2) == 0)
6368
+					if (!empty($conf->global->MAIN_EXTRAFIELDS_USE_TWO_COLUMS) && ($e % 2) == 0)
6369 6369
 					{
6370
-						if (! empty($conf->global->MAIN_EXTRAFIELDS_USE_TWO_COLUMS) && ($e % 2) == 0) { $colspan='0'; }
6370
+						if (!empty($conf->global->MAIN_EXTRAFIELDS_USE_TWO_COLUMS) && ($e % 2) == 0) { $colspan = '0'; }
6371 6371
 					}
6372 6372
 
6373 6373
 					if ($action == 'selectlines') { $colspan++; }
6374 6374
 
6375 6375
 					// Convert date into timestamp format (value in memory must be a timestamp)
6376
-					if (in_array($extrafields->attributes[$this->table_element]['type'][$key],array('date','datetime')))
6376
+					if (in_array($extrafields->attributes[$this->table_element]['type'][$key], array('date', 'datetime')))
6377 6377
 					{
6378
-						$datenotinstring = $this->array_options['options_' . $key];
6379
-						if (! is_numeric($this->array_options['options_' . $key]))	// For backward compatibility
6378
+						$datenotinstring = $this->array_options['options_'.$key];
6379
+						if (!is_numeric($this->array_options['options_'.$key]))	// For backward compatibility
6380 6380
 						{
6381 6381
 							$datenotinstring = $this->db->jdate($datenotinstring);
6382 6382
 						}
6383
-						$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;
6383
+						$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 6384
 					}
6385 6385
 					// Convert float submited string into real php numeric (value in memory must be a php numeric)
6386
-					if (in_array($extrafields->attributes[$this->table_element]['type'][$key],array('price','double')))
6386
+					if (in_array($extrafields->attributes[$this->table_element]['type'][$key], array('price', 'double')))
6387 6387
 					{
6388
-						$value = GETPOSTISSET($keyprefix.'options_'.$key.$keysuffix)?price2num(GETPOST($keyprefix.'options_'.$key.$keysuffix, 'alpha', 3)):$this->array_options['options_'.$key];
6388
+						$value = GETPOSTISSET($keyprefix.'options_'.$key.$keysuffix) ?price2num(GETPOST($keyprefix.'options_'.$key.$keysuffix, 'alpha', 3)) : $this->array_options['options_'.$key];
6389 6389
 					}
6390 6390
 
6391 6391
 					$labeltoshow = $langs->trans($label);
6392 6392
 
6393 6393
 					$out .= '<td class="titlefield';
6394
-					if (GETPOST('action','none') == 'create') $out.='create';
6395
-					if ($mode != 'view' && ! empty($extrafields->attributes[$this->table_element]['required'][$key])) $out .= ' fieldrequired';
6394
+					if (GETPOST('action', 'none') == 'create') $out .= 'create';
6395
+					if ($mode != 'view' && !empty($extrafields->attributes[$this->table_element]['required'][$key])) $out .= ' fieldrequired';
6396 6396
 					$out .= '">';
6397
-					if (! empty($extrafields->attributes[$object->table_element]['help'][$key])) $out .= $form->textwithpicto($labeltoshow, $extrafields->attributes[$object->table_element]['help'][$key]);
6397
+					if (!empty($extrafields->attributes[$object->table_element]['help'][$key])) $out .= $form->textwithpicto($labeltoshow, $extrafields->attributes[$object->table_element]['help'][$key]);
6398 6398
 					else $out .= $labeltoshow;
6399 6399
 					$out .= '</td>';
6400 6400
 
6401 6401
 					$html_id = !empty($this->id) ? $this->element.'_extras_'.$key.'_'.$this->id : '';
6402
-					$out .='<td id="'.$html_id.'" class="'.$this->element.'_extras_'.$key.'" '.($colspan?' colspan="'.$colspan.'"':'').'>';
6402
+					$out .= '<td id="'.$html_id.'" class="'.$this->element.'_extras_'.$key.'" '.($colspan ? ' colspan="'.$colspan.'"' : '').'>';
6403 6403
 
6404
-					switch($mode) {
6404
+					switch ($mode) {
6405 6405
 						case "view":
6406 6406
 							$out .= $extrafields->showOutputField($key, $value);
6407 6407
 							break;
@@ -6412,14 +6412,14 @@  discard block
 block discarded – undo
6412 6412
 
6413 6413
 					$out .= '</td>';
6414 6414
 
6415
-					if (! empty($conf->global->MAIN_EXTRAFIELDS_USE_TWO_COLUMS) && (($e % 2) == 1)) $out .= '</tr>';
6415
+					if (!empty($conf->global->MAIN_EXTRAFIELDS_USE_TWO_COLUMS) && (($e % 2) == 1)) $out .= '</tr>';
6416 6416
 					else $out .= '</tr>';
6417 6417
 					$e++;
6418 6418
 				}
6419 6419
 			}
6420 6420
 			$out .= "\n";
6421 6421
 			// Add code to manage list depending on others
6422
-			if (! empty($conf->use_javascript_ajax)) {
6422
+			if (!empty($conf->use_javascript_ajax)) {
6423 6423
 				$out .= '
6424 6424
 				<script type="text/javascript">
6425 6425
 				    jQuery(document).ready(function() {
@@ -6465,7 +6465,7 @@  discard block
 block discarded – undo
6465 6465
 		global $user;
6466 6466
 
6467 6467
 		$element = $this->element;
6468
-		if ($element == 'facturerec') $element='facture';
6468
+		if ($element == 'facturerec') $element = 'facture';
6469 6469
 
6470 6470
 		return $user->rights->{$element};
6471 6471
 	}
@@ -6482,15 +6482,15 @@  discard block
 block discarded – undo
6482 6482
 	 * @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)
6483 6483
 	 * @return bool						  True if success, False if error
6484 6484
 	 */
6485
-	public static function commonReplaceThirdparty(DoliDB $db, $origin_id, $dest_id, array $tables, $ignoreerrors=0)
6485
+	public static function commonReplaceThirdparty(DoliDB $db, $origin_id, $dest_id, array $tables, $ignoreerrors = 0)
6486 6486
 	{
6487 6487
 		foreach ($tables as $table)
6488 6488
 		{
6489 6489
 			$sql = 'UPDATE '.MAIN_DB_PREFIX.$table.' SET fk_soc = '.$dest_id.' WHERE fk_soc = '.$origin_id;
6490 6490
 
6491
-			if (! $db->query($sql))
6491
+			if (!$db->query($sql))
6492 6492
 			{
6493
-				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.
6493
+				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 6494
 				//$this->errors = $db->lasterror();
6495 6495
 				return false;
6496 6496
 			}
@@ -6524,7 +6524,7 @@  discard block
 block discarded – undo
6524 6524
 		else
6525 6525
 		{
6526 6526
 			// Get cost price for margin calculation
6527
-			if (! empty($fk_product))
6527
+			if (!empty($fk_product))
6528 6528
 			{
6529 6529
 				if (isset($conf->global->MARGIN_TYPE) && $conf->global->MARGIN_TYPE == 'costprice')
6530 6530
 				{
@@ -6561,7 +6561,7 @@  discard block
 block discarded – undo
6561 6561
 					}
6562 6562
 				}
6563 6563
 
6564
-				if (empty($buyPrice) && isset($conf->global->MARGIN_TYPE) && in_array($conf->global->MARGIN_TYPE, array('1','pmp','costprice')))
6564
+				if (empty($buyPrice) && isset($conf->global->MARGIN_TYPE) && in_array($conf->global->MARGIN_TYPE, array('1', 'pmp', 'costprice')))
6565 6565
 				{
6566 6566
 					require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.product.class.php';
6567 6567
 					$productFournisseur = new ProductFournisseur($this->db);
@@ -6598,18 +6598,18 @@  discard block
 block discarded – undo
6598 6598
 	 *  @param		int		$usesharelink	Use the public shared link of image (if not available, the 'nophoto' image will be shown instead)
6599 6599
 	 *  @return     string					Html code to show photo. Number of photos shown is saved in this->nbphoto
6600 6600
 	 */
6601
-	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)
6601
+	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 6602
 	{
6603 6603
         // phpcs:enable
6604
-		global $conf,$user,$langs;
6604
+		global $conf, $user, $langs;
6605 6605
 
6606
-		include_once DOL_DOCUMENT_ROOT .'/core/lib/files.lib.php';
6607
-		include_once DOL_DOCUMENT_ROOT .'/core/lib/images.lib.php';
6606
+		include_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
6607
+		include_once DOL_DOCUMENT_ROOT.'/core/lib/images.lib.php';
6608 6608
 
6609
-		$sortfield='position_name';
6610
-		$sortorder='asc';
6609
+		$sortfield = 'position_name';
6610
+		$sortorder = 'asc';
6611 6611
 
6612
-		$dir = $sdir . '/';
6612
+		$dir = $sdir.'/';
6613 6613
 		$pdir = '/';
6614 6614
 		if ($modulepart == 'ticket')
6615 6615
 		{
@@ -6623,28 +6623,28 @@  discard block
 block discarded – undo
6623 6623
 		}
6624 6624
 
6625 6625
 		// For backward compatibility
6626
-		if ($modulepart == 'product' && ! empty($conf->global->PRODUCT_USE_OLD_PATH_FOR_PHOTO))
6626
+		if ($modulepart == 'product' && !empty($conf->global->PRODUCT_USE_OLD_PATH_FOR_PHOTO))
6627 6627
 		{
6628
-			$dir = $sdir . '/'. get_exdir($this->id,2,0,0,$this,$modulepart) . $this->id ."/photos/";
6629
-			$pdir = '/' . get_exdir($this->id,2,0,0,$this,$modulepart) . $this->id ."/photos/";
6628
+			$dir = $sdir.'/'.get_exdir($this->id, 2, 0, 0, $this, $modulepart).$this->id."/photos/";
6629
+			$pdir = '/'.get_exdir($this->id, 2, 0, 0, $this, $modulepart).$this->id."/photos/";
6630 6630
 		}
6631 6631
 
6632 6632
 		// Defined relative dir to DOL_DATA_ROOT
6633 6633
 		$relativedir = '';
6634 6634
 		if ($dir)
6635 6635
 		{
6636
-			$relativedir = preg_replace('/^'.preg_quote(DOL_DATA_ROOT,'/').'/', '', $dir);
6637
-			$relativedir = preg_replace('/^[\\/]/','',$relativedir);
6638
-			$relativedir = preg_replace('/[\\/]$/','',$relativedir);
6636
+			$relativedir = preg_replace('/^'.preg_quote(DOL_DATA_ROOT, '/').'/', '', $dir);
6637
+			$relativedir = preg_replace('/^[\\/]/', '', $relativedir);
6638
+			$relativedir = preg_replace('/[\\/]$/', '', $relativedir);
6639 6639
 		}
6640 6640
 
6641 6641
 		$dirthumb = $dir.'thumbs/';
6642 6642
 		$pdirthumb = $pdir.'thumbs/';
6643 6643
 
6644
-		$return ='<!-- Photo -->'."\n";
6645
-		$nbphoto=0;
6644
+		$return = '<!-- Photo -->'."\n";
6645
+		$nbphoto = 0;
6646 6646
 
6647
-		$filearray=dol_dir_list($dir,"files",0,'','(\.meta|_preview.*\.png)$',$sortfield,(strtolower($sortorder)=='desc'?SORT_DESC:SORT_ASC),1);
6647
+		$filearray = dol_dir_list($dir, "files", 0, '', '(\.meta|_preview.*\.png)$', $sortfield, (strtolower($sortorder) == 'desc' ?SORT_DESC:SORT_ASC), 1);
6648 6648
 
6649 6649
 		/*if (! empty($conf->global->PRODUCT_USE_OLD_PATH_FOR_PHOTO))    // For backward compatiblity, we scan also old dirs
6650 6650
 		 {
@@ -6658,12 +6658,12 @@  discard block
 block discarded – undo
6658 6658
 		{
6659 6659
 			if ($sortfield && $sortorder)
6660 6660
 			{
6661
-				$filearray=dol_sort_array($filearray, $sortfield, $sortorder);
6661
+				$filearray = dol_sort_array($filearray, $sortfield, $sortorder);
6662 6662
 			}
6663 6663
 
6664
-			foreach($filearray as $key => $val)
6664
+			foreach ($filearray as $key => $val)
6665 6665
 			{
6666
-				$photo='';
6666
+				$photo = '';
6667 6667
 				$file = $val['name'];
6668 6668
 
6669 6669
 				//if (! utf8_check($file)) $file=utf8_encode($file);	// To be sure file is stored in UTF8 in memory
@@ -6678,36 +6678,36 @@  discard block
 block discarded – undo
6678 6678
 					if ($size == 1 || $size == 'small') {   // Format vignette
6679 6679
 
6680 6680
 						// Find name of thumb file
6681
-						$photo_vignette=basename(getImageFileNameForSize($dir.$file, '_small'));
6682
-						if (! dol_is_file($dirthumb.$photo_vignette)) $photo_vignette='';
6681
+						$photo_vignette = basename(getImageFileNameForSize($dir.$file, '_small'));
6682
+						if (!dol_is_file($dirthumb.$photo_vignette)) $photo_vignette = '';
6683 6683
 
6684 6684
 						// Get filesize of original file
6685
-						$imgarray=dol_getImageSize($dir.$photo);
6685
+						$imgarray = dol_getImageSize($dir.$photo);
6686 6686
 
6687 6687
 						if ($nbbyrow > 0)
6688 6688
 						{
6689
-							if ($nbphoto == 1) $return.= '<table width="100%" valign="top" align="center" border="0" cellpadding="2" cellspacing="2">';
6689
+							if ($nbphoto == 1) $return .= '<table width="100%" valign="top" align="center" border="0" cellpadding="2" cellspacing="2">';
6690 6690
 
6691
-							if ($nbphoto % $nbbyrow == 1) $return.= '<tr align=center valign=middle border=1>';
6692
-							$return.= '<td width="'.ceil(100/$nbbyrow).'%" class="photo">';
6691
+							if ($nbphoto % $nbbyrow == 1) $return .= '<tr align=center valign=middle border=1>';
6692
+							$return .= '<td width="'.ceil(100 / $nbbyrow).'%" class="photo">';
6693 6693
 						}
6694 6694
 						else if ($nbbyrow < 0) $return .= '<div class="inline-block">';
6695 6695
 
6696
-						$return.= "\n";
6696
+						$return .= "\n";
6697 6697
 
6698
-						$relativefile=preg_replace('/^\//', '', $pdir.$photo);
6698
+						$relativefile = preg_replace('/^\//', '', $pdir.$photo);
6699 6699
 						if (empty($nolink))
6700 6700
 						{
6701
-							$urladvanced=getAdvancedPreviewUrl($modulepart, $relativefile, 0, 'entity='.$this->entity);
6702
-							if ($urladvanced) $return.='<a href="'.$urladvanced.'">';
6703
-							else $return.= '<a href="'.DOL_URL_ROOT.'/viewimage.php?modulepart='.$modulepart.'&entity='.$this->entity.'&file='.urlencode($pdir.$photo).'" class="aphoto" target="_blank">';
6701
+							$urladvanced = getAdvancedPreviewUrl($modulepart, $relativefile, 0, 'entity='.$this->entity);
6702
+							if ($urladvanced) $return .= '<a href="'.$urladvanced.'">';
6703
+							else $return .= '<a href="'.DOL_URL_ROOT.'/viewimage.php?modulepart='.$modulepart.'&entity='.$this->entity.'&file='.urlencode($pdir.$photo).'" class="aphoto" target="_blank">';
6704 6704
 						}
6705 6705
 
6706 6706
 						// Show image (width height=$maxHeight)
6707 6707
 						// Si fichier vignette disponible et image source trop grande, on utilise la vignette, sinon on utilise photo origine
6708
-						$alt=$langs->transnoentitiesnoconv('File').': '.$relativefile;
6709
-						$alt.=' - '.$langs->transnoentitiesnoconv('Size').': '.$imgarray['width'].'x'.$imgarray['height'];
6710
-						if ($notitle) $alt='';
6708
+						$alt = $langs->transnoentitiesnoconv('File').': '.$relativefile;
6709
+						$alt .= ' - '.$langs->transnoentitiesnoconv('Size').': '.$imgarray['width'].'x'.$imgarray['height'];
6710
+						if ($notitle) $alt = '';
6711 6711
 
6712 6712
 						if ($usesharelink)
6713 6713
 						{
@@ -6715,81 +6715,81 @@  discard block
 block discarded – undo
6715 6715
 							{
6716 6716
 								if (empty($maxHeight) || $photo_vignette && $imgarray['height'] > $maxHeight)
6717 6717
 								{
6718
-									$return.= '<!-- Show original file (thumb not yet available with shared links) -->';
6719
-									$return.= '<img class="photo photowithmargin" border="0" height="'.$maxHeight.'" src="'.DOL_URL_ROOT.'/viewimage.php?hashp='.urlencode($val['share']).'" title="'.dol_escape_htmltag($alt).'">';
6718
+									$return .= '<!-- Show original file (thumb not yet available with shared links) -->';
6719
+									$return .= '<img class="photo photowithmargin" border="0" height="'.$maxHeight.'" src="'.DOL_URL_ROOT.'/viewimage.php?hashp='.urlencode($val['share']).'" title="'.dol_escape_htmltag($alt).'">';
6720 6720
 								}
6721 6721
 								else {
6722
-									$return.= '<!-- Show original file -->';
6723
-									$return.= '<img class="photo photowithmargin" border="0" height="'.$maxHeight.'" src="'.DOL_URL_ROOT.'/viewimage.php?hashp='.urlencode($val['share']).'" title="'.dol_escape_htmltag($alt).'">';
6722
+									$return .= '<!-- Show original file -->';
6723
+									$return .= '<img class="photo photowithmargin" border="0" height="'.$maxHeight.'" src="'.DOL_URL_ROOT.'/viewimage.php?hashp='.urlencode($val['share']).'" title="'.dol_escape_htmltag($alt).'">';
6724 6724
 								}
6725 6725
 							}
6726 6726
 							else
6727 6727
 							{
6728
-								$return.= '<!-- Show nophoto file (because file is not shared) -->';
6729
-								$return.= '<img class="photo photowithmargin" border="0" height="'.$maxHeight.'" src="'.DOL_URL_ROOT.'/public/theme/common/nophoto.png" title="'.dol_escape_htmltag($alt).'">';
6728
+								$return .= '<!-- Show nophoto file (because file is not shared) -->';
6729
+								$return .= '<img class="photo photowithmargin" border="0" height="'.$maxHeight.'" src="'.DOL_URL_ROOT.'/public/theme/common/nophoto.png" title="'.dol_escape_htmltag($alt).'">';
6730 6730
 							}
6731 6731
 						}
6732 6732
 						else
6733 6733
 						{
6734 6734
 							if (empty($maxHeight) || $photo_vignette && $imgarray['height'] > $maxHeight)
6735 6735
 							{
6736
-								$return.= '<!-- Show thumb -->';
6737
-								$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).'">';
6736
+								$return .= '<!-- Show thumb -->';
6737
+								$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).'">';
6738 6738
 							}
6739 6739
 							else {
6740
-								$return.= '<!-- Show original file -->';
6741
-								$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).'">';
6740
+								$return .= '<!-- Show original file -->';
6741
+								$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).'">';
6742 6742
 							}
6743 6743
 						}
6744 6744
 
6745
-						if (empty($nolink)) $return.= '</a>';
6746
-						$return.="\n";
6745
+						if (empty($nolink)) $return .= '</a>';
6746
+						$return .= "\n";
6747 6747
 
6748
-						if ($showfilename) $return.= '<br>'.$viewfilename;
6748
+						if ($showfilename) $return .= '<br>'.$viewfilename;
6749 6749
 						if ($showaction)
6750 6750
 						{
6751
-							$return.= '<br>';
6751
+							$return .= '<br>';
6752 6752
 							// On propose la generation de la vignette si elle n'existe pas et si la taille est superieure aux limites
6753 6753
 							if ($photo_vignette && (image_format_supported($photo) > 0) && ($this->imgWidth > $maxWidth || $this->imgHeight > $maxHeight))
6754 6754
 							{
6755
-								$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>';
6755
+								$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 6756
 							}
6757 6757
 							// Special cas for product
6758 6758
 							if ($modulepart == 'product' && ($user->rights->produit->creer || $user->rights->service->creer))
6759 6759
 							{
6760 6760
 								// Link to resize
6761
-								$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; ';
6761
+								$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 6762
 
6763 6763
 								// Link to delete
6764
-								$return.= '<a href="'.$_SERVER["PHP_SELF"].'?id='.$this->id.'&amp;action=delete&amp;file='.urlencode($pdir.$viewfilename).'">';
6765
-								$return.= img_delete().'</a>';
6764
+								$return .= '<a href="'.$_SERVER["PHP_SELF"].'?id='.$this->id.'&amp;action=delete&amp;file='.urlencode($pdir.$viewfilename).'">';
6765
+								$return .= img_delete().'</a>';
6766 6766
 							}
6767 6767
 						}
6768
-						$return.= "\n";
6768
+						$return .= "\n";
6769 6769
 
6770 6770
 						if ($nbbyrow > 0)
6771 6771
 						{
6772
-							$return.= '</td>';
6773
-							if (($nbphoto % $nbbyrow) == 0) $return.= '</tr>';
6772
+							$return .= '</td>';
6773
+							if (($nbphoto % $nbbyrow) == 0) $return .= '</tr>';
6774 6774
 						}
6775
-						else if ($nbbyrow < 0) $return.='</div>';
6775
+						else if ($nbbyrow < 0) $return .= '</div>';
6776 6776
 					}
6777 6777
 
6778 6778
 					if (empty($size)) {     // Format origine
6779
-						$return.= '<img class="photo photowithmargin" border="0" src="'.DOL_URL_ROOT.'/viewimage.php?modulepart='.$modulepart.'&entity='.$this->entity.'&file='.urlencode($pdir.$photo).'">';
6779
+						$return .= '<img class="photo photowithmargin" border="0" src="'.DOL_URL_ROOT.'/viewimage.php?modulepart='.$modulepart.'&entity='.$this->entity.'&file='.urlencode($pdir.$photo).'">';
6780 6780
 
6781
-						if ($showfilename) $return.= '<br>'.$viewfilename;
6781
+						if ($showfilename) $return .= '<br>'.$viewfilename;
6782 6782
 						if ($showaction)
6783 6783
 						{
6784 6784
 							// Special case for product
6785 6785
 							if ($modulepart == 'product' && ($user->rights->produit->creer || $user->rights->service->creer))
6786 6786
 							{
6787 6787
 								// Link to resize
6788
-								$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; ';
6788
+								$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 6789
 
6790 6790
 								// Link to delete
6791
-								$return.= '<a href="'.$_SERVER["PHP_SELF"].'?id='.$this->id.'&amp;action=delete&amp;file='.urlencode($pdir.$viewfilename).'">';
6792
-								$return.= img_delete().'</a>';
6791
+								$return .= '<a href="'.$_SERVER["PHP_SELF"].'?id='.$this->id.'&amp;action=delete&amp;file='.urlencode($pdir.$viewfilename).'">';
6792
+								$return .= img_delete().'</a>';
6793 6793
 							}
6794 6794
 						}
6795 6795
 					}
@@ -6799,18 +6799,18 @@  discard block
 block discarded – undo
6799 6799
 				}
6800 6800
 			}
6801 6801
 
6802
-			if ($size==1 || $size=='small')
6802
+			if ($size == 1 || $size == 'small')
6803 6803
 			{
6804 6804
 				if ($nbbyrow > 0)
6805 6805
 				{
6806 6806
 					// Ferme tableau
6807 6807
 					while ($nbphoto % $nbbyrow)
6808 6808
 					{
6809
-						$return.= '<td width="'.ceil(100/$nbbyrow).'%">&nbsp;</td>';
6809
+						$return .= '<td width="'.ceil(100 / $nbbyrow).'%">&nbsp;</td>';
6810 6810
 						$nbphoto++;
6811 6811
 					}
6812 6812
 
6813
-					if ($nbphoto) $return.= '</table>';
6813
+					if ($nbphoto) $return .= '</table>';
6814 6814
 				}
6815 6815
 			}
6816 6816
 		}
@@ -6829,9 +6829,9 @@  discard block
 block discarded – undo
6829 6829
 	 */
6830 6830
 	protected function isArray($info)
6831 6831
 	{
6832
-		if(is_array($info))
6832
+		if (is_array($info))
6833 6833
 		{
6834
-			if(isset($info['type']) && $info['type']=='array') return true;
6834
+			if (isset($info['type']) && $info['type'] == 'array') return true;
6835 6835
 			else return false;
6836 6836
 		}
6837 6837
 		else return false;
@@ -6845,9 +6845,9 @@  discard block
 block discarded – undo
6845 6845
 	 */
6846 6846
 	protected function isNull($info)
6847 6847
 	{
6848
-		if(is_array($info))
6848
+		if (is_array($info))
6849 6849
 		{
6850
-			if(isset($info['type']) && $info['type']=='null') return true;
6850
+			if (isset($info['type']) && $info['type'] == 'null') return true;
6851 6851
 			else return false;
6852 6852
 		}
6853 6853
 		else return false;
@@ -6861,7 +6861,7 @@  discard block
 block discarded – undo
6861 6861
 	 */
6862 6862
 	public function isDate($info)
6863 6863
 	{
6864
-		if(isset($info['type']) && ($info['type']=='date' || $info['type']=='datetime' || $info['type']=='timestamp')) return true;
6864
+		if (isset($info['type']) && ($info['type'] == 'date' || $info['type'] == 'datetime' || $info['type'] == 'timestamp')) return true;
6865 6865
 		else return false;
6866 6866
 	}
6867 6867
 
@@ -6873,9 +6873,9 @@  discard block
 block discarded – undo
6873 6873
 	 */
6874 6874
 	public function isInt($info)
6875 6875
 	{
6876
-		if(is_array($info))
6876
+		if (is_array($info))
6877 6877
 		{
6878
-			if(isset($info['type']) && ($info['type']=='int' || preg_match('/^integer/i',$info['type']) ) ) return true;
6878
+			if (isset($info['type']) && ($info['type'] == 'int' || preg_match('/^integer/i', $info['type']))) return true;
6879 6879
 			else return false;
6880 6880
 		}
6881 6881
 		else return false;
@@ -6889,7 +6889,7 @@  discard block
 block discarded – undo
6889 6889
 	 */
6890 6890
 	public function isFloat($info)
6891 6891
 	{
6892
-		if(is_array($info))
6892
+		if (is_array($info))
6893 6893
 		{
6894 6894
 			if (isset($info['type']) && (preg_match('/^(double|real)/i', $info['type']))) return true;
6895 6895
 			else return false;
@@ -6905,9 +6905,9 @@  discard block
 block discarded – undo
6905 6905
 	 */
6906 6906
 	public function isText($info)
6907 6907
 	{
6908
-		if(is_array($info))
6908
+		if (is_array($info))
6909 6909
 		{
6910
-			if(isset($info['type']) && $info['type']=='text') return true;
6910
+			if (isset($info['type']) && $info['type'] == 'text') return true;
6911 6911
 			else return false;
6912 6912
 		}
6913 6913
 		else return false;
@@ -6921,9 +6921,9 @@  discard block
 block discarded – undo
6921 6921
 	 */
6922 6922
 	protected function isIndex($info)
6923 6923
 	{
6924
-		if(is_array($info))
6924
+		if (is_array($info))
6925 6925
 		{
6926
-			if(isset($info['index']) && $info['index']==true) return true;
6926
+			if (isset($info['index']) && $info['index'] == true) return true;
6927 6927
 			else return false;
6928 6928
 		}
6929 6929
 		else return false;
@@ -6939,13 +6939,13 @@  discard block
 block discarded – undo
6939 6939
 	{
6940 6940
 		global $conf;
6941 6941
 
6942
-		$queryarray=array();
6942
+		$queryarray = array();
6943 6943
 		foreach ($this->fields as $field=>$info)	// Loop on definition of fields
6944 6944
 		{
6945 6945
 			// Depending on field type ('datetime', ...)
6946
-			if($this->isDate($info))
6946
+			if ($this->isDate($info))
6947 6947
 			{
6948
-				if(empty($this->{$field}))
6948
+				if (empty($this->{$field}))
6949 6949
 				{
6950 6950
 					$queryarray[$field] = null;
6951 6951
 				}
@@ -6954,10 +6954,10 @@  discard block
 block discarded – undo
6954 6954
 					$queryarray[$field] = $this->db->idate($this->{$field});
6955 6955
 				}
6956 6956
 			}
6957
-			else if($this->isArray($info))
6957
+			else if ($this->isArray($info))
6958 6958
 			{
6959
-				if(! empty($this->{$field})) {
6960
-					if(! is_array($this->{$field})) {
6959
+				if (!empty($this->{$field})) {
6960
+					if (!is_array($this->{$field})) {
6961 6961
 						$this->{$field} = array($this->{$field});
6962 6962
 					}
6963 6963
 					$queryarray[$field] = serialize($this->{$field});
@@ -6965,19 +6965,19 @@  discard block
 block discarded – undo
6965 6965
 					$queryarray[$field] = null;
6966 6966
 				}
6967 6967
 			}
6968
-			else if($this->isInt($info))
6968
+			else if ($this->isInt($info))
6969 6969
 			{
6970
-				if ($field == 'entity' && is_null($this->{$field})) $queryarray[$field]=$conf->entity;
6970
+				if ($field == 'entity' && is_null($this->{$field})) $queryarray[$field] = $conf->entity;
6971 6971
 				else
6972 6972
 				{
6973 6973
 					$queryarray[$field] = (int) price2num($this->{$field});
6974
-					if (empty($queryarray[$field])) $queryarray[$field]=0;		// May be reset to null later if property 'notnull' is -1 for this field.
6974
+					if (empty($queryarray[$field])) $queryarray[$field] = 0; // May be reset to null later if property 'notnull' is -1 for this field.
6975 6975
 				}
6976 6976
 			}
6977
-			else if($this->isFloat($info))
6977
+			else if ($this->isFloat($info))
6978 6978
 			{
6979 6979
 				$queryarray[$field] = (double) price2num($this->{$field});
6980
-				if (empty($queryarray[$field])) $queryarray[$field]=0;
6980
+				if (empty($queryarray[$field])) $queryarray[$field] = 0;
6981 6981
 			}
6982 6982
 			else
6983 6983
 			{
@@ -6985,7 +6985,7 @@  discard block
 block discarded – undo
6985 6985
 			}
6986 6986
 
6987 6987
 			if ($info['type'] == 'timestamp' && empty($queryarray[$field])) unset($queryarray[$field]);
6988
-			if (! empty($info['notnull']) && $info['notnull'] == -1 && empty($queryarray[$field])) $queryarray[$field] = null;
6988
+			if (!empty($info['notnull']) && $info['notnull'] == -1 && empty($queryarray[$field])) $queryarray[$field] = null;
6989 6989
 		}
6990 6990
 
6991 6991
 		return $queryarray;
@@ -7001,35 +7001,35 @@  discard block
 block discarded – undo
7001 7001
 	{
7002 7002
 		foreach ($this->fields as $field => $info)
7003 7003
 		{
7004
-			if($this->isDate($info))
7004
+			if ($this->isDate($info))
7005 7005
 			{
7006
-				if(empty($obj->{$field}) || $obj->{$field} === '0000-00-00 00:00:00' || $obj->{$field} === '1000-01-01 00:00:00') $this->{$field} = 0;
7006
+				if (empty($obj->{$field}) || $obj->{$field} === '0000-00-00 00:00:00' || $obj->{$field} === '1000-01-01 00:00:00') $this->{$field} = 0;
7007 7007
 				else $this->{$field} = strtotime($obj->{$field});
7008 7008
 			}
7009
-			elseif($this->isArray($info))
7009
+			elseif ($this->isArray($info))
7010 7010
 			{
7011
-				if(! empty($obj->{$field})) {
7011
+				if (!empty($obj->{$field})) {
7012 7012
 					$this->{$field} = @unserialize($obj->{$field});
7013 7013
 					// Hack for data not in UTF8
7014
-					if($this->{$field } === false) @unserialize(utf8_decode($obj->{$field}));
7014
+					if ($this->{$field } === false) @unserialize(utf8_decode($obj->{$field}));
7015 7015
 				} else {
7016 7016
 					$this->{$field} = array();
7017 7017
 				}
7018 7018
 			}
7019
-			elseif($this->isInt($info))
7019
+			elseif ($this->isInt($info))
7020 7020
 			{
7021 7021
 				if ($field == 'rowid') $this->id = (int) $obj->{$field};
7022 7022
 				else $this->{$field} = (int) $obj->{$field};
7023 7023
 			}
7024
-			elseif($this->isFloat($info))
7024
+			elseif ($this->isFloat($info))
7025 7025
 			{
7026 7026
 				$this->{$field} = (double) $obj->{$field};
7027 7027
 			}
7028
-			elseif($this->isNull($info))
7028
+			elseif ($this->isNull($info))
7029 7029
 			{
7030 7030
 				$val = $obj->{$field};
7031 7031
 				// zero is not null
7032
-				$this->{$field} = (is_null($val) || (empty($val) && $val!==0 && $val!=='0') ? null : $val);
7032
+				$this->{$field} = (is_null($val) || (empty($val) && $val !== 0 && $val !== '0') ? null : $val);
7033 7033
 			}
7034 7034
 			else
7035 7035
 			{
@@ -7038,7 +7038,7 @@  discard block
 block discarded – undo
7038 7038
 		}
7039 7039
 
7040 7040
 		// If there is no 'ref' field, we force property ->ref to ->id for a better compatibility with common functions.
7041
-		if (! isset($this->fields['ref']) && isset($this->id)) $this->ref = $this->id;
7041
+		if (!isset($this->fields['ref']) && isset($this->id)) $this->ref = $this->id;
7042 7042
 	}
7043 7043
 
7044 7044
 	/**
@@ -7080,14 +7080,14 @@  discard block
 block discarded – undo
7080 7080
 
7081 7081
 		$error = 0;
7082 7082
 
7083
-		$now=dol_now();
7083
+		$now = dol_now();
7084 7084
 
7085 7085
 		$fieldvalues = $this->setSaveQuery();
7086
-		if (array_key_exists('date_creation', $fieldvalues) && empty($fieldvalues['date_creation'])) $fieldvalues['date_creation']=$this->db->idate($now);
7087
-		if (array_key_exists('fk_user_creat', $fieldvalues) && ! ($fieldvalues['fk_user_creat'] > 0)) $fieldvalues['fk_user_creat']=$user->id;
7088
-		unset($fieldvalues['rowid']);	// The field 'rowid' is reserved field name for autoincrement field so we don't need it into insert.
7086
+		if (array_key_exists('date_creation', $fieldvalues) && empty($fieldvalues['date_creation'])) $fieldvalues['date_creation'] = $this->db->idate($now);
7087
+		if (array_key_exists('fk_user_creat', $fieldvalues) && !($fieldvalues['fk_user_creat'] > 0)) $fieldvalues['fk_user_creat'] = $user->id;
7088
+		unset($fieldvalues['rowid']); // The field 'rowid' is reserved field name for autoincrement field so we don't need it into insert.
7089 7089
 
7090
-		$keys=array();
7090
+		$keys = array();
7091 7091
 		$values = array();
7092 7092
 		foreach ($fieldvalues as $k => $v) {
7093 7093
 			$keys[$k] = $k;
@@ -7096,58 +7096,58 @@  discard block
 block discarded – undo
7096 7096
 		}
7097 7097
 
7098 7098
 		// Clean and check mandatory
7099
-		foreach($keys as $key)
7099
+		foreach ($keys as $key)
7100 7100
 		{
7101 7101
 			// If field is an implicit foreign key field
7102
-			if (preg_match('/^integer:/i', $this->fields[$key]['type']) && $values[$key] == '-1') $values[$key]='';
7103
-			if (! empty($this->fields[$key]['foreignkey']) && $values[$key] == '-1') $values[$key]='';
7102
+			if (preg_match('/^integer:/i', $this->fields[$key]['type']) && $values[$key] == '-1') $values[$key] = '';
7103
+			if (!empty($this->fields[$key]['foreignkey']) && $values[$key] == '-1') $values[$key] = '';
7104 7104
 
7105 7105
 			//var_dump($key.'-'.$values[$key].'-'.($this->fields[$key]['notnull'] == 1));
7106
-			if (isset($this->fields[$key]['notnull']) && $this->fields[$key]['notnull'] == 1 && ! isset($values[$key]) && is_null($val['default']))
7106
+			if (isset($this->fields[$key]['notnull']) && $this->fields[$key]['notnull'] == 1 && !isset($values[$key]) && is_null($val['default']))
7107 7107
 			{
7108 7108
 				$error++;
7109
-				$this->errors[]=$langs->trans("ErrorFieldRequired", $this->fields[$key]['label']);
7109
+				$this->errors[] = $langs->trans("ErrorFieldRequired", $this->fields[$key]['label']);
7110 7110
 			}
7111 7111
 
7112 7112
 			// If field is an implicit foreign key field
7113
-			if (preg_match('/^integer:/i', $this->fields[$key]['type']) && empty($values[$key])) $values[$key]='null';
7114
-			if (! empty($this->fields[$key]['foreignkey']) && empty($values[$key])) $values[$key]='null';
7113
+			if (preg_match('/^integer:/i', $this->fields[$key]['type']) && empty($values[$key])) $values[$key] = 'null';
7114
+			if (!empty($this->fields[$key]['foreignkey']) && empty($values[$key])) $values[$key] = 'null';
7115 7115
 		}
7116 7116
 
7117 7117
 		if ($error) return -1;
7118 7118
 
7119 7119
 		$this->db->begin();
7120 7120
 
7121
-		if (! $error)
7121
+		if (!$error)
7122 7122
 		{
7123 7123
 			$sql = 'INSERT INTO '.MAIN_DB_PREFIX.$this->table_element;
7124
-			$sql.= ' ('.implode( ", ", $keys ).')';
7125
-			$sql.= ' VALUES ('.implode( ", ", $values ).')';
7124
+			$sql .= ' ('.implode(", ", $keys).')';
7125
+			$sql .= ' VALUES ('.implode(", ", $values).')';
7126 7126
 
7127 7127
 			$res = $this->db->query($sql);
7128
-			if ($res===false) {
7128
+			if ($res === false) {
7129 7129
 				$error++;
7130 7130
 				$this->errors[] = $this->db->lasterror();
7131 7131
 			}
7132 7132
 		}
7133 7133
 
7134
-		if (! $error)
7134
+		if (!$error)
7135 7135
 		{
7136
-			$this->id = $this->db->last_insert_id(MAIN_DB_PREFIX . $this->table_element);
7136
+			$this->id = $this->db->last_insert_id(MAIN_DB_PREFIX.$this->table_element);
7137 7137
 		}
7138 7138
 
7139 7139
 		// Create extrafields
7140
-		if (! $error)
7140
+		if (!$error)
7141 7141
 		{
7142
-			$result=$this->insertExtraFields();
7142
+			$result = $this->insertExtraFields();
7143 7143
 			if ($result < 0) $error++;
7144 7144
 		}
7145 7145
 
7146 7146
 		// Triggers
7147
-		if (! $error && ! $notrigger)
7147
+		if (!$error && !$notrigger)
7148 7148
 		{
7149 7149
 			// Call triggers
7150
-			$result=$this->call_trigger(strtoupper(get_class($this)).'_CREATE',$user);
7150
+			$result = $this->call_trigger(strtoupper(get_class($this)).'_CREATE', $user);
7151 7151
 			if ($result < 0) { $error++; }
7152 7152
 			// End call triggers
7153 7153
 		}
@@ -7176,13 +7176,13 @@  discard block
 block discarded – undo
7176 7176
 		if (empty($id) && empty($ref) && empty($morewhere)) return -1;
7177 7177
 
7178 7178
 		$sql = 'SELECT '.$this->getFieldList();
7179
-		$sql.= ' FROM '.MAIN_DB_PREFIX.$this->table_element;
7179
+		$sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element;
7180 7180
 
7181
-		if (!empty($id))  $sql.= ' WHERE rowid = '.$id;
7182
-		elseif (!empty($ref)) $sql.= " WHERE ref = ".$this->quote($ref, $this->fields['ref']);
7183
-		else $sql.=' WHERE 1 = 1';	// usage with empty id and empty ref is very rare
7184
-		if ($morewhere)   $sql.= $morewhere;
7185
-		$sql.=' LIMIT 1';	// This is a fetch, to be sure to get only one record
7181
+		if (!empty($id))  $sql .= ' WHERE rowid = '.$id;
7182
+		elseif (!empty($ref)) $sql .= " WHERE ref = ".$this->quote($ref, $this->fields['ref']);
7183
+		else $sql .= ' WHERE 1 = 1'; // usage with empty id and empty ref is very rare
7184
+		if ($morewhere)   $sql .= $morewhere;
7185
+		$sql .= ' LIMIT 1'; // This is a fetch, to be sure to get only one record
7186 7186
 
7187 7187
 		$res = $this->db->query($sql);
7188 7188
 		if ($res)
@@ -7219,14 +7219,14 @@  discard block
 block discarded – undo
7219 7219
 
7220 7220
 		$error = 0;
7221 7221
 
7222
-		$now=dol_now();
7222
+		$now = dol_now();
7223 7223
 
7224 7224
 		$fieldvalues = $this->setSaveQuery();
7225
-		if (array_key_exists('date_modification', $fieldvalues) && empty($fieldvalues['date_modification'])) $fieldvalues['date_modification']=$this->db->idate($now);
7226
-		if (array_key_exists('fk_user_modif', $fieldvalues) && ! ($fieldvalues['fk_user_modif'] > 0)) $fieldvalues['fk_user_modif']=$user->id;
7227
-		unset($fieldvalues['rowid']);	// The field 'rowid' is reserved field name for autoincrement field so we don't need it into update.
7225
+		if (array_key_exists('date_modification', $fieldvalues) && empty($fieldvalues['date_modification'])) $fieldvalues['date_modification'] = $this->db->idate($now);
7226
+		if (array_key_exists('fk_user_modif', $fieldvalues) && !($fieldvalues['fk_user_modif'] > 0)) $fieldvalues['fk_user_modif'] = $user->id;
7227
+		unset($fieldvalues['rowid']); // The field 'rowid' is reserved field name for autoincrement field so we don't need it into update.
7228 7228
 
7229
-		$keys=array();
7229
+		$keys = array();
7230 7230
 		$values = array();
7231 7231
 		foreach ($fieldvalues as $k => $v) {
7232 7232
 			$keys[$k] = $k;
@@ -7236,10 +7236,10 @@  discard block
 block discarded – undo
7236 7236
 		}
7237 7237
 
7238 7238
 		// Clean and check mandatory
7239
-		foreach($keys as $key)
7239
+		foreach ($keys as $key)
7240 7240
 		{
7241
-			if (preg_match('/^integer:/i', $this->fields[$key]['type']) && $values[$key] == '-1') $values[$key]='';		// This is an implicit foreign key field
7242
-			if (! empty($this->fields[$key]['foreignkey']) && $values[$key] == '-1') $values[$key]='';					// This is an explicit foreign key field
7241
+			if (preg_match('/^integer:/i', $this->fields[$key]['type']) && $values[$key] == '-1') $values[$key] = ''; // This is an implicit foreign key field
7242
+			if (!empty($this->fields[$key]['foreignkey']) && $values[$key] == '-1') $values[$key] = ''; // This is an explicit foreign key field
7243 7243
 
7244 7244
 			//var_dump($key.'-'.$values[$key].'-'.($this->fields[$key]['notnull'] == 1));
7245 7245
 			/*
@@ -7250,13 +7250,13 @@  discard block
 block discarded – undo
7250 7250
 			}*/
7251 7251
 		}
7252 7252
 
7253
-		$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element.' SET '.implode( ',', $tmp ).' WHERE rowid='.$this->id ;
7253
+		$sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element.' SET '.implode(',', $tmp).' WHERE rowid='.$this->id;
7254 7254
 
7255 7255
 		$this->db->begin();
7256
-		if (! $error)
7256
+		if (!$error)
7257 7257
 		{
7258 7258
 			$res = $this->db->query($sql);
7259
-			if ($res===false)
7259
+			if ($res === false)
7260 7260
 			{
7261 7261
 				$error++;
7262 7262
 				$this->errors[] = $this->db->lasterror();
@@ -7264,9 +7264,9 @@  discard block
 block discarded – undo
7264 7264
 		}
7265 7265
 
7266 7266
 		// Update extrafield
7267
-		if (! $error && empty($conf->global->MAIN_EXTRAFIELDS_DISABLED) && is_array($this->array_options) && count($this->array_options)>0)
7267
+		if (!$error && empty($conf->global->MAIN_EXTRAFIELDS_DISABLED) && is_array($this->array_options) && count($this->array_options) > 0)
7268 7268
 		{
7269
-			$result=$this->insertExtraFields();
7269
+			$result = $this->insertExtraFields();
7270 7270
 			if ($result < 0)
7271 7271
 			{
7272 7272
 				$error++;
@@ -7274,10 +7274,10 @@  discard block
 block discarded – undo
7274 7274
 		}
7275 7275
 
7276 7276
 		// Triggers
7277
-		if (! $error && ! $notrigger)
7277
+		if (!$error && !$notrigger)
7278 7278
 		{
7279 7279
 			// Call triggers
7280
-			$result=$this->call_trigger(strtoupper(get_class($this)).'_MODIFY',$user);
7280
+			$result = $this->call_trigger(strtoupper(get_class($this)).'_MODIFY', $user);
7281 7281
 			if ($result < 0) { $error++; } //Do also here what you must do to rollback action if trigger fail
7282 7282
 			// End call triggers
7283 7283
 		}
@@ -7300,68 +7300,68 @@  discard block
 block discarded – undo
7300 7300
 	 * @param	int		$forcechilddeletion		0=no, 1=Force deletion of children
7301 7301
 	 * @return 	int             				<=0 if KO, >0 if OK
7302 7302
 	 */
7303
-	public function deleteCommon(User $user, $notrigger=false, $forcechilddeletion=0)
7303
+	public function deleteCommon(User $user, $notrigger = false, $forcechilddeletion = 0)
7304 7304
 	{
7305
-		$error=0;
7305
+		$error = 0;
7306 7306
 
7307 7307
 		$this->db->begin();
7308 7308
 
7309 7309
 		if ($forcechilddeletion)
7310 7310
 		{
7311
-			foreach($this->childtables as $table)
7311
+			foreach ($this->childtables as $table)
7312 7312
 			{
7313 7313
 				$sql = 'DELETE FROM '.MAIN_DB_PREFIX.$table.' WHERE '.$this->fk_element.' = '.$this->id;
7314 7314
 				$resql = $this->db->query($sql);
7315
-				if (! $resql)
7315
+				if (!$resql)
7316 7316
 				{
7317
-					$this->error=$this->db->lasterror();
7318
-					$this->errors[]=$this->error;
7317
+					$this->error = $this->db->lasterror();
7318
+					$this->errors[] = $this->error;
7319 7319
 					$this->db->rollback();
7320 7320
 					return -1;
7321 7321
 				}
7322 7322
 			}
7323 7323
 		}
7324
-		elseif (! empty($this->fk_element) && ! empty($this->childtables))	// If object has childs linked with a foreign key field, we check all child tables.
7324
+		elseif (!empty($this->fk_element) && !empty($this->childtables))	// If object has childs linked with a foreign key field, we check all child tables.
7325 7325
 		{
7326 7326
 			$objectisused = $this->isObjectUsed($this->id);
7327
-			if (! empty($objectisused))
7327
+			if (!empty($objectisused))
7328 7328
 			{
7329 7329
 				dol_syslog(get_class($this)."::deleteCommon Can't delete record as it has some child", LOG_WARNING);
7330
-				$this->error='ErrorRecordHasChildren';
7331
-				$this->errors[]=$this->error;
7330
+				$this->error = 'ErrorRecordHasChildren';
7331
+				$this->errors[] = $this->error;
7332 7332
 				$this->db->rollback();
7333 7333
 				return 0;
7334 7334
 			}
7335 7335
 		}
7336 7336
 
7337
-		if (! $error) {
7338
-			if (! $notrigger) {
7337
+		if (!$error) {
7338
+			if (!$notrigger) {
7339 7339
 				// Call triggers
7340
-				$result=$this->call_trigger(strtoupper(get_class($this)).'_DELETE', $user);
7340
+				$result = $this->call_trigger(strtoupper(get_class($this)).'_DELETE', $user);
7341 7341
 				if ($result < 0) { $error++; } // Do also here what you must do to rollback action if trigger fail
7342 7342
 				// End call triggers
7343 7343
 			}
7344 7344
 		}
7345 7345
 
7346
-		if (! $error && ! empty($this->isextrafieldmanaged))
7346
+		if (!$error && !empty($this->isextrafieldmanaged))
7347 7347
 		{
7348
-			$sql = "DELETE FROM " . MAIN_DB_PREFIX . $this->table_element."_extrafields";
7349
-			$sql.= " WHERE fk_object=" . $this->id;
7348
+			$sql = "DELETE FROM ".MAIN_DB_PREFIX.$this->table_element."_extrafields";
7349
+			$sql .= " WHERE fk_object=".$this->id;
7350 7350
 
7351 7351
 			$resql = $this->db->query($sql);
7352
-			if (! $resql)
7352
+			if (!$resql)
7353 7353
 			{
7354 7354
 				$this->errors[] = $this->db->lasterror();
7355 7355
 				$error++;
7356 7356
 			}
7357 7357
 		}
7358 7358
 
7359
-		if (! $error)
7359
+		if (!$error)
7360 7360
 		{
7361 7361
 			$sql = 'DELETE FROM '.MAIN_DB_PREFIX.$this->table_element.' WHERE rowid='.$this->id;
7362 7362
 
7363 7363
 			$res = $this->db->query($sql);
7364
-			if($res===false) {
7364
+			if ($res === false) {
7365 7365
 				$error++;
7366 7366
 				$this->errors[] = $this->db->lasterror();
7367 7367
 			}
@@ -7402,9 +7402,9 @@  discard block
 block discarded – undo
7402 7402
 		require_once DOL_DOCUMENT_ROOT.'/core/class/comment.class.php';
7403 7403
 
7404 7404
 		$comment = new Comment($this->db);
7405
-		$result=$comment->fetchAllFor($this->element, $this->id);
7406
-		if ($result<0) {
7407
-			$this->errors=array_merge($this->errors, $comment->errors);
7405
+		$result = $comment->fetchAllFor($this->element, $this->id);
7406
+		if ($result < 0) {
7407
+			$this->errors = array_merge($this->errors, $comment->errors);
7408 7408
 			return -1;
7409 7409
 		} else {
7410 7410
 			$this->comments = $comment->comments;
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.