From 962f0e33f7439960aa56b2659b0374de15eee5fe Mon Sep 17 00:00:00 2001 From: BENKE Charlie Date: Sat, 26 Mar 2016 18:05:09 +0100 Subject: [PATCH 01/10] Add : photo on contact --- htdocs/contact/class/contact.class.php | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/contact/class/contact.class.php b/htdocs/contact/class/contact.class.php index 33c00af16a2..5c0dede1bbc 100644 --- a/htdocs/contact/class/contact.class.php +++ b/htdocs/contact/class/contact.class.php @@ -443,6 +443,7 @@ class Contact extends CommonObject // Mis a jour contact $sql = "UPDATE ".MAIN_DB_PREFIX."socpeople SET"; $sql.= " birthday=".($this->birthday ? "'".$this->db->idate($this->birthday)."'" : "null"); + $sql.= ", photo = ".($this->photo? "'".$this->photo."'" : "null"); if ($user) $sql .= ", fk_user_modif=".$user->id; $sql.= " WHERE rowid=".$this->db->escape($id); From 34fb67fe99ab288d7f1715f5901959137799a601 Mon Sep 17 00:00:00 2001 From: BENKE Charlie Date: Sat, 26 Mar 2016 18:12:03 +0100 Subject: [PATCH 02/10] Add contact photo --- htdocs/contact/perso.php | 74 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git a/htdocs/contact/perso.php b/htdocs/contact/perso.php index 8bebb6f0cfb..89b8be57e35 100644 --- a/htdocs/contact/perso.php +++ b/htdocs/contact/perso.php @@ -50,11 +50,71 @@ if ($action == 'update' && ! $_POST["cancel"] && $user->rights->societe->contact $object->birthday = dol_mktime(0,0,0,$_POST["birthdaymonth"],$_POST["birthdayday"],$_POST["birthdayyear"]); $object->birthday_alert = $_POST["birthday_alert"]; + if (GETPOST('deletephoto')) $object->photo=''; + elseif (! empty($_FILES['photo']['name'])) $object->photo = dol_sanitizeFileName($_FILES['photo']['name']); + $result = $object->update_perso($id, $user); if ($result > 0) { $object->old_name=''; $object->old_firstname=''; + // Logo/Photo save + $dir= $conf->societe->dir_output.'/contact/' . get_exdir($object->id,2,0,1,$object,'contact').'/photos'; + + $file_OK = is_uploaded_file($_FILES['photo']['tmp_name']); + if ($file_OK) + { + require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; + if (GETPOST('deletephoto')) + { + require_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php'; + $fileimg=$conf->societe->dir_output.'/contact/'.get_exdir($object->id,2,0,1,$object,'contact').'/photos/'.$object->photo; + $dirthumbs=$conf->societe->dir_output.'/contact/'.get_exdir($object->id,2,0,1,$object,'contact').'/photos/thumbs'; + dol_delete_file($fileimg); + dol_delete_dir_recursive($dirthumbs); + } + + if (image_format_supported($_FILES['photo']['name']) > 0) + { + dol_mkdir($dir); + + if (@is_dir($dir)) + { + $newfile=$dir.'/'.dol_sanitizeFileName($_FILES['photo']['name']); + if (! dol_move_uploaded_file($_FILES['photo']['tmp_name'],$newfile,1,0,$_FILES['photo']['error']) > 0) + { + setEventMessages($langs->trans("ErrorFailedToSaveFile"), null, 'errors'); + } + else + { + // Create small thumbs for company (Ratio is near 16/9) + // Used on logon for example + $imgThumbSmall = vignette($newfile, $maxwidthsmall, $maxheightsmall, '_small', $quality); + + // Create mini thumbs for company (Ratio is near 16/9) + // Used on menu or for setup page for example + $imgThumbMini = vignette($newfile, $maxwidthmini, $maxheightmini, '_mini', $quality); + } + } + } + else + { + setEventMessages("ErrorBadImageFormat", null, 'errors'); + } + } + else + { + switch($_FILES['photo']['error']) + { + case 1: //uploaded file exceeds the upload_max_filesize directive in php.ini + case 2: //uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the html form + $errors[] = "ErrorFileSizeTooLarge"; + break; + case 3: //uploaded file was only partially uploaded + $errors[] = "ErrorFilePartiallyUploaded"; + break; + } + } } else { @@ -98,6 +158,20 @@ if ($action == 'edit') // Ref print ''.$langs->trans("Ref").''; print $object->id; + print ''; + + // Photo + print ''; + print $form->showphoto('contact',$object)."\n"; + if ($object->photo) print "
\n"; + + print ''; + + if ($object->photo) print ''; + print ''; + print ''; + print '
'.$langs->trans("Delete").'

'.$langs->trans("PhotoFile").'
'; + print ''; // Name From 85d51b0d6fb82a59b07faff86a9f70a36921799a Mon Sep 17 00:00:00 2001 From: aspangaro Date: Mon, 28 Mar 2016 07:46:55 +0200 Subject: [PATCH 03/10] Correct of problem of merging with my last commits --- htdocs/admin/dict.php | 2 +- .../install/mysql/migration/3.9.0-4.0.0.sql | 14 ++++++++++ .../tables/llx_c_accountancy_category.key.sql | 21 ++++++++++++++ .../tables/llx_c_accountancy_category.sql | 28 +++++++++++++++++++ 4 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 htdocs/install/mysql/tables/llx_c_accountancy_category.key.sql create mode 100644 htdocs/install/mysql/tables/llx_c_accountancy_category.sql diff --git a/htdocs/admin/dict.php b/htdocs/admin/dict.php index e1fe67518bc..01b379abf0d 100644 --- a/htdocs/admin/dict.php +++ b/htdocs/admin/dict.php @@ -80,7 +80,7 @@ $hookmanager->initHooks(array('admin')); // Put here declaration of dictionaries properties // Sort order to show dictionary (0 is space). All other dictionaries (added by modules) will be at end of this. -$taborder=array(9,0,4,3,2,0,1,8,19,16,27,0,5,11,33,34,0,6,0,29,0,7,17,24,28,0,10,23,12,13,0,14,0,22,20,18,21,0,15,30,0,25,0,26,0,31,0); +$taborder=array(9,0,4,3,2,0,1,8,19,16,27,0,5,11,33,34,0,6,0,29,0,7,17,24,28,0,10,23,12,13,0,14,0,22,20,18,21,0,15,30,0,25,0,26,0,31,32,0); // Name of SQL tables of dictionaries $tabname=array(); diff --git a/htdocs/install/mysql/migration/3.9.0-4.0.0.sql b/htdocs/install/mysql/migration/3.9.0-4.0.0.sql index f20f784ac0d..3fa7d67c7ec 100644 --- a/htdocs/install/mysql/migration/3.9.0-4.0.0.sql +++ b/htdocs/install/mysql/migration/3.9.0-4.0.0.sql @@ -323,3 +323,17 @@ ALTER TABLE llx_expensereport_det ADD COLUMN multicurrency_total_ttc double(24,8 ALTER TABLE llx_product_lang ADD COLUMN import_key varchar(14) DEFAULT NULL; ALTER TABLE llx_actioncomm MODIFY COLUMN elementtype varchar(255) DEFAULT NULL; + +DELETE FROM llx_menu where module='expensereport'; + +CREATE TABLE llx_c_accountancy_category ( + rowid integer NOT NULL AUTO_INCREMENT PRIMARY KEY, + code varchar(16) NOT NULL, + label varchar(255) NOT NULL, + range varchar(255) NOT NULL, + position integer DEFAULT 0, + fk_country integer DEFAULT NULL, -- This category is dedicated to a country + active integer DEFAULT 1 +) ENGINE=innodb; + +ALTER TABLE llx_c_accountancy_category ADD UNIQUE INDEX uk_c_accountancy_category(code); \ No newline at end of file diff --git a/htdocs/install/mysql/tables/llx_c_accountancy_category.key.sql b/htdocs/install/mysql/tables/llx_c_accountancy_category.key.sql new file mode 100644 index 00000000000..c4adc3a37da --- /dev/null +++ b/htdocs/install/mysql/tables/llx_c_accountancy_category.key.sql @@ -0,0 +1,21 @@ +-- =================================================================== +-- Copyright (C) 2015-2016 Alexandre Spangaro +-- +-- This program is free software; you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation; either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- Table with templates of emails +-- =================================================================== + +ALTER TABLE llx_c_accountancy_category ADD UNIQUE INDEX uk_c_accountancy_category(code); + diff --git a/htdocs/install/mysql/tables/llx_c_accountancy_category.sql b/htdocs/install/mysql/tables/llx_c_accountancy_category.sql new file mode 100644 index 00000000000..60b74c77291 --- /dev/null +++ b/htdocs/install/mysql/tables/llx_c_accountancy_category.sql @@ -0,0 +1,28 @@ +-- =================================================================== +-- Copyright (C) 2015-2016 Alexandre Spangaro +-- +-- This program is free software; you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation; either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- Table with templates of emails +-- =================================================================== + +CREATE TABLE llx_c_accountancy_category ( + rowid integer NOT NULL AUTO_INCREMENT PRIMARY KEY, + code varchar(16) NOT NULL, + label varchar(255) NOT NULL, + range varchar(255) NOT NULL, + position integer DEFAULT 0, + fk_country integer DEFAULT NULL, -- This category is dedicated to a country + active integer DEFAULT 1 +) ENGINE=innodb; From 8acf39cbb1061de537505820c0fcdae6789dd0ec Mon Sep 17 00:00:00 2001 From: aspangaro Date: Mon, 28 Mar 2016 13:58:14 +0200 Subject: [PATCH 04/10] Uniformize name of table --- htdocs/install/mysql/migration/3.9.0-4.0.0.sql | 4 ++-- ...ncy_category.key.sql => llx_c_accounting_category.key.sql} | 4 ++-- ...accountancy_category.sql => llx_c_accounting_category.sql} | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) rename htdocs/install/mysql/tables/{llx_c_accountancy_category.key.sql => llx_c_accounting_category.key.sql} (86%) rename htdocs/install/mysql/tables/{llx_c_accountancy_category.sql => llx_c_accounting_category.sql} (93%) diff --git a/htdocs/install/mysql/migration/3.9.0-4.0.0.sql b/htdocs/install/mysql/migration/3.9.0-4.0.0.sql index 3fa7d67c7ec..ab71e70e863 100644 --- a/htdocs/install/mysql/migration/3.9.0-4.0.0.sql +++ b/htdocs/install/mysql/migration/3.9.0-4.0.0.sql @@ -326,7 +326,7 @@ ALTER TABLE llx_actioncomm MODIFY COLUMN elementtype varchar(255) DEFAULT NULL; DELETE FROM llx_menu where module='expensereport'; -CREATE TABLE llx_c_accountancy_category ( +CREATE TABLE llx_c_accounting_category ( rowid integer NOT NULL AUTO_INCREMENT PRIMARY KEY, code varchar(16) NOT NULL, label varchar(255) NOT NULL, @@ -336,4 +336,4 @@ CREATE TABLE llx_c_accountancy_category ( active integer DEFAULT 1 ) ENGINE=innodb; -ALTER TABLE llx_c_accountancy_category ADD UNIQUE INDEX uk_c_accountancy_category(code); \ No newline at end of file +ALTER TABLE llx_c_accounting_category ADD UNIQUE INDEX uk_c_accounting_category(code); \ No newline at end of file diff --git a/htdocs/install/mysql/tables/llx_c_accountancy_category.key.sql b/htdocs/install/mysql/tables/llx_c_accounting_category.key.sql similarity index 86% rename from htdocs/install/mysql/tables/llx_c_accountancy_category.key.sql rename to htdocs/install/mysql/tables/llx_c_accounting_category.key.sql index c4adc3a37da..6b2d520a156 100644 --- a/htdocs/install/mysql/tables/llx_c_accountancy_category.key.sql +++ b/htdocs/install/mysql/tables/llx_c_accounting_category.key.sql @@ -14,8 +14,8 @@ -- You should have received a copy of the GNU General Public License -- along with this program. If not, see . -- --- Table with templates of emails +-- Table with category for accounting account -- =================================================================== -ALTER TABLE llx_c_accountancy_category ADD UNIQUE INDEX uk_c_accountancy_category(code); +ALTER TABLE llx_c_accounting_category ADD UNIQUE INDEX uk_c_accounting_category(code); diff --git a/htdocs/install/mysql/tables/llx_c_accountancy_category.sql b/htdocs/install/mysql/tables/llx_c_accounting_category.sql similarity index 93% rename from htdocs/install/mysql/tables/llx_c_accountancy_category.sql rename to htdocs/install/mysql/tables/llx_c_accounting_category.sql index 60b74c77291..0e789a6826c 100644 --- a/htdocs/install/mysql/tables/llx_c_accountancy_category.sql +++ b/htdocs/install/mysql/tables/llx_c_accounting_category.sql @@ -14,10 +14,10 @@ -- You should have received a copy of the GNU General Public License -- along with this program. If not, see . -- --- Table with templates of emails +-- Table with category for accounting account -- =================================================================== -CREATE TABLE llx_c_accountancy_category ( +CREATE TABLE llx_c_accounting_category ( rowid integer NOT NULL AUTO_INCREMENT PRIMARY KEY, code varchar(16) NOT NULL, label varchar(255) NOT NULL, From 6188c3fced0a4834c1545e1bdb7330b486fb86ef Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 29 Mar 2016 14:52:27 +0200 Subject: [PATCH 05/10] NEW Introduce a predefined job to run database backup --- htdocs/admin/tools/export.php | 234 ++------------- htdocs/core/class/utils.class.php | 275 ++++++++++++++++++ htdocs/core/modules/DolibarrModules.class.php | 2 +- htdocs/core/modules/modCron.class.php | 4 +- htdocs/langs/en_US/errors.lang | 2 +- 5 files changed, 300 insertions(+), 217 deletions(-) diff --git a/htdocs/admin/tools/export.php b/htdocs/admin/tools/export.php index 224ca245734..b827fe88737 100644 --- a/htdocs/admin/tools/export.php +++ b/htdocs/admin/tools/export.php @@ -25,6 +25,7 @@ require '../../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/class/utils.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php'; $langs->load("admin"); @@ -111,175 +112,34 @@ $outputdir = $conf->admin->dir_output.'/backup'; $result=dol_mkdir($outputdir); +$utils = new Utils($db); + + // MYSQL if ($what == 'mysql') { + $cmddump=GETPOST("mysqldump"); // Do not sanitize here with 'alpha', will be sanitize later by escapeshellarg if ($cmddump) { dolibarr_set_const($db, 'SYSTEMTOOLS_MYSQLDUMP', $cmddump,'chaine',0,'',$conf->entity); } - $outputfile = $outputdir.'/'.$file; - // for compression format, we add extension - $compression=GETPOST('compression') ? GETPOST('compression','alpha') : 'none'; - if ($compression == 'gz') $outputfile.='.gz'; - if ($compression == 'bz') $outputfile.='.bz2'; - $outputerror = $outputfile.'.err'; - dol_mkdir($conf->admin->dir_output.'/backup'); - - // Parameteres execution - $command=$cmddump; - if (preg_match("/\s/",$command)) $command=escapeshellarg($command); // Use quotes on command - - //$param=escapeshellarg($dolibarr_main_db_name)." -h ".escapeshellarg($dolibarr_main_db_host)." -u ".escapeshellarg($dolibarr_main_db_user)." -p".escapeshellarg($dolibarr_main_db_pass); - $param=$dolibarr_main_db_name." -h ".$dolibarr_main_db_host; - $param.=" -u ".$dolibarr_main_db_user; - if (! empty($dolibarr_main_db_port)) $param.=" -P ".$dolibarr_main_db_port; - if (! GETPOST("use_transaction")) $param.=" -l --single-transaction"; - if (GETPOST("disable_fk")) $param.=" -K"; - if (GETPOST("sql_compat") && GETPOST("sql_compat") != 'NONE') $param.=" --compatible=".escapeshellarg(GETPOST("sql_compat","alpha")); - if (GETPOST("drop_database")) $param.=" --add-drop-database"; - if (GETPOST("sql_structure")) - { - if (GETPOST("drop")) $param.=" --add-drop-table=TRUE"; - else $param.=" --add-drop-table=FALSE"; - } - else - { - $param.=" -t"; - } - if (GETPOST("disable-add-locks")) $param.=" --add-locks=FALSE"; - if (GETPOST("sql_data")) - { - $param.=" --tables"; - if (GETPOST("showcolumns")) $param.=" -c"; - if (GETPOST("extended_ins")) $param.=" -e"; - else $param.=" --skip-extended-insert"; - if (GETPOST("delayed")) $param.=" --delayed-insert"; - if (GETPOST("sql_ignore")) $param.=" --insert-ignore"; - if (GETPOST("hexforbinary")) $param.=" --hex-blob"; - } - else - { - $param.=" -d"; // No row information (no data) - } - $param.=" --default-character-set=utf8"; // We always save output into utf8 charset - $paramcrypted=$param; - $paramclear=$param; - if (! empty($dolibarr_main_db_pass)) - { - $paramcrypted.=' -p"'.preg_replace('/./i','*',$dolibarr_main_db_pass).'"'; - $paramclear.=' -p"'.str_replace(array('"','`'),array('\"','\`'),$dolibarr_main_db_pass).'"'; - } - - $_SESSION["commandbackuplastdone"]=$command." ".$paramcrypted; - $_SESSION["commandbackuptorun"]=""; - /* - print ''.$langs->trans("RunCommandSummary").':
'."\n"; - print '
'."\n"; - print '
'; - - //print $paramclear; - - // Now run command and show result - print ''.$langs->trans("BackupResult").': '; - */ - - $errormsg=''; - - // Debut appel methode execution - $fullcommandcrypted=$command." ".$paramcrypted." 2>&1"; - $fullcommandclear=$command." ".$paramclear." 2>&1"; - if ($compression == 'none') $handle = fopen($outputfile, 'w'); - if ($compression == 'gz') $handle = gzopen($outputfile, 'w'); - if ($compression == 'bz') $handle = bzopen($outputfile, 'w'); - - if ($handle) - { - $ok=0; - dol_syslog("Run command ".$fullcommandcrypted); - $handlein = popen($fullcommandclear, 'r'); - $i=0; - while (!feof($handlein)) - { - $i++; // output line number - $read = fgets($handlein); - if ($i == 1 && preg_match('/'.preg_quote('Warning: Using a password').'/i', $read)) continue; - fwrite($handle,$read); - if (preg_match('/'.preg_quote('-- Dump completed').'/i',$read)) $ok=1; - elseif (preg_match('/'.preg_quote('SET SQL_NOTES=@OLD_SQL_NOTES').'/i',$read)) $ok=1; - } - pclose($handlein); - - if ($compression == 'none') fclose($handle); - if ($compression == 'gz') gzclose($handle); - if ($compression == 'bz') bzclose($handle); - - if (! empty($conf->global->MAIN_UMASK)) - @chmod($outputfile, octdec($conf->global->MAIN_UMASK)); - } - else - { - $langs->load("errors"); - dol_syslog("Failed to open file ".$outputfile,LOG_ERR); - $errormsg=$langs->trans("ErrorFailedToWriteInDir"); - } - - // Get errorstring - if ($compression == 'none') $handle = fopen($outputfile, 'r'); - if ($compression == 'gz') $handle = gzopen($outputfile, 'r'); - if ($compression == 'bz') $handle = bzopen($outputfile, 'r'); - if ($handle) - { - // Get 2048 first chars of error message. - $errormsg = fgets($handle,2048); - // Close file - if ($compression == 'none') fclose($handle); - if ($compression == 'gz') gzclose($handle); - if ($compression == 'bz') bzclose($handle); - if ($ok && preg_match('/^-- MySql/i',$errormsg)) $errormsg=''; // Pas erreur - else - { - // Renommer fichier sortie en fichier erreur - //print "$outputfile -> $outputerror"; - @dol_delete_file($outputerror,1); - @rename($outputfile,$outputerror); - // Si safe_mode on et command hors du parametre exec, on a un fichier out vide donc errormsg vide - if (! $errormsg) - { - $langs->load("errors"); - $errormsg=$langs->trans("ErrorFailedToRunExternalCommand"); - } - } - } - // Fin execution commande + $utils->dumpDatabase(GETPOST('compression','alpha'), $what, 0, $file); + + $errormsg=$utils->error; + $_SESSION["commandbackuplastdone"]=$utils->result['commandbackuplastdone']; + $_SESSION["commandbackuptorun"]=$utils->result['commandbackuptorun']; } +// MYSQL NO BIN if ($what == 'mysqlnobin') { - $outputfile = $outputdir.'/'.$file; - $outputfiletemp = $outputfile.'-TMP.sql'; - // for compression format, we add extension - $compression=GETPOST('compression') ? GETPOST('compression','alpha') : 'none'; - if ($compression == 'gz') $outputfile.='.gz'; - if ($compression == 'bz') $outputfile.='.bz2'; - $outputerror = $outputfile.'.err'; - dol_mkdir($conf->admin->dir_output.'/backup'); + $utils->dumpDatabase(GETPOST('compression','alpha'), $what, 0, $file); - if ($compression == 'gz' or $compression == 'bz') - { - backup_tables($outputfiletemp); - dol_compress_file($outputfiletemp, $outputfile, $compression); - unlink($outputfiletemp); - } - else - { - backup_tables($outputfile); - } - - $_SESSION["commandbackuplastdone"]=""; - $_SESSION["commandbackuptorun"]=""; + $errormsg=$utils->error; + $_SESSION["commandbackuplastdone"]=$utils->result['commandbackuplastdone']; + $_SESSION["commandbackuptorun"]=$utils->result['commandbackuptorun']; } // POSTGRESQL @@ -291,65 +151,13 @@ if ($what == 'postgresql') dolibarr_set_const($db, 'SYSTEMTOOLS_POSTGRESQLDUMP', $cmddump,'chaine',0,'',$conf->entity); } - $outputfile = $outputdir.'/'.$file; - // for compression format, we add extension - $compression=GETPOST('compression') ? GETPOST('compression','alpha') : 'none'; - if ($compression == 'gz') $outputfile.='.gz'; - if ($compression == 'bz') $outputfile.='.bz2'; - $outputerror = $outputfile.'.err'; - dol_mkdir($conf->admin->dir_output.'/backup'); + $utils->dumpDatabase(GETPOST('compression','alpha'), $what, 0, $file); + + $errormsg=$utils->error; + $_SESSION["commandbackuplastdone"]=$utils->result['commandbackuplastdone']; + $_SESSION["commandbackuptorun"]=$utils->result['commandbackuptorun']; - // Parameteres execution - $command=$cmddump; - if (preg_match("/\s/",$command)) $command=escapeshellarg($command); // Use quotes on command - - //$param=escapeshellarg($dolibarr_main_db_name)." -h ".escapeshellarg($dolibarr_main_db_host)." -u ".escapeshellarg($dolibarr_main_db_user)." -p".escapeshellarg($dolibarr_main_db_pass); - //$param="-F c"; - $param="-F p"; - $param.=" --no-tablespaces --inserts -h ".$dolibarr_main_db_host; - $param.=" -U ".$dolibarr_main_db_user; - if (! empty($dolibarr_main_db_port)) $param.=" -p ".$dolibarr_main_db_port; - if (GETPOST("sql_compat") && GETPOST("sql_compat") == 'ANSI') $param.=" --disable-dollar-quoting"; - if (GETPOST("drop_database")) $param.=" -c -C"; - if (GETPOST("sql_structure")) - { - if (GETPOST("drop")) $param.=" --add-drop-table"; - if (! GETPOST("sql_data")) $param.=" -s"; - } - if (GETPOST("sql_data")) - { - if (! GETPOST("sql_structure")) $param.=" -a"; - if (GETPOST("showcolumns")) $param.=" -c"; - } - $param.=' -f "'.$outputfile.'"'; - //if ($compression == 'none') - if ($compression == 'gz') $param.=' -Z 9'; - //if ($compression == 'bz') - $paramcrypted=$param; - $paramclear=$param; - /*if (! empty($dolibarr_main_db_pass)) - { - $paramcrypted.=" -W".preg_replace('/./i','*',$dolibarr_main_db_pass); - $paramclear.=" -W".$dolibarr_main_db_pass; - }*/ - $paramcrypted.=" -w ".$dolibarr_main_db_name; - $paramclear.=" -w ".$dolibarr_main_db_name; - - $_SESSION["commandbackuplastdone"]=""; - $_SESSION["commandbackuptorun"]=$command." ".$paramcrypted; - /*print $langs->trans("RunCommandSummaryToLaunch").':
'."\n"; - print '
'."\n"; - - print '
'; - - - // Now show to ask to run command - print $langs->trans("YouMustRunCommandFromCommandLineAfterLoginToUser",$dolibarr_main_db_user,$dolibarr_main_db_user); - - print '
'; - print '
';*/ - - $what=''; + $what=''; // Clear to show message to run command } diff --git a/htdocs/core/class/utils.class.php b/htdocs/core/class/utils.class.php index 59cbbecd6b2..dd4096c5257 100644 --- a/htdocs/core/class/utils.class.php +++ b/htdocs/core/class/utils.class.php @@ -29,6 +29,9 @@ class Utils { var $db; + var $output; // Used by Cron method to return message + var $result; // Used by Cron method to return data + /** * Constructor * @@ -42,6 +45,7 @@ class Utils /** * Purge files into directory of data files. + * CAN BE A CRON TASK * * @param string $choice Choice of purge mode ('tempfiles', 'tempfilesold' to purge temp older than 24h, 'allfiles', 'logfiles') * @return int 0 if OK, < 0 if KO (this function is used also by cron so only 0 is OK) @@ -132,4 +136,275 @@ class Utils //return $count; return 0; // This function can be called by cron so must return 0 if OK } + + + /** + * Make a backup of database + * CAN BE A CRON TASK + * + * @param string $compression 'gz' or 'bz' or 'none' + * @param string $type 'mysql', 'postgresql', ... + * @param int $usedefault 1=Use default backup profile (Set this to 1 when used as cron) + * @param string $file 'auto' or filename to build + * @return int 0 if OK, < 0 if KO (this function is used also by cron so only 0 is OK) + */ + function dumpDatabase($compression='none', $type='auto', $usedefault=1, $file='auto') + { + global $db, $conf, $langs, $dolibarr_main_data_root; + global $dolibarr_main_db_name, $dolibarr_main_db_host, $dolibarr_main_db_user, $dolibarr_main_db_port, $dolibarr_main_db_pass; + + $langs->load("admin"); + + dol_syslog("Utils::dumpDatabase type=".$type." compression=".$compression." file=".$file, LOG_DEBUG); + require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; + + // Check compression parameter + if (! in_array($compression, array('none', 'gz', 'bz', 'zip'))) + { + $langs->load("errors"); + $this->error=$langs->transnoentitiesnoconv("ErrorBadValueForParameter", $compression, "Compression"); + return -1; + } + + // Check type parameter + if ($type == 'auto') $type = $db->type; + if (! in_array($type, array('pgsql', 'mysql', 'mysqli'))) + { + $langs->load("errors"); + $this->error=$langs->transnoentitiesnoconv("ErrorBadValueForParameter", $type, "Basetype"); + return -1; + } + + // Check file parameter + if ($file == 'auto') + { + $prefix='dump'; + $ext='.sql'; + if (in_array($type, array('mysql', 'mysqli'))) { $prefix='mysqldump'; $ext='sql'; } + //if ($label == 'PostgreSQL') { $prefix='pg_dump'; $ext='dump'; } + if (in_array($type, array('pgsql'))) { $prefix='pg_dump'; $ext='sql'; } + $file=$prefix.'_'.$dolibarr_main_db_name.'_'.dol_sanitizeFileName(DOL_VERSION).'_'.strftime("%Y%m%d%H%M").'.'.$ext; + } + + $outputdir = $conf->admin->dir_output.'/backup'; + $result=dol_mkdir($outputdir); + + + // MYSQL + if ($type == 'mysql' || $type == 'mysqli') + { + $cmddump=$conf->global->SYSTEMTOOLS_MYSQLDUMP; + + + $outputfile = $outputdir.'/'.$file; + // for compression format, we add extension + $compression=$compression ? $compression : 'none'; + if ($compression == 'gz') $outputfile.='.gz'; + if ($compression == 'bz') $outputfile.='.bz2'; + $outputerror = $outputfile.'.err'; + dol_mkdir($conf->admin->dir_output.'/backup'); + + // Parameteres execution + $command=$cmddump; + if (preg_match("/\s/",$command)) $command=escapeshellarg($command); // Use quotes on command + + //$param=escapeshellarg($dolibarr_main_db_name)." -h ".escapeshellarg($dolibarr_main_db_host)." -u ".escapeshellarg($dolibarr_main_db_user)." -p".escapeshellarg($dolibarr_main_db_pass); + $param=$dolibarr_main_db_name." -h ".$dolibarr_main_db_host; + $param.=" -u ".$dolibarr_main_db_user; + if (! empty($dolibarr_main_db_port)) $param.=" -P ".$dolibarr_main_db_port; + if (! GETPOST("use_transaction")) $param.=" -l --single-transaction"; + if (GETPOST("disable_fk") || $usedefault) $param.=" -K"; + if (GETPOST("sql_compat") && GETPOST("sql_compat") != 'NONE') $param.=" --compatible=".escapeshellarg(GETPOST("sql_compat","alpha")); + if (GETPOST("drop_database")) $param.=" --add-drop-database"; + if (GETPOST("sql_structure") || $usedefault) + { + if (GETPOST("drop") || $usedefault) $param.=" --add-drop-table=TRUE"; + else $param.=" --add-drop-table=FALSE"; + } + else + { + $param.=" -t"; + } + if (GETPOST("disable-add-locks")) $param.=" --add-locks=FALSE"; + if (GETPOST("sql_data") || $usedefault) + { + $param.=" --tables"; + if (GETPOST("showcolumns") || $usedefault) $param.=" -c"; + if (GETPOST("extended_ins") || $usedefault) $param.=" -e"; + else $param.=" --skip-extended-insert"; + if (GETPOST("delayed")) $param.=" --delayed-insert"; + if (GETPOST("sql_ignore")) $param.=" --insert-ignore"; + if (GETPOST("hexforbinary") || $usedefault) $param.=" --hex-blob"; + } + else + { + $param.=" -d"; // No row information (no data) + } + $param.=" --default-character-set=utf8"; // We always save output into utf8 charset + $paramcrypted=$param; + $paramclear=$param; + if (! empty($dolibarr_main_db_pass)) + { + $paramcrypted.=' -p"'.preg_replace('/./i','*',$dolibarr_main_db_pass).'"'; + $paramclear.=' -p"'.str_replace(array('"','`'),array('\"','\`'),$dolibarr_main_db_pass).'"'; + } + + $errormsg=''; + + // Debut appel methode execution + $fullcommandcrypted=$command." ".$paramcrypted." 2>&1"; + $fullcommandclear=$command." ".$paramclear." 2>&1"; + if ($compression == 'none') $handle = fopen($outputfile, 'w'); + if ($compression == 'gz') $handle = gzopen($outputfile, 'w'); + if ($compression == 'bz') $handle = bzopen($outputfile, 'w'); + + if ($handle) + { + $ok=0; + dol_syslog("Run command ".$fullcommandcrypted); + $handlein = popen($fullcommandclear, 'r'); + $i=0; + while (!feof($handlein)) + { + $i++; // output line number + $read = fgets($handlein); + if ($i == 1 && preg_match('/'.preg_quote('Warning: Using a password').'/i', $read)) continue; + fwrite($handle,$read); + if (preg_match('/'.preg_quote('-- Dump completed').'/i',$read)) $ok=1; + elseif (preg_match('/'.preg_quote('SET SQL_NOTES=@OLD_SQL_NOTES').'/i',$read)) $ok=1; + } + pclose($handlein); + + if ($compression == 'none') fclose($handle); + if ($compression == 'gz') gzclose($handle); + if ($compression == 'bz') bzclose($handle); + + if (! empty($conf->global->MAIN_UMASK)) + @chmod($outputfile, octdec($conf->global->MAIN_UMASK)); + } + else + { + $langs->load("errors"); + dol_syslog("Failed to open file ".$outputfile,LOG_ERR); + $errormsg=$langs->trans("ErrorFailedToWriteInDir"); + } + + // Get errorstring + if ($compression == 'none') $handle = fopen($outputfile, 'r'); + if ($compression == 'gz') $handle = gzopen($outputfile, 'r'); + if ($compression == 'bz') $handle = bzopen($outputfile, 'r'); + if ($handle) + { + // Get 2048 first chars of error message. + $errormsg = fgets($handle,2048); + // Close file + if ($compression == 'none') fclose($handle); + if ($compression == 'gz') gzclose($handle); + if ($compression == 'bz') bzclose($handle); + if ($ok && preg_match('/^-- MySql/i',$errormsg)) $errormsg=''; // Pas erreur + else + { + // Renommer fichier sortie en fichier erreur + //print "$outputfile -> $outputerror"; + @dol_delete_file($outputerror,1); + @rename($outputfile,$outputerror); + // Si safe_mode on et command hors du parametre exec, on a un fichier out vide donc errormsg vide + if (! $errormsg) + { + $langs->load("errors"); + $errormsg=$langs->trans("ErrorFailedToRunExternalCommand"); + } + } + } + // Fin execution commande + + $this->output = $errormsg; + $this->error = $errormsg; + $this->result = array("commandbackuplastdone" => $command." ".$paramcrypted, "commandbackuptorun" => ""); + //if (empty($this->output)) $this->output=$this->result['commandbackuplastdone']; + } + + // MYSQL NO BIN + if ($type == 'mysqlnobin') + { + $outputfile = $outputdir.'/'.$file; + $outputfiletemp = $outputfile.'-TMP.sql'; + // for compression format, we add extension + $compression=$compression ? $compression : 'none'; + if ($compression == 'gz') $outputfile.='.gz'; + if ($compression == 'bz') $outputfile.='.bz2'; + $outputerror = $outputfile.'.err'; + dol_mkdir($conf->admin->dir_output.'/backup'); + + if ($compression == 'gz' or $compression == 'bz') + { + backup_tables($outputfiletemp); + dol_compress_file($outputfiletemp, $outputfile, $compression); + unlink($outputfiletemp); + } + else + { + backup_tables($outputfile); + } + + $this->output = ""; + $this->result = array("commandbackuplastdone" => "", "commandbackuptorun" => ""); + } + + // POSTGRESQL + if ($type == 'postgresql') + { + $cmddump=$conf->global->SYSTEMTOOLS_POSTGRESQLDUMP; + + $outputfile = $outputdir.'/'.$file; + // for compression format, we add extension + $compression=$compression ? $compression : 'none'; + if ($compression == 'gz') $outputfile.='.gz'; + if ($compression == 'bz') $outputfile.='.bz2'; + $outputerror = $outputfile.'.err'; + dol_mkdir($conf->admin->dir_output.'/backup'); + + // Parameteres execution + $command=$cmddump; + if (preg_match("/\s/",$command)) $command=escapeshellarg($command); // Use quotes on command + + //$param=escapeshellarg($dolibarr_main_db_name)." -h ".escapeshellarg($dolibarr_main_db_host)." -u ".escapeshellarg($dolibarr_main_db_user)." -p".escapeshellarg($dolibarr_main_db_pass); + //$param="-F c"; + $param="-F p"; + $param.=" --no-tablespaces --inserts -h ".$dolibarr_main_db_host; + $param.=" -U ".$dolibarr_main_db_user; + if (! empty($dolibarr_main_db_port)) $param.=" -p ".$dolibarr_main_db_port; + if (GETPOST("sql_compat") && GETPOST("sql_compat") == 'ANSI') $param.=" --disable-dollar-quoting"; + if (GETPOST("drop_database")) $param.=" -c -C"; + if (GETPOST("sql_structure")) + { + if (GETPOST("drop")) $param.=" --add-drop-table"; + if (! GETPOST("sql_data")) $param.=" -s"; + } + if (GETPOST("sql_data")) + { + if (! GETPOST("sql_structure")) $param.=" -a"; + if (GETPOST("showcolumns")) $param.=" -c"; + } + $param.=' -f "'.$outputfile.'"'; + //if ($compression == 'none') + if ($compression == 'gz') $param.=' -Z 9'; + //if ($compression == 'bz') + $paramcrypted=$param; + $paramclear=$param; + /*if (! empty($dolibarr_main_db_pass)) + { + $paramcrypted.=" -W".preg_replace('/./i','*',$dolibarr_main_db_pass); + $paramclear.=" -W".$dolibarr_main_db_pass; + }*/ + $paramcrypted.=" -w ".$dolibarr_main_db_name; + $paramclear.=" -w ".$dolibarr_main_db_name; + + $this->output = ""; + $this->result = array("commandbackuplastdone" => "", "commandbackuptorun" => $command." ".$paramcrypted); + } + + + return 0; + } } diff --git a/htdocs/core/modules/DolibarrModules.class.php b/htdocs/core/modules/DolibarrModules.class.php index 8ac2f573f55..fc9f503ca83 100644 --- a/htdocs/core/modules/DolibarrModules.class.php +++ b/htdocs/core/modules/DolibarrModules.class.php @@ -982,7 +982,7 @@ class DolibarrModules // Can not be abstract, because we need to insta $unitfrequency = isset($this->cronjobs[$key]['unitfrequency'])?$this->cronjobs[$key]['unitfrequency']:''; $status = isset($this->cronjobs[$key]['status'])?$this->cronjobs[$key]['status']:''; $priority = isset($this->cronjobs[$key]['priority'])?$this->cronjobs[$key]['priority']:''; - $test = isset($this->cronjobs[$key]['test'])?$this->cronjobs[$key]['test']:''; + $test = isset($this->cronjobs[$key]['test'])?$this->cronjobs[$key]['test']:''; // Line must be visible // Search if boxes def already present $sql = "SELECT count(*) as nb FROM ".MAIN_DB_PREFIX."cronjob"; diff --git a/htdocs/core/modules/modCron.class.php b/htdocs/core/modules/modCron.class.php index 10f2fa69948..89a90dfc8bd 100644 --- a/htdocs/core/modules/modCron.class.php +++ b/htdocs/core/modules/modCron.class.php @@ -101,8 +101,8 @@ class modCron extends DolibarrModules // Cronjobs $this->cronjobs = array( - 0=>array('label'=>'PurgeDeleteTemporaryFilesShort', 'jobtype'=>'method', 'class'=>'core/class/utils.class.php', 'objectname'=>'Utils', 'method'=>'purgeFiles', 'parameters'=>'', 'comment'=>'PurgeDeleteTemporaryFiles', 'frequency'=>1, 'unitfrequency'=>3600 * 24 * 7, 'priority'=>10, 'status'=>1, 'test'=>'1'), - 1=>array('label'=>'MakeLocalDatabaseDumpShort', 'jobtype'=>'method', 'class'=>'core/class/utils.class.php', 'objectname'=>'Utils', 'method'=>'dumpDatabase', 'parameters'=>'', 'comment'=>'MakeLocalDatabaseDump', 'frequency'=>1, 'unitfrequency'=>3600 * 24 * 7, 'priority'=>20, 'status'=>0, 'test'=>'0'), + 0=>array('label'=>'PurgeDeleteTemporaryFilesShort', 'jobtype'=>'method', 'class'=>'core/class/utils.class.php', 'objectname'=>'Utils', 'method'=>'purgeFiles', 'parameters'=>'', 'comment'=>'PurgeDeleteTemporaryFiles', 'frequency'=>1, 'unitfrequency'=>3600 * 24 * 7, 'priority'=>10, 'status'=>1, 'test'=>true), + 1=>array('label'=>'MakeLocalDatabaseDumpShort', 'jobtype'=>'method', 'class'=>'core/class/utils.class.php', 'objectname'=>'Utils', 'method'=>'dumpDatabase', 'parameters'=>'none', 'comment'=>'MakeLocalDatabaseDump', 'frequency'=>1, 'unitfrequency'=>3600 * 24 * 7, 'priority'=>20, 'status'=>0, 'test'=>in_array($db->type, array('mysql','mysqli'))), // 1=>array('label'=>'My label', 'jobtype'=>'command', 'command'=>'', 'parameters'=>'', 'comment'=>'Comment', 'frequency'=>1, 'unitfrequency'=>3600*24) ); diff --git a/htdocs/langs/en_US/errors.lang b/htdocs/langs/en_US/errors.lang index f754c933b39..c69c49c793a 100755 --- a/htdocs/langs/en_US/errors.lang +++ b/htdocs/langs/en_US/errors.lang @@ -34,7 +34,7 @@ ErrorBadSupplierCodeSyntax=Bad syntax for supplier code ErrorSupplierCodeRequired=Supplier code required ErrorSupplierCodeAlreadyUsed=Supplier code already used ErrorBadParameters=Bad parameters -ErrorBadValueForParameter=Wrong value '%s' for parameter incorrect '%s' +ErrorBadValueForParameter=Wrong value '%s' for parameter '%s' ErrorBadImageFormat=Image file has not a supported format (Your PHP does not support functions to convert images of this format) ErrorBadDateFormat=Value '%s' has wrong date format ErrorWrongDate=Date is not correct! From 6b4909f802b176f2ae0bb8389c3347e43b1945d2 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 29 Mar 2016 15:10:53 +0200 Subject: [PATCH 06/10] Lost sort params --- htdocs/cron/card.php | 2 +- htdocs/cron/list.php | 9 +++++---- htdocs/langs/en_US/cron.lang | 4 ++-- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/htdocs/cron/card.php b/htdocs/cron/card.php index 90a5dd0f2ed..13bc2624966 100644 --- a/htdocs/cron/card.php +++ b/htdocs/cron/card.php @@ -704,7 +704,7 @@ else } else if (empty($object->status)) { - print ''.$langs->trans("CronExecute").''; + print ''.$langs->trans("CronExecute").''; } else { print ''.$langs->trans("CronExecute").''; diff --git a/htdocs/cron/list.php b/htdocs/cron/list.php index eb365dbd5b8..b6ad4a8d2aa 100644 --- a/htdocs/cron/list.php +++ b/htdocs/cron/list.php @@ -340,19 +340,20 @@ if ($num > 0) print ''; if ($user->rights->cron->create) { - print "id."&action=edit&backtourl=".urlencode($_SERVER["PHP_SELF"])."\" title=\"".dol_escape_htmltag($langs->trans('Edit'))."\">".img_picto($langs->trans('Edit'),'edit')."  "; + print "id."&action=edit".($sortfield?'&sortfield='.$sortfield:'').($sortorder?'&sortorder='.$sortorder:'').$param."&backtourl=".urlencode($_SERVER["PHP_SELF"])."\" title=\"".dol_escape_htmltag($langs->trans('Edit'))."\">".img_picto($langs->trans('Edit'),'edit')."  "; } if ($user->rights->cron->delete) { - print "id."&status=".$status."&action=delete\" title=\"".dol_escape_htmltag($langs->trans('CronDelete'))."\">".img_picto($langs->trans('CronDelete'),'delete')."  "; + print "id."&action=delete".($sortfield?'&sortfield='.$sortfield:'').($sortorder?'&sortorder='.$sortorder:'').$param."\" title=\"".dol_escape_htmltag($langs->trans('CronDelete'))."\">".img_picto($langs->trans('CronDelete'),'delete')."  "; } else { print "trans('NotEnoughPermissions'))."\">".img_picto($langs->trans('NotEnoughPermissions'), 'delete')."   "; } if ($user->rights->cron->execute) { - print "id."&status=".$status."&action=execute\" title=\"".dol_escape_htmltag($langs->trans('CronExecute'))."\">".img_picto($langs->trans('CronExecute'),"play").""; + if (!empty($line->status)) print "id."&action=execute".($sortfield?'&sortfield='.$sortfield:'').($sortorder?'&sortorder='.$sortorder:'').$param."\" title=\"".dol_escape_htmltag($langs->trans('CronExecute'))."\">".img_picto($langs->trans('CronExecute'),"play").""; + else print "trans('JobDisabled'))."\">".img_picto($langs->trans('JobDisabled'),"play").""; } else { - print "trans('NotEnoughPermissions'))."\">".img_picto($langs->trans('NotEnoughPermissions'),"execute").""; + print "trans('NotEnoughPermissions'))."\">".img_picto($langs->trans('NotEnoughPermissions'),"play").""; } print ''; diff --git a/htdocs/langs/en_US/cron.lang b/htdocs/langs/en_US/cron.lang index e90a2d33ee0..cd118b26550 100644 --- a/htdocs/langs/en_US/cron.lang +++ b/htdocs/langs/en_US/cron.lang @@ -88,7 +88,7 @@ CronType_method=Call method of a Dolibarr Class CronType_command=Shell command CronMenu=Cron CronCannotLoadClass=Cannot load class %s or object %s -UseMenuModuleToolsToAddCronJobs=Go into menu "Home - Modules tools - Job list" to see and edit scheduled jobs. -TaskDisabled=Job disabled +UseMenuModuleToolsToAddCronJobs=Go into menu "Home - Admin tools - Scheduled jobs" to see and edit scheduled jobs. +JobDisabled=Job disabled MakeLocalDatabaseDumpShort=Local database backup MakeLocalDatabaseDump=Create a local database dump From 98c2ba8c617f22b9cb53ff63b3c4306f5f91bc53 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 29 Mar 2016 15:41:46 +0200 Subject: [PATCH 07/10] Normalize code --- htdocs/societe/commerciaux.php | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/htdocs/societe/commerciaux.php b/htdocs/societe/commerciaux.php index b87bad6099d..4bf8616e721 100644 --- a/htdocs/societe/commerciaux.php +++ b/htdocs/societe/commerciaux.php @@ -227,7 +227,7 @@ if (! empty($socid)) $langs->load("users"); $title=$langs->trans("ListOfUsers"); - $sql = "SELECT DISTINCT u.rowid, u.lastname, u.firstname, u.login, u.statut"; + $sql = "SELECT DISTINCT u.rowid, u.lastname, u.firstname, u.login, u.email, u.statut, u.fk_soc"; $sql.= " FROM ".MAIN_DB_PREFIX."user as u"; if (! empty($conf->multicompany->enabled) && ! empty($conf->multicompany->transverse_mode)) { @@ -259,17 +259,21 @@ if (! empty($socid)) print "\n"; $var=True; - + $tmpuser=new User($db); + while ($i < $num) { $obj = $db->fetch_object($resql); $var=!$var; print ""; - print ''; - print img_object($langs->trans("ShowUser"),"user").' '; - print dolGetFirstLastname($obj->firstname, $obj->lastname)."\n"; - print ''; - + $tmpuser->id=$obj->rowid; + $tmpuser->firstname=$obj->firstname; + $tmpuser->lastname=$obj->lastname; + $tmpuser->statut=$obj->statut; + $tmpuser->login=$obj->login; + $tmpuser->email=$obj->email; + $tmpuser->societe_id=$obj->fk_soc; + print $tmpuser->getNomUrl(1); print ''; print ''.$obj->login.''; print ''.User::LibStatut($obj->statut,0).''; From ed0fd32d15399c2980f49cf6d29dd3f6ab3bac42 Mon Sep 17 00:00:00 2001 From: AbdelHakim ALLAL Date: Tue, 29 Mar 2016 15:23:48 +0100 Subject: [PATCH 08/10] Update llx_20_c_departements.sql Correcting ALGERIA Provinces numbers *Missing AL10 *Correcting the rest --- .../mysql/data/llx_20_c_departements.sql | 78 +++++++++---------- 1 file changed, 39 insertions(+), 39 deletions(-) diff --git a/htdocs/install/mysql/data/llx_20_c_departements.sql b/htdocs/install/mysql/data/llx_20_c_departements.sql index 3b68310ed23..029ed4299c3 100644 --- a/htdocs/install/mysql/data/llx_20_c_departements.sql +++ b/htdocs/install/mysql/data/llx_20_c_departements.sql @@ -285,45 +285,45 @@ INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, nc INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL07', 1301, '', 0, '', 'Wilaya de Biskra', 1); INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL08', 1301, '', 0, '', 'Wilaya de Béchar', 1); INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL09', 1301, '', 0, '', 'Wilaya de Blida', 1); -INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL11', 1301, '', 0, '', 'Wilaya de Bouira', 1); -INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL12', 1301, '', 0, '', 'Wilaya de Tamanrasset', 1); -INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL13', 1301, '', 0, '', 'Wilaya de Tébessa', 1); -INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL14', 1301, '', 0, '', 'Wilaya de Tlemcen', 1); -INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL15', 1301, '', 0, '', 'Wilaya de Tiaret', 1); -INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL16', 1301, '', 0, '', 'Wilaya de Tizi Ouzou', 1); -INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL17', 1301, '', 0, '', 'Wilaya d''Alger', 1); -INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL18', 1301, '', 0, '', 'Wilaya de Djelfa', 1); -INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL19', 1301, '', 0, '', 'Wilaya de Jijel', 1); -INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL20', 1301, '', 0, '', 'Wilaya de Sétif ', 1); -INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL21', 1301, '', 0, '', 'Wilaya de Saïda', 1); -INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL22', 1301, '', 0, '', 'Wilaya de Skikda', 1); -INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL23', 1301, '', 0, '', 'Wilaya de Sidi Bel Abbès', 1); -INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL24', 1301, '', 0, '', 'Wilaya d''Annaba', 1); -INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL25', 1301, '', 0, '', 'Wilaya de Guelma', 1); -INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL26', 1301, '', 0, '', 'Wilaya de Constantine', 1); -INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL27', 1301, '', 0, '', 'Wilaya de Médéa', 1); -INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL28', 1301, '', 0, '', 'Wilaya de Mostaganem', 1); -INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL29', 1301, '', 0, '', 'Wilaya de M''Sila', 1); -INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL30', 1301, '', 0, '', 'Wilaya de Mascara', 1); -INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL31', 1301, '', 0, '', 'Wilaya d''Ouargla', 1); -INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL32', 1301, '', 0, '', 'Wilaya d''Oran', 1); -INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL33', 1301, '', 0, '', 'Wilaya d''El Bayadh', 1); -INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL34', 1301, '', 0, '', 'Wilaya d''Illizi', 1); -INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL35', 1301, '', 0, '', 'Wilaya de Bordj Bou Arreridj', 1); -INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL36', 1301, '', 0, '', 'Wilaya de Boumerdès', 1); -INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL37', 1301, '', 0, '', 'Wilaya d''El Tarf', 1); -INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL38', 1301, '', 0, '', 'Wilaya de Tindouf', 1); -INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL39', 1301, '', 0, '', 'Wilaya de Tissemsilt', 1); -INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL40', 1301, '', 0, '', 'Wilaya d''El Oued', 1); -INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL41', 1301, '', 0, '', 'Wilaya de Khenchela', 1); -INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL42', 1301, '', 0, '', 'Wilaya de Souk Ahras', 1); -INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL43', 1301, '', 0, '', 'Wilaya de Tipaza', 1); -INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL44', 1301, '', 0, '', 'Wilaya de Mila', 1); -INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL45', 1301, '', 0, '', 'Wilaya d''Aïn Defla', 1); -INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL46', 1301, '', 0, '', 'Wilaya de Naâma', 1); -INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL47', 1301, '', 0, '', 'Wilaya d''Aïn Témouchent', 1); -INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL48', 1301, '', 0, '', 'Wilaya de Ghardaia', 1); -INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL49', 1301, '', 0, '', 'Wilaya de Relizane', 1); +INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL10', 1301, '', 0, '', 'Wilaya de Bouira', 1); +INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL11', 1301, '', 0, '', 'Wilaya de Tamanrasset', 1); +INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL12', 1301, '', 0, '', 'Wilaya de Tébessa', 1); +INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL13', 1301, '', 0, '', 'Wilaya de Tlemcen', 1); +INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL14', 1301, '', 0, '', 'Wilaya de Tiaret', 1); +INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL15', 1301, '', 0, '', 'Wilaya de Tizi Ouzou', 1); +INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL16', 1301, '', 0, '', 'Wilaya d''Alger', 1); +INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL17', 1301, '', 0, '', 'Wilaya de Djelfa', 1); +INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL18', 1301, '', 0, '', 'Wilaya de Jijel', 1); +INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL19', 1301, '', 0, '', 'Wilaya de Sétif ', 1); +INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL20', 1301, '', 0, '', 'Wilaya de Saïda', 1); +INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL21', 1301, '', 0, '', 'Wilaya de Skikda', 1); +INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL22', 1301, '', 0, '', 'Wilaya de Sidi Bel Abbès', 1); +INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL23', 1301, '', 0, '', 'Wilaya d''Annaba', 1); +INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL24', 1301, '', 0, '', 'Wilaya de Guelma', 1); +INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL25', 1301, '', 0, '', 'Wilaya de Constantine', 1); +INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL26', 1301, '', 0, '', 'Wilaya de Médéa', 1); +INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL27', 1301, '', 0, '', 'Wilaya de Mostaganem', 1); +INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL28', 1301, '', 0, '', 'Wilaya de M''Sila', 1); +INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL29', 1301, '', 0, '', 'Wilaya de Mascara', 1); +INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL30', 1301, '', 0, '', 'Wilaya d''Ouargla', 1); +INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL31', 1301, '', 0, '', 'Wilaya d''Oran', 1); +INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL32', 1301, '', 0, '', 'Wilaya d''El Bayadh', 1); +INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL33', 1301, '', 0, '', 'Wilaya d''Illizi', 1); +INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL34', 1301, '', 0, '', 'Wilaya de Bordj Bou Arreridj', 1); +INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL35', 1301, '', 0, '', 'Wilaya de Boumerdès', 1); +INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL36', 1301, '', 0, '', 'Wilaya d''El Tarf', 1); +INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL37', 1301, '', 0, '', 'Wilaya de Tindouf', 1); +INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL38', 1301, '', 0, '', 'Wilaya de Tissemsilt', 1); +INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL39', 1301, '', 0, '', 'Wilaya d''El Oued', 1); +INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL40', 1301, '', 0, '', 'Wilaya de Khenchela', 1); +INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL41', 1301, '', 0, '', 'Wilaya de Souk Ahras', 1); +INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL42', 1301, '', 0, '', 'Wilaya de Tipaza', 1); +INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL43', 1301, '', 0, '', 'Wilaya de Mila', 1); +INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL44', 1301, '', 0, '', 'Wilaya d''Aïn Defla', 1); +INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL45', 1301, '', 0, '', 'Wilaya de Naâma', 1); +INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL46', 1301, '', 0, '', 'Wilaya d''Aïn Témouchent', 1); +INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL47', 1301, '', 0, '', 'Wilaya de Ghardaia', 1); +INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('AL48', 1301, '', 0, '', 'Wilaya de Relizane', 1); -- Provinces Maroc - Moroco (id country=12) INSERT INTO llx_c_departements ( code_departement, fk_region, cheflieu, tncc, ncc, nom, active) VALUES('MA', 1209, '', 0, '', 'Province de Benslimane', 1); From 4d37c47990c506d62361bc8cff1bbe0f32b93b79 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 29 Mar 2016 18:05:03 +0200 Subject: [PATCH 09/10] NEW Can select language from combo list on page to overwrite a translation --- htdocs/admin/translation.php | 8 +++++++- htdocs/core/class/html.formadmin.class.php | 18 +++++++++++------- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/htdocs/admin/translation.php b/htdocs/admin/translation.php index d3252a4fc9b..f5c5970e9b3 100644 --- a/htdocs/admin/translation.php +++ b/htdocs/admin/translation.php @@ -23,6 +23,7 @@ require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/class/html.formadmin.class.php'; $langs->load("companies"); $langs->load("products"); @@ -107,6 +108,8 @@ if ($action == 'delete') * View */ +$formadmin = new FormAdmin($db); + $wikihelp='EN:Setup|FR:Paramétrage|ES:Configuración'; llxHeader('',$langs->trans("Setup"),$wikihelp); @@ -146,7 +149,10 @@ print "\n"; $var=false; print "\n"; -print ''."\n"; +print ''; +print $formadmin->select_language(GETPOST('langcode'),'langcode',0,null,1,0,0,'',1); +//print ''; +print ''."\n"; print ''; print ''; print ''; diff --git a/htdocs/core/class/html.formadmin.class.php b/htdocs/core/class/html.formadmin.class.php index fd73386586a..17b7eeb192f 100644 --- a/htdocs/core/class/html.formadmin.class.php +++ b/htdocs/core/class/html.formadmin.class.php @@ -47,17 +47,18 @@ class FormAdmin /** * Return html select list with available languages (key='en_US', value='United States' for example) * - * @param string $selected Langue pre-selectionnee - * @param string $htmlname Nom de la zone select - * @param int $showauto Affiche choix auto + * @param string $selected Language pre-selected + * @param string $htmlname Name of HTML select + * @param int $showauto Show 'auto' choice * @param array $filter Array of keys to exclude in list * @param int $showempty Add empty value * @param int $showwarning Show a warning if language is not complete * @param int $disabled Disable edit of select * @param string $morecss Add more css styles + * @param int $showcode Add language code into label * @return string Return HTML select string with list of languages */ - function select_language($selected='',$htmlname='lang_id',$showauto=0,$filter=0,$showempty=0,$showwarning=0,$disabled=0,$morecss='') + function select_language($selected='',$htmlname='lang_id',$showauto=0,$filter=null,$showempty=0,$showwarning=0,$disabled=0,$morecss='',$showcode=0) { global $langs; @@ -84,6 +85,9 @@ class FormAdmin $uncompletelanguages=array('da_DA','fi_FI','hu_HU','is_IS','pl_PL','ro_RO','ru_RU','sv_SV','tr_TR','zh_CN'); foreach ($langs_available as $key => $value) { + $valuetoshow=$value; + if ($showcode) $valuetoshow=$key.' - '.$value; + if ($showwarning && in_array($key,$uncompletelanguages)) { //$value.=' - '.$langs->trans("TranslationUncomplete",$key); @@ -92,16 +96,16 @@ class FormAdmin { if ( ! array_key_exists($key, $filter)) { - $out.= ''; + $out.= ''; } } else if ($selected == $key) { - $out.= ''; + $out.= ''; } else { - $out.= ''; + $out.= ''; } } $out.= ''; From 718e9a72261a2f3876a3d4c764a457442428fe02 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 29 Mar 2016 19:18:53 +0200 Subject: [PATCH 10/10] Filter on module origin --- htdocs/admin/modules.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/admin/modules.php b/htdocs/admin/modules.php index 8cc02613f6c..1022a5f9f55 100644 --- a/htdocs/admin/modules.php +++ b/htdocs/admin/modules.php @@ -302,7 +302,7 @@ if ($mode != 'marketplace') $moreforfilter.= $langs->trans('Status') . ': '.$form->selectarray('search_status', array('active'=>$langs->transnoentitiesnoconv("Enabled"), 'disabled'=>$langs->transnoentitiesnoconv("Disabled")), $search_status, 1); $moreforfilter.= ''; $moreforfilter.='
'; - $moreforfilter.= $langs->trans('Nature') . ': '.$form->selectarray('search_nature', array('standard'=>$langs->transnoentitiesnoconv("Standard"), 'external'=>$langs->transnoentitiesnoconv("External")), $search_nature, 1); + $moreforfilter.= $langs->trans('Origin') . ': '.$form->selectarray('search_nature', array('standard'=>$langs->transnoentitiesnoconv("Core"), 'external'=>$langs->transnoentitiesnoconv("External")), $search_nature, 1); $moreforfilter.= '
'; $moreforfilter.=' '; $moreforfilter.='
';