46include_once DOL_DOCUMENT_ROOT.
'/core/lib/json.lib.php';
49if (!function_exists(
'utf8_encode')) {
56 function utf8_encode($elements)
58 return mb_convert_encoding($elements,
'UTF-8',
'ISO-8859-1');
62if (!function_exists(
'utf8_decode')) {
69 function utf8_decode($elements)
71 return mb_convert_encoding($elements,
'ISO-8859-1',
'UTF-8');
74if (!function_exists(
'str_starts_with')) {
82 function str_starts_with($haystack, $needle)
84 return (
string) $needle !==
'' && strncmp($haystack, $needle, strlen($needle)) === 0;
87if (!function_exists(
'str_ends_with')) {
95 function str_ends_with($haystack, $needle)
97 return $needle !==
'' && substr($haystack, -strlen($needle)) === (string) $needle;
100if (!function_exists(
'str_contains')) {
108 function str_contains($haystack, $needle)
110 return $needle !==
'' && mb_strpos($haystack, $needle) !==
false;
126 if (!is_object($object) && empty($module)) {
129 if (empty($module) && !empty($object->element)) {
130 $module = $object->element;
132 return $conf->$module->multidir_output[(!empty($object->entity) ? $object->entity : $conf->entity)];
146 return (
string) (isset($conf->global->$key) ? $conf->global->$key : $default);
160 return (
int) (isset($conf->global->$key) ? $conf->global->$key : $default);
173 if (empty($tmpuser)) {
179 return (
string) (empty($tmpuser->conf->$key) ? $default : $tmpuser->conf->$key);
192 if (empty($tmpuser)) {
198 return (
int) (empty($tmpuser->conf->$key) ? $default : $tmpuser->conf->$key);
207function isModEnabled($module)
214 'category' =>
'categorie',
215 'contract' =>
'contrat',
216 'project' =>
'projet',
217 'delivery_note' =>
'expedition'
219 if (empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD)) {
220 $arrayconv[
'supplier_order'] =
'fournisseur';
221 $arrayconv[
'supplier_invoice'] =
'fournisseur';
223 if (!empty($arrayconv[$module])) {
224 $module = $arrayconv[$module];
227 return !empty($conf->modules[$module]);
244 require_once DOL_DOCUMENT_ROOT.
"/core/db/".$type.
'.class.php';
246 $class =
'DoliDB'.ucfirst($type);
247 $dolidb =
new $class($type, $host, $user, $pass, $name, $port);
268function getEntity($element, $shared = 1, $currentobject =
null)
270 global $conf, $mc, $hookmanager, $object, $action, $db;
272 if (!is_object($hookmanager)) {
273 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
280 $element =
'project';
283 $element =
'contract';
285 case 'order_supplier':
286 $element =
'supplier_order';
288 case 'invoice_supplier':
289 $element =
'supplier_invoice';
293 if (is_object($mc)) {
294 $out = $mc->getEntity($element, $shared, $currentobject);
297 $addzero = array(
'user',
'usergroup',
'cronjob',
'c_email_templates',
'email_template',
'default_values',
'overwrite_trans');
298 if (in_array($element, $addzero)) {
301 $out .= ((int) $conf->entity);
306 'element' => $element,
309 'currentobject' => $currentobject,
312 $reshook = $hookmanager->executeHooks(
'hookGetEntity', $parameters, $currentobject, $action);
314 if (is_numeric($reshook)) {
315 if ($reshook == 0 && !empty($hookmanager->resPrint)) {
316 $out .=
','.$hookmanager->resPrint;
317 } elseif ($reshook == 1) {
318 $out = $hookmanager->resPrint;
335 if (is_object($mc) && method_exists($mc,
'setEntity')) {
336 return $mc->setEntity($currentobject);
338 return ((is_object($currentobject) && $currentobject->id > 0 && $currentobject->entity > 0) ? $currentobject->entity : $conf->entity);
350 return preg_match(
'/(_pass|password|_pw|_key|securekey|serverkey|secret\d?|p12key|exportkey|_PW_[a-z]+|token)$/i', $keyname);
362 for ($r =
""; $n >= 0; $n = intval($n / 26) - 1)
363 $r = chr($n % 26 + 0x41) . $r;
386 include_once DOL_DOCUMENT_ROOT.
'/includes/mobiledetect/mobiledetectlib/Mobile_Detect.php';
393 $user_agent = substr($user_agent, 0, 512);
395 $detectmobile =
new Mobile_Detect(
null, $user_agent);
396 $tablet = $detectmobile->isTablet();
398 if ($detectmobile->isMobile()) {
402 if ($detectmobile->is(
'AndroidOS')) {
403 $os = $phone =
'android';
404 } elseif ($detectmobile->is(
'BlackBerryOS')) {
405 $os = $phone =
'blackberry';
406 } elseif ($detectmobile->is(
'iOS')) {
409 } elseif ($detectmobile->is(
'PalmOS')) {
410 $os = $phone =
'palm';
411 } elseif ($detectmobile->is(
'SymbianOS')) {
413 } elseif ($detectmobile->is(
'webOS')) {
415 } elseif ($detectmobile->is(
'MaemoOS')) {
417 } elseif ($detectmobile->is(
'WindowsMobileOS') || $detectmobile->is(
'WindowsPhoneOS')) {
423 if (preg_match(
'/linux/i', $user_agent)) {
425 } elseif (preg_match(
'/macintosh/i', $user_agent)) {
427 } elseif (preg_match(
'/windows/i', $user_agent)) {
433 if (preg_match(
'/firefox(\/|\s)([\d\.]*)/i', $user_agent, $reg)) {
435 $version = empty($reg[2]) ?
'' : $reg[2];
436 } elseif (preg_match(
'/edge(\/|\s)([\d\.]*)/i', $user_agent, $reg)) {
438 $version = empty($reg[2]) ?
'' : $reg[2];
439 } elseif (preg_match(
'/chrome(\/|\s)([\d\.]+)/i', $user_agent, $reg)) {
441 $version = empty($reg[2]) ?
'' : $reg[2];
442 } elseif (preg_match(
'/chrome/i', $user_agent, $reg)) {
445 } elseif (preg_match(
'/iceweasel/i', $user_agent)) {
447 } elseif (preg_match(
'/epiphany/i', $user_agent)) {
449 } elseif (preg_match(
'/safari(\/|\s)([\d\.]*)/i', $user_agent, $reg)) {
451 $version = empty($reg[2]) ?
'' : $reg[2];
452 } elseif (preg_match(
'/opera(\/|\s)([\d\.]*)/i', $user_agent, $reg)) {
455 $version = empty($reg[2]) ?
'' : $reg[2];
456 } elseif (preg_match(
'/(MSIE\s([0-9]+\.[0-9]))|.*(Trident\/[0-9]+.[0-9];.*rv:([0-9]+\.[0-9]+))/i', $user_agent, $reg)) {
458 $version = end($reg);
459 } elseif (preg_match(
'/(Windows NT\s([0-9]+\.[0-9])).*(Trident\/[0-9]+.[0-9];.*rv:([0-9]+\.[0-9]+))/i', $user_agent, $reg)) {
462 $version = end($reg);
463 } elseif (preg_match(
'/l[iy]n(x|ks)(\(|\/|\s)*([\d\.]+)/i', $user_agent, $reg)) {
466 $version = empty($reg[3]) ?
'' : $reg[3];
478 'browsername' => $name,
479 'browserversion' => $version,
481 'browserua' => $user_agent,
495 global $user, $langs, $db;
496 $disconnectdone =
false;
498 if (is_object($db) && !empty($db->connected)) {
499 $depth = $db->transaction_opened;
500 $disconnectdone = $db->close();
502 dol_syslog(
"--- End access to ".$_SERVER[
"PHP_SELF"].(($disconnectdone && $depth) ?
' (Warn: db disconnection forced, transaction depth was '.$depth.
')' :
''), (($disconnectdone && $depth) ? LOG_WARNING : LOG_INFO));
514function GETPOSTISSET($paramname)
518 $relativepathstring = $_SERVER[
"PHP_SELF"];
520 if (constant(
'DOL_URL_ROOT')) {
521 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
523 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
524 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
530 if (!empty($_GET[
'restore_lastsearch_values'])) {
531 if (!empty($_SESSION[
'lastsearch_values_'.$relativepathstring])) {
532 $tmp = json_decode($_SESSION[
'lastsearch_values_'.$relativepathstring],
true);
533 if (is_array($tmp)) {
534 foreach ($tmp as $key => $val) {
535 if ($key == $paramname) {
543 if ($paramname ==
'contextpage' && !empty($_SESSION[
'lastsearch_contextpage_'.$relativepathstring])) {
545 } elseif ($paramname ==
'limit' && !empty($_SESSION[
'lastsearch_limit_'.$relativepathstring])) {
547 } elseif ($paramname ==
'page' && !empty($_SESSION[
'lastsearch_page_'.$relativepathstring])) {
549 } elseif ($paramname ==
'mode' && !empty($_SESSION[
'lastsearch_mode_'.$relativepathstring])) {
553 $isset = (isset($_POST[$paramname]) || isset($_GET[$paramname]));
570 if (empty($method)) {
571 $val = isset($_GET[$paramname]) ? $_GET[$paramname] : (isset($_POST[$paramname]) ? $_POST[$paramname] :
'');
572 } elseif ($method == 1) {
573 $val = isset($_GET[$paramname]) ? $_GET[$paramname] :
'';
574 } elseif ($method == 2) {
575 $val = isset($_POST[$paramname]) ? $_POST[$paramname] :
'';
576 } elseif ($method == 3) {
577 $val = isset($_POST[$paramname]) ? $_POST[$paramname] : (isset($_GET[$paramname]) ? $_GET[$paramname] :
'');
579 $val =
'BadFirstParameterForGETPOST';
582 return is_array($val);
614function GETPOST($paramname, $check =
'alphanohtml', $method = 0, $filter =
null, $options =
null, $noreplace = 0)
616 global $mysoc, $user, $conf;
618 if (empty($paramname)) {
619 return 'BadFirstParameterForGETPOST';
622 dol_syslog(
"Deprecated use of GETPOST, called with 1st param = ".$paramname.
" and 2nd param is '', when calling page ".$_SERVER[
"PHP_SELF"], LOG_WARNING);
627 if (empty($method)) {
628 $out = isset($_GET[$paramname]) ? $_GET[$paramname] : (isset($_POST[$paramname]) ? $_POST[$paramname] :
'');
629 } elseif ($method == 1) {
630 $out = isset($_GET[$paramname]) ? $_GET[$paramname] :
'';
631 } elseif ($method == 2) {
632 $out = isset($_POST[$paramname]) ? $_POST[$paramname] :
'';
633 } elseif ($method == 3) {
634 $out = isset($_POST[$paramname]) ? $_POST[$paramname] : (isset($_GET[$paramname]) ? $_GET[$paramname] :
'');
636 return 'BadThirdParameterForGETPOST';
639 if (empty($method) || $method == 3 || $method == 4) {
640 $relativepathstring = $_SERVER[
"PHP_SELF"];
642 if (constant(
'DOL_URL_ROOT')) {
643 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
645 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
646 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
652 if (!empty($_GET[
'restore_lastsearch_values'])) {
653 if (!empty($_SESSION[
'lastsearch_values_'.$relativepathstring])) {
654 $tmp = json_decode($_SESSION[
'lastsearch_values_'.$relativepathstring],
true);
655 if (is_array($tmp)) {
656 foreach ($tmp as $key => $val) {
657 if ($key == $paramname) {
665 if ($paramname ==
'contextpage' && !empty($_SESSION[
'lastsearch_contextpage_'.$relativepathstring])) {
666 $out = $_SESSION[
'lastsearch_contextpage_'.$relativepathstring];
667 } elseif ($paramname ==
'limit' && !empty($_SESSION[
'lastsearch_limit_'.$relativepathstring])) {
668 $out = $_SESSION[
'lastsearch_limit_'.$relativepathstring];
669 } elseif ($paramname ==
'page' && !empty($_SESSION[
'lastsearch_page_'.$relativepathstring])) {
670 $out = $_SESSION[
'lastsearch_page_'.$relativepathstring];
671 } elseif ($paramname ==
'mode' && !empty($_SESSION[
'lastsearch_mode_'.$relativepathstring])) {
672 $out = $_SESSION[
'lastsearch_mode_'.$relativepathstring];
674 } elseif (!isset($_GET[
'sortfield'])) {
677 if (!empty($_GET[
'action']) && $_GET[
'action'] ==
'create' && !isset($_GET[$paramname]) && !isset($_POST[$paramname])) {
680 if (is_object($object) && isset($object->fields[$paramname][
'default'])) {
681 $out = $object->fields[$paramname][
'default'];
684 if (!empty($conf->global->MAIN_ENABLE_DEFAULT_VALUES)) {
685 if (!empty($_GET[
'action']) && (preg_match(
'/^create/', $_GET[
'action']) || preg_match(
'/^presend/', $_GET[
'action'])) && !isset($_GET[$paramname]) && !isset($_POST[$paramname])) {
687 if (!empty($user->default_values)) {
688 if (isset($user->default_values[$relativepathstring][
'createform'])) {
689 foreach ($user->default_values[$relativepathstring][
'createform'] as $defkey => $defval) {
691 if ($defkey !=
'_noquery_') {
692 $tmpqueryarraytohave = explode(
'&', $defkey);
695 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
696 if (!in_array($tmpquerytohave, $tmpqueryarraywehave)) {
709 if (isset($user->default_values[$relativepathstring][
'createform'][$defkey][$paramname])) {
710 $out = $user->default_values[$relativepathstring][
'createform'][$defkey][$paramname];
717 } elseif (!empty($paramname) && !isset($_GET[$paramname]) && !isset($_POST[$paramname])) {
719 if (!empty($user->default_values)) {
722 if ($paramname ==
'sortfield' || $paramname ==
'sortorder') {
724 if (isset($user->default_values[$relativepathstring][
'sortorder'])) {
726 foreach ($user->default_values[$relativepathstring][
'sortorder'] as $defkey => $defval) {
728 if ($defkey !=
'_noquery_') {
729 $tmpqueryarraytohave = explode(
'&', $defkey);
732 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
733 if (!in_array($tmpquerytohave, $tmpqueryarraywehave)) {
746 $forbidden_chars_to_replace = array(
" ",
"'",
"/",
"\\",
":",
"*",
"?",
"\"",
"<",
">",
"|",
"[",
"]",
";",
"=");
747 foreach ($user->default_values[$relativepathstring][
'sortorder'][$defkey] as $key => $val) {
751 if ($paramname ==
'sortfield') {
754 if ($paramname ==
'sortorder') {
762 } elseif (isset($user->default_values[$relativepathstring][
'filters'])) {
763 foreach ($user->default_values[$relativepathstring][
'filters'] as $defkey => $defval) {
764 if (!empty($_GET[
'disabledefaultvalues'])) {
768 if ($defkey !=
'_noquery_') {
769 $tmpqueryarraytohave = explode(
'&', $defkey);
772 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
773 if (!in_array($tmpquerytohave, $tmpqueryarraywehave)) {
785 if ($qualified && isset($user->default_values[$relativepathstring][
'filters'][$defkey][$paramname])) {
787 if (isset($_POST[
'sall']) || isset($_POST[
'search_all']) || isset($_GET[
'sall']) || isset($_GET[
'search_all'])) {
789 if (empty($conf->global->MAIN_DISABLE_DEFAULT_FILTER_FOR_QUICK_SEARCH)) {
790 $forbidden_chars_to_replace = array(
" ",
"'",
"/",
"\\",
":",
"*",
"?",
"\"",
"<",
">",
"|",
"[",
"]",
";",
"=");
791 $out =
dol_string_nospecial($user->default_values[$relativepathstring][
'filters'][$defkey][$paramname],
'', $forbidden_chars_to_replace);
794 $forbidden_chars_to_replace = array(
" ",
"'",
"/",
"\\",
":",
"*",
"?",
"\"",
"<",
">",
"|",
"[",
"]",
";",
"=");
795 $out =
dol_string_nospecial($user->default_values[$relativepathstring][
'filters'][$defkey][$paramname],
'', $forbidden_chars_to_replace);
810 if (!is_array($out) && empty($_POST[$paramname]) && empty($noreplace)) {
814 while (preg_match(
'/__([A-Z0-9]+_?[A-Z0-9]+)__/i', $out, $reg) && ($loopnb < $maxloop)) {
818 if ($reg[1] ==
'DAY') {
820 $newout = $tmp[
'mday'];
821 } elseif ($reg[1] ==
'MONTH') {
823 $newout = $tmp[
'mon'];
824 } elseif ($reg[1] ==
'YEAR') {
826 $newout = $tmp[
'year'];
827 } elseif ($reg[1] ==
'PREVIOUS_DAY') {
830 $newout = $tmp2[
'day'];
831 } elseif ($reg[1] ==
'PREVIOUS_MONTH') {
834 $newout = $tmp2[
'month'];
835 } elseif ($reg[1] ==
'PREVIOUS_YEAR') {
837 $newout = ($tmp[
'year'] - 1);
838 } elseif ($reg[1] ==
'NEXT_DAY') {
841 $newout = $tmp2[
'day'];
842 } elseif ($reg[1] ==
'NEXT_MONTH') {
845 $newout = $tmp2[
'month'];
846 } elseif ($reg[1] ==
'NEXT_YEAR') {
848 $newout = ($tmp[
'year'] + 1);
849 } elseif ($reg[1] ==
'MYCOMPANY_COUNTRY_ID' || $reg[1] ==
'MYCOUNTRY_ID' || $reg[1] ==
'MYCOUNTRYID') {
850 $newout = $mysoc->country_id;
851 } elseif ($reg[1] ==
'USER_ID' || $reg[1] ==
'USERID') {
853 } elseif ($reg[1] ==
'USER_SUPERVISOR_ID' || $reg[1] ==
'SUPERVISOR_ID' || $reg[1] ==
'SUPERVISORID') {
854 $newout = $user->fk_user;
855 } elseif ($reg[1] ==
'ENTITY_ID' || $reg[1] ==
'ENTITYID') {
856 $newout = $conf->entity;
861 $out = preg_replace(
'/__'.preg_quote($reg[1],
'/').
'__/', $newout, $out);
866 if (preg_match(
'/^array/', $check)) {
867 if (!is_array($out) || empty($out)) {
870 $tmparray = explode(
':', $check);
871 if (!empty($tmparray[1])) {
872 $tmpcheck = $tmparray[1];
874 $tmpcheck =
'alphanohtml';
876 foreach ($out as $outkey => $outval) {
877 $out[$outkey] =
sanitizeVal($outval, $tmpcheck, $filter, $options);
883 if (strpos($paramname,
'search_') === 0) {
884 $out = preg_replace(
'/([<>])([-+]?\d)/',
'\1 \2', $out);
887 $out =
sanitizeVal($out, $check, $filter, $options);
892 if ($paramname ==
'backtopage' || $paramname ==
'backtolist' || $paramname ==
'backtourl') {
893 $out = str_replace(
'\\',
'/', $out);
894 $out = str_replace(array(
':',
';',
'@',
"\t",
' '),
'', $out);
896 $oldstringtoclean = $out;
897 $out = str_ireplace(array(
'javascript',
'vbscript',
'&colon',
'&#'),
'', $out);
898 $out = preg_replace(array(
'/^[^\?]*%/'),
'', $out);
899 $out = preg_replace(array(
'/^[a-z]*\/\s*\/+/i'),
'', $out);
900 }
while ($oldstringtoclean != $out);
905 if (empty($method) || $method == 3 || $method == 4) {
906 if (preg_match(
'/^search_/', $paramname) || in_array($paramname, array(
'sortorder',
'sortfield'))) {
913 if ($out !=
'' && isset($user)) {
914 $user->lastsearch_values_tmp[$relativepathstring][$paramname] = $out;
933 return (
int)
GETPOST($paramname,
'int', $method,
null,
null, 0);
947function checkVal($out =
'', $check =
'alphanohtml', $filter =
null, $options =
null)
949 return sanitizeVal($out, $check, $filter, $options);
961function sanitizeVal($out =
'', $check =
'alphanohtml', $filter =
null, $options =
null)
969 if (!is_numeric($out)) {
974 if (is_array($out)) {
975 $out = implode(
',', $out);
977 if (preg_match(
'/[^0-9,-]+/i', $out)) {
982 $out = filter_var($out, FILTER_SANITIZE_STRING);
985 $out = filter_var($out, FILTER_SANITIZE_EMAIL);
988 if (!is_array($out)) {
990 if (preg_match(
'/[^a-z]+/i', $out)) {
996 if (!is_array($out)) {
998 if (preg_match(
'/[^a-z0-9_\-\.]+/i', $out)) {
1004 if (!is_array($out)) {
1006 if (preg_match(
'/[^a-z0-9_\-\.@]+/i', $out)) {
1012 if (!is_array($out)) {
1014 if (preg_match(
'/[^a-z0-9_\-\.,]+/i', $out)) {
1021 if (!is_array($out)) {
1024 $oldstringtoclean = $out;
1031 $out = str_ireplace(array(
'&',
'&',
'&',
'"',
'"',
'"',
'"',
'"',
'/',
'/',
'\',
'\',
'/',
'../',
'..\\'),
'', $out);
1032 }
while ($oldstringtoclean != $out);
1036 case 'alphawithlgt':
1037 if (!is_array($out)) {
1040 $oldstringtoclean = $out;
1046 $out = str_ireplace(array(
'&',
'&',
'&',
'"',
'"',
'"',
'"',
'"',
'/',
'/',
'\',
'\',
'/',
'../',
'..\\'),
'', $out);
1047 }
while ($oldstringtoclean != $out);
1053 case 'restricthtmlnolink':
1054 case 'restricthtml':
1055 case 'restricthtmlallowclass':
1056 case 'restricthtmlallowunvalid':
1061 if (empty($filter)) {
1062 return 'BadParameterForGETPOST - Param 3 of sanitizeVal()';
1067 $out = filter_var($out, $filter, $options);
1076if (!function_exists(
'dol_getprefix')) {
1086 function dol_getprefix($mode =
'')
1089 if ($mode ==
'email') {
1092 if (!empty($conf->global->MAIL_PREFIX_FOR_EMAIL_ID)) {
1093 if ($conf->global->MAIL_PREFIX_FOR_EMAIL_ID !=
'SERVER_NAME') {
1094 return $conf->global->MAIL_PREFIX_FOR_EMAIL_ID;
1095 } elseif (isset($_SERVER[
"SERVER_NAME"])) {
1096 return $_SERVER[
"SERVER_NAME"];
1101 if (!empty($conf->file->instance_unique_id)) {
1102 return sha1(
'dolibarr'.$conf->file->instance_unique_id);
1106 return sha1(DOL_DOCUMENT_ROOT.DOL_URL_ROOT);
1110 global $dolibarr_main_instance_unique_id, $dolibarr_main_cookie_cryptkey;
1111 $tmp_instance_unique_id = empty($dolibarr_main_instance_unique_id) ? (empty($dolibarr_main_cookie_cryptkey) ?
'' : $dolibarr_main_cookie_cryptkey) : $dolibarr_main_instance_unique_id;
1114 if (!empty($tmp_instance_unique_id)) {
1115 return sha1(
'dolibarr'.$tmp_instance_unique_id);
1119 if (isset($_SERVER[
"SERVER_NAME"]) && isset($_SERVER[
"DOCUMENT_ROOT"])) {
1120 return sha1($_SERVER[
"SERVER_NAME"].$_SERVER[
"DOCUMENT_ROOT"].DOL_DOCUMENT_ROOT.DOL_URL_ROOT);
1122 return sha1(DOL_DOCUMENT_ROOT.DOL_URL_ROOT);
1139 global $conf, $langs, $user, $mysoc;
1143 if (!file_exists($fullpath)) {
1144 dol_syslog(
'functions::dol_include_once Tried to load unexisting file: '.$relpath, LOG_WARNING);
1148 if (!empty($classname) && !class_exists($classname)) {
1149 return include $fullpath;
1151 return include_once $fullpath;
1170 $path = preg_replace(
'/^\//',
'', $path);
1173 $res = DOL_DOCUMENT_ROOT.
'/'.$path;
1174 if (is_array($conf->file->dol_document_root)) {
1175 foreach ($conf->file->dol_document_root as $key => $dirroot) {
1176 if ($key ==
'main') {
1180 if (@file_exists($dirroot.
'/'.$path)) {
1181 $res = $dirroot.
'/'.$path;
1186 if ($returnemptyifnotfound) {
1188 if ($returnemptyifnotfound == 1 || !file_exists($res)) {
1200 $res = DOL_URL_ROOT.
'/'.$path;
1203 $res = DOL_MAIN_URL_ROOT.
'/'.$path;
1206 $res = DOL_URL_ROOT.
'/'.$path;
1209 foreach ($conf->file->dol_document_root as $key => $dirroot) {
1210 if ($key ==
'main') {
1212 global $dolibarr_main_url_root;
1215 $urlwithouturlroot = preg_replace(
'/'.preg_quote(DOL_URL_ROOT,
'/').
'$/i',
'', trim($dolibarr_main_url_root));
1216 $urlwithroot = $urlwithouturlroot.DOL_URL_ROOT;
1219 $res = (preg_match(
'/^http/i', $conf->file->dol_url_root[$key]) ?
'' : $urlwithroot).
'/'.$path;
1224 preg_match(
'/^([^\?]+(\.css\.php|\.css|\.js\.php|\.js|\.png|\.jpg|\.php)?)/i', $path, $regs);
1225 if (!empty($regs[1])) {
1228 if (@file_exists($dirroot.
'/'.$regs[1])) {
1230 $res = (preg_match(
'/^http/i', $conf->file->dol_url_root[$key]) ?
'' : DOL_URL_ROOT).$conf->file->dol_url_root[$key].
'/'.$path;
1233 $res = (preg_match(
'/^http/i', $conf->file->dol_url_root[$key]) ?
'' : DOL_MAIN_URL_ROOT).$conf->file->dol_url_root[$key].
'/'.$path;
1236 global $dolibarr_main_url_root;
1239 $urlwithouturlroot = preg_replace(
'/'.preg_quote(DOL_URL_ROOT,
'/').
'$/i',
'', trim($dolibarr_main_url_root));
1240 $urlwithroot = $urlwithouturlroot.DOL_URL_ROOT;
1243 $res = (preg_match(
'/^http/i', $conf->file->dol_url_root[$key]) ?
'' : $urlwithroot).$conf->file->dol_url_root[$key].
'/'.$path;
1270 if (isset($object->db) && isset($object->db->db) && is_object($object->db->db) && get_class($object->db->db) ==
'PgSql\Connection') {
1271 $tmpsavdb = $object->db;
1275 $myclone = unserialize(serialize($object));
1277 if (!empty($tmpsavdb)) {
1278 $object->db = $tmpsavdb;
1280 } elseif ($native == 2) {
1282 $myclone =
new stdClass();
1283 $tmparray = get_object_vars($object);
1285 if (is_array($tmparray)) {
1286 foreach ($tmparray as $propertykey => $propertyval) {
1287 if (is_scalar($propertyval) || is_array($propertyval)) {
1288 $myclone->$propertykey = $propertyval;
1293 $myclone = clone $object;
1311 if (empty($conf->dol_optimize_smallscreen)) {
1314 if ($type ==
'width' && $size > 250) {
1339 $filesystem_forbidden_chars = array(
'<',
'>',
'/',
'\\',
'?',
'*',
'|',
'"',
':',
'°',
'$',
';',
'`');
1341 $tmp = preg_replace(
'/\-\-+/',
'_', $tmp);
1342 $tmp = preg_replace(
'/\s+\-([^\s])/',
' _$1', $tmp);
1343 $tmp = preg_replace(
'/\s+\-$/',
'', $tmp);
1344 $tmp = str_replace(
'..',
'', $tmp);
1364 $filesystem_forbidden_chars = array(
'<',
'>',
'?',
'*',
'|',
'"',
'°',
'$',
';',
'`');
1366 $tmp = preg_replace(
'/\-\-+/',
'_', $tmp);
1367 $tmp = preg_replace(
'/\s+\-([^\s])/',
' _$1', $tmp);
1368 $tmp = preg_replace(
'/\s+\-$/',
'', $tmp);
1369 $tmp = str_replace(
'..',
'', $tmp);
1384 $stringtoclean = preg_replace(
'/[\x00-\x1F\x7F]/u',
'', $stringtoclean);
1386 $stringtoclean = preg_replace(
'/<!--[^>]*-->/',
'', $stringtoclean);
1388 $stringtoclean = str_replace(
'\\',
'/', $stringtoclean);
1392 $stringtoclean = str_replace(array(
':',
';',
'@'),
'', $stringtoclean);
1396 $oldstringtoclean = $stringtoclean;
1399 $stringtoclean = str_ireplace(array(
'javascript',
'vbscript',
'&colon',
'&#'),
'', $stringtoclean);
1400 }
while ($oldstringtoclean != $stringtoclean);
1404 $stringtoclean = preg_replace(array(
'/^[a-z]*\/\/+/i'),
'', $stringtoclean);
1407 return $stringtoclean;
1419 $oldstringtoclean = $stringtoclean;
1420 $stringtoclean = str_ireplace(array(
'"',
':',
'[',
']',
"\n",
"\r",
'\\',
'\/'),
'', $stringtoclean);
1421 }
while ($oldstringtoclean != $stringtoclean);
1423 return $stringtoclean;
1438 if (is_null($str)) {
1443 if (extension_loaded(
'intl') && !empty($conf->global->MAIN_UNACCENT_USE_TRANSLITERATOR)) {
1444 $transliterator = Transliterator::createFromRules(
':: Any-Latin; :: Latin-ASCII; :: NFD; :: [:Nonspacing Mark:] Remove; :: NFC;', Transliterator::FORWARD);
1445 return $transliterator->transliterate($str);
1448 $string = rawurlencode($str);
1449 $replacements = array(
1450 '%C3%80' =>
'A',
'%C3%81' =>
'A',
'%C3%82' =>
'A',
'%C3%83' =>
'A',
'%C3%84' =>
'A',
'%C3%85' =>
'A',
1452 '%C3%88' =>
'E',
'%C3%89' =>
'E',
'%C3%8A' =>
'E',
'%C3%8B' =>
'E',
1453 '%C3%8C' =>
'I',
'%C3%8D' =>
'I',
'%C3%8E' =>
'I',
'%C3%8F' =>
'I',
1455 '%C3%92' =>
'O',
'%C3%93' =>
'O',
'%C3%94' =>
'O',
'%C3%95' =>
'O',
'%C3%96' =>
'O',
1457 '%C3%99' =>
'U',
'%C3%9A' =>
'U',
'%C3%9B' =>
'U',
'%C3%9C' =>
'U',
1458 '%C3%9D' =>
'Y',
'%C5%B8' =>
'y',
1459 '%C3%A0' =>
'a',
'%C3%A1' =>
'a',
'%C3%A2' =>
'a',
'%C3%A3' =>
'a',
'%C3%A4' =>
'a',
'%C3%A5' =>
'a',
1461 '%C3%A8' =>
'e',
'%C3%A9' =>
'e',
'%C3%AA' =>
'e',
'%C3%AB' =>
'e',
1462 '%C3%AC' =>
'i',
'%C3%AD' =>
'i',
'%C3%AE' =>
'i',
'%C3%AF' =>
'i',
1464 '%C3%B2' =>
'o',
'%C3%B3' =>
'o',
'%C3%B4' =>
'o',
'%C3%B5' =>
'o',
'%C3%B6' =>
'o',
1466 '%C3%B9' =>
'u',
'%C3%BA' =>
'u',
'%C3%BB' =>
'u',
'%C3%BC' =>
'u',
1467 '%C3%BD' =>
'y',
'%C3%BF' =>
'y'
1469 $string = strtr($string, $replacements);
1470 return rawurldecode($string);
1475 "\xC0\xC1\xC2\xC3\xC4\xC5\xC7
1476 \xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1
1477 \xD2\xD3\xD4\xD5\xD8\xD9\xDA\xDB\xDD
1478 \xE0\xE1\xE2\xE3\xE4\xE5\xE7\xE8\xE9\xEA\xEB
1479 \xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF8
1480 \xF9\xFA\xFB\xFC\xFD\xFF",
1488 $string = strtr($string, array(
"\xC4"=>
"Ae",
"\xC6"=>
"AE",
"\xD6"=>
"Oe",
"\xDC"=>
"Ue",
"\xDE"=>
"TH",
"\xDF"=>
"ss",
"\xE4"=>
"ae",
"\xE6"=>
"ae",
"\xF6"=>
"oe",
"\xFC"=>
"ue",
"\xFE"=>
"th"));
1506function dol_string_nospecial($str, $newstr =
'_', $badcharstoreplace =
'', $badcharstoremove =
'', $keepspaces = 0)
1508 $forbidden_chars_to_replace = array(
"'",
"/",
"\\",
":",
"*",
"?",
"\"",
"<",
">",
"|",
"[",
"]",
",",
";",
"=",
'°',
'$',
';');
1509 if (empty($keepspaces)) {
1510 $forbidden_chars_to_replace[] =
" ";
1512 $forbidden_chars_to_remove = array();
1515 if (is_array($badcharstoreplace)) {
1516 $forbidden_chars_to_replace = $badcharstoreplace;
1518 if (is_array($badcharstoremove)) {
1519 $forbidden_chars_to_remove = $badcharstoremove;
1522 return str_replace($forbidden_chars_to_replace, $newstr, str_replace($forbidden_chars_to_remove,
"", $str));
1541 if ($removetabcrlf) {
1542 return preg_replace(
'/[\x00-\x1F\x7F]/u',
'', $str);
1544 return preg_replace(
'/[\x00-\x08\x11-\x12\x14-\x1F\x7F]/u',
'', $str);
1558 if (is_null($stringtoescape)) {
1563 $substitjs = array(
"'"=>
"\\'",
"\r"=>
'\\r');
1565 if (empty($noescapebackslashn)) {
1566 $substitjs[
"\n"] =
'\\n';
1567 $substitjs[
'\\'] =
'\\\\';
1570 $substitjs[
"'"] =
"\\'";
1571 $substitjs[
'"'] =
"\\'";
1572 } elseif ($mode == 1) {
1573 $substitjs[
"'"] =
"\\'";
1574 } elseif ($mode == 2) {
1575 $substitjs[
'"'] =
'\\"';
1576 } elseif ($mode == 3) {
1577 $substitjs[
"'"] =
"\\'";
1578 $substitjs[
'"'] =
"\\\"";
1580 return strtr($stringtoescape, $substitjs);
1591 return str_replace(
'"',
'\"', $stringtoescape);
1647function dol_escape_htmltag($stringtoescape, $keepb = 0, $keepn = 0, $noescapetags =
'', $escapeonlyhtmltags = 0, $cleanalsojavascript = 0)
1649 if ($noescapetags ==
'common') {
1650 $noescapetags =
'html,body,a,b,em,hr,i,u,ul,li,br,div,img,font,p,span,strong,table,tr,td,th,tbody';
1652 if ($cleanalsojavascript) {
1657 if ($escapeonlyhtmltags) {
1658 $tmp = htmlspecialchars_decode((
string) $stringtoescape, ENT_COMPAT);
1660 $tmp = html_entity_decode((
string) $stringtoescape, ENT_COMPAT,
'UTF-8');
1663 $tmp = strtr($tmp, array(
"<b>"=>
'',
'</b>'=>
'',
'<strong>'=>
'',
'</strong>'=>
''));
1666 $tmp = strtr($tmp, array(
"\r"=>
'\\r',
"\n"=>
'\\n'));
1669 if ($escapeonlyhtmltags) {
1670 return htmlspecialchars($tmp, ENT_COMPAT,
'UTF-8');
1674 $tmparrayoftags = array();
1675 if ($noescapetags) {
1676 $tmparrayoftags = explode(
',', $noescapetags);
1678 if (count($tmparrayoftags)) {
1679 foreach ($tmparrayoftags as $tagtoreplace) {
1680 $tmp = str_ireplace(
'<'.$tagtoreplace.
'>',
'__BEGINTAGTOREPLACE'.$tagtoreplace.
'__', $tmp);
1681 $tmp = str_ireplace(
'</'.$tagtoreplace.
'>',
'__ENDTAGTOREPLACE'.$tagtoreplace.
'__', $tmp);
1682 $tmp = str_ireplace(
'<'.$tagtoreplace.
' />',
'__BEGINENDTAGTOREPLACE'.$tagtoreplace.
'__', $tmp);
1686 $result = htmlentities($tmp, ENT_COMPAT,
'UTF-8');
1688 if (count($tmparrayoftags)) {
1689 foreach ($tmparrayoftags as $tagtoreplace) {
1690 $result = str_ireplace(
'__BEGINTAGTOREPLACE'.$tagtoreplace.
'__',
'<'.$tagtoreplace.
'>', $result);
1691 $result = str_ireplace(
'__ENDTAGTOREPLACE'.$tagtoreplace.
'__',
'</'.$tagtoreplace.
'>', $result);
1692 $result = str_ireplace(
'__BEGINENDTAGTOREPLACE'.$tagtoreplace.
'__',
'<'.$tagtoreplace.
' />', $result);
1709 if (function_exists(
'mb_strtolower')) {
1710 return mb_strtolower($string, $encoding);
1712 return strtolower($string);
1726 if (function_exists(
'mb_strtoupper')) {
1727 return mb_strtoupper($string, $encoding);
1729 return strtoupper($string);
1743 if (function_exists(
'mb_substr')) {
1744 return mb_strtoupper(mb_substr($string, 0, 1, $encoding), $encoding).mb_substr($string, 1,
null, $encoding);
1746 return ucfirst($string);
1760 if (function_exists(
'mb_convert_case')) {
1761 return mb_convert_case($string, MB_CASE_TITLE, $encoding);
1763 return ucwords($string);
1788function dol_syslog($message, $level = LOG_INFO, $ident = 0, $suffixinfilename =
'', $restricttologhandler =
'', $logcontext =
null)
1790 global $conf, $user, $debugbar;
1793 if (!isModEnabled(
'syslog')) {
1798 if (defined(
'USEEXTERNALSERVER') && !defined(
'USEDOLIBARRSERVER') && !defined(
'USEDOLIBARREDITOR')) {
1799 global $website, $websitekey;
1800 if (is_object($website) && !empty($website->ref)) {
1801 $suffixinfilename .=
'_website_'.$website->ref;
1802 } elseif (!empty($websitekey)) {
1803 $suffixinfilename .=
'_website_'.$websitekey;
1808 if (defined(
'USESUFFIXINLOG')) {
1809 $suffixinfilename .= constant(
'USESUFFIXINLOG');
1813 foreach ($conf->loghandlers as $loghandlerinstance) {
1814 $loghandlerinstance->setIdent($ident);
1818 if (!empty($message)) {
1820 $logLevels = array(LOG_EMERG=>
'EMERG', LOG_ALERT=>
'ALERT', LOG_CRIT=>
'CRITICAL', LOG_ERR=>
'ERR', LOG_WARNING=>
'WARN', LOG_NOTICE=>
'NOTICE', LOG_INFO=>
'INFO', LOG_DEBUG=>
'DEBUG');
1822 if (!array_key_exists($level, $logLevels)) {
1823 dol_syslog(
'Error Bad Log Level '.$level, LOG_ERR);
1824 $level = $logLevels[LOG_ERR];
1830 if (empty($conf->global->MAIN_SHOW_PASSWORD_INTO_LOG)) {
1831 $message = preg_replace(
'/password=\'[^\']*\'/',
'password=\'hidden\'', $message);
1835 if ((!empty($_REQUEST[
'logtohtml']) && !empty($conf->global->MAIN_ENABLE_LOG_TO_HTML))
1836 || (!empty($user->rights->debugbar->read) && is_object($debugbar))) {
1837 $conf->logbuffer[] =
dol_print_date(time(),
"%Y-%m-%d %H:%M:%S").
" ".$logLevels[$level].
" ".$message;
1842 if (!empty($conf->global->MAIN_ENABLE_LOG_INLINE_HTML) && !empty($_GET[
"log"])) {
1843 print
"\n\n<!-- Log start\n";
1845 print
"Log end -->\n";
1849 'message' => $message,
1850 'script' => (isset($_SERVER[
'PHP_SELF']) ? basename($_SERVER[
'PHP_SELF'],
'.php') :
false),
1852 'user' => ((is_object($user) && $user->id) ? $user->login :
false),
1857 if (!empty($remoteip)) {
1858 $data[
'ip'] = $remoteip;
1860 if (!empty($_SERVER[
'HTTP_X_FORWARDED_FOR']) && $_SERVER[
'HTTP_X_FORWARDED_FOR'] != $remoteip) {
1861 $data[
'ip'] = $_SERVER[
'HTTP_X_FORWARDED_FOR'].
' -> '.$data[
'ip'];
1862 } elseif (!empty($_SERVER[
'HTTP_CLIENT_IP']) && $_SERVER[
'HTTP_CLIENT_IP'] != $remoteip) {
1863 $data[
'ip'] = $_SERVER[
'HTTP_CLIENT_IP'].
' -> '.$data[
'ip'];
1865 } elseif (!empty($_SERVER[
'SERVER_ADDR'])) {
1867 $data[
'ip'] = $_SERVER[
'SERVER_ADDR'];
1868 } elseif (!empty($_SERVER[
'COMPUTERNAME'])) {
1870 $data[
'ip'] = $_SERVER[
'COMPUTERNAME'].(empty($_SERVER[
'USERNAME']) ?
'' :
'@'.$_SERVER[
'USERNAME']);
1871 } elseif (!empty($_SERVER[
'LOGNAME'])) {
1873 $data[
'ip'] =
'???@'.$_SERVER[
'LOGNAME'];
1877 foreach ($conf->loghandlers as $loghandlerinstance) {
1878 if ($restricttologhandler && $loghandlerinstance->code != $restricttologhandler) {
1881 $loghandlerinstance->export($data, $suffixinfilename);
1887 foreach ($conf->loghandlers as $loghandlerinstance) {
1888 $loghandlerinstance->setIdent($ident);
1909function dolButtonToOpenUrlInDialogPopup($name, $label, $buttonstring, $url, $disabled =
'', $morecss =
'classlink button bordertransp', $jsonopen =
'', $backtopagejsfields =
'', $accesskey =
'')
1913 if (strpos($url,
'?') > 0) {
1914 $url .=
'&dol_hide_topmenu=1&dol_hide_leftmenu=1&dol_openinpopup='.urlencode($name);
1916 $url .=
'?dol_hide_topmenu=1&dol_hide_leftmenu=1&dol_openinpopup='.urlencode($name);
1921 $backtopagejsfieldsid =
''; $backtopagejsfieldslabel =
'';
1922 if ($backtopagejsfields) {
1923 $tmpbacktopagejsfields = explode(
':', $backtopagejsfields);
1924 if (empty($tmpbacktopagejsfields[1])) {
1925 $backtopagejsfields = $name.
":".$backtopagejsfields;
1926 $tmp2backtopagejsfields = explode(
',', $tmpbacktopagejsfields[0]);
1928 $tmp2backtopagejsfields = explode(
',', $tmpbacktopagejsfields[1]);
1930 $backtopagejsfieldsid = empty($tmp2backtopagejsfields[0]) ?
'' : $tmp2backtopagejsfields[0];
1931 $backtopagejsfieldslabel = empty($tmp2backtopagejsfields[1]) ?
'' : $tmp2backtopagejsfields[1];
1932 $url .=
'&backtopagejsfields='.urlencode($backtopagejsfields);
1936 $out .=
'<!-- a link for button to open url into a dialog popup with backtopagejsfields = '.$backtopagejsfields.
' -->';
1937 $out .=
'<a '.($accesskey ?
' accesskey="'.$accesskey.
'"' :
'').
' class="cursorpointer reposition button_'.$name.($morecss ?
' '.$morecss :
'').
'"'.$disabled.
' title="'.
dol_escape_htmltag($label).
'"';
1938 if (empty($conf->use_javascript_ajax)) {
1939 $out .=
' href="'.DOL_URL_ROOT.$url.
'" target="_blank"';
1940 } elseif ($jsonopen) {
1941 $out .=
' href="#" onclick="'.$jsonopen.
'"';
1943 $out .=
' href="#"';
1945 $out .=
'>'.$buttonstring.
'</a>';
1947 if (!empty($conf->use_javascript_ajax)) {
1949 $out .=
'<!-- code to open popup and variables to retreive returned variables -->';
1950 $out .=
'<div id="idfordialog'.$name.
'" class="hidden">div for dialog</div>';
1951 $out .=
'<div id="varforreturndialogid'.$name.
'" class="hidden">div for returned id</div>';
1952 $out .=
'<div id="varforreturndialoglabel'.$name.
'" class="hidden">div for returned label</div>';
1953 $out .=
'<!-- Add js code to open dialog popup on dialog -->';
1954 $out .=
'<script nonce="'.getNonce().
'" type="text/javascript">
1955 jQuery(document).ready(function () {
1956 jQuery(".button_'.$name.
'").click(function () {
1957 console.log(\'Open popup with jQuery(...).dialog() on URL '.
dol_escape_js(DOL_URL_ROOT.$url).
'\');
1958 var $tmpdialog = $(\
'#idfordialog'.$name.
'\');
1959 $tmpdialog.html(\
'<iframe class="iframedialog" id="iframedialog'.$name.
'" style="border: 0px;" src="'.DOL_URL_ROOT.$url.
'" width="100%" height="98%"></iframe>\');
1963 height: (window.innerHeight - 150),
1966 open:
function (event, ui) {
1967 console.log(
"open popup name='.$name.', backtopagejsfields='.$backtopagejsfields.'");
1969 close:
function (event, ui) {
1970 var returnedid = jQuery(
"#varforreturndialogid'.$name.'").text();
1971 var returnedlabel = jQuery(
"#varforreturndialoglabel'.$name.'").text();
1972 console.log(
"popup has been closed. returnedid (js var defined into parent page)="+returnedid+
" returnedlabel="+returnedlabel);
1973 if (returnedid !=
"" && returnedid !=
"div for returned id") {
1974 jQuery(
"#'.(empty($backtopagejsfieldsid)?"none
":$backtopagejsfieldsid).'").val(returnedid);
1976 if (returnedlabel !=
"" && returnedlabel !=
"div for returned label") {
1977 jQuery(
"#'.(empty($backtopagejsfieldslabel)?"none
":$backtopagejsfieldslabel).'").val(returnedlabel);
1982 $tmpdialog.dialog(\
'open\');
2007function dol_fiche_head($links = array(), $active =
'0', $title =
'', $notab = 0, $picto =
'', $pictoisfullpath = 0, $morehtmlright =
'', $morecss =
'', $limittoshow = 0, $moretabssuffix =
'')
2009 print
dol_get_fiche_head($links, $active, $title, $notab, $picto, $pictoisfullpath, $morehtmlright, $morecss, $limittoshow, $moretabssuffix);
2028function dol_get_fiche_head($links = array(), $active =
'', $title =
'', $notab = 0, $picto =
'', $pictoisfullpath = 0, $morehtmlright =
'', $morecss =
'', $limittoshow = 0, $moretabssuffix =
'', $dragdropfile = 0)
2030 global $conf, $langs, $hookmanager;
2034 if (!empty($conf->dol_optimize_smallscreen)) {
2038 $out =
"\n".
'<!-- dol_fiche_head - dol_get_fiche_head -->';
2040 if ((!empty($title) && $showtitle) || $morehtmlright || !empty($links)) {
2041 $out .=
'<div class="tabs'.($picto ?
'' :
' nopaddingleft').
'" data-role="controlgroup" data-type="horizontal">'.
"\n";
2045 if ($morehtmlright) {
2046 $out .=
'<div class="inline-block floatright tabsElem">'.$morehtmlright.
'</div>';
2050 if (!empty($title) && $showtitle && empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
2052 $out .=
'<a class="tabTitle">';
2054 $noprefix = $pictoisfullpath;
2055 if (strpos($picto,
'fontawesome_') !==
false) {
2058 $out .=
img_picto($title, ($noprefix ?
'' :
'object_').$picto,
'', $pictoisfullpath, 0, 0,
'',
'imgTabTitle').
' ';
2060 $out .=
'<span class="tabTitleText">'.dol_escape_htmltag(
dol_trunc($title, $limittitle)).
'</span>';
2068 if (is_array($links) && !empty($links)) {
2069 $keys = array_keys($links);
2071 $maxkey = max($keys);
2077 if (empty($limittoshow)) {
2078 $limittoshow = (empty($conf->global->MAIN_MAXTABS_IN_CARD) ? 99 : $conf->global->MAIN_MAXTABS_IN_CARD);
2080 if (!empty($conf->dol_optimize_smallscreen)) {
2088 for ($i = 0; $i <= $maxkey; $i++) {
2089 if ((is_numeric($active) && $i == $active) || (!empty($links[$i][2]) && !is_numeric($active) && $active == $links[$i][2])) {
2091 if ($i >= $limittoshow) {
2097 for ($i = 0; $i <= $maxkey; $i++) {
2098 if ((is_numeric($active) && $i == $active) || (!empty($links[$i][2]) && !is_numeric($active) && $active == $links[$i][2])) {
2104 if ($i < $limittoshow || $isactive) {
2106 $out .=
'<div class="inline-block tabsElem'.($isactive ?
' tabsElemActive' :
'').((!$isactive && !empty($conf->global->MAIN_HIDE_INACTIVETAB_ON_PRINT)) ?
' hideonprint' :
'').
'"><!-- id tab = '.(empty($links[$i][2]) ?
'' :
dol_escape_htmltag($links[$i][2])).
' -->';
2108 if (isset($links[$i][2]) && $links[$i][2] ==
'image') {
2109 if (!empty($links[$i][0])) {
2110 $out .=
'<a class="tabimage'.($morecss ?
' '.$morecss :
'').
'" href="'.$links[$i][0].
'">'.$links[$i][1].
'</a>'.
"\n";
2112 $out .=
'<span class="tabspan">'.$links[$i][1].
'</span>'.
"\n";
2114 } elseif (!empty($links[$i][1])) {
2116 $out .=
'<div class="tab tab'.($isactive?
'active':
'unactive').
'" style="margin: 0 !important">';
2117 if (!empty($links[$i][0])) {
2118 $titletoshow = preg_replace(
'/<.*$/',
'', $links[$i][1]);
2119 $out .=
'<a'.(!empty($links[$i][2]) ?
' id="'.$links[$i][2].
'"' :
'').
' class="tab inline-block valignmiddle'.($morecss ?
' '.$morecss :
'').(!empty($links[$i][5]) ?
' '.$links[$i][5] :
'').
'" href="'.$links[$i][0].
'" title="'.
dol_escape_htmltag($titletoshow).
'">';
2121 $out .= $links[$i][1];
2122 if (!empty($links[$i][0])) {
2123 $out .=
'</a>'.
"\n";
2125 $out .= empty($links[$i][4]) ?
'' : $links[$i][4];
2134 $outmore .=
'<div class="popuptabset wordwrap">';
2136 $outmore .=
'<div class="popuptab wordwrap" style="display:inherit;">';
2137 if (isset($links[$i][2]) && $links[$i][2] ==
'image') {
2138 if (!empty($links[$i][0])) {
2139 $outmore .=
'<a class="tabimage'.($morecss ?
' '.$morecss :
'').
'" href="'.$links[$i][0].
'">'.$links[$i][1].
'</a>'.
"\n";
2141 $outmore .=
'<span class="tabspan">'.$links[$i][1].
'</span>'.
"\n";
2143 } elseif (!empty($links[$i][1])) {
2144 $outmore .=
'<a'.(!empty($links[$i][2]) ?
' id="'.$links[$i][2].
'"' :
'').
' class="wordwrap inline-block'.($morecss ?
' '.$morecss :
'').
'" href="'.$links[$i][0].
'">';
2145 $outmore .= preg_replace(
'/([a-z])\|([a-z])/i',
'\\1 | \\2', $links[$i][1]);
2146 $outmore .=
'</a>'.
"\n";
2148 $outmore .=
'</div>';
2155 $outmore .=
'</div>';
2159 $left = ($langs->trans(
"DIRECTION") ==
'rtl' ?
'right' :
'left');
2160 $right = ($langs->trans(
"DIRECTION") ==
'rtl' ?
'left' :
'right');
2161 $widthofpopup = 200;
2163 $tabsname = $moretabssuffix;
2164 if (empty($tabsname)) {
2165 $tabsname = str_replace(
"@",
"", $picto);
2167 $out .=
'<div id="moretabs'.$tabsname.
'" class="inline-block tabsElem valignmiddle">';
2168 $out .=
'<div class="tab"><a href="#" class="tab moretab inline-block tabunactive"><span class="hideonsmartphone">'.$langs->trans(
"More").
'</span>... ('.$nbintab.
')</a></div>';
2169 $out .=
'<div id="moretabsList'.$tabsname.
'" style="width: '.$widthofpopup.
'px; position: absolute; '.$left.
': -999em; text-align: '.$left.
'; margin:0px; padding:2px; z-index:10;">';
2172 $out .=
'<div></div>';
2175 $out .=
'<script nonce="'.getNonce().
'">';
2176 $out .=
"$('#moretabs".$tabsname.
"').mouseenter( function() {
2177 var x = this.offsetLeft, y = this.offsetTop;
2178 console.log('mouseenter ".$left.
" x='+x+' y='+y+' window.innerWidth='+window.innerWidth);
2179 if ((window.innerWidth - x) < ".($widthofpopup + 10).
") {
2180 $('#moretabsList".$tabsname.
"').css('".$right.
"','8px');
2182 $('#moretabsList".$tabsname.
"').css('".$left.
"','auto');
2185 $out .=
"$('#moretabs".$tabsname.
"').mouseleave( function() { console.log('mouseleave ".$left.
"'); $('#moretabsList".$tabsname.
"').css('".$left.
"','-999em');});";
2186 $out .=
"</script>";
2189 if ((!empty($title) && $showtitle) || $morehtmlright || !empty($links)) {
2193 if (!$notab || $notab == -1 || $notab == -2 || $notab == -3) {
2194 $out .=
"\n".
'<div id="dragDropAreaTabBar" class="tabBar'.($notab == -1 ?
'' : ($notab == -2 ?
' tabBarNoTop' : (($notab == -3 ?
' noborderbottom' :
'').
' tabBarWithBottom'))).
'">'.
"\n";
2196 if (!empty($dragdropfile)) {
2199 $parameters = array(
'tabname' => $active,
'out' => $out);
2200 $reshook = $hookmanager->executeHooks(
'printTabsHead', $parameters);
2202 $out = $hookmanager->resPrint;
2228 if (!$notab || $notab == -1) {
2229 return "\n</div>\n";
2254function dol_banner_tab($object, $paramid, $morehtml =
'', $shownav = 1, $fieldid =
'rowid', $fieldref =
'ref', $morehtmlref =
'', $moreparam =
'', $nodbprefix = 0, $morehtmlleft =
'', $morehtmlstatus =
'', $onlybanner = 0, $morehtmlright =
'')
2256 global $conf, $form, $user, $langs, $hookmanager, $action;
2260 $maxvisiblephotos = 1;
2262 $entity = (empty($object->entity) ? $conf->entity : $object->entity);
2263 $showbarcode = empty($conf->barcode->enabled) ? 0 : (empty($object->barcode) ? 0 : 1);
2264 if (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && empty($user->rights->barcode->lire_advance)) {
2267 $modulepart =
'unknown';
2269 if ($object->element ==
'societe' || $object->element ==
'contact' || $object->element ==
'product' || $object->element ==
'ticket') {
2270 $modulepart = $object->element;
2271 } elseif ($object->element ==
'member') {
2272 $modulepart =
'memberphoto';
2273 } elseif ($object->element ==
'user') {
2274 $modulepart =
'userphoto';
2277 if (class_exists(
"Imagick")) {
2278 if ($object->element ==
'expensereport' || $object->element ==
'propal' || $object->element ==
'commande' || $object->element ==
'facture' || $object->element ==
'supplier_proposal') {
2279 $modulepart = $object->element;
2280 } elseif ($object->element ==
'fichinter') {
2281 $modulepart =
'ficheinter';
2282 } elseif ($object->element ==
'contrat') {
2283 $modulepart =
'contract';
2284 } elseif ($object->element ==
'order_supplier') {
2285 $modulepart =
'supplier_order';
2286 } elseif ($object->element ==
'invoice_supplier') {
2287 $modulepart =
'supplier_invoice';
2291 if ($object->element ==
'product') {
2293 $cssclass =
'photowithmargin photoref';
2294 $showimage = $object->is_photo_available($conf->product->multidir_output[$entity]);
2295 $maxvisiblephotos = (isset($conf->global->PRODUCT_MAX_VISIBLE_PHOTO) ? $conf->global->PRODUCT_MAX_VISIBLE_PHOTO : 5);
2296 if ($conf->browser->layout ==
'phone') {
2297 $maxvisiblephotos = 1;
2300 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref">'.$object->show_photos(
'product', $conf->product->multidir_output[$entity],
'small', $maxvisiblephotos, 0, 0, 0, 0, $width, 0,
'').
'</div>';
2302 if (!empty($conf->global->PRODUCT_NODISPLAYIFNOPHOTO)) {
2304 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"></div>';
2306 $nophoto =
'/public/theme/common/nophoto.png';
2307 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"><img class="photo'.$modulepart.($cssclass ?
' '.$cssclass :
'').
'" title="'.
dol_escape_htmltag($langs->trans(
"UploadAnImageToSeeAPhotoHere", $langs->transnoentitiesnoconv(
"Documents"))).
'" alt="No photo"'.($width ?
' style="width: '.$width.
'px"' :
'').
' src="'.DOL_URL_ROOT.$nophoto.
'"></div>';
2310 } elseif ($object->element ==
'ticket') {
2312 $cssclass =
'photoref';
2313 $showimage = $object->is_photo_available($conf->ticket->multidir_output[$entity].
'/'.$object->ref);
2314 $maxvisiblephotos = (isset($conf->global->TICKET_MAX_VISIBLE_PHOTO) ? $conf->global->TICKET_MAX_VISIBLE_PHOTO : 2);
2315 if ($conf->browser->layout ==
'phone') {
2316 $maxvisiblephotos = 1;
2320 $showphoto = $object->show_photos(
'ticket', $conf->ticket->multidir_output[$entity],
'small', $maxvisiblephotos, 0, 0, 0, $width, 0);
2321 if ($object->nbphoto > 0) {
2322 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref">'.$showphoto.
'</div>';
2328 if (!empty($conf->global->TICKET_NODISPLAYIFNOPHOTO)) {
2330 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"></div>';
2332 $nophoto =
img_picto(
'No photo',
'object_ticket');
2333 $morehtmlleft .=
'<!-- No photo to show -->';
2334 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"><div class="photoref">';
2335 $morehtmlleft .= $nophoto;
2336 $morehtmlleft .=
'</div></div>';
2341 if ($modulepart !=
'unknown') {
2344 if (in_array($modulepart, array(
'propal',
'commande',
'facture',
'ficheinter',
'contract',
'supplier_order',
'supplier_proposal',
'supplier_invoice',
'expensereport')) && class_exists(
"Imagick")) {
2346 $dir_output = (empty($conf->$modulepart->multidir_output[$entity]) ? $conf->$modulepart->dir_output : $conf->$modulepart->multidir_output[$entity]).
"/";
2347 if (in_array($modulepart, array(
'invoice_supplier',
'supplier_invoice'))) {
2348 $subdir =
get_exdir($object->id, 2, 0, 1, $object, $modulepart);
2349 $subdir .= ((!empty($subdir) && !preg_match(
'/\/$/', $subdir)) ?
'/' :
'').$objectref;
2351 $subdir =
get_exdir($object->id, 0, 0, 1, $object, $modulepart);
2353 if (empty($subdir)) {
2354 $subdir =
'errorgettingsubdirofobject';
2357 $filepath = $dir_output.$subdir.
"/";
2359 $filepdf = $filepath.$objectref.
".pdf";
2360 $relativepath = $subdir.
'/'.$objectref.
'.pdf';
2363 $fileimage = $filepdf.
'_preview.png';
2364 $relativepathimage = $relativepath.
'_preview.png';
2366 $pdfexists = file_exists($filepdf);
2371 if (!file_exists($fileimage) || (filemtime($fileimage) < filemtime($filepdf))) {
2372 if (empty($conf->global->MAIN_DISABLE_PDF_THUMBS)) {
2373 include_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
2382 if ($pdfexists && !$error) {
2383 $heightforphotref = 80;
2384 if (!empty($conf->dol_optimize_smallscreen)) {
2385 $heightforphotref = 60;
2388 if (file_exists($fileimage)) {
2389 $phototoshow =
'<div class="photoref">';
2390 $phototoshow .=
'<img height="'.$heightforphotref.
'" class="photo photowithborder" src="'.DOL_URL_ROOT.
'/viewimage.php?modulepart=apercu'.$modulepart.
'&file='.urlencode($relativepathimage).
'">';
2391 $phototoshow .=
'</div>';
2394 } elseif (!$phototoshow) {
2395 $phototoshow .= $form->showphoto($modulepart, $object, 0, 0, 0,
'photowithmargin photoref',
'small', 1, 0, $maxvisiblephotos);
2399 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref">';
2400 $morehtmlleft .= $phototoshow;
2401 $morehtmlleft .=
'</div>';
2405 if (empty($phototoshow)) {
2406 if ($object->element ==
'action') {
2408 $cssclass =
'photorefcenter';
2409 $nophoto =
img_picto(
'No photo',
'title_agenda');
2412 $cssclass =
'photorefcenter';
2413 $picto = $object->picto;
2414 $prefix =
'object_';
2415 if ($object->element ==
'project' && !$object->public) {
2418 if (strpos($picto,
'fontawesome_') !==
false) {
2421 $nophoto =
img_picto(
'No photo', $prefix.$picto);
2423 $morehtmlleft .=
'<!-- No photo to show -->';
2424 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"><div class="photoref">';
2425 $morehtmlleft .= $nophoto;
2426 $morehtmlleft .=
'</div></div>';
2433 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref">'.$form->showbarcode($object, 100,
'photoref valignmiddle').
'</div>';
2436 if ($object->element ==
'societe') {
2437 if (!empty($conf->use_javascript_ajax) && $user->hasRight(
'societe',
'creer') && !empty($conf->global->MAIN_DIRECT_STATUS_UPDATE)) {
2438 $morehtmlstatus .=
ajax_object_onoff($object,
'status',
'status',
'InActivity',
'ActivityCeased');
2440 $morehtmlstatus .= $object->getLibStatut(6);
2442 } elseif ($object->element ==
'product') {
2444 if (!empty($conf->use_javascript_ajax) && $user->hasRight(
'produit',
'creer') && !empty($conf->global->MAIN_DIRECT_STATUS_UPDATE)) {
2445 $morehtmlstatus .=
ajax_object_onoff($object,
'status',
'tosell',
'ProductStatusOnSell',
'ProductStatusNotOnSell');
2447 $morehtmlstatus .=
'<span class="statusrefsell">'.$object->getLibStatut(6, 0).
'</span>';
2449 $morehtmlstatus .=
' ';
2451 if (!empty($conf->use_javascript_ajax) && $user->hasRight(
'produit',
'creer') && !empty($conf->global->MAIN_DIRECT_STATUS_UPDATE)) {
2452 $morehtmlstatus .=
ajax_object_onoff($object,
'status_buy',
'tobuy',
'ProductStatusOnBuy',
'ProductStatusNotOnBuy');
2454 $morehtmlstatus .=
'<span class="statusrefbuy">'.$object->getLibStatut(6, 1).
'</span>';
2456 } elseif (in_array($object->element, array(
'facture',
'invoice',
'invoice_supplier'))) {
2457 $totalallpayments = $object->getSommePaiement(0);
2458 $totalallpayments += $object->getSumCreditNotesUsed(0);
2459 $totalallpayments += $object->getSumDepositsUsed(0);
2460 $tmptxt = $object->getLibStatut(6, $totalallpayments);
2461 if (empty($tmptxt) || $tmptxt == $object->getLibStatut(3)) {
2462 $tmptxt = $object->getLibStatut(5, $totalallpayments);
2464 $morehtmlstatus .= $tmptxt;
2465 } elseif (in_array($object->element, array(
'chargesociales',
'loan',
'tva'))) {
2466 $tmptxt = $object->getLibStatut(6, $object->totalpaid);
2467 if (empty($tmptxt) || $tmptxt == $object->getLibStatut(3)) {
2468 $tmptxt = $object->getLibStatut(5, $object->totalpaid);
2470 $morehtmlstatus .= $tmptxt;
2471 } elseif ($object->element ==
'contrat' || $object->element ==
'contract') {
2472 if ($object->statut == 0) {
2473 $morehtmlstatus .= $object->getLibStatut(5);
2475 $morehtmlstatus .= $object->getLibStatut(4);
2477 } elseif ($object->element ==
'facturerec') {
2478 if ($object->frequency == 0) {
2479 $morehtmlstatus .= $object->getLibStatut(2);
2481 $morehtmlstatus .= $object->getLibStatut(5);
2483 } elseif ($object->element ==
'project_task') {
2484 $object->fk_statut = 1;
2485 if ($object->progress > 0) {
2486 $object->fk_statut = 2;
2488 if ($object->progress >= 100) {
2489 $object->fk_statut = 3;
2491 $tmptxt = $object->getLibStatut(5);
2492 $morehtmlstatus .= $tmptxt;
2493 } elseif (method_exists($object,
'getLibStatut')) {
2494 $tmptxt = $object->getLibStatut(6);
2495 if (empty($tmptxt) || $tmptxt == $object->getLibStatut(3)) {
2496 $tmptxt = $object->getLibStatut(5);
2498 $morehtmlstatus .= $tmptxt;
2502 if (isModEnabled(
'accounting') && in_array($object->element, array(
'bank',
'paiementcharge',
'facture',
'invoice',
'invoice_supplier',
'expensereport',
'payment_various'))) {
2504 if (method_exists($object,
'getVentilExportCompta')) {
2505 $accounted = $object->getVentilExportCompta();
2506 $langs->load(
"accountancy");
2507 $morehtmlstatus .=
'</div><div class="statusref statusrefbis"><span class="opacitymedium">'.($accounted > 0 ? $langs->trans(
"Accounted") : $langs->trans(
"NotYetAccounted")).
'</span>';
2512 if (!empty($object->name_alias)) {
2513 $morehtmlref .=
'<div class="refidno opacitymedium">'.dol_escape_htmltag($object->name_alias).
'</div>';
2517 if (in_array($object->element, array(
'product',
'bank_account',
'project_task'))) {
2518 if (!empty($object->label)) {
2519 $morehtmlref .=
'<div class="refidno opacitymedium">'.$object->label.
'</div>';
2524 if (method_exists($object,
'getBannerAddress') && !in_array($object->element, array(
'product',
'bookmark',
'ecm_directories',
'ecm_files'))) {
2525 $moreaddress = $object->getBannerAddress(
'refaddress', $object);
2527 $morehtmlref .=
'<div class="refidno refaddress">';
2528 $morehtmlref .= $moreaddress;
2529 $morehtmlref .=
'</div>';
2532 if (!empty($conf->global->MAIN_SHOW_TECHNICAL_ID) && ($conf->global->MAIN_SHOW_TECHNICAL_ID ==
'1' || preg_match(
'/'.preg_quote($object->element,
'/').
'/i', $conf->global->MAIN_SHOW_TECHNICAL_ID)) && !empty($object->id)) {
2533 $morehtmlref .=
'<div style="clear: both;"></div>';
2534 $morehtmlref .=
'<div class="refidno opacitymedium">';
2535 $morehtmlref .= $langs->trans(
"TechnicalID").
': '.((int) $object->id);
2536 $morehtmlref .=
'</div>';
2539 $parameters=array(
'morehtmlref'=>$morehtmlref);
2540 $reshook = $hookmanager->executeHooks(
'formDolBanner', $parameters, $object, $action);
2543 } elseif (empty($reshook)) {
2544 $morehtmlref .= $hookmanager->resPrint;
2545 } elseif ($reshook > 0) {
2546 $morehtmlref = $hookmanager->resPrint;
2550 print
'<div class="'.($onlybanner ?
'arearefnobottom ' :
'arearef ').
'heightref valignmiddle centpercent">';
2551 print $form->showrefnav($object, $paramid, $morehtml, $shownav, $fieldid, $fieldref, $morehtmlref, $moreparam, $nodbprefix, $morehtmlleft, $morehtmlstatus, $morehtmlright);
2553 print
'<div class="underrefbanner clearboth"></div>';
2569 if ($fieldrequired) {
2570 $ret .=
'<span class="fieldrequired">';
2572 $ret .=
'<label for="'.$fieldkey.
'">';
2573 $ret .= $langs->trans($langkey);
2575 if ($fieldrequired) {
2591 $ret =
' '.$bc[$var];
2593 $ret = preg_replace(
'/class=\"/',
'class="'.$moreclass.
' ', $ret);
2611function dol_format_address($object, $withcountry = 0, $sep =
"\n", $outputlangs =
'', $mode = 0, $extralangcode =
'')
2613 global $conf, $langs, $hookmanager;
2616 $countriesusingstate = array(
'AU',
'CA',
'US',
'IN',
'GB',
'ES',
'UK',
'TR',
'CN');
2621 $ret .= ($extralangcode ? $object->array_languages[
'address'][$extralangcode] : (empty($object->address) ?
'' : preg_replace(
'/(\r\n|\r|\n)+/', $sep, $object->address)));
2624 if (isset($object->country_code) && in_array($object->country_code, array(
'AU',
'CA',
'US',
'CN')) || !empty($conf->global->MAIN_FORCE_STATE_INTO_ADDRESS)) {
2626 $town = ($extralangcode ? $object->array_languages[
'town'][$extralangcode] : (empty($object->town) ?
'' : $object->town));
2627 $ret .= (($ret && $town) ? $sep :
'').$town;
2629 if (!empty($object->state)) {
2630 $ret .= ($ret ? ($town ?
", " : $sep) :
'').$object->state;
2632 if (!empty($object->zip)) {
2633 $ret .= ($ret ? (($town || $object->state) ?
", " : $sep) :
'').$object->zip;
2635 } elseif (isset($object->country_code) && in_array($object->country_code, array(
'GB',
'UK'))) {
2637 $town = ($extralangcode ? $object->array_languages[
'town'][$extralangcode] : (empty($object->town) ?
'' : $object->town));
2638 $ret .= ($ret ? $sep :
'').$town;
2639 if (!empty($object->state)) {
2640 $ret .= ($ret ?
", " :
'').$object->state;
2642 if (!empty($object->zip)) {
2643 $ret .= ($ret ? $sep :
'').$object->zip;
2645 } elseif (isset($object->country_code) && in_array($object->country_code, array(
'ES',
'TR'))) {
2647 $ret .= ($ret ? $sep :
'').$object->zip;
2648 $town = ($extralangcode ? $object->array_languages[
'town'][$extralangcode] : (empty($object->town) ?
'' : $object->town));
2649 $ret .= ($town ? (($object->zip ?
' ' :
'').$town) :
'');
2650 if (!empty($object->state)) {
2651 $ret .= $sep.$object->state;
2653 } elseif (isset($object->country_code) && in_array($object->country_code, array(
'JP'))) {
2656 $town = ($extralangcode ? $object->array_languages[
'town'][$extralangcode] : (empty($object->town) ?
'' : $object->town));
2657 $ret .= ($ret ? $sep :
'').($object->state ? $object->state.
', ' :
'').$town.($object->zip ?
' ' :
'').$object->zip;
2658 } elseif (isset($object->country_code) && in_array($object->country_code, array(
'IT'))) {
2660 $ret .= ($ret ? $sep :
'').$object->zip;
2661 $town = ($extralangcode ? $object->array_languages[
'town'][$extralangcode] : (empty($object->town) ?
'' : $object->town));
2662 $ret .= ($town ? (($object->zip ?
' ' :
'').$town) :
'');
2663 $ret .= (empty($object->state_code) ?
'' : (
' '.$object->state_code));
2666 $town = ($extralangcode ? $object->array_languages[
'town'][$extralangcode] : (empty($object->town) ?
'' : $object->town));
2667 $ret .= !empty($object->zip) ? (($ret ? $sep :
'').$object->zip) :
'';
2668 $ret .= ($town ? (($object->zip ?
' ' : ($ret ? $sep :
'')).$town) :
'');
2669 if (!empty($object->state) && in_array($object->country_code, $countriesusingstate)) {
2670 $ret .= ($ret ?
", " :
'').$object->state;
2674 if (!is_object($outputlangs)) {
2675 $outputlangs = $langs;
2678 $langs->load(
"dict");
2679 $ret .= (empty($object->country_code) ?
'' : ($ret ? $sep :
'').$outputlangs->convToOutputCharset($outputlangs->transnoentitiesnoconv(
"Country".$object->country_code)));
2682 $parameters = array(
'withcountry' => $withcountry,
'sep' => $sep,
'outputlangs' => $outputlangs,
'mode' => $mode,
'extralangcode' => $extralangcode);
2683 $reshook = $hookmanager->executeHooks(
'formatAddress', $parameters, $object);
2687 $ret .= $hookmanager->resPrint;
2705 if ((abs($ts) <= 0x7FFFFFFF)) {
2706 return ($is_gmt) ? @gmstrftime($fmt, $ts) : @strftime($fmt, $ts);
2708 return 'Error date into a not supported range';
2733function dol_print_date($time, $format =
'', $tzoutput =
'auto', $outputlangs =
'', $encodetooutput =
false)
2735 global $conf, $langs;
2742 if ($tzoutput ===
'auto') {
2743 $tzoutput = (empty($conf) ?
'tzserver' : (isset($conf->tzuserinputkey) ? $conf->tzuserinputkey :
'tzserver'));
2748 $offsettz = $offsetdst = 0;
2751 if (is_string($tzoutput)) {
2752 if ($tzoutput ==
'tzserver') {
2754 $offsettzstring = @date_default_timezone_get();
2757 } elseif ($tzoutput ==
'tzuser' || $tzoutput ==
'tzuserrel') {
2759 $offsettzstring = (empty($_SESSION[
'dol_tz_string']) ?
'UTC' : $_SESSION[
'dol_tz_string']);
2761 if (class_exists(
'DateTimeZone')) {
2762 $user_date_tz =
new DateTimeZone($offsettzstring);
2763 $user_dt =
new DateTime();
2764 $user_dt->setTimezone($user_date_tz);
2765 $user_dt->setTimestamp($tzoutput ==
'tzuser' ?
dol_now() : (int) $time);
2766 $offsettz = $user_dt->getOffset();
2768 $offsettz = (empty($_SESSION[
'dol_tz']) ? 0 : $_SESSION[
'dol_tz']) * 60 * 60;
2769 $offsetdst = (empty($_SESSION[
'dol_dst']) ? 0 : $_SESSION[
'dol_dst']) * 60 * 60;
2774 if (!is_object($outputlangs)) {
2775 $outputlangs = $langs;
2778 $format =
'daytextshort';
2783 $reduceformat = (!empty($conf->dol_optimize_smallscreen) && in_array($format, array(
'day',
'dayhour'))) ? 1 : 0;
2784 $format = preg_replace(
'/inputnoreduce/',
'', $format);
2785 $formatwithoutreduce = preg_replace(
'/reduceformat/',
'', $format);
2786 if ($formatwithoutreduce != $format) {
2787 $format = $formatwithoutreduce;
2793 if ($format ==
'day') {
2794 $format = ($outputlangs->trans(
"FormatDateShort") !=
"FormatDateShort" ? $outputlangs->trans(
"FormatDateShort") : $conf->format_date_short);
2795 } elseif ($format ==
'hour') {
2796 $format = ($outputlangs->trans(
"FormatHourShort") !=
"FormatHourShort" ? $outputlangs->trans(
"FormatHourShort") : $conf->format_hour_short);
2797 } elseif ($format ==
'hourduration') {
2798 $format = ($outputlangs->trans(
"FormatHourShortDuration") !=
"FormatHourShortDuration" ? $outputlangs->trans(
"FormatHourShortDuration") : $conf->format_hour_short_duration);
2799 } elseif ($format ==
'daytext') {
2800 $format = ($outputlangs->trans(
"FormatDateText") !=
"FormatDateText" ? $outputlangs->trans(
"FormatDateText") : $conf->format_date_text);
2801 } elseif ($format ==
'daytextshort') {
2802 $format = ($outputlangs->trans(
"FormatDateTextShort") !=
"FormatDateTextShort" ? $outputlangs->trans(
"FormatDateTextShort") : $conf->format_date_text_short);
2803 } elseif ($format ==
'dayhour') {
2804 $format = ($outputlangs->trans(
"FormatDateHourShort") !=
"FormatDateHourShort" ? $outputlangs->trans(
"FormatDateHourShort") : $conf->format_date_hour_short);
2805 } elseif ($format ==
'dayhoursec') {
2806 $format = ($outputlangs->trans(
"FormatDateHourSecShort") !=
"FormatDateHourSecShort" ? $outputlangs->trans(
"FormatDateHourSecShort") : $conf->format_date_hour_sec_short);
2807 } elseif ($format ==
'dayhourtext') {
2808 $format = ($outputlangs->trans(
"FormatDateHourText") !=
"FormatDateHourText" ? $outputlangs->trans(
"FormatDateHourText") : $conf->format_date_hour_text);
2809 } elseif ($format ==
'dayhourtextshort') {
2810 $format = ($outputlangs->trans(
"FormatDateHourTextShort") !=
"FormatDateHourTextShort" ? $outputlangs->trans(
"FormatDateHourTextShort") : $conf->format_date_hour_text_short);
2811 } elseif ($format ==
'dayhourlog') {
2813 $format =
'%Y%m%d%H%M%S';
2814 } elseif ($format ==
'dayhourlogsmall') {
2816 $format =
'%y%m%d%H%M';
2817 } elseif ($format ==
'dayhourldap') {
2818 $format =
'%Y%m%d%H%M%SZ';
2819 } elseif ($format ==
'dayhourxcard') {
2820 $format =
'%Y%m%dT%H%M%SZ';
2821 } elseif ($format ==
'dayxcard') {
2823 } elseif ($format ==
'dayrfc') {
2824 $format =
'%Y-%m-%d';
2825 } elseif ($format ==
'dayhourrfc') {
2826 $format =
'%Y-%m-%dT%H:%M:%SZ';
2827 } elseif ($format ==
'standard') {
2828 $format =
'%Y-%m-%d %H:%M:%S';
2831 if ($reduceformat) {
2832 $format = str_replace(
'%Y',
'%y', $format);
2833 $format = str_replace(
'yyyy',
'yy', $format);
2837 if (preg_match(
'/%b/i', $format)) {
2839 $format = str_replace(
'%b',
'__b__', $format);
2840 $format = str_replace(
'%B',
'__B__', $format);
2842 if (preg_match(
'/%a/i', $format)) {
2844 $format = str_replace(
'%a',
'__a__', $format);
2845 $format = str_replace(
'%A',
'__A__', $format);
2850 if (preg_match(
'/^([0-9][0-9][0-9][0-9])([0-9][0-9])([0-9][0-9])([0-9][0-9])([0-9][0-9])([0-9][0-9])$/i', $time, $reg)) {
2851 dol_print_error(
'',
"Functions.lib::dol_print_date function called with a bad value from page ".$_SERVER[
"PHP_SELF"]);
2853 } elseif (preg_match(
'/^([0-9]+)\-([0-9]+)\-([0-9]+) ?([0-9]+)?:?([0-9]+)?:?([0-9]+)?/i', $time, $reg)) {
2855 dol_syslog(
"Functions.lib::dol_print_date function called with a bad value from page ".$_SERVER[
"PHP_SELF"], LOG_WARNING);
2858 $syear = (!empty($reg[1]) ? $reg[1] :
'');
2859 $smonth = (!empty($reg[2]) ? $reg[2] :
'');
2860 $sday = (!empty($reg[3]) ? $reg[3] :
'');
2861 $shour = (!empty($reg[4]) ? $reg[4] :
'');
2862 $smin = (!empty($reg[5]) ? $reg[5] :
'');
2863 $ssec = (!empty($reg[6]) ? $reg[6] :
'');
2865 $time =
dol_mktime($shour, $smin, $ssec, $smonth, $sday, $syear,
true);
2868 $tzo =
new DateTimeZone(
'UTC');
2870 $tzo =
new DateTimeZone(date_default_timezone_get());
2872 $dtts =
new DateTime();
2873 $dtts->setTimestamp($time);
2874 $dtts->setTimezone($tzo);
2875 $newformat = str_replace(
2876 array(
'%Y',
'%y',
'%m',
'%d',
'%H',
'%I',
'%M',
'%S',
'%p',
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
2877 array(
'Y',
'y',
'm',
'd',
'H',
'h',
'i',
's',
'A',
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
2879 $ret = $dtts->format($newformat);
2881 array(
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
2882 array(
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
2887 if ($time < 100000000000) {
2888 $timetouse = $time + $offsettz + $offsetdst;
2891 $tzo =
new DateTimeZone(
'UTC');
2893 $tzo =
new DateTimeZone(date_default_timezone_get());
2895 $dtts =
new DateTime();
2896 $dtts->setTimestamp($timetouse);
2897 $dtts->setTimezone($tzo);
2898 $newformat = str_replace(
2899 array(
'%Y',
'%y',
'%m',
'%d',
'%H',
'%I',
'%M',
'%S',
'%p',
'%w',
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
2900 array(
'Y',
'y',
'm',
'd',
'H',
'h',
'i',
's',
'A',
'w',
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
2902 $ret = $dtts->format($newformat);
2904 array(
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
2905 array(
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
2910 $ret =
'Bad value '.$time.
' for date';
2914 if (preg_match(
'/__b__/i', $format)) {
2915 $timetouse = $time + $offsettz + $offsetdst;
2918 $tzo =
new DateTimeZone(
'UTC');
2920 $tzo =
new DateTimeZone(date_default_timezone_get());
2922 $dtts =
new DateTime();
2923 $dtts->setTimestamp($timetouse);
2924 $dtts->setTimezone($tzo);
2925 $month = $dtts->format(
"m");
2926 $month = sprintf(
"%02d", $month);
2927 if ($encodetooutput) {
2928 $monthtext = $outputlangs->transnoentities(
'Month'.$month);
2929 $monthtextshort = $outputlangs->transnoentities(
'MonthShort'.$month);
2931 $monthtext = $outputlangs->transnoentitiesnoconv(
'Month'.$month);
2932 $monthtextshort = $outputlangs->transnoentitiesnoconv(
'MonthShort'.$month);
2935 $ret = str_replace(
'__b__', $monthtextshort, $ret);
2936 $ret = str_replace(
'__B__', $monthtext, $ret);
2940 if (preg_match(
'/__a__/i', $format)) {
2942 $timetouse = $time + $offsettz + $offsetdst;
2945 $tzo =
new DateTimeZone(
'UTC');
2947 $tzo =
new DateTimeZone(date_default_timezone_get());
2949 $dtts =
new DateTime();
2950 $dtts->setTimestamp($timetouse);
2951 $dtts->setTimezone($tzo);
2952 $w = $dtts->format(
"w");
2953 $dayweek = $outputlangs->transnoentitiesnoconv(
'Day'.$w);
2955 $ret = str_replace(
'__A__', $dayweek, $ret);
2956 $ret = str_replace(
'__a__',
dol_substr($dayweek, 0, 3), $ret);
2985 if ($timestamp ===
'') {
2989 $datetimeobj =
new DateTime();
2990 $datetimeobj->setTimestamp($timestamp);
2991 if ($forcetimezone) {
2992 $datetimeobj->setTimezone(
new DateTimeZone($forcetimezone ==
'gmt' ?
'UTC' : $forcetimezone));
2995 'year'=>((
int) date_format($datetimeobj,
'Y')),
2996 'mon'=>((
int) date_format($datetimeobj,
'm')),
2997 'mday'=>((
int) date_format($datetimeobj,
'd')),
2998 'wday'=>((
int) date_format($datetimeobj,
'w')),
2999 'yday'=>((
int) date_format($datetimeobj,
'z')),
3000 'hours'=>((
int) date_format($datetimeobj,
'H')),
3001 'minutes'=>((
int) date_format($datetimeobj,
'i')),
3002 'seconds'=>((
int) date_format($datetimeobj,
's')),
3030function dol_mktime($hour, $minute, $second, $month, $day, $year, $gm =
'auto', $check = 1)
3035 if ($gm ===
'auto') {
3036 $gm = (empty($conf) ?
'tzserver' : $conf->tzuserinputkey);
3041 if ($hour == -1 || empty($hour)) {
3044 if ($minute == -1 || empty($minute)) {
3047 if ($second == -1 || empty($second)) {
3053 if (!$month || !$day) {
3062 if ($hour < 0 || $hour > 24) {
3065 if ($minute < 0 || $minute > 60) {
3068 if ($second < 0 || $second > 60) {
3073 if (empty($gm) || ($gm ===
'server' || $gm ===
'tzserver')) {
3074 $default_timezone = @date_default_timezone_get();
3075 $localtz =
new DateTimeZone($default_timezone);
3076 } elseif ($gm ===
'user' || $gm ===
'tzuser' || $gm ===
'tzuserrel') {
3078 $default_timezone = (empty($_SESSION[
"dol_tz_string"]) ? @date_default_timezone_get() : $_SESSION[
"dol_tz_string"]);
3080 $localtz =
new DateTimeZone($default_timezone);
3082 dol_syslog(
"Warning dol_tz_string contains an invalid value ".$_SESSION[
"dol_tz_string"], LOG_WARNING);
3083 $default_timezone = @date_default_timezone_get();
3085 } elseif (strrpos($gm,
"tz,") !==
false) {
3086 $timezone = str_replace(
"tz,",
"", $gm);
3088 $localtz =
new DateTimeZone($timezone);
3090 dol_syslog(
"Warning passed timezone contains an invalid value ".$timezone, LOG_WARNING);
3094 if (empty($localtz)) {
3095 $localtz =
new DateTimeZone(
'UTC');
3099 $dt =
new DateTime(
'now', $localtz);
3100 $dt->setDate((
int) $year, (
int) $month, (
int) $day);
3101 $dt->setTime((
int) $hour, (
int) $minute, (
int) $second);
3102 $date = $dt->getTimestamp();
3122 if ($mode ===
'auto') {
3126 if ($mode ==
'gmt') {
3128 } elseif ($mode ==
'tzserver') {
3129 require_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
3131 $ret = (int) (
dol_now(
'gmt') + ($tzsecond * 3600));
3137 } elseif ($mode ==
'tzuser' || $mode ==
'tzuserrel') {
3140 $offsettz = (empty($_SESSION[
'dol_tz']) ? 0 : $_SESSION[
'dol_tz']) * 60 * 60;
3141 $offsetdst = (empty($_SESSION[
'dol_dst']) ? 0 : $_SESSION[
'dol_dst']) * 60 * 60;
3142 $ret = (int) (
dol_now(
'gmt') + ($offsettz + $offsetdst));
3159 global $conf, $langs;
3162 if (!empty($conf->dol_optimize_smallscreen)) {
3167 if (empty($shortvalue) || $size < ($level * 10)) {
3169 $textunitshort = $langs->trans(
"b");
3170 $textunitlong = $langs->trans(
"Bytes");
3172 $ret = round($size / $level, 0);
3173 $textunitshort = $langs->trans(
"Kb");
3174 $textunitlong = $langs->trans(
"KiloBytes");
3177 if (empty($shortunit)) {
3178 $ret .=
' '.$textunitlong;
3180 $ret .=
' '.$textunitshort;
3196function dol_print_url($url, $target =
'_blank', $max = 32, $withpicto = 0, $morecss =
'float')
3204 $link =
'<a href="';
3205 if (!preg_match(
'/^http/i', $url)) {
3211 $link .=
' target="'.$target.
'"';
3214 if (!preg_match(
'/^http/i', $url)) {
3220 if ($morecss ==
'float') {
3221 return '<div class="nospan'.($morecss ?
' '.$morecss :
'').
'" style="margin-right: 10px">'.($withpicto ?
img_picto($langs->trans(
"Url"),
'globe').
' ' :
'').$link.
'</div>';
3223 return '<span class="nospan'.($morecss ?
' '.$morecss :
'').
'" style="margin-right: 10px">'.($withpicto ?
img_picto($langs->trans(
"Url"),
'globe').
' ' :
'').$link.
'</span>';
3239function dol_print_email($email, $cid = 0, $socid = 0, $addlink = 0, $max = 64, $showinvalid = 1, $withpicto = 0)
3241 global $conf, $user, $langs, $hookmanager;
3245 if (!empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER) && $withpicto) {
3249 if (empty($email)) {
3253 if (!empty($addlink)) {
3254 $newemail =
'<a style="text-overflow: ellipsis;" href="';
3255 if (!preg_match(
'/^mailto:/i', $email)) {
3256 $newemail .=
'mailto:';
3258 $newemail .= $email;
3261 $newemail .=
'</a>';
3263 $langs->load(
"errors");
3264 $newemail .=
img_warning($langs->trans(
"ErrorBadEMail", $email));
3267 if (($cid || $socid) && isModEnabled(
'agenda') && $user->hasRight(
"agenda",
"myactions",
"create")) {
3270 if (!empty($conf->global->AGENDA_ADDACTIONFOREMAIL)) {
3271 $link =
'<a href="'.DOL_URL_ROOT.
'/comm/action/card.php?action=create&backtopage=1&actioncode='.$type.
'&contactid='.$cid.
'&socid='.$socid.
'">'.
img_object($langs->trans(
"AddAction"),
"calendar").
'</a>';
3274 $newemail =
'<div>'.$newemail.
' '.$link.
'</div>';
3279 $langs->load(
"errors");
3280 $newemail .=
img_warning($langs->trans(
"ErrorBadEMail", $email));
3285 $rep = ($withpicto ?
img_picto($langs->trans(
"EMail").
' : '.$email, (is_numeric($withpicto) ?
'email' : $withpicto)).
' ' :
'').$newemail;
3288 $parameters = array(
'cid' => $cid,
'socid' => $socid,
'addlink' => $addlink,
'picto' => $withpicto);
3290 $reshook = $hookmanager->executeHooks(
'printEmail', $parameters, $email);
3294 $rep .= $hookmanager->resPrint;
3309 $socialnetworks = array();
3311 require_once DOL_DOCUMENT_ROOT.
'/core/lib/memory.lib.php';
3312 $cachekey =
'socialnetworks_' . $conf->entity;
3314 if (!is_null($dataretrieved)) {
3315 $socialnetworks = $dataretrieved;
3317 $sql =
"SELECT rowid, code, label, url, icon, active FROM ".MAIN_DB_PREFIX.
"c_socialnetworks";
3318 $sql .=
" WHERE entity=".$conf->entity;
3319 $resql = $db->query($sql);
3321 while ($obj = $db->fetch_object($resql)) {
3322 $socialnetworks[$obj->code] = array(
3323 'rowid' => $obj->rowid,
3324 'label' => $obj->label,
3326 'icon' => $obj->icon,
3327 'active' => $obj->active,
3334 return $socialnetworks;
3349 global $conf, $user, $langs;
3353 if (empty($value)) {
3357 if (!empty($type)) {
3358 $htmllink =
'<div class="divsocialnetwork inline-block valignmiddle">';
3360 $htmllink .=
'<span class="fa pictofixedwidth '.($dictsocialnetworks[$type][
'icon'] ? $dictsocialnetworks[$type][
'icon'] :
'fa-link').
'"></span>';
3361 if ($type ==
'skype') {
3363 $htmllink .=
' <a href="skype:';
3365 $htmllink .=
'?call" alt="'.$langs->trans(
"Call").
' '.$value.
'" title="'.
dol_escape_htmltag($langs->trans(
"Call").
' '.$value).
'">';
3366 $htmllink .=
'<img src="'.DOL_URL_ROOT.
'/theme/common/skype_callbutton.png" border="0">';
3367 $htmllink .=
'</a><a href="skype:';
3369 $htmllink .=
'?chat" alt="'.$langs->trans(
"Chat").
' '.$value.
'" title="'.
dol_escape_htmltag($langs->trans(
"Chat").
' '.$value).
'">';
3370 $htmllink .=
'<img class="paddingleft" src="'.DOL_URL_ROOT.
'/theme/common/skype_chatbutton.png" border="0">';
3371 $htmllink .=
'</a>';
3372 if (($cid || $socid) && isModEnabled(
'agenda') && $user->hasRight(
'agenda',
'myactions',
'create')) {
3373 $addlink =
'AC_SKYPE';
3375 if (!empty($conf->global->AGENDA_ADDACTIONFORSKYPE)) {
3376 $link =
'<a href="'.DOL_URL_ROOT.
'/comm/action/card.php?action=create&backtopage=1&actioncode='.$addlink.
'&contactid='.$cid.
'&socid='.$socid.
'">'.
img_object($langs->trans(
"AddAction"),
"calendar").
'</a>';
3378 $htmllink .= ($link ?
' '.$link :
'');
3381 if (!empty($dictsocialnetworks[$type][
'url'])) {
3382 $tmpvirginurl = preg_replace(
'/\/?{socialid}/',
'', $dictsocialnetworks[$type][
'url']);
3383 if ($tmpvirginurl) {
3384 $value = preg_replace(
'/^www\.'.preg_quote($tmpvirginurl,
'/').
'\/?/',
'', $value);
3385 $value = preg_replace(
'/^'.preg_quote($tmpvirginurl,
'/').
'\/?/',
'', $value);
3387 $tmpvirginurl3 = preg_replace(
'/^https:\/\//i',
'https://www.', $tmpvirginurl);
3388 if ($tmpvirginurl3) {
3389 $value = preg_replace(
'/^www\.'.preg_quote($tmpvirginurl3,
'/').
'\/?/',
'', $value);
3390 $value = preg_replace(
'/^'.preg_quote($tmpvirginurl3,
'/').
'\/?/',
'', $value);
3393 $tmpvirginurl2 = preg_replace(
'/^https?:\/\//i',
'', $tmpvirginurl);
3394 if ($tmpvirginurl2) {
3395 $value = preg_replace(
'/^www\.'.preg_quote($tmpvirginurl2,
'/').
'\/?/',
'', $value);
3396 $value = preg_replace(
'/^'.preg_quote($tmpvirginurl2,
'/').
'\/?/',
'', $value);
3399 $link = str_replace(
'{socialid}', $value, $dictsocialnetworks[$type][
'url']);
3400 if (preg_match(
'/^https?:\/\//i', $link)) {
3401 $htmllink .=
'<a href="'.dol_sanitizeUrl($link, 0).
'" target="_blank" rel="noopener noreferrer">'.
dol_escape_htmltag($value).
'</a>';
3403 $htmllink .=
'<a href="'.dol_sanitizeUrl($link, 1).
'" target="_blank" rel="noopener noreferrer">'.
dol_escape_htmltag($value).
'</a>';
3409 $htmllink .=
'</div>';
3411 $langs->load(
"errors");
3412 $htmllink .=
img_warning($langs->trans(
"ErrorBadSocialNetworkValue", $value));
3427function dol_print_profids($profID, $profIDtype, $countrycode =
'', $addcpButton = 1, $separ =
' ')
3431 if (empty($profID) || empty($profIDtype)) {
3434 if (empty($countrycode)) $countrycode = $mysoc->country_code;
3435 $newProfID = $profID;
3436 $id = substr($profIDtype, -1);
3438 if (strtoupper($countrycode) ==
'FR') {
3440 if ($id == 1 &&
dol_strlen($newProfID) == 9) $newProfID = substr($newProfID, 0, 3).$separ.substr($newProfID, 3, 3).$separ.substr($newProfID, 6, 3);
3441 if ($id == 2 &&
dol_strlen($newProfID) == 14) $newProfID = substr($newProfID, 0, 3).$separ.substr($newProfID, 3, 3).$separ.substr($newProfID, 6, 3).$separ.substr($newProfID, 9, 5);
3442 if ($profIDtype ===
'VAT' &&
dol_strlen($newProfID) == 13) $newProfID = substr($newProfID, 0, 4).$separ.substr($newProfID, 4, 3).$separ.substr($newProfID, 7, 3).$separ.substr($newProfID, 10, 3);
3445 else $ret = $newProfID;
3463function dol_print_phone($phone, $countrycode =
'', $cid = 0, $socid = 0, $addlink =
'', $separ =
" ", $withpicto =
'', $titlealt =
'', $adddivfloat = 0)
3465 global $conf, $user, $langs, $mysoc, $hookmanager;
3468 $phone = is_null($phone) ?
'' : preg_replace(
"/[\s.-]/",
"", trim($phone));
3469 if (empty($phone)) {
3472 if (!empty($conf->global->MAIN_PHONE_SEPAR)) {
3473 $separ = $conf->global->MAIN_PHONE_SEPAR;
3475 if (empty($countrycode) && is_object($mysoc)) {
3476 $countrycode = $mysoc->country_code;
3480 if ($conf->dol_optimize_smallscreen) {
3485 if (strtoupper($countrycode) ==
"FR") {
3488 $newphone = substr($newphone, 0, 2).$separ.substr($newphone, 2, 2).$separ.substr($newphone, 4, 2).$separ.substr($newphone, 6, 2).$separ.substr($newphone, 8, 2);
3490 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 2).$separ.substr($newphone, 5, 2);
3492 $newphone = substr($newphone, 0, 2).$separ.substr($newphone, 2, 3).$separ.substr($newphone, 5, 2).$separ.substr($newphone, 7, 2);
3494 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 2).$separ.substr($newphone, 5, 2).$separ.substr($newphone, 7, 2).$separ.substr($newphone, 9, 2);
3496 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 1).$separ.substr($newphone, 4, 2).$separ.substr($newphone, 6, 2).$separ.substr($newphone, 8, 2).$separ.substr($newphone, 10, 2);
3498 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 2).$separ.substr($newphone, 6, 2).$separ.substr($newphone, 8, 3).$separ.substr($newphone, 11, 2);
3500 } elseif (strtoupper($countrycode) ==
"CA") {
3502 $newphone = ($separ !=
'' ?
'(' :
'').substr($newphone, 0, 3).($separ !=
'' ?
')' :
'').$separ.substr($newphone, 3, 3).($separ !=
'' ?
'-' :
'').substr($newphone, 6, 4);
3504 } elseif (strtoupper($countrycode) ==
"PT") {
3506 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 3);
3508 } elseif (strtoupper($countrycode) ==
"SR") {
3510 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3);
3512 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 4);
3514 } elseif (strtoupper($countrycode) ==
"DE") {
3516 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 4).$separ.substr($newphone, 7, 4).$separ.substr($newphone, 11, 3);
3518 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 4).$separ.substr($newphone, 10, 3);
3520 } elseif (strtoupper($countrycode) ==
"ES") {
3522 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 3);
3524 } elseif (strtoupper($countrycode) ==
"BF") {
3526 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 1).$separ.substr($newphone, 4, 2).$separ.substr($newphone, 6, 2).$separ.substr($newphone, 8, 2).$separ.substr($newphone, 10, 2);
3528 } elseif (strtoupper($countrycode) ==
"RO") {
3530 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 2).$separ.substr($newphone, 5, 3).$separ.substr($newphone, 8, 2).$separ.substr($newphone, 10, 2);
3532 } elseif (strtoupper($countrycode) ==
"TR") {
3534 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 4);
3536 } elseif (strtoupper($countrycode) ==
"US") {
3538 $newphone = substr($newphone, 0, 2).$separ.substr($newphone, 2, 3).$separ.substr($newphone, 5, 3).$separ.substr($newphone, 8, 4);
3540 } elseif (strtoupper($countrycode) ==
"MX") {
3542 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 4).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 2);
3544 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 2).$separ.substr($newphone, 5, 2).$separ.substr($newphone, 7, 2).$separ.substr($newphone, 9, 2);
3546 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 4);
3548 } elseif (strtoupper($countrycode) ==
"ML") {
3550 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 2).$separ.substr($newphone, 6, 2).$separ.substr($newphone, 8, 2).$separ.substr($newphone, 10, 2);
3552 } elseif (strtoupper($countrycode) ==
"TH") {
3554 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 2).$separ.substr($newphone, 8, 3);
3556 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 1).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 2).$separ.substr($newphone, 9, 3);
3558 } elseif (strtoupper($countrycode) ==
"MU") {
3561 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 2).$separ.substr($newphone, 9, 2);
3563 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 4).$separ.substr($newphone, 8, 2).$separ.substr($newphone, 10, 2);
3565 } elseif (strtoupper($countrycode) ==
"ZA") {
3567 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 2).$separ.substr($newphone, 5, 3).$separ.substr($newphone, 8, 2).$separ.substr($newphone, 10, 2);
3569 } elseif (strtoupper($countrycode) ==
"SY") {
3571 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 2).$separ.substr($newphone, 6, 2).$separ.substr($newphone, 8, 2).$separ.substr($newphone, 10, 2);
3573 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 2).$separ.substr($newphone, 6, 2).$separ.substr($newphone, 8, 2).$separ.substr($newphone, 10, 3);
3575 } elseif (strtoupper($countrycode) ==
"AE") {
3577 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 2);
3579 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 3);
3581 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 4);
3583 } elseif (strtoupper($countrycode) ==
"DZ") {
3585 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 3);
3587 } elseif (strtoupper($countrycode) ==
"BE") {
3589 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 2).$separ.substr($newphone, 8, 3);
3591 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 3);
3593 } elseif (strtoupper($countrycode) ==
"PF") {
3595 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 2).$separ.substr($newphone, 6, 2).$separ.substr($newphone, 8, 2).$separ.substr($newphone, 10, 2);
3597 } elseif (strtoupper($countrycode) ==
"CO") {
3599 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 2).$separ.substr($newphone, 11, 2);
3601 } elseif (strtoupper($countrycode) ==
"JO") {
3603 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 1).$separ.substr($newphone, 5, 3).$separ.substr($newphone, 7, 2).$separ.substr($newphone, 9, 2);
3605 } elseif (strtoupper($countrycode) ==
"JM") {
3607 $newphone = substr($newphone, 0, 5).$separ.substr($newphone, 5, 3).$separ.substr($newphone, 8, 4);
3609 } elseif (strtoupper($countrycode) ==
"MG") {
3611 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 2).$separ.substr($newphone, 6, 2).$separ.substr($newphone, 8, 3).$separ.substr($newphone, 11, 2);
3613 } elseif (strtoupper($countrycode) ==
"GB") {
3615 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 4).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 3);
3617 } elseif (strtoupper($countrycode) ==
"CH") {
3619 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 2).$separ.substr($newphone, 5, 3).$separ.substr($newphone, 8, 2).$separ.substr($newphone, 10, 2);
3621 $newphone = $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 2).$separ.substr($newphone, 5, 3).$separ.substr($newphone, 8, 3).$separ.substr($newphone, 11, 4);
3623 } elseif (strtoupper($countrycode) ==
"TN") {
3625 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 2).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 3);
3627 } elseif (strtoupper($countrycode) ==
"GF") {
3629 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 2).$separ.substr($newphone, 9, 2).$separ.substr($newphone, 11, 2);
3631 } elseif (strtoupper($countrycode) ==
"GP") {
3633 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 2).$separ.substr($newphone, 9, 2).$separ.substr($newphone, 11, 2);
3635 } elseif (strtoupper($countrycode) ==
"MQ") {
3637 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 2).$separ.substr($newphone, 9, 2).$separ.substr($newphone, 11, 2);
3639 } elseif (strtoupper($countrycode) ==
"IT") {
3641 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 3);
3643 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 2).$separ.substr($newphone, 11, 2);
3645 } elseif (strtoupper($countrycode) ==
"AU") {
3649 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 1).$separ.substr($newphone, 4, 4).$separ.substr($newphone, 8, 4);
3651 } elseif (strtoupper($countrycode) ==
"LU") {
3654 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 2).$separ.substr($newphone, 6, 2).$separ.substr($newphone, 8, 2);
3656 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 2).$separ.substr($newphone, 6, 2).$separ.substr($newphone, 8, 2).$separ.substr($newphone, 10, 1);
3658 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 2).$separ.substr($newphone, 6, 2).$separ.substr($newphone, 8, 2).$separ.substr($newphone, 10, 2);
3660 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 2).$separ.substr($newphone, 9, 2).$separ.substr($newphone, 11, 2);
3663 if (!empty($addlink)) {
3664 if ($addlink ==
'tel' || $conf->browser->layout ==
'phone' || (isModEnabled(
'clicktodial') && !empty($conf->global->CLICKTODIAL_USE_TEL_LINK_ON_PHONE_NUMBERS))) {
3665 $newphoneform = $newphone;
3666 $newphone =
'<a href="tel:'.$phone.
'"';
3667 $newphone .=
'>'.$newphoneform.
'</a>';
3668 } elseif (isModEnabled(
'clicktodial') && $addlink ==
'AC_TEL') {
3669 if (empty($user->clicktodial_loaded)) {
3670 $user->fetch_clicktodial();
3674 $urlmask =
'ErrorClickToDialModuleNotConfigured';
3675 if (!empty($conf->global->CLICKTODIAL_URL)) {
3676 $urlmask = $conf->global->CLICKTODIAL_URL;
3678 if (!empty($user->clicktodial_url)) {
3679 $urlmask = $user->clicktodial_url;
3682 $clicktodial_poste = (!empty($user->clicktodial_poste) ?urlencode($user->clicktodial_poste) :
'');
3683 $clicktodial_login = (!empty($user->clicktodial_login) ?urlencode($user->clicktodial_login) :
'');
3684 $clicktodial_password = (!empty($user->clicktodial_password) ?urlencode($user->clicktodial_password) :
'');
3686 $url = sprintf($urlmask, urlencode($phone), $clicktodial_poste, $clicktodial_login, $clicktodial_password);
3688 $substitarray = array(
'__PHONEFROM__'=>$clicktodial_poste,
3689 '__PHONETO__'=>urlencode($phone),
3690 '__LOGIN__'=>$clicktodial_login,
3691 '__PASS__'=>$clicktodial_password);
3693 $newphonesav = $newphone;
3694 if (empty($conf->global->CLICKTODIAL_DO_NOT_USE_AJAX_CALL)) {
3696 $newphone =
'<a href="'.$url.
'" class="cssforclicktodial"';
3697 $newphone .=
'>'.$newphonesav.
'</a>';
3700 $newphone =
'<a href="'.$url.
'"';
3701 if (!empty($conf->global->CLICKTODIAL_FORCENEWTARGET)) {
3702 $newphone .=
' target="_blank" rel="noopener noreferrer"';
3704 $newphone .=
'>'.$newphonesav.
'</a>';
3709 if (isModEnabled(
'agenda') && $user->hasRight(
"agenda",
"myactions",
"create")) {
3712 if ($addlink ==
'AC_FAX') {
3715 if (!empty($conf->global->AGENDA_ADDACTIONFORPHONE)) {
3716 $link =
'<a href="'.DOL_URL_ROOT.
'/comm/action/card.php?action=create&backtopage='. urlencode($_SERVER[
'REQUEST_URI']) .
'&actioncode='.$type.($cid ?
'&contactid='.$cid :
'').($socid ?
'&socid='.$socid :
'').
'">'.
img_object($langs->trans(
"AddAction"),
"calendar").
'</a>';
3719 $newphone =
'<div>'.$newphone.
' '.$link.
'</div>';
3724 if (empty($titlealt)) {
3725 $titlealt = ($withpicto ==
'fax' ? $langs->trans(
"Fax") : $langs->trans(
"Phone"));
3730 $parameters = array(
'countrycode' => $countrycode,
'cid' => $cid,
'socid' => $socid,
'titlealt' => $titlealt,
'picto' => $withpicto);
3731 $reshook = $hookmanager->executeHooks(
'printPhone', $parameters, $phone);
3732 $rep .= $hookmanager->resPrint;
3734 if (empty($reshook)) {
3737 if ($withpicto ==
'fax') {
3738 $picto =
'phoning_fax';
3739 } elseif ($withpicto ==
'phone') {
3741 } elseif ($withpicto ==
'mobile') {
3742 $picto =
'phoning_mobile';
3747 if ($adddivfloat == 1) {
3748 $rep .=
'<div class="nospan float" style="margin-right: 10px">';
3749 } elseif (empty($adddivfloat)) {
3750 $rep .=
'<span style="margin-right: 10px;">';
3752 $rep .= ($withpicto ?
img_picto($titlealt,
'object_'.$picto.
'.png').
' ' :
'').$newphone;
3753 if ($adddivfloat == 1) {
3755 } elseif (empty($adddivfloat)) {
3772 global $conf, $langs;
3783 if (file_exists(DOL_DOCUMENT_ROOT.
'/theme/common/flags/'.$countrycode.
'.png')) {
3784 $ret .=
' '.img_picto($countrycode.
' '.$langs->trans(
"AccordingToGeoIPDatabase"), DOL_URL_ROOT.
'/theme/common/flags/'.$countrycode.
'.png',
'', 1);
3786 $ret .=
' ('.$countrycode.
')';
3806 if (empty($_SERVER[
'HTTP_X_FORWARDED_FOR']) || preg_match(
'/[^0-9\.\:,\[\]]/', $_SERVER[
'HTTP_X_FORWARDED_FOR'])) {
3807 if (empty($_SERVER[
'HTTP_CLIENT_IP']) || preg_match(
'/[^0-9\.\:,\[\]]/', $_SERVER[
'HTTP_CLIENT_IP'])) {
3808 if (empty($_SERVER[
"HTTP_CF_CONNECTING_IP"])) {
3809 $ip = (empty($_SERVER[
'REMOTE_ADDR']) ?
'' : $_SERVER[
'REMOTE_ADDR']);
3811 $ip = $_SERVER[
"HTTP_CF_CONNECTING_IP"];
3814 $ip = $_SERVER[
'HTTP_CLIENT_IP'];
3817 $ip = $_SERVER[
'HTTP_X_FORWARDED_FOR'];
3833 if (isset($_SERVER[
'HTTPS']) && $_SERVER[
'HTTPS'] ==
'on') {
3835 } elseif (!empty($_SERVER[
'HTTP_X_FORWARDED_PROTO']) && $_SERVER[
'HTTP_X_FORWARDED_PROTO'] ==
'https' || !empty($_SERVER[
'HTTP_X_FORWARDED_SSL']) && $_SERVER[
'HTTP_X_FORWARDED_SSL'] ==
'on') {
3853 if (!empty($conf->geoipmaxmind->enabled)) {
3857 include_once DOL_DOCUMENT_ROOT.
'/core/class/dolgeoip.class.php';
3858 $geoip =
new DolGeoIP(
'country', $datafile);
3860 $countrycode = $geoip->getCountryCodeFromIP($ip);
3863 return $countrycode;
3875 global $conf, $langs, $user;
3879 if (!empty($conf->geoipmaxmind->enabled)) {
3884 include_once DOL_DOCUMENT_ROOT.
'/core/class/dolgeoip.class.php';
3885 $geoip =
new DolGeoIP(
'country', $datafile);
3886 $countrycode = $geoip->getCountryCodeFromIP($ip);
3887 $ret = $countrycode;
3906 global $conf, $user, $langs, $hookmanager;
3912 $parameters = array(
'element' => $element,
'id' => $id);
3913 $reshook = $hookmanager->executeHooks(
'printAddress', $parameters, $address);
3914 $out .= $hookmanager->resPrint;
3916 if (empty($reshook)) {
3917 if (empty($charfornl)) {
3918 $out .= nl2br($address);
3920 $out .= preg_replace(
'/[\r\n]+/', $charfornl, $address);
3924 $showgmap = $showomap = 0;
3925 if (($element ==
'thirdparty' || $element ==
'societe') && isModEnabled(
'google') && !empty($conf->global->GOOGLE_ENABLE_GMAPS)) {
3928 if ($element ==
'contact' && isModEnabled(
'google') && !empty($conf->global->GOOGLE_ENABLE_GMAPS_CONTACTS)) {
3931 if ($element ==
'member' && isModEnabled(
'google') && !empty($conf->global->GOOGLE_ENABLE_GMAPS_MEMBERS)) {
3934 if (($element ==
'thirdparty' || $element ==
'societe') && isModEnabled(
'openstreetmap') && !empty($conf->global->OPENSTREETMAP_ENABLE_MAPS)) {
3937 if ($element ==
'contact' && isModEnabled(
'openstreetmap') && !empty($conf->global->OPENSTREETMAP_ENABLE_MAPS_CONTACTS)) {
3940 if ($element ==
'member' && isModEnabled(
'openstreetmap') && !empty($conf->global->OPENSTREETMAP_ENABLE_MAPS_MEMBERS)) {
3944 $url =
dol_buildpath(
'/google/gmaps.php?mode='.$element.
'&id='.$id, 1);
3945 $out .=
' <a href="'.$url.
'" target="_gmaps"><img id="'.$htmlid.
'" class="valigntextbottom" src="'.DOL_URL_ROOT.
'/theme/common/gmap.png"></a>';
3948 $url =
dol_buildpath(
'/openstreetmap/maps.php?mode='.$element.
'&id='.$id, 1);
3949 $out .=
' <a href="'.$url.
'" target="_gmaps"><img id="'.$htmlid.
'_openstreetmap" class="valigntextbottom" src="'.DOL_URL_ROOT.
'/theme/common/gmap.png"></a>';
3970function isValidEmail($address, $acceptsupervisorkey = 0, $acceptuserkey = 0)
3972 if ($acceptsupervisorkey && $address ==
'__SUPERVISOREMAIL__') {
3975 if ($acceptuserkey && $address ==
'__USER_EMAIL__') {
3978 if (filter_var($address, FILTER_VALIDATE_EMAIL)) {
3995 if (function_exists(
'idn_to_ascii') && function_exists(
'checkdnsrr')) {
3996 if (!checkdnsrr(idn_to_ascii($domain),
'MX')) {
3999 if (function_exists(
'getmxrr')) {
4002 getmxrr(idn_to_ascii($domain), $mxhosts, $weight);
4003 if (count($mxhosts) > 1) {
4006 if (count($mxhosts) == 1 && !empty($mxhosts[0])) {
4043 $tmparray = explode(
' ', $s);
4044 foreach ($tmparray as $tmps) {
4061 if (is_null($string)) {
4065 if (function_exists(
'mb_strlen')) {
4066 return mb_strlen($string, $stringencoding);
4068 return strlen($string);
4082function dol_substr($string, $start, $length =
null, $stringencoding =
'', $trunconbytes = 0)
4086 if (empty($stringencoding)) {
4087 $stringencoding = $langs->charset_output;
4091 if (empty($trunconbytes)) {
4092 if (function_exists(
'mb_substr')) {
4093 $ret = mb_substr($string, $start, $length, $stringencoding);
4095 $ret = substr($string, $start, $length);
4098 if (function_exists(
'mb_strcut')) {
4099 $ret = mb_strcut($string, $start, $length, $stringencoding);
4101 $ret = substr($string, $start, $length);
4121function dol_trunc($string, $size = 40, $trunc =
'right', $stringencoding =
'UTF-8', $nodot = 0, $display = 0)
4125 if (empty($size) || !empty($conf->global->MAIN_DISABLE_TRUNC)) {
4129 if (empty($stringencoding)) {
4130 $stringencoding =
'UTF-8';
4133 if ($conf->dol_optimize_smallscreen == 1 && $display == 1) {
4134 $size = round($size / 3);
4138 if ($trunc ==
'right') {
4140 if (
dol_strlen($newstring, $stringencoding) > ($size + ($nodot ? 0 : 1))) {
4142 return dol_substr($newstring, 0, $size, $stringencoding).($nodot ?
'' :
'…');
4147 } elseif ($trunc ==
'middle') {
4149 if (
dol_strlen($newstring, $stringencoding) > 2 &&
dol_strlen($newstring, $stringencoding) > ($size + 1)) {
4150 $size1 = round($size / 2);
4151 $size2 = round($size / 2);
4152 return dol_substr($newstring, 0, $size1, $stringencoding).
'…'.
dol_substr($newstring,
dol_strlen($newstring, $stringencoding) - $size2, $size2, $stringencoding);
4156 } elseif ($trunc ==
'left') {
4158 if (
dol_strlen($newstring, $stringencoding) > ($size + ($nodot ? 0 : 1))) {
4160 return '…'.dol_substr($newstring,
dol_strlen($newstring, $stringencoding) - $size, $size, $stringencoding);
4164 } elseif ($trunc ==
'wrap') {
4166 if (
dol_strlen($newstring, $stringencoding) > ($size + 1)) {
4172 return 'BadParam3CallingDolTrunc';
4197function img_picto($titlealt, $picto, $moreatt =
'', $pictoisfullpath =
false, $srconly = 0, $notitle = 0, $alt =
'', $morecss =
'', $marginleftonlyshort = 2)
4199 global $conf, $langs;
4202 $url = DOL_URL_ROOT;
4203 $theme = isset($conf->theme) ? $conf->theme :
null;
4204 $path =
'theme/'.$theme;
4206 if ($pictoisfullpath) {
4208 if (!preg_match(
'/(\.png|\.gif|\.svg)$/i', $picto)) {
4211 $fullpathpicto = $picto;
4213 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
4214 $morecss .= ($morecss ?
' ' :
'').$reg[1];
4215 $moreatt = str_replace(
'class="'.$reg[1].
'"',
'', $moreatt);
4218 $pictowithouttext = preg_replace(
'/(\.png|\.gif|\.svg)$/',
'', $picto);
4219 $pictowithouttext = str_replace(
'object_',
'', $pictowithouttext);
4220 $pictowithouttext = str_replace(
'_nocolor',
'', $pictowithouttext);
4222 if (strpos($pictowithouttext,
'fontawesome_') !==
false || preg_match(
'/^fa-/', $pictowithouttext)) {
4224 $pictowithouttext = str_replace(
'fontawesome_',
'', $pictowithouttext);
4225 $pictowithouttext = str_replace(
'fa-',
'', $pictowithouttext);
4227 $pictowithouttextarray = explode(
'_', $pictowithouttext);
4228 $marginleftonlyshort = 0;
4230 if (!empty($pictowithouttextarray[1])) {
4232 $fakey =
'fa-'.$pictowithouttextarray[0];
4233 $fa = empty($pictowithouttextarray[1]) ?
'fa' : $pictowithouttextarray[1];
4234 $facolor = empty($pictowithouttextarray[2]) ?
'' : $pictowithouttextarray[2];
4235 $fasize = empty($pictowithouttextarray[3]) ?
'' : $pictowithouttextarray[3];
4237 $fakey =
'fa-'.$pictowithouttext;
4247 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
4248 $morecss .= ($morecss ?
' ' :
'').$reg[1];
4249 $moreatt = str_replace(
'class="'.$reg[1].
'"',
'', $moreatt);
4251 if (preg_match(
'/style="([^"]+)"/', $moreatt, $reg)) {
4252 $morestyle = $reg[1];
4253 $moreatt = str_replace(
'style="'.$reg[1].
'"',
'', $moreatt);
4255 $moreatt = trim($moreatt);
4257 $enabledisablehtml =
'<span class="'.$fa.
' '.$fakey.($marginleftonlyshort ? ($marginleftonlyshort == 1 ?
' marginleftonlyshort' :
' marginleftonly') :
'');
4258 $enabledisablehtml .= ($morecss ?
' '.$morecss :
'').
'" style="'.($fasize ? (
'font-size: '.$fasize.
';') :
'').($facolor ? (
' color: '.$facolor.
';') :
'').($morestyle ?
' '.$morestyle :
'').
'"'.(($notitle || empty($titlealt)) ?
'' :
' title="'.dol_escape_htmltag($titlealt).
'"').($moreatt ?
' '.$moreatt :
'').
'>';
4262 $enabledisablehtml .=
'</span>';
4264 return $enabledisablehtml;
4267 if (empty($srconly) && in_array($pictowithouttext, array(
4268 '1downarrow',
'1uparrow',
'1leftarrow',
'1rightarrow',
'1uparrow_selected',
'1downarrow_selected',
'1leftarrow_selected',
'1rightarrow_selected',
4269 'accountancy',
'accounting_account',
'account',
'accountline',
'action',
'add',
'address',
'angle-double-down',
'angle-double-up',
'asset',
4270 'bank_account',
'barcode',
'bank',
'bell',
'bill',
'billa',
'billr',
'billd',
'birthday-cake',
'bookmark',
'bom',
'briefcase-medical',
'bug',
'building',
4271 'card',
'calendarlist',
'calendar',
'calendarmonth',
'calendarweek',
'calendarday',
'calendarperuser',
'calendarpertype',
4272 'cash-register',
'category',
'chart',
'check',
'clock',
'clone',
'close_title',
'cog',
'collab',
'company',
'contact',
'country',
'contract',
'conversation',
'cron',
'cross',
'cubes',
4273 'currency',
'multicurrency',
4274 'delete',
'dolly',
'dollyrevert',
'donation',
'download',
'dynamicprice',
4275 'edit',
'ellipsis-h',
'email',
'entity',
'envelope',
'eraser',
'establishment',
'expensereport',
'external-link-alt',
'external-link-square-alt',
'eye',
4276 'filter',
'file-code',
'file-export',
'file-import',
'file-upload',
'autofill',
'folder',
'folder-open',
'folder-plus',
4277 'gears',
'generate',
'generic',
'globe',
'globe-americas',
'graph',
'grip',
'grip_title',
'group',
4278 'hands-helping',
'help',
'holiday',
4279 'id-card',
'images',
'incoterm',
'info',
'intervention',
'inventory',
'intracommreport',
'jobprofile',
4280 'knowledgemanagement',
4281 'label',
'language',
'line',
'link',
'list',
'list-alt',
'listlight',
'loan',
'lock',
'lot',
'long-arrow-alt-right',
4282 'margin',
'map-marker-alt',
'member',
'meeting',
'money-bill-alt',
'movement',
'mrp',
'note',
'next',
4283 'off',
'on',
'order',
4284 'paiment',
'paragraph',
'play',
'pdf',
'phone',
'phoning',
'phoning_mobile',
'phoning_fax',
'playdisabled',
'previous',
'poll',
'pos',
'printer',
'product',
'propal',
'proposal',
'puce',
4285 'stock',
'resize',
'service',
'stats',
'trip',
4286 'security',
'setup',
'share-alt',
'sign-out',
'split',
'stripe',
'stripe-s',
'switch_off',
'switch_on',
'switch_on_warning',
'switch_on_red',
'tools',
'unlink',
'uparrow',
'user',
'user-tie',
'vcard',
'wrench',
4287 'github',
'google',
'jabber',
'microsoft',
'skype',
'twitter',
'facebook',
'linkedin',
'instagram',
'snapchat',
'youtube',
'google-plus-g',
'whatsapp',
4288 'chevron-left',
'chevron-right',
'chevron-down',
'chevron-top',
'commercial',
'companies',
4289 'generic',
'home',
'hrm',
'members',
'products',
'invoicing',
4290 'partnership',
'payment',
'payment_vat',
'pencil-ruler',
'pictoconfirm',
'preview',
'project',
'projectpub',
'projecttask',
'question',
'refresh',
'region',
4291 'salary',
'shipment',
'state',
'supplier_invoice',
'supplier_invoicea',
'supplier_invoicer',
'supplier_invoiced',
4292 'technic',
'ticket',
4294 'recent',
'reception',
'recruitmentcandidature',
'recruitmentjobposition',
'replacement',
'resource',
'recurring',
'rss',
4295 'shapes',
'skill',
'square',
'stop-circle',
'supplier',
'supplier_proposal',
'supplier_order',
'supplier_invoice',
4296 'timespent',
'title_setup',
'title_accountancy',
'title_bank',
'title_hrm',
'title_agenda',
4297 'uncheck',
'url',
'user-cog',
'user-injured',
'user-md',
'vat',
'website',
'workstation',
'webhook',
'world',
'private',
4298 'conferenceorbooth',
'eventorganization',
4299 'stamp',
'signature'
4301 $fakey = $pictowithouttext;
4305 if (in_array($pictowithouttext, array(
'card',
'bell',
'clock',
'establishment',
'generic',
'minus-square',
'object_generic',
'pdf',
'plus-square',
'timespent',
'note',
'off',
'on',
'object_bookmark',
'bookmark',
'vcard'))) {
4308 if (in_array($pictowithouttext, array(
'black-tie',
'github',
'google',
'microsoft',
'skype',
'twitter',
'facebook',
'linkedin',
'instagram',
'snapchat',
'stripe',
'stripe-s',
'youtube',
'google-plus-g',
'whatsapp'))) {
4312 $arrayconvpictotofa = array(
4313 'account'=>
'university',
'accounting_account'=>
'clipboard-list',
'accountline'=>
'receipt',
'accountancy'=>
'search-dollar',
'action'=>
'calendar-alt',
'add'=>
'plus-circle',
'address'=>
'address-book',
'asset'=>
'money-check-alt',
'autofill'=>
'fill',
4314 'bank_account'=>
'university',
4315 'bill'=>
'file-invoice-dollar',
'billa'=>
'file-excel',
'billr'=>
'file-invoice-dollar',
'billd'=>
'file-medical',
4316 'supplier_invoice'=>
'file-invoice-dollar',
'supplier_invoicea'=>
'file-excel',
'supplier_invoicer'=>
'file-invoice-dollar',
'supplier_invoiced'=>
'file-medical',
4318 'card'=>
'address-card',
'chart'=>
'chart-line',
'company'=>
'building',
'contact'=>
'address-book',
'contract'=>
'suitcase',
'collab'=>
'people-arrows',
'conversation'=>
'comments',
'country'=>
'globe-americas',
'cron'=>
'business-time',
'cross'=>
'times',
4319 'donation'=>
'file-alt',
'dynamicprice'=>
'hand-holding-usd',
4320 'setup'=>
'cog',
'companies'=>
'building',
'products'=>
'cube',
'commercial'=>
'suitcase',
'invoicing'=>
'coins',
4321 'accounting'=>
'search-dollar',
'category'=>
'tag',
'dollyrevert'=>
'dolly',
4322 'generate'=>
'plus-square',
'hrm'=>
'user-tie',
'incoterm'=>
'truck-loading',
4323 'margin'=>
'calculator',
'members'=>
'user-friends',
'ticket'=>
'ticket-alt',
'globe'=>
'external-link-alt',
'lot'=>
'barcode',
4324 'email'=>
'at',
'establishment'=>
'building',
'edit'=>
'pencil-alt',
'entity'=>
'globe',
4325 'graph'=>
'chart-line',
'grip_title'=>
'arrows-alt',
'grip'=>
'arrows-alt',
'help'=>
'question-circle',
4326 'generic'=>
'file',
'holiday'=>
'umbrella-beach',
4327 'info'=>
'info-circle',
'inventory'=>
'boxes',
'intracommreport'=>
'globe-europe',
'jobprofile'=>
'cogs',
4328 'knowledgemanagement'=>
'ticket-alt',
'label'=>
'layer-group',
'line'=>
'bars',
'loan'=>
'money-bill-alt',
4329 'member'=>
'user-alt',
'meeting'=>
'chalkboard-teacher',
'mrp'=>
'cubes',
'next'=>
'arrow-alt-circle-right',
4330 'trip'=>
'wallet',
'expensereport'=>
'wallet',
'group'=>
'users',
'movement'=>
'people-carry',
4331 'sign-out'=>
'sign-out-alt',
4332 'switch_off'=>
'toggle-off',
'switch_on'=>
'toggle-on',
'switch_on_warning'=>
'toggle-on',
'switch_on_red'=>
'toggle-on',
'check'=>
'check',
'bookmark'=>
'star',
4333 'bank'=>
'university',
'close_title'=>
'times',
'delete'=>
'trash',
'filter'=>
'filter',
4334 'list-alt'=>
'list-alt',
'calendarlist'=>
'bars',
'calendar'=>
'calendar-alt',
'calendarmonth'=>
'calendar-alt',
'calendarweek'=>
'calendar-week',
'calendarday'=>
'calendar-day',
'calendarperuser'=>
'table',
4335 'intervention'=>
'ambulance',
'invoice'=>
'file-invoice-dollar',
'currency'=>
'dollar-sign',
'multicurrency'=>
'dollar-sign',
'order'=>
'file-invoice',
4336 'error'=>
'exclamation-triangle',
'warning'=>
'exclamation-triangle',
4338 'playdisabled'=>
'play',
'pdf'=>
'file-pdf',
'poll'=>
'check-double',
'pos'=>
'cash-register',
'preview'=>
'binoculars',
'project'=>
'project-diagram',
'projectpub'=>
'project-diagram',
'projecttask'=>
'tasks',
'propal'=>
'file-signature',
'proposal'=>
'file-signature',
4339 'partnership'=>
'handshake',
'payment'=>
'money-check-alt',
'payment_vat'=>
'money-check-alt',
'pictoconfirm'=>
'check-square',
'phoning'=>
'phone',
'phoning_mobile'=>
'mobile-alt',
'phoning_fax'=>
'fax',
'previous'=>
'arrow-alt-circle-left',
'printer'=>
'print',
'product'=>
'cube',
'puce'=>
'angle-right',
4340 'recent' =>
'check-square',
'reception'=>
'dolly',
'recruitmentjobposition'=>
'id-card-alt',
'recruitmentcandidature'=>
'id-badge',
4341 'resize'=>
'crop',
'supplier_order'=>
'dol-order_supplier',
'supplier_proposal'=>
'file-signature',
4342 'refresh'=>
'redo',
'region'=>
'map-marked',
'replacement'=>
'exchange-alt',
'resource'=>
'laptop-house',
'recurring'=>
'history',
4343 'service'=>
'concierge-bell',
4344 'skill'=>
'shapes',
'state'=>
'map-marked-alt',
'security'=>
'key',
'salary'=>
'wallet',
'shipment'=>
'dolly',
'stock'=>
'box-open',
'stats' =>
'chart-bar',
'split'=>
'code-branch',
'stripe'=>
'stripe-s',
4345 'supplier'=>
'building',
'technic'=>
'cogs',
4346 'timespent'=>
'clock',
'title_setup'=>
'tools',
'title_accountancy'=>
'money-check-alt',
'title_bank'=>
'university',
'title_hrm'=>
'umbrella-beach',
4347 'title_agenda'=>
'calendar-alt',
4348 'uncheck'=>
'times',
'uparrow'=>
'share',
'url'=>
'external-link-alt',
'vat'=>
'money-check-alt',
'vcard'=>
'arrow-alt-circle-down',
4349 'jabber'=>
'comment-o',
4350 'website'=>
'globe-americas',
'workstation'=>
'pallet',
'webhook'=>
'bullseye',
'world'=>
'globe',
'private'=>
'user-lock',
4351 'conferenceorbooth'=>
'chalkboard-teacher',
'eventorganization'=>
'project-diagram'
4353 if ($pictowithouttext ==
'off') {
4354 $fakey =
'fa-square';
4356 } elseif ($pictowithouttext ==
'on') {
4357 $fakey =
'fa-check-square';
4359 } elseif ($pictowithouttext ==
'listlight') {
4360 $fakey =
'fa-download';
4361 $marginleftonlyshort = 1;
4362 } elseif ($pictowithouttext ==
'printer') {
4363 $fakey =
'fa-print';
4365 } elseif ($pictowithouttext ==
'note') {
4366 $fakey =
'fa-sticky-note';
4367 $marginleftonlyshort = 1;
4368 } elseif (in_array($pictowithouttext, array(
'1uparrow',
'1downarrow',
'1leftarrow',
'1rightarrow',
'1uparrow_selected',
'1downarrow_selected',
'1leftarrow_selected',
'1rightarrow_selected'))) {
4369 $convertarray = array(
'1uparrow'=>
'caret-up',
'1downarrow'=>
'caret-down',
'1leftarrow'=>
'caret-left',
'1rightarrow'=>
'caret-right',
'1uparrow_selected'=>
'caret-up',
'1downarrow_selected'=>
'caret-down',
'1leftarrow_selected'=>
'caret-left',
'1rightarrow_selected'=>
'caret-right');
4370 $fakey =
'fa-'.$convertarray[$pictowithouttext];
4371 if (preg_match(
'/selected/', $pictowithouttext)) {
4374 $marginleftonlyshort = 1;
4375 } elseif (!empty($arrayconvpictotofa[$pictowithouttext])) {
4376 $fakey =
'fa-'.$arrayconvpictotofa[$pictowithouttext];
4378 $fakey =
'fa-'.$pictowithouttext;
4381 if (in_array($pictowithouttext, array(
'dollyrevert',
'member',
'members',
'contract',
'group',
'resource',
'shipment'))) {
4382 $morecss .=
' em092';
4384 if (in_array($pictowithouttext, array(
'conferenceorbooth',
'collab',
'eventorganization',
'holiday',
'info',
'project',
'workstation'))) {
4385 $morecss .=
' em088';
4387 if (in_array($pictowithouttext, array(
'asset',
'intervention',
'payment',
'loan',
'partnership',
'stock',
'technic'))) {
4388 $morecss .=
' em080';
4392 $arrayconvpictotomarginleftonly = array(
4393 'bank',
'check',
'delete',
'generic',
'grip',
'grip_title',
'jabber',
4394 'grip_title',
'grip',
'listlight',
'note',
'on',
'off',
'playdisabled',
'printer',
'resize',
'sign-out',
'stats',
'switch_on',
'switch_on_red',
'switch_off',
4395 'uparrow',
'1uparrow',
'1downarrow',
'1leftarrow',
'1rightarrow',
'1uparrow_selected',
'1downarrow_selected',
'1leftarrow_selected',
'1rightarrow_selected'
4397 if (!isset($arrayconvpictotomarginleftonly[$pictowithouttext])) {
4398 $marginleftonlyshort = 0;
4402 $arrayconvpictotomorcess = array(
4403 'action'=>
'infobox-action',
'account'=>
'infobox-bank_account',
'accounting_account'=>
'infobox-bank_account',
'accountline'=>
'infobox-bank_account',
'accountancy'=>
'infobox-bank_account',
'asset'=>
'infobox-bank_account',
4404 'bank_account'=>
'infobox-bank_account',
4405 'bill'=>
'infobox-commande',
'billa'=>
'infobox-commande',
'billr'=>
'infobox-commande',
'billd'=>
'infobox-commande',
4406 'margin'=>
'infobox-bank_account',
'conferenceorbooth'=>
'infobox-project',
4407 'cash-register'=>
'infobox-bank_account',
'contract'=>
'infobox-contrat',
'check'=>
'font-status4',
'collab'=>
'infobox-action',
'conversation'=>
'infobox-contrat',
4408 'donation'=>
'infobox-commande',
'dolly'=>
'infobox-commande',
'dollyrevert'=>
'flip infobox-order_supplier',
4409 'ecm'=>
'infobox-action',
'eventorganization'=>
'infobox-project',
4410 'hrm'=>
'infobox-adherent',
'group'=>
'infobox-adherent',
'intervention'=>
'infobox-contrat',
4411 'incoterm'=>
'infobox-supplier_proposal',
4412 'currency'=>
'infobox-bank_account',
'multicurrency'=>
'infobox-bank_account',
4413 'members'=>
'infobox-adherent',
'member'=>
'infobox-adherent',
'money-bill-alt'=>
'infobox-bank_account',
4414 'order'=>
'infobox-commande',
4415 'user'=>
'infobox-adherent',
'users'=>
'infobox-adherent',
4416 'error'=>
'pictoerror',
'warning'=>
'pictowarning',
'switch_on'=>
'font-status4',
'switch_on_warning'=>
'font-status4 warning',
'switch_on_red'=>
'font-status8',
4417 'holiday'=>
'infobox-holiday',
'info'=>
'opacityhigh',
'invoice'=>
'infobox-commande',
4418 'knowledgemanagement'=>
'infobox-contrat rotate90',
'loan'=>
'infobox-bank_account',
4419 'payment'=>
'infobox-bank_account',
'payment_vat'=>
'infobox-bank_account',
'poll'=>
'infobox-adherent',
'pos'=>
'infobox-bank_account',
'project'=>
'infobox-project',
'projecttask'=>
'infobox-project',
4420 'propal'=>
'infobox-propal',
'proposal'=>
'infobox-propal',
'private'=>
'infobox-project',
4421 'reception'=>
'flip',
'recruitmentjobposition'=>
'infobox-adherent',
'recruitmentcandidature'=>
'infobox-adherent',
4422 'resource'=>
'infobox-action',
4423 'salary'=>
'infobox-bank_account',
'shipment'=>
'infobox-commande',
'supplier_invoice'=>
'infobox-order_supplier',
'supplier_invoicea'=>
'infobox-order_supplier',
'supplier_invoiced'=>
'infobox-order_supplier',
4424 'supplier'=>
'infobox-order_supplier',
'supplier_order'=>
'infobox-order_supplier',
'supplier_proposal'=>
'infobox-supplier_proposal',
4425 'ticket'=>
'infobox-contrat',
'title_accountancy'=>
'infobox-bank_account',
'title_hrm'=>
'infobox-holiday',
'expensereport'=>
'infobox-expensereport',
'trip'=>
'infobox-expensereport',
'title_agenda'=>
'infobox-action',
4426 'vat'=>
'infobox-bank_account',
4428 'list-alt'=>
'imgforviewmode',
'calendar'=>
'imgforviewmode',
'calendarweek'=>
'imgforviewmode',
'calendarmonth'=>
'imgforviewmode',
'calendarday'=>
'imgforviewmode',
'calendarperuser'=>
'imgforviewmode'
4430 if (!empty($arrayconvpictotomorcess[$pictowithouttext]) && strpos($picto,
'_nocolor') ===
false) {
4431 $morecss .= ($morecss ?
' ' :
'').$arrayconvpictotomorcess[$pictowithouttext];
4435 $arrayconvpictotocolor = array(
4436 'address'=>
'#6c6aa8',
'building'=>
'#6c6aa8',
'bom'=>
'#a69944',
4437 'clone'=>
'#999',
'cog'=>
'#999',
'companies'=>
'#6c6aa8',
'company'=>
'#6c6aa8',
'contact'=>
'#6c6aa8',
'cron'=>
'#555',
4438 'dynamicprice'=>
'#a69944',
4439 'edit'=>
'#444',
'note'=>
'#999',
'error'=>
'',
'help'=>
'#bbb',
'listlight'=>
'#999',
'language'=>
'#555',
4441 'lock'=>
'#ddd',
'lot'=>
'#a69944',
4442 'map-marker-alt'=>
'#aaa',
'mrp'=>
'#a69944',
'product'=>
'#a69944',
'service'=>
'#a69944',
'inventory'=>
'#a69944',
'stock'=>
'#a69944',
'movement'=>
'#a69944',
4443 'other'=>
'#ddd',
'world'=>
'#986c6a',
4444 'partnership'=>
'#6c6aa8',
'playdisabled'=>
'#ccc',
'printer'=>
'#444',
'projectpub'=>
'#986c6a',
'reception'=>
'#a69944',
'resize'=>
'#444',
'rss'=>
'#cba',
4446 'security'=>
'#999',
'square'=>
'#888',
'stop-circle'=>
'#888',
'stats'=>
'#444',
'switch_off'=>
'#999',
'technic'=>
'#999',
'timespent'=>
'#555',
4447 'uncheck'=>
'#800',
'uparrow'=>
'#555',
'user-cog'=>
'#999',
'country'=>
'#aaa',
'globe-americas'=>
'#aaa',
'region'=>
'#aaa',
'state'=>
'#aaa',
4448 'website'=>
'#304',
'workstation'=>
'#a69944'
4450 if (isset($arrayconvpictotocolor[$pictowithouttext]) && strpos($picto,
'_nocolor') ===
false) {
4451 $facolor = $arrayconvpictotocolor[$pictowithouttext];
4458 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
4459 $morecss .= ($morecss ?
' ' :
'').$reg[1];
4460 $moreatt = str_replace(
'class="'.$reg[1].
'"',
'', $moreatt);
4462 if (preg_match(
'/style="([^"]+)"/', $moreatt, $reg)) {
4463 $morestyle = $reg[1];
4464 $moreatt = str_replace(
'style="'.$reg[1].
'"',
'', $moreatt);
4466 $moreatt = trim($moreatt);
4468 $enabledisablehtml =
'<span class="'.$fa.
' '.$fakey.($marginleftonlyshort ? ($marginleftonlyshort == 1 ?
' marginleftonlyshort' :
' marginleftonly') :
'');
4469 $enabledisablehtml .= ($morecss ?
' '.$morecss :
'').
'" style="'.($fasize ? (
'font-size: '.$fasize.
';') :
'').($facolor ? (
' color: '.$facolor.
';') :
'').($morestyle ?
' '.$morestyle :
'').
'"'.(($notitle || empty($titlealt)) ?
'' :
' title="'.dol_escape_htmltag($titlealt).
'"').($moreatt ?
' '.$moreatt :
'').
'>';
4473 $enabledisablehtml .=
'</span>';
4475 return $enabledisablehtml;
4478 if (!empty($conf->global->MAIN_OVERWRITE_THEME_PATH)) {
4479 $path = $conf->global->MAIN_OVERWRITE_THEME_PATH.
'/theme/'.$theme;
4480 } elseif (!empty($conf->global->MAIN_OVERWRITE_THEME_RES)) {
4481 $path = $conf->global->MAIN_OVERWRITE_THEME_RES.
'/theme/'.$conf->global->MAIN_OVERWRITE_THEME_RES;
4482 } elseif (!empty($conf->modules_parts[
'theme']) && array_key_exists($theme, $conf->modules_parts[
'theme'])) {
4483 $path = $theme.
'/theme/'.$theme;
4488 if (preg_match(
'/^([^@]+)@([^@]+)$/i', $picto, $regs)) {
4494 if (!preg_match(
'/(\.png|\.gif|\.svg)$/i', $picto)) {
4499 foreach ($conf->file->dol_document_root as $type => $dirroot) {
4500 if ($type ==
'main') {
4504 if (file_exists($dirroot.
'/'.$path.
'/img/'.$picto)) {
4505 $url = DOL_URL_ROOT.$conf->file->dol_url_root[$type];
4511 $fullpathpicto = $url.
'/'.$path.
'/img/'.$picto;
4515 return $fullpathpicto;
4519 return '<img src="'.$fullpathpicto.
'"'.($notitle ?
'' :
' alt="'.dol_escape_htmltag($alt).
'"').(($notitle || empty($titlealt)) ?
'' :
' title="'.dol_escape_htmltag($titlealt).
'"').($moreatt ?
' '.$moreatt.($morecss ?
' class="'.$morecss.
'"' :
'') :
' class="inline-block'.($morecss ?
' '.$morecss :
'').
'"').
'>';
4535function img_object($titlealt, $picto, $moreatt =
'', $pictoisfullpath =
false, $srconly = 0, $notitle = 0)
4537 if (strpos($picto,
'^') === 0) {
4538 return img_picto($titlealt, str_replace(
'^',
'', $picto), $moreatt, $pictoisfullpath, $srconly, $notitle);
4540 return img_picto($titlealt,
'object_'.$picto, $moreatt, $pictoisfullpath, $srconly, $notitle);
4555function img_weather($titlealt, $picto, $moreatt =
'', $pictoisfullpath = 0, $morecss =
'')
4559 if (is_numeric($picto)) {
4562 return '<i class="fa fa-weather-level'.$picto.
'"></i>';
4563 } elseif (!preg_match(
'/(\.png|\.gif)$/i', $picto)) {
4567 $path = DOL_URL_ROOT.
'/theme/'.$conf->theme.
'/img/weather/'.$picto;
4569 return img_picto($titlealt, $path, $moreatt, 1, 0, 0,
'', $morecss);
4587 if (!preg_match(
'/(\.png|\.gif)$/i', $picto)) {
4591 if ($pictoisfullpath) {
4594 $path = DOL_URL_ROOT.
'/theme/common/'.$picto;
4596 if (!empty($conf->global->MAIN_MODULE_CAN_OVERWRITE_COMMONICONS)) {
4597 $themepath = DOL_DOCUMENT_ROOT.
'/theme/'.$conf->theme.
'/img/'.$picto;
4599 if (file_exists($themepath)) {
4605 return img_picto($titlealt, $path, $moreatt, 1, 0, $notitle);
4621function img_action($titlealt, $numaction, $picto =
'', $moreatt =
'')
4625 if (empty($titlealt) || $titlealt ==
'default') {
4626 if ($numaction ==
'-1' || $numaction ==
'ST_NO') {
4628 $titlealt = $langs->transnoentitiesnoconv(
'ChangeDoNotContact');
4629 } elseif ($numaction ==
'0' || $numaction ==
'ST_NEVER') {
4631 $titlealt = $langs->transnoentitiesnoconv(
'ChangeNeverContacted');
4632 } elseif ($numaction ==
'1' || $numaction ==
'ST_TODO') {
4634 $titlealt = $langs->transnoentitiesnoconv(
'ChangeToContact');
4635 } elseif ($numaction ==
'2' || $numaction ==
'ST_PEND') {
4637 $titlealt = $langs->transnoentitiesnoconv(
'ChangeContactInProcess');
4638 } elseif ($numaction ==
'3' || $numaction ==
'ST_DONE') {
4640 $titlealt = $langs->transnoentitiesnoconv(
'ChangeContactDone');
4642 $titlealt = $langs->transnoentitiesnoconv(
'ChangeStatus '.$numaction);
4646 if (!is_numeric($numaction)) {
4650 return img_picto($titlealt, (empty($picto) ?
'stcomm'.$numaction.
'.png' : $picto), $moreatt);
4664 if ($titlealt ==
'default') {
4665 $titlealt = $langs->trans(
'Show');
4668 return img_picto($titlealt,
'pdf'.$size.
'.png');
4682 if ($titlealt ==
'default') {
4683 $titlealt = $langs->trans(
'Add');
4686 return img_picto($titlealt,
'edit_add.png', $other);
4699 if ($titlealt ==
'default') {
4700 $titlealt = $langs->trans(
'Remove');
4703 return img_picto($titlealt,
'edit_remove.png', $other);
4714function img_edit($titlealt =
'default', $float = 0, $other =
'')
4718 if ($titlealt ==
'default') {
4719 $titlealt = $langs->trans(
'Modify');
4722 return img_picto($titlealt,
'edit.png', ($float ?
'style="float: '.($langs->tab_translate[
"DIRECTION"] ==
'rtl' ?
'left' :
'right').
'"' :
"").($other ?
' '.$other :
''));
4733function img_view($titlealt =
'default', $float = 0, $other =
'class="valignmiddle"')
4737 if ($titlealt ==
'default') {
4738 $titlealt = $langs->trans(
'View');
4741 $moreatt = ($float ?
'style="float: right" ' :
'').$other;
4743 return img_picto($titlealt,
'eye', $moreatt);
4754function img_delete($titlealt =
'default', $other =
'class="pictodelete"', $morecss =
'')
4758 if ($titlealt ==
'default') {
4759 $titlealt = $langs->trans(
'Delete');
4762 return img_picto($titlealt,
'delete.png', $other,
false, 0, 0,
'', $morecss);
4775 if ($titlealt ==
"default") {
4776 $titlealt = $langs->trans(
"Print");
4778 return img_picto($titlealt,
'printer.png', $other);
4788function img_split($titlealt =
'default', $other =
'class="pictosplit"')
4792 if ($titlealt ==
'default') {
4793 $titlealt = $langs->trans(
'Split');
4796 return img_picto($titlealt,
'split.png', $other);
4811 if (is_string($usealttitle)) {
4814 $usealttitle = $langs->trans(
'Info');
4818 return img_picto($usealttitle,
'info.png',
'style="vertical-align: middle;'.($usehelpcursor == 1 ?
' cursor: help' : ($usehelpcursor == 2 ?
' cursor: pointer' :
'')).
'"');
4831 if ($titlealt ==
'default') {
4832 $titlealt = $langs->trans(
'Informations');
4835 return img_picto($titlealt,
'info.png',
'style="vertical-align: middle;"');
4846function img_warning($titlealt =
'default', $moreatt =
'', $morecss =
'pictowarning')
4850 if ($titlealt ==
'default') {
4851 $titlealt = $langs->trans(
'Warning');
4855 return img_picto($titlealt,
'warning.png',
'class="'.$morecss.
'"'.($moreatt ? ($moreatt ==
'1' ?
' style="float: right"' :
' '.$moreatt) :
''));
4868 if ($titlealt ==
'default') {
4869 $titlealt = $langs->trans(
'Error');
4872 return img_picto($titlealt,
'error.png');
4886 if ($titlealt ==
'default') {
4887 $titlealt = $langs->trans(
'Next');
4891 return '<span class="fa fa-chevron-right paddingright paddingleft" title="'.dol_escape_htmltag($titlealt).
'"></span>';
4905 if ($titlealt ==
'default') {
4906 $titlealt = $langs->trans(
'Previous');
4910 return '<span class="fa fa-chevron-left paddingright paddingleft" title="'.dol_escape_htmltag($titlealt).
'"></span>';
4921function img_down($titlealt =
'default', $selected = 0, $moreclass =
'')
4925 if ($titlealt ==
'default') {
4926 $titlealt = $langs->trans(
'Down');
4929 return img_picto($titlealt, ($selected ?
'1downarrow_selected.png' :
'1downarrow.png'),
'class="imgdown'.($moreclass ?
" ".$moreclass :
"").
'"');
4940function img_up($titlealt =
'default', $selected = 0, $moreclass =
'')
4944 if ($titlealt ==
'default') {
4945 $titlealt = $langs->trans(
'Up');
4948 return img_picto($titlealt, ($selected ?
'1uparrow_selected.png' :
'1uparrow.png'),
'class="imgup'.($moreclass ?
" ".$moreclass :
"").
'"');
4959function img_left($titlealt =
'default', $selected = 0, $moreatt =
'')
4963 if ($titlealt ==
'default') {
4964 $titlealt = $langs->trans(
'Left');
4967 return img_picto($titlealt, ($selected ?
'1leftarrow_selected.png' :
'1leftarrow.png'), $moreatt);
4978function img_right($titlealt =
'default', $selected = 0, $moreatt =
'')
4982 if ($titlealt ==
'default') {
4983 $titlealt = $langs->trans(
'Right');
4986 return img_picto($titlealt, ($selected ?
'1rightarrow_selected.png' :
'1rightarrow.png'), $moreatt);
5000 if ($titlealt ==
'default') {
5001 $titlealt = $langs->trans(
'Active');
5005 return img_picto($titlealt,
'tick.png');
5020 if (is_null($morecss)) {
5024 if ($brand ==
'visa' || $brand ==
'Visa') {
5026 } elseif ($brand ==
'mastercard' || $brand ==
'MasterCard') {
5027 $brand =
'cc-mastercard';
5028 } elseif ($brand ==
'amex' || $brand ==
'American Express') {
5030 } elseif ($brand ==
'discover' || $brand ==
'Discover') {
5031 $brand =
'cc-discover';
5032 } elseif ($brand ==
'jcb' || $brand ==
'JCB') {
5034 } elseif ($brand ==
'diners' || $brand ==
'Diners club') {
5035 $brand =
'cc-diners-club';
5036 } elseif (!in_array($brand, array(
'cc-visa',
'cc-mastercard',
'cc-amex',
'cc-discover',
'cc-jcb',
'cc-diners-club'))) {
5037 $brand =
'credit-card';
5040 return '<span class="fa fa-'.$brand.
' fa-fw'.($morecss ?
' '.$morecss :
'').
'"></span>';
5053 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
5059 if (empty($titlealt)) {
5060 $titlealt =
'Mime type: '.$mimetype;
5064 return '<i class="fa fa-'.$mimefa.
' paddingright'.($morecss ?
' '.$morecss :
'').
'"'.($titlealt ?
' title="'.$titlealt.
'"' :
'').
'></i>';
5077 global $conf, $langs;
5079 if ($titlealt ==
'default') {
5080 $titlealt = $langs->trans(
'Search');
5083 $img =
img_picto($titlealt,
'search.png', $other,
false, 1);
5085 $input =
'<input type="image" class="liste_titre" name="button_search" src="'.$img.
'" ';
5086 $input .=
'value="'.dol_escape_htmltag($titlealt).
'" title="'.
dol_escape_htmltag($titlealt).
'" >';
5100 global $conf, $langs;
5102 if ($titlealt ==
'default') {
5103 $titlealt = $langs->trans(
'Search');
5106 $img =
img_picto($titlealt,
'searchclear.png', $other,
false, 1);
5108 $input =
'<input type="image" class="liste_titre" name="button_removefilter" src="'.$img.
'" ';
5109 $input .=
'value="'.dol_escape_htmltag($titlealt).
'" title="'.
dol_escape_htmltag($titlealt).
'" >';
5125function info_admin($text, $infoonimgalt = 0, $nodiv = 0, $admin =
'1', $morecss =
'hideonsmartphone', $textfordropdown =
'')
5127 global $conf, $langs;
5129 if ($infoonimgalt) {
5130 $result =
img_picto($text,
'info',
'class="'.($morecss ?
' '.$morecss :
'').
'"');
5132 if (empty($conf->use_javascript_ajax)) {
5133 $textfordropdown =
'';
5136 $class = (empty($admin) ?
'undefined' : ($admin ==
'1' ?
'info' : $admin));
5137 $result = ($nodiv ?
'' :
'<div class="'.$class.($morecss ?
' '.$morecss :
'').($textfordropdown ?
' hidden' :
'').
'">').
'<span class="fa fa-info-circle" title="'.
dol_escape_htmltag($admin ? $langs->trans(
'InfoAdmin') : $langs->trans(
'Note')).
'"></span> '.$text.($nodiv ?
'' :
'</div>');
5139 if ($textfordropdown) {
5140 $tmpresult =
'<span class="'.$class.
'text opacitymedium cursorpointer">'.$langs->trans($textfordropdown).
' '.
img_picto($langs->trans($textfordropdown),
'1downarrow').
'</span>';
5141 $tmpresult .=
'<script nonce="'.getNonce().
'" type="text/javascript">
5142 jQuery(document).ready(function() {
5143 jQuery(".'.$class.
'text").click(function() {
5144 console.log("toggle text");
5145 jQuery(".'.$class.
'").toggle();
5150 $result = $tmpresult.$result;
5171 global $conf, $langs, $argv;
5172 global $dolibarr_main_prod;
5179 require_once DOL_DOCUMENT_ROOT.
'/core/class/translate.class.php';
5181 $langs->load(
"main");
5185 $langs->loadLangs(array(
'main',
'errors'));
5187 if ($_SERVER[
'DOCUMENT_ROOT']) {
5188 $out .= $langs->trans(
"DolibarrHasDetectedError").
".<br>\n";
5190 $out .=
"You use an experimental or develop level of features, so please do NOT report any bugs or vulnerability, except if problem is confirmed after moving option MAIN_FEATURES_LEVEL back to 0.<br>\n";
5192 $out .= $langs->trans(
"InformationToHelpDiagnose").
":<br>\n";
5194 $out .=
"<b>".$langs->trans(
"Date").
":</b> ".
dol_print_date(time(),
'dayhourlog').
"<br>\n";
5195 $out .=
"<b>".$langs->trans(
"Dolibarr").
":</b> ".DOL_VERSION.
" - https://www.dolibarr.org<br>\n";
5196 if (isset($conf->global->MAIN_FEATURES_LEVEL)) {
5197 $out .=
"<b>".$langs->trans(
"LevelOfFeature").
":</b> ".
getDolGlobalInt(
'MAIN_FEATURES_LEVEL').
"<br>\n";
5199 if (function_exists(
"phpversion")) {
5200 $out .=
"<b>".$langs->trans(
"PHP").
":</b> ".phpversion().
"<br>\n";
5202 $out .=
"<b>".$langs->trans(
"Server").
":</b> ".(isset($_SERVER[
"SERVER_SOFTWARE"]) ?
dol_htmlentities($_SERVER[
"SERVER_SOFTWARE"], ENT_COMPAT) :
'').
"<br>\n";
5203 if (function_exists(
"php_uname")) {
5204 $out .=
"<b>".$langs->trans(
"OS").
":</b> ".php_uname().
"<br>\n";
5206 $out .=
"<b>".$langs->trans(
"UserAgent").
":</b> ".(isset($_SERVER[
"HTTP_USER_AGENT"]) ?
dol_htmlentities($_SERVER[
"HTTP_USER_AGENT"], ENT_COMPAT) :
'').
"<br>\n";
5208 $out .=
"<b>".$langs->trans(
"RequestedUrl").
":</b> ".
dol_htmlentities($_SERVER[
"REQUEST_URI"], ENT_COMPAT).
"<br>\n";
5209 $out .=
"<b>".$langs->trans(
"Referer").
":</b> ".(isset($_SERVER[
"HTTP_REFERER"]) ?
dol_htmlentities($_SERVER[
"HTTP_REFERER"], ENT_COMPAT) :
'').
"<br>\n";
5210 $out .=
"<b>".$langs->trans(
"MenuManager").
":</b> ".(isset($conf->standard_menu) ?
dol_htmlentities($conf->standard_menu, ENT_COMPAT) :
'').
"<br>\n";
5212 $syslog .=
"url=".dol_escape_htmltag($_SERVER[
"REQUEST_URI"]);
5213 $syslog .=
", query_string=".dol_escape_htmltag($_SERVER[
"QUERY_STRING"]);
5215 $out .=
'> '.$langs->transnoentities(
"ErrorInternalErrorDetected").
":\n".$argv[0].
"\n";
5216 $syslog .=
"pid=".dol_getmypid();
5219 if (!empty($conf->modules)) {
5220 $out .=
"<b>".$langs->trans(
"Modules").
":</b> ".join(
', ', $conf->modules).
"<br>\n";
5223 if (is_object($db)) {
5224 if ($_SERVER[
'DOCUMENT_ROOT']) {
5225 $out .=
"<b>".$langs->trans(
"DatabaseTypeManager").
":</b> ".$db->type.
"<br>\n";
5226 $lastqueryerror = $db->lastqueryerror();
5228 $lastqueryerror =
"SQL error string is not a valid UTF8 string. We can't show it.";
5230 $out .=
"<b>".$langs->trans(
"RequestLastAccessInError").
":</b> ".($lastqueryerror ?
dol_escape_htmltag($lastqueryerror) : $langs->trans(
"ErrorNoRequestInError")).
"<br>\n";
5231 $out .=
"<b>".$langs->trans(
"ReturnCodeLastAccessInError").
":</b> ".($db->lasterrno() ?
dol_escape_htmltag($db->lasterrno()) : $langs->trans(
"ErrorNoRequestInError")).
"<br>\n";
5232 $out .=
"<b>".$langs->trans(
"InformationLastAccessInError").
":</b> ".($db->lasterror() ?
dol_escape_htmltag($db->lasterror()) : $langs->trans(
"ErrorNoRequestInError")).
"<br>\n";
5236 $out .=
'> '.$langs->transnoentities(
"DatabaseTypeManager").
":\n".$db->type.
"\n";
5237 $out .=
'> '.$langs->transnoentities(
"RequestLastAccessInError").
":\n".($db->lastqueryerror() ? $db->lastqueryerror() : $langs->transnoentities(
"ErrorNoRequestInError")).
"\n";
5238 $out .=
'> '.$langs->transnoentities(
"ReturnCodeLastAccessInError").
":\n".($db->lasterrno() ? $db->lasterrno() : $langs->transnoentities(
"ErrorNoRequestInError")).
"\n";
5239 $out .=
'> '.$langs->transnoentities(
"InformationLastAccessInError").
":\n".($db->lasterror() ? $db->lasterror() : $langs->transnoentities(
"ErrorNoRequestInError")).
"\n";
5241 $syslog .=
", sql=".$db->lastquery();
5242 $syslog .=
", db_error=".$db->lasterror();
5245 if ($error || $errors) {
5246 $langs->load(
"errors");
5249 if (is_array($error) && is_array($errors)) {
5250 $errors = array_merge($error, $errors);
5251 } elseif (is_array($error)) {
5253 } elseif (is_array($errors)) {
5254 $errors = array_merge(array($error), $errors);
5256 $errors = array_merge(array($error), array($errors));
5259 foreach ($errors as $msg) {
5263 if ($_SERVER[
'DOCUMENT_ROOT']) {
5267 $out .=
'> '.$langs->transnoentities(
"Message").
":\n".$msg.
"\n";
5269 $syslog .=
", msg=".$msg;
5272 if (empty($dolibarr_main_prod) && $_SERVER[
'DOCUMENT_ROOT'] && function_exists(
'xdebug_print_function_stack') && function_exists(
'xdebug_call_file')) {
5273 xdebug_print_function_stack();
5274 $out .=
'<b>XDebug informations:</b>'.
"<br>\n";
5275 $out .=
'File: '.xdebug_call_file().
"<br>\n";
5276 $out .=
'Line: '.xdebug_call_line().
"<br>\n";
5277 $out .=
'Function: '.xdebug_call_function().
"<br>\n";
5282 if (!headers_sent()) {
5283 if (function_exists(
'top_httphead')) {
5287 http_response_code(202);
5290 if (empty($dolibarr_main_prod)) {
5293 if (empty($langs->defaultlang)) {
5294 $langs->setDefaultLang();
5296 $langs->loadLangs(array(
"main",
"errors"));
5298 print
'This website or feature is currently temporarly not available or failed after a technical error.<br><br>This may be due to a maintenance operation. Current status of operation ('.dol_print_date(
dol_now(),
'dayhourrfc').
') are on next line...<br><br>'.
"\n";
5299 print $langs->trans(
"DolibarrHasDetectedError").
'. ';
5300 print $langs->trans(
"YouCanSetOptionDolibarrMainProdToZero");
5301 if (!defined(
"MAIN_CORE_ERROR")) {
5302 define(
"MAIN_CORE_ERROR", 1);
5319function dol_print_error_email($prefixcode, $errormessage =
'', $errormessages = array(), $morecss =
'error', $email =
'')
5321 global $langs, $conf;
5323 if (empty($email)) {
5324 $email = $conf->global->MAIN_INFO_SOCIETE_MAIL;
5327 $langs->load(
"errors");
5330 print
'<br><div class="center login_main_message"><div class="'.$morecss.
'">';
5331 print $langs->trans(
"ErrorContactEMail", $email, $prefixcode.
'-'.
dol_print_date($now,
'%Y%m%d%H%M%S'));
5332 if ($errormessage) {
5333 print
'<br><br>'.$errormessage;
5335 if (is_array($errormessages) && count($errormessages)) {
5336 foreach ($errormessages as $mesgtoshow) {
5337 print
'<br><br>'.$mesgtoshow;
5340 print
'</div></div>';
5359function print_liste_field_titre($name, $file =
"", $field =
"", $begin =
"", $moreparam =
"", $moreattrib =
"", $sortfield =
"", $sortorder =
"", $prefix =
"", $tooltip =
"", $forcenowrapcolumntitle = 0)
5361 print
getTitleFieldOfList($name, 0, $file, $field, $begin, $moreparam, $moreattrib, $sortfield, $sortorder, $prefix, 0, $tooltip, $forcenowrapcolumntitle);
5382function getTitleFieldOfList($name, $thead = 0, $file =
"", $field =
"", $begin =
"", $moreparam =
"", $moreattrib =
"", $sortfield =
"", $sortorder =
"", $prefix =
"", $disablesortlink = 0, $tooltip =
'', $forcenowrapcolumntitle = 0)
5384 global $conf, $langs, $form;
5387 if ($moreattrib ==
'class="right"') {
5388 $prefix .=
'right ';
5391 $sortorder = strtoupper($sortorder);
5400 $tmpsortfield = explode(
',', $sortfield);
5401 $sortfield1 = trim($tmpsortfield[0]);
5402 $tmpfield = explode(
',', $field);
5403 $field1 = trim($tmpfield[0]);
5405 if (empty($conf->global->MAIN_DISABLE_WRAPPING_ON_COLUMN_TITLE) && empty($forcenowrapcolumntitle)) {
5406 $prefix =
'wrapcolumntitle '.$prefix;
5412 $liste_titre =
'liste_titre';
5413 if ($field1 && ($sortfield1 == $field1 || $sortfield1 == preg_replace(
"/^[^\.]+\./",
"", $field1))) {
5414 $liste_titre =
'liste_titre_sel';
5417 $tagstart =
'<'.$tag.
' class="'.$prefix.$liste_titre.
'" '.$moreattrib;
5419 $tagstart .= ($name && empty($conf->global->MAIN_DISABLE_WRAPPING_ON_COLUMN_TITLE) && empty($forcenowrapcolumntitle) && !
dol_textishtml($name)) ?
' title="'.
dol_escape_htmltag($langs->trans($name)).
'"' :
'';
5422 if (empty($thead) && $field && empty($disablesortlink)) {
5423 $options = preg_replace(
'/sortfield=([a-zA-Z0-9,\s\.]+)/i',
'', (is_scalar($moreparam) ? $moreparam :
''));
5424 $options = preg_replace(
'/sortorder=([a-zA-Z0-9,\s\.]+)/i',
'', $options);
5425 $options = preg_replace(
'/&+/i',
'&', $options);
5426 if (!preg_match(
'/^&/', $options)) {
5427 $options =
'&'.$options;
5430 $sortordertouseinlink =
'';
5431 if ($field1 != $sortfield1) {
5432 if (preg_match(
'/^DESC/i', $sortorder)) {
5433 $sortordertouseinlink .= str_repeat(
'desc,', count(explode(
',', $field)));
5435 $sortordertouseinlink .= str_repeat(
'asc,', count(explode(
',', $field)));
5438 if (preg_match(
'/^ASC/i', $sortorder)) {
5439 $sortordertouseinlink .= str_repeat(
'desc,', count(explode(
',', $field)));
5441 $sortordertouseinlink .= str_repeat(
'asc,', count(explode(
',', $field)));
5444 $sortordertouseinlink = preg_replace(
'/,$/',
'', $sortordertouseinlink);
5445 $out .=
'<a class="reposition" href="'.$file.
'?sortfield='.$field.
'&sortorder='.$sortordertouseinlink.
'&begin='.$begin.$options.
'"';
5451 if (preg_match(
'/:\w+$/', $tooltip)) {
5452 $tmptooltip = explode(
':', $tooltip);
5454 $tmptooltip = array($tooltip);
5456 $out .= $form->textwithpicto($langs->trans($name), $langs->trans($tmptooltip[0]), 1,
'help',
'', 0, 3, (empty($tmptooltip[1]) ?
'' :
'extra_'.str_replace(
'.',
'_', $field).
'_'.$tmptooltip[1]));
5458 $out .= $langs->trans($name);
5461 if (empty($thead) && $field && empty($disablesortlink)) {
5465 if (empty($thead) && $field) {
5466 $options = preg_replace(
'/sortfield=([a-zA-Z0-9,\s\.]+)/i',
'', (is_scalar($moreparam) ? $moreparam :
''));
5467 $options = preg_replace(
'/sortorder=([a-zA-Z0-9,\s\.]+)/i',
'', $options);
5468 $options = preg_replace(
'/&+/i',
'&', $options);
5469 if (!preg_match(
'/^&/', $options)) {
5470 $options =
'&'.$options;
5473 if (!$sortorder || ($field1 != $sortfield1)) {
5477 if (preg_match(
'/^DESC/', $sortorder)) {
5480 $sortimg .=
'<span class="nowrap">'.img_up(
"Z-A", 0,
'paddingright').
'</span>';
5482 if (preg_match(
'/^ASC/', $sortorder)) {
5485 $sortimg .=
'<span class="nowrap">'.img_down(
"A-Z", 0,
'paddingright').
'</span>';
5490 $tagend =
'</'.$tag.
'>';
5492 $out = $tagstart.$sortimg.$out.$tagend;
5507 dol_syslog(__FUNCTION__.
" is deprecated", LOG_WARNING);
5509 print
'<div class="titre">'.$title.
'</div>';
5541function load_fiche_titre($titre, $morehtmlright =
'', $picto =
'generic', $pictoisfullpath = 0, $id =
'', $morecssontable =
'', $morehtmlcenter =
'')
5547 if ($picto ==
'setup') {
5552 $return .=
'<table '.($id ?
'id="'.$id.
'" ' :
'').
'class="centpercent notopnoleftnoright table-fiche-title'.($morecssontable ?
' '.$morecssontable :
'').
'">';
5553 $return .=
'<tr class="titre">';
5555 $return .=
'<td class="nobordernopadding widthpictotitle valignmiddle col-picto">'.img_picto(
'', $picto,
'class="valignmiddle widthpictotitle pictotitle"', $pictoisfullpath).
'</td>';
5557 $return .=
'<td class="nobordernopadding valignmiddle col-title">';
5558 $return .=
'<div class="titre inline-block">'.$titre.
'</div>';
5561 $return .=
'<td class="nobordernopadding center valignmiddle col-center">'.$morehtmlcenter.
'</td>';
5564 $return .=
'<td class="nobordernopadding titre_right wordbreakimp right valignmiddle col-right">'.$morehtmlright.
'</td>';
5566 $return .=
'</tr></table>'.
"\n";
5594function print_barre_liste($titre, $page, $file, $options =
'', $sortfield =
'', $sortorder =
'', $morehtmlcenter =
'', $num = -1, $totalnboflines =
'', $picto =
'generic', $pictoisfullpath = 0, $morehtmlright =
'', $morecss =
'', $limit = -1, $hideselectlimit = 0, $hidenavigation = 0, $pagenavastextinput = 0, $morehtmlrightbeforearrow =
'')
5596 global $conf, $langs;
5599 $savtotalnboflines = $totalnboflines;
5600 $totalnboflines = abs((
int) $totalnboflines);
5602 $page = (int) $page;
5604 if ($picto ==
'setup') {
5605 $picto =
'title_setup.png';
5607 if (($conf->browser->name ==
'ie') && $picto ==
'generic') {
5608 $picto =
'title.gif';
5611 $limit = $conf->liste_limit;
5614 if ($savlimit != 0 && (($num > $limit) || ($num == -1) || ($limit == 0))) {
5622 print
"<!-- Begin title -->\n";
5623 print
'<table class="centpercent notopnoleftnoright table-fiche-title'.($morecss ?
' '.$morecss :
'').
'"><tr>';
5627 if ($picto && $titre) {
5628 print
'<td class="nobordernopadding widthpictotitle valignmiddle col-picto">'.img_picto(
'', $picto,
'class="valignmiddle pictotitle widthpictotitle"', $pictoisfullpath).
'</td>';
5631 print
'<td class="nobordernopadding valignmiddle col-title">';
5632 print
'<div class="titre inline-block">'.$titre;
5633 if (!empty($titre) && $savtotalnboflines >= 0 && (
string) $savtotalnboflines !=
'') {
5634 print
'<span class="opacitymedium colorblack paddingleft">('.$totalnboflines.
')</span>';
5636 print
'</div></td>';
5639 if ($morehtmlcenter && empty($conf->dol_optimize_smallscreen)) {
5640 print
'<td class="nobordernopadding center valignmiddle col-center">'.$morehtmlcenter.
'</td>';
5644 print
'<td class="nobordernopadding valignmiddle right col-right">';
5645 print
'<input type="hidden" name="pageplusoneold" value="'.((int) $page + 1).
'">';
5647 $options .=
"&sortfield=".urlencode($sortfield);
5650 $options .=
"&sortorder=".urlencode($sortorder);
5654 if ($savlimit != 0 && ($page > 0 || $num > $limit)) {
5655 if ($totalnboflines) {
5657 $maxnbofpage = (empty($conf->dol_optimize_smallscreen) ? 4 : 0);
5660 $nbpages = ceil($totalnboflines / $limit);
5664 $cpt = ($page - $maxnbofpage);
5670 if (empty($pagenavastextinput)) {
5671 $pagelist .=
'<li class="pagination"><a href="'.$file.
'?page=0'.$options.
'">1</a></li>';
5673 $pagelist .=
'<li class="pagination"><span class="inactive">...</span></li>';
5674 } elseif ($cpt == 2) {
5675 $pagelist .=
'<li class="pagination"><a href="'.$file.
'?page=1'.$options.
'">2</a></li>';
5681 if ($pagenavastextinput) {
5682 if ($cpt == $page) {
5683 $pagelist .=
'<li class="pagination"><input type="text" class="'.($totalnboflines > 100 ?
'width40' :
'width25').
' center pageplusone" name="pageplusone" value="'.($page + 1).
'"></li>';
5687 if ($cpt == $page) {
5688 $pagelist .=
'<li class="pagination"><span class="active">'.($page + 1).
'</span></li>';
5690 $pagelist .=
'<li class="pagination"><a href="'.$file.
'?page='.$cpt.$options.
'">'.($cpt + 1).
'</a></li>';
5694 }
while ($cpt < $nbpages && $cpt <= ($page + $maxnbofpage));
5696 if (empty($pagenavastextinput)) {
5697 if ($cpt < $nbpages) {
5698 if ($cpt < $nbpages - 2) {
5699 $pagelist .=
'<li class="pagination"><span class="inactive">...</span></li>';
5700 } elseif ($cpt == $nbpages - 2) {
5701 $pagelist .=
'<li class="pagination"><a href="'.$file.
'?page='.($nbpages - 2).$options.
'">'.($nbpages - 1).
'</a></li>';
5703 $pagelist .=
'<li class="pagination"><a href="'.$file.
'?page='.($nbpages - 1).$options.
'">'.$nbpages.
'</a></li>';
5707 $pagelist .=
'<li class="pagination paginationlastpage"><a href="'.$file.
'?page='.($nbpages - 1).$options.
'">'.$nbpages.
'</a></li>';
5710 $pagelist .=
'<li class="pagination"><span class="active">'.($page + 1).
"</li>";
5714 if ($savlimit || $morehtmlright || $morehtmlrightbeforearrow) {
5715 print_fleche_navigation($page, $file, $options, $nextpage, $pagelist, $morehtmlright, $savlimit, $totalnboflines, $hideselectlimit, $morehtmlrightbeforearrow, $hidenavigation);
5719 if ($pagenavastextinput) {
5726 print
'</table>'.
"\n";
5729 if ($morehtmlcenter && !empty($conf->dol_optimize_smallscreen)) {
5730 print
'<div class="nobordernopadding marginbottomonly center valignmiddle col-center centpercent">'.$morehtmlcenter.
'</div>';
5733 print
"<!-- End title -->\n\n";
5752function print_fleche_navigation($page, $file, $options =
'', $nextpage = 0, $betweenarrows =
'', $afterarrows =
'', $limit = -1, $totalnboflines = 0, $hideselectlimit = 0, $beforearrows =
'', $hidenavigation = 0)
5754 global $conf, $langs;
5756 print
'<div class="pagination"><ul>';
5757 if ($beforearrows) {
5758 print
'<li class="paginationbeforearrows">';
5759 print $beforearrows;
5763 if (empty($hidenavigation)) {
5764 if ((
int) $limit > 0 && empty($hideselectlimit)) {
5765 $pagesizechoices =
'10:10,15:15,20:20,30:30,40:40,50:50,100:100,250:250,500:500,1000:1000';
5766 $pagesizechoices .=
',5000:5000,10000:10000,20000:20000';
5769 if (!empty($conf->global->MAIN_PAGESIZE_CHOICES)) {
5770 $pagesizechoices = $conf->global->MAIN_PAGESIZE_CHOICES;
5773 print
'<li class="pagination">';
5774 print
'<select class="flat selectlimit" name="limit" title="'.dol_escape_htmltag($langs->trans(
"MaxNbOfRecordPerPage")).
'">';
5775 $tmpchoice = explode(
',', $pagesizechoices);
5776 $tmpkey = $limit.
':'.$limit;
5777 if (!in_array($tmpkey, $tmpchoice)) {
5778 $tmpchoice[] = $tmpkey;
5780 $tmpkey = $conf->liste_limit.
':'.$conf->liste_limit;
5781 if (!in_array($tmpkey, $tmpchoice)) {
5782 $tmpchoice[] = $tmpkey;
5784 asort($tmpchoice, SORT_NUMERIC);
5785 foreach ($tmpchoice as $val) {
5787 $tmp = explode(
':', $val);
5790 if ($key !=
'' && $val !=
'') {
5791 if ((
int) $key == (
int) $limit) {
5792 $selected =
' selected="selected"';
5794 print
'<option name="'.$key.
'"'.$selected.
'>'.
dol_escape_htmltag($val).
'</option>'.
"\n";
5798 if ($conf->use_javascript_ajax) {
5799 print
'<!-- JS CODE TO ENABLE select limit to launch submit of page -->
5801 jQuery(document).ready(function () {
5802 jQuery(".selectlimit").change(function() {
5803 console.log("Change limit. Send submit");
5804 $(this).parents(\'form:first\').submit();
5813 print
'<li class="pagination paginationpage paginationpageleft"><a class="paginationprevious" href="'.$file.
'?page='.($page - 1).$options.
'"><i class="fa fa-chevron-left" title="'.
dol_escape_htmltag($langs->trans(
"Previous")).
'"></i></a></li>';
5815 if ($betweenarrows) {
5816 print
'<!--<div class="betweenarrows nowraponall inline-block">-->';
5817 print $betweenarrows;
5818 print
'<!--</div>-->';
5820 if ($nextpage > 0) {
5821 print
'<li class="pagination paginationpage paginationpageright"><a class="paginationnext" href="'.$file.
'?page='.($page + 1).$options.
'"><i class="fa fa-chevron-right" title="'.
dol_escape_htmltag($langs->trans(
"Next")).
'"></i></a></li>';
5824 print
'<li class="paginationafterarrows">';
5829 print
'</ul></div>'.
"\n";
5844function vatrate($rate, $addpercent =
false, $info_bits = 0, $usestarfornpr = 0, $html = 0)
5848 if (preg_match(
'/%/', $rate)) {
5849 $rate = str_replace(
'%',
'', $rate);
5853 if (preg_match(
'/\((.*)\)/', $rate, $reg)) {
5854 $morelabel =
' ('.$reg[1].
')';
5855 $rate = preg_replace(
'/\s*'.preg_quote($morelabel,
'/').
'/',
'', $rate);
5856 $morelabel =
' '.($html ?
'<span class="opacitymedium">' :
'').
'('.$reg[1].
')'.($html ?
'</span>' :
'');
5858 if (preg_match(
'/\*/', $rate)) {
5859 $rate = str_replace(
'*',
'', $rate);
5864 if (!preg_match(
'/\//', $rate)) {
5865 $ret =
price($rate, 0,
'', 0, 0).($addpercent ?
'%' :
'');
5868 $ret = $rate.($addpercent ?
'%' :
'');
5870 if (($info_bits & 1) && $usestarfornpr >= 0) {
5893function price($amount, $form = 0, $outlangs =
'', $trunc = 1, $rounding = -1, $forcerounding = -1, $currency_code =
'')
5895 global $langs, $conf;
5898 if (empty($amount)) {
5901 $amount = (is_numeric($amount) ? $amount : 0);
5902 if ($rounding == -1) {
5903 $rounding = min($conf->global->MAIN_MAX_DECIMALS_UNIT, $conf->global->MAIN_MAX_DECIMALS_TOT);
5905 $nbdecimal = $rounding;
5907 if ($outlangs ===
'none') {
5917 if (!is_object($outlangs)) {
5921 if ($outlangs->transnoentitiesnoconv(
"SeparatorDecimal") !=
"SeparatorDecimal") {
5922 $dec = $outlangs->transnoentitiesnoconv(
"SeparatorDecimal");
5924 if ($outlangs->transnoentitiesnoconv(
"SeparatorThousand") !=
"SeparatorThousand") {
5925 $thousand = $outlangs->transnoentitiesnoconv(
"SeparatorThousand");
5927 if ($thousand ==
'None') {
5929 } elseif ($thousand ==
'Space') {
5936 $amount = str_replace(
',',
'.', $amount);
5938 $datas = explode(
'.', $amount);
5939 $decpart = isset($datas[1]) ? $datas[1] :
'';
5940 $decpart = preg_replace(
'/0+$/i',
'', $decpart);
5949 $max_nbdecimal = (int) str_replace(
'...',
'',
getDolGlobalString(
'MAIN_MAX_DECIMALS_SHOWN'));
5950 if ($trunc && $nbdecimal > $max_nbdecimal) {
5951 $nbdecimal = $max_nbdecimal;
5959 if ((
string) $forcerounding !=
'-1') {
5960 if ($forcerounding ===
'MU') {
5961 $nbdecimal = $conf->global->MAIN_MAX_DECIMALS_UNIT;
5962 } elseif ($forcerounding ===
'MT') {
5963 $nbdecimal = $conf->global->MAIN_MAX_DECIMALS_TOT;
5964 } elseif ($forcerounding >= 0) {
5965 $nbdecimal = $forcerounding;
5970 $output = number_format($amount, $nbdecimal, $dec, $thousand);
5972 $output = preg_replace(
'/\s/',
' ', $output);
5973 $output = preg_replace(
'/\'/',
''', $output);
5976 $cursymbolbefore = $cursymbolafter =
'';
5977 if ($currency_code && is_object($outlangs)) {
5978 if ($currency_code ==
'auto') {
5979 $currency_code = $conf->currency;
5982 $listofcurrenciesbefore = array(
'AUD',
'CAD',
'CNY',
'COP',
'CLP',
'GBP',
'HKD',
'MXN',
'PEN',
'USD',
'CRC');
5983 $listoflanguagesbefore = array(
'nl_NL');
5984 if (in_array($currency_code, $listofcurrenciesbefore) || in_array($outlangs->defaultlang, $listoflanguagesbefore)) {
5985 $cursymbolbefore .= $outlangs->getCurrencySymbol($currency_code);
5987 $tmpcur = $outlangs->getCurrencySymbol($currency_code);
5988 $cursymbolafter .= ($tmpcur == $currency_code ?
' '.$tmpcur : $tmpcur);
5991 $output = $cursymbolbefore.$output.$end.($cursymbolafter ?
' ' :
'').$cursymbolafter;
6022 global $langs, $conf;
6025 if (is_null($amount)) {
6034 if (is_null($langs)) {
6038 if ($langs->transnoentitiesnoconv(
"SeparatorDecimal") !=
"SeparatorDecimal") {
6039 $dec = $langs->transnoentitiesnoconv(
"SeparatorDecimal");
6041 if ($langs->transnoentitiesnoconv(
"SeparatorThousand") !=
"SeparatorThousand") {
6042 $thousand = $langs->transnoentitiesnoconv(
"SeparatorThousand");
6045 if ($thousand ==
'None') {
6047 } elseif ($thousand ==
'Space') {
6055 if (!is_numeric($amount)) {
6056 $amount = preg_replace(
'/[a-zA-Z\/\\\*\(\)<>\_]/',
'', $amount);
6059 if ($option == 2 && $thousand ==
'.' && preg_match(
'/\.(\d\d\d)$/', (
string) $amount)) {
6060 $amount = str_replace($thousand,
'', $amount);
6066 if (is_numeric($amount)) {
6068 $temps = sprintf(
"%0.10F", $amount - intval($amount));
6069 $temps = preg_replace(
'/([\.1-9])0+$/',
'\\1', $temps);
6071 $amount = number_format($amount, $nbofdec, $dec, $thousand);
6076 if ($thousand !=
',' && $thousand !=
'.') {
6077 $amount = str_replace(
',',
'.', $amount);
6080 $amount = str_replace(
' ',
'', $amount);
6081 $amount = str_replace($thousand,
'', $amount);
6082 $amount = str_replace($dec,
'.', $amount);
6084 $amount = preg_replace(
'/[^0-9\-\.]/',
'', $amount);
6090 $nbofdectoround =
'';
6091 if ($rounding ==
'MU') {
6092 $nbofdectoround = $conf->global->MAIN_MAX_DECIMALS_UNIT;
6093 } elseif ($rounding ==
'MT') {
6094 $nbofdectoround = $conf->global->MAIN_MAX_DECIMALS_TOT;
6095 } elseif ($rounding ==
'MS') {
6096 $nbofdectoround = isset($conf->global->MAIN_MAX_DECIMALS_STOCK) ? $conf->global->MAIN_MAX_DECIMALS_STOCK : 5;
6097 } elseif ($rounding ==
'CU') {
6098 $nbofdectoround = max($conf->global->MAIN_MAX_DECIMALS_UNIT, 8);
6099 } elseif ($rounding ==
'CT') {
6100 $nbofdectoround = max($conf->global->MAIN_MAX_DECIMALS_TOT, 8);
6101 } elseif (is_numeric($rounding)) {
6102 $nbofdectoround = (int) $rounding;
6107 $amount = round(is_string($amount) ? (
float) $amount : $amount, $nbofdectoround);
6109 return 'ErrorBadParameterProvidedToFunction';
6115 if (is_numeric($amount)) {
6117 $temps = sprintf(
"%0.10F", $amount - intval($amount));
6118 $temps = preg_replace(
'/([\.1-9])0+$/',
'\\1', $temps);
6120 $amount = number_format($amount, min($nbofdec, $nbofdectoround), $dec, $thousand);
6126 if ($thousand !=
',' && $thousand !=
'.') {
6127 $amount = str_replace(
',',
'.', $amount);
6130 $amount = str_replace(
' ',
'', $amount);
6131 $amount = str_replace($thousand,
'', $amount);
6132 $amount = str_replace($dec,
'.', $amount);
6134 $amount = preg_replace(
'/[^0-9\-\.]/',
'', $amount);
6152function showDimensionInBestUnit($dimension, $unit, $type, $outputlangs, $round = -1, $forceunitoutput =
'no', $use_short_label = 0)
6154 require_once DOL_DOCUMENT_ROOT.
'/core/lib/product.lib.php';
6156 if (($forceunitoutput ==
'no' && $dimension < 1 / 10000 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == -6)) {
6157 $dimension = $dimension * 1000000;
6159 } elseif (($forceunitoutput ==
'no' && $dimension < 1 / 10 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == -3)) {
6160 $dimension = $dimension * 1000;
6162 } elseif (($forceunitoutput ==
'no' && $dimension > 100000000 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == 6)) {
6163 $dimension = $dimension / 1000000;
6165 } elseif (($forceunitoutput ==
'no' && $dimension > 100000 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == 3)) {
6166 $dimension = $dimension / 1000;
6182 $ret =
price($dimension, 0, $outputlangs, 0, 0, $round);
6183 $ret .=
' '.measuringUnitString(0, $type, $unit, $use_short_label, $outputlangs);
6201function get_localtax($vatrate, $local, $thirdparty_buyer =
"", $thirdparty_seller =
"", $vatnpr = 0)
6203 global $db, $conf, $mysoc;
6205 if (empty($thirdparty_seller) || !is_object($thirdparty_seller)) {
6206 $thirdparty_seller = $mysoc;
6209 dol_syslog(
"get_localtax tva=".$vatrate.
" local=".$local.
" thirdparty_buyer id=".(is_object($thirdparty_buyer) ? $thirdparty_buyer->id :
'').
"/country_code=".(is_object($thirdparty_buyer) ? $thirdparty_buyer->country_code :
'').
" thirdparty_seller id=".$thirdparty_seller->id.
"/country_code=".$thirdparty_seller->country_code.
" thirdparty_seller localtax1_assuj=".$thirdparty_seller->localtax1_assuj.
" thirdparty_seller localtax2_assuj=".$thirdparty_seller->localtax2_assuj);
6211 $vatratecleaned = $vatrate;
6213 if (preg_match(
'/^(.*)\s*\((.*)\)$/', $vatrate, $reg)) {
6214 $vatratecleaned = trim($reg[1]);
6215 $vatratecode = $reg[2];
6224 if ($mysoc->country_code ==
'ES') {
6226 if (!$mysoc->localtax1_assuj || (
string) $vatratecleaned ==
"0") {
6229 if ($thirdparty_seller->id == $mysoc->id) {
6230 if (!$thirdparty_buyer->localtax1_assuj) {
6234 if (!$thirdparty_seller->localtax1_assuj) {
6242 if (!$mysoc->localtax2_assuj) {
6245 if ($thirdparty_seller->id == $mysoc->id) {
6246 if (!$thirdparty_buyer->localtax2_assuj) {
6250 if (!$thirdparty_seller->localtax2_assuj) {
6256 if ($local == 1 && !$thirdparty_seller->localtax1_assuj) {
6259 if ($local == 2 && !$thirdparty_seller->localtax2_assuj) {
6265 if (in_array($mysoc->country_code, array(
'ES'))) {
6266 $conf->global->MAIN_GET_LOCALTAXES_VALUES_FROM_THIRDPARTY = 1;
6270 if (!empty($conf->global->MAIN_GET_LOCALTAXES_VALUES_FROM_THIRDPARTY)) {
6272 if ($thirdparty_seller != $mysoc) {
6274 return $thirdparty_seller->localtax1_value;
6278 return $conf->global->MAIN_INFO_VALUE_LOCALTAX1;
6283 if ($thirdparty_seller != $mysoc) {
6286 return $thirdparty_seller->localtax2_value;
6289 if (in_array($mysoc->country_code, array(
'ES'))) {
6290 return $thirdparty_buyer->localtax2_value;
6292 return $conf->global->MAIN_INFO_VALUE_LOCALTAX2;
6299 $sql =
"SELECT t.localtax1, t.localtax2, t.localtax1_type, t.localtax2_type";
6300 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t, ".MAIN_DB_PREFIX.
"c_country as c";
6301 $sql .=
" WHERE t.fk_pays = c.rowid AND c.code = '".$db->escape($thirdparty_seller->country_code).
"'";
6302 $sql .=
" AND t.taux = ".((float) $vatratecleaned).
" AND t.active = 1";
6303 if (!empty($vatratecode)) {
6304 $sql .=
" AND t.code ='".$db->escape($vatratecode).
"'";
6306 $sql .=
" AND t.recuperableonly = '".$db->escape($vatnpr).
"'";
6309 $resql = $db->query($sql);
6312 $obj = $db->fetch_object($resql);
6315 return $obj->localtax1;
6316 } elseif ($local == 2) {
6317 return $obj->localtax2;
6338 $valors = explode(
":", $tax);
6340 if (count($valors) > 1) {
6357 $sql =
" SELECT t.localtax".$local.
" as localtax";
6358 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t INNER JOIN ".MAIN_DB_PREFIX.
"c_country as c ON c.rowid = t.fk_pays";
6359 $sql .=
" WHERE c.code = '".$db->escape($mysoc->country_code).
"' AND t.active = 1 AND t.taux = (";
6360 $sql .=
"SELECT MAX(tt.taux) FROM ".MAIN_DB_PREFIX.
"c_tva as tt INNER JOIN ".MAIN_DB_PREFIX.
"c_country as c ON c.rowid = tt.fk_pays";
6361 $sql .=
" WHERE c.code = '".$db->escape($mysoc->country_code).
"' AND tt.active = 1)";
6362 $sql .=
" AND t.localtax".$local.
"_type <> '0'";
6363 $sql .=
" ORDER BY t.rowid DESC";
6365 $resql = $db->query($sql);
6367 $obj = $db->fetch_object($resql);
6369 return $obj->localtax;
6394 dol_syslog(
"getTaxesFromId vat id or rate = ".$vatrate);
6397 $sql =
"SELECT t.rowid, t.code, t.taux as rate, t.recuperableonly as npr, t.accountancy_code_sell, t.accountancy_code_buy,";
6398 $sql .=
" t.localtax1, t.localtax1_type, t.localtax2, t.localtax2_type";
6399 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t";
6400 if ($firstparamisid) {
6401 $sql .=
" WHERE t.rowid = ".(int) $vatrate;
6403 $vatratecleaned = $vatrate;
6406 if (preg_match(
'/^(.*)\s*\((.*)\)$/', $vatrate, $reg)) {
6407 $vatratecleaned = $reg[1];
6408 $vatratecode = $reg[2];
6411 $sql .=
", ".MAIN_DB_PREFIX.
"c_country as c";
6414 $sql .=
" WHERE t.fk_pays = c.rowid AND c.code = '".$db->escape($seller->country_code).
"'";
6415 $sql .=
" AND t.taux = ".((float) $vatratecleaned).
" AND t.active = 1";
6417 $sql .=
" AND t.code = '".$db->escape($vatratecode).
"'";
6421 $resql = $db->query($sql);
6423 $obj = $db->fetch_object($resql);
6426 'rowid'=>$obj->rowid,
6429 'localtax1'=>$obj->localtax1,
6430 'localtax1_type'=>$obj->localtax1_type,
6431 'localtax2'=>$obj->localtax2,
6432 'localtax2_type'=>$obj->localtax2_type,
6434 'accountancy_code_sell'=>$obj->accountancy_code_sell,
6435 'accountancy_code_buy'=>$obj->accountancy_code_buy
6467 dol_syslog(
"getLocalTaxesFromRate vatrate=".$vatrate.
" local=".$local);
6470 $sql =
"SELECT t.taux as rate, t.code, t.localtax1, t.localtax1_type, t.localtax2, t.localtax2_type, t.accountancy_code_sell, t.accountancy_code_buy";
6471 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t";
6472 if ($firstparamisid) {
6473 $sql .=
" WHERE t.rowid = ".(int) $vatrate;
6475 $vatratecleaned = $vatrate;
6478 if (preg_match(
'/^(.*)\s*\((.*)\)$/', $vatrate, $reg)) {
6479 $vatratecleaned = $reg[1];
6480 $vatratecode = $reg[2];
6483 $sql .=
", ".MAIN_DB_PREFIX.
"c_country as c";
6484 if (!empty($mysoc) && $mysoc->country_code ==
'ES') {
6485 $countrycodetouse = ((empty($buyer) || empty($buyer->country_code)) ? $mysoc->country_code : $buyer->country_code);
6486 $sql .=
" WHERE t.fk_pays = c.rowid AND c.code = '".$db->escape($countrycodetouse).
"'";
6488 $countrycodetouse = ((empty($seller) || empty($seller->country_code)) ? $mysoc->country_code : $seller->country_code);
6489 $sql .=
" WHERE t.fk_pays = c.rowid AND c.code = '".$db->escape($countrycodetouse).
"'";
6491 $sql .=
" AND t.taux = ".((float) $vatratecleaned).
" AND t.active = 1";
6493 $sql .=
" AND t.code = '".$db->escape($vatratecode).
"'";
6497 $resql = $db->query($sql);
6499 $obj = $db->fetch_object($resql);
6502 $vateratestring = $obj->rate.($obj->code ?
' ('.$obj->code.
')' :
'');
6505 return array($obj->localtax1_type,
get_localtax($vateratestring, $local, $buyer, $seller), $obj->accountancy_code_sell, $obj->accountancy_code_buy);
6506 } elseif ($local == 2) {
6507 return array($obj->localtax2_type,
get_localtax($vateratestring, $local, $buyer, $seller), $obj->accountancy_code_sell, $obj->accountancy_code_buy);
6509 return array($obj->localtax1_type,
get_localtax($vateratestring, 1, $buyer, $seller), $obj->localtax2_type,
get_localtax($vateratestring, 2, $buyer, $seller), $obj->accountancy_code_sell, $obj->accountancy_code_buy);
6529 global $db, $conf, $mysoc;
6531 require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
6539 $product->fetch($idprod);
6541 if ($mysoc->country_code == $thirdpartytouse->country_code) {
6543 if ($idprodfournprice > 0) {
6544 $result = $product->get_buyprice($idprodfournprice, 0, 0, 0);
6546 $ret = $product->vatrate_supplier;
6547 if ($product->default_vat_code_supplier) {
6548 $ret .=
' ('.$product->default_vat_code_supplier.
')';
6554 $ret = $product->tva_tx;
6555 if ($product->default_vat_code) {
6556 $ret .=
' ('.$product->default_vat_code.
')';
6567 if (empty($conf->global->MAIN_VAT_DEFAULT_IF_AUTODETECT_FAILS)) {
6569 $sql =
"SELECT t.taux as vat_rate, t.code as default_vat_code";
6570 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t, ".MAIN_DB_PREFIX.
"c_country as c";
6571 $sql .=
" WHERE t.active = 1 AND t.fk_pays = c.rowid AND c.code = '".$db->escape($thirdpartytouse->country_code).
"'";
6572 $sql .=
" ORDER BY t.use_default DESC, t.taux DESC, t.code ASC, t.recuperableonly ASC";
6573 $sql .= $db->plimit(1);
6575 $resql = $db->query($sql);
6577 $obj = $db->fetch_object($resql);
6579 $ret = $obj->vat_rate;
6580 if ($obj->default_vat_code) {
6581 $ret .=
' ('.$obj->default_vat_code.
')';
6593 if ($conf->global->MAIN_VAT_DEFAULT_IF_AUTODETECT_FAILS !=
'none') {
6594 $defaulttx = $conf->global->MAIN_VAT_DEFAULT_IF_AUTODETECT_FAILS;
6605 dol_syslog(
"get_product_vat_for_country: ret=".$ret);
6622 if (!class_exists(
'Product')) {
6623 require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
6632 $result = $product->fetch($idprod);
6634 if ($mysoc->country_code == $thirdpartytouse->country_code) {
6648 $sql =
"SELECT taux as vat_rate, localtax1, localtax2";
6649 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t, ".MAIN_DB_PREFIX.
"c_country as c";
6650 $sql .=
" WHERE t.active=1 AND t.fk_pays = c.rowid AND c.code='".$db->escape($thirdpartytouse->country_code).
"'";
6651 $sql .=
" ORDER BY t.taux DESC, t.recuperableonly ASC";
6652 $sql .= $db->plimit(1);
6654 $resql = $db->query($sql);
6656 $obj = $db->fetch_object($resql);
6659 $ret = $obj->localtax1;
6660 } elseif ($local == 2) {
6661 $ret = $obj->localtax2;
6669 dol_syslog(
"get_product_localtax_for_country: ret=".$ret);
6693 require_once DOL_DOCUMENT_ROOT.
'/core/lib/company.lib.php';
6696 $seller_use_vat = ((is_numeric($thirdparty_seller->tva_assuj) && !$thirdparty_seller->tva_assuj) || (!is_numeric($thirdparty_seller->tva_assuj) && $thirdparty_seller->tva_assuj ==
'franchise')) ? 0 : 1;
6698 $seller_country_code = $thirdparty_seller->country_code;
6699 $seller_in_cee =
isInEEC($thirdparty_seller);
6701 $buyer_country_code = $thirdparty_buyer->country_code;
6702 $buyer_in_cee =
isInEEC($thirdparty_buyer);
6704 dol_syslog(
"get_default_tva: seller use vat=".$seller_use_vat.
", seller country=".$seller_country_code.
", seller in cee=".$seller_in_cee.
", buyer vat number=".$thirdparty_buyer->tva_intra.
" buyer country=".$buyer_country_code.
", buyer in cee=".$buyer_in_cee.
", idprod=".$idprod.
", idprodfournprice=".$idprodfournprice.
", SERVICE_ARE_ECOMMERCE_200238EC=".(!empty($conf->global->SERVICES_ARE_ECOMMERCE_200238EC) ? $conf->global->SERVICES_ARE_ECOMMERCE_200238EC :
''));
6708 if (!empty($conf->global->SERVICE_ARE_ECOMMERCE_200238EC)) {
6709 if ($seller_in_cee && $buyer_in_cee) {
6710 $isacompany = $thirdparty_buyer->
isACompany();
6711 if ($isacompany &&
getDolGlobalString(
'MAIN_USE_VAT_COMPANIES_IN_EEC_WITH_INVALID_VAT_ID_ARE_INDIVIDUAL')) {
6712 require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
6726 if (!$seller_use_vat) {
6732 if (($seller_country_code == $buyer_country_code)
6733 || (in_array($seller_country_code, array(
'FR',
'MC')) && in_array($buyer_country_code, array(
'FR',
'MC')))) {
6737 if ($seller_country_code ==
'IN' &&
getDolGlobalString(
'MAIN_SALETAX_AUTOSWITCH_I_CS_FOR_INDIA')) {
6741 if (preg_match(
'/C+S-(\d+)/', $tmpvat, $reg) && $thirdparty_seller->state_id != $thirdparty_buyer->state_id) {
6743 $tmpvat = str_replace(
"C+S",
"I", $tmpvat);
6744 } elseif (preg_match(
'/I-(\d+)/', $tmpvat, $reg) && $thirdparty_seller->state_id == $thirdparty_buyer->state_id) {
6746 $tmpvat = str_replace(
"I",
"C+S", $tmpvat);
6758 if (($seller_in_cee && $buyer_in_cee)) {
6759 $isacompany = $thirdparty_buyer->
isACompany();
6760 if ($isacompany &&
getDolGlobalString(
'MAIN_USE_VAT_COMPANIES_IN_EEC_WITH_INVALID_VAT_ID_ARE_INDIVIDUAL')) {
6761 require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
6778 if (!empty($conf->global->MAIN_USE_VAT_OF_PRODUCT_FOR_INDIVIDUAL_CUSTOMER_OUT_OF_EEC) && empty($buyer_in_cee)) {
6779 $isacompany = $thirdparty_buyer->
isACompany();
6807 if ($idprodfournprice > 0) {
6808 if (!class_exists(
'ProductFournisseur')) {
6809 require_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.product.class.php';
6812 $prodprice->fetch_product_fournisseur_price($idprodfournprice);
6813 return $prodprice->fourn_tva_npr;
6814 } elseif ($idprod > 0) {
6815 if (!class_exists(
'Product')) {
6816 require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
6819 $prod->fetch($idprod);
6820 return $prod->tva_npr;
6843 if (!is_object($thirdparty_seller)) {
6846 if (!is_object($thirdparty_buyer)) {
6851 if ($mysoc->country_code ==
'ES') {
6852 if (is_numeric($thirdparty_buyer->localtax1_assuj) && !$thirdparty_buyer->localtax1_assuj) {
6857 if (is_numeric($thirdparty_seller->localtax1_assuj) && !$thirdparty_seller->localtax1_assuj) {
6860 if (!is_numeric($thirdparty_seller->localtax1_assuj) && $thirdparty_seller->localtax1_assuj ==
'localtax1off') {
6864 } elseif ($local == 2) {
6866 if (is_numeric($thirdparty_seller->localtax2_assuj) && !$thirdparty_seller->localtax2_assuj) {
6869 if (!is_numeric($thirdparty_seller->localtax2_assuj) && $thirdparty_seller->localtax2_assuj ==
'localtax2off') {
6874 if ($thirdparty_seller->country_code == $thirdparty_buyer->country_code) {
6889function yn($yesno, $case = 1, $color = 0)
6893 $result =
'unknown';
6895 if ($yesno == 1 || (isset($yesno) && (strtolower($yesno) ==
'yes' || strtolower($yesno) ==
'true'))) {
6896 $result = $langs->trans(
'yes');
6897 if ($case == 1 || $case == 3) {
6898 $result = $langs->trans(
"Yes");
6901 $result =
'<input type="checkbox" value="1" checked disabled>';
6904 $result =
'<input type="checkbox" value="1" checked disabled> '.$result;
6908 } elseif ($yesno == 0 || strtolower($yesno) ==
'no' || strtolower($yesno) ==
'false') {
6909 $result = $langs->trans(
"no");
6910 if ($case == 1 || $case == 3) {
6911 $result = $langs->trans(
"No");
6914 $result =
'<input type="checkbox" value="0" disabled>';
6917 $result =
'<input type="checkbox" value="0" disabled> '.$result;
6923 $classname =
'error';
6927 return '<span class="'.$classname.
'">'.$result.
'</span>';
6947function get_exdir($num, $level, $alpha, $withoutslash, $object, $modulepart =
'')
6951 if (empty($modulepart) && !empty($object->module)) {
6952 $modulepart = $object->module;
6957 $arrayforoldpath = array(
'cheque',
'category',
'holiday',
'supplier_invoice',
'invoice_supplier',
'mailing',
'supplier_payment');
6959 $arrayforoldpath[] =
'product';
6961 if (!empty($level) && in_array($modulepart, $arrayforoldpath)) {
6963 if (empty($alpha)) {
6964 $num = preg_replace(
'/([^0-9])/i',
'', $num);
6966 $num = preg_replace(
'/^.*\-/i',
'', $num);
6968 $num = substr(
"000".$num, -$level);
6970 $path = substr($num, 0, 1);
6973 $path = substr($num, 1, 1).
'/'.substr($num, 0, 1);
6976 $path = substr($num, 2, 1).
'/'.substr($num, 1, 1).
'/'.substr($num, 0, 1);
6986 if (empty($withoutslash) && !empty($path)) {
7005 dol_syslog(
"functions.lib::dol_mkdir: dir=".$dir, LOG_INFO);
7008 if (@is_dir($dir_osencoded)) {
7016 if (!empty($dataroot)) {
7018 $dir = str_replace($dataroot.
'/',
'', $dir);
7019 $ccdir = $dataroot.
'/';
7022 $cdir = explode(
"/", $dir);
7023 $num = count($cdir);
7024 for ($i = 0; $i < $num; $i++) {
7026 $ccdir .=
'/'.$cdir[$i];
7028 $ccdir .= $cdir[$i];
7031 if (preg_match(
"/^.:$/", $ccdir, $regs)) {
7039 if (!@is_dir($ccdir_osencoded)) {
7040 dol_syslog(
"functions.lib::dol_mkdir: Directory '".$ccdir.
"' does not exists or is outside open_basedir PHP setting.", LOG_DEBUG);
7043 $dirmaskdec = octdec((
string) $newmask);
7044 if (empty($newmask)) {
7045 $dirmaskdec = empty($conf->global->MAIN_UMASK) ? octdec(
'0755') : octdec($conf->global->MAIN_UMASK);
7047 $dirmaskdec |= octdec(
'0111');
7048 if (!@mkdir($ccdir_osencoded, $dirmaskdec)) {
7050 dol_syslog(
"functions.lib::dol_mkdir: Fails to create directory '".$ccdir.
"' or directory already exists.", LOG_WARNING);
7053 dol_syslog(
"functions.lib::dol_mkdir: Directory '".$ccdir.
"' created", LOG_DEBUG);
7062 return ($nberr ? -$nberr : $nbcreated);
7077 if (!empty($newmask)) {
7078 @chmod($filepath, octdec($newmask));
7079 } elseif (!empty($conf->global->MAIN_UMASK)) {
7080 @chmod($filepath, octdec($conf->global->MAIN_UMASK));
7092 return '<span class="fieldrequired">*</span>';
7112function dol_string_nohtmltag($stringtoclean, $removelinefeed = 1, $pagecodeto =
'UTF-8', $strip_tags = 0, $removedoublespaces = 1)
7114 if (is_null($stringtoclean)) {
7118 if ($removelinefeed == 2) {
7119 $stringtoclean = preg_replace(
'/<br[^>]*>(\n|\r)+/ims',
'<br>', $stringtoclean);
7121 $temp = preg_replace(
'/<br[^>]*>/i',
"\n", $stringtoclean);
7126 $temp = str_replace(
'< ',
'__ltspace__', $temp);
7129 $temp = strip_tags($temp);
7132 $pattern =
"/<[^<>]+>/";
7139 $tempbis = str_replace(
'<>',
'', $temp);
7140 $tempbis = preg_replace($pattern,
'', $tempbis);
7142 }
while ($tempbis != $temp);
7147 $temp = preg_replace(
'/<+([a-z]+)/i',
'\1', $temp);
7153 if ($removelinefeed == 1) {
7154 $temp = str_replace(array(
"\r\n",
"\r",
"\n"),
" ", $temp);
7158 if ($removedoublespaces) {
7159 while (strpos($temp,
" ")) {
7160 $temp = str_replace(
" ",
" ", $temp);
7164 $temp = str_replace(
'__ltspace__',
'< ', $temp);
7184function dol_string_onlythesehtmltags($stringtoclean, $cleanalsosomestyles = 1, $removeclassattribute = 1, $cleanalsojavascript = 0, $allowiframe = 0, $allowed_tags = array(), $allowlink = 0)
7186 if (empty($allowed_tags)) {
7187 $allowed_tags = array(
7188 "html",
"head",
"meta",
"body",
"article",
"a",
"abbr",
"b",
"blockquote",
"br",
"cite",
"div",
"dl",
"dd",
"dt",
"em",
"font",
"img",
"ins",
"hr",
"i",
"li",
7189 "ol",
"p",
"q",
"s",
"section",
"span",
"strike",
"strong",
"title",
"table",
"tr",
"th",
"td",
"u",
"ul",
"sup",
"sub",
"blockquote",
"pre",
"h1",
"h2",
"h3",
"h4",
"h5",
"h6"
7192 $allowed_tags[] =
"comment";
7194 if (!in_array(
'iframe', $allowed_tags)) {
7195 $allowed_tags[] =
"iframe";
7199 if (!in_array(
'link', $allowed_tags)) {
7200 $allowed_tags[] =
"link";
7204 $allowed_tags_string = join(
"><", $allowed_tags);
7205 $allowed_tags_string =
'<'.$allowed_tags_string.
'>';
7207 $stringtoclean = str_replace(
'<!DOCTYPE html>',
'__!DOCTYPE_HTML__', $stringtoclean);
7212 $stringtoclean = preg_replace(
'/<!--([^>]*)-->/',
'<comment>\1</comment>', $stringtoclean);
7214 $stringtoclean = preg_replace(
'/:/i',
':', $stringtoclean);
7215 $stringtoclean = preg_replace(
'/:|�+58|:/i',
'', $stringtoclean);
7217 $temp = strip_tags($stringtoclean, $allowed_tags_string);
7219 if ($cleanalsosomestyles) {
7220 $temp = preg_replace(
'/position\s*:\s*(absolute|fixed)\s*!\s*important/i',
'', $temp);
7222 if ($removeclassattribute) {
7223 $temp = preg_replace(
'/(<[^>]+)\s+class=((["\']).*?\\3|\\w*)/i',
'\\1', $temp);
7228 if ($cleanalsojavascript) {
7229 $temp = preg_replace(
'/j\s*a\s*v\s*a\s*s\s*c\s*r\s*i\s*p\s*t\s*:/i',
'', $temp);
7232 $temp = str_replace(
'__!DOCTYPE_HTML__',
'<!DOCTYPE html>', $temp);
7234 $temp = preg_replace(
'/<comment>([^>]*)<\/comment>/',
'<!--\1-->', $temp);
7252function dol_string_onlythesehtmlattributes($stringtoclean, $allowed_attributes = array(
"allow",
"allowfullscreen",
"alt",
"class",
"contenteditable",
"data-html",
"frameborder",
"height",
"href",
"id",
"name",
"src",
"style",
"target",
"title",
"width"))
7254 if (is_null($allowed_attributes)) {
7255 $allowed_attributes = array(
7256 "allow",
"allowfullscreen",
"alt",
"async",
"class",
"contenteditable",
"crossorigin",
"data-html",
"frameborder",
"height",
"href",
"id",
"name",
"property",
"rel",
"src",
"style",
"target",
"title",
"type",
"width",
7258 "header",
"footer",
"nav",
"section",
"menu",
"menuitem"
7262 if (!in_array(
"content", $allowed_attributes)) {
7263 $allowed_attributes[] =
"content";
7265 if (!in_array(
"http-equiv", $allowed_attributes)) {
7266 $allowed_attributes[] =
"http-equiv";
7269 if (class_exists(
'DOMDocument') && !empty($stringtoclean)) {
7270 $stringtoclean =
'<?xml encoding="UTF-8"><html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body>'.$stringtoclean.
'</body></html>';
7272 $dom =
new DOMDocument(
null,
'UTF-8');
7273 $dom->loadHTML($stringtoclean, LIBXML_ERR_NONE|LIBXML_HTML_NOIMPLIED|LIBXML_HTML_NODEFDTD|LIBXML_NONET|LIBXML_NOWARNING|LIBXML_NOXMLDECL);
7275 if (is_object($dom)) {
7276 for ($els = $dom->getElementsByTagname(
'*'), $i = $els->length - 1; $i >= 0; $i--) {
7277 for ($attrs = $els->item($i)->attributes, $ii = $attrs->length - 1; $ii >= 0; $ii--) {
7279 if (!empty($attrs->item($ii)->name)) {
7280 if (! in_array($attrs->item($ii)->name, $allowed_attributes)) {
7282 $els->item($i)->removeAttribute($attrs->item($ii)->name);
7283 } elseif (in_array($attrs->item($ii)->name, array(
'style'))) {
7285 $valuetoclean = $attrs->item($ii)->value;
7287 if (isset($valuetoclean)) {
7289 $oldvaluetoclean = $valuetoclean;
7290 $valuetoclean = preg_replace(
'/\/\*.*\*\//m',
'', $valuetoclean);
7291 $valuetoclean = preg_replace(
'/position\s*:\s*[a-z]+/mi',
'', $valuetoclean);
7292 if ($els->item($i)->tagName ==
'a') {
7293 $valuetoclean = preg_replace(
'/display\s*:/mi',
'', $valuetoclean);
7294 $valuetoclean = preg_replace(
'/z-index\s*:/mi',
'', $valuetoclean);
7295 $valuetoclean = preg_replace(
'/\s+(top|left|right|bottom)\s*:/mi',
'', $valuetoclean);
7299 $valuetoclean = preg_replace(
'/(logout|passwordforgotten)\.php/mi',
'', $valuetoclean);
7300 $valuetoclean = preg_replace(
'/action=/mi',
'', $valuetoclean);
7301 }
while ($oldvaluetoclean != $valuetoclean);
7304 $attrs->item($ii)->value = $valuetoclean;
7311 $dom->encoding =
'UTF-8';
7313 $return = $dom->saveHTML();
7316 $return = preg_replace(
'/^'.preg_quote(
'<?xml encoding="UTF-8">',
'/').
'/',
'', $return);
7317 $return = preg_replace(
'/^'.preg_quote(
'<html><head><',
'/').
'[^<>]*'.preg_quote(
'></head><body>',
'/').
'/',
'', $return);
7318 $return = preg_replace(
'/'.preg_quote(
'</body></html>',
'/').
'$/',
'', trim($return));
7320 return trim($return);
7322 return $stringtoclean;
7339 $temp = $stringtoclean;
7340 foreach ($disallowed_tags as $tagtoremove) {
7341 $temp = preg_replace(
'/<\/?'.$tagtoremove.
'>/',
'', $temp);
7342 $temp = preg_replace(
'/<\/?'.$tagtoremove.
'\s+[^>]*>/',
'', $temp);
7345 if ($cleanalsosomestyles) {
7346 $temp = preg_replace(
'/position\s*:\s*(absolute|fixed)\s*!\s*important/',
'', $temp);
7364 if ($nboflines == 1) {
7366 $firstline = preg_replace(
'/<br[^>]*>.*$/s',
'', $text);
7367 $firstline = preg_replace(
'/<div[^>]*>.*$/s',
'', $firstline);
7370 $firstline = preg_replace(
'/[\n\r].*/',
'', $text);
7375 return $firstline.(isset($firstline) && isset($text) && (strlen($firstline) != strlen($text)) ?
'...' :
'');
7379 $text = preg_replace(
'/\n/',
'', $text);
7381 $repTable = array(
"\t" =>
" ",
"\n" =>
" ",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
7383 $repTable = array(
"\t" =>
" ",
"\n" =>
"<br>",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
7386 $text = strtr($text, $repTable);
7387 if ($charset ==
'UTF-8') {
7388 $pattern =
'/(<br[^>]*>)/Uu';
7391 $pattern =
'/(<br[^>]*>)/U';
7393 $a = preg_split($pattern, $text, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
7398 while (($i < $nba) && ($i < ($nboflines * 2))) {
7400 $firstline .= $a[$i];
7401 } elseif (($i < (($nboflines * 2) - 1)) && ($i < ($nba - 1))) {
7402 $firstline .= ($ishtml ?
"<br>\n" :
"\n");
7407 return $firstline.(($i < $nba) ?
'...' :
'');
7423function dol_nl2br($stringtoencode, $nl2brmode = 0, $forxml =
false)
7425 if (is_null($stringtoencode)) {
7430 return nl2br($stringtoencode, $forxml);
7432 $ret = preg_replace(
'/(\r\n|\r|\n)/i', ($forxml ?
'<br />' :
'<br>'), $stringtoencode);
7449 if (empty($nouseofiframesandbox) && !empty($conf->global->MAIN_SECURITY_USE_SANDBOX_FOR_HTMLWITHNOJS)) {
7454 return $stringtoencode;
7456 $out = $stringtoencode;
7459 $oldstringtoclean = $out;
7461 if (!empty($out) && !empty($conf->global->MAIN_RESTRICTHTML_ONLY_VALID_HTML) && $check !=
'restricthtmlallowunvalid') {
7463 libxml_use_internal_errors(
false);
7465 $dom =
new DOMDocument;
7471 $out =
'<?xml encoding="UTF-8"><html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body><div class="tricktoremove">'.$out.
'</div></body></html>';
7473 $out =
'<?xml encoding="UTF-8"><html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body><div class="tricktoremove">'.dol_nl2br($out).
'</div></body></html>';
7476 $dom->loadHTML($out, LIBXML_HTML_NODEFDTD | LIBXML_ERR_NONE | LIBXML_HTML_NOIMPLIED | LIBXML_NONET | LIBXML_NOWARNING | LIBXML_NOERROR | LIBXML_NOXMLDECL);
7478 $dom->encoding =
'UTF-8';
7480 $out = trim($dom->saveHTML());
7483 $out = preg_replace(
'/^'.preg_quote(
'<?xml encoding="UTF-8">',
'/').
'/',
'', $out);
7484 $out = preg_replace(
'/^'.preg_quote(
'<html><head><',
'/').
'[^<>]+'.preg_quote(
'></head><body><div class="tricktoremove">',
'/').
'/',
'', $out);
7485 $out = preg_replace(
'/'.preg_quote(
'</div></body></html>',
'/').
'$/',
'', trim($out));
7492 $out =
'InvalidHTMLStringCantBeCleaned';
7497 $out = preg_replace(
'/&(tab|newline);/i',
' ', $out);
7501 $out = preg_replace(
'/'/i',
''', $out);
7506 $out = preg_replace_callback(
'/&#(x?[0-9][0-9a-f]+;?)/i',
function ($m) {
7511 $out = preg_replace(
'/&#x?[0-9]+/i',
'', $out);
7517 if (!empty($conf->global->MAIN_RESTRICTHTML_REMOVE_ALSO_BAD_ATTRIBUTES)) {
7522 $out = preg_replace(
'/'/i',
"'", $out);
7523 }
while ($oldstringtoclean != $out);
7530 preg_match_all(
'/(<img|url\(|<link)/i', $out, $reg);
7531 $nbextlink = count($reg[0]);
7532 if ($nbextlink >
getDolGlobalInt(
"MAIN_SECURITY_MAX_IMG_IN_HTML_CONTENT", 1000)) {
7533 $out =
'TooManyLinksIntoHTMLString';
7536 if (!empty($conf->global->MAIN_DISALLOW_EXT_URL_INTO_DESCRIPTIONS) || $check ==
'restricthtmlnolink') {
7537 if ($nbextlink > 0) {
7538 $out =
'ExternalLinksNotAllowed';
7567function dol_htmlentitiesbr($stringtoencode, $nl2brmode = 0, $pagecodefrom =
'UTF-8', $removelasteolbr = 1)
7569 if (is_null($stringtoencode)) {
7573 $newstring = $stringtoencode;
7575 $newstring = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>/i',
'<br>', $newstring);
7576 if ($removelasteolbr) {
7577 $newstring = preg_replace(
'/<br>$/i',
'', $newstring);
7579 $newstring = strtr($newstring, array(
'&'=>
'__and__',
'<'=>
'__lt__',
'>'=>
'__gt__',
'"'=>
'__dquot__'));
7581 $newstring = strtr($newstring, array(
'__and__'=>
'&',
'__lt__'=>
'<',
'__gt__'=>
'>',
'__dquot__'=>
'"'));
7583 if ($removelasteolbr) {
7584 $newstring = preg_replace(
'/(\r\n|\r|\n)$/i',
'', $newstring);
7603 $ret = preg_replace(
'/'.
"\r\n".
'<br(\s[\sa-zA-Z_="]*)?\/?>/i',
"<br>", $ret);
7604 $ret = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>'.
"\r\n".
'/i',
"\r\n", $ret);
7605 $ret = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>'.
"\n".
'/i',
"\n", $ret);
7606 $ret = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>/i',
"\n", $ret);
7618 $ret = preg_replace(
'/ $/i',
"", $stringtodecode);
7619 $ret = preg_replace(
'/(<br>|<br(\s[\sa-zA-Z_="]*)?\/?>|'.
"\n".
'|'.
"\r".
')+$/i',
"", $ret);
7635 if ($keepsomeentities) {
7636 $newstring = strtr($newstring, array(
'&'=>
'__andamp__',
'<'=>
'__andlt__',
'>'=>
'__andgt__',
'"'=>
'__dquot__'));
7638 $newstring = html_entity_decode((
string) $newstring, (
int) $b, (
string) $c);
7639 if ($keepsomeentities) {
7640 $newstring = strtr($newstring, array(
'__andamp__'=>
'&',
'__andlt__'=>
'<',
'__andgt__'=>
'>',
'__dquot__'=>
'"'));
7655function dol_htmlentities($string, $flags = ENT_QUOTES|ENT_SUBSTITUTE, $encoding =
'UTF-8', $double_encode =
false)
7657 return htmlentities($string, $flags, $encoding, $double_encode);
7676 for ($scursor = 0; $scursor < $len; $scursor++) {
7677 $ordchar = ord($s[$scursor]);
7679 if ($ordchar < 32 && $ordchar != 13 && $ordchar != 10) {
7682 } elseif ($ordchar > 126 && $ordchar < 160) {
7686 $out .= $s[$scursor];
7708 $arraystring = explode(
"\n", $s);
7709 $nb = count($arraystring);
7726 $repTable = array(
"\t" =>
" ",
"\n" =>
"<br>",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
7728 $repTable = array(
"\t" =>
" ",
"\n" =>
" ",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
7731 $text = strtr($text, $repTable);
7732 if ($charset ==
'UTF-8') {
7733 $pattern =
'/(<br[^>]*>)/Uu';
7736 $pattern =
'/(<br[^>]*>)/U';
7738 $a = preg_split($pattern, $text, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
7740 $nblines = (int) floor((count($a) + 1) / 2);
7743 foreach ($a as $line) {
7746 $line_dec = html_entity_decode($line);
7748 $line_dec = wordwrap($line_dec, $maxlinesize,
'\n',
true);
7749 $nblines += substr_count($line_dec,
'\n');
7769 if (is_null($msg)) {
7774 if (preg_match(
'/<html/i', $msg)) {
7776 } elseif (preg_match(
'/<body/i', $msg)) {
7778 } elseif (preg_match(
'/<\/textarea/i', $msg)) {
7780 } elseif (preg_match(
'/<(b|em|i|u)(\s+[^>]+)?>/i', $msg)) {
7782 } elseif (preg_match(
'/<br/i', $msg)) {
7788 $msg = preg_replace(
'/https?:\/\/[^"\'\s]+/i',
'', $msg);
7789 if (preg_match(
'/<html/i', $msg)) {
7791 } elseif (preg_match(
'/<body/i', $msg)) {
7793 } elseif (preg_match(
'/<\/textarea/i', $msg)) {
7795 } elseif (preg_match(
'/<(b|em|i|u)(\s+[^>]+)?>/i', $msg)) {
7797 } elseif (preg_match(
'/<(br|hr)\/>/i', $msg)) {
7799 } elseif (preg_match(
'/<(br|hr|div|font|li|p|span|strong|table)>/i', $msg)) {
7801 } elseif (preg_match(
'/<(br|hr|div|font|li|p|span|strong|table)\s+[^<>\/]*\/?>/i', $msg)) {
7803 } elseif (preg_match(
'/<img\s+[^<>]*src[^<>]*>/i', $msg)) {
7805 } elseif (preg_match(
'/<a\s+[^<>]*href[^<>]*>/i', $msg)) {
7807 } elseif (preg_match(
'/<h[0-9]>/i', $msg)) {
7809 } elseif (preg_match(
'/&[A-Z0-9]{1,6};/i', $msg)) {
7812 } elseif (preg_match(
'/&#[0-9]{2,3};/i', $msg)) {
7836 if (!empty($invert)) {
7844 $ret .= (!empty($text1) && !empty($text2)) ? ((
dol_textishtml($text1) ||
dol_textishtml($text2)) ? ($forxml ?
"<br >\n" :
"<br>\n") :
"\n") :
"";
7864 global $db, $conf, $mysoc, $user, $extrafields;
7866 $substitutionarray = array();
7868 if ((empty($exclude) || !in_array(
'user', $exclude)) && (empty($include) || in_array(
'user', $include))) {
7872 $emailsendersignature = $user->signature;
7873 $usersignature = $user->signature;
7874 $substitutionarray = array_merge($substitutionarray, array(
7875 '__SENDEREMAIL_SIGNATURE__' => (
string) ((empty($conf->global->MAIN_MAIL_DO_NOT_USE_SIGN)) ? ($onlykey == 2 ?
dol_trunc(
'SignatureFromTheSelectedSenderProfile', 30) : $emailsendersignature) :
''),
7876 '__USER_SIGNATURE__' => (
string) (($usersignature && empty($conf->global->MAIN_MAIL_DO_NOT_USE_SIGN)) ? ($onlykey == 2 ?
dol_trunc(
dol_string_nohtmltag($usersignature), 30) : $usersignature) :
'')
7879 if (is_object($user)) {
7880 $substitutionarray = array_merge($substitutionarray, array(
7881 '__USER_ID__' => (
string) $user->id,
7882 '__USER_LOGIN__' => (
string) $user->login,
7883 '__USER_EMAIL__' => (
string) $user->email,
7884 '__USER_PHONE__' => (
string)
dol_print_phone($user->office_phone,
'', 0, 0,
'',
" ",
'',
'', -1),
7885 '__USER_PHONEPRO__' => (
string)
dol_print_phone($user->user_mobile,
'', 0, 0,
'',
" ",
'',
'', -1),
7886 '__USER_PHONEMOBILE__' => (
string)
dol_print_phone($user->personal_mobile,
'', 0, 0,
'',
" ",
'',
'', -1),
7887 '__USER_FAX__' => (
string) $user->office_fax,
7888 '__USER_LASTNAME__' => (
string) $user->lastname,
7889 '__USER_FIRSTNAME__' => (
string) $user->firstname,
7890 '__USER_FULLNAME__' => (
string) $user->getFullName($outputlangs),
7891 '__USER_SUPERVISOR_ID__' => (
string) ($user->fk_user ? $user->fk_user :
'0'),
7892 '__USER_JOB__' => (
string) $user->job,
7894 '__USER_VCARD_URL__' => (string) $user->getOnlineVirtualCardUrl(
'',
'external')
7898 if ((empty($exclude) || !in_array(
'mycompany', $exclude)) && is_object($mysoc) && (empty($include) || in_array(
'mycompany', $include))) {
7899 $substitutionarray = array_merge($substitutionarray, array(
7900 '__MYCOMPANY_NAME__' => $mysoc->name,
7901 '__MYCOMPANY_EMAIL__' => $mysoc->email,
7902 '__MYCOMPANY_PHONE__' =>
dol_print_phone($mysoc->phone,
'', 0, 0,
'',
" ",
'',
'', -1),
7903 '__MYCOMPANY_FAX__' =>
dol_print_phone($mysoc->fax,
'', 0, 0,
'',
" ",
'',
'', -1),
7904 '__MYCOMPANY_PROFID1__' => $mysoc->idprof1,
7905 '__MYCOMPANY_PROFID2__' => $mysoc->idprof2,
7906 '__MYCOMPANY_PROFID3__' => $mysoc->idprof3,
7907 '__MYCOMPANY_PROFID4__' => $mysoc->idprof4,
7908 '__MYCOMPANY_PROFID5__' => $mysoc->idprof5,
7909 '__MYCOMPANY_PROFID6__' => $mysoc->idprof6,
7910 '__MYCOMPANY_CAPITAL__' => $mysoc->capital,
7911 '__MYCOMPANY_FULLADDRESS__' => (method_exists($mysoc,
'getFullAddress') ? $mysoc->getFullAddress(1,
', ') :
''),
7912 '__MYCOMPANY_ADDRESS__' => $mysoc->address,
7913 '__MYCOMPANY_ZIP__' => $mysoc->zip,
7914 '__MYCOMPANY_TOWN__' => $mysoc->town,
7915 '__MYCOMPANY_COUNTRY__' => $mysoc->country,
7916 '__MYCOMPANY_COUNTRY_ID__' => $mysoc->country_id,
7917 '__MYCOMPANY_COUNTRY_CODE__' => $mysoc->country_code,
7918 '__MYCOMPANY_CURRENCY_CODE__' => $conf->currency
7922 if (($onlykey || is_object($object)) && (empty($exclude) || !in_array(
'object', $exclude)) && (empty($include) || in_array(
'object', $include))) {
7924 $substitutionarray[
'__ID__'] =
'__ID__';
7925 $substitutionarray[
'__REF__'] =
'__REF__';
7926 $substitutionarray[
'__NEWREF__'] =
'__NEWREF__';
7927 $substitutionarray[
'__LABEL__'] =
'__LABEL__';
7928 $substitutionarray[
'__REF_CLIENT__'] =
'__REF_CLIENT__';
7929 $substitutionarray[
'__REF_SUPPLIER__'] =
'__REF_SUPPLIER__';
7930 $substitutionarray[
'__NOTE_PUBLIC__'] =
'__NOTE_PUBLIC__';
7931 $substitutionarray[
'__NOTE_PRIVATE__'] =
'__NOTE_PRIVATE__';
7932 $substitutionarray[
'__EXTRAFIELD_XXX__'] =
'__EXTRAFIELD_XXX__';
7934 if (isModEnabled(
"societe")) {
7935 $substitutionarray[
'__THIRDPARTY_ID__'] =
'__THIRDPARTY_ID__';
7936 $substitutionarray[
'__THIRDPARTY_NAME__'] =
'__THIRDPARTY_NAME__';
7937 $substitutionarray[
'__THIRDPARTY_NAME_ALIAS__'] =
'__THIRDPARTY_NAME_ALIAS__';
7938 $substitutionarray[
'__THIRDPARTY_CODE_CLIENT__'] =
'__THIRDPARTY_CODE_CLIENT__';
7939 $substitutionarray[
'__THIRDPARTY_CODE_FOURNISSEUR__'] =
'__THIRDPARTY_CODE_FOURNISSEUR__';
7940 $substitutionarray[
'__THIRDPARTY_EMAIL__'] =
'__THIRDPARTY_EMAIL__';
7941 $substitutionarray[
'__THIRDPARTY_PHONE__'] =
'__THIRDPARTY_PHONE__';
7942 $substitutionarray[
'__THIRDPARTY_FAX__'] =
'__THIRDPARTY_FAX__';
7943 $substitutionarray[
'__THIRDPARTY_ADDRESS__'] =
'__THIRDPARTY_ADDRESS__';
7944 $substitutionarray[
'__THIRDPARTY_ZIP__'] =
'__THIRDPARTY_ZIP__';
7945 $substitutionarray[
'__THIRDPARTY_TOWN__'] =
'__THIRDPARTY_TOWN__';
7946 $substitutionarray[
'__THIRDPARTY_IDPROF1__'] =
'__THIRDPARTY_IDPROF1__';
7947 $substitutionarray[
'__THIRDPARTY_IDPROF2__'] =
'__THIRDPARTY_IDPROF2__';
7948 $substitutionarray[
'__THIRDPARTY_IDPROF3__'] =
'__THIRDPARTY_IDPROF3__';
7949 $substitutionarray[
'__THIRDPARTY_IDPROF4__'] =
'__THIRDPARTY_IDPROF4__';
7950 $substitutionarray[
'__THIRDPARTY_IDPROF5__'] =
'__THIRDPARTY_IDPROF5__';
7951 $substitutionarray[
'__THIRDPARTY_IDPROF6__'] =
'__THIRDPARTY_IDPROF6__';
7952 $substitutionarray[
'__THIRDPARTY_TVAINTRA__'] =
'__THIRDPARTY_TVAINTRA__';
7953 $substitutionarray[
'__THIRDPARTY_NOTE_PUBLIC__'] =
'__THIRDPARTY_NOTE_PUBLIC__';
7954 $substitutionarray[
'__THIRDPARTY_NOTE_PRIVATE__'] =
'__THIRDPARTY_NOTE_PRIVATE__';
7956 if (isModEnabled(
'adherent') && (!is_object($object) || $object->element ==
'adherent') && (empty($exclude) || !in_array(
'member', $exclude)) && (empty($include) || in_array(
'member', $include))) {
7957 $substitutionarray[
'__MEMBER_ID__'] =
'__MEMBER_ID__';
7958 $substitutionarray[
'__MEMBER_CIVILITY__'] =
'__MEMBER_CIVILITY__';
7959 $substitutionarray[
'__MEMBER_FIRSTNAME__'] =
'__MEMBER_FIRSTNAME__';
7960 $substitutionarray[
'__MEMBER_LASTNAME__'] =
'__MEMBER_LASTNAME__';
7961 $substitutionarray[
'__MEMBER_USER_LOGIN_INFORMATION__'] =
'Login and pass of the external user account';
7966 if (isModEnabled(
'ticket') && (!is_object($object) || $object->element ==
'ticket') && (empty($exclude) || !in_array(
'ticket', $exclude)) && (empty($include) || in_array(
'ticket', $include))) {
7967 $substitutionarray[
'__TICKET_TRACKID__'] =
'__TICKET_TRACKID__';
7968 $substitutionarray[
'__TICKET_SUBJECT__'] =
'__TICKET_SUBJECT__';
7969 $substitutionarray[
'__TICKET_TYPE__'] =
'__TICKET_TYPE__';
7970 $substitutionarray[
'__TICKET_SEVERITY__'] =
'__TICKET_SEVERITY__';
7971 $substitutionarray[
'__TICKET_CATEGORY__'] =
'__TICKET_CATEGORY__';
7972 $substitutionarray[
'__TICKET_ANALYTIC_CODE__'] =
'__TICKET_ANALYTIC_CODE__';
7973 $substitutionarray[
'__TICKET_MESSAGE__'] =
'__TICKET_MESSAGE__';
7974 $substitutionarray[
'__TICKET_PROGRESSION__'] =
'__TICKET_PROGRESSION__';
7975 $substitutionarray[
'__TICKET_USER_ASSIGN__'] =
'__TICKET_USER_ASSIGN__';
7978 if (isModEnabled(
'recruitment') && (!is_object($object) || $object->element ==
'recruitmentcandidature') && (empty($exclude) || !in_array(
'recruitment', $exclude)) && (empty($include) || in_array(
'recruitment', $include))) {
7979 $substitutionarray[
'__CANDIDATE_FULLNAME__'] =
'__CANDIDATE_FULLNAME__';
7980 $substitutionarray[
'__CANDIDATE_FIRSTNAME__'] =
'__CANDIDATE_FIRSTNAME__';
7981 $substitutionarray[
'__CANDIDATE_LASTNAME__'] =
'__CANDIDATE_LASTNAME__';
7983 if (isModEnabled(
'project') && (empty($exclude) || !in_array(
'project', $exclude)) && (empty($include) || in_array(
'project', $include))) {
7984 $substitutionarray[
'__PROJECT_ID__'] =
'__PROJECT_ID__';
7985 $substitutionarray[
'__PROJECT_REF__'] =
'__PROJECT_REF__';
7986 $substitutionarray[
'__PROJECT_NAME__'] =
'__PROJECT_NAME__';
7990 if (isModEnabled(
'contrat') && (!is_object($object) || $object->element ==
'contract') && (empty($exclude) || !in_array(
'contract', $exclude)) && (empty($include) || in_array(
'contract', $include))) {
7991 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATE__'] =
'Highest date planned for a service start';
7992 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATETIME__'] =
'Highest date and hour planned for service start';
7993 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATE__'] =
'Lowest data for planned expiration of service';
7994 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATETIME__'] =
'Lowest date and hour for planned expiration of service';
7996 if (isModEnabled(
"propal") && (!is_object($object) || $object->element ==
'propal') && (empty($exclude) || !in_array(
'propal', $exclude)) && (empty($include) || in_array(
'propal', $include))) {
7997 $substitutionarray[
'__ONLINE_SIGN_URL__'] =
'ToOfferALinkForOnlineSignature';
7999 if (isModEnabled(
"ficheinter") && (!is_object($object) || $object->element ==
'fichinter') && (empty($exclude) || !in_array(
'intervention', $exclude)) && (empty($include) || in_array(
'intervention', $include))) {
8000 $substitutionarray[
'__ONLINE_SIGN_FICHINTER_URL__'] =
'ToOfferALinkForOnlineSignature';
8002 $substitutionarray[
'__ONLINE_PAYMENT_URL__'] =
'UrlToPayOnlineIfApplicable';
8003 $substitutionarray[
'__ONLINE_PAYMENT_TEXT_AND_URL__'] =
'TextAndUrlToPayOnlineIfApplicable';
8004 $substitutionarray[
'__SECUREKEYPAYMENT__'] =
'Security key (if key is not unique per record)';
8005 $substitutionarray[
'__SECUREKEYPAYMENT_MEMBER__'] =
'Security key for payment on a member subscription (one key per member)';
8006 $substitutionarray[
'__SECUREKEYPAYMENT_ORDER__'] =
'Security key for payment on an order';
8007 $substitutionarray[
'__SECUREKEYPAYMENT_INVOICE__'] =
'Security key for payment on an invoice';
8008 $substitutionarray[
'__SECUREKEYPAYMENT_CONTRACTLINE__'] =
'Security key for payment on a service of a contract';
8010 $substitutionarray[
'__DIRECTDOWNLOAD_URL_PROPOSAL__'] =
'Direct download url of a proposal';
8011 $substitutionarray[
'__DIRECTDOWNLOAD_URL_ORDER__'] =
'Direct download url of an order';
8012 $substitutionarray[
'__DIRECTDOWNLOAD_URL_INVOICE__'] =
'Direct download url of an invoice';
8013 $substitutionarray[
'__DIRECTDOWNLOAD_URL_CONTRACT__'] =
'Direct download url of a contract';
8014 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_PROPOSAL__'] =
'Direct download url of a supplier proposal';
8016 if (isModEnabled(
"expedition") && (!is_object($object) || $object->element ==
'shipping')) {
8017 $substitutionarray[
'__SHIPPINGTRACKNUM__'] =
'Shipping tracking number';
8018 $substitutionarray[
'__SHIPPINGTRACKNUMURL__'] =
'Shipping tracking url';
8020 if (isModEnabled(
"reception") && (!is_object($object) || $object->element ==
'reception')) {
8021 $substitutionarray[
'__RECEPTIONTRACKNUM__'] =
'Shippin tracking number of shipment';
8022 $substitutionarray[
'__RECEPTIONTRACKNUMURL__'] =
'Shipping tracking url';
8025 $substitutionarray[
'__ID__'] = $object->id;
8026 $substitutionarray[
'__REF__'] = $object->ref;
8027 $substitutionarray[
'__NEWREF__'] = $object->newref;
8028 $substitutionarray[
'__LABEL__'] = (isset($object->label) ? $object->label : (isset($object->title) ? $object->title :
null));
8029 $substitutionarray[
'__REF_CLIENT__'] = (isset($object->ref_client) ? $object->ref_client : (isset($object->ref_customer) ? $object->ref_customer :
null));
8030 $substitutionarray[
'__REF_SUPPLIER__'] = (isset($object->ref_supplier) ? $object->ref_supplier :
null);
8031 $substitutionarray[
'__NOTE_PUBLIC__'] = (isset($object->note_public) ? $object->note_public :
null);
8032 $substitutionarray[
'__NOTE_PRIVATE__'] = (isset($object->note_private) ? $object->note_private :
null);
8033 if ($object->element ==
"shipping") {
8034 $substitutionarray[
'__DATE_DELIVERY__'] = (isset($object->date_delivery) ?
dol_print_date($object->date_delivery,
'day', 0, $outputlangs) :
'');
8036 $substitutionarray[
'__DATE_DELIVERY__'] = (isset($object->date_livraison) ?
dol_print_date($object->date_livraison,
'day', 0, $outputlangs) :
'');
8038 $substitutionarray[
'__DATE_DELIVERY_DAY__'] = (isset($object->date_livraison) ?
dol_print_date($object->date_livraison,
"%d") :
'');
8039 $substitutionarray[
'__DATE_DELIVERY_DAY_TEXT__'] = (isset($object->date_livraison) ?
dol_print_date($object->date_livraison,
"%A") :
'');
8040 $substitutionarray[
'__DATE_DELIVERY_MON__'] = (isset($object->date_livraison) ?
dol_print_date($object->date_livraison,
"%m") :
'');
8041 $substitutionarray[
'__DATE_DELIVERY_MON_TEXT__'] = (isset($object->date_livraison) ?
dol_print_date($object->date_livraison,
"%b") :
'');
8042 $substitutionarray[
'__DATE_DELIVERY_YEAR__'] = (isset($object->date_livraison) ?
dol_print_date($object->date_livraison,
"%Y") :
'');
8043 $substitutionarray[
'__DATE_DELIVERY_HH__'] = (isset($object->date_livraison) ?
dol_print_date($object->date_livraison,
"%H") :
'');
8044 $substitutionarray[
'__DATE_DELIVERY_MM__'] = (isset($object->date_livraison) ?
dol_print_date($object->date_livraison,
"%M") :
'');
8045 $substitutionarray[
'__DATE_DELIVERY_SS__'] = (isset($object->date_livraison) ?
dol_print_date($object->date_livraison,
"%S") :
'');
8048 $substitutionarray[
'__REFCLIENT__'] = (isset($object->ref_client) ? $object->ref_client : (isset($object->ref_customer) ? $object->ref_customer :
null));
8049 $substitutionarray[
'__REFSUPPLIER__'] = (isset($object->ref_supplier) ? $object->ref_supplier :
null);
8050 $substitutionarray[
'__SUPPLIER_ORDER_DATE_DELIVERY__'] = (isset($object->date_livraison) ?
dol_print_date($object->date_livraison,
'day', 0, $outputlangs) :
'');
8051 $substitutionarray[
'__SUPPLIER_ORDER_DELAY_DELIVERY__'] = (isset($object->availability_code) ? ($outputlangs->transnoentities(
"AvailabilityType".$object->availability_code) != (
'AvailabilityType'.$object->availability_code) ? $outputlangs->transnoentities(
"AvailabilityType".$object->availability_code) : $outputlangs->convToOutputCharset(isset($object->availability) ? $object->availability :
'')) :
'');
8053 if (is_object($object) && ($object->element ==
'adherent' || $object->element ==
'member') && $object->id > 0) {
8054 $birthday = (empty($object->birth) ?
'' :
dol_print_date($object->birth,
'day'));
8056 $substitutionarray[
'__MEMBER_ID__'] = (isset($object->id) ? $object->id :
'');
8057 if (method_exists($object,
'getCivilityLabel')) {
8058 $substitutionarray[
'__MEMBER_CIVILITY__'] = $object->getCivilityLabel();
8060 $substitutionarray[
'__MEMBER_FIRSTNAME__'] = (isset($object->firstname) ? $object->firstname :
'');
8061 $substitutionarray[
'__MEMBER_LASTNAME__'] = (isset($object->lastname) ? $object->lastname :
'');
8062 $substitutionarray[
'__MEMBER_USER_LOGIN_INFORMATION__'] =
'';
8063 if (method_exists($object,
'getFullName')) {
8064 $substitutionarray[
'__MEMBER_FULLNAME__'] = $object->getFullName($outputlangs);
8066 $substitutionarray[
'__MEMBER_COMPANY__'] = (isset($object->societe) ? $object->societe :
'');
8067 $substitutionarray[
'__MEMBER_ADDRESS__'] = (isset($object->address) ? $object->address :
'');
8068 $substitutionarray[
'__MEMBER_ZIP__'] = (isset($object->zip) ? $object->zip :
'');
8069 $substitutionarray[
'__MEMBER_TOWN__'] = (isset($object->town) ? $object->town :
'');
8070 $substitutionarray[
'__MEMBER_COUNTRY__'] = (isset($object->country) ? $object->country :
'');
8071 $substitutionarray[
'__MEMBER_EMAIL__'] = (isset($object->email) ? $object->email :
'');
8072 $substitutionarray[
'__MEMBER_BIRTH__'] = (isset($birthday) ? $birthday :
'');
8073 $substitutionarray[
'__MEMBER_PHOTO__'] = (isset($object->photo) ? $object->photo :
'');
8074 $substitutionarray[
'__MEMBER_LOGIN__'] = (isset($object->login) ? $object->login :
'');
8075 $substitutionarray[
'__MEMBER_PASSWORD__'] = (isset($object->pass) ? $object->pass :
'');
8076 $substitutionarray[
'__MEMBER_PHONE__'] = (isset($object->phone) ?
dol_print_phone($object->phone) :
'');
8077 $substitutionarray[
'__MEMBER_PHONEPRO__'] = (isset($object->phone_perso) ?
dol_print_phone($object->phone_perso) :
'');
8078 $substitutionarray[
'__MEMBER_PHONEMOBILE__'] = (isset($object->phone_mobile) ?
dol_print_phone($object->phone_mobile) :
'');
8079 $substitutionarray[
'__MEMBER_TYPE__'] = (isset($object->type) ? $object->type :
'');
8080 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE__'] =
dol_print_date($object->first_subscription_date,
'day');
8081 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_START__'] = (isset($object->first_subscription_date_start) ?
dol_print_date($object->first_subscription_date_start,
'day') :
'');
8082 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_END__'] = (isset($object->first_subscription_date_end) ?
dol_print_date($object->first_subscription_date_end,
'day') :
'');
8083 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE__'] =
dol_print_date($object->last_subscription_date,
'day');
8084 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_START__'] =
dol_print_date($object->last_subscription_date_start,
'day');
8085 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_END__'] =
dol_print_date($object->last_subscription_date_end,
'day');
8088 if (is_object($object) && $object->element ==
'societe') {
8089 $substitutionarray[
'__THIRDPARTY_ID__'] = (is_object($object) ? $object->id :
'');
8090 $substitutionarray[
'__THIRDPARTY_NAME__'] = (is_object($object) ? $object->name :
'');
8091 $substitutionarray[
'__THIRDPARTY_NAME_ALIAS__'] = (is_object($object) ? $object->name_alias :
'');
8092 $substitutionarray[
'__THIRDPARTY_CODE_CLIENT__'] = (is_object($object) ? $object->code_client :
'');
8093 $substitutionarray[
'__THIRDPARTY_CODE_FOURNISSEUR__'] = (is_object($object) ? $object->code_fournisseur :
'');
8094 $substitutionarray[
'__THIRDPARTY_EMAIL__'] = (is_object($object) ? $object->email :
'');
8095 $substitutionarray[
'__THIRDPARTY_PHONE__'] = (is_object($object) ?
dol_print_phone($object->phone) :
'');
8096 $substitutionarray[
'__THIRDPARTY_FAX__'] = (is_object($object) ?
dol_print_phone($object->fax) :
'');
8097 $substitutionarray[
'__THIRDPARTY_ADDRESS__'] = (is_object($object) ? $object->address :
'');
8098 $substitutionarray[
'__THIRDPARTY_ZIP__'] = (is_object($object) ? $object->zip :
'');
8099 $substitutionarray[
'__THIRDPARTY_TOWN__'] = (is_object($object) ? $object->town :
'');
8100 $substitutionarray[
'__THIRDPARTY_COUNTRY_ID__'] = (is_object($object) ? $object->country_id :
'');
8101 $substitutionarray[
'__THIRDPARTY_COUNTRY_CODE__'] = (is_object($object) ? $object->country_code :
'');
8102 $substitutionarray[
'__THIRDPARTY_IDPROF1__'] = (is_object($object) ? $object->idprof1 :
'');
8103 $substitutionarray[
'__THIRDPARTY_IDPROF2__'] = (is_object($object) ? $object->idprof2 :
'');
8104 $substitutionarray[
'__THIRDPARTY_IDPROF3__'] = (is_object($object) ? $object->idprof3 :
'');
8105 $substitutionarray[
'__THIRDPARTY_IDPROF4__'] = (is_object($object) ? $object->idprof4 :
'');
8106 $substitutionarray[
'__THIRDPARTY_IDPROF5__'] = (is_object($object) ? $object->idprof5 :
'');
8107 $substitutionarray[
'__THIRDPARTY_IDPROF6__'] = (is_object($object) ? $object->idprof6 :
'');
8108 $substitutionarray[
'__THIRDPARTY_TVAINTRA__'] = (is_object($object) ? $object->tva_intra :
'');
8109 $substitutionarray[
'__THIRDPARTY_NOTE_PUBLIC__'] = (is_object($object) ?
dol_htmlentitiesbr($object->note_public) :
'');
8110 $substitutionarray[
'__THIRDPARTY_NOTE_PRIVATE__'] = (is_object($object) ?
dol_htmlentitiesbr($object->note_private) :
'');
8111 } elseif (is_object($object->thirdparty)) {
8112 $substitutionarray[
'__THIRDPARTY_ID__'] = (is_object($object->thirdparty) ? $object->thirdparty->id :
'');
8113 $substitutionarray[
'__THIRDPARTY_NAME__'] = (is_object($object->thirdparty) ? $object->thirdparty->name :
'');
8114 $substitutionarray[
'__THIRDPARTY_NAME_ALIAS__'] = (is_object($object->thirdparty) ? $object->thirdparty->name_alias :
'');
8115 $substitutionarray[
'__THIRDPARTY_CODE_CLIENT__'] = (is_object($object->thirdparty) ? $object->thirdparty->code_client :
'');
8116 $substitutionarray[
'__THIRDPARTY_CODE_FOURNISSEUR__'] = (is_object($object->thirdparty) ? $object->thirdparty->code_fournisseur :
'');
8117 $substitutionarray[
'__THIRDPARTY_EMAIL__'] = (is_object($object->thirdparty) ? $object->thirdparty->email :
'');
8118 $substitutionarray[
'__THIRDPARTY_PHONE__'] = (is_object($object->thirdparty) ?
dol_print_phone($object->thirdparty->phone) :
'');
8119 $substitutionarray[
'__THIRDPARTY_FAX__'] = (is_object($object->thirdparty) ?
dol_print_phone($object->thirdparty->fax) :
'');
8120 $substitutionarray[
'__THIRDPARTY_ADDRESS__'] = (is_object($object->thirdparty) ? $object->thirdparty->address :
'');
8121 $substitutionarray[
'__THIRDPARTY_ZIP__'] = (is_object($object->thirdparty) ? $object->thirdparty->zip :
'');
8122 $substitutionarray[
'__THIRDPARTY_TOWN__'] = (is_object($object->thirdparty) ? $object->thirdparty->town :
'');
8123 $substitutionarray[
'__THIRDPARTY_COUNTRY_ID__'] = (is_object($object->thirdparty) ? $object->thirdparty->country_id :
'');
8124 $substitutionarray[
'__THIRDPARTY_COUNTRY_CODE__'] = (is_object($object->thirdparty) ? $object->thirdparty->country_code :
'');
8125 $substitutionarray[
'__THIRDPARTY_IDPROF1__'] = (is_object($object->thirdparty) ? $object->thirdparty->idprof1 :
'');
8126 $substitutionarray[
'__THIRDPARTY_IDPROF2__'] = (is_object($object->thirdparty) ? $object->thirdparty->idprof2 :
'');
8127 $substitutionarray[
'__THIRDPARTY_IDPROF3__'] = (is_object($object->thirdparty) ? $object->thirdparty->idprof3 :
'');
8128 $substitutionarray[
'__THIRDPARTY_IDPROF4__'] = (is_object($object->thirdparty) ? $object->thirdparty->idprof4 :
'');
8129 $substitutionarray[
'__THIRDPARTY_IDPROF5__'] = (is_object($object->thirdparty) ? $object->thirdparty->idprof5 :
'');
8130 $substitutionarray[
'__THIRDPARTY_IDPROF6__'] = (is_object($object->thirdparty) ? $object->thirdparty->idprof6 :
'');
8131 $substitutionarray[
'__THIRDPARTY_TVAINTRA__'] = (is_object($object->thirdparty) ? $object->thirdparty->tva_intra :
'');
8132 $substitutionarray[
'__THIRDPARTY_NOTE_PUBLIC__'] = (is_object($object->thirdparty) ?
dol_htmlentitiesbr($object->thirdparty->note_public) :
'');
8133 $substitutionarray[
'__THIRDPARTY_NOTE_PRIVATE__'] = (is_object($object->thirdparty) ?
dol_htmlentitiesbr($object->thirdparty->note_private) :
'');
8136 if (is_object($object) && $object->element ==
'recruitmentcandidature') {
8137 $substitutionarray[
'__CANDIDATE_FULLNAME__'] = $object->getFullName($outputlangs);
8138 $substitutionarray[
'__CANDIDATE_FIRSTNAME__'] = isset($object->firstname) ? $object->firstname :
'';
8139 $substitutionarray[
'__CANDIDATE_LASTNAME__'] = isset($object->lastname) ? $object->lastname :
'';
8141 if (is_object($object) && $object->element ==
'conferenceorboothattendee') {
8142 $substitutionarray[
'__ATTENDEE_FULLNAME__'] = $object->getFullName($outputlangs);
8143 $substitutionarray[
'__ATTENDEE_FIRSTNAME__'] = isset($object->firstname) ? $object->firstname :
'';
8144 $substitutionarray[
'__ATTENDEE_LASTNAME__'] = isset($object->lastname) ? $object->lastname :
'';
8148 if (is_object($object->project)) {
8149 $project = $object->project;
8150 } elseif (is_object($object->projet)) {
8151 $project = $object->projet;
8154 $substitutionarray[
'__PROJECT_ID__'] = $project->id;
8155 $substitutionarray[
'__PROJECT_REF__'] = $project->ref;
8156 $substitutionarray[
'__PROJECT_NAME__'] = $project->title;
8158 if (is_object($object) && $object->element ==
'project') {
8159 $substitutionarray[
'__PROJECT_NAME__'] = $object->title;
8162 if (is_object($object) && $object->element ==
'shipping') {
8163 $substitutionarray[
'__SHIPPINGTRACKNUM__'] = $object->tracking_number;
8164 $substitutionarray[
'__SHIPPINGTRACKNUMURL__'] = $object->tracking_url;
8166 if (is_object($object) && $object->element ==
'reception') {
8167 $substitutionarray[
'__RECEPTIONTRACKNUM__'] = $object->tracking_number;
8168 $substitutionarray[
'__RECEPTIONTRACKNUMURL__'] = $object->tracking_url;
8171 if (is_object($object) && $object->element ==
'contrat' && $object->id > 0 && is_array($object->lines)) {
8172 $dateplannedstart =
'';
8173 $datenextexpiration =
'';
8174 foreach ($object->lines as $line) {
8175 if ($line->date_start > $dateplannedstart) {
8176 $dateplannedstart = $line->date_start;
8178 if ($line->statut == 4 && $line->date_end && (!$datenextexpiration || $line->date_end < $datenextexpiration)) {
8179 $datenextexpiration = $line->date_end;
8182 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATE__'] =
dol_print_date($dateplannedstart,
'day');
8183 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATETIME__'] =
dol_print_date($dateplannedstart,
'standard');
8184 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATE__'] =
dol_print_date($datenextexpiration,
'day');
8185 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATETIME__'] =
dol_print_date($datenextexpiration,
'standard');
8188 if (is_object($object) && $object->element ==
'ticket') {
8189 $substitutionarray[
'__TICKET_TRACKID__'] = $object->track_id;
8190 $substitutionarray[
'__REF__'] = $object->ref;
8191 $substitutionarray[
'__TICKET_SUBJECT__'] = $object->subject;
8192 $substitutionarray[
'__TICKET_TYPE__'] = $object->type_code;
8193 $substitutionarray[
'__TICKET_SEVERITY__'] = $object->severity_code;
8194 $substitutionarray[
'__TICKET_CATEGORY__'] = $object->category_code;
8195 $substitutionarray[
'__TICKET_ANALYTIC_CODE__'] = $object->category_code;
8196 $substitutionarray[
'__TICKET_MESSAGE__'] = $object->message;
8197 $substitutionarray[
'__TICKET_PROGRESSION__'] = $object->progress;
8198 $userstat =
new User($db);
8199 if ($object->fk_user_assign > 0) {
8200 $userstat->fetch($object->fk_user_assign);
8201 $substitutionarray[
'__TICKET_USER_ASSIGN__'] =
dolGetFirstLastname($userstat->firstname, $userstat->lastname);
8204 if ($object->fk_user_create > 0) {
8205 $userstat->fetch($object->fk_user_create);
8206 $substitutionarray[
'__USER_CREATE__'] =
dolGetFirstLastname($userstat->firstname, $userstat->lastname);
8211 if ($object->table_element && $object->id > 0) {
8212 if (!is_object($extrafields)) {
8215 $extrafields->fetch_name_optionals_label($object->table_element,
true);
8217 if ($object->fetch_optionals() > 0) {
8218 if (is_array($extrafields->attributes[$object->table_element][
'label']) && count($extrafields->attributes[$object->table_element][
'label']) > 0) {
8219 foreach ($extrafields->attributes[$object->table_element][
'label'] as $key => $label) {
8220 if ($extrafields->attributes[$object->table_element][
'type'][$key] ==
'date') {
8221 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] =
dol_print_date($object->array_options[
'options_'.$key],
'day');
8222 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_LOCALE__'] =
dol_print_date($object->array_options[
'options_'.$key],
'day',
'tzserver', $outputlangs);
8223 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_RFC__'] =
dol_print_date($object->array_options[
'options_'.$key],
'dayrfc');
8224 } elseif ($extrafields->attributes[$object->table_element][
'type'][$key] ==
'datetime') {
8225 $datetime = $object->array_options[
'options_'.$key];
8226 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'dayhour') :
'');
8227 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_LOCALE__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'dayhour',
'tzserver', $outputlangs) :
'');
8228 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_DAY_LOCALE__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'day',
'tzserver', $outputlangs) :
'');
8229 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_RFC__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'dayhourrfc') :
'');
8230 } elseif ($extrafields->attributes[$object->table_element][
'type'][$key] ==
'phone') {
8231 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] =
dol_print_phone($object->array_options[
'options_'.$key]);
8232 } elseif ($extrafields->attributes[$object->table_element][
'type'][$key] ==
'price') {
8233 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] = $object->array_options[
'options_'.$key];
8234 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_FORMATED__'] =
price($object->array_options[
'options_'.$key]);
8235 } elseif ($extrafields->attributes[$object->table_element][
'type'][$key] !=
'separator') {
8236 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] = !empty($object->array_options[
'options_'.$key]) ? $object->array_options[
'options_'.$key] :
'';
8245 if (empty($substitutionarray[
'__REF__'])) {
8249 require_once DOL_DOCUMENT_ROOT.
'/core/lib/payments.lib.php';
8250 $outputlangs->loadLangs(array(
'paypal',
'other'));
8253 $typeforonlinepayment =
'free';
8254 if (is_object($object) && $object->element ==
'commande') {
8255 $typeforonlinepayment =
'order';
8257 if (is_object($object) && $object->element ==
'facture') {
8258 $typeforonlinepayment =
'invoice';
8260 if (is_object($object) && $object->element ==
'member') {
8261 $typeforonlinepayment =
'member';
8262 if (!empty($object->last_subscription_amount)) {
8263 $amounttouse = $object->last_subscription_amount;
8266 if (is_object($object) && $object->element ==
'contrat') {
8267 $typeforonlinepayment =
'contract';
8269 if (is_object($object) && $object->element ==
'fichinter') {
8270 $typeforonlinepayment =
'ficheinter';
8273 $url = getOnlinePaymentUrl(0, $typeforonlinepayment, $substitutionarray[
'__REF__'], $amounttouse);
8277 if ($object->id > 0) {
8278 $substitutionarray[
'__ONLINE_PAYMENT_TEXT_AND_URL__'] = ($paymenturl ?str_replace(
'\n',
"\n", $outputlangs->trans(
"PredefinedMailContentLink", $paymenturl)) :
'');
8279 $substitutionarray[
'__ONLINE_PAYMENT_URL__'] = $paymenturl;
8281 if (!empty($conf->global->PROPOSAL_ALLOW_EXTERNAL_DOWNLOAD) && is_object($object) && $object->element ==
'propal') {
8282 $substitutionarray[
'__DIRECTDOWNLOAD_URL_PROPOSAL__'] = $object->getLastMainDocLink($object->element);
8284 $substitutionarray[
'__DIRECTDOWNLOAD_URL_PROPOSAL__'] =
'';
8286 if (!empty($conf->global->ORDER_ALLOW_EXTERNAL_DOWNLOAD) && is_object($object) && $object->element ==
'commande') {
8287 $substitutionarray[
'__DIRECTDOWNLOAD_URL_ORDER__'] = $object->getLastMainDocLink($object->element);
8289 $substitutionarray[
'__DIRECTDOWNLOAD_URL_ORDER__'] =
'';
8291 if (!empty($conf->global->INVOICE_ALLOW_EXTERNAL_DOWNLOAD) && is_object($object) && $object->element ==
'facture') {
8292 $substitutionarray[
'__DIRECTDOWNLOAD_URL_INVOICE__'] = $object->getLastMainDocLink($object->element);
8294 $substitutionarray[
'__DIRECTDOWNLOAD_URL_INVOICE__'] =
'';
8296 if (!empty($conf->global->CONTRACT_ALLOW_EXTERNAL_DOWNLOAD) && is_object($object) && $object->element ==
'contrat') {
8297 $substitutionarray[
'__DIRECTDOWNLOAD_URL_CONTRACT__'] = $object->getLastMainDocLink($object->element);
8299 $substitutionarray[
'__DIRECTDOWNLOAD_URL_CONTRACT__'] =
'';
8301 if (!empty($conf->global->FICHINTER_ALLOW_EXTERNAL_DOWNLOAD) && is_object($object) && $object->element ==
'fichinter') {
8302 $substitutionarray[
'__DIRECTDOWNLOAD_URL_FICHINTER__'] = $object->getLastMainDocLink($object->element);
8304 $substitutionarray[
'__DIRECTDOWNLOAD_URL_FICHINTER__'] =
'';
8306 if (!empty($conf->global->SUPPLIER_PROPOSAL_ALLOW_EXTERNAL_DOWNLOAD) && is_object($object) && $object->element ==
'supplier_proposal') {
8307 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_PROPOSAL__'] = $object->getLastMainDocLink($object->element);
8309 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_PROPOSAL__'] =
'';
8312 if (is_object($object) && $object->element ==
'propal') {
8313 $substitutionarray[
'__URL_PROPOSAL__'] = DOL_MAIN_URL_ROOT.
"/comm/propal/card.php?id=".$object->id;
8314 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
8315 $substitutionarray[
'__ONLINE_SIGN_URL__'] = getOnlineSignatureUrl(0,
'proposal', $object->ref, 1, $object);
8317 if (is_object($object) && $object->element ==
'commande') {
8318 $substitutionarray[
'__URL_ORDER__'] = DOL_MAIN_URL_ROOT.
"/commande/card.php?id=".$object->id;
8320 if (is_object($object) && $object->element ==
'facture') {
8321 $substitutionarray[
'__URL_INVOICE__'] = DOL_MAIN_URL_ROOT.
"/compta/facture/card.php?id=".$object->id;
8323 if (is_object($object) && $object->element ==
'contrat') {
8324 $substitutionarray[
'__URL_CONTRACT__'] = DOL_MAIN_URL_ROOT.
"/contrat/card.php?id=".$object->id;
8325 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
8326 $substitutionarray[
'__ONLINE_SIGN_URL__'] = getOnlineSignatureUrl(0,
'contract', $object->ref, 1, $object);
8328 if (is_object($object) && $object->element ==
'fichinter') {
8329 $substitutionarray[
'__URL_FICHINTER__'] = DOL_MAIN_URL_ROOT.
"/fichinter/card.php?id=".$object->id;
8330 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
8331 $substitutionarray[
'__ONLINE_SIGN_FICHINTER_URL__'] = getOnlineSignatureUrl(0,
'fichinter', $object->ref, 1, $object);
8333 if (is_object($object) && $object->element ==
'supplier_proposal') {
8334 $substitutionarray[
'__URL_SUPPLIER_PROPOSAL__'] = DOL_MAIN_URL_ROOT.
"/supplier_proposal/card.php?id=".$object->id;
8336 if (is_object($object) && $object->element ==
'shipping') {
8337 $substitutionarray[
'__URL_SHIPMENT__'] = DOL_MAIN_URL_ROOT.
"/expedition/card.php?id=".$object->id;
8341 if (is_object($object) && $object->element ==
'action') {
8342 $substitutionarray[
'__EVENT_LABEL__'] = $object->label;
8343 $substitutionarray[
'__EVENT_DATE__'] =
dol_print_date($object->datep,
'%A %d %b %Y');
8344 $substitutionarray[
'__EVENT_TIME__'] =
dol_print_date($object->datep,
'%H:%M:%S');
8348 if ((empty($exclude) || !in_array(
'objectamount', $exclude)) && (empty($include) || in_array(
'objectamount', $include))) {
8349 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functionsnumtoword.lib.php';
8351 $substitutionarray[
'__DATE_YMD__'] = is_object($object) ? (isset($object->date) ?
dol_print_date($object->date,
'day', 0, $outputlangs) :
null) :
'';
8352 $substitutionarray[
'__DATE_DUE_YMD__'] = is_object($object) ? (isset($object->date_lim_reglement) ?
dol_print_date($object->date_lim_reglement,
'day', 0, $outputlangs) :
null) :
'';
8354 $already_payed_all = 0;
8355 if (is_object($object) && ($object instanceof
Facture)) {
8356 $already_payed_all = $object->sumpayed + $object->sumdeposit + $object->sumcreditnote;
8359 $substitutionarray[
'__AMOUNT_EXCL_TAX__'] = is_object($object) ? $object->total_ht :
'';
8361 $substitutionarray[
'__AMOUNT__'] = is_object($object) ? $object->total_ttc :
'';
8362 $substitutionarray[
'__AMOUNT_TEXT__'] = is_object($object) ?
dol_convertToWord($object->total_ttc, $outputlangs,
'',
true) :
'';
8363 $substitutionarray[
'__AMOUNT_TEXTCURRENCY__'] = is_object($object) ?
dol_convertToWord($object->total_ttc, $outputlangs, $conf->currency,
true) :
'';
8365 $substitutionarray[
'__AMOUNT_REMAIN__'] = is_object($object) ?
price2num($object->total_ttc - $already_payed_all,
'MT') :
'';
8367 $substitutionarray[
'__AMOUNT_VAT__'] = is_object($object) ? (isset($object->total_vat) ? $object->total_vat : $object->total_tva) :
'';
8368 $substitutionarray[
'__AMOUNT_VAT_TEXT__'] = is_object($object) ? (isset($object->total_vat) ?
dol_convertToWord($object->total_vat, $outputlangs,
'',
true) :
dol_convertToWord($object->total_tva, $outputlangs,
'',
true)) :
'';
8369 $substitutionarray[
'__AMOUNT_VAT_TEXTCURRENCY__'] = is_object($object) ? (isset($object->total_vat) ?
dol_convertToWord($object->total_vat, $outputlangs, $conf->currency,
true) :
dol_convertToWord($object->total_tva, $outputlangs, $conf->currency,
true)) :
'';
8371 if ($onlykey != 2 || $mysoc->useLocalTax(1)) {
8372 $substitutionarray[
'__AMOUNT_TAX2__'] = is_object($object) ? $object->total_localtax1 :
'';
8374 if ($onlykey != 2 || $mysoc->useLocalTax(2)) {
8375 $substitutionarray[
'__AMOUNT_TAX3__'] = is_object($object) ? $object->total_localtax2 :
'';
8379 $substitutionarray[
'__AMOUNT_EXCL_TAX_FORMATED__'] = is_object($object) ? ($object->total_ht ?
price($object->total_ht, 0, $outputlangs, 0, -1, -1, $conf->currency) :
null) :
'';
8380 $substitutionarray[
'__AMOUNT_FORMATED__'] = is_object($object) ? ($object->total_ttc ?
price($object->total_ttc, 0, $outputlangs, 0, -1, -1, $conf->currency) :
null) :
'';
8381 $substitutionarray[
'__AMOUNT_REMAIN_FORMATED__'] = is_object($object) ? ($object->total_ttc ?
price($object->total_ttc - $already_payed_all, 0, $outputlangs, 0, -1, -1, $conf->currency) :
null) :
'';
8382 $substitutionarray[
'__AMOUNT_VAT_FORMATED__'] = is_object($object) ? (isset($object->total_vat) ?
price($object->total_vat, 0, $outputlangs, 0, -1, -1, $conf->currency) : ($object->total_tva ?
price($object->total_tva, 0, $outputlangs, 0, -1, -1, $conf->currency) :
null)) :
'';
8383 if ($onlykey != 2 || $mysoc->useLocalTax(1)) {
8384 $substitutionarray[
'__AMOUNT_TAX2_FORMATED__'] = is_object($object) ? ($object->total_localtax1 ?
price($object->total_localtax1, 0, $outputlangs, 0, -1, -1, $conf->currency) :
null) :
'';
8386 if ($onlykey != 2 || $mysoc->useLocalTax(2)) {
8387 $substitutionarray[
'__AMOUNT_TAX3_FORMATED__'] = is_object($object) ? ($object->total_localtax2 ?
price($object->total_localtax2, 0, $outputlangs, 0, -1, -1, $conf->currency) :
null) :
'';
8390 $substitutionarray[
'__AMOUNT_MULTICURRENCY__'] = (is_object($object) && isset($object->multicurrency_total_ttc)) ? $object->multicurrency_total_ttc :
'';
8391 $substitutionarray[
'__AMOUNT_MULTICURRENCY_TEXT__'] = (is_object($object) && isset($object->multicurrency_total_ttc)) ?
dol_convertToWord($object->multicurrency_total_ttc, $outputlangs,
'',
true) :
'';
8392 $substitutionarray[
'__AMOUNT_MULTICURRENCY_TEXTCURRENCY__'] = (is_object($object) && isset($object->multicurrency_total_ttc)) ?
dol_convertToWord($object->multicurrency_total_ttc, $outputlangs, $object->multicurrency_code,
true) :
'';
8396 if ($onlykey != 2) {
8397 $substitutionarray[
'__TOTAL_TTC__'] = is_object($object) ? $object->total_ttc :
'';
8398 $substitutionarray[
'__TOTAL_HT__'] = is_object($object) ? $object->total_ht :
'';
8399 $substitutionarray[
'__TOTAL_VAT__'] = is_object($object) ? (isset($object->total_vat) ? $object->total_vat : $object->total_tva) :
'';
8404 if ((empty($exclude) || !in_array(
'date', $exclude)) && (empty($include) || in_array(
'date', $include))) {
8405 include_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
8415 $daytext = $outputlangs->trans(
'Day'.$tmp[
'wday']);
8417 $substitutionarray = array_merge($substitutionarray, array(
8418 '__NOW_TMS__' => (
int) $now,
8419 '__NOW_TMS_YMD__' =>
dol_print_date($now,
'day', 0, $outputlangs),
8420 '__DAY__' => (
string) $tmp[
'mday'],
8421 '__DAY_TEXT__' => $daytext,
8422 '__DAY_TEXT_SHORT__' =>
dol_trunc($daytext, 3,
'right',
'UTF-8', 1),
8423 '__DAY_TEXT_MIN__' =>
dol_trunc($daytext, 1,
'right',
'UTF-8', 1),
8424 '__MONTH__' => (
string) $tmp[
'mon'],
8425 '__MONTH_TEXT__' => $outputlangs->trans(
'Month'.sprintf(
"%02d", $tmp[
'mon'])),
8426 '__MONTH_TEXT_SHORT__' => $outputlangs->trans(
'MonthShort'.sprintf(
"%02d", $tmp[
'mon'])),
8427 '__MONTH_TEXT_MIN__' => $outputlangs->trans(
'MonthVeryShort'.sprintf(
"%02d", $tmp[
'mon'])),
8428 '__YEAR__' => (
string) $tmp[
'year'],
8429 '__PREVIOUS_DAY__' => (
string) $tmp2[
'day'],
8430 '__PREVIOUS_MONTH__' => (
string) $tmp3[
'month'],
8431 '__PREVIOUS_YEAR__' => (
string) ($tmp[
'year'] - 1),
8432 '__NEXT_DAY__' => (
string) $tmp4[
'day'],
8433 '__NEXT_MONTH__' => (
string) $tmp5[
'month'],
8434 '__NEXT_YEAR__' => (
string) ($tmp[
'year'] + 1),
8438 if (isModEnabled(
'multicompany')) {
8439 $substitutionarray = array_merge($substitutionarray, array(
'__ENTITY_ID__' => $conf->entity));
8441 if ((empty($exclude) || !in_array(
'system', $exclude)) && (empty($include) || in_array(
'user', $include))) {
8442 $substitutionarray[
'__DOL_MAIN_URL_ROOT__'] = DOL_MAIN_URL_ROOT;
8443 $substitutionarray[
'__(AnyTranslationKey)__'] = $outputlangs->trans(
'TranslationOfKey');
8444 $substitutionarray[
'__(AnyTranslationKey|langfile)__'] = $outputlangs->trans(
'TranslationOfKey').
' (load also language file before)';
8445 $substitutionarray[
'__[AnyConstantKey]__'] = $outputlangs->trans(
'ValueOfConstantKey');
8448 return $substitutionarray;
8467function make_substitutions($text, $substitutionarray, $outputlangs =
null, $converttextinhtmlifnecessary = 0)
8469 global $conf, $langs;
8471 if (!is_array($substitutionarray)) {
8472 return 'ErrorBadParameterSubstitutionArrayWhenCalling_make_substitutions';
8475 if (empty($outputlangs)) {
8476 $outputlangs = $langs;
8486 if (is_object($outputlangs)) {
8488 while (preg_match(
'/__\(([^\)]+)\)__/', $text, $reg)) {
8490 $tmp = explode(
'|', $reg[1]);
8491 if (!empty($tmp[1])) {
8492 $outputlangs->load($tmp[1]);
8495 $value = $outputlangs->transnoentitiesnoconv($reg[1]);
8497 if (empty($converttextinhtmlifnecessary)) {
8499 $text = preg_replace(
'/__\('.preg_quote($reg[1],
'/').
'\)__/', $msgishtml ?
dol_htmlentitiesbr($value) : $value, $text);
8513 $text = preg_replace(
'/__\('.preg_quote($reg[1],
'/').
'\)__/', $value, $text);
8521 while (preg_match(
'/__\[([^\]]+)\]__/', $text, $reg)) {
8522 $keyfound = $reg[1];
8524 $value =
'*****forbidden*****';
8526 $value = empty($conf->global->$keyfound) ?
'' : $conf->global->$keyfound;
8529 if (empty($converttextinhtmlifnecessary)) {
8531 $text = preg_replace(
'/__\['.preg_quote($keyfound,
'/').
'\]__/', $msgishtml ?
dol_htmlentitiesbr($value) : $value, $text);
8544 $text = preg_replace(
'/__\['.preg_quote($keyfound,
'/').
'\]__/', $value, $text);
8549 foreach ($substitutionarray as $key => $value) {
8550 if (!isset($value)) {
8554 if (($key ==
'__USER_SIGNATURE__' || $key ==
'__SENDEREMAIL_SIGNATURE__') && (!empty($conf->global->MAIN_MAIL_DO_NOT_USE_SIGN))) {
8558 if (empty($converttextinhtmlifnecessary)) {
8559 $text = str_replace(
"$key",
"$value", $text);
8571 $text = str_replace(
"$key",
"$value", $text);
8592 global $conf, $user;
8594 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
8599 $dirsubstitutions = array_merge(array(), (array) $conf->modules_parts[
'substitutions']);
8601 foreach ($dirsubstitutions as $reldir) {
8609 $substitfiles =
dol_dir_list($dir,
'files', 0,
'functions_');
8610 foreach ($substitfiles as $substitfile) {
8612 if (preg_match(
'/functions_(.*)\.lib\.php/i', $substitfile[
'name'], $reg)) {
8615 dol_syslog(
"Library ".$substitfile[
'name'].
" found into ".$dir);
8617 require_once $dir.$substitfile[
'name'];
8619 $function_name = $module.
"_".$callfunc;
8620 if (function_exists($function_name)) {
8621 $function_name($substitutionarray, $outputlangs, $object, $parameters);
8626 if (!empty($conf->global->ODT_ENABLE_ALL_TAGS_IN_SUBSTITUTIONS)) {
8629 foreach ($substitutionarray as $key => $value) {
8630 $tags .=
'{'.$key.
'} => '.$value.
"\n";
8632 $substitutionarray = array_merge($substitutionarray, array(
'__ALL_TAGS__' => $tags));
8647 print
get_date_range($date_start, $date_end, $format, $outputlangs);
8660function get_date_range($date_start, $date_end, $format =
'', $outputlangs =
'', $withparenthesis = 1)
8666 if (!is_object($outputlangs)) {
8667 $outputlangs = $langs;
8670 if ($date_start && $date_end) {
8671 $out .= ($withparenthesis ?
' (' :
'').$outputlangs->transnoentitiesnoconv(
'DateFromTo',
dol_print_date($date_start, $format,
false, $outputlangs),
dol_print_date($date_end, $format,
false, $outputlangs)).($withparenthesis ?
')' :
'');
8673 if ($date_start && !$date_end) {
8674 $out .= ($withparenthesis ?
' (' :
'').$outputlangs->transnoentitiesnoconv(
'DateFrom',
dol_print_date($date_start, $format,
false, $outputlangs)).($withparenthesis ?
')' :
'');
8676 if (!$date_start && $date_end) {
8677 $out .= ($withparenthesis ?
' (' :
'').$outputlangs->transnoentitiesnoconv(
'DateUntil',
dol_print_date($date_end, $format,
false, $outputlangs)).($withparenthesis ?
')' :
'');
8697 if ($nameorder < 0) {
8698 $nameorder = (empty($conf->global->MAIN_FIRSTNAME_NAME_POSITION) ? 1 : 0);
8700 if ($nameorder == 1) {
8702 if ($firstname && $lastname) {
8706 } elseif ($nameorder == 2 || $nameorder == 3) {
8708 if (empty($ret) && $nameorder == 3) {
8713 if (empty($ret) && $nameorder == 5) {
8716 if ($nameorder == 0) {
8717 if ($firstname && $lastname) {
8741 if (!is_array($mesgs)) {
8744 if (!empty($noduplicate) && isset($_SESSION[
'dol_events'][$style]) && in_array($mesgs, $_SESSION[
'dol_events'][$style])) {
8747 $_SESSION[
'dol_events'][$style][] = $mesgs;
8751 foreach ($mesgs as $mesg) {
8753 if (!empty($noduplicate) && isset($_SESSION[
'dol_events'][$style]) && in_array($mesg, $_SESSION[
'dol_events'][$style])) {
8756 $_SESSION[
'dol_events'][$style][] = $mesg;
8776 if (empty($mesg) && empty($mesgs)) {
8777 dol_syslog(
"Try to add a message in stack, but value to add is empty message", LOG_WARNING);
8784 if (empty($messagekey) || empty($_COOKIE[
"DOLHIDEMESSAGE".$messagekey])) {
8785 if (!in_array((
string) $style, array(
'mesgs',
'warnings',
'errors'))) {
8786 dol_print_error(
'',
'Bad parameter style='.$style.
' for setEventMessages');
8788 if (empty($mesgs)) {
8791 if (!empty($mesg) && !in_array($mesg, $mesgs)) {
8812 if (isset($_SESSION[
'dol_events'][
'mesgs'])) {
8813 if (empty($disabledoutputofmessages)) {
8816 unset($_SESSION[
'dol_events'][
'mesgs']);
8819 if (isset($_SESSION[
'dol_events'][
'errors'])) {
8820 if (empty($disabledoutputofmessages)) {
8823 unset($_SESSION[
'dol_events'][
'errors']);
8827 if (isset($_SESSION[
'dol_events'][
'warnings'])) {
8828 if (empty($disabledoutputofmessages)) {
8831 unset($_SESSION[
'dol_events'][
'warnings']);
8851 global $conf, $langs;
8856 $divstart = $divend =
'';
8859 if ((empty($conf->use_javascript_ajax) || !empty($conf->global->MAIN_DISABLE_JQUERY_JNOTIFY) || $keepembedded) && !preg_match(
'/<div class=".*">/i', $out)) {
8860 $divstart =
'<div class="'.$style.
' clearboth">';
8864 if ((is_array($mesgarray) && count($mesgarray)) || $mesgstring) {
8865 $langs->load(
"errors");
8867 if (is_array($mesgarray) && count($mesgarray)) {
8868 foreach ($mesgarray as $message) {
8870 $out .= $langs->trans($message);
8871 if ($ret < count($mesgarray)) {
8878 $out .= $langs->trans($mesgstring);
8884 if (!empty($conf->use_javascript_ajax) && empty($conf->global->MAIN_DISABLE_JQUERY_JNOTIFY) && empty($keepembedded)) {
8885 $return =
'<script nonce="'.getNonce().
'">
8886 $(document).ready(function() {
8887 var block = '.(!empty($conf->global->MAIN_USE_JQUERY_BLOCKUI) ?
"true" :
"false").
'
8891 /* jnotify(message, preset of message type, keepmessage) */
8893 "'.($style ==
"ok" ? 3000 : $style).
'",
8894 '.($style ==
"ok" ?
"false" :
"true").
',
8895 { remove: function (){} } );
8938 if (empty($mesgstring) && (!is_array($mesgarray) || count($mesgarray) == 0)) {
8944 if (is_array($mesgarray)) {
8945 foreach ($mesgarray as $val) {
8946 if ($val && preg_match(
'/class="error"/i', $val)) {
8950 if ($val && preg_match(
'/class="warning"/i', $val)) {
8955 } elseif ($mesgstring && preg_match(
'/class="error"/i', $mesgstring)) {
8957 } elseif ($mesgstring && preg_match(
'/class="warning"/i', $mesgstring)) {
8960 if ($style ==
'error') {
8963 if ($style ==
'warning') {
8967 if ($iserror || $iswarning) {
8969 $mesgstring = preg_replace(
'/<\/div><div class="(error|warning)">/',
'<br>', $mesgstring);
8970 $mesgstring = preg_replace(
'/<div class="(error|warning)">/',
'', $mesgstring);
8971 $mesgstring = preg_replace(
'/<\/div>/',
'', $mesgstring);
8973 if (is_array($mesgarray)) {
8974 $newmesgarray = array();
8975 foreach ($mesgarray as $val) {
8976 if (is_string($val)) {
8977 $tmpmesgstring = preg_replace(
'/<\/div><div class="(error|warning)">/',
'<br>', $val);
8978 $tmpmesgstring = preg_replace(
'/<div class="(error|warning)">/',
'', $tmpmesgstring);
8979 $tmpmesgstring = preg_replace(
'/<\/div>/',
'', $tmpmesgstring);
8980 $newmesgarray[] = $tmpmesgstring;
8982 dol_syslog(
"Error call of dol_htmloutput_mesg with an array with a value that is not a string", LOG_WARNING);
8985 $mesgarray = $newmesgarray;
8987 print
get_htmloutput_mesg($mesgstring, $mesgarray, ($iserror ?
'error' :
'warning'), $keepembedded);
9023function dol_sort_array(&$array, $index, $order =
'asc', $natsort = 0, $case_sensitive = 0, $keepindex = 0)
9026 $order = strtolower($order);
9028 if (is_array($array)) {
9029 $sizearray = count($array);
9030 if ($sizearray > 0) {
9032 foreach (array_keys($array) as $key) {
9033 if (is_object($array[$key])) {
9034 $temp[$key] = empty($array[$key]->$index) ? 0 : $array[$key]->$index;
9036 $temp[$key] = empty($array[$key][$index]) ? 0 : $array[$key][$index];
9038 if ($natsort == -1) {
9039 $temp[$key] =
'___'.$temp[$key];
9043 if (empty($natsort) || $natsort == -1) {
9044 if ($order ==
'asc') {
9050 if ($case_sensitive) {
9055 if ($order !=
'asc') {
9056 $temp = array_reverse($temp,
true);
9062 foreach (array_keys($temp) as $key) {
9063 (is_numeric($key) && empty($keepindex)) ? $sorted[] = $array[$key] : $sorted[$key] = $array[$key];
9081 $str = (string) $str;
9085 for ($i = 0; $i < $strLength; $i++) {
9086 if (ord($str[$i]) < 0x80) {
9088 } elseif ((ord($str[$i]) & 0xE0) == 0xC0) {
9090 } elseif ((ord($str[$i]) & 0xF0) == 0xE0) {
9092 } elseif ((ord($str[$i]) & 0xF8) == 0xF0) {
9094 } elseif ((ord($str[$i]) & 0xFC) == 0xF8) {
9096 } elseif ((ord($str[$i]) & 0xFE) == 0xFC) {
9101 for ($j = 0; $j < $n; $j++) {
9102 if ((++$i == strlen($str)) || ((ord($str[$i]) & 0xC0) != 0x80)) {
9122 return preg_match(
'//u', $str) ? true :
false;
9134 if (function_exists(
'mb_check_encoding')) {
9136 if (!mb_check_encoding($str,
'ASCII')) {
9140 if (preg_match(
'/[^\x00-\x7f]/', $str)) {
9160 $tmp = ini_get(
"unicode.filesystem_encoding");
9161 if (empty($tmp) && !empty($_SERVER[
"WINDIR"])) {
9162 $tmp =
'iso-8859-1';
9167 if (!empty($conf->global->MAIN_FILESYSTEM_ENCODING)) {
9168 $tmp = $conf->global->MAIN_FILESYSTEM_ENCODING;
9171 if ($tmp ==
'iso-8859-1') {
9172 return mb_convert_encoding($str,
'ISO-8859-1',
'UTF-8');
9193function dol_getIdFromCode($db, $key, $tablename, $fieldkey =
'code', $fieldid =
'id', $entityfilter = 0, $filters =
'', $useCache =
true)
9195 global $cache_codes;
9203 if ($useCache && isset($cache_codes[$tablename][$fieldkey][$fieldid][$entityfilter][$filters][$key])) {
9204 return $cache_codes[$tablename][$fieldkey][$fieldid][$entityfilter][$filters][$key];
9207 dol_syslog(
'dol_getIdFromCode (value for field '.$fieldid.
' from key '.$key.
' not found into cache)', LOG_DEBUG);
9209 $sql =
"SELECT ".$fieldid.
" as valuetoget";
9210 $sql .=
" FROM ".MAIN_DB_PREFIX.$tablename;
9211 $sql .=
" WHERE ".$fieldkey.
" = '".$db->escape($key).
"'";
9212 if (!empty($entityfilter)) {
9213 $sql .=
" AND entity IN (".getEntity($tablename).
")";
9219 $resql = $db->query($sql);
9221 $obj = $db->fetch_object($resql);
9224 $valuetoget = $obj->valuetoget;
9228 $cache_codes[$tablename][$fieldkey][$fieldid][$entityfilter][$filters][$key] = $valuetoget;
9244 global $user, $conf, $langs;
9250 if (isset($strToEvaluate) && $strToEvaluate !==
'') {
9253 $rep =
dol_eval($strToEvaluate, 1, 1,
'1');
9254 $rights = $rep && (!is_string($rep) || strpos($rep,
'Bad string syntax to evaluate') ===
false);
9270function dol_eval($s, $returnvalue = 0, $hideerrors = 1, $onlysimplestring =
'1')
9273 global $db, $langs, $user, $conf, $website, $websitepage;
9274 global $action, $mainmenu, $leftmenu;
9276 global $objectoffield;
9286 if ($onlysimplestring ==
'1') {
9290 if (preg_match(
'/[^a-z0-9\s'.preg_quote(
'^$_+-.*>&|=!?():"\',/@',
'/').
']/i', $s)) {
9292 return 'Bad string syntax to evaluate (found chars that are not chars for simplestring): '.$s;
9294 dol_syslog(
'Bad string syntax to evaluate (found chars that are not chars for simplestring): '.$s);
9301 } elseif ($onlysimplestring ==
'2') {
9303 if (preg_match(
'/[^a-z0-9\s'.preg_quote(
'^$_+-.*>&|=!?():"\',/@[]',
'/').
']/i', $s)) {
9305 return 'Bad string syntax to evaluate (found chars that are not chars for simplestring): '.$s;
9307 dol_syslog(
'Bad string syntax to evaluate (found chars that are not chars for simplestring): '.$s);
9315 if (is_array($s) || $s ===
'Array') {
9316 return 'Bad string syntax to evaluate (value is Array) '.var_export($s,
true);
9319 if (!
getDolGlobalString(
'MAIN_ALLOW_DOUBLE_COLON_IN_DOL_EVAL') && strpos($s,
'::') !==
false) {
9321 return 'Bad string syntax to evaluate (double : char is forbidden without setting MAIN_ALLOW_DOUBLE_COLON_IN_DOL_EVAL): '.$s;
9323 dol_syslog(
'Bad string syntax to evaluate (double : char is forbidden without setting MAIN_ALLOW_DOUBLE_COLON_IN_DOL_EVAL): '.$s, LOG_WARNING);
9328 if (strpos($s,
'`') !==
false) {
9330 return 'Bad string syntax to evaluate (backtick char is forbidden): '.$s;
9332 dol_syslog(
'Bad string syntax to evaluate (backtick char is forbidden): '.$s);
9339 if (preg_match(
'/[^0-9]+\.[^0-9]+/', $s)) {
9341 return 'Bad string syntax to evaluate (dot char is forbidden): '.$s;
9343 dol_syslog(
'Bad string syntax to evaluate (dot char is forbidden): '.$s);
9350 $forbiddenphpstrings = array(
'$$');
9351 $forbiddenphpstrings = array_merge($forbiddenphpstrings, array(
'_ENV',
'_SESSION',
'_COOKIE',
'_GET',
'_POST',
'_REQUEST',
'ReflectionFunction'));
9356 $forbiddenphpfunctions = array();
9358 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"base64".
"_".
"decode",
"rawurl".
"decode",
"url".
"decode",
"str".
"_rot13",
"hex".
"2bin"));
9359 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"override_function",
"session_id",
"session_create_id",
"session_regenerate_id"));
9360 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"get_defined_functions",
"get_defined_vars",
"get_defined_constants",
"get_declared_classes"));
9361 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"function",
"call_user_func",
"call_user_func_array"));
9363 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"array_all",
"array_any",
"array_diff_ukey",
"array_filter",
"array_find",
"array_find_key",
"array_map",
"array_reduce",
"array_intersect_uassoc",
"array_intersect_ukey",
"array_walk",
"array_walk_recursive"));
9364 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"usort",
"uasort",
"uksort",
"preg_replace_callback",
"preg_replace_callback_array",
"header_register_callback"));
9365 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"set_error_handler",
"set_exception_handler",
"libxml_set_external_entity_loader",
"register_shutdown_function",
"register_tick_function",
"unregister_tick_function"));
9366 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"spl_autoload_register",
"spl_autoload_unregister",
"iterator_apply",
"session_set_save_handler"));
9367 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"forward_static_call",
"forward_static_call_array",
"register_postsend_function"));
9369 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"ob_start"));
9371 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"require",
"include",
"require_once",
"include_once"));
9372 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"exec",
"passthru",
"shell_exec",
"system",
"proc_open",
"popen"));
9373 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"dol_eval",
"executeCLI",
"verifCond"));
9374 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"eval",
"create_function",
"assert",
"mb_ereg_replace",
"mb_ereg_replace_callback"));
9375 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"readline_completion_function",
"readline_callback_handler_install"));
9376 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"dol_compress_dir",
"dol_decode",
"dol_delete_file",
"dol_delete_dir",
"dol_delete_dir_recursive",
"dol_copy",
"archiveOrBackupFile"));
9377 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"fopen",
"file_put_contents",
"fputs",
"fputscsv",
"fwrite",
"fpassthru",
"mkdir",
"rmdir",
"symlink",
"touch",
"unlink",
"umask"));
9378 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"require",
"include"));
9380 $forbiddenphpmethods = array(
'invoke',
'invokeArgs');
9382 $forbiddenphpregex =
'global\s+\$|\b('.implode(
'|', $forbiddenphpfunctions).
')\b';
9384 $forbiddenphpmethodsregex =
'->('.implode(
'|', $forbiddenphpmethods).
')';
9387 $oldstringtoclean = $s;
9388 $s = str_ireplace($forbiddenphpstrings,
'__forbiddenstring__', $s);
9389 $s = preg_replace(
'/'.$forbiddenphpregex.
'/i',
'__forbiddenstring__', $s);
9390 $s = preg_replace(
'/'.$forbiddenphpmethodsregex.
'/i',
'__forbiddenstring__', $s);
9392 }
while ($oldstringtoclean != $s);
9394 if (strpos($s,
'__forbiddenstring__') !==
false) {
9395 dol_syslog(
'Bad string syntax to evaluate: '.$s, LOG_WARNING);
9397 return 'Bad string syntax to evaluate: '.$s;
9399 dol_syslog(
'Bad string syntax to evaluate: '.$s);
9407 return @eval(
'return '.$s.
';');
9409 return eval(
'return '.$s.
';');
9418 }
catch (Error $e) {
9419 $error =
'dol_eval try/catch error : ';
9420 $error .= $e->getMessage();
9433 return (trim($element) !=
'');
9446 if (empty($codelang)) {
9450 if ($codelang ==
'auto') {
9451 return '<span class="fa fa-language"></span>';
9454 $langtocountryflag = array(
9456 'ca_ES' =>
'catalonia',
9460 'sw_SW' =>
'unknown',
9470 if (isset($langtocountryflag[$codelang])) {
9471 $flagImage = $langtocountryflag[$codelang];
9473 $tmparray = explode(
'_', $codelang);
9474 $flagImage = empty($tmparray[1]) ? $tmparray[0] : $tmparray[1];
9477 return img_picto_common($codelang,
'flags/'.strtolower($flagImage).
'.png', $moreatt, 0, $notitlealt);
9491 if (empty($countrycode)) {
9495 if (strtoupper($countrycode) ==
'MQ') {
9498 if (strtoupper($countrycode) ==
'SE') {
9501 if (strtoupper($countrycode) ==
'CH') {
9502 if ($mysoc->country_code ==
'FR') {
9505 if ($mysoc->country_code ==
'DE') {
9508 if ($mysoc->country_code ==
'IT') {
9690 $buildprimarykeytotest = strtolower($countrycode).
'-'.strtoupper($countrycode);
9691 if (in_array($buildprimarykeytotest, $locales)) {
9692 return strtolower($countrycode).
'_'.strtoupper($countrycode);
9695 if (function_exists(
'locale_get_primary_language') && function_exists(
'locale_get_region')) {
9696 foreach ($locales as $locale) {
9697 $locale_language = locale_get_primary_language($locale);
9698 $locale_region = locale_get_region($locale);
9699 if (strtoupper($countrycode) == $locale_region) {
9701 return strtolower($locale_language).
'_'.strtoupper($locale_region);
9705 dol_syslog(
"Warning Exention php-intl is not available", LOG_WARNING);
9743 global $hookmanager, $db;
9745 if (isset($conf->modules_parts[
'tabs'][$type]) && is_array($conf->modules_parts[
'tabs'][$type])) {
9746 foreach ($conf->modules_parts[
'tabs'][$type] as $value) {
9747 $values = explode(
':', $value);
9750 if ($mode ==
'add' && !preg_match(
'/^\-/', $values[1])) {
9751 if (count($values) == 6) {
9755 if ($values[0] != $type) {
9761 if ($filterorigmodule) {
9762 if (strpos($values[3],
'@')) {
9763 if ($filterorigmodule !=
'external') {
9767 if ($filterorigmodule !=
'core') {
9772 $langs->load($values[3]);
9774 if (preg_match(
'/SUBSTITUTION_([^_]+)/i', $values[2], $reg)) {
9776 $substitutionarray = array();
9781 $labeltemp = explode(
',', $values[2]);
9782 $label = $langs->trans($labeltemp[0]);
9784 if (!empty($labeltemp[1]) && is_object($object) && !empty($object->id)) {
9786 $classtoload = $labeltemp[1];
9787 if (class_exists($classtoload)) {
9788 $obj =
new $classtoload($db);
9789 $function = $labeltemp[3];
9790 if ($obj && $function && method_exists($obj, $function)) {
9791 $nbrec = $obj->$function($object->id, $obj);
9792 if (!empty($nbrec)) {
9793 $label .=
'<span class="badge marginleftonlyshort">'.$nbrec.
'</span>';
9800 $head[$h][0] =
dol_buildpath(preg_replace(
'/__ID__/i', ((is_object($object) && !empty($object->id)) ? $object->id :
''), $values[5]), 1);
9801 $head[$h][1] = $label;
9802 $head[$h][2] = str_replace(
'+',
'', $values[1]);
9805 } elseif (count($values) == 5) {
9806 dol_syslog(
'Passing 5 values in tabs module_parts is deprecated. Please update to 6 with permissions.', LOG_WARNING);
9808 if ($values[0] != $type) {
9812 if ($filterorigmodule) {
9813 if (strpos($values[3],
'@')) {
9814 if ($filterorigmodule !=
'external') {
9818 if ($filterorigmodule !=
'core') {
9823 $langs->load($values[3]);
9825 if (preg_match(
'/SUBSTITUTION_([^_]+)/i', $values[2], $reg)) {
9826 $substitutionarray = array();
9830 $label = $langs->trans($values[2]);
9833 $head[$h][0] =
dol_buildpath(preg_replace(
'/__ID__/i', ((is_object($object) && !empty($object->id)) ? $object->id :
''), $values[4]), 1);
9834 $head[$h][1] = $label;
9835 $head[$h][2] = str_replace(
'+',
'', $values[1]);
9838 } elseif ($mode ==
'remove' && preg_match(
'/^\-/', $values[1])) {
9839 if ($values[0] != $type) {
9842 $tabname = str_replace(
'-',
'', $values[1]);
9843 foreach ($head as $key => $val) {
9844 $condition = (!empty($values[3]) ?
verifCond($values[3]) : 1);
9846 if ($head[$key][2] == $tabname && $condition) {
9856 if (!empty($hookmanager)) {
9857 $parameters = array(
'object' => $object,
'mode' => $mode,
'head' => &$head,
'filterorigmodule' => $filterorigmodule);
9858 $reshook = $hookmanager->executeHooks(
'completeTabsHead', $parameters);
9860 $head = $hookmanager->resArray;
9862 $head = array_merge($head, $hookmanager->resArray);
9881 global $conf, $hookmanager, $user, $debugbar;
9883 global $micro_start_time;
9885 if ($zone ==
'private') {
9886 print
"\n".
'<!-- Common footer for private page -->'.
"\n";
9888 print
"\n".
'<!-- Common footer for public page -->'.
"\n";
9892 print
"\n<!-- A div to store page_y POST parameter -->\n";
9893 print
'<div id="page_y" style="display: none;">'.(GETPOST(
'page_y') ?
GETPOST(
'page_y') :
'').
'</div>'.
"\n";
9895 $parameters = array();
9896 $reshook = $hookmanager->executeHooks(
'printCommonFooter', $parameters);
9897 if (empty($reshook)) {
9898 if (!empty($conf->global->MAIN_HTML_FOOTER)) {
9899 print $conf->global->MAIN_HTML_FOOTER.
"\n";
9903 if (!empty($conf->use_javascript_ajax)) {
9904 print
"\n<!-- A script section to add menuhider handler on backoffice, manage focus and madatory fields, tuning info, ... -->\n";
9905 print
'<script>'.
"\n";
9906 print
'jQuery(document).ready(function() {'.
"\n";
9908 if ($zone ==
'private' && empty($conf->dol_use_jmobile)) {
9910 print
'/* JS CODE TO ENABLE to manage handler to switch left menu page (menuhider) */'.
"\n";
9911 print
'jQuery("li.menuhider").click(function(event) {';
9912 print
' if (!$( "body" ).hasClass( "sidebar-collapse" )){ event.preventDefault(); }'.
"\n";
9913 print
' console.log("We click on .menuhider");'.
"\n";
9914 print
' $("body").toggleClass("sidebar-collapse")'.
"\n";
9919 if ($action ==
'create' || $action ==
'edit' || (empty($action) && (preg_match(
'/new\.php/', $_SERVER[
"PHP_SELF"]))) || ((empty($action) || $action ==
'addline') && (preg_match(
'/card\.php/', $_SERVER[
"PHP_SELF"])))) {
9920 print
'/* JS CODE TO ENABLE to manage focus and mandatory form fields */'.
"\n";
9921 $relativepathstring = $_SERVER[
"PHP_SELF"];
9923 if (constant(
'DOL_URL_ROOT')) {
9924 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
9926 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
9927 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
9929 if (!empty($user->default_values[$relativepathstring][
'focus'])) {
9930 foreach ($user->default_values[$relativepathstring][
'focus'] as $defkey => $defval) {
9932 if ($defkey !=
'_noquery_') {
9933 $tmpqueryarraytohave = explode(
'&', $defkey);
9935 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
9936 $tmpquerytohaveparam = explode(
'=', $tmpquerytohave);
9938 if (!GETPOSTISSET($tmpquerytohaveparam[0]) || ($tmpquerytohaveparam[1] !=
GETPOST($tmpquerytohaveparam[0]))) {
9951 foreach ($defval as $paramkey => $paramval) {
9953 print
'jQuery("input[name=\''.$paramkey.
'\']
").focus();'."\n
";
9954 print 'jQuery("textarea[
name=\
''.$paramkey.
'\']
").focus();'."\n
";
9955 print 'jQuery("select[
name=\
''.$paramkey.
'\']
").focus();'."\n
"; // Not really usefull, but we keep it in case of.
9960 if (!empty($user->default_values[$relativepathstring]['mandatory'])) {
9961 foreach ($user->default_values[$relativepathstring]['mandatory'] as $defkey => $defval) {
9963 if ($defkey != '_noquery_') {
9964 $tmpqueryarraytohave = explode('&', $defkey);
9966 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
9967 $tmpquerytohaveparam = explode('=', $tmpquerytohave);
9968 //print "console.log(
'".$tmpquerytohaveparam[0]." ".$tmpquerytohaveparam[1]." ".GETPOST($tmpquerytohaveparam[0])."');
";
9969 if (!GETPOSTISSET($tmpquerytohaveparam[0]) || ($tmpquerytohaveparam[1] != GETPOST($tmpquerytohaveparam[0]))) {
9976 //var_dump($defkey.'-'.$qualified);
9982 foreach ($defval as $paramkey => $paramval) {
9983 // Add property 'required' on input
9984 print 'jQuery("input[
name=\
''.$paramkey.
'\']
").prop(\'required\',true);'."\n
";
9985 print 'jQuery("textarea[
name=\
''.$paramkey.
'\']
").prop(\'required\',true);'."\n
";
9986 print '// required on a select works only if key is "", so we add the required attributes but also we reset the key -1 or 0 to an empty string'."\n
";
9987 print 'if (jQuery("select[
name=\
''.$paramkey.
'\']
").is(\':visible\')===true) {'."\n
";
9988 print 'jQuery("select[
name=\
''.$paramkey.
'\']
").prop(\'required\',true);'."\n
"; // can set focus only if this element is visible
9990 print 'jQuery("select[
name=\
''.$paramkey.
'\'] option[value=\
'-1\']").prop(\'value\', \'\');'.
"\n";
9991 print
'jQuery("select[name=\''.$paramkey.
'\'] option[value=\
'0\']").prop(\'value\', \'\');'.
"\n";
9994 print
'jQuery(":input[name=\'' . $paramkey .
'\']
").closest("tr
").find("td:first
").addClass("fieldrequired
");' . "\n
";
10004 if (!empty($_SERVER['MAIN_SHOW_TUNING_INFO']) || !empty($conf->global->MAIN_SHOW_TUNING_INFO)) {
10007 print 'window.console && console.log("';
10008 if (!empty($conf->global->MEMCACHED_SERVER)) {
10009 print 'MEMCACHED_SERVER=
'.$conf->global->MEMCACHED_SERVER.' -
';
10011 print 'MAIN_OPTIMIZE_SPEED=
'.(isset($conf->global->MAIN_OPTIMIZE_SPEED) ? $conf->global->MAIN_OPTIMIZE_SPEED : 'off
');
10012 if (!empty($micro_start_time)) { // Works only if MAIN_SHOW_TUNING_INFO is defined at $_SERVER level. Not in global variable.
10013 $micro_end_time = microtime(true);
10014 print ' - Build time:
'.ceil(1000 * ($micro_end_time - $micro_start_time)).' ms
';
10017 if (function_exists("memory_get_usage")) {
10018 print ' - Mem:
'.memory_get_usage(); // Do not use true here, it seems it takes the peak amount
10020 if (function_exists("memory_get_peak_usage")) {
10021 print ' - Real mem peak:
'.memory_get_peak_usage(true);
10023 if (function_exists("zend_loader_file_encoded")) {
10024 print ' - Zend encoded file:
'.(zend_loader_file_encoded() ? 'yes
' : 'no
');
10029 print "\n
".'</script>'."\n
";
10031 // Google Analytics
10032 // TODO Add a hook here
10033 if (isModEnabled('google') && !empty($conf->global->MAIN_GOOGLE_AN_ID)) {
10034 $tmptagarray = explode(',', $conf->global->MAIN_GOOGLE_AN_ID);
10035 foreach ($tmptagarray as $tmptag) {
10037 print "<!-- JS CODE TO ENABLE
for google analtics tag -->\n
";
10039 <!-- Global site tag (gtag.js) - Google Analytics -->
10040 <script nonce="'.getNonce().'" async src="https:
10042 window.dataLayer = window.dataLayer || [];
10043 function gtag(){dataLayer.push(arguments);}
10044 gtag(\
'js\', new Date());
10046 gtag(\'config\', \''.trim($tmptag).
'\');
10053 // Add Xdebug coverage of code
10054 if (defined('XDEBUGCOVERAGE
')) {
10055 print_r(xdebug_get_code_coverage());
10058 // Add DebugBar data
10059 if (!empty($user->rights->debugbar->read) && is_object($debugbar)) {
10060 $debugbar['time
']->stopMeasure('pageaftermaster
');
10061 print '<!-- Output debugbar data -->
'."\n";
10062 $renderer = $debugbar->getRenderer();
10063 print $debugbar->getRenderer()->render();
10064 } elseif (count($conf->logbuffer)) { // If there is some logs in buffer to show
10066 print "<!-- Start of log output\n";
10067 //print '<div
class=
"hidden">
'."\n";
10068 foreach ($conf->logbuffer as $logline) {
10069 print $logline."<br>\n";
10071 //print '</div>
'."\n";
10072 print "End of log output -->\n";
10086function dolExplodeIntoArray($string, $delimiter = ';
', $kv = '=
')
10088 if (is_null($string)) {
10092 if (preg_match('/^\[.*\]$/sm
', $delimiter) || preg_match('/^\(.*\)$/sm
', $delimiter)) {
10093 // This is a regex string
10094 $newdelimiter = $delimiter;
10096 // This is a simple string
10097 $newdelimiter = preg_quote($delimiter, '/
');
10100 if ($a = preg_split('/
'.$newdelimiter.'/
', $string)) {
10102 foreach ($a as $s) { // each part
10104 if ($pos = strpos($s, $kv)) { // key/value delimiter
10105 $ka[trim(substr($s, 0, $pos))] = trim(substr($s, $pos + strlen($kv)));
10106 } else { // key delimiter not found
10124function dol_set_focus($selector)
10126 print "\n".'<!-- Set focus onto a specific field -->
'."\n";
10127 print '<script nonce=
"'.getNonce().'">jQuery(document).ready(
function() { jQuery(
"'.dol_escape_js($selector).'").focus(); });</script>
'."\n";
10138function dol_getmypid()
10140 if (!function_exists('getmypid
')) {
10141 return mt_rand(99900000, 99965535);
10143 return getmypid(); // May be a number on 64 bits (depending on OS)
10165function natural_search($fields, $value, $mode = 0, $nofirstand = 0)
10167 global $db, $langs;
10169 $value = trim($value);
10172 $value = preg_replace('/\*/
', '%
', $value); // Replace * with %
10175 $value = preg_replace('/([!<>=]+)\s+([0-9
'.preg_quote($langs->trans("DecimalSeparator"), '/
').'\-])/
', '\1\2
', $value); // Clean string '< 10
' into '<10
' so we can then explode on space to get all tests to do
10178 $value = preg_replace('/\s*\|\s*/
', '|
', $value);
10180 //natural mode search type 3 allow spaces into search ...
10181 if ($mode == 3 || $mode == -3) {
10182 $crits = explode(',
', $value);
10184 $crits = explode(' ', $value);
10187 if (!is_array($fields)) {
10188 $fields = array($fields);
10191 $i1 = 0; // count the nb of and criteria added (all fields / criterias)
10192 foreach ($crits as $crit) { // Loop on each AND criteria
10193 $crit = trim($crit);
10194 $i2 = 0; // count the nb of valid criteria added for this this first criteria
10196 foreach ($fields as $field) {
10198 $tmpcrits = explode('|
', $crit);
10199 $i3 = 0; // count the nb of valid criteria added for this current field
10200 foreach ($tmpcrits as $tmpcrit) {
10201 if ($tmpcrit !== '0
' && empty($tmpcrit)) {
10204 $tmpcrit = trim($tmpcrit);
10206 $newres .= (($i2 > 0 || $i3 > 0) ? ' OR
' : '');
10209 $newcrit = preg_replace('/([!<>=]+)/
', '', $tmpcrit);
10212 preg_match('/([!<>=]+)/
', $tmpcrit, $reg);
10213 if (!empty($reg[1])) {
10214 $operator = $reg[1];
10216 if ($newcrit != '') {
10217 $numnewcrit = price2num($newcrit);
10218 if (is_numeric($numnewcrit)) {
10219 $newres .= $field.' '.$operator.' '.((float) $numnewcrit); // should be a numeric
10221 $newres .= '1 = 2
'; // force false, we received a corrupted data
10223 $i3++; // a criteria was added to string
10226 $i2++; // a criteria for 1 more field was added to string
10227 } elseif ($mode == 2 || $mode == -2) {
10228 $crit = preg_replace('/[^0-9,]/
', '', $crit); // ID are always integer
10229 $newres .= ($i2 > 0 ? ' OR
' : '').$field." ".($mode == -2 ? 'NOT
' : '');
10230 $newres .= $crit ? "IN (".$db->sanitize($db->escape($crit)).")" : "IN (0)";
10232 $newres .= ' OR
'.$field.' IS NULL
';
10234 $i2++; // a criteria for 1 more field was added to string
10235 } elseif ($mode == 3 || $mode == -3) {
10236 $tmparray = explode(',
', $crit);
10237 if (count($tmparray)) {
10239 foreach ($tmparray as $val) {
10242 $listofcodes .= ($listofcodes ? ',
' : '');
10243 $listofcodes .= "'".$db->escape($val)."'";
10246 $newres .= ($i2 > 0 ? ' OR
' : '').$field." ".($mode == -3 ? 'NOT
' : '')."IN (".$db->sanitize($listofcodes, 1, 0, 1).")";
10247 $i2++; // a criteria for 1 more field was added to string
10250 $newres .= ' OR
'.$field.' IS NULL
';
10252 } elseif ($mode == 4) {
10253 $tmparray = explode(',
', $crit);
10254 if (count($tmparray)) {
10256 foreach ($tmparray as $val) {
10259 $newres .= ($i2 > 0 ? " OR (" : "(").$field." LIKE '".$db->escape($val).",%
'";
10260 $newres .= ' OR
'.$field." = '".$db->escape($val)."'";
10261 $newres .= ' OR
'.$field." LIKE '%,
".$db->escape($val)."'";
10262 $newres .= ' OR
'.$field." LIKE '%,
".$db->escape($val).",%
'";
10264 $i2++; // a criteria for 1 more field was added to string (we can add several citeria for the same field as it is a multiselect search criteria)
10268 } else { // $mode=0
10269 $tmpcrits = explode('|
', $crit);
10270 $i3 = 0; // count the nb of valid criteria added for the current couple criteria/field
10271 foreach ($tmpcrits as $tmpcrit) { // loop on each OR criteria
10272 if ($tmpcrit !== '0
' && empty($tmpcrit)) {
10275 $tmpcrit = trim($tmpcrit);
10277 if ($tmpcrit == '^$
' || strpos($crit, '!
') === 0) { // If we search empty, we must combined different OR fields with AND
10278 $newres .= (($i2 > 0 || $i3 > 0) ? ' AND
' : '');
10280 $newres .= (($i2 > 0 || $i3 > 0) ? ' OR
' : '');
10283 if (preg_match('/\.(
id|
rowid)$/
', $field)) { // Special case for rowid that is sometimes a ref so used as a search field
10284 $newres .= $field." = ".(is_numeric($tmpcrit) ? ((float) $tmpcrit) : '0
');
10286 $tmpcrit2 = $tmpcrit;
10291 if (preg_match('/^!/
', $tmpcrit)) {
10292 $tmps .= $field." NOT LIKE "; // ! as exclude character
10293 $tmpcrit2 = preg_replace('/^!/
', '', $tmpcrit2);
10295 $tmps .= $field." LIKE ";
10299 if (preg_match('/^[\^\$]/', $tmpcrit)) {
10301 $tmpcrit2 = preg_replace('/^[\^\$]/', '', $tmpcrit2);
10303 if (preg_match('/[\^\$]$/', $tmpcrit)) {
10305 $tmpcrit2 = preg_replace('/[\^\$]$/', '', $tmpcrit2);
10308 if ($tmpcrit2 == '' || preg_match('/^!/', $tmpcrit)) {
10312 $newres .= $tmpbefore;
10313 $newres .= $db->escape($tmpcrit2);
10314 $newres .= $tmpafter;
10316 if ($tmpcrit2 == '' || preg_match('/^!/
', $tmpcrit)) {
10317 $newres .= " OR ".$field." IS NULL)";
10324 $i2++; // a criteria for 1 more field was added to string
10329 $res = $res.($res ? ' AND
' : '').($i2 > 1 ? '(
' : '').$newres.($i2 > 1 ? ')
' : '');
10333 $res = ($nofirstand ? "" : " AND ")."(".$res.")";
10344function showDirectDownloadLink($object)
10346 global $conf, $langs;
10349 $url = $object->getLastMainDocLink($object->element);
10351 $out .= img_picto($langs->trans("PublicDownloadLinkDesc"), 'globe
').' <span
class=
"opacitymedium">
'.$langs->trans("DirectDownloadLink").'</span><br>
';
10353 $out .= '<div
class=
"urllink"><input
type=
"text" id=
"directdownloadlink" class=
"quatrevingtpercent" value=
"'.$url.'"></div>
';
10354 $out .= ajax_autoselect("directdownloadlink", 0);
10356 $out .= '<div
class=
"urllink">
'.$langs->trans("FileNotShared").'</div>
';
10370function getImageFileNameForSize($file, $extName, $extImgTarget = '
')
10372 $dirName = dirname($file);
10373 if ($dirName == '.
') {
10377 $fileName = preg_replace('/(\.gif|\.jpeg|\.jpg|\.png|\.bmp|\.webp)$/i
', '', $file); // We remove extension, whatever is its case
10378 $fileName = basename($fileName);
10380 if (empty($extImgTarget)) {
10381 $extImgTarget = (preg_match('/\.jpg$/i
', $file) ? '.jpg
' : '');
10383 if (empty($extImgTarget)) {
10384 $extImgTarget = (preg_match('/\.jpeg$/i
', $file) ? '.jpeg
' : '');
10386 if (empty($extImgTarget)) {
10387 $extImgTarget = (preg_match('/\.gif$/i
', $file) ? '.gif
' : '');
10389 if (empty($extImgTarget)) {
10390 $extImgTarget = (preg_match('/\.png$/i
', $file) ? '.png
' : '');
10392 if (empty($extImgTarget)) {
10393 $extImgTarget = (preg_match('/\.bmp$/i
', $file) ? '.bmp
' : '');
10395 if (empty($extImgTarget)) {
10396 $extImgTarget = (preg_match('/\.webp$/i
', $file) ? '.webp
' : '');
10399 if (!$extImgTarget) {
10405 $subdir = 'thumbs/
';
10408 return ($dirName ? $dirName.'/
' : '').$subdir.$fileName.$extName.$extImgTarget; // New filename for thumb
10421function getAdvancedPreviewUrl($modulepart, $relativepath, $alldata = 0, $param = '
')
10423 global $conf, $langs;
10425 if (empty($conf->use_javascript_ajax)) {
10429 $isAllowedForPreview = dolIsAllowedForPreview($relativepath);
10431 if ($alldata == 1) {
10432 if ($isAllowedForPreview) {
10433 return array('target
'=>'_blank
', 'css
'=>'documentpreview
', 'url
'=>DOL_URL_ROOT.'/document.php?modulepart=
'.urlencode($modulepart).'&attachment=0&file=
'.urlencode($relativepath).($param ? '&
'.$param : ''), 'mime
'=>dol_mimetype($relativepath));
10439 // old behavior, return a string
10440 if ($isAllowedForPreview) {
10441 $tmpurl = DOL_URL_ROOT.'/document.php?modulepart=
'.urlencode($modulepart).'&attachment=0&file=
'.urlencode($relativepath).($param ? '&
'.$param : '');
10442 $title = $langs->transnoentities("Preview");
10443 //$title = '%27-alert(document.domain)-%27
';
10444 //$tmpurl = 'file=
'.urlencode("'-alert(document.domain)-
'_small.jpg");
10446 // We need to urlencode the parameter after the dol_escape_js($tmpurl) because $tmpurl may contain n url with param file=abc%27def if file has a ' inside.
10463function ajax_autoselect($htmlname, $addlink = '
', $textonlink = 'Link')
10466 $out = '<script nonce=
"'.getNonce().'">
10467 jQuery(document).ready(
function () {
10468 jQuery(
"'.((strpos($htmlname, '.') === 0 ? '' : '#').$htmlname).'").click(
function() { jQuery(
this).select(); } );
10472 if ($textonlink === 'image
') {
10473 $out .= ' <a href=
"'.$addlink.'" target=
"_blank" rel=
"noopener noreferrer">
'.img_picto('', 'globe
').'</a>
';
10475 $out .= ' <a href=
"'.$addlink.'" target=
"_blank" rel=
"noopener noreferrer">
'.$langs->trans("Link").'</a>
';
10488function dolIsAllowedForPreview($file)
10492 // Check .noexe extension in filename
10493 if (preg_match('/\.noexe$/i
', $file)) {
10497 // Check mime types
10498 $mime_preview = array('bmp
', 'jpeg
', 'png
', 'gif
', 'tiff
', 'pdf
', 'plain
', 'css
', 'webp
');
10499 if (!empty($conf->global->MAIN_ALLOW_SVG_FILES_AS_IMAGES)) {
10500 $mime_preview[] = 'svg+xml
';
10502 //$mime_preview[]='vnd.oasis.opendocument.presentation
';
10503 //$mime_preview[]='archive
';
10504 $num_mime = array_search(dol_mimetype($file, '', 1), $mime_preview);
10505 if ($num_mime !== false) {
10509 // By default, not allowed for preview
10523function dol_mimetype($file, $default = 'application/octet-stream
', $mode = 0)
10526 $imgmime = 'other.png
';
10527 $famime = 'file-o
';
10530 $tmpfile = preg_replace('/\.noexe$/
', '', $file);
10532 // Plain text files
10533 if (preg_match('/\.txt$/i
', $tmpfile)) {
10534 $mime = 'text/plain
';
10535 $imgmime = 'text.png
';
10536 $famime = 'file-text-o
';
10538 if (preg_match('/\.rtx$/i
', $tmpfile)) {
10539 $mime = 'text/richtext
';
10540 $imgmime = 'text.png
';
10541 $famime = 'file-text-o
';
10543 if (preg_match('/\.csv$/i
', $tmpfile)) {
10544 $mime = 'text/csv
';
10545 $imgmime = 'text.png
';
10546 $famime = 'file-text-o
';
10548 if (preg_match('/\.tsv$/i
', $tmpfile)) {
10549 $mime = 'text/tab-separated-values
';
10550 $imgmime = 'text.png
';
10551 $famime = 'file-text-o
';
10553 if (preg_match('/\.(cf|
conf|log)$/i
', $tmpfile)) {
10554 $mime = 'text/plain
';
10555 $imgmime = 'text.png
';
10556 $famime = 'file-text-o
';
10558 if (preg_match('/\.ini$/i
', $tmpfile)) {
10559 $mime = 'text/plain
';
10560 $imgmime = 'text.png
';
10562 $famime = 'file-text-o
';
10564 if (preg_match('/\.md$/i
', $tmpfile)) {
10565 $mime = 'text/plain
';
10566 $imgmime = 'text.png
';
10568 $famime = 'file-text-o
';
10570 if (preg_match('/\.css$/i
', $tmpfile)) {
10571 $mime = 'text/css
';
10572 $imgmime = 'css.png
';
10574 $famime = 'file-text-o
';
10576 if (preg_match('/\.lang$/i
', $tmpfile)) {
10577 $mime = 'text/plain
';
10578 $imgmime = 'text.png
';
10580 $famime = 'file-text-o
';
10582 // Certificate files
10583 if (preg_match('/\.(crt|cer|key|pub)$/i
', $tmpfile)) {
10584 $mime = 'text/plain
';
10585 $imgmime = 'text.png
';
10586 $famime = 'file-text-o
';
10588 // XML based (HTML/XML/XAML)
10589 if (preg_match('/\.(html|htm|shtml)$/i
', $tmpfile)) {
10590 $mime = 'text/html
';
10591 $imgmime = 'html.png
';
10593 $famime = 'file-text-o
';
10595 if (preg_match('/\.(xml|xhtml)$/i
', $tmpfile)) {
10596 $mime = 'text/xml
';
10597 $imgmime = 'other.png
';
10599 $famime = 'file-text-o
';
10601 if (preg_match('/\.xaml$/i
', $tmpfile)) {
10602 $mime = 'text/xml
';
10603 $imgmime = 'other.png
';
10605 $famime = 'file-text-o
';
10608 if (preg_match('/\.bas$/i
', $tmpfile)) {
10609 $mime = 'text/plain
';
10610 $imgmime = 'text.png
';
10612 $famime = 'file-code-o
';
10614 if (preg_match('/\.(c)$/i
', $tmpfile)) {
10615 $mime = 'text/plain
';
10616 $imgmime = 'text.png
';
10618 $famime = 'file-code-o
';
10620 if (preg_match('/\.(cpp)$/i
', $tmpfile)) {
10621 $mime = 'text/plain
';
10622 $imgmime = 'text.png
';
10624 $famime = 'file-code-o
';
10626 if (preg_match('/\.cs$/i
', $tmpfile)) {
10627 $mime = 'text/plain
';
10628 $imgmime = 'text.png
';
10630 $famime = 'file-code-o
';
10632 if (preg_match('/\.(h)$/i
', $tmpfile)) {
10633 $mime = 'text/plain
';
10634 $imgmime = 'text.png
';
10636 $famime = 'file-code-o
';
10638 if (preg_match('/\.(java|jsp)$/i
', $tmpfile)) {
10639 $mime = 'text/plain
';
10640 $imgmime = 'text.png
';
10642 $famime = 'file-code-o
';
10644 if (preg_match('/\.php([0-9]{1})?$/i
', $tmpfile)) {
10645 $mime = 'text/plain
';
10646 $imgmime = 'php.png
';
10648 $famime = 'file-code-o
';
10650 if (preg_match('/\.phtml$/i
', $tmpfile)) {
10651 $mime = 'text/plain
';
10652 $imgmime = 'php.png
';
10654 $famime = 'file-code-o
';
10656 if (preg_match('/\.(pl|pm)$/i
', $tmpfile)) {
10657 $mime = 'text/plain
';
10658 $imgmime = 'pl.png
';
10660 $famime = 'file-code-o
';
10662 if (preg_match('/\.sql$/i
', $tmpfile)) {
10663 $mime = 'text/plain
';
10664 $imgmime = 'text.png
';
10666 $famime = 'file-code-o
';
10668 if (preg_match('/\.js$/i
', $tmpfile)) {
10669 $mime = 'text/x-javascript
';
10670 $imgmime = 'jscript.png
';
10672 $famime = 'file-code-o
';
10675 if (preg_match('/\.odp$/i
', $tmpfile)) {
10676 $mime = 'application/vnd.oasis.opendocument.presentation
';
10677 $imgmime = 'ooffice.png
';
10678 $famime = 'file-powerpoint-o
';
10680 if (preg_match('/\.ods$/i
', $tmpfile)) {
10681 $mime = 'application/vnd.oasis.opendocument.spreadsheet
';
10682 $imgmime = 'ooffice.png
';
10683 $famime = 'file-excel-o
';
10685 if (preg_match('/\.odt$/i
', $tmpfile)) {
10686 $mime = 'application/vnd.oasis.opendocument.text
';
10687 $imgmime = 'ooffice.png
';
10688 $famime = 'file-word-o
';
10691 if (preg_match('/\.mdb$/i
', $tmpfile)) {
10692 $mime = 'application/msaccess
';
10693 $imgmime = 'mdb.png
';
10694 $famime = 'file-o
';
10696 if (preg_match('/\.doc[xm]?$/i
', $tmpfile)) {
10697 $mime = 'application/msword
';
10698 $imgmime = 'doc.png
';
10699 $famime = 'file-word-o
';
10701 if (preg_match('/\.dot[xm]?$/i
', $tmpfile)) {
10702 $mime = 'application/msword
';
10703 $imgmime = 'doc.png
';
10704 $famime = 'file-word-o
';
10706 if (preg_match('/\.xlt(x)?$/i
', $tmpfile)) {
10707 $mime = 'application/vnd.ms-excel
';
10708 $imgmime = 'xls.png
';
10709 $famime = 'file-excel-o
';
10711 if (preg_match('/\.xla(m)?$/i
', $tmpfile)) {
10712 $mime = 'application/vnd.ms-excel
';
10713 $imgmime = 'xls.png
';
10714 $famime = 'file-excel-o
';
10716 if (preg_match('/\.xls$/i
', $tmpfile)) {
10717 $mime = 'application/vnd.ms-excel
';
10718 $imgmime = 'xls.png
';
10719 $famime = 'file-excel-o
';
10721 if (preg_match('/\.xls[bmx]$/i
', $tmpfile)) {
10722 $mime = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
';
10723 $imgmime = 'xls.png
';
10724 $famime = 'file-excel-o
';
10726 if (preg_match('/\.pps[mx]?$/i
', $tmpfile)) {
10727 $mime = 'application/vnd.ms-powerpoint
';
10728 $imgmime = 'ppt.png
';
10729 $famime = 'file-powerpoint-o
';
10731 if (preg_match('/\.ppt[mx]?$/i
', $tmpfile)) {
10732 $mime = 'application/x-mspowerpoint
';
10733 $imgmime = 'ppt.png
';
10734 $famime = 'file-powerpoint-o
';
10737 if (preg_match('/\.pdf$/i
', $tmpfile)) {
10738 $mime = 'application/pdf
';
10739 $imgmime = 'pdf.png
';
10740 $famime = 'file-pdf-o
';
10743 if (preg_match('/\.bat$/i
', $tmpfile)) {
10744 $mime = 'text/x-bat
';
10745 $imgmime = 'script.png
';
10747 $famime = 'file-code-o
';
10749 if (preg_match('/\.sh$/i
', $tmpfile)) {
10750 $mime = 'text/x-sh
';
10751 $imgmime = 'script.png
';
10753 $famime = 'file-code-o
';
10755 if (preg_match('/\.ksh$/i
', $tmpfile)) {
10756 $mime = 'text/x-ksh
';
10757 $imgmime = 'script.png
';
10759 $famime = 'file-code-o
';
10761 if (preg_match('/\.bash$/i
', $tmpfile)) {
10762 $mime = 'text/x-bash
';
10763 $imgmime = 'script.png
';
10765 $famime = 'file-code-o
';
10768 if (preg_match('/\.ico$/i
', $tmpfile)) {
10769 $mime = 'image/x-icon
';
10770 $imgmime = 'image.png
';
10771 $famime = 'file-image-o
';
10773 if (preg_match('/\.(jpg|jpeg)$/i
', $tmpfile)) {
10774 $mime = 'image/jpeg
';
10775 $imgmime = 'image.png
';
10776 $famime = 'file-image-o
';
10778 if (preg_match('/\.png$/i
', $tmpfile)) {
10779 $mime = 'image/png
';
10780 $imgmime = 'image.png
';
10781 $famime = 'file-image-o
';
10783 if (preg_match('/\.gif$/i
', $tmpfile)) {
10784 $mime = 'image/gif
';
10785 $imgmime = 'image.png
';
10786 $famime = 'file-image-o
';
10788 if (preg_match('/\.bmp$/i
', $tmpfile)) {
10789 $mime = 'image/bmp
';
10790 $imgmime = 'image.png
';
10791 $famime = 'file-image-o
';
10793 if (preg_match('/\.(tif|tiff)$/i
', $tmpfile)) {
10794 $mime = 'image/tiff
';
10795 $imgmime = 'image.png
';
10796 $famime = 'file-image-o
';
10798 if (preg_match('/\.svg$/i
', $tmpfile)) {
10799 $mime = 'image/svg+xml
';
10800 $imgmime = 'image.png
';
10801 $famime = 'file-image-o
';
10803 if (preg_match('/\.webp$/i
', $tmpfile)) {
10804 $mime = 'image/webp
';
10805 $imgmime = 'image.png
';
10806 $famime = 'file-image-o
';
10809 if (preg_match('/\.vcs$/i
', $tmpfile)) {
10810 $mime = 'text/calendar
';
10811 $imgmime = 'other.png
';
10812 $famime = 'file-text-o
';
10814 if (preg_match('/\.ics$/i
', $tmpfile)) {
10815 $mime = 'text/calendar
';
10816 $imgmime = 'other.png
';
10817 $famime = 'file-text-o
';
10820 if (preg_match('/\.torrent$/i
', $tmpfile)) {
10821 $mime = 'application/x-bittorrent
';
10822 $imgmime = 'other.png
';
10823 $famime = 'file-o
';
10826 if (preg_match('/\.(mp3|ogg|au|wav|wma|mid)$/i
', $tmpfile)) {
10828 $imgmime = 'audio.png
';
10829 $famime = 'file-audio-o
';
10832 if (preg_match('/\.mp4$/i
', $tmpfile)) {
10833 $mime = 'video/mp4
';
10834 $imgmime = 'video.png
';
10835 $famime = 'file-video-o
';
10837 if (preg_match('/\.ogv$/i
', $tmpfile)) {
10838 $mime = 'video/ogg
';
10839 $imgmime = 'video.png
';
10840 $famime = 'file-video-o
';
10842 if (preg_match('/\.webm$/i
', $tmpfile)) {
10843 $mime = 'video/webm
';
10844 $imgmime = 'video.png
';
10845 $famime = 'file-video-o
';
10847 if (preg_match('/\.avi$/i
', $tmpfile)) {
10848 $mime = 'video/x-msvideo
';
10849 $imgmime = 'video.png
';
10850 $famime = 'file-video-o
';
10852 if (preg_match('/\.divx$/i
', $tmpfile)) {
10853 $mime = 'video/divx
';
10854 $imgmime = 'video.png
';
10855 $famime = 'file-video-o
';
10857 if (preg_match('/\.xvid$/i
', $tmpfile)) {
10858 $mime = 'video/xvid
';
10859 $imgmime = 'video.png
';
10860 $famime = 'file-video-o
';
10862 if (preg_match('/\.(wmv|mpg|mpeg)$/i
', $tmpfile)) {
10864 $imgmime = 'video.png
';
10865 $famime = 'file-video-o
';
10868 if (preg_match('/\.(zip|rar|gz|tgz|z|cab|bz2|7z|tar|lzh|zst)$/i
', $tmpfile)) {
10870 $imgmime = 'archive.png
';
10871 $famime = 'file-archive-o
';
10872 } // application/xxx where zzz is zip, ...
10874 if (preg_match('/\.(exe|com)$/i
', $tmpfile)) {
10875 $mime = 'application/octet-stream
';
10876 $imgmime = 'other.png
';
10877 $famime = 'file-o
';
10880 if (preg_match('/\.(dll|lib|o|so|a)$/i
', $tmpfile)) {
10882 $imgmime = 'library.png
';
10883 $famime = 'file-o
';
10886 if (preg_match('/\.err$/i
', $tmpfile)) {
10888 $imgmime = 'error.png
';
10889 $famime = 'file-text-o
';
10894 $tmp = explode('/
', $mime);
10895 return (!empty($tmp[1]) ? $tmp[1] : $tmp[0]);
10920function getDictionaryValue($tablename, $field, $id, $checkentity = false, $rowidfield = '
rowid')
10924 $tablename = preg_replace('/^
'.preg_quote(MAIN_DB_PREFIX, '/
').'/
', '', $tablename); // Clean name of table for backward compatibility.
10926 $dictvalues = (isset($conf->cache['dictvalues_
'.$tablename]) ? $conf->cache['dictvalues_
'.$tablename] : null);
10928 if (is_null($dictvalues)) {
10929 $dictvalues = array();
10931 $sql = "SELECT * FROM ".MAIN_DB_PREFIX.$tablename." WHERE 1 = 1"; // Here select * is allowed as it is generic code and we don't have list of fields
10932 if ($checkentity) {
10933 $sql .=
' AND entity IN (0,'.getEntity($tablename).
')';
10936 $resql = $db->query($sql);
10938 while ($obj = $db->fetch_object($resql)) {
10939 $dictvalues[$obj->{$rowidfield}] = $obj;
10945 $conf->cache[
'dictvalues_'.$tablename] = $dictvalues;
10948 if (!empty($dictvalues[$id])) {
10950 $tmp = $dictvalues[$id];
10951 return (property_exists($tmp, $field) ? $tmp->$field :
'');
10966 $stringcolor = str_replace(
'#',
'', $stringcolor);
10968 if (!empty($stringcolor)) {
10970 $tmp = explode(
',', $stringcolor);
10971 if (count($tmp) > 1) {
10976 $hexr = $stringcolor[0].$stringcolor[1];
10977 $hexg = $stringcolor[2].$stringcolor[3];
10978 $hexb = $stringcolor[4].$stringcolor[5];
10979 $r = hexdec($hexr);
10980 $g = hexdec($hexg);
10981 $b = hexdec($hexb);
10983 $bright = (max($r, $g, $b) + min($r, $g, $b)) / 510.0;
10984 if ($bright > 0.6) {
11005 if (empty($menuentry[
'enabled'])) {
11008 if ($type_user && $menuentry[
'module']) {
11009 $tmploops = explode(
'|', $menuentry[
'module']);
11011 foreach ($tmploops as $tmploop) {
11012 if (in_array($tmploop, $listofmodulesforexternal)) {
11021 if (!$menuentry[
'perms'] && $type_user) {
11024 if (!$menuentry[
'perms'] && !empty($conf->global->MAIN_MENU_HIDE_UNAUTHORIZED)) {
11027 if (!$menuentry[
'perms']) {
11042 return (ceil($n) % $x === 0) ? ceil($n) : round(($n + $x / 2) / $x) * $x;
11056function dolGetBadge($label, $html =
'', $type =
'primary', $mode =
'', $url =
'', $params = array())
11059 'class'=>
'badge '.(!empty($mode) ?
' badge-'.$mode :
'').(!empty($type) ?
' badge-'.$type :
'').(empty($params[
'css']) ?
'' :
' '.$params[
'css'])
11062 if (empty($html)) {
11066 if (!empty($url)) {
11067 $attr[
'href'] = $url;
11070 if ($mode ===
'dot') {
11071 $attr[
'class'] .=
' classfortooltip';
11072 $attr[
'title'] = $html;
11073 $attr[
'aria-label'] = $label;
11078 if (!empty($params[
'attr']) && is_array($params[
'attr'])) {
11079 foreach ($params[
'attr'] as $key => $value) {
11080 if ($key ==
'class') {
11081 $attr[
'class'] .=
' '.$value;
11082 } elseif ($key ==
'classOverride') {
11083 $attr[
'class'] = $value;
11085 $attr[$key] = $value;
11093 $attr = array_map(
'dol_escape_htmltag', $attr);
11095 $TCompiledAttr = array();
11096 foreach ($attr as $key => $value) {
11097 $TCompiledAttr[] = $key.
'="'.$value.
'"';
11100 $compiledAttributes = !empty($TCompiledAttr) ?implode(
' ', $TCompiledAttr) :
'';
11102 $tag = !empty($url) ?
'a' :
'span';
11104 return '<'.$tag.
' '.$compiledAttributes.
'>'.$html.
'</'.$tag.
'>';
11120function dolGetStatus($statusLabel =
'', $statusLabelShort =
'', $html =
'', $statusType =
'status0', $displayMode = 0, $url =
'', $params = array())
11125 $dolGetBadgeParams = array();
11127 if (!empty($params[
'badgeParams'])) {
11128 $dolGetBadgeParams = $params[
'badgeParams'];
11132 if ($displayMode == 0) {
11133 $return = !empty($html) ? $html : (empty($conf->dol_optimize_smallscreen) ? $statusLabel : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort));
11134 } elseif ($displayMode == 1) {
11135 $return = !empty($html) ? $html : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort);
11136 } elseif (!empty($conf->global->MAIN_STATUS_USES_IMAGES)) {
11139 $htmlLabel = (in_array($displayMode, array(1, 2, 5)) ?
'<span class="hideonsmartphone">' :
'').(!empty($html) ? $html : $statusLabel).(in_array($displayMode, array(1, 2, 5)) ?
'</span>' :
'');
11140 $htmlLabelShort = (in_array($displayMode, array(1, 2, 5)) ?
'<span class="hideonsmartphone">' :
'').(!empty($html) ? $html : (!empty($statusLabelShort) ? $statusLabelShort : $statusLabel)).(in_array($displayMode, array(1, 2, 5)) ?
'</span>' :
'');
11143 if (!empty($conf->dol_optimize_smallscreen)) {
11144 if ($displayMode == 0) {
11146 } elseif ($displayMode == 4) {
11148 } elseif ($displayMode == 6) {
11154 $statusImg = array(
11155 'status0' =>
'statut0',
11156 'status1' =>
'statut1',
11157 'status2' =>
'statut2',
11158 'status3' =>
'statut3',
11159 'status4' =>
'statut4',
11160 'status5' =>
'statut5',
11161 'status6' =>
'statut6',
11162 'status7' =>
'statut7',
11163 'status8' =>
'statut8',
11164 'status9' =>
'statut9'
11167 if (!empty($statusImg[$statusType])) {
11168 $htmlImg =
img_picto($statusLabel, $statusImg[$statusType]);
11170 $htmlImg =
img_picto($statusLabel, $statusType);
11173 if ($displayMode === 2) {
11174 $return = $htmlImg.
' '.$htmlLabelShort;
11175 } elseif ($displayMode === 3) {
11176 $return = $htmlImg;
11177 } elseif ($displayMode === 4) {
11178 $return = $htmlImg.
' '.$htmlLabel;
11179 } elseif ($displayMode === 5) {
11180 $return = $htmlLabelShort.
' '.$htmlImg;
11182 $return = $htmlLabel.
' '.$htmlImg;
11184 } elseif (empty($conf->global->MAIN_STATUS_USES_IMAGES) && !empty($displayMode)) {
11186 $statusLabelShort = (empty($statusLabelShort) ? $statusLabel : $statusLabelShort);
11188 $dolGetBadgeParams[
'attr'][
'class'] =
'badge-status';
11189 $dolGetBadgeParams[
'attr'][
'title'] = empty($params[
'tooltip']) ? $statusLabel : ($params[
'tooltip'] !=
'no' ? $params[
'tooltip'] :
'');
11191 if ($displayMode == 3) {
11192 $return = dolGetBadge((empty($conf->dol_optimize_smallscreen) ? $statusLabel : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort)),
'', $statusType,
'dot', $url, $dolGetBadgeParams);
11193 } elseif ($displayMode === 5) {
11194 $return = dolGetBadge($statusLabelShort, $html, $statusType,
'', $url, $dolGetBadgeParams);
11196 $return = dolGetBadge((empty($conf->dol_optimize_smallscreen) ? $statusLabel : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort)), $html, $statusType,
'', $url, $dolGetBadgeParams);
11238function dolGetButtonAction($label, $text =
'', $actionType =
'default', $url =
'', $id =
'', $userRight = 1, $params = array())
11240 global $hookmanager, $action, $object, $langs;
11243 if (is_array($url)) {
11244 $out =
'<div class="dropdown inline-block dropdown-holder">';
11245 $out .=
'<a style="margin-right: auto;" class="dropdown-toggle butAction" data-toggle="dropdown">'.$label.
'</a>';
11246 $out .=
'<div class="dropdown-content">';
11247 foreach ($url as $subbutton) {
11248 if ($subbutton[
'enabled'] && $subbutton[
'perm']) {
11249 if (!empty($subbutton[
'lang'])) {
11250 $langs->load($subbutton[
'lang']);
11252 $out .=
dolGetButtonAction(
'', $langs->trans($subbutton[
'label']),
'default', DOL_URL_ROOT.$subbutton[
'url'].(empty($params[
'backtopage']) ?
'' :
'&backtopage='.urlencode($params[
'backtopage'])),
'', 1, array(
'isDropDown' =>
true));
11262 if (!empty($params[
'isDropdown']))
11263 $class =
"dropdown-item";
11265 $class =
'butAction';
11266 if ($actionType ==
'danger' || $actionType ==
'delete') {
11267 $class =
'butActionDelete';
11268 if (!empty($url) && strpos($url,
'token=') ===
false) $url .=
'&token='.
newToken();
11273 'href' => empty($url) ?
'' : $url,
11277 if (empty($text)) {
11279 $attr[
'title'] =
'';
11281 $attr[
'title'] = $label;
11282 $attr[
'aria-label'] = $label;
11285 if (empty($userRight)) {
11286 $attr[
'class'] =
'butActionRefused';
11287 $attr[
'href'] =
'';
11288 $attr[
'title'] = (($label && $text && $label != $text) ? $label : $langs->trans(
'NotEnoughPermissions'));
11296 if (!empty($params[
'attr']) && is_array($params[
'attr'])) {
11297 foreach ($params[
'attr'] as $key => $value) {
11298 if ($key ==
'class') {
11299 $attr[
'class'] .=
' '.$value;
11300 } elseif ($key ==
'classOverride') {
11301 $attr[
'class'] = $value;
11303 $attr[$key] = $value;
11309 if (!empty($attr[
'title']) && !empty($attr[
'class']) && strpos($attr[
'class'],
'classfortooltip') ===
false) {
11310 $attr[
'class'].=
' classfortooltip';
11314 if ($userRight && !empty($params[
'confirm'])) {
11315 if (!is_array($params[
'confirm'])) {
11316 $params[
'confirm'] = array();
11319 if (empty($params[
'confirm'][
'url'])) {
11320 $params[
'confirm'][
'url'] = $url . (strpos($url,
'?') > 0 ?
'&' :
'?') .
'confirm=yes';
11324 $attr[
'data-confirm-url'] = $params[
'confirm'][
'url'];
11325 $attr[
'data-confirm-title'] = !empty($params[
'confirm'][
'title']) ? $params[
'confirm'][
'title'] : $langs->trans(
'ConfirmBtnCommonTitle', $label);
11326 $attr[
'data-confirm-content'] = !empty($params[
'confirm'][
'content']) ? $params[
'confirm'][
'content'] : $langs->trans(
'ConfirmBtnCommonContent', $label);
11327 $attr[
'data-confirm-content'] = preg_replace(
"/\r|\n/",
"", $attr[
'data-confirm-content']);
11328 $attr[
'data-confirm-action-btn-label'] = !empty($params[
'confirm'][
'action-btn-label']) ? $params[
'confirm'][
'action-btn-label'] : $langs->trans(
'Confirm');
11329 $attr[
'data-confirm-cancel-btn-label'] = !empty($params[
'confirm'][
'cancel-btn-label']) ? $params[
'confirm'][
'cancel-btn-label'] : $langs->trans(
'CloseDialog');
11330 $attr[
'data-confirm-modal'] = !empty($params[
'confirm'][
'modal']) ? $params[
'confirm'][
'modal'] :
true;
11332 $attr[
'class'].=
' butActionConfirm';
11335 if (isset($attr[
'href']) && empty($attr[
'href'])) {
11336 unset($attr[
'href']);
11340 $attr = array_map(
'dol_escape_htmltag', $attr);
11342 $TCompiledAttr = array();
11343 foreach ($attr as $key => $value) {
11344 $TCompiledAttr[] = $key.
'= "'.$value.
'"';
11347 $compiledAttributes = empty($TCompiledAttr) ?
'' : implode(
' ', $TCompiledAttr);
11349 $tag = !empty($attr[
'href']) ?
'a' :
'span';
11352 $parameters = array(
11353 'TCompiledAttr' => $TCompiledAttr,
11354 'compiledAttributes' => $compiledAttributes,
11359 'actionType' => $actionType,
11362 'userRight' => $userRight,
11363 'params' => $params
11366 $reshook = $hookmanager->executeHooks(
'dolGetButtonAction', $parameters, $object, $action);
11367 if ($reshook < 0)
setEventMessages($hookmanager->error, $hookmanager->errors,
'errors');
11369 if (empty($reshook)) {
11371 return '<' . $tag .
' ' . $compiledAttributes .
'>' . $text .
'</' . $tag .
'>';
11373 return '<' . $tag .
' ' . $compiledAttributes .
'>' .
dol_escape_htmltag($text) .
'</' . $tag .
'>';
11376 return $hookmanager->resPrint;
11388 return '<span class="button-title-separator '.$moreClass.
'" ></span>';
11400 if (!empty($fieldValidationErrorMsg)) {
11401 $out.=
'<span class="field-error-icon classfortooltip" title="'.dol_escape_htmltag($fieldValidationErrorMsg, 1).
'" role="alert" >';
11402 $out.=
'<span class="fa fa-exclamation-circle" aria-hidden="true" ></span>';
11421function dolGetButtonTitle($label, $helpText =
'', $iconClass =
'fa fa-file', $url =
'', $id =
'', $status = 1, $params = array())
11423 global $langs, $conf, $user;
11426 if (!empty($conf->global->MAIN_BUTTON_HIDE_UNAUTHORIZED) && (!$user->admin) && $status <= 0) {
11430 $class =
'btnTitle';
11431 if (in_array($iconClass, array(
'fa fa-plus-circle',
'fa fa-plus-circle size15x',
'fa fa-comment-dots',
'fa fa-paper-plane'))) {
11432 $class .=
' btnTitlePlus';
11434 $useclassfortooltip = 1;
11436 if (!empty($params[
'morecss'])) {
11437 $class .=
' '.$params[
'morecss'];
11442 'href' => empty($url) ?
'' : $url
11445 if (!empty($helpText)) {
11447 } elseif (empty($attr[
'title']) && $label) {
11448 $attr[
'title'] = $label;
11449 $useclassfortooltip = 0;
11452 if ($status == 2) {
11453 $attr[
'class'] .=
' btnTitleSelected';
11454 } elseif ($status <= 0) {
11455 $attr[
'class'] .=
' refused';
11457 $attr[
'href'] =
'';
11459 if ($status == -1) {
11460 $attr[
'title'] =
dol_escape_htmltag($langs->transnoentitiesnoconv(
"FeatureDisabled"));
11461 } elseif ($status == 0) {
11462 $attr[
'title'] =
dol_escape_htmltag($langs->transnoentitiesnoconv(
"NotEnoughPermissions"));
11466 if (!empty($attr[
'title']) && $useclassfortooltip) {
11467 $attr[
'class'] .=
' classfortooltip';
11475 if (!empty($params[
'attr']) && is_array($params[
'attr'])) {
11476 foreach ($params[
'attr'] as $key => $value) {
11477 if ($key ==
'class') {
11478 $attr[
'class'] .=
' '.$value;
11479 } elseif ($key ==
'classOverride') {
11480 $attr[
'class'] = $value;
11482 $attr[$key] = $value;
11487 if (isset($attr[
'href']) && empty($attr[
'href'])) {
11488 unset($attr[
'href']);
11494 $attr = array_map(
'dol_escape_htmltag', $attr);
11496 $TCompiledAttr = array();
11497 foreach ($attr as $key => $value) {
11498 $TCompiledAttr[] = $key.
'="'.$value.
'"';
11501 $compiledAttributes = (empty($TCompiledAttr) ?
'' : implode(
' ', $TCompiledAttr));
11503 $tag = (empty($attr[
'href']) ?
'span' :
'a');
11505 $button =
'<'.$tag.
' '.$compiledAttributes.
'>';
11506 $button .=
'<span class="'.$iconClass.
' valignmiddle btnTitle-icon"></span>';
11507 if (!empty($params[
'forcenohideoftext'])) {
11508 $button .=
'<span class="valignmiddle text-plus-circle btnTitle-label'.(empty($params[
'forcenohideoftext']) ?
' hideonsmartphone' :
'').
'">'.$label.
'</span>';
11510 $button .=
'</'.$tag.
'>';
11531 $classfile = $classname = $classpath = $subdir = $dir_output =
'';
11534 $module = $element_type;
11535 $element = $element_type;
11536 $subelement = $element_type;
11539 if (preg_match(
'/^([^@]+)@([^@]+)$/i', $element_type, $regs)) {
11540 $element = $subelement = $regs[1];
11541 $module = $regs[2];
11546 if (preg_match(
'/^([^_]+)_([^_]+)/i', $element, $regs)) {
11547 $module = $element = $regs[1];
11548 $subelement = $regs[2];
11552 if ($element_type ==
"action") {
11553 $classpath =
'comm/action/class';
11554 $subelement =
'Actioncomm';
11555 $module =
'agenda';
11556 } elseif ($element_type ==
'cronjob') {
11557 $classpath =
'cron/class';
11559 } elseif ($element_type ==
'adherent_type') {
11560 $classpath =
'adherents/class';
11561 $classfile =
'adherent_type';
11562 $module =
'adherent';
11563 $subelement =
'adherent_type';
11564 $classname =
'AdherentType';
11565 } elseif ($element_type ==
'bank_account') {
11566 $classpath =
'compta/bank/class';
11568 $classfile =
'account';
11569 $classname =
'Account';
11570 } elseif ($element_type ==
'category') {
11571 $classpath =
'categories/class';
11572 $module =
'categorie';
11573 $subelement =
'categorie';
11574 } elseif ($element_type ==
'contact') {
11575 $classpath =
'contact/class';
11576 $classfile =
'contact';
11577 $module =
'societe';
11578 $subelement =
'contact';
11579 } elseif ($element_type ==
'stock') {
11580 $classpath =
'product/stock/class';
11581 $classfile =
'entrepot';
11582 $classname =
'Entrepot';
11583 } elseif ($element_type ==
'project') {
11584 $classpath =
'projet/class';
11585 $module =
'projet';
11586 } elseif ($element_type ==
'project_task') {
11587 $classpath =
'projet/class';
11588 $module =
'projet';
11589 $subelement =
'task';
11590 } elseif ($element_type ==
'facture' || $element_type ==
'invoice') {
11591 $classpath =
'compta/facture/class';
11592 $module =
'facture';
11593 $subelement =
'facture';
11594 } elseif ($element_type ==
'commande' || $element_type ==
'order') {
11595 $classpath =
'commande/class';
11596 $module =
'commande';
11597 $subelement =
'commande';
11598 } elseif ($element_type ==
'propal') {
11599 $classpath =
'comm/propal/class';
11600 } elseif ($element_type ==
'shipping') {
11601 $classpath =
'expedition/class';
11602 $classfile =
'expedition';
11603 $classname =
'Expedition';
11604 $module =
'expedition';
11605 } elseif ($element_type ==
'supplier_proposal') {
11606 $classpath =
'supplier_proposal/class';
11607 $module =
'supplier_proposal';
11608 $element =
'supplierproposal';
11609 $classfile =
'supplier_proposal';
11610 $subelement =
'supplierproposal';
11611 } elseif ($element_type ==
'shipping') {
11612 $classpath =
'expedition/class';
11613 $subelement =
'expedition';
11614 $module =
'expedition_bon';
11615 } elseif ($element_type ==
'delivery') {
11616 $classpath =
'delivery/class';
11617 $subelement =
'delivery';
11618 $module =
'delivery_note';
11619 } elseif ($element_type ==
'contract') {
11620 $classpath =
'contrat/class';
11621 $module =
'contrat';
11622 $subelement =
'contrat';
11623 } elseif ($element_type ==
'mailing') {
11624 $classpath =
'comm/mailing/class';
11625 $module =
'mailing';
11626 $classfile =
'mailing';
11627 $classname =
'Mailing';
11629 } elseif ($element_type ==
'member') {
11630 $classpath =
'adherents/class';
11631 $module =
'adherent';
11632 $subelement =
'adherent';
11633 } elseif ($element_type ==
'usergroup') {
11634 $classpath =
'user/class';
11636 } elseif ($element_type ==
'mo') {
11637 $classpath =
'mrp/class';
11642 } elseif ($element_type ==
'cabinetmed_cons') {
11643 $classpath =
'cabinetmed/class';
11644 $module =
'cabinetmed';
11645 $subelement =
'cabinetmedcons';
11646 } elseif ($element_type ==
'fichinter') {
11647 $classpath =
'fichinter/class';
11648 $module =
'ficheinter';
11649 $subelement =
'fichinter';
11650 } elseif ($element_type ==
'dolresource' || $element_type ==
'resource') {
11651 $classpath =
'resource/class';
11652 $module =
'resource';
11653 $subelement =
'dolresource';
11654 } elseif ($element_type ==
'propaldet') {
11655 $classpath =
'comm/propal/class';
11656 $module =
'propal';
11657 $subelement =
'propaleligne';
11658 } elseif ($element_type ==
'opensurvey_sondage') {
11659 $classpath =
'opensurvey/class';
11660 $module =
'opensurvey';
11661 $subelement =
'opensurveysondage';
11662 } elseif ($element_type ==
'order_supplier') {
11663 $classpath =
'fourn/class';
11664 $module =
'fournisseur';
11665 $classfile =
'fournisseur.commande';
11666 $element =
'order_supplier';
11668 $classname =
'CommandeFournisseur';
11669 } elseif ($element_type ==
'invoice_supplier') {
11670 $classpath =
'fourn/class';
11671 $module =
'fournisseur';
11672 $classfile =
'fournisseur.facture';
11673 $element =
'invoice_supplier';
11675 $classname =
'FactureFournisseur';
11676 } elseif ($element_type ==
"service") {
11677 $classpath =
'product/class';
11678 $subelement =
'product';
11679 } elseif ($element_type ==
'salary') {
11680 $classpath =
'salaries/class';
11681 $module =
'salaries';
11682 } elseif ($element_type ==
'productlot') {
11683 $module =
'productbatch';
11684 $classpath =
'product/stock/class';
11685 $classfile =
'productlot';
11686 $classname =
'Productlot';
11687 $element =
'productlot';
11689 } elseif ($element_type ==
'websitepage') {
11690 $classpath =
'website/class';
11691 $classfile =
'websitepage';
11692 $classname =
'Websitepage';
11693 $module =
'website';
11694 $subelement =
'websitepage';
11695 } elseif ($element_type ==
'fiscalyear') {
11696 $classpath =
'core/class';
11697 $module =
'accounting';
11698 $subelement =
'fiscalyear';
11699 } elseif ($element_type ==
'chargesociales') {
11700 $classpath =
'compta/sociales/class';
11702 } elseif ($element_type ==
'tva') {
11703 $classpath =
'compta/tva/class';
11708 if (empty($classfile)) {
11709 $classfile = strtolower($subelement);
11711 if (empty($classname)) {
11712 $classname = ucfirst($subelement);
11714 if (empty($classpath)) {
11715 $classpath = $module.
'/class';
11721 if ($module && isset($conf->$module)) {
11722 if (!empty($conf->$module->multidir_output[$conf->entity])) {
11723 $dir_output = $conf->$module->multidir_output[$conf->entity];
11724 } elseif (!empty($conf->$module->output[$conf->entity])) {
11725 $dir_output = $conf->$module->output[$conf->entity];
11726 } elseif (!empty($conf->$module->dir_output)) {
11727 $dir_output = $conf->$module->dir_output;
11732 if ($element ==
'order_supplier') {
11733 $dir_output = $conf->fournisseur->commande->dir_output;
11734 } elseif ($element ==
'invoice_supplier') {
11735 $dir_output = $conf->fournisseur->facture->dir_output;
11737 $dir_output .= $subdir;
11739 $element_properties = array(
11740 'module' => $module,
11741 'element' => $element,
11742 'subelement' => $subelement,
11743 'classpath' => $classpath,
11744 'classfile' => $classfile,
11745 'classname' => $classname,
11746 'dir_output' => $dir_output
11748 return $element_properties;
11768 if (is_array($element_prop) && isModEnabled($element_prop[
'module'])) {
11769 dol_include_once(
'/'.$element_prop[
'classpath'].
'/'.$element_prop[
'classfile'].
'.class.php');
11771 if (class_exists($element_prop[
'classname'])) {
11772 $classname = $element_prop[
'classname'];
11773 $objecttmp =
new $classname($db);
11774 $ret = $objecttmp->fetch($element_id, $element_ref);
11776 if (empty($objecttmp->module)) {
11777 $objecttmp->module = $element_prop[
'module'];
11798 if (preg_match(
'/\.(htm|html|js|phar|php|php\d+|phtml|pht|pl|py|cgi|ksh|sh|shtml|bash|bat|cmd|wpk|exe|dmg)$/i', $filename)) {
11814 return empty($_SESSION[
'newtoken']) ?
'' : $_SESSION[
'newtoken'];
11826 return isset($_SESSION[
'token']) ? $_SESSION[
'token'] :
'';
11838 if (empty($conf->cache[
'nonce'])) {
11842 return $conf->cache[
'nonce'];
11862 print
'<div class="div-table-responsive-no-min">';
11863 print
'<table class="noborder centpercent">';
11864 print
'<tr class="liste_titre">';
11866 print $emptyRows < 1 ?
'<th>' :
'<th colspan="'.($emptyRows + 1).
'">';
11868 print $langs->trans($header);
11871 if ($number > -1) {
11875 if (!empty($link)) {
11876 if (!empty($arguments)) {
11877 print
'<a href="'.DOL_URL_ROOT.
'/'.$link.
'?'.$arguments.
'">';
11879 print
'<a href="'.DOL_URL_ROOT.
'/'.$link.
'">';
11883 if ($number > -1) {
11884 print
'<span class="badge">'.$number.
'</span>';
11887 if (!empty($link)) {
11893 if ($number < 0 && !empty($link)) {
11894 print
'<th class="right">';
11896 if (!empty($arguments)) {
11897 print
'<a class="commonlink" href="'.DOL_URL_ROOT.
'/'.$link.
'?'.$arguments.
'">';
11899 print
'<a class="commonlink" href="'.DOL_URL_ROOT.
'/'.$link.
'">';
11902 print $langs->trans(
"FullList");
11923 if ($addLineBreak) {
11939function addSummaryTableLine($tableColumnCount, $num, $nbofloop = 0, $total = 0, $noneWord =
"None", $extraRightColumn =
false)
11944 print
'<tr class="oddeven">';
11945 print
'<td colspan="'.$tableColumnCount.
'" class="opacitymedium">'.$langs->trans($noneWord).
'</td>';
11950 if ($nbofloop === 0) {
11956 $colspan = $tableColumnCount;
11957 } elseif ($num > $nbofloop) {
11958 $colspan = $tableColumnCount;
11960 $colspan = $tableColumnCount - 1;
11963 if ($extraRightColumn) {
11967 print
'<tr class="liste_total">';
11969 if ($nbofloop > 0 && $num > $nbofloop) {
11970 print
'<td colspan="'.$colspan.
'" class="right">'.$langs->trans(
"XMoreLines", ($num - $nbofloop)).
'</td>';
11972 print
'<td colspan="'.$colspan.
'" class="right"> '.$langs->trans(
"Total").
'</td>';
11973 print
'<td class="right" width="100">'.price($total).
'</td>';
11976 if ($extraRightColumn) {
11995 if ($method == -1) {
11997 if (!empty($conf->global->MAIN_FORCE_READFILE_WITH_FREAD)) {
12000 if (!empty($conf->global->MAIN_FORCE_READFILE_WITH_STREAM_COPY)) {
12006 while (ob_get_level()) {
12011 if ($method == 0) {
12012 readfile($fullpath_original_file_osencoded);
12013 } elseif ($method == 1) {
12015 $handle = fopen($fullpath_original_file_osencoded,
"rb");
12016 while (!feof($handle)) {
12017 print fread($handle, 8192);
12020 } elseif ($method == 2) {
12022 $handle1 = fopen($fullpath_original_file_osencoded,
"rb");
12023 $handle2 = fopen(
"php://output",
"wb");
12024 stream_copy_to_stream($handle1, $handle2);
12049 if ($texttoshow ===
'none') {
12050 $result =
'<span class="clipboardCP'.($showonlyonhover ?
' clipboardCPShowOnHover' :
'').
'"><'.$tag.
' class="clipboardCPValue hidewithsize">'.
dol_escape_htmltag($valuetocopy, 1, 1).
'</'.$tag.
'><span class="clipboardCPValueToPrint"></span><span class="clipboardCPButton far fa-clipboard opacitymedium paddingleft paddingright"></span><span class="clipboardCPText"></span></span>';
12051 } elseif ($texttoshow) {
12052 $result =
'<span class="clipboardCP'.($showonlyonhover ?
' clipboardCPShowOnHover' :
'').
'"><'.$tag.
' class="clipboardCPValue hidewithsize">'.
dol_escape_htmltag($valuetocopy, 1, 1).
'</'.$tag.
'><span class="clipboardCPValueToPrint">'.
dol_escape_htmltag($texttoshow, 1, 1).
'</span><span class="clipboardCPButton far fa-clipboard opacitymedium paddingleft paddingright"></span><span class="clipboardCPText"></span></span>';
12054 $result =
'<span class="clipboardCP'.($showonlyonhover ?
' clipboardCPShowOnHover' :
'').
'"><'.$tag.
' class="clipboardCPValue">'.
dol_escape_htmltag($valuetocopy, 1, 1).
'</'.$tag.
'><span class="clipboardCPButton far fa-clipboard opacitymedium paddingleft paddingright"></span><span class="clipboardCPText"></span></span>';
12069 $result = json_decode($stringtodecode);
12070 if ($result ===
null) {
12071 $result = unserialize($stringtodecode);
12093 if (!preg_match(
'/^\(.*\)$/', $filter)) {
12094 $filter =
'(' . $filter .
')';
12097 $regexstring =
'\(([a-zA-Z0-9_\.]+:[<>!=insotlke]+:[^\(\)]+)\)';
12103 return 'Filter syntax error - '.$errorstr;
12108 $t = preg_replace_callback(
'/'.$regexstring.
'/i',
'dolForgeDummyCriteriaCallback', $filter);
12109 $t = str_replace(array(
'and',
'or',
'AND',
'OR',
' '),
'', $t);
12111 if (preg_match(
'/[^\(\)]/', $t)) {
12112 $errorstr =
'Bad syntax of the search string';
12116 return 'Filter syntax error - '.$errorstr;
12120 return ($noand ?
"" :
" AND ").($nopar ?
"" :
'(').preg_replace_callback(
'/'.$regexstring.
'/i',
'dolForgeCriteriaCallback', $filter).($nopar ?
"" :
')');
12134 $tmp = $sqlfilters;
12135 $i = 0; $nb = strlen($tmp);
12138 if ($tmp[$i] ==
'(') {
12141 if ($tmp[$i] ==
')') {
12144 if ($counter < 0) {
12145 $error =
"Wrond balance of parenthesis in sqlfilters=".$sqlfilters;
12164 if (empty($matches[1])) {
12167 $tmp = explode(
':', $matches[1]);
12168 if (count($tmp) < 3) {
12188 if (empty($matches[1])) {
12191 $tmp = explode(
':', $matches[1]);
12192 if (count($tmp) < 3) {
12196 $operand = preg_replace(
'/[^a-z0-9\._]/i',
'', trim($tmp[0]));
12198 $operator = strtoupper(preg_replace(
'/[^a-z<>!=]/i',
'', trim($tmp[1])));
12200 if ($operator ==
'NOTLIKE') {
12201 $operator =
'NOT LIKE';
12203 if ($operator ==
'ISNOT') {
12204 $operator =
'IS NOT';
12206 if ($operator ==
'!=') {
12210 $tmpescaped = $tmp[2];
12213 if ($operator ==
'IN') {
12215 $tmpescaped =
'('.$db->escape($db->sanitize($tmpescaped, 1, 0)).
')';
12219 } elseif ($operator ==
'LIKE' || $operator ==
'NOT LIKE') {
12220 if (preg_match(
'/^\'(.*)\'$/', $tmpescaped, $regbis)) {
12221 $tmpescaped = $regbis[1];
12224 $tmpescaped =
"'".$db->escape($tmpescaped).
"'";
12225 } elseif (preg_match(
'/^\'(.*)\'$/', $tmpescaped, $regbis)) {
12226 $tmpescaped =
"'".$db->escape($regbis[1]).
"'";
12228 if (strtoupper($tmpescaped) ==
'NULL') {
12229 $tmpescaped =
'NULL';
12230 } elseif (is_int($tmpescaped)) {
12231 $tmpescaped = (int) $tmpescaped;
12233 $tmpescaped = (float) $tmpescaped;
12237 return '('.$db->escape($operand).
' '.strtoupper($operator).
' '.$tmpescaped.
')';
12251 global $conf, $langs;
12252 $out =
'<!-- timeline icon -->'.
"\n";
12253 $iconClass =
'fa fa-comments';
12258 if ($histo[$key][
'percent'] == -1) {
12259 $colorClass =
'timeline-icon-not-applicble';
12260 $pictoTitle = $langs->trans(
'StatusNotApplicable');
12261 } elseif ($histo[$key][
'percent'] == 0) {
12262 $colorClass =
'timeline-icon-todo';
12263 $pictoTitle = $langs->trans(
'StatusActionToDo').
' (0%)';
12264 } elseif ($histo[$key][
'percent'] > 0 && $histo[$key][
'percent'] < 100) {
12265 $colorClass =
'timeline-icon-in-progress';
12266 $pictoTitle = $langs->trans(
'StatusActionInProcess').
' ('.$histo[$key][
'percent'].
'%)';
12267 } elseif ($histo[$key][
'percent'] >= 100) {
12268 $colorClass =
'timeline-icon-done';
12269 $pictoTitle = $langs->trans(
'StatusActionDone').
' (100%)';
12272 if ($actionstatic->code ==
'AC_TICKET_CREATE') {
12273 $iconClass =
'fa fa-ticket';
12274 } elseif ($actionstatic->code ==
'AC_TICKET_MODIFY') {
12275 $iconClass =
'fa fa-pencilxxx';
12276 } elseif (preg_match(
'/^TICKET_MSG/', $actionstatic->code)) {
12277 $iconClass =
'fa fa-comments';
12278 } elseif (preg_match(
'/^TICKET_MSG_PRIVATE/', $actionstatic->code)) {
12279 $iconClass =
'fa fa-mask';
12280 } elseif (!empty($conf->global->AGENDA_USE_EVENT_TYPE)) {
12281 if ($actionstatic->type_picto) {
12282 $img_picto =
img_picto(
'', $actionstatic->type_picto);
12284 if ($actionstatic->type_code ==
'AC_RDV') {
12285 $iconClass =
'fa fa-handshake';
12286 } elseif ($actionstatic->type_code ==
'AC_TEL') {
12287 $iconClass =
'fa fa-phone';
12288 } elseif ($actionstatic->type_code ==
'AC_FAX') {
12289 $iconClass =
'fa fa-fax';
12290 } elseif ($actionstatic->type_code ==
'AC_EMAIL') {
12291 $iconClass =
'fa fa-envelope';
12292 } elseif ($actionstatic->type_code ==
'AC_INT') {
12293 $iconClass =
'fa fa-shipping-fast';
12294 } elseif ($actionstatic->type_code ==
'AC_OTH_AUTO') {
12295 $iconClass =
'fa fa-robot';
12296 } elseif (!preg_match(
'/_AUTO/', $actionstatic->type_code)) {
12297 $iconClass =
'fa fa-robot';
12302 $out .=
'<i class="'.$iconClass.
' '.$colorClass.
'" title="'.$pictoTitle.
'">'.$img_picto.
'</i>'.
"\n";
12316 $documents = array();
12318 $sql =
'SELECT ecm.rowid as id, ecm.src_object_type, ecm.src_object_id, ecm.filepath, ecm.filename';
12319 $sql .=
' FROM '.MAIN_DB_PREFIX.
'ecm_files ecm';
12320 $sql .=
" WHERE ecm.filepath = 'agenda/".((int) $object->id).
"'";
12322 $sql .=
' ORDER BY ecm.position ASC';
12324 $resql = $db->query($sql);
12326 if ($db->num_rows($resql)) {
12327 while ($obj = $db->fetch_object($resql)) {
12328 $documents[$obj->id] = $obj;
12355function show_actions_messaging($conf, $langs, $db, $filterobj, $objcon =
'', $noprint = 0, $actioncode =
'', $donetodo =
'done', $filters = array(), $sortfield =
'a.datep,a.id', $sortorder =
'DESC')
12357 global $user, $conf;
12360 global $param, $massactionbutton;
12365 if (!is_object($filterobj) && !is_object($objcon)) {
12373 $sortfield_list = explode(
',', $sortfield);
12374 $sortfield_label_list = array(
'a.id' =>
'id',
'a.datep' =>
'dp',
'a.percent' =>
'percent');
12375 $sortfield_new_list = array();
12376 foreach ($sortfield_list as $sortfield_value) {
12377 $sortfield_new_list[] = $sortfield_label_list[trim($sortfield_value)];
12379 $sortfield_new = implode(
',', $sortfield_new_list);
12381 if (isModEnabled(
'agenda')) {
12383 if (is_object($objcon) && $objcon->id > 0) {
12384 $sql =
"SELECT DISTINCT a.id, a.label as label,";
12386 $sql =
"SELECT a.id, a.label as label,";
12388 $sql .=
" a.datep as dp,";
12389 $sql .=
" a.note as message,";
12390 $sql .=
" a.datep2 as dp2,";
12391 $sql .=
" a.percent as percent, 'action' as type,";
12392 $sql .=
" a.fk_element, a.elementtype,";
12393 $sql .=
" a.fk_contact,";
12394 $sql .=
" a.email_from as msg_from,";
12395 $sql .=
" c.code as acode, c.libelle as alabel, c.picto as apicto,";
12396 $sql .=
" u.rowid as user_id, u.login as user_login, u.photo as user_photo, u.firstname as user_firstname, u.lastname as user_lastname";
12397 if (is_object($filterobj) && get_class($filterobj) ==
'Societe') {
12398 $sql .=
", sp.lastname, sp.firstname";
12399 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
12400 $sql .=
", m.lastname, m.firstname";
12401 } elseif (is_object($filterobj) && get_class($filterobj) ==
'CommandeFournisseur') {
12403 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Product') {
12405 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
12407 } elseif (is_object($filterobj) && get_class($filterobj) ==
'BOM') {
12409 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Contrat') {
12412 $sql .=
" FROM ".MAIN_DB_PREFIX.
"actioncomm as a";
12413 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"user as u on u.rowid = a.fk_user_action";
12414 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"c_actioncomm as c ON a.fk_action = c.id";
12416 $force_filter_contact =
false;
12417 if (is_object($objcon) && $objcon->id > 0) {
12418 $force_filter_contact =
true;
12419 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"actioncomm_resources as r ON a.id = r.fk_actioncomm";
12420 $sql .=
" AND r.element_type = '".$db->escape($objcon->table_element).
"' AND r.fk_element = ".((int) $objcon->id);
12423 if (is_object($filterobj) && get_class($filterobj) ==
'Societe') {
12424 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"socpeople as sp ON a.fk_contact = sp.rowid";
12425 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Dolresource') {
12426 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"element_resources as er";
12427 $sql .=
" ON er.resource_type = 'dolresource'";
12428 $sql .=
" AND er.element_id = a.id";
12429 $sql .=
" AND er.resource_id = ".((int) $filterobj->id);
12430 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
12431 $sql .=
", ".MAIN_DB_PREFIX.
"adherent as m";
12432 } elseif (is_object($filterobj) && get_class($filterobj) ==
'CommandeFournisseur') {
12433 $sql .=
", ".MAIN_DB_PREFIX.
"commande_fournisseur as o";
12434 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Product') {
12435 $sql .=
", ".MAIN_DB_PREFIX.
"product as o";
12436 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
12437 $sql .=
", ".MAIN_DB_PREFIX.
"ticket as o";
12438 } elseif (is_object($filterobj) && get_class($filterobj) ==
'BOM') {
12439 $sql .=
", ".MAIN_DB_PREFIX.
"bom_bom as o";
12440 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Contrat') {
12441 $sql .=
", ".MAIN_DB_PREFIX.
"contrat as o";
12444 $sql .=
" WHERE a.entity IN (".getEntity(
'agenda').
")";
12445 if ($force_filter_contact ===
false) {
12446 if (is_object($filterobj) && in_array(get_class($filterobj), array(
'Societe',
'Client',
'Fournisseur')) && $filterobj->id) {
12447 $sql .=
" AND a.fk_soc = ".((int) $filterobj->id);
12448 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Project' && $filterobj->id) {
12449 $sql .=
" AND a.fk_project = ".((int) $filterobj->id);
12450 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
12451 $sql .=
" AND a.fk_element = m.rowid AND a.elementtype = 'member'";
12452 if ($filterobj->id) {
12453 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
12455 } elseif (is_object($filterobj) && get_class($filterobj) ==
'CommandeFournisseur') {
12456 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'order_supplier'";
12457 if ($filterobj->id) {
12458 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
12460 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Product') {
12461 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'product'";
12462 if ($filterobj->id) {
12463 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
12465 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
12466 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'ticket'";
12467 if ($filterobj->id) {
12468 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
12470 } elseif (is_object($filterobj) && get_class($filterobj) ==
'BOM') {
12471 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'bom'";
12472 if ($filterobj->id) {
12473 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
12475 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Contrat') {
12476 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'contract'";
12477 if ($filterobj->id) {
12478 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
12484 if (!empty($actioncode)) {
12485 if (empty($conf->global->AGENDA_USE_EVENT_TYPE)) {
12486 if ($actioncode ==
'AC_NON_AUTO') {
12487 $sql .=
" AND c.type != 'systemauto'";
12488 } elseif ($actioncode ==
'AC_ALL_AUTO') {
12489 $sql .=
" AND c.type = 'systemauto'";
12491 if ($actioncode ==
'AC_OTH') {
12492 $sql .=
" AND c.type != 'systemauto'";
12493 } elseif ($actioncode ==
'AC_OTH_AUTO') {
12494 $sql .=
" AND c.type = 'systemauto'";
12498 if ($actioncode ==
'AC_NON_AUTO') {
12499 $sql .=
" AND c.type != 'systemauto'";
12500 } elseif ($actioncode ==
'AC_ALL_AUTO') {
12501 $sql .=
" AND c.type = 'systemauto'";
12503 $sql .=
" AND c.code = '".$db->escape($actioncode).
"'";
12507 if ($donetodo ==
'todo') {
12508 $sql .=
" AND ((a.percent >= 0 AND a.percent < 100) OR (a.percent = -1 AND a.datep > '".$db->idate($now).
"'))";
12509 } elseif ($donetodo ==
'done') {
12510 $sql .=
" AND (a.percent = 100 OR (a.percent = -1 AND a.datep <= '".$db->idate($now).
"'))";
12512 if (is_array($filters) && $filters[
'search_agenda_label']) {
12513 $sql .=
natural_search(
'a.label', $filters[
'search_agenda_label']);
12518 if (isModEnabled(
'mailing') && !empty($objcon->email)
12519 && (empty($actioncode) || $actioncode ==
'AC_OTH_AUTO' || $actioncode ==
'AC_EMAILING')) {
12520 $langs->load(
"mails");
12522 $sql2 =
"SELECT m.rowid as id, m.titre as label, mc.date_envoi as dp, mc.date_envoi as dp2, '100' as percent, 'mailing' as type";
12523 $sql2 .=
", null as fk_element, '' as elementtype, null as contact_id";
12524 $sql2 .=
", 'AC_EMAILING' as acode, '' as alabel, '' as apicto";
12525 $sql2 .=
", u.rowid as user_id, u.login as user_login, u.photo as user_photo, u.firstname as user_firstname, u.lastname as user_lastname";
12526 if (is_object($filterobj) && get_class($filterobj) ==
'Societe') {
12527 $sql2 .=
", '' as lastname, '' as firstname";
12528 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
12529 $sql2 .=
", '' as lastname, '' as firstname";
12530 } elseif (is_object($filterobj) && get_class($filterobj) ==
'CommandeFournisseur') {
12531 $sql2 .=
", '' as ref";
12532 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Product') {
12533 $sql2 .=
", '' as ref";
12534 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
12535 $sql2 .=
", '' as ref";
12537 $sql2 .=
" FROM ".MAIN_DB_PREFIX.
"mailing as m, ".MAIN_DB_PREFIX.
"mailing_cibles as mc, ".MAIN_DB_PREFIX.
"user as u";
12538 $sql2 .=
" WHERE mc.email = '".$db->escape($objcon->email).
"'";
12539 $sql2 .=
" AND mc.statut = 1";
12540 $sql2 .=
" AND u.rowid = m.fk_user_valid";
12541 $sql2 .=
" AND mc.fk_mailing=m.rowid";
12544 if (!empty($sql) && !empty($sql2)) {
12545 $sql = $sql.
" UNION ".$sql2;
12546 } elseif (empty($sql) && !empty($sql2)) {
12552 $sql .= $db->order($sortfield_new, $sortorder);
12554 dol_syslog(
"function.lib::show_actions_messaging", LOG_DEBUG);
12555 $resql = $db->query($sql);
12558 $num = $db->num_rows($resql);
12560 while ($i < $num) {
12561 $obj = $db->fetch_object($resql);
12563 if ($obj->type ==
'action') {
12565 $contactaction->id = $obj->id;
12566 $result = $contactaction->fetchResources();
12569 setEventMessage(
"actions.lib::show_actions_messaging Error fetch ressource",
'errors');
12575 if (($obj->percent >= 0 and $obj->percent < 100) || ($obj->percent == -1 && $obj->dp > $now)) {
12576 $tododone =
'todo';
12579 $histo[$numaction] = array(
12580 'type'=>$obj->type,
12581 'tododone'=>$tododone,
12583 'datestart'=>$db->jdate($obj->dp),
12584 'dateend'=>$db->jdate($obj->dp2),
12585 'note'=>$obj->label,
12586 'message'=>$obj->message,
12587 'percent'=>$obj->percent,
12589 'userid'=>$obj->user_id,
12590 'login'=>$obj->user_login,
12591 'userfirstname'=>$obj->user_firstname,
12592 'userlastname'=>$obj->user_lastname,
12593 'userphoto'=>$obj->user_photo,
12594 'msg_from'=>$obj->msg_from,
12596 'contact_id'=>$obj->fk_contact,
12597 'socpeopleassigned' => $contactaction->socpeopleassigned,
12598 'lastname' => (empty($obj->lastname) ?
'' : $obj->lastname),
12599 'firstname' => (empty($obj->firstname) ?
'' : $obj->firstname),
12600 'fk_element'=>$obj->fk_element,
12601 'elementtype'=>$obj->elementtype,
12603 'acode'=>$obj->acode,
12604 'alabel'=>$obj->alabel,
12605 'libelle'=>$obj->alabel,
12606 'apicto'=>$obj->apicto
12609 $histo[$numaction] = array(
12610 'type'=>$obj->type,
12611 'tododone'=>
'done',
12613 'datestart'=>$db->jdate($obj->dp),
12614 'dateend'=>$db->jdate($obj->dp2),
12615 'note'=>$obj->label,
12616 'message'=>$obj->message,
12617 'percent'=>$obj->percent,
12618 'acode'=>$obj->acode,
12620 'userid'=>$obj->user_id,
12621 'login'=>$obj->user_login,
12622 'userfirstname'=>$obj->user_firstname,
12623 'userlastname'=>$obj->user_lastname,
12624 'userphoto'=>$obj->user_photo
12639 if (!isModEnabled(
'agenda')) {
12640 $langs->loadLangs(array(
"admin",
"errors"));
12641 $out =
info_admin($langs->trans(
"WarningModuleXDisabledSoYouMayMissEventHere", $langs->transnoentitiesnoconv(
"Module2400Name")), 0, 0,
'warning');
12644 if (isModEnabled(
'agenda') || (isModEnabled(
'mailing') && !empty($objcon->email))) {
12645 $delay_warning = $conf->global->MAIN_DELAY_ACTIONS_TODO * 24 * 60 * 60;
12647 require_once DOL_DOCUMENT_ROOT.
'/comm/action/class/actioncomm.class.php';
12648 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
12649 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
12650 require_once DOL_DOCUMENT_ROOT.
'/contact/class/contact.class.php';
12655 $userstatic =
new User($db);
12656 $contactstatic =
new Contact($db);
12657 $userGetNomUrlCache = array();
12658 $contactGetNomUrlCache = array();
12660 $out .=
'<div class="filters-container" >';
12661 $out .=
'<form name="listactionsfilter" class="listactionsfilter" action="'.$_SERVER[
"PHP_SELF"].
'" method="POST">';
12662 $out .=
'<input type="hidden" name="token" value="'.newToken().
'">';
12664 if ($objcon && get_class($objcon) ==
'Contact' &&
12665 (is_null($filterobj) || get_class($filterobj) ==
'Societe')) {
12666 $out .=
'<input type="hidden" name="id" value="'.$objcon->id.
'" />';
12668 $out .=
'<input type="hidden" name="id" value="'.$filterobj->id.
'" />';
12670 if ($filterobj && get_class($filterobj) ==
'Societe') {
12671 $out .=
'<input type="hidden" name="socid" value="'.$filterobj->id.
'" />';
12676 $out .=
'<div class="div-table-responsive-no-min">';
12677 $out .=
'<table class="noborder borderbottom centpercent">';
12679 $out .=
'<tr class="liste_titre">';
12683 $out .=
'<th class="liste_titre width50 middle">';
12684 $searchpicto = $form->showFilterAndCheckAddButtons($massactionbutton ? 1 : 0,
'checkforselect', 1);
12685 $out .= $searchpicto;
12689 $out .=
getTitleFieldOfList(
'Date', 0, $_SERVER[
"PHP_SELF"],
'a.datep',
'', $param,
'', $sortfield, $sortorder,
'').
"\n";
12691 $out .=
'<th class="liste_titre"><strong class="hideonsmartphone">'.$langs->trans(
"Search").
' : </strong></th>';
12693 $out .=
'<th class="liste_titre"></th>';
12695 $out .=
'<th class="liste_titre">';
12696 $out .=
'<span class="fas fa-square inline-block fawidth30" style=" color: #ddd;" title="'.$langs->trans(
"ActionType").
'"></span>';
12698 $out .=
$formactions->select_type_actions($actioncode,
"actioncode",
'', empty($conf->global->AGENDA_USE_EVENT_TYPE) ? 1 : -1, 0, 0, 1,
'minwidth200imp');
12700 $out .=
'<th class="liste_titre maxwidth100onsmartphone">';
12701 $out .=
'<input type="text" class="maxwidth100onsmartphone" name="search_agenda_label" value="'.$filters[
'search_agenda_label'].
'" placeholder="'.$langs->trans(
"Label").
'">';
12706 $out .=
'<th class="liste_titre width50 middle">';
12707 $searchpicto = $form->showFilterAndCheckAddButtons($massactionbutton ? 1 : 0,
'checkforselect', 1);
12708 $out .= $searchpicto;
12715 $out .=
'</table>';
12722 $out .=
'<ul class="timeline">';
12726 if (get_class($filterobj) ==
'Societe') {
12727 $tmp .=
'<a href="'.DOL_URL_ROOT.
'/comm/action/list.php?mode=show_list&socid='.$filterobj->id.
'&status=done">';
12729 $tmp .= ($donetodo !=
'done' ? $langs->trans(
"ActionsToDoShort") :
'');
12730 $tmp .= ($donetodo !=
'done' && $donetodo !=
'todo' ?
' / ' :
'');
12731 $tmp .= ($donetodo !=
'todo' ? $langs->trans(
"ActionsDoneShort") :
'');
12733 if (get_class($filterobj) ==
'Societe') {
12744 $actualCycleDate =
false;
12747 foreach ($histo as $key => $value) {
12748 $actionstatic->fetch($histo[$key][
'id']);
12750 $actionstatic->type_picto = $histo[$key][
'apicto'];
12751 $actionstatic->type_code = $histo[$key][
'acode'];
12753 $url = DOL_URL_ROOT.
'/comm/action/card.php?id='.$histo[$key][
'id'];
12755 $tmpa =
dol_getdate($histo[$key][
'datestart'],
false);
12756 if ($actualCycleDate !== $tmpa[
'year'].
'-'.$tmpa[
'yday']) {
12757 $actualCycleDate = $tmpa[
'year'].
'-'.$tmpa[
'yday'];
12758 $out .=
'<!-- timeline time label -->';
12759 $out .=
'<li class="time-label">';
12760 $out .=
'<span class="timeline-badge-date">';
12761 $out .=
dol_print_date($histo[$key][
'datestart'],
'daytext',
'tzuserrel', $langs);
12764 $out .=
'<!-- /.timeline-label -->';
12768 $out .=
'<!-- timeline item -->'.
"\n";
12769 $out .=
'<li class="timeline-code-'.strtolower($actionstatic->code).
'">';
12773 $out .=
'<div class="timeline-item">'.
"\n";
12775 $out .=
'<span class="timeline-header-action">';
12777 if (isset($histo[$key][
'type']) && $histo[$key][
'type'] ==
'mailing') {
12778 $out .=
'<a class="timeline-btn" href="'.DOL_URL_ROOT.
'/comm/mailing/card.php?id='.$histo[$key][
'id'].
'">'.
img_object($langs->trans(
"ShowEMailing"),
"email").
' ';
12779 $out .= $histo[$key][
'id'];
12782 $out .= $actionstatic->getNomUrl(1, -1,
'valignmiddle').
' ';
12785 if ($user->hasRight(
'agenda',
'allactions',
'create') ||
12786 (($actionstatic->authorid == $user->id || $actionstatic->userownerid == $user->id) && $user->hasRight(
'agenda',
'myactions',
'create'))) {
12787 $out .=
'<a class="timeline-btn" href="'.DOL_MAIN_URL_ROOT.
'/comm/action/card.php?action=edit&token='.
newToken().
'&id='.$actionstatic->id.
'&backtopage='.urlencode($_SERVER[
"PHP_SELF"].
'?'.$param).
'"><i class="fa fa-pencil" title="'.$langs->trans(
"Modify").
'" ></i></a>';
12792 $out .=
'<span class="time"><i class="fa fa-clock-o valignmiddle"></i> <span class="valignmiddle">';
12793 $out .=
dol_print_date($histo[$key][
'datestart'],
'dayhour',
'tzuserrel');
12794 if ($histo[$key][
'dateend'] && $histo[$key][
'dateend'] != $histo[$key][
'datestart']) {
12795 $tmpa =
dol_getdate($histo[$key][
'datestart'],
true);
12796 $tmpb =
dol_getdate($histo[$key][
'dateend'],
true);
12797 if ($tmpa[
'mday'] == $tmpb[
'mday'] && $tmpa[
'mon'] == $tmpb[
'mon'] && $tmpa[
'year'] == $tmpb[
'year']) {
12798 $out .=
'-'.dol_print_date($histo[$key][
'dateend'],
'hour',
'tzuserrel');
12800 $out .=
'-'.dol_print_date($histo[$key][
'dateend'],
'dayhour',
'tzuserrel');
12804 if ($histo[$key][
'percent'] == 0 && $histo[$key][
'datestart'] && $histo[$key][
'datestart'] < ($now - $delay_warning)) {
12807 if ($histo[$key][
'percent'] == 0 && !$histo[$key][
'datestart'] && $histo[$key][
'dateend'] && $histo[$key][
'datestart'] < ($now - $delay_warning)) {
12810 if ($histo[$key][
'percent'] > 0 && $histo[$key][
'percent'] < 100 && $histo[$key][
'dateend'] && $histo[$key][
'dateend'] < ($now - $delay_warning)) {
12813 if ($histo[$key][
'percent'] > 0 && $histo[$key][
'percent'] < 100 && !$histo[$key][
'dateend'] && $histo[$key][
'datestart'] && $histo[$key][
'datestart'] < ($now - $delay_warning)) {
12819 $out .=
"</span></span>\n";
12822 $out .=
'<h3 class="timeline-header">';
12825 $out .=
'<div class="messaging-author inline-block tdoverflowmax150 valignmiddle marginrightonly">';
12826 if ($histo[$key][
'userid'] > 0) {
12827 if (!isset($userGetNomUrlCache[$histo[$key][
'userid']])) {
12828 $userstatic->fetch($histo[$key][
'userid']);
12829 $userGetNomUrlCache[$histo[$key][
'userid']] = $userstatic->getNomUrl(-1,
'', 0, 0, 16, 0,
'firstelselast',
'');
12831 $out .= $userGetNomUrlCache[$histo[$key][
'userid']];
12832 } elseif (!empty($histo[$key][
'msg_from']) && $actionstatic->code ==
'TICKET_MSG') {
12833 if (!isset($contactGetNomUrlCache[$histo[$key][
'msg_from']])) {
12834 if ($contactstatic->fetch(0,
null,
'', $histo[$key][
'msg_from']) > 0) {
12835 $contactGetNomUrlCache[$histo[$key][
'msg_from']] = $contactstatic->getNomUrl(-1,
'', 16);
12837 $contactGetNomUrlCache[$histo[$key][
'msg_from']] = $histo[$key][
'msg_from'];
12840 $out .= $contactGetNomUrlCache[$histo[$key][
'msg_from']];
12846 $out .=
' <div class="messaging-title inline-block">';
12848 if (preg_match(
'/^TICKET_MSG/', $actionstatic->code)) {
12849 $out .= $langs->trans(
'TicketNewMessage');
12850 } elseif (preg_match(
'/^TICKET_MSG_PRIVATE/', $actionstatic->code)) {
12851 $out .= $langs->trans(
'TicketNewMessage').
' <em>('.$langs->trans(
'Private').
')</em>';
12852 } elseif (isset($histo[$key][
'type'])) {
12853 if ($histo[$key][
'type'] ==
'action') {
12854 $transcode = $langs->transnoentitiesnoconv(
"Action".$histo[$key][
'acode']);
12855 $libelle = ($transcode !=
"Action".$histo[$key][
'acode'] ? $transcode : $histo[$key][
'alabel']);
12856 $libelle = $histo[$key][
'note'];
12857 $actionstatic->id = $histo[$key][
'id'];
12859 } elseif ($histo[$key][
'type'] ==
'mailing') {
12860 $out .=
'<a href="'.DOL_URL_ROOT.
'/comm/mailing/card.php?id='.$histo[$key][
'id'].
'">'.
img_object($langs->trans(
"ShowEMailing"),
"email").
' ';
12861 $transcode = $langs->transnoentitiesnoconv(
"Action".$histo[$key][
'acode']);
12862 $libelle = ($transcode !=
"Action".$histo[$key][
'acode'] ? $transcode :
'Send mass mailing');
12865 $libelle .= $histo[$key][
'note'];
12874 if (!empty($histo[$key][
'message'] && $histo[$key][
'message'] != $libelle)
12875 && $actionstatic->code !=
'AC_TICKET_CREATE'
12876 && $actionstatic->code !=
'AC_TICKET_MODIFY'
12878 $out .=
'<div class="timeline-body">';
12879 $out .= $histo[$key][
'message'];
12887 if (isset($histo[$key][
'socpeopleassigned']) && is_array($histo[$key][
'socpeopleassigned']) && count($histo[$key][
'socpeopleassigned']) > 0) {
12889 foreach ($histo[$key][
'socpeopleassigned'] as $cid => $Tab) {
12891 $result = $contact->fetch($cid);
12898 $contactList .= !empty($contactList) ?
', ' :
'';
12899 $contactList .= $contact->getNomUrl(1);
12900 if (isset($histo[$key][
'acode']) && $histo[$key][
'acode'] ==
'AC_TEL') {
12901 if (!empty($contact->phone_pro)) {
12902 $contactList .=
'('.dol_print_phone($contact->phone_pro).
')';
12908 $footer .= $langs->trans(
'ActionOnContact').
' : '.$contactList;
12909 } elseif (empty($objcon->id) && isset($histo[$key][
'contact_id']) && $histo[$key][
'contact_id'] > 0) {
12911 $result = $contact->fetch($histo[$key][
'contact_id']);
12918 $footer .= $contact->getNomUrl(1);
12919 if (isset($histo[$key][
'acode']) && $histo[$key][
'acode'] ==
'AC_TEL') {
12920 if (!empty($contact->phone_pro)) {
12921 $footer .=
'('.dol_print_phone($contact->phone_pro).
')';
12928 if (!empty($documents)) {
12929 $footer .=
'<div class="timeline-documents-container">';
12930 foreach ($documents as $doc) {
12931 $footer .=
'<span id="document_'.$doc->id.
'" class="timeline-documents" ';
12932 $footer .=
' data-id="'.$doc->id.
'" ';
12933 $footer .=
' data-path="'.$doc->filepath.
'"';
12934 $footer .=
' data-filename="'.dol_escape_htmltag($doc->filename).
'" ';
12937 $filePath = DOL_DATA_ROOT.
'/'.$doc->filepath.
'/'.$doc->filename;
12939 $file = $actionstatic->id.
'/'.$doc->filename;
12940 $thumb = $actionstatic->id.
'/thumbs/'.substr($doc->filename, 0, strrpos($doc->filename,
'.')).
'_mini'.substr($doc->filename, strrpos($doc->filename,
'.'));
12941 $doclink =
dol_buildpath(
'document.php', 1).
'?modulepart=actions&attachment=0&file='.urlencode($file).
'&entity='.$conf->entity;
12942 $viewlink =
dol_buildpath(
'viewimage.php', 1).
'?modulepart=actions&file='.urlencode($thumb).
'&entity='.$conf->entity;
12944 $mimeAttr =
' mime="'.$mime.
'" ';
12946 if (in_array($mime, array(
'image/png',
'image/jpeg',
'application/pdf'))) {
12947 $class .=
' documentpreview';
12950 $footer .=
'<a href="'.$doclink.
'" class="btn-link '.$class.
'" target="_blank" rel="noopener noreferrer" '.$mimeAttr.
' >';
12951 $footer .=
img_mime($filePath).
' '.$doc->filename;
12954 $footer .=
'</span>';
12956 $footer .=
'</div>';
12959 if (!empty($footer)) {
12960 $out .=
'<div class="timeline-footer">'.$footer.
'</div>';
12963 $out .=
'</div>'.
"\n";
12966 $out .=
'<!-- END timeline item -->';
12973 if (empty($histo)) {
12974 $out .=
'<span class="opacitymedium">'.$langs->trans(
"NoRecordFound").
'</span>';
12997 if ($hourTime ===
'getpost') {
13001 } elseif (preg_match(
'/^(\d\d):(\d\d):(\d\d)$/', $hourTime, $m)) {
13002 $hour = intval($m[1]);
13003 $minute = intval($m[2]);
13004 $second = intval($m[3]);
13006 $hour = $minute = $second = 0;
13009 $hour = min($hour, 23);
13010 $minute = min($minute, 59);
13011 $second = min($second, 59);
13028 if ($timestamp ===
null) $timestamp =
GETPOSTDATE($prefix, $hourTime, $gm);
13034 if ($hourTime ===
'getpost' || ($timestamp !==
null &&
dol_print_date($timestamp,
'%H:%M:%S') !==
'00:00:00')) {
13035 $TParam = array_merge($TParam, array(
13042 return '&' . http_build_query($TParam);
if(preg_match('/set_([a-z0-9_\-]+)/i', $action, $reg)) if(preg_match('/del_([a-z0-9_\-]+)/i', $action, $reg)) if($action=='set') elseif( $action=='specimen') elseif($action=='setmodel') elseif( $action=='del') elseif($action=='setdoc') $formactions
View.
ajax_object_onoff($object, $code, $field, $text_on, $text_off, $input=array(), $morecss='', $htmlname='', $forcenojs=0)
On/off button to change a property status of an object This uses the ajax service objectonoff....
Class to manage agenda events (actions)
Class to manage GeoIP conversion Usage: $geoip=new GeoIP('country',$datfile); $geoip->getCountryCodeF...
Class to manage invoices.
Class to manage predefined suppliers products.
Class to manage products or services.
Class to manage third parties objects (customers, suppliers, prospects...)
isACompany()
Return if third party is a company (Business) or an end user (Consumer)
Class to manage translations.
Class to manage Dolibarr users.
isInEEC($object)
Return if a country of an object is inside the EEC (European Economic Community)
dol_get_prev_month($month, $year)
Return previous month.
dol_get_next_day($day, $month, $year)
Return next day.
getServerTimeZoneInt($refgmtdate='now')
Return server timezone int.
dol_get_prev_day($day, $month, $year)
Return previous day.
dol_get_next_month($month, $year)
Return next month.
dol_convert_file($fileinput, $ext='png', $fileoutput='', $page='')
Convert an image file or a PDF into another image format.
dragAndDropFileUpload($htmlname)
Function to manage the drag and drop of a file.
dol_dir_list($path, $types="all", $recursive=0, $filter="", $excludefilter=null, $sortcriteria="name", $sortorder=SORT_ASC, $mode=0, $nohook=0, $relativename="", $donotfollowsymlinks=0, $nbsecondsold=0)
Scan a directory and return a list of files/directories.
dol_is_dir($folder)
Test if filename is a directory.
isValidVATID($company)
Check if VAT numero is valid (check done on syntax only, no database or remote access)
dol_html_entity_decode($a, $b, $c='UTF-8', $keepsomeentities=0)
Replace html_entity_decode functions to manage errors.
dol_fiche_end($notab=0)
Show tab footer of a card.
dolCheckFilters($sqlfilters, &$error='')
Return if a $sqlfilters parameter has a valid balance of parenthesis.
dol_print_size($size, $shortvalue=0, $shortunit=0)
Return string with formated size.
dol_banner_tab($object, $paramid, $morehtml='', $shownav=1, $fieldid='rowid', $fieldref='ref', $morehtmlref='', $moreparam='', $nodbprefix=0, $morehtmlleft='', $morehtmlstatus='', $onlybanner=0, $morehtmlright='')
Show tab footer of a card.
isOnlyOneLocalTax($local)
Return true if LocalTax (1 or 2) is unique.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed informations (by default a local PHP server timestamp) Re...
get_default_localtax($thirdparty_seller, $thirdparty_buyer, $local, $idprod=0)
Function that return localtax of a product line (according to seller, buyer and product vat rate) Si ...
img_weather($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $morecss='')
Show weather picto.
dol_getIdFromCode($db, $key, $tablename, $fieldkey='code', $fieldid='id', $entityfilter=0, $filters='', $useCache=true)
Return an id or code from a code or id.
finishSimpleTable($addLineBreak=false)
Add the correct HTML close tags for "startSimpleTable(...)" (use after the last table line)
startSimpleTable($header, $link="", $arguments="", $emptyRows=0, $number=-1)
Start a table with headers and a optinal clickable number (don't forget to use "finishSimpleTable()" ...
getLanguageCodeFromCountryCode($countrycode)
Return default language from country code.
setEntity($currentobject)
Set entity id to use when to create an object.
vatrate($rate, $addpercent=false, $info_bits=0, $usestarfornpr=0, $html=0)
Return a string with VAT rate label formated for view output Used into pdf and HTML pages.
dol_print_socialnetworks($value, $cid, $socid, $type, $dictsocialnetworks=array())
Show social network link.
picto_from_langcode($codelang, $moreatt='', $notitlealt=0)
Return img flag of country for a language code or country code.
dol_ucfirst($string, $encoding="UTF-8")
Convert first character of the first word of a string to upper.
img_right($titlealt='default', $selected=0, $moreatt='')
Show right arrow logo.
load_fiche_titre($titre, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
img_help($usehelpcursor=1, $usealttitle=1)
Show help logo with cursor "?".
dol_strtolower($string, $encoding="UTF-8")
Convert a string to lower.
showValueWithClipboardCPButton($valuetocopy, $showonlyonhover=1, $texttoshow='')
Create a button to copy $valuetocopy in the clipboard (for copy and paste feature).
dol_htmlentitiesbr_decode($stringtodecode, $pagecodeto='UTF-8')
This function is called to decode a HTML string (it decodes entities and br tags)
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
img_left($titlealt='default', $selected=0, $moreatt='')
Show left arrow logo.
dol_print_ip($ip, $mode=0)
Return an IP formated to be shown on screen.
img_delete($titlealt='default', $other='class="pictodelete"', $morecss='')
Show delete logo.
dol_mimetype($file, $default='application/octet-stream', $mode=0)
Return MIME type of a file from its name with extension.
GETPOSTINT($paramname, $method=0)
Return value of a param into GET or POST supervariable.
isVisibleToUserType($type_user, &$menuentry, &$listofmodulesforexternal)
Function to test if an entry is enabled or not.
dolGetFirstLineOfText($text, $nboflines=1, $charset='UTF-8')
Return first line of text.
getDolUserInt($key, $default=0, $tmpuser=null)
Return Dolibarr user constant int value.
yn($yesno, $case=1, $color=0)
Return yes or no in current language.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0)
Show tabs of a record.
dol_osencode($str)
Return a string encoded into OS filesystem encoding.
isASecretKey($keyname)
Return if string has a name dedicated to store a secret.
dol_string_nohtmltag($stringtoclean, $removelinefeed=1, $pagecodeto='UTF-8', $strip_tags=0, $removedoublespaces=1)
Clean a string from all HTML tags and entities.
print_fleche_navigation($page, $file, $options='', $nextpage=0, $betweenarrows='', $afterarrows='', $limit=-1, $totalnboflines=0, $hideselectlimit=0, $beforearrows='', $hidenavigation=0)
Function to show navigation arrows into lists.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
get_date_range($date_start, $date_end, $format='', $outputlangs='', $withparenthesis=1)
Format output for start and end date.
get_htmloutput_errors($mesgstring='', $mesgarray=array(), $keepembedded=0)
Get formated error messages to output (Used to show messages on html output).
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dolGetButtonTitle($label, $helpText='', $iconClass='fa fa-file', $url='', $id='', $status=1, $params=array())
Function dolGetButtonTitle : this kind of buttons are used in title in list.
roundUpToNextMultiple($n, $x=5)
Round to next multiple.
dolButtonToOpenUrlInDialogPopup($name, $label, $buttonstring, $url, $disabled='', $morecss='classlink button bordertransp', $jsonopen='', $backtopagejsfields='', $accesskey='')
Return HTML code to output a button to open a dialog popup box.
dol_user_country()
Return country code for current user.
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0)
Show a picto called object_picto (generic function)
dol_format_address($object, $withcountry=0, $sep="\n", $outputlangs='', $mode=0, $extralangcode='')
Return a formated address (part address/zip/town/state) according to country rules.
isHTTPS()
Return if we are using a HTTPS connexion Check HTTPS (no way to be modified by user but may be empty ...
currentToken()
Return the value of token currently saved into session with name 'token'.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
picto_required()
Return picto saying a field is required.
dol_string_nospecial($str, $newstr='_', $badcharstoreplace='', $badcharstoremove='', $keepspaces=0)
Clean a string from all punctuation characters to use it as a ref or login.
img_action($titlealt, $numaction, $picto='', $moreatt='')
Show logo action.
dol_nl2br($stringtoencode, $nl2brmode=0, $forxml=false)
Replace CRLF in string with a HTML BR tag.
setEventMessage($mesgs, $style='mesgs', $noduplicate=0)
Set event message in dol_events session object.
natural_search($fields, $value, $mode=0, $nofirstand=0)
Generate natural SQL search string for a criteria (this criteria can be tested on one or several fiel...
GETPOSTDATE($prefix, $hourTime='', $gm='auto')
Helper function that combines values of a dolibarr DatePicker (such as Form\selectDate) for year,...
printCommonFooter($zone='private')
Print common footer : conf->global->MAIN_HTML_FOOTER js for switch of menu hider js for conf->global-...
checkVal($out='', $check='alphanohtml', $filter=null, $options=null)
Return a sanitized or empty value after checking value against a rule.
dol_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
img_down($titlealt='default', $selected=0, $moreclass='')
Show down arrow logo.
getTaxesFromId($vatrate, $buyer=null, $seller=null, $firstparamisid=1)
Get tax (VAT) main information from Id.
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
utf8_valid($str)
Check if a string is in UTF8.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs='', $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
getDolUserString($key, $default='', $tmpuser=null)
Return Dolibarr user constant string value.
forgeSQLFromUniversalSearchCriteria($filter, &$errorstr='', $noand=0, $nopar=0, $noerror=0)
forgeSQLFromUniversalSearchCriteria
dol_print_email($email, $cid=0, $socid=0, $addlink=0, $max=64, $showinvalid=1, $withpicto=0)
Show EMail link formatted for HTML output.
img_allow($allow, $titlealt='default')
Show tick logo if allowed.
isValidMXRecord($domain)
Return if the domain name has a valid MX record.
GETPOSTISARRAY($paramname, $method=0)
Return true if the parameter $paramname is submit from a POST OR GET as an array.
get_htmloutput_mesg($mesgstring='', $mesgarray='', $style='ok', $keepembedded=0)
Get formated messages to output (Used to show messages on html output).
dol_print_phone($phone, $countrycode='', $cid=0, $socid=0, $addlink='', $separ=" ", $withpicto='', $titlealt='', $adddivfloat=0)
Format phone numbers according to country.
dolChmod($filepath, $newmask='')
Change mod of a file.
dol_now($mode='auto')
Return date for now.
dol_fiche_head($links=array(), $active='0', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='')
Show tab header of a card.
img_mime($file, $titlealt='', $morecss='')
Show MIME img of a file.
get_localtax_by_third($local)
Get values of localtaxes (1 or 2) for company country for the common vat with the highest value.
getDolGlobalInt($key, $default=0)
Return dolibarr global constant int value.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
dol_escape_js($stringtoescape, $mode=0, $noescapebackslashn=0)
Returns text escaped for inclusion into javascript code.
dol_string_onlythesehtmltags($stringtoclean, $cleanalsosomestyles=1, $removeclassattribute=1, $cleanalsojavascript=0, $allowiframe=0, $allowed_tags=array(), $allowlink=0)
Clean a string to keep only desirable HTML tags.
getLocalTaxesFromRate($vatrate, $local, $buyer, $seller, $firstparamisid=0)
Get type and rate of localtaxes for a particular vat rate/country of a thirdparty.
ajax_autoselect($htmlname, $addlink='', $textonlink='Link')
Make content of an input box selected when we click into input field.
img_view($titlealt='default', $float=0, $other='class="valignmiddle"')
Show logo view card.
dol_sort_array(&$array, $index, $order='asc', $natsort=0, $case_sensitive=0, $keepindex=0)
Advanced sort array by second index function, which produces ascending (default) or descending output...
if(!function_exists( 'dol_getprefix')) dol_include_once($relpath, $classname='')
Make an include_once using default root and alternate root if it fails.
showDimensionInBestUnit($dimension, $unit, $type, $outputlangs, $round=-1, $forceunitoutput='no', $use_short_label=0)
Output a dimension with best unit.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
dol_clone($object, $native=0)
Create a clone of instance of object (new instance with same value for each properties) With native =...
dol_string_unaccent($str)
Clean a string from all accent characters to be used as ref, login or by dol_sanitizeFileName.
dol_eval($s, $returnvalue=0, $hideerrors=1, $onlysimplestring='1')
Replace eval function to add more security.
dol_strftime($fmt, $ts=false, $is_gmt=false)
Format a string.
img_picto_common($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $notitle=0)
Show picto (generic function)
img_search($titlealt='default', $other='')
Show search logo.
dolGetButtonAction($label, $text='', $actionType='default', $url='', $id='', $userRight=1, $params=array())
Function dolGetButtonAction.
dolGetFirstLastname($firstname, $lastname, $nameorder=-1)
Return firstname and lastname in correct order.
dol_string_neverthesehtmltags($stringtoclean, $disallowed_tags=array('textarea'), $cleanalsosomestyles=0)
Clean a string from some undesirable HTML tags.
isValidPhone($phone)
Return true if phone number syntax is ok TODO Decide what to do with this.
print_liste_field_titre($name, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $tooltip="", $forcenowrapcolumntitle=0)
Show title line of an array.
dol_htmlcleanlastbr($stringtodecode)
This function remove all ending and br at end.
img_previous($titlealt='default', $moreatt='')
Show previous logo.
get_default_npr(Societe $thirdparty_seller, Societe $thirdparty_buyer, $idprod=0, $idprodfournprice=0)
Function that returns whether VAT must be recoverable collected VAT (e.g.: VAT NPR in France)
dol_concatdesc($text1, $text2, $forxml=false, $invert=false)
Concat 2 descriptions with a new line between them (second operand after first one with appropriate n...
dol_htmlentities($string, $flags=ENT_QUOTES|ENT_SUBSTITUTE, $encoding='UTF-8', $double_encode=false)
Replace htmlentities functions.
dol_print_profids($profID, $profIDtype, $countrycode='', $addcpButton=1, $separ=' ')
Format profIDs according to country.
fieldLabel($langkey, $fieldkey, $fieldrequired=0)
Show a string with the label tag dedicated to the HTML edit field.
getBrowserInfo($user_agent)
Return information about user browser.
dolGetFirstLetters($s, $nbofchar=1)
Return first letters of a strings.
dol_strtoupper($string, $encoding="UTF-8")
Convert a string to upper.
dol_sanitizeUrl($stringtoclean, $type=1)
Clean a string to use it as an URL (into a href or src attribute)
img_printer($titlealt="default", $other='')
Show printer logo.
dol_htmloutput_events($disabledoutputofmessages=0)
Print formated messages to output (Used to show messages on html output).
getTitleFieldOfList($name, $thead=0, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $disablesortlink=0, $tooltip='', $forcenowrapcolumntitle=0)
Get title line of an array.
complete_substitutions_array(&$substitutionarray, $outputlangs, $object=null, $parameters=null, $callfunc="completesubstitutionarray")
Complete the $substitutionarray with more entries coming from external module that had set the "subst...
dol_substr($string, $start, $length=null, $stringencoding='', $trunconbytes=0)
Make a substring.
ascii_check($str)
Check if a string is in ASCII.
make_substitutions($text, $substitutionarray, $outputlangs=null, $converttextinhtmlifnecessary=0)
Make substitution into a text string, replacing keys with vals from $substitutionarray (oldval=>newva...
getArrayOfSocialNetworks()
Get array of social network dictionary.
dolGetButtonTitleSeparator($moreClass="")
Add space between dolGetButtonTitle.
dol_string_onlythesehtmlattributes($stringtoclean, $allowed_attributes=array("allow", "allowfullscreen", "alt", "class", "contenteditable", "data-html", "frameborder", "height", "href", "id", "name", "src", "style", "target", "title", "width"))
Clean a string from some undesirable HTML tags.
num2Alpha($n)
Return a numeric value into an Excel like column number.
dol_size($size, $type='')
Optimize a size for some browsers (phone, smarphone, ...)
img_split($titlealt='default', $other='class="pictosplit"')
Show split logo.
img_pdf($titlealt='default', $size=3)
Show pdf logo.
dolGetCountryCodeFromIp($ip)
Return a country code from IP.
dol_textishtml($msg, $option=0)
Return if a text is a html content.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
colorIsLight($stringcolor)
Return true if the color is light.
readfileLowMemory($fullpath_original_file_osencoded, $method=-1)
Return a file on output using a low memory.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='')
Show information for admin users or standard users.
dol_shutdown()
Function called at end of web php process.
dol_print_address($address, $htmlid, $element, $id, $noprint=0, $charfornl='')
Format address string.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
dol_print_error_email($prefixcode, $errormessage='', $errormessages=array(), $morecss='error', $email='')
Show a public email and error code to contact if technical error.
dol_print_url($url, $target='_blank', $max=32, $withpicto=0, $morecss='float')
Show Url link.
print_barre_liste($titre, $page, $file, $options='', $sortfield='', $sortorder='', $morehtmlcenter='', $num=-1, $totalnboflines='', $picto='generic', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limit=-1, $hideselectlimit=0, $hidenavigation=0, $pagenavastextinput=0, $morehtmlrightbeforearrow='')
Print a title with navigation controls for pagination.
dol_bc($var, $moreclass='')
Return string to add class property on html element with pair/impair.
print_titre($title)
Show a title.
getElementProperties($element_type)
Get an array with properties of an element.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_string_nounprintableascii($str, $removetabcrlf=1)
Clean a string from all non printable ASCII chars (0x00-0x1F and 0x7F).
get_localtax($vatrate, $local, $thirdparty_buyer="", $thirdparty_seller="", $vatnpr=0)
Return localtax rate for a particular vat, when selling a product with vat $vatrate,...
img_error($titlealt='default')
Show error logo.
getTimelineIcon($actionstatic, &$histo, $key)
Get timeline icon.
dol_htmloutput_mesg($mesgstring='', $mesgarray=array(), $style='ok', $keepembedded=0)
Print formated messages to output (Used to show messages on html output).
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
buildParamDate($prefix, $timestamp=null, $hourTime='', $gm='auto')
Helper function that combines values of a dolibarr DatePicker (such as Form\selectDate) for year,...
img_next($titlealt='default', $moreatt='')
Show next logo.
print_date_range($date_start, $date_end, $format='', $outputlangs='')
Format output for start and end date.
isAFileWithExecutableContent($filename)
Return if a file can contains executable content.
dol_trunc($string, $size=40, $trunc='right', $stringencoding='UTF-8', $nodot=0, $display=0)
Truncate a string to a particular length adding '…' if string larger than length.
dol_string_is_good_iso($s, $clean=0)
Check if a string is a correct iso string If not, it will not be considered as HTML encoded even if i...
getNonce()
Return a random string to be used as a nonce value for js.
complete_head_from_modules($conf, $langs, $object, &$head, &$h, $type, $mode='add', $filterorigmodule='')
Complete or removed entries into a head array (used to build tabs).
dol_htmlentitiesbr($stringtoencode, $nl2brmode=0, $pagecodefrom='UTF-8', $removelasteolbr=1)
This function is called to encode a string into a HTML string but differs from htmlentities because a...
get_product_localtax_for_country($idprod, $local, $thirdpartytouse)
Return localtax vat rate of a product in a particular country or default country vat if product is un...
getCommonSubstitutionArray($outputlangs, $onlykey=0, $exclude=null, $object=null, $include=null)
Return array of possible common substitutions.
dol_nboflines($s, $maxchar=0)
Return nb of lines of a clear text.
dol_htmlwithnojs($stringtoencode, $nouseofiframesandbox=0, $check='restricthtml')
Sanitize a HTML to remove js and dangerous content.
jsonOrUnserialize($stringtodecode)
Decode an encode string.
addSummaryTableLine($tableColumnCount, $num, $nbofloop=0, $total=0, $noneWord="None", $extraRightColumn=false)
Add a summary line to the current open table ("None", "XMoreLines" or "Total xxx")
isValidEmail($address, $acceptsupervisorkey=0, $acceptuserkey=0)
Return true if email syntax is ok.
getActionCommEcmList($object)
getActionCommEcmList
dol_ucwords($string, $encoding="UTF-8")
Convert first character of all the words of a string to upper.
img_edit_add($titlealt='default', $other='')
Show logo +.
verifCond($strToEvaluate)
Verify if condition in string is ok or not.
if(!function_exists( 'utf8_encode')) if(!function_exists('utf8_decode')) if(!function_exists( 'str_starts_with')) if(!function_exists('str_ends_with')) if(!function_exists( 'str_contains')) getMultidirOutput($object, $module='')
Return the full path of the directory where a module (or an object of a module) stores its files.
print_fiche_titre($title, $mesg='', $picto='generic', $pictoisfullpath=0, $id='')
Show a title with picto.
get_product_vat_for_country($idprod, $thirdpartytouse, $idprodfournprice=0)
Return vat rate of a product in a particular country, or default country vat if product is unknown.
dolForgeDummyCriteriaCallback($matches)
Function to forge a SQL criteria from a Dolibarr filter syntax string.
dol_escape_json($stringtoescape)
Returns text escaped for inclusion into javascript code.
dolForgeCriteriaCallback($matches)
Function to forge a SQL criteria from a Dolibarr filter syntax string.
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
getUserRemoteIP()
Return the IP of remote user.
sanitizeVal($out='', $check='alphanohtml', $filter=null, $options=null)
Return a sanitized or empty value after checking value against a rule.
dol_validElement($element)
Return if var element is ok.
img_credit_card($brand, $morecss=null)
Return image of a credit card according to its brand name.
dolPrintHTML($s)
Return a string ready to be output on HTML page To use text inside an attribute, use can use only dol...
img_searchclear($titlealt='default', $other='')
Show search logo.
dolPrintLabel($s)
Return a string label ready to be output on HTML content To use text inside an attribute,...
fetchObjectByElement($element_id, $element_type, $element_ref='')
Fetch an object from its id and element_type Inclusion of classes is automatic.
utf8_check($str)
Check if a string is in UTF8.
img_edit($titlealt='default', $float=0, $other='')
Show logo editer/modifier fiche.
show_actions_messaging($conf, $langs, $db, $filterobj, $objcon='', $noprint=0, $actioncode='', $donetodo='done', $filters=array(), $sortfield='a.datep, a.id', $sortorder='DESC')
Show html area with actions in messaging format.
get_default_tva(Societe $thirdparty_seller, Societe $thirdparty_buyer, $idprod=0, $idprodfournprice=0)
Function that return vat rate of a product line (according to seller, buyer and product vat rate) VAT...
img_up($titlealt='default', $selected=0, $moreclass='')
Show top arrow logo.
dol_htmloutput_errors($mesgstring='', $mesgarray=array(), $keepembedded=0)
Print formated error messages to output (Used to show messages on html output).
getFieldErrorIcon($fieldValidationErrorMsg)
get field error icon
get_exdir($num, $level, $alpha, $withoutslash, $object, $modulepart='')
Return a path to have a the directory according to object where files are stored.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
getEntity($element, $shared=1, $currentobject=null)
Get list of entity id to use.
dol_sanitizePathName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a path name.
dol_getdate($timestamp, $fast=false, $forcetimezone='')
Return an array with locale date info.
dol_mkdir($dir, $dataroot='', $newmask='')
Creation of a directory (this can create recursive subdir)
img_edit_remove($titlealt='default', $other='')
Show logo -.
img_info($titlealt='default')
Show info logo.
getDoliDBInstance($type, $host, $user, $pass, $name, $port)
Return a DoliDB instance (database handler).
dol_sanitizeEmail($stringtoclean)
Clean a string to use it as an Email.
dol_nboflines_bis($text, $maxlinesize=0, $charset='UTF-8')
Return nb of lines of a formated text with and (WARNING: string must not have mixed and br sepa...
dolPrintHTMLForTextArea($s)
Return a string ready to be output on input textarea To use text inside an attribute,...
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
dol_convertToWord($num, $langs, $currency='', $centimes=false)
Function to return a number into a text.
conf($dolibarr_main_document_root)
Load conf file (file must exists)
publicphonebutton2 phonegreen basiclayout basiclayout TotalHT VATCode TotalVAT TotalLT1 TotalLT2 TotalTTC TotalHT clearboth nowraponall right right takeposterminal SELECT e rowid
if(!defined( 'CSRFCHECK_WITH_TOKEN'))
if(!defined( 'NOREQUIREMENU')) if(!empty(GETPOST('seteventmessages', 'alpha'))) if(!function_exists("llxHeader")) top_httphead($contenttype='text/html', $forcenocache=0)
Show HTTP header.
if(!empty( $_SERVER[ 'MAIN_SHOW_TUNING_INFO'])) realCharForNumericEntities($matches)
Return the real char for a numeric entities.
dol_setcache($memoryid, $data, $expire=0)
Save data into a memory area shared by all users, all sessions on server.
dol_getcache($memoryid)
Read a memory area shared by all users, all sessions on server.
if(preg_match('/crypted:/i', $dolibarr_main_db_pass)||!empty($dolibarr_main_db_encrypted_pass)) $conf db type
$conf db name
Only used if Module[ID]Name translation string is not found.
dolGetRandomBytes($length)
Return a string of random bytes (hexa string) with length = $length fro cryptographic purposes.