Passed
Push — master ( a56e33...222e44 )
by Alxarafe
36:56
created
dolibarr/htdocs/core/class/utils.class.php 1 patch
Indentation   +915 added lines, -915 removed lines patch added patch discarded remove patch
@@ -27,857 +27,857 @@  discard block
 block discarded – undo
27 27
  */
28 28
 class Utils
29 29
 {
30
-	/**
30
+    /**
31 31
      * @var DoliDB Database handler.
32 32
      */
33 33
     public $db;
34 34
 
35
-	var $output;   // Used by Cron method to return message
36
-	var $result;   // Used by Cron method to return data
37
-
38
-	/**
39
-	 *	Constructor
40
-	 *
41
-	 *  @param	DoliDB	$db		Database handler
42
-	 */
43
-	function __construct($db)
44
-	{
45
-		$this->db = $db;
46
-	}
47
-
48
-
49
-	/**
50
-	 *  Purge files into directory of data files.
51
-	 *  CAN BE A CRON TASK
52
-	 *
53
-	 *  @param	string		$choice		Choice of purge mode ('tempfiles', '' or 'tempfilesold' to purge temp older than 24h, 'allfiles', 'logfile')
54
-	 *  @return	int						0 if OK, < 0 if KO (this function is used also by cron so only 0 is OK)
55
-	 */
56
-	function purgeFiles($choice='tempfilesold')
57
-	{
58
-		global $conf, $langs, $dolibarr_main_data_root;
59
-
60
-		$langs->load("admin");
61
-
62
-		dol_syslog("Utils::purgeFiles choice=".$choice, LOG_DEBUG);
63
-		require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
64
-
65
-		$filesarray=array();
66
-		if (empty($choice)) $choice='tempfilesold';
67
-
68
-		if ($choice=='tempfiles' || $choice=='tempfilesold')
69
-		{
70
-			// Delete temporary files
71
-			if ($dolibarr_main_data_root)
72
-			{
73
-				$filesarray=dol_dir_list($dolibarr_main_data_root, "directories", 1, '^temp$', '', 'name', SORT_ASC, 2, 0, '', 1);	// Do not follow symlinks
74
-				if ($choice == 'tempfilesold')
75
-				{
76
-					$now = dol_now();
77
-					foreach($filesarray as $key => $val)
78
-					{
79
-						if ($val['date'] > ($now - (24 * 3600))) unset($filesarray[$key]);	// Discard files not older than 24h
80
-					}
81
-				}
82
-			}
83
-		}
84
-
85
-		if ($choice=='allfiles')
86
-		{
87
-			// Delete all files (except install.lock, do not follow symbolic links)
88
-			if ($dolibarr_main_data_root)
89
-			{
90
-				$filesarray=dol_dir_list($dolibarr_main_data_root, "all", 0, '', 'install\.lock$', 'name', SORT_ASC, 0, 0, '', 1);
91
-			}
92
-		}
93
-
94
-		if ($choice=='logfile')
95
-		{
96
-			// Define files log
97
-			if ($dolibarr_main_data_root)
98
-			{
99
-				$filesarray=dol_dir_list($dolibarr_main_data_root, "files", 0, '.*\.log[\.0-9]*(\.gz)?$', 'install\.lock$', 'name', SORT_ASC, 0, 0, '', 1);
100
-			}
101
-
102
-			$filelog='';
103
-			if (! empty($conf->syslog->enabled))
104
-			{
105
-				$filelog=$conf->global->SYSLOG_FILE;
106
-				$filelog=preg_replace('/DOL_DATA_ROOT/i',DOL_DATA_ROOT,$filelog);
107
-
108
-				$alreadyincluded=false;
109
-				foreach ($filesarray as $tmpcursor)
110
-				{
111
-					if ($tmpcursor['fullname'] == $filelog) { $alreadyincluded=true; }
112
-				}
113
-				if (! $alreadyincluded) $filesarray[]=array('fullname'=>$filelog,'type'=>'file');
114
-			}
115
-		}
116
-
117
-		$count=0;
118
-		$countdeleted=0;
119
-		$counterror=0;
120
-		if (count($filesarray))
121
-		{
122
-			foreach($filesarray as $key => $value)
123
-			{
124
-				//print "x ".$filesarray[$key]['fullname']."-".$filesarray[$key]['type']."<br>\n";
125
-				if ($filesarray[$key]['type'] == 'dir')
126
-				{
127
-					$startcount=0;
128
-					$tmpcountdeleted=0;
129
-					$result=dol_delete_dir_recursive($filesarray[$key]['fullname'], $startcount, 1, 0, $tmpcountdeleted);
130
-					$count+=$result;
131
-					$countdeleted+=$tmpcountdeleted;
132
-				}
133
-				elseif ($filesarray[$key]['type'] == 'file')
134
-				{
135
-					// If (file that is not logfile) or (if mode is logfile)
136
-					if ($filesarray[$key]['fullname'] != $filelog || $choice=='logfile')
137
-					{
138
-						$result=dol_delete_file($filesarray[$key]['fullname'], 1, 1);
139
-						if ($result)
140
-						{
141
-							$count++;
142
-							$countdeleted++;
143
-						}
144
-						else
145
-						{
146
-							$counterror++;
147
-						}
148
-					}
149
-				}
150
-			}
151
-
152
-			// Update cachenbofdoc
153
-			if (! empty($conf->ecm->enabled) && $choice=='allfiles')
154
-			{
155
-				require_once DOL_DOCUMENT_ROOT.'/ecm/class/ecmdirectory.class.php';
156
-				$ecmdirstatic = new EcmDirectory($this->db);
157
-				$result = $ecmdirstatic->refreshcachenboffile(1);
158
-			}
159
-		}
160
-
161
-		if ($count > 0)
162
-		{
163
-			$this->output=$langs->trans("PurgeNDirectoriesDeleted", $countdeleted);
164
-			if ($count > $countdeleted) $this->output.='<br>'.$langs->trans("PurgeNDirectoriesFailed", ($count - $countdeleted));
165
-		}
166
-		else $this->output=$langs->trans("PurgeNothingToDelete").($choice == 'tempfilesold' ? ' (older than 24h)':'');
167
-
168
-		//return $count;
169
-		return 0;     // This function can be called by cron so must return 0 if OK
170
-	}
171
-
172
-
173
-	/**
174
-	 *  Make a backup of database
175
-	 *  CAN BE A CRON TASK
176
-	 *
177
-	 *  @param	string		$compression	   'gz' or 'bz' or 'none'
178
-	 *  @param  string      $type              'mysql', 'postgresql', ...
179
-	 *  @param  int         $usedefault        1=Use default backup profile (Set this to 1 when used as cron)
180
-	 *  @param  string      $file              'auto' or filename to build
181
-	 *  @param  int         $keeplastnfiles    Keep only last n files (not used yet)
182
-	 *  @param	int		    $execmethod		   0=Use default method (that is 1 by default), 1=Use the PHP 'exec', 2=Use the 'popen' method
183
-	 *  @return	int						       0 if OK, < 0 if KO (this function is used also by cron so only 0 is OK)
184
-	 */
185
-	function dumpDatabase($compression='none', $type='auto', $usedefault=1, $file='auto', $keeplastnfiles=0, $execmethod=0)
186
-	{
187
-		global $db, $conf, $langs, $dolibarr_main_data_root;
188
-		global $dolibarr_main_db_name, $dolibarr_main_db_host, $dolibarr_main_db_user, $dolibarr_main_db_port, $dolibarr_main_db_pass;
189
-
190
-		$langs->load("admin");
191
-
192
-		dol_syslog("Utils::dumpDatabase type=".$type." compression=".$compression." file=".$file, LOG_DEBUG);
193
-		require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
194
-
195
-		// Check compression parameter
196
-		if (! in_array($compression, array('none', 'gz', 'bz', 'zip')))
197
-		{
198
-			$langs->load("errors");
199
-			$this->error=$langs->transnoentitiesnoconv("ErrorBadValueForParameter", $compression, "Compression");
200
-			return -1;
201
-		}
202
-
203
-		// Check type parameter
204
-		if ($type == 'auto') $type = $db->type;
205
-		if (! in_array($type, array('postgresql', 'pgsql', 'mysql', 'mysqli', 'mysqlnobin')))
206
-		{
207
-			$langs->load("errors");
208
-			$this->error=$langs->transnoentitiesnoconv("ErrorBadValueForParameter", $type, "Basetype");
209
-			return -1;
210
-		}
211
-
212
-		// Check file parameter
213
-		if ($file == 'auto')
214
-		{
215
-			$prefix='dump';
216
-			$ext='sql';
217
-			if (in_array($type, array('mysql', 'mysqli')))  { $prefix='mysqldump'; $ext='sql'; }
218
-			//if ($label == 'PostgreSQL') { $prefix='pg_dump'; $ext='dump'; }
219
-			if (in_array($type, array('pgsql'))) { $prefix='pg_dump'; $ext='sql'; }
220
-			$file=$prefix.'_'.$dolibarr_main_db_name.'_'.dol_sanitizeFileName(DOL_VERSION).'_'.strftime("%Y%m%d%H%M").'.'.$ext;
221
-		}
222
-
223
-		$outputdir  = $conf->admin->dir_output.'/backup';
224
-		$result=dol_mkdir($outputdir);
225
-
226
-
227
-		// MYSQL
228
-		if ($type == 'mysql' || $type == 'mysqli')
229
-		{
230
-			$cmddump=$conf->global->SYSTEMTOOLS_MYSQLDUMP;
231
-
232
-
233
-			$outputfile = $outputdir.'/'.$file;
234
-			// for compression format, we add extension
235
-			$compression=$compression ? $compression : 'none';
236
-			if ($compression == 'gz') $outputfile.='.gz';
237
-			if ($compression == 'bz') $outputfile.='.bz2';
238
-			$outputerror = $outputfile.'.err';
239
-			dol_mkdir($conf->admin->dir_output.'/backup');
240
-
241
-			// Parameteres execution
242
-			$command=$cmddump;
243
-			if (preg_match("/\s/",$command)) $command=escapeshellarg($command);	// Use quotes on command
244
-
245
-			//$param=escapeshellarg($dolibarr_main_db_name)." -h ".escapeshellarg($dolibarr_main_db_host)." -u ".escapeshellarg($dolibarr_main_db_user)." -p".escapeshellarg($dolibarr_main_db_pass);
246
-			$param=$dolibarr_main_db_name." -h ".$dolibarr_main_db_host;
247
-			$param.=" -u ".$dolibarr_main_db_user;
248
-			if (! empty($dolibarr_main_db_port)) $param.=" -P ".$dolibarr_main_db_port;
249
-			if (! GETPOST("use_transaction"))    $param.=" -l --single-transaction";
250
-			if (GETPOST("disable_fk") || $usedefault) $param.=" -K";
251
-			if (GETPOST("sql_compat") && GETPOST("sql_compat") != 'NONE') $param.=" --compatible=".escapeshellarg(GETPOST("sql_compat","alpha"));
252
-			if (GETPOST("drop_database"))        $param.=" --add-drop-database";
253
-			if (GETPOST("sql_structure") || $usedefault)
254
-			{
255
-				if (GETPOST("drop") || $usedefault)	$param.=" --add-drop-table=TRUE";
256
-				else 							    $param.=" --add-drop-table=FALSE";
257
-			}
258
-			else
259
-			{
260
-				$param.=" -t";
261
-			}
262
-			if (GETPOST("disable-add-locks")) $param.=" --add-locks=FALSE";
263
-			if (GETPOST("sql_data") || $usedefault)
264
-			{
265
-				$param.=" --tables";
266
-				if (GETPOST("showcolumns") || $usedefault)	 $param.=" -c";
267
-				if (GETPOST("extended_ins") || $usedefault) $param.=" -e";
268
-				else $param.=" --skip-extended-insert";
269
-				if (GETPOST("delayed"))	 	 $param.=" --delayed-insert";
270
-				if (GETPOST("sql_ignore"))	 $param.=" --insert-ignore";
271
-				if (GETPOST("hexforbinary") || $usedefault) $param.=" --hex-blob";
272
-			}
273
-			else
274
-			{
275
-				$param.=" -d";    // No row information (no data)
276
-			}
277
-			$param.=" --default-character-set=utf8";    // We always save output into utf8 charset
278
-			$paramcrypted=$param;
279
-			$paramclear=$param;
280
-			if (! empty($dolibarr_main_db_pass))
281
-			{
282
-				$paramcrypted.=' -p"'.preg_replace('/./i','*',$dolibarr_main_db_pass).'"';
283
-				$paramclear.=' -p"'.str_replace(array('"','`'),array('\"','\`'),$dolibarr_main_db_pass).'"';
284
-			}
285
-
286
-			$errormsg='';
287
-			$handle = '';
288
-
289
-			// Start call method to execute dump
290
-			$fullcommandcrypted=$command." ".$paramcrypted." 2>&1";
291
-			$fullcommandclear=$command." ".$paramclear." 2>&1";
292
-			if ($compression == 'none') $handle = fopen($outputfile, 'w');
293
-			if ($compression == 'gz')   $handle = gzopen($outputfile, 'w');
294
-			if ($compression == 'bz')   $handle = bzopen($outputfile, 'w');
295
-
296
-			if ($handle)
297
-			{
298
-				if (! empty($conf->global->MAIN_EXEC_USE_POPEN)) $execmethod=$conf->global->MAIN_EXEC_USE_POPEN;
299
-				if (empty($execmethod)) $execmethod=1;
300
-
301
-				$ok=0;
302
-				dol_syslog("Utils::dumpDatabase execmethod=".$execmethod." command:".$fullcommandcrypted, LOG_DEBUG);
303
-
304
-				// TODO Replace with executeCLI function
305
-				if ($execmethod == 1)
306
-				{
307
-					exec($fullcommandclear, $readt, $retval);
308
-					$result = $retval;
309
-
310
-					if ($retval != 0)
311
-					{
312
-						$langs->load("errors");
313
-						dol_syslog("Datadump retval after exec=".$retval, LOG_ERR);
314
-						$error = 'Error '.$retval;
315
-						$ok=0;
316
-					}
317
-					else
318
-					{
319
-						$i=0;
320
-						if (!empty($readt))
321
-						foreach($readt as $key=>$read)
322
-						{
323
-							$i++;   // output line number
324
-							if ($i == 1 && preg_match('/Warning.*Using a password/i', $read)) continue;
325
-							fwrite($handle, $read.($execmethod == 2 ? '' : "\n"));
326
-							if (preg_match('/'.preg_quote('-- Dump completed').'/i',$read)) $ok=1;
327
-							elseif (preg_match('/'.preg_quote('SET SQL_NOTES=@OLD_SQL_NOTES').'/i',$read)) $ok=1;
328
-						}
329
-					}
330
-				}
331
-				if ($execmethod == 2)	// With this method, there is no way to get the return code, only output
332
-				{
333
-					$handlein = popen($fullcommandclear, 'r');
334
-					$i=0;
335
-					while (!feof($handlein))
336
-					{
337
-						$i++;   // output line number
338
-						$read = fgets($handlein);
339
-						// Exclude warning line we don't want
340
-						if ($i == 1 && preg_match('/Warning.*Using a password/i', $read)) continue;
341
-						fwrite($handle,$read);
342
-						if (preg_match('/'.preg_quote('-- Dump completed').'/i',$read)) $ok=1;
343
-						elseif (preg_match('/'.preg_quote('SET SQL_NOTES=@OLD_SQL_NOTES').'/i',$read)) $ok=1;
344
-					}
345
-					pclose($handlein);
346
-				}
347
-
348
-
349
-				if ($compression == 'none') fclose($handle);
350
-				if ($compression == 'gz')   gzclose($handle);
351
-				if ($compression == 'bz')   bzclose($handle);
352
-
353
-				if (! empty($conf->global->MAIN_UMASK))
354
-					@chmod($outputfile, octdec($conf->global->MAIN_UMASK));
355
-			}
356
-			else
357
-			{
358
-				$langs->load("errors");
359
-				dol_syslog("Failed to open file ".$outputfile,LOG_ERR);
360
-				$errormsg=$langs->trans("ErrorFailedToWriteInDir");
361
-			}
362
-
363
-			// Get errorstring
364
-			if ($compression == 'none') $handle = fopen($outputfile, 'r');
365
-			if ($compression == 'gz')   $handle = gzopen($outputfile, 'r');
366
-			if ($compression == 'bz')   $handle = bzopen($outputfile, 'r');
367
-			if ($handle)
368
-			{
369
-				// Get 2048 first chars of error message.
370
-				$errormsg = fgets($handle,2048);
371
-				// Close file
372
-				if ($compression == 'none') fclose($handle);
373
-				if ($compression == 'gz')   gzclose($handle);
374
-				if ($compression == 'bz')   bzclose($handle);
375
-				if ($ok && preg_match('/^-- MySql/i',$errormsg)) $errormsg='';	// Pas erreur
376
-				else
377
-				{
378
-					// Renommer fichier sortie en fichier erreur
379
-					//print "$outputfile -> $outputerror";
380
-					@dol_delete_file($outputerror, 1, 0, 0, null, false, 0);
381
-					@rename($outputfile,$outputerror);
382
-					// Si safe_mode on et command hors du parametre exec, on a un fichier out vide donc errormsg vide
383
-					if (! $errormsg)
384
-					{
385
-						$langs->load("errors");
386
-						$errormsg=$langs->trans("ErrorFailedToRunExternalCommand");
387
-					}
388
-				}
389
-			}
390
-			// Fin execution commande
391
-
392
-			$this->output = $errormsg;
393
-			$this->error = $errormsg;
394
-			$this->result = array("commandbackuplastdone" => $command." ".$paramcrypted, "commandbackuptorun" => "");
395
-			//if (empty($this->output)) $this->output=$this->result['commandbackuplastdone'];
396
-		}
397
-
398
-		// MYSQL NO BIN
399
-		if ($type == 'mysqlnobin')
400
-		{
401
-			$outputfile = $outputdir.'/'.$file;
402
-			$outputfiletemp = $outputfile.'-TMP.sql';
403
-			// for compression format, we add extension
404
-			$compression=$compression ? $compression : 'none';
405
-			if ($compression == 'gz') $outputfile.='.gz';
406
-			if ($compression == 'bz') $outputfile.='.bz2';
407
-			$outputerror = $outputfile.'.err';
408
-			dol_mkdir($conf->admin->dir_output.'/backup');
409
-
410
-			if ($compression == 'gz' or $compression == 'bz')
411
-			{
412
-				$this->backupTables($outputfiletemp);
413
-				dol_compress_file($outputfiletemp, $outputfile, $compression);
414
-				unlink($outputfiletemp);
415
-			}
416
-			else
417
-			{
418
-				$this->backupTables($outputfile);
419
-			}
420
-
421
-			$this->output = "";
422
-			$this->result = array("commandbackuplastdone" => "", "commandbackuptorun" => "");
423
-		}
424
-
425
-		// POSTGRESQL
426
-		if ($type == 'postgresql' || $type == 'pgsql')
427
-		{
428
-			$cmddump=$conf->global->SYSTEMTOOLS_POSTGRESQLDUMP;
429
-
430
-			$outputfile = $outputdir.'/'.$file;
431
-			// for compression format, we add extension
432
-			$compression=$compression ? $compression : 'none';
433
-			if ($compression == 'gz') $outputfile.='.gz';
434
-			if ($compression == 'bz') $outputfile.='.bz2';
435
-			$outputerror = $outputfile.'.err';
436
-			dol_mkdir($conf->admin->dir_output.'/backup');
437
-
438
-			// Parameteres execution
439
-			$command=$cmddump;
440
-			if (preg_match("/\s/",$command)) $command=escapeshellarg($command);	// Use quotes on command
441
-
442
-			//$param=escapeshellarg($dolibarr_main_db_name)." -h ".escapeshellarg($dolibarr_main_db_host)." -u ".escapeshellarg($dolibarr_main_db_user)." -p".escapeshellarg($dolibarr_main_db_pass);
443
-			//$param="-F c";
444
-			$param="-F p";
445
-			$param.=" --no-tablespaces --inserts -h ".$dolibarr_main_db_host;
446
-			$param.=" -U ".$dolibarr_main_db_user;
447
-			if (! empty($dolibarr_main_db_port)) $param.=" -p ".$dolibarr_main_db_port;
448
-			if (GETPOST("sql_compat") && GETPOST("sql_compat") == 'ANSI') $param.="  --disable-dollar-quoting";
449
-			if (GETPOST("drop_database"))        $param.=" -c -C";
450
-			if (GETPOST("sql_structure"))
451
-			{
452
-				if (GETPOST("drop"))			 $param.=" --add-drop-table";
453
-				if (! GETPOST("sql_data"))       $param.=" -s";
454
-			}
455
-			if (GETPOST("sql_data"))
456
-			{
457
-				if (! GETPOST("sql_structure"))	 $param.=" -a";
458
-				if (GETPOST("showcolumns"))	     $param.=" -c";
459
-			}
460
-			$param.=' -f "'.$outputfile.'"';
461
-			//if ($compression == 'none')
462
-			if ($compression == 'gz')   $param.=' -Z 9';
463
-			//if ($compression == 'bz')
464
-			$paramcrypted=$param;
465
-			$paramclear=$param;
466
-			/*if (! empty($dolibarr_main_db_pass))
35
+    var $output;   // Used by Cron method to return message
36
+    var $result;   // Used by Cron method to return data
37
+
38
+    /**
39
+     *	Constructor
40
+     *
41
+     *  @param	DoliDB	$db		Database handler
42
+     */
43
+    function __construct($db)
44
+    {
45
+        $this->db = $db;
46
+    }
47
+
48
+
49
+    /**
50
+     *  Purge files into directory of data files.
51
+     *  CAN BE A CRON TASK
52
+     *
53
+     *  @param	string		$choice		Choice of purge mode ('tempfiles', '' or 'tempfilesold' to purge temp older than 24h, 'allfiles', 'logfile')
54
+     *  @return	int						0 if OK, < 0 if KO (this function is used also by cron so only 0 is OK)
55
+     */
56
+    function purgeFiles($choice='tempfilesold')
57
+    {
58
+        global $conf, $langs, $dolibarr_main_data_root;
59
+
60
+        $langs->load("admin");
61
+
62
+        dol_syslog("Utils::purgeFiles choice=".$choice, LOG_DEBUG);
63
+        require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
64
+
65
+        $filesarray=array();
66
+        if (empty($choice)) $choice='tempfilesold';
67
+
68
+        if ($choice=='tempfiles' || $choice=='tempfilesold')
69
+        {
70
+            // Delete temporary files
71
+            if ($dolibarr_main_data_root)
72
+            {
73
+                $filesarray=dol_dir_list($dolibarr_main_data_root, "directories", 1, '^temp$', '', 'name', SORT_ASC, 2, 0, '', 1);	// Do not follow symlinks
74
+                if ($choice == 'tempfilesold')
75
+                {
76
+                    $now = dol_now();
77
+                    foreach($filesarray as $key => $val)
78
+                    {
79
+                        if ($val['date'] > ($now - (24 * 3600))) unset($filesarray[$key]);	// Discard files not older than 24h
80
+                    }
81
+                }
82
+            }
83
+        }
84
+
85
+        if ($choice=='allfiles')
86
+        {
87
+            // Delete all files (except install.lock, do not follow symbolic links)
88
+            if ($dolibarr_main_data_root)
89
+            {
90
+                $filesarray=dol_dir_list($dolibarr_main_data_root, "all", 0, '', 'install\.lock$', 'name', SORT_ASC, 0, 0, '', 1);
91
+            }
92
+        }
93
+
94
+        if ($choice=='logfile')
95
+        {
96
+            // Define files log
97
+            if ($dolibarr_main_data_root)
98
+            {
99
+                $filesarray=dol_dir_list($dolibarr_main_data_root, "files", 0, '.*\.log[\.0-9]*(\.gz)?$', 'install\.lock$', 'name', SORT_ASC, 0, 0, '', 1);
100
+            }
101
+
102
+            $filelog='';
103
+            if (! empty($conf->syslog->enabled))
104
+            {
105
+                $filelog=$conf->global->SYSLOG_FILE;
106
+                $filelog=preg_replace('/DOL_DATA_ROOT/i',DOL_DATA_ROOT,$filelog);
107
+
108
+                $alreadyincluded=false;
109
+                foreach ($filesarray as $tmpcursor)
110
+                {
111
+                    if ($tmpcursor['fullname'] == $filelog) { $alreadyincluded=true; }
112
+                }
113
+                if (! $alreadyincluded) $filesarray[]=array('fullname'=>$filelog,'type'=>'file');
114
+            }
115
+        }
116
+
117
+        $count=0;
118
+        $countdeleted=0;
119
+        $counterror=0;
120
+        if (count($filesarray))
121
+        {
122
+            foreach($filesarray as $key => $value)
123
+            {
124
+                //print "x ".$filesarray[$key]['fullname']."-".$filesarray[$key]['type']."<br>\n";
125
+                if ($filesarray[$key]['type'] == 'dir')
126
+                {
127
+                    $startcount=0;
128
+                    $tmpcountdeleted=0;
129
+                    $result=dol_delete_dir_recursive($filesarray[$key]['fullname'], $startcount, 1, 0, $tmpcountdeleted);
130
+                    $count+=$result;
131
+                    $countdeleted+=$tmpcountdeleted;
132
+                }
133
+                elseif ($filesarray[$key]['type'] == 'file')
134
+                {
135
+                    // If (file that is not logfile) or (if mode is logfile)
136
+                    if ($filesarray[$key]['fullname'] != $filelog || $choice=='logfile')
137
+                    {
138
+                        $result=dol_delete_file($filesarray[$key]['fullname'], 1, 1);
139
+                        if ($result)
140
+                        {
141
+                            $count++;
142
+                            $countdeleted++;
143
+                        }
144
+                        else
145
+                        {
146
+                            $counterror++;
147
+                        }
148
+                    }
149
+                }
150
+            }
151
+
152
+            // Update cachenbofdoc
153
+            if (! empty($conf->ecm->enabled) && $choice=='allfiles')
154
+            {
155
+                require_once DOL_DOCUMENT_ROOT.'/ecm/class/ecmdirectory.class.php';
156
+                $ecmdirstatic = new EcmDirectory($this->db);
157
+                $result = $ecmdirstatic->refreshcachenboffile(1);
158
+            }
159
+        }
160
+
161
+        if ($count > 0)
162
+        {
163
+            $this->output=$langs->trans("PurgeNDirectoriesDeleted", $countdeleted);
164
+            if ($count > $countdeleted) $this->output.='<br>'.$langs->trans("PurgeNDirectoriesFailed", ($count - $countdeleted));
165
+        }
166
+        else $this->output=$langs->trans("PurgeNothingToDelete").($choice == 'tempfilesold' ? ' (older than 24h)':'');
167
+
168
+        //return $count;
169
+        return 0;     // This function can be called by cron so must return 0 if OK
170
+    }
171
+
172
+
173
+    /**
174
+     *  Make a backup of database
175
+     *  CAN BE A CRON TASK
176
+     *
177
+     *  @param	string		$compression	   'gz' or 'bz' or 'none'
178
+     *  @param  string      $type              'mysql', 'postgresql', ...
179
+     *  @param  int         $usedefault        1=Use default backup profile (Set this to 1 when used as cron)
180
+     *  @param  string      $file              'auto' or filename to build
181
+     *  @param  int         $keeplastnfiles    Keep only last n files (not used yet)
182
+     *  @param	int		    $execmethod		   0=Use default method (that is 1 by default), 1=Use the PHP 'exec', 2=Use the 'popen' method
183
+     *  @return	int						       0 if OK, < 0 if KO (this function is used also by cron so only 0 is OK)
184
+     */
185
+    function dumpDatabase($compression='none', $type='auto', $usedefault=1, $file='auto', $keeplastnfiles=0, $execmethod=0)
186
+    {
187
+        global $db, $conf, $langs, $dolibarr_main_data_root;
188
+        global $dolibarr_main_db_name, $dolibarr_main_db_host, $dolibarr_main_db_user, $dolibarr_main_db_port, $dolibarr_main_db_pass;
189
+
190
+        $langs->load("admin");
191
+
192
+        dol_syslog("Utils::dumpDatabase type=".$type." compression=".$compression." file=".$file, LOG_DEBUG);
193
+        require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
194
+
195
+        // Check compression parameter
196
+        if (! in_array($compression, array('none', 'gz', 'bz', 'zip')))
197
+        {
198
+            $langs->load("errors");
199
+            $this->error=$langs->transnoentitiesnoconv("ErrorBadValueForParameter", $compression, "Compression");
200
+            return -1;
201
+        }
202
+
203
+        // Check type parameter
204
+        if ($type == 'auto') $type = $db->type;
205
+        if (! in_array($type, array('postgresql', 'pgsql', 'mysql', 'mysqli', 'mysqlnobin')))
206
+        {
207
+            $langs->load("errors");
208
+            $this->error=$langs->transnoentitiesnoconv("ErrorBadValueForParameter", $type, "Basetype");
209
+            return -1;
210
+        }
211
+
212
+        // Check file parameter
213
+        if ($file == 'auto')
214
+        {
215
+            $prefix='dump';
216
+            $ext='sql';
217
+            if (in_array($type, array('mysql', 'mysqli')))  { $prefix='mysqldump'; $ext='sql'; }
218
+            //if ($label == 'PostgreSQL') { $prefix='pg_dump'; $ext='dump'; }
219
+            if (in_array($type, array('pgsql'))) { $prefix='pg_dump'; $ext='sql'; }
220
+            $file=$prefix.'_'.$dolibarr_main_db_name.'_'.dol_sanitizeFileName(DOL_VERSION).'_'.strftime("%Y%m%d%H%M").'.'.$ext;
221
+        }
222
+
223
+        $outputdir  = $conf->admin->dir_output.'/backup';
224
+        $result=dol_mkdir($outputdir);
225
+
226
+
227
+        // MYSQL
228
+        if ($type == 'mysql' || $type == 'mysqli')
229
+        {
230
+            $cmddump=$conf->global->SYSTEMTOOLS_MYSQLDUMP;
231
+
232
+
233
+            $outputfile = $outputdir.'/'.$file;
234
+            // for compression format, we add extension
235
+            $compression=$compression ? $compression : 'none';
236
+            if ($compression == 'gz') $outputfile.='.gz';
237
+            if ($compression == 'bz') $outputfile.='.bz2';
238
+            $outputerror = $outputfile.'.err';
239
+            dol_mkdir($conf->admin->dir_output.'/backup');
240
+
241
+            // Parameteres execution
242
+            $command=$cmddump;
243
+            if (preg_match("/\s/",$command)) $command=escapeshellarg($command);	// Use quotes on command
244
+
245
+            //$param=escapeshellarg($dolibarr_main_db_name)." -h ".escapeshellarg($dolibarr_main_db_host)." -u ".escapeshellarg($dolibarr_main_db_user)." -p".escapeshellarg($dolibarr_main_db_pass);
246
+            $param=$dolibarr_main_db_name." -h ".$dolibarr_main_db_host;
247
+            $param.=" -u ".$dolibarr_main_db_user;
248
+            if (! empty($dolibarr_main_db_port)) $param.=" -P ".$dolibarr_main_db_port;
249
+            if (! GETPOST("use_transaction"))    $param.=" -l --single-transaction";
250
+            if (GETPOST("disable_fk") || $usedefault) $param.=" -K";
251
+            if (GETPOST("sql_compat") && GETPOST("sql_compat") != 'NONE') $param.=" --compatible=".escapeshellarg(GETPOST("sql_compat","alpha"));
252
+            if (GETPOST("drop_database"))        $param.=" --add-drop-database";
253
+            if (GETPOST("sql_structure") || $usedefault)
254
+            {
255
+                if (GETPOST("drop") || $usedefault)	$param.=" --add-drop-table=TRUE";
256
+                else 							    $param.=" --add-drop-table=FALSE";
257
+            }
258
+            else
259
+            {
260
+                $param.=" -t";
261
+            }
262
+            if (GETPOST("disable-add-locks")) $param.=" --add-locks=FALSE";
263
+            if (GETPOST("sql_data") || $usedefault)
264
+            {
265
+                $param.=" --tables";
266
+                if (GETPOST("showcolumns") || $usedefault)	 $param.=" -c";
267
+                if (GETPOST("extended_ins") || $usedefault) $param.=" -e";
268
+                else $param.=" --skip-extended-insert";
269
+                if (GETPOST("delayed"))	 	 $param.=" --delayed-insert";
270
+                if (GETPOST("sql_ignore"))	 $param.=" --insert-ignore";
271
+                if (GETPOST("hexforbinary") || $usedefault) $param.=" --hex-blob";
272
+            }
273
+            else
274
+            {
275
+                $param.=" -d";    // No row information (no data)
276
+            }
277
+            $param.=" --default-character-set=utf8";    // We always save output into utf8 charset
278
+            $paramcrypted=$param;
279
+            $paramclear=$param;
280
+            if (! empty($dolibarr_main_db_pass))
281
+            {
282
+                $paramcrypted.=' -p"'.preg_replace('/./i','*',$dolibarr_main_db_pass).'"';
283
+                $paramclear.=' -p"'.str_replace(array('"','`'),array('\"','\`'),$dolibarr_main_db_pass).'"';
284
+            }
285
+
286
+            $errormsg='';
287
+            $handle = '';
288
+
289
+            // Start call method to execute dump
290
+            $fullcommandcrypted=$command." ".$paramcrypted." 2>&1";
291
+            $fullcommandclear=$command." ".$paramclear." 2>&1";
292
+            if ($compression == 'none') $handle = fopen($outputfile, 'w');
293
+            if ($compression == 'gz')   $handle = gzopen($outputfile, 'w');
294
+            if ($compression == 'bz')   $handle = bzopen($outputfile, 'w');
295
+
296
+            if ($handle)
297
+            {
298
+                if (! empty($conf->global->MAIN_EXEC_USE_POPEN)) $execmethod=$conf->global->MAIN_EXEC_USE_POPEN;
299
+                if (empty($execmethod)) $execmethod=1;
300
+
301
+                $ok=0;
302
+                dol_syslog("Utils::dumpDatabase execmethod=".$execmethod." command:".$fullcommandcrypted, LOG_DEBUG);
303
+
304
+                // TODO Replace with executeCLI function
305
+                if ($execmethod == 1)
306
+                {
307
+                    exec($fullcommandclear, $readt, $retval);
308
+                    $result = $retval;
309
+
310
+                    if ($retval != 0)
311
+                    {
312
+                        $langs->load("errors");
313
+                        dol_syslog("Datadump retval after exec=".$retval, LOG_ERR);
314
+                        $error = 'Error '.$retval;
315
+                        $ok=0;
316
+                    }
317
+                    else
318
+                    {
319
+                        $i=0;
320
+                        if (!empty($readt))
321
+                        foreach($readt as $key=>$read)
322
+                        {
323
+                            $i++;   // output line number
324
+                            if ($i == 1 && preg_match('/Warning.*Using a password/i', $read)) continue;
325
+                            fwrite($handle, $read.($execmethod == 2 ? '' : "\n"));
326
+                            if (preg_match('/'.preg_quote('-- Dump completed').'/i',$read)) $ok=1;
327
+                            elseif (preg_match('/'.preg_quote('SET SQL_NOTES=@OLD_SQL_NOTES').'/i',$read)) $ok=1;
328
+                        }
329
+                    }
330
+                }
331
+                if ($execmethod == 2)	// With this method, there is no way to get the return code, only output
332
+                {
333
+                    $handlein = popen($fullcommandclear, 'r');
334
+                    $i=0;
335
+                    while (!feof($handlein))
336
+                    {
337
+                        $i++;   // output line number
338
+                        $read = fgets($handlein);
339
+                        // Exclude warning line we don't want
340
+                        if ($i == 1 && preg_match('/Warning.*Using a password/i', $read)) continue;
341
+                        fwrite($handle,$read);
342
+                        if (preg_match('/'.preg_quote('-- Dump completed').'/i',$read)) $ok=1;
343
+                        elseif (preg_match('/'.preg_quote('SET SQL_NOTES=@OLD_SQL_NOTES').'/i',$read)) $ok=1;
344
+                    }
345
+                    pclose($handlein);
346
+                }
347
+
348
+
349
+                if ($compression == 'none') fclose($handle);
350
+                if ($compression == 'gz')   gzclose($handle);
351
+                if ($compression == 'bz')   bzclose($handle);
352
+
353
+                if (! empty($conf->global->MAIN_UMASK))
354
+                    @chmod($outputfile, octdec($conf->global->MAIN_UMASK));
355
+            }
356
+            else
357
+            {
358
+                $langs->load("errors");
359
+                dol_syslog("Failed to open file ".$outputfile,LOG_ERR);
360
+                $errormsg=$langs->trans("ErrorFailedToWriteInDir");
361
+            }
362
+
363
+            // Get errorstring
364
+            if ($compression == 'none') $handle = fopen($outputfile, 'r');
365
+            if ($compression == 'gz')   $handle = gzopen($outputfile, 'r');
366
+            if ($compression == 'bz')   $handle = bzopen($outputfile, 'r');
367
+            if ($handle)
368
+            {
369
+                // Get 2048 first chars of error message.
370
+                $errormsg = fgets($handle,2048);
371
+                // Close file
372
+                if ($compression == 'none') fclose($handle);
373
+                if ($compression == 'gz')   gzclose($handle);
374
+                if ($compression == 'bz')   bzclose($handle);
375
+                if ($ok && preg_match('/^-- MySql/i',$errormsg)) $errormsg='';	// Pas erreur
376
+                else
377
+                {
378
+                    // Renommer fichier sortie en fichier erreur
379
+                    //print "$outputfile -> $outputerror";
380
+                    @dol_delete_file($outputerror, 1, 0, 0, null, false, 0);
381
+                    @rename($outputfile,$outputerror);
382
+                    // Si safe_mode on et command hors du parametre exec, on a un fichier out vide donc errormsg vide
383
+                    if (! $errormsg)
384
+                    {
385
+                        $langs->load("errors");
386
+                        $errormsg=$langs->trans("ErrorFailedToRunExternalCommand");
387
+                    }
388
+                }
389
+            }
390
+            // Fin execution commande
391
+
392
+            $this->output = $errormsg;
393
+            $this->error = $errormsg;
394
+            $this->result = array("commandbackuplastdone" => $command." ".$paramcrypted, "commandbackuptorun" => "");
395
+            //if (empty($this->output)) $this->output=$this->result['commandbackuplastdone'];
396
+        }
397
+
398
+        // MYSQL NO BIN
399
+        if ($type == 'mysqlnobin')
400
+        {
401
+            $outputfile = $outputdir.'/'.$file;
402
+            $outputfiletemp = $outputfile.'-TMP.sql';
403
+            // for compression format, we add extension
404
+            $compression=$compression ? $compression : 'none';
405
+            if ($compression == 'gz') $outputfile.='.gz';
406
+            if ($compression == 'bz') $outputfile.='.bz2';
407
+            $outputerror = $outputfile.'.err';
408
+            dol_mkdir($conf->admin->dir_output.'/backup');
409
+
410
+            if ($compression == 'gz' or $compression == 'bz')
411
+            {
412
+                $this->backupTables($outputfiletemp);
413
+                dol_compress_file($outputfiletemp, $outputfile, $compression);
414
+                unlink($outputfiletemp);
415
+            }
416
+            else
417
+            {
418
+                $this->backupTables($outputfile);
419
+            }
420
+
421
+            $this->output = "";
422
+            $this->result = array("commandbackuplastdone" => "", "commandbackuptorun" => "");
423
+        }
424
+
425
+        // POSTGRESQL
426
+        if ($type == 'postgresql' || $type == 'pgsql')
427
+        {
428
+            $cmddump=$conf->global->SYSTEMTOOLS_POSTGRESQLDUMP;
429
+
430
+            $outputfile = $outputdir.'/'.$file;
431
+            // for compression format, we add extension
432
+            $compression=$compression ? $compression : 'none';
433
+            if ($compression == 'gz') $outputfile.='.gz';
434
+            if ($compression == 'bz') $outputfile.='.bz2';
435
+            $outputerror = $outputfile.'.err';
436
+            dol_mkdir($conf->admin->dir_output.'/backup');
437
+
438
+            // Parameteres execution
439
+            $command=$cmddump;
440
+            if (preg_match("/\s/",$command)) $command=escapeshellarg($command);	// Use quotes on command
441
+
442
+            //$param=escapeshellarg($dolibarr_main_db_name)." -h ".escapeshellarg($dolibarr_main_db_host)." -u ".escapeshellarg($dolibarr_main_db_user)." -p".escapeshellarg($dolibarr_main_db_pass);
443
+            //$param="-F c";
444
+            $param="-F p";
445
+            $param.=" --no-tablespaces --inserts -h ".$dolibarr_main_db_host;
446
+            $param.=" -U ".$dolibarr_main_db_user;
447
+            if (! empty($dolibarr_main_db_port)) $param.=" -p ".$dolibarr_main_db_port;
448
+            if (GETPOST("sql_compat") && GETPOST("sql_compat") == 'ANSI') $param.="  --disable-dollar-quoting";
449
+            if (GETPOST("drop_database"))        $param.=" -c -C";
450
+            if (GETPOST("sql_structure"))
451
+            {
452
+                if (GETPOST("drop"))			 $param.=" --add-drop-table";
453
+                if (! GETPOST("sql_data"))       $param.=" -s";
454
+            }
455
+            if (GETPOST("sql_data"))
456
+            {
457
+                if (! GETPOST("sql_structure"))	 $param.=" -a";
458
+                if (GETPOST("showcolumns"))	     $param.=" -c";
459
+            }
460
+            $param.=' -f "'.$outputfile.'"';
461
+            //if ($compression == 'none')
462
+            if ($compression == 'gz')   $param.=' -Z 9';
463
+            //if ($compression == 'bz')
464
+            $paramcrypted=$param;
465
+            $paramclear=$param;
466
+            /*if (! empty($dolibarr_main_db_pass))
467 467
 			 {
468 468
 			 $paramcrypted.=" -W".preg_replace('/./i','*',$dolibarr_main_db_pass);
469 469
 			 $paramclear.=" -W".$dolibarr_main_db_pass;
470 470
 			 }*/
471
-			$paramcrypted.=" -w ".$dolibarr_main_db_name;
472
-			$paramclear.=" -w ".$dolibarr_main_db_name;
473
-
474
-			$this->output = "";
475
-			$this->result = array("commandbackuplastdone" => "", "commandbackuptorun" => $command." ".$paramcrypted);
476
-		}
477
-
478
-		// Clean old files
479
-		if ($keeplastnfiles > 0)
480
-		{
481
-			$tmpfiles = dol_dir_list($conf->admin->dir_output.'/backup', 'files', 0, '', '(\.err|\.old|\.sav)$', 'date', SORT_DESC);
482
-			$i=0;
483
-			foreach($tmpfiles as $key => $val)
484
-			{
485
-				$i++;
486
-				if ($i <= $keeplastnfiles) continue;
487
-				dol_delete_file($val['fullname'], 0, 0, 0, null, false, 0);
488
-			}
489
-		}
490
-
491
-		return 0;
492
-	}
493
-
494
-
495
-
496
-	/**
497
-	 * Execute a CLI command.
498
-	 *
499
-	 * @param 	string	$command		Command line to execute.
500
-	 * @param 	string	$outputfile		Output file (used only when method is 2). For exemple $conf->admin->dir_temp.'/out.tmp';
501
-	 * @param	int		$execmethod		0=Use default method (that is 1 by default), 1=Use the PHP 'exec', 2=Use the 'popen' method
502
-	 * @return	array					array('result'=>...,'output'=>...,'error'=>...). result = 0 means OK.
503
-	 */
504
-	function executeCLI($command, $outputfile, $execmethod=0)
505
-	{
506
-		global $conf, $langs;
507
-
508
-		$result = 0;
509
-		$output = '';
510
-		$error = '';
511
-
512
-		$command=escapeshellcmd($command);
513
-		$command.=" 2>&1";
514
-
515
-		if (! empty($conf->global->MAIN_EXEC_USE_POPEN)) $execmethod=$conf->global->MAIN_EXEC_USE_POPEN;
516
-		if (empty($execmethod)) $execmethod=1;
517
-		//$execmethod=1;
518
-
519
-		dol_syslog("Utils::executeCLI execmethod=".$execmethod." system:".$command, LOG_DEBUG);
520
-		$output_arr=array();
521
-
522
-		if ($execmethod == 1)
523
-		{
524
-			exec($command, $output_arr, $retval);
525
-			$result = $retval;
526
-			if ($retval != 0)
527
-			{
528
-				$langs->load("errors");
529
-				dol_syslog("Utils::executeCLI retval after exec=".$retval, LOG_ERR);
530
-				$error = 'Error '.$retval;
531
-			}
532
-		}
533
-		if ($execmethod == 2)	// With this method, there is no way to get the return code, only output
534
-		{
535
-			$ok=0;
536
-			$handle = fopen($outputfile, 'w+b');
537
-			if ($handle)
538
-			{
539
-				dol_syslog("Utils::executeCLI run command ".$command);
540
-				$handlein = popen($command, 'r');
541
-				while (!feof($handlein))
542
-				{
543
-					$read = fgets($handlein);
544
-					fwrite($handle,$read);
545
-					$output_arr[]=$read;
546
-				}
547
-				pclose($handlein);
548
-				fclose($handle);
549
-			}
550
-			if (! empty($conf->global->MAIN_UMASK)) @chmod($outputfile, octdec($conf->global->MAIN_UMASK));
551
-		}
552
-
553
-		// Update with result
554
-		if (is_array($output_arr) && count($output_arr)>0)
555
-		{
556
-			foreach($output_arr as $val)
557
-			{
558
-				$output.=$val.($execmethod == 2 ? '' : "\n");
559
-			}
560
-		}
561
-
562
-		dol_syslog("Utils::executeCLI result=".$result." output=".$output." error=".$error, LOG_DEBUG);
563
-
564
-		return array('result'=>$result, 'output'=>$output, 'error'=>$error);
565
-	}
566
-
567
-	/**
568
-	 * Generate documentation of a Module
569
-	 *
570
-	 * @param 	string	$module		Module name
571
-	 * @return	int					<0 if KO, >0 if OK
572
-	 */
573
-	function generateDoc($module)
574
-	{
575
-		global $conf, $langs;
576
-		global $dirins;
577
-
578
-		$error = 0;
579
-
580
-		$modulelowercase=strtolower($module);
581
-
582
-		// Dir for module
583
-		$dir = $dirins.'/'.$modulelowercase;
584
-		// Zip file to build
585
-		$FILENAMEDOC='';
586
-
587
-		// Load module
588
-		dol_include_once($modulelowercase.'/core/modules/mod'.$module.'.class.php');
589
-		$class='mod'.$module;
590
-
591
-		if (class_exists($class))
592
-		{
593
-			try {
594
-				$moduleobj = new $class($this->db);
595
-			}
596
-			catch(Exception $e)
597
-			{
598
-				$error++;
599
-				dol_print_error($e->getMessage());
600
-			}
601
-		}
602
-		else
603
-		{
604
-			$error++;
605
-			$langs->load("errors");
606
-			dol_print_error($langs->trans("ErrorFailedToLoadModuleDescriptorForXXX", $module));
607
-			exit;
608
-		}
609
-
610
-		$arrayversion=explode('.',$moduleobj->version,3);
611
-		if (count($arrayversion))
612
-		{
613
-			$FILENAMEASCII=strtolower($module).'.asciidoc';
614
-			$FILENAMEDOC=strtolower($module).'.html';			// TODO Use/text PDF
615
-
616
-			$dirofmodule = dol_buildpath(strtolower($module), 0).'/doc';
617
-			$dirofmoduletmp = dol_buildpath(strtolower($module), 0).'/doc/temp';
618
-			$outputfiledoc = $dirofmodule.'/'.$FILENAMEDOC;
619
-			if ($dirofmodule)
620
-			{
621
-				if (! dol_is_dir($dirofmodule)) dol_mkdir($dirofmodule);
622
-				if (! dol_is_dir($dirofmoduletmp)) dol_mkdir($dirofmoduletmp);
623
-				if (! is_writable($dirofmoduletmp))
624
-				{
625
-					$this->error = 'Dir '.$dirofmoduletmp.' does not exists or is not writable';
626
-					return -1;
627
-				}
628
-
629
-				$destfile=$dirofmoduletmp.'/'.$FILENAMEASCII;
630
-
631
-				$fhandle = fopen($destfile, 'w+');
632
-				if ($fhandle)
633
-				{
634
-					$specs=dol_dir_list(dol_buildpath(strtolower($module).'/doc', 0), 'files', 1, '(\.md|\.asciidoc)$', array('\/temp\/'));
635
-
636
-					$i = 0;
637
-					foreach ($specs as $spec)
638
-					{
639
-						if (preg_match('/notindoc/', $spec['relativename'])) continue;	// Discard file
640
-						if (preg_match('/disabled/', $spec['relativename'])) continue;	// Discard file
641
-
642
-						$pathtofile = strtolower($module).'/doc/'.$spec['relativename'];
643
-						$format='asciidoc';
644
-						if (preg_match('/\.md$/i', $spec['name'])) $format='markdown';
645
-
646
-						$filecursor = @file_get_contents($spec['fullname']);
647
-						if ($filecursor)
648
-						{
649
-							fwrite($fhandle, ($i ? "\n<<<\n\n" : "").$filecursor."\n");
650
-						}
651
-						else
652
-						{
653
-							$this->error = 'Failed to concat content of file '.$spec['fullname'];
654
-							return -1;
655
-						}
656
-
657
-						$i++;
658
-					}
659
-
660
-					fwrite($fhandle, "\n\n\n== DATA SPECIFICATIONS...\n\n");
661
-
662
-					// TODO
663
-					fwrite($fhandle, "TODO...");
664
-
665
-					fclose($fhandle);
666
-				}
667
-
668
-				$conf->global->MODULEBUILDER_ASCIIDOCTOR='asciidoctor';
669
-				if (empty($conf->global->MODULEBUILDER_ASCIIDOCTOR))
670
-				{
671
-					dol_print_error('', 'Module setup not complete');
672
-					exit;
673
-				}
674
-
675
-				$command=$conf->global->MODULEBUILDER_ASCIIDOCTOR.' '.$destfile.' -n -o '.$dirofmodule.'/'.$FILENAMEDOC;
676
-				$outfile=$dirofmoduletmp.'/out.tmp';
677
-
678
-				require_once DOL_DOCUMENT_ROOT.'/core/class/utils.class.php';
679
-				$utils = new Utils($db);
680
-				$resarray = $utils->executeCLI($command, $outfile);
681
-				if ($resarray['result'] != '0')
682
-				{
683
-					$this->error = $resarray['error'].' '.$resarray['output'];
684
-				}
685
-				$result = ($resarray['result'] == 0) ? 1 : 0;
686
-			}
687
-			else
688
-			{
689
-				$result = 0;
690
-			}
691
-
692
-			if ($result > 0)
693
-			{
694
-				return 1;
695
-			}
696
-			else
697
-			{
698
-				$error++;
699
-				$langs->load("errors");
700
-				$this->error = $langs->trans("ErrorFailToGenerateFile", $outputfiledoc);
701
-			}
702
-		}
703
-		else
704
-		{
705
-			$error++;
706
-			$langs->load("errors");
707
-			$this->error = $langs->trans("ErrorCheckVersionIsDefined");
708
-		}
709
-
710
-		return -1;
711
-	}
712
-
713
-	/**
714
-	 * This saves syslog files and compresses older ones.
715
-	 * Nb of archive to keep is defined into $conf->global->SYSLOG_FILE_SAVES
716
-	 * CAN BE A CRON TASK
717
-	 *
718
-	 * @return	int						0 if OK, < 0 if KO
719
-	 */
471
+            $paramcrypted.=" -w ".$dolibarr_main_db_name;
472
+            $paramclear.=" -w ".$dolibarr_main_db_name;
473
+
474
+            $this->output = "";
475
+            $this->result = array("commandbackuplastdone" => "", "commandbackuptorun" => $command." ".$paramcrypted);
476
+        }
477
+
478
+        // Clean old files
479
+        if ($keeplastnfiles > 0)
480
+        {
481
+            $tmpfiles = dol_dir_list($conf->admin->dir_output.'/backup', 'files', 0, '', '(\.err|\.old|\.sav)$', 'date', SORT_DESC);
482
+            $i=0;
483
+            foreach($tmpfiles as $key => $val)
484
+            {
485
+                $i++;
486
+                if ($i <= $keeplastnfiles) continue;
487
+                dol_delete_file($val['fullname'], 0, 0, 0, null, false, 0);
488
+            }
489
+        }
490
+
491
+        return 0;
492
+    }
493
+
494
+
495
+
496
+    /**
497
+     * Execute a CLI command.
498
+     *
499
+     * @param 	string	$command		Command line to execute.
500
+     * @param 	string	$outputfile		Output file (used only when method is 2). For exemple $conf->admin->dir_temp.'/out.tmp';
501
+     * @param	int		$execmethod		0=Use default method (that is 1 by default), 1=Use the PHP 'exec', 2=Use the 'popen' method
502
+     * @return	array					array('result'=>...,'output'=>...,'error'=>...). result = 0 means OK.
503
+     */
504
+    function executeCLI($command, $outputfile, $execmethod=0)
505
+    {
506
+        global $conf, $langs;
507
+
508
+        $result = 0;
509
+        $output = '';
510
+        $error = '';
511
+
512
+        $command=escapeshellcmd($command);
513
+        $command.=" 2>&1";
514
+
515
+        if (! empty($conf->global->MAIN_EXEC_USE_POPEN)) $execmethod=$conf->global->MAIN_EXEC_USE_POPEN;
516
+        if (empty($execmethod)) $execmethod=1;
517
+        //$execmethod=1;
518
+
519
+        dol_syslog("Utils::executeCLI execmethod=".$execmethod." system:".$command, LOG_DEBUG);
520
+        $output_arr=array();
521
+
522
+        if ($execmethod == 1)
523
+        {
524
+            exec($command, $output_arr, $retval);
525
+            $result = $retval;
526
+            if ($retval != 0)
527
+            {
528
+                $langs->load("errors");
529
+                dol_syslog("Utils::executeCLI retval after exec=".$retval, LOG_ERR);
530
+                $error = 'Error '.$retval;
531
+            }
532
+        }
533
+        if ($execmethod == 2)	// With this method, there is no way to get the return code, only output
534
+        {
535
+            $ok=0;
536
+            $handle = fopen($outputfile, 'w+b');
537
+            if ($handle)
538
+            {
539
+                dol_syslog("Utils::executeCLI run command ".$command);
540
+                $handlein = popen($command, 'r');
541
+                while (!feof($handlein))
542
+                {
543
+                    $read = fgets($handlein);
544
+                    fwrite($handle,$read);
545
+                    $output_arr[]=$read;
546
+                }
547
+                pclose($handlein);
548
+                fclose($handle);
549
+            }
550
+            if (! empty($conf->global->MAIN_UMASK)) @chmod($outputfile, octdec($conf->global->MAIN_UMASK));
551
+        }
552
+
553
+        // Update with result
554
+        if (is_array($output_arr) && count($output_arr)>0)
555
+        {
556
+            foreach($output_arr as $val)
557
+            {
558
+                $output.=$val.($execmethod == 2 ? '' : "\n");
559
+            }
560
+        }
561
+
562
+        dol_syslog("Utils::executeCLI result=".$result." output=".$output." error=".$error, LOG_DEBUG);
563
+
564
+        return array('result'=>$result, 'output'=>$output, 'error'=>$error);
565
+    }
566
+
567
+    /**
568
+     * Generate documentation of a Module
569
+     *
570
+     * @param 	string	$module		Module name
571
+     * @return	int					<0 if KO, >0 if OK
572
+     */
573
+    function generateDoc($module)
574
+    {
575
+        global $conf, $langs;
576
+        global $dirins;
577
+
578
+        $error = 0;
579
+
580
+        $modulelowercase=strtolower($module);
581
+
582
+        // Dir for module
583
+        $dir = $dirins.'/'.$modulelowercase;
584
+        // Zip file to build
585
+        $FILENAMEDOC='';
586
+
587
+        // Load module
588
+        dol_include_once($modulelowercase.'/core/modules/mod'.$module.'.class.php');
589
+        $class='mod'.$module;
590
+
591
+        if (class_exists($class))
592
+        {
593
+            try {
594
+                $moduleobj = new $class($this->db);
595
+            }
596
+            catch(Exception $e)
597
+            {
598
+                $error++;
599
+                dol_print_error($e->getMessage());
600
+            }
601
+        }
602
+        else
603
+        {
604
+            $error++;
605
+            $langs->load("errors");
606
+            dol_print_error($langs->trans("ErrorFailedToLoadModuleDescriptorForXXX", $module));
607
+            exit;
608
+        }
609
+
610
+        $arrayversion=explode('.',$moduleobj->version,3);
611
+        if (count($arrayversion))
612
+        {
613
+            $FILENAMEASCII=strtolower($module).'.asciidoc';
614
+            $FILENAMEDOC=strtolower($module).'.html';			// TODO Use/text PDF
615
+
616
+            $dirofmodule = dol_buildpath(strtolower($module), 0).'/doc';
617
+            $dirofmoduletmp = dol_buildpath(strtolower($module), 0).'/doc/temp';
618
+            $outputfiledoc = $dirofmodule.'/'.$FILENAMEDOC;
619
+            if ($dirofmodule)
620
+            {
621
+                if (! dol_is_dir($dirofmodule)) dol_mkdir($dirofmodule);
622
+                if (! dol_is_dir($dirofmoduletmp)) dol_mkdir($dirofmoduletmp);
623
+                if (! is_writable($dirofmoduletmp))
624
+                {
625
+                    $this->error = 'Dir '.$dirofmoduletmp.' does not exists or is not writable';
626
+                    return -1;
627
+                }
628
+
629
+                $destfile=$dirofmoduletmp.'/'.$FILENAMEASCII;
630
+
631
+                $fhandle = fopen($destfile, 'w+');
632
+                if ($fhandle)
633
+                {
634
+                    $specs=dol_dir_list(dol_buildpath(strtolower($module).'/doc', 0), 'files', 1, '(\.md|\.asciidoc)$', array('\/temp\/'));
635
+
636
+                    $i = 0;
637
+                    foreach ($specs as $spec)
638
+                    {
639
+                        if (preg_match('/notindoc/', $spec['relativename'])) continue;	// Discard file
640
+                        if (preg_match('/disabled/', $spec['relativename'])) continue;	// Discard file
641
+
642
+                        $pathtofile = strtolower($module).'/doc/'.$spec['relativename'];
643
+                        $format='asciidoc';
644
+                        if (preg_match('/\.md$/i', $spec['name'])) $format='markdown';
645
+
646
+                        $filecursor = @file_get_contents($spec['fullname']);
647
+                        if ($filecursor)
648
+                        {
649
+                            fwrite($fhandle, ($i ? "\n<<<\n\n" : "").$filecursor."\n");
650
+                        }
651
+                        else
652
+                        {
653
+                            $this->error = 'Failed to concat content of file '.$spec['fullname'];
654
+                            return -1;
655
+                        }
656
+
657
+                        $i++;
658
+                    }
659
+
660
+                    fwrite($fhandle, "\n\n\n== DATA SPECIFICATIONS...\n\n");
661
+
662
+                    // TODO
663
+                    fwrite($fhandle, "TODO...");
664
+
665
+                    fclose($fhandle);
666
+                }
667
+
668
+                $conf->global->MODULEBUILDER_ASCIIDOCTOR='asciidoctor';
669
+                if (empty($conf->global->MODULEBUILDER_ASCIIDOCTOR))
670
+                {
671
+                    dol_print_error('', 'Module setup not complete');
672
+                    exit;
673
+                }
674
+
675
+                $command=$conf->global->MODULEBUILDER_ASCIIDOCTOR.' '.$destfile.' -n -o '.$dirofmodule.'/'.$FILENAMEDOC;
676
+                $outfile=$dirofmoduletmp.'/out.tmp';
677
+
678
+                require_once DOL_DOCUMENT_ROOT.'/core/class/utils.class.php';
679
+                $utils = new Utils($db);
680
+                $resarray = $utils->executeCLI($command, $outfile);
681
+                if ($resarray['result'] != '0')
682
+                {
683
+                    $this->error = $resarray['error'].' '.$resarray['output'];
684
+                }
685
+                $result = ($resarray['result'] == 0) ? 1 : 0;
686
+            }
687
+            else
688
+            {
689
+                $result = 0;
690
+            }
691
+
692
+            if ($result > 0)
693
+            {
694
+                return 1;
695
+            }
696
+            else
697
+            {
698
+                $error++;
699
+                $langs->load("errors");
700
+                $this->error = $langs->trans("ErrorFailToGenerateFile", $outputfiledoc);
701
+            }
702
+        }
703
+        else
704
+        {
705
+            $error++;
706
+            $langs->load("errors");
707
+            $this->error = $langs->trans("ErrorCheckVersionIsDefined");
708
+        }
709
+
710
+        return -1;
711
+    }
712
+
713
+    /**
714
+     * This saves syslog files and compresses older ones.
715
+     * Nb of archive to keep is defined into $conf->global->SYSLOG_FILE_SAVES
716
+     * CAN BE A CRON TASK
717
+     *
718
+     * @return	int						0 if OK, < 0 if KO
719
+     */
720 720
     function compressSyslogs()
721 721
     {
722
-		global $conf;
722
+        global $conf;
723
+
724
+        if(empty($conf->loghandlers['mod_syslog_file'])) { // File Syslog disabled
725
+            return 0;
726
+        }
727
+
728
+        if(! function_exists('gzopen')) {
729
+            $this->error = 'Support for gzopen not available in this PHP';
730
+            return -1;
731
+        }
732
+
733
+        dol_include_once('/core/lib/files.lib.php');
734
+
735
+        $nbSaves = ! empty($conf->global->SYSLOG_FILE_SAVES) ? intval($conf->global->SYSLOG_FILE_SAVES) : 14;
736
+
737
+        if (empty($conf->global->SYSLOG_FILE)) {
738
+            $mainlogdir = DOL_DATA_ROOT;
739
+            $mainlog = 'dolibarr.log';
740
+        } else {
741
+            $mainlogfull = str_replace('DOL_DATA_ROOT', DOL_DATA_ROOT, $conf->global->SYSLOG_FILE);
742
+            $mainlogdir = dirname($mainlogfull);
743
+            $mainlog = basename($mainlogfull);
744
+        }
745
+
746
+        $tabfiles = dol_dir_list(DOL_DATA_ROOT, 'files', 0, '^(dolibarr_.+|odt2pdf)\.log$'); // Also handle other log files like dolibarr_install.log
747
+        $tabfiles[] = array('name' => $mainlog, 'path' => $mainlogdir);
723 748
 
724
-		if(empty($conf->loghandlers['mod_syslog_file'])) { // File Syslog disabled
725
-			return 0;
726
-		}
749
+        foreach($tabfiles as $file) {
727 750
 
728
-		if(! function_exists('gzopen')) {
729
-			$this->error = 'Support for gzopen not available in this PHP';
730
-			return -1;
731
-		}
751
+            $logname = $file['name'];
752
+            $logpath = $file['path'];
732 753
 
733
-		dol_include_once('/core/lib/files.lib.php');
754
+            if (dol_is_file($logpath.'/'.$logname) && dol_filesize($logpath.'/'.$logname) > 0)	// If log file exists and is not empty
755
+            {
756
+                // Handle already compressed files to rename them and add +1
734 757
 
735
-		$nbSaves = ! empty($conf->global->SYSLOG_FILE_SAVES) ? intval($conf->global->SYSLOG_FILE_SAVES) : 14;
758
+                $filter = '^'.preg_quote($logname, '/').'\.([0-9]+)\.gz$';
736 759
 
737
-		if (empty($conf->global->SYSLOG_FILE)) {
738
-			$mainlogdir = DOL_DATA_ROOT;
739
-			$mainlog = 'dolibarr.log';
740
-		} else {
741
-			$mainlogfull = str_replace('DOL_DATA_ROOT', DOL_DATA_ROOT, $conf->global->SYSLOG_FILE);
742
-			$mainlogdir = dirname($mainlogfull);
743
-			$mainlog = basename($mainlogfull);
744
-		}
760
+                $gzfilestmp = dol_dir_list($logpath, 'files', 0, $filter);
761
+                $gzfiles = array();
745 762
 
746
-		$tabfiles = dol_dir_list(DOL_DATA_ROOT, 'files', 0, '^(dolibarr_.+|odt2pdf)\.log$'); // Also handle other log files like dolibarr_install.log
747
-		$tabfiles[] = array('name' => $mainlog, 'path' => $mainlogdir);
763
+                foreach($gzfilestmp as $gzfile) {
764
+                    $tabmatches = array();
765
+                    preg_match('/'.$filter.'/i', $gzfile['name'], $tabmatches);
748 766
 
749
-		foreach($tabfiles as $file) {
750
-
751
-			$logname = $file['name'];
752
-			$logpath = $file['path'];
753
-
754
-			if (dol_is_file($logpath.'/'.$logname) && dol_filesize($logpath.'/'.$logname) > 0)	// If log file exists and is not empty
755
-			{
756
-				// Handle already compressed files to rename them and add +1
757
-
758
-				$filter = '^'.preg_quote($logname, '/').'\.([0-9]+)\.gz$';
759
-
760
-				$gzfilestmp = dol_dir_list($logpath, 'files', 0, $filter);
761
-				$gzfiles = array();
762
-
763
-				foreach($gzfilestmp as $gzfile) {
764
-					$tabmatches = array();
765
-					preg_match('/'.$filter.'/i', $gzfile['name'], $tabmatches);
766
-
767
-					$numsave = intval($tabmatches[1]);
768
-
769
-					$gzfiles[$numsave] = $gzfile;
770
-				}
771
-
772
-				krsort($gzfiles, SORT_NUMERIC);
773
-
774
-				foreach($gzfiles as $numsave => $dummy) {
775
-					if (dol_is_file($logpath.'/'.$logname.'.'.($numsave+1).'.gz')) {
776
-						return -2;
777
-					}
778
-
779
-					if($numsave >= $nbSaves) {
780
-						dol_delete_file($logpath.'/'.$logname.'.'.$numsave.'.gz', 0, 0, 0, null, false, 0);
781
-					} else {
782
-						dol_move($logpath.'/'.$logname.'.'.$numsave.'.gz', $logpath.'/'.$logname.'.'.($numsave+1).'.gz', 0, 1, 0, 0);
783
-					}
784
-				}
785
-
786
-				// Compress current file and recreate it
787
-
788
-				if ($nbSaves > 0) {			// If $nbSaves is 1, we keep 1 archive .gz file, If 2, we keep 2 .gz files
789
-					$gzfilehandle = gzopen($logpath.'/'.$logname.'.1.gz', 'wb9');
790
-
791
-					if (empty($gzfilehandle)) {
792
-						$this->error = 'Failted to open file '.$logpath.'/'.$logname.'.1.gz';
793
-						return -3;
794
-					}
795
-
796
-					$sourcehandle = fopen($logpath.'/'.$logname, 'r');
797
-
798
-					if (empty($sourcehandle)) {
799
-						$this->error = 'Failed to open file '.$logpath.'/'.$logname;
800
-						return -4;
801
-					}
802
-
803
-					while(! feof($sourcehandle)) {
804
-						gzwrite($gzfilehandle, fread($sourcehandle, 512 * 1024)); // Read 512 kB at a time
805
-					}
806
-
807
-					fclose($sourcehandle);
808
-					gzclose($gzfilehandle);
809
-
810
-					@chmod($logpath.'/'.$logname.'.1.gz', octdec(empty($conf->global->MAIN_UMASK)?'0664':$conf->global->MAIN_UMASK));
811
-				}
812
-
813
-				dol_delete_file($logpath.'/'.$logname, 0, 0, 0, null, false, 0);
814
-
815
-				// Create empty file
816
-				$newlog = fopen($logpath.'/'.$logname, 'a+');
817
-				fclose($newlog);
818
-
819
-				//var_dump($logpath.'/'.$logname." - ".octdec(empty($conf->global->MAIN_UMASK)?'0664':$conf->global->MAIN_UMASK));
820
-				@chmod($logpath.'/'.$logname, octdec(empty($conf->global->MAIN_UMASK)?'0664':$conf->global->MAIN_UMASK));
821
-			}
822
-		}
823
-
824
-		$this->output = 'Archive log files (keeping last SYSLOG_FILE_SAVES='.$nbSaves.' files) done.';
825
-		return 0;
826
-	}
827
-
828
-	/**	Backup the db OR just a table without mysqldump binary, with PHP only (does not require any exec permission)
829
-	 *	Author: David Walsh (http://davidwalsh.name/backup-mysql-database-php)
830
-	 *	Updated and enhanced by Stephen Larroque (lrq3000) and by the many commentators from the blog
831
-	 *	Note about foreign keys constraints: for Dolibarr, since there are a lot of constraints and when imported the tables will be inserted in the dumped order, not in constraints order, then we ABSOLUTELY need to use SET FOREIGN_KEY_CHECKS=0; when importing the sql dump.
832
-	 *	Note2: db2SQL by Howard Yeend can be an alternative, by using SHOW FIELDS FROM and SHOW KEYS FROM we could generate a more precise dump (eg: by getting the type of the field and then precisely outputting the right formatting - in quotes, numeric or null - instead of trying to guess like we are doing now).
833
-	 *
834
-	 *	@param	string	$outputfile		Output file name
835
-	 *	@param	string	$tables			Table name or '*' for all
836
-	 *	@return	int						<0 if KO, >0 if OK
837
-	 */
838
-	function backupTables($outputfile, $tables='*')
839
-	{
840
-		global $db, $langs;
841
-		global $errormsg;
842
-
843
-		// Set to UTF-8
844
-		if (is_a($db, 'DoliDBMysqli')) {
845
-			/** @var DoliDBMysqli $db */
846
-			$db->db->set_charset('utf8');
847
-		} else {
848
-			/** @var DoliDB $db */
849
-			$db->query('SET NAMES utf8');
850
-			$db->query('SET CHARACTER SET utf8');
851
-		}
852
-
853
-		//get all of the tables
854
-		if ($tables == '*')
855
-		{
856
-			$tables = array();
857
-			$result = $db->query('SHOW FULL TABLES WHERE Table_type = \'BASE TABLE\'');
858
-			while($row = $db->fetch_row($result))
859
-			{
860
-				$tables[] = $row[0];
861
-			}
862
-		}
863
-		else
864
-		{
865
-			$tables = is_array($tables) ? $tables : explode(',',$tables);
866
-		}
867
-
868
-		//cycle through
869
-		$handle = fopen($outputfile, 'w+');
870
-		if (fwrite($handle, '') === false)
871
-		{
872
-			$langs->load("errors");
873
-			dol_syslog("Failed to open file ".$outputfile,LOG_ERR);
874
-			$errormsg=$langs->trans("ErrorFailedToWriteInDir");
875
-			return -1;
876
-		}
877
-
878
-		// Print headers and global mysql config vars
879
-		$sqlhead = '';
880
-		$sqlhead .= "-- ".$db::LABEL." dump via php with Dolibarr ".DOL_VERSION."
767
+                    $numsave = intval($tabmatches[1]);
768
+
769
+                    $gzfiles[$numsave] = $gzfile;
770
+                }
771
+
772
+                krsort($gzfiles, SORT_NUMERIC);
773
+
774
+                foreach($gzfiles as $numsave => $dummy) {
775
+                    if (dol_is_file($logpath.'/'.$logname.'.'.($numsave+1).'.gz')) {
776
+                        return -2;
777
+                    }
778
+
779
+                    if($numsave >= $nbSaves) {
780
+                        dol_delete_file($logpath.'/'.$logname.'.'.$numsave.'.gz', 0, 0, 0, null, false, 0);
781
+                    } else {
782
+                        dol_move($logpath.'/'.$logname.'.'.$numsave.'.gz', $logpath.'/'.$logname.'.'.($numsave+1).'.gz', 0, 1, 0, 0);
783
+                    }
784
+                }
785
+
786
+                // Compress current file and recreate it
787
+
788
+                if ($nbSaves > 0) {			// If $nbSaves is 1, we keep 1 archive .gz file, If 2, we keep 2 .gz files
789
+                    $gzfilehandle = gzopen($logpath.'/'.$logname.'.1.gz', 'wb9');
790
+
791
+                    if (empty($gzfilehandle)) {
792
+                        $this->error = 'Failted to open file '.$logpath.'/'.$logname.'.1.gz';
793
+                        return -3;
794
+                    }
795
+
796
+                    $sourcehandle = fopen($logpath.'/'.$logname, 'r');
797
+
798
+                    if (empty($sourcehandle)) {
799
+                        $this->error = 'Failed to open file '.$logpath.'/'.$logname;
800
+                        return -4;
801
+                    }
802
+
803
+                    while(! feof($sourcehandle)) {
804
+                        gzwrite($gzfilehandle, fread($sourcehandle, 512 * 1024)); // Read 512 kB at a time
805
+                    }
806
+
807
+                    fclose($sourcehandle);
808
+                    gzclose($gzfilehandle);
809
+
810
+                    @chmod($logpath.'/'.$logname.'.1.gz', octdec(empty($conf->global->MAIN_UMASK)?'0664':$conf->global->MAIN_UMASK));
811
+                }
812
+
813
+                dol_delete_file($logpath.'/'.$logname, 0, 0, 0, null, false, 0);
814
+
815
+                // Create empty file
816
+                $newlog = fopen($logpath.'/'.$logname, 'a+');
817
+                fclose($newlog);
818
+
819
+                //var_dump($logpath.'/'.$logname." - ".octdec(empty($conf->global->MAIN_UMASK)?'0664':$conf->global->MAIN_UMASK));
820
+                @chmod($logpath.'/'.$logname, octdec(empty($conf->global->MAIN_UMASK)?'0664':$conf->global->MAIN_UMASK));
821
+            }
822
+        }
823
+
824
+        $this->output = 'Archive log files (keeping last SYSLOG_FILE_SAVES='.$nbSaves.' files) done.';
825
+        return 0;
826
+    }
827
+
828
+    /**	Backup the db OR just a table without mysqldump binary, with PHP only (does not require any exec permission)
829
+     *	Author: David Walsh (http://davidwalsh.name/backup-mysql-database-php)
830
+     *	Updated and enhanced by Stephen Larroque (lrq3000) and by the many commentators from the blog
831
+     *	Note about foreign keys constraints: for Dolibarr, since there are a lot of constraints and when imported the tables will be inserted in the dumped order, not in constraints order, then we ABSOLUTELY need to use SET FOREIGN_KEY_CHECKS=0; when importing the sql dump.
832
+     *	Note2: db2SQL by Howard Yeend can be an alternative, by using SHOW FIELDS FROM and SHOW KEYS FROM we could generate a more precise dump (eg: by getting the type of the field and then precisely outputting the right formatting - in quotes, numeric or null - instead of trying to guess like we are doing now).
833
+     *
834
+     *	@param	string	$outputfile		Output file name
835
+     *	@param	string	$tables			Table name or '*' for all
836
+     *	@return	int						<0 if KO, >0 if OK
837
+     */
838
+    function backupTables($outputfile, $tables='*')
839
+    {
840
+        global $db, $langs;
841
+        global $errormsg;
842
+
843
+        // Set to UTF-8
844
+        if (is_a($db, 'DoliDBMysqli')) {
845
+            /** @var DoliDBMysqli $db */
846
+            $db->db->set_charset('utf8');
847
+        } else {
848
+            /** @var DoliDB $db */
849
+            $db->query('SET NAMES utf8');
850
+            $db->query('SET CHARACTER SET utf8');
851
+        }
852
+
853
+        //get all of the tables
854
+        if ($tables == '*')
855
+        {
856
+            $tables = array();
857
+            $result = $db->query('SHOW FULL TABLES WHERE Table_type = \'BASE TABLE\'');
858
+            while($row = $db->fetch_row($result))
859
+            {
860
+                $tables[] = $row[0];
861
+            }
862
+        }
863
+        else
864
+        {
865
+            $tables = is_array($tables) ? $tables : explode(',',$tables);
866
+        }
867
+
868
+        //cycle through
869
+        $handle = fopen($outputfile, 'w+');
870
+        if (fwrite($handle, '') === false)
871
+        {
872
+            $langs->load("errors");
873
+            dol_syslog("Failed to open file ".$outputfile,LOG_ERR);
874
+            $errormsg=$langs->trans("ErrorFailedToWriteInDir");
875
+            return -1;
876
+        }
877
+
878
+        // Print headers and global mysql config vars
879
+        $sqlhead = '';
880
+        $sqlhead .= "-- ".$db::LABEL." dump via php with Dolibarr ".DOL_VERSION."
881 881
 --
882 882
 -- Host: ".$db->db->host_info."    Database: ".$db->database_name."
883 883
 -- ------------------------------------------------------
@@ -896,77 +896,77 @@  discard block
 block discarded – undo
896 896
 
897 897
 ";
898 898
 
899
-		if (GETPOST("nobin_disable_fk")) $sqlhead .= "SET FOREIGN_KEY_CHECKS=0;\n";
900
-		//$sqlhead .= "SET SQL_MODE=\"NO_AUTO_VALUE_ON_ZERO\";\n";
901
-		if (GETPOST("nobin_use_transaction")) $sqlhead .= "SET AUTOCOMMIT=0;\nSTART TRANSACTION;\n";
902
-
903
-		fwrite($handle, $sqlhead);
904
-
905
-		$ignore = '';
906
-		if (GETPOST("nobin_sql_ignore")) $ignore = 'IGNORE ';
907
-		$delayed = '';
908
-		if (GETPOST("nobin_delayed")) $delayed = 'DELAYED ';
909
-
910
-		// Process each table and print their definition + their datas
911
-		foreach($tables as $table)
912
-		{
913
-			// Saving the table structure
914
-			fwrite($handle, "\n--\n-- Table structure for table `".$table."`\n--\n");
915
-
916
-			if (GETPOST("nobin_drop")) fwrite($handle,"DROP TABLE IF EXISTS `".$table."`;\n"); // Dropping table if exists prior to re create it
917
-			fwrite($handle,"/*!40101 SET @saved_cs_client     = @@character_set_client */;\n");
918
-			fwrite($handle,"/*!40101 SET character_set_client = utf8 */;\n");
919
-			$resqldrop=$db->query('SHOW CREATE TABLE '.$table);
920
-			$row2 = $db->fetch_row($resqldrop);
921
-			if (empty($row2[1]))
922
-			{
923
-				fwrite($handle, "\n-- WARNING: Show create table ".$table." return empy string when it should not.\n");
924
-			}
925
-			else
926
-			{
927
-				fwrite($handle,$row2[1].";\n");
928
-				//fwrite($handle,"/*!40101 SET character_set_client = @saved_cs_client */;\n\n");
929
-
930
-				// Dumping the data (locking the table and disabling the keys check while doing the process)
931
-				fwrite($handle, "\n--\n-- Dumping data for table `".$table."`\n--\n");
932
-				if (!GETPOST("nobin_nolocks")) fwrite($handle, "LOCK TABLES `".$table."` WRITE;\n"); // Lock the table before inserting data (when the data will be imported back)
933
-				if (GETPOST("nobin_disable_fk")) fwrite($handle, "ALTER TABLE `".$table."` DISABLE KEYS;\n");
934
-				else fwrite($handle, "/*!40000 ALTER TABLE `".$table."` DISABLE KEYS */;\n");
935
-
936
-				$sql='SELECT * FROM '.$table;
937
-				$result = $db->query($sql);
938
-				while($row = $db->fetch_row($result))
939
-				{
940
-					// For each row of data we print a line of INSERT
941
-					fwrite($handle,'INSERT '.$delayed.$ignore.'INTO `'.$table.'` VALUES (');
942
-					$columns = count($row);
943
-					for($j=0; $j<$columns; $j++) {
944
-						// Processing each columns of the row to ensure that we correctly save the value (eg: add quotes for string - in fact we add quotes for everything, it's easier)
945
-						if ($row[$j] == null && !is_string($row[$j])) {
946
-							// IMPORTANT: if the field is NULL we set it NULL
947
-							$row[$j] = 'NULL';
948
-						} elseif(is_string($row[$j]) && $row[$j] == '') {
949
-							// if it's an empty string, we set it as an empty string
950
-							$row[$j] = "''";
951
-						} elseif(is_numeric($row[$j]) && !strcmp($row[$j], $row[$j]+0) ) { // test if it's a numeric type and the numeric version ($nb+0) == string version (eg: if we have 01, it's probably not a number but rather a string, else it would not have any leading 0)
952
-							// if it's a number, we return it as-is
953
-							//	                    $row[$j] = $row[$j];
954
-						} else { // else for all other cases we escape the value and put quotes around
955
-							$row[$j] = addslashes($row[$j]);
956
-							$row[$j] = preg_replace("#\n#", "\\n", $row[$j]);
957
-							$row[$j] = "'".$row[$j]."'";
958
-						}
959
-					}
960
-					fwrite($handle,implode(',', $row).");\n");
961
-				}
962
-				if (GETPOST("nobin_disable_fk")) fwrite($handle, "ALTER TABLE `".$table."` ENABLE KEYS;\n"); // Enabling back the keys/index checking
963
-				if (!GETPOST("nobin_nolocks")) fwrite($handle, "UNLOCK TABLES;\n"); // Unlocking the table
964
-				fwrite($handle,"\n\n\n");
965
-			}
966
-		}
967
-
968
-		/* Backup Procedure structure*/
969
-		/*
899
+        if (GETPOST("nobin_disable_fk")) $sqlhead .= "SET FOREIGN_KEY_CHECKS=0;\n";
900
+        //$sqlhead .= "SET SQL_MODE=\"NO_AUTO_VALUE_ON_ZERO\";\n";
901
+        if (GETPOST("nobin_use_transaction")) $sqlhead .= "SET AUTOCOMMIT=0;\nSTART TRANSACTION;\n";
902
+
903
+        fwrite($handle, $sqlhead);
904
+
905
+        $ignore = '';
906
+        if (GETPOST("nobin_sql_ignore")) $ignore = 'IGNORE ';
907
+        $delayed = '';
908
+        if (GETPOST("nobin_delayed")) $delayed = 'DELAYED ';
909
+
910
+        // Process each table and print their definition + their datas
911
+        foreach($tables as $table)
912
+        {
913
+            // Saving the table structure
914
+            fwrite($handle, "\n--\n-- Table structure for table `".$table."`\n--\n");
915
+
916
+            if (GETPOST("nobin_drop")) fwrite($handle,"DROP TABLE IF EXISTS `".$table."`;\n"); // Dropping table if exists prior to re create it
917
+            fwrite($handle,"/*!40101 SET @saved_cs_client     = @@character_set_client */;\n");
918
+            fwrite($handle,"/*!40101 SET character_set_client = utf8 */;\n");
919
+            $resqldrop=$db->query('SHOW CREATE TABLE '.$table);
920
+            $row2 = $db->fetch_row($resqldrop);
921
+            if (empty($row2[1]))
922
+            {
923
+                fwrite($handle, "\n-- WARNING: Show create table ".$table." return empy string when it should not.\n");
924
+            }
925
+            else
926
+            {
927
+                fwrite($handle,$row2[1].";\n");
928
+                //fwrite($handle,"/*!40101 SET character_set_client = @saved_cs_client */;\n\n");
929
+
930
+                // Dumping the data (locking the table and disabling the keys check while doing the process)
931
+                fwrite($handle, "\n--\n-- Dumping data for table `".$table."`\n--\n");
932
+                if (!GETPOST("nobin_nolocks")) fwrite($handle, "LOCK TABLES `".$table."` WRITE;\n"); // Lock the table before inserting data (when the data will be imported back)
933
+                if (GETPOST("nobin_disable_fk")) fwrite($handle, "ALTER TABLE `".$table."` DISABLE KEYS;\n");
934
+                else fwrite($handle, "/*!40000 ALTER TABLE `".$table."` DISABLE KEYS */;\n");
935
+
936
+                $sql='SELECT * FROM '.$table;
937
+                $result = $db->query($sql);
938
+                while($row = $db->fetch_row($result))
939
+                {
940
+                    // For each row of data we print a line of INSERT
941
+                    fwrite($handle,'INSERT '.$delayed.$ignore.'INTO `'.$table.'` VALUES (');
942
+                    $columns = count($row);
943
+                    for($j=0; $j<$columns; $j++) {
944
+                        // Processing each columns of the row to ensure that we correctly save the value (eg: add quotes for string - in fact we add quotes for everything, it's easier)
945
+                        if ($row[$j] == null && !is_string($row[$j])) {
946
+                            // IMPORTANT: if the field is NULL we set it NULL
947
+                            $row[$j] = 'NULL';
948
+                        } elseif(is_string($row[$j]) && $row[$j] == '') {
949
+                            // if it's an empty string, we set it as an empty string
950
+                            $row[$j] = "''";
951
+                        } elseif(is_numeric($row[$j]) && !strcmp($row[$j], $row[$j]+0) ) { // test if it's a numeric type and the numeric version ($nb+0) == string version (eg: if we have 01, it's probably not a number but rather a string, else it would not have any leading 0)
952
+                            // if it's a number, we return it as-is
953
+                            //	                    $row[$j] = $row[$j];
954
+                        } else { // else for all other cases we escape the value and put quotes around
955
+                            $row[$j] = addslashes($row[$j]);
956
+                            $row[$j] = preg_replace("#\n#", "\\n", $row[$j]);
957
+                            $row[$j] = "'".$row[$j]."'";
958
+                        }
959
+                    }
960
+                    fwrite($handle,implode(',', $row).");\n");
961
+                }
962
+                if (GETPOST("nobin_disable_fk")) fwrite($handle, "ALTER TABLE `".$table."` ENABLE KEYS;\n"); // Enabling back the keys/index checking
963
+                if (!GETPOST("nobin_nolocks")) fwrite($handle, "UNLOCK TABLES;\n"); // Unlocking the table
964
+                fwrite($handle,"\n\n\n");
965
+            }
966
+        }
967
+
968
+        /* Backup Procedure structure*/
969
+        /*
970 970
 		 $result = $db->query('SHOW PROCEDURE STATUS');
971 971
 		 if ($db->num_rows($result) > 0)
972 972
 		 {
@@ -982,17 +982,17 @@  discard block
 block discarded – undo
982 982
 		 }
983 983
 		 }
984 984
 		 */
985
-		/* Backup Procedure structure*/
985
+        /* Backup Procedure structure*/
986 986
 
987
-		// Write the footer (restore the previous database settings)
988
-		$sqlfooter="\n\n";
989
-		if (GETPOST("nobin_use_transaction")) $sqlfooter .= "COMMIT;\n";
990
-		if (GETPOST("nobin_disable_fk")) $sqlfooter .= "SET FOREIGN_KEY_CHECKS=1;\n";
991
-		$sqlfooter.="\n\n-- Dump completed on ".date('Y-m-d G-i-s');
992
-		fwrite($handle, $sqlfooter);
987
+        // Write the footer (restore the previous database settings)
988
+        $sqlfooter="\n\n";
989
+        if (GETPOST("nobin_use_transaction")) $sqlfooter .= "COMMIT;\n";
990
+        if (GETPOST("nobin_disable_fk")) $sqlfooter .= "SET FOREIGN_KEY_CHECKS=1;\n";
991
+        $sqlfooter.="\n\n-- Dump completed on ".date('Y-m-d G-i-s');
992
+        fwrite($handle, $sqlfooter);
993 993
 
994
-		fclose($handle);
994
+        fclose($handle);
995 995
 
996
-		return 1;
997
-	}
996
+        return 1;
997
+    }
998 998
 }
Please login to merge, or discard this patch.
dolibarr/htdocs/core/class/html.formcontract.class.php 1 patch
Indentation   +124 added lines, -124 removed lines patch added patch discarded remove patch
@@ -33,9 +33,9 @@  discard block
 block discarded – undo
33 33
     public $db;
34 34
 
35 35
     /**
36
-	 * @var string Error code (or message)
37
-	 */
38
-	public $error='';
36
+     * @var string Error code (or message)
37
+     */
38
+    public $error='';
39 39
 
40 40
 
41 41
     /**
@@ -50,135 +50,135 @@  discard block
 block discarded – undo
50 50
 
51 51
 
52 52
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
53
-	/**
54
-	 *	Show a combo list with contracts qualified for a third party
55
-	 *
56
-	 *	@param	int		$socid      Id third party (-1=all, 0=only contracts not linked to a third party, id=contracts not linked or linked to third party id)
57
-	 *	@param  int		$selected   Id contract preselected
58
-	 *	@param  string	$htmlname   Nom de la zone html
59
-	 *	@param	int		$maxlength	Maximum length of label
60
-	 *	@param	int		$showempty	Show empty line
61
-	 *	@return int         		Nbr of project if OK, <0 if KO
62
-	 */
63
-	function select_contract($socid=-1, $selected='', $htmlname='contrattid', $maxlength=16, $showempty=1)
64
-	{
53
+    /**
54
+     *	Show a combo list with contracts qualified for a third party
55
+     *
56
+     *	@param	int		$socid      Id third party (-1=all, 0=only contracts not linked to a third party, id=contracts not linked or linked to third party id)
57
+     *	@param  int		$selected   Id contract preselected
58
+     *	@param  string	$htmlname   Nom de la zone html
59
+     *	@param	int		$maxlength	Maximum length of label
60
+     *	@param	int		$showempty	Show empty line
61
+     *	@return int         		Nbr of project if OK, <0 if KO
62
+     */
63
+    function select_contract($socid=-1, $selected='', $htmlname='contrattid', $maxlength=16, $showempty=1)
64
+    {
65 65
         // phpcs:enable
66
-		global $db,$user,$conf,$langs;
66
+        global $db,$user,$conf,$langs;
67 67
 
68
-		$hideunselectables = false;
69
-		if (! empty($conf->global->CONTRACT_HIDE_UNSELECTABLES)) $hideunselectables = true;
68
+        $hideunselectables = false;
69
+        if (! empty($conf->global->CONTRACT_HIDE_UNSELECTABLES)) $hideunselectables = true;
70 70
 
71
-		// Search all contacts
72
-		$sql = 'SELECT c.rowid, c.ref, c.fk_soc, c.statut';
73
-		$sql.= ' FROM '.MAIN_DB_PREFIX .'contrat as c';
74
-		$sql.= " WHERE c.entity = ".$conf->entity;
75
-		//if ($contratListId) $sql.= " AND c.rowid IN (".$contratListId.")";
76
-		if ($socid > 0)
77
-		{
78
-			// CONTRACT_ALLOW_TO_LINK_FROM_OTHER_COMPANY is 'all' or a list of ids separated by coma.
79
-		    	if (empty($conf->global->CONTRACT_ALLOW_TO_LINK_FROM_OTHER_COMPANY))
80
-			    $sql.= " AND (c.fk_soc=".$socid." OR c.fk_soc IS NULL)";
81
-		    	else if ($conf->global->CONTRACT_ALLOW_TO_LINK_FROM_OTHER_COMPANY != 'all')
82
-			{
83
-		        	$sql.= " AND (c.fk_soc IN (".$socid.", ".$conf->global->CONTRACT_ALLOW_TO_LINK_FROM_OTHER_COMPANY.") ";
84
-				$sql.= " OR c.fk_soc IS NULL)";
85
-		    	}
86
-		}
87
-		if ($socid == 0) $sql.= " AND (c.fk_soc = 0 OR c.fk_soc IS NULL)";
88
-		$sql.= " ORDER BY c.ref ";
71
+        // Search all contacts
72
+        $sql = 'SELECT c.rowid, c.ref, c.fk_soc, c.statut';
73
+        $sql.= ' FROM '.MAIN_DB_PREFIX .'contrat as c';
74
+        $sql.= " WHERE c.entity = ".$conf->entity;
75
+        //if ($contratListId) $sql.= " AND c.rowid IN (".$contratListId.")";
76
+        if ($socid > 0)
77
+        {
78
+            // CONTRACT_ALLOW_TO_LINK_FROM_OTHER_COMPANY is 'all' or a list of ids separated by coma.
79
+                if (empty($conf->global->CONTRACT_ALLOW_TO_LINK_FROM_OTHER_COMPANY))
80
+                $sql.= " AND (c.fk_soc=".$socid." OR c.fk_soc IS NULL)";
81
+                else if ($conf->global->CONTRACT_ALLOW_TO_LINK_FROM_OTHER_COMPANY != 'all')
82
+            {
83
+                    $sql.= " AND (c.fk_soc IN (".$socid.", ".$conf->global->CONTRACT_ALLOW_TO_LINK_FROM_OTHER_COMPANY.") ";
84
+                $sql.= " OR c.fk_soc IS NULL)";
85
+                }
86
+        }
87
+        if ($socid == 0) $sql.= " AND (c.fk_soc = 0 OR c.fk_soc IS NULL)";
88
+        $sql.= " ORDER BY c.ref ";
89 89
 
90
-		dol_syslog(get_class($this)."::select_contract", LOG_DEBUG);
91
-		$resql=$db->query($sql);
92
-		if ($resql)
93
-		{
94
-			print '<select class="flat" name="'.$htmlname.'">';
95
-			if ($showempty) print '<option value="0">&nbsp;</option>';
96
-			$num = $db->num_rows($resql);
97
-			$i = 0;
98
-			if ($num)
99
-			{
100
-				while ($i < $num)
101
-				{
102
-					$obj = $db->fetch_object($resql);
103
-					// If we ask to filter on a company and user has no permission to see all companies and project is linked to another company, we hide project.
104
-					if ($socid > 0 && (empty($obj->fk_soc) || $obj->fk_soc == $socid) && ! $user->rights->societe->lire)
105
-					{
106
-						// Do nothing
107
-					}
108
-					else
109
-					{
110
-						$labeltoshow=dol_trunc($obj->ref,18);
111
-						//if ($obj->public) $labeltoshow.=' ('.$langs->trans("SharedProject").')';
112
-						//else $labeltoshow.=' ('.$langs->trans("Private").')';
113
-						if (!empty($selected) && $selected == $obj->rowid && $obj->statut > 0)
114
-						{
115
-							print '<option value="'.$obj->rowid.'" selected>'.$labeltoshow.'</option>';
116
-						}
117
-						else
118
-						{
119
-							$disabled=0;
120
-							if ( $obj->statut ==  0)
121
-							{
122
-								$disabled=1;
123
-								$labeltoshow.=' ('.$langs->trans("Draft").')';
124
-							}
125
-							if ( empty($conf->global->CONTRACT_ALLOW_TO_LINK_FROM_OTHER_COMPANY) &&  $socid > 0 && (! empty($obj->fk_soc) && $obj->fk_soc != $socid))
126
-							{
127
-								$disabled=1;
128
-								$labeltoshow.=' - '.$langs->trans("LinkedToAnotherCompany");
129
-							}
90
+        dol_syslog(get_class($this)."::select_contract", LOG_DEBUG);
91
+        $resql=$db->query($sql);
92
+        if ($resql)
93
+        {
94
+            print '<select class="flat" name="'.$htmlname.'">';
95
+            if ($showempty) print '<option value="0">&nbsp;</option>';
96
+            $num = $db->num_rows($resql);
97
+            $i = 0;
98
+            if ($num)
99
+            {
100
+                while ($i < $num)
101
+                {
102
+                    $obj = $db->fetch_object($resql);
103
+                    // If we ask to filter on a company and user has no permission to see all companies and project is linked to another company, we hide project.
104
+                    if ($socid > 0 && (empty($obj->fk_soc) || $obj->fk_soc == $socid) && ! $user->rights->societe->lire)
105
+                    {
106
+                        // Do nothing
107
+                    }
108
+                    else
109
+                    {
110
+                        $labeltoshow=dol_trunc($obj->ref,18);
111
+                        //if ($obj->public) $labeltoshow.=' ('.$langs->trans("SharedProject").')';
112
+                        //else $labeltoshow.=' ('.$langs->trans("Private").')';
113
+                        if (!empty($selected) && $selected == $obj->rowid && $obj->statut > 0)
114
+                        {
115
+                            print '<option value="'.$obj->rowid.'" selected>'.$labeltoshow.'</option>';
116
+                        }
117
+                        else
118
+                        {
119
+                            $disabled=0;
120
+                            if ( $obj->statut ==  0)
121
+                            {
122
+                                $disabled=1;
123
+                                $labeltoshow.=' ('.$langs->trans("Draft").')';
124
+                            }
125
+                            if ( empty($conf->global->CONTRACT_ALLOW_TO_LINK_FROM_OTHER_COMPANY) &&  $socid > 0 && (! empty($obj->fk_soc) && $obj->fk_soc != $socid))
126
+                            {
127
+                                $disabled=1;
128
+                                $labeltoshow.=' - '.$langs->trans("LinkedToAnotherCompany");
129
+                            }
130 130
 
131
-							if ($hideunselectables && $disabled)
132
-							{
133
-								$resultat='';
134
-							}
135
-							else
136
-							{
137
-								$resultat='<option value="'.$obj->rowid.'"';
138
-								if ($disabled) $resultat.=' disabled';
139
-								//if ($obj->public) $labeltoshow.=' ('.$langs->trans("Public").')';
140
-								//else $labeltoshow.=' ('.$langs->trans("Private").')';
141
-								$resultat.='>'.$labeltoshow;
142
-								$resultat.='</option>';
143
-							}
144
-							print $resultat;
145
-						}
146
-					}
147
-					$i++;
148
-				}
149
-			}
150
-			print '</select>';
151
-			$db->free($resql);
131
+                            if ($hideunselectables && $disabled)
132
+                            {
133
+                                $resultat='';
134
+                            }
135
+                            else
136
+                            {
137
+                                $resultat='<option value="'.$obj->rowid.'"';
138
+                                if ($disabled) $resultat.=' disabled';
139
+                                //if ($obj->public) $labeltoshow.=' ('.$langs->trans("Public").')';
140
+                                //else $labeltoshow.=' ('.$langs->trans("Private").')';
141
+                                $resultat.='>'.$labeltoshow;
142
+                                $resultat.='</option>';
143
+                            }
144
+                            print $resultat;
145
+                        }
146
+                    }
147
+                    $i++;
148
+                }
149
+            }
150
+            print '</select>';
151
+            $db->free($resql);
152 152
 
153
-			if (!empty($conf->use_javascript_ajax))
154
-			{
155
-				// Make select dynamic
156
-				include_once DOL_DOCUMENT_ROOT . '/core/lib/ajax.lib.php';
157
-				print ajax_combobox($htmlname);
158
-			}
153
+            if (!empty($conf->use_javascript_ajax))
154
+            {
155
+                // Make select dynamic
156
+                include_once DOL_DOCUMENT_ROOT . '/core/lib/ajax.lib.php';
157
+                print ajax_combobox($htmlname);
158
+            }
159 159
 
160
-			return $num;
161
-		}
162
-		else
163
-		{
164
-			dol_print_error($db);
165
-			return -1;
166
-		}
167
-	}
160
+            return $num;
161
+        }
162
+        else
163
+        {
164
+            dol_print_error($db);
165
+            return -1;
166
+        }
167
+    }
168 168
 
169
-	/**
170
-	 *	Show a form to select a contract
171
-	 *
172
-	 *  @param	int		$page       Page
173
-	 *	@param	int		$socid      Id third party (-1=all, 0=only contracts not linked to a third party, id=contracts not linked or linked to third party id)
174
-	 *	@param  int		$selected   Id contract preselected
175
-	 *	@param  string	$htmlname   Nom de la zone html
176
-	 *	@param	int		$maxlength	Maximum length of label
177
-	 *	@param	int		$showempty	Show empty line
178
-	 *	@return int                 Nbr of project if OK, <0 if KO
179
-	 */
180
-	function formSelectContract($page, $socid=-1, $selected='', $htmlname='contrattid', $maxlength=16, $showempty=1)
181
-	{
169
+    /**
170
+     *	Show a form to select a contract
171
+     *
172
+     *  @param	int		$page       Page
173
+     *	@param	int		$socid      Id third party (-1=all, 0=only contracts not linked to a third party, id=contracts not linked or linked to third party id)
174
+     *	@param  int		$selected   Id contract preselected
175
+     *	@param  string	$htmlname   Nom de la zone html
176
+     *	@param	int		$maxlength	Maximum length of label
177
+     *	@param	int		$showempty	Show empty line
178
+     *	@return int                 Nbr of project if OK, <0 if KO
179
+     */
180
+    function formSelectContract($page, $socid=-1, $selected='', $htmlname='contrattid', $maxlength=16, $showempty=1)
181
+    {
182 182
         global $langs;
183 183
 
184 184
         print "\n";
Please login to merge, or discard this patch.
dolibarr/htdocs/core/class/html.formmargin.class.php 1 patch
Indentation   +209 added lines, -209 removed lines patch added patch discarded remove patch
@@ -34,9 +34,9 @@  discard block
 block discarded – undo
34 34
     public $db;
35 35
 
36 36
     /**
37
-	 * @var string Error code (or message)
38
-	 */
39
-	public $error='';
37
+     * @var string Error code (or message)
38
+     */
39
+    public $error='';
40 40
 
41 41
 
42 42
     /**
@@ -51,234 +51,234 @@  discard block
 block discarded – undo
51 51
 
52 52
 
53 53
 
54
-	/**
55
-	 *	get array with margin information from lines of object
56
-	 *  TODO Move this in common class.
57
-	 *
58
-	 * 	@param	CommonObject	$object			Object we want to get margin information for
59
-	 * 	@param 	boolean			$force_price	True of not
60
-	 * 	@return array							Array with info
61
-	 */
62
-	function getMarginInfosArray($object, $force_price=false)
63
-	{
64
-		global $conf, $db;
54
+    /**
55
+     *	get array with margin information from lines of object
56
+     *  TODO Move this in common class.
57
+     *
58
+     * 	@param	CommonObject	$object			Object we want to get margin information for
59
+     * 	@param 	boolean			$force_price	True of not
60
+     * 	@return array							Array with info
61
+     */
62
+    function getMarginInfosArray($object, $force_price=false)
63
+    {
64
+        global $conf, $db;
65 65
 
66
-		// Default returned array
67
-		$marginInfos = array(
68
-				'pa_products' => 0,
69
-				'pv_products' => 0,
70
-				'margin_on_products' => 0,
71
-				'margin_rate_products' => '',
72
-				'mark_rate_products' => '',
73
-				'pa_services' => 0,
74
-				'pv_services' => 0,
75
-				'margin_on_services' => 0,
76
-				'margin_rate_services' => '',
77
-				'mark_rate_services' => '',
78
-				'pa_total' => 0,
79
-				'pv_total' => 0,
80
-				'total_margin' => 0,
81
-				'total_margin_rate' => '',
82
-				'total_mark_rate' => ''
83
-		);
66
+        // Default returned array
67
+        $marginInfos = array(
68
+                'pa_products' => 0,
69
+                'pv_products' => 0,
70
+                'margin_on_products' => 0,
71
+                'margin_rate_products' => '',
72
+                'mark_rate_products' => '',
73
+                'pa_services' => 0,
74
+                'pv_services' => 0,
75
+                'margin_on_services' => 0,
76
+                'margin_rate_services' => '',
77
+                'mark_rate_services' => '',
78
+                'pa_total' => 0,
79
+                'pv_total' => 0,
80
+                'total_margin' => 0,
81
+                'total_margin_rate' => '',
82
+                'total_mark_rate' => ''
83
+        );
84 84
 
85
-		foreach($object->lines as $line)
86
-		{
87
-			if (empty($line->pa_ht) && isset($line->fk_fournprice) && !$force_price)
88
-			{
89
-				require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.product.class.php';
90
-				$product = new ProductFournisseur($db);
91
-				if ($product->fetch_product_fournisseur_price($line->fk_fournprice))
92
-					$line->pa_ht = $product->fourn_unitprice * (1 - $product->fourn_remise_percent / 100);
93
-			}
94
-			// si prix d'achat non renseigné et devrait l'être, alors prix achat = prix vente
95
-			if ((!isset($line->pa_ht) || $line->pa_ht == 0) && $line->subprice > 0 && (isset($conf->global->ForceBuyingPriceIfNull) && $conf->global->ForceBuyingPriceIfNull == 1)) {
96
-				$line->pa_ht = $line->subprice * (1 - ($line->remise_percent / 100));
97
-			}
85
+        foreach($object->lines as $line)
86
+        {
87
+            if (empty($line->pa_ht) && isset($line->fk_fournprice) && !$force_price)
88
+            {
89
+                require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.product.class.php';
90
+                $product = new ProductFournisseur($db);
91
+                if ($product->fetch_product_fournisseur_price($line->fk_fournprice))
92
+                    $line->pa_ht = $product->fourn_unitprice * (1 - $product->fourn_remise_percent / 100);
93
+            }
94
+            // si prix d'achat non renseigné et devrait l'être, alors prix achat = prix vente
95
+            if ((!isset($line->pa_ht) || $line->pa_ht == 0) && $line->subprice > 0 && (isset($conf->global->ForceBuyingPriceIfNull) && $conf->global->ForceBuyingPriceIfNull == 1)) {
96
+                $line->pa_ht = $line->subprice * (1 - ($line->remise_percent / 100));
97
+            }
98 98
 
99
-			$pv = $line->qty * $line->subprice * (1 - $line->remise_percent / 100);
100
-			$pa_ht = ($pv < 0 ? - $line->pa_ht : $line->pa_ht);      // We choosed to have line->pa_ht always positive in database, so we guess the correct sign
101
-			$pa = $line->qty * $pa_ht;
99
+            $pv = $line->qty * $line->subprice * (1 - $line->remise_percent / 100);
100
+            $pa_ht = ($pv < 0 ? - $line->pa_ht : $line->pa_ht);      // We choosed to have line->pa_ht always positive in database, so we guess the correct sign
101
+            $pa = $line->qty * $pa_ht;
102 102
 
103
-			// calcul des marges
104
-			if (isset($line->fk_remise_except) && isset($conf->global->MARGIN_METHODE_FOR_DISCOUNT)) {    // remise
105
-				if ($conf->global->MARGIN_METHODE_FOR_DISCOUNT == '1') { // remise globale considérée comme produit
106
-					$marginInfos['pa_products'] += $pa;
107
-					$marginInfos['pv_products'] += $pv;
108
-					$marginInfos['pa_total'] +=  $pa;
109
-					$marginInfos['pv_total'] +=  $pv;
110
-					// if credit note, margin = -1 * (abs(selling_price) - buying_price)
111
-					//if ($pv < 0)
112
-					//{
113
-					//	$marginInfos['margin_on_products'] += -1 * (abs($pv) - $pa);
114
-					//}
115
-					//else
116
-						$marginInfos['margin_on_products'] += $pv - $pa;
117
-				}
118
-				elseif ($conf->global->MARGIN_METHODE_FOR_DISCOUNT == '2') { // remise globale considérée comme service
119
-					$marginInfos['pa_services'] += $pa;
120
-					$marginInfos['pv_services'] += $pv;
121
-					$marginInfos['pa_total'] +=  $pa;
122
-					$marginInfos['pv_total'] +=  $pv;
123
-					// if credit note, margin = -1 * (abs(selling_price) - buying_price)
124
-					//if ($pv < 0)
125
-					//	$marginInfos['margin_on_services'] += -1 * (abs($pv) - $pa);
126
-					//else
127
-						$marginInfos['margin_on_services'] += $pv - $pa;
128
-				}
129
-				elseif ($conf->global->MARGIN_METHODE_FOR_DISCOUNT == '3') { // remise globale prise en compte uniqt sur total
130
-					$marginInfos['pa_total'] += $pa;
131
-					$marginInfos['pv_total'] += $pv;
132
-				}
133
-			}
134
-			else {
135
-				$type=$line->product_type?$line->product_type:$line->fk_product_type;
136
-				if ($type == 0) {  // product
137
-					$marginInfos['pa_products'] += $pa;
138
-					$marginInfos['pv_products'] += $pv;
139
-					$marginInfos['pa_total'] +=  $pa;
140
-					$marginInfos['pv_total'] +=  $pv;
141
-					// if credit note, margin = -1 * (abs(selling_price) - buying_price)
142
-					//if ($pv < 0)
143
-					//{
144
-					//    $marginInfos['margin_on_products'] += -1 * (abs($pv) - $pa);
145
-					//}
146
-					//else
147
-					//{
148
-					    $marginInfos['margin_on_products'] += $pv - $pa;
149
-					//}
150
-				}
151
-				elseif ($type == 1) {  // service
152
-					$marginInfos['pa_services'] += $pa;
153
-					$marginInfos['pv_services'] += $pv;
154
-					$marginInfos['pa_total'] +=  $pa;
155
-					$marginInfos['pv_total'] +=  $pv;
156
-					// if credit note, margin = -1 * (abs(selling_price) - buying_price)
157
-					//if ($pv < 0)
158
-					//	$marginInfos['margin_on_services'] += -1 * (abs($pv) - $pa);
159
-					//else
160
-						$marginInfos['margin_on_services'] += $pv - $pa;
161
-				}
162
-			}
163
-		}
164
-		if ($marginInfos['pa_products'] > 0)
165
-			$marginInfos['margin_rate_products'] = 100 * $marginInfos['margin_on_products'] / $marginInfos['pa_products'];
166
-		if ($marginInfos['pv_products'] > 0)
167
-			$marginInfos['mark_rate_products'] = 100 * $marginInfos['margin_on_products'] / $marginInfos['pv_products'];
103
+            // calcul des marges
104
+            if (isset($line->fk_remise_except) && isset($conf->global->MARGIN_METHODE_FOR_DISCOUNT)) {    // remise
105
+                if ($conf->global->MARGIN_METHODE_FOR_DISCOUNT == '1') { // remise globale considérée comme produit
106
+                    $marginInfos['pa_products'] += $pa;
107
+                    $marginInfos['pv_products'] += $pv;
108
+                    $marginInfos['pa_total'] +=  $pa;
109
+                    $marginInfos['pv_total'] +=  $pv;
110
+                    // if credit note, margin = -1 * (abs(selling_price) - buying_price)
111
+                    //if ($pv < 0)
112
+                    //{
113
+                    //	$marginInfos['margin_on_products'] += -1 * (abs($pv) - $pa);
114
+                    //}
115
+                    //else
116
+                        $marginInfos['margin_on_products'] += $pv - $pa;
117
+                }
118
+                elseif ($conf->global->MARGIN_METHODE_FOR_DISCOUNT == '2') { // remise globale considérée comme service
119
+                    $marginInfos['pa_services'] += $pa;
120
+                    $marginInfos['pv_services'] += $pv;
121
+                    $marginInfos['pa_total'] +=  $pa;
122
+                    $marginInfos['pv_total'] +=  $pv;
123
+                    // if credit note, margin = -1 * (abs(selling_price) - buying_price)
124
+                    //if ($pv < 0)
125
+                    //	$marginInfos['margin_on_services'] += -1 * (abs($pv) - $pa);
126
+                    //else
127
+                        $marginInfos['margin_on_services'] += $pv - $pa;
128
+                }
129
+                elseif ($conf->global->MARGIN_METHODE_FOR_DISCOUNT == '3') { // remise globale prise en compte uniqt sur total
130
+                    $marginInfos['pa_total'] += $pa;
131
+                    $marginInfos['pv_total'] += $pv;
132
+                }
133
+            }
134
+            else {
135
+                $type=$line->product_type?$line->product_type:$line->fk_product_type;
136
+                if ($type == 0) {  // product
137
+                    $marginInfos['pa_products'] += $pa;
138
+                    $marginInfos['pv_products'] += $pv;
139
+                    $marginInfos['pa_total'] +=  $pa;
140
+                    $marginInfos['pv_total'] +=  $pv;
141
+                    // if credit note, margin = -1 * (abs(selling_price) - buying_price)
142
+                    //if ($pv < 0)
143
+                    //{
144
+                    //    $marginInfos['margin_on_products'] += -1 * (abs($pv) - $pa);
145
+                    //}
146
+                    //else
147
+                    //{
148
+                        $marginInfos['margin_on_products'] += $pv - $pa;
149
+                    //}
150
+                }
151
+                elseif ($type == 1) {  // service
152
+                    $marginInfos['pa_services'] += $pa;
153
+                    $marginInfos['pv_services'] += $pv;
154
+                    $marginInfos['pa_total'] +=  $pa;
155
+                    $marginInfos['pv_total'] +=  $pv;
156
+                    // if credit note, margin = -1 * (abs(selling_price) - buying_price)
157
+                    //if ($pv < 0)
158
+                    //	$marginInfos['margin_on_services'] += -1 * (abs($pv) - $pa);
159
+                    //else
160
+                        $marginInfos['margin_on_services'] += $pv - $pa;
161
+                }
162
+            }
163
+        }
164
+        if ($marginInfos['pa_products'] > 0)
165
+            $marginInfos['margin_rate_products'] = 100 * $marginInfos['margin_on_products'] / $marginInfos['pa_products'];
166
+        if ($marginInfos['pv_products'] > 0)
167
+            $marginInfos['mark_rate_products'] = 100 * $marginInfos['margin_on_products'] / $marginInfos['pv_products'];
168 168
 
169
-		if ($marginInfos['pa_services'] > 0)
170
-			$marginInfos['margin_rate_services'] = 100 * $marginInfos['margin_on_services'] / $marginInfos['pa_services'];
171
-		if ($marginInfos['pv_services'] > 0)
172
-			$marginInfos['mark_rate_services'] = 100 * $marginInfos['margin_on_services'] / $marginInfos['pv_services'];
169
+        if ($marginInfos['pa_services'] > 0)
170
+            $marginInfos['margin_rate_services'] = 100 * $marginInfos['margin_on_services'] / $marginInfos['pa_services'];
171
+        if ($marginInfos['pv_services'] > 0)
172
+            $marginInfos['mark_rate_services'] = 100 * $marginInfos['margin_on_services'] / $marginInfos['pv_services'];
173 173
 
174
-		// if credit note, margin = -1 * (abs(selling_price) - buying_price)
175
-		//if ($marginInfos['pv_total'] < 0)
176
-		//	$marginInfos['total_margin'] = -1 * (abs($marginInfos['pv_total']) - $marginInfos['pa_total']);
177
-		//else
178
-			$marginInfos['total_margin'] = $marginInfos['pv_total'] - $marginInfos['pa_total'];
179
-		if ($marginInfos['pa_total'] > 0)
180
-			$marginInfos['total_margin_rate'] = 100 * $marginInfos['total_margin'] / $marginInfos['pa_total'];
181
-		if ($marginInfos['pv_total'] > 0)
182
-			$marginInfos['total_mark_rate'] = 100 * $marginInfos['total_margin'] / $marginInfos['pv_total'];
174
+        // if credit note, margin = -1 * (abs(selling_price) - buying_price)
175
+        //if ($marginInfos['pv_total'] < 0)
176
+        //	$marginInfos['total_margin'] = -1 * (abs($marginInfos['pv_total']) - $marginInfos['pa_total']);
177
+        //else
178
+            $marginInfos['total_margin'] = $marginInfos['pv_total'] - $marginInfos['pa_total'];
179
+        if ($marginInfos['pa_total'] > 0)
180
+            $marginInfos['total_margin_rate'] = 100 * $marginInfos['total_margin'] / $marginInfos['pa_total'];
181
+        if ($marginInfos['pv_total'] > 0)
182
+            $marginInfos['total_mark_rate'] = 100 * $marginInfos['total_margin'] / $marginInfos['pv_total'];
183 183
 
184
-		return $marginInfos;
185
-	}
184
+        return $marginInfos;
185
+    }
186 186
 
187
-	/**
188
-	 * 	Show the array with all margin infos
189
-	 *
190
-	 *	@param	CommonObject	$object			Object we want to get margin information for
191
-	 * 	@param 	boolean			$force_price	Force price
192
-	 * 	@return	void
193
-	 */
194
-	function displayMarginInfos($object, $force_price=false)
195
-	{
196
-		global $langs, $conf, $user;
187
+    /**
188
+     * 	Show the array with all margin infos
189
+     *
190
+     *	@param	CommonObject	$object			Object we want to get margin information for
191
+     * 	@param 	boolean			$force_price	Force price
192
+     * 	@return	void
193
+     */
194
+    function displayMarginInfos($object, $force_price=false)
195
+    {
196
+        global $langs, $conf, $user;
197 197
 
198
-    	if (! empty($user->societe_id)) return;
198
+        if (! empty($user->societe_id)) return;
199 199
 
200
-    	if (! $user->rights->margins->liretous) return;
200
+        if (! $user->rights->margins->liretous) return;
201 201
 
202 202
         $rounding = min($conf->global->MAIN_MAX_DECIMALS_UNIT, $conf->global->MAIN_MAX_DECIMALS_TOT);
203 203
 
204
-		$marginInfo = $this->getMarginInfosArray($object, $force_price);
204
+        $marginInfo = $this->getMarginInfosArray($object, $force_price);
205 205
 
206
-		if (! empty($conf->global->MARGIN_ADD_SHOWHIDE_BUTTON))	// TODO Warning this feature rely on an external js file that may be removed. Using native js function document.cookie should be better
207
-		{
208
-			print $langs->trans('ShowMarginInfos').' : ';
209
-	        $hidemargininfos = $_COOKIE['DOLUSER_MARGININFO_HIDE_SHOW'];
210
-	    	print '<span id="showMarginInfos" class="linkobject '.(!empty($hidemargininfos)?'':'hideobject').'">'.img_picto($langs->trans("Disabled"),'switch_off').'</span>';
211
-	    	print '<span id="hideMarginInfos" class="linkobject '.(!empty($hidemargininfos)?'hideobject':'').'">'.img_picto($langs->trans("Enabled"),'switch_on').'</span>';
206
+        if (! empty($conf->global->MARGIN_ADD_SHOWHIDE_BUTTON))	// TODO Warning this feature rely on an external js file that may be removed. Using native js function document.cookie should be better
207
+        {
208
+            print $langs->trans('ShowMarginInfos').' : ';
209
+            $hidemargininfos = $_COOKIE['DOLUSER_MARGININFO_HIDE_SHOW'];
210
+            print '<span id="showMarginInfos" class="linkobject '.(!empty($hidemargininfos)?'':'hideobject').'">'.img_picto($langs->trans("Disabled"),'switch_off').'</span>';
211
+            print '<span id="hideMarginInfos" class="linkobject '.(!empty($hidemargininfos)?'hideobject':'').'">'.img_picto($langs->trans("Enabled"),'switch_on').'</span>';
212 212
 
213
-    	    print '<script>$(document).ready(function() {
213
+            print '<script>$(document).ready(function() {
214 214
         	    $("span#showMarginInfos").click(function() { $.getScript( "'.dol_buildpath('/includes/jquery/plugins/jquerytreeview/lib/jquery.cookie.js', 1).'", function( data, textStatus, jqxhr ) { $.cookie("DOLUSER_MARGININFO_HIDE_SHOW", 0); $(".margininfos").show(); $("span#showMarginInfos").addClass("hideobject"); $("span#hideMarginInfos").removeClass("hideobject");})});
215 215
         	    $("span#hideMarginInfos").click(function() { $.getScript( "'.dol_buildpath('/includes/jquery/plugins/jquerytreeview/lib/jquery.cookie.js', 1).'", function( data, textStatus, jqxhr ) { $.cookie("DOLUSER_MARGININFO_HIDE_SHOW", 1); $(".margininfos").hide(); $("span#hideMarginInfos").addClass("hideobject"); $("span#showMarginInfos").removeClass("hideobject");})});
216 216
       	        });</script>';
217
-    	    if (!empty($hidemargininfos)) print '<script>$(document).ready(function() {$(".margininfos").hide();});</script>';
218
-		}
217
+            if (!empty($hidemargininfos)) print '<script>$(document).ready(function() {$(".margininfos").hide();});</script>';
218
+        }
219 219
 
220
-		print '<div class="div-table-responsive-no-min">';
221
-		print '<!-- Margin table -->'."\n";
220
+        print '<div class="div-table-responsive-no-min">';
221
+        print '<!-- Margin table -->'."\n";
222 222
 
223
-		print '<table class="noborder margintable centpercent">';
224
-		print '<tr class="liste_titre">';
225
-		print '<td class="liste_titre">'.$langs->trans('Margins').'</td>';
226
-		print '<td class="liste_titre" align="right">'.$langs->trans('SellingPrice').'</td>';
227
-		if ($conf->global->MARGIN_TYPE == "1")
228
-			print '<td class="liste_titre" align="right">'.$langs->trans('BuyingPrice').'</td>';
229
-		else
230
-			print '<td class="liste_titre" align="right">'.$langs->trans('CostPrice').'</td>';
231
-		print '<td class="liste_titre" align="right">'.$langs->trans('Margin').'</td>';
232
-		if (! empty($conf->global->DISPLAY_MARGIN_RATES))
233
-			print '<td class="liste_titre" align="right">'.$langs->trans('MarginRate').'</td>';
234
-		if (! empty($conf->global->DISPLAY_MARK_RATES))
235
-			print '<td class="liste_titre" align="right">'.$langs->trans('MarkRate').'</td>';
236
-		print '</tr>';
223
+        print '<table class="noborder margintable centpercent">';
224
+        print '<tr class="liste_titre">';
225
+        print '<td class="liste_titre">'.$langs->trans('Margins').'</td>';
226
+        print '<td class="liste_titre" align="right">'.$langs->trans('SellingPrice').'</td>';
227
+        if ($conf->global->MARGIN_TYPE == "1")
228
+            print '<td class="liste_titre" align="right">'.$langs->trans('BuyingPrice').'</td>';
229
+        else
230
+            print '<td class="liste_titre" align="right">'.$langs->trans('CostPrice').'</td>';
231
+        print '<td class="liste_titre" align="right">'.$langs->trans('Margin').'</td>';
232
+        if (! empty($conf->global->DISPLAY_MARGIN_RATES))
233
+            print '<td class="liste_titre" align="right">'.$langs->trans('MarginRate').'</td>';
234
+        if (! empty($conf->global->DISPLAY_MARK_RATES))
235
+            print '<td class="liste_titre" align="right">'.$langs->trans('MarkRate').'</td>';
236
+        print '</tr>';
237 237
 
238
-		if (! empty($conf->product->enabled))
239
-		{
240
-			//if ($marginInfo['margin_on_products'] != 0 && $marginInfo['margin_on_services'] != 0) {
241
-			print '<tr class="oddeven">';
242
-			print '<td>'.$langs->trans('MarginOnProducts').'</td>';
243
-			print '<td align="right">'.price($marginInfo['pv_products'], null, null, null, null, $rounding).'</td>';
244
-			print '<td align="right">'.price($marginInfo['pa_products'], null, null, null, null, $rounding).'</td>';
245
-			print '<td align="right">'.price($marginInfo['margin_on_products'], null, null, null, null, $rounding).'</td>';
246
-			if (! empty($conf->global->DISPLAY_MARGIN_RATES))
247
-				print '<td align="right">'.(($marginInfo['margin_rate_products'] == '')?'':price($marginInfo['margin_rate_products'], null, null, null, null, $rounding).'%').'</td>';
248
-			if (! empty($conf->global->DISPLAY_MARK_RATES))
249
-				print '<td align="right">'.(($marginInfo['mark_rate_products'] == '')?'':price($marginInfo['mark_rate_products'], null, null, null, null, $rounding).'%').'</td>';
250
-			print '</tr>';
251
-		}
238
+        if (! empty($conf->product->enabled))
239
+        {
240
+            //if ($marginInfo['margin_on_products'] != 0 && $marginInfo['margin_on_services'] != 0) {
241
+            print '<tr class="oddeven">';
242
+            print '<td>'.$langs->trans('MarginOnProducts').'</td>';
243
+            print '<td align="right">'.price($marginInfo['pv_products'], null, null, null, null, $rounding).'</td>';
244
+            print '<td align="right">'.price($marginInfo['pa_products'], null, null, null, null, $rounding).'</td>';
245
+            print '<td align="right">'.price($marginInfo['margin_on_products'], null, null, null, null, $rounding).'</td>';
246
+            if (! empty($conf->global->DISPLAY_MARGIN_RATES))
247
+                print '<td align="right">'.(($marginInfo['margin_rate_products'] == '')?'':price($marginInfo['margin_rate_products'], null, null, null, null, $rounding).'%').'</td>';
248
+            if (! empty($conf->global->DISPLAY_MARK_RATES))
249
+                print '<td align="right">'.(($marginInfo['mark_rate_products'] == '')?'':price($marginInfo['mark_rate_products'], null, null, null, null, $rounding).'%').'</td>';
250
+            print '</tr>';
251
+        }
252 252
 
253
-		if (! empty($conf->service->enabled))
254
-		{
255
-			print '<tr class="oddeven">';
256
-			print '<td>'.$langs->trans('MarginOnServices').'</td>';
257
-			print '<td align="right">'.price($marginInfo['pv_services'], null, null, null, null, $rounding).'</td>';
258
-			print '<td align="right">'.price($marginInfo['pa_services'], null, null, null, null, $rounding).'</td>';
259
-			print '<td align="right">'.price($marginInfo['margin_on_services'], null, null, null, null, $rounding).'</td>';
260
-			if (! empty($conf->global->DISPLAY_MARGIN_RATES))
261
-				print '<td align="right">'.(($marginInfo['margin_rate_services'] == '')?'':price($marginInfo['margin_rate_services'], null, null, null, null, $rounding).'%').'</td>';
262
-			if (! empty($conf->global->DISPLAY_MARK_RATES))
263
-				print '<td align="right">'.(($marginInfo['mark_rate_services'] == '')?'':price($marginInfo['mark_rate_services'], null, null, null, null, $rounding).'%').'</td>';
264
-			print '</tr>';
265
-		}
253
+        if (! empty($conf->service->enabled))
254
+        {
255
+            print '<tr class="oddeven">';
256
+            print '<td>'.$langs->trans('MarginOnServices').'</td>';
257
+            print '<td align="right">'.price($marginInfo['pv_services'], null, null, null, null, $rounding).'</td>';
258
+            print '<td align="right">'.price($marginInfo['pa_services'], null, null, null, null, $rounding).'</td>';
259
+            print '<td align="right">'.price($marginInfo['margin_on_services'], null, null, null, null, $rounding).'</td>';
260
+            if (! empty($conf->global->DISPLAY_MARGIN_RATES))
261
+                print '<td align="right">'.(($marginInfo['margin_rate_services'] == '')?'':price($marginInfo['margin_rate_services'], null, null, null, null, $rounding).'%').'</td>';
262
+            if (! empty($conf->global->DISPLAY_MARK_RATES))
263
+                print '<td align="right">'.(($marginInfo['mark_rate_services'] == '')?'':price($marginInfo['mark_rate_services'], null, null, null, null, $rounding).'%').'</td>';
264
+            print '</tr>';
265
+        }
266 266
 
267
-		if (! empty($conf->product->enabled) && ! empty($conf->service->enabled))
268
-		{
269
-			print '<tr class="liste_total">';
270
-			print '<td>'.$langs->trans('TotalMargin').'</td>';
271
-			print '<td align="right">'.price($marginInfo['pv_total'], null, null, null, null, $rounding).'</td>';
272
-			print '<td align="right">'.price($marginInfo['pa_total'], null, null, null, null, $rounding).'</td>';
273
-			print '<td align="right">'.price($marginInfo['total_margin'], null, null, null, null, $rounding).'</td>';
274
-			if (! empty($conf->global->DISPLAY_MARGIN_RATES))
275
-				print '<td align="right">'.(($marginInfo['total_margin_rate'] == '')?'':price($marginInfo['total_margin_rate'], null, null, null, null, $rounding).'%').'</td>';
276
-			if (! empty($conf->global->DISPLAY_MARK_RATES))
277
-				print '<td align="right">'.(($marginInfo['total_mark_rate'] == '')?'':price($marginInfo['total_mark_rate'], null, null, null, null, $rounding).'%').'</td>';
278
-			print '</tr>';
279
-		}
280
-		print '</table>';
281
-		print '</div>';
282
-	}
267
+        if (! empty($conf->product->enabled) && ! empty($conf->service->enabled))
268
+        {
269
+            print '<tr class="liste_total">';
270
+            print '<td>'.$langs->trans('TotalMargin').'</td>';
271
+            print '<td align="right">'.price($marginInfo['pv_total'], null, null, null, null, $rounding).'</td>';
272
+            print '<td align="right">'.price($marginInfo['pa_total'], null, null, null, null, $rounding).'</td>';
273
+            print '<td align="right">'.price($marginInfo['total_margin'], null, null, null, null, $rounding).'</td>';
274
+            if (! empty($conf->global->DISPLAY_MARGIN_RATES))
275
+                print '<td align="right">'.(($marginInfo['total_margin_rate'] == '')?'':price($marginInfo['total_margin_rate'], null, null, null, null, $rounding).'%').'</td>';
276
+            if (! empty($conf->global->DISPLAY_MARK_RATES))
277
+                print '<td align="right">'.(($marginInfo['total_mark_rate'] == '')?'':price($marginInfo['total_mark_rate'], null, null, null, null, $rounding).'%').'</td>';
278
+            print '</tr>';
279
+        }
280
+        print '</table>';
281
+        print '</div>';
282
+    }
283 283
 }
284 284
 
Please login to merge, or discard this patch.
dolibarr/htdocs/core/class/html.formpropal.class.php 1 patch
Indentation   +20 added lines, -20 removed lines patch added patch discarded remove patch
@@ -27,26 +27,26 @@  discard block
 block discarded – undo
27 27
  */
28 28
 class FormPropal
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 40
 
41
-	/**
42
-	 * Constructor
43
-	 *
44
-	 * @param		DoliDB		$db      Database handler
45
-	 */
46
-	public function __construct($db)
47
-	{
48
-		$this->db = $db;
49
-	}
41
+    /**
42
+     * Constructor
43
+     *
44
+     * @param		DoliDB		$db      Database handler
45
+     */
46
+    public function __construct($db)
47
+    {
48
+        $this->db = $db;
49
+    }
50 50
 
51 51
     /**
52 52
      *    Return combo list of differents status of a proposal
@@ -114,11 +114,11 @@  discard block
 block discarded – undo
114 114
         {
115 115
             if ($excludedraft)
116 116
             {
117
-				if ($obj['code'] == 'Draft' || $obj['code'] == 'PR_DRAFT')
118
-				{
119
-					$i++;
120
-					continue;
121
-				}
117
+                if ($obj['code'] == 'Draft' || $obj['code'] == 'PR_DRAFT')
118
+                {
119
+                    $i++;
120
+                    continue;
121
+                }
122 122
             }
123 123
             if ($selected != '' && $selected == $obj['id'])
124 124
             {
@@ -134,7 +134,7 @@  discard block
 block discarded – undo
134 134
                 print $langs->trans($prefix.$key.($short?'Short':''));
135 135
             }
136 136
             else
137
-			{
137
+            {
138 138
                 $conv_to_new_code=array('PR_DRAFT'=>'Draft','PR_OPEN'=>'Validated','PR_CLOSED'=>'Closed','PR_SIGNED'=>'Signed','PR_NOTSIGNED'=>'NotSigned','PR_FAC'=>'Billed');
139 139
                 if (! empty($conv_to_new_code[$obj['code']])) $key=$conv_to_new_code[$obj['code']];
140 140
 
Please login to merge, or discard this patch.
dolibarr/htdocs/core/class/discount.class.php 1 patch
Indentation   +96 added lines, -96 removed lines patch added patch discarded remove patch
@@ -34,23 +34,23 @@  discard block
 block discarded – undo
34 34
     public $db;
35 35
 
36 36
     /**
37
-	 * @var string Error code (or message)
38
-	 */
39
-	public $error;
37
+     * @var string Error code (or message)
38
+     */
39
+    public $error;
40 40
 
41
-	/**
42
-	 * @var string[]	Array of error strings
43
-	 */
44
-	public $errors=array();
41
+    /**
42
+     * @var string[]	Array of error strings
43
+     */
44
+    public $errors=array();
45 45
 
46
-	/**
47
-	 * @var int ID discount
48
-	 */
49
-	public $id;
46
+    /**
47
+     * @var int ID discount
48
+     */
49
+    public $id;
50 50
 
51 51
     /**
52
-	 * @var int Thirdparty ID
53
-	 */
52
+     * @var int Thirdparty ID
53
+     */
54 54
     public $fk_soc;
55 55
 
56 56
     public $discount_type;			// 0 => customer discount, 1 => supplier discount
@@ -60,14 +60,14 @@  discard block
 block discarded – undo
60 60
     public $tva_tx;				// Vat rate
61 61
 
62 62
     /**
63
-	 * @var int User ID Id utilisateur qui accorde la remise
64
-	 */
65
-	public $fk_user;
63
+     * @var int User ID Id utilisateur qui accorde la remise
64
+     */
65
+    public $fk_user;
66 66
 
67 67
     /**
68
-	 * @var string description
69
-	 */
70
-	public $description;
68
+     * @var string description
69
+     */
70
+    public $description;
71 71
 
72 72
     public $datec;					// Date creation
73 73
 
@@ -111,7 +111,7 @@  discard block
 block discarded – undo
111 111
      */
112 112
     function fetch($rowid, $fk_facture_source=0, $fk_invoice_supplier_source=0)
113 113
     {
114
-    	global $conf;
114
+        global $conf;
115 115
 
116 116
         // Check parameters
117 117
         if (! $rowid && ! $fk_facture_source && ! $fk_invoice_supplier_source)
@@ -288,29 +288,29 @@  discard block
 block discarded – undo
288 288
         // Check if we can remove the discount
289 289
         if ($this->fk_invoice_supplier_source)
290 290
         {
291
-        	$sql="SELECT COUNT(rowid) as nb";
292
-        	$sql.=" FROM ".MAIN_DB_PREFIX."societe_remise_except";
293
-        	$sql.=" WHERE (fk_invoice_supplier_line IS NOT NULL";	// Not used as absolute simple discount
294
-        	$sql.=" OR fk_invoice_supplier IS NOT NULL)"; 			// Not used as credit note and not used as deposit
295
-        	$sql.=" AND fk_invoice_supplier_source = ".$this->fk_invoice_supplier_source;
296
-        	//$sql.=" AND rowid != ".$this->id;
297
-
298
-        	dol_syslog(get_class($this)."::delete Check if we can remove discount", LOG_DEBUG);
299
-        	$resql=$this->db->query($sql);
300
-        	if ($resql)
301
-        	{
302
-        		$obj = $this->db->fetch_object($resql);
303
-        		if ($obj->nb > 0)
304
-        		{
305
-        			$this->error='ErrorThisPartOrAnotherIsAlreadyUsedSoDiscountSerieCantBeRemoved';
306
-        			return -2;
307
-        		}
308
-        	}
309
-        	else
310
-        	{
311
-        		dol_print_error($this->db);
312
-        		return -1;
313
-        	}
291
+            $sql="SELECT COUNT(rowid) as nb";
292
+            $sql.=" FROM ".MAIN_DB_PREFIX."societe_remise_except";
293
+            $sql.=" WHERE (fk_invoice_supplier_line IS NOT NULL";	// Not used as absolute simple discount
294
+            $sql.=" OR fk_invoice_supplier IS NOT NULL)"; 			// Not used as credit note and not used as deposit
295
+            $sql.=" AND fk_invoice_supplier_source = ".$this->fk_invoice_supplier_source;
296
+            //$sql.=" AND rowid != ".$this->id;
297
+
298
+            dol_syslog(get_class($this)."::delete Check if we can remove discount", LOG_DEBUG);
299
+            $resql=$this->db->query($sql);
300
+            if ($resql)
301
+            {
302
+                $obj = $this->db->fetch_object($resql);
303
+                if ($obj->nb > 0)
304
+                {
305
+                    $this->error='ErrorThisPartOrAnotherIsAlreadyUsedSoDiscountSerieCantBeRemoved';
306
+                    return -2;
307
+                }
308
+            }
309
+            else
310
+            {
311
+                dol_print_error($this->db);
312
+                return -1;
313
+            }
314 314
         }
315 315
 
316 316
         $this->db->begin();
@@ -352,23 +352,23 @@  discard block
 block discarded – undo
352 352
             }
353 353
             elseif($this->fk_invoice_supplier_source) {
354 354
 
355
-            	$sql = "UPDATE ".MAIN_DB_PREFIX."facture_fourn";
356
-            	$sql.=" set paye=0, fk_statut=1";
357
-            	$sql.=" WHERE (type = 2 or type = 3) AND rowid=".$this->fk_invoice_supplier_source;
358
-
359
-            	dol_syslog(get_class($this)."::delete Update credit note or deposit invoice statut", LOG_DEBUG);
360
-            	$result=$this->db->query($sql);
361
-            	if ($result)
362
-            	{
363
-            		$this->db->commit();
364
-            		return 1;
365
-            	}
366
-            	else
367
-            	{
368
-            		$this->error=$this->db->lasterror();
369
-            		$this->db->rollback();
370
-            		return -1;
371
-            	}
355
+                $sql = "UPDATE ".MAIN_DB_PREFIX."facture_fourn";
356
+                $sql.=" set paye=0, fk_statut=1";
357
+                $sql.=" WHERE (type = 2 or type = 3) AND rowid=".$this->fk_invoice_supplier_source;
358
+
359
+                dol_syslog(get_class($this)."::delete Update credit note or deposit invoice statut", LOG_DEBUG);
360
+                $result=$this->db->query($sql);
361
+                if ($result)
362
+                {
363
+                    $this->db->commit();
364
+                    return 1;
365
+                }
366
+                else
367
+                {
368
+                    $this->error=$this->db->lasterror();
369
+                    $this->db->rollback();
370
+                    return -1;
371
+                }
372 372
             }
373 373
             else
374 374
             {
@@ -413,11 +413,11 @@  discard block
 block discarded – undo
413 413
 
414 414
         $sql ="UPDATE ".MAIN_DB_PREFIX."societe_remise_except";
415 415
         if(! empty($this->discount_type)) {
416
-        	if ($rowidline)    $sql.=" SET fk_invoice_supplier_line = ".$rowidline;
417
-        	if ($rowidinvoice) $sql.=" SET fk_invoice_supplier = ".$rowidinvoice;
416
+            if ($rowidline)    $sql.=" SET fk_invoice_supplier_line = ".$rowidline;
417
+            if ($rowidinvoice) $sql.=" SET fk_invoice_supplier = ".$rowidinvoice;
418 418
         } else {
419
-        	if ($rowidline)    $sql.=" SET fk_facture_line = ".$rowidline;
420
-        	if ($rowidinvoice) $sql.=" SET fk_facture = ".$rowidinvoice;
419
+            if ($rowidline)    $sql.=" SET fk_facture_line = ".$rowidline;
420
+            if ($rowidinvoice) $sql.=" SET fk_facture = ".$rowidinvoice;
421 421
         }
422 422
         $sql.=" WHERE rowid = ".$this->id;
423 423
 
@@ -425,13 +425,13 @@  discard block
 block discarded – undo
425 425
         $resql = $this->db->query($sql);
426 426
         if ($resql)
427 427
         {
428
-        	if(! empty($this->discount_type)) {
429
-        		$this->fk_invoice_supplier_line=$rowidline;
430
-        		$this->fk_invoice_supplier=$rowidinvoice;
431
-        	} else {
432
-        		$this->fk_facture_line=$rowidline;
433
-        		$this->fk_facture=$rowidinvoice;
434
-        	}
428
+            if(! empty($this->discount_type)) {
429
+                $this->fk_invoice_supplier_line=$rowidline;
430
+                $this->fk_invoice_supplier=$rowidinvoice;
431
+            } else {
432
+                $this->fk_facture_line=$rowidline;
433
+                $this->fk_facture=$rowidinvoice;
434
+            }
435 435
             return 1;
436 436
         }
437 437
         else
@@ -453,11 +453,11 @@  discard block
 block discarded – undo
453 453
     {
454 454
         // phpcs:enable
455 455
         $sql ="UPDATE ".MAIN_DB_PREFIX."societe_remise_except";
456
-		if(! empty($this->discount_type)) {
457
-       		$sql.=" SET fk_invoice_supplier_line = NULL, fk_invoice_supplier = NULL";
458
-		} else {
459
-			$sql.=" SET fk_facture_line = NULL, fk_facture = NULL";
460
-		}
456
+        if(! empty($this->discount_type)) {
457
+                $sql.=" SET fk_invoice_supplier_line = NULL, fk_invoice_supplier = NULL";
458
+        } else {
459
+            $sql.=" SET fk_facture_line = NULL, fk_facture = NULL";
460
+        }
461 461
         $sql.=" WHERE rowid = ".$this->id;
462 462
 
463 463
         dol_syslog(get_class($this)."::unlink_invoice", LOG_DEBUG);
@@ -486,7 +486,7 @@  discard block
 block discarded – undo
486 486
      */
487 487
     function getAvailableDiscounts($company='', $user='',$filter='', $maxvalue=0, $discount_type=0)
488 488
     {
489
-    	global $conf;
489
+        global $conf;
490 490
 
491 491
         $sql  = "SELECT SUM(rc.amount_ttc) as amount";
492 492
         //$sql  = "SELECT rc.amount_ttc as amount";
@@ -494,9 +494,9 @@  discard block
 block discarded – undo
494 494
         $sql.= " WHERE rc.entity = " . $conf->entity;
495 495
         $sql.= " AND rc.discount_type=".intval($discount_type);
496 496
         if (! empty($discount_type)) {
497
-        	$sql.= " AND (rc.fk_invoice_supplier IS NULL AND rc.fk_invoice_supplier_line IS NULL)"; // Available from supplier
497
+            $sql.= " AND (rc.fk_invoice_supplier IS NULL AND rc.fk_invoice_supplier_line IS NULL)"; // Available from supplier
498 498
         } else {
499
-        	$sql.= " AND (rc.fk_facture IS NULL AND rc.fk_facture_line IS NULL)"; // Available to customer
499
+            $sql.= " AND (rc.fk_facture IS NULL AND rc.fk_facture_line IS NULL)"; // Available to customer
500 500
         }
501 501
         if (is_object($company)) $sql.= " AND rc.fk_soc = ".$company->id;
502 502
         if (is_object($user))    $sql.= " AND rc.fk_user = ".$user->id;
@@ -524,7 +524,7 @@  discard block
 block discarded – undo
524 524
      *  Should always be empty, except if option FACTURE_DEPOSITS_ARE_JUST_PAYMENTS is on (not recommended).
525 525
      *
526 526
      *	@param		CommonInvoice	$invoice		Object invoice (customer of supplier)
527
-	 *  @param 		int 		    $multicurrency 	Return multicurrency_amount instead of amount
527
+     *  @param 		int 		    $multicurrency 	Return multicurrency_amount instead of amount
528 528
      *	@return		int				     			<0 if KO, Sum of credit notes and deposits amount otherwise
529 529
      */
530 530
     function getSumDepositsUsed($invoice, $multicurrency=0)
@@ -557,7 +557,7 @@  discard block
 block discarded – undo
557 557
         {
558 558
             $obj = $this->db->fetch_object($resql);
559 559
             if ($multicurrency) return $obj->multicurrency_amount;
560
-			else return $obj->amount;
560
+            else return $obj->amount;
561 561
         }
562 562
         else
563 563
         {
@@ -570,7 +570,7 @@  discard block
 block discarded – undo
570 570
      *  Return amount (with tax) of all credit notes invoices + excess received used by invoice as a payment
571 571
      *
572 572
      *	@param		CommonInvoice	  $invoice	    	Object invoice
573
-	 *	@param		int			      $multicurrency	Return multicurrency_amount instead of amount
573
+     *	@param		int			      $multicurrency	Return multicurrency_amount instead of amount
574 574
      *	@return		int					        		<0 if KO, Sum of credit notes and excess received amount otherwise
575 575
      */
576 576
     function getSumCreditNotesUsed($invoice, $multicurrency=0)
@@ -603,7 +603,7 @@  discard block
 block discarded – undo
603 603
         {
604 604
             $obj = $this->db->fetch_object($resql);
605 605
             if ($multicurrency) return $obj->multicurrency_amount;
606
-			else return $obj->amount;
606
+            else return $obj->amount;
607 607
         }
608 608
         else
609 609
         {
@@ -650,22 +650,22 @@  discard block
 block discarded – undo
650 650
     }
651 651
 
652 652
 
653
-	/**
653
+    /**
654 654
      *  Initialise an instance with random values.
655 655
      *  Used to build previews or test instances.
656 656
      *	id must be 0 if object instance is a specimen.
657 657
      *
658 658
      *  @return	void
659
-	 */
660
-	function initAsSpecimen()
661
-	{
662
-		global $user,$langs,$conf;
663
-
664
-		$this->fk_soc         = 1;
665
-		$this->amount_ht      = 10;
666
-		$this->amount_tva     = 1.96;
667
-		$this->amount_ttc     = 11.96;
668
-		$this->tva_tx         = 19.6;
669
-		$this->description    = 'Specimen discount';
670
-	}
659
+     */
660
+    function initAsSpecimen()
661
+    {
662
+        global $user,$langs,$conf;
663
+
664
+        $this->fk_soc         = 1;
665
+        $this->amount_ht      = 10;
666
+        $this->amount_tva     = 1.96;
667
+        $this->amount_ttc     = 11.96;
668
+        $this->tva_tx         = 19.6;
669
+        $this->description    = 'Specimen discount';
670
+    }
671 671
 }
Please login to merge, or discard this patch.
dolibarr/htdocs/core/class/openid.class.php 1 patch
Indentation   +20 added lines, -20 removed lines patch added patch discarded remove patch
@@ -30,8 +30,8 @@  discard block
 block discarded – undo
30 30
     var $URLs = array();
31 31
     var $error = array();
32 32
     var $fields = array(
33
-		'required' => array(),
34
-		'optional' => array(),
33
+        'required' => array(),
34
+        'optional' => array(),
35 35
     );
36 36
 
37 37
     /**
@@ -399,8 +399,8 @@  discard block
 block discarded – undo
399 399
         // phpcs:enable
400 400
         global $conf;
401 401
 
402
-		include_once DOL_DOCUMENT_ROOT.'/core/lib/geturl.lib.php';
403
-		if (empty($url)) $url=$conf->global->MAIN_AUTHENTICATION_OPENID_URL;
402
+        include_once DOL_DOCUMENT_ROOT.'/core/lib/geturl.lib.php';
403
+        if (empty($url)) $url=$conf->global->MAIN_AUTHENTICATION_OPENID_URL;
404 404
 
405 405
         $response = getURLContent($url);
406 406
 
@@ -475,9 +475,9 @@  discard block
 block discarded – undo
475 475
     {
476 476
         // phpcs:enable
477 477
         $params = array(
478
-			'openid.assoc_handle' => urlencode($_GET['openid_assoc_handle']),
479
-			'openid.signed' => urlencode($_GET['openid_signed']),
480
-			'openid.sig' => urlencode($_GET['openid_sig'])
478
+            'openid.assoc_handle' => urlencode($_GET['openid_assoc_handle']),
479
+            'openid.signed' => urlencode($_GET['openid_signed']),
480
+            'openid.sig' => urlencode($_GET['openid_sig'])
481 481
         );
482 482
         // Send only required parameters to confirm validity
483 483
         $arr_signed = explode(",",str_replace('sreg.','sreg_',$_GET['openid_signed']));
@@ -520,16 +520,16 @@  discard block
 block discarded – undo
520 520
      */
521 521
     function sendDiscoveryRequestToGetXRDS($url='')
522 522
     {
523
-    	global $conf;
523
+        global $conf;
524 524
 
525
-		include_once DOL_DOCUMENT_ROOT.'/core/lib/geturl.lib.php';
526
-		if (empty($url)) $url=$conf->global->MAIN_AUTHENTICATION_OPENID_URL;
525
+        include_once DOL_DOCUMENT_ROOT.'/core/lib/geturl.lib.php';
526
+        if (empty($url)) $url=$conf->global->MAIN_AUTHENTICATION_OPENID_URL;
527 527
 
528
-		dol_syslog(get_class($this).'::sendDiscoveryRequestToGetXRDS get XRDS');
528
+        dol_syslog(get_class($this).'::sendDiscoveryRequestToGetXRDS get XRDS');
529 529
 
530
-		$addheaders=array('Accept: application/xrds+xml');
530
+        $addheaders=array('Accept: application/xrds+xml');
531 531
         $response = getURLContent($url, 'GET', '', 1, $addheaders);
532
-		/* response should like this:
532
+        /* response should like this:
533 533
 		<?xml version="1.0" encoding="UTF-8"?>
534 534
 		<xrds:XRDS xmlns:xrds="xri://$xrds" xmlns="xri://$xrd*($v*2.0)">
535 535
 		<XRD>
@@ -542,12 +542,12 @@  discard block
 block discarded – undo
542 542
 		</XRD>
543 543
 		</xrds:XRDS>
544 544
 		*/
545
-		$content=$response['content'];
545
+        $content=$response['content'];
546 546
 
547 547
         $server='';
548 548
         if (preg_match('/'.preg_quote('<URI>','/').'(.*)'.preg_quote('</URI>','/').'/is', $content, $reg))
549 549
         {
550
-        	$server=$reg[1];
550
+            $server=$reg[1];
551 551
         }
552 552
 
553 553
         if (empty($server))
@@ -556,10 +556,10 @@  discard block
 block discarded – undo
556 556
             return false;
557 557
         }
558 558
         else
559
-       {
560
-       		dol_syslog(get_class($this).'::sendDiscoveryRequestToGetXRDS found endpoint = '.$server);
561
-        	$this->SetOpenIDServer($server);
562
-        	return $server;
563
-	    }
559
+        {
560
+                dol_syslog(get_class($this).'::sendDiscoveryRequestToGetXRDS found endpoint = '.$server);
561
+            $this->SetOpenIDServer($server);
562
+            return $server;
563
+        }
564 564
     }
565 565
 }
Please login to merge, or discard this patch.
dolibarr/htdocs/core/class/emailsenderprofile.class.php 1 patch
Indentation   +385 added lines, -385 removed lines patch added patch discarded remove patch
@@ -35,401 +35,401 @@
 block discarded – undo
35 35
  */
36 36
 class EmailSenderProfile extends CommonObject
37 37
 {
38
-	/**
39
-	 * @var string ID to identify managed object
40
-	 */
41
-	public $element = 'emailsenderprofile';
42
-
43
-	/**
44
-	 * @var string Name of table without prefix where object is stored
45
-	 */
46
-	public $table_element = 'c_email_senderprofile';
47
-
48
-	/**
49
-	 * @var array  Does emailsenderprofile support multicompany module ? 0=No test on entity, 1=Test with field entity, 2=Test with link by societe
50
-	 */
51
-	public $ismultientitymanaged = 1;
52
-
53
-	/**
54
-	 * @var string String with name of icon for emailsenderprofile
55
-	 */
56
-	public $picto = 'emailsenderprofile@monmodule';
57
-
58
-
59
-	/**
60
-	 *             'type' if the field format.
61
-	 *             'label' the translation key.
62
-	 *             'enabled' is a condition when the filed must be managed.
63
-	 *             'visible' says if field is visible in list (-1 means not shown by default but can be added into list to be viewed).
64
-	 *             'notnull' is set to 1 if not null in database. Set to -1 if we must set data to null if empty ('' or 0).
65
-	 *             'index' if we want an index in database.
66
-	 *             'foreignkey'=>'tablename.field' if the field is a foreign key (it is recommanded to name the field fk_...).
67
-	 *             'position' is the sort order of field.
68
-	 *             'searchall' is 1 if we want to search in this field when making a search from the quick search button.
69
-	 *             'isameasure' must be set to 1 if you want to have a total on list for this field. Field type must be summable like integer or double(24,8).
70
-	 *             'help' is a string visible as a tooltip on field
71
-	 *             'comment' is not used. You can store here any text of your choice.
72
-	 */
73
-
74
-	// BEGIN MODULEBUILDER PROPERTIES
75
-	/**
76
-	 * @var array  Array with all fields and their property. Do not use it as a static var. It may be modified by constructor.
77
-	 */
78
-	public $fields=array(
79
-		'rowid' => array('type'=>'integer', 'label'=>'TechnicalID', 'visible'=>-1, 'enabled'=>1, 'position'=>1, 'notnull'=>1, 'index'=>1, 'comment'=>'Id',),
80
-		'entity' => array('type'=>'integer', 'label'=>'Entity', 'visible'=>-1, 'enabled'=>1, 'position'=>20, 'notnull'=>1, 'index'=>1,),
81
-		'label' => array('type'=>'varchar(255)', 'label'=>'Label', 'visible'=>1, 'enabled'=>1, 'position'=>30, 'notnull'=>-1),
82
-		'email' => array('type'=>'varchar(255)', 'label'=>'Email', 'visible'=>1, 'enabled'=>1, 'position'=>40, 'notnull'=>-1),
83
-		//'fk_user_creat' => array('type'=>'integer', 'label'=>'UserAuthor', 'visible'=>-1, 'enabled'=>1, 'position'=>500, 'notnull'=>1,),
84
-		//'fk_user_modif' => array('type'=>'integer', 'label'=>'UserModif', 'visible'=>-1, 'enabled'=>1, 'position'=>500, 'notnull'=>-1,),
85
-		'signature' => array('type'=>'text', 'label'=>'Signature', 'visible'=>-1, 'enabled'=>1, 'position'=>1000, 'notnull'=>-1, 'index'=>1,),
86
-		'position' => array('type'=>'integer', 'label'=>'Position', 'visible'=>-1, 'enabled'=>1, 'position'=>1000, 'notnull'=>-1, 'index'=>1,),
87
-		'date_creation' => array('type'=>'datetime', 'label'=>'DateCreation', 'visible'=>-1, 'enabled'=>1, 'position'=>500, 'notnull'=>1,),
88
-		'tms' => array('type'=>'timestamp', 'label'=>'DateModification', 'visible'=>-1, 'enabled'=>1, 'position'=>500, 'notnull'=>1,),
89
-		'active' => array('type'=>'integer', 'label'=>'Status', 'visible'=>1, 'enabled'=>1, 'position'=>1000, 'notnull'=>-1, 'index'=>1),
90
-	);
91
-
92
-	/**
93
-	 * @var int ID
94
-	 */
95
-	public $rowid;
96
-
97
-	/**
98
-	 * @var int Entity
99
-	 */
100
-	public $entity;
101
-
102
-	/**
38
+    /**
39
+     * @var string ID to identify managed object
40
+     */
41
+    public $element = 'emailsenderprofile';
42
+
43
+    /**
44
+     * @var string Name of table without prefix where object is stored
45
+     */
46
+    public $table_element = 'c_email_senderprofile';
47
+
48
+    /**
49
+     * @var array  Does emailsenderprofile support multicompany module ? 0=No test on entity, 1=Test with field entity, 2=Test with link by societe
50
+     */
51
+    public $ismultientitymanaged = 1;
52
+
53
+    /**
54
+     * @var string String with name of icon for emailsenderprofile
55
+     */
56
+    public $picto = 'emailsenderprofile@monmodule';
57
+
58
+
59
+    /**
60
+     *             'type' if the field format.
61
+     *             'label' the translation key.
62
+     *             'enabled' is a condition when the filed must be managed.
63
+     *             'visible' says if field is visible in list (-1 means not shown by default but can be added into list to be viewed).
64
+     *             'notnull' is set to 1 if not null in database. Set to -1 if we must set data to null if empty ('' or 0).
65
+     *             'index' if we want an index in database.
66
+     *             'foreignkey'=>'tablename.field' if the field is a foreign key (it is recommanded to name the field fk_...).
67
+     *             'position' is the sort order of field.
68
+     *             'searchall' is 1 if we want to search in this field when making a search from the quick search button.
69
+     *             'isameasure' must be set to 1 if you want to have a total on list for this field. Field type must be summable like integer or double(24,8).
70
+     *             'help' is a string visible as a tooltip on field
71
+     *             'comment' is not used. You can store here any text of your choice.
72
+     */
73
+
74
+    // BEGIN MODULEBUILDER PROPERTIES
75
+    /**
76
+     * @var array  Array with all fields and their property. Do not use it as a static var. It may be modified by constructor.
77
+     */
78
+    public $fields=array(
79
+        'rowid' => array('type'=>'integer', 'label'=>'TechnicalID', 'visible'=>-1, 'enabled'=>1, 'position'=>1, 'notnull'=>1, 'index'=>1, 'comment'=>'Id',),
80
+        'entity' => array('type'=>'integer', 'label'=>'Entity', 'visible'=>-1, 'enabled'=>1, 'position'=>20, 'notnull'=>1, 'index'=>1,),
81
+        'label' => array('type'=>'varchar(255)', 'label'=>'Label', 'visible'=>1, 'enabled'=>1, 'position'=>30, 'notnull'=>-1),
82
+        'email' => array('type'=>'varchar(255)', 'label'=>'Email', 'visible'=>1, 'enabled'=>1, 'position'=>40, 'notnull'=>-1),
83
+        //'fk_user_creat' => array('type'=>'integer', 'label'=>'UserAuthor', 'visible'=>-1, 'enabled'=>1, 'position'=>500, 'notnull'=>1,),
84
+        //'fk_user_modif' => array('type'=>'integer', 'label'=>'UserModif', 'visible'=>-1, 'enabled'=>1, 'position'=>500, 'notnull'=>-1,),
85
+        'signature' => array('type'=>'text', 'label'=>'Signature', 'visible'=>-1, 'enabled'=>1, 'position'=>1000, 'notnull'=>-1, 'index'=>1,),
86
+        'position' => array('type'=>'integer', 'label'=>'Position', 'visible'=>-1, 'enabled'=>1, 'position'=>1000, 'notnull'=>-1, 'index'=>1,),
87
+        'date_creation' => array('type'=>'datetime', 'label'=>'DateCreation', 'visible'=>-1, 'enabled'=>1, 'position'=>500, 'notnull'=>1,),
88
+        'tms' => array('type'=>'timestamp', 'label'=>'DateModification', 'visible'=>-1, 'enabled'=>1, 'position'=>500, 'notnull'=>1,),
89
+        'active' => array('type'=>'integer', 'label'=>'Status', 'visible'=>1, 'enabled'=>1, 'position'=>1000, 'notnull'=>-1, 'index'=>1),
90
+    );
91
+
92
+    /**
93
+     * @var int ID
94
+     */
95
+    public $rowid;
96
+
97
+    /**
98
+     * @var int Entity
99
+     */
100
+    public $entity;
101
+
102
+    /**
103 103
      * @var string Email Sender Profile label
104 104
      */
105 105
     public $label;
106 106
 
107
-	public $email;
108
-	public $date_creation;
109
-	public $tms;
110
-	//public $fk_user_creat;
111
-	//public $fk_user_modif;
112
-	public $signature;
113
-	public $position;
114
-	public $active;
115
-	// END MODULEBUILDER PROPERTIES
116
-
117
-
118
-
119
-	// If this object has a subtable with lines
120
-
121
-	/**
122
-	 * @var int    Name of subtable line
123
-	 */
124
-	//public $table_element_line = 'emailsenderprofiledet';
125
-	/**
126
-	 * @var int    Field with ID of parent key if this field has a parent
127
-	 */
128
-	//public $fk_element = 'fk_emailsenderprofile';
129
-	/**
130
-	 * @var int    Name of subtable class that manage subtable lines
131
-	 */
132
-	//public $class_element_line = 'EmailSenderProfileline';
133
-	/**
134
-	 * @var array  Array of child tables (child tables to delete before deleting a record)
135
-	 */
136
-	//protected $childtables=array('emailsenderprofiledet');
137
-	/**
138
-	 * @var EmailSenderProfileLine[]     Array of subtable lines
139
-	 */
140
-	//public $lines = array();
141
-
142
-
143
-
144
-	/**
145
-	 * Constructor
146
-	 *
147
-	 * @param DoliDb $db Database handler
148
-	 */
149
-	public function __construct(DoliDB $db)
150
-	{
151
-		global $conf;
152
-
153
-		$this->db = $db;
154
-
155
-		if (empty($conf->global->MAIN_SHOW_TECHNICAL_ID)) $this->fields['rowid']['visible']=0;
156
-		if (empty($conf->multicompany->enabled)) $this->fields['entity']['enabled']=0;
157
-	}
158
-
159
-	/**
160
-	 * Create object into database
161
-	 *
162
-	 * @param  User $user      User that creates
163
-	 * @param  bool $notrigger false=launch triggers after, true=disable triggers
164
-	 * @return int             <0 if KO, Id of created object if OK
165
-	 */
166
-	public function create(User $user, $notrigger = false)
167
-	{
168
-		return $this->createCommon($user, $notrigger);
169
-	}
170
-
171
-	/**
172
-	 * Clone and object into another one
173
-	 *
174
-	 * @param  	User 	$user      	User that creates
175
-	 * @param  	int 	$fromid     Id of object to clone
176
-	 * @return 	mixed 				New object created, <0 if KO
177
-	 */
178
-	public function createFromClone(User $user, $fromid)
179
-	{
180
-		global $hookmanager, $langs;
181
-		$error = 0;
182
-
183
-		dol_syslog(__METHOD__, LOG_DEBUG);
184
-
185
-		$object = new self($this->db);
186
-
187
-		$this->db->begin();
188
-
189
-		// Load source object
190
-		$object->fetchCommon($fromid);
191
-		// Reset some properties
192
-		unset($object->id);
193
-		unset($object->fk_user_creat);
194
-		unset($object->import_key);
195
-
196
-		// Clear fields
197
-		$object->ref = "copy_of_".$object->ref;
198
-		$object->title = $langs->trans("CopyOf")." ".$object->title;
199
-		// ...
200
-
201
-		// Create clone
202
-		$object->context['createfromclone'] = 'createfromclone';
203
-		$result = $object->createCommon($user);
204
-		if ($result < 0) {
205
-			$error++;
206
-			$this->error = $object->error;
207
-			$this->errors = $object->errors;
208
-		}
209
-
210
-		// End
211
-		if (!$error) {
212
-			$this->db->commit();
213
-			return $object;
214
-		} else {
215
-			$this->db->rollback();
216
-			return -1;
217
-		}
218
-	}
219
-
220
-	/**
221
-	 * Load object in memory from the database
222
-	 *
223
-	 * @param int    $id   Id object
224
-	 * @param string $ref  Ref
225
-	 * @return int         <0 if KO, 0 if not found, >0 if OK
226
-	 */
227
-	public function fetch($id, $ref = null)
228
-	{
229
-		$result = $this->fetchCommon($id, $ref);
230
-		if ($result > 0 && ! empty($this->table_element_line)) $this->fetchLines();
231
-		return $result;
232
-	}
233
-
234
-	/**
235
-	 * Load object lines in memory from the database
236
-	 *
237
-	 * @return int         <0 if KO, 0 if not found, >0 if OK
238
-	 */
239
-	public function fetchLines()
240
-	{
241
-		$this->lines=array();
242
-
243
-		// Load lines with object EmailSenderProfileLine
244
-
245
-		return count($this->lines)?1:0;
246
-	}
247
-
248
-	/**
249
-	 * Update object into database
250
-	 *
251
-	 * @param  User $user      User that modifies
252
-	 * @param  bool $notrigger false=launch triggers after, true=disable triggers
253
-	 * @return int             <0 if KO, >0 if OK
254
-	 */
255
-	public function update(User $user, $notrigger = false)
256
-	{
257
-		return $this->updateCommon($user, $notrigger);
258
-	}
259
-
260
-	/**
261
-	 * Delete object in database
262
-	 *
263
-	 * @param User $user       User that deletes
264
-	 * @param bool $notrigger  false=launch triggers after, true=disable triggers
265
-	 * @return int             <0 if KO, >0 if OK
266
-	 */
267
-	public function delete(User $user, $notrigger = false)
268
-	{
269
-		return $this->deleteCommon($user, $notrigger);
270
-	}
271
-
272
-	/**
273
-	 *  Return a link to the object card (with optionaly the picto)
274
-	 *
275
-	 *	@param	int		$withpicto					Include picto in link (0=No picto, 1=Include picto into link, 2=Only picto)
276
-	 *	@return	string								String with URL
277
-	 */
278
-	function getNomUrl($withpicto=0)
279
-	{
280
-		global $db, $conf, $langs;
281
-		global $dolibarr_main_authentication, $dolibarr_main_demo;
282
-		global $menumanager;
283
-
284
-		$result = '';
285
-		$companylink = '';
107
+    public $email;
108
+    public $date_creation;
109
+    public $tms;
110
+    //public $fk_user_creat;
111
+    //public $fk_user_modif;
112
+    public $signature;
113
+    public $position;
114
+    public $active;
115
+    // END MODULEBUILDER PROPERTIES
116
+
117
+
118
+
119
+    // If this object has a subtable with lines
120
+
121
+    /**
122
+     * @var int    Name of subtable line
123
+     */
124
+    //public $table_element_line = 'emailsenderprofiledet';
125
+    /**
126
+     * @var int    Field with ID of parent key if this field has a parent
127
+     */
128
+    //public $fk_element = 'fk_emailsenderprofile';
129
+    /**
130
+     * @var int    Name of subtable class that manage subtable lines
131
+     */
132
+    //public $class_element_line = 'EmailSenderProfileline';
133
+    /**
134
+     * @var array  Array of child tables (child tables to delete before deleting a record)
135
+     */
136
+    //protected $childtables=array('emailsenderprofiledet');
137
+    /**
138
+     * @var EmailSenderProfileLine[]     Array of subtable lines
139
+     */
140
+    //public $lines = array();
141
+
142
+
143
+
144
+    /**
145
+     * Constructor
146
+     *
147
+     * @param DoliDb $db Database handler
148
+     */
149
+    public function __construct(DoliDB $db)
150
+    {
151
+        global $conf;
152
+
153
+        $this->db = $db;
154
+
155
+        if (empty($conf->global->MAIN_SHOW_TECHNICAL_ID)) $this->fields['rowid']['visible']=0;
156
+        if (empty($conf->multicompany->enabled)) $this->fields['entity']['enabled']=0;
157
+    }
158
+
159
+    /**
160
+     * Create object into database
161
+     *
162
+     * @param  User $user      User that creates
163
+     * @param  bool $notrigger false=launch triggers after, true=disable triggers
164
+     * @return int             <0 if KO, Id of created object if OK
165
+     */
166
+    public function create(User $user, $notrigger = false)
167
+    {
168
+        return $this->createCommon($user, $notrigger);
169
+    }
170
+
171
+    /**
172
+     * Clone and object into another one
173
+     *
174
+     * @param  	User 	$user      	User that creates
175
+     * @param  	int 	$fromid     Id of object to clone
176
+     * @return 	mixed 				New object created, <0 if KO
177
+     */
178
+    public function createFromClone(User $user, $fromid)
179
+    {
180
+        global $hookmanager, $langs;
181
+        $error = 0;
182
+
183
+        dol_syslog(__METHOD__, LOG_DEBUG);
184
+
185
+        $object = new self($this->db);
186
+
187
+        $this->db->begin();
188
+
189
+        // Load source object
190
+        $object->fetchCommon($fromid);
191
+        // Reset some properties
192
+        unset($object->id);
193
+        unset($object->fk_user_creat);
194
+        unset($object->import_key);
195
+
196
+        // Clear fields
197
+        $object->ref = "copy_of_".$object->ref;
198
+        $object->title = $langs->trans("CopyOf")." ".$object->title;
199
+        // ...
200
+
201
+        // Create clone
202
+        $object->context['createfromclone'] = 'createfromclone';
203
+        $result = $object->createCommon($user);
204
+        if ($result < 0) {
205
+            $error++;
206
+            $this->error = $object->error;
207
+            $this->errors = $object->errors;
208
+        }
209
+
210
+        // End
211
+        if (!$error) {
212
+            $this->db->commit();
213
+            return $object;
214
+        } else {
215
+            $this->db->rollback();
216
+            return -1;
217
+        }
218
+    }
219
+
220
+    /**
221
+     * Load object in memory from the database
222
+     *
223
+     * @param int    $id   Id object
224
+     * @param string $ref  Ref
225
+     * @return int         <0 if KO, 0 if not found, >0 if OK
226
+     */
227
+    public function fetch($id, $ref = null)
228
+    {
229
+        $result = $this->fetchCommon($id, $ref);
230
+        if ($result > 0 && ! empty($this->table_element_line)) $this->fetchLines();
231
+        return $result;
232
+    }
233
+
234
+    /**
235
+     * Load object lines in memory from the database
236
+     *
237
+     * @return int         <0 if KO, 0 if not found, >0 if OK
238
+     */
239
+    public function fetchLines()
240
+    {
241
+        $this->lines=array();
242
+
243
+        // Load lines with object EmailSenderProfileLine
244
+
245
+        return count($this->lines)?1:0;
246
+    }
247
+
248
+    /**
249
+     * Update object into database
250
+     *
251
+     * @param  User $user      User that modifies
252
+     * @param  bool $notrigger false=launch triggers after, true=disable triggers
253
+     * @return int             <0 if KO, >0 if OK
254
+     */
255
+    public function update(User $user, $notrigger = false)
256
+    {
257
+        return $this->updateCommon($user, $notrigger);
258
+    }
259
+
260
+    /**
261
+     * Delete object in database
262
+     *
263
+     * @param User $user       User that deletes
264
+     * @param bool $notrigger  false=launch triggers after, true=disable triggers
265
+     * @return int             <0 if KO, >0 if OK
266
+     */
267
+    public function delete(User $user, $notrigger = false)
268
+    {
269
+        return $this->deleteCommon($user, $notrigger);
270
+    }
271
+
272
+    /**
273
+     *  Return a link to the object card (with optionaly the picto)
274
+     *
275
+     *	@param	int		$withpicto					Include picto in link (0=No picto, 1=Include picto into link, 2=Only picto)
276
+     *	@return	string								String with URL
277
+     */
278
+    function getNomUrl($withpicto=0)
279
+    {
280
+        global $db, $conf, $langs;
281
+        global $dolibarr_main_authentication, $dolibarr_main_demo;
282
+        global $menumanager;
283
+
284
+        $result = '';
285
+        $companylink = '';
286 286
 
287 287
     $label=$this->label;
288 288
 
289 289
     $url='';
290
-		//$url = dol_buildpath('/monmodule/emailsenderprofile_card.php',1).'?id='.$this->id;
291
-
292
-		$linkstart = '';
293
-		$linkend='';
294
-
295
-		if ($withpicto)
296
-		{
297
-			$result.=($linkstart.img_object($label, 'label', 'class="classfortooltip"').$linkend);
298
-			if ($withpicto != 2) $result.=' ';
299
-		}
300
-		$result.= $linkstart . $this->label . $linkend;
301
-		return $result;
302
-	}
303
-
304
-	/**
305
-	 * Return link to download file from a direct external access
306
-	 *
307
-	 * @param	int				$withpicto			Add download picto into link
308
-	 * @return	string			HTML link to file
309
-	 */
310
-	function getDirectExternalLink($withpicto=0)
311
-	{
312
-		return 'todo';
313
-	}
314
-
315
-	/**
316
-	 *  Retourne le libelle du status d'un user (actif, inactif)
317
-	 *
318
-	 *  @param	int		$mode          0=libelle long, 1=libelle court, 2=Picto + Libelle court, 3=Picto, 4=Picto + Libelle long, 5=Libelle court + Picto
319
-	 *  @return	string 			       Label of status
320
-	 */
321
-	function getLibStatut($mode=0)
322
-	{
323
-		return $this->LibStatut($this->status,$mode);
324
-	}
290
+        //$url = dol_buildpath('/monmodule/emailsenderprofile_card.php',1).'?id='.$this->id;
291
+
292
+        $linkstart = '';
293
+        $linkend='';
294
+
295
+        if ($withpicto)
296
+        {
297
+            $result.=($linkstart.img_object($label, 'label', 'class="classfortooltip"').$linkend);
298
+            if ($withpicto != 2) $result.=' ';
299
+        }
300
+        $result.= $linkstart . $this->label . $linkend;
301
+        return $result;
302
+    }
303
+
304
+    /**
305
+     * Return link to download file from a direct external access
306
+     *
307
+     * @param	int				$withpicto			Add download picto into link
308
+     * @return	string			HTML link to file
309
+     */
310
+    function getDirectExternalLink($withpicto=0)
311
+    {
312
+        return 'todo';
313
+    }
314
+
315
+    /**
316
+     *  Retourne le libelle du status d'un user (actif, inactif)
317
+     *
318
+     *  @param	int		$mode          0=libelle long, 1=libelle court, 2=Picto + Libelle court, 3=Picto, 4=Picto + Libelle long, 5=Libelle court + Picto
319
+     *  @return	string 			       Label of status
320
+     */
321
+    function getLibStatut($mode=0)
322
+    {
323
+        return $this->LibStatut($this->status,$mode);
324
+    }
325 325
 
326 326
     // phpcs:disable PEAR.NamingConventions.ValidFunctionName.NotCamelCaps
327
-	/**
328
-	 *  Return the status
329
-	 *
330
-	 *  @param	int		$status        	Id status
331
-	 *  @param  int		$mode          	0=long label, 1=short label, 2=Picto + short label, 3=Picto, 4=Picto + long label, 5=Short label + Picto, 6=Long label + Picto
332
-	 *  @return string 			       	Label of status
333
-	 */
334
-	static function LibStatut($status,$mode=0)
335
-	{
336
-		global $langs;
337
-
338
-		if ($mode == 0 || $mode == 1)
339
-		{
340
-			if ($status == 1) return $langs->trans('Enabled');
341
-			if ($status == 0) return $langs->trans('Disabled');
342
-		}
343
-		elseif ($mode == 2)
344
-		{
345
-			if ($status == 1) return img_picto($langs->trans('Enabled'),'statut4').' '.$langs->trans('Enabled');
346
-			if ($status == 0) return img_picto($langs->trans('Disabled'),'statut5').' '.$langs->trans('Disabled');
347
-		}
348
-		elseif ($mode == 3)
349
-		{
350
-			if ($status == 1) return img_picto($langs->trans('Enabled'),'statut4');
351
-			if ($status == 0) return img_picto($langs->trans('Disabled'),'statut5');
352
-		}
353
-		elseif ($mode == 4)
354
-		{
355
-			if ($status == 1) return img_picto($langs->trans('Enabled'),'statut4').' '.$langs->trans('Enabled');
356
-			if ($status == 0) return img_picto($langs->trans('Disabled'),'statut5').' '.$langs->trans('Disabled');
357
-		}
358
-		elseif ($mode == 5)
359
-		{
360
-			if ($status == 1) return $langs->trans('Enabled').' '.img_picto($langs->trans('Enabled'),'statut4');
361
-			if ($status == 0) return $langs->trans('Disabled').' '.img_picto($langs->trans('Disabled'),'statut5');
362
-		}
363
-		elseif ($mode == 6)
364
-		{
365
-			if ($status == 1) return $langs->trans('Enabled').' '.img_picto($langs->trans('Enabled'),'statut4');
366
-			if ($status == 0) return $langs->trans('Disabled').' '.img_picto($langs->trans('Disabled'),'statut5');
367
-		}
368
-	}
369
-
370
-	/**
371
-	 *	Charge les informations d'ordre info dans l'objet commande
372
-	 *
373
-	 *	@param  int		$id       Id of order
374
-	 *	@return	void
375
-	 */
376
-	function info($id)
377
-	{
378
-		$sql = 'SELECT rowid, date_creation as datec, tms as datem,';
379
-		$sql.= ' fk_user_creat, fk_user_modif';
380
-		$sql.= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' as t';
381
-		$sql.= ' WHERE t.rowid = '.$id;
382
-		$result=$this->db->query($sql);
383
-		if ($result)
384
-		{
385
-			if ($this->db->num_rows($result))
386
-			{
387
-				$obj = $this->db->fetch_object($result);
388
-				$this->id = $obj->rowid;
389
-				if ($obj->fk_user_author)
390
-				{
391
-					$cuser = new User($this->db);
392
-					$cuser->fetch($obj->fk_user_author);
393
-					$this->user_creation   = $cuser;
394
-				}
395
-
396
-				if ($obj->fk_user_valid)
397
-				{
398
-					$vuser = new User($this->db);
399
-					$vuser->fetch($obj->fk_user_valid);
400
-					$this->user_validation = $vuser;
401
-				}
402
-
403
-				if ($obj->fk_user_cloture)
404
-				{
405
-					$cluser = new User($this->db);
406
-					$cluser->fetch($obj->fk_user_cloture);
407
-					$this->user_cloture   = $cluser;
408
-				}
409
-
410
-				$this->date_creation     = $this->db->jdate($obj->datec);
411
-				$this->date_modification = $this->db->jdate($obj->datem);
412
-				$this->date_validation   = $this->db->jdate($obj->datev);
413
-			}
414
-
415
-			$this->db->free($result);
416
-		}
417
-		else
418
-		{
419
-			dol_print_error($this->db);
420
-		}
421
-	}
422
-
423
-	/**
424
-	 * Initialise object with example values
425
-	 * Id must be 0 if object instance is a specimen
426
-	 *
427
-	 * @return void
428
-	 */
429
-	public function initAsSpecimen()
430
-	{
431
-		$this->initAsSpecimenCommon();
432
-	}
327
+    /**
328
+     *  Return the status
329
+     *
330
+     *  @param	int		$status        	Id status
331
+     *  @param  int		$mode          	0=long label, 1=short label, 2=Picto + short label, 3=Picto, 4=Picto + long label, 5=Short label + Picto, 6=Long label + Picto
332
+     *  @return string 			       	Label of status
333
+     */
334
+    static function LibStatut($status,$mode=0)
335
+    {
336
+        global $langs;
337
+
338
+        if ($mode == 0 || $mode == 1)
339
+        {
340
+            if ($status == 1) return $langs->trans('Enabled');
341
+            if ($status == 0) return $langs->trans('Disabled');
342
+        }
343
+        elseif ($mode == 2)
344
+        {
345
+            if ($status == 1) return img_picto($langs->trans('Enabled'),'statut4').' '.$langs->trans('Enabled');
346
+            if ($status == 0) return img_picto($langs->trans('Disabled'),'statut5').' '.$langs->trans('Disabled');
347
+        }
348
+        elseif ($mode == 3)
349
+        {
350
+            if ($status == 1) return img_picto($langs->trans('Enabled'),'statut4');
351
+            if ($status == 0) return img_picto($langs->trans('Disabled'),'statut5');
352
+        }
353
+        elseif ($mode == 4)
354
+        {
355
+            if ($status == 1) return img_picto($langs->trans('Enabled'),'statut4').' '.$langs->trans('Enabled');
356
+            if ($status == 0) return img_picto($langs->trans('Disabled'),'statut5').' '.$langs->trans('Disabled');
357
+        }
358
+        elseif ($mode == 5)
359
+        {
360
+            if ($status == 1) return $langs->trans('Enabled').' '.img_picto($langs->trans('Enabled'),'statut4');
361
+            if ($status == 0) return $langs->trans('Disabled').' '.img_picto($langs->trans('Disabled'),'statut5');
362
+        }
363
+        elseif ($mode == 6)
364
+        {
365
+            if ($status == 1) return $langs->trans('Enabled').' '.img_picto($langs->trans('Enabled'),'statut4');
366
+            if ($status == 0) return $langs->trans('Disabled').' '.img_picto($langs->trans('Disabled'),'statut5');
367
+        }
368
+    }
369
+
370
+    /**
371
+     *	Charge les informations d'ordre info dans l'objet commande
372
+     *
373
+     *	@param  int		$id       Id of order
374
+     *	@return	void
375
+     */
376
+    function info($id)
377
+    {
378
+        $sql = 'SELECT rowid, date_creation as datec, tms as datem,';
379
+        $sql.= ' fk_user_creat, fk_user_modif';
380
+        $sql.= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' as t';
381
+        $sql.= ' WHERE t.rowid = '.$id;
382
+        $result=$this->db->query($sql);
383
+        if ($result)
384
+        {
385
+            if ($this->db->num_rows($result))
386
+            {
387
+                $obj = $this->db->fetch_object($result);
388
+                $this->id = $obj->rowid;
389
+                if ($obj->fk_user_author)
390
+                {
391
+                    $cuser = new User($this->db);
392
+                    $cuser->fetch($obj->fk_user_author);
393
+                    $this->user_creation   = $cuser;
394
+                }
395
+
396
+                if ($obj->fk_user_valid)
397
+                {
398
+                    $vuser = new User($this->db);
399
+                    $vuser->fetch($obj->fk_user_valid);
400
+                    $this->user_validation = $vuser;
401
+                }
402
+
403
+                if ($obj->fk_user_cloture)
404
+                {
405
+                    $cluser = new User($this->db);
406
+                    $cluser->fetch($obj->fk_user_cloture);
407
+                    $this->user_cloture   = $cluser;
408
+                }
409
+
410
+                $this->date_creation     = $this->db->jdate($obj->datec);
411
+                $this->date_modification = $this->db->jdate($obj->datem);
412
+                $this->date_validation   = $this->db->jdate($obj->datev);
413
+            }
414
+
415
+            $this->db->free($result);
416
+        }
417
+        else
418
+        {
419
+            dol_print_error($this->db);
420
+        }
421
+    }
422
+
423
+    /**
424
+     * Initialise object with example values
425
+     * Id must be 0 if object instance is a specimen
426
+     *
427
+     * @return void
428
+     */
429
+    public function initAsSpecimen()
430
+    {
431
+        $this->initAsSpecimenCommon();
432
+    }
433 433
 }
434 434
 
435 435
 /**
Please login to merge, or discard this patch.
dolibarr/htdocs/core/class/html.formwebsite.class.php 1 patch
Indentation   +83 added lines, -83 removed lines patch added patch discarded remove patch
@@ -30,9 +30,9 @@  discard block
 block discarded – undo
30 30
     private $db;
31 31
 
32 32
     /**
33
-	 * @var string Error code (or message)
34
-	 */
35
-	public $error;
33
+     * @var string Error code (or message)
34
+     */
35
+    public $error;
36 36
 
37 37
 
38 38
     /**
@@ -56,7 +56,7 @@  discard block
 block discarded – undo
56 56
      */
57 57
     function selectWebsite($selected='',$htmlname='exportmodelid',$useempty=0)
58 58
     {
59
-    	$out='';
59
+        $out='';
60 60
 
61 61
         $sql = "SELECT rowid, ref";
62 62
         $sql.= " FROM ".MAIN_DB_PREFIX."website";
@@ -109,55 +109,55 @@  discard block
 block discarded – undo
109 109
      */
110 110
     function selectTypeOfContainer($htmlname, $selected='', $useempty=0, $moreattrib='')
111 111
     {
112
-    	global $langs, $conf, $user;
113
-
114
-    	$langs->load("admin");
115
-
116
-    	$sql = "SELECT rowid, code, label, entity";
117
-    	$sql.= " FROM ".MAIN_DB_PREFIX.'c_type_container';
118
-    	$sql.= " WHERE active = 1 AND entity IN (".getEntity('c_type_container').")";
119
-    	$sql.= " ORDER BY label";
120
-
121
-    	dol_syslog(get_class($this)."::selectTypeOfContainer", LOG_DEBUG);
122
-    	$result = $this->db->query($sql);
123
-    	if ($result)
124
-    	{
125
-    		$num = $this->db->num_rows($result);
126
-    		$i = 0;
127
-    		if ($num)
128
-    		{
129
-    			print '<select id="select'.$htmlname.'" class="flat selectTypeOfContainer" name="'.$htmlname.'"'.($moreattrib?' '.$moreattrib:'').'>';
130
-    			if ($useempty == 1 || ($useempty == 2 && $num > 1))
131
-    			{
132
-    				print '<option value="-1">&nbsp;</option>';
133
-    			}
134
-
135
-    			while ($i < $num)
136
-    			{
137
-    				$obj = $this->db->fetch_object($result);
138
-    				if ($selected == $obj->rowid || $selected == $obj->code)
139
-    				{
140
-    					print '<option value="'.$obj->code.'" selected>';
141
-    				}
142
-    				else
143
-    				{
144
-    					print '<option value="'.$obj->code.'">';
145
-    				}
146
-    				print $obj->label;
147
-    				print '</option>';
148
-    				$i++;
149
-    			}
150
-    			print "</select>";
151
-    			if ($user->admin) print info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"),1);
152
-    		}
153
-    		else
154
-    		{
155
-    			print $langs->trans("NoTypeOfPagePleaseEditDictionary");
156
-    		}
157
-    	}
158
-    	else {
159
-    		dol_print_error($this->db);
160
-    	}
112
+        global $langs, $conf, $user;
113
+
114
+        $langs->load("admin");
115
+
116
+        $sql = "SELECT rowid, code, label, entity";
117
+        $sql.= " FROM ".MAIN_DB_PREFIX.'c_type_container';
118
+        $sql.= " WHERE active = 1 AND entity IN (".getEntity('c_type_container').")";
119
+        $sql.= " ORDER BY label";
120
+
121
+        dol_syslog(get_class($this)."::selectTypeOfContainer", LOG_DEBUG);
122
+        $result = $this->db->query($sql);
123
+        if ($result)
124
+        {
125
+            $num = $this->db->num_rows($result);
126
+            $i = 0;
127
+            if ($num)
128
+            {
129
+                print '<select id="select'.$htmlname.'" class="flat selectTypeOfContainer" name="'.$htmlname.'"'.($moreattrib?' '.$moreattrib:'').'>';
130
+                if ($useempty == 1 || ($useempty == 2 && $num > 1))
131
+                {
132
+                    print '<option value="-1">&nbsp;</option>';
133
+                }
134
+
135
+                while ($i < $num)
136
+                {
137
+                    $obj = $this->db->fetch_object($result);
138
+                    if ($selected == $obj->rowid || $selected == $obj->code)
139
+                    {
140
+                        print '<option value="'.$obj->code.'" selected>';
141
+                    }
142
+                    else
143
+                    {
144
+                        print '<option value="'.$obj->code.'">';
145
+                    }
146
+                    print $obj->label;
147
+                    print '</option>';
148
+                    $i++;
149
+                }
150
+                print "</select>";
151
+                if ($user->admin) print info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"),1);
152
+            }
153
+            else
154
+            {
155
+                print $langs->trans("NoTypeOfPagePleaseEditDictionary");
156
+            }
157
+        }
158
+        else {
159
+            dol_print_error($this->db);
160
+        }
161 161
     }
162 162
 
163 163
 
@@ -172,35 +172,35 @@  discard block
 block discarded – undo
172 172
      */
173 173
     function selectSampleOfContainer($htmlname, $selected='', $useempty=0, $moreattrib='')
174 174
     {
175
-    	global $langs, $conf, $user;
176
-
177
-    	$langs->load("admin");
178
-
179
-    	$arrayofsamples=array('empty'=>'EmptyPage', 'corporatehome'=>'CorporateHomePage');
180
-
181
-    	$out = '';
182
-    	$out .= '<select id="select'.$htmlname.'" class="flat selectTypeOfContainer" name="'.$htmlname.'"'.($moreattrib?' '.$moreattrib:'').'>';
183
-
184
-    	if ($useempty == 1 || $useempty == 2)
185
-    	{
186
-    		$out .= '<option value="-1">&nbsp;</option>';
187
-    	}
188
-
189
-    	foreach($arrayofsamples as $key => $val)
190
-    	{
191
-    		if ($selected == $key)
192
-    		{
193
-    			$out .= '<option value="'.$key.'" selected>';
194
-    		}
195
-    		else
196
-    		{
197
-    			$out .= '<option value="'.$key.'">';
198
-    		}
199
-    		$out .= $langs->trans($val);
200
-    		$out .= '</option>';
201
-    	}
202
-    	$out .= "</select>";
203
-
204
-    	return $out;
175
+        global $langs, $conf, $user;
176
+
177
+        $langs->load("admin");
178
+
179
+        $arrayofsamples=array('empty'=>'EmptyPage', 'corporatehome'=>'CorporateHomePage');
180
+
181
+        $out = '';
182
+        $out .= '<select id="select'.$htmlname.'" class="flat selectTypeOfContainer" name="'.$htmlname.'"'.($moreattrib?' '.$moreattrib:'').'>';
183
+
184
+        if ($useempty == 1 || $useempty == 2)
185
+        {
186
+            $out .= '<option value="-1">&nbsp;</option>';
187
+        }
188
+
189
+        foreach($arrayofsamples as $key => $val)
190
+        {
191
+            if ($selected == $key)
192
+            {
193
+                $out .= '<option value="'.$key.'" selected>';
194
+            }
195
+            else
196
+            {
197
+                $out .= '<option value="'.$key.'">';
198
+            }
199
+            $out .= $langs->trans($val);
200
+            $out .= '</option>';
201
+        }
202
+        $out .= "</select>";
203
+
204
+        return $out;
205 205
     }
206 206
 }
Please login to merge, or discard this patch.
dolibarr/htdocs/core/actions_addupdatedelete.inc.php 1 patch
Indentation   +158 added lines, -158 removed lines patch added patch discarded remove patch
@@ -32,187 +32,187 @@
 block discarded – undo
32 32
 
33 33
 if ($cancel)
34 34
 {
35
-	if (! empty($backtopage))
36
-	{
37
-		header("Location: ".$backtopage);
38
-		exit;
39
-	}
40
-	$action='';
35
+    if (! empty($backtopage))
36
+    {
37
+        header("Location: ".$backtopage);
38
+        exit;
39
+    }
40
+    $action='';
41 41
 }
42 42
 
43 43
 // Action to add record
44 44
 if ($action == 'add' && ! empty($permissiontoadd))
45 45
 {
46
-	foreach ($object->fields as $key => $val)
47
-	{
48
-		if (in_array($key, array('rowid', 'entity', 'date_creation', 'tms', 'fk_user_creat', 'fk_user_modif', 'import_key'))) continue;	// Ignore special fields
49
-
50
-		// Set value to insert
51
-		if (in_array($object->fields[$key]['type'], array('text', 'html'))) {
52
-			$value = GETPOST($key,'none');
53
-		} elseif ($object->fields[$key]['type']=='date') {
54
-			$value = dol_mktime(12, 0, 0, GETPOST($key.'month'), GETPOST($key.'day'), GETPOST($key.'year'));
55
-		} elseif ($object->fields[$key]['type']=='datetime') {
56
-			$value = dol_mktime(GETPOST($key.'hour'), GETPOST($key.'min'), 0, GETPOST($key.'month'), GETPOST($key.'day'), GETPOST($key.'year'));
57
-		} elseif ($object->fields[$key]['type']=='price') {
58
-			$value = price2num(GETPOST($key));
59
-		} else {
60
-			$value = GETPOST($key,'alpha');
61
-		}
62
-		if (preg_match('/^integer:/i', $object->fields[$key]['type']) && $value == '-1') $value='';		// This is an implicit foreign key field
63
-		if (! empty($object->fields[$key]['foreignkey']) && $value == '-1') $value='';					// This is an explicit foreign key field
64
-
65
-		$object->$key=$value;
66
-		if ($val['notnull'] > 0 && $object->$key == '' && is_null($val['default']))
67
-		{
68
-			$error++;
69
-			setEventMessages($langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv($val['label'])), null, 'errors');
70
-		}
71
-	}
72
-
73
-	if (! $error)
74
-	{
75
-		$result=$object->create($user);
76
-		if ($result > 0)
77
-		{
78
-			// Creation OK
79
-			$urltogo=$backtopage?str_replace('__ID__', $result, $backtopage):$backurlforlist;
80
-			header("Location: ".$urltogo);
81
-			exit;
82
-		}
83
-		else
84
-		{
85
-			// Creation KO
86
-			if (! empty($object->errors)) setEventMessages(null, $object->errors, 'errors');
87
-			else  setEventMessages($object->error, null, 'errors');
88
-			$action='create';
89
-		}
90
-	}
91
-	else
92
-	{
93
-		$action='create';
94
-	}
46
+    foreach ($object->fields as $key => $val)
47
+    {
48
+        if (in_array($key, array('rowid', 'entity', 'date_creation', 'tms', 'fk_user_creat', 'fk_user_modif', 'import_key'))) continue;	// Ignore special fields
49
+
50
+        // Set value to insert
51
+        if (in_array($object->fields[$key]['type'], array('text', 'html'))) {
52
+            $value = GETPOST($key,'none');
53
+        } elseif ($object->fields[$key]['type']=='date') {
54
+            $value = dol_mktime(12, 0, 0, GETPOST($key.'month'), GETPOST($key.'day'), GETPOST($key.'year'));
55
+        } elseif ($object->fields[$key]['type']=='datetime') {
56
+            $value = dol_mktime(GETPOST($key.'hour'), GETPOST($key.'min'), 0, GETPOST($key.'month'), GETPOST($key.'day'), GETPOST($key.'year'));
57
+        } elseif ($object->fields[$key]['type']=='price') {
58
+            $value = price2num(GETPOST($key));
59
+        } else {
60
+            $value = GETPOST($key,'alpha');
61
+        }
62
+        if (preg_match('/^integer:/i', $object->fields[$key]['type']) && $value == '-1') $value='';		// This is an implicit foreign key field
63
+        if (! empty($object->fields[$key]['foreignkey']) && $value == '-1') $value='';					// This is an explicit foreign key field
64
+
65
+        $object->$key=$value;
66
+        if ($val['notnull'] > 0 && $object->$key == '' && is_null($val['default']))
67
+        {
68
+            $error++;
69
+            setEventMessages($langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv($val['label'])), null, 'errors');
70
+        }
71
+    }
72
+
73
+    if (! $error)
74
+    {
75
+        $result=$object->create($user);
76
+        if ($result > 0)
77
+        {
78
+            // Creation OK
79
+            $urltogo=$backtopage?str_replace('__ID__', $result, $backtopage):$backurlforlist;
80
+            header("Location: ".$urltogo);
81
+            exit;
82
+        }
83
+        else
84
+        {
85
+            // Creation KO
86
+            if (! empty($object->errors)) setEventMessages(null, $object->errors, 'errors');
87
+            else  setEventMessages($object->error, null, 'errors');
88
+            $action='create';
89
+        }
90
+    }
91
+    else
92
+    {
93
+        $action='create';
94
+    }
95 95
 }
96 96
 
97 97
 // Action to update record
98 98
 if ($action == 'update' && ! empty($permissiontoadd))
99 99
 {
100
-	foreach ($object->fields as $key => $val)
101
-	{
102
-		if (! GETPOSTISSET($key)) continue;		// The field was not submited to be edited
103
-		if (in_array($key, array('rowid', 'entity', 'date_creation', 'tms', 'fk_user_creat', 'fk_user_modif', 'import_key'))) continue;	// Ignore special fields
104
-
105
-		// Set value to update
106
-		if (in_array($object->fields[$key]['type'], array('text', 'html'))) {
107
-			$value = GETPOST($key,'none');
108
-		} elseif ($object->fields[$key]['type']=='date') {
109
-			$value = dol_mktime(12, 0, 0, GETPOST($key.'month'), GETPOST($key.'day'), GETPOST($key.'year'));
110
-		} elseif ($object->fields[$key]['type']=='datetime') {
111
-			$value = dol_mktime(GETPOST($key.'hour'), GETPOST($key.'min'), 0, GETPOST($key.'month'), GETPOST($key.'day'), GETPOST($key.'year'));
112
-		} elseif ($object->fields[$key]['type']=='price') {
113
-			$value = price2num(GETPOST($key));
114
-		} else {
115
-			$value = GETPOST($key,'alpha');
116
-		}
117
-		if (preg_match('/^integer:/i', $object->fields[$key]['type']) && $value == '-1') $value='';		// This is an implicit foreign key field
118
-		if (! empty($object->fields[$key]['foreignkey']) && $value == '-1') $value='';					// This is an explicit foreign key field
119
-
120
-		$object->$key=$value;
121
-		if ($val['notnull'] > 0 && $object->$key == '' && is_null($val['default']))
122
-		{
123
-			$error++;
124
-			setEventMessages($langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv($val['label'])), null, 'errors');
125
-		}
126
-	}
127
-
128
-	if (! $error)
129
-	{
130
-		$result=$object->update($user);
131
-		if ($result > 0)
132
-		{
133
-			$action='view';
134
-		}
135
-		else
136
-		{
137
-			// Creation KO
138
-			setEventMessages($object->error, $object->errors, 'errors');
139
-			$action='edit';
140
-		}
141
-	}
142
-	else
143
-	{
144
-		$action='edit';
145
-	}
100
+    foreach ($object->fields as $key => $val)
101
+    {
102
+        if (! GETPOSTISSET($key)) continue;		// The field was not submited to be edited
103
+        if (in_array($key, array('rowid', 'entity', 'date_creation', 'tms', 'fk_user_creat', 'fk_user_modif', 'import_key'))) continue;	// Ignore special fields
104
+
105
+        // Set value to update
106
+        if (in_array($object->fields[$key]['type'], array('text', 'html'))) {
107
+            $value = GETPOST($key,'none');
108
+        } elseif ($object->fields[$key]['type']=='date') {
109
+            $value = dol_mktime(12, 0, 0, GETPOST($key.'month'), GETPOST($key.'day'), GETPOST($key.'year'));
110
+        } elseif ($object->fields[$key]['type']=='datetime') {
111
+            $value = dol_mktime(GETPOST($key.'hour'), GETPOST($key.'min'), 0, GETPOST($key.'month'), GETPOST($key.'day'), GETPOST($key.'year'));
112
+        } elseif ($object->fields[$key]['type']=='price') {
113
+            $value = price2num(GETPOST($key));
114
+        } else {
115
+            $value = GETPOST($key,'alpha');
116
+        }
117
+        if (preg_match('/^integer:/i', $object->fields[$key]['type']) && $value == '-1') $value='';		// This is an implicit foreign key field
118
+        if (! empty($object->fields[$key]['foreignkey']) && $value == '-1') $value='';					// This is an explicit foreign key field
119
+
120
+        $object->$key=$value;
121
+        if ($val['notnull'] > 0 && $object->$key == '' && is_null($val['default']))
122
+        {
123
+            $error++;
124
+            setEventMessages($langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv($val['label'])), null, 'errors');
125
+        }
126
+    }
127
+
128
+    if (! $error)
129
+    {
130
+        $result=$object->update($user);
131
+        if ($result > 0)
132
+        {
133
+            $action='view';
134
+        }
135
+        else
136
+        {
137
+            // Creation KO
138
+            setEventMessages($object->error, $object->errors, 'errors');
139
+            $action='edit';
140
+        }
141
+    }
142
+    else
143
+    {
144
+        $action='edit';
145
+    }
146 146
 }
147 147
 
148 148
 // Action to update one extrafield
149 149
 if ($action == "update_extras" && ! empty($permissiontoadd))
150 150
 {
151
-	$object->fetch(GETPOST('id','int'));
152
-	$attributekey = GETPOST('attribute','alpha');
153
-	$attributekeylong = 'options_'.$attributekey;
154
-	$object->array_options['options_'.$attributekey] = GETPOST($attributekeylong,' alpha');
155
-
156
-	$result = $object->insertExtraFields(empty($triggermodname)?'':$triggermodname, $user);
157
-	if ($result > 0)
158
-	{
159
-		setEventMessages($langs->trans('RecordSaved'), null, 'mesgs');
160
-		$action = 'view';
161
-	}
162
-	else
163
-	{
164
-		setEventMessages($object->error, $object->errors, 'errors');
165
-		$action = 'edit_extras';
166
-	}
151
+    $object->fetch(GETPOST('id','int'));
152
+    $attributekey = GETPOST('attribute','alpha');
153
+    $attributekeylong = 'options_'.$attributekey;
154
+    $object->array_options['options_'.$attributekey] = GETPOST($attributekeylong,' alpha');
155
+
156
+    $result = $object->insertExtraFields(empty($triggermodname)?'':$triggermodname, $user);
157
+    if ($result > 0)
158
+    {
159
+        setEventMessages($langs->trans('RecordSaved'), null, 'mesgs');
160
+        $action = 'view';
161
+    }
162
+    else
163
+    {
164
+        setEventMessages($object->error, $object->errors, 'errors');
165
+        $action = 'edit_extras';
166
+    }
167 167
 }
168 168
 
169 169
 // Action to delete
170 170
 if ($action == 'confirm_delete' && ! empty($permissiontodelete))
171 171
 {
172
-	$result=$object->delete($user);
173
-	if ($result > 0)
174
-	{
175
-		// Delete OK
176
-		setEventMessages("RecordDeleted", null, 'mesgs');
177
-		header("Location: ".$backurlforlist);
178
-		exit;
179
-	}
180
-	else
181
-	{
182
-		if (! empty($object->errors)) setEventMessages(null, $object->errors, 'errors');
183
-		else setEventMessages($object->error, null, 'errors');
184
-	}
172
+    $result=$object->delete($user);
173
+    if ($result > 0)
174
+    {
175
+        // Delete OK
176
+        setEventMessages("RecordDeleted", null, 'mesgs');
177
+        header("Location: ".$backurlforlist);
178
+        exit;
179
+    }
180
+    else
181
+    {
182
+        if (! empty($object->errors)) setEventMessages(null, $object->errors, 'errors');
183
+        else setEventMessages($object->error, null, 'errors');
184
+    }
185 185
 }
186 186
 
187 187
 // Action clone object
188 188
 if ($action == 'confirm_clone' && $confirm == 'yes' && ! empty($permissiontoadd))
189 189
 {
190
-	if (1==0 && ! GETPOST('clone_content') && ! GETPOST('clone_receivers'))
191
-	{
192
-		setEventMessages($langs->trans("NoCloneOptionsSpecified"), null, 'errors');
193
-	}
194
-	else
195
-	{
196
-		if ($object->id > 0)
197
-		{
198
-			// Because createFromClone modifies the object, we must clone it so that we can restore it later
199
-			$orig = clone $object;
200
-
201
-			$result=$object->createFromClone($user, $object->id);
202
-			if ($result > 0)
203
-			{
204
-				$newid = 0;
205
-				if (is_object($result)) $newid = $result->id;
206
-				else $newid = $result;
207
-				header("Location: ".$_SERVER['PHP_SELF'].'?id='.$newid);	// Open record of new object
208
-				exit;
209
-			}
210
-			else
211
-			{
212
-				setEventMessages($object->error, $object->errors, 'errors');
213
-				$object = $orig;
214
-				$action='';
215
-			}
216
-		}
217
-	}
190
+    if (1==0 && ! GETPOST('clone_content') && ! GETPOST('clone_receivers'))
191
+    {
192
+        setEventMessages($langs->trans("NoCloneOptionsSpecified"), null, 'errors');
193
+    }
194
+    else
195
+    {
196
+        if ($object->id > 0)
197
+        {
198
+            // Because createFromClone modifies the object, we must clone it so that we can restore it later
199
+            $orig = clone $object;
200
+
201
+            $result=$object->createFromClone($user, $object->id);
202
+            if ($result > 0)
203
+            {
204
+                $newid = 0;
205
+                if (is_object($result)) $newid = $result->id;
206
+                else $newid = $result;
207
+                header("Location: ".$_SERVER['PHP_SELF'].'?id='.$newid);	// Open record of new object
208
+                exit;
209
+            }
210
+            else
211
+            {
212
+                setEventMessages($object->error, $object->errors, 'errors');
213
+                $object = $orig;
214
+                $action='';
215
+            }
216
+        }
217
+    }
218 218
 }
Please login to merge, or discard this patch.