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 AND c.code = '".$db->escape($seller->country_code).
"'";
6619 $sql .=
" AND t.taux = ".((float) $vatratecleaned).
" AND t.active = 1";
6620 $sql .=
" AND t.entity IN (".getEntity(
'c_tva').
")";
6622 $sql .=
" AND t.code = '".$db->escape($vatratecode).
"'";
6626 $resql = $db->query($sql);
6628 $obj = $db->fetch_object($resql);
6631 'rowid'=>$obj->rowid,
6634 'localtax1'=>$obj->localtax1,
6635 'localtax1_type'=>$obj->localtax1_type,
6636 'localtax2'=>$obj->localtax2,
6637 'localtax2_type'=>$obj->localtax2_type,
6639 'accountancy_code_sell'=>$obj->accountancy_code_sell,
6640 'accountancy_code_buy'=>$obj->accountancy_code_buy
6672 dol_syslog(
"getLocalTaxesFromRate vatrate=".$vatrate.
" local=".$local);
6675 $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";
6676 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t";
6677 if ($firstparamisid) {
6678 $sql .=
" WHERE t.rowid = ".(int) $vatrate;
6680 $vatratecleaned = $vatrate;
6683 if (preg_match(
'/^(.*)\s*\((.*)\)$/', $vatrate, $reg)) {
6684 $vatratecleaned = $reg[1];
6685 $vatratecode = $reg[2];
6688 $sql .=
", ".MAIN_DB_PREFIX.
"c_country as c";
6689 if (!empty($mysoc) && $mysoc->country_code ==
'ES') {
6690 $countrycodetouse = ((empty($buyer) || empty($buyer->country_code)) ? $mysoc->country_code : $buyer->country_code);
6691 $sql .=
" WHERE t.fk_pays = c.rowid AND c.code = '".$db->escape($countrycodetouse).
"'";
6693 $countrycodetouse = ((empty($seller) || empty($seller->country_code)) ? $mysoc->country_code : $seller->country_code);
6694 $sql .=
" WHERE t.fk_pays = c.rowid AND c.code = '".$db->escape($countrycodetouse).
"'";
6696 $sql .=
" AND t.taux = ".((float) $vatratecleaned).
" AND t.active = 1";
6698 $sql .=
" AND t.code = '".$db->escape($vatratecode).
"'";
6702 $resql = $db->query($sql);
6704 $obj = $db->fetch_object($resql);
6707 $vateratestring = $obj->rate.($obj->code ?
' ('.$obj->code.
')' :
'');
6710 return array($obj->localtax1_type,
get_localtax($vateratestring, $local, $buyer, $seller), $obj->accountancy_code_sell, $obj->accountancy_code_buy);
6711 } elseif ($local == 2) {
6712 return array($obj->localtax2_type,
get_localtax($vateratestring, $local, $buyer, $seller), $obj->accountancy_code_sell, $obj->accountancy_code_buy);
6714 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);
6734 global $db, $conf, $mysoc;
6736 require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
6744 $product->fetch($idprod);
6746 if ($mysoc->country_code == $thirdpartytouse->country_code) {
6748 if ($idprodfournprice > 0) {
6749 $result = $product->get_buyprice($idprodfournprice, 0, 0, 0);
6751 $ret = $product->vatrate_supplier;
6752 if ($product->default_vat_code_supplier) {
6753 $ret .=
' ('.$product->default_vat_code_supplier.
')';
6759 $ret = $product->tva_tx;
6760 if ($product->default_vat_code) {
6761 $ret .=
' ('.$product->default_vat_code.
')';
6774 $sql =
"SELECT t.taux as vat_rate, t.code as default_vat_code";
6775 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t, ".MAIN_DB_PREFIX.
"c_country as c";
6776 $sql .=
" WHERE t.active = 1 AND t.fk_pays = c.rowid AND c.code = '".$db->escape($thirdpartytouse->country_code).
"'";
6777 $sql .=
" AND t.entity IN (".getEntity(
'c_tva').
")";
6778 $sql .=
" ORDER BY t.use_default DESC, t.taux DESC, t.code ASC, t.recuperableonly ASC";
6779 $sql .= $db->plimit(1);
6781 $resql = $db->query($sql);
6783 $obj = $db->fetch_object($resql);
6785 $ret = $obj->vat_rate;
6786 if ($obj->default_vat_code) {
6787 $ret .=
' ('.$obj->default_vat_code.
')';
6800 $defaulttx = $conf->global->MAIN_VAT_DEFAULT_IF_AUTODETECT_FAILS;
6811 dol_syslog(
"get_product_vat_for_country: ret=".$ret);
6828 if (!class_exists(
'Product')) {
6829 require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
6838 $result = $product->fetch($idprod);
6840 if ($mysoc->country_code == $thirdpartytouse->country_code) {
6854 $sql =
"SELECT taux as vat_rate, localtax1, localtax2";
6855 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_tva as t, ".MAIN_DB_PREFIX.
"c_country as c";
6856 $sql .=
" WHERE t.active=1 AND t.fk_pays = c.rowid AND c.code='".$db->escape($thirdpartytouse->country_code).
"'";
6857 $sql .=
" AND t.entity IN (".getEntity(
'c_tva').
")";
6858 $sql .=
" ORDER BY t.taux DESC, t.recuperableonly ASC";
6859 $sql .= $db->plimit(1);
6861 $resql = $db->query($sql);
6863 $obj = $db->fetch_object($resql);
6866 $ret = $obj->localtax1;
6867 } elseif ($local == 2) {
6868 $ret = $obj->localtax2;
6876 dol_syslog(
"get_product_localtax_for_country: ret=".$ret);
6900 require_once DOL_DOCUMENT_ROOT.
'/core/lib/company.lib.php';
6903 $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;
6905 $seller_country_code = $thirdparty_seller->country_code;
6906 $seller_in_cee =
isInEEC($thirdparty_seller);
6908 $buyer_country_code = $thirdparty_buyer->country_code;
6909 $buyer_in_cee =
isInEEC($thirdparty_buyer);
6911 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 :
''));
6916 if ($seller_in_cee && $buyer_in_cee) {
6917 $isacompany = $thirdparty_buyer->
isACompany();
6918 if ($isacompany &&
getDolGlobalString(
'MAIN_USE_VAT_COMPANIES_IN_EEC_WITH_INVALID_VAT_ID_ARE_INDIVIDUAL')) {
6919 require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
6933 if (!$seller_use_vat) {
6939 if (($seller_country_code == $buyer_country_code)
6940 || (in_array($seller_country_code, array(
'FR',
'MC')) && in_array($buyer_country_code, array(
'FR',
'MC')))) {
6944 if ($seller_country_code ==
'IN' &&
getDolGlobalString(
'MAIN_SALETAX_AUTOSWITCH_I_CS_FOR_INDIA')) {
6948 if (preg_match(
'/C+S-(\d+)/', $tmpvat, $reg) && $thirdparty_seller->state_id != $thirdparty_buyer->state_id) {
6950 $tmpvat = str_replace(
"C+S",
"I", $tmpvat);
6951 } elseif (preg_match(
'/I-(\d+)/', $tmpvat, $reg) && $thirdparty_seller->state_id == $thirdparty_buyer->state_id) {
6953 $tmpvat = str_replace(
"I",
"C+S", $tmpvat);
6965 if (($seller_in_cee && $buyer_in_cee)) {
6966 $isacompany = $thirdparty_buyer->
isACompany();
6967 if ($isacompany &&
getDolGlobalString(
'MAIN_USE_VAT_COMPANIES_IN_EEC_WITH_INVALID_VAT_ID_ARE_INDIVIDUAL')) {
6968 require_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
6985 if (
getDolGlobalString(
'MAIN_USE_VAT_OF_PRODUCT_FOR_INDIVIDUAL_CUSTOMER_OUT_OF_EEC') && empty($buyer_in_cee)) {
6986 $isacompany = $thirdparty_buyer->
isACompany();
7014 if ($idprodfournprice > 0) {
7015 if (!class_exists(
'ProductFournisseur')) {
7016 require_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.product.class.php';
7019 $prodprice->fetch_product_fournisseur_price($idprodfournprice);
7020 return $prodprice->fourn_tva_npr;
7021 } elseif ($idprod > 0) {
7022 if (!class_exists(
'Product')) {
7023 require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
7026 $prod->fetch($idprod);
7027 return $prod->tva_npr;
7050 if (!is_object($thirdparty_seller)) {
7053 if (!is_object($thirdparty_buyer)) {
7058 if ($mysoc->country_code ==
'ES') {
7059 if (is_numeric($thirdparty_buyer->localtax1_assuj) && !$thirdparty_buyer->localtax1_assuj) {
7064 if (is_numeric($thirdparty_seller->localtax1_assuj) && !$thirdparty_seller->localtax1_assuj) {
7067 if (!is_numeric($thirdparty_seller->localtax1_assuj) && $thirdparty_seller->localtax1_assuj ==
'localtax1off') {
7071 } elseif ($local == 2) {
7073 if (is_numeric($thirdparty_seller->localtax2_assuj) && !$thirdparty_seller->localtax2_assuj) {
7076 if (!is_numeric($thirdparty_seller->localtax2_assuj) && $thirdparty_seller->localtax2_assuj ==
'localtax2off') {
7081 if ($thirdparty_seller->country_code == $thirdparty_buyer->country_code) {
7096function yn($yesno, $case = 1, $color = 0)
7100 $result =
'unknown';
7102 if ($yesno == 1 || (isset($yesno) && (strtolower($yesno) ==
'yes' || strtolower($yesno) ==
'true'))) {
7103 $result = $langs->trans(
'yes');
7104 if ($case == 1 || $case == 3) {
7105 $result = $langs->trans(
"Yes");
7108 $result =
'<input type="checkbox" value="1" checked disabled>';
7111 $result =
'<input type="checkbox" value="1" checked disabled> '.$result;
7115 } elseif ($yesno == 0 || strtolower($yesno) ==
'no' || strtolower($yesno) ==
'false') {
7116 $result = $langs->trans(
"no");
7117 if ($case == 1 || $case == 3) {
7118 $result = $langs->trans(
"No");
7121 $result =
'<input type="checkbox" value="0" disabled>';
7124 $result =
'<input type="checkbox" value="0" disabled> '.$result;
7130 $classname =
'error';
7134 return '<span class="'.$classname.
'">'.$result.
'</span>';
7154function get_exdir($num, $level, $alpha, $withoutslash, $object, $modulepart =
'')
7158 if (empty($modulepart) && !empty($object->module)) {
7159 $modulepart = $object->module;
7164 $arrayforoldpath = array(
'cheque',
'category',
'holiday',
'supplier_invoice',
'invoice_supplier',
'mailing',
'supplier_payment');
7166 $arrayforoldpath[] =
'product';
7168 if (!empty($level) && in_array($modulepart, $arrayforoldpath)) {
7170 if (empty($alpha)) {
7171 $num = preg_replace(
'/([^0-9])/i',
'', $num);
7173 $num = preg_replace(
'/^.*\-/i',
'', $num);
7175 $num = substr(
"000".$num, -$level);
7177 $path = substr($num, 0, 1);
7180 $path = substr($num, 1, 1).
'/'.substr($num, 0, 1);
7183 $path = substr($num, 2, 1).
'/'.substr($num, 1, 1).
'/'.substr($num, 0, 1);
7193 if (empty($withoutslash) && !empty($path)) {
7212 dol_syslog(
"functions.lib::dol_mkdir: dir=".$dir, LOG_INFO);
7215 if (@is_dir($dir_osencoded)) {
7223 if (!empty($dataroot)) {
7225 $dir = str_replace($dataroot.
'/',
'', $dir);
7226 $ccdir = $dataroot.
'/';
7229 $cdir = explode(
"/", $dir);
7230 $num = count($cdir);
7231 for ($i = 0; $i < $num; $i++) {
7233 $ccdir .=
'/'.$cdir[$i];
7235 $ccdir .= $cdir[$i];
7238 if (preg_match(
"/^.:$/", $ccdir, $regs)) {
7246 if (!@is_dir($ccdir_osencoded)) {
7247 dol_syslog(
"functions.lib::dol_mkdir: Directory '".$ccdir.
"' does not exists or is outside open_basedir PHP setting.", LOG_DEBUG);
7250 $dirmaskdec = octdec((
string) $newmask);
7251 if (empty($newmask)) {
7252 $dirmaskdec = !
getDolGlobalString(
'MAIN_UMASK') ? octdec(
'0755') : octdec($conf->global->MAIN_UMASK);
7254 $dirmaskdec |= octdec(
'0111');
7255 if (!@mkdir($ccdir_osencoded, $dirmaskdec)) {
7257 dol_syslog(
"functions.lib::dol_mkdir: Fails to create directory '".$ccdir.
"' or directory already exists.", LOG_WARNING);
7260 dol_syslog(
"functions.lib::dol_mkdir: Directory '".$ccdir.
"' created", LOG_DEBUG);
7269 return ($nberr ? -$nberr : $nbcreated);
7284 if (!empty($newmask)) {
7285 @chmod($filepath, octdec($newmask));
7287 @chmod($filepath, octdec($conf->global->MAIN_UMASK));
7299 return '<span class="fieldrequired">*</span>';
7319function dol_string_nohtmltag($stringtoclean, $removelinefeed = 1, $pagecodeto =
'UTF-8', $strip_tags = 0, $removedoublespaces = 1)
7321 if (is_null($stringtoclean)) {
7325 if ($removelinefeed == 2) {
7326 $stringtoclean = preg_replace(
'/<br[^>]*>(\n|\r)+/ims',
'<br>', $stringtoclean);
7328 $temp = preg_replace(
'/<br[^>]*>/i',
"\n", $stringtoclean);
7333 $temp = str_replace(
'< ',
'__ltspace__', $temp);
7336 $temp = strip_tags($temp);
7339 $pattern =
"/<[^<>]+>/";
7346 $tempbis = str_replace(
'<>',
'', $temp);
7347 $tempbis = preg_replace($pattern,
'', $tempbis);
7349 }
while ($tempbis != $temp);
7354 $temp = preg_replace(
'/<+([a-z]+)/i',
'\1', $temp);
7360 if ($removelinefeed == 1) {
7361 $temp = str_replace(array(
"\r\n",
"\r",
"\n"),
" ", $temp);
7365 if ($removedoublespaces) {
7366 while (strpos($temp,
" ")) {
7367 $temp = str_replace(
" ",
" ", $temp);
7371 $temp = str_replace(
'__ltspace__',
'< ', $temp);
7391function dol_string_onlythesehtmltags($stringtoclean, $cleanalsosomestyles = 1, $removeclassattribute = 1, $cleanalsojavascript = 0, $allowiframe = 0, $allowed_tags = array(), $allowlink = 0)
7393 if (empty($allowed_tags)) {
7394 $allowed_tags = array(
7395 "html",
"head",
"meta",
"body",
"article",
"a",
"abbr",
"b",
"blockquote",
"br",
"cite",
"div",
"dl",
"dd",
"dt",
"em",
"font",
"img",
"ins",
"hr",
"i",
"li",
7396 "ol",
"p",
"q",
"s",
"span",
"strike",
"strong",
"title",
"table",
"tr",
"th",
"td",
"u",
"ul",
"sup",
"sub",
"blockquote",
"pre",
"h1",
"h2",
"h3",
"h4",
"h5",
"h6",
7397 "header",
"footer",
"nav",
"section",
"menu",
"menuitem"
7400 $allowed_tags[] =
"comment";
7402 if (!in_array(
'iframe', $allowed_tags)) {
7403 $allowed_tags[] =
"iframe";
7407 if (!in_array(
'link', $allowed_tags)) {
7408 $allowed_tags[] =
"link";
7412 $allowed_tags_string = join(
"><", $allowed_tags);
7413 $allowed_tags_string =
'<'.$allowed_tags_string.
'>';
7415 $stringtoclean = str_replace(
'<!DOCTYPE html>',
'__!DOCTYPE_HTML__', $stringtoclean);
7420 $stringtoclean = preg_replace(
'/<!--([^>]*)-->/',
'<comment>\1</comment>', $stringtoclean);
7422 $stringtoclean = preg_replace(
'/:/i',
':', $stringtoclean);
7423 $stringtoclean = preg_replace(
'/:|�+58|:/i',
'', $stringtoclean);
7425 $temp = strip_tags($stringtoclean, $allowed_tags_string);
7427 if ($cleanalsosomestyles) {
7428 $temp = preg_replace(
'/position\s*:\s*(absolute|fixed)\s*!\s*important/i',
'', $temp);
7430 if ($removeclassattribute) {
7431 $temp = preg_replace(
'/(<[^>]+)\s+class=((["\']).*?\\3|\\w*)/i',
'\\1', $temp);
7436 if ($cleanalsojavascript) {
7437 $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);
7440 $temp = str_replace(
'__!DOCTYPE_HTML__',
'<!DOCTYPE html>', $temp);
7442 $temp = preg_replace(
'/<comment>([^>]*)<\/comment>/',
'<!--\1-->', $temp);
7462 if (is_null($allowed_attributes)) {
7463 $allowed_attributes = array(
7464 "allow",
"allowfullscreen",
"alt",
"class",
"contenteditable",
"data-html",
"frameborder",
"height",
"href",
"id",
"name",
"src",
"style",
"target",
"title",
"width",
7466 "header",
"footer",
"nav",
"section",
"menu",
"menuitem"
7470 if (class_exists(
'DOMDocument') && !empty($stringtoclean)) {
7471 $stringtoclean =
'<?xml encoding="UTF-8"><html><body>'.$stringtoclean.
'</body></html>';
7474 $dom =
new DOMDocument(
null,
'UTF-8');
7475 $dom->loadHTML($stringtoclean, LIBXML_ERR_NONE|LIBXML_HTML_NOIMPLIED|LIBXML_HTML_NODEFDTD|LIBXML_NONET|LIBXML_NOWARNING|LIBXML_NOXMLDECL);
7477 if (is_object($dom)) {
7478 for ($els = $dom->getElementsByTagname(
'*'), $i = $els->length - 1; $i >= 0; $i--) {
7479 for ($attrs = $els->item($i)->attributes, $ii = $attrs->length - 1; $ii >= 0; $ii--) {
7481 if (!empty($attrs->item($ii)->name)) {
7482 if (! in_array($attrs->item($ii)->name, $allowed_attributes)) {
7484 $els->item($i)->removeAttribute($attrs->item($ii)->name);
7485 } elseif (in_array($attrs->item($ii)->name, array(
'style'))) {
7487 $valuetoclean = $attrs->item($ii)->value;
7489 if (isset($valuetoclean)) {
7491 $oldvaluetoclean = $valuetoclean;
7492 $valuetoclean = preg_replace(
'/\/\*.*\*\//m',
'', $valuetoclean);
7493 $valuetoclean = preg_replace(
'/position\s*:\s*[a-z]+/mi',
'', $valuetoclean);
7494 if ($els->item($i)->tagName ==
'a') {
7495 $valuetoclean = preg_replace(
'/display\s*:/mi',
'', $valuetoclean);
7496 $valuetoclean = preg_replace(
'/z-index\s*:/mi',
'', $valuetoclean);
7497 $valuetoclean = preg_replace(
'/\s+(top|left|right|bottom)\s*:/mi',
'', $valuetoclean);
7501 $valuetoclean = preg_replace(
'/(logout|passwordforgotten)\.php/mi',
'', $valuetoclean);
7502 $valuetoclean = preg_replace(
'/action=/mi',
'', $valuetoclean);
7503 }
while ($oldvaluetoclean != $valuetoclean);
7506 $attrs->item($ii)->value = $valuetoclean;
7513 $return = $dom->saveHTML();
7516 $return = preg_replace(
'/^'.preg_quote(
'<?xml encoding="UTF-8">',
'/').
'/',
'', $return);
7517 $return = preg_replace(
'/^'.preg_quote(
'<html><body>',
'/').
'/',
'', $return);
7518 $return = preg_replace(
'/'.preg_quote(
'</body></html>',
'/').
'$/',
'', $return);
7519 return trim($return);
7521 return $stringtoclean;
7538 $temp = $stringtoclean;
7539 foreach ($disallowed_tags as $tagtoremove) {
7540 $temp = preg_replace(
'/<\/?'.$tagtoremove.
'>/',
'', $temp);
7541 $temp = preg_replace(
'/<\/?'.$tagtoremove.
'\s+[^>]*>/',
'', $temp);
7544 if ($cleanalsosomestyles) {
7545 $temp = preg_replace(
'/position\s*:\s*(absolute|fixed)\s*!\s*important/',
'', $temp);
7563 if ($nboflines == 1) {
7565 $firstline = preg_replace(
'/<br[^>]*>.*$/s',
'', $text);
7566 $firstline = preg_replace(
'/<div[^>]*>.*$/s',
'', $firstline);
7569 $firstline = preg_replace(
'/[\n\r].*/',
'', $text);
7574 return $firstline.(isset($firstline) && isset($text) && (strlen($firstline) != strlen($text)) ?
'...' :
'');
7578 $text = preg_replace(
'/\n/',
'', $text);
7580 $repTable = array(
"\t" =>
" ",
"\n" =>
" ",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
7582 $repTable = array(
"\t" =>
" ",
"\n" =>
"<br>",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
7585 $text = strtr($text, $repTable);
7586 if ($charset ==
'UTF-8') {
7587 $pattern =
'/(<br[^>]*>)/Uu';
7590 $pattern =
'/(<br[^>]*>)/U';
7592 $a = preg_split($pattern, $text, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
7597 $lastaddediscontent = 1;
7598 while ($countline < $nboflines && isset($a[$i])) {
7599 if (preg_match(
'/<br[^>]*>/', $a[$i])) {
7600 if (array_key_exists($i+1, $a) && !empty($a[$i+1])) {
7601 $firstline .= ($ishtml ?
"<br>\n" :
"\n");
7603 if (!$lastaddediscontent) {
7606 $lastaddediscontent = 0;
7609 $firstline .= $a[$i];
7610 $lastaddediscontent = 1;
7616 $adddots = (isset($a[$i]) && (!preg_match(
'/<br[^>]*>/', $a[$i]) || (array_key_exists($i+1, $a) && !empty($a[$i+1]))));
7618 $ret = $firstline.($adddots ?
'...' :
'');
7636function dol_nl2br($stringtoencode, $nl2brmode = 0, $forxml =
false)
7638 if (is_null($stringtoencode)) {
7643 return nl2br($stringtoencode, $forxml);
7645 $ret = preg_replace(
'/(\r\n|\r|\n)/i', ($forxml ?
'<br />' :
'<br>'), $stringtoencode);
7661 if (empty($nouseofiframesandbox) &&
getDolGlobalString(
'MAIN_SECURITY_USE_SANDBOX_FOR_HTMLWITHNOJS')) {
7666 return $stringtoencode;
7668 $out = $stringtoencode;
7671 $oldstringtoclean = $out;
7673 if (!empty($out) &&
getDolGlobalString(
'MAIN_RESTRICTHTML_ONLY_VALID_HTML') && $check !=
'restricthtmlallowunvalid') {
7675 libxml_use_internal_errors(
false);
7676 if (LIBXML_VERSION < 20900) {
7679 libxml_disable_entity_loader(
true);
7682 $dom =
new DOMDocument();
7688 $out =
'<?xml encoding="UTF-8"><div class="tricktoremove">'.$out.
'</div>';
7690 $out =
'<?xml encoding="UTF-8"><div class="tricktoremove">'.dol_nl2br($out).
'</div>';
7692 $dom->loadHTML($out, LIBXML_HTML_NODEFDTD | LIBXML_ERR_NONE | LIBXML_HTML_NOIMPLIED | LIBXML_NONET | LIBXML_NOWARNING | LIBXML_NOERROR | LIBXML_NOXMLDECL);
7693 $out = trim($dom->saveHTML());
7696 $out = preg_replace(
'/^<\?xml encoding="UTF-8"><div class="tricktoremove">/',
'', $out);
7697 $out = preg_replace(
'/<\/div>$/',
'', $out);
7701 $out =
'InvalidHTMLStringCantBeCleaned '.$e->getMessage();
7705 if (!empty($out) &&
getDolGlobalString(
'MAIN_RESTRICTHTML_ONLY_VALID_HTML_TIDY') && $check !=
'restricthtmlallowunvalid') {
7708 if (extension_loaded(
'tidy') && class_exists(
"tidy")) {
7714 'quote-marks' =>
false,
7715 'doctype' =>
'strict',
7716 'show-body-only' =>
true,
7717 "indent-attributes" =>
false,
7718 "vertical-space" =>
false,
7730 $out = $tidy->repairString($out, $config,
'utf8');
7737 $out =
'InvalidHTMLStringCantBeCleaned '.$e->getMessage();
7742 $out = preg_replace(
'/[\x{200B}-\x{200D}\x{FEFF}]/u',
' ', $out);
7745 $out = preg_replace(
'/&(tab|newline);/i',
' ', $out);
7749 $out = preg_replace(
'/'/i',
''', $out);
7754 $out = preg_replace_callback(
'/&#(x?[0-9][0-9a-f]+;?)/i',
function ($m) {
7760 $out = preg_replace(
'/&#x?[0-9]+/i',
'', $out);
7771 $out = preg_replace(
'/'/i',
"'", $out);
7772 }
while ($oldstringtoclean != $out);
7779 $tmpout = preg_replace(
'/<img src="data:/mi',
'<__IMG_SRC_DATA__ src="data:', $out);
7780 preg_match_all(
'/(<img|url\(|<link)/i', $tmpout, $reg);
7781 $nblinks = count($reg[0]);
7782 if ($nblinks >
getDolGlobalInt(
"MAIN_SECURITY_MAX_IMG_IN_HTML_CONTENT", 1000)) {
7783 $out =
'ErrorTooManyLinksIntoHTMLString';
7786 if (
getDolGlobalInt(
'MAIN_DISALLOW_URL_INTO_DESCRIPTIONS') == 2 || $check ==
'restricthtmlnolink') {
7788 $out =
'ErrorHTMLLinksNotAllowed';
7790 } elseif (
getDolGlobalInt(
'MAIN_DISALLOW_URL_INTO_DESCRIPTIONS') == 1) {
7793 $pattern =
'/src=["\']?(http[^"\']+)|url\(["\']?(http[^\)]+)/';
7796 if (preg_match_all($pattern, $out, $matches)) {
7798 $urls = $matches[1];
7801 foreach ($urls as $url) {
7803 echo
"Found url = ".$url .
"\n";
7806 $out =
'ErrorHTMLExternalLinksNotAllowed';
7836function dol_htmlentitiesbr($stringtoencode, $nl2brmode = 0, $pagecodefrom =
'UTF-8', $removelasteolbr = 1)
7838 if (is_null($stringtoencode)) {
7842 $newstring = $stringtoencode;
7844 $newstring = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>/i',
'<br>', $newstring);
7845 if ($removelasteolbr) {
7846 $newstring = preg_replace(
'/<br>$/i',
'', $newstring);
7848 $newstring = preg_replace(
'/[\x{200B}-\x{200D}\x{FEFF}]/u',
' ', $newstring);
7849 $newstring = strtr($newstring, array(
'&'=>
'__and__',
'<'=>
'__lt__',
'>'=>
'__gt__',
'"'=>
'__dquot__'));
7851 $newstring = strtr($newstring, array(
'__and__'=>
'&',
'__lt__'=>
'<',
'__gt__'=>
'>',
'__dquot__'=>
'"'));
7853 if ($removelasteolbr) {
7854 $newstring = preg_replace(
'/(\r\n|\r|\n)$/i',
'', $newstring);
7873 $ret = preg_replace(
'/'.
"\r\n".
'<br(\s[\sa-zA-Z_="]*)?\/?>/i',
"<br>", $ret);
7874 $ret = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>'.
"\r\n".
'/i',
"\r\n", $ret);
7875 $ret = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>'.
"\n".
'/i',
"\n", $ret);
7876 $ret = preg_replace(
'/<br(\s[\sa-zA-Z_="]*)?\/?>/i',
"\n", $ret);
7888 $ret = preg_replace(
'/ $/i',
"", $stringtodecode);
7889 $ret = preg_replace(
'/(<br>|<br(\s[\sa-zA-Z_="]*)?\/?>|'.
"\n".
'|'.
"\r".
')+$/i',
"", $ret);
7905 if ($keepsomeentities) {
7906 $newstring = strtr($newstring, array(
'&'=>
'__andamp__',
'<'=>
'__andlt__',
'>'=>
'__andgt__',
'"'=>
'__dquot__'));
7908 $newstring = html_entity_decode((
string) $newstring, (
int) $b, (
string) $c);
7909 if ($keepsomeentities) {
7910 $newstring = strtr($newstring, array(
'__andamp__'=>
'&',
'__andlt__'=>
'<',
'__andgt__'=>
'>',
'__dquot__'=>
'"'));
7926function dol_htmlentities($string, $flags = ENT_QUOTES|ENT_SUBSTITUTE, $encoding =
'UTF-8', $double_encode =
false)
7928 return htmlentities($string, $flags, $encoding, $double_encode);
7947 for ($scursor = 0; $scursor < $len; $scursor++) {
7948 $ordchar = ord($s[$scursor]);
7950 if ($ordchar < 32 && $ordchar != 13 && $ordchar != 10) {
7953 } elseif ($ordchar > 126 && $ordchar < 160) {
7957 $out .= $s[$scursor];
7979 $arraystring = explode(
"\n", $s);
7980 $nb = count($arraystring);
7997 $repTable = array(
"\t" =>
" ",
"\n" =>
"<br>",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
7999 $repTable = array(
"\t" =>
" ",
"\n" =>
" ",
"\r" =>
" ",
"\0" =>
" ",
"\x0B" =>
" ");
8002 $text = strtr($text, $repTable);
8003 if ($charset ==
'UTF-8') {
8004 $pattern =
'/(<br[^>]*>)/Uu';
8007 $pattern =
'/(<br[^>]*>)/U';
8009 $a = preg_split($pattern, $text, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
8011 $nblines = (int) floor((count($a) + 1) / 2);
8014 foreach ($a as $line) {
8017 $line_dec = html_entity_decode($line);
8019 $line_dec = wordwrap($line_dec, $maxlinesize,
'\n',
true);
8020 $nblines += substr_count($line_dec,
'\n');
8040 if (is_null($msg)) {
8045 if (preg_match(
'/<html/i', $msg)) {
8047 } elseif (preg_match(
'/<body/i', $msg)) {
8049 } elseif (preg_match(
'/<\/textarea/i', $msg)) {
8051 } elseif (preg_match(
'/<(b|em|i|u)(\s+[^>]+)?>/i', $msg)) {
8053 } elseif (preg_match(
'/<br/i', $msg)) {
8059 $msg = preg_replace(
'/https?:\/\/[^"\'\s]+/i',
'', $msg);
8060 if (preg_match(
'/<html/i', $msg)) {
8062 } elseif (preg_match(
'/<body/i', $msg)) {
8064 } elseif (preg_match(
'/<\/textarea/i', $msg)) {
8066 } elseif (preg_match(
'/<(b|em|i|u)(\s+[^>]+)?>/i', $msg)) {
8068 } elseif (preg_match(
'/<(br|hr)\/>/i', $msg)) {
8070 } elseif (preg_match(
'/<(br|hr|div|font|li|p|span|strong|table)>/i', $msg)) {
8072 } elseif (preg_match(
'/<(br|hr|div|font|li|p|span|strong|table)\s+[^<>\/]*\/?>/i', $msg)) {
8074 } elseif (preg_match(
'/<img\s+[^<>]*src[^<>]*>/i', $msg)) {
8076 } elseif (preg_match(
'/<a\s+[^<>]*href[^<>]*>/i', $msg)) {
8078 } elseif (preg_match(
'/<h[0-9]>/i', $msg)) {
8080 } elseif (preg_match(
'/&[A-Z0-9]{1,6};/i', $msg)) {
8083 } elseif (preg_match(
'/&#[0-9]{2,3};/i', $msg)) {
8107 if (!empty($invert)) {
8115 $ret .= (!empty($text1) && !empty($text2)) ? ((
dol_textishtml($text1) ||
dol_textishtml($text2)) ? ($forxml ?
"<br >\n" :
"<br>\n") :
"\n") :
"";
8135 global $db, $conf, $mysoc, $user, $extrafields;
8137 $substitutionarray = array();
8139 if ((empty($exclude) || !in_array(
'user', $exclude)) && (empty($include) || in_array(
'user', $include))) {
8143 $emailsendersignature = $user->signature;
8144 $usersignature = $user->signature;
8145 $substitutionarray = array_merge($substitutionarray, array(
8146 '__SENDEREMAIL_SIGNATURE__' => (
string) ((!
getDolGlobalString(
'MAIN_MAIL_DO_NOT_USE_SIGN')) ? ($onlykey == 2 ?
dol_trunc(
'SignatureFromTheSelectedSenderProfile', 30) : $emailsendersignature) :
''),
8150 if (is_object($user)) {
8151 $substitutionarray = array_merge($substitutionarray, array(
8152 '__USER_ID__' => (
string) $user->id,
8153 '__USER_LOGIN__' => (
string) $user->login,
8154 '__USER_EMAIL__' => (
string) $user->email,
8155 '__USER_PHONE__' => (
string)
dol_print_phone($user->office_phone,
'', 0, 0,
'',
" ",
'',
'', -1),
8156 '__USER_PHONEPRO__' => (
string)
dol_print_phone($user->user_mobile,
'', 0, 0,
'',
" ",
'',
'', -1),
8157 '__USER_PHONEMOBILE__' => (
string)
dol_print_phone($user->personal_mobile,
'', 0, 0,
'',
" ",
'',
'', -1),
8158 '__USER_FAX__' => (
string) $user->office_fax,
8159 '__USER_LASTNAME__' => (
string) $user->lastname,
8160 '__USER_FIRSTNAME__' => (
string) $user->firstname,
8161 '__USER_FULLNAME__' => (
string) $user->getFullName($outputlangs),
8162 '__USER_SUPERVISOR_ID__' => (
string) ($user->fk_user ? $user->fk_user :
'0'),
8163 '__USER_JOB__' => (
string) $user->job,
8165 '__USER_VCARD_URL__' => (string) $user->getOnlineVirtualCardUrl(
'',
'external')
8169 if ((empty($exclude) || !in_array(
'mycompany', $exclude)) && is_object($mysoc) && (empty($include) || in_array(
'mycompany', $include))) {
8170 $substitutionarray = array_merge($substitutionarray, array(
8171 '__MYCOMPANY_NAME__' => $mysoc->name,
8172 '__MYCOMPANY_EMAIL__' => $mysoc->email,
8173 '__MYCOMPANY_PHONE__' =>
dol_print_phone($mysoc->phone,
'', 0, 0,
'',
" ",
'',
'', -1),
8174 '__MYCOMPANY_FAX__' =>
dol_print_phone($mysoc->fax,
'', 0, 0,
'',
" ",
'',
'', -1),
8175 '__MYCOMPANY_PROFID1__' => $mysoc->idprof1,
8176 '__MYCOMPANY_PROFID2__' => $mysoc->idprof2,
8177 '__MYCOMPANY_PROFID3__' => $mysoc->idprof3,
8178 '__MYCOMPANY_PROFID4__' => $mysoc->idprof4,
8179 '__MYCOMPANY_PROFID5__' => $mysoc->idprof5,
8180 '__MYCOMPANY_PROFID6__' => $mysoc->idprof6,
8181 '__MYCOMPANY_CAPITAL__' => $mysoc->capital,
8182 '__MYCOMPANY_FULLADDRESS__' => (method_exists($mysoc,
'getFullAddress') ? $mysoc->getFullAddress(1,
', ') :
''),
8183 '__MYCOMPANY_ADDRESS__' => $mysoc->address,
8184 '__MYCOMPANY_ZIP__' => $mysoc->zip,
8185 '__MYCOMPANY_TOWN__' => $mysoc->town,
8186 '__MYCOMPANY_COUNTRY__' => $mysoc->country,
8187 '__MYCOMPANY_COUNTRY_ID__' => $mysoc->country_id,
8188 '__MYCOMPANY_COUNTRY_CODE__' => $mysoc->country_code,
8189 '__MYCOMPANY_CURRENCY_CODE__' => $conf->currency
8193 if (($onlykey || is_object($object)) && (empty($exclude) || !in_array(
'object', $exclude)) && (empty($include) || in_array(
'object', $include))) {
8195 $substitutionarray[
'__ID__'] =
'__ID__';
8196 $substitutionarray[
'__REF__'] =
'__REF__';
8197 $substitutionarray[
'__NEWREF__'] =
'__NEWREF__';
8198 $substitutionarray[
'__LABEL__'] =
'__LABEL__';
8199 $substitutionarray[
'__REF_CLIENT__'] =
'__REF_CLIENT__';
8200 $substitutionarray[
'__REF_SUPPLIER__'] =
'__REF_SUPPLIER__';
8201 $substitutionarray[
'__NOTE_PUBLIC__'] =
'__NOTE_PUBLIC__';
8202 $substitutionarray[
'__NOTE_PRIVATE__'] =
'__NOTE_PRIVATE__';
8203 $substitutionarray[
'__EXTRAFIELD_XXX__'] =
'__EXTRAFIELD_XXX__';
8205 if (isModEnabled(
"societe")) {
8206 $substitutionarray[
'__THIRDPARTY_ID__'] =
'__THIRDPARTY_ID__';
8207 $substitutionarray[
'__THIRDPARTY_NAME__'] =
'__THIRDPARTY_NAME__';
8208 $substitutionarray[
'__THIRDPARTY_NAME_ALIAS__'] =
'__THIRDPARTY_NAME_ALIAS__';
8209 $substitutionarray[
'__THIRDPARTY_CODE_CLIENT__'] =
'__THIRDPARTY_CODE_CLIENT__';
8210 $substitutionarray[
'__THIRDPARTY_CODE_FOURNISSEUR__'] =
'__THIRDPARTY_CODE_FOURNISSEUR__';
8211 $substitutionarray[
'__THIRDPARTY_EMAIL__'] =
'__THIRDPARTY_EMAIL__';
8212 $substitutionarray[
'__THIRDPARTY_PHONE__'] =
'__THIRDPARTY_PHONE__';
8213 $substitutionarray[
'__THIRDPARTY_FAX__'] =
'__THIRDPARTY_FAX__';
8214 $substitutionarray[
'__THIRDPARTY_ADDRESS__'] =
'__THIRDPARTY_ADDRESS__';
8215 $substitutionarray[
'__THIRDPARTY_ZIP__'] =
'__THIRDPARTY_ZIP__';
8216 $substitutionarray[
'__THIRDPARTY_TOWN__'] =
'__THIRDPARTY_TOWN__';
8217 $substitutionarray[
'__THIRDPARTY_IDPROF1__'] =
'__THIRDPARTY_IDPROF1__';
8218 $substitutionarray[
'__THIRDPARTY_IDPROF2__'] =
'__THIRDPARTY_IDPROF2__';
8219 $substitutionarray[
'__THIRDPARTY_IDPROF3__'] =
'__THIRDPARTY_IDPROF3__';
8220 $substitutionarray[
'__THIRDPARTY_IDPROF4__'] =
'__THIRDPARTY_IDPROF4__';
8221 $substitutionarray[
'__THIRDPARTY_IDPROF5__'] =
'__THIRDPARTY_IDPROF5__';
8222 $substitutionarray[
'__THIRDPARTY_IDPROF6__'] =
'__THIRDPARTY_IDPROF6__';
8223 $substitutionarray[
'__THIRDPARTY_TVAINTRA__'] =
'__THIRDPARTY_TVAINTRA__';
8224 $substitutionarray[
'__THIRDPARTY_NOTE_PUBLIC__'] =
'__THIRDPARTY_NOTE_PUBLIC__';
8225 $substitutionarray[
'__THIRDPARTY_NOTE_PRIVATE__'] =
'__THIRDPARTY_NOTE_PRIVATE__';
8227 if (isModEnabled(
'adherent') && (!is_object($object) || $object->element ==
'adherent') && (empty($exclude) || !in_array(
'member', $exclude)) && (empty($include) || in_array(
'member', $include))) {
8228 $substitutionarray[
'__MEMBER_ID__'] =
'__MEMBER_ID__';
8229 $substitutionarray[
'__MEMBER_CIVILITY__'] =
'__MEMBER_CIVILITY__';
8230 $substitutionarray[
'__MEMBER_FIRSTNAME__'] =
'__MEMBER_FIRSTNAME__';
8231 $substitutionarray[
'__MEMBER_LASTNAME__'] =
'__MEMBER_LASTNAME__';
8232 $substitutionarray[
'__MEMBER_USER_LOGIN_INFORMATION__'] =
'Login and pass of the external user account';
8237 if (isModEnabled(
'ticket') && (!is_object($object) || $object->element ==
'ticket') && (empty($exclude) || !in_array(
'ticket', $exclude)) && (empty($include) || in_array(
'ticket', $include))) {
8238 $substitutionarray[
'__TICKET_TRACKID__'] =
'__TICKET_TRACKID__';
8239 $substitutionarray[
'__TICKET_SUBJECT__'] =
'__TICKET_SUBJECT__';
8240 $substitutionarray[
'__TICKET_TYPE__'] =
'__TICKET_TYPE__';
8241 $substitutionarray[
'__TICKET_SEVERITY__'] =
'__TICKET_SEVERITY__';
8242 $substitutionarray[
'__TICKET_CATEGORY__'] =
'__TICKET_CATEGORY__';
8243 $substitutionarray[
'__TICKET_ANALYTIC_CODE__'] =
'__TICKET_ANALYTIC_CODE__';
8244 $substitutionarray[
'__TICKET_MESSAGE__'] =
'__TICKET_MESSAGE__';
8245 $substitutionarray[
'__TICKET_PROGRESSION__'] =
'__TICKET_PROGRESSION__';
8246 $substitutionarray[
'__TICKET_USER_ASSIGN__'] =
'__TICKET_USER_ASSIGN__';
8249 if (isModEnabled(
'recruitment') && (!is_object($object) || $object->element ==
'recruitmentcandidature') && (empty($exclude) || !in_array(
'recruitment', $exclude)) && (empty($include) || in_array(
'recruitment', $include))) {
8250 $substitutionarray[
'__CANDIDATE_FULLNAME__'] =
'__CANDIDATE_FULLNAME__';
8251 $substitutionarray[
'__CANDIDATE_FIRSTNAME__'] =
'__CANDIDATE_FIRSTNAME__';
8252 $substitutionarray[
'__CANDIDATE_LASTNAME__'] =
'__CANDIDATE_LASTNAME__';
8254 if (isModEnabled(
'project') && (empty($exclude) || !in_array(
'project', $exclude)) && (empty($include) || in_array(
'project', $include))) {
8255 $substitutionarray[
'__PROJECT_ID__'] =
'__PROJECT_ID__';
8256 $substitutionarray[
'__PROJECT_REF__'] =
'__PROJECT_REF__';
8257 $substitutionarray[
'__PROJECT_NAME__'] =
'__PROJECT_NAME__';
8261 if (isModEnabled(
'contrat') && (!is_object($object) || $object->element ==
'contract') && (empty($exclude) || !in_array(
'contract', $exclude)) && (empty($include) || in_array(
'contract', $include))) {
8262 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATE__'] =
'Highest date planned for a service start';
8263 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATETIME__'] =
'Highest date and hour planned for service start';
8264 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATE__'] =
'Lowest data for planned expiration of service';
8265 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATETIME__'] =
'Lowest date and hour for planned expiration of service';
8267 if (isModEnabled(
"propal") && (!is_object($object) || $object->element ==
'propal') && (empty($exclude) || !in_array(
'propal', $exclude)) && (empty($include) || in_array(
'propal', $include))) {
8268 $substitutionarray[
'__ONLINE_SIGN_URL__'] =
'ToOfferALinkForOnlineSignature';
8270 if (isModEnabled(
"ficheinter") && (!is_object($object) || $object->element ==
'fichinter') && (empty($exclude) || !in_array(
'intervention', $exclude)) && (empty($include) || in_array(
'intervention', $include))) {
8271 $substitutionarray[
'__ONLINE_SIGN_FICHINTER_URL__'] =
'ToOfferALinkForOnlineSignature';
8273 $substitutionarray[
'__ONLINE_PAYMENT_URL__'] =
'UrlToPayOnlineIfApplicable';
8274 $substitutionarray[
'__ONLINE_PAYMENT_TEXT_AND_URL__'] =
'TextAndUrlToPayOnlineIfApplicable';
8275 $substitutionarray[
'__SECUREKEYPAYMENT__'] =
'Security key (if key is not unique per record)';
8276 $substitutionarray[
'__SECUREKEYPAYMENT_MEMBER__'] =
'Security key for payment on a member subscription (one key per member)';
8277 $substitutionarray[
'__SECUREKEYPAYMENT_ORDER__'] =
'Security key for payment on an order';
8278 $substitutionarray[
'__SECUREKEYPAYMENT_INVOICE__'] =
'Security key for payment on an invoice';
8279 $substitutionarray[
'__SECUREKEYPAYMENT_CONTRACTLINE__'] =
'Security key for payment on a service of a contract';
8281 $substitutionarray[
'__DIRECTDOWNLOAD_URL_PROPOSAL__'] =
'Direct download url of a proposal';
8282 $substitutionarray[
'__DIRECTDOWNLOAD_URL_ORDER__'] =
'Direct download url of an order';
8283 $substitutionarray[
'__DIRECTDOWNLOAD_URL_INVOICE__'] =
'Direct download url of an invoice';
8284 $substitutionarray[
'__DIRECTDOWNLOAD_URL_CONTRACT__'] =
'Direct download url of a contract';
8285 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_PROPOSAL__'] =
'Direct download url of a supplier proposal';
8287 if (isModEnabled(
"expedition") && (!is_object($object) || $object->element ==
'shipping')) {
8288 $substitutionarray[
'__SHIPPINGTRACKNUM__'] =
'Shipping tracking number';
8289 $substitutionarray[
'__SHIPPINGTRACKNUMURL__'] =
'Shipping tracking url';
8290 $substitutionarray[
'__SHIPPINGMETHOD__'] =
'Shipping method';
8292 if (isModEnabled(
"reception") && (!is_object($object) || $object->element ==
'reception')) {
8293 $substitutionarray[
'__RECEPTIONTRACKNUM__'] =
'Shippin tracking number of shipment';
8294 $substitutionarray[
'__RECEPTIONTRACKNUMURL__'] =
'Shipping tracking url';
8297 $substitutionarray[
'__ID__'] = $object->id;
8298 $substitutionarray[
'__REF__'] = $object->ref;
8299 $substitutionarray[
'__NEWREF__'] = $object->newref;
8300 $substitutionarray[
'__LABEL__'] = (isset($object->label) ? $object->label : (isset($object->title) ? $object->title :
null));
8301 $substitutionarray[
'__REF_CLIENT__'] = (isset($object->ref_client) ? $object->ref_client : (isset($object->ref_customer) ? $object->ref_customer :
null));
8302 $substitutionarray[
'__REF_SUPPLIER__'] = (isset($object->ref_supplier) ? $object->ref_supplier :
null);
8303 $substitutionarray[
'__NOTE_PUBLIC__'] = (isset($object->note_public) ? $object->note_public :
null);
8304 $substitutionarray[
'__NOTE_PRIVATE__'] = (isset($object->note_private) ? $object->note_private :
null);
8305 $substitutionarray[
'__DATE_DELIVERY__'] = (isset($object->date_delivery) ?
dol_print_date($object->date_delivery,
'day', 0, $outputlangs) :
'');
8306 $substitutionarray[
'__DATE_DELIVERY_DAY__'] = (isset($object->date_delivery) ?
dol_print_date($object->date_delivery,
"%d") :
'');
8307 $substitutionarray[
'__DATE_DELIVERY_DAY_TEXT__'] = (isset($object->date_delivery) ?
dol_print_date($object->date_delivery,
"%A") :
'');
8308 $substitutionarray[
'__DATE_DELIVERY_MON__'] = (isset($object->date_delivery) ?
dol_print_date($object->date_delivery,
"%m") :
'');
8309 $substitutionarray[
'__DATE_DELIVERY_MON_TEXT__'] = (isset($object->date_delivery) ?
dol_print_date($object->date_delivery,
"%b") :
'');
8310 $substitutionarray[
'__DATE_DELIVERY_YEAR__'] = (isset($object->date_delivery) ?
dol_print_date($object->date_delivery,
"%Y") :
'');
8311 $substitutionarray[
'__DATE_DELIVERY_HH__'] = (isset($object->date_delivery) ?
dol_print_date($object->date_delivery,
"%H") :
'');
8312 $substitutionarray[
'__DATE_DELIVERY_MM__'] = (isset($object->date_delivery) ?
dol_print_date($object->date_delivery,
"%M") :
'');
8313 $substitutionarray[
'__DATE_DELIVERY_SS__'] = (isset($object->date_delivery) ?
dol_print_date($object->date_delivery,
"%S") :
'');
8316 $substitutionarray[
'__REFCLIENT__'] = (isset($object->ref_client) ? $object->ref_client : (isset($object->ref_customer) ? $object->ref_customer :
null));
8317 $substitutionarray[
'__REFSUPPLIER__'] = (isset($object->ref_supplier) ? $object->ref_supplier :
null);
8318 $substitutionarray[
'__SUPPLIER_ORDER_DATE_DELIVERY__'] = (isset($object->delivery_date) ?
dol_print_date($object->delivery_date,
'day', 0, $outputlangs) :
'');
8319 $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 :
'')) :
'');
8320 $substitutionarray[
'__EXPIRATION_DATE__'] = (isset($object->fin_validite) ?
dol_print_date($object->fin_validite,
'daytext') :
'');
8322 if (is_object($object) && ($object->element ==
'adherent' || $object->element ==
'member') && $object->id > 0) {
8323 $birthday = (empty($object->birth) ?
'' :
dol_print_date($object->birth,
'day'));
8325 $substitutionarray[
'__MEMBER_ID__'] = (isset($object->id) ? $object->id :
'');
8326 if (method_exists($object,
'getCivilityLabel')) {
8327 $substitutionarray[
'__MEMBER_CIVILITY__'] = $object->getCivilityLabel();
8329 $substitutionarray[
'__MEMBER_FIRSTNAME__'] = (isset($object->firstname) ? $object->firstname :
'');
8330 $substitutionarray[
'__MEMBER_LASTNAME__'] = (isset($object->lastname) ? $object->lastname :
'');
8331 $substitutionarray[
'__MEMBER_USER_LOGIN_INFORMATION__'] =
'';
8332 if (method_exists($object,
'getFullName')) {
8333 $substitutionarray[
'__MEMBER_FULLNAME__'] = $object->getFullName($outputlangs);
8335 $substitutionarray[
'__MEMBER_COMPANY__'] = (isset($object->societe) ? $object->societe :
'');
8336 $substitutionarray[
'__MEMBER_ADDRESS__'] = (isset($object->address) ? $object->address :
'');
8337 $substitutionarray[
'__MEMBER_ZIP__'] = (isset($object->zip) ? $object->zip :
'');
8338 $substitutionarray[
'__MEMBER_TOWN__'] = (isset($object->town) ? $object->town :
'');
8339 $substitutionarray[
'__MEMBER_COUNTRY__'] = (isset($object->country) ? $object->country :
'');
8340 $substitutionarray[
'__MEMBER_EMAIL__'] = (isset($object->email) ? $object->email :
'');
8341 $substitutionarray[
'__MEMBER_BIRTH__'] = (isset($birthday) ? $birthday :
'');
8342 $substitutionarray[
'__MEMBER_PHOTO__'] = (isset($object->photo) ? $object->photo :
'');
8343 $substitutionarray[
'__MEMBER_LOGIN__'] = (isset($object->login) ? $object->login :
'');
8344 $substitutionarray[
'__MEMBER_PASSWORD__'] = (isset($object->pass) ? $object->pass :
'');
8345 $substitutionarray[
'__MEMBER_PHONE__'] = (isset($object->phone) ?
dol_print_phone($object->phone) :
'');
8346 $substitutionarray[
'__MEMBER_PHONEPRO__'] = (isset($object->phone_perso) ?
dol_print_phone($object->phone_perso) :
'');
8347 $substitutionarray[
'__MEMBER_PHONEMOBILE__'] = (isset($object->phone_mobile) ?
dol_print_phone($object->phone_mobile) :
'');
8348 $substitutionarray[
'__MEMBER_TYPE__'] = (isset($object->type) ? $object->type :
'');
8349 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE__'] =
dol_print_date($object->first_subscription_date,
'day');
8350 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_START__'] = (isset($object->first_subscription_date_start) ?
dol_print_date($object->first_subscription_date_start,
'day') :
'');
8351 $substitutionarray[
'__MEMBER_FIRST_SUBSCRIPTION_DATE_END__'] = (isset($object->first_subscription_date_end) ?
dol_print_date($object->first_subscription_date_end,
'day') :
'');
8352 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE__'] =
dol_print_date($object->last_subscription_date,
'day');
8353 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_START__'] =
dol_print_date($object->last_subscription_date_start,
'day');
8354 $substitutionarray[
'__MEMBER_LAST_SUBSCRIPTION_DATE_END__'] =
dol_print_date($object->last_subscription_date_end,
'day');
8357 if (is_object($object) && $object->element ==
'societe') {
8358 $substitutionarray[
'__THIRDPARTY_ID__'] = (is_object($object) ? $object->id :
'');
8359 $substitutionarray[
'__THIRDPARTY_NAME__'] = (is_object($object) ? $object->name :
'');
8360 $substitutionarray[
'__THIRDPARTY_NAME_ALIAS__'] = (is_object($object) ? $object->name_alias :
'');
8361 $substitutionarray[
'__THIRDPARTY_CODE_CLIENT__'] = (is_object($object) ? $object->code_client :
'');
8362 $substitutionarray[
'__THIRDPARTY_CODE_FOURNISSEUR__'] = (is_object($object) ? $object->code_fournisseur :
'');
8363 $substitutionarray[
'__THIRDPARTY_EMAIL__'] = (is_object($object) ? $object->email :
'');
8364 $substitutionarray[
'__THIRDPARTY_PHONE__'] = (is_object($object) ?
dol_print_phone($object->phone) :
'');
8365 $substitutionarray[
'__THIRDPARTY_FAX__'] = (is_object($object) ?
dol_print_phone($object->fax) :
'');
8366 $substitutionarray[
'__THIRDPARTY_ADDRESS__'] = (is_object($object) ? $object->address :
'');
8367 $substitutionarray[
'__THIRDPARTY_ZIP__'] = (is_object($object) ? $object->zip :
'');
8368 $substitutionarray[
'__THIRDPARTY_TOWN__'] = (is_object($object) ? $object->town :
'');
8369 $substitutionarray[
'__THIRDPARTY_COUNTRY_ID__'] = (is_object($object) ? $object->country_id :
'');
8370 $substitutionarray[
'__THIRDPARTY_COUNTRY_CODE__'] = (is_object($object) ? $object->country_code :
'');
8371 $substitutionarray[
'__THIRDPARTY_IDPROF1__'] = (is_object($object) ? $object->idprof1 :
'');
8372 $substitutionarray[
'__THIRDPARTY_IDPROF2__'] = (is_object($object) ? $object->idprof2 :
'');
8373 $substitutionarray[
'__THIRDPARTY_IDPROF3__'] = (is_object($object) ? $object->idprof3 :
'');
8374 $substitutionarray[
'__THIRDPARTY_IDPROF4__'] = (is_object($object) ? $object->idprof4 :
'');
8375 $substitutionarray[
'__THIRDPARTY_IDPROF5__'] = (is_object($object) ? $object->idprof5 :
'');
8376 $substitutionarray[
'__THIRDPARTY_IDPROF6__'] = (is_object($object) ? $object->idprof6 :
'');
8377 $substitutionarray[
'__THIRDPARTY_TVAINTRA__'] = (is_object($object) ? $object->tva_intra :
'');
8378 $substitutionarray[
'__THIRDPARTY_NOTE_PUBLIC__'] = (is_object($object) ?
dol_htmlentitiesbr($object->note_public) :
'');
8379 $substitutionarray[
'__THIRDPARTY_NOTE_PRIVATE__'] = (is_object($object) ?
dol_htmlentitiesbr($object->note_private) :
'');
8380 } elseif (is_object($object->thirdparty)) {
8381 $substitutionarray[
'__THIRDPARTY_ID__'] = (is_object($object->thirdparty) ? $object->thirdparty->id :
'');
8382 $substitutionarray[
'__THIRDPARTY_NAME__'] = (is_object($object->thirdparty) ? $object->thirdparty->name :
'');
8383 $substitutionarray[
'__THIRDPARTY_NAME_ALIAS__'] = (is_object($object->thirdparty) ? $object->thirdparty->name_alias :
'');
8384 $substitutionarray[
'__THIRDPARTY_CODE_CLIENT__'] = (is_object($object->thirdparty) ? $object->thirdparty->code_client :
'');
8385 $substitutionarray[
'__THIRDPARTY_CODE_FOURNISSEUR__'] = (is_object($object->thirdparty) ? $object->thirdparty->code_fournisseur :
'');
8386 $substitutionarray[
'__THIRDPARTY_EMAIL__'] = (is_object($object->thirdparty) ? $object->thirdparty->email :
'');
8387 $substitutionarray[
'__THIRDPARTY_PHONE__'] = (is_object($object->thirdparty) ?
dol_print_phone($object->thirdparty->phone) :
'');
8388 $substitutionarray[
'__THIRDPARTY_FAX__'] = (is_object($object->thirdparty) ?
dol_print_phone($object->thirdparty->fax) :
'');
8389 $substitutionarray[
'__THIRDPARTY_ADDRESS__'] = (is_object($object->thirdparty) ? $object->thirdparty->address :
'');
8390 $substitutionarray[
'__THIRDPARTY_ZIP__'] = (is_object($object->thirdparty) ? $object->thirdparty->zip :
'');
8391 $substitutionarray[
'__THIRDPARTY_TOWN__'] = (is_object($object->thirdparty) ? $object->thirdparty->town :
'');
8392 $substitutionarray[
'__THIRDPARTY_COUNTRY_ID__'] = (is_object($object->thirdparty) ? $object->thirdparty->country_id :
'');
8393 $substitutionarray[
'__THIRDPARTY_COUNTRY_CODE__'] = (is_object($object->thirdparty) ? $object->thirdparty->country_code :
'');
8394 $substitutionarray[
'__THIRDPARTY_IDPROF1__'] = (is_object($object->thirdparty) ? $object->thirdparty->idprof1 :
'');
8395 $substitutionarray[
'__THIRDPARTY_IDPROF2__'] = (is_object($object->thirdparty) ? $object->thirdparty->idprof2 :
'');
8396 $substitutionarray[
'__THIRDPARTY_IDPROF3__'] = (is_object($object->thirdparty) ? $object->thirdparty->idprof3 :
'');
8397 $substitutionarray[
'__THIRDPARTY_IDPROF4__'] = (is_object($object->thirdparty) ? $object->thirdparty->idprof4 :
'');
8398 $substitutionarray[
'__THIRDPARTY_IDPROF5__'] = (is_object($object->thirdparty) ? $object->thirdparty->idprof5 :
'');
8399 $substitutionarray[
'__THIRDPARTY_IDPROF6__'] = (is_object($object->thirdparty) ? $object->thirdparty->idprof6 :
'');
8400 $substitutionarray[
'__THIRDPARTY_TVAINTRA__'] = (is_object($object->thirdparty) ? $object->thirdparty->tva_intra :
'');
8401 $substitutionarray[
'__THIRDPARTY_NOTE_PUBLIC__'] = (is_object($object->thirdparty) ?
dol_htmlentitiesbr($object->thirdparty->note_public) :
'');
8402 $substitutionarray[
'__THIRDPARTY_NOTE_PRIVATE__'] = (is_object($object->thirdparty) ?
dol_htmlentitiesbr($object->thirdparty->note_private) :
'');
8405 if (is_object($object) && $object->element ==
'recruitmentcandidature') {
8406 $substitutionarray[
'__CANDIDATE_FULLNAME__'] = $object->getFullName($outputlangs);
8407 $substitutionarray[
'__CANDIDATE_FIRSTNAME__'] = isset($object->firstname) ? $object->firstname :
'';
8408 $substitutionarray[
'__CANDIDATE_LASTNAME__'] = isset($object->lastname) ? $object->lastname :
'';
8410 if (is_object($object) && $object->element ==
'conferenceorboothattendee') {
8411 $substitutionarray[
'__ATTENDEE_FULLNAME__'] = $object->getFullName($outputlangs);
8412 $substitutionarray[
'__ATTENDEE_FIRSTNAME__'] = isset($object->firstname) ? $object->firstname :
'';
8413 $substitutionarray[
'__ATTENDEE_LASTNAME__'] = isset($object->lastname) ? $object->lastname :
'';
8416 if (is_object($object) && $object->element ==
'project') {
8417 $substitutionarray[
'__PROJECT_ID__'] = $object->id;
8418 $substitutionarray[
'__PROJECT_REF__'] = $object->ref;
8419 $substitutionarray[
'__PROJECT_NAME__'] = $object->title;
8420 } elseif (is_object($object)) {
8422 if (!empty($object->project)) {
8423 $project = $object->project;
8424 } elseif (!empty($object->projet)) {
8425 $project = $object->projet;
8427 if (!is_null($project) && is_object($project)) {
8428 $substitutionarray[
'__PROJECT_ID__'] = $project->id;
8429 $substitutionarray[
'__PROJECT_REF__'] = $project->ref;
8430 $substitutionarray[
'__PROJECT_NAME__'] = $project->title;
8434 if (!empty($object->fk_project) && $object->fk_project > 0) {
8435 $project_id = $object->fk_project;
8436 } elseif (!empty($object->fk_projet) && $object->fk_projet > 0) {
8437 $project_id = $object->fk_project;
8439 if ($project_id > 0) {
8441 $substitutionarray[
'__PROJECT_ID__@lazyload'] =
'/projet/class/project.class.php:Project:fetchAndSetSubstitution:' . $project_id;
8442 $substitutionarray[
'__PROJECT_REF__@lazyload'] =
'/projet/class/project.class.php:Project:fetchAndSetSubstitution:' . $project_id;
8443 $substitutionarray[
'__PROJECT_NAME__@lazyload'] =
'/projet/class/project.class.php:Project:fetchAndSetSubstitution:' . $project_id;
8448 if (is_object($object) && $object->element ==
'shipping') {
8449 $substitutionarray[
'__SHIPPINGTRACKNUM__'] = $object->tracking_number;
8450 $substitutionarray[
'__SHIPPINGTRACKNUMURL__'] = $object->tracking_url;
8451 $substitutionarray[
'__SHIPPINGMETHOD__'] = $object->shipping_method;
8453 if (is_object($object) && $object->element ==
'reception') {
8454 $substitutionarray[
'__RECEPTIONTRACKNUM__'] = $object->tracking_number;
8455 $substitutionarray[
'__RECEPTIONTRACKNUMURL__'] = $object->tracking_url;
8458 if (is_object($object) && $object->element ==
'contrat' && $object->id > 0 && is_array($object->lines)) {
8459 $dateplannedstart =
'';
8460 $datenextexpiration =
'';
8461 foreach ($object->lines as $line) {
8462 if ($line->date_start > $dateplannedstart) {
8463 $dateplannedstart = $line->date_start;
8465 if ($line->statut == 4 && $line->date_end && (!$datenextexpiration || $line->date_end < $datenextexpiration)) {
8466 $datenextexpiration = $line->date_end;
8469 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATE__'] =
dol_print_date($dateplannedstart,
'day');
8470 $substitutionarray[
'__CONTRACT_HIGHEST_PLANNED_START_DATETIME__'] =
dol_print_date($dateplannedstart,
'standard');
8471 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATE__'] =
dol_print_date($datenextexpiration,
'day');
8472 $substitutionarray[
'__CONTRACT_LOWEST_EXPIRATION_DATETIME__'] =
dol_print_date($datenextexpiration,
'standard');
8475 if (is_object($object) && $object->element ==
'ticket') {
8476 $substitutionarray[
'__TICKET_TRACKID__'] = $object->track_id;
8477 $substitutionarray[
'__REF__'] = $object->ref;
8478 $substitutionarray[
'__TICKET_SUBJECT__'] = $object->subject;
8479 $substitutionarray[
'__TICKET_TYPE__'] = $object->type_code;
8480 $substitutionarray[
'__TICKET_SEVERITY__'] = $object->severity_code;
8481 $substitutionarray[
'__TICKET_CATEGORY__'] = $object->category_code;
8482 $substitutionarray[
'__TICKET_ANALYTIC_CODE__'] = $object->category_code;
8483 $substitutionarray[
'__TICKET_MESSAGE__'] = $object->message;
8484 $substitutionarray[
'__TICKET_PROGRESSION__'] = $object->progress;
8485 $userstat =
new User($db);
8486 if ($object->fk_user_assign > 0) {
8487 $userstat->fetch($object->fk_user_assign);
8488 $substitutionarray[
'__TICKET_USER_ASSIGN__'] =
dolGetFirstLastname($userstat->firstname, $userstat->lastname);
8491 if ($object->fk_user_create > 0) {
8492 $userstat->fetch($object->fk_user_create);
8493 $substitutionarray[
'__USER_CREATE__'] =
dolGetFirstLastname($userstat->firstname, $userstat->lastname);
8498 if ($object->table_element && $object->id > 0) {
8499 if (!is_object($extrafields)) {
8502 $extrafields->fetch_name_optionals_label($object->table_element,
true);
8504 if ($object->fetch_optionals() > 0) {
8505 if (is_array($extrafields->attributes[$object->table_element][
'label']) && count($extrafields->attributes[$object->table_element][
'label']) > 0) {
8506 foreach ($extrafields->attributes[$object->table_element][
'label'] as $key => $label) {
8507 if ($extrafields->attributes[$object->table_element][
'type'][$key] ==
'date') {
8508 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] =
dol_print_date($object->array_options[
'options_'.$key],
'day');
8509 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_LOCALE__'] =
dol_print_date($object->array_options[
'options_'.$key],
'day',
'tzserver', $outputlangs);
8510 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_RFC__'] =
dol_print_date($object->array_options[
'options_'.$key],
'dayrfc');
8511 } elseif ($extrafields->attributes[$object->table_element][
'type'][$key] ==
'datetime') {
8512 $datetime = $object->array_options[
'options_'.$key];
8513 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'dayhour') :
'');
8514 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_LOCALE__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'dayhour',
'tzserver', $outputlangs) :
'');
8515 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_DAY_LOCALE__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'day',
'tzserver', $outputlangs) :
'');
8516 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_RFC__'] = ($datetime !=
"0000-00-00 00:00:00" ?
dol_print_date($datetime,
'dayhourrfc') :
'');
8517 } elseif ($extrafields->attributes[$object->table_element][
'type'][$key] ==
'phone') {
8518 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] =
dol_print_phone($object->array_options[
'options_'.$key]);
8519 } elseif ($extrafields->attributes[$object->table_element][
'type'][$key] ==
'price') {
8520 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] = $object->array_options[
'options_'.$key];
8521 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'_FORMATED__'] =
price($object->array_options[
'options_'.$key]);
8522 } elseif ($extrafields->attributes[$object->table_element][
'type'][$key] !=
'separator') {
8523 $substitutionarray[
'__EXTRAFIELD_'.strtoupper($key).
'__'] = !empty($object->array_options[
'options_'.$key]) ? $object->array_options[
'options_'.$key] :
'';
8532 if (empty($substitutionarray[
'__REF__'])) {
8536 require_once DOL_DOCUMENT_ROOT.
'/core/lib/payments.lib.php';
8537 $outputlangs->loadLangs(array(
'paypal',
'other'));
8540 $typeforonlinepayment =
'free';
8541 if (is_object($object) && $object->element ==
'commande') {
8542 $typeforonlinepayment =
'order';
8544 if (is_object($object) && $object->element ==
'facture') {
8545 $typeforonlinepayment =
'invoice';
8547 if (is_object($object) && $object->element ==
'member') {
8548 $typeforonlinepayment =
'member';
8549 if (!empty($object->last_subscription_amount)) {
8550 $amounttouse = $object->last_subscription_amount;
8553 if (is_object($object) && $object->element ==
'contrat') {
8554 $typeforonlinepayment =
'contract';
8556 if (is_object($object) && $object->element ==
'fichinter') {
8557 $typeforonlinepayment =
'ficheinter';
8560 $url = getOnlinePaymentUrl(0, $typeforonlinepayment, $substitutionarray[
'__REF__'], $amounttouse);
8564 if ($object->id > 0) {
8565 $substitutionarray[
'__ONLINE_PAYMENT_TEXT_AND_URL__'] = ($paymenturl ? str_replace(
'\n',
"\n", $outputlangs->trans(
"PredefinedMailContentLink", $paymenturl)) :
'');
8566 $substitutionarray[
'__ONLINE_PAYMENT_URL__'] = $paymenturl;
8568 if (
getDolGlobalString(
'PROPOSAL_ALLOW_EXTERNAL_DOWNLOAD') && is_object($object) && $object->element ==
'propal') {
8569 $substitutionarray[
'__DIRECTDOWNLOAD_URL_PROPOSAL__'] = $object->getLastMainDocLink($object->element);
8571 $substitutionarray[
'__DIRECTDOWNLOAD_URL_PROPOSAL__'] =
'';
8573 if (
getDolGlobalString(
'ORDER_ALLOW_EXTERNAL_DOWNLOAD') && is_object($object) && $object->element ==
'commande') {
8574 $substitutionarray[
'__DIRECTDOWNLOAD_URL_ORDER__'] = $object->getLastMainDocLink($object->element);
8576 $substitutionarray[
'__DIRECTDOWNLOAD_URL_ORDER__'] =
'';
8578 if (
getDolGlobalString(
'INVOICE_ALLOW_EXTERNAL_DOWNLOAD') && is_object($object) && $object->element ==
'facture') {
8579 $substitutionarray[
'__DIRECTDOWNLOAD_URL_INVOICE__'] = $object->getLastMainDocLink($object->element);
8581 $substitutionarray[
'__DIRECTDOWNLOAD_URL_INVOICE__'] =
'';
8583 if (
getDolGlobalString(
'CONTRACT_ALLOW_EXTERNAL_DOWNLOAD') && is_object($object) && $object->element ==
'contrat') {
8584 $substitutionarray[
'__DIRECTDOWNLOAD_URL_CONTRACT__'] = $object->getLastMainDocLink($object->element);
8586 $substitutionarray[
'__DIRECTDOWNLOAD_URL_CONTRACT__'] =
'';
8588 if (
getDolGlobalString(
'FICHINTER_ALLOW_EXTERNAL_DOWNLOAD') && is_object($object) && $object->element ==
'fichinter') {
8589 $substitutionarray[
'__DIRECTDOWNLOAD_URL_FICHINTER__'] = $object->getLastMainDocLink($object->element);
8591 $substitutionarray[
'__DIRECTDOWNLOAD_URL_FICHINTER__'] =
'';
8593 if (
getDolGlobalString(
'SUPPLIER_PROPOSAL_ALLOW_EXTERNAL_DOWNLOAD') && is_object($object) && $object->element ==
'supplier_proposal') {
8594 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_PROPOSAL__'] = $object->getLastMainDocLink($object->element);
8596 $substitutionarray[
'__DIRECTDOWNLOAD_URL_SUPPLIER_PROPOSAL__'] =
'';
8599 if (is_object($object) && $object->element ==
'propal') {
8600 $substitutionarray[
'__URL_PROPOSAL__'] = DOL_MAIN_URL_ROOT.
"/comm/propal/card.php?id=".$object->id;
8601 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
8602 $substitutionarray[
'__ONLINE_SIGN_URL__'] = getOnlineSignatureUrl(0,
'proposal', $object->ref);
8604 if (is_object($object) && $object->element ==
'commande') {
8605 $substitutionarray[
'__URL_ORDER__'] = DOL_MAIN_URL_ROOT.
"/commande/card.php?id=".$object->id;
8607 if (is_object($object) && $object->element ==
'facture') {
8608 $substitutionarray[
'__URL_INVOICE__'] = DOL_MAIN_URL_ROOT.
"/compta/facture/card.php?id=".$object->id;
8610 if (is_object($object) && $object->element ==
'contrat') {
8611 $substitutionarray[
'__URL_CONTRACT__'] = DOL_MAIN_URL_ROOT.
"/contrat/card.php?id=".$object->id;
8612 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
8613 $substitutionarray[
'__ONLINE_SIGN_URL__'] = getOnlineSignatureUrl(0,
'contract', $object->ref);
8615 if (is_object($object) && $object->element ==
'fichinter') {
8616 $substitutionarray[
'__URL_FICHINTER__'] = DOL_MAIN_URL_ROOT.
"/fichinter/card.php?id=".$object->id;
8617 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
8618 $substitutionarray[
'__ONLINE_SIGN_FICHINTER_URL__'] = getOnlineSignatureUrl(0,
'fichinter', $object->ref);
8620 if (is_object($object) && $object->element ==
'supplier_proposal') {
8621 $substitutionarray[
'__URL_SUPPLIER_PROPOSAL__'] = DOL_MAIN_URL_ROOT.
"/supplier_proposal/card.php?id=".$object->id;
8623 if (is_object($object) && $object->element ==
'shipping') {
8624 $substitutionarray[
'__URL_SHIPMENT__'] = DOL_MAIN_URL_ROOT.
"/expedition/card.php?id=".$object->id;
8628 if (is_object($object) && $object->element ==
'action') {
8629 $substitutionarray[
'__EVENT_LABEL__'] = $object->label;
8630 $substitutionarray[
'__EVENT_TYPE__'] = $outputlangs->trans(
"Action".$object->type_code);
8631 $substitutionarray[
'__EVENT_DATE__'] =
dol_print_date($object->datep,
'day',
'auto', $outputlangs);
8632 $substitutionarray[
'__EVENT_TIME__'] =
dol_print_date($object->datep,
'hour',
'auto', $outputlangs);
8636 if ((empty($exclude) || !in_array(
'objectamount', $exclude)) && (empty($include) || in_array(
'objectamount', $include))) {
8637 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functionsnumtoword.lib.php';
8639 $substitutionarray[
'__DATE_YMD__'] = is_object($object) ? (isset($object->date) ?
dol_print_date($object->date,
'day', 0, $outputlangs) :
null) :
'';
8640 $substitutionarray[
'__DATE_DUE_YMD__'] = is_object($object) ? (isset($object->date_lim_reglement) ?
dol_print_date($object->date_lim_reglement,
'day', 0, $outputlangs) :
null) :
'';
8642 $already_payed_all = 0;
8643 if (is_object($object) && ($object instanceof
Facture)) {
8644 $already_payed_all = $object->sumpayed + $object->sumdeposit + $object->sumcreditnote;
8647 $substitutionarray[
'__AMOUNT_EXCL_TAX__'] = is_object($object) ? $object->total_ht :
'';
8649 $substitutionarray[
'__AMOUNT__'] = is_object($object) ? $object->total_ttc :
'';
8650 $substitutionarray[
'__AMOUNT_TEXT__'] = is_object($object) ?
dol_convertToWord($object->total_ttc, $outputlangs,
'',
true) :
'';
8651 $substitutionarray[
'__AMOUNT_TEXTCURRENCY__'] = is_object($object) ?
dol_convertToWord($object->total_ttc, $outputlangs, $conf->currency,
true) :
'';
8653 $substitutionarray[
'__AMOUNT_REMAIN__'] = is_object($object) ?
price2num($object->total_ttc - $already_payed_all,
'MT') :
'';
8655 $substitutionarray[
'__AMOUNT_VAT__'] = is_object($object) ? (isset($object->total_vat) ? $object->total_vat : $object->total_tva) :
'';
8656 $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)) :
'';
8657 $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)) :
'';
8659 if ($onlykey != 2 || $mysoc->useLocalTax(1)) {
8660 $substitutionarray[
'__AMOUNT_TAX2__'] = is_object($object) ? $object->total_localtax1 :
'';
8662 if ($onlykey != 2 || $mysoc->useLocalTax(2)) {
8663 $substitutionarray[
'__AMOUNT_TAX3__'] = is_object($object) ? $object->total_localtax2 :
'';
8667 $substitutionarray[
'__AMOUNT_EXCL_TAX_FORMATED__'] = is_object($object) ? ($object->total_ht ?
price($object->total_ht, 0, $outputlangs, 0, -1, -1, $conf->currency) :
null) :
'';
8668 $substitutionarray[
'__AMOUNT_FORMATED__'] = is_object($object) ? ($object->total_ttc ?
price($object->total_ttc, 0, $outputlangs, 0, -1, -1, $conf->currency) :
null) :
'';
8669 $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) :
'';
8670 $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)) :
'';
8671 if ($onlykey != 2 || $mysoc->useLocalTax(1)) {
8672 $substitutionarray[
'__AMOUNT_TAX2_FORMATED__'] = is_object($object) ? ($object->total_localtax1 ?
price($object->total_localtax1, 0, $outputlangs, 0, -1, -1, $conf->currency) :
null) :
'';
8674 if ($onlykey != 2 || $mysoc->useLocalTax(2)) {
8675 $substitutionarray[
'__AMOUNT_TAX3_FORMATED__'] = is_object($object) ? ($object->total_localtax2 ?
price($object->total_localtax2, 0, $outputlangs, 0, -1, -1, $conf->currency) :
null) :
'';
8678 $substitutionarray[
'__AMOUNT_MULTICURRENCY__'] = (is_object($object) && isset($object->multicurrency_total_ttc)) ? $object->multicurrency_total_ttc :
'';
8679 $substitutionarray[
'__AMOUNT_MULTICURRENCY_TEXT__'] = (is_object($object) && isset($object->multicurrency_total_ttc)) ?
dol_convertToWord($object->multicurrency_total_ttc, $outputlangs,
'',
true) :
'';
8680 $substitutionarray[
'__AMOUNT_MULTICURRENCY_TEXTCURRENCY__'] = (is_object($object) && isset($object->multicurrency_total_ttc)) ?
dol_convertToWord($object->multicurrency_total_ttc, $outputlangs, $object->multicurrency_code,
true) :
'';
8684 if ($onlykey != 2) {
8685 $substitutionarray[
'__TOTAL_TTC__'] = is_object($object) ? $object->total_ttc :
'';
8686 $substitutionarray[
'__TOTAL_HT__'] = is_object($object) ? $object->total_ht :
'';
8687 $substitutionarray[
'__TOTAL_VAT__'] = is_object($object) ? (isset($object->total_vat) ? $object->total_vat : $object->total_tva) :
'';
8692 if ((empty($exclude) || !in_array(
'date', $exclude)) && (empty($include) || in_array(
'date', $include))) {
8693 include_once DOL_DOCUMENT_ROOT.
'/core/lib/date.lib.php';
8703 $daytext = $outputlangs->trans(
'Day'.$tmp[
'wday']);
8705 $substitutionarray = array_merge($substitutionarray, array(
8706 '__NOW_TMS__' => (
string) $now,
8707 '__NOW_TMS_YMD__' =>
dol_print_date($now,
'day',
'auto', $outputlangs),
8708 '__DAY__' => (
string) $tmp[
'mday'],
8709 '__DAY_TEXT__' => $daytext,
8710 '__DAY_TEXT_SHORT__' =>
dol_trunc($daytext, 3,
'right',
'UTF-8', 1),
8711 '__DAY_TEXT_MIN__' =>
dol_trunc($daytext, 1,
'right',
'UTF-8', 1),
8712 '__MONTH__' => (
string) $tmp[
'mon'],
8713 '__MONTH_TEXT__' => $outputlangs->trans(
'Month'.sprintf(
"%02d", $tmp[
'mon'])),
8714 '__MONTH_TEXT_SHORT__' => $outputlangs->trans(
'MonthShort'.sprintf(
"%02d", $tmp[
'mon'])),
8715 '__MONTH_TEXT_MIN__' => $outputlangs->trans(
'MonthVeryShort'.sprintf(
"%02d", $tmp[
'mon'])),
8716 '__YEAR__' => (
string) $tmp[
'year'],
8717 '__PREVIOUS_DAY__' => (
string) $tmp2[
'day'],
8718 '__PREVIOUS_MONTH__' => (
string) $tmp3[
'month'],
8719 '__PREVIOUS_YEAR__' => (
string) ($tmp[
'year'] - 1),
8720 '__NEXT_DAY__' => (
string) $tmp4[
'day'],
8721 '__NEXT_MONTH__' => (
string) $tmp5[
'month'],
8722 '__NEXT_MONTH_TEXT__' => $outputlangs->trans(
'Month'.sprintf(
"%02d", $tmp5[
'month'])),
8723 '__NEXT_MONTH_TEXT_SHORT__' => $outputlangs->trans(
'MonthShort'.sprintf(
"%02d", $tmp5[
'month'])),
8724 '__NEXT_MONTH_TEXT_MIN__' => $outputlangs->trans(
'MonthVeryShort'.sprintf(
"%02d", $tmp5[
'month'])),
8725 '__NEXT_YEAR__' => (
string) ($tmp[
'year'] + 1),
8729 if (isModEnabled(
'multicompany')) {
8730 $substitutionarray = array_merge($substitutionarray, array(
'__ENTITY_ID__' => $conf->entity));
8732 if ((empty($exclude) || !in_array(
'system', $exclude)) && (empty($include) || in_array(
'user', $include))) {
8733 $substitutionarray[
'__DOL_MAIN_URL_ROOT__'] = DOL_MAIN_URL_ROOT;
8734 $substitutionarray[
'__(AnyTranslationKey)__'] = $outputlangs->trans(
'TranslationOfKey');
8735 $substitutionarray[
'__(AnyTranslationKey|langfile)__'] = $outputlangs->trans(
'TranslationOfKey').
' (load also language file before)';
8736 $substitutionarray[
'__[AnyConstantKey]__'] = $outputlangs->trans(
'ValueOfConstantKey');
8741 return $substitutionarray;
8760function make_substitutions($text, $substitutionarray, $outputlangs =
null, $converttextinhtmlifnecessary = 0)
8762 global $conf, $db, $langs;
8764 if (!is_array($substitutionarray)) {
8765 return 'ErrorBadParameterSubstitutionArrayWhenCalling_make_substitutions';
8768 if (empty($outputlangs)) {
8769 $outputlangs = $langs;
8779 if (is_object($outputlangs)) {
8781 while (preg_match(
'/__\(([^\)]+)\)__/', $text, $reg)) {
8783 $tmp = explode(
'|', $reg[1]);
8784 if (!empty($tmp[1])) {
8785 $outputlangs->load($tmp[1]);
8788 $value = $outputlangs->transnoentitiesnoconv($reg[1]);
8790 if (empty($converttextinhtmlifnecessary)) {
8792 $text = preg_replace(
'/__\('.preg_quote($reg[1],
'/').
'\)__/', $msgishtml ?
dol_htmlentitiesbr($value) : $value, $text);
8806 $text = preg_replace(
'/__\('.preg_quote($reg[1],
'/').
'\)__/', $value, $text);
8814 while (preg_match(
'/__\[([^\]]+)\]__/', $text, $reg)) {
8815 $keyfound = $reg[1];
8817 $value =
'*****forbidden*****';
8819 $value = empty($conf->global->$keyfound) ?
'' : $conf->global->$keyfound;
8822 if (empty($converttextinhtmlifnecessary)) {
8824 $text = preg_replace(
'/__\['.preg_quote($keyfound,
'/').
'\]__/', $msgishtml ?
dol_htmlentitiesbr($value) : $value, $text);
8837 $text = preg_replace(
'/__\['.preg_quote($keyfound,
'/').
'\]__/', $value, $text);
8842 foreach ($substitutionarray as $key => $value) {
8843 if (!isset($value)) {
8847 if (($key ==
'__USER_SIGNATURE__' || $key ==
'__SENDEREMAIL_SIGNATURE__') && (
getDolGlobalString(
'MAIN_MAIL_DO_NOT_USE_SIGN'))) {
8851 if (empty($converttextinhtmlifnecessary)) {
8852 $text = str_replace(
"$key",
"$value", $text);
8864 $text = str_replace(
"$key",
"$value", $text);
8880 $memory_object_list = array();
8881 foreach ($substitutionarray as $key => $value) {
8882 $lazy_load_arr = array();
8883 if (preg_match(
'/(__[A-Z\_]+__)@lazyload$/', $key, $lazy_load_arr)) {
8884 if (isset($lazy_load_arr[1]) && !empty($lazy_load_arr[1])) {
8885 $key_to_substitute = $lazy_load_arr[1];
8886 if (preg_match(
'/' . preg_quote($key_to_substitute,
'/') .
'/', $text)) {
8887 $param_arr = explode(
':', $value);
8889 if (count($param_arr) == 4) {
8890 $path = $param_arr[0];
8891 $class = $param_arr[1];
8892 $method = $param_arr[2];
8893 $id = (int) $param_arr[3];
8896 if (!isset($memory_object_list[$class])) {
8898 require_once DOL_DOCUMENT_ROOT . $path;
8899 if (class_exists($class)) {
8900 $memory_object_list[$class] = array(
8908 if (isset($memory_object_list[$class]) && isset($memory_object_list[$class][
'list'])) {
8909 if (method_exists($class, $method)) {
8910 if (!isset($memory_object_list[$class][
'list'][$id])) {
8911 $tmpobj =
new $class($db);
8912 $valuetouseforsubstitution = $tmpobj->$method($id, $key_to_substitute);
8913 $memory_object_list[$class][
'list'][$id] = $tmpobj;
8915 $tmpobj = $memory_object_list[$class][
'list'][$id];
8916 $valuetouseforsubstitution = $tmpobj->$method($id, $key_to_substitute,
true);
8919 $text = str_replace(
"$key_to_substitute",
"$valuetouseforsubstitution", $text);
8945 global $conf, $user;
8947 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
8952 $dirsubstitutions = array_merge(array(), (array) $conf->modules_parts[
'substitutions']);
8954 foreach ($dirsubstitutions as $reldir) {
8962 $substitfiles =
dol_dir_list($dir,
'files', 0,
'functions_');
8963 foreach ($substitfiles as $substitfile) {
8965 if (preg_match(
'/functions_(.*)\.lib\.php/i', $substitfile[
'name'], $reg)) {
8968 dol_syslog(
"Library ".$substitfile[
'name'].
" found into ".$dir);
8970 require_once $dir.$substitfile[
'name'];
8972 $function_name = $module.
"_".$callfunc;
8973 if (function_exists($function_name)) {
8974 $function_name($substitutionarray, $outputlangs, $object, $parameters);
8982 foreach ($substitutionarray as $key => $value) {
8983 $tags .=
'{'.$key.
'} => '.$value.
"\n";
8985 $substitutionarray = array_merge($substitutionarray, array(
'__ALL_TAGS__' => $tags));
9000 print
get_date_range($date_start, $date_end, $format, $outputlangs);
9013function get_date_range($date_start, $date_end, $format =
'', $outputlangs =
'', $withparenthesis = 1)
9019 if (!is_object($outputlangs)) {
9020 $outputlangs = $langs;
9023 if ($date_start && $date_end) {
9024 $out .= ($withparenthesis ?
' (' :
'').$outputlangs->transnoentitiesnoconv(
'DateFromTo',
dol_print_date($date_start, $format,
false, $outputlangs),
dol_print_date($date_end, $format,
false, $outputlangs)).($withparenthesis ?
')' :
'');
9026 if ($date_start && !$date_end) {
9027 $out .= ($withparenthesis ?
' (' :
'').$outputlangs->transnoentitiesnoconv(
'DateFrom',
dol_print_date($date_start, $format,
false, $outputlangs)).($withparenthesis ?
')' :
'');
9029 if (!$date_start && $date_end) {
9030 $out .= ($withparenthesis ?
' (' :
'').$outputlangs->transnoentitiesnoconv(
'DateUntil',
dol_print_date($date_end, $format,
false, $outputlangs)).($withparenthesis ?
')' :
'');
9050 if ($nameorder < 0) {
9053 if ($nameorder == 1) {
9055 if ($firstname && $lastname) {
9059 } elseif ($nameorder == 2 || $nameorder == 3) {
9061 if (empty($ret) && $nameorder == 3) {
9066 if (empty($ret) && $nameorder == 5) {
9069 if ($nameorder == 0) {
9070 if ($firstname && $lastname) {
9094 if (!is_array($mesgs)) {
9095 $mesgs = trim((
string) $mesgs);
9098 if (!empty($noduplicate) && isset($_SESSION[
'dol_events'][$style]) && in_array($mesgs, $_SESSION[
'dol_events'][$style])) {
9101 $_SESSION[
'dol_events'][$style][] = $mesgs;
9105 foreach ($mesgs as $mesg) {
9106 $mesg = trim((
string) $mesg);
9108 if (!empty($noduplicate) && isset($_SESSION[
'dol_events'][$style]) && in_array($mesg, $_SESSION[
'dol_events'][$style])) {
9111 $_SESSION[
'dol_events'][$style][] = $mesg;
9131 if (empty($mesg) && empty($mesgs)) {
9132 dol_syslog(
"Try to add a message in stack, but value to add is empty message", LOG_WARNING);
9139 if (empty($messagekey) || empty($_COOKIE[
"DOLHIDEMESSAGE".$messagekey])) {
9140 if (!in_array((
string) $style, array(
'mesgs',
'warnings',
'errors'))) {
9141 dol_print_error(
'',
'Bad parameter style='.$style.
' for setEventMessages');
9143 if (empty($mesgs)) {
9146 if (!empty($mesg) && !in_array($mesg, $mesgs)) {
9167 if (isset($_SESSION[
'dol_events'][
'mesgs'])) {
9168 if (empty($disabledoutputofmessages)) {
9171 unset($_SESSION[
'dol_events'][
'mesgs']);
9174 if (isset($_SESSION[
'dol_events'][
'errors'])) {
9175 if (empty($disabledoutputofmessages)) {
9178 unset($_SESSION[
'dol_events'][
'errors']);
9182 if (isset($_SESSION[
'dol_events'][
'warnings'])) {
9183 if (empty($disabledoutputofmessages)) {
9186 unset($_SESSION[
'dol_events'][
'warnings']);
9206 global $conf, $langs;
9211 $divstart = $divend =
'';
9214 if ((empty($conf->use_javascript_ajax) ||
getDolGlobalString(
'MAIN_DISABLE_JQUERY_JNOTIFY') || $keepembedded) && !preg_match(
'/<div class=".*">/i', $out)) {
9215 $divstart =
'<div class="'.$style.
' clearboth">';
9219 if ((is_array($mesgarray) && count($mesgarray)) || $mesgstring) {
9220 $langs->load(
"errors");
9222 if (is_array($mesgarray) && count($mesgarray)) {
9223 foreach ($mesgarray as $message) {
9225 $out .= $langs->trans($message);
9226 if ($ret < count($mesgarray)) {
9233 $out .= $langs->trans($mesgstring);
9239 if (!empty($conf->use_javascript_ajax) && !
getDolGlobalString(
'MAIN_DISABLE_JQUERY_JNOTIFY') && empty($keepembedded)) {
9240 $return =
'<script nonce="'.getNonce().
'">
9241 $(document).ready(function() {
9246 /* jnotify(message, preset of message type, keepmessage) */
9248 "'.($style ==
"ok" ? 3000 : $style).
'",
9249 '.($style ==
"ok" ?
"false" :
"true").
',
9250 { remove: function (){} } );
9293 if (empty($mesgstring) && (!is_array($mesgarray) || count($mesgarray) == 0)) {
9299 if (is_array($mesgarray)) {
9300 foreach ($mesgarray as $val) {
9301 if ($val && preg_match(
'/class="error"/i', $val)) {
9305 if ($val && preg_match(
'/class="warning"/i', $val)) {
9310 } elseif ($mesgstring && preg_match(
'/class="error"/i', $mesgstring)) {
9312 } elseif ($mesgstring && preg_match(
'/class="warning"/i', $mesgstring)) {
9315 if ($style ==
'error') {
9318 if ($style ==
'warning') {
9322 if ($iserror || $iswarning) {
9324 $mesgstring = preg_replace(
'/<\/div><div class="(error|warning)">/',
'<br>', $mesgstring);
9325 $mesgstring = preg_replace(
'/<div class="(error|warning)">/',
'', $mesgstring);
9326 $mesgstring = preg_replace(
'/<\/div>/',
'', $mesgstring);
9328 if (is_array($mesgarray)) {
9329 $newmesgarray = array();
9330 foreach ($mesgarray as $val) {
9331 if (is_string($val)) {
9332 $tmpmesgstring = preg_replace(
'/<\/div><div class="(error|warning)">/',
'<br>', $val);
9333 $tmpmesgstring = preg_replace(
'/<div class="(error|warning)">/',
'', $tmpmesgstring);
9334 $tmpmesgstring = preg_replace(
'/<\/div>/',
'', $tmpmesgstring);
9335 $newmesgarray[] = $tmpmesgstring;
9337 dol_syslog(
"Error call of dol_htmloutput_mesg with an array with a value that is not a string", LOG_WARNING);
9340 $mesgarray = $newmesgarray;
9342 print
get_htmloutput_mesg($mesgstring, $mesgarray, ($iserror ?
'error' :
'warning'), $keepembedded);
9378function dol_sort_array(&$array, $index, $order =
'asc', $natsort = 0, $case_sensitive = 0, $keepindex = 0)
9381 $order = strtolower($order);
9383 if (is_array($array)) {
9384 $sizearray = count($array);
9385 if ($sizearray > 0) {
9387 foreach (array_keys($array) as $key) {
9388 if (is_object($array[$key])) {
9389 $temp[$key] = empty($array[$key]->$index) ? 0 : $array[$key]->$index;
9391 $temp[$key] = empty($array[$key][$index]) ? 0 : $array[$key][$index];
9393 if ($natsort == -1) {
9394 $temp[$key] =
'___'.$temp[$key];
9398 if (empty($natsort) || $natsort == -1) {
9399 if ($order ==
'asc') {
9405 if ($case_sensitive) {
9410 if ($order !=
'asc') {
9411 $temp = array_reverse($temp,
true);
9417 foreach (array_keys($temp) as $key) {
9418 (is_numeric($key) && empty($keepindex)) ? $sorted[] = $array[$key] : $sorted[$key] = $array[$key];
9437 $str = (string) $str;
9440 $strLength = strlen($str);
9441 for ($i = 0; $i < $strLength; $i++) {
9442 if (ord($str[$i]) < 0x80) {
9444 } elseif ((ord($str[$i]) & 0xE0) == 0xC0) {
9446 } elseif ((ord($str[$i]) & 0xF0) == 0xE0) {
9448 } elseif ((ord($str[$i]) & 0xF8) == 0xF0) {
9450 } elseif ((ord($str[$i]) & 0xFC) == 0xF8) {
9452 } elseif ((ord($str[$i]) & 0xFE) == 0xFC) {
9457 for ($j = 0; $j < $n; $j++) {
9458 if ((++$i == strlen($str)) || ((ord($str[$i]) & 0xC0) != 0x80)) {
9479 return preg_match(
'//u', $str) ? true :
false;
9491 if (function_exists(
'mb_check_encoding')) {
9493 if (!mb_check_encoding($str,
'ASCII')) {
9497 if (preg_match(
'/[^\x00-\x7f]/', $str)) {
9517 $tmp = ini_get(
"unicode.filesystem_encoding");
9518 if (empty($tmp) && !empty($_SERVER[
"WINDIR"])) {
9519 $tmp =
'iso-8859-1';
9525 $tmp = $conf->global->MAIN_FILESYSTEM_ENCODING;
9528 if ($tmp ==
'iso-8859-1') {
9529 return mb_convert_encoding($str,
'ISO-8859-1',
'UTF-8');
9549function dol_getIdFromCode($db, $key, $tablename, $fieldkey =
'code', $fieldid =
'id', $entityfilter = 0, $filters =
'')
9551 global $cache_codes;
9559 if (isset($cache_codes[$tablename][$key][$fieldid])) {
9560 return $cache_codes[$tablename][$key][$fieldid];
9563 dol_syslog(
'dol_getIdFromCode (value for field '.$fieldid.
' from key '.$key.
' not found into cache)', LOG_DEBUG);
9565 $sql =
"SELECT ".$fieldid.
" as valuetoget";
9566 $sql .=
" FROM ".MAIN_DB_PREFIX.$tablename;
9567 $sql .=
" WHERE ".$fieldkey.
" = '".$db->escape($key).
"'";
9568 if (!empty($entityfilter)) {
9569 $sql .=
" AND entity IN (".getEntity($tablename).
")";
9575 $resql = $db->query($sql);
9577 $obj = $db->fetch_object($resql);
9579 $cache_codes[$tablename][$key][$fieldid] = $obj->valuetoget;
9581 $cache_codes[$tablename][$key][$fieldid] =
'';
9584 return $cache_codes[$tablename][$key][$fieldid];
9601 if ($matchrule == 1) {
9602 if ($var ==
'mainmenu') {
9604 return (preg_match(
'/^'.$regextext.
'/', $mainmenu));
9605 } elseif ($var ==
'leftmenu') {
9607 return (preg_match(
'/^'.$regextext.
'/', $leftmenu));
9609 return 'This variable is not accessible with dol_eval';
9612 return 'This value for matchrule is not implemented';
9627 if (isset($strToEvaluate) && $strToEvaluate !==
'') {
9630 $rep =
dol_eval($strToEvaluate, 1, 1,
'1');
9631 $rights = $rep && (!is_string($rep) || strpos($rep,
'Bad string syntax to evaluate') ===
false);
9650function dol_eval($s, $returnvalue = 0, $hideerrors = 1, $onlysimplestring =
'1')
9654 global $db, $langs, $user, $website, $websitepage;
9655 global $action, $mainmenu, $leftmenu;
9657 global $objectoffield;
9663 if (!in_array($onlysimplestring, array(
'0',
'1',
'2'))) {
9664 return "Bad call of dol_eval. Parameter onlysimplestring must be '0' (deprecated), '1' or '2'";
9669 if ($onlysimplestring ==
'1') {
9672 $specialcharsallowed =
'^$_+-.*>&|=!?():"\',/@';
9674 $specialcharsallowed .=
getDolGlobalString(
'MAIN_ALLOW_UNSECURED_SPECIAL_CHARS_IN_DOL_EVAL');
9676 if (preg_match(
'/[^a-z0-9\s'.preg_quote($specialcharsallowed,
'/').
']/i', $s)) {
9678 return 'Bad string syntax to evaluate (found chars that are not chars for simplestring): '.$s;
9680 dol_syslog(
'Bad string syntax to evaluate (found chars that are not chars for simplestring): '.$s);
9686 while ($scheck && $savescheck != $scheck) {
9687 $savescheck = $scheck;
9688 $scheck = preg_replace(
'/->[a-zA-Z0-9_]+\(/',
'->__METHOD__', $scheck);
9689 $scheck = preg_replace(
'/^\(/',
'__PARENTHESIS__ ', $scheck);
9690 $scheck = preg_replace(
'/\s\(/',
'__PARENTHESIS__ ', $scheck);
9691 $scheck = preg_replace(
'/^!?[a-zA-Z0-9_]+\(/',
'__FUNCTION__', $scheck);
9692 $scheck = preg_replace(
'/\s!?[a-zA-Z0-9_]+\(/',
'__FUNCTION__', $scheck);
9693 $scheck = preg_replace(
'/(\^|\')\(/',
'__REGEXSTART__', $scheck);
9696 if (strpos($scheck,
'(') !==
false) {
9698 return 'Bad string syntax to evaluate (mode 1, found call of a function or method without using the direct name of the function): '.$s;
9700 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);
9706 } elseif ($onlysimplestring ==
'2') {
9708 $specialcharsallowed =
'^$_+-.*>&|=!?():"\',/@[]';
9710 $specialcharsallowed .=
getDolGlobalString(
'MAIN_ALLOW_UNSECURED_SPECIAL_CHARS_IN_DOL_EVAL');
9712 if (preg_match(
'/[^a-z0-9\s'.preg_quote($specialcharsallowed,
'/').
']/i', $s)) {
9714 return 'Bad string syntax to evaluate (found chars that are not chars for simplestring): '.$s;
9716 dol_syslog(
'Bad string syntax to evaluate (found chars that are not chars for simplestring): '.$s);
9722 while ($scheck && $savescheck != $scheck) {
9723 $savescheck = $scheck;
9724 $scheck = preg_replace(
'/->[a-zA-Z0-9_]+\(/',
'->__METHOD__', $scheck);
9725 $scheck = preg_replace(
'/^\(/',
'__PARENTHESIS__ ', $scheck);
9726 $scheck = preg_replace(
'/\s\(/',
'__PARENTHESIS__ ', $scheck);
9727 $scheck = preg_replace(
'/^!?[a-zA-Z0-9_]+\(/',
'__FUNCTION__', $scheck);
9728 $scheck = preg_replace(
'/\s!?[a-zA-Z0-9_]+\(/',
'__FUNCTION__', $scheck);
9729 $scheck = preg_replace(
'/(\^|\')\(/',
'__REGEXSTART__', $scheck);
9732 if (strpos($scheck,
'(') !==
false) {
9734 return 'Bad string syntax to evaluate (mode 2, found call of a function or method without using the direct name of the function): '.$s;
9736 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);
9743 if (is_array($s) || $s ===
'Array') {
9744 return 'Bad string syntax to evaluate (value is Array) '.var_export($s,
true);
9746 if (strpos($s,
'::') !==
false) {
9748 return 'Bad string syntax to evaluate (double : char is forbidden): '.$s;
9750 dol_syslog(
'Bad string syntax to evaluate (double : char is forbidden): '.$s);
9754 if (strpos($s,
'`') !==
false) {
9756 return 'Bad string syntax to evaluate (backtick char is forbidden): '.$s;
9758 dol_syslog(
'Bad string syntax to evaluate (backtick char is forbidden): '.$s);
9762 if (preg_match(
'/[^0-9]+\.[^0-9]+/', $s)) {
9764 return 'Bad string syntax to evaluate (dot char is forbidden): '.$s;
9766 dol_syslog(
'Bad string syntax to evaluate (dot char is forbidden): '.$s);
9772 $forbiddenphpstrings = array(
'$$');
9773 $forbiddenphpstrings = array_merge($forbiddenphpstrings, array(
'_ENV',
'_SESSION',
'_COOKIE',
'_GET',
'_POST',
'_REQUEST',
'ReflectionFunction'));
9775 $forbiddenphpfunctions = array(
"exec",
"passthru",
"shell_exec",
"system",
"proc_open",
"popen");
9776 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"dol_eval",
"executeCLI",
"verifCond"));
9777 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"base64_decode",
"rawurldecode",
"urldecode",
"str_rot13",
"hex2bin"));
9778 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"fopen",
"file_put_contents",
"fputs",
"fputscsv",
"fwrite",
"fpassthru",
"require",
"include",
"mkdir",
"rmdir",
"symlink",
"touch",
"unlink",
"umask"));
9779 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"get_defined_functions",
"get_defined_vars",
"get_defined_constants",
"get_declared_classes"));
9780 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"function",
"call_user_func"));
9781 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"require",
"include",
"require_once",
"include_once"));
9782 $forbiddenphpfunctions = array_merge($forbiddenphpfunctions, array(
"eval",
"create_function",
"assert",
"mb_ereg_replace"));
9784 $forbiddenphpmethods = array(
'invoke',
'invokeArgs');
9786 $forbiddenphpregex =
'global\s+\$|\b('.implode(
'|', $forbiddenphpfunctions).
')\b';
9788 $forbiddenphpmethodsregex =
'->('.implode(
'|', $forbiddenphpmethods).
')';
9791 $oldstringtoclean = $s;
9792 $s = str_ireplace($forbiddenphpstrings,
'__forbiddenstring__', $s);
9793 $s = preg_replace(
'/'.$forbiddenphpregex.
'/i',
'__forbiddenstring__', $s);
9794 $s = preg_replace(
'/'.$forbiddenphpmethodsregex.
'/i',
'__forbiddenstring__', $s);
9796 }
while ($oldstringtoclean != $s);
9798 if (strpos($s,
'__forbiddenstring__') !==
false) {
9799 dol_syslog(
'Bad string syntax to evaluate: '.$s, LOG_WARNING);
9801 return 'Bad string syntax to evaluate: '.$s;
9803 dol_syslog(
'Bad string syntax to evaluate: '.$s);
9811 return @eval(
'return '.$s.
';');
9813 return eval(
'return '.$s.
';');
9822 }
catch (Error $e) {
9823 $error =
'dol_eval try/catch error : ';
9824 $error .= $e->getMessage();
9838 return (trim($element) !=
'');
9851 if (empty($codelang)) {
9855 if ($codelang ==
'auto') {
9856 return '<span class="fa fa-language"></span>';
9859 $langtocountryflag = array(
9861 'ca_ES' =>
'catalonia',
9865 'sw_SW' =>
'unknown',
9875 if (isset($langtocountryflag[$codelang])) {
9876 $flagImage = $langtocountryflag[$codelang];
9878 $tmparray = explode(
'_', $codelang);
9879 $flagImage = empty($tmparray[1]) ? $tmparray[0] : $tmparray[1];
9884 if (preg_match(
'/class="([^"]+)"/', $moreatt, $reg)) {
9890 return '<span class="flag-sprite '.strtolower($flagImage).($morecss ?
' '.$morecss :
'').
'"'.($moreatt ?
' '.$moreatt :
'').(!$notitlealt ?
' title="'.$codelang.
'"' :
'').
'></span>';
9904 if (empty($countrycode)) {
9908 if (strtoupper($countrycode) ==
'MQ') {
9911 if (strtoupper($countrycode) ==
'SE') {
9914 if (strtoupper($countrycode) ==
'CH') {
9915 if ($mysoc->country_code ==
'FR') {
9918 if ($mysoc->country_code ==
'DE') {
9921 if ($mysoc->country_code ==
'IT') {
10103 $buildprimarykeytotest = strtolower($countrycode).
'-'.strtoupper($countrycode);
10104 if (in_array($buildprimarykeytotest, $locales)) {
10105 return strtolower($countrycode).
'_'.strtoupper($countrycode);
10108 if (function_exists(
'locale_get_primary_language') && function_exists(
'locale_get_region')) {
10109 foreach ($locales as $locale) {
10110 $locale_language = locale_get_primary_language($locale);
10111 $locale_region = locale_get_region($locale);
10112 if (strtoupper($countrycode) == $locale_region) {
10114 return strtolower($locale_language).
'_'.strtoupper($locale_region);
10118 dol_syslog(
"Warning Exention php-intl is not available", LOG_WARNING);
10156 global $hookmanager, $db;
10158 if (isset($conf->modules_parts[
'tabs'][$type]) && is_array($conf->modules_parts[
'tabs'][$type])) {
10159 foreach ($conf->modules_parts[
'tabs'][$type] as $value) {
10160 $values = explode(
':', $value);
10163 if ($mode ==
'add' && !preg_match(
'/^\-/', $values[1])) {
10168 $posstart = strpos($str,
'(');
10169 if ($posstart > 0) {
10170 $posend = strpos($str,
')');
10171 if ($posstart > 0) {
10172 $res1 = substr($str, $posstart + 1, $posend - $posstart -1);
10173 if (is_numeric($res1)) {
10174 $postab = (int) $res1;
10175 $values[1] =
'+' . substr($str, $posend + 1);
10179 if (count($values) == 6) {
10183 if ($values[0] != $type) {
10189 if ($filterorigmodule) {
10190 if (strpos($values[3],
'@')) {
10191 if ($filterorigmodule !=
'external') {
10195 if ($filterorigmodule !=
'core') {
10200 $langs->load($values[3]);
10202 if (preg_match(
'/SUBSTITUTION_([^_]+)/i', $values[2], $reg)) {
10204 $substitutionarray = array();
10209 $labeltemp = explode(
',', $values[2]);
10210 $label = $langs->trans($labeltemp[0]);
10212 if (!empty($labeltemp[1]) && is_object($object) && !empty($object->id)) {
10214 $classtoload = $labeltemp[1];
10215 if (class_exists($classtoload)) {
10216 $obj =
new $classtoload($db);
10217 $function = $labeltemp[3];
10218 if ($obj && $function && method_exists($obj, $function)) {
10219 $nbrec = $obj->$function($object->id, $obj);
10220 if (!empty($nbrec)) {
10221 $label .=
'<span class="badge marginleftonlyshort">'.$nbrec.
'</span>';
10228 $newtab[0] =
dol_buildpath(preg_replace(
'/__ID__/i', ((is_object($object) && !empty($object->id)) ? $object->id :
''), $values[5]), 1);
10229 $newtab[1] = $label;
10230 $newtab[2] = str_replace(
'+',
'', $values[1]);
10235 } elseif (count($values) == 5) {
10236 dol_syslog(
'Passing 5 values in tabs module_parts is deprecated. Please update to 6 with permissions.', LOG_WARNING);
10238 if ($values[0] != $type) {
10242 if ($filterorigmodule) {
10243 if (strpos($values[3],
'@')) {
10244 if ($filterorigmodule !=
'external') {
10248 if ($filterorigmodule !=
'core') {
10253 $langs->load($values[3]);
10255 if (preg_match(
'/SUBSTITUTION_([^_]+)/i', $values[2], $reg)) {
10256 $substitutionarray = array();
10260 $label = $langs->trans($values[2]);
10263 $newtab[0] =
dol_buildpath(preg_replace(
'/__ID__/i', ((is_object($object) && !empty($object->id)) ? $object->id :
''), $values[4]), 1);
10264 $newtab[1] = $label;
10265 $newtab[2] = str_replace(
'+',
'', $values[1]);
10269 $head = array_merge(array_slice($head, 0, $postab), array($newtab), array_slice($head, $postab));
10270 } elseif ($mode ==
'remove' && preg_match(
'/^\-/', $values[1])) {
10271 if ($values[0] != $type) {
10274 $tabname = str_replace(
'-',
'', $values[1]);
10275 foreach ($head as $key => $val) {
10276 $condition = (!empty($values[3]) ?
verifCond($values[3]) : 1);
10278 if ($head[$key][2] == $tabname && $condition) {
10279 unset($head[$key]);
10288 if (!empty($hookmanager)) {
10289 $parameters = array(
'object' => $object,
'mode' => $mode,
'head' => &$head,
'filterorigmodule' => $filterorigmodule);
10290 $reshook = $hookmanager->executeHooks(
'completeTabsHead', $parameters, $object);
10291 if ($reshook > 0) {
10292 $head = $hookmanager->resArray;
10294 $head = array_merge($head, $hookmanager->resArray);
10313 global $conf, $hookmanager, $user, $debugbar;
10315 global $micro_start_time;
10317 if ($zone ==
'private') {
10318 print
"\n".
'<!-- Common footer for private page -->'.
"\n";
10320 print
"\n".
'<!-- Common footer for public page -->'.
"\n";
10324 print
"\n<!-- A div to store page_y POST parameter -->\n";
10325 print
'<div id="page_y" style="display: none;">'.(GETPOST(
'page_y') ?
GETPOST(
'page_y') :
'').
'</div>'.
"\n";
10327 $parameters = array();
10328 $reshook = $hookmanager->executeHooks(
'printCommonFooter', $parameters);
10329 if (empty($reshook)) {
10335 if (!empty($conf->use_javascript_ajax)) {
10336 print
"\n<!-- A script section to add menuhider handler on backoffice, manage focus and madatory fields, tuning info, ... -->\n";
10337 print
'<script>'.
"\n";
10338 print
'jQuery(document).ready(function() {'.
"\n";
10340 if ($zone ==
'private' && empty($conf->dol_use_jmobile)) {
10342 print
'/* JS CODE TO ENABLE to manage handler to switch left menu page (menuhider) */'.
"\n";
10343 print
'jQuery("li.menuhider").click(function(event) {';
10344 print
' if (!$( "body" ).hasClass( "sidebar-collapse" )){ event.preventDefault(); }'.
"\n";
10345 print
' console.log("We click on .menuhider");'.
"\n";
10346 print
' $("body").toggleClass("sidebar-collapse")'.
"\n";
10351 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"])))) {
10352 print
'/* JS CODE TO ENABLE to manage focus and mandatory form fields */'.
"\n";
10353 $relativepathstring = $_SERVER[
"PHP_SELF"];
10355 if (constant(
'DOL_URL_ROOT')) {
10356 $relativepathstring = preg_replace(
'/^'.preg_quote(constant(
'DOL_URL_ROOT'),
'/').
'/',
'', $relativepathstring);
10358 $relativepathstring = preg_replace(
'/^\//',
'', $relativepathstring);
10359 $relativepathstring = preg_replace(
'/^custom\//',
'', $relativepathstring);
10361 if (!empty($user->default_values[$relativepathstring][
'focus'])) {
10362 foreach ($user->default_values[$relativepathstring][
'focus'] as $defkey => $defval) {
10364 if ($defkey !=
'_noquery_') {
10365 $tmpqueryarraytohave = explode(
'&', $defkey);
10367 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
10368 $tmpquerytohaveparam = explode(
'=', $tmpquerytohave);
10370 if (!GETPOSTISSET($tmpquerytohaveparam[0]) || ($tmpquerytohaveparam[1] !=
GETPOST($tmpquerytohaveparam[0]))) {
10374 if (!$foundintru) {
10383 foreach ($defval as $paramkey => $paramval) {
10385 print
'jQuery("input[name=\''.$paramkey.
'\']
").focus();'."\n
";
10386 print 'jQuery("textarea[
name=\
''.$paramkey.
'\']
").focus();'."\n
";
10387 print 'jQuery("select[
name=\
''.$paramkey.
'\']
").focus();'."\n
"; // Not really usefull, but we keep it in case of.
10392 if (!empty($user->default_values[$relativepathstring]['mandatory'])) {
10393 foreach ($user->default_values[$relativepathstring]['mandatory'] as $defkey => $defval) {
10395 if ($defkey != '_noquery_') {
10396 $tmpqueryarraytohave = explode('&', $defkey);
10398 foreach ($tmpqueryarraytohave as $tmpquerytohave) {
10399 $tmpquerytohaveparam = explode('=', $tmpquerytohave);
10400 //print "console.log(
'".$tmpquerytohaveparam[0]." ".$tmpquerytohaveparam[1]." ".GETPOST($tmpquerytohaveparam[0])."');
";
10401 if (!GETPOSTISSET($tmpquerytohaveparam[0]) || ($tmpquerytohaveparam[1] != GETPOST($tmpquerytohaveparam[0]))) {
10405 if (!$foundintru) {
10408 //var_dump($defkey.'-'.$qualified);
10414 foreach ($defval as $paramkey => $paramval) {
10415 // Add property 'required' on input
10416 print 'jQuery("input[
name=\
''.$paramkey.
'\']
").prop(\'required\',true);'."\n
";
10417 print 'jQuery("textarea[
name=\
''.$paramkey.
'\']
").prop(\'required\',true);'."\n
";
10418 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
";
10419 print 'jQuery("select[
name=\
''.$paramkey.
'\']
").prop(\'required\',true);'."\n
";
10420 print 'jQuery("select[
name=\
''.$paramkey.
'\'] option[value=\
'-1\']").prop(\'value\', \'\');'.
"\n";
10421 print
'jQuery("select[name=\''.$paramkey.
'\'] option[value=\
'0\']").prop(\'value\', \'\');'.
"\n";
10424 print
'jQuery(":input[name=\'' . $paramkey .
'\']
").closest("tr
").find("td:first
").addClass("fieldrequired
");' . "\n
";
10426 // If we submit the cancel button we remove the required attributes
10427 print 'jQuery("input[
name=\
'cancel\']").click(function() {
10428 console.log("We click on cancel button so removed all required attribute");
10429 jQuery("input, textarea, select").each(function(){this.removeAttribute(\'required\');});
10439 if (!empty($_SERVER[
'MAIN_SHOW_TUNING_INFO']) ||
getDolGlobalString(
'MAIN_SHOW_TUNING_INFO')) {
10441 print
"/* JS CODE TO ENABLE to add memory info */\n";
10442 print
'window.console && console.log("';
10446 print
'MAIN_OPTIMIZE_SPEED='.(isset($conf->global->MAIN_OPTIMIZE_SPEED) ? $conf->global->MAIN_OPTIMIZE_SPEED :
'off');
10447 if (!empty($micro_start_time)) {
10448 $micro_end_time = microtime(
true);
10449 print
' - Build time: '.ceil(1000 * ($micro_end_time - $micro_start_time)).
' ms';
10452 if (function_exists(
"memory_get_usage")) {
10453 print
' - Mem: '.memory_get_usage();
10455 if (function_exists(
"memory_get_peak_usage")) {
10456 print
' - Real mem peak: '.memory_get_peak_usage(
true);
10458 if (function_exists(
"zend_loader_file_encoded")) {
10459 print
' - Zend encoded file: '.(zend_loader_file_encoded() ?
'yes' :
'no');
10464 print
"\n".
'</script>'.
"\n";
10470 foreach ($tmptagarray as $tmptag) {
10472 print
"<!-- JS CODE TO ENABLE for google analtics tag -->\n";
10474 <!-- Global site tag (gtag.js) - Google Analytics -->
10475 <script nonce="'.getNonce().
'" async src="https://www.googletagmanager.com/gtag/js?id='.trim($tmptag).
'"></script>
10477 window.dataLayer = window.dataLayer || [];
10478 function gtag(){dataLayer.push(arguments);}
10479 gtag(\'js\', new Date());
10481 gtag(\'config\', \''.trim($tmptag).
'\');
10488 // Add Xdebug coverage of code
10489 if (defined('XDEBUGCOVERAGE
')) {
10490 print_r(xdebug_get_code_coverage());
10493 // Add DebugBar data
10494 if ($user->hasRight('debugbar
', 'read
') && is_object($debugbar)) {
10495 $debugbar['time
']->stopMeasure('pageaftermaster
');
10496 print '<!-- Output debugbar data -->
'."\n";
10497 $renderer = $debugbar->getRenderer();
10498 print $debugbar->getRenderer()->render();
10499 } elseif (count($conf->logbuffer)) { // If there is some logs in buffer to show
10501 print "<!-- Start of log output\n";
10502 //print '<div
class=
"hidden">
'."\n";
10503 foreach ($conf->logbuffer as $logline) {
10504 print $logline."<br>\n";
10506 //print '</div>
'."\n";
10507 print "End of log output -->\n";
10521function dolExplodeIntoArray($string, $delimiter = ';
', $kv = '=
')
10523 if (is_null($string)) {
10527 if (preg_match('/^\[.*\]$/sm
', $delimiter) || preg_match('/^\(.*\)$/sm
', $delimiter)) {
10528 // This is a regex string
10529 $newdelimiter = $delimiter;
10531 // This is a simple string
10532 $newdelimiter = preg_quote($delimiter, '/
');
10535 if ($a = preg_split('/
'.$newdelimiter.'/
', $string)) {
10537 foreach ($a as $s) { // each part
10539 if ($pos = strpos($s, $kv)) { // key/value delimiter
10540 $ka[trim(substr($s, 0, $pos))] = trim(substr($s, $pos + strlen($kv)));
10541 } else { // key delimiter not found
10559function dol_set_focus($selector)
10561 print "\n".'<!-- Set focus onto a specific field -->
'."\n";
10562 print '<script nonce=
"'.getNonce().'">jQuery(document).ready(
function() { jQuery(
"'.dol_escape_js($selector).'").focus(); });</script>
'."\n";
10573function dol_getmypid()
10575 if (!function_exists('getmypid
')) {
10576 return mt_rand(99900000, 99965535);
10578 return getmypid(); // May be a number on 64 bits (depending on OS)
10600function natural_search($fields, $value, $mode = 0, $nofirstand = 0)
10602 global $db, $langs;
10604 $value = trim($value);
10607 $value = preg_replace('/\*/
', '%
', $value); // Replace * with %
10610 $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
10613 $value = preg_replace('/\s*\|\s*/
', '|
', $value);
10615 $crits = explode(' ', $value);
10617 if (!is_array($fields)) {
10618 $fields = array($fields);
10621 $i1 = 0; // count the nb of and criteria added (all fields / criterias)
10622 foreach ($crits as $crit) { // Loop on each AND criteria
10623 $crit = trim($crit);
10624 $i2 = 0; // count the nb of valid criteria added for this this first criteria
10626 foreach ($fields as $field) {
10628 $tmpcrits = explode('|
', $crit);
10629 $i3 = 0; // count the nb of valid criteria added for this current field
10630 foreach ($tmpcrits as $tmpcrit) {
10631 if ($tmpcrit !== '0
' && empty($tmpcrit)) {
10634 $tmpcrit = trim($tmpcrit);
10636 $newres .= (($i2 > 0 || $i3 > 0) ? ' OR
' : '');
10639 $newcrit = preg_replace('/([!<>=]+)/
', '', $tmpcrit);
10642 preg_match('/([!<>=]+)/
', $tmpcrit, $reg);
10643 if (!empty($reg[1])) {
10644 $operator = $reg[1];
10646 if ($newcrit != '') {
10647 $numnewcrit = price2num($newcrit);
10648 if (is_numeric($numnewcrit)) {
10649 $newres .= $field.' '.$operator.' '.((float) $numnewcrit); // should be a numeric
10651 $newres .= '1 = 2
'; // force false, we received a corrupted data
10653 $i3++; // a criteria was added to string
10656 $i2++; // a criteria for 1 more field was added to string
10657 } elseif ($mode == 2 || $mode == -2) {
10658 $crit = preg_replace('/[^0-9,]/
', '', $crit); // ID are always integer
10659 $newres .= ($i2 > 0 ? ' OR
' : '').$field." ".($mode == -2 ? 'NOT
' : '');
10660 $newres .= $crit ? "IN (".$db->sanitize($db->escape($crit)).")" : "IN (0)";
10662 $newres .= ' OR
'.$field.' IS NULL
';
10664 $i2++; // a criteria for 1 more field was added to string
10665 } elseif ($mode == 3 || $mode == -3) {
10666 $tmparray = explode(',
', $crit);
10667 if (count($tmparray)) {
10669 foreach ($tmparray as $val) {
10672 $listofcodes .= ($listofcodes ? ',
' : '');
10673 $listofcodes .= "'".$db->escape($val)."'";
10676 $newres .= ($i2 > 0 ? ' OR
' : '').$field." ".($mode == -3 ? 'NOT
' : '')."IN (".$db->sanitize($listofcodes, 1).")";
10677 $i2++; // a criteria for 1 more field was added to string
10680 $newres .= ' OR
'.$field.' IS NULL
';
10682 } elseif ($mode == 4) {
10683 $tmparray = explode(',
', $crit);
10684 if (count($tmparray)) {
10686 foreach ($tmparray as $val) {
10689 $newres .= ($i2 > 0 ? " OR (" : "(").$field." LIKE '".$db->escape($val).",%
'";
10690 $newres .= ' OR
'.$field." = '".$db->escape($val)."'";
10691 $newres .= ' OR
'.$field." LIKE '%,
".$db->escape($val)."'";
10692 $newres .= ' OR
'.$field." LIKE '%,
".$db->escape($val).",%
'";
10694 $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)
10698 } else { // $mode=0
10699 $tmpcrits = explode('|
', $crit);
10700 $i3 = 0; // count the nb of valid criteria added for the current couple criteria/field
10701 foreach ($tmpcrits as $tmpcrit) { // loop on each OR criteria
10702 if ($tmpcrit !== '0
' && empty($tmpcrit)) {
10705 $tmpcrit = trim($tmpcrit);
10707 if ($tmpcrit == '^$
' || strpos($crit, '!
') === 0) { // If we search empty, we must combined different OR fields with AND
10708 $newres .= (($i2 > 0 || $i3 > 0) ? ' AND
' : '');
10710 $newres .= (($i2 > 0 || $i3 > 0) ? ' OR
' : '');
10713 if (preg_match('/\.(
id|
rowid)$/
', $field)) { // Special case for rowid that is sometimes a ref so used as a search field
10714 $newres .= $field." = ".(is_numeric($tmpcrit) ? ((float) $tmpcrit) : '0
');
10716 $tmpcrit2 = $tmpcrit;
10721 if (preg_match('/^!/
', $tmpcrit)) {
10722 $tmps .= $field." NOT LIKE "; // ! as exclude character
10723 $tmpcrit2 = preg_replace('/^!/
', '', $tmpcrit2);
10725 $tmps .= $field." LIKE ";
10729 if (preg_match('/^[\^\$]/', $tmpcrit)) {
10731 $tmpcrit2 = preg_replace('/^[\^\$]/', '', $tmpcrit2);
10733 if (preg_match('/[\^\$]$/', $tmpcrit)) {
10735 $tmpcrit2 = preg_replace('/[\^\$]$/', '', $tmpcrit2);
10738 if ($tmpcrit2 == '' || preg_match('/^!/', $tmpcrit)) {
10742 $newres .= $tmpbefore;
10743 $newres .= $db->escape($tmpcrit2);
10744 $newres .= $tmpafter;
10746 if ($tmpcrit2 == '' || preg_match('/^!/
', $tmpcrit)) {
10747 $newres .= " OR ".$field." IS NULL)";
10754 $i2++; // a criteria for 1 more field was added to string
10759 $res = $res.($res ? ' AND
' : '').($i2 > 1 ? '(
' : '').$newres.($i2 > 1 ? ')
' : '');
10763 $res = ($nofirstand ? "" : " AND ")."(".$res.")";
10774function showDirectDownloadLink($object)
10776 global $conf, $langs;
10779 $url = $object->getLastMainDocLink($object->element);
10781 $out .= img_picto($langs->trans("PublicDownloadLinkDesc"), 'globe
').' <span
class=
"opacitymedium">
'.$langs->trans("DirectDownloadLink").'</span><br>
';
10783 $out .= '<div
class=
"urllink"><input
type=
"text" id=
"directdownloadlink" class=
"quatrevingtpercent" value=
"'.$url.'"></div>
';
10784 $out .= ajax_autoselect("directdownloadlink", 0);
10786 $out .= '<div
class=
"urllink">
'.$langs->trans("FileNotShared").'</div>
';
10800function getImageFileNameForSize($file, $extName, $extImgTarget = '
')
10802 $dirName = dirname($file);
10803 if ($dirName == '.
') {
10807 $fileName = preg_replace('/(\.gif|\.jpeg|\.jpg|\.png|\.bmp|\.webp)$/i
', '', $file); // We remove extension, whatever is its case
10808 $fileName = basename($fileName);
10810 if (empty($extImgTarget)) {
10811 $extImgTarget = (preg_match('/\.jpg$/i
', $file) ? '.jpg
' : '');
10813 if (empty($extImgTarget)) {
10814 $extImgTarget = (preg_match('/\.jpeg$/i
', $file) ? '.jpeg
' : '');
10816 if (empty($extImgTarget)) {
10817 $extImgTarget = (preg_match('/\.gif$/i
', $file) ? '.gif
' : '');
10819 if (empty($extImgTarget)) {
10820 $extImgTarget = (preg_match('/\.png$/i
', $file) ? '.png
' : '');
10822 if (empty($extImgTarget)) {
10823 $extImgTarget = (preg_match('/\.bmp$/i
', $file) ? '.bmp
' : '');
10825 if (empty($extImgTarget)) {
10826 $extImgTarget = (preg_match('/\.webp$/i
', $file) ? '.webp
' : '');
10829 if (!$extImgTarget) {
10835 $subdir = 'thumbs/
';
10838 return ($dirName ? $dirName.'/
' : '').$subdir.$fileName.$extName.$extImgTarget; // New filename for thumb
10851function getAdvancedPreviewUrl($modulepart, $relativepath, $alldata = 0, $param = '
')
10853 global $conf, $langs;
10855 if (empty($conf->use_javascript_ajax)) {
10859 $isAllowedForPreview = dolIsAllowedForPreview($relativepath);
10861 if ($alldata == 1) {
10862 if ($isAllowedForPreview) {
10863 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));
10869 // old behavior, return a string
10870 if ($isAllowedForPreview) {
10871 $tmpurl = DOL_URL_ROOT.'/document.php?modulepart=
'.urlencode($modulepart).'&attachment=0&file=
'.urlencode($relativepath).($param ? '&
'.$param : '');
10872 $title = $langs->trans("Preview");
10873 //$title = '%27-alert(document.domain)-%27
';
10874 //$tmpurl = 'file=
'.urlencode("'-alert(document.domain)-
'_small.jpg");
10876 // 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.
10893function ajax_autoselect($htmlname, $addlink = '
', $textonlink = 'Link')
10896 $out = '<script nonce=
"'.getNonce().'">
10897 jQuery(document).ready(
function () {
10898 jQuery(
"'.((strpos($htmlname, '.') === 0 ? '' : '#').$htmlname).'").click(
function() { jQuery(
this).select(); } );
10902 if ($textonlink === 'image
') {
10903 $out .= ' <a href=
"'.$addlink.'" target=
"_blank" rel=
"noopener noreferrer">
'.img_picto('', 'globe
').'</a>
';
10905 $out .= ' <a href=
"'.$addlink.'" target=
"_blank" rel=
"noopener noreferrer">
'.$langs->trans("Link").'</a>
';
10918function dolIsAllowedForPreview($file)
10922 // Check .noexe extension in filename
10923 if (preg_match('/\.noexe$/i
', $file)) {
10927 // Check mime types
10928 $mime_preview = array('bmp
', 'jpeg
', 'png
', 'gif
', 'tiff
', 'pdf
', 'plain
', 'css
', 'webp
');
10929 if (getDolGlobalString('MAIN_ALLOW_SVG_FILES_AS_IMAGES
')) {
10930 $mime_preview[] = 'svg+xml
';
10932 //$mime_preview[]='vnd.oasis.opendocument.presentation
';
10933 //$mime_preview[]='archive
';
10934 $num_mime = array_search(dol_mimetype($file, '', 1), $mime_preview);
10935 if ($num_mime !== false) {
10939 // By default, not allowed for preview
10953function dol_mimetype($file, $default = 'application/octet-stream
', $mode = 0)
10956 $imgmime = 'other.png
';
10957 $famime = 'file-o
';
10960 $tmpfile = preg_replace('/\.noexe$/
', '', $file);
10962 // Plain text files
10963 if (preg_match('/\.txt$/i
', $tmpfile)) {
10964 $mime = 'text/plain
';
10965 $imgmime = 'text.png
';
10966 $famime = 'file-alt
';
10967 } elseif (preg_match('/\.rtx$/i
', $tmpfile)) {
10968 $mime = 'text/richtext
';
10969 $imgmime = 'text.png
';
10970 $famime = 'file-alt
';
10971 } elseif (preg_match('/\.csv$/i
', $tmpfile)) {
10972 $mime = 'text/csv
';
10973 $imgmime = 'text.png
';
10974 $famime = 'file-csv
';
10975 } elseif (preg_match('/\.tsv$/i
', $tmpfile)) {
10976 $mime = 'text/tab-separated-values
';
10977 $imgmime = 'text.png
';
10978 $famime = 'file-alt
';
10979 } elseif (preg_match('/\.(cf|
conf|log)$/i
', $tmpfile)) {
10980 $mime = 'text/plain
';
10981 $imgmime = 'text.png
';
10982 $famime = 'file-alt
';
10983 } elseif (preg_match('/\.ini$/i
', $tmpfile)) {
10984 $mime = 'text/plain
';
10985 $imgmime = 'text.png
';
10987 $famime = 'file-alt
';
10988 } elseif (preg_match('/\.md$/i
', $tmpfile)) {
10989 $mime = 'text/plain
';
10990 $imgmime = 'text.png
';
10992 $famime = 'file-alt
';
10993 } elseif (preg_match('/\.css$/i
', $tmpfile)) {
10994 $mime = 'text/css
';
10995 $imgmime = 'css.png
';
10997 $famime = 'file-alt
';
10998 } elseif (preg_match('/\.lang$/i
', $tmpfile)) {
10999 $mime = 'text/plain
';
11000 $imgmime = 'text.png
';
11002 $famime = 'file-alt
';
11003 } elseif (preg_match('/\.(crt|cer|key|pub)$/i
', $tmpfile)) { // Certificate files
11004 $mime = 'text/plain
';
11005 $imgmime = 'text.png
';
11006 $famime = 'file-alt
';
11007 } elseif (preg_match('/\.(html|htm|shtml)$/i
', $tmpfile)) { // XML based (HTML/XML/XAML)
11008 $mime = 'text/html
';
11009 $imgmime = 'html.png
';
11011 $famime = 'file-alt
';
11012 } elseif (preg_match('/\.(xml|xhtml)$/i
', $tmpfile)) {
11013 $mime = 'text/xml
';
11014 $imgmime = 'other.png
';
11016 $famime = 'file-alt
';
11017 } elseif (preg_match('/\.xaml$/i
', $tmpfile)) {
11018 $mime = 'text/xml
';
11019 $imgmime = 'other.png
';
11021 $famime = 'file-alt
';
11022 } elseif (preg_match('/\.bas$/i
', $tmpfile)) { // Languages
11023 $mime = 'text/plain
';
11024 $imgmime = 'text.png
';
11026 $famime = 'file-code
';
11027 } elseif (preg_match('/\.(c)$/i
', $tmpfile)) {
11028 $mime = 'text/plain
';
11029 $imgmime = 'text.png
';
11031 $famime = 'file-code
';
11032 } elseif (preg_match('/\.(cpp)$/i
', $tmpfile)) {
11033 $mime = 'text/plain
';
11034 $imgmime = 'text.png
';
11036 $famime = 'file-code
';
11037 } elseif (preg_match('/\.cs$/i
', $tmpfile)) {
11038 $mime = 'text/plain
';
11039 $imgmime = 'text.png
';
11041 $famime = 'file-code
';
11042 } elseif (preg_match('/\.(h)$/i
', $tmpfile)) {
11043 $mime = 'text/plain
';
11044 $imgmime = 'text.png
';
11046 $famime = 'file-code
';
11047 } elseif (preg_match('/\.(java|jsp)$/i
', $tmpfile)) {
11048 $mime = 'text/plain
';
11049 $imgmime = 'text.png
';
11051 $famime = 'file-code
';
11052 } elseif (preg_match('/\.php([0-9]{1})?$/i
', $tmpfile)) {
11053 $mime = 'text/plain
';
11054 $imgmime = 'php.png
';
11056 $famime = 'file-code
';
11057 } elseif (preg_match('/\.phtml$/i
', $tmpfile)) {
11058 $mime = 'text/plain
';
11059 $imgmime = 'php.png
';
11061 $famime = 'file-code
';
11062 } elseif (preg_match('/\.(pl|pm)$/i
', $tmpfile)) {
11063 $mime = 'text/plain
';
11064 $imgmime = 'pl.png
';
11066 $famime = 'file-code
';
11067 } elseif (preg_match('/\.sql$/i
', $tmpfile)) {
11068 $mime = 'text/plain
';
11069 $imgmime = 'text.png
';
11071 $famime = 'file-code
';
11072 } elseif (preg_match('/\.js$/i
', $tmpfile)) {
11073 $mime = 'text/x-javascript
';
11074 $imgmime = 'jscript.png
';
11076 $famime = 'file-code
';
11077 } elseif (preg_match('/\.odp$/i
', $tmpfile)) { // Open office
11078 $mime = 'application/vnd.oasis.opendocument.presentation
';
11079 $imgmime = 'ooffice.png
';
11080 $famime = 'file-powerpoint
';
11081 } elseif (preg_match('/\.ods$/i
', $tmpfile)) {
11082 $mime = 'application/vnd.oasis.opendocument.spreadsheet
';
11083 $imgmime = 'ooffice.png
';
11084 $famime = 'file-excel
';
11085 } elseif (preg_match('/\.odt$/i
', $tmpfile)) {
11086 $mime = 'application/vnd.oasis.opendocument.text
';
11087 $imgmime = 'ooffice.png
';
11088 $famime = 'file-word
';
11089 } elseif (preg_match('/\.mdb$/i
', $tmpfile)) { // MS Office
11090 $mime = 'application/msaccess
';
11091 $imgmime = 'mdb.png
';
11093 } elseif (preg_match('/\.doc[xm]?$/i
', $tmpfile)) {
11094 $mime = 'application/msword
';
11095 $imgmime = 'doc.png
';
11096 $famime = 'file-word
';
11097 } elseif (preg_match('/\.dot[xm]?$/i
', $tmpfile)) {
11098 $mime = 'application/msword
';
11099 $imgmime = 'doc.png
';
11100 $famime = 'file-word
';
11101 } elseif (preg_match('/\.xlt(x)?$/i
', $tmpfile)) {
11102 $mime = 'application/vnd.ms-excel
';
11103 $imgmime = 'xls.png
';
11104 $famime = 'file-excel
';
11105 } elseif (preg_match('/\.xla(m)?$/i
', $tmpfile)) {
11106 $mime = 'application/vnd.ms-excel
';
11107 $imgmime = 'xls.png
';
11108 $famime = 'file-excel
';
11109 } elseif (preg_match('/\.xls$/i
', $tmpfile)) {
11110 $mime = 'application/vnd.ms-excel
';
11111 $imgmime = 'xls.png
';
11112 $famime = 'file-excel
';
11113 } elseif (preg_match('/\.xls[bmx]$/i
', $tmpfile)) {
11114 $mime = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
';
11115 $imgmime = 'xls.png
';
11116 $famime = 'file-excel
';
11117 } elseif (preg_match('/\.pps[mx]?$/i
', $tmpfile)) {
11118 $mime = 'application/vnd.ms-powerpoint
';
11119 $imgmime = 'ppt.png
';
11120 $famime = 'file-powerpoint
';
11121 } elseif (preg_match('/\.ppt[mx]?$/i
', $tmpfile)) {
11122 $mime = 'application/x-mspowerpoint
';
11123 $imgmime = 'ppt.png
';
11124 $famime = 'file-powerpoint
';
11125 } elseif (preg_match('/\.pdf$/i
', $tmpfile)) { // Other
11126 $mime = 'application/pdf
';
11127 $imgmime = 'pdf.png
';
11128 $famime = 'file-pdf
';
11129 } elseif (preg_match('/\.bat$/i
', $tmpfile)) { // Scripts
11130 $mime = 'text/x-bat
';
11131 $imgmime = 'script.png
';
11133 $famime = 'file-code
';
11134 } elseif (preg_match('/\.sh$/i
', $tmpfile)) {
11135 $mime = 'text/x-sh
';
11136 $imgmime = 'script.png
';
11138 $famime = 'file-code
';
11139 } elseif (preg_match('/\.ksh$/i
', $tmpfile)) {
11140 $mime = 'text/x-ksh
';
11141 $imgmime = 'script.png
';
11143 $famime = 'file-code
';
11144 } elseif (preg_match('/\.bash$/i
', $tmpfile)) {
11145 $mime = 'text/x-bash
';
11146 $imgmime = 'script.png
';
11148 $famime = 'file-code
';
11149 } elseif (preg_match('/\.ico$/i
', $tmpfile)) { // Images
11150 $mime = 'image/x-icon
';
11151 $imgmime = 'image.png
';
11152 $famime = 'file-image
';
11153 } elseif (preg_match('/\.(jpg|jpeg)$/i
', $tmpfile)) {
11154 $mime = 'image/jpeg
';
11155 $imgmime = 'image.png
';
11156 $famime = 'file-image
';
11157 } elseif (preg_match('/\.png$/i
', $tmpfile)) {
11158 $mime = 'image/png
';
11159 $imgmime = 'image.png
';
11160 $famime = 'file-image
';
11161 } elseif (preg_match('/\.gif$/i
', $tmpfile)) {
11162 $mime = 'image/gif
';
11163 $imgmime = 'image.png
';
11164 $famime = 'file-image
';
11165 } elseif (preg_match('/\.bmp$/i
', $tmpfile)) {
11166 $mime = 'image/bmp
';
11167 $imgmime = 'image.png
';
11168 $famime = 'file-image
';
11169 } elseif (preg_match('/\.(tif|tiff)$/i
', $tmpfile)) {
11170 $mime = 'image/tiff
';
11171 $imgmime = 'image.png
';
11172 $famime = 'file-image
';
11173 } elseif (preg_match('/\.svg$/i
', $tmpfile)) {
11174 $mime = 'image/svg+xml
';
11175 $imgmime = 'image.png
';
11176 $famime = 'file-image
';
11177 } elseif (preg_match('/\.webp$/i
', $tmpfile)) {
11178 $mime = 'image/webp
';
11179 $imgmime = 'image.png
';
11180 $famime = 'file-image
';
11181 } elseif (preg_match('/\.vcs$/i
', $tmpfile)) { // Calendar
11182 $mime = 'text/calendar
';
11183 $imgmime = 'other.png
';
11184 $famime = 'file-alt
';
11185 } elseif (preg_match('/\.ics$/i
', $tmpfile)) {
11186 $mime = 'text/calendar
';
11187 $imgmime = 'other.png
';
11188 $famime = 'file-alt
';
11189 } elseif (preg_match('/\.torrent$/i
', $tmpfile)) { // Other
11190 $mime = 'application/x-bittorrent
';
11191 $imgmime = 'other.png
';
11192 $famime = 'file-o
';
11193 } elseif (preg_match('/\.(mp3|ogg|au|wav|wma|mid)$/i
', $tmpfile)) { // Audio
11195 $imgmime = 'audio.png
';
11196 $famime = 'file-audio
';
11197 } elseif (preg_match('/\.mp4$/i
', $tmpfile)) { // Video
11198 $mime = 'video/mp4
';
11199 $imgmime = 'video.png
';
11200 $famime = 'file-video
';
11201 } elseif (preg_match('/\.ogv$/i
', $tmpfile)) {
11202 $mime = 'video/ogg
';
11203 $imgmime = 'video.png
';
11204 $famime = 'file-video
';
11205 } elseif (preg_match('/\.webm$/i
', $tmpfile)) {
11206 $mime = 'video/webm
';
11207 $imgmime = 'video.png
';
11208 $famime = 'file-video
';
11209 } elseif (preg_match('/\.avi$/i
', $tmpfile)) {
11210 $mime = 'video/x-msvideo
';
11211 $imgmime = 'video.png
';
11212 $famime = 'file-video
';
11213 } elseif (preg_match('/\.divx$/i
', $tmpfile)) {
11214 $mime = 'video/divx
';
11215 $imgmime = 'video.png
';
11216 $famime = 'file-video
';
11217 } elseif (preg_match('/\.xvid$/i
', $tmpfile)) {
11218 $mime = 'video/xvid
';
11219 $imgmime = 'video.png
';
11220 $famime = 'file-video
';
11221 } elseif (preg_match('/\.(wmv|mpg|mpeg)$/i
', $tmpfile)) {
11223 $imgmime = 'video.png
';
11224 $famime = 'file-video
';
11225 } elseif (preg_match('/\.(zip|rar|gz|tgz|z|cab|bz2|7z|tar|lzh|zst)$/i
', $tmpfile)) { // Archive
11226 // application/xxx where zzz is zip, ...
11228 $imgmime = 'archive.png
';
11229 $famime = 'file-archive
';
11230 } elseif (preg_match('/\.(exe|com)$/i
', $tmpfile)) { // Exe
11231 $mime = 'application/octet-stream
';
11232 $imgmime = 'other.png
';
11233 $famime = 'file-o
';
11234 } elseif (preg_match('/\.(dll|lib|o|so|a)$/i
', $tmpfile)) { // Lib
11236 $imgmime = 'library.png
';
11237 $famime = 'file-o
';
11238 } elseif (preg_match('/\.err$/i
', $tmpfile)) { // phpcs:ignore
11240 $imgmime = 'error.png
';
11241 $famime = 'file-alt
';
11244 // Return mimetype string
11245 switch ((int) $mode) {
11247 $tmp = explode('/
', $mime);
11248 return (!empty($tmp[1]) ? $tmp[1] : $tmp[0]);
11270function getDictionaryValue($tablename, $field, $id, $checkentity = false, $rowidfield = '
rowid')
11274 $tablename = preg_replace('/^
'.preg_quote(MAIN_DB_PREFIX, '/
').'/
', '', $tablename); // Clean name of table for backward compatibility.
11276 $dictvalues = (isset($conf->cache['dictvalues_
'.$tablename]) ? $conf->cache['dictvalues_
'.$tablename] : null);
11278 if (is_null($dictvalues)) {
11279 $dictvalues = array();
11281 $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
11282 if ($checkentity) {
11283 $sql .=
' AND entity IN (0,'.getEntity($tablename).
')';
11286 $resql = $db->query($sql);
11288 while ($obj = $db->fetch_object($resql)) {
11289 $dictvalues[$obj->$rowidfield] = $obj;
11295 $conf->cache[
'dictvalues_'.$tablename] = $dictvalues;
11298 if (!empty($dictvalues[$id])) {
11300 $tmp = $dictvalues[$id];
11301 return (property_exists($tmp, $field) ? $tmp->$field :
'');
11316 $stringcolor = str_replace(
'#',
'', $stringcolor);
11318 if (!empty($stringcolor)) {
11320 $tmp = explode(
',', $stringcolor);
11321 if (count($tmp) > 1) {
11326 $hexr = $stringcolor[0].$stringcolor[1];
11327 $hexg = $stringcolor[2].$stringcolor[3];
11328 $hexb = $stringcolor[4].$stringcolor[5];
11329 $r = hexdec($hexr);
11330 $g = hexdec($hexg);
11331 $b = hexdec($hexb);
11333 $bright = (max($r, $g, $b) + min($r, $g, $b)) / 510.0;
11334 if ($bright > 0.6) {
11355 if (empty($menuentry[
'enabled'])) {
11358 if ($type_user && $menuentry[
'module']) {
11359 $tmploops = explode(
'|', $menuentry[
'module']);
11361 foreach ($tmploops as $tmploop) {
11362 if (in_array($tmploop, $listofmodulesforexternal)) {
11371 if (!$menuentry[
'perms'] && $type_user) {
11377 if (!$menuentry[
'perms']) {
11392 return (ceil($n) % $x === 0) ? ceil($n) : round(($n + $x / 2) / $x) * $x;
11406function dolGetBadge($label, $html =
'', $type =
'primary', $mode =
'', $url =
'', $params = array())
11409 'class'=>
'badge '.(!empty($mode) ?
' badge-'.$mode :
'').(!empty($type) ?
' badge-'.$type :
'').(empty($params[
'css']) ?
'' :
' '.$params[
'css'])
11412 if (empty($html)) {
11416 if (!empty($url)) {
11417 $attr[
'href'] = $url;
11420 if ($mode ===
'dot') {
11421 $attr[
'class'] .=
' classfortooltip';
11422 $attr[
'title'] = $html;
11423 $attr[
'aria-label'] = $label;
11428 if (!empty($params[
'attr']) && is_array($params[
'attr'])) {
11429 foreach ($params[
'attr'] as $key => $value) {
11430 if ($key ==
'class') {
11431 $attr[
'class'] .=
' '.$value;
11432 } elseif ($key ==
'classOverride') {
11433 $attr[
'class'] = $value;
11435 $attr[$key] = $value;
11443 $attr = array_map(
'dol_escape_htmltag', $attr);
11445 $TCompiledAttr = array();
11446 foreach ($attr as $key => $value) {
11447 $TCompiledAttr[] = $key.
'="'.$value.
'"';
11450 $compiledAttributes = !empty($TCompiledAttr) ? implode(
' ', $TCompiledAttr) :
'';
11452 $tag = !empty($url) ?
'a' :
'span';
11454 return '<'.$tag.
' '.$compiledAttributes.
'>'.$html.
'</'.$tag.
'>';
11470function dolGetStatus($statusLabel =
'', $statusLabelShort =
'', $html =
'', $statusType =
'status0', $displayMode = 0, $url =
'', $params = array())
11475 $dolGetBadgeParams = array();
11477 if (!empty($params[
'badgeParams'])) {
11478 $dolGetBadgeParams = $params[
'badgeParams'];
11482 if ($displayMode == 0) {
11483 $return = !empty($html) ? $html : (empty($conf->dol_optimize_smallscreen) ? $statusLabel : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort));
11484 } elseif ($displayMode == 1) {
11485 $return = !empty($html) ? $html : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort);
11489 $htmlLabel = (in_array($displayMode, array(1, 2, 5)) ?
'<span class="hideonsmartphone">' :
'').(!empty($html) ? $html : $statusLabel).(in_array($displayMode, array(1, 2, 5)) ?
'</span>' :
'');
11490 $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>' :
'');
11493 if (!empty($conf->dol_optimize_smallscreen)) {
11494 if ($displayMode == 0) {
11496 } elseif ($displayMode == 4) {
11498 } elseif ($displayMode == 6) {
11504 $statusImg = array(
11505 'status0' =>
'statut0',
11506 'status1' =>
'statut1',
11507 'status2' =>
'statut2',
11508 'status3' =>
'statut3',
11509 'status4' =>
'statut4',
11510 'status5' =>
'statut5',
11511 'status6' =>
'statut6',
11512 'status7' =>
'statut7',
11513 'status8' =>
'statut8',
11514 'status9' =>
'statut9'
11517 if (!empty($statusImg[$statusType])) {
11518 $htmlImg =
img_picto($statusLabel, $statusImg[$statusType]);
11520 $htmlImg =
img_picto($statusLabel, $statusType);
11523 if ($displayMode === 2) {
11524 $return = $htmlImg.
' '.$htmlLabelShort;
11525 } elseif ($displayMode === 3) {
11526 $return = $htmlImg;
11527 } elseif ($displayMode === 4) {
11528 $return = $htmlImg.
' '.$htmlLabel;
11529 } elseif ($displayMode === 5) {
11530 $return = $htmlLabelShort.
' '.$htmlImg;
11532 $return = $htmlLabel.
' '.$htmlImg;
11536 $statusLabelShort = (empty($statusLabelShort) ? $statusLabel : $statusLabelShort);
11538 $dolGetBadgeParams[
'attr'][
'class'] =
'badge-status';
11539 $dolGetBadgeParams[
'attr'][
'title'] = empty($params[
'tooltip']) ? $statusLabel : ($params[
'tooltip'] !=
'no' ? $params[
'tooltip'] :
'');
11541 if ($displayMode == 3) {
11542 $return = dolGetBadge((empty($conf->dol_optimize_smallscreen) ? $statusLabel : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort)),
'', $statusType,
'dot', $url, $dolGetBadgeParams);
11543 } elseif ($displayMode === 5) {
11544 $return = dolGetBadge($statusLabelShort, $html, $statusType,
'', $url, $dolGetBadgeParams);
11546 $return = dolGetBadge((empty($conf->dol_optimize_smallscreen) ? $statusLabel : (empty($statusLabelShort) ? $statusLabel : $statusLabelShort)), $html, $statusType,
'', $url, $dolGetBadgeParams);
11588function dolGetButtonAction($label, $text =
'', $actionType =
'default', $url =
'', $id =
'', $userRight = 1, $params = array())
11590 global $hookmanager, $action, $object, $langs;
11593 if (is_array($url)) {
11595 foreach ($url as $key => $subbutton) {
11596 if (isset($subbutton[
'enabled']) && empty($subbutton[
'enabled'])) {
11603 if (count($url) > 1) {
11604 $out .=
'<div class="dropdown inline-block dropdown-holder">';
11605 $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>';
11606 $out .=
'<div class="dropdown-content">';
11607 foreach ($url as $subbutton) {
11608 if (!empty($subbutton[
'lang'])) {
11609 $langs->load($subbutton[
'lang']);
11611 $tmpurl = DOL_URL_ROOT.$subbutton[
'url'].(empty($params[
'backtopage']) ?
'' :
'&backtopage='.urlencode($params[
'backtopage']));
11612 $out .=
dolGetButtonAction(
'', $langs->trans($subbutton[
'label']),
'default', $tmpurl,
'', $subbutton[
'perm'], array(
'isDropDown' =>
true));
11617 foreach ($url as $subbutton) {
11618 if (!empty($subbutton[
'lang'])) {
11619 $langs->load($subbutton[
'lang']);
11621 $tmpurl = DOL_URL_ROOT.$subbutton[
'url'].(empty($params[
'backtopage']) ?
'' :
'&backtopage='.urlencode($params[
'backtopage']));
11622 $out .=
dolGetButtonAction(
'', $langs->trans($subbutton[
'label']),
'default', $tmpurl,
'', $subbutton[
'perm']);
11631 if (!empty($params[
'isDropdown'])) {
11632 $class =
"dropdown-item";
11634 $class =
'butAction';
11635 if ($actionType ==
'danger' || $actionType ==
'delete') {
11636 $class =
'butActionDelete';
11637 if (!empty($url) && strpos($url,
'token=') ===
false) {
11638 $url .=
'&token='.newToken();
11644 'href' => empty($url) ?
'' : $url,
11648 if (empty($text)) {
11650 $attr[
'title'] =
'';
11652 $attr[
'title'] = $label;
11653 $attr[
'aria-label'] = $label;
11656 if (empty($userRight)) {
11657 $attr[
'class'] =
'butActionRefused';
11658 $attr[
'href'] =
'';
11659 $attr[
'title'] = (($label && $text && $label != $text) ? $label : $langs->trans(
'NotEnoughPermissions'));
11667 if (!empty($params[
'attr']) && is_array($params[
'attr'])) {
11668 foreach ($params[
'attr'] as $key => $value) {
11669 if ($key ==
'class') {
11670 $attr[
'class'] .=
' '.$value;
11671 } elseif ($key ==
'classOverride') {
11672 $attr[
'class'] = $value;
11674 $attr[$key] = $value;
11680 if (!empty($attr[
'title']) && !empty($attr[
'class']) && strpos($attr[
'class'],
'classfortooltip') ===
false) {
11681 $attr[
'class'].=
' classfortooltip';
11685 if ($userRight && !empty($params[
'confirm'])) {
11686 if (!is_array($params[
'confirm'])) {
11687 $params[
'confirm'] = array();
11690 if (empty($params[
'confirm'][
'url'])) {
11691 $params[
'confirm'][
'url'] = $url . (strpos($url,
'?') > 0 ?
'&' :
'?') .
'confirm=yes';
11695 $attr[
'data-confirm-url'] = $params[
'confirm'][
'url'];
11696 $attr[
'data-confirm-title'] = !empty($params[
'confirm'][
'title']) ? $params[
'confirm'][
'title'] : $langs->trans(
'ConfirmBtnCommonTitle', $label);
11697 $attr[
'data-confirm-content'] = !empty($params[
'confirm'][
'content']) ? $params[
'confirm'][
'content'] : $langs->trans(
'ConfirmBtnCommonContent', $label);
11698 $attr[
'data-confirm-content'] = preg_replace(
"/\r|\n/",
"", $attr[
'data-confirm-content']);
11699 $attr[
'data-confirm-action-btn-label'] = !empty($params[
'confirm'][
'action-btn-label']) ? $params[
'confirm'][
'action-btn-label'] : $langs->trans(
'Confirm');
11700 $attr[
'data-confirm-cancel-btn-label'] = !empty($params[
'confirm'][
'cancel-btn-label']) ? $params[
'confirm'][
'cancel-btn-label'] : $langs->trans(
'CloseDialog');
11701 $attr[
'data-confirm-modal'] = !empty($params[
'confirm'][
'modal']) ? $params[
'confirm'][
'modal'] :
true;
11703 $attr[
'class'].=
' butActionConfirm';
11706 if (isset($attr[
'href']) && empty($attr[
'href'])) {
11707 unset($attr[
'href']);
11711 $attr = array_map(
'dol_escape_htmltag', $attr);
11713 $TCompiledAttr = array();
11714 foreach ($attr as $key => $value) {
11715 $TCompiledAttr[] = $key.
'= "'.$value.
'"';
11718 $compiledAttributes = empty($TCompiledAttr) ?
'' : implode(
' ', $TCompiledAttr);
11720 $tag = !empty($attr[
'href']) ?
'a' :
'span';
11723 $parameters = array(
11724 'TCompiledAttr' => $TCompiledAttr,
11725 'compiledAttributes' => $compiledAttributes,
11730 'actionType' => $actionType,
11733 'userRight' => $userRight,
11734 'params' => $params
11737 $reshook = $hookmanager->executeHooks(
'dolGetButtonAction', $parameters, $object, $action);
11738 if ($reshook < 0) {
11742 if (empty($reshook)) {
11744 return '<' . $tag .
' ' . $compiledAttributes .
'>' . $text .
'</' . $tag .
'>';
11746 return '<' . $tag .
' ' . $compiledAttributes .
'>' .
dol_escape_htmltag($text) .
'</' . $tag .
'>';
11749 return $hookmanager->resPrint;
11761 return '<span class="button-title-separator '.$moreClass.
'" ></span>';
11773 if (!empty($fieldValidationErrorMsg)) {
11774 $out.=
'<span class="field-error-icon classfortooltip" title="'.dol_escape_htmltag($fieldValidationErrorMsg, 1).
'" role="alert" >';
11775 $out.=
'<span class="fa fa-exclamation-circle" aria-hidden="true" ></span>';
11794function dolGetButtonTitle($label, $helpText =
'', $iconClass =
'fa fa-file', $url =
'', $id =
'', $status = 1, $params = array())
11796 global $langs, $conf, $user;
11799 if (
getDolGlobalString(
'MAIN_BUTTON_HIDE_UNAUTHORIZED') && (!$user->admin) && $status <= 0) {
11803 $class =
'btnTitle';
11804 if (in_array($iconClass, array(
'fa fa-plus-circle',
'fa fa-plus-circle size15x',
'fa fa-comment-dots',
'fa fa-paper-plane'))) {
11805 $class .=
' btnTitlePlus';
11807 $useclassfortooltip = 1;
11809 if (!empty($params[
'morecss'])) {
11810 $class .=
' '.$params[
'morecss'];
11815 'href' => empty($url) ?
'' : $url
11818 if (!empty($helpText)) {
11820 } elseif (empty($attr[
'title']) && $label) {
11821 $attr[
'title'] = $label;
11822 $useclassfortooltip = 0;
11825 if ($status == 2) {
11826 $attr[
'class'] .=
' btnTitleSelected';
11827 } elseif ($status <= 0) {
11828 $attr[
'class'] .=
' refused';
11830 $attr[
'href'] =
'';
11832 if ($status == -1) {
11833 $attr[
'title'] =
dol_escape_htmltag($langs->transnoentitiesnoconv(
"FeatureDisabled"));
11834 } elseif ($status == 0) {
11835 $attr[
'title'] =
dol_escape_htmltag($langs->transnoentitiesnoconv(
"NotEnoughPermissions"));
11839 if (!empty($attr[
'title']) && $useclassfortooltip) {
11840 $attr[
'class'] .=
' classfortooltip';
11848 if (!empty($params[
'attr']) && is_array($params[
'attr'])) {
11849 foreach ($params[
'attr'] as $key => $value) {
11850 if ($key ==
'class') {
11851 $attr[
'class'] .=
' '.$value;
11852 } elseif ($key ==
'classOverride') {
11853 $attr[
'class'] = $value;
11855 $attr[$key] = $value;
11860 if (isset($attr[
'href']) && empty($attr[
'href'])) {
11861 unset($attr[
'href']);
11867 $attr = array_map(
'dol_escape_htmltag', $attr);
11869 $TCompiledAttr = array();
11870 foreach ($attr as $key => $value) {
11871 $TCompiledAttr[] = $key.
'="'.$value.
'"';
11874 $compiledAttributes = (empty($TCompiledAttr) ?
'' : implode(
' ', $TCompiledAttr));
11876 $tag = (empty($attr[
'href']) ?
'span' :
'a');
11878 $button =
'<'.$tag.
' '.$compiledAttributes.
'>';
11879 $button .=
'<span class="'.$iconClass.
' valignmiddle btnTitle-icon"></span>';
11880 if (!empty($params[
'forcenohideoftext'])) {
11881 $button .=
'<span class="valignmiddle text-plus-circle btnTitle-label'.(empty($params[
'forcenohideoftext']) ?
' hideonsmartphone' :
'').
'">'.$label.
'</span>';
11883 $button .=
'</'.$tag.
'>';
11900 global $conf, $db, $hookmanager;
11906 $classfile = $classname = $classpath = $subdir = $dir_output =
'';
11909 $module = $element_type;
11910 $element = $element_type;
11911 $subelement = $element_type;
11912 $table_element = $element_type;
11915 if (preg_match(
'/^([^@]+)@([^@]+)$/i', $element_type, $regs)) {
11916 $element = $subelement = $regs[1];
11917 $module = $regs[2];
11922 if (preg_match(
'/^([^_]+)_([^_]+)/i', $element, $regs)) {
11923 $module = $element = $regs[1];
11924 $subelement = $regs[2];
11928 if ($element_type ==
"action" || $element_type ==
"actioncomm") {
11929 $classpath =
'comm/action/class';
11930 $subelement =
'Actioncomm';
11931 $module =
'agenda';
11932 $table_element =
'actioncomm';
11933 } elseif ($element_type ==
'cronjob') {
11934 $classpath =
'cron/class';
11936 $table_element =
'cron';
11937 } elseif ($element_type ==
'adherent_type') {
11938 $classpath =
'adherents/class';
11939 $classfile =
'adherent_type';
11940 $module =
'adherent';
11941 $subelement =
'adherent_type';
11942 $classname =
'AdherentType';
11943 $table_element =
'adherent_type';
11944 } elseif ($element_type ==
'bank_account') {
11945 $classpath =
'compta/bank/class';
11947 $classfile =
'account';
11948 $classname =
'Account';
11949 } elseif ($element_type ==
'category') {
11950 $classpath =
'categories/class';
11951 $module =
'categorie';
11952 $subelement =
'categorie';
11953 $table_element =
'categorie';
11954 } elseif ($element_type ==
'contact') {
11955 $classpath =
'contact/class';
11956 $classfile =
'contact';
11957 $module =
'societe';
11958 $subelement =
'contact';
11959 $table_element =
'socpeople';
11960 } elseif ($element_type ==
'inventory') {
11961 $module =
'product';
11962 $classpath =
'product/inventory/class';
11963 } elseif ($element_type ==
'stock' || $element_type ==
'entrepot') {
11965 $classpath =
'product/stock/class';
11966 $classfile =
'entrepot';
11967 $classname =
'Entrepot';
11968 $table_element =
'entrepot';
11969 } elseif ($element_type ==
'project') {
11970 $classpath =
'projet/class';
11971 $module =
'projet';
11972 $table_element =
'projet';
11973 } elseif ($element_type ==
'project_task') {
11974 $classpath =
'projet/class';
11975 $module =
'projet';
11976 $subelement =
'task';
11977 $table_element =
'projet_task';
11978 } elseif ($element_type ==
'facture' || $element_type ==
'invoice') {
11979 $classpath =
'compta/facture/class';
11980 $module =
'facture';
11981 $subelement =
'facture';
11982 $table_element =
'facture';
11983 } elseif ($element_type ==
'commande' || $element_type ==
'order') {
11984 $classpath =
'commande/class';
11985 $module =
'commande';
11986 $subelement =
'commande';
11987 $table_element =
'commande';
11988 } elseif ($element_type ==
'propal') {
11989 $classpath =
'comm/propal/class';
11990 $table_element =
'propal';
11991 } elseif ($element_type ==
'shipping') {
11992 $classpath =
'expedition/class';
11993 $classfile =
'expedition';
11994 $classname =
'Expedition';
11995 $module =
'expedition';
11996 $table_element =
'expedition';
11997 } elseif ($element_type ==
'supplier_proposal') {
11998 $classpath =
'supplier_proposal/class';
11999 $module =
'supplier_proposal';
12000 $element =
'supplierproposal';
12001 $classfile =
'supplier_proposal';
12002 $subelement =
'supplierproposal';
12003 } elseif ($element_type ==
'shipping') {
12004 $classpath =
'expedition/class';
12005 $subelement =
'expedition';
12006 $module =
'expedition_bon';
12007 } elseif ($element_type ==
'delivery') {
12008 $classpath =
'delivery/class';
12009 $subelement =
'delivery';
12010 $module =
'expedition';
12011 } elseif ($element_type ==
'contract') {
12012 $classpath =
'contrat/class';
12013 $module =
'contrat';
12014 $subelement =
'contrat';
12015 $table_element =
'contract';
12016 } elseif ($element_type ==
'mailing') {
12017 $classpath =
'comm/mailing/class';
12018 $module =
'mailing';
12019 $classfile =
'mailing';
12020 $classname =
'Mailing';
12022 } elseif ($element_type ==
'member') {
12023 $classpath =
'adherents/class';
12024 $module =
'adherent';
12025 $subelement =
'adherent';
12026 $table_element =
'adherent';
12027 } elseif ($element_type ==
'usergroup') {
12028 $classpath =
'user/class';
12030 } elseif ($element_type ==
'mo') {
12031 $classpath =
'mrp/class';
12036 $table_element =
'mrp_mo';
12037 } elseif ($element_type ==
'cabinetmed_cons') {
12038 $classpath =
'cabinetmed/class';
12039 $module =
'cabinetmed';
12040 $subelement =
'cabinetmedcons';
12041 $table_element =
'cabinetmedcons';
12042 } elseif ($element_type ==
'fichinter') {
12043 $classpath =
'fichinter/class';
12044 $module =
'ficheinter';
12045 $subelement =
'fichinter';
12046 $table_element =
'fichinter';
12047 } elseif ($element_type ==
'dolresource' || $element_type ==
'resource') {
12048 $classpath =
'resource/class';
12049 $module =
'resource';
12050 $subelement =
'dolresource';
12051 $table_element =
'resource';
12052 } elseif ($element_type ==
'propaldet') {
12053 $classpath =
'comm/propal/class';
12054 $module =
'propal';
12055 $subelement =
'propaleligne';
12056 } elseif ($element_type ==
'opensurvey_sondage') {
12057 $classpath =
'opensurvey/class';
12058 $module =
'opensurvey';
12059 $subelement =
'opensurveysondage';
12060 } elseif ($element_type ==
'order_supplier') {
12061 $classpath =
'fourn/class';
12062 $module =
'fournisseur';
12063 $classfile =
'fournisseur.commande';
12064 $element =
'order_supplier';
12066 $classname =
'CommandeFournisseur';
12067 $table_element =
'commande_fournisseur';
12068 } elseif ($element_type ==
'commande_fournisseurdet') {
12069 $classpath =
'fourn/class';
12070 $module =
'fournisseur';
12071 $classfile =
'fournisseur.commande';
12072 $element =
'commande_fournisseurdet';
12074 $classname =
'CommandeFournisseurLigne';
12075 $table_element =
'commande_fournisseurdet';
12076 } elseif ($element_type ==
'invoice_supplier') {
12077 $classpath =
'fourn/class';
12078 $module =
'fournisseur';
12079 $classfile =
'fournisseur.facture';
12080 $element =
'invoice_supplier';
12082 $classname =
'FactureFournisseur';
12083 $table_element =
'facture_fourn';
12084 } elseif ($element_type ==
"service") {
12085 $classpath =
'product/class';
12086 $subelement =
'product';
12087 $table_element =
'product';
12088 } elseif ($element_type ==
'salary') {
12089 $classpath =
'salaries/class';
12090 $module =
'salaries';
12091 } elseif ($element_type ==
'payment_salary') {
12092 $classpath =
'salaries/class';
12093 $classfile =
'paymentsalary';
12094 $classname =
'PaymentSalary';
12095 $module =
'salaries';
12096 } elseif ($element_type ==
'productlot') {
12097 $module =
'productbatch';
12098 $classpath =
'product/stock/class';
12099 $classfile =
'productlot';
12100 $classname =
'Productlot';
12101 $element =
'productlot';
12103 $table_element =
'product_lot';
12104 } elseif ($element_type ==
'websitepage') {
12105 $classpath =
'website/class';
12106 $classfile =
'websitepage';
12107 $classname =
'Websitepage';
12108 $module =
'website';
12109 $subelement =
'websitepage';
12110 $table_element =
'website_page';
12111 } elseif ($element_type ==
'fiscalyear') {
12112 $classpath =
'core/class';
12113 $module =
'accounting';
12114 $subelement =
'fiscalyear';
12115 } elseif ($element_type ==
'chargesociales') {
12116 $classpath =
'compta/sociales/class';
12118 $table_element =
'chargesociales';
12119 } elseif ($element_type ==
'tva') {
12120 $classpath =
'compta/tva/class';
12123 $table_element =
'tva';
12124 } elseif ($element_type ==
'emailsenderprofile') {
12126 $classpath =
'core/class';
12127 $classfile =
'emailsenderprofile';
12128 $classname =
'EmailSenderProfile';
12129 $table_element =
'c_email_senderprofile';
12131 } elseif ($element_type ==
'ccountry') {
12133 $classpath =
'core/class';
12134 $classfile =
'ccountry';
12135 $classname =
'Ccountry';
12136 $table_element =
'c_country';
12140 if (empty($classfile)) {
12141 $classfile = strtolower($subelement);
12143 if (empty($classname)) {
12144 $classname = ucfirst($subelement);
12146 if (empty($classpath)) {
12147 $classpath = $module.
'/class';
12153 if ($module && isset($conf->$module)) {
12154 if (!empty($conf->$module->multidir_output[$conf->entity])) {
12155 $dir_output = $conf->$module->multidir_output[$conf->entity];
12156 } elseif (!empty($conf->$module->output[$conf->entity])) {
12157 $dir_output = $conf->$module->output[$conf->entity];
12158 } elseif (!empty($conf->$module->dir_output)) {
12159 $dir_output = $conf->$module->dir_output;
12164 if ($element ==
'order_supplier') {
12165 $dir_output = $conf->fournisseur->commande->dir_output;
12166 } elseif ($element ==
'invoice_supplier') {
12167 $dir_output = $conf->fournisseur->facture->dir_output;
12169 $dir_output .= $subdir;
12171 $elementProperties = array(
12172 'module' => $module,
12173 'element' => $element,
12174 'table_element' => $table_element,
12175 'subelement' => $subelement,
12176 'classpath' => $classpath,
12177 'classfile' => $classfile,
12178 'classname' => $classname,
12179 'dir_output' => $dir_output
12184 if (!is_object($hookmanager)) {
12185 include_once DOL_DOCUMENT_ROOT.
'/core/class/hookmanager.class.php';
12188 $hookmanager->initHooks(array(
'elementproperties'));
12192 $parameters = array(
12193 'elementType' => $element_type,
12194 'elementProperties' => $elementProperties
12197 $reshook = $hookmanager->executeHooks(
'getElementProperties', $parameters);
12200 $elementProperties = $hookmanager->resArray;
12201 } elseif (!empty($hookmanager->resArray) && is_array($hookmanager->resArray)) {
12202 $elementProperties = array_replace($elementProperties, $hookmanager->resArray);
12206 if (($key = array_search(
'elementproperties', $hookmanager->contextarray)) !==
false) {
12207 unset($hookmanager->contextarray[$key]);
12210 return $elementProperties;
12231 if ($element_prop[
'module'] ==
'product' || $element_prop[
'module'] ==
'service') {
12236 $ismodenabled = (isModEnabled(
'product') || isModEnabled(
'service'));
12238 $ismodenabled = isModEnabled($element_prop[
'module']);
12243 if (is_array($element_prop) && (empty($element_prop[
'module']) || $ismodenabled)) {
12244 dol_include_once(
'/'.$element_prop[
'classpath'].
'/'.$element_prop[
'classfile'].
'.class.php');
12246 if (class_exists($element_prop[
'classname'])) {
12247 $classname = $element_prop[
'classname'];
12248 $objecttmp =
new $classname($db);
12250 if ($element_id > 0 || !empty($element_ref)) {
12251 $ret = $objecttmp->fetch($element_id, $element_ref);
12253 if (empty($objecttmp->module)) {
12254 $objecttmp->module = $element_prop[
'module'];
12277 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)) {
12293 return empty($_SESSION[
'newtoken']) ?
'' : $_SESSION[
'newtoken'];
12305 return isset($_SESSION[
'token']) ? $_SESSION[
'token'] :
'';
12317 if (empty($conf->cache[
'nonce'])) {
12321 return $conf->cache[
'nonce'];
12341 print
'<div class="div-table-responsive-no-min">';
12342 print
'<table class="noborder centpercent">';
12343 print
'<tr class="liste_titre">';
12345 print $emptyRows < 1 ?
'<th>' :
'<th colspan="'.($emptyRows + 1).
'">';
12347 print $langs->trans($header);
12350 if ($number > -1) {
12354 if (!empty($link)) {
12355 if (!empty($arguments)) {
12356 print
'<a href="'.DOL_URL_ROOT.
'/'.$link.
'?'.$arguments.
'">';
12358 print
'<a href="'.DOL_URL_ROOT.
'/'.$link.
'">';
12362 if ($number > -1) {
12363 print
'<span class="badge">'.$number.
'</span>';
12366 if (!empty($link)) {
12372 if ($number < 0 && !empty($link)) {
12373 print
'<th class="right">';
12375 if (!empty($arguments)) {
12376 print
'<a class="commonlink" href="'.DOL_URL_ROOT.
'/'.$link.
'?'.$arguments.
'">';
12378 print
'<a class="commonlink" href="'.DOL_URL_ROOT.
'/'.$link.
'">';
12381 print $langs->trans(
"FullList");
12402 if ($addLineBreak) {
12418function addSummaryTableLine($tableColumnCount, $num, $nbofloop = 0, $total = 0, $noneWord =
"None", $extraRightColumn =
false)
12423 print
'<tr class="oddeven">';
12424 print
'<td colspan="'.$tableColumnCount.
'"><span class="opacitymedium">'.$langs->trans($noneWord).
'</span></td>';
12429 if ($nbofloop === 0) {
12435 $colspan = $tableColumnCount;
12436 } elseif ($num > $nbofloop) {
12437 $colspan = $tableColumnCount;
12439 $colspan = $tableColumnCount - 1;
12442 if ($extraRightColumn) {
12446 print
'<tr class="liste_total">';
12448 if ($nbofloop > 0 && $num > $nbofloop) {
12449 print
'<td colspan="'.$colspan.
'" class="right">'.$langs->trans(
"XMoreLines", ($num - $nbofloop)).
'</td>';
12451 print
'<td colspan="'.$colspan.
'" class="right"> '.$langs->trans(
"Total").
'</td>';
12452 print
'<td class="right centpercent">'.price($total).
'</td>';
12455 if ($extraRightColumn) {
12472 if ($method == -1) {
12483 while (ob_get_level()) {
12488 if ($method == 0) {
12489 readfile($fullpath_original_file_osencoded);
12490 } elseif ($method == 1) {
12492 $handle = fopen($fullpath_original_file_osencoded,
"rb");
12493 while (!feof($handle)) {
12494 print fread($handle, 8192);
12497 } elseif ($method == 2) {
12499 $handle1 = fopen($fullpath_original_file_osencoded,
"rb");
12500 $handle2 = fopen(
"php://output",
"wb");
12501 stream_copy_to_stream($handle1, $handle2);
12526 if ($texttoshow ===
'none') {
12527 $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>';
12528 } elseif ($texttoshow) {
12529 $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>';
12531 $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>';
12546 $result = json_decode($stringtodecode);
12547 if ($result ===
null) {
12548 $result = unserialize($stringtodecode);
12570 if (empty($filter)) {
12574 if (!preg_match(
'/^\(.*\)$/', $filter)) {
12575 $filter =
'(' . $filter .
')';
12578 $regexstring =
'\(([a-zA-Z0-9_\.]+:[<>!=insotlke]+:[^\(\)]+)\)';
12584 return 'Filter syntax error - '.$errorstr;
12589 $t = preg_replace_callback(
'/'.$regexstring.
'/i',
'dolForgeDummyCriteriaCallback', $filter);
12590 $t = str_replace(array(
'and',
'or',
'AND',
'OR',
' '),
'', $t);
12592 if (preg_match(
'/[^\(\)]/', $t)) {
12593 $errorstr =
'Bad syntax of the search string';
12597 return 'Filter syntax error - '.$errorstr;
12601 return ($noand ?
"" :
" AND ").($nopar ?
"" :
'(').preg_replace_callback(
'/'.$regexstring.
'/i',
'dolForgeCriteriaCallback', $filter).($nopar ?
"" :
')');
12615 $tmp = $sqlfilters;
12617 $nb = strlen($tmp);
12620 if ($tmp[$i] ==
'(') {
12623 if ($tmp[$i] ==
')') {
12626 if ($counter < 0) {
12627 $error =
"Wrond balance of parenthesis in sqlfilters=".$sqlfilters;
12646 if (empty($matches[1])) {
12649 $tmp = explode(
':', $matches[1]);
12650 if (count($tmp) < 3) {
12670 if (empty($matches[1])) {
12673 $tmp = explode(
':', $matches[1]);
12674 if (count($tmp) < 3) {
12678 $operand = preg_replace(
'/[^a-z0-9\._]/i',
'', trim($tmp[0]));
12680 $operator = strtoupper(preg_replace(
'/[^a-z<>!=]/i',
'', trim($tmp[1])));
12683 'NOTLIKE' =>
'NOT LIKE',
12684 'ISNOT' =>
'IS NOT',
12685 'NOTIN' =>
'NOT IN',
12689 if (array_key_exists($operator, $realOperator)) {
12690 $operator = $realOperator[$operator];
12694 $tmpescaped = $tmp[2];
12697 if ($operator ==
'IN' || $operator ==
'NOT IN') {
12699 $tmpescaped2 =
'(';
12701 $tmpelemarray = explode(
',', $tmpescaped);
12702 foreach ($tmpelemarray as $tmpkey => $tmpelem) {
12704 if (preg_match(
'/^\'(.*)\'$/', $tmpelem, $reg)) {
12705 $tmpelemarray[$tmpkey] =
"'".$db->escape($db->sanitize($reg[1], 1, 1, 1)).
"'";
12707 $tmpelemarray[$tmpkey] = $db->escape($db->sanitize($tmpelem, 1, 1, 1));
12710 $tmpescaped2 .= join(
',', $tmpelemarray);
12711 $tmpescaped2 .=
')';
12713 $tmpescaped = $tmpescaped2;
12714 } elseif ($operator ==
'LIKE' || $operator ==
'NOT LIKE') {
12715 if (preg_match(
'/^\'(.*)\'$/', $tmpescaped, $regbis)) {
12716 $tmpescaped = $regbis[1];
12719 $tmpescaped =
"'".$db->escape($tmpescaped).
"'";
12720 } elseif (preg_match(
'/^\'(.*)\'$/', $tmpescaped, $regbis)) {
12721 $tmpescaped =
"'".$db->escape($regbis[1]).
"'";
12723 if (strtoupper($tmpescaped) ==
'NULL') {
12724 $tmpescaped =
'NULL';
12725 } elseif (is_int($tmpescaped)) {
12726 $tmpescaped = (int) $tmpescaped;
12728 $tmpescaped = (float) $tmpescaped;
12732 return '('.$db->escape($operand).
' '.strtoupper($operator).
' '.$tmpescaped.
')';
12747 global $conf, $langs;
12749 $out =
'<!-- timeline icon -->'.
"\n";
12750 $iconClass =
'fa fa-comments';
12755 if ($histo[$key][
'percent'] == -1) {
12756 $colorClass =
'timeline-icon-not-applicble';
12757 $pictoTitle = $langs->trans(
'StatusNotApplicable');
12758 } elseif ($histo[$key][
'percent'] == 0) {
12759 $colorClass =
'timeline-icon-todo';
12760 $pictoTitle = $langs->trans(
'StatusActionToDo').
' (0%)';
12761 } elseif ($histo[$key][
'percent'] > 0 && $histo[$key][
'percent'] < 100) {
12762 $colorClass =
'timeline-icon-in-progress';
12763 $pictoTitle = $langs->trans(
'StatusActionInProcess').
' ('.$histo[$key][
'percent'].
'%)';
12764 } elseif ($histo[$key][
'percent'] >= 100) {
12765 $colorClass =
'timeline-icon-done';
12766 $pictoTitle = $langs->trans(
'StatusActionDone').
' (100%)';
12769 if ($actionstatic->code ==
'AC_TICKET_CREATE') {
12770 $iconClass =
'fa fa-ticket';
12771 } elseif ($actionstatic->code ==
'AC_TICKET_MODIFY') {
12772 $iconClass =
'fa fa-pencilxxx';
12773 } elseif (preg_match(
'/^TICKET_MSG/', $actionstatic->code)) {
12774 $iconClass =
'fa fa-comments';
12775 } elseif (preg_match(
'/^TICKET_MSG_PRIVATE/', $actionstatic->code)) {
12776 $iconClass =
'fa fa-mask';
12778 if ($actionstatic->type_picto) {
12779 $img_picto =
img_picto(
'', $actionstatic->type_picto);
12781 if ($actionstatic->type_code ==
'AC_RDV') {
12782 $iconClass =
'fa fa-handshake';
12783 } elseif ($actionstatic->type_code ==
'AC_TEL') {
12784 $iconClass =
'fa fa-phone';
12785 } elseif ($actionstatic->type_code ==
'AC_FAX') {
12786 $iconClass =
'fa fa-fax';
12787 } elseif ($actionstatic->type_code ==
'AC_EMAIL') {
12788 $iconClass =
'fa fa-envelope';
12789 } elseif ($actionstatic->type_code ==
'AC_INT') {
12790 $iconClass =
'fa fa-shipping-fast';
12791 } elseif ($actionstatic->type_code ==
'AC_OTH_AUTO') {
12792 $iconClass =
'fa fa-robot';
12793 } elseif (!preg_match(
'/_AUTO/', $actionstatic->type_code)) {
12794 $iconClass =
'fa fa-robot';
12799 $out .=
'<i class="'.$iconClass.
' '.$colorClass.
'" title="'.$pictoTitle.
'">'.$img_picto.
'</i>'.
"\n";
12813 $documents = array();
12815 $sql =
'SELECT ecm.rowid as id, ecm.src_object_type, ecm.src_object_id, ecm.filepath, ecm.filename';
12816 $sql .=
' FROM '.MAIN_DB_PREFIX.
'ecm_files ecm';
12817 $sql .=
" WHERE ecm.filepath = 'agenda/".((int) $object->id).
"'";
12819 $sql .=
' ORDER BY ecm.position ASC';
12821 $resql = $db->query($sql);
12823 if ($db->num_rows($resql)) {
12824 while ($obj = $db->fetch_object($resql)) {
12825 $documents[$obj->id] = $obj;
12852function show_actions_messaging($conf, $langs, $db, $filterobj, $objcon =
'', $noprint = 0, $actioncode =
'', $donetodo =
'done', $filters = array(), $sortfield =
'a.datep,a.id', $sortorder =
'DESC')
12854 global $user, $conf;
12857 global $param, $massactionbutton;
12862 if (!is_object($filterobj) && !is_object($objcon)) {
12870 $sortfield_list = explode(
',', $sortfield);
12871 $sortfield_label_list = array(
'a.id' =>
'id',
'a.datep' =>
'dp',
'a.percent' =>
'percent');
12872 $sortfield_new_list = array();
12873 foreach ($sortfield_list as $sortfield_value) {
12874 $sortfield_new_list[] = $sortfield_label_list[trim($sortfield_value)];
12876 $sortfield_new = implode(
',', $sortfield_new_list);
12878 if (isModEnabled(
'agenda')) {
12880 if (is_object($objcon) && $objcon->id > 0) {
12881 $sql =
"SELECT DISTINCT a.id, a.label as label,";
12883 $sql =
"SELECT a.id, a.label as label,";
12885 $sql .=
" a.datep as dp,";
12886 $sql .=
" a.note as message,";
12887 $sql .=
" a.datep2 as dp2,";
12888 $sql .=
" a.percent as percent, 'action' as type,";
12889 $sql .=
" a.fk_element, a.elementtype,";
12890 $sql .=
" a.fk_contact,";
12891 $sql .=
" a.email_from as msg_from,";
12892 $sql .=
" c.code as acode, c.libelle as alabel, c.picto as apicto,";
12893 $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";
12894 if (is_object($filterobj) && get_class($filterobj) ==
'Societe') {
12895 $sql .=
", sp.lastname, sp.firstname";
12896 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
12897 $sql .=
", m.lastname, m.firstname";
12898 } elseif (is_object($filterobj) && get_class($filterobj) ==
'CommandeFournisseur') {
12900 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Product') {
12902 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
12904 } elseif (is_object($filterobj) && get_class($filterobj) ==
'BOM') {
12906 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Contrat') {
12909 $sql .=
" FROM ".MAIN_DB_PREFIX.
"actioncomm as a";
12910 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"user as u on u.rowid = a.fk_user_action";
12911 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"c_actioncomm as c ON a.fk_action = c.id";
12913 $force_filter_contact =
false;
12914 if (is_object($objcon) && $objcon->id > 0) {
12915 $force_filter_contact =
true;
12916 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"actioncomm_resources as r ON a.id = r.fk_actioncomm";
12917 $sql .=
" AND r.element_type = '".$db->escape($objcon->table_element).
"' AND r.fk_element = ".((int) $objcon->id);
12920 if (is_object($filterobj) && get_class($filterobj) ==
'Societe') {
12921 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"socpeople as sp ON a.fk_contact = sp.rowid";
12922 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Dolresource') {
12923 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"element_resources as er";
12924 $sql .=
" ON er.resource_type = 'dolresource'";
12925 $sql .=
" AND er.element_id = a.id";
12926 $sql .=
" AND er.resource_id = ".((int) $filterobj->id);
12927 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
12928 $sql .=
", ".MAIN_DB_PREFIX.
"adherent as m";
12929 } elseif (is_object($filterobj) && get_class($filterobj) ==
'CommandeFournisseur') {
12930 $sql .=
", ".MAIN_DB_PREFIX.
"commande_fournisseur as o";
12931 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Product') {
12932 $sql .=
", ".MAIN_DB_PREFIX.
"product as o";
12933 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
12934 $sql .=
", ".MAIN_DB_PREFIX.
"ticket as o";
12935 } elseif (is_object($filterobj) && get_class($filterobj) ==
'BOM') {
12936 $sql .=
", ".MAIN_DB_PREFIX.
"bom_bom as o";
12937 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Contrat') {
12938 $sql .=
", ".MAIN_DB_PREFIX.
"contrat as o";
12941 $sql .=
" WHERE a.entity IN (".getEntity(
'agenda').
")";
12942 if ($force_filter_contact ===
false) {
12943 if (is_object($filterobj) && in_array(get_class($filterobj), array(
'Societe',
'Client',
'Fournisseur')) && $filterobj->id) {
12944 $sql .=
" AND a.fk_soc = ".((int) $filterobj->id);
12945 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Project' && $filterobj->id) {
12946 $sql .=
" AND a.fk_project = ".((int) $filterobj->id);
12947 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
12948 $sql .=
" AND a.fk_element = m.rowid AND a.elementtype = 'member'";
12949 if ($filterobj->id) {
12950 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
12952 } elseif (is_object($filterobj) && get_class($filterobj) ==
'CommandeFournisseur') {
12953 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'order_supplier'";
12954 if ($filterobj->id) {
12955 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
12957 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Product') {
12958 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'product'";
12959 if ($filterobj->id) {
12960 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
12962 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
12963 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'ticket'";
12964 if ($filterobj->id) {
12965 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
12967 } elseif (is_object($filterobj) && get_class($filterobj) ==
'BOM') {
12968 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'bom'";
12969 if ($filterobj->id) {
12970 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
12972 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Contrat') {
12973 $sql .=
" AND a.fk_element = o.rowid AND a.elementtype = 'contract'";
12974 if ($filterobj->id) {
12975 $sql .=
" AND a.fk_element = ".((int) $filterobj->id);
12981 if (!empty($actioncode)) {
12983 if ($actioncode ==
'AC_NON_AUTO') {
12984 $sql .=
" AND c.type != 'systemauto'";
12985 } elseif ($actioncode ==
'AC_ALL_AUTO') {
12986 $sql .=
" AND c.type = 'systemauto'";
12988 if ($actioncode ==
'AC_OTH') {
12989 $sql .=
" AND c.type != 'systemauto'";
12990 } elseif ($actioncode ==
'AC_OTH_AUTO') {
12991 $sql .=
" AND c.type = 'systemauto'";
12995 if ($actioncode ==
'AC_NON_AUTO') {
12996 $sql .=
" AND c.type != 'systemauto'";
12997 } elseif ($actioncode ==
'AC_ALL_AUTO') {
12998 $sql .=
" AND c.type = 'systemauto'";
13000 $sql .=
" AND c.code = '".$db->escape($actioncode).
"'";
13004 if ($donetodo ==
'todo') {
13005 $sql .=
" AND ((a.percent >= 0 AND a.percent < 100) OR (a.percent = -1 AND a.datep > '".$db->idate($now).
"'))";
13006 } elseif ($donetodo ==
'done') {
13007 $sql .=
" AND (a.percent = 100 OR (a.percent = -1 AND a.datep <= '".$db->idate($now).
"'))";
13009 if (is_array($filters) && $filters[
'search_agenda_label']) {
13010 $sql .=
natural_search(
'a.label', $filters[
'search_agenda_label']);
13015 if (isModEnabled(
'mailing') && !empty($objcon->email)
13016 && (empty($actioncode) || $actioncode ==
'AC_OTH_AUTO' || $actioncode ==
'AC_EMAILING')) {
13017 $langs->load(
"mails");
13019 $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";
13020 $sql2 .=
", null as fk_element, '' as elementtype, null as contact_id";
13021 $sql2 .=
", 'AC_EMAILING' as acode, '' as alabel, '' as apicto";
13022 $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";
13023 if (is_object($filterobj) && get_class($filterobj) ==
'Societe') {
13024 $sql2 .=
", '' as lastname, '' as firstname";
13025 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Adherent') {
13026 $sql2 .=
", '' as lastname, '' as firstname";
13027 } elseif (is_object($filterobj) && get_class($filterobj) ==
'CommandeFournisseur') {
13028 $sql2 .=
", '' as ref";
13029 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Product') {
13030 $sql2 .=
", '' as ref";
13031 } elseif (is_object($filterobj) && get_class($filterobj) ==
'Ticket') {
13032 $sql2 .=
", '' as ref";
13034 $sql2 .=
" FROM ".MAIN_DB_PREFIX.
"mailing as m, ".MAIN_DB_PREFIX.
"mailing_cibles as mc, ".MAIN_DB_PREFIX.
"user as u";
13035 $sql2 .=
" WHERE mc.email = '".$db->escape($objcon->email).
"'";
13036 $sql2 .=
" AND mc.statut = 1";
13037 $sql2 .=
" AND u.rowid = m.fk_user_valid";
13038 $sql2 .=
" AND mc.fk_mailing=m.rowid";
13041 if (!empty($sql) && !empty($sql2)) {
13042 $sql = $sql.
" UNION ".$sql2;
13043 } elseif (empty($sql) && !empty($sql2)) {
13049 $sql .= $db->order($sortfield_new, $sortorder);
13051 dol_syslog(
"function.lib::show_actions_messaging", LOG_DEBUG);
13052 $resql = $db->query($sql);
13055 $num = $db->num_rows($resql);
13057 while ($i < $num) {
13058 $obj = $db->fetch_object($resql);
13060 if ($obj->type ==
'action') {
13062 $contactaction->id = $obj->id;
13063 $result = $contactaction->fetchResources();
13066 setEventMessage(
"actions.lib::show_actions_messaging Error fetch ressource",
'errors');
13072 if (($obj->percent >= 0 and $obj->percent < 100) || ($obj->percent == -1 && $obj->dp > $now)) {
13073 $tododone =
'todo';
13076 $histo[$numaction] = array(
13077 'type'=>$obj->type,
13078 'tododone'=>$tododone,
13080 'datestart'=>$db->jdate($obj->dp),
13081 'dateend'=>$db->jdate($obj->dp2),
13082 'note'=>$obj->label,
13083 'message'=>$obj->message,
13084 'percent'=>$obj->percent,
13086 'userid'=>$obj->user_id,
13087 'login'=>$obj->user_login,
13088 'userfirstname'=>$obj->user_firstname,
13089 'userlastname'=>$obj->user_lastname,
13090 'userphoto'=>$obj->user_photo,
13091 'msg_from'=>$obj->msg_from,
13093 'contact_id'=>$obj->fk_contact,
13094 'socpeopleassigned' => $contactaction->socpeopleassigned,
13095 'lastname' => (empty($obj->lastname) ?
'' : $obj->lastname),
13096 'firstname' => (empty($obj->firstname) ?
'' : $obj->firstname),
13097 'fk_element'=>$obj->fk_element,
13098 'elementtype'=>$obj->elementtype,
13100 'acode'=>$obj->acode,
13101 'alabel'=>$obj->alabel,
13102 'libelle'=>$obj->alabel,
13103 'apicto'=>$obj->apicto
13106 $histo[$numaction] = array(
13107 'type'=>$obj->type,
13108 'tododone'=>
'done',
13110 'datestart'=>$db->jdate($obj->dp),
13111 'dateend'=>$db->jdate($obj->dp2),
13112 'note'=>$obj->label,
13113 'message'=>$obj->message,
13114 'percent'=>$obj->percent,
13115 'acode'=>$obj->acode,
13117 'userid'=>$obj->user_id,
13118 'login'=>$obj->user_login,
13119 'userfirstname'=>$obj->user_firstname,
13120 'userlastname'=>$obj->user_lastname,
13121 'userphoto'=>$obj->user_photo
13136 if (!isModEnabled(
'agenda')) {
13137 $langs->loadLangs(array(
"admin",
"errors"));
13138 $out =
info_admin($langs->trans(
"WarningModuleXDisabledSoYouMayMissEventHere", $langs->transnoentitiesnoconv(
"Module2400Name")), 0, 0,
'warning');
13141 if (isModEnabled(
'agenda') || (isModEnabled(
'mailing') && !empty($objcon->email))) {
13142 $delay_warning = $conf->global->MAIN_DELAY_ACTIONS_TODO * 24 * 60 * 60;
13144 require_once DOL_DOCUMENT_ROOT.
'/comm/action/class/actioncomm.class.php';
13145 include_once DOL_DOCUMENT_ROOT.
'/core/lib/functions2.lib.php';
13146 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
13147 require_once DOL_DOCUMENT_ROOT.
'/contact/class/contact.class.php';
13152 $userstatic =
new User($db);
13153 $contactstatic =
new Contact($db);
13154 $userGetNomUrlCache = array();
13155 $contactGetNomUrlCache = array();
13157 $out .=
'<div class="filters-container" >';
13158 $out .=
'<form name="listactionsfilter" class="listactionsfilter" action="'.$_SERVER[
"PHP_SELF"].
'" method="POST">';
13159 $out .=
'<input type="hidden" name="token" value="'.newToken().
'">';
13161 if ($objcon && get_class($objcon) ==
'Contact' &&
13162 (is_null($filterobj) || get_class($filterobj) ==
'Societe')) {
13163 $out .=
'<input type="hidden" name="id" value="'.$objcon->id.
'" />';
13165 $out .=
'<input type="hidden" name="id" value="'.$filterobj->id.
'" />';
13167 if ($filterobj && get_class($filterobj) ==
'Societe') {
13168 $out .=
'<input type="hidden" name="socid" value="'.$filterobj->id.
'" />';
13173 $out .=
'<div class="div-table-responsive-no-min">';
13174 $out .=
'<table class="noborder borderbottom centpercent">';
13176 $out .=
'<tr class="liste_titre">';
13180 $out .=
'<th class="liste_titre width50 middle">';
13181 $searchpicto = $form->showFilterAndCheckAddButtons($massactionbutton ? 1 : 0,
'checkforselect', 1);
13182 $out .= $searchpicto;
13186 $out .=
getTitleFieldOfList(
'Date', 0, $_SERVER[
"PHP_SELF"],
'a.datep',
'', $param,
'', $sortfield, $sortorder,
'').
"\n";
13188 $out .=
'<th class="liste_titre"><strong class="hideonsmartphone">'.$langs->trans(
"Search").
' : </strong></th>';
13190 $out .=
'<th class="liste_titre"></th>';
13192 $out .=
'<th class="liste_titre">';
13193 $out .=
'<span class="fas fa-square inline-block fawidth30" style=" color: #ddd;" title="'.$langs->trans(
"ActionType").
'"></span>';
13195 $out .=
$formactions->select_type_actions($actioncode,
"actioncode",
'', !
getDolGlobalString(
'AGENDA_USE_EVENT_TYPE') ? 1 : -1, 0, 0, 1,
'minwidth200imp');
13197 $out .=
'<th class="liste_titre maxwidth100onsmartphone">';
13198 $out .=
'<input type="text" class="maxwidth100onsmartphone" name="search_agenda_label" value="'.$filters[
'search_agenda_label'].
'" placeholder="'.$langs->trans(
"Label").
'">';
13203 $out .=
'<th class="liste_titre width50 middle">';
13204 $searchpicto = $form->showFilterAndCheckAddButtons($massactionbutton ? 1 : 0,
'checkforselect', 1);
13205 $out .= $searchpicto;
13212 $out .=
'</table>';
13219 $out .=
'<ul class="timeline">';
13223 if (get_class($filterobj) ==
'Societe') {
13224 $tmp .=
'<a href="'.DOL_URL_ROOT.
'/comm/action/list.php?mode=show_list&socid='.$filterobj->id.
'&status=done">';
13226 $tmp .= ($donetodo !=
'done' ? $langs->trans(
"ActionsToDoShort") :
'');
13227 $tmp .= ($donetodo !=
'done' && $donetodo !=
'todo' ?
' / ' :
'');
13228 $tmp .= ($donetodo !=
'todo' ? $langs->trans(
"ActionsDoneShort") :
'');
13230 if (get_class($filterobj) ==
'Societe') {
13236 require_once DOL_DOCUMENT_ROOT.
'/comm/action/class/cactioncomm.class.php';
13238 $arraylist = $caction->liste_array(1,
'code',
'', (!
getDolGlobalString(
'AGENDA_USE_EVENT_TYPE') ? 1 : 0),
'', 1);
13240 $actualCycleDate =
false;
13243 foreach ($histo as $key => $value) {
13244 $actionstatic->fetch($histo[$key][
'id']);
13246 $actionstatic->type_picto = $histo[$key][
'apicto'];
13247 $actionstatic->type_code = $histo[$key][
'acode'];
13249 $labeltype = $actionstatic->type_code;
13250 if (!
getDolGlobalString(
'AGENDA_USE_EVENT_TYPE') && empty($arraylist[$labeltype])) {
13251 $labeltype =
'AC_OTH';
13253 if (!empty($actionstatic->code) && preg_match(
'/^TICKET_MSG/', $actionstatic->code)) {
13254 $labeltype = $langs->trans(
"Message");
13256 if (!empty($arraylist[$labeltype])) {
13257 $labeltype = $arraylist[$labeltype];
13259 if ($actionstatic->type_code ==
'AC_OTH_AUTO' && ($actionstatic->type_code != $actionstatic->code) && $labeltype && !empty($arraylist[$actionstatic->code])) {
13260 $labeltype .=
' - '.$arraylist[$actionstatic->code];
13264 $url = DOL_URL_ROOT.
'/comm/action/card.php?id='.$histo[$key][
'id'];
13266 $tmpa =
dol_getdate($histo[$key][
'datestart'],
false);
13268 if (isset($tmpa[
'year']) && isset($tmpa[
'yday']) && $actualCycleDate !== $tmpa[
'year'].
'-'.$tmpa[
'yday']) {
13269 $actualCycleDate = $tmpa[
'year'].
'-'.$tmpa[
'yday'];
13270 $out .=
'<!-- timeline time label -->';
13271 $out .=
'<li class="time-label">';
13272 $out .=
'<span class="timeline-badge-date">';
13273 $out .=
dol_print_date($histo[$key][
'datestart'],
'daytext',
'tzuserrel', $langs);
13276 $out .=
'<!-- /.timeline-label -->';
13280 $out .=
'<!-- timeline item -->'.
"\n";
13281 $out .=
'<li class="timeline-code-'.strtolower($actionstatic->code).
'">';
13284 $typeicon = $actionstatic->getTypePicto(
'pictofixedwidth timeline-icon-not-applicble', $labeltype);
13289 $out .=
'<div class="timeline-item">'.
"\n";
13291 $out .=
'<span class="time timeline-header-action2">';
13293 if (isset($histo[$key][
'type']) && $histo[$key][
'type'] ==
'mailing') {
13294 $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").
' ';
13295 $out .= $histo[$key][
'id'];
13298 $out .= $actionstatic->getNomUrl(1, -1,
'valignmiddle').
' ';
13301 if ($user->hasRight(
'agenda',
'allactions',
'create') ||
13302 (($actionstatic->authorid == $user->id || $actionstatic->userownerid == $user->id) && $user->hasRight(
'agenda',
'myactions',
'create'))) {
13303 $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).
'">';
13305 $out .=
img_picto($langs->trans(
"Modify"),
'edit',
'class="edita"');
13312 $out .=
'<span class="time"><i class="fa fa-clock-o valignmiddle"></i> <span class="valignmiddle">';
13313 $out .=
dol_print_date($histo[$key][
'datestart'],
'dayhour',
'tzuserrel');
13314 if ($histo[$key][
'dateend'] && $histo[$key][
'dateend'] != $histo[$key][
'datestart']) {
13315 $tmpa =
dol_getdate($histo[$key][
'datestart'],
true);
13316 $tmpb =
dol_getdate($histo[$key][
'dateend'],
true);
13317 if ($tmpa[
'mday'] == $tmpb[
'mday'] && $tmpa[
'mon'] == $tmpb[
'mon'] && $tmpa[
'year'] == $tmpb[
'year']) {
13318 $out .=
'-'.dol_print_date($histo[$key][
'dateend'],
'hour',
'tzuserrel');
13320 $out .=
'-'.dol_print_date($histo[$key][
'dateend'],
'dayhour',
'tzuserrel');
13324 if ($histo[$key][
'percent'] == 0 && $histo[$key][
'datestart'] && $histo[$key][
'datestart'] < ($now - $delay_warning)) {
13327 if ($histo[$key][
'percent'] == 0 && !$histo[$key][
'datestart'] && $histo[$key][
'dateend'] && $histo[$key][
'datestart'] < ($now - $delay_warning)) {
13330 if ($histo[$key][
'percent'] > 0 && $histo[$key][
'percent'] < 100 && $histo[$key][
'dateend'] && $histo[$key][
'dateend'] < ($now - $delay_warning)) {
13333 if ($histo[$key][
'percent'] > 0 && $histo[$key][
'percent'] < 100 && !$histo[$key][
'dateend'] && $histo[$key][
'datestart'] && $histo[$key][
'datestart'] < ($now - $delay_warning)) {
13339 $out .=
"</span></span>\n";
13342 $out .=
'<h3 class="timeline-header">';
13345 $out .=
'<div class="messaging-author inline-block tdoverflowmax150 valignmiddle marginrightonly">';
13346 if ($histo[$key][
'userid'] > 0) {
13347 if (!isset($userGetNomUrlCache[$histo[$key][
'userid']])) {
13348 $userstatic->fetch($histo[$key][
'userid']);
13349 $userGetNomUrlCache[$histo[$key][
'userid']] = $userstatic->getNomUrl(-1,
'', 0, 0, 16, 0,
'firstelselast',
'');
13351 $out .= $userGetNomUrlCache[$histo[$key][
'userid']];
13352 } elseif (!empty($histo[$key][
'msg_from']) && $actionstatic->code ==
'TICKET_MSG') {
13353 if (!isset($contactGetNomUrlCache[$histo[$key][
'msg_from']])) {
13354 if ($contactstatic->fetch(0,
null,
'', $histo[$key][
'msg_from']) > 0) {
13355 $contactGetNomUrlCache[$histo[$key][
'msg_from']] = $contactstatic->getNomUrl(-1,
'', 16);
13357 $contactGetNomUrlCache[$histo[$key][
'msg_from']] = $histo[$key][
'msg_from'];
13360 $out .= $contactGetNomUrlCache[$histo[$key][
'msg_from']];
13365 $out .=
' <div class="messaging-title inline-block">';
13367 if (empty($conf->dol_optimize_smallscreen) && $actionstatic->type_code !=
'AC_OTH_AUTO') {
13368 $out .= $labeltype.
' - ';
13372 if (preg_match(
'/^TICKET_MSG/', $actionstatic->code)) {
13373 $out .= $langs->trans(
'TicketNewMessage');
13374 } elseif (preg_match(
'/^TICKET_MSG_PRIVATE/', $actionstatic->code)) {
13375 $out .= $langs->trans(
'TicketNewMessage').
' <em>('.$langs->trans(
'Private').
')</em>';
13376 } elseif (isset($histo[$key][
'type'])) {
13377 if ($histo[$key][
'type'] ==
'action') {
13378 $transcode = $langs->transnoentitiesnoconv(
"Action".$histo[$key][
'acode']);
13379 $libelle = ($transcode !=
"Action".$histo[$key][
'acode'] ? $transcode : $histo[$key][
'alabel']);
13380 $libelle = $histo[$key][
'note'];
13381 $actionstatic->id = $histo[$key][
'id'];
13383 } elseif ($histo[$key][
'type'] ==
'mailing') {
13384 $out .=
'<a href="'.DOL_URL_ROOT.
'/comm/mailing/card.php?id='.$histo[$key][
'id'].
'">'.
img_object($langs->trans(
"ShowEMailing"),
"email").
' ';
13385 $transcode = $langs->transnoentitiesnoconv(
"Action".$histo[$key][
'acode']);
13386 $libelle = ($transcode !=
"Action".$histo[$key][
'acode'] ? $transcode :
'Send mass mailing');
13389 $libelle .= $histo[$key][
'note'];
13394 if (isset($histo[$key][
'elementtype']) && !empty($histo[$key][
'fk_element'])) {
13395 if (isset($conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']]) && isset($conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']][$histo[$key][
'fk_element']])) {
13396 $link = $conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']][$histo[$key][
'fk_element']];
13398 if (!isset($conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']])) {
13399 $conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']] = array();
13401 $link =
dolGetElementUrl($histo[$key][
'fk_element'], $histo[$key][
'elementtype'], 1);
13402 $conf->cache[
'elementlinkcache'][$histo[$key][
'elementtype']][$histo[$key][
'fk_element']] = $link;
13405 $out .=
' - '.$link;
13414 if (!empty($histo[$key][
'message'] && $histo[$key][
'message'] != $libelle)
13415 && $actionstatic->code !=
'AC_TICKET_CREATE'
13416 && $actionstatic->code !=
'AC_TICKET_MODIFY'
13418 $out .=
'<div class="timeline-body wordbreak">';
13419 $truncateLines =
getDolGlobalInt(
'MAIN_TRUNCATE_TIMELINE_MESSAGE', 3);
13421 if ($truncateLines > 0 && strlen($histo[$key][
'message']) > strlen($truncatedText)) {
13422 $out .=
'<div class="readmore-block --closed" >';
13423 $out .=
' <div class="readmore-block__excerpt" >';
13424 $out .= $truncatedText ;
13425 $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>';
13427 $out .=
' <div class="readmore-block__full-text" >';
13428 $out .= $histo[$key][
'message'];
13429 $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>';
13433 $out .= $histo[$key][
'message'];
13443 if (isset($histo[$key][
'socpeopleassigned']) && is_array($histo[$key][
'socpeopleassigned']) && count($histo[$key][
'socpeopleassigned']) > 0) {
13445 foreach ($histo[$key][
'socpeopleassigned'] as $cid => $Tab) {
13446 if (empty($conf->cache[
'contact'][$histo[$key][
'contact_id']])) {
13448 $contact->fetch($cid);
13449 $conf->cache[
'contact'][$histo[$key][
'contact_id']] = $contact;
13451 $contact = $conf->cache[
'contact'][$histo[$key][
'contact_id']];
13455 $contactList .= !empty($contactList) ?
', ' :
'';
13456 $contactList .= $contact->getNomUrl(1);
13457 if (isset($histo[$key][
'acode']) && $histo[$key][
'acode'] ==
'AC_TEL') {
13458 if (!empty($contact->phone_pro)) {
13459 $contactList .=
'('.dol_print_phone($contact->phone_pro).
')';
13465 $footer .= $langs->trans(
'ActionOnContact').
' : '.$contactList;
13466 } elseif (empty($objcon->id) && isset($histo[$key][
'contact_id']) && $histo[$key][
'contact_id'] > 0) {
13467 if (empty($conf->cache[
'contact'][$histo[$key][
'contact_id']])) {
13469 $result = $contact->fetch($histo[$key][
'contact_id']);
13470 $conf->cache[
'contact'][$histo[$key][
'contact_id']] = $contact;
13472 $contact = $conf->cache[
'contact'][$histo[$key][
'contact_id']];
13476 $footer .= $contact->getNomUrl(1);
13477 if (isset($histo[$key][
'acode']) && $histo[$key][
'acode'] ==
'AC_TEL') {
13478 if (!empty($contact->phone_pro)) {
13479 $footer .=
'('.dol_print_phone($contact->phone_pro).
')';
13486 if (!empty($documents)) {
13487 $footer .=
'<div class="timeline-documents-container">';
13488 foreach ($documents as $doc) {
13489 $footer .=
'<span id="document_'.$doc->id.
'" class="timeline-documents" ';
13490 $footer .=
' data-id="'.$doc->id.
'" ';
13491 $footer .=
' data-path="'.$doc->filepath.
'"';
13492 $footer .=
' data-filename="'.dol_escape_htmltag($doc->filename).
'" ';
13495 $filePath = DOL_DATA_ROOT.
'/'.$doc->filepath.
'/'.$doc->filename;
13497 $file = $actionstatic->id.
'/'.$doc->filename;
13498 $thumb = $actionstatic->id.
'/thumbs/'.substr($doc->filename, 0, strrpos($doc->filename,
'.')).
'_mini'.substr($doc->filename, strrpos($doc->filename,
'.'));
13499 $doclink =
dol_buildpath(
'document.php', 1).
'?modulepart=actions&attachment=0&file='.urlencode($file).
'&entity='.$conf->entity;
13500 $viewlink =
dol_buildpath(
'viewimage.php', 1).
'?modulepart=actions&file='.urlencode($thumb).
'&entity='.$conf->entity;
13502 $mimeAttr =
' mime="'.$mime.
'" ';
13504 if (in_array($mime, array(
'image/png',
'image/jpeg',
'application/pdf'))) {
13505 $class .=
' documentpreview';
13508 $footer .=
'<a href="'.$doclink.
'" class="btn-link '.$class.
'" target="_blank" rel="noopener noreferrer" '.$mimeAttr.
' >';
13509 $footer .=
img_mime($filePath).
' '.$doc->filename;
13512 $footer .=
'</span>';
13514 $footer .=
'</div>';
13517 if (!empty($footer)) {
13518 $out .=
'<div class="timeline-footer">'.$footer.
'</div>';
13521 $out .=
'</div>'.
"\n";
13524 $out .=
'<!-- END timeline item -->';
13532 jQuery(document).ready(function () {
13533 $(document).on("click", "[data-read-more-action]", function(e){
13534 let readMoreBloc = $(this).closest(".readmore-block");
13535 if(readMoreBloc.length > 0){
13536 e.preventDefault();
13537 if($(this).attr("data-read-more-action") == "close"){
13538 readMoreBloc.addClass("--closed").removeClass("--open");
13539 $("html, body").animate({
13540 scrollTop: readMoreBloc.offset().top - 200
13543 readMoreBloc.addClass("--open").removeClass("--closed");
13551 if (empty($histo)) {
13552 $out .=
'<span class="opacitymedium">'.$langs->trans(
"NoRecordFound").
'</span>';
13575 if ($hourTime ===
'getpost') {
13579 } elseif (preg_match(
'/^(\d\d):(\d\d):(\d\d)$/', $hourTime, $m)) {
13580 $hour = intval($m[1]);
13581 $minute = intval($m[2]);
13582 $second = intval($m[3]);
13584 $hour = $minute = $second = 0;
13587 $hour = min($hour, 23);
13588 $minute = min($minute, 59);
13589 $second = min($second, 59);
13606 if ($timestamp ===
null) {
13607 $timestamp =
GETPOSTDATE($prefix, $hourTime, $gm);
13614 if ($hourTime ===
'getpost' || ($timestamp !==
null &&
dol_print_date($timestamp,
'%H:%M:%S') !==
'00:00:00')) {
13615 $TParam = array_merge($TParam, array(
13622 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.