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;
127 if (!is_object($object) && empty($module)) {
130 if (empty($module) && !empty($object->element)) {
131 $module = $object->element;
134 if ($module ==
'fichinter') {
135 $module =
'ficheinter';
137 if (isset($conf->$module) && property_exists($conf->$module,
'multidir_output')) {
138 return $conf->$module->multidir_output[(empty($object->entity) ? $conf->entity : $object->entity)];
140 return 'error-diroutput-not-defined-for-this-object='.$module;
154 return (
string) (isset($conf->global->$key) ? $conf->global->$key : $default);
168 return (
int) (isset($conf->global->$key) ? $conf->global->$key : $default);
181 if (empty($tmpuser)) {
186 return (
string) (empty($tmpuser->conf->$key) ? $default : $tmpuser->conf->$key);
199 if (empty($tmpuser)) {
204 return (
int) (empty($tmpuser->conf->$key) ? $default : $tmpuser->conf->$key);
213function isModEnabled($module)
220 'category' =>
'categorie',
221 'contract' =>
'contrat',
222 'project' =>
'projet',
223 'delivery_note' =>
'expedition'
226 $arrayconv[
'supplier_order'] =
'fournisseur';
227 $arrayconv[
'supplier_invoice'] =
'fournisseur';
229 if (!empty($arrayconv[$module])) {
230 $module = $arrayconv[$module];
233 return !empty($conf->modules[$module]);
250 require_once DOL_DOCUMENT_ROOT.
"/core/db/".$type.
'.class.php';
252 $class =
'DoliDB'.ucfirst($type);
253 $dolidb =
new $class($type, $host, $user, $pass, $name, $port);
274function getEntity($element, $shared = 1, $currentobject =
null)
276 global $conf, $mc, $hookmanager, $object, $action, $db;
278 if (!is_object($hookmanager)) {
279 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
286 $element =
'project';
289 $element =
'contract';
291 case 'order_supplier':
292 $element =
'supplier_order';
294 case 'invoice_supplier':
295 $element =
'supplier_invoice';
299 if (is_object($mc)) {
300 $out = $mc->getEntity($element, $shared, $currentobject);
303 $addzero = array(
'user',
'usergroup',
'cronjob',
'c_email_templates',
'email_template',
'default_values',
'overwrite_trans');
304 if (in_array($element, $addzero)) {
307 $out .= ((int) $conf->entity);
312 'element' => $element,
315 'currentobject' => $currentobject,
318 $reshook = $hookmanager->executeHooks(
'hookGetEntity', $parameters, $currentobject, $action);
320 if (is_numeric($reshook)) {
321 if ($reshook == 0 && !empty($hookmanager->resPrint)) {
322 $out .=
','.$hookmanager->resPrint;
323 } elseif ($reshook == 1) {
324 $out = $hookmanager->resPrint;
341 if (is_object($mc) && method_exists($mc,
'setEntity')) {
342 return $mc->setEntity($currentobject);
344 return ((is_object($currentobject) && $currentobject->id > 0 && $currentobject->entity > 0) ? $currentobject->entity : $conf->entity);
356 return preg_match(
'/(_pass|password|_pw|_key|securekey|serverkey|secret\d?|p12key|exportkey|_PW_[a-z]+|token)$/i', $keyname);
368 for ($r =
""; $n >= 0; $n = intval($n / 26) - 1) {
369 $r = chr($n % 26 + 0x41) . $r;
393 include_once DOL_DOCUMENT_ROOT.
'/includes/mobiledetect/mobiledetectlib/Mobile_Detect.php';
400 $user_agent = substr($user_agent, 0, 512);
402 $detectmobile =
new Mobile_Detect(
null, $user_agent);
403 $tablet = $detectmobile->isTablet();
405 if ($detectmobile->isMobile()) {
409 if ($detectmobile->is(
'AndroidOS')) {
410 $os = $phone =
'android';
411 } elseif ($detectmobile->is(
'BlackBerryOS')) {
412 $os = $phone =
'blackberry';
413 } elseif ($detectmobile->is(
'iOS')) {
416 } elseif ($detectmobile->is(
'PalmOS')) {
417 $os = $phone =
'palm';
418 } elseif ($detectmobile->is(
'SymbianOS')) {
420 } elseif ($detectmobile->is(
'webOS')) {
422 } elseif ($detectmobile->is(
'MaemoOS')) {
424 } elseif ($detectmobile->is(
'WindowsMobileOS') || $detectmobile->is(
'WindowsPhoneOS')) {
430 if (preg_match(
'/linux/i', $user_agent)) {
432 } elseif (preg_match(
'/macintosh/i', $user_agent)) {
434 } elseif (preg_match(
'/windows/i', $user_agent)) {
440 if (preg_match(
'/firefox(\/|\s)([\d\.]*)/i', $user_agent, $reg)) {
442 $version = empty($reg[2]) ?
'' : $reg[2];
443 } elseif (preg_match(
'/edge(\/|\s)([\d\.]*)/i', $user_agent, $reg)) {
445 $version = empty($reg[2]) ?
'' : $reg[2];
446 } elseif (preg_match(
'/chrome(\/|\s)([\d\.]+)/i', $user_agent, $reg)) {
448 $version = empty($reg[2]) ?
'' : $reg[2];
449 } elseif (preg_match(
'/chrome/i', $user_agent, $reg)) {
452 } elseif (preg_match(
'/iceweasel/i', $user_agent)) {
454 } elseif (preg_match(
'/epiphany/i', $user_agent)) {
456 } elseif (preg_match(
'/safari(\/|\s)([\d\.]*)/i', $user_agent, $reg)) {
458 $version = empty($reg[2]) ?
'' : $reg[2];
459 } elseif (preg_match(
'/opera(\/|\s)([\d\.]*)/i', $user_agent, $reg)) {
462 $version = empty($reg[2]) ?
'' : $reg[2];
463 } elseif (preg_match(
'/(MSIE\s([0-9]+\.[0-9]))|.*(Trident\/[0-9]+.[0-9];.*rv:([0-9]+\.[0-9]+))/i', $user_agent, $reg)) {
465 $version = end($reg);
466 } elseif (preg_match(
'/(Windows NT\s([0-9]+\.[0-9])).*(Trident\/[0-9]+.[0-9];.*rv:([0-9]+\.[0-9]+))/i', $user_agent, $reg)) {
469 $version = end($reg);
470 } elseif (preg_match(
'/l[iy]n(x|ks)(\(|\/|\s)*([\d\.]+)/i', $user_agent, $reg)) {
473 $version = empty($reg[3]) ?
'' : $reg[3];
485 'browsername' => $name,
486 'browserversion' => $version,
488 'browserua' => $user_agent,
503 $disconnectdone =
false;
505 if (is_object($db) && !empty($db->connected)) {
506 $depth = $db->transaction_opened;
507 $disconnectdone = $db->close();
509 dol_syslog(
"--- End access to ".(empty($_SERVER[
"PHP_SELF"]) ?
'unknown' : $_SERVER[
"PHP_SELF"]).(($disconnectdone && $depth) ?
' (Warn: db disconnection forced, transaction depth was '.$depth.
')' :
''), (($disconnectdone && $depth) ? LOG_WARNING : LOG_INFO));
521function GETPOSTISSET($paramname)
525 $relativepathstring = $_SERVER[
"PHP_SELF"];
527 if (constant(
'DOL_URL_ROOT')) {
528 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
530 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
531 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
537 if (!empty($_GET[
'restore_lastsearch_values'])) {
538 if (!empty($_SESSION[
'lastsearch_values_'.$relativepathstring])) {
539 $tmp = json_decode($_SESSION[
'lastsearch_values_'.$relativepathstring],
true);
540 if (is_array($tmp)) {
541 foreach ($tmp as $key => $val) {
542 if ($key == $paramname) {
550 if ($paramname ==
'contextpage' && !empty($_SESSION[
'lastsearch_contextpage_'.$relativepathstring])) {
552 } elseif ($paramname ==
'limit' && !empty($_SESSION[
'lastsearch_limit_'.$relativepathstring])) {
554 } elseif ($paramname ==
'page' && !empty($_SESSION[
'lastsearch_page_'.$relativepathstring])) {
556 } elseif ($paramname ==
'mode' && !empty($_SESSION[
'lastsearch_mode_'.$relativepathstring])) {
560 $isset = (isset($_POST[$paramname]) || isset($_GET[$paramname]));
577 if (empty($method)) {
578 $val = isset($_GET[$paramname]) ? $_GET[$paramname] : (isset($_POST[$paramname]) ? $_POST[$paramname] :
'');
579 } elseif ($method == 1) {
580 $val = isset($_GET[$paramname]) ? $_GET[$paramname] :
'';
581 } elseif ($method == 2) {
582 $val = isset($_POST[$paramname]) ? $_POST[$paramname] :
'';
583 } elseif ($method == 3) {
584 $val = isset($_POST[$paramname]) ? $_POST[$paramname] : (isset($_GET[$paramname]) ? $_GET[$paramname] :
'');
586 $val =
'BadFirstParameterForGETPOST';
589 return is_array($val);
621function GETPOST($paramname, $check =
'alphanohtml', $method = 0, $filter =
null, $options =
null, $noreplace = 0)
623 global $mysoc, $user, $conf;
625 if (empty($paramname)) {
626 return 'BadFirstParameterForGETPOST';
629 dol_syslog(
"Deprecated use of GETPOST, called with 1st param = ".$paramname.
" and a 2nd param that is '', when calling page ".$_SERVER[
"PHP_SELF"], LOG_WARNING);
634 if (empty($method)) {
635 $out = isset($_GET[$paramname]) ? $_GET[$paramname] : (isset($_POST[$paramname]) ? $_POST[$paramname] :
'');
636 } elseif ($method == 1) {
637 $out = isset($_GET[$paramname]) ? $_GET[$paramname] :
'';
638 } elseif ($method == 2) {
639 $out = isset($_POST[$paramname]) ? $_POST[$paramname] :
'';
640 } elseif ($method == 3) {
641 $out = isset($_POST[$paramname]) ? $_POST[$paramname] : (isset($_GET[$paramname]) ? $_GET[$paramname] :
'');
643 return 'BadThirdParameterForGETPOST';
646 if (empty($method) || $method == 3 || $method == 4) {
647 $relativepathstring = (empty($_SERVER[
"PHP_SELF"]) ?
'' : $_SERVER[
"PHP_SELF"]);
649 if (constant(
'DOL_URL_ROOT')) {
650 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
652 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
653 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
659 if (!empty($_GET[
'restore_lastsearch_values'])) {
660 if (!empty($_SESSION[
'lastsearch_values_'.$relativepathstring])) {
661 $tmp = json_decode($_SESSION[
'lastsearch_values_'.$relativepathstring],
true);
662 if (is_array($tmp)) {
663 foreach ($tmp as $key => $val) {
664 if ($key == $paramname) {
672 if ($paramname ==
'contextpage' && !empty($_SESSION[
'lastsearch_contextpage_'.$relativepathstring])) {
673 $out = $_SESSION[
'lastsearch_contextpage_'.$relativepathstring];
674 } elseif ($paramname ==
'limit' && !empty($_SESSION[
'lastsearch_limit_'.$relativepathstring])) {
675 $out = $_SESSION[
'lastsearch_limit_'.$relativepathstring];
676 } elseif ($paramname ==
'page' && !empty($_SESSION[
'lastsearch_page_'.$relativepathstring])) {
677 $out = $_SESSION[
'lastsearch_page_'.$relativepathstring];
678 } elseif ($paramname ==
'mode' && !empty($_SESSION[
'lastsearch_mode_'.$relativepathstring])) {
679 $out = $_SESSION[
'lastsearch_mode_'.$relativepathstring];
681 } elseif (!isset($_GET[
'sortfield'])) {
684 if (!empty($_GET[
'action']) && $_GET[
'action'] ==
'create' && !isset($_GET[$paramname]) && !isset($_POST[$paramname])) {
687 if (is_object($object) && isset($object->fields[$paramname][
'default'])) {
688 $out = $object->fields[$paramname][
'default'];
692 if (!empty($_GET[
'action']) && (preg_match(
'/^create/', $_GET[
'action']) || preg_match(
'/^presend/', $_GET[
'action'])) && !isset($_GET[$paramname]) && !isset($_POST[$paramname])) {
694 if (!empty($user->default_values)) {
695 if (isset($user->default_values[$relativepathstring][
'createform'])) {
696 foreach ($user->default_values[$relativepathstring][
'createform'] as $defkey => $defval) {
698 if ($defkey !=
'_noquery_') {
699 $tmpqueryarraytohave = explode(
'&', $defkey);
702 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
703 if (!in_array($tmpquerytohave, $tmpqueryarraywehave)) {
716 if (isset($user->default_values[$relativepathstring][
'createform'][$defkey][$paramname])) {
717 $out = $user->default_values[$relativepathstring][
'createform'][$defkey][$paramname];
724 } elseif (!empty($paramname) && !isset($_GET[$paramname]) && !isset($_POST[$paramname])) {
726 if (!empty($user->default_values)) {
729 if ($paramname ==
'sortfield' || $paramname ==
'sortorder') {
731 if (isset($user->default_values[$relativepathstring][
'sortorder'])) {
733 foreach ($user->default_values[$relativepathstring][
'sortorder'] as $defkey => $defval) {
735 if ($defkey !=
'_noquery_') {
736 $tmpqueryarraytohave = explode(
'&', $defkey);
739 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
740 if (!in_array($tmpquerytohave, $tmpqueryarraywehave)) {
753 $forbidden_chars_to_replace = array(
" ",
"'",
"/",
"\\",
":",
"*",
"?",
"\"",
"<",
">",
"|",
"[",
"]",
";",
"=");
754 foreach ($user->default_values[$relativepathstring][
'sortorder'][$defkey] as $key => $val) {
758 if ($paramname ==
'sortfield') {
761 if ($paramname ==
'sortorder') {
769 } elseif (isset($user->default_values[$relativepathstring][
'filters'])) {
770 foreach ($user->default_values[$relativepathstring][
'filters'] as $defkey => $defval) {
771 if (!empty($_GET[
'disabledefaultvalues'])) {
775 if ($defkey !=
'_noquery_') {
776 $tmpqueryarraytohave = explode(
'&', $defkey);
779 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
780 if (!in_array($tmpquerytohave, $tmpqueryarraywehave)) {
792 if ($qualified && isset($user->default_values[$relativepathstring][
'filters'][$defkey][$paramname])) {
794 if (isset($_POST[
'sall']) || isset($_POST[
'search_all']) || isset($_GET[
'sall']) || isset($_GET[
'search_all'])) {
797 $forbidden_chars_to_replace = array(
" ",
"'",
"/",
"\\",
":",
"*",
"?",
"\"",
"<",
">",
"|",
"[",
"]",
";",
"=");
798 $out =
dol_string_nospecial($user->default_values[$relativepathstring][
'filters'][$defkey][$paramname],
'', $forbidden_chars_to_replace);
801 $forbidden_chars_to_replace = array(
" ",
"'",
"/",
"\\",
":",
"*",
"?",
"\"",
"<",
">",
"|",
"[",
"]",
";",
"=");
802 $out =
dol_string_nospecial($user->default_values[$relativepathstring][
'filters'][$defkey][$paramname],
'', $forbidden_chars_to_replace);
817 if (!is_array($out) && empty($_POST[$paramname]) && empty($noreplace)) {
821 while (preg_match(
'/__([A-Z0-9]+_?[A-Z0-9]+)__/i', $out, $reg) && ($loopnb < $maxloop)) {
825 if ($reg[1] ==
'DAY') {
827 $newout = $tmp[
'mday'];
828 } elseif ($reg[1] ==
'MONTH') {
830 $newout = $tmp[
'mon'];
831 } elseif ($reg[1] ==
'YEAR') {
833 $newout = $tmp[
'year'];
834 } elseif ($reg[1] ==
'PREVIOUS_DAY') {
837 $newout = $tmp2[
'day'];
838 } elseif ($reg[1] ==
'PREVIOUS_MONTH') {
841 $newout = $tmp2[
'month'];
842 } elseif ($reg[1] ==
'PREVIOUS_YEAR') {
844 $newout = ($tmp[
'year'] - 1);
845 } elseif ($reg[1] ==
'NEXT_DAY') {
848 $newout = $tmp2[
'day'];
849 } elseif ($reg[1] ==
'NEXT_MONTH') {
852 $newout = $tmp2[
'month'];
853 } elseif ($reg[1] ==
'NEXT_YEAR') {
855 $newout = ($tmp[
'year'] + 1);
856 } elseif ($reg[1] ==
'MYCOMPANY_COUNTRY_ID' || $reg[1] ==
'MYCOUNTRY_ID' || $reg[1] ==
'MYCOUNTRYID') {
857 $newout = $mysoc->country_id;
858 } elseif ($reg[1] ==
'USER_ID' || $reg[1] ==
'USERID') {
860 } elseif ($reg[1] ==
'USER_SUPERVISOR_ID' || $reg[1] ==
'SUPERVISOR_ID' || $reg[1] ==
'SUPERVISORID') {
861 $newout = $user->fk_user;
862 } elseif ($reg[1] ==
'ENTITY_ID' || $reg[1] ==
'ENTITYID') {
863 $newout = $conf->entity;
868 $out = preg_replace(
'/__'.preg_quote($reg[1],
'/').
'__/', $newout, $out);
873 if (preg_match(
'/^array/', $check)) {
874 if (!is_array($out) || empty($out)) {
877 $tmparray = explode(
':', $check);
878 if (!empty($tmparray[1])) {
879 $tmpcheck = $tmparray[1];
881 $tmpcheck =
'alphanohtml';
883 foreach ($out as $outkey => $outval) {
884 $out[$outkey] =
sanitizeVal($outval, $tmpcheck, $filter, $options);
890 if (strpos($paramname,
'search_') === 0) {
891 $out = preg_replace(
'/([<>])([-+]?\d)/',
'\1 \2', $out);
894 $out =
sanitizeVal($out, $check, $filter, $options);
899 if ($paramname ==
'backtopage' || $paramname ==
'backtolist' || $paramname ==
'backtourl') {
900 $out = str_replace(
'\\',
'/', $out);
901 $out = str_replace(array(
':',
';',
'@',
"\t",
' '),
'', $out);
903 $oldstringtoclean = $out;
904 $out = str_ireplace(array(
'javascript',
'vbscript',
'&colon',
'&#'),
'', $out);
905 $out = preg_replace(array(
'/^[^\?]*%/'),
'', $out);
906 $out = preg_replace(array(
'/^[a-z]*\/\s*\/+/i'),
'', $out);
907 }
while ($oldstringtoclean != $out);
912 if (empty($method) || $method == 3 || $method == 4) {
913 if (preg_match(
'/^search_/', $paramname) || in_array($paramname, array(
'sortorder',
'sortfield'))) {
920 if ($out !=
'' && isset($user)) {
921 $user->lastsearch_values_tmp[$relativepathstring][$paramname] = $out;
940 return (
int)
GETPOST($paramname,
'int', $method,
null,
null, 0);
954function checkVal($out =
'', $check =
'alphanohtml', $filter =
null, $options =
null)
956 return sanitizeVal($out, $check, $filter, $options);
968function sanitizeVal($out =
'', $check =
'alphanohtml', $filter =
null, $options =
null)
976 if (!is_numeric($out)) {
981 if (is_array($out)) {
982 $out = implode(
',', $out);
984 if (preg_match(
'/[^0-9,-]+/i', $out)) {
989 $out = filter_var($out, FILTER_SANITIZE_STRING);
992 $out = filter_var($out, FILTER_SANITIZE_EMAIL);
995 if (!is_array($out)) {
997 if (preg_match(
'/[^a-z]+/i', $out)) {
1003 if (!is_array($out)) {
1005 if (preg_match(
'/[^a-z0-9_\-\.]+/i', $out)) {
1011 if (!is_array($out)) {
1013 if (preg_match(
'/[^a-z0-9_\-\.@]+/i', $out)) {
1019 if (!is_array($out)) {
1021 if (preg_match(
'/[^a-z0-9_\-\.,]+/i', $out)) {
1028 if (!is_array($out)) {
1031 $oldstringtoclean = $out;
1038 $out = str_ireplace(array(
'&',
'&',
'&',
'"',
'"',
'"',
'"',
'"',
'/',
'/',
'\',
'\',
'/',
'../',
'..\\'),
'', $out);
1039 }
while ($oldstringtoclean != $out);
1043 case 'alphawithlgt':
1044 if (!is_array($out)) {
1047 $oldstringtoclean = $out;
1053 $out = str_ireplace(array(
'&',
'&',
'&',
'"',
'"',
'"',
'"',
'"',
'/',
'/',
'\',
'\',
'/',
'../',
'..\\'),
'', $out);
1054 }
while ($oldstringtoclean != $out);
1060 case 'restricthtmlnolink':
1061 case 'restricthtml':
1062 case 'restricthtmlallowclass':
1063 case 'restricthtmlallowunvalid':
1068 if (empty($filter)) {
1069 return 'BadParameterForGETPOST - Param 3 of sanitizeVal()';
1074 $out = filter_var($out, $filter, $options);
1078 dol_syslog(
"Error, you call sanitizeVal() with a bad value for the check type. Data can't be sanitized.", LOG_ERR);
1086if (!function_exists(
'dol_getprefix')) {
1096 function dol_getprefix($mode =
'')
1099 if ($mode ==
'email') {
1104 return $conf->global->MAIL_PREFIX_FOR_EMAIL_ID;
1105 } elseif (isset($_SERVER[
"SERVER_NAME"])) {
1106 return $_SERVER[
"SERVER_NAME"];
1111 if (!empty($conf->file->instance_unique_id)) {
1112 return sha1(
'dolibarr'.$conf->file->instance_unique_id);
1116 return sha1(DOL_DOCUMENT_ROOT.DOL_URL_ROOT);
1120 global $dolibarr_main_instance_unique_id, $dolibarr_main_cookie_cryptkey;
1121 $tmp_instance_unique_id = empty($dolibarr_main_instance_unique_id) ? (empty($dolibarr_main_cookie_cryptkey) ?
'' : $dolibarr_main_cookie_cryptkey) : $dolibarr_main_instance_unique_id;
1124 if (!empty($tmp_instance_unique_id)) {
1125 return sha1(
'dolibarr'.$tmp_instance_unique_id);
1129 if (isset($_SERVER[
"SERVER_NAME"]) && isset($_SERVER[
"DOCUMENT_ROOT"])) {
1130 return sha1($_SERVER[
"SERVER_NAME"].$_SERVER[
"DOCUMENT_ROOT"].DOL_DOCUMENT_ROOT.DOL_URL_ROOT);
1132 return sha1(DOL_DOCUMENT_ROOT.DOL_URL_ROOT);
1149 global $conf, $langs, $user, $mysoc;
1153 if (!file_exists($fullpath)) {
1154 dol_syslog(
'functions::dol_include_once Tried to load unexisting file: '.$relpath, LOG_WARNING);
1158 if (!empty($classname) && !class_exists($classname)) {
1159 return include $fullpath;
1161 return include_once $fullpath;
1180 $path = preg_replace(
'/^\//',
'', $path);
1183 $res = DOL_DOCUMENT_ROOT.
'/'.$path;
1184 if (is_array($conf->file->dol_document_root)) {
1185 foreach ($conf->file->dol_document_root as $key => $dirroot) {
1186 if ($key ==
'main') {
1190 if (@file_exists($dirroot.
'/'.$path)) {
1191 $res = $dirroot.
'/'.$path;
1196 if ($returnemptyifnotfound) {
1198 if ($returnemptyifnotfound == 1 || !file_exists($res)) {
1210 $res = DOL_URL_ROOT.
'/'.$path;
1213 $res = DOL_MAIN_URL_ROOT.
'/'.$path;
1216 $res = DOL_URL_ROOT.
'/'.$path;
1219 foreach ($conf->file->dol_document_root as $key => $dirroot) {
1220 if ($key ==
'main') {
1225 $urlwithouturlroot = preg_replace(
'/'.preg_quote(DOL_URL_ROOT,
'/').
'$/i',
'', trim($conf->file->dol_main_url_root));
1226 $urlwithroot = $urlwithouturlroot.DOL_URL_ROOT;
1229 $res = (preg_match(
'/^http/i', $conf->file->dol_url_root[$key]) ?
'' : $urlwithroot).
'/'.$path;
1234 preg_match(
'/^([^\?]+(\.css\.php|\.css|\.js\.php|\.js|\.png|\.jpg|\.php)?)/i', $path, $regs);
1235 if (!empty($regs[1])) {
1238 if (@file_exists($dirroot.
'/'.$regs[1])) {
1240 $res = (preg_match(
'/^http/i', $conf->file->dol_url_root[$key]) ?
'' : DOL_URL_ROOT).$conf->file->dol_url_root[$key].
'/'.$path;
1243 $res = (preg_match(
'/^http/i', $conf->file->dol_url_root[$key]) ?
'' : DOL_MAIN_URL_ROOT).$conf->file->dol_url_root[$key].
'/'.$path;
1249 $urlwithouturlroot = preg_replace(
'/'.preg_quote(DOL_URL_ROOT,
'/').
'$/i',
'', trim($conf->file->dol_main_url_root));
1250 $urlwithroot = $urlwithouturlroot.DOL_URL_ROOT;
1253 $res = (preg_match(
'/^http/i', $conf->file->dol_url_root[$key]) ?
'' : $urlwithroot).$conf->file->dol_url_root[$key].
'/'.$path;
1280 if (isset($object->db) && isset($object->db->db) && is_object($object->db->db) && get_class($object->db->db) ==
'PgSql\Connection') {
1281 $tmpsavdb = $object->db;
1285 $myclone = unserialize(serialize($object));
1287 if (!empty($tmpsavdb)) {
1288 $object->db = $tmpsavdb;
1290 } elseif ($native == 2) {
1293 $tmparray = get_object_vars($object);
1295 if (is_array($tmparray)) {
1296 foreach ($tmparray as $propertykey => $propertyval) {
1297 if (is_scalar($propertyval) || is_array($propertyval)) {
1298 $myclone->$propertykey = $propertyval;
1303 $myclone = clone $object;
1321 if (empty($conf->dol_optimize_smallscreen)) {
1324 if ($type ==
'width' && $size > 250) {
1349 $filesystem_forbidden_chars = array(
'<',
'>',
'/',
'\\',
'?',
'*',
'|',
'"',
':',
'°',
'$',
';',
'`');
1351 $tmp = preg_replace(
'/\-\-+/',
'_', $tmp);
1352 $tmp = preg_replace(
'/\s+\-([^\s])/',
' _$1', $tmp);
1353 $tmp = preg_replace(
'/\s+\-$/',
'', $tmp);
1354 $tmp = str_replace(
'..',
'', $tmp);
1374 $filesystem_forbidden_chars = array(
'<',
'>',
'?',
'*',
'|',
'"',
'°',
'$',
';',
'`');
1376 $tmp = preg_replace(
'/\-\-+/',
'_', $tmp);
1377 $tmp = preg_replace(
'/\s+\-([^\s])/',
' _$1', $tmp);
1378 $tmp = preg_replace(
'/\s+\-$/',
'', $tmp);
1379 $tmp = str_replace(
'..',
'', $tmp);
1394 $stringtoclean = preg_replace(
'/[\x00-\x1F\x7F]/u',
'', $stringtoclean);
1396 $stringtoclean = preg_replace(
'/<!--[^>]*-->/',
'', $stringtoclean);
1398 $stringtoclean = str_replace(
'\\',
'/', $stringtoclean);
1402 $stringtoclean = str_replace(array(
':',
';',
'@'),
'', $stringtoclean);
1406 $oldstringtoclean = $stringtoclean;
1409 $stringtoclean = str_ireplace(array(
'javascript',
'vbscript',
'&colon',
'&#'),
'', $stringtoclean);
1410 }
while ($oldstringtoclean != $stringtoclean);
1414 $stringtoclean = preg_replace(array(
'/^[a-z]*\/\/+/i'),
'', $stringtoclean);
1417 return $stringtoclean;
1429 $oldstringtoclean = $stringtoclean;
1430 $stringtoclean = str_ireplace(array(
'"',
':',
'[',
']',
"\n",
"\r",
'\\',
'\/'),
'', $stringtoclean);
1431 }
while ($oldstringtoclean != $stringtoclean);
1433 return $stringtoclean;
1448 if (is_null($str)) {
1453 if (extension_loaded(
'intl') &&
getDolGlobalString(
'MAIN_UNACCENT_USE_TRANSLITERATOR')) {
1454 $transliterator = Transliterator::createFromRules(
':: Any-Latin; :: Latin-ASCII; :: NFD; :: [:Nonspacing Mark:] Remove; :: NFC;', Transliterator::FORWARD);
1455 return $transliterator->transliterate($str);
1458 $string = rawurlencode($str);
1459 $replacements = array(
1460 '%C3%80' =>
'A',
'%C3%81' =>
'A',
'%C3%82' =>
'A',
'%C3%83' =>
'A',
'%C3%84' =>
'A',
'%C3%85' =>
'A',
1462 '%C3%88' =>
'E',
'%C3%89' =>
'E',
'%C3%8A' =>
'E',
'%C3%8B' =>
'E',
1463 '%C3%8C' =>
'I',
'%C3%8D' =>
'I',
'%C3%8E' =>
'I',
'%C3%8F' =>
'I',
1465 '%C3%92' =>
'O',
'%C3%93' =>
'O',
'%C3%94' =>
'O',
'%C3%95' =>
'O',
'%C3%96' =>
'O',
1467 '%C3%99' =>
'U',
'%C3%9A' =>
'U',
'%C3%9B' =>
'U',
'%C3%9C' =>
'U',
1468 '%C3%9D' =>
'Y',
'%C5%B8' =>
'y',
1469 '%C3%A0' =>
'a',
'%C3%A1' =>
'a',
'%C3%A2' =>
'a',
'%C3%A3' =>
'a',
'%C3%A4' =>
'a',
'%C3%A5' =>
'a',
1471 '%C3%A8' =>
'e',
'%C3%A9' =>
'e',
'%C3%AA' =>
'e',
'%C3%AB' =>
'e',
1472 '%C3%AC' =>
'i',
'%C3%AD' =>
'i',
'%C3%AE' =>
'i',
'%C3%AF' =>
'i',
1474 '%C3%B2' =>
'o',
'%C3%B3' =>
'o',
'%C3%B4' =>
'o',
'%C3%B5' =>
'o',
'%C3%B6' =>
'o',
1476 '%C3%B9' =>
'u',
'%C3%BA' =>
'u',
'%C3%BB' =>
'u',
'%C3%BC' =>
'u',
1477 '%C3%BD' =>
'y',
'%C3%BF' =>
'y'
1479 $string = strtr($string, $replacements);
1480 return rawurldecode($string);
1485 "\xC0\xC1\xC2\xC3\xC4\xC5\xC7
1486 \xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1
1487 \xD2\xD3\xD4\xD5\xD8\xD9\xDA\xDB\xDD
1488 \xE0\xE1\xE2\xE3\xE4\xE5\xE7\xE8\xE9\xEA\xEB
1489 \xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF8
1490 \xF9\xFA\xFB\xFC\xFD\xFF",
1498 $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"));
1516function dol_string_nospecial($str, $newstr =
'_', $badcharstoreplace =
'', $badcharstoremove =
'', $keepspaces = 0)
1518 $forbidden_chars_to_replace = array(
"'",
"/",
"\\",
":",
"*",
"?",
"\"",
"<",
">",
"|",
"[",
"]",
",",
";",
"=",
'°',
'$',
';');
1519 if (empty($keepspaces)) {
1520 $forbidden_chars_to_replace[] =
" ";
1522 $forbidden_chars_to_remove = array();
1525 if (is_array($badcharstoreplace)) {
1526 $forbidden_chars_to_replace = $badcharstoreplace;
1528 if (is_array($badcharstoremove)) {
1529 $forbidden_chars_to_remove = $badcharstoremove;
1532 return str_replace($forbidden_chars_to_replace, $newstr, str_replace($forbidden_chars_to_remove,
"", $str));
1551 if ($removetabcrlf) {
1552 return preg_replace(
'/[\x00-\x1F\x7F]/u',
'', $str);
1554 return preg_replace(
'/[\x00-\x08\x11-\x12\x14-\x1F\x7F]/u',
'', $str);
1568 if (is_null($stringtoescape)) {
1573 $substitjs = array(
"'"=>
"\\'",
"\r"=>
'\\r');
1575 if (empty($noescapebackslashn)) {
1576 $substitjs[
"\n"] =
'\\n';
1577 $substitjs[
'\\'] =
'\\\\';
1580 $substitjs[
"'"] =
"\\'";
1581 $substitjs[
'"'] =
"\\'";
1582 } elseif ($mode == 1) {
1583 $substitjs[
"'"] =
"\\'";
1584 } elseif ($mode == 2) {
1585 $substitjs[
'"'] =
'\\"';
1586 } elseif ($mode == 3) {
1587 $substitjs[
"'"] =
"\\'";
1588 $substitjs[
'"'] =
"\\\"";
1590 return strtr($stringtoescape, $substitjs);
1601 return str_replace(
'"',
'\"', $stringtoescape);
1613 if (is_null($stringtoescape)) {
1617 if ($stringforquotes == 2) {
1618 return str_replace(
'"',
"'", $stringtoescape);
1620 if ($stringforquotes == 1) {
1621 return str_replace(
"'",
"\'", str_replace(
'"',
"'", $stringtoescape));
1624 return 'Bad parameter for stringforquotes in dol_escape_php';
1635 return preg_replace(
'/[^a-z0-9_]/i',
'', $stringtoescape);
1646 return $stringtoescape;
1684 return dol_escape_htmltag(
dol_string_onlythesehtmltags(
dol_htmlentitiesbr($s), 1, 0, 0, 0, array(
'br',
'b',
'font',
'span')), 1, -1,
'', 0, 1);
1708 return htmlspecialchars($s, ENT_COMPAT,
'UTF-8');
1728function dol_escape_htmltag($stringtoescape, $keepb = 0, $keepn = 0, $noescapetags =
'', $escapeonlyhtmltags = 0, $cleanalsojavascript = 0)
1730 if ($noescapetags ==
'common') {
1731 $noescapetags =
'html,body,a,b,em,hr,i,u,ul,li,br,div,img,font,p,span,strong,table,tr,td,th,tbody,h1,h2,h3,h4,h5,h6,h7,h8,h9';
1733 $noescapetags .=
',header,footer,nav,section,menu,menuitem';
1735 if ($cleanalsojavascript) {
1740 if ($escapeonlyhtmltags) {
1741 $tmp = htmlspecialchars_decode((
string) $stringtoescape, ENT_COMPAT);
1743 $tmp = html_entity_decode((
string) $stringtoescape, ENT_COMPAT,
'UTF-8');
1746 $tmp = strtr($tmp, array(
"<b>"=>
'',
'</b>'=>
'',
'<strong>'=>
'',
'</strong>'=>
''));
1749 $tmp = strtr($tmp, array(
"\r"=>
'\\r',
"\n"=>
'\\n'));
1750 } elseif ($keepn == -1) {
1751 $tmp = strtr($tmp, array(
"\r"=>
'',
"\n"=>
''));
1754 if ($escapeonlyhtmltags) {
1755 return htmlspecialchars($tmp, ENT_COMPAT,
'UTF-8');
1758 $tmparrayoftags = array();
1759 if ($noescapetags) {
1760 $tmparrayoftags = explode(
',', $noescapetags);
1762 if (count($tmparrayoftags)) {
1764 foreach ($tmparrayoftags as $tagtoreplace) {
1765 $tmp = str_ireplace(
'<'.$tagtoreplace.
'>',
'__BEGINTAGTOREPLACE'.$tagtoreplace.
'__', $tmp);
1766 $tmp = str_ireplace(
'</'.$tagtoreplace.
'>',
'__ENDTAGTOREPLACE'.$tagtoreplace.
'__', $tmp);
1767 $tmp = str_ireplace(
'<'.$tagtoreplace.
' />',
'__BEGINENDTAGTOREPLACE'.$tagtoreplace.
'__', $tmp);
1771 $result = htmlentities($tmp, ENT_COMPAT,
'UTF-8');
1773 if (count($tmparrayoftags)) {
1774 foreach ($tmparrayoftags as $tagtoreplace) {
1775 $result = str_ireplace(
'__BEGINTAGTOREPLACE'.$tagtoreplace.
'__',
'<'.$tagtoreplace.
'>', $result);
1776 $result = str_ireplace(
'__ENDTAGTOREPLACE'.$tagtoreplace.
'__',
'</'.$tagtoreplace.
'>', $result);
1777 $result = str_ireplace(
'__BEGINENDTAGTOREPLACE'.$tagtoreplace.
'__',
'<'.$tagtoreplace.
' />', $result);
1794 if (function_exists(
'mb_strtolower')) {
1795 return mb_strtolower($string, $encoding);
1797 return strtolower($string);
1811 if (function_exists(
'mb_strtoupper')) {
1812 return mb_strtoupper($string, $encoding);
1814 return strtoupper($string);
1828 if (function_exists(
'mb_substr')) {
1829 return mb_strtoupper(mb_substr($string, 0, 1, $encoding), $encoding).mb_substr($string, 1,
null, $encoding);
1831 return ucfirst($string);
1845 if (function_exists(
'mb_convert_case')) {
1846 return mb_convert_case($string, MB_CASE_TITLE, $encoding);
1848 return ucwords($string);
1873function dol_syslog($message, $level = LOG_INFO, $ident = 0, $suffixinfilename =
'', $restricttologhandler =
'', $logcontext =
null)
1875 global $conf, $user, $debugbar;
1878 if (!isModEnabled(
'syslog')) {
1883 if (defined(
'USEEXTERNALSERVER') && !defined(
'USEDOLIBARRSERVER') && !defined(
'USEDOLIBARREDITOR')) {
1884 global $website, $websitekey;
1885 if (is_object($website) && !empty($website->ref)) {
1886 $suffixinfilename .=
'_website_'.$website->ref;
1887 } elseif (!empty($websitekey)) {
1888 $suffixinfilename .=
'_website_'.$websitekey;
1893 if (defined(
'USESUFFIXINLOG')) {
1894 $suffixinfilename .= constant(
'USESUFFIXINLOG');
1898 foreach ($conf->loghandlers as $loghandlerinstance) {
1899 $loghandlerinstance->setIdent($ident);
1903 if (!empty($message)) {
1905 $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');
1906 if (!array_key_exists($level, $logLevels)) {
1907 throw new Exception(
'Incorrect log level');
1914 $message = preg_replace(
'/password=\'[^\']*\'/',
'password=\'hidden\'', $message);
1918 if ((!empty($_REQUEST[
'logtohtml']) &&
getDolGlobalString(
'MAIN_ENABLE_LOG_TO_HTML'))
1919 || (is_object($user) && $user->hasRight(
'debugbar',
'read') && is_object($debugbar))) {
1920 $conf->logbuffer[] =
dol_print_date(time(),
"%Y-%m-%d %H:%M:%S").
" ".$logLevels[$level].
" ".$message;
1926 print
"\n\n<!-- Log start\n";
1928 print
"Log end -->\n";
1932 'message' => $message,
1933 'script' => (isset($_SERVER[
'PHP_SELF']) ? basename($_SERVER[
'PHP_SELF'],
'.php') :
false),
1935 'user' => ((is_object($user) && $user->id) ? $user->login :
false),
1940 if (!empty($remoteip)) {
1941 $data[
'ip'] = $remoteip;
1943 if (!empty($_SERVER[
'HTTP_X_FORWARDED_FOR']) && $_SERVER[
'HTTP_X_FORWARDED_FOR'] != $remoteip) {
1944 $data[
'ip'] = $_SERVER[
'HTTP_X_FORWARDED_FOR'].
' -> '.$data[
'ip'];
1945 } elseif (!empty($_SERVER[
'HTTP_CLIENT_IP']) && $_SERVER[
'HTTP_CLIENT_IP'] != $remoteip) {
1946 $data[
'ip'] = $_SERVER[
'HTTP_CLIENT_IP'].
' -> '.$data[
'ip'];
1948 } elseif (!empty($_SERVER[
'SERVER_ADDR'])) {
1950 $data[
'ip'] = $_SERVER[
'SERVER_ADDR'];
1951 } elseif (!empty($_SERVER[
'COMPUTERNAME'])) {
1953 $data[
'ip'] = $_SERVER[
'COMPUTERNAME'].(empty($_SERVER[
'USERNAME']) ?
'' :
'@'.$_SERVER[
'USERNAME']);
1954 } elseif (!empty($_SERVER[
'LOGNAME'])) {
1956 $data[
'ip'] =
'???@'.$_SERVER[
'LOGNAME'];
1960 foreach ($conf->loghandlers as $loghandlerinstance) {
1961 if ($restricttologhandler && $loghandlerinstance->code != $restricttologhandler) {
1964 $loghandlerinstance->export($data, $suffixinfilename);
1970 foreach ($conf->loghandlers as $loghandlerinstance) {
1971 $loghandlerinstance->setIdent($ident);
1992function dolButtonToOpenUrlInDialogPopup($name, $label, $buttonstring, $url, $disabled =
'', $morecss =
'classlink button bordertransp', $jsonopen =
'', $backtopagejsfields =
'', $accesskey =
'')
1996 if (strpos($url,
'?') > 0) {
1997 $url .=
'&dol_hide_topmenu=1&dol_hide_leftmenu=1&dol_openinpopup='.urlencode($name);
1999 $url .=
'?dol_hide_topmenu=1&dol_hide_leftmenu=1&dol_openinpopup='.urlencode($name);
2004 $backtopagejsfieldsid =
'';
2005 $backtopagejsfieldslabel =
'';
2006 if ($backtopagejsfields) {
2007 $tmpbacktopagejsfields = explode(
':', $backtopagejsfields);
2008 if (empty($tmpbacktopagejsfields[1])) {
2009 $backtopagejsfields = $name.
":".$backtopagejsfields;
2010 $tmp2backtopagejsfields = explode(
',', $tmpbacktopagejsfields[0]);
2012 $tmp2backtopagejsfields = explode(
',', $tmpbacktopagejsfields[1]);
2014 $backtopagejsfieldsid = empty($tmp2backtopagejsfields[0]) ?
'' : $tmp2backtopagejsfields[0];
2015 $backtopagejsfieldslabel = empty($tmp2backtopagejsfields[1]) ?
'' : $tmp2backtopagejsfields[1];
2016 $url .=
'&backtopagejsfields='.urlencode($backtopagejsfields);
2020 $out .=
'<!-- a link for button to open url into a dialog popup with backtopagejsfields = '.$backtopagejsfields.
' -->';
2021 $out .=
'<a '.($accesskey ?
' accesskey="'.$accesskey.
'"' :
'').
' class="cursorpointer reposition button_'.$name.($morecss ?
' '.$morecss :
'').
'"'.$disabled.
' title="'.
dol_escape_htmltag($label).
'"';
2022 if (empty($conf->use_javascript_ajax)) {
2023 $out .=
' href="'.DOL_URL_ROOT.$url.
'" target="_blank"';
2024 } elseif ($jsonopen) {
2025 $out .=
' href="#" onclick="'.$jsonopen.
'"';
2027 $out .=
' href="#"';
2029 $out .=
'>'.$buttonstring.
'</a>';
2031 if (!empty($conf->use_javascript_ajax)) {
2033 $out .=
'<!-- code to open popup and variables to retreive returned variables -->';
2034 $out .=
'<div id="idfordialog'.$name.
'" class="hidden">div for dialog</div>';
2035 $out .=
'<div id="varforreturndialogid'.$name.
'" class="hidden">div for returned id</div>';
2036 $out .=
'<div id="varforreturndialoglabel'.$name.
'" class="hidden">div for returned label</div>';
2037 $out .=
'<!-- Add js code to open dialog popup on dialog -->';
2038 $out .=
'<script nonce="'.getNonce().
'" type="text/javascript">
2039 jQuery(document).ready(function () {
2040 jQuery(".button_'.$name.
'").click(function () {
2041 console.log(\'Open popup with jQuery(...).dialog() on URL '.
dol_escape_js(DOL_URL_ROOT.$url).
'\');
2042 var $tmpdialog = $(\
'#idfordialog'.$name.
'\');
2043 $tmpdialog.html(\
'<iframe class="iframedialog" id="iframedialog'.$name.
'" style="border: 0px;" src="'.DOL_URL_ROOT.$url.
'" width="100%" height="98%"></iframe>\');
2047 height: (window.innerHeight - 150),
2050 open:
function (event, ui) {
2051 console.log(
"open popup name='.$name.', backtopagejsfields='.$backtopagejsfields.'");
2053 close:
function (event, ui) {
2054 var returnedid = jQuery(
"#varforreturndialogid'.$name.'").text();
2055 var returnedlabel = jQuery(
"#varforreturndialoglabel'.$name.'").text();
2056 console.log(
"popup has been closed. returnedid (js var defined into parent page)="+returnedid+
" returnedlabel="+returnedlabel);
2057 if (returnedid !=
"" && returnedid !=
"div for returned id") {
2058 jQuery(
"#'.(empty($backtopagejsfieldsid) ? "none
" : $backtopagejsfieldsid).'").val(returnedid);
2060 if (returnedlabel !=
"" && returnedlabel !=
"div for returned label") {
2061 jQuery(
"#'.(empty($backtopagejsfieldslabel) ? "none
" : $backtopagejsfieldslabel).'").val(returnedlabel);
2066 $tmpdialog.dialog(\
'open\');
2091function dol_fiche_head($links = array(), $active =
'0', $title =
'', $notab = 0, $picto =
'', $pictoisfullpath = 0, $morehtmlright =
'', $morecss =
'', $limittoshow = 0, $moretabssuffix =
'')
2093 print
dol_get_fiche_head($links, $active, $title, $notab, $picto, $pictoisfullpath, $morehtmlright, $morecss, $limittoshow, $moretabssuffix);
2112function dol_get_fiche_head($links = array(), $active =
'', $title =
'', $notab = 0, $picto =
'', $pictoisfullpath = 0, $morehtmlright =
'', $morecss =
'', $limittoshow = 0, $moretabssuffix =
'', $dragdropfile = 0)
2114 global $conf, $langs, $hookmanager;
2118 if (!empty($conf->dol_optimize_smallscreen)) {
2122 $out =
"\n".
'<!-- dol_fiche_head - dol_get_fiche_head -->';
2124 if ((!empty($title) && $showtitle) || $morehtmlright || !empty($links)) {
2125 $out .=
'<div class="tabs'.($picto ?
'' :
' nopaddingleft').
'" data-role="controlgroup" data-type="horizontal">'.
"\n";
2129 if ($morehtmlright) {
2130 $out .=
'<div class="inline-block floatright tabsElem">'.$morehtmlright.
'</div>';
2134 if (!empty($title) && $showtitle && !
getDolGlobalString(
'MAIN_OPTIMIZEFORTEXTBROWSER')) {
2136 $out .=
'<a class="tabTitle">';
2138 $noprefix = $pictoisfullpath;
2139 if (strpos($picto,
'fontawesome_') !==
false) {
2142 $out .=
img_picto($title, ($noprefix ?
'' :
'object_').$picto,
'', $pictoisfullpath, 0, 0,
'',
'imgTabTitle').
' ';
2144 $out .=
'<span class="tabTitleText">'.dol_escape_htmltag(
dol_trunc($title, $limittitle)).
'</span>';
2152 if (is_array($links) && !empty($links)) {
2153 $keys = array_keys($links);
2155 $maxkey = max($keys);
2161 if (empty($limittoshow)) {
2162 $limittoshow = (!
getDolGlobalString(
'MAIN_MAXTABS_IN_CARD') ? 99 : $conf->global->MAIN_MAXTABS_IN_CARD);
2164 if (!empty($conf->dol_optimize_smallscreen)) {
2172 for ($i = 0; $i <= $maxkey; $i++) {
2173 if ((is_numeric($active) && $i == $active) || (!empty($links[$i][2]) && !is_numeric($active) && $active == $links[$i][2])) {
2175 if ($i >= $limittoshow) {
2181 for ($i = 0; $i <= $maxkey; $i++) {
2182 if ((is_numeric($active) && $i == $active) || (!empty($links[$i][2]) && !is_numeric($active) && $active == $links[$i][2])) {
2188 if ($i < $limittoshow || $isactive) {
2190 $out .=
'<div class="inline-block tabsElem'.($isactive ?
' tabsElemActive' :
'').((!$isactive &&
getDolGlobalString(
'MAIN_HIDE_INACTIVETAB_ON_PRINT')) ?
' hideonprint' :
'').
'"><!-- id tab = '.(empty($links[$i][2]) ?
'' :
dol_escape_htmltag($links[$i][2])).
' -->';
2192 if (isset($links[$i][2]) && $links[$i][2] ==
'image') {
2193 if (!empty($links[$i][0])) {
2194 $out .=
'<a class="tabimage'.($morecss ?
' '.$morecss :
'').
'" href="'.$links[$i][0].
'">'.$links[$i][1].
'</a>'.
"\n";
2196 $out .=
'<span class="tabspan">'.$links[$i][1].
'</span>'.
"\n";
2198 } elseif (!empty($links[$i][1])) {
2200 $out .=
'<div class="tab tab'.($isactive ?
'active' :
'unactive').
'" style="margin: 0 !important">';
2201 if (!empty($links[$i][0])) {
2202 $titletoshow = preg_replace(
'/<.*$/',
'', $links[$i][1]);
2203 $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).
'">';
2205 $out .= $links[$i][1];
2206 if (!empty($links[$i][0])) {
2207 $out .=
'</a>'.
"\n";
2209 $out .= empty($links[$i][4]) ?
'' : $links[$i][4];
2218 $outmore .=
'<div class="popuptabset wordwrap">';
2220 $outmore .=
'<div class="popuptab wordwrap" style="display:inherit;">';
2221 if (isset($links[$i][2]) && $links[$i][2] ==
'image') {
2222 if (!empty($links[$i][0])) {
2223 $outmore .=
'<a class="tabimage'.($morecss ?
' '.$morecss :
'').
'" href="'.$links[$i][0].
'">'.$links[$i][1].
'</a>'.
"\n";
2225 $outmore .=
'<span class="tabspan">'.$links[$i][1].
'</span>'.
"\n";
2227 } elseif (!empty($links[$i][1])) {
2228 $outmore .=
'<a'.(!empty($links[$i][2]) ?
' id="'.$links[$i][2].
'"' :
'').
' class="wordwrap inline-block'.($morecss ?
' '.$morecss :
'').
'" href="'.$links[$i][0].
'">';
2229 $outmore .= preg_replace(
'/([a-z])\|([a-z])/i',
'\\1 | \\2', $links[$i][1]);
2230 $outmore .=
'</a>'.
"\n";
2232 $outmore .=
'</div>';
2239 $outmore .=
'</div>';
2243 $left = ($langs->trans(
"DIRECTION") ==
'rtl' ?
'right' :
'left');
2244 $right = ($langs->trans(
"DIRECTION") ==
'rtl' ?
'left' :
'right');
2245 $widthofpopup = 200;
2247 $tabsname = $moretabssuffix;
2248 if (empty($tabsname)) {
2249 $tabsname = str_replace(
"@",
"", $picto);
2251 $out .=
'<div id="moretabs'.$tabsname.
'" class="inline-block tabsElem valignmiddle">';
2252 $out .=
'<div class="tab valignmiddle"><a href="#" class="tab moretab inline-block tabunactive valignmiddle"><span class="hideonsmartphone">'.$langs->trans(
"More").
'</span>... ('.$nbintab.
')</a></div>';
2253 $out .=
'<div id="moretabsList'.$tabsname.
'" style="width: '.$widthofpopup.
'px; position: absolute; '.$left.
': -999em; text-align: '.$left.
'; margin:0px; padding:2px; z-index:10;">';
2256 $out .=
'<div></div>';
2259 $out .=
'<script nonce="'.getNonce().
'">';
2260 $out .=
"$('#moretabs".$tabsname.
"').mouseenter( function() {
2261 var x = this.offsetLeft, y = this.offsetTop;
2262 console.log('mouseenter ".$left.
" x='+x+' y='+y+' window.innerWidth='+window.innerWidth);
2263 if ((window.innerWidth - x) < ".($widthofpopup + 10).
") {
2264 $('#moretabsList".$tabsname.
"').css('".$right.
"','8px');
2266 $('#moretabsList".$tabsname.
"').css('".$left.
"','auto');
2269 $out .=
"$('#moretabs".$tabsname.
"').mouseleave( function() { console.log('mouseleave ".$left.
"'); $('#moretabsList".$tabsname.
"').css('".$left.
"','-999em');});";
2270 $out .=
"</script>";
2273 if ((!empty($title) && $showtitle) || $morehtmlright || !empty($links)) {
2277 if (!$notab || $notab == -1 || $notab == -2 || $notab == -3) {
2278 $out .=
"\n".
'<div id="dragDropAreaTabBar" class="tabBar'.($notab == -1 ?
'' : ($notab == -2 ?
' tabBarNoTop' : (($notab == -3 ?
' noborderbottom' :
'').
' tabBarWithBottom'))).
'">'.
"\n";
2280 if (!empty($dragdropfile)) {
2281 include_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
2284 $parameters = array(
'tabname' => $active,
'out' => $out);
2285 $reshook = $hookmanager->executeHooks(
'printTabsHead', $parameters);
2287 $out = $hookmanager->resPrint;
2313 if (!$notab || $notab == -1) {
2314 return "\n</div>\n";
2339function dol_banner_tab($object, $paramid, $morehtml =
'', $shownav = 1, $fieldid =
'rowid', $fieldref =
'ref', $morehtmlref =
'', $moreparam =
'', $nodbprefix = 0, $morehtmlleft =
'', $morehtmlstatus =
'', $onlybanner = 0, $morehtmlright =
'')
2341 global $conf, $form, $user, $langs, $hookmanager, $action;
2345 $maxvisiblephotos = 1;
2347 $entity = (empty($object->entity) ? $conf->entity : $object->entity);
2348 $showbarcode = empty($conf->barcode->enabled) ? 0 : (empty($object->barcode) ? 0 : 1);
2349 if (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && !$user->hasRight(
'barcode',
'lire_advance')) {
2352 $modulepart =
'unknown';
2354 if ($object->element ==
'societe' || $object->element ==
'contact' || $object->element ==
'product' || $object->element ==
'ticket') {
2355 $modulepart = $object->element;
2356 } elseif ($object->element ==
'member') {
2357 $modulepart =
'memberphoto';
2358 } elseif ($object->element ==
'user') {
2359 $modulepart =
'userphoto';
2362 if (class_exists(
"Imagick")) {
2363 if ($object->element ==
'expensereport' || $object->element ==
'propal' || $object->element ==
'commande' || $object->element ==
'facture' || $object->element ==
'supplier_proposal') {
2364 $modulepart = $object->element;
2365 } elseif ($object->element ==
'fichinter') {
2366 $modulepart =
'ficheinter';
2367 } elseif ($object->element ==
'contrat') {
2368 $modulepart =
'contract';
2369 } elseif ($object->element ==
'order_supplier') {
2370 $modulepart =
'supplier_order';
2371 } elseif ($object->element ==
'invoice_supplier') {
2372 $modulepart =
'supplier_invoice';
2376 if ($object->element ==
'product') {
2378 $cssclass =
'photowithmargin photoref';
2379 $showimage = $object->is_photo_available($conf->product->multidir_output[$entity]);
2380 $maxvisiblephotos = (isset($conf->global->PRODUCT_MAX_VISIBLE_PHOTO) ? $conf->global->PRODUCT_MAX_VISIBLE_PHOTO : 5);
2381 if ($conf->browser->layout ==
'phone') {
2382 $maxvisiblephotos = 1;
2385 $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>';
2389 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"></div>';
2391 $nophoto =
'/public/theme/common/nophoto.png';
2392 $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>';
2395 } elseif ($object->element ==
'ticket') {
2397 $cssclass =
'photoref';
2398 $showimage = $object->is_photo_available($conf->ticket->multidir_output[$entity].
'/'.$object->ref);
2399 $maxvisiblephotos = (isset($conf->global->TICKET_MAX_VISIBLE_PHOTO) ? $conf->global->TICKET_MAX_VISIBLE_PHOTO : 2);
2400 if ($conf->browser->layout ==
'phone') {
2401 $maxvisiblephotos = 1;
2405 $showphoto = $object->show_photos(
'ticket', $conf->ticket->multidir_output[$entity],
'small', $maxvisiblephotos, 0, 0, 0, $width, 0);
2406 if ($object->nbphoto > 0) {
2407 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref">'.$showphoto.
'</div>';
2415 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"></div>';
2417 $nophoto =
img_picto(
'No photo',
'object_ticket');
2418 $morehtmlleft .=
'<!-- No photo to show -->';
2419 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"><div class="photoref">';
2420 $morehtmlleft .= $nophoto;
2421 $morehtmlleft .=
'</div></div>';
2426 if ($modulepart !=
'unknown') {
2429 if (in_array($modulepart, array(
'propal',
'commande',
'facture',
'ficheinter',
'contract',
'supplier_order',
'supplier_proposal',
'supplier_invoice',
'expensereport')) && class_exists(
"Imagick")) {
2431 $dir_output = (empty($conf->$modulepart->multidir_output[$entity]) ? $conf->$modulepart->dir_output : $conf->$modulepart->multidir_output[$entity]).
"/";
2432 if (in_array($modulepart, array(
'invoice_supplier',
'supplier_invoice'))) {
2433 $subdir =
get_exdir($object->id, 2, 0, 1, $object, $modulepart);
2434 $subdir .= ((!empty($subdir) && !preg_match(
'/\/$/', $subdir)) ?
'/' :
'').$objectref;
2436 $subdir =
get_exdir($object->id, 0, 0, 1, $object, $modulepart);
2438 if (empty($subdir)) {
2439 $subdir =
'errorgettingsubdirofobject';
2442 $filepath = $dir_output.$subdir.
"/";
2444 $filepdf = $filepath.$objectref.
".pdf";
2445 $relativepath = $subdir.
'/'.$objectref.
'.pdf';
2448 $fileimage = $filepdf.
'_preview.png';
2449 $relativepathimage = $relativepath.
'_preview.png';
2451 $pdfexists = file_exists($filepdf);
2456 if (!file_exists($fileimage) || (filemtime($fileimage) < filemtime($filepdf))) {
2458 include_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
2467 if ($pdfexists && !$error) {
2468 $heightforphotref = 80;
2469 if (!empty($conf->dol_optimize_smallscreen)) {
2470 $heightforphotref = 60;
2473 if (file_exists($fileimage)) {
2474 $phototoshow =
'<div class="photoref">';
2475 $phototoshow .=
'<img height="'.$heightforphotref.
'" class="photo photowithborder" src="'.DOL_URL_ROOT.
'/viewimage.php?modulepart=apercu'.$modulepart.
'&file='.urlencode($relativepathimage).
'">';
2476 $phototoshow .=
'</div>';
2479 } elseif (!$phototoshow) {
2480 $phototoshow .= $form->showphoto($modulepart, $object, 0, 0, 0,
'photowithmargin photoref',
'small', 1, 0, $maxvisiblephotos);
2484 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref">';
2485 $morehtmlleft .= $phototoshow;
2486 $morehtmlleft .=
'</div>';
2490 if (empty($phototoshow)) {
2491 if ($object->element ==
'action') {
2493 $cssclass =
'photorefcenter';
2494 $nophoto =
img_picto(
'No photo',
'title_agenda');
2497 $cssclass =
'photorefcenter';
2498 $picto = $object->picto;
2499 $prefix =
'object_';
2500 if ($object->element ==
'project' && !$object->public) {
2503 if (strpos($picto,
'fontawesome_') !==
false) {
2506 $nophoto =
img_picto(
'No photo', $prefix.$picto);
2508 $morehtmlleft .=
'<!-- No photo to show -->';
2509 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref"><div class="photoref">';
2510 $morehtmlleft .= $nophoto;
2511 $morehtmlleft .=
'</div></div>';
2518 $morehtmlleft .=
'<div class="floatleft inline-block valignmiddle divphotoref">'.$form->showbarcode($object, 100,
'photoref valignmiddle').
'</div>';
2521 if ($object->element ==
'societe') {
2522 if (!empty($conf->use_javascript_ajax) && $user->hasRight(
'societe',
'creer') &&
getDolGlobalString(
'MAIN_DIRECT_STATUS_UPDATE')) {
2523 $morehtmlstatus .=
ajax_object_onoff($object,
'status',
'status',
'InActivity',
'ActivityCeased');
2525 $morehtmlstatus .= $object->getLibStatut(6);
2527 } elseif ($object->element ==
'product') {
2529 if (!empty($conf->use_javascript_ajax) && $user->hasRight(
'produit',
'creer') &&
getDolGlobalString(
'MAIN_DIRECT_STATUS_UPDATE')) {
2530 $morehtmlstatus .=
ajax_object_onoff($object,
'status',
'tosell',
'ProductStatusOnSell',
'ProductStatusNotOnSell');
2532 $morehtmlstatus .=
'<span class="statusrefsell">'.$object->getLibStatut(6, 0).
'</span>';
2534 $morehtmlstatus .=
' ';
2536 if (!empty($conf->use_javascript_ajax) && $user->hasRight(
'produit',
'creer') &&
getDolGlobalString(
'MAIN_DIRECT_STATUS_UPDATE')) {
2537 $morehtmlstatus .=
ajax_object_onoff($object,
'status_buy',
'tobuy',
'ProductStatusOnBuy',
'ProductStatusNotOnBuy');
2539 $morehtmlstatus .=
'<span class="statusrefbuy">'.$object->getLibStatut(6, 1).
'</span>';
2541 } elseif (in_array($object->element, array(
'salary'))) {
2542 $tmptxt = $object->getLibStatut(6, $object->alreadypaid);
2543 if (empty($tmptxt) || $tmptxt == $object->getLibStatut(3)) {
2544 $tmptxt = $object->getLibStatut(5, $object->alreadypaid);
2546 $morehtmlstatus .= $tmptxt;
2547 } elseif (in_array($object->element, array(
'facture',
'invoice',
'invoice_supplier'))) {
2548 $totalallpayments = $object->getSommePaiement(0);
2549 $totalallpayments += $object->getSumCreditNotesUsed(0);
2550 $totalallpayments += $object->getSumDepositsUsed(0);
2551 $tmptxt = $object->getLibStatut(6, $totalallpayments);
2552 if (empty($tmptxt) || $tmptxt == $object->getLibStatut(3)) {
2553 $tmptxt = $object->getLibStatut(5, $totalallpayments);
2555 $morehtmlstatus .= $tmptxt;
2556 } elseif (in_array($object->element, array(
'chargesociales',
'loan',
'tva'))) {
2557 $tmptxt = $object->getLibStatut(6, $object->totalpaid);
2558 if (empty($tmptxt) || $tmptxt == $object->getLibStatut(3)) {
2559 $tmptxt = $object->getLibStatut(5, $object->totalpaid);
2561 $morehtmlstatus .= $tmptxt;
2562 } elseif ($object->element ==
'contrat' || $object->element ==
'contract') {
2563 if ($object->statut == 0) {
2564 $morehtmlstatus .= $object->getLibStatut(5);
2566 $morehtmlstatus .= $object->getLibStatut(4);
2568 } elseif ($object->element ==
'facturerec') {
2569 if ($object->frequency == 0) {
2570 $morehtmlstatus .= $object->getLibStatut(2);
2572 $morehtmlstatus .= $object->getLibStatut(5);
2574 } elseif ($object->element ==
'project_task') {
2575 $object->fk_statut = 1;
2576 if ($object->progress > 0) {
2577 $object->fk_statut = 2;
2579 if ($object->progress >= 100) {
2580 $object->fk_statut = 3;
2582 $tmptxt = $object->getLibStatut(5);
2583 $morehtmlstatus .= $tmptxt;
2584 } elseif (method_exists($object,
'getLibStatut')) {
2585 $tmptxt = $object->getLibStatut(6);
2586 if (empty($tmptxt) || $tmptxt == $object->getLibStatut(3)) {
2587 $tmptxt = $object->getLibStatut(5);
2589 $morehtmlstatus .= $tmptxt;
2593 if (isModEnabled(
'accounting') && in_array($object->element, array(
'bank',
'paiementcharge',
'facture',
'invoice',
'invoice_supplier',
'expensereport',
'payment_various'))) {
2595 if (method_exists($object,
'getVentilExportCompta')) {
2596 $accounted = $object->getVentilExportCompta();
2597 $langs->load(
"accountancy");
2598 $morehtmlstatus .=
'</div><div class="statusref statusrefbis"><span class="opacitymedium">'.($accounted > 0 ? $langs->trans(
"Accounted") : $langs->trans(
"NotYetAccounted")).
'</span>';
2603 if (!empty($object->name_alias)) {
2604 $morehtmlref .=
'<div class="refidno opacitymedium">'.dol_escape_htmltag($object->name_alias).
'</div>';
2608 if (in_array($object->element, array(
'product',
'bank_account',
'project_task'))) {
2609 if (!empty($object->label)) {
2610 $morehtmlref .=
'<div class="refidno opacitymedium">'.$object->label.
'</div>';
2615 if (method_exists($object,
'getBannerAddress') && !in_array($object->element, array(
'product',
'bookmark',
'ecm_directories',
'ecm_files'))) {
2616 $moreaddress = $object->getBannerAddress(
'refaddress', $object);
2618 $morehtmlref .=
'<div class="refidno refaddress">';
2619 $morehtmlref .= $moreaddress;
2620 $morehtmlref .=
'</div>';
2623 if (
getDolGlobalString(
'MAIN_SHOW_TECHNICAL_ID') && (
getDolGlobalString(
'MAIN_SHOW_TECHNICAL_ID') ==
'1' || preg_match(
'/'.preg_quote($object->element,
'/').
'/i', $conf->global->MAIN_SHOW_TECHNICAL_ID)) && !empty($object->id)) {
2624 $morehtmlref .=
'<div style="clear: both;"></div>';
2625 $morehtmlref .=
'<div class="refidno opacitymedium">';
2626 $morehtmlref .= $langs->trans(
"TechnicalID").
': '.((int) $object->id);
2627 $morehtmlref .=
'</div>';
2630 $parameters=array(
'morehtmlref'=>$morehtmlref);
2631 $reshook = $hookmanager->executeHooks(
'formDolBanner', $parameters, $object, $action);
2634 } elseif (empty($reshook)) {
2635 $morehtmlref .= $hookmanager->resPrint;
2636 } elseif ($reshook > 0) {
2637 $morehtmlref = $hookmanager->resPrint;
2640 print
'<div class="'.($onlybanner ?
'arearefnobottom ' :
'arearef ').
'heightref valignmiddle centpercent">';
2641 print $form->showrefnav($object, $paramid, $morehtml, $shownav, $fieldid, $fieldref, $morehtmlref, $moreparam, $nodbprefix, $morehtmlleft, $morehtmlstatus, $morehtmlright);
2643 print
'<div class="underrefbanner clearboth"></div>';
2659 if ($fieldrequired) {
2660 $ret .=
'<span class="fieldrequired">';
2662 $ret .=
'<label for="'.$fieldkey.
'">';
2663 $ret .= $langs->trans($langkey);
2665 if ($fieldrequired) {
2681 $ret =
' '.$bc[$var];
2683 $ret = preg_replace(
'/class=\"/',
'class="'.$moreclass.
' ', $ret);
2701function dol_format_address($object, $withcountry = 0, $sep =
"\n", $outputlangs =
'', $mode = 0, $extralangcode =
'')
2703 global $conf, $langs, $hookmanager;
2706 $countriesusingstate = array(
'AU',
'CA',
'US',
'IN',
'GB',
'ES',
'UK',
'TR',
'CN');
2711 $ret .= ($extralangcode ? $object->array_languages[
'address'][$extralangcode] : (empty($object->address) ?
'' : preg_replace(
'/(\r\n|\r|\n)+/', $sep, $object->address)));
2714 if (isset($object->country_code) && in_array($object->country_code, array(
'AU',
'CA',
'US',
'CN')) ||
getDolGlobalString(
'MAIN_FORCE_STATE_INTO_ADDRESS')) {
2716 $town = ($extralangcode ? $object->array_languages[
'town'][$extralangcode] : (empty($object->town) ?
'' : $object->town));
2717 $ret .= (($ret && $town) ? $sep :
'').$town;
2719 if (!empty($object->state)) {
2720 $ret .= ($ret ? ($town ?
", " : $sep) :
'').$object->state;
2722 if (!empty($object->zip)) {
2723 $ret .= ($ret ? (($town || $object->state) ?
", " : $sep) :
'').$object->zip;
2725 } elseif (isset($object->country_code) && in_array($object->country_code, array(
'GB',
'UK'))) {
2727 $town = ($extralangcode ? $object->array_languages[
'town'][$extralangcode] : (empty($object->town) ?
'' : $object->town));
2728 $ret .= ($ret ? $sep :
'').$town;
2729 if (!empty($object->state)) {
2730 $ret .= ($ret ?
", " :
'').$object->state;
2732 if (!empty($object->zip)) {
2733 $ret .= ($ret ? $sep :
'').$object->zip;
2735 } elseif (isset($object->country_code) && in_array($object->country_code, array(
'ES',
'TR'))) {
2737 $ret .= ($ret ? $sep :
'').$object->zip;
2738 $town = ($extralangcode ? $object->array_languages[
'town'][$extralangcode] : (empty($object->town) ?
'' : $object->town));
2739 $ret .= ($town ? (($object->zip ?
' ' :
'').$town) :
'');
2740 if (!empty($object->state)) {
2741 $ret .= $sep.$object->state;
2743 } elseif (isset($object->country_code) && in_array($object->country_code, array(
'JP'))) {
2746 $town = ($extralangcode ? $object->array_languages[
'town'][$extralangcode] : (empty($object->town) ?
'' : $object->town));
2747 $ret .= ($ret ? $sep :
'').($object->state ? $object->state.
', ' :
'').$town.($object->zip ?
' ' :
'').$object->zip;
2748 } elseif (isset($object->country_code) && in_array($object->country_code, array(
'IT'))) {
2750 $ret .= ($ret ? $sep :
'').$object->zip;
2751 $town = ($extralangcode ? $object->array_languages[
'town'][$extralangcode] : (empty($object->town) ?
'' : $object->town));
2752 $ret .= ($town ? (($object->zip ?
' ' :
'').$town) :
'');
2753 $ret .= (empty($object->state_code) ?
'' : (
' '.$object->state_code));
2756 $town = ($extralangcode ? $object->array_languages[
'town'][$extralangcode] : (empty($object->town) ?
'' : $object->town));
2757 $ret .= !empty($object->zip) ? (($ret ? $sep :
'').$object->zip) :
'';
2758 $ret .= ($town ? (($object->zip ?
' ' : ($ret ? $sep :
'')).$town) :
'');
2759 if (!empty($object->state) && in_array($object->country_code, $countriesusingstate)) {
2760 $ret .= ($ret ?
", " :
'').$object->state;
2764 if (!is_object($outputlangs)) {
2765 $outputlangs = $langs;
2768 $langs->load(
"dict");
2769 $ret .= (empty($object->country_code) ?
'' : ($ret ? $sep :
'').$outputlangs->convToOutputCharset($outputlangs->transnoentitiesnoconv(
"Country".$object->country_code)));
2772 $parameters = array(
'withcountry' => $withcountry,
'sep' => $sep,
'outputlangs' => $outputlangs,
'mode' => $mode,
'extralangcode' => $extralangcode);
2773 $reshook = $hookmanager->executeHooks(
'formatAddress', $parameters, $object);
2777 $ret .= $hookmanager->resPrint;
2795 if ((abs($ts) <= 0x7FFFFFFF)) {
2796 return ($is_gmt) ? @gmstrftime($fmt, $ts) : @strftime($fmt, $ts);
2798 return 'Error date into a not supported range';
2823function dol_print_date($time, $format =
'', $tzoutput =
'auto', $outputlangs =
'', $encodetooutput =
false)
2825 global $conf, $langs;
2832 if ($tzoutput ===
'auto') {
2833 $tzoutput = (empty($conf) ?
'tzserver' : (isset($conf->tzuserinputkey) ? $conf->tzuserinputkey :
'tzserver'));
2838 $offsettz = $offsetdst = 0;
2841 if (is_string($tzoutput)) {
2842 if ($tzoutput ==
'tzserver') {
2844 $offsettzstring = @date_default_timezone_get();
2847 } elseif ($tzoutput ==
'tzuser' || $tzoutput ==
'tzuserrel') {
2849 $offsettzstring = (empty($_SESSION[
'dol_tz_string']) ?
'UTC' : $_SESSION[
'dol_tz_string']);
2851 if (class_exists(
'DateTimeZone')) {
2852 $user_date_tz =
new DateTimeZone($offsettzstring);
2853 $user_dt =
new DateTime();
2854 $user_dt->setTimezone($user_date_tz);
2855 $user_dt->setTimestamp($tzoutput ==
'tzuser' ?
dol_now() : (int) $time);
2856 $offsettz = $user_dt->getOffset();
2858 $offsettz = (empty($_SESSION[
'dol_tz']) ? 0 : $_SESSION[
'dol_tz']) * 60 * 60;
2859 $offsetdst = (empty($_SESSION[
'dol_dst']) ? 0 : $_SESSION[
'dol_dst']) * 60 * 60;
2864 if (!is_object($outputlangs)) {
2865 $outputlangs = $langs;
2868 $format =
'daytextshort';
2873 $reduceformat = (!empty($conf->dol_optimize_smallscreen) && in_array($format, array(
'day',
'dayhour',
'dayhoursec'))) ? 1 : 0;
2874 $format = preg_replace(
'/inputnoreduce/',
'', $format);
2875 $formatwithoutreduce = preg_replace(
'/reduceformat/',
'', $format);
2876 if ($formatwithoutreduce != $format) {
2877 $format = $formatwithoutreduce;
2883 if ($format ==
'day') {
2884 $format = ($outputlangs->trans(
"FormatDateShort") !=
"FormatDateShort" ? $outputlangs->trans(
"FormatDateShort") : $conf->format_date_short);
2885 } elseif ($format ==
'hour') {
2886 $format = ($outputlangs->trans(
"FormatHourShort") !=
"FormatHourShort" ? $outputlangs->trans(
"FormatHourShort") : $conf->format_hour_short);
2887 } elseif ($format ==
'hourduration') {
2888 $format = ($outputlangs->trans(
"FormatHourShortDuration") !=
"FormatHourShortDuration" ? $outputlangs->trans(
"FormatHourShortDuration") : $conf->format_hour_short_duration);
2889 } elseif ($format ==
'daytext') {
2890 $format = ($outputlangs->trans(
"FormatDateText") !=
"FormatDateText" ? $outputlangs->trans(
"FormatDateText") : $conf->format_date_text);
2891 } elseif ($format ==
'daytextshort') {
2892 $format = ($outputlangs->trans(
"FormatDateTextShort") !=
"FormatDateTextShort" ? $outputlangs->trans(
"FormatDateTextShort") : $conf->format_date_text_short);
2893 } elseif ($format ==
'dayhour') {
2894 $format = ($outputlangs->trans(
"FormatDateHourShort") !=
"FormatDateHourShort" ? $outputlangs->trans(
"FormatDateHourShort") : $conf->format_date_hour_short);
2895 } elseif ($format ==
'dayhoursec') {
2896 $format = ($outputlangs->trans(
"FormatDateHourSecShort") !=
"FormatDateHourSecShort" ? $outputlangs->trans(
"FormatDateHourSecShort") : $conf->format_date_hour_sec_short);
2897 } elseif ($format ==
'dayhourtext') {
2898 $format = ($outputlangs->trans(
"FormatDateHourText") !=
"FormatDateHourText" ? $outputlangs->trans(
"FormatDateHourText") : $conf->format_date_hour_text);
2899 } elseif ($format ==
'dayhourtextshort') {
2900 $format = ($outputlangs->trans(
"FormatDateHourTextShort") !=
"FormatDateHourTextShort" ? $outputlangs->trans(
"FormatDateHourTextShort") : $conf->format_date_hour_text_short);
2901 } elseif ($format ==
'dayhourlog') {
2903 $format =
'%Y%m%d%H%M%S';
2904 } elseif ($format ==
'dayhourlogsmall') {
2906 $format =
'%y%m%d%H%M';
2907 } elseif ($format ==
'dayhourldap') {
2908 $format =
'%Y%m%d%H%M%SZ';
2909 } elseif ($format ==
'dayhourxcard') {
2910 $format =
'%Y%m%dT%H%M%SZ';
2911 } elseif ($format ==
'dayxcard') {
2913 } elseif ($format ==
'dayrfc') {
2914 $format =
'%Y-%m-%d';
2915 } elseif ($format ==
'dayhourrfc') {
2916 $format =
'%Y-%m-%dT%H:%M:%SZ';
2917 } elseif ($format ==
'standard') {
2918 $format =
'%Y-%m-%d %H:%M:%S';
2921 if ($reduceformat) {
2922 $format = str_replace(
'%Y',
'%y', $format);
2923 $format = str_replace(
'yyyy',
'yy', $format);
2927 if (preg_match(
'/%b/i', $format)) {
2929 $format = str_replace(
'%b',
'__b__', $format);
2930 $format = str_replace(
'%B',
'__B__', $format);
2932 if (preg_match(
'/%a/i', $format)) {
2934 $format = str_replace(
'%a',
'__a__', $format);
2935 $format = str_replace(
'%A',
'__A__', $format);
2940 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)) {
2941 dol_print_error(
'',
"Functions.lib::dol_print_date function called with a bad value from page ".(empty($_SERVER[
"PHP_SELF"]) ?
'unknown' : $_SERVER[
"PHP_SELF"]));
2943 } elseif (preg_match(
'/^([0-9]+)\-([0-9]+)\-([0-9]+) ?([0-9]+)?:?([0-9]+)?:?([0-9]+)?/i', $time, $reg)) {
2945 dol_syslog(
"Functions.lib::dol_print_date function called with a bad value from page ".(empty($_SERVER[
"PHP_SELF"]) ?
'unknown' : $_SERVER[
"PHP_SELF"]), LOG_WARNING);
2948 $syear = (!empty($reg[1]) ? $reg[1] :
'');
2949 $smonth = (!empty($reg[2]) ? $reg[2] :
'');
2950 $sday = (!empty($reg[3]) ? $reg[3] :
'');
2951 $shour = (!empty($reg[4]) ? $reg[4] :
'');
2952 $smin = (!empty($reg[5]) ? $reg[5] :
'');
2953 $ssec = (!empty($reg[6]) ? $reg[6] :
'');
2955 $time =
dol_mktime($shour, $smin, $ssec, $smonth, $sday, $syear,
true);
2958 $tzo =
new DateTimeZone(
'UTC');
2960 $tzo =
new DateTimeZone(date_default_timezone_get());
2962 $dtts =
new DateTime();
2963 $dtts->setTimestamp($time);
2964 $dtts->setTimezone($tzo);
2965 $newformat = str_replace(
2966 array(
'%Y',
'%y',
'%m',
'%d',
'%H',
'%I',
'%M',
'%S',
'%p',
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
2967 array(
'Y',
'y',
'm',
'd',
'H',
'h',
'i',
's',
'A',
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
2970 $ret = $dtts->format($newformat);
2972 array(
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
2973 array(
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
2978 if ($time < 100000000000) {
2979 $timetouse = $time + $offsettz + $offsetdst;
2982 $tzo =
new DateTimeZone(
'UTC');
2984 $tzo =
new DateTimeZone(date_default_timezone_get());
2986 $dtts =
new DateTime();
2987 $dtts->setTimestamp($timetouse);
2988 $dtts->setTimezone($tzo);
2989 $newformat = str_replace(
2990 array(
'%Y',
'%y',
'%m',
'%d',
'%H',
'%I',
'%M',
'%S',
'%p',
'%w',
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
2991 array(
'Y',
'y',
'm',
'd',
'H',
'h',
'i',
's',
'A',
'w',
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
2994 $ret = $dtts->format($newformat);
2996 array(
'__£__',
'__$__',
'__{__',
'__}__',
'__[__',
'__]__'),
2997 array(
'T',
'Z',
'__a__',
'__A__',
'__b__',
'__B__'),
3002 $ret =
'Bad value '.$time.
' for date';
3006 if (preg_match(
'/__b__/i', $format)) {
3007 $timetouse = $time + $offsettz + $offsetdst;
3010 $tzo =
new DateTimeZone(
'UTC');
3012 $tzo =
new DateTimeZone(date_default_timezone_get());
3014 $dtts =
new DateTime();
3015 $dtts->setTimestamp($timetouse);
3016 $dtts->setTimezone($tzo);
3017 $month = $dtts->format(
"m");
3018 $month = sprintf(
"%02d", $month);
3019 if ($encodetooutput) {
3020 $monthtext = $outputlangs->transnoentities(
'Month'.$month);
3021 $monthtextshort = $outputlangs->transnoentities(
'MonthShort'.$month);
3023 $monthtext = $outputlangs->transnoentitiesnoconv(
'Month'.$month);
3024 $monthtextshort = $outputlangs->transnoentitiesnoconv(
'MonthShort'.$month);
3027 $ret = str_replace(
'__b__', $monthtextshort, $ret);
3028 $ret = str_replace(
'__B__', $monthtext, $ret);
3032 if (preg_match(
'/__a__/i', $format)) {
3034 $timetouse = $time + $offsettz + $offsetdst;
3037 $tzo =
new DateTimeZone(
'UTC');
3039 $tzo =
new DateTimeZone(date_default_timezone_get());
3041 $dtts =
new DateTime();
3042 $dtts->setTimestamp($timetouse);
3043 $dtts->setTimezone($tzo);
3044 $w = $dtts->format(
"w");
3045 $dayweek = $outputlangs->transnoentitiesnoconv(
'Day'.$w);
3047 $ret = str_replace(
'__A__', $dayweek, $ret);
3048 $ret = str_replace(
'__a__',
dol_substr($dayweek, 0, 3), $ret);
3077 if ($timestamp ===
'') {
3081 $datetimeobj =
new DateTime();
3082 $datetimeobj->setTimestamp($timestamp);
3083 if ($forcetimezone) {
3084 $datetimeobj->setTimezone(
new DateTimeZone($forcetimezone ==
'gmt' ?
'UTC' : $forcetimezone));
3087 'year'=>((
int) date_format($datetimeobj,
'Y')),
3088 'mon'=>((
int) date_format($datetimeobj,
'm')),
3089 'mday'=>((
int) date_format($datetimeobj,
'd')),
3090 'wday'=>((
int) date_format($datetimeobj,
'w')),
3091 'yday'=>((
int) date_format($datetimeobj,
'z')),
3092 'hours'=>((
int) date_format($datetimeobj,
'H')),
3093 'minutes'=>((
int) date_format($datetimeobj,
'i')),
3094 'seconds'=>((
int) date_format($datetimeobj,
's')),
3122function dol_mktime($hour, $minute, $second, $month, $day, $year, $gm =
'auto', $check = 1)
3127 if ($gm ===
'auto') {
3128 $gm = (empty($conf) ?
'tzserver' : $conf->tzuserinputkey);
3133 if ($hour == -1 || empty($hour)) {
3136 if ($minute == -1 || empty($minute)) {
3139 if ($second == -1 || empty($second)) {
3145 if (!$month || !$day) {
3154 if ($hour < 0 || $hour > 24) {
3157 if ($minute < 0 || $minute > 60) {
3160 if ($second < 0 || $second > 60) {
3165 if (empty($gm) || ($gm ===
'server' || $gm ===
'tzserver')) {
3166 $default_timezone = @date_default_timezone_get();
3167 $localtz =
new DateTimeZone($default_timezone);
3168 } elseif ($gm ===
'user' || $gm ===
'tzuser' || $gm ===
'tzuserrel') {
3170 $default_timezone = (empty($_SESSION[
"dol_tz_string"]) ? @date_default_timezone_get() : $_SESSION[
"dol_tz_string"]);
3172 $localtz =
new DateTimeZone($default_timezone);
3174 dol_syslog(
"Warning dol_tz_string contains an invalid value ".$_SESSION[
"dol_tz_string"], LOG_WARNING);
3175 $default_timezone = @date_default_timezone_get();
3177 } elseif (strrpos($gm,
"tz,") !==
false) {
3178 $timezone = str_replace(
"tz,",
"", $gm);
3180 $localtz =
new DateTimeZone($timezone);
3182 dol_syslog(
"Warning passed timezone contains an invalid value ".$timezone, LOG_WARNING);
3186 if (empty($localtz)) {
3187 $localtz =
new DateTimeZone(
'UTC');
3191 $dt =
new DateTime(
'now', $localtz);
3192 $dt->setDate((
int) $year, (
int) $month, (
int) $day);
3193 $dt->setTime((
int) $hour, (
int) $minute, (
int) $second);
3194 $date = $dt->getTimestamp();
3214 if ($mode ===
'auto') {
3218 if ($mode ==
'gmt') {
3220 } elseif ($mode ==
'tzserver') {
3221 require_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
3223 $ret = (int) (
dol_now(
'gmt') + ($tzsecond * 3600));
3229 } elseif ($mode ==
'tzuser' || $mode ==
'tzuserrel') {
3232 $offsettz = (empty($_SESSION[
'dol_tz']) ? 0 : $_SESSION[
'dol_tz']) * 60 * 60;
3233 $offsetdst = (empty($_SESSION[
'dol_dst']) ? 0 : $_SESSION[
'dol_dst']) * 60 * 60;
3234 $ret = (int) (
dol_now(
'gmt') + ($offsettz + $offsetdst));
3251 global $conf, $langs;
3254 if (!empty($conf->dol_optimize_smallscreen)) {
3259 if (empty($shortvalue) || $size < ($level * 10)) {
3261 $textunitshort = $langs->trans(
"b");
3262 $textunitlong = $langs->trans(
"Bytes");
3264 $ret = round($size / $level, 0);
3265 $textunitshort = $langs->trans(
"Kb");
3266 $textunitlong = $langs->trans(
"KiloBytes");
3269 if (empty($shortunit)) {
3270 $ret .=
' '.$textunitlong;
3272 $ret .=
' '.$textunitshort;
3288function dol_print_url($url, $target =
'_blank', $max = 32, $withpicto = 0, $morecss =
'')
3296 $linkstart =
'<a href="';
3297 if (!preg_match(
'/^http/i', $url)) {
3298 $linkstart .=
'http://';
3303 $linkstart .=
' target="'.$target.
'"';
3305 $linkstart .=
' title="'.$langs->trans(
"URL").
': '.$url.
'"';
3309 if (!preg_match(
'/^http/i', $url)) {
3316 if ($morecss ==
'float') {
3317 return '<div class="nospan'.($morecss ?
' '.$morecss :
'').
'" style="margin-right: 10px">'.($withpicto ?
img_picto($langs->trans(
"Url"),
'globe',
'class="paddingrightonly"') :
'').$link.
'</div>';
3319 return $linkstart.
'<span class="nospan'.($morecss ?
' '.$morecss :
'').
'" style="margin-right: 10px">'.($withpicto ?
img_picto(
'',
'globe',
'class="paddingrightonly"') :
'').$link.
'</span>'.$linkend;
3335function dol_print_email($email, $cid = 0, $socid = 0, $addlink = 0, $max = 64, $showinvalid = 1, $withpicto = 0)
3337 global $user, $langs, $hookmanager;
3348 if (empty($email)) {
3352 if (!empty($addlink)) {
3353 $newemail =
'<a class="paddingrightonly" style="text-overflow: ellipsis;" href="';
3354 if (!preg_match(
'/^mailto:/i', $email)) {
3355 $newemail .=
'mailto:';
3357 $newemail .= $email;
3360 $newemail .= ($withpicto ?
img_picto($langs->trans(
"EMail").
' : '.$email, (is_numeric($withpicto) ?
'email' : $withpicto),
'class="paddingrightonly"') :
'');
3363 $newemail .=
'</a>';
3365 $langs->load(
"errors");
3366 $newemail .=
img_warning($langs->trans(
"ErrorBadEMail", $email),
'',
'paddingrightonly');
3369 if (($cid || $socid) && isModEnabled(
'agenda') && $user->hasRight(
"agenda",
"myactions",
"create")) {
3371 $linktoaddaction =
'';
3373 $linktoaddaction =
'<a href="'.DOL_URL_ROOT.
'/comm/action/card.php?action=create&backtopage=1&actioncode='.urlencode($type).
'&contactid='.((int) $cid).
'&socid='.((int) $socid).
'">'.
img_object($langs->trans(
"AddAction"),
"calendar").
'</a>';
3375 if ($linktoaddaction) {
3376 $newemail =
'<div>'.$newemail.
' '.$linktoaddaction.
'</div>';
3380 $newemail = ($withpicto ?
img_picto($langs->trans(
"EMail").
' : '.$email, (is_numeric($withpicto) ?
'email' : $withpicto),
'class="paddingrightonly"') :
'').$newemail;
3383 $langs->load(
"errors");
3384 $newemail .=
img_warning($langs->trans(
"ErrorBadEMail", $email));
3394 $parameters = array(
'cid' => $cid,
'socid' => $socid,
'addlink' => $addlink,
'picto' => $withpicto);
3396 $reshook = $hookmanager->executeHooks(
'printEmail', $parameters, $email);
3400 $rep .= $hookmanager->resPrint;
3415 $socialnetworks = array();
3417 require_once DOL_DOCUMENT_ROOT.
'/core/lib/memory.lib.php';
3418 $cachekey =
'socialnetworks_' . $conf->entity;
3420 if (!is_null($dataretrieved)) {
3421 $socialnetworks = $dataretrieved;
3423 $sql =
"SELECT rowid, code, label, url, icon, active FROM ".MAIN_DB_PREFIX.
"c_socialnetworks";
3424 $sql .=
" WHERE entity=".$conf->entity;
3425 $resql = $db->query($sql);
3427 while ($obj = $db->fetch_object($resql)) {
3428 $socialnetworks[$obj->code] = array(
3429 'rowid' => $obj->rowid,
3430 'label' => $obj->label,
3432 'icon' => $obj->icon,
3433 'active' => $obj->active,
3440 return $socialnetworks;
3455 global $conf, $user, $langs;
3459 if (empty($value)) {
3463 if (!empty($type)) {
3464 $htmllink =
'<div class="divsocialnetwork inline-block valignmiddle">';
3466 $htmllink .=
'<span class="fab pictofixedwidth '.($dictsocialnetworks[$type][
'icon'] ? $dictsocialnetworks[$type][
'icon'] :
'fa-link').
'"></span>';
3467 if ($type ==
'skype') {
3469 $htmllink .=
' <a href="skype:';
3471 $htmllink .=
'?call" alt="'.$langs->trans(
"Call").
' '.$value.
'" title="'.
dol_escape_htmltag($langs->trans(
"Call").
' '.$value).
'">';
3472 $htmllink .=
'<img src="'.DOL_URL_ROOT.
'/theme/common/skype_callbutton.png" border="0">';
3473 $htmllink .=
'</a><a href="skype:';
3475 $htmllink .=
'?chat" alt="'.$langs->trans(
"Chat").
' '.$value.
'" title="'.
dol_escape_htmltag($langs->trans(
"Chat").
' '.$value).
'">';
3476 $htmllink .=
'<img class="paddingleft" src="'.DOL_URL_ROOT.
'/theme/common/skype_chatbutton.png" border="0">';
3477 $htmllink .=
'</a>';
3478 if (($cid || $socid) && isModEnabled(
'agenda') && $user->hasRight(
'agenda',
'myactions',
'create')) {
3479 $addlink =
'AC_SKYPE';
3482 $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>';
3484 $htmllink .= ($link ?
' '.$link :
'');
3487 $networkconstname =
'MAIN_INFO_SOCIETE_'.strtoupper($type).
'_URL';
3490 if (preg_match(
'/^https?:\/\//i', $link)) {
3491 $htmllink .=
'<a href="'.dol_sanitizeUrl($link, 0).
'" target="_blank" rel="noopener noreferrer">'.
dol_escape_htmltag($value).
'</a>';
3493 $htmllink .=
'<a href="'.dol_sanitizeUrl($link, 1).
'" target="_blank" rel="noopener noreferrer">'.
dol_escape_htmltag($value).
'</a>';
3495 } elseif (!empty($dictsocialnetworks[$type][
'url'])) {
3496 $tmpvirginurl = preg_replace(
'/\/?{socialid}/',
'', $dictsocialnetworks[$type][
'url']);
3497 if ($tmpvirginurl) {
3498 $value = preg_replace(
'/^www\.'.preg_quote($tmpvirginurl,
'/').
'\/?/',
'', $value);
3499 $value = preg_replace(
'/^'.preg_quote($tmpvirginurl,
'/').
'\/?/',
'', $value);
3501 $tmpvirginurl3 = preg_replace(
'/^https:\/\//i',
'https://www.', $tmpvirginurl);
3502 if ($tmpvirginurl3) {
3503 $value = preg_replace(
'/^www\.'.preg_quote($tmpvirginurl3,
'/').
'\/?/',
'', $value);
3504 $value = preg_replace(
'/^'.preg_quote($tmpvirginurl3,
'/').
'\/?/',
'', $value);
3507 $tmpvirginurl2 = preg_replace(
'/^https?:\/\//i',
'', $tmpvirginurl);
3508 if ($tmpvirginurl2) {
3509 $value = preg_replace(
'/^www\.'.preg_quote($tmpvirginurl2,
'/').
'\/?/',
'', $value);
3510 $value = preg_replace(
'/^'.preg_quote($tmpvirginurl2,
'/').
'\/?/',
'', $value);
3513 $link = str_replace(
'{socialid}', $value, $dictsocialnetworks[$type][
'url']);
3514 if (preg_match(
'/^https?:\/\//i', $link)) {
3515 $htmllink .=
'<a href="'.dol_sanitizeUrl($link, 0).
'" target="_blank" rel="noopener noreferrer">'.
dol_escape_htmltag($value).
'</a>';
3517 $htmllink .=
'<a href="'.dol_sanitizeUrl($link, 1).
'" target="_blank" rel="noopener noreferrer">'.
dol_escape_htmltag($value).
'</a>';
3523 $htmllink .=
'</div>';
3525 $langs->load(
"errors");
3526 $htmllink .=
img_warning($langs->trans(
"ErrorBadSocialNetworkValue", $value));
3544 if (empty($profID) || empty($profIDtype)) {
3547 if (empty($countrycode)) {
3548 $countrycode = $mysoc->country_code;
3550 $newProfID = $profID;
3551 $id = substr($profIDtype, -1);
3553 if (strtoupper($countrycode) ==
'FR') {
3557 if ($id == 1 &&
dol_strlen($newProfID) == 9) {
3559 $newProfID = substr($newProfID, 0, 3).
' '.substr($newProfID, 3, 3).
' '.substr($newProfID, 6, 3);
3561 if ($id == 2 &&
dol_strlen($newProfID) == 14) {
3563 $newProfID = substr($newProfID, 0, 3).
' '.substr($newProfID, 3, 3).
' '.substr($newProfID, 6, 3).
' '.substr($newProfID, 9, 5);
3565 if ($id == 3 &&
dol_strlen($newProfID) == 5) {
3567 $newProfID = substr($newProfID, 0, 2).
'.'.substr($newProfID, 2, 3);
3569 if ($profIDtype ===
'VAT' &&
dol_strlen($newProfID) == 13) {
3571 $newProfID = substr($newProfID, 0, 4).
' '.substr($newProfID, 4, 3).
' '.substr($newProfID, 7, 3).
' '.substr($newProfID, 10, 3);
3574 if (!empty($addcpButton)) {
3596function dol_print_phone($phone, $countrycode =
'', $cid = 0, $socid = 0, $addlink =
'', $separ =
" ", $withpicto =
'', $titlealt =
'', $adddivfloat = 0)
3598 global $conf, $user, $langs, $mysoc, $hookmanager;
3601 $phone = is_null($phone) ?
'' : preg_replace(
"/[\s.-]/",
"", trim($phone));
3602 if (empty($phone)) {
3606 $separ = $conf->global->MAIN_PHONE_SEPAR;
3608 if (empty($countrycode) && is_object($mysoc)) {
3609 $countrycode = $mysoc->country_code;
3613 if ($conf->dol_optimize_smallscreen) {
3618 if (strtoupper($countrycode) ==
"FR") {
3621 $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);
3623 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 2).$separ.substr($newphone, 5, 2);
3625 $newphone = substr($newphone, 0, 2).$separ.substr($newphone, 2, 3).$separ.substr($newphone, 5, 2).$separ.substr($newphone, 7, 2);
3627 $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);
3629 $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);
3631 $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);
3633 } elseif (strtoupper($countrycode) ==
"CA") {
3635 $newphone = ($separ !=
'' ?
'(' :
'').substr($newphone, 0, 3).($separ !=
'' ?
')' :
'').$separ.substr($newphone, 3, 3).($separ !=
'' ?
'-' :
'').substr($newphone, 6, 4);
3637 } elseif (strtoupper($countrycode) ==
"PT") {
3639 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 3);
3641 } elseif (strtoupper($countrycode) ==
"SR") {
3643 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3);
3645 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 4);
3647 } elseif (strtoupper($countrycode) ==
"DE") {
3649 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 4).$separ.substr($newphone, 7, 4).$separ.substr($newphone, 11, 3);
3651 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 4).$separ.substr($newphone, 10, 3);
3653 } elseif (strtoupper($countrycode) ==
"ES") {
3655 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 3);
3657 } elseif (strtoupper($countrycode) ==
"BF") {
3659 $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);
3661 } elseif (strtoupper($countrycode) ==
"RO") {
3663 $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);
3665 } elseif (strtoupper($countrycode) ==
"TR") {
3667 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 4);
3669 } elseif (strtoupper($countrycode) ==
"US") {
3671 $newphone = substr($newphone, 0, 2).$separ.substr($newphone, 2, 3).$separ.substr($newphone, 5, 3).$separ.substr($newphone, 8, 4);
3673 } elseif (strtoupper($countrycode) ==
"MX") {
3675 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 4).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 2);
3677 $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);
3679 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 4);
3681 } elseif (strtoupper($countrycode) ==
"ML") {
3683 $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);
3685 } elseif (strtoupper($countrycode) ==
"TH") {
3687 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 2).$separ.substr($newphone, 8, 3);
3689 $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);
3691 } elseif (strtoupper($countrycode) ==
"MU") {
3694 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 2).$separ.substr($newphone, 9, 2);
3696 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 4).$separ.substr($newphone, 8, 2).$separ.substr($newphone, 10, 2);
3698 } elseif (strtoupper($countrycode) ==
"ZA") {
3700 $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);
3702 } elseif (strtoupper($countrycode) ==
"SY") {
3704 $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);
3706 $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);
3708 } elseif (strtoupper($countrycode) ==
"AE") {
3710 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 2);
3712 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 3);
3714 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 4);
3716 } elseif (strtoupper($countrycode) ==
"DZ") {
3718 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 3).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 3);
3720 } elseif (strtoupper($countrycode) ==
"BE") {
3722 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 2).$separ.substr($newphone, 8, 3);
3724 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 3);
3726 } elseif (strtoupper($countrycode) ==
"PF") {
3728 $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);
3730 } elseif (strtoupper($countrycode) ==
"CO") {
3732 $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);
3734 } elseif (strtoupper($countrycode) ==
"JO") {
3736 $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);
3738 } elseif (strtoupper($countrycode) ==
"JM") {
3740 $newphone = substr($newphone, 0, 5).$separ.substr($newphone, 5, 3).$separ.substr($newphone, 8, 4);
3742 } elseif (strtoupper($countrycode) ==
"MG") {
3744 $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);
3746 } elseif (strtoupper($countrycode) ==
"GB") {
3748 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 4).$separ.substr($newphone, 7, 3).$separ.substr($newphone, 10, 3);
3750 } elseif (strtoupper($countrycode) ==
"CH") {
3752 $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);
3754 $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);
3756 } elseif (strtoupper($countrycode) ==
"TN") {
3758 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 2).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 3);
3760 } elseif (strtoupper($countrycode) ==
"GF") {
3762 $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);
3764 } elseif (strtoupper($countrycode) ==
"GP") {
3766 $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);
3768 } elseif (strtoupper($countrycode) ==
"MQ") {
3770 $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);
3772 } elseif (strtoupper($countrycode) ==
"IT") {
3774 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 3).$separ.substr($newphone, 6, 3).$separ.substr($newphone, 9, 3);
3776 $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);
3778 } elseif (strtoupper($countrycode) ==
"AU") {
3782 $newphone = substr($newphone, 0, 3).$separ.substr($newphone, 3, 1).$separ.substr($newphone, 4, 4).$separ.substr($newphone, 8, 4);
3784 } elseif (strtoupper($countrycode) ==
"LU") {
3787 $newphone = substr($newphone, 0, 4).$separ.substr($newphone, 4, 2).$separ.substr($newphone, 6, 2).$separ.substr($newphone, 8, 2);
3789 $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);
3791 $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);
3793 $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);
3797 $newphoneastart = $newphoneaend =
'';
3798 if (!empty($addlink)) {
3799 if ($addlink ==
'tel' || $conf->browser->layout ==
'phone' || (isModEnabled(
'clicktodial') &&
getDolGlobalString(
'CLICKTODIAL_USE_TEL_LINK_ON_PHONE_NUMBERS'))) {
3800 $newphoneastart =
'<a href="tel:'.$phone.
'">';
3801 $newphoneaend .=
'</a>';
3802 } elseif (isModEnabled(
'clicktodial') && $addlink ==
'AC_TEL') {
3803 if (empty($user->clicktodial_loaded)) {
3804 $user->fetch_clicktodial();
3808 $urlmask =
getDolGlobalString(
'CLICKTODIAL_URL',
'ErrorClickToDialModuleNotConfigured');
3809 if (!empty($user->clicktodial_url)) {
3810 $urlmask = $user->clicktodial_url;
3813 $clicktodial_poste = (!empty($user->clicktodial_poste) ? urlencode($user->clicktodial_poste) :
'');
3814 $clicktodial_login = (!empty($user->clicktodial_login) ? urlencode($user->clicktodial_login) :
'');
3815 $clicktodial_password = (!empty($user->clicktodial_password) ? urlencode($user->clicktodial_password) :
'');
3817 $url = sprintf($urlmask, urlencode($phone), $clicktodial_poste, $clicktodial_login, $clicktodial_password);
3819 $substitarray = array(
'__PHONEFROM__'=>$clicktodial_poste,
3820 '__PHONETO__'=>urlencode($phone),
3821 '__LOGIN__'=>$clicktodial_login,
3822 '__PASS__'=>$clicktodial_password);
3826 $newphoneastart =
'<a href="'.$url.
'" class="cssforclicktodial">';
3827 $newphoneaend =
'</a>';
3830 $newphoneastart =
'<a href="'.$url.
'"';
3832 $newphoneastart .=
' target="_blank" rel="noopener noreferrer"';
3834 $newphoneastart .=
'>';
3835 $newphoneaend .=
'</a>';
3840 if (isModEnabled(
'agenda') && $user->hasRight(
"agenda",
"myactions",
"create")) {
3842 $addlinktoagenda =
'';
3843 if ($addlink ==
'AC_FAX') {
3847 $addlinktoagenda =
'<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>';
3849 if ($addlinktoagenda) {
3850 $newphone =
'<span>'.$newphone.
' '.$addlinktoagenda.
'</span>';
3855 if (empty($titlealt)) {
3856 $titlealt = ($withpicto ==
'fax' ? $langs->trans(
"Fax") : $langs->trans(
"Phone"));
3861 $parameters = array(
'countrycode' => $countrycode,
'cid' => $cid,
'socid' => $socid,
'titlealt' => $titlealt,
'picto' => $withpicto);
3862 $reshook = $hookmanager->executeHooks(
'printPhone', $parameters, $phone);
3863 $rep .= $hookmanager->resPrint;
3865 if (empty($reshook)) {
3868 if ($withpicto ==
'fax') {
3869 $picto =
'phoning_fax';
3870 } elseif ($withpicto ==
'phone') {
3872 } elseif ($withpicto ==
'mobile') {
3873 $picto =
'phoning_mobile';
3878 if ($adddivfloat == 1) {
3879 $rep .=
'<div class="nospan float" style="margin-right: 10px">';
3880 } elseif (empty($adddivfloat)) {
3881 $rep .=
'<span style="margin-right: 10px;">';
3884 $rep .= $newphoneastart;
3885 $rep .= ($withpicto ?
img_picto($titlealt,
'object_'.$picto.
'.png') :
'');
3886 if ($separ !=
'hidenum') {
3887 $rep .= ($withpicto ?
' ' :
'').$newphone;
3889 $rep .= $newphoneaend;
3891 if ($adddivfloat == 1) {
3893 } elseif (empty($adddivfloat)) {
3921 if (file_exists(DOL_DOCUMENT_ROOT.
'/theme/common/flags/'.$countrycode.
'.png')) {
3922 $ret .=
' '.img_picto($countrycode.
' '.$langs->trans(
"AccordingToGeoIPDatabase"), DOL_URL_ROOT.
'/theme/common/flags/'.$countrycode.
'.png',
'', 1);
3924 $ret .=
' ('.$countrycode.
')';
3944 if (empty($_SERVER[
'HTTP_X_FORWARDED_FOR']) || preg_match(
'/[^0-9\.\:,\[\]]/', $_SERVER[
'HTTP_X_FORWARDED_FOR'])) {
3945 if (empty($_SERVER[
'HTTP_CLIENT_IP']) || preg_match(
'/[^0-9\.\:,\[\]]/', $_SERVER[
'HTTP_CLIENT_IP'])) {
3946 if (empty($_SERVER[
"HTTP_CF_CONNECTING_IP"])) {
3947 $ip = (empty($_SERVER[
'REMOTE_ADDR']) ?
'' : $_SERVER[
'REMOTE_ADDR']);
3949 $ip = $_SERVER[
"HTTP_CF_CONNECTING_IP"];
3952 $ip = $_SERVER[
'HTTP_CLIENT_IP'];
3955 $ip = $_SERVER[
'HTTP_X_FORWARDED_FOR'];
3971 if (isset($_SERVER[
'HTTPS']) && $_SERVER[
'HTTPS'] ==
'on') {
3973 } 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') {
3991 if (!empty($conf->geoipmaxmind->enabled)) {
3995 include_once DOL_DOCUMENT_ROOT.
'/core/class/dolgeoip.class.php';
3996 $geoip =
new DolGeoIP(
'country', $datafile);
3998 $countrycode = $geoip->getCountryCodeFromIP($ip);
4001 return $countrycode;
4013 global $conf, $langs, $user;
4017 if (!empty($conf->geoipmaxmind->enabled)) {
4022 include_once DOL_DOCUMENT_ROOT.
'/core/class/dolgeoip.class.php';
4023 $geoip =
new DolGeoIP(
'country', $datafile);
4024 $countrycode = $geoip->getCountryCodeFromIP($ip);
4025 $ret = $countrycode;
4044 global $conf, $user, $langs, $hookmanager;
4050 $parameters = array(
'element' => $element,
'id' => $id);
4051 $reshook = $hookmanager->executeHooks(
'printAddress', $parameters, $address);
4052 $out .= $hookmanager->resPrint;
4054 if (empty($reshook)) {
4055 if (empty($charfornl)) {
4056 $out .= nl2br($address);
4058 $out .= preg_replace(
'/[\r\n]+/', $charfornl, $address);
4062 $showgmap = $showomap = 0;
4063 if (($element ==
'thirdparty' || $element ==
'societe') && isModEnabled(
'google') &&
getDolGlobalString(
'GOOGLE_ENABLE_GMAPS')) {
4066 if ($element ==
'contact' && isModEnabled(
'google') &&
getDolGlobalString(
'GOOGLE_ENABLE_GMAPS_CONTACTS')) {
4069 if ($element ==
'member' && isModEnabled(
'google') &&
getDolGlobalString(
'GOOGLE_ENABLE_GMAPS_MEMBERS')) {
4072 if ($element ==
'user' && isModEnabled(
'google') &&
getDolGlobalString(
'GOOGLE_ENABLE_GMAPS_USERS')) {
4075 if (($element ==
'thirdparty' || $element ==
'societe') && isModEnabled(
'openstreetmap') &&
getDolGlobalString(
'OPENSTREETMAP_ENABLE_MAPS')) {
4078 if ($element ==
'contact' && isModEnabled(
'openstreetmap') &&
getDolGlobalString(
'OPENSTREETMAP_ENABLE_MAPS_CONTACTS')) {
4081 if ($element ==
'member' && isModEnabled(
'openstreetmap') &&
getDolGlobalString(
'OPENSTREETMAP_ENABLE_MAPS_MEMBERS')) {
4084 if ($element ==
'user' && isModEnabled(
'openstreetmap') &&
getDolGlobalString(
'OPENSTREETMAP_ENABLE_MAPS_USERS')) {
4088 $url =
dol_buildpath(
'/google/gmaps.php?mode='.$element.
'&id='.$id, 1);
4089 $out .=
' <a href="'.$url.
'" target="_gmaps"><img id="'.$htmlid.
'" class="valigntextbottom" src="'.DOL_URL_ROOT.
'/theme/common/gmap.png"></a>';
4092 $url =
dol_buildpath(
'/openstreetmap/maps.php?mode='.$element.
'&id='.$id, 1);
4093 $out .=
' <a href="'.$url.
'" target="_gmaps"><img id="'.$htmlid.
'_openstreetmap" class="valigntextbottom" src="'.DOL_URL_ROOT.
'/theme/common/gmap.png"></a>';
4114function isValidEmail($address, $acceptsupervisorkey = 0, $acceptuserkey = 0)
4116 if ($acceptsupervisorkey && $address ==
'__SUPERVISOREMAIL__') {
4119 if ($acceptuserkey && $address ==
'__USER_EMAIL__') {
4122 if (filter_var($address, FILTER_VALIDATE_EMAIL)) {
4139 if (function_exists(
'idn_to_ascii') && function_exists(
'checkdnsrr')) {
4140 if (!checkdnsrr(idn_to_ascii($domain),
'MX')) {
4143 if (function_exists(
'getmxrr')) {
4146 getmxrr(idn_to_ascii($domain), $mxhosts, $weight);
4147 if (count($mxhosts) > 1) {
4150 if (count($mxhosts) == 1 && !empty($mxhosts[0])) {
4187 $tmparray = explode(
' ', $s);
4188 foreach ($tmparray as $tmps) {
4205 if (is_null($string)) {
4209 if (function_exists(
'mb_strlen')) {
4210 return mb_strlen($string, $stringencoding);
4212 return strlen($string);
4226function dol_substr($string, $start, $length =
null, $stringencoding =
'', $trunconbytes = 0)
4230 if (empty($stringencoding)) {
4231 $stringencoding = $langs->charset_output;
4235 if (empty($trunconbytes)) {
4236 if (function_exists(
'mb_substr')) {
4237 $ret = mb_substr($string, $start, $length, $stringencoding);
4239 $ret = substr($string, $start, $length);
4242 if (function_exists(
'mb_strcut')) {
4243 $ret = mb_strcut($string, $start, $length, $stringencoding);
4245 $ret = substr($string, $start, $length);
4265function dol_trunc($string, $size = 40, $trunc =
'right', $stringencoding =
'UTF-8', $nodot = 0, $display = 0)
4273 if (empty($stringencoding)) {
4274 $stringencoding =
'UTF-8';
4277 if ($conf->dol_optimize_smallscreen == 1 && $display == 1) {
4278 $size = round($size / 3);
4282 if ($trunc ==
'right') {
4284 if (
dol_strlen($newstring, $stringencoding) > ($size + ($nodot ? 0 : 1))) {
4286 return dol_substr($newstring, 0, $size, $stringencoding).($nodot ?
'' :
'…');
4291 } elseif ($trunc ==
'middle') {
4293 if (
dol_strlen($newstring, $stringencoding) > 2 &&
dol_strlen($newstring, $stringencoding) > ($size + 1)) {
4294 $size1 = round($size / 2);
4295 $size2 = round($size / 2);
4296 return dol_substr($newstring, 0, $size1, $stringencoding).
'…'.
dol_substr($newstring,
dol_strlen($newstring, $stringencoding) - $size2, $size2, $stringencoding);
4300 } elseif ($trunc ==
'left') {
4302 if (
dol_strlen($newstring, $stringencoding) > ($size + ($nodot ? 0 : 1))) {
4304 return '…'.dol_substr($newstring,
dol_strlen($newstring, $stringencoding) - $size, $size, $stringencoding);
4308 } elseif ($trunc ==
'wrap') {
4310 if (
dol_strlen($newstring, $stringencoding) > ($size + 1)) {
4316 return 'BadParam3CallingDolTrunc';
4329 $type2picto = array(
4333 'int'=>
'sort-numeric-down',
4334 'double'=>
'sort-numeric-down',
4335 'price'=>
'currency',
4336 'pricecy'=>
'multicurrency',
4337 'password' =>
'key',
4338 'boolean'=>
'check-square',
4340 'datetime'=>
'calendar',
4346 'sellist' =>
'list',
4347 'radio' =>
'check-circle',
4348 'checkbox' =>
'check-square',
4349 'chkbxlst' =>
'check-square',
4351 'separate'=>
'minus'
4354 if (!empty($type2picto[$key])) {
4355 return img_picto(
'', $type2picto[$key],
'class="pictofixedwidth"');
4358 return img_picto(
'',
'generic',
'class="pictofixedwidth"');
4383function img_picto($titlealt, $picto, $moreatt =
'', $pictoisfullpath =
false, $srconly = 0, $notitle = 0, $alt =
'', $morecss =
'', $marginleftonlyshort = 2)
4385 global $conf, $langs;
4388 $url = DOL_URL_ROOT;
4389 $theme = isset($conf->theme) ? $conf->theme :
null;
4390 $path =
'theme/'.$theme;
4391 if (empty($picto)) {
4396 if ($pictoisfullpath) {
4398 if (!preg_match(
'/(\.png|\.gif|\.svg)$/i', $picto)) {
4401 $fullpathpicto = $picto;
4403 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
4404 $morecss .= ($morecss ?
' ' :
'').$reg[1];
4405 $moreatt = str_replace(
'class="'.$reg[1].
'"',
'', $moreatt);
4408 $pictowithouttext = preg_replace(
'/(\.png|\.gif|\.svg)$/',
'', (is_null($picto) ?
'' : $picto));
4409 $pictowithouttext = str_replace(
'object_',
'', $pictowithouttext);
4410 $pictowithouttext = str_replace(
'_nocolor',
'', $pictowithouttext);
4412 if (strpos($pictowithouttext,
'fontawesome_') === 0 || strpos($pictowithouttext,
'fa-') === 0) {
4414 $pictowithouttext = str_replace(
'fontawesome_',
'', $pictowithouttext);
4415 $pictowithouttext = str_replace(
'fa-',
'', $pictowithouttext);
4418 if ($pictowithouttext ==
'file-o') {
4419 $pictowithouttext =
'file';
4422 $pictowithouttextarray = explode(
'_', $pictowithouttext);
4423 $marginleftonlyshort = 0;
4425 if (!empty($pictowithouttextarray[1])) {
4427 $fakey =
'fa-'.$pictowithouttextarray[0];
4428 $faprefix = empty($pictowithouttextarray[1]) ?
'fas' : $pictowithouttextarray[1];
4429 $facolor = empty($pictowithouttextarray[2]) ?
'' : $pictowithouttextarray[2];
4430 $fasize = empty($pictowithouttextarray[3]) ?
'' : $pictowithouttextarray[3];
4432 $fakey =
'fa-'.$pictowithouttext;
4442 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
4443 $morecss .= ($morecss ?
' ' :
'').$reg[1];
4444 $moreatt = str_replace(
'class="'.$reg[1].
'"',
'', $moreatt);
4446 if (preg_match(
'/style="([^"]+)"/', $moreatt, $reg)) {
4447 $morestyle = $reg[1];
4448 $moreatt = str_replace(
'style="'.$reg[1].
'"',
'', $moreatt);
4450 $moreatt = trim($moreatt);
4452 $enabledisablehtml =
'<span class="'.$faprefix.
' '.$fakey.($marginleftonlyshort ? ($marginleftonlyshort == 1 ?
' marginleftonlyshort' :
' marginleftonly') :
'');
4453 $enabledisablehtml .= ($morecss ?
' '.$morecss :
'').
'" style="'.($fasize ? (
'font-size: '.$fasize.
';') :
'').($facolor ? (
' color: '.$facolor.
';') :
'').($morestyle ?
' '.$morestyle :
'').
'"'.(($notitle || empty($titlealt)) ?
'' :
' title="'.dol_escape_htmltag($titlealt).
'"').($moreatt ?
' '.$moreatt :
'').
'>';
4457 $enabledisablehtml .=
'</span>';
4459 return $enabledisablehtml;
4462 if (empty($srconly) && in_array($pictowithouttext, array(
4463 '1downarrow',
'1uparrow',
'1leftarrow',
'1rightarrow',
'1uparrow_selected',
'1downarrow_selected',
'1leftarrow_selected',
'1rightarrow_selected',
4464 'accountancy',
'accounting_account',
'account',
'accountline',
'action',
'add',
'address',
'angle-double-down',
'angle-double-up',
'asset',
4465 'bank_account',
'barcode',
'bank',
'bell',
'bill',
'billa',
'billr',
'billd',
'birthday-cake',
'bookmark',
'bom',
'briefcase-medical',
'bug',
'building',
4466 'card',
'calendarlist',
'calendar',
'calendarmonth',
'calendarweek',
'calendarday',
'calendarperuser',
'calendarpertype',
4467 'cash-register',
'category',
'chart',
'check',
'clock',
'clone',
'close_title',
'code',
'cog',
'collab',
'company',
'contact',
'country',
'contract',
'conversation',
'cron',
'cross',
'cubes',
4468 'check-circle',
'check-square',
'currency',
'multicurrency',
4469 'chevron-left',
'chevron-right',
'chevron-down',
'chevron-top',
'commercial',
'companies',
4470 'delete',
'dolly',
'dollyrevert',
'donation',
'download',
'dynamicprice',
4471 'edit',
'ellipsis-h',
'email',
'entity',
'envelope',
'eraser',
'establishment',
'expensereport',
'external-link-alt',
'external-link-square-alt',
'eye',
4472 'filter',
'file',
'file-o',
'file-code',
'file-export',
'file-import',
'file-upload',
'autofill',
'folder',
'folder-open',
'folder-plus',
'font',
4473 'gears',
'generate',
'generic',
'globe',
'globe-americas',
'graph',
'grip',
'grip_title',
'group',
4474 'hands-helping',
'help',
'holiday',
4475 'id-card',
'images',
'incoterm',
'info',
'intervention',
'inventory',
'intracommreport',
'jobprofile',
4476 'key',
'knowledgemanagement',
4477 'label',
'language',
'line',
'link',
'list',
'list-alt',
'listlight',
'loan',
'lock',
'lot',
'long-arrow-alt-right',
4478 'margin',
'map-marker-alt',
'member',
'meeting',
'minus',
'money-bill-alt',
'movement',
'mrp',
'note',
'next',
4479 'off',
'on',
'order',
4480 'paiment',
'paragraph',
'play',
'pdf',
'phone',
'phoning',
'phoning_mobile',
'phoning_fax',
'playdisabled',
'previous',
'poll',
'pos',
'printer',
'product',
'propal',
'proposal',
'puce',
4481 'stock',
'resize',
'service',
'stats',
4482 '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',
4483 'github',
'google',
'jabber',
'microsoft',
'skype',
'twitter',
'facebook',
'linkedin',
'instagram',
'snapchat',
'youtube',
'google-plus-g',
'whatsapp',
4484 'generic',
'home',
'hrm',
'members',
'products',
'invoicing',
4485 'partnership',
'payment',
'payment_vat',
'pencil-ruler',
'pictoconfirm',
'preview',
'project',
'projectpub',
'projecttask',
'question',
'refresh',
'region',
4486 'salary',
'shipment',
'state',
'supplier_invoice',
'supplier_invoicea',
'supplier_invoicer',
'supplier_invoiced',
4487 'technic',
'ticket',
4489 'recent',
'reception',
'recruitmentcandidature',
'recruitmentjobposition',
'replacement',
'resource',
'recurring',
'rss',
4490 'shapes',
'skill',
'square',
'sort-numeric-down',
'stop-circle',
'supplier',
'supplier_proposal',
'supplier_order',
'supplier_invoice',
4491 'tick',
'timespent',
'title_setup',
'title_accountancy',
'title_bank',
'title_hrm',
'title_agenda',
4492 'uncheck',
'url',
'user-cog',
'user-injured',
'user-md',
'vat',
'website',
'workstation',
'webhook',
'world',
'private',
4493 'conferenceorbooth',
'eventorganization',
4494 'stamp',
'signature'
4496 $fakey = $pictowithouttext;
4500 if (in_array($pictowithouttext, array(
'card',
'bell',
'clock',
'establishment',
'file',
'file-o',
'generic',
'minus-square',
'object_generic',
'pdf',
'plus-square',
'timespent',
'note',
'off',
'on',
'object_bookmark',
'bookmark',
'vcard'))) {
4503 if (in_array($pictowithouttext, array(
'black-tie',
'github',
'google',
'microsoft',
'skype',
'twitter',
'facebook',
'linkedin',
'instagram',
'snapchat',
'stripe',
'stripe-s',
'youtube',
'google-plus-g',
'whatsapp'))) {
4507 $arrayconvpictotofa = array(
4508 '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',
4509 'bank_account'=>
'university',
4510 'bill'=>
'file-invoice-dollar',
'billa'=>
'file-excel',
'billr'=>
'file-invoice-dollar',
'billd'=>
'file-medical',
4511 'supplier_invoice'=>
'file-invoice-dollar',
'supplier_invoicea'=>
'file-excel',
'supplier_invoicer'=>
'file-invoice-dollar',
'supplier_invoiced'=>
'file-medical',
4513 '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',
4514 'donation'=>
'file-alt',
'dynamicprice'=>
'hand-holding-usd',
4515 'setup'=>
'cog',
'companies'=>
'building',
'products'=>
'cube',
'commercial'=>
'suitcase',
'invoicing'=>
'coins',
4516 'accounting'=>
'search-dollar',
'category'=>
'tag',
'dollyrevert'=>
'dolly',
4517 'file-o'=>
'file',
'generate'=>
'plus-square',
'hrm'=>
'user-tie',
'incoterm'=>
'truck-loading',
4518 'margin'=>
'calculator',
'members'=>
'user-friends',
'ticket'=>
'ticket-alt',
'globe'=>
'external-link-alt',
'lot'=>
'barcode',
4519 'email'=>
'at',
'establishment'=>
'building',
'edit'=>
'pencil-alt',
'entity'=>
'globe',
4520 'graph'=>
'chart-line',
'grip_title'=>
'arrows-alt',
'grip'=>
'arrows-alt',
'help'=>
'question-circle',
4521 'generic'=>
'file',
'holiday'=>
'umbrella-beach',
4522 'info'=>
'info-circle',
'inventory'=>
'boxes',
'intracommreport'=>
'globe-europe',
'jobprofile'=>
'cogs',
4523 'knowledgemanagement'=>
'ticket-alt',
'label'=>
'layer-group',
'line'=>
'bars',
'loan'=>
'money-bill-alt',
4524 'member'=>
'user-alt',
'meeting'=>
'chalkboard-teacher',
'mrp'=>
'cubes',
'next'=>
'arrow-alt-circle-right',
4525 'trip'=>
'wallet',
'expensereport'=>
'wallet',
'group'=>
'users',
'movement'=>
'people-carry',
4526 'sign-out'=>
'sign-out-alt',
4527 'switch_off'=>
'toggle-off',
'switch_on'=>
'toggle-on',
'switch_on_warning'=>
'toggle-on',
'switch_on_red'=>
'toggle-on',
'check'=>
'check',
'bookmark'=>
'star',
4528 'bank'=>
'university',
'close_title'=>
'times',
'delete'=>
'trash',
'filter'=>
'filter',
4529 'list-alt'=>
'list-alt',
'calendarlist'=>
'bars',
'calendar'=>
'calendar-alt',
'calendarmonth'=>
'calendar-alt',
'calendarweek'=>
'calendar-week',
'calendarday'=>
'calendar-day',
'calendarperuser'=>
'table',
4530 'intervention'=>
'ambulance',
'invoice'=>
'file-invoice-dollar',
'order'=>
'file-invoice',
4531 'error'=>
'exclamation-triangle',
'warning'=>
'exclamation-triangle',
4533 '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',
4534 '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',
4535 'recent' =>
'check-square',
'reception'=>
'dolly',
'recruitmentjobposition'=>
'id-card-alt',
'recruitmentcandidature'=>
'id-badge',
4536 'resize'=>
'crop',
'supplier_order'=>
'dol-order_supplier',
'supplier_proposal'=>
'file-signature',
4537 'refresh'=>
'redo',
'region'=>
'map-marked',
'replacement'=>
'exchange-alt',
'resource'=>
'laptop-house',
'recurring'=>
'history',
4538 'service'=>
'concierge-bell',
4539 'skill'=>
'shapes',
'state'=>
'map-marked-alt',
'security'=>
'key',
'salary'=>
'wallet',
'shipment'=>
'dolly',
'stock'=>
'box-open',
'stats' =>
'chart-bar',
'split'=>
'code-branch',
'stripe'=>
'stripe-s',
4540 'supplier'=>
'building',
'technic'=>
'cogs',
4541 'timespent'=>
'clock',
'tick' =>
'check',
'title_setup'=>
'tools',
'title_accountancy'=>
'money-check-alt',
'title_bank'=>
'university',
'title_hrm'=>
'umbrella-beach',
4542 'title_agenda'=>
'calendar-alt',
4543 'uncheck'=>
'times',
'uparrow'=>
'share',
'url'=>
'external-link-alt',
'vat'=>
'money-check-alt',
'vcard'=>
'arrow-alt-circle-down',
4544 'jabber'=>
'comment-o',
4545 'website'=>
'globe-americas',
'workstation'=>
'pallet',
'webhook'=>
'bullseye',
'world'=>
'globe',
'private'=>
'user-lock',
4546 'conferenceorbooth'=>
'chalkboard-teacher',
'eventorganization'=>
'project-diagram'
4548 if ($conf->currency ==
'EUR') {
4549 $arrayconvpictotofa[
'currency'] =
'euro-sign';
4550 $arrayconvpictotofa[
'multicurrency'] =
'dollar-sign';
4552 $arrayconvpictotofa[
'currency'] =
'dollar-sign';
4553 $arrayconvpictotofa[
'multicurrency'] =
'euro-sign';
4555 if ($pictowithouttext ==
'off') {
4556 $fakey =
'fa-square';
4558 } elseif ($pictowithouttext ==
'on') {
4559 $fakey =
'fa-check-square';
4561 } elseif ($pictowithouttext ==
'listlight') {
4562 $fakey =
'fa-download';
4563 $marginleftonlyshort = 1;
4564 } elseif ($pictowithouttext ==
'printer') {
4565 $fakey =
'fa-print';
4567 } elseif ($pictowithouttext ==
'note') {
4568 $fakey =
'fa-sticky-note';
4569 $marginleftonlyshort = 1;
4570 } elseif (in_array($pictowithouttext, array(
'1uparrow',
'1downarrow',
'1leftarrow',
'1rightarrow',
'1uparrow_selected',
'1downarrow_selected',
'1leftarrow_selected',
'1rightarrow_selected'))) {
4571 $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');
4572 $fakey =
'fa-'.$convertarray[$pictowithouttext];
4573 if (preg_match(
'/selected/', $pictowithouttext)) {
4576 $marginleftonlyshort = 1;
4577 } elseif (!empty($arrayconvpictotofa[$pictowithouttext])) {
4578 $fakey =
'fa-'.$arrayconvpictotofa[$pictowithouttext];
4580 $fakey =
'fa-'.$pictowithouttext;
4583 if (in_array($pictowithouttext, array(
'dollyrevert',
'member',
'members',
'contract',
'group',
'resource',
'shipment'))) {
4584 $morecss .=
' em092';
4586 if (in_array($pictowithouttext, array(
'conferenceorbooth',
'collab',
'eventorganization',
'holiday',
'info',
'project',
'workstation'))) {
4587 $morecss .=
' em088';
4589 if (in_array($pictowithouttext, array(
'asset',
'intervention',
'payment',
'loan',
'partnership',
'stock',
'technic'))) {
4590 $morecss .=
' em080';
4594 $arrayconvpictotomarginleftonly = array(
4595 'bank',
'check',
'delete',
'generic',
'grip',
'grip_title',
'jabber',
4596 'grip_title',
'grip',
'listlight',
'note',
'on',
'off',
'playdisabled',
'printer',
'resize',
'sign-out',
'stats',
'switch_on',
'switch_on_red',
'switch_off',
4597 'uparrow',
'1uparrow',
'1downarrow',
'1leftarrow',
'1rightarrow',
'1uparrow_selected',
'1downarrow_selected',
'1leftarrow_selected',
'1rightarrow_selected'
4599 if (!isset($arrayconvpictotomarginleftonly[$pictowithouttext])) {
4600 $marginleftonlyshort = 0;
4604 $arrayconvpictotomorcess = array(
4605 'action'=>
'infobox-action',
'account'=>
'infobox-bank_account',
'accounting_account'=>
'infobox-bank_account',
'accountline'=>
'infobox-bank_account',
'accountancy'=>
'infobox-bank_account',
'asset'=>
'infobox-bank_account',
4606 'bank_account'=>
'infobox-bank_account',
4607 'bill'=>
'infobox-commande',
'billa'=>
'infobox-commande',
'billr'=>
'infobox-commande',
'billd'=>
'infobox-commande',
4608 'margin'=>
'infobox-bank_account',
'conferenceorbooth'=>
'infobox-project',
4609 'cash-register'=>
'infobox-bank_account',
'contract'=>
'infobox-contrat',
'check'=>
'font-status4',
'collab'=>
'infobox-action',
'conversation'=>
'infobox-contrat',
4610 'donation'=>
'infobox-commande',
'dolly'=>
'infobox-commande',
'dollyrevert'=>
'flip infobox-order_supplier',
4611 'ecm'=>
'infobox-action',
'eventorganization'=>
'infobox-project',
4612 'hrm'=>
'infobox-adherent',
'group'=>
'infobox-adherent',
'intervention'=>
'infobox-contrat',
4613 'incoterm'=>
'infobox-supplier_proposal',
4614 'currency'=>
'infobox-bank_account',
'multicurrency'=>
'infobox-bank_account',
4615 'members'=>
'infobox-adherent',
'member'=>
'infobox-adherent',
'money-bill-alt'=>
'infobox-bank_account',
4616 'order'=>
'infobox-commande',
4617 'user'=>
'infobox-adherent',
'users'=>
'infobox-adherent',
4618 'error'=>
'pictoerror',
'warning'=>
'pictowarning',
'switch_on'=>
'font-status4',
'switch_on_warning'=>
'font-status4 warning',
'switch_on_red'=>
'font-status8',
4619 'holiday'=>
'infobox-holiday',
'info'=>
'opacityhigh',
'invoice'=>
'infobox-commande',
4620 'knowledgemanagement'=>
'infobox-contrat rotate90',
'loan'=>
'infobox-bank_account',
4621 'payment'=>
'infobox-bank_account',
'payment_vat'=>
'infobox-bank_account',
'poll'=>
'infobox-adherent',
'pos'=>
'infobox-bank_account',
'project'=>
'infobox-project',
'projecttask'=>
'infobox-project',
4622 'propal'=>
'infobox-propal',
'proposal'=>
'infobox-propal',
'private'=>
'infobox-project',
4623 'reception'=>
'flip',
'recruitmentjobposition'=>
'infobox-adherent',
'recruitmentcandidature'=>
'infobox-adherent',
4624 'resource'=>
'infobox-action',
4625 'salary'=>
'infobox-bank_account',
'shapes'=>
'infobox-adherent',
'shipment'=>
'infobox-commande',
'supplier_invoice'=>
'infobox-order_supplier',
'supplier_invoicea'=>
'infobox-order_supplier',
'supplier_invoiced'=>
'infobox-order_supplier',
4626 'supplier'=>
'infobox-order_supplier',
'supplier_order'=>
'infobox-order_supplier',
'supplier_proposal'=>
'infobox-supplier_proposal',
4627 'ticket'=>
'infobox-contrat',
'title_accountancy'=>
'infobox-bank_account',
'title_hrm'=>
'infobox-holiday',
'expensereport'=>
'infobox-expensereport',
'trip'=>
'infobox-expensereport',
'title_agenda'=>
'infobox-action',
4628 'vat'=>
'infobox-bank_account',
4630 'list-alt'=>
'imgforviewmode',
'calendar'=>
'imgforviewmode',
'calendarweek'=>
'imgforviewmode',
'calendarmonth'=>
'imgforviewmode',
'calendarday'=>
'imgforviewmode',
'calendarperuser'=>
'imgforviewmode'
4632 if (!empty($arrayconvpictotomorcess[$pictowithouttext]) && strpos($picto,
'_nocolor') ===
false) {
4633 $morecss .= ($morecss ?
' ' :
'').$arrayconvpictotomorcess[$pictowithouttext];
4637 $arrayconvpictotocolor = array(
4638 'address'=>
'#6c6aa8',
'building'=>
'#6c6aa8',
'bom'=>
'#a69944',
4639 'clone'=>
'#999',
'cog'=>
'#999',
'companies'=>
'#6c6aa8',
'company'=>
'#6c6aa8',
'contact'=>
'#6c6aa8',
'cron'=>
'#555',
4640 'dynamicprice'=>
'#a69944',
4641 'edit'=>
'#444',
'note'=>
'#999',
'error'=>
'',
'help'=>
'#bbb',
'listlight'=>
'#999',
'language'=>
'#555',
4643 'lock'=>
'#ddd',
'lot'=>
'#a69944',
4644 'map-marker-alt'=>
'#aaa',
'mrp'=>
'#a69944',
'product'=>
'#a69944',
'service'=>
'#a69944',
'inventory'=>
'#a69944',
'stock'=>
'#a69944',
'movement'=>
'#a69944',
4645 'other'=>
'#ddd',
'world'=>
'#986c6a',
4646 'partnership'=>
'#6c6aa8',
'playdisabled'=>
'#ccc',
'printer'=>
'#444',
'projectpub'=>
'#986c6a',
'reception'=>
'#a69944',
'resize'=>
'#444',
'rss'=>
'#cba',
4648 'security'=>
'#999',
'square'=>
'#888',
'stop-circle'=>
'#888',
'stats'=>
'#444',
'switch_off'=>
'#999',
4649 'technic' =>
'#999',
'tick' =>
'#282',
'timespent' =>
'#555',
4650 'uncheck'=>
'#800',
'uparrow'=>
'#555',
'user-cog'=>
'#999',
'country'=>
'#aaa',
'globe-americas'=>
'#aaa',
'region'=>
'#aaa',
'state'=>
'#aaa',
4651 'website'=>
'#304',
'workstation'=>
'#a69944'
4653 if (isset($arrayconvpictotocolor[$pictowithouttext]) && strpos($picto,
'_nocolor') ===
false) {
4654 $facolor = $arrayconvpictotocolor[$pictowithouttext];
4661 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
4662 $morecss .= ($morecss ?
' ' :
'').$reg[1];
4663 $moreatt = str_replace(
'class="'.$reg[1].
'"',
'', $moreatt);
4665 if (preg_match(
'/style="([^"]+)"/', $moreatt, $reg)) {
4666 $morestyle = $reg[1];
4667 $moreatt = str_replace(
'style="'.$reg[1].
'"',
'', $moreatt);
4669 $moreatt = trim($moreatt);
4671 $enabledisablehtml =
'<span class="'.$fa.
' '.$fakey.($marginleftonlyshort ? ($marginleftonlyshort == 1 ?
' marginleftonlyshort' :
' marginleftonly') :
'');
4672 $enabledisablehtml .= ($morecss ?
' '.$morecss :
'').
'" style="'.($fasize ? (
'font-size: '.$fasize.
';') :
'').($facolor ? (
' color: '.$facolor.
';') :
'').($morestyle ?
' '.$morestyle :
'').
'"'.(($notitle || empty($titlealt)) ?
'' :
' title="'.dol_escape_htmltag($titlealt).
'"').($moreatt ?
' '.$moreatt :
'').
'>';
4676 $enabledisablehtml .=
'</span>';
4678 return $enabledisablehtml;
4685 } elseif (!empty($conf->modules_parts[
'theme']) && array_key_exists($theme, $conf->modules_parts[
'theme'])) {
4686 $path = $theme.
'/theme/'.$theme;
4691 if (preg_match(
'/^([^@]+)@([^@]+)$/i', $picto, $regs)) {
4697 if (!preg_match(
'/(\.png|\.gif|\.svg)$/i', $picto)) {
4702 foreach ($conf->file->dol_document_root as $type => $dirroot) {
4703 if ($type ==
'main') {
4707 if (file_exists($dirroot.
'/'.$path.
'/img/'.$picto)) {
4708 $url = DOL_URL_ROOT.$conf->file->dol_url_root[$type];
4714 $fullpathpicto = $url.
'/'.$path.
'/img/'.$picto;
4718 return $fullpathpicto;
4722 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 :
'').
'"').
'>';
4738function img_object($titlealt, $picto, $moreatt =
'', $pictoisfullpath =
false, $srconly = 0, $notitle = 0)
4740 if (strpos($picto,
'^') === 0) {
4741 return img_picto($titlealt, str_replace(
'^',
'', $picto), $moreatt, $pictoisfullpath, $srconly, $notitle);
4743 return img_picto($titlealt,
'object_'.$picto, $moreatt, $pictoisfullpath, $srconly, $notitle);
4758function img_weather($titlealt, $picto, $moreatt =
'', $pictoisfullpath = 0, $morecss =
'')
4762 if (is_numeric($picto)) {
4765 return '<i class="fa fa-weather-level'.$picto.
'"></i>';
4766 } elseif (!preg_match(
'/(\.png|\.gif)$/i', $picto)) {
4770 $path = DOL_URL_ROOT.
'/theme/'.$conf->theme.
'/img/weather/'.$picto;
4772 return img_picto($titlealt, $path, $moreatt, 1, 0, 0,
'', $morecss);
4790 if (!preg_match(
'/(\.png|\.gif)$/i', $picto)) {
4794 if ($pictoisfullpath) {
4797 $path = DOL_URL_ROOT.
'/theme/common/'.$picto;
4800 $themepath = DOL_DOCUMENT_ROOT.
'/theme/'.$conf->theme.
'/img/'.$picto;
4802 if (file_exists($themepath)) {
4808 return img_picto($titlealt, $path, $moreatt, 1, 0, $notitle);
4824function img_action($titlealt, $numaction, $picto =
'', $moreatt =
'')
4828 if (empty($titlealt) || $titlealt ==
'default') {
4829 if ($numaction ==
'-1' || $numaction ==
'ST_NO') {
4831 $titlealt = $langs->transnoentitiesnoconv(
'ChangeDoNotContact');
4832 } elseif ($numaction ==
'0' || $numaction ==
'ST_NEVER') {
4834 $titlealt = $langs->transnoentitiesnoconv(
'ChangeNeverContacted');
4835 } elseif ($numaction ==
'1' || $numaction ==
'ST_TODO') {
4837 $titlealt = $langs->transnoentitiesnoconv(
'ChangeToContact');
4838 } elseif ($numaction ==
'2' || $numaction ==
'ST_PEND') {
4840 $titlealt = $langs->transnoentitiesnoconv(
'ChangeContactInProcess');
4841 } elseif ($numaction ==
'3' || $numaction ==
'ST_DONE') {
4843 $titlealt = $langs->transnoentitiesnoconv(
'ChangeContactDone');
4845 $titlealt = $langs->transnoentitiesnoconv(
'ChangeStatus '.$numaction);
4849 if (!is_numeric($numaction)) {
4853 return img_picto($titlealt, (empty($picto) ?
'stcomm'.$numaction.
'.png' : $picto), $moreatt);
4867 if ($titlealt ==
'default') {
4868 $titlealt = $langs->trans(
'Show');
4871 return img_picto($titlealt,
'pdf'.$size.
'.png');
4885 if ($titlealt ==
'default') {
4886 $titlealt = $langs->trans(
'Add');
4889 return img_picto($titlealt,
'edit_add.png', $other);
4902 if ($titlealt ==
'default') {
4903 $titlealt = $langs->trans(
'Remove');
4906 return img_picto($titlealt,
'edit_remove.png', $other);
4917function img_edit($titlealt =
'default', $float = 0, $other =
'')
4921 if ($titlealt ==
'default') {
4922 $titlealt = $langs->trans(
'Modify');
4925 return img_picto($titlealt,
'edit.png', ($float ?
'style="float: '.($langs->tab_translate[
"DIRECTION"] ==
'rtl' ?
'left' :
'right').
'"' :
"").($other ?
' '.$other :
''));
4936function img_view($titlealt =
'default', $float = 0, $other =
'class="valignmiddle"')
4940 if ($titlealt ==
'default') {
4941 $titlealt = $langs->trans(
'View');
4944 $moreatt = ($float ?
'style="float: right" ' :
'').$other;
4946 return img_picto($titlealt,
'eye', $moreatt);
4957function img_delete($titlealt =
'default', $other =
'class="pictodelete"', $morecss =
'')
4961 if ($titlealt ==
'default') {
4962 $titlealt = $langs->trans(
'Delete');
4965 return img_picto($titlealt,
'delete.png', $other,
false, 0, 0,
'', $morecss);
4978 if ($titlealt ==
"default") {
4979 $titlealt = $langs->trans(
"Print");
4981 return img_picto($titlealt,
'printer.png', $other);
4991function img_split($titlealt =
'default', $other =
'class="pictosplit"')
4995 if ($titlealt ==
'default') {
4996 $titlealt = $langs->trans(
'Split');
4999 return img_picto($titlealt,
'split.png', $other);
5014 if (is_string($usealttitle)) {
5017 $usealttitle = $langs->trans(
'Info');
5021 return img_picto($usealttitle,
'info.png',
'style="vertical-align: middle;'.($usehelpcursor == 1 ?
' cursor: help' : ($usehelpcursor == 2 ?
' cursor: pointer' :
'')).
'"');
5034 if ($titlealt ==
'default') {
5035 $titlealt = $langs->trans(
'Informations');
5038 return img_picto($titlealt,
'info.png',
'style="vertical-align: middle;"');
5049function img_warning($titlealt =
'default', $moreatt =
'', $morecss =
'pictowarning')
5053 if ($titlealt ==
'default') {
5054 $titlealt = $langs->trans(
'Warning');
5058 return img_picto($titlealt,
'warning.png',
'class="'.$morecss.
'"'.($moreatt ? ($moreatt ==
'1' ?
' style="float: right"' :
' '.$moreatt) :
''));
5071 if ($titlealt ==
'default') {
5072 $titlealt = $langs->trans(
'Error');
5075 return img_picto($titlealt,
'error.png');
5089 if ($titlealt ==
'default') {
5090 $titlealt = $langs->trans(
'Next');
5094 return '<span class="fa fa-chevron-right paddingright paddingleft" title="'.dol_escape_htmltag($titlealt).
'"></span>';
5108 if ($titlealt ==
'default') {
5109 $titlealt = $langs->trans(
'Previous');
5113 return '<span class="fa fa-chevron-left paddingright paddingleft" title="'.dol_escape_htmltag($titlealt).
'"></span>';
5124function img_down($titlealt =
'default', $selected = 0, $moreclass =
'')
5128 if ($titlealt ==
'default') {
5129 $titlealt = $langs->trans(
'Down');
5132 return img_picto($titlealt, ($selected ?
'1downarrow_selected.png' :
'1downarrow.png'),
'class="imgdown'.($moreclass ?
" ".$moreclass :
"").
'"');
5143function img_up($titlealt =
'default', $selected = 0, $moreclass =
'')
5147 if ($titlealt ==
'default') {
5148 $titlealt = $langs->trans(
'Up');
5151 return img_picto($titlealt, ($selected ?
'1uparrow_selected.png' :
'1uparrow.png'),
'class="imgup'.($moreclass ?
" ".$moreclass :
"").
'"');
5162function img_left($titlealt =
'default', $selected = 0, $moreatt =
'')
5166 if ($titlealt ==
'default') {
5167 $titlealt = $langs->trans(
'Left');
5170 return img_picto($titlealt, ($selected ?
'1leftarrow_selected.png' :
'1leftarrow.png'), $moreatt);
5181function img_right($titlealt =
'default', $selected = 0, $moreatt =
'')
5185 if ($titlealt ==
'default') {
5186 $titlealt = $langs->trans(
'Right');
5189 return img_picto($titlealt, ($selected ?
'1rightarrow_selected.png' :
'1rightarrow.png'), $moreatt);
5203 if ($titlealt ==
'default') {
5204 $titlealt = $langs->trans(
'Active');
5208 return img_picto($titlealt,
'tick.png');
5223 if (is_null($morecss)) {
5227 if ($brand ==
'visa' || $brand ==
'Visa') {
5229 } elseif ($brand ==
'mastercard' || $brand ==
'MasterCard') {
5230 $brand =
'cc-mastercard';
5231 } elseif ($brand ==
'amex' || $brand ==
'American Express') {
5233 } elseif ($brand ==
'discover' || $brand ==
'Discover') {
5234 $brand =
'cc-discover';
5235 } elseif ($brand ==
'jcb' || $brand ==
'JCB') {
5237 } elseif ($brand ==
'diners' || $brand ==
'Diners club') {
5238 $brand =
'cc-diners-club';
5239 } elseif (!in_array($brand, array(
'cc-visa',
'cc-mastercard',
'cc-amex',
'cc-discover',
'cc-jcb',
'cc-diners-club'))) {
5240 $brand =
'credit-card';
5243 return '<span class="fa fa-'.$brand.
' fa-fw'.($morecss ?
' '.$morecss :
'').
'"></span>';
5256 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
5262 if (empty($titlealt)) {
5263 $titlealt =
'Mime type: '.$mimetype;
5267 return '<i class="fa fa-'.$mimefa.
' paddingright'.($morecss ?
' '.$morecss :
'').
'"'.($titlealt ?
' title="'.$titlealt.
'"' :
'').
'></i>';
5280 global $conf, $langs;
5282 if ($titlealt ==
'default') {
5283 $titlealt = $langs->trans(
'Search');
5286 $img =
img_picto($titlealt,
'search.png', $other,
false, 1);
5288 $input =
'<input type="image" class="liste_titre" name="button_search" src="'.$img.
'" ';
5289 $input .=
'value="'.dol_escape_htmltag($titlealt).
'" title="'.
dol_escape_htmltag($titlealt).
'" >';
5303 global $conf, $langs;
5305 if ($titlealt ==
'default') {
5306 $titlealt = $langs->trans(
'Search');
5309 $img =
img_picto($titlealt,
'searchclear.png', $other,
false, 1);
5311 $input =
'<input type="image" class="liste_titre" name="button_removefilter" src="'.$img.
'" ';
5312 $input .=
'value="'.dol_escape_htmltag($titlealt).
'" title="'.
dol_escape_htmltag($titlealt).
'" >';
5328function info_admin($text, $infoonimgalt = 0, $nodiv = 0, $admin =
'1', $morecss =
'hideonsmartphone', $textfordropdown =
'')
5330 global $conf, $langs;
5332 if ($infoonimgalt) {
5333 $result =
img_picto($text,
'info',
'class="'.($morecss ?
' '.$morecss :
'').
'"');
5335 if (empty($conf->use_javascript_ajax)) {
5336 $textfordropdown =
'';
5339 $class = (empty($admin) ?
'undefined' : ($admin ==
'1' ?
'info' : $admin));
5340 $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>');
5342 if ($textfordropdown) {
5343 $tmpresult =
'<span class="'.$class.
'text opacitymedium cursorpointer">'.$langs->trans($textfordropdown).
' '.
img_picto($langs->trans($textfordropdown),
'1downarrow').
'</span>';
5344 $tmpresult .=
'<script nonce="'.getNonce().
'" type="text/javascript">
5345 jQuery(document).ready(function() {
5346 jQuery(".'.$class.
'text").click(function() {
5347 console.log("toggle text");
5348 jQuery(".'.$class.
'").toggle();
5353 $result = $tmpresult.$result;
5374 global $conf, $langs, $argv;
5375 global $dolibarr_main_prod;
5382 require_once DOL_DOCUMENT_ROOT.
'/core/class/translate.class.php';
5384 $langs->load(
"main");
5388 $langs->loadLangs(array(
'main',
'errors'));
5390 if ($_SERVER[
'DOCUMENT_ROOT']) {
5391 $out .= $langs->trans(
"DolibarrHasDetectedError").
".<br>\n";
5393 $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";
5395 $out .= $langs->trans(
"InformationToHelpDiagnose").
":<br>\n";
5397 $out .=
"<b>".$langs->trans(
"Date").
":</b> ".
dol_print_date(time(),
'dayhourlog').
"<br>\n";
5398 $out .=
"<b>".$langs->trans(
"Dolibarr").
":</b> ".DOL_VERSION.
" - https://www.dolibarr.org<br>\n";
5399 if (isset($conf->global->MAIN_FEATURES_LEVEL)) {
5400 $out .=
"<b>".$langs->trans(
"LevelOfFeature").
":</b> ".
getDolGlobalInt(
'MAIN_FEATURES_LEVEL').
"<br>\n";
5402 if (function_exists(
"phpversion")) {
5403 $out .=
"<b>".$langs->trans(
"PHP").
":</b> ".phpversion().
"<br>\n";
5405 $out .=
"<b>".$langs->trans(
"Server").
":</b> ".(isset($_SERVER[
"SERVER_SOFTWARE"]) ?
dol_htmlentities($_SERVER[
"SERVER_SOFTWARE"], ENT_COMPAT) :
'').
"<br>\n";
5406 if (function_exists(
"php_uname")) {
5407 $out .=
"<b>".$langs->trans(
"OS").
":</b> ".php_uname().
"<br>\n";
5409 $out .=
"<b>".$langs->trans(
"UserAgent").
":</b> ".(isset($_SERVER[
"HTTP_USER_AGENT"]) ?
dol_htmlentities($_SERVER[
"HTTP_USER_AGENT"], ENT_COMPAT) :
'').
"<br>\n";
5411 $out .=
"<b>".$langs->trans(
"RequestedUrl").
":</b> ".
dol_htmlentities($_SERVER[
"REQUEST_URI"], ENT_COMPAT).
"<br>\n";
5412 $out .=
"<b>".$langs->trans(
"Referer").
":</b> ".(isset($_SERVER[
"HTTP_REFERER"]) ?
dol_htmlentities($_SERVER[
"HTTP_REFERER"], ENT_COMPAT) :
'').
"<br>\n";
5413 $out .=
"<b>".$langs->trans(
"MenuManager").
":</b> ".(isset($conf->standard_menu) ?
dol_htmlentities($conf->standard_menu, ENT_COMPAT) :
'').
"<br>\n";
5415 $syslog .=
"url=".dol_escape_htmltag($_SERVER[
"REQUEST_URI"]);
5416 $syslog .=
", query_string=".dol_escape_htmltag($_SERVER[
"QUERY_STRING"]);
5418 $out .=
'> '.$langs->transnoentities(
"ErrorInternalErrorDetected").
":\n".$argv[0].
"\n";
5419 $syslog .=
"pid=".dol_getmypid();
5422 if (!empty($conf->modules)) {
5423 $out .=
"<b>".$langs->trans(
"Modules").
":</b> ".join(
', ', $conf->modules).
"<br>\n";
5426 if (is_object($db)) {
5427 if ($_SERVER[
'DOCUMENT_ROOT']) {
5428 $out .=
"<b>".$langs->trans(
"DatabaseTypeManager").
":</b> ".$db->type.
"<br>\n";
5429 $lastqueryerror = $db->lastqueryerror();
5431 $lastqueryerror =
"SQL error string is not a valid UTF8 string. We can't show it.";
5433 $out .=
"<b>".$langs->trans(
"RequestLastAccessInError").
":</b> ".($lastqueryerror ?
dol_escape_htmltag($lastqueryerror) : $langs->trans(
"ErrorNoRequestInError")).
"<br>\n";
5434 $out .=
"<b>".$langs->trans(
"ReturnCodeLastAccessInError").
":</b> ".($db->lasterrno() ?
dol_escape_htmltag($db->lasterrno()) : $langs->trans(
"ErrorNoRequestInError")).
"<br>\n";
5435 $out .=
"<b>".$langs->trans(
"InformationLastAccessInError").
":</b> ".($db->lasterror() ?
dol_escape_htmltag($db->lasterror()) : $langs->trans(
"ErrorNoRequestInError")).
"<br>\n";
5439 $out .=
'> '.$langs->transnoentities(
"DatabaseTypeManager").
":\n".$db->type.
"\n";
5440 $out .=
'> '.$langs->transnoentities(
"RequestLastAccessInError").
":\n".($db->lastqueryerror() ? $db->lastqueryerror() : $langs->transnoentities(
"ErrorNoRequestInError")).
"\n";
5441 $out .=
'> '.$langs->transnoentities(
"ReturnCodeLastAccessInError").
":\n".($db->lasterrno() ? $db->lasterrno() : $langs->transnoentities(
"ErrorNoRequestInError")).
"\n";
5442 $out .=
'> '.$langs->transnoentities(
"InformationLastAccessInError").
":\n".($db->lasterror() ? $db->lasterror() : $langs->transnoentities(
"ErrorNoRequestInError")).
"\n";
5444 $syslog .=
", sql=".$db->lastquery();
5445 $syslog .=
", db_error=".$db->lasterror();
5448 if ($error || $errors) {
5449 $langs->load(
"errors");
5452 if (is_array($error) && is_array($errors)) {
5453 $errors = array_merge($error, $errors);
5454 } elseif (is_array($error)) {
5456 } elseif (is_array($errors)) {
5457 $errors = array_merge(array($error), $errors);
5459 $errors = array_merge(array($error), array($errors));
5462 foreach ($errors as $msg) {
5466 if ($_SERVER[
'DOCUMENT_ROOT']) {
5469 $out .=
'> '.$langs->transnoentities(
"Message").
":\n".$msg.
"\n";
5471 $syslog .=
", msg=".$msg;
5474 if (empty($dolibarr_main_prod) && $_SERVER[
'DOCUMENT_ROOT'] && function_exists(
'xdebug_print_function_stack') && function_exists(
'xdebug_call_file')) {
5475 xdebug_print_function_stack();
5476 $out .=
'<b>XDebug informations:</b>'.
"<br>\n";
5477 $out .=
'File: '.xdebug_call_file().
"<br>\n";
5478 $out .=
'Line: '.xdebug_call_line().
"<br>\n";
5479 $out .=
'Function: '.xdebug_call_function().
"<br>\n";
5484 if (!headers_sent()) {
5485 if (function_exists(
'top_httphead')) {
5489 http_response_code(202);
5492 if (empty($dolibarr_main_prod)) {
5495 if (empty($langs->defaultlang)) {
5496 $langs->setDefaultLang();
5498 $langs->loadLangs(array(
"main",
"errors"));
5500 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";
5501 print $langs->trans(
"DolibarrHasDetectedError").
'. ';
5502 print $langs->trans(
"YouCanSetOptionDolibarrMainProdToZero");
5503 if (!defined(
"MAIN_CORE_ERROR")) {
5504 define(
"MAIN_CORE_ERROR", 1);
5521function dol_print_error_email($prefixcode, $errormessage =
'', $errormessages = array(), $morecss =
'error', $email =
'')
5523 global $langs, $conf;
5525 if (empty($email)) {
5526 $email = $conf->global->MAIN_INFO_SOCIETE_MAIL;
5529 $langs->load(
"errors");
5532 print
'<br><div class="center login_main_message"><div class="'.$morecss.
'">';
5533 print $langs->trans(
"ErrorContactEMail", $email, $prefixcode.
'-'.
dol_print_date($now,
'%Y%m%d%H%M%S'));
5534 if ($errormessage) {
5535 print
'<br><br>'.$errormessage;
5537 if (is_array($errormessages) && count($errormessages)) {
5538 foreach ($errormessages as $mesgtoshow) {
5539 print
'<br><br>'.$mesgtoshow;
5542 print
'</div></div>';
5561function print_liste_field_titre($name, $file =
"", $field =
"", $begin =
"", $moreparam =
"", $moreattrib =
"", $sortfield =
"", $sortorder =
"", $prefix =
"", $tooltip =
"", $forcenowrapcolumntitle = 0)
5563 print
getTitleFieldOfList($name, 0, $file, $field, $begin, $moreparam, $moreattrib, $sortfield, $sortorder, $prefix, 0, $tooltip, $forcenowrapcolumntitle);
5584function getTitleFieldOfList($name, $thead = 0, $file =
"", $field =
"", $begin =
"", $moreparam =
"", $moreattrib =
"", $sortfield =
"", $sortorder =
"", $prefix =
"", $disablesortlink = 0, $tooltip =
'', $forcenowrapcolumntitle = 0)
5586 global $conf, $langs, $form;
5589 if ($moreattrib ==
'class="right"') {
5590 $prefix .=
'right ';
5593 $sortorder = strtoupper($sortorder);
5602 $tmpsortfield = explode(
',', $sortfield);
5603 $sortfield1 = trim($tmpsortfield[0]);
5604 $tmpfield = explode(
',', $field);
5605 $field1 = trim($tmpfield[0]);
5607 if (!
getDolGlobalString(
'MAIN_DISABLE_WRAPPING_ON_COLUMN_TITLE') && empty($forcenowrapcolumntitle)) {
5608 $prefix =
'wrapcolumntitle '.$prefix;
5614 $liste_titre =
'liste_titre';
5615 if ($field1 && ($sortfield1 == $field1 || $sortfield1 == preg_replace(
"/^[^\.]+\./",
"", $field1))) {
5616 $liste_titre =
'liste_titre_sel';
5619 $tagstart =
'<'.$tag.
' class="'.$prefix.$liste_titre.
'" '.$moreattrib;
5624 if (empty($thead) && $field && empty($disablesortlink)) {
5625 $options = preg_replace(
'/sortfield=([a-zA-Z0-9,\s\.]+)/i',
'', (is_scalar($moreparam) ? $moreparam :
''));
5626 $options = preg_replace(
'/sortorder=([a-zA-Z0-9,\s\.]+)/i',
'', $options);
5627 $options = preg_replace(
'/&+/i',
'&', $options);
5628 if (!preg_match(
'/^&/', $options)) {
5629 $options =
'&'.$options;
5632 $sortordertouseinlink =
'';
5633 if ($field1 != $sortfield1) {
5634 if (preg_match(
'/^DESC/i', $sortorder)) {
5635 $sortordertouseinlink .= str_repeat(
'desc,', count(explode(
',', $field)));
5637 $sortordertouseinlink .= str_repeat(
'asc,', count(explode(
',', $field)));
5640 if (preg_match(
'/^ASC/i', $sortorder)) {
5641 $sortordertouseinlink .= str_repeat(
'desc,', count(explode(
',', $field)));
5643 $sortordertouseinlink .= str_repeat(
'asc,', count(explode(
',', $field)));
5646 $sortordertouseinlink = preg_replace(
'/,$/',
'', $sortordertouseinlink);
5647 $out .=
'<a class="reposition" href="'.$file.
'?sortfield='.$field.
'&sortorder='.$sortordertouseinlink.
'&begin='.$begin.$options.
'"';
5653 if (preg_match(
'/:\w+$/', $tooltip)) {
5654 $tmptooltip = explode(
':', $tooltip);
5656 $tmptooltip = array($tooltip);
5658 $out .= $form->textwithpicto($langs->trans($name), $langs->trans($tmptooltip[0]), 1,
'help',
'', 0, 3, (empty($tmptooltip[1]) ?
'' :
'extra_'.str_replace(
'.',
'_', $field).
'_'.$tmptooltip[1]));
5660 $out .= $langs->trans($name);
5663 if (empty($thead) && $field && empty($disablesortlink)) {
5667 if (empty($thead) && $field) {
5668 $options = preg_replace(
'/sortfield=([a-zA-Z0-9,\s\.]+)/i',
'', (is_scalar($moreparam) ? $moreparam :
''));
5669 $options = preg_replace(
'/sortorder=([a-zA-Z0-9,\s\.]+)/i',
'', $options);
5670 $options = preg_replace(
'/&+/i',
'&', $options);
5671 if (!preg_match(
'/^&/', $options)) {
5672 $options =
'&'.$options;
5675 if (!$sortorder || ($field1 != $sortfield1)) {
5679 if (preg_match(
'/^DESC/', $sortorder)) {
5682 $sortimg .=
'<span class="nowrap">'.img_up(
"Z-A", 0,
'paddingright').
'</span>';
5684 if (preg_match(
'/^ASC/', $sortorder)) {
5687 $sortimg .=
'<span class="nowrap">'.img_down(
"A-Z", 0,
'paddingright').
'</span>';
5692 $tagend =
'</'.$tag.
'>';
5694 $out = $tagstart.$sortimg.$out.$tagend;
5709 dol_syslog(__FUNCTION__.
" is deprecated", LOG_WARNING);
5711 print
'<div class="titre">'.$title.
'</div>';
5743function load_fiche_titre($titre, $morehtmlright =
'', $picto =
'generic', $pictoisfullpath = 0, $id =
'', $morecssontable =
'', $morehtmlcenter =
'')
5749 if ($picto ==
'setup') {
5754 $return .=
'<table '.($id ?
'id="'.$id.
'" ' :
'').
'class="centpercent notopnoleftnoright table-fiche-title'.($morecssontable ?
' '.$morecssontable :
'').
'">';
5755 $return .=
'<tr class="titre">';
5757 $return .=
'<td class="nobordernopadding widthpictotitle valignmiddle col-picto">'.img_picto(
'', $picto,
'class="valignmiddle widthpictotitle pictotitle"', $pictoisfullpath).
'</td>';
5759 $return .=
'<td class="nobordernopadding valignmiddle col-title">';
5760 $return .=
'<div class="titre inline-block">'.$titre.
'</div>';
5763 $return .=
'<td class="nobordernopadding center valignmiddle col-center">'.$morehtmlcenter.
'</td>';
5766 $return .=
'<td class="nobordernopadding titre_right wordbreakimp right valignmiddle col-right">'.$morehtmlright.
'</td>';
5768 $return .=
'</tr></table>'.
"\n";
5796function 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 =
'')
5801 $savtotalnboflines = $totalnboflines;
5802 $totalnboflines = abs((
int) $totalnboflines);
5804 $page = (int) $page;
5806 if ($picto ==
'setup') {
5807 $picto =
'title_setup.png';
5809 if (($conf->browser->name ==
'ie') && $picto ==
'generic') {
5810 $picto =
'title.gif';
5813 $limit = $conf->liste_limit;
5816 if ($savlimit != 0 && (($num > $limit) || ($num == -1) || ($limit == 0))) {
5824 print
"<!-- Begin title -->\n";
5825 print
'<table class="centpercent notopnoleftnoright table-fiche-title'.($morecss ?
' '.$morecss :
'').
'"><tr>';
5829 if ($picto && $titre) {
5830 print
'<td class="nobordernopadding widthpictotitle valignmiddle col-picto">'.img_picto(
'', $picto,
'class="valignmiddle pictotitle widthpictotitle"', $pictoisfullpath).
'</td>';
5833 print
'<td class="nobordernopadding valignmiddle col-title">';
5834 print
'<div class="titre inline-block">'.$titre;
5835 if (!empty($titre) && $savtotalnboflines >= 0 && (
string) $savtotalnboflines !=
'') {
5836 print
'<span class="opacitymedium colorblack paddingleft">('.$totalnboflines.
')</span>';
5838 print
'</div></td>';
5841 if ($morehtmlcenter && empty($conf->dol_optimize_smallscreen)) {
5842 print
'<td class="nobordernopadding center valignmiddle col-center">'.$morehtmlcenter.
'</td>';
5846 print
'<td class="nobordernopadding valignmiddle right col-right">';
5847 print
'<input type="hidden" name="pageplusoneold" value="'.((int) $page + 1).
'">';
5849 $options .=
"&sortfield=".urlencode($sortfield);
5852 $options .=
"&sortorder=".urlencode($sortorder);
5856 if ($savlimit != 0 && ($page > 0 || $num > $limit)) {
5857 if ($totalnboflines) {
5859 $maxnbofpage = (empty($conf->dol_optimize_smallscreen) ? 4 : 0);
5862 $nbpages = ceil($totalnboflines / $limit);
5866 $cpt = ($page - $maxnbofpage);
5872 if (empty($pagenavastextinput)) {
5873 $pagelist .=
'<li class="pagination"><a class="reposition" href="'.$file.
'?page=0'.$options.
'">1</a></li>';
5875 $pagelist .=
'<li class="pagination"><span class="inactive">...</span></li>';
5876 } elseif ($cpt == 2) {
5877 $pagelist .=
'<li class="pagination"><a class="reposition" href="'.$file.
'?page=1'.$options.
'">2</a></li>';
5883 if ($pagenavastextinput) {
5884 if ($cpt == $page) {
5885 $pagelist .=
'<li class="pagination"><input type="text" class="'.($totalnboflines > 100 ?
'width40' :
'width25').
' center pageplusone" name="pageplusone" value="'.($page + 1).
'"></li>';
5889 if ($cpt == $page) {
5890 $pagelist .=
'<li class="pagination"><span class="active">'.($page + 1).
'</span></li>';
5892 $pagelist .=
'<li class="pagination"><a class="reposition" href="'.$file.
'?page='.$cpt.$options.
'">'.($cpt + 1).
'</a></li>';
5896 }
while ($cpt < $nbpages && $cpt <= ($page + $maxnbofpage));
5898 if (empty($pagenavastextinput)) {
5899 if ($cpt < $nbpages) {
5900 if ($cpt < $nbpages - 2) {
5901 $pagelist .=
'<li class="pagination"><span class="inactive">...</span></li>';
5902 } elseif ($cpt == $nbpages - 2) {
5903 $pagelist .=
'<li class="pagination"><a class="reposition" href="'.$file.
'?page='.($nbpages - 2).$options.
'">'.($nbpages - 1).
'</a></li>';
5905 $pagelist .=
'<li class="pagination"><a class="reposition" href="'.$file.
'?page='.($nbpages - 1).$options.
'">'.$nbpages.
'</a></li>';
5909 $pagelist .=
'<li class="pagination paginationlastpage"><a class="reposition" href="'.$file.
'?page='.($nbpages - 1).$options.
'">'.$nbpages.
'</a></li>';
5912 $pagelist .=
'<li class="pagination"><span class="active">'.($page + 1).
"</li>";
5916 if ($savlimit || $morehtmlright || $morehtmlrightbeforearrow) {
5917 print_fleche_navigation($page, $file, $options, $nextpage, $pagelist, $morehtmlright, $savlimit, $totalnboflines, $hideselectlimit, $morehtmlrightbeforearrow, $hidenavigation);
5921 if ($pagenavastextinput) {
5928 print
'</table>'.
"\n";
5931 if ($morehtmlcenter && !empty($conf->dol_optimize_smallscreen)) {
5932 print
'<div class="nobordernopadding marginbottomonly center valignmiddle col-center centpercent">'.$morehtmlcenter.
'</div>';
5935 print
"<!-- End title -->\n\n";
5954function print_fleche_navigation($page, $file, $options =
'', $nextpage = 0, $betweenarrows =
'', $afterarrows =
'', $limit = -1, $totalnboflines = 0, $hideselectlimit = 0, $beforearrows =
'', $hidenavigation = 0)
5956 global $conf, $langs;
5958 print
'<div class="pagination"><ul>';
5959 if ($beforearrows) {
5960 print
'<li class="paginationbeforearrows">';
5961 print $beforearrows;
5965 if (empty($hidenavigation)) {
5966 if ((
int) $limit > 0 && empty($hideselectlimit)) {
5967 $pagesizechoices =
'10:10,15:15,20:20,30:30,40:40,50:50,100:100,250:250,500:500,1000:1000';
5968 $pagesizechoices .=
',5000:5000,10000:10000,20000:20000';
5972 $pagesizechoices = $conf->global->MAIN_PAGESIZE_CHOICES;
5975 print
'<li class="pagination">';
5976 print
'<select class="flat selectlimit" name="limit" title="'.dol_escape_htmltag($langs->trans(
"MaxNbOfRecordPerPage")).
'">';
5977 $tmpchoice = explode(
',', $pagesizechoices);
5978 $tmpkey = $limit.
':'.$limit;
5979 if (!in_array($tmpkey, $tmpchoice)) {
5980 $tmpchoice[] = $tmpkey;
5982 $tmpkey = $conf->liste_limit.
':'.$conf->liste_limit;
5983 if (!in_array($tmpkey, $tmpchoice)) {
5984 $tmpchoice[] = $tmpkey;
5986 asort($tmpchoice, SORT_NUMERIC);
5987 foreach ($tmpchoice as $val) {
5989 $tmp = explode(
':', $val);
5992 if ($key !=
'' && $val !=
'') {
5993 if ((
int) $key == (
int) $limit) {
5994 $selected =
' selected="selected"';
5996 print
'<option name="'.$key.
'"'.$selected.
'>'.
dol_escape_htmltag($val).
'</option>'.
"\n";
6000 if ($conf->use_javascript_ajax) {
6001 print
'<!-- JS CODE TO ENABLE select limit to launch submit of page -->
6003 jQuery(document).ready(function () {
6004 jQuery(".selectlimit").change(function() {
6005 console.log("Change limit. Send submit");
6006 $(this).parents(\'form:first\').submit();
6015 print
'<li class="pagination paginationpage paginationpageleft"><a class="paginationprevious reposition" href="'.$file.
'?page='.($page - 1).$options.
'"><i class="fa fa-chevron-left" title="'.
dol_escape_htmltag($langs->trans(
"Previous")).
'"></i></a></li>';
6017 if ($betweenarrows) {
6018 print
'<!--<div class="betweenarrows nowraponall inline-block">-->';
6019 print $betweenarrows;
6020 print
'<!--</div>-->';
6022 if ($nextpage > 0) {
6023 print
'<li class="pagination paginationpage paginationpageright"><a class="paginationnext reposition" href="'.$file.
'?page='.($page + 1).$options.
'"><i class="fa fa-chevron-right" title="'.
dol_escape_htmltag($langs->trans(
"Next")).
'"></i></a></li>';
6026 print
'<li class="paginationafterarrows">';
6031 print
'</ul></div>'.
"\n";
6046function vatrate($rate, $addpercent =
false, $info_bits = 0, $usestarfornpr = 0, $html = 0)
6050 if (preg_match(
'/%/', $rate)) {
6051 $rate = str_replace(
'%',
'', $rate);
6055 if (preg_match(
'/\((.*)\)/', $rate, $reg)) {
6056 $morelabel =
' ('.$reg[1].
')';
6057 $rate = preg_replace(
'/\s*'.preg_quote($morelabel,
'/').
'/',
'', $rate);
6058 $morelabel =
' '.($html ?
'<span class="opacitymedium">' :
'').
'('.$reg[1].
')'.($html ?
'</span>' :
'');
6060 if (preg_match(
'/\*/', $rate)) {
6061 $rate = str_replace(
'*',
'', $rate);
6066 if (!preg_match(
'/\//', $rate)) {
6067 $ret =
price($rate, 0,
'', 0, 0).($addpercent ?
'%' :
'');
6070 $ret = $rate.($addpercent ?
'%' :
'');
6072 if (($info_bits & 1) && $usestarfornpr >= 0) {
6095function price($amount, $form = 0, $outlangs =
'', $trunc = 1, $rounding = -1, $forcerounding = -1, $currency_code =
'')
6097 global $langs, $conf;
6100 if (empty($amount)) {
6103 $amount = (is_numeric($amount) ? $amount : 0);
6104 if ($rounding == -1) {
6107 $nbdecimal = $rounding;
6109 if ($outlangs ===
'none') {
6119 if (!is_object($outlangs)) {
6123 if ($outlangs->transnoentitiesnoconv(
"SeparatorDecimal") !=
"SeparatorDecimal") {
6124 $dec = $outlangs->transnoentitiesnoconv(
"SeparatorDecimal");
6126 if ($outlangs->transnoentitiesnoconv(
"SeparatorThousand") !=
"SeparatorThousand") {
6127 $thousand = $outlangs->transnoentitiesnoconv(
"SeparatorThousand");
6129 if ($thousand ==
'None') {
6131 } elseif ($thousand ==
'Space') {
6138 $amount = str_replace(
',',
'.', $amount);
6140 $datas = explode(
'.', $amount);
6141 $decpart = isset($datas[1]) ? $datas[1] :
'';
6142 $decpart = preg_replace(
'/0+$/i',
'', $decpart);
6152 $nbdecimalmaxshown = (int) str_replace(
'...',
'',
getDolGlobalString(
'MAIN_MAX_DECIMALS_SHOWN'));
6153 if ($trunc && $nbdecimal > $nbdecimalmaxshown) {
6154 $nbdecimal = $nbdecimalmaxshown;
6162 if ((
string) $forcerounding !=
'-1') {
6163 if ($forcerounding ===
'MU') {
6165 } elseif ($forcerounding ===
'MT') {
6167 } elseif ($forcerounding >= 0) {
6168 $nbdecimal = $forcerounding;
6173 $output = number_format($amount, $nbdecimal, $dec, $thousand);
6175 $output = preg_replace(
'/\s/',
' ', $output);
6176 $output = preg_replace(
'/\'/',
''', $output);
6179 $cursymbolbefore = $cursymbolafter =
'';
6180 if ($currency_code && is_object($outlangs)) {
6181 if ($currency_code ==
'auto') {
6182 $currency_code = $conf->currency;
6185 $listofcurrenciesbefore = array(
'AUD',
'CAD',
'CNY',
'COP',
'CLP',
'GBP',
'HKD',
'MXN',
'PEN',
'USD',
'CRC',
'ZAR');
6186 $listoflanguagesbefore = array(
'nl_NL');
6187 if (in_array($currency_code, $listofcurrenciesbefore) || in_array($outlangs->defaultlang, $listoflanguagesbefore)) {
6188 $cursymbolbefore .= $outlangs->getCurrencySymbol($currency_code);
6190 $tmpcur = $outlangs->getCurrencySymbol($currency_code);
6191 $cursymbolafter .= ($tmpcur == $currency_code ?
' '.$tmpcur : $tmpcur);
6194 $output = $cursymbolbefore.$output.$end.($cursymbolafter ?
' ' :
'').$cursymbolafter;
6225 global $langs, $conf;
6228 if (is_null($amount)) {
6237 if (is_null($langs)) {
6241 if ($langs->transnoentitiesnoconv(
"SeparatorDecimal") !=
"SeparatorDecimal") {
6242 $dec = $langs->transnoentitiesnoconv(
"SeparatorDecimal");
6244 if ($langs->transnoentitiesnoconv(
"SeparatorThousand") !=
"SeparatorThousand") {
6245 $thousand = $langs->transnoentitiesnoconv(
"SeparatorThousand");
6248 if ($thousand ==
'None') {
6250 } elseif ($thousand ==
'Space') {
6258 if (!is_numeric($amount)) {
6259 $amount = preg_replace(
'/[a-zA-Z\/\\\*\(\)<>\_]/',
'', $amount);
6262 if ($option == 2 && $thousand ==
'.' && preg_match(
'/\.(\d\d\d)$/', (
string) $amount)) {
6263 $amount = str_replace($thousand,
'', $amount);
6269 if (is_numeric($amount)) {
6271 $temps = sprintf(
"%0.10F", $amount - intval($amount));
6272 $temps = preg_replace(
'/([\.1-9])0+$/',
'\\1', $temps);
6274 $amount = number_format($amount, $nbofdec, $dec, $thousand);
6279 if ($thousand !=
',' && $thousand !=
'.') {
6280 $amount = str_replace(
',',
'.', $amount);
6283 $amount = str_replace(
' ',
'', $amount);
6284 $amount = str_replace($thousand,
'', $amount);
6285 $amount = str_replace($dec,
'.', $amount);
6287 $amount = preg_replace(
'/[^0-9\-\.]/',
'', $amount);
6293 $nbofdectoround =
'';
6294 if ($rounding ==
'MU') {
6295 $nbofdectoround = $conf->global->MAIN_MAX_DECIMALS_UNIT;
6296 } elseif ($rounding ==
'MT') {
6297 $nbofdectoround = $conf->global->MAIN_MAX_DECIMALS_TOT;
6298 } elseif ($rounding ==
'MS') {
6299 $nbofdectoround = isset($conf->global->MAIN_MAX_DECIMALS_STOCK) ? $conf->global->MAIN_MAX_DECIMALS_STOCK : 5;
6300 } elseif ($rounding ==
'CU') {
6302 } elseif ($rounding ==
'CT') {
6304 } elseif (is_numeric($rounding)) {
6305 $nbofdectoround = (int) $rounding;
6310 $amount = round(is_string($amount) ? (
float) $amount : $amount, $nbofdectoround);
6312 return 'ErrorBadParameterProvidedToFunction';
6318 if (is_numeric($amount)) {
6320 $temps = sprintf(
"%0.10F", $amount - intval($amount));
6321 $temps = preg_replace(
'/([\.1-9])0+$/',
'\\1', $temps);
6323 $amount = number_format($amount, min($nbofdec, $nbofdectoround), $dec, $thousand);
6329 if ($thousand !=
',' && $thousand !=
'.') {
6330 $amount = str_replace(
',',
'.', $amount);
6333 $amount = str_replace(
' ',
'', $amount);
6334 $amount = str_replace($thousand,
'', $amount);
6335 $amount = str_replace($dec,
'.', $amount);
6337 $amount = preg_replace(
'/[^0-9\-\.]/',
'', $amount);
6355function showDimensionInBestUnit($dimension, $unit, $type, $outputlangs, $round = -1, $forceunitoutput =
'no', $use_short_label = 0)
6357 require_once DOL_DOCUMENT_ROOT.
'/core/lib/product.lib.php';
6359 if (($forceunitoutput ==
'no' && $dimension < 1 / 10000 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == -6)) {
6360 $dimension = $dimension * 1000000;
6362 } elseif (($forceunitoutput ==
'no' && $dimension < 1 / 10 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == -3)) {
6363 $dimension = $dimension * 1000;
6365 } elseif (($forceunitoutput ==
'no' && $dimension > 100000000 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == 6)) {
6366 $dimension = $dimension / 1000000;
6368 } elseif (($forceunitoutput ==
'no' && $dimension > 100000 && $unit < 90) || (is_numeric($forceunitoutput) && $forceunitoutput == 3)) {
6369 $dimension = $dimension / 1000;
6385 $ret =
price($dimension, 0, $outputlangs, 0, 0, $round);
6386 $ret .=
' '.measuringUnitString(0, $type, $unit, $use_short_label, $outputlangs);
6404function get_localtax($vatrate, $local, $thirdparty_buyer =
"", $thirdparty_seller =
"", $vatnpr = 0)
6406 global $db, $conf, $mysoc;
6408 if (empty($thirdparty_seller) || !is_object($thirdparty_seller)) {
6409 $thirdparty_seller = $mysoc;
6412 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);
6414 $vatratecleaned = $vatrate;
6416 if (preg_match(
'/^(.*)\s*\((.*)\)$/', $vatrate, $reg)) {
6417 $vatratecleaned = trim($reg[1]);
6418 $vatratecode = $reg[2];
6427 if ($mysoc->country_code ==
'ES') {
6429 if (!$mysoc->localtax1_assuj || (
string) $vatratecleaned ==
"0") {
6432 if ($thirdparty_seller->id == $mysoc->id) {
6433 if (!$thirdparty_buyer->localtax1_assuj) {
6437 if (!$thirdparty_seller->localtax1_assuj) {
6445 if (!$mysoc->localtax2_assuj) {
6448 if ($thirdparty_seller->id == $mysoc->id) {
6449 if (!$thirdparty_buyer->localtax2_assuj) {
6453 if (!$thirdparty_seller->localtax2_assuj) {
6459 if ($local == 1 && !$thirdparty_seller->localtax1_assuj) {
6462 if ($local == 2 && !$thirdparty_seller->localtax2_assuj) {
6468 if (in_array($mysoc->country_code, array(
'ES'))) {
6469 $conf->global->MAIN_GET_LOCALTAXES_VALUES_FROM_THIRDPARTY = 1;
6475 if ($thirdparty_seller != $mysoc) {
6477 return $thirdparty_seller->localtax1_value;
6481 return $conf->global->MAIN_INFO_VALUE_LOCALTAX1;
6486 if ($thirdparty_seller != $mysoc) {
6489 return $thirdparty_seller->localtax2_value;
6492 if (in_array($mysoc->country_code, array(
'ES'))) {
6493 return $thirdparty_buyer->localtax2_value;
6495 return $conf->global->MAIN_INFO_VALUE_LOCALTAX2;
6502 $sql =
"SELECT t.localtax1, t.localtax2, t.localtax1_type, t.localtax2_type";
6503 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t, ".MAIN_DB_PREFIX.
"c_country as c";
6504 $sql .=
" WHERE t.fk_pays = c.rowid AND c.code = '".$db->escape($thirdparty_seller->country_code).
"'";
6505 $sql .=
" AND t.taux = ".((float) $vatratecleaned).
" AND t.active = 1";
6506 $sql .=
" AND t.entity IN (".getEntity(
'c_tva').
")";
6507 if (!empty($vatratecode)) {
6508 $sql .=
" AND t.code ='".$db->escape($vatratecode).
"'";
6510 $sql .=
" AND t.recuperableonly = '".$db->escape($vatnpr).
"'";
6513 $resql = $db->query($sql);
6516 $obj = $db->fetch_object($resql);
6519 return $obj->localtax1;
6520 } elseif ($local == 2) {
6521 return $obj->localtax2;
6542 $valors = explode(
":", $tax);
6544 if (count($valors) > 1) {
6561 $sql =
" SELECT t.localtax".$local.
" as localtax";
6562 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t INNER JOIN ".MAIN_DB_PREFIX.
"c_country as c ON c.rowid = t.fk_pays";
6563 $sql .=
" WHERE c.code = '".$db->escape($mysoc->country_code).
"' AND t.active = 1 AND t.entity IN (".
getEntity(
'c_tva').
") AND t.taux = (";
6564 $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";
6565 $sql .=
" WHERE c.code = '".$db->escape($mysoc->country_code).
"' AND t.entity IN (".
getEntity(
'c_tva').
") AND tt.active = 1)";
6566 $sql .=
" AND t.localtax".$local.
"_type <> '0'";
6567 $sql .=
" ORDER BY t.rowid DESC";
6569 $resql = $db->query($sql);
6571 $obj = $db->fetch_object($resql);
6573 return $obj->localtax;
6598 dol_syslog(
"getTaxesFromId vat id or rate = ".$vatrate);
6601 $sql =
"SELECT t.rowid, t.code, t.taux as rate, t.recuperableonly as npr, t.accountancy_code_sell, t.accountancy_code_buy,";
6602 $sql .=
" t.localtax1, t.localtax1_type, t.localtax2, t.localtax2_type";
6603 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t";
6604 if ($firstparamisid) {
6605 $sql .=
" WHERE t.rowid = ".(int) $vatrate;
6607 $vatratecleaned = $vatrate;
6610 if (preg_match(
'/^(.*)\s*\((.*)\)$/', $vatrate, $reg)) {
6611 $vatratecleaned = $reg[1];
6612 $vatratecode = $reg[2];
6615 $sql .=
", ".MAIN_DB_PREFIX.
"c_country as c";
6618 $sql .=
" WHERE t.fk_pays = c.rowid";
6620 $sql .=
" AND c.code = '".$db->escape($buyer->country_code).
"'";
6622 $sql .=
" AND c.code = '".$db->escape($seller->country_code).
"'";
6624 $sql .=
" AND t.taux = ".((float) $vatratecleaned).
" AND t.active = 1";
6625 $sql .=
" AND t.entity IN (".getEntity(
'c_tva').
")";
6627 $sql .=
" AND t.code = '".$db->escape($vatratecode).
"'";
6631 $resql = $db->query($sql);
6633 $obj = $db->fetch_object($resql);
6636 'rowid'=>$obj->rowid,
6639 'localtax1'=>$obj->localtax1,
6640 'localtax1_type'=>$obj->localtax1_type,
6641 'localtax2'=>$obj->localtax2,
6642 'localtax2_type'=>$obj->localtax2_type,
6644 'accountancy_code_sell'=>$obj->accountancy_code_sell,
6645 'accountancy_code_buy'=>$obj->accountancy_code_buy
6677 dol_syslog(
"getLocalTaxesFromRate vatrate=".$vatrate.
" local=".$local);
6680 $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";
6681 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t";
6682 if ($firstparamisid) {
6683 $sql .=
" WHERE t.rowid = ".(int) $vatrate;
6685 $vatratecleaned = $vatrate;
6688 if (preg_match(
'/^(.*)\s*\((.*)\)$/', $vatrate, $reg)) {
6689 $vatratecleaned = $reg[1];
6690 $vatratecode = $reg[2];
6693 $sql .=
", ".MAIN_DB_PREFIX.
"c_country as c";
6694 if (!empty($mysoc) && $mysoc->country_code ==
'ES') {
6695 $countrycodetouse = ((empty($buyer) || empty($buyer->country_code)) ? $mysoc->country_code : $buyer->country_code);
6696 $sql .=
" WHERE t.fk_pays = c.rowid AND c.code = '".$db->escape($countrycodetouse).
"'";
6698 $countrycodetouse = ((empty($seller) || empty($seller->country_code)) ? $mysoc->country_code : $seller->country_code);
6699 $sql .=
" WHERE t.fk_pays = c.rowid AND c.code = '".$db->escape($countrycodetouse).
"'";
6701 $sql .=
" AND t.taux = ".((float) $vatratecleaned).
" AND t.active = 1";
6703 $sql .=
" AND t.code = '".$db->escape($vatratecode).
"'";
6707 $resql = $db->query($sql);
6709 $obj = $db->fetch_object($resql);
6712 $vateratestring = $obj->rate.($obj->code ?
' ('.$obj->code.
')' :
'');
6715 return array($obj->localtax1_type,
get_localtax($vateratestring, $local, $buyer, $seller), $obj->accountancy_code_sell, $obj->accountancy_code_buy);
6716 } elseif ($local == 2) {
6717 return array($obj->localtax2_type,
get_localtax($vateratestring, $local, $buyer, $seller), $obj->accountancy_code_sell, $obj->accountancy_code_buy);
6719 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);
6739 global $db, $conf, $mysoc;
6741 require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
6749 $product->fetch($idprod);
6751 if ($mysoc->country_code == $thirdpartytouse->country_code) {
6753 if ($idprodfournprice > 0) {
6754 $result = $product->get_buyprice($idprodfournprice, 0, 0, 0);
6756 $ret = $product->vatrate_supplier;
6757 if ($product->default_vat_code_supplier) {
6758 $ret .=
' ('.$product->default_vat_code_supplier.
')';
6764 $ret = $product->tva_tx;
6765 if ($product->default_vat_code) {
6766 $ret .=
' ('.$product->default_vat_code.
')';
6779 $sql =
"SELECT t.taux as vat_rate, t.code as default_vat_code";
6780 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t, ".MAIN_DB_PREFIX.
"c_country as c";
6781 $sql .=
" WHERE t.active = 1 AND t.fk_pays = c.rowid AND c.code = '".$db->escape($thirdpartytouse->country_code).
"'";
6782 $sql .=
" AND t.entity IN (".getEntity(
'c_tva').
")";
6783 $sql .=
" ORDER BY t.use_default DESC, t.taux DESC, t.code ASC, t.recuperableonly ASC";
6784 $sql .= $db->plimit(1);
6786 $resql = $db->query($sql);
6788 $obj = $db->fetch_object($resql);
6790 $ret = $obj->vat_rate;
6791 if ($obj->default_vat_code) {
6792 $ret .=
' ('.$obj->default_vat_code.
')';
6805 $defaulttx = $conf->global->MAIN_VAT_DEFAULT_IF_AUTODETECT_FAILS;
6816 dol_syslog(
"get_product_vat_for_country: ret=".$ret);
6833 if (!class_exists(
'Product')) {
6834 require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
6843 $result = $product->fetch($idprod);
6845 if ($mysoc->country_code == $thirdpartytouse->country_code) {
6859 $sql =
"SELECT taux as vat_rate, localtax1, localtax2";
6860 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t, ".MAIN_DB_PREFIX.
"c_country as c";
6861 $sql .=
" WHERE t.active=1 AND t.fk_pays = c.rowid AND c.code='".$db->escape($thirdpartytouse->country_code).
"'";
6862 $sql .=
" AND t.entity IN (".getEntity(
'c_tva').
")";
6863 $sql .=
" ORDER BY t.taux DESC, t.recuperableonly ASC";
6864 $sql .= $db->plimit(1);
6866 $resql = $db->query($sql);
6868 $obj = $db->fetch_object($resql);
6871 $ret = $obj->localtax1;
6872 } elseif ($local == 2) {
6873 $ret = $obj->localtax2;
6881 dol_syslog(
"get_product_localtax_for_country: ret=".$ret);
6905 require_once DOL_DOCUMENT_ROOT.
'/core/lib/company.lib.php';
6908 $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;
6910 $seller_country_code = $thirdparty_seller->country_code;
6911 $seller_in_cee =
isInEEC($thirdparty_seller);
6913 $buyer_country_code = $thirdparty_buyer->country_code;
6914 $buyer_in_cee =
isInEEC($thirdparty_buyer);
6916 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=".(
getDolGlobalString(
'SERVICES_ARE_ECOMMERCE_200238EC') ? $conf->global->SERVICES_ARE_ECOMMERCE_200238EC :
''));
6921 if ($seller_in_cee && $buyer_in_cee) {
6922 $isacompany = $thirdparty_buyer->
isACompany();
6923 if ($isacompany &&
getDolGlobalString(
'MAIN_USE_VAT_COMPANIES_IN_EEC_WITH_INVALID_VAT_ID_ARE_INDIVIDUAL')) {
6924 require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
6938 if (!$seller_use_vat) {
6944 if (($seller_country_code == $buyer_country_code)
6945 || (in_array($seller_country_code, array(
'FR',
'MC')) && in_array($buyer_country_code, array(
'FR',
'MC')))) {
6949 if ($seller_country_code ==
'IN' &&
getDolGlobalString(
'MAIN_SALETAX_AUTOSWITCH_I_CS_FOR_INDIA')) {
6953 if (preg_match(
'/C+S-(\d+)/', $tmpvat, $reg) && $thirdparty_seller->state_id != $thirdparty_buyer->state_id) {
6955 $tmpvat = str_replace(
"C+S",
"I", $tmpvat);
6956 } elseif (preg_match(
'/I-(\d+)/', $tmpvat, $reg) && $thirdparty_seller->state_id == $thirdparty_buyer->state_id) {
6958 $tmpvat = str_replace(
"I",
"C+S", $tmpvat);
6970 if (($seller_in_cee && $buyer_in_cee)) {
6971 $isacompany = $thirdparty_buyer->
isACompany();
6972 if ($isacompany &&
getDolGlobalString(
'MAIN_USE_VAT_COMPANIES_IN_EEC_WITH_INVALID_VAT_ID_ARE_INDIVIDUAL')) {
6973 require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
6990 if (
getDolGlobalString(
'MAIN_USE_VAT_OF_PRODUCT_FOR_INDIVIDUAL_CUSTOMER_OUT_OF_EEC') && empty($buyer_in_cee)) {
6991 $isacompany = $thirdparty_buyer->
isACompany();
7019 if ($idprodfournprice > 0) {
7020 if (!class_exists(
'ProductFournisseur')) {
7021 require_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.product.class.php';
7024 $prodprice->fetch_product_fournisseur_price($idprodfournprice);
7025 return $prodprice->fourn_tva_npr;
7026 } elseif ($idprod > 0) {
7027 if (!class_exists(
'Product')) {
7028 require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
7031 $prod->fetch($idprod);
7032 return $prod->tva_npr;
7055 if (!is_object($thirdparty_seller)) {
7058 if (!is_object($thirdparty_buyer)) {
7063 if ($mysoc->country_code ==
'ES') {
7064 if (is_numeric($thirdparty_buyer->localtax1_assuj) && !$thirdparty_buyer->localtax1_assuj) {
7069 if (is_numeric($thirdparty_seller->localtax1_assuj) && !$thirdparty_seller->localtax1_assuj) {
7072 if (!is_numeric($thirdparty_seller->localtax1_assuj) && $thirdparty_seller->localtax1_assuj ==
'localtax1off') {
7076 } elseif ($local == 2) {
7078 if (is_numeric($thirdparty_seller->localtax2_assuj) && !$thirdparty_seller->localtax2_assuj) {
7081 if (!is_numeric($thirdparty_seller->localtax2_assuj) && $thirdparty_seller->localtax2_assuj ==
'localtax2off') {
7086 if ($thirdparty_seller->country_code == $thirdparty_buyer->country_code) {
7101function yn($yesno, $case = 1, $color = 0)
7105 $result =
'unknown';
7107 if ($yesno == 1 || (isset($yesno) && (strtolower($yesno) ==
'yes' || strtolower($yesno) ==
'true'))) {
7108 $result = $langs->trans(
'yes');
7109 if ($case == 1 || $case == 3) {
7110 $result = $langs->trans(
"Yes");
7113 $result =
'<input type="checkbox" value="1" checked disabled>';
7116 $result =
'<input type="checkbox" value="1" checked disabled> '.$result;
7120 } elseif ($yesno == 0 || strtolower($yesno) ==
'no' || strtolower($yesno) ==
'false') {
7121 $result = $langs->trans(
"no");
7122 if ($case == 1 || $case == 3) {
7123 $result = $langs->trans(
"No");
7126 $result =
'<input type="checkbox" value="0" disabled>';
7129 $result =
'<input type="checkbox" value="0" disabled> '.$result;
7135 $classname =
'error';
7139 return '<span class="'.$classname.
'">'.$result.
'</span>';
7159function get_exdir($num, $level, $alpha, $withoutslash, $object, $modulepart =
'')
7163 if (empty($modulepart) && !empty($object->module)) {
7164 $modulepart = $object->module;
7169 $arrayforoldpath = array(
'cheque',
'category',
'holiday',
'supplier_invoice',
'invoice_supplier',
'mailing',
'supplier_payment');
7171 $arrayforoldpath[] =
'product';
7173 if (!empty($level) && in_array($modulepart, $arrayforoldpath)) {
7175 if (empty($alpha)) {
7176 $num = preg_replace(
'/([^0-9])/i',
'', $num);
7178 $num = preg_replace(
'/^.*\-/i',
'', $num);
7180 $num = substr(
"000".$num, -$level);
7182 $path = substr($num, 0, 1);
7185 $path = substr($num, 1, 1).
'/'.substr($num, 0, 1);
7188 $path = substr($num, 2, 1).
'/'.substr($num, 1, 1).
'/'.substr($num, 0, 1);
7198 if (empty($withoutslash) && !empty($path)) {
7217 dol_syslog(
"functions.lib::dol_mkdir: dir=".$dir, LOG_INFO);
7220 if (@is_dir($dir_osencoded)) {
7228 if (!empty($dataroot)) {
7230 $dir = str_replace($dataroot.
'/',
'', $dir);
7231 $ccdir = $dataroot.
'/';
7234 $cdir = explode(
"/", $dir);
7235 $num = count($cdir);
7236 for ($i = 0; $i < $num; $i++) {
7238 $ccdir .=
'/'.$cdir[$i];
7240 $ccdir .= $cdir[$i];
7243 if (preg_match(
"/^.:$/", $ccdir, $regs)) {
7251 if (!@is_dir($ccdir_osencoded)) {
7252 dol_syslog(
"functions.lib::dol_mkdir: Directory '".$ccdir.
"' does not exists or is outside open_basedir PHP setting.", LOG_DEBUG);
7255 $dirmaskdec = octdec((
string) $newmask);
7256 if (empty($newmask)) {
7257 $dirmaskdec = !
getDolGlobalString(
'MAIN_UMASK') ? octdec(
'0755') : octdec($conf->global->MAIN_UMASK);
7259 $dirmaskdec |= octdec(
'0111');
7260 if (!@mkdir($ccdir_osencoded, $dirmaskdec)) {
7262 dol_syslog(
"functions.lib::dol_mkdir: Fails to create directory '".$ccdir.
"' or directory already exists.", LOG_WARNING);
7265 dol_syslog(
"functions.lib::dol_mkdir: Directory '".$ccdir.
"' created", LOG_DEBUG);
7274 return ($nberr ? -$nberr : $nbcreated);
7289 if (!empty($newmask)) {
7290 @chmod($filepath, octdec($newmask));
7292 @chmod($filepath, octdec($conf->global->MAIN_UMASK));
7304 return '<span class="fieldrequired">*</span>';
7324function dol_string_nohtmltag($stringtoclean, $removelinefeed = 1, $pagecodeto =
'UTF-8', $strip_tags = 0, $removedoublespaces = 1)
7326 if (is_null($stringtoclean)) {
7330 if ($removelinefeed == 2) {
7331 $stringtoclean = preg_replace(
'/<br[^>]*>(\n|\r)+/ims',
'<br>', $stringtoclean);
7333 $temp = preg_replace(
'/<br[^>]*>/i',
"\n", $stringtoclean);
7338 $temp = str_replace(
'< ',
'__ltspace__', $temp);
7341 $temp = strip_tags($temp);
7344 $pattern =
"/<[^<>]+>/";
7351 $tempbis = str_replace(
'<>',
'', $temp);
7352 $tempbis = preg_replace($pattern,
'', $tempbis);
7354 }
while ($tempbis != $temp);
7359 $temp = preg_replace(
'/<+([a-z]+)/i',
'\1', $temp);
7365 if ($removelinefeed == 1) {
7366 $temp = str_replace(array(
"\r\n",
"\r",
"\n"),
" ", $temp);
7370 if ($removedoublespaces) {
7371 while (strpos($temp,
" ")) {
7372 $temp = str_replace(
" ",
" ", $temp);
7376 $temp = str_replace(
'__ltspace__',
'< ', $temp);
7396function dol_string_onlythesehtmltags($stringtoclean, $cleanalsosomestyles = 1, $removeclassattribute = 1, $cleanalsojavascript = 0, $allowiframe = 0, $allowed_tags = array(), $allowlink = 0)
7398 if (empty($allowed_tags)) {
7399 $allowed_tags = array(
7400 "html",
"head",
"meta",
"body",
"article",
"a",
"abbr",
"b",
"blockquote",
"br",
"cite",
"div",
"dl",
"dd",
"dt",
"em",
"font",
"img",
"ins",
"hr",
"i",
"li",
7401 "ol",
"p",
"q",
"s",
"span",
"strike",
"strong",
"title",
"table",
"tr",
"th",
"td",
"u",
"ul",
"sup",
"sub",
"blockquote",
"pre",
"h1",
"h2",
"h3",
"h4",
"h5",
"h6",
7402 "header",
"footer",
"nav",
"section",
"menu",
"menuitem"
7405 $allowed_tags[] =
"comment";
7407 if (!in_array(
'iframe', $allowed_tags)) {
7408 $allowed_tags[] =
"iframe";
7412 if (!in_array(
'link', $allowed_tags)) {
7413 $allowed_tags[] =
"link";
7417 $allowed_tags_string = join(
"><", $allowed_tags);
7418 $allowed_tags_string =
'<'.$allowed_tags_string.
'>';
7420 $stringtoclean = str_replace(
'<!DOCTYPE html>',
'__!DOCTYPE_HTML__', $stringtoclean);
7425 $stringtoclean = preg_replace(
'/<!--([^>]*)-->/',
'<comment>\1</comment>', $stringtoclean);
7427 $stringtoclean = preg_replace(
'/:/i',
':', $stringtoclean);
7428 $stringtoclean = preg_replace(
'/:|�+58|:/i',
'', $stringtoclean);
7430 $temp = strip_tags($stringtoclean, $allowed_tags_string);
7432 if ($cleanalsosomestyles) {
7433 $temp = preg_replace(
'/position\s*:\s*(absolute|fixed)\s*!\s*important/i',
'', $temp);
7435 if ($removeclassattribute) {
7436 $temp = preg_replace(
'/(<[^>]+)\s+class=((["\']).*?\\3|\\w*)/i',
'\\1', $temp);
7441 if ($cleanalsojavascript) {
7442 $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);
7445 $temp = str_replace(
'__!DOCTYPE_HTML__',
'<!DOCTYPE html>', $temp);
7447 $temp = preg_replace(
'/<comment>([^>]*)<\/comment>/',
'<!--\1-->', $temp);
7467 if (is_null($allowed_attributes)) {
7468 $allowed_attributes = array(
7469 "allow",
"allowfullscreen",
"alt",
"class",
"contenteditable",
"data-html",
"frameborder",
"height",
"href",
"id",
"name",
"src",
"style",
"target",
"title",
"width",
7471 "header",
"footer",
"nav",
"section",
"menu",
"menuitem"
7475 if (class_exists(
'DOMDocument') && !empty($stringtoclean)) {
7476 $stringtoclean =
'<?xml encoding="UTF-8"><html><body>'.$stringtoclean.
'</body></html>';
7479 $dom =
new DOMDocument(
null,
'UTF-8');
7480 $dom->loadHTML($stringtoclean, LIBXML_ERR_NONE|LIBXML_HTML_NOIMPLIED|LIBXML_HTML_NODEFDTD|LIBXML_NONET|LIBXML_NOWARNING|LIBXML_NOXMLDECL);
7482 if (is_object($dom)) {
7483 for ($els = $dom->getElementsByTagname(
'*'), $i = $els->length - 1; $i >= 0; $i--) {
7484 for ($attrs = $els->item($i)->attributes, $ii = $attrs->length - 1; $ii >= 0; $ii--) {
7486 if (!empty($attrs->item($ii)->name)) {
7487 if (! in_array($attrs->item($ii)->name, $allowed_attributes)) {
7489 $els->item($i)->removeAttribute($attrs->item($ii)->name);
7490 } elseif (in_array($attrs->item($ii)->name, array(
'style'))) {
7492 $valuetoclean = $attrs->item($ii)->value;
7494 if (isset($valuetoclean)) {
7496 $oldvaluetoclean = $valuetoclean;
7497 $valuetoclean = preg_replace(
'/\/\*.*\*\//m',
'', $valuetoclean);
7498 $valuetoclean = preg_replace(
'/position\s*:\s*[a-z]+/mi',
'', $valuetoclean);
7499 if ($els->item($i)->tagName ==
'a') {
7500 $valuetoclean = preg_replace(
'/display\s*:/mi',
'', $valuetoclean);
7501 $valuetoclean = preg_replace(
'/z-index\s*:/mi',
'', $valuetoclean);
7502 $valuetoclean = preg_replace(
'/\s+(top|left|right|bottom)\s*:/mi',
'', $valuetoclean);
7506 $valuetoclean = preg_replace(
'/(logout|passwordforgotten)\.php/mi',
'', $valuetoclean);
7507 $valuetoclean = preg_replace(
'/action=/mi',
'', $valuetoclean);
7508 }
while ($oldvaluetoclean != $valuetoclean);
7511 $attrs->item($ii)->value = $valuetoclean;
7518 $return = $dom->saveHTML();
7521 $return = preg_replace(
'/^'.preg_quote(
'<?xml encoding="UTF-8">',
'/').
'/',
'', $return);
7522 $return = preg_replace(
'/^'.preg_quote(
'<html><body>',
'/').
'/',
'', $return);
7523 $return = preg_replace(
'/'.preg_quote(
'</body></html>',
'/').
'$/',
'', $return);
7524 return trim($return);
7526 return $stringtoclean;
7543 $temp = $stringtoclean;
7544 foreach ($disallowed_tags as $tagtoremove) {
7545 $temp = preg_replace(
'/<\/?'.$tagtoremove.
'>/',
'', $temp);
7546 $temp = preg_replace(
'/<\/?'.$tagtoremove.
'\s+[^>]*>/',
'', $temp);
7549 if ($cleanalsosomestyles) {
7550 $temp = preg_replace(
'/position\s*:\s*(absolute|fixed)\s*!\s*important/',
'', $temp);
7568 if ($nboflines == 1) {
7570 $firstline = preg_replace(
'/<br[^>]*>.*$/s',
'', $text);
7571 $firstline = preg_replace(
'/<div[^>]*>.*$/s',
'', $firstline);
7574 $firstline = preg_replace(
'/[\n\r].*/',
'', $text);
7579 return $firstline.(isset($firstline) && isset($text) && (strlen($firstline) != strlen($text)) ?
'...' :
'');
7583 $text = preg_replace(
'/\n/',
'', $text);
7585 $repTable = array(
"\t" =>
" ",
"\n" =>
" ",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
7587 $repTable = array(
"\t" =>
" ",
"\n" =>
"<br>",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
7590 $text = strtr($text, $repTable);
7591 if ($charset ==
'UTF-8') {
7592 $pattern =
'/(<br[^>]*>)/Uu';
7595 $pattern =
'/(<br[^>]*>)/U';
7597 $a = preg_split($pattern, $text, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
7602 $lastaddediscontent = 1;
7603 while ($countline < $nboflines && isset($a[$i])) {
7604 if (preg_match(
'/<br[^>]*>/', $a[$i])) {
7605 if (array_key_exists($i+1, $a) && !empty($a[$i+1])) {
7606 $firstline .= ($ishtml ?
"<br>\n" :
"\n");
7608 if (!$lastaddediscontent) {
7611 $lastaddediscontent = 0;
7614 $firstline .= $a[$i];
7615 $lastaddediscontent = 1;
7621 $adddots = (isset($a[$i]) && (!preg_match(
'/<br[^>]*>/', $a[$i]) || (array_key_exists($i+1, $a) && !empty($a[$i+1]))));
7623 $ret = $firstline.($adddots ?
'...' :
'');
7641function dol_nl2br($stringtoencode, $nl2brmode = 0, $forxml =
false)
7643 if (is_null($stringtoencode)) {
7648 return nl2br($stringtoencode, $forxml);
7650 $ret = preg_replace(
'/(\r\n|\r|\n)/i', ($forxml ?
'<br />' :
'<br>'), $stringtoencode);
7666 if (empty($nouseofiframesandbox) &&
getDolGlobalString(
'MAIN_SECURITY_USE_SANDBOX_FOR_HTMLWITHNOJS')) {
7671 return $stringtoencode;
7673 $out = $stringtoencode;
7676 $oldstringtoclean = $out;
7678 if (!empty($out) &&
getDolGlobalString(
'MAIN_RESTRICTHTML_ONLY_VALID_HTML') && $check !=
'restricthtmlallowunvalid') {
7680 libxml_use_internal_errors(
false);
7681 if (LIBXML_VERSION < 20900) {
7684 libxml_disable_entity_loader(
true);
7687 $dom =
new DOMDocument();
7693 $out =
'<?xml encoding="UTF-8"><div class="tricktoremove">'.$out.
'</div>';
7695 $out =
'<?xml encoding="UTF-8"><div class="tricktoremove">'.dol_nl2br($out).
'</div>';
7697 $dom->loadHTML($out, LIBXML_HTML_NODEFDTD | LIBXML_ERR_NONE | LIBXML_HTML_NOIMPLIED | LIBXML_NONET | LIBXML_NOWARNING | LIBXML_NOERROR | LIBXML_NOXMLDECL);
7698 $out = trim($dom->saveHTML());
7701 $out = preg_replace(
'/^<\?xml encoding="UTF-8"><div class="tricktoremove">/',
'', $out);
7702 $out = preg_replace(
'/<\/div>$/',
'', $out);
7706 $out =
'InvalidHTMLStringCantBeCleaned '.$e->getMessage();
7710 if (!empty($out) &&
getDolGlobalString(
'MAIN_RESTRICTHTML_ONLY_VALID_HTML_TIDY') && $check !=
'restricthtmlallowunvalid') {
7713 if (extension_loaded(
'tidy') && class_exists(
"tidy")) {
7719 'quote-marks' =>
false,
7720 'doctype' =>
'strict',
7721 'show-body-only' =>
true,
7722 "indent-attributes" =>
false,
7723 "vertical-space" =>
false,
7735 $out = $tidy->repairString($out, $config,
'utf8');
7742 $out =
'InvalidHTMLStringCantBeCleaned '.$e->getMessage();
7747 $out = preg_replace(
'/[\x{200B}-\x{200D}\x{FEFF}]/u',
' ', $out);
7750 $out = preg_replace(
'/&(tab|newline);/i',
' ', $out);
7754 $out = preg_replace(
'/'/i',
''', $out);
7759 $out = preg_replace_callback(
'/&#(x?[0-9][0-9a-f]+;?)/i',
function ($m) {
7765 $out = preg_replace(
'/&#x?[0-9]+/i',
'', $out);
7776 $out = preg_replace(
'/'/i',
"'", $out);
7777 }
while ($oldstringtoclean != $out);
7784 $tmpout = preg_replace(
'/<img src="data:/mi',
'<__IMG_SRC_DATA__ src="data:', $out);
7785 preg_match_all(
'/(<img|url\(|<link)/i', $tmpout, $reg);
7786 $nblinks = count($reg[0]);
7787 if ($nblinks >
getDolGlobalInt(
"MAIN_SECURITY_MAX_IMG_IN_HTML_CONTENT", 1000)) {
7788 $out =
'ErrorTooManyLinksIntoHTMLString';
7791 if (
getDolGlobalInt(
'MAIN_DISALLOW_URL_INTO_DESCRIPTIONS') == 2 || $check ==
'restricthtmlnolink') {
7793 $out =
'ErrorHTMLLinksNotAllowed';
7795 } elseif (
getDolGlobalInt(
'MAIN_DISALLOW_URL_INTO_DESCRIPTIONS') == 1) {
7798 $pattern =
'/src=["\']?(http[^"\']+)|url\(["\']?(http[^\)]+)/';
7801 if (preg_match_all($pattern, $out, $matches)) {
7803 $urls = $matches[1];
7806 foreach ($urls as $url) {
7808 echo
"Found url = ".$url .
"\n";
7811 $out =
'ErrorHTMLExternalLinksNotAllowed';
7841function dol_htmlentitiesbr($stringtoencode, $nl2brmode = 0, $pagecodefrom =
'UTF-8', $removelasteolbr = 1)
7843 if (is_null($stringtoencode)) {
7847 $newstring = $stringtoencode;
7849 $newstring = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>/i',
'<br>', $newstring);
7850 if ($removelasteolbr) {
7851 $newstring = preg_replace(
'/<br>$/i',
'', $newstring);
7853 $newstring = preg_replace(
'/[\x{200B}-\x{200D}\x{FEFF}]/u',
' ', $newstring);
7854 $newstring = strtr($newstring, array(
'&'=>
'__and__',
'<'=>
'__lt__',
'>'=>
'__gt__',
'"'=>
'__dquot__'));
7856 $newstring = strtr($newstring, array(
'__and__'=>
'&',
'__lt__'=>
'<',
'__gt__'=>
'>',
'__dquot__'=>
'"'));
7858 if ($removelasteolbr) {
7859 $newstring = preg_replace(
'/(\r\n|\r|\n)$/i',
'', $newstring);
7878 $ret = preg_replace(
'/'.
"\r\n".
'<br(\s[\sa-zA-Z_="]*)?\/?>/i',
"<br>", $ret);
7879 $ret = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>'.
"\r\n".
'/i',
"\r\n", $ret);
7880 $ret = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>'.
"\n".
'/i',
"\n", $ret);
7881 $ret = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>/i',
"\n", $ret);
7893 $ret = preg_replace(
'/ $/i',
"", $stringtodecode);
7894 $ret = preg_replace(
'/(<br>|<br(\s[\sa-zA-Z_="]*)?\/?>|'.
"\n".
'|'.
"\r".
')+$/i',
"", $ret);
7910 if ($keepsomeentities) {
7911 $newstring = strtr($newstring, array(
'&'=>
'__andamp__',
'<'=>
'__andlt__',
'>'=>
'__andgt__',
'"'=>
'__dquot__'));
7913 $newstring = html_entity_decode((
string) $newstring, (
int) $b, (
string) $c);
7914 if ($keepsomeentities) {
7915 $newstring = strtr($newstring, array(
'__andamp__'=>
'&',
'__andlt__'=>
'<',
'__andgt__'=>
'>',
'__dquot__'=>
'"'));
7931function dol_htmlentities($string, $flags = ENT_QUOTES|ENT_SUBSTITUTE, $encoding =
'UTF-8', $double_encode =
false)
7933 return htmlentities($string, $flags, $encoding, $double_encode);
7952 for ($scursor = 0; $scursor < $len; $scursor++) {
7953 $ordchar = ord($s[$scursor]);
7955 if ($ordchar < 32 && $ordchar != 13 && $ordchar != 10) {
7958 } elseif ($ordchar > 126 && $ordchar < 160) {
7962 $out .= $s[$scursor];
7984 $arraystring = explode(
"\n", $s);
7985 $nb = count($arraystring);
8002 $repTable = array(
"\t" =>
" ",
"\n" =>
"<br>",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
8004 $repTable = array(
"\t" =>
" ",
"\n" =>
" ",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
8007 $text = strtr($text, $repTable);
8008 if ($charset ==
'UTF-8') {
8009 $pattern =
'/(<br[^>]*>)/Uu';
8012 $pattern =
'/(<br[^>]*>)/U';
8014 $a = preg_split($pattern, $text, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
8016 $nblines = (int) floor((count($a) + 1) / 2);
8019 foreach ($a as $line) {
8022 $line_dec = html_entity_decode($line);
8024 $line_dec = wordwrap($line_dec, $maxlinesize,
'\n',
true);
8025 $nblines += substr_count($line_dec,
'\n');
8045 if (is_null($msg)) {
8050 if (preg_match(
'/<html/i', $msg)) {
8052 } elseif (preg_match(
'/<body/i', $msg)) {
8054 } elseif (preg_match(
'/<\/textarea/i', $msg)) {
8056 } elseif (preg_match(
'/<(b|em|i|u)(\s+[^>]+)?>/i', $msg)) {
8058 } elseif (preg_match(
'/<br/i', $msg)) {
8064 $msg = preg_replace(
'/https?:\/\/[^"\'\s]+/i',
'', $msg);
8065 if (preg_match(
'/<html/i', $msg)) {
8067 } elseif (preg_match(
'/<body/i', $msg)) {
8069 } elseif (preg_match(
'/<\/textarea/i', $msg)) {
8071 } elseif (preg_match(
'/<(b|em|i|u)(\s+[^>]+)?>/i', $msg)) {
8073 } elseif (preg_match(
'/<(br|hr)\/>/i', $msg)) {
8075 } elseif (preg_match(
'/<(br|hr|div|font|li|p|span|strong|table)>/i', $msg)) {
8077 } elseif (preg_match(
'/<(br|hr|div|font|li|p|span|strong|table)\s+[^<>\/]*\/?>/i', $msg)) {
8079 } elseif (preg_match(
'/<img\s+[^<>]*src[^<>]*>/i', $msg)) {
8081 } elseif (preg_match(
'/<a\s+[^<>]*href[^<>]*>/i', $msg)) {
8083 } elseif (preg_match(
'/<h[0-9]>/i', $msg)) {
8085 } elseif (preg_match(
'/&[A-Z0-9]{1,6};/i', $msg)) {
8088 } elseif (preg_match(
'/&#[0-9]{2,3};/i', $msg)) {
8112 if (!empty($invert)) {
8120 $ret .= (!empty($text1) && !empty($text2)) ? ((
dol_textishtml($text1) ||
dol_textishtml($text2)) ? ($forxml ?
"<br >\n" :
"<br>\n") :
"\n") :
"";
8140 global $db, $conf, $mysoc, $user, $extrafields;
8142 $substitutionarray = array();
8144 if ((empty($exclude) || !in_array(
'user', $exclude)) && (empty($include) || in_array(
'user', $include))) {
8148 $emailsendersignature = $user->signature;
8149 $usersignature = $user->signature;
8150 $substitutionarray = array_merge($substitutionarray, array(
8151 '__SENDEREMAIL_SIGNATURE__' => (
string) ((!
getDolGlobalString(
'MAIN_MAIL_DO_NOT_USE_SIGN')) ? ($onlykey == 2 ?
dol_trunc(
'SignatureFromTheSelectedSenderProfile', 30) : $emailsendersignature) :
''),
8155 if (is_object($user)) {
8156 $substitutionarray = array_merge($substitutionarray, array(
8157 '__USER_ID__' => (
string) $user->id,
8158 '__USER_LOGIN__' => (
string) $user->login,
8159 '__USER_EMAIL__' => (
string) $user->email,
8160 '__USER_PHONE__' => (
string)
dol_print_phone($user->office_phone,
'', 0, 0,
'',
" ",
'',
'', -1),
8161 '__USER_PHONEPRO__' => (
string)
dol_print_phone($user->user_mobile,
'', 0, 0,
'',
" ",
'',
'', -1),
8162 '__USER_PHONEMOBILE__' => (
string)
dol_print_phone($user->personal_mobile,
'', 0, 0,
'',
" ",
'',
'', -1),
8163 '__USER_FAX__' => (
string) $user->office_fax,
8164 '__USER_LASTNAME__' => (
string) $user->lastname,
8165 '__USER_FIRSTNAME__' => (
string) $user->firstname,
8166 '__USER_FULLNAME__' => (
string) $user->getFullName($outputlangs),
8167 '__USER_SUPERVISOR_ID__' => (
string) ($user->fk_user ? $user->fk_user :
'0'),
8168 '__USER_JOB__' => (
string) $user->job,
8170 '__USER_VCARD_URL__' => (string) $user->getOnlineVirtualCardUrl(
'',
'external')
8174 if ((empty($exclude) || !in_array(
'mycompany', $exclude)) && is_object($mysoc) && (empty($include) || in_array(
'mycompany', $include))) {
8175 $substitutionarray = array_merge($substitutionarray, array(
8176 '__MYCOMPANY_NAME__' => $mysoc->name,
8177 '__MYCOMPANY_EMAIL__' => $mysoc->email,
8178 '__MYCOMPANY_PHONE__' =>
dol_print_phone($mysoc->phone,
'', 0, 0,
'',
" ",
'',
'', -1),
8179 '__MYCOMPANY_FAX__' =>
dol_print_phone($mysoc->fax,
'', 0, 0,
'',
" ",
'',
'', -1),
8180 '__MYCOMPANY_PROFID1__' => $mysoc->idprof1,
8181 '__MYCOMPANY_PROFID2__' => $mysoc->idprof2,
8182 '__MYCOMPANY_PROFID3__' => $mysoc->idprof3,
8183 '__MYCOMPANY_PROFID4__' => $mysoc->idprof4,
8184 '__MYCOMPANY_PROFID5__' => $mysoc->idprof5,
8185 '__MYCOMPANY_PROFID6__' => $mysoc->idprof6,
8186 '__MYCOMPANY_CAPITAL__' => $mysoc->capital,
8187 '__MYCOMPANY_FULLADDRESS__' => (method_exists($mysoc,
'getFullAddress') ? $mysoc->getFullAddress(1,
', ') :
''),
8188 '__MYCOMPANY_ADDRESS__' => $mysoc->address,
8189 '__MYCOMPANY_ZIP__' => $mysoc->zip,
8190 '__MYCOMPANY_TOWN__' => $mysoc->town,
8191 '__MYCOMPANY_COUNTRY__' => $mysoc->country,
8192 '__MYCOMPANY_COUNTRY_ID__' => $mysoc->country_id,
8193 '__MYCOMPANY_COUNTRY_CODE__' => $mysoc->country_code,
8194 '__MYCOMPANY_CURRENCY_CODE__' => $conf->currency
8198 if (($onlykey || is_object($object)) && (empty($exclude) || !in_array(
'object', $exclude)) && (empty($include) || in_array(
'object', $include))) {
8200 $substitutionarray[
'__ID__'] =
'__ID__';
8201 $substitutionarray[
'__REF__'] =
'__REF__';
8202 $substitutionarray[
'__NEWREF__'] =
'__NEWREF__';
8203 $substitutionarray[
'__LABEL__'] =
'__LABEL__';
8204 $substitutionarray[
'__REF_CLIENT__'] =
'__REF_CLIENT__';
8205 $substitutionarray[
'__REF_SUPPLIER__'] =
'__REF_SUPPLIER__';
8206 $substitutionarray[
'__NOTE_PUBLIC__'] =
'__NOTE_PUBLIC__';
8207 $substitutionarray[
'__NOTE_PRIVATE__'] =
'__NOTE_PRIVATE__';
8208 $substitutionarray[
'__EXTRAFIELD_XXX__'] =
'__EXTRAFIELD_XXX__';
8210 if (isModEnabled(
"societe")) {
8211 $substitutionarray[
'__THIRDPARTY_ID__'] =
'__THIRDPARTY_ID__';
8212 $substitutionarray[
'__THIRDPARTY_NAME__'] =
'__THIRDPARTY_NAME__';
8213 $substitutionarray[
'__THIRDPARTY_NAME_ALIAS__'] =
'__THIRDPARTY_NAME_ALIAS__';
8214 $substitutionarray[
'__THIRDPARTY_CODE_CLIENT__'] =
'__THIRDPARTY_CODE_CLIENT__';
8215 $substitutionarray[
'__THIRDPARTY_CODE_FOURNISSEUR__'] =
'__THIRDPARTY_CODE_FOURNISSEUR__';
8216 $substitutionarray[
'__THIRDPARTY_EMAIL__'] =
'__THIRDPARTY_EMAIL__';
8217 $substitutionarray[
'__THIRDPARTY_PHONE__'] =
'__THIRDPARTY_PHONE__';
8218 $substitutionarray[
'__THIRDPARTY_FAX__'] =
'__THIRDPARTY_FAX__';
8219 $substitutionarray[
'__THIRDPARTY_ADDRESS__'] =
'__THIRDPARTY_ADDRESS__';
8220 $substitutionarray[
'__THIRDPARTY_ZIP__'] =
'__THIRDPARTY_ZIP__';
8221 $substitutionarray[
'__THIRDPARTY_TOWN__'] =
'__THIRDPARTY_TOWN__';
8222 $substitutionarray[
'__THIRDPARTY_IDPROF1__'] =
'__THIRDPARTY_IDPROF1__';
8223 $substitutionarray[
'__THIRDPARTY_IDPROF2__'] =
'__THIRDPARTY_IDPROF2__';
8224 $substitutionarray[
'__THIRDPARTY_IDPROF3__'] =
'__THIRDPARTY_IDPROF3__';
8225 $substitutionarray[
'__THIRDPARTY_IDPROF4__'] =
'__THIRDPARTY_IDPROF4__';
8226 $substitutionarray[
'__THIRDPARTY_IDPROF5__'] =
'__THIRDPARTY_IDPROF5__';
8227 $substitutionarray[
'__THIRDPARTY_IDPROF6__'] =
'__THIRDPARTY_IDPROF6__';
8228 $substitutionarray[
'__THIRDPARTY_TVAINTRA__'] =
'__THIRDPARTY_TVAINTRA__';
8229 $substitutionarray[
'__THIRDPARTY_NOTE_PUBLIC__'] =
'__THIRDPARTY_NOTE_PUBLIC__';
8230 $substitutionarray[
'__THIRDPARTY_NOTE_PRIVATE__'] =
'__THIRDPARTY_NOTE_PRIVATE__';
8232 if (isModEnabled(
'adherent') && (!is_object($object) || $object->element ==
'adherent') && (empty($exclude) || !in_array(
'member', $exclude)) && (empty($include) || in_array(
'member', $include))) {
8233 $substitutionarray[
'__MEMBER_ID__'] =
'__MEMBER_ID__';
8234 $substitutionarray[
'__MEMBER_CIVILITY__'] =
'__MEMBER_CIVILITY__';
8235 $substitutionarray[
'__MEMBER_FIRSTNAME__'] =
'__MEMBER_FIRSTNAME__';
8236 $substitutionarray[
'__MEMBER_LASTNAME__'] =
'__MEMBER_LASTNAME__';
8237 $substitutionarray[
'__MEMBER_USER_LOGIN_INFORMATION__'] =
'Login and pass of the external user account';
8242 if (isModEnabled(
'ticket') && (!is_object($object) || $object->element ==
'ticket') && (empty($exclude) || !in_array(
'ticket', $exclude)) && (empty($include) || in_array(
'ticket', $include))) {
8243 $substitutionarray[
'__TICKET_TRACKID__'] =
'__TICKET_TRACKID__';
8244 $substitutionarray[
'__TICKET_SUBJECT__'] =
'__TICKET_SUBJECT__';
8245 $substitutionarray[
'__TICKET_TYPE__'] =
'__TICKET_TYPE__';
8246 $substitutionarray[
'__TICKET_SEVERITY__'] =
'__TICKET_SEVERITY__';
8247 $substitutionarray[
'__TICKET_CATEGORY__'] =
'__TICKET_CATEGORY__';
8248 $substitutionarray[
'__TICKET_ANALYTIC_CODE__'] =
'__TICKET_ANALYTIC_CODE__';
8249 $substitutionarray[
'__TICKET_MESSAGE__'] =
'__TICKET_MESSAGE__';
8250 $substitutionarray[
'__TICKET_PROGRESSION__'] =
'__TICKET_PROGRESSION__';
8251 $substitutionarray[
'__TICKET_USER_ASSIGN__'] =
'__TICKET_USER_ASSIGN__';
8254 if (isModEnabled(
'recruitment') && (!is_object($object) || $object->element ==
'recruitmentcandidature') && (empty($exclude) || !in_array(
'recruitment', $exclude)) && (empty($include) || in_array(
'recruitment', $include))) {
8255 $substitutionarray[
'__CANDIDATE_FULLNAME__'] =
'__CANDIDATE_FULLNAME__';
8256 $substitutionarray[
'__CANDIDATE_FIRSTNAME__'] =
'__CANDIDATE_FIRSTNAME__';
8257 $substitutionarray[
'__CANDIDATE_LASTNAME__'] =
'__CANDIDATE_LASTNAME__';
8259 if (isModEnabled(
'project') && (empty($exclude) || !in_array(
'project', $exclude)) && (empty($include) || in_array(
'project', $include))) {
8260 $substitutionarray[
'__PROJECT_ID__'] =
'__PROJECT_ID__';
8261 $substitutionarray[
'__PROJECT_REF__'] =
'__PROJECT_REF__';
8262 $substitutionarray[
'__PROJECT_NAME__'] =
'__PROJECT_NAME__';
8266 if (isModEnabled(
'contrat') && (!is_object($object) || $object->element ==
'contract') && (empty($exclude) || !in_array(
'contract', $exclude)) && (empty($include) || in_array(
'contract', $include))) {
8267 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATE__'] =
'Highest date planned for a service start';
8268 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATETIME__'] =
'Highest date and hour planned for service start';
8269 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATE__'] =
'Lowest data for planned expiration of service';
8270 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATETIME__'] =
'Lowest date and hour for planned expiration of service';
8272 if (isModEnabled(
"propal") && (!is_object($object) || $object->element ==
'propal') && (empty($exclude) || !in_array(
'propal', $exclude)) && (empty($include) || in_array(
'propal', $include))) {
8273 $substitutionarray[
'__ONLINE_SIGN_URL__'] =
'ToOfferALinkForOnlineSignature';
8275 if (isModEnabled(
"ficheinter") && (!is_object($object) || $object->element ==
'fichinter') && (empty($exclude) || !in_array(
'intervention', $exclude)) && (empty($include) || in_array(
'intervention', $include))) {
8276 $substitutionarray[
'__ONLINE_SIGN_FICHINTER_URL__'] =
'ToOfferALinkForOnlineSignature';
8278 $substitutionarray[
'__ONLINE_PAYMENT_URL__'] =
'UrlToPayOnlineIfApplicable';
8279 $substitutionarray[
'__ONLINE_PAYMENT_TEXT_AND_URL__'] =
'TextAndUrlToPayOnlineIfApplicable';
8280 $substitutionarray[
'__SECUREKEYPAYMENT__'] =
'Security key (if key is not unique per record)';
8281 $substitutionarray[
'__SECUREKEYPAYMENT_MEMBER__'] =
'Security key for payment on a member subscription (one key per member)';
8282 $substitutionarray[
'__SECUREKEYPAYMENT_ORDER__'] =
'Security key for payment on an order';
8283 $substitutionarray[
'__SECUREKEYPAYMENT_INVOICE__'] =
'Security key for payment on an invoice';
8284 $substitutionarray[
'__SECUREKEYPAYMENT_CONTRACTLINE__'] =
'Security key for payment on a service of a contract';
8286 $substitutionarray[
'__DIRECTDOWNLOAD_URL_PROPOSAL__'] =
'Direct download url of a proposal';
8287 $substitutionarray[
'__DIRECTDOWNLOAD_URL_ORDER__'] =
'Direct download url of an order';
8288 $substitutionarray[
'__DIRECTDOWNLOAD_URL_INVOICE__'] =
'Direct download url of an invoice';
8289 $substitutionarray[
'__DIRECTDOWNLOAD_URL_CONTRACT__'] =
'Direct download url of a contract';
8290 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_PROPOSAL__'] =
'Direct download url of a supplier proposal';
8292 if (isModEnabled(
"expedition") && (!is_object($object) || $object->element ==
'shipping')) {
8293 $substitutionarray[
'__SHIPPINGTRACKNUM__'] =
'Shipping tracking number';
8294 $substitutionarray[
'__SHIPPINGTRACKNUMURL__'] =
'Shipping tracking url';
8295 $substitutionarray[
'__SHIPPINGMETHOD__'] =
'Shipping method';
8297 if (isModEnabled(
"reception") && (!is_object($object) || $object->element ==
'reception')) {
8298 $substitutionarray[
'__RECEPTIONTRACKNUM__'] =
'Shippin tracking number of shipment';
8299 $substitutionarray[
'__RECEPTIONTRACKNUMURL__'] =
'Shipping tracking url';
8302 $substitutionarray[
'__ID__'] = $object->id;
8303 $substitutionarray[
'__REF__'] = $object->ref;
8304 $substitutionarray[
'__NEWREF__'] = $object->newref;
8305 $substitutionarray[
'__LABEL__'] = (isset($object->label) ? $object->label : (isset($object->title) ? $object->title :
null));
8306 $substitutionarray[
'__REF_CLIENT__'] = (isset($object->ref_client) ? $object->ref_client : (isset($object->ref_customer) ? $object->ref_customer :
null));
8307 $substitutionarray[
'__REF_SUPPLIER__'] = (isset($object->ref_supplier) ? $object->ref_supplier :
null);
8308 $substitutionarray[
'__NOTE_PUBLIC__'] = (isset($object->note_public) ? $object->note_public :
null);
8309 $substitutionarray[
'__NOTE_PRIVATE__'] = (isset($object->note_private) ? $object->note_private :
null);
8310 $substitutionarray[
'__DATE_DELIVERY__'] = (isset($object->date_delivery) ?
dol_print_date($object->date_delivery,
'day', 0, $outputlangs) :
'');
8311 $substitutionarray[
'__DATE_DELIVERY_DAY__'] = (isset($object->date_delivery) ?
dol_print_date($object->date_delivery,
"%d") :
'');
8312 $substitutionarray[
'__DATE_DELIVERY_DAY_TEXT__'] = (isset($object->date_delivery) ?
dol_print_date($object->date_delivery,
"%A") :
'');
8313 $substitutionarray[
'__DATE_DELIVERY_MON__'] = (isset($object->date_delivery) ?
dol_print_date($object->date_delivery,
"%m") :
'');
8314 $substitutionarray[
'__DATE_DELIVERY_MON_TEXT__'] = (isset($object->date_delivery) ?
dol_print_date($object->date_delivery,
"%b") :
'');
8315 $substitutionarray[
'__DATE_DELIVERY_YEAR__'] = (isset($object->date_delivery) ?
dol_print_date($object->date_delivery,
"%Y") :
'');
8316 $substitutionarray[
'__DATE_DELIVERY_HH__'] = (isset($object->date_delivery) ?
dol_print_date($object->date_delivery,
"%H") :
'');
8317 $substitutionarray[
'__DATE_DELIVERY_MM__'] = (isset($object->date_delivery) ?
dol_print_date($object->date_delivery,
"%M") :
'');
8318 $substitutionarray[
'__DATE_DELIVERY_SS__'] = (isset($object->date_delivery) ?
dol_print_date($object->date_delivery,
"%S") :
'');
8321 $substitutionarray[
'__REFCLIENT__'] = (isset($object->ref_client) ? $object->ref_client : (isset($object->ref_customer) ? $object->ref_customer :
null));
8322 $substitutionarray[
'__REFSUPPLIER__'] = (isset($object->ref_supplier) ? $object->ref_supplier :
null);
8323 $substitutionarray[
'__SUPPLIER_ORDER_DATE_DELIVERY__'] = (isset($object->delivery_date) ?
dol_print_date($object->delivery_date,
'day', 0, $outputlangs) :
'');
8324 $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 :
'')) :
'');
8325 $substitutionarray[
'__EXPIRATION_DATE__'] = (isset($object->fin_validite) ?
dol_print_date($object->fin_validite,
'daytext') :
'');
8327 if (is_object($object) && ($object->element ==
'adherent' || $object->element ==
'member') && $object->id > 0) {
8328 $birthday = (empty($object->birth) ?
'' :
dol_print_date($object->birth,
'day'));
8330 $substitutionarray[
'__MEMBER_ID__'] = (isset($object->id) ? $object->id :
'');
8331 if (method_exists($object,
'getCivilityLabel')) {
8332 $substitutionarray[
'__MEMBER_CIVILITY__'] = $object->getCivilityLabel();
8334 $substitutionarray[
'__MEMBER_FIRSTNAME__'] = (isset($object->firstname) ? $object->firstname :
'');
8335 $substitutionarray[
'__MEMBER_LASTNAME__'] = (isset($object->lastname) ? $object->lastname :
'');
8336 $substitutionarray[
'__MEMBER_USER_LOGIN_INFORMATION__'] =
'';
8337 if (method_exists($object,
'getFullName')) {
8338 $substitutionarray[
'__MEMBER_FULLNAME__'] = $object->getFullName($outputlangs);
8340 $substitutionarray[
'__MEMBER_COMPANY__'] = (isset($object->societe) ? $object->societe :
'');
8341 $substitutionarray[
'__MEMBER_ADDRESS__'] = (isset($object->address) ? $object->address :
'');
8342 $substitutionarray[
'__MEMBER_ZIP__'] = (isset($object->zip) ? $object->zip :
'');
8343 $substitutionarray[
'__MEMBER_TOWN__'] = (isset($object->town) ? $object->town :
'');
8344 $substitutionarray[
'__MEMBER_COUNTRY__'] = (isset($object->country) ? $object->country :
'');
8345 $substitutionarray[
'__MEMBER_EMAIL__'] = (isset($object->email) ? $object->email :
'');
8346 $substitutionarray[
'__MEMBER_BIRTH__'] = (isset($birthday) ? $birthday :
'');
8347 $substitutionarray[
'__MEMBER_PHOTO__'] = (isset($object->photo) ? $object->photo :
'');
8348 $substitutionarray[
'__MEMBER_LOGIN__'] = (isset($object->login) ? $object->login :
'');
8349 $substitutionarray[
'__MEMBER_PASSWORD__'] = (isset($object->pass) ? $object->pass :
'');
8350 $substitutionarray[
'__MEMBER_PHONE__'] = (isset($object->phone) ?
dol_print_phone($object->phone) :
'');
8351 $substitutionarray[
'__MEMBER_PHONEPRO__'] = (isset($object->phone_perso) ?
dol_print_phone($object->phone_perso) :
'');
8352 $substitutionarray[
'__MEMBER_PHONEMOBILE__'] = (isset($object->phone_mobile) ?
dol_print_phone($object->phone_mobile) :
'');
8353 $substitutionarray[
'__MEMBER_TYPE__'] = (isset($object->type) ? $object->type :
'');
8354 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE__'] =
dol_print_date($object->first_subscription_date,
'day');
8355 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_START__'] = (isset($object->first_subscription_date_start) ?
dol_print_date($object->first_subscription_date_start,
'day') :
'');
8356 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_END__'] = (isset($object->first_subscription_date_end) ?
dol_print_date($object->first_subscription_date_end,
'day') :
'');
8357 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE__'] =
dol_print_date($object->last_subscription_date,
'day');
8358 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_START__'] =
dol_print_date($object->last_subscription_date_start,
'day');
8359 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_END__'] =
dol_print_date($object->last_subscription_date_end,
'day');
8362 if (is_object($object) && $object->element ==
'societe') {
8363 $substitutionarray[
'__THIRDPARTY_ID__'] = (is_object($object) ? $object->id :
'');
8364 $substitutionarray[
'__THIRDPARTY_NAME__'] = (is_object($object) ? $object->name :
'');
8365 $substitutionarray[
'__THIRDPARTY_NAME_ALIAS__'] = (is_object($object) ? $object->name_alias :
'');
8366 $substitutionarray[
'__THIRDPARTY_CODE_CLIENT__'] = (is_object($object) ? $object->code_client :
'');
8367 $substitutionarray[
'__THIRDPARTY_CODE_FOURNISSEUR__'] = (is_object($object) ? $object->code_fournisseur :
'');
8368 $substitutionarray[
'__THIRDPARTY_EMAIL__'] = (is_object($object) ? $object->email :
'');
8369 $substitutionarray[
'__THIRDPARTY_PHONE__'] = (is_object($object) ?
dol_print_phone($object->phone) :
'');
8370 $substitutionarray[
'__THIRDPARTY_FAX__'] = (is_object($object) ?
dol_print_phone($object->fax) :
'');
8371 $substitutionarray[
'__THIRDPARTY_ADDRESS__'] = (is_object($object) ? $object->address :
'');
8372 $substitutionarray[
'__THIRDPARTY_ZIP__'] = (is_object($object) ? $object->zip :
'');
8373 $substitutionarray[
'__THIRDPARTY_TOWN__'] = (is_object($object) ? $object->town :
'');
8374 $substitutionarray[
'__THIRDPARTY_COUNTRY_ID__'] = (is_object($object) ? $object->country_id :
'');
8375 $substitutionarray[
'__THIRDPARTY_COUNTRY_CODE__'] = (is_object($object) ? $object->country_code :
'');
8376 $substitutionarray[
'__THIRDPARTY_IDPROF1__'] = (is_object($object) ? $object->idprof1 :
'');
8377 $substitutionarray[
'__THIRDPARTY_IDPROF2__'] = (is_object($object) ? $object->idprof2 :
'');
8378 $substitutionarray[
'__THIRDPARTY_IDPROF3__'] = (is_object($object) ? $object->idprof3 :
'');
8379 $substitutionarray[
'__THIRDPARTY_IDPROF4__'] = (is_object($object) ? $object->idprof4 :
'');
8380 $substitutionarray[
'__THIRDPARTY_IDPROF5__'] = (is_object($object) ? $object->idprof5 :
'');
8381 $substitutionarray[
'__THIRDPARTY_IDPROF6__'] = (is_object($object) ? $object->idprof6 :
'');
8382 $substitutionarray[
'__THIRDPARTY_TVAINTRA__'] = (is_object($object) ? $object->tva_intra :
'');
8383 $substitutionarray[
'__THIRDPARTY_NOTE_PUBLIC__'] = (is_object($object) ?
dol_htmlentitiesbr($object->note_public) :
'');
8384 $substitutionarray[
'__THIRDPARTY_NOTE_PRIVATE__'] = (is_object($object) ?
dol_htmlentitiesbr($object->note_private) :
'');
8385 } elseif (is_object($object->thirdparty)) {
8386 $substitutionarray[
'__THIRDPARTY_ID__'] = (is_object($object->thirdparty) ? $object->thirdparty->id :
'');
8387 $substitutionarray[
'__THIRDPARTY_NAME__'] = (is_object($object->thirdparty) ? $object->thirdparty->name :
'');
8388 $substitutionarray[
'__THIRDPARTY_NAME_ALIAS__'] = (is_object($object->thirdparty) ? $object->thirdparty->name_alias :
'');
8389 $substitutionarray[
'__THIRDPARTY_CODE_CLIENT__'] = (is_object($object->thirdparty) ? $object->thirdparty->code_client :
'');
8390 $substitutionarray[
'__THIRDPARTY_CODE_FOURNISSEUR__'] = (is_object($object->thirdparty) ? $object->thirdparty->code_fournisseur :
'');
8391 $substitutionarray[
'__THIRDPARTY_EMAIL__'] = (is_object($object->thirdparty) ? $object->thirdparty->email :
'');
8392 $substitutionarray[
'__THIRDPARTY_PHONE__'] = (is_object($object->thirdparty) ?
dol_print_phone($object->thirdparty->phone) :
'');
8393 $substitutionarray[
'__THIRDPARTY_FAX__'] = (is_object($object->thirdparty) ?
dol_print_phone($object->thirdparty->fax) :
'');
8394 $substitutionarray[
'__THIRDPARTY_ADDRESS__'] = (is_object($object->thirdparty) ? $object->thirdparty->address :
'');
8395 $substitutionarray[
'__THIRDPARTY_ZIP__'] = (is_object($object->thirdparty) ? $object->thirdparty->zip :
'');
8396 $substitutionarray[
'__THIRDPARTY_TOWN__'] = (is_object($object->thirdparty) ? $object->thirdparty->town :
'');
8397 $substitutionarray[
'__THIRDPARTY_COUNTRY_ID__'] = (is_object($object->thirdparty) ? $object->thirdparty->country_id :
'');
8398 $substitutionarray[
'__THIRDPARTY_COUNTRY_CODE__'] = (is_object($object->thirdparty) ? $object->thirdparty->country_code :
'');
8399 $substitutionarray[
'__THIRDPARTY_IDPROF1__'] = (is_object($object->thirdparty) ? $object->thirdparty->idprof1 :
'');
8400 $substitutionarray[
'__THIRDPARTY_IDPROF2__'] = (is_object($object->thirdparty) ? $object->thirdparty->idprof2 :
'');
8401 $substitutionarray[
'__THIRDPARTY_IDPROF3__'] = (is_object($object->thirdparty) ? $object->thirdparty->idprof3 :
'');
8402 $substitutionarray[
'__THIRDPARTY_IDPROF4__'] = (is_object($object->thirdparty) ? $object->thirdparty->idprof4 :
'');
8403 $substitutionarray[
'__THIRDPARTY_IDPROF5__'] = (is_object($object->thirdparty) ? $object->thirdparty->idprof5 :
'');
8404 $substitutionarray[
'__THIRDPARTY_IDPROF6__'] = (is_object($object->thirdparty) ? $object->thirdparty->idprof6 :
'');
8405 $substitutionarray[
'__THIRDPARTY_TVAINTRA__'] = (is_object($object->thirdparty) ? $object->thirdparty->tva_intra :
'');
8406 $substitutionarray[
'__THIRDPARTY_NOTE_PUBLIC__'] = (is_object($object->thirdparty) ?
dol_htmlentitiesbr($object->thirdparty->note_public) :
'');
8407 $substitutionarray[
'__THIRDPARTY_NOTE_PRIVATE__'] = (is_object($object->thirdparty) ?
dol_htmlentitiesbr($object->thirdparty->note_private) :
'');
8410 if (is_object($object) && $object->element ==
'recruitmentcandidature') {
8411 $substitutionarray[
'__CANDIDATE_FULLNAME__'] = $object->getFullName($outputlangs);
8412 $substitutionarray[
'__CANDIDATE_FIRSTNAME__'] = isset($object->firstname) ? $object->firstname :
'';
8413 $substitutionarray[
'__CANDIDATE_LASTNAME__'] = isset($object->lastname) ? $object->lastname :
'';
8415 if (is_object($object) && $object->element ==
'conferenceorboothattendee') {
8416 $substitutionarray[
'__ATTENDEE_FULLNAME__'] = $object->getFullName($outputlangs);
8417 $substitutionarray[
'__ATTENDEE_FIRSTNAME__'] = isset($object->firstname) ? $object->firstname :
'';
8418 $substitutionarray[
'__ATTENDEE_LASTNAME__'] = isset($object->lastname) ? $object->lastname :
'';
8421 if (is_object($object) && $object->element ==
'project') {
8422 $substitutionarray[
'__PROJECT_ID__'] = $object->id;
8423 $substitutionarray[
'__PROJECT_REF__'] = $object->ref;
8424 $substitutionarray[
'__PROJECT_NAME__'] = $object->title;
8425 } elseif (is_object($object)) {
8427 if (!empty($object->project)) {
8428 $project = $object->project;
8429 } elseif (!empty($object->projet)) {
8430 $project = $object->projet;
8432 if (!is_null($project) && is_object($project)) {
8433 $substitutionarray[
'__PROJECT_ID__'] = $project->id;
8434 $substitutionarray[
'__PROJECT_REF__'] = $project->ref;
8435 $substitutionarray[
'__PROJECT_NAME__'] = $project->title;
8439 if (!empty($object->fk_project) && $object->fk_project > 0) {
8440 $project_id = $object->fk_project;
8441 } elseif (!empty($object->fk_projet) && $object->fk_projet > 0) {
8442 $project_id = $object->fk_project;
8444 if ($project_id > 0) {
8446 $substitutionarray[
'__PROJECT_ID__@lazyload'] =
'/projet/class/project.class.php:Project:fetchAndSetSubstitution:' . $project_id;
8447 $substitutionarray[
'__PROJECT_REF__@lazyload'] =
'/projet/class/project.class.php:Project:fetchAndSetSubstitution:' . $project_id;
8448 $substitutionarray[
'__PROJECT_NAME__@lazyload'] =
'/projet/class/project.class.php:Project:fetchAndSetSubstitution:' . $project_id;
8453 if (is_object($object) && $object->element ==
'shipping') {
8454 $substitutionarray[
'__SHIPPINGTRACKNUM__'] = $object->tracking_number;
8455 $substitutionarray[
'__SHIPPINGTRACKNUMURL__'] = $object->tracking_url;
8456 $substitutionarray[
'__SHIPPINGMETHOD__'] = $object->shipping_method;
8458 if (is_object($object) && $object->element ==
'reception') {
8459 $substitutionarray[
'__RECEPTIONTRACKNUM__'] = $object->tracking_number;
8460 $substitutionarray[
'__RECEPTIONTRACKNUMURL__'] = $object->tracking_url;
8463 if (is_object($object) && $object->element ==
'contrat' && $object->id > 0 && is_array($object->lines)) {
8464 $dateplannedstart =
'';
8465 $datenextexpiration =
'';
8466 foreach ($object->lines as $line) {
8467 if ($line->date_start > $dateplannedstart) {
8468 $dateplannedstart = $line->date_start;
8470 if ($line->statut == 4 && $line->date_end && (!$datenextexpiration || $line->date_end < $datenextexpiration)) {
8471 $datenextexpiration = $line->date_end;
8474 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATE__'] =
dol_print_date($dateplannedstart,
'day');
8475 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATETIME__'] =
dol_print_date($dateplannedstart,
'standard');
8476 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATE__'] =
dol_print_date($datenextexpiration,
'day');
8477 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATETIME__'] =
dol_print_date($datenextexpiration,
'standard');
8480 if (is_object($object) && $object->element ==
'ticket') {
8481 $substitutionarray[
'__TICKET_TRACKID__'] = $object->track_id;
8482 $substitutionarray[
'__REF__'] = $object->ref;
8483 $substitutionarray[
'__TICKET_SUBJECT__'] = $object->subject;
8484 $substitutionarray[
'__TICKET_TYPE__'] = $object->type_code;
8485 $substitutionarray[
'__TICKET_SEVERITY__'] = $object->severity_code;
8486 $substitutionarray[
'__TICKET_CATEGORY__'] = $object->category_code;
8487 $substitutionarray[
'__TICKET_ANALYTIC_CODE__'] = $object->category_code;
8488 $substitutionarray[
'__TICKET_MESSAGE__'] = $object->message;
8489 $substitutionarray[
'__TICKET_PROGRESSION__'] = $object->progress;
8490 $userstat =
new User($db);
8491 if ($object->fk_user_assign > 0) {
8492 $userstat->fetch($object->fk_user_assign);
8493 $substitutionarray[
'__TICKET_USER_ASSIGN__'] =
dolGetFirstLastname($userstat->firstname, $userstat->lastname);
8496 if ($object->fk_user_create > 0) {
8497 $userstat->fetch($object->fk_user_create);
8498 $substitutionarray[
'__USER_CREATE__'] =
dolGetFirstLastname($userstat->firstname, $userstat->lastname);
8503 if ($object->table_element && $object->id > 0) {
8504 if (!is_object($extrafields)) {
8507 $extrafields->fetch_name_optionals_label($object->table_element,
true);
8509 if ($object->fetch_optionals() > 0) {
8510 if (is_array($extrafields->attributes[$object->table_element][
'label']) && count($extrafields->attributes[$object->table_element][
'label']) > 0) {
8511 foreach ($extrafields->attributes[$object->table_element][
'label'] as $key => $label) {
8512 if ($extrafields->attributes[$object->table_element][
'type'][$key] ==
'date') {
8513 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] =
dol_print_date($object->array_options[
'options_'.$key],
'day');
8514 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_LOCALE__'] =
dol_print_date($object->array_options[
'options_'.$key],
'day',
'tzserver', $outputlangs);
8515 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_RFC__'] =
dol_print_date($object->array_options[
'options_'.$key],
'dayrfc');
8516 } elseif ($extrafields->attributes[$object->table_element][
'type'][$key] ==
'datetime') {
8517 $datetime = $object->array_options[
'options_'.$key];
8518 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'dayhour') :
'');
8519 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_LOCALE__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'dayhour',
'tzserver', $outputlangs) :
'');
8520 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_DAY_LOCALE__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'day',
'tzserver', $outputlangs) :
'');
8521 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_RFC__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'dayhourrfc') :
'');
8522 } elseif ($extrafields->attributes[$object->table_element][
'type'][$key] ==
'phone') {
8523 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] =
dol_print_phone($object->array_options[
'options_'.$key]);
8524 } elseif ($extrafields->attributes[$object->table_element][
'type'][$key] ==
'price') {
8525 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] = $object->array_options[
'options_'.$key];
8526 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_FORMATED__'] =
price($object->array_options[
'options_'.$key]);
8527 } elseif ($extrafields->attributes[$object->table_element][
'type'][$key] !=
'separator') {
8528 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] = !empty($object->array_options[
'options_'.$key]) ? $object->array_options[
'options_'.$key] :
'';
8537 if (empty($substitutionarray[
'__REF__'])) {
8541 require_once DOL_DOCUMENT_ROOT.
'/core/lib/payments.lib.php';
8542 $outputlangs->loadLangs(array(
'paypal',
'other'));
8545 $typeforonlinepayment =
'free';
8546 if (is_object($object) && $object->element ==
'commande') {
8547 $typeforonlinepayment =
'order';
8549 if (is_object($object) && $object->element ==
'facture') {
8550 $typeforonlinepayment =
'invoice';
8552 if (is_object($object) && $object->element ==
'member') {
8553 $typeforonlinepayment =
'member';
8554 if (!empty($object->last_subscription_amount)) {
8555 $amounttouse = $object->last_subscription_amount;
8558 if (is_object($object) && $object->element ==
'contrat') {
8559 $typeforonlinepayment =
'contract';
8561 if (is_object($object) && $object->element ==
'fichinter') {
8562 $typeforonlinepayment =
'ficheinter';
8565 $url = getOnlinePaymentUrl(0, $typeforonlinepayment, $substitutionarray[
'__REF__'], $amounttouse);
8569 if ($object->id > 0) {
8570 $substitutionarray[
'__ONLINE_PAYMENT_TEXT_AND_URL__'] = ($paymenturl ? str_replace(
'\n',
"\n", $outputlangs->trans(
"PredefinedMailContentLink", $paymenturl)) :
'');
8571 $substitutionarray[
'__ONLINE_PAYMENT_URL__'] = $paymenturl;
8573 if (
getDolGlobalString(
'PROPOSAL_ALLOW_EXTERNAL_DOWNLOAD') && is_object($object) && $object->element ==
'propal') {
8574 $substitutionarray[
'__DIRECTDOWNLOAD_URL_PROPOSAL__'] = $object->getLastMainDocLink($object->element);
8576 $substitutionarray[
'__DIRECTDOWNLOAD_URL_PROPOSAL__'] =
'';
8578 if (
getDolGlobalString(
'ORDER_ALLOW_EXTERNAL_DOWNLOAD') && is_object($object) && $object->element ==
'commande') {
8579 $substitutionarray[
'__DIRECTDOWNLOAD_URL_ORDER__'] = $object->getLastMainDocLink($object->element);
8581 $substitutionarray[
'__DIRECTDOWNLOAD_URL_ORDER__'] =
'';
8583 if (
getDolGlobalString(
'INVOICE_ALLOW_EXTERNAL_DOWNLOAD') && is_object($object) && $object->element ==
'facture') {
8584 $substitutionarray[
'__DIRECTDOWNLOAD_URL_INVOICE__'] = $object->getLastMainDocLink($object->element);
8586 $substitutionarray[
'__DIRECTDOWNLOAD_URL_INVOICE__'] =
'';
8588 if (
getDolGlobalString(
'CONTRACT_ALLOW_EXTERNAL_DOWNLOAD') && is_object($object) && $object->element ==
'contrat') {
8589 $substitutionarray[
'__DIRECTDOWNLOAD_URL_CONTRACT__'] = $object->getLastMainDocLink($object->element);
8591 $substitutionarray[
'__DIRECTDOWNLOAD_URL_CONTRACT__'] =
'';
8593 if (
getDolGlobalString(
'FICHINTER_ALLOW_EXTERNAL_DOWNLOAD') && is_object($object) && $object->element ==
'fichinter') {
8594 $substitutionarray[
'__DIRECTDOWNLOAD_URL_FICHINTER__'] = $object->getLastMainDocLink($object->element);
8596 $substitutionarray[
'__DIRECTDOWNLOAD_URL_FICHINTER__'] =
'';
8598 if (
getDolGlobalString(
'SUPPLIER_PROPOSAL_ALLOW_EXTERNAL_DOWNLOAD') && is_object($object) && $object->element ==
'supplier_proposal') {
8599 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_PROPOSAL__'] = $object->getLastMainDocLink($object->element);
8601 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_PROPOSAL__'] =
'';
8604 if (is_object($object) && $object->element ==
'propal') {
8605 $substitutionarray[
'__URL_PROPOSAL__'] = DOL_MAIN_URL_ROOT.
"/comm/propal/card.php?id=".$object->id;
8606 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
8607 $substitutionarray[
'__ONLINE_SIGN_URL__'] = getOnlineSignatureUrl(0,
'proposal', $object->ref);
8609 if (is_object($object) && $object->element ==
'commande') {
8610 $substitutionarray[
'__URL_ORDER__'] = DOL_MAIN_URL_ROOT.
"/commande/card.php?id=".$object->id;
8612 if (is_object($object) && $object->element ==
'facture') {
8613 $substitutionarray[
'__URL_INVOICE__'] = DOL_MAIN_URL_ROOT.
"/compta/facture/card.php?id=".$object->id;
8615 if (is_object($object) && $object->element ==
'contrat') {
8616 $substitutionarray[
'__URL_CONTRACT__'] = DOL_MAIN_URL_ROOT.
"/contrat/card.php?id=".$object->id;
8617 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
8618 $substitutionarray[
'__ONLINE_SIGN_URL__'] = getOnlineSignatureUrl(0,
'contract', $object->ref);
8620 if (is_object($object) && $object->element ==
'fichinter') {
8621 $substitutionarray[
'__URL_FICHINTER__'] = DOL_MAIN_URL_ROOT.
"/fichinter/card.php?id=".$object->id;
8622 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
8623 $substitutionarray[
'__ONLINE_SIGN_FICHINTER_URL__'] = getOnlineSignatureUrl(0,
'fichinter', $object->ref);
8625 if (is_object($object) && $object->element ==
'supplier_proposal') {
8626 $substitutionarray[
'__URL_SUPPLIER_PROPOSAL__'] = DOL_MAIN_URL_ROOT.
"/supplier_proposal/card.php?id=".$object->id;
8628 if (is_object($object) && $object->element ==
'shipping') {
8629 $substitutionarray[
'__URL_SHIPMENT__'] = DOL_MAIN_URL_ROOT.
"/expedition/card.php?id=".$object->id;
8633 if (is_object($object) && $object->element ==
'action') {
8634 $substitutionarray[
'__EVENT_LABEL__'] = $object->label;
8635 $substitutionarray[
'__EVENT_TYPE__'] = $outputlangs->trans(
"Action".$object->type_code);
8636 $substitutionarray[
'__EVENT_DATE__'] =
dol_print_date($object->datep,
'day',
'auto', $outputlangs);
8637 $substitutionarray[
'__EVENT_TIME__'] =
dol_print_date($object->datep,
'hour',
'auto', $outputlangs);
8641 if ((empty($exclude) || !in_array(
'objectamount', $exclude)) && (empty($include) || in_array(
'objectamount', $include))) {
8642 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functionsnumtoword.lib.php';
8644 $substitutionarray[
'__DATE_YMD__'] = is_object($object) ? (isset($object->date) ?
dol_print_date($object->date,
'day', 0, $outputlangs) :
null) :
'';
8645 $substitutionarray[
'__DATE_DUE_YMD__'] = is_object($object) ? (isset($object->date_lim_reglement) ?
dol_print_date($object->date_lim_reglement,
'day', 0, $outputlangs) :
null) :
'';
8647 $already_payed_all = 0;
8648 if (is_object($object) && ($object instanceof
Facture)) {
8649 $already_payed_all = $object->sumpayed + $object->sumdeposit + $object->sumcreditnote;
8652 $substitutionarray[
'__AMOUNT_EXCL_TAX__'] = is_object($object) ? $object->total_ht :
'';
8654 $substitutionarray[
'__AMOUNT__'] = is_object($object) ? $object->total_ttc :
'';
8655 $substitutionarray[
'__AMOUNT_TEXT__'] = is_object($object) ?
dol_convertToWord($object->total_ttc, $outputlangs,
'',
true) :
'';
8656 $substitutionarray[
'__AMOUNT_TEXTCURRENCY__'] = is_object($object) ?
dol_convertToWord($object->total_ttc, $outputlangs, $conf->currency,
true) :
'';
8658 $substitutionarray[
'__AMOUNT_REMAIN__'] = is_object($object) ?
price2num($object->total_ttc - $already_payed_all,
'MT') :
'';
8660 $substitutionarray[
'__AMOUNT_VAT__'] = is_object($object) ? (isset($object->total_vat) ? $object->total_vat : $object->total_tva) :
'';
8661 $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)) :
'';
8662 $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)) :
'';
8664 if ($onlykey != 2 || $mysoc->useLocalTax(1)) {
8665 $substitutionarray[
'__AMOUNT_TAX2__'] = is_object($object) ? $object->total_localtax1 :
'';
8667 if ($onlykey != 2 || $mysoc->useLocalTax(2)) {
8668 $substitutionarray[
'__AMOUNT_TAX3__'] = is_object($object) ? $object->total_localtax2 :
'';
8672 $substitutionarray[
'__AMOUNT_EXCL_TAX_FORMATED__'] = is_object($object) ? ($object->total_ht ?
price($object->total_ht, 0, $outputlangs, 0, -1, -1, $conf->currency) :
null) :
'';
8673 $substitutionarray[
'__AMOUNT_FORMATED__'] = is_object($object) ? ($object->total_ttc ?
price($object->total_ttc, 0, $outputlangs, 0, -1, -1, $conf->currency) :
null) :
'';
8674 $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) :
'';
8675 $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)) :
'';
8676 if ($onlykey != 2 || $mysoc->useLocalTax(1)) {
8677 $substitutionarray[
'__AMOUNT_TAX2_FORMATED__'] = is_object($object) ? ($object->total_localtax1 ?
price($object->total_localtax1, 0, $outputlangs, 0, -1, -1, $conf->currency) :
null) :
'';
8679 if ($onlykey != 2 || $mysoc->useLocalTax(2)) {
8680 $substitutionarray[
'__AMOUNT_TAX3_FORMATED__'] = is_object($object) ? ($object->total_localtax2 ?
price($object->total_localtax2, 0, $outputlangs, 0, -1, -1, $conf->currency) :
null) :
'';
8683 $substitutionarray[
'__AMOUNT_MULTICURRENCY__'] = (is_object($object) && isset($object->multicurrency_total_ttc)) ? $object->multicurrency_total_ttc :
'';
8684 $substitutionarray[
'__AMOUNT_MULTICURRENCY_TEXT__'] = (is_object($object) && isset($object->multicurrency_total_ttc)) ?
dol_convertToWord($object->multicurrency_total_ttc, $outputlangs,
'',
true) :
'';
8685 $substitutionarray[
'__AMOUNT_MULTICURRENCY_TEXTCURRENCY__'] = (is_object($object) && isset($object->multicurrency_total_ttc)) ?
dol_convertToWord($object->multicurrency_total_ttc, $outputlangs, $object->multicurrency_code,
true) :
'';
8689 if ($onlykey != 2) {
8690 $substitutionarray[
'__TOTAL_TTC__'] = is_object($object) ? $object->total_ttc :
'';
8691 $substitutionarray[
'__TOTAL_HT__'] = is_object($object) ? $object->total_ht :
'';
8692 $substitutionarray[
'__TOTAL_VAT__'] = is_object($object) ? (isset($object->total_vat) ? $object->total_vat : $object->total_tva) :
'';
8697 if ((empty($exclude) || !in_array(
'date', $exclude)) && (empty($include) || in_array(
'date', $include))) {
8698 include_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
8708 $daytext = $outputlangs->trans(
'Day'.$tmp[
'wday']);
8710 $substitutionarray = array_merge($substitutionarray, array(
8711 '__NOW_TMS__' => (
string) $now,
8712 '__NOW_TMS_YMD__' =>
dol_print_date($now,
'day',
'auto', $outputlangs),
8713 '__DAY__' => (
string) $tmp[
'mday'],
8714 '__DAY_TEXT__' => $daytext,
8715 '__DAY_TEXT_SHORT__' =>
dol_trunc($daytext, 3,
'right',
'UTF-8', 1),
8716 '__DAY_TEXT_MIN__' =>
dol_trunc($daytext, 1,
'right',
'UTF-8', 1),
8717 '__MONTH__' => (
string) $tmp[
'mon'],
8718 '__MONTH_TEXT__' => $outputlangs->trans(
'Month'.sprintf(
"%02d", $tmp[
'mon'])),
8719 '__MONTH_TEXT_SHORT__' => $outputlangs->trans(
'MonthShort'.sprintf(
"%02d", $tmp[
'mon'])),
8720 '__MONTH_TEXT_MIN__' => $outputlangs->trans(
'MonthVeryShort'.sprintf(
"%02d", $tmp[
'mon'])),
8721 '__YEAR__' => (
string) $tmp[
'year'],
8722 '__PREVIOUS_DAY__' => (
string) $tmp2[
'day'],
8723 '__PREVIOUS_MONTH__' => (
string) $tmp3[
'month'],
8724 '__PREVIOUS_YEAR__' => (
string) ($tmp[
'year'] - 1),
8725 '__NEXT_DAY__' => (
string) $tmp4[
'day'],
8726 '__NEXT_MONTH__' => (
string) $tmp5[
'month'],
8727 '__NEXT_MONTH_TEXT__' => $outputlangs->trans(
'Month'.sprintf(
"%02d", $tmp5[
'month'])),
8728 '__NEXT_MONTH_TEXT_SHORT__' => $outputlangs->trans(
'MonthShort'.sprintf(
"%02d", $tmp5[
'month'])),
8729 '__NEXT_MONTH_TEXT_MIN__' => $outputlangs->trans(
'MonthVeryShort'.sprintf(
"%02d", $tmp5[
'month'])),
8730 '__NEXT_YEAR__' => (
string) ($tmp[
'year'] + 1),
8734 if (isModEnabled(
'multicompany')) {
8735 $substitutionarray = array_merge($substitutionarray, array(
'__ENTITY_ID__' => $conf->entity));
8737 if ((empty($exclude) || !in_array(
'system', $exclude)) && (empty($include) || in_array(
'user', $include))) {
8738 $substitutionarray[
'__DOL_MAIN_URL_ROOT__'] = DOL_MAIN_URL_ROOT;
8739 $substitutionarray[
'__(AnyTranslationKey)__'] = $outputlangs->trans(
'TranslationOfKey');
8740 $substitutionarray[
'__(AnyTranslationKey|langfile)__'] = $outputlangs->trans(
'TranslationOfKey').
' (load also language file before)';
8741 $substitutionarray[
'__[AnyConstantKey]__'] = $outputlangs->trans(
'ValueOfConstantKey');
8746 return $substitutionarray;
8765function make_substitutions($text, $substitutionarray, $outputlangs =
null, $converttextinhtmlifnecessary = 0)
8767 global $conf, $db, $langs;
8769 if (!is_array($substitutionarray)) {
8770 return 'ErrorBadParameterSubstitutionArrayWhenCalling_make_substitutions';
8773 if (empty($outputlangs)) {
8774 $outputlangs = $langs;
8784 if (is_object($outputlangs)) {
8786 while (preg_match(
'/__\(([^\)]+)\)__/', $text, $reg)) {
8788 $tmp = explode(
'|', $reg[1]);
8789 if (!empty($tmp[1])) {
8790 $outputlangs->load($tmp[1]);
8793 $value = $outputlangs->transnoentitiesnoconv($reg[1]);
8795 if (empty($converttextinhtmlifnecessary)) {
8797 $text = preg_replace(
'/__\('.preg_quote($reg[1],
'/').
'\)__/', $msgishtml ?
dol_htmlentitiesbr($value) : $value, $text);
8811 $text = preg_replace(
'/__\('.preg_quote($reg[1],
'/').
'\)__/', $value, $text);
8819 while (preg_match(
'/__\[([^\]]+)\]__/', $text, $reg)) {
8820 $keyfound = $reg[1];
8822 $value =
'*****forbidden*****';
8824 $value = empty($conf->global->$keyfound) ?
'' : $conf->global->$keyfound;
8827 if (empty($converttextinhtmlifnecessary)) {
8829 $text = preg_replace(
'/__\['.preg_quote($keyfound,
'/').
'\]__/', $msgishtml ?
dol_htmlentitiesbr($value) : $value, $text);
8842 $text = preg_replace(
'/__\['.preg_quote($keyfound,
'/').
'\]__/', $value, $text);
8847 foreach ($substitutionarray as $key => $value) {
8848 if (!isset($value)) {
8852 if (($key ==
'__USER_SIGNATURE__' || $key ==
'__SENDEREMAIL_SIGNATURE__') && (
getDolGlobalString(
'MAIN_MAIL_DO_NOT_USE_SIGN'))) {
8856 if (empty($converttextinhtmlifnecessary)) {
8857 $text = str_replace(
"$key",
"$value", $text);
8869 $text = str_replace(
"$key",
"$value", $text);
8885 $memory_object_list = array();
8886 foreach ($substitutionarray as $key => $value) {
8887 $lazy_load_arr = array();
8888 if (preg_match(
'/(__[A-Z\_]+__)@lazyload$/', $key, $lazy_load_arr)) {
8889 if (isset($lazy_load_arr[1]) && !empty($lazy_load_arr[1])) {
8890 $key_to_substitute = $lazy_load_arr[1];
8891 if (preg_match(
'/' . preg_quote($key_to_substitute,
'/') .
'/', $text)) {
8892 $param_arr = explode(
':', $value);
8894 if (count($param_arr) == 4) {
8895 $path = $param_arr[0];
8896 $class = $param_arr[1];
8897 $method = $param_arr[2];
8898 $id = (int) $param_arr[3];
8901 if (!isset($memory_object_list[$class])) {
8903 require_once DOL_DOCUMENT_ROOT . $path;
8904 if (class_exists($class)) {
8905 $memory_object_list[$class] = array(
8913 if (isset($memory_object_list[$class]) && isset($memory_object_list[$class][
'list'])) {
8914 if (method_exists($class, $method)) {
8915 if (!isset($memory_object_list[$class][
'list'][$id])) {
8916 $tmpobj =
new $class($db);
8917 $valuetouseforsubstitution = $tmpobj->$method($id, $key_to_substitute);
8918 $memory_object_list[$class][
'list'][$id] = $tmpobj;
8920 $tmpobj = $memory_object_list[$class][
'list'][$id];
8921 $valuetouseforsubstitution = $tmpobj->$method($id, $key_to_substitute,
true);
8924 $text = str_replace(
"$key_to_substitute",
"$valuetouseforsubstitution", $text);
8950 global $conf, $user;
8952 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
8957 $dirsubstitutions = array_merge(array(), (array) $conf->modules_parts[
'substitutions']);
8959 foreach ($dirsubstitutions as $reldir) {
8967 $substitfiles =
dol_dir_list($dir,
'files', 0,
'functions_');
8968 foreach ($substitfiles as $substitfile) {
8970 if (preg_match(
'/functions_(.*)\.lib\.php/i', $substitfile[
'name'], $reg)) {
8973 dol_syslog(
"Library ".$substitfile[
'name'].
" found into ".$dir);
8975 require_once $dir.$substitfile[
'name'];
8977 $function_name = $module.
"_".$callfunc;
8978 if (function_exists($function_name)) {
8979 $function_name($substitutionarray, $outputlangs, $object, $parameters);
8987 foreach ($substitutionarray as $key => $value) {
8988 $tags .=
'{'.$key.
'} => '.$value.
"\n";
8990 $substitutionarray = array_merge($substitutionarray, array(
'__ALL_TAGS__' => $tags));
9005 print
get_date_range($date_start, $date_end, $format, $outputlangs);
9018function get_date_range($date_start, $date_end, $format =
'', $outputlangs =
'', $withparenthesis = 1)
9024 if (!is_object($outputlangs)) {
9025 $outputlangs = $langs;
9028 if ($date_start && $date_end) {
9029 $out .= ($withparenthesis ?
' (' :
'').$outputlangs->transnoentitiesnoconv(
'DateFromTo',
dol_print_date($date_start, $format,
false, $outputlangs),
dol_print_date($date_end, $format,
false, $outputlangs)).($withparenthesis ?
')' :
'');
9031 if ($date_start && !$date_end) {
9032 $out .= ($withparenthesis ?
' (' :
'').$outputlangs->transnoentitiesnoconv(
'DateFrom',
dol_print_date($date_start, $format,
false, $outputlangs)).($withparenthesis ?
')' :
'');
9034 if (!$date_start && $date_end) {
9035 $out .= ($withparenthesis ?
' (' :
'').$outputlangs->transnoentitiesnoconv(
'DateUntil',
dol_print_date($date_end, $format,
false, $outputlangs)).($withparenthesis ?
')' :
'');
9055 if ($nameorder < 0) {
9058 if ($nameorder == 1) {
9060 if ($firstname && $lastname) {
9064 } elseif ($nameorder == 2 || $nameorder == 3) {
9066 if (empty($ret) && $nameorder == 3) {
9071 if (empty($ret) && $nameorder == 5) {
9074 if ($nameorder == 0) {
9075 if ($firstname && $lastname) {
9099 if (!is_array($mesgs)) {
9100 $mesgs = trim((
string) $mesgs);
9103 if (!empty($noduplicate) && isset($_SESSION[
'dol_events'][$style]) && in_array($mesgs, $_SESSION[
'dol_events'][$style])) {
9106 $_SESSION[
'dol_events'][$style][] = $mesgs;
9110 foreach ($mesgs as $mesg) {
9111 $mesg = trim((
string) $mesg);
9113 if (!empty($noduplicate) && isset($_SESSION[
'dol_events'][$style]) && in_array($mesg, $_SESSION[
'dol_events'][$style])) {
9116 $_SESSION[
'dol_events'][$style][] = $mesg;
9136 if (empty($mesg) && empty($mesgs)) {
9137 dol_syslog(
"Try to add a message in stack, but value to add is empty message", LOG_WARNING);
9144 if (empty($messagekey) || empty($_COOKIE[
"DOLHIDEMESSAGE".$messagekey])) {
9145 if (!in_array((
string) $style, array(
'mesgs',
'warnings',
'errors'))) {
9146 dol_print_error(
'',
'Bad parameter style='.$style.
' for setEventMessages');
9148 if (empty($mesgs)) {
9151 if (!empty($mesg) && !in_array($mesg, $mesgs)) {
9172 if (isset($_SESSION[
'dol_events'][
'mesgs'])) {
9173 if (empty($disabledoutputofmessages)) {
9176 unset($_SESSION[
'dol_events'][
'mesgs']);
9179 if (isset($_SESSION[
'dol_events'][
'errors'])) {
9180 if (empty($disabledoutputofmessages)) {
9183 unset($_SESSION[
'dol_events'][
'errors']);
9187 if (isset($_SESSION[
'dol_events'][
'warnings'])) {
9188 if (empty($disabledoutputofmessages)) {
9191 unset($_SESSION[
'dol_events'][
'warnings']);
9211 global $conf, $langs;
9216 $divstart = $divend =
'';
9219 if ((empty($conf->use_javascript_ajax) ||
getDolGlobalString(
'MAIN_DISABLE_JQUERY_JNOTIFY') || $keepembedded) && !preg_match(
'/<div class=".*">/i', $out)) {
9220 $divstart =
'<div class="'.$style.
' clearboth">';
9224 if ((is_array($mesgarray) && count($mesgarray)) || $mesgstring) {
9225 $langs->load(
"errors");
9227 if (is_array($mesgarray) && count($mesgarray)) {
9228 foreach ($mesgarray as $message) {
9230 $out .= $langs->trans($message);
9231 if ($ret < count($mesgarray)) {
9238 $out .= $langs->trans($mesgstring);
9244 if (!empty($conf->use_javascript_ajax) && !
getDolGlobalString(
'MAIN_DISABLE_JQUERY_JNOTIFY') && empty($keepembedded)) {
9245 $return =
'<script nonce="'.getNonce().
'">
9246 $(document).ready(function() {
9251 /* jnotify(message, preset of message type, keepmessage) */
9253 "'.($style ==
"ok" ? 3000 : $style).
'",
9254 '.($style ==
"ok" ?
"false" :
"true").
',
9255 { remove: function (){} } );
9298 if (empty($mesgstring) && (!is_array($mesgarray) || count($mesgarray) == 0)) {
9304 if (is_array($mesgarray)) {
9305 foreach ($mesgarray as $val) {
9306 if ($val && preg_match(
'/class="error"/i', $val)) {
9310 if ($val && preg_match(
'/class="warning"/i', $val)) {
9315 } elseif ($mesgstring && preg_match(
'/class="error"/i', $mesgstring)) {
9317 } elseif ($mesgstring && preg_match(
'/class="warning"/i', $mesgstring)) {
9320 if ($style ==
'error') {
9323 if ($style ==
'warning') {
9327 if ($iserror || $iswarning) {
9329 $mesgstring = preg_replace(
'/<\/div><div class="(error|warning)">/',
'<br>', $mesgstring);
9330 $mesgstring = preg_replace(
'/<div class="(error|warning)">/',
'', $mesgstring);
9331 $mesgstring = preg_replace(
'/<\/div>/',
'', $mesgstring);
9333 if (is_array($mesgarray)) {
9334 $newmesgarray = array();
9335 foreach ($mesgarray as $val) {
9336 if (is_string($val)) {
9337 $tmpmesgstring = preg_replace(
'/<\/div><div class="(error|warning)">/',
'<br>', $val);
9338 $tmpmesgstring = preg_replace(
'/<div class="(error|warning)">/',
'', $tmpmesgstring);
9339 $tmpmesgstring = preg_replace(
'/<\/div>/',
'', $tmpmesgstring);
9340 $newmesgarray[] = $tmpmesgstring;
9342 dol_syslog(
"Error call of dol_htmloutput_mesg with an array with a value that is not a string", LOG_WARNING);
9345 $mesgarray = $newmesgarray;
9347 print
get_htmloutput_mesg($mesgstring, $mesgarray, ($iserror ?
'error' :
'warning'), $keepembedded);
9383function dol_sort_array(&$array, $index, $order =
'asc', $natsort = 0, $case_sensitive = 0, $keepindex = 0)
9386 $order = strtolower($order);
9388 if (is_array($array)) {
9389 $sizearray = count($array);
9390 if ($sizearray > 0) {
9392 foreach (array_keys($array) as $key) {
9393 if (is_object($array[$key])) {
9394 $temp[$key] = empty($array[$key]->$index) ? 0 : $array[$key]->$index;
9396 $temp[$key] = empty($array[$key][$index]) ? 0 : $array[$key][$index];
9398 if ($natsort == -1) {
9399 $temp[$key] =
'___'.$temp[$key];
9403 if (empty($natsort) || $natsort == -1) {
9404 if ($order ==
'asc') {
9410 if ($case_sensitive) {
9415 if ($order !=
'asc') {
9416 $temp = array_reverse($temp,
true);
9422 foreach (array_keys($temp) as $key) {
9423 (is_numeric($key) && empty($keepindex)) ? $sorted[] = $array[$key] : $sorted[$key] = $array[$key];
9442 $str = (string) $str;
9445 $strLength = strlen($str);
9446 for ($i = 0; $i < $strLength; $i++) {
9447 if (ord($str[$i]) < 0x80) {
9449 } elseif ((ord($str[$i]) & 0xE0) == 0xC0) {
9451 } elseif ((ord($str[$i]) & 0xF0) == 0xE0) {
9453 } elseif ((ord($str[$i]) & 0xF8) == 0xF0) {
9455 } elseif ((ord($str[$i]) & 0xFC) == 0xF8) {
9457 } elseif ((ord($str[$i]) & 0xFE) == 0xFC) {
9462 for ($j = 0; $j < $n; $j++) {
9463 if ((++$i == strlen($str)) || ((ord($str[$i]) & 0xC0) != 0x80)) {
9484 return preg_match(
'//u', $str) ? true :
false;
9496 if (function_exists(
'mb_check_encoding')) {
9498 if (!mb_check_encoding($str,
'ASCII')) {
9502 if (preg_match(
'/[^\x00-\x7f]/', $str)) {
9522 $tmp = ini_get(
"unicode.filesystem_encoding");
9523 if (empty($tmp) && !empty($_SERVER[
"WINDIR"])) {
9524 $tmp =
'iso-8859-1';
9530 $tmp = $conf->global->MAIN_FILESYSTEM_ENCODING;
9533 if ($tmp ==
'iso-8859-1') {
9534 return mb_convert_encoding($str,
'ISO-8859-1',
'UTF-8');
9554function dol_getIdFromCode($db, $key, $tablename, $fieldkey =
'code', $fieldid =
'id', $entityfilter = 0, $filters =
'')
9556 global $cache_codes;
9564 if (isset($cache_codes[$tablename][$key][$fieldid])) {
9565 return $cache_codes[$tablename][$key][$fieldid];
9568 dol_syslog(
'dol_getIdFromCode (value for field '.$fieldid.
' from key '.$key.
' not found into cache)', LOG_DEBUG);
9570 $sql =
"SELECT ".$fieldid.
" as valuetoget";
9571 $sql .=
" FROM ".MAIN_DB_PREFIX.$tablename;
9572 $sql .=
" WHERE ".$fieldkey.
" = '".$db->escape($key).
"'";
9573 if (!empty($entityfilter)) {
9574 $sql .=
" AND entity IN (".getEntity($tablename).
")";
9580 $resql = $db->query($sql);
9582 $obj = $db->fetch_object($resql);
9584 $cache_codes[$tablename][$key][$fieldid] = $obj->valuetoget;
9586 $cache_codes[$tablename][$key][$fieldid] =
'';
9589 return $cache_codes[$tablename][$key][$fieldid];
9606 if ($matchrule == 1) {
9607 if ($var ==
'mainmenu') {
9609 return (preg_match(
'/^'.$regextext.
'/', $mainmenu));
9610 } elseif ($var ==
'leftmenu') {
9612 return (preg_match(
'/^'.$regextext.
'/', $leftmenu));
9614 return 'This variable is not accessible with dol_eval';
9617 return 'This value for matchrule is not implemented';
9632 if (isset($strToEvaluate) && $strToEvaluate !==
'') {
9635 $rep =
dol_eval($strToEvaluate, 1, 1,
'1');
9636 $rights = $rep && (!is_string($rep) || strpos($rep,
'Bad string syntax to evaluate') ===
false);
9655function dol_eval($s, $returnvalue = 0, $hideerrors = 1, $onlysimplestring =
'1')
9659 global $db, $langs, $user, $website, $websitepage;
9660 global $action, $mainmenu, $leftmenu;
9662 global $objectoffield;
9668 if (!in_array($onlysimplestring, array(
'0',
'1',
'2'))) {
9669 return "Bad call of dol_eval. Parameter onlysimplestring must be '0' (deprecated), '1' or '2'";
9674 if ($onlysimplestring ==
'1') {
9677 $specialcharsallowed =
'^$_+-.*>&|=!?():"\',/@';
9679 $specialcharsallowed .=
getDolGlobalString(
'MAIN_ALLOW_UNSECURED_SPECIAL_CHARS_IN_DOL_EVAL');
9681 if (preg_match(
'/[^a-z0-9\s'.preg_quote($specialcharsallowed,
'/').
']/i', $s)) {
9683 return 'Bad string syntax to evaluate (found chars that are not chars for simplestring): '.$s;
9685 dol_syslog(
'Bad string syntax to evaluate (found chars that are not chars for simplestring): '.$s);
9691 while ($scheck && $savescheck != $scheck) {
9692 $savescheck = $scheck;
9693 $scheck = preg_replace(
'/->[a-zA-Z0-9_]+\(/',
'->__METHOD__', $scheck);
9694 $scheck = preg_replace(
'/^\(/',
'__PARENTHESIS__ ', $scheck);
9695 $scheck = preg_replace(
'/\s\(/',
'__PARENTHESIS__ ', $scheck);
9696 $scheck = preg_replace(
'/^!?[a-zA-Z0-9_]+\(/',
'__FUNCTION__', $scheck);
9697 $scheck = preg_replace(
'/\s!?[a-zA-Z0-9_]+\(/',
'__FUNCTION__', $scheck);
9698 $scheck = preg_replace(
'/(\^|\')\(/',
'__REGEXSTART__', $scheck);
9701 if (strpos($scheck,
'(') !==
false) {
9703 return 'Bad string syntax to evaluate (mode 1, found call of a function or method without using the direct name of the function): '.$s;
9705 dol_syslog(
'Bad string syntax to evaluate (mode 1, found call of a function or method without using the direct name of the function): '.$s);
9711 } elseif ($onlysimplestring ==
'2') {
9713 $specialcharsallowed =
'^$_+-.*>&|=!?():"\',/@[]';
9715 $specialcharsallowed .=
getDolGlobalString(
'MAIN_ALLOW_UNSECURED_SPECIAL_CHARS_IN_DOL_EVAL');
9717 if (preg_match(
'/[^a-z0-9\s'.preg_quote($specialcharsallowed,
'/').
']/i', $s)) {
9719 return 'Bad string syntax to evaluate (found chars that are not chars for simplestring): '.$s;
9721 dol_syslog(
'Bad string syntax to evaluate (found chars that are not chars for simplestring): '.$s);
9727 while ($scheck && $savescheck != $scheck) {
9728 $savescheck = $scheck;
9729 $scheck = preg_replace(
'/->[a-zA-Z0-9_]+\(/',
'->__METHOD__', $scheck);
9730 $scheck = preg_replace(
'/^\(/',
'__PARENTHESIS__ ', $scheck);
9731 $scheck = preg_replace(
'/\s\(/',
'__PARENTHESIS__ ', $scheck);
9732 $scheck = preg_replace(
'/^!?[a-zA-Z0-9_]+\(/',
'__FUNCTION__', $scheck);
9733 $scheck = preg_replace(
'/\s!?[a-zA-Z0-9_]+\(/',
'__FUNCTION__', $scheck);
9734 $scheck = preg_replace(
'/(\^|\')\(/',
'__REGEXSTART__', $scheck);
9737 if (strpos($scheck,
'(') !==
false) {
9739 return 'Bad string syntax to evaluate (mode 2, found call of a function or method without using the direct name of the function): '.$s;
9741 dol_syslog(
'Bad string syntax to evaluate (mode 2, found call of a function or method without using the direct name of the function): '.$s);
9748 if (is_array($s) || $s ===
'Array') {
9749 return 'Bad string syntax to evaluate (value is Array) '.var_export($s,
true);
9751 if (strpos($s,
'::') !==
false) {
9753 return 'Bad string syntax to evaluate (double : char is forbidden): '.$s;
9755 dol_syslog(
'Bad string syntax to evaluate (double : char is forbidden): '.$s);
9759 if (strpos($s,
'`') !==
false) {
9761 return 'Bad string syntax to evaluate (backtick char is forbidden): '.$s;
9763 dol_syslog(
'Bad string syntax to evaluate (backtick char is forbidden): '.$s);
9767 if (preg_match(
'/[^0-9]+\.[^0-9]+/', $s)) {
9769 return 'Bad string syntax to evaluate (dot char is forbidden): '.$s;
9771 dol_syslog(
'Bad string syntax to evaluate (dot char is forbidden): '.$s);
9777 $forbiddenphpstrings = array(
'$$');
9778 $forbiddenphpstrings = array_merge($forbiddenphpstrings, array(
'_ENV',
'_SESSION',
'_COOKIE',
'_GET',
'_POST',
'_REQUEST',
'ReflectionFunction'));
9780 $forbiddenphpfunctions = array(
"exec",
"passthru",
"shell_exec",
"system",
"proc_open",
"popen");
9781 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"dol_eval",
"executeCLI",
"verifCond"));
9782 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"base64_decode",
"rawurldecode",
"urldecode",
"str_rot13",
"hex2bin"));
9783 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"fopen",
"file_put_contents",
"fputs",
"fputscsv",
"fwrite",
"fpassthru",
"require",
"include",
"mkdir",
"rmdir",
"symlink",
"touch",
"unlink",
"umask"));
9784 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"get_defined_functions",
"get_defined_vars",
"get_defined_constants",
"get_declared_classes"));
9785 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"function",
"call_user_func"));
9786 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"require",
"include",
"require_once",
"include_once"));
9787 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"eval",
"create_function",
"assert",
"mb_ereg_replace"));
9789 $forbiddenphpmethods = array(
'invoke',
'invokeArgs');
9791 $forbiddenphpregex =
'global\s+\$|\b('.implode(
'|', $forbiddenphpfunctions).
')\b';
9793 $forbiddenphpmethodsregex =
'->('.implode(
'|', $forbiddenphpmethods).
')';
9796 $oldstringtoclean = $s;
9797 $s = str_ireplace($forbiddenphpstrings,
'__forbiddenstring__', $s);
9798 $s = preg_replace(
'/'.$forbiddenphpregex.
'/i',
'__forbiddenstring__', $s);
9799 $s = preg_replace(
'/'.$forbiddenphpmethodsregex.
'/i',
'__forbiddenstring__', $s);
9801 }
while ($oldstringtoclean != $s);
9803 if (strpos($s,
'__forbiddenstring__') !==
false) {
9804 dol_syslog(
'Bad string syntax to evaluate: '.$s, LOG_WARNING);
9806 return 'Bad string syntax to evaluate: '.$s;
9808 dol_syslog(
'Bad string syntax to evaluate: '.$s);
9816 return @eval(
'return '.$s.
';');
9818 return eval(
'return '.$s.
';');
9827 }
catch (Error $e) {
9828 $error =
'dol_eval try/catch error : ';
9829 $error .= $e->getMessage();
9843 return (trim($element) !=
'');
9856 if (empty($codelang)) {
9860 if ($codelang ==
'auto') {
9861 return '<span class="fa fa-language"></span>';
9864 $langtocountryflag = array(
9866 'ca_ES' =>
'catalonia',
9870 'sw_SW' =>
'unknown',
9880 if (isset($langtocountryflag[$codelang])) {
9881 $flagImage = $langtocountryflag[$codelang];
9883 $tmparray = explode(
'_', $codelang);
9884 $flagImage = empty($tmparray[1]) ? $tmparray[0] : $tmparray[1];
9889 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
9895 return '<span class="flag-sprite '.strtolower($flagImage).($morecss ?
' '.$morecss :
'').
'"'.($moreatt ?
' '.$moreatt :
'').(!$notitlealt ?
' title="'.$codelang.
'"' :
'').
'></span>';
9909 if (empty($countrycode)) {
9913 if (strtoupper($countrycode) ==
'MQ') {
9916 if (strtoupper($countrycode) ==
'SE') {
9919 if (strtoupper($countrycode) ==
'CH') {
9920 if ($mysoc->country_code ==
'FR') {
9923 if ($mysoc->country_code ==
'DE') {
9926 if ($mysoc->country_code ==
'IT') {
10108 $buildprimarykeytotest = strtolower($countrycode).
'-'.strtoupper($countrycode);
10109 if (in_array($buildprimarykeytotest, $locales)) {
10110 return strtolower($countrycode).
'_'.strtoupper($countrycode);
10113 if (function_exists(
'locale_get_primary_language') && function_exists(
'locale_get_region')) {
10114 foreach ($locales as $locale) {
10115 $locale_language = locale_get_primary_language($locale);
10116 $locale_region = locale_get_region($locale);
10117 if (strtoupper($countrycode) == $locale_region) {
10119 return strtolower($locale_language).
'_'.strtoupper($locale_region);
10123 dol_syslog(
"Warning Exention php-intl is not available", LOG_WARNING);
10161 global $hookmanager, $db;
10163 if (isset($conf->modules_parts[
'tabs'][$type]) && is_array($conf->modules_parts[
'tabs'][$type])) {
10164 foreach ($conf->modules_parts[
'tabs'][$type] as $value) {
10165 $values = explode(
':', $value);
10168 if ($mode ==
'add' && !preg_match(
'/^\-/', $values[1])) {
10173 $posstart = strpos($str,
'(');
10174 if ($posstart > 0) {
10175 $posend = strpos($str,
')');
10176 if ($posstart > 0) {
10177 $res1 = substr($str, $posstart + 1, $posend - $posstart -1);
10178 if (is_numeric($res1)) {
10179 $postab = (int) $res1;
10180 $values[1] =
'+' . substr($str, $posend + 1);
10184 if (count($values) == 6) {
10188 if ($values[0] != $type) {
10194 if ($filterorigmodule) {
10195 if (strpos($values[3],
'@')) {
10196 if ($filterorigmodule !=
'external') {
10200 if ($filterorigmodule !=
'core') {
10205 $langs->load($values[3]);
10207 if (preg_match(
'/SUBSTITUTION_([^_]+)/i', $values[2], $reg)) {
10209 $substitutionarray = array();
10214 $labeltemp = explode(
',', $values[2]);
10215 $label = $langs->trans($labeltemp[0]);
10217 if (!empty($labeltemp[1]) && is_object($object) && !empty($object->id)) {
10219 $classtoload = $labeltemp[1];
10220 if (class_exists($classtoload)) {
10221 $obj =
new $classtoload($db);
10222 $function = $labeltemp[3];
10223 if ($obj && $function && method_exists($obj, $function)) {
10224 $nbrec = $obj->$function($object->id, $obj);
10225 if (!empty($nbrec)) {
10226 $label .=
'<span class="badge marginleftonlyshort">'.$nbrec.
'</span>';
10233 $newtab[0] =
dol_buildpath(preg_replace(
'/__ID__/i', ((is_object($object) && !empty($object->id)) ? $object->id :
''), $values[5]), 1);
10234 $newtab[1] = $label;
10235 $newtab[2] = str_replace(
'+',
'', $values[1]);
10240 } elseif (count($values) == 5) {
10241 dol_syslog(
'Passing 5 values in tabs module_parts is deprecated. Please update to 6 with permissions.', LOG_WARNING);
10243 if ($values[0] != $type) {
10247 if ($filterorigmodule) {
10248 if (strpos($values[3],
'@')) {
10249 if ($filterorigmodule !=
'external') {
10253 if ($filterorigmodule !=
'core') {
10258 $langs->load($values[3]);
10260 if (preg_match(
'/SUBSTITUTION_([^_]+)/i', $values[2], $reg)) {
10261 $substitutionarray = array();
10265 $label = $langs->trans($values[2]);
10268 $newtab[0] =
dol_buildpath(preg_replace(
'/__ID__/i', ((is_object($object) && !empty($object->id)) ? $object->id :
''), $values[4]), 1);
10269 $newtab[1] = $label;
10270 $newtab[2] = str_replace(
'+',
'', $values[1]);
10274 $head = array_merge(array_slice($head, 0, $postab), array($newtab), array_slice($head, $postab));
10275 } elseif ($mode ==
'remove' && preg_match(
'/^\-/', $values[1])) {
10276 if ($values[0] != $type) {
10279 $tabname = str_replace(
'-',
'', $values[1]);
10280 foreach ($head as $key => $val) {
10281 $condition = (!empty($values[3]) ?
verifCond($values[3]) : 1);
10283 if ($head[$key][2] == $tabname && $condition) {
10284 unset($head[$key]);
10293 if (!empty($hookmanager)) {
10294 $parameters = array(
'object' => $object,
'mode' => $mode,
'head' => &$head,
'filterorigmodule' => $filterorigmodule);
10295 $reshook = $hookmanager->executeHooks(
'completeTabsHead', $parameters, $object);
10296 if ($reshook > 0) {
10297 $head = $hookmanager->resArray;
10299 $head = array_merge($head, $hookmanager->resArray);
10318 global $conf, $hookmanager, $user, $debugbar;
10320 global $micro_start_time;
10322 if ($zone ==
'private') {
10323 print
"\n".
'<!-- Common footer for private page -->'.
"\n";
10325 print
"\n".
'<!-- Common footer for public page -->'.
"\n";
10329 print
"\n<!-- A div to store page_y POST parameter -->\n";
10330 print
'<div id="page_y" style="display: none;">'.(GETPOST(
'page_y') ?
GETPOST(
'page_y') :
'').
'</div>'.
"\n";
10332 $parameters = array();
10333 $reshook = $hookmanager->executeHooks(
'printCommonFooter', $parameters);
10334 if (empty($reshook)) {
10340 if (!empty($conf->use_javascript_ajax)) {
10341 print
"\n<!-- A script section to add menuhider handler on backoffice, manage focus and madatory fields, tuning info, ... -->\n";
10342 print
'<script>'.
"\n";
10343 print
'jQuery(document).ready(function() {'.
"\n";
10345 if ($zone ==
'private' && empty($conf->dol_use_jmobile)) {
10347 print
'/* JS CODE TO ENABLE to manage handler to switch left menu page (menuhider) */'.
"\n";
10348 print
'jQuery("li.menuhider").click(function(event) {';
10349 print
' if (!$( "body" ).hasClass( "sidebar-collapse" )){ event.preventDefault(); }'.
"\n";
10350 print
' console.log("We click on .menuhider");'.
"\n";
10351 print
' $("body").toggleClass("sidebar-collapse")'.
"\n";
10356 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"])))) {
10357 print
'/* JS CODE TO ENABLE to manage focus and mandatory form fields */'.
"\n";
10358 $relativepathstring = $_SERVER[
"PHP_SELF"];
10360 if (constant(
'DOL_URL_ROOT')) {
10361 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
10363 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
10364 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
10366 if (!empty($user->default_values[$relativepathstring][
'focus'])) {
10367 foreach ($user->default_values[$relativepathstring][
'focus'] as $defkey => $defval) {
10369 if ($defkey !=
'_noquery_') {
10370 $tmpqueryarraytohave = explode(
'&', $defkey);
10372 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
10373 $tmpquerytohaveparam = explode(
'=', $tmpquerytohave);
10375 if (!GETPOSTISSET($tmpquerytohaveparam[0]) || ($tmpquerytohaveparam[1] !=
GETPOST($tmpquerytohaveparam[0]))) {
10379 if (!$foundintru) {
10388 foreach ($defval as $paramkey => $paramval) {
10390 print
'jQuery("input[name=\''.$paramkey.
'\']
").focus();'."\n
";
10391 print 'jQuery("textarea[
name=\
''.$paramkey.
'\']
").focus();'."\n
";
10392 print 'jQuery("select[
name=\
''.$paramkey.
'\']
").focus();'."\n
"; // Not really usefull, but we keep it in case of.
10397 if (!empty($user->default_values[$relativepathstring]['mandatory'])) {
10398 foreach ($user->default_values[$relativepathstring]['mandatory'] as $defkey => $defval) {
10400 if ($defkey != '_noquery_') {
10401 $tmpqueryarraytohave = explode('&', $defkey);
10403 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
10404 $tmpquerytohaveparam = explode('=', $tmpquerytohave);
10405 //print "console.log(
'".$tmpquerytohaveparam[0]." ".$tmpquerytohaveparam[1]." ".GETPOST($tmpquerytohaveparam[0])."');
";
10406 if (!GETPOSTISSET($tmpquerytohaveparam[0]) || ($tmpquerytohaveparam[1] != GETPOST($tmpquerytohaveparam[0]))) {
10410 if (!$foundintru) {
10413 //var_dump($defkey.'-'.$qualified);
10419 foreach ($defval as $paramkey => $paramval) {
10420 // Add property 'required' on input
10421 print 'jQuery("input[
name=\
''.$paramkey.
'\']
").prop(\'required\',true);'."\n
";
10422 print 'jQuery("textarea[
name=\
''.$paramkey.
'\']
").prop(\'required\',true);'."\n
";
10423 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
";
10424 print 'jQuery("select[
name=\
''.$paramkey.
'\']
").prop(\'required\',true);'."\n
";
10425 print 'jQuery("select[
name=\
''.$paramkey.
'\'] option[value=\
'-1\']").prop(\'value\', \'\');'.
"\n";
10426 print
'jQuery("select[name=\''.$paramkey.
'\'] option[value=\
'0\']").prop(\'value\', \'\');'.
"\n";
10429 print
'jQuery(":input[name=\'' . $paramkey .
'\']
").closest("tr
").find("td:first
").addClass("fieldrequired
");' . "\n
";
10431 // If we submit the cancel button we remove the required attributes
10432 print 'jQuery("input[
name=\
'cancel\']").click(function() {
10433 console.log("We click on cancel button so removed all required attribute");
10434 jQuery("input, textarea, select").each(function(){this.removeAttribute(\'required\');});
10444 if (!empty($_SERVER[
'MAIN_SHOW_TUNING_INFO']) ||
getDolGlobalString(
'MAIN_SHOW_TUNING_INFO')) {
10446 print
"/* JS CODE TO ENABLE to add memory info */\n";
10447 print
'window.console && console.log("';
10451 print
'MAIN_OPTIMIZE_SPEED='.(isset($conf->global->MAIN_OPTIMIZE_SPEED) ? $conf->global->MAIN_OPTIMIZE_SPEED :
'off');
10452 if (!empty($micro_start_time)) {
10453 $micro_end_time = microtime(
true);
10454 print
' - Build time: '.ceil(1000 * ($micro_end_time - $micro_start_time)).
' ms';
10457 if (function_exists(
"memory_get_usage")) {
10458 print
' - Mem: '.memory_get_usage();
10460 if (function_exists(
"memory_get_peak_usage")) {
10461 print
' - Real mem peak: '.memory_get_peak_usage(
true);
10463 if (function_exists(
"zend_loader_file_encoded")) {
10464 print
' - Zend encoded file: '.(zend_loader_file_encoded() ?
'yes' :
'no');
10469 print
"\n".
'</script>'.
"\n";
10475 foreach ($tmptagarray as $tmptag) {
10477 print
"<!-- JS CODE TO ENABLE for google analtics tag -->\n";
10479 <!-- Global site tag (gtag.js) - Google Analytics -->
10480 <script nonce="'.getNonce().
'" async src="https://www.googletagmanager.com/gtag/js?id='.trim($tmptag).
'"></script>
10482 window.dataLayer = window.dataLayer || [];
10483 function gtag(){dataLayer.push(arguments);}
10484 gtag(\'js\', new Date());
10486 gtag(\'config\', \''.trim($tmptag).
'\');
10493 // Add Xdebug coverage of code
10494 if (defined('XDEBUGCOVERAGE
')) {
10495 print_r(xdebug_get_code_coverage());
10498 // Add DebugBar data
10499 if ($user->hasRight('debugbar
', 'read
') && is_object($debugbar)) {
10500 $debugbar['time
']->stopMeasure('pageaftermaster
');
10501 print '<!-- Output debugbar data -->
'."\n";
10502 $renderer = $debugbar->getRenderer();
10503 print $debugbar->getRenderer()->render();
10504 } elseif (count($conf->logbuffer)) { // If there is some logs in buffer to show
10506 print "<!-- Start of log output\n";
10507 //print '<div
class=
"hidden">
'."\n";
10508 foreach ($conf->logbuffer as $logline) {
10509 print $logline."<br>\n";
10511 //print '</div>
'."\n";
10512 print "End of log output -->\n";
10526function dolExplodeIntoArray($string, $delimiter = ';
', $kv = '=
')
10528 if (is_null($string)) {
10532 if (preg_match('/^\[.*\]$/sm
', $delimiter) || preg_match('/^\(.*\)$/sm
', $delimiter)) {
10533 // This is a regex string
10534 $newdelimiter = $delimiter;
10536 // This is a simple string
10537 $newdelimiter = preg_quote($delimiter, '/
');
10540 if ($a = preg_split('/
'.$newdelimiter.'/
', $string)) {
10542 foreach ($a as $s) { // each part
10544 if ($pos = strpos($s, $kv)) { // key/value delimiter
10545 $ka[trim(substr($s, 0, $pos))] = trim(substr($s, $pos + strlen($kv)));
10546 } else { // key delimiter not found
10564function dol_set_focus($selector)
10566 print "\n".'<!-- Set focus onto a specific field -->
'."\n";
10567 print '<script nonce=
"'.getNonce().'">jQuery(document).ready(
function() { jQuery(
"'.dol_escape_js($selector).'").focus(); });</script>
'."\n";
10578function dol_getmypid()
10580 if (!function_exists('getmypid
')) {
10581 return mt_rand(99900000, 99965535);
10583 return getmypid(); // May be a number on 64 bits (depending on OS)
10605function natural_search($fields, $value, $mode = 0, $nofirstand = 0)
10607 global $db, $langs;
10609 $value = trim($value);
10612 $value = preg_replace('/\*/
', '%
', $value); // Replace * with %
10615 $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
10618 $value = preg_replace('/\s*\|\s*/
', '|
', $value);
10620 $crits = explode(' ', $value);
10622 if (!is_array($fields)) {
10623 $fields = array($fields);
10626 $i1 = 0; // count the nb of and criteria added (all fields / criterias)
10627 foreach ($crits as $crit) { // Loop on each AND criteria
10628 $crit = trim($crit);
10629 $i2 = 0; // count the nb of valid criteria added for this this first criteria
10631 foreach ($fields as $field) {
10633 $tmpcrits = explode('|
', $crit);
10634 $i3 = 0; // count the nb of valid criteria added for this current field
10635 foreach ($tmpcrits as $tmpcrit) {
10636 if ($tmpcrit !== '0
' && empty($tmpcrit)) {
10639 $tmpcrit = trim($tmpcrit);
10641 $newres .= (($i2 > 0 || $i3 > 0) ? ' OR
' : '');
10644 $newcrit = preg_replace('/([!<>=]+)/
', '', $tmpcrit);
10647 preg_match('/([!<>=]+)/
', $tmpcrit, $reg);
10648 if (!empty($reg[1])) {
10649 $operator = $reg[1];
10651 if ($newcrit != '') {
10652 $numnewcrit = price2num($newcrit);
10653 if (is_numeric($numnewcrit)) {
10654 $newres .= $field.' '.$operator.' '.((float) $numnewcrit); // should be a numeric
10656 $newres .= '1 = 2
'; // force false, we received a corrupted data
10658 $i3++; // a criteria was added to string
10661 $i2++; // a criteria for 1 more field was added to string
10662 } elseif ($mode == 2 || $mode == -2) {
10663 $crit = preg_replace('/[^0-9,]/
', '', $crit); // ID are always integer
10664 $newres .= ($i2 > 0 ? ' OR
' : '').$field." ".($mode == -2 ? 'NOT
' : '');
10665 $newres .= $crit ? "IN (".$db->sanitize($db->escape($crit)).")" : "IN (0)";
10667 $newres .= ' OR
'.$field.' IS NULL
';
10669 $i2++; // a criteria for 1 more field was added to string
10670 } elseif ($mode == 3 || $mode == -3) {
10671 $tmparray = explode(',
', $crit);
10672 if (count($tmparray)) {
10674 foreach ($tmparray as $val) {
10677 $listofcodes .= ($listofcodes ? ',
' : '');
10678 $listofcodes .= "'".$db->escape($val)."'";
10681 $newres .= ($i2 > 0 ? ' OR
' : '').$field." ".($mode == -3 ? 'NOT
' : '')."IN (".$db->sanitize($listofcodes, 1).")";
10682 $i2++; // a criteria for 1 more field was added to string
10685 $newres .= ' OR
'.$field.' IS NULL
';
10687 } elseif ($mode == 4) {
10688 $tmparray = explode(',
', $crit);
10689 if (count($tmparray)) {
10691 foreach ($tmparray as $val) {
10694 $newres .= ($i2 > 0 ? " OR (" : "(").$field." LIKE '".$db->escape($val).",%
'";
10695 $newres .= ' OR
'.$field." = '".$db->escape($val)."'";
10696 $newres .= ' OR
'.$field." LIKE '%,
".$db->escape($val)."'";
10697 $newres .= ' OR
'.$field." LIKE '%,
".$db->escape($val).",%
'";
10699 $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)
10703 } else { // $mode=0
10704 $tmpcrits = explode('|
', $crit);
10705 $i3 = 0; // count the nb of valid criteria added for the current couple criteria/field
10706 foreach ($tmpcrits as $tmpcrit) { // loop on each OR criteria
10707 if ($tmpcrit !== '0
' && empty($tmpcrit)) {
10710 $tmpcrit = trim($tmpcrit);
10712 if ($tmpcrit == '^$
' || strpos($crit, '!
') === 0) { // If we search empty, we must combined different OR fields with AND
10713 $newres .= (($i2 > 0 || $i3 > 0) ? ' AND
' : '');
10715 $newres .= (($i2 > 0 || $i3 > 0) ? ' OR
' : '');
10718 if (preg_match('/\.(
id|
rowid)$/
', $field)) { // Special case for rowid that is sometimes a ref so used as a search field
10719 $newres .= $field." = ".(is_numeric($tmpcrit) ? ((float) $tmpcrit) : '0
');
10721 $tmpcrit2 = $tmpcrit;
10726 if (preg_match('/^!/
', $tmpcrit)) {
10727 $tmps .= $field." NOT LIKE "; // ! as exclude character
10728 $tmpcrit2 = preg_replace('/^!/
', '', $tmpcrit2);
10730 $tmps .= $field." LIKE ";
10734 if (preg_match('/^[\^\$]/', $tmpcrit)) {
10736 $tmpcrit2 = preg_replace('/^[\^\$]/', '', $tmpcrit2);
10738 if (preg_match('/[\^\$]$/', $tmpcrit)) {
10740 $tmpcrit2 = preg_replace('/[\^\$]$/', '', $tmpcrit2);
10743 if ($tmpcrit2 == '' || preg_match('/^!/', $tmpcrit)) {
10747 $newres .= $tmpbefore;
10748 $newres .= $db->escape($tmpcrit2);
10749 $newres .= $tmpafter;
10751 if ($tmpcrit2 == '' || preg_match('/^!/
', $tmpcrit)) {
10752 $newres .= " OR ".$field." IS NULL)";
10759 $i2++; // a criteria for 1 more field was added to string
10764 $res = $res.($res ? ' AND
' : '').($i2 > 1 ? '(
' : '').$newres.($i2 > 1 ? ')
' : '');
10768 $res = ($nofirstand ? "" : " AND ")."(".$res.")";
10779function showDirectDownloadLink($object)
10781 global $conf, $langs;
10784 $url = $object->getLastMainDocLink($object->element);
10786 $out .= img_picto($langs->trans("PublicDownloadLinkDesc"), 'globe
').' <span
class=
"opacitymedium">
'.$langs->trans("DirectDownloadLink").'</span><br>
';
10788 $out .= '<div
class=
"urllink"><input
type=
"text" id=
"directdownloadlink" class=
"quatrevingtpercent" value=
"'.$url.'"></div>
';
10789 $out .= ajax_autoselect("directdownloadlink", 0);
10791 $out .= '<div
class=
"urllink">
'.$langs->trans("FileNotShared").'</div>
';
10805function getImageFileNameForSize($file, $extName, $extImgTarget = '
')
10807 $dirName = dirname($file);
10808 if ($dirName == '.
') {
10812 $fileName = preg_replace('/(\.gif|\.jpeg|\.jpg|\.png|\.bmp|\.webp)$/i
', '', $file); // We remove extension, whatever is its case
10813 $fileName = basename($fileName);
10815 if (empty($extImgTarget)) {
10816 $extImgTarget = (preg_match('/\.jpg$/i
', $file) ? '.jpg
' : '');
10818 if (empty($extImgTarget)) {
10819 $extImgTarget = (preg_match('/\.jpeg$/i
', $file) ? '.jpeg
' : '');
10821 if (empty($extImgTarget)) {
10822 $extImgTarget = (preg_match('/\.gif$/i
', $file) ? '.gif
' : '');
10824 if (empty($extImgTarget)) {
10825 $extImgTarget = (preg_match('/\.png$/i
', $file) ? '.png
' : '');
10827 if (empty($extImgTarget)) {
10828 $extImgTarget = (preg_match('/\.bmp$/i
', $file) ? '.bmp
' : '');
10830 if (empty($extImgTarget)) {
10831 $extImgTarget = (preg_match('/\.webp$/i
', $file) ? '.webp
' : '');
10834 if (!$extImgTarget) {
10840 $subdir = 'thumbs/
';
10843 return ($dirName ? $dirName.'/
' : '').$subdir.$fileName.$extName.$extImgTarget; // New filename for thumb
10856function getAdvancedPreviewUrl($modulepart, $relativepath, $alldata = 0, $param = '
')
10858 global $conf, $langs;
10860 if (empty($conf->use_javascript_ajax)) {
10864 $isAllowedForPreview = dolIsAllowedForPreview($relativepath);
10866 if ($alldata == 1) {
10867 if ($isAllowedForPreview) {
10868 return array('target
'=>'_blank
', 'css
'=>'documentpreview
', 'url
'=>DOL_URL_ROOT.'/document.php?modulepart=
'.urlencode($modulepart).'&attachment=0&file=
'.urlencode($relativepath).($param ? '&
'.$param : ''), 'mime
'=>dol_mimetype($relativepath));
10874 // old behavior, return a string
10875 if ($isAllowedForPreview) {
10876 $tmpurl = DOL_URL_ROOT.'/document.php?modulepart=
'.urlencode($modulepart).'&attachment=0&file=
'.urlencode($relativepath).($param ? '&
'.$param : '');
10877 $title = $langs->trans("Preview");
10878 //$title = '%27-alert(document.domain)-%27
';
10879 //$tmpurl = 'file=
'.urlencode("'-alert(document.domain)-
'_small.jpg");
10881 // We need to urlencode the parameter after the dol_escape_js($tmpurl) because $tmpurl may contain n url with param file=abc%27def if file has a ' inside.
10898function ajax_autoselect($htmlname, $addlink = '
', $textonlink = 'Link')
10901 $out = '<script nonce=
"'.getNonce().'">
10902 jQuery(document).ready(
function () {
10903 jQuery(
"'.((strpos($htmlname, '.') === 0 ? '' : '#').$htmlname).'").click(
function() { jQuery(
this).select(); } );
10907 if ($textonlink === 'image
') {
10908 $out .= ' <a href=
"'.$addlink.'" target=
"_blank" rel=
"noopener noreferrer">
'.img_picto('', 'globe
').'</a>
';
10910 $out .= ' <a href=
"'.$addlink.'" target=
"_blank" rel=
"noopener noreferrer">
'.$langs->trans("Link").'</a>
';
10923function dolIsAllowedForPreview($file)
10927 // Check .noexe extension in filename
10928 if (preg_match('/\.noexe$/i
', $file)) {
10932 // Check mime types
10933 $mime_preview = array('bmp
', 'jpeg
', 'png
', 'gif
', 'tiff
', 'pdf
', 'plain
', 'css
', 'webp
');
10934 if (getDolGlobalString('MAIN_ALLOW_SVG_FILES_AS_IMAGES
')) {
10935 $mime_preview[] = 'svg+xml
';
10937 //$mime_preview[]='vnd.oasis.opendocument.presentation
';
10938 //$mime_preview[]='archive
';
10939 $num_mime = array_search(dol_mimetype($file, '', 1), $mime_preview);
10940 if ($num_mime !== false) {
10944 // By default, not allowed for preview
10958function dol_mimetype($file, $default = 'application/octet-stream
', $mode = 0)
10961 $imgmime = 'other.png
';
10962 $famime = 'file-o
';
10965 $tmpfile = preg_replace('/\.noexe$/
', '', $file);
10967 // Plain text files
10968 if (preg_match('/\.txt$/i
', $tmpfile)) {
10969 $mime = 'text/plain
';
10970 $imgmime = 'text.png
';
10971 $famime = 'file-alt
';
10972 } elseif (preg_match('/\.rtx$/i
', $tmpfile)) {
10973 $mime = 'text/richtext
';
10974 $imgmime = 'text.png
';
10975 $famime = 'file-alt
';
10976 } elseif (preg_match('/\.csv$/i
', $tmpfile)) {
10977 $mime = 'text/csv
';
10978 $imgmime = 'text.png
';
10979 $famime = 'file-csv
';
10980 } elseif (preg_match('/\.tsv$/i
', $tmpfile)) {
10981 $mime = 'text/tab-separated-values
';
10982 $imgmime = 'text.png
';
10983 $famime = 'file-alt
';
10984 } elseif (preg_match('/\.(cf|
conf|log)$/i
', $tmpfile)) {
10985 $mime = 'text/plain
';
10986 $imgmime = 'text.png
';
10987 $famime = 'file-alt
';
10988 } elseif (preg_match('/\.ini$/i
', $tmpfile)) {
10989 $mime = 'text/plain
';
10990 $imgmime = 'text.png
';
10992 $famime = 'file-alt
';
10993 } elseif (preg_match('/\.md$/i
', $tmpfile)) {
10994 $mime = 'text/plain
';
10995 $imgmime = 'text.png
';
10997 $famime = 'file-alt
';
10998 } elseif (preg_match('/\.css$/i
', $tmpfile)) {
10999 $mime = 'text/css
';
11000 $imgmime = 'css.png
';
11002 $famime = 'file-alt
';
11003 } elseif (preg_match('/\.lang$/i
', $tmpfile)) {
11004 $mime = 'text/plain
';
11005 $imgmime = 'text.png
';
11007 $famime = 'file-alt
';
11008 } elseif (preg_match('/\.(crt|cer|key|pub)$/i
', $tmpfile)) { // Certificate files
11009 $mime = 'text/plain
';
11010 $imgmime = 'text.png
';
11011 $famime = 'file-alt
';
11012 } elseif (preg_match('/\.(html|htm|shtml)$/i
', $tmpfile)) { // XML based (HTML/XML/XAML)
11013 $mime = 'text/html
';
11014 $imgmime = 'html.png
';
11016 $famime = 'file-alt
';
11017 } elseif (preg_match('/\.(xml|xhtml)$/i
', $tmpfile)) {
11018 $mime = 'text/xml
';
11019 $imgmime = 'other.png
';
11021 $famime = 'file-alt
';
11022 } elseif (preg_match('/\.xaml$/i
', $tmpfile)) {
11023 $mime = 'text/xml
';
11024 $imgmime = 'other.png
';
11026 $famime = 'file-alt
';
11027 } elseif (preg_match('/\.bas$/i
', $tmpfile)) { // Languages
11028 $mime = 'text/plain
';
11029 $imgmime = 'text.png
';
11031 $famime = 'file-code
';
11032 } elseif (preg_match('/\.(c)$/i
', $tmpfile)) {
11033 $mime = 'text/plain
';
11034 $imgmime = 'text.png
';
11036 $famime = 'file-code
';
11037 } elseif (preg_match('/\.(cpp)$/i
', $tmpfile)) {
11038 $mime = 'text/plain
';
11039 $imgmime = 'text.png
';
11041 $famime = 'file-code
';
11042 } elseif (preg_match('/\.cs$/i
', $tmpfile)) {
11043 $mime = 'text/plain
';
11044 $imgmime = 'text.png
';
11046 $famime = 'file-code
';
11047 } elseif (preg_match('/\.(h)$/i
', $tmpfile)) {
11048 $mime = 'text/plain
';
11049 $imgmime = 'text.png
';
11051 $famime = 'file-code
';
11052 } elseif (preg_match('/\.(java|jsp)$/i
', $tmpfile)) {
11053 $mime = 'text/plain
';
11054 $imgmime = 'text.png
';
11056 $famime = 'file-code
';
11057 } elseif (preg_match('/\.php([0-9]{1})?$/i
', $tmpfile)) {
11058 $mime = 'text/plain
';
11059 $imgmime = 'php.png
';
11061 $famime = 'file-code
';
11062 } elseif (preg_match('/\.phtml$/i
', $tmpfile)) {
11063 $mime = 'text/plain
';
11064 $imgmime = 'php.png
';
11066 $famime = 'file-code
';
11067 } elseif (preg_match('/\.(pl|pm)$/i
', $tmpfile)) {
11068 $mime = 'text/plain
';
11069 $imgmime = 'pl.png
';
11071 $famime = 'file-code
';
11072 } elseif (preg_match('/\.sql$/i
', $tmpfile)) {
11073 $mime = 'text/plain
';
11074 $imgmime = 'text.png
';
11076 $famime = 'file-code
';
11077 } elseif (preg_match('/\.js$/i
', $tmpfile)) {
11078 $mime = 'text/x-javascript
';
11079 $imgmime = 'jscript.png
';
11081 $famime = 'file-code
';
11082 } elseif (preg_match('/\.odp$/i
', $tmpfile)) { // Open office
11083 $mime = 'application/vnd.oasis.opendocument.presentation
';
11084 $imgmime = 'ooffice.png
';
11085 $famime = 'file-powerpoint
';
11086 } elseif (preg_match('/\.ods$/i
', $tmpfile)) {
11087 $mime = 'application/vnd.oasis.opendocument.spreadsheet
';
11088 $imgmime = 'ooffice.png
';
11089 $famime = 'file-excel
';
11090 } elseif (preg_match('/\.odt$/i
', $tmpfile)) {
11091 $mime = 'application/vnd.oasis.opendocument.text
';
11092 $imgmime = 'ooffice.png
';
11093 $famime = 'file-word
';
11094 } elseif (preg_match('/\.mdb$/i
', $tmpfile)) { // MS Office
11095 $mime = 'application/msaccess
';
11096 $imgmime = 'mdb.png
';
11098 } elseif (preg_match('/\.doc[xm]?$/i
', $tmpfile)) {
11099 $mime = 'application/msword
';
11100 $imgmime = 'doc.png
';
11101 $famime = 'file-word
';
11102 } elseif (preg_match('/\.dot[xm]?$/i
', $tmpfile)) {
11103 $mime = 'application/msword
';
11104 $imgmime = 'doc.png
';
11105 $famime = 'file-word
';
11106 } elseif (preg_match('/\.xlt(x)?$/i
', $tmpfile)) {
11107 $mime = 'application/vnd.ms-excel
';
11108 $imgmime = 'xls.png
';
11109 $famime = 'file-excel
';
11110 } elseif (preg_match('/\.xla(m)?$/i
', $tmpfile)) {
11111 $mime = 'application/vnd.ms-excel
';
11112 $imgmime = 'xls.png
';
11113 $famime = 'file-excel
';
11114 } elseif (preg_match('/\.xls$/i
', $tmpfile)) {
11115 $mime = 'application/vnd.ms-excel
';
11116 $imgmime = 'xls.png
';
11117 $famime = 'file-excel
';
11118 } elseif (preg_match('/\.xls[bmx]$/i
', $tmpfile)) {
11119 $mime = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
';
11120 $imgmime = 'xls.png
';
11121 $famime = 'file-excel
';
11122 } elseif (preg_match('/\.pps[mx]?$/i
', $tmpfile)) {
11123 $mime = 'application/vnd.ms-powerpoint
';
11124 $imgmime = 'ppt.png
';
11125 $famime = 'file-powerpoint
';
11126 } elseif (preg_match('/\.ppt[mx]?$/i
', $tmpfile)) {
11127 $mime = 'application/x-mspowerpoint
';
11128 $imgmime = 'ppt.png
';
11129 $famime = 'file-powerpoint
';
11130 } elseif (preg_match('/\.pdf$/i
', $tmpfile)) { // Other
11131 $mime = 'application/pdf
';
11132 $imgmime = 'pdf.png
';
11133 $famime = 'file-pdf
';
11134 } elseif (preg_match('/\.bat$/i
', $tmpfile)) { // Scripts
11135 $mime = 'text/x-bat
';
11136 $imgmime = 'script.png
';
11138 $famime = 'file-code
';
11139 } elseif (preg_match('/\.sh$/i
', $tmpfile)) {
11140 $mime = 'text/x-sh
';
11141 $imgmime = 'script.png
';
11143 $famime = 'file-code
';
11144 } elseif (preg_match('/\.ksh$/i
', $tmpfile)) {
11145 $mime = 'text/x-ksh
';
11146 $imgmime = 'script.png
';
11148 $famime = 'file-code
';
11149 } elseif (preg_match('/\.bash$/i
', $tmpfile)) {
11150 $mime = 'text/x-bash
';
11151 $imgmime = 'script.png
';
11153 $famime = 'file-code
';
11154 } elseif (preg_match('/\.ico$/i
', $tmpfile)) { // Images
11155 $mime = 'image/x-icon
';
11156 $imgmime = 'image.png
';
11157 $famime = 'file-image
';
11158 } elseif (preg_match('/\.(jpg|jpeg)$/i
', $tmpfile)) {
11159 $mime = 'image/jpeg
';
11160 $imgmime = 'image.png
';
11161 $famime = 'file-image
';
11162 } elseif (preg_match('/\.png$/i
', $tmpfile)) {
11163 $mime = 'image/png
';
11164 $imgmime = 'image.png
';
11165 $famime = 'file-image
';
11166 } elseif (preg_match('/\.gif$/i
', $tmpfile)) {
11167 $mime = 'image/gif
';
11168 $imgmime = 'image.png
';
11169 $famime = 'file-image
';
11170 } elseif (preg_match('/\.bmp$/i
', $tmpfile)) {
11171 $mime = 'image/bmp
';
11172 $imgmime = 'image.png
';
11173 $famime = 'file-image
';
11174 } elseif (preg_match('/\.(tif|tiff)$/i
', $tmpfile)) {
11175 $mime = 'image/tiff
';
11176 $imgmime = 'image.png
';
11177 $famime = 'file-image
';
11178 } elseif (preg_match('/\.svg$/i
', $tmpfile)) {
11179 $mime = 'image/svg+xml
';
11180 $imgmime = 'image.png
';
11181 $famime = 'file-image
';
11182 } elseif (preg_match('/\.webp$/i
', $tmpfile)) {
11183 $mime = 'image/webp
';
11184 $imgmime = 'image.png
';
11185 $famime = 'file-image
';
11186 } elseif (preg_match('/\.vcs$/i
', $tmpfile)) { // Calendar
11187 $mime = 'text/calendar
';
11188 $imgmime = 'other.png
';
11189 $famime = 'file-alt
';
11190 } elseif (preg_match('/\.ics$/i
', $tmpfile)) {
11191 $mime = 'text/calendar
';
11192 $imgmime = 'other.png
';
11193 $famime = 'file-alt
';
11194 } elseif (preg_match('/\.torrent$/i
', $tmpfile)) { // Other
11195 $mime = 'application/x-bittorrent
';
11196 $imgmime = 'other.png
';
11197 $famime = 'file-o
';
11198 } elseif (preg_match('/\.(mp3|ogg|au|wav|wma|mid)$/i
', $tmpfile)) { // Audio
11200 $imgmime = 'audio.png
';
11201 $famime = 'file-audio
';
11202 } elseif (preg_match('/\.mp4$/i
', $tmpfile)) { // Video
11203 $mime = 'video/mp4
';
11204 $imgmime = 'video.png
';
11205 $famime = 'file-video
';
11206 } elseif (preg_match('/\.ogv$/i
', $tmpfile)) {
11207 $mime = 'video/ogg
';
11208 $imgmime = 'video.png
';
11209 $famime = 'file-video
';
11210 } elseif (preg_match('/\.webm$/i
', $tmpfile)) {
11211 $mime = 'video/webm
';
11212 $imgmime = 'video.png
';
11213 $famime = 'file-video
';
11214 } elseif (preg_match('/\.avi$/i
', $tmpfile)) {
11215 $mime = 'video/x-msvideo
';
11216 $imgmime = 'video.png
';
11217 $famime = 'file-video
';
11218 } elseif (preg_match('/\.divx$/i
', $tmpfile)) {
11219 $mime = 'video/divx
';
11220 $imgmime = 'video.png
';
11221 $famime = 'file-video
';
11222 } elseif (preg_match('/\.xvid$/i
', $tmpfile)) {
11223 $mime = 'video/xvid
';
11224 $imgmime = 'video.png
';
11225 $famime = 'file-video
';
11226 } elseif (preg_match('/\.(wmv|mpg|mpeg)$/i
', $tmpfile)) {
11228 $imgmime = 'video.png
';
11229 $famime = 'file-video
';
11230 } elseif (preg_match('/\.(zip|rar|gz|tgz|z|cab|bz2|7z|tar|lzh|zst)$/i
', $tmpfile)) { // Archive
11231 // application/xxx where zzz is zip, ...
11233 $imgmime = 'archive.png
';
11234 $famime = 'file-archive
';
11235 } elseif (preg_match('/\.(exe|com)$/i
', $tmpfile)) { // Exe
11236 $mime = 'application/octet-stream
';
11237 $imgmime = 'other.png
';
11238 $famime = 'file-o
';
11239 } elseif (preg_match('/\.(dll|lib|o|so|a)$/i
', $tmpfile)) { // Lib
11241 $imgmime = 'library.png
';
11242 $famime = 'file-o
';
11243 } elseif (preg_match('/\.err$/i
', $tmpfile)) { // phpcs:ignore
11245 $imgmime = 'error.png
';
11246 $famime = 'file-alt
';
11249 // Return mimetype string
11250 switch ((int) $mode) {
11252 $tmp = explode('/
', $mime);
11253 return (!empty($tmp[1]) ? $tmp[1] : $tmp[0]);
11275function getDictionaryValue($tablename, $field, $id, $checkentity = false, $rowidfield = '
rowid')
11279 $tablename = preg_replace('/^
'.preg_quote(MAIN_DB_PREFIX, '/
').'/
', '', $tablename); // Clean name of table for backward compatibility.
11281 $dictvalues = (isset($conf->cache['dictvalues_
'.$tablename]) ? $conf->cache['dictvalues_
'.$tablename] : null);
11283 if (is_null($dictvalues)) {
11284 $dictvalues = array();
11286 $sql = "SELECT * FROM ".MAIN_DB_PREFIX.$tablename." WHERE 1 = 1"; // Here select * is allowed as it is generic code and we don't have list of fields
11287 if ($checkentity) {
11288 $sql .=
' AND entity IN (0,'.getEntity($tablename).
')';
11291 $resql = $db->query($sql);
11293 while ($obj = $db->fetch_object($resql)) {
11294 $dictvalues[$obj->$rowidfield] = $obj;
11300 $conf->cache[
'dictvalues_'.$tablename] = $dictvalues;
11303 if (!empty($dictvalues[$id])) {
11305 $tmp = $dictvalues[$id];
11306 return (property_exists($tmp, $field) ? $tmp->$field :
'');
11321 $stringcolor = str_replace(
'#',
'', $stringcolor);
11323 if (!empty($stringcolor)) {
11325 $tmp = explode(
',', $stringcolor);
11326 if (count($tmp) > 1) {
11331 $hexr = $stringcolor[0].$stringcolor[1];
11332 $hexg = $stringcolor[2].$stringcolor[3];
11333 $hexb = $stringcolor[4].$stringcolor[5];
11334 $r = hexdec($hexr);
11335 $g = hexdec($hexg);
11336 $b = hexdec($hexb);
11338 $bright = (max($r, $g, $b) + min($r, $g, $b)) / 510.0;
11339 if ($bright > 0.6) {
11360 if (empty($menuentry[
'enabled'])) {
11363 if ($type_user && $menuentry[
'module']) {
11364 $tmploops = explode(
'|', $menuentry[
'module']);
11366 foreach ($tmploops as $tmploop) {
11367 if (in_array($tmploop, $listofmodulesforexternal)) {
11376 if (!$menuentry[
'perms'] && $type_user) {
11382 if (!$menuentry[
'perms']) {
11397 return (ceil($n) % $x === 0) ? ceil($n) : round(($n + $x / 2) / $x) * $x;
11411function dolGetBadge($label, $html =
'', $type =
'primary', $mode =
'', $url =
'', $params = array())
11414 'class'=>
'badge '.(!empty($mode) ?
' badge-'.$mode :
'').(!empty($type) ?
' badge-'.$type :
'').(empty($params[
'css']) ?
'' :
' '.$params[
'css'])
11417 if (empty($html)) {
11421 if (!empty($url)) {
11422 $attr[
'href'] = $url;
11425 if ($mode ===
'dot') {
11426 $attr[
'class'] .=
' classfortooltip';
11427 $attr[
'title'] = $html;
11428 $attr[
'aria-label'] = $label;
11433 if (!empty($params[
'attr']) && is_array($params[
'attr'])) {
11434 foreach ($params[
'attr'] as $key => $value) {
11435 if ($key ==
'class') {
11436 $attr[
'class'] .=
' '.$value;
11437 } elseif ($key ==
'classOverride') {
11438 $attr[
'class'] = $value;
11440 $attr[$key] = $value;
11448 $attr = array_map(
'dol_escape_htmltag', $attr);
11450 $TCompiledAttr = array();
11451 foreach ($attr as $key => $value) {
11452 $TCompiledAttr[] = $key.
'="'.$value.
'"';
11455 $compiledAttributes = !empty($TCompiledAttr) ? implode(
' ', $TCompiledAttr) :
'';
11457 $tag = !empty($url) ?
'a' :
'span';
11459 return '<'.$tag.
' '.$compiledAttributes.
'>'.$html.
'</'.$tag.
'>';
11475function dolGetStatus($statusLabel =
'', $statusLabelShort =
'', $html =
'', $statusType =
'status0', $displayMode = 0, $url =
'', $params = array())
11480 $dolGetBadgeParams = array();
11482 if (!empty($params[
'badgeParams'])) {
11483 $dolGetBadgeParams = $params[
'badgeParams'];
11487 if ($displayMode == 0) {
11488 $return = !empty($html) ? $html : (empty($conf->dol_optimize_smallscreen) ? $statusLabel : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort));
11489 } elseif ($displayMode == 1) {
11490 $return = !empty($html) ? $html : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort);
11494 $htmlLabel = (in_array($displayMode, array(1, 2, 5)) ?
'<span class="hideonsmartphone">' :
'').(!empty($html) ? $html : $statusLabel).(in_array($displayMode, array(1, 2, 5)) ?
'</span>' :
'');
11495 $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>' :
'');
11498 if (!empty($conf->dol_optimize_smallscreen)) {
11499 if ($displayMode == 0) {
11501 } elseif ($displayMode == 4) {
11503 } elseif ($displayMode == 6) {
11509 $statusImg = array(
11510 'status0' =>
'statut0',
11511 'status1' =>
'statut1',
11512 'status2' =>
'statut2',
11513 'status3' =>
'statut3',
11514 'status4' =>
'statut4',
11515 'status5' =>
'statut5',
11516 'status6' =>
'statut6',
11517 'status7' =>
'statut7',
11518 'status8' =>
'statut8',
11519 'status9' =>
'statut9'
11522 if (!empty($statusImg[$statusType])) {
11523 $htmlImg =
img_picto($statusLabel, $statusImg[$statusType]);
11525 $htmlImg =
img_picto($statusLabel, $statusType);
11528 if ($displayMode === 2) {
11529 $return = $htmlImg.
' '.$htmlLabelShort;
11530 } elseif ($displayMode === 3) {
11531 $return = $htmlImg;
11532 } elseif ($displayMode === 4) {
11533 $return = $htmlImg.
' '.$htmlLabel;
11534 } elseif ($displayMode === 5) {
11535 $return = $htmlLabelShort.
' '.$htmlImg;
11537 $return = $htmlLabel.
' '.$htmlImg;
11541 $statusLabelShort = (empty($statusLabelShort) ? $statusLabel : $statusLabelShort);
11543 $dolGetBadgeParams[
'attr'][
'class'] =
'badge-status';
11544 $dolGetBadgeParams[
'attr'][
'title'] = empty($params[
'tooltip']) ? $statusLabel : ($params[
'tooltip'] !=
'no' ? $params[
'tooltip'] :
'');
11546 if ($displayMode == 3) {
11547 $return = dolGetBadge((empty($conf->dol_optimize_smallscreen) ? $statusLabel : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort)),
'', $statusType,
'dot', $url, $dolGetBadgeParams);
11548 } elseif ($displayMode === 5) {
11549 $return = dolGetBadge($statusLabelShort, $html, $statusType,
'', $url, $dolGetBadgeParams);
11551 $return = dolGetBadge((empty($conf->dol_optimize_smallscreen) ? $statusLabel : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort)), $html, $statusType,
'', $url, $dolGetBadgeParams);
11593function dolGetButtonAction($label, $text =
'', $actionType =
'default', $url =
'', $id =
'', $userRight = 1, $params = array())
11595 global $hookmanager, $action, $object, $langs;
11598 if (is_array($url)) {
11600 foreach ($url as $key => $subbutton) {
11601 if (isset($subbutton[
'enabled']) && empty($subbutton[
'enabled'])) {
11608 if (count($url) > 1) {
11609 $out .=
'<div class="dropdown inline-block dropdown-holder">';
11610 $out .=
'<a style="margin-right: auto;" class="dropdown-toggle classfortooltip butAction'.($userRight ?
'' :
'Refused').
'" title="'.
dol_escape_htmltag($label).
'" data-toggle="dropdown">'.($text ? $text : $label).
'</a>';
11611 $out .=
'<div class="dropdown-content">';
11612 foreach ($url as $subbutton) {
11613 if (!empty($subbutton[
'lang'])) {
11614 $langs->load($subbutton[
'lang']);
11616 $tmpurl = DOL_URL_ROOT.$subbutton[
'url'].(empty($params[
'backtopage']) ?
'' :
'&backtopage='.urlencode($params[
'backtopage']));
11617 $out .=
dolGetButtonAction(
'', $langs->trans($subbutton[
'label']),
'default', $tmpurl,
'', $subbutton[
'perm'], array(
'isDropDown' =>
true));
11622 foreach ($url as $subbutton) {
11623 if (!empty($subbutton[
'lang'])) {
11624 $langs->load($subbutton[
'lang']);
11626 $tmpurl = DOL_URL_ROOT.$subbutton[
'url'].(empty($params[
'backtopage']) ?
'' :
'&backtopage='.urlencode($params[
'backtopage']));
11627 $out .=
dolGetButtonAction(
'', $langs->trans($subbutton[
'label']),
'default', $tmpurl,
'', $subbutton[
'perm']);
11636 if (!empty($params[
'isDropdown'])) {
11637 $class =
"dropdown-item";
11639 $class =
'butAction';
11640 if ($actionType ==
'danger' || $actionType ==
'delete') {
11641 $class =
'butActionDelete';
11642 if (!empty($url) && strpos($url,
'token=') ===
false) {
11643 $url .=
'&token='.newToken();
11649 'href' => empty($url) ?
'' : $url,
11653 if (empty($text)) {
11655 $attr[
'title'] =
'';
11657 $attr[
'title'] = $label;
11658 $attr[
'aria-label'] = $label;
11661 if (empty($userRight)) {
11662 $attr[
'class'] =
'butActionRefused';
11663 $attr[
'href'] =
'';
11664 $attr[
'title'] = (($label && $text && $label != $text) ? $label : $langs->trans(
'NotEnoughPermissions'));
11672 if (!empty($params[
'attr']) && is_array($params[
'attr'])) {
11673 foreach ($params[
'attr'] as $key => $value) {
11674 if ($key ==
'class') {
11675 $attr[
'class'] .=
' '.$value;
11676 } elseif ($key ==
'classOverride') {
11677 $attr[
'class'] = $value;
11679 $attr[$key] = $value;
11685 if (!empty($attr[
'title']) && !empty($attr[
'class']) && strpos($attr[
'class'],
'classfortooltip') ===
false) {
11686 $attr[
'class'].=
' classfortooltip';
11690 if ($userRight && !empty($params[
'confirm'])) {
11691 if (!is_array($params[
'confirm'])) {
11692 $params[
'confirm'] = array();
11695 if (empty($params[
'confirm'][
'url'])) {
11696 $params[
'confirm'][
'url'] = $url . (strpos($url,
'?') > 0 ?
'&' :
'?') .
'confirm=yes';
11700 $attr[
'data-confirm-url'] = $params[
'confirm'][
'url'];
11701 $attr[
'data-confirm-title'] = !empty($params[
'confirm'][
'title']) ? $params[
'confirm'][
'title'] : $langs->trans(
'ConfirmBtnCommonTitle', $label);
11702 $attr[
'data-confirm-content'] = !empty($params[
'confirm'][
'content']) ? $params[
'confirm'][
'content'] : $langs->trans(
'ConfirmBtnCommonContent', $label);
11703 $attr[
'data-confirm-content'] = preg_replace(
"/\r|\n/",
"", $attr[
'data-confirm-content']);
11704 $attr[
'data-confirm-action-btn-label'] = !empty($params[
'confirm'][
'action-btn-label']) ? $params[
'confirm'][
'action-btn-label'] : $langs->trans(
'Confirm');
11705 $attr[
'data-confirm-cancel-btn-label'] = !empty($params[
'confirm'][
'cancel-btn-label']) ? $params[
'confirm'][
'cancel-btn-label'] : $langs->trans(
'CloseDialog');
11706 $attr[
'data-confirm-modal'] = !empty($params[
'confirm'][
'modal']) ? $params[
'confirm'][
'modal'] :
true;
11708 $attr[
'class'].=
' butActionConfirm';
11711 if (isset($attr[
'href']) && empty($attr[
'href'])) {
11712 unset($attr[
'href']);
11716 $attr = array_map(
'dol_escape_htmltag', $attr);
11718 $TCompiledAttr = array();
11719 foreach ($attr as $key => $value) {
11720 $TCompiledAttr[] = $key.
'= "'.$value.
'"';
11723 $compiledAttributes = empty($TCompiledAttr) ?
'' : implode(
' ', $TCompiledAttr);
11725 $tag = !empty($attr[
'href']) ?
'a' :
'span';
11728 $parameters = array(
11729 'TCompiledAttr' => $TCompiledAttr,
11730 'compiledAttributes' => $compiledAttributes,
11735 'actionType' => $actionType,
11738 'userRight' => $userRight,
11739 'params' => $params
11742 $reshook = $hookmanager->executeHooks(
'dolGetButtonAction', $parameters, $object, $action);
11743 if ($reshook < 0) {
11747 if (empty($reshook)) {
11749 return '<' . $tag .
' ' . $compiledAttributes .
'>' . $text .
'</' . $tag .
'>';
11751 return '<' . $tag .
' ' . $compiledAttributes .
'>' .
dol_escape_htmltag($text) .
'</' . $tag .
'>';
11754 return $hookmanager->resPrint;
11766 return '<span class="button-title-separator '.$moreClass.
'" ></span>';
11778 if (!empty($fieldValidationErrorMsg)) {
11779 $out.=
'<span class="field-error-icon classfortooltip" title="'.dol_escape_htmltag($fieldValidationErrorMsg, 1).
'" role="alert" >';
11780 $out.=
'<span class="fa fa-exclamation-circle" aria-hidden="true" ></span>';
11799function dolGetButtonTitle($label, $helpText =
'', $iconClass =
'fa fa-file', $url =
'', $id =
'', $status = 1, $params = array())
11801 global $langs, $conf, $user;
11804 if (
getDolGlobalString(
'MAIN_BUTTON_HIDE_UNAUTHORIZED') && (!$user->admin) && $status <= 0) {
11808 $class =
'btnTitle';
11809 if (in_array($iconClass, array(
'fa fa-plus-circle',
'fa fa-plus-circle size15x',
'fa fa-comment-dots',
'fa fa-paper-plane'))) {
11810 $class .=
' btnTitlePlus';
11812 $useclassfortooltip = 1;
11814 if (!empty($params[
'morecss'])) {
11815 $class .=
' '.$params[
'morecss'];
11820 'href' => empty($url) ?
'' : $url
11823 if (!empty($helpText)) {
11825 } elseif (empty($attr[
'title']) && $label) {
11826 $attr[
'title'] = $label;
11827 $useclassfortooltip = 0;
11830 if ($status == 2) {
11831 $attr[
'class'] .=
' btnTitleSelected';
11832 } elseif ($status <= 0) {
11833 $attr[
'class'] .=
' refused';
11835 $attr[
'href'] =
'';
11837 if ($status == -1) {
11838 $attr[
'title'] =
dol_escape_htmltag($langs->transnoentitiesnoconv(
"FeatureDisabled"));
11839 } elseif ($status == 0) {
11840 $attr[
'title'] =
dol_escape_htmltag($langs->transnoentitiesnoconv(
"NotEnoughPermissions"));
11844 if (!empty($attr[
'title']) && $useclassfortooltip) {
11845 $attr[
'class'] .=
' classfortooltip';
11853 if (!empty($params[
'attr']) && is_array($params[
'attr'])) {
11854 foreach ($params[
'attr'] as $key => $value) {
11855 if ($key ==
'class') {
11856 $attr[
'class'] .=
' '.$value;
11857 } elseif ($key ==
'classOverride') {
11858 $attr[
'class'] = $value;
11860 $attr[$key] = $value;
11865 if (isset($attr[
'href']) && empty($attr[
'href'])) {
11866 unset($attr[
'href']);
11872 $attr = array_map(
'dol_escape_htmltag', $attr);
11874 $TCompiledAttr = array();
11875 foreach ($attr as $key => $value) {
11876 $TCompiledAttr[] = $key.
'="'.$value.
'"';
11879 $compiledAttributes = (empty($TCompiledAttr) ?
'' : implode(
' ', $TCompiledAttr));
11881 $tag = (empty($attr[
'href']) ?
'span' :
'a');
11883 $button =
'<'.$tag.
' '.$compiledAttributes.
'>';
11884 $button .=
'<span class="'.$iconClass.
' valignmiddle btnTitle-icon"></span>';
11885 if (!empty($params[
'forcenohideoftext'])) {
11886 $button .=
'<span class="valignmiddle text-plus-circle btnTitle-label'.(empty($params[
'forcenohideoftext']) ?
' hideonsmartphone' :
'').
'">'.$label.
'</span>';
11888 $button .=
'</'.$tag.
'>';
11905 global $conf, $db, $hookmanager;
11911 $classfile = $classname = $classpath = $subdir = $dir_output =
'';
11914 $module = $element_type;
11915 $element = $element_type;
11916 $subelement = $element_type;
11917 $table_element = $element_type;
11920 if (preg_match(
'/^([^@]+)@([^@]+)$/i', $element_type, $regs)) {
11921 $element = $subelement = $regs[1];
11922 $module = $regs[2];
11927 if (preg_match(
'/^([^_]+)_([^_]+)/i', $element, $regs)) {
11928 $module = $element = $regs[1];
11929 $subelement = $regs[2];
11933 if ($element_type ==
"action" || $element_type ==
"actioncomm") {
11934 $classpath =
'comm/action/class';
11935 $subelement =
'Actioncomm';
11936 $module =
'agenda';
11937 $table_element =
'actioncomm';
11938 } elseif ($element_type ==
'cronjob') {
11939 $classpath =
'cron/class';
11941 $table_element =
'cron';
11942 } elseif ($element_type ==
'adherent_type') {
11943 $classpath =
'adherents/class';
11944 $classfile =
'adherent_type';
11945 $module =
'adherent';
11946 $subelement =
'adherent_type';
11947 $classname =
'AdherentType';
11948 $table_element =
'adherent_type';
11949 } elseif ($element_type ==
'bank_account') {
11950 $classpath =
'compta/bank/class';
11952 $classfile =
'account';
11953 $classname =
'Account';
11954 } elseif ($element_type ==
'category') {
11955 $classpath =
'categories/class';
11956 $module =
'categorie';
11957 $subelement =
'categorie';
11958 $table_element =
'categorie';
11959 } elseif ($element_type ==
'contact') {
11960 $classpath =
'contact/class';
11961 $classfile =
'contact';
11962 $module =
'societe';
11963 $subelement =
'contact';
11964 $table_element =
'socpeople';
11965 } elseif ($element_type ==
'inventory') {
11966 $module =
'product';
11967 $classpath =
'product/inventory/class';
11968 } elseif ($element_type ==
'stock' || $element_type ==
'entrepot') {
11970 $classpath =
'product/stock/class';
11971 $classfile =
'entrepot';
11972 $classname =
'Entrepot';
11973 $table_element =
'entrepot';
11974 } elseif ($element_type ==
'project') {
11975 $classpath =
'projet/class';
11976 $module =
'projet';
11977 $table_element =
'projet';
11978 } elseif ($element_type ==
'project_task') {
11979 $classpath =
'projet/class';
11980 $module =
'projet';
11981 $subelement =
'task';
11982 $table_element =
'projet_task';
11983 } elseif ($element_type ==
'facture' || $element_type ==
'invoice') {
11984 $classpath =
'compta/facture/class';
11985 $module =
'facture';
11986 $subelement =
'facture';
11987 $table_element =
'facture';
11988 } elseif ($element_type ==
'commande' || $element_type ==
'order') {
11989 $classpath =
'commande/class';
11990 $module =
'commande';
11991 $subelement =
'commande';
11992 $table_element =
'commande';
11993 } elseif ($element_type ==
'propal') {
11994 $classpath =
'comm/propal/class';
11995 $table_element =
'propal';
11996 } elseif ($element_type ==
'shipping') {
11997 $classpath =
'expedition/class';
11998 $classfile =
'expedition';
11999 $classname =
'Expedition';
12000 $module =
'expedition';
12001 $table_element =
'expedition';
12002 } elseif ($element_type ==
'supplier_proposal') {
12003 $classpath =
'supplier_proposal/class';
12004 $module =
'supplier_proposal';
12005 $element =
'supplierproposal';
12006 $classfile =
'supplier_proposal';
12007 $subelement =
'supplierproposal';
12008 } elseif ($element_type ==
'shipping') {
12009 $classpath =
'expedition/class';
12010 $subelement =
'expedition';
12011 $module =
'expedition_bon';
12012 } elseif ($element_type ==
'delivery') {
12013 $classpath =
'delivery/class';
12014 $subelement =
'delivery';
12015 $module =
'expedition';
12016 } elseif ($element_type ==
'contract') {
12017 $classpath =
'contrat/class';
12018 $module =
'contrat';
12019 $subelement =
'contrat';
12020 $table_element =
'contract';
12021 } elseif ($element_type ==
'mailing') {
12022 $classpath =
'comm/mailing/class';
12023 $module =
'mailing';
12024 $classfile =
'mailing';
12025 $classname =
'Mailing';
12027 } elseif ($element_type ==
'member') {
12028 $classpath =
'adherents/class';
12029 $module =
'adherent';
12030 $subelement =
'adherent';
12031 $table_element =
'adherent';
12032 } elseif ($element_type ==
'usergroup') {
12033 $classpath =
'user/class';
12035 } elseif ($element_type ==
'mo') {
12036 $classpath =
'mrp/class';
12041 $table_element =
'mrp_mo';
12042 } elseif ($element_type ==
'cabinetmed_cons') {
12043 $classpath =
'cabinetmed/class';
12044 $module =
'cabinetmed';
12045 $subelement =
'cabinetmedcons';
12046 $table_element =
'cabinetmedcons';
12047 } elseif ($element_type ==
'fichinter') {
12048 $classpath =
'fichinter/class';
12049 $module =
'ficheinter';
12050 $subelement =
'fichinter';
12051 $table_element =
'fichinter';
12052 } elseif ($element_type ==
'dolresource' || $element_type ==
'resource') {
12053 $classpath =
'resource/class';
12054 $module =
'resource';
12055 $subelement =
'dolresource';
12056 $table_element =
'resource';
12057 } elseif ($element_type ==
'propaldet') {
12058 $classpath =
'comm/propal/class';
12059 $module =
'propal';
12060 $subelement =
'propaleligne';
12061 } elseif ($element_type ==
'opensurvey_sondage') {
12062 $classpath =
'opensurvey/class';
12063 $module =
'opensurvey';
12064 $subelement =
'opensurveysondage';
12065 } elseif ($element_type ==
'order_supplier') {
12066 $classpath =
'fourn/class';
12067 $module =
'fournisseur';
12068 $classfile =
'fournisseur.commande';
12069 $element =
'order_supplier';
12071 $classname =
'CommandeFournisseur';
12072 $table_element =
'commande_fournisseur';
12073 } elseif ($element_type ==
'commande_fournisseurdet') {
12074 $classpath =
'fourn/class';
12075 $module =
'fournisseur';
12076 $classfile =
'fournisseur.commande';
12077 $element =
'commande_fournisseurdet';
12079 $classname =
'CommandeFournisseurLigne';
12080 $table_element =
'commande_fournisseurdet';
12081 } elseif ($element_type ==
'invoice_supplier') {
12082 $classpath =
'fourn/class';
12083 $module =
'fournisseur';
12084 $classfile =
'fournisseur.facture';
12085 $element =
'invoice_supplier';
12087 $classname =
'FactureFournisseur';
12088 $table_element =
'facture_fourn';
12089 } elseif ($element_type ==
"service") {
12090 $classpath =
'product/class';
12091 $subelement =
'product';
12092 $table_element =
'product';
12093 } elseif ($element_type ==
'salary') {
12094 $classpath =
'salaries/class';
12095 $module =
'salaries';
12096 } elseif ($element_type ==
'payment_salary') {
12097 $classpath =
'salaries/class';
12098 $classfile =
'paymentsalary';
12099 $classname =
'PaymentSalary';
12100 $module =
'salaries';
12101 } elseif ($element_type ==
'productlot') {
12102 $module =
'productbatch';
12103 $classpath =
'product/stock/class';
12104 $classfile =
'productlot';
12105 $classname =
'Productlot';
12106 $element =
'productlot';
12108 $table_element =
'product_lot';
12109 } elseif ($element_type ==
'websitepage') {
12110 $classpath =
'website/class';
12111 $classfile =
'websitepage';
12112 $classname =
'Websitepage';
12113 $module =
'website';
12114 $subelement =
'websitepage';
12115 $table_element =
'website_page';
12116 } elseif ($element_type ==
'fiscalyear') {
12117 $classpath =
'core/class';
12118 $module =
'accounting';
12119 $subelement =
'fiscalyear';
12120 } elseif ($element_type ==
'chargesociales') {
12121 $classpath =
'compta/sociales/class';
12123 $table_element =
'chargesociales';
12124 } elseif ($element_type ==
'tva') {
12125 $classpath =
'compta/tva/class';
12128 $table_element =
'tva';
12129 } elseif ($element_type ==
'emailsenderprofile') {
12131 $classpath =
'core/class';
12132 $classfile =
'emailsenderprofile';
12133 $classname =
'EmailSenderProfile';
12134 $table_element =
'c_email_senderprofile';
12136 } elseif ($element_type ==
'ccountry') {
12138 $classpath =
'core/class';
12139 $classfile =
'ccountry';
12140 $classname =
'Ccountry';
12141 $table_element =
'c_country';
12145 if (empty($classfile)) {
12146 $classfile = strtolower($subelement);
12148 if (empty($classname)) {
12149 $classname = ucfirst($subelement);
12151 if (empty($classpath)) {
12152 $classpath = $module.
'/class';
12158 if ($module && isset($conf->$module)) {
12159 if (!empty($conf->$module->multidir_output[$conf->entity])) {
12160 $dir_output = $conf->$module->multidir_output[$conf->entity];
12161 } elseif (!empty($conf->$module->output[$conf->entity])) {
12162 $dir_output = $conf->$module->output[$conf->entity];
12163 } elseif (!empty($conf->$module->dir_output)) {
12164 $dir_output = $conf->$module->dir_output;
12169 if ($element ==
'order_supplier') {
12170 $dir_output = $conf->fournisseur->commande->dir_output;
12171 } elseif ($element ==
'invoice_supplier') {
12172 $dir_output = $conf->fournisseur->facture->dir_output;
12174 $dir_output .= $subdir;
12176 $elementProperties = array(
12177 'module' => $module,
12178 'element' => $element,
12179 'table_element' => $table_element,
12180 'subelement' => $subelement,
12181 'classpath' => $classpath,
12182 'classfile' => $classfile,
12183 'classname' => $classname,
12184 'dir_output' => $dir_output
12189 if (!is_object($hookmanager)) {
12190 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
12193 $hookmanager->initHooks(array(
'elementproperties'));
12197 $parameters = array(
12198 'elementType' => $element_type,
12199 'elementProperties' => $elementProperties
12202 $reshook = $hookmanager->executeHooks(
'getElementProperties', $parameters);
12205 $elementProperties = $hookmanager->resArray;
12206 } elseif (!empty($hookmanager->resArray) && is_array($hookmanager->resArray)) {
12207 $elementProperties = array_replace($elementProperties, $hookmanager->resArray);
12211 if (($key = array_search(
'elementproperties', $hookmanager->contextarray)) !==
false) {
12212 unset($hookmanager->contextarray[$key]);
12215 return $elementProperties;
12236 if ($element_prop[
'module'] ==
'product' || $element_prop[
'module'] ==
'service') {
12241 $ismodenabled = (isModEnabled(
'product') || isModEnabled(
'service'));
12243 $ismodenabled = isModEnabled($element_prop[
'module']);
12248 if (is_array($element_prop) && (empty($element_prop[
'module']) || $ismodenabled)) {
12249 dol_include_once(
'/'.$element_prop[
'classpath'].
'/'.$element_prop[
'classfile'].
'.class.php');
12251 if (class_exists($element_prop[
'classname'])) {
12252 $classname = $element_prop[
'classname'];
12253 $objecttmp =
new $classname($db);
12255 if ($element_id > 0 || !empty($element_ref)) {
12256 $ret = $objecttmp->fetch($element_id, $element_ref);
12258 if (empty($objecttmp->module)) {
12259 $objecttmp->module = $element_prop[
'module'];
12282 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)) {
12298 return empty($_SESSION[
'newtoken']) ?
'' : $_SESSION[
'newtoken'];
12310 return isset($_SESSION[
'token']) ? $_SESSION[
'token'] :
'';
12322 if (empty($conf->cache[
'nonce'])) {
12326 return $conf->cache[
'nonce'];
12346 print
'<div class="div-table-responsive-no-min">';
12347 print
'<table class="noborder centpercent">';
12348 print
'<tr class="liste_titre">';
12350 print $emptyRows < 1 ?
'<th>' :
'<th colspan="'.($emptyRows + 1).
'">';
12352 print $langs->trans($header);
12355 if ($number > -1) {
12359 if (!empty($link)) {
12360 if (!empty($arguments)) {
12361 print
'<a href="'.DOL_URL_ROOT.
'/'.$link.
'?'.$arguments.
'">';
12363 print
'<a href="'.DOL_URL_ROOT.
'/'.$link.
'">';
12367 if ($number > -1) {
12368 print
'<span class="badge">'.$number.
'</span>';
12371 if (!empty($link)) {
12377 if ($number < 0 && !empty($link)) {
12378 print
'<th class="right">';
12380 if (!empty($arguments)) {
12381 print
'<a class="commonlink" href="'.DOL_URL_ROOT.
'/'.$link.
'?'.$arguments.
'">';
12383 print
'<a class="commonlink" href="'.DOL_URL_ROOT.
'/'.$link.
'">';
12386 print $langs->trans(
"FullList");
12407 if ($addLineBreak) {
12423function addSummaryTableLine($tableColumnCount, $num, $nbofloop = 0, $total = 0, $noneWord =
"None", $extraRightColumn =
false)
12428 print
'<tr class="oddeven">';
12429 print
'<td colspan="'.$tableColumnCount.
'"><span class="opacitymedium">'.$langs->trans($noneWord).
'</span></td>';
12434 if ($nbofloop === 0) {
12440 $colspan = $tableColumnCount;
12441 } elseif ($num > $nbofloop) {
12442 $colspan = $tableColumnCount;
12444 $colspan = $tableColumnCount - 1;
12447 if ($extraRightColumn) {
12451 print
'<tr class="liste_total">';
12453 if ($nbofloop > 0 && $num > $nbofloop) {
12454 print
'<td colspan="'.$colspan.
'" class="right">'.$langs->trans(
"XMoreLines", ($num - $nbofloop)).
'</td>';
12456 print
'<td colspan="'.$colspan.
'" class="right"> '.$langs->trans(
"Total").
'</td>';
12457 print
'<td class="right centpercent">'.price($total).
'</td>';
12460 if ($extraRightColumn) {
12477 if ($method == -1) {
12488 while (ob_get_level()) {
12493 if ($method == 0) {
12494 readfile($fullpath_original_file_osencoded);
12495 } elseif ($method == 1) {
12497 $handle = fopen($fullpath_original_file_osencoded,
"rb");
12498 while (!feof($handle)) {
12499 print fread($handle, 8192);
12502 } elseif ($method == 2) {
12504 $handle1 = fopen($fullpath_original_file_osencoded,
"rb");
12505 $handle2 = fopen(
"php://output",
"wb");
12506 stream_copy_to_stream($handle1, $handle2);
12531 if ($texttoshow ===
'none') {
12532 $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>';
12533 } elseif ($texttoshow) {
12534 $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>';
12536 $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>';
12551 $result = json_decode($stringtodecode);
12552 if ($result ===
null) {
12553 $result = unserialize($stringtodecode);
12575 if (empty($filter)) {
12579 if (!preg_match(
'/^\(.*\)$/', $filter)) {
12580 $filter =
'(' . $filter .
')';
12583 $regexstring =
'\(([a-zA-Z0-9_\.]+:[<>!=insotlke]+:[^\(\)]+)\)';
12589 return 'Filter syntax error - '.$errorstr;
12594 $t = preg_replace_callback(
'/'.$regexstring.
'/i',
'dolForgeDummyCriteriaCallback', $filter);
12595 $t = str_replace(array(
'and',
'or',
'AND',
'OR',
' '),
'', $t);
12597 if (preg_match(
'/[^\(\)]/', $t)) {
12598 $errorstr =
'Bad syntax of the search string';
12602 return 'Filter syntax error - '.$errorstr;
12606 return ($noand ?
"" :
" AND ").($nopar ?
"" :
'(').preg_replace_callback(
'/'.$regexstring.
'/i',
'dolForgeCriteriaCallback', $filter).($nopar ?
"" :
')');
12620 $tmp = $sqlfilters;
12622 $nb = strlen($tmp);
12625 if ($tmp[$i] ==
'(') {
12628 if ($tmp[$i] ==
')') {
12631 if ($counter < 0) {
12632 $error =
"Wrond balance of parenthesis in sqlfilters=".$sqlfilters;
12651 if (empty($matches[1])) {
12654 $tmp = explode(
':', $matches[1]);
12655 if (count($tmp) < 3) {
12675 if (empty($matches[1])) {
12678 $tmp = explode(
':', $matches[1]);
12679 if (count($tmp) < 3) {
12683 $operand = preg_replace(
'/[^a-z0-9\._]/i',
'', trim($tmp[0]));
12685 $operator = strtoupper(preg_replace(
'/[^a-z<>!=]/i',
'', trim($tmp[1])));
12688 'NOTLIKE' =>
'NOT LIKE',
12689 'ISNOT' =>
'IS NOT',
12690 'NOTIN' =>
'NOT IN',
12694 if (array_key_exists($operator, $realOperator)) {
12695 $operator = $realOperator[$operator];
12699 $tmpescaped = $tmp[2];
12702 if ($operator ==
'IN' || $operator ==
'NOT IN') {
12704 $tmpescaped2 =
'(';
12706 $tmpelemarray = explode(
',', $tmpescaped);
12707 foreach ($tmpelemarray as $tmpkey => $tmpelem) {
12709 if (preg_match(
'/^\'(.*)\'$/', $tmpelem, $reg)) {
12710 $tmpelemarray[$tmpkey] =
"'".$db->escape($db->sanitize($reg[1], 1, 1, 1)).
"'";
12712 $tmpelemarray[$tmpkey] = $db->escape($db->sanitize($tmpelem, 1, 1, 1));
12715 $tmpescaped2 .= join(
',', $tmpelemarray);
12716 $tmpescaped2 .=
')';
12718 $tmpescaped = $tmpescaped2;
12719 } elseif ($operator ==
'LIKE' || $operator ==
'NOT LIKE') {
12720 if (preg_match(
'/^\'(.*)\'$/', $tmpescaped, $regbis)) {
12721 $tmpescaped = $regbis[1];
12724 $tmpescaped =
"'".$db->escape($tmpescaped).
"'";
12725 } elseif (preg_match(
'/^\'(.*)\'$/', $tmpescaped, $regbis)) {
12726 $tmpescaped =
"'".$db->escape($regbis[1]).
"'";
12728 if (strtoupper($tmpescaped) ==
'NULL') {
12729 $tmpescaped =
'NULL';
12730 } elseif (is_int($tmpescaped)) {
12731 $tmpescaped = (int) $tmpescaped;
12733 $tmpescaped = (float) $tmpescaped;
12737 return '('.$db->escape($operand).
' '.strtoupper($operator).
' '.$tmpescaped.
')';
12752 global $conf, $langs;
12754 $out =
'<!-- timeline icon -->'.
"\n";
12755 $iconClass =
'fa fa-comments';
12760 if ($histo[$key][
'percent'] == -1) {
12761 $colorClass =
'timeline-icon-not-applicble';
12762 $pictoTitle = $langs->trans(
'StatusNotApplicable');
12763 } elseif ($histo[$key][
'percent'] == 0) {
12764 $colorClass =
'timeline-icon-todo';
12765 $pictoTitle = $langs->trans(
'StatusActionToDo').
' (0%)';
12766 } elseif ($histo[$key][
'percent'] > 0 && $histo[$key][
'percent'] < 100) {
12767 $colorClass =
'timeline-icon-in-progress';
12768 $pictoTitle = $langs->trans(
'StatusActionInProcess').
' ('.$histo[$key][
'percent'].
'%)';
12769 } elseif ($histo[$key][
'percent'] >= 100) {
12770 $colorClass =
'timeline-icon-done';
12771 $pictoTitle = $langs->trans(
'StatusActionDone').
' (100%)';
12774 if ($actionstatic->code ==
'AC_TICKET_CREATE') {
12775 $iconClass =
'fa fa-ticket';
12776 } elseif ($actionstatic->code ==
'AC_TICKET_MODIFY') {
12777 $iconClass =
'fa fa-pencilxxx';
12778 } elseif (preg_match(
'/^TICKET_MSG/', $actionstatic->code)) {
12779 $iconClass =
'fa fa-comments';
12780 } elseif (preg_match(
'/^TICKET_MSG_PRIVATE/', $actionstatic->code)) {
12781 $iconClass =
'fa fa-mask';
12783 if ($actionstatic->type_picto) {
12784 $img_picto =
img_picto(
'', $actionstatic->type_picto);
12786 if ($actionstatic->type_code ==
'AC_RDV') {
12787 $iconClass =
'fa fa-handshake';
12788 } elseif ($actionstatic->type_code ==
'AC_TEL') {
12789 $iconClass =
'fa fa-phone';
12790 } elseif ($actionstatic->type_code ==
'AC_FAX') {
12791 $iconClass =
'fa fa-fax';
12792 } elseif ($actionstatic->type_code ==
'AC_EMAIL') {
12793 $iconClass =
'fa fa-envelope';
12794 } elseif ($actionstatic->type_code ==
'AC_INT') {
12795 $iconClass =
'fa fa-shipping-fast';
12796 } elseif ($actionstatic->type_code ==
'AC_OTH_AUTO') {
12797 $iconClass =
'fa fa-robot';
12798 } elseif (!preg_match(
'/_AUTO/', $actionstatic->type_code)) {
12799 $iconClass =
'fa fa-robot';
12804 $out .=
'<i class="'.$iconClass.
' '.$colorClass.
'" title="'.$pictoTitle.
'">'.$img_picto.
'</i>'.
"\n";
12818 $documents = array();
12820 $sql =
'SELECT ecm.rowid as id, ecm.src_object_type, ecm.src_object_id, ecm.filepath, ecm.filename';
12821 $sql .=
' FROM '.MAIN_DB_PREFIX.
'ecm_files ecm';
12822 $sql .=
" WHERE ecm.filepath = 'agenda/".((int) $object->id).
"'";
12824 $sql .=
' ORDER BY ecm.position ASC';
12826 $resql = $db->query($sql);
12828 if ($db->num_rows($resql)) {
12829 while ($obj = $db->fetch_object($resql)) {
12830 $documents[$obj->id] = $obj;
12857function show_actions_messaging($conf, $langs, $db, $filterobj, $objcon =
'', $noprint = 0, $actioncode =
'', $donetodo =
'done', $filters = array(), $sortfield =
'a.datep,a.id', $sortorder =
'DESC')
12859 global $user, $conf;
12862 global $param, $massactionbutton;
12867 if (!is_object($filterobj) && !is_object($objcon)) {
12875 $sortfield_list = explode(
',', $sortfield);
12876 $sortfield_label_list = array(
'a.id' =>
'id',
'a.datep' =>
'dp',
'a.percent' =>
'percent');
12877 $sortfield_new_list = array();
12878 foreach ($sortfield_list as $sortfield_value) {
12879 $sortfield_new_list[] = $sortfield_label_list[trim($sortfield_value)];
12881 $sortfield_new = implode(
',', $sortfield_new_list);
12883 if (isModEnabled(
'agenda')) {
12885 if (is_object($objcon) && $objcon->id > 0) {
12886 $sql =
"SELECT DISTINCT a.id, a.label as label,";
12888 $sql =
"SELECT a.id, a.label as label,";
12890 $sql .=
" a.datep as dp,";
12891 $sql .=
" a.note as message,";
12892 $sql .=
" a.datep2 as dp2,";
12893 $sql .=
" a.percent as percent, 'action' as type,";
12894 $sql .=
" a.fk_element, a.elementtype,";
12895 $sql .=
" a.fk_contact,";
12896 $sql .=
" a.email_from as msg_from,";
12897 $sql .=
" c.code as acode, c.libelle as alabel, c.picto as apicto,";
12898 $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";
12899 if (is_object($filterobj) && get_class($filterobj) ==
'Societe') {
12900 $sql .=
", sp.lastname, sp.firstname";
12901 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
12902 $sql .=
", m.lastname, m.firstname";
12903 } elseif (is_object($filterobj) && get_class($filterobj) ==
'CommandeFournisseur') {
12905 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Product') {
12907 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
12909 } elseif (is_object($filterobj) && get_class($filterobj) ==
'BOM') {
12911 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Contrat') {
12914 $sql .=
" FROM ".MAIN_DB_PREFIX.
"actioncomm as a";
12915 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"user as u on u.rowid = a.fk_user_action";
12916 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"c_actioncomm as c ON a.fk_action = c.id";
12918 $force_filter_contact =
false;
12919 if (is_object($objcon) && $objcon->id > 0) {
12920 $force_filter_contact =
true;
12921 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"actioncomm_resources as r ON a.id = r.fk_actioncomm";
12922 $sql .=
" AND r.element_type = '".$db->escape($objcon->table_element).
"' AND r.fk_element = ".((int) $objcon->id);
12925 if (is_object($filterobj) && get_class($filterobj) ==
'Societe') {
12926 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"socpeople as sp ON a.fk_contact = sp.rowid";
12927 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Dolresource') {
12928 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"element_resources as er";
12929 $sql .=
" ON er.resource_type = 'dolresource'";
12930 $sql .=
" AND er.element_id = a.id";
12931 $sql .=
" AND er.resource_id = ".((int) $filterobj->id);
12932 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
12933 $sql .=
", ".MAIN_DB_PREFIX.
"adherent as m";
12934 } elseif (is_object($filterobj) && get_class($filterobj) ==
'CommandeFournisseur') {
12935 $sql .=
", ".MAIN_DB_PREFIX.
"commande_fournisseur as o";
12936 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Product') {
12937 $sql .=
", ".MAIN_DB_PREFIX.
"product as o";
12938 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
12939 $sql .=
", ".MAIN_DB_PREFIX.
"ticket as o";
12940 } elseif (is_object($filterobj) && get_class($filterobj) ==
'BOM') {
12941 $sql .=
", ".MAIN_DB_PREFIX.
"bom_bom as o";
12942 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Contrat') {
12943 $sql .=
", ".MAIN_DB_PREFIX.
"contrat as o";
12946 $sql .=
" WHERE a.entity IN (".getEntity(
'agenda').
")";
12947 if ($force_filter_contact ===
false) {
12948 if (is_object($filterobj) && in_array(get_class($filterobj), array(
'Societe',
'Client',
'Fournisseur')) && $filterobj->id) {
12949 $sql .=
" AND a.fk_soc = ".((int) $filterobj->id);
12950 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Project' && $filterobj->id) {
12951 $sql .=
" AND a.fk_project = ".((int) $filterobj->id);
12952 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
12953 $sql .=
" AND a.fk_element = m.rowid AND a.elementtype = 'member'";
12954 if ($filterobj->id) {
12955 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
12957 } elseif (is_object($filterobj) && get_class($filterobj) ==
'CommandeFournisseur') {
12958 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'order_supplier'";
12959 if ($filterobj->id) {
12960 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
12962 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Product') {
12963 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'product'";
12964 if ($filterobj->id) {
12965 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
12967 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
12968 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'ticket'";
12969 if ($filterobj->id) {
12970 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
12972 } elseif (is_object($filterobj) && get_class($filterobj) ==
'BOM') {
12973 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'bom'";
12974 if ($filterobj->id) {
12975 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
12977 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Contrat') {
12978 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'contract'";
12979 if ($filterobj->id) {
12980 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
12986 if (!empty($actioncode)) {
12988 if ($actioncode ==
'AC_NON_AUTO') {
12989 $sql .=
" AND c.type != 'systemauto'";
12990 } elseif ($actioncode ==
'AC_ALL_AUTO') {
12991 $sql .=
" AND c.type = 'systemauto'";
12993 if ($actioncode ==
'AC_OTH') {
12994 $sql .=
" AND c.type != 'systemauto'";
12995 } elseif ($actioncode ==
'AC_OTH_AUTO') {
12996 $sql .=
" AND c.type = 'systemauto'";
13000 if ($actioncode ==
'AC_NON_AUTO') {
13001 $sql .=
" AND c.type != 'systemauto'";
13002 } elseif ($actioncode ==
'AC_ALL_AUTO') {
13003 $sql .=
" AND c.type = 'systemauto'";
13005 $sql .=
" AND c.code = '".$db->escape($actioncode).
"'";
13009 if ($donetodo ==
'todo') {
13010 $sql .=
" AND ((a.percent >= 0 AND a.percent < 100) OR (a.percent = -1 AND a.datep > '".$db->idate($now).
"'))";
13011 } elseif ($donetodo ==
'done') {
13012 $sql .=
" AND (a.percent = 100 OR (a.percent = -1 AND a.datep <= '".$db->idate($now).
"'))";
13014 if (is_array($filters) && $filters[
'search_agenda_label']) {
13015 $sql .=
natural_search(
'a.label', $filters[
'search_agenda_label']);
13020 if (isModEnabled(
'mailing') && !empty($objcon->email)
13021 && (empty($actioncode) || $actioncode ==
'AC_OTH_AUTO' || $actioncode ==
'AC_EMAILING')) {
13022 $langs->load(
"mails");
13024 $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";
13025 $sql2 .=
", null as fk_element, '' as elementtype, null as contact_id";
13026 $sql2 .=
", 'AC_EMAILING' as acode, '' as alabel, '' as apicto";
13027 $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";
13028 if (is_object($filterobj) && get_class($filterobj) ==
'Societe') {
13029 $sql2 .=
", '' as lastname, '' as firstname";
13030 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
13031 $sql2 .=
", '' as lastname, '' as firstname";
13032 } elseif (is_object($filterobj) && get_class($filterobj) ==
'CommandeFournisseur') {
13033 $sql2 .=
", '' as ref";
13034 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Product') {
13035 $sql2 .=
", '' as ref";
13036 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
13037 $sql2 .=
", '' as ref";
13039 $sql2 .=
" FROM ".MAIN_DB_PREFIX.
"mailing as m, ".MAIN_DB_PREFIX.
"mailing_cibles as mc, ".MAIN_DB_PREFIX.
"user as u";
13040 $sql2 .=
" WHERE mc.email = '".$db->escape($objcon->email).
"'";
13041 $sql2 .=
" AND mc.statut = 1";
13042 $sql2 .=
" AND u.rowid = m.fk_user_valid";
13043 $sql2 .=
" AND mc.fk_mailing=m.rowid";
13046 if (!empty($sql) && !empty($sql2)) {
13047 $sql = $sql.
" UNION ".$sql2;
13048 } elseif (empty($sql) && !empty($sql2)) {
13054 $sql .= $db->order($sortfield_new, $sortorder);
13056 dol_syslog(
"function.lib::show_actions_messaging", LOG_DEBUG);
13057 $resql = $db->query($sql);
13060 $num = $db->num_rows($resql);
13062 while ($i < $num) {
13063 $obj = $db->fetch_object($resql);
13065 if ($obj->type ==
'action') {
13067 $contactaction->id = $obj->id;
13068 $result = $contactaction->fetchResources();
13071 setEventMessage(
"actions.lib::show_actions_messaging Error fetch ressource",
'errors');
13077 if (($obj->percent >= 0 and $obj->percent < 100) || ($obj->percent == -1 && $obj->dp > $now)) {
13078 $tododone =
'todo';
13081 $histo[$numaction] = array(
13082 'type'=>$obj->type,
13083 'tododone'=>$tododone,
13085 'datestart'=>$db->jdate($obj->dp),
13086 'dateend'=>$db->jdate($obj->dp2),
13087 'note'=>$obj->label,
13088 'message'=>$obj->message,
13089 'percent'=>$obj->percent,
13091 'userid'=>$obj->user_id,
13092 'login'=>$obj->user_login,
13093 'userfirstname'=>$obj->user_firstname,
13094 'userlastname'=>$obj->user_lastname,
13095 'userphoto'=>$obj->user_photo,
13096 'msg_from'=>$obj->msg_from,
13098 'contact_id'=>$obj->fk_contact,
13099 'socpeopleassigned' => $contactaction->socpeopleassigned,
13100 'lastname' => (empty($obj->lastname) ?
'' : $obj->lastname),
13101 'firstname' => (empty($obj->firstname) ?
'' : $obj->firstname),
13102 'fk_element'=>$obj->fk_element,
13103 'elementtype'=>$obj->elementtype,
13105 'acode'=>$obj->acode,
13106 'alabel'=>$obj->alabel,
13107 'libelle'=>$obj->alabel,
13108 'apicto'=>$obj->apicto
13111 $histo[$numaction] = array(
13112 'type'=>$obj->type,
13113 'tododone'=>
'done',
13115 'datestart'=>$db->jdate($obj->dp),
13116 'dateend'=>$db->jdate($obj->dp2),
13117 'note'=>$obj->label,
13118 'message'=>$obj->message,
13119 'percent'=>$obj->percent,
13120 'acode'=>$obj->acode,
13122 'userid'=>$obj->user_id,
13123 'login'=>$obj->user_login,
13124 'userfirstname'=>$obj->user_firstname,
13125 'userlastname'=>$obj->user_lastname,
13126 'userphoto'=>$obj->user_photo
13141 if (!isModEnabled(
'agenda')) {
13142 $langs->loadLangs(array(
"admin",
"errors"));
13143 $out =
info_admin($langs->trans(
"WarningModuleXDisabledSoYouMayMissEventHere", $langs->transnoentitiesnoconv(
"Module2400Name")), 0, 0,
'warning');
13146 if (isModEnabled(
'agenda') || (isModEnabled(
'mailing') && !empty($objcon->email))) {
13147 $delay_warning = $conf->global->MAIN_DELAY_ACTIONS_TODO * 24 * 60 * 60;
13149 require_once DOL_DOCUMENT_ROOT.
'/comm/action/class/actioncomm.class.php';
13150 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
13151 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
13152 require_once DOL_DOCUMENT_ROOT.
'/contact/class/contact.class.php';
13157 $userstatic =
new User($db);
13158 $contactstatic =
new Contact($db);
13159 $userGetNomUrlCache = array();
13160 $contactGetNomUrlCache = array();
13162 $out .=
'<div class="filters-container" >';
13163 $out .=
'<form name="listactionsfilter" class="listactionsfilter" action="'.$_SERVER[
"PHP_SELF"].
'" method="POST">';
13164 $out .=
'<input type="hidden" name="token" value="'.newToken().
'">';
13166 if ($objcon && get_class($objcon) ==
'Contact' &&
13167 (is_null($filterobj) || get_class($filterobj) ==
'Societe')) {
13168 $out .=
'<input type="hidden" name="id" value="'.$objcon->id.
'" />';
13170 $out .=
'<input type="hidden" name="id" value="'.$filterobj->id.
'" />';
13172 if ($filterobj && get_class($filterobj) ==
'Societe') {
13173 $out .=
'<input type="hidden" name="socid" value="'.$filterobj->id.
'" />';
13178 $out .=
'<div class="div-table-responsive-no-min">';
13179 $out .=
'<table class="noborder borderbottom centpercent">';
13181 $out .=
'<tr class="liste_titre">';
13185 $out .=
'<th class="liste_titre width50 middle">';
13186 $searchpicto = $form->showFilterAndCheckAddButtons($massactionbutton ? 1 : 0,
'checkforselect', 1);
13187 $out .= $searchpicto;
13191 $out .=
getTitleFieldOfList(
'Date', 0, $_SERVER[
"PHP_SELF"],
'a.datep',
'', $param,
'', $sortfield, $sortorder,
'').
"\n";
13193 $out .=
'<th class="liste_titre"><strong class="hideonsmartphone">'.$langs->trans(
"Search").
' : </strong></th>';
13195 $out .=
'<th class="liste_titre"></th>';
13197 $out .=
'<th class="liste_titre">';
13198 $out .=
'<span class="fas fa-square inline-block fawidth30" style=" color: #ddd;" title="'.$langs->trans(
"ActionType").
'"></span>';
13200 $out .=
$formactions->select_type_actions($actioncode,
"actioncode",
'', !
getDolGlobalString(
'AGENDA_USE_EVENT_TYPE') ? 1 : -1, 0, 0, 1,
'minwidth200imp');
13202 $out .=
'<th class="liste_titre maxwidth100onsmartphone">';
13203 $out .=
'<input type="text" class="maxwidth100onsmartphone" name="search_agenda_label" value="'.$filters[
'search_agenda_label'].
'" placeholder="'.$langs->trans(
"Label").
'">';
13208 $out .=
'<th class="liste_titre width50 middle">';
13209 $searchpicto = $form->showFilterAndCheckAddButtons($massactionbutton ? 1 : 0,
'checkforselect', 1);
13210 $out .= $searchpicto;
13217 $out .=
'</table>';
13224 $out .=
'<ul class="timeline">';
13228 if (get_class($filterobj) ==
'Societe') {
13229 $tmp .=
'<a href="'.DOL_URL_ROOT.
'/comm/action/list.php?mode=show_list&socid='.$filterobj->id.
'&status=done">';
13231 $tmp .= ($donetodo !=
'done' ? $langs->trans(
"ActionsToDoShort") :
'');
13232 $tmp .= ($donetodo !=
'done' && $donetodo !=
'todo' ?
' / ' :
'');
13233 $tmp .= ($donetodo !=
'todo' ? $langs->trans(
"ActionsDoneShort") :
'');
13235 if (get_class($filterobj) ==
'Societe') {
13241 require_once DOL_DOCUMENT_ROOT.
'/comm/action/class/cactioncomm.class.php';
13243 $arraylist = $caction->liste_array(1,
'code',
'', (!
getDolGlobalString(
'AGENDA_USE_EVENT_TYPE') ? 1 : 0),
'', 1);
13245 $actualCycleDate =
false;
13248 foreach ($histo as $key => $value) {
13249 $actionstatic->fetch($histo[$key][
'id']);
13251 $actionstatic->type_picto = $histo[$key][
'apicto'];
13252 $actionstatic->type_code = $histo[$key][
'acode'];
13254 $labeltype = $actionstatic->type_code;
13255 if (!
getDolGlobalString(
'AGENDA_USE_EVENT_TYPE') && empty($arraylist[$labeltype])) {
13256 $labeltype =
'AC_OTH';
13258 if (!empty($actionstatic->code) && preg_match(
'/^TICKET_MSG/', $actionstatic->code)) {
13259 $labeltype = $langs->trans(
"Message");
13261 if (!empty($arraylist[$labeltype])) {
13262 $labeltype = $arraylist[$labeltype];
13264 if ($actionstatic->type_code ==
'AC_OTH_AUTO' && ($actionstatic->type_code != $actionstatic->code) && $labeltype && !empty($arraylist[$actionstatic->code])) {
13265 $labeltype .=
' - '.$arraylist[$actionstatic->code];
13269 $url = DOL_URL_ROOT.
'/comm/action/card.php?id='.$histo[$key][
'id'];
13271 $tmpa =
dol_getdate($histo[$key][
'datestart'],
false);
13273 if (isset($tmpa[
'year']) && isset($tmpa[
'yday']) && $actualCycleDate !== $tmpa[
'year'].
'-'.$tmpa[
'yday']) {
13274 $actualCycleDate = $tmpa[
'year'].
'-'.$tmpa[
'yday'];
13275 $out .=
'<!-- timeline time label -->';
13276 $out .=
'<li class="time-label">';
13277 $out .=
'<span class="timeline-badge-date">';
13278 $out .=
dol_print_date($histo[$key][
'datestart'],
'daytext',
'tzuserrel', $langs);
13281 $out .=
'<!-- /.timeline-label -->';
13285 $out .=
'<!-- timeline item -->'.
"\n";
13286 $out .=
'<li class="timeline-code-'.strtolower($actionstatic->code).
'">';
13289 $typeicon = $actionstatic->getTypePicto(
'pictofixedwidth timeline-icon-not-applicble', $labeltype);
13294 $out .=
'<div class="timeline-item">'.
"\n";
13296 $out .=
'<span class="time timeline-header-action2">';
13298 if (isset($histo[$key][
'type']) && $histo[$key][
'type'] ==
'mailing') {
13299 $out .=
'<a class="paddingleft paddingright timeline-btn2 editfielda" href="'.DOL_URL_ROOT.
'/comm/mailing/card.php?id='.$histo[$key][
'id'].
'">'.
img_object($langs->trans(
"ShowEMailing"),
"email").
' ';
13300 $out .= $histo[$key][
'id'];
13303 $out .= $actionstatic->getNomUrl(1, -1,
'valignmiddle').
' ';
13306 if ($user->hasRight(
'agenda',
'allactions',
'create') ||
13307 (($actionstatic->authorid == $user->id || $actionstatic->userownerid == $user->id) && $user->hasRight(
'agenda',
'myactions',
'create'))) {
13308 $out .=
'<a class="paddingleft paddingright timeline-btn2 editfielda" href="'.DOL_MAIN_URL_ROOT.
'/comm/action/card.php?action=edit&token='.
newToken().
'&id='.$actionstatic->id.
'&backtopage='.urlencode($_SERVER[
"PHP_SELF"].
'?'.$param).
'">';
13310 $out .=
img_picto($langs->trans(
"Modify"),
'edit',
'class="edita"');
13317 $out .=
'<span class="time"><i class="fa fa-clock-o valignmiddle"></i> <span class="valignmiddle">';
13318 $out .=
dol_print_date($histo[$key][
'datestart'],
'dayhour',
'tzuserrel');
13319 if ($histo[$key][
'dateend'] && $histo[$key][
'dateend'] != $histo[$key][
'datestart']) {
13320 $tmpa =
dol_getdate($histo[$key][
'datestart'],
true);
13321 $tmpb =
dol_getdate($histo[$key][
'dateend'],
true);
13322 if ($tmpa[
'mday'] == $tmpb[
'mday'] && $tmpa[
'mon'] == $tmpb[
'mon'] && $tmpa[
'year'] == $tmpb[
'year']) {
13323 $out .=
'-'.dol_print_date($histo[$key][
'dateend'],
'hour',
'tzuserrel');
13325 $out .=
'-'.dol_print_date($histo[$key][
'dateend'],
'dayhour',
'tzuserrel');
13329 if ($histo[$key][
'percent'] == 0 && $histo[$key][
'datestart'] && $histo[$key][
'datestart'] < ($now - $delay_warning)) {
13332 if ($histo[$key][
'percent'] == 0 && !$histo[$key][
'datestart'] && $histo[$key][
'dateend'] && $histo[$key][
'datestart'] < ($now - $delay_warning)) {
13335 if ($histo[$key][
'percent'] > 0 && $histo[$key][
'percent'] < 100 && $histo[$key][
'dateend'] && $histo[$key][
'dateend'] < ($now - $delay_warning)) {
13338 if ($histo[$key][
'percent'] > 0 && $histo[$key][
'percent'] < 100 && !$histo[$key][
'dateend'] && $histo[$key][
'datestart'] && $histo[$key][
'datestart'] < ($now - $delay_warning)) {
13344 $out .=
"</span></span>\n";
13347 $out .=
'<h3 class="timeline-header">';
13350 $out .=
'<div class="messaging-author inline-block tdoverflowmax150 valignmiddle marginrightonly">';
13351 if ($histo[$key][
'userid'] > 0) {
13352 if (!isset($userGetNomUrlCache[$histo[$key][
'userid']])) {
13353 $userstatic->fetch($histo[$key][
'userid']);
13354 $userGetNomUrlCache[$histo[$key][
'userid']] = $userstatic->getNomUrl(-1,
'', 0, 0, 16, 0,
'firstelselast',
'');
13356 $out .= $userGetNomUrlCache[$histo[$key][
'userid']];
13357 } elseif (!empty($histo[$key][
'msg_from']) && $actionstatic->code ==
'TICKET_MSG') {
13358 if (!isset($contactGetNomUrlCache[$histo[$key][
'msg_from']])) {
13359 if ($contactstatic->fetch(0,
null,
'', $histo[$key][
'msg_from']) > 0) {
13360 $contactGetNomUrlCache[$histo[$key][
'msg_from']] = $contactstatic->getNomUrl(-1,
'', 16);
13362 $contactGetNomUrlCache[$histo[$key][
'msg_from']] = $histo[$key][
'msg_from'];
13365 $out .= $contactGetNomUrlCache[$histo[$key][
'msg_from']];
13370 $out .=
' <div class="messaging-title inline-block">';
13372 if (empty($conf->dol_optimize_smallscreen) && $actionstatic->type_code !=
'AC_OTH_AUTO') {
13373 $out .= $labeltype.
' - ';
13377 if (preg_match(
'/^TICKET_MSG/', $actionstatic->code)) {
13378 $out .= $langs->trans(
'TicketNewMessage');
13379 } elseif (preg_match(
'/^TICKET_MSG_PRIVATE/', $actionstatic->code)) {
13380 $out .= $langs->trans(
'TicketNewMessage').
' <em>('.$langs->trans(
'Private').
')</em>';
13381 } elseif (isset($histo[$key][
'type'])) {
13382 if ($histo[$key][
'type'] ==
'action') {
13383 $transcode = $langs->transnoentitiesnoconv(
"Action".$histo[$key][
'acode']);
13384 $libelle = ($transcode !=
"Action".$histo[$key][
'acode'] ? $transcode : $histo[$key][
'alabel']);
13385 $libelle = $histo[$key][
'note'];
13386 $actionstatic->id = $histo[$key][
'id'];
13388 } elseif ($histo[$key][
'type'] ==
'mailing') {
13389 $out .=
'<a href="'.DOL_URL_ROOT.
'/comm/mailing/card.php?id='.$histo[$key][
'id'].
'">'.
img_object($langs->trans(
"ShowEMailing"),
"email").
' ';
13390 $transcode = $langs->transnoentitiesnoconv(
"Action".$histo[$key][
'acode']);
13391 $libelle = ($transcode !=
"Action".$histo[$key][
'acode'] ? $transcode :
'Send mass mailing');
13394 $libelle .= $histo[$key][
'note'];
13399 if (isset($histo[$key][
'elementtype']) && !empty($histo[$key][
'fk_element'])) {
13400 if (isset($conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']]) && isset($conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']][$histo[$key][
'fk_element']])) {
13401 $link = $conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']][$histo[$key][
'fk_element']];
13403 if (!isset($conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']])) {
13404 $conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']] = array();
13406 $link =
dolGetElementUrl($histo[$key][
'fk_element'], $histo[$key][
'elementtype'], 1);
13407 $conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']][$histo[$key][
'fk_element']] = $link;
13410 $out .=
' - '.$link;
13419 if (!empty($histo[$key][
'message'] && $histo[$key][
'message'] != $libelle)
13420 && $actionstatic->code !=
'AC_TICKET_CREATE'
13421 && $actionstatic->code !=
'AC_TICKET_MODIFY'
13423 $out .=
'<div class="timeline-body wordbreak">';
13424 $truncateLines =
getDolGlobalInt(
'MAIN_TRUNCATE_TIMELINE_MESSAGE', 3);
13426 if ($truncateLines > 0 && strlen($histo[$key][
'message']) > strlen($truncatedText)) {
13427 $out .=
'<div class="readmore-block --closed" >';
13428 $out .=
' <div class="readmore-block__excerpt" >';
13429 $out .= $truncatedText ;
13430 $out .=
' <a class="read-more-link" data-read-more-action="open" href="'.DOL_MAIN_URL_ROOT.
'/comm/action/card.php?id='.$actionstatic->id.
'&backtopage='.urlencode($_SERVER[
"PHP_SELF"].
'?'.$param).
'" >'.$langs->trans(
"ReadMore").
' <span class="fa fa-chevron-right" aria-hidden="true"></span></a>';
13432 $out .=
' <div class="readmore-block__full-text" >';
13433 $out .= $histo[$key][
'message'];
13434 $out .=
' <a class="read-less-link" data-read-more-action="close" href="#" ><span class="fa fa-chevron-up" aria-hidden="true"></span> '.$langs->trans(
"ReadLess").
'</a>';
13438 $out .= $histo[$key][
'message'];
13448 if (isset($histo[$key][
'socpeopleassigned']) && is_array($histo[$key][
'socpeopleassigned']) && count($histo[$key][
'socpeopleassigned']) > 0) {
13450 foreach ($histo[$key][
'socpeopleassigned'] as $cid => $Tab) {
13451 if (empty($conf->cache[
'contact'][$histo[$key][
'contact_id']])) {
13453 $contact->fetch($cid);
13454 $conf->cache[
'contact'][$histo[$key][
'contact_id']] = $contact;
13456 $contact = $conf->cache[
'contact'][$histo[$key][
'contact_id']];
13460 $contactList .= !empty($contactList) ?
', ' :
'';
13461 $contactList .= $contact->getNomUrl(1);
13462 if (isset($histo[$key][
'acode']) && $histo[$key][
'acode'] ==
'AC_TEL') {
13463 if (!empty($contact->phone_pro)) {
13464 $contactList .=
'('.dol_print_phone($contact->phone_pro).
')';
13470 $footer .= $langs->trans(
'ActionOnContact').
' : '.$contactList;
13471 } elseif (empty($objcon->id) && isset($histo[$key][
'contact_id']) && $histo[$key][
'contact_id'] > 0) {
13472 if (empty($conf->cache[
'contact'][$histo[$key][
'contact_id']])) {
13474 $result = $contact->fetch($histo[$key][
'contact_id']);
13475 $conf->cache[
'contact'][$histo[$key][
'contact_id']] = $contact;
13477 $contact = $conf->cache[
'contact'][$histo[$key][
'contact_id']];
13481 $footer .= $contact->getNomUrl(1);
13482 if (isset($histo[$key][
'acode']) && $histo[$key][
'acode'] ==
'AC_TEL') {
13483 if (!empty($contact->phone_pro)) {
13484 $footer .=
'('.dol_print_phone($contact->phone_pro).
')';
13491 if (!empty($documents)) {
13492 $footer .=
'<div class="timeline-documents-container">';
13493 foreach ($documents as $doc) {
13494 $footer .=
'<span id="document_'.$doc->id.
'" class="timeline-documents" ';
13495 $footer .=
' data-id="'.$doc->id.
'" ';
13496 $footer .=
' data-path="'.$doc->filepath.
'"';
13497 $footer .=
' data-filename="'.dol_escape_htmltag($doc->filename).
'" ';
13500 $filePath = DOL_DATA_ROOT.
'/'.$doc->filepath.
'/'.$doc->filename;
13502 $file = $actionstatic->id.
'/'.$doc->filename;
13503 $thumb = $actionstatic->id.
'/thumbs/'.substr($doc->filename, 0, strrpos($doc->filename,
'.')).
'_mini'.substr($doc->filename, strrpos($doc->filename,
'.'));
13504 $doclink =
dol_buildpath(
'document.php', 1).
'?modulepart=actions&attachment=0&file='.urlencode($file).
'&entity='.$conf->entity;
13505 $viewlink =
dol_buildpath(
'viewimage.php', 1).
'?modulepart=actions&file='.urlencode($thumb).
'&entity='.$conf->entity;
13507 $mimeAttr =
' mime="'.$mime.
'" ';
13509 if (in_array($mime, array(
'image/png',
'image/jpeg',
'application/pdf'))) {
13510 $class .=
' documentpreview';
13513 $footer .=
'<a href="'.$doclink.
'" class="btn-link '.$class.
'" target="_blank" rel="noopener noreferrer" '.$mimeAttr.
' >';
13514 $footer .=
img_mime($filePath).
' '.$doc->filename;
13517 $footer .=
'</span>';
13519 $footer .=
'</div>';
13522 if (!empty($footer)) {
13523 $out .=
'<div class="timeline-footer">'.$footer.
'</div>';
13526 $out .=
'</div>'.
"\n";
13529 $out .=
'<!-- END timeline item -->';
13537 jQuery(document).ready(function () {
13538 $(document).on("click", "[data-read-more-action]", function(e){
13539 let readMoreBloc = $(this).closest(".readmore-block");
13540 if(readMoreBloc.length > 0){
13541 e.preventDefault();
13542 if($(this).attr("data-read-more-action") == "close"){
13543 readMoreBloc.addClass("--closed").removeClass("--open");
13544 $("html, body").animate({
13545 scrollTop: readMoreBloc.offset().top - 200
13548 readMoreBloc.addClass("--open").removeClass("--closed");
13556 if (empty($histo)) {
13557 $out .=
'<span class="opacitymedium">'.$langs->trans(
"NoRecordFound").
'</span>';
13580 if ($hourTime ===
'getpost') {
13584 } elseif (preg_match(
'/^(\d\d):(\d\d):(\d\d)$/', $hourTime, $m)) {
13585 $hour = intval($m[1]);
13586 $minute = intval($m[2]);
13587 $second = intval($m[3]);
13589 $hour = $minute = $second = 0;
13592 $hour = min($hour, 23);
13593 $minute = min($minute, 59);
13594 $second = min($second, 59);
13611 if ($timestamp ===
null) {
13612 $timestamp =
GETPOSTDATE($prefix, $hourTime, $gm);
13619 if ($hourTime ===
'getpost' || ($timestamp !==
null &&
dol_print_date($timestamp,
'%H:%M:%S') !==
'00:00:00')) {
13620 $TParam = array_merge($TParam, array(
13627 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 different types of events.
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_is_file($pathoffile)
Return if path is 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.
dolGetElementUrl($objectid, $objecttype, $withpicto=0, $option='')
Return link url to an object.
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.
dolPrintHTML($s, $allowiframe=0)
Return a string ready to be output on HTML page To use text inside an attribute, you can simply use d...
isASecretKey($keyname)
Return if string has a name dedicated to store a secret.
dolPrintHTMLForTextArea($s, $allowiframe=0)
Return a string ready to be output on input textarea To use text inside an attribute,...
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.
dol_string_onlythesehtmlattributes($stringtoclean, $allowed_attributes=null)
Clean a string from some undesirable HTML tags.
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,...
dol_print_url($url, $target='_blank', $max=32, $withpicto=0, $morecss='')
Show Url link.
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.
dol_escape_php($stringtoescape, $stringforquotes=2)
Returns text escaped for inclusion into a php string, build with double quotes " or '.
getDolGlobalInt($key, $default=0)
Return a 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.
dolPrintHTMLForAttribute($s)
Return a string ready to be output on an HTML attribute (alt, title, data-html, .....
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.
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.
getPictoForType($key)
Return the picto for a data type.
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.
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.
dolPrintPassword($s)
Return a string ready to be output on an HTML attribute (alt, title, ...)
colorIsLight($stringcolor)
Return true if the color is light.
dol_escape_all($stringtoescape)
Returns text escaped for all protocols (so only alpha chars and numbers)
readfileLowMemory($fullpath_original_file_osencoded, $method=-1)
Return a file on output using a low memory.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='')
Show information for admin users or standard users.
dol_shutdown()
Function called at end of web php process.
dol_print_address($address, $htmlid, $element, $id, $noprint=0, $charfornl='')
Format address string.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
dol_print_error_email($prefixcode, $errormessage='', $errormessages=array(), $morecss='error', $email='')
Show a public email and error code to contact if technical error.
dol_print_profids($profID, $profIDtype, $countrycode='', $addcpButton=1)
Format professional IDs according to their country.
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.
isStringVarMatching($var, $regextext, $matchrule=1)
Check if a variable with name $var start with $text.
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, dangerous content and external link.
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.
dol_escape_xml($stringtoescape)
Returns text escaped for inclusion into a XML string.
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.
img_searchclear($titlealt='default', $other='')
Show search logo.
dolPrintLabel($s)
Return a string label (so on 1 line only and that should not contains any HTML) ready to be output on...
fetchObjectByElement($element_id, $element_type, $element_ref='')
Fetch an object from its id and element_type Inclusion of classes is automatic.
utf8_check($str)
Check if a string is in UTF8.
img_edit($titlealt='default', $float=0, $other='')
Show logo editer/modifier fiche.
show_actions_messaging($conf, $langs, $db, $filterobj, $objcon='', $noprint=0, $actioncode='', $donetodo='done', $filters=array(), $sortfield='a.datep, a.id', $sortorder='DESC')
Show html area with actions in messaging format.
get_default_tva(Societe $thirdparty_seller, Societe $thirdparty_buyer, $idprod=0, $idprodfournprice=0)
Function that return vat rate of a product line (according to seller, buyer and product vat rate) VAT...
img_up($titlealt='default', $selected=0, $moreclass='')
Show top arrow logo.
dol_htmloutput_errors($mesgstring='', $mesgarray=array(), $keepembedded=0)
Print formated error messages to output (Used to show messages on html output).
getFieldErrorIcon($fieldValidationErrorMsg)
get field error icon
get_exdir($num, $level, $alpha, $withoutslash, $object, $modulepart='')
Return a path to have a the directory according to object where files are stored.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
getEntity($element, $shared=1, $currentobject=null)
Get list of entity id to use.
dol_sanitizePathName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a path name.
dol_getdate($timestamp, $fast=false, $forcetimezone='')
Return an array with locale date info.
dol_mkdir($dir, $dataroot='', $newmask='')
Creation of a directory (this can create recursive subdir)
img_edit_remove($titlealt='default', $other='')
Show logo -.
img_info($titlealt='default')
Show info logo.
getDoliDBInstance($type, $host, $user, $pass, $name, $port)
Return a DoliDB instance (database handler).
dol_sanitizeEmail($stringtoclean)
Clean a string to use it as an Email.
dol_nboflines_bis($text, $maxlinesize=0, $charset='UTF-8')
Return nb of lines of a formated text with and (WARNING: string must not have mixed and br sepa...
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
dol_convertToWord($num, $langs, $currency='', $centimes=false)
Function to return a number into a text.
conf($dolibarr_main_document_root)
Load conf file (file must exists)
publicphonebutton2 phonegreen basiclayout basiclayout TotalHT VATCode TotalVAT TotalLT1 TotalLT2 TotalTTC TotalHT clearboth nowraponall right right takeposterminal SELECT e rowid
if(!defined( 'CSRFCHECK_WITH_TOKEN'))
if(!defined( 'NOREQUIREMENU')) if(!empty(GETPOST('seteventmessages', 'alpha'))) if(!function_exists("llxHeader")) top_httphead($contenttype='text/html', $forcenocache=0)
Show HTTP header.
if(!empty( $_SERVER[ 'MAIN_SHOW_TUNING_INFO'])) realCharForNumericEntities($matches)
Return the real char for a numeric entities.
dol_setcache($memoryid, $data, $expire=0)
Save data into a memory area shared by all users, all sessions on server.
dol_getcache($memoryid)
Read a memory area shared by all users, all sessions on server.
if(preg_match('/crypted:/i', $dolibarr_main_db_pass)||!empty($dolibarr_main_db_encrypted_pass)) $conf db type
$conf db name
Only used if Module[ID]Name translation string is not found.
dolGetRandomBytes($length)
Return a string of random bytes (hexa string) with length = $length fro cryptographic purposes.