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');
1821 if (!array_key_exists($level, $logLevels)) {
1822 throw new Exception(
'Incorrect log level');
1828 if (empty($conf->global->MAIN_SHOW_PASSWORD_INTO_LOG)) {
1829 $message = preg_replace(
'/password=\'[^\']*\'/',
'password=\'hidden\'', $message);
1833 if ((!empty($_REQUEST[
'logtohtml']) && !empty($conf->global->MAIN_ENABLE_LOG_TO_HTML))
1834 || (!empty($user->rights->debugbar->read) && is_object($debugbar))) {
1835 $conf->logbuffer[] =
dol_print_date(time(),
"%Y-%m-%d %H:%M:%S").
" ".$logLevels[$level].
" ".$message;
1840 if (!empty($conf->global->MAIN_ENABLE_LOG_INLINE_HTML) && !empty($_GET[
"log"])) {
1841 print
"\n\n<!-- Log start\n";
1843 print
"Log end -->\n";
1847 'message' => $message,
1848 'script' => (isset($_SERVER[
'PHP_SELF']) ? basename($_SERVER[
'PHP_SELF'],
'.php') :
false),
1850 'user' => ((is_object($user) && $user->id) ? $user->login :
false),
1855 if (!empty($remoteip)) {
1856 $data[
'ip'] = $remoteip;
1858 if (!empty($_SERVER[
'HTTP_X_FORWARDED_FOR']) && $_SERVER[
'HTTP_X_FORWARDED_FOR'] != $remoteip) {
1859 $data[
'ip'] = $_SERVER[
'HTTP_X_FORWARDED_FOR'].
' -> '.$data[
'ip'];
1860 } elseif (!empty($_SERVER[
'HTTP_CLIENT_IP']) && $_SERVER[
'HTTP_CLIENT_IP'] != $remoteip) {
1861 $data[
'ip'] = $_SERVER[
'HTTP_CLIENT_IP'].
' -> '.$data[
'ip'];
1863 } elseif (!empty($_SERVER[
'SERVER_ADDR'])) {
1865 $data[
'ip'] = $_SERVER[
'SERVER_ADDR'];
1866 } elseif (!empty($_SERVER[
'COMPUTERNAME'])) {
1868 $data[
'ip'] = $_SERVER[
'COMPUTERNAME'].(empty($_SERVER[
'USERNAME']) ?
'' :
'@'.$_SERVER[
'USERNAME']);
1869 } elseif (!empty($_SERVER[
'LOGNAME'])) {
1871 $data[
'ip'] =
'???@'.$_SERVER[
'LOGNAME'];
1875 foreach ($conf->loghandlers as $loghandlerinstance) {
1876 if ($restricttologhandler && $loghandlerinstance->code != $restricttologhandler) {
1879 $loghandlerinstance->export($data, $suffixinfilename);
1885 foreach ($conf->loghandlers as $loghandlerinstance) {
1886 $loghandlerinstance->setIdent($ident);
1907function dolButtonToOpenUrlInDialogPopup($name, $label, $buttonstring, $url, $disabled =
'', $morecss =
'classlink button bordertransp', $jsonopen =
'', $backtopagejsfields =
'', $accesskey =
'')
1911 if (strpos($url,
'?') > 0) {
1912 $url .=
'&dol_hide_topmenu=1&dol_hide_leftmenu=1&dol_openinpopup='.urlencode($name);
1914 $url .=
'?dol_hide_topmenu=1&dol_hide_leftmenu=1&dol_openinpopup='.urlencode($name);
1919 $backtopagejsfieldsid =
''; $backtopagejsfieldslabel =
'';
1920 if ($backtopagejsfields) {
1921 $tmpbacktopagejsfields = explode(
':', $backtopagejsfields);
1922 if (empty($tmpbacktopagejsfields[1])) {
1923 $backtopagejsfields = $name.
":".$backtopagejsfields;
1924 $tmp2backtopagejsfields = explode(
',', $tmpbacktopagejsfields[0]);
1926 $tmp2backtopagejsfields = explode(
',', $tmpbacktopagejsfields[1]);
1928 $backtopagejsfieldsid = empty($tmp2backtopagejsfields[0]) ?
'' : $tmp2backtopagejsfields[0];
1929 $backtopagejsfieldslabel = empty($tmp2backtopagejsfields[1]) ?
'' : $tmp2backtopagejsfields[1];
1930 $url .=
'&backtopagejsfields='.urlencode($backtopagejsfields);
1934 $out .=
'<!-- a link for button to open url into a dialog popup with backtopagejsfields = '.$backtopagejsfields.
' -->';
1935 $out .=
'<a '.($accesskey ?
' accesskey="'.$accesskey.
'"' :
'').
' class="cursorpointer reposition button_'.$name.($morecss ?
' '.$morecss :
'').
'"'.$disabled.
' title="'.
dol_escape_htmltag($label).
'"';
1936 if (empty($conf->use_javascript_ajax)) {
1937 $out .=
' href="'.DOL_URL_ROOT.$url.
'" target="_blank"';
1938 } elseif ($jsonopen) {
1939 $out .=
' href="#" onclick="'.$jsonopen.
'"';
1941 $out .=
' href="#"';
1943 $out .=
'>'.$buttonstring.
'</a>';
1945 if (!empty($conf->use_javascript_ajax)) {
1947 $out .=
'<!-- code to open popup and variables to retreive returned variables -->';
1948 $out .=
'<div id="idfordialog'.$name.
'" class="hidden">div for dialog</div>';
1949 $out .=
'<div id="varforreturndialogid'.$name.
'" class="hidden">div for returned id</div>';
1950 $out .=
'<div id="varforreturndialoglabel'.$name.
'" class="hidden">div for returned label</div>';
1951 $out .=
'<!-- Add js code to open dialog popup on dialog -->';
1952 $out .=
'<script nonce="'.getNonce().
'" type="text/javascript">
1953 jQuery(document).ready(function () {
1954 jQuery(".button_'.$name.
'").click(function () {
1955 console.log(\'Open popup with jQuery(...).dialog() on URL '.
dol_escape_js(DOL_URL_ROOT.$url).
'\');
1956 var $tmpdialog = $(\
'#idfordialog'.$name.
'\');
1957 $tmpdialog.html(\
'<iframe class="iframedialog" id="iframedialog'.$name.
'" style="border: 0px;" src="'.DOL_URL_ROOT.$url.
'" width="100%" height="98%"></iframe>\');
1961 height: (window.innerHeight - 150),
1964 open:
function (event, ui) {
1965 console.log(
"open popup name='.$name.', backtopagejsfields='.$backtopagejsfields.'");
1967 close:
function (event, ui) {
1968 var returnedid = jQuery(
"#varforreturndialogid'.$name.'").text();
1969 var returnedlabel = jQuery(
"#varforreturndialoglabel'.$name.'").text();
1970 console.log(
"popup has been closed. returnedid (js var defined into parent page)="+returnedid+
" returnedlabel="+returnedlabel);
1971 if (returnedid !=
"" && returnedid !=
"div for returned id") {
1972 jQuery(
"#'.(empty($backtopagejsfieldsid)?"none
":$backtopagejsfieldsid).'").val(returnedid);
1974 if (returnedlabel !=
"" && returnedlabel !=
"div for returned label") {
1975 jQuery(
"#'.(empty($backtopagejsfieldslabel)?"none
":$backtopagejsfieldslabel).'").val(returnedlabel);
1980 $tmpdialog.dialog(\
'open\');
2005function dol_fiche_head($links = array(), $active =
'0', $title =
'', $notab = 0, $picto =
'', $pictoisfullpath = 0, $morehtmlright =
'', $morecss =
'', $limittoshow = 0, $moretabssuffix =
'')
2007 print
dol_get_fiche_head($links, $active, $title, $notab, $picto, $pictoisfullpath, $morehtmlright, $morecss, $limittoshow, $moretabssuffix);
2026function dol_get_fiche_head($links = array(), $active =
'', $title =
'', $notab = 0, $picto =
'', $pictoisfullpath = 0, $morehtmlright =
'', $morecss =
'', $limittoshow = 0, $moretabssuffix =
'', $dragdropfile = 0)
2028 global $conf, $langs, $hookmanager;
2032 if (!empty($conf->dol_optimize_smallscreen)) {
2036 $out =
"\n".
'<!-- dol_fiche_head - dol_get_fiche_head -->';
2038 if ((!empty($title) && $showtitle) || $morehtmlright || !empty($links)) {
2039 $out .=
'<div class="tabs'.($picto ?
'' :
' nopaddingleft').
'" data-role="controlgroup" data-type="horizontal">'.
"\n";
2043 if ($morehtmlright) {
2044 $out .=
'<div class="inline-block floatright tabsElem">'.$morehtmlright.
'</div>';
2048 if (!empty($title) && $showtitle && empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
2050 $out .=
'<a class="tabTitle">';
2052 $noprefix = $pictoisfullpath;
2053 if (strpos($picto,
'fontawesome_') !==
false) {
2056 $out .=
img_picto($title, ($noprefix ?
'' :
'object_').$picto,
'', $pictoisfullpath, 0, 0,
'',
'imgTabTitle').
' ';
2058 $out .=
'<span class="tabTitleText">'.dol_escape_htmltag(
dol_trunc($title, $limittitle)).
'</span>';
2066 if (is_array($links) && !empty($links)) {
2067 $keys = array_keys($links);
2069 $maxkey = max($keys);
2075 if (empty($limittoshow)) {
2076 $limittoshow = (empty($conf->global->MAIN_MAXTABS_IN_CARD) ? 99 : $conf->global->MAIN_MAXTABS_IN_CARD);
2078 if (!empty($conf->dol_optimize_smallscreen)) {
2086 for ($i = 0; $i <= $maxkey; $i++) {
2087 if ((is_numeric($active) && $i == $active) || (!empty($links[$i][2]) && !is_numeric($active) && $active == $links[$i][2])) {
2089 if ($i >= $limittoshow) {
2095 for ($i = 0; $i <= $maxkey; $i++) {
2096 if ((is_numeric($active) && $i == $active) || (!empty($links[$i][2]) && !is_numeric($active) && $active == $links[$i][2])) {
2102 if ($i < $limittoshow || $isactive) {
2104 $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])).
' -->';
2106 if (isset($links[$i][2]) && $links[$i][2] ==
'image') {
2107 if (!empty($links[$i][0])) {
2108 $out .=
'<a class="tabimage'.($morecss ?
' '.$morecss :
'').
'" href="'.$links[$i][0].
'">'.$links[$i][1].
'</a>'.
"\n";
2110 $out .=
'<span class="tabspan">'.$links[$i][1].
'</span>'.
"\n";
2112 } elseif (!empty($links[$i][1])) {
2114 $out .=
'<div class="tab tab'.($isactive?
'active':
'unactive').
'" style="margin: 0 !important">';
2115 if (!empty($links[$i][0])) {
2116 $titletoshow = preg_replace(
'/<.*$/',
'', $links[$i][1]);
2117 $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).
'">';
2119 $out .= $links[$i][1];
2120 if (!empty($links[$i][0])) {
2121 $out .=
'</a>'.
"\n";
2123 $out .= empty($links[$i][4]) ?
'' : $links[$i][4];
2132 $outmore .=
'<div class="popuptabset wordwrap">';
2134 $outmore .=
'<div class="popuptab wordwrap" style="display:inherit;">';
2135 if (isset($links[$i][2]) && $links[$i][2] ==
'image') {
2136 if (!empty($links[$i][0])) {
2137 $outmore .=
'<a class="tabimage'.($morecss ?
' '.$morecss :
'').
'" href="'.$links[$i][0].
'">'.$links[$i][1].
'</a>'.
"\n";
2139 $outmore .=
'<span class="tabspan">'.$links[$i][1].
'</span>'.
"\n";
2141 } elseif (!empty($links[$i][1])) {
2142 $outmore .=
'<a'.(!empty($links[$i][2]) ?
' id="'.$links[$i][2].
'"' :
'').
' class="wordwrap inline-block'.($morecss ?
' '.$morecss :
'').
'" href="'.$links[$i][0].
'">';
2143 $outmore .= preg_replace(
'/([a-z])\|([a-z])/i',
'\\1 | \\2', $links[$i][1]);
2144 $outmore .=
'</a>'.
"\n";
2146 $outmore .=
'</div>';
2153 $outmore .=
'</div>';
2157 $left = ($langs->trans(
"DIRECTION") ==
'rtl' ?
'right' :
'left');
2158 $right = ($langs->trans(
"DIRECTION") ==
'rtl' ?
'left' :
'right');
2159 $widthofpopup = 200;
2161 $tabsname = $moretabssuffix;
2162 if (empty($tabsname)) {
2163 $tabsname = str_replace(
"@",
"", $picto);
2165 $out .=
'<div id="moretabs'.$tabsname.
'" class="inline-block tabsElem valignmiddle">';
2166 $out .=
'<div class="tab"><a href="#" class="tab moretab inline-block tabunactive"><span class="hideonsmartphone">'.$langs->trans(
"More").
'</span>... ('.$nbintab.
')</a></div>';
2167 $out .=
'<div id="moretabsList'.$tabsname.
'" style="width: '.$widthofpopup.
'px; position: absolute; '.$left.
': -999em; text-align: '.$left.
'; margin:0px; padding:2px; z-index:10;">';
2170 $out .=
'<div></div>';
2173 $out .=
'<script nonce="'.getNonce().
'">';
2174 $out .=
"$('#moretabs".$tabsname.
"').mouseenter( function() {
2175 var x = this.offsetLeft, y = this.offsetTop;
2176 console.log('mouseenter ".$left.
" x='+x+' y='+y+' window.innerWidth='+window.innerWidth);
2177 if ((window.innerWidth - x) < ".($widthofpopup + 10).
") {
2178 $('#moretabsList".$tabsname.
"').css('".$right.
"','8px');
2180 $('#moretabsList".$tabsname.
"').css('".$left.
"','auto');
2183 $out .=
"$('#moretabs".$tabsname.
"').mouseleave( function() { console.log('mouseleave ".$left.
"'); $('#moretabsList".$tabsname.
"').css('".$left.
"','-999em');});";
2184 $out .=
"</script>";
2187 if ((!empty($title) && $showtitle) || $morehtmlright || !empty($links)) {
2191 if (!$notab || $notab == -1 || $notab == -2 || $notab == -3) {
2192 $out .=
"\n".
'<div id="dragDropAreaTabBar" class="tabBar'.($notab == -1 ?
'' : ($notab == -2 ?
' tabBarNoTop' : (($notab == -3 ?
' noborderbottom' :
'').
' tabBarWithBottom'))).
'">'.
"\n";
2194 if (!empty($dragdropfile)) {
2197 $parameters = array(
'tabname' => $active,
'out' => $out);
2198 $reshook = $hookmanager->executeHooks(
'printTabsHead', $parameters);
2200 $out = $hookmanager->resPrint;
2226 if (!$notab || $notab == -1) {
2227 return "\n</div>\n";
2252function dol_banner_tab($object, $paramid, $morehtml =
'', $shownav = 1, $fieldid =
'rowid', $fieldref =
'ref', $morehtmlref =
'', $moreparam =
'', $nodbprefix = 0, $morehtmlleft =
'', $morehtmlstatus =
'', $onlybanner = 0, $morehtmlright =
'')
2254 global $conf, $form, $user, $langs, $hookmanager, $action;
2258 $maxvisiblephotos = 1;
2260 $entity = (empty($object->entity) ? $conf->entity : $object->entity);
2261 $showbarcode = empty($conf->barcode->enabled) ? 0 : (empty($object->barcode) ? 0 : 1);
2262 if (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && empty($user->rights->barcode->lire_advance)) {
2265 $modulepart =
'unknown';
2267 if ($object->element ==
'societe' || $object->element ==
'contact' || $object->element ==
'product' || $object->element ==
'ticket') {
2268 $modulepart = $object->element;
2269 } elseif ($object->element ==
'member') {
2270 $modulepart =
'memberphoto';
2271 } elseif ($object->element ==
'user') {
2272 $modulepart =
'userphoto';
2275 if (class_exists(
"Imagick")) {
2276 if ($object->element ==
'expensereport' || $object->element ==
'propal' || $object->element ==
'commande' || $object->element ==
'facture' || $object->element ==
'supplier_proposal') {
2277 $modulepart = $object->element;
2278 } elseif ($object->element ==
'fichinter') {
2279 $modulepart =
'ficheinter';
2280 } elseif ($object->element ==
'contrat') {
2281 $modulepart =
'contract';
2282 } elseif ($object->element ==
'order_supplier') {
2283 $modulepart =
'supplier_order';
2284 } elseif ($object->element ==
'invoice_supplier') {
2285 $modulepart =
'supplier_invoice';
2289 if ($object->element ==
'product') {
2291 $cssclass =
'photowithmargin photoref';
2292 $showimage = $object->is_photo_available($conf->product->multidir_output[$entity]);
2293 $maxvisiblephotos = (isset($conf->global->PRODUCT_MAX_VISIBLE_PHOTO) ? $conf->global->PRODUCT_MAX_VISIBLE_PHOTO : 5);
2294 if ($conf->browser->layout ==
'phone') {
2295 $maxvisiblephotos = 1;
2298 $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>';
2300 if (!empty($conf->global->PRODUCT_NODISPLAYIFNOPHOTO)) {
2302 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"></div>';
2304 $nophoto =
'/public/theme/common/nophoto.png';
2305 $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>';
2308 } elseif ($object->element ==
'ticket') {
2310 $cssclass =
'photoref';
2311 $showimage = $object->is_photo_available($conf->ticket->multidir_output[$entity].
'/'.$object->ref);
2312 $maxvisiblephotos = (isset($conf->global->TICKET_MAX_VISIBLE_PHOTO) ? $conf->global->TICKET_MAX_VISIBLE_PHOTO : 2);
2313 if ($conf->browser->layout ==
'phone') {
2314 $maxvisiblephotos = 1;
2318 $showphoto = $object->show_photos(
'ticket', $conf->ticket->multidir_output[$entity],
'small', $maxvisiblephotos, 0, 0, 0, $width, 0);
2319 if ($object->nbphoto > 0) {
2320 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref">'.$showphoto.
'</div>';
2326 if (!empty($conf->global->TICKET_NODISPLAYIFNOPHOTO)) {
2328 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"></div>';
2330 $nophoto =
img_picto(
'No photo',
'object_ticket');
2331 $morehtmlleft .=
'<!-- No photo to show -->';
2332 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"><div class="photoref">';
2333 $morehtmlleft .= $nophoto;
2334 $morehtmlleft .=
'</div></div>';
2339 if ($modulepart !=
'unknown') {
2342 if (in_array($modulepart, array(
'propal',
'commande',
'facture',
'ficheinter',
'contract',
'supplier_order',
'supplier_proposal',
'supplier_invoice',
'expensereport')) && class_exists(
"Imagick")) {
2344 $dir_output = (empty($conf->$modulepart->multidir_output[$entity]) ? $conf->$modulepart->dir_output : $conf->$modulepart->multidir_output[$entity]).
"/";
2345 if (in_array($modulepart, array(
'invoice_supplier',
'supplier_invoice'))) {
2346 $subdir =
get_exdir($object->id, 2, 0, 1, $object, $modulepart);
2347 $subdir .= ((!empty($subdir) && !preg_match(
'/\/$/', $subdir)) ?
'/' :
'').$objectref;
2349 $subdir =
get_exdir($object->id, 0, 0, 1, $object, $modulepart);
2351 if (empty($subdir)) {
2352 $subdir =
'errorgettingsubdirofobject';
2355 $filepath = $dir_output.$subdir.
"/";
2357 $filepdf = $filepath.$objectref.
".pdf";
2358 $relativepath = $subdir.
'/'.$objectref.
'.pdf';
2361 $fileimage = $filepdf.
'_preview.png';
2362 $relativepathimage = $relativepath.
'_preview.png';
2364 $pdfexists = file_exists($filepdf);
2369 if (!file_exists($fileimage) || (filemtime($fileimage) < filemtime($filepdf))) {
2370 if (empty($conf->global->MAIN_DISABLE_PDF_THUMBS)) {
2371 include_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
2380 if ($pdfexists && !$error) {
2381 $heightforphotref = 80;
2382 if (!empty($conf->dol_optimize_smallscreen)) {
2383 $heightforphotref = 60;
2386 if (file_exists($fileimage)) {
2387 $phototoshow =
'<div class="photoref">';
2388 $phototoshow .=
'<img height="'.$heightforphotref.
'" class="photo photowithborder" src="'.DOL_URL_ROOT.
'/viewimage.php?modulepart=apercu'.$modulepart.
'&file='.urlencode($relativepathimage).
'">';
2389 $phototoshow .=
'</div>';
2392 } elseif (!$phototoshow) {
2393 $phototoshow .= $form->showphoto($modulepart, $object, 0, 0, 0,
'photowithmargin photoref',
'small', 1, 0, $maxvisiblephotos);
2397 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref">';
2398 $morehtmlleft .= $phototoshow;
2399 $morehtmlleft .=
'</div>';
2403 if (empty($phototoshow)) {
2404 if ($object->element ==
'action') {
2406 $cssclass =
'photorefcenter';
2407 $nophoto =
img_picto(
'No photo',
'title_agenda');
2410 $cssclass =
'photorefcenter';
2411 $picto = $object->picto;
2412 $prefix =
'object_';
2413 if ($object->element ==
'project' && !$object->public) {
2416 if (strpos($picto,
'fontawesome_') !==
false) {
2419 $nophoto =
img_picto(
'No photo', $prefix.$picto);
2421 $morehtmlleft .=
'<!-- No photo to show -->';
2422 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"><div class="photoref">';
2423 $morehtmlleft .= $nophoto;
2424 $morehtmlleft .=
'</div></div>';
2431 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref">'.$form->showbarcode($object, 100,
'photoref valignmiddle').
'</div>';
2434 if ($object->element ==
'societe') {
2435 if (!empty($conf->use_javascript_ajax) && $user->hasRight(
'societe',
'creer') && !empty($conf->global->MAIN_DIRECT_STATUS_UPDATE)) {
2436 $morehtmlstatus .=
ajax_object_onoff($object,
'status',
'status',
'InActivity',
'ActivityCeased');
2438 $morehtmlstatus .= $object->getLibStatut(6);
2440 } elseif ($object->element ==
'product') {
2442 if (!empty($conf->use_javascript_ajax) && $user->hasRight(
'produit',
'creer') && !empty($conf->global->MAIN_DIRECT_STATUS_UPDATE)) {
2443 $morehtmlstatus .=
ajax_object_onoff($object,
'status',
'tosell',
'ProductStatusOnSell',
'ProductStatusNotOnSell');
2445 $morehtmlstatus .=
'<span class="statusrefsell">'.$object->getLibStatut(6, 0).
'</span>';
2447 $morehtmlstatus .=
' ';
2449 if (!empty($conf->use_javascript_ajax) && $user->hasRight(
'produit',
'creer') && !empty($conf->global->MAIN_DIRECT_STATUS_UPDATE)) {
2450 $morehtmlstatus .=
ajax_object_onoff($object,
'status_buy',
'tobuy',
'ProductStatusOnBuy',
'ProductStatusNotOnBuy');
2452 $morehtmlstatus .=
'<span class="statusrefbuy">'.$object->getLibStatut(6, 1).
'</span>';
2454 } elseif (in_array($object->element, array(
'facture',
'invoice',
'invoice_supplier',
'chargesociales',
'loan',
'tva',
'salary'))) {
2455 $tmptxt = $object->getLibStatut(6, $object->totalpaid);
2456 if (empty($tmptxt) || $tmptxt == $object->getLibStatut(3)) {
2457 $tmptxt = $object->getLibStatut(5, $object->totalpaid);
2459 $morehtmlstatus .= $tmptxt;
2460 } elseif ($object->element ==
'contrat' || $object->element ==
'contract') {
2461 if ($object->statut == 0) {
2462 $morehtmlstatus .= $object->getLibStatut(5);
2464 $morehtmlstatus .= $object->getLibStatut(4);
2466 } elseif ($object->element ==
'facturerec') {
2467 if ($object->frequency == 0) {
2468 $morehtmlstatus .= $object->getLibStatut(2);
2470 $morehtmlstatus .= $object->getLibStatut(5);
2472 } elseif ($object->element ==
'project_task') {
2473 $object->fk_statut = 1;
2474 if ($object->progress > 0) {
2475 $object->fk_statut = 2;
2477 if ($object->progress >= 100) {
2478 $object->fk_statut = 3;
2480 $tmptxt = $object->getLibStatut(5);
2481 $morehtmlstatus .= $tmptxt;
2482 } elseif (method_exists($object,
'getLibStatut')) {
2483 $tmptxt = $object->getLibStatut(6);
2484 if (empty($tmptxt) || $tmptxt == $object->getLibStatut(3)) {
2485 $tmptxt = $object->getLibStatut(5);
2487 $morehtmlstatus .= $tmptxt;
2491 if (isModEnabled(
'accounting') && in_array($object->element, array(
'bank',
'paiementcharge',
'facture',
'invoice',
'invoice_supplier',
'expensereport',
'payment_various'))) {
2493 if (method_exists($object,
'getVentilExportCompta')) {
2494 $accounted = $object->getVentilExportCompta();
2495 $langs->load(
"accountancy");
2496 $morehtmlstatus .=
'</div><div class="statusref statusrefbis"><span class="opacitymedium">'.($accounted > 0 ? $langs->trans(
"Accounted") : $langs->trans(
"NotYetAccounted")).
'</span>';
2501 if (!empty($object->name_alias)) {
2502 $morehtmlref .=
'<div class="refidno opacitymedium">'.dol_escape_htmltag($object->name_alias).
'</div>';
2506 if (in_array($object->element, array(
'product',
'bank_account',
'project_task'))) {
2507 if (!empty($object->label)) {
2508 $morehtmlref .=
'<div class="refidno opacitymedium">'.$object->label.
'</div>';
2513 if (method_exists($object,
'getBannerAddress') && !in_array($object->element, array(
'product',
'bookmark',
'ecm_directories',
'ecm_files'))) {
2514 $moreaddress = $object->getBannerAddress(
'refaddress', $object);
2516 $morehtmlref .=
'<div class="refidno refaddress">';
2517 $morehtmlref .= $moreaddress;
2518 $morehtmlref .=
'</div>';
2521 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)) {
2522 $morehtmlref .=
'<div style="clear: both;"></div>';
2523 $morehtmlref .=
'<div class="refidno opacitymedium">';
2524 $morehtmlref .= $langs->trans(
"TechnicalID").
': '.((int) $object->id);
2525 $morehtmlref .=
'</div>';
2528 $parameters=array(
'morehtmlref'=>$morehtmlref);
2529 $reshook = $hookmanager->executeHooks(
'formDolBanner', $parameters, $object, $action);
2532 } elseif (empty($reshook)) {
2533 $morehtmlref .= $hookmanager->resPrint;
2534 } elseif ($reshook > 0) {
2535 $morehtmlref = $hookmanager->resPrint;
2539 print
'<div class="'.($onlybanner ?
'arearefnobottom ' :
'arearef ').
'heightref valignmiddle centpercent">';
2540 print $form->showrefnav($object, $paramid, $morehtml, $shownav, $fieldid, $fieldref, $morehtmlref, $moreparam, $nodbprefix, $morehtmlleft, $morehtmlstatus, $morehtmlright);
2542 print
'<div class="underrefbanner clearboth"></div>';
2558 if ($fieldrequired) {
2559 $ret .=
'<span class="fieldrequired">';
2561 $ret .=
'<label for="'.$fieldkey.
'">';
2562 $ret .= $langs->trans($langkey);
2564 if ($fieldrequired) {
2580 $ret =
' '.$bc[$var];
2582 $ret = preg_replace(
'/class=\"/',
'class="'.$moreclass.
' ', $ret);
2600function dol_format_address($object, $withcountry = 0, $sep =
"\n", $outputlangs =
'', $mode = 0, $extralangcode =
'')
2602 global $conf, $langs, $hookmanager;
2605 $countriesusingstate = array(
'AU',
'CA',
'US',
'IN',
'GB',
'ES',
'UK',
'TR',
'CN');
2610 $ret .= ($extralangcode ? $object->array_languages[
'address'][$extralangcode] : (empty($object->address) ?
'' : preg_replace(
'/(\r\n|\r|\n)+/', $sep, $object->address)));
2613 if (isset($object->country_code) && in_array($object->country_code, array(
'AU',
'CA',
'US',
'CN')) || !empty($conf->global->MAIN_FORCE_STATE_INTO_ADDRESS)) {
2615 $town = ($extralangcode ? $object->array_languages[
'town'][$extralangcode] : (empty($object->town) ?
'' : $object->town));
2616 $ret .= (($ret && $town) ? $sep :
'').$town;
2618 if (!empty($object->state)) {
2619 $ret .= ($ret ? ($town ?
", " : $sep) :
'').$object->state;
2621 if (!empty($object->zip)) {
2622 $ret .= ($ret ? (($town || $object->state) ?
", " : $sep) :
'').$object->zip;
2624 } elseif (isset($object->country_code) && in_array($object->country_code, array(
'GB',
'UK'))) {
2626 $town = ($extralangcode ? $object->array_languages[
'town'][$extralangcode] : (empty($object->town) ?
'' : $object->town));
2627 $ret .= ($ret ? $sep :
'').$town;
2628 if (!empty($object->state)) {
2629 $ret .= ($ret ?
", " :
'').$object->state;
2631 if (!empty($object->zip)) {
2632 $ret .= ($ret ? $sep :
'').$object->zip;
2634 } elseif (isset($object->country_code) && in_array($object->country_code, array(
'ES',
'TR'))) {
2636 $ret .= ($ret ? $sep :
'').$object->zip;
2637 $town = ($extralangcode ? $object->array_languages[
'town'][$extralangcode] : (empty($object->town) ?
'' : $object->town));
2638 $ret .= ($town ? (($object->zip ?
' ' :
'').$town) :
'');
2639 if (!empty($object->state)) {
2640 $ret .= $sep.$object->state;
2642 } elseif (isset($object->country_code) && in_array($object->country_code, array(
'JP'))) {
2645 $town = ($extralangcode ? $object->array_languages[
'town'][$extralangcode] : (empty($object->town) ?
'' : $object->town));
2646 $ret .= ($ret ? $sep :
'').($object->state ? $object->state.
', ' :
'').$town.($object->zip ?
' ' :
'').$object->zip;
2647 } elseif (isset($object->country_code) && in_array($object->country_code, array(
'IT'))) {
2649 $ret .= ($ret ? $sep :
'').$object->zip;
2650 $town = ($extralangcode ? $object->array_languages[
'town'][$extralangcode] : (empty($object->town) ?
'' : $object->town));
2651 $ret .= ($town ? (($object->zip ?
' ' :
'').$town) :
'');
2652 $ret .= (empty($object->state_code) ?
'' : (
' '.$object->state_code));
2655 $town = ($extralangcode ? $object->array_languages[
'town'][$extralangcode] : (empty($object->town) ?
'' : $object->town));
2656 $ret .= !empty($object->zip) ? (($ret ? $sep :
'').$object->zip) :
'';
2657 $ret .= ($town ? (($object->zip ?
' ' : ($ret ? $sep :
'')).$town) :
'');
2658 if (!empty($object->state) && in_array($object->country_code, $countriesusingstate)) {
2659 $ret .= ($ret ?
", " :
'').$object->state;
2663 if (!is_object($outputlangs)) {
2664 $outputlangs = $langs;
2667 $langs->load(
"dict");
2668 $ret .= (empty($object->country_code) ?
'' : ($ret ? $sep :
'').$outputlangs->convToOutputCharset($outputlangs->transnoentitiesnoconv(
"Country".$object->country_code)));
2671 $parameters = array(
'withcountry' => $withcountry,
'sep' => $sep,
'outputlangs' => $outputlangs,
'mode' => $mode,
'extralangcode' => $extralangcode);
2672 $reshook = $hookmanager->executeHooks(
'formatAddress', $parameters, $object);
2676 $ret .= $hookmanager->resPrint;
2694 if ((abs($ts) <= 0x7FFFFFFF)) {
2695 return ($is_gmt) ? @gmstrftime($fmt, $ts) : @strftime($fmt, $ts);
2697 return 'Error date into a not supported range';
2722function dol_print_date($time, $format =
'', $tzoutput =
'auto', $outputlangs =
'', $encodetooutput =
false)
2724 global $conf, $langs;
2731 if ($tzoutput ===
'auto') {
2732 $tzoutput = (empty($conf) ?
'tzserver' : (isset($conf->tzuserinputkey) ? $conf->tzuserinputkey :
'tzserver'));
2737 $offsettz = $offsetdst = 0;
2740 if (is_string($tzoutput)) {
2741 if ($tzoutput ==
'tzserver') {
2743 $offsettzstring = @date_default_timezone_get();
2746 } elseif ($tzoutput ==
'tzuser' || $tzoutput ==
'tzuserrel') {
2748 $offsettzstring = (empty($_SESSION[
'dol_tz_string']) ?
'UTC' : $_SESSION[
'dol_tz_string']);
2750 if (class_exists(
'DateTimeZone')) {
2751 $user_date_tz =
new DateTimeZone($offsettzstring);
2752 $user_dt =
new DateTime();
2753 $user_dt->setTimezone($user_date_tz);
2754 $user_dt->setTimestamp($tzoutput ==
'tzuser' ?
dol_now() : (int) $time);
2755 $offsettz = $user_dt->getOffset();
2757 $offsettz = (empty($_SESSION[
'dol_tz']) ? 0 : $_SESSION[
'dol_tz']) * 60 * 60;
2758 $offsetdst = (empty($_SESSION[
'dol_dst']) ? 0 : $_SESSION[
'dol_dst']) * 60 * 60;
2763 if (!is_object($outputlangs)) {
2764 $outputlangs = $langs;
2767 $format =
'daytextshort';
2772 $reduceformat = (!empty($conf->dol_optimize_smallscreen) && in_array($format, array(
'day',
'dayhour'))) ? 1 : 0;
2773 $format = preg_replace(
'/inputnoreduce/',
'', $format);
2774 $formatwithoutreduce = preg_replace(
'/reduceformat/',
'', $format);
2775 if ($formatwithoutreduce != $format) {
2776 $format = $formatwithoutreduce;
2782 if ($format ==
'day') {
2783 $format = ($outputlangs->trans(
"FormatDateShort") !=
"FormatDateShort" ? $outputlangs->trans(
"FormatDateShort") : $conf->format_date_short);
2784 } elseif ($format ==
'hour') {
2785 $format = ($outputlangs->trans(
"FormatHourShort") !=
"FormatHourShort" ? $outputlangs->trans(
"FormatHourShort") : $conf->format_hour_short);
2786 } elseif ($format ==
'hourduration') {
2787 $format = ($outputlangs->trans(
"FormatHourShortDuration") !=
"FormatHourShortDuration" ? $outputlangs->trans(
"FormatHourShortDuration") : $conf->format_hour_short_duration);
2788 } elseif ($format ==
'daytext') {
2789 $format = ($outputlangs->trans(
"FormatDateText") !=
"FormatDateText" ? $outputlangs->trans(
"FormatDateText") : $conf->format_date_text);
2790 } elseif ($format ==
'daytextshort') {
2791 $format = ($outputlangs->trans(
"FormatDateTextShort") !=
"FormatDateTextShort" ? $outputlangs->trans(
"FormatDateTextShort") : $conf->format_date_text_short);
2792 } elseif ($format ==
'dayhour') {
2793 $format = ($outputlangs->trans(
"FormatDateHourShort") !=
"FormatDateHourShort" ? $outputlangs->trans(
"FormatDateHourShort") : $conf->format_date_hour_short);
2794 } elseif ($format ==
'dayhoursec') {
2795 $format = ($outputlangs->trans(
"FormatDateHourSecShort") !=
"FormatDateHourSecShort" ? $outputlangs->trans(
"FormatDateHourSecShort") : $conf->format_date_hour_sec_short);
2796 } elseif ($format ==
'dayhourtext') {
2797 $format = ($outputlangs->trans(
"FormatDateHourText") !=
"FormatDateHourText" ? $outputlangs->trans(
"FormatDateHourText") : $conf->format_date_hour_text);
2798 } elseif ($format ==
'dayhourtextshort') {
2799 $format = ($outputlangs->trans(
"FormatDateHourTextShort") !=
"FormatDateHourTextShort" ? $outputlangs->trans(
"FormatDateHourTextShort") : $conf->format_date_hour_text_short);
2800 } elseif ($format ==
'dayhourlog') {
2802 $format =
'%Y%m%d%H%M%S';
2803 } elseif ($format ==
'dayhourlogsmall') {
2805 $format =
'%y%m%d%H%M';
2806 } elseif ($format ==
'dayhourldap') {
2807 $format =
'%Y%m%d%H%M%SZ';
2808 } elseif ($format ==
'dayhourxcard') {
2809 $format =
'%Y%m%dT%H%M%SZ';
2810 } elseif ($format ==
'dayxcard') {
2812 } elseif ($format ==
'dayrfc') {
2813 $format =
'%Y-%m-%d';
2814 } elseif ($format ==
'dayhourrfc') {
2815 $format =
'%Y-%m-%dT%H:%M:%SZ';
2816 } elseif ($format ==
'standard') {
2817 $format =
'%Y-%m-%d %H:%M:%S';
2820 if ($reduceformat) {
2821 $format = str_replace(
'%Y',
'%y', $format);
2822 $format = str_replace(
'yyyy',
'yy', $format);
2826 if (preg_match(
'/%b/i', $format)) {
2828 $format = str_replace(
'%b',
'__b__', $format);
2829 $format = str_replace(
'%B',
'__B__', $format);
2831 if (preg_match(
'/%a/i', $format)) {
2833 $format = str_replace(
'%a',
'__a__', $format);
2834 $format = str_replace(
'%A',
'__A__', $format);
2839 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)) {
2840 dol_print_error(
'',
"Functions.lib::dol_print_date function called with a bad value from page ".$_SERVER[
"PHP_SELF"]);
2842 } elseif (preg_match(
'/^([0-9]+)\-([0-9]+)\-([0-9]+) ?([0-9]+)?:?([0-9]+)?:?([0-9]+)?/i', $time, $reg)) {
2844 dol_syslog(
"Functions.lib::dol_print_date function called with a bad value from page ".$_SERVER[
"PHP_SELF"], LOG_WARNING);
2847 $syear = (!empty($reg[1]) ? $reg[1] :
'');
2848 $smonth = (!empty($reg[2]) ? $reg[2] :
'');
2849 $sday = (!empty($reg[3]) ? $reg[3] :
'');
2850 $shour = (!empty($reg[4]) ? $reg[4] :
'');
2851 $smin = (!empty($reg[5]) ? $reg[5] :
'');
2852 $ssec = (!empty($reg[6]) ? $reg[6] :
'');
2854 $time =
dol_mktime($shour, $smin, $ssec, $smonth, $sday, $syear,
true);
2857 $tzo =
new DateTimeZone(
'UTC');
2859 $tzo =
new DateTimeZone(date_default_timezone_get());
2861 $dtts =
new DateTime();
2862 $dtts->setTimestamp($time);
2863 $dtts->setTimezone($tzo);
2864 $newformat = str_replace(
2865 array(
'%Y',
'%y',
'%m',
'%d',
'%H',
'%I',
'%M',
'%S',
'%p',
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
2866 array(
'Y',
'y',
'm',
'd',
'H',
'h',
'i',
's',
'A',
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
2868 $ret = $dtts->format($newformat);
2870 array(
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
2871 array(
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
2876 if ($time < 100000000000) {
2877 $timetouse = $time + $offsettz + $offsetdst;
2880 $tzo =
new DateTimeZone(
'UTC');
2882 $tzo =
new DateTimeZone(date_default_timezone_get());
2884 $dtts =
new DateTime();
2885 $dtts->setTimestamp($timetouse);
2886 $dtts->setTimezone($tzo);
2887 $newformat = str_replace(
2888 array(
'%Y',
'%y',
'%m',
'%d',
'%H',
'%I',
'%M',
'%S',
'%p',
'%w',
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
2889 array(
'Y',
'y',
'm',
'd',
'H',
'h',
'i',
's',
'A',
'w',
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
2891 $ret = $dtts->format($newformat);
2893 array(
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
2894 array(
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
2899 $ret =
'Bad value '.$time.
' for date';
2903 if (preg_match(
'/__b__/i', $format)) {
2904 $timetouse = $time + $offsettz + $offsetdst;
2907 $tzo =
new DateTimeZone(
'UTC');
2909 $tzo =
new DateTimeZone(date_default_timezone_get());
2911 $dtts =
new DateTime();
2912 $dtts->setTimestamp($timetouse);
2913 $dtts->setTimezone($tzo);
2914 $month = $dtts->format(
"m");
2915 $month = sprintf(
"%02d", $month);
2916 if ($encodetooutput) {
2917 $monthtext = $outputlangs->transnoentities(
'Month'.$month);
2918 $monthtextshort = $outputlangs->transnoentities(
'MonthShort'.$month);
2920 $monthtext = $outputlangs->transnoentitiesnoconv(
'Month'.$month);
2921 $monthtextshort = $outputlangs->transnoentitiesnoconv(
'MonthShort'.$month);
2924 $ret = str_replace(
'__b__', $monthtextshort, $ret);
2925 $ret = str_replace(
'__B__', $monthtext, $ret);
2929 if (preg_match(
'/__a__/i', $format)) {
2931 $timetouse = $time + $offsettz + $offsetdst;
2934 $tzo =
new DateTimeZone(
'UTC');
2936 $tzo =
new DateTimeZone(date_default_timezone_get());
2938 $dtts =
new DateTime();
2939 $dtts->setTimestamp($timetouse);
2940 $dtts->setTimezone($tzo);
2941 $w = $dtts->format(
"w");
2942 $dayweek = $outputlangs->transnoentitiesnoconv(
'Day'.$w);
2944 $ret = str_replace(
'__A__', $dayweek, $ret);
2945 $ret = str_replace(
'__a__',
dol_substr($dayweek, 0, 3), $ret);
2974 $datetimeobj =
new DateTime();
2975 $datetimeobj->setTimestamp($timestamp);
2976 if ($forcetimezone) {
2977 $datetimeobj->setTimezone(
new DateTimeZone($forcetimezone ==
'gmt' ?
'UTC' : $forcetimezone));
2980 'year'=>((
int) date_format($datetimeobj,
'Y')),
2981 'mon'=>((
int) date_format($datetimeobj,
'm')),
2982 'mday'=>((
int) date_format($datetimeobj,
'd')),
2983 'wday'=>((
int) date_format($datetimeobj,
'w')),
2984 'yday'=>((
int) date_format($datetimeobj,
'z')),
2985 'hours'=>((
int) date_format($datetimeobj,
'H')),
2986 'minutes'=>((
int) date_format($datetimeobj,
'i')),
2987 'seconds'=>((
int) date_format($datetimeobj,
's')),
3015function dol_mktime($hour, $minute, $second, $month, $day, $year, $gm =
'auto', $check = 1)
3020 if ($gm ===
'auto') {
3021 $gm = (empty($conf) ?
'tzserver' : $conf->tzuserinputkey);
3026 if ($hour == -1 || empty($hour)) {
3029 if ($minute == -1 || empty($minute)) {
3032 if ($second == -1 || empty($second)) {
3038 if (!$month || !$day) {
3047 if ($hour < 0 || $hour > 24) {
3050 if ($minute < 0 || $minute > 60) {
3053 if ($second < 0 || $second > 60) {
3058 if (empty($gm) || ($gm ===
'server' || $gm ===
'tzserver')) {
3059 $default_timezone = @date_default_timezone_get();
3060 $localtz =
new DateTimeZone($default_timezone);
3061 } elseif ($gm ===
'user' || $gm ===
'tzuser' || $gm ===
'tzuserrel') {
3063 $default_timezone = (empty($_SESSION[
"dol_tz_string"]) ? @date_default_timezone_get() : $_SESSION[
"dol_tz_string"]);
3065 $localtz =
new DateTimeZone($default_timezone);
3067 dol_syslog(
"Warning dol_tz_string contains an invalid value ".$_SESSION[
"dol_tz_string"], LOG_WARNING);
3068 $default_timezone = @date_default_timezone_get();
3070 } elseif (strrpos($gm,
"tz,") !==
false) {
3071 $timezone = str_replace(
"tz,",
"", $gm);
3073 $localtz =
new DateTimeZone($timezone);
3075 dol_syslog(
"Warning passed timezone contains an invalid value ".$timezone, LOG_WARNING);
3079 if (empty($localtz)) {
3080 $localtz =
new DateTimeZone(
'UTC');
3084 $dt =
new DateTime(
'now', $localtz);
3085 $dt->setDate((
int) $year, (
int) $month, (
int) $day);
3086 $dt->setTime((
int) $hour, (
int) $minute, (
int) $second);
3087 $date = $dt->getTimestamp();
3107 if ($mode ===
'auto') {
3111 if ($mode ==
'gmt') {
3113 } elseif ($mode ==
'tzserver') {
3114 require_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
3116 $ret = (int) (
dol_now(
'gmt') + ($tzsecond * 3600));
3122 } elseif ($mode ==
'tzuser' || $mode ==
'tzuserrel') {
3125 $offsettz = (empty($_SESSION[
'dol_tz']) ? 0 : $_SESSION[
'dol_tz']) * 60 * 60;
3126 $offsetdst = (empty($_SESSION[
'dol_dst']) ? 0 : $_SESSION[
'dol_dst']) * 60 * 60;
3127 $ret = (int) (
dol_now(
'gmt') + ($offsettz + $offsetdst));
3144 global $conf, $langs;
3147 if (!empty($conf->dol_optimize_smallscreen)) {
3152 if (empty($shortvalue) || $size < ($level * 10)) {
3154 $textunitshort = $langs->trans(
"b");
3155 $textunitlong = $langs->trans(
"Bytes");
3157 $ret = round($size / $level, 0);
3158 $textunitshort = $langs->trans(
"Kb");
3159 $textunitlong = $langs->trans(
"KiloBytes");
3162 if (empty($shortunit)) {
3163 $ret .=
' '.$textunitlong;
3165 $ret .=
' '.$textunitshort;
3181function dol_print_url($url, $target =
'_blank', $max = 32, $withpicto = 0, $morecss =
'float')
3189 $link =
'<a href="';
3190 if (!preg_match(
'/^http/i', $url)) {
3196 $link .=
' target="'.$target.
'"';
3199 if (!preg_match(
'/^http/i', $url)) {
3205 if ($morecss ==
'float') {
3206 return '<div class="nospan'.($morecss ?
' '.$morecss :
'').
'" style="margin-right: 10px">'.($withpicto ?
img_picto($langs->trans(
"Url"),
'globe').
' ' :
'').$link.
'</div>';
3208 return '<span class="nospan'.($morecss ?
' '.$morecss :
'').
'" style="margin-right: 10px">'.($withpicto ?
img_picto($langs->trans(
"Url"),
'globe').
' ' :
'').$link.
'</span>';
3224function dol_print_email($email, $cid = 0, $socid = 0, $addlink = 0, $max = 64, $showinvalid = 1, $withpicto = 0)
3226 global $conf, $user, $langs, $hookmanager;
3230 if (!empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER) && $withpicto) {
3234 if (empty($email)) {
3238 if (!empty($addlink)) {
3239 $newemail =
'<a style="text-overflow: ellipsis;" href="';
3240 if (!preg_match(
'/^mailto:/i', $email)) {
3241 $newemail .=
'mailto:';
3243 $newemail .= $email;
3246 $newemail .=
'</a>';
3248 $langs->load(
"errors");
3249 $newemail .=
img_warning($langs->trans(
"ErrorBadEMail", $email));
3252 if (($cid || $socid) && isModEnabled(
'agenda') && $user->hasRight(
"agenda",
"myactions",
"create")) {
3255 if (!empty($conf->global->AGENDA_ADDACTIONFOREMAIL)) {
3256 $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>';
3259 $newemail =
'<div>'.$newemail.
' '.$link.
'</div>';
3264 $langs->load(
"errors");
3265 $newemail .=
img_warning($langs->trans(
"ErrorBadEMail", $email));
3270 $rep = ($withpicto ?
img_picto($langs->trans(
"EMail").
' : '.$email, (is_numeric($withpicto) ?
'email' : $withpicto)).
' ' :
'').$newemail;
3273 $parameters = array(
'cid' => $cid,
'socid' => $socid,
'addlink' => $addlink,
'picto' => $withpicto);
3275 $reshook = $hookmanager->executeHooks(
'printEmail', $parameters, $email);
3279 $rep .= $hookmanager->resPrint;
3294 $socialnetworks = array();
3296 require_once DOL_DOCUMENT_ROOT.
'/core/lib/memory.lib.php';
3297 $cachekey =
'socialnetworks_' . $conf->entity;
3299 if (!is_null($dataretrieved)) {
3300 $socialnetworks = $dataretrieved;
3302 $sql =
"SELECT rowid, code, label, url, icon, active FROM ".MAIN_DB_PREFIX.
"c_socialnetworks";
3303 $sql .=
" WHERE entity=".$conf->entity;
3304 $resql = $db->query($sql);
3306 while ($obj = $db->fetch_object($resql)) {
3307 $socialnetworks[$obj->code] = array(
3308 'rowid' => $obj->rowid,
3309 'label' => $obj->label,
3311 'icon' => $obj->icon,
3312 'active' => $obj->active,
3319 return $socialnetworks;
3334 global $conf, $user, $langs;
3338 if (empty($value)) {
3342 if (!empty($type)) {
3343 $htmllink =
'<div class="divsocialnetwork inline-block valignmiddle">';
3345 $htmllink .=
'<span class="fa pictofixedwidth '.($dictsocialnetworks[$type][
'icon'] ? $dictsocialnetworks[$type][
'icon'] :
'fa-link').
'"></span>';
3346 if ($type ==
'skype') {
3348 $htmllink .=
' <a href="skype:';
3350 $htmllink .=
'?call" alt="'.$langs->trans(
"Call").
' '.$value.
'" title="'.
dol_escape_htmltag($langs->trans(
"Call").
' '.$value).
'">';
3351 $htmllink .=
'<img src="'.DOL_URL_ROOT.
'/theme/common/skype_callbutton.png" border="0">';
3352 $htmllink .=
'</a><a href="skype:';
3354 $htmllink .=
'?chat" alt="'.$langs->trans(
"Chat").
' '.$value.
'" title="'.
dol_escape_htmltag($langs->trans(
"Chat").
' '.$value).
'">';
3355 $htmllink .=
'<img class="paddingleft" src="'.DOL_URL_ROOT.
'/theme/common/skype_chatbutton.png" border="0">';
3356 $htmllink .=
'</a>';
3357 if (($cid || $socid) && isModEnabled(
'agenda') && $user->hasRight(
'agenda',
'myactions',
'create')) {
3358 $addlink =
'AC_SKYPE';
3360 if (!empty($conf->global->AGENDA_ADDACTIONFORSKYPE)) {
3361 $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>';
3363 $htmllink .= ($link ?
' '.$link :
'');
3366 if (!empty($dictsocialnetworks[$type][
'url'])) {
3367 $tmpvirginurl = preg_replace(
'/\/?{socialid}/',
'', $dictsocialnetworks[$type][
'url']);
3368 if ($tmpvirginurl) {
3369 $value = preg_replace(
'/^www\.'.preg_quote($tmpvirginurl,
'/').
'\/?/',
'', $value);
3370 $value = preg_replace(
'/^'.preg_quote($tmpvirginurl,
'/').
'\/?/',
'', $value);
3372 $tmpvirginurl3 = preg_replace(
'/^https:\/\//i',
'https://www.', $tmpvirginurl);
3373 if ($tmpvirginurl3) {
3374 $value = preg_replace(
'/^www\.'.preg_quote($tmpvirginurl3,
'/').
'\/?/',
'', $value);
3375 $value = preg_replace(
'/^'.preg_quote($tmpvirginurl3,
'/').
'\/?/',
'', $value);
3378 $tmpvirginurl2 = preg_replace(
'/^https?:\/\//i',
'', $tmpvirginurl);
3379 if ($tmpvirginurl2) {
3380 $value = preg_replace(
'/^www\.'.preg_quote($tmpvirginurl2,
'/').
'\/?/',
'', $value);
3381 $value = preg_replace(
'/^'.preg_quote($tmpvirginurl2,
'/').
'\/?/',
'', $value);
3384 $link = str_replace(
'{socialid}', $value, $dictsocialnetworks[$type][
'url']);
3385 if (preg_match(
'/^https?:\/\//i', $link)) {
3386 $htmllink .=
'<a href="'.dol_sanitizeUrl($link, 0).
'" target="_blank" rel="noopener noreferrer">'.
dol_escape_htmltag($value).
'</a>';
3388 $htmllink .=
'<a href="'.dol_sanitizeUrl($link, 1).
'" target="_blank" rel="noopener noreferrer">'.
dol_escape_htmltag($value).
'</a>';
3394 $htmllink .=
'</div>';
3396 $langs->load(
"errors");
3397 $htmllink .=
img_warning($langs->trans(
"ErrorBadSocialNetworkValue", $value));
3412function dol_print_profids($profID, $profIDtype, $countrycode =
'', $addcpButton = 1, $separ =
' ')
3416 if (empty($profID) || empty($profIDtype)) {
3419 if (empty($countrycode)) $countrycode = $mysoc->country_code;
3420 $newProfID = $profID;
3421 $id = substr($profIDtype, -1);
3423 if (strtoupper($countrycode) ==
'FR') {
3425 if ($id == 1 &&
dol_strlen($newProfID) == 9) $newProfID = substr($newProfID, 0, 3).$separ.substr($newProfID, 3, 3).$separ.substr($newProfID, 6, 3);
3426 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);
3427 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);
3430 else $ret = $newProfID;
3448function dol_print_phone($phone, $countrycode =
'', $cid = 0, $socid = 0, $addlink =
'', $separ =
" ", $withpicto =
'', $titlealt =
'', $adddivfloat = 0)
3450 global $conf, $user, $langs, $mysoc, $hookmanager;
3453 $phone = is_null($phone) ?
'' : preg_replace(
"/[\s.-]/",
"", trim($phone));
3454 if (empty($phone)) {
3457 if (!empty($conf->global->MAIN_PHONE_SEPAR)) {
3458 $separ = $conf->global->MAIN_PHONE_SEPAR;
3460 if (empty($countrycode) && is_object($mysoc)) {
3461 $countrycode = $mysoc->country_code;
3465 if ($conf->dol_optimize_smallscreen) {
3470 if (strtoupper($countrycode) ==
"FR") {
3473 $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);
3475 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 2).$separ.substr($newphone, 5, 2);
3477 $newphone = substr($newphone, 0, 2).$separ.substr($newphone, 2, 3).$separ.substr($newphone, 5, 2).$separ.substr($newphone, 7, 2);
3479 $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);
3481 $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);
3483 $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);
3485 } elseif (strtoupper($countrycode) ==
"CA") {
3487 $newphone = ($separ !=
'' ?
'(' :
'').substr($newphone, 0, 3).($separ !=
'' ?
')' :
'').$separ.substr($newphone, 3, 3).($separ !=
'' ?
'-' :
'').substr($newphone, 6, 4);
3489 } elseif (strtoupper($countrycode) ==
"PT") {
3491 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 3);
3493 } elseif (strtoupper($countrycode) ==
"SR") {
3495 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3);
3497 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 4);
3499 } elseif (strtoupper($countrycode) ==
"DE") {
3501 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 4).$separ.substr($newphone, 7, 4).$separ.substr($newphone, 11, 3);
3503 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 4).$separ.substr($newphone, 10, 3);
3505 } elseif (strtoupper($countrycode) ==
"ES") {
3507 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 3);
3509 } elseif (strtoupper($countrycode) ==
"BF") {
3511 $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);
3513 } elseif (strtoupper($countrycode) ==
"RO") {
3515 $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);
3517 } elseif (strtoupper($countrycode) ==
"TR") {
3519 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 4);
3521 } elseif (strtoupper($countrycode) ==
"US") {
3523 $newphone = substr($newphone, 0, 2).$separ.substr($newphone, 2, 3).$separ.substr($newphone, 5, 3).$separ.substr($newphone, 8, 4);
3525 } elseif (strtoupper($countrycode) ==
"MX") {
3527 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 4).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 2);
3529 $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);
3531 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 4);
3533 } elseif (strtoupper($countrycode) ==
"ML") {
3535 $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);
3537 } elseif (strtoupper($countrycode) ==
"TH") {
3539 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 2).$separ.substr($newphone, 8, 3);
3541 $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);
3543 } elseif (strtoupper($countrycode) ==
"MU") {
3546 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 2).$separ.substr($newphone, 9, 2);
3548 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 4).$separ.substr($newphone, 8, 2).$separ.substr($newphone, 10, 2);
3550 } elseif (strtoupper($countrycode) ==
"ZA") {
3552 $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);
3554 } elseif (strtoupper($countrycode) ==
"SY") {
3556 $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);
3558 $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);
3560 } elseif (strtoupper($countrycode) ==
"AE") {
3562 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 2);
3564 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 3);
3566 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 4);
3568 } elseif (strtoupper($countrycode) ==
"DZ") {
3570 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 3);
3572 } elseif (strtoupper($countrycode) ==
"BE") {
3574 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 2).$separ.substr($newphone, 8, 3);
3576 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 3);
3578 } elseif (strtoupper($countrycode) ==
"PF") {
3580 $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);
3582 } elseif (strtoupper($countrycode) ==
"CO") {
3584 $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);
3586 } elseif (strtoupper($countrycode) ==
"JO") {
3588 $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);
3590 } elseif (strtoupper($countrycode) ==
"JM") {
3592 $newphone = substr($newphone, 0, 5).$separ.substr($newphone, 5, 3).$separ.substr($newphone, 8, 4);
3594 } elseif (strtoupper($countrycode) ==
"MG") {
3596 $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);
3598 } elseif (strtoupper($countrycode) ==
"GB") {
3600 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 4).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 3);
3602 } elseif (strtoupper($countrycode) ==
"CH") {
3604 $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);
3606 $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);
3608 } elseif (strtoupper($countrycode) ==
"TN") {
3610 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 2).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 3);
3612 } elseif (strtoupper($countrycode) ==
"GF") {
3614 $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);
3616 } elseif (strtoupper($countrycode) ==
"GP") {
3618 $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);
3620 } elseif (strtoupper($countrycode) ==
"MQ") {
3622 $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);
3624 } elseif (strtoupper($countrycode) ==
"IT") {
3626 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 3);
3628 $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);
3630 } elseif (strtoupper($countrycode) ==
"AU") {
3634 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 1).$separ.substr($newphone, 4, 4).$separ.substr($newphone, 8, 4);
3636 } elseif (strtoupper($countrycode) ==
"LU") {
3639 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 2).$separ.substr($newphone, 6, 2).$separ.substr($newphone, 8, 2);
3641 $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);
3643 $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);
3645 $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);
3648 if (!empty($addlink)) {
3649 if ($addlink ==
'tel' || $conf->browser->layout ==
'phone' || (isModEnabled(
'clicktodial') && !empty($conf->global->CLICKTODIAL_USE_TEL_LINK_ON_PHONE_NUMBERS))) {
3650 $newphoneform = $newphone;
3651 $newphone =
'<a href="tel:'.$phone.
'"';
3652 $newphone .=
'>'.$newphoneform.
'</a>';
3653 } elseif (isModEnabled(
'clicktodial') && $addlink ==
'AC_TEL') {
3654 if (empty($user->clicktodial_loaded)) {
3655 $user->fetch_clicktodial();
3659 $urlmask =
'ErrorClickToDialModuleNotConfigured';
3660 if (!empty($conf->global->CLICKTODIAL_URL)) {
3661 $urlmask = $conf->global->CLICKTODIAL_URL;
3663 if (!empty($user->clicktodial_url)) {
3664 $urlmask = $user->clicktodial_url;
3667 $clicktodial_poste = (!empty($user->clicktodial_poste) ?urlencode($user->clicktodial_poste) :
'');
3668 $clicktodial_login = (!empty($user->clicktodial_login) ?urlencode($user->clicktodial_login) :
'');
3669 $clicktodial_password = (!empty($user->clicktodial_password) ?urlencode($user->clicktodial_password) :
'');
3671 $url = sprintf($urlmask, urlencode($phone), $clicktodial_poste, $clicktodial_login, $clicktodial_password);
3673 $substitarray = array(
'__PHONEFROM__'=>$clicktodial_poste,
3674 '__PHONETO__'=>urlencode($phone),
3675 '__LOGIN__'=>$clicktodial_login,
3676 '__PASS__'=>$clicktodial_password);
3678 $newphonesav = $newphone;
3679 if (empty($conf->global->CLICKTODIAL_DO_NOT_USE_AJAX_CALL)) {
3681 $newphone =
'<a href="'.$url.
'" class="cssforclicktodial"';
3682 $newphone .=
'>'.$newphonesav.
'</a>';
3685 $newphone =
'<a href="'.$url.
'"';
3686 if (!empty($conf->global->CLICKTODIAL_FORCENEWTARGET)) {
3687 $newphone .=
' target="_blank" rel="noopener noreferrer"';
3689 $newphone .=
'>'.$newphonesav.
'</a>';
3694 if (isModEnabled(
'agenda') && $user->hasRight(
"agenda",
"myactions",
"create")) {
3697 if ($addlink ==
'AC_FAX') {
3700 if (!empty($conf->global->AGENDA_ADDACTIONFORPHONE)) {
3701 $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>';
3704 $newphone =
'<div>'.$newphone.
' '.$link.
'</div>';
3709 if (empty($titlealt)) {
3710 $titlealt = ($withpicto ==
'fax' ? $langs->trans(
"Fax") : $langs->trans(
"Phone"));
3715 $parameters = array(
'countrycode' => $countrycode,
'cid' => $cid,
'socid' => $socid,
'titlealt' => $titlealt,
'picto' => $withpicto);
3716 $reshook = $hookmanager->executeHooks(
'printPhone', $parameters, $phone);
3717 $rep .= $hookmanager->resPrint;
3719 if (empty($reshook)) {
3722 if ($withpicto ==
'fax') {
3723 $picto =
'phoning_fax';
3724 } elseif ($withpicto ==
'phone') {
3726 } elseif ($withpicto ==
'mobile') {
3727 $picto =
'phoning_mobile';
3732 if ($adddivfloat == 1) {
3733 $rep .=
'<div class="nospan float" style="margin-right: 10px">';
3734 } elseif (empty($adddivfloat)) {
3735 $rep .=
'<span style="margin-right: 10px;">';
3737 $rep .= ($withpicto ?
img_picto($titlealt,
'object_'.$picto.
'.png').
' ' :
'').$newphone;
3738 if ($adddivfloat == 1) {
3740 } elseif (empty($adddivfloat)) {
3757 global $conf, $langs;
3768 if (file_exists(DOL_DOCUMENT_ROOT.
'/theme/common/flags/'.$countrycode.
'.png')) {
3769 $ret .=
' '.img_picto($countrycode.
' '.$langs->trans(
"AccordingToGeoIPDatabase"), DOL_URL_ROOT.
'/theme/common/flags/'.$countrycode.
'.png',
'', 1);
3771 $ret .=
' ('.$countrycode.
')';
3791 if (empty($_SERVER[
'HTTP_X_FORWARDED_FOR']) || preg_match(
'/[^0-9\.\:,\[\]]/', $_SERVER[
'HTTP_X_FORWARDED_FOR'])) {
3792 if (empty($_SERVER[
'HTTP_CLIENT_IP']) || preg_match(
'/[^0-9\.\:,\[\]]/', $_SERVER[
'HTTP_CLIENT_IP'])) {
3793 if (empty($_SERVER[
"HTTP_CF_CONNECTING_IP"])) {
3794 $ip = (empty($_SERVER[
'REMOTE_ADDR']) ?
'' : $_SERVER[
'REMOTE_ADDR']);
3796 $ip = $_SERVER[
"HTTP_CF_CONNECTING_IP"];
3799 $ip = $_SERVER[
'HTTP_CLIENT_IP'];
3802 $ip = $_SERVER[
'HTTP_X_FORWARDED_FOR'];
3818 if (isset($_SERVER[
'HTTPS']) && $_SERVER[
'HTTPS'] ==
'on') {
3820 } 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') {
3838 if (!empty($conf->geoipmaxmind->enabled)) {
3842 include_once DOL_DOCUMENT_ROOT.
'/core/class/dolgeoip.class.php';
3843 $geoip =
new DolGeoIP(
'country', $datafile);
3845 $countrycode = $geoip->getCountryCodeFromIP($ip);
3848 return $countrycode;
3860 global $conf, $langs, $user;
3864 if (!empty($conf->geoipmaxmind->enabled)) {
3869 include_once DOL_DOCUMENT_ROOT.
'/core/class/dolgeoip.class.php';
3870 $geoip =
new DolGeoIP(
'country', $datafile);
3871 $countrycode = $geoip->getCountryCodeFromIP($ip);
3872 $ret = $countrycode;
3891 global $conf, $user, $langs, $hookmanager;
3897 $parameters = array(
'element' => $element,
'id' => $id);
3898 $reshook = $hookmanager->executeHooks(
'printAddress', $parameters, $address);
3899 $out .= $hookmanager->resPrint;
3901 if (empty($reshook)) {
3902 if (empty($charfornl)) {
3903 $out .= nl2br($address);
3905 $out .= preg_replace(
'/[\r\n]+/', $charfornl, $address);
3909 $showgmap = $showomap = 0;
3910 if (($element ==
'thirdparty' || $element ==
'societe') && isModEnabled(
'google') && !empty($conf->global->GOOGLE_ENABLE_GMAPS)) {
3913 if ($element ==
'contact' && isModEnabled(
'google') && !empty($conf->global->GOOGLE_ENABLE_GMAPS_CONTACTS)) {
3916 if ($element ==
'member' && isModEnabled(
'google') && !empty($conf->global->GOOGLE_ENABLE_GMAPS_MEMBERS)) {
3919 if (($element ==
'thirdparty' || $element ==
'societe') && isModEnabled(
'openstreetmap') && !empty($conf->global->OPENSTREETMAP_ENABLE_MAPS)) {
3922 if ($element ==
'contact' && isModEnabled(
'openstreetmap') && !empty($conf->global->OPENSTREETMAP_ENABLE_MAPS_CONTACTS)) {
3925 if ($element ==
'member' && isModEnabled(
'openstreetmap') && !empty($conf->global->OPENSTREETMAP_ENABLE_MAPS_MEMBERS)) {
3929 $url =
dol_buildpath(
'/google/gmaps.php?mode='.$element.
'&id='.$id, 1);
3930 $out .=
' <a href="'.$url.
'" target="_gmaps"><img id="'.$htmlid.
'" class="valigntextbottom" src="'.DOL_URL_ROOT.
'/theme/common/gmap.png"></a>';
3933 $url =
dol_buildpath(
'/openstreetmap/maps.php?mode='.$element.
'&id='.$id, 1);
3934 $out .=
' <a href="'.$url.
'" target="_gmaps"><img id="'.$htmlid.
'_openstreetmap" class="valigntextbottom" src="'.DOL_URL_ROOT.
'/theme/common/gmap.png"></a>';
3955function isValidEmail($address, $acceptsupervisorkey = 0, $acceptuserkey = 0)
3957 if ($acceptsupervisorkey && $address ==
'__SUPERVISOREMAIL__') {
3960 if ($acceptuserkey && $address ==
'__USER_EMAIL__') {
3963 if (filter_var($address, FILTER_VALIDATE_EMAIL)) {
3980 if (function_exists(
'idn_to_ascii') && function_exists(
'checkdnsrr')) {
3981 if (!checkdnsrr(idn_to_ascii($domain),
'MX')) {
3984 if (function_exists(
'getmxrr')) {
3987 getmxrr(idn_to_ascii($domain), $mxhosts, $weight);
3988 if (count($mxhosts) > 1) {
3991 if (count($mxhosts) == 1 && !empty($mxhosts[0])) {
4028 $tmparray = explode(
' ', $s);
4029 foreach ($tmparray as $tmps) {
4046 if (is_null($string)) {
4050 if (function_exists(
'mb_strlen')) {
4051 return mb_strlen($string, $stringencoding);
4053 return strlen($string);
4067function dol_substr($string, $start, $length =
null, $stringencoding =
'', $trunconbytes = 0)
4071 if (empty($stringencoding)) {
4072 $stringencoding = $langs->charset_output;
4076 if (empty($trunconbytes)) {
4077 if (function_exists(
'mb_substr')) {
4078 $ret = mb_substr($string, $start, $length, $stringencoding);
4080 $ret = substr($string, $start, $length);
4083 if (function_exists(
'mb_strcut')) {
4084 $ret = mb_strcut($string, $start, $length, $stringencoding);
4086 $ret = substr($string, $start, $length);
4106function dol_trunc($string, $size = 40, $trunc =
'right', $stringencoding =
'UTF-8', $nodot = 0, $display = 0)
4110 if (empty($size) || !empty($conf->global->MAIN_DISABLE_TRUNC)) {
4114 if (empty($stringencoding)) {
4115 $stringencoding =
'UTF-8';
4118 if ($conf->dol_optimize_smallscreen == 1 && $display == 1) {
4119 $size = round($size / 3);
4123 if ($trunc ==
'right') {
4125 if (
dol_strlen($newstring, $stringencoding) > ($size + ($nodot ? 0 : 1))) {
4127 return dol_substr($newstring, 0, $size, $stringencoding).($nodot ?
'' :
'…');
4132 } elseif ($trunc ==
'middle') {
4134 if (
dol_strlen($newstring, $stringencoding) > 2 &&
dol_strlen($newstring, $stringencoding) > ($size + 1)) {
4135 $size1 = round($size / 2);
4136 $size2 = round($size / 2);
4137 return dol_substr($newstring, 0, $size1, $stringencoding).
'…'.
dol_substr($newstring,
dol_strlen($newstring, $stringencoding) - $size2, $size2, $stringencoding);
4141 } elseif ($trunc ==
'left') {
4143 if (
dol_strlen($newstring, $stringencoding) > ($size + ($nodot ? 0 : 1))) {
4145 return '…'.dol_substr($newstring,
dol_strlen($newstring, $stringencoding) - $size, $size, $stringencoding);
4149 } elseif ($trunc ==
'wrap') {
4151 if (
dol_strlen($newstring, $stringencoding) > ($size + 1)) {
4157 return 'BadParam3CallingDolTrunc';
4182function img_picto($titlealt, $picto, $moreatt =
'', $pictoisfullpath =
false, $srconly = 0, $notitle = 0, $alt =
'', $morecss =
'', $marginleftonlyshort = 2)
4184 global $conf, $langs;
4187 $url = DOL_URL_ROOT;
4188 $theme = isset($conf->theme) ? $conf->theme :
null;
4189 $path =
'theme/'.$theme;
4191 if ($pictoisfullpath) {
4193 if (!preg_match(
'/(\.png|\.gif|\.svg)$/i', $picto)) {
4196 $fullpathpicto = $picto;
4198 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
4199 $morecss .= ($morecss ?
' ' :
'').$reg[1];
4200 $moreatt = str_replace(
'class="'.$reg[1].
'"',
'', $moreatt);
4203 $pictowithouttext = preg_replace(
'/(\.png|\.gif|\.svg)$/',
'', $picto);
4204 $pictowithouttext = str_replace(
'object_',
'', $pictowithouttext);
4205 $pictowithouttext = str_replace(
'_nocolor',
'', $pictowithouttext);
4207 if (strpos($pictowithouttext,
'fontawesome_') !==
false || preg_match(
'/^fa-/', $pictowithouttext)) {
4209 $pictowithouttext = str_replace(
'fontawesome_',
'', $pictowithouttext);
4210 $pictowithouttext = str_replace(
'fa-',
'', $pictowithouttext);
4212 $pictowithouttextarray = explode(
'_', $pictowithouttext);
4213 $marginleftonlyshort = 0;
4215 if (!empty($pictowithouttextarray[1])) {
4217 $fakey =
'fa-'.$pictowithouttextarray[0];
4218 $fa = empty($pictowithouttextarray[1]) ?
'fa' : $pictowithouttextarray[1];
4219 $facolor = empty($pictowithouttextarray[2]) ?
'' : $pictowithouttextarray[2];
4220 $fasize = empty($pictowithouttextarray[3]) ?
'' : $pictowithouttextarray[3];
4222 $fakey =
'fa-'.$pictowithouttext;
4232 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
4233 $morecss .= ($morecss ?
' ' :
'').$reg[1];
4234 $moreatt = str_replace(
'class="'.$reg[1].
'"',
'', $moreatt);
4236 if (preg_match(
'/style="([^"]+)"/', $moreatt, $reg)) {
4237 $morestyle = $reg[1];
4238 $moreatt = str_replace(
'style="'.$reg[1].
'"',
'', $moreatt);
4240 $moreatt = trim($moreatt);
4242 $enabledisablehtml =
'<span class="'.$fa.
' '.$fakey.($marginleftonlyshort ? ($marginleftonlyshort == 1 ?
' marginleftonlyshort' :
' marginleftonly') :
'');
4243 $enabledisablehtml .= ($morecss ?
' '.$morecss :
'').
'" style="'.($fasize ? (
'font-size: '.$fasize.
';') :
'').($facolor ? (
' color: '.$facolor.
';') :
'').($morestyle ?
' '.$morestyle :
'').
'"'.(($notitle || empty($titlealt)) ?
'' :
' title="'.dol_escape_htmltag($titlealt).
'"').($moreatt ?
' '.$moreatt :
'').
'>';
4247 $enabledisablehtml .=
'</span>';
4249 return $enabledisablehtml;
4252 if (empty($srconly) && in_array($pictowithouttext, array(
4253 '1downarrow',
'1uparrow',
'1leftarrow',
'1rightarrow',
'1uparrow_selected',
'1downarrow_selected',
'1leftarrow_selected',
'1rightarrow_selected',
4254 'accountancy',
'accounting_account',
'account',
'accountline',
'action',
'add',
'address',
'angle-double-down',
'angle-double-up',
'asset',
4255 'bank_account',
'barcode',
'bank',
'bell',
'bill',
'billa',
'billr',
'billd',
'birthday-cake',
'bookmark',
'bom',
'briefcase-medical',
'bug',
'building',
4256 'card',
'calendarlist',
'calendar',
'calendarmonth',
'calendarweek',
'calendarday',
'calendarperuser',
'calendarpertype',
4257 'cash-register',
'category',
'chart',
'check',
'clock',
'clone',
'close_title',
'cog',
'collab',
'company',
'contact',
'country',
'contract',
'conversation',
'cron',
'cross',
'cubes',
4258 'currency',
'multicurrency',
4259 'delete',
'dolly',
'dollyrevert',
'donation',
'download',
'dynamicprice',
4260 'edit',
'ellipsis-h',
'email',
'entity',
'envelope',
'eraser',
'establishment',
'expensereport',
'external-link-alt',
'external-link-square-alt',
'eye',
4261 'filter',
'file-code',
'file-export',
'file-import',
'file-upload',
'autofill',
'folder',
'folder-open',
'folder-plus',
4262 'gears',
'generate',
'generic',
'globe',
'globe-americas',
'graph',
'grip',
'grip_title',
'group',
4263 'hands-helping',
'help',
'holiday',
4264 'id-card',
'images',
'incoterm',
'info',
'intervention',
'inventory',
'intracommreport',
'jobprofile',
4265 'knowledgemanagement',
4266 'label',
'language',
'line',
'link',
'list',
'list-alt',
'listlight',
'loan',
'lock',
'lot',
'long-arrow-alt-right',
4267 'margin',
'map-marker-alt',
'member',
'meeting',
'money-bill-alt',
'movement',
'mrp',
'note',
'next',
4268 'off',
'on',
'order',
4269 'paiment',
'paragraph',
'play',
'pdf',
'phone',
'phoning',
'phoning_mobile',
'phoning_fax',
'playdisabled',
'previous',
'poll',
'pos',
'printer',
'product',
'propal',
'proposal',
'puce',
4270 'stock',
'resize',
'service',
'stats',
'trip',
4271 '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',
4272 'github',
'google',
'jabber',
'microsoft',
'skype',
'twitter',
'facebook',
'linkedin',
'instagram',
'snapchat',
'youtube',
'google-plus-g',
'whatsapp',
4273 'chevron-left',
'chevron-right',
'chevron-down',
'chevron-top',
'commercial',
'companies',
4274 'generic',
'home',
'hrm',
'members',
'products',
'invoicing',
4275 'partnership',
'payment',
'payment_vat',
'pencil-ruler',
'pictoconfirm',
'preview',
'project',
'projectpub',
'projecttask',
'question',
'refresh',
'region',
4276 'salary',
'shipment',
'state',
'supplier_invoice',
'supplier_invoicea',
'supplier_invoicer',
'supplier_invoiced',
4277 'technic',
'ticket',
4279 'recent',
'reception',
'recruitmentcandidature',
'recruitmentjobposition',
'replacement',
'resource',
'recurring',
'rss',
4280 'shapes',
'skill',
'square',
'stop-circle',
'supplier',
'supplier_proposal',
'supplier_order',
'supplier_invoice',
4281 'timespent',
'title_setup',
'title_accountancy',
'title_bank',
'title_hrm',
'title_agenda',
4282 'uncheck',
'url',
'user-cog',
'user-injured',
'user-md',
'vat',
'website',
'workstation',
'webhook',
'world',
'private',
4283 'conferenceorbooth',
'eventorganization',
4284 'stamp',
'signature'
4286 $fakey = $pictowithouttext;
4290 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'))) {
4293 if (in_array($pictowithouttext, array(
'black-tie',
'github',
'google',
'microsoft',
'skype',
'twitter',
'facebook',
'linkedin',
'instagram',
'snapchat',
'stripe',
'stripe-s',
'youtube',
'google-plus-g',
'whatsapp'))) {
4297 $arrayconvpictotofa = array(
4298 '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',
4299 'bank_account'=>
'university',
4300 'bill'=>
'file-invoice-dollar',
'billa'=>
'file-excel',
'billr'=>
'file-invoice-dollar',
'billd'=>
'file-medical',
4301 'supplier_invoice'=>
'file-invoice-dollar',
'supplier_invoicea'=>
'file-excel',
'supplier_invoicer'=>
'file-invoice-dollar',
'supplier_invoiced'=>
'file-medical',
4303 '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',
4304 'donation'=>
'file-alt',
'dynamicprice'=>
'hand-holding-usd',
4305 'setup'=>
'cog',
'companies'=>
'building',
'products'=>
'cube',
'commercial'=>
'suitcase',
'invoicing'=>
'coins',
4306 'accounting'=>
'search-dollar',
'category'=>
'tag',
'dollyrevert'=>
'dolly',
4307 'generate'=>
'plus-square',
'hrm'=>
'user-tie',
'incoterm'=>
'truck-loading',
4308 'margin'=>
'calculator',
'members'=>
'user-friends',
'ticket'=>
'ticket-alt',
'globe'=>
'external-link-alt',
'lot'=>
'barcode',
4309 'email'=>
'at',
'establishment'=>
'building',
'edit'=>
'pencil-alt',
'entity'=>
'globe',
4310 'graph'=>
'chart-line',
'grip_title'=>
'arrows-alt',
'grip'=>
'arrows-alt',
'help'=>
'question-circle',
4311 'generic'=>
'file',
'holiday'=>
'umbrella-beach',
4312 'info'=>
'info-circle',
'inventory'=>
'boxes',
'intracommreport'=>
'globe-europe',
'jobprofile'=>
'cogs',
4313 'knowledgemanagement'=>
'ticket-alt',
'label'=>
'layer-group',
'line'=>
'bars',
'loan'=>
'money-bill-alt',
4314 'member'=>
'user-alt',
'meeting'=>
'chalkboard-teacher',
'mrp'=>
'cubes',
'next'=>
'arrow-alt-circle-right',
4315 'trip'=>
'wallet',
'expensereport'=>
'wallet',
'group'=>
'users',
'movement'=>
'people-carry',
4316 'sign-out'=>
'sign-out-alt',
4317 'switch_off'=>
'toggle-off',
'switch_on'=>
'toggle-on',
'switch_on_warning'=>
'toggle-on',
'switch_on_red'=>
'toggle-on',
'check'=>
'check',
'bookmark'=>
'star',
4318 'bank'=>
'university',
'close_title'=>
'times',
'delete'=>
'trash',
'filter'=>
'filter',
4319 'list-alt'=>
'list-alt',
'calendarlist'=>
'bars',
'calendar'=>
'calendar-alt',
'calendarmonth'=>
'calendar-alt',
'calendarweek'=>
'calendar-week',
'calendarday'=>
'calendar-day',
'calendarperuser'=>
'table',
4320 'intervention'=>
'ambulance',
'invoice'=>
'file-invoice-dollar',
'currency'=>
'dollar-sign',
'multicurrency'=>
'dollar-sign',
'order'=>
'file-invoice',
4321 'error'=>
'exclamation-triangle',
'warning'=>
'exclamation-triangle',
4323 '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',
4324 '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',
4325 'recent' =>
'check-square',
'reception'=>
'dolly',
'recruitmentjobposition'=>
'id-card-alt',
'recruitmentcandidature'=>
'id-badge',
4326 'resize'=>
'crop',
'supplier_order'=>
'dol-order_supplier',
'supplier_proposal'=>
'file-signature',
4327 'refresh'=>
'redo',
'region'=>
'map-marked',
'replacement'=>
'exchange-alt',
'resource'=>
'laptop-house',
'recurring'=>
'history',
4328 'service'=>
'concierge-bell',
4329 'skill'=>
'shapes',
'state'=>
'map-marked-alt',
'security'=>
'key',
'salary'=>
'wallet',
'shipment'=>
'dolly',
'stock'=>
'box-open',
'stats' =>
'chart-bar',
'split'=>
'code-branch',
'stripe'=>
'stripe-s',
4330 'supplier'=>
'building',
'technic'=>
'cogs',
4331 'timespent'=>
'clock',
'title_setup'=>
'tools',
'title_accountancy'=>
'money-check-alt',
'title_bank'=>
'university',
'title_hrm'=>
'umbrella-beach',
4332 'title_agenda'=>
'calendar-alt',
4333 'uncheck'=>
'times',
'uparrow'=>
'share',
'url'=>
'external-link-alt',
'vat'=>
'money-check-alt',
'vcard'=>
'arrow-alt-circle-down',
4334 'jabber'=>
'comment-o',
4335 'website'=>
'globe-americas',
'workstation'=>
'pallet',
'webhook'=>
'bullseye',
'world'=>
'globe',
'private'=>
'user-lock',
4336 'conferenceorbooth'=>
'chalkboard-teacher',
'eventorganization'=>
'project-diagram'
4338 if ($pictowithouttext ==
'off') {
4339 $fakey =
'fa-square';
4341 } elseif ($pictowithouttext ==
'on') {
4342 $fakey =
'fa-check-square';
4344 } elseif ($pictowithouttext ==
'listlight') {
4345 $fakey =
'fa-download';
4346 $marginleftonlyshort = 1;
4347 } elseif ($pictowithouttext ==
'printer') {
4348 $fakey =
'fa-print';
4350 } elseif ($pictowithouttext ==
'note') {
4351 $fakey =
'fa-sticky-note';
4352 $marginleftonlyshort = 1;
4353 } elseif (in_array($pictowithouttext, array(
'1uparrow',
'1downarrow',
'1leftarrow',
'1rightarrow',
'1uparrow_selected',
'1downarrow_selected',
'1leftarrow_selected',
'1rightarrow_selected'))) {
4354 $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');
4355 $fakey =
'fa-'.$convertarray[$pictowithouttext];
4356 if (preg_match(
'/selected/', $pictowithouttext)) {
4359 $marginleftonlyshort = 1;
4360 } elseif (!empty($arrayconvpictotofa[$pictowithouttext])) {
4361 $fakey =
'fa-'.$arrayconvpictotofa[$pictowithouttext];
4363 $fakey =
'fa-'.$pictowithouttext;
4366 if (in_array($pictowithouttext, array(
'dollyrevert',
'member',
'members',
'contract',
'group',
'resource',
'shipment'))) {
4367 $morecss .=
' em092';
4369 if (in_array($pictowithouttext, array(
'conferenceorbooth',
'collab',
'eventorganization',
'holiday',
'info',
'project',
'workstation'))) {
4370 $morecss .=
' em088';
4372 if (in_array($pictowithouttext, array(
'asset',
'intervention',
'payment',
'loan',
'partnership',
'stock',
'technic'))) {
4373 $morecss .=
' em080';
4377 $arrayconvpictotomarginleftonly = array(
4378 'bank',
'check',
'delete',
'generic',
'grip',
'grip_title',
'jabber',
4379 'grip_title',
'grip',
'listlight',
'note',
'on',
'off',
'playdisabled',
'printer',
'resize',
'sign-out',
'stats',
'switch_on',
'switch_on_red',
'switch_off',
4380 'uparrow',
'1uparrow',
'1downarrow',
'1leftarrow',
'1rightarrow',
'1uparrow_selected',
'1downarrow_selected',
'1leftarrow_selected',
'1rightarrow_selected'
4382 if (!isset($arrayconvpictotomarginleftonly[$pictowithouttext])) {
4383 $marginleftonlyshort = 0;
4387 $arrayconvpictotomorcess = array(
4388 'action'=>
'infobox-action',
'account'=>
'infobox-bank_account',
'accounting_account'=>
'infobox-bank_account',
'accountline'=>
'infobox-bank_account',
'accountancy'=>
'infobox-bank_account',
'asset'=>
'infobox-bank_account',
4389 'bank_account'=>
'infobox-bank_account',
4390 'bill'=>
'infobox-commande',
'billa'=>
'infobox-commande',
'billr'=>
'infobox-commande',
'billd'=>
'infobox-commande',
4391 'margin'=>
'infobox-bank_account',
'conferenceorbooth'=>
'infobox-project',
4392 'cash-register'=>
'infobox-bank_account',
'contract'=>
'infobox-contrat',
'check'=>
'font-status4',
'collab'=>
'infobox-action',
'conversation'=>
'infobox-contrat',
4393 'donation'=>
'infobox-commande',
'dolly'=>
'infobox-commande',
'dollyrevert'=>
'flip infobox-order_supplier',
4394 'ecm'=>
'infobox-action',
'eventorganization'=>
'infobox-project',
4395 'hrm'=>
'infobox-adherent',
'group'=>
'infobox-adherent',
'intervention'=>
'infobox-contrat',
4396 'incoterm'=>
'infobox-supplier_proposal',
4397 'currency'=>
'infobox-bank_account',
'multicurrency'=>
'infobox-bank_account',
4398 'members'=>
'infobox-adherent',
'member'=>
'infobox-adherent',
'money-bill-alt'=>
'infobox-bank_account',
4399 'order'=>
'infobox-commande',
4400 'user'=>
'infobox-adherent',
'users'=>
'infobox-adherent',
4401 'error'=>
'pictoerror',
'warning'=>
'pictowarning',
'switch_on'=>
'font-status4',
'switch_on_warning'=>
'font-status4 warning',
'switch_on_red'=>
'font-status8',
4402 'holiday'=>
'infobox-holiday',
'info'=>
'opacityhigh',
'invoice'=>
'infobox-commande',
4403 'knowledgemanagement'=>
'infobox-contrat rotate90',
'loan'=>
'infobox-bank_account',
4404 'payment'=>
'infobox-bank_account',
'payment_vat'=>
'infobox-bank_account',
'poll'=>
'infobox-adherent',
'pos'=>
'infobox-bank_account',
'project'=>
'infobox-project',
'projecttask'=>
'infobox-project',
4405 'propal'=>
'infobox-propal',
'proposal'=>
'infobox-propal',
'private'=>
'infobox-project',
4406 'reception'=>
'flip',
'recruitmentjobposition'=>
'infobox-adherent',
'recruitmentcandidature'=>
'infobox-adherent',
4407 'resource'=>
'infobox-action',
4408 'salary'=>
'infobox-bank_account',
'shipment'=>
'infobox-commande',
'supplier_invoice'=>
'infobox-order_supplier',
'supplier_invoicea'=>
'infobox-order_supplier',
'supplier_invoiced'=>
'infobox-order_supplier',
4409 'supplier'=>
'infobox-order_supplier',
'supplier_order'=>
'infobox-order_supplier',
'supplier_proposal'=>
'infobox-supplier_proposal',
4410 'ticket'=>
'infobox-contrat',
'title_accountancy'=>
'infobox-bank_account',
'title_hrm'=>
'infobox-holiday',
'expensereport'=>
'infobox-expensereport',
'trip'=>
'infobox-expensereport',
'title_agenda'=>
'infobox-action',
4411 'vat'=>
'infobox-bank_account',
4413 'list-alt'=>
'imgforviewmode',
'calendar'=>
'imgforviewmode',
'calendarweek'=>
'imgforviewmode',
'calendarmonth'=>
'imgforviewmode',
'calendarday'=>
'imgforviewmode',
'calendarperuser'=>
'imgforviewmode'
4415 if (!empty($arrayconvpictotomorcess[$pictowithouttext]) && strpos($picto,
'_nocolor') ===
false) {
4416 $morecss .= ($morecss ?
' ' :
'').$arrayconvpictotomorcess[$pictowithouttext];
4420 $arrayconvpictotocolor = array(
4421 'address'=>
'#6c6aa8',
'building'=>
'#6c6aa8',
'bom'=>
'#a69944',
4422 'clone'=>
'#999',
'cog'=>
'#999',
'companies'=>
'#6c6aa8',
'company'=>
'#6c6aa8',
'contact'=>
'#6c6aa8',
'cron'=>
'#555',
4423 'dynamicprice'=>
'#a69944',
4424 'edit'=>
'#444',
'note'=>
'#999',
'error'=>
'',
'help'=>
'#bbb',
'listlight'=>
'#999',
'language'=>
'#555',
4426 'lock'=>
'#ddd',
'lot'=>
'#a69944',
4427 'map-marker-alt'=>
'#aaa',
'mrp'=>
'#a69944',
'product'=>
'#a69944',
'service'=>
'#a69944',
'inventory'=>
'#a69944',
'stock'=>
'#a69944',
'movement'=>
'#a69944',
4428 'other'=>
'#ddd',
'world'=>
'#986c6a',
4429 'partnership'=>
'#6c6aa8',
'playdisabled'=>
'#ccc',
'printer'=>
'#444',
'projectpub'=>
'#986c6a',
'reception'=>
'#a69944',
'resize'=>
'#444',
'rss'=>
'#cba',
4431 'security'=>
'#999',
'square'=>
'#888',
'stop-circle'=>
'#888',
'stats'=>
'#444',
'switch_off'=>
'#999',
'technic'=>
'#999',
'timespent'=>
'#555',
4432 'uncheck'=>
'#800',
'uparrow'=>
'#555',
'user-cog'=>
'#999',
'country'=>
'#aaa',
'globe-americas'=>
'#aaa',
'region'=>
'#aaa',
'state'=>
'#aaa',
4433 'website'=>
'#304',
'workstation'=>
'#a69944'
4435 if (isset($arrayconvpictotocolor[$pictowithouttext]) && strpos($picto,
'_nocolor') ===
false) {
4436 $facolor = $arrayconvpictotocolor[$pictowithouttext];
4443 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
4444 $morecss .= ($morecss ?
' ' :
'').$reg[1];
4445 $moreatt = str_replace(
'class="'.$reg[1].
'"',
'', $moreatt);
4447 if (preg_match(
'/style="([^"]+)"/', $moreatt, $reg)) {
4448 $morestyle = $reg[1];
4449 $moreatt = str_replace(
'style="'.$reg[1].
'"',
'', $moreatt);
4451 $moreatt = trim($moreatt);
4453 $enabledisablehtml =
'<span class="'.$fa.
' '.$fakey.($marginleftonlyshort ? ($marginleftonlyshort == 1 ?
' marginleftonlyshort' :
' marginleftonly') :
'');
4454 $enabledisablehtml .= ($morecss ?
' '.$morecss :
'').
'" style="'.($fasize ? (
'font-size: '.$fasize.
';') :
'').($facolor ? (
' color: '.$facolor.
';') :
'').($morestyle ?
' '.$morestyle :
'').
'"'.(($notitle || empty($titlealt)) ?
'' :
' title="'.dol_escape_htmltag($titlealt).
'"').($moreatt ?
' '.$moreatt :
'').
'>';
4458 $enabledisablehtml .=
'</span>';
4460 return $enabledisablehtml;
4463 if (!empty($conf->global->MAIN_OVERWRITE_THEME_PATH)) {
4464 $path = $conf->global->MAIN_OVERWRITE_THEME_PATH.
'/theme/'.$theme;
4465 } elseif (!empty($conf->global->MAIN_OVERWRITE_THEME_RES)) {
4466 $path = $conf->global->MAIN_OVERWRITE_THEME_RES.
'/theme/'.$conf->global->MAIN_OVERWRITE_THEME_RES;
4467 } elseif (!empty($conf->modules_parts[
'theme']) && array_key_exists($theme, $conf->modules_parts[
'theme'])) {
4468 $path = $theme.
'/theme/'.$theme;
4473 if (preg_match(
'/^([^@]+)@([^@]+)$/i', $picto, $regs)) {
4479 if (!preg_match(
'/(\.png|\.gif|\.svg)$/i', $picto)) {
4484 foreach ($conf->file->dol_document_root as $type => $dirroot) {
4485 if ($type ==
'main') {
4489 if (file_exists($dirroot.
'/'.$path.
'/img/'.$picto)) {
4490 $url = DOL_URL_ROOT.$conf->file->dol_url_root[$type];
4496 $fullpathpicto = $url.
'/'.$path.
'/img/'.$picto;
4500 return $fullpathpicto;
4504 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 :
'').
'"').
'>';
4520function img_object($titlealt, $picto, $moreatt =
'', $pictoisfullpath =
false, $srconly = 0, $notitle = 0)
4522 if (strpos($picto,
'^') === 0) {
4523 return img_picto($titlealt, str_replace(
'^',
'', $picto), $moreatt, $pictoisfullpath, $srconly, $notitle);
4525 return img_picto($titlealt,
'object_'.$picto, $moreatt, $pictoisfullpath, $srconly, $notitle);
4540function img_weather($titlealt, $picto, $moreatt =
'', $pictoisfullpath = 0, $morecss =
'')
4544 if (is_numeric($picto)) {
4547 return '<i class="fa fa-weather-level'.$picto.
'"></i>';
4548 } elseif (!preg_match(
'/(\.png|\.gif)$/i', $picto)) {
4552 $path = DOL_URL_ROOT.
'/theme/'.$conf->theme.
'/img/weather/'.$picto;
4554 return img_picto($titlealt, $path, $moreatt, 1, 0, 0,
'', $morecss);
4572 if (!preg_match(
'/(\.png|\.gif)$/i', $picto)) {
4576 if ($pictoisfullpath) {
4579 $path = DOL_URL_ROOT.
'/theme/common/'.$picto;
4581 if (!empty($conf->global->MAIN_MODULE_CAN_OVERWRITE_COMMONICONS)) {
4582 $themepath = DOL_DOCUMENT_ROOT.
'/theme/'.$conf->theme.
'/img/'.$picto;
4584 if (file_exists($themepath)) {
4590 return img_picto($titlealt, $path, $moreatt, 1, 0, $notitle);
4606function img_action($titlealt, $numaction, $picto =
'', $moreatt =
'')
4610 if (empty($titlealt) || $titlealt ==
'default') {
4611 if ($numaction ==
'-1' || $numaction ==
'ST_NO') {
4613 $titlealt = $langs->transnoentitiesnoconv(
'ChangeDoNotContact');
4614 } elseif ($numaction ==
'0' || $numaction ==
'ST_NEVER') {
4616 $titlealt = $langs->transnoentitiesnoconv(
'ChangeNeverContacted');
4617 } elseif ($numaction ==
'1' || $numaction ==
'ST_TODO') {
4619 $titlealt = $langs->transnoentitiesnoconv(
'ChangeToContact');
4620 } elseif ($numaction ==
'2' || $numaction ==
'ST_PEND') {
4622 $titlealt = $langs->transnoentitiesnoconv(
'ChangeContactInProcess');
4623 } elseif ($numaction ==
'3' || $numaction ==
'ST_DONE') {
4625 $titlealt = $langs->transnoentitiesnoconv(
'ChangeContactDone');
4627 $titlealt = $langs->transnoentitiesnoconv(
'ChangeStatus '.$numaction);
4631 if (!is_numeric($numaction)) {
4635 return img_picto($titlealt, (empty($picto) ?
'stcomm'.$numaction.
'.png' : $picto), $moreatt);
4649 if ($titlealt ==
'default') {
4650 $titlealt = $langs->trans(
'Show');
4653 return img_picto($titlealt,
'pdf'.$size.
'.png');
4667 if ($titlealt ==
'default') {
4668 $titlealt = $langs->trans(
'Add');
4671 return img_picto($titlealt,
'edit_add.png', $other);
4684 if ($titlealt ==
'default') {
4685 $titlealt = $langs->trans(
'Remove');
4688 return img_picto($titlealt,
'edit_remove.png', $other);
4699function img_edit($titlealt =
'default', $float = 0, $other =
'')
4703 if ($titlealt ==
'default') {
4704 $titlealt = $langs->trans(
'Modify');
4707 return img_picto($titlealt,
'edit.png', ($float ?
'style="float: '.($langs->tab_translate[
"DIRECTION"] ==
'rtl' ?
'left' :
'right').
'"' :
"").($other ?
' '.$other :
''));
4718function img_view($titlealt =
'default', $float = 0, $other =
'class="valignmiddle"')
4722 if ($titlealt ==
'default') {
4723 $titlealt = $langs->trans(
'View');
4726 $moreatt = ($float ?
'style="float: right" ' :
'').$other;
4728 return img_picto($titlealt,
'eye', $moreatt);
4739function img_delete($titlealt =
'default', $other =
'class="pictodelete"', $morecss =
'')
4743 if ($titlealt ==
'default') {
4744 $titlealt = $langs->trans(
'Delete');
4747 return img_picto($titlealt,
'delete.png', $other,
false, 0, 0,
'', $morecss);
4760 if ($titlealt ==
"default") {
4761 $titlealt = $langs->trans(
"Print");
4763 return img_picto($titlealt,
'printer.png', $other);
4773function img_split($titlealt =
'default', $other =
'class="pictosplit"')
4777 if ($titlealt ==
'default') {
4778 $titlealt = $langs->trans(
'Split');
4781 return img_picto($titlealt,
'split.png', $other);
4796 if (is_string($usealttitle)) {
4799 $usealttitle = $langs->trans(
'Info');
4803 return img_picto($usealttitle,
'info.png',
'style="vertical-align: middle;'.($usehelpcursor == 1 ?
' cursor: help' : ($usehelpcursor == 2 ?
' cursor: pointer' :
'')).
'"');
4816 if ($titlealt ==
'default') {
4817 $titlealt = $langs->trans(
'Informations');
4820 return img_picto($titlealt,
'info.png',
'style="vertical-align: middle;"');
4831function img_warning($titlealt =
'default', $moreatt =
'', $morecss =
'pictowarning')
4835 if ($titlealt ==
'default') {
4836 $titlealt = $langs->trans(
'Warning');
4840 return img_picto($titlealt,
'warning.png',
'class="'.$morecss.
'"'.($moreatt ? ($moreatt ==
'1' ?
' style="float: right"' :
' '.$moreatt) :
''));
4853 if ($titlealt ==
'default') {
4854 $titlealt = $langs->trans(
'Error');
4857 return img_picto($titlealt,
'error.png');
4871 if ($titlealt ==
'default') {
4872 $titlealt = $langs->trans(
'Next');
4876 return '<span class="fa fa-chevron-right paddingright paddingleft" title="'.dol_escape_htmltag($titlealt).
'"></span>';
4890 if ($titlealt ==
'default') {
4891 $titlealt = $langs->trans(
'Previous');
4895 return '<span class="fa fa-chevron-left paddingright paddingleft" title="'.dol_escape_htmltag($titlealt).
'"></span>';
4906function img_down($titlealt =
'default', $selected = 0, $moreclass =
'')
4910 if ($titlealt ==
'default') {
4911 $titlealt = $langs->trans(
'Down');
4914 return img_picto($titlealt, ($selected ?
'1downarrow_selected.png' :
'1downarrow.png'),
'class="imgdown'.($moreclass ?
" ".$moreclass :
"").
'"');
4925function img_up($titlealt =
'default', $selected = 0, $moreclass =
'')
4929 if ($titlealt ==
'default') {
4930 $titlealt = $langs->trans(
'Up');
4933 return img_picto($titlealt, ($selected ?
'1uparrow_selected.png' :
'1uparrow.png'),
'class="imgup'.($moreclass ?
" ".$moreclass :
"").
'"');
4944function img_left($titlealt =
'default', $selected = 0, $moreatt =
'')
4948 if ($titlealt ==
'default') {
4949 $titlealt = $langs->trans(
'Left');
4952 return img_picto($titlealt, ($selected ?
'1leftarrow_selected.png' :
'1leftarrow.png'), $moreatt);
4963function img_right($titlealt =
'default', $selected = 0, $moreatt =
'')
4967 if ($titlealt ==
'default') {
4968 $titlealt = $langs->trans(
'Right');
4971 return img_picto($titlealt, ($selected ?
'1rightarrow_selected.png' :
'1rightarrow.png'), $moreatt);
4985 if ($titlealt ==
'default') {
4986 $titlealt = $langs->trans(
'Active');
4990 return img_picto($titlealt,
'tick.png');
5005 if (is_null($morecss)) {
5009 if ($brand ==
'visa' || $brand ==
'Visa') {
5011 } elseif ($brand ==
'mastercard' || $brand ==
'MasterCard') {
5012 $brand =
'cc-mastercard';
5013 } elseif ($brand ==
'amex' || $brand ==
'American Express') {
5015 } elseif ($brand ==
'discover' || $brand ==
'Discover') {
5016 $brand =
'cc-discover';
5017 } elseif ($brand ==
'jcb' || $brand ==
'JCB') {
5019 } elseif ($brand ==
'diners' || $brand ==
'Diners club') {
5020 $brand =
'cc-diners-club';
5021 } elseif (!in_array($brand, array(
'cc-visa',
'cc-mastercard',
'cc-amex',
'cc-discover',
'cc-jcb',
'cc-diners-club'))) {
5022 $brand =
'credit-card';
5025 return '<span class="fa fa-'.$brand.
' fa-fw'.($morecss ?
' '.$morecss :
'').
'"></span>';
5038 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
5044 if (empty($titlealt)) {
5045 $titlealt =
'Mime type: '.$mimetype;
5049 return '<i class="fa fa-'.$mimefa.
' paddingright'.($morecss ?
' '.$morecss :
'').
'"'.($titlealt ?
' title="'.$titlealt.
'"' :
'').
'></i>';
5062 global $conf, $langs;
5064 if ($titlealt ==
'default') {
5065 $titlealt = $langs->trans(
'Search');
5068 $img =
img_picto($titlealt,
'search.png', $other,
false, 1);
5070 $input =
'<input type="image" class="liste_titre" name="button_search" src="'.$img.
'" ';
5071 $input .=
'value="'.dol_escape_htmltag($titlealt).
'" title="'.
dol_escape_htmltag($titlealt).
'" >';
5085 global $conf, $langs;
5087 if ($titlealt ==
'default') {
5088 $titlealt = $langs->trans(
'Search');
5091 $img =
img_picto($titlealt,
'searchclear.png', $other,
false, 1);
5093 $input =
'<input type="image" class="liste_titre" name="button_removefilter" src="'.$img.
'" ';
5094 $input .=
'value="'.dol_escape_htmltag($titlealt).
'" title="'.
dol_escape_htmltag($titlealt).
'" >';
5110function info_admin($text, $infoonimgalt = 0, $nodiv = 0, $admin =
'1', $morecss =
'hideonsmartphone', $textfordropdown =
'')
5112 global $conf, $langs;
5114 if ($infoonimgalt) {
5115 $result =
img_picto($text,
'info',
'class="'.($morecss ?
' '.$morecss :
'').
'"');
5117 if (empty($conf->use_javascript_ajax)) {
5118 $textfordropdown =
'';
5121 $class = (empty($admin) ?
'undefined' : ($admin ==
'1' ?
'info' : $admin));
5122 $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>');
5124 if ($textfordropdown) {
5125 $tmpresult =
'<span class="'.$class.
'text opacitymedium cursorpointer">'.$langs->trans($textfordropdown).
' '.
img_picto($langs->trans($textfordropdown),
'1downarrow').
'</span>';
5126 $tmpresult .=
'<script nonce="'.getNonce().
'" type="text/javascript">
5127 jQuery(document).ready(function() {
5128 jQuery(".'.$class.
'text").click(function() {
5129 console.log("toggle text");
5130 jQuery(".'.$class.
'").toggle();
5135 $result = $tmpresult.$result;
5156 global $conf, $langs, $argv;
5157 global $dolibarr_main_prod;
5164 require_once DOL_DOCUMENT_ROOT.
'/core/class/translate.class.php';
5166 $langs->load(
"main");
5170 $langs->loadLangs(array(
'main',
'errors'));
5172 if ($_SERVER[
'DOCUMENT_ROOT']) {
5173 $out .= $langs->trans(
"DolibarrHasDetectedError").
".<br>\n";
5175 $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";
5177 $out .= $langs->trans(
"InformationToHelpDiagnose").
":<br>\n";
5179 $out .=
"<b>".$langs->trans(
"Date").
":</b> ".
dol_print_date(time(),
'dayhourlog').
"<br>\n";
5180 $out .=
"<b>".$langs->trans(
"Dolibarr").
":</b> ".DOL_VERSION.
" - https://www.dolibarr.org<br>\n";
5181 if (isset($conf->global->MAIN_FEATURES_LEVEL)) {
5182 $out .=
"<b>".$langs->trans(
"LevelOfFeature").
":</b> ".
getDolGlobalInt(
'MAIN_FEATURES_LEVEL').
"<br>\n";
5184 if (function_exists(
"phpversion")) {
5185 $out .=
"<b>".$langs->trans(
"PHP").
":</b> ".phpversion().
"<br>\n";
5187 $out .=
"<b>".$langs->trans(
"Server").
":</b> ".(isset($_SERVER[
"SERVER_SOFTWARE"]) ?
dol_htmlentities($_SERVER[
"SERVER_SOFTWARE"], ENT_COMPAT) :
'').
"<br>\n";
5188 if (function_exists(
"php_uname")) {
5189 $out .=
"<b>".$langs->trans(
"OS").
":</b> ".php_uname().
"<br>\n";
5191 $out .=
"<b>".$langs->trans(
"UserAgent").
":</b> ".(isset($_SERVER[
"HTTP_USER_AGENT"]) ?
dol_htmlentities($_SERVER[
"HTTP_USER_AGENT"], ENT_COMPAT) :
'').
"<br>\n";
5193 $out .=
"<b>".$langs->trans(
"RequestedUrl").
":</b> ".
dol_htmlentities($_SERVER[
"REQUEST_URI"], ENT_COMPAT).
"<br>\n";
5194 $out .=
"<b>".$langs->trans(
"Referer").
":</b> ".(isset($_SERVER[
"HTTP_REFERER"]) ?
dol_htmlentities($_SERVER[
"HTTP_REFERER"], ENT_COMPAT) :
'').
"<br>\n";
5195 $out .=
"<b>".$langs->trans(
"MenuManager").
":</b> ".(isset($conf->standard_menu) ?
dol_htmlentities($conf->standard_menu, ENT_COMPAT) :
'').
"<br>\n";
5197 $syslog .=
"url=".dol_escape_htmltag($_SERVER[
"REQUEST_URI"]);
5198 $syslog .=
", query_string=".dol_escape_htmltag($_SERVER[
"QUERY_STRING"]);
5200 $out .=
'> '.$langs->transnoentities(
"ErrorInternalErrorDetected").
":\n".$argv[0].
"\n";
5201 $syslog .=
"pid=".dol_getmypid();
5204 if (!empty($conf->modules)) {
5205 $out .=
"<b>".$langs->trans(
"Modules").
":</b> ".join(
', ', $conf->modules).
"<br>\n";
5208 if (is_object($db)) {
5209 if ($_SERVER[
'DOCUMENT_ROOT']) {
5210 $out .=
"<b>".$langs->trans(
"DatabaseTypeManager").
":</b> ".$db->type.
"<br>\n";
5211 $lastqueryerror = $db->lastqueryerror();
5213 $lastqueryerror =
"SQL error string is not a valid UTF8 string. We can't show it.";
5215 $out .=
"<b>".$langs->trans(
"RequestLastAccessInError").
":</b> ".($lastqueryerror ?
dol_escape_htmltag($lastqueryerror) : $langs->trans(
"ErrorNoRequestInError")).
"<br>\n";
5216 $out .=
"<b>".$langs->trans(
"ReturnCodeLastAccessInError").
":</b> ".($db->lasterrno() ?
dol_escape_htmltag($db->lasterrno()) : $langs->trans(
"ErrorNoRequestInError")).
"<br>\n";
5217 $out .=
"<b>".$langs->trans(
"InformationLastAccessInError").
":</b> ".($db->lasterror() ?
dol_escape_htmltag($db->lasterror()) : $langs->trans(
"ErrorNoRequestInError")).
"<br>\n";
5221 $out .=
'> '.$langs->transnoentities(
"DatabaseTypeManager").
":\n".$db->type.
"\n";
5222 $out .=
'> '.$langs->transnoentities(
"RequestLastAccessInError").
":\n".($db->lastqueryerror() ? $db->lastqueryerror() : $langs->transnoentities(
"ErrorNoRequestInError")).
"\n";
5223 $out .=
'> '.$langs->transnoentities(
"ReturnCodeLastAccessInError").
":\n".($db->lasterrno() ? $db->lasterrno() : $langs->transnoentities(
"ErrorNoRequestInError")).
"\n";
5224 $out .=
'> '.$langs->transnoentities(
"InformationLastAccessInError").
":\n".($db->lasterror() ? $db->lasterror() : $langs->transnoentities(
"ErrorNoRequestInError")).
"\n";
5226 $syslog .=
", sql=".$db->lastquery();
5227 $syslog .=
", db_error=".$db->lasterror();
5230 if ($error || $errors) {
5231 $langs->load(
"errors");
5234 if (is_array($error) && is_array($errors)) {
5235 $errors = array_merge($error, $errors);
5236 } elseif (is_array($error)) {
5238 } elseif (is_array($errors)) {
5239 $errors = array_merge(array($error), $errors);
5241 $errors = array_merge(array($error), array($errors));
5244 foreach ($errors as $msg) {
5248 if ($_SERVER[
'DOCUMENT_ROOT']) {
5252 $out .=
'> '.$langs->transnoentities(
"Message").
":\n".$msg.
"\n";
5254 $syslog .=
", msg=".$msg;
5257 if (empty($dolibarr_main_prod) && $_SERVER[
'DOCUMENT_ROOT'] && function_exists(
'xdebug_print_function_stack') && function_exists(
'xdebug_call_file')) {
5258 xdebug_print_function_stack();
5259 $out .=
'<b>XDebug informations:</b>'.
"<br>\n";
5260 $out .=
'File: '.xdebug_call_file().
"<br>\n";
5261 $out .=
'Line: '.xdebug_call_line().
"<br>\n";
5262 $out .=
'Function: '.xdebug_call_function().
"<br>\n";
5267 if (!headers_sent()) {
5268 if (function_exists(
'top_httphead')) {
5272 http_response_code(202);
5275 if (empty($dolibarr_main_prod)) {
5278 if (empty($langs->defaultlang)) {
5279 $langs->setDefaultLang();
5281 $langs->loadLangs(array(
"main",
"errors"));
5283 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";
5284 print $langs->trans(
"DolibarrHasDetectedError").
'. ';
5285 print $langs->trans(
"YouCanSetOptionDolibarrMainProdToZero");
5286 if (!defined(
"MAIN_CORE_ERROR")) {
5287 define(
"MAIN_CORE_ERROR", 1);
5304function dol_print_error_email($prefixcode, $errormessage =
'', $errormessages = array(), $morecss =
'error', $email =
'')
5306 global $langs, $conf;
5308 if (empty($email)) {
5309 $email = $conf->global->MAIN_INFO_SOCIETE_MAIL;
5312 $langs->load(
"errors");
5315 print
'<br><div class="center login_main_message"><div class="'.$morecss.
'">';
5316 print $langs->trans(
"ErrorContactEMail", $email, $prefixcode.
'-'.
dol_print_date($now,
'%Y%m%d%H%M%S'));
5317 if ($errormessage) {
5318 print
'<br><br>'.$errormessage;
5320 if (is_array($errormessages) && count($errormessages)) {
5321 foreach ($errormessages as $mesgtoshow) {
5322 print
'<br><br>'.$mesgtoshow;
5325 print
'</div></div>';
5344function print_liste_field_titre($name, $file =
"", $field =
"", $begin =
"", $moreparam =
"", $moreattrib =
"", $sortfield =
"", $sortorder =
"", $prefix =
"", $tooltip =
"", $forcenowrapcolumntitle = 0)
5346 print
getTitleFieldOfList($name, 0, $file, $field, $begin, $moreparam, $moreattrib, $sortfield, $sortorder, $prefix, 0, $tooltip, $forcenowrapcolumntitle);
5367function getTitleFieldOfList($name, $thead = 0, $file =
"", $field =
"", $begin =
"", $moreparam =
"", $moreattrib =
"", $sortfield =
"", $sortorder =
"", $prefix =
"", $disablesortlink = 0, $tooltip =
'', $forcenowrapcolumntitle = 0)
5369 global $conf, $langs, $form;
5372 if ($moreattrib ==
'class="right"') {
5373 $prefix .=
'right ';
5376 $sortorder = strtoupper($sortorder);
5385 $tmpsortfield = explode(
',', $sortfield);
5386 $sortfield1 = trim($tmpsortfield[0]);
5387 $tmpfield = explode(
',', $field);
5388 $field1 = trim($tmpfield[0]);
5390 if (empty($conf->global->MAIN_DISABLE_WRAPPING_ON_COLUMN_TITLE) && empty($forcenowrapcolumntitle)) {
5391 $prefix =
'wrapcolumntitle '.$prefix;
5397 $liste_titre =
'liste_titre';
5398 if ($field1 && ($sortfield1 == $field1 || $sortfield1 == preg_replace(
"/^[^\.]+\./",
"", $field1))) {
5399 $liste_titre =
'liste_titre_sel';
5402 $tagstart =
'<'.$tag.
' class="'.$prefix.$liste_titre.
'" '.$moreattrib;
5404 $tagstart .= ($name && empty($conf->global->MAIN_DISABLE_WRAPPING_ON_COLUMN_TITLE) && empty($forcenowrapcolumntitle) && !
dol_textishtml($name)) ?
' title="'.
dol_escape_htmltag($langs->trans($name)).
'"' :
'';
5407 if (empty($thead) && $field && empty($disablesortlink)) {
5408 $options = preg_replace(
'/sortfield=([a-zA-Z0-9,\s\.]+)/i',
'', (is_scalar($moreparam) ? $moreparam :
''));
5409 $options = preg_replace(
'/sortorder=([a-zA-Z0-9,\s\.]+)/i',
'', $options);
5410 $options = preg_replace(
'/&+/i',
'&', $options);
5411 if (!preg_match(
'/^&/', $options)) {
5412 $options =
'&'.$options;
5415 $sortordertouseinlink =
'';
5416 if ($field1 != $sortfield1) {
5417 if (preg_match(
'/^DESC/i', $sortorder)) {
5418 $sortordertouseinlink .= str_repeat(
'desc,', count(explode(
',', $field)));
5420 $sortordertouseinlink .= str_repeat(
'asc,', count(explode(
',', $field)));
5423 if (preg_match(
'/^ASC/i', $sortorder)) {
5424 $sortordertouseinlink .= str_repeat(
'desc,', count(explode(
',', $field)));
5426 $sortordertouseinlink .= str_repeat(
'asc,', count(explode(
',', $field)));
5429 $sortordertouseinlink = preg_replace(
'/,$/',
'', $sortordertouseinlink);
5430 $out .=
'<a class="reposition" href="'.$file.
'?sortfield='.$field.
'&sortorder='.$sortordertouseinlink.
'&begin='.$begin.$options.
'"';
5436 if (preg_match(
'/:\w+$/', $tooltip)) {
5437 $tmptooltip = explode(
':', $tooltip);
5439 $tmptooltip = array($tooltip);
5441 $out .= $form->textwithpicto($langs->trans($name), $langs->trans($tmptooltip[0]), 1,
'help',
'', 0, 3, (empty($tmptooltip[1]) ?
'' :
'extra_'.str_replace(
'.',
'_', $field).
'_'.$tmptooltip[1]));
5443 $out .= $langs->trans($name);
5446 if (empty($thead) && $field && empty($disablesortlink)) {
5450 if (empty($thead) && $field) {
5451 $options = preg_replace(
'/sortfield=([a-zA-Z0-9,\s\.]+)/i',
'', (is_scalar($moreparam) ? $moreparam :
''));
5452 $options = preg_replace(
'/sortorder=([a-zA-Z0-9,\s\.]+)/i',
'', $options);
5453 $options = preg_replace(
'/&+/i',
'&', $options);
5454 if (!preg_match(
'/^&/', $options)) {
5455 $options =
'&'.$options;
5458 if (!$sortorder || ($field1 != $sortfield1)) {
5462 if (preg_match(
'/^DESC/', $sortorder)) {
5465 $sortimg .=
'<span class="nowrap">'.img_up(
"Z-A", 0,
'paddingright').
'</span>';
5467 if (preg_match(
'/^ASC/', $sortorder)) {
5470 $sortimg .=
'<span class="nowrap">'.img_down(
"A-Z", 0,
'paddingright').
'</span>';
5475 $tagend =
'</'.$tag.
'>';
5477 $out = $tagstart.$sortimg.$out.$tagend;
5492 dol_syslog(__FUNCTION__.
" is deprecated", LOG_WARNING);
5494 print
'<div class="titre">'.$title.
'</div>';
5526function load_fiche_titre($titre, $morehtmlright =
'', $picto =
'generic', $pictoisfullpath = 0, $id =
'', $morecssontable =
'', $morehtmlcenter =
'')
5532 if ($picto ==
'setup') {
5537 $return .=
'<table '.($id ?
'id="'.$id.
'" ' :
'').
'class="centpercent notopnoleftnoright table-fiche-title'.($morecssontable ?
' '.$morecssontable :
'').
'">';
5538 $return .=
'<tr class="titre">';
5540 $return .=
'<td class="nobordernopadding widthpictotitle valignmiddle col-picto">'.img_picto(
'', $picto,
'class="valignmiddle widthpictotitle pictotitle"', $pictoisfullpath).
'</td>';
5542 $return .=
'<td class="nobordernopadding valignmiddle col-title">';
5543 $return .=
'<div class="titre inline-block">'.$titre.
'</div>';
5546 $return .=
'<td class="nobordernopadding center valignmiddle col-center">'.$morehtmlcenter.
'</td>';
5549 $return .=
'<td class="nobordernopadding titre_right wordbreakimp right valignmiddle col-right">'.$morehtmlright.
'</td>';
5551 $return .=
'</tr></table>'.
"\n";
5579function 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 =
'')
5581 global $conf, $langs;
5584 $savtotalnboflines = $totalnboflines;
5585 $totalnboflines = abs((
int) $totalnboflines);
5587 $page = (int) $page;
5589 if ($picto ==
'setup') {
5590 $picto =
'title_setup.png';
5592 if (($conf->browser->name ==
'ie') && $picto ==
'generic') {
5593 $picto =
'title.gif';
5596 $limit = $conf->liste_limit;
5599 if ($savlimit != 0 && (($num > $limit) || ($num == -1) || ($limit == 0))) {
5607 print
"<!-- Begin title -->\n";
5608 print
'<table class="centpercent notopnoleftnoright table-fiche-title'.($morecss ?
' '.$morecss :
'').
'"><tr>';
5612 if ($picto && $titre) {
5613 print
'<td class="nobordernopadding widthpictotitle valignmiddle col-picto">'.img_picto(
'', $picto,
'class="valignmiddle pictotitle widthpictotitle"', $pictoisfullpath).
'</td>';
5616 print
'<td class="nobordernopadding valignmiddle col-title">';
5617 print
'<div class="titre inline-block">'.$titre;
5618 if (!empty($titre) && $savtotalnboflines >= 0 && (
string) $savtotalnboflines !=
'') {
5619 print
'<span class="opacitymedium colorblack paddingleft">('.$totalnboflines.
')</span>';
5621 print
'</div></td>';
5624 if ($morehtmlcenter && empty($conf->dol_optimize_smallscreen)) {
5625 print
'<td class="nobordernopadding center valignmiddle col-center">'.$morehtmlcenter.
'</td>';
5629 print
'<td class="nobordernopadding valignmiddle right col-right">';
5630 print
'<input type="hidden" name="pageplusoneold" value="'.((int) $page + 1).
'">';
5632 $options .=
"&sortfield=".urlencode($sortfield);
5635 $options .=
"&sortorder=".urlencode($sortorder);
5639 if ($savlimit != 0 && ($page > 0 || $num > $limit)) {
5640 if ($totalnboflines) {
5642 $maxnbofpage = (empty($conf->dol_optimize_smallscreen) ? 4 : 0);
5645 $nbpages = ceil($totalnboflines / $limit);
5649 $cpt = ($page - $maxnbofpage);
5655 if (empty($pagenavastextinput)) {
5656 $pagelist .=
'<li class="pagination"><a href="'.$file.
'?page=0'.$options.
'">1</a></li>';
5658 $pagelist .=
'<li class="pagination"><span class="inactive">...</span></li>';
5659 } elseif ($cpt == 2) {
5660 $pagelist .=
'<li class="pagination"><a href="'.$file.
'?page=1'.$options.
'">2</a></li>';
5666 if ($pagenavastextinput) {
5667 if ($cpt == $page) {
5668 $pagelist .=
'<li class="pagination"><input type="text" class="'.($totalnboflines > 100 ?
'width40' :
'width25').
' center pageplusone" name="pageplusone" value="'.($page + 1).
'"></li>';
5672 if ($cpt == $page) {
5673 $pagelist .=
'<li class="pagination"><span class="active">'.($page + 1).
'</span></li>';
5675 $pagelist .=
'<li class="pagination"><a href="'.$file.
'?page='.$cpt.$options.
'">'.($cpt + 1).
'</a></li>';
5679 }
while ($cpt < $nbpages && $cpt <= ($page + $maxnbofpage));
5681 if (empty($pagenavastextinput)) {
5682 if ($cpt < $nbpages) {
5683 if ($cpt < $nbpages - 2) {
5684 $pagelist .=
'<li class="pagination"><span class="inactive">...</span></li>';
5685 } elseif ($cpt == $nbpages - 2) {
5686 $pagelist .=
'<li class="pagination"><a href="'.$file.
'?page='.($nbpages - 2).$options.
'">'.($nbpages - 1).
'</a></li>';
5688 $pagelist .=
'<li class="pagination"><a href="'.$file.
'?page='.($nbpages - 1).$options.
'">'.$nbpages.
'</a></li>';
5692 $pagelist .=
'<li class="pagination paginationlastpage"><a href="'.$file.
'?page='.($nbpages - 1).$options.
'">'.$nbpages.
'</a></li>';
5695 $pagelist .=
'<li class="pagination"><span class="active">'.($page + 1).
"</li>";
5699 if ($savlimit || $morehtmlright || $morehtmlrightbeforearrow) {
5700 print_fleche_navigation($page, $file, $options, $nextpage, $pagelist, $morehtmlright, $savlimit, $totalnboflines, $hideselectlimit, $morehtmlrightbeforearrow, $hidenavigation);
5704 if ($pagenavastextinput) {
5711 print
'</table>'.
"\n";
5714 if ($morehtmlcenter && !empty($conf->dol_optimize_smallscreen)) {
5715 print
'<div class="nobordernopadding marginbottomonly center valignmiddle col-center centpercent">'.$morehtmlcenter.
'</div>';
5718 print
"<!-- End title -->\n\n";
5737function print_fleche_navigation($page, $file, $options =
'', $nextpage = 0, $betweenarrows =
'', $afterarrows =
'', $limit = -1, $totalnboflines = 0, $hideselectlimit = 0, $beforearrows =
'', $hidenavigation = 0)
5739 global $conf, $langs;
5741 print
'<div class="pagination"><ul>';
5742 if ($beforearrows) {
5743 print
'<li class="paginationbeforearrows">';
5744 print $beforearrows;
5748 if (empty($hidenavigation)) {
5749 if ((
int) $limit > 0 && empty($hideselectlimit)) {
5750 $pagesizechoices =
'10:10,15:15,20:20,30:30,40:40,50:50,100:100,250:250,500:500,1000:1000';
5751 $pagesizechoices .=
',5000:5000,10000:10000,20000:20000';
5754 if (!empty($conf->global->MAIN_PAGESIZE_CHOICES)) {
5755 $pagesizechoices = $conf->global->MAIN_PAGESIZE_CHOICES;
5758 print
'<li class="pagination">';
5759 print
'<select class="flat selectlimit" name="limit" title="'.dol_escape_htmltag($langs->trans(
"MaxNbOfRecordPerPage")).
'">';
5760 $tmpchoice = explode(
',', $pagesizechoices);
5761 $tmpkey = $limit.
':'.$limit;
5762 if (!in_array($tmpkey, $tmpchoice)) {
5763 $tmpchoice[] = $tmpkey;
5765 $tmpkey = $conf->liste_limit.
':'.$conf->liste_limit;
5766 if (!in_array($tmpkey, $tmpchoice)) {
5767 $tmpchoice[] = $tmpkey;
5769 asort($tmpchoice, SORT_NUMERIC);
5770 foreach ($tmpchoice as $val) {
5772 $tmp = explode(
':', $val);
5775 if ($key !=
'' && $val !=
'') {
5776 if ((
int) $key == (
int) $limit) {
5777 $selected =
' selected="selected"';
5779 print
'<option name="'.$key.
'"'.$selected.
'>'.
dol_escape_htmltag($val).
'</option>'.
"\n";
5783 if ($conf->use_javascript_ajax) {
5784 print
'<!-- JS CODE TO ENABLE select limit to launch submit of page -->
5786 jQuery(document).ready(function () {
5787 jQuery(".selectlimit").change(function() {
5788 console.log("Change limit. Send submit");
5789 $(this).parents(\'form:first\').submit();
5798 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>';
5800 if ($betweenarrows) {
5801 print
'<!--<div class="betweenarrows nowraponall inline-block">-->';
5802 print $betweenarrows;
5803 print
'<!--</div>-->';
5805 if ($nextpage > 0) {
5806 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>';
5809 print
'<li class="paginationafterarrows">';
5814 print
'</ul></div>'.
"\n";
5829function vatrate($rate, $addpercent =
false, $info_bits = 0, $usestarfornpr = 0, $html = 0)
5833 if (preg_match(
'/%/', $rate)) {
5834 $rate = str_replace(
'%',
'', $rate);
5838 if (preg_match(
'/\((.*)\)/', $rate, $reg)) {
5839 $morelabel =
' ('.$reg[1].
')';
5840 $rate = preg_replace(
'/\s*'.preg_quote($morelabel,
'/').
'/',
'', $rate);
5841 $morelabel =
' '.($html ?
'<span class="opacitymedium">' :
'').
'('.$reg[1].
')'.($html ?
'</span>' :
'');
5843 if (preg_match(
'/\*/', $rate)) {
5844 $rate = str_replace(
'*',
'', $rate);
5849 if (!preg_match(
'/\//', $rate)) {
5850 $ret =
price($rate, 0,
'', 0, 0).($addpercent ?
'%' :
'');
5853 $ret = $rate.($addpercent ?
'%' :
'');
5855 if (($info_bits & 1) && $usestarfornpr >= 0) {
5878function price($amount, $form = 0, $outlangs =
'', $trunc = 1, $rounding = -1, $forcerounding = -1, $currency_code =
'')
5880 global $langs, $conf;
5883 if (empty($amount)) {
5886 $amount = (is_numeric($amount) ? $amount : 0);
5887 if ($rounding == -1) {
5888 $rounding = min($conf->global->MAIN_MAX_DECIMALS_UNIT, $conf->global->MAIN_MAX_DECIMALS_TOT);
5890 $nbdecimal = $rounding;
5892 if ($outlangs ===
'none') {
5902 if (!is_object($outlangs)) {
5906 if ($outlangs->transnoentitiesnoconv(
"SeparatorDecimal") !=
"SeparatorDecimal") {
5907 $dec = $outlangs->transnoentitiesnoconv(
"SeparatorDecimal");
5909 if ($outlangs->transnoentitiesnoconv(
"SeparatorThousand") !=
"SeparatorThousand") {
5910 $thousand = $outlangs->transnoentitiesnoconv(
"SeparatorThousand");
5912 if ($thousand ==
'None') {
5914 } elseif ($thousand ==
'Space') {
5921 $amount = str_replace(
',',
'.', $amount);
5923 $datas = explode(
'.', $amount);
5924 $decpart = isset($datas[1]) ? $datas[1] :
'';
5925 $decpart = preg_replace(
'/0+$/i',
'', $decpart);
5934 if ($trunc && $nbdecimal > $conf->global->MAIN_MAX_DECIMALS_SHOWN) {
5935 $nbdecimal = $conf->global->MAIN_MAX_DECIMALS_SHOWN;
5936 if (preg_match(
'/\.\.\./i', $conf->global->MAIN_MAX_DECIMALS_SHOWN)) {
5943 if ((
string) $forcerounding !=
'-1') {
5944 if ($forcerounding ===
'MU') {
5945 $nbdecimal = $conf->global->MAIN_MAX_DECIMALS_UNIT;
5946 } elseif ($forcerounding ===
'MT') {
5947 $nbdecimal = $conf->global->MAIN_MAX_DECIMALS_TOT;
5948 } elseif ($forcerounding >= 0) {
5949 $nbdecimal = $forcerounding;
5954 $output = number_format($amount, $nbdecimal, $dec, $thousand);
5956 $output = preg_replace(
'/\s/',
' ', $output);
5957 $output = preg_replace(
'/\'/',
''', $output);
5960 $cursymbolbefore = $cursymbolafter =
'';
5961 if ($currency_code && is_object($outlangs)) {
5962 if ($currency_code ==
'auto') {
5963 $currency_code = $conf->currency;
5966 $listofcurrenciesbefore = array(
'AUD',
'CAD',
'CNY',
'COP',
'CLP',
'GBP',
'HKD',
'MXN',
'PEN',
'USD',
'CRC');
5967 $listoflanguagesbefore = array(
'nl_NL');
5968 if (in_array($currency_code, $listofcurrenciesbefore) || in_array($outlangs->defaultlang, $listoflanguagesbefore)) {
5969 $cursymbolbefore .= $outlangs->getCurrencySymbol($currency_code);
5971 $tmpcur = $outlangs->getCurrencySymbol($currency_code);
5972 $cursymbolafter .= ($tmpcur == $currency_code ?
' '.$tmpcur : $tmpcur);
5975 $output = $cursymbolbefore.$output.$end.($cursymbolafter ?
' ' :
'').$cursymbolafter;
6006 global $langs, $conf;
6009 if (is_null($amount)) {
6018 if (is_null($langs)) {
6022 if ($langs->transnoentitiesnoconv(
"SeparatorDecimal") !=
"SeparatorDecimal") {
6023 $dec = $langs->transnoentitiesnoconv(
"SeparatorDecimal");
6025 if ($langs->transnoentitiesnoconv(
"SeparatorThousand") !=
"SeparatorThousand") {
6026 $thousand = $langs->transnoentitiesnoconv(
"SeparatorThousand");
6029 if ($thousand ==
'None') {
6031 } elseif ($thousand ==
'Space') {
6039 if (!is_numeric($amount)) {
6040 $amount = preg_replace(
'/[a-zA-Z\/\\\*\(\)<>\_]/',
'', $amount);
6043 if ($option == 2 && $thousand ==
'.' && preg_match(
'/\.(\d\d\d)$/', (
string) $amount)) {
6044 $amount = str_replace($thousand,
'', $amount);
6050 if (is_numeric($amount)) {
6052 $temps = sprintf(
"%0.10F", $amount - intval($amount));
6053 $temps = preg_replace(
'/([\.1-9])0+$/',
'\\1', $temps);
6055 $amount = number_format($amount, $nbofdec, $dec, $thousand);
6060 if ($thousand !=
',' && $thousand !=
'.') {
6061 $amount = str_replace(
',',
'.', $amount);
6064 $amount = str_replace(
' ',
'', $amount);
6065 $amount = str_replace($thousand,
'', $amount);
6066 $amount = str_replace($dec,
'.', $amount);
6068 $amount = preg_replace(
'/[^0-9\-\.]/',
'', $amount);
6074 $nbofdectoround =
'';
6075 if ($rounding ==
'MU') {
6076 $nbofdectoround = $conf->global->MAIN_MAX_DECIMALS_UNIT;
6077 } elseif ($rounding ==
'MT') {
6078 $nbofdectoround = $conf->global->MAIN_MAX_DECIMALS_TOT;
6079 } elseif ($rounding ==
'MS') {
6080 $nbofdectoround = isset($conf->global->MAIN_MAX_DECIMALS_STOCK) ? $conf->global->MAIN_MAX_DECIMALS_STOCK : 5;
6081 } elseif ($rounding ==
'CU') {
6082 $nbofdectoround = max($conf->global->MAIN_MAX_DECIMALS_UNIT, 8);
6083 } elseif ($rounding ==
'CT') {
6084 $nbofdectoround = max($conf->global->MAIN_MAX_DECIMALS_TOT, 8);
6085 } elseif (is_numeric($rounding)) {
6086 $nbofdectoround = (int) $rounding;
6091 $amount = round(is_string($amount) ? (
float) $amount : $amount, $nbofdectoround);
6093 return 'ErrorBadParameterProvidedToFunction';
6099 if (is_numeric($amount)) {
6101 $temps = sprintf(
"%0.10F", $amount - intval($amount));
6102 $temps = preg_replace(
'/([\.1-9])0+$/',
'\\1', $temps);
6104 $amount = number_format($amount, min($nbofdec, $nbofdectoround), $dec, $thousand);
6110 if ($thousand !=
',' && $thousand !=
'.') {
6111 $amount = str_replace(
',',
'.', $amount);
6114 $amount = str_replace(
' ',
'', $amount);
6115 $amount = str_replace($thousand,
'', $amount);
6116 $amount = str_replace($dec,
'.', $amount);
6118 $amount = preg_replace(
'/[^0-9\-\.]/',
'', $amount);
6136function showDimensionInBestUnit($dimension, $unit, $type, $outputlangs, $round = -1, $forceunitoutput =
'no', $use_short_label = 0)
6138 require_once DOL_DOCUMENT_ROOT.
'/core/lib/product.lib.php';
6140 if (($forceunitoutput ==
'no' && $dimension < 1 / 10000 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == -6)) {
6141 $dimension = $dimension * 1000000;
6143 } elseif (($forceunitoutput ==
'no' && $dimension < 1 / 10 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == -3)) {
6144 $dimension = $dimension * 1000;
6146 } elseif (($forceunitoutput ==
'no' && $dimension > 100000000 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == 6)) {
6147 $dimension = $dimension / 1000000;
6149 } elseif (($forceunitoutput ==
'no' && $dimension > 100000 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == 3)) {
6150 $dimension = $dimension / 1000;
6166 $ret =
price($dimension, 0, $outputlangs, 0, 0, $round);
6167 $ret .=
' '.measuringUnitString(0, $type, $unit, $use_short_label, $outputlangs);
6185function get_localtax($vatrate, $local, $thirdparty_buyer =
"", $thirdparty_seller =
"", $vatnpr = 0)
6187 global $db, $conf, $mysoc;
6189 if (empty($thirdparty_seller) || !is_object($thirdparty_seller)) {
6190 $thirdparty_seller = $mysoc;
6193 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);
6195 $vatratecleaned = $vatrate;
6197 if (preg_match(
'/^(.*)\s*\((.*)\)$/', $vatrate, $reg)) {
6198 $vatratecleaned = trim($reg[1]);
6199 $vatratecode = $reg[2];
6208 if ($mysoc->country_code ==
'ES') {
6210 if (!$mysoc->localtax1_assuj || (
string) $vatratecleaned ==
"0") {
6213 if ($thirdparty_seller->id == $mysoc->id) {
6214 if (!$thirdparty_buyer->localtax1_assuj) {
6218 if (!$thirdparty_seller->localtax1_assuj) {
6226 if (!$mysoc->localtax2_assuj) {
6229 if ($thirdparty_seller->id == $mysoc->id) {
6230 if (!$thirdparty_buyer->localtax2_assuj) {
6234 if (!$thirdparty_seller->localtax2_assuj) {
6240 if ($local == 1 && !$thirdparty_seller->localtax1_assuj) {
6243 if ($local == 2 && !$thirdparty_seller->localtax2_assuj) {
6249 if (in_array($mysoc->country_code, array(
'ES'))) {
6250 $conf->global->MAIN_GET_LOCALTAXES_VALUES_FROM_THIRDPARTY = 1;
6254 if (!empty($conf->global->MAIN_GET_LOCALTAXES_VALUES_FROM_THIRDPARTY)) {
6256 if ($thirdparty_seller != $mysoc) {
6258 return $thirdparty_seller->localtax1_value;
6262 return $conf->global->MAIN_INFO_VALUE_LOCALTAX1;
6267 if ($thirdparty_seller != $mysoc) {
6270 return $thirdparty_seller->localtax2_value;
6273 if (in_array($mysoc->country_code, array(
'ES'))) {
6274 return $thirdparty_buyer->localtax2_value;
6276 return $conf->global->MAIN_INFO_VALUE_LOCALTAX2;
6283 $sql =
"SELECT t.localtax1, t.localtax2, t.localtax1_type, t.localtax2_type";
6284 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t, ".MAIN_DB_PREFIX.
"c_country as c";
6285 $sql .=
" WHERE t.fk_pays = c.rowid AND c.code = '".$db->escape($thirdparty_seller->country_code).
"'";
6286 $sql .=
" AND t.taux = ".((float) $vatratecleaned).
" AND t.active = 1";
6287 if (!empty($vatratecode)) {
6288 $sql .=
" AND t.code ='".$db->escape($vatratecode).
"'";
6290 $sql .=
" AND t.recuperableonly = '".$db->escape($vatnpr).
"'";
6293 $resql = $db->query($sql);
6296 $obj = $db->fetch_object($resql);
6299 return $obj->localtax1;
6300 } elseif ($local == 2) {
6301 return $obj->localtax2;
6322 $valors = explode(
":", $tax);
6324 if (count($valors) > 1) {
6341 $sql =
" SELECT t.localtax".$local.
" as localtax";
6342 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t INNER JOIN ".MAIN_DB_PREFIX.
"c_country as c ON c.rowid = t.fk_pays";
6343 $sql .=
" WHERE c.code = '".$db->escape($mysoc->country_code).
"' AND t.active = 1 AND t.taux = (";
6344 $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";
6345 $sql .=
" WHERE c.code = '".$db->escape($mysoc->country_code).
"' AND tt.active = 1)";
6346 $sql .=
" AND t.localtax".$local.
"_type <> '0'";
6347 $sql .=
" ORDER BY t.rowid DESC";
6349 $resql = $db->query($sql);
6351 $obj = $db->fetch_object($resql);
6353 return $obj->localtax;
6378 dol_syslog(
"getTaxesFromId vat id or rate = ".$vatrate);
6381 $sql =
"SELECT t.rowid, t.code, t.taux as rate, t.recuperableonly as npr, t.accountancy_code_sell, t.accountancy_code_buy,";
6382 $sql .=
" t.localtax1, t.localtax1_type, t.localtax2, t.localtax2_type";
6383 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t";
6384 if ($firstparamisid) {
6385 $sql .=
" WHERE t.rowid = ".(int) $vatrate;
6387 $vatratecleaned = $vatrate;
6390 if (preg_match(
'/^(.*)\s*\((.*)\)$/', $vatrate, $reg)) {
6391 $vatratecleaned = $reg[1];
6392 $vatratecode = $reg[2];
6395 $sql .=
", ".MAIN_DB_PREFIX.
"c_country as c";
6398 $sql .=
" WHERE t.fk_pays = c.rowid AND c.code = '".$db->escape($seller->country_code).
"'";
6399 $sql .=
" AND t.taux = ".((float) $vatratecleaned).
" AND t.active = 1";
6401 $sql .=
" AND t.code = '".$db->escape($vatratecode).
"'";
6405 $resql = $db->query($sql);
6407 $obj = $db->fetch_object($resql);
6410 'rowid'=>$obj->rowid,
6413 'localtax1'=>$obj->localtax1,
6414 'localtax1_type'=>$obj->localtax1_type,
6415 'localtax2'=>$obj->localtax2,
6416 'localtax2_type'=>$obj->localtax2_type,
6418 'accountancy_code_sell'=>$obj->accountancy_code_sell,
6419 'accountancy_code_buy'=>$obj->accountancy_code_buy
6451 dol_syslog(
"getLocalTaxesFromRate vatrate=".$vatrate.
" local=".$local);
6454 $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";
6455 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t";
6456 if ($firstparamisid) {
6457 $sql .=
" WHERE t.rowid = ".(int) $vatrate;
6459 $vatratecleaned = $vatrate;
6462 if (preg_match(
'/^(.*)\s*\((.*)\)$/', $vatrate, $reg)) {
6463 $vatratecleaned = $reg[1];
6464 $vatratecode = $reg[2];
6467 $sql .=
", ".MAIN_DB_PREFIX.
"c_country as c";
6468 if (!empty($mysoc) && $mysoc->country_code ==
'ES') {
6469 $countrycodetouse = ((empty($buyer) || empty($buyer->country_code)) ? $mysoc->country_code : $buyer->country_code);
6470 $sql .=
" WHERE t.fk_pays = c.rowid AND c.code = '".$db->escape($countrycodetouse).
"'";
6472 $countrycodetouse = ((empty($seller) || empty($seller->country_code)) ? $mysoc->country_code : $seller->country_code);
6473 $sql .=
" WHERE t.fk_pays = c.rowid AND c.code = '".$db->escape($countrycodetouse).
"'";
6475 $sql .=
" AND t.taux = ".((float) $vatratecleaned).
" AND t.active = 1";
6477 $sql .=
" AND t.code = '".$db->escape($vatratecode).
"'";
6481 $resql = $db->query($sql);
6483 $obj = $db->fetch_object($resql);
6486 $vateratestring = $obj->rate.($obj->code ?
' ('.$obj->code.
')' :
'');
6489 return array($obj->localtax1_type,
get_localtax($vateratestring, $local, $buyer, $seller), $obj->accountancy_code_sell, $obj->accountancy_code_buy);
6490 } elseif ($local == 2) {
6491 return array($obj->localtax2_type,
get_localtax($vateratestring, $local, $buyer, $seller), $obj->accountancy_code_sell, $obj->accountancy_code_buy);
6493 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);
6513 global $db, $conf, $mysoc;
6515 require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
6523 $product->fetch($idprod);
6525 if ($mysoc->country_code == $thirdpartytouse->country_code) {
6527 if ($idprodfournprice > 0) {
6528 $result = $product->get_buyprice($idprodfournprice, 0, 0, 0);
6530 $ret = $product->vatrate_supplier;
6531 if ($product->default_vat_code_supplier) {
6532 $ret .=
' ('.$product->default_vat_code_supplier.
')';
6538 $ret = $product->tva_tx;
6539 if ($product->default_vat_code) {
6540 $ret .=
' ('.$product->default_vat_code.
')';
6551 if (empty($conf->global->MAIN_VAT_DEFAULT_IF_AUTODETECT_FAILS)) {
6553 $sql =
"SELECT t.taux as vat_rate, t.code as default_vat_code";
6554 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t, ".MAIN_DB_PREFIX.
"c_country as c";
6555 $sql .=
" WHERE t.active = 1 AND t.fk_pays = c.rowid AND c.code = '".$db->escape($thirdpartytouse->country_code).
"'";
6556 $sql .=
" ORDER BY t.use_default DESC, t.taux DESC, t.code ASC, t.recuperableonly ASC";
6557 $sql .= $db->plimit(1);
6559 $resql = $db->query($sql);
6561 $obj = $db->fetch_object($resql);
6563 $ret = $obj->vat_rate;
6564 if ($obj->default_vat_code) {
6565 $ret .=
' ('.$obj->default_vat_code.
')';
6577 if ($conf->global->MAIN_VAT_DEFAULT_IF_AUTODETECT_FAILS !=
'none') {
6578 $defaulttx = $conf->global->MAIN_VAT_DEFAULT_IF_AUTODETECT_FAILS;
6589 dol_syslog(
"get_product_vat_for_country: ret=".$ret);
6606 if (!class_exists(
'Product')) {
6607 require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
6616 $result = $product->fetch($idprod);
6618 if ($mysoc->country_code == $thirdpartytouse->country_code) {
6632 $sql =
"SELECT taux as vat_rate, localtax1, localtax2";
6633 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t, ".MAIN_DB_PREFIX.
"c_country as c";
6634 $sql .=
" WHERE t.active=1 AND t.fk_pays = c.rowid AND c.code='".$db->escape($thirdpartytouse->country_code).
"'";
6635 $sql .=
" ORDER BY t.taux DESC, t.recuperableonly ASC";
6636 $sql .= $db->plimit(1);
6638 $resql = $db->query($sql);
6640 $obj = $db->fetch_object($resql);
6643 $ret = $obj->localtax1;
6644 } elseif ($local == 2) {
6645 $ret = $obj->localtax2;
6653 dol_syslog(
"get_product_localtax_for_country: ret=".$ret);
6677 require_once DOL_DOCUMENT_ROOT.
'/core/lib/company.lib.php';
6680 $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;
6682 $seller_country_code = $thirdparty_seller->country_code;
6683 $seller_in_cee =
isInEEC($thirdparty_seller);
6685 $buyer_country_code = $thirdparty_buyer->country_code;
6686 $buyer_in_cee =
isInEEC($thirdparty_buyer);
6688 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 :
''));
6692 if (!empty($conf->global->SERVICE_ARE_ECOMMERCE_200238EC)) {
6693 if ($seller_in_cee && $buyer_in_cee) {
6694 $isacompany = $thirdparty_buyer->
isACompany();
6695 if ($isacompany &&
getDolGlobalString(
'MAIN_USE_VAT_COMPANIES_IN_EEC_WITH_INVALID_VAT_ID_ARE_INDIVIDUAL')) {
6696 require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
6710 if (!$seller_use_vat) {
6716 if (($seller_country_code == $buyer_country_code)
6717 || (in_array($seller_country_code, array(
'FR',
'MC')) && in_array($buyer_country_code, array(
'FR',
'MC')))) {
6721 if ($seller_country_code ==
'IN' &&
getDolGlobalString(
'MAIN_SALETAX_AUTOSWITCH_I_CS_FOR_INDIA')) {
6725 if (preg_match(
'/C+S-(\d+)/', $tmpvat, $reg) && $thirdparty_seller->state_id != $thirdparty_buyer->state_id) {
6727 $tmpvat = str_replace(
"C+S",
"I", $tmpvat);
6728 } elseif (preg_match(
'/I-(\d+)/', $tmpvat, $reg) && $thirdparty_seller->state_id == $thirdparty_buyer->state_id) {
6730 $tmpvat = str_replace(
"I",
"C+S", $tmpvat);
6742 if (($seller_in_cee && $buyer_in_cee)) {
6743 $isacompany = $thirdparty_buyer->
isACompany();
6744 if ($isacompany &&
getDolGlobalString(
'MAIN_USE_VAT_COMPANIES_IN_EEC_WITH_INVALID_VAT_ID_ARE_INDIVIDUAL')) {
6745 require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
6762 if (!empty($conf->global->MAIN_USE_VAT_OF_PRODUCT_FOR_INDIVIDUAL_CUSTOMER_OUT_OF_EEC) && empty($buyer_in_cee)) {
6763 $isacompany = $thirdparty_buyer->
isACompany();
6791 if ($idprodfournprice > 0) {
6792 if (!class_exists(
'ProductFournisseur')) {
6793 require_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.product.class.php';
6796 $prodprice->fetch_product_fournisseur_price($idprodfournprice);
6797 return $prodprice->fourn_tva_npr;
6798 } elseif ($idprod > 0) {
6799 if (!class_exists(
'Product')) {
6800 require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
6803 $prod->fetch($idprod);
6804 return $prod->tva_npr;
6827 if (!is_object($thirdparty_seller)) {
6830 if (!is_object($thirdparty_buyer)) {
6835 if ($mysoc->country_code ==
'ES') {
6836 if (is_numeric($thirdparty_buyer->localtax1_assuj) && !$thirdparty_buyer->localtax1_assuj) {
6841 if (is_numeric($thirdparty_seller->localtax1_assuj) && !$thirdparty_seller->localtax1_assuj) {
6844 if (!is_numeric($thirdparty_seller->localtax1_assuj) && $thirdparty_seller->localtax1_assuj ==
'localtax1off') {
6848 } elseif ($local == 2) {
6850 if (is_numeric($thirdparty_seller->localtax2_assuj) && !$thirdparty_seller->localtax2_assuj) {
6853 if (!is_numeric($thirdparty_seller->localtax2_assuj) && $thirdparty_seller->localtax2_assuj ==
'localtax2off') {
6858 if ($thirdparty_seller->country_code == $thirdparty_buyer->country_code) {
6873function yn($yesno, $case = 1, $color = 0)
6877 $result =
'unknown';
6879 if ($yesno == 1 || (isset($yesno) && (strtolower($yesno) ==
'yes' || strtolower($yesno) ==
'true'))) {
6880 $result = $langs->trans(
'yes');
6881 if ($case == 1 || $case == 3) {
6882 $result = $langs->trans(
"Yes");
6885 $result =
'<input type="checkbox" value="1" checked disabled>';
6888 $result =
'<input type="checkbox" value="1" checked disabled> '.$result;
6892 } elseif ($yesno == 0 || strtolower($yesno) ==
'no' || strtolower($yesno) ==
'false') {
6893 $result = $langs->trans(
"no");
6894 if ($case == 1 || $case == 3) {
6895 $result = $langs->trans(
"No");
6898 $result =
'<input type="checkbox" value="0" disabled>';
6901 $result =
'<input type="checkbox" value="0" disabled> '.$result;
6907 $classname =
'error';
6911 return '<span class="'.$classname.
'">'.$result.
'</span>';
6931function get_exdir($num, $level, $alpha, $withoutslash, $object, $modulepart =
'')
6935 if (empty($modulepart) && !empty($object->module)) {
6936 $modulepart = $object->module;
6941 $arrayforoldpath = array(
'cheque',
'category',
'holiday',
'supplier_invoice',
'invoice_supplier',
'mailing',
'supplier_payment');
6943 $arrayforoldpath[] =
'product';
6945 if (!empty($level) && in_array($modulepart, $arrayforoldpath)) {
6947 if (empty($alpha)) {
6948 $num = preg_replace(
'/([^0-9])/i',
'', $num);
6950 $num = preg_replace(
'/^.*\-/i',
'', $num);
6952 $num = substr(
"000".$num, -$level);
6954 $path = substr($num, 0, 1);
6957 $path = substr($num, 1, 1).
'/'.substr($num, 0, 1);
6960 $path = substr($num, 2, 1).
'/'.substr($num, 1, 1).
'/'.substr($num, 0, 1);
6970 if (empty($withoutslash) && !empty($path)) {
6989 dol_syslog(
"functions.lib::dol_mkdir: dir=".$dir, LOG_INFO);
6992 if (@is_dir($dir_osencoded)) {
7000 if (!empty($dataroot)) {
7002 $dir = str_replace($dataroot.
'/',
'', $dir);
7003 $ccdir = $dataroot.
'/';
7006 $cdir = explode(
"/", $dir);
7007 $num = count($cdir);
7008 for ($i = 0; $i < $num; $i++) {
7010 $ccdir .=
'/'.$cdir[$i];
7012 $ccdir .= $cdir[$i];
7015 if (preg_match(
"/^.:$/", $ccdir, $regs)) {
7023 if (!@is_dir($ccdir_osencoded)) {
7024 dol_syslog(
"functions.lib::dol_mkdir: Directory '".$ccdir.
"' does not exists or is outside open_basedir PHP setting.", LOG_DEBUG);
7027 $dirmaskdec = octdec((
string) $newmask);
7028 if (empty($newmask)) {
7029 $dirmaskdec = empty($conf->global->MAIN_UMASK) ? octdec(
'0755') : octdec($conf->global->MAIN_UMASK);
7031 $dirmaskdec |= octdec(
'0111');
7032 if (!@mkdir($ccdir_osencoded, $dirmaskdec)) {
7034 dol_syslog(
"functions.lib::dol_mkdir: Fails to create directory '".$ccdir.
"' or directory already exists.", LOG_WARNING);
7037 dol_syslog(
"functions.lib::dol_mkdir: Directory '".$ccdir.
"' created", LOG_DEBUG);
7046 return ($nberr ? -$nberr : $nbcreated);
7061 if (!empty($newmask)) {
7062 @chmod($filepath, octdec($newmask));
7063 } elseif (!empty($conf->global->MAIN_UMASK)) {
7064 @chmod($filepath, octdec($conf->global->MAIN_UMASK));
7076 return '<span class="fieldrequired">*</span>';
7096function dol_string_nohtmltag($stringtoclean, $removelinefeed = 1, $pagecodeto =
'UTF-8', $strip_tags = 0, $removedoublespaces = 1)
7098 if (is_null($stringtoclean)) {
7102 if ($removelinefeed == 2) {
7103 $stringtoclean = preg_replace(
'/<br[^>]*>(\n|\r)+/ims',
'<br>', $stringtoclean);
7105 $temp = preg_replace(
'/<br[^>]*>/i',
"\n", $stringtoclean);
7110 $temp = str_replace(
'< ',
'__ltspace__', $temp);
7113 $temp = strip_tags($temp);
7116 $pattern =
"/<[^<>]+>/";
7123 $tempbis = str_replace(
'<>',
'', $temp);
7124 $tempbis = preg_replace($pattern,
'', $tempbis);
7126 }
while ($tempbis != $temp);
7131 $temp = preg_replace(
'/<+([a-z]+)/i',
'\1', $temp);
7137 if ($removelinefeed == 1) {
7138 $temp = str_replace(array(
"\r\n",
"\r",
"\n"),
" ", $temp);
7142 if ($removedoublespaces) {
7143 while (strpos($temp,
" ")) {
7144 $temp = str_replace(
" ",
" ", $temp);
7148 $temp = str_replace(
'__ltspace__',
'< ', $temp);
7168function dol_string_onlythesehtmltags($stringtoclean, $cleanalsosomestyles = 1, $removeclassattribute = 1, $cleanalsojavascript = 0, $allowiframe = 0, $allowed_tags = array(), $allowlink = 0)
7170 if (empty($allowed_tags)) {
7171 $allowed_tags = array(
7172 "html",
"head",
"meta",
"body",
"article",
"a",
"abbr",
"b",
"blockquote",
"br",
"cite",
"div",
"dl",
"dd",
"dt",
"em",
"font",
"img",
"ins",
"hr",
"i",
"li",
7173 "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"
7176 $allowed_tags[] =
"comment";
7178 if (!in_array(
'iframe', $allowed_tags)) {
7179 $allowed_tags[] =
"iframe";
7183 if (!in_array(
'link', $allowed_tags)) {
7184 $allowed_tags[] =
"link";
7188 $allowed_tags_string = join(
"><", $allowed_tags);
7189 $allowed_tags_string =
'<'.$allowed_tags_string.
'>';
7191 $stringtoclean = str_replace(
'<!DOCTYPE html>',
'__!DOCTYPE_HTML__', $stringtoclean);
7196 $stringtoclean = preg_replace(
'/<!--([^>]*)-->/',
'<comment>\1</comment>', $stringtoclean);
7198 $stringtoclean = preg_replace(
'/:/i',
':', $stringtoclean);
7199 $stringtoclean = preg_replace(
'/:|�+58|:/i',
'', $stringtoclean);
7201 $temp = strip_tags($stringtoclean, $allowed_tags_string);
7203 if ($cleanalsosomestyles) {
7204 $temp = preg_replace(
'/position\s*:\s*(absolute|fixed)\s*!\s*important/i',
'', $temp);
7206 if ($removeclassattribute) {
7207 $temp = preg_replace(
'/(<[^>]+)\s+class=((["\']).*?\\3|\\w*)/i',
'\\1', $temp);
7212 if ($cleanalsojavascript) {
7213 $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);
7216 $temp = str_replace(
'__!DOCTYPE_HTML__',
'<!DOCTYPE html>', $temp);
7218 $temp = preg_replace(
'/<comment>([^>]*)<\/comment>/',
'<!--\1-->', $temp);
7236function dol_string_onlythesehtmlattributes($stringtoclean, $allowed_attributes = array(
"allow",
"allowfullscreen",
"alt",
"class",
"contenteditable",
"data-html",
"frameborder",
"height",
"href",
"id",
"name",
"src",
"style",
"target",
"title",
"width"))
7238 if (class_exists(
'DOMDocument') && !empty($stringtoclean)) {
7239 $stringtoclean =
'<?xml encoding="UTF-8"><html><body>'.$stringtoclean.
'</body></html>';
7241 $dom =
new DOMDocument(
null,
'UTF-8');
7242 $dom->loadHTML($stringtoclean, LIBXML_ERR_NONE|LIBXML_HTML_NOIMPLIED|LIBXML_HTML_NODEFDTD|LIBXML_NONET|LIBXML_NOWARNING|LIBXML_NOXMLDECL);
7244 if (is_object($dom)) {
7245 for ($els = $dom->getElementsByTagname(
'*'), $i = $els->length - 1; $i >= 0; $i--) {
7246 for ($attrs = $els->item($i)->attributes, $ii = $attrs->length - 1; $ii >= 0; $ii--) {
7248 if (!empty($attrs->item($ii)->name)) {
7249 if (! in_array($attrs->item($ii)->name, $allowed_attributes)) {
7251 $els->item($i)->removeAttribute($attrs->item($ii)->name);
7252 } elseif (in_array($attrs->item($ii)->name, array(
'style'))) {
7254 $valuetoclean = $attrs->item($ii)->value;
7256 if (isset($valuetoclean)) {
7258 $oldvaluetoclean = $valuetoclean;
7259 $valuetoclean = preg_replace(
'/\/\*.*\*\//m',
'', $valuetoclean);
7260 $valuetoclean = preg_replace(
'/position\s*:\s*[a-z]+/mi',
'', $valuetoclean);
7261 if ($els->item($i)->tagName ==
'a') {
7262 $valuetoclean = preg_replace(
'/display\s*:/mi',
'', $valuetoclean);
7263 $valuetoclean = preg_replace(
'/z-index\s*:/mi',
'', $valuetoclean);
7264 $valuetoclean = preg_replace(
'/\s+(top|left|right|bottom)\s*:/mi',
'', $valuetoclean);
7268 $valuetoclean = preg_replace(
'/(logout|passwordforgotten)\.php/mi',
'', $valuetoclean);
7269 $valuetoclean = preg_replace(
'/action=/mi',
'', $valuetoclean);
7270 }
while ($oldvaluetoclean != $valuetoclean);
7273 $attrs->item($ii)->value = $valuetoclean;
7280 $return = $dom->saveHTML();
7283 $return = preg_replace(
'/^'.preg_quote(
'<?xml encoding="UTF-8">',
'/').
'/',
'', $return);
7284 $return = preg_replace(
'/^'.preg_quote(
'<html><body>',
'/').
'/',
'', $return);
7285 $return = preg_replace(
'/'.preg_quote(
'</body></html>',
'/').
'$/',
'', $return);
7286 return trim($return);
7288 return $stringtoclean;
7305 $temp = $stringtoclean;
7306 foreach ($disallowed_tags as $tagtoremove) {
7307 $temp = preg_replace(
'/<\/?'.$tagtoremove.
'>/',
'', $temp);
7308 $temp = preg_replace(
'/<\/?'.$tagtoremove.
'\s+[^>]*>/',
'', $temp);
7311 if ($cleanalsosomestyles) {
7312 $temp = preg_replace(
'/position\s*:\s*(absolute|fixed)\s*!\s*important/',
'', $temp);
7330 if ($nboflines == 1) {
7332 $firstline = preg_replace(
'/<br[^>]*>.*$/s',
'', $text);
7333 $firstline = preg_replace(
'/<div[^>]*>.*$/s',
'', $firstline);
7336 $firstline = preg_replace(
'/[\n\r].*/',
'', $text);
7341 return $firstline.(isset($firstline) && isset($text) && (strlen($firstline) != strlen($text)) ?
'...' :
'');
7345 $text = preg_replace(
'/\n/',
'', $text);
7347 $repTable = array(
"\t" =>
" ",
"\n" =>
" ",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
7349 $repTable = array(
"\t" =>
" ",
"\n" =>
"<br>",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
7352 $text = strtr($text, $repTable);
7353 if ($charset ==
'UTF-8') {
7354 $pattern =
'/(<br[^>]*>)/Uu';
7357 $pattern =
'/(<br[^>]*>)/U';
7359 $a = preg_split($pattern, $text, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
7364 while (($i < $nba) && ($i < ($nboflines * 2))) {
7366 $firstline .= $a[$i];
7367 } elseif (($i < (($nboflines * 2) - 1)) && ($i < ($nba - 1))) {
7368 $firstline .= ($ishtml ?
"<br>\n" :
"\n");
7373 return $firstline.(($i < $nba) ?
'...' :
'');
7389function dol_nl2br($stringtoencode, $nl2brmode = 0, $forxml =
false)
7391 if (is_null($stringtoencode)) {
7396 return nl2br($stringtoencode, $forxml);
7398 $ret = preg_replace(
'/(\r\n|\r|\n)/i', ($forxml ?
'<br />' :
'<br>'), $stringtoencode);
7415 if (empty($nouseofiframesandbox) && !empty($conf->global->MAIN_SECURITY_USE_SANDBOX_FOR_HTMLWITHNOJS)) {
7420 return $stringtoencode;
7422 $out = $stringtoencode;
7425 $oldstringtoclean = $out;
7427 if (!empty($out) && !empty($conf->global->MAIN_RESTRICTHTML_ONLY_VALID_HTML) && $check !=
'restricthtmlallowunvalid') {
7429 libxml_use_internal_errors(
false);
7431 $dom =
new DOMDocument;
7435 $out =
'<div class="tricktoremove">'.$out.
'</div>';
7436 $dom->loadHTML($out, LIBXML_HTML_NODEFDTD|LIBXML_ERR_NONE|LIBXML_HTML_NOIMPLIED|LIBXML_NONET|LIBXML_NOWARNING|LIBXML_NOXMLDECL);
7437 $out = trim($dom->saveHTML());
7440 $out = preg_replace(
'/^<div class="tricktoremove">/',
'', $out);
7441 $out = preg_replace(
'/<\/div>$/',
'', $out);
7445 $out =
'InvalidHTMLStringCantBeCleaned';
7450 $out = preg_replace(
'/&(tab|newline);/i',
' ', $out);
7454 $out = preg_replace(
'/'/i',
''', $out);
7459 $out = preg_replace_callback(
'/&#(x?[0-9][0-9a-f]+;?)/i',
function ($m) {
7464 $out = preg_replace(
'/&#x?[0-9]+/i',
'', $out);
7470 if (!empty($conf->global->MAIN_RESTRICTHTML_REMOVE_ALSO_BAD_ATTRIBUTES)) {
7475 $out = preg_replace(
'/'/i',
"'", $out);
7476 }
while ($oldstringtoclean != $out);
7483 preg_match_all(
'/(<img|url\(|<link)/i', $out, $reg);
7484 $nbextlink = count($reg[0]);
7485 if ($nbextlink >
getDolGlobalInt(
"MAIN_SECURITY_MAX_IMG_IN_HTML_CONTENT", 1000)) {
7486 $out =
'TooManyLinksIntoHTMLString';
7489 if (!empty($conf->global->MAIN_DISALLOW_EXT_URL_INTO_DESCRIPTIONS) || $check ==
'restricthtmlnolink') {
7490 if ($nbextlink > 0) {
7491 $out =
'ExternalLinksNotAllowed';
7520function dol_htmlentitiesbr($stringtoencode, $nl2brmode = 0, $pagecodefrom =
'UTF-8', $removelasteolbr = 1)
7522 if (is_null($stringtoencode)) {
7526 $newstring = $stringtoencode;
7528 $newstring = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>/i',
'<br>', $newstring);
7529 if ($removelasteolbr) {
7530 $newstring = preg_replace(
'/<br>$/i',
'', $newstring);
7532 $newstring = strtr($newstring, array(
'&'=>
'__and__',
'<'=>
'__lt__',
'>'=>
'__gt__',
'"'=>
'__dquot__'));
7534 $newstring = strtr($newstring, array(
'__and__'=>
'&',
'__lt__'=>
'<',
'__gt__'=>
'>',
'__dquot__'=>
'"'));
7536 if ($removelasteolbr) {
7537 $newstring = preg_replace(
'/(\r\n|\r|\n)$/i',
'', $newstring);
7556 $ret = preg_replace(
'/'.
"\r\n".
'<br(\s[\sa-zA-Z_="]*)?\/?>/i',
"<br>", $ret);
7557 $ret = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>'.
"\r\n".
'/i',
"\r\n", $ret);
7558 $ret = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>'.
"\n".
'/i',
"\n", $ret);
7559 $ret = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>/i',
"\n", $ret);
7571 $ret = preg_replace(
'/ $/i',
"", $stringtodecode);
7572 $ret = preg_replace(
'/(<br>|<br(\s[\sa-zA-Z_="]*)?\/?>|'.
"\n".
'|'.
"\r".
')+$/i',
"", $ret);
7588 if ($keepsomeentities) {
7589 $newstring = strtr($newstring, array(
'&'=>
'__andamp__',
'<'=>
'__andlt__',
'>'=>
'__andgt__',
'"'=>
'__dquot__'));
7591 $newstring = html_entity_decode((
string) $newstring, (
int) $b, (
string) $c);
7592 if ($keepsomeentities) {
7593 $newstring = strtr($newstring, array(
'__andamp__'=>
'&',
'__andlt__'=>
'<',
'__andgt__'=>
'>',
'__dquot__'=>
'"'));
7608function dol_htmlentities($string, $flags = ENT_QUOTES|ENT_SUBSTITUTE, $encoding =
'UTF-8', $double_encode =
false)
7610 return htmlentities($string, $flags, $encoding, $double_encode);
7629 for ($scursor = 0; $scursor < $len; $scursor++) {
7630 $ordchar = ord($s[$scursor]);
7632 if ($ordchar < 32 && $ordchar != 13 && $ordchar != 10) {
7635 } elseif ($ordchar > 126 && $ordchar < 160) {
7639 $out .= $s[$scursor];
7661 $arraystring = explode(
"\n", $s);
7662 $nb = count($arraystring);
7679 $repTable = array(
"\t" =>
" ",
"\n" =>
"<br>",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
7681 $repTable = array(
"\t" =>
" ",
"\n" =>
" ",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
7684 $text = strtr($text, $repTable);
7685 if ($charset ==
'UTF-8') {
7686 $pattern =
'/(<br[^>]*>)/Uu';
7689 $pattern =
'/(<br[^>]*>)/U';
7691 $a = preg_split($pattern, $text, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
7693 $nblines = (int) floor((count($a) + 1) / 2);
7696 foreach ($a as $line) {
7699 $line_dec = html_entity_decode($line);
7701 $line_dec = wordwrap($line_dec, $maxlinesize,
'\n',
true);
7702 $nblines += substr_count($line_dec,
'\n');
7722 if (is_null($msg)) {
7727 if (preg_match(
'/<html/i', $msg)) {
7729 } elseif (preg_match(
'/<body/i', $msg)) {
7731 } elseif (preg_match(
'/<\/textarea/i', $msg)) {
7733 } elseif (preg_match(
'/<(b|em|i|u)(\s+[^>]+)?>/i', $msg)) {
7735 } elseif (preg_match(
'/<br/i', $msg)) {
7741 $msg = preg_replace(
'/https?:\/\/[^"\'\s]+/i',
'', $msg);
7742 if (preg_match(
'/<html/i', $msg)) {
7744 } elseif (preg_match(
'/<body/i', $msg)) {
7746 } elseif (preg_match(
'/<\/textarea/i', $msg)) {
7748 } elseif (preg_match(
'/<(b|em|i|u)(\s+[^>]+)?>/i', $msg)) {
7750 } elseif (preg_match(
'/<(br|hr)\/>/i', $msg)) {
7752 } elseif (preg_match(
'/<(br|hr|div|font|li|p|span|strong|table)>/i', $msg)) {
7754 } elseif (preg_match(
'/<(br|hr|div|font|li|p|span|strong|table)\s+[^<>\/]*\/?>/i', $msg)) {
7756 } elseif (preg_match(
'/<img\s+[^<>]*src[^<>]*>/i', $msg)) {
7758 } elseif (preg_match(
'/<a\s+[^<>]*href[^<>]*>/i', $msg)) {
7760 } elseif (preg_match(
'/<h[0-9]>/i', $msg)) {
7762 } elseif (preg_match(
'/&[A-Z0-9]{1,6};/i', $msg)) {
7765 } elseif (preg_match(
'/&#[0-9]{2,3};/i', $msg)) {
7789 if (!empty($invert)) {
7797 $ret .= (!empty($text1) && !empty($text2)) ? ((
dol_textishtml($text1) ||
dol_textishtml($text2)) ? ($forxml ?
"<br >\n" :
"<br>\n") :
"\n") :
"";
7817 global $db, $conf, $mysoc, $user, $extrafields;
7819 $substitutionarray = array();
7821 if ((empty($exclude) || !in_array(
'user', $exclude)) && (empty($include) || in_array(
'user', $include))) {
7825 $emailsendersignature = $user->signature;
7826 $usersignature = $user->signature;
7827 $substitutionarray = array_merge($substitutionarray, array(
7828 '__SENDEREMAIL_SIGNATURE__' => (
string) ((empty($conf->global->MAIN_MAIL_DO_NOT_USE_SIGN)) ? ($onlykey == 2 ?
dol_trunc(
'SignatureFromTheSelectedSenderProfile', 30) : $emailsendersignature) :
''),
7829 '__USER_SIGNATURE__' => (
string) (($usersignature && empty($conf->global->MAIN_MAIL_DO_NOT_USE_SIGN)) ? ($onlykey == 2 ?
dol_trunc(
dol_string_nohtmltag($usersignature), 30) : $usersignature) :
'')
7832 if (is_object($user)) {
7833 $substitutionarray = array_merge($substitutionarray, array(
7834 '__USER_ID__' => (
string) $user->id,
7835 '__USER_LOGIN__' => (
string) $user->login,
7836 '__USER_EMAIL__' => (
string) $user->email,
7837 '__USER_PHONE__' => (
string)
dol_print_phone($user->office_phone,
'', 0, 0,
'',
" ",
'',
'', -1),
7838 '__USER_PHONEPRO__' => (
string)
dol_print_phone($user->user_mobile,
'', 0, 0,
'',
" ",
'',
'', -1),
7839 '__USER_PHONEMOBILE__' => (
string)
dol_print_phone($user->personal_mobile,
'', 0, 0,
'',
" ",
'',
'', -1),
7840 '__USER_FAX__' => (
string) $user->office_fax,
7841 '__USER_LASTNAME__' => (
string) $user->lastname,
7842 '__USER_FIRSTNAME__' => (
string) $user->firstname,
7843 '__USER_FULLNAME__' => (
string) $user->getFullName($outputlangs),
7844 '__USER_SUPERVISOR_ID__' => (
string) ($user->fk_user ? $user->fk_user :
'0'),
7845 '__USER_JOB__' => (
string) $user->job,
7847 '__USER_VCARD_URL__' => (string) $user->getOnlineVirtualCardUrl(
'',
'external')
7851 if ((empty($exclude) || !in_array(
'mycompany', $exclude)) && is_object($mysoc) && (empty($include) || in_array(
'mycompany', $include))) {
7852 $substitutionarray = array_merge($substitutionarray, array(
7853 '__MYCOMPANY_NAME__' => $mysoc->name,
7854 '__MYCOMPANY_EMAIL__' => $mysoc->email,
7855 '__MYCOMPANY_PHONE__' =>
dol_print_phone($mysoc->phone,
'', 0, 0,
'',
" ",
'',
'', -1),
7856 '__MYCOMPANY_FAX__' =>
dol_print_phone($mysoc->fax,
'', 0, 0,
'',
" ",
'',
'', -1),
7857 '__MYCOMPANY_PROFID1__' => $mysoc->idprof1,
7858 '__MYCOMPANY_PROFID2__' => $mysoc->idprof2,
7859 '__MYCOMPANY_PROFID3__' => $mysoc->idprof3,
7860 '__MYCOMPANY_PROFID4__' => $mysoc->idprof4,
7861 '__MYCOMPANY_PROFID5__' => $mysoc->idprof5,
7862 '__MYCOMPANY_PROFID6__' => $mysoc->idprof6,
7863 '__MYCOMPANY_CAPITAL__' => $mysoc->capital,
7864 '__MYCOMPANY_FULLADDRESS__' => (method_exists($mysoc,
'getFullAddress') ? $mysoc->getFullAddress(1,
', ') :
''),
7865 '__MYCOMPANY_ADDRESS__' => $mysoc->address,
7866 '__MYCOMPANY_ZIP__' => $mysoc->zip,
7867 '__MYCOMPANY_TOWN__' => $mysoc->town,
7868 '__MYCOMPANY_COUNTRY__' => $mysoc->country,
7869 '__MYCOMPANY_COUNTRY_ID__' => $mysoc->country_id,
7870 '__MYCOMPANY_COUNTRY_CODE__' => $mysoc->country_code,
7871 '__MYCOMPANY_CURRENCY_CODE__' => $conf->currency
7875 if (($onlykey || is_object($object)) && (empty($exclude) || !in_array(
'object', $exclude)) && (empty($include) || in_array(
'object', $include))) {
7877 $substitutionarray[
'__ID__'] =
'__ID__';
7878 $substitutionarray[
'__REF__'] =
'__REF__';
7879 $substitutionarray[
'__NEWREF__'] =
'__NEWREF__';
7880 $substitutionarray[
'__LABEL__'] =
'__LABEL__';
7881 $substitutionarray[
'__REF_CLIENT__'] =
'__REF_CLIENT__';
7882 $substitutionarray[
'__REF_SUPPLIER__'] =
'__REF_SUPPLIER__';
7883 $substitutionarray[
'__NOTE_PUBLIC__'] =
'__NOTE_PUBLIC__';
7884 $substitutionarray[
'__NOTE_PRIVATE__'] =
'__NOTE_PRIVATE__';
7885 $substitutionarray[
'__EXTRAFIELD_XXX__'] =
'__EXTRAFIELD_XXX__';
7887 if (isModEnabled(
"societe")) {
7888 $substitutionarray[
'__THIRDPARTY_ID__'] =
'__THIRDPARTY_ID__';
7889 $substitutionarray[
'__THIRDPARTY_NAME__'] =
'__THIRDPARTY_NAME__';
7890 $substitutionarray[
'__THIRDPARTY_NAME_ALIAS__'] =
'__THIRDPARTY_NAME_ALIAS__';
7891 $substitutionarray[
'__THIRDPARTY_CODE_CLIENT__'] =
'__THIRDPARTY_CODE_CLIENT__';
7892 $substitutionarray[
'__THIRDPARTY_CODE_FOURNISSEUR__'] =
'__THIRDPARTY_CODE_FOURNISSEUR__';
7893 $substitutionarray[
'__THIRDPARTY_EMAIL__'] =
'__THIRDPARTY_EMAIL__';
7894 $substitutionarray[
'__THIRDPARTY_PHONE__'] =
'__THIRDPARTY_PHONE__';
7895 $substitutionarray[
'__THIRDPARTY_FAX__'] =
'__THIRDPARTY_FAX__';
7896 $substitutionarray[
'__THIRDPARTY_ADDRESS__'] =
'__THIRDPARTY_ADDRESS__';
7897 $substitutionarray[
'__THIRDPARTY_ZIP__'] =
'__THIRDPARTY_ZIP__';
7898 $substitutionarray[
'__THIRDPARTY_TOWN__'] =
'__THIRDPARTY_TOWN__';
7899 $substitutionarray[
'__THIRDPARTY_IDPROF1__'] =
'__THIRDPARTY_IDPROF1__';
7900 $substitutionarray[
'__THIRDPARTY_IDPROF2__'] =
'__THIRDPARTY_IDPROF2__';
7901 $substitutionarray[
'__THIRDPARTY_IDPROF3__'] =
'__THIRDPARTY_IDPROF3__';
7902 $substitutionarray[
'__THIRDPARTY_IDPROF4__'] =
'__THIRDPARTY_IDPROF4__';
7903 $substitutionarray[
'__THIRDPARTY_IDPROF5__'] =
'__THIRDPARTY_IDPROF5__';
7904 $substitutionarray[
'__THIRDPARTY_IDPROF6__'] =
'__THIRDPARTY_IDPROF6__';
7905 $substitutionarray[
'__THIRDPARTY_TVAINTRA__'] =
'__THIRDPARTY_TVAINTRA__';
7906 $substitutionarray[
'__THIRDPARTY_NOTE_PUBLIC__'] =
'__THIRDPARTY_NOTE_PUBLIC__';
7907 $substitutionarray[
'__THIRDPARTY_NOTE_PRIVATE__'] =
'__THIRDPARTY_NOTE_PRIVATE__';
7909 if (isModEnabled(
'adherent') && (!is_object($object) || $object->element ==
'adherent') && (empty($exclude) || !in_array(
'member', $exclude)) && (empty($include) || in_array(
'member', $include))) {
7910 $substitutionarray[
'__MEMBER_ID__'] =
'__MEMBER_ID__';
7911 $substitutionarray[
'__MEMBER_CIVILITY__'] =
'__MEMBER_CIVILITY__';
7912 $substitutionarray[
'__MEMBER_FIRSTNAME__'] =
'__MEMBER_FIRSTNAME__';
7913 $substitutionarray[
'__MEMBER_LASTNAME__'] =
'__MEMBER_LASTNAME__';
7914 $substitutionarray[
'__MEMBER_USER_LOGIN_INFORMATION__'] =
'Login and pass of the external user account';
7919 if (isModEnabled(
'ticket') && (!is_object($object) || $object->element ==
'ticket') && (empty($exclude) || !in_array(
'ticket', $exclude)) && (empty($include) || in_array(
'ticket', $include))) {
7920 $substitutionarray[
'__TICKET_TRACKID__'] =
'__TICKET_TRACKID__';
7921 $substitutionarray[
'__TICKET_SUBJECT__'] =
'__TICKET_SUBJECT__';
7922 $substitutionarray[
'__TICKET_TYPE__'] =
'__TICKET_TYPE__';
7923 $substitutionarray[
'__TICKET_SEVERITY__'] =
'__TICKET_SEVERITY__';
7924 $substitutionarray[
'__TICKET_CATEGORY__'] =
'__TICKET_CATEGORY__';
7925 $substitutionarray[
'__TICKET_ANALYTIC_CODE__'] =
'__TICKET_ANALYTIC_CODE__';
7926 $substitutionarray[
'__TICKET_MESSAGE__'] =
'__TICKET_MESSAGE__';
7927 $substitutionarray[
'__TICKET_PROGRESSION__'] =
'__TICKET_PROGRESSION__';
7928 $substitutionarray[
'__TICKET_USER_ASSIGN__'] =
'__TICKET_USER_ASSIGN__';
7931 if (isModEnabled(
'recruitment') && (!is_object($object) || $object->element ==
'recruitmentcandidature') && (empty($exclude) || !in_array(
'recruitment', $exclude)) && (empty($include) || in_array(
'recruitment', $include))) {
7932 $substitutionarray[
'__CANDIDATE_FULLNAME__'] =
'__CANDIDATE_FULLNAME__';
7933 $substitutionarray[
'__CANDIDATE_FIRSTNAME__'] =
'__CANDIDATE_FIRSTNAME__';
7934 $substitutionarray[
'__CANDIDATE_LASTNAME__'] =
'__CANDIDATE_LASTNAME__';
7936 if (isModEnabled(
'project') && (empty($exclude) || !in_array(
'project', $exclude)) && (empty($include) || in_array(
'project', $include))) {
7937 $substitutionarray[
'__PROJECT_ID__'] =
'__PROJECT_ID__';
7938 $substitutionarray[
'__PROJECT_REF__'] =
'__PROJECT_REF__';
7939 $substitutionarray[
'__PROJECT_NAME__'] =
'__PROJECT_NAME__';
7943 if (isModEnabled(
'contrat') && (!is_object($object) || $object->element ==
'contract') && (empty($exclude) || !in_array(
'contract', $exclude)) && (empty($include) || in_array(
'contract', $include))) {
7944 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATE__'] =
'Highest date planned for a service start';
7945 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATETIME__'] =
'Highest date and hour planned for service start';
7946 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATE__'] =
'Lowest data for planned expiration of service';
7947 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATETIME__'] =
'Lowest date and hour for planned expiration of service';
7949 if (isModEnabled(
"propal") && (!is_object($object) || $object->element ==
'propal') && (empty($exclude) || !in_array(
'propal', $exclude)) && (empty($include) || in_array(
'propal', $include))) {
7950 $substitutionarray[
'__ONLINE_SIGN_URL__'] =
'ToOfferALinkForOnlineSignature';
7952 if (isModEnabled(
"ficheinter") && (!is_object($object) || $object->element ==
'fichinter') && (empty($exclude) || !in_array(
'intervention', $exclude)) && (empty($include) || in_array(
'intervention', $include))) {
7953 $substitutionarray[
'__ONLINE_SIGN_FICHINTER_URL__'] =
'ToOfferALinkForOnlineSignature';
7955 $substitutionarray[
'__ONLINE_PAYMENT_URL__'] =
'UrlToPayOnlineIfApplicable';
7956 $substitutionarray[
'__ONLINE_PAYMENT_TEXT_AND_URL__'] =
'TextAndUrlToPayOnlineIfApplicable';
7957 $substitutionarray[
'__SECUREKEYPAYMENT__'] =
'Security key (if key is not unique per record)';
7958 $substitutionarray[
'__SECUREKEYPAYMENT_MEMBER__'] =
'Security key for payment on a member subscription (one key per member)';
7959 $substitutionarray[
'__SECUREKEYPAYMENT_ORDER__'] =
'Security key for payment on an order';
7960 $substitutionarray[
'__SECUREKEYPAYMENT_INVOICE__'] =
'Security key for payment on an invoice';
7961 $substitutionarray[
'__SECUREKEYPAYMENT_CONTRACTLINE__'] =
'Security key for payment on a service of a contract';
7963 $substitutionarray[
'__DIRECTDOWNLOAD_URL_PROPOSAL__'] =
'Direct download url of a proposal';
7964 $substitutionarray[
'__DIRECTDOWNLOAD_URL_ORDER__'] =
'Direct download url of an order';
7965 $substitutionarray[
'__DIRECTDOWNLOAD_URL_INVOICE__'] =
'Direct download url of an invoice';
7966 $substitutionarray[
'__DIRECTDOWNLOAD_URL_CONTRACT__'] =
'Direct download url of a contract';
7967 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_PROPOSAL__'] =
'Direct download url of a supplier proposal';
7969 if (isModEnabled(
"expedition") && (!is_object($object) || $object->element ==
'shipping')) {
7970 $substitutionarray[
'__SHIPPINGTRACKNUM__'] =
'Shipping tracking number';
7971 $substitutionarray[
'__SHIPPINGTRACKNUMURL__'] =
'Shipping tracking url';
7973 if (isModEnabled(
"reception") && (!is_object($object) || $object->element ==
'reception')) {
7974 $substitutionarray[
'__RECEPTIONTRACKNUM__'] =
'Shippin tracking number of shipment';
7975 $substitutionarray[
'__RECEPTIONTRACKNUMURL__'] =
'Shipping tracking url';
7978 $substitutionarray[
'__ID__'] = $object->id;
7979 $substitutionarray[
'__REF__'] = $object->ref;
7980 $substitutionarray[
'__NEWREF__'] = $object->newref;
7981 $substitutionarray[
'__LABEL__'] = (isset($object->label) ? $object->label : (isset($object->title) ? $object->title :
null));
7982 $substitutionarray[
'__REF_CLIENT__'] = (isset($object->ref_client) ? $object->ref_client : (isset($object->ref_customer) ? $object->ref_customer :
null));
7983 $substitutionarray[
'__REF_SUPPLIER__'] = (isset($object->ref_supplier) ? $object->ref_supplier :
null);
7984 $substitutionarray[
'__NOTE_PUBLIC__'] = (isset($object->note_public) ? $object->note_public :
null);
7985 $substitutionarray[
'__NOTE_PRIVATE__'] = (isset($object->note_private) ? $object->note_private :
null);
7986 if ($object->element ==
"shipping") {
7987 $substitutionarray[
'__DATE_DELIVERY__'] = (isset($object->date_delivery) ?
dol_print_date($object->date_delivery,
'day', 0, $outputlangs) :
'');
7989 $substitutionarray[
'__DATE_DELIVERY__'] = (isset($object->date_livraison) ?
dol_print_date($object->date_livraison,
'day', 0, $outputlangs) :
'');
7991 $substitutionarray[
'__DATE_DELIVERY_DAY__'] = (isset($object->date_livraison) ?
dol_print_date($object->date_livraison,
"%d") :
'');
7992 $substitutionarray[
'__DATE_DELIVERY_DAY_TEXT__'] = (isset($object->date_livraison) ?
dol_print_date($object->date_livraison,
"%A") :
'');
7993 $substitutionarray[
'__DATE_DELIVERY_MON__'] = (isset($object->date_livraison) ?
dol_print_date($object->date_livraison,
"%m") :
'');
7994 $substitutionarray[
'__DATE_DELIVERY_MON_TEXT__'] = (isset($object->date_livraison) ?
dol_print_date($object->date_livraison,
"%b") :
'');
7995 $substitutionarray[
'__DATE_DELIVERY_YEAR__'] = (isset($object->date_livraison) ?
dol_print_date($object->date_livraison,
"%Y") :
'');
7996 $substitutionarray[
'__DATE_DELIVERY_HH__'] = (isset($object->date_livraison) ?
dol_print_date($object->date_livraison,
"%H") :
'');
7997 $substitutionarray[
'__DATE_DELIVERY_MM__'] = (isset($object->date_livraison) ?
dol_print_date($object->date_livraison,
"%M") :
'');
7998 $substitutionarray[
'__DATE_DELIVERY_SS__'] = (isset($object->date_livraison) ?
dol_print_date($object->date_livraison,
"%S") :
'');
8001 $substitutionarray[
'__REFCLIENT__'] = (isset($object->ref_client) ? $object->ref_client : (isset($object->ref_customer) ? $object->ref_customer :
null));
8002 $substitutionarray[
'__REFSUPPLIER__'] = (isset($object->ref_supplier) ? $object->ref_supplier :
null);
8003 $substitutionarray[
'__SUPPLIER_ORDER_DATE_DELIVERY__'] = (isset($object->date_livraison) ?
dol_print_date($object->date_livraison,
'day', 0, $outputlangs) :
'');
8004 $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 :
'')) :
'');
8006 if (is_object($object) && ($object->element ==
'adherent' || $object->element ==
'member') && $object->id > 0) {
8007 $birthday = (empty($object->birth) ?
'' :
dol_print_date($object->birth,
'day'));
8009 $substitutionarray[
'__MEMBER_ID__'] = (isset($object->id) ? $object->id :
'');
8010 if (method_exists($object,
'getCivilityLabel')) {
8011 $substitutionarray[
'__MEMBER_CIVILITY__'] = $object->getCivilityLabel();
8013 $substitutionarray[
'__MEMBER_FIRSTNAME__'] = (isset($object->firstname) ? $object->firstname :
'');
8014 $substitutionarray[
'__MEMBER_LASTNAME__'] = (isset($object->lastname) ? $object->lastname :
'');
8015 $substitutionarray[
'__MEMBER_USER_LOGIN_INFORMATION__'] =
'';
8016 if (method_exists($object,
'getFullName')) {
8017 $substitutionarray[
'__MEMBER_FULLNAME__'] = $object->getFullName($outputlangs);
8019 $substitutionarray[
'__MEMBER_COMPANY__'] = (isset($object->societe) ? $object->societe :
'');
8020 $substitutionarray[
'__MEMBER_ADDRESS__'] = (isset($object->address) ? $object->address :
'');
8021 $substitutionarray[
'__MEMBER_ZIP__'] = (isset($object->zip) ? $object->zip :
'');
8022 $substitutionarray[
'__MEMBER_TOWN__'] = (isset($object->town) ? $object->town :
'');
8023 $substitutionarray[
'__MEMBER_COUNTRY__'] = (isset($object->country) ? $object->country :
'');
8024 $substitutionarray[
'__MEMBER_EMAIL__'] = (isset($object->email) ? $object->email :
'');
8025 $substitutionarray[
'__MEMBER_BIRTH__'] = (isset($birthday) ? $birthday :
'');
8026 $substitutionarray[
'__MEMBER_PHOTO__'] = (isset($object->photo) ? $object->photo :
'');
8027 $substitutionarray[
'__MEMBER_LOGIN__'] = (isset($object->login) ? $object->login :
'');
8028 $substitutionarray[
'__MEMBER_PASSWORD__'] = (isset($object->pass) ? $object->pass :
'');
8029 $substitutionarray[
'__MEMBER_PHONE__'] = (isset($object->phone) ?
dol_print_phone($object->phone) :
'');
8030 $substitutionarray[
'__MEMBER_PHONEPRO__'] = (isset($object->phone_perso) ?
dol_print_phone($object->phone_perso) :
'');
8031 $substitutionarray[
'__MEMBER_PHONEMOBILE__'] = (isset($object->phone_mobile) ?
dol_print_phone($object->phone_mobile) :
'');
8032 $substitutionarray[
'__MEMBER_TYPE__'] = (isset($object->type) ? $object->type :
'');
8033 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE__'] =
dol_print_date($object->first_subscription_date,
'day');
8034 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_START__'] = (isset($object->first_subscription_date_start) ?
dol_print_date($object->first_subscription_date_start,
'day') :
'');
8035 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_END__'] = (isset($object->first_subscription_date_end) ?
dol_print_date($object->first_subscription_date_end,
'day') :
'');
8036 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE__'] =
dol_print_date($object->last_subscription_date,
'day');
8037 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_START__'] =
dol_print_date($object->last_subscription_date_start,
'day');
8038 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_END__'] =
dol_print_date($object->last_subscription_date_end,
'day');
8041 if (is_object($object) && $object->element ==
'societe') {
8042 $substitutionarray[
'__THIRDPARTY_ID__'] = (is_object($object) ? $object->id :
'');
8043 $substitutionarray[
'__THIRDPARTY_NAME__'] = (is_object($object) ? $object->name :
'');
8044 $substitutionarray[
'__THIRDPARTY_NAME_ALIAS__'] = (is_object($object) ? $object->name_alias :
'');
8045 $substitutionarray[
'__THIRDPARTY_CODE_CLIENT__'] = (is_object($object) ? $object->code_client :
'');
8046 $substitutionarray[
'__THIRDPARTY_CODE_FOURNISSEUR__'] = (is_object($object) ? $object->code_fournisseur :
'');
8047 $substitutionarray[
'__THIRDPARTY_EMAIL__'] = (is_object($object) ? $object->email :
'');
8048 $substitutionarray[
'__THIRDPARTY_PHONE__'] = (is_object($object) ?
dol_print_phone($object->phone) :
'');
8049 $substitutionarray[
'__THIRDPARTY_FAX__'] = (is_object($object) ?
dol_print_phone($object->fax) :
'');
8050 $substitutionarray[
'__THIRDPARTY_ADDRESS__'] = (is_object($object) ? $object->address :
'');
8051 $substitutionarray[
'__THIRDPARTY_ZIP__'] = (is_object($object) ? $object->zip :
'');
8052 $substitutionarray[
'__THIRDPARTY_TOWN__'] = (is_object($object) ? $object->town :
'');
8053 $substitutionarray[
'__THIRDPARTY_COUNTRY_ID__'] = (is_object($object) ? $object->country_id :
'');
8054 $substitutionarray[
'__THIRDPARTY_COUNTRY_CODE__'] = (is_object($object) ? $object->country_code :
'');
8055 $substitutionarray[
'__THIRDPARTY_IDPROF1__'] = (is_object($object) ? $object->idprof1 :
'');
8056 $substitutionarray[
'__THIRDPARTY_IDPROF2__'] = (is_object($object) ? $object->idprof2 :
'');
8057 $substitutionarray[
'__THIRDPARTY_IDPROF3__'] = (is_object($object) ? $object->idprof3 :
'');
8058 $substitutionarray[
'__THIRDPARTY_IDPROF4__'] = (is_object($object) ? $object->idprof4 :
'');
8059 $substitutionarray[
'__THIRDPARTY_IDPROF5__'] = (is_object($object) ? $object->idprof5 :
'');
8060 $substitutionarray[
'__THIRDPARTY_IDPROF6__'] = (is_object($object) ? $object->idprof6 :
'');
8061 $substitutionarray[
'__THIRDPARTY_TVAINTRA__'] = (is_object($object) ? $object->tva_intra :
'');
8062 $substitutionarray[
'__THIRDPARTY_NOTE_PUBLIC__'] = (is_object($object) ?
dol_htmlentitiesbr($object->note_public) :
'');
8063 $substitutionarray[
'__THIRDPARTY_NOTE_PRIVATE__'] = (is_object($object) ?
dol_htmlentitiesbr($object->note_private) :
'');
8064 } elseif (is_object($object->thirdparty)) {
8065 $substitutionarray[
'__THIRDPARTY_ID__'] = (is_object($object->thirdparty) ? $object->thirdparty->id :
'');
8066 $substitutionarray[
'__THIRDPARTY_NAME__'] = (is_object($object->thirdparty) ? $object->thirdparty->name :
'');
8067 $substitutionarray[
'__THIRDPARTY_NAME_ALIAS__'] = (is_object($object->thirdparty) ? $object->thirdparty->name_alias :
'');
8068 $substitutionarray[
'__THIRDPARTY_CODE_CLIENT__'] = (is_object($object->thirdparty) ? $object->thirdparty->code_client :
'');
8069 $substitutionarray[
'__THIRDPARTY_CODE_FOURNISSEUR__'] = (is_object($object->thirdparty) ? $object->thirdparty->code_fournisseur :
'');
8070 $substitutionarray[
'__THIRDPARTY_EMAIL__'] = (is_object($object->thirdparty) ? $object->thirdparty->email :
'');
8071 $substitutionarray[
'__THIRDPARTY_PHONE__'] = (is_object($object->thirdparty) ?
dol_print_phone($object->thirdparty->phone) :
'');
8072 $substitutionarray[
'__THIRDPARTY_FAX__'] = (is_object($object->thirdparty) ?
dol_print_phone($object->thirdparty->fax) :
'');
8073 $substitutionarray[
'__THIRDPARTY_ADDRESS__'] = (is_object($object->thirdparty) ? $object->thirdparty->address :
'');
8074 $substitutionarray[
'__THIRDPARTY_ZIP__'] = (is_object($object->thirdparty) ? $object->thirdparty->zip :
'');
8075 $substitutionarray[
'__THIRDPARTY_TOWN__'] = (is_object($object->thirdparty) ? $object->thirdparty->town :
'');
8076 $substitutionarray[
'__THIRDPARTY_COUNTRY_ID__'] = (is_object($object->thirdparty) ? $object->thirdparty->country_id :
'');
8077 $substitutionarray[
'__THIRDPARTY_COUNTRY_CODE__'] = (is_object($object->thirdparty) ? $object->thirdparty->country_code :
'');
8078 $substitutionarray[
'__THIRDPARTY_IDPROF1__'] = (is_object($object->thirdparty) ? $object->thirdparty->idprof1 :
'');
8079 $substitutionarray[
'__THIRDPARTY_IDPROF2__'] = (is_object($object->thirdparty) ? $object->thirdparty->idprof2 :
'');
8080 $substitutionarray[
'__THIRDPARTY_IDPROF3__'] = (is_object($object->thirdparty) ? $object->thirdparty->idprof3 :
'');
8081 $substitutionarray[
'__THIRDPARTY_IDPROF4__'] = (is_object($object->thirdparty) ? $object->thirdparty->idprof4 :
'');
8082 $substitutionarray[
'__THIRDPARTY_IDPROF5__'] = (is_object($object->thirdparty) ? $object->thirdparty->idprof5 :
'');
8083 $substitutionarray[
'__THIRDPARTY_IDPROF6__'] = (is_object($object->thirdparty) ? $object->thirdparty->idprof6 :
'');
8084 $substitutionarray[
'__THIRDPARTY_TVAINTRA__'] = (is_object($object->thirdparty) ? $object->thirdparty->tva_intra :
'');
8085 $substitutionarray[
'__THIRDPARTY_NOTE_PUBLIC__'] = (is_object($object->thirdparty) ?
dol_htmlentitiesbr($object->thirdparty->note_public) :
'');
8086 $substitutionarray[
'__THIRDPARTY_NOTE_PRIVATE__'] = (is_object($object->thirdparty) ?
dol_htmlentitiesbr($object->thirdparty->note_private) :
'');
8089 if (is_object($object) && $object->element ==
'recruitmentcandidature') {
8090 $substitutionarray[
'__CANDIDATE_FULLNAME__'] = $object->getFullName($outputlangs);
8091 $substitutionarray[
'__CANDIDATE_FIRSTNAME__'] = isset($object->firstname) ? $object->firstname :
'';
8092 $substitutionarray[
'__CANDIDATE_LASTNAME__'] = isset($object->lastname) ? $object->lastname :
'';
8094 if (is_object($object) && $object->element ==
'conferenceorboothattendee') {
8095 $substitutionarray[
'__ATTENDEE_FULLNAME__'] = $object->getFullName($outputlangs);
8096 $substitutionarray[
'__ATTENDEE_FIRSTNAME__'] = isset($object->firstname) ? $object->firstname :
'';
8097 $substitutionarray[
'__ATTENDEE_LASTNAME__'] = isset($object->lastname) ? $object->lastname :
'';
8101 if (is_object($object->project)) {
8102 $project = $object->project;
8103 } elseif (is_object($object->projet)) {
8104 $project = $object->projet;
8107 $substitutionarray[
'__PROJECT_ID__'] = $project->id;
8108 $substitutionarray[
'__PROJECT_REF__'] = $project->ref;
8109 $substitutionarray[
'__PROJECT_NAME__'] = $project->title;
8111 if (is_object($object) && $object->element ==
'project') {
8112 $substitutionarray[
'__PROJECT_NAME__'] = $object->title;
8115 if (is_object($object) && $object->element ==
'shipping') {
8116 $substitutionarray[
'__SHIPPINGTRACKNUM__'] = $object->tracking_number;
8117 $substitutionarray[
'__SHIPPINGTRACKNUMURL__'] = $object->tracking_url;
8119 if (is_object($object) && $object->element ==
'reception') {
8120 $substitutionarray[
'__RECEPTIONTRACKNUM__'] = $object->tracking_number;
8121 $substitutionarray[
'__RECEPTIONTRACKNUMURL__'] = $object->tracking_url;
8124 if (is_object($object) && $object->element ==
'contrat' && $object->id > 0 && is_array($object->lines)) {
8125 $dateplannedstart =
'';
8126 $datenextexpiration =
'';
8127 foreach ($object->lines as $line) {
8128 if ($line->date_start > $dateplannedstart) {
8129 $dateplannedstart = $line->date_start;
8131 if ($line->statut == 4 && $line->date_end && (!$datenextexpiration || $line->date_end < $datenextexpiration)) {
8132 $datenextexpiration = $line->date_end;
8135 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATE__'] =
dol_print_date($dateplannedstart,
'day');
8136 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATETIME__'] =
dol_print_date($dateplannedstart,
'standard');
8137 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATE__'] =
dol_print_date($datenextexpiration,
'day');
8138 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATETIME__'] =
dol_print_date($datenextexpiration,
'standard');
8141 if (is_object($object) && $object->element ==
'ticket') {
8142 $substitutionarray[
'__TICKET_TRACKID__'] = $object->track_id;
8143 $substitutionarray[
'__REF__'] = $object->ref;
8144 $substitutionarray[
'__TICKET_SUBJECT__'] = $object->subject;
8145 $substitutionarray[
'__TICKET_TYPE__'] = $object->type_code;
8146 $substitutionarray[
'__TICKET_SEVERITY__'] = $object->severity_code;
8147 $substitutionarray[
'__TICKET_CATEGORY__'] = $object->category_code;
8148 $substitutionarray[
'__TICKET_ANALYTIC_CODE__'] = $object->category_code;
8149 $substitutionarray[
'__TICKET_MESSAGE__'] = $object->message;
8150 $substitutionarray[
'__TICKET_PROGRESSION__'] = $object->progress;
8151 $userstat =
new User($db);
8152 if ($object->fk_user_assign > 0) {
8153 $userstat->fetch($object->fk_user_assign);
8154 $substitutionarray[
'__TICKET_USER_ASSIGN__'] =
dolGetFirstLastname($userstat->firstname, $userstat->lastname);
8157 if ($object->fk_user_create > 0) {
8158 $userstat->fetch($object->fk_user_create);
8159 $substitutionarray[
'__USER_CREATE__'] =
dolGetFirstLastname($userstat->firstname, $userstat->lastname);
8164 if ($object->table_element && $object->id > 0) {
8165 if (!is_object($extrafields)) {
8168 $extrafields->fetch_name_optionals_label($object->table_element,
true);
8170 if ($object->fetch_optionals() > 0) {
8171 if (is_array($extrafields->attributes[$object->table_element][
'label']) && count($extrafields->attributes[$object->table_element][
'label']) > 0) {
8172 foreach ($extrafields->attributes[$object->table_element][
'label'] as $key => $label) {
8173 if ($extrafields->attributes[$object->table_element][
'type'][$key] ==
'date') {
8174 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] =
dol_print_date($object->array_options[
'options_'.$key],
'day');
8175 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_LOCALE__'] =
dol_print_date($object->array_options[
'options_'.$key],
'day',
'tzserver', $outputlangs);
8176 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_RFC__'] =
dol_print_date($object->array_options[
'options_'.$key],
'dayrfc');
8177 } elseif ($extrafields->attributes[$object->table_element][
'type'][$key] ==
'datetime') {
8178 $datetime = $object->array_options[
'options_'.$key];
8179 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'dayhour') :
'');
8180 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_LOCALE__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'dayhour',
'tzserver', $outputlangs) :
'');
8181 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_DAY_LOCALE__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'day',
'tzserver', $outputlangs) :
'');
8182 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_RFC__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'dayhourrfc') :
'');
8183 } elseif ($extrafields->attributes[$object->table_element][
'type'][$key] ==
'phone') {
8184 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] =
dol_print_phone($object->array_options[
'options_'.$key]);
8185 } elseif ($extrafields->attributes[$object->table_element][
'type'][$key] ==
'price') {
8186 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] = $object->array_options[
'options_'.$key];
8187 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_FORMATED__'] =
price($object->array_options[
'options_'.$key]);
8188 } elseif ($extrafields->attributes[$object->table_element][
'type'][$key] !=
'separator') {
8189 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] = !empty($object->array_options[
'options_'.$key]) ? $object->array_options[
'options_'.$key] :
'';
8198 if (empty($substitutionarray[
'__REF__'])) {
8202 require_once DOL_DOCUMENT_ROOT.
'/core/lib/payments.lib.php';
8203 $outputlangs->loadLangs(array(
'paypal',
'other'));
8206 $typeforonlinepayment =
'free';
8207 if (is_object($object) && $object->element ==
'commande') {
8208 $typeforonlinepayment =
'order';
8210 if (is_object($object) && $object->element ==
'facture') {
8211 $typeforonlinepayment =
'invoice';
8213 if (is_object($object) && $object->element ==
'member') {
8214 $typeforonlinepayment =
'member';
8215 if (!empty($object->last_subscription_amount)) {
8216 $amounttouse = $object->last_subscription_amount;
8219 if (is_object($object) && $object->element ==
'contrat') {
8220 $typeforonlinepayment =
'contract';
8222 if (is_object($object) && $object->element ==
'fichinter') {
8223 $typeforonlinepayment =
'ficheinter';
8226 $url = getOnlinePaymentUrl(0, $typeforonlinepayment, $substitutionarray[
'__REF__'], $amounttouse);
8230 if ($object->id > 0) {
8231 $substitutionarray[
'__ONLINE_PAYMENT_TEXT_AND_URL__'] = ($paymenturl ?str_replace(
'\n',
"\n", $outputlangs->trans(
"PredefinedMailContentLink", $paymenturl)) :
'');
8232 $substitutionarray[
'__ONLINE_PAYMENT_URL__'] = $paymenturl;
8234 if (!empty($conf->global->PROPOSAL_ALLOW_EXTERNAL_DOWNLOAD) && is_object($object) && $object->element ==
'propal') {
8235 $substitutionarray[
'__DIRECTDOWNLOAD_URL_PROPOSAL__'] = $object->getLastMainDocLink($object->element);
8237 $substitutionarray[
'__DIRECTDOWNLOAD_URL_PROPOSAL__'] =
'';
8239 if (!empty($conf->global->ORDER_ALLOW_EXTERNAL_DOWNLOAD) && is_object($object) && $object->element ==
'commande') {
8240 $substitutionarray[
'__DIRECTDOWNLOAD_URL_ORDER__'] = $object->getLastMainDocLink($object->element);
8242 $substitutionarray[
'__DIRECTDOWNLOAD_URL_ORDER__'] =
'';
8244 if (!empty($conf->global->INVOICE_ALLOW_EXTERNAL_DOWNLOAD) && is_object($object) && $object->element ==
'facture') {
8245 $substitutionarray[
'__DIRECTDOWNLOAD_URL_INVOICE__'] = $object->getLastMainDocLink($object->element);
8247 $substitutionarray[
'__DIRECTDOWNLOAD_URL_INVOICE__'] =
'';
8249 if (!empty($conf->global->CONTRACT_ALLOW_EXTERNAL_DOWNLOAD) && is_object($object) && $object->element ==
'contrat') {
8250 $substitutionarray[
'__DIRECTDOWNLOAD_URL_CONTRACT__'] = $object->getLastMainDocLink($object->element);
8252 $substitutionarray[
'__DIRECTDOWNLOAD_URL_CONTRACT__'] =
'';
8254 if (!empty($conf->global->FICHINTER_ALLOW_EXTERNAL_DOWNLOAD) && is_object($object) && $object->element ==
'fichinter') {
8255 $substitutionarray[
'__DIRECTDOWNLOAD_URL_FICHINTER__'] = $object->getLastMainDocLink($object->element);
8257 $substitutionarray[
'__DIRECTDOWNLOAD_URL_FICHINTER__'] =
'';
8259 if (!empty($conf->global->SUPPLIER_PROPOSAL_ALLOW_EXTERNAL_DOWNLOAD) && is_object($object) && $object->element ==
'supplier_proposal') {
8260 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_PROPOSAL__'] = $object->getLastMainDocLink($object->element);
8262 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_PROPOSAL__'] =
'';
8265 if (is_object($object) && $object->element ==
'propal') {
8266 $substitutionarray[
'__URL_PROPOSAL__'] = DOL_MAIN_URL_ROOT.
"/comm/propal/card.php?id=".$object->id;
8267 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
8268 $substitutionarray[
'__ONLINE_SIGN_URL__'] = getOnlineSignatureUrl(0,
'proposal', $object->ref);
8270 if (is_object($object) && $object->element ==
'commande') {
8271 $substitutionarray[
'__URL_ORDER__'] = DOL_MAIN_URL_ROOT.
"/commande/card.php?id=".$object->id;
8273 if (is_object($object) && $object->element ==
'facture') {
8274 $substitutionarray[
'__URL_INVOICE__'] = DOL_MAIN_URL_ROOT.
"/compta/facture/card.php?id=".$object->id;
8276 if (is_object($object) && $object->element ==
'contrat') {
8277 $substitutionarray[
'__URL_CONTRACT__'] = DOL_MAIN_URL_ROOT.
"/contrat/card.php?id=".$object->id;
8278 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
8279 $substitutionarray[
'__ONLINE_SIGN_URL__'] = getOnlineSignatureUrl(0,
'contract', $object->ref);
8281 if (is_object($object) && $object->element ==
'fichinter') {
8282 $substitutionarray[
'__URL_FICHINTER__'] = DOL_MAIN_URL_ROOT.
"/fichinter/card.php?id=".$object->id;
8283 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
8284 $substitutionarray[
'__ONLINE_SIGN_FICHINTER_URL__'] = getOnlineSignatureUrl(0,
'fichinter', $object->ref);
8286 if (is_object($object) && $object->element ==
'supplier_proposal') {
8287 $substitutionarray[
'__URL_SUPPLIER_PROPOSAL__'] = DOL_MAIN_URL_ROOT.
"/supplier_proposal/card.php?id=".$object->id;
8289 if (is_object($object) && $object->element ==
'shipping') {
8290 $substitutionarray[
'__URL_SHIPMENT__'] = DOL_MAIN_URL_ROOT.
"/expedition/card.php?id=".$object->id;
8294 if (is_object($object) && $object->element ==
'action') {
8295 $substitutionarray[
'__EVENT_LABEL__'] = $object->label;
8296 $substitutionarray[
'__EVENT_DATE__'] =
dol_print_date($object->datep,
'%A %d %b %Y');
8297 $substitutionarray[
'__EVENT_TIME__'] =
dol_print_date($object->datep,
'%H:%M:%S');
8301 if ((empty($exclude) || !in_array(
'objectamount', $exclude)) && (empty($include) || in_array(
'objectamount', $include))) {
8302 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functionsnumtoword.lib.php';
8304 $substitutionarray[
'__DATE_YMD__'] = is_object($object) ? (isset($object->date) ?
dol_print_date($object->date,
'day', 0, $outputlangs) :
null) :
'';
8305 $substitutionarray[
'__DATE_DUE_YMD__'] = is_object($object) ? (isset($object->date_lim_reglement) ?
dol_print_date($object->date_lim_reglement,
'day', 0, $outputlangs) :
null) :
'';
8307 $already_payed_all = 0;
8308 if (is_object($object) && ($object instanceof
Facture)) {
8309 $already_payed_all = $object->sumpayed + $object->sumdeposit + $object->sumcreditnote;
8312 $substitutionarray[
'__AMOUNT_EXCL_TAX__'] = is_object($object) ? $object->total_ht :
'';
8314 $substitutionarray[
'__AMOUNT__'] = is_object($object) ? $object->total_ttc :
'';
8315 $substitutionarray[
'__AMOUNT_TEXT__'] = is_object($object) ?
dol_convertToWord($object->total_ttc, $outputlangs,
'',
true) :
'';
8316 $substitutionarray[
'__AMOUNT_TEXTCURRENCY__'] = is_object($object) ?
dol_convertToWord($object->total_ttc, $outputlangs, $conf->currency,
true) :
'';
8318 $substitutionarray[
'__AMOUNT_REMAIN__'] = is_object($object) ?
price2num($object->total_ttc - $already_payed_all,
'MT') :
'';
8320 $substitutionarray[
'__AMOUNT_VAT__'] = is_object($object) ? (isset($object->total_vat) ? $object->total_vat : $object->total_tva) :
'';
8321 $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)) :
'';
8322 $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)) :
'';
8324 if ($onlykey != 2 || $mysoc->useLocalTax(1)) {
8325 $substitutionarray[
'__AMOUNT_TAX2__'] = is_object($object) ? $object->total_localtax1 :
'';
8327 if ($onlykey != 2 || $mysoc->useLocalTax(2)) {
8328 $substitutionarray[
'__AMOUNT_TAX3__'] = is_object($object) ? $object->total_localtax2 :
'';
8332 $substitutionarray[
'__AMOUNT_EXCL_TAX_FORMATED__'] = is_object($object) ? ($object->total_ht ?
price($object->total_ht, 0, $outputlangs, 0, -1, -1, $conf->currency) :
null) :
'';
8333 $substitutionarray[
'__AMOUNT_FORMATED__'] = is_object($object) ? ($object->total_ttc ?
price($object->total_ttc, 0, $outputlangs, 0, -1, -1, $conf->currency) :
null) :
'';
8334 $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) :
'';
8335 $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)) :
'';
8336 if ($onlykey != 2 || $mysoc->useLocalTax(1)) {
8337 $substitutionarray[
'__AMOUNT_TAX2_FORMATED__'] = is_object($object) ? ($object->total_localtax1 ?
price($object->total_localtax1, 0, $outputlangs, 0, -1, -1, $conf->currency) :
null) :
'';
8339 if ($onlykey != 2 || $mysoc->useLocalTax(2)) {
8340 $substitutionarray[
'__AMOUNT_TAX3_FORMATED__'] = is_object($object) ? ($object->total_localtax2 ?
price($object->total_localtax2, 0, $outputlangs, 0, -1, -1, $conf->currency) :
null) :
'';
8343 $substitutionarray[
'__AMOUNT_MULTICURRENCY__'] = (is_object($object) && isset($object->multicurrency_total_ttc)) ? $object->multicurrency_total_ttc :
'';
8344 $substitutionarray[
'__AMOUNT_MULTICURRENCY_TEXT__'] = (is_object($object) && isset($object->multicurrency_total_ttc)) ?
dol_convertToWord($object->multicurrency_total_ttc, $outputlangs,
'',
true) :
'';
8345 $substitutionarray[
'__AMOUNT_MULTICURRENCY_TEXTCURRENCY__'] = (is_object($object) && isset($object->multicurrency_total_ttc)) ?
dol_convertToWord($object->multicurrency_total_ttc, $outputlangs, $object->multicurrency_code,
true) :
'';
8349 if ($onlykey != 2) {
8350 $substitutionarray[
'__TOTAL_TTC__'] = is_object($object) ? $object->total_ttc :
'';
8351 $substitutionarray[
'__TOTAL_HT__'] = is_object($object) ? $object->total_ht :
'';
8352 $substitutionarray[
'__TOTAL_VAT__'] = is_object($object) ? (isset($object->total_vat) ? $object->total_vat : $object->total_tva) :
'';
8357 if ((empty($exclude) || !in_array(
'date', $exclude)) && (empty($include) || in_array(
'date', $include))) {
8358 include_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
8368 $daytext = $outputlangs->trans(
'Day'.$tmp[
'wday']);
8370 $substitutionarray = array_merge($substitutionarray, array(
8371 '__NOW_TMS__' => (
int) $now,
8372 '__NOW_TMS_YMD__' =>
dol_print_date($now,
'day', 0, $outputlangs),
8373 '__DAY__' => (
string) $tmp[
'mday'],
8374 '__DAY_TEXT__' => $daytext,
8375 '__DAY_TEXT_SHORT__' =>
dol_trunc($daytext, 3,
'right',
'UTF-8', 1),
8376 '__DAY_TEXT_MIN__' =>
dol_trunc($daytext, 1,
'right',
'UTF-8', 1),
8377 '__MONTH__' => (
string) $tmp[
'mon'],
8378 '__MONTH_TEXT__' => $outputlangs->trans(
'Month'.sprintf(
"%02d", $tmp[
'mon'])),
8379 '__MONTH_TEXT_SHORT__' => $outputlangs->trans(
'MonthShort'.sprintf(
"%02d", $tmp[
'mon'])),
8380 '__MONTH_TEXT_MIN__' => $outputlangs->trans(
'MonthVeryShort'.sprintf(
"%02d", $tmp[
'mon'])),
8381 '__YEAR__' => (
string) $tmp[
'year'],
8382 '__PREVIOUS_DAY__' => (
string) $tmp2[
'day'],
8383 '__PREVIOUS_MONTH__' => (
string) $tmp3[
'month'],
8384 '__PREVIOUS_YEAR__' => (
string) ($tmp[
'year'] - 1),
8385 '__NEXT_DAY__' => (
string) $tmp4[
'day'],
8386 '__NEXT_MONTH__' => (
string) $tmp5[
'month'],
8387 '__NEXT_YEAR__' => (
string) ($tmp[
'year'] + 1),
8391 if (isModEnabled(
'multicompany')) {
8392 $substitutionarray = array_merge($substitutionarray, array(
'__ENTITY_ID__' => $conf->entity));
8394 if ((empty($exclude) || !in_array(
'system', $exclude)) && (empty($include) || in_array(
'user', $include))) {
8395 $substitutionarray[
'__DOL_MAIN_URL_ROOT__'] = DOL_MAIN_URL_ROOT;
8396 $substitutionarray[
'__(AnyTranslationKey)__'] = $outputlangs->trans(
'TranslationOfKey');
8397 $substitutionarray[
'__(AnyTranslationKey|langfile)__'] = $outputlangs->trans(
'TranslationOfKey').
' (load also language file before)';
8398 $substitutionarray[
'__[AnyConstantKey]__'] = $outputlangs->trans(
'ValueOfConstantKey');
8401 return $substitutionarray;
8420function make_substitutions($text, $substitutionarray, $outputlangs =
null, $converttextinhtmlifnecessary = 0)
8422 global $conf, $langs;
8424 if (!is_array($substitutionarray)) {
8425 return 'ErrorBadParameterSubstitutionArrayWhenCalling_make_substitutions';
8428 if (empty($outputlangs)) {
8429 $outputlangs = $langs;
8439 if (is_object($outputlangs)) {
8441 while (preg_match(
'/__\(([^\)]+)\)__/', $text, $reg)) {
8443 $tmp = explode(
'|', $reg[1]);
8444 if (!empty($tmp[1])) {
8445 $outputlangs->load($tmp[1]);
8448 $value = $outputlangs->transnoentitiesnoconv($reg[1]);
8450 if (empty($converttextinhtmlifnecessary)) {
8452 $text = preg_replace(
'/__\('.preg_quote($reg[1],
'/').
'\)__/', $msgishtml ?
dol_htmlentitiesbr($value) : $value, $text);
8466 $text = preg_replace(
'/__\('.preg_quote($reg[1],
'/').
'\)__/', $value, $text);
8474 while (preg_match(
'/__\[([^\]]+)\]__/', $text, $reg)) {
8475 $keyfound = $reg[1];
8477 $value =
'*****forbidden*****';
8479 $value = empty($conf->global->$keyfound) ?
'' : $conf->global->$keyfound;
8482 if (empty($converttextinhtmlifnecessary)) {
8484 $text = preg_replace(
'/__\['.preg_quote($keyfound,
'/').
'\]__/', $msgishtml ?
dol_htmlentitiesbr($value) : $value, $text);
8497 $text = preg_replace(
'/__\['.preg_quote($keyfound,
'/').
'\]__/', $value, $text);
8502 foreach ($substitutionarray as $key => $value) {
8503 if (!isset($value)) {
8507 if (($key ==
'__USER_SIGNATURE__' || $key ==
'__SENDEREMAIL_SIGNATURE__') && (!empty($conf->global->MAIN_MAIL_DO_NOT_USE_SIGN))) {
8511 if (empty($converttextinhtmlifnecessary)) {
8512 $text = str_replace(
"$key",
"$value", $text);
8524 $text = str_replace(
"$key",
"$value", $text);
8545 global $conf, $user;
8547 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
8552 $dirsubstitutions = array_merge(array(), (array) $conf->modules_parts[
'substitutions']);
8554 foreach ($dirsubstitutions as $reldir) {
8562 $substitfiles =
dol_dir_list($dir,
'files', 0,
'functions_');
8563 foreach ($substitfiles as $substitfile) {
8565 if (preg_match(
'/functions_(.*)\.lib\.php/i', $substitfile[
'name'], $reg)) {
8568 dol_syslog(
"Library ".$substitfile[
'name'].
" found into ".$dir);
8570 require_once $dir.$substitfile[
'name'];
8572 $function_name = $module.
"_".$callfunc;
8573 if (function_exists($function_name)) {
8574 $function_name($substitutionarray, $outputlangs, $object, $parameters);
8579 if (!empty($conf->global->ODT_ENABLE_ALL_TAGS_IN_SUBSTITUTIONS)) {
8582 foreach ($substitutionarray as $key => $value) {
8583 $tags .=
'{'.$key.
'} => '.$value.
"\n";
8585 $substitutionarray = array_merge($substitutionarray, array(
'__ALL_TAGS__' => $tags));
8600 print
get_date_range($date_start, $date_end, $format, $outputlangs);
8613function get_date_range($date_start, $date_end, $format =
'', $outputlangs =
'', $withparenthesis = 1)
8619 if (!is_object($outputlangs)) {
8620 $outputlangs = $langs;
8623 if ($date_start && $date_end) {
8624 $out .= ($withparenthesis ?
' (' :
'').$outputlangs->transnoentitiesnoconv(
'DateFromTo',
dol_print_date($date_start, $format,
false, $outputlangs),
dol_print_date($date_end, $format,
false, $outputlangs)).($withparenthesis ?
')' :
'');
8626 if ($date_start && !$date_end) {
8627 $out .= ($withparenthesis ?
' (' :
'').$outputlangs->transnoentitiesnoconv(
'DateFrom',
dol_print_date($date_start, $format,
false, $outputlangs)).($withparenthesis ?
')' :
'');
8629 if (!$date_start && $date_end) {
8630 $out .= ($withparenthesis ?
' (' :
'').$outputlangs->transnoentitiesnoconv(
'DateUntil',
dol_print_date($date_end, $format,
false, $outputlangs)).($withparenthesis ?
')' :
'');
8650 if ($nameorder < 0) {
8651 $nameorder = (empty($conf->global->MAIN_FIRSTNAME_NAME_POSITION) ? 1 : 0);
8653 if ($nameorder == 1) {
8655 if ($firstname && $lastname) {
8659 } elseif ($nameorder == 2 || $nameorder == 3) {
8661 if (empty($ret) && $nameorder == 3) {
8666 if (empty($ret) && $nameorder == 5) {
8669 if ($nameorder == 0) {
8670 if ($firstname && $lastname) {
8694 if (!is_array($mesgs)) {
8697 if (!empty($noduplicate) && isset($_SESSION[
'dol_events'][$style]) && in_array($mesgs, $_SESSION[
'dol_events'][$style])) {
8700 $_SESSION[
'dol_events'][$style][] = $mesgs;
8704 foreach ($mesgs as $mesg) {
8706 if (!empty($noduplicate) && isset($_SESSION[
'dol_events'][$style]) && in_array($mesg, $_SESSION[
'dol_events'][$style])) {
8709 $_SESSION[
'dol_events'][$style][] = $mesg;
8729 if (empty($mesg) && empty($mesgs)) {
8730 dol_syslog(
"Try to add a message in stack, but value to add is empty message", LOG_WARNING);
8737 if (empty($messagekey) || empty($_COOKIE[
"DOLHIDEMESSAGE".$messagekey])) {
8738 if (!in_array((
string) $style, array(
'mesgs',
'warnings',
'errors'))) {
8739 dol_print_error(
'',
'Bad parameter style='.$style.
' for setEventMessages');
8741 if (empty($mesgs)) {
8744 if (!empty($mesg) && !in_array($mesg, $mesgs)) {
8765 if (isset($_SESSION[
'dol_events'][
'mesgs'])) {
8766 if (empty($disabledoutputofmessages)) {
8769 unset($_SESSION[
'dol_events'][
'mesgs']);
8772 if (isset($_SESSION[
'dol_events'][
'errors'])) {
8773 if (empty($disabledoutputofmessages)) {
8776 unset($_SESSION[
'dol_events'][
'errors']);
8780 if (isset($_SESSION[
'dol_events'][
'warnings'])) {
8781 if (empty($disabledoutputofmessages)) {
8784 unset($_SESSION[
'dol_events'][
'warnings']);
8804 global $conf, $langs;
8809 $divstart = $divend =
'';
8812 if ((empty($conf->use_javascript_ajax) || !empty($conf->global->MAIN_DISABLE_JQUERY_JNOTIFY) || $keepembedded) && !preg_match(
'/<div class=".*">/i', $out)) {
8813 $divstart =
'<div class="'.$style.
' clearboth">';
8817 if ((is_array($mesgarray) && count($mesgarray)) || $mesgstring) {
8818 $langs->load(
"errors");
8820 if (is_array($mesgarray) && count($mesgarray)) {
8821 foreach ($mesgarray as $message) {
8823 $out .= $langs->trans($message);
8824 if ($ret < count($mesgarray)) {
8831 $out .= $langs->trans($mesgstring);
8837 if (!empty($conf->use_javascript_ajax) && empty($conf->global->MAIN_DISABLE_JQUERY_JNOTIFY) && empty($keepembedded)) {
8838 $return =
'<script nonce="'.getNonce().
'">
8839 $(document).ready(function() {
8840 var block = '.(!empty($conf->global->MAIN_USE_JQUERY_BLOCKUI) ?
"true" :
"false").
'
8844 /* jnotify(message, preset of message type, keepmessage) */
8846 "'.($style ==
"ok" ? 3000 : $style).
'",
8847 '.($style ==
"ok" ?
"false" :
"true").
',
8848 { remove: function (){} } );
8891 if (empty($mesgstring) && (!is_array($mesgarray) || count($mesgarray) == 0)) {
8897 if (is_array($mesgarray)) {
8898 foreach ($mesgarray as $val) {
8899 if ($val && preg_match(
'/class="error"/i', $val)) {
8903 if ($val && preg_match(
'/class="warning"/i', $val)) {
8908 } elseif ($mesgstring && preg_match(
'/class="error"/i', $mesgstring)) {
8910 } elseif ($mesgstring && preg_match(
'/class="warning"/i', $mesgstring)) {
8913 if ($style ==
'error') {
8916 if ($style ==
'warning') {
8920 if ($iserror || $iswarning) {
8922 $mesgstring = preg_replace(
'/<\/div><div class="(error|warning)">/',
'<br>', $mesgstring);
8923 $mesgstring = preg_replace(
'/<div class="(error|warning)">/',
'', $mesgstring);
8924 $mesgstring = preg_replace(
'/<\/div>/',
'', $mesgstring);
8926 if (is_array($mesgarray)) {
8927 $newmesgarray = array();
8928 foreach ($mesgarray as $val) {
8929 if (is_string($val)) {
8930 $tmpmesgstring = preg_replace(
'/<\/div><div class="(error|warning)">/',
'<br>', $val);
8931 $tmpmesgstring = preg_replace(
'/<div class="(error|warning)">/',
'', $tmpmesgstring);
8932 $tmpmesgstring = preg_replace(
'/<\/div>/',
'', $tmpmesgstring);
8933 $newmesgarray[] = $tmpmesgstring;
8935 dol_syslog(
"Error call of dol_htmloutput_mesg with an array with a value that is not a string", LOG_WARNING);
8938 $mesgarray = $newmesgarray;
8940 print
get_htmloutput_mesg($mesgstring, $mesgarray, ($iserror ?
'error' :
'warning'), $keepembedded);
8976function dol_sort_array(&$array, $index, $order =
'asc', $natsort = 0, $case_sensitive = 0, $keepindex = 0)
8979 $order = strtolower($order);
8981 if (is_array($array)) {
8982 $sizearray = count($array);
8983 if ($sizearray > 0) {
8985 foreach (array_keys($array) as $key) {
8986 if (is_object($array[$key])) {
8987 $temp[$key] = empty($array[$key]->$index) ? 0 : $array[$key]->$index;
8989 $temp[$key] = empty($array[$key][$index]) ? 0 : $array[$key][$index];
8991 if ($natsort == -1) {
8992 $temp[$key] =
'___'.$temp[$key];
8996 if (empty($natsort) || $natsort == -1) {
8997 if ($order ==
'asc') {
9003 if ($case_sensitive) {
9008 if ($order !=
'asc') {
9009 $temp = array_reverse($temp,
true);
9015 foreach (array_keys($temp) as $key) {
9016 (is_numeric($key) && empty($keepindex)) ? $sorted[] = $array[$key] : $sorted[$key] = $array[$key];
9034 $str = (string) $str;
9038 for ($i = 0; $i < $strLength; $i++) {
9039 if (ord($str[$i]) < 0x80) {
9041 } elseif ((ord($str[$i]) & 0xE0) == 0xC0) {
9043 } elseif ((ord($str[$i]) & 0xF0) == 0xE0) {
9045 } elseif ((ord($str[$i]) & 0xF8) == 0xF0) {
9047 } elseif ((ord($str[$i]) & 0xFC) == 0xF8) {
9049 } elseif ((ord($str[$i]) & 0xFE) == 0xFC) {
9054 for ($j = 0; $j < $n; $j++) {
9055 if ((++$i == strlen($str)) || ((ord($str[$i]) & 0xC0) != 0x80)) {
9075 return preg_match(
'//u', $str) ? true :
false;
9087 if (function_exists(
'mb_check_encoding')) {
9089 if (!mb_check_encoding($str,
'ASCII')) {
9093 if (preg_match(
'/[^\x00-\x7f]/', $str)) {
9113 $tmp = ini_get(
"unicode.filesystem_encoding");
9114 if (empty($tmp) && !empty($_SERVER[
"WINDIR"])) {
9115 $tmp =
'iso-8859-1';
9120 if (!empty($conf->global->MAIN_FILESYSTEM_ENCODING)) {
9121 $tmp = $conf->global->MAIN_FILESYSTEM_ENCODING;
9124 if ($tmp ==
'iso-8859-1') {
9125 return mb_convert_encoding($str,
'ISO-8859-1',
'UTF-8');
9145function dol_getIdFromCode($db, $key, $tablename, $fieldkey =
'code', $fieldid =
'id', $entityfilter = 0, $filters =
'')
9147 global $cache_codes;
9155 if (isset($cache_codes[$tablename][$key][$fieldid])) {
9156 return $cache_codes[$tablename][$key][$fieldid];
9159 dol_syslog(
'dol_getIdFromCode (value for field '.$fieldid.
' from key '.$key.
' not found into cache)', LOG_DEBUG);
9161 $sql =
"SELECT ".$fieldid.
" as valuetoget";
9162 $sql .=
" FROM ".MAIN_DB_PREFIX.$tablename;
9163 $sql .=
" WHERE ".$fieldkey.
" = '".$db->escape($key).
"'";
9164 if (!empty($entityfilter)) {
9165 $sql .=
" AND entity IN (".getEntity($tablename).
")";
9171 $resql = $db->query($sql);
9173 $obj = $db->fetch_object($resql);
9175 $cache_codes[$tablename][$key][$fieldid] = $obj->valuetoget;
9177 $cache_codes[$tablename][$key][$fieldid] =
'';
9180 return $cache_codes[$tablename][$key][$fieldid];
9194 global $user, $conf, $langs;
9200 if (isset($strToEvaluate) && $strToEvaluate !==
'') {
9203 $rep =
dol_eval($strToEvaluate, 1, 1,
'1');
9204 $rights = $rep && (!is_string($rep) || strpos($rep,
'Bad string syntax to evaluate') ===
false);
9220function dol_eval($s, $returnvalue = 0, $hideerrors = 1, $onlysimplestring =
'1')
9223 global $db, $langs, $user, $conf, $website, $websitepage;
9224 global $action, $mainmenu, $leftmenu;
9226 global $objectoffield;
9236 if ($onlysimplestring ==
'1') {
9240 if (preg_match(
'/[^a-z0-9\s'.preg_quote(
'^$_+-.*>&|=!?():"\',/@',
'/').
']/i', $s)) {
9242 return 'Bad string syntax to evaluate (found chars that are not chars for simplestring): '.$s;
9244 dol_syslog(
'Bad string syntax to evaluate (found chars that are not chars for simplestring): '.$s);
9251 } elseif ($onlysimplestring ==
'2') {
9253 if (preg_match(
'/[^a-z0-9\s'.preg_quote(
'^$_+-.*>&|=!?():"\',/@[]',
'/').
']/i', $s)) {
9255 return 'Bad string syntax to evaluate (found chars that are not chars for simplestring): '.$s;
9257 dol_syslog(
'Bad string syntax to evaluate (found chars that are not chars for simplestring): '.$s);
9265 if (is_array($s) || $s ===
'Array') {
9266 return 'Bad string syntax to evaluate (value is Array) '.var_export($s,
true);
9268 if (strpos($s,
'::') !==
false) {
9270 return 'Bad string syntax to evaluate (double : char is forbidden): '.$s;
9272 dol_syslog(
'Bad string syntax to evaluate (double : char is forbidden): '.$s);
9276 if (strpos($s,
'`') !==
false) {
9278 return 'Bad string syntax to evaluate (backtick char is forbidden): '.$s;
9280 dol_syslog(
'Bad string syntax to evaluate (backtick char is forbidden): '.$s);
9284 if (preg_match(
'/[^0-9]+\.[^0-9]+/', $s)) {
9286 return 'Bad string syntax to evaluate (dot char is forbidden): '.$s;
9288 dol_syslog(
'Bad string syntax to evaluate (dot char is forbidden): '.$s);
9294 $forbiddenphpstrings = array(
'$$');
9295 $forbiddenphpstrings = array_merge($forbiddenphpstrings, array(
'_ENV',
'_SESSION',
'_COOKIE',
'_GET',
'_POST',
'_REQUEST',
'ReflectionFunction'));
9297 $forbiddenphpfunctions = array(
"exec",
"passthru",
"shell_exec",
"system",
"proc_open",
"popen");
9298 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"dol_eval",
"executeCLI",
"verifCond"));
9299 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"base64_decode",
"rawurldecode",
"urldecode",
"str_rot13",
"hex2bin"));
9300 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"fopen",
"file_put_contents",
"fputs",
"fputscsv",
"fwrite",
"fpassthru",
"require",
"include",
"mkdir",
"rmdir",
"symlink",
"touch",
"unlink",
"umask"));
9301 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"get_defined_functions",
"get_defined_vars",
"get_defined_constants",
"get_declared_classes"));
9302 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"function",
"call_user_func"));
9303 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"require",
"include",
"require_once",
"include_once"));
9304 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"eval",
"create_function",
"assert",
"mb_ereg_replace"));
9306 $forbiddenphpmethods = array(
'invoke',
'invokeArgs');
9308 $forbiddenphpregex =
'global\s+\$|\b('.implode(
'|', $forbiddenphpfunctions).
')\b';
9310 $forbiddenphpmethodsregex =
'->('.implode(
'|', $forbiddenphpmethods).
')';
9313 $oldstringtoclean = $s;
9314 $s = str_ireplace($forbiddenphpstrings,
'__forbiddenstring__', $s);
9315 $s = preg_replace(
'/'.$forbiddenphpregex.
'/i',
'__forbiddenstring__', $s);
9316 $s = preg_replace(
'/'.$forbiddenphpmethodsregex.
'/i',
'__forbiddenstring__', $s);
9318 }
while ($oldstringtoclean != $s);
9320 if (strpos($s,
'__forbiddenstring__') !==
false) {
9321 dol_syslog(
'Bad string syntax to evaluate: '.$s, LOG_WARNING);
9323 return 'Bad string syntax to evaluate: '.$s;
9325 dol_syslog(
'Bad string syntax to evaluate: '.$s);
9333 return @eval(
'return '.$s.
';');
9335 return eval(
'return '.$s.
';');
9344 }
catch (Error $e) {
9345 $error =
'dol_eval try/catch error : ';
9346 $error .= $e->getMessage();
9359 return (trim($element) !=
'');
9372 if (empty($codelang)) {
9376 if ($codelang ==
'auto') {
9377 return '<span class="fa fa-language"></span>';
9380 $langtocountryflag = array(
9382 'ca_ES' =>
'catalonia',
9386 'sw_SW' =>
'unknown',
9396 if (isset($langtocountryflag[$codelang])) {
9397 $flagImage = $langtocountryflag[$codelang];
9399 $tmparray = explode(
'_', $codelang);
9400 $flagImage = empty($tmparray[1]) ? $tmparray[0] : $tmparray[1];
9403 return img_picto_common($codelang,
'flags/'.strtolower($flagImage).
'.png', $moreatt, 0, $notitlealt);
9417 if (empty($countrycode)) {
9421 if (strtoupper($countrycode) ==
'MQ') {
9424 if (strtoupper($countrycode) ==
'SE') {
9427 if (strtoupper($countrycode) ==
'CH') {
9428 if ($mysoc->country_code ==
'FR') {
9431 if ($mysoc->country_code ==
'DE') {
9434 if ($mysoc->country_code ==
'IT') {
9616 $buildprimarykeytotest = strtolower($countrycode).
'-'.strtoupper($countrycode);
9617 if (in_array($buildprimarykeytotest, $locales)) {
9618 return strtolower($countrycode).
'_'.strtoupper($countrycode);
9621 if (function_exists(
'locale_get_primary_language') && function_exists(
'locale_get_region')) {
9622 foreach ($locales as $locale) {
9623 $locale_language = locale_get_primary_language($locale);
9624 $locale_region = locale_get_region($locale);
9625 if (strtoupper($countrycode) == $locale_region) {
9627 return strtolower($locale_language).
'_'.strtoupper($locale_region);
9631 dol_syslog(
"Warning Exention php-intl is not available", LOG_WARNING);
9669 global $hookmanager, $db;
9671 if (isset($conf->modules_parts[
'tabs'][$type]) && is_array($conf->modules_parts[
'tabs'][$type])) {
9672 foreach ($conf->modules_parts[
'tabs'][$type] as $value) {
9673 $values = explode(
':', $value);
9676 if ($mode ==
'add' && !preg_match(
'/^\-/', $values[1])) {
9677 if (count($values) == 6) {
9681 if ($values[0] != $type) {
9687 if ($filterorigmodule) {
9688 if (strpos($values[3],
'@')) {
9689 if ($filterorigmodule !=
'external') {
9693 if ($filterorigmodule !=
'core') {
9698 $langs->load($values[3]);
9700 if (preg_match(
'/SUBSTITUTION_([^_]+)/i', $values[2], $reg)) {
9702 $substitutionarray = array();
9707 $labeltemp = explode(
',', $values[2]);
9708 $label = $langs->trans($labeltemp[0]);
9710 if (!empty($labeltemp[1]) && is_object($object) && !empty($object->id)) {
9712 $classtoload = $labeltemp[1];
9713 if (class_exists($classtoload)) {
9714 $obj =
new $classtoload($db);
9715 $function = $labeltemp[3];
9716 if ($obj && $function && method_exists($obj, $function)) {
9717 $nbrec = $obj->$function($object->id, $obj);
9718 if (!empty($nbrec)) {
9719 $label .=
'<span class="badge marginleftonlyshort">'.$nbrec.
'</span>';
9726 $head[$h][0] =
dol_buildpath(preg_replace(
'/__ID__/i', ((is_object($object) && !empty($object->id)) ? $object->id :
''), $values[5]), 1);
9727 $head[$h][1] = $label;
9728 $head[$h][2] = str_replace(
'+',
'', $values[1]);
9731 } elseif (count($values) == 5) {
9732 dol_syslog(
'Passing 5 values in tabs module_parts is deprecated. Please update to 6 with permissions.', LOG_WARNING);
9734 if ($values[0] != $type) {
9738 if ($filterorigmodule) {
9739 if (strpos($values[3],
'@')) {
9740 if ($filterorigmodule !=
'external') {
9744 if ($filterorigmodule !=
'core') {
9749 $langs->load($values[3]);
9751 if (preg_match(
'/SUBSTITUTION_([^_]+)/i', $values[2], $reg)) {
9752 $substitutionarray = array();
9756 $label = $langs->trans($values[2]);
9759 $head[$h][0] =
dol_buildpath(preg_replace(
'/__ID__/i', ((is_object($object) && !empty($object->id)) ? $object->id :
''), $values[4]), 1);
9760 $head[$h][1] = $label;
9761 $head[$h][2] = str_replace(
'+',
'', $values[1]);
9764 } elseif ($mode ==
'remove' && preg_match(
'/^\-/', $values[1])) {
9765 if ($values[0] != $type) {
9768 $tabname = str_replace(
'-',
'', $values[1]);
9769 foreach ($head as $key => $val) {
9770 $condition = (!empty($values[3]) ?
verifCond($values[3]) : 1);
9772 if ($head[$key][2] == $tabname && $condition) {
9782 if (!empty($hookmanager)) {
9783 $parameters = array(
'object' => $object,
'mode' => $mode,
'head' => &$head,
'filterorigmodule' => $filterorigmodule);
9784 $reshook = $hookmanager->executeHooks(
'completeTabsHead', $parameters);
9786 $head = $hookmanager->resArray;
9788 $head = array_merge($head, $hookmanager->resArray);
9807 global $conf, $hookmanager, $user, $debugbar;
9809 global $micro_start_time;
9811 if ($zone ==
'private') {
9812 print
"\n".
'<!-- Common footer for private page -->'.
"\n";
9814 print
"\n".
'<!-- Common footer for public page -->'.
"\n";
9818 print
"\n<!-- A div to store page_y POST parameter -->\n";
9819 print
'<div id="page_y" style="display: none;">'.(GETPOST(
'page_y') ?
GETPOST(
'page_y') :
'').
'</div>'.
"\n";
9821 $parameters = array();
9822 $reshook = $hookmanager->executeHooks(
'printCommonFooter', $parameters);
9823 if (empty($reshook)) {
9824 if (!empty($conf->global->MAIN_HTML_FOOTER)) {
9825 print $conf->global->MAIN_HTML_FOOTER.
"\n";
9829 if (!empty($conf->use_javascript_ajax)) {
9830 print
"\n<!-- A script section to add menuhider handler on backoffice, manage focus and madatory fields, tuning info, ... -->\n";
9831 print
'<script>'.
"\n";
9832 print
'jQuery(document).ready(function() {'.
"\n";
9834 if ($zone ==
'private' && empty($conf->dol_use_jmobile)) {
9836 print
'/* JS CODE TO ENABLE to manage handler to switch left menu page (menuhider) */'.
"\n";
9837 print
'jQuery("li.menuhider").click(function(event) {';
9838 print
' if (!$( "body" ).hasClass( "sidebar-collapse" )){ event.preventDefault(); }'.
"\n";
9839 print
' console.log("We click on .menuhider");'.
"\n";
9840 print
' $("body").toggleClass("sidebar-collapse")'.
"\n";
9845 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"])))) {
9846 print
'/* JS CODE TO ENABLE to manage focus and mandatory form fields */'.
"\n";
9847 $relativepathstring = $_SERVER[
"PHP_SELF"];
9849 if (constant(
'DOL_URL_ROOT')) {
9850 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
9852 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
9853 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
9855 if (!empty($user->default_values[$relativepathstring][
'focus'])) {
9856 foreach ($user->default_values[$relativepathstring][
'focus'] as $defkey => $defval) {
9858 if ($defkey !=
'_noquery_') {
9859 $tmpqueryarraytohave = explode(
'&', $defkey);
9861 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
9862 $tmpquerytohaveparam = explode(
'=', $tmpquerytohave);
9864 if (!GETPOSTISSET($tmpquerytohaveparam[0]) || ($tmpquerytohaveparam[1] !=
GETPOST($tmpquerytohaveparam[0]))) {
9877 foreach ($defval as $paramkey => $paramval) {
9879 print
'jQuery("input[name=\''.$paramkey.
'\']
").focus();'."\n
";
9880 print 'jQuery("textarea[
name=\
''.$paramkey.
'\']
").focus();'."\n
";
9881 print 'jQuery("select[
name=\
''.$paramkey.
'\']
").focus();'."\n
"; // Not really usefull, but we keep it in case of.
9886 if (!empty($user->default_values[$relativepathstring]['mandatory'])) {
9887 foreach ($user->default_values[$relativepathstring]['mandatory'] as $defkey => $defval) {
9889 if ($defkey != '_noquery_') {
9890 $tmpqueryarraytohave = explode('&', $defkey);
9892 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
9893 $tmpquerytohaveparam = explode('=', $tmpquerytohave);
9894 //print "console.log(
'".$tmpquerytohaveparam[0]." ".$tmpquerytohaveparam[1]." ".GETPOST($tmpquerytohaveparam[0])."');
";
9895 if (!GETPOSTISSET($tmpquerytohaveparam[0]) || ($tmpquerytohaveparam[1] != GETPOST($tmpquerytohaveparam[0]))) {
9902 //var_dump($defkey.'-'.$qualified);
9908 foreach ($defval as $paramkey => $paramval) {
9909 // Add property 'required' on input
9910 print 'jQuery("input[
name=\
''.$paramkey.
'\']
").prop(\'required\',true);'."\n
";
9911 print 'jQuery("textarea[
name=\
''.$paramkey.
'\']
").prop(\'required\',true);'."\n
";
9912 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
";
9913 print 'jQuery("select[
name=\
''.$paramkey.
'\']
").prop(\'required\',true);'."\n
";
9914 print 'jQuery("select[
name=\
''.$paramkey.
'\'] option[value=\
'-1\']").prop(\'value\', \'\');'.
"\n";
9915 print
'jQuery("select[name=\''.$paramkey.
'\'] option[value=\
'0\']").prop(\'value\', \'\');'.
"\n";
9918 print
'jQuery(":input[name=\'' . $paramkey .
'\']
").closest("tr
").find("td:first
").addClass("fieldrequired
");' . "\n
";
9928 if (!empty($_SERVER['MAIN_SHOW_TUNING_INFO']) || !empty($conf->global->MAIN_SHOW_TUNING_INFO)) {
9931 print 'window.console && console.log("';
9932 if (!empty($conf->global->MEMCACHED_SERVER)) {
9933 print 'MEMCACHED_SERVER=
'.$conf->global->MEMCACHED_SERVER.' -
';
9935 print 'MAIN_OPTIMIZE_SPEED=
'.(isset($conf->global->MAIN_OPTIMIZE_SPEED) ? $conf->global->MAIN_OPTIMIZE_SPEED : 'off
');
9936 if (!empty($micro_start_time)) { // Works only if MAIN_SHOW_TUNING_INFO is defined at $_SERVER level. Not in global variable.
9937 $micro_end_time = microtime(true);
9938 print ' - Build time:
'.ceil(1000 * ($micro_end_time - $micro_start_time)).' ms
';
9941 if (function_exists("memory_get_usage")) {
9942 print ' - Mem:
'.memory_get_usage(); // Do not use true here, it seems it takes the peak amount
9944 if (function_exists("memory_get_peak_usage")) {
9945 print ' - Real mem peak:
'.memory_get_peak_usage(true);
9947 if (function_exists("zend_loader_file_encoded")) {
9948 print ' - Zend encoded file:
'.(zend_loader_file_encoded() ? 'yes
' : 'no
');
9953 print "\n
".'</script>'."\n
";
9956 // TODO Add a hook here
9957 if (isModEnabled('google') && !empty($conf->global->MAIN_GOOGLE_AN_ID)) {
9958 $tmptagarray = explode(',', $conf->global->MAIN_GOOGLE_AN_ID);
9959 foreach ($tmptagarray as $tmptag) {
9961 print "<!-- JS CODE TO ENABLE
for google analtics tag -->\n
";
9963 <!-- Global site tag (gtag.js) - Google Analytics -->
9964 <script nonce="'.getNonce().'" async src="https:
9966 window.dataLayer = window.dataLayer || [];
9967 function gtag(){dataLayer.push(arguments);}
9968 gtag(\
'js\', new Date());
9970 gtag(\'config\', \''.trim($tmptag).
'\');
9977 // Add Xdebug coverage of code
9978 if (defined('XDEBUGCOVERAGE
')) {
9979 print_r(xdebug_get_code_coverage());
9982 // Add DebugBar data
9983 if (!empty($user->rights->debugbar->read) && is_object($debugbar)) {
9984 $debugbar['time
']->stopMeasure('pageaftermaster
');
9985 print '<!-- Output debugbar data -->
'."\n";
9986 $renderer = $debugbar->getRenderer();
9987 print $debugbar->getRenderer()->render();
9988 } elseif (count($conf->logbuffer)) { // If there is some logs in buffer to show
9990 print "<!-- Start of log output\n";
9991 //print '<div
class=
"hidden">
'."\n";
9992 foreach ($conf->logbuffer as $logline) {
9993 print $logline."<br>\n";
9995 //print '</div>
'."\n";
9996 print "End of log output -->\n";
10010function dolExplodeIntoArray($string, $delimiter = ';
', $kv = '=
')
10012 if (is_null($string)) {
10016 if (preg_match('/^\[.*\]$/sm
', $delimiter) || preg_match('/^\(.*\)$/sm
', $delimiter)) {
10017 // This is a regex string
10018 $newdelimiter = $delimiter;
10020 // This is a simple string
10021 $newdelimiter = preg_quote($delimiter, '/
');
10024 if ($a = preg_split('/
'.$newdelimiter.'/
', $string)) {
10026 foreach ($a as $s) { // each part
10028 if ($pos = strpos($s, $kv)) { // key/value delimiter
10029 $ka[trim(substr($s, 0, $pos))] = trim(substr($s, $pos + strlen($kv)));
10030 } else { // key delimiter not found
10048function dol_set_focus($selector)
10050 print "\n".'<!-- Set focus onto a specific field -->
'."\n";
10051 print '<script nonce=
"'.getNonce().'">jQuery(document).ready(
function() { jQuery(
"'.dol_escape_js($selector).'").focus(); });</script>
'."\n";
10062function dol_getmypid()
10064 if (!function_exists('getmypid
')) {
10065 return mt_rand(99900000, 99965535);
10067 return getmypid(); // May be a number on 64 bits (depending on OS)
10089function natural_search($fields, $value, $mode = 0, $nofirstand = 0)
10091 global $db, $langs;
10093 $value = trim($value);
10096 $value = preg_replace('/\*/
', '%
', $value); // Replace * with %
10099 $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
10102 $value = preg_replace('/\s*\|\s*/
', '|
', $value);
10104 $crits = explode(' ', $value);
10106 if (!is_array($fields)) {
10107 $fields = array($fields);
10110 $i1 = 0; // count the nb of and criteria added (all fields / criterias)
10111 foreach ($crits as $crit) { // Loop on each AND criteria
10112 $crit = trim($crit);
10113 $i2 = 0; // count the nb of valid criteria added for this this first criteria
10115 foreach ($fields as $field) {
10117 $tmpcrits = explode('|
', $crit);
10118 $i3 = 0; // count the nb of valid criteria added for this current field
10119 foreach ($tmpcrits as $tmpcrit) {
10120 if ($tmpcrit !== '0
' && empty($tmpcrit)) {
10123 $tmpcrit = trim($tmpcrit);
10125 $newres .= (($i2 > 0 || $i3 > 0) ? ' OR
' : '');
10128 $newcrit = preg_replace('/([!<>=]+)/
', '', $tmpcrit);
10131 preg_match('/([!<>=]+)/
', $tmpcrit, $reg);
10132 if (!empty($reg[1])) {
10133 $operator = $reg[1];
10135 if ($newcrit != '') {
10136 $numnewcrit = price2num($newcrit);
10137 if (is_numeric($numnewcrit)) {
10138 $newres .= $field.' '.$operator.' '.((float) $numnewcrit); // should be a numeric
10140 $newres .= '1 = 2
'; // force false, we received a corrupted data
10142 $i3++; // a criteria was added to string
10145 $i2++; // a criteria for 1 more field was added to string
10146 } elseif ($mode == 2 || $mode == -2) {
10147 $crit = preg_replace('/[^0-9,]/
', '', $crit); // ID are always integer
10148 $newres .= ($i2 > 0 ? ' OR
' : '').$field." ".($mode == -2 ? 'NOT
' : '');
10149 $newres .= $crit ? "IN (".$db->sanitize($db->escape($crit)).")" : "IN (0)";
10151 $newres .= ' OR
'.$field.' IS NULL
';
10153 $i2++; // a criteria for 1 more field was added to string
10154 } elseif ($mode == 3 || $mode == -3) {
10155 $tmparray = explode(',
', $crit);
10156 if (count($tmparray)) {
10158 foreach ($tmparray as $val) {
10161 $listofcodes .= ($listofcodes ? ',
' : '');
10162 $listofcodes .= "'".$db->escape($val)."'";
10165 $newres .= ($i2 > 0 ? ' OR
' : '').$field." ".($mode == -3 ? 'NOT
' : '')."IN (".$db->sanitize($listofcodes, 1).")";
10166 $i2++; // a criteria for 1 more field was added to string
10169 $newres .= ' OR
'.$field.' IS NULL
';
10171 } elseif ($mode == 4) {
10172 $tmparray = explode(',
', $crit);
10173 if (count($tmparray)) {
10175 foreach ($tmparray as $val) {
10178 $newres .= ($i2 > 0 ? " OR (" : "(").$field." LIKE '".$db->escape($val).",%
'";
10179 $newres .= ' OR
'.$field." = '".$db->escape($val)."'";
10180 $newres .= ' OR
'.$field." LIKE '%,
".$db->escape($val)."'";
10181 $newres .= ' OR
'.$field." LIKE '%,
".$db->escape($val).",%
'";
10183 $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)
10187 } else { // $mode=0
10188 $tmpcrits = explode('|
', $crit);
10189 $i3 = 0; // count the nb of valid criteria added for the current couple criteria/field
10190 foreach ($tmpcrits as $tmpcrit) { // loop on each OR criteria
10191 if ($tmpcrit !== '0
' && empty($tmpcrit)) {
10194 $tmpcrit = trim($tmpcrit);
10196 if ($tmpcrit == '^$
' || strpos($crit, '!
') === 0) { // If we search empty, we must combined different OR fields with AND
10197 $newres .= (($i2 > 0 || $i3 > 0) ? ' AND
' : '');
10199 $newres .= (($i2 > 0 || $i3 > 0) ? ' OR
' : '');
10202 if (preg_match('/\.(
id|
rowid)$/
', $field)) { // Special case for rowid that is sometimes a ref so used as a search field
10203 $newres .= $field." = ".(is_numeric($tmpcrit) ? ((float) $tmpcrit) : '0
');
10205 $tmpcrit2 = $tmpcrit;
10210 if (preg_match('/^!/
', $tmpcrit)) {
10211 $tmps .= $field." NOT LIKE "; // ! as exclude character
10212 $tmpcrit2 = preg_replace('/^!/
', '', $tmpcrit2);
10214 $tmps .= $field." LIKE ";
10218 if (preg_match('/^[\^\$]/', $tmpcrit)) {
10220 $tmpcrit2 = preg_replace('/^[\^\$]/', '', $tmpcrit2);
10222 if (preg_match('/[\^\$]$/', $tmpcrit)) {
10224 $tmpcrit2 = preg_replace('/[\^\$]$/', '', $tmpcrit2);
10227 if ($tmpcrit2 == '' || preg_match('/^!/', $tmpcrit)) {
10231 $newres .= $tmpbefore;
10232 $newres .= $db->escape($tmpcrit2);
10233 $newres .= $tmpafter;
10235 if ($tmpcrit2 == '' || preg_match('/^!/
', $tmpcrit)) {
10236 $newres .= " OR ".$field." IS NULL)";
10243 $i2++; // a criteria for 1 more field was added to string
10248 $res = $res.($res ? ' AND
' : '').($i2 > 1 ? '(
' : '').$newres.($i2 > 1 ? ')
' : '');
10252 $res = ($nofirstand ? "" : " AND ")."(".$res.")";
10263function showDirectDownloadLink($object)
10265 global $conf, $langs;
10268 $url = $object->getLastMainDocLink($object->element);
10270 $out .= img_picto($langs->trans("PublicDownloadLinkDesc"), 'globe
').' <span
class=
"opacitymedium">
'.$langs->trans("DirectDownloadLink").'</span><br>
';
10272 $out .= '<div
class=
"urllink"><input
type=
"text" id=
"directdownloadlink" class=
"quatrevingtpercent" value=
"'.$url.'"></div>
';
10273 $out .= ajax_autoselect("directdownloadlink", 0);
10275 $out .= '<div
class=
"urllink">
'.$langs->trans("FileNotShared").'</div>
';
10289function getImageFileNameForSize($file, $extName, $extImgTarget = '
')
10291 $dirName = dirname($file);
10292 if ($dirName == '.
') {
10296 $fileName = preg_replace('/(\.gif|\.jpeg|\.jpg|\.png|\.bmp|\.webp)$/i
', '', $file); // We remove extension, whatever is its case
10297 $fileName = basename($fileName);
10299 if (empty($extImgTarget)) {
10300 $extImgTarget = (preg_match('/\.jpg$/i
', $file) ? '.jpg
' : '');
10302 if (empty($extImgTarget)) {
10303 $extImgTarget = (preg_match('/\.jpeg$/i
', $file) ? '.jpeg
' : '');
10305 if (empty($extImgTarget)) {
10306 $extImgTarget = (preg_match('/\.gif$/i
', $file) ? '.gif
' : '');
10308 if (empty($extImgTarget)) {
10309 $extImgTarget = (preg_match('/\.png$/i
', $file) ? '.png
' : '');
10311 if (empty($extImgTarget)) {
10312 $extImgTarget = (preg_match('/\.bmp$/i
', $file) ? '.bmp
' : '');
10314 if (empty($extImgTarget)) {
10315 $extImgTarget = (preg_match('/\.webp$/i
', $file) ? '.webp
' : '');
10318 if (!$extImgTarget) {
10324 $subdir = 'thumbs/
';
10327 return ($dirName ? $dirName.'/
' : '').$subdir.$fileName.$extName.$extImgTarget; // New filename for thumb
10340function getAdvancedPreviewUrl($modulepart, $relativepath, $alldata = 0, $param = '
')
10342 global $conf, $langs;
10344 if (empty($conf->use_javascript_ajax)) {
10348 $isAllowedForPreview = dolIsAllowedForPreview($relativepath);
10350 if ($alldata == 1) {
10351 if ($isAllowedForPreview) {
10352 return array('target
'=>'_blank
', 'css
'=>'documentpreview
', 'url
'=>DOL_URL_ROOT.'/document.php?modulepart=
'.$modulepart.'&attachment=0&file=
'.urlencode($relativepath).($param ? '&
'.$param : ''), 'mime
'=>dol_mimetype($relativepath));
10358 // old behavior, return a string
10359 if ($isAllowedForPreview) {
10360 return 'javascript:
document_preview(\
''.
dol_escape_js(DOL_URL_ROOT.
'/document.php?modulepart='.$modulepart.
'&attachment=0&file='.urlencode($relativepath).($param ?
'&'.$param :
'')).
'\', \''.
dol_mimetype($relativepath).
'\', \''.
dol_escape_js($langs->trans(
'Preview')).
'\')';
10378 $out =
'<script nonce="'.getNonce().
'">
10379 jQuery(document).ready(function () {
10380 jQuery("'.((strpos($htmlname,
'.') === 0 ?
'' :
'#').$htmlname).
'").click(function() { jQuery(this).select(); } );
10384 if ($textonlink ===
'image') {
10385 $out .=
' <a href="'.$addlink.
'" target="_blank" rel="noopener noreferrer">'.
img_picto(
'',
'globe').
'</a>';
10387 $out .=
' <a href="'.$addlink.
'" target="_blank" rel="noopener noreferrer">'.$langs->trans(
"Link").
'</a>';
10405 if (preg_match(
'/\.noexe$/i', $file)) {
10410 $mime_preview = array(
'bmp',
'jpeg',
'png',
'gif',
'tiff',
'pdf',
'plain',
'css',
'webp');
10411 if (!empty($conf->global->MAIN_ALLOW_SVG_FILES_AS_IMAGES)) {
10412 $mime_preview[] =
'svg+xml';
10416 $num_mime = array_search(
dol_mimetype($file,
'', 1), $mime_preview);
10417 if ($num_mime !==
false) {
10438 $imgmime =
'other.png';
10439 $famime =
'file-o';
10442 $tmpfile = preg_replace(
'/\.noexe$/',
'', $file);
10445 if (preg_match(
'/\.txt$/i', $tmpfile)) {
10446 $mime =
'text/plain';
10447 $imgmime =
'text.png';
10448 $famime =
'file-text-o';
10450 if (preg_match(
'/\.rtx$/i', $tmpfile)) {
10451 $mime =
'text/richtext';
10452 $imgmime =
'text.png';
10453 $famime =
'file-text-o';
10455 if (preg_match(
'/\.csv$/i', $tmpfile)) {
10456 $mime =
'text/csv';
10457 $imgmime =
'text.png';
10458 $famime =
'file-text-o';
10460 if (preg_match(
'/\.tsv$/i', $tmpfile)) {
10461 $mime =
'text/tab-separated-values';
10462 $imgmime =
'text.png';
10463 $famime =
'file-text-o';
10465 if (preg_match(
'/\.(cf|conf|log)$/i', $tmpfile)) {
10466 $mime =
'text/plain';
10467 $imgmime =
'text.png';
10468 $famime =
'file-text-o';
10470 if (preg_match(
'/\.ini$/i', $tmpfile)) {
10471 $mime =
'text/plain';
10472 $imgmime =
'text.png';
10474 $famime =
'file-text-o';
10476 if (preg_match(
'/\.md$/i', $tmpfile)) {
10477 $mime =
'text/plain';
10478 $imgmime =
'text.png';
10480 $famime =
'file-text-o';
10482 if (preg_match(
'/\.css$/i', $tmpfile)) {
10483 $mime =
'text/css';
10484 $imgmime =
'css.png';
10486 $famime =
'file-text-o';
10488 if (preg_match(
'/\.lang$/i', $tmpfile)) {
10489 $mime =
'text/plain';
10490 $imgmime =
'text.png';
10492 $famime =
'file-text-o';
10495 if (preg_match(
'/\.(crt|cer|key|pub)$/i', $tmpfile)) {
10496 $mime =
'text/plain';
10497 $imgmime =
'text.png';
10498 $famime =
'file-text-o';
10501 if (preg_match(
'/\.(html|htm|shtml)$/i', $tmpfile)) {
10502 $mime =
'text/html';
10503 $imgmime =
'html.png';
10505 $famime =
'file-text-o';
10507 if (preg_match(
'/\.(xml|xhtml)$/i', $tmpfile)) {
10508 $mime =
'text/xml';
10509 $imgmime =
'other.png';
10511 $famime =
'file-text-o';
10513 if (preg_match(
'/\.xaml$/i', $tmpfile)) {
10514 $mime =
'text/xml';
10515 $imgmime =
'other.png';
10517 $famime =
'file-text-o';
10520 if (preg_match(
'/\.bas$/i', $tmpfile)) {
10521 $mime =
'text/plain';
10522 $imgmime =
'text.png';
10524 $famime =
'file-code-o';
10526 if (preg_match(
'/\.(c)$/i', $tmpfile)) {
10527 $mime =
'text/plain';
10528 $imgmime =
'text.png';
10530 $famime =
'file-code-o';
10532 if (preg_match(
'/\.(cpp)$/i', $tmpfile)) {
10533 $mime =
'text/plain';
10534 $imgmime =
'text.png';
10536 $famime =
'file-code-o';
10538 if (preg_match(
'/\.cs$/i', $tmpfile)) {
10539 $mime =
'text/plain';
10540 $imgmime =
'text.png';
10542 $famime =
'file-code-o';
10544 if (preg_match(
'/\.(h)$/i', $tmpfile)) {
10545 $mime =
'text/plain';
10546 $imgmime =
'text.png';
10548 $famime =
'file-code-o';
10550 if (preg_match(
'/\.(java|jsp)$/i', $tmpfile)) {
10551 $mime =
'text/plain';
10552 $imgmime =
'text.png';
10554 $famime =
'file-code-o';
10556 if (preg_match(
'/\.php([0-9]{1})?$/i', $tmpfile)) {
10557 $mime =
'text/plain';
10558 $imgmime =
'php.png';
10560 $famime =
'file-code-o';
10562 if (preg_match(
'/\.phtml$/i', $tmpfile)) {
10563 $mime =
'text/plain';
10564 $imgmime =
'php.png';
10566 $famime =
'file-code-o';
10568 if (preg_match(
'/\.(pl|pm)$/i', $tmpfile)) {
10569 $mime =
'text/plain';
10570 $imgmime =
'pl.png';
10572 $famime =
'file-code-o';
10574 if (preg_match(
'/\.sql$/i', $tmpfile)) {
10575 $mime =
'text/plain';
10576 $imgmime =
'text.png';
10578 $famime =
'file-code-o';
10580 if (preg_match(
'/\.js$/i', $tmpfile)) {
10581 $mime =
'text/x-javascript';
10582 $imgmime =
'jscript.png';
10584 $famime =
'file-code-o';
10587 if (preg_match(
'/\.odp$/i', $tmpfile)) {
10588 $mime =
'application/vnd.oasis.opendocument.presentation';
10589 $imgmime =
'ooffice.png';
10590 $famime =
'file-powerpoint-o';
10592 if (preg_match(
'/\.ods$/i', $tmpfile)) {
10593 $mime =
'application/vnd.oasis.opendocument.spreadsheet';
10594 $imgmime =
'ooffice.png';
10595 $famime =
'file-excel-o';
10597 if (preg_match(
'/\.odt$/i', $tmpfile)) {
10598 $mime =
'application/vnd.oasis.opendocument.text';
10599 $imgmime =
'ooffice.png';
10600 $famime =
'file-word-o';
10603 if (preg_match(
'/\.mdb$/i', $tmpfile)) {
10604 $mime =
'application/msaccess';
10605 $imgmime =
'mdb.png';
10606 $famime =
'file-o';
10608 if (preg_match(
'/\.doc[xm]?$/i', $tmpfile)) {
10609 $mime =
'application/msword';
10610 $imgmime =
'doc.png';
10611 $famime =
'file-word-o';
10613 if (preg_match(
'/\.dot[xm]?$/i', $tmpfile)) {
10614 $mime =
'application/msword';
10615 $imgmime =
'doc.png';
10616 $famime =
'file-word-o';
10618 if (preg_match(
'/\.xlt(x)?$/i', $tmpfile)) {
10619 $mime =
'application/vnd.ms-excel';
10620 $imgmime =
'xls.png';
10621 $famime =
'file-excel-o';
10623 if (preg_match(
'/\.xla(m)?$/i', $tmpfile)) {
10624 $mime =
'application/vnd.ms-excel';
10625 $imgmime =
'xls.png';
10626 $famime =
'file-excel-o';
10628 if (preg_match(
'/\.xls$/i', $tmpfile)) {
10629 $mime =
'application/vnd.ms-excel';
10630 $imgmime =
'xls.png';
10631 $famime =
'file-excel-o';
10633 if (preg_match(
'/\.xls[bmx]$/i', $tmpfile)) {
10634 $mime =
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
10635 $imgmime =
'xls.png';
10636 $famime =
'file-excel-o';
10638 if (preg_match(
'/\.pps[mx]?$/i', $tmpfile)) {
10639 $mime =
'application/vnd.ms-powerpoint';
10640 $imgmime =
'ppt.png';
10641 $famime =
'file-powerpoint-o';
10643 if (preg_match(
'/\.ppt[mx]?$/i', $tmpfile)) {
10644 $mime =
'application/x-mspowerpoint';
10645 $imgmime =
'ppt.png';
10646 $famime =
'file-powerpoint-o';
10649 if (preg_match(
'/\.pdf$/i', $tmpfile)) {
10650 $mime =
'application/pdf';
10651 $imgmime =
'pdf.png';
10652 $famime =
'file-pdf-o';
10655 if (preg_match(
'/\.bat$/i', $tmpfile)) {
10656 $mime =
'text/x-bat';
10657 $imgmime =
'script.png';
10659 $famime =
'file-code-o';
10661 if (preg_match(
'/\.sh$/i', $tmpfile)) {
10662 $mime =
'text/x-sh';
10663 $imgmime =
'script.png';
10665 $famime =
'file-code-o';
10667 if (preg_match(
'/\.ksh$/i', $tmpfile)) {
10668 $mime =
'text/x-ksh';
10669 $imgmime =
'script.png';
10671 $famime =
'file-code-o';
10673 if (preg_match(
'/\.bash$/i', $tmpfile)) {
10674 $mime =
'text/x-bash';
10675 $imgmime =
'script.png';
10677 $famime =
'file-code-o';
10680 if (preg_match(
'/\.ico$/i', $tmpfile)) {
10681 $mime =
'image/x-icon';
10682 $imgmime =
'image.png';
10683 $famime =
'file-image-o';
10685 if (preg_match(
'/\.(jpg|jpeg)$/i', $tmpfile)) {
10686 $mime =
'image/jpeg';
10687 $imgmime =
'image.png';
10688 $famime =
'file-image-o';
10690 if (preg_match(
'/\.png$/i', $tmpfile)) {
10691 $mime =
'image/png';
10692 $imgmime =
'image.png';
10693 $famime =
'file-image-o';
10695 if (preg_match(
'/\.gif$/i', $tmpfile)) {
10696 $mime =
'image/gif';
10697 $imgmime =
'image.png';
10698 $famime =
'file-image-o';
10700 if (preg_match(
'/\.bmp$/i', $tmpfile)) {
10701 $mime =
'image/bmp';
10702 $imgmime =
'image.png';
10703 $famime =
'file-image-o';
10705 if (preg_match(
'/\.(tif|tiff)$/i', $tmpfile)) {
10706 $mime =
'image/tiff';
10707 $imgmime =
'image.png';
10708 $famime =
'file-image-o';
10710 if (preg_match(
'/\.svg$/i', $tmpfile)) {
10711 $mime =
'image/svg+xml';
10712 $imgmime =
'image.png';
10713 $famime =
'file-image-o';
10715 if (preg_match(
'/\.webp$/i', $tmpfile)) {
10716 $mime =
'image/webp';
10717 $imgmime =
'image.png';
10718 $famime =
'file-image-o';
10721 if (preg_match(
'/\.vcs$/i', $tmpfile)) {
10722 $mime =
'text/calendar';
10723 $imgmime =
'other.png';
10724 $famime =
'file-text-o';
10726 if (preg_match(
'/\.ics$/i', $tmpfile)) {
10727 $mime =
'text/calendar';
10728 $imgmime =
'other.png';
10729 $famime =
'file-text-o';
10732 if (preg_match(
'/\.torrent$/i', $tmpfile)) {
10733 $mime =
'application/x-bittorrent';
10734 $imgmime =
'other.png';
10735 $famime =
'file-o';
10738 if (preg_match(
'/\.(mp3|ogg|au|wav|wma|mid)$/i', $tmpfile)) {
10740 $imgmime =
'audio.png';
10741 $famime =
'file-audio-o';
10744 if (preg_match(
'/\.mp4$/i', $tmpfile)) {
10745 $mime =
'video/mp4';
10746 $imgmime =
'video.png';
10747 $famime =
'file-video-o';
10749 if (preg_match(
'/\.ogv$/i', $tmpfile)) {
10750 $mime =
'video/ogg';
10751 $imgmime =
'video.png';
10752 $famime =
'file-video-o';
10754 if (preg_match(
'/\.webm$/i', $tmpfile)) {
10755 $mime =
'video/webm';
10756 $imgmime =
'video.png';
10757 $famime =
'file-video-o';
10759 if (preg_match(
'/\.avi$/i', $tmpfile)) {
10760 $mime =
'video/x-msvideo';
10761 $imgmime =
'video.png';
10762 $famime =
'file-video-o';
10764 if (preg_match(
'/\.divx$/i', $tmpfile)) {
10765 $mime =
'video/divx';
10766 $imgmime =
'video.png';
10767 $famime =
'file-video-o';
10769 if (preg_match(
'/\.xvid$/i', $tmpfile)) {
10770 $mime =
'video/xvid';
10771 $imgmime =
'video.png';
10772 $famime =
'file-video-o';
10774 if (preg_match(
'/\.(wmv|mpg|mpeg)$/i', $tmpfile)) {
10776 $imgmime =
'video.png';
10777 $famime =
'file-video-o';
10780 if (preg_match(
'/\.(zip|rar|gz|tgz|z|cab|bz2|7z|tar|lzh|zst)$/i', $tmpfile)) {
10782 $imgmime =
'archive.png';
10783 $famime =
'file-archive-o';
10786 if (preg_match(
'/\.(exe|com)$/i', $tmpfile)) {
10787 $mime =
'application/octet-stream';
10788 $imgmime =
'other.png';
10789 $famime =
'file-o';
10792 if (preg_match(
'/\.(dll|lib|o|so|a)$/i', $tmpfile)) {
10794 $imgmime =
'library.png';
10795 $famime =
'file-o';
10798 if (preg_match(
'/\.err$/i', $tmpfile)) {
10800 $imgmime =
'error.png';
10801 $famime =
'file-text-o';
10806 $tmp = explode(
'/', $mime);
10807 return (!empty($tmp[1]) ? $tmp[1] : $tmp[0]);
10836 $tablename = preg_replace(
'/^'.preg_quote(MAIN_DB_PREFIX,
'/').
'/',
'', $tablename);
10838 $dictvalues = (isset($conf->cache[
'dictvalues_'.$tablename]) ? $conf->cache[
'dictvalues_'.$tablename] :
null);
10840 if (is_null($dictvalues)) {
10841 $dictvalues = array();
10843 $sql =
"SELECT * FROM ".MAIN_DB_PREFIX.$tablename.
" WHERE 1 = 1";
10844 if ($checkentity) {
10845 $sql .=
' AND entity IN (0,'.getEntity($tablename).
')';
10848 $resql = $db->query($sql);
10850 while ($obj = $db->fetch_object($resql)) {
10851 $dictvalues[$obj->{$rowidfield}] = $obj;
10857 $conf->cache[
'dictvalues_'.$tablename] = $dictvalues;
10860 if (!empty($dictvalues[$id])) {
10862 $tmp = $dictvalues[$id];
10863 return (property_exists($tmp, $field) ? $tmp->$field :
'');
10878 $stringcolor = str_replace(
'#',
'', $stringcolor);
10880 if (!empty($stringcolor)) {
10882 $tmp = explode(
',', $stringcolor);
10883 if (count($tmp) > 1) {
10888 $hexr = $stringcolor[0].$stringcolor[1];
10889 $hexg = $stringcolor[2].$stringcolor[3];
10890 $hexb = $stringcolor[4].$stringcolor[5];
10891 $r = hexdec($hexr);
10892 $g = hexdec($hexg);
10893 $b = hexdec($hexb);
10895 $bright = (max($r, $g, $b) + min($r, $g, $b)) / 510.0;
10896 if ($bright > 0.6) {
10917 if (empty($menuentry[
'enabled'])) {
10920 if ($type_user && $menuentry[
'module']) {
10921 $tmploops = explode(
'|', $menuentry[
'module']);
10923 foreach ($tmploops as $tmploop) {
10924 if (in_array($tmploop, $listofmodulesforexternal)) {
10933 if (!$menuentry[
'perms'] && $type_user) {
10936 if (!$menuentry[
'perms'] && !empty($conf->global->MAIN_MENU_HIDE_UNAUTHORIZED)) {
10939 if (!$menuentry[
'perms']) {
10954 return (ceil($n) % $x === 0) ? ceil($n) : round(($n + $x / 2) / $x) * $x;
10968function dolGetBadge($label, $html =
'', $type =
'primary', $mode =
'', $url =
'', $params = array())
10971 'class'=>
'badge '.(!empty($mode) ?
' badge-'.$mode :
'').(!empty($type) ?
' badge-'.$type :
'').(empty($params[
'css']) ?
'' :
' '.$params[
'css'])
10974 if (empty($html)) {
10978 if (!empty($url)) {
10979 $attr[
'href'] = $url;
10982 if ($mode ===
'dot') {
10983 $attr[
'class'] .=
' classfortooltip';
10984 $attr[
'title'] = $html;
10985 $attr[
'aria-label'] = $label;
10990 if (!empty($params[
'attr']) && is_array($params[
'attr'])) {
10991 foreach ($params[
'attr'] as $key => $value) {
10992 if ($key ==
'class') {
10993 $attr[
'class'] .=
' '.$value;
10994 } elseif ($key ==
'classOverride') {
10995 $attr[
'class'] = $value;
10997 $attr[$key] = $value;
11005 $attr = array_map(
'dol_escape_htmltag', $attr);
11007 $TCompiledAttr = array();
11008 foreach ($attr as $key => $value) {
11009 $TCompiledAttr[] = $key.
'="'.$value.
'"';
11012 $compiledAttributes = !empty($TCompiledAttr) ?implode(
' ', $TCompiledAttr) :
'';
11014 $tag = !empty($url) ?
'a' :
'span';
11016 return '<'.$tag.
' '.$compiledAttributes.
'>'.$html.
'</'.$tag.
'>';
11032function dolGetStatus($statusLabel =
'', $statusLabelShort =
'', $html =
'', $statusType =
'status0', $displayMode = 0, $url =
'', $params = array())
11037 $dolGetBadgeParams = array();
11039 if (!empty($params[
'badgeParams'])) {
11040 $dolGetBadgeParams = $params[
'badgeParams'];
11044 if ($displayMode == 0) {
11045 $return = !empty($html) ? $html : (empty($conf->dol_optimize_smallscreen) ? $statusLabel : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort));
11046 } elseif ($displayMode == 1) {
11047 $return = !empty($html) ? $html : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort);
11048 } elseif (!empty($conf->global->MAIN_STATUS_USES_IMAGES)) {
11051 $htmlLabel = (in_array($displayMode, array(1, 2, 5)) ?
'<span class="hideonsmartphone">' :
'').(!empty($html) ? $html : $statusLabel).(in_array($displayMode, array(1, 2, 5)) ?
'</span>' :
'');
11052 $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>' :
'');
11055 if (!empty($conf->dol_optimize_smallscreen)) {
11056 if ($displayMode == 0) {
11058 } elseif ($displayMode == 4) {
11060 } elseif ($displayMode == 6) {
11066 $statusImg = array(
11067 'status0' =>
'statut0',
11068 'status1' =>
'statut1',
11069 'status2' =>
'statut2',
11070 'status3' =>
'statut3',
11071 'status4' =>
'statut4',
11072 'status5' =>
'statut5',
11073 'status6' =>
'statut6',
11074 'status7' =>
'statut7',
11075 'status8' =>
'statut8',
11076 'status9' =>
'statut9'
11079 if (!empty($statusImg[$statusType])) {
11080 $htmlImg =
img_picto($statusLabel, $statusImg[$statusType]);
11082 $htmlImg =
img_picto($statusLabel, $statusType);
11085 if ($displayMode === 2) {
11086 $return = $htmlImg.
' '.$htmlLabelShort;
11087 } elseif ($displayMode === 3) {
11088 $return = $htmlImg;
11089 } elseif ($displayMode === 4) {
11090 $return = $htmlImg.
' '.$htmlLabel;
11091 } elseif ($displayMode === 5) {
11092 $return = $htmlLabelShort.
' '.$htmlImg;
11094 $return = $htmlLabel.
' '.$htmlImg;
11096 } elseif (empty($conf->global->MAIN_STATUS_USES_IMAGES) && !empty($displayMode)) {
11098 $statusLabelShort = (empty($statusLabelShort) ? $statusLabel : $statusLabelShort);
11100 $dolGetBadgeParams[
'attr'][
'class'] =
'badge-status';
11101 $dolGetBadgeParams[
'attr'][
'title'] = empty($params[
'tooltip']) ? $statusLabel : ($params[
'tooltip'] !=
'no' ? $params[
'tooltip'] :
'');
11103 if ($displayMode == 3) {
11104 $return = dolGetBadge((empty($conf->dol_optimize_smallscreen) ? $statusLabel : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort)),
'', $statusType,
'dot', $url, $dolGetBadgeParams);
11105 } elseif ($displayMode === 5) {
11106 $return = dolGetBadge($statusLabelShort, $html, $statusType,
'', $url, $dolGetBadgeParams);
11108 $return = dolGetBadge((empty($conf->dol_optimize_smallscreen) ? $statusLabel : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort)), $html, $statusType,
'', $url, $dolGetBadgeParams);
11150function dolGetButtonAction($label, $text =
'', $actionType =
'default', $url =
'', $id =
'', $userRight = 1, $params = array())
11152 global $hookmanager, $action, $object, $langs;
11155 if (is_array($url)) {
11156 $out =
'<div class="dropdown inline-block dropdown-holder">';
11157 $out .=
'<a style="margin-right: auto;" class="dropdown-toggle butAction" data-toggle="dropdown">'.$label.
'</a>';
11158 $out .=
'<div class="dropdown-content">';
11159 foreach ($url as $subbutton) {
11160 if ($subbutton[
'enabled'] && $subbutton[
'perm']) {
11161 if (!empty($subbutton[
'lang'])) {
11162 $langs->load($subbutton[
'lang']);
11164 $out .=
dolGetButtonAction(
'', $langs->trans($subbutton[
'label']),
'default', DOL_URL_ROOT.$subbutton[
'url'].(empty($params[
'backtopage']) ?
'' :
'&backtopage='.urlencode($params[
'backtopage'])),
'', 1, array(
'isDropDown' =>
true));
11174 if (!empty($params[
'isDropdown']))
11175 $class =
"dropdown-item";
11177 $class =
'butAction';
11178 if ($actionType ==
'danger' || $actionType ==
'delete') {
11179 $class =
'butActionDelete';
11180 if (!empty($url) && strpos($url,
'token=') ===
false) $url .=
'&token='.
newToken();
11185 'href' => empty($url) ?
'' : $url,
11189 if (empty($text)) {
11191 $attr[
'title'] =
'';
11193 $attr[
'title'] = $label;
11194 $attr[
'aria-label'] = $label;
11197 if (empty($userRight)) {
11198 $attr[
'class'] =
'butActionRefused';
11199 $attr[
'href'] =
'';
11200 $attr[
'title'] = (($label && $text && $label != $text) ? $label : $langs->trans(
'NotEnoughPermissions'));
11208 if (!empty($params[
'attr']) && is_array($params[
'attr'])) {
11209 foreach ($params[
'attr'] as $key => $value) {
11210 if ($key ==
'class') {
11211 $attr[
'class'] .=
' '.$value;
11212 } elseif ($key ==
'classOverride') {
11213 $attr[
'class'] = $value;
11215 $attr[$key] = $value;
11221 if (!empty($attr[
'title']) && !empty($attr[
'class']) && strpos($attr[
'class'],
'classfortooltip') ===
false) {
11222 $attr[
'class'].=
' classfortooltip';
11226 if ($userRight && !empty($params[
'confirm'])) {
11227 if (!is_array($params[
'confirm'])) {
11228 $params[
'confirm'] = array();
11231 if (empty($params[
'confirm'][
'url'])) {
11232 $params[
'confirm'][
'url'] = $url . (strpos($url,
'?') > 0 ?
'&' :
'?') .
'confirm=yes';
11236 $attr[
'data-confirm-url'] = $params[
'confirm'][
'url'];
11237 $attr[
'data-confirm-title'] = !empty($params[
'confirm'][
'title']) ? $params[
'confirm'][
'title'] : $langs->trans(
'ConfirmBtnCommonTitle', $label);
11238 $attr[
'data-confirm-content'] = !empty($params[
'confirm'][
'content']) ? $params[
'confirm'][
'content'] : $langs->trans(
'ConfirmBtnCommonContent', $label);
11239 $attr[
'data-confirm-content'] = preg_replace(
"/\r|\n/",
"", $attr[
'data-confirm-content']);
11240 $attr[
'data-confirm-action-btn-label'] = !empty($params[
'confirm'][
'action-btn-label']) ? $params[
'confirm'][
'action-btn-label'] : $langs->trans(
'Confirm');
11241 $attr[
'data-confirm-cancel-btn-label'] = !empty($params[
'confirm'][
'cancel-btn-label']) ? $params[
'confirm'][
'cancel-btn-label'] : $langs->trans(
'CloseDialog');
11242 $attr[
'data-confirm-modal'] = !empty($params[
'confirm'][
'modal']) ? $params[
'confirm'][
'modal'] :
true;
11244 $attr[
'class'].=
' butActionConfirm';
11247 if (isset($attr[
'href']) && empty($attr[
'href'])) {
11248 unset($attr[
'href']);
11252 $attr = array_map(
'dol_escape_htmltag', $attr);
11254 $TCompiledAttr = array();
11255 foreach ($attr as $key => $value) {
11256 $TCompiledAttr[] = $key.
'= "'.$value.
'"';
11259 $compiledAttributes = empty($TCompiledAttr) ?
'' : implode(
' ', $TCompiledAttr);
11261 $tag = !empty($attr[
'href']) ?
'a' :
'span';
11264 $parameters = array(
11265 'TCompiledAttr' => $TCompiledAttr,
11266 'compiledAttributes' => $compiledAttributes,
11271 'actionType' => $actionType,
11274 'userRight' => $userRight,
11275 'params' => $params
11278 $reshook = $hookmanager->executeHooks(
'dolGetButtonAction', $parameters, $object, $action);
11279 if ($reshook < 0)
setEventMessages($hookmanager->error, $hookmanager->errors,
'errors');
11281 if (empty($reshook)) {
11283 return '<' . $tag .
' ' . $compiledAttributes .
'>' . $text .
'</' . $tag .
'>';
11285 return '<' . $tag .
' ' . $compiledAttributes .
'>' .
dol_escape_htmltag($text) .
'</' . $tag .
'>';
11288 return $hookmanager->resPrint;
11300 return '<span class="button-title-separator '.$moreClass.
'" ></span>';
11312 if (!empty($fieldValidationErrorMsg)) {
11313 $out.=
'<span class="field-error-icon classfortooltip" title="'.dol_escape_htmltag($fieldValidationErrorMsg, 1).
'" role="alert" >';
11314 $out.=
'<span class="fa fa-exclamation-circle" aria-hidden="true" ></span>';
11333function dolGetButtonTitle($label, $helpText =
'', $iconClass =
'fa fa-file', $url =
'', $id =
'', $status = 1, $params = array())
11335 global $langs, $conf, $user;
11338 if (!empty($conf->global->MAIN_BUTTON_HIDE_UNAUTHORIZED) && (!$user->admin) && $status <= 0) {
11342 $class =
'btnTitle';
11343 if (in_array($iconClass, array(
'fa fa-plus-circle',
'fa fa-plus-circle size15x',
'fa fa-comment-dots',
'fa fa-paper-plane'))) {
11344 $class .=
' btnTitlePlus';
11346 $useclassfortooltip = 1;
11348 if (!empty($params[
'morecss'])) {
11349 $class .=
' '.$params[
'morecss'];
11354 'href' => empty($url) ?
'' : $url
11357 if (!empty($helpText)) {
11359 } elseif (empty($attr[
'title']) && $label) {
11360 $attr[
'title'] = $label;
11361 $useclassfortooltip = 0;
11364 if ($status == 2) {
11365 $attr[
'class'] .=
' btnTitleSelected';
11366 } elseif ($status <= 0) {
11367 $attr[
'class'] .=
' refused';
11369 $attr[
'href'] =
'';
11371 if ($status == -1) {
11372 $attr[
'title'] =
dol_escape_htmltag($langs->transnoentitiesnoconv(
"FeatureDisabled"));
11373 } elseif ($status == 0) {
11374 $attr[
'title'] =
dol_escape_htmltag($langs->transnoentitiesnoconv(
"NotEnoughPermissions"));
11378 if (!empty($attr[
'title']) && $useclassfortooltip) {
11379 $attr[
'class'] .=
' classfortooltip';
11387 if (!empty($params[
'attr']) && is_array($params[
'attr'])) {
11388 foreach ($params[
'attr'] as $key => $value) {
11389 if ($key ==
'class') {
11390 $attr[
'class'] .=
' '.$value;
11391 } elseif ($key ==
'classOverride') {
11392 $attr[
'class'] = $value;
11394 $attr[$key] = $value;
11399 if (isset($attr[
'href']) && empty($attr[
'href'])) {
11400 unset($attr[
'href']);
11406 $attr = array_map(
'dol_escape_htmltag', $attr);
11408 $TCompiledAttr = array();
11409 foreach ($attr as $key => $value) {
11410 $TCompiledAttr[] = $key.
'="'.$value.
'"';
11413 $compiledAttributes = (empty($TCompiledAttr) ?
'' : implode(
' ', $TCompiledAttr));
11415 $tag = (empty($attr[
'href']) ?
'span' :
'a');
11417 $button =
'<'.$tag.
' '.$compiledAttributes.
'>';
11418 $button .=
'<span class="'.$iconClass.
' valignmiddle btnTitle-icon"></span>';
11419 if (!empty($params[
'forcenohideoftext'])) {
11420 $button .=
'<span class="valignmiddle text-plus-circle btnTitle-label'.(empty($params[
'forcenohideoftext']) ?
' hideonsmartphone' :
'').
'">'.$label.
'</span>';
11422 $button .=
'</'.$tag.
'>';
11443 $classfile = $classname = $classpath = $subdir = $dir_output =
'';
11446 $module = $element_type;
11447 $element = $element_type;
11448 $subelement = $element_type;
11451 if (preg_match(
'/^([^@]+)@([^@]+)$/i', $element_type, $regs)) {
11452 $element = $subelement = $regs[1];
11453 $module = $regs[2];
11458 if (preg_match(
'/^([^_]+)_([^_]+)/i', $element, $regs)) {
11459 $module = $element = $regs[1];
11460 $subelement = $regs[2];
11464 if ($element_type ==
"action") {
11465 $classpath =
'comm/action/class';
11466 $subelement =
'Actioncomm';
11467 $module =
'agenda';
11468 } elseif ($element_type ==
'cronjob') {
11469 $classpath =
'cron/class';
11471 } elseif ($element_type ==
'adherent_type') {
11472 $classpath =
'adherents/class';
11473 $classfile =
'adherent_type';
11474 $module =
'adherent';
11475 $subelement =
'adherent_type';
11476 $classname =
'AdherentType';
11477 } elseif ($element_type ==
'bank_account') {
11478 $classpath =
'compta/bank/class';
11480 $classfile =
'account';
11481 $classname =
'Account';
11482 } elseif ($element_type ==
'category') {
11483 $classpath =
'categories/class';
11484 $module =
'categorie';
11485 $subelement =
'categorie';
11486 } elseif ($element_type ==
'contact') {
11487 $classpath =
'contact/class';
11488 $classfile =
'contact';
11489 $module =
'societe';
11490 $subelement =
'contact';
11491 } elseif ($element_type ==
'stock') {
11492 $classpath =
'product/stock/class';
11493 $classfile =
'entrepot';
11494 $classname =
'Entrepot';
11495 } elseif ($element_type ==
'project') {
11496 $classpath =
'projet/class';
11497 $module =
'projet';
11498 } elseif ($element_type ==
'project_task') {
11499 $classpath =
'projet/class';
11500 $module =
'projet';
11501 $subelement =
'task';
11502 } elseif ($element_type ==
'facture' || $element_type ==
'invoice') {
11503 $classpath =
'compta/facture/class';
11504 $module =
'facture';
11505 $subelement =
'facture';
11506 } elseif ($element_type ==
'commande' || $element_type ==
'order') {
11507 $classpath =
'commande/class';
11508 $module =
'commande';
11509 $subelement =
'commande';
11510 } elseif ($element_type ==
'propal') {
11511 $classpath =
'comm/propal/class';
11512 } elseif ($element_type ==
'shipping') {
11513 $classpath =
'expedition/class';
11514 $classfile =
'expedition';
11515 $classname =
'Expedition';
11516 $module =
'expedition';
11517 } elseif ($element_type ==
'supplier_proposal') {
11518 $classpath =
'supplier_proposal/class';
11519 $module =
'supplier_proposal';
11520 $element =
'supplierproposal';
11521 $classfile =
'supplier_proposal';
11522 $subelement =
'supplierproposal';
11523 } elseif ($element_type ==
'shipping') {
11524 $classpath =
'expedition/class';
11525 $subelement =
'expedition';
11526 $module =
'expedition_bon';
11527 } elseif ($element_type ==
'delivery') {
11528 $classpath =
'delivery/class';
11529 $subelement =
'delivery';
11530 $module =
'delivery_note';
11531 } elseif ($element_type ==
'contract') {
11532 $classpath =
'contrat/class';
11533 $module =
'contrat';
11534 $subelement =
'contrat';
11535 } elseif ($element_type ==
'mailing') {
11536 $classpath =
'comm/mailing/class';
11537 $module =
'mailing';
11538 $classfile =
'mailing';
11539 $classname =
'Mailing';
11541 } elseif ($element_type ==
'member') {
11542 $classpath =
'adherents/class';
11543 $module =
'adherent';
11544 $subelement =
'adherent';
11545 } elseif ($element_type ==
'usergroup') {
11546 $classpath =
'user/class';
11548 } elseif ($element_type ==
'mo') {
11549 $classpath =
'mrp/class';
11554 } elseif ($element_type ==
'cabinetmed_cons') {
11555 $classpath =
'cabinetmed/class';
11556 $module =
'cabinetmed';
11557 $subelement =
'cabinetmedcons';
11558 } elseif ($element_type ==
'fichinter') {
11559 $classpath =
'fichinter/class';
11560 $module =
'ficheinter';
11561 $subelement =
'fichinter';
11562 } elseif ($element_type ==
'dolresource' || $element_type ==
'resource') {
11563 $classpath =
'resource/class';
11564 $module =
'resource';
11565 $subelement =
'dolresource';
11566 } elseif ($element_type ==
'propaldet') {
11567 $classpath =
'comm/propal/class';
11568 $module =
'propal';
11569 $subelement =
'propaleligne';
11570 } elseif ($element_type ==
'opensurvey_sondage') {
11571 $classpath =
'opensurvey/class';
11572 $module =
'opensurvey';
11573 $subelement =
'opensurveysondage';
11574 } elseif ($element_type ==
'order_supplier') {
11575 $classpath =
'fourn/class';
11576 $module =
'fournisseur';
11577 $classfile =
'fournisseur.commande';
11578 $element =
'order_supplier';
11580 $classname =
'CommandeFournisseur';
11581 } elseif ($element_type ==
'invoice_supplier') {
11582 $classpath =
'fourn/class';
11583 $module =
'fournisseur';
11584 $classfile =
'fournisseur.facture';
11585 $element =
'invoice_supplier';
11587 $classname =
'FactureFournisseur';
11588 } elseif ($element_type ==
"service") {
11589 $classpath =
'product/class';
11590 $subelement =
'product';
11591 } elseif ($element_type ==
'salary') {
11592 $classpath =
'salaries/class';
11593 $module =
'salaries';
11594 } elseif ($element_type ==
'productlot') {
11595 $module =
'productbatch';
11596 $classpath =
'product/stock/class';
11597 $classfile =
'productlot';
11598 $classname =
'Productlot';
11599 $element =
'productlot';
11601 } elseif ($element_type ==
'websitepage') {
11602 $classpath =
'website/class';
11603 $classfile =
'websitepage';
11604 $classname =
'Websitepage';
11605 $module =
'website';
11606 $subelement =
'websitepage';
11607 } elseif ($element_type ==
'fiscalyear') {
11608 $classpath =
'core/class';
11609 $module =
'accounting';
11610 $subelement =
'fiscalyear';
11611 } elseif ($element_type ==
'chargesociales') {
11612 $classpath =
'compta/sociales/class';
11614 } elseif ($element_type ==
'tva') {
11615 $classpath =
'compta/tva/class';
11620 if (empty($classfile)) {
11621 $classfile = strtolower($subelement);
11623 if (empty($classname)) {
11624 $classname = ucfirst($subelement);
11626 if (empty($classpath)) {
11627 $classpath = $module.
'/class';
11633 if ($module && isset($conf->$module)) {
11634 if (!empty($conf->$module->multidir_output[$conf->entity])) {
11635 $dir_output = $conf->$module->multidir_output[$conf->entity];
11636 } elseif (!empty($conf->$module->output[$conf->entity])) {
11637 $dir_output = $conf->$module->output[$conf->entity];
11638 } elseif (!empty($conf->$module->dir_output)) {
11639 $dir_output = $conf->$module->dir_output;
11644 if ($element ==
'order_supplier') {
11645 $dir_output = $conf->fournisseur->commande->dir_output;
11646 } elseif ($element ==
'invoice_supplier') {
11647 $dir_output = $conf->fournisseur->facture->dir_output;
11649 $dir_output .= $subdir;
11651 $element_properties = array(
11652 'module' => $module,
11653 'element' => $element,
11654 'subelement' => $subelement,
11655 'classpath' => $classpath,
11656 'classfile' => $classfile,
11657 'classname' => $classname,
11658 'dir_output' => $dir_output
11660 return $element_properties;
11680 if (is_array($element_prop) && isModEnabled($element_prop[
'module'])) {
11681 dol_include_once(
'/'.$element_prop[
'classpath'].
'/'.$element_prop[
'classfile'].
'.class.php');
11683 if (class_exists($element_prop[
'classname'])) {
11684 $classname = $element_prop[
'classname'];
11685 $objecttmp =
new $classname($db);
11686 $ret = $objecttmp->fetch($element_id, $element_ref);
11688 if (empty($objecttmp->module)) {
11689 $objecttmp->module = $element_prop[
'module'];
11710 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)) {
11726 return empty($_SESSION[
'newtoken']) ?
'' : $_SESSION[
'newtoken'];
11738 return isset($_SESSION[
'token']) ? $_SESSION[
'token'] :
'';
11750 if (empty($conf->cache[
'nonce'])) {
11754 return $conf->cache[
'nonce'];
11774 print
'<div class="div-table-responsive-no-min">';
11775 print
'<table class="noborder centpercent">';
11776 print
'<tr class="liste_titre">';
11778 print $emptyRows < 1 ?
'<th>' :
'<th colspan="'.($emptyRows + 1).
'">';
11780 print $langs->trans($header);
11783 if ($number > -1) {
11787 if (!empty($link)) {
11788 if (!empty($arguments)) {
11789 print
'<a href="'.DOL_URL_ROOT.
'/'.$link.
'?'.$arguments.
'">';
11791 print
'<a href="'.DOL_URL_ROOT.
'/'.$link.
'">';
11795 if ($number > -1) {
11796 print
'<span class="badge">'.$number.
'</span>';
11799 if (!empty($link)) {
11805 if ($number < 0 && !empty($link)) {
11806 print
'<th class="right">';
11808 if (!empty($arguments)) {
11809 print
'<a class="commonlink" href="'.DOL_URL_ROOT.
'/'.$link.
'?'.$arguments.
'">';
11811 print
'<a class="commonlink" href="'.DOL_URL_ROOT.
'/'.$link.
'">';
11814 print $langs->trans(
"FullList");
11835 if ($addLineBreak) {
11851function addSummaryTableLine($tableColumnCount, $num, $nbofloop = 0, $total = 0, $noneWord =
"None", $extraRightColumn =
false)
11856 print
'<tr class="oddeven">';
11857 print
'<td colspan="'.$tableColumnCount.
'" class="opacitymedium">'.$langs->trans($noneWord).
'</td>';
11862 if ($nbofloop === 0) {
11868 $colspan = $tableColumnCount;
11869 } elseif ($num > $nbofloop) {
11870 $colspan = $tableColumnCount;
11872 $colspan = $tableColumnCount - 1;
11875 if ($extraRightColumn) {
11879 print
'<tr class="liste_total">';
11881 if ($nbofloop > 0 && $num > $nbofloop) {
11882 print
'<td colspan="'.$colspan.
'" class="right">'.$langs->trans(
"XMoreLines", ($num - $nbofloop)).
'</td>';
11884 print
'<td colspan="'.$colspan.
'" class="right"> '.$langs->trans(
"Total").
'</td>';
11885 print
'<td class="right" width="100">'.price($total).
'</td>';
11888 if ($extraRightColumn) {
11907 if ($method == -1) {
11909 if (!empty($conf->global->MAIN_FORCE_READFILE_WITH_FREAD)) {
11912 if (!empty($conf->global->MAIN_FORCE_READFILE_WITH_STREAM_COPY)) {
11918 while (ob_get_level()) {
11923 if ($method == 0) {
11924 readfile($fullpath_original_file_osencoded);
11925 } elseif ($method == 1) {
11927 $handle = fopen($fullpath_original_file_osencoded,
"rb");
11928 while (!feof($handle)) {
11929 print fread($handle, 8192);
11932 } elseif ($method == 2) {
11934 $handle1 = fopen($fullpath_original_file_osencoded,
"rb");
11935 $handle2 = fopen(
"php://output",
"wb");
11936 stream_copy_to_stream($handle1, $handle2);
11961 if ($texttoshow ===
'none') {
11962 $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>';
11963 } elseif ($texttoshow) {
11964 $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>';
11966 $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>';
11981 $result = json_decode($stringtodecode);
11982 if ($result ===
null) {
11983 $result = unserialize($stringtodecode);
12005 if (!preg_match(
'/^\(.*\)$/', $filter)) {
12006 $filter =
'(' . $filter .
')';
12009 $regexstring =
'\(([a-zA-Z0-9_\.]+:[<>!=insotlke]+:[^\(\)]+)\)';
12015 return 'Filter syntax error - '.$errorstr;
12020 $t = preg_replace_callback(
'/'.$regexstring.
'/i',
'dolForgeDummyCriteriaCallback', $filter);
12021 $t = str_replace(array(
'and',
'or',
'AND',
'OR',
' '),
'', $t);
12023 if (preg_match(
'/[^\(\)]/', $t)) {
12024 $errorstr =
'Bad syntax of the search string';
12028 return 'Filter syntax error - '.$errorstr;
12032 return ($noand ?
"" :
" AND ").($nopar ?
"" :
'(').preg_replace_callback(
'/'.$regexstring.
'/i',
'dolForgeCriteriaCallback', $filter).($nopar ?
"" :
')');
12046 $tmp = $sqlfilters;
12047 $i = 0; $nb = strlen($tmp);
12050 if ($tmp[$i] ==
'(') {
12053 if ($tmp[$i] ==
')') {
12056 if ($counter < 0) {
12057 $error =
"Wrond balance of parenthesis in sqlfilters=".$sqlfilters;
12076 if (empty($matches[1])) {
12079 $tmp = explode(
':', $matches[1]);
12080 if (count($tmp) < 3) {
12100 if (empty($matches[1])) {
12103 $tmp = explode(
':', $matches[1]);
12104 if (count($tmp) < 3) {
12108 $operand = preg_replace(
'/[^a-z0-9\._]/i',
'', trim($tmp[0]));
12110 $operator = strtoupper(preg_replace(
'/[^a-z<>!=]/i',
'', trim($tmp[1])));
12112 if ($operator ==
'NOTLIKE') {
12113 $operator =
'NOT LIKE';
12115 if ($operator ==
'ISNOT') {
12116 $operator =
'IS NOT';
12118 if ($operator ==
'!=') {
12122 $tmpescaped = $tmp[2];
12125 if ($operator ==
'IN') {
12127 $tmpescaped =
'('.$db->escape($db->sanitize($tmpescaped, 1, 0)).
')';
12131 } elseif ($operator ==
'LIKE' || $operator ==
'NOT LIKE') {
12132 if (preg_match(
'/^\'(.*)\'$/', $tmpescaped, $regbis)) {
12133 $tmpescaped = $regbis[1];
12136 $tmpescaped =
"'".$db->escape($tmpescaped).
"'";
12137 } elseif (preg_match(
'/^\'(.*)\'$/', $tmpescaped, $regbis)) {
12138 $tmpescaped =
"'".$db->escape($regbis[1]).
"'";
12140 if (strtoupper($tmpescaped) ==
'NULL') {
12141 $tmpescaped =
'NULL';
12142 } elseif (is_int($tmpescaped)) {
12143 $tmpescaped = (int) $tmpescaped;
12145 $tmpescaped = (float) $tmpescaped;
12149 return '('.$db->escape($operand).
' '.strtoupper($operator).
' '.$tmpescaped.
')';
12163 global $conf, $langs;
12164 $out =
'<!-- timeline icon -->'.
"\n";
12165 $iconClass =
'fa fa-comments';
12170 if ($histo[$key][
'percent'] == -1) {
12171 $colorClass =
'timeline-icon-not-applicble';
12172 $pictoTitle = $langs->trans(
'StatusNotApplicable');
12173 } elseif ($histo[$key][
'percent'] == 0) {
12174 $colorClass =
'timeline-icon-todo';
12175 $pictoTitle = $langs->trans(
'StatusActionToDo').
' (0%)';
12176 } elseif ($histo[$key][
'percent'] > 0 && $histo[$key][
'percent'] < 100) {
12177 $colorClass =
'timeline-icon-in-progress';
12178 $pictoTitle = $langs->trans(
'StatusActionInProcess').
' ('.$histo[$key][
'percent'].
'%)';
12179 } elseif ($histo[$key][
'percent'] >= 100) {
12180 $colorClass =
'timeline-icon-done';
12181 $pictoTitle = $langs->trans(
'StatusActionDone').
' (100%)';
12184 if ($actionstatic->code ==
'AC_TICKET_CREATE') {
12185 $iconClass =
'fa fa-ticket';
12186 } elseif ($actionstatic->code ==
'AC_TICKET_MODIFY') {
12187 $iconClass =
'fa fa-pencilxxx';
12188 } elseif (preg_match(
'/^TICKET_MSG/', $actionstatic->code)) {
12189 $iconClass =
'fa fa-comments';
12190 } elseif (preg_match(
'/^TICKET_MSG_PRIVATE/', $actionstatic->code)) {
12191 $iconClass =
'fa fa-mask';
12192 } elseif (!empty($conf->global->AGENDA_USE_EVENT_TYPE)) {
12193 if ($actionstatic->type_picto) {
12194 $img_picto =
img_picto(
'', $actionstatic->type_picto);
12196 if ($actionstatic->type_code ==
'AC_RDV') {
12197 $iconClass =
'fa fa-handshake';
12198 } elseif ($actionstatic->type_code ==
'AC_TEL') {
12199 $iconClass =
'fa fa-phone';
12200 } elseif ($actionstatic->type_code ==
'AC_FAX') {
12201 $iconClass =
'fa fa-fax';
12202 } elseif ($actionstatic->type_code ==
'AC_EMAIL') {
12203 $iconClass =
'fa fa-envelope';
12204 } elseif ($actionstatic->type_code ==
'AC_INT') {
12205 $iconClass =
'fa fa-shipping-fast';
12206 } elseif ($actionstatic->type_code ==
'AC_OTH_AUTO') {
12207 $iconClass =
'fa fa-robot';
12208 } elseif (!preg_match(
'/_AUTO/', $actionstatic->type_code)) {
12209 $iconClass =
'fa fa-robot';
12214 $out .=
'<i class="'.$iconClass.
' '.$colorClass.
'" title="'.$pictoTitle.
'">'.$img_picto.
'</i>'.
"\n";
12228 $documents = array();
12230 $sql =
'SELECT ecm.rowid as id, ecm.src_object_type, ecm.src_object_id, ecm.filepath, ecm.filename';
12231 $sql .=
' FROM '.MAIN_DB_PREFIX.
'ecm_files ecm';
12232 $sql .=
" WHERE ecm.filepath = 'agenda/".((int) $object->id).
"'";
12234 $sql .=
' ORDER BY ecm.position ASC';
12236 $resql = $db->query($sql);
12238 if ($db->num_rows($resql)) {
12239 while ($obj = $db->fetch_object($resql)) {
12240 $documents[$obj->id] = $obj;
12267function show_actions_messaging($conf, $langs, $db, $filterobj, $objcon =
'', $noprint = 0, $actioncode =
'', $donetodo =
'done', $filters = array(), $sortfield =
'a.datep,a.id', $sortorder =
'DESC')
12269 global $user, $conf;
12272 global $param, $massactionbutton;
12277 if (!is_object($filterobj) && !is_object($objcon)) {
12285 $sortfield_list = explode(
',', $sortfield);
12286 $sortfield_label_list = array(
'a.id' =>
'id',
'a.datep' =>
'dp',
'a.percent' =>
'percent');
12287 $sortfield_new_list = array();
12288 foreach ($sortfield_list as $sortfield_value) {
12289 $sortfield_new_list[] = $sortfield_label_list[trim($sortfield_value)];
12291 $sortfield_new = implode(
',', $sortfield_new_list);
12293 if (isModEnabled(
'agenda')) {
12295 if (is_object($objcon) && $objcon->id > 0) {
12296 $sql =
"SELECT DISTINCT a.id, a.label as label,";
12298 $sql =
"SELECT a.id, a.label as label,";
12300 $sql .=
" a.datep as dp,";
12301 $sql .=
" a.note as message,";
12302 $sql .=
" a.datep2 as dp2,";
12303 $sql .=
" a.percent as percent, 'action' as type,";
12304 $sql .=
" a.fk_element, a.elementtype,";
12305 $sql .=
" a.fk_contact,";
12306 $sql .=
" a.email_from as msg_from,";
12307 $sql .=
" c.code as acode, c.libelle as alabel, c.picto as apicto,";
12308 $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";
12309 if (is_object($filterobj) && get_class($filterobj) ==
'Societe') {
12310 $sql .=
", sp.lastname, sp.firstname";
12311 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
12312 $sql .=
", m.lastname, m.firstname";
12313 } elseif (is_object($filterobj) && get_class($filterobj) ==
'CommandeFournisseur') {
12315 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Product') {
12317 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
12319 } elseif (is_object($filterobj) && get_class($filterobj) ==
'BOM') {
12321 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Contrat') {
12324 $sql .=
" FROM ".MAIN_DB_PREFIX.
"actioncomm as a";
12325 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"user as u on u.rowid = a.fk_user_action";
12326 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"c_actioncomm as c ON a.fk_action = c.id";
12328 $force_filter_contact =
false;
12329 if (is_object($objcon) && $objcon->id > 0) {
12330 $force_filter_contact =
true;
12331 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"actioncomm_resources as r ON a.id = r.fk_actioncomm";
12332 $sql .=
" AND r.element_type = '".$db->escape($objcon->table_element).
"' AND r.fk_element = ".((int) $objcon->id);
12335 if (is_object($filterobj) && get_class($filterobj) ==
'Societe') {
12336 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"socpeople as sp ON a.fk_contact = sp.rowid";
12337 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Dolresource') {
12338 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"element_resources as er";
12339 $sql .=
" ON er.resource_type = 'dolresource'";
12340 $sql .=
" AND er.element_id = a.id";
12341 $sql .=
" AND er.resource_id = ".((int) $filterobj->id);
12342 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
12343 $sql .=
", ".MAIN_DB_PREFIX.
"adherent as m";
12344 } elseif (is_object($filterobj) && get_class($filterobj) ==
'CommandeFournisseur') {
12345 $sql .=
", ".MAIN_DB_PREFIX.
"commande_fournisseur as o";
12346 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Product') {
12347 $sql .=
", ".MAIN_DB_PREFIX.
"product as o";
12348 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
12349 $sql .=
", ".MAIN_DB_PREFIX.
"ticket as o";
12350 } elseif (is_object($filterobj) && get_class($filterobj) ==
'BOM') {
12351 $sql .=
", ".MAIN_DB_PREFIX.
"bom_bom as o";
12352 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Contrat') {
12353 $sql .=
", ".MAIN_DB_PREFIX.
"contrat as o";
12356 $sql .=
" WHERE a.entity IN (".getEntity(
'agenda').
")";
12357 if ($force_filter_contact ===
false) {
12358 if (is_object($filterobj) && in_array(get_class($filterobj), array(
'Societe',
'Client',
'Fournisseur')) && $filterobj->id) {
12359 $sql .=
" AND a.fk_soc = ".((int) $filterobj->id);
12360 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Project' && $filterobj->id) {
12361 $sql .=
" AND a.fk_project = ".((int) $filterobj->id);
12362 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
12363 $sql .=
" AND a.fk_element = m.rowid AND a.elementtype = 'member'";
12364 if ($filterobj->id) {
12365 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
12367 } elseif (is_object($filterobj) && get_class($filterobj) ==
'CommandeFournisseur') {
12368 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'order_supplier'";
12369 if ($filterobj->id) {
12370 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
12372 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Product') {
12373 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'product'";
12374 if ($filterobj->id) {
12375 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
12377 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
12378 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'ticket'";
12379 if ($filterobj->id) {
12380 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
12382 } elseif (is_object($filterobj) && get_class($filterobj) ==
'BOM') {
12383 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'bom'";
12384 if ($filterobj->id) {
12385 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
12387 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Contrat') {
12388 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'contract'";
12389 if ($filterobj->id) {
12390 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
12396 if (!empty($actioncode)) {
12397 if (empty($conf->global->AGENDA_USE_EVENT_TYPE)) {
12398 if ($actioncode ==
'AC_NON_AUTO') {
12399 $sql .=
" AND c.type != 'systemauto'";
12400 } elseif ($actioncode ==
'AC_ALL_AUTO') {
12401 $sql .=
" AND c.type = 'systemauto'";
12403 if ($actioncode ==
'AC_OTH') {
12404 $sql .=
" AND c.type != 'systemauto'";
12405 } elseif ($actioncode ==
'AC_OTH_AUTO') {
12406 $sql .=
" AND c.type = 'systemauto'";
12410 if ($actioncode ==
'AC_NON_AUTO') {
12411 $sql .=
" AND c.type != 'systemauto'";
12412 } elseif ($actioncode ==
'AC_ALL_AUTO') {
12413 $sql .=
" AND c.type = 'systemauto'";
12415 $sql .=
" AND c.code = '".$db->escape($actioncode).
"'";
12419 if ($donetodo ==
'todo') {
12420 $sql .=
" AND ((a.percent >= 0 AND a.percent < 100) OR (a.percent = -1 AND a.datep > '".$db->idate($now).
"'))";
12421 } elseif ($donetodo ==
'done') {
12422 $sql .=
" AND (a.percent = 100 OR (a.percent = -1 AND a.datep <= '".$db->idate($now).
"'))";
12424 if (is_array($filters) && $filters[
'search_agenda_label']) {
12425 $sql .=
natural_search(
'a.label', $filters[
'search_agenda_label']);
12430 if (isModEnabled(
'mailing') && !empty($objcon->email)
12431 && (empty($actioncode) || $actioncode ==
'AC_OTH_AUTO' || $actioncode ==
'AC_EMAILING')) {
12432 $langs->load(
"mails");
12434 $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";
12435 $sql2 .=
", null as fk_element, '' as elementtype, null as contact_id";
12436 $sql2 .=
", 'AC_EMAILING' as acode, '' as alabel, '' as apicto";
12437 $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";
12438 if (is_object($filterobj) && get_class($filterobj) ==
'Societe') {
12439 $sql2 .=
", '' as lastname, '' as firstname";
12440 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
12441 $sql2 .=
", '' as lastname, '' as firstname";
12442 } elseif (is_object($filterobj) && get_class($filterobj) ==
'CommandeFournisseur') {
12443 $sql2 .=
", '' as ref";
12444 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Product') {
12445 $sql2 .=
", '' as ref";
12446 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
12447 $sql2 .=
", '' as ref";
12449 $sql2 .=
" FROM ".MAIN_DB_PREFIX.
"mailing as m, ".MAIN_DB_PREFIX.
"mailing_cibles as mc, ".MAIN_DB_PREFIX.
"user as u";
12450 $sql2 .=
" WHERE mc.email = '".$db->escape($objcon->email).
"'";
12451 $sql2 .=
" AND mc.statut = 1";
12452 $sql2 .=
" AND u.rowid = m.fk_user_valid";
12453 $sql2 .=
" AND mc.fk_mailing=m.rowid";
12456 if (!empty($sql) && !empty($sql2)) {
12457 $sql = $sql.
" UNION ".$sql2;
12458 } elseif (empty($sql) && !empty($sql2)) {
12464 $sql .= $db->order($sortfield_new, $sortorder);
12466 dol_syslog(
"function.lib::show_actions_messaging", LOG_DEBUG);
12467 $resql = $db->query($sql);
12470 $num = $db->num_rows($resql);
12472 while ($i < $num) {
12473 $obj = $db->fetch_object($resql);
12475 if ($obj->type ==
'action') {
12477 $contactaction->id = $obj->id;
12478 $result = $contactaction->fetchResources();
12481 setEventMessage(
"actions.lib::show_actions_messaging Error fetch ressource",
'errors');
12487 if (($obj->percent >= 0 and $obj->percent < 100) || ($obj->percent == -1 && $obj->dp > $now)) {
12488 $tododone =
'todo';
12491 $histo[$numaction] = array(
12492 'type'=>$obj->type,
12493 'tododone'=>$tododone,
12495 'datestart'=>$db->jdate($obj->dp),
12496 'dateend'=>$db->jdate($obj->dp2),
12497 'note'=>$obj->label,
12498 'message'=>$obj->message,
12499 'percent'=>$obj->percent,
12501 'userid'=>$obj->user_id,
12502 'login'=>$obj->user_login,
12503 'userfirstname'=>$obj->user_firstname,
12504 'userlastname'=>$obj->user_lastname,
12505 'userphoto'=>$obj->user_photo,
12506 'msg_from'=>$obj->msg_from,
12508 'contact_id'=>$obj->fk_contact,
12509 'socpeopleassigned' => $contactaction->socpeopleassigned,
12510 'lastname' => (empty($obj->lastname) ?
'' : $obj->lastname),
12511 'firstname' => (empty($obj->firstname) ?
'' : $obj->firstname),
12512 'fk_element'=>$obj->fk_element,
12513 'elementtype'=>$obj->elementtype,
12515 'acode'=>$obj->acode,
12516 'alabel'=>$obj->alabel,
12517 'libelle'=>$obj->alabel,
12518 'apicto'=>$obj->apicto
12521 $histo[$numaction] = array(
12522 'type'=>$obj->type,
12523 'tododone'=>
'done',
12525 'datestart'=>$db->jdate($obj->dp),
12526 'dateend'=>$db->jdate($obj->dp2),
12527 'note'=>$obj->label,
12528 'message'=>$obj->message,
12529 'percent'=>$obj->percent,
12530 'acode'=>$obj->acode,
12532 'userid'=>$obj->user_id,
12533 'login'=>$obj->user_login,
12534 'userfirstname'=>$obj->user_firstname,
12535 'userlastname'=>$obj->user_lastname,
12536 'userphoto'=>$obj->user_photo
12551 if (!isModEnabled(
'agenda')) {
12552 $langs->loadLangs(array(
"admin",
"errors"));
12553 $out =
info_admin($langs->trans(
"WarningModuleXDisabledSoYouMayMissEventHere", $langs->transnoentitiesnoconv(
"Module2400Name")), 0, 0,
'warning');
12556 if (isModEnabled(
'agenda') || (isModEnabled(
'mailing') && !empty($objcon->email))) {
12557 $delay_warning = $conf->global->MAIN_DELAY_ACTIONS_TODO * 24 * 60 * 60;
12559 require_once DOL_DOCUMENT_ROOT.
'/comm/action/class/actioncomm.class.php';
12560 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
12561 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
12562 require_once DOL_DOCUMENT_ROOT.
'/contact/class/contact.class.php';
12567 $userstatic =
new User($db);
12568 $contactstatic =
new Contact($db);
12569 $userGetNomUrlCache = array();
12570 $contactGetNomUrlCache = array();
12572 $out .=
'<div class="filters-container" >';
12573 $out .=
'<form name="listactionsfilter" class="listactionsfilter" action="'.$_SERVER[
"PHP_SELF"].
'" method="POST">';
12574 $out .=
'<input type="hidden" name="token" value="'.newToken().
'">';
12576 if ($objcon && get_class($objcon) ==
'Contact' &&
12577 (is_null($filterobj) || get_class($filterobj) ==
'Societe')) {
12578 $out .=
'<input type="hidden" name="id" value="'.$objcon->id.
'" />';
12580 $out .=
'<input type="hidden" name="id" value="'.$filterobj->id.
'" />';
12582 if ($filterobj && get_class($filterobj) ==
'Societe') {
12583 $out .=
'<input type="hidden" name="socid" value="'.$filterobj->id.
'" />';
12588 $out .=
'<div class="div-table-responsive-no-min">';
12589 $out .=
'<table class="noborder borderbottom centpercent">';
12591 $out .=
'<tr class="liste_titre">';
12595 $out .=
'<th class="liste_titre width50 middle">';
12596 $searchpicto = $form->showFilterAndCheckAddButtons($massactionbutton ? 1 : 0,
'checkforselect', 1);
12597 $out .= $searchpicto;
12601 $out .=
getTitleFieldOfList(
'Date', 0, $_SERVER[
"PHP_SELF"],
'a.datep',
'', $param,
'', $sortfield, $sortorder,
'').
"\n";
12603 $out .=
'<th class="liste_titre"><strong class="hideonsmartphone">'.$langs->trans(
"Search").
' : </strong></th>';
12605 $out .=
'<th class="liste_titre"></th>';
12607 $out .=
'<th class="liste_titre">';
12608 $out .=
'<span class="fas fa-square inline-block fawidth30" style=" color: #ddd;" title="'.$langs->trans(
"ActionType").
'"></span>';
12610 $out .=
$formactions->select_type_actions($actioncode,
"actioncode",
'', empty($conf->global->AGENDA_USE_EVENT_TYPE) ? 1 : -1, 0, 0, 1,
'minwidth200imp');
12612 $out .=
'<th class="liste_titre maxwidth100onsmartphone">';
12613 $out .=
'<input type="text" class="maxwidth100onsmartphone" name="search_agenda_label" value="'.$filters[
'search_agenda_label'].
'" placeholder="'.$langs->trans(
"Label").
'">';
12618 $out .=
'<th class="liste_titre width50 middle">';
12619 $searchpicto = $form->showFilterAndCheckAddButtons($massactionbutton ? 1 : 0,
'checkforselect', 1);
12620 $out .= $searchpicto;
12627 $out .=
'</table>';
12634 $out .=
'<ul class="timeline">';
12638 if (get_class($filterobj) ==
'Societe') {
12639 $tmp .=
'<a href="'.DOL_URL_ROOT.
'/comm/action/list.php?mode=show_list&socid='.$filterobj->id.
'&status=done">';
12641 $tmp .= ($donetodo !=
'done' ? $langs->trans(
"ActionsToDoShort") :
'');
12642 $tmp .= ($donetodo !=
'done' && $donetodo !=
'todo' ?
' / ' :
'');
12643 $tmp .= ($donetodo !=
'todo' ? $langs->trans(
"ActionsDoneShort") :
'');
12645 if (get_class($filterobj) ==
'Societe') {
12656 $actualCycleDate =
false;
12659 foreach ($histo as $key => $value) {
12660 $actionstatic->fetch($histo[$key][
'id']);
12662 $actionstatic->type_picto = $histo[$key][
'apicto'];
12663 $actionstatic->type_code = $histo[$key][
'acode'];
12665 $url = DOL_URL_ROOT.
'/comm/action/card.php?id='.$histo[$key][
'id'];
12667 $tmpa =
dol_getdate($histo[$key][
'datestart'],
false);
12668 if ($actualCycleDate !== $tmpa[
'year'].
'-'.$tmpa[
'yday']) {
12669 $actualCycleDate = $tmpa[
'year'].
'-'.$tmpa[
'yday'];
12670 $out .=
'<!-- timeline time label -->';
12671 $out .=
'<li class="time-label">';
12672 $out .=
'<span class="timeline-badge-date">';
12673 $out .=
dol_print_date($histo[$key][
'datestart'],
'daytext',
'tzuserrel', $langs);
12676 $out .=
'<!-- /.timeline-label -->';
12680 $out .=
'<!-- timeline item -->'.
"\n";
12681 $out .=
'<li class="timeline-code-'.strtolower($actionstatic->code).
'">';
12685 $out .=
'<div class="timeline-item">'.
"\n";
12687 $out .=
'<span class="timeline-header-action">';
12689 if (isset($histo[$key][
'type']) && $histo[$key][
'type'] ==
'mailing') {
12690 $out .=
'<a class="timeline-btn" href="'.DOL_URL_ROOT.
'/comm/mailing/card.php?id='.$histo[$key][
'id'].
'">'.
img_object($langs->trans(
"ShowEMailing"),
"email").
' ';
12691 $out .= $histo[$key][
'id'];
12694 $out .= $actionstatic->getNomUrl(1, -1,
'valignmiddle').
' ';
12697 if ($user->hasRight(
'agenda',
'allactions',
'create') ||
12698 (($actionstatic->authorid == $user->id || $actionstatic->userownerid == $user->id) && $user->hasRight(
'agenda',
'myactions',
'create'))) {
12699 $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>';
12704 $out .=
'<span class="time"><i class="fa fa-clock-o valignmiddle"></i> <span class="valignmiddle">';
12705 $out .=
dol_print_date($histo[$key][
'datestart'],
'dayhour',
'tzuserrel');
12706 if ($histo[$key][
'dateend'] && $histo[$key][
'dateend'] != $histo[$key][
'datestart']) {
12707 $tmpa =
dol_getdate($histo[$key][
'datestart'],
true);
12708 $tmpb =
dol_getdate($histo[$key][
'dateend'],
true);
12709 if ($tmpa[
'mday'] == $tmpb[
'mday'] && $tmpa[
'mon'] == $tmpb[
'mon'] && $tmpa[
'year'] == $tmpb[
'year']) {
12710 $out .=
'-'.dol_print_date($histo[$key][
'dateend'],
'hour',
'tzuserrel');
12712 $out .=
'-'.dol_print_date($histo[$key][
'dateend'],
'dayhour',
'tzuserrel');
12716 if ($histo[$key][
'percent'] == 0 && $histo[$key][
'datestart'] && $histo[$key][
'datestart'] < ($now - $delay_warning)) {
12719 if ($histo[$key][
'percent'] == 0 && !$histo[$key][
'datestart'] && $histo[$key][
'dateend'] && $histo[$key][
'datestart'] < ($now - $delay_warning)) {
12722 if ($histo[$key][
'percent'] > 0 && $histo[$key][
'percent'] < 100 && $histo[$key][
'dateend'] && $histo[$key][
'dateend'] < ($now - $delay_warning)) {
12725 if ($histo[$key][
'percent'] > 0 && $histo[$key][
'percent'] < 100 && !$histo[$key][
'dateend'] && $histo[$key][
'datestart'] && $histo[$key][
'datestart'] < ($now - $delay_warning)) {
12731 $out .=
"</span></span>\n";
12734 $out .=
'<h3 class="timeline-header">';
12737 $out .=
'<div class="messaging-author inline-block tdoverflowmax150 valignmiddle marginrightonly">';
12738 if ($histo[$key][
'userid'] > 0) {
12739 if (!isset($userGetNomUrlCache[$histo[$key][
'userid']])) {
12740 $userstatic->fetch($histo[$key][
'userid']);
12741 $userGetNomUrlCache[$histo[$key][
'userid']] = $userstatic->getNomUrl(-1,
'', 0, 0, 16, 0,
'firstelselast',
'');
12743 $out .= $userGetNomUrlCache[$histo[$key][
'userid']];
12744 } elseif (!empty($histo[$key][
'msg_from']) && $actionstatic->code ==
'TICKET_MSG') {
12745 if (!isset($contactGetNomUrlCache[$histo[$key][
'msg_from']])) {
12746 if ($contactstatic->fetch(0,
null,
'', $histo[$key][
'msg_from']) > 0) {
12747 $contactGetNomUrlCache[$histo[$key][
'msg_from']] = $contactstatic->getNomUrl(-1,
'', 16);
12749 $contactGetNomUrlCache[$histo[$key][
'msg_from']] = $histo[$key][
'msg_from'];
12752 $out .= $contactGetNomUrlCache[$histo[$key][
'msg_from']];
12758 $out .=
' <div class="messaging-title inline-block">';
12760 if (preg_match(
'/^TICKET_MSG/', $actionstatic->code)) {
12761 $out .= $langs->trans(
'TicketNewMessage');
12762 } elseif (preg_match(
'/^TICKET_MSG_PRIVATE/', $actionstatic->code)) {
12763 $out .= $langs->trans(
'TicketNewMessage').
' <em>('.$langs->trans(
'Private').
')</em>';
12764 } elseif (isset($histo[$key][
'type'])) {
12765 if ($histo[$key][
'type'] ==
'action') {
12766 $transcode = $langs->transnoentitiesnoconv(
"Action".$histo[$key][
'acode']);
12767 $libelle = ($transcode !=
"Action".$histo[$key][
'acode'] ? $transcode : $histo[$key][
'alabel']);
12768 $libelle = $histo[$key][
'note'];
12769 $actionstatic->id = $histo[$key][
'id'];
12771 } elseif ($histo[$key][
'type'] ==
'mailing') {
12772 $out .=
'<a href="'.DOL_URL_ROOT.
'/comm/mailing/card.php?id='.$histo[$key][
'id'].
'">'.
img_object($langs->trans(
"ShowEMailing"),
"email").
' ';
12773 $transcode = $langs->transnoentitiesnoconv(
"Action".$histo[$key][
'acode']);
12774 $libelle = ($transcode !=
"Action".$histo[$key][
'acode'] ? $transcode :
'Send mass mailing');
12777 $libelle .= $histo[$key][
'note'];
12786 if (!empty($histo[$key][
'message'] && $histo[$key][
'message'] != $libelle)
12787 && $actionstatic->code !=
'AC_TICKET_CREATE'
12788 && $actionstatic->code !=
'AC_TICKET_MODIFY'
12790 $out .=
'<div class="timeline-body">';
12791 $out .= $histo[$key][
'message'];
12799 if (isset($histo[$key][
'socpeopleassigned']) && is_array($histo[$key][
'socpeopleassigned']) && count($histo[$key][
'socpeopleassigned']) > 0) {
12801 foreach ($histo[$key][
'socpeopleassigned'] as $cid => $Tab) {
12803 $result = $contact->fetch($cid);
12810 $contactList .= !empty($contactList) ?
', ' :
'';
12811 $contactList .= $contact->getNomUrl(1);
12812 if (isset($histo[$key][
'acode']) && $histo[$key][
'acode'] ==
'AC_TEL') {
12813 if (!empty($contact->phone_pro)) {
12814 $contactList .=
'('.dol_print_phone($contact->phone_pro).
')';
12820 $footer .= $langs->trans(
'ActionOnContact').
' : '.$contactList;
12821 } elseif (empty($objcon->id) && isset($histo[$key][
'contact_id']) && $histo[$key][
'contact_id'] > 0) {
12823 $result = $contact->fetch($histo[$key][
'contact_id']);
12830 $footer .= $contact->getNomUrl(1);
12831 if (isset($histo[$key][
'acode']) && $histo[$key][
'acode'] ==
'AC_TEL') {
12832 if (!empty($contact->phone_pro)) {
12833 $footer .=
'('.dol_print_phone($contact->phone_pro).
')';
12840 if (!empty($documents)) {
12841 $footer .=
'<div class="timeline-documents-container">';
12842 foreach ($documents as $doc) {
12843 $footer .=
'<span id="document_'.$doc->id.
'" class="timeline-documents" ';
12844 $footer .=
' data-id="'.$doc->id.
'" ';
12845 $footer .=
' data-path="'.$doc->filepath.
'"';
12846 $footer .=
' data-filename="'.dol_escape_htmltag($doc->filename).
'" ';
12849 $filePath = DOL_DATA_ROOT.
'/'.$doc->filepath.
'/'.$doc->filename;
12851 $file = $actionstatic->id.
'/'.$doc->filename;
12852 $thumb = $actionstatic->id.
'/thumbs/'.substr($doc->filename, 0, strrpos($doc->filename,
'.')).
'_mini'.substr($doc->filename, strrpos($doc->filename,
'.'));
12853 $doclink =
dol_buildpath(
'document.php', 1).
'?modulepart=actions&attachment=0&file='.urlencode($file).
'&entity='.$conf->entity;
12854 $viewlink =
dol_buildpath(
'viewimage.php', 1).
'?modulepart=actions&file='.urlencode($thumb).
'&entity='.$conf->entity;
12856 $mimeAttr =
' mime="'.$mime.
'" ';
12858 if (in_array($mime, array(
'image/png',
'image/jpeg',
'application/pdf'))) {
12859 $class .=
' documentpreview';
12862 $footer .=
'<a href="'.$doclink.
'" class="btn-link '.$class.
'" target="_blank" rel="noopener noreferrer" '.$mimeAttr.
' >';
12863 $footer .=
img_mime($filePath).
' '.$doc->filename;
12866 $footer .=
'</span>';
12868 $footer .=
'</div>';
12871 if (!empty($footer)) {
12872 $out .=
'<div class="timeline-footer">'.$footer.
'</div>';
12875 $out .=
'</div>'.
"\n";
12878 $out .=
'<!-- END timeline item -->';
12885 if (empty($histo)) {
12886 $out .=
'<span class="opacitymedium">'.$langs->trans(
"NoRecordFound").
'</span>';
12909 if ($hourTime ===
'getpost') {
12913 } elseif (preg_match(
'/^(\d\d):(\d\d):(\d\d)$/', $hourTime, $m)) {
12914 $hour = intval($m[1]);
12915 $minute = intval($m[2]);
12916 $second = intval($m[3]);
12918 $hour = $minute = $second = 0;
12921 $hour = min($hour, 23);
12922 $minute = min($minute, 59);
12923 $second = min($second, 59);
12940 if ($timestamp ===
null) $timestamp =
GETPOSTDATE($prefix, $hourTime, $gm);
12946 if ($hourTime ===
'getpost' || ($timestamp !==
null &&
dol_print_date($timestamp,
'%H:%M:%S') !==
'00:00:00')) {
12947 $TParam = array_merge($TParam, array(
12954 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.
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_getIdFromCode($db, $key, $tablename, $fieldkey='code', $fieldid='id', $entityfilter=0, $filters='')
Return an id or code from a code or id.
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.
dolIsAllowedForPreview($file)
Return if a file is qualified for preview.
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...
getDictionaryValue($tablename, $field, $id, $checkentity=false, $rowidfield='rowid')
Return the value of a filed into a dictionary for the record $id.
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.
publicphonebutton2 phonegreen basiclayout basiclayout TotalHT VATCode TotalVAT TotalLT1 TotalLT2 TotalTTC TotalHT clearboth nowraponall right right takeposterminal SELECT e rowid
document_preview(file, type, title)
Function show document preview.
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.