diff --git a/htdocs/comm/action/card.php b/htdocs/comm/action/card.php index f0354cba285..4dc5221cea3 100644 --- a/htdocs/comm/action/card.php +++ b/htdocs/comm/action/card.php @@ -2400,6 +2400,20 @@ if ($id > 0) { print ''; } + //mail information + if (!empty($object->email_msgid)) { + print ''.$langs->trans('MailTopic').''; + print ''.dol_escape_htmltag($object->email_subject).''; + print ''.$langs->trans('MailFrom').''; + print ''.dol_escape_htmltag($object->email_from).''; + print ''.$langs->trans('MailTo').''; + print ''.dol_escape_htmltag($object->email_to).''; + if (!empty($object->email_tocc)) { + print ''.$langs->trans('MailCC').''; + print ''.dol_escape_htmltag($object->email_tocc).''; + } + } + // Description print ''.$langs->trans("Description").''; print dol_string_onlythesehtmltags(dol_htmlentitiesbr($object->note_private)); diff --git a/htdocs/comm/propal/card.php b/htdocs/comm/propal/card.php index cae98408d44..fa29b8187fb 100644 --- a/htdocs/comm/propal/card.php +++ b/htdocs/comm/propal/card.php @@ -79,6 +79,7 @@ $cancel = GETPOST('cancel', 'alpha'); $origin = GETPOST('origin', 'alpha'); $originid = GETPOST('originid', 'int'); $confirm = GETPOST('confirm', 'alpha'); +$backtopage = GETPOST('backtopage', 'alpha'); // Go back to a dedicated page $lineid = GETPOST('lineid', 'int'); $contactid = GETPOST('contactid', 'int'); $projectid = GETPOST('projectid', 'int'); @@ -1774,6 +1775,7 @@ if ($action == 'create') { print '
'; print ''; print ''; + print ''; if ($origin != 'project' && $originid) { print ''; print ''; @@ -2449,6 +2451,7 @@ if ($action == 'create') { print ''; print ''; print ''; + print ''; print $form->selectDate($object->date, 're', '', '', 0, "editdate"); print ''; print '
'; @@ -2476,6 +2479,7 @@ if ($action == 'create') { print '
'; print ''; print ''; + print ''; print $form->selectDate($object->fin_validite, 'ech', '', '', '', "editecheance"); print ''; print '
'; @@ -2836,6 +2840,7 @@ if ($action == 'create') { + '; diff --git a/htdocs/comm/propal/class/propal.class.php b/htdocs/comm/propal/class/propal.class.php index 47e178292eb..40e8fe385d7 100644 --- a/htdocs/comm/propal/class/propal.class.php +++ b/htdocs/comm/propal/class/propal.class.php @@ -3708,6 +3708,7 @@ class Propal extends CommonObject global $conf, $langs, $user; $datas = []; + $nofetch = !empty($params['nofetch']); if (!empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) { return ['optimize' => $langs->trans("Proposal")]; @@ -3720,9 +3721,25 @@ class Propal extends CommonObject if (!empty($this->ref)) { $datas['ref'] = '
'.$langs->trans('Ref').': '.$this->ref; } + if (!$nofetch) { + $langs->load('companies'); + if (empty($this->thirdparty)) { + $this->fetch_thirdparty(); + } + $datas['customer'] = '
'.$langs->trans('Customer').': '.$this->thirdparty->getNomUrl(1, '', 0, 1); + } if (!empty($this->ref_client)) { $datas['refcustomer'] = '
'.$langs->trans('RefCustomer').': '.$this->ref_client; } + if (!$nofetch) { + $langs->load('project'); + if (empty($this->project)) { + $res = $this->fetch_project(); + if ($res > 0) { + $datas['project'] = '
'.$langs->trans('Project').': '.$this->project->getNomUrl(1, '', 0, 1); + } + } + } if (!empty($this->total_ht)) { $datas['amountht'] = '
'.$langs->trans('AmountHT').': '.price($this->total_ht, 0, $langs, 0, -1, -1, $conf->currency); } @@ -3767,6 +3784,7 @@ class Propal extends CommonObject 'id' => $this->id, 'objecttype' => $this->element, 'option' => $option, + 'nofetch' => 1, ]; $classfortooltip = 'classfortooltip'; $dataparams = ''; diff --git a/htdocs/commande/card.php b/htdocs/commande/card.php index b58a74ae67a..318ce32f115 100644 --- a/htdocs/commande/card.php +++ b/htdocs/commande/card.php @@ -84,6 +84,8 @@ $socid = GETPOST('socid', 'int'); $action = GETPOST('action', 'aZ09'); $cancel = GETPOST('cancel', 'alpha'); $confirm = GETPOST('confirm', 'alpha'); +$backtopage = GETPOST('backtopage', 'alpha'); + $lineid = GETPOST('lineid', 'int'); $contactid = GETPOST('contactid', 'int'); $projectid = GETPOST('projectid', 'int'); @@ -1755,6 +1757,7 @@ if ($action == 'create' && $usercancreate) { print ''; print ''; print ''; + print ''; if (!empty($currency_tx)) { print ''; } @@ -2449,6 +2452,7 @@ if ($action == 'create' && $usercancreate) { print '
'; print ''; print ''; + print ''; print $form->selectDate($object->date, 'order_', '', '', '', "setdate"); print ''; print '
'; @@ -2470,6 +2474,7 @@ if ($action == 'create' && $usercancreate) { print '
'; print ''; print ''; + print ''; print $form->selectDate($object->delivery_date ? $object->delivery_date : -1, 'liv_', 1, 1, '', "setdate_livraison", 1, 0); print ''; print '
'; @@ -2763,7 +2768,9 @@ if ($action == 'create' && $usercancreate) { - '; + + + '; if (!empty($conf->use_javascript_ajax) && $object->statut == Commande::STATUS_DRAFT) { include DOL_DOCUMENT_ROOT.'/core/tpl/ajaxrow.tpl.php'; @@ -2991,7 +2998,7 @@ if ($action == 'create' && $usercancreate) { // Presend form $modelmail = 'order_send'; $defaulttopic = 'SendOrderRef'; - $diroutput = $conf->commande->multidir_output[$object->entity]; + $diroutput = getMultidirOutput($object); $trackid = 'ord'.$object->id; include DOL_DOCUMENT_ROOT.'/core/tpl/card_presend.tpl.php'; diff --git a/htdocs/commande/class/commande.class.php b/htdocs/commande/class/commande.class.php index 6348d8e1325..2b11588b854 100644 --- a/htdocs/commande/class/commande.class.php +++ b/htdocs/commande/class/commande.class.php @@ -3728,6 +3728,7 @@ class Commande extends CommonOrder global $conf, $langs, $user; $datas = []; + $nofetch = !empty($params['nofetch']); if (!empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) { return ['optimize' => $langs->trans("Order")]; @@ -3739,7 +3740,23 @@ class Commande extends CommonOrder $datas[] = ' '.$this->getLibStatut(5); } $datas['Ref'] = '
'.$langs->trans('Ref').': '.$this->ref; + if (!$nofetch) { + $langs->load('companies'); + if (empty($this->thirdparty)) { + $this->fetch_thirdparty(); + } + $datas['customer'] = '
'.$langs->trans('Customer').': '.$this->thirdparty->getNomUrl(1, '', 0, 1); + } $datas['RefCustomer'] = '
'.$langs->trans('RefCustomer').': '.(empty($this->ref_customer) ? (empty($this->ref_client) ? '' : $this->ref_client) : $this->ref_customer); + if (!$nofetch) { + $langs->load('project'); + if (empty($this->project)) { + $res = $this->fetch_project(); + if ($res > 0) { + $datas['project'] = '
'.$langs->trans('Project').': '.$this->project->getNomUrl(1, '', 0, 1); + } + } + } if (!empty($this->total_ht)) { $datas['AmountHT'] = '
'.$langs->trans('AmountHT').': '.price($this->total_ht, 0, $langs, 0, -1, -1, $conf->currency); } @@ -3811,6 +3828,7 @@ class Commande extends CommonOrder 'id' => $this->id, 'objecttype' => $this->element, 'option' => $option, + 'nofetch' => 1, ]; $classfortooltip = 'classfortooltip'; $dataparams = ''; @@ -3960,6 +3978,7 @@ class Commande extends CommonOrder $this->id = 0; $this->ref = 'SPECIMEN'; $this->specimen = 1; + $this->entity = $conf->entity; $this->socid = 1; $this->date = time(); $this->date_lim_reglement = $this->date + 3600 * 24 * 30; diff --git a/htdocs/compta/facture/card.php b/htdocs/compta/facture/card.php index e8e92ebfada..58c7e35724d 100644 --- a/htdocs/compta/facture/card.php +++ b/htdocs/compta/facture/card.php @@ -86,6 +86,8 @@ $socid = GETPOST('socid', 'int'); $action = GETPOST('action', 'aZ09'); $confirm = GETPOST('confirm', 'alpha'); $cancel = GETPOST('cancel', 'alpha'); +$backtopage = GETPOST('backtopage', 'alpha'); + $lineid = GETPOST('lineid', 'int'); $userid = GETPOST('userid', 'int'); $search_ref = GETPOST('sf_ref', 'alpha') ? GETPOST('sf_ref', 'alpha') : GETPOST('search_ref', 'alpha'); @@ -3153,6 +3155,8 @@ if ($action == 'create') { if ($soc->id > 0) { print ''."\n"; } + print ''; + print ''; print ''; print ''; print ''; @@ -4688,6 +4692,7 @@ if ($action == 'create') { print '
'; print ''; print ''; + print ''; print ''; print ''; print '
'; @@ -4717,6 +4722,7 @@ if ($action == 'create') { print '
'; print ''; print ''; + print ''; $retained_warranty_fk_cond_reglement = GETPOST('retained_warranty_fk_cond_reglement', 'int'); $retained_warranty_fk_cond_reglement = !empty($retained_warranty_fk_cond_reglement) ? $retained_warranty_fk_cond_reglement : $object->retained_warranty_fk_cond_reglement; $retained_warranty_fk_cond_reglement = !empty($retained_warranty_fk_cond_reglement) ? $retained_warranty_fk_cond_reglement : $conf->global->INVOICE_SITUATION_DEFAULT_RETAINED_WARRANTY_COND_ID; @@ -4752,6 +4758,7 @@ if ($action == 'create') { print ''; print ''; print ''; + print ''; print ''; print ''; print '
'; @@ -4832,6 +4839,7 @@ if ($action == 'create') { print ''; print ''; print ''; + print ''; print $formother->select_revenue_stamp('', 'revenuestamp_type', $mysoc->country_code); print ' → '; print ' '; @@ -5371,6 +5379,7 @@ if ($action == 'create') { print ''; print ''; print ''; + print ''; print ''; @@ -5409,6 +5418,7 @@ if ($action == 'create') { + '; if (!empty($conf->use_javascript_ajax) && $object->statut == 0) { diff --git a/htdocs/contrat/card.php b/htdocs/contrat/card.php index 2817cfc406a..7e5b4d482d0 100644 --- a/htdocs/contrat/card.php +++ b/htdocs/contrat/card.php @@ -56,6 +56,7 @@ $langs->loadLangs(array("contracts", "orders", "companies", "bills", "products", $action = GETPOST('action', 'aZ09'); $confirm = GETPOST('confirm', 'alpha'); $cancel = GETPOST('cancel', 'alpha'); +$backtopage = GETPOST('backtopage', 'alpha'); $socid = GETPOST('socid', 'int'); $id = GETPOST('id', 'int'); @@ -1135,10 +1136,10 @@ if ($action == 'create') { print ''; print ''; - print ''; print ''."\n"; print ''; + print ''; print dol_get_fiche_head(); @@ -1350,6 +1351,7 @@ if ($action == 'create') { print ''; print ''; print ''; + print ''; } // Contract card @@ -1490,6 +1492,7 @@ if ($action == 'create') { print ''; print ''; print ''; + print ''; print ''; print ''; @@ -1914,6 +1917,7 @@ if ($action == 'create') { print ''; print ''; print ''; + print ''; print ''; print ''; print ''; @@ -1973,6 +1977,7 @@ if ($action == 'create') { print ''; print ''; print ''; + print ''; print '
'; @@ -2038,6 +2043,7 @@ if ($action == 'create') { + '; print '
'; diff --git a/htdocs/contrat/class/contrat.class.php b/htdocs/contrat/class/contrat.class.php index 3e3678fbcad..8e6c2ea0161 100644 --- a/htdocs/contrat/class/contrat.class.php +++ b/htdocs/contrat/class/contrat.class.php @@ -1995,6 +1995,7 @@ class Contrat extends CommonObject $langs->load('contracts'); $datas = []; + $nofetch = !empty($params['nofetch']); if (!empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) { return ['optimize' => $langs->trans("ShowContract")]; @@ -2006,7 +2007,23 @@ class Contrat extends CommonObject $label .= ' '.$this->getLibStatut(5); }*/ $datas['ref'] = '
'.$langs->trans('Ref').': '.($this->ref ? $this->ref : $this->id); + if (!$nofetch) { + $langs->load('companies'); + if (empty($this->thirdparty)) { + $this->fetch_thirdparty(); + } + $datas['customer'] = '
'.$langs->trans('Customer').': '.$this->thirdparty->getNomUrl(1, '', 0, 1); + } $datas['refcustomer'] = '
'.$langs->trans('RefCustomer').': '. $this->ref_customer; + if (!$nofetch) { + $langs->load('project'); + if (empty($this->project)) { + $res = $this->fetch_project(); + if ($res > 0) { + $datas['project'] = '
'.$langs->trans('Project').': '.$this->project->getNomUrl(1, '', 0, 1); + } + } + } $datas['refsupplier'] = '
'.$langs->trans('RefSupplier').': '.$this->ref_supplier; if (!empty($this->total_ht)) { $datas['amountht'] = '
'.$langs->trans('AmountHT').': '.price($this->total_ht, 0, $langs, 0, -1, -1, $conf->currency); @@ -2052,6 +2069,7 @@ class Contrat extends CommonObject $params = [ 'id' => $this->id, 'objecttype' => $this->element, + 'nofetch' => 1, ]; $classfortooltip = 'classfortooltip'; $dataparams = ''; diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index cb5ddfcd395..8a07b83d15e 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -5496,171 +5496,165 @@ abstract class CommonObject $parameters = array('modelspath'=>$modelspath, 'modele'=>$modele, 'outputlangs'=>$outputlangs, 'hidedetails'=>$hidedetails, 'hidedesc'=>$hidedesc, 'hideref'=>$hideref, 'moreparams'=>$moreparams); $reshook = $hookmanager->executeHooks('commonGenerateDocument', $parameters, $this, $action); // Note that $action and $object may have been modified by some hooks - if (empty($reshook)) { - dol_syslog("commonGenerateDocument modele=".$modele." outputlangs->defaultlang=".(is_object($outputlangs) ? $outputlangs->defaultlang : 'null')); + if (!empty($reshook)) { + return $reshook; + } - if (empty($modele)) { - $this->error = 'BadValueForParameterModele'; - return -1; - } + dol_syslog("commonGenerateDocument modele=".$modele." outputlangs->defaultlang=".(is_object($outputlangs) ? $outputlangs->defaultlang : 'null')); - // Increase limit for PDF build - $err = error_reporting(); - error_reporting(0); - @set_time_limit(120); - error_reporting($err); + if (empty($modele)) { + $this->error = 'BadValueForParameterModele'; + return -1; + } - // If selected model is a filename template (then $modele="modelname" or "modelname:filename") - $tmp = explode(':', $modele, 2); - if (!empty($tmp[1])) { - $modele = $tmp[0]; - $srctemplatepath = $tmp[1]; - } + // Increase limit for PDF build + $err = error_reporting(); + error_reporting(0); + @set_time_limit(120); + error_reporting($err); - // Search template files - $file = ''; - $classname = ''; - $filefound = ''; - $dirmodels = array('/'); - if (is_array($conf->modules_parts['models'])) { - $dirmodels = array_merge($dirmodels, $conf->modules_parts['models']); - } - foreach ($dirmodels as $reldir) { - foreach (array('doc', 'pdf') as $prefix) { - if (in_array(get_class($this), array('Adherent'))) { - // Member module use prefix_modele.class.php - $file = $prefix."_".$modele.".class.php"; - } else { - // Other module use prefix_modele.modules.php - $file = $prefix."_".$modele.".modules.php"; - } + // If selected model is a filename template (then $modele="modelname" or "modelname:filename") + $tmp = explode(':', $modele, 2); + if (!empty($tmp[1])) { + $modele = $tmp[0]; + $srctemplatepath = $tmp[1]; + } - // On verifie l'emplacement du modele - $file = dol_buildpath($reldir.$modelspath.$file, 0); - if (file_exists($file)) { - $filefound = $file; - $classname = $prefix.'_'.$modele; - break; - } + // Search template files + $file = ''; + $classname = ''; + $filefound = ''; + $dirmodels = array('/'); + if (is_array($conf->modules_parts['models'])) { + $dirmodels = array_merge($dirmodels, $conf->modules_parts['models']); + } + foreach ($dirmodels as $reldir) { + foreach (array('doc', 'pdf') as $prefix) { + if (in_array(get_class($this), array('Adherent'))) { + // Member module use prefix_modele.class.php + $file = $prefix."_".$modele.".class.php"; + } else { + // Other module use prefix_modele.modules.php + $file = $prefix."_".$modele.".modules.php"; } - if ($filefound) { + + // On verifie l'emplacement du modele + $file = dol_buildpath($reldir.$modelspath.$file, 0); + if (file_exists($file)) { + $filefound = $file; + $classname = $prefix.'_'.$modele; break; } } - - // If generator was found if ($filefound) { - global $db; // Required to solve a conception default making an include of code using $db instead of $this->db just after. + break; + } + } - require_once $file; + if (!$filefound) { + $this->error = $langs->trans("Error").' Failed to load doc generator with modelpaths='.$modelspath.' - modele='.$modele; + $this->errors[] = $this->error; + dol_syslog($this->error, LOG_ERR); + return -1; + } - $obj = new $classname($this->db); + // If generator was found + global $db; // Required to solve a conception default making an include of code using $db instead of $this->db just after. - // If generator is ODT, we must have srctemplatepath defined, if not we set it. - if ($obj->type == 'odt' && empty($srctemplatepath)) { - $varfortemplatedir = $obj->scandir; - if ($varfortemplatedir && !empty($conf->global->$varfortemplatedir)) { - $dirtoscan = $conf->global->$varfortemplatedir; + require_once $file; - $listoffiles = array(); + $obj = new $classname($this->db); - // Now we add first model found in directories scanned - $listofdir = explode(',', $dirtoscan); - foreach ($listofdir as $key => $tmpdir) { - $tmpdir = trim($tmpdir); - $tmpdir = preg_replace('/DOL_DATA_ROOT/', DOL_DATA_ROOT, $tmpdir); - if (!$tmpdir) { - unset($listofdir[$key]); - continue; - } - if (is_dir($tmpdir)) { - $tmpfiles = dol_dir_list($tmpdir, 'files', 0, '\.od(s|t)$', '', 'name', SORT_ASC, 0); - if (count($tmpfiles)) { - $listoffiles = array_merge($listoffiles, $tmpfiles); - } - } - } + // If generator is ODT, we must have srctemplatepath defined, if not we set it. + if ($obj->type == 'odt' && empty($srctemplatepath)) { + $varfortemplatedir = $obj->scandir; + if ($varfortemplatedir && !empty($conf->global->$varfortemplatedir)) { + $dirtoscan = $conf->global->$varfortemplatedir; - if (count($listoffiles)) { - foreach ($listoffiles as $record) { - $srctemplatepath = $record['fullname']; - break; - } + $listoffiles = array(); + + // Now we add first model found in directories scanned + $listofdir = explode(',', $dirtoscan); + foreach ($listofdir as $key => $tmpdir) { + $tmpdir = trim($tmpdir); + $tmpdir = preg_replace('/DOL_DATA_ROOT/', DOL_DATA_ROOT, $tmpdir); + if (!$tmpdir) { + unset($listofdir[$key]); + continue; + } + if (is_dir($tmpdir)) { + $tmpfiles = dol_dir_list($tmpdir, 'files', 0, '\.od(s|t)$', '', 'name', SORT_ASC, 0); + if (count($tmpfiles)) { + $listoffiles = array_merge($listoffiles, $tmpfiles); } } + } - if (empty($srctemplatepath)) { - $this->error = 'ErrorGenerationAskedForOdtTemplateWithSrcFileNotDefined'; - return -1; + if (count($listoffiles)) { + foreach ($listoffiles as $record) { + $srctemplatepath = $record['fullname']; + break; } } + } - if ($obj->type == 'odt' && !empty($srctemplatepath)) { - if (!dol_is_file($srctemplatepath)) { - dol_syslog("Failed to locate template file ".$srctemplatepath, LOG_WARNING); - $this->error = 'ErrorGenerationAskedForOdtTemplateWithSrcFileNotFound'; - return -1; - } - } - - // We save charset_output to restore it because write_file can change it if needed for - // output format that does not support UTF8. - $sav_charset_output = empty($outputlangs->charset_output) ? '' : $outputlangs->charset_output; - - if (in_array(get_class($this), array('Adherent'))) { - $resultwritefile = $obj->write_file($this, $outputlangs, $srctemplatepath, 'member', 1, 'tmp_cards', $moreparams); - } else { - $resultwritefile = $obj->write_file($this, $outputlangs, $srctemplatepath, $hidedetails, $hidedesc, $hideref, $moreparams); - } - // After call of write_file $obj->result['fullpath'] is set with generated file. It will be used to update the ECM database index. - - if ($resultwritefile > 0) { - $outputlangs->charset_output = $sav_charset_output; - - // We delete old preview - require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; - dol_delete_preview($this); - - // Index file in database - if (!empty($obj->result['fullpath'])) { - $destfull = $obj->result['fullpath']; - - // Update the last_main_doc field into main object (if document generator has property ->update_main_doc_field set) - $update_main_doc_field = 0; - if (!empty($obj->update_main_doc_field)) { - $update_main_doc_field = 1; - } - - $this->indexFile($destfull, $update_main_doc_field); - } else { - dol_syslog('Method ->write_file was called on object '.get_class($obj).' and return a success but the return array ->result["fullpath"] was not set.', LOG_WARNING); - } - - // Success in building document. We build meta file. - dol_meta_create($this); - - return 1; - } else { - $outputlangs->charset_output = $sav_charset_output; - $this->error = $obj->error; - $this->errors = $obj->errors; - dol_syslog("Error generating document for ".__CLASS__.". Error: ".$obj->error, LOG_ERR); - return -1; - } - } else { - if (!$filefound) { - $this->error = $langs->trans("Error").' Failed to load doc generator with modelpaths='.$modelspath.' - modele='.$modele; - $this->errors[] = $this->error; - dol_syslog($this->error, LOG_ERR); - } else { - $this->error = $langs->trans("Error")." ".$langs->trans("ErrorFileDoesNotExists", $filefound); - $this->errors[] = $this->error; - dol_syslog($this->error, LOG_ERR); - } + if (empty($srctemplatepath)) { + $this->error = 'ErrorGenerationAskedForOdtTemplateWithSrcFileNotDefined'; return -1; } + } + + if ($obj->type == 'odt' && !empty($srctemplatepath)) { + if (!dol_is_file($srctemplatepath)) { + dol_syslog("Failed to locate template file ".$srctemplatepath, LOG_WARNING); + $this->error = 'ErrorGenerationAskedForOdtTemplateWithSrcFileNotFound'; + return -1; + } + } + + // We save charset_output to restore it because write_file can change it if needed for + // output format that does not support UTF8. + $sav_charset_output = empty($outputlangs->charset_output) ? '' : $outputlangs->charset_output; + + if (in_array(get_class($this), array('Adherent'))) { + $resultwritefile = $obj->write_file($this, $outputlangs, $srctemplatepath, 'member', 1, 'tmp_cards', $moreparams); } else { - return $reshook; + $resultwritefile = $obj->write_file($this, $outputlangs, $srctemplatepath, $hidedetails, $hidedesc, $hideref, $moreparams); + } + // After call of write_file $obj->result['fullpath'] is set with generated file. It will be used to update the ECM database index. + + if ($resultwritefile > 0) { + $outputlangs->charset_output = $sav_charset_output; + + // We delete old preview + require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; + dol_delete_preview($this); + + // Index file in database + if (!empty($obj->result['fullpath'])) { + $destfull = $obj->result['fullpath']; + + // Update the last_main_doc field into main object (if document generator has property ->update_main_doc_field set) + $update_main_doc_field = 0; + if (!empty($obj->update_main_doc_field)) { + $update_main_doc_field = 1; + } + + $this->indexFile($destfull, $update_main_doc_field); + } else { + dol_syslog('Method ->write_file was called on object '.get_class($obj).' and return a success but the return array ->result["fullpath"] was not set.', LOG_WARNING); + } + + // Success in building document. We build meta file. + dol_meta_create($this); + + return 1; + } else { + $outputlangs->charset_output = $sav_charset_output; + $this->error = $obj->error; + $this->errors = $obj->errors; + dol_syslog("Error generating document for ".__CLASS__.". Error: ".$obj->error, LOG_ERR); + return -1; } } diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 36470668f43..c5fca0eff5c 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -71,6 +71,25 @@ if (!function_exists('utf8_decode')) { } } +/** + * Return the full path of the directory where a module (or an object of a module) stores its files. Path may depends on the entity if a multicompany module is enabled. + * + * @param CommonObject $object Dolibarr common object + * @param string $module Override object element, for example to use 'mycompany' instead of 'societe' + * @return string|void The path of the relative directory of the module + * @since Dolibarr V18 + */ +function getMultidirOutput($object, $module = '') +{ + global $conf; + if (!is_object($object) && empty($module)) { + return null; + } + if (empty($module) && !empty($object->element)) { + $module = $object->element; + } + return $conf->$module->multidir_output[(!empty($object->entity) ? $object->entity : $conf->entity)]; +} /** * Return dolibarr global constant string value @@ -10869,8 +10888,8 @@ function dolGetStatus($statusLabel = '', $statusLabelShort = '', $html = '', $st * * @param string $label Label or tooltip of button. Also used as tooltip in title attribute. Can be escaped HTML content or full simple text. * @param string $text Optional : short label on button. Can be escaped HTML content or full simple text. - * @param string $actionType 'default', 'delete', 'danger' - * @param string $url Url for link + * @param string $actionType 'default', 'delete', 'danger', 'email', ... + * @param string|array $url Url for link or array of subbutton description * @param string $id Attribute id of button * @param int|boolean $userRight User action right * // phpcs:disable @@ -10897,7 +10916,26 @@ function dolGetButtonAction($label, $text = '', $actionType = 'default', $url = { global $hookmanager, $action, $object, $langs; - //var_dump($params); + // If $url is an array, we must build a dropdown button + if (is_array($url)) { + $out = '"; + + return $out; + } + + // If $url is a simple link if (!empty($params['isDropdown'])) $class = "dropdown-item"; else { diff --git a/htdocs/core/lib/modulebuilder.lib.php b/htdocs/core/lib/modulebuilder.lib.php index f4db12cea89..26b5437aacc 100644 --- a/htdocs/core/lib/modulebuilder.lib.php +++ b/htdocs/core/lib/modulebuilder.lib.php @@ -418,7 +418,40 @@ function rebuildObjectSql($destdir, $module, $objectname, $newmask, $readdir = ' } /** - * delete all permissions + * Get list of existing objects from directory + * + * @param string $destdir Directory + * @return array|int <=0 if KO, array if OK + */ +function dolGetListOfObjectClasses($destdir) +{ + $objects = array(); + $listofobject = dol_dir_list($destdir.'/class', 'files', 0, '\.class\.php$'); + foreach ($listofobject as $fileobj) { + if (preg_match('/^api_/', $fileobj['name'])) { + continue; + } + if (preg_match('/^actions_/', $fileobj['name'])) { + continue; + } + + $tmpcontent = file_get_contents($fileobj['fullname']); + $reg = array(); + if (preg_match('/class\s+([^\s]*)\s+extends\s+CommonObject/ims', $tmpcontent, $reg)) { + $objectnameloop = $reg[1]; + $objects[$fileobj['fullname']] = $objectnameloop; + } + } + if (count($objects)>0) { + return $objects; + } + + return -1; +} + +/** + * Delete all permissions + * * @param string $file file with path * @return void */ @@ -494,8 +527,6 @@ function reWriteAllPermissions($file, $permissions, $key, $right, $action) // rewrite all permission again dolReplaceInFile($file, array('/* BEGIN MODULEBUILDER PERMISSIONS */' => '/* BEGIN MODULEBUILDER PERMISSIONS */'."\n\t\t".$rights_str)); return 1; - } else { - return -1; } } diff --git a/htdocs/core/lib/project.lib.php b/htdocs/core/lib/project.lib.php index 71c0cd7c0c6..2a38906e4de 100644 --- a/htdocs/core/lib/project.lib.php +++ b/htdocs/core/lib/project.lib.php @@ -1069,6 +1069,18 @@ function projectLinesa(&$inc, $parent, &$lines, &$level, $var, $showproject, &$t if (count($arrayfields) > 0 && !empty($arrayfields['c.assigned']['checked'])) { print '
'; } + + //Check if Extrafields is totalizable + foreach ($extrafields->attributes['projet_task']['totalizable'] as $key=>$value) { + if ($arrayfields['ef.'.$key]['checked'] == 1) { + print ''; + } + } + print ''; print ''; } diff --git a/htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php b/htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php index 78b3fa24a33..cb460cff14a 100644 --- a/htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php +++ b/htdocs/core/modules/commande/doc/pdf_eratosthene.modules.php @@ -296,18 +296,18 @@ class pdf_eratosthene extends ModelePDFCommandes - if ($conf->commande->multidir_output[$conf->entity]) { + if (getMultidirOutput($object)) { $object->fetch_thirdparty(); $deja_regle = 0; // Definition of $dir and $file if ($object->specimen) { - $dir = $conf->commande->multidir_output[$conf->entity]; + $dir = getMultidirOutput($object); $file = $dir."/SPECIMEN.pdf"; } else { $objectref = dol_sanitizeFileName($object->ref); - $dir = $conf->commande->multidir_output[$object->entity]."/".$objectref; + $dir = getMultidirOutput($object)."/".$objectref; $file = $dir."/".$objectref.".pdf"; } @@ -1447,7 +1447,7 @@ class pdf_eratosthene extends ModelePDFCommandes protected function _pagehead(&$pdf, $object, $showaddress, $outputlangs, $outputlangsbis = null, $titlekey = "PdfOrderTitle") { // phpcs:enable - global $conf, $langs, $hookmanager; + global $conf, $langs, $hookmanager, $mysoc; $ltrdirection = 'L'; if ($outputlangs->trans("DIRECTION") == 'rtl') $ltrdirection = 'R'; @@ -1473,8 +1473,8 @@ class pdf_eratosthene extends ModelePDFCommandes if (!getDolGlobalInt('PDF_DISABLE_MYCOMPANY_LOGO')) { if ($this->emetteur->logo) { $logodir = $conf->mycompany->dir_output; - if (!empty($conf->mycompany->multidir_output[$object->entity])) { - $logodir = $conf->mycompany->multidir_output[$object->entity]; + if (!empty(getMultidirOutput($mysoc, 'mycompany'))) { + $logodir = getMultidirOutput($mysoc, 'mycompany'); } if (!getDolGlobalInt('MAIN_PDF_USE_LARGE_LOGO')) { $logo = $logodir.'/logos/thumbs/'.$this->emetteur->logo_small; diff --git a/htdocs/don/card.php b/htdocs/don/card.php index a077c703fda..2c3e3ec6e11 100644 --- a/htdocs/don/card.php +++ b/htdocs/don/card.php @@ -52,6 +52,7 @@ $ref = GETPOST('ref', 'alpha'); $action = GETPOST('action', 'aZ09'); $cancel = GETPOST('cancel', 'alpha'); $confirm = GETPOST('confirm', 'alpha'); +$backtopage = GETPOST('backtopage', 'alpha'); $socid = GETPOST('socid', 'int'); $amount = price2num(GETPOST('amount', 'alphanohtml'), 'MT'); $donation_date = dol_mktime(12, 0, 0, GETPOST('remonth'), GETPOST('reday'), GETPOST('reyear')); @@ -405,6 +406,7 @@ if ($action == 'create') { print ''; print ''; print ''; + print ''; print dol_get_fiche_head(''); @@ -579,7 +581,7 @@ if (!empty($id) && $action == 'edit') { print ''; print ''; print ''; - + print ''; print dol_get_fiche_head($head, $hselected, $langs->trans("Donation"), 0, 'donation'); @@ -732,6 +734,7 @@ if (!empty($id) && $action != 'edit') { $morehtmlref .= ''; $morehtmlref .= ''; $morehtmlref .= ''; + $morehtmlref .= ''; $morehtmlref .= $formproject->select_projects($object->socid, $object->fk_project, 'projectid', 0, 0, 1, 0, 1, 0, 0, '', 1, 0, 'maxwidth500'); $morehtmlref .= ''; $morehtmlref .= ''; diff --git a/htdocs/expensereport/card.php b/htdocs/expensereport/card.php index 7dd54308af4..168e7461427 100644 --- a/htdocs/expensereport/card.php +++ b/htdocs/expensereport/card.php @@ -55,6 +55,7 @@ $langs->loadLangs(array("trips", "bills", "mails")); $action = GETPOST('action', 'aZ09'); $cancel = GETPOST('cancel', 'alpha'); $confirm = GETPOST('confirm', 'alpha'); +$backtopage = GETPOST('backtopage', 'alpha'); $id = GETPOST('id', 'int'); $date_start = dol_mktime(0, 0, 0, GETPOST('date_debutmonth', 'int'), GETPOST('date_debutday', 'int'), GETPOST('date_debutyear', 'int')); @@ -1407,6 +1408,7 @@ if ($action == 'create') { print ''; print ''; print ''; + print ''; print dol_get_fiche_head(''); @@ -1545,6 +1547,7 @@ if ($action == 'create') { print "\n"; print ''; print ''; + print ''; print dol_get_fiche_head($head, 'card', $langs->trans("ExpenseReport"), 0, 'trip'); @@ -2027,6 +2030,7 @@ if ($action == 'create') { print ''; print ''; print ''; + print ''; print '
'; print '
'; + if ($value == 1) { + print $totalarray['totalizable'][$key]['total']; + } + print '
'; diff --git a/htdocs/fichinter/card.php b/htdocs/fichinter/card.php index 0f18d024671..31ae0ccaf65 100644 --- a/htdocs/fichinter/card.php +++ b/htdocs/fichinter/card.php @@ -62,6 +62,8 @@ $contratid = (int) GETPOST('contratid', 'int'); $action = GETPOST('action', 'alpha'); $cancel = GETPOST('cancel', 'alpha'); $confirm = GETPOST('confirm', 'alpha'); +$backtopage = GETPOST('backtopage', 'alpha'); + $mesg = GETPOST('msg', 'alpha'); $origin = GETPOST('origin', 'alpha'); $originid = (GETPOST('originid', 'int') ?GETPOST('originid', 'int') : GETPOST('origin_id', 'int')); // For backward compatibility @@ -890,6 +892,7 @@ if ($action == 'create') { print ''; print ''; print ''; + print ''; print dol_get_fiche_head(''); @@ -1043,6 +1046,7 @@ if ($action == 'create') { print ''; print ''; print ''; // We go back to create action + print ''; print dol_get_fiche_head(''); @@ -1308,6 +1312,7 @@ if ($action == 'create') { } else { print ''; } + print ''; // Intervention lines $sql = 'SELECT ft.rowid, ft.description, ft.fk_fichinter, ft.duree, ft.rang,'; diff --git a/htdocs/fourn/facture/card.php b/htdocs/fourn/facture/card.php index 30e6ceda91e..5408b8f980a 100644 --- a/htdocs/fourn/facture/card.php +++ b/htdocs/fourn/facture/card.php @@ -74,6 +74,8 @@ $action = GETPOST('action', 'aZ09'); $confirm = GETPOST("confirm"); $ref = GETPOST('ref', 'alpha'); $cancel = GETPOST('cancel', 'alpha'); +$backtopage = GETPOST('backtopage', 'alpha'); + $lineid = GETPOST('lineid', 'int'); $projectid = GETPOST('projectid', 'int'); $origin = GETPOST('origin', 'alpha'); @@ -2156,6 +2158,7 @@ if ($action == 'create') { if (!empty($currency_tx)) { print ''; } + print ''; print dol_get_fiche_head(); @@ -3721,6 +3724,7 @@ if ($action == 'create') { print ''; print ''; print ''; + print ''; if (!empty($conf->use_javascript_ajax) && $object->statut == FactureFournisseur::STATUS_DRAFT) { include DOL_DOCUMENT_ROOT.'/core/tpl/ajaxrow.tpl.php'; diff --git a/htdocs/install/mysql/migration/17.0.0-18.0.0.sql b/htdocs/install/mysql/migration/17.0.0-18.0.0.sql index 54d1d4cb33c..9732c2d5386 100644 --- a/htdocs/install/mysql/migration/17.0.0-18.0.0.sql +++ b/htdocs/install/mysql/migration/17.0.0-18.0.0.sql @@ -37,7 +37,7 @@ -- VMYSQL4.3 ALTER TABLE llx_hrm_skillrank CHANGE COLUMN `rank` rankorder integer; -- VPGSQL8.2 ALTER TABLE llx_hrm_skillrank CHANGE COLUMN rank rankorder integer; -ALTER TABLE llx_accounting_system CHANGE COLUMN fk_pays fk_country integer; +ALTER TABLE llx_accounting_system CHANGE COLUMN fk_pays fk_country integer; ALTER TABLE llx_commande_fournisseurdet MODIFY COLUMN ref varchar(128); ALTER TABLE llx_facture_fourn_det MODIFY COLUMN ref varchar(128); @@ -376,4 +376,3 @@ UPDATE llx_c_country SET numeric_code = '716' WHERE code_iso = 'ZWE'; -- Generate documents on product batch ALTER TABLE llx_product_lot ADD COLUMN model_pdf varchar(255) AFTER scrapping_date; ALTER TABLE llx_product_lot ADD COLUMN last_main_doc varchar(255) AFTER model_pdf; - diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index ea360315fba..ab9d45a6a81 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -2454,27 +2454,39 @@ function top_menu_user($hideloginname = 0, $urllogout = '') } jQuery(document).ready(function() { jQuery(document).on("click", function(event) { + // console.log("Click somewhere on screen"); if (!$(event.target).closest("#topmenu-login-dropdown").length) { closeTopMenuLoginDropdown(); } }); - '; + + jQuery(".butAction.dropdown-toggle").on("click", function(event) { + console.log("Click on .butAction.dropdown-toggle"); + var parentholder = jQuery(".butAction.dropdown-toggle").closest(".dropdown"); + var offset = parentholder.offset(); + var left = offset.left; + var right = $(document).width() - offset.left - parentholder.width(); + parentholder.toggleClass("open"); + parentholder.children(".dropdown-content").css({"right": right+"px", "left": "auto"}); + }); + '; + if ($conf->theme != 'md') { $btnUser .= ' jQuery("#topmenu-login-dropdown .dropdown-toggle").on("click", function(event) { - console.log("toggle login dropdown"); + console.log("Click on #topmenu-login-dropdown .dropdown-toggle"); event.preventDefault(); jQuery("#topmenu-login-dropdown").toggleClass("open"); }); jQuery("#topmenulogincompanyinfo-btn").on("click", function() { - console.log("Clik on topmenulogincompanyinfo-btn"); + console.log("Clik on #topmenulogincompanyinfo-btn"); jQuery("#topmenulogincompanyinfo").slideToggle(); }); jQuery("#topmenuloginmoreinfo-btn").on("click", function() { - console.log("Clik on topmenuloginmoreinfo-btn"); + console.log("Clik on #topmenuloginmoreinfo-btn"); jQuery("#topmenuloginmoreinfo").slideToggle(); });'; } @@ -2515,6 +2527,7 @@ function top_menu_quickadd() } }); $("#topmenu-quickadd-dropdown .dropdown-toggle").on("click", function(event) { + console.log("Click on #topmenu-quickadd-dropdown .dropdown-toggle"); openQuickAddDropDown(); }); // Key map shortcut @@ -2762,7 +2775,7 @@ function top_menu_bookmark() }); jQuery("#topmenu-bookmark-dropdown .dropdown-toggle").on("click", function(event) { - console.log("toggle bookmark dropdown"); + console.log("Click on #topmenu-bookmark-dropdown .dropdown-toggle"); openBookMarkDropDown(); }); @@ -2904,7 +2917,7 @@ function top_menu_search() // Open drop down jQuery("#topmenu-global-search-dropdown .dropdown-toggle").on("click", function(event) { - console.log("toggle search dropdown"); + console.log("click on toggle #topmenu-global-search-dropdown .dropdown-toggle"); openGlobalSearchDropDown(); }); diff --git a/htdocs/modulebuilder/index.php b/htdocs/modulebuilder/index.php index e2b6ce2835d..1362b6e695d 100644 --- a/htdocs/modulebuilder/index.php +++ b/htdocs/modulebuilder/index.php @@ -405,23 +405,8 @@ if ($dirins && in_array($action, array('initapi', 'initphpunit', 'initpagecontac $destdir = $dirins.'/'.strtolower($module); // Get list of existing objects - $objects = array(); - $listofobject = dol_dir_list($destdir.'/class', 'files', 0, '\.class\.php$'); - foreach ($listofobject as $fileobj) { - if (preg_match('/^api_/', $fileobj['name'])) { - continue; - } - if (preg_match('/^actions_/', $fileobj['name'])) { - continue; - } + $objects = dolGetListOfObjectClasses($destdir); - $tmpcontent = file_get_contents($fileobj['fullname']); - $reg = array(); - if (preg_match('/class\s+([^\s]*)\s+extends\s+CommonObject/ims', $tmpcontent, $reg)) { - $objectnameloop = $reg[1]; - $objects[$fileobj['fullname']] = $objectnameloop; - } - } if ($action == 'initapi') { if (file_exists($dirins.'/'.strtolower($module).'/class/api_'.strtolower($module).'.class.php')) { @@ -953,24 +938,8 @@ if ($dirins && $action == 'confirm_removefile' && !empty($module)) { $relativefilename = dol_sanitizePathName(GETPOST('file', 'restricthtml')); // Get list of existing objects - // TODO ALI This part of code is common at several places and is autonomous. So replace it with $objects = dolGetListOfObjectclasses($destdir); - $objects = array(); - $listofobject = dol_dir_list($destdir.'/class', 'files', 0, '\.class\.php$'); - foreach ($listofobject as $fileobj) { - if (preg_match('/^api_/', $fileobj['name'])) { - continue; - } - if (preg_match('/^actions_/', $fileobj['name'])) { - continue; - } + $objects = dolGetListOfObjectClasses($destdir); - $tmpcontent = file_get_contents($fileobj['fullname']); - $reg = array(); - if (preg_match('/class\s+([^\s]*)\s+extends\s+CommonObject/ims', $tmpcontent, $reg)) { - $objectnameloop = $reg[1]; - $objects[$fileobj['fullname']] = $objectnameloop; - } - } // Now we delete the file if ($relativefilename) { @@ -1030,20 +999,6 @@ if ($dirins && $action == 'confirm_removefile' && !empty($module)) { // Init an object if ($dirins && $action == 'initobject' && $module && $objectname) { - // check if module is enabled - if (isModEnabled(strtolower($module))) { - $result = unActivateModule(strtolower($module)); - dolibarr_set_const($db, "MAIN_IHM_PARAMS_REV", (int) $conf->global->MAIN_IHM_PARAMS_REV + 1, 'chaine', 0, '', $conf->entity); - if ($result) { - setEventMessages($result, null, 'errors'); - } else { - /* FIX ALI header must be after action. Always add an exit after a header. - header("Location: ".DOL_URL_ROOT.'/modulebuilder/index.php?tab=permissions&module='.$module); - */ - setEventMessages($langs->trans('WarningModuleNeedRefrech', $langs->transnoentities($module)), null, 'warnings'); - } - } - $objectname = ucfirst($objectname); $dirins = $dirread = $listofmodules[strtolower($module)]['moduledescriptorrootpath']; @@ -1651,6 +1606,18 @@ if ($dirins && $action == 'initobject' && $module && $objectname) { } else { $tabobj = 'newobject'; } + + // check if module is enabled + if (isModEnabled(strtolower($module))) { + $result = unActivateModule(strtolower($module)); + dolibarr_set_const($db, "MAIN_IHM_PARAMS_REV", (int) $conf->global->MAIN_IHM_PARAMS_REV + 1, 'chaine', 0, '', $conf->entity); + if ($result) { + setEventMessages($result, null, 'errors'); + } + setEventMessages($langs->trans('WarningModuleNeedRefrech', $langs->transnoentities($module)), null, 'warnings'); + header("Location: ".DOL_URL_ROOT.'/modulebuilder/index.php?tab=objects&module='.$module); + exit; + } } // Add a dictionary @@ -1913,20 +1880,6 @@ if ($dirins && $action == 'confirm_deletemodule') { } if ($dirins && $action == 'confirm_deleteobject' && $objectname) { - // check if module is enabled (if it's disabled and send msg event) - if (isModEnabled(strtolower($module))) { - $result = unActivateModule(strtolower($module)); - dolibarr_set_const($db, "MAIN_IHM_PARAMS_REV", (int) $conf->global->MAIN_IHM_PARAMS_REV + 1, 'chaine', 0, '', $conf->entity); - if ($result) { - setEventMessages($result, null, 'errors'); - $error++; - } else { - /* TODO ALI Header redirect must be at end after actions. Also tab=pemrissions looks strange - header("Location: ".DOL_URL_ROOT.'/modulebuilder/index.php?tab=permissions&module='.$module); - */ - setEventMessages($langs->trans('WarningModuleNeedRefrech', $langs->transnoentities($module)), null, 'warnings'); - } - } if (preg_match('/[^a-z0-9_]/i', $objectname)) { $error++; setEventMessages($langs->trans("SpaceOrSpecialCharAreNotAllowed"), null, 'errors'); @@ -2023,16 +1976,7 @@ if ($dirins && $action == 'confirm_deleteobject' && $objectname) { "; $deleteright = dolReplaceInFile($moduledescriptorfile, array('/*'.strtoupper($objectname).'*/' => '', $rights => '', "/*END ".strtoupper($objectname).'*/'."\n\t\t" => "\n\t\t")); - if ($deleteright > 0) { - if (isModEnabled(strtolower($module))) { - $result = unActivateModule(strtolower($module)); - if ($result) { - setEventMessages($result, null, 'errors'); - } - setEventMessages($langs->trans("WarningModuleNeedRefrech", $langs->transnoentities($module)), null, 'warnings'); - header("Location: ".DOL_URL_ROOT.'/modulebuilder/index.php?index.php?tab=description&module='.$module); - } - } + $resultko = 0; foreach ($filetodelete as $tmpfiletodelete) { $resulttmp = dol_delete_file($dir.'/'.$tmpfiletodelete, 0, 0, 1); @@ -2051,6 +1995,18 @@ if ($dirins && $action == 'confirm_deleteobject' && $objectname) { $action = ''; $tabobj = 'deleteobject'; + + // check if module is enabled + if (isModEnabled(strtolower($module))) { + $result = unActivateModule(strtolower($module)); + dolibarr_set_const($db, "MAIN_IHM_PARAMS_REV", (int) $conf->global->MAIN_IHM_PARAMS_REV + 1, 'chaine', 0, '', $conf->entity); + if ($result) { + setEventMessages($result, null, 'errors'); + } + setEventMessages($langs->trans('WarningModuleNeedRefrech', $langs->transnoentities($module)), null, 'warnings'); + header("Location: ".DOL_URL_ROOT.'/modulebuilder/index.php?tab=objects&module='.$module); + exit; + } } if ($dirins && $action == 'generatedoc') { @@ -2602,25 +2558,10 @@ if ($dirins && $action == 'addmenu' && empty($cancel)) { $error = 0; $dirins = $listofmodules[strtolower($module)]['moduledescriptorrootpath']; $destdir = $dirins.'/'.strtolower($module); - $listofobject = dol_dir_list($destdir.'/class', 'files', 0, '\.class\.php$'); // Get list of existing objets - $objects = array(); - foreach ($listofobject as $fileobj) { - if (preg_match('/^api_/', $fileobj['name'])) { - continue; - } - if (preg_match('/^actions_/', $fileobj['name'])) { - continue; - } + $objects = dolGetListOfObjectClasses($destdir); - $tmpcontent = file_get_contents($fileobj['fullname']); - $reg = array(); - if (preg_match('/class\s+([^\s]*)\s+extends\s+CommonObject/ims', $tmpcontent, $reg)) { - $objectnameloop = $reg[1]; - $objects[$fileobj['fullname']] = $objectnameloop; - } - } // load class and check if right exist $pathtofile = $listofmodules[strtolower($module)]['moduledescriptorrelpath']; @@ -4564,27 +4505,24 @@ if ($module == 'initmodule') { $pathtofile = $listofmodules[strtolower($module)]['moduledescriptorrelpath']; $dirins = $listofmodules[strtolower($module)]['moduledescriptorrootpath']; $destdir = $dirins.'/'.strtolower($module); - $listofobject = dol_dir_list($destdir.'/class', 'files', 0, '\.class\.php$'); // Get list of existing objects - $objects = array(); - foreach ($listofobject as $fileobj) { - if (preg_match('/^api_/', $fileobj['name'])) { - continue; - } - if (preg_match('/^actions_/', $fileobj['name'])) { - continue; - } + $objects = dolGetListOfObjectClasses($destdir); - $tmpcontent = file_get_contents($fileobj['fullname']); - $reg = array(); - if (preg_match('/class\s+([^\s]*)\s+extends\s+CommonObject/ims', $tmpcontent, $reg)) { - $objectnameloop = $reg[1]; - $objects[$fileobj['fullname']] = $objectnameloop; - } - } $menus = $moduleobj->menu; + if ($action == 'deletemenu') { + $formconfirms = $form->formconfirm( + $_SERVER["PHP_SELF"].'?menukey='.urlencode(GETPOST('menukey', 'int')).'&tab='.urlencode($tab).'&module='.urlencode($module), + $langs->trans('Delete'), + $langs->trans('Confirm Delete Menu', GETPOST('menukey', 'int')), + 'confirm_deletemenu', + '', + 0, + 1 + ); + print $formconfirms; + } if ($action != 'editfile' || empty($file)) { print ''; $htmlhelp = $langs->trans("MenusDefDescTooltip", '{s1}'); diff --git a/htdocs/product/list.php b/htdocs/product/list.php index 15f8e93dd6b..ed0e0d22c91 100644 --- a/htdocs/product/list.php +++ b/htdocs/product/list.php @@ -95,6 +95,7 @@ $search_accountancy_code_buy = GETPOST("search_accountancy_code_buy", 'alpha'); $search_accountancy_code_buy_intra = GETPOST("search_accountancy_code_buy_intra", 'alpha'); $search_accountancy_code_buy_export = GETPOST("search_accountancy_code_buy_export", 'alpha'); $search_finished = GETPOST("search_finished", 'int'); +$search_units = GETPOST('search_units', 'int'); $optioncss = GETPOST('optioncss', 'alpha'); $type = GETPOST("type", "int"); $mode = GETPOST('mode', 'alpha'); @@ -353,6 +354,7 @@ if (empty($reshook)) { $search_accountancy_code_buy_intra = ''; $search_accountancy_code_buy_export = ''; $search_array_options = array(); + $search_units = ''; } // Mass actions @@ -571,6 +573,9 @@ if ($search_accountancy_code_buy_intra) { if ($search_accountancy_code_buy_export) { $sql .= natural_search($alias_product_perentity . '.accountancy_code_buy_export', $search_accountancy_code_buy_export); } +if (!empty($conf->global->PRODUCT_USE_UNITS) && $search_units) { + $sql .= natural_search('cu.rowid', $search_units); +} // Add where from extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php'; // Add where from hooks @@ -1021,6 +1026,7 @@ if (!empty($arrayfields['p.volume_units']['checked'])) { // Unit if (!empty($arrayfields['cu.label']['checked'])) { print ''; } diff --git a/htdocs/projet/card.php b/htdocs/projet/card.php index 36bc7b87961..bc31f211a63 100644 --- a/htdocs/projet/card.php +++ b/htdocs/projet/card.php @@ -1551,56 +1551,26 @@ if ($action == 'create' && $user->rights->projet->creer) { } } + // Buttons Create + if (empty($conf->global->PROJECT_HIDE_CREATE_OBJECT_BUTTON)) { + $arrayforbutaction = array( + 10 => array('lang'=>'propal', 'enabled'=>isModEnabled("propal"), 'perm'=>$user->hasRight('propal', 'creer'), 'label' => 'AddProp', 'url'=>'/comm/propal/card.php?action=create&projectid='.$object->id.'&socid='.$object->socid), + 20 => array('lang'=>'orders', 'enabled'=>isModEnabled("commande"), 'perm'=>$user->hasRight('commande', 'creer'), 'label' => 'CreateOrder', 'url'=>'/commande/card.php?action=create&projectid='.$object->id.'&socid='.$object->socid), + 30 => array('lang'=>'bills', 'enabled'=>isModEnabled("facture"), 'perm'=>$user->hasRight('facture', 'creer'), 'label' => 'CreateBill', 'url'=>'/compta/facture/card.php?action=create&projectid='.$object->id.'&socid='.$object->socid), + 40 => array('lang'=>'supplier_proposal', 'enabled'=>isModEnabled("supplier_proposal"), 'perm'=>$user->hasRight('supplier_proposal', 'creer'), 'label' => 'AddSupplierProposal', 'url'=>'/supplier_proposal/card.php?action=create&projectid='.$object->id.'&socid='.$object->socid), + 50 => array('lang'=>'suppliers', 'enabled'=>isModEnabled("supplier_order"), 'perm'=>$user->hasRight('fournisseur', 'commande', 'creer'), 'label' => 'AddSupplierOrder', 'url'=>'/fourn/commande/card.php?action=create&projectid='.$object->id.'&socid='.$object->socid), + 60 => array('lang'=>'suppliers', 'enabled'=>isModEnabled("supplier_invoice"), 'perm'=>$user->hasRight('fournisseur', 'facture', 'creer'), 'label' => 'AddSupplierInvoice', 'url'=>'/fourn/facture/card.php?action=create&projectid='.$object->id.'&socid='.$object->socid), + 70 => array('lang'=>'interventions', 'enabled'=>isModEnabled("ficheinter"), 'perm'=>$user->hasRight('fichinter', 'creer'), 'label' => 'AddIntervention', 'url'=>'/fichinter/card.php?action=create&projectid='.$object->id.'&socid='.$object->socid), + 80 => array('lang'=>'contrats', 'enabled'=>isModEnabled("contrat"), 'perm'=>$user->hasRight('contrat', 'creer'), 'label' => 'AddContract', 'url'=>'/contrat/card.php?action=create&projectid='.$object->id.'&socid='.$object->socid), + 90 => array('lang'=>'trips', 'enabled'=>isModEnabled("expensereport"), 'perm'=>$user->hasRight('expensereport', 'creer'), 'label' => 'AddTrip', 'url'=>'/expensereport/card.php?action=create&projectid='.$object->id.'&socid='.$object->socid), + 100 => array('lang'=>'donations', 'enabled'=>isModEnabled("don"), 'perm'=>$user->hasRight('don', 'creer'), 'label' => 'AddDonation', 'url'=>'/don/card.php?action=create&projectid='.$object->id.'&socid='.$object->socid), + ); - if (!empty($conf->global->PROJECT_SHOW_CREATE_OBJECT_BUTTON)) { - print'"; + $params = array('backtopage' => $_SERVER["PHP_SELF"].'?id='.$object->id); + + print dolGetButtonAction($langs->trans("Create"), '', 'default', $arrayforbutaction, '', 1, $params); } + // Clone if ($user->rights->projet->creer) { if ($userWrite > 0) { diff --git a/htdocs/projet/tasks/list.php b/htdocs/projet/tasks/list.php index a860f1205c7..35e47f64604 100644 --- a/htdocs/projet/tasks/list.php +++ b/htdocs/projet/tasks/list.php @@ -1503,6 +1503,13 @@ while ($i < $imaxinloop) { } // Show total line +if (!empty($totalarray['totalizable']) && is_array($totalarray['totalizable'])) { + foreach ($totalarray['totalizable'] as $keytotalizable => $valtotalizable) { + $totalarray['pos'][$valtotalizable['pos']] = $keytotalizable; + $totalarray['val'][$keytotalizable] = $valtotalizable['total']; + } +} + if (isset($totalarray['totaldurationeffectivefield']) || isset($totalarray['totalplannedworkloadfield']) || isset($totalarray['totalprogress_calculatedfield']) || isset($totalarray['totaltobill']) || isset($totalarray['totalbilled']) || isset($totalarray['totalbudget'])) { print ''; @@ -1529,6 +1536,14 @@ if (isset($totalarray['totaldurationeffectivefield']) || isset($totalarray['tota print ''; } elseif ($totalarray['totalbudget_amountfield'] == $i) { print ''; + } elseif (!empty($totalarray['pos'][$i])) { + print ''; } else { print ''; } diff --git a/htdocs/societe/class/societe.class.php b/htdocs/societe/class/societe.class.php index 1912bd74521..a56fad2c086 100644 --- a/htdocs/societe/class/societe.class.php +++ b/htdocs/societe/class/societe.class.php @@ -4358,7 +4358,9 @@ class Societe extends CommonObject global $langs; $this->id = 0; + $this->entity = $conf->entity; $this->name = getDolGlobalString('MAIN_INFO_SOCIETE_NOM'); + $this->nom = $this->name; // deprecated $this->address = getDolGlobalString('MAIN_INFO_SOCIETE_ADDRESS'); $this->zip = getDolGlobalString('MAIN_INFO_SOCIETE_ZIP'); $this->town = getDolGlobalString('MAIN_INFO_SOCIETE_TOWN'); @@ -4368,8 +4370,6 @@ class Societe extends CommonObject $this->note_private = getDolGlobalString('MAIN_INFO_SOCIETE_NOTE'); - $this->nom = $this->name; // deprecated - // We define country_id, country_code and country $country_id = $country_code = $country_label = ''; if (!empty($conf->global->MAIN_INFO_SOCIETE_COUNTRY)) { diff --git a/htdocs/supplier_proposal/card.php b/htdocs/supplier_proposal/card.php index 9baa56d8193..79520727955 100644 --- a/htdocs/supplier_proposal/card.php +++ b/htdocs/supplier_proposal/card.php @@ -63,6 +63,9 @@ $ref = GETPOST('ref', 'alpha'); $socid = GETPOST('socid', 'int'); $action = GETPOST('action', 'aZ09'); $cancel = GETPOST('cancel', 'alpha'); +$backtopage = GETPOST('backtopage', 'alpha'); +$backtopageforcancel = GETPOST('backtopageforcancel', 'alpha'); + $origin = GETPOST('origin', 'alpha'); $originid = GETPOST('originid', 'int'); $confirm = GETPOST('confirm', 'alpha'); @@ -1251,6 +1254,7 @@ if ($action == 'create') { print ''; print ''; } + print ''; print dol_get_fiche_head(); @@ -1688,6 +1692,7 @@ if ($action == 'create') { print ''; print ''; print ''; + print ''; print $form->selectDate($object->delivery_date, 'liv_', '', '', '', "editdate_livraison"); print ''; print ''; @@ -1889,6 +1894,7 @@ if ($action == 'create') { + '; if (!empty($conf->use_javascript_ajax) && $object->statut == SupplierProposal::STATUS_DRAFT) { diff --git a/htdocs/theme/eldy/dropdown.inc.php b/htdocs/theme/eldy/dropdown.inc.php index b3f91901575..034b9974c23 100644 --- a/htdocs/theme/eldy/dropdown.inc.php +++ b/htdocs/theme/eldy/dropdown.inc.php @@ -501,6 +501,43 @@ div.quickaddblock:focus { background: ; } + +/* for the dropdown on action buttons */ +dropdown-holder { + position: relative; + display: inline-block; +} + +.dropdown-content { + display: none; + position: absolute; + z-index: 1; + width: 300px; + right:10px; /* will be set with js */ + background: #fff; + border: 1px solid #bbb; + text-align: +} + +.dropdown-content a { + margin-right: auto !important; + margin-left: auto !important; +} +.dropdown-content .butAction { + background: none; + color: #000 !important; +} +.dropdown-content .butAction:hover { + box-shadow: none; + text-decoration: underline; +} + +.dropdown-holder.open .dropdown-content { + display: block; +} + + + /* smartphone */ @media only screen and (max-width: 767px) { diff --git a/htdocs/theme/md/dropdown.inc.php b/htdocs/theme/md/dropdown.inc.php index eb1fd668361..a0d010a4461 100644 --- a/htdocs/theme/md/dropdown.inc.php +++ b/htdocs/theme/md/dropdown.inc.php @@ -435,6 +435,41 @@ a.dropdown-item { } +/* for the dropdown on action buttons */ +dropdown-holder { + position: relative; + display: inline-block; +} + +.dropdown-content { + display: none; + position: absolute; + z-index: 1; + width: 300px; + right:10px; /* will be set with js */ + background: #fff; + border: 1px solid #bbb; + text-align: +} + +.dropdown-content a { + margin-right: auto !important; + margin-left: auto !important; +} +.dropdown-content .butAction { + background: none; + color: #000 !important; +} +.dropdown-content .butAction:hover { + box-shadow: none; + text-decoration: underline; +} + +.dropdown-holder.open .dropdown-content { + display: block; +} + + /* smartphone */ @media only screen and (max-width: 767px) {
'; + print $form->selectUnits($search_units, 'search_units', 1); print '
'.convertSecondToTime($totalarray['totalbilled'], $plannedworkloadoutputformat).''.price($totalarray['totalbudgetamount'], 0, $langs, 1, 0, 0, $conf->currency).''; + if (isset($totalarray['type']) && $totalarray['type'][$i] == 'duration') { + print (!empty($totalarray['val'][$totalarray['pos'][$i]])?convertSecondToTime($totalarray['val'][$totalarray['pos'][$i]], 'allhourmin'):0); + } else { + print price(!empty($totalarray['val'][$totalarray['pos'][$i]])?$totalarray['val'][$totalarray['pos'][$i]]:0); + } + print '