diff --git a/htdocs/admin/mails.php b/htdocs/admin/mails.php index 460232bae14..dad93cbdc17 100644 --- a/htdocs/admin/mails.php +++ b/htdocs/admin/mails.php @@ -1089,7 +1089,7 @@ if ($action == 'edit') { if ($text) { - print info_admin($text); + print info_admin($text, 0, 0, '1', ''); } } diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 171bb89c27c..10cc3818d26 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -5935,7 +5935,7 @@ function info_admin($text, $infoonimgalt = 0, $nodiv = 0, $admin = '1', $morecss */ function dol_print_error($db = null, $error = '', $errors = null) { - global $conf, $langs, $argv; + global $conf, $langs, $user, $argv; global $dolibarr_main_prod; $out = ''; @@ -5963,6 +5963,9 @@ function dol_print_error($db = null, $error = '', $errors = null) if (isset($conf->global->MAIN_FEATURES_LEVEL)) { $out .= "".$langs->trans("LevelOfFeature").": ".getDolGlobalInt('MAIN_FEATURES_LEVEL')."
\n"; } + if ($user instanceof User) { + $out .= "".$langs->trans("Login").": ".$user->login."
\n"; + } if (function_exists("phpversion")) { $out .= "".$langs->trans("PHP").": ".phpversion()."
\n"; } diff --git a/htdocs/expedition/list.php b/htdocs/expedition/list.php index 0f2ac88f377..424c65fc2db 100644 --- a/htdocs/expedition/list.php +++ b/htdocs/expedition/list.php @@ -42,7 +42,7 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/product.lib.php'; require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php'; // Load translation files required by the page -$langs->loadLangs(array("sendings", "deliveries", 'companies', 'bills', 'products')); +$langs->loadLangs(array("sendings", "deliveries", 'companies', 'bills', 'products', 'orders')); $contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'shipmentlist'; // To manage different context of search @@ -268,7 +268,7 @@ if (empty($reshook)) { $objecttmp->fk_project = $expd->fk_project; $objecttmp->multicurrency_code = !empty($expdCmdSrc->multicurrency_code) ? $expdCmdSrc->multicurrency_code : (!empty($objecttmp->thirdparty->multicurrency_code) ? $objecttmp->thirdparty->multicurrency_code : $expd->multicurrency_code); if (empty($createbills_onebythird)) { - $objecttmp->ref_client = $expd->ref_client; + $objecttmp->ref_customer = $expd->ref_customer; } $datefacture = dol_mktime(12, 0, 0, GETPOST('remonth', 'int'), GETPOST('reday', 'int'), GETPOST('reyear', 'int')); @@ -277,7 +277,7 @@ if (empty($reshook)) { } $objecttmp->date = $datefacture; - $objecttmp->origin = 'shipping'; + $objecttmp->origin_type = 'shipping'; $objecttmp->origin_id = $id_sending; $objecttmp->array_options = $expd->array_options; // Copy extrafields @@ -344,13 +344,13 @@ if (empty($reshook)) { $desc = ($lines[$i]->desc ? $lines[$i]->desc : ''); // If we build one invoice for several sendings, we must put the ref of sending on the invoice line if (!empty($createbills_onebythird)) { - $desc = dol_concatdesc($desc, $langs->trans("Order").' '.$expd->ref.' - '.dol_print_date($expd->date, 'day')); + $desc = dol_concatdesc($desc, $langs->trans("Order").': '.$expdCmdSrc->ref. ' - '. $langs->trans("Shipment").': '.$expd->ref.($expd->date_shipping ? ' - '.dol_print_date($expd->date_shipping, 'day'):'')); } if ($lines[$i]->subprice < 0 && empty($conf->global->INVOICE_KEEP_DISCOUNT_LINES_AS_IN_ORIGIN)) { // Negative line, we create a discount line $discount = new DiscountAbsolute($db); - $discount->fk_soc = $objecttmp->socid; + $discount->socid = $objecttmp->socid; $discount->amount_ht = abs($lines[$i]->total_ht); $discount->amount_tva = abs($lines[$i]->total_tva); $discount->amount_ttc = abs($lines[$i]->total_ttc); diff --git a/htdocs/install/fileconf.php b/htdocs/install/fileconf.php index cae64209c01..c1ad9b7f595 100644 --- a/htdocs/install/fileconf.php +++ b/htdocs/install/fileconf.php @@ -97,7 +97,7 @@ if (@file_exists($forcedfile)) { session_start(); // To be able to keep info into session (used for not losing pass during navigation. pass must not transit through parameters) -pHeader($langs->trans("ConfigurationFile"), "step1", "set", "", (empty($force_dolibarr_js_JQUERY) ? '' : $force_dolibarr_js_JQUERY.'/'), 'main-inside-bis'); +pHeader($langs->trans("DolibarrSetup").' - '.$langs->trans("ConfigurationFile"), "step1", "set", "", (empty($force_dolibarr_js_JQUERY) ? '' : $force_dolibarr_js_JQUERY.'/'), 'main-inside-bis'); // Test if we can run a first install process if (!is_writable($conffile)) { diff --git a/htdocs/install/inc.php b/htdocs/install/inc.php index e4e93da430d..b1a80578fa6 100644 --- a/htdocs/install/inc.php +++ b/htdocs/install/inc.php @@ -592,9 +592,11 @@ function pHeader($subtitle, $next, $action = 'set', $param = '', $forcejqueryurl print DOL_VERSION; print '
'; - print ''.$langs->trans("DolibarrSetup"); + print ''; if ($subtitle) { - print ' - '.$subtitle; + print $subtitle; + } else { + print $langs->trans("DolibarrSetup"); } print ''."\n"; diff --git a/htdocs/install/repair.php b/htdocs/install/repair.php index 2f985e418b7..7bba5c48ee2 100644 --- a/htdocs/install/repair.php +++ b/htdocs/install/repair.php @@ -73,13 +73,11 @@ if (!is_object($conf)) { * View */ -pHeader('', "upgrade2", GETPOST('action', 'aZ09')); +pHeader($langs->trans("Repair"), "upgrade2", GETPOST('action', 'aZ09')); // Action to launch the repair script $actiondone = 1; -print '

'.$langs->trans("Repair").'

'; - print '
'; print $langs->trans("SetAtLeastOneOptionAsUrlParameter"); print '
'; @@ -1298,16 +1296,54 @@ if ($ok && GETPOST('force_utf8_on_tables', 'alpha')) { if ($force_utf8_on_tables == 'confirmed') { $sql = 'SET FOREIGN_KEY_CHECKS=0'; print ''; + print ''.$sql.''; $resql = $db->query($sql); } + $foreignkeystorestore = array(); + + // First loop to delete foreign keys + foreach ($listoftables as $table) { + // do not convert llx_const if mysql encrypt/decrypt is used + if ($conf->db->dolibarr_main_db_encryption != 0 && preg_match('/\_const$/', $table[0])) { + continue; + } + if ($table[1] == 'VIEW') { + print ''.$table[0].' is a '.$table[1].' (Skipped)'; + continue; + } + + // Special case of tables with foreign key on varchar fields + $arrayofforeignkey = array( + 'llx_accounting_account' => 'fk_accounting_account_fk_pcg_version', + 'llx_accounting_system' => 'fk_accounting_account_fk_pcg_version', + 'llx_c_type_contact' => 'fk_societe_commerciaux_fk_c_type_contact_code', + 'llx_societe_commerciaux' => 'fk_societe_commerciaux_fk_c_type_contact_code' + ); + + foreach ($arrayofforeignkey as $tmptable => $foreignkeyname) { + if ($table[0] == $tmptable) { + print ''; + $sqltmp = 'ALTER TABLE '.$table[0].' DROP FOREIGN KEY '.$foreignkeyname; + print $sqltmp; + if ($force_utf8_on_tables == 'confirmed') { + $resqltmp = $db->query($sqltmp); + } else { + print ' - Disabled'; + } + print ''; + $foreignkeystorestore[$tmptable] = $foreignkeyname; + } + } + } + foreach ($listoftables as $table) { // do not convert llx_const if mysql encrypt/decrypt is used if ($conf->db->dolibarr_main_db_encryption != 0 && preg_match('/\_const$/', $table[0])) { continue; } if ($table[1] == 'VIEW') { - print ''.$table[0].' is a '.$table[1].' (Skipped)'; + print ''.$table[0].' is a '.$table[1].' (Skipped)'; continue; } @@ -1324,17 +1360,45 @@ if ($ok && GETPOST('force_utf8_on_tables', 'alpha')) { } else { $resql2 = false; } - print ' - Done ('.(($resql1 && $resql2) ? 'OK' : 'KO').')'; + print ' - Done '.(($resql1 && $resql2) ? '(OK)' : '(KO)'); } else { - print ' - Disabled'; + print ' - Disabled'; } print ''; + flush(); + ob_flush(); + } + + // Restore dropped foreign keys + foreach ($foreignkeystorestore as $tmptable => $foreignkeyname) { + $stringtofindinline = 'ALTER TABLE .* ADD CONSTRAINT '.$foreignkeyname; + $fileforkeys = DOL_DOCUMENT_ROOT.'/install/mysql/tables/'.$tmptable.'.key.sql'; + //print 'Search in '.$fileforkeys.' to get '.$stringtofindinline."
\n"; + + $handle = fopen($fileforkeys, 'r'); + if ($handle) { + while (($line = fgets($handle)) !== false) { + // Process the line read. + if (preg_match('/^'.$stringtofindinline.'/i', $line)) { + $resqltmp = $db->query($line); + print ''; + print $line; + print ' - Done '.($resqltmp ? '(OK)' : '(KO)'); + print ''; + break; + } + } + fclose($handle); + } + flush(); + ob_flush(); } // Enable foreign key checking if ($force_utf8_on_tables == 'confirmed') { $sql = 'SET FOREIGN_KEY_CHECKS=1'; print ''; + print ''.$sql.''; $resql = $db->query($sql); } } else { @@ -1349,22 +1413,61 @@ if ($ok && GETPOST('force_utf8mb4_on_tables', 'alpha')) { if ($db->type == "mysql" || $db->type == "mysqli") { $force_utf8mb4_on_tables = GETPOST('force_utf8mb4_on_tables', 'alpha'); + $listoftables = $db->DDLListTablesFull($db->database_name); // Disable foreign key checking for avoid errors if ($force_utf8mb4_on_tables == 'confirmed') { $sql = 'SET FOREIGN_KEY_CHECKS=0'; print ''; + print ''.$sql.''; $resql = $db->query($sql); } + $foreignkeystorestore = array(); + + // First loop to delete foreign keys + foreach ($listoftables as $table) { + // do not convert llx_const if mysql encrypt/decrypt is used + if ($conf->db->dolibarr_main_db_encryption != 0 && preg_match('/\_const$/', $table[0])) { + continue; + } + if ($table[1] == 'VIEW') { + print ''.$table[0].' is a '.$table[1].' (Skipped)'; + continue; + } + + // Special case of tables with foreign key on varchar fields + $arrayofforeignkey = array( + 'llx_accounting_account' => 'fk_accounting_account_fk_pcg_version', + 'llx_accounting_system' => 'fk_accounting_account_fk_pcg_version', + 'llx_c_type_contact' => 'fk_societe_commerciaux_fk_c_type_contact_code', + 'llx_societe_commerciaux' => 'fk_societe_commerciaux_fk_c_type_contact_code' + ); + + foreach ($arrayofforeignkey as $tmptable => $foreignkeyname) { + if ($table[0] == $tmptable) { + print ''; + $sqltmp = 'ALTER TABLE '.$table[0].' DROP FOREIGN KEY '.$foreignkeyname; + print $sqltmp; + if ($force_utf8mb4_on_tables == 'confirmed') { + $resqltmp = $db->query($sqltmp); + } else { + print ' - Disabled'; + } + print ''; + $foreignkeystorestore[$tmptable] = $foreignkeyname; + } + } + } + foreach ($listoftables as $table) { // do not convert llx_const if mysql encrypt/decrypt is used if ($conf->db->dolibarr_main_db_encryption != 0 && preg_match('/\_const$/', $table[0])) { continue; } if ($table[1] == 'VIEW') { - print ''.$table[0].' is a '.$table[1].' (Skipped)'; + print ''.$table[0].' is a '.$table[1].' (Skipped)'; continue; } @@ -1381,19 +1484,45 @@ if ($ok && GETPOST('force_utf8mb4_on_tables', 'alpha')) { } else { $resql2 = false; } - print ' - Done ('.(($resql1 && $resql2) ? 'OK' : 'KO').')'; + print ' - Done '.(($resql1 && $resql2) ? '(OK)' : '(KO)'); } else { - print ' - Disabled'; + print ' - Disabled'; } print ''; flush(); ob_flush(); } + // Restore dropped foreign keys + foreach ($foreignkeystorestore as $tmptable => $foreignkeyname) { + $stringtofindinline = 'ALTER TABLE .* ADD CONSTRAINT '.$foreignkeyname; + $fileforkeys = DOL_DOCUMENT_ROOT.'/install/mysql/tables/'.$tmptable.'.key.sql'; + //print 'Search in '.$fileforkeys.' to get '.$stringtofindinline."
\n"; + + $handle = fopen($fileforkeys, 'r'); + if ($handle) { + while (($line = fgets($handle)) !== false) { + // Process the line read. + if (preg_match('/^'.$stringtofindinline.'/i', $line)) { + $resqltmp = $db->query($line); + print ''; + print $line; + print ' - Done '.($resqltmp ? '(OK)' : '(KO)'); + print ''; + break; + } + } + fclose($handle); + } + flush(); + ob_flush(); + } + // Enable foreign key checking if ($force_utf8mb4_on_tables == 'confirmed') { $sql = 'SET FOREIGN_KEY_CHECKS=1'; print ''; + print ''.$sql.''; $resql = $db->query($sql); } } else { @@ -1439,9 +1568,9 @@ if ($ok && GETPOST('force_collation_from_conf_on_tables', 'alpha')) { } else { $resql2 = false; } - print ' - Done ('.(($resql1 && $resql2) ? 'OK' : 'KO').')'; + print ' - Done '.(($resql1 && $resql2) ? '(OK)' : '(KO)'); } else { - print ' - Disabled'; + print ' - Disabled'; } print ''; } diff --git a/htdocs/install/step1.php b/htdocs/install/step1.php index e360e1476ce..ba26c551739 100644 --- a/htdocs/install/step1.php +++ b/htdocs/install/step1.php @@ -164,7 +164,7 @@ $error = 0; dolibarr_install_syslog("--- step1: entering step1.php page"); -pHeader($langs->trans("ConfigurationFile"), "step2"); +pHeader($langs->trans("DolibarrSetup").' - '.$langs->trans("ConfigurationFile"), "step2"); // Test if we can run a first install process if (!is_writable($conffile)) { diff --git a/htdocs/install/step2.php b/htdocs/install/step2.php index 28cab2e155d..a0b64c28a22 100644 --- a/htdocs/install/step2.php +++ b/htdocs/install/step2.php @@ -105,7 +105,7 @@ dolibarr_install_syslog("--- step2: entering step2.php page"); * View */ -pHeader($langs->trans("CreateDatabaseObjects"), "step4"); +pHeader($langs->trans("DolibarrSetup").' - '.$langs->trans("CreateDatabaseObjects"), "step4"); // Test if we can run a first install process if (!is_writable($conffile)) { diff --git a/htdocs/install/step4.php b/htdocs/install/step4.php index c93f4c815e1..dee25c701c9 100644 --- a/htdocs/install/step4.php +++ b/htdocs/install/step4.php @@ -59,7 +59,7 @@ $ok = 0; * View */ -pHeader($langs->trans("AdminAccountCreation"), "step5"); +pHeader($langs->trans("DolibarrSetup").' - '.$langs->trans("AdminAccountCreation"), "step5"); // Test if we can run a first install process if (!is_writable($conffile)) { diff --git a/htdocs/install/step5.php b/htdocs/install/step5.php index 08c45e9999f..7b410b14656 100644 --- a/htdocs/install/step5.php +++ b/htdocs/install/step5.php @@ -127,7 +127,7 @@ if ($action == "set") { // Test on permissions not required here $morehtml = ''; -pHeader($langs->trans("SetupEnd"), "step5", 'set', '', '', 'main-inside main-inside-borderbottom'); +pHeader($langs->trans("DolibarrSetup").' - '.$langs->trans("SetupEnd"), "step5", 'set', '', '', 'main-inside main-inside-borderbottom'); print '
'; // Test if we can run a first install process diff --git a/htdocs/langs/en_US/sendings.lang b/htdocs/langs/en_US/sendings.lang index 71d4214c8a5..9f648d5f706 100644 --- a/htdocs/langs/en_US/sendings.lang +++ b/htdocs/langs/en_US/sendings.lang @@ -63,7 +63,7 @@ NoProductToShipFoundIntoStock=No product to ship found in warehouse %s. C WeightVolShort=Weight/Vol. ValidateOrderFirstBeforeShipment=You must first validate the order before being able to make shipments. NoLineGoOnTabToAddSome=No line, go on tab "%s" to add -CreateInvoiceForThisCustomerFromSendings=Bill sendings +CreateInvoiceForThisCustomerFromSendings=Create Bills IfValidateInvoiceIsNoSendingStayUnbilled=If invoice validation is 'No', the sending will remain to status 'Unbilled' until the invoice is validated. OptionToSetSendingBilledNotEnabled=Option from module Workflow, to set sending to 'Billed' automatically when invoice is validated, is not enabled, so you will have to set the status of sendings to 'Billed' manually after the invoice has been generated. diff --git a/htdocs/langs/fr_FR/sendings.lang b/htdocs/langs/fr_FR/sendings.lang index d102ba0b21b..8c1a84f562d 100644 --- a/htdocs/langs/fr_FR/sendings.lang +++ b/htdocs/langs/fr_FR/sendings.lang @@ -63,7 +63,7 @@ NoProductToShipFoundIntoStock=Aucun produit à expédier n'a été trouvé dans WeightVolShort=Poids/vol. ValidateOrderFirstBeforeShipment=Vous devez d'abord valider la commande pour pouvoir créer une expédition. NoLineGoOnTabToAddSome=Aucune ligne, allez sur l'onglet "%s" pour en ajouter -CreateInvoiceForThisCustomerFromSendings=Envois de factures +CreateInvoiceForThisCustomerFromSendings=Création de factures IfValidateInvoiceIsNoSendingStayUnbilled=Si la validation de la facture est "Non", l'envoi restera à l'état "Non facturé" jusqu'à ce que la facture soit validée. OptionToSetSendingBilledNotEnabled=L'option du module Workflow, qui permet de définir l'envoi comme "facturé" automatiquement lorsque la facture est validée, n'est pas activée. Vous devrez donc définir manuellement l'état des envois comme "facturé" après que la facture a été générée.