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'))) {
2455 $totalallpayments = $object->getSommePaiement(0);
2456 $totalallpayments += $object->getSumCreditNotesUsed(0);
2457 $totalallpayments += $object->getSumDepositsUsed(0);
2458 $tmptxt = $object->getLibStatut(6, $totalallpayments);
2459 if (empty($tmptxt) || $tmptxt == $object->getLibStatut(3)) {
2460 $tmptxt = $object->getLibStatut(5, $totalallpayments);
2462 $morehtmlstatus .= $tmptxt;
2463 } elseif (in_array($object->element, array(
'chargesociales',
'loan',
'tva'))) {
2464 $tmptxt = $object->getLibStatut(6, $object->totalpaid);
2465 if (empty($tmptxt) || $tmptxt == $object->getLibStatut(3)) {
2466 $tmptxt = $object->getLibStatut(5, $object->totalpaid);
2468 $morehtmlstatus .= $tmptxt;
2469 } elseif ($object->element ==
'contrat' || $object->element ==
'contract') {
2470 if ($object->statut == 0) {
2471 $morehtmlstatus .= $object->getLibStatut(5);
2473 $morehtmlstatus .= $object->getLibStatut(4);
2475 } elseif ($object->element ==
'facturerec') {
2476 if ($object->frequency == 0) {
2477 $morehtmlstatus .= $object->getLibStatut(2);
2479 $morehtmlstatus .= $object->getLibStatut(5);
2481 } elseif ($object->element ==
'project_task') {
2482 $object->fk_statut = 1;
2483 if ($object->progress > 0) {
2484 $object->fk_statut = 2;
2486 if ($object->progress >= 100) {
2487 $object->fk_statut = 3;
2489 $tmptxt = $object->getLibStatut(5);
2490 $morehtmlstatus .= $tmptxt;
2491 } elseif (method_exists($object,
'getLibStatut')) {
2492 $tmptxt = $object->getLibStatut(6);
2493 if (empty($tmptxt) || $tmptxt == $object->getLibStatut(3)) {
2494 $tmptxt = $object->getLibStatut(5);
2496 $morehtmlstatus .= $tmptxt;
2500 if (isModEnabled(
'accounting') && in_array($object->element, array(
'bank',
'paiementcharge',
'facture',
'invoice',
'invoice_supplier',
'expensereport',
'payment_various'))) {
2502 if (method_exists($object,
'getVentilExportCompta')) {
2503 $accounted = $object->getVentilExportCompta();
2504 $langs->load(
"accountancy");
2505 $morehtmlstatus .=
'</div><div class="statusref statusrefbis"><span class="opacitymedium">'.($accounted > 0 ? $langs->trans(
"Accounted") : $langs->trans(
"NotYetAccounted")).
'</span>';
2510 if (!empty($object->name_alias)) {
2511 $morehtmlref .=
'<div class="refidno opacitymedium">'.dol_escape_htmltag($object->name_alias).
'</div>';
2515 if (in_array($object->element, array(
'product',
'bank_account',
'project_task'))) {
2516 if (!empty($object->label)) {
2517 $morehtmlref .=
'<div class="refidno opacitymedium">'.$object->label.
'</div>';
2522 if (method_exists($object,
'getBannerAddress') && !in_array($object->element, array(
'product',
'bookmark',
'ecm_directories',
'ecm_files'))) {
2523 $moreaddress = $object->getBannerAddress(
'refaddress', $object);
2525 $morehtmlref .=
'<div class="refidno refaddress">';
2526 $morehtmlref .= $moreaddress;
2527 $morehtmlref .=
'</div>';
2530 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)) {
2531 $morehtmlref .=
'<div style="clear: both;"></div>';
2532 $morehtmlref .=
'<div class="refidno opacitymedium">';
2533 $morehtmlref .= $langs->trans(
"TechnicalID").
': '.((int) $object->id);
2534 $morehtmlref .=
'</div>';
2537 $parameters=array(
'morehtmlref'=>$morehtmlref);
2538 $reshook = $hookmanager->executeHooks(
'formDolBanner', $parameters, $object, $action);
2541 } elseif (empty($reshook)) {
2542 $morehtmlref .= $hookmanager->resPrint;
2543 } elseif ($reshook > 0) {
2544 $morehtmlref = $hookmanager->resPrint;
2548 print
'<div class="'.($onlybanner ?
'arearefnobottom ' :
'arearef ').
'heightref valignmiddle centpercent">';
2549 print $form->showrefnav($object, $paramid, $morehtml, $shownav, $fieldid, $fieldref, $morehtmlref, $moreparam, $nodbprefix, $morehtmlleft, $morehtmlstatus, $morehtmlright);
2551 print
'<div class="underrefbanner clearboth"></div>';
2567 if ($fieldrequired) {
2568 $ret .=
'<span class="fieldrequired">';
2570 $ret .=
'<label for="'.$fieldkey.
'">';
2571 $ret .= $langs->trans($langkey);
2573 if ($fieldrequired) {
2589 $ret =
' '.$bc[$var];
2591 $ret = preg_replace(
'/class=\"/',
'class="'.$moreclass.
' ', $ret);
2609function dol_format_address($object, $withcountry = 0, $sep =
"\n", $outputlangs =
'', $mode = 0, $extralangcode =
'')
2611 global $conf, $langs, $hookmanager;
2614 $countriesusingstate = array(
'AU',
'CA',
'US',
'IN',
'GB',
'ES',
'UK',
'TR',
'CN');
2619 $ret .= ($extralangcode ? $object->array_languages[
'address'][$extralangcode] : (empty($object->address) ?
'' : preg_replace(
'/(\r\n|\r|\n)+/', $sep, $object->address)));
2622 if (isset($object->country_code) && in_array($object->country_code, array(
'AU',
'CA',
'US',
'CN')) || !empty($conf->global->MAIN_FORCE_STATE_INTO_ADDRESS)) {
2624 $town = ($extralangcode ? $object->array_languages[
'town'][$extralangcode] : (empty($object->town) ?
'' : $object->town));
2625 $ret .= (($ret && $town) ? $sep :
'').$town;
2627 if (!empty($object->state)) {
2628 $ret .= ($ret ? ($town ?
", " : $sep) :
'').$object->state;
2630 if (!empty($object->zip)) {
2631 $ret .= ($ret ? (($town || $object->state) ?
", " : $sep) :
'').$object->zip;
2633 } elseif (isset($object->country_code) && in_array($object->country_code, array(
'GB',
'UK'))) {
2635 $town = ($extralangcode ? $object->array_languages[
'town'][$extralangcode] : (empty($object->town) ?
'' : $object->town));
2636 $ret .= ($ret ? $sep :
'').$town;
2637 if (!empty($object->state)) {
2638 $ret .= ($ret ?
", " :
'').$object->state;
2640 if (!empty($object->zip)) {
2641 $ret .= ($ret ? $sep :
'').$object->zip;
2643 } elseif (isset($object->country_code) && in_array($object->country_code, array(
'ES',
'TR'))) {
2645 $ret .= ($ret ? $sep :
'').$object->zip;
2646 $town = ($extralangcode ? $object->array_languages[
'town'][$extralangcode] : (empty($object->town) ?
'' : $object->town));
2647 $ret .= ($town ? (($object->zip ?
' ' :
'').$town) :
'');
2648 if (!empty($object->state)) {
2649 $ret .= $sep.$object->state;
2651 } elseif (isset($object->country_code) && in_array($object->country_code, array(
'JP'))) {
2654 $town = ($extralangcode ? $object->array_languages[
'town'][$extralangcode] : (empty($object->town) ?
'' : $object->town));
2655 $ret .= ($ret ? $sep :
'').($object->state ? $object->state.
', ' :
'').$town.($object->zip ?
' ' :
'').$object->zip;
2656 } elseif (isset($object->country_code) && in_array($object->country_code, array(
'IT'))) {
2658 $ret .= ($ret ? $sep :
'').$object->zip;
2659 $town = ($extralangcode ? $object->array_languages[
'town'][$extralangcode] : (empty($object->town) ?
'' : $object->town));
2660 $ret .= ($town ? (($object->zip ?
' ' :
'').$town) :
'');
2661 $ret .= (empty($object->state_code) ?
'' : (
' '.$object->state_code));
2664 $town = ($extralangcode ? $object->array_languages[
'town'][$extralangcode] : (empty($object->town) ?
'' : $object->town));
2665 $ret .= !empty($object->zip) ? (($ret ? $sep :
'').$object->zip) :
'';
2666 $ret .= ($town ? (($object->zip ?
' ' : ($ret ? $sep :
'')).$town) :
'');
2667 if (!empty($object->state) && in_array($object->country_code, $countriesusingstate)) {
2668 $ret .= ($ret ?
", " :
'').$object->state;
2672 if (!is_object($outputlangs)) {
2673 $outputlangs = $langs;
2676 $langs->load(
"dict");
2677 $ret .= (empty($object->country_code) ?
'' : ($ret ? $sep :
'').$outputlangs->convToOutputCharset($outputlangs->transnoentitiesnoconv(
"Country".$object->country_code)));
2680 $parameters = array(
'withcountry' => $withcountry,
'sep' => $sep,
'outputlangs' => $outputlangs,
'mode' => $mode,
'extralangcode' => $extralangcode);
2681 $reshook = $hookmanager->executeHooks(
'formatAddress', $parameters, $object);
2685 $ret .= $hookmanager->resPrint;
2703 if ((abs($ts) <= 0x7FFFFFFF)) {
2704 return ($is_gmt) ? @gmstrftime($fmt, $ts) : @strftime($fmt, $ts);
2706 return 'Error date into a not supported range';
2731function dol_print_date($time, $format =
'', $tzoutput =
'auto', $outputlangs =
'', $encodetooutput =
false)
2733 global $conf, $langs;
2740 if ($tzoutput ===
'auto') {
2741 $tzoutput = (empty($conf) ?
'tzserver' : (isset($conf->tzuserinputkey) ? $conf->tzuserinputkey :
'tzserver'));
2746 $offsettz = $offsetdst = 0;
2749 if (is_string($tzoutput)) {
2750 if ($tzoutput ==
'tzserver') {
2752 $offsettzstring = @date_default_timezone_get();
2755 } elseif ($tzoutput ==
'tzuser' || $tzoutput ==
'tzuserrel') {
2757 $offsettzstring = (empty($_SESSION[
'dol_tz_string']) ?
'UTC' : $_SESSION[
'dol_tz_string']);
2759 if (class_exists(
'DateTimeZone')) {
2760 $user_date_tz =
new DateTimeZone($offsettzstring);
2761 $user_dt =
new DateTime();
2762 $user_dt->setTimezone($user_date_tz);
2763 $user_dt->setTimestamp($tzoutput ==
'tzuser' ?
dol_now() : (int) $time);
2764 $offsettz = $user_dt->getOffset();
2766 $offsettz = (empty($_SESSION[
'dol_tz']) ? 0 : $_SESSION[
'dol_tz']) * 60 * 60;
2767 $offsetdst = (empty($_SESSION[
'dol_dst']) ? 0 : $_SESSION[
'dol_dst']) * 60 * 60;
2772 if (!is_object($outputlangs)) {
2773 $outputlangs = $langs;
2776 $format =
'daytextshort';
2781 $reduceformat = (!empty($conf->dol_optimize_smallscreen) && in_array($format, array(
'day',
'dayhour'))) ? 1 : 0;
2782 $format = preg_replace(
'/inputnoreduce/',
'', $format);
2783 $formatwithoutreduce = preg_replace(
'/reduceformat/',
'', $format);
2784 if ($formatwithoutreduce != $format) {
2785 $format = $formatwithoutreduce;
2791 if ($format ==
'day') {
2792 $format = ($outputlangs->trans(
"FormatDateShort") !=
"FormatDateShort" ? $outputlangs->trans(
"FormatDateShort") : $conf->format_date_short);
2793 } elseif ($format ==
'hour') {
2794 $format = ($outputlangs->trans(
"FormatHourShort") !=
"FormatHourShort" ? $outputlangs->trans(
"FormatHourShort") : $conf->format_hour_short);
2795 } elseif ($format ==
'hourduration') {
2796 $format = ($outputlangs->trans(
"FormatHourShortDuration") !=
"FormatHourShortDuration" ? $outputlangs->trans(
"FormatHourShortDuration") : $conf->format_hour_short_duration);
2797 } elseif ($format ==
'daytext') {
2798 $format = ($outputlangs->trans(
"FormatDateText") !=
"FormatDateText" ? $outputlangs->trans(
"FormatDateText") : $conf->format_date_text);
2799 } elseif ($format ==
'daytextshort') {
2800 $format = ($outputlangs->trans(
"FormatDateTextShort") !=
"FormatDateTextShort" ? $outputlangs->trans(
"FormatDateTextShort") : $conf->format_date_text_short);
2801 } elseif ($format ==
'dayhour') {
2802 $format = ($outputlangs->trans(
"FormatDateHourShort") !=
"FormatDateHourShort" ? $outputlangs->trans(
"FormatDateHourShort") : $conf->format_date_hour_short);
2803 } elseif ($format ==
'dayhoursec') {
2804 $format = ($outputlangs->trans(
"FormatDateHourSecShort") !=
"FormatDateHourSecShort" ? $outputlangs->trans(
"FormatDateHourSecShort") : $conf->format_date_hour_sec_short);
2805 } elseif ($format ==
'dayhourtext') {
2806 $format = ($outputlangs->trans(
"FormatDateHourText") !=
"FormatDateHourText" ? $outputlangs->trans(
"FormatDateHourText") : $conf->format_date_hour_text);
2807 } elseif ($format ==
'dayhourtextshort') {
2808 $format = ($outputlangs->trans(
"FormatDateHourTextShort") !=
"FormatDateHourTextShort" ? $outputlangs->trans(
"FormatDateHourTextShort") : $conf->format_date_hour_text_short);
2809 } elseif ($format ==
'dayhourlog') {
2811 $format =
'%Y%m%d%H%M%S';
2812 } elseif ($format ==
'dayhourlogsmall') {
2814 $format =
'%y%m%d%H%M';
2815 } elseif ($format ==
'dayhourldap') {
2816 $format =
'%Y%m%d%H%M%SZ';
2817 } elseif ($format ==
'dayhourxcard') {
2818 $format =
'%Y%m%dT%H%M%SZ';
2819 } elseif ($format ==
'dayxcard') {
2821 } elseif ($format ==
'dayrfc') {
2822 $format =
'%Y-%m-%d';
2823 } elseif ($format ==
'dayhourrfc') {
2824 $format =
'%Y-%m-%dT%H:%M:%SZ';
2825 } elseif ($format ==
'standard') {
2826 $format =
'%Y-%m-%d %H:%M:%S';
2829 if ($reduceformat) {
2830 $format = str_replace(
'%Y',
'%y', $format);
2831 $format = str_replace(
'yyyy',
'yy', $format);
2835 if (preg_match(
'/%b/i', $format)) {
2837 $format = str_replace(
'%b',
'__b__', $format);
2838 $format = str_replace(
'%B',
'__B__', $format);
2840 if (preg_match(
'/%a/i', $format)) {
2842 $format = str_replace(
'%a',
'__a__', $format);
2843 $format = str_replace(
'%A',
'__A__', $format);
2848 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)) {
2849 dol_print_error(
'',
"Functions.lib::dol_print_date function called with a bad value from page ".$_SERVER[
"PHP_SELF"]);
2851 } elseif (preg_match(
'/^([0-9]+)\-([0-9]+)\-([0-9]+) ?([0-9]+)?:?([0-9]+)?:?([0-9]+)?/i', $time, $reg)) {
2853 dol_syslog(
"Functions.lib::dol_print_date function called with a bad value from page ".$_SERVER[
"PHP_SELF"], LOG_WARNING);
2856 $syear = (!empty($reg[1]) ? $reg[1] :
'');
2857 $smonth = (!empty($reg[2]) ? $reg[2] :
'');
2858 $sday = (!empty($reg[3]) ? $reg[3] :
'');
2859 $shour = (!empty($reg[4]) ? $reg[4] :
'');
2860 $smin = (!empty($reg[5]) ? $reg[5] :
'');
2861 $ssec = (!empty($reg[6]) ? $reg[6] :
'');
2863 $time =
dol_mktime($shour, $smin, $ssec, $smonth, $sday, $syear,
true);
2866 $tzo =
new DateTimeZone(
'UTC');
2868 $tzo =
new DateTimeZone(date_default_timezone_get());
2870 $dtts =
new DateTime();
2871 $dtts->setTimestamp($time);
2872 $dtts->setTimezone($tzo);
2873 $newformat = str_replace(
2874 array(
'%Y',
'%y',
'%m',
'%d',
'%H',
'%I',
'%M',
'%S',
'%p',
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
2875 array(
'Y',
'y',
'm',
'd',
'H',
'h',
'i',
's',
'A',
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
2877 $ret = $dtts->format($newformat);
2879 array(
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
2880 array(
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
2885 if ($time < 100000000000) {
2886 $timetouse = $time + $offsettz + $offsetdst;
2889 $tzo =
new DateTimeZone(
'UTC');
2891 $tzo =
new DateTimeZone(date_default_timezone_get());
2893 $dtts =
new DateTime();
2894 $dtts->setTimestamp($timetouse);
2895 $dtts->setTimezone($tzo);
2896 $newformat = str_replace(
2897 array(
'%Y',
'%y',
'%m',
'%d',
'%H',
'%I',
'%M',
'%S',
'%p',
'%w',
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
2898 array(
'Y',
'y',
'm',
'd',
'H',
'h',
'i',
's',
'A',
'w',
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
2900 $ret = $dtts->format($newformat);
2902 array(
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
2903 array(
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
2908 $ret =
'Bad value '.$time.
' for date';
2912 if (preg_match(
'/__b__/i', $format)) {
2913 $timetouse = $time + $offsettz + $offsetdst;
2916 $tzo =
new DateTimeZone(
'UTC');
2918 $tzo =
new DateTimeZone(date_default_timezone_get());
2920 $dtts =
new DateTime();
2921 $dtts->setTimestamp($timetouse);
2922 $dtts->setTimezone($tzo);
2923 $month = $dtts->format(
"m");
2924 $month = sprintf(
"%02d", $month);
2925 if ($encodetooutput) {
2926 $monthtext = $outputlangs->transnoentities(
'Month'.$month);
2927 $monthtextshort = $outputlangs->transnoentities(
'MonthShort'.$month);
2929 $monthtext = $outputlangs->transnoentitiesnoconv(
'Month'.$month);
2930 $monthtextshort = $outputlangs->transnoentitiesnoconv(
'MonthShort'.$month);
2933 $ret = str_replace(
'__b__', $monthtextshort, $ret);
2934 $ret = str_replace(
'__B__', $monthtext, $ret);
2938 if (preg_match(
'/__a__/i', $format)) {
2940 $timetouse = $time + $offsettz + $offsetdst;
2943 $tzo =
new DateTimeZone(
'UTC');
2945 $tzo =
new DateTimeZone(date_default_timezone_get());
2947 $dtts =
new DateTime();
2948 $dtts->setTimestamp($timetouse);
2949 $dtts->setTimezone($tzo);
2950 $w = $dtts->format(
"w");
2951 $dayweek = $outputlangs->transnoentitiesnoconv(
'Day'.$w);
2953 $ret = str_replace(
'__A__', $dayweek, $ret);
2954 $ret = str_replace(
'__a__',
dol_substr($dayweek, 0, 3), $ret);
2983 $datetimeobj =
new DateTime();
2984 $datetimeobj->setTimestamp($timestamp);
2985 if ($forcetimezone) {
2986 $datetimeobj->setTimezone(
new DateTimeZone($forcetimezone ==
'gmt' ?
'UTC' : $forcetimezone));
2989 'year'=>((
int) date_format($datetimeobj,
'Y')),
2990 'mon'=>((
int) date_format($datetimeobj,
'm')),
2991 'mday'=>((
int) date_format($datetimeobj,
'd')),
2992 'wday'=>((
int) date_format($datetimeobj,
'w')),
2993 'yday'=>((
int) date_format($datetimeobj,
'z')),
2994 'hours'=>((
int) date_format($datetimeobj,
'H')),
2995 'minutes'=>((
int) date_format($datetimeobj,
'i')),
2996 'seconds'=>((
int) date_format($datetimeobj,
's')),
3024function dol_mktime($hour, $minute, $second, $month, $day, $year, $gm =
'auto', $check = 1)
3029 if ($gm ===
'auto') {
3030 $gm = (empty($conf) ?
'tzserver' : $conf->tzuserinputkey);
3035 if ($hour == -1 || empty($hour)) {
3038 if ($minute == -1 || empty($minute)) {
3041 if ($second == -1 || empty($second)) {
3047 if (!$month || !$day) {
3056 if ($hour < 0 || $hour > 24) {
3059 if ($minute < 0 || $minute > 60) {
3062 if ($second < 0 || $second > 60) {
3067 if (empty($gm) || ($gm ===
'server' || $gm ===
'tzserver')) {
3068 $default_timezone = @date_default_timezone_get();
3069 $localtz =
new DateTimeZone($default_timezone);
3070 } elseif ($gm ===
'user' || $gm ===
'tzuser' || $gm ===
'tzuserrel') {
3072 $default_timezone = (empty($_SESSION[
"dol_tz_string"]) ? @date_default_timezone_get() : $_SESSION[
"dol_tz_string"]);
3074 $localtz =
new DateTimeZone($default_timezone);
3076 dol_syslog(
"Warning dol_tz_string contains an invalid value ".$_SESSION[
"dol_tz_string"], LOG_WARNING);
3077 $default_timezone = @date_default_timezone_get();
3079 } elseif (strrpos($gm,
"tz,") !==
false) {
3080 $timezone = str_replace(
"tz,",
"", $gm);
3082 $localtz =
new DateTimeZone($timezone);
3084 dol_syslog(
"Warning passed timezone contains an invalid value ".$timezone, LOG_WARNING);
3088 if (empty($localtz)) {
3089 $localtz =
new DateTimeZone(
'UTC');
3093 $dt =
new DateTime(
'now', $localtz);
3094 $dt->setDate((
int) $year, (
int) $month, (
int) $day);
3095 $dt->setTime((
int) $hour, (
int) $minute, (
int) $second);
3096 $date = $dt->getTimestamp();
3116 if ($mode ===
'auto') {
3120 if ($mode ==
'gmt') {
3122 } elseif ($mode ==
'tzserver') {
3123 require_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
3125 $ret = (int) (
dol_now(
'gmt') + ($tzsecond * 3600));
3131 } elseif ($mode ==
'tzuser' || $mode ==
'tzuserrel') {
3134 $offsettz = (empty($_SESSION[
'dol_tz']) ? 0 : $_SESSION[
'dol_tz']) * 60 * 60;
3135 $offsetdst = (empty($_SESSION[
'dol_dst']) ? 0 : $_SESSION[
'dol_dst']) * 60 * 60;
3136 $ret = (int) (
dol_now(
'gmt') + ($offsettz + $offsetdst));
3153 global $conf, $langs;
3156 if (!empty($conf->dol_optimize_smallscreen)) {
3161 if (empty($shortvalue) || $size < ($level * 10)) {
3163 $textunitshort = $langs->trans(
"b");
3164 $textunitlong = $langs->trans(
"Bytes");
3166 $ret = round($size / $level, 0);
3167 $textunitshort = $langs->trans(
"Kb");
3168 $textunitlong = $langs->trans(
"KiloBytes");
3171 if (empty($shortunit)) {
3172 $ret .=
' '.$textunitlong;
3174 $ret .=
' '.$textunitshort;
3190function dol_print_url($url, $target =
'_blank', $max = 32, $withpicto = 0, $morecss =
'float')
3198 $link =
'<a href="';
3199 if (!preg_match(
'/^http/i', $url)) {
3205 $link .=
' target="'.$target.
'"';
3208 if (!preg_match(
'/^http/i', $url)) {
3214 if ($morecss ==
'float') {
3215 return '<div class="nospan'.($morecss ?
' '.$morecss :
'').
'" style="margin-right: 10px">'.($withpicto ?
img_picto($langs->trans(
"Url"),
'globe').
' ' :
'').$link.
'</div>';
3217 return '<span class="nospan'.($morecss ?
' '.$morecss :
'').
'" style="margin-right: 10px">'.($withpicto ?
img_picto($langs->trans(
"Url"),
'globe').
' ' :
'').$link.
'</span>';
3233function dol_print_email($email, $cid = 0, $socid = 0, $addlink = 0, $max = 64, $showinvalid = 1, $withpicto = 0)
3235 global $conf, $user, $langs, $hookmanager;
3239 if (!empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER) && $withpicto) {
3243 if (empty($email)) {
3247 if (!empty($addlink)) {
3248 $newemail =
'<a style="text-overflow: ellipsis;" href="';
3249 if (!preg_match(
'/^mailto:/i', $email)) {
3250 $newemail .=
'mailto:';
3252 $newemail .= $email;
3255 $newemail .=
'</a>';
3257 $langs->load(
"errors");
3258 $newemail .=
img_warning($langs->trans(
"ErrorBadEMail", $email));
3261 if (($cid || $socid) && isModEnabled(
'agenda') && $user->hasRight(
"agenda",
"myactions",
"create")) {
3264 if (!empty($conf->global->AGENDA_ADDACTIONFOREMAIL)) {
3265 $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>';
3268 $newemail =
'<div>'.$newemail.
' '.$link.
'</div>';
3273 $langs->load(
"errors");
3274 $newemail .=
img_warning($langs->trans(
"ErrorBadEMail", $email));
3279 $rep = ($withpicto ?
img_picto($langs->trans(
"EMail").
' : '.$email, (is_numeric($withpicto) ?
'email' : $withpicto)).
' ' :
'').$newemail;
3282 $parameters = array(
'cid' => $cid,
'socid' => $socid,
'addlink' => $addlink,
'picto' => $withpicto);
3284 $reshook = $hookmanager->executeHooks(
'printEmail', $parameters, $email);
3288 $rep .= $hookmanager->resPrint;
3303 $socialnetworks = array();
3305 require_once DOL_DOCUMENT_ROOT.
'/core/lib/memory.lib.php';
3306 $cachekey =
'socialnetworks_' . $conf->entity;
3308 if (!is_null($dataretrieved)) {
3309 $socialnetworks = $dataretrieved;
3311 $sql =
"SELECT rowid, code, label, url, icon, active FROM ".MAIN_DB_PREFIX.
"c_socialnetworks";
3312 $sql .=
" WHERE entity=".$conf->entity;
3313 $resql = $db->query($sql);
3315 while ($obj = $db->fetch_object($resql)) {
3316 $socialnetworks[$obj->code] = array(
3317 'rowid' => $obj->rowid,
3318 'label' => $obj->label,
3320 'icon' => $obj->icon,
3321 'active' => $obj->active,
3328 return $socialnetworks;
3343 global $conf, $user, $langs;
3347 if (empty($value)) {
3351 if (!empty($type)) {
3352 $htmllink =
'<div class="divsocialnetwork inline-block valignmiddle">';
3354 $htmllink .=
'<span class="fa pictofixedwidth '.($dictsocialnetworks[$type][
'icon'] ? $dictsocialnetworks[$type][
'icon'] :
'fa-link').
'"></span>';
3355 if ($type ==
'skype') {
3357 $htmllink .=
' <a href="skype:';
3359 $htmllink .=
'?call" alt="'.$langs->trans(
"Call").
' '.$value.
'" title="'.
dol_escape_htmltag($langs->trans(
"Call").
' '.$value).
'">';
3360 $htmllink .=
'<img src="'.DOL_URL_ROOT.
'/theme/common/skype_callbutton.png" border="0">';
3361 $htmllink .=
'</a><a href="skype:';
3363 $htmllink .=
'?chat" alt="'.$langs->trans(
"Chat").
' '.$value.
'" title="'.
dol_escape_htmltag($langs->trans(
"Chat").
' '.$value).
'">';
3364 $htmllink .=
'<img class="paddingleft" src="'.DOL_URL_ROOT.
'/theme/common/skype_chatbutton.png" border="0">';
3365 $htmllink .=
'</a>';
3366 if (($cid || $socid) && isModEnabled(
'agenda') && $user->hasRight(
'agenda',
'myactions',
'create')) {
3367 $addlink =
'AC_SKYPE';
3369 if (!empty($conf->global->AGENDA_ADDACTIONFORSKYPE)) {
3370 $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>';
3372 $htmllink .= ($link ?
' '.$link :
'');
3375 if (!empty($dictsocialnetworks[$type][
'url'])) {
3376 $tmpvirginurl = preg_replace(
'/\/?{socialid}/',
'', $dictsocialnetworks[$type][
'url']);
3377 if ($tmpvirginurl) {
3378 $value = preg_replace(
'/^www\.'.preg_quote($tmpvirginurl,
'/').
'\/?/',
'', $value);
3379 $value = preg_replace(
'/^'.preg_quote($tmpvirginurl,
'/').
'\/?/',
'', $value);
3381 $tmpvirginurl3 = preg_replace(
'/^https:\/\//i',
'https://www.', $tmpvirginurl);
3382 if ($tmpvirginurl3) {
3383 $value = preg_replace(
'/^www\.'.preg_quote($tmpvirginurl3,
'/').
'\/?/',
'', $value);
3384 $value = preg_replace(
'/^'.preg_quote($tmpvirginurl3,
'/').
'\/?/',
'', $value);
3387 $tmpvirginurl2 = preg_replace(
'/^https?:\/\//i',
'', $tmpvirginurl);
3388 if ($tmpvirginurl2) {
3389 $value = preg_replace(
'/^www\.'.preg_quote($tmpvirginurl2,
'/').
'\/?/',
'', $value);
3390 $value = preg_replace(
'/^'.preg_quote($tmpvirginurl2,
'/').
'\/?/',
'', $value);
3393 $link = str_replace(
'{socialid}', $value, $dictsocialnetworks[$type][
'url']);
3394 if (preg_match(
'/^https?:\/\//i', $link)) {
3395 $htmllink .=
'<a href="'.dol_sanitizeUrl($link, 0).
'" target="_blank" rel="noopener noreferrer">'.
dol_escape_htmltag($value).
'</a>';
3397 $htmllink .=
'<a href="'.dol_sanitizeUrl($link, 1).
'" target="_blank" rel="noopener noreferrer">'.
dol_escape_htmltag($value).
'</a>';
3403 $htmllink .=
'</div>';
3405 $langs->load(
"errors");
3406 $htmllink .=
img_warning($langs->trans(
"ErrorBadSocialNetworkValue", $value));
3421function dol_print_profids($profID, $profIDtype, $countrycode =
'', $addcpButton = 1, $separ =
' ')
3425 if (empty($profID) || empty($profIDtype)) {
3428 if (empty($countrycode)) $countrycode = $mysoc->country_code;
3429 $newProfID = $profID;
3430 $id = substr($profIDtype, -1);
3432 if (strtoupper($countrycode) ==
'FR') {
3434 if ($id == 1 &&
dol_strlen($newProfID) == 9) $newProfID = substr($newProfID, 0, 3).$separ.substr($newProfID, 3, 3).$separ.substr($newProfID, 6, 3);
3435 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);
3436 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);
3439 else $ret = $newProfID;
3457function dol_print_phone($phone, $countrycode =
'', $cid = 0, $socid = 0, $addlink =
'', $separ =
" ", $withpicto =
'', $titlealt =
'', $adddivfloat = 0)
3459 global $conf, $user, $langs, $mysoc, $hookmanager;
3462 $phone = is_null($phone) ?
'' : preg_replace(
"/[\s.-]/",
"", trim($phone));
3463 if (empty($phone)) {
3466 if (!empty($conf->global->MAIN_PHONE_SEPAR)) {
3467 $separ = $conf->global->MAIN_PHONE_SEPAR;
3469 if (empty($countrycode) && is_object($mysoc)) {
3470 $countrycode = $mysoc->country_code;
3474 if ($conf->dol_optimize_smallscreen) {
3479 if (strtoupper($countrycode) ==
"FR") {
3482 $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);
3484 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 2).$separ.substr($newphone, 5, 2);
3486 $newphone = substr($newphone, 0, 2).$separ.substr($newphone, 2, 3).$separ.substr($newphone, 5, 2).$separ.substr($newphone, 7, 2);
3488 $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);
3490 $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);
3492 $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);
3494 } elseif (strtoupper($countrycode) ==
"CA") {
3496 $newphone = ($separ !=
'' ?
'(' :
'').substr($newphone, 0, 3).($separ !=
'' ?
')' :
'').$separ.substr($newphone, 3, 3).($separ !=
'' ?
'-' :
'').substr($newphone, 6, 4);
3498 } elseif (strtoupper($countrycode) ==
"PT") {
3500 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 3);
3502 } elseif (strtoupper($countrycode) ==
"SR") {
3504 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3);
3506 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 4);
3508 } elseif (strtoupper($countrycode) ==
"DE") {
3510 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 4).$separ.substr($newphone, 7, 4).$separ.substr($newphone, 11, 3);
3512 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 4).$separ.substr($newphone, 10, 3);
3514 } elseif (strtoupper($countrycode) ==
"ES") {
3516 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 3);
3518 } elseif (strtoupper($countrycode) ==
"BF") {
3520 $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);
3522 } elseif (strtoupper($countrycode) ==
"RO") {
3524 $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);
3526 } elseif (strtoupper($countrycode) ==
"TR") {
3528 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 4);
3530 } elseif (strtoupper($countrycode) ==
"US") {
3532 $newphone = substr($newphone, 0, 2).$separ.substr($newphone, 2, 3).$separ.substr($newphone, 5, 3).$separ.substr($newphone, 8, 4);
3534 } elseif (strtoupper($countrycode) ==
"MX") {
3536 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 4).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 2);
3538 $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);
3540 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 4);
3542 } elseif (strtoupper($countrycode) ==
"ML") {
3544 $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);
3546 } elseif (strtoupper($countrycode) ==
"TH") {
3548 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 2).$separ.substr($newphone, 8, 3);
3550 $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);
3552 } elseif (strtoupper($countrycode) ==
"MU") {
3555 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 2).$separ.substr($newphone, 9, 2);
3557 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 4).$separ.substr($newphone, 8, 2).$separ.substr($newphone, 10, 2);
3559 } elseif (strtoupper($countrycode) ==
"ZA") {
3561 $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);
3563 } elseif (strtoupper($countrycode) ==
"SY") {
3565 $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);
3567 $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);
3569 } elseif (strtoupper($countrycode) ==
"AE") {
3571 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 2);
3573 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 3);
3575 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 4);
3577 } elseif (strtoupper($countrycode) ==
"DZ") {
3579 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 3);
3581 } elseif (strtoupper($countrycode) ==
"BE") {
3583 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 2).$separ.substr($newphone, 8, 3);
3585 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 3);
3587 } elseif (strtoupper($countrycode) ==
"PF") {
3589 $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);
3591 } elseif (strtoupper($countrycode) ==
"CO") {
3593 $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);
3595 } elseif (strtoupper($countrycode) ==
"JO") {
3597 $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);
3599 } elseif (strtoupper($countrycode) ==
"JM") {
3601 $newphone = substr($newphone, 0, 5).$separ.substr($newphone, 5, 3).$separ.substr($newphone, 8, 4);
3603 } elseif (strtoupper($countrycode) ==
"MG") {
3605 $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);
3607 } elseif (strtoupper($countrycode) ==
"GB") {
3609 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 4).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 3);
3611 } elseif (strtoupper($countrycode) ==
"CH") {
3613 $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);
3615 $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);
3617 } elseif (strtoupper($countrycode) ==
"TN") {
3619 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 2).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 3);
3621 } elseif (strtoupper($countrycode) ==
"GF") {
3623 $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);
3625 } elseif (strtoupper($countrycode) ==
"GP") {
3627 $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);
3629 } elseif (strtoupper($countrycode) ==
"MQ") {
3631 $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);
3633 } elseif (strtoupper($countrycode) ==
"IT") {
3635 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 3);
3637 $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);
3639 } elseif (strtoupper($countrycode) ==
"AU") {
3643 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 1).$separ.substr($newphone, 4, 4).$separ.substr($newphone, 8, 4);
3645 } elseif (strtoupper($countrycode) ==
"LU") {
3648 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 2).$separ.substr($newphone, 6, 2).$separ.substr($newphone, 8, 2);
3650 $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);
3652 $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);
3654 $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);
3657 if (!empty($addlink)) {
3658 if ($addlink ==
'tel' || $conf->browser->layout ==
'phone' || (isModEnabled(
'clicktodial') && !empty($conf->global->CLICKTODIAL_USE_TEL_LINK_ON_PHONE_NUMBERS))) {
3659 $newphoneform = $newphone;
3660 $newphone =
'<a href="tel:'.$phone.
'"';
3661 $newphone .=
'>'.$newphoneform.
'</a>';
3662 } elseif (isModEnabled(
'clicktodial') && $addlink ==
'AC_TEL') {
3663 if (empty($user->clicktodial_loaded)) {
3664 $user->fetch_clicktodial();
3668 $urlmask =
'ErrorClickToDialModuleNotConfigured';
3669 if (!empty($conf->global->CLICKTODIAL_URL)) {
3670 $urlmask = $conf->global->CLICKTODIAL_URL;
3672 if (!empty($user->clicktodial_url)) {
3673 $urlmask = $user->clicktodial_url;
3676 $clicktodial_poste = (!empty($user->clicktodial_poste) ?urlencode($user->clicktodial_poste) :
'');
3677 $clicktodial_login = (!empty($user->clicktodial_login) ?urlencode($user->clicktodial_login) :
'');
3678 $clicktodial_password = (!empty($user->clicktodial_password) ?urlencode($user->clicktodial_password) :
'');
3680 $url = sprintf($urlmask, urlencode($phone), $clicktodial_poste, $clicktodial_login, $clicktodial_password);
3682 $substitarray = array(
'__PHONEFROM__'=>$clicktodial_poste,
3683 '__PHONETO__'=>urlencode($phone),
3684 '__LOGIN__'=>$clicktodial_login,
3685 '__PASS__'=>$clicktodial_password);
3687 $newphonesav = $newphone;
3688 if (empty($conf->global->CLICKTODIAL_DO_NOT_USE_AJAX_CALL)) {
3690 $newphone =
'<a href="'.$url.
'" class="cssforclicktodial"';
3691 $newphone .=
'>'.$newphonesav.
'</a>';
3694 $newphone =
'<a href="'.$url.
'"';
3695 if (!empty($conf->global->CLICKTODIAL_FORCENEWTARGET)) {
3696 $newphone .=
' target="_blank" rel="noopener noreferrer"';
3698 $newphone .=
'>'.$newphonesav.
'</a>';
3703 if (isModEnabled(
'agenda') && $user->hasRight(
"agenda",
"myactions",
"create")) {
3706 if ($addlink ==
'AC_FAX') {
3709 if (!empty($conf->global->AGENDA_ADDACTIONFORPHONE)) {
3710 $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>';
3713 $newphone =
'<div>'.$newphone.
' '.$link.
'</div>';
3718 if (empty($titlealt)) {
3719 $titlealt = ($withpicto ==
'fax' ? $langs->trans(
"Fax") : $langs->trans(
"Phone"));
3724 $parameters = array(
'countrycode' => $countrycode,
'cid' => $cid,
'socid' => $socid,
'titlealt' => $titlealt,
'picto' => $withpicto);
3725 $reshook = $hookmanager->executeHooks(
'printPhone', $parameters, $phone);
3726 $rep .= $hookmanager->resPrint;
3728 if (empty($reshook)) {
3731 if ($withpicto ==
'fax') {
3732 $picto =
'phoning_fax';
3733 } elseif ($withpicto ==
'phone') {
3735 } elseif ($withpicto ==
'mobile') {
3736 $picto =
'phoning_mobile';
3741 if ($adddivfloat == 1) {
3742 $rep .=
'<div class="nospan float" style="margin-right: 10px">';
3743 } elseif (empty($adddivfloat)) {
3744 $rep .=
'<span style="margin-right: 10px;">';
3746 $rep .= ($withpicto ?
img_picto($titlealt,
'object_'.$picto.
'.png').
' ' :
'').$newphone;
3747 if ($adddivfloat == 1) {
3749 } elseif (empty($adddivfloat)) {
3766 global $conf, $langs;
3777 if (file_exists(DOL_DOCUMENT_ROOT.
'/theme/common/flags/'.$countrycode.
'.png')) {
3778 $ret .=
' '.img_picto($countrycode.
' '.$langs->trans(
"AccordingToGeoIPDatabase"), DOL_URL_ROOT.
'/theme/common/flags/'.$countrycode.
'.png',
'', 1);
3780 $ret .=
' ('.$countrycode.
')';
3800 if (empty($_SERVER[
'HTTP_X_FORWARDED_FOR']) || preg_match(
'/[^0-9\.\:,\[\]]/', $_SERVER[
'HTTP_X_FORWARDED_FOR'])) {
3801 if (empty($_SERVER[
'HTTP_CLIENT_IP']) || preg_match(
'/[^0-9\.\:,\[\]]/', $_SERVER[
'HTTP_CLIENT_IP'])) {
3802 if (empty($_SERVER[
"HTTP_CF_CONNECTING_IP"])) {
3803 $ip = (empty($_SERVER[
'REMOTE_ADDR']) ?
'' : $_SERVER[
'REMOTE_ADDR']);
3805 $ip = $_SERVER[
"HTTP_CF_CONNECTING_IP"];
3808 $ip = $_SERVER[
'HTTP_CLIENT_IP'];
3811 $ip = $_SERVER[
'HTTP_X_FORWARDED_FOR'];
3827 if (isset($_SERVER[
'HTTPS']) && $_SERVER[
'HTTPS'] ==
'on') {
3829 } 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') {
3847 if (!empty($conf->geoipmaxmind->enabled)) {
3851 include_once DOL_DOCUMENT_ROOT.
'/core/class/dolgeoip.class.php';
3852 $geoip =
new DolGeoIP(
'country', $datafile);
3854 $countrycode = $geoip->getCountryCodeFromIP($ip);
3857 return $countrycode;
3869 global $conf, $langs, $user;
3873 if (!empty($conf->geoipmaxmind->enabled)) {
3878 include_once DOL_DOCUMENT_ROOT.
'/core/class/dolgeoip.class.php';
3879 $geoip =
new DolGeoIP(
'country', $datafile);
3880 $countrycode = $geoip->getCountryCodeFromIP($ip);
3881 $ret = $countrycode;
3900 global $conf, $user, $langs, $hookmanager;
3906 $parameters = array(
'element' => $element,
'id' => $id);
3907 $reshook = $hookmanager->executeHooks(
'printAddress', $parameters, $address);
3908 $out .= $hookmanager->resPrint;
3910 if (empty($reshook)) {
3911 if (empty($charfornl)) {
3912 $out .= nl2br($address);
3914 $out .= preg_replace(
'/[\r\n]+/', $charfornl, $address);
3918 $showgmap = $showomap = 0;
3919 if (($element ==
'thirdparty' || $element ==
'societe') && isModEnabled(
'google') && !empty($conf->global->GOOGLE_ENABLE_GMAPS)) {
3922 if ($element ==
'contact' && isModEnabled(
'google') && !empty($conf->global->GOOGLE_ENABLE_GMAPS_CONTACTS)) {
3925 if ($element ==
'member' && isModEnabled(
'google') && !empty($conf->global->GOOGLE_ENABLE_GMAPS_MEMBERS)) {
3928 if (($element ==
'thirdparty' || $element ==
'societe') && isModEnabled(
'openstreetmap') && !empty($conf->global->OPENSTREETMAP_ENABLE_MAPS)) {
3931 if ($element ==
'contact' && isModEnabled(
'openstreetmap') && !empty($conf->global->OPENSTREETMAP_ENABLE_MAPS_CONTACTS)) {
3934 if ($element ==
'member' && isModEnabled(
'openstreetmap') && !empty($conf->global->OPENSTREETMAP_ENABLE_MAPS_MEMBERS)) {
3938 $url =
dol_buildpath(
'/google/gmaps.php?mode='.$element.
'&id='.$id, 1);
3939 $out .=
' <a href="'.$url.
'" target="_gmaps"><img id="'.$htmlid.
'" class="valigntextbottom" src="'.DOL_URL_ROOT.
'/theme/common/gmap.png"></a>';
3942 $url =
dol_buildpath(
'/openstreetmap/maps.php?mode='.$element.
'&id='.$id, 1);
3943 $out .=
' <a href="'.$url.
'" target="_gmaps"><img id="'.$htmlid.
'_openstreetmap" class="valigntextbottom" src="'.DOL_URL_ROOT.
'/theme/common/gmap.png"></a>';
3964function isValidEmail($address, $acceptsupervisorkey = 0, $acceptuserkey = 0)
3966 if ($acceptsupervisorkey && $address ==
'__SUPERVISOREMAIL__') {
3969 if ($acceptuserkey && $address ==
'__USER_EMAIL__') {
3972 if (filter_var($address, FILTER_VALIDATE_EMAIL)) {
3989 if (function_exists(
'idn_to_ascii') && function_exists(
'checkdnsrr')) {
3990 if (!checkdnsrr(idn_to_ascii($domain),
'MX')) {
3993 if (function_exists(
'getmxrr')) {
3996 getmxrr(idn_to_ascii($domain), $mxhosts, $weight);
3997 if (count($mxhosts) > 1) {
4000 if (count($mxhosts) == 1 && !empty($mxhosts[0])) {
4037 $tmparray = explode(
' ', $s);
4038 foreach ($tmparray as $tmps) {
4055 if (is_null($string)) {
4059 if (function_exists(
'mb_strlen')) {
4060 return mb_strlen($string, $stringencoding);
4062 return strlen($string);
4076function dol_substr($string, $start, $length =
null, $stringencoding =
'', $trunconbytes = 0)
4080 if (empty($stringencoding)) {
4081 $stringencoding = $langs->charset_output;
4085 if (empty($trunconbytes)) {
4086 if (function_exists(
'mb_substr')) {
4087 $ret = mb_substr($string, $start, $length, $stringencoding);
4089 $ret = substr($string, $start, $length);
4092 if (function_exists(
'mb_strcut')) {
4093 $ret = mb_strcut($string, $start, $length, $stringencoding);
4095 $ret = substr($string, $start, $length);
4115function dol_trunc($string, $size = 40, $trunc =
'right', $stringencoding =
'UTF-8', $nodot = 0, $display = 0)
4119 if (empty($size) || !empty($conf->global->MAIN_DISABLE_TRUNC)) {
4123 if (empty($stringencoding)) {
4124 $stringencoding =
'UTF-8';
4127 if ($conf->dol_optimize_smallscreen == 1 && $display == 1) {
4128 $size = round($size / 3);
4132 if ($trunc ==
'right') {
4134 if (
dol_strlen($newstring, $stringencoding) > ($size + ($nodot ? 0 : 1))) {
4136 return dol_substr($newstring, 0, $size, $stringencoding).($nodot ?
'' :
'…');
4141 } elseif ($trunc ==
'middle') {
4143 if (
dol_strlen($newstring, $stringencoding) > 2 &&
dol_strlen($newstring, $stringencoding) > ($size + 1)) {
4144 $size1 = round($size / 2);
4145 $size2 = round($size / 2);
4146 return dol_substr($newstring, 0, $size1, $stringencoding).
'…'.
dol_substr($newstring,
dol_strlen($newstring, $stringencoding) - $size2, $size2, $stringencoding);
4150 } elseif ($trunc ==
'left') {
4152 if (
dol_strlen($newstring, $stringencoding) > ($size + ($nodot ? 0 : 1))) {
4154 return '…'.dol_substr($newstring,
dol_strlen($newstring, $stringencoding) - $size, $size, $stringencoding);
4158 } elseif ($trunc ==
'wrap') {
4160 if (
dol_strlen($newstring, $stringencoding) > ($size + 1)) {
4166 return 'BadParam3CallingDolTrunc';
4191function img_picto($titlealt, $picto, $moreatt =
'', $pictoisfullpath =
false, $srconly = 0, $notitle = 0, $alt =
'', $morecss =
'', $marginleftonlyshort = 2)
4193 global $conf, $langs;
4196 $url = DOL_URL_ROOT;
4197 $theme = isset($conf->theme) ? $conf->theme :
null;
4198 $path =
'theme/'.$theme;
4200 if ($pictoisfullpath) {
4202 if (!preg_match(
'/(\.png|\.gif|\.svg)$/i', $picto)) {
4205 $fullpathpicto = $picto;
4207 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
4208 $morecss .= ($morecss ?
' ' :
'').$reg[1];
4209 $moreatt = str_replace(
'class="'.$reg[1].
'"',
'', $moreatt);
4212 $pictowithouttext = preg_replace(
'/(\.png|\.gif|\.svg)$/',
'', $picto);
4213 $pictowithouttext = str_replace(
'object_',
'', $pictowithouttext);
4214 $pictowithouttext = str_replace(
'_nocolor',
'', $pictowithouttext);
4216 if (strpos($pictowithouttext,
'fontawesome_') !==
false || preg_match(
'/^fa-/', $pictowithouttext)) {
4218 $pictowithouttext = str_replace(
'fontawesome_',
'', $pictowithouttext);
4219 $pictowithouttext = str_replace(
'fa-',
'', $pictowithouttext);
4221 $pictowithouttextarray = explode(
'_', $pictowithouttext);
4222 $marginleftonlyshort = 0;
4224 if (!empty($pictowithouttextarray[1])) {
4226 $fakey =
'fa-'.$pictowithouttextarray[0];
4227 $fa = empty($pictowithouttextarray[1]) ?
'fa' : $pictowithouttextarray[1];
4228 $facolor = empty($pictowithouttextarray[2]) ?
'' : $pictowithouttextarray[2];
4229 $fasize = empty($pictowithouttextarray[3]) ?
'' : $pictowithouttextarray[3];
4231 $fakey =
'fa-'.$pictowithouttext;
4241 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
4242 $morecss .= ($morecss ?
' ' :
'').$reg[1];
4243 $moreatt = str_replace(
'class="'.$reg[1].
'"',
'', $moreatt);
4245 if (preg_match(
'/style="([^"]+)"/', $moreatt, $reg)) {
4246 $morestyle = $reg[1];
4247 $moreatt = str_replace(
'style="'.$reg[1].
'"',
'', $moreatt);
4249 $moreatt = trim($moreatt);
4251 $enabledisablehtml =
'<span class="'.$fa.
' '.$fakey.($marginleftonlyshort ? ($marginleftonlyshort == 1 ?
' marginleftonlyshort' :
' marginleftonly') :
'');
4252 $enabledisablehtml .= ($morecss ?
' '.$morecss :
'').
'" style="'.($fasize ? (
'font-size: '.$fasize.
';') :
'').($facolor ? (
' color: '.$facolor.
';') :
'').($morestyle ?
' '.$morestyle :
'').
'"'.(($notitle || empty($titlealt)) ?
'' :
' title="'.dol_escape_htmltag($titlealt).
'"').($moreatt ?
' '.$moreatt :
'').
'>';
4256 $enabledisablehtml .=
'</span>';
4258 return $enabledisablehtml;
4261 if (empty($srconly) && in_array($pictowithouttext, array(
4262 '1downarrow',
'1uparrow',
'1leftarrow',
'1rightarrow',
'1uparrow_selected',
'1downarrow_selected',
'1leftarrow_selected',
'1rightarrow_selected',
4263 'accountancy',
'accounting_account',
'account',
'accountline',
'action',
'add',
'address',
'angle-double-down',
'angle-double-up',
'asset',
4264 'bank_account',
'barcode',
'bank',
'bell',
'bill',
'billa',
'billr',
'billd',
'birthday-cake',
'bookmark',
'bom',
'briefcase-medical',
'bug',
'building',
4265 'card',
'calendarlist',
'calendar',
'calendarmonth',
'calendarweek',
'calendarday',
'calendarperuser',
'calendarpertype',
4266 'cash-register',
'category',
'chart',
'check',
'clock',
'clone',
'close_title',
'cog',
'collab',
'company',
'contact',
'country',
'contract',
'conversation',
'cron',
'cross',
'cubes',
4267 'currency',
'multicurrency',
4268 'delete',
'dolly',
'dollyrevert',
'donation',
'download',
'dynamicprice',
4269 'edit',
'ellipsis-h',
'email',
'entity',
'envelope',
'eraser',
'establishment',
'expensereport',
'external-link-alt',
'external-link-square-alt',
'eye',
4270 'filter',
'file-code',
'file-export',
'file-import',
'file-upload',
'autofill',
'folder',
'folder-open',
'folder-plus',
4271 'gears',
'generate',
'generic',
'globe',
'globe-americas',
'graph',
'grip',
'grip_title',
'group',
4272 'hands-helping',
'help',
'holiday',
4273 'id-card',
'images',
'incoterm',
'info',
'intervention',
'inventory',
'intracommreport',
'jobprofile',
4274 'knowledgemanagement',
4275 'label',
'language',
'line',
'link',
'list',
'list-alt',
'listlight',
'loan',
'lock',
'lot',
'long-arrow-alt-right',
4276 'margin',
'map-marker-alt',
'member',
'meeting',
'money-bill-alt',
'movement',
'mrp',
'note',
'next',
4277 'off',
'on',
'order',
4278 'paiment',
'paragraph',
'play',
'pdf',
'phone',
'phoning',
'phoning_mobile',
'phoning_fax',
'playdisabled',
'previous',
'poll',
'pos',
'printer',
'product',
'propal',
'proposal',
'puce',
4279 'stock',
'resize',
'service',
'stats',
'trip',
4280 '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',
4281 'github',
'google',
'jabber',
'microsoft',
'skype',
'twitter',
'facebook',
'linkedin',
'instagram',
'snapchat',
'youtube',
'google-plus-g',
'whatsapp',
4282 'chevron-left',
'chevron-right',
'chevron-down',
'chevron-top',
'commercial',
'companies',
4283 'generic',
'home',
'hrm',
'members',
'products',
'invoicing',
4284 'partnership',
'payment',
'payment_vat',
'pencil-ruler',
'pictoconfirm',
'preview',
'project',
'projectpub',
'projecttask',
'question',
'refresh',
'region',
4285 'salary',
'shipment',
'state',
'supplier_invoice',
'supplier_invoicea',
'supplier_invoicer',
'supplier_invoiced',
4286 'technic',
'ticket',
4288 'recent',
'reception',
'recruitmentcandidature',
'recruitmentjobposition',
'replacement',
'resource',
'recurring',
'rss',
4289 'shapes',
'skill',
'square',
'stop-circle',
'supplier',
'supplier_proposal',
'supplier_order',
'supplier_invoice',
4290 'timespent',
'title_setup',
'title_accountancy',
'title_bank',
'title_hrm',
'title_agenda',
4291 'uncheck',
'url',
'user-cog',
'user-injured',
'user-md',
'vat',
'website',
'workstation',
'webhook',
'world',
'private',
4292 'conferenceorbooth',
'eventorganization',
4293 'stamp',
'signature'
4295 $fakey = $pictowithouttext;
4299 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'))) {
4302 if (in_array($pictowithouttext, array(
'black-tie',
'github',
'google',
'microsoft',
'skype',
'twitter',
'facebook',
'linkedin',
'instagram',
'snapchat',
'stripe',
'stripe-s',
'youtube',
'google-plus-g',
'whatsapp'))) {
4306 $arrayconvpictotofa = array(
4307 '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',
4308 'bank_account'=>
'university',
4309 'bill'=>
'file-invoice-dollar',
'billa'=>
'file-excel',
'billr'=>
'file-invoice-dollar',
'billd'=>
'file-medical',
4310 'supplier_invoice'=>
'file-invoice-dollar',
'supplier_invoicea'=>
'file-excel',
'supplier_invoicer'=>
'file-invoice-dollar',
'supplier_invoiced'=>
'file-medical',
4312 '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',
4313 'donation'=>
'file-alt',
'dynamicprice'=>
'hand-holding-usd',
4314 'setup'=>
'cog',
'companies'=>
'building',
'products'=>
'cube',
'commercial'=>
'suitcase',
'invoicing'=>
'coins',
4315 'accounting'=>
'search-dollar',
'category'=>
'tag',
'dollyrevert'=>
'dolly',
4316 'generate'=>
'plus-square',
'hrm'=>
'user-tie',
'incoterm'=>
'truck-loading',
4317 'margin'=>
'calculator',
'members'=>
'user-friends',
'ticket'=>
'ticket-alt',
'globe'=>
'external-link-alt',
'lot'=>
'barcode',
4318 'email'=>
'at',
'establishment'=>
'building',
'edit'=>
'pencil-alt',
'entity'=>
'globe',
4319 'graph'=>
'chart-line',
'grip_title'=>
'arrows-alt',
'grip'=>
'arrows-alt',
'help'=>
'question-circle',
4320 'generic'=>
'file',
'holiday'=>
'umbrella-beach',
4321 'info'=>
'info-circle',
'inventory'=>
'boxes',
'intracommreport'=>
'globe-europe',
'jobprofile'=>
'cogs',
4322 'knowledgemanagement'=>
'ticket-alt',
'label'=>
'layer-group',
'line'=>
'bars',
'loan'=>
'money-bill-alt',
4323 'member'=>
'user-alt',
'meeting'=>
'chalkboard-teacher',
'mrp'=>
'cubes',
'next'=>
'arrow-alt-circle-right',
4324 'trip'=>
'wallet',
'expensereport'=>
'wallet',
'group'=>
'users',
'movement'=>
'people-carry',
4325 'sign-out'=>
'sign-out-alt',
4326 'switch_off'=>
'toggle-off',
'switch_on'=>
'toggle-on',
'switch_on_warning'=>
'toggle-on',
'switch_on_red'=>
'toggle-on',
'check'=>
'check',
'bookmark'=>
'star',
4327 'bank'=>
'university',
'close_title'=>
'times',
'delete'=>
'trash',
'filter'=>
'filter',
4328 'list-alt'=>
'list-alt',
'calendarlist'=>
'bars',
'calendar'=>
'calendar-alt',
'calendarmonth'=>
'calendar-alt',
'calendarweek'=>
'calendar-week',
'calendarday'=>
'calendar-day',
'calendarperuser'=>
'table',
4329 'intervention'=>
'ambulance',
'invoice'=>
'file-invoice-dollar',
'currency'=>
'dollar-sign',
'multicurrency'=>
'dollar-sign',
'order'=>
'file-invoice',
4330 'error'=>
'exclamation-triangle',
'warning'=>
'exclamation-triangle',
4332 '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',
4333 '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',
4334 'recent' =>
'check-square',
'reception'=>
'dolly',
'recruitmentjobposition'=>
'id-card-alt',
'recruitmentcandidature'=>
'id-badge',
4335 'resize'=>
'crop',
'supplier_order'=>
'dol-order_supplier',
'supplier_proposal'=>
'file-signature',
4336 'refresh'=>
'redo',
'region'=>
'map-marked',
'replacement'=>
'exchange-alt',
'resource'=>
'laptop-house',
'recurring'=>
'history',
4337 'service'=>
'concierge-bell',
4338 'skill'=>
'shapes',
'state'=>
'map-marked-alt',
'security'=>
'key',
'salary'=>
'wallet',
'shipment'=>
'dolly',
'stock'=>
'box-open',
'stats' =>
'chart-bar',
'split'=>
'code-branch',
'stripe'=>
'stripe-s',
4339 'supplier'=>
'building',
'technic'=>
'cogs',
4340 'timespent'=>
'clock',
'title_setup'=>
'tools',
'title_accountancy'=>
'money-check-alt',
'title_bank'=>
'university',
'title_hrm'=>
'umbrella-beach',
4341 'title_agenda'=>
'calendar-alt',
4342 'uncheck'=>
'times',
'uparrow'=>
'share',
'url'=>
'external-link-alt',
'vat'=>
'money-check-alt',
'vcard'=>
'arrow-alt-circle-down',
4343 'jabber'=>
'comment-o',
4344 'website'=>
'globe-americas',
'workstation'=>
'pallet',
'webhook'=>
'bullseye',
'world'=>
'globe',
'private'=>
'user-lock',
4345 'conferenceorbooth'=>
'chalkboard-teacher',
'eventorganization'=>
'project-diagram'
4347 if ($pictowithouttext ==
'off') {
4348 $fakey =
'fa-square';
4350 } elseif ($pictowithouttext ==
'on') {
4351 $fakey =
'fa-check-square';
4353 } elseif ($pictowithouttext ==
'listlight') {
4354 $fakey =
'fa-download';
4355 $marginleftonlyshort = 1;
4356 } elseif ($pictowithouttext ==
'printer') {
4357 $fakey =
'fa-print';
4359 } elseif ($pictowithouttext ==
'note') {
4360 $fakey =
'fa-sticky-note';
4361 $marginleftonlyshort = 1;
4362 } elseif (in_array($pictowithouttext, array(
'1uparrow',
'1downarrow',
'1leftarrow',
'1rightarrow',
'1uparrow_selected',
'1downarrow_selected',
'1leftarrow_selected',
'1rightarrow_selected'))) {
4363 $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');
4364 $fakey =
'fa-'.$convertarray[$pictowithouttext];
4365 if (preg_match(
'/selected/', $pictowithouttext)) {
4368 $marginleftonlyshort = 1;
4369 } elseif (!empty($arrayconvpictotofa[$pictowithouttext])) {
4370 $fakey =
'fa-'.$arrayconvpictotofa[$pictowithouttext];
4372 $fakey =
'fa-'.$pictowithouttext;
4375 if (in_array($pictowithouttext, array(
'dollyrevert',
'member',
'members',
'contract',
'group',
'resource',
'shipment'))) {
4376 $morecss .=
' em092';
4378 if (in_array($pictowithouttext, array(
'conferenceorbooth',
'collab',
'eventorganization',
'holiday',
'info',
'project',
'workstation'))) {
4379 $morecss .=
' em088';
4381 if (in_array($pictowithouttext, array(
'asset',
'intervention',
'payment',
'loan',
'partnership',
'stock',
'technic'))) {
4382 $morecss .=
' em080';
4386 $arrayconvpictotomarginleftonly = array(
4387 'bank',
'check',
'delete',
'generic',
'grip',
'grip_title',
'jabber',
4388 'grip_title',
'grip',
'listlight',
'note',
'on',
'off',
'playdisabled',
'printer',
'resize',
'sign-out',
'stats',
'switch_on',
'switch_on_red',
'switch_off',
4389 'uparrow',
'1uparrow',
'1downarrow',
'1leftarrow',
'1rightarrow',
'1uparrow_selected',
'1downarrow_selected',
'1leftarrow_selected',
'1rightarrow_selected'
4391 if (!isset($arrayconvpictotomarginleftonly[$pictowithouttext])) {
4392 $marginleftonlyshort = 0;
4396 $arrayconvpictotomorcess = array(
4397 'action'=>
'infobox-action',
'account'=>
'infobox-bank_account',
'accounting_account'=>
'infobox-bank_account',
'accountline'=>
'infobox-bank_account',
'accountancy'=>
'infobox-bank_account',
'asset'=>
'infobox-bank_account',
4398 'bank_account'=>
'infobox-bank_account',
4399 'bill'=>
'infobox-commande',
'billa'=>
'infobox-commande',
'billr'=>
'infobox-commande',
'billd'=>
'infobox-commande',
4400 'margin'=>
'infobox-bank_account',
'conferenceorbooth'=>
'infobox-project',
4401 'cash-register'=>
'infobox-bank_account',
'contract'=>
'infobox-contrat',
'check'=>
'font-status4',
'collab'=>
'infobox-action',
'conversation'=>
'infobox-contrat',
4402 'donation'=>
'infobox-commande',
'dolly'=>
'infobox-commande',
'dollyrevert'=>
'flip infobox-order_supplier',
4403 'ecm'=>
'infobox-action',
'eventorganization'=>
'infobox-project',
4404 'hrm'=>
'infobox-adherent',
'group'=>
'infobox-adherent',
'intervention'=>
'infobox-contrat',
4405 'incoterm'=>
'infobox-supplier_proposal',
4406 'currency'=>
'infobox-bank_account',
'multicurrency'=>
'infobox-bank_account',
4407 'members'=>
'infobox-adherent',
'member'=>
'infobox-adherent',
'money-bill-alt'=>
'infobox-bank_account',
4408 'order'=>
'infobox-commande',
4409 'user'=>
'infobox-adherent',
'users'=>
'infobox-adherent',
4410 'error'=>
'pictoerror',
'warning'=>
'pictowarning',
'switch_on'=>
'font-status4',
'switch_on_warning'=>
'font-status4 warning',
'switch_on_red'=>
'font-status8',
4411 'holiday'=>
'infobox-holiday',
'info'=>
'opacityhigh',
'invoice'=>
'infobox-commande',
4412 'knowledgemanagement'=>
'infobox-contrat rotate90',
'loan'=>
'infobox-bank_account',
4413 'payment'=>
'infobox-bank_account',
'payment_vat'=>
'infobox-bank_account',
'poll'=>
'infobox-adherent',
'pos'=>
'infobox-bank_account',
'project'=>
'infobox-project',
'projecttask'=>
'infobox-project',
4414 'propal'=>
'infobox-propal',
'proposal'=>
'infobox-propal',
'private'=>
'infobox-project',
4415 'reception'=>
'flip',
'recruitmentjobposition'=>
'infobox-adherent',
'recruitmentcandidature'=>
'infobox-adherent',
4416 'resource'=>
'infobox-action',
4417 'salary'=>
'infobox-bank_account',
'shipment'=>
'infobox-commande',
'supplier_invoice'=>
'infobox-order_supplier',
'supplier_invoicea'=>
'infobox-order_supplier',
'supplier_invoiced'=>
'infobox-order_supplier',
4418 'supplier'=>
'infobox-order_supplier',
'supplier_order'=>
'infobox-order_supplier',
'supplier_proposal'=>
'infobox-supplier_proposal',
4419 'ticket'=>
'infobox-contrat',
'title_accountancy'=>
'infobox-bank_account',
'title_hrm'=>
'infobox-holiday',
'expensereport'=>
'infobox-expensereport',
'trip'=>
'infobox-expensereport',
'title_agenda'=>
'infobox-action',
4420 'vat'=>
'infobox-bank_account',
4422 'list-alt'=>
'imgforviewmode',
'calendar'=>
'imgforviewmode',
'calendarweek'=>
'imgforviewmode',
'calendarmonth'=>
'imgforviewmode',
'calendarday'=>
'imgforviewmode',
'calendarperuser'=>
'imgforviewmode'
4424 if (!empty($arrayconvpictotomorcess[$pictowithouttext]) && strpos($picto,
'_nocolor') ===
false) {
4425 $morecss .= ($morecss ?
' ' :
'').$arrayconvpictotomorcess[$pictowithouttext];
4429 $arrayconvpictotocolor = array(
4430 'address'=>
'#6c6aa8',
'building'=>
'#6c6aa8',
'bom'=>
'#a69944',
4431 'clone'=>
'#999',
'cog'=>
'#999',
'companies'=>
'#6c6aa8',
'company'=>
'#6c6aa8',
'contact'=>
'#6c6aa8',
'cron'=>
'#555',
4432 'dynamicprice'=>
'#a69944',
4433 'edit'=>
'#444',
'note'=>
'#999',
'error'=>
'',
'help'=>
'#bbb',
'listlight'=>
'#999',
'language'=>
'#555',
4435 'lock'=>
'#ddd',
'lot'=>
'#a69944',
4436 'map-marker-alt'=>
'#aaa',
'mrp'=>
'#a69944',
'product'=>
'#a69944',
'service'=>
'#a69944',
'inventory'=>
'#a69944',
'stock'=>
'#a69944',
'movement'=>
'#a69944',
4437 'other'=>
'#ddd',
'world'=>
'#986c6a',
4438 'partnership'=>
'#6c6aa8',
'playdisabled'=>
'#ccc',
'printer'=>
'#444',
'projectpub'=>
'#986c6a',
'reception'=>
'#a69944',
'resize'=>
'#444',
'rss'=>
'#cba',
4440 'security'=>
'#999',
'square'=>
'#888',
'stop-circle'=>
'#888',
'stats'=>
'#444',
'switch_off'=>
'#999',
'technic'=>
'#999',
'timespent'=>
'#555',
4441 'uncheck'=>
'#800',
'uparrow'=>
'#555',
'user-cog'=>
'#999',
'country'=>
'#aaa',
'globe-americas'=>
'#aaa',
'region'=>
'#aaa',
'state'=>
'#aaa',
4442 'website'=>
'#304',
'workstation'=>
'#a69944'
4444 if (isset($arrayconvpictotocolor[$pictowithouttext]) && strpos($picto,
'_nocolor') ===
false) {
4445 $facolor = $arrayconvpictotocolor[$pictowithouttext];
4452 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
4453 $morecss .= ($morecss ?
' ' :
'').$reg[1];
4454 $moreatt = str_replace(
'class="'.$reg[1].
'"',
'', $moreatt);
4456 if (preg_match(
'/style="([^"]+)"/', $moreatt, $reg)) {
4457 $morestyle = $reg[1];
4458 $moreatt = str_replace(
'style="'.$reg[1].
'"',
'', $moreatt);
4460 $moreatt = trim($moreatt);
4462 $enabledisablehtml =
'<span class="'.$fa.
' '.$fakey.($marginleftonlyshort ? ($marginleftonlyshort == 1 ?
' marginleftonlyshort' :
' marginleftonly') :
'');
4463 $enabledisablehtml .= ($morecss ?
' '.$morecss :
'').
'" style="'.($fasize ? (
'font-size: '.$fasize.
';') :
'').($facolor ? (
' color: '.$facolor.
';') :
'').($morestyle ?
' '.$morestyle :
'').
'"'.(($notitle || empty($titlealt)) ?
'' :
' title="'.dol_escape_htmltag($titlealt).
'"').($moreatt ?
' '.$moreatt :
'').
'>';
4467 $enabledisablehtml .=
'</span>';
4469 return $enabledisablehtml;
4472 if (!empty($conf->global->MAIN_OVERWRITE_THEME_PATH)) {
4473 $path = $conf->global->MAIN_OVERWRITE_THEME_PATH.
'/theme/'.$theme;
4474 } elseif (!empty($conf->global->MAIN_OVERWRITE_THEME_RES)) {
4475 $path = $conf->global->MAIN_OVERWRITE_THEME_RES.
'/theme/'.$conf->global->MAIN_OVERWRITE_THEME_RES;
4476 } elseif (!empty($conf->modules_parts[
'theme']) && array_key_exists($theme, $conf->modules_parts[
'theme'])) {
4477 $path = $theme.
'/theme/'.$theme;
4482 if (preg_match(
'/^([^@]+)@([^@]+)$/i', $picto, $regs)) {
4488 if (!preg_match(
'/(\.png|\.gif|\.svg)$/i', $picto)) {
4493 foreach ($conf->file->dol_document_root as $type => $dirroot) {
4494 if ($type ==
'main') {
4498 if (file_exists($dirroot.
'/'.$path.
'/img/'.$picto)) {
4499 $url = DOL_URL_ROOT.$conf->file->dol_url_root[$type];
4505 $fullpathpicto = $url.
'/'.$path.
'/img/'.$picto;
4509 return $fullpathpicto;
4513 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 :
'').
'"').
'>';
4529function img_object($titlealt, $picto, $moreatt =
'', $pictoisfullpath =
false, $srconly = 0, $notitle = 0)
4531 if (strpos($picto,
'^') === 0) {
4532 return img_picto($titlealt, str_replace(
'^',
'', $picto), $moreatt, $pictoisfullpath, $srconly, $notitle);
4534 return img_picto($titlealt,
'object_'.$picto, $moreatt, $pictoisfullpath, $srconly, $notitle);
4549function img_weather($titlealt, $picto, $moreatt =
'', $pictoisfullpath = 0, $morecss =
'')
4553 if (is_numeric($picto)) {
4556 return '<i class="fa fa-weather-level'.$picto.
'"></i>';
4557 } elseif (!preg_match(
'/(\.png|\.gif)$/i', $picto)) {
4561 $path = DOL_URL_ROOT.
'/theme/'.$conf->theme.
'/img/weather/'.$picto;
4563 return img_picto($titlealt, $path, $moreatt, 1, 0, 0,
'', $morecss);
4581 if (!preg_match(
'/(\.png|\.gif)$/i', $picto)) {
4585 if ($pictoisfullpath) {
4588 $path = DOL_URL_ROOT.
'/theme/common/'.$picto;
4590 if (!empty($conf->global->MAIN_MODULE_CAN_OVERWRITE_COMMONICONS)) {
4591 $themepath = DOL_DOCUMENT_ROOT.
'/theme/'.$conf->theme.
'/img/'.$picto;
4593 if (file_exists($themepath)) {
4599 return img_picto($titlealt, $path, $moreatt, 1, 0, $notitle);
4615function img_action($titlealt, $numaction, $picto =
'', $moreatt =
'')
4619 if (empty($titlealt) || $titlealt ==
'default') {
4620 if ($numaction ==
'-1' || $numaction ==
'ST_NO') {
4622 $titlealt = $langs->transnoentitiesnoconv(
'ChangeDoNotContact');
4623 } elseif ($numaction ==
'0' || $numaction ==
'ST_NEVER') {
4625 $titlealt = $langs->transnoentitiesnoconv(
'ChangeNeverContacted');
4626 } elseif ($numaction ==
'1' || $numaction ==
'ST_TODO') {
4628 $titlealt = $langs->transnoentitiesnoconv(
'ChangeToContact');
4629 } elseif ($numaction ==
'2' || $numaction ==
'ST_PEND') {
4631 $titlealt = $langs->transnoentitiesnoconv(
'ChangeContactInProcess');
4632 } elseif ($numaction ==
'3' || $numaction ==
'ST_DONE') {
4634 $titlealt = $langs->transnoentitiesnoconv(
'ChangeContactDone');
4636 $titlealt = $langs->transnoentitiesnoconv(
'ChangeStatus '.$numaction);
4640 if (!is_numeric($numaction)) {
4644 return img_picto($titlealt, (empty($picto) ?
'stcomm'.$numaction.
'.png' : $picto), $moreatt);
4658 if ($titlealt ==
'default') {
4659 $titlealt = $langs->trans(
'Show');
4662 return img_picto($titlealt,
'pdf'.$size.
'.png');
4676 if ($titlealt ==
'default') {
4677 $titlealt = $langs->trans(
'Add');
4680 return img_picto($titlealt,
'edit_add.png', $other);
4693 if ($titlealt ==
'default') {
4694 $titlealt = $langs->trans(
'Remove');
4697 return img_picto($titlealt,
'edit_remove.png', $other);
4708function img_edit($titlealt =
'default', $float = 0, $other =
'')
4712 if ($titlealt ==
'default') {
4713 $titlealt = $langs->trans(
'Modify');
4716 return img_picto($titlealt,
'edit.png', ($float ?
'style="float: '.($langs->tab_translate[
"DIRECTION"] ==
'rtl' ?
'left' :
'right').
'"' :
"").($other ?
' '.$other :
''));
4727function img_view($titlealt =
'default', $float = 0, $other =
'class="valignmiddle"')
4731 if ($titlealt ==
'default') {
4732 $titlealt = $langs->trans(
'View');
4735 $moreatt = ($float ?
'style="float: right" ' :
'').$other;
4737 return img_picto($titlealt,
'eye', $moreatt);
4748function img_delete($titlealt =
'default', $other =
'class="pictodelete"', $morecss =
'')
4752 if ($titlealt ==
'default') {
4753 $titlealt = $langs->trans(
'Delete');
4756 return img_picto($titlealt,
'delete.png', $other,
false, 0, 0,
'', $morecss);
4769 if ($titlealt ==
"default") {
4770 $titlealt = $langs->trans(
"Print");
4772 return img_picto($titlealt,
'printer.png', $other);
4782function img_split($titlealt =
'default', $other =
'class="pictosplit"')
4786 if ($titlealt ==
'default') {
4787 $titlealt = $langs->trans(
'Split');
4790 return img_picto($titlealt,
'split.png', $other);
4805 if (is_string($usealttitle)) {
4808 $usealttitle = $langs->trans(
'Info');
4812 return img_picto($usealttitle,
'info.png',
'style="vertical-align: middle;'.($usehelpcursor == 1 ?
' cursor: help' : ($usehelpcursor == 2 ?
' cursor: pointer' :
'')).
'"');
4825 if ($titlealt ==
'default') {
4826 $titlealt = $langs->trans(
'Informations');
4829 return img_picto($titlealt,
'info.png',
'style="vertical-align: middle;"');
4840function img_warning($titlealt =
'default', $moreatt =
'', $morecss =
'pictowarning')
4844 if ($titlealt ==
'default') {
4845 $titlealt = $langs->trans(
'Warning');
4849 return img_picto($titlealt,
'warning.png',
'class="'.$morecss.
'"'.($moreatt ? ($moreatt ==
'1' ?
' style="float: right"' :
' '.$moreatt) :
''));
4862 if ($titlealt ==
'default') {
4863 $titlealt = $langs->trans(
'Error');
4866 return img_picto($titlealt,
'error.png');
4880 if ($titlealt ==
'default') {
4881 $titlealt = $langs->trans(
'Next');
4885 return '<span class="fa fa-chevron-right paddingright paddingleft" title="'.dol_escape_htmltag($titlealt).
'"></span>';
4899 if ($titlealt ==
'default') {
4900 $titlealt = $langs->trans(
'Previous');
4904 return '<span class="fa fa-chevron-left paddingright paddingleft" title="'.dol_escape_htmltag($titlealt).
'"></span>';
4915function img_down($titlealt =
'default', $selected = 0, $moreclass =
'')
4919 if ($titlealt ==
'default') {
4920 $titlealt = $langs->trans(
'Down');
4923 return img_picto($titlealt, ($selected ?
'1downarrow_selected.png' :
'1downarrow.png'),
'class="imgdown'.($moreclass ?
" ".$moreclass :
"").
'"');
4934function img_up($titlealt =
'default', $selected = 0, $moreclass =
'')
4938 if ($titlealt ==
'default') {
4939 $titlealt = $langs->trans(
'Up');
4942 return img_picto($titlealt, ($selected ?
'1uparrow_selected.png' :
'1uparrow.png'),
'class="imgup'.($moreclass ?
" ".$moreclass :
"").
'"');
4953function img_left($titlealt =
'default', $selected = 0, $moreatt =
'')
4957 if ($titlealt ==
'default') {
4958 $titlealt = $langs->trans(
'Left');
4961 return img_picto($titlealt, ($selected ?
'1leftarrow_selected.png' :
'1leftarrow.png'), $moreatt);
4972function img_right($titlealt =
'default', $selected = 0, $moreatt =
'')
4976 if ($titlealt ==
'default') {
4977 $titlealt = $langs->trans(
'Right');
4980 return img_picto($titlealt, ($selected ?
'1rightarrow_selected.png' :
'1rightarrow.png'), $moreatt);
4994 if ($titlealt ==
'default') {
4995 $titlealt = $langs->trans(
'Active');
4999 return img_picto($titlealt,
'tick.png');
5014 if (is_null($morecss)) {
5018 if ($brand ==
'visa' || $brand ==
'Visa') {
5020 } elseif ($brand ==
'mastercard' || $brand ==
'MasterCard') {
5021 $brand =
'cc-mastercard';
5022 } elseif ($brand ==
'amex' || $brand ==
'American Express') {
5024 } elseif ($brand ==
'discover' || $brand ==
'Discover') {
5025 $brand =
'cc-discover';
5026 } elseif ($brand ==
'jcb' || $brand ==
'JCB') {
5028 } elseif ($brand ==
'diners' || $brand ==
'Diners club') {
5029 $brand =
'cc-diners-club';
5030 } elseif (!in_array($brand, array(
'cc-visa',
'cc-mastercard',
'cc-amex',
'cc-discover',
'cc-jcb',
'cc-diners-club'))) {
5031 $brand =
'credit-card';
5034 return '<span class="fa fa-'.$brand.
' fa-fw'.($morecss ?
' '.$morecss :
'').
'"></span>';
5047 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
5053 if (empty($titlealt)) {
5054 $titlealt =
'Mime type: '.$mimetype;
5058 return '<i class="fa fa-'.$mimefa.
' paddingright'.($morecss ?
' '.$morecss :
'').
'"'.($titlealt ?
' title="'.$titlealt.
'"' :
'').
'></i>';
5071 global $conf, $langs;
5073 if ($titlealt ==
'default') {
5074 $titlealt = $langs->trans(
'Search');
5077 $img =
img_picto($titlealt,
'search.png', $other,
false, 1);
5079 $input =
'<input type="image" class="liste_titre" name="button_search" src="'.$img.
'" ';
5080 $input .=
'value="'.dol_escape_htmltag($titlealt).
'" title="'.
dol_escape_htmltag($titlealt).
'" >';
5094 global $conf, $langs;
5096 if ($titlealt ==
'default') {
5097 $titlealt = $langs->trans(
'Search');
5100 $img =
img_picto($titlealt,
'searchclear.png', $other,
false, 1);
5102 $input =
'<input type="image" class="liste_titre" name="button_removefilter" src="'.$img.
'" ';
5103 $input .=
'value="'.dol_escape_htmltag($titlealt).
'" title="'.
dol_escape_htmltag($titlealt).
'" >';
5119function info_admin($text, $infoonimgalt = 0, $nodiv = 0, $admin =
'1', $morecss =
'hideonsmartphone', $textfordropdown =
'')
5121 global $conf, $langs;
5123 if ($infoonimgalt) {
5124 $result =
img_picto($text,
'info',
'class="'.($morecss ?
' '.$morecss :
'').
'"');
5126 if (empty($conf->use_javascript_ajax)) {
5127 $textfordropdown =
'';
5130 $class = (empty($admin) ?
'undefined' : ($admin ==
'1' ?
'info' : $admin));
5131 $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>');
5133 if ($textfordropdown) {
5134 $tmpresult =
'<span class="'.$class.
'text opacitymedium cursorpointer">'.$langs->trans($textfordropdown).
' '.
img_picto($langs->trans($textfordropdown),
'1downarrow').
'</span>';
5135 $tmpresult .=
'<script nonce="'.getNonce().
'" type="text/javascript">
5136 jQuery(document).ready(function() {
5137 jQuery(".'.$class.
'text").click(function() {
5138 console.log("toggle text");
5139 jQuery(".'.$class.
'").toggle();
5144 $result = $tmpresult.$result;
5165 global $conf, $langs, $argv;
5166 global $dolibarr_main_prod;
5173 require_once DOL_DOCUMENT_ROOT.
'/core/class/translate.class.php';
5175 $langs->load(
"main");
5179 $langs->loadLangs(array(
'main',
'errors'));
5181 if ($_SERVER[
'DOCUMENT_ROOT']) {
5182 $out .= $langs->trans(
"DolibarrHasDetectedError").
".<br>\n";
5184 $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";
5186 $out .= $langs->trans(
"InformationToHelpDiagnose").
":<br>\n";
5188 $out .=
"<b>".$langs->trans(
"Date").
":</b> ".
dol_print_date(time(),
'dayhourlog').
"<br>\n";
5189 $out .=
"<b>".$langs->trans(
"Dolibarr").
":</b> ".DOL_VERSION.
" - https://www.dolibarr.org<br>\n";
5190 if (isset($conf->global->MAIN_FEATURES_LEVEL)) {
5191 $out .=
"<b>".$langs->trans(
"LevelOfFeature").
":</b> ".
getDolGlobalInt(
'MAIN_FEATURES_LEVEL').
"<br>\n";
5193 if (function_exists(
"phpversion")) {
5194 $out .=
"<b>".$langs->trans(
"PHP").
":</b> ".phpversion().
"<br>\n";
5196 $out .=
"<b>".$langs->trans(
"Server").
":</b> ".(isset($_SERVER[
"SERVER_SOFTWARE"]) ?
dol_htmlentities($_SERVER[
"SERVER_SOFTWARE"], ENT_COMPAT) :
'').
"<br>\n";
5197 if (function_exists(
"php_uname")) {
5198 $out .=
"<b>".$langs->trans(
"OS").
":</b> ".php_uname().
"<br>\n";
5200 $out .=
"<b>".$langs->trans(
"UserAgent").
":</b> ".(isset($_SERVER[
"HTTP_USER_AGENT"]) ?
dol_htmlentities($_SERVER[
"HTTP_USER_AGENT"], ENT_COMPAT) :
'').
"<br>\n";
5202 $out .=
"<b>".$langs->trans(
"RequestedUrl").
":</b> ".
dol_htmlentities($_SERVER[
"REQUEST_URI"], ENT_COMPAT).
"<br>\n";
5203 $out .=
"<b>".$langs->trans(
"Referer").
":</b> ".(isset($_SERVER[
"HTTP_REFERER"]) ?
dol_htmlentities($_SERVER[
"HTTP_REFERER"], ENT_COMPAT) :
'').
"<br>\n";
5204 $out .=
"<b>".$langs->trans(
"MenuManager").
":</b> ".(isset($conf->standard_menu) ?
dol_htmlentities($conf->standard_menu, ENT_COMPAT) :
'').
"<br>\n";
5206 $syslog .=
"url=".dol_escape_htmltag($_SERVER[
"REQUEST_URI"]);
5207 $syslog .=
", query_string=".dol_escape_htmltag($_SERVER[
"QUERY_STRING"]);
5209 $out .=
'> '.$langs->transnoentities(
"ErrorInternalErrorDetected").
":\n".$argv[0].
"\n";
5210 $syslog .=
"pid=".dol_getmypid();
5213 if (!empty($conf->modules)) {
5214 $out .=
"<b>".$langs->trans(
"Modules").
":</b> ".join(
', ', $conf->modules).
"<br>\n";
5217 if (is_object($db)) {
5218 if ($_SERVER[
'DOCUMENT_ROOT']) {
5219 $out .=
"<b>".$langs->trans(
"DatabaseTypeManager").
":</b> ".$db->type.
"<br>\n";
5220 $lastqueryerror = $db->lastqueryerror();
5222 $lastqueryerror =
"SQL error string is not a valid UTF8 string. We can't show it.";
5224 $out .=
"<b>".$langs->trans(
"RequestLastAccessInError").
":</b> ".($lastqueryerror ?
dol_escape_htmltag($lastqueryerror) : $langs->trans(
"ErrorNoRequestInError")).
"<br>\n";
5225 $out .=
"<b>".$langs->trans(
"ReturnCodeLastAccessInError").
":</b> ".($db->lasterrno() ?
dol_escape_htmltag($db->lasterrno()) : $langs->trans(
"ErrorNoRequestInError")).
"<br>\n";
5226 $out .=
"<b>".$langs->trans(
"InformationLastAccessInError").
":</b> ".($db->lasterror() ?
dol_escape_htmltag($db->lasterror()) : $langs->trans(
"ErrorNoRequestInError")).
"<br>\n";
5230 $out .=
'> '.$langs->transnoentities(
"DatabaseTypeManager").
":\n".$db->type.
"\n";
5231 $out .=
'> '.$langs->transnoentities(
"RequestLastAccessInError").
":\n".($db->lastqueryerror() ? $db->lastqueryerror() : $langs->transnoentities(
"ErrorNoRequestInError")).
"\n";
5232 $out .=
'> '.$langs->transnoentities(
"ReturnCodeLastAccessInError").
":\n".($db->lasterrno() ? $db->lasterrno() : $langs->transnoentities(
"ErrorNoRequestInError")).
"\n";
5233 $out .=
'> '.$langs->transnoentities(
"InformationLastAccessInError").
":\n".($db->lasterror() ? $db->lasterror() : $langs->transnoentities(
"ErrorNoRequestInError")).
"\n";
5235 $syslog .=
", sql=".$db->lastquery();
5236 $syslog .=
", db_error=".$db->lasterror();
5239 if ($error || $errors) {
5240 $langs->load(
"errors");
5243 if (is_array($error) && is_array($errors)) {
5244 $errors = array_merge($error, $errors);
5245 } elseif (is_array($error)) {
5247 } elseif (is_array($errors)) {
5248 $errors = array_merge(array($error), $errors);
5250 $errors = array_merge(array($error), array($errors));
5253 foreach ($errors as $msg) {
5257 if ($_SERVER[
'DOCUMENT_ROOT']) {
5261 $out .=
'> '.$langs->transnoentities(
"Message").
":\n".$msg.
"\n";
5263 $syslog .=
", msg=".$msg;
5266 if (empty($dolibarr_main_prod) && $_SERVER[
'DOCUMENT_ROOT'] && function_exists(
'xdebug_print_function_stack') && function_exists(
'xdebug_call_file')) {
5267 xdebug_print_function_stack();
5268 $out .=
'<b>XDebug informations:</b>'.
"<br>\n";
5269 $out .=
'File: '.xdebug_call_file().
"<br>\n";
5270 $out .=
'Line: '.xdebug_call_line().
"<br>\n";
5271 $out .=
'Function: '.xdebug_call_function().
"<br>\n";
5276 if (!headers_sent()) {
5277 if (function_exists(
'top_httphead')) {
5281 http_response_code(202);
5284 if (empty($dolibarr_main_prod)) {
5287 if (empty($langs->defaultlang)) {
5288 $langs->setDefaultLang();
5290 $langs->loadLangs(array(
"main",
"errors"));
5292 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";
5293 print $langs->trans(
"DolibarrHasDetectedError").
'. ';
5294 print $langs->trans(
"YouCanSetOptionDolibarrMainProdToZero");
5295 if (!defined(
"MAIN_CORE_ERROR")) {
5296 define(
"MAIN_CORE_ERROR", 1);
5313function dol_print_error_email($prefixcode, $errormessage =
'', $errormessages = array(), $morecss =
'error', $email =
'')
5315 global $langs, $conf;
5317 if (empty($email)) {
5318 $email = $conf->global->MAIN_INFO_SOCIETE_MAIL;
5321 $langs->load(
"errors");
5324 print
'<br><div class="center login_main_message"><div class="'.$morecss.
'">';
5325 print $langs->trans(
"ErrorContactEMail", $email, $prefixcode.
'-'.
dol_print_date($now,
'%Y%m%d%H%M%S'));
5326 if ($errormessage) {
5327 print
'<br><br>'.$errormessage;
5329 if (is_array($errormessages) && count($errormessages)) {
5330 foreach ($errormessages as $mesgtoshow) {
5331 print
'<br><br>'.$mesgtoshow;
5334 print
'</div></div>';
5353function print_liste_field_titre($name, $file =
"", $field =
"", $begin =
"", $moreparam =
"", $moreattrib =
"", $sortfield =
"", $sortorder =
"", $prefix =
"", $tooltip =
"", $forcenowrapcolumntitle = 0)
5355 print
getTitleFieldOfList($name, 0, $file, $field, $begin, $moreparam, $moreattrib, $sortfield, $sortorder, $prefix, 0, $tooltip, $forcenowrapcolumntitle);
5376function getTitleFieldOfList($name, $thead = 0, $file =
"", $field =
"", $begin =
"", $moreparam =
"", $moreattrib =
"", $sortfield =
"", $sortorder =
"", $prefix =
"", $disablesortlink = 0, $tooltip =
'', $forcenowrapcolumntitle = 0)
5378 global $conf, $langs, $form;
5381 if ($moreattrib ==
'class="right"') {
5382 $prefix .=
'right ';
5385 $sortorder = strtoupper($sortorder);
5394 $tmpsortfield = explode(
',', $sortfield);
5395 $sortfield1 = trim($tmpsortfield[0]);
5396 $tmpfield = explode(
',', $field);
5397 $field1 = trim($tmpfield[0]);
5399 if (empty($conf->global->MAIN_DISABLE_WRAPPING_ON_COLUMN_TITLE) && empty($forcenowrapcolumntitle)) {
5400 $prefix =
'wrapcolumntitle '.$prefix;
5406 $liste_titre =
'liste_titre';
5407 if ($field1 && ($sortfield1 == $field1 || $sortfield1 == preg_replace(
"/^[^\.]+\./",
"", $field1))) {
5408 $liste_titre =
'liste_titre_sel';
5411 $tagstart =
'<'.$tag.
' class="'.$prefix.$liste_titre.
'" '.$moreattrib;
5413 $tagstart .= ($name && empty($conf->global->MAIN_DISABLE_WRAPPING_ON_COLUMN_TITLE) && empty($forcenowrapcolumntitle) && !
dol_textishtml($name)) ?
' title="'.
dol_escape_htmltag($langs->trans($name)).
'"' :
'';
5416 if (empty($thead) && $field && empty($disablesortlink)) {
5417 $options = preg_replace(
'/sortfield=([a-zA-Z0-9,\s\.]+)/i',
'', (is_scalar($moreparam) ? $moreparam :
''));
5418 $options = preg_replace(
'/sortorder=([a-zA-Z0-9,\s\.]+)/i',
'', $options);
5419 $options = preg_replace(
'/&+/i',
'&', $options);
5420 if (!preg_match(
'/^&/', $options)) {
5421 $options =
'&'.$options;
5424 $sortordertouseinlink =
'';
5425 if ($field1 != $sortfield1) {
5426 if (preg_match(
'/^DESC/i', $sortorder)) {
5427 $sortordertouseinlink .= str_repeat(
'desc,', count(explode(
',', $field)));
5429 $sortordertouseinlink .= str_repeat(
'asc,', count(explode(
',', $field)));
5432 if (preg_match(
'/^ASC/i', $sortorder)) {
5433 $sortordertouseinlink .= str_repeat(
'desc,', count(explode(
',', $field)));
5435 $sortordertouseinlink .= str_repeat(
'asc,', count(explode(
',', $field)));
5438 $sortordertouseinlink = preg_replace(
'/,$/',
'', $sortordertouseinlink);
5439 $out .=
'<a class="reposition" href="'.$file.
'?sortfield='.$field.
'&sortorder='.$sortordertouseinlink.
'&begin='.$begin.$options.
'"';
5445 if (preg_match(
'/:\w+$/', $tooltip)) {
5446 $tmptooltip = explode(
':', $tooltip);
5448 $tmptooltip = array($tooltip);
5450 $out .= $form->textwithpicto($langs->trans($name), $langs->trans($tmptooltip[0]), 1,
'help',
'', 0, 3, (empty($tmptooltip[1]) ?
'' :
'extra_'.str_replace(
'.',
'_', $field).
'_'.$tmptooltip[1]));
5452 $out .= $langs->trans($name);
5455 if (empty($thead) && $field && empty($disablesortlink)) {
5459 if (empty($thead) && $field) {
5460 $options = preg_replace(
'/sortfield=([a-zA-Z0-9,\s\.]+)/i',
'', (is_scalar($moreparam) ? $moreparam :
''));
5461 $options = preg_replace(
'/sortorder=([a-zA-Z0-9,\s\.]+)/i',
'', $options);
5462 $options = preg_replace(
'/&+/i',
'&', $options);
5463 if (!preg_match(
'/^&/', $options)) {
5464 $options =
'&'.$options;
5467 if (!$sortorder || ($field1 != $sortfield1)) {
5471 if (preg_match(
'/^DESC/', $sortorder)) {
5474 $sortimg .=
'<span class="nowrap">'.img_up(
"Z-A", 0,
'paddingright').
'</span>';
5476 if (preg_match(
'/^ASC/', $sortorder)) {
5479 $sortimg .=
'<span class="nowrap">'.img_down(
"A-Z", 0,
'paddingright').
'</span>';
5484 $tagend =
'</'.$tag.
'>';
5486 $out = $tagstart.$sortimg.$out.$tagend;
5501 dol_syslog(__FUNCTION__.
" is deprecated", LOG_WARNING);
5503 print
'<div class="titre">'.$title.
'</div>';
5535function load_fiche_titre($titre, $morehtmlright =
'', $picto =
'generic', $pictoisfullpath = 0, $id =
'', $morecssontable =
'', $morehtmlcenter =
'')
5541 if ($picto ==
'setup') {
5546 $return .=
'<table '.($id ?
'id="'.$id.
'" ' :
'').
'class="centpercent notopnoleftnoright table-fiche-title'.($morecssontable ?
' '.$morecssontable :
'').
'">';
5547 $return .=
'<tr class="titre">';
5549 $return .=
'<td class="nobordernopadding widthpictotitle valignmiddle col-picto">'.img_picto(
'', $picto,
'class="valignmiddle widthpictotitle pictotitle"', $pictoisfullpath).
'</td>';
5551 $return .=
'<td class="nobordernopadding valignmiddle col-title">';
5552 $return .=
'<div class="titre inline-block">'.$titre.
'</div>';
5555 $return .=
'<td class="nobordernopadding center valignmiddle col-center">'.$morehtmlcenter.
'</td>';
5558 $return .=
'<td class="nobordernopadding titre_right wordbreakimp right valignmiddle col-right">'.$morehtmlright.
'</td>';
5560 $return .=
'</tr></table>'.
"\n";
5588function 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 =
'')
5590 global $conf, $langs;
5593 $savtotalnboflines = $totalnboflines;
5594 $totalnboflines = abs((
int) $totalnboflines);
5596 $page = (int) $page;
5598 if ($picto ==
'setup') {
5599 $picto =
'title_setup.png';
5601 if (($conf->browser->name ==
'ie') && $picto ==
'generic') {
5602 $picto =
'title.gif';
5605 $limit = $conf->liste_limit;
5608 if ($savlimit != 0 && (($num > $limit) || ($num == -1) || ($limit == 0))) {
5616 print
"<!-- Begin title -->\n";
5617 print
'<table class="centpercent notopnoleftnoright table-fiche-title'.($morecss ?
' '.$morecss :
'').
'"><tr>';
5621 if ($picto && $titre) {
5622 print
'<td class="nobordernopadding widthpictotitle valignmiddle col-picto">'.img_picto(
'', $picto,
'class="valignmiddle pictotitle widthpictotitle"', $pictoisfullpath).
'</td>';
5625 print
'<td class="nobordernopadding valignmiddle col-title">';
5626 print
'<div class="titre inline-block">'.$titre;
5627 if (!empty($titre) && $savtotalnboflines >= 0 && (
string) $savtotalnboflines !=
'') {
5628 print
'<span class="opacitymedium colorblack paddingleft">('.$totalnboflines.
')</span>';
5630 print
'</div></td>';
5633 if ($morehtmlcenter && empty($conf->dol_optimize_smallscreen)) {
5634 print
'<td class="nobordernopadding center valignmiddle col-center">'.$morehtmlcenter.
'</td>';
5638 print
'<td class="nobordernopadding valignmiddle right col-right">';
5639 print
'<input type="hidden" name="pageplusoneold" value="'.((int) $page + 1).
'">';
5641 $options .=
"&sortfield=".urlencode($sortfield);
5644 $options .=
"&sortorder=".urlencode($sortorder);
5648 if ($savlimit != 0 && ($page > 0 || $num > $limit)) {
5649 if ($totalnboflines) {
5651 $maxnbofpage = (empty($conf->dol_optimize_smallscreen) ? 4 : 0);
5654 $nbpages = ceil($totalnboflines / $limit);
5658 $cpt = ($page - $maxnbofpage);
5664 if (empty($pagenavastextinput)) {
5665 $pagelist .=
'<li class="pagination"><a href="'.$file.
'?page=0'.$options.
'">1</a></li>';
5667 $pagelist .=
'<li class="pagination"><span class="inactive">...</span></li>';
5668 } elseif ($cpt == 2) {
5669 $pagelist .=
'<li class="pagination"><a href="'.$file.
'?page=1'.$options.
'">2</a></li>';
5675 if ($pagenavastextinput) {
5676 if ($cpt == $page) {
5677 $pagelist .=
'<li class="pagination"><input type="text" class="'.($totalnboflines > 100 ?
'width40' :
'width25').
' center pageplusone" name="pageplusone" value="'.($page + 1).
'"></li>';
5681 if ($cpt == $page) {
5682 $pagelist .=
'<li class="pagination"><span class="active">'.($page + 1).
'</span></li>';
5684 $pagelist .=
'<li class="pagination"><a href="'.$file.
'?page='.$cpt.$options.
'">'.($cpt + 1).
'</a></li>';
5688 }
while ($cpt < $nbpages && $cpt <= ($page + $maxnbofpage));
5690 if (empty($pagenavastextinput)) {
5691 if ($cpt < $nbpages) {
5692 if ($cpt < $nbpages - 2) {
5693 $pagelist .=
'<li class="pagination"><span class="inactive">...</span></li>';
5694 } elseif ($cpt == $nbpages - 2) {
5695 $pagelist .=
'<li class="pagination"><a href="'.$file.
'?page='.($nbpages - 2).$options.
'">'.($nbpages - 1).
'</a></li>';
5697 $pagelist .=
'<li class="pagination"><a href="'.$file.
'?page='.($nbpages - 1).$options.
'">'.$nbpages.
'</a></li>';
5701 $pagelist .=
'<li class="pagination paginationlastpage"><a href="'.$file.
'?page='.($nbpages - 1).$options.
'">'.$nbpages.
'</a></li>';
5704 $pagelist .=
'<li class="pagination"><span class="active">'.($page + 1).
"</li>";
5708 if ($savlimit || $morehtmlright || $morehtmlrightbeforearrow) {
5709 print_fleche_navigation($page, $file, $options, $nextpage, $pagelist, $morehtmlright, $savlimit, $totalnboflines, $hideselectlimit, $morehtmlrightbeforearrow, $hidenavigation);
5713 if ($pagenavastextinput) {
5720 print
'</table>'.
"\n";
5723 if ($morehtmlcenter && !empty($conf->dol_optimize_smallscreen)) {
5724 print
'<div class="nobordernopadding marginbottomonly center valignmiddle col-center centpercent">'.$morehtmlcenter.
'</div>';
5727 print
"<!-- End title -->\n\n";
5746function print_fleche_navigation($page, $file, $options =
'', $nextpage = 0, $betweenarrows =
'', $afterarrows =
'', $limit = -1, $totalnboflines = 0, $hideselectlimit = 0, $beforearrows =
'', $hidenavigation = 0)
5748 global $conf, $langs;
5750 print
'<div class="pagination"><ul>';
5751 if ($beforearrows) {
5752 print
'<li class="paginationbeforearrows">';
5753 print $beforearrows;
5757 if (empty($hidenavigation)) {
5758 if ((
int) $limit > 0 && empty($hideselectlimit)) {
5759 $pagesizechoices =
'10:10,15:15,20:20,30:30,40:40,50:50,100:100,250:250,500:500,1000:1000';
5760 $pagesizechoices .=
',5000:5000,10000:10000,20000:20000';
5763 if (!empty($conf->global->MAIN_PAGESIZE_CHOICES)) {
5764 $pagesizechoices = $conf->global->MAIN_PAGESIZE_CHOICES;
5767 print
'<li class="pagination">';
5768 print
'<select class="flat selectlimit" name="limit" title="'.dol_escape_htmltag($langs->trans(
"MaxNbOfRecordPerPage")).
'">';
5769 $tmpchoice = explode(
',', $pagesizechoices);
5770 $tmpkey = $limit.
':'.$limit;
5771 if (!in_array($tmpkey, $tmpchoice)) {
5772 $tmpchoice[] = $tmpkey;
5774 $tmpkey = $conf->liste_limit.
':'.$conf->liste_limit;
5775 if (!in_array($tmpkey, $tmpchoice)) {
5776 $tmpchoice[] = $tmpkey;
5778 asort($tmpchoice, SORT_NUMERIC);
5779 foreach ($tmpchoice as $val) {
5781 $tmp = explode(
':', $val);
5784 if ($key !=
'' && $val !=
'') {
5785 if ((
int) $key == (
int) $limit) {
5786 $selected =
' selected="selected"';
5788 print
'<option name="'.$key.
'"'.$selected.
'>'.
dol_escape_htmltag($val).
'</option>'.
"\n";
5792 if ($conf->use_javascript_ajax) {
5793 print
'<!-- JS CODE TO ENABLE select limit to launch submit of page -->
5795 jQuery(document).ready(function () {
5796 jQuery(".selectlimit").change(function() {
5797 console.log("Change limit. Send submit");
5798 $(this).parents(\'form:first\').submit();
5807 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>';
5809 if ($betweenarrows) {
5810 print
'<!--<div class="betweenarrows nowraponall inline-block">-->';
5811 print $betweenarrows;
5812 print
'<!--</div>-->';
5814 if ($nextpage > 0) {
5815 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>';
5818 print
'<li class="paginationafterarrows">';
5823 print
'</ul></div>'.
"\n";
5838function vatrate($rate, $addpercent =
false, $info_bits = 0, $usestarfornpr = 0, $html = 0)
5842 if (preg_match(
'/%/', $rate)) {
5843 $rate = str_replace(
'%',
'', $rate);
5847 if (preg_match(
'/\((.*)\)/', $rate, $reg)) {
5848 $morelabel =
' ('.$reg[1].
')';
5849 $rate = preg_replace(
'/\s*'.preg_quote($morelabel,
'/').
'/',
'', $rate);
5850 $morelabel =
' '.($html ?
'<span class="opacitymedium">' :
'').
'('.$reg[1].
')'.($html ?
'</span>' :
'');
5852 if (preg_match(
'/\*/', $rate)) {
5853 $rate = str_replace(
'*',
'', $rate);
5858 if (!preg_match(
'/\//', $rate)) {
5859 $ret =
price($rate, 0,
'', 0, 0).($addpercent ?
'%' :
'');
5862 $ret = $rate.($addpercent ?
'%' :
'');
5864 if (($info_bits & 1) && $usestarfornpr >= 0) {
5887function price($amount, $form = 0, $outlangs =
'', $trunc = 1, $rounding = -1, $forcerounding = -1, $currency_code =
'')
5889 global $langs, $conf;
5892 if (empty($amount)) {
5895 $amount = (is_numeric($amount) ? $amount : 0);
5896 if ($rounding == -1) {
5897 $rounding = min($conf->global->MAIN_MAX_DECIMALS_UNIT, $conf->global->MAIN_MAX_DECIMALS_TOT);
5899 $nbdecimal = $rounding;
5901 if ($outlangs ===
'none') {
5911 if (!is_object($outlangs)) {
5915 if ($outlangs->transnoentitiesnoconv(
"SeparatorDecimal") !=
"SeparatorDecimal") {
5916 $dec = $outlangs->transnoentitiesnoconv(
"SeparatorDecimal");
5918 if ($outlangs->transnoentitiesnoconv(
"SeparatorThousand") !=
"SeparatorThousand") {
5919 $thousand = $outlangs->transnoentitiesnoconv(
"SeparatorThousand");
5921 if ($thousand ==
'None') {
5923 } elseif ($thousand ==
'Space') {
5930 $amount = str_replace(
',',
'.', $amount);
5932 $datas = explode(
'.', $amount);
5933 $decpart = isset($datas[1]) ? $datas[1] :
'';
5934 $decpart = preg_replace(
'/0+$/i',
'', $decpart);
5943 $max_nbdecimal = (int) str_replace(
'...',
'',
getDolGlobalString(
'MAIN_MAX_DECIMALS_SHOWN'));
5944 if ($trunc && $nbdecimal > $max_nbdecimal) {
5945 $nbdecimal = $max_nbdecimal;
5953 if ((
string) $forcerounding !=
'-1') {
5954 if ($forcerounding ===
'MU') {
5955 $nbdecimal = $conf->global->MAIN_MAX_DECIMALS_UNIT;
5956 } elseif ($forcerounding ===
'MT') {
5957 $nbdecimal = $conf->global->MAIN_MAX_DECIMALS_TOT;
5958 } elseif ($forcerounding >= 0) {
5959 $nbdecimal = $forcerounding;
5964 $output = number_format($amount, $nbdecimal, $dec, $thousand);
5966 $output = preg_replace(
'/\s/',
' ', $output);
5967 $output = preg_replace(
'/\'/',
''', $output);
5970 $cursymbolbefore = $cursymbolafter =
'';
5971 if ($currency_code && is_object($outlangs)) {
5972 if ($currency_code ==
'auto') {
5973 $currency_code = $conf->currency;
5976 $listofcurrenciesbefore = array(
'AUD',
'CAD',
'CNY',
'COP',
'CLP',
'GBP',
'HKD',
'MXN',
'PEN',
'USD',
'CRC');
5977 $listoflanguagesbefore = array(
'nl_NL');
5978 if (in_array($currency_code, $listofcurrenciesbefore) || in_array($outlangs->defaultlang, $listoflanguagesbefore)) {
5979 $cursymbolbefore .= $outlangs->getCurrencySymbol($currency_code);
5981 $tmpcur = $outlangs->getCurrencySymbol($currency_code);
5982 $cursymbolafter .= ($tmpcur == $currency_code ?
' '.$tmpcur : $tmpcur);
5985 $output = $cursymbolbefore.$output.$end.($cursymbolafter ?
' ' :
'').$cursymbolafter;
6016 global $langs, $conf;
6019 if (is_null($amount)) {
6028 if (is_null($langs)) {
6032 if ($langs->transnoentitiesnoconv(
"SeparatorDecimal") !=
"SeparatorDecimal") {
6033 $dec = $langs->transnoentitiesnoconv(
"SeparatorDecimal");
6035 if ($langs->transnoentitiesnoconv(
"SeparatorThousand") !=
"SeparatorThousand") {
6036 $thousand = $langs->transnoentitiesnoconv(
"SeparatorThousand");
6039 if ($thousand ==
'None') {
6041 } elseif ($thousand ==
'Space') {
6049 if (!is_numeric($amount)) {
6050 $amount = preg_replace(
'/[a-zA-Z\/\\\*\(\)<>\_]/',
'', $amount);
6053 if ($option == 2 && $thousand ==
'.' && preg_match(
'/\.(\d\d\d)$/', (
string) $amount)) {
6054 $amount = str_replace($thousand,
'', $amount);
6060 if (is_numeric($amount)) {
6062 $temps = sprintf(
"%0.10F", $amount - intval($amount));
6063 $temps = preg_replace(
'/([\.1-9])0+$/',
'\\1', $temps);
6065 $amount = number_format($amount, $nbofdec, $dec, $thousand);
6070 if ($thousand !=
',' && $thousand !=
'.') {
6071 $amount = str_replace(
',',
'.', $amount);
6074 $amount = str_replace(
' ',
'', $amount);
6075 $amount = str_replace($thousand,
'', $amount);
6076 $amount = str_replace($dec,
'.', $amount);
6078 $amount = preg_replace(
'/[^0-9\-\.]/',
'', $amount);
6084 $nbofdectoround =
'';
6085 if ($rounding ==
'MU') {
6086 $nbofdectoround = $conf->global->MAIN_MAX_DECIMALS_UNIT;
6087 } elseif ($rounding ==
'MT') {
6088 $nbofdectoround = $conf->global->MAIN_MAX_DECIMALS_TOT;
6089 } elseif ($rounding ==
'MS') {
6090 $nbofdectoround = isset($conf->global->MAIN_MAX_DECIMALS_STOCK) ? $conf->global->MAIN_MAX_DECIMALS_STOCK : 5;
6091 } elseif ($rounding ==
'CU') {
6092 $nbofdectoround = max($conf->global->MAIN_MAX_DECIMALS_UNIT, 8);
6093 } elseif ($rounding ==
'CT') {
6094 $nbofdectoround = max($conf->global->MAIN_MAX_DECIMALS_TOT, 8);
6095 } elseif (is_numeric($rounding)) {
6096 $nbofdectoround = (int) $rounding;
6101 $amount = round(is_string($amount) ? (
float) $amount : $amount, $nbofdectoround);
6103 return 'ErrorBadParameterProvidedToFunction';
6109 if (is_numeric($amount)) {
6111 $temps = sprintf(
"%0.10F", $amount - intval($amount));
6112 $temps = preg_replace(
'/([\.1-9])0+$/',
'\\1', $temps);
6114 $amount = number_format($amount, min($nbofdec, $nbofdectoround), $dec, $thousand);
6120 if ($thousand !=
',' && $thousand !=
'.') {
6121 $amount = str_replace(
',',
'.', $amount);
6124 $amount = str_replace(
' ',
'', $amount);
6125 $amount = str_replace($thousand,
'', $amount);
6126 $amount = str_replace($dec,
'.', $amount);
6128 $amount = preg_replace(
'/[^0-9\-\.]/',
'', $amount);
6146function showDimensionInBestUnit($dimension, $unit, $type, $outputlangs, $round = -1, $forceunitoutput =
'no', $use_short_label = 0)
6148 require_once DOL_DOCUMENT_ROOT.
'/core/lib/product.lib.php';
6150 if (($forceunitoutput ==
'no' && $dimension < 1 / 10000 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == -6)) {
6151 $dimension = $dimension * 1000000;
6153 } elseif (($forceunitoutput ==
'no' && $dimension < 1 / 10 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == -3)) {
6154 $dimension = $dimension * 1000;
6156 } elseif (($forceunitoutput ==
'no' && $dimension > 100000000 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == 6)) {
6157 $dimension = $dimension / 1000000;
6159 } elseif (($forceunitoutput ==
'no' && $dimension > 100000 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == 3)) {
6160 $dimension = $dimension / 1000;
6176 $ret =
price($dimension, 0, $outputlangs, 0, 0, $round);
6177 $ret .=
' '.measuringUnitString(0, $type, $unit, $use_short_label, $outputlangs);
6195function get_localtax($vatrate, $local, $thirdparty_buyer =
"", $thirdparty_seller =
"", $vatnpr = 0)
6197 global $db, $conf, $mysoc;
6199 if (empty($thirdparty_seller) || !is_object($thirdparty_seller)) {
6200 $thirdparty_seller = $mysoc;
6203 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);
6205 $vatratecleaned = $vatrate;
6207 if (preg_match(
'/^(.*)\s*\((.*)\)$/', $vatrate, $reg)) {
6208 $vatratecleaned = trim($reg[1]);
6209 $vatratecode = $reg[2];
6218 if ($mysoc->country_code ==
'ES') {
6220 if (!$mysoc->localtax1_assuj || (
string) $vatratecleaned ==
"0") {
6223 if ($thirdparty_seller->id == $mysoc->id) {
6224 if (!$thirdparty_buyer->localtax1_assuj) {
6228 if (!$thirdparty_seller->localtax1_assuj) {
6236 if (!$mysoc->localtax2_assuj) {
6239 if ($thirdparty_seller->id == $mysoc->id) {
6240 if (!$thirdparty_buyer->localtax2_assuj) {
6244 if (!$thirdparty_seller->localtax2_assuj) {
6250 if ($local == 1 && !$thirdparty_seller->localtax1_assuj) {
6253 if ($local == 2 && !$thirdparty_seller->localtax2_assuj) {
6259 if (in_array($mysoc->country_code, array(
'ES'))) {
6260 $conf->global->MAIN_GET_LOCALTAXES_VALUES_FROM_THIRDPARTY = 1;
6264 if (!empty($conf->global->MAIN_GET_LOCALTAXES_VALUES_FROM_THIRDPARTY)) {
6266 if ($thirdparty_seller != $mysoc) {
6268 return $thirdparty_seller->localtax1_value;
6272 return $conf->global->MAIN_INFO_VALUE_LOCALTAX1;
6277 if ($thirdparty_seller != $mysoc) {
6280 return $thirdparty_seller->localtax2_value;
6283 if (in_array($mysoc->country_code, array(
'ES'))) {
6284 return $thirdparty_buyer->localtax2_value;
6286 return $conf->global->MAIN_INFO_VALUE_LOCALTAX2;
6293 $sql =
"SELECT t.localtax1, t.localtax2, t.localtax1_type, t.localtax2_type";
6294 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t, ".MAIN_DB_PREFIX.
"c_country as c";
6295 $sql .=
" WHERE t.fk_pays = c.rowid AND c.code = '".$db->escape($thirdparty_seller->country_code).
"'";
6296 $sql .=
" AND t.taux = ".((float) $vatratecleaned).
" AND t.active = 1";
6297 if (!empty($vatratecode)) {
6298 $sql .=
" AND t.code ='".$db->escape($vatratecode).
"'";
6300 $sql .=
" AND t.recuperableonly = '".$db->escape($vatnpr).
"'";
6303 $resql = $db->query($sql);
6306 $obj = $db->fetch_object($resql);
6309 return $obj->localtax1;
6310 } elseif ($local == 2) {
6311 return $obj->localtax2;
6332 $valors = explode(
":", $tax);
6334 if (count($valors) > 1) {
6351 $sql =
" SELECT t.localtax".$local.
" as localtax";
6352 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t INNER JOIN ".MAIN_DB_PREFIX.
"c_country as c ON c.rowid = t.fk_pays";
6353 $sql .=
" WHERE c.code = '".$db->escape($mysoc->country_code).
"' AND t.active = 1 AND t.taux = (";
6354 $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";
6355 $sql .=
" WHERE c.code = '".$db->escape($mysoc->country_code).
"' AND tt.active = 1)";
6356 $sql .=
" AND t.localtax".$local.
"_type <> '0'";
6357 $sql .=
" ORDER BY t.rowid DESC";
6359 $resql = $db->query($sql);
6361 $obj = $db->fetch_object($resql);
6363 return $obj->localtax;
6388 dol_syslog(
"getTaxesFromId vat id or rate = ".$vatrate);
6391 $sql =
"SELECT t.rowid, t.code, t.taux as rate, t.recuperableonly as npr, t.accountancy_code_sell, t.accountancy_code_buy,";
6392 $sql .=
" t.localtax1, t.localtax1_type, t.localtax2, t.localtax2_type";
6393 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t";
6394 if ($firstparamisid) {
6395 $sql .=
" WHERE t.rowid = ".(int) $vatrate;
6397 $vatratecleaned = $vatrate;
6400 if (preg_match(
'/^(.*)\s*\((.*)\)$/', $vatrate, $reg)) {
6401 $vatratecleaned = $reg[1];
6402 $vatratecode = $reg[2];
6405 $sql .=
", ".MAIN_DB_PREFIX.
"c_country as c";
6408 $sql .=
" WHERE t.fk_pays = c.rowid AND c.code = '".$db->escape($seller->country_code).
"'";
6409 $sql .=
" AND t.taux = ".((float) $vatratecleaned).
" AND t.active = 1";
6411 $sql .=
" AND t.code = '".$db->escape($vatratecode).
"'";
6415 $resql = $db->query($sql);
6417 $obj = $db->fetch_object($resql);
6420 'rowid'=>$obj->rowid,
6423 'localtax1'=>$obj->localtax1,
6424 'localtax1_type'=>$obj->localtax1_type,
6425 'localtax2'=>$obj->localtax2,
6426 'localtax2_type'=>$obj->localtax2_type,
6428 'accountancy_code_sell'=>$obj->accountancy_code_sell,
6429 'accountancy_code_buy'=>$obj->accountancy_code_buy
6461 dol_syslog(
"getLocalTaxesFromRate vatrate=".$vatrate.
" local=".$local);
6464 $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";
6465 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t";
6466 if ($firstparamisid) {
6467 $sql .=
" WHERE t.rowid = ".(int) $vatrate;
6469 $vatratecleaned = $vatrate;
6472 if (preg_match(
'/^(.*)\s*\((.*)\)$/', $vatrate, $reg)) {
6473 $vatratecleaned = $reg[1];
6474 $vatratecode = $reg[2];
6477 $sql .=
", ".MAIN_DB_PREFIX.
"c_country as c";
6478 if (!empty($mysoc) && $mysoc->country_code ==
'ES') {
6479 $countrycodetouse = ((empty($buyer) || empty($buyer->country_code)) ? $mysoc->country_code : $buyer->country_code);
6480 $sql .=
" WHERE t.fk_pays = c.rowid AND c.code = '".$db->escape($countrycodetouse).
"'";
6482 $countrycodetouse = ((empty($seller) || empty($seller->country_code)) ? $mysoc->country_code : $seller->country_code);
6483 $sql .=
" WHERE t.fk_pays = c.rowid AND c.code = '".$db->escape($countrycodetouse).
"'";
6485 $sql .=
" AND t.taux = ".((float) $vatratecleaned).
" AND t.active = 1";
6487 $sql .=
" AND t.code = '".$db->escape($vatratecode).
"'";
6491 $resql = $db->query($sql);
6493 $obj = $db->fetch_object($resql);
6496 $vateratestring = $obj->rate.($obj->code ?
' ('.$obj->code.
')' :
'');
6499 return array($obj->localtax1_type,
get_localtax($vateratestring, $local, $buyer, $seller), $obj->accountancy_code_sell, $obj->accountancy_code_buy);
6500 } elseif ($local == 2) {
6501 return array($obj->localtax2_type,
get_localtax($vateratestring, $local, $buyer, $seller), $obj->accountancy_code_sell, $obj->accountancy_code_buy);
6503 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);
6523 global $db, $conf, $mysoc;
6525 require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
6533 $product->fetch($idprod);
6535 if ($mysoc->country_code == $thirdpartytouse->country_code) {
6537 if ($idprodfournprice > 0) {
6538 $result = $product->get_buyprice($idprodfournprice, 0, 0, 0);
6540 $ret = $product->vatrate_supplier;
6541 if ($product->default_vat_code_supplier) {
6542 $ret .=
' ('.$product->default_vat_code_supplier.
')';
6548 $ret = $product->tva_tx;
6549 if ($product->default_vat_code) {
6550 $ret .=
' ('.$product->default_vat_code.
')';
6561 if (empty($conf->global->MAIN_VAT_DEFAULT_IF_AUTODETECT_FAILS)) {
6563 $sql =
"SELECT t.taux as vat_rate, t.code as default_vat_code";
6564 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t, ".MAIN_DB_PREFIX.
"c_country as c";
6565 $sql .=
" WHERE t.active = 1 AND t.fk_pays = c.rowid AND c.code = '".$db->escape($thirdpartytouse->country_code).
"'";
6566 $sql .=
" ORDER BY t.use_default DESC, t.taux DESC, t.code ASC, t.recuperableonly ASC";
6567 $sql .= $db->plimit(1);
6569 $resql = $db->query($sql);
6571 $obj = $db->fetch_object($resql);
6573 $ret = $obj->vat_rate;
6574 if ($obj->default_vat_code) {
6575 $ret .=
' ('.$obj->default_vat_code.
')';
6587 if ($conf->global->MAIN_VAT_DEFAULT_IF_AUTODETECT_FAILS !=
'none') {
6588 $defaulttx = $conf->global->MAIN_VAT_DEFAULT_IF_AUTODETECT_FAILS;
6599 dol_syslog(
"get_product_vat_for_country: ret=".$ret);
6616 if (!class_exists(
'Product')) {
6617 require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
6626 $result = $product->fetch($idprod);
6628 if ($mysoc->country_code == $thirdpartytouse->country_code) {
6642 $sql =
"SELECT taux as vat_rate, localtax1, localtax2";
6643 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t, ".MAIN_DB_PREFIX.
"c_country as c";
6644 $sql .=
" WHERE t.active=1 AND t.fk_pays = c.rowid AND c.code='".$db->escape($thirdpartytouse->country_code).
"'";
6645 $sql .=
" ORDER BY t.taux DESC, t.recuperableonly ASC";
6646 $sql .= $db->plimit(1);
6648 $resql = $db->query($sql);
6650 $obj = $db->fetch_object($resql);
6653 $ret = $obj->localtax1;
6654 } elseif ($local == 2) {
6655 $ret = $obj->localtax2;
6663 dol_syslog(
"get_product_localtax_for_country: ret=".$ret);
6687 require_once DOL_DOCUMENT_ROOT.
'/core/lib/company.lib.php';
6690 $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;
6692 $seller_country_code = $thirdparty_seller->country_code;
6693 $seller_in_cee =
isInEEC($thirdparty_seller);
6695 $buyer_country_code = $thirdparty_buyer->country_code;
6696 $buyer_in_cee =
isInEEC($thirdparty_buyer);
6698 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 :
''));
6702 if (!empty($conf->global->SERVICE_ARE_ECOMMERCE_200238EC)) {
6703 if ($seller_in_cee && $buyer_in_cee) {
6704 $isacompany = $thirdparty_buyer->
isACompany();
6705 if ($isacompany &&
getDolGlobalString(
'MAIN_USE_VAT_COMPANIES_IN_EEC_WITH_INVALID_VAT_ID_ARE_INDIVIDUAL')) {
6706 require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
6720 if (!$seller_use_vat) {
6726 if (($seller_country_code == $buyer_country_code)
6727 || (in_array($seller_country_code, array(
'FR',
'MC')) && in_array($buyer_country_code, array(
'FR',
'MC')))) {
6731 if ($seller_country_code ==
'IN' &&
getDolGlobalString(
'MAIN_SALETAX_AUTOSWITCH_I_CS_FOR_INDIA')) {
6735 if (preg_match(
'/C+S-(\d+)/', $tmpvat, $reg) && $thirdparty_seller->state_id != $thirdparty_buyer->state_id) {
6737 $tmpvat = str_replace(
"C+S",
"I", $tmpvat);
6738 } elseif (preg_match(
'/I-(\d+)/', $tmpvat, $reg) && $thirdparty_seller->state_id == $thirdparty_buyer->state_id) {
6740 $tmpvat = str_replace(
"I",
"C+S", $tmpvat);
6752 if (($seller_in_cee && $buyer_in_cee)) {
6753 $isacompany = $thirdparty_buyer->
isACompany();
6754 if ($isacompany &&
getDolGlobalString(
'MAIN_USE_VAT_COMPANIES_IN_EEC_WITH_INVALID_VAT_ID_ARE_INDIVIDUAL')) {
6755 require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
6772 if (!empty($conf->global->MAIN_USE_VAT_OF_PRODUCT_FOR_INDIVIDUAL_CUSTOMER_OUT_OF_EEC) && empty($buyer_in_cee)) {
6773 $isacompany = $thirdparty_buyer->
isACompany();
6801 if ($idprodfournprice > 0) {
6802 if (!class_exists(
'ProductFournisseur')) {
6803 require_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.product.class.php';
6806 $prodprice->fetch_product_fournisseur_price($idprodfournprice);
6807 return $prodprice->fourn_tva_npr;
6808 } elseif ($idprod > 0) {
6809 if (!class_exists(
'Product')) {
6810 require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
6813 $prod->fetch($idprod);
6814 return $prod->tva_npr;
6837 if (!is_object($thirdparty_seller)) {
6840 if (!is_object($thirdparty_buyer)) {
6845 if ($mysoc->country_code ==
'ES') {
6846 if (is_numeric($thirdparty_buyer->localtax1_assuj) && !$thirdparty_buyer->localtax1_assuj) {
6851 if (is_numeric($thirdparty_seller->localtax1_assuj) && !$thirdparty_seller->localtax1_assuj) {
6854 if (!is_numeric($thirdparty_seller->localtax1_assuj) && $thirdparty_seller->localtax1_assuj ==
'localtax1off') {
6858 } elseif ($local == 2) {
6860 if (is_numeric($thirdparty_seller->localtax2_assuj) && !$thirdparty_seller->localtax2_assuj) {
6863 if (!is_numeric($thirdparty_seller->localtax2_assuj) && $thirdparty_seller->localtax2_assuj ==
'localtax2off') {
6868 if ($thirdparty_seller->country_code == $thirdparty_buyer->country_code) {
6883function yn($yesno, $case = 1, $color = 0)
6887 $result =
'unknown';
6889 if ($yesno == 1 || (isset($yesno) && (strtolower($yesno) ==
'yes' || strtolower($yesno) ==
'true'))) {
6890 $result = $langs->trans(
'yes');
6891 if ($case == 1 || $case == 3) {
6892 $result = $langs->trans(
"Yes");
6895 $result =
'<input type="checkbox" value="1" checked disabled>';
6898 $result =
'<input type="checkbox" value="1" checked disabled> '.$result;
6902 } elseif ($yesno == 0 || strtolower($yesno) ==
'no' || strtolower($yesno) ==
'false') {
6903 $result = $langs->trans(
"no");
6904 if ($case == 1 || $case == 3) {
6905 $result = $langs->trans(
"No");
6908 $result =
'<input type="checkbox" value="0" disabled>';
6911 $result =
'<input type="checkbox" value="0" disabled> '.$result;
6917 $classname =
'error';
6921 return '<span class="'.$classname.
'">'.$result.
'</span>';
6941function get_exdir($num, $level, $alpha, $withoutslash, $object, $modulepart =
'')
6945 if (empty($modulepart) && !empty($object->module)) {
6946 $modulepart = $object->module;
6951 $arrayforoldpath = array(
'cheque',
'category',
'holiday',
'supplier_invoice',
'invoice_supplier',
'mailing',
'supplier_payment');
6953 $arrayforoldpath[] =
'product';
6955 if (!empty($level) && in_array($modulepart, $arrayforoldpath)) {
6957 if (empty($alpha)) {
6958 $num = preg_replace(
'/([^0-9])/i',
'', $num);
6960 $num = preg_replace(
'/^.*\-/i',
'', $num);
6962 $num = substr(
"000".$num, -$level);
6964 $path = substr($num, 0, 1);
6967 $path = substr($num, 1, 1).
'/'.substr($num, 0, 1);
6970 $path = substr($num, 2, 1).
'/'.substr($num, 1, 1).
'/'.substr($num, 0, 1);
6980 if (empty($withoutslash) && !empty($path)) {
6999 dol_syslog(
"functions.lib::dol_mkdir: dir=".$dir, LOG_INFO);
7002 if (@is_dir($dir_osencoded)) {
7010 if (!empty($dataroot)) {
7012 $dir = str_replace($dataroot.
'/',
'', $dir);
7013 $ccdir = $dataroot.
'/';
7016 $cdir = explode(
"/", $dir);
7017 $num = count($cdir);
7018 for ($i = 0; $i < $num; $i++) {
7020 $ccdir .=
'/'.$cdir[$i];
7022 $ccdir .= $cdir[$i];
7025 if (preg_match(
"/^.:$/", $ccdir, $regs)) {
7033 if (!@is_dir($ccdir_osencoded)) {
7034 dol_syslog(
"functions.lib::dol_mkdir: Directory '".$ccdir.
"' does not exists or is outside open_basedir PHP setting.", LOG_DEBUG);
7037 $dirmaskdec = octdec((
string) $newmask);
7038 if (empty($newmask)) {
7039 $dirmaskdec = empty($conf->global->MAIN_UMASK) ? octdec(
'0755') : octdec($conf->global->MAIN_UMASK);
7041 $dirmaskdec |= octdec(
'0111');
7042 if (!@mkdir($ccdir_osencoded, $dirmaskdec)) {
7044 dol_syslog(
"functions.lib::dol_mkdir: Fails to create directory '".$ccdir.
"' or directory already exists.", LOG_WARNING);
7047 dol_syslog(
"functions.lib::dol_mkdir: Directory '".$ccdir.
"' created", LOG_DEBUG);
7056 return ($nberr ? -$nberr : $nbcreated);
7071 if (!empty($newmask)) {
7072 @chmod($filepath, octdec($newmask));
7073 } elseif (!empty($conf->global->MAIN_UMASK)) {
7074 @chmod($filepath, octdec($conf->global->MAIN_UMASK));
7086 return '<span class="fieldrequired">*</span>';
7106function dol_string_nohtmltag($stringtoclean, $removelinefeed = 1, $pagecodeto =
'UTF-8', $strip_tags = 0, $removedoublespaces = 1)
7108 if (is_null($stringtoclean)) {
7112 if ($removelinefeed == 2) {
7113 $stringtoclean = preg_replace(
'/<br[^>]*>(\n|\r)+/ims',
'<br>', $stringtoclean);
7115 $temp = preg_replace(
'/<br[^>]*>/i',
"\n", $stringtoclean);
7120 $temp = str_replace(
'< ',
'__ltspace__', $temp);
7123 $temp = strip_tags($temp);
7126 $pattern =
"/<[^<>]+>/";
7133 $tempbis = str_replace(
'<>',
'', $temp);
7134 $tempbis = preg_replace($pattern,
'', $tempbis);
7136 }
while ($tempbis != $temp);
7141 $temp = preg_replace(
'/<+([a-z]+)/i',
'\1', $temp);
7147 if ($removelinefeed == 1) {
7148 $temp = str_replace(array(
"\r\n",
"\r",
"\n"),
" ", $temp);
7152 if ($removedoublespaces) {
7153 while (strpos($temp,
" ")) {
7154 $temp = str_replace(
" ",
" ", $temp);
7158 $temp = str_replace(
'__ltspace__',
'< ', $temp);
7178function dol_string_onlythesehtmltags($stringtoclean, $cleanalsosomestyles = 1, $removeclassattribute = 1, $cleanalsojavascript = 0, $allowiframe = 0, $allowed_tags = array(), $allowlink = 0)
7180 if (empty($allowed_tags)) {
7181 $allowed_tags = array(
7182 "html",
"head",
"meta",
"body",
"article",
"a",
"abbr",
"b",
"blockquote",
"br",
"cite",
"div",
"dl",
"dd",
"dt",
"em",
"font",
"img",
"ins",
"hr",
"i",
"li",
7183 "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"
7186 $allowed_tags[] =
"comment";
7188 if (!in_array(
'iframe', $allowed_tags)) {
7189 $allowed_tags[] =
"iframe";
7193 if (!in_array(
'link', $allowed_tags)) {
7194 $allowed_tags[] =
"link";
7198 $allowed_tags_string = join(
"><", $allowed_tags);
7199 $allowed_tags_string =
'<'.$allowed_tags_string.
'>';
7201 $stringtoclean = str_replace(
'<!DOCTYPE html>',
'__!DOCTYPE_HTML__', $stringtoclean);
7206 $stringtoclean = preg_replace(
'/<!--([^>]*)-->/',
'<comment>\1</comment>', $stringtoclean);
7208 $stringtoclean = preg_replace(
'/:/i',
':', $stringtoclean);
7209 $stringtoclean = preg_replace(
'/:|�+58|:/i',
'', $stringtoclean);
7211 $temp = strip_tags($stringtoclean, $allowed_tags_string);
7213 if ($cleanalsosomestyles) {
7214 $temp = preg_replace(
'/position\s*:\s*(absolute|fixed)\s*!\s*important/i',
'', $temp);
7216 if ($removeclassattribute) {
7217 $temp = preg_replace(
'/(<[^>]+)\s+class=((["\']).*?\\3|\\w*)/i',
'\\1', $temp);
7222 if ($cleanalsojavascript) {
7223 $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);
7226 $temp = str_replace(
'__!DOCTYPE_HTML__',
'<!DOCTYPE html>', $temp);
7228 $temp = preg_replace(
'/<comment>([^>]*)<\/comment>/',
'<!--\1-->', $temp);
7246function dol_string_onlythesehtmlattributes($stringtoclean, $allowed_attributes = array(
"allow",
"allowfullscreen",
"alt",
"class",
"contenteditable",
"data-html",
"frameborder",
"height",
"href",
"id",
"name",
"src",
"style",
"target",
"title",
"width"))
7248 if (class_exists(
'DOMDocument') && !empty($stringtoclean)) {
7249 $stringtoclean =
'<?xml encoding="UTF-8"><html><body>'.$stringtoclean.
'</body></html>';
7251 $dom =
new DOMDocument(
null,
'UTF-8');
7252 $dom->loadHTML($stringtoclean, LIBXML_ERR_NONE|LIBXML_HTML_NOIMPLIED|LIBXML_HTML_NODEFDTD|LIBXML_NONET|LIBXML_NOWARNING|LIBXML_NOXMLDECL);
7254 if (is_object($dom)) {
7255 for ($els = $dom->getElementsByTagname(
'*'), $i = $els->length - 1; $i >= 0; $i--) {
7256 for ($attrs = $els->item($i)->attributes, $ii = $attrs->length - 1; $ii >= 0; $ii--) {
7258 if (!empty($attrs->item($ii)->name)) {
7259 if (! in_array($attrs->item($ii)->name, $allowed_attributes)) {
7261 $els->item($i)->removeAttribute($attrs->item($ii)->name);
7262 } elseif (in_array($attrs->item($ii)->name, array(
'style'))) {
7264 $valuetoclean = $attrs->item($ii)->value;
7266 if (isset($valuetoclean)) {
7268 $oldvaluetoclean = $valuetoclean;
7269 $valuetoclean = preg_replace(
'/\/\*.*\*\//m',
'', $valuetoclean);
7270 $valuetoclean = preg_replace(
'/position\s*:\s*[a-z]+/mi',
'', $valuetoclean);
7271 if ($els->item($i)->tagName ==
'a') {
7272 $valuetoclean = preg_replace(
'/display\s*:/mi',
'', $valuetoclean);
7273 $valuetoclean = preg_replace(
'/z-index\s*:/mi',
'', $valuetoclean);
7274 $valuetoclean = preg_replace(
'/\s+(top|left|right|bottom)\s*:/mi',
'', $valuetoclean);
7278 $valuetoclean = preg_replace(
'/(logout|passwordforgotten)\.php/mi',
'', $valuetoclean);
7279 $valuetoclean = preg_replace(
'/action=/mi',
'', $valuetoclean);
7280 }
while ($oldvaluetoclean != $valuetoclean);
7283 $attrs->item($ii)->value = $valuetoclean;
7290 $return = $dom->saveHTML();
7293 $return = preg_replace(
'/^'.preg_quote(
'<?xml encoding="UTF-8">',
'/').
'/',
'', $return);
7294 $return = preg_replace(
'/^'.preg_quote(
'<html><body>',
'/').
'/',
'', $return);
7295 $return = preg_replace(
'/'.preg_quote(
'</body></html>',
'/').
'$/',
'', $return);
7296 return trim($return);
7298 return $stringtoclean;
7315 $temp = $stringtoclean;
7316 foreach ($disallowed_tags as $tagtoremove) {
7317 $temp = preg_replace(
'/<\/?'.$tagtoremove.
'>/',
'', $temp);
7318 $temp = preg_replace(
'/<\/?'.$tagtoremove.
'\s+[^>]*>/',
'', $temp);
7321 if ($cleanalsosomestyles) {
7322 $temp = preg_replace(
'/position\s*:\s*(absolute|fixed)\s*!\s*important/',
'', $temp);
7340 if ($nboflines == 1) {
7342 $firstline = preg_replace(
'/<br[^>]*>.*$/s',
'', $text);
7343 $firstline = preg_replace(
'/<div[^>]*>.*$/s',
'', $firstline);
7346 $firstline = preg_replace(
'/[\n\r].*/',
'', $text);
7351 return $firstline.(isset($firstline) && isset($text) && (strlen($firstline) != strlen($text)) ?
'...' :
'');
7355 $text = preg_replace(
'/\n/',
'', $text);
7357 $repTable = array(
"\t" =>
" ",
"\n" =>
" ",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
7359 $repTable = array(
"\t" =>
" ",
"\n" =>
"<br>",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
7362 $text = strtr($text, $repTable);
7363 if ($charset ==
'UTF-8') {
7364 $pattern =
'/(<br[^>]*>)/Uu';
7367 $pattern =
'/(<br[^>]*>)/U';
7369 $a = preg_split($pattern, $text, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
7374 while (($i < $nba) && ($i < ($nboflines * 2))) {
7376 $firstline .= $a[$i];
7377 } elseif (($i < (($nboflines * 2) - 1)) && ($i < ($nba - 1))) {
7378 $firstline .= ($ishtml ?
"<br>\n" :
"\n");
7383 return $firstline.(($i < $nba) ?
'...' :
'');
7399function dol_nl2br($stringtoencode, $nl2brmode = 0, $forxml =
false)
7401 if (is_null($stringtoencode)) {
7406 return nl2br($stringtoencode, $forxml);
7408 $ret = preg_replace(
'/(\r\n|\r|\n)/i', ($forxml ?
'<br />' :
'<br>'), $stringtoencode);
7425 if (empty($nouseofiframesandbox) && !empty($conf->global->MAIN_SECURITY_USE_SANDBOX_FOR_HTMLWITHNOJS)) {
7430 return $stringtoencode;
7432 $out = $stringtoencode;
7435 $oldstringtoclean = $out;
7437 if (!empty($out) && !empty($conf->global->MAIN_RESTRICTHTML_ONLY_VALID_HTML) && $check !=
'restricthtmlallowunvalid') {
7439 libxml_use_internal_errors(
false);
7441 $dom =
new DOMDocument;
7445 $out =
'<div class="tricktoremove">'.$out.
'</div>';
7446 $dom->loadHTML($out, LIBXML_HTML_NODEFDTD|LIBXML_ERR_NONE|LIBXML_HTML_NOIMPLIED|LIBXML_NONET|LIBXML_NOWARNING|LIBXML_NOXMLDECL);
7447 $out = trim($dom->saveHTML());
7450 $out = preg_replace(
'/^<div class="tricktoremove">/',
'', $out);
7451 $out = preg_replace(
'/<\/div>$/',
'', $out);
7455 $out =
'InvalidHTMLStringCantBeCleaned';
7460 $out = preg_replace(
'/&(tab|newline);/i',
' ', $out);
7464 $out = preg_replace(
'/'/i',
''', $out);
7469 $out = preg_replace_callback(
'/&#(x?[0-9][0-9a-f]+;?)/i',
function ($m) {
7474 $out = preg_replace(
'/&#x?[0-9]+/i',
'', $out);
7480 if (!empty($conf->global->MAIN_RESTRICTHTML_REMOVE_ALSO_BAD_ATTRIBUTES)) {
7485 $out = preg_replace(
'/'/i',
"'", $out);
7486 }
while ($oldstringtoclean != $out);
7493 preg_match_all(
'/(<img|url\(|<link)/i', $out, $reg);
7494 $nbextlink = count($reg[0]);
7495 if ($nbextlink >
getDolGlobalInt(
"MAIN_SECURITY_MAX_IMG_IN_HTML_CONTENT", 1000)) {
7496 $out =
'TooManyLinksIntoHTMLString';
7499 if (!empty($conf->global->MAIN_DISALLOW_EXT_URL_INTO_DESCRIPTIONS) || $check ==
'restricthtmlnolink') {
7500 if ($nbextlink > 0) {
7501 $out =
'ExternalLinksNotAllowed';
7530function dol_htmlentitiesbr($stringtoencode, $nl2brmode = 0, $pagecodefrom =
'UTF-8', $removelasteolbr = 1)
7532 if (is_null($stringtoencode)) {
7536 $newstring = $stringtoencode;
7538 $newstring = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>/i',
'<br>', $newstring);
7539 if ($removelasteolbr) {
7540 $newstring = preg_replace(
'/<br>$/i',
'', $newstring);
7542 $newstring = strtr($newstring, array(
'&'=>
'__and__',
'<'=>
'__lt__',
'>'=>
'__gt__',
'"'=>
'__dquot__'));
7544 $newstring = strtr($newstring, array(
'__and__'=>
'&',
'__lt__'=>
'<',
'__gt__'=>
'>',
'__dquot__'=>
'"'));
7546 if ($removelasteolbr) {
7547 $newstring = preg_replace(
'/(\r\n|\r|\n)$/i',
'', $newstring);
7566 $ret = preg_replace(
'/'.
"\r\n".
'<br(\s[\sa-zA-Z_="]*)?\/?>/i',
"<br>", $ret);
7567 $ret = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>'.
"\r\n".
'/i',
"\r\n", $ret);
7568 $ret = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>'.
"\n".
'/i',
"\n", $ret);
7569 $ret = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>/i',
"\n", $ret);
7581 $ret = preg_replace(
'/ $/i',
"", $stringtodecode);
7582 $ret = preg_replace(
'/(<br>|<br(\s[\sa-zA-Z_="]*)?\/?>|'.
"\n".
'|'.
"\r".
')+$/i',
"", $ret);
7598 if ($keepsomeentities) {
7599 $newstring = strtr($newstring, array(
'&'=>
'__andamp__',
'<'=>
'__andlt__',
'>'=>
'__andgt__',
'"'=>
'__dquot__'));
7601 $newstring = html_entity_decode((
string) $newstring, (
int) $b, (
string) $c);
7602 if ($keepsomeentities) {
7603 $newstring = strtr($newstring, array(
'__andamp__'=>
'&',
'__andlt__'=>
'<',
'__andgt__'=>
'>',
'__dquot__'=>
'"'));
7618function dol_htmlentities($string, $flags = ENT_QUOTES|ENT_SUBSTITUTE, $encoding =
'UTF-8', $double_encode =
false)
7620 return htmlentities($string, $flags, $encoding, $double_encode);
7639 for ($scursor = 0; $scursor < $len; $scursor++) {
7640 $ordchar = ord($s[$scursor]);
7642 if ($ordchar < 32 && $ordchar != 13 && $ordchar != 10) {
7645 } elseif ($ordchar > 126 && $ordchar < 160) {
7649 $out .= $s[$scursor];
7671 $arraystring = explode(
"\n", $s);
7672 $nb = count($arraystring);
7689 $repTable = array(
"\t" =>
" ",
"\n" =>
"<br>",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
7691 $repTable = array(
"\t" =>
" ",
"\n" =>
" ",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
7694 $text = strtr($text, $repTable);
7695 if ($charset ==
'UTF-8') {
7696 $pattern =
'/(<br[^>]*>)/Uu';
7699 $pattern =
'/(<br[^>]*>)/U';
7701 $a = preg_split($pattern, $text, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
7703 $nblines = (int) floor((count($a) + 1) / 2);
7706 foreach ($a as $line) {
7709 $line_dec = html_entity_decode($line);
7711 $line_dec = wordwrap($line_dec, $maxlinesize,
'\n',
true);
7712 $nblines += substr_count($line_dec,
'\n');
7732 if (is_null($msg)) {
7737 if (preg_match(
'/<html/i', $msg)) {
7739 } elseif (preg_match(
'/<body/i', $msg)) {
7741 } elseif (preg_match(
'/<\/textarea/i', $msg)) {
7743 } elseif (preg_match(
'/<(b|em|i|u)(\s+[^>]+)?>/i', $msg)) {
7745 } elseif (preg_match(
'/<br/i', $msg)) {
7751 $msg = preg_replace(
'/https?:\/\/[^"\'\s]+/i',
'', $msg);
7752 if (preg_match(
'/<html/i', $msg)) {
7754 } elseif (preg_match(
'/<body/i', $msg)) {
7756 } elseif (preg_match(
'/<\/textarea/i', $msg)) {
7758 } elseif (preg_match(
'/<(b|em|i|u)(\s+[^>]+)?>/i', $msg)) {
7760 } elseif (preg_match(
'/<(br|hr)\/>/i', $msg)) {
7762 } elseif (preg_match(
'/<(br|hr|div|font|li|p|span|strong|table)>/i', $msg)) {
7764 } elseif (preg_match(
'/<(br|hr|div|font|li|p|span|strong|table)\s+[^<>\/]*\/?>/i', $msg)) {
7766 } elseif (preg_match(
'/<img\s+[^<>]*src[^<>]*>/i', $msg)) {
7768 } elseif (preg_match(
'/<a\s+[^<>]*href[^<>]*>/i', $msg)) {
7770 } elseif (preg_match(
'/<h[0-9]>/i', $msg)) {
7772 } elseif (preg_match(
'/&[A-Z0-9]{1,6};/i', $msg)) {
7775 } elseif (preg_match(
'/&#[0-9]{2,3};/i', $msg)) {
7799 if (!empty($invert)) {
7807 $ret .= (!empty($text1) && !empty($text2)) ? ((
dol_textishtml($text1) ||
dol_textishtml($text2)) ? ($forxml ?
"<br >\n" :
"<br>\n") :
"\n") :
"";
7827 global $db, $conf, $mysoc, $user, $extrafields;
7829 $substitutionarray = array();
7831 if ((empty($exclude) || !in_array(
'user', $exclude)) && (empty($include) || in_array(
'user', $include))) {
7835 $emailsendersignature = $user->signature;
7836 $usersignature = $user->signature;
7837 $substitutionarray = array_merge($substitutionarray, array(
7838 '__SENDEREMAIL_SIGNATURE__' => (
string) ((empty($conf->global->MAIN_MAIL_DO_NOT_USE_SIGN)) ? ($onlykey == 2 ?
dol_trunc(
'SignatureFromTheSelectedSenderProfile', 30) : $emailsendersignature) :
''),
7839 '__USER_SIGNATURE__' => (
string) (($usersignature && empty($conf->global->MAIN_MAIL_DO_NOT_USE_SIGN)) ? ($onlykey == 2 ?
dol_trunc(
dol_string_nohtmltag($usersignature), 30) : $usersignature) :
'')
7842 if (is_object($user)) {
7843 $substitutionarray = array_merge($substitutionarray, array(
7844 '__USER_ID__' => (
string) $user->id,
7845 '__USER_LOGIN__' => (
string) $user->login,
7846 '__USER_EMAIL__' => (
string) $user->email,
7847 '__USER_PHONE__' => (
string)
dol_print_phone($user->office_phone,
'', 0, 0,
'',
" ",
'',
'', -1),
7848 '__USER_PHONEPRO__' => (
string)
dol_print_phone($user->user_mobile,
'', 0, 0,
'',
" ",
'',
'', -1),
7849 '__USER_PHONEMOBILE__' => (
string)
dol_print_phone($user->personal_mobile,
'', 0, 0,
'',
" ",
'',
'', -1),
7850 '__USER_FAX__' => (
string) $user->office_fax,
7851 '__USER_LASTNAME__' => (
string) $user->lastname,
7852 '__USER_FIRSTNAME__' => (
string) $user->firstname,
7853 '__USER_FULLNAME__' => (
string) $user->getFullName($outputlangs),
7854 '__USER_SUPERVISOR_ID__' => (
string) ($user->fk_user ? $user->fk_user :
'0'),
7855 '__USER_JOB__' => (
string) $user->job,
7857 '__USER_VCARD_URL__' => (string) $user->getOnlineVirtualCardUrl(
'',
'external')
7861 if ((empty($exclude) || !in_array(
'mycompany', $exclude)) && is_object($mysoc) && (empty($include) || in_array(
'mycompany', $include))) {
7862 $substitutionarray = array_merge($substitutionarray, array(
7863 '__MYCOMPANY_NAME__' => $mysoc->name,
7864 '__MYCOMPANY_EMAIL__' => $mysoc->email,
7865 '__MYCOMPANY_PHONE__' =>
dol_print_phone($mysoc->phone,
'', 0, 0,
'',
" ",
'',
'', -1),
7866 '__MYCOMPANY_FAX__' =>
dol_print_phone($mysoc->fax,
'', 0, 0,
'',
" ",
'',
'', -1),
7867 '__MYCOMPANY_PROFID1__' => $mysoc->idprof1,
7868 '__MYCOMPANY_PROFID2__' => $mysoc->idprof2,
7869 '__MYCOMPANY_PROFID3__' => $mysoc->idprof3,
7870 '__MYCOMPANY_PROFID4__' => $mysoc->idprof4,
7871 '__MYCOMPANY_PROFID5__' => $mysoc->idprof5,
7872 '__MYCOMPANY_PROFID6__' => $mysoc->idprof6,
7873 '__MYCOMPANY_CAPITAL__' => $mysoc->capital,
7874 '__MYCOMPANY_FULLADDRESS__' => (method_exists($mysoc,
'getFullAddress') ? $mysoc->getFullAddress(1,
', ') :
''),
7875 '__MYCOMPANY_ADDRESS__' => $mysoc->address,
7876 '__MYCOMPANY_ZIP__' => $mysoc->zip,
7877 '__MYCOMPANY_TOWN__' => $mysoc->town,
7878 '__MYCOMPANY_COUNTRY__' => $mysoc->country,
7879 '__MYCOMPANY_COUNTRY_ID__' => $mysoc->country_id,
7880 '__MYCOMPANY_COUNTRY_CODE__' => $mysoc->country_code,
7881 '__MYCOMPANY_CURRENCY_CODE__' => $conf->currency
7885 if (($onlykey || is_object($object)) && (empty($exclude) || !in_array(
'object', $exclude)) && (empty($include) || in_array(
'object', $include))) {
7887 $substitutionarray[
'__ID__'] =
'__ID__';
7888 $substitutionarray[
'__REF__'] =
'__REF__';
7889 $substitutionarray[
'__NEWREF__'] =
'__NEWREF__';
7890 $substitutionarray[
'__LABEL__'] =
'__LABEL__';
7891 $substitutionarray[
'__REF_CLIENT__'] =
'__REF_CLIENT__';
7892 $substitutionarray[
'__REF_SUPPLIER__'] =
'__REF_SUPPLIER__';
7893 $substitutionarray[
'__NOTE_PUBLIC__'] =
'__NOTE_PUBLIC__';
7894 $substitutionarray[
'__NOTE_PRIVATE__'] =
'__NOTE_PRIVATE__';
7895 $substitutionarray[
'__EXTRAFIELD_XXX__'] =
'__EXTRAFIELD_XXX__';
7897 if (isModEnabled(
"societe")) {
7898 $substitutionarray[
'__THIRDPARTY_ID__'] =
'__THIRDPARTY_ID__';
7899 $substitutionarray[
'__THIRDPARTY_NAME__'] =
'__THIRDPARTY_NAME__';
7900 $substitutionarray[
'__THIRDPARTY_NAME_ALIAS__'] =
'__THIRDPARTY_NAME_ALIAS__';
7901 $substitutionarray[
'__THIRDPARTY_CODE_CLIENT__'] =
'__THIRDPARTY_CODE_CLIENT__';
7902 $substitutionarray[
'__THIRDPARTY_CODE_FOURNISSEUR__'] =
'__THIRDPARTY_CODE_FOURNISSEUR__';
7903 $substitutionarray[
'__THIRDPARTY_EMAIL__'] =
'__THIRDPARTY_EMAIL__';
7904 $substitutionarray[
'__THIRDPARTY_PHONE__'] =
'__THIRDPARTY_PHONE__';
7905 $substitutionarray[
'__THIRDPARTY_FAX__'] =
'__THIRDPARTY_FAX__';
7906 $substitutionarray[
'__THIRDPARTY_ADDRESS__'] =
'__THIRDPARTY_ADDRESS__';
7907 $substitutionarray[
'__THIRDPARTY_ZIP__'] =
'__THIRDPARTY_ZIP__';
7908 $substitutionarray[
'__THIRDPARTY_TOWN__'] =
'__THIRDPARTY_TOWN__';
7909 $substitutionarray[
'__THIRDPARTY_IDPROF1__'] =
'__THIRDPARTY_IDPROF1__';
7910 $substitutionarray[
'__THIRDPARTY_IDPROF2__'] =
'__THIRDPARTY_IDPROF2__';
7911 $substitutionarray[
'__THIRDPARTY_IDPROF3__'] =
'__THIRDPARTY_IDPROF3__';
7912 $substitutionarray[
'__THIRDPARTY_IDPROF4__'] =
'__THIRDPARTY_IDPROF4__';
7913 $substitutionarray[
'__THIRDPARTY_IDPROF5__'] =
'__THIRDPARTY_IDPROF5__';
7914 $substitutionarray[
'__THIRDPARTY_IDPROF6__'] =
'__THIRDPARTY_IDPROF6__';
7915 $substitutionarray[
'__THIRDPARTY_TVAINTRA__'] =
'__THIRDPARTY_TVAINTRA__';
7916 $substitutionarray[
'__THIRDPARTY_NOTE_PUBLIC__'] =
'__THIRDPARTY_NOTE_PUBLIC__';
7917 $substitutionarray[
'__THIRDPARTY_NOTE_PRIVATE__'] =
'__THIRDPARTY_NOTE_PRIVATE__';
7919 if (isModEnabled(
'adherent') && (!is_object($object) || $object->element ==
'adherent') && (empty($exclude) || !in_array(
'member', $exclude)) && (empty($include) || in_array(
'member', $include))) {
7920 $substitutionarray[
'__MEMBER_ID__'] =
'__MEMBER_ID__';
7921 $substitutionarray[
'__MEMBER_CIVILITY__'] =
'__MEMBER_CIVILITY__';
7922 $substitutionarray[
'__MEMBER_FIRSTNAME__'] =
'__MEMBER_FIRSTNAME__';
7923 $substitutionarray[
'__MEMBER_LASTNAME__'] =
'__MEMBER_LASTNAME__';
7924 $substitutionarray[
'__MEMBER_USER_LOGIN_INFORMATION__'] =
'Login and pass of the external user account';
7929 if (isModEnabled(
'ticket') && (!is_object($object) || $object->element ==
'ticket') && (empty($exclude) || !in_array(
'ticket', $exclude)) && (empty($include) || in_array(
'ticket', $include))) {
7930 $substitutionarray[
'__TICKET_TRACKID__'] =
'__TICKET_TRACKID__';
7931 $substitutionarray[
'__TICKET_SUBJECT__'] =
'__TICKET_SUBJECT__';
7932 $substitutionarray[
'__TICKET_TYPE__'] =
'__TICKET_TYPE__';
7933 $substitutionarray[
'__TICKET_SEVERITY__'] =
'__TICKET_SEVERITY__';
7934 $substitutionarray[
'__TICKET_CATEGORY__'] =
'__TICKET_CATEGORY__';
7935 $substitutionarray[
'__TICKET_ANALYTIC_CODE__'] =
'__TICKET_ANALYTIC_CODE__';
7936 $substitutionarray[
'__TICKET_MESSAGE__'] =
'__TICKET_MESSAGE__';
7937 $substitutionarray[
'__TICKET_PROGRESSION__'] =
'__TICKET_PROGRESSION__';
7938 $substitutionarray[
'__TICKET_USER_ASSIGN__'] =
'__TICKET_USER_ASSIGN__';
7941 if (isModEnabled(
'recruitment') && (!is_object($object) || $object->element ==
'recruitmentcandidature') && (empty($exclude) || !in_array(
'recruitment', $exclude)) && (empty($include) || in_array(
'recruitment', $include))) {
7942 $substitutionarray[
'__CANDIDATE_FULLNAME__'] =
'__CANDIDATE_FULLNAME__';
7943 $substitutionarray[
'__CANDIDATE_FIRSTNAME__'] =
'__CANDIDATE_FIRSTNAME__';
7944 $substitutionarray[
'__CANDIDATE_LASTNAME__'] =
'__CANDIDATE_LASTNAME__';
7946 if (isModEnabled(
'project') && (empty($exclude) || !in_array(
'project', $exclude)) && (empty($include) || in_array(
'project', $include))) {
7947 $substitutionarray[
'__PROJECT_ID__'] =
'__PROJECT_ID__';
7948 $substitutionarray[
'__PROJECT_REF__'] =
'__PROJECT_REF__';
7949 $substitutionarray[
'__PROJECT_NAME__'] =
'__PROJECT_NAME__';
7953 if (isModEnabled(
'contrat') && (!is_object($object) || $object->element ==
'contract') && (empty($exclude) || !in_array(
'contract', $exclude)) && (empty($include) || in_array(
'contract', $include))) {
7954 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATE__'] =
'Highest date planned for a service start';
7955 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATETIME__'] =
'Highest date and hour planned for service start';
7956 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATE__'] =
'Lowest data for planned expiration of service';
7957 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATETIME__'] =
'Lowest date and hour for planned expiration of service';
7959 if (isModEnabled(
"propal") && (!is_object($object) || $object->element ==
'propal') && (empty($exclude) || !in_array(
'propal', $exclude)) && (empty($include) || in_array(
'propal', $include))) {
7960 $substitutionarray[
'__ONLINE_SIGN_URL__'] =
'ToOfferALinkForOnlineSignature';
7962 if (isModEnabled(
"ficheinter") && (!is_object($object) || $object->element ==
'fichinter') && (empty($exclude) || !in_array(
'intervention', $exclude)) && (empty($include) || in_array(
'intervention', $include))) {
7963 $substitutionarray[
'__ONLINE_SIGN_FICHINTER_URL__'] =
'ToOfferALinkForOnlineSignature';
7965 $substitutionarray[
'__ONLINE_PAYMENT_URL__'] =
'UrlToPayOnlineIfApplicable';
7966 $substitutionarray[
'__ONLINE_PAYMENT_TEXT_AND_URL__'] =
'TextAndUrlToPayOnlineIfApplicable';
7967 $substitutionarray[
'__SECUREKEYPAYMENT__'] =
'Security key (if key is not unique per record)';
7968 $substitutionarray[
'__SECUREKEYPAYMENT_MEMBER__'] =
'Security key for payment on a member subscription (one key per member)';
7969 $substitutionarray[
'__SECUREKEYPAYMENT_ORDER__'] =
'Security key for payment on an order';
7970 $substitutionarray[
'__SECUREKEYPAYMENT_INVOICE__'] =
'Security key for payment on an invoice';
7971 $substitutionarray[
'__SECUREKEYPAYMENT_CONTRACTLINE__'] =
'Security key for payment on a service of a contract';
7973 $substitutionarray[
'__DIRECTDOWNLOAD_URL_PROPOSAL__'] =
'Direct download url of a proposal';
7974 $substitutionarray[
'__DIRECTDOWNLOAD_URL_ORDER__'] =
'Direct download url of an order';
7975 $substitutionarray[
'__DIRECTDOWNLOAD_URL_INVOICE__'] =
'Direct download url of an invoice';
7976 $substitutionarray[
'__DIRECTDOWNLOAD_URL_CONTRACT__'] =
'Direct download url of a contract';
7977 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_PROPOSAL__'] =
'Direct download url of a supplier proposal';
7979 if (isModEnabled(
"expedition") && (!is_object($object) || $object->element ==
'shipping')) {
7980 $substitutionarray[
'__SHIPPINGTRACKNUM__'] =
'Shipping tracking number';
7981 $substitutionarray[
'__SHIPPINGTRACKNUMURL__'] =
'Shipping tracking url';
7983 if (isModEnabled(
"reception") && (!is_object($object) || $object->element ==
'reception')) {
7984 $substitutionarray[
'__RECEPTIONTRACKNUM__'] =
'Shippin tracking number of shipment';
7985 $substitutionarray[
'__RECEPTIONTRACKNUMURL__'] =
'Shipping tracking url';
7988 $substitutionarray[
'__ID__'] = $object->id;
7989 $substitutionarray[
'__REF__'] = $object->ref;
7990 $substitutionarray[
'__NEWREF__'] = $object->newref;
7991 $substitutionarray[
'__LABEL__'] = (isset($object->label) ? $object->label : (isset($object->title) ? $object->title :
null));
7992 $substitutionarray[
'__REF_CLIENT__'] = (isset($object->ref_client) ? $object->ref_client : (isset($object->ref_customer) ? $object->ref_customer :
null));
7993 $substitutionarray[
'__REF_SUPPLIER__'] = (isset($object->ref_supplier) ? $object->ref_supplier :
null);
7994 $substitutionarray[
'__NOTE_PUBLIC__'] = (isset($object->note_public) ? $object->note_public :
null);
7995 $substitutionarray[
'__NOTE_PRIVATE__'] = (isset($object->note_private) ? $object->note_private :
null);
7996 if ($object->element ==
"shipping") {
7997 $substitutionarray[
'__DATE_DELIVERY__'] = (isset($object->date_delivery) ?
dol_print_date($object->date_delivery,
'day', 0, $outputlangs) :
'');
7999 $substitutionarray[
'__DATE_DELIVERY__'] = (isset($object->date_livraison) ?
dol_print_date($object->date_livraison,
'day', 0, $outputlangs) :
'');
8001 $substitutionarray[
'__DATE_DELIVERY_DAY__'] = (isset($object->date_livraison) ?
dol_print_date($object->date_livraison,
"%d") :
'');
8002 $substitutionarray[
'__DATE_DELIVERY_DAY_TEXT__'] = (isset($object->date_livraison) ?
dol_print_date($object->date_livraison,
"%A") :
'');
8003 $substitutionarray[
'__DATE_DELIVERY_MON__'] = (isset($object->date_livraison) ?
dol_print_date($object->date_livraison,
"%m") :
'');
8004 $substitutionarray[
'__DATE_DELIVERY_MON_TEXT__'] = (isset($object->date_livraison) ?
dol_print_date($object->date_livraison,
"%b") :
'');
8005 $substitutionarray[
'__DATE_DELIVERY_YEAR__'] = (isset($object->date_livraison) ?
dol_print_date($object->date_livraison,
"%Y") :
'');
8006 $substitutionarray[
'__DATE_DELIVERY_HH__'] = (isset($object->date_livraison) ?
dol_print_date($object->date_livraison,
"%H") :
'');
8007 $substitutionarray[
'__DATE_DELIVERY_MM__'] = (isset($object->date_livraison) ?
dol_print_date($object->date_livraison,
"%M") :
'');
8008 $substitutionarray[
'__DATE_DELIVERY_SS__'] = (isset($object->date_livraison) ?
dol_print_date($object->date_livraison,
"%S") :
'');
8011 $substitutionarray[
'__REFCLIENT__'] = (isset($object->ref_client) ? $object->ref_client : (isset($object->ref_customer) ? $object->ref_customer :
null));
8012 $substitutionarray[
'__REFSUPPLIER__'] = (isset($object->ref_supplier) ? $object->ref_supplier :
null);
8013 $substitutionarray[
'__SUPPLIER_ORDER_DATE_DELIVERY__'] = (isset($object->date_livraison) ?
dol_print_date($object->date_livraison,
'day', 0, $outputlangs) :
'');
8014 $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 :
'')) :
'');
8016 if (is_object($object) && ($object->element ==
'adherent' || $object->element ==
'member') && $object->id > 0) {
8017 $birthday = (empty($object->birth) ?
'' :
dol_print_date($object->birth,
'day'));
8019 $substitutionarray[
'__MEMBER_ID__'] = (isset($object->id) ? $object->id :
'');
8020 if (method_exists($object,
'getCivilityLabel')) {
8021 $substitutionarray[
'__MEMBER_CIVILITY__'] = $object->getCivilityLabel();
8023 $substitutionarray[
'__MEMBER_FIRSTNAME__'] = (isset($object->firstname) ? $object->firstname :
'');
8024 $substitutionarray[
'__MEMBER_LASTNAME__'] = (isset($object->lastname) ? $object->lastname :
'');
8025 $substitutionarray[
'__MEMBER_USER_LOGIN_INFORMATION__'] =
'';
8026 if (method_exists($object,
'getFullName')) {
8027 $substitutionarray[
'__MEMBER_FULLNAME__'] = $object->getFullName($outputlangs);
8029 $substitutionarray[
'__MEMBER_COMPANY__'] = (isset($object->societe) ? $object->societe :
'');
8030 $substitutionarray[
'__MEMBER_ADDRESS__'] = (isset($object->address) ? $object->address :
'');
8031 $substitutionarray[
'__MEMBER_ZIP__'] = (isset($object->zip) ? $object->zip :
'');
8032 $substitutionarray[
'__MEMBER_TOWN__'] = (isset($object->town) ? $object->town :
'');
8033 $substitutionarray[
'__MEMBER_COUNTRY__'] = (isset($object->country) ? $object->country :
'');
8034 $substitutionarray[
'__MEMBER_EMAIL__'] = (isset($object->email) ? $object->email :
'');
8035 $substitutionarray[
'__MEMBER_BIRTH__'] = (isset($birthday) ? $birthday :
'');
8036 $substitutionarray[
'__MEMBER_PHOTO__'] = (isset($object->photo) ? $object->photo :
'');
8037 $substitutionarray[
'__MEMBER_LOGIN__'] = (isset($object->login) ? $object->login :
'');
8038 $substitutionarray[
'__MEMBER_PASSWORD__'] = (isset($object->pass) ? $object->pass :
'');
8039 $substitutionarray[
'__MEMBER_PHONE__'] = (isset($object->phone) ?
dol_print_phone($object->phone) :
'');
8040 $substitutionarray[
'__MEMBER_PHONEPRO__'] = (isset($object->phone_perso) ?
dol_print_phone($object->phone_perso) :
'');
8041 $substitutionarray[
'__MEMBER_PHONEMOBILE__'] = (isset($object->phone_mobile) ?
dol_print_phone($object->phone_mobile) :
'');
8042 $substitutionarray[
'__MEMBER_TYPE__'] = (isset($object->type) ? $object->type :
'');
8043 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE__'] =
dol_print_date($object->first_subscription_date,
'day');
8044 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_START__'] = (isset($object->first_subscription_date_start) ?
dol_print_date($object->first_subscription_date_start,
'day') :
'');
8045 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_END__'] = (isset($object->first_subscription_date_end) ?
dol_print_date($object->first_subscription_date_end,
'day') :
'');
8046 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE__'] =
dol_print_date($object->last_subscription_date,
'day');
8047 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_START__'] =
dol_print_date($object->last_subscription_date_start,
'day');
8048 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_END__'] =
dol_print_date($object->last_subscription_date_end,
'day');
8051 if (is_object($object) && $object->element ==
'societe') {
8052 $substitutionarray[
'__THIRDPARTY_ID__'] = (is_object($object) ? $object->id :
'');
8053 $substitutionarray[
'__THIRDPARTY_NAME__'] = (is_object($object) ? $object->name :
'');
8054 $substitutionarray[
'__THIRDPARTY_NAME_ALIAS__'] = (is_object($object) ? $object->name_alias :
'');
8055 $substitutionarray[
'__THIRDPARTY_CODE_CLIENT__'] = (is_object($object) ? $object->code_client :
'');
8056 $substitutionarray[
'__THIRDPARTY_CODE_FOURNISSEUR__'] = (is_object($object) ? $object->code_fournisseur :
'');
8057 $substitutionarray[
'__THIRDPARTY_EMAIL__'] = (is_object($object) ? $object->email :
'');
8058 $substitutionarray[
'__THIRDPARTY_PHONE__'] = (is_object($object) ?
dol_print_phone($object->phone) :
'');
8059 $substitutionarray[
'__THIRDPARTY_FAX__'] = (is_object($object) ?
dol_print_phone($object->fax) :
'');
8060 $substitutionarray[
'__THIRDPARTY_ADDRESS__'] = (is_object($object) ? $object->address :
'');
8061 $substitutionarray[
'__THIRDPARTY_ZIP__'] = (is_object($object) ? $object->zip :
'');
8062 $substitutionarray[
'__THIRDPARTY_TOWN__'] = (is_object($object) ? $object->town :
'');
8063 $substitutionarray[
'__THIRDPARTY_COUNTRY_ID__'] = (is_object($object) ? $object->country_id :
'');
8064 $substitutionarray[
'__THIRDPARTY_COUNTRY_CODE__'] = (is_object($object) ? $object->country_code :
'');
8065 $substitutionarray[
'__THIRDPARTY_IDPROF1__'] = (is_object($object) ? $object->idprof1 :
'');
8066 $substitutionarray[
'__THIRDPARTY_IDPROF2__'] = (is_object($object) ? $object->idprof2 :
'');
8067 $substitutionarray[
'__THIRDPARTY_IDPROF3__'] = (is_object($object) ? $object->idprof3 :
'');
8068 $substitutionarray[
'__THIRDPARTY_IDPROF4__'] = (is_object($object) ? $object->idprof4 :
'');
8069 $substitutionarray[
'__THIRDPARTY_IDPROF5__'] = (is_object($object) ? $object->idprof5 :
'');
8070 $substitutionarray[
'__THIRDPARTY_IDPROF6__'] = (is_object($object) ? $object->idprof6 :
'');
8071 $substitutionarray[
'__THIRDPARTY_TVAINTRA__'] = (is_object($object) ? $object->tva_intra :
'');
8072 $substitutionarray[
'__THIRDPARTY_NOTE_PUBLIC__'] = (is_object($object) ?
dol_htmlentitiesbr($object->note_public) :
'');
8073 $substitutionarray[
'__THIRDPARTY_NOTE_PRIVATE__'] = (is_object($object) ?
dol_htmlentitiesbr($object->note_private) :
'');
8074 } elseif (is_object($object->thirdparty)) {
8075 $substitutionarray[
'__THIRDPARTY_ID__'] = (is_object($object->thirdparty) ? $object->thirdparty->id :
'');
8076 $substitutionarray[
'__THIRDPARTY_NAME__'] = (is_object($object->thirdparty) ? $object->thirdparty->name :
'');
8077 $substitutionarray[
'__THIRDPARTY_NAME_ALIAS__'] = (is_object($object->thirdparty) ? $object->thirdparty->name_alias :
'');
8078 $substitutionarray[
'__THIRDPARTY_CODE_CLIENT__'] = (is_object($object->thirdparty) ? $object->thirdparty->code_client :
'');
8079 $substitutionarray[
'__THIRDPARTY_CODE_FOURNISSEUR__'] = (is_object($object->thirdparty) ? $object->thirdparty->code_fournisseur :
'');
8080 $substitutionarray[
'__THIRDPARTY_EMAIL__'] = (is_object($object->thirdparty) ? $object->thirdparty->email :
'');
8081 $substitutionarray[
'__THIRDPARTY_PHONE__'] = (is_object($object->thirdparty) ?
dol_print_phone($object->thirdparty->phone) :
'');
8082 $substitutionarray[
'__THIRDPARTY_FAX__'] = (is_object($object->thirdparty) ?
dol_print_phone($object->thirdparty->fax) :
'');
8083 $substitutionarray[
'__THIRDPARTY_ADDRESS__'] = (is_object($object->thirdparty) ? $object->thirdparty->address :
'');
8084 $substitutionarray[
'__THIRDPARTY_ZIP__'] = (is_object($object->thirdparty) ? $object->thirdparty->zip :
'');
8085 $substitutionarray[
'__THIRDPARTY_TOWN__'] = (is_object($object->thirdparty) ? $object->thirdparty->town :
'');
8086 $substitutionarray[
'__THIRDPARTY_COUNTRY_ID__'] = (is_object($object->thirdparty) ? $object->thirdparty->country_id :
'');
8087 $substitutionarray[
'__THIRDPARTY_COUNTRY_CODE__'] = (is_object($object->thirdparty) ? $object->thirdparty->country_code :
'');
8088 $substitutionarray[
'__THIRDPARTY_IDPROF1__'] = (is_object($object->thirdparty) ? $object->thirdparty->idprof1 :
'');
8089 $substitutionarray[
'__THIRDPARTY_IDPROF2__'] = (is_object($object->thirdparty) ? $object->thirdparty->idprof2 :
'');
8090 $substitutionarray[
'__THIRDPARTY_IDPROF3__'] = (is_object($object->thirdparty) ? $object->thirdparty->idprof3 :
'');
8091 $substitutionarray[
'__THIRDPARTY_IDPROF4__'] = (is_object($object->thirdparty) ? $object->thirdparty->idprof4 :
'');
8092 $substitutionarray[
'__THIRDPARTY_IDPROF5__'] = (is_object($object->thirdparty) ? $object->thirdparty->idprof5 :
'');
8093 $substitutionarray[
'__THIRDPARTY_IDPROF6__'] = (is_object($object->thirdparty) ? $object->thirdparty->idprof6 :
'');
8094 $substitutionarray[
'__THIRDPARTY_TVAINTRA__'] = (is_object($object->thirdparty) ? $object->thirdparty->tva_intra :
'');
8095 $substitutionarray[
'__THIRDPARTY_NOTE_PUBLIC__'] = (is_object($object->thirdparty) ?
dol_htmlentitiesbr($object->thirdparty->note_public) :
'');
8096 $substitutionarray[
'__THIRDPARTY_NOTE_PRIVATE__'] = (is_object($object->thirdparty) ?
dol_htmlentitiesbr($object->thirdparty->note_private) :
'');
8099 if (is_object($object) && $object->element ==
'recruitmentcandidature') {
8100 $substitutionarray[
'__CANDIDATE_FULLNAME__'] = $object->getFullName($outputlangs);
8101 $substitutionarray[
'__CANDIDATE_FIRSTNAME__'] = isset($object->firstname) ? $object->firstname :
'';
8102 $substitutionarray[
'__CANDIDATE_LASTNAME__'] = isset($object->lastname) ? $object->lastname :
'';
8104 if (is_object($object) && $object->element ==
'conferenceorboothattendee') {
8105 $substitutionarray[
'__ATTENDEE_FULLNAME__'] = $object->getFullName($outputlangs);
8106 $substitutionarray[
'__ATTENDEE_FIRSTNAME__'] = isset($object->firstname) ? $object->firstname :
'';
8107 $substitutionarray[
'__ATTENDEE_LASTNAME__'] = isset($object->lastname) ? $object->lastname :
'';
8111 if (is_object($object->project)) {
8112 $project = $object->project;
8113 } elseif (is_object($object->projet)) {
8114 $project = $object->projet;
8117 $substitutionarray[
'__PROJECT_ID__'] = $project->id;
8118 $substitutionarray[
'__PROJECT_REF__'] = $project->ref;
8119 $substitutionarray[
'__PROJECT_NAME__'] = $project->title;
8121 if (is_object($object) && $object->element ==
'project') {
8122 $substitutionarray[
'__PROJECT_NAME__'] = $object->title;
8125 if (is_object($object) && $object->element ==
'shipping') {
8126 $substitutionarray[
'__SHIPPINGTRACKNUM__'] = $object->tracking_number;
8127 $substitutionarray[
'__SHIPPINGTRACKNUMURL__'] = $object->tracking_url;
8129 if (is_object($object) && $object->element ==
'reception') {
8130 $substitutionarray[
'__RECEPTIONTRACKNUM__'] = $object->tracking_number;
8131 $substitutionarray[
'__RECEPTIONTRACKNUMURL__'] = $object->tracking_url;
8134 if (is_object($object) && $object->element ==
'contrat' && $object->id > 0 && is_array($object->lines)) {
8135 $dateplannedstart =
'';
8136 $datenextexpiration =
'';
8137 foreach ($object->lines as $line) {
8138 if ($line->date_start > $dateplannedstart) {
8139 $dateplannedstart = $line->date_start;
8141 if ($line->statut == 4 && $line->date_end && (!$datenextexpiration || $line->date_end < $datenextexpiration)) {
8142 $datenextexpiration = $line->date_end;
8145 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATE__'] =
dol_print_date($dateplannedstart,
'day');
8146 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATETIME__'] =
dol_print_date($dateplannedstart,
'standard');
8147 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATE__'] =
dol_print_date($datenextexpiration,
'day');
8148 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATETIME__'] =
dol_print_date($datenextexpiration,
'standard');
8151 if (is_object($object) && $object->element ==
'ticket') {
8152 $substitutionarray[
'__TICKET_TRACKID__'] = $object->track_id;
8153 $substitutionarray[
'__REF__'] = $object->ref;
8154 $substitutionarray[
'__TICKET_SUBJECT__'] = $object->subject;
8155 $substitutionarray[
'__TICKET_TYPE__'] = $object->type_code;
8156 $substitutionarray[
'__TICKET_SEVERITY__'] = $object->severity_code;
8157 $substitutionarray[
'__TICKET_CATEGORY__'] = $object->category_code;
8158 $substitutionarray[
'__TICKET_ANALYTIC_CODE__'] = $object->category_code;
8159 $substitutionarray[
'__TICKET_MESSAGE__'] = $object->message;
8160 $substitutionarray[
'__TICKET_PROGRESSION__'] = $object->progress;
8161 $userstat =
new User($db);
8162 if ($object->fk_user_assign > 0) {
8163 $userstat->fetch($object->fk_user_assign);
8164 $substitutionarray[
'__TICKET_USER_ASSIGN__'] =
dolGetFirstLastname($userstat->firstname, $userstat->lastname);
8167 if ($object->fk_user_create > 0) {
8168 $userstat->fetch($object->fk_user_create);
8169 $substitutionarray[
'__USER_CREATE__'] =
dolGetFirstLastname($userstat->firstname, $userstat->lastname);
8174 if ($object->table_element && $object->id > 0) {
8175 if (!is_object($extrafields)) {
8178 $extrafields->fetch_name_optionals_label($object->table_element,
true);
8180 if ($object->fetch_optionals() > 0) {
8181 if (is_array($extrafields->attributes[$object->table_element][
'label']) && count($extrafields->attributes[$object->table_element][
'label']) > 0) {
8182 foreach ($extrafields->attributes[$object->table_element][
'label'] as $key => $label) {
8183 if ($extrafields->attributes[$object->table_element][
'type'][$key] ==
'date') {
8184 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] =
dol_print_date($object->array_options[
'options_'.$key],
'day');
8185 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_LOCALE__'] =
dol_print_date($object->array_options[
'options_'.$key],
'day',
'tzserver', $outputlangs);
8186 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_RFC__'] =
dol_print_date($object->array_options[
'options_'.$key],
'dayrfc');
8187 } elseif ($extrafields->attributes[$object->table_element][
'type'][$key] ==
'datetime') {
8188 $datetime = $object->array_options[
'options_'.$key];
8189 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'dayhour') :
'');
8190 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_LOCALE__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'dayhour',
'tzserver', $outputlangs) :
'');
8191 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_DAY_LOCALE__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'day',
'tzserver', $outputlangs) :
'');
8192 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_RFC__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'dayhourrfc') :
'');
8193 } elseif ($extrafields->attributes[$object->table_element][
'type'][$key] ==
'phone') {
8194 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] =
dol_print_phone($object->array_options[
'options_'.$key]);
8195 } elseif ($extrafields->attributes[$object->table_element][
'type'][$key] ==
'price') {
8196 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] = $object->array_options[
'options_'.$key];
8197 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_FORMATED__'] =
price($object->array_options[
'options_'.$key]);
8198 } elseif ($extrafields->attributes[$object->table_element][
'type'][$key] !=
'separator') {
8199 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] = !empty($object->array_options[
'options_'.$key]) ? $object->array_options[
'options_'.$key] :
'';
8208 if (empty($substitutionarray[
'__REF__'])) {
8212 require_once DOL_DOCUMENT_ROOT.
'/core/lib/payments.lib.php';
8213 $outputlangs->loadLangs(array(
'paypal',
'other'));
8216 $typeforonlinepayment =
'free';
8217 if (is_object($object) && $object->element ==
'commande') {
8218 $typeforonlinepayment =
'order';
8220 if (is_object($object) && $object->element ==
'facture') {
8221 $typeforonlinepayment =
'invoice';
8223 if (is_object($object) && $object->element ==
'member') {
8224 $typeforonlinepayment =
'member';
8225 if (!empty($object->last_subscription_amount)) {
8226 $amounttouse = $object->last_subscription_amount;
8229 if (is_object($object) && $object->element ==
'contrat') {
8230 $typeforonlinepayment =
'contract';
8232 if (is_object($object) && $object->element ==
'fichinter') {
8233 $typeforonlinepayment =
'ficheinter';
8236 $url = getOnlinePaymentUrl(0, $typeforonlinepayment, $substitutionarray[
'__REF__'], $amounttouse);
8240 if ($object->id > 0) {
8241 $substitutionarray[
'__ONLINE_PAYMENT_TEXT_AND_URL__'] = ($paymenturl ?str_replace(
'\n',
"\n", $outputlangs->trans(
"PredefinedMailContentLink", $paymenturl)) :
'');
8242 $substitutionarray[
'__ONLINE_PAYMENT_URL__'] = $paymenturl;
8244 if (!empty($conf->global->PROPOSAL_ALLOW_EXTERNAL_DOWNLOAD) && is_object($object) && $object->element ==
'propal') {
8245 $substitutionarray[
'__DIRECTDOWNLOAD_URL_PROPOSAL__'] = $object->getLastMainDocLink($object->element);
8247 $substitutionarray[
'__DIRECTDOWNLOAD_URL_PROPOSAL__'] =
'';
8249 if (!empty($conf->global->ORDER_ALLOW_EXTERNAL_DOWNLOAD) && is_object($object) && $object->element ==
'commande') {
8250 $substitutionarray[
'__DIRECTDOWNLOAD_URL_ORDER__'] = $object->getLastMainDocLink($object->element);
8252 $substitutionarray[
'__DIRECTDOWNLOAD_URL_ORDER__'] =
'';
8254 if (!empty($conf->global->INVOICE_ALLOW_EXTERNAL_DOWNLOAD) && is_object($object) && $object->element ==
'facture') {
8255 $substitutionarray[
'__DIRECTDOWNLOAD_URL_INVOICE__'] = $object->getLastMainDocLink($object->element);
8257 $substitutionarray[
'__DIRECTDOWNLOAD_URL_INVOICE__'] =
'';
8259 if (!empty($conf->global->CONTRACT_ALLOW_EXTERNAL_DOWNLOAD) && is_object($object) && $object->element ==
'contrat') {
8260 $substitutionarray[
'__DIRECTDOWNLOAD_URL_CONTRACT__'] = $object->getLastMainDocLink($object->element);
8262 $substitutionarray[
'__DIRECTDOWNLOAD_URL_CONTRACT__'] =
'';
8264 if (!empty($conf->global->FICHINTER_ALLOW_EXTERNAL_DOWNLOAD) && is_object($object) && $object->element ==
'fichinter') {
8265 $substitutionarray[
'__DIRECTDOWNLOAD_URL_FICHINTER__'] = $object->getLastMainDocLink($object->element);
8267 $substitutionarray[
'__DIRECTDOWNLOAD_URL_FICHINTER__'] =
'';
8269 if (!empty($conf->global->SUPPLIER_PROPOSAL_ALLOW_EXTERNAL_DOWNLOAD) && is_object($object) && $object->element ==
'supplier_proposal') {
8270 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_PROPOSAL__'] = $object->getLastMainDocLink($object->element);
8272 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_PROPOSAL__'] =
'';
8275 if (is_object($object) && $object->element ==
'propal') {
8276 $substitutionarray[
'__URL_PROPOSAL__'] = DOL_MAIN_URL_ROOT.
"/comm/propal/card.php?id=".$object->id;
8277 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
8278 $substitutionarray[
'__ONLINE_SIGN_URL__'] = getOnlineSignatureUrl(0,
'proposal', $object->ref);
8280 if (is_object($object) && $object->element ==
'commande') {
8281 $substitutionarray[
'__URL_ORDER__'] = DOL_MAIN_URL_ROOT.
"/commande/card.php?id=".$object->id;
8283 if (is_object($object) && $object->element ==
'facture') {
8284 $substitutionarray[
'__URL_INVOICE__'] = DOL_MAIN_URL_ROOT.
"/compta/facture/card.php?id=".$object->id;
8286 if (is_object($object) && $object->element ==
'contrat') {
8287 $substitutionarray[
'__URL_CONTRACT__'] = DOL_MAIN_URL_ROOT.
"/contrat/card.php?id=".$object->id;
8288 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
8289 $substitutionarray[
'__ONLINE_SIGN_URL__'] = getOnlineSignatureUrl(0,
'contract', $object->ref);
8291 if (is_object($object) && $object->element ==
'fichinter') {
8292 $substitutionarray[
'__URL_FICHINTER__'] = DOL_MAIN_URL_ROOT.
"/fichinter/card.php?id=".$object->id;
8293 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
8294 $substitutionarray[
'__ONLINE_SIGN_FICHINTER_URL__'] = getOnlineSignatureUrl(0,
'fichinter', $object->ref);
8296 if (is_object($object) && $object->element ==
'supplier_proposal') {
8297 $substitutionarray[
'__URL_SUPPLIER_PROPOSAL__'] = DOL_MAIN_URL_ROOT.
"/supplier_proposal/card.php?id=".$object->id;
8299 if (is_object($object) && $object->element ==
'shipping') {
8300 $substitutionarray[
'__URL_SHIPMENT__'] = DOL_MAIN_URL_ROOT.
"/expedition/card.php?id=".$object->id;
8304 if (is_object($object) && $object->element ==
'action') {
8305 $substitutionarray[
'__EVENT_LABEL__'] = $object->label;
8306 $substitutionarray[
'__EVENT_DATE__'] =
dol_print_date($object->datep,
'%A %d %b %Y');
8307 $substitutionarray[
'__EVENT_TIME__'] =
dol_print_date($object->datep,
'%H:%M:%S');
8311 if ((empty($exclude) || !in_array(
'objectamount', $exclude)) && (empty($include) || in_array(
'objectamount', $include))) {
8312 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functionsnumtoword.lib.php';
8314 $substitutionarray[
'__DATE_YMD__'] = is_object($object) ? (isset($object->date) ?
dol_print_date($object->date,
'day', 0, $outputlangs) :
null) :
'';
8315 $substitutionarray[
'__DATE_DUE_YMD__'] = is_object($object) ? (isset($object->date_lim_reglement) ?
dol_print_date($object->date_lim_reglement,
'day', 0, $outputlangs) :
null) :
'';
8317 $already_payed_all = 0;
8318 if (is_object($object) && ($object instanceof
Facture)) {
8319 $already_payed_all = $object->sumpayed + $object->sumdeposit + $object->sumcreditnote;
8322 $substitutionarray[
'__AMOUNT_EXCL_TAX__'] = is_object($object) ? $object->total_ht :
'';
8324 $substitutionarray[
'__AMOUNT__'] = is_object($object) ? $object->total_ttc :
'';
8325 $substitutionarray[
'__AMOUNT_TEXT__'] = is_object($object) ?
dol_convertToWord($object->total_ttc, $outputlangs,
'',
true) :
'';
8326 $substitutionarray[
'__AMOUNT_TEXTCURRENCY__'] = is_object($object) ?
dol_convertToWord($object->total_ttc, $outputlangs, $conf->currency,
true) :
'';
8328 $substitutionarray[
'__AMOUNT_REMAIN__'] = is_object($object) ?
price2num($object->total_ttc - $already_payed_all,
'MT') :
'';
8330 $substitutionarray[
'__AMOUNT_VAT__'] = is_object($object) ? (isset($object->total_vat) ? $object->total_vat : $object->total_tva) :
'';
8331 $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)) :
'';
8332 $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)) :
'';
8334 if ($onlykey != 2 || $mysoc->useLocalTax(1)) {
8335 $substitutionarray[
'__AMOUNT_TAX2__'] = is_object($object) ? $object->total_localtax1 :
'';
8337 if ($onlykey != 2 || $mysoc->useLocalTax(2)) {
8338 $substitutionarray[
'__AMOUNT_TAX3__'] = is_object($object) ? $object->total_localtax2 :
'';
8342 $substitutionarray[
'__AMOUNT_EXCL_TAX_FORMATED__'] = is_object($object) ? ($object->total_ht ?
price($object->total_ht, 0, $outputlangs, 0, -1, -1, $conf->currency) :
null) :
'';
8343 $substitutionarray[
'__AMOUNT_FORMATED__'] = is_object($object) ? ($object->total_ttc ?
price($object->total_ttc, 0, $outputlangs, 0, -1, -1, $conf->currency) :
null) :
'';
8344 $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) :
'';
8345 $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)) :
'';
8346 if ($onlykey != 2 || $mysoc->useLocalTax(1)) {
8347 $substitutionarray[
'__AMOUNT_TAX2_FORMATED__'] = is_object($object) ? ($object->total_localtax1 ?
price($object->total_localtax1, 0, $outputlangs, 0, -1, -1, $conf->currency) :
null) :
'';
8349 if ($onlykey != 2 || $mysoc->useLocalTax(2)) {
8350 $substitutionarray[
'__AMOUNT_TAX3_FORMATED__'] = is_object($object) ? ($object->total_localtax2 ?
price($object->total_localtax2, 0, $outputlangs, 0, -1, -1, $conf->currency) :
null) :
'';
8353 $substitutionarray[
'__AMOUNT_MULTICURRENCY__'] = (is_object($object) && isset($object->multicurrency_total_ttc)) ? $object->multicurrency_total_ttc :
'';
8354 $substitutionarray[
'__AMOUNT_MULTICURRENCY_TEXT__'] = (is_object($object) && isset($object->multicurrency_total_ttc)) ?
dol_convertToWord($object->multicurrency_total_ttc, $outputlangs,
'',
true) :
'';
8355 $substitutionarray[
'__AMOUNT_MULTICURRENCY_TEXTCURRENCY__'] = (is_object($object) && isset($object->multicurrency_total_ttc)) ?
dol_convertToWord($object->multicurrency_total_ttc, $outputlangs, $object->multicurrency_code,
true) :
'';
8359 if ($onlykey != 2) {
8360 $substitutionarray[
'__TOTAL_TTC__'] = is_object($object) ? $object->total_ttc :
'';
8361 $substitutionarray[
'__TOTAL_HT__'] = is_object($object) ? $object->total_ht :
'';
8362 $substitutionarray[
'__TOTAL_VAT__'] = is_object($object) ? (isset($object->total_vat) ? $object->total_vat : $object->total_tva) :
'';
8367 if ((empty($exclude) || !in_array(
'date', $exclude)) && (empty($include) || in_array(
'date', $include))) {
8368 include_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
8378 $daytext = $outputlangs->trans(
'Day'.$tmp[
'wday']);
8380 $substitutionarray = array_merge($substitutionarray, array(
8381 '__NOW_TMS__' => (
int) $now,
8382 '__NOW_TMS_YMD__' =>
dol_print_date($now,
'day', 0, $outputlangs),
8383 '__DAY__' => (
string) $tmp[
'mday'],
8384 '__DAY_TEXT__' => $daytext,
8385 '__DAY_TEXT_SHORT__' =>
dol_trunc($daytext, 3,
'right',
'UTF-8', 1),
8386 '__DAY_TEXT_MIN__' =>
dol_trunc($daytext, 1,
'right',
'UTF-8', 1),
8387 '__MONTH__' => (
string) $tmp[
'mon'],
8388 '__MONTH_TEXT__' => $outputlangs->trans(
'Month'.sprintf(
"%02d", $tmp[
'mon'])),
8389 '__MONTH_TEXT_SHORT__' => $outputlangs->trans(
'MonthShort'.sprintf(
"%02d", $tmp[
'mon'])),
8390 '__MONTH_TEXT_MIN__' => $outputlangs->trans(
'MonthVeryShort'.sprintf(
"%02d", $tmp[
'mon'])),
8391 '__YEAR__' => (
string) $tmp[
'year'],
8392 '__PREVIOUS_DAY__' => (
string) $tmp2[
'day'],
8393 '__PREVIOUS_MONTH__' => (
string) $tmp3[
'month'],
8394 '__PREVIOUS_YEAR__' => (
string) ($tmp[
'year'] - 1),
8395 '__NEXT_DAY__' => (
string) $tmp4[
'day'],
8396 '__NEXT_MONTH__' => (
string) $tmp5[
'month'],
8397 '__NEXT_YEAR__' => (
string) ($tmp[
'year'] + 1),
8401 if (isModEnabled(
'multicompany')) {
8402 $substitutionarray = array_merge($substitutionarray, array(
'__ENTITY_ID__' => $conf->entity));
8404 if ((empty($exclude) || !in_array(
'system', $exclude)) && (empty($include) || in_array(
'user', $include))) {
8405 $substitutionarray[
'__DOL_MAIN_URL_ROOT__'] = DOL_MAIN_URL_ROOT;
8406 $substitutionarray[
'__(AnyTranslationKey)__'] = $outputlangs->trans(
'TranslationOfKey');
8407 $substitutionarray[
'__(AnyTranslationKey|langfile)__'] = $outputlangs->trans(
'TranslationOfKey').
' (load also language file before)';
8408 $substitutionarray[
'__[AnyConstantKey]__'] = $outputlangs->trans(
'ValueOfConstantKey');
8411 return $substitutionarray;
8430function make_substitutions($text, $substitutionarray, $outputlangs =
null, $converttextinhtmlifnecessary = 0)
8432 global $conf, $langs;
8434 if (!is_array($substitutionarray)) {
8435 return 'ErrorBadParameterSubstitutionArrayWhenCalling_make_substitutions';
8438 if (empty($outputlangs)) {
8439 $outputlangs = $langs;
8449 if (is_object($outputlangs)) {
8451 while (preg_match(
'/__\(([^\)]+)\)__/', $text, $reg)) {
8453 $tmp = explode(
'|', $reg[1]);
8454 if (!empty($tmp[1])) {
8455 $outputlangs->load($tmp[1]);
8458 $value = $outputlangs->transnoentitiesnoconv($reg[1]);
8460 if (empty($converttextinhtmlifnecessary)) {
8462 $text = preg_replace(
'/__\('.preg_quote($reg[1],
'/').
'\)__/', $msgishtml ?
dol_htmlentitiesbr($value) : $value, $text);
8476 $text = preg_replace(
'/__\('.preg_quote($reg[1],
'/').
'\)__/', $value, $text);
8484 while (preg_match(
'/__\[([^\]]+)\]__/', $text, $reg)) {
8485 $keyfound = $reg[1];
8487 $value =
'*****forbidden*****';
8489 $value = empty($conf->global->$keyfound) ?
'' : $conf->global->$keyfound;
8492 if (empty($converttextinhtmlifnecessary)) {
8494 $text = preg_replace(
'/__\['.preg_quote($keyfound,
'/').
'\]__/', $msgishtml ?
dol_htmlentitiesbr($value) : $value, $text);
8507 $text = preg_replace(
'/__\['.preg_quote($keyfound,
'/').
'\]__/', $value, $text);
8512 foreach ($substitutionarray as $key => $value) {
8513 if (!isset($value)) {
8517 if (($key ==
'__USER_SIGNATURE__' || $key ==
'__SENDEREMAIL_SIGNATURE__') && (!empty($conf->global->MAIN_MAIL_DO_NOT_USE_SIGN))) {
8521 if (empty($converttextinhtmlifnecessary)) {
8522 $text = str_replace(
"$key",
"$value", $text);
8534 $text = str_replace(
"$key",
"$value", $text);
8555 global $conf, $user;
8557 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
8562 $dirsubstitutions = array_merge(array(), (array) $conf->modules_parts[
'substitutions']);
8564 foreach ($dirsubstitutions as $reldir) {
8572 $substitfiles =
dol_dir_list($dir,
'files', 0,
'functions_');
8573 foreach ($substitfiles as $substitfile) {
8575 if (preg_match(
'/functions_(.*)\.lib\.php/i', $substitfile[
'name'], $reg)) {
8578 dol_syslog(
"Library ".$substitfile[
'name'].
" found into ".$dir);
8580 require_once $dir.$substitfile[
'name'];
8582 $function_name = $module.
"_".$callfunc;
8583 if (function_exists($function_name)) {
8584 $function_name($substitutionarray, $outputlangs, $object, $parameters);
8589 if (!empty($conf->global->ODT_ENABLE_ALL_TAGS_IN_SUBSTITUTIONS)) {
8592 foreach ($substitutionarray as $key => $value) {
8593 $tags .=
'{'.$key.
'} => '.$value.
"\n";
8595 $substitutionarray = array_merge($substitutionarray, array(
'__ALL_TAGS__' => $tags));
8610 print
get_date_range($date_start, $date_end, $format, $outputlangs);
8623function get_date_range($date_start, $date_end, $format =
'', $outputlangs =
'', $withparenthesis = 1)
8629 if (!is_object($outputlangs)) {
8630 $outputlangs = $langs;
8633 if ($date_start && $date_end) {
8634 $out .= ($withparenthesis ?
' (' :
'').$outputlangs->transnoentitiesnoconv(
'DateFromTo',
dol_print_date($date_start, $format,
false, $outputlangs),
dol_print_date($date_end, $format,
false, $outputlangs)).($withparenthesis ?
')' :
'');
8636 if ($date_start && !$date_end) {
8637 $out .= ($withparenthesis ?
' (' :
'').$outputlangs->transnoentitiesnoconv(
'DateFrom',
dol_print_date($date_start, $format,
false, $outputlangs)).($withparenthesis ?
')' :
'');
8639 if (!$date_start && $date_end) {
8640 $out .= ($withparenthesis ?
' (' :
'').$outputlangs->transnoentitiesnoconv(
'DateUntil',
dol_print_date($date_end, $format,
false, $outputlangs)).($withparenthesis ?
')' :
'');
8660 if ($nameorder < 0) {
8661 $nameorder = (empty($conf->global->MAIN_FIRSTNAME_NAME_POSITION) ? 1 : 0);
8663 if ($nameorder == 1) {
8665 if ($firstname && $lastname) {
8669 } elseif ($nameorder == 2 || $nameorder == 3) {
8671 if (empty($ret) && $nameorder == 3) {
8676 if (empty($ret) && $nameorder == 5) {
8679 if ($nameorder == 0) {
8680 if ($firstname && $lastname) {
8704 if (!is_array($mesgs)) {
8707 if (!empty($noduplicate) && isset($_SESSION[
'dol_events'][$style]) && in_array($mesgs, $_SESSION[
'dol_events'][$style])) {
8710 $_SESSION[
'dol_events'][$style][] = $mesgs;
8714 foreach ($mesgs as $mesg) {
8716 if (!empty($noduplicate) && isset($_SESSION[
'dol_events'][$style]) && in_array($mesg, $_SESSION[
'dol_events'][$style])) {
8719 $_SESSION[
'dol_events'][$style][] = $mesg;
8739 if (empty($mesg) && empty($mesgs)) {
8740 dol_syslog(
"Try to add a message in stack, but value to add is empty message", LOG_WARNING);
8747 if (empty($messagekey) || empty($_COOKIE[
"DOLHIDEMESSAGE".$messagekey])) {
8748 if (!in_array((
string) $style, array(
'mesgs',
'warnings',
'errors'))) {
8749 dol_print_error(
'',
'Bad parameter style='.$style.
' for setEventMessages');
8751 if (empty($mesgs)) {
8754 if (!empty($mesg) && !in_array($mesg, $mesgs)) {
8775 if (isset($_SESSION[
'dol_events'][
'mesgs'])) {
8776 if (empty($disabledoutputofmessages)) {
8779 unset($_SESSION[
'dol_events'][
'mesgs']);
8782 if (isset($_SESSION[
'dol_events'][
'errors'])) {
8783 if (empty($disabledoutputofmessages)) {
8786 unset($_SESSION[
'dol_events'][
'errors']);
8790 if (isset($_SESSION[
'dol_events'][
'warnings'])) {
8791 if (empty($disabledoutputofmessages)) {
8794 unset($_SESSION[
'dol_events'][
'warnings']);
8814 global $conf, $langs;
8819 $divstart = $divend =
'';
8822 if ((empty($conf->use_javascript_ajax) || !empty($conf->global->MAIN_DISABLE_JQUERY_JNOTIFY) || $keepembedded) && !preg_match(
'/<div class=".*">/i', $out)) {
8823 $divstart =
'<div class="'.$style.
' clearboth">';
8827 if ((is_array($mesgarray) && count($mesgarray)) || $mesgstring) {
8828 $langs->load(
"errors");
8830 if (is_array($mesgarray) && count($mesgarray)) {
8831 foreach ($mesgarray as $message) {
8833 $out .= $langs->trans($message);
8834 if ($ret < count($mesgarray)) {
8841 $out .= $langs->trans($mesgstring);
8847 if (!empty($conf->use_javascript_ajax) && empty($conf->global->MAIN_DISABLE_JQUERY_JNOTIFY) && empty($keepembedded)) {
8848 $return =
'<script nonce="'.getNonce().
'">
8849 $(document).ready(function() {
8850 var block = '.(!empty($conf->global->MAIN_USE_JQUERY_BLOCKUI) ?
"true" :
"false").
'
8854 /* jnotify(message, preset of message type, keepmessage) */
8856 "'.($style ==
"ok" ? 3000 : $style).
'",
8857 '.($style ==
"ok" ?
"false" :
"true").
',
8858 { remove: function (){} } );
8901 if (empty($mesgstring) && (!is_array($mesgarray) || count($mesgarray) == 0)) {
8907 if (is_array($mesgarray)) {
8908 foreach ($mesgarray as $val) {
8909 if ($val && preg_match(
'/class="error"/i', $val)) {
8913 if ($val && preg_match(
'/class="warning"/i', $val)) {
8918 } elseif ($mesgstring && preg_match(
'/class="error"/i', $mesgstring)) {
8920 } elseif ($mesgstring && preg_match(
'/class="warning"/i', $mesgstring)) {
8923 if ($style ==
'error') {
8926 if ($style ==
'warning') {
8930 if ($iserror || $iswarning) {
8932 $mesgstring = preg_replace(
'/<\/div><div class="(error|warning)">/',
'<br>', $mesgstring);
8933 $mesgstring = preg_replace(
'/<div class="(error|warning)">/',
'', $mesgstring);
8934 $mesgstring = preg_replace(
'/<\/div>/',
'', $mesgstring);
8936 if (is_array($mesgarray)) {
8937 $newmesgarray = array();
8938 foreach ($mesgarray as $val) {
8939 if (is_string($val)) {
8940 $tmpmesgstring = preg_replace(
'/<\/div><div class="(error|warning)">/',
'<br>', $val);
8941 $tmpmesgstring = preg_replace(
'/<div class="(error|warning)">/',
'', $tmpmesgstring);
8942 $tmpmesgstring = preg_replace(
'/<\/div>/',
'', $tmpmesgstring);
8943 $newmesgarray[] = $tmpmesgstring;
8945 dol_syslog(
"Error call of dol_htmloutput_mesg with an array with a value that is not a string", LOG_WARNING);
8948 $mesgarray = $newmesgarray;
8950 print
get_htmloutput_mesg($mesgstring, $mesgarray, ($iserror ?
'error' :
'warning'), $keepembedded);
8986function dol_sort_array(&$array, $index, $order =
'asc', $natsort = 0, $case_sensitive = 0, $keepindex = 0)
8989 $order = strtolower($order);
8991 if (is_array($array)) {
8992 $sizearray = count($array);
8993 if ($sizearray > 0) {
8995 foreach (array_keys($array) as $key) {
8996 if (is_object($array[$key])) {
8997 $temp[$key] = empty($array[$key]->$index) ? 0 : $array[$key]->$index;
8999 $temp[$key] = empty($array[$key][$index]) ? 0 : $array[$key][$index];
9001 if ($natsort == -1) {
9002 $temp[$key] =
'___'.$temp[$key];
9006 if (empty($natsort) || $natsort == -1) {
9007 if ($order ==
'asc') {
9013 if ($case_sensitive) {
9018 if ($order !=
'asc') {
9019 $temp = array_reverse($temp,
true);
9025 foreach (array_keys($temp) as $key) {
9026 (is_numeric($key) && empty($keepindex)) ? $sorted[] = $array[$key] : $sorted[$key] = $array[$key];
9044 $str = (string) $str;
9048 for ($i = 0; $i < $strLength; $i++) {
9049 if (ord($str[$i]) < 0x80) {
9051 } elseif ((ord($str[$i]) & 0xE0) == 0xC0) {
9053 } elseif ((ord($str[$i]) & 0xF0) == 0xE0) {
9055 } elseif ((ord($str[$i]) & 0xF8) == 0xF0) {
9057 } elseif ((ord($str[$i]) & 0xFC) == 0xF8) {
9059 } elseif ((ord($str[$i]) & 0xFE) == 0xFC) {
9064 for ($j = 0; $j < $n; $j++) {
9065 if ((++$i == strlen($str)) || ((ord($str[$i]) & 0xC0) != 0x80)) {
9085 return preg_match(
'//u', $str) ? true :
false;
9097 if (function_exists(
'mb_check_encoding')) {
9099 if (!mb_check_encoding($str,
'ASCII')) {
9103 if (preg_match(
'/[^\x00-\x7f]/', $str)) {
9123 $tmp = ini_get(
"unicode.filesystem_encoding");
9124 if (empty($tmp) && !empty($_SERVER[
"WINDIR"])) {
9125 $tmp =
'iso-8859-1';
9130 if (!empty($conf->global->MAIN_FILESYSTEM_ENCODING)) {
9131 $tmp = $conf->global->MAIN_FILESYSTEM_ENCODING;
9134 if ($tmp ==
'iso-8859-1') {
9135 return mb_convert_encoding($str,
'ISO-8859-1',
'UTF-8');
9155function dol_getIdFromCode($db, $key, $tablename, $fieldkey =
'code', $fieldid =
'id', $entityfilter = 0, $filters =
'')
9157 global $cache_codes;
9165 if (isset($cache_codes[$tablename][$key][$fieldid])) {
9166 return $cache_codes[$tablename][$key][$fieldid];
9169 dol_syslog(
'dol_getIdFromCode (value for field '.$fieldid.
' from key '.$key.
' not found into cache)', LOG_DEBUG);
9171 $sql =
"SELECT ".$fieldid.
" as valuetoget";
9172 $sql .=
" FROM ".MAIN_DB_PREFIX.$tablename;
9173 $sql .=
" WHERE ".$fieldkey.
" = '".$db->escape($key).
"'";
9174 if (!empty($entityfilter)) {
9175 $sql .=
" AND entity IN (".getEntity($tablename).
")";
9181 $resql = $db->query($sql);
9183 $obj = $db->fetch_object($resql);
9185 $cache_codes[$tablename][$key][$fieldid] = $obj->valuetoget;
9187 $cache_codes[$tablename][$key][$fieldid] =
'';
9190 return $cache_codes[$tablename][$key][$fieldid];
9204 global $user, $conf, $langs;
9210 if (isset($strToEvaluate) && $strToEvaluate !==
'') {
9213 $rep =
dol_eval($strToEvaluate, 1, 1,
'1');
9214 $rights = $rep && (!is_string($rep) || strpos($rep,
'Bad string syntax to evaluate') ===
false);
9230function dol_eval($s, $returnvalue = 0, $hideerrors = 1, $onlysimplestring =
'1')
9233 global $db, $langs, $user, $conf, $website, $websitepage;
9234 global $action, $mainmenu, $leftmenu;
9236 global $objectoffield;
9246 if ($onlysimplestring ==
'1') {
9250 if (preg_match(
'/[^a-z0-9\s'.preg_quote(
'^$_+-.*>&|=!?():"\',/@',
'/').
']/i', $s)) {
9252 return 'Bad string syntax to evaluate (found chars that are not chars for simplestring): '.$s;
9254 dol_syslog(
'Bad string syntax to evaluate (found chars that are not chars for simplestring): '.$s);
9261 } elseif ($onlysimplestring ==
'2') {
9263 if (preg_match(
'/[^a-z0-9\s'.preg_quote(
'^$_+-.*>&|=!?():"\',/@[]',
'/').
']/i', $s)) {
9265 return 'Bad string syntax to evaluate (found chars that are not chars for simplestring): '.$s;
9267 dol_syslog(
'Bad string syntax to evaluate (found chars that are not chars for simplestring): '.$s);
9275 if (is_array($s) || $s ===
'Array') {
9276 return 'Bad string syntax to evaluate (value is Array) '.var_export($s,
true);
9278 if (strpos($s,
'::') !==
false) {
9280 return 'Bad string syntax to evaluate (double : char is forbidden): '.$s;
9282 dol_syslog(
'Bad string syntax to evaluate (double : char is forbidden): '.$s);
9286 if (strpos($s,
'`') !==
false) {
9288 return 'Bad string syntax to evaluate (backtick char is forbidden): '.$s;
9290 dol_syslog(
'Bad string syntax to evaluate (backtick char is forbidden): '.$s);
9294 if (preg_match(
'/[^0-9]+\.[^0-9]+/', $s)) {
9296 return 'Bad string syntax to evaluate (dot char is forbidden): '.$s;
9298 dol_syslog(
'Bad string syntax to evaluate (dot char is forbidden): '.$s);
9304 $forbiddenphpstrings = array(
'$$');
9305 $forbiddenphpstrings = array_merge($forbiddenphpstrings, array(
'_ENV',
'_SESSION',
'_COOKIE',
'_GET',
'_POST',
'_REQUEST',
'ReflectionFunction'));
9307 $forbiddenphpfunctions = array(
"exec",
"passthru",
"shell_exec",
"system",
"proc_open",
"popen");
9308 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"dol_eval",
"executeCLI",
"verifCond"));
9309 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"base64_decode",
"rawurldecode",
"urldecode",
"str_rot13",
"hex2bin"));
9310 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"fopen",
"file_put_contents",
"fputs",
"fputscsv",
"fwrite",
"fpassthru",
"require",
"include",
"mkdir",
"rmdir",
"symlink",
"touch",
"unlink",
"umask"));
9311 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"get_defined_functions",
"get_defined_vars",
"get_defined_constants",
"get_declared_classes"));
9312 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"function",
"call_user_func"));
9313 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"require",
"include",
"require_once",
"include_once"));
9314 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"eval",
"create_function",
"assert",
"mb_ereg_replace"));
9316 $forbiddenphpmethods = array(
'invoke',
'invokeArgs');
9318 $forbiddenphpregex =
'global\s+\$|\b('.implode(
'|', $forbiddenphpfunctions).
')\b';
9320 $forbiddenphpmethodsregex =
'->('.implode(
'|', $forbiddenphpmethods).
')';
9323 $oldstringtoclean = $s;
9324 $s = str_ireplace($forbiddenphpstrings,
'__forbiddenstring__', $s);
9325 $s = preg_replace(
'/'.$forbiddenphpregex.
'/i',
'__forbiddenstring__', $s);
9326 $s = preg_replace(
'/'.$forbiddenphpmethodsregex.
'/i',
'__forbiddenstring__', $s);
9328 }
while ($oldstringtoclean != $s);
9330 if (strpos($s,
'__forbiddenstring__') !==
false) {
9331 dol_syslog(
'Bad string syntax to evaluate: '.$s, LOG_WARNING);
9333 return 'Bad string syntax to evaluate: '.$s;
9335 dol_syslog(
'Bad string syntax to evaluate: '.$s);
9343 return @eval(
'return '.$s.
';');
9345 return eval(
'return '.$s.
';');
9354 }
catch (Error $e) {
9355 $error =
'dol_eval try/catch error : ';
9356 $error .= $e->getMessage();
9369 return (trim($element) !=
'');
9382 if (empty($codelang)) {
9386 if ($codelang ==
'auto') {
9387 return '<span class="fa fa-language"></span>';
9390 $langtocountryflag = array(
9392 'ca_ES' =>
'catalonia',
9396 'sw_SW' =>
'unknown',
9406 if (isset($langtocountryflag[$codelang])) {
9407 $flagImage = $langtocountryflag[$codelang];
9409 $tmparray = explode(
'_', $codelang);
9410 $flagImage = empty($tmparray[1]) ? $tmparray[0] : $tmparray[1];
9413 return img_picto_common($codelang,
'flags/'.strtolower($flagImage).
'.png', $moreatt, 0, $notitlealt);
9427 if (empty($countrycode)) {
9431 if (strtoupper($countrycode) ==
'MQ') {
9434 if (strtoupper($countrycode) ==
'SE') {
9437 if (strtoupper($countrycode) ==
'CH') {
9438 if ($mysoc->country_code ==
'FR') {
9441 if ($mysoc->country_code ==
'DE') {
9444 if ($mysoc->country_code ==
'IT') {
9626 $buildprimarykeytotest = strtolower($countrycode).
'-'.strtoupper($countrycode);
9627 if (in_array($buildprimarykeytotest, $locales)) {
9628 return strtolower($countrycode).
'_'.strtoupper($countrycode);
9631 if (function_exists(
'locale_get_primary_language') && function_exists(
'locale_get_region')) {
9632 foreach ($locales as $locale) {
9633 $locale_language = locale_get_primary_language($locale);
9634 $locale_region = locale_get_region($locale);
9635 if (strtoupper($countrycode) == $locale_region) {
9637 return strtolower($locale_language).
'_'.strtoupper($locale_region);
9641 dol_syslog(
"Warning Exention php-intl is not available", LOG_WARNING);
9679 global $hookmanager, $db;
9681 if (isset($conf->modules_parts[
'tabs'][$type]) && is_array($conf->modules_parts[
'tabs'][$type])) {
9682 foreach ($conf->modules_parts[
'tabs'][$type] as $value) {
9683 $values = explode(
':', $value);
9686 if ($mode ==
'add' && !preg_match(
'/^\-/', $values[1])) {
9687 if (count($values) == 6) {
9691 if ($values[0] != $type) {
9697 if ($filterorigmodule) {
9698 if (strpos($values[3],
'@')) {
9699 if ($filterorigmodule !=
'external') {
9703 if ($filterorigmodule !=
'core') {
9708 $langs->load($values[3]);
9710 if (preg_match(
'/SUBSTITUTION_([^_]+)/i', $values[2], $reg)) {
9712 $substitutionarray = array();
9717 $labeltemp = explode(
',', $values[2]);
9718 $label = $langs->trans($labeltemp[0]);
9720 if (!empty($labeltemp[1]) && is_object($object) && !empty($object->id)) {
9722 $classtoload = $labeltemp[1];
9723 if (class_exists($classtoload)) {
9724 $obj =
new $classtoload($db);
9725 $function = $labeltemp[3];
9726 if ($obj && $function && method_exists($obj, $function)) {
9727 $nbrec = $obj->$function($object->id, $obj);
9728 if (!empty($nbrec)) {
9729 $label .=
'<span class="badge marginleftonlyshort">'.$nbrec.
'</span>';
9736 $head[$h][0] =
dol_buildpath(preg_replace(
'/__ID__/i', ((is_object($object) && !empty($object->id)) ? $object->id :
''), $values[5]), 1);
9737 $head[$h][1] = $label;
9738 $head[$h][2] = str_replace(
'+',
'', $values[1]);
9741 } elseif (count($values) == 5) {
9742 dol_syslog(
'Passing 5 values in tabs module_parts is deprecated. Please update to 6 with permissions.', LOG_WARNING);
9744 if ($values[0] != $type) {
9748 if ($filterorigmodule) {
9749 if (strpos($values[3],
'@')) {
9750 if ($filterorigmodule !=
'external') {
9754 if ($filterorigmodule !=
'core') {
9759 $langs->load($values[3]);
9761 if (preg_match(
'/SUBSTITUTION_([^_]+)/i', $values[2], $reg)) {
9762 $substitutionarray = array();
9766 $label = $langs->trans($values[2]);
9769 $head[$h][0] =
dol_buildpath(preg_replace(
'/__ID__/i', ((is_object($object) && !empty($object->id)) ? $object->id :
''), $values[4]), 1);
9770 $head[$h][1] = $label;
9771 $head[$h][2] = str_replace(
'+',
'', $values[1]);
9774 } elseif ($mode ==
'remove' && preg_match(
'/^\-/', $values[1])) {
9775 if ($values[0] != $type) {
9778 $tabname = str_replace(
'-',
'', $values[1]);
9779 foreach ($head as $key => $val) {
9780 $condition = (!empty($values[3]) ?
verifCond($values[3]) : 1);
9782 if ($head[$key][2] == $tabname && $condition) {
9792 if (!empty($hookmanager)) {
9793 $parameters = array(
'object' => $object,
'mode' => $mode,
'head' => &$head,
'filterorigmodule' => $filterorigmodule);
9794 $reshook = $hookmanager->executeHooks(
'completeTabsHead', $parameters);
9796 $head = $hookmanager->resArray;
9798 $head = array_merge($head, $hookmanager->resArray);
9817 global $conf, $hookmanager, $user, $debugbar;
9819 global $micro_start_time;
9821 if ($zone ==
'private') {
9822 print
"\n".
'<!-- Common footer for private page -->'.
"\n";
9824 print
"\n".
'<!-- Common footer for public page -->'.
"\n";
9828 print
"\n<!-- A div to store page_y POST parameter -->\n";
9829 print
'<div id="page_y" style="display: none;">'.(GETPOST(
'page_y') ?
GETPOST(
'page_y') :
'').
'</div>'.
"\n";
9831 $parameters = array();
9832 $reshook = $hookmanager->executeHooks(
'printCommonFooter', $parameters);
9833 if (empty($reshook)) {
9834 if (!empty($conf->global->MAIN_HTML_FOOTER)) {
9835 print $conf->global->MAIN_HTML_FOOTER.
"\n";
9839 if (!empty($conf->use_javascript_ajax)) {
9840 print
"\n<!-- A script section to add menuhider handler on backoffice, manage focus and madatory fields, tuning info, ... -->\n";
9841 print
'<script>'.
"\n";
9842 print
'jQuery(document).ready(function() {'.
"\n";
9844 if ($zone ==
'private' && empty($conf->dol_use_jmobile)) {
9846 print
'/* JS CODE TO ENABLE to manage handler to switch left menu page (menuhider) */'.
"\n";
9847 print
'jQuery("li.menuhider").click(function(event) {';
9848 print
' if (!$( "body" ).hasClass( "sidebar-collapse" )){ event.preventDefault(); }'.
"\n";
9849 print
' console.log("We click on .menuhider");'.
"\n";
9850 print
' $("body").toggleClass("sidebar-collapse")'.
"\n";
9855 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"])))) {
9856 print
'/* JS CODE TO ENABLE to manage focus and mandatory form fields */'.
"\n";
9857 $relativepathstring = $_SERVER[
"PHP_SELF"];
9859 if (constant(
'DOL_URL_ROOT')) {
9860 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
9862 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
9863 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
9865 if (!empty($user->default_values[$relativepathstring][
'focus'])) {
9866 foreach ($user->default_values[$relativepathstring][
'focus'] as $defkey => $defval) {
9868 if ($defkey !=
'_noquery_') {
9869 $tmpqueryarraytohave = explode(
'&', $defkey);
9871 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
9872 $tmpquerytohaveparam = explode(
'=', $tmpquerytohave);
9874 if (!GETPOSTISSET($tmpquerytohaveparam[0]) || ($tmpquerytohaveparam[1] !=
GETPOST($tmpquerytohaveparam[0]))) {
9887 foreach ($defval as $paramkey => $paramval) {
9889 print
'jQuery("input[name=\''.$paramkey.
'\']
").focus();'."\n
";
9890 print 'jQuery("textarea[
name=\
''.$paramkey.
'\']
").focus();'."\n
";
9891 print 'jQuery("select[
name=\
''.$paramkey.
'\']
").focus();'."\n
"; // Not really usefull, but we keep it in case of.
9896 if (!empty($user->default_values[$relativepathstring]['mandatory'])) {
9897 foreach ($user->default_values[$relativepathstring]['mandatory'] as $defkey => $defval) {
9899 if ($defkey != '_noquery_') {
9900 $tmpqueryarraytohave = explode('&', $defkey);
9902 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
9903 $tmpquerytohaveparam = explode('=', $tmpquerytohave);
9904 //print "console.log(
'".$tmpquerytohaveparam[0]." ".$tmpquerytohaveparam[1]." ".GETPOST($tmpquerytohaveparam[0])."');
";
9905 if (!GETPOSTISSET($tmpquerytohaveparam[0]) || ($tmpquerytohaveparam[1] != GETPOST($tmpquerytohaveparam[0]))) {
9912 //var_dump($defkey.'-'.$qualified);
9918 foreach ($defval as $paramkey => $paramval) {
9919 // Add property 'required' on input
9920 print 'jQuery("input[
name=\
''.$paramkey.
'\']
").prop(\'required\',true);'."\n
";
9921 print 'jQuery("textarea[
name=\
''.$paramkey.
'\']
").prop(\'required\',true);'."\n
";
9922 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
";
9923 print 'jQuery("select[
name=\
''.$paramkey.
'\']
").prop(\'required\',true);'."\n
";
9924 print 'jQuery("select[
name=\
''.$paramkey.
'\'] option[value=\
'-1\']").prop(\'value\', \'\');'.
"\n";
9925 print
'jQuery("select[name=\''.$paramkey.
'\'] option[value=\
'0\']").prop(\'value\', \'\');'.
"\n";
9928 print
'jQuery(":input[name=\'' . $paramkey .
'\']
").closest("tr
").find("td:first
").addClass("fieldrequired
");' . "\n
";
9938 if (!empty($_SERVER['MAIN_SHOW_TUNING_INFO']) || !empty($conf->global->MAIN_SHOW_TUNING_INFO)) {
9941 print 'window.console && console.log("';
9942 if (!empty($conf->global->MEMCACHED_SERVER)) {
9943 print 'MEMCACHED_SERVER=
'.$conf->global->MEMCACHED_SERVER.' -
';
9945 print 'MAIN_OPTIMIZE_SPEED=
'.(isset($conf->global->MAIN_OPTIMIZE_SPEED) ? $conf->global->MAIN_OPTIMIZE_SPEED : 'off
');
9946 if (!empty($micro_start_time)) { // Works only if MAIN_SHOW_TUNING_INFO is defined at $_SERVER level. Not in global variable.
9947 $micro_end_time = microtime(true);
9948 print ' - Build time:
'.ceil(1000 * ($micro_end_time - $micro_start_time)).' ms
';
9951 if (function_exists("memory_get_usage")) {
9952 print ' - Mem:
'.memory_get_usage(); // Do not use true here, it seems it takes the peak amount
9954 if (function_exists("memory_get_peak_usage")) {
9955 print ' - Real mem peak:
'.memory_get_peak_usage(true);
9957 if (function_exists("zend_loader_file_encoded")) {
9958 print ' - Zend encoded file:
'.(zend_loader_file_encoded() ? 'yes
' : 'no
');
9963 print "\n
".'</script>'."\n
";
9966 // TODO Add a hook here
9967 if (isModEnabled('google') && !empty($conf->global->MAIN_GOOGLE_AN_ID)) {
9968 $tmptagarray = explode(',', $conf->global->MAIN_GOOGLE_AN_ID);
9969 foreach ($tmptagarray as $tmptag) {
9971 print "<!-- JS CODE TO ENABLE
for google analtics tag -->\n
";
9973 <!-- Global site tag (gtag.js) - Google Analytics -->
9974 <script nonce="'.getNonce().'" async src="https:
9976 window.dataLayer = window.dataLayer || [];
9977 function gtag(){dataLayer.push(arguments);}
9978 gtag(\
'js\', new Date());
9980 gtag(\'config\', \''.trim($tmptag).
'\');
9987 // Add Xdebug coverage of code
9988 if (defined('XDEBUGCOVERAGE
')) {
9989 print_r(xdebug_get_code_coverage());
9992 // Add DebugBar data
9993 if (!empty($user->rights->debugbar->read) && is_object($debugbar)) {
9994 $debugbar['time
']->stopMeasure('pageaftermaster
');
9995 print '<!-- Output debugbar data -->
'."\n";
9996 $renderer = $debugbar->getRenderer();
9997 print $debugbar->getRenderer()->render();
9998 } elseif (count($conf->logbuffer)) { // If there is some logs in buffer to show
10000 print "<!-- Start of log output\n";
10001 //print '<div
class=
"hidden">
'."\n";
10002 foreach ($conf->logbuffer as $logline) {
10003 print $logline."<br>\n";
10005 //print '</div>
'."\n";
10006 print "End of log output -->\n";
10020function dolExplodeIntoArray($string, $delimiter = ';
', $kv = '=
')
10022 if (is_null($string)) {
10026 if (preg_match('/^\[.*\]$/sm
', $delimiter) || preg_match('/^\(.*\)$/sm
', $delimiter)) {
10027 // This is a regex string
10028 $newdelimiter = $delimiter;
10030 // This is a simple string
10031 $newdelimiter = preg_quote($delimiter, '/
');
10034 if ($a = preg_split('/
'.$newdelimiter.'/
', $string)) {
10036 foreach ($a as $s) { // each part
10038 if ($pos = strpos($s, $kv)) { // key/value delimiter
10039 $ka[trim(substr($s, 0, $pos))] = trim(substr($s, $pos + strlen($kv)));
10040 } else { // key delimiter not found
10058function dol_set_focus($selector)
10060 print "\n".'<!-- Set focus onto a specific field -->
'."\n";
10061 print '<script nonce=
"'.getNonce().'">jQuery(document).ready(
function() { jQuery(
"'.dol_escape_js($selector).'").focus(); });</script>
'."\n";
10072function dol_getmypid()
10074 if (!function_exists('getmypid
')) {
10075 return mt_rand(99900000, 99965535);
10077 return getmypid(); // May be a number on 64 bits (depending on OS)
10099function natural_search($fields, $value, $mode = 0, $nofirstand = 0)
10101 global $db, $langs;
10103 $value = trim($value);
10106 $value = preg_replace('/\*/
', '%
', $value); // Replace * with %
10109 $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
10112 $value = preg_replace('/\s*\|\s*/
', '|
', $value);
10114 $crits = explode(' ', $value);
10116 if (!is_array($fields)) {
10117 $fields = array($fields);
10120 $i1 = 0; // count the nb of and criteria added (all fields / criterias)
10121 foreach ($crits as $crit) { // Loop on each AND criteria
10122 $crit = trim($crit);
10123 $i2 = 0; // count the nb of valid criteria added for this this first criteria
10125 foreach ($fields as $field) {
10127 $tmpcrits = explode('|
', $crit);
10128 $i3 = 0; // count the nb of valid criteria added for this current field
10129 foreach ($tmpcrits as $tmpcrit) {
10130 if ($tmpcrit !== '0
' && empty($tmpcrit)) {
10133 $tmpcrit = trim($tmpcrit);
10135 $newres .= (($i2 > 0 || $i3 > 0) ? ' OR
' : '');
10138 $newcrit = preg_replace('/([!<>=]+)/
', '', $tmpcrit);
10141 preg_match('/([!<>=]+)/
', $tmpcrit, $reg);
10142 if (!empty($reg[1])) {
10143 $operator = $reg[1];
10145 if ($newcrit != '') {
10146 $numnewcrit = price2num($newcrit);
10147 if (is_numeric($numnewcrit)) {
10148 $newres .= $field.' '.$operator.' '.((float) $numnewcrit); // should be a numeric
10150 $newres .= '1 = 2
'; // force false, we received a corrupted data
10152 $i3++; // a criteria was added to string
10155 $i2++; // a criteria for 1 more field was added to string
10156 } elseif ($mode == 2 || $mode == -2) {
10157 $crit = preg_replace('/[^0-9,]/
', '', $crit); // ID are always integer
10158 $newres .= ($i2 > 0 ? ' OR
' : '').$field." ".($mode == -2 ? 'NOT
' : '');
10159 $newres .= $crit ? "IN (".$db->sanitize($db->escape($crit)).")" : "IN (0)";
10161 $newres .= ' OR
'.$field.' IS NULL
';
10163 $i2++; // a criteria for 1 more field was added to string
10164 } elseif ($mode == 3 || $mode == -3) {
10165 $tmparray = explode(',
', $crit);
10166 if (count($tmparray)) {
10168 foreach ($tmparray as $val) {
10171 $listofcodes .= ($listofcodes ? ',
' : '');
10172 $listofcodes .= "'".$db->escape($val)."'";
10175 $newres .= ($i2 > 0 ? ' OR
' : '').$field." ".($mode == -3 ? 'NOT
' : '')."IN (".$db->sanitize($listofcodes, 1).")";
10176 $i2++; // a criteria for 1 more field was added to string
10179 $newres .= ' OR
'.$field.' IS NULL
';
10181 } elseif ($mode == 4) {
10182 $tmparray = explode(',
', $crit);
10183 if (count($tmparray)) {
10185 foreach ($tmparray as $val) {
10188 $newres .= ($i2 > 0 ? " OR (" : "(").$field." LIKE '".$db->escape($val).",%
'";
10189 $newres .= ' OR
'.$field." = '".$db->escape($val)."'";
10190 $newres .= ' OR
'.$field." LIKE '%,
".$db->escape($val)."'";
10191 $newres .= ' OR
'.$field." LIKE '%,
".$db->escape($val).",%
'";
10193 $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)
10197 } else { // $mode=0
10198 $tmpcrits = explode('|
', $crit);
10199 $i3 = 0; // count the nb of valid criteria added for the current couple criteria/field
10200 foreach ($tmpcrits as $tmpcrit) { // loop on each OR criteria
10201 if ($tmpcrit !== '0
' && empty($tmpcrit)) {
10204 $tmpcrit = trim($tmpcrit);
10206 if ($tmpcrit == '^$
' || strpos($crit, '!
') === 0) { // If we search empty, we must combined different OR fields with AND
10207 $newres .= (($i2 > 0 || $i3 > 0) ? ' AND
' : '');
10209 $newres .= (($i2 > 0 || $i3 > 0) ? ' OR
' : '');
10212 if (preg_match('/\.(
id|
rowid)$/
', $field)) { // Special case for rowid that is sometimes a ref so used as a search field
10213 $newres .= $field." = ".(is_numeric($tmpcrit) ? ((float) $tmpcrit) : '0
');
10215 $tmpcrit2 = $tmpcrit;
10220 if (preg_match('/^!/
', $tmpcrit)) {
10221 $tmps .= $field." NOT LIKE "; // ! as exclude character
10222 $tmpcrit2 = preg_replace('/^!/
', '', $tmpcrit2);
10224 $tmps .= $field." LIKE ";
10228 if (preg_match('/^[\^\$]/', $tmpcrit)) {
10230 $tmpcrit2 = preg_replace('/^[\^\$]/', '', $tmpcrit2);
10232 if (preg_match('/[\^\$]$/', $tmpcrit)) {
10234 $tmpcrit2 = preg_replace('/[\^\$]$/', '', $tmpcrit2);
10237 if ($tmpcrit2 == '' || preg_match('/^!/', $tmpcrit)) {
10241 $newres .= $tmpbefore;
10242 $newres .= $db->escape($tmpcrit2);
10243 $newres .= $tmpafter;
10245 if ($tmpcrit2 == '' || preg_match('/^!/
', $tmpcrit)) {
10246 $newres .= " OR ".$field." IS NULL)";
10253 $i2++; // a criteria for 1 more field was added to string
10258 $res = $res.($res ? ' AND
' : '').($i2 > 1 ? '(
' : '').$newres.($i2 > 1 ? ')
' : '');
10262 $res = ($nofirstand ? "" : " AND ")."(".$res.")";
10273function showDirectDownloadLink($object)
10275 global $conf, $langs;
10278 $url = $object->getLastMainDocLink($object->element);
10280 $out .= img_picto($langs->trans("PublicDownloadLinkDesc"), 'globe
').' <span
class=
"opacitymedium">
'.$langs->trans("DirectDownloadLink").'</span><br>
';
10282 $out .= '<div
class=
"urllink"><input
type=
"text" id=
"directdownloadlink" class=
"quatrevingtpercent" value=
"'.$url.'"></div>
';
10283 $out .= ajax_autoselect("directdownloadlink", 0);
10285 $out .= '<div
class=
"urllink">
'.$langs->trans("FileNotShared").'</div>
';
10299function getImageFileNameForSize($file, $extName, $extImgTarget = '
')
10301 $dirName = dirname($file);
10302 if ($dirName == '.
') {
10306 $fileName = preg_replace('/(\.gif|\.jpeg|\.jpg|\.png|\.bmp|\.webp)$/i
', '', $file); // We remove extension, whatever is its case
10307 $fileName = basename($fileName);
10309 if (empty($extImgTarget)) {
10310 $extImgTarget = (preg_match('/\.jpg$/i
', $file) ? '.jpg
' : '');
10312 if (empty($extImgTarget)) {
10313 $extImgTarget = (preg_match('/\.jpeg$/i
', $file) ? '.jpeg
' : '');
10315 if (empty($extImgTarget)) {
10316 $extImgTarget = (preg_match('/\.gif$/i
', $file) ? '.gif
' : '');
10318 if (empty($extImgTarget)) {
10319 $extImgTarget = (preg_match('/\.png$/i
', $file) ? '.png
' : '');
10321 if (empty($extImgTarget)) {
10322 $extImgTarget = (preg_match('/\.bmp$/i
', $file) ? '.bmp
' : '');
10324 if (empty($extImgTarget)) {
10325 $extImgTarget = (preg_match('/\.webp$/i
', $file) ? '.webp
' : '');
10328 if (!$extImgTarget) {
10334 $subdir = 'thumbs/
';
10337 return ($dirName ? $dirName.'/
' : '').$subdir.$fileName.$extName.$extImgTarget; // New filename for thumb
10350function getAdvancedPreviewUrl($modulepart, $relativepath, $alldata = 0, $param = '
')
10352 global $conf, $langs;
10354 if (empty($conf->use_javascript_ajax)) {
10358 $isAllowedForPreview = dolIsAllowedForPreview($relativepath);
10360 if ($alldata == 1) {
10361 if ($isAllowedForPreview) {
10362 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));
10368 // old behavior, return a string
10369 if ($isAllowedForPreview) {
10370 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')).
'\')';
10388 $out =
'<script nonce="'.getNonce().
'">
10389 jQuery(document).ready(function () {
10390 jQuery("'.((strpos($htmlname,
'.') === 0 ?
'' :
'#').$htmlname).
'").click(function() { jQuery(this).select(); } );
10394 if ($textonlink ===
'image') {
10395 $out .=
' <a href="'.$addlink.
'" target="_blank" rel="noopener noreferrer">'.
img_picto(
'',
'globe').
'</a>';
10397 $out .=
' <a href="'.$addlink.
'" target="_blank" rel="noopener noreferrer">'.$langs->trans(
"Link").
'</a>';
10415 if (preg_match(
'/\.noexe$/i', $file)) {
10420 $mime_preview = array(
'bmp',
'jpeg',
'png',
'gif',
'tiff',
'pdf',
'plain',
'css',
'webp');
10421 if (!empty($conf->global->MAIN_ALLOW_SVG_FILES_AS_IMAGES)) {
10422 $mime_preview[] =
'svg+xml';
10426 $num_mime = array_search(
dol_mimetype($file,
'', 1), $mime_preview);
10427 if ($num_mime !==
false) {
10448 $imgmime =
'other.png';
10449 $famime =
'file-o';
10452 $tmpfile = preg_replace(
'/\.noexe$/',
'', $file);
10455 if (preg_match(
'/\.txt$/i', $tmpfile)) {
10456 $mime =
'text/plain';
10457 $imgmime =
'text.png';
10458 $famime =
'file-text-o';
10460 if (preg_match(
'/\.rtx$/i', $tmpfile)) {
10461 $mime =
'text/richtext';
10462 $imgmime =
'text.png';
10463 $famime =
'file-text-o';
10465 if (preg_match(
'/\.csv$/i', $tmpfile)) {
10466 $mime =
'text/csv';
10467 $imgmime =
'text.png';
10468 $famime =
'file-text-o';
10470 if (preg_match(
'/\.tsv$/i', $tmpfile)) {
10471 $mime =
'text/tab-separated-values';
10472 $imgmime =
'text.png';
10473 $famime =
'file-text-o';
10475 if (preg_match(
'/\.(cf|conf|log)$/i', $tmpfile)) {
10476 $mime =
'text/plain';
10477 $imgmime =
'text.png';
10478 $famime =
'file-text-o';
10480 if (preg_match(
'/\.ini$/i', $tmpfile)) {
10481 $mime =
'text/plain';
10482 $imgmime =
'text.png';
10484 $famime =
'file-text-o';
10486 if (preg_match(
'/\.md$/i', $tmpfile)) {
10487 $mime =
'text/plain';
10488 $imgmime =
'text.png';
10490 $famime =
'file-text-o';
10492 if (preg_match(
'/\.css$/i', $tmpfile)) {
10493 $mime =
'text/css';
10494 $imgmime =
'css.png';
10496 $famime =
'file-text-o';
10498 if (preg_match(
'/\.lang$/i', $tmpfile)) {
10499 $mime =
'text/plain';
10500 $imgmime =
'text.png';
10502 $famime =
'file-text-o';
10505 if (preg_match(
'/\.(crt|cer|key|pub)$/i', $tmpfile)) {
10506 $mime =
'text/plain';
10507 $imgmime =
'text.png';
10508 $famime =
'file-text-o';
10511 if (preg_match(
'/\.(html|htm|shtml)$/i', $tmpfile)) {
10512 $mime =
'text/html';
10513 $imgmime =
'html.png';
10515 $famime =
'file-text-o';
10517 if (preg_match(
'/\.(xml|xhtml)$/i', $tmpfile)) {
10518 $mime =
'text/xml';
10519 $imgmime =
'other.png';
10521 $famime =
'file-text-o';
10523 if (preg_match(
'/\.xaml$/i', $tmpfile)) {
10524 $mime =
'text/xml';
10525 $imgmime =
'other.png';
10527 $famime =
'file-text-o';
10530 if (preg_match(
'/\.bas$/i', $tmpfile)) {
10531 $mime =
'text/plain';
10532 $imgmime =
'text.png';
10534 $famime =
'file-code-o';
10536 if (preg_match(
'/\.(c)$/i', $tmpfile)) {
10537 $mime =
'text/plain';
10538 $imgmime =
'text.png';
10540 $famime =
'file-code-o';
10542 if (preg_match(
'/\.(cpp)$/i', $tmpfile)) {
10543 $mime =
'text/plain';
10544 $imgmime =
'text.png';
10546 $famime =
'file-code-o';
10548 if (preg_match(
'/\.cs$/i', $tmpfile)) {
10549 $mime =
'text/plain';
10550 $imgmime =
'text.png';
10552 $famime =
'file-code-o';
10554 if (preg_match(
'/\.(h)$/i', $tmpfile)) {
10555 $mime =
'text/plain';
10556 $imgmime =
'text.png';
10558 $famime =
'file-code-o';
10560 if (preg_match(
'/\.(java|jsp)$/i', $tmpfile)) {
10561 $mime =
'text/plain';
10562 $imgmime =
'text.png';
10564 $famime =
'file-code-o';
10566 if (preg_match(
'/\.php([0-9]{1})?$/i', $tmpfile)) {
10567 $mime =
'text/plain';
10568 $imgmime =
'php.png';
10570 $famime =
'file-code-o';
10572 if (preg_match(
'/\.phtml$/i', $tmpfile)) {
10573 $mime =
'text/plain';
10574 $imgmime =
'php.png';
10576 $famime =
'file-code-o';
10578 if (preg_match(
'/\.(pl|pm)$/i', $tmpfile)) {
10579 $mime =
'text/plain';
10580 $imgmime =
'pl.png';
10582 $famime =
'file-code-o';
10584 if (preg_match(
'/\.sql$/i', $tmpfile)) {
10585 $mime =
'text/plain';
10586 $imgmime =
'text.png';
10588 $famime =
'file-code-o';
10590 if (preg_match(
'/\.js$/i', $tmpfile)) {
10591 $mime =
'text/x-javascript';
10592 $imgmime =
'jscript.png';
10594 $famime =
'file-code-o';
10597 if (preg_match(
'/\.odp$/i', $tmpfile)) {
10598 $mime =
'application/vnd.oasis.opendocument.presentation';
10599 $imgmime =
'ooffice.png';
10600 $famime =
'file-powerpoint-o';
10602 if (preg_match(
'/\.ods$/i', $tmpfile)) {
10603 $mime =
'application/vnd.oasis.opendocument.spreadsheet';
10604 $imgmime =
'ooffice.png';
10605 $famime =
'file-excel-o';
10607 if (preg_match(
'/\.odt$/i', $tmpfile)) {
10608 $mime =
'application/vnd.oasis.opendocument.text';
10609 $imgmime =
'ooffice.png';
10610 $famime =
'file-word-o';
10613 if (preg_match(
'/\.mdb$/i', $tmpfile)) {
10614 $mime =
'application/msaccess';
10615 $imgmime =
'mdb.png';
10616 $famime =
'file-o';
10618 if (preg_match(
'/\.doc[xm]?$/i', $tmpfile)) {
10619 $mime =
'application/msword';
10620 $imgmime =
'doc.png';
10621 $famime =
'file-word-o';
10623 if (preg_match(
'/\.dot[xm]?$/i', $tmpfile)) {
10624 $mime =
'application/msword';
10625 $imgmime =
'doc.png';
10626 $famime =
'file-word-o';
10628 if (preg_match(
'/\.xlt(x)?$/i', $tmpfile)) {
10629 $mime =
'application/vnd.ms-excel';
10630 $imgmime =
'xls.png';
10631 $famime =
'file-excel-o';
10633 if (preg_match(
'/\.xla(m)?$/i', $tmpfile)) {
10634 $mime =
'application/vnd.ms-excel';
10635 $imgmime =
'xls.png';
10636 $famime =
'file-excel-o';
10638 if (preg_match(
'/\.xls$/i', $tmpfile)) {
10639 $mime =
'application/vnd.ms-excel';
10640 $imgmime =
'xls.png';
10641 $famime =
'file-excel-o';
10643 if (preg_match(
'/\.xls[bmx]$/i', $tmpfile)) {
10644 $mime =
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
10645 $imgmime =
'xls.png';
10646 $famime =
'file-excel-o';
10648 if (preg_match(
'/\.pps[mx]?$/i', $tmpfile)) {
10649 $mime =
'application/vnd.ms-powerpoint';
10650 $imgmime =
'ppt.png';
10651 $famime =
'file-powerpoint-o';
10653 if (preg_match(
'/\.ppt[mx]?$/i', $tmpfile)) {
10654 $mime =
'application/x-mspowerpoint';
10655 $imgmime =
'ppt.png';
10656 $famime =
'file-powerpoint-o';
10659 if (preg_match(
'/\.pdf$/i', $tmpfile)) {
10660 $mime =
'application/pdf';
10661 $imgmime =
'pdf.png';
10662 $famime =
'file-pdf-o';
10665 if (preg_match(
'/\.bat$/i', $tmpfile)) {
10666 $mime =
'text/x-bat';
10667 $imgmime =
'script.png';
10669 $famime =
'file-code-o';
10671 if (preg_match(
'/\.sh$/i', $tmpfile)) {
10672 $mime =
'text/x-sh';
10673 $imgmime =
'script.png';
10675 $famime =
'file-code-o';
10677 if (preg_match(
'/\.ksh$/i', $tmpfile)) {
10678 $mime =
'text/x-ksh';
10679 $imgmime =
'script.png';
10681 $famime =
'file-code-o';
10683 if (preg_match(
'/\.bash$/i', $tmpfile)) {
10684 $mime =
'text/x-bash';
10685 $imgmime =
'script.png';
10687 $famime =
'file-code-o';
10690 if (preg_match(
'/\.ico$/i', $tmpfile)) {
10691 $mime =
'image/x-icon';
10692 $imgmime =
'image.png';
10693 $famime =
'file-image-o';
10695 if (preg_match(
'/\.(jpg|jpeg)$/i', $tmpfile)) {
10696 $mime =
'image/jpeg';
10697 $imgmime =
'image.png';
10698 $famime =
'file-image-o';
10700 if (preg_match(
'/\.png$/i', $tmpfile)) {
10701 $mime =
'image/png';
10702 $imgmime =
'image.png';
10703 $famime =
'file-image-o';
10705 if (preg_match(
'/\.gif$/i', $tmpfile)) {
10706 $mime =
'image/gif';
10707 $imgmime =
'image.png';
10708 $famime =
'file-image-o';
10710 if (preg_match(
'/\.bmp$/i', $tmpfile)) {
10711 $mime =
'image/bmp';
10712 $imgmime =
'image.png';
10713 $famime =
'file-image-o';
10715 if (preg_match(
'/\.(tif|tiff)$/i', $tmpfile)) {
10716 $mime =
'image/tiff';
10717 $imgmime =
'image.png';
10718 $famime =
'file-image-o';
10720 if (preg_match(
'/\.svg$/i', $tmpfile)) {
10721 $mime =
'image/svg+xml';
10722 $imgmime =
'image.png';
10723 $famime =
'file-image-o';
10725 if (preg_match(
'/\.webp$/i', $tmpfile)) {
10726 $mime =
'image/webp';
10727 $imgmime =
'image.png';
10728 $famime =
'file-image-o';
10731 if (preg_match(
'/\.vcs$/i', $tmpfile)) {
10732 $mime =
'text/calendar';
10733 $imgmime =
'other.png';
10734 $famime =
'file-text-o';
10736 if (preg_match(
'/\.ics$/i', $tmpfile)) {
10737 $mime =
'text/calendar';
10738 $imgmime =
'other.png';
10739 $famime =
'file-text-o';
10742 if (preg_match(
'/\.torrent$/i', $tmpfile)) {
10743 $mime =
'application/x-bittorrent';
10744 $imgmime =
'other.png';
10745 $famime =
'file-o';
10748 if (preg_match(
'/\.(mp3|ogg|au|wav|wma|mid)$/i', $tmpfile)) {
10750 $imgmime =
'audio.png';
10751 $famime =
'file-audio-o';
10754 if (preg_match(
'/\.mp4$/i', $tmpfile)) {
10755 $mime =
'video/mp4';
10756 $imgmime =
'video.png';
10757 $famime =
'file-video-o';
10759 if (preg_match(
'/\.ogv$/i', $tmpfile)) {
10760 $mime =
'video/ogg';
10761 $imgmime =
'video.png';
10762 $famime =
'file-video-o';
10764 if (preg_match(
'/\.webm$/i', $tmpfile)) {
10765 $mime =
'video/webm';
10766 $imgmime =
'video.png';
10767 $famime =
'file-video-o';
10769 if (preg_match(
'/\.avi$/i', $tmpfile)) {
10770 $mime =
'video/x-msvideo';
10771 $imgmime =
'video.png';
10772 $famime =
'file-video-o';
10774 if (preg_match(
'/\.divx$/i', $tmpfile)) {
10775 $mime =
'video/divx';
10776 $imgmime =
'video.png';
10777 $famime =
'file-video-o';
10779 if (preg_match(
'/\.xvid$/i', $tmpfile)) {
10780 $mime =
'video/xvid';
10781 $imgmime =
'video.png';
10782 $famime =
'file-video-o';
10784 if (preg_match(
'/\.(wmv|mpg|mpeg)$/i', $tmpfile)) {
10786 $imgmime =
'video.png';
10787 $famime =
'file-video-o';
10790 if (preg_match(
'/\.(zip|rar|gz|tgz|z|cab|bz2|7z|tar|lzh|zst)$/i', $tmpfile)) {
10792 $imgmime =
'archive.png';
10793 $famime =
'file-archive-o';
10796 if (preg_match(
'/\.(exe|com)$/i', $tmpfile)) {
10797 $mime =
'application/octet-stream';
10798 $imgmime =
'other.png';
10799 $famime =
'file-o';
10802 if (preg_match(
'/\.(dll|lib|o|so|a)$/i', $tmpfile)) {
10804 $imgmime =
'library.png';
10805 $famime =
'file-o';
10808 if (preg_match(
'/\.err$/i', $tmpfile)) {
10810 $imgmime =
'error.png';
10811 $famime =
'file-text-o';
10816 $tmp = explode(
'/', $mime);
10817 return (!empty($tmp[1]) ? $tmp[1] : $tmp[0]);
10846 $tablename = preg_replace(
'/^'.preg_quote(MAIN_DB_PREFIX,
'/').
'/',
'', $tablename);
10848 $dictvalues = (isset($conf->cache[
'dictvalues_'.$tablename]) ? $conf->cache[
'dictvalues_'.$tablename] :
null);
10850 if (is_null($dictvalues)) {
10851 $dictvalues = array();
10853 $sql =
"SELECT * FROM ".MAIN_DB_PREFIX.$tablename.
" WHERE 1 = 1";
10854 if ($checkentity) {
10855 $sql .=
' AND entity IN (0,'.getEntity($tablename).
')';
10858 $resql = $db->query($sql);
10860 while ($obj = $db->fetch_object($resql)) {
10861 $dictvalues[$obj->{$rowidfield}] = $obj;
10867 $conf->cache[
'dictvalues_'.$tablename] = $dictvalues;
10870 if (!empty($dictvalues[$id])) {
10872 $tmp = $dictvalues[$id];
10873 return (property_exists($tmp, $field) ? $tmp->$field :
'');
10888 $stringcolor = str_replace(
'#',
'', $stringcolor);
10890 if (!empty($stringcolor)) {
10892 $tmp = explode(
',', $stringcolor);
10893 if (count($tmp) > 1) {
10898 $hexr = $stringcolor[0].$stringcolor[1];
10899 $hexg = $stringcolor[2].$stringcolor[3];
10900 $hexb = $stringcolor[4].$stringcolor[5];
10901 $r = hexdec($hexr);
10902 $g = hexdec($hexg);
10903 $b = hexdec($hexb);
10905 $bright = (max($r, $g, $b) + min($r, $g, $b)) / 510.0;
10906 if ($bright > 0.6) {
10927 if (empty($menuentry[
'enabled'])) {
10930 if ($type_user && $menuentry[
'module']) {
10931 $tmploops = explode(
'|', $menuentry[
'module']);
10933 foreach ($tmploops as $tmploop) {
10934 if (in_array($tmploop, $listofmodulesforexternal)) {
10943 if (!$menuentry[
'perms'] && $type_user) {
10946 if (!$menuentry[
'perms'] && !empty($conf->global->MAIN_MENU_HIDE_UNAUTHORIZED)) {
10949 if (!$menuentry[
'perms']) {
10964 return (ceil($n) % $x === 0) ? ceil($n) : round(($n + $x / 2) / $x) * $x;
10978function dolGetBadge($label, $html =
'', $type =
'primary', $mode =
'', $url =
'', $params = array())
10981 'class'=>
'badge '.(!empty($mode) ?
' badge-'.$mode :
'').(!empty($type) ?
' badge-'.$type :
'').(empty($params[
'css']) ?
'' :
' '.$params[
'css'])
10984 if (empty($html)) {
10988 if (!empty($url)) {
10989 $attr[
'href'] = $url;
10992 if ($mode ===
'dot') {
10993 $attr[
'class'] .=
' classfortooltip';
10994 $attr[
'title'] = $html;
10995 $attr[
'aria-label'] = $label;
11000 if (!empty($params[
'attr']) && is_array($params[
'attr'])) {
11001 foreach ($params[
'attr'] as $key => $value) {
11002 if ($key ==
'class') {
11003 $attr[
'class'] .=
' '.$value;
11004 } elseif ($key ==
'classOverride') {
11005 $attr[
'class'] = $value;
11007 $attr[$key] = $value;
11015 $attr = array_map(
'dol_escape_htmltag', $attr);
11017 $TCompiledAttr = array();
11018 foreach ($attr as $key => $value) {
11019 $TCompiledAttr[] = $key.
'="'.$value.
'"';
11022 $compiledAttributes = !empty($TCompiledAttr) ?implode(
' ', $TCompiledAttr) :
'';
11024 $tag = !empty($url) ?
'a' :
'span';
11026 return '<'.$tag.
' '.$compiledAttributes.
'>'.$html.
'</'.$tag.
'>';
11042function dolGetStatus($statusLabel =
'', $statusLabelShort =
'', $html =
'', $statusType =
'status0', $displayMode = 0, $url =
'', $params = array())
11047 $dolGetBadgeParams = array();
11049 if (!empty($params[
'badgeParams'])) {
11050 $dolGetBadgeParams = $params[
'badgeParams'];
11054 if ($displayMode == 0) {
11055 $return = !empty($html) ? $html : (empty($conf->dol_optimize_smallscreen) ? $statusLabel : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort));
11056 } elseif ($displayMode == 1) {
11057 $return = !empty($html) ? $html : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort);
11058 } elseif (!empty($conf->global->MAIN_STATUS_USES_IMAGES)) {
11061 $htmlLabel = (in_array($displayMode, array(1, 2, 5)) ?
'<span class="hideonsmartphone">' :
'').(!empty($html) ? $html : $statusLabel).(in_array($displayMode, array(1, 2, 5)) ?
'</span>' :
'');
11062 $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>' :
'');
11065 if (!empty($conf->dol_optimize_smallscreen)) {
11066 if ($displayMode == 0) {
11068 } elseif ($displayMode == 4) {
11070 } elseif ($displayMode == 6) {
11076 $statusImg = array(
11077 'status0' =>
'statut0',
11078 'status1' =>
'statut1',
11079 'status2' =>
'statut2',
11080 'status3' =>
'statut3',
11081 'status4' =>
'statut4',
11082 'status5' =>
'statut5',
11083 'status6' =>
'statut6',
11084 'status7' =>
'statut7',
11085 'status8' =>
'statut8',
11086 'status9' =>
'statut9'
11089 if (!empty($statusImg[$statusType])) {
11090 $htmlImg =
img_picto($statusLabel, $statusImg[$statusType]);
11092 $htmlImg =
img_picto($statusLabel, $statusType);
11095 if ($displayMode === 2) {
11096 $return = $htmlImg.
' '.$htmlLabelShort;
11097 } elseif ($displayMode === 3) {
11098 $return = $htmlImg;
11099 } elseif ($displayMode === 4) {
11100 $return = $htmlImg.
' '.$htmlLabel;
11101 } elseif ($displayMode === 5) {
11102 $return = $htmlLabelShort.
' '.$htmlImg;
11104 $return = $htmlLabel.
' '.$htmlImg;
11106 } elseif (empty($conf->global->MAIN_STATUS_USES_IMAGES) && !empty($displayMode)) {
11108 $statusLabelShort = (empty($statusLabelShort) ? $statusLabel : $statusLabelShort);
11110 $dolGetBadgeParams[
'attr'][
'class'] =
'badge-status';
11111 $dolGetBadgeParams[
'attr'][
'title'] = empty($params[
'tooltip']) ? $statusLabel : ($params[
'tooltip'] !=
'no' ? $params[
'tooltip'] :
'');
11113 if ($displayMode == 3) {
11114 $return = dolGetBadge((empty($conf->dol_optimize_smallscreen) ? $statusLabel : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort)),
'', $statusType,
'dot', $url, $dolGetBadgeParams);
11115 } elseif ($displayMode === 5) {
11116 $return = dolGetBadge($statusLabelShort, $html, $statusType,
'', $url, $dolGetBadgeParams);
11118 $return = dolGetBadge((empty($conf->dol_optimize_smallscreen) ? $statusLabel : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort)), $html, $statusType,
'', $url, $dolGetBadgeParams);
11160function dolGetButtonAction($label, $text =
'', $actionType =
'default', $url =
'', $id =
'', $userRight = 1, $params = array())
11162 global $hookmanager, $action, $object, $langs;
11165 if (is_array($url)) {
11166 $out =
'<div class="dropdown inline-block dropdown-holder">';
11167 $out .=
'<a style="margin-right: auto;" class="dropdown-toggle butAction" data-toggle="dropdown">'.$label.
'</a>';
11168 $out .=
'<div class="dropdown-content">';
11169 foreach ($url as $subbutton) {
11170 if ($subbutton[
'enabled'] && $subbutton[
'perm']) {
11171 if (!empty($subbutton[
'lang'])) {
11172 $langs->load($subbutton[
'lang']);
11174 $out .=
dolGetButtonAction(
'', $langs->trans($subbutton[
'label']),
'default', DOL_URL_ROOT.$subbutton[
'url'].(empty($params[
'backtopage']) ?
'' :
'&backtopage='.urlencode($params[
'backtopage'])),
'', 1, array(
'isDropDown' =>
true));
11184 if (!empty($params[
'isDropdown']))
11185 $class =
"dropdown-item";
11187 $class =
'butAction';
11188 if ($actionType ==
'danger' || $actionType ==
'delete') {
11189 $class =
'butActionDelete';
11190 if (!empty($url) && strpos($url,
'token=') ===
false) $url .=
'&token='.
newToken();
11195 'href' => empty($url) ?
'' : $url,
11199 if (empty($text)) {
11201 $attr[
'title'] =
'';
11203 $attr[
'title'] = $label;
11204 $attr[
'aria-label'] = $label;
11207 if (empty($userRight)) {
11208 $attr[
'class'] =
'butActionRefused';
11209 $attr[
'href'] =
'';
11210 $attr[
'title'] = (($label && $text && $label != $text) ? $label : $langs->trans(
'NotEnoughPermissions'));
11218 if (!empty($params[
'attr']) && is_array($params[
'attr'])) {
11219 foreach ($params[
'attr'] as $key => $value) {
11220 if ($key ==
'class') {
11221 $attr[
'class'] .=
' '.$value;
11222 } elseif ($key ==
'classOverride') {
11223 $attr[
'class'] = $value;
11225 $attr[$key] = $value;
11231 if (!empty($attr[
'title']) && !empty($attr[
'class']) && strpos($attr[
'class'],
'classfortooltip') ===
false) {
11232 $attr[
'class'].=
' classfortooltip';
11236 if ($userRight && !empty($params[
'confirm'])) {
11237 if (!is_array($params[
'confirm'])) {
11238 $params[
'confirm'] = array();
11241 if (empty($params[
'confirm'][
'url'])) {
11242 $params[
'confirm'][
'url'] = $url . (strpos($url,
'?') > 0 ?
'&' :
'?') .
'confirm=yes';
11246 $attr[
'data-confirm-url'] = $params[
'confirm'][
'url'];
11247 $attr[
'data-confirm-title'] = !empty($params[
'confirm'][
'title']) ? $params[
'confirm'][
'title'] : $langs->trans(
'ConfirmBtnCommonTitle', $label);
11248 $attr[
'data-confirm-content'] = !empty($params[
'confirm'][
'content']) ? $params[
'confirm'][
'content'] : $langs->trans(
'ConfirmBtnCommonContent', $label);
11249 $attr[
'data-confirm-content'] = preg_replace(
"/\r|\n/",
"", $attr[
'data-confirm-content']);
11250 $attr[
'data-confirm-action-btn-label'] = !empty($params[
'confirm'][
'action-btn-label']) ? $params[
'confirm'][
'action-btn-label'] : $langs->trans(
'Confirm');
11251 $attr[
'data-confirm-cancel-btn-label'] = !empty($params[
'confirm'][
'cancel-btn-label']) ? $params[
'confirm'][
'cancel-btn-label'] : $langs->trans(
'CloseDialog');
11252 $attr[
'data-confirm-modal'] = !empty($params[
'confirm'][
'modal']) ? $params[
'confirm'][
'modal'] :
true;
11254 $attr[
'class'].=
' butActionConfirm';
11257 if (isset($attr[
'href']) && empty($attr[
'href'])) {
11258 unset($attr[
'href']);
11262 $attr = array_map(
'dol_escape_htmltag', $attr);
11264 $TCompiledAttr = array();
11265 foreach ($attr as $key => $value) {
11266 $TCompiledAttr[] = $key.
'= "'.$value.
'"';
11269 $compiledAttributes = empty($TCompiledAttr) ?
'' : implode(
' ', $TCompiledAttr);
11271 $tag = !empty($attr[
'href']) ?
'a' :
'span';
11274 $parameters = array(
11275 'TCompiledAttr' => $TCompiledAttr,
11276 'compiledAttributes' => $compiledAttributes,
11281 'actionType' => $actionType,
11284 'userRight' => $userRight,
11285 'params' => $params
11288 $reshook = $hookmanager->executeHooks(
'dolGetButtonAction', $parameters, $object, $action);
11289 if ($reshook < 0)
setEventMessages($hookmanager->error, $hookmanager->errors,
'errors');
11291 if (empty($reshook)) {
11293 return '<' . $tag .
' ' . $compiledAttributes .
'>' . $text .
'</' . $tag .
'>';
11295 return '<' . $tag .
' ' . $compiledAttributes .
'>' .
dol_escape_htmltag($text) .
'</' . $tag .
'>';
11298 return $hookmanager->resPrint;
11310 return '<span class="button-title-separator '.$moreClass.
'" ></span>';
11322 if (!empty($fieldValidationErrorMsg)) {
11323 $out.=
'<span class="field-error-icon classfortooltip" title="'.dol_escape_htmltag($fieldValidationErrorMsg, 1).
'" role="alert" >';
11324 $out.=
'<span class="fa fa-exclamation-circle" aria-hidden="true" ></span>';
11343function dolGetButtonTitle($label, $helpText =
'', $iconClass =
'fa fa-file', $url =
'', $id =
'', $status = 1, $params = array())
11345 global $langs, $conf, $user;
11348 if (!empty($conf->global->MAIN_BUTTON_HIDE_UNAUTHORIZED) && (!$user->admin) && $status <= 0) {
11352 $class =
'btnTitle';
11353 if (in_array($iconClass, array(
'fa fa-plus-circle',
'fa fa-plus-circle size15x',
'fa fa-comment-dots',
'fa fa-paper-plane'))) {
11354 $class .=
' btnTitlePlus';
11356 $useclassfortooltip = 1;
11358 if (!empty($params[
'morecss'])) {
11359 $class .=
' '.$params[
'morecss'];
11364 'href' => empty($url) ?
'' : $url
11367 if (!empty($helpText)) {
11369 } elseif (empty($attr[
'title']) && $label) {
11370 $attr[
'title'] = $label;
11371 $useclassfortooltip = 0;
11374 if ($status == 2) {
11375 $attr[
'class'] .=
' btnTitleSelected';
11376 } elseif ($status <= 0) {
11377 $attr[
'class'] .=
' refused';
11379 $attr[
'href'] =
'';
11381 if ($status == -1) {
11382 $attr[
'title'] =
dol_escape_htmltag($langs->transnoentitiesnoconv(
"FeatureDisabled"));
11383 } elseif ($status == 0) {
11384 $attr[
'title'] =
dol_escape_htmltag($langs->transnoentitiesnoconv(
"NotEnoughPermissions"));
11388 if (!empty($attr[
'title']) && $useclassfortooltip) {
11389 $attr[
'class'] .=
' classfortooltip';
11397 if (!empty($params[
'attr']) && is_array($params[
'attr'])) {
11398 foreach ($params[
'attr'] as $key => $value) {
11399 if ($key ==
'class') {
11400 $attr[
'class'] .=
' '.$value;
11401 } elseif ($key ==
'classOverride') {
11402 $attr[
'class'] = $value;
11404 $attr[$key] = $value;
11409 if (isset($attr[
'href']) && empty($attr[
'href'])) {
11410 unset($attr[
'href']);
11416 $attr = array_map(
'dol_escape_htmltag', $attr);
11418 $TCompiledAttr = array();
11419 foreach ($attr as $key => $value) {
11420 $TCompiledAttr[] = $key.
'="'.$value.
'"';
11423 $compiledAttributes = (empty($TCompiledAttr) ?
'' : implode(
' ', $TCompiledAttr));
11425 $tag = (empty($attr[
'href']) ?
'span' :
'a');
11427 $button =
'<'.$tag.
' '.$compiledAttributes.
'>';
11428 $button .=
'<span class="'.$iconClass.
' valignmiddle btnTitle-icon"></span>';
11429 if (!empty($params[
'forcenohideoftext'])) {
11430 $button .=
'<span class="valignmiddle text-plus-circle btnTitle-label'.(empty($params[
'forcenohideoftext']) ?
' hideonsmartphone' :
'').
'">'.$label.
'</span>';
11432 $button .=
'</'.$tag.
'>';
11453 $classfile = $classname = $classpath = $subdir = $dir_output =
'';
11456 $module = $element_type;
11457 $element = $element_type;
11458 $subelement = $element_type;
11461 if (preg_match(
'/^([^@]+)@([^@]+)$/i', $element_type, $regs)) {
11462 $element = $subelement = $regs[1];
11463 $module = $regs[2];
11468 if (preg_match(
'/^([^_]+)_([^_]+)/i', $element, $regs)) {
11469 $module = $element = $regs[1];
11470 $subelement = $regs[2];
11474 if ($element_type ==
"action") {
11475 $classpath =
'comm/action/class';
11476 $subelement =
'Actioncomm';
11477 $module =
'agenda';
11478 } elseif ($element_type ==
'cronjob') {
11479 $classpath =
'cron/class';
11481 } elseif ($element_type ==
'adherent_type') {
11482 $classpath =
'adherents/class';
11483 $classfile =
'adherent_type';
11484 $module =
'adherent';
11485 $subelement =
'adherent_type';
11486 $classname =
'AdherentType';
11487 } elseif ($element_type ==
'bank_account') {
11488 $classpath =
'compta/bank/class';
11490 $classfile =
'account';
11491 $classname =
'Account';
11492 } elseif ($element_type ==
'category') {
11493 $classpath =
'categories/class';
11494 $module =
'categorie';
11495 $subelement =
'categorie';
11496 } elseif ($element_type ==
'contact') {
11497 $classpath =
'contact/class';
11498 $classfile =
'contact';
11499 $module =
'societe';
11500 $subelement =
'contact';
11501 } elseif ($element_type ==
'stock') {
11502 $classpath =
'product/stock/class';
11503 $classfile =
'entrepot';
11504 $classname =
'Entrepot';
11505 } elseif ($element_type ==
'project') {
11506 $classpath =
'projet/class';
11507 $module =
'projet';
11508 } elseif ($element_type ==
'project_task') {
11509 $classpath =
'projet/class';
11510 $module =
'projet';
11511 $subelement =
'task';
11512 } elseif ($element_type ==
'facture' || $element_type ==
'invoice') {
11513 $classpath =
'compta/facture/class';
11514 $module =
'facture';
11515 $subelement =
'facture';
11516 } elseif ($element_type ==
'commande' || $element_type ==
'order') {
11517 $classpath =
'commande/class';
11518 $module =
'commande';
11519 $subelement =
'commande';
11520 } elseif ($element_type ==
'propal') {
11521 $classpath =
'comm/propal/class';
11522 } elseif ($element_type ==
'shipping') {
11523 $classpath =
'expedition/class';
11524 $classfile =
'expedition';
11525 $classname =
'Expedition';
11526 $module =
'expedition';
11527 } elseif ($element_type ==
'supplier_proposal') {
11528 $classpath =
'supplier_proposal/class';
11529 $module =
'supplier_proposal';
11530 $element =
'supplierproposal';
11531 $classfile =
'supplier_proposal';
11532 $subelement =
'supplierproposal';
11533 } elseif ($element_type ==
'shipping') {
11534 $classpath =
'expedition/class';
11535 $subelement =
'expedition';
11536 $module =
'expedition_bon';
11537 } elseif ($element_type ==
'delivery') {
11538 $classpath =
'delivery/class';
11539 $subelement =
'delivery';
11540 $module =
'delivery_note';
11541 } elseif ($element_type ==
'contract') {
11542 $classpath =
'contrat/class';
11543 $module =
'contrat';
11544 $subelement =
'contrat';
11545 } elseif ($element_type ==
'mailing') {
11546 $classpath =
'comm/mailing/class';
11547 $module =
'mailing';
11548 $classfile =
'mailing';
11549 $classname =
'Mailing';
11551 } elseif ($element_type ==
'member') {
11552 $classpath =
'adherents/class';
11553 $module =
'adherent';
11554 $subelement =
'adherent';
11555 } elseif ($element_type ==
'usergroup') {
11556 $classpath =
'user/class';
11558 } elseif ($element_type ==
'mo') {
11559 $classpath =
'mrp/class';
11564 } elseif ($element_type ==
'cabinetmed_cons') {
11565 $classpath =
'cabinetmed/class';
11566 $module =
'cabinetmed';
11567 $subelement =
'cabinetmedcons';
11568 } elseif ($element_type ==
'fichinter') {
11569 $classpath =
'fichinter/class';
11570 $module =
'ficheinter';
11571 $subelement =
'fichinter';
11572 } elseif ($element_type ==
'dolresource' || $element_type ==
'resource') {
11573 $classpath =
'resource/class';
11574 $module =
'resource';
11575 $subelement =
'dolresource';
11576 } elseif ($element_type ==
'propaldet') {
11577 $classpath =
'comm/propal/class';
11578 $module =
'propal';
11579 $subelement =
'propaleligne';
11580 } elseif ($element_type ==
'opensurvey_sondage') {
11581 $classpath =
'opensurvey/class';
11582 $module =
'opensurvey';
11583 $subelement =
'opensurveysondage';
11584 } elseif ($element_type ==
'order_supplier') {
11585 $classpath =
'fourn/class';
11586 $module =
'fournisseur';
11587 $classfile =
'fournisseur.commande';
11588 $element =
'order_supplier';
11590 $classname =
'CommandeFournisseur';
11591 } elseif ($element_type ==
'invoice_supplier') {
11592 $classpath =
'fourn/class';
11593 $module =
'fournisseur';
11594 $classfile =
'fournisseur.facture';
11595 $element =
'invoice_supplier';
11597 $classname =
'FactureFournisseur';
11598 } elseif ($element_type ==
"service") {
11599 $classpath =
'product/class';
11600 $subelement =
'product';
11601 } elseif ($element_type ==
'salary') {
11602 $classpath =
'salaries/class';
11603 $module =
'salaries';
11604 } elseif ($element_type ==
'productlot') {
11605 $module =
'productbatch';
11606 $classpath =
'product/stock/class';
11607 $classfile =
'productlot';
11608 $classname =
'Productlot';
11609 $element =
'productlot';
11611 } elseif ($element_type ==
'websitepage') {
11612 $classpath =
'website/class';
11613 $classfile =
'websitepage';
11614 $classname =
'Websitepage';
11615 $module =
'website';
11616 $subelement =
'websitepage';
11617 } elseif ($element_type ==
'fiscalyear') {
11618 $classpath =
'core/class';
11619 $module =
'accounting';
11620 $subelement =
'fiscalyear';
11621 } elseif ($element_type ==
'chargesociales') {
11622 $classpath =
'compta/sociales/class';
11624 } elseif ($element_type ==
'tva') {
11625 $classpath =
'compta/tva/class';
11630 if (empty($classfile)) {
11631 $classfile = strtolower($subelement);
11633 if (empty($classname)) {
11634 $classname = ucfirst($subelement);
11636 if (empty($classpath)) {
11637 $classpath = $module.
'/class';
11643 if ($module && isset($conf->$module)) {
11644 if (!empty($conf->$module->multidir_output[$conf->entity])) {
11645 $dir_output = $conf->$module->multidir_output[$conf->entity];
11646 } elseif (!empty($conf->$module->output[$conf->entity])) {
11647 $dir_output = $conf->$module->output[$conf->entity];
11648 } elseif (!empty($conf->$module->dir_output)) {
11649 $dir_output = $conf->$module->dir_output;
11654 if ($element ==
'order_supplier') {
11655 $dir_output = $conf->fournisseur->commande->dir_output;
11656 } elseif ($element ==
'invoice_supplier') {
11657 $dir_output = $conf->fournisseur->facture->dir_output;
11659 $dir_output .= $subdir;
11661 $element_properties = array(
11662 'module' => $module,
11663 'element' => $element,
11664 'subelement' => $subelement,
11665 'classpath' => $classpath,
11666 'classfile' => $classfile,
11667 'classname' => $classname,
11668 'dir_output' => $dir_output
11670 return $element_properties;
11690 if (is_array($element_prop) && isModEnabled($element_prop[
'module'])) {
11691 dol_include_once(
'/'.$element_prop[
'classpath'].
'/'.$element_prop[
'classfile'].
'.class.php');
11693 if (class_exists($element_prop[
'classname'])) {
11694 $classname = $element_prop[
'classname'];
11695 $objecttmp =
new $classname($db);
11696 $ret = $objecttmp->fetch($element_id, $element_ref);
11698 if (empty($objecttmp->module)) {
11699 $objecttmp->module = $element_prop[
'module'];
11720 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)) {
11736 return empty($_SESSION[
'newtoken']) ?
'' : $_SESSION[
'newtoken'];
11748 return isset($_SESSION[
'token']) ? $_SESSION[
'token'] :
'';
11760 if (empty($conf->cache[
'nonce'])) {
11764 return $conf->cache[
'nonce'];
11784 print
'<div class="div-table-responsive-no-min">';
11785 print
'<table class="noborder centpercent">';
11786 print
'<tr class="liste_titre">';
11788 print $emptyRows < 1 ?
'<th>' :
'<th colspan="'.($emptyRows + 1).
'">';
11790 print $langs->trans($header);
11793 if ($number > -1) {
11797 if (!empty($link)) {
11798 if (!empty($arguments)) {
11799 print
'<a href="'.DOL_URL_ROOT.
'/'.$link.
'?'.$arguments.
'">';
11801 print
'<a href="'.DOL_URL_ROOT.
'/'.$link.
'">';
11805 if ($number > -1) {
11806 print
'<span class="badge">'.$number.
'</span>';
11809 if (!empty($link)) {
11815 if ($number < 0 && !empty($link)) {
11816 print
'<th class="right">';
11818 if (!empty($arguments)) {
11819 print
'<a class="commonlink" href="'.DOL_URL_ROOT.
'/'.$link.
'?'.$arguments.
'">';
11821 print
'<a class="commonlink" href="'.DOL_URL_ROOT.
'/'.$link.
'">';
11824 print $langs->trans(
"FullList");
11845 if ($addLineBreak) {
11861function addSummaryTableLine($tableColumnCount, $num, $nbofloop = 0, $total = 0, $noneWord =
"None", $extraRightColumn =
false)
11866 print
'<tr class="oddeven">';
11867 print
'<td colspan="'.$tableColumnCount.
'" class="opacitymedium">'.$langs->trans($noneWord).
'</td>';
11872 if ($nbofloop === 0) {
11878 $colspan = $tableColumnCount;
11879 } elseif ($num > $nbofloop) {
11880 $colspan = $tableColumnCount;
11882 $colspan = $tableColumnCount - 1;
11885 if ($extraRightColumn) {
11889 print
'<tr class="liste_total">';
11891 if ($nbofloop > 0 && $num > $nbofloop) {
11892 print
'<td colspan="'.$colspan.
'" class="right">'.$langs->trans(
"XMoreLines", ($num - $nbofloop)).
'</td>';
11894 print
'<td colspan="'.$colspan.
'" class="right"> '.$langs->trans(
"Total").
'</td>';
11895 print
'<td class="right" width="100">'.price($total).
'</td>';
11898 if ($extraRightColumn) {
11917 if ($method == -1) {
11919 if (!empty($conf->global->MAIN_FORCE_READFILE_WITH_FREAD)) {
11922 if (!empty($conf->global->MAIN_FORCE_READFILE_WITH_STREAM_COPY)) {
11928 while (ob_get_level()) {
11933 if ($method == 0) {
11934 readfile($fullpath_original_file_osencoded);
11935 } elseif ($method == 1) {
11937 $handle = fopen($fullpath_original_file_osencoded,
"rb");
11938 while (!feof($handle)) {
11939 print fread($handle, 8192);
11942 } elseif ($method == 2) {
11944 $handle1 = fopen($fullpath_original_file_osencoded,
"rb");
11945 $handle2 = fopen(
"php://output",
"wb");
11946 stream_copy_to_stream($handle1, $handle2);
11971 if ($texttoshow ===
'none') {
11972 $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>';
11973 } elseif ($texttoshow) {
11974 $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>';
11976 $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>';
11991 $result = json_decode($stringtodecode);
11992 if ($result ===
null) {
11993 $result = unserialize($stringtodecode);
12015 if (!preg_match(
'/^\(.*\)$/', $filter)) {
12016 $filter =
'(' . $filter .
')';
12019 $regexstring =
'\(([a-zA-Z0-9_\.]+:[<>!=insotlke]+:[^\(\)]+)\)';
12025 return 'Filter syntax error - '.$errorstr;
12030 $t = preg_replace_callback(
'/'.$regexstring.
'/i',
'dolForgeDummyCriteriaCallback', $filter);
12031 $t = str_replace(array(
'and',
'or',
'AND',
'OR',
' '),
'', $t);
12033 if (preg_match(
'/[^\(\)]/', $t)) {
12034 $errorstr =
'Bad syntax of the search string';
12038 return 'Filter syntax error - '.$errorstr;
12042 return ($noand ?
"" :
" AND ").($nopar ?
"" :
'(').preg_replace_callback(
'/'.$regexstring.
'/i',
'dolForgeCriteriaCallback', $filter).($nopar ?
"" :
')');
12056 $tmp = $sqlfilters;
12057 $i = 0; $nb = strlen($tmp);
12060 if ($tmp[$i] ==
'(') {
12063 if ($tmp[$i] ==
')') {
12066 if ($counter < 0) {
12067 $error =
"Wrond balance of parenthesis in sqlfilters=".$sqlfilters;
12086 if (empty($matches[1])) {
12089 $tmp = explode(
':', $matches[1]);
12090 if (count($tmp) < 3) {
12110 if (empty($matches[1])) {
12113 $tmp = explode(
':', $matches[1]);
12114 if (count($tmp) < 3) {
12118 $operand = preg_replace(
'/[^a-z0-9\._]/i',
'', trim($tmp[0]));
12120 $operator = strtoupper(preg_replace(
'/[^a-z<>!=]/i',
'', trim($tmp[1])));
12122 if ($operator ==
'NOTLIKE') {
12123 $operator =
'NOT LIKE';
12125 if ($operator ==
'ISNOT') {
12126 $operator =
'IS NOT';
12128 if ($operator ==
'!=') {
12132 $tmpescaped = $tmp[2];
12135 if ($operator ==
'IN') {
12137 $tmpescaped =
'('.$db->escape($db->sanitize($tmpescaped, 1, 0)).
')';
12141 } elseif ($operator ==
'LIKE' || $operator ==
'NOT LIKE') {
12142 if (preg_match(
'/^\'(.*)\'$/', $tmpescaped, $regbis)) {
12143 $tmpescaped = $regbis[1];
12146 $tmpescaped =
"'".$db->escape($tmpescaped).
"'";
12147 } elseif (preg_match(
'/^\'(.*)\'$/', $tmpescaped, $regbis)) {
12148 $tmpescaped =
"'".$db->escape($regbis[1]).
"'";
12150 if (strtoupper($tmpescaped) ==
'NULL') {
12151 $tmpescaped =
'NULL';
12152 } elseif (is_int($tmpescaped)) {
12153 $tmpescaped = (int) $tmpescaped;
12155 $tmpescaped = (float) $tmpescaped;
12159 return '('.$db->escape($operand).
' '.strtoupper($operator).
' '.$tmpescaped.
')';
12173 global $conf, $langs;
12174 $out =
'<!-- timeline icon -->'.
"\n";
12175 $iconClass =
'fa fa-comments';
12180 if ($histo[$key][
'percent'] == -1) {
12181 $colorClass =
'timeline-icon-not-applicble';
12182 $pictoTitle = $langs->trans(
'StatusNotApplicable');
12183 } elseif ($histo[$key][
'percent'] == 0) {
12184 $colorClass =
'timeline-icon-todo';
12185 $pictoTitle = $langs->trans(
'StatusActionToDo').
' (0%)';
12186 } elseif ($histo[$key][
'percent'] > 0 && $histo[$key][
'percent'] < 100) {
12187 $colorClass =
'timeline-icon-in-progress';
12188 $pictoTitle = $langs->trans(
'StatusActionInProcess').
' ('.$histo[$key][
'percent'].
'%)';
12189 } elseif ($histo[$key][
'percent'] >= 100) {
12190 $colorClass =
'timeline-icon-done';
12191 $pictoTitle = $langs->trans(
'StatusActionDone').
' (100%)';
12194 if ($actionstatic->code ==
'AC_TICKET_CREATE') {
12195 $iconClass =
'fa fa-ticket';
12196 } elseif ($actionstatic->code ==
'AC_TICKET_MODIFY') {
12197 $iconClass =
'fa fa-pencilxxx';
12198 } elseif (preg_match(
'/^TICKET_MSG/', $actionstatic->code)) {
12199 $iconClass =
'fa fa-comments';
12200 } elseif (preg_match(
'/^TICKET_MSG_PRIVATE/', $actionstatic->code)) {
12201 $iconClass =
'fa fa-mask';
12202 } elseif (!empty($conf->global->AGENDA_USE_EVENT_TYPE)) {
12203 if ($actionstatic->type_picto) {
12204 $img_picto =
img_picto(
'', $actionstatic->type_picto);
12206 if ($actionstatic->type_code ==
'AC_RDV') {
12207 $iconClass =
'fa fa-handshake';
12208 } elseif ($actionstatic->type_code ==
'AC_TEL') {
12209 $iconClass =
'fa fa-phone';
12210 } elseif ($actionstatic->type_code ==
'AC_FAX') {
12211 $iconClass =
'fa fa-fax';
12212 } elseif ($actionstatic->type_code ==
'AC_EMAIL') {
12213 $iconClass =
'fa fa-envelope';
12214 } elseif ($actionstatic->type_code ==
'AC_INT') {
12215 $iconClass =
'fa fa-shipping-fast';
12216 } elseif ($actionstatic->type_code ==
'AC_OTH_AUTO') {
12217 $iconClass =
'fa fa-robot';
12218 } elseif (!preg_match(
'/_AUTO/', $actionstatic->type_code)) {
12219 $iconClass =
'fa fa-robot';
12224 $out .=
'<i class="'.$iconClass.
' '.$colorClass.
'" title="'.$pictoTitle.
'">'.$img_picto.
'</i>'.
"\n";
12238 $documents = array();
12240 $sql =
'SELECT ecm.rowid as id, ecm.src_object_type, ecm.src_object_id, ecm.filepath, ecm.filename';
12241 $sql .=
' FROM '.MAIN_DB_PREFIX.
'ecm_files ecm';
12242 $sql .=
" WHERE ecm.filepath = 'agenda/".((int) $object->id).
"'";
12244 $sql .=
' ORDER BY ecm.position ASC';
12246 $resql = $db->query($sql);
12248 if ($db->num_rows($resql)) {
12249 while ($obj = $db->fetch_object($resql)) {
12250 $documents[$obj->id] = $obj;
12277function show_actions_messaging($conf, $langs, $db, $filterobj, $objcon =
'', $noprint = 0, $actioncode =
'', $donetodo =
'done', $filters = array(), $sortfield =
'a.datep,a.id', $sortorder =
'DESC')
12279 global $user, $conf;
12282 global $param, $massactionbutton;
12287 if (!is_object($filterobj) && !is_object($objcon)) {
12295 $sortfield_list = explode(
',', $sortfield);
12296 $sortfield_label_list = array(
'a.id' =>
'id',
'a.datep' =>
'dp',
'a.percent' =>
'percent');
12297 $sortfield_new_list = array();
12298 foreach ($sortfield_list as $sortfield_value) {
12299 $sortfield_new_list[] = $sortfield_label_list[trim($sortfield_value)];
12301 $sortfield_new = implode(
',', $sortfield_new_list);
12303 if (isModEnabled(
'agenda')) {
12305 if (is_object($objcon) && $objcon->id > 0) {
12306 $sql =
"SELECT DISTINCT a.id, a.label as label,";
12308 $sql =
"SELECT a.id, a.label as label,";
12310 $sql .=
" a.datep as dp,";
12311 $sql .=
" a.note as message,";
12312 $sql .=
" a.datep2 as dp2,";
12313 $sql .=
" a.percent as percent, 'action' as type,";
12314 $sql .=
" a.fk_element, a.elementtype,";
12315 $sql .=
" a.fk_contact,";
12316 $sql .=
" a.email_from as msg_from,";
12317 $sql .=
" c.code as acode, c.libelle as alabel, c.picto as apicto,";
12318 $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";
12319 if (is_object($filterobj) && get_class($filterobj) ==
'Societe') {
12320 $sql .=
", sp.lastname, sp.firstname";
12321 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
12322 $sql .=
", m.lastname, m.firstname";
12323 } elseif (is_object($filterobj) && get_class($filterobj) ==
'CommandeFournisseur') {
12325 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Product') {
12327 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
12329 } elseif (is_object($filterobj) && get_class($filterobj) ==
'BOM') {
12331 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Contrat') {
12334 $sql .=
" FROM ".MAIN_DB_PREFIX.
"actioncomm as a";
12335 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"user as u on u.rowid = a.fk_user_action";
12336 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"c_actioncomm as c ON a.fk_action = c.id";
12338 $force_filter_contact =
false;
12339 if (is_object($objcon) && $objcon->id > 0) {
12340 $force_filter_contact =
true;
12341 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"actioncomm_resources as r ON a.id = r.fk_actioncomm";
12342 $sql .=
" AND r.element_type = '".$db->escape($objcon->table_element).
"' AND r.fk_element = ".((int) $objcon->id);
12345 if (is_object($filterobj) && get_class($filterobj) ==
'Societe') {
12346 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"socpeople as sp ON a.fk_contact = sp.rowid";
12347 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Dolresource') {
12348 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"element_resources as er";
12349 $sql .=
" ON er.resource_type = 'dolresource'";
12350 $sql .=
" AND er.element_id = a.id";
12351 $sql .=
" AND er.resource_id = ".((int) $filterobj->id);
12352 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
12353 $sql .=
", ".MAIN_DB_PREFIX.
"adherent as m";
12354 } elseif (is_object($filterobj) && get_class($filterobj) ==
'CommandeFournisseur') {
12355 $sql .=
", ".MAIN_DB_PREFIX.
"commande_fournisseur as o";
12356 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Product') {
12357 $sql .=
", ".MAIN_DB_PREFIX.
"product as o";
12358 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
12359 $sql .=
", ".MAIN_DB_PREFIX.
"ticket as o";
12360 } elseif (is_object($filterobj) && get_class($filterobj) ==
'BOM') {
12361 $sql .=
", ".MAIN_DB_PREFIX.
"bom_bom as o";
12362 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Contrat') {
12363 $sql .=
", ".MAIN_DB_PREFIX.
"contrat as o";
12366 $sql .=
" WHERE a.entity IN (".getEntity(
'agenda').
")";
12367 if ($force_filter_contact ===
false) {
12368 if (is_object($filterobj) && in_array(get_class($filterobj), array(
'Societe',
'Client',
'Fournisseur')) && $filterobj->id) {
12369 $sql .=
" AND a.fk_soc = ".((int) $filterobj->id);
12370 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Project' && $filterobj->id) {
12371 $sql .=
" AND a.fk_project = ".((int) $filterobj->id);
12372 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
12373 $sql .=
" AND a.fk_element = m.rowid AND a.elementtype = 'member'";
12374 if ($filterobj->id) {
12375 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
12377 } elseif (is_object($filterobj) && get_class($filterobj) ==
'CommandeFournisseur') {
12378 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'order_supplier'";
12379 if ($filterobj->id) {
12380 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
12382 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Product') {
12383 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'product'";
12384 if ($filterobj->id) {
12385 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
12387 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
12388 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'ticket'";
12389 if ($filterobj->id) {
12390 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
12392 } elseif (is_object($filterobj) && get_class($filterobj) ==
'BOM') {
12393 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'bom'";
12394 if ($filterobj->id) {
12395 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
12397 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Contrat') {
12398 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'contract'";
12399 if ($filterobj->id) {
12400 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
12406 if (!empty($actioncode)) {
12407 if (empty($conf->global->AGENDA_USE_EVENT_TYPE)) {
12408 if ($actioncode ==
'AC_NON_AUTO') {
12409 $sql .=
" AND c.type != 'systemauto'";
12410 } elseif ($actioncode ==
'AC_ALL_AUTO') {
12411 $sql .=
" AND c.type = 'systemauto'";
12413 if ($actioncode ==
'AC_OTH') {
12414 $sql .=
" AND c.type != 'systemauto'";
12415 } elseif ($actioncode ==
'AC_OTH_AUTO') {
12416 $sql .=
" AND c.type = 'systemauto'";
12420 if ($actioncode ==
'AC_NON_AUTO') {
12421 $sql .=
" AND c.type != 'systemauto'";
12422 } elseif ($actioncode ==
'AC_ALL_AUTO') {
12423 $sql .=
" AND c.type = 'systemauto'";
12425 $sql .=
" AND c.code = '".$db->escape($actioncode).
"'";
12429 if ($donetodo ==
'todo') {
12430 $sql .=
" AND ((a.percent >= 0 AND a.percent < 100) OR (a.percent = -1 AND a.datep > '".$db->idate($now).
"'))";
12431 } elseif ($donetodo ==
'done') {
12432 $sql .=
" AND (a.percent = 100 OR (a.percent = -1 AND a.datep <= '".$db->idate($now).
"'))";
12434 if (is_array($filters) && $filters[
'search_agenda_label']) {
12435 $sql .=
natural_search(
'a.label', $filters[
'search_agenda_label']);
12440 if (isModEnabled(
'mailing') && !empty($objcon->email)
12441 && (empty($actioncode) || $actioncode ==
'AC_OTH_AUTO' || $actioncode ==
'AC_EMAILING')) {
12442 $langs->load(
"mails");
12444 $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";
12445 $sql2 .=
", null as fk_element, '' as elementtype, null as contact_id";
12446 $sql2 .=
", 'AC_EMAILING' as acode, '' as alabel, '' as apicto";
12447 $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";
12448 if (is_object($filterobj) && get_class($filterobj) ==
'Societe') {
12449 $sql2 .=
", '' as lastname, '' as firstname";
12450 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
12451 $sql2 .=
", '' as lastname, '' as firstname";
12452 } elseif (is_object($filterobj) && get_class($filterobj) ==
'CommandeFournisseur') {
12453 $sql2 .=
", '' as ref";
12454 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Product') {
12455 $sql2 .=
", '' as ref";
12456 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
12457 $sql2 .=
", '' as ref";
12459 $sql2 .=
" FROM ".MAIN_DB_PREFIX.
"mailing as m, ".MAIN_DB_PREFIX.
"mailing_cibles as mc, ".MAIN_DB_PREFIX.
"user as u";
12460 $sql2 .=
" WHERE mc.email = '".$db->escape($objcon->email).
"'";
12461 $sql2 .=
" AND mc.statut = 1";
12462 $sql2 .=
" AND u.rowid = m.fk_user_valid";
12463 $sql2 .=
" AND mc.fk_mailing=m.rowid";
12466 if (!empty($sql) && !empty($sql2)) {
12467 $sql = $sql.
" UNION ".$sql2;
12468 } elseif (empty($sql) && !empty($sql2)) {
12474 $sql .= $db->order($sortfield_new, $sortorder);
12476 dol_syslog(
"function.lib::show_actions_messaging", LOG_DEBUG);
12477 $resql = $db->query($sql);
12480 $num = $db->num_rows($resql);
12482 while ($i < $num) {
12483 $obj = $db->fetch_object($resql);
12485 if ($obj->type ==
'action') {
12487 $contactaction->id = $obj->id;
12488 $result = $contactaction->fetchResources();
12491 setEventMessage(
"actions.lib::show_actions_messaging Error fetch ressource",
'errors');
12497 if (($obj->percent >= 0 and $obj->percent < 100) || ($obj->percent == -1 && $obj->dp > $now)) {
12498 $tododone =
'todo';
12501 $histo[$numaction] = array(
12502 'type'=>$obj->type,
12503 'tododone'=>$tododone,
12505 'datestart'=>$db->jdate($obj->dp),
12506 'dateend'=>$db->jdate($obj->dp2),
12507 'note'=>$obj->label,
12508 'message'=>$obj->message,
12509 'percent'=>$obj->percent,
12511 'userid'=>$obj->user_id,
12512 'login'=>$obj->user_login,
12513 'userfirstname'=>$obj->user_firstname,
12514 'userlastname'=>$obj->user_lastname,
12515 'userphoto'=>$obj->user_photo,
12516 'msg_from'=>$obj->msg_from,
12518 'contact_id'=>$obj->fk_contact,
12519 'socpeopleassigned' => $contactaction->socpeopleassigned,
12520 'lastname' => (empty($obj->lastname) ?
'' : $obj->lastname),
12521 'firstname' => (empty($obj->firstname) ?
'' : $obj->firstname),
12522 'fk_element'=>$obj->fk_element,
12523 'elementtype'=>$obj->elementtype,
12525 'acode'=>$obj->acode,
12526 'alabel'=>$obj->alabel,
12527 'libelle'=>$obj->alabel,
12528 'apicto'=>$obj->apicto
12531 $histo[$numaction] = array(
12532 'type'=>$obj->type,
12533 'tododone'=>
'done',
12535 'datestart'=>$db->jdate($obj->dp),
12536 'dateend'=>$db->jdate($obj->dp2),
12537 'note'=>$obj->label,
12538 'message'=>$obj->message,
12539 'percent'=>$obj->percent,
12540 'acode'=>$obj->acode,
12542 'userid'=>$obj->user_id,
12543 'login'=>$obj->user_login,
12544 'userfirstname'=>$obj->user_firstname,
12545 'userlastname'=>$obj->user_lastname,
12546 'userphoto'=>$obj->user_photo
12561 if (!isModEnabled(
'agenda')) {
12562 $langs->loadLangs(array(
"admin",
"errors"));
12563 $out =
info_admin($langs->trans(
"WarningModuleXDisabledSoYouMayMissEventHere", $langs->transnoentitiesnoconv(
"Module2400Name")), 0, 0,
'warning');
12566 if (isModEnabled(
'agenda') || (isModEnabled(
'mailing') && !empty($objcon->email))) {
12567 $delay_warning = $conf->global->MAIN_DELAY_ACTIONS_TODO * 24 * 60 * 60;
12569 require_once DOL_DOCUMENT_ROOT.
'/comm/action/class/actioncomm.class.php';
12570 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
12571 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
12572 require_once DOL_DOCUMENT_ROOT.
'/contact/class/contact.class.php';
12577 $userstatic =
new User($db);
12578 $contactstatic =
new Contact($db);
12579 $userGetNomUrlCache = array();
12580 $contactGetNomUrlCache = array();
12582 $out .=
'<div class="filters-container" >';
12583 $out .=
'<form name="listactionsfilter" class="listactionsfilter" action="'.$_SERVER[
"PHP_SELF"].
'" method="POST">';
12584 $out .=
'<input type="hidden" name="token" value="'.newToken().
'">';
12586 if ($objcon && get_class($objcon) ==
'Contact' &&
12587 (is_null($filterobj) || get_class($filterobj) ==
'Societe')) {
12588 $out .=
'<input type="hidden" name="id" value="'.$objcon->id.
'" />';
12590 $out .=
'<input type="hidden" name="id" value="'.$filterobj->id.
'" />';
12592 if ($filterobj && get_class($filterobj) ==
'Societe') {
12593 $out .=
'<input type="hidden" name="socid" value="'.$filterobj->id.
'" />';
12598 $out .=
'<div class="div-table-responsive-no-min">';
12599 $out .=
'<table class="noborder borderbottom centpercent">';
12601 $out .=
'<tr class="liste_titre">';
12605 $out .=
'<th class="liste_titre width50 middle">';
12606 $searchpicto = $form->showFilterAndCheckAddButtons($massactionbutton ? 1 : 0,
'checkforselect', 1);
12607 $out .= $searchpicto;
12611 $out .=
getTitleFieldOfList(
'Date', 0, $_SERVER[
"PHP_SELF"],
'a.datep',
'', $param,
'', $sortfield, $sortorder,
'').
"\n";
12613 $out .=
'<th class="liste_titre"><strong class="hideonsmartphone">'.$langs->trans(
"Search").
' : </strong></th>';
12615 $out .=
'<th class="liste_titre"></th>';
12617 $out .=
'<th class="liste_titre">';
12618 $out .=
'<span class="fas fa-square inline-block fawidth30" style=" color: #ddd;" title="'.$langs->trans(
"ActionType").
'"></span>';
12620 $out .=
$formactions->select_type_actions($actioncode,
"actioncode",
'', empty($conf->global->AGENDA_USE_EVENT_TYPE) ? 1 : -1, 0, 0, 1,
'minwidth200imp');
12622 $out .=
'<th class="liste_titre maxwidth100onsmartphone">';
12623 $out .=
'<input type="text" class="maxwidth100onsmartphone" name="search_agenda_label" value="'.$filters[
'search_agenda_label'].
'" placeholder="'.$langs->trans(
"Label").
'">';
12628 $out .=
'<th class="liste_titre width50 middle">';
12629 $searchpicto = $form->showFilterAndCheckAddButtons($massactionbutton ? 1 : 0,
'checkforselect', 1);
12630 $out .= $searchpicto;
12637 $out .=
'</table>';
12644 $out .=
'<ul class="timeline">';
12648 if (get_class($filterobj) ==
'Societe') {
12649 $tmp .=
'<a href="'.DOL_URL_ROOT.
'/comm/action/list.php?mode=show_list&socid='.$filterobj->id.
'&status=done">';
12651 $tmp .= ($donetodo !=
'done' ? $langs->trans(
"ActionsToDoShort") :
'');
12652 $tmp .= ($donetodo !=
'done' && $donetodo !=
'todo' ?
' / ' :
'');
12653 $tmp .= ($donetodo !=
'todo' ? $langs->trans(
"ActionsDoneShort") :
'');
12655 if (get_class($filterobj) ==
'Societe') {
12666 $actualCycleDate =
false;
12669 foreach ($histo as $key => $value) {
12670 $actionstatic->fetch($histo[$key][
'id']);
12672 $actionstatic->type_picto = $histo[$key][
'apicto'];
12673 $actionstatic->type_code = $histo[$key][
'acode'];
12675 $url = DOL_URL_ROOT.
'/comm/action/card.php?id='.$histo[$key][
'id'];
12677 $tmpa =
dol_getdate($histo[$key][
'datestart'],
false);
12678 if ($actualCycleDate !== $tmpa[
'year'].
'-'.$tmpa[
'yday']) {
12679 $actualCycleDate = $tmpa[
'year'].
'-'.$tmpa[
'yday'];
12680 $out .=
'<!-- timeline time label -->';
12681 $out .=
'<li class="time-label">';
12682 $out .=
'<span class="timeline-badge-date">';
12683 $out .=
dol_print_date($histo[$key][
'datestart'],
'daytext',
'tzuserrel', $langs);
12686 $out .=
'<!-- /.timeline-label -->';
12690 $out .=
'<!-- timeline item -->'.
"\n";
12691 $out .=
'<li class="timeline-code-'.strtolower($actionstatic->code).
'">';
12695 $out .=
'<div class="timeline-item">'.
"\n";
12697 $out .=
'<span class="timeline-header-action">';
12699 if (isset($histo[$key][
'type']) && $histo[$key][
'type'] ==
'mailing') {
12700 $out .=
'<a class="timeline-btn" href="'.DOL_URL_ROOT.
'/comm/mailing/card.php?id='.$histo[$key][
'id'].
'">'.
img_object($langs->trans(
"ShowEMailing"),
"email").
' ';
12701 $out .= $histo[$key][
'id'];
12704 $out .= $actionstatic->getNomUrl(1, -1,
'valignmiddle').
' ';
12707 if ($user->hasRight(
'agenda',
'allactions',
'create') ||
12708 (($actionstatic->authorid == $user->id || $actionstatic->userownerid == $user->id) && $user->hasRight(
'agenda',
'myactions',
'create'))) {
12709 $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>';
12714 $out .=
'<span class="time"><i class="fa fa-clock-o valignmiddle"></i> <span class="valignmiddle">';
12715 $out .=
dol_print_date($histo[$key][
'datestart'],
'dayhour',
'tzuserrel');
12716 if ($histo[$key][
'dateend'] && $histo[$key][
'dateend'] != $histo[$key][
'datestart']) {
12717 $tmpa =
dol_getdate($histo[$key][
'datestart'],
true);
12718 $tmpb =
dol_getdate($histo[$key][
'dateend'],
true);
12719 if ($tmpa[
'mday'] == $tmpb[
'mday'] && $tmpa[
'mon'] == $tmpb[
'mon'] && $tmpa[
'year'] == $tmpb[
'year']) {
12720 $out .=
'-'.dol_print_date($histo[$key][
'dateend'],
'hour',
'tzuserrel');
12722 $out .=
'-'.dol_print_date($histo[$key][
'dateend'],
'dayhour',
'tzuserrel');
12726 if ($histo[$key][
'percent'] == 0 && $histo[$key][
'datestart'] && $histo[$key][
'datestart'] < ($now - $delay_warning)) {
12729 if ($histo[$key][
'percent'] == 0 && !$histo[$key][
'datestart'] && $histo[$key][
'dateend'] && $histo[$key][
'datestart'] < ($now - $delay_warning)) {
12732 if ($histo[$key][
'percent'] > 0 && $histo[$key][
'percent'] < 100 && $histo[$key][
'dateend'] && $histo[$key][
'dateend'] < ($now - $delay_warning)) {
12735 if ($histo[$key][
'percent'] > 0 && $histo[$key][
'percent'] < 100 && !$histo[$key][
'dateend'] && $histo[$key][
'datestart'] && $histo[$key][
'datestart'] < ($now - $delay_warning)) {
12741 $out .=
"</span></span>\n";
12744 $out .=
'<h3 class="timeline-header">';
12747 $out .=
'<div class="messaging-author inline-block tdoverflowmax150 valignmiddle marginrightonly">';
12748 if ($histo[$key][
'userid'] > 0) {
12749 if (!isset($userGetNomUrlCache[$histo[$key][
'userid']])) {
12750 $userstatic->fetch($histo[$key][
'userid']);
12751 $userGetNomUrlCache[$histo[$key][
'userid']] = $userstatic->getNomUrl(-1,
'', 0, 0, 16, 0,
'firstelselast',
'');
12753 $out .= $userGetNomUrlCache[$histo[$key][
'userid']];
12754 } elseif (!empty($histo[$key][
'msg_from']) && $actionstatic->code ==
'TICKET_MSG') {
12755 if (!isset($contactGetNomUrlCache[$histo[$key][
'msg_from']])) {
12756 if ($contactstatic->fetch(0,
null,
'', $histo[$key][
'msg_from']) > 0) {
12757 $contactGetNomUrlCache[$histo[$key][
'msg_from']] = $contactstatic->getNomUrl(-1,
'', 16);
12759 $contactGetNomUrlCache[$histo[$key][
'msg_from']] = $histo[$key][
'msg_from'];
12762 $out .= $contactGetNomUrlCache[$histo[$key][
'msg_from']];
12768 $out .=
' <div class="messaging-title inline-block">';
12770 if (preg_match(
'/^TICKET_MSG/', $actionstatic->code)) {
12771 $out .= $langs->trans(
'TicketNewMessage');
12772 } elseif (preg_match(
'/^TICKET_MSG_PRIVATE/', $actionstatic->code)) {
12773 $out .= $langs->trans(
'TicketNewMessage').
' <em>('.$langs->trans(
'Private').
')</em>';
12774 } elseif (isset($histo[$key][
'type'])) {
12775 if ($histo[$key][
'type'] ==
'action') {
12776 $transcode = $langs->transnoentitiesnoconv(
"Action".$histo[$key][
'acode']);
12777 $libelle = ($transcode !=
"Action".$histo[$key][
'acode'] ? $transcode : $histo[$key][
'alabel']);
12778 $libelle = $histo[$key][
'note'];
12779 $actionstatic->id = $histo[$key][
'id'];
12781 } elseif ($histo[$key][
'type'] ==
'mailing') {
12782 $out .=
'<a href="'.DOL_URL_ROOT.
'/comm/mailing/card.php?id='.$histo[$key][
'id'].
'">'.
img_object($langs->trans(
"ShowEMailing"),
"email").
' ';
12783 $transcode = $langs->transnoentitiesnoconv(
"Action".$histo[$key][
'acode']);
12784 $libelle = ($transcode !=
"Action".$histo[$key][
'acode'] ? $transcode :
'Send mass mailing');
12787 $libelle .= $histo[$key][
'note'];
12796 if (!empty($histo[$key][
'message'] && $histo[$key][
'message'] != $libelle)
12797 && $actionstatic->code !=
'AC_TICKET_CREATE'
12798 && $actionstatic->code !=
'AC_TICKET_MODIFY'
12800 $out .=
'<div class="timeline-body">';
12801 $out .= $histo[$key][
'message'];
12809 if (isset($histo[$key][
'socpeopleassigned']) && is_array($histo[$key][
'socpeopleassigned']) && count($histo[$key][
'socpeopleassigned']) > 0) {
12811 foreach ($histo[$key][
'socpeopleassigned'] as $cid => $Tab) {
12813 $result = $contact->fetch($cid);
12820 $contactList .= !empty($contactList) ?
', ' :
'';
12821 $contactList .= $contact->getNomUrl(1);
12822 if (isset($histo[$key][
'acode']) && $histo[$key][
'acode'] ==
'AC_TEL') {
12823 if (!empty($contact->phone_pro)) {
12824 $contactList .=
'('.dol_print_phone($contact->phone_pro).
')';
12830 $footer .= $langs->trans(
'ActionOnContact').
' : '.$contactList;
12831 } elseif (empty($objcon->id) && isset($histo[$key][
'contact_id']) && $histo[$key][
'contact_id'] > 0) {
12833 $result = $contact->fetch($histo[$key][
'contact_id']);
12840 $footer .= $contact->getNomUrl(1);
12841 if (isset($histo[$key][
'acode']) && $histo[$key][
'acode'] ==
'AC_TEL') {
12842 if (!empty($contact->phone_pro)) {
12843 $footer .=
'('.dol_print_phone($contact->phone_pro).
')';
12850 if (!empty($documents)) {
12851 $footer .=
'<div class="timeline-documents-container">';
12852 foreach ($documents as $doc) {
12853 $footer .=
'<span id="document_'.$doc->id.
'" class="timeline-documents" ';
12854 $footer .=
' data-id="'.$doc->id.
'" ';
12855 $footer .=
' data-path="'.$doc->filepath.
'"';
12856 $footer .=
' data-filename="'.dol_escape_htmltag($doc->filename).
'" ';
12859 $filePath = DOL_DATA_ROOT.
'/'.$doc->filepath.
'/'.$doc->filename;
12861 $file = $actionstatic->id.
'/'.$doc->filename;
12862 $thumb = $actionstatic->id.
'/thumbs/'.substr($doc->filename, 0, strrpos($doc->filename,
'.')).
'_mini'.substr($doc->filename, strrpos($doc->filename,
'.'));
12863 $doclink =
dol_buildpath(
'document.php', 1).
'?modulepart=actions&attachment=0&file='.urlencode($file).
'&entity='.$conf->entity;
12864 $viewlink =
dol_buildpath(
'viewimage.php', 1).
'?modulepart=actions&file='.urlencode($thumb).
'&entity='.$conf->entity;
12866 $mimeAttr =
' mime="'.$mime.
'" ';
12868 if (in_array($mime, array(
'image/png',
'image/jpeg',
'application/pdf'))) {
12869 $class .=
' documentpreview';
12872 $footer .=
'<a href="'.$doclink.
'" class="btn-link '.$class.
'" target="_blank" rel="noopener noreferrer" '.$mimeAttr.
' >';
12873 $footer .=
img_mime($filePath).
' '.$doc->filename;
12876 $footer .=
'</span>';
12878 $footer .=
'</div>';
12881 if (!empty($footer)) {
12882 $out .=
'<div class="timeline-footer">'.$footer.
'</div>';
12885 $out .=
'</div>'.
"\n";
12888 $out .=
'<!-- END timeline item -->';
12895 if (empty($histo)) {
12896 $out .=
'<span class="opacitymedium">'.$langs->trans(
"NoRecordFound").
'</span>';
12919 if ($hourTime ===
'getpost') {
12923 } elseif (preg_match(
'/^(\d\d):(\d\d):(\d\d)$/', $hourTime, $m)) {
12924 $hour = intval($m[1]);
12925 $minute = intval($m[2]);
12926 $second = intval($m[3]);
12928 $hour = $minute = $second = 0;
12931 $hour = min($hour, 23);
12932 $minute = min($minute, 59);
12933 $second = min($second, 59);
12950 if ($timestamp ===
null) $timestamp =
GETPOSTDATE($prefix, $hourTime, $gm);
12956 if ($hourTime ===
'getpost' || ($timestamp !==
null &&
dol_print_date($timestamp,
'%H:%M:%S') !==
'00:00:00')) {
12957 $TParam = array_merge($TParam, array(
12964 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.