diff --git a/htdocs/accountancy/class/lettering.class.php b/htdocs/accountancy/class/lettering.class.php index 272c067807d..67eee9022b5 100644 --- a/htdocs/accountancy/class/lettering.class.php +++ b/htdocs/accountancy/class/lettering.class.php @@ -692,6 +692,9 @@ class Lettering extends BookKeeping // Clean parameters $document_ids = is_array($document_ids) ? $document_ids : array(); + //remove empty entries + $document_ids = array_filter($document_ids); + $doc_type = trim($doc_type); if (empty($document_ids)) { @@ -742,10 +745,13 @@ class Lettering extends BookKeeping // Clean parameters $document_ids = is_array($document_ids) ? $document_ids : array(); $doc_type = trim($doc_type); + //remove empty entries + $document_ids = array_filter($document_ids); if (empty($document_ids)) { return array(); } + if (!is_array(self::$doc_type_infos[$doc_type])) { $langs->load('errors'); $this->errors[] = $langs->trans('ErrorBadParameters'); diff --git a/htdocs/accountancy/journal/bankjournal.php b/htdocs/accountancy/journal/bankjournal.php index 76f25557662..94d2ca576bc 100644 --- a/htdocs/accountancy/journal/bankjournal.php +++ b/htdocs/accountancy/journal/bankjournal.php @@ -5,6 +5,7 @@ * Copyright (C) 2012 Regis Houssin * Copyright (C) 2013 Christophe Battarel * Copyright (C) 2013-2022 Open-DSI + * Copyright (C) 2013-2023 Alexandre Spangaro * Copyright (C) 2013-2014 Florian Henry * Copyright (C) 2013-2014 Olivier Geffroy * Copyright (C) 2017-2023 Frédéric France @@ -805,12 +806,6 @@ if (!$error && $action == 'writebookkeeping') { require_once DOL_DOCUMENT_ROOT . '/accountancy/class/lettering.class.php'; $lettering_static = new Lettering($db); $nb_lettering = $lettering_static->bookkeepingLetteringAll(array($bookkeeping->id)); - - if ($nb_lettering < 0) { - $error++; - $errorforline++; - setEventMessages($lettering_static->error, $lettering_static->errors, 'errors'); - } } } } diff --git a/htdocs/accountancy/journal/purchasesjournal.php b/htdocs/accountancy/journal/purchasesjournal.php index 319328cdc6e..5e30325d2c7 100644 --- a/htdocs/accountancy/journal/purchasesjournal.php +++ b/htdocs/accountancy/journal/purchasesjournal.php @@ -437,13 +437,8 @@ if ($action == 'writebookkeeping') { if (getDolGlobalInt('ACCOUNTING_ENABLE_LETTERING') && getDolGlobalInt('ACCOUNTING_ENABLE_AUTOLETTERING')) { require_once DOL_DOCUMENT_ROOT . '/accountancy/class/lettering.class.php'; $lettering_static = new Lettering($db); - $nb_lettering = $lettering_static->bookkeepingLettering(array($bookkeeping->id)); - if ($nb_lettering < 0) { - $error++; - $errorforline++; - setEventMessages($lettering_static->error, $lettering_static->errors, 'errors'); - } + $nb_lettering = $lettering_static->bookkeepingLettering(array($bookkeeping->id)); } } } diff --git a/htdocs/accountancy/journal/sellsjournal.php b/htdocs/accountancy/journal/sellsjournal.php index 96555b960c0..e8178ad63d3 100644 --- a/htdocs/accountancy/journal/sellsjournal.php +++ b/htdocs/accountancy/journal/sellsjournal.php @@ -4,7 +4,7 @@ * Copyright (C) 2011 Juanjo Menent * Copyright (C) 2012 Regis Houssin * Copyright (C) 2013 Christophe Battarel - * Copyright (C) 2013-2022 Alexandre Spangaro + * Copyright (C) 2013-2023 Alexandre Spangaro * Copyright (C) 2013-2016 Florian Henry * Copyright (C) 2013-2016 Olivier Geffroy * Copyright (C) 2014 Raphaël Doursenaud @@ -465,13 +465,6 @@ if ($action == 'writebookkeeping') { $lettering_static = new Lettering($db); $nb_lettering = $lettering_static->bookkeepingLettering(array($bookkeeping->id)); - - if ($nb_lettering < 0) { - $error++; - $errorforline++; - $errorforinvoice[$key] = 'other'; - setEventMessages($lettering_static->error, $lettering_static->errors, 'errors'); - } } } } diff --git a/htdocs/compta/bank/transfer.php b/htdocs/compta/bank/transfer.php index fb45c3fb449..9245a77b32d 100644 --- a/htdocs/compta/bank/transfer.php +++ b/htdocs/compta/bank/transfer.php @@ -125,7 +125,7 @@ if ($action == 'add') { } else { if (!$amountto[$n]) { $errori[$n]++; - setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("AmountTo")).' #'.$n, null, 'errors'); + setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("AmountToOthercurrency")).' #'.$n, null, 'errors'); } } if ($amountto[$n] < 0) { @@ -218,14 +218,22 @@ print ' '; + print '
'; print ''; print ''; diff --git a/htdocs/core/lib/files.lib.php b/htdocs/core/lib/files.lib.php index f20b8ce34f3..5def472258c 100644 --- a/htdocs/core/lib/files.lib.php +++ b/htdocs/core/lib/files.lib.php @@ -3259,7 +3259,7 @@ function dol_check_secure_access_document($modulepart, $original_file, $entity, $partsofdirinoriginalfile = explode('/', $original_file); if (!empty($partsofdirinoriginalfile[1])) { // If original_file is xxx/filename (xxx is a part we will use) $partofdirinoriginalfile = $partsofdirinoriginalfile[0]; - if ($partofdirinoriginalfile && !empty($fuser->rights->$modulepart->$partofdirinoriginalfile) && ($fuser->rights->$modulepart->$partofdirinoriginalfile->{$lire} || $fuser->rights->$modulepart->$partofdirinoriginalfile->{$read})) { + if ($partofdirinoriginalfile && ($fuser->hasRight($modulepart, $partofdirinoriginalfile, 'lire') || $fuser->hasRight($modulepart, $partofdirinoriginalfile, 'read'))) { $accessallowed = 1; } } diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 06e50f7f229..e35c9e86e3e 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -8937,6 +8937,22 @@ function utf8_check($str) return true; } +/** + * Check if a string is in UTF8 + * + * @param string $str String to check + * @return boolean True if string is valid UTF8 string, false if corrupted + */ +function utf8_valid($str) +{ + /* 2 other methods to test if string is utf8 + $validUTF8 = mb_check_encoding($messagetext, 'UTF-8'); + $validUTF8b = ! (false === mb_detect_encoding($messagetext, 'UTF-8', true)); + */ + return preg_match('//u', $str) ? true : false; +} + + /** * Check if a string is in ASCII * diff --git a/htdocs/core/triggers/interface_50_modAgenda_ActionsAuto.class.php b/htdocs/core/triggers/interface_50_modAgenda_ActionsAuto.class.php index f0e019a82e1..6bdaeb1aca6 100644 --- a/htdocs/core/triggers/interface_50_modAgenda_ActionsAuto.class.php +++ b/htdocs/core/triggers/interface_50_modAgenda_ActionsAuto.class.php @@ -763,14 +763,22 @@ class InterfaceActionsAuto extends DolibarrTriggers // Load translation files required by the page $langs->loadLangs(array("agenda", "other", "members")); - if (empty($object->actionmsg2)) { - $object->actionmsg2 = $langs->transnoentities("MemberSubscriptionDeletedInDolibarr", $object->ref, $object->getFullName($langs)); + $member = $this->context['member']; + if (!is_object($member)) { // This should not happen but it happen when deleting a subscription from adherents/subscription/card.php + dol_syslog("Execute a trigger MEMBER_SUBSCRIPTION_CREATE with context key 'member' not an object"); + include_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent.class.php'; + $member = new Adherent($this->db); + $member->fetch($object->fk_adherent); } - $object->actionmsg = $langs->transnoentities("MemberSubscriptionDeletedInDolibarr", $object->ref, $object->getFullName($langs)); - $object->actionmsg .= "\n".$langs->transnoentities("Member").': '.$object->getFullName($langs); + + $object->actionmsg = $langs->transnoentities("MemberSubscriptionDeletedInDolibarr", $object->ref, $member->getFullName($langs)); + $object->actionmsg .= "\n".$langs->transnoentities("Member").': '.$member->getFullName($langs); $object->actionmsg .= "\n".$langs->transnoentities("Type").': '.$object->fk_type; $object->actionmsg .= "\n".$langs->transnoentities("Amount").': '.$object->amount; $object->actionmsg .= "\n".$langs->transnoentities("Period").': '.dol_print_date($object->dateh, 'day').' - '.dol_print_date($object->datef, 'day'); + if (empty($object->actionmsg2)) { + $object->actionmsg2 = $langs->transnoentities("MemberSubscriptionDeletedInDolibarr", $object->ref, $member->getFullName($langs)); + } $object->sendtoid = 0; if (isset($object->fk_soc) && $object->fk_soc > 0) { diff --git a/htdocs/cron/class/cronjob.class.php b/htdocs/cron/class/cronjob.class.php index 1bb3f25e383..ff6a536a8c5 100644 --- a/htdocs/cron/class/cronjob.class.php +++ b/htdocs/cron/class/cronjob.class.php @@ -1177,7 +1177,7 @@ class Cronjob extends CommonObject return -1; } else { if (empty($user->id)) { - $this->error = " User user login:".$userlogin." do not exists"; + $this->error = "User login: ".$userlogin." does not exist"; dol_syslog(get_class($this)."::run_jobs ".$this->error, LOG_ERR); $conf->setEntityValues($this->db, $savcurrententity); return -1; diff --git a/htdocs/emailcollector/class/emailcollector.class.php b/htdocs/emailcollector/class/emailcollector.class.php index c008345a61d..78e19dbca1c 100644 --- a/htdocs/emailcollector/class/emailcollector.class.php +++ b/htdocs/emailcollector/class/emailcollector.class.php @@ -1000,8 +1000,10 @@ class EmailCollector extends CommonObject } else { // Nothing can be done for this param $errorforthisaction++; - $this->error = 'The extract rule to use has on an unknown source (must be HEADER, SUBJECT or BODY)'; + $this->error = 'The extract rule to use to overwrite properties has on an unknown source (must be HEADER, SUBJECT or BODY)'; $this->errors[] = $this->error; + + $operationslog .= '
'.$this->error; } } elseif (preg_match('/^(SET|SETIFEMPTY):(.*)$/', $valueforproperty, $regforregex)) { $valuecurrent = ''; @@ -1754,7 +1756,15 @@ class EmailCollector extends CommonObject //$htmlmsg,$plainmsg,$charset,$attachments $messagetext = $plainmsg ? $plainmsg : dol_string_nohtmltag($htmlmsg, 0); // Removed emojis - $messagetext = preg_replace('/[\x{10000}-\x{10FFFF}]/u', "\xEF\xBF\xBD", $messagetext); + + if (utf8_valid($messagetext)) { + //$messagetext = preg_replace('/[\x{10000}-\x{10FFFF}]/u', "\xEF\xBF\xBD", $messagetext); + $messagetext = $this->removeEmoji($messagetext); + } else { + $operationslog .= '
Discarded - Email body is not valid utf8'; + dol_syslog(" Discarded - Email body is not valid utf8"); + continue; // Exclude email + } if ($searchfilterexcludebody) { if (preg_match('/'.preg_quote($searchfilterexcludebody, '/').'/ms', $messagetext)) { @@ -2268,8 +2278,10 @@ class EmailCollector extends CommonObject } else { // Nothing can be done for this param $errorforactions++; - $this->error = 'The extract rule to use to load thirdparty has an unknown source (must be HEADER, SUBJECT or BODY)'; + $this->error = 'The extract rule to use to load thirdparty for email '.$msgid.' has an unknown source (must be HEADER, SUBJECT or BODY)'; $this->errors[] = $this->error; + + $operationslog .= '
'.$this->error; } } elseif (preg_match('/^(SET|SETIFEMPTY):(.*)$/', $valueforproperty, $reg)) { //if (preg_match('/^options_/', $tmpproperty)) $object->array_options[preg_replace('/^options_/', '', $tmpproperty)] = $reg[1]; @@ -3499,4 +3511,24 @@ class EmailCollector extends CommonObject return $subject; } + + /** + * Remove EMoji from email content + * + * @param string $text String to sanitize + * @return string Sanitized string + */ + protected function removeEmoji($text) + { + // Supprimer les caractères emoji en utilisant une expression régulière + $text = preg_replace('/[\x{1F600}-\x{1F64F}]/u', '', $text); + $text = preg_replace('/[\x{1F300}-\x{1F5FF}]/u', '', $text); + $text = preg_replace('/[\x{1F680}-\x{1F6FF}]/u', '', $text); + $text = preg_replace('/[\x{2600}-\x{26FF}]/u', '', $text); + $text = preg_replace('/[\x{2700}-\x{27BF}]/u', '', $text); + $text = preg_replace('/[\x{1F900}-\x{1F9FF}]/u', '', $text); + $text = preg_replace('/[\x{1F1E0}-\x{1F1FF}]/u', '', $text); + + return $text; + } } diff --git a/htdocs/fichinter/card.php b/htdocs/fichinter/card.php index 9f6516838c9..1108bd7446b 100644 --- a/htdocs/fichinter/card.php +++ b/htdocs/fichinter/card.php @@ -739,6 +739,7 @@ if (empty($reshook)) { // Actions on extra fields $result = $object->insertExtraFields('INTERVENTION_MODIFY'); if ($result < 0) { + setEventMessages($object->error, $object->errors, 'errors'); $error++; } } diff --git a/htdocs/langs/en_US/stocks.lang b/htdocs/langs/en_US/stocks.lang index 62ebfc53ef9..d0696e53c1a 100644 --- a/htdocs/langs/en_US/stocks.lang +++ b/htdocs/langs/en_US/stocks.lang @@ -319,4 +319,5 @@ StockTransferRightCreateUpdate=Create/Update stocks transfers StockTransferRightDelete=Delete stocks transfers BatchNotFound=Lot / serial not found for this product StockMovementWillBeRecorded=Stock movement will be recorded -StockMovementNotYetRecorded=Stock movement will not be affected by this step \ No newline at end of file +StockMovementNotYetRecorded=Stock movement will not be affected by this step +WarningThisWIllAlsoDeleteStock=Warning, this will also destroy all quantities in stock in the warehouse diff --git a/htdocs/partnership/partnership_card.php b/htdocs/partnership/partnership_card.php index 7679b63da09..bf51b1fe5df 100644 --- a/htdocs/partnership/partnership_card.php +++ b/htdocs/partnership/partnership_card.php @@ -391,7 +391,7 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea // )); // } - $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ToRefuse'), $text, 'confirm_refuse', $formquestion, '', 1, 250); + $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ToRefuse'), '', 'confirm_refuse', $formquestion, '', 1, 250); } // Call Hook formConfirm diff --git a/htdocs/product/reassortlot.php b/htdocs/product/reassortlot.php index 3d72610736e..63abd714011 100644 --- a/htdocs/product/reassortlot.php +++ b/htdocs/product/reassortlot.php @@ -129,7 +129,7 @@ if (!empty($canvas)) { } // Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context -$hookmanager->initHooks(array('productreassortlotlist')); +$hookmanager->initHooks(array('reassortlotlist')); // Security check if ($user->socid) { diff --git a/htdocs/product/stock/card.php b/htdocs/product/stock/card.php index 09c6981508f..b1bee9165c5 100644 --- a/htdocs/product/stock/card.php +++ b/htdocs/product/stock/card.php @@ -413,7 +413,10 @@ if ($action == 'create') { // Confirm delete warehouse if ($action == 'delete') { - $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"]."?id=".$object->id, $langs->trans("DeleteAWarehouse"), $langs->trans("ConfirmDeleteWarehouse", $object->label), "confirm_delete", '', 0, 2); + $formquestion = array( + array('type' => 'other', 'name' => 'info', 'label' => img_warning('').$langs->trans("WarningThisWIllAlsoDeleteStock"), 'morecss'=>'warning') + ); + $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"]."?id=".$object->id, $langs->trans("DeleteAWarehouse"), $langs->trans("ConfirmDeleteWarehouse", $object->label), "confirm_delete", $formquestion, 0, 2); } // Call Hook formConfirm diff --git a/htdocs/product/stock/class/entrepot.class.php b/htdocs/product/stock/class/entrepot.class.php index 5c9ec6849d3..3164060efd8 100644 --- a/htdocs/product/stock/class/entrepot.class.php +++ b/htdocs/product/stock/class/entrepot.class.php @@ -382,16 +382,28 @@ class Entrepot extends CommonObject // End call triggers } - $elements = array('stock_mouvement', 'product_stock', 'product_warehouse_properties'); - foreach ($elements as $table) { - if (!$error) { - $sql = "DELETE FROM ".$this->db->prefix().$table; - $sql .= " WHERE fk_entrepot = ".((int) $this->id); + if (!$error) { + $sql = "DELETE FROM ".$this->db->prefix()."product_batch"; + $sql .= " WHERE fk_product_stock IN (SELECT rowid FROM ".$this->db->prefix()."product_stock as ps WHERE ps.fk_entrepot = ".((int) $this->id).")"; + $result = $this->db->query($sql); + if (!$result) { + $error++; + $this->errors[] = $this->db->lasterror(); + } + } - $result = $this->db->query($sql); - if (!$result) { - $error++; - $this->errors[] = $this->db->lasterror(); + if (!$error) { + $elements = array('stock_mouvement', 'product_stock'); + foreach ($elements as $table) { + if (!$error) { + $sql = "DELETE FROM ".$this->db->prefix().$table; + $sql .= " WHERE fk_entrepot = ".((int) $this->id); + + $result = $this->db->query($sql); + if (!$result) { + $error++; + $this->errors[] = $this->db->lasterror(); + } } } } diff --git a/htdocs/projet/tasks/task.php b/htdocs/projet/tasks/task.php index 8a0d976b379..1723325b6d6 100644 --- a/htdocs/projet/tasks/task.php +++ b/htdocs/projet/tasks/task.php @@ -707,8 +707,7 @@ if ($id > 0 || !empty($ref)) { // List of actions on element include_once DOL_DOCUMENT_ROOT.'/core/class/html.formactions.class.php'; $formactions = new FormActions($db); - $defaultthirdpartyid = $socid > 0 ? $socid : $object->project->socid; - $formactions->showactions($object, 'task', $defaultthirdpartyid, 1, '', 10, 'withproject='.$withproject); + $formactions->showactions($object, 'project_task', 0, 1, '', 10, 'withproject='.$withproject); print ''; } diff --git a/htdocs/supplier_proposal/card.php b/htdocs/supplier_proposal/card.php index fa60f961f10..676dd851400 100644 --- a/htdocs/supplier_proposal/card.php +++ b/htdocs/supplier_proposal/card.php @@ -633,7 +633,7 @@ if (empty($reshook)) { $error++; } - if ($prod_entry_mode == 'free' && (empty($idprod) || $idprod < 0) && GETPOST('price_ht') === '' && GETPOST('price_ttc') === '' && $price_ht_devise === '') { // Unit price can be 0 but not ''. Also price can be negative for proposal. + if ($prod_entry_mode == 'free' && (empty($idprod) || $idprod < 0) && GETPOST('price_ht') === '' && GETPOST('price_ttc') === '' && GETPOST('multicurrency_price_ht') === '') { // Unit price can be 0 but not ''. Also price can be negative for proposal. setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("UnitPrice")), null, 'errors'); $error++; } diff --git a/htdocs/theme/eldy/timeline.inc.php b/htdocs/theme/eldy/timeline.inc.php index 84d486817b1..a4fa4ee29b3 100644 --- a/htdocs/theme/eldy/timeline.inc.php +++ b/htdocs/theme/eldy/timeline.inc.php @@ -62,7 +62,8 @@ if (!defined('ISLOADEDBYSTEELSHEET')) { position: relative; } -.timeline > li.timeline-code-ticket_msg_private > .timeline-item { +.timeline > li.timeline-code-ticket_msg_private > .timeline-item, +.timeline > li.timeline-code-ticket_msg_private_sentbymail > .timeline-item { background: #fffbe5; border-color: #d0cfc0; } diff --git a/scripts/cron/cron_run_jobs.php b/scripts/cron/cron_run_jobs.php index 0e099224a3b..901b12d662b 100755 --- a/scripts/cron/cron_run_jobs.php +++ b/scripts/cron/cron_run_jobs.php @@ -199,7 +199,7 @@ if (is_array($object->lines) && (count($object->lines) > 0)) { // Force reload of setup for the current entity if ((empty($line->entity) ? 1 : $line->entity) != $conf->entity) { - dol_syslog("cron_run_jobs.php we work on another entity conf than ".$conf->entity." so we reload mysoc, langs, user and conf", LOG_DEBUG); + dol_syslog("cron_run_jobs.php: we work on another entity conf than ".$conf->entity." so we reload mysoc, langs, user and conf", LOG_DEBUG); echo " -> we change entity so we reload mysoc, langs, user and conf"; $conf->entity = (empty($line->entity) ? 1 : $line->entity); @@ -211,12 +211,12 @@ if (is_array($object->lines) && (count($object->lines) > 0)) { $result = $user->fetch('', $userlogin, '', 1); if ($result < 0) { echo "\nUser Error: ".$user->error."\n"; - dol_syslog("cron_run_jobs.php:: User Error:".$user->error, LOG_ERR); + dol_syslog("cron_run_jobs.php: User Error:".$user->error, LOG_ERR); exit(-1); } else { if ($result == 0) { - echo "\nUser login: ".$userlogin." does not exists for entity ".$conf->entity."\n"; - dol_syslog("User login:".$userlogin." does not exists", LOG_ERR); + echo "\nUser login: ".$userlogin." does not exist for entity ".$conf->entity."\n"; + dol_syslog("cron_run_jobs.php: User login: ".$userlogin." does not exist", LOG_ERR); exit(-1); } } @@ -248,7 +248,7 @@ if (is_array($object->lines) && (count($object->lines) > 0)) { $cronjob = new Cronjob($db); $result = $cronjob->fetch($line->id); if ($result < 0) { - echo "Error cronjobid: ".$line->id." cronjob->fetch: ".$cronjob->error."\n"; + echo " - Error cronjobid: ".$line->id." cronjob->fetch: ".$cronjob->error."\n"; echo "Failed to fetch job ".$line->id."\n"; dol_syslog("cron_run_jobs.php::fetch Error ".$cronjob->error, LOG_ERR); exit(-1); @@ -256,7 +256,7 @@ if (is_array($object->lines) && (count($object->lines) > 0)) { // Execute job $result = $cronjob->run_jobs($userlogin); if ($result < 0) { - echo "Error cronjobid: ".$line->id." cronjob->run_job: ".$cronjob->error."\n"; + echo " - Error cronjobid: ".$line->id." cronjob->run_job: ".$cronjob->error."\n"; echo "At least one job failed. Go on menu Home-Setup-Admin tools to see result for each job.\n"; echo "You can also enable module Log if not yet enabled, run again and take a look into dolibarr.log file\n"; dol_syslog("cron_run_jobs.php::run_jobs Error ".$cronjob->error, LOG_ERR); @@ -272,7 +272,7 @@ if (is_array($object->lines) && (count($object->lines) > 0)) { // We re-program the next execution and stores the last execution time for this job $result = $cronjob->reprogram_jobs($userlogin, $now); if ($result < 0) { - echo "Error cronjobid: ".$line->id." cronjob->reprogram_job: ".$cronjob->error."\n"; + echo " - Error cronjobid: ".$line->id." cronjob->reprogram_job: ".$cronjob->error."\n"; echo "Enable module Log if not yet enabled, run again and take a look into dolibarr.log file\n"; dol_syslog("cron_run_jobs.php::reprogram_jobs Error ".$cronjob->error, LOG_ERR); exit(-1);